22pragma solidity 0.8.18 ;
33
44import {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 " ;
66import {RocketBase} from "../RocketBase.sol " ;
77import {RocketDAOProtocolSettingsDepositInterface} from "../../interface/dao/protocol/settings/RocketDAOProtocolSettingsDepositInterface.sol " ;
88import {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