Skip to content

Commit 491f703

Browse files
committed
Add dissolve hotfix contract and test
1 parent fb7d9c4 commit 491f703

File tree

3 files changed

+150
-0
lines changed

3 files changed

+150
-0
lines changed
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
// SPDX-License-Identifier: GPL-3.0-only
2+
pragma solidity 0.8.30;
3+
4+
import {RocketStorageInterface} from "../../interface/RocketStorageInterface.sol";
5+
import {RocketBase} from "../RocketBase.sol";
6+
7+
/// @notice v1.4 Saturn 1 dissolve parameter hotfix upgrade contract
8+
contract RocketUpgradeOneDotFourDissolveHotfix is RocketBase {
9+
// Whether the upgrade has been performed or not
10+
bool internal executed = false;
11+
12+
// The deployer address
13+
address internal deployer;
14+
15+
// Construct
16+
constructor(
17+
RocketStorageInterface _rocketStorageAddress
18+
) RocketBase(_rocketStorageAddress) {
19+
// Version
20+
version = 1;
21+
deployer = msg.sender;
22+
}
23+
24+
/// @notice Returns the address of the RocketStorage contract
25+
function getRocketStorageAddress() external view returns (address) {
26+
return address(rocketStorage);
27+
}
28+
29+
/// @notice Once this contract has been voted in by oDAO, guardian can perform the upgrade
30+
function execute() external onlyGuardian {
31+
require(!executed, "Already executed");
32+
executed = true;
33+
34+
// Bypass guardrails and set "megapool.time.before.dissolve" to 1 year
35+
bytes32 settingNameSpace = keccak256(abi.encodePacked("dao.protocol.setting.", "megapool"));
36+
setUint(keccak256(abi.encodePacked(settingNameSpace, "megapool.time.before.dissolve")), 365 days);
37+
}
38+
}

test-upgrade/rocket-upgrade-tests.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import minipoolTests from './tests/minipool-tests';
55
import stakingTests from './tests/staking-tests';
66
import miscTests from './tests/misc-tests';
77
import rewardsTests from './tests/rewards-tests';
8+
import hotfixTests from './tests/hotfix-tests';
89

910
injectBNHelpers();
1011
beforeEach(startSnapShot);
@@ -14,3 +15,4 @@ minipoolTests()
1415
stakingTests()
1516
miscTests()
1617
rewardsTests()
18+
hotfixTests()

test-upgrade/tests/hotfix-tests.js

Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
import { assertBN } from '../../test/_helpers/bn';
2+
import { before, beforeEach, describe, it } from 'mocha';
3+
import { globalSnapShot } from '../../test/_utils/snapshotting';
4+
import { deployUpgrade, executeUpgrade } from '../_helpers/upgrade';
5+
import {
6+
artifacts, RocketDAONodeTrusted, RocketDAONodeTrustedUpgrade,
7+
RocketDAOProtocolSettingsDeposit,
8+
RocketDAOProtocolSettingsMegapool,
9+
RocketDAOProtocolSettingsMinipool,
10+
RocketDAOProtocolSettingsNetwork,
11+
RocketDAOProtocolSettingsNode,
12+
RocketDAOProtocolSettingsProposals,
13+
RocketDAOProtocolSettingsSecurity,
14+
RocketNetworkRevenues,
15+
RocketStorage, RocketUpgradeOneDotFour,
16+
} from '../../test/_utils/artifacts';
17+
import { setDefaultParameters } from '../../test/_helpers/defaults';
18+
import { printTitle } from '../../test/_utils/formatting';
19+
import assert from 'assert';
20+
import { registerNode, setNodeTrusted } from '../../test/_helpers/node';
21+
import { userDeposit } from '../../test/_helpers/deposit';
22+
import { deployMegapool, getMegapoolForNode, getValidatorInfo, nodeDeposit } from '../../test/_helpers/megapool';
23+
import { setDAOProtocolBootstrapSetting } from '../../test/dao/scenario-dao-protocol-bootstrap';
24+
import { compressABI } from '../../test/_utils/contract';
25+
26+
const helpers = require('@nomicfoundation/hardhat-network-helpers');
27+
const hre = require('hardhat');
28+
const ethers = hre.ethers;
29+
30+
const rocketStorageAddress = process.env.ROCKET_STORAGE || '0x5FbDB2315678afecb367f032d93F642f64180aa3';
31+
32+
const rocketUpgradeOneDotFourDissolveHotfix = artifacts.require('RocketUpgradeOneDotFourDissolveHotfix');
33+
34+
async function executeHotfix(rocketStorageAddress, trustedNode, owner) {
35+
// Get contracts
36+
const rocketDAONodeTrusted = await RocketDAONodeTrusted.deployed();
37+
const rocketDAONodeTrustedUpgrade = await RocketDAONodeTrustedUpgrade.deployed()
38+
39+
// Deploy hotfix conract
40+
const dissolveHotfixContract = await rocketUpgradeOneDotFourDissolveHotfix.new(rocketStorageAddress);
41+
42+
// Bootstrap add the upgrade contract and execute
43+
await rocketDAONodeTrusted.connect(owner).bootstrapUpgrade('addContract', 'rocketUpgradeOneDotFourDissolveHotfix', compressABI(RocketUpgradeOneDotFour.abi), dissolveHotfixContract.target);
44+
const upgradeProposalId = await rocketDAONodeTrustedUpgrade.getTotal()
45+
46+
// Wait for the SC veto window to end
47+
const vetoEnd = await rocketDAONodeTrustedUpgrade.getEnd(upgradeProposalId);
48+
await helpers.time.increaseTo(vetoEnd + 1n);
49+
50+
// Execute the upgrade
51+
await rocketDAONodeTrustedUpgrade.connect(trustedNode).execute(upgradeProposalId);
52+
53+
// Execute the hotfix
54+
await dissolveHotfixContract.connect(owner).execute();
55+
}
56+
57+
export default function() {
58+
describe('Dissolve Hotfix', () => {
59+
let owner,
60+
node,
61+
nodeWithdrawalAddress,
62+
trustedNode1,
63+
random;
64+
65+
let upgradeContract;
66+
67+
before(async () => {
68+
await globalSnapShot();
69+
70+
[
71+
owner,
72+
node,
73+
nodeWithdrawalAddress,
74+
trustedNode1,
75+
random,
76+
] = await ethers.getSigners();
77+
78+
// Deploy upgrade while global artifacts are still latest version
79+
upgradeContract = await deployUpgrade(rocketStorageAddress);
80+
// Load artifacts from old deployment and initialise default parameters
81+
await artifacts.loadFromDeployment(rocketStorageAddress);
82+
await setDefaultParameters();
83+
});
84+
85+
beforeEach(async () => {
86+
await artifacts.loadFromDeployment(rocketStorageAddress);
87+
});
88+
89+
it(printTitle('hotfix', 'updated megapool.time.before.dissolve to 365 days'), async () => {
90+
// Setup a trusted node to execute the upgrade
91+
await registerNode({ from: trustedNode1 });
92+
await setNodeTrusted(trustedNode1, 'saas_1', 'node@home.com', owner);
93+
94+
// Execute the upgrade
95+
await executeUpgrade(owner, upgradeContract, rocketStorageAddress);
96+
97+
// Get contracts
98+
const rocketDAOProtocolSettingsMegapool = await RocketDAOProtocolSettingsMegapool.deployed();
99+
100+
// Check setting before is 28 days
101+
assertBN.equal(await rocketDAOProtocolSettingsMegapool.getTimeBeforeDissolve(), 60 * 60 * 24 * 28);
102+
103+
// Execute hotfix
104+
await executeHotfix(rocketStorageAddress, trustedNode1, owner);
105+
106+
// Check setting after is 365 days
107+
assertBN.equal(await rocketDAOProtocolSettingsMegapool.getTimeBeforeDissolve(), 60 * 60 * 24 * 365);
108+
});
109+
});
110+
}

0 commit comments

Comments
 (0)