From 7a9e3ec38fa5bbd1cbca9949b918b6498033082c Mon Sep 17 00:00:00 2001 From: wadealexc Date: Fri, 14 Feb 2025 19:20:22 +0000 Subject: [PATCH] feat: additional reentrancy protection for EPM and SM --- src/contracts/core/StrategyManager.sol | 17 ++++++++++------- src/contracts/pods/EigenPodManager.sol | 12 ++++++------ 2 files changed, 16 insertions(+), 13 deletions(-) diff --git a/src/contracts/core/StrategyManager.sol b/src/contracts/core/StrategyManager.sol index c1b5bbada0..8d320a12b0 100644 --- a/src/contracts/core/StrategyManager.sol +++ b/src/contracts/core/StrategyManager.sol @@ -117,7 +117,7 @@ contract StrategyManager is address staker, IStrategy strategy, uint256 depositSharesToRemove - ) external onlyDelegationManager returns (uint256) { + ) external onlyDelegationManager nonReentrant returns (uint256) { (, uint256 sharesAfter) = _removeDepositShares(staker, strategy, depositSharesToRemove); return sharesAfter; } @@ -127,7 +127,7 @@ contract StrategyManager is address staker, IStrategy strategy, uint256 shares - ) external onlyDelegationManager returns (uint256, uint256) { + ) external onlyDelegationManager nonReentrant returns (uint256, uint256) { return _addShares(staker, strategy, shares); } @@ -137,12 +137,15 @@ contract StrategyManager is IStrategy strategy, IERC20 token, uint256 shares - ) external onlyDelegationManager { + ) external onlyDelegationManager nonReentrant { strategy.withdraw(staker, token, shares); } /// @inheritdoc IShareManager - function increaseBurnableShares(IStrategy strategy, uint256 addedSharesToBurn) external onlyDelegationManager { + function increaseBurnableShares( + IStrategy strategy, + uint256 addedSharesToBurn + ) external onlyDelegationManager nonReentrant { (, uint256 currentShares) = EnumerableMap.tryGet(burnableShares, address(strategy)); EnumerableMap.set(burnableShares, address(strategy), currentShares + addedSharesToBurn); emit BurnableSharesIncreased(strategy, addedSharesToBurn); @@ -162,14 +165,14 @@ contract StrategyManager is /// @inheritdoc IStrategyManager function setStrategyWhitelister( address newStrategyWhitelister - ) external onlyOwner { + ) external onlyOwner nonReentrant { _setStrategyWhitelister(newStrategyWhitelister); } /// @inheritdoc IStrategyManager function addStrategiesToDepositWhitelist( IStrategy[] calldata strategiesToWhitelist - ) external onlyStrategyWhitelister { + ) external onlyStrategyWhitelister nonReentrant { uint256 strategiesToWhitelistLength = strategiesToWhitelist.length; for (uint256 i = 0; i < strategiesToWhitelistLength; ++i) { // change storage and emit event only if strategy is not already in whitelist @@ -183,7 +186,7 @@ contract StrategyManager is /// @inheritdoc IStrategyManager function removeStrategiesFromDepositWhitelist( IStrategy[] calldata strategiesToRemoveFromWhitelist - ) external onlyStrategyWhitelister { + ) external onlyStrategyWhitelister nonReentrant { uint256 strategiesToRemoveFromWhitelistLength = strategiesToRemoveFromWhitelist.length; for (uint256 i = 0; i < strategiesToRemoveFromWhitelistLength; ++i) { // change storage and emit event only if strategy is already in whitelist diff --git a/src/contracts/pods/EigenPodManager.sol b/src/contracts/pods/EigenPodManager.sol index e6ec820e17..921fefba91 100644 --- a/src/contracts/pods/EigenPodManager.sol +++ b/src/contracts/pods/EigenPodManager.sol @@ -66,7 +66,7 @@ contract EigenPodManager is } /// @inheritdoc IEigenPodManager - function createPod() external onlyWhenNotPaused(PAUSED_NEW_EIGENPODS) returns (address) { + function createPod() external onlyWhenNotPaused(PAUSED_NEW_EIGENPODS) nonReentrant returns (address) { require(!hasPod(msg.sender), EigenPodAlreadyExists()); // deploy a pod if the sender doesn't have one already IEigenPod pod = _deployPod(); @@ -79,7 +79,7 @@ contract EigenPodManager is bytes calldata pubkey, bytes calldata signature, bytes32 depositDataRoot - ) external payable onlyWhenNotPaused(PAUSED_NEW_EIGENPODS) { + ) external payable onlyWhenNotPaused(PAUSED_NEW_EIGENPODS) nonReentrant { IEigenPod pod = ownerToPod[msg.sender]; if (address(pod) == address(0)) { //deploy a pod if the sender doesn't have one already @@ -148,7 +148,7 @@ contract EigenPodManager is address staker, IStrategy strategy, uint256 depositSharesToRemove - ) external onlyDelegationManager returns (uint256) { + ) external onlyDelegationManager nonReentrant returns (uint256) { require(strategy == beaconChainETHStrategy, InvalidStrategy()); int256 updatedShares = podOwnerDepositShares[staker] - int256(depositSharesToRemove); require(updatedShares >= 0, SharesNegative()); @@ -169,7 +169,7 @@ contract EigenPodManager is address staker, IStrategy strategy, uint256 shares - ) external onlyDelegationManager returns (uint256, uint256) { + ) external onlyDelegationManager nonReentrant returns (uint256, uint256) { require(strategy == beaconChainETHStrategy, InvalidStrategy()); return _addShares(staker, shares); } @@ -185,7 +185,7 @@ contract EigenPodManager is IStrategy strategy, IERC20, uint256 shares - ) external onlyDelegationManager { + ) external onlyDelegationManager nonReentrant { require(strategy == beaconChainETHStrategy, InvalidStrategy()); require(staker != address(0), InputAddressZero()); require(int256(shares) > 0, SharesNegative()); @@ -226,7 +226,7 @@ contract EigenPodManager is } /// @inheritdoc IShareManager - function increaseBurnableShares(IStrategy, uint256 addedSharesToBurn) external onlyDelegationManager { + function increaseBurnableShares(IStrategy, uint256 addedSharesToBurn) external onlyDelegationManager nonReentrant { burnableETHShares += addedSharesToBurn; emit BurnableETHSharesIncreased(addedSharesToBurn); }