@@ -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