ts: Expose accountDiscriminator as static method (#775)

This commit is contained in:
Daniel Marin 2021-09-22 20:12:13 +01:00 committed by GitHub
parent bde45c2985
commit b71cc6d5e5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 18 additions and 14 deletions

View File

@ -37,7 +37,7 @@ export class AccountsCoder<A extends string = string> {
} }
const len = layout.encode(account, buffer); const len = layout.encode(account, buffer);
let accountData = buffer.slice(0, len); let accountData = buffer.slice(0, len);
let discriminator = await accountDiscriminator(accountName); let discriminator = AccountsCoder.accountDiscriminator(accountName);
return Buffer.concat([discriminator, accountData]); return Buffer.concat([discriminator, accountData]);
} }
@ -50,9 +50,13 @@ export class AccountsCoder<A extends string = string> {
} }
return layout.decode(data); return layout.decode(data);
} }
}
// Calculates unique 8 byte discriminator prepended to all anchor accounts. /**
export async function accountDiscriminator(name: string): Promise<Buffer> { * Calculates and returns a unique 8 byte discriminator prepended to all anchor accounts.
return Buffer.from(sha256.digest(`account:${name}`)).slice(0, 8); *
* @param name The name of the account to calculate the discriminator.
*/
public static accountDiscriminator(name: string): Buffer {
return Buffer.from(sha256.digest(`account:${name}`)).slice(0, 8);
}
} }

View File

@ -9,11 +9,7 @@ import { sighash } from "./common";
export { accountSize } from "./common"; export { accountSize } from "./common";
export { TypesCoder } from "./types"; export { TypesCoder } from "./types";
export { InstructionCoder } from "./instruction"; export { InstructionCoder } from "./instruction";
export { export { AccountsCoder, ACCOUNT_DISCRIMINATOR_SIZE } from "./accounts";
AccountsCoder,
accountDiscriminator,
ACCOUNT_DISCRIMINATOR_SIZE,
} from "./accounts";
export { EventCoder, eventDiscriminator } from "./event"; export { EventCoder, eventDiscriminator } from "./event";
export { StateCoder, stateDiscriminator } from "./state"; export { StateCoder, stateDiscriminator } from "./state";

View File

@ -12,8 +12,8 @@ import Provider from "../../provider";
import { Idl, IdlTypeDef } from "../../idl"; import { Idl, IdlTypeDef } from "../../idl";
import Coder, { import Coder, {
ACCOUNT_DISCRIMINATOR_SIZE, ACCOUNT_DISCRIMINATOR_SIZE,
accountDiscriminator,
accountSize, accountSize,
AccountsCoder,
} from "../../coder"; } from "../../coder";
import { Subscription, Address, translateAddress } from "../common"; import { Subscription, Address, translateAddress } from "../common";
import { getProvider } from "../../"; import { getProvider } from "../../";
@ -132,7 +132,9 @@ export class AccountClient<T = any> {
} }
// Assert the account discriminator is correct. // Assert the account discriminator is correct.
const discriminator = await accountDiscriminator(this._idlAccount.name); const discriminator = AccountsCoder.accountDiscriminator(
this._idlAccount.name
);
if (discriminator.compare(accountInfo.data.slice(0, 8))) { if (discriminator.compare(accountInfo.data.slice(0, 8))) {
throw new Error("Invalid account discriminator"); throw new Error("Invalid account discriminator");
} }
@ -165,7 +167,9 @@ export class AccountClient<T = any> {
addresses.map((address) => translateAddress(address)) addresses.map((address) => translateAddress(address))
); );
const discriminator = await accountDiscriminator(this._idlAccount.name); const discriminator = AccountsCoder.accountDiscriminator(
this._idlAccount.name
);
// Decode accounts where discriminator is correct, null otherwise // Decode accounts where discriminator is correct, null otherwise
return accounts.map((account) => { return accounts.map((account) => {
if (account == null) { if (account == null) {
@ -185,7 +189,7 @@ export class AccountClient<T = any> {
* Returns all instances of this account type for the program. * Returns all instances of this account type for the program.
*/ */
async all(filter?: Buffer): Promise<ProgramAccount<T>[]> { async all(filter?: Buffer): Promise<ProgramAccount<T>[]> {
let bytes = await accountDiscriminator(this._idlAccount.name); let bytes = AccountsCoder.accountDiscriminator(this._idlAccount.name);
if (filter !== undefined) { if (filter !== undefined) {
bytes = Buffer.concat([bytes, filter]); bytes = Buffer.concat([bytes, filter]);
} }