|
1 | 1 | // SPDX-License-Identifier: GPL-2.0-or-later
|
2 | 2 | pragma solidity ^0.8.24;
|
3 | 3 |
|
| 4 | +import {stdError} from "forge-std/Test.sol"; |
4 | 5 | import {IPoolManager} from "@uniswap/v4-core/src/interfaces/IPoolManager.sol";
|
5 | 6 | import {PoolManagerDeployer} from "./utils/PoolManagerDeployer.sol";
|
6 | 7 | import {Hooks} from "@uniswap/v4-core/src/libraries/Hooks.sol";
|
@@ -247,4 +248,57 @@ contract FactoryTest is EulerSwapTestBase {
|
247 | 248 | vm.expectRevert(EulerSwap.Locked.selector);
|
248 | 249 | EulerSwap(eulerSwapImpl).getReserves();
|
249 | 250 | }
|
| 251 | + |
| 252 | + |
| 253 | + |
| 254 | + address alice = makeAddr("alice"); |
| 255 | + address bob = makeAddr("bob"); |
| 256 | + |
| 257 | + function test_multipleUninstalls() public { |
| 258 | + // Parameters for deployPool() |
| 259 | + IEulerSwap.Params memory params = IEulerSwap.Params({ |
| 260 | + vault0: address(eTST), |
| 261 | + vault1: address(eTST2), |
| 262 | + eulerAccount: address(0), |
| 263 | + equilibriumReserve0: 1e18, |
| 264 | + equilibriumReserve1: 1e18, |
| 265 | + priceX: 1e18, |
| 266 | + priceY: 1e18, |
| 267 | + concentrationX: 0, |
| 268 | + concentrationY: 0, |
| 269 | + fee: 0, |
| 270 | + protocolFee: 0, |
| 271 | + protocolFeeRecipient: address(0) |
| 272 | + }); |
| 273 | + IEulerSwap.InitialState memory initialState = IEulerSwap.InitialState({ |
| 274 | + currReserve0: 1e18, |
| 275 | + currReserve1: 1e18 |
| 276 | + }); |
| 277 | + bytes32 salt = bytes32(0); |
| 278 | + |
| 279 | + // Deploy pool for Alice |
| 280 | + params.eulerAccount = alice; |
| 281 | + address alicePool = eulerSwapFactory.computePoolAddress(params, salt); |
| 282 | + vm.startPrank(alice); |
| 283 | + evc.setAccountOperator(alice, alicePool, true); |
| 284 | + eulerSwapFactory.deployPool(params, initialState, salt); |
| 285 | + |
| 286 | + // Deploy pool for Bob |
| 287 | + params.eulerAccount = bob; |
| 288 | + address bobPool = eulerSwapFactory.computePoolAddress(params, salt); |
| 289 | + vm.startPrank(bob); |
| 290 | + evc.setAccountOperator(bob, bobPool, true); |
| 291 | + eulerSwapFactory.deployPool(params, initialState, salt); |
| 292 | + |
| 293 | + // Uninstall pool for Alice |
| 294 | + vm.startPrank(alice); |
| 295 | + evc.setAccountOperator(alice, alicePool, false); |
| 296 | + eulerSwapFactory.uninstallPool(); |
| 297 | + |
| 298 | + // Uninstalling pool for Bob reverts due to an OOB access of the allPools array |
| 299 | + vm.startPrank(bob); |
| 300 | + evc.setAccountOperator(bob, bobPool, false); |
| 301 | + vm.expectRevert(stdError.indexOOBError); |
| 302 | + eulerSwapFactory.uninstallPool(); |
| 303 | + } |
250 | 304 | }
|
0 commit comments