From ad46a25b7959f4f809cabd8c24a1d049e1d678b1 Mon Sep 17 00:00:00 2001 From: Ravi Hegde Date: Thu, 30 Oct 2025 16:22:46 +0530 Subject: [PATCH] feat: handling new type of intents in prebuild Ticket: COIN-6265 --- modules/sdk-coin-canton/src/canton.ts | 9 +++++++ modules/sdk-core/src/bitgo/utils/mpcUtils.ts | 16 ++++++++++++- .../sdk-core/src/bitgo/utils/tss/baseTypes.ts | 2 ++ modules/sdk-core/src/bitgo/wallet/iWallet.ts | 1 + modules/sdk-core/src/bitgo/wallet/wallet.ts | 24 +++++++++++++++++++ 5 files changed, 51 insertions(+), 1 deletion(-) diff --git a/modules/sdk-coin-canton/src/canton.ts b/modules/sdk-coin-canton/src/canton.ts index f2ba0dd9b3..54407f6ba0 100644 --- a/modules/sdk-coin-canton/src/canton.ts +++ b/modules/sdk-coin-canton/src/canton.ts @@ -15,6 +15,8 @@ import { VerifyTransactionOptions, TransactionExplanation as BaseTransactionExplanation, BaseTransaction, + PopulatedIntent, + PrebuildTransactionWithIntentOptions, } from '@bitgo/sdk-core'; import { auditEddsaPrivateKey } from '@bitgo/sdk-lib-mpc'; import { BaseCoin as StaticsBaseCoin, coins } from '@bitgo/statics'; @@ -173,4 +175,11 @@ export class Canton extends BaseCoin { } auditEddsaPrivateKey(prv, publicKey ?? ''); } + + /** @inheritDoc */ + setCoinSpecificFieldsInIntent(intent: PopulatedIntent, params: PrebuildTransactionWithIntentOptions): void { + if (params.txRequestId) { + intent.txRequestId = params.txRequestId; + } + } } diff --git a/modules/sdk-core/src/bitgo/utils/mpcUtils.ts b/modules/sdk-core/src/bitgo/utils/mpcUtils.ts index a008e31a22..d1ac23294c 100644 --- a/modules/sdk-core/src/bitgo/utils/mpcUtils.ts +++ b/modules/sdk-core/src/bitgo/utils/mpcUtils.ts @@ -137,7 +137,21 @@ export abstract class MpcUtils { ); } - if (!['acceleration', 'fillNonce', 'transferToken', 'tokenApproval', 'customTx'].includes(params.intentType)) { + if (['transferAccept', 'transferReject'].includes(params.intentType) && baseCoin.getFamily() === 'canton') { + assert(params.txRequestId, `'txRequestId' is required parameter for ${params.intentType} intent`); + } + + if ( + ![ + 'acceleration', + 'fillNonce', + 'transferToken', + 'tokenApproval', + 'customTx', + 'transferAccept', + 'transferReject', + ].includes(params.intentType) + ) { assert(params.recipients, `'recipients' is a required parameter for ${params.intentType} intent`); } const intentRecipients = params.recipients?.map((recipient) => { diff --git a/modules/sdk-core/src/bitgo/utils/tss/baseTypes.ts b/modules/sdk-core/src/bitgo/utils/tss/baseTypes.ts index 4ffaa4e725..38e31d4399 100644 --- a/modules/sdk-core/src/bitgo/utils/tss/baseTypes.ts +++ b/modules/sdk-core/src/bitgo/utils/tss/baseTypes.ts @@ -268,6 +268,7 @@ export interface PrebuildTransactionWithIntentOptions extends IntentOptionsBase functionArguments?: any[]; abi?: any; }; + txRequestId?: string; } export interface IntentRecipient { address: { @@ -336,6 +337,7 @@ export interface PopulatedIntent extends PopulatedIntentBase { * Custom Aptos transaction for use with the customTx intent type. */ aptosCustomTransactionParams?: aptosCustomTransactionParams; + txRequestId?: string; } export type TxRequestState = diff --git a/modules/sdk-core/src/bitgo/wallet/iWallet.ts b/modules/sdk-core/src/bitgo/wallet/iWallet.ts index bfeadbbcd2..d2f1ad9583 100644 --- a/modules/sdk-core/src/bitgo/wallet/iWallet.ts +++ b/modules/sdk-core/src/bitgo/wallet/iWallet.ts @@ -215,6 +215,7 @@ export interface PrebuildTransactionOptions { functionArguments?: any[]; abi?: any; }; + txRequestId?: string; } export interface PrebuildAndSignTransactionOptions extends PrebuildTransactionOptions, WalletSignTransactionOptions { diff --git a/modules/sdk-core/src/bitgo/wallet/wallet.ts b/modules/sdk-core/src/bitgo/wallet/wallet.ts index ea37e77339..9b79f1708d 100644 --- a/modules/sdk-core/src/bitgo/wallet/wallet.ts +++ b/modules/sdk-core/src/bitgo/wallet/wallet.ts @@ -3499,6 +3499,30 @@ export class Wallet implements IWallet { params.preview ); break; + case 'transferAccept': { + txRequest = await this.tssUtils!.prebuildTxWithIntent( + { + reqId, + intentType: 'transferAccept', + txRequestId: params.txRequestId, + }, + apiVersion, + params.preview + ); + break; + } + case 'transferReject': { + txRequest = await this.tssUtils!.prebuildTxWithIntent( + { + reqId, + intentType: 'transferReject', + txRequestId: params.txRequestId, + }, + apiVersion, + params.preview + ); + break; + } case 'customTx': txRequest = await this.tssUtils!.prebuildTxWithIntent( {