|
@@ -0,0 +1,150 @@
|
|
|
+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,
|
|
|
+ }),
|
|
|
+ ];
|
|
|
+}
|