UNPKG

@dydxfoundation/governance

Version:
143 lines (142 loc) 7.15 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const chai_1 = require("chai"); const lodash_1 = __importDefault(require("lodash")); const config_1 = __importDefault(require("../../src/config")); const affected_stakers_1 = require("../../src/lib/affected-stakers"); const constants_1 = require("../../src/lib/constants"); const util_1 = require("../../src/lib/util"); const types_1 = require("../../src/types"); const describe_contract_1 = require("../helpers/describe-contract"); const get_affected_stakers_for_test_1 = require("../helpers/get-affected-stakers-for-test"); let testStakers; function init() { testStakers = (0, get_affected_stakers_for_test_1.getAffectedStakersForTest)(); } (0, describe_contract_1.describeContractHardhatRevertBeforeEach)('SafetyModuleV2 initial emitted events', init, (ctx) => { it('Events that were not emitted', async () => { const eventNames = [ 'Approval', 'ClaimedRewards', 'DelegateChanged', 'OperatorClaimedRewardsFor', 'OperatorWithdrawalRequestedFor', 'OperatorWithdrewStakeFor', 'Slashed', 'UserIndexUpdated', 'WithdrawalRequested', 'WithdrewStake', ]; for (const eventName of eventNames) { const logs = await getLogs(eventName); (0, chai_1.expect)(logs.length).to.equal(0, `Expected no ${eventName} events`); } }); it('Events emitted during initialization', async () => { await expectLogsByName('BlackoutWindowChanged', [ [ctx.config.BLACKOUT_WINDOW], ]); await expectLogsByName('EpochParametersChanged', [ [[ctx.config.EPOCH_LENGTH, ctx.config.EPOCH_ZERO_START]], ]); await expectLogsByName('RewardsPerSecondUpdated', [ [ctx.config.SM_REWARDS_PER_SECOND], ]); }); it('Other events emitted during the deployment/configuration process', async () => { const roleGrantedEvents = [ // From deployment. [(0, util_1.getRole)(types_1.Role.OWNER_ROLE), ctx.deployer.address], [(0, util_1.getRole)(types_1.Role.SLASHER_ROLE), ctx.deployer.address], [(0, util_1.getRole)(types_1.Role.EPOCH_PARAMETERS_ROLE), ctx.deployer.address], [(0, util_1.getRole)(types_1.Role.REWARDS_RATE_ROLE), ctx.deployer.address], [(0, util_1.getRole)(types_1.Role.CLAIM_OPERATOR_ROLE), ctx.claimsProxy.address], [(0, util_1.getRole)(types_1.Role.OWNER_ROLE), ctx.shortTimelock.address], [(0, util_1.getRole)(types_1.Role.SLASHER_ROLE), ctx.shortTimelock.address], [(0, util_1.getRole)(types_1.Role.EPOCH_PARAMETERS_ROLE), ctx.shortTimelock.address], [(0, util_1.getRole)(types_1.Role.REWARDS_RATE_ROLE), ctx.shortTimelock.address], ]; if (config_1.default.isHardhat()) { roleGrantedEvents.push(...[ // From test setup. [(0, util_1.getRole)(types_1.Role.OWNER_ROLE), ctx.deployer.address], [(0, util_1.getRole)(types_1.Role.SLASHER_ROLE), ctx.deployer.address], [(0, util_1.getRole)(types_1.Role.EPOCH_PARAMETERS_ROLE), ctx.deployer.address], [(0, util_1.getRole)(types_1.Role.REWARDS_RATE_ROLE), ctx.deployer.address], [(0, util_1.getRole)(types_1.Role.CLAIM_OPERATOR_ROLE), ctx.deployer.address], [(0, util_1.getRole)(types_1.Role.STAKE_OPERATOR_ROLE), ctx.deployer.address], ]); } await expectLogsByName('RoleGranted', roleGrantedEvents); await expectLogsByName('RoleRevoked', [ [(0, util_1.getRole)(types_1.Role.SLASHER_ROLE), ctx.deployer.address], [(0, util_1.getRole)(types_1.Role.EPOCH_PARAMETERS_ROLE), ctx.deployer.address], [(0, util_1.getRole)(types_1.Role.REWARDS_RATE_ROLE), ctx.deployer.address], [(0, util_1.getRole)(types_1.Role.OWNER_ROLE), ctx.deployer.address], ]); }); it('Events emitted during staking', async () => { // Skip this check when running on hardhat network, without mainnet forking, with more than the // first 35 stakers. See migrations/affected-stakers.ts. if (config_1.default.isHardhat() && !config_1.default.FORK_MAINNET && testStakers.length > 35) { return; } await expectLogsByName('DelegatedPowerChanged', lodash_1.default.flatten(testStakers.map((staker) => { return [ [staker, 0, types_1.DelegationType.VOTING_POWER], [staker, 0, types_1.DelegationType.PROPOSITION_POWER], ]; }))); const stakedLogs = await getLogs('Staked'); await expectLogs(stakedLogs, 'Staked', testStakers.map((staker) => { return [staker, staker, (0, affected_stakers_1.getStakedAmount)(staker), 0]; })); await expectLogsByName('Transfer', testStakers.map((staker) => { return [constants_1.ZERO_ADDRESS, staker, 0]; })); const stakesUniqueByBlockNumber = lodash_1.default.uniqBy(stakedLogs, (e) => e.blockNumber); await expectLogsByName('GlobalIndexUpdated', stakesUniqueByBlockNumber.map(() => { return [0]; })); }); async function getLogs(eventName) { const filter = ctx.safetyModule.filters[eventName](); return ctx.safetyModule.queryFilter(filter); } function expectLogs(events, eventName, expectedArgsList) { // Compare number of events. const expectedCount = expectedArgsList.length; (0, chai_1.expect)(events.length).to.equal(expectedCount, `Expected ${expectedCount} ${eventName} events`); // Compare args of each event. for (let i = 0; i < expectedCount; i++) { const actualArgs = events[i].args; const expectedArgs = expectedArgsList[i]; for (let j = 0; j < expectedArgs.length; j++) { const actual = actualArgs[j]; const expected = expectedArgs[j]; const message = `Event arg mismatch ${eventName}[${i}], arg ${j}: ${actual} != ${expected}`; if (Array.isArray(expected)) { expectArraysEqual(actual, expected, message); } else { (0, chai_1.expect)(actual).to.equal(expected, message); } } } } async function expectLogsByName(eventName, expectedArgsList) { const events = await getLogs(eventName); return expectLogs(events, eventName, expectedArgsList); } function expectArraysEqual(actual, expected, message) { (0, chai_1.expect)(actual.length).to.be.equal(expected.length, message); for (let i = 0; i < expected.length; i++) { (0, chai_1.expect)(actual[i]).to.be.equal(expected[i], message); } } });