fix(session): distinguish keygen vs sign in CanStart() and AllPartiesReady()
- Keygen/co-keygen: must have exactly N participants joined - Sign (co-sign/persistent): only check all registered participants joined 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
parent
d0c504dcf3
commit
1708a03aaf
|
|
@ -142,27 +142,27 @@ func (s *MPCSession) UpdateParticipantStatus(partyID value_objects.PartyID, stat
|
||||||
}
|
}
|
||||||
|
|
||||||
// CanStart checks if all participants have joined and the session can start
|
// CanStart checks if all participants have joined and the session can start
|
||||||
//
|
|
||||||
// BREAKING CHANGE WARNING (for co-sign feature, commit 99fa003b):
|
|
||||||
// Original code: len(s.Participants) == s.Threshold.N() && readyCount == s.Threshold.N()
|
|
||||||
// New code: Check all registered participants are joined (no T/N check)
|
|
||||||
// This change affects PERSISTENT SIGN flow because we now pass keygenThresholdN
|
|
||||||
// instead of len(parties) as threshold_n. With original code, sign sessions with
|
|
||||||
// T+1 participants would fail because T+1 != N.
|
|
||||||
// If issues arise with persistent sign, REVERT to original N-based check.
|
|
||||||
// Related files: session_coordinator.go, session_coordinator_client.go, account_handler.go
|
|
||||||
func (s *MPCSession) CanStart() bool {
|
func (s *MPCSession) CanStart() bool {
|
||||||
// Session can start when all registered participants have joined
|
// For keygen sessions (including co-managed keygen): must have exactly N participants
|
||||||
// The number of participants was determined at session creation time:
|
if s.SessionType.IsKeygen() {
|
||||||
// - For keygen: N parties are registered
|
if len(s.Participants) != s.Threshold.N() {
|
||||||
// - For sign: T or T+1 parties are registered (depending on the signing flow)
|
return false
|
||||||
// We don't need to check against T or N here - just verify all registered parties have joined
|
}
|
||||||
|
readyCount := 0
|
||||||
|
for _, p := range s.Participants {
|
||||||
|
if p.IsJoined() || p.IsReady() {
|
||||||
|
readyCount++
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return readyCount == s.Threshold.N()
|
||||||
|
}
|
||||||
|
|
||||||
|
// For sign sessions: check all registered participants have joined
|
||||||
|
// The number of participants was determined at session creation time (T or T+1)
|
||||||
if len(s.Participants) == 0 {
|
if len(s.Participants) == 0 {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, p := range s.Participants {
|
for _, p := range s.Participants {
|
||||||
// All participants must be in joined or ready status
|
|
||||||
if !p.IsJoined() && !p.IsReady() {
|
if !p.IsJoined() && !p.IsReady() {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
@ -272,15 +272,21 @@ func (s *MPCSession) MarkPartyReady(partyID string) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
// AllPartiesReady checks if all participants are ready
|
// AllPartiesReady checks if all participants are ready
|
||||||
//
|
|
||||||
// BREAKING CHANGE WARNING (for co-sign feature, commit 99fa003b):
|
|
||||||
// Original code: len(s.Participants) != s.Threshold.N() would return false
|
|
||||||
// New code: Check all registered participants are ready (no T/N check)
|
|
||||||
// This change affects PERSISTENT SIGN flow. See CanStart() for details.
|
|
||||||
// If issues arise with persistent sign, REVERT to original N-based check.
|
|
||||||
func (s *MPCSession) AllPartiesReady() bool {
|
func (s *MPCSession) AllPartiesReady() bool {
|
||||||
// Check that all registered participants are ready or completed
|
// For keygen sessions: must have exactly N participants
|
||||||
// The participant count was determined at session creation time
|
if s.SessionType.IsKeygen() {
|
||||||
|
if len(s.Participants) != s.Threshold.N() {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
for _, p := range s.Participants {
|
||||||
|
if !p.IsReady() && !p.IsCompleted() {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
// For sign sessions: check all registered participants are ready
|
||||||
if len(s.Participants) == 0 {
|
if len(s.Participants) == 0 {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue