| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177 | // deploy.js is a simple deploy script to initialize a program. This is run// immediately after a deploy.const serumCmn = require("@project-serum/common");const anchor = require("@coral-xyz/anchor");const PublicKey = anchor.web3.PublicKey;module.exports = async function (provider) {  // Configure client to use the provider.  anchor.setProvider(provider);  // Setup genesis state.  const registrarConfigs = await genesis(provider);  // Program clients.  const lockup = anchor.workspace.Lockup;  const registry = anchor.workspace.Registry;  // Registry state constructor.  await registry.state.rpc.new({    accounts: {      lockupProgram: lockup.programId,    },  });  // Lockup state constructor.  await lockup.state.rpc.new({    accounts: {      authority: provider.wallet.publicKey,    },  });  // Delete the default whitelist entries.  const defaultEntry = { programId: new anchor.web3.PublicKey.default() };  await lockup.state.rpc.whitelistDelete(defaultEntry, {    accounts: {      authority: provider.wallet.publicKey,    },  });  // Whitelist the registry.  await lockup.state.rpc.whitelistAdd(    { programId: registry.programId },    {      accounts: {        authority: provider.wallet.publicKey,      },    }  );  // Initialize all registrars.  const cfgKeys = Object.keys(registrarConfigs);  for (let k = 0; k < cfgKeys.length; k += 1) {    let r = registrarConfigs[cfgKeys[k]];    const registrar = await registrarInit(      registry,      r.withdrawalTimelock,      r.stakeRate,      r.rewardQLen,      new anchor.web3.PublicKey(r.mint)    );    r["registrar"] = registrar.toString();  }  // Generate code for whitelisting on UIs.  const code = generateCode(registry, lockup, registrarConfigs);  console.log("Generated whitelisted UI addresses:", code);};function generateCode(registry, lockup, registrarConfigs) {  const registrars = Object.keys(registrarConfigs)    .map((cfg) => `${cfg}: new PublicKey('${registrarConfigs[cfg].registrar}')`)    .join(",");  const mints = Object.keys(registrarConfigs)    .map((cfg) => `${cfg}: new PublicKey('${registrarConfigs[cfg].mint}')`)    .join(",");  return `{registryProgramId: new PublicKey('${registry.programId}'),lockupProgramId: new PublicKey('${lockup.programId}'),registrars: { ${registrars} },mints: { ${mints} }, }`;}async function genesis(provider) {  if (    provider.connection._rpcEndpoint === "https://api.mainnet-beta.solana.com"  ) {    return {      srm: {        withdrawalTimelock: 60 * 60 * 24 * 7, // 1 week.        stakeRate: 500 * 10 ** 6, // 500 SRM.        rewardQLen: 150,        mint: "SRMuApVNdxXokk5GT7XD5cUUgXMBCoAz2LHeuAoKWRt",      },      msrm: {        withdrawalTimelock: 60 * 60 * 24 * 7, // 1 week.        stakeRate: 1,        rewardQLen: 150,        mint: "MSRMcoVyrFxnSgo5uXwone5SKcGhT1KEJMFEkMEWf9L",      },    };  } else {    const [token1Mint, _god1] = await serumCmn.createMintAndVault(      provider,      new anchor.BN(10000000000000),      undefined,      6    );    const [token2Mint, _god2] = await serumCmn.createMintAndVault(      provider,      new anchor.BN(10000000000),      undefined,      0    );    return {      token1: {        withdrawalTimelock: 60 * 60 * 24 * 7,        stakeRate: 1000 * 10 ** 6,        rewardQLen: 150,        mint: token1Mint.toString(),      },      token2: {        withdrawalTimelock: 60 * 60 * 24 * 7,        stakeRate: 1,        rewardQLen: 150,        mint: token2Mint.toString(),      },    };  }}async function registrarInit(  registry,  _withdrawalTimelock,  _stakeRate,  rewardQLen,  mint) {  const registrar = anchor.web3.Keypair.generate();  const rewardQ = anchor.web3.Keypair.generate();  const withdrawalTimelock = new anchor.BN(_withdrawalTimelock);  const stakeRate = new anchor.BN(_stakeRate);  const [registrarSigner, nonce] =    await anchor.web3.PublicKey.findProgramAddress(      [registrar.publicKey.toBuffer()],      registry.programId    );  const poolMint = await serumCmn.createMint(    registry.provider,    registrarSigner  );  await registry.rpc.initialize(    mint,    registry.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),      ],    }  );  return registrar.publicKey;}
 |