| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184 | const anchor = require("@project-serum/anchor");const serumCmn = require("@project-serum/common");const TokenInstructions = require("@project-serum/serum").TokenInstructions;const utils = require("../../deps/stake/tests/utils");const lockup = anchor.workspace.Lockup;const registry = anchor.workspace.Registry;const provider = anchor.Provider.env();let lockupAddress = null;let mint = null;let god = null;let registrarAccount = null;let registrarSigner = null;let nonce = null;let poolMint = null;const registrar = new anchor.web3.Account();const rewardQ = new anchor.web3.Account();const withdrawalTimelock = new anchor.BN(4);const stakeRate = new anchor.BN(2);const rewardQLen = 170;let member = null;let memberAccount = null;let memberSigner = null;let balances = null;let balancesLocked = null;const WHITELIST_SIZE = 10;async function setupStakePool(mint, god) {  // Registry genesis.  const [_registrarSigner, _nonce] =    await anchor.web3.PublicKey.findProgramAddress(      [registrar.publicKey.toBuffer()],      registry.programId    );  registrarSigner = _registrarSigner;  nonce = _nonce;  poolMint = await serumCmn.createMint(provider, registrarSigner);  try {    // Init registry.    await registry.state.rpc.new({      accounts: { lockupProgram: lockup.programId },    });    // Init lockup.    await lockup.state.rpc.new({      accounts: {        authority: provider.wallet.publicKey,      },    });  } catch (err) {    // Skip errors for convenience when developing locally,    // since the state constructors can only be called once.  }  // Initialize stake pool.  await registry.rpc.initialize(    mint,    provider.wallet.publicKey,    nonce,    withdrawalTimelock,    stakeRate,    rewardQLen,    {      accounts: {        registrar: registrar.publicKey,        poolMint,        rewardEventQ: rewardQ.publicKey,        rent: anchor.web3.SYSVAR_RENT_PUBKEY,      },      signers: [registrar, rewardQ],      instructions: [        await registry.account.registrar.createInstruction(registrar),        await registry.account.rewardQueue.createInstruction(rewardQ, 8250),      ],    }  );  registrarAccount = await registry.account.registrar.fetch(    registrar.publicKey  );  console.log("Registrar", registrar.publicKey.toString());  console.log("Wallet", registry.provider.wallet.publicKey.toString());  // Create account for staker.  const seed = anchor.utils.sha256    .hash(`${registrar.publicKey.toString()}:Member`)    .slice(0, 32);  member = await anchor.web3.PublicKey.createWithSeed(    registry.provider.wallet.publicKey,    seed,    registry.programId  );  const [_memberSigner, nonce2] =    await anchor.web3.PublicKey.findProgramAddress(      [registrar.publicKey.toBuffer(), member.toBuffer()],      registry.programId    );  memberSigner = _memberSigner;  const [mainTx, _balances] = await utils.createBalanceSandbox(    provider,    registrarAccount,    memberSigner  );  const [lockedTx, _balancesLocked] = await utils.createBalanceSandbox(    provider,    registrarAccount,    memberSigner  );  balances = _balances;  balancesLocked = _balancesLocked;  const tx = registry.transaction.createMember(nonce2, {    accounts: {      registrar: registrar.publicKey,      member: member,      beneficiary: provider.wallet.publicKey,      memberSigner,      balances,      balancesLocked,      tokenProgram: TokenInstructions.TOKEN_PROGRAM_ID,      rent: anchor.web3.SYSVAR_RENT_PUBKEY,    },    instructions: [      anchor.web3.SystemProgram.createAccountWithSeed({        fromPubkey: registry.provider.wallet.publicKey,        newAccountPubkey: member,        basePubkey: registry.provider.wallet.publicKey,        seed,        lamports:          await registry.provider.connection.getMinimumBalanceForRentExemption(            registry.account.member.size          ),        space: registry.account.member.size,        programId: registry.programId,      }),    ],  });  const signers = [provider.wallet.payer];  const allTxs = [mainTx, lockedTx, { tx, signers }];  await provider.sendAll(allTxs);  memberAccount = await registry.account.member.fetch(member);  // Deposit into stake program.  const depositAmount = new anchor.BN(120);  await registry.rpc.deposit(depositAmount, {    accounts: {      depositor: god,      depositorAuthority: provider.wallet.publicKey,      tokenProgram: TokenInstructions.TOKEN_PROGRAM_ID,      vault: memberAccount.balances.vault,      beneficiary: provider.wallet.publicKey,      member: member,    },  });  // Stake.  const stakeAmount = new anchor.BN(10);  await registry.rpc.stake(stakeAmount, false, {    accounts: {      // Stake instance.      registrar: registrar.publicKey,      rewardEventQ: rewardQ.publicKey,      poolMint,      // Member.      member: member,      beneficiary: provider.wallet.publicKey,      balances,      balancesLocked,      // Program signers.      memberSigner,      registrarSigner,      // Misc.      clock: anchor.web3.SYSVAR_CLOCK_PUBKEY,      tokenProgram: TokenInstructions.TOKEN_PROGRAM_ID,    },  });}module.exports = {  setupStakePool,};
 |