Skip to content

Commit c239b0a

Browse files
supercontractsdeluca-mike
authored andcommitted
fix: check amount for permit2 C13
1 parent f8e16e4 commit c239b0a

File tree

2 files changed

+134
-78
lines changed

2 files changed

+134
-78
lines changed

src/libraries/UniswapV4Lib.sol

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -254,6 +254,8 @@ library UniswapV4Lib {
254254
)
255255
internal
256256
{
257+
require(amount <= type(uint160).max, "MC/amount-too-large-for-permit2");
258+
257259
// Approve the Permit2 contract to spend none of the token (success is optional).
258260
// NOTE: We don't care about the success of this call, since the only outcomes are:
259261
// - the allowance is 0 (it was reset or was already 0)

test/mainnet-fork/Uniswapv4.t.sol

Lines changed: 132 additions & 78 deletions
Original file line numberDiff line numberDiff line change
@@ -1017,33 +1017,35 @@ contract MainnetController_UniswapV4_USDC_USDT_Tests is UniswapV4TestBase {
10171017
});
10181018
}
10191019

1020-
function test_mintPositionUniswapV4_revertsWhenAmount0MaxSurpassedBoundary() external {
1020+
function test_mintPositionUniswapV4_revertsWhenAmount0MaxTooLargeForPermit2Boundary() external {
10211021
vm.startPrank(SPARK_PROXY);
10221022
mainnetController.setUniswapV4TickLimits(_POOL_ID, -60, 60, 20);
10231023
rateLimits.setRateLimitData(_DEPOSIT_LIMIT_KEY, 2_000_000e18, 0);
10241024
vm.stopPrank();
10251025

1026-
( uint256 amount0Forecasted, uint256 amount1Forecasted ) = _quoteLiquidity(_POOL_ID, -10, 0, 1_000_000e6);
1027-
1028-
amount0Forecasted += 1; // Quote is off by 1
1029-
amount1Forecasted += 1; // Quote is off by 1
1030-
1031-
deal(address(usdc), address(almProxy), amount0Forecasted);
1032-
deal(address(usdt), address(almProxy), amount1Forecasted);
1026+
deal(address(usdc), address(almProxy), 1_000_000e6);
1027+
deal(address(usdt), address(almProxy), 1_000_000e6);
10331028

10341029
vm.prank(relayer);
1030+
vm.expectRevert("MC/amount-too-large-for-permit2");
1031+
mainnetController.mintPositionUniswapV4({
1032+
poolId : _POOL_ID,
1033+
tickLower : -10,
1034+
tickUpper : 0,
1035+
liquidity : 1_000_000e6,
1036+
amount0Max : uint256(type(uint160).max) + 1,
1037+
amount1Max : uint256(type(uint160).max)
1038+
});
10351039

1036-
vm.expectRevert(
1037-
abi.encodeWithSelector(SlippageCheck.MaximumAmountExceeded.selector, amount0Forecasted - 1, amount0Forecasted)
1038-
);
1039-
1040+
vm.prank(relayer);
1041+
vm.expectRevert("MC/amount-too-large-for-permit2");
10401042
mainnetController.mintPositionUniswapV4({
10411043
poolId : _POOL_ID,
10421044
tickLower : -10,
10431045
tickUpper : 0,
10441046
liquidity : 1_000_000e6,
1045-
amount0Max : amount0Forecasted - 1,
1046-
amount1Max : amount1Forecasted
1047+
amount0Max : uint256(type(uint160).max),
1048+
amount0Max : uint256(type(uint160).max) + 1
10471049
});
10481050

10491051
vm.prank(relayer);
@@ -1052,12 +1054,12 @@ contract MainnetController_UniswapV4_USDC_USDT_Tests is UniswapV4TestBase {
10521054
tickLower : -10,
10531055
tickUpper : 0,
10541056
liquidity : 1_000_000e6,
1055-
amount0Max : amount0Forecasted,
1056-
amount1Max : amount1Forecasted
1057+
amount0Max : uint256(type(uint160).max),
1058+
amount1Max : uint256(type(uint160).max)
10571059
});
10581060
}
10591061

1060-
function test_mintPositionUniswapV4_revertsWhenAmount1MaxSurpassedBoundary() external {
1062+
function test_mintPositionUniswapV4_revertsWhenMaxAmountsSurpassedBoundary() external {
10611063
vm.startPrank(SPARK_PROXY);
10621064
mainnetController.setUniswapV4TickLimits(_POOL_ID, -60, 60, 20);
10631065
rateLimits.setRateLimitData(_DEPOSIT_LIMIT_KEY, 2_000_000e18, 0);
@@ -1073,6 +1075,21 @@ contract MainnetController_UniswapV4_USDC_USDT_Tests is UniswapV4TestBase {
10731075

10741076
vm.prank(relayer);
10751077

1078+
vm.expectRevert(
1079+
abi.encodeWithSelector(SlippageCheck.MaximumAmountExceeded.selector, amount0Forecasted - 1, amount0Forecasted)
1080+
);
1081+
1082+
mainnetController.mintPositionUniswapV4({
1083+
poolId : _POOL_ID,
1084+
tickLower : -10,
1085+
tickUpper : 0,
1086+
liquidity : 1_000_000e6,
1087+
amount0Max : amount0Forecasted - 1,
1088+
amount1Max : amount1Forecasted
1089+
});
1090+
1091+
vm.prank(relayer);
1092+
10761093
vm.expectRevert(
10771094
abi.encodeWithSelector(SlippageCheck.MaximumAmountExceeded.selector, amount1Forecasted - 1, amount1Forecasted)
10781095
);
@@ -1300,52 +1317,48 @@ contract MainnetController_UniswapV4_USDC_USDT_Tests is UniswapV4TestBase {
13001317
});
13011318
}
13021319

1303-
function test_increaseLiquidityUniswapV4_revertsWhenAmount0MaxSurpassedBoundary() external {
1320+
function test_increaseLiquidityUniswapV4_revertsWhenAmountsTooLargeForPermit2Boundary() external {
13041321
IncreasePositionResult memory minted = _setupLiquidity(_POOL_ID, -10, 0, 1_000_000e6);
13051322

13061323
vm.startPrank(SPARK_PROXY);
13071324
mainnetController.setUniswapV4TickLimits(_POOL_ID, -10, 0, 10);
13081325
rateLimits.setRateLimitData(_DEPOSIT_LIMIT_KEY, 2_000_000e18, 0);
13091326
vm.stopPrank();
13101327

1311-
( uint256 amount0Forecasted, uint256 amount1Forecasted ) = _quoteLiquidity(
1312-
_POOL_ID,
1313-
minted.tickLower,
1314-
minted.tickUpper,
1315-
1_000_000e6
1316-
);
1317-
1318-
amount0Forecasted += 1; // Quote is off by 1
1319-
amount1Forecasted += 1; // Quote is off by 1
1320-
1321-
deal(address(usdc), address(almProxy), amount0Forecasted);
1322-
deal(address(usdt), address(almProxy), amount1Forecasted);
1328+
deal(address(usdc), address(almProxy), 1_000_000e6);
1329+
deal(address(usdt), address(almProxy), 1_000_000e6);
13231330

13241331
vm.prank(relayer);
1332+
vm.expectRevert("MC/amount-too-large-for-permit2");
1333+
mainnetController.increaseLiquidityUniswapV4({
1334+
poolId : _POOL_ID,
1335+
tokenId : minted.tokenId,
1336+
liquidityIncrease : 1_000_000e6,
1337+
amount0Max : uint256(type(uint160).max) + 1,
1338+
amount1Max : uint256(type(uint160).max)
1339+
});
13251340

1326-
vm.expectRevert(
1327-
abi.encodeWithSelector(SlippageCheck.MaximumAmountExceeded.selector, amount0Forecasted - 1, amount0Forecasted)
1328-
);
1329-
1341+
vm.prank(relayer);
1342+
vm.expectRevert("MC/amount-too-large-for-permit2");
13301343
mainnetController.increaseLiquidityUniswapV4({
13311344
poolId : _POOL_ID,
13321345
tokenId : minted.tokenId,
13331346
liquidityIncrease : 1_000_000e6,
1334-
amount0Max : amount0Forecasted - 1,
1335-
amount1Max : amount1Forecasted
1347+
amount0Max : uint256(type(uint160).max),
1348+
amount1Max : uint256(type(uint160).max) + 1
13361349
});
13371350

13381351
vm.prank(relayer);
13391352
mainnetController.increaseLiquidityUniswapV4({
13401353
poolId : _POOL_ID,
13411354
tokenId : minted.tokenId,
13421355
liquidityIncrease : 1_000_000e6,
1343-
amount0Max : amount0Forecasted,
1344-
amount1Max : amount1Forecasted
1356+
amount0Max : uint256(type(uint160).max),
1357+
amount1Max : uint256(type(uint160).max)
13451358
});
13461359
}
13471360

1348-
function test_increaseLiquidityUniswapV4_revertsWhenAmount1MaxSurpassedBoundary() external {
1361+
function test_increaseLiquidityUniswapV4_revertsWhenMaxAmountsSurpassedBoundary() external {
13491362
IncreasePositionResult memory minted = _setupLiquidity(_POOL_ID, -10, 0, 1_000_000e6);
13501363

13511364
vm.startPrank(SPARK_PROXY);
@@ -1368,6 +1381,20 @@ contract MainnetController_UniswapV4_USDC_USDT_Tests is UniswapV4TestBase {
13681381

13691382
vm.prank(relayer);
13701383

1384+
vm.expectRevert(
1385+
abi.encodeWithSelector(SlippageCheck.MaximumAmountExceeded.selector, amount0Forecasted - 1, amount0Forecasted)
1386+
);
1387+
1388+
mainnetController.increaseLiquidityUniswapV4({
1389+
poolId : _POOL_ID,
1390+
tokenId : minted.tokenId,
1391+
liquidityIncrease : 1_000_000e6,
1392+
amount0Max : amount0Forecasted - 1,
1393+
amount1Max : amount1Forecasted
1394+
});
1395+
1396+
vm.prank(relayer);
1397+
13711398
vm.expectRevert(
13721399
abi.encodeWithSelector(SlippageCheck.MaximumAmountExceeded.selector, amount1Forecasted - 1, amount1Forecasted)
13731400
);
@@ -2840,33 +2867,35 @@ contract MainnetController_UniswapV4_USDT_USDS_Tests is UniswapV4TestBase {
28402867
});
28412868
}
28422869

2843-
function test_mintPositionUniswapV4_revertsWhenAmount0MaxSurpassedBoundary() external {
2870+
function test_mintPositionUniswapV4_revertsWhenMaxAmountsTooLargeForPermit2Boundary() external {
28442871
vm.startPrank(SPARK_PROXY);
28452872
mainnetController.setUniswapV4TickLimits(_POOL_ID, 270_000, 280_000, 1_000);
28462873
rateLimits.setRateLimitData(_DEPOSIT_LIMIT_KEY, 2_000_000e18, 0);
28472874
vm.stopPrank();
28482875

2849-
( uint256 amount0Forecasted, uint256 amount1Forecasted ) = _quoteLiquidity(_POOL_ID, 276_300, 276_400, 1_000_000e12);
2850-
2851-
amount0Forecasted += 1; // Quote is off by 1
2852-
amount1Forecasted += 1; // Quote is off by 1
2853-
2854-
deal(address(usdt), address(almProxy), amount0Forecasted);
2855-
deal(address(usds), address(almProxy), amount1Forecasted);
2876+
deal(address(usdt), address(almProxy), 1_000_000e6);
2877+
deal(address(usds), address(almProxy), 1_000_000e18);
28562878

28572879
vm.prank(relayer);
2880+
vm.expectRevert("MC/amount-too-large-for-permit2");
2881+
mainnetController.mintPositionUniswapV4({
2882+
poolId : _POOL_ID,
2883+
tickLower : 276_300,
2884+
tickUpper : 276_400,
2885+
liquidity : 1_000_000e12,
2886+
amount0Max : uint256(type(uint160).max) + 1,
2887+
amount1Max : uint256(type(uint160).max)
2888+
});
28582889

2859-
vm.expectRevert(
2860-
abi.encodeWithSelector(SlippageCheck.MaximumAmountExceeded.selector, amount0Forecasted - 1, amount0Forecasted)
2861-
);
2862-
2890+
vm.prank(relayer);
2891+
vm.expectRevert("MC/amount-too-large-for-permit2");
28632892
mainnetController.mintPositionUniswapV4({
28642893
poolId : _POOL_ID,
28652894
tickLower : 276_300,
28662895
tickUpper : 276_400,
28672896
liquidity : 1_000_000e12,
2868-
amount0Max : amount0Forecasted - 1,
2869-
amount1Max : amount1Forecasted
2897+
amount0Max : uint256(type(uint160).max),
2898+
amount1Max : uint256(type(uint160).max) + 1
28702899
});
28712900

28722901
vm.prank(relayer);
@@ -2875,12 +2904,12 @@ contract MainnetController_UniswapV4_USDT_USDS_Tests is UniswapV4TestBase {
28752904
tickLower : 276_300,
28762905
tickUpper : 276_400,
28772906
liquidity : 1_000_000e12,
2878-
amount0Max : amount0Forecasted,
2879-
amount1Max : amount1Forecasted
2907+
amount0Max : uint256(type(uint160).max),
2908+
amount1Max : uint256(type(uint160).max)
28802909
});
28812910
}
28822911

2883-
function test_mintPositionUniswapV4_revertsWhenAmount1MaxSurpassedBoundary() external {
2912+
function test_mintPositionUniswapV4_revertsWhenMaxAmountsSurpassedBoundary() external {
28842913
vm.startPrank(SPARK_PROXY);
28852914
mainnetController.setUniswapV4TickLimits(_POOL_ID, 270_000, 280_000, 1_000);
28862915
rateLimits.setRateLimitData(_DEPOSIT_LIMIT_KEY, 2_000_000e18, 0);
@@ -2896,6 +2925,21 @@ contract MainnetController_UniswapV4_USDT_USDS_Tests is UniswapV4TestBase {
28962925

28972926
vm.prank(relayer);
28982927

2928+
vm.expectRevert(
2929+
abi.encodeWithSelector(SlippageCheck.MaximumAmountExceeded.selector, amount0Forecasted - 1, amount0Forecasted)
2930+
);
2931+
2932+
mainnetController.mintPositionUniswapV4({
2933+
poolId : _POOL_ID,
2934+
tickLower : 276_300,
2935+
tickUpper : 276_400,
2936+
liquidity : 1_000_000e12,
2937+
amount0Max : amount0Forecasted - 1,
2938+
amount1Max : amount1Forecasted
2939+
});
2940+
2941+
vm.prank(relayer);
2942+
28992943
vm.expectRevert(
29002944
abi.encodeWithSelector(SlippageCheck.MaximumAmountExceeded.selector, amount1Forecasted - 1, amount1Forecasted)
29012945
);
@@ -3153,52 +3197,48 @@ contract MainnetController_UniswapV4_USDT_USDS_Tests is UniswapV4TestBase {
31533197
});
31543198
}
31553199

3156-
function test_increaseLiquidityUniswapV4_revertsWhenAmount0MaxSurpassedBoundary() external {
3200+
function test_increaseLiquidityUniswapV4_revertsWhenMaxAmountsTooLargeForPermit2Boundary() external {
31573201
IncreasePositionResult memory minted = _setupLiquidity(_POOL_ID, 276_000, 276_600, 1_000_000e12);
31583202

31593203
vm.startPrank(SPARK_PROXY);
31603204
mainnetController.setUniswapV4TickLimits(_POOL_ID, 276_000, 276_600, 1_000);
31613205
rateLimits.setRateLimitData(_DEPOSIT_LIMIT_KEY, 2_000_000e18, 0);
31623206
vm.stopPrank();
31633207

3164-
( uint256 amount0Forecasted, uint256 amount1Forecasted ) = _quoteLiquidity(
3165-
_POOL_ID,
3166-
minted.tickLower,
3167-
minted.tickUpper,
3168-
1_000_000e12
3169-
);
3170-
3171-
amount0Forecasted += 1; // Quote is off by 1
3172-
amount1Forecasted += 1; // Quote is off by 1
3173-
3174-
deal(address(usdt), address(almProxy), amount0Forecasted);
3175-
deal(address(usds), address(almProxy), amount1Forecasted);
3208+
deal(address(usdt), address(almProxy), 1_000_000e6);
3209+
deal(address(usds), address(almProxy), 1_000_000e18);
31763210

31773211
vm.prank(relayer);
3212+
vm.expectRevert("MC/amount-too-large-for-permit2");
3213+
mainnetController.increaseLiquidityUniswapV4({
3214+
poolId : _POOL_ID,
3215+
tokenId : minted.tokenId,
3216+
liquidityIncrease : 1_000_000e12,
3217+
amount0Max : uint256(type(uint160).max) + 1,
3218+
amount1Max : uint256(type(uint160).max)
3219+
});
31783220

3179-
vm.expectRevert(
3180-
abi.encodeWithSelector(SlippageCheck.MaximumAmountExceeded.selector, amount0Forecasted - 1, amount0Forecasted)
3181-
);
3182-
3221+
vm.prank(relayer);
3222+
vm.expectRevert("MC/amount-too-large-for-permit2");
31833223
mainnetController.increaseLiquidityUniswapV4({
31843224
poolId : _POOL_ID,
31853225
tokenId : minted.tokenId,
31863226
liquidityIncrease : 1_000_000e12,
3187-
amount0Max : amount0Forecasted - 1,
3188-
amount1Max : amount1Forecasted
3227+
amount0Max : uint256(type(uint160).max),
3228+
amount1Max : uint256(type(uint160).max) + 1
31893229
});
31903230

31913231
vm.prank(relayer);
31923232
mainnetController.increaseLiquidityUniswapV4({
31933233
poolId : _POOL_ID,
31943234
tokenId : minted.tokenId,
31953235
liquidityIncrease : 1_000_000e12,
3196-
amount0Max : amount0Forecasted,
3197-
amount1Max : amount1Forecasted
3236+
amount0Max : uint256(type(uint160).max),
3237+
amount1Max : uint256(type(uint160).max)
31983238
});
31993239
}
32003240

3201-
function test_increaseLiquidityUniswapV4_revertsWhenAmount1MaxSurpassedBoundary() external {
3241+
function test_increaseLiquidityUniswapV4_revertsWhenMaxAmountsMaxSurpassedBoundary() external {
32023242
IncreasePositionResult memory minted = _setupLiquidity(_POOL_ID, 276_000, 276_600, 1_000_000e12);
32033243

32043244
vm.startPrank(SPARK_PROXY);
@@ -3221,6 +3261,20 @@ contract MainnetController_UniswapV4_USDT_USDS_Tests is UniswapV4TestBase {
32213261

32223262
vm.prank(relayer);
32233263

3264+
vm.expectRevert(
3265+
abi.encodeWithSelector(SlippageCheck.MaximumAmountExceeded.selector, amount0Forecasted - 1, amount0Forecasted)
3266+
);
3267+
3268+
mainnetController.increaseLiquidityUniswapV4({
3269+
poolId : _POOL_ID,
3270+
tokenId : minted.tokenId,
3271+
liquidityIncrease : 1_000_000e12,
3272+
amount0Max : amount0Forecasted - 1,
3273+
amount1Max : amount1Forecasted
3274+
});
3275+
3276+
vm.prank(relayer);
3277+
32243278
vm.expectRevert(
32253279
abi.encodeWithSelector(SlippageCheck.MaximumAmountExceeded.selector, amount1Forecasted - 1, amount1Forecasted)
32263280
);

0 commit comments

Comments
 (0)