@dydxfoundation/governance
Version:
dYdX governance smart contracts
143 lines (142 loc) • 7.15 kB
JavaScript
;
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);
}
}
});