test.ts 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. import { describe, test } from 'node:test';
  2. import { AccountLayout } from '@solana/spl-token';
  3. import { Transaction } from '@solana/web3.js';
  4. import { assert } from 'chai';
  5. import { start } from 'solana-bankrun';
  6. import { OfferAccount } from './account';
  7. import { buildMakeOffer, buildTakeOffer } from './instruction';
  8. import { createValues, mintingTokens } from './utils';
  9. describe('Escrow!', async () => {
  10. const values = createValues();
  11. const context = await start([{ name: 'escrow_native_program', programId: values.programId }], []);
  12. const client = context.banksClient;
  13. const payer = context.payer;
  14. console.log(`Program Address : ${values.programId}`);
  15. console.log(`Payer Address : ${payer.publicKey}`);
  16. test('mint tokens to maker and taker', async () => {
  17. // mint token a to maker account
  18. await mintingTokens({
  19. context,
  20. holder: values.maker,
  21. mintKeypair: values.mintAKeypair,
  22. });
  23. // mint Token B to Taker account
  24. await mintingTokens({
  25. context,
  26. holder: values.taker,
  27. mintKeypair: values.mintBKeypair,
  28. });
  29. });
  30. test('Make Offer', async () => {
  31. const ix = buildMakeOffer({
  32. id: values.id,
  33. maker: values.maker.publicKey,
  34. maker_token_a: values.makerAccountA,
  35. offer: values.offer,
  36. token_a_offered_amount: values.amountA,
  37. token_b_wanted_amount: values.amountB,
  38. vault: values.vault,
  39. mint_a: values.mintAKeypair.publicKey,
  40. mint_b: values.mintBKeypair.publicKey,
  41. payer: payer.publicKey,
  42. programId: values.programId,
  43. });
  44. const blockhash = context.lastBlockhash;
  45. const tx = new Transaction();
  46. tx.recentBlockhash = blockhash;
  47. tx.add(ix).sign(payer, values.maker);
  48. await client.processTransaction(tx);
  49. const offerInfo = await client.getAccount(values.offer);
  50. const offer = OfferAccount.fromBuffer(offerInfo.data).toData();
  51. const vaultInfo = await client.getAccount(values.vault);
  52. const vaultTokenAccount = AccountLayout.decode(vaultInfo.data);
  53. assert(offer.id.toString() === values.id.toString(), 'wrong id');
  54. assert(offer.maker.toBase58() === values.maker.publicKey.toBase58(), 'maker key does not match');
  55. assert(offer.token_mint_a.toBase58() === values.mintAKeypair.publicKey.toBase58(), 'wrong mint A');
  56. assert(offer.token_mint_b.toBase58() === values.mintBKeypair.publicKey.toBase58(), 'wrong mint B');
  57. assert(offer.token_b_wanted_amount.toString() === values.amountB.toString(), 'unexpected amount B');
  58. assert(vaultTokenAccount.amount.toString() === values.amountA.toString(), 'unexpected amount A');
  59. });
  60. test('Take Offer', async () => {
  61. const ix = buildTakeOffer({
  62. maker: values.maker.publicKey,
  63. offer: values.offer,
  64. vault: values.vault,
  65. mint_a: values.mintAKeypair.publicKey,
  66. mint_b: values.mintBKeypair.publicKey,
  67. maker_token_b: values.makerAccountB,
  68. taker: values.taker.publicKey,
  69. taker_token_a: values.takerAccountA,
  70. taker_token_b: values.takerAccountB,
  71. payer: payer.publicKey,
  72. programId: values.programId,
  73. });
  74. const blockhash = context.lastBlockhash;
  75. const tx = new Transaction();
  76. tx.recentBlockhash = blockhash;
  77. tx.add(ix).sign(payer, values.taker);
  78. await client.processTransaction(tx);
  79. const offerInfo = await client.getAccount(values.offer);
  80. assert(offerInfo === null, 'offer account not closed');
  81. const vaultInfo = await client.getAccount(values.vault);
  82. assert(vaultInfo === null, 'vault account not closed');
  83. const makerTokenBInfo = await client.getAccount(values.makerAccountB);
  84. const makerTokenAccountB = AccountLayout.decode(makerTokenBInfo.data);
  85. const takerTokenAInfo = await client.getAccount(values.takerAccountA);
  86. const takerTokenAccountA = AccountLayout.decode(takerTokenAInfo.data);
  87. assert(takerTokenAccountA.amount.toString() === values.amountA.toString(), 'unexpected amount a');
  88. assert(makerTokenAccountB.amount.toString() === values.amountB.toString(), 'unexpected amount b');
  89. });
  90. });