Skip to content

Commit

Permalink
Add missing contracts to upgrade contract
Browse files Browse the repository at this point in the history
  • Loading branch information
kanewallmann committed Jan 21, 2025
1 parent 837bd24 commit f08eeb4
Show file tree
Hide file tree
Showing 3 changed files with 142 additions and 10 deletions.
62 changes: 58 additions & 4 deletions contracts/contract/upgrade/RocketUpgradeOneDotFour.sol
Original file line number Diff line number Diff line change
Expand Up @@ -24,17 +24,37 @@ contract RocketUpgradeOneDotFour is RocketBase {
address public rocketMegapoolProxy;
address public rocketNodeManager;
address public rocketNodeDeposit;
address public rocketNodeStaking;
address public rocketDepositPool;
address public linkedListStorage;
address public rocketDAOProtocolSettingsNode;
address public rocketDAOProtocolSettingsDeposit;
address public rocketDAOProtocolSettingsNetwork;
address public rocketDAOProtocolSettingsSecurity;
address public rocketDAOSecurityProposals;
address public rocketNetworkRevenues;
address public rocketNetworkSnapshots;
address public blockRoots;
address public beaconStateVerifier;

// Upgrade ABIs
string public rocketMegapoolDelegateAbi;
string public rocketMegapoolFactoryAbi;
string public rocketMegapoolProxyAbi;
string public rocketNodeManagerAbi;
string public rocketNodeDepositAbi;
string public rocketNodeStakingAbi;
string public rocketDepositPoolAbi;
string public linkedListStorageAbi;
string public rocketDAOProtocolSettingsNodeAbi;
string public rocketDAOProtocolSettingsDepositAbi;
string public rocketDAOProtocolSettingsNetworkAbi;
string public rocketDAOProtocolSettingsSecurityAbi;
string public rocketDAOSecurityProposalsAbi;
string public rocketNetworkRevenuesAbi;
string public rocketNetworkSnapshotsAbi;
string public blockRootsAbi;
string public beaconStateVerifierAbi;

// Save deployer to limit access to set functions
address immutable deployer;
Expand Down Expand Up @@ -63,17 +83,37 @@ contract RocketUpgradeOneDotFour is RocketBase {
rocketMegapoolProxy = _addresses[2];
rocketNodeManager = _addresses[3];
rocketNodeDeposit = _addresses[4];
rocketDepositPool = _addresses[5];
linkedListStorage = _addresses[6];
rocketNodeStaking = _addresses[5];
rocketDepositPool = _addresses[6];
linkedListStorage = _addresses[7];
rocketDAOProtocolSettingsNode = _addresses[8];
rocketDAOProtocolSettingsDeposit = _addresses[9];
rocketDAOProtocolSettingsNetwork = _addresses[10];
rocketDAOProtocolSettingsSecurity = _addresses[11];
rocketDAOSecurityProposals = _addresses[12];
rocketNetworkRevenues = _addresses[13];
rocketNetworkSnapshots = _addresses[14];
blockRoots = _addresses[15];
beaconStateVerifier = _addresses[16];

// Set ABIs
rocketMegapoolDelegateAbi = _abis[0];
rocketMegapoolFactoryAbi = _abis[1];
rocketMegapoolProxyAbi = _abis[2];
rocketNodeManagerAbi = _abis[3];
rocketNodeDepositAbi = _abis[4];
rocketDepositPoolAbi = _abis[5];
linkedListStorageAbi = _abis[6];
rocketNodeStakingAbi = _abis[5];
rocketDepositPoolAbi = _abis[6];
linkedListStorageAbi = _abis[7];
rocketDAOProtocolSettingsNodeAbi = _abis[8];
rocketDAOProtocolSettingsDepositAbi = _abis[9];
rocketDAOProtocolSettingsNetworkAbi = _abis[10];
rocketDAOProtocolSettingsSecurityAbi = _abis[11];
rocketDAOSecurityProposalsAbi = _abis[12];
rocketNetworkRevenuesAbi = _abis[13];
rocketNetworkSnapshotsAbi = _abis[14];
blockRootsAbi = _abis[15];
beaconStateVerifierAbi = _abis[16];
}

/// @notice Prevents further changes from being applied
Expand All @@ -92,18 +132,32 @@ contract RocketUpgradeOneDotFour is RocketBase {
_addContract("rocketMegapoolFactory", rocketMegapoolFactory, rocketMegapoolFactoryAbi);
_addContract("rocketMegapoolProxy", rocketMegapoolProxy, rocketMegapoolProxyAbi);
_addContract("linkedListStorage", linkedListStorage, linkedListStorageAbi);
_addContract("rocketNetworkRevenues", rocketNetworkRevenues, rocketNetworkRevenuesAbi);
_addContract("blockRoots", blockRoots, blockRootsAbi);
_addContract("beaconStateVerifier", beaconStateVerifier, beaconStateVerifierAbi);

// Upgrade existing contracts
_upgradeContract("rocketNodeManager", rocketNodeManager, rocketNodeManagerAbi);
_upgradeContract("rocketNodeDeposit", rocketNodeDeposit, rocketNodeDepositAbi);
_upgradeContract("rocketNodeStaking", rocketNodeStaking, rocketNodeStakingAbi);
_upgradeContract("rocketDepositPool", rocketDepositPool, rocketDepositPoolAbi);
_upgradeContract("rocketNetworkSnapshots", rocketNetworkSnapshots, rocketNetworkSnapshotsAbi);
_upgradeContract("rocketDAOProtocolSettingsNode", rocketDAOProtocolSettingsNode, rocketDAOProtocolSettingsNodeAbi);
_upgradeContract("rocketDAOProtocolSettingsDeposit", rocketDAOProtocolSettingsDeposit, rocketDAOProtocolSettingsDepositAbi);
_upgradeContract("rocketDAOProtocolSettingsNetwork", rocketDAOProtocolSettingsNetwork, rocketDAOProtocolSettingsNetworkAbi);
_upgradeContract("rocketDAOProtocolSettingsSecurity", rocketDAOProtocolSettingsSecurity, rocketDAOProtocolSettingsSecurityAbi);
_upgradeContract("rocketDAOSecurityProposals", rocketDAOSecurityProposals, rocketDAOSecurityProposalsAbi);

// Init the megapool factory
RocketMegapoolFactoryInterface(rocketMegapoolFactory).initialise();

// Add new security council allowed parameter
setBool(keccak256(abi.encodePacked("dao.security.allowed.setting", "network", "network.node.commission.share.security.council.adder")), true);

// Set socialised assignments to 0 per RPIP-59
bytes32 settingNameSpace = keccak256(abi.encodePacked("dao.protocol.setting.", "deposit"));
setUint(keccak256(abi.encodePacked(settingNameSpace, "deposit.assign.socialised.maximum")), 0);

// Set a protocol version value in storage for convenience with bindings
setString(keccak256(abi.encodePacked("protocol.version")), "1.4");
}
Expand Down
53 changes: 53 additions & 0 deletions test-upgrade/_helpers/upgrade.js
Original file line number Diff line number Diff line change
@@ -1,18 +1,38 @@
import { artifacts, RocketStorage } from '../../test/_utils/artifacts';
import pako from 'pako';

const hre = require('hardhat');

const network = hre.network;

const networkContracts = {
rocketMegapoolDelegate: artifacts.require('RocketMegapoolDelegate'),
rocketMegapoolFactory: artifacts.require('RocketMegapoolFactory'),
rocketMegapoolProxy: artifacts.require('RocketMegapoolProxy'),
rocketNodeManager: artifacts.require('RocketNodeManager'),
rocketNodeDeposit: artifacts.require('RocketNodeDeposit'),
rocketNodeStaking: artifacts.require('RocketNodeStaking'),
rocketDepositPool: artifacts.require('RocketDepositPool'),
linkedListStorage: artifacts.require('LinkedListStorage'),
rocketDAOProtocolSettingsNode: artifacts.require('RocketDAOProtocolSettingsNode'),
rocketDAOProtocolSettingsDeposit: artifacts.require('RocketDAOProtocolSettingsDeposit'),
rocketDAOProtocolSettingsNetwork: artifacts.require('RocketDAOProtocolSettingsNetwork'),
rocketDAOProtocolSettingsSecurity: artifacts.require('RocketDAOProtocolSettingsSecurity'),
rocketDAOSecurityProposals: artifacts.require('RocketDAOSecurityProposals'),
rocketNetworkRevenues: artifacts.require('RocketNetworkRevenues'),
rocketNetworkSnapshots: artifacts.require('RocketNetworkSnapshots'),
blockRoots: artifacts.require('BlockRoots'),
beaconStateVerifier: artifacts.require('BeaconStateVerifier'),

rocketUpgradeOneDotFour: artifacts.require('RocketUpgradeOneDotFour'),
};

if (network.name === 'hardhat') {
// Unit test helper contracts
networkContracts.beaconStateVerifier = artifacts.require('BeaconStateVerifierMock');
networkContracts.blockRoots = artifacts.require('BlockRootsMock');
}

function compressABI(abi) {
return Buffer.from(pako.deflate(JSON.stringify(abi))).toString('base64');
}
Expand All @@ -35,6 +55,19 @@ export async function deployUpgrade(rocketStorageAddress) {
addresses[contract] = instance.target;
break;

case 'blockRoots':
if (network.name === 'hardhat') {
instance = await networkContracts[contract].new();
} else {
const genesisBlockTimestamp = 1695902400n;
const secondsPerSlot = 12n;
const beaconRootsHistoryBufferLength = 8191n;
const beaconRoots = '0x000F3df6D732807Ef1319fB7B8bB8522d0Beac02';
instance = await networkContracts[contract].new(genesisBlockTimestamp, secondsPerSlot, beaconRootsHistoryBufferLength, beaconRoots);
}
addresses[contract] = instance.target;
break;

// Upgrade contract
case 'rocketUpgradeOneDotFour':
instance = await networkContracts[contract].new(rocketStorageAddress);
Expand All @@ -45,17 +78,37 @@ export async function deployUpgrade(rocketStorageAddress) {
addresses.rocketMegapoolProxy,
addresses.rocketNodeManager,
addresses.rocketNodeDeposit,
addresses.rocketNodeStaking,
addresses.rocketDepositPool,
addresses.linkedListStorage,
addresses.rocketDAOProtocolSettingsNode,
addresses.rocketDAOProtocolSettingsDeposit,
addresses.rocketDAOProtocolSettingsNetwork,
addresses.rocketDAOProtocolSettingsSecurity,
addresses.rocketDAOSecurityProposals,
addresses.rocketNetworkRevenues,
addresses.rocketNetworkSnapshots,
addresses.blockRoots,
addresses.beaconStateVerifier,
],
[
compressABI(networkContracts.rocketMegapoolDelegate.abi),
compressABI(networkContracts.rocketMegapoolFactory.abi),
compressABI(networkContracts.rocketMegapoolProxy.abi),
compressABI(networkContracts.rocketNodeManager.abi),
compressABI(networkContracts.rocketNodeDeposit.abi),
compressABI(networkContracts.rocketNodeStaking.abi),
compressABI(networkContracts.rocketDepositPool.abi),
compressABI(networkContracts.linkedListStorage.abi),
compressABI(networkContracts.rocketDAOProtocolSettingsNode.abi),
compressABI(networkContracts.rocketDAOProtocolSettingsDeposit.abi),
compressABI(networkContracts.rocketDAOProtocolSettingsNetwork.abi),
compressABI(networkContracts.rocketDAOProtocolSettingsSecurity.abi),
compressABI(networkContracts.rocketDAOSecurityProposals.abi),
compressABI(networkContracts.rocketNetworkRevenues.abi),
compressABI(networkContracts.rocketNetworkSnapshots.abi),
compressABI(networkContracts.blockRoots.abi),
compressABI(networkContracts.beaconStateVerifier.abi),
],
];
await instance.set(...args);
Expand Down
37 changes: 31 additions & 6 deletions test-upgrade/rocket-upgrade-tests.js
Original file line number Diff line number Diff line change
@@ -1,19 +1,20 @@
import { afterEach, before, beforeEach, describe, it } from 'mocha';
import {
Artifacts,
artifacts, RocketNetworkVoting,
RocketNodeManager,
artifacts,
RocketDAOProtocolSettingsDeposit,
RocketStorage,
RocketUpgradeOneDotFour,
} from '../test/_utils/artifacts';
import { injectBNHelpers } from '../test/_helpers/bn';
import { assertBN, injectBNHelpers } from '../test/_helpers/bn';
import { endSnapShot, globalSnapShot, startSnapShot } from '../test/_utils/snapshotting';
import { registerNode } from '../test/_helpers/node';
import { printTitle } from '../test/_utils/formatting';
import { setDefaultParameters } from '../test/_helpers/defaults';
import { deployMegapool, nodeDeposit } from '../test/_helpers/megapool';
import { deployMegapool, getMegapoolForNode, nodeDeposit } from '../test/_helpers/megapool';
import { deployUpgrade } from './_helpers/upgrade';
import { setDaoNodeTrustedBootstrapUpgrade } from '../test/dao/scenario-dao-node-trusted-bootstrap';
import { userDeposit } from '../test/_helpers/deposit';
import assert from 'assert';

const helpers = require('@nomicfoundation/hardhat-network-helpers');
const hre = require('hardhat');
Expand Down Expand Up @@ -50,20 +51,44 @@ describe('Test Upgrade', () => {
await setDefaultParameters();
});

beforeEach(async () => {
await artifacts.loadFromDeployment(rocketStorageAddress);
});

async function executeUpgrade() {
// Bootstrap add the upgrade contract and execute
await setDaoNodeTrustedBootstrapUpgrade('addContract', 'rocketUpgradeOneDotFour', RocketUpgradeOneDotFour.abi, upgradeContract.target, {from: owner});
await setDaoNodeTrustedBootstrapUpgrade('addContract', 'rocketUpgradeOneDotFour', RocketUpgradeOneDotFour.abi, upgradeContract.target, { from: owner });
await upgradeContract.connect(owner).execute();
// Reload contracts from deployment as some were upgraded
await artifacts.loadFromDeployment(rocketStorageAddress);
}

it(printTitle('upgrade', 'updates expected settings'), async () => {
await executeUpgrade();

const rocketDAOProtocolSettingsDeposit = await RocketDAOProtocolSettingsDeposit.deployed();
const rocketStorage = await RocketStorage.deployed();

// Check socialised assignments value is set to 0
assertBN.equal(await rocketDAOProtocolSettingsDeposit.getMaximumDepositSocialisedAssignments(), 0n);

// Check protocol version string is set to 1.4
assert.equal(await rocketStorage.getString(ethers.solidityPackedKeccak256(['string'], ['protocol.version'])), '1.4');
});

it(printTitle('node', 'can create megapool and deposit'), async () => {
await registerNode({ from: node });
await userDeposit({ from: random, value: '28'.ether });

await executeUpgrade();

await deployMegapool({ from: node });
await nodeDeposit(false, false, { value: '4'.ether, from: node });

const megapool = await getMegapoolForNode(node);

const validatorInfoAfter = await megapool.getValidatorInfo(0);
assert.equal(validatorInfoAfter.active, false);
assert.equal(validatorInfoAfter.inQueue, false);
});
});

0 comments on commit f08eeb4

Please sign in to comment.