diff --git a/web3.js/src/connection.ts b/web3.js/src/connection.ts index 6e87047776..efee786ded 100644 --- a/web3.js/src/connection.ts +++ b/web3.js/src/connection.ts @@ -2596,8 +2596,12 @@ export class Connection { * Fetch a list of Transactions and transaction statuses from the cluster * for a confirmed block */ - async getConfirmedBlock(slot: number): Promise { - const unsafeRes = await this._rpcRequest('getConfirmedBlock', [slot]); + async getConfirmedBlock( + slot: number, + commitment?: Finality, + ): Promise { + const args = this._buildArgsAtLeastConfirmed([slot], commitment); + const unsafeRes = await this._rpcRequest('getConfirmedBlock', args); const res = create(unsafeRes, GetConfirmedBlockRpcResult); if ('error' in res) { throw new Error('failed to get confirmed block: ' + res.error.message); @@ -2614,11 +2618,18 @@ export class Connection { */ async getConfirmedBlockSignatures( slot: number, + commitment?: Finality, ): Promise { - const unsafeRes = await this._rpcRequest('getConfirmedBlock', [ - slot, - {transactionDetails: 'signatures', rewards: false}, - ]); + const args = this._buildArgsAtLeastConfirmed( + [slot], + commitment, + undefined, + { + transactionDetails: 'signatures', + rewards: false, + }, + ); + const unsafeRes = await this._rpcRequest('getConfirmedBlock', args); const res = create(unsafeRes, GetConfirmedBlockSignaturesRpcResult); if ('error' in res) { throw new Error('failed to get confirmed block: ' + res.error.message); @@ -2635,10 +2646,10 @@ export class Connection { */ async getConfirmedTransaction( signature: TransactionSignature, + commitment?: Finality, ): Promise { - const unsafeRes = await this._rpcRequest('getConfirmedTransaction', [ - signature, - ]); + const args = this._buildArgsAtLeastConfirmed([signature], commitment); + const unsafeRes = await this._rpcRequest('getConfirmedTransaction', args); const res = create(unsafeRes, GetConfirmedTransactionRpcResult); if ('error' in res) { throw new Error( @@ -2653,11 +2664,14 @@ export class Connection { */ async getParsedConfirmedTransaction( signature: TransactionSignature, + commitment?: Finality, ): Promise { - const unsafeRes = await this._rpcRequest('getConfirmedTransaction', [ - signature, + const args = this._buildArgsAtLeastConfirmed( + [signature], + commitment, 'jsonParsed', - ]); + ); + const unsafeRes = await this._rpcRequest('getConfirmedTransaction', args); const res = create(unsafeRes, GetParsedConfirmedTransactionRpcResult); if ('error' in res) { throw new Error( @@ -2672,11 +2686,17 @@ export class Connection { */ async getParsedConfirmedTransactions( signatures: TransactionSignature[], + commitment?: Finality, ): Promise<(ParsedConfirmedTransaction | null)[]> { const batch = signatures.map(signature => { + const args = this._buildArgsAtLeastConfirmed( + [signature], + commitment, + 'jsonParsed', + ); return { methodName: 'getConfirmedTransaction', - args: [signature, 'jsonParsed'], + args, }; }); @@ -2718,7 +2738,10 @@ export class Connection { } try { - const block = await this.getConfirmedBlockSignatures(startSlot); + const block = await this.getConfirmedBlockSignatures( + startSlot, + 'finalized', + ); if (block.signatures.length > 0) { options.until = block.signatures[ block.signatures.length - 1 @@ -2774,10 +2797,17 @@ export class Connection { async getConfirmedSignaturesForAddress2( address: PublicKey, options?: ConfirmedSignaturesForAddress2Options, + commitment?: Finality, ): Promise> { + const args = this._buildArgsAtLeastConfirmed( + [address.toBase58()], + commitment, + undefined, + options, + ); const unsafeRes = await this._rpcRequest( 'getConfirmedSignaturesForAddress2', - [address.toBase58(), options], + args, ); const res = create(unsafeRes, GetConfirmedSignaturesForAddress2RpcResult); if ('error' in res) { @@ -3485,6 +3515,26 @@ export class Connection { return args; } + /** + * @internal + */ + _buildArgsAtLeastConfirmed( + args: Array, + override?: Finality, + encoding?: 'jsonParsed' | 'base64', + extra?: any, + ): Array { + const commitment = override || this._commitment; + if (commitment && !['confirmed', 'finalized'].includes(commitment)) { + throw new Error( + 'Using Connection with default commitment: `' + + this._commitment + + '`, but method requires at least `confirmed`', + ); + } + return this._buildArgs(args, override, encoding, extra); + } + /** * @internal */ diff --git a/web3.js/test/connection.test.ts b/web3.js/test/connection.test.ts index 1da065fcef..83cb84fc44 100644 --- a/web3.js/test/connection.test.ts +++ b/web3.js/test/connection.test.ts @@ -1408,7 +1408,7 @@ describe('Connection', () => { await mockRpcResponse({ method: 'getConfirmedTransaction', - params: [confirmedTransaction, 'jsonParsed'], + params: [confirmedTransaction, {encoding: 'jsonParsed'}], value: getMockData({ parsed: {}, program: 'spl-token', @@ -1428,7 +1428,7 @@ describe('Connection', () => { await mockRpcResponse({ method: 'getConfirmedTransaction', - params: [confirmedTransaction, 'jsonParsed'], + params: [confirmedTransaction, {encoding: 'jsonParsed'}], value: getMockData({ accounts: [ 'EeJqWk5pczNjsqqY3jia9xfFNG1dD68te4s8gsdCuEk7',