@vechain/vebetterdao-contracts
Version:
Open-source repository that houses the smart contracts powering the decentralized VeBetterDAO on the VeChain Thor blockchain.
273 lines (272 loc) • 13 kB
JavaScript
import { ethers } from "hardhat";
import { deployUpgradeableWithoutInitialization, initializeProxyAllVersions } from "../../helpers";
var TokenLevelId;
(function (TokenLevelId) {
// Extend legacy strengthLevel enum
TokenLevelId[TokenLevelId["None"] = 0] = "None";
TokenLevelId[TokenLevelId["Strength"] = 1] = "Strength";
TokenLevelId[TokenLevelId["Thunder"] = 2] = "Thunder";
TokenLevelId[TokenLevelId["Mjolnir"] = 3] = "Mjolnir";
TokenLevelId[TokenLevelId["VeThorX"] = 4] = "VeThorX";
TokenLevelId[TokenLevelId["StrengthX"] = 5] = "StrengthX";
TokenLevelId[TokenLevelId["ThunderX"] = 6] = "ThunderX";
TokenLevelId[TokenLevelId["MjolnirX"] = 7] = "MjolnirX";
TokenLevelId[TokenLevelId["Dawn"] = 8] = "Dawn";
TokenLevelId[TokenLevelId["Lightning"] = 9] = "Lightning";
TokenLevelId[TokenLevelId["Flash"] = 10] = "Flash";
})(TokenLevelId || (TokenLevelId = {}));
export const deployStargateMock = async ({ logOutput = false, legacyNodesContractAddress, vthoTokenAddress, }) => {
const deployer = (await ethers.getSigners())[0];
// const deploy a mocked protocol staker contract
const ProtocolStakerMock = await ethers.getContractFactory("ProtocolStakerMock");
const protocolStakerMock = await ProtocolStakerMock.deploy();
await protocolStakerMock.waitForDeployment();
const protocolStakerMockAddress = await protocolStakerMock.getAddress();
logOutput && console.log("ProtocolStakerMock deployed at: ", protocolStakerMockAddress);
// Deploys the latest implementation of the contracts
const { StargateNFTClockLib, StargateNFTLevelsLib, StargateNFTMintingLib, StargateNFTSettingsLib, StargateNFTTokenLib, StargateNFTTokenManagerLib, } = await deployStargateNFTLibraries({ logOutput });
const stargateNFTProxyAddress = await deployUpgradeableWithoutInitialization("StargateNFT", {
Clock: await StargateNFTClockLib.getAddress(),
Levels: await StargateNFTLevelsLib.getAddress(),
MintingLogic: await StargateNFTMintingLib.getAddress(),
Settings: await StargateNFTSettingsLib.getAddress(),
Token: await StargateNFTTokenLib.getAddress(),
TokenManager: await StargateNFTTokenManagerLib.getAddress(),
}, false);
logOutput && console.log("StargateNFT proxy deployed at: ", stargateNFTProxyAddress);
const stargateProxyAddress = await deployUpgradeableWithoutInitialization("Stargate", {
Clock: await StargateNFTClockLib.getAddress(),
}, false);
logOutput && console.log("Stargate proxy deployed at: ", stargateProxyAddress);
const stargateNFT = (await initializeProxyAllVersions("StargateNFT", stargateNFTProxyAddress, [
{
args: [
{
tokenCollectionName: "StarGate Delegator Token",
tokenCollectionSymbol: "SDT",
baseTokenURI: "ipfs://bafybeibmpgruasnoqgyemcprpkygtelvxl3b5d2bf5aqqciw6dds33yw7y/metadata/",
admin: deployer.address,
upgrader: deployer.address,
pauser: deployer.address,
levelOperator: deployer.address,
legacyNodes: legacyNodesContractAddress ?? deployer.address, // We set a random address since we do not care about the legacy ndodes on B3TR
stargateDelegation: deployer.address, // We set a random address here as well since we do not care
vthoToken: vthoTokenAddress ?? "0x0000000000000000000000000000456E65726779", // address of solo, testnet and mainnet
legacyLastTokenId: 1000,
levelsAndSupplies: [
// Legacy normal levels
{
level: {
id: TokenLevelId.Strength,
name: "Strength",
isX: false,
vetAmountRequiredToStake: ethers.parseEther("100"),
scaledRewardFactor: 150,
maturityBlocks: 10,
},
cap: 2499, // 2500 - 1
circulatingSupply: 0,
},
{
level: {
id: TokenLevelId.Thunder,
name: "Thunder",
isX: false,
vetAmountRequiredToStake: ethers.parseEther("500"),
scaledRewardFactor: 250,
maturityBlocks: 20,
},
cap: 298, // 300 - (1 + 1 Strength upgrading)
circulatingSupply: 0,
},
{
level: {
id: TokenLevelId.Mjolnir,
name: "Mjolnir",
isX: false,
vetAmountRequiredToStake: ethers.parseEther("1500"),
scaledRewardFactor: 350,
// change this to 300 for boost tests
maturityBlocks: 300,
},
cap: 99, // 100 - 1
circulatingSupply: 0,
},
// Legacy X Levels
{
level: {
id: TokenLevelId.VeThorX,
name: "VeThorX",
isX: true,
vetAmountRequiredToStake: ethers.parseEther("60"),
scaledRewardFactor: 200,
maturityBlocks: 0,
},
cap: 100, // 1
circulatingSupply: 0,
},
{
level: {
id: TokenLevelId.StrengthX,
name: "StrengthX",
isX: true,
vetAmountRequiredToStake: ethers.parseEther("160"),
scaledRewardFactor: 300,
maturityBlocks: 0,
},
cap: 100, // 1
circulatingSupply: 0,
},
{
level: {
id: TokenLevelId.ThunderX,
name: "ThunderX",
isX: true,
vetAmountRequiredToStake: ethers.parseEther("560"),
scaledRewardFactor: 400,
maturityBlocks: 0,
},
cap: 100, // No ThunderX
circulatingSupply: 0,
},
{
level: {
id: TokenLevelId.MjolnirX,
name: "MjolnirX",
isX: true,
vetAmountRequiredToStake: ethers.parseEther("1560"),
scaledRewardFactor: 500,
maturityBlocks: 0,
},
cap: 100, // 1
circulatingSupply: 0,
},
// New levels
{
level: {
id: TokenLevelId.Dawn,
name: "Dawn",
isX: false,
vetAmountRequiredToStake: ethers.parseEther("1"),
scaledRewardFactor: 100,
maturityBlocks: 5,
},
cap: 500000,
circulatingSupply: 0,
},
{
level: {
id: TokenLevelId.Lightning,
name: "Lightning",
isX: false,
vetAmountRequiredToStake: ethers.parseEther("5"),
scaledRewardFactor: 115,
maturityBlocks: 10,
},
cap: 100000,
circulatingSupply: 0,
},
{
level: {
id: TokenLevelId.Flash,
name: "Flash",
isX: false,
vetAmountRequiredToStake: ethers.parseEther("20"),
scaledRewardFactor: 130,
maturityBlocks: 15,
},
cap: 25000,
circulatingSupply: 0,
},
],
},
],
}, // V1
{
args: [[]],
version: 2,
},
{
args: [
stargateProxyAddress,
[
TokenLevelId.Dawn,
TokenLevelId.Lightning,
TokenLevelId.Flash,
TokenLevelId.Strength,
TokenLevelId.Thunder,
TokenLevelId.Mjolnir,
],
[
539351851851852n,
2870370370370370n,
12523148148148100n,
75925925925925900n,
530092592592593000n,
1995370370370370000n,
],
],
version: 3,
},
], false));
logOutput && console.log("StargateNFT initialized");
const stargate = (await initializeProxyAllVersions("Stargate", stargateProxyAddress, [
{
args: [
{
admin: deployer.address,
protocolStakerContract: protocolStakerMockAddress,
stargateNFTContract: stargateNFTProxyAddress,
legacyNodesContract: legacyNodesContractAddress ?? deployer.address, // We do not care about the legacy nodes on B3TR
maxClaimablePeriods: 832,
},
],
},
], false));
logOutput && console.log("Stargate initialized");
return {
stargateNFT,
stargate,
};
};
async function deployStargateNFTLibraries({ logOutput = false }) {
// ------------------- LATEST VERSION ------------------- //
// Deploy Clock Library
const Clock = await ethers.getContractFactory("Clock");
const StargateNFTClockLib = (await Clock.deploy());
await StargateNFTClockLib.waitForDeployment();
logOutput && console.log("Clock Library deployed");
// Deploy Levels Library
const Levels = await ethers.getContractFactory("Levels");
const StargateNFTLevelsLib = (await Levels.deploy());
await StargateNFTLevelsLib.waitForDeployment();
logOutput && console.log("Levels Library deployed");
// Deploy MintingLogic Library
const MintingLogic = await ethers.getContractFactory("MintingLogic");
const StargateNFTMintingLib = (await MintingLogic.deploy());
await StargateNFTMintingLib.waitForDeployment();
logOutput && console.log("MintingLogic Library deployed");
// Deploy Settings Library
const Settings = await ethers.getContractFactory("Settings");
const StargateNFTSettingsLib = (await Settings.deploy());
await StargateNFTSettingsLib.waitForDeployment();
logOutput && console.log("Settings Library deployed");
// Deploy Token Library
const Token = await ethers.getContractFactory("Token");
const StargateNFTTokenLib = (await Token.deploy());
await StargateNFTTokenLib.waitForDeployment();
logOutput && console.log("Token Library deployed");
// Deploy TokenManager Library
const TokenManager = await ethers.getContractFactory("TokenManager");
const StargateNFTTokenManagerLib = (await TokenManager.deploy());
await StargateNFTTokenManagerLib.waitForDeployment();
logOutput && console.log("TokenManager Library deployed");
return {
StargateNFTClockLib,
StargateNFTLevelsLib,
StargateNFTMintingLib,
StargateNFTSettingsLib,
StargateNFTTokenLib,
StargateNFTTokenManagerLib,
};
}