@@ -4,15 +4,20 @@ pragma solidity ^0.8.24;
4
4
import {EulerSwapTestBase, EulerSwap, EulerSwapPeriphery, IEulerSwap} from "./EulerSwapTestBase.t.sol " ;
5
5
import {TestERC20} from "evk-test/unit/evault/EVaultTestBase.t.sol " ;
6
6
import {EulerSwap} from "../src/EulerSwap.sol " ;
7
+ import {UniswapHook} from "../src/UniswapHook.sol " ;
7
8
8
9
import {PoolKey} from "@uniswap/v4-core/src/types/PoolKey.sol " ;
9
10
import {IPoolManager, PoolManagerDeployer} from "./utils/PoolManagerDeployer.sol " ;
10
11
import {PoolSwapTest} from "@uniswap/v4-core/src/test/PoolSwapTest.sol " ;
11
12
import {MinimalRouter} from "./utils/MinimalRouter.sol " ;
13
+ import {PoolModifyLiquidityTest} from "@uniswap/v4-core/src/test/PoolModifyLiquidityTest.sol " ;
12
14
import {Currency, CurrencyLibrary} from "@uniswap/v4-core/src/types/Currency.sol " ;
13
15
import {StateLibrary} from "@uniswap/v4-core/src/libraries/StateLibrary.sol " ;
14
16
import {TickMath} from "@uniswap/v4-core/src/libraries/TickMath.sol " ;
15
17
import {BalanceDelta} from "@uniswap/v4-core/src/types/BalanceDelta.sol " ;
18
+ import {CustomRevert} from "@uniswap/v4-core/src/libraries/CustomRevert.sol " ;
19
+ import {IHooks} from "@uniswap/v4-core/src/interfaces/IHooks.sol " ;
20
+ import {Hooks} from "@uniswap/v4-core/src/libraries/Hooks.sol " ;
16
21
17
22
contract HookSwapsTest is EulerSwapTestBase {
18
23
using StateLibrary for IPoolManager;
@@ -22,6 +27,7 @@ contract HookSwapsTest is EulerSwapTestBase {
22
27
IPoolManager public poolManager;
23
28
PoolSwapTest public swapRouter;
24
29
MinimalRouter public minimalRouter;
30
+ PoolModifyLiquidityTest public liquidityManager;
25
31
26
32
PoolSwapTest.TestSettings public settings = PoolSwapTest.TestSettings ({takeClaims: false , settleUsingBurn: false });
27
33
@@ -31,6 +37,7 @@ contract HookSwapsTest is EulerSwapTestBase {
31
37
poolManager = PoolManagerDeployer.deploy (address (this ));
32
38
swapRouter = new PoolSwapTest (poolManager);
33
39
minimalRouter = new MinimalRouter (poolManager);
40
+ liquidityManager = new PoolModifyLiquidityTest (poolManager);
34
41
35
42
deployEulerSwap (address (poolManager));
36
43
@@ -119,6 +126,35 @@ contract HookSwapsTest is EulerSwapTestBase {
119
126
vm.stopPrank ();
120
127
}
121
128
129
+ /// @dev adding liquidity as a concentrated liquidity position will revert
130
+ function test_revertAddConcentratedLiquidity () public {
131
+ assetTST.mint (anyone, 10000e18 );
132
+ assetTST2.mint (anyone, 10000e18 );
133
+
134
+ vm.startPrank (anyone);
135
+ assetTST.approve (address (liquidityManager), 1e18 );
136
+ assetTST2.approve (address (liquidityManager), 1e18 );
137
+
138
+ PoolKey memory poolKey = eulerSwap.poolKey ();
139
+
140
+ // hook intentionally reverts to prevent v3-CLAMM positions
141
+ vm.expectRevert (
142
+ abi.encodeWithSelector (
143
+ CustomRevert.WrappedError.selector ,
144
+ address (eulerSwap),
145
+ IHooks.beforeAddLiquidity.selector ,
146
+ abi.encodeWithSelector (UniswapHook.NativeConcentratedLiquidityUnsupported.selector ),
147
+ abi.encodeWithSelector (Hooks.HookCallFailed.selector )
148
+ )
149
+ );
150
+ liquidityManager.modifyLiquidity (
151
+ poolKey,
152
+ IPoolManager.ModifyLiquidityParams ({tickLower: - 10 , tickUpper: 10 , liquidityDelta: 1000 , salt: bytes32 (0 )}),
153
+ ""
154
+ );
155
+ vm.stopPrank ();
156
+ }
157
+
122
158
function _swap (PoolKey memory key , bool zeroForOne , bool exactInput , uint256 amount ) internal {
123
159
IPoolManager.SwapParams memory swapParams = IPoolManager.SwapParams ({
124
160
zeroForOne: zeroForOne,
0 commit comments