Skip to content
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 10 additions & 10 deletions src/libraries/UniswapV3Lib.sol
Original file line number Diff line number Diff line change
Expand Up @@ -314,7 +314,7 @@ library UniswapV3Lib {
{
require(params.positionManager.ownerOf(params.tokenId) == address(context.proxy), "UniswapV3Lib/proxy-does-not-own-token-id");

(address token0, address token1, uint24 fee, int24 tickLower, int24 tickUpper, ) = _fetchPositionData(params.tokenId, params.positionManager);
Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

unused variables

(address token0, address token1, uint24 fee, , , ) = _fetchPositionData(params.tokenId, params.positionManager);

IUniswapV3PoolLike pool = IUniswapV3PoolLike(context.pool);

Expand Down Expand Up @@ -344,14 +344,14 @@ library UniswapV3Lib {

// Fetches only the position data that we need
function _fetchPositionData(
uint256 tokenId,
uint256 tokenId,
INonfungiblePositionManager positionManager
) internal view returns (
address payable token0,
address payable token1,
uint24 fee,
int24 tickLower,
int24 tickUpper,
uint24 fee,
int24 tickLower,
int24 tickUpper,
uint128 liquidity
) {
bytes memory positionData = abi.encodeCall(
Expand Down Expand Up @@ -474,12 +474,12 @@ library UniswapV3Lib {
}

function _decreaseLiquidityCall(
IALMProxy proxy,
address positionManager,
uint256 tokenId,
uint128 liquidity,
IALMProxy proxy,
address positionManager,
uint256 tokenId,
uint128 liquidity,
TokenAmounts memory min,
uint256 deadline
uint256 deadline
)
internal
{
Expand Down
53 changes: 28 additions & 25 deletions test/grove-base-fork/UniswapV3.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -956,7 +956,7 @@ contract ForeignControllerAddLiquidityE2EUniswapV3Test is UniswapV3TestBase {
assertEq(token1RateLimitBefore - token1RateLimitAfter, amount1Used, "token1 rate limit delta mismatch");
}

function _e2e_addLiquidityUniswapV3(uint256 addAmount0, uint256 addAmount1, int24 lowerTickDelta, int24 upperTickDelta, bytes32 token0RateLimitKey, bytes32 token1RateLimitKey) internal returns (uint256 tokenId, uint128 liquidity, uint256 amount0Used, uint256 amount1Used) {
function _e2e_addLiquidityUniswapV3(uint256 addAmount0, uint256 addAmount1, int24 lowerTickDelta, int24 upperTickDelta, bytes32 token0RateLimitKey, bytes32 token1RateLimitKey) internal {
uint256 amount0 = addAmount0;
uint256 amount1 = addAmount1;

Expand All @@ -968,6 +968,11 @@ contract ForeignControllerAddLiquidityE2EUniswapV3Test is UniswapV3TestBase {
upper : initTick + upperTickDelta
});

uint256 tokenId;
uint128 liquidity;
uint256 amount0Used;
uint256 amount1Used;

(tokenId, liquidity, amount0Used, amount1Used) = _addLiquidityAndValidate(
0,
tick,
Expand Down Expand Up @@ -1088,14 +1093,12 @@ contract ForeignControllerRemoveLiquidityFailureTests is UniswapV3TestBase {
}

function _defaultDesiredPosition() internal view returns (UniswapV3Lib.TokenAmounts memory) {
uint256 amount0 = 1_000 * 10 ** uint256(token0Decimals);
uint8 token1Decimals = IERC20Metadata(address(token1)).decimals();
uint256 amount1 = 1_000 * 10 ** uint256(token1Decimals);

return UniswapV3Lib.TokenAmounts({ amount0: amount0, amount1: amount1 });
return UniswapV3Lib.TokenAmounts({ amount0: 1_000 * 10 ** uint256(token0Decimals), amount1: 1_000 * 10 ** uint256(token1Decimals) });
}

function _mintProxyPosition() internal returns (uint256 tokenId, uint128 liquidity, uint256 amount0, uint256 amount1) {
function _mintProxyPosition() internal returns (uint256 tokenId_, uint128 liquidity_, uint256 amount0_, uint256 amount1_) {
UniswapV3Lib.TokenAmounts memory desired = _defaultDesiredPosition();
UniswapV3Lib.Tick memory tick = _defaultTickRange();

Expand All @@ -1105,7 +1108,7 @@ contract ForeignControllerRemoveLiquidityFailureTests is UniswapV3TestBase {
vm.startPrank(address(almProxy));
token0.approve(UNISWAP_V3_POSITION_MANAGER, desired.amount0);
token1.approve(UNISWAP_V3_POSITION_MANAGER, desired.amount1);
(tokenId, liquidity, amount0, amount1) = INonfungiblePositionManager(UNISWAP_V3_POSITION_MANAGER).mint(
(tokenId_, liquidity_, amount0_, amount1_) = INonfungiblePositionManager(UNISWAP_V3_POSITION_MANAGER).mint(
INonfungiblePositionManager.MintParams({
token0 : address(token0),
token1 : address(token1),
Expand All @@ -1123,7 +1126,7 @@ contract ForeignControllerRemoveLiquidityFailureTests is UniswapV3TestBase {
vm.stopPrank();
}

function _mintExternalPosition() internal returns (uint256 tokenId, uint128 liquidity, uint256 amount0, uint256 amount1) {
function _mintExternalPosition() internal returns (uint256 tokenId_, uint128 liquidity_, uint256 amount0_, uint256 amount1_) {
UniswapV3Lib.TokenAmounts memory desired = _defaultDesiredPosition();

deal(address(token0), stranger, desired.amount0);
Expand All @@ -1132,7 +1135,7 @@ contract ForeignControllerRemoveLiquidityFailureTests is UniswapV3TestBase {
vm.startPrank(stranger);
token0.approve(UNISWAP_V3_POSITION_MANAGER, desired.amount0);
token1.approve(UNISWAP_V3_POSITION_MANAGER, desired.amount1);
(tokenId, liquidity, amount0, amount1) = INonfungiblePositionManager(UNISWAP_V3_POSITION_MANAGER).mint(
(tokenId_, liquidity_, amount0_, amount1_) = INonfungiblePositionManager(UNISWAP_V3_POSITION_MANAGER).mint(
INonfungiblePositionManager.MintParams({
token0 : address(token0),
token1 : address(token1),
Expand Down Expand Up @@ -1169,15 +1172,15 @@ contract ForeignControllerRemoveLiquidityFailureTests is UniswapV3TestBase {
}

function test_removeLiquidityUniswapV3_proxyDoesNotOwnTokenId() public {
(uint256 tokenId, uint128 liquidity, uint256 amount0, uint256 amount1) = _mintExternalPosition();
(uint256 tokenId_, uint128 liquidity_, , ) = _mintExternalPosition();

vm.warp(block.timestamp + 1 hours);
vm.startPrank(ALM_RELAYER);
vm.expectRevert("UniswapV3Lib/proxy-does-not-own-token-id");
foreignController.removeLiquidityUniswapV3(
_getPool(),
tokenId,
liquidity,
tokenId_,
liquidity_,
UniswapV3Lib.TokenAmounts({ amount0: defaultMinAmount0, amount1: defaultMinAmount1 }),
block.timestamp + 1 hours
);
Expand Down Expand Up @@ -1296,11 +1299,11 @@ contract ForeignControllerRemoveLiquidityE2EUniswapV3Test is UniswapV3TestBase {
);
}

function _addLiquidity(uint256 addAmount0, uint256 addAmount1, UniswapV3Lib.Tick memory addTickDelta) internal returns (uint256 tokenId, uint128 liquidity, uint256 amount0Used, uint256 amount1Used) {
function _addLiquidity(uint256 addAmount0, uint256 addAmount1, UniswapV3Lib.Tick memory addTickDelta) internal returns (uint256 tokenId_, uint128 liquidity_, uint256 amount0Used_, uint256 amount1Used_) {
deal(address(token0), address(almProxy), addAmount0);
deal(address(token1), address(almProxy), addAmount1);

(tokenId, liquidity, amount0Used, amount1Used) = _addLiquidity(
(tokenId_, liquidity_, amount0Used_, amount1Used_) = _addLiquidity(
0,
UniswapV3Lib.Tick({lower : initTick + addTickDelta.lower, upper : initTick + addTickDelta.upper}),
UniswapV3Lib.TokenAmounts({ amount0: addAmount0, amount1: addAmount1 }),
Expand All @@ -1310,28 +1313,28 @@ contract ForeignControllerRemoveLiquidityE2EUniswapV3Test is UniswapV3TestBase {
vm.warp(block.timestamp + 2 hours); // Advance sufficient time for twap
}

function _removeLiquidityAndValidate(uint256 tokenId, uint128 liquidity, uint256 minAmount0, uint256 minAmount1, bytes32 token0RateLimitKey, bytes32 token1RateLimitKey) internal returns (uint256 amount0Used, uint256 amount1Used) {
uint256 token0RateLimitBefore = rateLimits.getCurrentRateLimit(token0RateLimitKey);
uint256 token1RateLimitBefore = rateLimits.getCurrentRateLimit(token1RateLimitKey);
function _removeLiquidityAndValidate(uint256 _tokenId, uint128 _liquidity, uint256 _minAmount0, uint256 _minAmount1, bytes32 _token0RateLimitKey, bytes32 _token1RateLimitKey) internal returns (uint256 amount0Used, uint256 amount1Used) {
uint256 token0RateLimitBefore = rateLimits.getCurrentRateLimit(_token0RateLimitKey);
uint256 token1RateLimitBefore = rateLimits.getCurrentRateLimit(_token1RateLimitKey);

vm.startPrank(ALM_RELAYER);
(amount0Used, amount1Used) = foreignController.removeLiquidityUniswapV3(
_getPool(),
tokenId,
liquidity,
UniswapV3Lib.TokenAmounts({ amount0: minAmount0, amount1: minAmount1 }),
_tokenId,
_liquidity,
UniswapV3Lib.TokenAmounts({ amount0: _minAmount0, amount1: _minAmount1 }),
block.timestamp + 1 hours
);
vm.stopPrank();

assertGe(amount0Used, minAmount0, "amount0Used should be greater than or equal to minAmount0");
assertGe(amount1Used, minAmount1, "amount1Used should be greater than or equal to minAmount1");
assertGe(amount0Used, _minAmount0, "amount0Used should be greater than or equal to minAmount0");
assertGe(amount1Used, _minAmount1, "amount1Used should be greater than or equal to minAmount1");

assertApproxEqRel(amount0Used, amount0Added * liquidity / totalLiquidity, .0001e18, "amount0Used should be within 0.01% of amount0Added * liquidity / totalLiquidity");
assertApproxEqRel(amount1Used, amount1Added * liquidity / totalLiquidity, .0001e18, "amount1Used should be within 0.01% of amount1Added * liquidity / totalLiquidity");
assertApproxEqRel(amount0Used, amount0Added * _liquidity / totalLiquidity, .0001e18, "amount0Used should be within 0.01% of amount0Added * liquidity / totalLiquidity");
assertApproxEqRel(amount1Used, amount1Added * _liquidity / totalLiquidity, .0001e18, "amount1Used should be within 0.01% of amount1Added * liquidity / totalLiquidity");

uint256 token0RateLimitAfter = rateLimits.getCurrentRateLimit(token0RateLimitKey);
uint256 token1RateLimitAfter = rateLimits.getCurrentRateLimit(token1RateLimitKey);
uint256 token0RateLimitAfter = rateLimits.getCurrentRateLimit(_token0RateLimitKey);
uint256 token1RateLimitAfter = rateLimits.getCurrentRateLimit(_token1RateLimitKey);

assertEq(token0RateLimitBefore - token0RateLimitAfter, amount0Used, "token0 rate limit delta mismatch");
assertEq(token1RateLimitBefore - token1RateLimitAfter, amount1Used, "token1 rate limit delta mismatch");
Expand Down
8 changes: 1 addition & 7 deletions test/grove-mainnet-fork/UniswapV3.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -620,7 +620,7 @@ contract MainnetControllerAddLiquidityFailureTests is UniswapV3TestBase {
function _prepareDefaultAddLiquidity()
internal
returns (
UniswapV3Lib.Tick memory tick,
UniswapV3Lib.Tick memory tick,
UniswapV3Lib.TokenAmounts memory desired,
UniswapV3Lib.TokenAmounts memory min
)
Expand Down Expand Up @@ -1042,9 +1042,6 @@ contract MainnetControllerAddLiquidityFailureTests is UniswapV3TestBase {
mainnetController.setUniswapV3AddLiquidityUpperTickBound(UNISWAP_V3_DAI_USDC_POOL, 100000);
vm.stopPrank();

(UniswapV3Lib.Tick memory tick, UniswapV3Lib.TokenAmounts memory desired, UniswapV3Lib.TokenAmounts memory min)
= _prepareDefaultAddLiquidity();

vm.startPrank(relayer);
vm.expectRevert("UniswapV3Lib/invalid-lower-tick");
mainnetController.addLiquidityUniswapV3(
Expand Down Expand Up @@ -1075,9 +1072,6 @@ contract MainnetControllerAddLiquidityFailureTests is UniswapV3TestBase {
mainnetController.setUniswapV3AddLiquidityUpperTickBound(UNISWAP_V3_DAI_USDC_POOL, 100000);
vm.stopPrank();

(UniswapV3Lib.Tick memory tick, UniswapV3Lib.TokenAmounts memory desired, UniswapV3Lib.TokenAmounts memory min)
= _prepareDefaultAddLiquidity();

vm.startPrank(relayer);
vm.expectRevert("UniswapV3Lib/invalid-upper-tick");
mainnetController.addLiquidityUniswapV3(
Expand Down
Loading