feat(sdk-core): support preparedTransaction in TSS message signing - #9581
Merged
Merged
Conversation
Contributor
at31416
approved these changes
Aug 27, 2026
davidkaplanbitgo
approved these changes
Aug 27, 2026
danielpeng1
approved these changes
Aug 27, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
wallet.signMessage()had no way to passpreparedTransaction— a field Canton's backend requires (ascoinSpecific.preparedTransactionBase64) for both CANTON_SIGN_TRANSACTION and CANTON_SIGN_TOPOLOGY message standard types. Every field on the message-signing intent path is explicitly enumerated end-to-end (no generic passthrough bag), so any fresh Canton message-signing request created via the SDK was missing a mandatory field, regardless of whether the earlier commit-step server defect was fixed.Without this, a client could only create a valid Canton message request via the raw
POST /wallet/:id/msgrequestsAPI directly, then usewallet.signMessage({ message: { txRequestId } })only to sign it —wallet.signMessage()could never create one end-to-end on its own for Canton.Changes
Threaded
preparedTransaction?: stringthrough the existing message-intent type chain, following the same pattern already established for Canton'scantonCommandParamson the transaction-intent side:Message(bitgo/baseCoin/iBaseCoin.ts) — public field onwallet.signMessage({ message: { preparedTransaction } }).IntentOptionsForMessage(bitgo/utils/tss/baseTypes.ts)PopulatedIntentForMessageSigning(bitgo/utils/tss/baseTypes.ts) — the shape POSTed to/wallet/:id/msgrequests.baseTSSUtils.buildSignMessageRequest— passes it into the built intent.wallet.buildSignMessageRequest— passesparams.message.preparedTransaction.wallet.signMessageTss's inline intent construction (the fresh-request path taken when notxRequestIdis given) — same, since it duplicates the intent shape instead of delegating tobuildSignMessageRequest.buildSignMessageRequestBasealready spreads{...intent}into the POST body with no field whitelist, so no additional wiring was needed there.Purely additive and optional — every other coin (SOL, ADA, Midnight, ETH typed-data) never sets this field, so it's
undefinedand omitted from their requests exactly as before.Result