From 5d343d95ac078e7d5641b08e9574e38af667b3ce Mon Sep 17 00:00:00 2001 From: chefburger Date: Fri, 29 Nov 2024 16:30:09 +0800 Subject: [PATCH] fix: resolve issues from comments --- src/pool-bin/BinPositionManager.sol | 34 ++++++------ .../interfaces/IBinPositionManager.sol | 8 ++- src/pool-bin/libraries/BinCalldataDecoder.sol | 2 +- .../BinPositionManager_ModifyLiquidites.t.sol | 54 +++++++++++++++++-- 4 files changed, 70 insertions(+), 28 deletions(-) diff --git a/src/pool-bin/BinPositionManager.sol b/src/pool-bin/BinPositionManager.sol index cf2a026..8b214f5 100644 --- a/src/pool-bin/BinPositionManager.sol +++ b/src/pool-bin/BinPositionManager.sol @@ -50,7 +50,7 @@ contract BinPositionManager is using BinTokenLibrary for PoolId; using BinPoolParametersHelper for bytes32; using SlippageCheck for BalanceDelta; - using SafeCastTemp for *; + using SafeCastTemp for uint256; IBinPoolManager public immutable override binPoolManager; @@ -132,7 +132,20 @@ contract BinPositionManager is if (action == Actions.BIN_ADD_LIQUIDITY) { IBinPositionManager.BinAddLiquidityParams calldata liquidityParams = params.decodeBinAddLiquidityParams(); - _addLiquidity(liquidityParams); + _addLiquidity( + liquidityParams.poolKey, + liquidityParams.amount0, + liquidityParams.amount1, + liquidityParams.amount0Max, + liquidityParams.amount1Max, + liquidityParams.activeIdDesired, + liquidityParams.idSlippage, + liquidityParams.deltaIds, + liquidityParams.distributionX, + liquidityParams.distributionY, + liquidityParams.to, + liquidityParams.hookData + ); return; } else if (action == Actions.BIN_ADD_LIQUIDITY_FROM_DELTAS) { IBinPositionManager.BinAddLiquidityFromDeltasParams calldata liquidityParams = @@ -209,23 +222,6 @@ contract BinPositionManager is } } - function _addLiquidity(IBinPositionManager.BinAddLiquidityParams calldata params) internal { - _addLiquidity( - params.poolKey, - params.amount0, - params.amount1, - params.amount0Max, - params.amount1Max, - params.activeIdDesired, - params.idSlippage, - params.deltaIds, - params.distributionX, - params.distributionY, - params.to, - params.hookData - ); - } - function _addLiquidity( PoolKey calldata poolKey, uint128 amount0, diff --git a/src/pool-bin/interfaces/IBinPositionManager.sol b/src/pool-bin/interfaces/IBinPositionManager.sol index 644a8a8..8b33093 100644 --- a/src/pool-bin/interfaces/IBinPositionManager.sol +++ b/src/pool-bin/interfaces/IBinPositionManager.sol @@ -23,7 +23,7 @@ interface IBinPositionManager is IPositionManager { /// - distributionX: Distribution of tokenX with sum(distributionX) = 1e18 (100%) or 0 (0%) /// - distributionY: Distribution of tokenY with sum(distributionY) = 1e18 (100%) or 0 (0%) /// - to: Address of recipient - /// - deadline: Deadline of transaction + /// - hookData: Data to pass to the hook struct BinAddLiquidityParams { PoolKey poolKey; uint128 amount0; @@ -45,7 +45,7 @@ interface IBinPositionManager is IPositionManager { /// - ids: List of bin ids to remove liquidity /// - amounts: List of share amount to remove for each bin /// - from: Address of NFT holder to burn the NFT - /// - deadline: Deadline of transaction + /// - hookData: Data to pass to the hook struct BinRemoveLiquidityParams { PoolKey poolKey; uint128 amount0Min; @@ -65,11 +65,9 @@ interface IBinPositionManager is IPositionManager { /// - distributionX: Distribution of tokenX with sum(distributionX) = 1e18 (100%) or 0 (0%) /// - distributionY: Distribution of tokenY with sum(distributionY) = 1e18 (100%) or 0 (0%) /// - to: Address of recipient - /// - deadline: Deadline of transaction + /// - hookData: Data to pass to the hook struct BinAddLiquidityFromDeltasParams { PoolKey poolKey; - uint128 amount0; - uint128 amount1; uint128 amount0Max; uint128 amount1Max; uint256 activeIdDesired; diff --git a/src/pool-bin/libraries/BinCalldataDecoder.sol b/src/pool-bin/libraries/BinCalldataDecoder.sol index c05fbd4..4ee261a 100644 --- a/src/pool-bin/libraries/BinCalldataDecoder.sol +++ b/src/pool-bin/libraries/BinCalldataDecoder.sol @@ -30,7 +30,7 @@ library BinCalldataDecoder { } } - /// @dev equivalent to: abi.decode(params, (IBinPositionManager.BinAddLiquidityParams)) + /// @dev equivalent to: abi.decode(params, (IBinPositionManager.BinAddLiquidityFromDeltasParams)) function decodeBinAddLiquidityFromDeltasParams(bytes calldata params) internal pure diff --git a/test/pool-bin/BinPositionManager_ModifyLiquidites.t.sol b/test/pool-bin/BinPositionManager_ModifyLiquidites.t.sol index 9d7bd0d..5167509 100644 --- a/test/pool-bin/BinPositionManager_ModifyLiquidites.t.sol +++ b/test/pool-bin/BinPositionManager_ModifyLiquidites.t.sol @@ -913,9 +913,23 @@ contract BinPositionManager_ModifyLiquidityTest is BinLiquidityHelper, GasSnapsh planner.add(Actions.SETTLE, abi.encode(fotKey.currency1, amount1, true)); uint24[] memory binIds = getBinIds(activeId, 1); - IBinPositionManager.BinAddLiquidityParams memory param = _getAddParams( + IBinPositionManager.BinAddLiquidityParams memory _param = _getAddParams( fotKey, binIds, uint128(amountAfterTransfer), uint128(amountAfterTransfer), activeId, address(this) ); + + IBinPositionManager.BinAddLiquidityFromDeltasParams memory param = IBinPositionManager + .BinAddLiquidityFromDeltasParams({ + poolKey: _param.poolKey, + amount0Max: _param.amount0Max, + amount1Max: _param.amount1Max, + activeIdDesired: _param.activeIdDesired, + idSlippage: _param.idSlippage, + deltaIds: _param.deltaIds, + distributionX: _param.distributionX, + distributionY: _param.distributionY, + to: _param.to, + hookData: _param.hookData + }); planner.add(Actions.BIN_ADD_LIQUIDITY_FROM_DELTAS, abi.encode(param)); bytes memory plan = planner.encode(); @@ -949,8 +963,22 @@ contract BinPositionManager_ModifyLiquidityTest is BinLiquidityHelper, GasSnapsh planner.add(Actions.SETTLE, abi.encode(key1.currency1, amountToSend, true)); uint24[] memory binIds = getBinIds(activeId, 1); - IBinPositionManager.BinAddLiquidityParams memory param = + IBinPositionManager.BinAddLiquidityParams memory _param = _getAddParams(key1, binIds, uint128(amountToSend), uint128(amountToSend), activeId, address(this)); + + IBinPositionManager.BinAddLiquidityFromDeltasParams memory param = IBinPositionManager + .BinAddLiquidityFromDeltasParams({ + poolKey: _param.poolKey, + amount0Max: _param.amount0Max, + amount1Max: _param.amount1Max, + activeIdDesired: _param.activeIdDesired, + idSlippage: _param.idSlippage, + deltaIds: _param.deltaIds, + distributionX: _param.distributionX, + distributionY: _param.distributionY, + to: _param.to, + hookData: _param.hookData + }); planner.add(Actions.BIN_ADD_LIQUIDITY_FROM_DELTAS, abi.encode(param)); bytes memory plan = planner.encode(); @@ -1002,13 +1030,33 @@ contract BinPositionManager_ModifyLiquidityTest is BinLiquidityHelper, GasSnapsh planner.add(Actions.SETTLE, abi.encode(fotKey.currency1, amount1, true)); uint24[] memory binIds = getBinIds(activeId, binNum); - IBinPositionManager.BinAddLiquidityParams memory param = _getAddParams( + IBinPositionManager.BinAddLiquidityParams memory _param = _getAddParams( fotKey, binIds, uint128(amount0AfterTransfer), uint128(amount1AfterTransfer), activeId, address(this) ); + IBinPositionManager.BinAddLiquidityFromDeltasParams memory param = IBinPositionManager + .BinAddLiquidityFromDeltasParams({ + poolKey: _param.poolKey, + amount0Max: _param.amount0Max, + amount1Max: _param.amount1Max, + activeIdDesired: _param.activeIdDesired, + idSlippage: _param.idSlippage, + deltaIds: _param.deltaIds, + distributionX: _param.distributionX, + distributionY: _param.distributionY, + to: _param.to, + hookData: _param.hookData + }); planner.add(Actions.BIN_ADD_LIQUIDITY_FROM_DELTAS, abi.encode(param)); bytes memory plan = planner.encode(); + // if the fee is 100% and amount of normal currency is 0, the transaction will revert + if (bips == 10000 && ((isCurrency0FotToken && amount1 == 0) || (!isCurrency0FotToken && amount0 == 0))) { + vm.expectRevert(); + binPm.modifyLiquidities(plan, _deadline); + return; + } + binPm.modifyLiquidities(plan, _deadline); uint256 token0After = fotKey.currency0.balanceOf(address(this));