Skip to content

Commit 75bf214

Browse files
NAY4-1 Risk of Denial of Service if Rewards Are Not Collected for Too Many Intervals (#146)
* feat: add collectRewards exposing interval * refactor: rename to collectRewardsToInterval, update lock functions * chore: add natspec for collectRewardsToInterval
1 parent 1bf43e7 commit 75bf214

File tree

3 files changed

+23
-3
lines changed

3 files changed

+23
-3
lines changed

src/facets/StakingFacet.sol

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,17 @@ contract StakingFacet is Modifiers {
7070
LibTokenizedVaultStaking._collectRewards(parentId, _entityId, lastPaid);
7171
}
7272

73+
/**
74+
* @notice Collect rewards for a staker
75+
* @param _entityId staking entity ID
76+
* @param _interval interval to collect rewards up to
77+
*/
78+
function collectRewardsToInterval(bytes32 _entityId, uint64 _interval) external notLocked {
79+
bytes32 parentId = LibObject._getParent(msg.sender._getIdForAddress());
80+
81+
LibTokenizedVaultStaking._collectRewards(parentId, _entityId, _interval);
82+
}
83+
7384
function payReward(bytes32 _stakingRewardId, bytes32 _entityId, bytes32 _rewardTokenId, uint256 _amount) external notLocked assertPrivilege(_entityId, LC.GROUP_ENTITY_ADMINS) {
7485
LibTokenizedVaultStaking._payReward(_stakingRewardId, _entityId, _rewardTokenId, _amount);
7586
}

src/libs/LibAdmin.sol

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -141,12 +141,13 @@ library LibAdmin {
141141
s.locked[IDiamondProxy.stake.selector] = true;
142142
s.locked[IDiamondProxy.unstake.selector] = true;
143143
s.locked[IDiamondProxy.collectRewards.selector] = true;
144+
s.locked[IDiamondProxy.collectRewardsToInterval.selector] = true;
144145
s.locked[IDiamondProxy.payReward.selector] = true;
145146
s.locked[IDiamondProxy.cancelSimplePolicy.selector] = true;
146147
s.locked[IDiamondProxy.createSimplePolicy.selector] = true;
147148
s.locked[IDiamondProxy.createEntity.selector] = true;
148149

149-
bytes4[] memory lockedFunctions = new bytes4[](21);
150+
bytes4[] memory lockedFunctions = new bytes4[](22);
150151
lockedFunctions[0] = IDiamondProxy.startTokenSale.selector;
151152
lockedFunctions[1] = IDiamondProxy.paySimpleClaim.selector;
152153
lockedFunctions[2] = IDiamondProxy.paySimplePremium.selector;
@@ -168,6 +169,7 @@ library LibAdmin {
168169
lockedFunctions[18] = IDiamondProxy.cancelSimplePolicy.selector;
169170
lockedFunctions[19] = IDiamondProxy.createSimplePolicy.selector;
170171
lockedFunctions[20] = IDiamondProxy.createEntity.selector;
172+
lockedFunctions[21] = IDiamondProxy.collectRewardsToInterval.selector;
171173

172174
emit FunctionsLocked(lockedFunctions);
173175
}
@@ -195,8 +197,9 @@ library LibAdmin {
195197
s.locked[IDiamondProxy.cancelSimplePolicy.selector] = false;
196198
s.locked[IDiamondProxy.createSimplePolicy.selector] = false;
197199
s.locked[IDiamondProxy.createEntity.selector] = false;
200+
s.locked[IDiamondProxy.collectRewardsToInterval.selector] = false;
198201

199-
bytes4[] memory lockedFunctions = new bytes4[](21);
202+
bytes4[] memory lockedFunctions = new bytes4[](22);
200203
lockedFunctions[0] = IDiamondProxy.startTokenSale.selector;
201204
lockedFunctions[1] = IDiamondProxy.paySimpleClaim.selector;
202205
lockedFunctions[2] = IDiamondProxy.paySimplePremium.selector;
@@ -218,6 +221,7 @@ library LibAdmin {
218221
lockedFunctions[18] = IDiamondProxy.cancelSimplePolicy.selector;
219222
lockedFunctions[19] = IDiamondProxy.createSimplePolicy.selector;
220223
lockedFunctions[20] = IDiamondProxy.createEntity.selector;
224+
lockedFunctions[21] = IDiamondProxy.collectRewardsToInterval.selector;
221225

222226
emit FunctionsUnlocked(lockedFunctions);
223227
}

test/T02Admin.t.sol

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -241,7 +241,7 @@ contract T02AdminTest is D03ProtocolDefaults, MockAccounts {
241241
assertEq(entries[0].topics[0], keccak256("FunctionsLocked(bytes4[])"));
242242
(s_functionSelectors) = abi.decode(entries[0].data, (bytes4[]));
243243

244-
bytes4[] memory lockedFunctions = new bytes4[](21);
244+
bytes4[] memory lockedFunctions = new bytes4[](22);
245245
lockedFunctions[0] = IDiamondProxy.startTokenSale.selector;
246246
lockedFunctions[1] = IDiamondProxy.paySimpleClaim.selector;
247247
lockedFunctions[2] = IDiamondProxy.paySimplePremium.selector;
@@ -263,6 +263,7 @@ contract T02AdminTest is D03ProtocolDefaults, MockAccounts {
263263
lockedFunctions[18] = IDiamondProxy.cancelSimplePolicy.selector;
264264
lockedFunctions[19] = IDiamondProxy.createSimplePolicy.selector;
265265
lockedFunctions[20] = IDiamondProxy.createEntity.selector;
266+
lockedFunctions[21] = IDiamondProxy.collectRewardsToInterval.selector;
266267

267268
for (uint256 i = 0; i < lockedFunctions.length; i++) {
268269
assertTrue(nayms.isFunctionLocked(lockedFunctions[i]));
@@ -322,6 +323,9 @@ contract T02AdminTest is D03ProtocolDefaults, MockAccounts {
322323
vm.expectRevert("function is locked");
323324
nayms.collectRewards(bytes32(0));
324325

326+
vm.expectRevert("function is locked");
327+
nayms.collectRewardsToInterval(bytes32(0), 5);
328+
325329
vm.expectRevert("function is locked");
326330
nayms.cancelSimplePolicy(bytes32(0));
327331

@@ -354,6 +358,7 @@ contract T02AdminTest is D03ProtocolDefaults, MockAccounts {
354358
assertFalse(nayms.isFunctionLocked(IDiamondProxy.unstake.selector), "function unstake locked");
355359
assertFalse(nayms.isFunctionLocked(IDiamondProxy.payReward.selector), "function payReward locked");
356360
assertFalse(nayms.isFunctionLocked(IDiamondProxy.collectRewards.selector), "function collectRewards locked");
361+
assertFalse(nayms.isFunctionLocked(IDiamondProxy.collectRewardsToInterval.selector), "function collectRewardsToInterval locked");
357362
assertFalse(nayms.isFunctionLocked(IDiamondProxy.cancelSimplePolicy.selector), "function cancelSimplePolicy locked");
358363
assertFalse(nayms.isFunctionLocked(IDiamondProxy.createSimplePolicy.selector), "function createSimplePolicy locked");
359364
assertFalse(nayms.isFunctionLocked(IDiamondProxy.createEntity.selector), "function createEntity locked");

0 commit comments

Comments
 (0)