Skip to content

Commit

Permalink
ts: add optional commitment arg (#1171)
Browse files Browse the repository at this point in the history
  • Loading branch information
paul-schaaf committed Dec 19, 2021
1 parent 8aab5b4 commit af92687
Show file tree
Hide file tree
Showing 3 changed files with 36 additions and 12 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Expand Up @@ -19,6 +19,7 @@ incremented for features.

* lang: Add `programdata_address: Option<Pubkey>` 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

Expand Down
19 changes: 13 additions & 6 deletions ts/src/program/namespace/account.ts
Expand Up @@ -136,8 +136,11 @@ export class AccountClient<
*
* @param address The address of the account to fetch.
*/
async fetchNullable(address: Address): Promise<T | null> {
const accountInfo = await this.getAccountInfo(address);
async fetchNullable(
address: Address,
commitment?: Commitment
): Promise<T | null> {
const accountInfo = await this.getAccountInfo(address, commitment);
if (accountInfo === null) {
return null;
}
Expand All @@ -161,8 +164,8 @@ export class AccountClient<
*
* @param address The address of the account to fetch.
*/
async fetch(address: Address): Promise<T> {
const data = await this.fetchNullable(address);
async fetch(address: Address, commitment?: Commitment): Promise<T> {
const data = await this.fetchNullable(address, commitment);
if (data === null) {
throw new Error(`Account does not exist ${address.toString()}`);
}
Expand All @@ -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(
Expand Down
28 changes: 22 additions & 6 deletions ts/src/utils/rpc.ts
Expand Up @@ -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";
Expand Down Expand Up @@ -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<null | { publicKey: PublicKey; account: AccountInfo<Buffer> }>
> {
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<null | { publicKey: PublicKey; account: AccountInfo<Buffer> }>
>(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<null | { publicKey: PublicKey; account: AccountInfo<Buffer> }>
> {
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(
Expand Down

0 comments on commit af92687

Please sign in to comment.