anchor/tests/custom-coder/tests/spl-associated-token-coder.ts

74 lines
2.1 KiB
TypeScript

import * as anchor from "@project-serum/anchor";
import { Native, Spl } from "@project-serum/anchor";
import { Keypair, PublicKey } from "@solana/web3.js";
import * as assert from "assert";
import BN from "bn.js";
describe("spl-associated-token-coder", () => {
// Configure the client to use the local cluster.
const provider = anchor.AnchorProvider.env();
anchor.setProvider(provider);
// Client.
const program = Spl.associatedToken();
const systemProgram = Native.system();
const tokenProgram = Spl.token();
it("Creates an account", async () => {
// arrange
const mintKeypair = Keypair.generate();
const mintDecimals = 6;
const mintSize = tokenProgram.coder.accounts.size(
tokenProgram.idl.accounts[0]
);
const mintRentExemption =
await provider.connection.getMinimumBalanceForRentExemption(mintSize);
const [associatedToken] = await PublicKey.findProgramAddress(
[
provider.publicKey.toBuffer(),
tokenProgram.programId.toBuffer(),
mintKeypair.publicKey.toBuffer(),
],
program.programId
);
// act
await program.methods
.create()
.accounts({
authority: provider.wallet.publicKey,
mint: mintKeypair.publicKey,
owner: provider.wallet.publicKey,
associatedAccount: associatedToken,
})
.preInstructions(
await Promise.all([
systemProgram.methods
.createAccount(
new BN(mintRentExemption),
new BN(mintSize),
tokenProgram.programId
)
.accounts({
from: provider.wallet.publicKey,
to: mintKeypair.publicKey,
})
.instruction(),
tokenProgram.methods
.initializeMint(mintDecimals, provider.wallet.publicKey, null)
.accounts({
mint: mintKeypair.publicKey,
})
.instruction(),
])
)
.signers([mintKeypair])
.rpc();
// assert
const tokenAccount = await tokenProgram.account.token.fetch(
associatedToken
);
assert.ok(tokenAccount.mint.equals(mintKeypair.publicKey));
});
});