123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156 |
- 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(400), {
- 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(600)));
- assert.ok(toAccount.amount.eq(new anchor.BN(400)));
- });
- it("Burns a token", async () => {
- await program.rpc.proxyBurn(new anchor.BN(399), {
- 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;
- // TODO: remove this constant once @project-serum/serum uses the same version
- // of @solana/web3.js as anchor (or switch packages).
- const TOKEN_PROGRAM_ID = new anchor.web3.PublicKey(
- TokenInstructions.TOKEN_PROGRAM_ID.toString()
- );
- 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: 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: TOKEN_PROGRAM_ID,
- }),
- TokenInstructions.initializeAccount({
- account: newAccountPubkey,
- mint,
- owner,
- }),
- ];
- }
|