diff --git a/onchain/src/abstracts/ThreePositionStrategy.sol b/onchain/src/abstracts/ThreePositionStrategy.sol index 733ec21..145807f 100644 --- a/onchain/src/abstracts/ThreePositionStrategy.sol +++ b/onchain/src/abstracts/ThreePositionStrategy.sol @@ -248,13 +248,14 @@ abstract contract ThreePositionStrategy is UniswapMath, VWAPTracker { uint128 liquidity; if (token0isWeth) { - liquidity = LiquidityAmounts.getLiquidityForAmount1( + // floor leg sits entirely above current tick when WETH is token0, so budget is token0 + liquidity = LiquidityAmounts.getLiquidityForAmount0( TickMath.getSqrtRatioAtTick(vwapTick), TickMath.getSqrtRatioAtTick(floorTick), actualFloorEthBalance ); } else { - liquidity = LiquidityAmounts.getLiquidityForAmount0( + liquidity = LiquidityAmounts.getLiquidityForAmount1( TickMath.getSqrtRatioAtTick(vwapTick), TickMath.getSqrtRatioAtTick(floorTick), actualFloorEthBalance @@ -263,4 +264,4 @@ abstract contract ThreePositionStrategy is UniswapMath, VWAPTracker { _mintPosition(Stage.FLOOR, token0isWeth ? vwapTick : floorTick, token0isWeth ? floorTick : vwapTick, liquidity); } -} \ No newline at end of file +} diff --git a/onchain/test/LiquidityManager.t.sol b/onchain/test/LiquidityManager.t.sol index 05229a7..3448618 100644 --- a/onchain/test/LiquidityManager.t.sol +++ b/onchain/test/LiquidityManager.t.sol @@ -139,6 +139,20 @@ contract LiquidityManagerTest is UniSwapHelper { token0isWeth = _token0isWeth; } + function testRecenterUsesAvailableEthWhenToken0IsWeth() public { + deployProtocolWithTokenOrder(true); + vm.deal(address(lm), 1 ether); + + uint256 initialEthBudget = address(lm).balance; + assertEq(initialEthBudget, 1 ether, "precondition"); + + vm.prank(RECENTER_CALLER); + lm.recenter(); + + uint256 remainingEthBudget = address(lm).balance + weth.balanceOf(address(lm)); + assertLe(remainingEthBudget, initialEthBudget, "should not overdraw ETH budget"); + } + /// @notice Recenter with intelligent error handling for extreme price conditions /// @param last Whether this is the last attempt (affects error handling) function recenterWithErrorHandling(bool last) internal {