From 191eb86aa851cc893b216f23ff0ad3f13423cc2d Mon Sep 17 00:00:00 2001 From: Derek Chen Date: Mon, 20 Oct 2025 13:37:41 -0400 Subject: [PATCH] feat(sdk-coin-sol): add recentBlockhash to custom versioned solana tx flow Ticket: SC-3567 --- modules/sdk-coin-sol/src/lib/iface.ts | 1 + modules/sdk-coin-sol/src/lib/transactionBuilder.ts | 8 +++++--- modules/sdk-coin-sol/test/unit/versionedTransaction.ts | 4 +++- modules/sdk-core/src/bitgo/utils/tss/baseTypes.ts | 1 + modules/sdk-core/src/bitgo/wallet/iWallet.ts | 1 + 5 files changed, 11 insertions(+), 4 deletions(-) diff --git a/modules/sdk-coin-sol/src/lib/iface.ts b/modules/sdk-coin-sol/src/lib/iface.ts index bfe8929686..d0bd7b0cd3 100644 --- a/modules/sdk-coin-sol/src/lib/iface.ts +++ b/modules/sdk-coin-sol/src/lib/iface.ts @@ -261,6 +261,7 @@ export interface VersionedTransactionData { numReadonlySignedAccounts: number; numReadonlyUnsignedAccounts: number; }; + recentBlockhash?: string; } export interface AddressLookupTable { diff --git a/modules/sdk-coin-sol/src/lib/transactionBuilder.ts b/modules/sdk-coin-sol/src/lib/transactionBuilder.ts index bafdc802b2..d381c66479 100644 --- a/modules/sdk-coin-sol/src/lib/transactionBuilder.ts +++ b/modules/sdk-coin-sol/src/lib/transactionBuilder.ts @@ -258,8 +258,10 @@ export abstract class TransactionBuilder extends BaseTransactionBuilder { data: Buffer.from(base58.decode(instruction.data)), })); - if (!this._recentBlockhash) { - throw new BuildTransactionError('Missing nonce (recentBlockhash) for VersionedTransaction'); + const recentBlockhash = data.recentBlockhash || this._recentBlockhash; + + if (!recentBlockhash) { + throw new BuildTransactionError('Missing recent blockhash for VersionedTransaction'); } if (!this._sender) { @@ -269,7 +271,7 @@ export abstract class TransactionBuilder extends BaseTransactionBuilder { const messageV0 = new MessageV0({ header: data.messageHeader, staticAccountKeys, - recentBlockhash: this._recentBlockhash, + recentBlockhash: recentBlockhash, compiledInstructions, addressTableLookups, }); diff --git a/modules/sdk-coin-sol/test/unit/versionedTransaction.ts b/modules/sdk-coin-sol/test/unit/versionedTransaction.ts index 462bca29f0..98cfb0280b 100644 --- a/modules/sdk-coin-sol/test/unit/versionedTransaction.ts +++ b/modules/sdk-coin-sol/test/unit/versionedTransaction.ts @@ -37,6 +37,7 @@ describe('Sol Jupiter Swap Transaction', () => { addressLookupTables, staticAccountKeys, messageHeader: originalDeserialized.message.header, + recentBlockhash: originalDeserialized.message.recentBlockhash, }; const factory = getBuilderFactory('tsol'); @@ -197,7 +198,7 @@ describe('Sol Jupiter Swap Transaction', () => { ); }); - it('should not inject nonce advance when using regular nonce (no durableNonceParams)', async function () { + it('should not inject nonce advance when using recentBlockhash (no durableNonceParams)', async function () { const versionedTransactionData = { versionedInstructions: [ { @@ -213,6 +214,7 @@ describe('Sol Jupiter Swap Transaction', () => { numReadonlySignedAccounts: 0, numReadonlyUnsignedAccounts: 0, }, + recentBlockhash: testData.blockHashes.validBlockHashes[0], }; const factory = getBuilderFactory('tsol'); diff --git a/modules/sdk-core/src/bitgo/utils/tss/baseTypes.ts b/modules/sdk-core/src/bitgo/utils/tss/baseTypes.ts index 5fc017912e..4ffaa4e725 100644 --- a/modules/sdk-core/src/bitgo/utils/tss/baseTypes.ts +++ b/modules/sdk-core/src/bitgo/utils/tss/baseTypes.ts @@ -68,6 +68,7 @@ export interface SolVersionedTransactionData { numReadonlySignedAccounts: number; numReadonlyUnsignedAccounts: number; }; + recentBlockhash?: string; } export interface aptosCustomTransactionParams { diff --git a/modules/sdk-core/src/bitgo/wallet/iWallet.ts b/modules/sdk-core/src/bitgo/wallet/iWallet.ts index 2ade4db60a..735d4408a6 100644 --- a/modules/sdk-core/src/bitgo/wallet/iWallet.ts +++ b/modules/sdk-core/src/bitgo/wallet/iWallet.ts @@ -202,6 +202,7 @@ export interface PrebuildTransactionOptions { numReadonlySignedAccounts: number; numReadonlyUnsignedAccounts: number; }; + recentBlockhash?: string; }; /** * Custom transaction parameters for Aptos entry function calls.