feature-proposal.ts 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. import { splFeatureProposalProgram } from "@coral-xyz/spl-feature-proposal";
  2. import { splTokenProgram } from "@coral-xyz/spl-token";
  3. import { BN } from "@coral-xyz/anchor";
  4. import {
  5. Keypair,
  6. PublicKey,
  7. SystemProgram,
  8. SYSVAR_CLOCK_PUBKEY,
  9. SYSVAR_RENT_PUBKEY,
  10. } from "@solana/web3.js";
  11. import {
  12. SPL_FEATURE_PROPOSAL_PROGRAM_ID,
  13. SPL_TOKEN_PROGRAM_ID,
  14. } from "../constants";
  15. import { getProvider, loadKp, sendAndConfirmTx, test } from "../utils";
  16. export async function featureProposalTests() {
  17. const provider = await getProvider();
  18. const program = splFeatureProposalProgram({
  19. provider,
  20. programId: SPL_FEATURE_PROPOSAL_PROGRAM_ID,
  21. });
  22. const tokenProgram = splTokenProgram({
  23. provider,
  24. programId: SPL_TOKEN_PROGRAM_ID,
  25. });
  26. const kp = await loadKp();
  27. let featureProposalPk: PublicKey;
  28. let acceptanceTokenAccountPk: PublicKey;
  29. let featureIdPk: PublicKey;
  30. async function propose() {
  31. const featureProposalKp = new Keypair();
  32. featureProposalPk = featureProposalKp.publicKey;
  33. const [mintPk] = await PublicKey.findProgramAddress(
  34. [featureProposalPk.toBuffer(), Buffer.from("mint")],
  35. program.programId
  36. );
  37. const [distributorTokenAccountPk] = await PublicKey.findProgramAddress(
  38. [featureProposalPk.toBuffer(), Buffer.from("distributor")],
  39. program.programId
  40. );
  41. [acceptanceTokenAccountPk] = await PublicKey.findProgramAddress(
  42. [featureProposalPk.toBuffer(), Buffer.from("acceptance")],
  43. program.programId
  44. );
  45. [featureIdPk] = await PublicKey.findProgramAddress(
  46. [featureProposalPk.toBuffer(), Buffer.from("feature-id")],
  47. program.programId
  48. );
  49. const proposeIx = await program.methods
  50. .propose(new BN(10), { tokensRequired: new BN(5), deadline: new BN(24) })
  51. .accounts({
  52. fundingAddress: kp.publicKey,
  53. featureProposalAddress: featureProposalPk,
  54. mintAddress: mintPk,
  55. distributorTokenAddress: distributorTokenAccountPk,
  56. acceptanceTokenAddress: acceptanceTokenAccountPk,
  57. feature: featureIdPk,
  58. systemProgram: SystemProgram.programId,
  59. tokenProgram: tokenProgram.programId,
  60. rent: SYSVAR_RENT_PUBKEY,
  61. })
  62. .instruction();
  63. await sendAndConfirmTx([proposeIx], [kp, featureProposalKp]);
  64. }
  65. async function tally() {
  66. const tallyIx = await program.methods
  67. .tally()
  68. .accounts({
  69. featureProposalAddress: featureProposalPk,
  70. acceptanceTokenAddress: acceptanceTokenAccountPk,
  71. feature: featureIdPk,
  72. systemProgram: SystemProgram.programId,
  73. clock: SYSVAR_CLOCK_PUBKEY,
  74. })
  75. .instruction();
  76. await sendAndConfirmTx([tallyIx], [kp]);
  77. }
  78. async function fetchFeatureProposal() {
  79. const featureProposal = await program.account.featureProposal.fetch(
  80. featureProposalPk
  81. );
  82. if (!featureProposal.expired) {
  83. throw new Error("Feature should be expired.");
  84. }
  85. }
  86. await test(propose);
  87. await test(tally);
  88. await test(fetchFeatureProposal);
  89. }