UNPKG

@dydxfoundation/governance

Version:
206 lines (205 loc) 14.1 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.deployPhase3 = void 0; const ethers_1 = require("ethers"); const utils_1 = require("ethers/lib/utils"); const lodash_1 = __importDefault(require("lodash")); const types_1 = require("../../types"); const MerkleDistributorV1__factory_1 = require("../../types/factories/MerkleDistributorV1__factory"); const StarkProxyV1__factory_1 = require("../../types/factories/StarkProxyV1__factory"); const deploy_config_1 = require("../deploy-config"); const get_deployer_address_1 = require("../deploy-config/get-deployer-address"); const logging_1 = require("../lib/logging"); const util_1 = require("../lib/util"); const types_2 = require("../types"); const deploy_upgradeable_1 = require("./helpers/deploy-upgradeable"); const expect_deployer_balance_1 = require("./helpers/expect-deployer-balance"); const transfer_tokens_1 = require("./helpers/transfer-tokens"); async function deployPhase3({ startStep = 0, // Phase 1 deployed contracts. dydxTokenAddress, governorAddress, shortTimelockAddress, longTimelockAddress, // Phase 2 deployed contracts. rewardsTreasuryAddress, rewardsTreasuryProxyAdminAddress, safetyModuleAddress, safetyModuleProxyAdminAddress, communityTreasuryAddress, communityTreasuryProxyAdminAddress, rewardsTreasuryVesterAddress, communityTreasuryVesterAddress, liquidityStakingAddress, liquidityStakingProxyAdminAddress, merkleDistributorAddress, merkleDistributorProxyAdminAddress, starkProxyAddresses, starkProxyProxyAdminAddresses, }) { (0, logging_1.log)('Beginning phase 3 deployment\n'); const deployConfig = (0, deploy_config_1.getDeployConfig)(); const deployer = await (0, get_deployer_address_1.getDeployerSigner)(); const deployerAddress = deployer.address; (0, logging_1.log)(`Beginning deployment with deployer ${deployerAddress}\n`); // Phase 1 deployed contracts. const dydxToken = new types_1.DydxToken__factory(deployer).attach(dydxTokenAddress); const governor = new types_1.DydxGovernor__factory(deployer).attach(governorAddress); const longTimelock = new types_1.Executor__factory(deployer).attach(longTimelockAddress); const shortTimelock = new types_1.Executor__factory(deployer).attach(shortTimelockAddress); // Phase 2 deployed contracts. const rewardsTreasury = new types_1.Treasury__factory(deployer).attach(rewardsTreasuryAddress); const rewardsTreasuryProxyAdmin = new types_1.ProxyAdmin__factory(deployer).attach(rewardsTreasuryProxyAdminAddress); const safetyModule = new types_1.SafetyModuleV11__factory(deployer).attach(safetyModuleAddress); const safetyModuleProxyAdmin = new types_1.ProxyAdmin__factory(deployer).attach(safetyModuleProxyAdminAddress); const communityTreasury = new types_1.Treasury__factory(deployer).attach(communityTreasuryAddress); const communityTreasuryProxyAdmin = new types_1.ProxyAdmin__factory(deployer).attach(communityTreasuryProxyAdminAddress); const liquidityStaking = new types_1.LiquidityStakingV1__factory(deployer).attach(liquidityStakingAddress); const liquidityStakingProxyAdmin = new types_1.ProxyAdmin__factory(deployer).attach(liquidityStakingProxyAdminAddress); const merkleDistributor = new MerkleDistributorV1__factory_1.MerkleDistributorV1__factory(deployer).attach(merkleDistributorAddress); const merkleDistributorProxyAdmin = new types_1.ProxyAdmin__factory(deployer).attach(merkleDistributorProxyAdminAddress); const starkProxies = starkProxyAddresses.map((s) => new StarkProxyV1__factory_1.StarkProxyV1__factory(deployer).attach(s)); const starkProxyProxyAdmins = starkProxyProxyAdminAddresses.map((s) => new types_1.ProxyAdmin__factory(deployer).attach(s)); const deployerBalance = await dydxToken.balanceOf(deployerAddress); if (deployerBalance.lt((0, util_1.toWad)(50000000))) { throw new Error(`Need at least 500M DYDX to run this deploy script. Current balance: ${(0, utils_1.formatEther)(deployerBalance)}`); } if (startStep <= 1) { (0, logging_1.log)('Step 1. Upgrade safety module'); await (0, deploy_upgradeable_1.upgradeContract)(types_1.SafetyModuleV11__factory, deployer, safetyModuleAddress, safetyModuleProxyAdmin, [ dydxTokenAddress, dydxTokenAddress, rewardsTreasuryAddress, deployConfig.SM_DISTRIBUTION_START, deployConfig.SM_DISTRIBUTION_END, ]); } if (startStep <= 2) { (0, logging_1.log)('Step 2. Add token allocation recipients to the transfer allowlist'); await (0, util_1.waitForTx)(await dydxToken.addToTokenTransferAllowlist([ deployConfig.TOKEN_ALLOCATIONS.DYDX_FOUNDATION.ADDRESS, deployConfig.TOKEN_ALLOCATIONS.DYDX_TRADING.ADDRESS, deployConfig.TOKEN_ALLOCATIONS.DYDX_LLC.ADDRESS, ])); } if (startStep <= 3) { (0, logging_1.log)('Step 3: Push back transfer restriction.'); await (0, util_1.waitForTx)(await dydxToken.updateTransfersRestrictedBefore(deployConfig.TRANSFERS_RESTRICTED_BEFORE)); } if (startStep <= 4) { (0, logging_1.log)('Step 4: Transfer stark proxy admin 0 ownership to short timelock'); await (0, util_1.waitForTx)(await starkProxyProxyAdmins[0].transferOwnership(shortTimelock.address)); } if (startStep <= 5) { (0, logging_1.log)('Step 5: Transfer stark proxy admin 1 ownership to short timelock'); await (0, util_1.waitForTx)(await starkProxyProxyAdmins[1].transferOwnership(shortTimelock.address)); } if (startStep <= 6) { (0, logging_1.log)('Step 6: Transfer stark proxy admin 2 ownership to short timelock'); await (0, util_1.waitForTx)(await starkProxyProxyAdmins[2].transferOwnership(shortTimelock.address)); } if (startStep <= 7) { (0, logging_1.log)('Step 6: Transfer stark proxy admin 3 ownership to short timelock'); await (0, util_1.waitForTx)(await starkProxyProxyAdmins[3].transferOwnership(shortTimelock.address)); } if (startStep <= 8) { (0, logging_1.log)('Step 8: Transfer stark proxy admin 4 ownership to short timelock'); await (0, util_1.waitForTx)(await starkProxyProxyAdmins[4].transferOwnership(shortTimelock.address)); } if (startStep <= 9) { (0, logging_1.log)('Step 9: Transfer rewards treasury proxy admin ownership to short timelock'); await (0, util_1.waitForTx)(await rewardsTreasuryProxyAdmin.transferOwnership(shortTimelock.address)); } if (startStep <= 10) { (0, logging_1.log)('Step 10: Transfer community treasury proxy admin ownership to short timelock'); await (0, util_1.waitForTx)(await communityTreasuryProxyAdmin.transferOwnership(shortTimelock.address)); } if (startStep <= 11) { (0, logging_1.log)('Step 11: Transfer merkle distributor proxy admin ownership to short timelock'); await (0, util_1.waitForTx)(await merkleDistributorProxyAdmin.transferOwnership(shortTimelock.address)); } if (startStep <= 12) { (0, logging_1.log)('Step 12: Transfer liquidity staking proxy admin ownership to short timelock'); await (0, util_1.waitForTx)(await liquidityStakingProxyAdmin.transferOwnership(shortTimelock.address)); } if (startStep <= 13) { (0, logging_1.log)('Step 13: Transfer safety module proxy admin ownership to long timelock'); await (0, util_1.waitForTx)(await safetyModuleProxyAdmin.transferOwnership(longTimelock.address)); } if (startStep <= 14) { (0, logging_1.log)('Step 14: Transfer ownership of community treasury to short timelock'); await (0, util_1.waitForTx)(await communityTreasury.transferOwnership(shortTimelock.address)); } if (startStep <= 15) { (0, logging_1.log)('Step 15. Revoke all roles from EOAs on StarkProxy and incentives contracts'); // Revoke roles from each Stark Proxy. const starkProxyTxs = lodash_1.default.flatten(await Promise.all(starkProxies.map(async (sp) => { return [ await sp.revokeRole((0, util_1.getRole)(types_2.Role.DELEGATION_ADMIN_ROLE), deployerAddress), await sp.revokeRole((0, util_1.getRole)(types_2.Role.OWNER_ROLE), deployerAddress), await sp.revokeRole((0, util_1.getRole)(types_2.Role.GUARDIAN_ROLE), deployerAddress), ]; }))); const txs = [ ...starkProxyTxs, // Revoke roles from the Merkle Distributor Module. await merkleDistributor.revokeRole((0, util_1.getRole)(types_2.Role.PAUSER_ROLE), deployerAddress), await merkleDistributor.revokeRole((0, util_1.getRole)(types_2.Role.UNPAUSER_ROLE), deployerAddress), await merkleDistributor.revokeRole((0, util_1.getRole)(types_2.Role.CLAIM_OPERATOR_ROLE), deployerAddress), await merkleDistributor.revokeRole((0, util_1.getRole)(types_2.Role.OWNER_ROLE), deployerAddress), // Revoke roles from the Liquidity Staking Module. await liquidityStaking.revokeRole((0, util_1.getRole)(types_2.Role.EPOCH_PARAMETERS_ROLE), deployerAddress), await liquidityStaking.revokeRole((0, util_1.getRole)(types_2.Role.REWARDS_RATE_ROLE), deployerAddress), await liquidityStaking.revokeRole((0, util_1.getRole)(types_2.Role.BORROWER_ADMIN_ROLE), deployerAddress), await liquidityStaking.revokeRole((0, util_1.getRole)(types_2.Role.OWNER_ROLE), deployerAddress), // Revoke roles from the Safety Module. await safetyModule.revokeRole((0, util_1.getRole)(types_2.Role.SLASHER_ROLE), deployerAddress), await safetyModule.revokeRole((0, util_1.getRole)(types_2.Role.EPOCH_PARAMETERS_ROLE), deployerAddress), await safetyModule.revokeRole((0, util_1.getRole)(types_2.Role.REWARDS_RATE_ROLE), deployerAddress), await safetyModule.revokeRole((0, util_1.getRole)(types_2.Role.OWNER_ROLE), deployerAddress), ]; await Promise.all(txs.map((tx) => (0, util_1.waitForTx)(tx))); } await (0, expect_deployer_balance_1.expectDeployerBalance)(dydxToken, ethers_1.BigNumber.from((0, util_1.toWad)(500000000)) .sub(deployConfig.REWARDS_TREASURY_FRONTLOADED_FUNDS) .add(deployConfig.TOKEN_ALLOCATIONS.DYDX_FOUNDATION.AMOUNT) .add(deployConfig.TOKEN_ALLOCATIONS.DYDX_LLC.AMOUNT) .add(deployConfig.TOKEN_ALLOCATIONS.DYDX_TRADING.AMOUNT)); if (startStep <= 16) { (0, logging_1.log)('Step 16. Send tokens to dYdX Trading Inc'); await (0, transfer_tokens_1.transferWithPrompt)(dydxToken, deployConfig.TOKEN_ALLOCATIONS.DYDX_TRADING.ADDRESS, deployConfig.TOKEN_ALLOCATIONS.DYDX_TRADING.AMOUNT); } await (0, expect_deployer_balance_1.expectDeployerBalance)(dydxToken, ethers_1.BigNumber.from((0, util_1.toWad)(500000000)) .sub(deployConfig.REWARDS_TREASURY_FRONTLOADED_FUNDS) .add(deployConfig.TOKEN_ALLOCATIONS.DYDX_FOUNDATION.AMOUNT) .add(deployConfig.TOKEN_ALLOCATIONS.DYDX_LLC.AMOUNT)); if (startStep <= 17) { (0, logging_1.log)('Step 17. Send tokens to dYdX LLC'); await (0, transfer_tokens_1.transferWithPrompt)(dydxToken, deployConfig.TOKEN_ALLOCATIONS.DYDX_LLC.ADDRESS, deployConfig.TOKEN_ALLOCATIONS.DYDX_LLC.AMOUNT); } await (0, expect_deployer_balance_1.expectDeployerBalance)(dydxToken, ethers_1.BigNumber.from((0, util_1.toWad)(500000000)) .sub(deployConfig.REWARDS_TREASURY_FRONTLOADED_FUNDS) .add(deployConfig.TOKEN_ALLOCATIONS.DYDX_FOUNDATION.AMOUNT)); if (startStep <= 18) { (0, logging_1.log)('Step 18. Send tokens to dYdX Foundation'); await (0, transfer_tokens_1.transferWithPrompt)(dydxToken, deployConfig.TOKEN_ALLOCATIONS.DYDX_FOUNDATION.ADDRESS, deployConfig.TOKEN_ALLOCATIONS.DYDX_FOUNDATION.AMOUNT); } if (startStep <= 19) { (0, logging_1.log)('Step 19: Transfer ownership of rewards treasury to short timelock'); await (0, util_1.waitForTx)(await rewardsTreasury.transferOwnership(shortTimelock.address)); } await (0, expect_deployer_balance_1.expectDeployerBalance)(dydxToken, ethers_1.BigNumber.from((0, util_1.toWad)(500000000)) .sub(deployConfig.REWARDS_TREASURY_FRONTLOADED_FUNDS)); if (startStep <= 20) { (0, logging_1.log)('Step 20. Send tokens to be locked up in the rewards treasury vester'); await (0, transfer_tokens_1.transferWithPrompt)(dydxToken, rewardsTreasuryVesterAddress, deployConfig.REWARDS_TREASURY_VESTER_CONFIG.VESTING_AMOUNT); } await (0, expect_deployer_balance_1.expectDeployerBalance)(dydxToken, ethers_1.BigNumber.from((0, util_1.toWad)(500000000)) .sub(deployConfig.REWARDS_TREASURY_FRONTLOADED_FUNDS) .sub(deployConfig.REWARDS_TREASURY_VESTER_CONFIG.VESTING_AMOUNT)); if (startStep <= 21) { (0, logging_1.log)('Step 21. Send tokens to be locked up in the community treasury vester'); await (0, transfer_tokens_1.transferWithPrompt)(dydxToken, communityTreasuryVesterAddress, deployConfig.COMMUNITY_TREASURY_VESTER_CONFIG.VESTING_AMOUNT); } if (startStep <= 22) { (0, logging_1.log)('Step 22. Revoke all roles from EOAs on the Governor contract'); const txs = [ // Revoke roles from the Governor. await governor.grantRole((0, util_1.getRole)(types_2.Role.ADD_EXECUTOR_ROLE), shortTimelock.address), await governor.grantRole((0, util_1.getRole)(types_2.Role.OWNER_ROLE), longTimelock.address), ]; await Promise.all(txs.map((tx) => (0, util_1.waitForTx)(tx))); } if (startStep <= 23) { (0, logging_1.log)('Step 23: Transfer DYDX token contract ownership to the short timelock'); await (0, util_1.waitForTx)(await dydxToken.transferOwnership(shortTimelock.address)); } (0, logging_1.log)('\n=== PHASE 3 DEPLOYMENT COMPLETE ===\n'); } exports.deployPhase3 = deployPhase3;