anchor/tests/lockup/migrations/deploy.js

178 lines
4.6 KiB
JavaScript

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