Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 7 additions & 2 deletions script/ParameterStore.s.sol
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
Expand Down
24 changes: 13 additions & 11 deletions src/ParameterStore.sol
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand All @@ -25,28 +31,24 @@ 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
* @param _maxTradeBps Initial max trade size in basis points
* @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;
Expand Down Expand Up @@ -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;
Expand Down
2 changes: 1 addition & 1 deletion test/Relay.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}

Expand Down