stateless-asks.ts 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. import { splStatelessAsksProgram } from "@coral-xyz/spl-stateless-asks";
  2. import { splTokenProgram } from "@coral-xyz/spl-token";
  3. import { BN } from "@coral-xyz/anchor";
  4. import { Keypair, PublicKey } from "@solana/web3.js";
  5. import {
  6. SPL_STATELESS_ASKS_PROGRAM_ID,
  7. SPL_TOKEN_PROGRAM_ID,
  8. } from "../constants";
  9. import {
  10. createAta,
  11. createMint,
  12. getProvider,
  13. loadKp,
  14. sendAndConfirmTx,
  15. test,
  16. } from "../utils";
  17. export async function statelessAsksTests() {
  18. const provider = await getProvider();
  19. const program = splStatelessAsksProgram({
  20. provider,
  21. programId: SPL_STATELESS_ASKS_PROGRAM_ID,
  22. });
  23. const tokenProgram = splTokenProgram({
  24. provider,
  25. programId: SPL_TOKEN_PROGRAM_ID,
  26. });
  27. const kp = await loadKp();
  28. async function acceptOffer() {
  29. const makerKp = new Keypair();
  30. const makerPk = makerKp.publicKey;
  31. const makerMintPk = await createMint();
  32. const takerMintPk = await createMint();
  33. const makerSrcTokenAccountPk = await createAta(makerMintPk, makerPk);
  34. const makerDstTokenAccountPk = await createAta(takerMintPk, makerPk);
  35. const takerSrcTokenAccountPk = await createAta(takerMintPk, kp.publicKey);
  36. const takerDstTokenAccountPk = await createAta(makerMintPk, kp.publicKey);
  37. const makerSize = new BN(500);
  38. const takerSize = new BN(400);
  39. const [authorityPk, bump] = await PublicKey.findProgramAddress(
  40. [
  41. Buffer.from("stateless_offer"),
  42. makerPk.toBuffer(),
  43. makerMintPk.toBuffer(),
  44. takerMintPk.toBuffer(),
  45. makerSize.toBuffer("le", 8),
  46. takerSize.toBuffer("le", 8),
  47. ],
  48. program.programId
  49. );
  50. const mintMakerSrcIx = await tokenProgram.methods
  51. .mintTo(makerSize)
  52. .accounts({
  53. account: makerSrcTokenAccountPk,
  54. mint: makerMintPk,
  55. owner: kp.publicKey,
  56. })
  57. .instruction();
  58. const makerSrcApproveIx = await tokenProgram.methods
  59. .approve(makerSize)
  60. .accounts({
  61. delegate: authorityPk,
  62. owner: makerPk,
  63. source: makerSrcTokenAccountPk,
  64. })
  65. .instruction();
  66. const mintTakerSrcIx = await tokenProgram.methods
  67. .mintTo(takerSize)
  68. .accounts({
  69. account: takerSrcTokenAccountPk,
  70. mint: takerMintPk,
  71. owner: kp.publicKey,
  72. })
  73. .instruction();
  74. const acceptOfferIx = await program.methods
  75. .acceptOffer(false, makerSize, takerSize, bump)
  76. .accounts({
  77. makerWallet: makerPk,
  78. takerWallet: kp.publicKey,
  79. makerSrcAccount: makerSrcTokenAccountPk,
  80. makerDstAccount: makerDstTokenAccountPk,
  81. takerSrcAccount: takerSrcTokenAccountPk,
  82. takerDstAccount: takerDstTokenAccountPk,
  83. makerMint: makerMintPk,
  84. takerMint: takerMintPk,
  85. authority: authorityPk,
  86. tokenProgram: tokenProgram.programId,
  87. })
  88. .instruction();
  89. await sendAndConfirmTx(
  90. [mintMakerSrcIx, makerSrcApproveIx, mintTakerSrcIx, acceptOfferIx],
  91. [kp, makerKp]
  92. );
  93. }
  94. await test(acceptOffer);
  95. }