Skip to content

Commit 2bff63c

Browse files
committed
modify access controll
1 parent 528ee01 commit 2bff63c

15 files changed

+274
-108
lines changed

script/DeployScroll.s.sol

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,7 @@ contract DeployScroll is Script {
152152
(
153153
address(usxProxy),
154154
address(0), // Treasury address (will be set later)
155+
admin,
155156
governance
156157
)
157158
);
@@ -179,7 +180,7 @@ contract DeployScroll is Script {
179180
console.log("2.2. Deploying Treasury Proxy...");
180181
bytes memory treasuryInitData = abi.encodeCall(
181182
TreasuryDiamond.initialize,
182-
(usdcAddress, address(usxProxy), address(susxProxy), governance, governanceWarchest, assetManager, insuranceVault)
183+
(usdcAddress, address(usxProxy), address(susxProxy), admin, governance, governanceWarchest, assetManager, insuranceVault)
183184
);
184185

185186
treasuryProxy = address(new ERC1967Proxy(address(treasuryImpl), treasuryInitData));

src/StakedUSX.sol

Lines changed: 48 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ contract StakedUSX is ERC4626Upgradeable, UUPSUpgradeable, ReentrancyGuardUpgrad
2525
error ZeroAddress();
2626
error ZeroAmount();
2727
error NotGovernance();
28+
error NotAdmin();
2829
error NotTreasury();
2930
error WithdrawalAlreadyClaimed();
3031
error WithdrawalPeriodNotPassed();
@@ -38,6 +39,7 @@ contract StakedUSX is ERC4626Upgradeable, UUPSUpgradeable, ReentrancyGuardUpgrad
3839

3940
event TreasurySet(address indexed treasury);
4041
event GovernanceTransferred(address indexed oldGovernance, address indexed newGovernance);
42+
event AdminTransferred(address indexed oldAdmin, address indexed newAdmin);
4143
event EpochAdvanced(uint256 oldEpochBlock, uint256 newEpochBlock);
4244
event WithdrawalRequested(address indexed user, uint256 sharesAmount, uint256 withdrawalId);
4345
event WithdrawalClaimed(address indexed user, uint256 withdrawalId, uint256 usxAmount);
@@ -62,6 +64,11 @@ contract StakedUSX is ERC4626Upgradeable, UUPSUpgradeable, ReentrancyGuardUpgrad
6264
_;
6365
}
6466

67+
modifier onlyAdmin() {
68+
if (msg.sender != _getStorage().admin) revert NotAdmin();
69+
_;
70+
}
71+
6572
modifier onlyTreasury() {
6673
if (msg.sender != address(_getStorage().treasury)) revert NotTreasury();
6774
_;
@@ -88,6 +95,7 @@ contract StakedUSX is ERC4626Upgradeable, UUPSUpgradeable, ReentrancyGuardUpgrad
8895
struct SUSXStorage {
8996
IERC20 USX; // USX token reference (the underlying asset)
9097
ITreasury treasury; // treasury contract
98+
address admin; // address that controls admin of the contract
9199
address governance; // address that controls governance of the contract
92100
uint256 withdrawalPeriod; // withdrawal period in seconds, (default == 15 * 24 * 60 * 60 (15 days))
93101
uint256 withdrawalFeeFraction; // fraction of withdrawals determining the withdrawal fee, (default 0.05% == 500) with precision 6 decimals
@@ -126,7 +134,7 @@ contract StakedUSX is ERC4626Upgradeable, UUPSUpgradeable, ReentrancyGuardUpgrad
126134
/// @param _usx Address of the USX token
127135
/// @param _treasury Address of the Treasury contract
128136
/// @param _governance Address of the governance
129-
function initialize(address _usx, address _treasury, address _governance) public initializer {
137+
function initialize(address _usx, address _treasury, address _admin, address _governance) public initializer {
130138
if (_usx == address(0) || _governance == address(0)) revert ZeroAddress();
131139

132140
// Initialize ERC4626, ERC20, and ReentrancyGuard
@@ -137,6 +145,7 @@ contract StakedUSX is ERC4626Upgradeable, UUPSUpgradeable, ReentrancyGuardUpgrad
137145
SUSXStorage storage $ = _getStorage();
138146
$.USX = IERC20(_usx);
139147
$.treasury = ITreasury(_treasury);
148+
$.admin = _admin;
140149
$.governance = _governance;
141150

142151
// Set default values
@@ -147,7 +156,7 @@ contract StakedUSX is ERC4626Upgradeable, UUPSUpgradeable, ReentrancyGuardUpgrad
147156

148157
/// @notice Set the initial Treasury address - can only be called once when treasury is address(0)
149158
/// @param _treasury Address of the Treasury contract
150-
function initializeTreasury(address _treasury) external onlyGovernance {
159+
function initializeTreasury(address _treasury) external onlyAdmin {
151160
if (_treasury == address(0)) revert ZeroAddress();
152161
SUSXStorage storage $ = _getStorage();
153162
if ($.treasury != ITreasury(address(0))) revert TreasuryAlreadySet();
@@ -216,15 +225,6 @@ contract StakedUSX is ERC4626Upgradeable, UUPSUpgradeable, ReentrancyGuardUpgrad
216225

217226
/*=========================== Governance Functions =========================*/
218227

219-
/// @notice Sets withdrawal period in seconds
220-
/// @param _withdrawalPeriod The new withdrawal period in seconds
221-
function setWithdrawalPeriod(uint256 _withdrawalPeriod) public onlyGovernance {
222-
SUSXStorage storage $ = _getStorage();
223-
uint256 oldPeriod = $.withdrawalPeriod;
224-
$.withdrawalPeriod = _withdrawalPeriod;
225-
emit WithdrawalPeriodSet(oldPeriod, _withdrawalPeriod);
226-
}
227-
228228
/// @notice Sets withdrawal fee with precision to 0.001 percent
229229
/// @param _withdrawalFeeFraction The new withdrawal fee fraction
230230
function setWithdrawalFeeFraction(uint256 _withdrawalFeeFraction) public onlyGovernance {
@@ -235,16 +235,6 @@ contract StakedUSX is ERC4626Upgradeable, UUPSUpgradeable, ReentrancyGuardUpgrad
235235
emit WithdrawalFeeFractionSet(oldFraction, _withdrawalFeeFraction);
236236
}
237237

238-
/// @notice Sets duration of epoch in seconds
239-
/// @param _epochDurationSeconds The new epoch duration in seconds
240-
function setEpochDuration(uint256 _epochDurationSeconds) public onlyGovernance {
241-
if (_epochDurationSeconds < MIN_EPOCH_DURATION) revert InvalidEpochDuration();
242-
SUSXStorage storage $ = _getStorage();
243-
uint256 oldDuration = $.epochDuration;
244-
$.epochDuration = _epochDurationSeconds;
245-
emit EpochDurationSet(oldDuration, _epochDurationSeconds);
246-
}
247-
248238
/// @notice Set new governance address
249239
/// @param newGovernance Address of new governance
250240
function setGovernance(address newGovernance) external onlyGovernance {
@@ -257,15 +247,46 @@ contract StakedUSX is ERC4626Upgradeable, UUPSUpgradeable, ReentrancyGuardUpgrad
257247
emit GovernanceTransferred(oldGovernance, newGovernance);
258248
}
259249

250+
/*=========================== Admin Functions =========================*/
251+
252+
/// @notice Set new admin address
253+
/// @param newAdmin Address of new admin
254+
function setAdmin(address newAdmin) external onlyAdmin {
255+
if (newAdmin == address(0)) revert ZeroAddress();
256+
SUSXStorage storage $ = _getStorage();
257+
address oldAdmin = $.admin;
258+
$.admin = newAdmin;
259+
emit AdminTransferred(oldAdmin, newAdmin);
260+
}
261+
262+
/// @notice Sets withdrawal period in seconds
263+
/// @param _withdrawalPeriod The new withdrawal period in seconds
264+
function setWithdrawalPeriod(uint256 _withdrawalPeriod) public onlyAdmin {
265+
SUSXStorage storage $ = _getStorage();
266+
uint256 oldPeriod = $.withdrawalPeriod;
267+
$.withdrawalPeriod = _withdrawalPeriod;
268+
emit WithdrawalPeriodSet(oldPeriod, _withdrawalPeriod);
269+
}
270+
271+
/// @notice Sets duration of epoch in seconds
272+
/// @param _epochDurationSeconds The new epoch duration in seconds
273+
function setEpochDuration(uint256 _epochDurationSeconds) public onlyAdmin {
274+
if (_epochDurationSeconds < MIN_EPOCH_DURATION) revert InvalidEpochDuration();
275+
SUSXStorage storage $ = _getStorage();
276+
uint256 oldDuration = $.epochDuration;
277+
$.epochDuration = _epochDurationSeconds;
278+
emit EpochDurationSet(oldDuration, _epochDurationSeconds);
279+
}
280+
260281
/// @notice Unpause deposit, allowing users to deposit again
261-
function unpauseDeposit() external onlyGovernance {
282+
function unpauseDeposit() external onlyAdmin {
262283
SUSXStorage storage $ = _getStorage();
263284
$.depositPaused = false;
264285
emit DepositPausedChanged(false);
265286
}
266287

267288
/// @notice Pause deposit, preventing users from depositing USX
268-
function pauseDeposit() external onlyGovernance {
289+
function pauseDeposit() external onlyAdmin {
269290
SUSXStorage storage $ = _getStorage();
270291
$.depositPaused = true;
271292
emit DepositPausedChanged(true);
@@ -415,6 +436,10 @@ contract StakedUSX is ERC4626Upgradeable, UUPSUpgradeable, ReentrancyGuardUpgrad
415436
return _getStorage().governance;
416437
}
417438

439+
function admin() public view returns (address) {
440+
return _getStorage().admin;
441+
}
442+
418443
function withdrawalPeriod() public view returns (uint256) {
419444
return _getStorage().withdrawalPeriod;
420445
}

src/TreasuryDiamond.sol

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,13 +52,14 @@ contract TreasuryDiamond is Initializable, UUPSUpgradeable, ReentrancyGuardUpgra
5252
address _USDC,
5353
address _USX,
5454
address _sUSX,
55+
address _admin,
5556
address _governance,
5657
address _governanceWarchest,
5758
address _assetManager,
5859
address _insuranceVault
5960
) public initializer {
6061
if (
61-
_USDC == address(0) || _USX == address(0) || _sUSX == address(0) || _governance == address(0)
62+
_USDC == address(0) || _USX == address(0) || _sUSX == address(0) || _admin == address(0) || _governance == address(0)
6263
|| _governanceWarchest == address(0)
6364
) {
6465
revert ZeroAddress();
@@ -71,6 +72,7 @@ contract TreasuryDiamond is Initializable, UUPSUpgradeable, ReentrancyGuardUpgra
7172
$.USDC = IERC20(_USDC);
7273
$.USX = IUSX(_USX);
7374
$.sUSX = IStakedUSX(_sUSX);
75+
$.admin = _admin;
7476
$.governance = _governance;
7577
$.assetManager = _assetManager;
7678
$.governanceWarchest = _governanceWarchest;
@@ -199,6 +201,16 @@ contract TreasuryDiamond is Initializable, UUPSUpgradeable, ReentrancyGuardUpgra
199201
emit InsuranceVaultTransferred(oldInsuranceVault, newInsuranceVault);
200202
}
201203

204+
/// @notice Set new admin address
205+
/// @param newAdmin Address of new admin
206+
function setAdmin(address newAdmin) external onlyAdmin {
207+
if (newAdmin == address(0)) revert ZeroAddress();
208+
TreasuryStorage.TreasuryStorageStruct storage $ = _getStorage();
209+
address oldAdmin = $.admin;
210+
$.admin = newAdmin;
211+
212+
emit AdminTransferred(oldAdmin, newAdmin);
213+
}
202214
/*=========================== Fallback =========================*/
203215

204216
/// @dev Fallback function that delegates calls to facets

src/TreasuryStorage.sol

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,13 +27,15 @@ contract TreasuryStorage {
2727
error InvalidInsuranceFundFraction();
2828

2929
// Access control errors
30+
error NotAdmin();
3031
error NotGovernance();
3132
error NotAllocator();
3233
error NotTreasury();
3334
error NotReporter();
3435

3536
/*=========================== Events =========================*/
3637

38+
event AdminTransferred(address indexed oldAdmin, address indexed newAdmin);
3739
event GovernanceTransferred(address indexed oldGovernance, address indexed newGovernance);
3840
event GovernanceWarchestTransferred(address indexed oldGovernanceWarchest, address indexed newGovernanceWarchest);
3941
event InsuranceVaultTransferred(address indexed oldInsuranceVault, address indexed newInsuranceVault);
@@ -57,6 +59,12 @@ contract TreasuryStorage {
5759

5860
/*=========================== Modifiers =========================*/
5961

62+
// Modifier to restrict access to admin functions
63+
modifier onlyAdmin() {
64+
if (msg.sender != _getStorage().admin) revert NotAdmin();
65+
_;
66+
}
67+
6068
// Modifier to restrict access to governance functions
6169
modifier onlyGovernance() {
6270
if (msg.sender != _getStorage().governance) revert NotGovernance();
@@ -88,6 +96,7 @@ contract TreasuryStorage {
8896
IUSX USX; // USX token contract
8997
IStakedUSX sUSX; // sUSX vault contract
9098
IERC20 USDC; // USDC token contract
99+
address admin; // Admin address
91100
address governance; // Governance address
92101
address reporter; // Reporter address
93102
address allocator; // Allocator address
@@ -126,6 +135,10 @@ contract TreasuryStorage {
126135
return _getStorage().USDC;
127136
}
128137

138+
function admin() public view returns (address) {
139+
return _getStorage().admin;
140+
}
141+
129142
function governance() public view returns (address) {
130143
return _getStorage().governance;
131144
}

src/USX.sol

Lines changed: 25 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ contract USX is ERC20Upgradeable, UUPSUpgradeable, ReentrancyGuardUpgradeable, I
3131
/*=========================== Events =========================*/
3232

3333
event TreasurySet(address indexed treasury);
34+
event AdminTransferred(address indexed oldAdmin, address indexed newAdmin);
3435
event GovernanceTransferred(address indexed oldGovernance, address indexed newGovernance);
3536
event Deposit(address indexed user, uint256 usdcAmount, uint256 usxMinted);
3637
event Redeem(address indexed user, uint256 usxAmount, uint256 usdcAmount);
@@ -120,7 +121,7 @@ contract USX is ERC20Upgradeable, UUPSUpgradeable, ReentrancyGuardUpgradeable, I
120121

121122
/// @dev Set the initial Treasury address - can only be called once when treasury is address(0)
122123
/// @param _treasury Address of the Treasury contract
123-
function initializeTreasury(address _treasury) external onlyGovernance {
124+
function initializeTreasury(address _treasury) external onlyAdmin {
124125
if (_treasury == address(0)) revert ZeroAddress();
125126
USXStorage storage $ = _getStorage();
126127
if ($.treasury != ITreasury(address(0))) revert TreasuryAlreadySet();
@@ -239,34 +240,44 @@ contract USX is ERC20Upgradeable, UUPSUpgradeable, ReentrancyGuardUpgradeable, I
239240

240241
/*=========================== Governance Functions =========================*/
241242

243+
/// @notice Set new governance address
244+
/// @param newGovernance Address of new governance
245+
function setGovernance(address newGovernance) external onlyGovernance {
246+
if (newGovernance == address(0)) revert ZeroAddress();
247+
248+
USXStorage storage $ = _getStorage();
249+
address oldGovernance = $.governance;
250+
$.governance = newGovernance;
251+
252+
emit GovernanceTransferred(oldGovernance, newGovernance);
253+
}
254+
255+
/*=========================== Admin Functions =========================*/
256+
242257
/// @notice Pause deposits and withdrawals, preventing users from depositing and redeeming USX
243-
function pause() public onlyGovernance {
258+
function pause() public onlyAdmin {
244259
USXStorage storage $ = _getStorage();
245260
$.paused = true;
246261
emit PausedChanged(true);
247262
}
248263

249264
/// @notice Unpause deposits and withdrawals, allowing users to deposit and withdraw again
250-
function unpause() public onlyGovernance {
265+
function unpause() public onlyAdmin {
251266
USXStorage storage $ = _getStorage();
252267
$.paused = false;
253268
emit PausedChanged(false);
254269
}
255270

256-
/// @notice Set new governance address
257-
/// @param newGovernance Address of new governance
258-
function setGovernance(address newGovernance) external onlyGovernance {
259-
if (newGovernance == address(0)) revert ZeroAddress();
260-
271+
/// @notice Set new admin address
272+
/// @param newAdmin Address of new admin
273+
function setAdmin(address newAdmin) external onlyAdmin {
274+
if (newAdmin == address(0)) revert ZeroAddress();
261275
USXStorage storage $ = _getStorage();
262-
address oldGovernance = $.governance;
263-
$.governance = newGovernance;
264-
265-
emit GovernanceTransferred(oldGovernance, newGovernance);
276+
address oldAdmin = $.admin;
277+
$.admin = newAdmin;
278+
emit AdminTransferred(oldAdmin, newAdmin);
266279
}
267280

268-
/*=========================== Admin Functions =========================*/
269-
270281
/// @notice Whitelist a user to mint/redeem USX
271282
/// @param _user The address to whitelist
272283
/// @param _isWhitelisted Whether to whitelist the user

src/asset-manager/AssetManager.sol

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -167,7 +167,7 @@ contract AssetManager is
167167
function updateWeight(
168168
address account,
169169
uint256 newWeight
170-
) external onlyRole(GOVERNANCE_ROLE) {
170+
) external onlyRole(DEFAULT_ADMIN_ROLE) {
171171
AssetManagerStorage storage $ = _getStorage();
172172
(bool exists, uint256 oldWeight) = $.weights.tryGet(account);
173173
if (!exists) {

src/facets/AssetManagerAllocatorFacet.sol

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ contract AssetManagerAllocatorFacet is
5656

5757
/// @notice Sets the current Allocator for the protocol
5858
/// @param _allocator The address of the new Allocator
59-
function setAllocator(address _allocator) external onlyGovernance {
59+
function setAllocator(address _allocator) external onlyAdmin {
6060
if (_allocator == address(0)) revert ZeroAddress();
6161
TreasuryStorage.TreasuryStorageStruct storage $ = _getStorage();
6262
address oldAllocator = $.allocator;

src/facets/RewardDistributorFacet.sol

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ contract RewardDistributorFacet is TreasuryStorage, ReentrancyGuardUpgradeable {
9393

9494
/// @notice Sets the current Reporter for the protocol
9595
/// @param _reporter The address of the new Reporter
96-
function setReporter(address _reporter) external onlyGovernance {
96+
function setReporter(address _reporter) external onlyAdmin {
9797
if (_reporter == address(0)) revert ZeroAddress();
9898
TreasuryStorage.TreasuryStorageStruct storage $ = _getStorage();
9999
address oldReporter = $.reporter;

0 commit comments

Comments
 (0)