Skip to content

Commit 90ede9d

Browse files
Add Security Checks for Config (#49)
* feat: add and enforce basic checks for config vars
1 parent 5b2de18 commit 90ede9d

File tree

8 files changed

+510
-76
lines changed

8 files changed

+510
-76
lines changed

src/core/SSVBasedApps.sol

Lines changed: 37 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -103,10 +103,45 @@ contract SSVBasedApps is
103103
protocolManager_
104104
);
105105

106-
if (config.maxFeeIncrement == 0 || config.maxFeeIncrement > 10_000) {
106+
if (
107+
config.maxFeeIncrement == 0 ||
108+
config.maxFeeIncrement > MAX_PERCENTAGE
109+
) {
107110
revert InvalidMaxFeeIncrement();
108111
}
109112

113+
if (config.maxShares == 0 || config.maxShares < 1e38) {
114+
revert InvalidMaxShares();
115+
}
116+
117+
if (config.feeTimelockPeriod == 0) {
118+
revert InvalidFeeTimelockPeriod();
119+
}
120+
121+
if (config.feeExpireTime == 0) {
122+
revert InvalidFeeExpireTime();
123+
}
124+
125+
if (config.withdrawalTimelockPeriod == 0) {
126+
revert InvalidWithdrawalTimelockPeriod();
127+
}
128+
129+
if (config.withdrawalExpireTime == 0) {
130+
revert InvalidWithdrawalExpireTime();
131+
}
132+
133+
if (config.obligationTimelockPeriod == 0) {
134+
revert InvalidObligationTimelockPeriod();
135+
}
136+
137+
if (config.obligationExpireTime == 0) {
138+
revert InvalidObligationExpireTime();
139+
}
140+
141+
if (config.tokenUpdateTimelockPeriod == 0) {
142+
revert InvalidTokenUpdateTimelockPeriod();
143+
}
144+
110145
sp.maxFeeIncrement = config.maxFeeIncrement;
111146
sp.feeTimelockPeriod = config.feeTimelockPeriod;
112147
sp.feeExpireTime = config.feeExpireTime;
@@ -343,9 +378,7 @@ contract SSVBasedApps is
343378
_delegateTo(SSVCoreModules.SSV_PROTOCOL_MANAGER);
344379
}
345380

346-
function updateDisabledFeatures(
347-
uint32 disabledFeatures
348-
) external onlyOwner {
381+
function updateDisabledFeatures(uint32 value) external onlyOwner {
349382
_delegateTo(SSVCoreModules.SSV_PROTOCOL_MANAGER);
350383
}
351384

src/core/interfaces/ISSVBasedApps.sol

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,5 +27,13 @@ interface ISSVBasedApps {
2727
) external;
2828

2929
error InvalidMaxFeeIncrement();
30+
error InvalidMaxShares();
31+
error InvalidFeeTimelockPeriod();
32+
error InvalidFeeExpireTime();
33+
error InvalidWithdrawalTimelockPeriod();
34+
error InvalidWithdrawalExpireTime();
35+
error InvalidObligationTimelockPeriod();
36+
error InvalidObligationExpireTime();
37+
error InvalidTokenUpdateTimelockPeriod();
3038
error TargetModuleDoesNotExist(uint8 moduleId);
3139
}

src/core/modules/ProtocolManager.sol

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,64 +3,86 @@ pragma solidity 0.8.29;
33

44
import { IProtocolManager } from "@ssv/src/core/interfaces/IProtocolManager.sol";
55
import { ProtocolStorageLib } from "@ssv/src/core/libraries/ProtocolStorageLib.sol";
6+
import { ISSVBasedApps } from "@ssv/src/core/interfaces/ISSVBasedApps.sol";
67

78
contract ProtocolManager is IProtocolManager {
89
uint32 private constant SLASHING_DISABLED = 1 << 0;
910
uint32 private constant WITHDRAWALS_DISABLED = 1 << 1;
1011

12+
uint32 private constant MIN_TIME_LOCK_PERIOD = 1 days;
13+
uint32 private constant MIN_EXPIRE_TIME = 1 hours;
14+
1115
function updateFeeTimelockPeriod(uint32 feeTimelockPeriod) external {
16+
if (feeTimelockPeriod < MIN_TIME_LOCK_PERIOD)
17+
revert ISSVBasedApps.InvalidFeeTimelockPeriod();
1218
ProtocolStorageLib.load().feeTimelockPeriod = feeTimelockPeriod;
1319
emit FeeTimelockPeriodUpdated(feeTimelockPeriod);
1420
}
1521

1622
function updateFeeExpireTime(uint32 feeExpireTime) external {
23+
if (feeExpireTime < MIN_EXPIRE_TIME)
24+
revert ISSVBasedApps.InvalidFeeExpireTime();
1725
ProtocolStorageLib.load().feeExpireTime = feeExpireTime;
1826
emit FeeExpireTimeUpdated(feeExpireTime);
1927
}
2028

2129
function updateWithdrawalTimelockPeriod(
2230
uint32 withdrawalTimelockPeriod
2331
) external {
32+
if (withdrawalTimelockPeriod < MIN_TIME_LOCK_PERIOD)
33+
revert ISSVBasedApps.InvalidWithdrawalTimelockPeriod();
2434
ProtocolStorageLib
2535
.load()
2636
.withdrawalTimelockPeriod = withdrawalTimelockPeriod;
2737
emit WithdrawalTimelockPeriodUpdated(withdrawalTimelockPeriod);
2838
}
2939

3040
function updateWithdrawalExpireTime(uint32 withdrawalExpireTime) external {
41+
if (withdrawalExpireTime < MIN_EXPIRE_TIME)
42+
revert ISSVBasedApps.InvalidWithdrawalExpireTime();
3143
ProtocolStorageLib.load().withdrawalExpireTime = withdrawalExpireTime;
3244
emit WithdrawalExpireTimeUpdated(withdrawalExpireTime);
3345
}
3446

3547
function updateObligationTimelockPeriod(
3648
uint32 obligationTimelockPeriod
3749
) external {
50+
if (obligationTimelockPeriod < MIN_TIME_LOCK_PERIOD)
51+
revert ISSVBasedApps.InvalidObligationTimelockPeriod();
3852
ProtocolStorageLib
3953
.load()
4054
.obligationTimelockPeriod = obligationTimelockPeriod;
4155
emit ObligationTimelockPeriodUpdated(obligationTimelockPeriod);
4256
}
4357

4458
function updateObligationExpireTime(uint32 obligationExpireTime) external {
59+
if (obligationExpireTime < MIN_EXPIRE_TIME)
60+
revert ISSVBasedApps.InvalidObligationExpireTime();
4561
ProtocolStorageLib.load().obligationExpireTime = obligationExpireTime;
4662
emit ObligationExpireTimeUpdated(obligationExpireTime);
4763
}
4864

4965
function updateTokenUpdateTimelockPeriod(
5066
uint32 tokenUpdateTimelockPeriod
5167
) external {
68+
if (tokenUpdateTimelockPeriod < MIN_TIME_LOCK_PERIOD)
69+
revert ISSVBasedApps.InvalidTokenUpdateTimelockPeriod();
5270
ProtocolStorageLib
5371
.load()
5472
.tokenUpdateTimelockPeriod = tokenUpdateTimelockPeriod;
5573
emit TokenUpdateTimelockPeriodUpdated(tokenUpdateTimelockPeriod);
5674
}
5775

5876
function updateMaxShares(uint256 maxShares) external {
77+
if (maxShares < 1e38) revert ISSVBasedApps.InvalidMaxShares();
5978
ProtocolStorageLib.load().maxShares = maxShares;
6079
emit StrategyMaxSharesUpdated(maxShares);
6180
}
6281

6382
function updateMaxFeeIncrement(uint32 maxFeeIncrement) external {
83+
if (maxFeeIncrement < 50)
84+
// 0.5% increment
85+
revert ISSVBasedApps.InvalidMaxFeeIncrement();
6486
ProtocolStorageLib.load().maxFeeIncrement = maxFeeIncrement;
6587
emit StrategyMaxFeeIncrementUpdated(maxFeeIncrement);
6688
}

0 commit comments

Comments
 (0)