@dydxfoundation/governance
Version:
dYdX governance smart contracts
206 lines (205 loc) • 14.1 kB
JavaScript
;
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;