diff --git a/sdks/universal-router-sdk/src/swapRouter.ts b/sdks/universal-router-sdk/src/swapRouter.ts index 7aedd8303..3bc627428 100644 --- a/sdks/universal-router-sdk/src/swapRouter.ts +++ b/sdks/universal-router-sdk/src/swapRouter.ts @@ -18,7 +18,7 @@ import { PoolKey, } from '@uniswap/v4-sdk' import { Trade as RouterTrade } from '@uniswap/router-sdk' -import { Currency, TradeType, Percent, CHAIN_TO_ADDRESSES_MAP, SupportedChainsType } from '@uniswap/sdk-core' +import { Currency, TradeType, Percent, CHAIN_TO_ADDRESSES_MAP, SupportedChainsType, Token } from '@uniswap/sdk-core' import { UniswapTrade, SwapOptions } from './entities/actions/uniswap' import { RoutePlanner, CommandType } from './utils/routerCommands' import { encodePermit, encodeV3PositionPermit } from './utils/inputTokens' @@ -36,8 +36,8 @@ export interface MigrateV3ToV4Options { v4AddLiquidityOptions: V4AddLiquidityOptions } -function isMint(options: V4AddLiquidityOptions): options is MintOptions { - return Object.keys(options).some((k) => k === 'recipient') +function isMigrate(options: V4AddLiquidityOptions): options is MintOptions { + return 'recipient' in options && options.migrate === true } export abstract class SwapRouter { @@ -87,6 +87,10 @@ export abstract class SwapRouter { const v4PositionManagerAddress = positionManagerOverride ?? CHAIN_TO_ADDRESSES_MAP[v4Pool.chainId as SupportedChainsType].v4PositionManagerAddress + const universalRouterAddress = UNIVERSAL_ROUTER_ADDRESS( + UniversalRouterVersion.V2_0, + options.inputPosition.pool.chainId as SupportedChainsType + ) // owner of the v3 nft must be the receiver of the v4 nft // validate the parameters @@ -110,8 +114,8 @@ export abstract class SwapRouter { options.v3RemoveLiquidityOptions.collectOptions.recipient === v4PositionManagerAddress, 'RECIPIENT_NOT_POSITION_MANAGER' ) - invariant(isMint(options.v4AddLiquidityOptions), 'MINT_REQUIRED') - invariant(options.v4AddLiquidityOptions.migrate, 'MIGRATE_REQUIRED') + // Migration must be a mint operation, not an increase because the UR should not have permission to increase liquidity on a v4 position + invariant(isMigrate(options.v4AddLiquidityOptions), 'MIGRATE_REQUIRED') const planner = new RoutePlanner() @@ -132,10 +136,6 @@ export abstract class SwapRouter { // add position permit to the universal router planner if (options.v3RemoveLiquidityOptions.permit) { // permit spender should be UR - const universalRouterAddress = UNIVERSAL_ROUTER_ADDRESS( - UniversalRouterVersion.V2_0, - options.inputPosition.pool.chainId as SupportedChainsType - ) invariant(universalRouterAddress == options.v3RemoveLiquidityOptions.permit.spender, 'INVALID_SPENDER') // don't need to transfer it because v3posm uses isApprovedOrOwner() encodeV3PositionPermit(planner, options.v3RemoveLiquidityOptions.permit, options.v3RemoveLiquidityOptions.tokenId) @@ -162,6 +162,31 @@ export abstract class SwapRouter { planner.addCommand(CommandType.V3_POSITION_MANAGER_CALL, [v3Call]) } + // if migrate options has a currency, require a batch permit + if ( + options.v4AddLiquidityOptions.currencyAmount && + options.v4AddLiquidityOptions.currencyAmount.inputCurrency instanceof Token + ) { + // need to permit the UR to spend your currency on permit2 + if (options.v4AddLiquidityOptions.batchPermit) { + invariant( + options.v4AddLiquidityOptions.batchPermit.permitBatch.spender == universalRouterAddress, + 'INVALID_SPENDER' + ) + planner.addCommand(CommandType.PERMIT2_PERMIT_BATCH, [ + options.v4AddLiquidityOptions.batchPermit.permitBatch, + options.v4AddLiquidityOptions.batchPermit.signature, + ]) + } + planner.addCommand(CommandType.PERMIT2_TRANSFER_FROM, [ + options.v4AddLiquidityOptions.currencyAmount.inputCurrency.address, + options.v3RemoveLiquidityOptions.collectOptions.recipient, + options.v4AddLiquidityOptions.currencyAmount.inputAmount, + ]) + // remove batchPermit so it doesn't get encoded again later + delete options.v4AddLiquidityOptions.batchPermit + } + // encode v4 mint const v4AddParams = V4PositionManager.addCallParameters(options.outputPosition, options.v4AddLiquidityOptions) // only modifyLiquidities can be called by the UniversalRouter @@ -170,7 +195,13 @@ export abstract class SwapRouter { planner.addCommand(CommandType.V4_POSITION_MANAGER_CALL, [v4AddParams.calldata]) - return SwapRouter.encodePlan(planner, BigNumber.from(0), { + let nativeCurrencyValue = BigNumber.from(0) + + if (options.v4AddLiquidityOptions.currencyAmount?.inputCurrency?.isNative) { + nativeCurrencyValue = BigNumber.from(options.v4AddLiquidityOptions.currencyAmount?.inputAmount) + } + + return SwapRouter.encodePlan(planner, nativeCurrencyValue, { deadline: BigNumber.from(options.v4AddLiquidityOptions.deadline), }) } diff --git a/sdks/universal-router-sdk/test/forge/MigratorCallParameters.t.sol b/sdks/universal-router-sdk/test/forge/MigratorCallParameters.t.sol index 3c3c07987..aea4bdb7e 100644 --- a/sdks/universal-router-sdk/test/forge/MigratorCallParameters.t.sol +++ b/sdks/universal-router-sdk/test/forge/MigratorCallParameters.t.sol @@ -9,6 +9,8 @@ import {DeployRouter} from "./utils/DeployRouter.sol"; import {MethodParameters, Interop} from "./utils/Interop.sol"; import {INonfungiblePositionManager} from "@uniswap/v3-periphery/contracts/interfaces/INonfungiblePositionManager.sol"; +import "forge-std/console2.sol"; + contract MigratorCallParametersTest is Test, Interop, DeployRouter { using stdJson for string; @@ -34,12 +36,13 @@ contract MigratorCallParametersTest is Test, Interop, DeployRouter { // add the position to v3 so we have something to migrate assertEq(INonfungiblePositionManager(V3_POSITION_MANAGER).balanceOf(from), 0); - // USDC < WETH - mintV3Position(address(USDC), address(WETH), 3000, 2500e6, 1e18); + // USDC < WETH (USDC is token0, WETH is token1) + // in range v3 position, tickLower = 200040, tickUpper = 300000, tickCurrent = 205265 + mintV3Position(address(USDC), address(WETH), 3000, 2500e6, 1e18, 200040, 300000); assertEq(INonfungiblePositionManager(V3_POSITION_MANAGER).balanceOf(from), 1); // approve the UniversalRouter to access the position (instead of permit) - vm.prank(from); + vm.startPrank(from); INonfungiblePositionManager(V3_POSITION_MANAGER).setApprovalForAll(MAINNET_ROUTER, true); // pool manager balance before @@ -53,7 +56,6 @@ contract MigratorCallParametersTest is Test, Interop, DeployRouter { uint256 recipientWETHBalanceBefore = WETH.balanceOf(RECIPIENT); assertEq(params.value, 0); - vm.prank(from); (bool success,) = address(router).call(params.data); require(success, "call failed"); @@ -85,8 +87,9 @@ contract MigratorCallParametersTest is Test, Interop, DeployRouter { // add the position to v3 so we have something to migrate assertEq(INonfungiblePositionManager(V3_POSITION_MANAGER).balanceOf(from), 0); - // USDC < WETH - mintV3Position(address(USDC), address(WETH), 3000, 2500e6, 1e18); + // USDC < WETH (USDC is token0, WETH is token1) + // in range v3 position, tickLower = 200040, tickUpper = 300000, tickCurrent = 205265 + mintV3Position(address(USDC), address(WETH), 3000, 2500e6, 1e18, 200040, 300000); assertEq(INonfungiblePositionManager(V3_POSITION_MANAGER).balanceOf(from), 1); // approve the UniversalRouter to access the position (instead of permit) @@ -136,8 +139,9 @@ contract MigratorCallParametersTest is Test, Interop, DeployRouter { // add the position to v3 so we have something to migrate assertEq(INonfungiblePositionManager(V3_POSITION_MANAGER).balanceOf(from), 0); - // USDC < WETH - mintV3Position(address(USDC), address(WETH), 3000, 2500e6, 1e18); + // USDC < WETH (USDC is token0, WETH is token1) + // in range v3 position, tickLower = 200040, tickUpper = 300000, tickCurrent = 205265 + mintV3Position(address(USDC), address(WETH), 3000, 2500e6, 1e18, 200040, 300000); assertEq(INonfungiblePositionManager(V3_POSITION_MANAGER).balanceOf(from), 1); // pool manager balance before @@ -183,8 +187,9 @@ contract MigratorCallParametersTest is Test, Interop, DeployRouter { // add the position to v3 so we have something to migrate assertEq(INonfungiblePositionManager(V3_POSITION_MANAGER).balanceOf(from), 0); - // USDC < WETH - mintV3Position(address(USDC), address(WETH), 3000, 2500e6, 1e18); + // USDC < WETH (USDC is token0, WETH is token1) + // in range v3 position, tickLower = 200040, tickUpper = 300000, tickCurrent = 205265 + mintV3Position(address(USDC), address(WETH), 3000, 2500e6, 1e18, 200040, 300000); assertEq(INonfungiblePositionManager(V3_POSITION_MANAGER).balanceOf(from), 1); // pool manager balance before @@ -230,8 +235,9 @@ contract MigratorCallParametersTest is Test, Interop, DeployRouter { // add the position to v3 so we have something to migrate assertEq(INonfungiblePositionManager(V3_POSITION_MANAGER).balanceOf(from), 0); - // USDC < WETH - mintV3Position(address(USDC), address(WETH), 3000, 2500e6, 1e18); + // USDC < WETH (USDC is token0, WETH is token1) + // in range v3 position, tickLower = 200040, tickUpper = 300000, tickCurrent = 205265 + mintV3Position(address(USDC), address(WETH), 3000, 2500e6, 1e18, 200040, 300000); assertEq(INonfungiblePositionManager(V3_POSITION_MANAGER).balanceOf(from), 1); // pool manager balance before @@ -277,8 +283,9 @@ contract MigratorCallParametersTest is Test, Interop, DeployRouter { // add the position to v3 so we have something to migrate assertEq(INonfungiblePositionManager(V3_POSITION_MANAGER).balanceOf(from), 0); - // USDC < WETH - mintV3Position(address(USDC), address(WETH), 3000, 2500e6, 1e18); + // USDC < WETH (USDC is token0, WETH is token1) + // in range v3 position, tickLower = 200040, tickUpper = 300000, tickCurrent = 205265 + mintV3Position(address(USDC), address(WETH), 3000, 2500e6, 1e18, 200040, 300000); assertEq(INonfungiblePositionManager(V3_POSITION_MANAGER).balanceOf(from), 1); // pool manager balance before @@ -318,4 +325,438 @@ contract MigratorCallParametersTest is Test, Interop, DeployRouter { assertEq(INonfungiblePositionManager(V3_POSITION_MANAGER).balanceOf(from), 0, "V3 NOT BURNT"); assertEq(v4PositionManager.balanceOf(RECIPIENT), 1, "V4 NOT MINTED"); } + + function test_migrate_v3OutOfRangeIn0_to_v4InRange() public { + MethodParameters memory params = readFixture(json, "._MIGRATE_V3RANGE0_TO_V4INRANGE"); + + // add the position to v3 so we have something to migrate + assertEq(INonfungiblePositionManager(V3_POSITION_MANAGER).balanceOf(from), 0); + // USDC < WETH (USDC is token0, WETH is token1) + // above range v3 position in USDC, tickLower = 205320, tickUpper = 300000, tickCurrent = 205265 + mintV3Position(address(USDC), address(WETH), 3000, 2500e6, 1e18, 205320, 300000); + assertEq(INonfungiblePositionManager(V3_POSITION_MANAGER).balanceOf(from), 1); + + // pool manager balance before + uint256 ethBalanceBefore = address(poolManager).balance; + uint256 usdcBalanceBefore = USDC.balanceOf(address(poolManager)); + uint256 wethBalanceBefore = WETH.balanceOf(address(poolManager)); + + // recipient balance before + uint256 recipientBalanceBefore = address(RECIPIENT).balance; + uint256 recipientUSDCBalanceBefore = USDC.balanceOf(RECIPIENT); + uint256 recipientWETHBalanceBefore = WETH.balanceOf(RECIPIENT); + + // approve the UniversalRouter to access the position (instead of permit) + vm.prank(from); + INonfungiblePositionManager(V3_POSITION_MANAGER).setApprovalForAll(MAINNET_ROUTER, true); + + assertEq(params.value, 0); + WETH.transfer(from, WETH.balanceOf(address(this))); + // approve permit2 to spend WETH + vm.startPrank(from); + WETH.approve(MAINNET_PERMIT2, WETH.balanceOf(from)); + + (bool success,) = address(router).call(params.data); + require(success, "call failed"); + + // all funds were swept out of contracts + assertEq(USDC.balanceOf(MAINNET_ROUTER), 0); + assertEq(WETH.balanceOf(MAINNET_ROUTER), 0); + assertEq(address(MAINNET_ROUTER).balance, 0); + assertEq(USDC.balanceOf(address(v4PositionManager)), 0); + assertEq(WETH.balanceOf(address(v4PositionManager)), 0); + assertEq(address(v4PositionManager).balance, 0); + + // pool manager balance after, weth and usdc deposited + assertEq(address(poolManager).balance, ethBalanceBefore); + assertGt(USDC.balanceOf(address(poolManager)), usdcBalanceBefore); + assertGt(WETH.balanceOf(address(poolManager)), wethBalanceBefore); + + // recipient balance after + assertEq(address(RECIPIENT).balance, recipientBalanceBefore); + assertGe(USDC.balanceOf(RECIPIENT), recipientUSDCBalanceBefore); + assertGe(WETH.balanceOf(RECIPIENT), recipientWETHBalanceBefore); + + // old position burned, new position minted + assertEq(INonfungiblePositionManager(V3_POSITION_MANAGER).balanceOf(from), 0, "V3 NOT BURNT"); + assertEq(v4PositionManager.balanceOf(RECIPIENT), 1, "V4 NOT MINTED"); + } + + function test_migrate_v3OutOfRangeIn0_to_v4OutOfRangeIn1() public { + MethodParameters memory params = readFixture(json, "._MIGRATE_V3RANGE0_TO_V4RANGE1"); + + // add the position to v3 so we have something to migrate + assertEq(INonfungiblePositionManager(V3_POSITION_MANAGER).balanceOf(from), 0); + // USDC < WETH (USDC is token0, WETH is token1) + // above range v3 position in USDC, tickLower = 205320, tickUpper = 300000, tickCurrent = 205265 + mintV3Position(address(USDC), address(WETH), 3000, 2500e6, 1e18, 205320, 300000); + assertEq(INonfungiblePositionManager(V3_POSITION_MANAGER).balanceOf(from), 1); + + // pool manager balance before + uint256 ethBalanceBefore = address(poolManager).balance; + uint256 usdcBalanceBefore = USDC.balanceOf(address(poolManager)); + uint256 wethBalanceBefore = WETH.balanceOf(address(poolManager)); + + // recipient balance before + uint256 recipientBalanceBefore = address(RECIPIENT).balance; + uint256 recipientUSDCBalanceBefore = USDC.balanceOf(RECIPIENT); + uint256 recipientWETHBalanceBefore = WETH.balanceOf(RECIPIENT); + + // approve the UniversalRouter to access the position (instead of permit) + vm.prank(from); + INonfungiblePositionManager(V3_POSITION_MANAGER).setApprovalForAll(MAINNET_ROUTER, true); + + assertEq(params.value, 0); + WETH.transfer(from, WETH.balanceOf(address(this))); + // approve permit2 to spend WETH + vm.startPrank(from); + WETH.approve(MAINNET_PERMIT2, WETH.balanceOf(from)); + + (bool success,) = address(router).call(params.data); + require(success, "call failed"); + + // all funds were swept out of contracts + assertEq(USDC.balanceOf(MAINNET_ROUTER), 0); + assertEq(WETH.balanceOf(MAINNET_ROUTER), 0); + assertEq(address(MAINNET_ROUTER).balance, 0); + assertEq(USDC.balanceOf(address(v4PositionManager)), 0); + assertEq(WETH.balanceOf(address(v4PositionManager)), 0); + assertEq(address(v4PositionManager).balance, 0); + + // pool manager balance after, weth deposited + assertEq(address(poolManager).balance, ethBalanceBefore); + assertEq(USDC.balanceOf(address(poolManager)), usdcBalanceBefore); + assertGt(WETH.balanceOf(address(poolManager)), wethBalanceBefore); + + // recipient balance after + assertEq(address(RECIPIENT).balance, recipientBalanceBefore); + assertGt(USDC.balanceOf(RECIPIENT), recipientUSDCBalanceBefore); + assertGe(WETH.balanceOf(RECIPIENT), recipientWETHBalanceBefore); + + // old position burned, new position minted + assertEq(INonfungiblePositionManager(V3_POSITION_MANAGER).balanceOf(from), 0, "V3 NOT BURNT"); + assertEq(v4PositionManager.balanceOf(RECIPIENT), 1, "V4 NOT MINTED"); + } + + function test_migrate_v3OutOfRangeIn0_to_v4OutOfRangeIn0() public { + MethodParameters memory params = readFixture(json, "._MIGRATE_V3RANGE0_TO_V4RANGE0"); + + // add the position to v3 so we have something to migrate + assertEq(INonfungiblePositionManager(V3_POSITION_MANAGER).balanceOf(from), 0); + // USDC < WETH (USDC is token0, WETH is token1) + // above range v3 position in USDC, tickLower = 205320, tickUpper = 300000, tickCurrent = 205265 + mintV3Position(address(USDC), address(WETH), 3000, 2500e6, 1e18, 205320, 300000); + assertEq(INonfungiblePositionManager(V3_POSITION_MANAGER).balanceOf(from), 1); + + // pool manager balance before + uint256 ethBalanceBefore = address(poolManager).balance; + uint256 usdcBalanceBefore = USDC.balanceOf(address(poolManager)); + uint256 wethBalanceBefore = WETH.balanceOf(address(poolManager)); + + // recipient balance before + uint256 recipientBalanceBefore = address(RECIPIENT).balance; + uint256 recipientUSDCBalanceBefore = USDC.balanceOf(RECIPIENT); + uint256 recipientWETHBalanceBefore = WETH.balanceOf(RECIPIENT); + + // approve the UniversalRouter to access the position (instead of permit) + vm.startPrank(from); + INonfungiblePositionManager(V3_POSITION_MANAGER).setApprovalForAll(MAINNET_ROUTER, true); + + assertEq(params.value, 0); + + (bool success,) = address(router).call(params.data); + require(success, "call failed"); + + // all funds were swept out of contracts + assertEq(USDC.balanceOf(MAINNET_ROUTER), 0); + assertEq(WETH.balanceOf(MAINNET_ROUTER), 0); + assertEq(address(MAINNET_ROUTER).balance, 0); + assertEq(USDC.balanceOf(address(v4PositionManager)), 0); + assertEq(WETH.balanceOf(address(v4PositionManager)), 0); + assertEq(address(v4PositionManager).balance, 0); + + // pool manager balance after, usdc deposited + assertEq(address(poolManager).balance, ethBalanceBefore); + assertGt(USDC.balanceOf(address(poolManager)), usdcBalanceBefore); + assertEq(WETH.balanceOf(address(poolManager)), wethBalanceBefore); + + // recipient balance after + assertEq(address(RECIPIENT).balance, recipientBalanceBefore); + assertGe(USDC.balanceOf(RECIPIENT), recipientUSDCBalanceBefore); + assertEq(WETH.balanceOf(RECIPIENT), recipientWETHBalanceBefore); + + // old position burned, new position minted + assertEq(INonfungiblePositionManager(V3_POSITION_MANAGER).balanceOf(from), 0, "V3 NOT BURNT"); + assertEq(v4PositionManager.balanceOf(RECIPIENT), 1, "V4 NOT MINTED"); + } + + function test_migrate_v3OutOfRangeInUSDC_to_v4OutOfRangeInETH() public { + MethodParameters memory params = readFixture(json, "._MIGRATE_V3RANGE_USDC_TO_V4RANGE_ETH"); + + // add the position to v3 so we have something to migrate + assertEq(INonfungiblePositionManager(V3_POSITION_MANAGER).balanceOf(from), 0); + // USDC < WETH (USDC is token0, WETH is token1) + // above range v3 position in USDC, tickLower = 205320, tickUpper = 300000, tickCurrent = 205265 + mintV3Position(address(USDC), address(WETH), 3000, 2500e6, 1e18, 205320, 300000); + assertEq(INonfungiblePositionManager(V3_POSITION_MANAGER).balanceOf(from), 1); + + // pool manager balance before + uint256 ethBalanceBefore = address(poolManager).balance; + uint256 usdcBalanceBefore = USDC.balanceOf(address(poolManager)); + uint256 wethBalanceBefore = WETH.balanceOf(address(poolManager)); + + // recipient balance before + uint256 recipientBalanceBefore = address(RECIPIENT).balance; + uint256 recipientUSDCBalanceBefore = USDC.balanceOf(RECIPIENT); + uint256 recipientWETHBalanceBefore = WETH.balanceOf(RECIPIENT); + + // approve the UniversalRouter to access the position (instead of permit) + vm.startPrank(from); + INonfungiblePositionManager(V3_POSITION_MANAGER).setApprovalForAll(MAINNET_ROUTER, true); + + assertEq(params.value, 9000000000000000000); + + console2.log("from balance is ", address(from).balance); + + // (bool success,) = address(router).call(params.data); + // require(success, "call failed"); + + // // all funds were swept out of contracts + // assertEq(USDC.balanceOf(MAINNET_ROUTER), 0); + // assertEq(WETH.balanceOf(MAINNET_ROUTER), 0); + // assertEq(address(MAINNET_ROUTER).balance, 0); + // assertEq(USDC.balanceOf(address(v4PositionManager)), 0); + // assertEq(WETH.balanceOf(address(v4PositionManager)), 0); + // assertEq(address(v4PositionManager).balance, 0); + + // // pool manager balance after, usdc deposited + // assertEq(address(poolManager).balance, ethBalanceBefore); + // assertGt(USDC.balanceOf(address(poolManager)), usdcBalanceBefore); + // assertEq(WETH.balanceOf(address(poolManager)), wethBalanceBefore); + + // // recipient balance after + // assertEq(address(RECIPIENT).balance, recipientBalanceBefore); + // assertGe(USDC.balanceOf(RECIPIENT), recipientUSDCBalanceBefore); + // assertEq(WETH.balanceOf(RECIPIENT), recipientWETHBalanceBefore); + + // // old position burned, new position minted + // assertEq(INonfungiblePositionManager(V3_POSITION_MANAGER).balanceOf(from), 0, "V3 NOT BURNT"); + // assertEq(v4PositionManager.balanceOf(RECIPIENT), 1, "V4 NOT MINTED"); + } + + function test_migrate_v3OutOfRangeIn1_v4InRange() public { + MethodParameters memory params = readFixture(json, "._MIGRATE_V3RANGE1_TO_V4INRANGE"); + + // add the position to v3 so we have something to migrate + assertEq(INonfungiblePositionManager(V3_POSITION_MANAGER).balanceOf(from), 0); + // USDC < WETH (USDC is token0, WETH is token1) + // below range v3 position in WETH, tickLower = 204720, tickUpper = 204960, tickCurrent = 205265 + mintV3Position(address(USDC), address(WETH), 3000, 2500e6, 1e18, 204720, 204960); + assertEq(INonfungiblePositionManager(V3_POSITION_MANAGER).balanceOf(from), 1); + + // pool manager balance before + uint256 ethBalanceBefore = address(poolManager).balance; + uint256 usdcBalanceBefore = USDC.balanceOf(address(poolManager)); + uint256 wethBalanceBefore = WETH.balanceOf(address(poolManager)); + + // recipient balance before + uint256 recipientBalanceBefore = address(RECIPIENT).balance; + uint256 recipientUSDCBalanceBefore = USDC.balanceOf(RECIPIENT); + uint256 recipientWETHBalanceBefore = WETH.balanceOf(RECIPIENT); + + // approve the UniversalRouter to access the position (instead of permit) + vm.prank(from); + INonfungiblePositionManager(V3_POSITION_MANAGER).setApprovalForAll(MAINNET_ROUTER, true); + + assertEq(params.value, 0); + USDC.transfer(from, USDC.balanceOf(address(this))); + // approve the universal router on permit2 to spend USDC + vm.startPrank(from); + USDC.approve(MAINNET_PERMIT2, USDC.balanceOf(from)); + + (bool success,) = address(router).call(params.data); + require(success, "call failed"); + + // all funds were swept out of contracts + assertEq(USDC.balanceOf(MAINNET_ROUTER), 0); + assertEq(WETH.balanceOf(MAINNET_ROUTER), 0); + assertEq(address(MAINNET_ROUTER).balance, 0); + assertEq(USDC.balanceOf(address(v4PositionManager)), 0); + assertEq(WETH.balanceOf(address(v4PositionManager)), 0); + assertEq(address(v4PositionManager).balance, 0); + + // pool manager balance after, weth and usdc deposited + assertEq(address(poolManager).balance, ethBalanceBefore); + assertGt(USDC.balanceOf(address(poolManager)), usdcBalanceBefore); + assertGt(WETH.balanceOf(address(poolManager)), wethBalanceBefore); + + // recipient balance after + assertEq(address(RECIPIENT).balance, recipientBalanceBefore); + assertGe(USDC.balanceOf(RECIPIENT), recipientUSDCBalanceBefore); + assertGe(WETH.balanceOf(RECIPIENT), recipientWETHBalanceBefore); + + // old position burned, new position minted + assertEq(INonfungiblePositionManager(V3_POSITION_MANAGER).balanceOf(from), 0, "V3 NOT BURNT"); + assertEq(v4PositionManager.balanceOf(RECIPIENT), 1, "V4 NOT MINTED"); + } + + function test_migrate_v3OutOfRangeIn1_v4OutOfRangeIn0() public { + MethodParameters memory params = readFixture(json, "._MIGRATE_V3RANGE1_TO_V4RANGE0"); + + // add the position to v3 so we have something to migrate + assertEq(INonfungiblePositionManager(V3_POSITION_MANAGER).balanceOf(from), 0); + // USDC < WETH (USDC is token0, WETH is token1) + // below range v3 position in WETH, tickLower = 204720, tickUpper = 204960, tickCurrent = 205265 + mintV3Position(address(USDC), address(WETH), 3000, 2500e6, 1e18, 204720, 204960); + assertEq(INonfungiblePositionManager(V3_POSITION_MANAGER).balanceOf(from), 1); + + // pool manager balance before + uint256 ethBalanceBefore = address(poolManager).balance; + uint256 usdcBalanceBefore = USDC.balanceOf(address(poolManager)); + uint256 wethBalanceBefore = WETH.balanceOf(address(poolManager)); + + // recipient balance before + uint256 recipientBalanceBefore = address(RECIPIENT).balance; + uint256 recipientUSDCBalanceBefore = USDC.balanceOf(RECIPIENT); + uint256 recipientWETHBalanceBefore = WETH.balanceOf(RECIPIENT); + + // approve the UniversalRouter to access the position (instead of permit) + vm.prank(from); + INonfungiblePositionManager(V3_POSITION_MANAGER).setApprovalForAll(MAINNET_ROUTER, true); + + assertEq(params.value, 0); + USDC.transfer(from, USDC.balanceOf(address(this))); + // approve the universal router on permit2 to spend USDC + vm.startPrank(from); + USDC.approve(MAINNET_PERMIT2, USDC.balanceOf(from)); + + (bool success,) = address(router).call(params.data); + require(success, "call failed"); + + // all funds were swept out of contracts + assertEq(USDC.balanceOf(MAINNET_ROUTER), 0); + assertEq(WETH.balanceOf(MAINNET_ROUTER), 0); + assertEq(address(MAINNET_ROUTER).balance, 0); + assertEq(USDC.balanceOf(address(v4PositionManager)), 0); + assertEq(WETH.balanceOf(address(v4PositionManager)), 0); + assertEq(address(v4PositionManager).balance, 0); + + // pool manager balance after, usdc deposited + assertEq(address(poolManager).balance, ethBalanceBefore); + assertGt(USDC.balanceOf(address(poolManager)), usdcBalanceBefore); + assertEq(WETH.balanceOf(address(poolManager)), wethBalanceBefore); + + // recipient balance after + assertEq(address(RECIPIENT).balance, recipientBalanceBefore); + assertGe(USDC.balanceOf(RECIPIENT), recipientUSDCBalanceBefore); + assertGt(WETH.balanceOf(RECIPIENT), recipientWETHBalanceBefore); + + // old position burned, new position minted + assertEq(INonfungiblePositionManager(V3_POSITION_MANAGER).balanceOf(from), 0, "V3 NOT BURNT"); + assertEq(v4PositionManager.balanceOf(RECIPIENT), 1, "V4 NOT MINTED"); + } + + function test_migrate_v3OutOfRangeIn1_v4OutOfRangeIn1() public { + MethodParameters memory params = readFixture(json, "._MIGRATE_V3RANGE1_TO_V4RANGE1"); + + // add the position to v3 so we have something to migrate + assertEq(INonfungiblePositionManager(V3_POSITION_MANAGER).balanceOf(from), 0); + // USDC < WETH (USDC is token0, WETH is token1) + // below range v3 position in WETH, tickLower = 204720, tickUpper = 204960, tickCurrent = 205265 + mintV3Position(address(USDC), address(WETH), 3000, 2500e6, 1e18, 204720, 204960); + assertEq(INonfungiblePositionManager(V3_POSITION_MANAGER).balanceOf(from), 1); + + // pool manager balance before + uint256 ethBalanceBefore = address(poolManager).balance; + uint256 usdcBalanceBefore = USDC.balanceOf(address(poolManager)); + uint256 wethBalanceBefore = WETH.balanceOf(address(poolManager)); + + // recipient balance before + uint256 recipientBalanceBefore = address(RECIPIENT).balance; + uint256 recipientUSDCBalanceBefore = USDC.balanceOf(RECIPIENT); + uint256 recipientWETHBalanceBefore = WETH.balanceOf(RECIPIENT); + + // approve the UniversalRouter to access the position (instead of permit) + vm.startPrank(from); + INonfungiblePositionManager(V3_POSITION_MANAGER).setApprovalForAll(MAINNET_ROUTER, true); + + assertEq(params.value, 0); + + (bool success,) = address(router).call(params.data); + require(success, "call failed"); + + // all funds were swept out of contracts + assertEq(USDC.balanceOf(MAINNET_ROUTER), 0); + assertEq(WETH.balanceOf(MAINNET_ROUTER), 0); + assertEq(address(MAINNET_ROUTER).balance, 0); + assertEq(USDC.balanceOf(address(v4PositionManager)), 0); + assertEq(WETH.balanceOf(address(v4PositionManager)), 0); + assertEq(address(v4PositionManager).balance, 0); + + // pool manager balance after, weth deposited + assertEq(address(poolManager).balance, ethBalanceBefore); + assertEq(USDC.balanceOf(address(poolManager)), usdcBalanceBefore); + assertGt(WETH.balanceOf(address(poolManager)), wethBalanceBefore); + + // recipient balance after + assertEq(address(RECIPIENT).balance, recipientBalanceBefore); + assertEq(USDC.balanceOf(RECIPIENT), recipientUSDCBalanceBefore); + assertGe(WETH.balanceOf(RECIPIENT), recipientWETHBalanceBefore); + + // old position burned, new position minted + assertEq(INonfungiblePositionManager(V3_POSITION_MANAGER).balanceOf(from), 0, "V3 NOT BURNT"); + assertEq(v4PositionManager.balanceOf(RECIPIENT), 1, "V4 NOT MINTED"); + } + + function test_migrate_v3OutOfRangeInWETH_to_v4OutOfRangeInETH() public { + MethodParameters memory params = readFixture(json, "._MIGRATE_V3RANGE_WETH_TO_V4RANGE_ETH"); + + // add the position to v3 so we have something to migrate + assertEq(INonfungiblePositionManager(V3_POSITION_MANAGER).balanceOf(from), 0); + // USDC < WETH (USDC is token0, WETH is token1) + // below range v3 position in WETH, tickLower = 204720, tickUpper = 204960, tickCurrent = 205265 + mintV3Position(address(USDC), address(WETH), 3000, 2500e6, 1e18, 204720, 204960); + assertEq(INonfungiblePositionManager(V3_POSITION_MANAGER).balanceOf(from), 1); + + // pool manager balance before + uint256 ethBalanceBefore = address(poolManager).balance; + uint256 usdcBalanceBefore = USDC.balanceOf(address(poolManager)); + uint256 wethBalanceBefore = WETH.balanceOf(address(poolManager)); + + // recipient balance before + uint256 recipientBalanceBefore = address(RECIPIENT).balance; + uint256 recipientUSDCBalanceBefore = USDC.balanceOf(RECIPIENT); + uint256 recipientWETHBalanceBefore = WETH.balanceOf(RECIPIENT); + + // approve the UniversalRouter to access the position (instead of permit) + vm.startPrank(from); + INonfungiblePositionManager(V3_POSITION_MANAGER).setApprovalForAll(MAINNET_ROUTER, true); + + assertEq(params.value, 0); + + (bool success,) = address(router).call(params.data); + require(success, "call failed"); + + // all funds were swept out of contracts + assertEq(USDC.balanceOf(MAINNET_ROUTER), 0); + assertEq(WETH.balanceOf(MAINNET_ROUTER), 0); + assertEq(address(MAINNET_ROUTER).balance, 0); + assertEq(USDC.balanceOf(address(v4PositionManager)), 0); + assertEq(WETH.balanceOf(address(v4PositionManager)), 0); + assertEq(address(v4PositionManager).balance, 0); + + // pool manager balance after, eth deposited + assertGt(address(poolManager).balance, ethBalanceBefore); + assertEq(USDC.balanceOf(address(poolManager)), usdcBalanceBefore); + assertEq(WETH.balanceOf(address(poolManager)), wethBalanceBefore); + + // recipient balance after + assertEq(address(RECIPIENT).balance, recipientBalanceBefore); + assertEq(USDC.balanceOf(RECIPIENT), recipientUSDCBalanceBefore); + assertGe(WETH.balanceOf(RECIPIENT), recipientWETHBalanceBefore); + + // old position burned, new position minted + assertEq(INonfungiblePositionManager(V3_POSITION_MANAGER).balanceOf(from), 0, "V3 NOT BURNT"); + assertEq(v4PositionManager.balanceOf(RECIPIENT), 1, "V4 NOT MINTED"); + } } diff --git a/sdks/universal-router-sdk/test/forge/interop.json b/sdks/universal-router-sdk/test/forge/interop.json index e0a0fa0a0..82d1960a5 100644 --- a/sdks/universal-router-sdk/test/forge/interop.json +++ b/sdks/universal-router-sdk/test/forge/interop.json @@ -111,58 +111,6 @@ "calldata": "0x24856bc300000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000301060c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000001a00000000000000000000000000000000000000000000000000000000000000220000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000e9bb2d80e8435e500000000000000000000000000000000000000000000004cc45359a454a11b4300000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000042c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000bb8a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480001f46b175474e89094c44da98b954eedeac495271d0f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb00000000000000000000000000000000000000000000000000000000000001f40000000000000000000000000000000000000000000000000000000000000040000000000000000000000000aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0000000000000000000000000000000000000000000000000de0b6b3a7640000", "value": "0" }, - "_UNISWAP_V4_1_ETH_FOR_USDC": { - "calldata": "0x24856bc300000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000003c0000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000003070b0e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000002a000000000000000000000000000000000000000000000000000000000000001a00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000de0b6b3a76400000000000000000000000000000000000000000000000000000d2d62035241defd00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000000000000000000000000000000000000000000bb8000000000000000000000000000000000000000000000000000000000000003c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000060000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0000000000000000000000000000000000000000000000000000000000000000", - "value": "1000000000000000000" - }, - "_UNISWAP_V4_1_ETH_FOR_USDC_WITH_WRAP": { - "calldata": "0x24856bc30000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000020b100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000003c0000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000003070b0e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000002a000000000000000000000000000000000000000000000000000000000000001a00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000de0b6b3a76400000000000000000000000000000000000000000000000000000d2d62035241defd00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000000000000000000000000000000000000000000bb8000000000000000000000000000000000000000000000000000000000000003c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0000000000000000000000000000000000000000000000000000000000000000", - "value": "1000000000000000000" - }, - "_UNISWAP_V4_1_ETH_FOR_USDC_WITH_FEE": { - "calldata": "0x24856bc3000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000003100604000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000044000000000000000000000000000000000000000000000000000000000000004c000000000000000000000000000000000000000000000000000000000000003c0000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000003070b0e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000002a000000000000000000000000000000000000000000000000000000000000001a00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000de0b6b3a7640000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000000000000000000000000000000000000000000bb8000000000000000000000000000000000000000000000000000000000000003c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000060000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb00000000000000000000000000000000000000000000000000000000000001f40000000000000000000000000000000000000000000000000000000000000060000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0000000000000000000000000000000000000000000000000c940c1a716d6c20", - "value": "1000000000000000000" - }, - "_UNISWAP_V4_1_ETH_FOR_USDC_WITH_FLAT_FEE": { - "calldata": "0x24856bc3000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000003100504000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000044000000000000000000000000000000000000000000000000000000000000004c000000000000000000000000000000000000000000000000000000000000003c0000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000003070b0e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000002a000000000000000000000000000000000000000000000000000000000000001a00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000de0b6b3a7640000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000000000000000000000000000000000000000000bb8000000000000000000000000000000000000000000000000000000000000003c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000060000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb0000000000000000000000000000000000000000000000000000000002faf0800000000000000000000000000000000000000000000000000000000000000060000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0000000000000000000000000000000000000000000000000d2d62035241defd", - "value": "1000000000000000000" - }, - "_UNISWAP_V4_1000_USDC_FOR_ETH": { - "calldata": "0x24856bc300000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000003c0000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000003070b0e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000002a000000000000000000000000000000000000000000000000000000000000001a00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000003b9aca0000000000000000000000000000000000000000000000000000000000389895600000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bb8000000000000000000000000000000000000000000000000000000000000003c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0000000000000000000000000000000000000000000000000000000000000000", - "value": "0" - }, - "_UNISWAP_V4_ETH_FOR_DAI": { - "calldata": "0x24856bc3000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000002100400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000004a0000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000003070b0e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000038000000000000000000000000000000000000000000000000000000000000002800000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000de0b6b3a76400000000000000000000000000000000000000000000000000000d2342662b64fb0c000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000100000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000000000000000000000000000000000000000000bb8000000000000000000000000000000000000000000000000000000000000003c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006b175474e89094c44da98b954eedeac495271d0f0000000000000000000000000000000000000000000000000000000000000bb8000000000000000000000000000000000000000000000000000000000000003c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000600000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0000000000000000000000000000000000000000000000000000000000000000", - "value": "1000000000000000000" - }, - "_UNISWAP_V4_DAI_FOR_1_ETH_2_HOP": { - "calldata": "0x24856bc300000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004a0000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000003090b0e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000038000000000000000000000000000000000000000000000000000000000000002800000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000de0b6b3a76400000000000000000000000000000000000000000000000000000ea8d710c6670fe50000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001000000000000000000000000006b175474e89094c44da98b954eedeac495271d0f0000000000000000000000000000000000000000000000000000000000000bb8000000000000000000000000000000000000000000000000000000000000003c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000000000000000000000000000000000000000000bb8000000000000000000000000000000000000000000000000000000000000003c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000006b175474e89094c44da98b954eedeac495271d0f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0000000000000000000000000000000000000000000000000000000000000000", - "value": "0" - }, - "_UNISWAP_V4_USDC_FOR_1_ETH_2_HOP_WITH_ETH_FEE": { - "calldata": "0x24856bc3000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000003100604000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000052000000000000000000000000000000000000000000000000000000000000005a000000000000000000000000000000000000000000000000000000000000004a0000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000003090b0e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000038000000000000000000000000000000000000000000000000000000000000002800000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000e9bb2d80e8435e5000000000000000000000000000000000000000000000000102a78813767ff57000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000100000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000000000000000000000000000000000000000000bb8000000000000000000000000000000000000000000000000000000000000003c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006b175474e89094c44da98b954eedeac495271d0f0000000000000000000000000000000000000000000000000000000000000bb8000000000000000000000000000000000000000000000000000000000000003c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb00000000000000000000000000000000000000000000000000000000000001f400000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "value": "0" - }, - "_UNISWAP_V4_USDC_FOR_1_ETH_WITH_WRAP": { - "calldata": "0x24856bc3000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000002100b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000004a0000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000003090b0e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000038000000000000000000000000000000000000000000000000000000000000002800000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000de0b6b3a76400000000000000000000000000000000000000000000000000000ea8d710c6670fe5000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000100000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000000000000000000000000000000000000000000bb8000000000000000000000000000000000000000000000000000000000000003c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006b175474e89094c44da98b954eedeac495271d0f0000000000000000000000000000000000000000000000000000000000000bb8000000000000000000000000000000000000000000000000000000000000003c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa8000000000000000000000000000000000000000000000000000000000000000", - "value": "0" - }, - "_UNISWAP_V4_USDC_FOR_1000_ETH_WITH_FEE_AND_WRAP": { - "calldata": "0x24856bc300000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000310050b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000052000000000000000000000000000000000000000000000000000000000000005a000000000000000000000000000000000000000000000000000000000000004a0000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000003090b0e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000038000000000000000000000000000000000000000000000000000000000000002800000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000e92596fd62900000000000000000000000000000000000000000000000000000f647b8513b70838000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000100000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000000000000000000000000000000000000000000bb8000000000000000000000000000000000000000000000000000000000000003c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006b175474e89094c44da98b954eedeac495271d0f0000000000000000000000000000000000000000000000000000000000000bb8000000000000000000000000000000000000000000000000000000000000003c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb00000000000000000000000000000000000000000000000000b1a2bc2ec500000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa8000000000000000000000000000000000000000000000000000000000000000", - "value": "0" - }, - "_UNISWAP_V4_ETH_FOR_1000_USDC": { - "calldata": "0x24856bc3000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000002100400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000004a0000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000003090b0e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000038000000000000000000000000000000000000000000000000000000000000002800000000000000000000000000000000000000000000000000000000000000020000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000003b9aca00000000000000000000000000000000000000000000000000000000003ef64b1300000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bb8000000000000000000000000000000000000000000000000000000000000003c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006b175474e89094c44da98b954eedeac495271d0f0000000000000000000000000000000000000000000000000000000000000bb8000000000000000000000000000000000000000000000000000000000000003c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000060000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0000000000000000000000000000000000000000000000000000000000000000", - "value": "1056328467" - }, - "_UNISWAP_V4_UNWRAP_WETH_TO_ETH_FOR_1000_USDC": { - "calldata": "0x24856bc3000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000004020c100b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000006200000000000000000000000000000000000000000000000000000000000000060000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000003ef64b1300000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004a0000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000003090b0e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000038000000000000000000000000000000000000000000000000000000000000002800000000000000000000000000000000000000000000000000000000000000020000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000003b9aca00000000000000000000000000000000000000000000000000000000003ef64b1300000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bb8000000000000000000000000000000000000000000000000000000000000003c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006b175474e89094c44da98b954eedeac495271d0f0000000000000000000000000000000000000000000000000000000000000bb8000000000000000000000000000000000000000000000000000000000000003c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa8000000000000000000000000000000000000000000000000000000000000000", - "value": "0" - }, - "_UNISWAP_V4_WRAP_ETH_FOR_1_DAI": { - "calldata": "0x24856bc30000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000030b100c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000580000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000ea8d710c6670fe500000000000000000000000000000000000000000000000000000000000004a0000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000003090b0e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000380000000000000000000000000000000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000000200000000000000000000000006b175474e89094c44da98b954eedeac495271d0f00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000de0b6b3a76400000000000000000000000000000000000000000000000000000ea8d710c6670fe5000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000100000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000000000000000000000000000000000000000000bb8000000000000000000000000000000000000000000000000000000000000003c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000000000000000000000000000000000000000000bb8000000000000000000000000000000000000000000000000000000000000003c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0000000000000000000000000000000000000000000000000000000000000000", - "value": "1056330579666472933" - }, "_UNISWAP_MIXED_1_ETH_FOR_DAI": { "calldata": "0x24856bc30000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000030b000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001e0000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000de0b6b3a76400000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000ae461ca67b15dc8dc81ce7615e0320da1a9ab8d50000000000000000000000000000000000000000000000000de0b6b3a7640000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002bc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000bb8a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003e6e6bec160b0fe3f600000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000006b175474e89094c44da98b954eedeac495271d0f", "value": "1000000000000000000" @@ -183,22 +131,6 @@ "calldata": "0x24856bc300000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000308000c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000002a00000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000003635c9adc5dea00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002ba0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000bb8c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0000000000000000000000000000000000000000000000000acc47d3615931ec", "value": "0" }, - "_UNISWAP_MIXED_USDC_DAI_UNWRAP_WETH_V3_TO_V4": { - "calldata": "0x24856bc3000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000003000c10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000003b9aca00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000002ba0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000bb8c02aaa39b223fe8d0a0e5c4f27ead9083c756cc200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003c00000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000030b070e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000002a0000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ac7ed2380c87f8e000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000200000000000000000000000006b175474e89094c44da98b954eedeac495271d0f0000000000000000000000000000000000000000000000000000000000000bb8000000000000000000000000000000000000000000000000000000000000003c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0000000000000000000000000000000000000000000000000000000000000000", - "value": "0" - }, - "_UNISWAP_MIXED_USDC_DAI_UNWRAP_WETH_V2_TO_V4": { - "calldata": "0x24856bc3000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000003080c10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000003b9aca00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc200000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003c00000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000030b070e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000002a0000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000acad8379663ef8c000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000200000000000000000000000006b175474e89094c44da98b954eedeac495271d0f0000000000000000000000000000000000000000000000000000000000000bb8000000000000000000000000000000000000000000000000000000000000003c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0000000000000000000000000000000000000000000000000000000000000000", - "value": "0" - }, - "_UNISWAP_MIXED_DAI_USDC_WRAP_ETH_V4_TO_V3": { - "calldata": "0x24856bc3000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000003100b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000044000000000000000000000000000000000000000000000000000000000000004a000000000000000000000000000000000000000000000000000000000000003c00000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000030b070e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000002a000000000000000000000000000000000000000000000000000000000000000600000000000000000000000006b175474e89094c44da98b954eedeac495271d0f00000000000000000000000000000000000000000000003635c9adc5dea00000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000000200000000000000000000000006b175474e89094c44da98b954eedeac495271d0f0000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bb8000000000000000000000000000000000000000000000000000000000000003c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000280000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010bb9be311e00000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002bc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000bb8a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000000000000000000000", - "value": "0" - }, - "_UNISWAP_MIXED_DAI_USDC_WRAP_ETH_V4_TO_V2": { - "calldata": "0x24856bc3000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000003100b08000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000044000000000000000000000000000000000000000000000000000000000000004a000000000000000000000000000000000000000000000000000000000000003c00000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000030b070e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000002a000000000000000000000000000000000000000000000000000000000000000600000000000000000000000006b175474e89094c44da98b954eedeac495271d0f00000000000000000000000000000000000000000000003635c9adc5dea00000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000000200000000000000000000000006b175474e89094c44da98b954eedeac495271d0f0000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bb8000000000000000000000000000000000000000000000000000000000000003c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000280000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001049ea901be00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48", - "value": "0" - }, "_UNISWAP_SPLIT_TWO_ROUTES_ETH_TO_USDC": { "calldata": "0x24856bc30000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000050b08000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000500000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000220000000000000000000000000000000000000000000000000000000000000034000000000000000000000000000000000000000000000000000000000000004600000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000029a2241af62c0000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000de0b6b3a7640000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000de0b6b3a7640000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002bc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000bb8a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000de0b6b3a7640000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002bc02aaa39b223fe8d0a0e5c4f27ead9083c756cc20001f4a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa00000000000000000000000000000000000000000000000000000000ceebdd6e", "value": "3000000000000000000" @@ -230,5 +162,37 @@ "_MIGRATE_TO_ERC20_WITH_PERMIT_AND_POOL_INITIALIZE": { "calldata": "0x3593564c000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000ffffffffffffffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000000000061311121212140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000002a00000000000000000000000000000000000000000000000000000000000000380000000000000000000000000000000000000000000000000000000000000044000000000000000000000000000000000000000000000000000000000000004a000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc200000000000000000000000000000000000000000000000000000000000001f4000000000000000000000000000000000000000000000000000000000000003c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000c47ac2ff7b00000000000000000000000066a9893cc07d91d95644aedd05d03f95e1dba8af000000000000000000000000000000000000000000000000000000000005c474000000000000000000000000ffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000000000000000000000000000001ce3b052b9759a89085d422f47135a6b07afb2401ef4918b5f52b0bda503b9222b01001d6e7addb742ecf373558f59ed21358d74c1ea2f1cfcab80f4c5941a0e510000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a40c49ccbe000000000000000000000000000000000000000000000000000000000005c474000000000000000000000000000000000000000000000000000041b5de3f36ba0000000000000000000000000000000000000000000000000000000091637ff800000000000000000000000000000000000000000000000005e085d5c8a18a7e000000000000000000000000ffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000084fc6f7865000000000000000000000000000000000000000000000000000000000005c4740000000000000000000000002e234dae75c793f67a35089c9d99245e1c58470b00000000000000000000000000000000ffffffffffffffffffffffffffffffff00000000000000000000000000000000ffffffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002442966c68000000000000000000000000000000000000000000000000000000000005c474000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000524dd46508f0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000ffffffffffffffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000000004c0000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000005020b0b1414000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000500000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000026000000000000000000000000000000000000000000000000000000000000002e0000000000000000000000000000000000000000000000000000000000000036000000000000000000000000000000000000000000000000000000000000003c000000000000000000000000000000000000000000000000000000000000001a0000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc200000000000000000000000000000000000000000000000000000000000001f4000000000000000000000000000000000000000000000000000000000000003c0000000000000000000000000000000000000000000000000000000000000000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcf29800000000000000000000000000000000000000000000000000000000000493e000000000000000000000000000000000000000000000000000000000000186a000000000000000000000000000000000000000000000000000000000000190c60000000000000000000000000000000000000000000000000000000000019041000000000000000000000000aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa00000000000000000000000000000000000000000000000000000000", "value": "0" + }, + "_MIGRATE_V3RANGE0_TO_V4INRANGE": { + "calldata": "0x3593564c000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000ffffffffffffffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000000000061212120302140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001a0000000000000000000000000000000000000000000000000000000000000026000000000000000000000000000000000000000000000000000000000000002c000000000000000000000000000000000000000000000000000000000000004a0000000000000000000000000000000000000000000000000000000000000052000000000000000000000000000000000000000000000000000000000000000a40c49ccbe000000000000000000000000000000000000000000000000000000000005c474000000000000000000000000000000000000000000000000000041e3ddf4e17e0000000000000000000000000000000000000000000000000000000091c946820000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000084fc6f7865000000000000000000000000000000000000000000000000000000000005c4740000000000000000000000002e234dae75c793f67a35089c9d99245e1c58470b00000000000000000000000000000000ffffffffffffffffffffffffffffffff00000000000000000000000000000000ffffffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002442966c68000000000000000000000000000000000000000000000000000000000005c4740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001c000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000006000000000000000000000000066a9893cc07d91d95644aedd05d03f95e1dba8af000000000000000000000000000000000000000000000000000002ba7def30000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000000000000000000000000036f72d36bdbb6d479f000000000000000000000000000000000000000000000000000002ba7def300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000041ee4cbb988f06c10e4035f0a0d37a3a893b66f5c9fed530f09010ff0d642106f84ea9eeba8af1c9f15d63b99e13802f89ae511140ac6a5092507d7dcee850771e1c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000002e234dae75c793f67a35089c9d99245e1c58470b000000000000000000000000000000000000000000000036f72d36bdbb6d479f0000000000000000000000000000000000000000000000000000000000000524dd46508f0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000ffffffffffffffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000000004c0000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000005020b0b1414000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000500000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000026000000000000000000000000000000000000000000000000000000000000002e0000000000000000000000000000000000000000000000000000000000000036000000000000000000000000000000000000000000000000000000000000003c000000000000000000000000000000000000000000000000000000000000001a0000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000000000000000000000000000000000000000000bb8000000000000000000000000000000000000000000000000000000000000003c0000000000000000000000000000000000000000000000000000000000000000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcf29800000000000000000000000000000000000000000000000000000000000493e000000000000000000000000000000000000000000000000000000000000186a000000000000000000000000000000000000000000000000000000000000190c60000000000000000000000000000000000000000000000000000000000019041000000000000000000000000aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa00000000000000000000000000000000000000000000000000000000", + "value": "0" + }, + "_MIGRATE_V3RANGE0_TO_V4RANGE1": { + "calldata": "0x3593564c000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000ffffffffffffffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000000000061212120302140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001a0000000000000000000000000000000000000000000000000000000000000026000000000000000000000000000000000000000000000000000000000000002c000000000000000000000000000000000000000000000000000000000000004a0000000000000000000000000000000000000000000000000000000000000052000000000000000000000000000000000000000000000000000000000000000a40c49ccbe000000000000000000000000000000000000000000000000000000000005c474000000000000000000000000000000000000000000000000000041e3ddf4e17e0000000000000000000000000000000000000000000000000000000091c946820000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000084fc6f7865000000000000000000000000000000000000000000000000000000000005c4740000000000000000000000002e234dae75c793f67a35089c9d99245e1c58470b00000000000000000000000000000000ffffffffffffffffffffffffffffffff00000000000000000000000000000000ffffffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002442966c68000000000000000000000000000000000000000000000000000000000005c4740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001c000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000006000000000000000000000000066a9893cc07d91d95644aedd05d03f95e1dba8af000000000000000000000000000000000000000000000000000002ba7def30000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000000000000000000000000036f72d36bdbb6d479f000000000000000000000000000000000000000000000000000002ba7def300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000041ee4cbb988f06c10e4035f0a0d37a3a893b66f5c9fed530f09010ff0d642106f84ea9eeba8af1c9f15d63b99e13802f89ae511140ac6a5092507d7dcee850771e1c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000002e234dae75c793f67a35089c9d99245e1c58470b000000000000000000000000000000000000000000000036f72d36bdbb6d479f0000000000000000000000000000000000000000000000000000000000000524dd46508f0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000ffffffffffffffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000000004c0000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000005020b0b1414000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000500000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000026000000000000000000000000000000000000000000000000000000000000002e0000000000000000000000000000000000000000000000000000000000000036000000000000000000000000000000000000000000000000000000000000003c000000000000000000000000000000000000000000000000000000000000001a0000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000000000000000000000000000000000000000000bb8000000000000000000000000000000000000000000000000000000000000003c0000000000000000000000000000000000000000000000000000000000000000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcf298ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc400000000000000000000000000000000000000000000000000000000000186a000000000000000000000000000000000000000000000000000000000000008fa0000000000000000000000000000000000000000000000000000000000018570000000000000000000000000aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa00000000000000000000000000000000000000000000000000000000", + "value": "0" + }, + "_MIGRATE_V3RANGE0_TO_V4RANGE0": { + "calldata": "0x3593564c000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000ffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000000000000000000000000000000412121214000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000001600000000000000000000000000000000000000000000000000000000000000220000000000000000000000000000000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000000a40c49ccbe000000000000000000000000000000000000000000000000000000000005c474000000000000000000000000000000000000000000000000000041e3ddf4e17e0000000000000000000000000000000000000000000000000000000091c946820000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000084fc6f7865000000000000000000000000000000000000000000000000000000000005c4740000000000000000000000002e234dae75c793f67a35089c9d99245e1c58470b00000000000000000000000000000000ffffffffffffffffffffffffffffffff00000000000000000000000000000000ffffffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002442966c68000000000000000000000000000000000000000000000000000000000005c474000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000524dd46508f0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000ffffffffffffffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000000004c0000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000005020b0b1414000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000500000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000026000000000000000000000000000000000000000000000000000000000000002e0000000000000000000000000000000000000000000000000000000000000036000000000000000000000000000000000000000000000000000000000000003c000000000000000000000000000000000000000000000000000000000000001a0000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000000000000000000000000000000000000000000bb8000000000000000000000000000000000000000000000000000000000000003c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003c00000000000000000000000000000000000000000000000000000000000493e000000000000000000000000000000000000000000000000000000000000186a00000000000000000000000000000000000000000000000000000000000018575000000000000000000000000000000000000000000000000000000000000087a000000000000000000000000aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa00000000000000000000000000000000000000000000000000000000", + "value": "0" + }, + "_MIGRATE_V3RANGE_USDC_TO_V4RANGE_ETH": { + "calldata": "0x3593564c000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000ffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000000000000000000000000000000412121214000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000001600000000000000000000000000000000000000000000000000000000000000220000000000000000000000000000000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000000a40c49ccbe000000000000000000000000000000000000000000000000000000000005c474000000000000000000000000000000000000000000000000000041e3ddf4e17e0000000000000000000000000000000000000000000000000000000091c946820000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000084fc6f7865000000000000000000000000000000000000000000000000000000000005c4740000000000000000000000002e234dae75c793f67a35089c9d99245e1c58470b00000000000000000000000000000000ffffffffffffffffffffffffffffffff00000000000000000000000000000000ffffffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002442966c68000000000000000000000000000000000000000000000000000000000005c474000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000524dd46508f0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000ffffffffffffffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000000004c0000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000005020b0b1414000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000500000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000026000000000000000000000000000000000000000000000000000000000000002e0000000000000000000000000000000000000000000000000000000000000036000000000000000000000000000000000000000000000000000000000000003c000000000000000000000000000000000000000000000000000000000000001a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000000000000000000000000000000000000000000bb8000000000000000000000000000000000000000000000000000000000000003c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003c00000000000000000000000000000000000000000000000000000000000493e000000000000000000000000000000000000000000000000000000000000186a00000000000000000000000000000000000000000000000000000000000018575000000000000000000000000000000000000000000000000000000000000087a000000000000000000000000aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa00000000000000000000000000000000000000000000000000000000", + "value": "9000000000000000000" + }, + "_MIGRATE_V3RANGE1_TO_V4INRANGE": { + "calldata": "0x3593564c000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000ffffffffffffffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000000000061212120302140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001a0000000000000000000000000000000000000000000000000000000000000026000000000000000000000000000000000000000000000000000000000000002c000000000000000000000000000000000000000000000000000000000000004a0000000000000000000000000000000000000000000000000000000000000052000000000000000000000000000000000000000000000000000000000000000a40c49ccbe000000000000000000000000000000000000000000000000000000000005c474000000000000000000000000000000000000000000000000000a8ed0ab90b1b500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000084fc6f7865000000000000000000000000000000000000000000000000000000000005c4740000000000000000000000002e234dae75c793f67a35089c9d99245e1c58470b00000000000000000000000000000000ffffffffffffffffffffffffffffffff00000000000000000000000000000000ffffffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002442966c68000000000000000000000000000000000000000000000000000000000005c4740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001c000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000006000000000000000000000000066a9893cc07d91d95644aedd05d03f95e1dba8af000000000000000000000000000000000000000000000000000002ba7def30000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000000000000000000000000036f72d36bdbb6d479f000000000000000000000000000000000000000000000000000002ba7def300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000041bd3b5b9f3c76ae75e6aa206958615ce5f15d44fb39f410240f0f1282e3ac186e04e2608796f36825e7b607cd500df62f3c063b8f8650b5bc365ce0d55e52bee71b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000002e234dae75c793f67a35089c9d99245e1c58470b000000000000000000000000000000000000000000000036f72d36bdbb6d479f0000000000000000000000000000000000000000000000000000000000000524dd46508f0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000ffffffffffffffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000000004c0000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000005020b0b1414000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000500000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000026000000000000000000000000000000000000000000000000000000000000002e0000000000000000000000000000000000000000000000000000000000000036000000000000000000000000000000000000000000000000000000000000003c000000000000000000000000000000000000000000000000000000000000001a0000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000000000000000000000000000000000000000000bb8000000000000000000000000000000000000000000000000000000000000003c0000000000000000000000000000000000000000000000000000000000000000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcf29800000000000000000000000000000000000000000000000000000000000493e000000000000000000000000000000000000000000000000000000000000186a000000000000000000000000000000000000000000000000000000000000190c60000000000000000000000000000000000000000000000000000000000019041000000000000000000000000aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa00000000000000000000000000000000000000000000000000000000", + "value": "0" + }, + "_MIGRATE_V3RANGE1_TO_V4RANGE0": { + "calldata": "0x3593564c000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000ffffffffffffffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000000000061212120302140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001a0000000000000000000000000000000000000000000000000000000000000026000000000000000000000000000000000000000000000000000000000000002c000000000000000000000000000000000000000000000000000000000000004a0000000000000000000000000000000000000000000000000000000000000052000000000000000000000000000000000000000000000000000000000000000a40c49ccbe000000000000000000000000000000000000000000000000000000000005c474000000000000000000000000000000000000000000000000000a8ed0ab90b1b500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000084fc6f7865000000000000000000000000000000000000000000000000000000000005c4740000000000000000000000002e234dae75c793f67a35089c9d99245e1c58470b00000000000000000000000000000000ffffffffffffffffffffffffffffffff00000000000000000000000000000000ffffffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002442966c68000000000000000000000000000000000000000000000000000000000005c4740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001c000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000006000000000000000000000000066a9893cc07d91d95644aedd05d03f95e1dba8af000000000000000000000000000000000000000000000000000002ba7def30000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000000000000000000000000036f72d36bdbb6d479f000000000000000000000000000000000000000000000000000002ba7def300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000041bd3b5b9f3c76ae75e6aa206958615ce5f15d44fb39f410240f0f1282e3ac186e04e2608796f36825e7b607cd500df62f3c063b8f8650b5bc365ce0d55e52bee71b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000002e234dae75c793f67a35089c9d99245e1c58470b000000000000000000000000000000000000000000000036f72d36bdbb6d479f0000000000000000000000000000000000000000000000000000000000000524dd46508f0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000ffffffffffffffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000000004c0000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000005020b0b1414000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000500000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000026000000000000000000000000000000000000000000000000000000000000002e0000000000000000000000000000000000000000000000000000000000000036000000000000000000000000000000000000000000000000000000000000003c000000000000000000000000000000000000000000000000000000000000001a0000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000000000000000000000000000000000000000000bb8000000000000000000000000000000000000000000000000000000000000003c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003c00000000000000000000000000000000000000000000000000000000000493e000000000000000000000000000000000000000000000000000000000000186a00000000000000000000000000000000000000000000000000000000000018575000000000000000000000000000000000000000000000000000000000000087a000000000000000000000000aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa00000000000000000000000000000000000000000000000000000000", + "value": "0" + }, + "_MIGRATE_V3RANGE1_TO_V4RANGE1": { + "calldata": "0x3593564c000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000ffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000000000000000000000000000000412121214000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000001600000000000000000000000000000000000000000000000000000000000000220000000000000000000000000000000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000000a40c49ccbe000000000000000000000000000000000000000000000000000000000005c474000000000000000000000000000000000000000000000000000a8ed0ab90b1b500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000084fc6f7865000000000000000000000000000000000000000000000000000000000005c4740000000000000000000000002e234dae75c793f67a35089c9d99245e1c58470b00000000000000000000000000000000ffffffffffffffffffffffffffffffff00000000000000000000000000000000ffffffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002442966c68000000000000000000000000000000000000000000000000000000000005c474000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000524dd46508f0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000ffffffffffffffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000000004c0000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000005020b0b1414000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000500000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000026000000000000000000000000000000000000000000000000000000000000002e0000000000000000000000000000000000000000000000000000000000000036000000000000000000000000000000000000000000000000000000000000003c000000000000000000000000000000000000000000000000000000000000001a0000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000000000000000000000000000000000000000000bb8000000000000000000000000000000000000000000000000000000000000003c0000000000000000000000000000000000000000000000000000000000000000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcf298ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc400000000000000000000000000000000000000000000000000000000000186a000000000000000000000000000000000000000000000000000000000000008fa0000000000000000000000000000000000000000000000000000000000018570000000000000000000000000aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa00000000000000000000000000000000000000000000000000000000", + "value": "0" + }, + "_MIGRATE_V3RANGE_WETH_TO_V4RANGE_ETH": { + "calldata": "0x3593564c000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000ffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000000000000000000000000000000412121214000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000001600000000000000000000000000000000000000000000000000000000000000220000000000000000000000000000000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000000a40c49ccbe000000000000000000000000000000000000000000000000000000000005c474000000000000000000000000000000000000000000000000000a8ed0ab90b1b5000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001e48d7d06965c9f000000000000000000000000ffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000084fc6f7865000000000000000000000000000000000000000000000000000000000005c4740000000000000000000000002e234dae75c793f67a35089c9d99245e1c58470b00000000000000000000000000000000ffffffffffffffffffffffffffffffff00000000000000000000000000000000ffffffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002442966c68000000000000000000000000000000000000000000000000000000000005c474000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000584dd46508f0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000ffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000000000000000000000000000052000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000602160b0b14140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000002c0000000000000000000000000000000000000000000000000000000000000034000000000000000000000000000000000000000000000000000000000000003c0000000000000000000000000000000000000000000000000000000000000042000000000000000000000000000000000000000000000000000000000000001a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000000000000000000000000000000000000000000bb8000000000000000000000000000000000000000000000000000000000000003c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003c00000000000000000000000000000000000000000000000000000000000493e000000000000000000000000000000000000000000000000000000000000186a00000000000000000000000000000000000000000000000000000000000018575000000000000000000000000000000000000000000000000000000000000087a000000000000000000000000aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa00000000000000000000000000000000000000000000000000000000", + "value": "0" } } diff --git a/sdks/universal-router-sdk/test/forge/utils/DeployRouter.sol b/sdks/universal-router-sdk/test/forge/utils/DeployRouter.sol index 55398f7cd..d09517433 100644 --- a/sdks/universal-router-sdk/test/forge/utils/DeployRouter.sol +++ b/sdks/universal-router-sdk/test/forge/utils/DeployRouter.sol @@ -146,9 +146,15 @@ contract DeployRouter is Test { } } - function mintV3Position(address token0, address token1, uint24 fee, uint256 amount0Desired, uint256 amount1Desired) - public - { + function mintV3Position( + address token0, + address token1, + uint24 fee, + uint256 amount0Desired, + uint256 amount1Desired, + int24 tickLower, + int24 tickUpper + ) public { if (token0 >= token1) revert InvalidTokenOrder(); deal(token0, from, 2 * amount0Desired); @@ -163,8 +169,8 @@ contract DeployRouter is Test { token0: token0, token1: token1, fee: fee, - tickLower: 200040, - tickUpper: 300000, + tickLower: tickLower, + tickUpper: tickUpper, amount0Desired: amount0Desired, amount1Desired: amount1Desired, amount0Min: 0, diff --git a/sdks/universal-router-sdk/test/uniswapTrades.test.ts b/sdks/universal-router-sdk/test/uniswapTrades.test.ts index a039677f6..ac541cfe6 100644 --- a/sdks/universal-router-sdk/test/uniswapTrades.test.ts +++ b/sdks/universal-router-sdk/test/uniswapTrades.test.ts @@ -1,4 +1,4 @@ -import { expect } from 'chai' +import { expect, use } from 'chai' import JSBI from 'jsbi' import { BigNumber, ethers, utils, Wallet, Signature } from 'ethers' import { expandTo18Decimals } from '../src/utils/numbers' @@ -17,8 +17,21 @@ import { FeeAmount, NonfungiblePositionManager, } from '@uniswap/v3-sdk' -import { Pool as V4Pool, Route as V4Route, Trade as V4Trade, Position as V4Position } from '@uniswap/v4-sdk' -import { generatePermitSignature, toInputPermit, makePermit, generateEip2098PermitSignature } from './utils/permit2' +import { + Pool as V4Pool, + Route as V4Route, + Trade as V4Trade, + Position as V4Position, + V4PositionManager, +} from '@uniswap/v4-sdk' +import { + generatePermitSignature, + generatePermitSignatureFromBatch, + toInputPermit, + makePermit, + makePermitBatch, + generateEip2098PermitSignature, +} from './utils/permit2' import { CHAIN_TO_ADDRESSES_MAP, ChainId, @@ -1830,6 +1843,7 @@ describe('Uniswap', () => { // create migrate options const opts = Object.assign({ + // in range (current tick = 205265) inputPosition: new Position({ pool: WETH_USDC_V3, liquidity: 72249373570746, @@ -1929,6 +1943,7 @@ describe('Uniswap', () => { v4AddLiquidityOptions: { deadline: MAX_UINT160, migrate: true, + // no need to transfer any additional currency because v3 position is in range so both currencies are sent to pool and unused currency is swept slippageTolerance: new Percent(5, 100), recipient: TEST_RECIPIENT_ADDRESS, }, @@ -1940,6 +1955,7 @@ describe('Uniswap', () => { it('encodes a migration from erc20 to eth if no v3 permit', async () => { const opts = Object.assign({ + // in range (current tick = 205265) inputPosition: new Position({ pool: WETH_USDC_V3, liquidity: 72249373570746, @@ -2008,6 +2024,7 @@ describe('Uniswap', () => { v4AddLiquidityOptions: { deadline: MAX_UINT160, migrate: true, + // no need to transfer any additional currency because v3 position is in range so both currencies are sent to pool and unused currency is swept slippageTolerance: new Percent(5, 100), recipient: TEST_RECIPIENT_ADDRESS, }, @@ -2036,6 +2053,7 @@ describe('Uniswap', () => { // create migrate options const opts = Object.assign({ + // in range (current tick = 205265) inputPosition: new Position({ pool: WETH_USDC_V3, liquidity: 72249373570746, @@ -2136,6 +2154,7 @@ describe('Uniswap', () => { v4AddLiquidityOptions: { deadline: MAX_UINT160, migrate: true, + // no need to transfer any additional currency because v3 position is in range so both currencies are sent to pool and unused currency is swept slippageTolerance: new Percent(5, 100), recipient: TEST_RECIPIENT_ADDRESS, createPool: true, // boolean to signal pool creation @@ -2146,6 +2165,383 @@ describe('Uniswap', () => { expect(hexToDecimalString(methodParameters.value)).to.eq('0') }) + it('encodes a migration from out of range v3 in token0 to in range v4', async () => { + const permit = makePermitBatch( + WETH.address, + '1013935132270157186975', + undefined, + UNIVERSAL_ROUTER_ADDRESS(UniversalRouterVersion.V2_0, 1) + ) + const signature = await generatePermitSignatureFromBatch(permit, wallet, WETH_USDC_V3.chainId, PERMIT2_ADDRESS) + const opts = Object.assign({ + // above range (current tick = 205265) + inputPosition: new Position({ + pool: WETH_USDC_V3, + liquidity: 72446937194878, + tickLower: 205320, + tickUpper: 300000, + }), + // in range (current tick = 0) + outputPosition: new V4Position({ + pool: WETH_USDC_V4, + liquidity: 100000, + tickLower: -200040, + tickUpper: 300000, + }), + v3RemoveLiquidityOptions: { + tokenId: 377972, + liquidityPercentage: new Percent(100, 100), + slippageTolerance: new Percent(5, 100), + deadline: MAX_UINT160, + burnToken: true, + collectOptions: { + expectedCurrencyOwed0: CurrencyAmount.fromRawAmount(USDC, 0), + expectedCurrencyOwed1: CurrencyAmount.fromRawAmount(WETH, 0), + recipient: FORGE_V4_POSITION_MANAGER, + }, + }, + v4AddLiquidityOptions: { + deadline: MAX_UINT160, + migrate: true, + currencyAmount: { + inputCurrency: WETH, + inputAmount: '1013935132270157186975', + }, + slippageTolerance: new Percent(5, 100), + recipient: TEST_RECIPIENT_ADDRESS, + batchPermit: { permitBatch: permit, signature: signature }, + }, + }) + const methodParameters = SwapRouter.migrateV3ToV4CallParameters(opts, FORGE_V4_POSITION_MANAGER) + registerFixture('_MIGRATE_V3RANGE0_TO_V4INRANGE', methodParameters) + expect(hexToDecimalString(methodParameters.value)).to.eq('0') + }) + + it('encodes a migration from out of range v3 in token0 to out of range v4 in token1', async () => { + const permit = makePermitBatch( + WETH.address, + '1013935132270157186975', + undefined, + UNIVERSAL_ROUTER_ADDRESS(UniversalRouterVersion.V2_0, 1) + ) + const signature = await generatePermitSignatureFromBatch(permit, wallet, WETH_USDC_V3.chainId, PERMIT2_ADDRESS) + const opts = Object.assign({ + // above range (current tick = 205265) + inputPosition: new Position({ + pool: WETH_USDC_V3, + liquidity: 72446937194878, + tickLower: 205320, + tickUpper: 300000, + }), + // below range (current tick = 0) + outputPosition: new V4Position({ + pool: WETH_USDC_V4, + liquidity: 100000, + tickLower: -200040, + tickUpper: -60, + }), + v3RemoveLiquidityOptions: { + tokenId: 377972, + liquidityPercentage: new Percent(100, 100), + slippageTolerance: new Percent(5, 100), + deadline: MAX_UINT160, + burnToken: true, + collectOptions: { + expectedCurrencyOwed0: CurrencyAmount.fromRawAmount(USDC, 0), + expectedCurrencyOwed1: CurrencyAmount.fromRawAmount(WETH, 0), + recipient: FORGE_V4_POSITION_MANAGER, + }, + }, + v4AddLiquidityOptions: { + deadline: MAX_UINT160, + migrate: true, + currencyAmount: { + inputCurrency: WETH, + inputAmount: '1013935132270157186975', + }, + slippageTolerance: new Percent(5, 100), + recipient: TEST_RECIPIENT_ADDRESS, + batchPermit: { permitBatch: permit, signature: signature }, + }, + }) + const methodParameters = SwapRouter.migrateV3ToV4CallParameters(opts, FORGE_V4_POSITION_MANAGER) + registerFixture('_MIGRATE_V3RANGE0_TO_V4RANGE1', methodParameters) + expect(hexToDecimalString(methodParameters.value)).to.eq('0') + }) + + it('encodes a migration from out of range v3 in token0 to out of range v4 in token0', async () => { + const opts = Object.assign({ + // above range (current tick = 205265) + inputPosition: new Position({ + pool: WETH_USDC_V3, + liquidity: 72446937194878, + tickLower: 205320, + tickUpper: 300000, + }), + // above range (current tick = 0) + outputPosition: new V4Position({ + pool: WETH_USDC_V4, + liquidity: 100000, + tickLower: 60, + tickUpper: 300000, + }), + v3RemoveLiquidityOptions: { + tokenId: 377972, + liquidityPercentage: new Percent(100, 100), + slippageTolerance: new Percent(5, 100), + deadline: MAX_UINT160, + burnToken: true, + collectOptions: { + expectedCurrencyOwed0: CurrencyAmount.fromRawAmount(USDC, 0), + expectedCurrencyOwed1: CurrencyAmount.fromRawAmount(WETH, 0), + recipient: FORGE_V4_POSITION_MANAGER, + }, + }, + v4AddLiquidityOptions: { + deadline: MAX_UINT160, + migrate: true, + // no need to transfer any additional currency because both positions are out of range on same side + slippageTolerance: new Percent(5, 100), + recipient: TEST_RECIPIENT_ADDRESS, + }, + }) + const methodParameters = SwapRouter.migrateV3ToV4CallParameters(opts, FORGE_V4_POSITION_MANAGER) + registerFixture('_MIGRATE_V3RANGE0_TO_V4RANGE0', methodParameters) + expect(hexToDecimalString(methodParameters.value)).to.eq('0') + }) + + it('encodes a migration from out of range v3 in usdc to out of range v4 in eth', async () => { + const opts = Object.assign({ + // above range (current tick = 205265) + inputPosition: new Position({ + pool: WETH_USDC_V3, + liquidity: 72446937194878, + tickLower: 205320, + tickUpper: 300000, + }), + // above range (current tick = 0) + outputPosition: new V4Position({ + pool: ETH_USDC_V4, + liquidity: 100000, + tickLower: 60, + tickUpper: 300000, + }), + v3RemoveLiquidityOptions: { + tokenId: 377972, + liquidityPercentage: new Percent(100, 100), + slippageTolerance: new Percent(5, 100), + deadline: MAX_UINT160, + burnToken: true, + collectOptions: { + expectedCurrencyOwed0: CurrencyAmount.fromRawAmount(USDC, 0), + expectedCurrencyOwed1: CurrencyAmount.fromRawAmount(WETH, 0), + recipient: FORGE_V4_POSITION_MANAGER, + }, + }, + v4AddLiquidityOptions: { + deadline: MAX_UINT160, + migrate: true, + currencyAmount: { + inputCurrency: ETHER, + inputAmount: '9000000000000000000', + }, + slippageTolerance: new Percent(5, 100), + recipient: TEST_RECIPIENT_ADDRESS, + useNative: ETHER, + }, + }) + const methodParameters = SwapRouter.migrateV3ToV4CallParameters(opts, FORGE_V4_POSITION_MANAGER) + registerFixture('_MIGRATE_V3RANGE_USDC_TO_V4RANGE_ETH', methodParameters) + expect(hexToDecimalString(methodParameters.value)).to.eq(opts.v4AddLiquidityOptions.currencyAmount.inputAmount) + }) + + it('encodes a migration from out of range v3 in token1 to in range v4', async () => { + const permit = makePermitBatch( + USDC.address, + '1013935132270157186975', + undefined, + UNIVERSAL_ROUTER_ADDRESS(UniversalRouterVersion.V2_0, 1) + ) + const signature = await generatePermitSignatureFromBatch(permit, wallet, WETH_USDC_V3.chainId, PERMIT2_ADDRESS) + const opts = Object.assign({ + // below range (current tick = 205265) + inputPosition: new Position({ + pool: WETH_USDC_V3, + liquidity: 2971776649834933, + tickLower: 204720, + tickUpper: 204960, + }), + // in range (current tick = 0) + outputPosition: new V4Position({ + pool: WETH_USDC_V4, + liquidity: 100000, + tickLower: -200040, + tickUpper: 300000, + }), + v3RemoveLiquidityOptions: { + tokenId: 377972, + liquidityPercentage: new Percent(100, 100), + slippageTolerance: new Percent(10, 100), + deadline: MAX_UINT160, + burnToken: true, + collectOptions: { + expectedCurrencyOwed0: CurrencyAmount.fromRawAmount(USDC, 0), + expectedCurrencyOwed1: CurrencyAmount.fromRawAmount(WETH, 0), + recipient: FORGE_V4_POSITION_MANAGER, + }, + }, + v4AddLiquidityOptions: { + deadline: MAX_UINT160, + migrate: true, + currencyAmount: { + inputCurrency: USDC, + inputAmount: '1013935132270157186975', + }, + slippageTolerance: new Percent(5, 100), + recipient: TEST_RECIPIENT_ADDRESS, + batchPermit: { permitBatch: permit, signature: signature }, + }, + }) + const methodParameters = SwapRouter.migrateV3ToV4CallParameters(opts, FORGE_V4_POSITION_MANAGER) + registerFixture('_MIGRATE_V3RANGE1_TO_V4INRANGE', methodParameters) + expect(hexToDecimalString(methodParameters.value)).to.eq('0') + }) + + it('encodes a migration from out of range v3 in token1 to out of range v4 in token0', async () => { + const permit = makePermitBatch( + USDC.address, + '1013935132270157186975', + undefined, + UNIVERSAL_ROUTER_ADDRESS(UniversalRouterVersion.V2_0, 1) + ) + const signature = await generatePermitSignatureFromBatch(permit, wallet, WETH_USDC_V3.chainId, PERMIT2_ADDRESS) + const opts = Object.assign({ + // below range (current tick = 205265) + inputPosition: new Position({ + pool: WETH_USDC_V3, + liquidity: 2971776649834933, + tickLower: 204720, + tickUpper: 204960, + }), + // above range (current tick = 0) + outputPosition: new V4Position({ + pool: WETH_USDC_V4, + liquidity: 100000, + tickLower: 60, + tickUpper: 300000, + }), + v3RemoveLiquidityOptions: { + tokenId: 377972, + liquidityPercentage: new Percent(100, 100), + slippageTolerance: new Percent(10, 100), + deadline: MAX_UINT160, + burnToken: true, + collectOptions: { + expectedCurrencyOwed0: CurrencyAmount.fromRawAmount(USDC, 0), + expectedCurrencyOwed1: CurrencyAmount.fromRawAmount(WETH, 0), + recipient: FORGE_V4_POSITION_MANAGER, + }, + }, + v4AddLiquidityOptions: { + deadline: MAX_UINT160, + migrate: true, + currencyAmount: { + inputCurrency: USDC, + inputAmount: '1013935132270157186975', + }, + slippageTolerance: new Percent(5, 100), + recipient: TEST_RECIPIENT_ADDRESS, + batchPermit: { permitBatch: permit, signature: signature }, + }, + }) + const methodParameters = SwapRouter.migrateV3ToV4CallParameters(opts, FORGE_V4_POSITION_MANAGER) + registerFixture('_MIGRATE_V3RANGE1_TO_V4RANGE0', methodParameters) + expect(hexToDecimalString(methodParameters.value)).to.eq('0') + }) + + it('encodes a migration from out of range v3 in token1 to out of range v4 in token1', async () => { + const opts = Object.assign({ + // below range (current tick = 205265) + inputPosition: new Position({ + pool: WETH_USDC_V3, + liquidity: 2971776649834933, + tickLower: 204720, + tickUpper: 204960, + }), + // below range (current tick = 0) + outputPosition: new V4Position({ + pool: WETH_USDC_V4, + liquidity: 100000, + tickLower: -200040, + tickUpper: -60, + }), + v3RemoveLiquidityOptions: { + tokenId: 377972, + liquidityPercentage: new Percent(100, 100), + slippageTolerance: new Percent(10, 100), + deadline: MAX_UINT160, + burnToken: true, + collectOptions: { + expectedCurrencyOwed0: CurrencyAmount.fromRawAmount(USDC, 0), + expectedCurrencyOwed1: CurrencyAmount.fromRawAmount(WETH, 0), + recipient: FORGE_V4_POSITION_MANAGER, + }, + }, + v4AddLiquidityOptions: { + deadline: MAX_UINT160, + migrate: true, + // no need to transfer any additional currency because both positions are out of range on the same side + slippageTolerance: new Percent(5, 100), + recipient: TEST_RECIPIENT_ADDRESS, + }, + }) + const methodParameters = SwapRouter.migrateV3ToV4CallParameters(opts, FORGE_V4_POSITION_MANAGER) + registerFixture('_MIGRATE_V3RANGE1_TO_V4RANGE1', methodParameters) + expect(hexToDecimalString(methodParameters.value)).to.eq('0') + }) + + it('encodes a migration from out of range v3 in weth to out of range v4 in eth', async () => { + const opts = Object.assign({ + // below range (current tick = 205265) + inputPosition: new Position({ + pool: WETH_USDC_V3, + liquidity: 2971776649834933, + tickLower: 204720, + tickUpper: 204960, + }), + // above range (current tick = 0); eth is now currency0 + outputPosition: new V4Position({ + pool: ETH_USDC_V4, + liquidity: 100000, + tickLower: 60, + tickUpper: 300000, + }), + v3RemoveLiquidityOptions: { + tokenId: 377972, + liquidityPercentage: new Percent(100, 100), + slippageTolerance: new Percent(5, 100), + deadline: MAX_UINT160, + burnToken: true, + collectOptions: { + expectedCurrencyOwed0: CurrencyAmount.fromRawAmount(USDC, 0), + expectedCurrencyOwed1: CurrencyAmount.fromRawAmount(WETH, 0), + recipient: FORGE_V4_POSITION_MANAGER, + }, + }, + v4AddLiquidityOptions: { + deadline: MAX_UINT160, + migrate: true, + // no need to transfer any additional currency because both positions are out of range on same side + slippageTolerance: new Percent(5, 100), + recipient: TEST_RECIPIENT_ADDRESS, + useNative: ETHER, + }, + }) + const methodParameters = SwapRouter.migrateV3ToV4CallParameters(opts, FORGE_V4_POSITION_MANAGER) + registerFixture('_MIGRATE_V3RANGE_WETH_TO_V4RANGE_ETH', methodParameters) + expect(hexToDecimalString(methodParameters.value)).to.eq('0') + }) + it('throws if token0s are different', async () => { const opts = Object.assign({ inputPosition: new Position({ @@ -2174,7 +2570,7 @@ describe('Uniswap', () => { }, v4AddLiquidityOptions: { deadline: 1, - mirgate: true, + migrateOptions: { migrate: true }, slippageTolerance: new Percent(5, 100), recipient: TEST_RECIPIENT_ADDRESS, }, @@ -2219,7 +2615,7 @@ describe('Uniswap', () => { }, v4AddLiquidityOptions: { deadline: 1, - mirgate: true, + migrateOptions: { migrate: true }, slippageTolerance: new Percent(5, 100), recipient: TEST_RECIPIENT_ADDRESS, }, @@ -2255,7 +2651,7 @@ describe('Uniswap', () => { }, v4AddLiquidityOptions: { deadline: 1, - mirgate: true, + migrateOptions: { migrate: true }, slippageTolerance: new Percent(5, 100), recipient: TEST_RECIPIENT_ADDRESS, }, @@ -2290,7 +2686,7 @@ describe('Uniswap', () => { }, v4AddLiquidityOptions: { deadline: 1, - mirgate: true, + migrateOptions: { migrate: true }, slippageTolerance: new Percent(5, 100), recipient: TEST_RECIPIENT_ADDRESS, }, @@ -2298,19 +2694,19 @@ describe('Uniswap', () => { expect(() => SwapRouter.migrateV3ToV4CallParameters(opts)).to.throw('BURN_TOKEN_REQUIRED') }) - it('throws if not minting when migrating', async () => { + it('throws if migrating weth to eth with token mismatch', async () => { const opts = Object.assign({ inputPosition: new Position({ - pool: USDC_DAI_V3, + pool: WETH_USDC_V3, liquidity: 1, - tickLower: -USDC_DAI_V3.tickSpacing, - tickUpper: USDC_DAI_V3.tickSpacing, + tickLower: -WETH_USDC_V3.tickSpacing, + tickUpper: WETH_USDC_V3.tickSpacing, }), outputPosition: new V4Position({ - pool: USDC_DAI_V4, + pool: ETH_DAI_V4, liquidity: 1, - tickLower: -USDC_DAI_V4.tickSpacing, - tickUpper: USDC_DAI_V4.tickSpacing, + tickLower: -ETH_DAI_V4.tickSpacing, + tickUpper: ETH_DAI_V4.tickSpacing, }), v3RemoveLiquidityOptions: { tokenId: 1, @@ -2325,28 +2721,30 @@ describe('Uniswap', () => { }, }, v4AddLiquidityOptions: { - migrate: true, + migrateOptions: { migrate: true }, deadline: 1, slippageTolerance: new Percent(5, 100), sqrtPriceX96: encodeSqrtRatioX96(1, 1), + useNative: ETHER, + recipient: TEST_RECIPIENT_ADDRESS, }, }) - expect(() => SwapRouter.migrateV3ToV4CallParameters(opts)).to.throw('MINT_REQUIRED') + expect(() => SwapRouter.migrateV3ToV4CallParameters(opts)).to.throw('TOKEN_MISMATCH') }) - it('throws if migrating weth to eth with token mismatch', async () => { + it('throws if migrating flag not set', async () => { const opts = Object.assign({ inputPosition: new Position({ - pool: WETH_USDC_V3, + pool: USDC_DAI_V3, liquidity: 1, - tickLower: -WETH_USDC_V3.tickSpacing, - tickUpper: WETH_USDC_V3.tickSpacing, + tickLower: -USDC_DAI_V3.tickSpacing, + tickUpper: USDC_DAI_V3.tickSpacing, }), outputPosition: new V4Position({ - pool: ETH_DAI_V4, + pool: USDC_DAI_V4, liquidity: 1, - tickLower: -ETH_DAI_V4.tickSpacing, - tickUpper: ETH_DAI_V4.tickSpacing, + tickLower: -USDC_DAI_V4.tickSpacing, + tickUpper: USDC_DAI_V4.tickSpacing, }), v3RemoveLiquidityOptions: { tokenId: 1, @@ -2361,30 +2759,28 @@ describe('Uniswap', () => { }, }, v4AddLiquidityOptions: { - migrate: true, deadline: 1, + // no migrateOptions flag slippageTolerance: new Percent(5, 100), - sqrtPriceX96: encodeSqrtRatioX96(1, 1), - useNative: ETHER, recipient: TEST_RECIPIENT_ADDRESS, }, }) - expect(() => SwapRouter.migrateV3ToV4CallParameters(opts)).to.throw('TOKEN_MISMATCH') + expect(() => SwapRouter.migrateV3ToV4CallParameters(opts)).to.throw('MIGRATE_REQUIRED') }) - it('throws if migrating flag not set', async () => { + it('throws if migrate flag not set', async () => { const opts = Object.assign({ inputPosition: new Position({ - pool: USDC_DAI_V3, + pool: WETH_USDC_V3, liquidity: 1, - tickLower: -USDC_DAI_V3.tickSpacing, - tickUpper: USDC_DAI_V3.tickSpacing, + tickLower: -WETH_USDC_V3.tickSpacing, + tickUpper: WETH_USDC_V3.tickSpacing, }), outputPosition: new V4Position({ - pool: USDC_DAI_V4, + pool: WETH_USDC_V4, liquidity: 1, - tickLower: -USDC_DAI_V4.tickSpacing, - tickUpper: USDC_DAI_V4.tickSpacing, + tickLower: -WETH_USDC_V4.tickSpacing, + tickUpper: WETH_USDC_V4.tickSpacing, }), v3RemoveLiquidityOptions: { tokenId: 1, @@ -2400,7 +2796,7 @@ describe('Uniswap', () => { }, v4AddLiquidityOptions: { deadline: 1, - migrate: false, + migrateOptions: { migrate: false }, slippageTolerance: new Percent(5, 100), recipient: TEST_RECIPIENT_ADDRESS, }, @@ -2408,7 +2804,7 @@ describe('Uniswap', () => { expect(() => SwapRouter.migrateV3ToV4CallParameters(opts)).to.throw('MIGRATE_REQUIRED') }) - it('throws if not permitting the Universal router', async () => { + it('throws if not permitting the Universal router when burning v3 position', async () => { const opts = Object.assign({ inputPosition: new Position({ pool: USDC_DAI_V3, @@ -2438,7 +2834,7 @@ describe('Uniswap', () => { r: '0x0000000000000000000000000000000000000000000000000000000000000001', s: '0x0000000000000000000000000000000000000000000000000000000000000002', deadline: 1, - spender: TEST_RECIPIENT_ADDRESS, + spender: TEST_RECIPIENT_ADDRESS, // not the universal router }, }, v4AddLiquidityOptions: { @@ -2450,5 +2846,50 @@ describe('Uniswap', () => { }) expect(() => SwapRouter.migrateV3ToV4CallParameters(opts)).to.throw('INVALID_SPENDER') }) + + it('throws if migrating out of range and not permitting the universal router', async () => { + const permit = makePermitBatch(USDC.address, '1013935132270157186975', undefined, TEST_RECIPIENT_ADDRESS) + const signature = await generatePermitSignatureFromBatch(permit, wallet, WETH_USDC_V3.chainId, PERMIT2_ADDRESS) + const opts = Object.assign({ + // below range (current tick = 205265) + inputPosition: new Position({ + pool: WETH_USDC_V3, + liquidity: 2971776649834933, + tickLower: 204720, + tickUpper: 204960, + }), + // above range (current tick = 0) + outputPosition: new V4Position({ + pool: WETH_USDC_V4, + liquidity: 100000, + tickLower: 60, + tickUpper: 300000, + }), + v3RemoveLiquidityOptions: { + tokenId: 377972, + liquidityPercentage: new Percent(100, 100), + slippageTolerance: new Percent(10, 100), + deadline: MAX_UINT160, + burnToken: true, + collectOptions: { + expectedCurrencyOwed0: CurrencyAmount.fromRawAmount(USDC, 0), + expectedCurrencyOwed1: CurrencyAmount.fromRawAmount(WETH, 0), + recipient: CHAIN_TO_ADDRESSES_MAP[ChainId.MAINNET].v4PositionManagerAddress, + }, + }, + v4AddLiquidityOptions: { + deadline: MAX_UINT160, + migrate: true, + currencyAmount: { + inputCurrency: USDC, + inputAmount: '1013935132270157186975', + }, + slippageTolerance: new Percent(5, 100), + recipient: TEST_RECIPIENT_ADDRESS, + batchPermit: { permitBatch: permit, signature: signature }, + }, + }) + expect(() => SwapRouter.migrateV3ToV4CallParameters(opts)).to.throw('INVALID_SPENDER') + }) }) }) diff --git a/sdks/universal-router-sdk/test/utils/permit2.ts b/sdks/universal-router-sdk/test/utils/permit2.ts index 0bf0aff59..e4c593c3b 100644 --- a/sdks/universal-router-sdk/test/utils/permit2.ts +++ b/sdks/universal-router-sdk/test/utils/permit2.ts @@ -1,5 +1,5 @@ import { ethers, Wallet } from 'ethers' -import { AllowanceTransfer, PermitSingle } from '@uniswap/permit2-sdk' +import { AllowanceTransfer, PermitSingle, PermitBatch } from '@uniswap/permit2-sdk' import { Permit2Permit } from '../../src/utils/inputTokens' import { PERMIT2_ADDRESS } from './addresses' import { MAX_UINT160, UNIVERSAL_ROUTER_ADDRESS, UniversalRouterVersion } from '../../src/utils/constants' @@ -17,6 +17,16 @@ export async function generatePermitSignature( return await signer._signTypedData(domain, types, values) } +export async function generatePermitSignatureFromBatch( + permit: PermitBatch, + signer: Wallet, + chainId: number, + permitAddress: string = PERMIT2_ADDRESS +): Promise { + const { domain, types, values } = AllowanceTransfer.getPermitData(permit, permitAddress, chainId) + return await signer._signTypedData(domain, types, values) +} + export async function generateEip2098PermitSignature( permit: PermitSingle, signer: Wallet, @@ -52,3 +62,23 @@ export function makePermit( sigDeadline: TEST_DEADLINE, } } + +export function makePermitBatch( + token: string, + amount: string = MAX_UINT160.toString(), + nonce: string = '0', + routerAddress: string = UNIVERSAL_ROUTER_ADDRESS(UniversalRouterVersion.V2_0, 1) +): PermitBatch { + return { + details: [ + { + token, + amount, + expiration: TEST_DEADLINE, + nonce, + }, + ], + spender: routerAddress, + sigDeadline: TEST_DEADLINE, + } +}