From 2a95dd107fcde85b88547a7e4bfcf111da0b2002 Mon Sep 17 00:00:00 2001 From: hailin Date: Wed, 31 Dec 2025 05:45:05 -0800 Subject: [PATCH] fix(co-sign): allow signing sessions with t participants instead of n MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Modify ValidateSessionCreation to differentiate between keygen and sign sessions - For keygen: require participantCount == threshold.N() (all parties must participate) - For sign: require participantCount == threshold.T() (only t parties needed) - This fixes "session is full" error when creating signing session with 3 parties but n=5 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- .../domain/services/session_coordinator.go | 20 ++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/backend/mpc-system/services/session-coordinator/domain/services/session_coordinator.go b/backend/mpc-system/services/session-coordinator/domain/services/session_coordinator.go index 2018a3b8..f13331b3 100644 --- a/backend/mpc-system/services/session-coordinator/domain/services/session_coordinator.go +++ b/backend/mpc-system/services/session-coordinator/domain/services/session_coordinator.go @@ -27,9 +27,23 @@ func (s *SessionCoordinatorService) ValidateSessionCreation( return entities.ErrInvalidSessionType } - // Allow either exact participant count (pre-registered) or 0 (dynamic joining) - if participantCount != 0 && participantCount != threshold.N() { - return entities.ErrSessionFull + // Validate participant count based on session type + // For keygen: all n parties must participate (participantCount == n or 0 for dynamic) + // For sign: only t parties participate (participantCount == t or 0 for dynamic) + if participantCount != 0 { + if sessionType == entities.SessionTypeSign { + // Signing session: participant count should equal threshold t + // (the minimum number of parties needed to sign) + if participantCount != threshold.T() { + return entities.ErrSessionFull + } + } else { + // Keygen session: participant count should equal threshold n + // (all parties must participate in key generation) + if participantCount != threshold.N() { + return entities.ErrSessionFull + } + } } if sessionType == entities.SessionTypeSign && len(messageHash) == 0 {