151 lines
3.9 KiB
JavaScript
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,
|
||
|
}),
|
||
|
];
|
||
|
}
|