ts: add optional commitment arg (#1171)

This commit is contained in:
Paul 2021-12-19 17:28:39 +01:00 committed by GitHub
parent 8aab5b4634
commit af926876c5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 36 additions and 12 deletions

View File

@ -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

View File

@ -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;
}
@ -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()}`);
}
@ -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(

View File

@ -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<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(