cashiers-check.js 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. const anchor = require("@project-serum/anchor");
  2. const serumCmn = require("@project-serum/common");
  3. const { assert } = require("chai");
  4. const { TOKEN_PROGRAM_ID } = require("@solana/spl-token");
  5. describe("cashiers-check", () => {
  6. // Configure the client to use the local cluster.
  7. const provider = anchor.AnchorProvider.env();
  8. // hack so we don't have to update serum-common library
  9. // to the new AnchorProvider class and Provider interface
  10. provider.send = provider.sendAndConfirm;
  11. anchor.setProvider(provider);
  12. const program = anchor.workspace.CashiersCheck;
  13. let mint = null;
  14. let god = null;
  15. let receiver = null;
  16. it("Sets up initial test state", async () => {
  17. const [_mint, _god] = await serumCmn.createMintAndVault(
  18. program.provider,
  19. new anchor.BN(1000000)
  20. );
  21. mint = _mint;
  22. god = _god;
  23. receiver = await serumCmn.createTokenAccount(
  24. program.provider,
  25. mint,
  26. program.provider.wallet.publicKey
  27. );
  28. });
  29. const check = anchor.web3.Keypair.generate();
  30. const vault = anchor.web3.Keypair.generate();
  31. let checkSigner = null;
  32. it("Creates a check!", async () => {
  33. let [_checkSigner, nonce] = await anchor.web3.PublicKey.findProgramAddress(
  34. [check.publicKey.toBuffer()],
  35. program.programId
  36. );
  37. checkSigner = _checkSigner;
  38. await program.rpc.createCheck(new anchor.BN(100), "Hello world", nonce, {
  39. accounts: {
  40. check: check.publicKey,
  41. vault: vault.publicKey,
  42. checkSigner,
  43. from: god,
  44. to: receiver,
  45. owner: program.provider.wallet.publicKey,
  46. tokenProgram: TOKEN_PROGRAM_ID,
  47. rent: anchor.web3.SYSVAR_RENT_PUBKEY,
  48. },
  49. signers: [check, vault],
  50. instructions: [
  51. await program.account.check.createInstruction(check, 300),
  52. ...(await serumCmn.createTokenAccountInstrs(
  53. program.provider,
  54. vault.publicKey,
  55. mint,
  56. checkSigner
  57. )),
  58. ],
  59. });
  60. const checkAccount = await program.account.check.fetch(check.publicKey);
  61. assert.isTrue(checkAccount.from.equals(god));
  62. assert.isTrue(checkAccount.to.equals(receiver));
  63. assert.isTrue(checkAccount.amount.eq(new anchor.BN(100)));
  64. assert.strictEqual(checkAccount.memo, "Hello world");
  65. assert.isTrue(checkAccount.vault.equals(vault.publicKey));
  66. assert.strictEqual(checkAccount.nonce, nonce);
  67. assert.isFalse(checkAccount.burned);
  68. let vaultAccount = await serumCmn.getTokenAccount(
  69. program.provider,
  70. checkAccount.vault
  71. );
  72. assert.isTrue(vaultAccount.amount.eq(new anchor.BN(100)));
  73. });
  74. it("Cashes a check", async () => {
  75. await program.rpc.cashCheck({
  76. accounts: {
  77. check: check.publicKey,
  78. vault: vault.publicKey,
  79. checkSigner: checkSigner,
  80. to: receiver,
  81. owner: program.provider.wallet.publicKey,
  82. tokenProgram: TOKEN_PROGRAM_ID,
  83. },
  84. });
  85. const checkAccount = await program.account.check.fetch(check.publicKey);
  86. assert.isTrue(checkAccount.burned);
  87. let vaultAccount = await serumCmn.getTokenAccount(
  88. program.provider,
  89. checkAccount.vault
  90. );
  91. assert.isTrue(vaultAccount.amount.eq(new anchor.BN(0)));
  92. let receiverAccount = await serumCmn.getTokenAccount(
  93. program.provider,
  94. receiver
  95. );
  96. assert.isTrue(receiverAccount.amount.eq(new anchor.BN(100)));
  97. });
  98. });