From 7b8105d76c487286bd5e78ec8b9fa6a10153d536 Mon Sep 17 00:00:00 2001 From: hailin Date: Tue, 27 Jan 2026 08:50:39 -0800 Subject: [PATCH] =?UTF-8?q?fix(android):=20=E4=BF=AE=E5=A4=8D=E5=8F=82?= =?UTF-8?q?=E4=B8=8E=E8=80=85=E5=88=97=E8=A1=A8=E5=9C=A8keygen=E5=BC=80?= =?UTF-8?q?=E5=A7=8B=E5=90=8E=E7=BB=A7=E7=BB=AD=E5=A2=9E=E5=8A=A0=E7=9A=84?= =?UTF-8?q?bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 问题: 发起者端参与方显示4/3(2-of-3 MPC) 原因: session_started事件后仍继续处理participant_joined事件 修复方案: 1. 在participant_joined处理中检查sessionStatus 2. 如果已是IN_PROGRESS或COMPLETED则忽略新的participant_joined事件 3. session_started时只补全不完整的列表,不覆盖 Co-Authored-By: Claude Opus 4.5 --- .../presentation/viewmodel/MainViewModel.kt | 30 +++++++++++++++---- 1 file changed, 24 insertions(+), 6 deletions(-) diff --git a/backend/mpc-system/services/service-party-android/app/src/main/java/com/durian/tssparty/presentation/viewmodel/MainViewModel.kt b/backend/mpc-system/services/service-party-android/app/src/main/java/com/durian/tssparty/presentation/viewmodel/MainViewModel.kt index f10b032c..5b29eb1a 100644 --- a/backend/mpc-system/services/service-party-android/app/src/main/java/com/durian/tssparty/presentation/viewmodel/MainViewModel.kt +++ b/backend/mpc-system/services/service-party-android/app/src/main/java/com/durian/tssparty/presentation/viewmodel/MainViewModel.kt @@ -343,8 +343,10 @@ class MainViewModel @Inject constructor( val currentSessionId = _currentSessionId.value if (currentSessionId != null && event.sessionId == currentSessionId) { android.util.Log.d("MainViewModel", "Session started event for keygen initiator, triggering keygen") - // Initialize participant list with all N parties (keygen requires all parties) - _sessionParticipants.value = (1..event.thresholdN).map { "参与方 $it" } + // Ensure participant list has exactly N parties (fill if incomplete, don't add more) + if (_sessionParticipants.value.size < event.thresholdN) { + _sessionParticipants.value = (1..event.thresholdN).map { "参与方 $it" } + } viewModelScope.launch { startKeygenAsInitiator( sessionId = currentSessionId, @@ -359,6 +361,10 @@ class MainViewModel @Inject constructor( val joinKeygenInfo = pendingJoinKeygenInfo if (joinKeygenInfo != null && event.sessionId == joinKeygenInfo.sessionId) { android.util.Log.d("MainViewModel", "Session started event for keygen joiner, triggering keygen") + // Ensure participant list has exactly N parties + if (_joinKeygenParticipants.value.size < event.thresholdN) { + _joinKeygenParticipants.value = (1..event.thresholdN).map { "参与方 $it" } + } startKeygenAsJoiner() } @@ -366,8 +372,10 @@ class MainViewModel @Inject constructor( val joinSignInfo = pendingJoinSignInfo if (joinSignInfo != null && event.sessionId == joinSignInfo.sessionId) { android.util.Log.d("MainViewModel", "Session started event for sign joiner, triggering sign") - // Initialize participant list with T parties (sign requires T parties) - _coSignParticipants.value = (1..event.thresholdT).map { "参与方 $it" } + // Ensure participant list has exactly T parties + if (_coSignParticipants.value.size < event.thresholdT) { + _coSignParticipants.value = (1..event.thresholdT).map { "参与方 $it" } + } startSignAsJoiner() } @@ -376,8 +384,10 @@ class MainViewModel @Inject constructor( android.util.Log.d("MainViewModel", "Checking for sign initiator: signSessionId=$signSessionId, eventSessionId=${event.sessionId}") if (signSessionId != null && event.sessionId == signSessionId) { android.util.Log.d("MainViewModel", "Session started event for sign initiator, triggering sign") - // Initialize participant list with T parties (sign requires T parties) - _signParticipants.value = (1..event.thresholdT).map { "参与方 $it" } + // Ensure participant list has exactly T parties + if (_signParticipants.value.size < event.thresholdT) { + _signParticipants.value = (1..event.thresholdT).map { "参与方 $it" } + } startSignAsInitiator(event.selectedParties) } else { android.util.Log.d("MainViewModel", "NOT triggering sign initiator: signSessionId=$signSessionId, pendingSignInitiatorInfo=${pendingSignInitiatorInfo?.sessionId}") @@ -386,6 +396,14 @@ class MainViewModel @Inject constructor( "party_joined", "participant_joined" -> { android.util.Log.d("MainViewModel", "Processing participant_joined event...") + // Don't add participants if keygen/sign has already started + // This prevents duplicate additions after session_started event + val currentStatus = repository.sessionStatus.value + if (currentStatus == SessionStatus.IN_PROGRESS || currentStatus == SessionStatus.COMPLETED) { + android.util.Log.d("MainViewModel", " Session already in progress/completed, ignoring participant_joined") + return@collect + } + // Update participant count for initiator's CreateWallet screen val currentSessionId = _currentSessionId.value android.util.Log.d("MainViewModel", " Checking for initiator: currentSessionId=$currentSessionId, eventSessionId=${event.sessionId}")