From d341952776dc881db9e7d68820a8702aef20536a Mon Sep 17 00:00:00 2001 From: Hrishikesh Jain Date: Tue, 29 Sep 2026 19:08:59 +0530 Subject: [PATCH] fix(sdk-core): allow disabletoken in sendTokenEnablement guard prebuildTransactionTxRequests gained a 'disabletoken' case in f9ce83d817 (wire disabletoken prebuild intent for Canton), so prebuildTransaction succeeds for Canton disable-token flows. But sendTokenEnablement's validation guard still only allow-listed buildParams.type 'enabletoken'/'enableMpt', so sendTokenEnablements (and the retail-web disable-token UI, which calls it) threw 'Invalid build of token enablement.' immediately after a successful prebuild. Adds 'disabletoken' to the allow-list, mirroring 'enabletoken'. Ticket: CHALO-1495 --- modules/sdk-core/src/bitgo/wallet/wallet.ts | 4 +++- .../test/unit/bitgo/wallet/tokenApproval.ts | 14 +++++++++++++- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/modules/sdk-core/src/bitgo/wallet/wallet.ts b/modules/sdk-core/src/bitgo/wallet/wallet.ts index 73c1b4189c7..9afc8d033d8 100644 --- a/modules/sdk-core/src/bitgo/wallet/wallet.ts +++ b/modules/sdk-core/src/bitgo/wallet/wallet.ts @@ -4346,7 +4346,9 @@ export class Wallet implements IWallet { if ( typeof params.prebuildTx === 'string' || - (params.prebuildTx?.buildParams?.type !== 'enabletoken' && params.prebuildTx?.buildParams?.type !== 'enableMpt') + (params.prebuildTx?.buildParams?.type !== 'enabletoken' && + params.prebuildTx?.buildParams?.type !== 'enableMpt' && + params.prebuildTx?.buildParams?.type !== 'disabletoken') ) { throw new Error('Invalid build of token enablement.'); } diff --git a/modules/sdk-core/test/unit/bitgo/wallet/tokenApproval.ts b/modules/sdk-core/test/unit/bitgo/wallet/tokenApproval.ts index 7ccd1ae474f..b7de3b613bb 100644 --- a/modules/sdk-core/test/unit/bitgo/wallet/tokenApproval.ts +++ b/modules/sdk-core/test/unit/bitgo/wallet/tokenApproval.ts @@ -1,6 +1,6 @@ import sinon from 'sinon'; import 'should'; -import { BuildTokenApprovalResponse, Wallet } from '../../../../src'; +import { BuildTokenApprovalResponse, PrebuildTransactionResult, Wallet } from '../../../../src'; describe('Wallet - Token Approval', function () { let wallet: Wallet; @@ -224,6 +224,18 @@ describe('Wallet - Token Approval', function () { sinon.assert.calledOnce(initiateStub); }); + it('should pass validation and proceed when buildParams.type is "disabletoken"', async function () { + const initiateStub = sinon.stub(teWallet, 'initiateTransaction' as keyof Wallet).resolves({ txid: 'disable789' }); + + const result = await teWallet.sendTokenEnablement({ + // Partial fixture: only the fields sendTokenEnablement's validation guard reads. + prebuildTx: { buildParams: { type: 'disabletoken' } } as unknown as PrebuildTransactionResult, + }); + + result.should.eql({ txid: 'disable789' }); + sinon.assert.calledOnce(initiateStub); + }); + it('should throw when the coin does not require token enablement', async function () { teBaseCoin.getTokenEnablementConfig.returns({ requiresTokenEnablement: false });