@uniswap/universal-router-sdk 4.19.4 → 4.19.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/universal-router-sdk.cjs.development.js +3 -3
- package/dist/universal-router-sdk.cjs.development.js.map +1 -1
- package/dist/universal-router-sdk.cjs.production.min.js +1 -1
- package/dist/universal-router-sdk.cjs.production.min.js.map +1 -1
- package/dist/universal-router-sdk.esm.js +3 -3
- package/dist/universal-router-sdk.esm.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"universal-router-sdk.cjs.production.min.js","sources":["../src/utils/routerCommands.ts","../src/entities/Command.ts","../src/utils/constants.ts","../src/utils/pathCurrency.ts","../src/utils/getCurrencyAddress.ts","../src/entities/actions/uniswap.ts","../src/utils/numbers.ts","../src/utils/inputTokens.ts","../src/swapRouter.ts","../src/utils/routerTradeAdapter.ts","../src/entities/actions/unwrapWETH.ts","../src/utils/commandParser.ts"],"sourcesContent":["import { defaultAbiCoder } from 'ethers/lib/utils'\n\n/**\n * CommandTypes\n * @description Flags that modify a command's execution\n * @enum {number}\n */\nexport enum CommandType {\n V3_SWAP_EXACT_IN = 0x00,\n V3_SWAP_EXACT_OUT = 0x01,\n PERMIT2_TRANSFER_FROM = 0x02,\n PERMIT2_PERMIT_BATCH = 0x03,\n SWEEP = 0x04,\n TRANSFER = 0x05,\n PAY_PORTION = 0x06,\n\n V2_SWAP_EXACT_IN = 0x08,\n V2_SWAP_EXACT_OUT = 0x09,\n PERMIT2_PERMIT = 0x0a,\n WRAP_ETH = 0x0b,\n UNWRAP_WETH = 0x0c,\n PERMIT2_TRANSFER_FROM_BATCH = 0x0d,\n BALANCE_CHECK_ERC20 = 0x0e,\n\n V4_SWAP = 0x10,\n V3_POSITION_MANAGER_PERMIT = 0x11,\n V3_POSITION_MANAGER_CALL = 0x12,\n V4_INITIALIZE_POOL = 0x13,\n V4_POSITION_MANAGER_CALL = 0x14,\n\n EXECUTE_SUB_PLAN = 0x21,\n}\n\nexport enum Subparser {\n V3PathExactIn,\n V3PathExactOut,\n}\n\nexport enum Parser {\n Abi,\n V4Actions,\n V3Actions,\n}\n\nexport type ParamType = {\n readonly name: string\n readonly type: string\n readonly subparser?: Subparser\n}\n\nexport type CommandDefinition =\n | {\n parser: Parser.Abi\n params: ParamType[]\n }\n | {\n parser: Parser.V4Actions\n }\n | {\n parser: Parser.V3Actions\n }\n\nconst ALLOW_REVERT_FLAG = 0x80\nconst REVERTIBLE_COMMANDS = new Set<CommandType>([CommandType.EXECUTE_SUB_PLAN])\n\nconst PERMIT_STRUCT =\n '((address token,uint160 amount,uint48 expiration,uint48 nonce) details,address spender,uint256 sigDeadline)'\n\nconst PERMIT_BATCH_STRUCT =\n '((address token,uint160 amount,uint48 expiration,uint48 nonce)[] details,address spender,uint256 sigDeadline)'\n\nconst POOL_KEY_STRUCT = '(address currency0,address currency1,uint24 fee,int24 tickSpacing,address hooks)'\n\nconst PERMIT2_TRANSFER_FROM_STRUCT = '(address from,address to,uint160 amount,address token)'\nconst PERMIT2_TRANSFER_FROM_BATCH_STRUCT = PERMIT2_TRANSFER_FROM_STRUCT + '[]'\n\nexport const COMMAND_DEFINITION: { [key in CommandType]: CommandDefinition } = {\n // Batch Reverts\n [CommandType.EXECUTE_SUB_PLAN]: {\n parser: Parser.Abi,\n params: [\n { name: 'commands', type: 'bytes' },\n { name: 'inputs', type: 'bytes[]' },\n ],\n },\n\n // Permit2 Actions\n [CommandType.PERMIT2_PERMIT]: {\n parser: Parser.Abi,\n params: [\n { name: 'permit', type: PERMIT_STRUCT },\n { name: 'signature', type: 'bytes' },\n ],\n },\n [CommandType.PERMIT2_PERMIT_BATCH]: {\n parser: Parser.Abi,\n params: [\n { name: 'permit', type: PERMIT_BATCH_STRUCT },\n { name: 'signature', type: 'bytes' },\n ],\n },\n [CommandType.PERMIT2_TRANSFER_FROM]: {\n parser: Parser.Abi,\n params: [\n { name: 'token', type: 'address' },\n { name: 'recipient', type: 'address' },\n { name: 'amount', type: 'uint160' },\n ],\n },\n [CommandType.PERMIT2_TRANSFER_FROM_BATCH]: {\n parser: Parser.Abi,\n params: [\n {\n name: 'transferFrom',\n type: PERMIT2_TRANSFER_FROM_BATCH_STRUCT,\n },\n ],\n },\n\n // Uniswap Actions\n [CommandType.V3_SWAP_EXACT_IN]: {\n parser: Parser.Abi,\n params: [\n { name: 'recipient', type: 'address' },\n { name: 'amountIn', type: 'uint256' },\n { name: 'amountOutMin', type: 'uint256' },\n { name: 'path', subparser: Subparser.V3PathExactIn, type: 'bytes' },\n { name: 'payerIsUser', type: 'bool' },\n ],\n },\n [CommandType.V3_SWAP_EXACT_OUT]: {\n parser: Parser.Abi,\n params: [\n { name: 'recipient', type: 'address' },\n { name: 'amountOut', type: 'uint256' },\n { name: 'amountInMax', type: 'uint256' },\n { name: 'path', subparser: Subparser.V3PathExactOut, type: 'bytes' },\n { name: 'payerIsUser', type: 'bool' },\n ],\n },\n [CommandType.V2_SWAP_EXACT_IN]: {\n parser: Parser.Abi,\n params: [\n { name: 'recipient', type: 'address' },\n { name: 'amountIn', type: 'uint256' },\n { name: 'amountOutMin', type: 'uint256' },\n { name: 'path', type: 'address[]' },\n { name: 'payerIsUser', type: 'bool' },\n ],\n },\n [CommandType.V2_SWAP_EXACT_OUT]: {\n parser: Parser.Abi,\n params: [\n { name: 'recipient', type: 'address' },\n { name: 'amountOut', type: 'uint256' },\n { name: 'amountInMax', type: 'uint256' },\n { name: 'path', type: 'address[]' },\n { name: 'payerIsUser', type: 'bool' },\n ],\n },\n [CommandType.V4_SWAP]: { parser: Parser.V4Actions },\n\n // Token Actions and Checks\n [CommandType.WRAP_ETH]: {\n parser: Parser.Abi,\n params: [\n { name: 'recipient', type: 'address' },\n { name: 'amount', type: 'uint256' },\n ],\n },\n [CommandType.UNWRAP_WETH]: {\n parser: Parser.Abi,\n params: [\n { name: 'recipient', type: 'address' },\n { name: 'amountMin', type: 'uint256' },\n ],\n },\n [CommandType.SWEEP]: {\n parser: Parser.Abi,\n params: [\n { name: 'token', type: 'address' },\n { name: 'recipient', type: 'address' },\n { name: 'amountMin', type: 'uint256' },\n ],\n },\n [CommandType.TRANSFER]: {\n parser: Parser.Abi,\n params: [\n { name: 'token', type: 'address' },\n { name: 'recipient', type: 'address' },\n { name: 'value', type: 'uint256' },\n ],\n },\n [CommandType.PAY_PORTION]: {\n parser: Parser.Abi,\n params: [\n { name: 'token', type: 'address' },\n { name: 'recipient', type: 'address' },\n { name: 'bips', type: 'uint256' },\n ],\n },\n [CommandType.BALANCE_CHECK_ERC20]: {\n parser: Parser.Abi,\n params: [\n { name: 'owner', type: 'address' },\n { name: 'token', type: 'address' },\n { name: 'minBalance', type: 'uint256' },\n ],\n },\n [CommandType.V4_INITIALIZE_POOL]: {\n parser: Parser.Abi,\n params: [\n { name: 'poolKey', type: POOL_KEY_STRUCT },\n { name: 'sqrtPriceX96', type: 'uint160' },\n ],\n },\n\n // Position Actions\n [CommandType.V3_POSITION_MANAGER_PERMIT]: { parser: Parser.V3Actions },\n [CommandType.V3_POSITION_MANAGER_CALL]: { parser: Parser.V3Actions },\n [CommandType.V4_POSITION_MANAGER_CALL]: { parser: Parser.V4Actions },\n}\n\nexport class RoutePlanner {\n commands: string\n inputs: string[]\n\n constructor() {\n this.commands = '0x'\n this.inputs = []\n }\n\n addSubPlan(subplan: RoutePlanner): RoutePlanner {\n this.addCommand(CommandType.EXECUTE_SUB_PLAN, [subplan.commands, subplan.inputs], true)\n return this\n }\n\n addCommand(type: CommandType, parameters: any[], allowRevert = false): RoutePlanner {\n let command = createCommand(type, parameters)\n this.inputs.push(command.encodedInput)\n if (allowRevert) {\n if (!REVERTIBLE_COMMANDS.has(command.type)) {\n throw new Error(`command type: ${command.type} cannot be allowed to revert`)\n }\n command.type = command.type | ALLOW_REVERT_FLAG\n }\n\n this.commands = this.commands.concat(command.type.toString(16).padStart(2, '0'))\n return this\n }\n}\n\nexport type RouterCommand = {\n type: CommandType\n encodedInput: string\n}\n\nexport function createCommand(type: CommandType, parameters: any[]): RouterCommand {\n const commandDef = COMMAND_DEFINITION[type]\n switch (commandDef.parser) {\n case Parser.Abi:\n const encodedInput = defaultAbiCoder.encode(\n commandDef.params.map((abi) => abi.type),\n parameters\n )\n return { type, encodedInput }\n case Parser.V4Actions:\n // v4 swap data comes pre-encoded at index 0\n return { type, encodedInput: parameters[0] }\n case Parser.V3Actions:\n // v4 swap data comes pre-encoded at index 0\n return { type, encodedInput: parameters[0] }\n }\n}\n","import { RoutePlanner } from '../utils/routerCommands'\n\nexport type TradeConfig = {\n allowRevert: boolean\n}\n\nexport enum RouterActionType {\n UniswapTrade = 'UniswapTrade',\n UnwrapWETH = 'UnwrapWETH',\n}\n\n// interface for entities that can be encoded as a Universal Router command\nexport interface Command {\n tradeType: RouterActionType\n encode(planner: RoutePlanner, config: TradeConfig): void\n}\n","import { BigNumber } from 'ethers'\n\nexport enum UniversalRouterVersion {\n V1_2 = '1.2',\n V2_0 = '2.0',\n}\n\nexport type RouterConfig = {\n address: string\n creationBlock: number\n}\n\ntype ChainConfig = {\n weth: string\n routerConfigs: { [key in UniversalRouterVersion]: RouterConfig }\n}\n\nconst WETH_NOT_SUPPORTED_ON_CHAIN = '0x0000000000000000000000000000000000000000'\n\n// Todo: Change `CHAIN_CONFIGS` to pull the UR address with v4\nexport const CHAIN_CONFIGS: { [key: number]: ChainConfig } = {\n // mainnet\n [1]: {\n weth: '0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2',\n routerConfigs: {\n [UniversalRouterVersion.V1_2]: {\n address: '0x3fC91A3afd70395Cd496C647d5a6CC9D4B2b7FAD',\n creationBlock: 17143817,\n },\n [UniversalRouterVersion.V2_0]: {\n address: '0x66a9893cc07d91d95644aedd05d03f95e1dba8af',\n creationBlock: 1737658355,\n },\n },\n },\n // goerli\n [5]: {\n weth: '0xb4fbf271143f4fbf7b91a5ded31805e42b2208d6',\n routerConfigs: {\n [UniversalRouterVersion.V1_2]: {\n address: '0x3fC91A3afd70395Cd496C647d5a6CC9D4B2b7FAD',\n creationBlock: 8940568,\n },\n [UniversalRouterVersion.V2_0]: {\n address: '0x3fC91A3afd70395Cd496C647d5a6CC9D4B2b7FAD',\n creationBlock: 8940568,\n },\n },\n },\n // sepolia\n [11155111]: {\n weth: '0xfFf9976782d46CC05630D1f6eBAb18b2324d6B14',\n routerConfigs: {\n [UniversalRouterVersion.V1_2]: {\n address: '0x3fC91A3afd70395Cd496C647d5a6CC9D4B2b7FAD',\n creationBlock: 3543575,\n },\n [UniversalRouterVersion.V2_0]: {\n address: '0x3a9d48ab9751398bbfa63ad67599bb04e4bdf98b', // only update here and creation block below\n creationBlock: 7259601,\n },\n },\n },\n // polygon\n [137]: {\n weth: '0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270',\n routerConfigs: {\n [UniversalRouterVersion.V1_2]: {\n address: '0xec7BE89e9d109e7e3Fec59c222CF297125FEFda2',\n creationBlock: 52210153,\n },\n [UniversalRouterVersion.V2_0]: {\n address: '0x1095692a6237d83c6a72f3f5efedb9a670c49223',\n creationBlock: 1737492197,\n },\n },\n },\n //polygon mumbai\n [80001]: {\n weth: '0x9c3C9283D3e44854697Cd22D3Faa240Cfb032889',\n routerConfigs: {\n [UniversalRouterVersion.V1_2]: {\n address: '0x3fC91A3afd70395Cd496C647d5a6CC9D4B2b7FAD',\n creationBlock: 35176052,\n },\n [UniversalRouterVersion.V2_0]: {\n address: '0x3fC91A3afd70395Cd496C647d5a6CC9D4B2b7FAD',\n creationBlock: 35176052,\n },\n },\n },\n //optimism\n [10]: {\n weth: '0x4200000000000000000000000000000000000006',\n routerConfigs: {\n [UniversalRouterVersion.V1_2]: {\n address: '0xCb1355ff08Ab38bBCE60111F1bb2B784bE25D7e8',\n creationBlock: 114702266,\n },\n [UniversalRouterVersion.V2_0]: {\n address: '0x851116d9223fabed8e56c0e6b8ad0c31d98b3507',\n creationBlock: 1737494278,\n },\n },\n },\n // optimism goerli\n [420]: {\n weth: '0x4200000000000000000000000000000000000006',\n routerConfigs: {\n [UniversalRouterVersion.V1_2]: {\n address: '0x3fC91A3afd70395Cd496C647d5a6CC9D4B2b7FAD',\n creationBlock: 8887728,\n },\n [UniversalRouterVersion.V2_0]: {\n address: '0x3fC91A3afd70395Cd496C647d5a6CC9D4B2b7FAD',\n creationBlock: 8887728,\n },\n },\n },\n // arbitrum\n [42161]: {\n weth: '0x82aF49447D8a07e3bd95BD0d56f35241523fBab1',\n routerConfigs: {\n [UniversalRouterVersion.V1_2]: {\n address: '0x5E325eDA8064b456f4781070C0738d849c824258',\n creationBlock: 169472836,\n },\n [UniversalRouterVersion.V2_0]: {\n address: '0xa51afafe0263b40edaef0df8781ea9aa03e381a3',\n creationBlock: 1737487458,\n },\n },\n },\n // arbitrum goerli\n [421613]: {\n weth: '0xe39Ab88f8A4777030A534146A9Ca3B52bd5D43A3',\n routerConfigs: {\n [UniversalRouterVersion.V1_2]: {\n address: '0x3fC91A3afd70395Cd496C647d5a6CC9D4B2b7FAD',\n creationBlock: 18815277,\n },\n [UniversalRouterVersion.V2_0]: {\n address: '0x3fC91A3afd70395Cd496C647d5a6CC9D4B2b7FAD',\n creationBlock: 18815277,\n },\n },\n },\n // celo\n [42220]: {\n weth: WETH_NOT_SUPPORTED_ON_CHAIN,\n routerConfigs: {\n [UniversalRouterVersion.V1_2]: {\n address: '0x643770e279d5d0733f21d6dc03a8efbabf3255b4',\n creationBlock: 21407637,\n },\n [UniversalRouterVersion.V2_0]: {\n address: '0x643770e279d5d0733f21d6dc03a8efbabf3255b4',\n creationBlock: 21407637,\n },\n },\n },\n // celo alfajores\n [44787]: {\n weth: WETH_NOT_SUPPORTED_ON_CHAIN,\n routerConfigs: {\n [UniversalRouterVersion.V1_2]: {\n address: '0x3fC91A3afd70395Cd496C647d5a6CC9D4B2b7FAD',\n creationBlock: 17566658,\n },\n [UniversalRouterVersion.V2_0]: {\n address: '0x3fC91A3afd70395Cd496C647d5a6CC9D4B2b7FAD',\n creationBlock: 17566658,\n },\n },\n },\n // binance smart chain\n [56]: {\n weth: '0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c',\n routerConfigs: {\n [UniversalRouterVersion.V1_2]: {\n address: '0x4Dae2f939ACf50408e13d58534Ff8c2776d45265',\n creationBlock: 35160263,\n },\n [UniversalRouterVersion.V2_0]: {\n address: '0x1906c1d672b88cd1b9ac7593301ca990f94eae07',\n creationBlock: 1737493275,\n },\n },\n },\n // avalanche\n [43114]: {\n weth: '0xB31f66AA3C1e785363F0875A1B74E27b85FD66c7',\n routerConfigs: {\n [UniversalRouterVersion.V1_2]: {\n address: '0x4Dae2f939ACf50408e13d58534Ff8c2776d45265',\n creationBlock: 40237257,\n },\n [UniversalRouterVersion.V2_0]: {\n address: '0x94b75331ae8d42c1b61065089b7d48fe14aa73b7',\n creationBlock: 1737558236,\n },\n },\n },\n // base goerli\n [84531]: {\n weth: '0x4200000000000000000000000000000000000006',\n routerConfigs: {\n [UniversalRouterVersion.V1_2]: {\n address: '0xd0872d928672ae2ff74bdb2f5130ac12229cafaf',\n creationBlock: 6915289,\n },\n [UniversalRouterVersion.V2_0]: {\n address: '0xd0872d928672ae2ff74bdb2f5130ac12229cafaf',\n creationBlock: 6915289,\n },\n },\n },\n // base mainnet\n [8453]: {\n weth: '0x4200000000000000000000000000000000000006',\n routerConfigs: {\n [UniversalRouterVersion.V1_2]: {\n address: '0x3fC91A3afd70395Cd496C647d5a6CC9D4B2b7FAD',\n creationBlock: 9107268,\n },\n [UniversalRouterVersion.V2_0]: {\n address: '0x6ff5693b99212da76ad316178a184ab56d299b43',\n creationBlock: 1737491485,\n },\n },\n },\n // blast\n [81457]: {\n weth: '0x4300000000000000000000000000000000000004',\n routerConfigs: {\n [UniversalRouterVersion.V1_2]: {\n address: '0x643770E279d5D0733F21d6DC03A8efbABf3255B4',\n creationBlock: 1116444,\n },\n [UniversalRouterVersion.V2_0]: {\n address: '0xeabbcb3e8e415306207ef514f660a3f820025be3',\n creationBlock: 1737564586,\n },\n },\n },\n // zora\n [7777777]: {\n weth: '0x4200000000000000000000000000000000000006',\n routerConfigs: {\n [UniversalRouterVersion.V1_2]: {\n address: '0x2986d9721A49838ab4297b695858aF7F17f38014',\n creationBlock: 11832155,\n },\n [UniversalRouterVersion.V2_0]: {\n address: '0x3315ef7ca28db74abadc6c44570efdf06b04b020',\n creationBlock: 1737562927,\n },\n },\n },\n [324]: {\n weth: '0x5aea5775959fbc2557cc8789bc1bf90a239d9a91',\n routerConfigs: {\n [UniversalRouterVersion.V1_2]: {\n address: '0x28731BCC616B5f51dD52CF2e4dF0E78dD1136C06',\n creationBlock: 12640979,\n },\n [UniversalRouterVersion.V2_0]: {\n address: '0x28731BCC616B5f51dD52CF2e4dF0E78dD1136C06',\n creationBlock: 12640979,\n },\n },\n },\n // worldchain\n [480]: {\n weth: '0x4200000000000000000000000000000000000006',\n routerConfigs: {\n [UniversalRouterVersion.V1_2]: {\n address: '0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D',\n creationBlock: 4063979,\n },\n [UniversalRouterVersion.V2_0]: {\n address: '0x8ac7bee993bb44dab564ea4bc9ea67bf9eb5e743',\n creationBlock: 1737559557,\n },\n },\n },\n [1301]: {\n weth: '0x4200000000000000000000000000000000000006',\n routerConfigs: {\n [UniversalRouterVersion.V1_2]: {\n address: '0x8909Dc15e40173Ff4699343b6eB8132c65e18eC6',\n creationBlock: 1241811,\n },\n [UniversalRouterVersion.V2_0]: {\n address: '0xf70536b3bcc1bd1a972dc186a2cf84cc6da6be5d',\n creationBlock: 7100543,\n },\n },\n },\n // unichain mainnet\n [130]: {\n weth: '0x4200000000000000000000000000000000000006',\n routerConfigs: {\n [UniversalRouterVersion.V1_2]: {\n address: '0x4D73A4411CA1c660035e4AECC8270E5DdDEC8C17',\n creationBlock: 23678,\n },\n [UniversalRouterVersion.V2_0]: {\n address: '0xef740bf23acae26f6492b10de645d6b98dc8eaf3',\n creationBlock: 1737568156,\n },\n },\n },\n [10143]: {\n weth: '0x760AfE86e5de5fa0Ee542fc7B7B713e1c5425701',\n routerConfigs: {\n [UniversalRouterVersion.V1_2]: {\n address: '0x3ae6d8a282d67893e17aa70ebffb33ee5aa65893',\n creationBlock: 23678,\n },\n [UniversalRouterVersion.V2_0]: {\n address: '0x3ae6d8a282d67893e17aa70ebffb33ee5aa65893',\n creationBlock: 23678,\n },\n },\n },\n [84532]: {\n weth: '0x4200000000000000000000000000000000000006',\n routerConfigs: {\n [UniversalRouterVersion.V1_2]: {\n address: '0x492e6456d9528771018deb9e87ef7750ef184104',\n creationBlock: 20216585,\n },\n [UniversalRouterVersion.V2_0]: {\n address: '0x492e6456d9528771018deb9e87ef7750ef184104',\n creationBlock: 20216585,\n },\n },\n },\n [1868]: {\n weth: '0x4200000000000000000000000000000000000006',\n routerConfigs: {\n [UniversalRouterVersion.V1_2]: {\n address: '0x0e2850543f69f678257266e0907ff9a58b3f13de',\n creationBlock: 3254782,\n },\n [UniversalRouterVersion.V2_0]: {\n address: '0x0e2850543f69f678257266e0907ff9a58b3f13de',\n creationBlock: 3254782,\n },\n },\n },\n}\n\nexport const UNIVERSAL_ROUTER_ADDRESS = (version: UniversalRouterVersion, chainId: number): string => {\n if (!(chainId in CHAIN_CONFIGS)) throw new Error(`Universal Router not deployed on chain ${chainId}`)\n return CHAIN_CONFIGS[chainId].routerConfigs[version].address\n}\n\nexport const UNIVERSAL_ROUTER_CREATION_BLOCK = (version: UniversalRouterVersion, chainId: number): number => {\n if (!(chainId in CHAIN_CONFIGS)) throw new Error(`Universal Router not deployed on chain ${chainId}`)\n return CHAIN_CONFIGS[chainId].routerConfigs[version].creationBlock\n}\n\nexport const WETH_ADDRESS = (chainId: number): string => {\n if (!(chainId in CHAIN_CONFIGS)) throw new Error(`Universal Router not deployed on chain ${chainId}`)\n\n if (CHAIN_CONFIGS[chainId].weth == WETH_NOT_SUPPORTED_ON_CHAIN) throw new Error(`Chain ${chainId} does not have WETH`)\n\n return CHAIN_CONFIGS[chainId].weth\n}\n\nexport const CONTRACT_BALANCE = BigNumber.from(2).pow(255)\nexport const ETH_ADDRESS = '0x0000000000000000000000000000000000000000'\nexport const E_ETH_ADDRESS = '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee'\nexport const ZERO_ADDRESS = '0x0000000000000000000000000000000000000000'\nexport const MAX_UINT256 = BigNumber.from(2).pow(256).sub(1)\nexport const MAX_UINT160 = BigNumber.from(2).pow(160).sub(1)\n\nexport const SENDER_AS_RECIPIENT = '0x0000000000000000000000000000000000000001'\nexport const ROUTER_AS_RECIPIENT = '0x0000000000000000000000000000000000000002'\n","import { Currency, Token } from '@uniswap/sdk-core'\nimport { Pool as V4Pool } from '@uniswap/v4-sdk'\nimport { TPool } from '@uniswap/router-sdk'\n\nexport function getPathCurrency(currency: Currency, pool: TPool): Currency {\n // return currency if the currency matches a currency of the pool\n if (pool.involvesToken(currency as Token)) {\n return currency\n\n // return if currency.wrapped if pool involves wrapped currency\n } else if (pool.involvesToken(currency.wrapped as Token)) {\n return currency.wrapped\n\n // return native currency if pool involves native version of wrapped currency (only applies to V4)\n } else if (pool instanceof V4Pool && pool.token0.wrapped.equals(currency)) {\n return pool.token0\n } else if (pool instanceof V4Pool && pool.token1.wrapped.equals(currency)) {\n return pool.token1\n } else {\n throw new Error(`Expected currency ${currency.symbol} to be either ${pool.token0.symbol} or ${pool.token1.symbol}`)\n }\n\n return currency // this line needed for typescript to compile\n}\n","import { Currency } from '@uniswap/sdk-core'\nimport { ETH_ADDRESS } from './constants'\n\nexport function getCurrencyAddress(currency: Currency): string {\n return currency.isNative ? ETH_ADDRESS : currency.wrapped.address\n}\n","import { RoutePlanner, CommandType } from '../../utils/routerCommands'\nimport { Trade as V2Trade, Pair } from '@uniswap/v2-sdk'\nimport { Trade as V3Trade, Pool as V3Pool, encodeRouteToPath } from '@uniswap/v3-sdk'\nimport {\n Route as V4Route,\n Trade as V4Trade,\n Pool as V4Pool,\n V4Planner,\n encodeRouteToPath as encodeV4RouteToPath,\n Actions,\n} from '@uniswap/v4-sdk'\nimport {\n Trade as RouterTrade,\n MixedRouteTrade,\n Protocol,\n IRoute,\n RouteV2,\n RouteV3,\n MixedRouteSDK,\n MixedRoute,\n SwapOptions as RouterSwapOptions,\n getOutputOfPools,\n encodeMixedRouteToPath,\n partitionMixedRouteByProtocol,\n} from '@uniswap/router-sdk'\nimport { Permit2Permit } from '../../utils/inputTokens'\nimport { getPathCurrency } from '../../utils/pathCurrency'\nimport { Currency, TradeType, Token, CurrencyAmount, Percent } from '@uniswap/sdk-core'\nimport { Command, RouterActionType, TradeConfig } from '../Command'\nimport { SENDER_AS_RECIPIENT, ROUTER_AS_RECIPIENT, CONTRACT_BALANCE, ETH_ADDRESS } from '../../utils/constants'\nimport { getCurrencyAddress } from '../../utils/getCurrencyAddress'\nimport { encodeFeeBips } from '../../utils/numbers'\nimport { BigNumber, BigNumberish } from 'ethers'\nimport { TPool } from '@uniswap/router-sdk'\n\nexport type FlatFeeOptions = {\n amount: BigNumberish\n recipient: string\n}\n\n// the existing router permit object doesn't include enough data for permit2\n// so we extend swap options with the permit2 permit\n// when safe mode is enabled, the SDK will add an extra ETH sweep for security\n// when useRouterBalance is enabled the SDK will use the balance in the router for the swap\nexport type SwapOptions = Omit<RouterSwapOptions, 'inputTokenPermit'> & {\n useRouterBalance?: boolean\n inputTokenPermit?: Permit2Permit\n flatFee?: FlatFeeOptions\n safeMode?: boolean\n}\n\nconst REFUND_ETH_PRICE_IMPACT_THRESHOLD = new Percent(50, 100)\n\ninterface Swap<TInput extends Currency, TOutput extends Currency> {\n route: IRoute<TInput, TOutput, TPool>\n inputAmount: CurrencyAmount<TInput>\n outputAmount: CurrencyAmount<TOutput>\n}\n\n// Wrapper for uniswap router-sdk trade entity to encode swaps for Universal Router\n// also translates trade objects from previous (v2, v3) SDKs\nexport class UniswapTrade implements Command {\n readonly tradeType: RouterActionType = RouterActionType.UniswapTrade\n readonly payerIsUser: boolean\n\n constructor(public trade: RouterTrade<Currency, Currency, TradeType>, public options: SwapOptions) {\n if (!!options.fee && !!options.flatFee) throw new Error('Only one fee option permitted')\n\n if (this.inputRequiresWrap || this.inputRequiresUnwrap || this.options.useRouterBalance) {\n this.payerIsUser = false\n } else {\n this.payerIsUser = true\n }\n }\n\n get isAllV4(): boolean {\n let result = true\n for (const swap of this.trade.swaps) {\n result = result && swap.route.protocol == Protocol.V4\n }\n return result\n }\n\n get inputRequiresWrap(): boolean {\n if (this.isAllV4) {\n return (\n this.trade.inputAmount.currency.isNative &&\n !(this.trade.swaps[0].route as unknown as V4Route<Currency, Currency>).pathInput.isNative\n )\n } else {\n return this.trade.inputAmount.currency.isNative\n }\n }\n\n get inputRequiresUnwrap(): boolean {\n if (this.isAllV4) {\n return (\n !this.trade.inputAmount.currency.isNative &&\n (this.trade.swaps[0].route as unknown as V4Route<Currency, Currency>).pathInput.isNative\n )\n }\n return false\n }\n\n get outputRequiresWrap(): boolean {\n if (this.isAllV4) {\n return (\n !this.trade.outputAmount.currency.isNative &&\n (this.trade.swaps[0].route as unknown as V4Route<Currency, Currency>).pathOutput.isNative\n )\n }\n return false\n }\n\n get outputRequiresUnwrap(): boolean {\n if (this.isAllV4) {\n return (\n this.trade.outputAmount.currency.isNative &&\n !(this.trade.swaps[0].route as unknown as V4Route<Currency, Currency>).pathOutput.isNative\n )\n } else {\n return this.trade.outputAmount.currency.isNative\n }\n }\n\n get outputRequiresTransition(): boolean {\n return this.outputRequiresWrap || this.outputRequiresUnwrap\n }\n\n encode(planner: RoutePlanner, _config: TradeConfig): void {\n // If the input currency is the native currency, we need to wrap it with the router as the recipient\n if (this.inputRequiresWrap) {\n // TODO: optimize if only one v2 pool we can directly send this to the pool\n planner.addCommand(CommandType.WRAP_ETH, [\n ROUTER_AS_RECIPIENT,\n this.trade.maximumAmountIn(this.options.slippageTolerance).quotient.toString(),\n ])\n } else if (this.inputRequiresUnwrap) {\n // send wrapped token to router to unwrap\n planner.addCommand(CommandType.PERMIT2_TRANSFER_FROM, [\n (this.trade.inputAmount.currency as Token).address,\n ROUTER_AS_RECIPIENT,\n this.trade.maximumAmountIn(this.options.slippageTolerance).quotient.toString(),\n ])\n planner.addCommand(CommandType.UNWRAP_WETH, [ROUTER_AS_RECIPIENT, 0])\n }\n // The overall recipient at the end of the trade, SENDER_AS_RECIPIENT uses the msg.sender\n this.options.recipient = this.options.recipient ?? SENDER_AS_RECIPIENT\n\n // flag for whether we want to perform slippage check on aggregate output of multiple routes\n // 1. when there are >2 exact input trades. this is only a heuristic,\n // as it's still more gas-expensive even in this case, but has benefits\n // in that the reversion probability is lower\n const performAggregatedSlippageCheck =\n this.trade.tradeType === TradeType.EXACT_INPUT && this.trade.routes.length > 2\n const routerMustCustody =\n performAggregatedSlippageCheck || this.outputRequiresTransition || hasFeeOption(this.options)\n\n for (const swap of this.trade.swaps) {\n switch (swap.route.protocol) {\n case Protocol.V2:\n addV2Swap(planner, swap, this.trade.tradeType, this.options, this.payerIsUser, routerMustCustody)\n break\n case Protocol.V3:\n addV3Swap(planner, swap, this.trade.tradeType, this.options, this.payerIsUser, routerMustCustody)\n break\n case Protocol.V4:\n addV4Swap(planner, swap, this.trade.tradeType, this.options, this.payerIsUser, routerMustCustody)\n break\n case Protocol.MIXED:\n addMixedSwap(planner, swap, this.trade.tradeType, this.options, this.payerIsUser, routerMustCustody)\n break\n default:\n throw new Error('UNSUPPORTED_TRADE_PROTOCOL')\n }\n }\n\n let minimumAmountOut: BigNumber = BigNumber.from(\n this.trade.minimumAmountOut(this.options.slippageTolerance).quotient.toString()\n )\n // The router custodies for 3 reasons: to unwrap, to take a fee, and/or to do a slippage check\n if (routerMustCustody) {\n const pools = this.trade.swaps[0].route.pools\n const pathOutputCurrencyAddress = getCurrencyAddress(\n getPathCurrency(this.trade.outputAmount.currency, pools[pools.length - 1])\n )\n\n // If there is a fee, that percentage is sent to the fee recipient\n // In the case where ETH is the output currency, the fee is taken in WETH (for gas reasons)\n if (!!this.options.fee) {\n const feeBips = encodeFeeBips(this.options.fee.fee)\n planner.addCommand(CommandType.PAY_PORTION, [pathOutputCurrencyAddress, this.options.fee.recipient, feeBips])\n\n // If the trade is exact output, and a fee was taken, we must adjust the amount out to be the amount after the fee\n // Otherwise we continue as expected with the trade's normal expected output\n if (this.trade.tradeType === TradeType.EXACT_OUTPUT) {\n minimumAmountOut = minimumAmountOut.sub(minimumAmountOut.mul(feeBips).div(10000))\n }\n }\n\n // If there is a flat fee, that absolute amount is sent to the fee recipient\n // In the case where ETH is the output currency, the fee is taken in WETH (for gas reasons)\n if (!!this.options.flatFee) {\n const feeAmount = this.options.flatFee.amount\n if (minimumAmountOut.lt(feeAmount)) throw new Error('Flat fee amount greater than minimumAmountOut')\n\n planner.addCommand(CommandType.TRANSFER, [pathOutputCurrencyAddress, this.options.flatFee.recipient, feeAmount])\n\n // If the trade is exact output, and a fee was taken, we must adjust the amount out to be the amount after the fee\n // Otherwise we continue as expected with the trade's normal expected output\n if (this.trade.tradeType === TradeType.EXACT_OUTPUT) {\n minimumAmountOut = minimumAmountOut.sub(feeAmount)\n }\n }\n\n // The remaining tokens that need to be sent to the user after the fee is taken will be caught\n // by this if-else clause.\n if (this.outputRequiresUnwrap) {\n planner.addCommand(CommandType.UNWRAP_WETH, [this.options.recipient, minimumAmountOut])\n } else if (this.outputRequiresWrap) {\n planner.addCommand(CommandType.WRAP_ETH, [this.options.recipient, CONTRACT_BALANCE])\n } else {\n planner.addCommand(CommandType.SWEEP, [\n getCurrencyAddress(this.trade.outputAmount.currency),\n this.options.recipient,\n minimumAmountOut,\n ])\n }\n }\n\n // for exactOutput swaps with native input or that perform an inputToken transition (wrap or unwrap)\n // we need to send back the change to the user\n if (this.trade.tradeType === TradeType.EXACT_OUTPUT || riskOfPartialFill(this.trade)) {\n if (this.inputRequiresWrap) {\n planner.addCommand(CommandType.UNWRAP_WETH, [this.options.recipient, 0])\n } else if (this.inputRequiresUnwrap) {\n planner.addCommand(CommandType.WRAP_ETH, [this.options.recipient, CONTRACT_BALANCE])\n } else if (this.trade.inputAmount.currency.isNative) {\n // must refund extra native currency sent along for native v4 trades (no input transition)\n planner.addCommand(CommandType.SWEEP, [ETH_ADDRESS, this.options.recipient, 0])\n }\n }\n\n if (this.options.safeMode) planner.addCommand(CommandType.SWEEP, [ETH_ADDRESS, this.options.recipient, 0])\n }\n}\n\n// encode a uniswap v2 swap\nfunction addV2Swap<TInput extends Currency, TOutput extends Currency>(\n planner: RoutePlanner,\n { route, inputAmount, outputAmount }: Swap<TInput, TOutput>,\n tradeType: TradeType,\n options: SwapOptions,\n payerIsUser: boolean,\n routerMustCustody: boolean\n): void {\n const trade = new V2Trade(\n route as RouteV2<TInput, TOutput>,\n tradeType == TradeType.EXACT_INPUT ? inputAmount : outputAmount,\n tradeType\n )\n\n if (tradeType == TradeType.EXACT_INPUT) {\n planner.addCommand(CommandType.V2_SWAP_EXACT_IN, [\n // if native, we have to unwrap so keep in the router for now\n routerMustCustody ? ROUTER_AS_RECIPIENT : options.recipient,\n trade.maximumAmountIn(options.slippageTolerance).quotient.toString(),\n // if router will custody funds, we do aggregated slippage check from router\n routerMustCustody ? 0 : trade.minimumAmountOut(options.slippageTolerance).quotient.toString(),\n route.path.map((token) => token.wrapped.address),\n payerIsUser,\n ])\n } else if (tradeType == TradeType.EXACT_OUTPUT) {\n planner.addCommand(CommandType.V2_SWAP_EXACT_OUT, [\n routerMustCustody ? ROUTER_AS_RECIPIENT : options.recipient,\n trade.minimumAmountOut(options.slippageTolerance).quotient.toString(),\n trade.maximumAmountIn(options.slippageTolerance).quotient.toString(),\n route.path.map((token) => token.wrapped.address),\n payerIsUser,\n ])\n }\n}\n\n// encode a uniswap v3 swap\nfunction addV3Swap<TInput extends Currency, TOutput extends Currency>(\n planner: RoutePlanner,\n { route, inputAmount, outputAmount }: Swap<TInput, TOutput>,\n tradeType: TradeType,\n options: SwapOptions,\n payerIsUser: boolean,\n routerMustCustody: boolean\n): void {\n const trade = V3Trade.createUncheckedTrade({\n route: route as RouteV3<TInput, TOutput>,\n inputAmount,\n outputAmount,\n tradeType,\n })\n\n const path = encodeRouteToPath(route as RouteV3<TInput, TOutput>, trade.tradeType === TradeType.EXACT_OUTPUT)\n if (tradeType == TradeType.EXACT_INPUT) {\n planner.addCommand(CommandType.V3_SWAP_EXACT_IN, [\n routerMustCustody ? ROUTER_AS_RECIPIENT : options.recipient,\n trade.maximumAmountIn(options.slippageTolerance).quotient.toString(),\n routerMustCustody ? 0 : trade.minimumAmountOut(options.slippageTolerance).quotient.toString(),\n path,\n payerIsUser,\n ])\n } else if (tradeType == TradeType.EXACT_OUTPUT) {\n planner.addCommand(CommandType.V3_SWAP_EXACT_OUT, [\n routerMustCustody ? ROUTER_AS_RECIPIENT : options.recipient,\n trade.minimumAmountOut(options.slippageTolerance).quotient.toString(),\n trade.maximumAmountIn(options.slippageTolerance).quotient.toString(),\n path,\n payerIsUser,\n ])\n }\n}\n\nfunction addV4Swap<TInput extends Currency, TOutput extends Currency>(\n planner: RoutePlanner,\n { inputAmount, outputAmount, route }: Swap<TInput, TOutput>,\n tradeType: TradeType,\n options: SwapOptions,\n payerIsUser: boolean,\n routerMustCustody: boolean\n): void {\n // create a deep copy of pools since v4Planner encoding tampers with array\n const pools = route.pools.map((p) => p) as V4Pool[]\n const v4Route = new V4Route(pools, inputAmount.currency, outputAmount.currency)\n const trade = V4Trade.createUncheckedTrade({\n route: v4Route,\n inputAmount,\n outputAmount,\n tradeType,\n })\n\n const slippageToleranceOnSwap =\n routerMustCustody && tradeType == TradeType.EXACT_INPUT ? undefined : options.slippageTolerance\n\n const v4Planner = new V4Planner()\n v4Planner.addTrade(trade, slippageToleranceOnSwap)\n v4Planner.addSettle(trade.route.pathInput, payerIsUser)\n v4Planner.addTake(\n trade.route.pathOutput,\n routerMustCustody ? ROUTER_AS_RECIPIENT : options.recipient ?? SENDER_AS_RECIPIENT\n )\n planner.addCommand(CommandType.V4_SWAP, [v4Planner.finalize()])\n}\n\n// encode a mixed route swap, i.e. including both v2 and v3 pools\nfunction addMixedSwap<TInput extends Currency, TOutput extends Currency>(\n planner: RoutePlanner,\n swap: Swap<TInput, TOutput>,\n tradeType: TradeType,\n options: SwapOptions,\n payerIsUser: boolean,\n routerMustCustody: boolean\n): void {\n const route = swap.route as MixedRoute<TInput, TOutput>\n const inputAmount = swap.inputAmount\n const outputAmount = swap.outputAmount\n const tradeRecipient = routerMustCustody ? ROUTER_AS_RECIPIENT : options.recipient ?? SENDER_AS_RECIPIENT\n\n // single hop, so it can be reduced to plain swap logic for one protocol version\n if (route.pools.length === 1) {\n if (route.pools[0] instanceof V4Pool) {\n return addV4Swap(planner, swap, tradeType, options, payerIsUser, routerMustCustody)\n } else if (route.pools[0] instanceof V3Pool) {\n return addV3Swap(planner, swap, tradeType, options, payerIsUser, routerMustCustody)\n } else if (route.pools[0] instanceof Pair) {\n return addV2Swap(planner, swap, tradeType, options, payerIsUser, routerMustCustody)\n } else {\n throw new Error('Invalid route type')\n }\n }\n\n const trade = MixedRouteTrade.createUncheckedTrade({\n route: route as MixedRoute<TInput, TOutput>,\n inputAmount,\n outputAmount,\n tradeType,\n })\n\n const amountIn = trade.maximumAmountIn(options.slippageTolerance, inputAmount).quotient.toString()\n const amountOut = routerMustCustody\n ? 0\n : trade.minimumAmountOut(options.slippageTolerance, outputAmount).quotient.toString()\n\n // logic from\n // https://github.com/Uniswap/router-sdk/blob/d8eed164e6c79519983844ca8b6a3fc24ebcb8f8/src/swapRouter.ts#L276\n const sections = partitionMixedRouteByProtocol(route as MixedRoute<TInput, TOutput>)\n const isLastSectionInRoute = (i: number) => {\n return i === sections.length - 1\n }\n\n let inputToken = route.pathInput\n\n for (let i = 0; i < sections.length; i++) {\n const section = sections[i]\n const routePool = section[0]\n const outputToken = getOutputOfPools(section, inputToken)\n const subRoute = new MixedRoute(new MixedRouteSDK([...section], inputToken, outputToken))\n\n let nextInputToken\n let swapRecipient\n\n if (isLastSectionInRoute(i)) {\n nextInputToken = outputToken\n swapRecipient = tradeRecipient\n } else {\n const nextPool = sections[i + 1][0]\n nextInputToken = getPathCurrency(outputToken, nextPool)\n\n const v2PoolIsSwapRecipient = nextPool instanceof Pair && outputToken.equals(nextInputToken)\n swapRecipient = v2PoolIsSwapRecipient ? (nextPool as Pair).liquidityToken.address : ROUTER_AS_RECIPIENT\n }\n\n if (routePool instanceof V4Pool) {\n const v4Planner = new V4Planner()\n const v4SubRoute = new V4Route(section as V4Pool[], subRoute.input, subRoute.output)\n\n v4Planner.addSettle(inputToken, payerIsUser && i === 0, (i == 0 ? amountIn : CONTRACT_BALANCE) as BigNumber)\n v4Planner.addAction(Actions.SWAP_EXACT_IN, [\n {\n currencyIn: inputToken.isNative ? ETH_ADDRESS : inputToken.address,\n path: encodeV4RouteToPath(v4SubRoute),\n amountIn: 0, // denotes open delta, amount set in v4Planner.addSettle()\n amountOutMinimum: !isLastSectionInRoute(i) ? 0 : amountOut,\n },\n ])\n v4Planner.addTake(outputToken, swapRecipient)\n\n planner.addCommand(CommandType.V4_SWAP, [v4Planner.finalize()])\n } else if (routePool instanceof V3Pool) {\n planner.addCommand(CommandType.V3_SWAP_EXACT_IN, [\n swapRecipient, // recipient\n i == 0 ? amountIn : CONTRACT_BALANCE, // amountIn\n !isLastSectionInRoute(i) ? 0 : amountOut, // amountOut\n encodeMixedRouteToPath(subRoute), // path\n payerIsUser && i === 0, // payerIsUser\n ])\n } else if (routePool instanceof Pair) {\n planner.addCommand(CommandType.V2_SWAP_EXACT_IN, [\n swapRecipient, // recipient\n i === 0 ? amountIn : CONTRACT_BALANCE, // amountIn\n !isLastSectionInRoute(i) ? 0 : amountOut, // amountOutMin\n subRoute.path.map((token) => token.wrapped.address), // path\n payerIsUser && i === 0,\n ])\n } else {\n throw new Error('Unexpected Pool Type')\n }\n\n // perform a token transition (wrap/unwrap if necessary)\n if (!isLastSectionInRoute(i)) {\n if (outputToken.isNative && !nextInputToken.isNative) {\n planner.addCommand(CommandType.WRAP_ETH, [ROUTER_AS_RECIPIENT, CONTRACT_BALANCE])\n } else if (!outputToken.isNative && nextInputToken.isNative) {\n planner.addCommand(CommandType.UNWRAP_WETH, [ROUTER_AS_RECIPIENT, 0])\n }\n }\n\n inputToken = nextInputToken\n }\n}\n\n// if price impact is very high, there's a chance of hitting max/min prices resulting in a partial fill of the swap\nfunction riskOfPartialFill(trade: RouterTrade<Currency, Currency, TradeType>): boolean {\n return trade.priceImpact.greaterThan(REFUND_ETH_PRICE_IMPACT_THRESHOLD)\n}\n\nfunction hasFeeOption(swapOptions: SwapOptions): boolean {\n return !!swapOptions.fee || !!swapOptions.flatFee\n}\n","import { BigNumber } from 'ethers'\nimport JSBI from 'jsbi'\nimport bn from 'bignumber.js'\nimport { Percent } from '@uniswap/sdk-core'\nimport { toHex } from '@uniswap/v3-sdk'\n\nexport function expandTo18DecimalsBN(n: number): BigNumber {\n // use bn intermediately to allow decimals in intermediate calculations\n return BigNumber.from(new bn(n).times(new bn(10).pow(18)).toFixed())\n}\n\nexport function expandTo18Decimals(n: number): JSBI {\n return JSBI.BigInt(BigNumber.from(n).mul(BigNumber.from(10).pow(18)).toString())\n}\n\nexport function encodeFeeBips(fee: Percent): string {\n return toHex(fee.multiply(10_000).quotient)\n}\n","import invariant from 'tiny-invariant'\nimport { ethers } from 'ethers'\nimport { validateAndParseAddress, BigintIsh } from '@uniswap/sdk-core'\nimport { NFTPermitOptions, NonfungiblePositionManager } from '@uniswap/v3-sdk'\nimport { PermitSingle } from '@uniswap/permit2-sdk'\nimport { CommandType, RoutePlanner } from './routerCommands'\nimport { ROUTER_AS_RECIPIENT } from './constants'\n\nexport interface Permit2Permit extends PermitSingle {\n signature: string\n}\n\nexport type ApproveProtocol = {\n token: string\n protocol: string\n}\n\nexport type Permit2TransferFrom = {\n token: string\n amount: string\n recipient?: string\n}\n\nexport type InputTokenOptions = {\n permit2Permit?: Permit2Permit\n permit2TransferFrom?: Permit2TransferFrom\n}\n\nconst SIGNATURE_LENGTH = 65\nconst EIP_2098_SIGNATURE_LENGTH = 64\n\nexport function encodePermit(planner: RoutePlanner, permit2: Permit2Permit): void {\n let signature = permit2.signature\n\n const length = ethers.utils.arrayify(permit2.signature).length\n // signature data provided for EIP-1271 may have length different from ECDSA signature\n if (length === SIGNATURE_LENGTH || length === EIP_2098_SIGNATURE_LENGTH) {\n // sanitizes signature to cover edge cases of malformed EIP-2098 sigs and v used as recovery id\n signature = ethers.utils.joinSignature(ethers.utils.splitSignature(permit2.signature))\n }\n\n planner.addCommand(CommandType.PERMIT2_PERMIT, [permit2, signature])\n}\n\nexport function encodeV3PositionPermit(planner: RoutePlanner, permit: NFTPermitOptions, tokenId: BigintIsh): void {\n const calldata = NonfungiblePositionManager.INTERFACE.encodeFunctionData('permit', [\n validateAndParseAddress(permit.spender),\n tokenId,\n permit.deadline,\n permit.v,\n permit.r,\n permit.s,\n ])\n\n planner.addCommand(CommandType.V3_POSITION_MANAGER_PERMIT, [calldata])\n}\n\n// Handles the encoding of commands needed to gather input tokens for a trade\n// Approval: The router approving another address to take tokens.\n// note: Only seaport and sudoswap support this action. Approvals are left open.\n// Permit: A Permit2 signature-based Permit to allow the router to access a user's tokens\n// Transfer: A Permit2 TransferFrom of tokens from a user to either the router or another address\nexport function encodeInputTokenOptions(planner: RoutePlanner, options: InputTokenOptions) {\n // first ensure that all tokens provided for encoding are the same\n if (!!options.permit2TransferFrom && !!options.permit2Permit)\n invariant(options.permit2TransferFrom.token === options.permit2Permit.details.token, `inconsistent token`)\n\n // if this order has a options.permit2Permit, encode it\n if (!!options.permit2Permit) {\n encodePermit(planner, options.permit2Permit)\n }\n\n if (!!options.permit2TransferFrom) {\n planner.addCommand(CommandType.PERMIT2_TRANSFER_FROM, [\n options.permit2TransferFrom.token,\n options.permit2TransferFrom.recipient ? options.permit2TransferFrom.recipient : ROUTER_AS_RECIPIENT,\n options.permit2TransferFrom.amount,\n ])\n }\n}\n","import invariant from 'tiny-invariant'\nimport { abi } from '@uniswap/universal-router/artifacts/contracts/UniversalRouter.sol/UniversalRouter.json'\nimport { Interface } from '@ethersproject/abi'\nimport { BigNumber, BigNumberish } from 'ethers'\nimport {\n MethodParameters,\n Multicall,\n Position as V3Position,\n NonfungiblePositionManager as V3PositionManager,\n RemoveLiquidityOptions as V3RemoveLiquidityOptions,\n} from '@uniswap/v3-sdk'\nimport {\n Position as V4Position,\n V4PositionManager,\n AddLiquidityOptions as V4AddLiquidityOptions,\n MintOptions,\n Pool as V4Pool,\n PoolKey,\n} from '@uniswap/v4-sdk'\nimport { Trade as RouterTrade } from '@uniswap/router-sdk'\nimport { Currency, TradeType, Percent, CHAIN_TO_ADDRESSES_MAP, SupportedChainsType } from '@uniswap/sdk-core'\nimport { UniswapTrade, SwapOptions } from './entities/actions/uniswap'\nimport { RoutePlanner, CommandType } from './utils/routerCommands'\nimport { encodePermit, encodeV3PositionPermit } from './utils/inputTokens'\nimport { UNIVERSAL_ROUTER_ADDRESS, UniversalRouterVersion } from './utils/constants'\n\nexport type SwapRouterConfig = {\n sender?: string // address\n deadline?: BigNumberish\n}\n\nexport interface MigrateV3ToV4Options {\n inputPosition: V3Position\n outputPosition: V4Position\n v3RemoveLiquidityOptions: V3RemoveLiquidityOptions\n v4AddLiquidityOptions: V4AddLiquidityOptions\n}\n\nfunction isMint(options: V4AddLiquidityOptions): options is MintOptions {\n return Object.keys(options).some((k) => k === 'recipient')\n}\n\nexport abstract class SwapRouter {\n public static INTERFACE: Interface = new Interface(abi)\n\n public static swapCallParameters(\n trades: RouterTrade<Currency, Currency, TradeType>,\n options: SwapOptions\n ): MethodParameters {\n // TODO: use permit if signature included in swapOptions\n const planner = new RoutePlanner()\n\n const trade: UniswapTrade = new UniswapTrade(trades, options)\n\n const inputCurrency = trade.trade.inputAmount.currency\n invariant(!(inputCurrency.isNative && !!options.inputTokenPermit), 'NATIVE_INPUT_PERMIT')\n\n if (options.inputTokenPermit) {\n encodePermit(planner, options.inputTokenPermit)\n }\n\n const nativeCurrencyValue = inputCurrency.isNative\n ? BigNumber.from(trade.trade.maximumAmountIn(options.slippageTolerance).quotient.toString())\n : BigNumber.from(0)\n\n trade.encode(planner, { allowRevert: false })\n return SwapRouter.encodePlan(planner, nativeCurrencyValue, {\n deadline: options.deadlineOrPreviousBlockhash ? BigNumber.from(options.deadlineOrPreviousBlockhash) : undefined,\n })\n }\n\n /**\n * Builds the call parameters for a migration from a V3 position to a V4 position.\n * Some requirements of the parameters:\n * - v3RemoveLiquidityOptions.collectOptions.recipient must equal v4PositionManager\n * - v3RemoveLiquidityOptions.liquidityPercentage must be 100%\n * - input pool and output pool must have the same tokens\n * - V3 NFT must be approved, or valid inputV3NFTPermit must be provided with UR as spender\n */\n public static migrateV3ToV4CallParameters(\n options: MigrateV3ToV4Options,\n positionManagerOverride?: string\n ): MethodParameters {\n const v4Pool: V4Pool = options.outputPosition.pool\n const v3Token0 = options.inputPosition.pool.token0\n const v3Token1 = options.inputPosition.pool.token1\n const v4PositionManagerAddress =\n positionManagerOverride ?? CHAIN_TO_ADDRESSES_MAP[v4Pool.chainId as SupportedChainsType].v4PositionManagerAddress\n\n // owner of the v3 nft must be the receiver of the v4 nft\n\n // validate the parameters\n if (v4Pool.currency0.isNative) {\n invariant(\n (v4Pool.currency0.wrapped.equals(v3Token0) && v4Pool.currency1.equals(v3Token1)) ||\n (v4Pool.currency0.wrapped.equals(v3Token1) && v4Pool.currency1.equals(v3Token0)),\n 'TOKEN_MISMATCH'\n )\n } else {\n invariant(v3Token0 === v4Pool.token0, 'TOKEN0_MISMATCH')\n invariant(v3Token1 === v4Pool.token1, 'TOKEN1_MISMATCH')\n }\n\n invariant(\n options.v3RemoveLiquidityOptions.liquidityPercentage.equalTo(new Percent(100, 100)),\n 'FULL_REMOVAL_REQUIRED'\n )\n invariant(options.v3RemoveLiquidityOptions.burnToken == true, 'BURN_TOKEN_REQUIRED')\n invariant(\n options.v3RemoveLiquidityOptions.collectOptions.recipient === v4PositionManagerAddress,\n 'RECIPIENT_NOT_POSITION_MANAGER'\n )\n invariant(isMint(options.v4AddLiquidityOptions), 'MINT_REQUIRED')\n invariant(options.v4AddLiquidityOptions.migrate, 'MIGRATE_REQUIRED')\n\n const planner = new RoutePlanner()\n\n // to prevent reentrancy by the pool hook, we initialize the v4 pool before moving funds\n if (options.v4AddLiquidityOptions.createPool) {\n const poolKey: PoolKey = V4Pool.getPoolKey(\n v4Pool.currency0,\n v4Pool.currency1,\n v4Pool.fee,\n v4Pool.tickSpacing,\n v4Pool.hooks\n )\n planner.addCommand(CommandType.V4_INITIALIZE_POOL, [poolKey, v4Pool.sqrtRatioX96.toString()])\n // remove createPool setting, so that it doesnt get encoded again later\n delete options.v4AddLiquidityOptions.createPool\n }\n\n // add position permit to the universal router planner\n if (options.v3RemoveLiquidityOptions.permit) {\n // permit spender should be UR\n const universalRouterAddress = UNIVERSAL_ROUTER_ADDRESS(\n UniversalRouterVersion.V2_0,\n options.inputPosition.pool.chainId as SupportedChainsType\n )\n invariant(universalRouterAddress == options.v3RemoveLiquidityOptions.permit.spender, 'INVALID_SPENDER')\n // don't need to transfer it because v3posm uses isApprovedOrOwner()\n encodeV3PositionPermit(planner, options.v3RemoveLiquidityOptions.permit, options.v3RemoveLiquidityOptions.tokenId)\n // remove permit so that multicall doesnt add it again\n delete options.v3RemoveLiquidityOptions.permit\n }\n\n // encode v3 withdraw\n const v3RemoveParams: MethodParameters = V3PositionManager.removeCallParameters(\n options.inputPosition,\n options.v3RemoveLiquidityOptions\n )\n const v3Calls: string[] = Multicall.decodeMulticall(v3RemoveParams.calldata)\n\n for (const v3Call of v3Calls) {\n // slice selector - 0x + 4 bytes = 10 characters\n const selector = v3Call.slice(0, 10)\n invariant(\n selector == V3PositionManager.INTERFACE.getSighash('collect') ||\n selector == V3PositionManager.INTERFACE.getSighash('decreaseLiquidity') ||\n selector == V3PositionManager.INTERFACE.getSighash('burn'),\n 'INVALID_V3_CALL: ' + selector\n )\n planner.addCommand(CommandType.V3_POSITION_MANAGER_CALL, [v3Call])\n }\n\n // encode v4 mint\n const v4AddParams = V4PositionManager.addCallParameters(options.outputPosition, options.v4AddLiquidityOptions)\n // only modifyLiquidities can be called by the UniversalRouter\n const selector = v4AddParams.calldata.slice(0, 10)\n invariant(selector == V4PositionManager.INTERFACE.getSighash('modifyLiquidities'), 'INVALID_V4_CALL: ' + selector)\n\n planner.addCommand(CommandType.V4_POSITION_MANAGER_CALL, [v4AddParams.calldata])\n\n return SwapRouter.encodePlan(planner, BigNumber.from(0), {\n deadline: BigNumber.from(options.v4AddLiquidityOptions.deadline),\n })\n }\n\n /**\n * Encodes a planned route into a method name and parameters for the Router contract.\n * @param planner the planned route\n * @param nativeCurrencyValue the native currency value of the planned route\n * @param config the router config\n */\n private static encodePlan(\n planner: RoutePlanner,\n nativeCurrencyValue: BigNumber,\n config: SwapRouterConfig = {}\n ): MethodParameters {\n const { commands, inputs } = planner\n const functionSignature = !!config.deadline ? 'execute(bytes,bytes[],uint256)' : 'execute(bytes,bytes[])'\n const parameters = !!config.deadline ? [commands, inputs, config.deadline] : [commands, inputs]\n const calldata = SwapRouter.INTERFACE.encodeFunctionData(functionSignature, parameters)\n return { calldata, value: nativeCurrencyValue.toHexString() }\n }\n}\n","import { MixedRouteSDK, Trade as RouterTrade } from '@uniswap/router-sdk'\nimport { Currency, CurrencyAmount, Ether, Token, TradeType } from '@uniswap/sdk-core'\nimport { Pair, Route as V2Route } from '@uniswap/v2-sdk'\nimport { Pool as V3Pool, Route as V3Route, FeeAmount } from '@uniswap/v3-sdk'\nimport { Pool as V4Pool, Route as V4Route } from '@uniswap/v4-sdk'\nimport { BigNumber } from 'ethers'\nimport { ETH_ADDRESS, E_ETH_ADDRESS } from './constants'\n\nexport type TokenInRoute = {\n address: string\n chainId: number\n symbol: string\n decimals: string\n name?: string\n buyFeeBps?: string\n sellFeeBps?: string\n}\n\nexport enum PoolType {\n V2Pool = 'v2-pool',\n V3Pool = 'v3-pool',\n V4Pool = 'v4-pool',\n}\n\nexport type V2Reserve = {\n token: TokenInRoute\n quotient: string\n}\n\nexport type V2PoolInRoute = {\n type: PoolType.V2Pool\n address?: string\n tokenIn: TokenInRoute\n tokenOut: TokenInRoute\n reserve0: V2Reserve\n reserve1: V2Reserve\n amountIn?: string\n amountOut?: string\n}\n\nexport type V3PoolInRoute = {\n type: PoolType.V3Pool\n address?: string\n tokenIn: TokenInRoute\n tokenOut: TokenInRoute\n sqrtRatioX96: string\n liquidity: string\n tickCurrent: string\n fee: string\n amountIn?: string\n amountOut?: string\n}\n\nexport type V4PoolInRoute = {\n type: PoolType.V4Pool\n address?: string\n tokenIn: TokenInRoute\n tokenOut: TokenInRoute\n fee: string\n tickSpacing: string\n hooks: string\n liquidity: string\n sqrtRatioX96: string\n tickCurrent: string\n amountIn?: string\n amountOut?: string\n}\n\nexport type PartialClassicQuote = {\n // We need tokenIn/Out to support native currency\n tokenIn: string\n tokenOut: string\n tradeType: TradeType\n route: Array<(V4PoolInRoute | V3PoolInRoute | V2PoolInRoute)[]>\n}\n\ninterface RouteResult {\n routev4: V4Route<Currency, Currency> | null\n routev3: V3Route<Currency, Currency> | null\n routev2: V2Route<Currency, Currency> | null\n mixedRoute: MixedRouteSDK<Currency, Currency> | null\n inputAmount: CurrencyAmount<Currency>\n outputAmount: CurrencyAmount<Currency>\n}\n\nexport const isNativeCurrency = (address: string) =>\n address.toLowerCase() === ETH_ADDRESS.toLowerCase() || address.toLowerCase() === E_ETH_ADDRESS.toLowerCase()\n\n// Helper class to convert routing-specific quote entities to RouterTrade entities\n// the returned RouterTrade can then be used to build the UniswapTrade entity in this package\nexport class RouterTradeAdapter {\n // Generate a RouterTrade using fields from a classic quote response\n static fromClassicQuote(quote: PartialClassicQuote) {\n const { route, tokenIn, tokenOut } = quote\n\n if (!route) throw new Error('Expected route to be present')\n if (!route.length) throw new Error('Expected there to be at least one route')\n if (route.some((r) => !r.length)) throw new Error('Expected all routes to have at least one pool')\n const firstRoute = route[0]\n\n const tokenInData = firstRoute[0].tokenIn\n const tokenOutData = firstRoute[firstRoute.length - 1].tokenOut\n\n if (!tokenInData || !tokenOutData) throw new Error('Expected both tokenIn and tokenOut to be present')\n if (tokenInData.chainId !== tokenOutData.chainId)\n throw new Error('Expected tokenIn and tokenOut to be have same chainId')\n\n const parsedCurrencyIn = RouterTradeAdapter.toCurrency(isNativeCurrency(tokenIn), tokenInData)\n const parsedCurrencyOut = RouterTradeAdapter.toCurrency(isNativeCurrency(tokenOut), tokenOutData)\n\n const typedRoutes: RouteResult[] = route.map((subRoute) => {\n const rawAmountIn = subRoute[0].amountIn\n const rawAmountOut = subRoute[subRoute.length - 1].amountOut\n\n if (!rawAmountIn || !rawAmountOut) {\n throw new Error('Expected both raw amountIn and raw amountOut to be present')\n }\n\n const inputAmount = CurrencyAmount.fromRawAmount(parsedCurrencyIn, rawAmountIn)\n const outputAmount = CurrencyAmount.fromRawAmount(parsedCurrencyOut, rawAmountOut)\n\n const isOnlyV2 = RouterTradeAdapter.isVersionedRoute<V2PoolInRoute>(PoolType.V2Pool, subRoute)\n const isOnlyV3 = RouterTradeAdapter.isVersionedRoute<V3PoolInRoute>(PoolType.V3Pool, subRoute)\n const isOnlyV4 = RouterTradeAdapter.isVersionedRoute<V4PoolInRoute>(PoolType.V4Pool, subRoute)\n return {\n routev4: isOnlyV4\n ? new V4Route(\n (subRoute as V4PoolInRoute[]).map(RouterTradeAdapter.toV4Pool),\n parsedCurrencyIn,\n parsedCurrencyOut\n )\n : null,\n routev3: isOnlyV3\n ? new V3Route(\n (subRoute as V3PoolInRoute[]).map(RouterTradeAdapter.toV3Pool),\n parsedCurrencyIn,\n parsedCurrencyOut\n )\n : null,\n routev2: isOnlyV2\n ? new V2Route(\n (subRoute as V2PoolInRoute[]).map(RouterTradeAdapter.toPair),\n parsedCurrencyIn,\n parsedCurrencyOut\n )\n : null,\n mixedRoute:\n !isOnlyV4 && !isOnlyV3 && !isOnlyV2\n ? new MixedRouteSDK(subRoute.map(RouterTradeAdapter.toPoolOrPair), parsedCurrencyIn, parsedCurrencyOut)\n : null,\n inputAmount,\n outputAmount,\n }\n })\n\n return new RouterTrade({\n v2Routes: typedRoutes\n .filter((route) => route.routev2)\n .map((route) => ({\n routev2: route.routev2 as V2Route<Currency, Currency>,\n inputAmount: route.inputAmount,\n outputAmount: route.outputAmount,\n })),\n v3Routes: typedRoutes\n .filter((route) => route.routev3)\n .map((route) => ({\n routev3: route.routev3 as V3Route<Currency, Currency>,\n inputAmount: route.inputAmount,\n outputAmount: route.outputAmount,\n })),\n v4Routes: typedRoutes\n .filter((route) => route.routev4)\n .map((route) => ({\n routev4: route.routev4 as V4Route<Currency, Currency>,\n inputAmount: route.inputAmount,\n outputAmount: route.outputAmount,\n })),\n mixedRoutes: typedRoutes\n .filter((route) => route.mixedRoute)\n .map((route) => ({\n mixedRoute: route.mixedRoute as MixedRouteSDK<Currency, Currency>,\n inputAmount: route.inputAmount,\n outputAmount: route.outputAmount,\n })),\n tradeType: quote.tradeType,\n })\n }\n\n private static toCurrency(isNative: boolean, token: TokenInRoute): Currency {\n if (isNative) {\n return Ether.onChain(token.chainId)\n }\n return this.toToken(token)\n }\n\n private static toPoolOrPair = (pool: V4PoolInRoute | V3PoolInRoute | V2PoolInRoute): V4Pool | V3Pool | Pair => {\n switch (pool.type) {\n case PoolType.V4Pool:\n return RouterTradeAdapter.toV4Pool(pool)\n case PoolType.V3Pool:\n return RouterTradeAdapter.toV3Pool(pool)\n case PoolType.V2Pool:\n return RouterTradeAdapter.toPair(pool)\n default:\n throw new Error('Invalid pool type')\n }\n }\n\n private static toToken(token: TokenInRoute): Token {\n const { chainId, address, decimals, symbol, buyFeeBps, sellFeeBps } = token\n return new Token(\n chainId,\n address,\n parseInt(decimals.toString()),\n symbol,\n /* name */ undefined,\n false,\n buyFeeBps ? BigNumber.from(buyFeeBps) : undefined,\n sellFeeBps ? BigNumber.from(sellFeeBps) : undefined\n )\n }\n\n private static toV3Pool({ fee, sqrtRatioX96, liquidity, tickCurrent, tokenIn, tokenOut }: V3PoolInRoute): V3Pool {\n return new V3Pool(\n RouterTradeAdapter.toToken(tokenIn),\n RouterTradeAdapter.toToken(tokenOut),\n parseInt(fee) as FeeAmount,\n sqrtRatioX96,\n liquidity,\n parseInt(tickCurrent)\n )\n }\n\n private static toV4Pool(pool: V4PoolInRoute): V4Pool {\n const parsedCurrencyIn = RouterTradeAdapter.toCurrency(isNativeCurrency(pool.tokenIn.address), pool.tokenIn)\n const parsedCurrencyOut = RouterTradeAdapter.toCurrency(isNativeCurrency(pool.tokenOut.address), pool.tokenOut)\n return new V4Pool(\n parsedCurrencyIn,\n parsedCurrencyOut,\n parseInt(pool.fee) as FeeAmount,\n parseInt(pool.tickSpacing),\n pool.hooks,\n pool.sqrtRatioX96,\n pool.liquidity,\n parseInt(pool.tickCurrent)\n )\n }\n\n private static toPair = ({ reserve0, reserve1 }: V2PoolInRoute): Pair => {\n return new Pair(\n CurrencyAmount.fromRawAmount(RouterTradeAdapter.toToken(reserve0.token), reserve0.quotient),\n CurrencyAmount.fromRawAmount(RouterTradeAdapter.toToken(reserve1.token), reserve1.quotient)\n )\n }\n\n private static isVersionedRoute<T extends V2PoolInRoute | V3PoolInRoute | V4PoolInRoute>(\n type: PoolType,\n route: (V3PoolInRoute | V2PoolInRoute | V4PoolInRoute)[]\n ): route is T[] {\n return route.every((pool) => pool.type === type)\n }\n}\n","import invariant from 'tiny-invariant'\nimport { BigNumberish } from 'ethers'\nimport { RoutePlanner, CommandType } from '../../utils/routerCommands'\nimport { encodeInputTokenOptions, Permit2Permit } from '../../utils/inputTokens'\nimport { Command, RouterActionType, TradeConfig } from '../Command'\nimport { ROUTER_AS_RECIPIENT, WETH_ADDRESS } from '../../utils/constants'\n\nexport class UnwrapWETH implements Command {\n readonly tradeType: RouterActionType = RouterActionType.UnwrapWETH\n readonly permit2Data?: Permit2Permit\n readonly wethAddress: string\n readonly amount: BigNumberish\n\n constructor(amount: BigNumberish, chainId: number, permit2?: Permit2Permit) {\n this.wethAddress = WETH_ADDRESS(chainId)\n this.amount = amount\n\n if (!!permit2) {\n invariant(\n permit2.details.token.toLowerCase() === this.wethAddress.toLowerCase(),\n `must be permitting WETH address: ${this.wethAddress}`\n )\n invariant(permit2.details.amount >= amount, `Did not permit enough WETH for unwrapWETH transaction`)\n this.permit2Data = permit2\n }\n }\n\n encode(planner: RoutePlanner, _: TradeConfig): void {\n encodeInputTokenOptions(planner, {\n permit2Permit: this.permit2Data,\n permit2TransferFrom: {\n token: this.wethAddress,\n amount: this.amount.toString(),\n },\n })\n planner.addCommand(CommandType.UNWRAP_WETH, [ROUTER_AS_RECIPIENT, this.amount])\n }\n}\n","import { ethers } from 'ethers'\nimport { abi } from '@uniswap/universal-router/artifacts/contracts/UniversalRouter.sol/UniversalRouter.json'\nimport { Interface } from '@ethersproject/abi'\nimport { V4BaseActionsParser, V4RouterAction } from '@uniswap/v4-sdk'\nimport { CommandType, CommandDefinition, COMMAND_DEFINITION, Subparser, Parser } from '../utils/routerCommands'\n\nexport type Param = {\n readonly name: string\n readonly value: any\n}\n\nexport type UniversalRouterCommand = {\n readonly commandName: string\n readonly commandType: CommandType\n readonly params: readonly Param[]\n}\n\nexport type UniversalRouterCall = {\n readonly commands: readonly UniversalRouterCommand[]\n}\n\nexport type V3PathItem = {\n readonly tokenIn: string\n readonly tokenOut: string\n readonly fee: number\n}\n\nexport interface CommandsDefinition {\n [key: number]: CommandDefinition\n}\n\n// Parses UniversalRouter V2 commands\nexport abstract class CommandParser {\n public static INTERFACE: Interface = new Interface(abi)\n\n public static parseCalldata(calldata: string): UniversalRouterCall {\n const genericParser = new GenericCommandParser(COMMAND_DEFINITION)\n const txDescription = CommandParser.INTERFACE.parseTransaction({ data: calldata })\n const { commands, inputs } = txDescription.args\n return genericParser.parse(commands, inputs)\n }\n}\n\n// Parses commands based on given command definition\nexport class GenericCommandParser {\n constructor(private readonly commandDefinition: CommandsDefinition) {}\n\n public parse(commands: string, inputs: string[]): UniversalRouterCall {\n const commandTypes = GenericCommandParser.getCommands(commands)\n\n return {\n commands: commandTypes.map((commandType: CommandType, i: number) => {\n const commandDef = this.commandDefinition[commandType]\n\n if (commandDef.parser === Parser.V4Actions) {\n const { actions } = V4BaseActionsParser.parseCalldata(inputs[i])\n return {\n commandName: CommandType[commandType],\n commandType,\n params: v4RouterCallToParams(actions),\n }\n } else if (commandDef.parser === Parser.Abi) {\n const abiDef = commandDef.params\n const rawParams = ethers.utils.defaultAbiCoder.decode(\n abiDef.map((command) => command.type),\n inputs[i]\n )\n\n const params = rawParams.map((param: any, j: number) => {\n switch (abiDef[j].subparser) {\n case Subparser.V3PathExactIn:\n return {\n name: abiDef[j].name,\n value: parseV3PathExactIn(param),\n }\n case Subparser.V3PathExactOut:\n return {\n name: abiDef[j].name,\n value: parseV3PathExactOut(param),\n }\n default:\n return {\n name: abiDef[j].name,\n value: param,\n }\n }\n })\n return {\n commandName: CommandType[commandType],\n commandType,\n params,\n }\n } else if (commandDef.parser === Parser.V3Actions) {\n // TODO: implement better parsing here\n return {\n commandName: CommandType[commandType],\n commandType,\n params: inputs.map((input) => ({ name: 'command', value: input })),\n }\n } else {\n throw new Error(`Unsupported parser: ${commandDef}`)\n }\n }),\n }\n }\n\n // parse command types from bytes string\n private static getCommands(commands: string): CommandType[] {\n const commandTypes = []\n\n for (let i = 2; i < commands.length; i += 2) {\n const byte = commands.substring(i, i + 2)\n commandTypes.push(parseInt(byte, 16) as CommandType)\n }\n\n return commandTypes\n }\n}\n\nexport function parseV3PathExactIn(path: string): readonly V3PathItem[] {\n const strippedPath = path.replace('0x', '')\n let tokenIn = ethers.utils.getAddress(strippedPath.substring(0, 40))\n let loc = 40\n const res = []\n while (loc < strippedPath.length) {\n const feeAndTokenOut = strippedPath.substring(loc, loc + 46)\n const fee = parseInt(feeAndTokenOut.substring(0, 6), 16)\n const tokenOut = ethers.utils.getAddress(feeAndTokenOut.substring(6, 46))\n\n res.push({\n tokenIn,\n tokenOut,\n fee,\n })\n tokenIn = tokenOut\n loc += 46\n }\n\n return res\n}\n\nexport function parseV3PathExactOut(path: string): readonly V3PathItem[] {\n const strippedPath = path.replace('0x', '')\n let tokenIn = ethers.utils.getAddress(strippedPath.substring(strippedPath.length - 40))\n let loc = strippedPath.length - 86 // 86 = (20 addr + 3 fee + 20 addr) * 2 (for hex characters)\n const res = []\n while (loc >= 0) {\n const feeAndTokenOut = strippedPath.substring(loc, loc + 46)\n const tokenOut = ethers.utils.getAddress(feeAndTokenOut.substring(0, 40))\n const fee = parseInt(feeAndTokenOut.substring(40, 46), 16)\n\n res.push({\n tokenIn,\n tokenOut,\n fee,\n })\n tokenIn = tokenOut\n\n loc -= 46\n }\n\n return res\n}\n\nfunction v4RouterCallToParams(actions: readonly V4RouterAction[]): readonly Param[] {\n return actions.map((action) => {\n return {\n name: action.actionName,\n value: action.params.map((param) => {\n return {\n name: param.name,\n value: param.value,\n }\n }),\n }\n })\n}\n"],"names":["CommandType","Subparser","Parser","RouterActionType","UniversalRouterVersion","REVERTIBLE_COMMANDS","Set","EXECUTE_SUB_PLAN","COMMAND_DEFINITION","_COMMAND_DEFINITION","parser","Abi","params","name","type","PERMIT2_PERMIT","PERMIT2_PERMIT_BATCH","PERMIT2_TRANSFER_FROM","PERMIT2_TRANSFER_FROM_BATCH","PERMIT2_TRANSFER_FROM_STRUCT","V3_SWAP_EXACT_IN","subparser","V3PathExactIn","V3_SWAP_EXACT_OUT","V3PathExactOut","V2_SWAP_EXACT_IN","V2_SWAP_EXACT_OUT","V4_SWAP","V4Actions","WRAP_ETH","UNWRAP_WETH","SWEEP","TRANSFER","PAY_PORTION","BALANCE_CHECK_ERC20","V4_INITIALIZE_POOL","V3_POSITION_MANAGER_PERMIT","V3Actions","V3_POSITION_MANAGER_CALL","V4_POSITION_MANAGER_CALL","RoutePlanner","this","commands","inputs","_proto","prototype","addSubPlan","subplan","addCommand","parameters","allowRevert","command","commandDef","encodedInput","defaultAbiCoder","encode","map","abi","createCommand","push","has","Error","concat","toString","padStart","getPathCurrency","currency","pool","involvesToken","wrapped","V4Pool","token0","equals","token1","symbol","CHAIN_CONFIGS","_CHAIN_CONFIGS","weth","routerConfigs","_routerConfigs","V1_2","address","creationBlock","V2_0","_routerConfigs2","_routerConfigs3","_routerConfigs4","_routerConfigs5","_routerConfigs6","_routerConfigs7","_routerConfigs8","_routerConfigs9","_routerConfigs10","_routerConfigs11","_routerConfigs12","_routerConfigs13","_routerConfigs14","_routerConfigs15","_routerConfigs16","_routerConfigs17","_routerConfigs18","_routerConfigs19","_routerConfigs20","_routerConfigs21","_routerConfigs22","_routerConfigs23","_routerConfigs24","UNIVERSAL_ROUTER_ADDRESS","version","chainId","WETH_ADDRESS","CONTRACT_BALANCE","BigNumber","from","pow","ETH_ADDRESS","SENDER_AS_RECIPIENT","ROUTER_AS_RECIPIENT","getCurrencyAddress","isNative","REFUND_ETH_PRICE_IMPACT_THRESHOLD","Percent","UniswapTrade","trade","options","fee","flatFee","payerIsUser","inputRequiresWrap","inputRequiresUnwrap","useRouterBalance","planner","_config","maximumAmountIn","slippageTolerance","quotient","inputAmount","recipient","_this$options$recipie","swapOptions","_step","routerMustCustody","tradeType","TradeType","EXACT_INPUT","routes","length","outputRequiresTransition","_iterator","_createForOfIteratorHelperLoose","swaps","done","swap","value","route","protocol","Protocol","V2","addV2Swap","V3","addV3Swap","V4","addV4Swap","MIXED","addMixedSwap","minimumAmountOut","pools","pathOutputCurrencyAddress","outputAmount","feeBips","toHex","multiply","EXACT_OUTPUT","sub","mul","div","feeAmount","amount","lt","outputRequiresUnwrap","outputRequiresWrap","priceImpact","greaterThan","safeMode","key","get","_step2","result","_iterator2","isAllV4","pathInput","pathOutput","_ref","V2Trade","path","token","_ref2","V3Trade","createUncheckedTrade","encodeRouteToPath","_ref3","p","v4Route","V4Route","V4Trade","slippageToleranceOnSwap","undefined","v4Planner","V4Planner","addTrade","addSettle","addTake","_options$recipient","finalize","tradeRecipient","_options$recipient2","V3Pool","Pair","MixedRouteTrade","amountIn","amountOut","sections","partitionMixedRouteByProtocol","isLastSectionInRoute","i","inputToken","section","routePool","outputToken","getOutputOfPools","subRoute","MixedRoute","MixedRouteSDK","nextInputToken","swapRecipient","nextPool","liquidityToken","v4SubRoute","input","output","addAction","Actions","SWAP_EXACT_IN","currencyIn","encodeV4RouteToPath","amountOutMinimum","encodeMixedRouteToPath","encodePermit","permit2","signature","ethers","utils","arrayify","joinSignature","splitSignature","SwapRouter","swapCallParameters","trades","inputCurrency","inputTokenPermit","invariant","nativeCurrencyValue","encodePlan","deadline","deadlineOrPreviousBlockhash","migrateV3ToV4CallParameters","positionManagerOverride","v4Pool","outputPosition","v3Token0","inputPosition","v3Token1","v4PositionManagerAddress","CHAIN_TO_ADDRESSES_MAP","currency0","currency1","v3RemoveLiquidityOptions","liquidityPercentage","equalTo","burnToken","collectOptions","Object","keys","some","k","isMint","v4AddLiquidityOptions","migrate","createPool","poolKey","getPoolKey","tickSpacing","hooks","sqrtRatioX96","permit","spender","tokenId","calldata","NonfungiblePositionManager","INTERFACE","encodeFunctionData","validateAndParseAddress","v","r","s","encodeV3PositionPermit","v3RemoveParams","V3PositionManager","removeCallParameters","Multicall","decodeMulticall","v3Call","selector","slice","getSighash","v4AddParams","V4PositionManager","addCallParameters","config","toHexString","Interface","PoolType","UnwrapWETH","wethAddress","details","toLowerCase","permit2Data","_","permit2TransferFrom","permit2Permit","encodeInputTokenOptions","isNativeCurrency","RouterTradeAdapter","fromClassicQuote","quote","tokenIn","tokenOut","firstRoute","tokenInData","tokenOutData","parsedCurrencyIn","toCurrency","parsedCurrencyOut","typedRoutes","rawAmountIn","rawAmountOut","CurrencyAmount","fromRawAmount","isOnlyV2","isVersionedRoute","V2Pool","isOnlyV3","isOnlyV4","routev4","toV4Pool","routev3","V3Route","toV3Pool","routev2","V2Route","toPair","mixedRoute","toPoolOrPair","RouterTrade","v2Routes","filter","v3Routes","v4Routes","mixedRoutes","Ether","onChain","toToken","buyFeeBps","sellFeeBps","Token","parseInt","decimals","liquidity","tickCurrent","every","reserve0","reserve1","CommandParser","parseCalldata","genericParser","GenericCommandParser","_txDescription$args","parseTransaction","data","args","parse","commandDefinition","getCommands","commandType","actions","_this","_V4BaseActionsParser$","V4BaseActionsParser","commandName","action","actionName","param","abiDef","decode","j","parseV3PathExactIn","parseV3PathExactOut","commandTypes","byte","substring","strippedPath","replace","getAddress","loc","res","feeAndTokenOut"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"universal-router-sdk.cjs.production.min.js","sources":["../src/utils/routerCommands.ts","../src/entities/Command.ts","../src/utils/constants.ts","../src/utils/pathCurrency.ts","../src/utils/getCurrencyAddress.ts","../src/entities/actions/uniswap.ts","../src/utils/numbers.ts","../src/utils/inputTokens.ts","../src/swapRouter.ts","../src/utils/routerTradeAdapter.ts","../src/entities/actions/unwrapWETH.ts","../src/utils/commandParser.ts"],"sourcesContent":["import { defaultAbiCoder } from 'ethers/lib/utils'\n\n/**\n * CommandTypes\n * @description Flags that modify a command's execution\n * @enum {number}\n */\nexport enum CommandType {\n V3_SWAP_EXACT_IN = 0x00,\n V3_SWAP_EXACT_OUT = 0x01,\n PERMIT2_TRANSFER_FROM = 0x02,\n PERMIT2_PERMIT_BATCH = 0x03,\n SWEEP = 0x04,\n TRANSFER = 0x05,\n PAY_PORTION = 0x06,\n\n V2_SWAP_EXACT_IN = 0x08,\n V2_SWAP_EXACT_OUT = 0x09,\n PERMIT2_PERMIT = 0x0a,\n WRAP_ETH = 0x0b,\n UNWRAP_WETH = 0x0c,\n PERMIT2_TRANSFER_FROM_BATCH = 0x0d,\n BALANCE_CHECK_ERC20 = 0x0e,\n\n V4_SWAP = 0x10,\n V3_POSITION_MANAGER_PERMIT = 0x11,\n V3_POSITION_MANAGER_CALL = 0x12,\n V4_INITIALIZE_POOL = 0x13,\n V4_POSITION_MANAGER_CALL = 0x14,\n\n EXECUTE_SUB_PLAN = 0x21,\n}\n\nexport enum Subparser {\n V3PathExactIn,\n V3PathExactOut,\n}\n\nexport enum Parser {\n Abi,\n V4Actions,\n V3Actions,\n}\n\nexport type ParamType = {\n readonly name: string\n readonly type: string\n readonly subparser?: Subparser\n}\n\nexport type CommandDefinition =\n | {\n parser: Parser.Abi\n params: ParamType[]\n }\n | {\n parser: Parser.V4Actions\n }\n | {\n parser: Parser.V3Actions\n }\n\nconst ALLOW_REVERT_FLAG = 0x80\nconst REVERTIBLE_COMMANDS = new Set<CommandType>([CommandType.EXECUTE_SUB_PLAN])\n\nconst PERMIT_STRUCT =\n '((address token,uint160 amount,uint48 expiration,uint48 nonce) details,address spender,uint256 sigDeadline)'\n\nconst PERMIT_BATCH_STRUCT =\n '((address token,uint160 amount,uint48 expiration,uint48 nonce)[] details,address spender,uint256 sigDeadline)'\n\nconst POOL_KEY_STRUCT = '(address currency0,address currency1,uint24 fee,int24 tickSpacing,address hooks)'\n\nconst PERMIT2_TRANSFER_FROM_STRUCT = '(address from,address to,uint160 amount,address token)'\nconst PERMIT2_TRANSFER_FROM_BATCH_STRUCT = PERMIT2_TRANSFER_FROM_STRUCT + '[]'\n\nexport const COMMAND_DEFINITION: { [key in CommandType]: CommandDefinition } = {\n // Batch Reverts\n [CommandType.EXECUTE_SUB_PLAN]: {\n parser: Parser.Abi,\n params: [\n { name: 'commands', type: 'bytes' },\n { name: 'inputs', type: 'bytes[]' },\n ],\n },\n\n // Permit2 Actions\n [CommandType.PERMIT2_PERMIT]: {\n parser: Parser.Abi,\n params: [\n { name: 'permit', type: PERMIT_STRUCT },\n { name: 'signature', type: 'bytes' },\n ],\n },\n [CommandType.PERMIT2_PERMIT_BATCH]: {\n parser: Parser.Abi,\n params: [\n { name: 'permit', type: PERMIT_BATCH_STRUCT },\n { name: 'signature', type: 'bytes' },\n ],\n },\n [CommandType.PERMIT2_TRANSFER_FROM]: {\n parser: Parser.Abi,\n params: [\n { name: 'token', type: 'address' },\n { name: 'recipient', type: 'address' },\n { name: 'amount', type: 'uint160' },\n ],\n },\n [CommandType.PERMIT2_TRANSFER_FROM_BATCH]: {\n parser: Parser.Abi,\n params: [\n {\n name: 'transferFrom',\n type: PERMIT2_TRANSFER_FROM_BATCH_STRUCT,\n },\n ],\n },\n\n // Uniswap Actions\n [CommandType.V3_SWAP_EXACT_IN]: {\n parser: Parser.Abi,\n params: [\n { name: 'recipient', type: 'address' },\n { name: 'amountIn', type: 'uint256' },\n { name: 'amountOutMin', type: 'uint256' },\n { name: 'path', subparser: Subparser.V3PathExactIn, type: 'bytes' },\n { name: 'payerIsUser', type: 'bool' },\n ],\n },\n [CommandType.V3_SWAP_EXACT_OUT]: {\n parser: Parser.Abi,\n params: [\n { name: 'recipient', type: 'address' },\n { name: 'amountOut', type: 'uint256' },\n { name: 'amountInMax', type: 'uint256' },\n { name: 'path', subparser: Subparser.V3PathExactOut, type: 'bytes' },\n { name: 'payerIsUser', type: 'bool' },\n ],\n },\n [CommandType.V2_SWAP_EXACT_IN]: {\n parser: Parser.Abi,\n params: [\n { name: 'recipient', type: 'address' },\n { name: 'amountIn', type: 'uint256' },\n { name: 'amountOutMin', type: 'uint256' },\n { name: 'path', type: 'address[]' },\n { name: 'payerIsUser', type: 'bool' },\n ],\n },\n [CommandType.V2_SWAP_EXACT_OUT]: {\n parser: Parser.Abi,\n params: [\n { name: 'recipient', type: 'address' },\n { name: 'amountOut', type: 'uint256' },\n { name: 'amountInMax', type: 'uint256' },\n { name: 'path', type: 'address[]' },\n { name: 'payerIsUser', type: 'bool' },\n ],\n },\n [CommandType.V4_SWAP]: { parser: Parser.V4Actions },\n\n // Token Actions and Checks\n [CommandType.WRAP_ETH]: {\n parser: Parser.Abi,\n params: [\n { name: 'recipient', type: 'address' },\n { name: 'amount', type: 'uint256' },\n ],\n },\n [CommandType.UNWRAP_WETH]: {\n parser: Parser.Abi,\n params: [\n { name: 'recipient', type: 'address' },\n { name: 'amountMin', type: 'uint256' },\n ],\n },\n [CommandType.SWEEP]: {\n parser: Parser.Abi,\n params: [\n { name: 'token', type: 'address' },\n { name: 'recipient', type: 'address' },\n { name: 'amountMin', type: 'uint256' },\n ],\n },\n [CommandType.TRANSFER]: {\n parser: Parser.Abi,\n params: [\n { name: 'token', type: 'address' },\n { name: 'recipient', type: 'address' },\n { name: 'value', type: 'uint256' },\n ],\n },\n [CommandType.PAY_PORTION]: {\n parser: Parser.Abi,\n params: [\n { name: 'token', type: 'address' },\n { name: 'recipient', type: 'address' },\n { name: 'bips', type: 'uint256' },\n ],\n },\n [CommandType.BALANCE_CHECK_ERC20]: {\n parser: Parser.Abi,\n params: [\n { name: 'owner', type: 'address' },\n { name: 'token', type: 'address' },\n { name: 'minBalance', type: 'uint256' },\n ],\n },\n [CommandType.V4_INITIALIZE_POOL]: {\n parser: Parser.Abi,\n params: [\n { name: 'poolKey', type: POOL_KEY_STRUCT },\n { name: 'sqrtPriceX96', type: 'uint160' },\n ],\n },\n\n // Position Actions\n [CommandType.V3_POSITION_MANAGER_PERMIT]: { parser: Parser.V3Actions },\n [CommandType.V3_POSITION_MANAGER_CALL]: { parser: Parser.V3Actions },\n [CommandType.V4_POSITION_MANAGER_CALL]: { parser: Parser.V4Actions },\n}\n\nexport class RoutePlanner {\n commands: string\n inputs: string[]\n\n constructor() {\n this.commands = '0x'\n this.inputs = []\n }\n\n addSubPlan(subplan: RoutePlanner): RoutePlanner {\n this.addCommand(CommandType.EXECUTE_SUB_PLAN, [subplan.commands, subplan.inputs], true)\n return this\n }\n\n addCommand(type: CommandType, parameters: any[], allowRevert = false): RoutePlanner {\n let command = createCommand(type, parameters)\n this.inputs.push(command.encodedInput)\n if (allowRevert) {\n if (!REVERTIBLE_COMMANDS.has(command.type)) {\n throw new Error(`command type: ${command.type} cannot be allowed to revert`)\n }\n command.type = command.type | ALLOW_REVERT_FLAG\n }\n\n this.commands = this.commands.concat(command.type.toString(16).padStart(2, '0'))\n return this\n }\n}\n\nexport type RouterCommand = {\n type: CommandType\n encodedInput: string\n}\n\nexport function createCommand(type: CommandType, parameters: any[]): RouterCommand {\n const commandDef = COMMAND_DEFINITION[type]\n switch (commandDef.parser) {\n case Parser.Abi:\n const encodedInput = defaultAbiCoder.encode(\n commandDef.params.map((abi) => abi.type),\n parameters\n )\n return { type, encodedInput }\n case Parser.V4Actions:\n // v4 swap data comes pre-encoded at index 0\n return { type, encodedInput: parameters[0] }\n case Parser.V3Actions:\n // v4 swap data comes pre-encoded at index 0\n return { type, encodedInput: parameters[0] }\n }\n}\n","import { RoutePlanner } from '../utils/routerCommands'\n\nexport type TradeConfig = {\n allowRevert: boolean\n}\n\nexport enum RouterActionType {\n UniswapTrade = 'UniswapTrade',\n UnwrapWETH = 'UnwrapWETH',\n}\n\n// interface for entities that can be encoded as a Universal Router command\nexport interface Command {\n tradeType: RouterActionType\n encode(planner: RoutePlanner, config: TradeConfig): void\n}\n","import { BigNumber } from 'ethers'\n\nexport enum UniversalRouterVersion {\n V1_2 = '1.2',\n V2_0 = '2.0',\n}\n\nexport type RouterConfig = {\n address: string\n creationBlock: number\n}\n\ntype ChainConfig = {\n weth: string\n routerConfigs: { [key in UniversalRouterVersion]: RouterConfig }\n}\n\nconst WETH_NOT_SUPPORTED_ON_CHAIN = '0x0000000000000000000000000000000000000000'\n\n// Todo: Change `CHAIN_CONFIGS` to pull the UR address with v4\nexport const CHAIN_CONFIGS: { [key: number]: ChainConfig } = {\n // mainnet\n [1]: {\n weth: '0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2',\n routerConfigs: {\n [UniversalRouterVersion.V1_2]: {\n address: '0x3fC91A3afd70395Cd496C647d5a6CC9D4B2b7FAD',\n creationBlock: 17143817,\n },\n [UniversalRouterVersion.V2_0]: {\n address: '0x66a9893cc07d91d95644aedd05d03f95e1dba8af',\n creationBlock: 1737658355,\n },\n },\n },\n // goerli\n [5]: {\n weth: '0xb4fbf271143f4fbf7b91a5ded31805e42b2208d6',\n routerConfigs: {\n [UniversalRouterVersion.V1_2]: {\n address: '0x3fC91A3afd70395Cd496C647d5a6CC9D4B2b7FAD',\n creationBlock: 8940568,\n },\n [UniversalRouterVersion.V2_0]: {\n address: '0x3fC91A3afd70395Cd496C647d5a6CC9D4B2b7FAD',\n creationBlock: 8940568,\n },\n },\n },\n // sepolia\n [11155111]: {\n weth: '0xfFf9976782d46CC05630D1f6eBAb18b2324d6B14',\n routerConfigs: {\n [UniversalRouterVersion.V1_2]: {\n address: '0x3fC91A3afd70395Cd496C647d5a6CC9D4B2b7FAD',\n creationBlock: 3543575,\n },\n [UniversalRouterVersion.V2_0]: {\n address: '0x3a9d48ab9751398bbfa63ad67599bb04e4bdf98b', // only update here and creation block below\n creationBlock: 7259601,\n },\n },\n },\n // polygon\n [137]: {\n weth: '0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270',\n routerConfigs: {\n [UniversalRouterVersion.V1_2]: {\n address: '0xec7BE89e9d109e7e3Fec59c222CF297125FEFda2',\n creationBlock: 52210153,\n },\n [UniversalRouterVersion.V2_0]: {\n address: '0x1095692a6237d83c6a72f3f5efedb9a670c49223',\n creationBlock: 1737492197,\n },\n },\n },\n //polygon mumbai\n [80001]: {\n weth: '0x9c3C9283D3e44854697Cd22D3Faa240Cfb032889',\n routerConfigs: {\n [UniversalRouterVersion.V1_2]: {\n address: '0x3fC91A3afd70395Cd496C647d5a6CC9D4B2b7FAD',\n creationBlock: 35176052,\n },\n [UniversalRouterVersion.V2_0]: {\n address: '0x3fC91A3afd70395Cd496C647d5a6CC9D4B2b7FAD',\n creationBlock: 35176052,\n },\n },\n },\n //optimism\n [10]: {\n weth: '0x4200000000000000000000000000000000000006',\n routerConfigs: {\n [UniversalRouterVersion.V1_2]: {\n address: '0xCb1355ff08Ab38bBCE60111F1bb2B784bE25D7e8',\n creationBlock: 114702266,\n },\n [UniversalRouterVersion.V2_0]: {\n address: '0x851116d9223fabed8e56c0e6b8ad0c31d98b3507',\n creationBlock: 1737494278,\n },\n },\n },\n // optimism goerli\n [420]: {\n weth: '0x4200000000000000000000000000000000000006',\n routerConfigs: {\n [UniversalRouterVersion.V1_2]: {\n address: '0x3fC91A3afd70395Cd496C647d5a6CC9D4B2b7FAD',\n creationBlock: 8887728,\n },\n [UniversalRouterVersion.V2_0]: {\n address: '0x3fC91A3afd70395Cd496C647d5a6CC9D4B2b7FAD',\n creationBlock: 8887728,\n },\n },\n },\n // arbitrum\n [42161]: {\n weth: '0x82aF49447D8a07e3bd95BD0d56f35241523fBab1',\n routerConfigs: {\n [UniversalRouterVersion.V1_2]: {\n address: '0x5E325eDA8064b456f4781070C0738d849c824258',\n creationBlock: 169472836,\n },\n [UniversalRouterVersion.V2_0]: {\n address: '0xa51afafe0263b40edaef0df8781ea9aa03e381a3',\n creationBlock: 1737487458,\n },\n },\n },\n // arbitrum goerli\n [421613]: {\n weth: '0xe39Ab88f8A4777030A534146A9Ca3B52bd5D43A3',\n routerConfigs: {\n [UniversalRouterVersion.V1_2]: {\n address: '0x3fC91A3afd70395Cd496C647d5a6CC9D4B2b7FAD',\n creationBlock: 18815277,\n },\n [UniversalRouterVersion.V2_0]: {\n address: '0x3fC91A3afd70395Cd496C647d5a6CC9D4B2b7FAD',\n creationBlock: 18815277,\n },\n },\n },\n // celo\n [42220]: {\n weth: WETH_NOT_SUPPORTED_ON_CHAIN,\n routerConfigs: {\n [UniversalRouterVersion.V1_2]: {\n address: '0x643770e279d5d0733f21d6dc03a8efbabf3255b4',\n creationBlock: 21407637,\n },\n [UniversalRouterVersion.V2_0]: {\n address: '0x643770e279d5d0733f21d6dc03a8efbabf3255b4',\n creationBlock: 21407637,\n },\n },\n },\n // celo alfajores\n [44787]: {\n weth: WETH_NOT_SUPPORTED_ON_CHAIN,\n routerConfigs: {\n [UniversalRouterVersion.V1_2]: {\n address: '0x3fC91A3afd70395Cd496C647d5a6CC9D4B2b7FAD',\n creationBlock: 17566658,\n },\n [UniversalRouterVersion.V2_0]: {\n address: '0x3fC91A3afd70395Cd496C647d5a6CC9D4B2b7FAD',\n creationBlock: 17566658,\n },\n },\n },\n // binance smart chain\n [56]: {\n weth: '0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c',\n routerConfigs: {\n [UniversalRouterVersion.V1_2]: {\n address: '0x4Dae2f939ACf50408e13d58534Ff8c2776d45265',\n creationBlock: 35160263,\n },\n [UniversalRouterVersion.V2_0]: {\n address: '0x1906c1d672b88cd1b9ac7593301ca990f94eae07',\n creationBlock: 1737493275,\n },\n },\n },\n // avalanche\n [43114]: {\n weth: '0xB31f66AA3C1e785363F0875A1B74E27b85FD66c7',\n routerConfigs: {\n [UniversalRouterVersion.V1_2]: {\n address: '0x4Dae2f939ACf50408e13d58534Ff8c2776d45265',\n creationBlock: 40237257,\n },\n [UniversalRouterVersion.V2_0]: {\n address: '0x94b75331ae8d42c1b61065089b7d48fe14aa73b7',\n creationBlock: 1737558236,\n },\n },\n },\n // base goerli\n [84531]: {\n weth: '0x4200000000000000000000000000000000000006',\n routerConfigs: {\n [UniversalRouterVersion.V1_2]: {\n address: '0xd0872d928672ae2ff74bdb2f5130ac12229cafaf',\n creationBlock: 6915289,\n },\n [UniversalRouterVersion.V2_0]: {\n address: '0xd0872d928672ae2ff74bdb2f5130ac12229cafaf',\n creationBlock: 6915289,\n },\n },\n },\n // base mainnet\n [8453]: {\n weth: '0x4200000000000000000000000000000000000006',\n routerConfigs: {\n [UniversalRouterVersion.V1_2]: {\n address: '0x3fC91A3afd70395Cd496C647d5a6CC9D4B2b7FAD',\n creationBlock: 9107268,\n },\n [UniversalRouterVersion.V2_0]: {\n address: '0x6ff5693b99212da76ad316178a184ab56d299b43',\n creationBlock: 1737491485,\n },\n },\n },\n // blast\n [81457]: {\n weth: '0x4300000000000000000000000000000000000004',\n routerConfigs: {\n [UniversalRouterVersion.V1_2]: {\n address: '0x643770E279d5D0733F21d6DC03A8efbABf3255B4',\n creationBlock: 1116444,\n },\n [UniversalRouterVersion.V2_0]: {\n address: '0xeabbcb3e8e415306207ef514f660a3f820025be3',\n creationBlock: 1737564586,\n },\n },\n },\n // zora\n [7777777]: {\n weth: '0x4200000000000000000000000000000000000006',\n routerConfigs: {\n [UniversalRouterVersion.V1_2]: {\n address: '0x2986d9721A49838ab4297b695858aF7F17f38014',\n creationBlock: 11832155,\n },\n [UniversalRouterVersion.V2_0]: {\n address: '0x3315ef7ca28db74abadc6c44570efdf06b04b020',\n creationBlock: 1737562927,\n },\n },\n },\n [324]: {\n weth: '0x5aea5775959fbc2557cc8789bc1bf90a239d9a91',\n routerConfigs: {\n [UniversalRouterVersion.V1_2]: {\n address: '0x28731BCC616B5f51dD52CF2e4dF0E78dD1136C06',\n creationBlock: 12640979,\n },\n [UniversalRouterVersion.V2_0]: {\n address: '0x28731BCC616B5f51dD52CF2e4dF0E78dD1136C06',\n creationBlock: 12640979,\n },\n },\n },\n // worldchain\n [480]: {\n weth: '0x4200000000000000000000000000000000000006',\n routerConfigs: {\n [UniversalRouterVersion.V1_2]: {\n address: '0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D',\n creationBlock: 4063979,\n },\n [UniversalRouterVersion.V2_0]: {\n address: '0x8ac7bee993bb44dab564ea4bc9ea67bf9eb5e743',\n creationBlock: 1737559557,\n },\n },\n },\n [1301]: {\n weth: '0x4200000000000000000000000000000000000006',\n routerConfigs: {\n [UniversalRouterVersion.V1_2]: {\n address: '0x8909Dc15e40173Ff4699343b6eB8132c65e18eC6',\n creationBlock: 1241811,\n },\n [UniversalRouterVersion.V2_0]: {\n address: '0xf70536b3bcc1bd1a972dc186a2cf84cc6da6be5d',\n creationBlock: 7100543,\n },\n },\n },\n // unichain mainnet\n [130]: {\n weth: '0x4200000000000000000000000000000000000006',\n routerConfigs: {\n [UniversalRouterVersion.V1_2]: {\n address: '0x4D73A4411CA1c660035e4AECC8270E5DdDEC8C17',\n creationBlock: 23678,\n },\n [UniversalRouterVersion.V2_0]: {\n address: '0xef740bf23acae26f6492b10de645d6b98dc8eaf3',\n creationBlock: 1737568156,\n },\n },\n },\n [10143]: {\n weth: '0x760AfE86e5de5fa0Ee542fc7B7B713e1c5425701',\n routerConfigs: {\n [UniversalRouterVersion.V1_2]: {\n address: '0x3ae6d8a282d67893e17aa70ebffb33ee5aa65893',\n creationBlock: 23678,\n },\n [UniversalRouterVersion.V2_0]: {\n address: '0x3ae6d8a282d67893e17aa70ebffb33ee5aa65893',\n creationBlock: 23678,\n },\n },\n },\n [84532]: {\n weth: '0x4200000000000000000000000000000000000006',\n routerConfigs: {\n [UniversalRouterVersion.V1_2]: {\n address: '0x492e6456d9528771018deb9e87ef7750ef184104',\n creationBlock: 20216585,\n },\n [UniversalRouterVersion.V2_0]: {\n address: '0x492e6456d9528771018deb9e87ef7750ef184104',\n creationBlock: 20216585,\n },\n },\n },\n [1868]: {\n weth: '0x4200000000000000000000000000000000000006',\n routerConfigs: {\n [UniversalRouterVersion.V1_2]: {\n address: '0x0e2850543f69f678257266e0907ff9a58b3f13de',\n creationBlock: 3254782,\n },\n [UniversalRouterVersion.V2_0]: {\n address: '0x0e2850543f69f678257266e0907ff9a58b3f13de',\n creationBlock: 3254782,\n },\n },\n },\n}\n\nexport const UNIVERSAL_ROUTER_ADDRESS = (version: UniversalRouterVersion, chainId: number): string => {\n if (!(chainId in CHAIN_CONFIGS)) throw new Error(`Universal Router not deployed on chain ${chainId}`)\n return CHAIN_CONFIGS[chainId].routerConfigs[version].address\n}\n\nexport const UNIVERSAL_ROUTER_CREATION_BLOCK = (version: UniversalRouterVersion, chainId: number): number => {\n if (!(chainId in CHAIN_CONFIGS)) throw new Error(`Universal Router not deployed on chain ${chainId}`)\n return CHAIN_CONFIGS[chainId].routerConfigs[version].creationBlock\n}\n\nexport const WETH_ADDRESS = (chainId: number): string => {\n if (!(chainId in CHAIN_CONFIGS)) throw new Error(`Universal Router not deployed on chain ${chainId}`)\n\n if (CHAIN_CONFIGS[chainId].weth == WETH_NOT_SUPPORTED_ON_CHAIN) throw new Error(`Chain ${chainId} does not have WETH`)\n\n return CHAIN_CONFIGS[chainId].weth\n}\n\nexport const CONTRACT_BALANCE = BigNumber.from(2).pow(255)\nexport const ETH_ADDRESS = '0x0000000000000000000000000000000000000000'\nexport const E_ETH_ADDRESS = '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee'\nexport const ZERO_ADDRESS = '0x0000000000000000000000000000000000000000'\nexport const MAX_UINT256 = BigNumber.from(2).pow(256).sub(1)\nexport const MAX_UINT160 = BigNumber.from(2).pow(160).sub(1)\n\nexport const SENDER_AS_RECIPIENT = '0x0000000000000000000000000000000000000001'\nexport const ROUTER_AS_RECIPIENT = '0x0000000000000000000000000000000000000002'\n","import { Currency, Token } from '@uniswap/sdk-core'\nimport { Pool as V4Pool } from '@uniswap/v4-sdk'\nimport { TPool } from '@uniswap/router-sdk'\n\nexport function getPathCurrency(currency: Currency, pool: TPool): Currency {\n // return currency if the currency matches a currency of the pool\n if (pool.involvesToken(currency as Token)) {\n return currency\n\n // return if currency.wrapped if pool involves wrapped currency\n } else if (pool.involvesToken(currency.wrapped as Token)) {\n return currency.wrapped\n\n // return native currency if pool involves native version of wrapped currency (only applies to V4)\n } else if (pool instanceof V4Pool && pool.token0.wrapped.equals(currency)) {\n return pool.token0\n } else if (pool instanceof V4Pool && pool.token1.wrapped.equals(currency)) {\n return pool.token1\n } else {\n throw new Error(`Expected currency ${currency.symbol} to be either ${pool.token0.symbol} or ${pool.token1.symbol}`)\n }\n\n return currency // this line needed for typescript to compile\n}\n","import { Currency } from '@uniswap/sdk-core'\nimport { ETH_ADDRESS } from './constants'\n\nexport function getCurrencyAddress(currency: Currency): string {\n return currency.isNative ? ETH_ADDRESS : currency.wrapped.address\n}\n","import { RoutePlanner, CommandType } from '../../utils/routerCommands'\nimport { Trade as V2Trade, Pair } from '@uniswap/v2-sdk'\nimport { Trade as V3Trade, Pool as V3Pool, encodeRouteToPath } from '@uniswap/v3-sdk'\nimport {\n Route as V4Route,\n Trade as V4Trade,\n Pool as V4Pool,\n V4Planner,\n encodeRouteToPath as encodeV4RouteToPath,\n Actions,\n} from '@uniswap/v4-sdk'\nimport {\n Trade as RouterTrade,\n MixedRouteTrade,\n Protocol,\n IRoute,\n RouteV2,\n RouteV3,\n MixedRouteSDK,\n MixedRoute,\n SwapOptions as RouterSwapOptions,\n getOutputOfPools,\n encodeMixedRouteToPath,\n partitionMixedRouteByProtocol,\n} from '@uniswap/router-sdk'\nimport { Permit2Permit } from '../../utils/inputTokens'\nimport { getPathCurrency } from '../../utils/pathCurrency'\nimport { Currency, TradeType, Token, CurrencyAmount, Percent } from '@uniswap/sdk-core'\nimport { Command, RouterActionType, TradeConfig } from '../Command'\nimport { SENDER_AS_RECIPIENT, ROUTER_AS_RECIPIENT, CONTRACT_BALANCE, ETH_ADDRESS } from '../../utils/constants'\nimport { getCurrencyAddress } from '../../utils/getCurrencyAddress'\nimport { encodeFeeBips } from '../../utils/numbers'\nimport { BigNumber, BigNumberish } from 'ethers'\nimport { TPool } from '@uniswap/router-sdk'\n\nexport type FlatFeeOptions = {\n amount: BigNumberish\n recipient: string\n}\n\n// the existing router permit object doesn't include enough data for permit2\n// so we extend swap options with the permit2 permit\n// when safe mode is enabled, the SDK will add an extra ETH sweep for security\n// when useRouterBalance is enabled the SDK will use the balance in the router for the swap\nexport type SwapOptions = Omit<RouterSwapOptions, 'inputTokenPermit'> & {\n useRouterBalance?: boolean\n inputTokenPermit?: Permit2Permit\n flatFee?: FlatFeeOptions\n safeMode?: boolean\n}\n\nconst REFUND_ETH_PRICE_IMPACT_THRESHOLD = new Percent(50, 100)\n\ninterface Swap<TInput extends Currency, TOutput extends Currency> {\n route: IRoute<TInput, TOutput, TPool>\n inputAmount: CurrencyAmount<TInput>\n outputAmount: CurrencyAmount<TOutput>\n}\n\n// Wrapper for uniswap router-sdk trade entity to encode swaps for Universal Router\n// also translates trade objects from previous (v2, v3) SDKs\nexport class UniswapTrade implements Command {\n readonly tradeType: RouterActionType = RouterActionType.UniswapTrade\n readonly payerIsUser: boolean\n\n constructor(public trade: RouterTrade<Currency, Currency, TradeType>, public options: SwapOptions) {\n if (!!options.fee && !!options.flatFee) throw new Error('Only one fee option permitted')\n\n if (this.inputRequiresWrap || this.inputRequiresUnwrap || this.options.useRouterBalance) {\n this.payerIsUser = false\n } else {\n this.payerIsUser = true\n }\n }\n\n get isAllV4(): boolean {\n let result = true\n for (const swap of this.trade.swaps) {\n result = result && swap.route.protocol == Protocol.V4\n }\n return result\n }\n\n get inputRequiresWrap(): boolean {\n if (this.isAllV4) {\n return (\n this.trade.inputAmount.currency.isNative &&\n !(this.trade.swaps[0].route as unknown as V4Route<Currency, Currency>).pathInput.isNative\n )\n } else {\n return this.trade.inputAmount.currency.isNative\n }\n }\n\n get inputRequiresUnwrap(): boolean {\n if (this.isAllV4) {\n return (\n !this.trade.inputAmount.currency.isNative &&\n (this.trade.swaps[0].route as unknown as V4Route<Currency, Currency>).pathInput.isNative\n )\n }\n return false\n }\n\n get outputRequiresWrap(): boolean {\n if (this.isAllV4) {\n return (\n !this.trade.outputAmount.currency.isNative &&\n (this.trade.swaps[0].route as unknown as V4Route<Currency, Currency>).pathOutput.isNative\n )\n }\n return false\n }\n\n get outputRequiresUnwrap(): boolean {\n if (this.isAllV4) {\n return (\n this.trade.outputAmount.currency.isNative &&\n !(this.trade.swaps[0].route as unknown as V4Route<Currency, Currency>).pathOutput.isNative\n )\n } else {\n return this.trade.outputAmount.currency.isNative\n }\n }\n\n get outputRequiresTransition(): boolean {\n return this.outputRequiresWrap || this.outputRequiresUnwrap\n }\n\n encode(planner: RoutePlanner, _config: TradeConfig): void {\n // If the input currency is the native currency, we need to wrap it with the router as the recipient\n if (this.inputRequiresWrap) {\n // TODO: optimize if only one v2 pool we can directly send this to the pool\n planner.addCommand(CommandType.WRAP_ETH, [\n ROUTER_AS_RECIPIENT,\n this.trade.maximumAmountIn(this.options.slippageTolerance).quotient.toString(),\n ])\n } else if (this.inputRequiresUnwrap) {\n // send wrapped token to router to unwrap\n planner.addCommand(CommandType.PERMIT2_TRANSFER_FROM, [\n (this.trade.inputAmount.currency as Token).address,\n ROUTER_AS_RECIPIENT,\n this.trade.maximumAmountIn(this.options.slippageTolerance).quotient.toString(),\n ])\n planner.addCommand(CommandType.UNWRAP_WETH, [ROUTER_AS_RECIPIENT, 0])\n }\n // The overall recipient at the end of the trade, SENDER_AS_RECIPIENT uses the msg.sender\n this.options.recipient = this.options.recipient ?? SENDER_AS_RECIPIENT\n\n // flag for whether we want to perform slippage check on aggregate output of multiple routes\n // 1. when there are >2 exact input trades. this is only a heuristic,\n // as it's still more gas-expensive even in this case, but has benefits\n // in that the reversion probability is lower\n const performAggregatedSlippageCheck =\n this.trade.tradeType === TradeType.EXACT_INPUT && this.trade.routes.length > 2\n const routerMustCustody =\n performAggregatedSlippageCheck || this.outputRequiresTransition || hasFeeOption(this.options)\n\n for (const swap of this.trade.swaps) {\n switch (swap.route.protocol) {\n case Protocol.V2:\n addV2Swap(planner, swap, this.trade.tradeType, this.options, this.payerIsUser, routerMustCustody)\n break\n case Protocol.V3:\n addV3Swap(planner, swap, this.trade.tradeType, this.options, this.payerIsUser, routerMustCustody)\n break\n case Protocol.V4:\n addV4Swap(planner, swap, this.trade.tradeType, this.options, this.payerIsUser, routerMustCustody)\n break\n case Protocol.MIXED:\n addMixedSwap(planner, swap, this.trade.tradeType, this.options, this.payerIsUser, routerMustCustody)\n break\n default:\n throw new Error('UNSUPPORTED_TRADE_PROTOCOL')\n }\n }\n\n let minimumAmountOut: BigNumber = BigNumber.from(\n this.trade.minimumAmountOut(this.options.slippageTolerance).quotient.toString()\n )\n // The router custodies for 3 reasons: to unwrap, to take a fee, and/or to do a slippage check\n if (routerMustCustody) {\n const pools = this.trade.swaps[0].route.pools\n const pathOutputCurrencyAddress = getCurrencyAddress(\n getPathCurrency(this.trade.outputAmount.currency, pools[pools.length - 1])\n )\n\n // If there is a fee, that percentage is sent to the fee recipient\n // In the case where ETH is the output currency, the fee is taken in WETH (for gas reasons)\n if (!!this.options.fee) {\n const feeBips = encodeFeeBips(this.options.fee.fee)\n planner.addCommand(CommandType.PAY_PORTION, [pathOutputCurrencyAddress, this.options.fee.recipient, feeBips])\n\n // If the trade is exact output, and a fee was taken, we must adjust the amount out to be the amount after the fee\n // Otherwise we continue as expected with the trade's normal expected output\n if (this.trade.tradeType === TradeType.EXACT_OUTPUT) {\n minimumAmountOut = minimumAmountOut.sub(minimumAmountOut.mul(feeBips).div(10000))\n }\n }\n\n // If there is a flat fee, that absolute amount is sent to the fee recipient\n // In the case where ETH is the output currency, the fee is taken in WETH (for gas reasons)\n if (!!this.options.flatFee) {\n const feeAmount = this.options.flatFee.amount\n if (minimumAmountOut.lt(feeAmount)) throw new Error('Flat fee amount greater than minimumAmountOut')\n\n planner.addCommand(CommandType.TRANSFER, [pathOutputCurrencyAddress, this.options.flatFee.recipient, feeAmount])\n\n // If the trade is exact output, and a fee was taken, we must adjust the amount out to be the amount after the fee\n // Otherwise we continue as expected with the trade's normal expected output\n if (this.trade.tradeType === TradeType.EXACT_OUTPUT) {\n minimumAmountOut = minimumAmountOut.sub(feeAmount)\n }\n }\n\n // The remaining tokens that need to be sent to the user after the fee is taken will be caught\n // by this if-else clause.\n if (this.outputRequiresUnwrap) {\n planner.addCommand(CommandType.UNWRAP_WETH, [this.options.recipient, minimumAmountOut])\n } else if (this.outputRequiresWrap) {\n planner.addCommand(CommandType.WRAP_ETH, [this.options.recipient, CONTRACT_BALANCE])\n } else {\n planner.addCommand(CommandType.SWEEP, [\n getCurrencyAddress(this.trade.outputAmount.currency),\n this.options.recipient,\n minimumAmountOut,\n ])\n }\n }\n\n // for exactOutput swaps with native input or that perform an inputToken transition (wrap or unwrap)\n // we need to send back the change to the user\n if (this.trade.tradeType === TradeType.EXACT_OUTPUT || riskOfPartialFill(this.trade)) {\n if (this.inputRequiresWrap) {\n planner.addCommand(CommandType.UNWRAP_WETH, [this.options.recipient, 0])\n } else if (this.inputRequiresUnwrap) {\n planner.addCommand(CommandType.WRAP_ETH, [this.options.recipient, CONTRACT_BALANCE])\n } else if (this.trade.inputAmount.currency.isNative) {\n // must refund extra native currency sent along for native v4 trades (no input transition)\n planner.addCommand(CommandType.SWEEP, [ETH_ADDRESS, this.options.recipient, 0])\n }\n }\n\n if (this.options.safeMode) planner.addCommand(CommandType.SWEEP, [ETH_ADDRESS, this.options.recipient, 0])\n }\n}\n\n// encode a uniswap v2 swap\nfunction addV2Swap<TInput extends Currency, TOutput extends Currency>(\n planner: RoutePlanner,\n { route, inputAmount, outputAmount }: Swap<TInput, TOutput>,\n tradeType: TradeType,\n options: SwapOptions,\n payerIsUser: boolean,\n routerMustCustody: boolean\n): void {\n const trade = new V2Trade(\n route as RouteV2<TInput, TOutput>,\n tradeType == TradeType.EXACT_INPUT ? inputAmount : outputAmount,\n tradeType\n )\n\n if (tradeType == TradeType.EXACT_INPUT) {\n planner.addCommand(CommandType.V2_SWAP_EXACT_IN, [\n // if native, we have to unwrap so keep in the router for now\n routerMustCustody ? ROUTER_AS_RECIPIENT : options.recipient,\n trade.maximumAmountIn(options.slippageTolerance).quotient.toString(),\n // if router will custody funds, we do aggregated slippage check from router\n routerMustCustody ? 0 : trade.minimumAmountOut(options.slippageTolerance).quotient.toString(),\n route.path.map((token) => token.wrapped.address),\n payerIsUser,\n ])\n } else if (tradeType == TradeType.EXACT_OUTPUT) {\n planner.addCommand(CommandType.V2_SWAP_EXACT_OUT, [\n routerMustCustody ? ROUTER_AS_RECIPIENT : options.recipient,\n trade.minimumAmountOut(options.slippageTolerance).quotient.toString(),\n trade.maximumAmountIn(options.slippageTolerance).quotient.toString(),\n route.path.map((token) => token.wrapped.address),\n payerIsUser,\n ])\n }\n}\n\n// encode a uniswap v3 swap\nfunction addV3Swap<TInput extends Currency, TOutput extends Currency>(\n planner: RoutePlanner,\n { route, inputAmount, outputAmount }: Swap<TInput, TOutput>,\n tradeType: TradeType,\n options: SwapOptions,\n payerIsUser: boolean,\n routerMustCustody: boolean\n): void {\n const trade = V3Trade.createUncheckedTrade({\n route: route as RouteV3<TInput, TOutput>,\n inputAmount,\n outputAmount,\n tradeType,\n })\n\n const path = encodeRouteToPath(route as RouteV3<TInput, TOutput>, trade.tradeType === TradeType.EXACT_OUTPUT)\n if (tradeType == TradeType.EXACT_INPUT) {\n planner.addCommand(CommandType.V3_SWAP_EXACT_IN, [\n routerMustCustody ? ROUTER_AS_RECIPIENT : options.recipient,\n trade.maximumAmountIn(options.slippageTolerance).quotient.toString(),\n routerMustCustody ? 0 : trade.minimumAmountOut(options.slippageTolerance).quotient.toString(),\n path,\n payerIsUser,\n ])\n } else if (tradeType == TradeType.EXACT_OUTPUT) {\n planner.addCommand(CommandType.V3_SWAP_EXACT_OUT, [\n routerMustCustody ? ROUTER_AS_RECIPIENT : options.recipient,\n trade.minimumAmountOut(options.slippageTolerance).quotient.toString(),\n trade.maximumAmountIn(options.slippageTolerance).quotient.toString(),\n path,\n payerIsUser,\n ])\n }\n}\n\nfunction addV4Swap<TInput extends Currency, TOutput extends Currency>(\n planner: RoutePlanner,\n { inputAmount, outputAmount, route }: Swap<TInput, TOutput>,\n tradeType: TradeType,\n options: SwapOptions,\n payerIsUser: boolean,\n routerMustCustody: boolean\n): void {\n // create a deep copy of pools since v4Planner encoding tampers with array\n const pools = route.pools.map((p) => p) as V4Pool[]\n const v4Route = new V4Route(pools, inputAmount.currency, outputAmount.currency)\n const trade = V4Trade.createUncheckedTrade({\n route: v4Route,\n inputAmount,\n outputAmount,\n tradeType,\n })\n\n const slippageToleranceOnSwap =\n routerMustCustody && tradeType == TradeType.EXACT_INPUT ? undefined : options.slippageTolerance\n\n const v4Planner = new V4Planner()\n v4Planner.addTrade(trade, slippageToleranceOnSwap)\n v4Planner.addSettle(trade.route.pathInput, payerIsUser)\n v4Planner.addTake(\n trade.route.pathOutput,\n routerMustCustody ? ROUTER_AS_RECIPIENT : options.recipient ?? SENDER_AS_RECIPIENT\n )\n planner.addCommand(CommandType.V4_SWAP, [v4Planner.finalize()])\n}\n\n// encode a mixed route swap, i.e. including both v2 and v3 pools\nfunction addMixedSwap<TInput extends Currency, TOutput extends Currency>(\n planner: RoutePlanner,\n swap: Swap<TInput, TOutput>,\n tradeType: TradeType,\n options: SwapOptions,\n payerIsUser: boolean,\n routerMustCustody: boolean\n): void {\n const route = swap.route as MixedRoute<TInput, TOutput>\n const inputAmount = swap.inputAmount\n const outputAmount = swap.outputAmount\n const tradeRecipient = routerMustCustody ? ROUTER_AS_RECIPIENT : options.recipient ?? SENDER_AS_RECIPIENT\n\n // single hop, so it can be reduced to plain swap logic for one protocol version\n if (route.pools.length === 1) {\n if (route.pools[0] instanceof V4Pool) {\n return addV4Swap(planner, swap, tradeType, options, payerIsUser, routerMustCustody)\n } else if (route.pools[0] instanceof V3Pool) {\n return addV3Swap(planner, swap, tradeType, options, payerIsUser, routerMustCustody)\n } else if (route.pools[0] instanceof Pair) {\n return addV2Swap(planner, swap, tradeType, options, payerIsUser, routerMustCustody)\n } else {\n throw new Error('Invalid route type')\n }\n }\n\n const trade = MixedRouteTrade.createUncheckedTrade({\n route: route as MixedRoute<TInput, TOutput>,\n inputAmount,\n outputAmount,\n tradeType,\n })\n\n const amountIn = trade.maximumAmountIn(options.slippageTolerance, inputAmount).quotient.toString()\n const amountOut = routerMustCustody\n ? 0\n : trade.minimumAmountOut(options.slippageTolerance, outputAmount).quotient.toString()\n\n // logic from\n // https://github.com/Uniswap/router-sdk/blob/d8eed164e6c79519983844ca8b6a3fc24ebcb8f8/src/swapRouter.ts#L276\n const sections = partitionMixedRouteByProtocol(route as MixedRoute<TInput, TOutput>)\n const isLastSectionInRoute = (i: number) => {\n return i === sections.length - 1\n }\n\n let inputToken = route.pathInput\n\n for (let i = 0; i < sections.length; i++) {\n const section = sections[i]\n const routePool = section[0]\n const outputToken = getOutputOfPools(section, inputToken)\n const subRoute = new MixedRoute(new MixedRouteSDK([...section], inputToken, outputToken))\n\n let nextInputToken\n let swapRecipient\n\n if (isLastSectionInRoute(i)) {\n nextInputToken = outputToken\n swapRecipient = tradeRecipient\n } else {\n const nextPool = sections[i + 1][0]\n nextInputToken = getPathCurrency(outputToken, nextPool)\n\n const v2PoolIsSwapRecipient = nextPool instanceof Pair && outputToken.equals(nextInputToken)\n swapRecipient = v2PoolIsSwapRecipient ? (nextPool as Pair).liquidityToken.address : ROUTER_AS_RECIPIENT\n }\n\n if (routePool instanceof V4Pool) {\n const v4Planner = new V4Planner()\n const v4SubRoute = new V4Route(section as V4Pool[], subRoute.input, subRoute.output)\n\n v4Planner.addSettle(inputToken, payerIsUser && i === 0, (i == 0 ? amountIn : CONTRACT_BALANCE) as BigNumber)\n v4Planner.addAction(Actions.SWAP_EXACT_IN, [\n {\n currencyIn: inputToken.isNative ? ETH_ADDRESS : inputToken.address,\n path: encodeV4RouteToPath(v4SubRoute),\n amountIn: 0, // denotes open delta, amount set in v4Planner.addSettle()\n amountOutMinimum: !isLastSectionInRoute(i) ? 0 : amountOut,\n },\n ])\n v4Planner.addTake(outputToken, swapRecipient)\n\n planner.addCommand(CommandType.V4_SWAP, [v4Planner.finalize()])\n } else if (routePool instanceof V3Pool) {\n planner.addCommand(CommandType.V3_SWAP_EXACT_IN, [\n swapRecipient, // recipient\n i == 0 ? amountIn : CONTRACT_BALANCE, // amountIn\n !isLastSectionInRoute(i) ? 0 : amountOut, // amountOut\n encodeMixedRouteToPath(subRoute), // path\n payerIsUser && i === 0, // payerIsUser\n ])\n } else if (routePool instanceof Pair) {\n planner.addCommand(CommandType.V2_SWAP_EXACT_IN, [\n swapRecipient, // recipient\n i === 0 ? amountIn : CONTRACT_BALANCE, // amountIn\n !isLastSectionInRoute(i) ? 0 : amountOut, // amountOutMin\n subRoute.path.map((token) => token.wrapped.address), // path\n payerIsUser && i === 0,\n ])\n } else {\n throw new Error('Unexpected Pool Type')\n }\n\n // perform a token transition (wrap/unwrap if necessary)\n if (!isLastSectionInRoute(i)) {\n if (outputToken.isNative && !nextInputToken.isNative) {\n planner.addCommand(CommandType.WRAP_ETH, [ROUTER_AS_RECIPIENT, CONTRACT_BALANCE])\n } else if (!outputToken.isNative && nextInputToken.isNative) {\n planner.addCommand(CommandType.UNWRAP_WETH, [ROUTER_AS_RECIPIENT, 0])\n }\n }\n\n inputToken = nextInputToken\n }\n}\n\n// if price impact is very high, there's a chance of hitting max/min prices resulting in a partial fill of the swap\nfunction riskOfPartialFill(trade: RouterTrade<Currency, Currency, TradeType>): boolean {\n return trade.priceImpact.greaterThan(REFUND_ETH_PRICE_IMPACT_THRESHOLD)\n}\n\nfunction hasFeeOption(swapOptions: SwapOptions): boolean {\n return !!swapOptions.fee || !!swapOptions.flatFee\n}\n","import { BigNumber } from 'ethers'\nimport JSBI from 'jsbi'\nimport bn from 'bignumber.js'\nimport { Percent } from '@uniswap/sdk-core'\nimport { toHex } from '@uniswap/v3-sdk'\n\nexport function expandTo18DecimalsBN(n: number): BigNumber {\n // use bn intermediately to allow decimals in intermediate calculations\n return BigNumber.from(new bn(n).times(new bn(10).pow(18)).toFixed())\n}\n\nexport function expandTo18Decimals(n: number): JSBI {\n return JSBI.BigInt(BigNumber.from(n).mul(BigNumber.from(10).pow(18)).toString())\n}\n\nexport function encodeFeeBips(fee: Percent): string {\n return toHex(fee.multiply(10_000).quotient)\n}\n","import invariant from 'tiny-invariant'\nimport { ethers } from 'ethers'\nimport { validateAndParseAddress, BigintIsh } from '@uniswap/sdk-core'\nimport { NFTPermitOptions, NonfungiblePositionManager } from '@uniswap/v3-sdk'\nimport { PermitSingle } from '@uniswap/permit2-sdk'\nimport { CommandType, RoutePlanner } from './routerCommands'\nimport { ROUTER_AS_RECIPIENT } from './constants'\n\nexport interface Permit2Permit extends PermitSingle {\n signature: string\n}\n\nexport type ApproveProtocol = {\n token: string\n protocol: string\n}\n\nexport type Permit2TransferFrom = {\n token: string\n amount: string\n recipient?: string\n}\n\nexport type InputTokenOptions = {\n permit2Permit?: Permit2Permit\n permit2TransferFrom?: Permit2TransferFrom\n}\n\nconst SIGNATURE_LENGTH = 65\nconst EIP_2098_SIGNATURE_LENGTH = 64\n\nexport function encodePermit(planner: RoutePlanner, permit2: Permit2Permit): void {\n let signature = permit2.signature\n\n const length = ethers.utils.arrayify(permit2.signature).length\n // signature data provided for EIP-1271 may have length different from ECDSA signature\n if (length === SIGNATURE_LENGTH || length === EIP_2098_SIGNATURE_LENGTH) {\n // sanitizes signature to cover edge cases of malformed EIP-2098 sigs and v used as recovery id\n signature = ethers.utils.joinSignature(ethers.utils.splitSignature(permit2.signature))\n }\n\n planner.addCommand(CommandType.PERMIT2_PERMIT, [permit2, signature])\n}\n\nexport function encodeV3PositionPermit(planner: RoutePlanner, permit: NFTPermitOptions, tokenId: BigintIsh): void {\n const calldata = NonfungiblePositionManager.INTERFACE.encodeFunctionData('permit', [\n validateAndParseAddress(permit.spender),\n tokenId,\n permit.deadline,\n permit.v,\n permit.r,\n permit.s,\n ])\n\n planner.addCommand(CommandType.V3_POSITION_MANAGER_PERMIT, [calldata])\n}\n\n// Handles the encoding of commands needed to gather input tokens for a trade\n// Approval: The router approving another address to take tokens.\n// note: Only seaport and sudoswap support this action. Approvals are left open.\n// Permit: A Permit2 signature-based Permit to allow the router to access a user's tokens\n// Transfer: A Permit2 TransferFrom of tokens from a user to either the router or another address\nexport function encodeInputTokenOptions(planner: RoutePlanner, options: InputTokenOptions) {\n // first ensure that all tokens provided for encoding are the same\n if (!!options.permit2TransferFrom && !!options.permit2Permit)\n invariant(options.permit2TransferFrom.token === options.permit2Permit.details.token, `inconsistent token`)\n\n // if this order has a options.permit2Permit, encode it\n if (!!options.permit2Permit) {\n encodePermit(planner, options.permit2Permit)\n }\n\n if (!!options.permit2TransferFrom) {\n planner.addCommand(CommandType.PERMIT2_TRANSFER_FROM, [\n options.permit2TransferFrom.token,\n options.permit2TransferFrom.recipient ? options.permit2TransferFrom.recipient : ROUTER_AS_RECIPIENT,\n options.permit2TransferFrom.amount,\n ])\n }\n}\n","import invariant from 'tiny-invariant'\nimport UniversalRouter from '@uniswap/universal-router/artifacts/contracts/UniversalRouter.sol/UniversalRouter.json'\nimport { Interface } from '@ethersproject/abi'\nimport { BigNumber, BigNumberish } from 'ethers'\nimport {\n MethodParameters,\n Multicall,\n Position as V3Position,\n NonfungiblePositionManager as V3PositionManager,\n RemoveLiquidityOptions as V3RemoveLiquidityOptions,\n} from '@uniswap/v3-sdk'\nimport {\n Position as V4Position,\n V4PositionManager,\n AddLiquidityOptions as V4AddLiquidityOptions,\n MintOptions,\n Pool as V4Pool,\n PoolKey,\n} from '@uniswap/v4-sdk'\nimport { Trade as RouterTrade } from '@uniswap/router-sdk'\nimport { Currency, TradeType, Percent, CHAIN_TO_ADDRESSES_MAP, SupportedChainsType } from '@uniswap/sdk-core'\nimport { UniswapTrade, SwapOptions } from './entities/actions/uniswap'\nimport { RoutePlanner, CommandType } from './utils/routerCommands'\nimport { encodePermit, encodeV3PositionPermit } from './utils/inputTokens'\nimport { UNIVERSAL_ROUTER_ADDRESS, UniversalRouterVersion } from './utils/constants'\n\nexport type SwapRouterConfig = {\n sender?: string // address\n deadline?: BigNumberish\n}\n\nexport interface MigrateV3ToV4Options {\n inputPosition: V3Position\n outputPosition: V4Position\n v3RemoveLiquidityOptions: V3RemoveLiquidityOptions\n v4AddLiquidityOptions: V4AddLiquidityOptions\n}\n\nfunction isMint(options: V4AddLiquidityOptions): options is MintOptions {\n return Object.keys(options).some((k) => k === 'recipient')\n}\n\nexport abstract class SwapRouter {\n public static INTERFACE: Interface = new Interface(UniversalRouter.abi)\n\n public static swapCallParameters(\n trades: RouterTrade<Currency, Currency, TradeType>,\n options: SwapOptions\n ): MethodParameters {\n // TODO: use permit if signature included in swapOptions\n const planner = new RoutePlanner()\n\n const trade: UniswapTrade = new UniswapTrade(trades, options)\n\n const inputCurrency = trade.trade.inputAmount.currency\n invariant(!(inputCurrency.isNative && !!options.inputTokenPermit), 'NATIVE_INPUT_PERMIT')\n\n if (options.inputTokenPermit) {\n encodePermit(planner, options.inputTokenPermit)\n }\n\n const nativeCurrencyValue = inputCurrency.isNative\n ? BigNumber.from(trade.trade.maximumAmountIn(options.slippageTolerance).quotient.toString())\n : BigNumber.from(0)\n\n trade.encode(planner, { allowRevert: false })\n return SwapRouter.encodePlan(planner, nativeCurrencyValue, {\n deadline: options.deadlineOrPreviousBlockhash ? BigNumber.from(options.deadlineOrPreviousBlockhash) : undefined,\n })\n }\n\n /**\n * Builds the call parameters for a migration from a V3 position to a V4 position.\n * Some requirements of the parameters:\n * - v3RemoveLiquidityOptions.collectOptions.recipient must equal v4PositionManager\n * - v3RemoveLiquidityOptions.liquidityPercentage must be 100%\n * - input pool and output pool must have the same tokens\n * - V3 NFT must be approved, or valid inputV3NFTPermit must be provided with UR as spender\n */\n public static migrateV3ToV4CallParameters(\n options: MigrateV3ToV4Options,\n positionManagerOverride?: string\n ): MethodParameters {\n const v4Pool: V4Pool = options.outputPosition.pool\n const v3Token0 = options.inputPosition.pool.token0\n const v3Token1 = options.inputPosition.pool.token1\n const v4PositionManagerAddress =\n positionManagerOverride ?? CHAIN_TO_ADDRESSES_MAP[v4Pool.chainId as SupportedChainsType].v4PositionManagerAddress\n\n // owner of the v3 nft must be the receiver of the v4 nft\n\n // validate the parameters\n if (v4Pool.currency0.isNative) {\n invariant(\n (v4Pool.currency0.wrapped.equals(v3Token0) && v4Pool.currency1.equals(v3Token1)) ||\n (v4Pool.currency0.wrapped.equals(v3Token1) && v4Pool.currency1.equals(v3Token0)),\n 'TOKEN_MISMATCH'\n )\n } else {\n invariant(v3Token0 === v4Pool.token0, 'TOKEN0_MISMATCH')\n invariant(v3Token1 === v4Pool.token1, 'TOKEN1_MISMATCH')\n }\n\n invariant(\n options.v3RemoveLiquidityOptions.liquidityPercentage.equalTo(new Percent(100, 100)),\n 'FULL_REMOVAL_REQUIRED'\n )\n invariant(options.v3RemoveLiquidityOptions.burnToken == true, 'BURN_TOKEN_REQUIRED')\n invariant(\n options.v3RemoveLiquidityOptions.collectOptions.recipient === v4PositionManagerAddress,\n 'RECIPIENT_NOT_POSITION_MANAGER'\n )\n invariant(isMint(options.v4AddLiquidityOptions), 'MINT_REQUIRED')\n invariant(options.v4AddLiquidityOptions.migrate, 'MIGRATE_REQUIRED')\n\n const planner = new RoutePlanner()\n\n // to prevent reentrancy by the pool hook, we initialize the v4 pool before moving funds\n if (options.v4AddLiquidityOptions.createPool) {\n const poolKey: PoolKey = V4Pool.getPoolKey(\n v4Pool.currency0,\n v4Pool.currency1,\n v4Pool.fee,\n v4Pool.tickSpacing,\n v4Pool.hooks\n )\n planner.addCommand(CommandType.V4_INITIALIZE_POOL, [poolKey, v4Pool.sqrtRatioX96.toString()])\n // remove createPool setting, so that it doesnt get encoded again later\n delete options.v4AddLiquidityOptions.createPool\n }\n\n // add position permit to the universal router planner\n if (options.v3RemoveLiquidityOptions.permit) {\n // permit spender should be UR\n const universalRouterAddress = UNIVERSAL_ROUTER_ADDRESS(\n UniversalRouterVersion.V2_0,\n options.inputPosition.pool.chainId as SupportedChainsType\n )\n invariant(universalRouterAddress == options.v3RemoveLiquidityOptions.permit.spender, 'INVALID_SPENDER')\n // don't need to transfer it because v3posm uses isApprovedOrOwner()\n encodeV3PositionPermit(planner, options.v3RemoveLiquidityOptions.permit, options.v3RemoveLiquidityOptions.tokenId)\n // remove permit so that multicall doesnt add it again\n delete options.v3RemoveLiquidityOptions.permit\n }\n\n // encode v3 withdraw\n const v3RemoveParams: MethodParameters = V3PositionManager.removeCallParameters(\n options.inputPosition,\n options.v3RemoveLiquidityOptions\n )\n const v3Calls: string[] = Multicall.decodeMulticall(v3RemoveParams.calldata)\n\n for (const v3Call of v3Calls) {\n // slice selector - 0x + 4 bytes = 10 characters\n const selector = v3Call.slice(0, 10)\n invariant(\n selector == V3PositionManager.INTERFACE.getSighash('collect') ||\n selector == V3PositionManager.INTERFACE.getSighash('decreaseLiquidity') ||\n selector == V3PositionManager.INTERFACE.getSighash('burn'),\n 'INVALID_V3_CALL: ' + selector\n )\n planner.addCommand(CommandType.V3_POSITION_MANAGER_CALL, [v3Call])\n }\n\n // encode v4 mint\n const v4AddParams = V4PositionManager.addCallParameters(options.outputPosition, options.v4AddLiquidityOptions)\n // only modifyLiquidities can be called by the UniversalRouter\n const selector = v4AddParams.calldata.slice(0, 10)\n invariant(selector == V4PositionManager.INTERFACE.getSighash('modifyLiquidities'), 'INVALID_V4_CALL: ' + selector)\n\n planner.addCommand(CommandType.V4_POSITION_MANAGER_CALL, [v4AddParams.calldata])\n\n return SwapRouter.encodePlan(planner, BigNumber.from(0), {\n deadline: BigNumber.from(options.v4AddLiquidityOptions.deadline),\n })\n }\n\n /**\n * Encodes a planned route into a method name and parameters for the Router contract.\n * @param planner the planned route\n * @param nativeCurrencyValue the native currency value of the planned route\n * @param config the router config\n */\n private static encodePlan(\n planner: RoutePlanner,\n nativeCurrencyValue: BigNumber,\n config: SwapRouterConfig = {}\n ): MethodParameters {\n const { commands, inputs } = planner\n const functionSignature = !!config.deadline ? 'execute(bytes,bytes[],uint256)' : 'execute(bytes,bytes[])'\n const parameters = !!config.deadline ? [commands, inputs, config.deadline] : [commands, inputs]\n const calldata = SwapRouter.INTERFACE.encodeFunctionData(functionSignature, parameters)\n return { calldata, value: nativeCurrencyValue.toHexString() }\n }\n}\n","import { MixedRouteSDK, Trade as RouterTrade } from '@uniswap/router-sdk'\nimport { Currency, CurrencyAmount, Ether, Token, TradeType } from '@uniswap/sdk-core'\nimport { Pair, Route as V2Route } from '@uniswap/v2-sdk'\nimport { Pool as V3Pool, Route as V3Route, FeeAmount } from '@uniswap/v3-sdk'\nimport { Pool as V4Pool, Route as V4Route } from '@uniswap/v4-sdk'\nimport { BigNumber } from 'ethers'\nimport { ETH_ADDRESS, E_ETH_ADDRESS } from './constants'\n\nexport type TokenInRoute = {\n address: string\n chainId: number\n symbol: string\n decimals: string\n name?: string\n buyFeeBps?: string\n sellFeeBps?: string\n}\n\nexport enum PoolType {\n V2Pool = 'v2-pool',\n V3Pool = 'v3-pool',\n V4Pool = 'v4-pool',\n}\n\nexport type V2Reserve = {\n token: TokenInRoute\n quotient: string\n}\n\nexport type V2PoolInRoute = {\n type: PoolType.V2Pool\n address?: string\n tokenIn: TokenInRoute\n tokenOut: TokenInRoute\n reserve0: V2Reserve\n reserve1: V2Reserve\n amountIn?: string\n amountOut?: string\n}\n\nexport type V3PoolInRoute = {\n type: PoolType.V3Pool\n address?: string\n tokenIn: TokenInRoute\n tokenOut: TokenInRoute\n sqrtRatioX96: string\n liquidity: string\n tickCurrent: string\n fee: string\n amountIn?: string\n amountOut?: string\n}\n\nexport type V4PoolInRoute = {\n type: PoolType.V4Pool\n address?: string\n tokenIn: TokenInRoute\n tokenOut: TokenInRoute\n fee: string\n tickSpacing: string\n hooks: string\n liquidity: string\n sqrtRatioX96: string\n tickCurrent: string\n amountIn?: string\n amountOut?: string\n}\n\nexport type PartialClassicQuote = {\n // We need tokenIn/Out to support native currency\n tokenIn: string\n tokenOut: string\n tradeType: TradeType\n route: Array<(V4PoolInRoute | V3PoolInRoute | V2PoolInRoute)[]>\n}\n\ninterface RouteResult {\n routev4: V4Route<Currency, Currency> | null\n routev3: V3Route<Currency, Currency> | null\n routev2: V2Route<Currency, Currency> | null\n mixedRoute: MixedRouteSDK<Currency, Currency> | null\n inputAmount: CurrencyAmount<Currency>\n outputAmount: CurrencyAmount<Currency>\n}\n\nexport const isNativeCurrency = (address: string) =>\n address.toLowerCase() === ETH_ADDRESS.toLowerCase() || address.toLowerCase() === E_ETH_ADDRESS.toLowerCase()\n\n// Helper class to convert routing-specific quote entities to RouterTrade entities\n// the returned RouterTrade can then be used to build the UniswapTrade entity in this package\nexport class RouterTradeAdapter {\n // Generate a RouterTrade using fields from a classic quote response\n static fromClassicQuote(quote: PartialClassicQuote) {\n const { route, tokenIn, tokenOut } = quote\n\n if (!route) throw new Error('Expected route to be present')\n if (!route.length) throw new Error('Expected there to be at least one route')\n if (route.some((r) => !r.length)) throw new Error('Expected all routes to have at least one pool')\n const firstRoute = route[0]\n\n const tokenInData = firstRoute[0].tokenIn\n const tokenOutData = firstRoute[firstRoute.length - 1].tokenOut\n\n if (!tokenInData || !tokenOutData) throw new Error('Expected both tokenIn and tokenOut to be present')\n if (tokenInData.chainId !== tokenOutData.chainId)\n throw new Error('Expected tokenIn and tokenOut to be have same chainId')\n\n const parsedCurrencyIn = RouterTradeAdapter.toCurrency(isNativeCurrency(tokenIn), tokenInData)\n const parsedCurrencyOut = RouterTradeAdapter.toCurrency(isNativeCurrency(tokenOut), tokenOutData)\n\n const typedRoutes: RouteResult[] = route.map((subRoute) => {\n const rawAmountIn = subRoute[0].amountIn\n const rawAmountOut = subRoute[subRoute.length - 1].amountOut\n\n if (!rawAmountIn || !rawAmountOut) {\n throw new Error('Expected both raw amountIn and raw amountOut to be present')\n }\n\n const inputAmount = CurrencyAmount.fromRawAmount(parsedCurrencyIn, rawAmountIn)\n const outputAmount = CurrencyAmount.fromRawAmount(parsedCurrencyOut, rawAmountOut)\n\n const isOnlyV2 = RouterTradeAdapter.isVersionedRoute<V2PoolInRoute>(PoolType.V2Pool, subRoute)\n const isOnlyV3 = RouterTradeAdapter.isVersionedRoute<V3PoolInRoute>(PoolType.V3Pool, subRoute)\n const isOnlyV4 = RouterTradeAdapter.isVersionedRoute<V4PoolInRoute>(PoolType.V4Pool, subRoute)\n return {\n routev4: isOnlyV4\n ? new V4Route(\n (subRoute as V4PoolInRoute[]).map(RouterTradeAdapter.toV4Pool),\n parsedCurrencyIn,\n parsedCurrencyOut\n )\n : null,\n routev3: isOnlyV3\n ? new V3Route(\n (subRoute as V3PoolInRoute[]).map(RouterTradeAdapter.toV3Pool),\n parsedCurrencyIn,\n parsedCurrencyOut\n )\n : null,\n routev2: isOnlyV2\n ? new V2Route(\n (subRoute as V2PoolInRoute[]).map(RouterTradeAdapter.toPair),\n parsedCurrencyIn,\n parsedCurrencyOut\n )\n : null,\n mixedRoute:\n !isOnlyV4 && !isOnlyV3 && !isOnlyV2\n ? new MixedRouteSDK(subRoute.map(RouterTradeAdapter.toPoolOrPair), parsedCurrencyIn, parsedCurrencyOut)\n : null,\n inputAmount,\n outputAmount,\n }\n })\n\n return new RouterTrade({\n v2Routes: typedRoutes\n .filter((route) => route.routev2)\n .map((route) => ({\n routev2: route.routev2 as V2Route<Currency, Currency>,\n inputAmount: route.inputAmount,\n outputAmount: route.outputAmount,\n })),\n v3Routes: typedRoutes\n .filter((route) => route.routev3)\n .map((route) => ({\n routev3: route.routev3 as V3Route<Currency, Currency>,\n inputAmount: route.inputAmount,\n outputAmount: route.outputAmount,\n })),\n v4Routes: typedRoutes\n .filter((route) => route.routev4)\n .map((route) => ({\n routev4: route.routev4 as V4Route<Currency, Currency>,\n inputAmount: route.inputAmount,\n outputAmount: route.outputAmount,\n })),\n mixedRoutes: typedRoutes\n .filter((route) => route.mixedRoute)\n .map((route) => ({\n mixedRoute: route.mixedRoute as MixedRouteSDK<Currency, Currency>,\n inputAmount: route.inputAmount,\n outputAmount: route.outputAmount,\n })),\n tradeType: quote.tradeType,\n })\n }\n\n private static toCurrency(isNative: boolean, token: TokenInRoute): Currency {\n if (isNative) {\n return Ether.onChain(token.chainId)\n }\n return this.toToken(token)\n }\n\n private static toPoolOrPair = (pool: V4PoolInRoute | V3PoolInRoute | V2PoolInRoute): V4Pool | V3Pool | Pair => {\n switch (pool.type) {\n case PoolType.V4Pool:\n return RouterTradeAdapter.toV4Pool(pool)\n case PoolType.V3Pool:\n return RouterTradeAdapter.toV3Pool(pool)\n case PoolType.V2Pool:\n return RouterTradeAdapter.toPair(pool)\n default:\n throw new Error('Invalid pool type')\n }\n }\n\n private static toToken(token: TokenInRoute): Token {\n const { chainId, address, decimals, symbol, buyFeeBps, sellFeeBps } = token\n return new Token(\n chainId,\n address,\n parseInt(decimals.toString()),\n symbol,\n /* name */ undefined,\n false,\n buyFeeBps ? BigNumber.from(buyFeeBps) : undefined,\n sellFeeBps ? BigNumber.from(sellFeeBps) : undefined\n )\n }\n\n private static toV3Pool({ fee, sqrtRatioX96, liquidity, tickCurrent, tokenIn, tokenOut }: V3PoolInRoute): V3Pool {\n return new V3Pool(\n RouterTradeAdapter.toToken(tokenIn),\n RouterTradeAdapter.toToken(tokenOut),\n parseInt(fee) as FeeAmount,\n sqrtRatioX96,\n liquidity,\n parseInt(tickCurrent)\n )\n }\n\n private static toV4Pool(pool: V4PoolInRoute): V4Pool {\n const parsedCurrencyIn = RouterTradeAdapter.toCurrency(isNativeCurrency(pool.tokenIn.address), pool.tokenIn)\n const parsedCurrencyOut = RouterTradeAdapter.toCurrency(isNativeCurrency(pool.tokenOut.address), pool.tokenOut)\n return new V4Pool(\n parsedCurrencyIn,\n parsedCurrencyOut,\n parseInt(pool.fee) as FeeAmount,\n parseInt(pool.tickSpacing),\n pool.hooks,\n pool.sqrtRatioX96,\n pool.liquidity,\n parseInt(pool.tickCurrent)\n )\n }\n\n private static toPair = ({ reserve0, reserve1 }: V2PoolInRoute): Pair => {\n return new Pair(\n CurrencyAmount.fromRawAmount(RouterTradeAdapter.toToken(reserve0.token), reserve0.quotient),\n CurrencyAmount.fromRawAmount(RouterTradeAdapter.toToken(reserve1.token), reserve1.quotient)\n )\n }\n\n private static isVersionedRoute<T extends V2PoolInRoute | V3PoolInRoute | V4PoolInRoute>(\n type: PoolType,\n route: (V3PoolInRoute | V2PoolInRoute | V4PoolInRoute)[]\n ): route is T[] {\n return route.every((pool) => pool.type === type)\n }\n}\n","import invariant from 'tiny-invariant'\nimport { BigNumberish } from 'ethers'\nimport { RoutePlanner, CommandType } from '../../utils/routerCommands'\nimport { encodeInputTokenOptions, Permit2Permit } from '../../utils/inputTokens'\nimport { Command, RouterActionType, TradeConfig } from '../Command'\nimport { ROUTER_AS_RECIPIENT, WETH_ADDRESS } from '../../utils/constants'\n\nexport class UnwrapWETH implements Command {\n readonly tradeType: RouterActionType = RouterActionType.UnwrapWETH\n readonly permit2Data?: Permit2Permit\n readonly wethAddress: string\n readonly amount: BigNumberish\n\n constructor(amount: BigNumberish, chainId: number, permit2?: Permit2Permit) {\n this.wethAddress = WETH_ADDRESS(chainId)\n this.amount = amount\n\n if (!!permit2) {\n invariant(\n permit2.details.token.toLowerCase() === this.wethAddress.toLowerCase(),\n `must be permitting WETH address: ${this.wethAddress}`\n )\n invariant(permit2.details.amount >= amount, `Did not permit enough WETH for unwrapWETH transaction`)\n this.permit2Data = permit2\n }\n }\n\n encode(planner: RoutePlanner, _: TradeConfig): void {\n encodeInputTokenOptions(planner, {\n permit2Permit: this.permit2Data,\n permit2TransferFrom: {\n token: this.wethAddress,\n amount: this.amount.toString(),\n },\n })\n planner.addCommand(CommandType.UNWRAP_WETH, [ROUTER_AS_RECIPIENT, this.amount])\n }\n}\n","import { ethers } from 'ethers'\nimport UniversalRouter from '@uniswap/universal-router/artifacts/contracts/UniversalRouter.sol/UniversalRouter.json'\nimport { Interface } from '@ethersproject/abi'\nimport { V4BaseActionsParser, V4RouterAction } from '@uniswap/v4-sdk'\nimport { CommandType, CommandDefinition, COMMAND_DEFINITION, Subparser, Parser } from '../utils/routerCommands'\n\nexport type Param = {\n readonly name: string\n readonly value: any\n}\n\nexport type UniversalRouterCommand = {\n readonly commandName: string\n readonly commandType: CommandType\n readonly params: readonly Param[]\n}\n\nexport type UniversalRouterCall = {\n readonly commands: readonly UniversalRouterCommand[]\n}\n\nexport type V3PathItem = {\n readonly tokenIn: string\n readonly tokenOut: string\n readonly fee: number\n}\n\nexport interface CommandsDefinition {\n [key: number]: CommandDefinition\n}\n\n// Parses UniversalRouter V2 commands\nexport abstract class CommandParser {\n public static INTERFACE: Interface = new Interface(UniversalRouter.abi)\n\n public static parseCalldata(calldata: string): UniversalRouterCall {\n const genericParser = new GenericCommandParser(COMMAND_DEFINITION)\n const txDescription = CommandParser.INTERFACE.parseTransaction({ data: calldata })\n const { commands, inputs } = txDescription.args\n return genericParser.parse(commands, inputs)\n }\n}\n\n// Parses commands based on given command definition\nexport class GenericCommandParser {\n constructor(private readonly commandDefinition: CommandsDefinition) {}\n\n public parse(commands: string, inputs: string[]): UniversalRouterCall {\n const commandTypes = GenericCommandParser.getCommands(commands)\n\n return {\n commands: commandTypes.map((commandType: CommandType, i: number) => {\n const commandDef = this.commandDefinition[commandType]\n\n if (commandDef.parser === Parser.V4Actions) {\n const { actions } = V4BaseActionsParser.parseCalldata(inputs[i])\n return {\n commandName: CommandType[commandType],\n commandType,\n params: v4RouterCallToParams(actions),\n }\n } else if (commandDef.parser === Parser.Abi) {\n const abiDef = commandDef.params\n const rawParams = ethers.utils.defaultAbiCoder.decode(\n abiDef.map((command) => command.type),\n inputs[i]\n )\n\n const params = rawParams.map((param: any, j: number) => {\n switch (abiDef[j].subparser) {\n case Subparser.V3PathExactIn:\n return {\n name: abiDef[j].name,\n value: parseV3PathExactIn(param),\n }\n case Subparser.V3PathExactOut:\n return {\n name: abiDef[j].name,\n value: parseV3PathExactOut(param),\n }\n default:\n return {\n name: abiDef[j].name,\n value: param,\n }\n }\n })\n return {\n commandName: CommandType[commandType],\n commandType,\n params,\n }\n } else if (commandDef.parser === Parser.V3Actions) {\n // TODO: implement better parsing here\n return {\n commandName: CommandType[commandType],\n commandType,\n params: inputs.map((input) => ({ name: 'command', value: input })),\n }\n } else {\n throw new Error(`Unsupported parser: ${commandDef}`)\n }\n }),\n }\n }\n\n // parse command types from bytes string\n private static getCommands(commands: string): CommandType[] {\n const commandTypes: CommandType[] = []\n\n for (let i = 2; i < commands.length; i += 2) {\n const byte = commands.substring(i, i + 2)\n commandTypes.push(parseInt(byte, 16) as CommandType)\n }\n\n return commandTypes\n }\n}\n\nexport function parseV3PathExactIn(path: string): readonly V3PathItem[] {\n const strippedPath = path.replace('0x', '')\n let tokenIn = ethers.utils.getAddress(strippedPath.substring(0, 40))\n let loc = 40\n const res: V3PathItem[] = []\n while (loc < strippedPath.length) {\n const feeAndTokenOut = strippedPath.substring(loc, loc + 46)\n const fee = parseInt(feeAndTokenOut.substring(0, 6), 16)\n const tokenOut = ethers.utils.getAddress(feeAndTokenOut.substring(6, 46))\n\n res.push({\n tokenIn,\n tokenOut,\n fee,\n })\n tokenIn = tokenOut\n loc += 46\n }\n\n return res\n}\n\nexport function parseV3PathExactOut(path: string): readonly V3PathItem[] {\n const strippedPath = path.replace('0x', '')\n let tokenIn = ethers.utils.getAddress(strippedPath.substring(strippedPath.length - 40))\n let loc = strippedPath.length - 86 // 86 = (20 addr + 3 fee + 20 addr) * 2 (for hex characters)\n const res: V3PathItem[] = []\n while (loc >= 0) {\n const feeAndTokenOut = strippedPath.substring(loc, loc + 46)\n const tokenOut = ethers.utils.getAddress(feeAndTokenOut.substring(0, 40))\n const fee = parseInt(feeAndTokenOut.substring(40, 46), 16)\n\n res.push({\n tokenIn,\n tokenOut,\n fee,\n })\n tokenIn = tokenOut\n\n loc -= 46\n }\n\n return res\n}\n\nfunction v4RouterCallToParams(actions: readonly V4RouterAction[]): readonly Param[] {\n return actions.map((action) => {\n return {\n name: action.actionName,\n value: action.params.map((param) => {\n return {\n name: param.name,\n value: param.value,\n }\n }),\n }\n })\n}\n"],"names":["CommandType","Subparser","Parser","RouterActionType","UniversalRouterVersion","REVERTIBLE_COMMANDS","Set","EXECUTE_SUB_PLAN","COMMAND_DEFINITION","_COMMAND_DEFINITION","parser","Abi","params","name","type","PERMIT2_PERMIT","PERMIT2_PERMIT_BATCH","PERMIT2_TRANSFER_FROM","PERMIT2_TRANSFER_FROM_BATCH","PERMIT2_TRANSFER_FROM_STRUCT","V3_SWAP_EXACT_IN","subparser","V3PathExactIn","V3_SWAP_EXACT_OUT","V3PathExactOut","V2_SWAP_EXACT_IN","V2_SWAP_EXACT_OUT","V4_SWAP","V4Actions","WRAP_ETH","UNWRAP_WETH","SWEEP","TRANSFER","PAY_PORTION","BALANCE_CHECK_ERC20","V4_INITIALIZE_POOL","V3_POSITION_MANAGER_PERMIT","V3Actions","V3_POSITION_MANAGER_CALL","V4_POSITION_MANAGER_CALL","RoutePlanner","this","commands","inputs","_proto","prototype","addSubPlan","subplan","addCommand","parameters","allowRevert","command","commandDef","encodedInput","defaultAbiCoder","encode","map","abi","createCommand","push","has","Error","concat","toString","padStart","getPathCurrency","currency","pool","involvesToken","wrapped","V4Pool","token0","equals","token1","symbol","CHAIN_CONFIGS","_CHAIN_CONFIGS","weth","routerConfigs","_routerConfigs","V1_2","address","creationBlock","V2_0","_routerConfigs2","_routerConfigs3","_routerConfigs4","_routerConfigs5","_routerConfigs6","_routerConfigs7","_routerConfigs8","_routerConfigs9","_routerConfigs10","_routerConfigs11","_routerConfigs12","_routerConfigs13","_routerConfigs14","_routerConfigs15","_routerConfigs16","_routerConfigs17","_routerConfigs18","_routerConfigs19","_routerConfigs20","_routerConfigs21","_routerConfigs22","_routerConfigs23","_routerConfigs24","UNIVERSAL_ROUTER_ADDRESS","version","chainId","WETH_ADDRESS","CONTRACT_BALANCE","BigNumber","from","pow","ETH_ADDRESS","SENDER_AS_RECIPIENT","ROUTER_AS_RECIPIENT","getCurrencyAddress","isNative","REFUND_ETH_PRICE_IMPACT_THRESHOLD","Percent","UniswapTrade","trade","options","fee","flatFee","payerIsUser","inputRequiresWrap","inputRequiresUnwrap","useRouterBalance","planner","_config","maximumAmountIn","slippageTolerance","quotient","inputAmount","recipient","_this$options$recipie","swapOptions","_step","routerMustCustody","tradeType","TradeType","EXACT_INPUT","routes","length","outputRequiresTransition","_iterator","_createForOfIteratorHelperLoose","swaps","done","swap","value","route","protocol","Protocol","V2","addV2Swap","V3","addV3Swap","V4","addV4Swap","MIXED","addMixedSwap","minimumAmountOut","pools","pathOutputCurrencyAddress","outputAmount","feeBips","toHex","multiply","EXACT_OUTPUT","sub","mul","div","feeAmount","amount","lt","outputRequiresUnwrap","outputRequiresWrap","priceImpact","greaterThan","safeMode","key","get","_step2","result","_iterator2","isAllV4","pathInput","pathOutput","_ref","V2Trade","path","token","_ref2","V3Trade","createUncheckedTrade","encodeRouteToPath","_ref3","p","v4Route","V4Route","V4Trade","slippageToleranceOnSwap","undefined","v4Planner","V4Planner","addTrade","addSettle","addTake","_options$recipient","finalize","tradeRecipient","_options$recipient2","V3Pool","Pair","MixedRouteTrade","amountIn","amountOut","sections","partitionMixedRouteByProtocol","isLastSectionInRoute","i","inputToken","section","routePool","outputToken","getOutputOfPools","subRoute","MixedRoute","MixedRouteSDK","nextInputToken","swapRecipient","nextPool","liquidityToken","v4SubRoute","input","output","addAction","Actions","SWAP_EXACT_IN","currencyIn","encodeV4RouteToPath","amountOutMinimum","encodeMixedRouteToPath","encodePermit","permit2","signature","ethers","utils","arrayify","joinSignature","splitSignature","SwapRouter","swapCallParameters","trades","inputCurrency","inputTokenPermit","invariant","nativeCurrencyValue","encodePlan","deadline","deadlineOrPreviousBlockhash","migrateV3ToV4CallParameters","positionManagerOverride","v4Pool","outputPosition","v3Token0","inputPosition","v3Token1","v4PositionManagerAddress","CHAIN_TO_ADDRESSES_MAP","currency0","currency1","v3RemoveLiquidityOptions","liquidityPercentage","equalTo","burnToken","collectOptions","Object","keys","some","k","isMint","v4AddLiquidityOptions","migrate","createPool","poolKey","getPoolKey","tickSpacing","hooks","sqrtRatioX96","permit","spender","tokenId","calldata","NonfungiblePositionManager","INTERFACE","encodeFunctionData","validateAndParseAddress","v","r","s","encodeV3PositionPermit","v3RemoveParams","V3PositionManager","removeCallParameters","Multicall","decodeMulticall","v3Call","selector","slice","getSighash","v4AddParams","V4PositionManager","addCallParameters","config","toHexString","Interface","UniversalRouter","PoolType","UnwrapWETH","wethAddress","details","toLowerCase","permit2Data","_","permit2TransferFrom","permit2Permit","encodeInputTokenOptions","isNativeCurrency","RouterTradeAdapter","fromClassicQuote","quote","tokenIn","tokenOut","firstRoute","tokenInData","tokenOutData","parsedCurrencyIn","toCurrency","parsedCurrencyOut","typedRoutes","rawAmountIn","rawAmountOut","CurrencyAmount","fromRawAmount","isOnlyV2","isVersionedRoute","V2Pool","isOnlyV3","isOnlyV4","routev4","toV4Pool","routev3","V3Route","toV3Pool","routev2","V2Route","toPair","mixedRoute","toPoolOrPair","RouterTrade","v2Routes","filter","v3Routes","v4Routes","mixedRoutes","Ether","onChain","toToken","buyFeeBps","sellFeeBps","Token","parseInt","decimals","liquidity","tickCurrent","every","reserve0","reserve1","CommandParser","parseCalldata","genericParser","GenericCommandParser","_txDescription$args","parseTransaction","data","args","parse","commandDefinition","getCommands","commandType","actions","_this","_V4BaseActionsParser$","V4BaseActionsParser","commandName","action","actionName","param","abiDef","decode","j","parseV3PathExactIn","parseV3PathExactOut","commandTypes","byte","substring","strippedPath","replace","getAddress","loc","res","feeAndTokenOut"],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import invariant from 'tiny-invariant';
|
|
2
|
-
import
|
|
2
|
+
import UniversalRouter from '@uniswap/universal-router/artifacts/contracts/UniversalRouter.sol/UniversalRouter.json';
|
|
3
3
|
import { Interface } from '@ethersproject/abi';
|
|
4
4
|
import { BigNumber, ethers } from 'ethers';
|
|
5
5
|
import { toHex, Trade as Trade$1, encodeRouteToPath, Pool as Pool$1, NonfungiblePositionManager, Multicall, Route as Route$1 } from '@uniswap/v3-sdk';
|
|
@@ -1095,7 +1095,7 @@ var SwapRouter = /*#__PURE__*/function () {
|
|
|
1095
1095
|
};
|
|
1096
1096
|
return SwapRouter;
|
|
1097
1097
|
}();
|
|
1098
|
-
SwapRouter.INTERFACE = /*#__PURE__*/new Interface(abi);
|
|
1098
|
+
SwapRouter.INTERFACE = /*#__PURE__*/new Interface(UniversalRouter.abi);
|
|
1099
1099
|
|
|
1100
1100
|
var UnwrapWETH = /*#__PURE__*/function () {
|
|
1101
1101
|
function UnwrapWETH(amount, chainId, permit2) {
|
|
@@ -1281,7 +1281,7 @@ var CommandParser = /*#__PURE__*/function () {
|
|
|
1281
1281
|
};
|
|
1282
1282
|
return CommandParser;
|
|
1283
1283
|
}();
|
|
1284
|
-
CommandParser.INTERFACE = /*#__PURE__*/new Interface(abi);
|
|
1284
|
+
CommandParser.INTERFACE = /*#__PURE__*/new Interface(UniversalRouter.abi);
|
|
1285
1285
|
// Parses commands based on given command definition
|
|
1286
1286
|
var GenericCommandParser = /*#__PURE__*/function () {
|
|
1287
1287
|
function GenericCommandParser(commandDefinition) {
|