Skip to content

Commit 827df4b

Browse files
committed
Add rocketMegapool convenience ABI to upgrade
1 parent 995dd34 commit 827df4b

File tree

3 files changed

+37
-2
lines changed

3 files changed

+37
-2
lines changed

contracts/contract/upgrade/RocketUpgradeOneDotFour.sol

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ contract RocketUpgradeOneDotFour is RocketBase {
2424

2525
bool public lockedB = false;
2626
address[18] public addressesB;
27-
string[18] public abisB;
27+
string[19] public abisB;
2828

2929
// Construct
3030
constructor(
@@ -50,7 +50,7 @@ contract RocketUpgradeOneDotFour is RocketBase {
5050
// @notice Sets the B addresses and ABIs of the upgrade
5151
function setB(
5252
address[18] memory _addressesB,
53-
string[18] memory _abisB
53+
string[19] memory _abisB
5454
) external {
5555
require(msg.sender == deployer, "Only deployer can set");
5656
require(!lockedB, "Already set");
@@ -83,6 +83,9 @@ contract RocketUpgradeOneDotFour is RocketBase {
8383
_addContract("rocketMegapoolPenalties", addressesB[15], abisB[15]);
8484
_addContract("rocketNetworkSnapshotsTime", addressesB[16], abisB[16]);
8585

86+
// Add rocketMegapool convenience ABI
87+
_addABI("rocketMegapool", abisB[18]);
88+
8689
// Upgrade existing contracts
8790
_upgradeContract("rocketNodeManager", addressesA[4], abisA[4]);
8891
_upgradeContract("rocketNodeDeposit", addressesA[5], abisA[5]);
@@ -232,4 +235,20 @@ contract RocketUpgradeOneDotFour is RocketBase {
232235
setAddress(keccak256(abi.encodePacked("contract.address", _name)), _contractAddress);
233236
setString(keccak256(abi.encodePacked("contract.abi", _name)), _contractAbi);
234237
}
238+
239+
/// @dev Adds a new ABI to the protocol
240+
function _addABI(string memory _name, string memory _contractAbi) internal {
241+
// Check ABI name
242+
bytes32 nameHash = keccak256(abi.encodePacked(_name));
243+
require(bytes(_name).length > 0, "Invalid ABI name");
244+
// Sanity check
245+
require(bytes(_contractAbi).length > 0, "Empty ABI is invalid");
246+
// Cannot add ABI if name is already used for an existing network contract
247+
require(getAddress(keccak256(abi.encodePacked("contract.address", _name))) == address(0x0), "ABI name is already in use");
248+
// Cannot add ABI if ABI already exists for this name (use upgradeABI instead)
249+
string memory existingAbi = getString(keccak256(abi.encodePacked("contract.abi", _name)));
250+
require(bytes(existingAbi).length == 0, "ABI name is already in use");
251+
// Set ABI
252+
setString(keccak256(abi.encodePacked("contract.abi", _name)), _contractAbi);
253+
}
235254
}

test-upgrade/_helpers/upgrade.js

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,16 @@ export async function deployUpgrade(rocketStorageAddress) {
6969
364032n * 32n, // Electra
7070
]
7171

72+
// Construct ABI for rocketMegapool
73+
const rocketMegapoolAbi = []
74+
.concat(artifacts.require('RocketMegapoolDelegate').abi)
75+
.concat(artifacts.require('RocketMegapoolDelegateBase').abi)
76+
.concat(artifacts.require('RocketMegapoolProxy').abi)
77+
.filter(i => i.type !== 'fallback' && i.type !== 'receive');
78+
79+
rocketMegapoolAbi.push({ stateMutability: 'payable', type: 'fallback'});
80+
rocketMegapoolAbi.push({ stateMutability: 'payable', type: 'receive'});
81+
7282
// Deploy other contracts
7383
for (let contract in networkContracts) {
7484
// Only deploy if it hasn't been deployed already like a precompiled
@@ -179,6 +189,7 @@ export async function deployUpgrade(rocketStorageAddress) {
179189
compressABI(networkContracts.rocketMegapoolPenalties.abi),
180190
compressABI(networkContracts.rocketNetworkSnapshotsTime.abi),
181191
compressABI(networkContracts.rocketDAOProtocolSettingsProposals.abi),
192+
compressABI(rocketMegapoolAbi)
182193
],
183194
];
184195
instance = await networkContracts[contract].new(rocketStorageAddress);

test-upgrade/tests/misc-tests.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import assert from 'assert';
1818
import { registerNode } from '../../test/_helpers/node';
1919
import { userDeposit } from '../../test/_helpers/deposit';
2020
import { deployMegapool, getMegapoolForNode, getValidatorInfo, nodeDeposit } from '../../test/_helpers/megapool';
21+
import { decompressABI } from '../../test/_utils/contract';
2122

2223
const helpers = require('@nomicfoundation/hardhat-network-helpers');
2324
const hre = require('hardhat');
@@ -125,6 +126,10 @@ export default function() {
125126
assertBN.equal(split[1], '0.09'.ether); // Voter share
126127
assertBN.equal(split[2], '0'.ether); // Protocol share
127128
assertBN.equal(split[3], '0.86'.ether); // User share
129+
130+
// Check rocketMegapool ABI exists
131+
const rocketMegapoolAbi = await rocketStorage.getString(ethers.solidityPackedKeccak256(['string', 'string'], ['contract.abi', 'rocketMegapool']));
132+
assert.notEqual(rocketMegapoolAbi.length, 0);
128133
});
129134

130135
it(printTitle('node', 'can create megapool and deposit from a node registered before upgrade'), async () => {

0 commit comments

Comments
 (0)