stake.js 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  1. const anchor = require("@project-serum/anchor");
  2. const serumCmn = require("@project-serum/common");
  3. const TokenInstructions = require("@project-serum/serum").TokenInstructions;
  4. const utils = require("../../deps/stake/tests/utils");
  5. const lockup = anchor.workspace.Lockup;
  6. const registry = anchor.workspace.Registry;
  7. const provider = anchor.Provider.env();
  8. let lockupAddress = null;
  9. let mint = null;
  10. let god = null;
  11. let registrarAccount = null;
  12. let registrarSigner = null;
  13. let nonce = null;
  14. let poolMint = null;
  15. const registrar = new anchor.web3.Account();
  16. const rewardQ = new anchor.web3.Account();
  17. const withdrawalTimelock = new anchor.BN(4);
  18. const stakeRate = new anchor.BN(2);
  19. const rewardQLen = 170;
  20. let member = null;
  21. let memberAccount = null;
  22. let memberSigner = null;
  23. let balances = null;
  24. let balancesLocked = null;
  25. const WHITELIST_SIZE = 10;
  26. async function setupStakePool(mint, god) {
  27. // Registry genesis.
  28. const [_registrarSigner, _nonce] =
  29. await anchor.web3.PublicKey.findProgramAddress(
  30. [registrar.publicKey.toBuffer()],
  31. registry.programId
  32. );
  33. registrarSigner = _registrarSigner;
  34. nonce = _nonce;
  35. poolMint = await serumCmn.createMint(provider, registrarSigner);
  36. try {
  37. // Init registry.
  38. await registry.state.rpc.new({
  39. accounts: { lockupProgram: lockup.programId },
  40. });
  41. // Init lockup.
  42. await lockup.state.rpc.new({
  43. accounts: {
  44. authority: provider.wallet.publicKey,
  45. },
  46. });
  47. } catch (err) {
  48. // Skip errors for convenience when developing locally,
  49. // since the state constructors can only be called once.
  50. }
  51. // Initialize stake pool.
  52. await registry.rpc.initialize(
  53. mint,
  54. provider.wallet.publicKey,
  55. nonce,
  56. withdrawalTimelock,
  57. stakeRate,
  58. rewardQLen,
  59. {
  60. accounts: {
  61. registrar: registrar.publicKey,
  62. poolMint,
  63. rewardEventQ: rewardQ.publicKey,
  64. rent: anchor.web3.SYSVAR_RENT_PUBKEY,
  65. },
  66. signers: [registrar, rewardQ],
  67. instructions: [
  68. await registry.account.registrar.createInstruction(registrar),
  69. await registry.account.rewardQueue.createInstruction(rewardQ, 8250),
  70. ],
  71. }
  72. );
  73. registrarAccount = await registry.account.registrar.fetch(
  74. registrar.publicKey
  75. );
  76. console.log("Registrar", registrar.publicKey.toString());
  77. console.log("Wallet", registry.provider.wallet.publicKey.toString());
  78. // Create account for staker.
  79. const seed = anchor.utils.sha256
  80. .hash(`${registrar.publicKey.toString()}:Member`)
  81. .slice(0, 32);
  82. member = await anchor.web3.PublicKey.createWithSeed(
  83. registry.provider.wallet.publicKey,
  84. seed,
  85. registry.programId
  86. );
  87. const [_memberSigner, nonce2] =
  88. await anchor.web3.PublicKey.findProgramAddress(
  89. [registrar.publicKey.toBuffer(), member.toBuffer()],
  90. registry.programId
  91. );
  92. memberSigner = _memberSigner;
  93. const [mainTx, _balances] = await utils.createBalanceSandbox(
  94. provider,
  95. registrarAccount,
  96. memberSigner
  97. );
  98. const [lockedTx, _balancesLocked] = await utils.createBalanceSandbox(
  99. provider,
  100. registrarAccount,
  101. memberSigner
  102. );
  103. balances = _balances;
  104. balancesLocked = _balancesLocked;
  105. const tx = registry.transaction.createMember(nonce2, {
  106. accounts: {
  107. registrar: registrar.publicKey,
  108. member: member,
  109. beneficiary: provider.wallet.publicKey,
  110. memberSigner,
  111. balances,
  112. balancesLocked,
  113. tokenProgram: TokenInstructions.TOKEN_PROGRAM_ID,
  114. rent: anchor.web3.SYSVAR_RENT_PUBKEY,
  115. },
  116. instructions: [
  117. anchor.web3.SystemProgram.createAccountWithSeed({
  118. fromPubkey: registry.provider.wallet.publicKey,
  119. newAccountPubkey: member,
  120. basePubkey: registry.provider.wallet.publicKey,
  121. seed,
  122. lamports:
  123. await registry.provider.connection.getMinimumBalanceForRentExemption(
  124. registry.account.member.size
  125. ),
  126. space: registry.account.member.size,
  127. programId: registry.programId,
  128. }),
  129. ],
  130. });
  131. const signers = [provider.wallet.payer];
  132. const allTxs = [mainTx, lockedTx, { tx, signers }];
  133. await provider.sendAll(allTxs);
  134. memberAccount = await registry.account.member.fetch(member);
  135. // Deposit into stake program.
  136. const depositAmount = new anchor.BN(120);
  137. await registry.rpc.deposit(depositAmount, {
  138. accounts: {
  139. depositor: god,
  140. depositorAuthority: provider.wallet.publicKey,
  141. tokenProgram: TokenInstructions.TOKEN_PROGRAM_ID,
  142. vault: memberAccount.balances.vault,
  143. beneficiary: provider.wallet.publicKey,
  144. member: member,
  145. },
  146. });
  147. // Stake.
  148. const stakeAmount = new anchor.BN(10);
  149. await registry.rpc.stake(stakeAmount, false, {
  150. accounts: {
  151. // Stake instance.
  152. registrar: registrar.publicKey,
  153. rewardEventQ: rewardQ.publicKey,
  154. poolMint,
  155. // Member.
  156. member: member,
  157. beneficiary: provider.wallet.publicKey,
  158. balances,
  159. balancesLocked,
  160. // Program signers.
  161. memberSigner,
  162. registrarSigner,
  163. // Misc.
  164. clock: anchor.web3.SYSVAR_CLOCK_PUBKEY,
  165. tokenProgram: TokenInstructions.TOKEN_PROGRAM_ID,
  166. },
  167. });
  168. }
  169. module.exports = {
  170. setupStakePool,
  171. };