diff --git a/backend/mpc-system/services/service-party-android/app/src/main/java/com/durian/tssparty/data/repository/TssRepository.kt b/backend/mpc-system/services/service-party-android/app/src/main/java/com/durian/tssparty/data/repository/TssRepository.kt index a6802a9d..670e92f0 100644 --- a/backend/mpc-system/services/service-party-android/app/src/main/java/com/durian/tssparty/data/repository/TssRepository.kt +++ b/backend/mpc-system/services/service-party-android/app/src/main/java/com/durian/tssparty/data/repository/TssRepository.kt @@ -3720,24 +3720,34 @@ data class ParticipantStatusInfo( * 构建签名参与方列表(辅助方法) * * @param participants 所有参与方(从 getSessionStatus 获取) + * @param currentPartyId 当前设备的 party ID * @param includeServerParties 是否包含服务器备份方(默认 false,保持现有行为) * @return 参与方列表 (partyId, partyIndex) * * 新增原因:将参与方过滤逻辑提取为可复用方法,支持选择性包含服务器 * 默认行为:false - 过滤掉 co-managed-party-*(与现有逻辑一致) - * 新行为:true - 保留所有参与方,包括服务器(仅限 2-of-3 用户主动选择) + * 新行为:true - 只包含当前设备 + 服务器(用于丢失设备场景,总共2方) */ private fun buildSigningParticipantList( participants: List, + currentPartyId: String, includeServerParties: Boolean = false ): List> { val filtered = if (includeServerParties) { - // 包含所有参与方(含服务器)- 用于 2-of-3 设备丢失恢复 - android.util.Log.d("TssRepository", "[PARTICIPANT-LIST] Including ALL parties (with server backup)") - participants + // 设备丢失场景:只选择当前设备 + 服务器(共2方,满足 t=2) + // 排除丢失的另一个用户设备 + android.util.Log.d("TssRepository", "[PARTICIPANT-LIST] Device lost mode: current device + server backup only") + participants.filter { + it.partyId == currentPartyId || it.partyId.startsWith("co-managed-party-") + }.also { + android.util.Log.d("TssRepository", "[PARTICIPANT-LIST] Selected ${it.size} parties for signing (current + server)") + it.forEach { p -> + android.util.Log.d("TssRepository", "[PARTICIPANT-LIST] - ${p.partyId.take(20)} (index=${p.partyIndex})") + } + } } else { - // 过滤掉服务器方 - 现有默认行为 - android.util.Log.d("TssRepository", "[PARTICIPANT-LIST] Excluding co-managed-party-* (default behavior)") + // 过滤掉服务器方 - 现有默认行为(2个用户设备) + android.util.Log.d("TssRepository", "[PARTICIPANT-LIST] Normal mode: excluding co-managed-party-* (default behavior)") participants.filter { !it.partyId.startsWith("co-managed-party-") } } return filtered.map { Pair(it.partyId, it.partyIndex) } @@ -3795,8 +3805,11 @@ data class ParticipantStatusInfo( // Step 2: Build participant list using helper method // 关键修改:使用辅助方法,根据 includeServerBackup 参数决定是否包含服务器 + // includeServerBackup=true 时:只选择当前设备 + 服务器(共2方,用于设备丢失场景) + // includeServerBackup=false 时:选择2个用户设备(现有默认行为) val signingParties = buildSigningParticipantList( keygenStatus.participants, + signingPartyIdForEvents, // 传入当前设备的 party ID includeServerBackup )