web3.js: add accounts support to simulateTransaction (#19590)
* feat: add accounts support to simulateTransaction * feat: introduce test for simulateTransaction on Message objects * feat: populate transaction from message defaults to no signatures * fix: remove unused constant * fix: small formatting error * fix: eslint and prettier were fighting over ternary indentation * fix: make simulated transaction result accounts nullable
This commit is contained in:
@@ -65,11 +65,26 @@ export class Message {
|
||||
recentBlockhash: Blockhash;
|
||||
instructions: CompiledInstruction[];
|
||||
|
||||
private indexToProgramIds: Map<number, PublicKey> = new Map<
|
||||
number,
|
||||
PublicKey
|
||||
>();
|
||||
|
||||
constructor(args: MessageArgs) {
|
||||
this.header = args.header;
|
||||
this.accountKeys = args.accountKeys.map(account => new PublicKey(account));
|
||||
this.recentBlockhash = args.recentBlockhash;
|
||||
this.instructions = args.instructions;
|
||||
this.instructions.forEach(ix =>
|
||||
this.indexToProgramIds.set(
|
||||
ix.programIdIndex,
|
||||
this.accountKeys[ix.programIdIndex],
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
isAccountSigner(index: number): boolean {
|
||||
return index < this.header.numRequiredSignatures;
|
||||
}
|
||||
|
||||
isAccountWritable(index: number): boolean {
|
||||
@@ -83,6 +98,18 @@ export class Message {
|
||||
);
|
||||
}
|
||||
|
||||
isProgramId(index: number): boolean {
|
||||
return this.indexToProgramIds.has(index);
|
||||
}
|
||||
|
||||
programIds(): PublicKey[] {
|
||||
return [...this.indexToProgramIds.values()];
|
||||
}
|
||||
|
||||
nonProgramIds(): PublicKey[] {
|
||||
return this.accountKeys.filter((_, index) => !this.isProgramId(index));
|
||||
}
|
||||
|
||||
serialize(): Buffer {
|
||||
const numKeys = this.accountKeys.length;
|
||||
|
||||
|
Reference in New Issue
Block a user