Root + Impact
Description
contract VanguardHook {
address public owner;
function setFeeParameters(
uint24 newInitialFee,
uint24 newPhase1Fee,
uint24 newPhase2Fee,
uint256 newPhase1Duration,
uint256 newPhase2Duration
) external onlyOwner {
initialFee = newInitialFee;
phase1Duration = newPhase1Duration;
}
}
Risk
Likelihood:
Impact:
Proof of Concept
function attackLargeTrade() external {
vanguard.setFeeParameters(5000, 5000, 5000, 86400, 172800);
vanguard.setFeeParameters(1500, 1000, 500, 86400, 172800);
}
Recommended Mitigation
contract VanguardHook {
address public owner;
+ uint256 public constant MAX_FEE = 2500;
+ uint256 public constant MAX_DURATION = 7 days;
+ uint256 public pendingChangeTime;
function setFeeParameters(...) external onlyOwner {
+ require(newInitialFee <= MAX_FEE, "Fee too high");
+ require(newPhase1Duration <= MAX_DURATION, "Duration too long");
- initialFee = newInitialFee;
+ scheduleChange(newInitialFee, newPhase1Duration);
}
+ function executeScheduledChange() external {
+ require(block.timestamp >= pendingChangeTime + 24 hours);
+
+ }
}