Skip to content

Commit ef85041

Browse files
committed
Remove dissolve recovery, make stake permissionless, match withdrawal types with spec, add delay for permissionless distribute
1 parent c8be9b8 commit ef85041

15 files changed

+290
-204
lines changed

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

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -119,5 +119,4 @@ contract RocketDAOProtocolSettingsMinipool is RocketDAOProtocolSettings, RocketD
119119
function getUserDistributeWindowLength() override public view returns (uint256) {
120120
return getSettingUint("minipool.user.distribute.window.length");
121121
}
122-
123122
}

contracts/contract/deposit/RocketDepositPool.sol

Lines changed: 44 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
pragma solidity 0.8.18;
33

44
import {AddressQueueStorageInterface} from "../../interface/util/AddressQueueStorageInterface.sol";
5-
import {LinkedListStorageInterface, DepositQueueKey, DepositQueueValue} from "../../interface/util/LinkedListStorageInterface.sol";
5+
import {DepositQueueValue, DepositQueueKey, LinkedListStorageInterface} from "../../interface/util/LinkedListStorageInterface.sol";
66
import {RocketBase} from "../RocketBase.sol";
77
import {RocketDAOProtocolSettingsDepositInterface} from "../../interface/dao/protocol/settings/RocketDAOProtocolSettingsDepositInterface.sol";
88
import {RocketDAOProtocolSettingsMinipoolInterface} from "../../interface/dao/protocol/settings/RocketDAOProtocolSettingsMinipoolInterface.sol";
@@ -113,7 +113,10 @@ contract RocketDepositPool is RocketBase, RocketDepositPoolInterface, RocketVaul
113113
maxCapacity = maximumDepositPoolSize + queueEffectiveCapacity
114114
assert(capacityNeeded <= maxCapacity)
115115
*/
116-
uint256 capacityNeeded = getBalance() + msg.value;
116+
uint256 capacityNeeded;
117+
unchecked { // Infeasible overflow
118+
capacityNeeded = getBalance() + msg.value;
119+
}
117120
uint256 maxDepositPoolSize = rocketDAOProtocolSettingsDeposit.getMaximumDepositPoolSize();
118121
if (capacityNeeded > maxDepositPoolSize) {
119122
// Doing a conditional require() instead of a single one optimises for the common
@@ -128,10 +131,12 @@ contract RocketDepositPool is RocketBase, RocketDepositPoolInterface, RocketVaul
128131
}
129132
}
130133
// Calculate deposit fee
131-
uint256 depositFee = msg.value * rocketDAOProtocolSettingsDeposit.getDepositFee() / calcBase;
132-
uint256 depositNet = msg.value - depositFee;
133-
// Mint rETH to user account
134-
rocketTokenRETH.mint(depositNet, msg.sender);
134+
unchecked { // depositFee < msg.value
135+
uint256 depositFee = msg.value * rocketDAOProtocolSettingsDeposit.getDepositFee() / calcBase;
136+
uint256 depositNet = msg.value - depositFee;
137+
// Mint rETH to user account
138+
rocketTokenRETH.mint(depositNet, msg.sender);
139+
}
135140
// Emit deposit received event
136141
emit DepositReceived(msg.sender, msg.value, block.timestamp);
137142
// Process deposit
@@ -236,7 +241,9 @@ contract RocketDepositPool is RocketBase, RocketDepositPoolInterface, RocketVaul
236241
_assignMinipools(_max, _rocketDAOProtocolSettingsDeposit);
237242
return;
238243
} else {
239-
_max -= minipoolQueueLength;
244+
unchecked { // _max < minipoolQueueLength
245+
_max -= minipoolQueueLength;
246+
}
240247
_assignMinipools(minipoolQueueLength, _rocketDAOProtocolSettingsDeposit);
241248
}
242249
}
@@ -383,30 +390,34 @@ contract RocketDepositPool is RocketBase, RocketDepositPoolInterface, RocketVaul
383390
emit FundsAssigned(head.receiver, ethRequired, block.timestamp);
384391
linkedListStorage.dequeueItem(namespace);
385392
// Account for node balance
386-
nodeBalanceUsed += head.suppliedValue * milliToWei;
387-
totalSent += ethRequired;
388-
// Update counts for next iteration
389-
queueIndex ++;
390-
if (express) {
391-
expressQueueLength -= 1;
392-
expressHeadMoved = true;
393-
} else {
394-
standardQueueLength -= 1;
395-
standardHeadMoved = true;
393+
unchecked { // Infeasible overflows and impossible underflows
394+
nodeBalanceUsed += head.suppliedValue * milliToWei;
395+
totalSent += ethRequired;
396+
// Update counts for next iteration
397+
queueIndex += 1;
398+
if (express) {
399+
expressQueueLength -= 1;
400+
expressHeadMoved = true;
401+
} else {
402+
standardQueueLength -= 1;
403+
standardHeadMoved = true;
404+
}
396405
}
397406
}
398407
// Store state changes
399408
subUint("deposit.pool.node.balance", nodeBalanceUsed);
400409
setUint(keccak256("megapool.queue.index"), queueIndex);
401410
subUint(keccak256("deposit.pool.requested.total"), totalSent);
402-
setUint(keccak256("megapool.queue.last.moved.block"), block.number);
403-
// Update head moved blocks
404-
if (expressHeadMoved) {
405-
setUint(keccak256("megapool.express.queue.head.moved.block"), block.number);
406-
}
407-
if (standardHeadMoved) {
408-
setUint(keccak256("megapool.standard.queue.head.moved.block"), block.number);
409-
}
411+
setQueueMoved(expressHeadMoved, standardHeadMoved);
412+
}
413+
414+
function setQueueMoved(bool expressHeadMoved, bool standardHeadMoved) internal {
415+
uint256 packed = getUint(keccak256("megapool.queue.moved"));
416+
uint128 express = expressHeadMoved ? uint128(block.number) : uint128(packed >> 0);
417+
uint128 standard = standardHeadMoved ? uint128(block.number) : uint128(packed >> 128);
418+
packed = express << 0;
419+
packed |= uint256(standard) << 128;
420+
setUint(keccak256("megapool.queue.moved"), packed);
410421
}
411422

412423
/// @dev Withdraw excess deposit pool balance for rETH collateral
@@ -440,7 +451,7 @@ contract RocketDepositPool is RocketBase, RocketDepositPoolInterface, RocketVaul
440451
bytes32 namespace = getQueueNamespace(_expressQueue);
441452
DepositQueueValue memory value = DepositQueueValue({
442453
receiver: msg.sender, // Megapool address
443-
validatorId: _validatorId, // Incrementing id per validator in a megapool
454+
validatorId: _validatorId, // Incrementing id per validator in a megapool
444455
suppliedValue: uint32(_bondAmount / milliToWei), // NO bond amount
445456
requestedValue: uint32(_amount / milliToWei) // Amount being requested
446457
});
@@ -452,12 +463,12 @@ contract RocketDepositPool is RocketBase, RocketDepositPoolInterface, RocketVaul
452463
if (_expressQueue) {
453464
uint256 expressQueueLength = linkedListStorage.getLength(expressQueueNamespace);
454465
if (expressQueueLength == 1) {
455-
setUint(keccak256("megapool.express.queue.head.moved.block"), block.number);
466+
setQueueMoved(true, false);
456467
}
457468
} else {
458469
uint256 standardQueueLength = linkedListStorage.getLength(standardQueueNamespace);
459470
if (standardQueueLength == 1) {
460-
setUint(keccak256("megapool.standard.queue.head.moved.block"), block.number);
471+
setQueueMoved(false, true);
461472
}
462473
}
463474
// Emit event
@@ -488,12 +499,12 @@ contract RocketDepositPool is RocketBase, RocketDepositPoolInterface, RocketVaul
488499
rocketNodeManager.refundExpressTicket(nodeAddress);
489500
// Update head moved block
490501
if (isAtHead) {
491-
setUint(keccak256("megapool.express.queue.head.moved.block"), block.number);
502+
setQueueMoved(true, false);
492503
}
493504
} else {
494505
// Update head moved block
495506
if (isAtHead) {
496-
setUint(keccak256("megapool.standard.queue.head.moved.block"), block.number);
507+
setQueueMoved(false, true);
497508
}
498509
}
499510
// Emit event
@@ -572,10 +583,11 @@ contract RocketDepositPool is RocketBase, RocketDepositPoolInterface, RocketVaul
572583
}
573584

574585
// Retrieve the block at which the entry at the top of the queue got to that position
586+
uint256 packed = getUint(keccak256("megapool.queue.moved"));
575587
if (express) {
576-
headMovedBlock = getUint(keccak256("megapool.express.queue.head.moved.block"));
588+
headMovedBlock = uint64(packed >> 64);
577589
} else {
578-
headMovedBlock = getUint(keccak256("megapool.standard.queue.head.moved.block"));
590+
headMovedBlock = uint64(packed >> 128);
579591
}
580592

581593
return (head.receiver, assignmentPossible, headMovedBlock);

0 commit comments

Comments
 (0)