token.spec.ts 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. // SPDX-License-Identifier: Apache-2.0
  2. import { getOrCreateAssociatedTokenAccount, createMint, TOKEN_PROGRAM_ID } from '@solana/spl-token';
  3. import { Keypair } from '@solana/web3.js';
  4. import { loadContract } from './setup';
  5. import expect from 'expect';
  6. describe('Create spl-token and use from solidity', function () {
  7. this.timeout(500000);
  8. it('spl-token', async function name() {
  9. const { contract, connection, payer, program } = await loadContract('Token');
  10. const mintAuthority = Keypair.generate();
  11. const freezeAuthority = Keypair.generate();
  12. const mint = await createMint(
  13. connection,
  14. payer,
  15. mintAuthority.publicKey,
  16. freezeAuthority.publicKey,
  17. 3
  18. );
  19. await contract.functions.set_mint(mint.toBytes());
  20. expect(Number((await contract.functions.total_supply({ accounts: [mint] })).result)).toBe(0);
  21. const tokenAccount = await getOrCreateAssociatedTokenAccount(
  22. connection,
  23. payer,
  24. mint,
  25. payer.publicKey
  26. )
  27. expect(Number((await contract.functions.get_balance(tokenAccount.address.toBytes(), { accounts: [tokenAccount.address] })).result)).toBe(0);
  28. // Now let's mint some tokens
  29. await contract.functions.mint_to(
  30. tokenAccount.address.toBytes(),
  31. mintAuthority.publicKey.toBytes(),
  32. 100000,
  33. {
  34. accounts: [TOKEN_PROGRAM_ID],
  35. writableAccounts: [mint, tokenAccount.address],
  36. signers: [mintAuthority]
  37. },
  38. );
  39. // let's check the balances
  40. expect(Number((await contract.functions.total_supply({ accounts: [mint] })).result)).toBe(100000);
  41. expect(Number((await contract.functions.get_balance(tokenAccount.address.toBytes(), { accounts: [tokenAccount.address] })).result)).toBe(100000);
  42. // transfer
  43. const theOutsider = Keypair.generate();
  44. const otherTokenAccount = await getOrCreateAssociatedTokenAccount(
  45. connection,
  46. payer,
  47. mint,
  48. theOutsider.publicKey
  49. )
  50. await contract.functions.transfer(
  51. tokenAccount.address.toBytes(),
  52. otherTokenAccount.address.toBytes(),
  53. payer.publicKey.toBytes(),
  54. 70000,
  55. {
  56. accounts: [TOKEN_PROGRAM_ID],
  57. writableAccounts: [otherTokenAccount.address, tokenAccount.address],
  58. signers: [payer]
  59. },
  60. );
  61. expect(Number((await contract.functions.total_supply({ accounts: [mint] })).result)).toBe(100000);
  62. expect(Number((await contract.functions.get_balance(tokenAccount.address.toBytes(), { accounts: [tokenAccount.address] })).result)).toBe(30000);
  63. expect(Number((await contract.functions.get_balance(otherTokenAccount.address.toBytes(), { accounts: [otherTokenAccount.address] })).result)).toBe(70000);
  64. // burn
  65. await contract.functions.burn(
  66. otherTokenAccount.address.toBytes(),
  67. theOutsider.publicKey.toBytes(),
  68. 20000,
  69. {
  70. accounts: [TOKEN_PROGRAM_ID],
  71. writableAccounts: [otherTokenAccount.address, mint],
  72. signers: [theOutsider]
  73. },
  74. );
  75. expect(Number((await contract.functions.total_supply({ accounts: [mint] })).result)).toBe(80000);
  76. expect(Number((await contract.functions.get_balance(tokenAccount.address.toBytes(), { accounts: [tokenAccount.address] })).result)).toBe(30000);
  77. expect(Number((await contract.functions.get_balance(otherTokenAccount.address.toBytes(), { accounts: [otherTokenAccount.address] })).result)).toBe(50000);
  78. });
  79. });