Skip to content

Commit 07ed9b2

Browse files
committed
reentrancy guard in registry
Also maintains CEI pattern during validityBond challenge Spearbit #12
1 parent 88aad58 commit 07ed9b2

File tree

1 file changed

+18
-8
lines changed

1 file changed

+18
-8
lines changed

src/EulerSwapRegistry.sol

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@ contract EulerSwapRegistry is IEulerSwapRegistry, EVCUtil {
1919

2020
/// @dev Pool instances must be deployed by this factory
2121
address public immutable eulerSwapFactory;
22+
/// @dev Reentrancy guard, shares a storage slot with validVaultPerspective
23+
bool locked;
2224
/// @dev Perspective that checks whether vaults used by a pool are permitted by this registry
2325
address public validVaultPerspective;
2426
/// @dev Curator can set the minimum validity bond, update the valid vault perspective,
@@ -56,6 +58,7 @@ contract EulerSwapRegistry is IEulerSwapRegistry, EVCUtil {
5658
address recipient
5759
);
5860

61+
error Locked();
5962
error Unauthorized();
6063
error NotEulerSwapPool();
6164
error OldOperatorStillInstalled();
@@ -81,8 +84,15 @@ contract EulerSwapRegistry is IEulerSwapRegistry, EVCUtil {
8184
curator = curator_;
8285
}
8386

87+
modifier nonReentrant() {
88+
require(!locked, Locked());
89+
locked = true;
90+
_;
91+
locked = false;
92+
}
93+
8494
/// @inheritdoc IEulerSwapRegistry
85-
function registerPool(address poolAddr) external payable {
95+
function registerPool(address poolAddr) external payable nonReentrant {
8696
require(IEulerSwapFactory(eulerSwapFactory).deployedPools(poolAddr), NotEulerSwapPool());
8797
IEulerSwap pool = IEulerSwap(poolAddr);
8898
IEulerSwap.StaticParams memory sParams = pool.getStaticParams();
@@ -111,7 +121,7 @@ contract EulerSwapRegistry is IEulerSwapRegistry, EVCUtil {
111121
}
112122

113123
/// @inheritdoc IEulerSwapRegistry
114-
function unregisterPool() external {
124+
function unregisterPool() external nonReentrant {
115125
address eulerAccount = _msgSender();
116126
uninstall(eulerAccount, eulerAccount, false);
117127
}
@@ -122,24 +132,24 @@ contract EulerSwapRegistry is IEulerSwapRegistry, EVCUtil {
122132
}
123133

124134
/// @inheritdoc IEulerSwapRegistry
125-
function curatorUnregisterPool(address pool, address bondReceiver) external onlyCurator {
135+
function curatorUnregisterPool(address pool, address bondReceiver) external onlyCurator nonReentrant {
126136
address eulerAccount = IEulerSwap(pool).getStaticParams().eulerAccount;
127137
if (bondReceiver == address(0)) bondReceiver = eulerAccount;
128138
uninstall(eulerAccount, bondReceiver, true);
129139
}
130140

131141
/// @inheritdoc IEulerSwapRegistry
132-
function transferCurator(address newCurator) external onlyCurator {
142+
function transferCurator(address newCurator) external onlyCurator nonReentrant {
133143
curator = newCurator;
134144
}
135145

136146
/// @inheritdoc IEulerSwapRegistry
137-
function setMinimumValidityBond(uint256 newMinimum) external onlyCurator {
147+
function setMinimumValidityBond(uint256 newMinimum) external onlyCurator nonReentrant {
138148
minimumValidityBond = newMinimum;
139149
}
140150

141151
/// @inheritdoc IEulerSwapRegistry
142-
function setValidVaultPerspective(address newPerspective) external onlyCurator {
152+
function setValidVaultPerspective(address newPerspective) external onlyCurator nonReentrant {
143153
validVaultPerspective = newPerspective;
144154
}
145155

@@ -151,7 +161,7 @@ contract EulerSwapRegistry is IEulerSwapRegistry, EVCUtil {
151161
uint256 amount,
152162
bool exactIn,
153163
address recipient
154-
) external {
164+
) external nonReentrant {
155165
IEulerSwap pool = IEulerSwap(poolAddr);
156166
address eulerAccount = pool.getStaticParams().eulerAccount;
157167
bool asset0IsInput;
@@ -295,9 +305,9 @@ contract EulerSwapRegistry is IEulerSwapRegistry, EVCUtil {
295305
bondAmount = validityBonds[pool];
296306

297307
if (bondAmount != 0) {
308+
validityBonds[pool] = 0;
298309
(bool success,) = recipient.call{value: bondAmount}("");
299310
require(success, ChallengeMissingBond());
300-
validityBonds[pool] = 0;
301311
}
302312
}
303313

0 commit comments

Comments
 (0)