diff --git a/contracts/hardhat.config.ts b/contracts/hardhat.config.ts index bf15fdd5e..bd3ddb7ac 100644 --- a/contracts/hardhat.config.ts +++ b/contracts/hardhat.config.ts @@ -1,16 +1,11 @@ import type { HardhatUserConfig } from "hardhat/config"; +import hardhatEthers from "@nomicfoundation/hardhat-ethers"; +import hardhatNetworkHelpers from "@nomicfoundation/hardhat-network-helpers"; import hardhatToolboxMochaEthersPlugin from "@nomicfoundation/hardhat-toolbox-mocha-ethers"; const config: HardhatUserConfig = { - /* - * In Hardhat 3, plugins are defined as part of the Hardhat config instead of - * being based on the side-effect of imports. - * - * Note: A `hardhat-toolbox` like plugin for Hardhat 3 hasn't been defined yet, - * so this list is larger than what you would normally have. - */ - plugins: [hardhatToolboxMochaEthersPlugin], + plugins: [hardhatEthers, hardhatNetworkHelpers, hardhatToolboxMochaEthersPlugin], solidity: { profiles: { default: { diff --git a/contracts/package.json b/contracts/package.json index 07a53e36f..a9423aa8d 100644 --- a/contracts/package.json +++ b/contracts/package.json @@ -1,20 +1,21 @@ { "name": "neox-governance", - "type": "module", "version": "1.0.0", + "type": "module", "devDependencies": { - "@nomicfoundation/hardhat-ethers": "^4.0.0-next.21", - "@nomicfoundation/hardhat-ignition": "^3.0.0-next.21", - "@nomicfoundation/hardhat-toolbox-mocha-ethers": "^3.0.0-next.21", + "@nomicfoundation/hardhat-ethers": "^4.0.2", + "@nomicfoundation/hardhat-ignition": "^3.0.3", + "@nomicfoundation/hardhat-network-helpers": "^3.0.1", + "@nomicfoundation/hardhat-toolbox-mocha-ethers": "^3.0.0", "@types/chai": "^4.3.20", "@types/chai-as-promised": "^8.0.2", "@types/mocha": "^10.0.10", - "@types/node": "^22.16.0", - "chai": "^5.2.0", + "@types/node": "^22.18.10", + "chai": "^5.3.3", "ethers": "^6.15.0", "forge-std": "github:foundry-rs/forge-std#v1.9.4", - "hardhat": "^3.0.0-next.21", - "mocha": "^11.7.1", + "hardhat": "^3.0.7", + "mocha": "^11.7.4", "typescript": "~5.8.0" }, "dependencies": { diff --git a/contracts/solidity/CommitteeMultiSig.sol b/contracts/solidity/CommitteeMultiSig.sol index 8240ada6b..e99fdea0a 100644 --- a/contracts/solidity/CommitteeMultiSig.sol +++ b/contracts/solidity/CommitteeMultiSig.sol @@ -2,32 +2,10 @@ pragma solidity ^0.8.25; import {GovernanceVote} from "./base/GovernanceVote.sol"; -import {ERC1967Utils, GovProxyUpgradeable} from "./base/GovProxyUpgradeable.sol"; +import {GovProxyUpgradeable} from "./base/GovProxyUpgradeable.sol"; import {Address} from "@openzeppelin/contracts/utils/Address.sol"; contract CommitteeMultiSig is GovernanceVote, GovProxyUpgradeable { - address public constant SELF = 0x1212100000000000000000000000000000000007; - - // Only for precompiled uups implementation in genesis file, need to be removed when upgrading the contract. - // This override is added because "immutable __self" in UUPSUpgradeable is not avaliable in precompiled contract. - function _checkProxy() internal view virtual override { - if ( - address(this) == SELF || // Must be called through delegatecall - ERC1967Utils.getImplementation() != SELF // Must be called through an active proxy - ) { - revert UUPSUnauthorizedCallContext(); - } - } - - // Only for precompiled uups implementation in genesis file, need to be removed when upgrading the contract. - // This override is added because "immutable __self" in UUPSUpgradeable is not avaliable in precompiled contract. - function _checkNotDelegated() internal view virtual override { - if (address(this) != SELF) { - // Must not be called through delegatecall - revert UUPSUnauthorizedCallContext(); - } - } - // Execute an operation that calls a function on the `target` contract function execute( address target, diff --git a/contracts/solidity/GovReward.sol b/contracts/solidity/GovReward.sol index 5ae678033..16fe39469 100644 --- a/contracts/solidity/GovReward.sol +++ b/contracts/solidity/GovReward.sol @@ -5,10 +5,9 @@ import {Errors} from "./libraries/Errors.sol"; import {Bytes} from "./libraries/Bytes.sol"; import {IGovReward} from "./interfaces/IGovReward.sol"; import {IGovernance} from "./interfaces/IGovernance.sol"; -import {ERC1967Utils, GovProxyUpgradeable} from "./base/GovProxyUpgradeable.sol"; +import {GovProxyUpgradeable} from "./base/GovProxyUpgradeable.sol"; contract GovReward is IGovReward, GovProxyUpgradeable { - address public constant SELF = 0x1212100000000000000000000000000000000003; // governance contact address public constant GOV = 0x1212000000000000000000000000000000000001; @@ -36,26 +35,6 @@ contract GovReward is IGovReward, GovProxyUpgradeable { _; } - // Only for precompiled uups implementation in genesis file, need to be removed when upgrading the contract. - // This override is added because "immutable __self" in UUPSUpgradeable is not avaliable in precompiled contract. - function _checkProxy() internal view virtual override { - if ( - address(this) == SELF || // Must be called through delegatecall - ERC1967Utils.getImplementation() != SELF // Must be called through an active proxy - ) { - revert UUPSUnauthorizedCallContext(); - } - } - - // Only for precompiled uups implementation in genesis file, need to be removed when upgrading the contract. - // This override is added because "immutable __self" in UUPSUpgradeable is not avaliable in precompiled contract. - function _checkNotDelegated() internal view virtual override { - if (address(this) != SELF) { - // Must not be called through delegatecall - revert UUPSUnauthorizedCallContext(); - } - } - function getMiners() external view override returns (address[] memory) { return IGovernance(GOV).getCurrentConsensus(); } diff --git a/contracts/solidity/Governance.sol b/contracts/solidity/Governance.sol index ef52e727e..8a94b33fd 100644 --- a/contracts/solidity/Governance.sol +++ b/contracts/solidity/Governance.sol @@ -6,14 +6,13 @@ import {IGovReward} from "./interfaces/IGovReward.sol"; import {IKeyManagement} from "./interfaces/IKeyManagement.sol"; import {IGovernance} from "./interfaces/IGovernance.sol"; import {IPolicy} from "./interfaces/IPolicy.sol"; -import {ERC1967Utils, GovProxyUpgradeable} from "./base/GovProxyUpgradeable.sol"; +import {GovProxyUpgradeable} from "./base/GovProxyUpgradeable.sol"; import {EnumerableSet} from "@openzeppelin/contracts/utils/structs/EnumerableSet.sol"; import {ReentrancyGuard} from "@openzeppelin/contracts/utils/ReentrancyGuard.sol"; contract Governance is IGovernance, ReentrancyGuard, GovProxyUpgradeable { using EnumerableSet for EnumerableSet.AddressSet; - address public constant SELF = 0x1212100000000000000000000000000000000001; // Policy contract address public constant POLICY = 0x1212000000000000000000000000000000000002; // GovReward contract @@ -76,26 +75,6 @@ contract Governance is IGovernance, ReentrancyGuard, GovProxyUpgradeable { // the pending group of block validators address[] public pendingConsensus; - // Only for precompiled uups implementation in genesis file, need to be removed when upgrading the contract. - // This override is added because "immutable __self" in UUPSUpgradeable is not avaliable in precompiled contract. - function _checkProxy() internal view virtual override { - if ( - address(this) == SELF || // Must be called through delegatecall - ERC1967Utils.getImplementation() != SELF // Must be called through an active proxy - ) { - revert UUPSUnauthorizedCallContext(); - } - } - - // Only for precompiled uups implementation in genesis file, need to be removed when upgrading the contract. - // This override is added because "immutable __self" in UUPSUpgradeable is not avaliable in precompiled contract. - function _checkNotDelegated() internal view virtual override { - if (address(this) != SELF) { - // Must not be called through delegatecall - revert UUPSUnauthorizedCallContext(); - } - } - receive() external payable nonReentrant { if (msg.sender != GOV_REWARD) revert Errors.SideCallNotAllowed(); address[] memory validators = currentConsensus; diff --git a/contracts/solidity/KeyManagementV0.sol b/contracts/solidity/KeyManagementV0.sol index 85b016673..9765a06dd 100644 --- a/contracts/solidity/KeyManagementV0.sol +++ b/contracts/solidity/KeyManagementV0.sol @@ -6,10 +6,9 @@ import {BLS12381} from "./libraries/BLS12381.sol"; import {IGovernance} from "./interfaces/IGovernance.sol"; import {IKeyManagement} from "./interfaces/IKeyManagement.sol"; import {IZKDKGV0} from "./interfaces/IZKDKGV0.sol"; -import {ERC1967Utils, GovProxyUpgradeable} from "./base/GovProxyUpgradeable.sol"; +import {GovProxyUpgradeable} from "./base/GovProxyUpgradeable.sol"; contract KeyManagementV0 is GovProxyUpgradeable, IKeyManagement, IZKDKGV0 { - address public constant SELF = 0x1212100000000000000000000000000000000008; // governance contact address public constant GOV = 0x1212000000000000000000000000000000000001; address public constant SYS_CALL = @@ -43,26 +42,6 @@ contract KeyManagementV0 is GovProxyUpgradeable, IKeyManagement, IZKDKGV0 { // ref https://github.com/bane-labs/go-ethereum/blob/a07310bd9a3a117ae0876ad69bbe8b6ed624aaa5/core/antimev/util.go#L27 mapping(uint => bytes) public aggregatedCommitments; - // Only for precompiled uups implementation in genesis file, need to be removed when upgrading the contract. - // This override is added because "immutable __self" in UUPSUpgradeable is not avaliable in precompiled contract. - function _checkProxy() internal view virtual override { - if ( - address(this) == SELF || // Must be called through delegatecall - ERC1967Utils.getImplementation() != SELF // Must be called through an active proxy - ) { - revert UUPSUnauthorizedCallContext(); - } - } - - // Only for precompiled uups implementation in genesis file, need to be removed when upgrading the contract. - // This override is added because "immutable __self" in UUPSUpgradeable is not avaliable in precompiled contract. - function _checkNotDelegated() internal view virtual override { - if (address(this) != SELF) { - // Must not be called through delegatecall - revert UUPSUnauthorizedCallContext(); - } - } - function registerMessageKey( address candidate, bytes calldata pubkey diff --git a/contracts/solidity/KeyManagementV1.sol b/contracts/solidity/KeyManagementV1.sol index ed610e9f8..4374fc4db 100644 --- a/contracts/solidity/KeyManagementV1.sol +++ b/contracts/solidity/KeyManagementV1.sol @@ -9,10 +9,9 @@ import {SevenMessageVerifier} from "./libraries/SevenMessageVerifier.sol"; import {IGovernance} from "./interfaces/IGovernance.sol"; import {IKeyManagement} from "./interfaces/IKeyManagement.sol"; import {IZKDKGV1} from "./interfaces/IZKDKGV1.sol"; -import {ERC1967Utils, GovProxyUpgradeable} from "./base/GovProxyUpgradeable.sol"; +import {GovProxyUpgradeable} from "./base/GovProxyUpgradeable.sol"; contract KeyManagementV1 is GovProxyUpgradeable, IKeyManagement, IZKDKGV1 { - address public constant SELF = 0x1212100000000000000000000000000000000008; // governance contact address public constant GOV = 0x1212000000000000000000000000000000000001; address public constant SYS_CALL = @@ -48,26 +47,6 @@ contract KeyManagementV1 is GovProxyUpgradeable, IKeyManagement, IZKDKGV1 { // hash=>used, this is used to prevent reusing and uploading the same public input mapping(bytes32 => bool) public isPubHashUsed; - // Only for precompiled uups implementation in genesis file, need to be removed when upgrading the contract. - // This override is added because "immutable __self" in UUPSUpgradeable is not avaliable in precompiled contract. - function _checkProxy() internal view virtual override { - if ( - address(this) == SELF || // Must be called through delegatecall - ERC1967Utils.getImplementation() != SELF // Must be called through an active proxy - ) { - revert UUPSUnauthorizedCallContext(); - } - } - - // Only for precompiled uups implementation in genesis file, need to be removed when upgrading the contract. - // This override is added because "immutable __self" in UUPSUpgradeable is not avaliable in precompiled contract. - function _checkNotDelegated() internal view virtual override { - if (address(this) != SELF) { - // Must not be called through delegatecall - revert UUPSUnauthorizedCallContext(); - } - } - function registerMessageKey( address candidate, bytes calldata pubkey diff --git a/contracts/solidity/Policy.sol b/contracts/solidity/Policy.sol index 17c47ea71..623f8394b 100644 --- a/contracts/solidity/Policy.sol +++ b/contracts/solidity/Policy.sol @@ -5,10 +5,9 @@ import {Errors} from "./libraries/Errors.sol"; import {IGovernance} from "./interfaces/IGovernance.sol"; import {IPolicy} from "./interfaces/IPolicy.sol"; import {GovernanceVote} from "./base/GovernanceVote.sol"; -import {ERC1967Utils, GovProxyUpgradeable} from "./base/GovProxyUpgradeable.sol"; +import {GovProxyUpgradeable} from "./base/GovProxyUpgradeable.sol"; contract Policy is IPolicy, GovernanceVote, GovProxyUpgradeable { - address public constant SELF = 0x1212100000000000000000000000000000000002; // governance contact address public constant GOV = 0x1212000000000000000000000000000000000001; uint256 public constant DEFAULT_CANDIDATE_LIMIT = 2000; @@ -21,26 +20,6 @@ contract Policy is IPolicy, GovernanceVote, GovProxyUpgradeable { uint256 public maxEnvelopesPerBlock; uint256 public maxEnvelopeGasLimit; - // Only for precompiled uups implementation in genesis file, need to be removed when upgrading the contract. - // This override is added because "immutable __self" in UUPSUpgradeable is not avaliable in precompiled contract. - function _checkProxy() internal view virtual override { - if ( - address(this) == SELF || // Must be called through delegatecall - ERC1967Utils.getImplementation() != SELF // Must be called through an active proxy - ) { - revert UUPSUnauthorizedCallContext(); - } - } - - // Only for precompiled uups implementation in genesis file, need to be removed when upgrading the contract. - // This override is added because "immutable __self" in UUPSUpgradeable is not avaliable in precompiled contract. - function _checkNotDelegated() internal view virtual override { - if (address(this) != SELF) { - // Must not be called through delegatecall - revert UUPSUnauthorizedCallContext(); - } - } - function addBlackList( address _addr ) diff --git a/contracts/test/CommitteeMultiSig.ts b/contracts/test/CommitteeMultiSig.ts index 6bf08318b..f1fda9105 100644 --- a/contracts/test/CommitteeMultiSig.ts +++ b/contracts/test/CommitteeMultiSig.ts @@ -1,50 +1,51 @@ import { expect } from "chai"; import { ERRORS } from "./helpers/errors.js"; -import { ethers, allocGenesis } from "./helpers/setup.js"; +import { ethers, networkHelpers, allocGenesis } from "./helpers/setup.js"; describe("CommitteeMultiSig", function () { - let signers: any; + let MultiSig: any, MockCaller: any; + let signers: any, snapshot: any; - beforeEach(async function () { + before(async function () { signers = await ethers.getSigners(); await allocGenesis(); + MultiSig = await ethers.deployContract("CommitteeMultiSig"); + MockCaller = await ethers.deployContract("MockMultiSig"); + snapshot = await networkHelpers.takeSnapshot(); }); - describe("execute", function () { - let MultiSig: any, Mock: any; - - beforeEach(async function () { - MultiSig = await ethers.deployContract("CommitteeMultiSig"); - Mock = await ethers.deployContract("MockMultiSig"); - }); + afterEach(async function () { + await snapshot.restore(); + }); + describe("execute", function () { it("Should revert if the sender is not a miner", async function () { await expect( - MultiSig.connect(signers[7]).execute(Mock.target, "0xa1b2ca7d0000000000000000000000000000000000000000000000000000000000000001") + MultiSig.connect(signers[7]).execute(MockCaller.target, "0xa1b2ca7d0000000000000000000000000000000000000000000000000000000000000001") ).to.be.revertedWithCustomError(MultiSig, ERRORS.NOT_MINER); }); it("Should not execute method when threshold is not met", async function () { await expect( - MultiSig.connect(signers[0]).execute(Mock.target, "0xa1b2ca7d0000000000000000000000000000000000000000000000000000000000000001") - ).not.to.be.reverted(ethers); + MultiSig.connect(signers[0]).execute(MockCaller.target, "0xa1b2ca7d0000000000000000000000000000000000000000000000000000000000000001") + ).not.to.be.revert(ethers); - expect(await Mock.v()).to.eq(0); + expect(await MockCaller.v()).to.eq(0); }); it("Should execute method when threshold is met", async function () { for (let i = 0; i < 3; i++) { await expect( - MultiSig.connect(signers[i]).execute(Mock.target, "0xa1b2ca7d0000000000000000000000000000000000000000000000000000000000000001") - ).not.to.be.reverted(ethers); + MultiSig.connect(signers[i]).execute(MockCaller.target, "0xa1b2ca7d0000000000000000000000000000000000000000000000000000000000000001") + ).not.to.be.revert(ethers); } - expect(await Mock.v()).to.eq(0); + expect(await MockCaller.v()).to.eq(0); await expect( - MultiSig.connect(signers[3]).execute(Mock.target, "0xa1b2ca7d0000000000000000000000000000000000000000000000000000000000000001") - ).not.to.be.reverted(ethers); - expect(await Mock.v()).to.eq(1); + MultiSig.connect(signers[3]).execute(MockCaller.target, "0xa1b2ca7d0000000000000000000000000000000000000000000000000000000000000001") + ).not.to.be.revert(ethers); + expect(await MockCaller.v()).to.eq(1); }); }); -}); \ No newline at end of file +}); diff --git a/contracts/test/GovProxyUpgradeable.ts b/contracts/test/GovProxyUpgradeable.ts index 91d108504..dadff32d0 100644 --- a/contracts/test/GovProxyUpgradeable.ts +++ b/contracts/test/GovProxyUpgradeable.ts @@ -4,12 +4,18 @@ import { expect } from "chai"; const { ethers } = await network.connect(); describe("GovProxyUpgradeable", function () { + + let Mock: any; + + before(async function () { + Mock = await ethers.deployContract("MockGovProxyUpgradeable"); + }); + it("Should prevent implementation contract from initialization", async function () { - const mockGovProxyUpgradeable = await ethers.deployContract("MockGovProxyUpgradeable"); - await expect(mockGovProxyUpgradeable.initialize()).to.be.reverted(ethers); + await expect(Mock.initialize()).to.be.revert(ethers); expect( await ethers.provider.send("eth_getStorageAt", [ - await mockGovProxyUpgradeable.getAddress(), + await Mock.getAddress(), "0xf0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00", "latest"] ) @@ -17,14 +23,13 @@ describe("GovProxyUpgradeable", function () { }); it("Should prevent implementation contract from reinitialization", async function () { - const mockGovProxyUpgradeable = await ethers.deployContract("MockGovProxyUpgradeable"); - await expect(mockGovProxyUpgradeable.reinitialize()).to.be.reverted(ethers); + await expect(Mock.reinitialize()).to.be.revert(ethers); expect( await ethers.provider.send("eth_getStorageAt", [ - await mockGovProxyUpgradeable.getAddress(), + await Mock.getAddress(), "0xf0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00", "latest"] ) ).to.eq("0x000000000000000000000000000000000000000000000000ffffffffffffffff"); }); -}); \ No newline at end of file +}); diff --git a/contracts/test/GovReward.ts b/contracts/test/GovReward.ts index 1e6e7ee0a..7ff19e05f 100644 --- a/contracts/test/GovReward.ts +++ b/contracts/test/GovReward.ts @@ -1,35 +1,38 @@ import { expect } from "chai"; -import { SYS_SETTINGS, ethers, allocGenesis } from "./helpers/setup.js"; +import { SYS_SETTINGS, ethers, networkHelpers, allocGenesis } from "./helpers/setup.js"; describe("GovReward", function () { - beforeEach(async function () { + let MockCaller: any; + let snapshot: any; + + before(async function () { await allocGenesis(); + MockCaller = await ethers.deployContract("MockFallback"); + snapshot = await networkHelpers.takeSnapshot(); + }); + + afterEach(async function () { + await snapshot.restore(); }); describe("fallback", function () { - let Mock: any; - - beforeEach(async function () { - Mock = await ethers.deployContract("MockFallback"); - }); - it("Should revert if the selector is not 0xffffffff", async function () { await expect( - Mock.call_fallback(SYS_SETTINGS.REWARD_PROXY, "0xfffffffe") - ).to.be.reverted(ethers); + MockCaller.call_fallback(SYS_SETTINGS.REWARD_PROXY, "0xfffffffe") + ).to.be.revert(ethers); }); it("Should revert if the declared gaslimit is lower than 21000", async function () { await expect( - Mock.call_fallback(SYS_SETTINGS.REWARD_PROXY, "0xffffffff") - ).to.be.reverted(ethers); + MockCaller.call_fallback(SYS_SETTINGS.REWARD_PROXY, "0xffffffff") + ).to.be.revert(ethers); }); it("Should consume gas as expected", async function () { await expect( - Mock.call_fallback(SYS_SETTINGS.REWARD_PROXY, "0xffffffff0000000000005208") - ).not.to.be.reverted(ethers); + MockCaller.call_fallback(SYS_SETTINGS.REWARD_PROXY, "0xffffffff0000000000005208") + ).not.to.be.revert(ethers); }); }); }); diff --git a/contracts/test/Governance.ts b/contracts/test/Governance.ts index ee1dbc770..fd9db1261 100644 --- a/contracts/test/Governance.ts +++ b/contracts/test/Governance.ts @@ -1,6 +1,6 @@ import { expect } from "chai"; import { ERRORS } from "./helpers/errors.js"; -import { SYS_SETTINGS, ethers, networkHelpers, provider, allocGenesis } from "./helpers/setup.js"; +import { SYS_SETTINGS, ethers, networkHelpers, allocGenesis } from "./helpers/setup.js"; // MOCK PUBKEYS const PUBKEY = "0x04a8c8762d32477f5bd0ccff58d35a7b7ace2fbbd0c0d61874bd405bc0af415690d16f585bcec5f51d1fdddfd0d4543cb0a9d40f0447b62a7c4b1a0f24c45ccb01"; @@ -9,17 +9,23 @@ describe("Governance", function () { let Governance: any, GovReward: any, Policy: any, KeyManagement: any; let MockSysCall: any; - let signers: any; + let signers: any, snapshot: any; - beforeEach(async function () { + before(async function () { signers = await ethers.getSigners(); [Governance, GovReward, Policy, KeyManagement] = await allocGenesis(); // Deploy Mock SYS_CALL - const deploy_mock = await ethers.deployContract("MockSysCall"); - const code_mock = await ethers.provider.send("eth_getCode", [deploy_mock.target]); - await ethers.provider.send("hardhat_setCode", [SYS_SETTINGS.SYS_CALL, code_mock]); + const mock = await ethers.deployContract("MockSysCall"); + const code = await ethers.provider.send("eth_getCode", [mock.target]); + await ethers.provider.send("hardhat_setCode", [SYS_SETTINGS.SYS_CALL, code]); MockSysCall = await ethers.getContractAt("MockSysCall", SYS_SETTINGS.SYS_CALL, signers[0]); + + snapshot = await networkHelpers.takeSnapshot(); + }); + + afterEach(async function () { + await snapshot.restore(); }); describe("genesis", function () { @@ -95,7 +101,7 @@ describe("Governance", function () { it("Should register a new candidate if all conditions are met", async function () { await expect( Governance.registerCandidate(500, PUBKEY, { value: SYS_SETTINGS.REGISTER_FEE }) - ).not.to.be.reverted(ethers); + ).not.to.be.revert(ethers); const candidates = await Governance.getCandidates(); expect(candidates.length).to.equal(1); @@ -120,11 +126,11 @@ describe("Governance", function () { it("Should remove a candidate if all conditions are met", async function () { await expect( Governance.registerCandidate(500, PUBKEY, { value: SYS_SETTINGS.REGISTER_FEE }) - ).not.to.be.reverted(ethers); + ).not.to.be.revert(ethers); await expect( Governance.exitCandidate() - ).not.to.be.reverted(ethers); + ).not.to.be.revert(ethers); const candidates = await Governance.getCandidates(); expect(candidates.length).to.equal(0); @@ -133,13 +139,13 @@ describe("Governance", function () { it("Should decrease total votes if exited candidates received votes", async function () { await expect( Governance.registerCandidate(500, PUBKEY, { value: SYS_SETTINGS.REGISTER_FEE }) - ).not.to.be.reverted(ethers); + ).not.to.be.revert(ethers); await expect( Governance.vote(signers[0], { value: SYS_SETTINGS.MIN_VOTE_AMOUNT }) - ).not.to.be.reverted(ethers); + ).not.to.be.revert(ethers); await expect( Governance.exitCandidate() - ).not.to.be.reverted(ethers); + ).not.to.be.revert(ethers); expect(await Governance.totalVotes()).to.equal(0); }); @@ -147,7 +153,7 @@ describe("Governance", function () { it("Should emit an event when a candidate exits", async function () { await expect( Governance.registerCandidate(500, PUBKEY, { value: SYS_SETTINGS.REGISTER_FEE }) - ).not.to.be.reverted(ethers); + ).not.to.be.revert(ethers); await expect( Governance.exitCandidate() @@ -165,7 +171,7 @@ describe("Governance", function () { it("Should revert if the sender has not exited", async function () { await expect( Governance.registerCandidate(500, PUBKEY, { value: SYS_SETTINGS.REGISTER_FEE }) - ).not.to.be.reverted(ethers); + ).not.to.be.revert(ethers); await expect( Governance.withdrawRegisterFee() @@ -175,10 +181,10 @@ describe("Governance", function () { it("Should revert if the sender has not waited for 2 epochs", async function () { await expect( Governance.registerCandidate(500, PUBKEY, { value: SYS_SETTINGS.REGISTER_FEE }) - ).not.to.be.reverted(ethers); + ).not.to.be.revert(ethers); await expect( Governance.exitCandidate() - ).not.to.be.reverted(ethers); + ).not.to.be.revert(ethers); await expect( Governance.withdrawRegisterFee() @@ -188,25 +194,25 @@ describe("Governance", function () { it("Should transfer back register fee if all conditions are met", async function () { await expect( Governance.registerCandidate(500, PUBKEY, { value: SYS_SETTINGS.REGISTER_FEE }) - ).not.to.be.reverted(ethers); + ).not.to.be.revert(ethers); await expect( Governance.exitCandidate() - ).not.to.be.reverted(ethers); + ).not.to.be.revert(ethers); await networkHelpers.mine(2 * SYS_SETTINGS.EPOCH_DURATION); await expect( await Governance.withdrawRegisterFee() - ).to.changeEtherBalance(provider, signers[0], SYS_SETTINGS.REGISTER_FEE * 50n / 100n); + ).to.changeEtherBalance(ethers, signers[0], SYS_SETTINGS.REGISTER_FEE * 50n / 100n); }); it("Should emit an event when a candidate withdraw register fee", async function () { await expect( Governance.registerCandidate(500, PUBKEY, { value: SYS_SETTINGS.REGISTER_FEE }) - ).not.to.be.reverted(ethers); + ).not.to.be.revert(ethers); await expect( Governance.exitCandidate() - ).not.to.be.reverted(ethers); + ).not.to.be.revert(ethers); await networkHelpers.mine(2 * SYS_SETTINGS.EPOCH_DURATION); @@ -229,13 +235,13 @@ describe("Governance", function () { await Governance.connect(signers[i]).registerCandidate(500, PUBKEY, { value: SYS_SETTINGS.REGISTER_FEE }); await Governance.connect(signers[i]).vote(signers[i], { value: SYS_SETTINGS.VOTE_TARGET_AMOUNT }); } - await networkHelpers.mine(SYS_SETTINGS.EPOCH_DURATION); + await networkHelpers.mineUpTo(SYS_SETTINGS.EPOCH_DURATION); await MockSysCall.call_onPersist(Governance); for (let i = 0; i < 4; i++) { await expect( Policy.connect(signers[i]).addBlackList(signers[0]) - ).not.to.be.reverted(ethers); + ).not.to.be.revert(ethers); } expect(await Governance.blacklistedCandidates()).to.equal(1); @@ -259,19 +265,19 @@ describe("Governance", function () { await Governance.connect(signers[i]).registerCandidate(500, PUBKEY, { value: SYS_SETTINGS.REGISTER_FEE }); await Governance.connect(signers[i]).vote(signers[i], { value: SYS_SETTINGS.VOTE_TARGET_AMOUNT }); } - await networkHelpers.mine(SYS_SETTINGS.EPOCH_DURATION); + await networkHelpers.mineUpTo(SYS_SETTINGS.EPOCH_DURATION); await MockSysCall.call_onPersist(Governance); for (let i = 0; i < 4; i++) { await expect( Policy.connect(signers[i]).addBlackList(signers[0]) - ).not.to.be.reverted(ethers); + ).not.to.be.revert(ethers); } for (let i = 0; i < 4; i++) { await expect( Policy.connect(signers[i]).removeBlackList(signers[0]) - ).not.to.be.reverted(ethers); + ).not.to.be.revert(ethers); } expect(await Governance.blacklistedCandidates()).to.equal(0); @@ -336,12 +342,12 @@ describe("Governance", function () { }); it("Should allow SYS_CALL", async function () { - expect(await MockSysCall.call_onPersist(Governance)).not.to.be.reverted(ethers); + expect(await MockSysCall.call_onPersist(Governance)).not.to.be.revert(ethers); }); it("Should update currentEpochStartHeight on Epoch change", async function () { expect(await Governance.currentEpochStartHeight()).to.equal(0); - await networkHelpers.mine(SYS_SETTINGS.EPOCH_DURATION); + await networkHelpers.mineUpTo(SYS_SETTINGS.EPOCH_DURATION); await expect( MockSysCall.call_onPersist(Governance) ).emit(Governance, "Persist"); @@ -355,7 +361,7 @@ describe("Governance", function () { for (let i = 0; i < SYS_SETTINGS.CONSENSUS_SIZE; i++) { await Governance.connect(signers[i]).registerCandidate(500, PUBKEY, { value: SYS_SETTINGS.REGISTER_FEE }); } - await networkHelpers.mine(SYS_SETTINGS.EPOCH_DURATION); + await networkHelpers.mineUpTo(SYS_SETTINGS.EPOCH_DURATION); await MockSysCall.call_onPersist(Governance); expect(await Governance.getCurrentConsensus()).to.deep.equal(SYS_SETTINGS.STANDBY_VALIDATORS); @@ -365,7 +371,7 @@ describe("Governance", function () { // Register only 1 candidate but vote await Governance.registerCandidate(500, PUBKEY, { value: SYS_SETTINGS.REGISTER_FEE }); await Governance.vote(signers[0], { value: SYS_SETTINGS.VOTE_TARGET_AMOUNT }); - await networkHelpers.mine(SYS_SETTINGS.EPOCH_DURATION); + await networkHelpers.mineUpTo(SYS_SETTINGS.EPOCH_DURATION); await MockSysCall.call_onPersist(Governance); expect(await Governance.getCurrentConsensus()).to.deep.equal(SYS_SETTINGS.STANDBY_VALIDATORS); @@ -376,7 +382,7 @@ describe("Governance", function () { await Governance.connect(signers[i]).registerCandidate(500, PUBKEY, { value: SYS_SETTINGS.REGISTER_FEE }); await Governance.connect(signers[i]).vote(signers[i], { value: SYS_SETTINGS.VOTE_TARGET_AMOUNT }); } - await networkHelpers.mine(SYS_SETTINGS.EPOCH_DURATION); + await networkHelpers.mineUpTo(SYS_SETTINGS.EPOCH_DURATION); await MockSysCall.call_onPersist(Governance); expect(await Governance.getCurrentConsensus()).to.not.deep.equal(SYS_SETTINGS.STANDBY_VALIDATORS); @@ -390,7 +396,7 @@ describe("Governance", function () { await tx.wait(); await expect( await MockSysCall.call_onPersist(Governance) - ).to.changeEtherBalance(provider, signers[0], 1000000000000000000n); + ).to.changeEtherBalance(ethers, signers[0], 1000000000000000000n); }); }); @@ -415,7 +421,7 @@ describe("Governance", function () { // Vote to the first await expect( Governance.vote(signers[0], { value: SYS_SETTINGS.MIN_VOTE_AMOUNT }) - ).not.to.be.reverted(ethers); + ).not.to.be.revert(ethers); // Vote to the second await expect( @@ -427,7 +433,7 @@ describe("Governance", function () { await Governance.registerCandidate(500, PUBKEY, { value: SYS_SETTINGS.REGISTER_FEE }); await expect( Governance.vote(signers[0], { value: SYS_SETTINGS.MIN_VOTE_AMOUNT }) - ).not.to.be.reverted(ethers); + ).not.to.be.revert(ethers); expect(await Governance.receivedVotes(signers[0])).to.eq(SYS_SETTINGS.MIN_VOTE_AMOUNT); expect(await Governance.votedTo(signers[0])).to.eq(signers[0].address); @@ -455,12 +461,12 @@ describe("Governance", function () { await expect( Governance.vote(signers[0], { value: SYS_SETTINGS.MIN_VOTE_AMOUNT }) - ).not.to.be.reverted(ethers); + ).not.to.be.revert(ethers); const balanceBefore = await ethers.provider.getBalance(signers[0]); await expect( Governance.revokeVote(SYS_SETTINGS.MIN_VOTE_AMOUNT) - ).not.to.be.reverted(ethers); + ).not.to.be.revert(ethers); const balanceAfter = await ethers.provider.getBalance(signers[0]); expect(balanceAfter).to.gt(balanceBefore); expect(balanceAfter).to.lt(balanceBefore + SYS_SETTINGS.MIN_VOTE_AMOUNT); @@ -470,10 +476,10 @@ describe("Governance", function () { await Governance.registerCandidate(500, PUBKEY, { value: SYS_SETTINGS.REGISTER_FEE }); await expect( Governance.vote(signers[0], { value: SYS_SETTINGS.MIN_VOTE_AMOUNT }) - ).not.to.be.reverted(ethers); + ).not.to.be.revert(ethers); await expect( Governance.revokeVote(SYS_SETTINGS.MIN_VOTE_AMOUNT) - ).not.to.be.reverted(ethers); + ).not.to.be.revert(ethers); expect(await Governance.receivedVotes(signers[0])).to.eq(0); expect(await Governance.votedTo(signers[0])).to.eq(ethers.ZeroAddress); @@ -484,7 +490,7 @@ describe("Governance", function () { await Governance.registerCandidate(500, PUBKEY, { value: SYS_SETTINGS.REGISTER_FEE }); await expect( Governance.vote(signers[0], { value: SYS_SETTINGS.MIN_VOTE_AMOUNT }) - ).not.to.be.reverted(ethers); + ).not.to.be.revert(ethers); await expect( Governance.revokeVote(SYS_SETTINGS.MIN_VOTE_AMOUNT) ).emit(Governance, "Revoke"); @@ -502,7 +508,7 @@ describe("Governance", function () { await Governance.registerCandidate(500, PUBKEY, { value: SYS_SETTINGS.REGISTER_FEE }); await expect( Governance.vote(signers[0], { value: SYS_SETTINGS.MIN_VOTE_AMOUNT }) - ).not.to.be.reverted(ethers); + ).not.to.be.revert(ethers); await expect( Governance.transferVote(signers[0]) @@ -513,7 +519,7 @@ describe("Governance", function () { await Governance.registerCandidate(500, PUBKEY, { value: SYS_SETTINGS.REGISTER_FEE }); await expect( Governance.vote(signers[0], { value: SYS_SETTINGS.MIN_VOTE_AMOUNT }) - ).not.to.be.reverted(ethers); + ).not.to.be.revert(ethers); await expect( Governance.transferVote(signers[1]) @@ -525,11 +531,11 @@ describe("Governance", function () { await Governance.connect(signers[1]).registerCandidate(500, PUBKEY, { value: SYS_SETTINGS.REGISTER_FEE }); await expect( Governance.vote(signers[0], { value: SYS_SETTINGS.MIN_VOTE_AMOUNT }) - ).not.to.be.reverted(ethers); + ).not.to.be.revert(ethers); await expect( Governance.transferVote(signers[1]) - ).not.to.be.reverted(ethers); + ).not.to.be.revert(ethers); expect(await Governance.receivedVotes(signers[0])).to.eq(0); expect(await Governance.receivedVotes(signers[1])).to.eq(SYS_SETTINGS.MIN_VOTE_AMOUNT); @@ -542,15 +548,15 @@ describe("Governance", function () { await Governance.connect(signers[1]).registerCandidate(500, PUBKEY, { value: SYS_SETTINGS.REGISTER_FEE }); await expect( Governance.vote(signers[0], { value: SYS_SETTINGS.MIN_VOTE_AMOUNT }) - ).not.to.be.reverted(ethers); + ).not.to.be.revert(ethers); await expect( Governance.exitCandidate() - ).not.to.be.reverted(ethers); + ).not.to.be.revert(ethers); expect(await Governance.totalVotes()).to.equal(0); await expect( Governance.transferVote(signers[1]) - ).not.to.be.reverted(ethers); + ).not.to.be.revert(ethers); expect(await Governance.totalVotes()).to.equal(SYS_SETTINGS.MIN_VOTE_AMOUNT); }); @@ -559,7 +565,7 @@ describe("Governance", function () { await Governance.connect(signers[1]).registerCandidate(500, PUBKEY, { value: SYS_SETTINGS.REGISTER_FEE }); await expect( Governance.vote(signers[0], { value: SYS_SETTINGS.MIN_VOTE_AMOUNT }) - ).not.to.be.reverted(ethers); + ).not.to.be.revert(ethers); await expect( Governance.transferVote(signers[1]) @@ -580,7 +586,7 @@ describe("Governance", function () { await Governance.connect(signers[i]).registerCandidate(500, PUBKEY, { value: SYS_SETTINGS.REGISTER_FEE }); await Governance.connect(signers[i]).vote(signers[i], { value: SYS_SETTINGS.VOTE_TARGET_AMOUNT }); } - await networkHelpers.mine(SYS_SETTINGS.EPOCH_DURATION); + await networkHelpers.mineUpTo(SYS_SETTINGS.EPOCH_DURATION); await MockSysCall.call_onPersist(Governance); // Send GAS as governance reward and persist it @@ -607,7 +613,7 @@ describe("Governance", function () { for (let i = 1; i < SYS_SETTINGS.CONSENSUS_SIZE; i++) { await Governance.connect(signers[i]).vote(signers[i], { value: SYS_SETTINGS.VOTE_TARGET_AMOUNT }); } - await networkHelpers.mine(SYS_SETTINGS.EPOCH_DURATION); + await networkHelpers.mineUpTo(SYS_SETTINGS.EPOCH_DURATION); await MockSysCall.call_onPersist(Governance); // Send GAS as governance reward and persist it @@ -618,7 +624,7 @@ describe("Governance", function () { await tx.wait(); await expect( MockSysCall.call_onPersist(Governance) - ).to.be.not.reverted(ethers); + ).to.be.not.revert(ethers); }); it("Should transfer back correct reward if all conditions are met", async function () { @@ -627,7 +633,7 @@ describe("Governance", function () { await Governance.connect(signers[i]).registerCandidate(500, PUBKEY, { value: SYS_SETTINGS.REGISTER_FEE }); await Governance.connect(signers[i]).vote(signers[i], { value: SYS_SETTINGS.VOTE_TARGET_AMOUNT }); } - await networkHelpers.mine(SYS_SETTINGS.EPOCH_DURATION); + await networkHelpers.mineUpTo(SYS_SETTINGS.EPOCH_DURATION); await MockSysCall.call_onPersist(Governance); // Send GAS as governance reward and persist it @@ -640,7 +646,7 @@ describe("Governance", function () { await expect( await Governance.claimReward() - ).to.changeEtherBalance(provider, signers[0], 499999999999998000n); + ).to.changeEtherBalance(ethers, signers[0], 499999999999998000n); }); it("Should emit an event when a voter claims", async function () { @@ -649,7 +655,7 @@ describe("Governance", function () { await Governance.connect(signers[i]).registerCandidate(500, PUBKEY, { value: SYS_SETTINGS.REGISTER_FEE }); await Governance.connect(signers[i]).vote(signers[i], { value: SYS_SETTINGS.VOTE_TARGET_AMOUNT }); } - await networkHelpers.mine(SYS_SETTINGS.EPOCH_DURATION); + await networkHelpers.mineUpTo(SYS_SETTINGS.EPOCH_DURATION); await MockSysCall.call_onPersist(Governance); // Send GAS as governance reward and persist it @@ -673,7 +679,7 @@ describe("Governance", function () { await Governance.connect(signers[i]).registerCandidate(500, PUBKEY, { value: SYS_SETTINGS.REGISTER_FEE }); await Governance.connect(signers[i]).vote(signers[i], { value: SYS_SETTINGS.VOTE_TARGET_AMOUNT }); } - await networkHelpers.mine(SYS_SETTINGS.EPOCH_DURATION); + await networkHelpers.mineUpTo(SYS_SETTINGS.EPOCH_DURATION); await MockSysCall.call_onPersist(Governance); // Send GAS as governance reward and persist it diff --git a/contracts/test/GovernanceVote.ts b/contracts/test/GovernanceVote.ts index 85fd00745..eb3a1dc9d 100644 --- a/contracts/test/GovernanceVote.ts +++ b/contracts/test/GovernanceVote.ts @@ -1,86 +1,87 @@ import { expect } from "chai"; import { ERRORS } from "./helpers/errors.js"; -import { ethers, allocGenesis } from "./helpers/setup.js"; +import { ethers, networkHelpers, allocGenesis } from "./helpers/setup.js"; describe("GovernanceVote", function () { - let signers: any; + let MockCaller: any; + let signers: any, snapshot: any; - beforeEach(async function () { + before(async function () { signers = await ethers.getSigners(); await allocGenesis(); + MockCaller = await ethers.deployContract("MockGovVote"); + snapshot = await networkHelpers.takeSnapshot(); }); - describe("needVote", function () { - let Mock: any; - - beforeEach(async function () { - Mock = await ethers.deployContract("MockGovVote"); - }); + afterEach(async function () { + await snapshot.restore(); + }); + describe("needVote", function () { it("Should revert if the sender is not a miner", async function () { await expect( - Mock.connect(signers[7]).changeV(1) - ).to.be.revertedWithCustomError(Mock, ERRORS.NOT_MINER); + MockCaller.connect(signers[7]).changeV(1) + ).to.be.revertedWithCustomError(MockCaller, ERRORS.NOT_MINER); }); it("Should not execute method when threshold is not met", async function () { await expect( - Mock.connect(signers[0]).changeV(1) - ).not.to.be.reverted(ethers); + MockCaller.connect(signers[0]).changeV(1) + ).not.to.be.revert(ethers); - expect(await Mock.v()).to.eq(0); + expect(await MockCaller.v()).to.eq(0); }); it("Should execute method when threshold is met", async function () { for (let i = 0; i < 3; i++) { await expect( - Mock.connect(signers[i]).changeV(1) - ).not.to.be.reverted(ethers); + MockCaller.connect(signers[i]).changeV(1) + ).not.to.be.revert(ethers); } - expect(await Mock.v()).to.eq(0); + expect(await MockCaller.v()).to.eq(0); await expect( - Mock.connect(signers[3]).changeV(1) - ).not.to.be.reverted(ethers); - expect(await Mock.v()).to.eq(1); + MockCaller.connect(signers[3]).changeV(1) + ).not.to.be.revert(ethers); + expect(await MockCaller.v()).to.eq(1); }); it("Should clear all votes after execution", async function () { for (let i = 0; i < 6; i++) { await expect( - Mock.connect(signers[i]).changeV(i % 2) - ).not.to.be.reverted(ethers); + MockCaller.connect(signers[i]).changeV(i % 2) + ).not.to.be.revert(ethers); } await expect( - Mock.connect(signers[6]).changeV(1) - ).not.to.be.reverted(ethers); - expect(await Mock.v()).to.eq(1); + MockCaller.connect(signers[6]).changeV(1) + ).not.to.be.revert(ethers); + expect(await MockCaller.v()).to.eq(1); await expect( - Mock.connect(signers[6]).changeV(0) - ).not.to.be.reverted(ethers); - expect(await Mock.v()).to.eq(1); + MockCaller.connect(signers[6]).changeV(0) + ).not.to.be.revert(ethers); + expect(await MockCaller.v()).to.eq(1); }); it("Should emit an event when a miner votes", async function () { await expect( - Mock.connect(signers[0]).changeV(1) - ).emit(Mock, "Vote"); + MockCaller.connect(signers[0]).changeV(1) + ).emit(MockCaller, "Vote"); }); it("Should emit an event when a vote passes", async function () { for (let i = 0; i < 3; i++) { await expect( - Mock.connect(signers[i]).changeV(1) - ).not.to.be.reverted(ethers); + MockCaller.connect(signers[i]).changeV(1) + ).not.to.be.revert(ethers); } await expect( - Mock.connect(signers[3]).changeV(1) - ).emit(Mock, "Vote") - .emit(Mock, "VotePass"); + MockCaller.connect(signers[3]).changeV(1) + ).emit(MockCaller, "Vote") + .emit(MockCaller, "VotePass"); }); }); }); diff --git a/contracts/test/KeyManagement.ts b/contracts/test/KeyManagement.ts index 266095324..bb85fac77 100644 --- a/contracts/test/KeyManagement.ts +++ b/contracts/test/KeyManagement.ts @@ -9,17 +9,23 @@ describe("KeyManagement", function () { let Governance: any, KeyManagement: any; let MockSysCall: any; - let signers: any; + let signers: any, snapshot: any; - beforeEach(async function () { + before(async function () { signers = await ethers.getSigners(); [Governance, , , KeyManagement] = await allocGenesis(); // Deploy Mock SYS_CALL - const deploy_mock = await ethers.deployContract("MockSysCall"); - const code_mock = await ethers.provider.send("eth_getCode", [deploy_mock.target]); - await ethers.provider.send("hardhat_setCode", [SYS_SETTINGS.SYS_CALL, code_mock]); + const deploy = await ethers.deployContract("MockSysCall"); + const code = await ethers.provider.send("eth_getCode", [deploy.target]); + await ethers.provider.send("hardhat_setCode", [SYS_SETTINGS.SYS_CALL, code]); MockSysCall = await ethers.getContractAt("MockSysCall", SYS_SETTINGS.SYS_CALL, signers[0]); + + snapshot = await networkHelpers.takeSnapshot(); + }); + + afterEach(async function () { + await snapshot.restore(); }); describe("V0", function () { @@ -38,7 +44,7 @@ describe("KeyManagement", function () { }); it("Should revert if period ended", async function () { - await networkHelpers.mine(SYS_SETTINGS.EPOCH_DURATION - SYS_SETTINGS.SHARE_PERIOD); + await networkHelpers.mineUpTo(SYS_SETTINGS.EPOCH_DURATION - SYS_SETTINGS.SHARE_PERIOD); const pvss = "0x0000000000000000000000000000000003ab9bd341da71ed4ac20b8ab75be36d220f62e5b6ad214dca75492e901b8d60c47883e1bc5f1d000f97e3d13619d1f50000000000000000000000000000000019fd3a71c228e90c922a54ed763d93da036a07d1cbf5f3332933bf9f71028f9e2a317cbbefb00b81ae265ca1b02db7f5000000000000000000000000000000000c596b4b55deb26740a6f05feed6ca087446fa40412ab99673e74c2b4403a98336fea0f84009fd91342f816ae1ddf67300000000000000000000000000000000148c12dce8f934865f7497a7459e166391c583a09c56299c0afcfecf48cf0027e2bfb4b519c7bafd2799526eaa6f7f7f0000000000000000000000000000000013b0ca147f9fb6bd12bb33fab34e4a14c3bf7670688c05846253fd9473e803ed641c4930bbb62ac8e7aef8900d5c6f20000000000000000000000000000000000aeb67de0a92dd44c0eb15f82126ebe58285dca3ad45cf6df7e7df35034faf19b3b4e7457d6cf762f95b5753c264abe3000000000000000000000000000000001935f93e06853ad85285590ae2e1f4756f6791650c36803f005f7d635a33cacd97887aeb2f659b7cac8efdd0d6722908000000000000000000000000000000001252bb23f4787f556fc6e06b8db2b28d4dd86706e5d16c25f3e4e57548a73ec0f3979be6747422944ab47e802cab09ee0000000000000000000000000000000008c2bbc57ad3f02d3b7253168734b4c128646790665ee9ffd2b9b6633683ae0b6ee90783341e476d5742d3e8f27b1032000000000000000000000000000000000ca15aad976c6825468b5d2753570a4b1f427afeb38ecf07349a977f6fcb70c1b5058b3560e2c781a4118c1fee41e2390000000000000000000000000000000008de2a1234acdc943bd85ec5c0f3b6509bf33c0c637c85e799190f16200dde6d96b27706de636637a8bea3abac56b17400000000000000000000000000000000117455efe814e0e5ee4a30dd43b8814af4ab452522caf1cb785dba39e730d0c2c67e2669d272083328f62f2688eb3124000000000000000000000000000000001240a888a4b028e22ce032359312a2531262ee9ae20ff396712a253fad663926e35e028bff58bd9b99938ce508592c7d0000000000000000000000000000000002d31f18fcd90ed387fd3ee75abb1b9ce5b60825675cb32fbefe5a4c2f0826b6109a1ed0eda84b1f6485db0469a5dc0800000000000000000000000000000000141573a195ab077c5533a41d970ac35e084edd81d26ae594291cc5310f995e0e0164ef5d3d55de2b6288065dabc64b9000000000000000000000000000000000151538caaf425e0e6f0aee22fab5e4bd587cc1c44b86b71e56a2efd466cc4494d22397edf340be0cd689ce3f73d9f458000000000000000000000000000000000e60c18a39bcc96bb9398fb8d29a994fd4fd72a8f90707d2b6125ac8eed62212d5019774b6687c0893c08a68714d2b1e0000000000000000000000000000000015e55f14a669b335e224bca73f600dde4285dbd6f79cb39ebe2078ca14c94a06d2b82b9cf9ca1787eb2c3ba39a4ea9e4000000000000000000000000000000000949de45cb9c2db2440a50f2dbaddf0b710609a6c514a729ca4bb61b220425df743310cc64d88b1b871d5dd930e658ed0000000000000000000000000000000012e89ee3aaad41e330cc953722291e1e17d0fb59d070774d5034a62cf9eae47355abd816232ecd348b64c68d7888a4c90000000000000000000000000000000012362b567be1ac4aa134216a3850b07a0c15c3ce39627b47bae83ac792c6605c46ce8b1bfe79eac55efeeffa52d48348000000000000000000000000000000001187fca361392788e08be4d1b515d19bee9ca440ac7d30a4c95380bccc13bcb427db905a8be966423a7eafa47e6e29c10000000000000000000000000000000010b6a9bc346fbaadc5bb50a62747ce6f572e477e2676ae9d5fbffaf4dd8b2e8b32687719bb3ada53bb93cf0f2f4a2d06000000000000000000000000000000001310a430a85de13d304b70136eb04d5a4a32266ea8260df7b04d8da841313544809184a68d12216f45031988dbce6d1400000000000000000000000000000000020359764e429605bb958121f0190ee7e19dd8e237ad1c28bf8c0e0a1cb53c0acc7126e70a22e76ac82094839cfd998a000000000000000000000000000000001791682ab4b641102b71ada2748b262763e158bf5a89b113934240c1c5920873e1118bb32f02a88a67e040c1454615c90000000000000000000000000000000019edb8a6438941ef98d1ce5ea2ed638f26675f660445c39dd63a84ded62ed641af08040b83b13ff7d98486742609a3db000000000000000000000000000000000f85c5f46034a02f8cbfdba710729f8253d8c4cba7fd08842ebbad0decb0a2f9205f59961c160f3408f38a3aebea0285000000000000000000000000000000000cf30e7b32436d23b1b125486102b0c14737c17587e8f1928db32337a8c5f3230752370189eb754318bca01f49ca86950000000000000000000000000000000015049194edc9333faf8b17d4b428b4a4b01f8dcd31ebddea7af111e857254dc99bfa892e7dfa11ed8fd32109793e9446"; await expect( @@ -47,7 +53,7 @@ describe("KeyManagement", function () { }); it("Should revert if not a member", async function () { - await networkHelpers.mine(SYS_SETTINGS.EPOCH_DURATION - 2 * SYS_SETTINGS.SHARE_PERIOD); + await networkHelpers.mineUpTo(SYS_SETTINGS.EPOCH_DURATION - 2 * SYS_SETTINGS.SHARE_PERIOD); const pvss = "0x0000000000000000000000000000000003ab9bd341da71ed4ac20b8ab75be36d220f62e5b6ad214dca75492e901b8d60c47883e1bc5f1d000f97e3d13619d1f50000000000000000000000000000000019fd3a71c228e90c922a54ed763d93da036a07d1cbf5f3332933bf9f71028f9e2a317cbbefb00b81ae265ca1b02db7f5000000000000000000000000000000000c596b4b55deb26740a6f05feed6ca087446fa40412ab99673e74c2b4403a98336fea0f84009fd91342f816ae1ddf67300000000000000000000000000000000148c12dce8f934865f7497a7459e166391c583a09c56299c0afcfecf48cf0027e2bfb4b519c7bafd2799526eaa6f7f7f0000000000000000000000000000000013b0ca147f9fb6bd12bb33fab34e4a14c3bf7670688c05846253fd9473e803ed641c4930bbb62ac8e7aef8900d5c6f20000000000000000000000000000000000aeb67de0a92dd44c0eb15f82126ebe58285dca3ad45cf6df7e7df35034faf19b3b4e7457d6cf762f95b5753c264abe3000000000000000000000000000000001935f93e06853ad85285590ae2e1f4756f6791650c36803f005f7d635a33cacd97887aeb2f659b7cac8efdd0d6722908000000000000000000000000000000001252bb23f4787f556fc6e06b8db2b28d4dd86706e5d16c25f3e4e57548a73ec0f3979be6747422944ab47e802cab09ee0000000000000000000000000000000008c2bbc57ad3f02d3b7253168734b4c128646790665ee9ffd2b9b6633683ae0b6ee90783341e476d5742d3e8f27b1032000000000000000000000000000000000ca15aad976c6825468b5d2753570a4b1f427afeb38ecf07349a977f6fcb70c1b5058b3560e2c781a4118c1fee41e2390000000000000000000000000000000008de2a1234acdc943bd85ec5c0f3b6509bf33c0c637c85e799190f16200dde6d96b27706de636637a8bea3abac56b17400000000000000000000000000000000117455efe814e0e5ee4a30dd43b8814af4ab452522caf1cb785dba39e730d0c2c67e2669d272083328f62f2688eb3124000000000000000000000000000000001240a888a4b028e22ce032359312a2531262ee9ae20ff396712a253fad663926e35e028bff58bd9b99938ce508592c7d0000000000000000000000000000000002d31f18fcd90ed387fd3ee75abb1b9ce5b60825675cb32fbefe5a4c2f0826b6109a1ed0eda84b1f6485db0469a5dc0800000000000000000000000000000000141573a195ab077c5533a41d970ac35e084edd81d26ae594291cc5310f995e0e0164ef5d3d55de2b6288065dabc64b9000000000000000000000000000000000151538caaf425e0e6f0aee22fab5e4bd587cc1c44b86b71e56a2efd466cc4494d22397edf340be0cd689ce3f73d9f458000000000000000000000000000000000e60c18a39bcc96bb9398fb8d29a994fd4fd72a8f90707d2b6125ac8eed62212d5019774b6687c0893c08a68714d2b1e0000000000000000000000000000000015e55f14a669b335e224bca73f600dde4285dbd6f79cb39ebe2078ca14c94a06d2b82b9cf9ca1787eb2c3ba39a4ea9e4000000000000000000000000000000000949de45cb9c2db2440a50f2dbaddf0b710609a6c514a729ca4bb61b220425df743310cc64d88b1b871d5dd930e658ed0000000000000000000000000000000012e89ee3aaad41e330cc953722291e1e17d0fb59d070774d5034a62cf9eae47355abd816232ecd348b64c68d7888a4c90000000000000000000000000000000012362b567be1ac4aa134216a3850b07a0c15c3ce39627b47bae83ac792c6605c46ce8b1bfe79eac55efeeffa52d48348000000000000000000000000000000001187fca361392788e08be4d1b515d19bee9ca440ac7d30a4c95380bccc13bcb427db905a8be966423a7eafa47e6e29c10000000000000000000000000000000010b6a9bc346fbaadc5bb50a62747ce6f572e477e2676ae9d5fbffaf4dd8b2e8b32687719bb3ada53bb93cf0f2f4a2d06000000000000000000000000000000001310a430a85de13d304b70136eb04d5a4a32266ea8260df7b04d8da841313544809184a68d12216f45031988dbce6d1400000000000000000000000000000000020359764e429605bb958121f0190ee7e19dd8e237ad1c28bf8c0e0a1cb53c0acc7126e70a22e76ac82094839cfd998a000000000000000000000000000000001791682ab4b641102b71ada2748b262763e158bf5a89b113934240c1c5920873e1118bb32f02a88a67e040c1454615c90000000000000000000000000000000019edb8a6438941ef98d1ce5ea2ed638f26675f660445c39dd63a84ded62ed641af08040b83b13ff7d98486742609a3db000000000000000000000000000000000f85c5f46034a02f8cbfdba710729f8253d8c4cba7fd08842ebbad0decb0a2f9205f59961c160f3408f38a3aebea0285000000000000000000000000000000000cf30e7b32436d23b1b125486102b0c14737c17587e8f1928db32337a8c5f3230752370189eb754318bca01f49ca86950000000000000000000000000000000015049194edc9333faf8b17d4b428b4a4b01f8dcd31ebddea7af111e857254dc99bfa892e7dfa11ed8fd32109793e9446"; await expect( @@ -60,7 +66,7 @@ describe("KeyManagement", function () { await Governance.connect(signers[i]).registerCandidate(500, PUBKEY, { value: SYS_SETTINGS.REGISTER_FEE }); await Governance.connect(signers[i]).vote(signers[i], { value: SYS_SETTINGS.VOTE_TARGET_AMOUNT }); } - await networkHelpers.mine(SYS_SETTINGS.EPOCH_DURATION - 2 * SYS_SETTINGS.SHARE_PERIOD); + await networkHelpers.mineUpTo(SYS_SETTINGS.EPOCH_DURATION - 2 * SYS_SETTINGS.SHARE_PERIOD); await MockSysCall.call_onPersistV2(Governance); const pvss = "0x0000000000000000000000000000000003ab9bd341da71ed4ac20b8ab75be36d220f62e5b6ad214dca75492e901b8d60c47883e1bc5f1d000f97e3d13619d1f50000000000000000000000000000000019fd3a71c228e90c922a54ed763d93da036a07d1cbf5f3332933bf9f71028f9e2a317cbbefb00b81ae265ca1b02db7f5000000000000000000000000000000000c596b4b55deb26740a6f05feed6ca087446fa40412ab99673e74c2b4403a98336fea0f84009fd91342f816ae1ddf67300000000000000000000000000000000148c12dce8f934865f7497a7459e166391c583a09c56299c0afcfecf48cf0027e2bfb4b519c7bafd2799526eaa6f7f7f0000000000000000000000000000000013b0ca147f9fb6bd12bb33fab34e4a14c3bf7670688c05846253fd9473e803ed641c4930bbb62ac8e7aef8900d5c6f20000000000000000000000000000000000aeb67de0a92dd44c0eb15f82126ebe58285dca3ad45cf6df7e7df35034faf19b3b4e7457d6cf762f95b5753c264abe3000000000000000000000000000000001935f93e06853ad85285590ae2e1f4756f6791650c36803f005f7d635a33cacd97887aeb2f659b7cac8efdd0d6722908000000000000000000000000000000001252bb23f4787f556fc6e06b8db2b28d4dd86706e5d16c25f3e4e57548a73ec0f3979be6747422944ab47e802cab09ee0000000000000000000000000000000008c2bbc57ad3f02d3b7253168734b4c128646790665ee9ffd2b9b6633683ae0b6ee90783341e476d5742d3e8f27b1032000000000000000000000000000000000ca15aad976c6825468b5d2753570a4b1f427afeb38ecf07349a977f6fcb70c1b5058b3560e2c781a4118c1fee41e2390000000000000000000000000000000008de2a1234acdc943bd85ec5c0f3b6509bf33c0c637c85e799190f16200dde6d96b27706de636637a8bea3abac56b17400000000000000000000000000000000117455efe814e0e5ee4a30dd43b8814af4ab452522caf1cb785dba39e730d0c2c67e2669d272083328f62f2688eb3124000000000000000000000000000000001240a888a4b028e22ce032359312a2531262ee9ae20ff396712a253fad663926e35e028bff58bd9b99938ce508592c7d0000000000000000000000000000000002d31f18fcd90ed387fd3ee75abb1b9ce5b60825675cb32fbefe5a4c2f0826b6109a1ed0eda84b1f6485db0469a5dc0800000000000000000000000000000000141573a195ab077c5533a41d970ac35e084edd81d26ae594291cc5310f995e0e0164ef5d3d55de2b6288065dabc64b9000000000000000000000000000000000151538caaf425e0e6f0aee22fab5e4bd587cc1c44b86b71e56a2efd466cc4494d22397edf340be0cd689ce3f73d9f458000000000000000000000000000000000e60c18a39bcc96bb9398fb8d29a994fd4fd72a8f90707d2b6125ac8eed62212d5019774b6687c0893c08a68714d2b1e0000000000000000000000000000000015e55f14a669b335e224bca73f600dde4285dbd6f79cb39ebe2078ca14c94a06d2b82b9cf9ca1787eb2c3ba39a4ea9e4000000000000000000000000000000000949de45cb9c2db2440a50f2dbaddf0b710609a6c514a729ca4bb61b220425df743310cc64d88b1b871d5dd930e658ed0000000000000000000000000000000012e89ee3aaad41e330cc953722291e1e17d0fb59d070774d5034a62cf9eae47355abd816232ecd348b64c68d7888a4c90000000000000000000000000000000012362b567be1ac4aa134216a3850b07a0c15c3ce39627b47bae83ac792c6605c46ce8b1bfe79eac55efeeffa52d48348000000000000000000000000000000001187fca361392788e08be4d1b515d19bee9ca440ac7d30a4c95380bccc13bcb427db905a8be966423a7eafa47e6e29c10000000000000000000000000000000010b6a9bc346fbaadc5bb50a62747ce6f572e477e2676ae9d5fbffaf4dd8b2e8b32687719bb3ada53bb93cf0f2f4a2d06000000000000000000000000000000001310a430a85de13d304b70136eb04d5a4a32266ea8260df7b04d8da841313544809184a68d12216f45031988dbce6d1400000000000000000000000000000000020359764e429605bb958121f0190ee7e19dd8e237ad1c28bf8c0e0a1cb53c0acc7126e70a22e76ac82094839cfd998a000000000000000000000000000000001791682ab4b641102b71ada2748b262763e158bf5a89b113934240c1c5920873e1118bb32f02a88a67e040c1454615c90000000000000000000000000000000019edb8a6438941ef98d1ce5ea2ed638f26675f660445c39dd63a84ded62ed641af08040b83b13ff7d98486742609a3db000000000000000000000000000000000f85c5f46034a02f8cbfdba710729f8253d8c4cba7fd08842ebbad0decb0a2f9205f59961c160f3408f38a3aebea0285000000000000000000000000000000000cf30e7b32436d23b1b125486102b0c14737c17587e8f1928db32337a8c5f3230752370189eb754318bca01f49ca86950000000000000000000000000000000015049194edc9333faf8b17d4b428b4a4b01f8dcd31ebddea7af111e857254dc99bfa892e7dfa11ed8fd32109793e9446"; @@ -74,7 +80,7 @@ describe("KeyManagement", function () { await Governance.connect(signers[i]).registerCandidate(500, PUBKEY, { value: SYS_SETTINGS.REGISTER_FEE }); await Governance.connect(signers[i]).vote(signers[i], { value: SYS_SETTINGS.VOTE_TARGET_AMOUNT }); } - await networkHelpers.mine(SYS_SETTINGS.EPOCH_DURATION - 2 * SYS_SETTINGS.SHARE_PERIOD); + await networkHelpers.mineUpTo(SYS_SETTINGS.EPOCH_DURATION - 2 * SYS_SETTINGS.SHARE_PERIOD); await MockSysCall.call_onPersistV2(Governance); const pvss = "0x0000000000000000000000000000000003ab9bd341da71ed4ac20b8ab75be36d220f62e5b6ad214dca75492e901b8d60c47883e1bc5f1d000f97e3d13619d1f50000000000000000000000000000000019fd3a71c228e90c922a54ed763d93da036a07d1cbf5f3332933bf9f71028f9e2a317cbbefb00b81ae265ca1b02db7f5000000000000000000000000000000000c596b4b55deb26740a6f05feed6ca087446fa40412ab99673e74c2b4403a98336fea0f84009fd91342f816ae1ddf67300000000000000000000000000000000148c12dce8f934865f7497a7459e166391c583a09c56299c0afcfecf48cf0027e2bfb4b519c7bafd2799526eaa6f7f7f0000000000000000000000000000000013b0ca147f9fb6bd12bb33fab34e4a14c3bf7670688c05846253fd9473e803ed641c4930bbb62ac8e7aef8900d5c6f20000000000000000000000000000000000aeb67de0a92dd44c0eb15f82126ebe58285dca3ad45cf6df7e7df35034faf19b3b4e7457d6cf762f95b5753c264abe3000000000000000000000000000000001935f93e06853ad85285590ae2e1f4756f6791650c36803f005f7d635a33cacd97887aeb2f659b7cac8efdd0d6722908000000000000000000000000000000001252bb23f4787f556fc6e06b8db2b28d4dd86706e5d16c25f3e4e57548a73ec0f3979be6747422944ab47e802cab09ee0000000000000000000000000000000008c2bbc57ad3f02d3b7253168734b4c128646790665ee9ffd2b9b6633683ae0b6ee90783341e476d5742d3e8f27b1032000000000000000000000000000000000ca15aad976c6825468b5d2753570a4b1f427afeb38ecf07349a977f6fcb70c1b5058b3560e2c781a4118c1fee41e2390000000000000000000000000000000013bc8eb9df3e0b988f88ee4104a4ecc83948503390561a5e142d9520addb2eebf6967fd9a0032c31c60a31c926a436e700000000000000000000000000000000154f5bad780e417953cd64febc97cacf55fb8bb80dd4ab27ecd094bbe3f303e7cece08a67f44453f13b6c9c8c6b79fac00000000000000000000000000000000052b40f696dc0ecc31517aaad1d83e89bdd35fa9a6ad67aacc4938802a6bc37c1e842e4357b5f1d44f4166ae2aa1be150000000000000000000000000000000016ebb24736e68909b9bba65fd33c4705105274e211e17d2e9c95900b011f47731e3d524d6d9302b639e5e2add1eb6a58000000000000000000000000000000000d1c1096916f657b00caf07bf8970d0215619734541c09a8ba158bcadbd45a9584be3b2b43eb703a3539a699d18e9d1c000000000000000000000000000000000b16d99dae0345801d8c56894340e84deb970c5fe05698ece5ce071c8c68cd7374d3fc60a2eb0a623335e14b61ae0211000000000000000000000000000000000e60c18a39bcc96bb9398fb8d29a994fd4fd72a8f90707d2b6125ac8eed62212d5019774b6687c0893c08a68714d2b1e0000000000000000000000000000000015e55f14a669b335e224bca73f600dde4285dbd6f79cb39ebe2078ca14c94a06d2b82b9cf9ca1787eb2c3ba39a4ea9e4000000000000000000000000000000000949de45cb9c2db2440a50f2dbaddf0b710609a6c514a729ca4bb61b220425df743310cc64d88b1b871d5dd930e658ed0000000000000000000000000000000012e89ee3aaad41e330cc953722291e1e17d0fb59d070774d5034a62cf9eae47355abd816232ecd348b64c68d7888a4c90000000000000000000000000000000012362b567be1ac4aa134216a3850b07a0c15c3ce39627b47bae83ac792c6605c46ce8b1bfe79eac55efeeffa52d48348000000000000000000000000000000001187fca361392788e08be4d1b515d19bee9ca440ac7d30a4c95380bccc13bcb427db905a8be966423a7eafa47e6e29c10000000000000000000000000000000010b6a9bc346fbaadc5bb50a62747ce6f572e477e2676ae9d5fbffaf4dd8b2e8b32687719bb3ada53bb93cf0f2f4a2d06000000000000000000000000000000001310a430a85de13d304b70136eb04d5a4a32266ea8260df7b04d8da841313544809184a68d12216f45031988dbce6d1400000000000000000000000000000000020359764e429605bb958121f0190ee7e19dd8e237ad1c28bf8c0e0a1cb53c0acc7126e70a22e76ac82094839cfd998a000000000000000000000000000000001791682ab4b641102b71ada2748b262763e158bf5a89b113934240c1c5920873e1118bb32f02a88a67e040c1454615c90000000000000000000000000000000019edb8a6438941ef98d1ce5ea2ed638f26675f660445c39dd63a84ded62ed641af08040b83b13ff7d98486742609a3db000000000000000000000000000000000f85c5f46034a02f8cbfdba710729f8253d8c4cba7fd08842ebbad0decb0a2f9205f59961c160f3408f38a3aebea0285000000000000000000000000000000000cf30e7b32436d23b1b125486102b0c14737c17587e8f1928db32337a8c5f3230752370189eb754318bca01f49ca86950000000000000000000000000000000015049194edc9333faf8b17d4b428b4a4b01f8dcd31ebddea7af111e857254dc99bfa892e7dfa11ed8fd32109793e9446"; @@ -88,13 +94,13 @@ describe("KeyManagement", function () { await Governance.connect(signers[i]).registerCandidate(500, PUBKEY, { value: SYS_SETTINGS.REGISTER_FEE }); await Governance.connect(signers[i]).vote(signers[i], { value: SYS_SETTINGS.VOTE_TARGET_AMOUNT }); } - await networkHelpers.mine(SYS_SETTINGS.EPOCH_DURATION - 2 * SYS_SETTINGS.SHARE_PERIOD); + await networkHelpers.mineUpTo(SYS_SETTINGS.EPOCH_DURATION - 2 * SYS_SETTINGS.SHARE_PERIOD); await MockSysCall.call_onPersistV2(Governance); const pvss = "0x0000000000000000000000000000000003ab9bd341da71ed4ac20b8ab75be36d220f62e5b6ad214dca75492e901b8d60c47883e1bc5f1d000f97e3d13619d1f50000000000000000000000000000000019fd3a71c228e90c922a54ed763d93da036a07d1cbf5f3332933bf9f71028f9e2a317cbbefb00b81ae265ca1b02db7f5000000000000000000000000000000000c596b4b55deb26740a6f05feed6ca087446fa40412ab99673e74c2b4403a98336fea0f84009fd91342f816ae1ddf67300000000000000000000000000000000148c12dce8f934865f7497a7459e166391c583a09c56299c0afcfecf48cf0027e2bfb4b519c7bafd2799526eaa6f7f7f0000000000000000000000000000000013b0ca147f9fb6bd12bb33fab34e4a14c3bf7670688c05846253fd9473e803ed641c4930bbb62ac8e7aef8900d5c6f20000000000000000000000000000000000aeb67de0a92dd44c0eb15f82126ebe58285dca3ad45cf6df7e7df35034faf19b3b4e7457d6cf762f95b5753c264abe3000000000000000000000000000000001935f93e06853ad85285590ae2e1f4756f6791650c36803f005f7d635a33cacd97887aeb2f659b7cac8efdd0d6722908000000000000000000000000000000001252bb23f4787f556fc6e06b8db2b28d4dd86706e5d16c25f3e4e57548a73ec0f3979be6747422944ab47e802cab09ee0000000000000000000000000000000008c2bbc57ad3f02d3b7253168734b4c128646790665ee9ffd2b9b6633683ae0b6ee90783341e476d5742d3e8f27b1032000000000000000000000000000000000ca15aad976c6825468b5d2753570a4b1f427afeb38ecf07349a977f6fcb70c1b5058b3560e2c781a4118c1fee41e2390000000000000000000000000000000008de2a1234acdc943bd85ec5c0f3b6509bf33c0c637c85e799190f16200dde6d96b27706de636637a8bea3abac56b17400000000000000000000000000000000117455efe814e0e5ee4a30dd43b8814af4ab452522caf1cb785dba39e730d0c2c67e2669d272083328f62f2688eb3124000000000000000000000000000000001240a888a4b028e22ce032359312a2531262ee9ae20ff396712a253fad663926e35e028bff58bd9b99938ce508592c7d0000000000000000000000000000000002d31f18fcd90ed387fd3ee75abb1b9ce5b60825675cb32fbefe5a4c2f0826b6109a1ed0eda84b1f6485db0469a5dc0800000000000000000000000000000000141573a195ab077c5533a41d970ac35e084edd81d26ae594291cc5310f995e0e0164ef5d3d55de2b6288065dabc64b9000000000000000000000000000000000151538caaf425e0e6f0aee22fab5e4bd587cc1c44b86b71e56a2efd466cc4494d22397edf340be0cd689ce3f73d9f458000000000000000000000000000000000e60c18a39bcc96bb9398fb8d29a994fd4fd72a8f90707d2b6125ac8eed62212d5019774b6687c0893c08a68714d2b1e0000000000000000000000000000000015e55f14a669b335e224bca73f600dde4285dbd6f79cb39ebe2078ca14c94a06d2b82b9cf9ca1787eb2c3ba39a4ea9e4000000000000000000000000000000000949de45cb9c2db2440a50f2dbaddf0b710609a6c514a729ca4bb61b220425df743310cc64d88b1b871d5dd930e658ed0000000000000000000000000000000012e89ee3aaad41e330cc953722291e1e17d0fb59d070774d5034a62cf9eae47355abd816232ecd348b64c68d7888a4c90000000000000000000000000000000012362b567be1ac4aa134216a3850b07a0c15c3ce39627b47bae83ac792c6605c46ce8b1bfe79eac55efeeffa52d48348000000000000000000000000000000001187fca361392788e08be4d1b515d19bee9ca440ac7d30a4c95380bccc13bcb427db905a8be966423a7eafa47e6e29c10000000000000000000000000000000010b6a9bc346fbaadc5bb50a62747ce6f572e477e2676ae9d5fbffaf4dd8b2e8b32687719bb3ada53bb93cf0f2f4a2d06000000000000000000000000000000001310a430a85de13d304b70136eb04d5a4a32266ea8260df7b04d8da841313544809184a68d12216f45031988dbce6d1400000000000000000000000000000000020359764e429605bb958121f0190ee7e19dd8e237ad1c28bf8c0e0a1cb53c0acc7126e70a22e76ac82094839cfd998a000000000000000000000000000000001791682ab4b641102b71ada2748b262763e158bf5a89b113934240c1c5920873e1118bb32f02a88a67e040c1454615c90000000000000000000000000000000019edb8a6438941ef98d1ce5ea2ed638f26675f660445c39dd63a84ded62ed641af08040b83b13ff7d98486742609a3db000000000000000000000000000000000f85c5f46034a02f8cbfdba710729f8253d8c4cba7fd08842ebbad0decb0a2f9205f59961c160f3408f38a3aebea0285000000000000000000000000000000000cf30e7b32436d23b1b125486102b0c14737c17587e8f1928db32337a8c5f3230752370189eb754318bca01f49ca86950000000000000000000000000000000015049194edc9333faf8b17d4b428b4a4b01f8dcd31ebddea7af111e857254dc99bfa892e7dfa11ed8fd32109793e9446"; await expect( KeyManagement.connect(signers[0]).share(pvss, ["0x", "0x", "0x", "0x", "0x", "0x", "0x"]) - ).not.to.be.reverted(ethers); + ).not.to.be.revert(ethers); }); }); @@ -104,7 +110,7 @@ describe("KeyManagement", function () { await Governance.connect(signers[i]).registerCandidate(500, PUBKEY, { value: SYS_SETTINGS.REGISTER_FEE }); await Governance.connect(signers[i]).vote(signers[i], { value: SYS_SETTINGS.VOTE_TARGET_AMOUNT }); } - await networkHelpers.mine(SYS_SETTINGS.EPOCH_DURATION - 2 * SYS_SETTINGS.SHARE_PERIOD); + await networkHelpers.mineUpTo(SYS_SETTINGS.EPOCH_DURATION - 2 * SYS_SETTINGS.SHARE_PERIOD); await MockSysCall.call_onPersistV2(Governance); const pvss = "0x0000000000000000000000000000000003ab9bd341da71ed4ac20b8ab75be36d220f62e5b6ad214dca75492e901b8d60c47883e1bc5f1d000f97e3d13619d1f50000000000000000000000000000000019fd3a71c228e90c922a54ed763d93da036a07d1cbf5f3332933bf9f71028f9e2a317cbbefb00b81ae265ca1b02db7f5000000000000000000000000000000000c596b4b55deb26740a6f05feed6ca087446fa40412ab99673e74c2b4403a98336fea0f84009fd91342f816ae1ddf67300000000000000000000000000000000148c12dce8f934865f7497a7459e166391c583a09c56299c0afcfecf48cf0027e2bfb4b519c7bafd2799526eaa6f7f7f0000000000000000000000000000000013b0ca147f9fb6bd12bb33fab34e4a14c3bf7670688c05846253fd9473e803ed641c4930bbb62ac8e7aef8900d5c6f20000000000000000000000000000000000aeb67de0a92dd44c0eb15f82126ebe58285dca3ad45cf6df7e7df35034faf19b3b4e7457d6cf762f95b5753c264abe3000000000000000000000000000000001935f93e06853ad85285590ae2e1f4756f6791650c36803f005f7d635a33cacd97887aeb2f659b7cac8efdd0d6722908000000000000000000000000000000001252bb23f4787f556fc6e06b8db2b28d4dd86706e5d16c25f3e4e57548a73ec0f3979be6747422944ab47e802cab09ee0000000000000000000000000000000008c2bbc57ad3f02d3b7253168734b4c128646790665ee9ffd2b9b6633683ae0b6ee90783341e476d5742d3e8f27b1032000000000000000000000000000000000ca15aad976c6825468b5d2753570a4b1f427afeb38ecf07349a977f6fcb70c1b5058b3560e2c781a4118c1fee41e2390000000000000000000000000000000008de2a1234acdc943bd85ec5c0f3b6509bf33c0c637c85e799190f16200dde6d96b27706de636637a8bea3abac56b17400000000000000000000000000000000117455efe814e0e5ee4a30dd43b8814af4ab452522caf1cb785dba39e730d0c2c67e2669d272083328f62f2688eb3124000000000000000000000000000000001240a888a4b028e22ce032359312a2531262ee9ae20ff396712a253fad663926e35e028bff58bd9b99938ce508592c7d0000000000000000000000000000000002d31f18fcd90ed387fd3ee75abb1b9ce5b60825675cb32fbefe5a4c2f0826b6109a1ed0eda84b1f6485db0469a5dc0800000000000000000000000000000000141573a195ab077c5533a41d970ac35e084edd81d26ae594291cc5310f995e0e0164ef5d3d55de2b6288065dabc64b9000000000000000000000000000000000151538caaf425e0e6f0aee22fab5e4bd587cc1c44b86b71e56a2efd466cc4494d22397edf340be0cd689ce3f73d9f458000000000000000000000000000000000e60c18a39bcc96bb9398fb8d29a994fd4fd72a8f90707d2b6125ac8eed62212d5019774b6687c0893c08a68714d2b1e0000000000000000000000000000000015e55f14a669b335e224bca73f600dde4285dbd6f79cb39ebe2078ca14c94a06d2b82b9cf9ca1787eb2c3ba39a4ea9e4000000000000000000000000000000000949de45cb9c2db2440a50f2dbaddf0b710609a6c514a729ca4bb61b220425df743310cc64d88b1b871d5dd930e658ed0000000000000000000000000000000012e89ee3aaad41e330cc953722291e1e17d0fb59d070774d5034a62cf9eae47355abd816232ecd348b64c68d7888a4c90000000000000000000000000000000012362b567be1ac4aa134216a3850b07a0c15c3ce39627b47bae83ac792c6605c46ce8b1bfe79eac55efeeffa52d48348000000000000000000000000000000001187fca361392788e08be4d1b515d19bee9ca440ac7d30a4c95380bccc13bcb427db905a8be966423a7eafa47e6e29c10000000000000000000000000000000010b6a9bc346fbaadc5bb50a62747ce6f572e477e2676ae9d5fbffaf4dd8b2e8b32687719bb3ada53bb93cf0f2f4a2d06000000000000000000000000000000001310a430a85de13d304b70136eb04d5a4a32266ea8260df7b04d8da841313544809184a68d12216f45031988dbce6d1400000000000000000000000000000000020359764e429605bb958121f0190ee7e19dd8e237ad1c28bf8c0e0a1cb53c0acc7126e70a22e76ac82094839cfd998a000000000000000000000000000000001791682ab4b641102b71ada2748b262763e158bf5a89b113934240c1c5920873e1118bb32f02a88a67e040c1454615c90000000000000000000000000000000019edb8a6438941ef98d1ce5ea2ed638f26675f660445c39dd63a84ded62ed641af08040b83b13ff7d98486742609a3db000000000000000000000000000000000f85c5f46034a02f8cbfdba710729f8253d8c4cba7fd08842ebbad0decb0a2f9205f59961c160f3408f38a3aebea0285000000000000000000000000000000000cf30e7b32436d23b1b125486102b0c14737c17587e8f1928db32337a8c5f3230752370189eb754318bca01f49ca86950000000000000000000000000000000015049194edc9333faf8b17d4b428b4a4b01f8dcd31ebddea7af111e857254dc99bfa892e7dfa11ed8fd32109793e9446"; @@ -185,7 +191,7 @@ describe("KeyManagement", function () { for (let i = 0; i < pubkeys.length; i++) { await expect( KeyManagement.mockMessageKey(SYS_SETTINGS.STANDBY_VALIDATORS[i], pubkeys[i]) - ).not.to.be.reverted(ethers); + ).not.to.be.revert(ethers); } await KeyManagement.verifyShareProof( pvss, @@ -228,7 +234,7 @@ describe("KeyManagement", function () { for (let i = 0; i < pubkeys.length; i++) { await expect( KeyManagement.mockMessageKey(SYS_SETTINGS.STANDBY_VALIDATORS[i], pubkeys[i]) - ).not.to.be.reverted(ethers); + ).not.to.be.revert(ethers); } await KeyManagement.mockPVSS( [1], @@ -278,7 +284,7 @@ describe("KeyManagement", function () { for (let i = 0; i < pubkeys.length; i++) { await expect( KeyManagement.mockMessageKey(SYS_SETTINGS.STANDBY_VALIDATORS[i], pubkeys[i]) - ).not.to.be.reverted(ethers); + ).not.to.be.revert(ethers); } await KeyManagement.mockPVSS( [1, 2], diff --git a/contracts/test/Policy.ts b/contracts/test/Policy.ts index 10ed307cc..6f5443d63 100644 --- a/contracts/test/Policy.ts +++ b/contracts/test/Policy.ts @@ -1,6 +1,6 @@ import { expect } from "chai"; import { ERRORS } from "./helpers/errors.js"; -import { SYS_SETTINGS, ethers, allocGenesis } from "./helpers/setup.js"; +import { SYS_SETTINGS, ethers, networkHelpers, allocGenesis } from "./helpers/setup.js"; // MOCK PUBKEYS const PUBKEY = "0x04a8c8762d32477f5bd0ccff58d35a7b7ace2fbbd0c0d61874bd405bc0af415690d16f585bcec5f51d1fdddfd0d4543cb0a9d40f0447b62a7c4b1a0f24c45ccb01"; @@ -8,11 +8,16 @@ const PUBKEY = "0x04a8c8762d32477f5bd0ccff58d35a7b7ace2fbbd0c0d61874bd405bc0af41 describe("Policy", function () { let Policy: any, Governance: any; - let signers: any; + let signers: any, snapshot: any; - beforeEach(async function () { + before(async function () { signers = await ethers.getSigners(); [Governance, , Policy,] = await allocGenesis(); + snapshot = await networkHelpers.takeSnapshot(); + }); + + afterEach(async function () { + await snapshot.restore(); }); describe("genesis", function () { @@ -39,7 +44,7 @@ describe("Policy", function () { for (let i = 0; i < 3; i++) { await expect( Policy.connect(signers[i]).addBlackList(signers[0]) - ).not.to.be.reverted(ethers); + ).not.to.be.revert(ethers); } await expect( Policy.connect(signers[3]).addBlackList(signers[0]) @@ -50,7 +55,7 @@ describe("Policy", function () { for (let i = 0; i < 4; i++) { await expect( Policy.connect(signers[i]).addBlackList(signers[0]) - ).not.to.be.reverted(ethers); + ).not.to.be.revert(ethers); } expect(await Policy.isBlackListed(signers[0])).to.eq(true); }); @@ -59,7 +64,7 @@ describe("Policy", function () { for (let i = 0; i < 3; i++) { await expect( Policy.connect(signers[i]).addBlackList(signers[0]) - ).not.to.be.reverted(ethers); + ).not.to.be.revert(ethers); } await expect( Policy.connect(signers[3]).addBlackList(signers[0]) @@ -71,7 +76,7 @@ describe("Policy", function () { for (let i = 0; i < 3; i++) { await expect( Policy.connect(signers[i]).addBlackList(signers[7]) - ).not.to.be.reverted(ethers); + ).not.to.be.revert(ethers); } await expect( Policy.connect(signers[3]).addBlackList(signers[7]) @@ -90,7 +95,7 @@ describe("Policy", function () { for (let i = 0; i < 3; i++) { await expect( Policy.connect(signers[i]).removeBlackList(signers[0]) - ).not.to.be.reverted(ethers); + ).not.to.be.revert(ethers); } await expect( Policy.connect(signers[3]).removeBlackList(signers[0]) @@ -102,7 +107,7 @@ describe("Policy", function () { for (let i = 0; i < 4; i++) { await expect( Policy.connect(signers[i]).removeBlackList(signers[0]) - ).not.to.be.reverted(ethers); + ).not.to.be.revert(ethers); } expect(await Policy.isBlackListed(signers[0])).to.eq(false); }); @@ -112,7 +117,7 @@ describe("Policy", function () { for (let i = 0; i < 3; i++) { await expect( Policy.connect(signers[i]).removeBlackList(signers[0]) - ).not.to.be.reverted(ethers); + ).not.to.be.revert(ethers); } await expect( Policy.connect(signers[3]).removeBlackList(signers[0]) @@ -124,7 +129,7 @@ describe("Policy", function () { for (let i = 0; i < 3; i++) { await expect( Policy.connect(signers[i]).addBlackList(signers[7]) - ).not.to.be.reverted(ethers); + ).not.to.be.revert(ethers); } await expect( Policy.connect(signers[3]).addBlackList(signers[7]) @@ -133,7 +138,7 @@ describe("Policy", function () { for (let i = 0; i < 3; i++) { await expect( Policy.connect(signers[i]).removeBlackList(signers[7]) - ).not.to.be.reverted(ethers); + ).not.to.be.revert(ethers); } await expect( Policy.connect(signers[3]).removeBlackList(signers[7]) @@ -152,7 +157,7 @@ describe("Policy", function () { for (let i = 0; i < 3; i++) { await expect( Policy.connect(signers[i]).setMinGasTipCap(0) - ).not.to.be.reverted(ethers); + ).not.to.be.revert(ethers); } await expect( Policy.connect(signers[3]).setMinGasTipCap(0) @@ -163,7 +168,7 @@ describe("Policy", function () { for (let i = 0; i < 4; i++) { await expect( Policy.connect(signers[i]).setMinGasTipCap(ethers.parseEther("1")) - ).not.to.be.reverted(ethers); + ).not.to.be.revert(ethers); } expect(await Policy.minGasTipCap()).to.eq(ethers.parseEther("1")); }); @@ -172,7 +177,7 @@ describe("Policy", function () { for (let i = 0; i < 3; i++) { await expect( Policy.connect(signers[i]).setMinGasTipCap(ethers.parseEther("1")) - ).not.to.be.reverted(ethers); + ).not.to.be.revert(ethers); } await expect( Policy.connect(signers[3]).setMinGasTipCap(ethers.parseEther("1")) @@ -191,7 +196,7 @@ describe("Policy", function () { for (let i = 0; i < 3; i++) { await expect( Policy.connect(signers[i]).setBaseFee(0) - ).not.to.be.reverted(ethers); + ).not.to.be.revert(ethers); } await expect( Policy.connect(signers[3]).setBaseFee(0) @@ -202,7 +207,7 @@ describe("Policy", function () { for (let i = 0; i < 4; i++) { await expect( Policy.connect(signers[i]).setBaseFee(ethers.parseEther("1")) - ).not.to.be.reverted(ethers); + ).not.to.be.revert(ethers); } expect(await Policy.baseFee()).to.eq(ethers.parseEther("1")); }); @@ -211,7 +216,7 @@ describe("Policy", function () { for (let i = 0; i < 3; i++) { await expect( Policy.connect(signers[i]).setBaseFee(ethers.parseEther("1")) - ).not.to.be.reverted(ethers); + ).not.to.be.revert(ethers); } await expect( Policy.connect(signers[3]).setBaseFee(ethers.parseEther("1")) @@ -230,7 +235,7 @@ describe("Policy", function () { for (let i = 0; i < 3; i++) { await expect( Policy.connect(signers[i]).setCandidateLimit(6) - ).not.to.be.reverted(ethers); + ).not.to.be.revert(ethers); } await expect( Policy.connect(signers[3]).setCandidateLimit(6) @@ -241,7 +246,7 @@ describe("Policy", function () { for (let i = 0; i < 4; i++) { await expect( Policy.connect(signers[i]).setCandidateLimit(2001) - ).not.to.be.reverted(ethers); + ).not.to.be.revert(ethers); } expect(await Policy.getCandidateLimit()).to.eq(2001); }); @@ -250,7 +255,7 @@ describe("Policy", function () { for (let i = 0; i < 3; i++) { await expect( Policy.connect(signers[i]).setCandidateLimit(2001) - ).not.to.be.reverted(ethers); + ).not.to.be.revert(ethers); } await expect( Policy.connect(signers[3]).setCandidateLimit(2001) diff --git a/contracts/test/Treasury.ts b/contracts/test/Treasury.ts index 5d3cad724..62064b455 100644 --- a/contracts/test/Treasury.ts +++ b/contracts/test/Treasury.ts @@ -1,57 +1,57 @@ import { expect } from "chai"; import { ERRORS } from "./helpers/errors.js"; -import { ethers, SYS_SETTINGS, allocGenesis } from "./helpers/setup.js"; +import { ethers, SYS_SETTINGS, allocGenesis, networkHelpers } from "./helpers/setup.js"; describe("Treasury", function () { - let Treasury: any; - let signers: any; + let Treasury: any, MockBridge: any; + let signers: any, snapshot: any; - beforeEach(async function () { + before(async function () { signers = await ethers.getSigners(); await allocGenesis(); + // Deploy Treasury and MockBridge Treasury = await ethers.deployContract("Treasury"); - }); - - describe("fundBridge", function () { - let Mock: any; + await ethers.provider.send("hardhat_setBalance", [Treasury.target, ethers.toBeHex(ethers.parseEther("1"), 32)]); - beforeEach(async function () { - const mock_deploy = await ethers.deployContract("MockBridge"); + const deploy = await ethers.deployContract("MockBridge"); + const code = await ethers.provider.send("eth_getCode", [deploy.target]); + await ethers.provider.send("hardhat_setCode", [SYS_SETTINGS.BRIDGE_PROXY, code]); + MockBridge = await ethers.getContractAt("MockBridge", SYS_SETTINGS.BRIDGE_PROXY, signers[0]); + await ethers.provider.send("hardhat_setStorageAt", [SYS_SETTINGS.BRIDGE_PROXY, "0x0", ethers.toBeHex(Treasury.target, 32)]); - // Copy Bytecode to native address - const mock_code = await ethers.provider.send("eth_getCode", [mock_deploy.target]); - await ethers.provider.send("hardhat_setCode", [SYS_SETTINGS.BRIDGE_PROXY, mock_code]); - Mock = await ethers.getContractAt("MockBridge", SYS_SETTINGS.BRIDGE_PROXY, signers[0]); + snapshot = await networkHelpers.takeSnapshot(); + }); - await ethers.provider.send("hardhat_setStorageAt", [SYS_SETTINGS.BRIDGE_PROXY, "0x0", ethers.toBeHex(Treasury.target, 32)]); - await ethers.provider.send("hardhat_setBalance", [Treasury.target, ethers.toBeHex(ethers.parseEther("1"), 32)]); - }); + afterEach(async function () { + await snapshot.restore(); + }); + describe("fundBridge", function () { it("Should not release GAS when threshold is not met", async function () { await expect( Treasury.connect(signers[0]).fundBridge(ethers.parseEther("1")) - ).not.to.be.reverted(ethers); + ).not.to.be.revert(ethers); - expect(await ethers.provider.getBalance(Mock.target)).to.eq(0); + expect(await ethers.provider.getBalance(MockBridge.target)).to.eq(0); }); it("Should release GAS if meets the threshold", async function () { for (let i = 0; i < 4; i++) { await expect( Treasury.connect(signers[i]).fundBridge(ethers.parseEther("1")) - ).not.to.be.reverted(ethers); + ).not.to.be.revert(ethers); } - expect(await ethers.provider.getBalance(Mock.target)).to.eq(ethers.parseEther("1")); + expect(await ethers.provider.getBalance(MockBridge.target)).to.eq(ethers.parseEther("1")); }); it("Should revert if transfer fails", async function () { for (let i = 0; i < 3; i++) { await expect( Treasury.connect(signers[i]).fundBridge(ethers.parseEther("10")) - ).not.to.be.reverted(ethers); + ).not.to.be.revert(ethers); } await expect( @@ -63,7 +63,7 @@ describe("Treasury", function () { for (let i = 0; i < 3; i++) { await expect( Treasury.connect(signers[i]).fundBridge(ethers.parseEther("1")) - ).not.to.be.reverted(ethers); + ).not.to.be.revert(ethers); } await expect( @@ -71,4 +71,4 @@ describe("Treasury", function () { ).emit(Treasury, "BridgeFund"); }); }); -}); \ No newline at end of file +}); diff --git a/contracts/test/helpers/setup.ts b/contracts/test/helpers/setup.ts index 5af22b1e6..7efdf3132 100644 --- a/contracts/test/helpers/setup.ts +++ b/contracts/test/helpers/setup.ts @@ -37,9 +37,6 @@ export const allocGenesis = async () => { // Signers const signers = await ethers.getSigners(); - // Reset blockchain state - await ethers.provider.send("hardhat_reset"); - // Deploy Governance contract const governance_deploy = await ethers.deployContract("Governance"); const reward_deploy = await ethers.deployContract("GovReward");