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;
- }
|