From af926876c57b90f4a54a4c10c21440f9c8dc0887 Mon Sep 17 00:00:00 2001 From: Paul Date: Sun, 19 Dec 2021 17:28:39 +0100 Subject: [PATCH] ts: add optional commitment arg (#1171) --- CHANGELOG.md | 1 + ts/src/program/namespace/account.ts | 19 +++++++++++++------ ts/src/utils/rpc.ts | 28 ++++++++++++++++++++++------ 3 files changed, 36 insertions(+), 12 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 77def4e0f..9df435150 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -19,6 +19,7 @@ incremented for features. * lang: Add `programdata_address: Option` field to `Program` account. Will be populated if account is a program owned by the upgradable bpf loader ([#1125](https://github.com/project-serum/anchor/pull/1125)) * lang,ts,ci,cli,docs: update solana toolchain to version 1.8.5([#1133](https://github.com/project-serum/anchor/pull/1133)) +* ts: Add optional commitment argument to `fetch` and `fetchMultiple` ([#1171](https://github.com/project-serum/anchor/pull/1171)) ### Breaking diff --git a/ts/src/program/namespace/account.ts b/ts/src/program/namespace/account.ts index 5dbba8a74..f166f8f36 100644 --- a/ts/src/program/namespace/account.ts +++ b/ts/src/program/namespace/account.ts @@ -136,8 +136,11 @@ export class AccountClient< * * @param address The address of the account to fetch. */ - async fetchNullable(address: Address): Promise { - const accountInfo = await this.getAccountInfo(address); + async fetchNullable( + address: Address, + commitment?: Commitment + ): Promise { + const accountInfo = await this.getAccountInfo(address, commitment); if (accountInfo === null) { return null; } @@ -161,8 +164,8 @@ export class AccountClient< * * @param address The address of the account to fetch. */ - async fetch(address: Address): Promise { - const data = await this.fetchNullable(address); + async fetch(address: Address, commitment?: Commitment): Promise { + const data = await this.fetchNullable(address, commitment); if (data === null) { throw new Error(`Account does not exist ${address.toString()}`); } @@ -175,10 +178,14 @@ export class AccountClient< * * @param addresses The addresses of the accounts to fetch. */ - async fetchMultiple(addresses: Address[]): Promise<(Object | null)[]> { + async fetchMultiple( + addresses: Address[], + commitment?: Commitment + ): Promise<(Object | null)[]> { const accounts = await rpcUtil.getMultipleAccounts( this._provider.connection, - addresses.map((address) => translateAddress(address)) + addresses.map((address) => translateAddress(address)), + commitment ); const discriminator = AccountsCoder.accountDiscriminator( diff --git a/ts/src/utils/rpc.ts b/ts/src/utils/rpc.ts index 2ac3c225b..658744ca1 100644 --- a/ts/src/utils/rpc.ts +++ b/ts/src/utils/rpc.ts @@ -8,6 +8,7 @@ import { TransactionSignature, Transaction, TransactionInstruction, + Commitment, } from "@solana/web3.js"; import { chunks } from "../utils/common.js"; import { Address, translateAddress } from "../program/common.js"; @@ -44,29 +45,44 @@ const GET_MULTIPLE_ACCOUNTS_LIMIT: number = 99; export async function getMultipleAccounts( connection: Connection, - publicKeys: PublicKey[] + publicKeys: PublicKey[], + commitment?: Commitment ): Promise< Array }> > { if (publicKeys.length <= GET_MULTIPLE_ACCOUNTS_LIMIT) { - return await getMultipleAccountsCore(connection, publicKeys); + return await getMultipleAccountsCore(connection, publicKeys, commitment); } else { const batches = chunks(publicKeys, GET_MULTIPLE_ACCOUNTS_LIMIT); const results = await Promise.all< Array }> - >(batches.map((batch) => getMultipleAccountsCore(connection, batch))); + >( + batches.map((batch) => + getMultipleAccountsCore(connection, batch, commitment) + ) + ); return results.flat(); } } async function getMultipleAccountsCore( connection: Connection, - publicKeys: PublicKey[] + publicKeys: PublicKey[], + commitmentOverride?: Commitment ): Promise< Array }> > { - const args = [publicKeys.map((k) => k.toBase58()), { commitment: "recent" }]; - // @ts-ignore + const commitment = commitmentOverride ?? connection.commitment; + const args: ( + | string[] + | { + commitment: Commitment; + } + )[] = [publicKeys.map((k) => k.toBase58())]; + if (commitment) { + args.push({ commitment }); + } + // @ts-expect-error const res = await connection._rpcRequest("getMultipleAccounts", args); if (res.error) { throw new Error(