From d18733deb19e19f8699c1c6a323ad69ed23e51bc Mon Sep 17 00:00:00 2001 From: hailin Date: Wed, 31 Dec 2025 12:37:53 -0800 Subject: [PATCH] fix(tss-party): include recovery ID in signature output for EVM transactions MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The signature was 64 bytes (r + s) but EVM transactions need 65 bytes (r + s + v). Now the recovery ID is appended to the signature so the frontend can correctly parse and broadcast the transaction. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- .../services/service-party-app/tss-party/main.go | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/backend/mpc-system/services/service-party-app/tss-party/main.go b/backend/mpc-system/services/service-party-app/tss-party/main.go index 5f8fb8bd..66bc367c 100644 --- a/backend/mpc-system/services/service-party-app/tss-party/main.go +++ b/backend/mpc-system/services/service-party-app/tss-party/main.go @@ -484,9 +484,15 @@ func sendResult(publicKey, encryptedShare []byte, partyIndex int) { } func sendSignResult(signature []byte, recoveryID int, partyIndex int) { + // Append recovery ID to signature (r + s + v = 64 + 1 = 65 bytes) + // This is needed for EVM transaction signing + signatureWithV := make([]byte, len(signature)+1) + copy(signatureWithV, signature) + signatureWithV[len(signature)] = byte(recoveryID) + msg := Message{ Type: "result", - Payload: base64.StdEncoding.EncodeToString(signature), + Payload: base64.StdEncoding.EncodeToString(signatureWithV), PartyIndex: partyIndex, } data, _ := json.Marshal(msg)