diff --git a/script/ParameterStore.s.sol b/script/ParameterStore.s.sol index 01b07b9..96aba19 100644 --- a/script/ParameterStore.s.sol +++ b/script/ParameterStore.s.sol @@ -7,13 +7,18 @@ import {ParameterStore} from "../src/ParameterStore.sol"; contract ParameterStoreDeploy is Script { function run() external returns (ParameterStore store) { - address daoAdmin = vm.envOr("DAO_ADMIN_ADDRESS", msg.sender); + address timelock = vm.envAddress("TIMELOCK"); + uint256 maxTradeBps = vm.envOr("MAX_TRADE_BPS", uint256(1)); + uint256 maxSlippageBps = vm.envOr("MAX_SLIPPAGE_BPS", uint256(2)); + uint256 tradeCooldownSec = vm.envOr("TRADE_COOLDOWN_SEC", uint256(3)); vm.startBroadcast(); - store = new ParameterStore(daoAdmin, 1, 2, 3); + store = new ParameterStore(timelock, maxTradeBps, maxSlippageBps, tradeCooldownSec); vm.stopBroadcast(); console.log("ParameterStore deployed at", address(store)); + console.log("Timelock:", timelock); + console.log("Initial params:", maxTradeBps, maxSlippageBps, tradeCooldownSec); return store; } diff --git a/src/ParameterStore.sol b/src/ParameterStore.sol index 70d9de2..75dfe7f 100644 --- a/src/ParameterStore.sol +++ b/src/ParameterStore.sol @@ -7,6 +7,12 @@ pragma solidity ^0.8.20; * @dev Centralizes configuration to a single contract. Mutations are only allowed by the Timelock. */ contract ParameterStore { + uint256 public constant MAX_BPS = 10_000; + + error NotTimelock(address caller, address timelock); + error InvalidBps(); + error ZeroAddress(); + address public immutable TIMELOCK; // Risk parameters (governance-controlled) @@ -25,14 +31,10 @@ contract ParameterStore { ); modifier onlyTimelock() { - _onlyTimelock(); + if (msg.sender != TIMELOCK) revert NotTimelock(msg.sender, TIMELOCK); _; } - function _onlyTimelock() internal view { - require(msg.sender == TIMELOCK, "ParameterStore: only Timelock"); - } - /** * @notice Constructor * @param _timelock Address of governance Timelock @@ -40,13 +42,13 @@ contract ParameterStore { * @param _maxSlippageBps Initial max slippage in basis points * @param _tradeCooldownSec Initial cooldown period in seconds */ + constructor(address _timelock, uint256 _maxTradeBps, uint256 _maxSlippageBps, uint256 _tradeCooldownSec) { - require(_timelock != address(0), "ParameterStore: invalid timelock"); - require(_maxTradeBps <= 10000, "ParameterStore: invalid maxTradeBps"); - require(_maxSlippageBps <= 10000, "ParameterStore: invalid maxSlippageBps"); + if (_timelock == address(0)) revert ZeroAddress(); + if (_maxTradeBps > MAX_BPS) revert InvalidBps(); + if (_maxSlippageBps > MAX_BPS) revert InvalidBps(); TIMELOCK = _timelock; - maxTradeBps = _maxTradeBps; maxSlippageBps = _maxSlippageBps; tradeCooldownSec = _tradeCooldownSec; @@ -80,8 +82,8 @@ contract ParameterStore { } function _setParameters(uint256 newMaxTradeBps, uint256 newMaxSlippageBps, uint256 newTradeCooldownSec) internal { - require(newMaxTradeBps <= 10000, "ParameterStore: invalid maxTradeBps"); - require(newMaxSlippageBps <= 10000, "ParameterStore: invalid maxSlippageBps"); + if (newMaxTradeBps > MAX_BPS) revert InvalidBps(); + if (newMaxSlippageBps > MAX_BPS) revert InvalidBps(); uint256 oldMaxTradeBps = maxTradeBps; uint256 oldMaxSlippageBps = maxSlippageBps; diff --git a/test/Relay.t.sol b/test/Relay.t.sol index 375bed3..89a6508 100644 --- a/test/Relay.t.sol +++ b/test/Relay.t.sol @@ -282,7 +282,7 @@ contract RelayTest is Test { function test_RevertIf_SetMaxTradeBpsInvalid() public { vm.prank(dao); - vm.expectRevert("ParameterStore: invalid maxTradeBps"); + vm.expectRevert(ParameterStore.InvalidBps.selector); parameterStore.setMaxTradeBps(10001); }