diff --git a/modules/bitgo/test/v2/unit/wallet.ts b/modules/bitgo/test/v2/unit/wallet.ts index 68568aef7b..59b9508efe 100644 --- a/modules/bitgo/test/v2/unit/wallet.ts +++ b/modules/bitgo/test/v2/unit/wallet.ts @@ -4420,6 +4420,27 @@ describe('V2 Wallet:', function () { txRequest.should.deepEqual(txRequestForMessageSigning); }); + it('should include preparedTransaction in the msgrequests body when provided', async function () { + const preparedTransaction = 'base64-prepared-transaction-bytes'; + let capturedBody: any; + nock(bgUrl) + .post(`/api/v2/wallet/${tssEthWallet.id()}/msgrequests`, (body) => { + capturedBody = body; + return true; + }) + .reply(200, txRequestForMessageSigning); + + await tssEthWallet.buildSignMessageRequest({ + message: { + messageRaw, + messageStandardType: MessageStandardType.EIP191, + preparedTransaction, + }, + }); + + capturedBody.intent.preparedTransaction.should.equal(preparedTransaction); + }); + it(`[${coinName}] should sign message`, async function () { const signMessageTssSpy = sinon.spy(tssEthWallet, 'signMessageTss' as any); nock(bgUrl) @@ -4475,6 +4496,25 @@ describe('V2 Wallet:', function () { ); }); + it(`[${coinName}] should include preparedTransaction when signing a fresh message request`, async function () { + const preparedTransaction = 'base64-prepared-transaction-bytes'; + let capturedBody: any; + nock(bgUrl) + .post(`/api/v2/wallet/${tssEthWallet.id()}/msgrequests`, (body) => { + capturedBody = body; + return true; + }) + .reply(200, txRequestForMessageSigning); + + await tssEthWallet.signMessage({ + reqId, + message: { messageRaw, messageStandardType: MessageStandardType.EIP191, preparedTransaction }, + prv: 'secretKey', + }); + + capturedBody.intent.preparedTransaction.should.equal(preparedTransaction); + }); + it('should fail to sign message with empty prv', async function () { await tssEthWallet .signMessage({ diff --git a/modules/sdk-core/src/bitgo/baseCoin/iBaseCoin.ts b/modules/sdk-core/src/bitgo/baseCoin/iBaseCoin.ts index 4a825f389c..8460690fbb 100644 --- a/modules/sdk-core/src/bitgo/baseCoin/iBaseCoin.ts +++ b/modules/sdk-core/src/bitgo/baseCoin/iBaseCoin.ts @@ -457,6 +457,8 @@ export interface Message extends BaseSignable { messageEncoded?: string; messageStandardType?: MessageStandardType; signerAddress?: string; + /** Base64-encoded prepared transaction bytes required by Canton message signing. */ + preparedTransaction?: string; } export interface MessageTypeProperty { diff --git a/modules/sdk-core/src/bitgo/utils/tss/baseTSSUtils.ts b/modules/sdk-core/src/bitgo/utils/tss/baseTSSUtils.ts index 7877136bfc..311527e192 100644 --- a/modules/sdk-core/src/bitgo/utils/tss/baseTSSUtils.ts +++ b/modules/sdk-core/src/bitgo/utils/tss/baseTSSUtils.ts @@ -473,6 +473,7 @@ export default class BaseTssUtils extends MpcUtils implements ITssUtil messageStandardType: params.messageStandardType ?? MessageStandardType.UNKNOWN, messageEncoded: params.messageEncoded ?? '', signerAddress: params.signerAddress, + preparedTransaction: params.preparedTransaction, }; return this.buildSignMessageRequestBase(intent, apiVersion, params.reqId); diff --git a/modules/sdk-core/src/bitgo/utils/tss/baseTypes.ts b/modules/sdk-core/src/bitgo/utils/tss/baseTypes.ts index 5ad412fd8b..a1f05d48fe 100644 --- a/modules/sdk-core/src/bitgo/utils/tss/baseTypes.ts +++ b/modules/sdk-core/src/bitgo/utils/tss/baseTypes.ts @@ -304,6 +304,8 @@ export interface IntentOptionsForMessage extends IntentOptionsBase { messageEncoded?: string; messageStandardType?: MessageStandardType; signerAddress?: string; + /** Base64-encoded prepared transaction bytes required by Canton message signing. */ + preparedTransaction?: string; } export interface IntentOptionsForTypedData extends IntentOptionsBase { @@ -417,6 +419,8 @@ export interface PopulatedIntentForMessageSigning extends PopulatedIntentBase { custodianMessageId?: string; messageStandardType?: MessageStandardType; signerAddress?: string; + /** Base64-encoded prepared transaction bytes required by Canton message signing. */ + preparedTransaction?: string; } export interface PopulatedIntentForTypedDataSigning extends PopulatedIntentBase { diff --git a/modules/sdk-core/src/bitgo/wallet/wallet.ts b/modules/sdk-core/src/bitgo/wallet/wallet.ts index 0cc72ea097..9cff4fa808 100644 --- a/modules/sdk-core/src/bitgo/wallet/wallet.ts +++ b/modules/sdk-core/src/bitgo/wallet/wallet.ts @@ -2527,6 +2527,7 @@ export class Wallet implements IWallet { messageRaw, messageStandardType, signerAddress: params.message.signerAddress, + preparedTransaction: params.message.preparedTransaction, }; if (!this.tssUtils) { @@ -5143,6 +5144,7 @@ export class Wallet implements IWallet { messageRaw, messageStandardType: params.message.messageStandardType, signerAddress: params.message.signerAddress, + preparedTransaction: params.message.preparedTransaction, }; txRequest = await this.tssUtils!.buildSignMessageRequest(intentOption); params.message.txRequestId = txRequest.txRequestId;