Skip to content

Commit

Permalink
test: added salt != 0 cases
Browse files Browse the repository at this point in the history
  • Loading branch information
chefburger committed May 23, 2024
1 parent 3b49d98 commit dc9975e
Show file tree
Hide file tree
Showing 9 changed files with 452 additions and 6 deletions.
Original file line number Diff line number Diff line change
@@ -1 +1 @@
32563
32551
Original file line number Diff line number Diff line change
@@ -1 +1 @@
30405
30417
Original file line number Diff line number Diff line change
@@ -1 +1 @@
180336
180348
Original file line number Diff line number Diff line change
@@ -1 +1 @@
186319
186331
Original file line number Diff line number Diff line change
@@ -1 +1 @@
138699
138711
Original file line number Diff line number Diff line change
@@ -1 +1 @@
29469
32293
197 changes: 197 additions & 0 deletions test/pool-bin/BinPoolManager.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ import {BinLiquidityHelper} from "./helpers/BinLiquidityHelper.sol";
import {BinDonateHelper} from "./helpers/BinDonateHelper.sol";
import {BinTestHelper} from "./helpers/BinTestHelper.sol";
import {Hooks} from "../../src/libraries/Hooks.sol";
import {BinPosition} from "../../src/pool-bin/libraries/BinPosition.sol";

contract BinPoolManagerTest is Test, GasSnapshot, BinTestHelper {
using PoolIdLibrary for PoolKey;
Expand Down Expand Up @@ -336,6 +337,202 @@ contract BinPoolManagerTest is Test, GasSnapshot, BinTestHelper {
snapEnd();
}

function testMintAndBurnWithSalt() public {
bytes32 salt = bytes32(uint256(0x1234));
poolManager.initialize(key, activeId, new bytes(0));

token0.mint(address(this), 10 ether);
token1.mint(address(this), 10 ether);
(IBinPoolManager.MintParams memory mintParams, uint24[] memory binIds) =
_getMultipleBinMintParams(activeId, 2 ether, 2 ether, 5, 5, salt);
binLiquidityHelper.mint(key, mintParams, "");

// liquidity added with salt 0x1234 not salt 0
for (uint256 i = 0; i < binIds.length; i++) {
(uint128 binReserveX, uint128 binReserveY) = poolManager.getBin(key.toId(), binIds[i]);

// make sure the liquidity is added to the correct bin
if (binIds[i] < activeId) {
assertEq(binReserveX, 0 ether);
assertEq(binReserveY, 0.4 ether);
} else if (binIds[i] > activeId) {
assertEq(binReserveX, 0.4 ether);
assertEq(binReserveY, 0 ether);
} else {
assertEq(binReserveX, 0.4 ether);
assertEq(binReserveY, 0.4 ether);
}

BinPosition.Info memory position =
poolManager.getPosition(key.toId(), address(binLiquidityHelper), binIds[i], salt);
BinPosition.Info memory position0 =
poolManager.getPosition(key.toId(), address(binLiquidityHelper), binIds[i], 0);
assertTrue(position.share != 0);
// position with salt = 0
assertTrue(position0.share == 0);
}

// burn liquidity with salt 0x1234
IBinPoolManager.BurnParams memory burnParams =
_getMultipleBinBurnLiquidityParams(key, poolManager, binIds, address(binLiquidityHelper), 100, salt);
binLiquidityHelper.burn(key, burnParams, "");

for (uint256 i = 0; i < binIds.length; i++) {
(uint128 binReserveX, uint128 binReserveY) = poolManager.getBin(key.toId(), binIds[i]);

// make sure the liquidity is added to the correct bin
assertEq(binReserveX, 0 ether);
assertEq(binReserveY, 0 ether);

BinPosition.Info memory position =
poolManager.getPosition(key.toId(), address(binLiquidityHelper), binIds[i], salt);
BinPosition.Info memory position0 =
poolManager.getPosition(key.toId(), address(binLiquidityHelper), binIds[i], 0);
assertTrue(position.share == 0);
assertTrue(position0.share == 0);
}
}

function testMintMixWithAndWithoutSalt() public {
bytes32 salt0 = bytes32(0);
bytes32 salt1 = bytes32(uint256(0x1234));
bytes32 salt2 = bytes32(uint256(0x5678));
poolManager.initialize(key, activeId, new bytes(0));

token0.mint(address(this), 30 ether);
token1.mint(address(this), 30 ether);

(IBinPoolManager.MintParams memory mintParams, uint24[] memory binIds) =
_getMultipleBinMintParams(activeId, 2 ether, 2 ether, 5, 5, salt1);
binLiquidityHelper.mint(key, mintParams, "");

// liquidity added with salt 0x1234 not salt 0
for (uint256 i = 0; i < binIds.length; i++) {
(uint128 binReserveX, uint128 binReserveY) = poolManager.getBin(key.toId(), binIds[i]);

// make sure the liquidity is added to the correct bin
if (binIds[i] < activeId) {
assertEq(binReserveX, 0 ether);
assertEq(binReserveY, 0.4 ether);
} else if (binIds[i] > activeId) {
assertEq(binReserveX, 0.4 ether);
assertEq(binReserveY, 0 ether);
} else {
assertEq(binReserveX, 0.4 ether);
assertEq(binReserveY, 0.4 ether);
}

BinPosition.Info memory position0 =
poolManager.getPosition(key.toId(), address(binLiquidityHelper), binIds[i], salt0);
BinPosition.Info memory position1 =
poolManager.getPosition(key.toId(), address(binLiquidityHelper), binIds[i], salt1);
BinPosition.Info memory position2 =
poolManager.getPosition(key.toId(), address(binLiquidityHelper), binIds[i], salt2);

// only position with salt 0x1234 should have share
assertTrue(position0.share == 0);
assertTrue(position1.share != 0);
assertTrue(position2.share == 0);
}

{
(mintParams, binIds) = _getMultipleBinMintParams(activeId, 2 ether, 2 ether, 5, 5, salt2);
binLiquidityHelper.mint(key, mintParams, "");

for (uint256 i = 0; i < binIds.length; i++) {
(uint128 binReserveX, uint128 binReserveY) = poolManager.getBin(key.toId(), binIds[i]);

// make sure the liquidity is added to the correct bin
if (binIds[i] < activeId) {
assertEq(binReserveX, 0 ether);
assertEq(binReserveY, 0.4 ether * 2);
} else if (binIds[i] > activeId) {
assertEq(binReserveX, 0.4 ether * 2);
assertEq(binReserveY, 0 ether);
} else {
assertEq(binReserveX, 0.4 ether * 2);
assertEq(binReserveY, 0.4 ether * 2);
}

BinPosition.Info memory position0 =
poolManager.getPosition(key.toId(), address(binLiquidityHelper), binIds[i], salt0);
BinPosition.Info memory position1 =
poolManager.getPosition(key.toId(), address(binLiquidityHelper), binIds[i], salt1);
BinPosition.Info memory position2 =
poolManager.getPosition(key.toId(), address(binLiquidityHelper), binIds[i], salt2);

// only position with salt 0 should be empty
assertTrue(position0.share == 0);
assertTrue(position1.share != 0);
assertTrue(position1.share == position2.share);
}
}

{
(mintParams, binIds) = _getMultipleBinMintParams(activeId, 2 ether, 2 ether, 5, 5, salt0);
binLiquidityHelper.mint(key, mintParams, "");

for (uint256 i = 0; i < binIds.length; i++) {
(uint128 binReserveX, uint128 binReserveY) = poolManager.getBin(key.toId(), binIds[i]);

// make sure the liquidity is added to the correct bin
if (binIds[i] < activeId) {
assertEq(binReserveX, 0 ether);
assertEq(binReserveY, 0.4 ether * 3);
} else if (binIds[i] > activeId) {
assertEq(binReserveX, 0.4 ether * 3);
assertEq(binReserveY, 0 ether);
} else {
assertEq(binReserveX, 0.4 ether * 3);
assertEq(binReserveY, 0.4 ether * 3);
}

BinPosition.Info memory position0 =
poolManager.getPosition(key.toId(), address(binLiquidityHelper), binIds[i], salt0);
BinPosition.Info memory position1 =
poolManager.getPosition(key.toId(), address(binLiquidityHelper), binIds[i], salt1);
BinPosition.Info memory position2 =
poolManager.getPosition(key.toId(), address(binLiquidityHelper), binIds[i], salt2);

assertTrue(position0.share != 0);
assertTrue(position1.share == position0.share);
assertTrue(position1.share == position2.share);
}
}

// burning liquidity with salt 0x1234 should not impact position0 & position2
IBinPoolManager.BurnParams memory burnParams =
_getMultipleBinBurnLiquidityParams(key, poolManager, binIds, address(binLiquidityHelper), 100, salt1);
binLiquidityHelper.burn(key, burnParams, "");

for (uint256 i = 0; i < binIds.length; i++) {
(uint128 binReserveX, uint128 binReserveY) = poolManager.getBin(key.toId(), binIds[i]);

// make sure the liquidity is added to the correct bin
if (binIds[i] < activeId) {
assertEq(binReserveX, 0 ether);
assertEq(binReserveY, 0.4 ether * 2);
} else if (binIds[i] > activeId) {
assertEq(binReserveX, 0.4 ether * 2);
assertEq(binReserveY, 0 ether);
} else {
assertEq(binReserveX, 0.4 ether * 2);
assertEq(binReserveY, 0.4 ether * 2);
}

BinPosition.Info memory position0 =
poolManager.getPosition(key.toId(), address(binLiquidityHelper), binIds[i], salt0);
BinPosition.Info memory position1 =
poolManager.getPosition(key.toId(), address(binLiquidityHelper), binIds[i], salt1);
BinPosition.Info memory position2 =
poolManager.getPosition(key.toId(), address(binLiquidityHelper), binIds[i], salt2);

assertTrue(position0.share != 0);
assertTrue(position1.share == 0);
assertTrue(position0.share == position2.share);
}
}

function testGasBurnOneBin() public {
// initialize
poolManager.initialize(key, activeId, new bytes(0));
Expand Down
49 changes: 49 additions & 0 deletions test/pool-bin/helpers/BinTestHelper.sol
Original file line number Diff line number Diff line change
Expand Up @@ -135,6 +135,36 @@ abstract contract BinTestHelper is Test {
});
}

function _getMultipleBinMintParams(
uint24 binId,
uint256 amountX,
uint256 amountY,
uint8 nbBinX,
uint8 nbBinY,
bytes32 salt
) internal pure returns (IBinPoolManager.MintParams memory params, uint24[] memory binIds) {
uint256 total = getTotalBins(nbBinX, nbBinY); // nbBinX + nbBinY - 1

bytes32[] memory liquidityConfigurations = new bytes32[](total);
binIds = new uint24[](total);

for (uint256 i; i < total; ++i) {
uint24 id = getId(binId, i, nbBinY); // all the binId from left to right :: id = activeId + i - nBinY + 1
binIds[i] = id;

uint64 distribX = id >= binId && nbBinX > 0 ? (Constants.PRECISION / nbBinX).safe64() : 0;
uint64 distribY = id <= binId && nbBinY > 0 ? (Constants.PRECISION / nbBinY).safe64() : 0;

liquidityConfigurations[i] = LiquidityConfigurations.encodeParams(distribX, distribY, id);
}

params = IBinPoolManager.MintParams({
liquidityConfigs: liquidityConfigurations,
amountIn: PackedUint128Math.encode(amountX.safe128(), amountY.safe128()),
salt: salt
});
}

function removeLiquidityFromBin(
PoolKey memory key,
BinPoolManager poolManager,
Expand Down Expand Up @@ -208,6 +238,25 @@ abstract contract BinTestHelper is Test {
params = IBinPoolManager.BurnParams({ids: ids, amountsToBurn: balances, salt: 0});
}

function _getMultipleBinBurnLiquidityParams(
PoolKey memory _key,
BinPoolManager pm,
uint24[] memory binIds,
address from,
uint256 sharePercentage,
bytes32 salt
) internal view returns (IBinPoolManager.BurnParams memory params) {
uint256[] memory ids = new uint256[](binIds.length);
uint256[] memory balances = new uint256[](binIds.length);

for (uint256 i; i < binIds.length; i++) {
ids[i] = binIds[i];
balances[i] = (pm.getPosition(_key.toId(), from, binIds[i], salt).share * sharePercentage) / 100;
}

params = IBinPoolManager.BurnParams({ids: ids, amountsToBurn: balances, salt: salt});
}

function getTotalBins(uint8 nbBinX, uint8 nbBinY) public pure returns (uint256) {
return nbBinX > 0 && nbBinY > 0 ? nbBinX + nbBinY - 1 : nbBinX + nbBinY;
}
Expand Down
Loading

0 comments on commit dc9975e

Please sign in to comment.