anchor/examples/spl/token-proxy/tests/token-proxy.js

151 lines
3.9 KiB
JavaScript

const anchor = require("@project-serum/anchor");
const assert = require("assert");
describe("token", () => {
const provider = anchor.Provider.local();
// Configure the client to use the local cluster.
anchor.setProvider(provider);
const program = anchor.workspace.TokenProxy;
let mint = null;
let from = null;
let to = null;
it("Initializes test state", async () => {
mint = await createMint(provider);
from = await createTokenAccount(provider, mint, provider.wallet.publicKey);
to = await createTokenAccount(provider, mint, provider.wallet.publicKey);
});
it("Mints a token", async () => {
await program.rpc.proxyMintTo(new anchor.BN(1000), {
accounts: {
authority: provider.wallet.publicKey,
mint,
to: from,
tokenProgram: TokenInstructions.TOKEN_PROGRAM_ID,
},
});
const fromAccount = await getTokenAccount(provider, from);
assert.ok(fromAccount.amount.eq(new anchor.BN(1000)));
});
it("Transfers a token", async () => {
await program.rpc.proxyTransfer(new anchor.BN(500), {
accounts: {
authority: provider.wallet.publicKey,
to,
from,
tokenProgram: TokenInstructions.TOKEN_PROGRAM_ID,
},
});
const fromAccount = await getTokenAccount(provider, from);
const toAccount = await getTokenAccount(provider, to);
assert.ok(fromAccount.amount.eq(new anchor.BN(500)));
assert.ok(fromAccount.amount.eq(new anchor.BN(500)));
});
it("Burns a token", async () => {
await program.rpc.proxyBurn(new anchor.BN(499), {
accounts: {
authority: provider.wallet.publicKey,
mint,
to,
tokenProgram: TokenInstructions.TOKEN_PROGRAM_ID,
},
});
const toAccount = await getTokenAccount(provider, to);
assert.ok(toAccount.amount.eq(new anchor.BN(1)));
});
});
// SPL token client boilerplate for test initialization. Everything below here is
// mostly irrelevant to the point of the example.
const serumCmn = require("@project-serum/common");
const TokenInstructions = require("@project-serum/serum").TokenInstructions;
async function getTokenAccount(provider, addr) {
return await serumCmn.getTokenAccount(provider, addr);
}
async function createMint(provider, authority) {
if (authority === undefined) {
authority = provider.wallet.publicKey;
}
const mint = new anchor.web3.Account();
const instructions = await createMintInstructions(
provider,
authority,
mint.publicKey
);
const tx = new anchor.web3.Transaction();
tx.add(...instructions);
await provider.send(tx, [mint]);
return mint.publicKey;
}
async function createMintInstructions(provider, authority, mint) {
let instructions = [
anchor.web3.SystemProgram.createAccount({
fromPubkey: provider.wallet.publicKey,
newAccountPubkey: mint,
space: 82,
lamports: await provider.connection.getMinimumBalanceForRentExemption(82),
programId: TokenInstructions.TOKEN_PROGRAM_ID,
}),
TokenInstructions.initializeMint({
mint,
decimals: 0,
mintAuthority: authority,
}),
];
return instructions;
}
async function createTokenAccount(provider, mint, owner) {
const vault = new anchor.web3.Account();
const tx = new anchor.web3.Transaction();
tx.add(
...(await createTokenAccountInstrs(provider, vault.publicKey, mint, owner))
);
await provider.send(tx, [vault]);
return vault.publicKey;
}
async function createTokenAccountInstrs(
provider,
newAccountPubkey,
mint,
owner,
lamports
) {
if (lamports === undefined) {
lamports = await provider.connection.getMinimumBalanceForRentExemption(165);
}
return [
anchor.web3.SystemProgram.createAccount({
fromPubkey: provider.wallet.publicKey,
newAccountPubkey,
space: 165,
lamports,
programId: TokenInstructions.TOKEN_PROGRAM_ID,
}),
TokenInstructions.initializeAccount({
account: newAccountPubkey,
mint,
owner,
}),
];
}