From f081ccf979e4fc72dc44197eea2f10325973fde7 Mon Sep 17 00:00:00 2001 From: ChefMist <133624774+ChefMist@users.noreply.github.com> Date: Thu, 19 Sep 2024 21:01:01 +0800 Subject: [PATCH] feat: Align BinPositionManager slippage check with CLPositionManager (#25) * feat: zellic r1: slippage check for bin * feat: zellic r2: support hookdata for BinPositionManager (#26) * comment from #26 to remove unused ZERO_BYTES * test: remove unused error --- ...V2Test#testMigrateFromV2IncludingInit.snap | 2 +- ...apV2Test#testMigrateFromV2WithoutInit.snap | 2 +- ...t#testMigrateFromV2WithoutNativeToken.snap | 2 +- ...V3Test#testMigrateFromV3IncludingInit.snap | 2 +- ...apV3Test#testMigrateFromV3WithoutInit.snap | 2 +- ...t#testMigrateFromV3WithoutNativeToken.snap | 2 +- ...V2Test#testMigrateFromV2IncludingInit.snap | 2 +- ...apV2Test#testMigrateFromV2WithoutInit.snap | 2 +- ...t#testMigrateFromV2WithoutNativeToken.snap | 2 +- ...V3Test#testMigrateFromV3IncludingInit.snap | 2 +- ...apV3Test#testMigrateFromV3WithoutInit.snap | 2 +- ...t#testMigrateFromV3WithoutNativeToken.snap | 2 +- ...dLiquidity_OutsideActiveId_ExistingId.snap | 2 +- ...st_addLiquidity_OutsideActiveId_NewId.snap | 2 +- ...idityTest#test_addLiquidity_SingleBin.snap | 2 +- ...idityTest#test_addLiquidity_ThreeBins.snap | 2 +- ...Test#test_decreaseLiquidity_threeBins.snap | 2 +- ...test_decreaseLiquidity_threeBins_half.snap | 2 +- ...ger_NativeTokenTest#test_addLiquidity.snap | 2 +- ...ativeTokenTest#test_decreaseLiquidity.snap | 2 +- src/{pool-cl => }/libraries/SlippageCheck.sol | 2 +- src/pool-bin/BinMigrator.sol | 14 +-- src/pool-bin/BinPositionManager.sol | 24 ++--- src/pool-bin/interfaces/IBinMigrator.sol | 4 +- .../interfaces/IBinPositionManager.sol | 12 +-- src/pool-cl/CLPositionManager.sol | 2 +- test/mocks/MockReentrantPositionManager.sol | 4 +- .../BinPositionManager_ModifyLiquidites.t.sol | 87 +++++++++++++++---- test/pool-bin/helper/BinLiquidityHelper.sol | 10 ++- .../libraries/BinCalldataDecoder.t.sol | 4 +- test/pool-bin/migrator/BinMigratorFromV2.sol | 40 ++++----- test/pool-bin/migrator/BinMigratorFromV3.sol | 52 +++++------ test/pool-bin/shared/BinHookHookData.sol | 80 +++++++++++++++++ .../CLPositionManager.increaseLiquidity.t.sol | 2 +- .../position-managers/CLPositionManager.t.sol | 2 +- 35 files changed, 256 insertions(+), 123 deletions(-) rename src/{pool-cl => }/libraries/SlippageCheck.sol (98%) create mode 100644 test/pool-bin/shared/BinHookHookData.sol diff --git a/.forge-snapshots/BinMigratorFromPancakeswapV2Test#testMigrateFromV2IncludingInit.snap b/.forge-snapshots/BinMigratorFromPancakeswapV2Test#testMigrateFromV2IncludingInit.snap index aa0c682..b7e65a3 100644 --- a/.forge-snapshots/BinMigratorFromPancakeswapV2Test#testMigrateFromV2IncludingInit.snap +++ b/.forge-snapshots/BinMigratorFromPancakeswapV2Test#testMigrateFromV2IncludingInit.snap @@ -1 +1 @@ -1133895 \ No newline at end of file +1134821 \ No newline at end of file diff --git a/.forge-snapshots/BinMigratorFromPancakeswapV2Test#testMigrateFromV2WithoutInit.snap b/.forge-snapshots/BinMigratorFromPancakeswapV2Test#testMigrateFromV2WithoutInit.snap index 633e9dd..14df6e7 100644 --- a/.forge-snapshots/BinMigratorFromPancakeswapV2Test#testMigrateFromV2WithoutInit.snap +++ b/.forge-snapshots/BinMigratorFromPancakeswapV2Test#testMigrateFromV2WithoutInit.snap @@ -1 +1 @@ -1021136 \ No newline at end of file +1022062 \ No newline at end of file diff --git a/.forge-snapshots/BinMigratorFromPancakeswapV2Test#testMigrateFromV2WithoutNativeToken.snap b/.forge-snapshots/BinMigratorFromPancakeswapV2Test#testMigrateFromV2WithoutNativeToken.snap index 2b89362..fbc4d1c 100644 --- a/.forge-snapshots/BinMigratorFromPancakeswapV2Test#testMigrateFromV2WithoutNativeToken.snap +++ b/.forge-snapshots/BinMigratorFromPancakeswapV2Test#testMigrateFromV2WithoutNativeToken.snap @@ -1 +1 @@ -1090531 \ No newline at end of file +1091391 \ No newline at end of file diff --git a/.forge-snapshots/BinMigratorFromPancakeswapV3Test#testMigrateFromV3IncludingInit.snap b/.forge-snapshots/BinMigratorFromPancakeswapV3Test#testMigrateFromV3IncludingInit.snap index 005a1c3..066f104 100644 --- a/.forge-snapshots/BinMigratorFromPancakeswapV3Test#testMigrateFromV3IncludingInit.snap +++ b/.forge-snapshots/BinMigratorFromPancakeswapV3Test#testMigrateFromV3IncludingInit.snap @@ -1 +1 @@ -1206222 \ No newline at end of file +1207148 \ No newline at end of file diff --git a/.forge-snapshots/BinMigratorFromPancakeswapV3Test#testMigrateFromV3WithoutInit.snap b/.forge-snapshots/BinMigratorFromPancakeswapV3Test#testMigrateFromV3WithoutInit.snap index a1e737b..8ba6c7a 100644 --- a/.forge-snapshots/BinMigratorFromPancakeswapV3Test#testMigrateFromV3WithoutInit.snap +++ b/.forge-snapshots/BinMigratorFromPancakeswapV3Test#testMigrateFromV3WithoutInit.snap @@ -1 +1 @@ -1093558 \ No newline at end of file +1094484 \ No newline at end of file diff --git a/.forge-snapshots/BinMigratorFromPancakeswapV3Test#testMigrateFromV3WithoutNativeToken.snap b/.forge-snapshots/BinMigratorFromPancakeswapV3Test#testMigrateFromV3WithoutNativeToken.snap index 571c534..d51df27 100644 --- a/.forge-snapshots/BinMigratorFromPancakeswapV3Test#testMigrateFromV3WithoutNativeToken.snap +++ b/.forge-snapshots/BinMigratorFromPancakeswapV3Test#testMigrateFromV3WithoutNativeToken.snap @@ -1 +1 @@ -1156936 \ No newline at end of file +1157796 \ No newline at end of file diff --git a/.forge-snapshots/BinMigratorFromUniswapV2Test#testMigrateFromV2IncludingInit.snap b/.forge-snapshots/BinMigratorFromUniswapV2Test#testMigrateFromV2IncludingInit.snap index 9720290..c72f389 100644 --- a/.forge-snapshots/BinMigratorFromUniswapV2Test#testMigrateFromV2IncludingInit.snap +++ b/.forge-snapshots/BinMigratorFromUniswapV2Test#testMigrateFromV2IncludingInit.snap @@ -1 +1 @@ -1133907 \ No newline at end of file +1134833 \ No newline at end of file diff --git a/.forge-snapshots/BinMigratorFromUniswapV2Test#testMigrateFromV2WithoutInit.snap b/.forge-snapshots/BinMigratorFromUniswapV2Test#testMigrateFromV2WithoutInit.snap index 4bd3f44..c54c9e2 100644 --- a/.forge-snapshots/BinMigratorFromUniswapV2Test#testMigrateFromV2WithoutInit.snap +++ b/.forge-snapshots/BinMigratorFromUniswapV2Test#testMigrateFromV2WithoutInit.snap @@ -1 +1 @@ -1021148 \ No newline at end of file +1022074 \ No newline at end of file diff --git a/.forge-snapshots/BinMigratorFromUniswapV2Test#testMigrateFromV2WithoutNativeToken.snap b/.forge-snapshots/BinMigratorFromUniswapV2Test#testMigrateFromV2WithoutNativeToken.snap index 4087670..c9573cc 100644 --- a/.forge-snapshots/BinMigratorFromUniswapV2Test#testMigrateFromV2WithoutNativeToken.snap +++ b/.forge-snapshots/BinMigratorFromUniswapV2Test#testMigrateFromV2WithoutNativeToken.snap @@ -1 +1 @@ -1090528 \ No newline at end of file +1091387 \ No newline at end of file diff --git a/.forge-snapshots/BinMigratorFromUniswapV3Test#testMigrateFromV3IncludingInit.snap b/.forge-snapshots/BinMigratorFromUniswapV3Test#testMigrateFromV3IncludingInit.snap index 669c3ba..3ed3810 100644 --- a/.forge-snapshots/BinMigratorFromUniswapV3Test#testMigrateFromV3IncludingInit.snap +++ b/.forge-snapshots/BinMigratorFromUniswapV3Test#testMigrateFromV3IncludingInit.snap @@ -1 +1 @@ -1204204 \ No newline at end of file +1205130 \ No newline at end of file diff --git a/.forge-snapshots/BinMigratorFromUniswapV3Test#testMigrateFromV3WithoutInit.snap b/.forge-snapshots/BinMigratorFromUniswapV3Test#testMigrateFromV3WithoutInit.snap index ebf6fed..d9dcc7b 100644 --- a/.forge-snapshots/BinMigratorFromUniswapV3Test#testMigrateFromV3WithoutInit.snap +++ b/.forge-snapshots/BinMigratorFromUniswapV3Test#testMigrateFromV3WithoutInit.snap @@ -1 +1 @@ -1091540 \ No newline at end of file +1092466 \ No newline at end of file diff --git a/.forge-snapshots/BinMigratorFromUniswapV3Test#testMigrateFromV3WithoutNativeToken.snap b/.forge-snapshots/BinMigratorFromUniswapV3Test#testMigrateFromV3WithoutNativeToken.snap index e0906c0..be50129 100644 --- a/.forge-snapshots/BinMigratorFromUniswapV3Test#testMigrateFromV3WithoutNativeToken.snap +++ b/.forge-snapshots/BinMigratorFromUniswapV3Test#testMigrateFromV3WithoutNativeToken.snap @@ -1 +1 @@ -1154914 \ No newline at end of file +1155775 \ No newline at end of file diff --git a/.forge-snapshots/BinPositionManager_ModifyLiquidityTest#test_addLiquidity_OutsideActiveId_ExistingId.snap b/.forge-snapshots/BinPositionManager_ModifyLiquidityTest#test_addLiquidity_OutsideActiveId_ExistingId.snap index f23ce7b..6fa3528 100644 --- a/.forge-snapshots/BinPositionManager_ModifyLiquidityTest#test_addLiquidity_OutsideActiveId_ExistingId.snap +++ b/.forge-snapshots/BinPositionManager_ModifyLiquidityTest#test_addLiquidity_OutsideActiveId_ExistingId.snap @@ -1 +1 @@ -297121 \ No newline at end of file +297809 \ No newline at end of file diff --git a/.forge-snapshots/BinPositionManager_ModifyLiquidityTest#test_addLiquidity_OutsideActiveId_NewId.snap b/.forge-snapshots/BinPositionManager_ModifyLiquidityTest#test_addLiquidity_OutsideActiveId_NewId.snap index e258e35..faa5ced 100644 --- a/.forge-snapshots/BinPositionManager_ModifyLiquidityTest#test_addLiquidity_OutsideActiveId_NewId.snap +++ b/.forge-snapshots/BinPositionManager_ModifyLiquidityTest#test_addLiquidity_OutsideActiveId_NewId.snap @@ -1 +1 @@ -1135598 \ No newline at end of file +1136284 \ No newline at end of file diff --git a/.forge-snapshots/BinPositionManager_ModifyLiquidityTest#test_addLiquidity_SingleBin.snap b/.forge-snapshots/BinPositionManager_ModifyLiquidityTest#test_addLiquidity_SingleBin.snap index d18044f..628dbec 100644 --- a/.forge-snapshots/BinPositionManager_ModifyLiquidityTest#test_addLiquidity_SingleBin.snap +++ b/.forge-snapshots/BinPositionManager_ModifyLiquidityTest#test_addLiquidity_SingleBin.snap @@ -1 +1 @@ -541594 \ No newline at end of file +542371 \ No newline at end of file diff --git a/.forge-snapshots/BinPositionManager_ModifyLiquidityTest#test_addLiquidity_ThreeBins.snap b/.forge-snapshots/BinPositionManager_ModifyLiquidityTest#test_addLiquidity_ThreeBins.snap index 6c24137..cb5d354 100644 --- a/.forge-snapshots/BinPositionManager_ModifyLiquidityTest#test_addLiquidity_ThreeBins.snap +++ b/.forge-snapshots/BinPositionManager_ModifyLiquidityTest#test_addLiquidity_ThreeBins.snap @@ -1 +1 @@ -916140 \ No newline at end of file +916923 \ No newline at end of file diff --git a/.forge-snapshots/BinPositionManager_ModifyLiquidityTest#test_decreaseLiquidity_threeBins.snap b/.forge-snapshots/BinPositionManager_ModifyLiquidityTest#test_decreaseLiquidity_threeBins.snap index 0be2a10..baab317 100644 --- a/.forge-snapshots/BinPositionManager_ModifyLiquidityTest#test_decreaseLiquidity_threeBins.snap +++ b/.forge-snapshots/BinPositionManager_ModifyLiquidityTest#test_decreaseLiquidity_threeBins.snap @@ -1 +1 @@ -188680 \ No newline at end of file +189052 \ No newline at end of file diff --git a/.forge-snapshots/BinPositionManager_ModifyLiquidityTest#test_decreaseLiquidity_threeBins_half.snap b/.forge-snapshots/BinPositionManager_ModifyLiquidityTest#test_decreaseLiquidity_threeBins_half.snap index a1557dd..9579c8c 100644 --- a/.forge-snapshots/BinPositionManager_ModifyLiquidityTest#test_decreaseLiquidity_threeBins_half.snap +++ b/.forge-snapshots/BinPositionManager_ModifyLiquidityTest#test_decreaseLiquidity_threeBins_half.snap @@ -1 +1 @@ -207723 \ No newline at end of file +208183 \ No newline at end of file diff --git a/.forge-snapshots/BinPositionManager_NativeTokenTest#test_addLiquidity.snap b/.forge-snapshots/BinPositionManager_NativeTokenTest#test_addLiquidity.snap index 5dbbe4a..2c8cce3 100644 --- a/.forge-snapshots/BinPositionManager_NativeTokenTest#test_addLiquidity.snap +++ b/.forge-snapshots/BinPositionManager_NativeTokenTest#test_addLiquidity.snap @@ -1 +1 @@ -866176 \ No newline at end of file +866978 \ No newline at end of file diff --git a/.forge-snapshots/BinPositionManager_NativeTokenTest#test_decreaseLiquidity.snap b/.forge-snapshots/BinPositionManager_NativeTokenTest#test_decreaseLiquidity.snap index 5ec6321..c387daf 100644 --- a/.forge-snapshots/BinPositionManager_NativeTokenTest#test_decreaseLiquidity.snap +++ b/.forge-snapshots/BinPositionManager_NativeTokenTest#test_decreaseLiquidity.snap @@ -1 +1 @@ -193327 \ No newline at end of file +193706 \ No newline at end of file diff --git a/src/pool-cl/libraries/SlippageCheck.sol b/src/libraries/SlippageCheck.sol similarity index 98% rename from src/pool-cl/libraries/SlippageCheck.sol rename to src/libraries/SlippageCheck.sol index f6ed120..10c6a76 100644 --- a/src/pool-cl/libraries/SlippageCheck.sol +++ b/src/libraries/SlippageCheck.sol @@ -2,7 +2,7 @@ pragma solidity ^0.8.0; import {BalanceDelta} from "pancake-v4-core/src/types/BalanceDelta.sol"; -import {SafeCastTemp} from "../../libraries/SafeCast.sol"; +import {SafeCastTemp} from "./SafeCast.sol"; /// @title Slippage Check Library /// @notice a library for checking if a delta exceeds a maximum ceiling or fails to meet a minimum floor diff --git a/src/pool-bin/BinMigrator.sol b/src/pool-bin/BinMigrator.sol index f47efb3..7172f5d 100644 --- a/src/pool-bin/BinMigrator.sol +++ b/src/pool-bin/BinMigrator.sol @@ -48,14 +48,15 @@ contract BinMigrator is IBinMigrator, BaseMigrator, ReentrancyLock { poolKey: v4PoolParams.poolKey, amount0: amount0Input.toUint128(), amount1: amount1Input.toUint128(), - amount0Min: v4PoolParams.amount0Min, - amount1Min: v4PoolParams.amount1Min, + amount0Max: v4PoolParams.amount0Max, + amount1Max: v4PoolParams.amount1Max, activeIdDesired: v4PoolParams.activeIdDesired, idSlippage: v4PoolParams.idSlippage, deltaIds: v4PoolParams.deltaIds, distributionX: v4PoolParams.distributionX, distributionY: v4PoolParams.distributionY, - to: v4PoolParams.to + to: v4PoolParams.to, + hookData: new bytes(0) }); (uint256 amount0Consumed, uint256 amount1Consumed) = @@ -95,14 +96,15 @@ contract BinMigrator is IBinMigrator, BaseMigrator, ReentrancyLock { poolKey: v4PoolParams.poolKey, amount0: amount0Input.toUint128(), amount1: amount1Input.toUint128(), - amount0Min: v4PoolParams.amount0Min, - amount1Min: v4PoolParams.amount1Min, + amount0Max: v4PoolParams.amount0Max, + amount1Max: v4PoolParams.amount1Max, activeIdDesired: v4PoolParams.activeIdDesired, idSlippage: v4PoolParams.idSlippage, deltaIds: v4PoolParams.deltaIds, distributionX: v4PoolParams.distributionX, distributionY: v4PoolParams.distributionY, - to: v4PoolParams.to + to: v4PoolParams.to, + hookData: new bytes(0) }); (uint256 amount0Consumed, uint256 amount1Consumed) = _addLiquidityToTargetPool(addLiquidityParams, v4PoolParams.deadline); diff --git a/src/pool-bin/BinPositionManager.sol b/src/pool-bin/BinPositionManager.sol index 4941471..e412441 100644 --- a/src/pool-bin/BinPositionManager.sol +++ b/src/pool-bin/BinPositionManager.sol @@ -27,6 +27,7 @@ import {BinCalldataDecoder} from "./libraries/BinCalldataDecoder.sol"; import {BinFungibleToken} from "./BinFungibleToken.sol"; import {BinTokenLibrary} from "./libraries/BinTokenLibrary.sol"; import {Multicall_v4} from "../base/Multicall_v4.sol"; +import {SlippageCheck} from "../libraries/SlippageCheck.sol"; /// @title BinPositionManager /// @notice Contract for modifying liquidity for PCS v4 Bin pools @@ -44,8 +45,8 @@ contract BinPositionManager is using BinCalldataDecoder for bytes; using BinTokenLibrary for PoolId; using BinPoolParametersHelper for bytes32; + using SlippageCheck for BalanceDelta; - bytes constant ZERO_BYTES = new bytes(0); IBinPoolManager public immutable override binPoolManager; struct TokenPosition { @@ -200,16 +201,12 @@ contract BinPositionManager is (BalanceDelta delta, BinPool.MintArrays memory mintArray) = binPoolManager.mint( params.poolKey, IBinPoolManager.MintParams({liquidityConfigs: liquidityConfigs, amountIn: amountIn, salt: bytes32(0)}), - ZERO_BYTES + params.hookData ); - int256 amount0 = delta.amount0(); - int256 amount1 = delta.amount1(); - // delta amt0/amt1 will always be negative in mint case - if (amount0 > 0 || amount1 > 0) revert IncorrectOutputAmount(); - if (uint128(uint256(-amount0)) < params.amount0Min || uint128(uint256(-amount1)) < params.amount1Min) { - revert OutputAmountSlippage(); - } + /// Slippage checks, similar to CL type. However, this is different from TJ, in PCS v4, + /// as hooks can impact delta (take extra token), user need to be protected with amountMax instead + delta.validateMaxIn(params.amount0Max, params.amount0Max); // mint PoolId poolId = cachePoolKey(params.poolKey); @@ -237,14 +234,11 @@ contract BinPositionManager is BalanceDelta delta = binPoolManager.burn( params.poolKey, IBinPoolManager.BurnParams({ids: params.ids, amountsToBurn: params.amounts, salt: bytes32(0)}), - ZERO_BYTES + params.hookData ); - // delta amt0/amt1 will either be 0 or positive in removing liquidity - if (delta.amount0() < 0 || delta.amount1() < 0) revert IncorrectOutputAmount(); - if (uint128(delta.amount0()) < params.amount0Min || uint128(delta.amount1()) < params.amount1Min) { - revert OutputAmountSlippage(); - } + // Slippage checks, similar to CL type, if delta is negative, it will revert. + delta.validateMinOut(params.amount0Min, params.amount1Min); PoolId poolId = params.poolKey.toId(); uint256[] memory tokenIds = new uint256[](params.ids.length); diff --git a/src/pool-bin/interfaces/IBinMigrator.sol b/src/pool-bin/interfaces/IBinMigrator.sol index 115fa29..0a464e8 100644 --- a/src/pool-bin/interfaces/IBinMigrator.sol +++ b/src/pool-bin/interfaces/IBinMigrator.sol @@ -11,8 +11,8 @@ interface IBinMigrator is IBaseMigrator { /// except amount0/amount1 which will be calculated by migrator struct V4BinPoolParams { PoolKey poolKey; - uint128 amount0Min; - uint128 amount1Min; + uint128 amount0Max; + uint128 amount1Max; uint256 activeIdDesired; uint256 idSlippage; int256[] deltaIds; diff --git a/src/pool-bin/interfaces/IBinPositionManager.sol b/src/pool-bin/interfaces/IBinPositionManager.sol index 520175c..814d6fb 100644 --- a/src/pool-bin/interfaces/IBinPositionManager.sol +++ b/src/pool-bin/interfaces/IBinPositionManager.sol @@ -11,14 +11,12 @@ interface IBinPositionManager is IPositionManager { error IdOverflows(int256); error IdDesiredOverflows(uint24); error AddLiquidityInputActiveIdMismath(); - error OutputAmountSlippage(); - error IncorrectOutputAmount(); /// @notice BinAddLiquidityParams /// - amount0: Amount to send for token0 /// - amount1: Amount to send for token1 - /// - amount0Min: Min amount to send for token0 - /// - amount1Min: Min amount to send for token1 + /// - amount0Max: Max amount to send for token0 + /// - amount1Max: Max amount to send for token1 /// - activeIdDesired: Active id that user wants to add liquidity from /// - idSlippage: Number of id that are allowed to slip /// - deltaIds: List of delta ids to add liquidity (`deltaId = activeId - desiredId`) @@ -30,14 +28,15 @@ interface IBinPositionManager is IPositionManager { PoolKey poolKey; uint128 amount0; uint128 amount1; - uint128 amount0Min; - uint128 amount1Min; + uint128 amount0Max; + uint128 amount1Max; uint256 activeIdDesired; uint256 idSlippage; int256[] deltaIds; uint256[] distributionX; uint256[] distributionY; address to; + bytes hookData; } /// @notice BinRemoveLiquidityParams @@ -54,6 +53,7 @@ interface IBinPositionManager is IPositionManager { uint256[] ids; uint256[] amounts; address from; + bytes hookData; } function binPoolManager() external view returns (IBinPoolManager); diff --git a/src/pool-cl/CLPositionManager.sol b/src/pool-cl/CLPositionManager.sol index 3bb5f48..3a81b26 100644 --- a/src/pool-cl/CLPositionManager.sol +++ b/src/pool-cl/CLPositionManager.sol @@ -22,7 +22,7 @@ import {CalldataDecoder} from "../libraries/CalldataDecoder.sol"; import {CLCalldataDecoder} from "./libraries/CLCalldataDecoder.sol"; import {Actions} from "../libraries/Actions.sol"; import {ERC721Permit_v4} from "./base/ERC721Permit_v4.sol"; -import {SlippageCheck} from "./libraries/SlippageCheck.sol"; +import {SlippageCheck} from "../libraries/SlippageCheck.sol"; import {Multicall_v4} from "../base/Multicall_v4.sol"; import {CLNotifier} from "./base/CLNotifier.sol"; import {CLPositionInfo, CLPositionInfoLibrary} from "./libraries/CLPositionInfoLibrary.sol"; diff --git a/test/mocks/MockReentrantPositionManager.sol b/test/mocks/MockReentrantPositionManager.sol index c0ed6de..feb9bd2 100644 --- a/test/mocks/MockReentrantPositionManager.sol +++ b/test/mocks/MockReentrantPositionManager.sol @@ -88,8 +88,8 @@ contract MockReentrantPositionManager is Test { function _generateMockV4BinPoolParams() internal returns (IBinMigrator.V4BinPoolParams memory) { return IBinMigrator.V4BinPoolParams({ poolKey: _generateMockPoolKey(), - amount0Min: 0, - amount1Min: 0, + amount0Max: type(uint128).max, + amount1Max: type(uint128).max, activeIdDesired: 0, idSlippage: 0, deltaIds: new int256[](0), diff --git a/test/pool-bin/BinPositionManager_ModifyLiquidites.t.sol b/test/pool-bin/BinPositionManager_ModifyLiquidites.t.sol index 82518c4..4971678 100644 --- a/test/pool-bin/BinPositionManager_ModifyLiquidites.t.sol +++ b/test/pool-bin/BinPositionManager_ModifyLiquidites.t.sol @@ -29,6 +29,8 @@ import {BinTokenLibrary} from "../../src/pool-bin/libraries/BinTokenLibrary.sol" import {BinLiquidityHelper} from "./helper/BinLiquidityHelper.sol"; import {Actions} from "../../src/libraries/Actions.sol"; import {BaseActionsRouter} from "../../src/base/BaseActionsRouter.sol"; +import {SlippageCheck} from "../../src/libraries/SlippageCheck.sol"; +import {BinHookHookData} from "./shared/BinHookHookData.sol"; contract BinPositionManager_ModifyLiquidityTest is BinLiquidityHelper, GasSnapshot, TokenFixture, DeployPermit2 { using Planner for Plan; @@ -40,6 +42,8 @@ contract BinPositionManager_ModifyLiquidityTest is BinLiquidityHelper, GasSnapsh uint256 _deadline = block.timestamp + 1; PoolKey key1; + PoolKey key2; // with hookData hook + BinHookHookData hook; Vault vault; BinPoolManager poolManager; BinPositionManager binPm; @@ -70,6 +74,17 @@ contract BinPositionManager_ModifyLiquidityTest is BinLiquidityHelper, GasSnapsh }); binPm.initializePool(key1, activeId, ZERO_BYTES); + hook = new BinHookHookData(); + key2 = PoolKey({ + currency0: currency0, + currency1: currency1, + hooks: IHooks(address(hook)), + poolManager: IBinPoolManager(address(poolManager)), + fee: uint24(3000), // 3000 = 0.3% + parameters: bytes32(uint256(hook.getHooksRegistrationBitmap())).setBinStep(10) // binStep + }); + binPm.initializePool(key2, activeId, ZERO_BYTES); + // approval approveBinPm(address(this), key1, address(binPm), permit2); approveBinPm(alice, key1, address(binPm), permit2); @@ -144,31 +159,32 @@ contract BinPositionManager_ModifyLiquidityTest is BinLiquidityHelper, GasSnapsh binPm.modifyLiquidities(payload, _deadline); } - function test_addLiquidity_outputAmountSlippage() public { + function test_addLiquidity_MaximumAmountExceeded() public { uint24[] memory binIds = getBinIds(activeId, 3); IBinPositionManager.BinAddLiquidityParams memory param; bytes memory payload; - // overwrite amount0Min + // overwrite amount0Max param = _getAddParams(key1, binIds, 1 ether, 1 ether, activeId, alice); - param.amount0Min = 1.1 ether; + param.amount0Max = 0.9 ether; payload = Planner.init().add(Actions.BIN_ADD_LIQUIDITY, abi.encode(param)).encode(); - vm.expectRevert(abi.encodeWithSelector(IBinPositionManager.OutputAmountSlippage.selector)); + vm.expectRevert(abi.encodeWithSelector(SlippageCheck.MaximumAmountExceeded.selector, 0.9 ether, 1 ether)); binPm.modifyLiquidities(payload, _deadline); - // overwrite amount1Min + // overwrite amount0Max param = _getAddParams(key1, binIds, 1 ether, 1 ether, activeId, alice); - param.amount1Min = 1.1 ether; + param.amount0Max = 0.9 ether; payload = Planner.init().add(Actions.BIN_ADD_LIQUIDITY, abi.encode(param)).encode(); - vm.expectRevert(abi.encodeWithSelector(IBinPositionManager.OutputAmountSlippage.selector)); + vm.expectRevert(abi.encodeWithSelector(SlippageCheck.MaximumAmountExceeded.selector, 0.9 ether, 1 ether)); binPm.modifyLiquidities(payload, _deadline); // overwrite to 1 eth (expected to not fail) param = _getAddParams(key1, binIds, 1 ether, 1 ether, activeId, alice); - param.amount0Min = 1 ether; - param.amount1Min = 1 ether; + param.amount0Max = 0.9 ether; + param.amount0Max = 0.9 ether; Plan memory planner = Planner.init().add(Actions.BIN_ADD_LIQUIDITY, abi.encode(param)); payload = planner.finalizeModifyLiquidityWithClose(key1); + vm.expectRevert(abi.encodeWithSelector(SlippageCheck.MaximumAmountExceeded.selector, 0.9 ether, 1 ether)); binPm.modifyLiquidities(payload, _deadline); } @@ -244,9 +260,21 @@ contract BinPositionManager_ModifyLiquidityTest is BinLiquidityHelper, GasSnapsh snapEnd(); } - function test_addLiquidity_WithHook() public { - // todo: add liquidity, hook do a swap at beforeMint - // ref: https://github.com/pancakeswap/pancake-v4-periphery/blob/main/test/pool-bin/BinFungiblePositionManager_AddLiquidity.t.sol#L407 + function test_addLiquidity_HookData() public { + // add liquidity + uint24[] memory binIds = getBinIds(activeId, 3); + IBinPositionManager.BinAddLiquidityParams memory param = + _getAddParams(key2, binIds, 1 ether, 1 ether, activeId, address(this)); + param.hookData = "data"; + + Plan memory planner = Planner.init().add(Actions.BIN_ADD_LIQUIDITY, abi.encode(param)); + bytes memory payload = planner.finalizeModifyLiquidityWithClose(key1); + binPm.modifyLiquidities(payload, _deadline); + + assertEq(hook.beforeMintHookData(), param.hookData); + assertEq(hook.afterMintHookData(), param.hookData); + assertEq(hook.beforeBurnHookData(), ""); + assertEq(hook.afterBurnHookData(), ""); } function test_positions() public { @@ -291,7 +319,8 @@ contract BinPositionManager_ModifyLiquidityTest is BinLiquidityHelper, GasSnapsh binPm.modifyLiquidities(payload, _deadline); } - function test_decreaseLiquidity_OutputAmountSlippage() public { + function test_decreaseLiquidity_MinimumAmountInsufficient() public { + // add 1 ether of token0 and token1 uint24[] memory binIds = getBinIds(activeId, 3); (, uint256[] memory liquidityMinted) = _addLiquidity(binPm, key1, binIds, activeId); @@ -302,14 +331,18 @@ contract BinPositionManager_ModifyLiquidityTest is BinLiquidityHelper, GasSnapsh param = _getRemoveParams(key1, binIds, liquidityMinted, address(this)); param.amount0Min = 2 ether; payload = Planner.init().add(Actions.BIN_REMOVE_LIQUIDITY, abi.encode(param)).encode(); - vm.expectRevert(abi.encodeWithSelector(IBinPositionManager.OutputAmountSlippage.selector)); + vm.expectRevert( + abi.encodeWithSelector(SlippageCheck.MinimumAmountInsufficient.selector, param.amount0Min, 1 ether) + ); binPm.modifyLiquidities(payload, _deadline); // amount1 min slippage param = _getRemoveParams(key1, binIds, liquidityMinted, address(this)); param.amount1Min = 2 ether; payload = Planner.init().add(Actions.BIN_REMOVE_LIQUIDITY, abi.encode(param)).encode(); - vm.expectRevert(abi.encodeWithSelector(IBinPositionManager.OutputAmountSlippage.selector)); + vm.expectRevert( + abi.encodeWithSelector(SlippageCheck.MinimumAmountInsufficient.selector, param.amount1Min, 1 ether) + ); binPm.modifyLiquidities(payload, _deadline); // amount and amount0 min slippage @@ -317,7 +350,9 @@ contract BinPositionManager_ModifyLiquidityTest is BinLiquidityHelper, GasSnapsh param.amount0Min = 2 ether; param.amount1Min = 2 ether; payload = Planner.init().add(Actions.BIN_REMOVE_LIQUIDITY, abi.encode(param)).encode(); - vm.expectRevert(abi.encodeWithSelector(IBinPositionManager.OutputAmountSlippage.selector)); + vm.expectRevert( + abi.encodeWithSelector(SlippageCheck.MinimumAmountInsufficient.selector, param.amount0Min, 1 ether) + ); binPm.modifyLiquidities(payload, _deadline); } @@ -426,4 +461,24 @@ contract BinPositionManager_ModifyLiquidityTest is BinLiquidityHelper, GasSnapsh assertEq(token1.balanceOf(alice), 1 ether); assertEq(token1.balanceOf(alice), 1 ether); } + + function test_removeLiquidity_hookData() public { + // pre-req: add liquidity + uint24[] memory binIds = getBinIds(activeId, 3); + (, uint256[] memory liquidityMinted) = _addLiquidity(binPm, key2, binIds, activeId); + + // remove liquidity + IBinPositionManager.BinRemoveLiquidityParams memory param = + _getRemoveParams(key2, binIds, liquidityMinted, address(this)); + param.hookData = "data"; + Plan memory planner = Planner.init().add(Actions.BIN_REMOVE_LIQUIDITY, abi.encode(param)); + bytes memory payload = planner.finalizeModifyLiquidityWithClose(key2); + + binPm.modifyLiquidities(payload, _deadline); + + assertEq(hook.beforeMintHookData(), ""); + assertEq(hook.afterMintHookData(), ""); + assertEq(hook.beforeBurnHookData(), param.hookData); + assertEq(hook.afterBurnHookData(), param.hookData); + } } diff --git a/test/pool-bin/helper/BinLiquidityHelper.sol b/test/pool-bin/helper/BinLiquidityHelper.sol index d1f9bdc..f59080e 100644 --- a/test/pool-bin/helper/BinLiquidityHelper.sol +++ b/test/pool-bin/helper/BinLiquidityHelper.sol @@ -136,14 +136,15 @@ contract BinLiquidityHelper is Test { poolKey: key, amount0: amountX, amount1: amountY, - amount0Min: 0, - amount1Min: 0, + amount0Max: type(uint128).max, + amount1Max: type(uint128).max, activeIdDesired: uint256(activeId), idSlippage: 0, deltaIds: convertToRelative(binIds, activeId), distributionX: distribX, distributionY: distribY, - to: recipient + to: recipient, + hookData: new bytes(0) // replace param.hookData if needed after calling this func }); } @@ -163,7 +164,8 @@ contract BinLiquidityHelper is Test { amount1Min: 0, ids: ids, amounts: amounts, - from: from + from: from, + hookData: new bytes(0) // replace param.hookData if needed after calling this func }); } diff --git a/test/pool-bin/libraries/BinCalldataDecoder.t.sol b/test/pool-bin/libraries/BinCalldataDecoder.t.sol index 15860dc..bea4bd2 100644 --- a/test/pool-bin/libraries/BinCalldataDecoder.t.sol +++ b/test/pool-bin/libraries/BinCalldataDecoder.t.sol @@ -28,8 +28,8 @@ contract BinCalldataDecoderTest is Test { _assertEq(addLiquidityParams.poolKey, _addLiquidityParams.poolKey); assertEq(addLiquidityParams.amount0, _addLiquidityParams.amount0); assertEq(addLiquidityParams.amount1, _addLiquidityParams.amount1); - assertEq(addLiquidityParams.amount0Min, _addLiquidityParams.amount0Min); - assertEq(addLiquidityParams.amount1Min, _addLiquidityParams.amount1Min); + assertEq(addLiquidityParams.amount0Max, _addLiquidityParams.amount0Max); + assertEq(addLiquidityParams.amount1Max, _addLiquidityParams.amount1Max); assertEq(addLiquidityParams.activeIdDesired, _addLiquidityParams.activeIdDesired); assertEq(addLiquidityParams.idSlippage, _addLiquidityParams.idSlippage); _assertEq(addLiquidityParams.deltaIds, _addLiquidityParams.deltaIds); diff --git a/test/pool-bin/migrator/BinMigratorFromV2.sol b/test/pool-bin/migrator/BinMigratorFromV2.sol index 9d124a2..c369a01 100644 --- a/test/pool-bin/migrator/BinMigratorFromV2.sol +++ b/test/pool-bin/migrator/BinMigratorFromV2.sol @@ -150,8 +150,8 @@ abstract contract BinMigratorFromV2 is IBinMigrator.V4BinPoolParams memory v4BinPoolParams = IBinMigrator.V4BinPoolParams({ poolKey: params.poolKey, - amount0Min: params.amount0Min, - amount1Min: params.amount1Min, + amount0Max: params.amount0Max, + amount1Max: params.amount1Max, activeIdDesired: params.activeIdDesired, idSlippage: params.idSlippage, deltaIds: params.deltaIds, @@ -189,8 +189,8 @@ abstract contract BinMigratorFromV2 is IBinMigrator.V4BinPoolParams memory v4BinPoolParams = IBinMigrator.V4BinPoolParams({ poolKey: params.poolKey, - amount0Min: params.amount0Min, - amount1Min: params.amount1Min, + amount0Max: params.amount0Max, + amount1Max: params.amount1Max, activeIdDesired: params.activeIdDesired, idSlippage: params.idSlippage, deltaIds: params.deltaIds, @@ -278,8 +278,8 @@ abstract contract BinMigratorFromV2 is poolKeyMismatch.currency1 = Currency.wrap(address(token1)); IBinMigrator.V4BinPoolParams memory v4BinPoolParams = IBinMigrator.V4BinPoolParams({ poolKey: poolKeyMismatch, - amount0Min: params.amount0Min, - amount1Min: params.amount1Min, + amount0Max: params.amount0Max, + amount1Max: params.amount1Max, activeIdDesired: params.activeIdDesired, idSlippage: params.idSlippage, deltaIds: params.deltaIds, @@ -338,8 +338,8 @@ abstract contract BinMigratorFromV2 is IBinMigrator.V4BinPoolParams memory v4BinPoolParams = IBinMigrator.V4BinPoolParams({ poolKey: params.poolKey, - amount0Min: params.amount0Min, - amount1Min: params.amount1Min, + amount0Max: params.amount0Max, + amount1Max: params.amount1Max, activeIdDesired: params.activeIdDesired, idSlippage: params.idSlippage, deltaIds: params.deltaIds, @@ -429,8 +429,8 @@ abstract contract BinMigratorFromV2 is IBinMigrator.V4BinPoolParams memory v4BinPoolParams = IBinMigrator.V4BinPoolParams({ poolKey: params.poolKey, - amount0Min: params.amount0Min, - amount1Min: params.amount1Min, + amount0Max: params.amount0Max, + amount1Max: params.amount1Max, activeIdDesired: params.activeIdDesired, idSlippage: params.idSlippage, deltaIds: params.deltaIds, @@ -514,8 +514,8 @@ abstract contract BinMigratorFromV2 is IBinMigrator.V4BinPoolParams memory v4BinPoolParams = IBinMigrator.V4BinPoolParams({ poolKey: params.poolKey, - amount0Min: params.amount0Min, - amount1Min: params.amount1Min, + amount0Max: params.amount0Max, + amount1Max: params.amount1Max, activeIdDesired: params.activeIdDesired, idSlippage: params.idSlippage, deltaIds: params.deltaIds, @@ -610,8 +610,8 @@ abstract contract BinMigratorFromV2 is IBinMigrator.V4BinPoolParams memory v4BinPoolParams = IBinMigrator.V4BinPoolParams({ poolKey: params.poolKey, - amount0Min: params.amount0Min, - amount1Min: params.amount1Min, + amount0Max: params.amount0Max, + amount1Max: params.amount1Max, activeIdDesired: params.activeIdDesired, idSlippage: params.idSlippage, deltaIds: params.deltaIds, @@ -725,8 +725,8 @@ abstract contract BinMigratorFromV2 is // (0, 50%) (50%, 50%) (50%, 0) => (0, 50%) (50%, 50%) IBinMigrator.V4BinPoolParams memory v4BinPoolParams = IBinMigrator.V4BinPoolParams({ poolKey: params.poolKey, - amount0Min: params.amount0Min, - amount1Min: params.amount1Min, + amount0Max: params.amount0Max, + amount1Max: params.amount1Max, activeIdDesired: params.activeIdDesired, idSlippage: params.idSlippage, deltaIds: deltaIds, @@ -835,8 +835,8 @@ abstract contract BinMigratorFromV2 is // (0, 50%) (50%, 50%) (50%, 0) => (0, 50%) (50%, 50%) IBinMigrator.V4BinPoolParams memory v4BinPoolParams = IBinMigrator.V4BinPoolParams({ poolKey: params.poolKey, - amount0Min: params.amount0Min, - amount1Min: params.amount1Min, + amount0Max: params.amount0Max, + amount1Max: params.amount1Max, activeIdDesired: params.activeIdDesired, idSlippage: params.idSlippage, deltaIds: deltaIds, @@ -945,8 +945,8 @@ abstract contract BinMigratorFromV2 is IBinMigrator.V4BinPoolParams memory v4BinPoolParams = IBinMigrator.V4BinPoolParams({ poolKey: params.poolKey, - amount0Min: params.amount0Min, - amount1Min: params.amount1Min, + amount0Max: params.amount0Max, + amount1Max: params.amount1Max, activeIdDesired: params.activeIdDesired, idSlippage: params.idSlippage, deltaIds: params.deltaIds, diff --git a/test/pool-bin/migrator/BinMigratorFromV3.sol b/test/pool-bin/migrator/BinMigratorFromV3.sol index 2d0458d..f7fde97 100644 --- a/test/pool-bin/migrator/BinMigratorFromV3.sol +++ b/test/pool-bin/migrator/BinMigratorFromV3.sol @@ -179,8 +179,8 @@ abstract contract BinMigratorFromV3 is IBinMigrator.V4BinPoolParams memory v4BinPoolParams = IBinMigrator.V4BinPoolParams({ poolKey: params.poolKey, - amount0Min: params.amount0Min, - amount1Min: params.amount1Min, + amount0Max: params.amount0Max, + amount1Max: params.amount1Max, activeIdDesired: params.activeIdDesired, idSlippage: params.idSlippage, deltaIds: params.deltaIds, @@ -219,8 +219,8 @@ abstract contract BinMigratorFromV3 is IBinMigrator.V4BinPoolParams memory v4BinPoolParams = IBinMigrator.V4BinPoolParams({ poolKey: params.poolKey, - amount0Min: params.amount0Min, - amount1Min: params.amount1Min, + amount0Max: params.amount0Max, + amount1Max: params.amount1Max, activeIdDesired: params.activeIdDesired, idSlippage: params.idSlippage, deltaIds: params.deltaIds, @@ -310,8 +310,8 @@ abstract contract BinMigratorFromV3 is poolKeyMismatch.currency1 = Currency.wrap(address(token1)); IBinMigrator.V4BinPoolParams memory v4BinPoolParams = IBinMigrator.V4BinPoolParams({ poolKey: poolKeyMismatch, - amount0Min: params.amount0Min, - amount1Min: params.amount1Min, + amount0Max: params.amount0Max, + amount1Max: params.amount1Max, activeIdDesired: params.activeIdDesired, idSlippage: params.idSlippage, deltaIds: params.deltaIds, @@ -371,8 +371,8 @@ abstract contract BinMigratorFromV3 is IBinMigrator.V4BinPoolParams memory v4BinPoolParams = IBinMigrator.V4BinPoolParams({ poolKey: params.poolKey, - amount0Min: params.amount0Min, - amount1Min: params.amount1Min, + amount0Max: params.amount0Max, + amount1Max: params.amount1Max, activeIdDesired: params.activeIdDesired, idSlippage: params.idSlippage, deltaIds: params.deltaIds, @@ -460,8 +460,8 @@ abstract contract BinMigratorFromV3 is IBinMigrator.V4BinPoolParams memory v4BinPoolParams = IBinMigrator.V4BinPoolParams({ poolKey: params.poolKey, - amount0Min: params.amount0Min, - amount1Min: params.amount1Min, + amount0Max: params.amount0Max, + amount1Max: params.amount1Max, activeIdDesired: params.activeIdDesired, idSlippage: params.idSlippage, deltaIds: params.deltaIds, @@ -547,8 +547,8 @@ abstract contract BinMigratorFromV3 is IBinMigrator.V4BinPoolParams memory v4BinPoolParams = IBinMigrator.V4BinPoolParams({ poolKey: params.poolKey, - amount0Min: params.amount0Min, - amount1Min: params.amount1Min, + amount0Max: params.amount0Max, + amount1Max: params.amount1Max, activeIdDesired: params.activeIdDesired, idSlippage: params.idSlippage, deltaIds: params.deltaIds, @@ -644,8 +644,8 @@ abstract contract BinMigratorFromV3 is IBinMigrator.V4BinPoolParams memory v4BinPoolParams = IBinMigrator.V4BinPoolParams({ poolKey: params.poolKey, - amount0Min: params.amount0Min, - amount1Min: params.amount1Min, + amount0Max: params.amount0Max, + amount1Max: params.amount1Max, activeIdDesired: params.activeIdDesired, idSlippage: params.idSlippage, deltaIds: params.deltaIds, @@ -735,8 +735,8 @@ abstract contract BinMigratorFromV3 is IBinMigrator.V4BinPoolParams memory v4BinPoolParams = IBinMigrator.V4BinPoolParams({ poolKey: params.poolKey, - amount0Min: params.amount0Min, - amount1Min: params.amount1Min, + amount0Max: params.amount0Max, + amount1Max: params.amount1Max, activeIdDesired: params.activeIdDesired, idSlippage: params.idSlippage, deltaIds: params.deltaIds, @@ -852,8 +852,8 @@ abstract contract BinMigratorFromV3 is // (0, 50%) (50%, 50%) (50%, 0) => (0, 50%) (50%, 50%) IBinMigrator.V4BinPoolParams memory v4BinPoolParams = IBinMigrator.V4BinPoolParams({ poolKey: params.poolKey, - amount0Min: params.amount0Min, - amount1Min: params.amount1Min, + amount0Max: params.amount0Max, + amount1Max: params.amount1Max, activeIdDesired: params.activeIdDesired, idSlippage: params.idSlippage, deltaIds: deltaIds, @@ -959,8 +959,8 @@ abstract contract BinMigratorFromV3 is // (0, 50%) (50%, 50%) (50%, 0) => (0, 50%) (50%, 50%) IBinMigrator.V4BinPoolParams memory v4BinPoolParams = IBinMigrator.V4BinPoolParams({ poolKey: params.poolKey, - amount0Min: params.amount0Min, - amount1Min: params.amount1Min, + amount0Max: params.amount0Max, + amount1Max: params.amount1Max, activeIdDesired: params.activeIdDesired, idSlippage: params.idSlippage, deltaIds: deltaIds, @@ -1066,8 +1066,8 @@ abstract contract BinMigratorFromV3 is // (0, 50%) (50%, 50%) (50%, 0) => (0, 50%) (50%, 50%) IBinMigrator.V4BinPoolParams memory v4BinPoolParams = IBinMigrator.V4BinPoolParams({ poolKey: params.poolKey, - amount0Min: params.amount0Min, - amount1Min: params.amount1Min, + amount0Max: params.amount0Max, + amount1Max: params.amount1Max, activeIdDesired: params.activeIdDesired, idSlippage: params.idSlippage, deltaIds: deltaIds, @@ -1127,8 +1127,8 @@ abstract contract BinMigratorFromV3 is IBinMigrator.V4BinPoolParams memory v4BinPoolParams = IBinMigrator.V4BinPoolParams({ poolKey: params.poolKey, - amount0Min: params.amount0Min, - amount1Min: params.amount1Min, + amount0Max: params.amount0Max, + amount1Max: params.amount1Max, activeIdDesired: params.activeIdDesired, idSlippage: params.idSlippage, deltaIds: params.deltaIds, @@ -1226,8 +1226,8 @@ abstract contract BinMigratorFromV3 is IBinMigrator.V4BinPoolParams memory v4BinPoolParams = IBinMigrator.V4BinPoolParams({ poolKey: params.poolKey, - amount0Min: params.amount0Min, - amount1Min: params.amount1Min, + amount0Max: params.amount0Max, + amount1Max: params.amount1Max, activeIdDesired: params.activeIdDesired, idSlippage: params.idSlippage, deltaIds: params.deltaIds, diff --git a/test/pool-bin/shared/BinHookHookData.sol b/test/pool-bin/shared/BinHookHookData.sol new file mode 100644 index 0000000..338f4f0 --- /dev/null +++ b/test/pool-bin/shared/BinHookHookData.sol @@ -0,0 +1,80 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.20; + +import {IBinPoolManager} from "pancake-v4-core/src/pool-bin/interfaces/IBinPoolManager.sol"; +import {PoolKey} from "pancake-v4-core/src/types/PoolKey.sol"; +import {BalanceDelta, BalanceDeltaLibrary} from "pancake-v4-core/src/types/BalanceDelta.sol"; +import {BeforeSwapDelta, BeforeSwapDeltaLibrary} from "pancake-v4-core/src/types/BeforeSwapDelta.sol"; +import {BaseBinTestHook} from "pancake-v4-core/test/pool-bin/helpers/BaseBinTestHook.sol"; + +/// @notice This contract is NOT a production use contract. +/// It is meant to verify hook data flown to the hook +contract BinHookHookData is BaseBinTestHook { + bytes public beforeMintHookData; + bytes public afterMintHookData; + bytes public beforeBurnHookData; + bytes public afterBurnHookData; + + function getHooksRegistrationBitmap() external pure override returns (uint16) { + return _hooksRegistrationBitmapFrom( + Permissions({ + beforeInitialize: false, + afterInitialize: false, + beforeMint: true, + afterMint: true, + beforeBurn: true, + afterBurn: true, + beforeSwap: false, + afterSwap: false, + beforeDonate: false, + afterDonate: false, + beforeSwapReturnsDelta: false, + afterSwapReturnsDelta: false, + afterMintReturnsDelta: false, + afterBurnReturnsDelta: false + }) + ); + } + + function beforeMint(address, PoolKey calldata, IBinPoolManager.MintParams calldata, bytes calldata hookData) + external + virtual + override + returns (bytes4, uint24) + { + beforeMintHookData = hookData; + return (this.beforeMint.selector, 0); + } + + function afterMint( + address, /* sender **/ + PoolKey calldata, /* key **/ + IBinPoolManager.MintParams calldata, /* params **/ + BalanceDelta, + bytes calldata hookData + ) external override returns (bytes4, BalanceDelta) { + afterMintHookData = hookData; + return (this.afterMint.selector, BalanceDeltaLibrary.ZERO_DELTA); + } + + function beforeBurn(address, PoolKey calldata, IBinPoolManager.BurnParams calldata, bytes calldata hookData) + external + virtual + override + returns (bytes4) + { + beforeBurnHookData = hookData; + return this.beforeBurn.selector; + } + + function afterBurn( + address, /* sender **/ + PoolKey calldata, /* key **/ + IBinPoolManager.BurnParams calldata, /* params **/ + BalanceDelta, + bytes calldata hookData + ) external override returns (bytes4, BalanceDelta) { + afterBurnHookData = hookData; + return (this.afterBurn.selector, BalanceDeltaLibrary.ZERO_DELTA); + } +} diff --git a/test/pool-cl/position-managers/CLPositionManager.increaseLiquidity.t.sol b/test/pool-cl/position-managers/CLPositionManager.increaseLiquidity.t.sol index 522992e..da838d5 100644 --- a/test/pool-cl/position-managers/CLPositionManager.increaseLiquidity.t.sol +++ b/test/pool-cl/position-managers/CLPositionManager.increaseLiquidity.t.sol @@ -20,7 +20,7 @@ import {IERC20} from "forge-std/interfaces/IERC20.sol"; import {CLPositionManager} from "../../../src/pool-cl/CLPositionManager.sol"; import {DeltaResolver} from "../../../src/base/DeltaResolver.sol"; -import {SlippageCheck} from "../../../src/pool-cl/libraries/SlippageCheck.sol"; +import {SlippageCheck} from "../../../src/libraries/SlippageCheck.sol"; import {ICLPositionManager} from "../../../src/pool-cl/interfaces/ICLPositionManager.sol"; import {Actions} from "../../../src/libraries/Actions.sol"; import {Planner, Plan} from "../../../src/libraries/Planner.sol"; diff --git a/test/pool-cl/position-managers/CLPositionManager.t.sol b/test/pool-cl/position-managers/CLPositionManager.t.sol index 741ca17..42c8a95 100644 --- a/test/pool-cl/position-managers/CLPositionManager.t.sol +++ b/test/pool-cl/position-managers/CLPositionManager.t.sol @@ -24,7 +24,7 @@ import {IERC20} from "forge-std/interfaces/IERC20.sol"; import {IPositionManager} from "../../../src/interfaces/IPositionManager.sol"; import {CLPositionManager} from "../../../src/pool-cl/CLPositionManager.sol"; import {DeltaResolver} from "../../../src/base/DeltaResolver.sol"; -import {SlippageCheck} from "../../../src/pool-cl/libraries/SlippageCheck.sol"; +import {SlippageCheck} from "../../../src/libraries/SlippageCheck.sol"; import {ICLPositionManager} from "../../../src/pool-cl/interfaces/ICLPositionManager.sol"; import {Actions} from "../../../src/libraries/Actions.sol"; import {Planner, Plan} from "../../../src/libraries/Planner.sol";