diff --git a/foundry.toml b/foundry.toml index 55eaaa171..71b7c1c89 100644 --- a/foundry.toml +++ b/foundry.toml @@ -7,7 +7,7 @@ ffi = true fs_permissions = [{ access = "read-write", path = ".forge-snapshots/" }, { access = "read", path = "foundry-out/" }] evm_version = "cancun" gas_limit = "3000000000" -fuzz_runs = 10_000 +fuzz.runs = 500 bytecode_hash = "none" additional_compiler_profiles = [ @@ -28,7 +28,7 @@ optimizer_runs = 200 fuzz.runs = 100 [profile.ci] -fuzz_runs = 100_000 +fuzz.runs = 5_000 [profile.gas] gas_limit=30_000_000 diff --git a/test/position-managers/NativeToken.t.sol b/test/position-managers/NativeToken.t.sol index e86637934..ea40c815a 100644 --- a/test/position-managers/NativeToken.t.sol +++ b/test/position-managers/NativeToken.t.sol @@ -33,7 +33,7 @@ import {PosmTestSetup} from "../shared/PosmTestSetup.sol"; import {Planner, Plan} from "../shared/Planner.sol"; import {PositionConfig} from "../shared/PositionConfig.sol"; -contract PositionManagerTest is Test, PosmTestSetup, LiquidityFuzzers { +contract NativeTokenPositionManagerTest is Test, PosmTestSetup, LiquidityFuzzers { using FixedPointMathLib for uint256; using StateLibrary for IPoolManager; using SafeCast for *; @@ -62,8 +62,12 @@ contract PositionManagerTest is Test, PosmTestSetup, LiquidityFuzzers { } function test_fuzz_mint_native(IPoolManager.ModifyLiquidityParams memory params) public { + // two-sided liquidity + params.tickLower = + int24(bound(params.tickLower, TickMath.minUsableTick(nativeKey.tickSpacing), -nativeKey.tickSpacing)); + params.tickUpper = + int24(bound(params.tickUpper, nativeKey.tickSpacing, TickMath.maxUsableTick(nativeKey.tickSpacing))); params = createFuzzyLiquidityParams(nativeKey, params, SQRT_PRICE_1_1); - vm.assume(params.tickLower < 0 && 0 < params.tickUpper); // two-sided liquidity uint256 liquidityToAdd = params.liquidityDelta < 0 ? uint256(-params.liquidityDelta) : uint256(params.liquidityDelta); @@ -95,8 +99,12 @@ contract PositionManagerTest is Test, PosmTestSetup, LiquidityFuzzers { // minting with excess native tokens are returned to caller function test_fuzz_mint_native_excess_withClose(IPoolManager.ModifyLiquidityParams memory params) public { + // two-sided liquidity + params.tickLower = + int24(bound(params.tickLower, TickMath.minUsableTick(nativeKey.tickSpacing), -nativeKey.tickSpacing)); + params.tickUpper = + int24(bound(params.tickUpper, nativeKey.tickSpacing, TickMath.maxUsableTick(nativeKey.tickSpacing))); params = createFuzzyLiquidityParams(nativeKey, params, SQRT_PRICE_1_1); - vm.assume(params.tickLower < 0 && 0 < params.tickUpper); // two-sided liquidity uint256 liquidityToAdd = params.liquidityDelta < 0 ? uint256(-params.liquidityDelta) : uint256(params.liquidityDelta); @@ -150,8 +158,12 @@ contract PositionManagerTest is Test, PosmTestSetup, LiquidityFuzzers { } function test_fuzz_mint_native_excess_withSettlePair(IPoolManager.ModifyLiquidityParams memory params) public { + // two-sided liquidity + params.tickLower = + int24(bound(params.tickLower, TickMath.minUsableTick(nativeKey.tickSpacing), -nativeKey.tickSpacing)); + params.tickUpper = + int24(bound(params.tickUpper, nativeKey.tickSpacing, TickMath.maxUsableTick(nativeKey.tickSpacing))); params = createFuzzyLiquidityParams(nativeKey, params, SQRT_PRICE_1_1); - vm.assume(params.tickLower < 0 && 0 < params.tickUpper); // two-sided liquidity uint256 liquidityToAdd = params.liquidityDelta < 0 ? uint256(-params.liquidityDelta) : uint256(params.liquidityDelta); @@ -207,8 +219,12 @@ contract PositionManagerTest is Test, PosmTestSetup, LiquidityFuzzers { uint256 balance0Start = address(this).balance; uint256 balance1Start = currency1.balanceOfSelf(); + // two-sided liquidity + params.tickLower = + int24(bound(params.tickLower, TickMath.minUsableTick(nativeKey.tickSpacing), -nativeKey.tickSpacing)); + params.tickUpper = + int24(bound(params.tickUpper, nativeKey.tickSpacing, TickMath.maxUsableTick(nativeKey.tickSpacing))); params = createFuzzyLiquidityParams(nativeKey, params, SQRT_PRICE_1_1); - vm.assume(params.tickLower < 0 && 0 < params.tickUpper); // two-sided liquidity uint256 liquidityToAdd = params.liquidityDelta < 0 ? uint256(-params.liquidityDelta) : uint256(params.liquidityDelta); @@ -260,8 +276,11 @@ contract PositionManagerTest is Test, PosmTestSetup, LiquidityFuzzers { uint256 balance0Start = address(this).balance; uint256 balance1Start = currency1.balanceOfSelf(); + params.tickLower = + int24(bound(params.tickLower, TickMath.minUsableTick(nativeKey.tickSpacing), -nativeKey.tickSpacing)); + params.tickUpper = + int24(bound(params.tickUpper, nativeKey.tickSpacing, TickMath.maxUsableTick(nativeKey.tickSpacing))); params = createFuzzyLiquidityParams(nativeKey, params, SQRT_PRICE_1_1); - vm.assume(params.tickLower < 0 && 0 < params.tickUpper); // two-sided liquidity uint256 liquidityToAdd = params.liquidityDelta < 0 ? uint256(-params.liquidityDelta) : uint256(params.liquidityDelta); @@ -318,8 +337,12 @@ contract PositionManagerTest is Test, PosmTestSetup, LiquidityFuzzers { uint256 balance0Start = address(this).balance; uint256 balance1Start = currency1.balanceOfSelf(); + // two-sided liquidity + params.tickLower = + int24(bound(params.tickLower, TickMath.minUsableTick(nativeKey.tickSpacing), -nativeKey.tickSpacing)); + params.tickUpper = + int24(bound(params.tickUpper, nativeKey.tickSpacing, TickMath.maxUsableTick(nativeKey.tickSpacing))); params = createFuzzyLiquidityParams(nativeKey, params, SQRT_PRICE_1_1); - vm.assume(params.tickLower < 0 && 0 < params.tickUpper); // two-sided liquidity uint256 liquidityToAdd = params.liquidityDelta < 0 ? uint256(-params.liquidityDelta) : uint256(params.liquidityDelta); @@ -366,8 +389,12 @@ contract PositionManagerTest is Test, PosmTestSetup, LiquidityFuzzers { uint256 balance0Start = address(this).balance; uint256 balance1Start = currency1.balanceOfSelf(); + // two-sided liquidity + params.tickLower = + int24(bound(params.tickLower, TickMath.minUsableTick(nativeKey.tickSpacing), -nativeKey.tickSpacing)); + params.tickUpper = + int24(bound(params.tickUpper, nativeKey.tickSpacing, TickMath.maxUsableTick(nativeKey.tickSpacing))); params = createFuzzyLiquidityParams(nativeKey, params, SQRT_PRICE_1_1); - vm.assume(params.tickLower < 0 && 0 < params.tickUpper); // two-sided liquidity uint256 liquidityToAdd = params.liquidityDelta < 0 ? uint256(-params.liquidityDelta) : uint256(params.liquidityDelta); @@ -457,8 +484,12 @@ contract PositionManagerTest is Test, PosmTestSetup, LiquidityFuzzers { public { // fuzz for the range + // two-sided liquidity + params.tickLower = + int24(bound(params.tickLower, TickMath.minUsableTick(nativeKey.tickSpacing), -nativeKey.tickSpacing)); + params.tickUpper = + int24(bound(params.tickUpper, nativeKey.tickSpacing, TickMath.maxUsableTick(nativeKey.tickSpacing))); params = createFuzzyLiquidityParams(nativeKey, params, SQRT_PRICE_1_1); - vm.assume(params.tickLower < 0 && 0 < params.tickUpper); // two-sided liquidity // TODO: figure out if we can fuzz the increase liquidity delta. we're annoyingly getting TickLiquidityOverflow uint256 liquidityToAdd = 1e18; @@ -508,8 +539,12 @@ contract PositionManagerTest is Test, PosmTestSetup, LiquidityFuzzers { public { // fuzz for the range + // two-sided liquidity + params.tickLower = + int24(bound(params.tickLower, TickMath.minUsableTick(nativeKey.tickSpacing), -nativeKey.tickSpacing)); + params.tickUpper = + int24(bound(params.tickUpper, nativeKey.tickSpacing, TickMath.maxUsableTick(nativeKey.tickSpacing))); params = createFuzzyLiquidityParams(nativeKey, params, SQRT_PRICE_1_1); - vm.assume(params.tickLower < 0 && 0 < params.tickUpper); // two-sided liquidity // TODO: figure out if we can fuzz the increase liquidity delta. we're annoyingly getting TickLiquidityOverflow uint256 liquidityToAdd = 1e18; @@ -558,8 +593,12 @@ contract PositionManagerTest is Test, PosmTestSetup, LiquidityFuzzers { IPoolManager.ModifyLiquidityParams memory params, uint256 decreaseLiquidityDelta ) public { + // two-sided liquidity + params.tickLower = + int24(bound(params.tickLower, TickMath.minUsableTick(nativeKey.tickSpacing), -nativeKey.tickSpacing)); + params.tickUpper = + int24(bound(params.tickUpper, nativeKey.tickSpacing, TickMath.maxUsableTick(nativeKey.tickSpacing))); params = createFuzzyLiquidityParams(nativeKey, params, SQRT_PRICE_1_1); - vm.assume(params.tickLower < 0 && 0 < params.tickUpper); // two-sided liquidity decreaseLiquidityDelta = bound(decreaseLiquidityDelta, 1, uint256(params.liquidityDelta)); PositionConfig memory config = @@ -595,8 +634,12 @@ contract PositionManagerTest is Test, PosmTestSetup, LiquidityFuzzers { IPoolManager.ModifyLiquidityParams memory params, uint256 decreaseLiquidityDelta ) public { + // two-sided liquidity + params.tickLower = + int24(bound(params.tickLower, TickMath.minUsableTick(nativeKey.tickSpacing), -nativeKey.tickSpacing)); + params.tickUpper = + int24(bound(params.tickUpper, nativeKey.tickSpacing, TickMath.maxUsableTick(nativeKey.tickSpacing))); params = createFuzzyLiquidityParams(nativeKey, params, SQRT_PRICE_1_1); - vm.assume(params.tickLower < 0 && 0 < params.tickUpper); // two-sided liquidity decreaseLiquidityDelta = bound(decreaseLiquidityDelta, 1, uint256(params.liquidityDelta)); PositionConfig memory config = @@ -635,8 +678,12 @@ contract PositionManagerTest is Test, PosmTestSetup, LiquidityFuzzers { } function test_fuzz_collect_native_withClose(IPoolManager.ModifyLiquidityParams memory params) public { + // two-sided liquidity + params.tickLower = + int24(bound(params.tickLower, TickMath.minUsableTick(nativeKey.tickSpacing), -nativeKey.tickSpacing)); + params.tickUpper = + int24(bound(params.tickUpper, nativeKey.tickSpacing, TickMath.maxUsableTick(nativeKey.tickSpacing))); params = createFuzzyLiquidityParams(nativeKey, params, SQRT_PRICE_1_1); - vm.assume(params.tickLower < 0 && 0 < params.tickUpper); // two-sided liquidity PositionConfig memory config = PositionConfig({poolKey: nativeKey, tickLower: params.tickLower, tickUpper: params.tickUpper}); @@ -661,8 +708,12 @@ contract PositionManagerTest is Test, PosmTestSetup, LiquidityFuzzers { } function test_fuzz_collect_native_withTakePair(IPoolManager.ModifyLiquidityParams memory params) public { + // two-sided liquidity + params.tickLower = + int24(bound(params.tickLower, TickMath.minUsableTick(nativeKey.tickSpacing), -nativeKey.tickSpacing)); + params.tickUpper = + int24(bound(params.tickUpper, nativeKey.tickSpacing, TickMath.maxUsableTick(nativeKey.tickSpacing))); params = createFuzzyLiquidityParams(nativeKey, params, SQRT_PRICE_1_1); - vm.assume(params.tickLower < 0 && 0 < params.tickUpper); // two-sided liquidity PositionConfig memory config = PositionConfig({poolKey: nativeKey, tickLower: params.tickLower, tickUpper: params.tickUpper}); @@ -694,8 +745,12 @@ contract PositionManagerTest is Test, PosmTestSetup, LiquidityFuzzers { function test_fuzz_collect_native_withTakePair_addressRecipient(IPoolManager.ModifyLiquidityParams memory params) public { + // two-sided liquidity + params.tickLower = + int24(bound(params.tickLower, TickMath.minUsableTick(nativeKey.tickSpacing), -nativeKey.tickSpacing)); + params.tickUpper = + int24(bound(params.tickUpper, nativeKey.tickSpacing, TickMath.maxUsableTick(nativeKey.tickSpacing))); params = createFuzzyLiquidityParams(nativeKey, params, SQRT_PRICE_1_1); - vm.assume(params.tickLower < 0 && 0 < params.tickUpper); // two-sided liquidity PositionConfig memory config = PositionConfig({poolKey: nativeKey, tickLower: params.tickLower, tickUpper: params.tickUpper}); @@ -737,8 +792,12 @@ contract PositionManagerTest is Test, PosmTestSetup, LiquidityFuzzers { function test_fuzz_collect_native_withTakePair_msgSenderRecipient(IPoolManager.ModifyLiquidityParams memory params) public { + // two-sided liquidity + params.tickLower = + int24(bound(params.tickLower, TickMath.minUsableTick(nativeKey.tickSpacing), -nativeKey.tickSpacing)); + params.tickUpper = + int24(bound(params.tickUpper, nativeKey.tickSpacing, TickMath.maxUsableTick(nativeKey.tickSpacing))); params = createFuzzyLiquidityParams(nativeKey, params, SQRT_PRICE_1_1); - vm.assume(params.tickLower < 0 && 0 < params.tickUpper); // two-sided liquidity PositionConfig memory config = PositionConfig({poolKey: nativeKey, tickLower: params.tickLower, tickUpper: params.tickUpper}); diff --git a/test/position-managers/PositionManager.modifyLiquidities.t.sol b/test/position-managers/PositionManager.modifyLiquidities.t.sol index 83bed8010..4c6ba7cce 100644 --- a/test/position-managers/PositionManager.modifyLiquidities.t.sol +++ b/test/position-managers/PositionManager.modifyLiquidities.t.sol @@ -853,24 +853,8 @@ contract PositionManagerModifyLiquiditiesTest is Test, PosmTestSetup, LiquidityF ) public { bips = bound(bips, 1, 10_000); MockFOT(address(fotToken)).setFee(bips); - tickLower = int24( - bound( - tickLower, - fotKey.tickSpacing * (TickMath.MIN_TICK / fotKey.tickSpacing), - fotKey.tickSpacing * (TickMath.MAX_TICK / fotKey.tickSpacing) - ) - ); - tickUpper = int24( - bound( - tickUpper, - fotKey.tickSpacing * (TickMath.MIN_TICK / fotKey.tickSpacing), - fotKey.tickSpacing * (TickMath.MAX_TICK / fotKey.tickSpacing) - ) - ); - tickLower = fotKey.tickSpacing * (tickLower / fotKey.tickSpacing); - tickUpper = fotKey.tickSpacing * (tickUpper / fotKey.tickSpacing); - vm.assume(tickUpper > tickLower); + (tickLower, tickUpper) = boundTicks(fotKey, tickLower, tickUpper); (uint160 sqrtPriceX96,,,) = manager.getSlot0(fotKey.toId()); {