Skip to content

Commit 6545e5a

Browse files
committed
Implement RPIP-64 and reduce guardrail to match
1 parent 9ff21a7 commit 6545e5a

7 files changed

Lines changed: 41 additions & 16 deletions

File tree

contracts/contract/dao/protocol/settings/RocketDAOProtocolSettingsProposals.sol

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import "../../../../interface/dao/protocol/settings/RocketDAOProtocolSettingsPro
88
contract RocketDAOProtocolSettingsProposals is RocketDAOProtocolSettings, RocketDAOProtocolSettingsProposalsInterface {
99

1010
constructor(RocketStorageInterface _rocketStorageAddress) RocketDAOProtocolSettings(_rocketStorageAddress, "proposals") {
11-
version = 2;
11+
version = 3;
1212
// Initialize settings on deployment
1313
if(!getBool(keccak256(abi.encodePacked(settingNameSpace, "deployed")))) {
1414
// Init settings
@@ -19,8 +19,8 @@ contract RocketDAOProtocolSettingsProposals is RocketDAOProtocolSettings, Rocket
1919
setSettingUint("proposal.bond", 100 ether); // The amount of RPL a proposer has to put up as a bond for creating a new proposal
2020
setSettingUint("proposal.challenge.bond", 10 ether); // The amount of RPL a challenger has to put up as a bond for challenging a proposal
2121
setSettingUint("proposal.challenge.period", 30 minutes); // The amount of time a proposer has to respond to a challenge before a proposal is defeated
22-
setSettingUint("proposal.quorum", 0.51 ether); // The quorum required to pass a proposal
23-
setSettingUint("proposal.veto.quorum", 0.51 ether); // The quorum required to veto a proposal
22+
setSettingUint("proposal.quorum", 0.15 ether); // The quorum required to pass a proposal (RPIP-64)
23+
setSettingUint("proposal.veto.quorum", 0.20 ether); // The quorum required to veto a proposal (RPIP-64)
2424
setSettingUint("proposal.max.block.age", 1024); // The maximum age of a block a proposal can be raised at
2525
// Settings initialised
2626
setBool(keccak256(abi.encodePacked(settingNameSpace, "deployed")), true);
@@ -56,8 +56,8 @@ contract RocketDAOProtocolSettingsProposals is RocketDAOProtocolSettings, Rocket
5656
// Must be >= 15% & < 75% (RPIP-63)
5757
require(_value >= 0.15 ether && _value < 0.75 ether, "Value must be >= 15% & < 75%");
5858
} else if(settingKey == keccak256(bytes("proposal.veto.quorum"))) {
59-
// Must be >= 51% & < 75% (RPIP-33)
60-
require(_value >= 0.51 ether && _value < 0.75 ether, "Value must be >= 51% & < 75%");
59+
// Must be >= 20% & < 75% (RPIP-64)
60+
require(_value >= 0.20 ether && _value < 0.75 ether, "Value must be >= 20% & < 75%");
6161
} else if(settingKey == keccak256(bytes("proposal.max.block.age"))) {
6262
// Must be > 128 blocks & < 7200 blocks (RPIP-33)
6363
require(_value > 128 && _value < 7200, "Value must be > 128 blocks & < 7200 blocks");

contracts/contract/upgrade/RocketUpgradeOneDotFour.sol

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,8 @@ contract RocketUpgradeOneDotFour is RocketBase {
2323
string[17] public abisA;
2424

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

2929
// Construct
3030
constructor(
@@ -49,8 +49,8 @@ contract RocketUpgradeOneDotFour is RocketBase {
4949

5050
// @notice Sets the B addresses and ABIs of the upgrade
5151
function setB(
52-
address[17] memory _addressesB,
53-
string[17] memory _abisB
52+
address[18] memory _addressesB,
53+
string[18] memory _abisB
5454
) external {
5555
require(msg.sender == deployer, "Only deployer can set");
5656
require(!lockedB, "Already set");
@@ -107,6 +107,7 @@ contract RocketUpgradeOneDotFour is RocketBase {
107107
_upgradeContract("rocketMinipoolManager", addressesB[12], abisB[12]);
108108
_upgradeContract("rocketNetworkVoting", addressesB[13], abisB[13]);
109109
_upgradeContract("rocketMerkleDistributorMainnet", addressesB[14], abisB[14]);
110+
_upgradeContract("rocketDAOProtocolSettingsProposals",addressesB[17], abisB[17]);
110111

111112
// Initialise the rewards relay address
112113
InitialiseInterface(addressesB[14]).initialise();
@@ -170,6 +171,14 @@ contract RocketUpgradeOneDotFour is RocketBase {
170171
setUint(keccak256(abi.encodePacked(settingNameSpace, "upgradeveto.quorum")), 0.33 ether);
171172
}
172173

174+
// Proposal settings
175+
{
176+
bytes32 settingNameSpace = keccak256(abi.encodePacked("dao.protocol.setting.", "proposals"));
177+
// Set protocol proposal settings per RPIP-64
178+
setUint(keccak256(abi.encodePacked(settingNameSpace, "proposal.quorum")), 0.15 ether);
179+
setUint(keccak256(abi.encodePacked(settingNameSpace, "proposal.veto.quorum")), 0.20 ether);
180+
}
181+
173182
// Initialise UARS system
174183
RocketNetworkRevenuesInterface rocketNetworkRevenuesInstance = RocketNetworkRevenuesInterface(addressesB[3]);
175184
rocketNetworkRevenuesInstance.initialise(0.05 ether, 0.09 ether, 0); // 5% node share, 9% voter share, 0% pdao share (RPIP-46)

scripts/deploy-upgrade.v1.4.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,7 @@ const networkContracts = {
9898
rocketMerkleDistributorMainnet: artifacts.require('RocketMerkleDistributorMainnet'),
9999
rocketMegapoolPenalties: artifacts.require('RocketMegapoolPenalties'),
100100
rocketNetworkSnapshotsTime: artifacts.require('RocketNetworkSnapshotsTime'),
101+
rocketDAOProtocolSettingsProposals: artifacts.require('RocketDAOProtocolSettingsProposals'),
101102
};
102103

103104
async function deployUpgrade(rocketStorageAddress) {
@@ -230,6 +231,7 @@ async function deployUpgrade(rocketStorageAddress) {
230231
deployedContracts.rocketMerkleDistributorMainnet.address,
231232
deployedContracts.rocketMegapoolPenalties.address,
232233
deployedContracts.rocketNetworkSnapshotsTime.address,
234+
deployedContracts.rocketDAOProtocolSettingsProposals.address,
233235
];
234236
const setAbisA = [
235237
compressABI(networkContracts.rocketMegapoolDelegate.abi),
@@ -268,6 +270,7 @@ async function deployUpgrade(rocketStorageAddress) {
268270
compressABI(networkContracts.rocketMerkleDistributorMainnet.abi),
269271
compressABI(networkContracts.rocketMegapoolPenalties.abi),
270272
compressABI(networkContracts.rocketNetworkSnapshotsTime.abi),
273+
compressABI(networkContracts.rocketDAOProtocolSettingsProposals.abi),
271274
];
272275
await upgradeContract.connect(signer).setA(setAddressesA, setAbisA);
273276
await upgradeContract.connect(signer).setB(setAddressesB, setAbisB);

test-upgrade/_helpers/upgrade.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ const networkContracts = {
3838
rocketMerkleDistributorMainnet: artifacts.require('RocketMerkleDistributorMainnet'),
3939
rocketMegapoolPenalties: artifacts.require('RocketMegapoolPenalties'),
4040
rocketNetworkSnapshotsTime: artifacts.require('RocketNetworkSnapshotsTime'),
41+
rocketDAOProtocolSettingsProposals: artifacts.require('RocketDAOProtocolSettingsProposals'),
4142

4243
rocketUpgradeOneDotFour: artifacts.require('RocketUpgradeOneDotFour'),
4344
};
@@ -157,6 +158,7 @@ export async function deployUpgrade(rocketStorageAddress) {
157158
addresses.rocketMerkleDistributorMainnet,
158159
addresses.rocketMegapoolPenalties,
159160
addresses.rocketNetworkSnapshotsTime,
161+
addresses.rocketDAOProtocolSettingsProposals,
160162
],
161163
[
162164
compressABI(networkContracts.rocketDAOSecurityUpgrade.abi),
@@ -176,6 +178,7 @@ export async function deployUpgrade(rocketStorageAddress) {
176178
compressABI(networkContracts.rocketMerkleDistributorMainnet.abi),
177179
compressABI(networkContracts.rocketMegapoolPenalties.abi),
178180
compressABI(networkContracts.rocketNetworkSnapshotsTime.abi),
181+
compressABI(networkContracts.rocketDAOProtocolSettingsProposals.abi),
179182
],
180183
];
181184
instance = await networkContracts[contract].new(rocketStorageAddress);

test-upgrade/tests/misc-tests.js

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import {
88
RocketDAOProtocolSettingsMegapool,
99
RocketDAOProtocolSettingsMinipool,
1010
RocketDAOProtocolSettingsNetwork,
11-
RocketDAOProtocolSettingsNode, RocketDAOProtocolSettingsSecurity,
11+
RocketDAOProtocolSettingsNode, RocketDAOProtocolSettingsProposals, RocketDAOProtocolSettingsSecurity,
1212
RocketNetworkRevenues,
1313
RocketStorage,
1414
} from '../../test/_utils/artifacts';
@@ -65,6 +65,7 @@ export default function() {
6565
const rocketDAOProtocolSettingsNetwork = await RocketDAOProtocolSettingsNetwork.deployed();
6666
const rocketDAOProtocolSettingsNode = await RocketDAOProtocolSettingsNode.deployed();
6767
const rocketDAOProtocolSettingsSecurity = await RocketDAOProtocolSettingsSecurity.deployed();
68+
const rocketDAOProtocolSettingsProposals = await RocketDAOProtocolSettingsProposals.deployed();
6869
const rocketStorage = await RocketStorage.deployed();
6970
const rocketNetworkRevenues = await RocketNetworkRevenues.deployed();
7071

@@ -111,6 +112,10 @@ export default function() {
111112
assertBN.equal(await rocketDAOProtocolSettingsMegapool.getUserDistributeDelay(), 1575n);
112113
assertBN.equal(await rocketDAOProtocolSettingsMegapool.getUserDistributeDelayWithShortfall(), 6750n);
113114

115+
// RPIP-64
116+
assertBN.equal(await rocketDAOProtocolSettingsProposals.getProposalQuorum(), '0.15'.ether);
117+
assertBN.equal(await rocketDAOProtocolSettingsProposals.getProposalVetoQuorum(), '0.20'.ether);
118+
114119
// Check protocol version string is set to 1.4
115120
assert.equal(await rocketStorage.getString(ethers.solidityPackedKeccak256(['string'], ['protocol.version'])), '1.4');
116121

test/_helpers/megapool.js

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -168,9 +168,14 @@ export async function nodeDeposit(node, bondAmount = '4'.ether, useExpressTicket
168168
let expectExpressQueueChange = useExpressTicket ? 1n : 0n;
169169
let expectExpressTicketsChange = useExpressTicket ? -1n : 0n;
170170
let amountRequired = '32'.ether;
171+
const minipoolInQueue = data1.minipoolQueueLength > 0n;
171172

172173
if (assignmentsEnabled) {
173-
if (queueLength > 0n) {
174+
if (minipoolInQueue) {
175+
if (depositPoolCapacity >= amountRequired) {
176+
expectedNodeBalanceChange -= '16'.ether - '1'.ether;
177+
}
178+
} else if (queueLength > 0n) {
174179
const queueHead = await linkedListStorage.peekItem(nextAssignmentIsExpress ? expressQueueNamespace : standardQueueNamespace);
175180
if (depositPoolCapacity >= amountRequired) {
176181
expectedNodeBalanceChange -= queueHead[2] * milliToWei;
@@ -241,9 +246,8 @@ export async function nodeDeposit(node, bondAmount = '4'.ether, useExpressTicket
241246
assertBN.equal(numValidatorsDelta, 1n, 'Number of validators did not increase by 1');
242247
assertBN.equal(numGlobalValidatorsDelta, 1n, 'Number of global validators did not increase by 1');
243248

244-
const minipoolInQueue = data1.minipoolQueueLength > 0n;
245-
246-
const expectAssignment = !minipoolInQueue &&
249+
const expectAssignment =
250+
!minipoolInQueue &&
247251
assignmentsEnabled &&
248252
depositPoolCapacity >= amountRequired;
249253

test/_utils/artifacts.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -79,8 +79,9 @@ export class Artifacts {
7979
RocketStorage.instance = this.artifacts['RocketStorage'].at(rocketStorageAddress);
8080
// Map between network contract name and actual contract name
8181
const mapping = {
82-
'RocketTokenDummyRPL': 'rocketTokenRPLFixedSupply'
83-
}
82+
'RocketTokenDummyRPL': 'rocketTokenRPLFixedSupply',
83+
'LinkedListStorageHelper': 'linkedListStorage',
84+
};
8485
for (const name in this.artifacts) {
8586
switch (name) {
8687
case 'RocketStorage':

0 commit comments

Comments
 (0)