Skip to content

Commit

Permalink
feat: Align BinPositionManager slippage check with CLPositionManager (#…
Browse files Browse the repository at this point in the history
…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
  • Loading branch information
ChefMist authored Sep 19, 2024
1 parent 37c16f2 commit f081ccf
Show file tree
Hide file tree
Showing 35 changed files with 256 additions and 123 deletions.
Original file line number Diff line number Diff line change
@@ -1 +1 @@
1133895
1134821
Original file line number Diff line number Diff line change
@@ -1 +1 @@
1021136
1022062
Original file line number Diff line number Diff line change
@@ -1 +1 @@
1090531
1091391
Original file line number Diff line number Diff line change
@@ -1 +1 @@
1206222
1207148
Original file line number Diff line number Diff line change
@@ -1 +1 @@
1093558
1094484
Original file line number Diff line number Diff line change
@@ -1 +1 @@
1156936
1157796
Original file line number Diff line number Diff line change
@@ -1 +1 @@
1133907
1134833
Original file line number Diff line number Diff line change
@@ -1 +1 @@
1021148
1022074
Original file line number Diff line number Diff line change
@@ -1 +1 @@
1090528
1091387
Original file line number Diff line number Diff line change
@@ -1 +1 @@
1204204
1205130
Original file line number Diff line number Diff line change
@@ -1 +1 @@
1091540
1092466
Original file line number Diff line number Diff line change
@@ -1 +1 @@
1154914
1155775
Original file line number Diff line number Diff line change
@@ -1 +1 @@
297121
297809
Original file line number Diff line number Diff line change
@@ -1 +1 @@
1135598
1136284
Original file line number Diff line number Diff line change
@@ -1 +1 @@
541594
542371
Original file line number Diff line number Diff line change
@@ -1 +1 @@
916140
916923
Original file line number Diff line number Diff line change
@@ -1 +1 @@
188680
189052
Original file line number Diff line number Diff line change
@@ -1 +1 @@
207723
208183
Original file line number Diff line number Diff line change
@@ -1 +1 @@
866176
866978
Original file line number Diff line number Diff line change
@@ -1 +1 @@
193327
193706
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
14 changes: 8 additions & 6 deletions src/pool-bin/BinMigrator.sol
Original file line number Diff line number Diff line change
Expand Up @@ -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) =
Expand Down Expand Up @@ -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);
Expand Down
24 changes: 9 additions & 15 deletions src/pool-bin/BinPositionManager.sol
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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 {
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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);
Expand Down
4 changes: 2 additions & 2 deletions src/pool-bin/interfaces/IBinMigrator.sol
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
12 changes: 6 additions & 6 deletions src/pool-bin/interfaces/IBinPositionManager.sol
Original file line number Diff line number Diff line change
Expand Up @@ -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`)
Expand All @@ -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
Expand All @@ -54,6 +53,7 @@ interface IBinPositionManager is IPositionManager {
uint256[] ids;
uint256[] amounts;
address from;
bytes hookData;
}

function binPoolManager() external view returns (IBinPoolManager);
Expand Down
2 changes: 1 addition & 1 deletion src/pool-cl/CLPositionManager.sol
Original file line number Diff line number Diff line change
Expand Up @@ -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";
Expand Down
4 changes: 2 additions & 2 deletions test/mocks/MockReentrantPositionManager.sol
Original file line number Diff line number Diff line change
Expand Up @@ -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),
Expand Down
Loading

0 comments on commit f081ccf

Please sign in to comment.