Skip to content

Commit

Permalink
ts: add pubkeys method builder function to view all instruction acc…
Browse files Browse the repository at this point in the history
…ount addresses (#1733)

Co-authored-by: Paul Schaaf <paulsimonschaaf@gmail.com>
  • Loading branch information
callensm and paul-schaaf authored Apr 10, 2022
1 parent 3d0560d commit d1ddf8e
Show file tree
Hide file tree
Showing 5 changed files with 65 additions and 10 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ The minor version will be incremented upon a breaking change and the patch versi
* avm: New `avm update` command to update the Anchor CLI to the latest version ([#1670](https://github.com/project-serum/anchor/pull/1670)).
* cli: Update js/ts templates to use new `program.methods` syntax ([#1732](https://github.com/project-serum/anchor/pull/1732)).
* cli: Workspaces created with `anchor init` now come with the `prettier` formatter and scripts included ([#1741](https://github.com/project-serum/anchor/pull/1741)).
* ts: Add `pubkeys` function to methods builder to get all instruction account addresses ([#1733](https://github.com/project-serum/anchor/pull/1733)).

### Fixes

Expand Down
3 changes: 2 additions & 1 deletion tests/pda-derivation/programs/pda-derivation/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,8 @@ pub mod pda_derivation {
Ok(())
}

pub fn init_my_account(ctx: Context<InitMyAccount>, seed_a: u8) -> Result<()> {
pub fn init_my_account(ctx: Context<InitMyAccount>, _seed_a: u8) -> Result<()> {
ctx.accounts.account.data = 1337;
Ok(())
}
}
Expand Down
50 changes: 42 additions & 8 deletions tests/pda-derivation/tests/typescript.spec.ts
Original file line number Diff line number Diff line change
@@ -1,12 +1,17 @@
import * as anchor from "@project-serum/anchor";
import BN from "bn.js";
import { Keypair } from "@solana/web3.js";
import { findProgramAddressSync } from "@project-serum/anchor/dist/cjs/utils/pubkey";
import { Program } from "@project-serum/anchor";
import { PdaDerivation } from "../target/types/pda_derivation";
import { expect } from "chai";
const encode = anchor.utils.bytes.utf8.encode;

describe("typescript", () => {
// Configure the client to use the local cluster.
anchor.setProvider(anchor.Provider.env());

const program = anchor.workspace.PdaDerivation;
const program = anchor.workspace.PdaDerivation as Program<PdaDerivation>;
const base = Keypair.generate();
const dataKey = Keypair.generate();
const data = new BN(1);
Expand All @@ -23,12 +28,41 @@ describe("typescript", () => {
});

it("Inits the derived accounts", async () => {
await program.methods
.initMyAccount(seedA)
.accounts({
base: base.publicKey,
base2: base.publicKey,
})
.rpc();
const MY_SEED = "hi";
const MY_SEED_STR = "hi";
const MY_SEED_U8 = 1;
const MY_SEED_U32 = 2;
const MY_SEED_U64 = 3;
const expectedPDAKey = findProgramAddressSync(
[
Buffer.from([seedA]),
encode("another-seed"),
encode("test"),
base.publicKey.toBuffer(),
base.publicKey.toBuffer(),
encode(MY_SEED),
encode(MY_SEED_STR),
Buffer.from([MY_SEED_U8]),
new anchor.BN(MY_SEED_U32).toArrayLike(Buffer, "le", 4),
new anchor.BN(MY_SEED_U64).toArrayLike(Buffer, "le", 8),
new anchor.BN(data).toArrayLike(Buffer, "le", 8),
dataKey.publicKey.toBuffer(),
],
program.programId
)[0];

const tx = program.methods.initMyAccount(seedA).accounts({
base: base.publicKey,
base2: base.publicKey,
});

const keys = await tx.pubkeys();
expect(keys.account.equals(expectedPDAKey)).is.true;

await tx.rpc();

const actualData = (await program.account.myAccount.fetch(expectedPDAKey))
.data;
expect(actualData.toNumber()).is.equal(1337);
});
});
14 changes: 13 additions & 1 deletion ts/src/program/namespace/methods.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,12 @@ import {
import { SimulateResponse } from "./simulate.js";
import { TransactionFn } from "./transaction.js";
import { Idl } from "../../idl.js";
import { AllInstructions, MethodsFn, MakeMethodsNamespace } from "./types.js";
import {
AllInstructions,
MethodsFn,
MakeMethodsNamespace,
InstructionAccountAddresses,
} from "./types.js";
import { InstructionFn } from "./instruction.js";
import { RpcFn } from "./rpc.js";
import { SimulateFn } from "./simulate.js";
Expand Down Expand Up @@ -83,6 +88,13 @@ export class MethodsBuilder<IDL extends Idl, I extends AllInstructions<IDL>> {
);
}

public async pubkeys(): Promise<
Partial<InstructionAccountAddresses<IDL, I>>
> {
await this._accountsResolver.resolve();
return this._accounts as Partial<InstructionAccountAddresses<IDL, I>>;
}

public accounts(
accounts: Partial<Accounts<I["accounts"][number]>>
): MethodsBuilder<IDL, I> {
Expand Down
7 changes: 7 additions & 0 deletions ts/src/program/namespace/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,13 @@ export type InstructionContextFnArgs<
Context<Accounts<I["accounts"][number]>>
];

export type InstructionAccountAddresses<
IDL extends Idl,
I extends AllInstructions<IDL>
> = {
[N in keyof Accounts<I["accounts"][number]>]: PublicKey;
};

export type MethodsFn<
IDL extends Idl,
I extends IDL["instructions"][number],
Expand Down

0 comments on commit d1ddf8e

Please sign in to comment.