@dydxfoundation/governance
Version:
dYdX governance smart contracts
105 lines (104 loc) • 5.82 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.executeStarkProxyUpgradeNoProposal = exports.executeStarkProxyUpgradeViaProposal = void 0;
const bignumber_js_1 = __importDefault(require("bignumber.js"));
const utils_1 = require("ethers/lib/utils");
const config_1 = __importDefault(require("../../src/config"));
const deploy_config_1 = require("../../src/deploy-config");
const get_deployer_address_1 = require("../../src/deploy-config/get-deployer-address");
const logging_1 = require("../../src/lib/logging");
const util_1 = require("../../src/lib/util");
const impersonate_account_1 = require("../../src/migrations/helpers/impersonate-account");
const stark_proxy_fix_proposal_1 = require("../../src/migrations/stark-proxy-fix-proposal");
const types_1 = require("../../types");
const evm_1 = require("../helpers/evm");
const MOCK_PROPOSAL_IPFS_HASH = ('0x0000000000000000000000000000000000000000000000000000000000000000');
async function executeStarkProxyUpgradeViaProposal({ dydxTokenAddress, governorAddress, shortTimelockAddress, starkProxyAddresses, starkProxyProxyAdminAddresses, starkProxyNewImplAddress, }) {
if (starkProxyAddresses.length !== starkProxyProxyAdminAddresses.length) {
throw new Error('Expected starkProxyAddresses and starkProxyProxyAdminAddresses to have same length.');
}
const deployConfig = (0, deploy_config_1.getDeployConfig)();
const deployer = await (0, get_deployer_address_1.getDeployerSigner)();
const dydxToken = new types_1.DydxToken__factory(deployer).attach(dydxTokenAddress);
const governor = new types_1.DydxGovernor__factory(deployer).attach(governorAddress);
// Pick a voter with enough tokens to meet the quorum requirement.
const voterAddress = deployConfig.TOKEN_ALLOCATIONS.DYDX_TRADING.ADDRESS;
const voter = await (0, impersonate_account_1.impersonateAndFundAccount)(voterAddress);
const voterBalance = await dydxToken.balanceOf(voterAddress);
if (voterBalance.lt(new bignumber_js_1.default('2e25').toFixed())) {
throw new Error('Not enough votes to pass the proposal.');
}
// Vote on an existing proposal (can be used with mainnet forking).
let proposalId;
if (config_1.default.SP_FIX_PROPOSAL_ID !== null) {
proposalId = config_1.default.SP_FIX_PROPOSAL_ID;
}
else {
(0, logging_1.log)('Creating proposal for stark proxy fix');
({ proposalId } = await (0, stark_proxy_fix_proposal_1.createStarkProxyFixProposal)({
proposalIpfsHashHex: MOCK_PROPOSAL_IPFS_HASH,
governorAddress,
shortTimelockAddress,
starkProxyAddresses,
starkProxyProxyAdminAddresses,
starkProxyNewImplAddress,
signer: voter,
}));
(0, logging_1.log)('Waiting for voting to begin');
for (let i = 0; i < deployConfig.VOTING_DELAY_BLOCKS + 1; i++) {
if (i > 0 && i % 2000 === 0) {
(0, logging_1.log)('mining', i);
}
await (0, evm_1.advanceBlock)();
}
}
let proposalState = await governor.getProposalState(proposalId);
if (proposalState !== 2) {
throw new Error('Expected proposal to be in the voting phase.');
}
(0, logging_1.log)('Submitting vote');
await (0, util_1.waitForTx)(await governor.connect(voter).submitVote(proposalId, true));
(0, logging_1.log)('Waiting for voting to end');
let minedCount = 0;
for (;;) {
for (let i = 0; i < 2000; i++) {
await (0, evm_1.advanceBlock)();
minedCount++;
}
(0, logging_1.log)('mining', minedCount);
proposalState = await governor.getProposalState(proposalId);
if (proposalState !== 2) {
break;
}
}
if (proposalState !== 4) {
throw new Error(`Expected proposal to have succeeded but state was ${proposalState}`);
}
(0, logging_1.log)('Queueing the proposal');
await (0, util_1.waitForTx)(await governor.queue(proposalId));
const delaySeconds = deployConfig.SHORT_TIMELOCK_CONFIG.DELAY;
await (0, evm_1.increaseTimeAndMine)(delaySeconds);
(0, logging_1.log)('Executing the proposal');
await (0, util_1.waitForTx)(await governor.execute(proposalId));
(0, logging_1.log)('Proposal executed');
(0, logging_1.log)('\n=== STARK PROXY FIX COMPLETE ===\n');
}
exports.executeStarkProxyUpgradeViaProposal = executeStarkProxyUpgradeViaProposal;
async function executeStarkProxyUpgradeNoProposal({ shortTimelockAddress, starkProxyAddresses, starkProxyProxyAdminAddresses, starkProxyNewImplAddress, }) {
if (starkProxyAddresses.length !== starkProxyProxyAdminAddresses.length) {
throw new Error('Expected starkProxyAddresses and starkProxyProxyAdminAddresses to have same length.');
}
const mockShortTimelock = await (0, impersonate_account_1.impersonateAndFundAccount)(shortTimelockAddress);
for (let i = 0; i < starkProxyAddresses.length; i++) {
const starkProxyAddress = starkProxyAddresses[i];
const proxyAdminAddress = starkProxyProxyAdminAddresses[i];
const starkProxyProxyAdmin = new types_1.ProxyAdmin__factory(mockShortTimelock).attach(proxyAdminAddress);
const initializeCalldata = new utils_1.Interface(types_1.StarkProxyV2__factory.abi).encodeFunctionData('initialize', []);
await (0, util_1.waitForTx)(await starkProxyProxyAdmin.upgradeAndCall(starkProxyAddress, starkProxyNewImplAddress, initializeCalldata));
}
(0, logging_1.log)('\n=== STARK PROXY FIX COMPLETE ===\n');
}
exports.executeStarkProxyUpgradeNoProposal = executeStarkProxyUpgradeNoProposal;