@@ -5,6 +5,7 @@ pragma solidity ^0.8.20;
55import {HubDependent} from "../abstract/HubDependent.sol " ;
66import {INamed} from "../interfaces/INamed.sol " ;
77import {IVersioned} from "../interfaces/IVersioned.sol " ;
8+ import {ICustodian} from "../interfaces/ICustodian.sol " ;
89
910contract ParametersStorage is INamed , IVersioned , HubDependent {
1011 event ParameterChanged (string parameterName , uint256 parameterValue );
@@ -31,9 +32,15 @@ contract ParametersStorage is INamed, IVersioned, HubDependent {
3132
3233 uint256 public v81ReleaseEpoch;
3334
35+ // @dev Only transactions by HubController owner or one of the owners of the MultiSig Wallet
36+ modifier onlyOwnerOrMultiSigOwner () {
37+ _checkOwnerOrMultiSigOwner ();
38+ _;
39+ }
40+
3441 constructor (address hubAddress , uint256 _v81ReleaseEpoch ) HubDependent (hubAddress) {
3542 minimumStake = 50_000 ether ;
36- maximumStake = 2_000_000 ether ;
43+ maximumStake = 5_000_000 ether ;
3744
3845 stakeWithdrawalDelay = 28 days ;
3946 nodeAskUpdateDelay = 1 days ;
@@ -62,71 +69,103 @@ contract ParametersStorage is INamed, IVersioned, HubDependent {
6269 return _VERSION;
6370 }
6471
65- function setAskUpperBoundFactor (uint256 _askUpperBoundFactor ) external onlyHub {
72+ function setAskUpperBoundFactor (uint256 _askUpperBoundFactor ) external onlyOwnerOrMultiSigOwner {
6673 askUpperBoundFactor = _askUpperBoundFactor;
6774 }
6875
69- function setAskLowerBoundFactor (uint256 _askLowerBoundFactor ) external onlyHub {
76+ function setAskLowerBoundFactor (uint256 _askLowerBoundFactor ) external onlyOwnerOrMultiSigOwner {
7077 askLowerBoundFactor = _askLowerBoundFactor;
7178 }
7279
73- function setMinimumRequiredSignatures (uint256 _minimumRequiredSignatures ) external onlyHub {
80+ function setMinimumRequiredSignatures (uint256 _minimumRequiredSignatures ) external onlyOwnerOrMultiSigOwner {
7481 minimumRequiredSignatures = _minimumRequiredSignatures;
7582
7683 emit ParameterChanged ("minimumRequiredSignatures " , _minimumRequiredSignatures);
7784 }
7885
79- function setMinimumStake (uint96 newMinimumStake ) external onlyHub {
86+ function setMinimumStake (uint96 newMinimumStake ) external onlyOwnerOrMultiSigOwner {
8087 minimumStake = newMinimumStake;
8188
8289 emit ParameterChanged ("minimumStake " , newMinimumStake);
8390 }
8491
85- function setMaximumStake (uint96 newMaximumStake ) external onlyHub {
92+ function setMaximumStake (uint96 newMaximumStake ) external onlyOwnerOrMultiSigOwner {
8693 maximumStake = newMaximumStake;
8794
8895 emit ParameterChanged ("maximumStake " , newMaximumStake);
8996 }
9097
91- function setStakeWithdrawalDelay (uint256 newStakeWithdrawalDelay ) external onlyHub {
98+ function setStakeWithdrawalDelay (uint256 newStakeWithdrawalDelay ) external onlyOwnerOrMultiSigOwner {
9299 stakeWithdrawalDelay = newStakeWithdrawalDelay;
93100
94101 emit ParameterChanged ("stakeWithdrawalDelay " , newStakeWithdrawalDelay);
95102 }
96103
97- function setNodeAskUpdateDelay (uint256 newNodeAskUpdateDelay ) external onlyHub {
104+ function setNodeAskUpdateDelay (uint256 newNodeAskUpdateDelay ) external onlyOwnerOrMultiSigOwner {
98105 nodeAskUpdateDelay = newNodeAskUpdateDelay;
99106
100107 emit ParameterChanged ("nodeAskUpdateDelay " , newNodeAskUpdateDelay);
101108 }
102109
103- function setOperatorFeeUpdateDelay (uint256 newOperatorFeeUpdateDelay ) external onlyHub {
110+ function setOperatorFeeUpdateDelay (uint256 newOperatorFeeUpdateDelay ) external onlyOwnerOrMultiSigOwner {
104111 operatorFeeUpdateDelay = newOperatorFeeUpdateDelay;
105112
106113 emit ParameterChanged ("operatorFeeUpdateDelay " , newOperatorFeeUpdateDelay);
107114 }
108115
109- function setOpWalletsLimitOnProfileCreation (uint16 opWalletsLimitOnProfileCreation_ ) external onlyHub {
116+ function setOpWalletsLimitOnProfileCreation (
117+ uint16 opWalletsLimitOnProfileCreation_
118+ ) external onlyOwnerOrMultiSigOwner {
110119 opWalletsLimitOnProfileCreation = opWalletsLimitOnProfileCreation_;
111120
112121 emit ParameterChanged ("opWalletsLimitOnProfileCreation " , opWalletsLimitOnProfileCreation);
113122 }
114123
115- function setShardingTableSizeLimit (uint16 shardingTableSizeLimit_ ) external onlyHub {
124+ function setShardingTableSizeLimit (uint16 shardingTableSizeLimit_ ) external onlyOwnerOrMultiSigOwner {
116125 shardingTableSizeLimit = shardingTableSizeLimit_;
117126
118127 emit ParameterChanged ("shardingTableSizeLimit " , shardingTableSizeLimit);
119128 }
120129
121- function setMaxOperatorFee (uint16 maxOperatorFee_ ) external onlyHub {
130+ function setMaxOperatorFee (uint16 maxOperatorFee_ ) external onlyOwnerOrMultiSigOwner {
122131 maxOperatorFee = maxOperatorFee_;
123132
124133 emit ParameterChanged ("maxOperatorFee " , maxOperatorFee);
125134 }
126135
127- function setV81ReleaseEpoch (uint256 _v81ReleaseEpoch ) external onlyHub {
136+ function setV81ReleaseEpoch (uint256 _v81ReleaseEpoch ) external onlyOwnerOrMultiSigOwner {
128137 v81ReleaseEpoch = _v81ReleaseEpoch;
129138
130139 emit ParameterChanged ("v81ReleaseEpoch " , _v81ReleaseEpoch);
131140 }
141+
142+ function _isMultiSigOwner (address multiSigAddress ) internal view returns (bool ) {
143+ // First check if the address has contract code
144+ uint256 size;
145+ assembly {
146+ size := extcodesize (multiSigAddress)
147+ }
148+
149+ // If no contract code, it's an EOA, not a multisig
150+ if (size == 0 ) {
151+ return false ;
152+ }
153+
154+ try ICustodian (multiSigAddress).getOwners () returns (address [] memory multiSigOwners ) {
155+ for (uint256 i = 0 ; i < multiSigOwners.length ; i++ ) {
156+ if (msg .sender == multiSigOwners[i]) {
157+ return true ;
158+ }
159+ } // solhint-disable-next-line no-empty-blocks
160+ } catch {}
161+
162+ return false ;
163+ }
164+
165+ function _checkOwnerOrMultiSigOwner () internal view virtual {
166+ address hubOwner = hub.owner ();
167+ if (msg .sender != hubOwner && msg .sender != address (hub) && ! _isMultiSigOwner (hubOwner)) {
168+ revert ("Only Hub Owner, Hub, or Multisig Owner can call " );
169+ }
170+ }
132171}
0 commit comments