@centurion_project/universal-router-sdk 5.1.0-ctn.0

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.
Files changed (121) hide show
  1. package/README.md +332 -0
  2. package/dist/cjs/src/entities/Command.d.ts +12 -0
  3. package/dist/cjs/src/entities/Command.js +9 -0
  4. package/dist/cjs/src/entities/Command.js.map +1 -0
  5. package/dist/cjs/src/entities/actions/across.d.ts +21 -0
  6. package/dist/cjs/src/entities/actions/across.js +7 -0
  7. package/dist/cjs/src/entities/actions/across.js.map +1 -0
  8. package/dist/cjs/src/entities/actions/index.d.ts +3 -0
  9. package/dist/cjs/src/entities/actions/index.js +7 -0
  10. package/dist/cjs/src/entities/actions/index.js.map +1 -0
  11. package/dist/cjs/src/entities/actions/uniswap.d.ts +38 -0
  12. package/dist/cjs/src/entities/actions/uniswap.js +545 -0
  13. package/dist/cjs/src/entities/actions/uniswap.js.map +1 -0
  14. package/dist/cjs/src/entities/actions/unwrapWETH.d.ts +12 -0
  15. package/dist/cjs/src/entities/actions/unwrapWETH.js +33 -0
  16. package/dist/cjs/src/entities/actions/unwrapWETH.js.map +1 -0
  17. package/dist/cjs/src/entities/index.d.ts +2 -0
  18. package/dist/cjs/src/entities/index.js +6 -0
  19. package/dist/cjs/src/entities/index.js.map +1 -0
  20. package/dist/cjs/src/index.d.ts +11 -0
  21. package/dist/cjs/src/index.js +31 -0
  22. package/dist/cjs/src/index.js.map +1 -0
  23. package/dist/cjs/src/swapRouter.d.ts +87 -0
  24. package/dist/cjs/src/swapRouter.js +263 -0
  25. package/dist/cjs/src/swapRouter.js.map +1 -0
  26. package/dist/cjs/src/utils/commandParser.d.ts +34 -0
  27. package/dist/cjs/src/utils/commandParser.js +145 -0
  28. package/dist/cjs/src/utils/commandParser.js.map +1 -0
  29. package/dist/cjs/src/utils/constants.d.ts +39 -0
  30. package/dist/cjs/src/utils/constants.js +549 -0
  31. package/dist/cjs/src/utils/constants.js.map +1 -0
  32. package/dist/cjs/src/utils/eip712.d.ts +17 -0
  33. package/dist/cjs/src/utils/eip712.js +43 -0
  34. package/dist/cjs/src/utils/eip712.js.map +1 -0
  35. package/dist/cjs/src/utils/getCurrencyAddress.d.ts +2 -0
  36. package/dist/cjs/src/utils/getCurrencyAddress.js +9 -0
  37. package/dist/cjs/src/utils/getCurrencyAddress.js.map +1 -0
  38. package/dist/cjs/src/utils/inputTokens.d.ts +23 -0
  39. package/dist/cjs/src/utils/inputTokens.js +58 -0
  40. package/dist/cjs/src/utils/inputTokens.js.map +1 -0
  41. package/dist/cjs/src/utils/numbers.d.ts +7 -0
  42. package/dist/cjs/src/utils/numbers.js +27 -0
  43. package/dist/cjs/src/utils/numbers.js.map +1 -0
  44. package/dist/cjs/src/utils/pathCurrency.d.ts +3 -0
  45. package/dist/cjs/src/utils/pathCurrency.js +27 -0
  46. package/dist/cjs/src/utils/pathCurrency.js.map +1 -0
  47. package/dist/cjs/src/utils/routerCommands.d.ts +77 -0
  48. package/dist/cjs/src/utils/routerCommands.js +334 -0
  49. package/dist/cjs/src/utils/routerCommands.js.map +1 -0
  50. package/dist/cjs/src/utils/routerTradeAdapter.d.ts +73 -0
  51. package/dist/cjs/src/utils/routerTradeAdapter.js +139 -0
  52. package/dist/cjs/src/utils/routerTradeAdapter.js.map +1 -0
  53. package/dist/esm/src/entities/Command.d.ts +12 -0
  54. package/dist/esm/src/entities/Command.js +6 -0
  55. package/dist/esm/src/entities/Command.js.map +1 -0
  56. package/dist/esm/src/entities/actions/across.d.ts +21 -0
  57. package/dist/esm/src/entities/actions/across.js +3 -0
  58. package/dist/esm/src/entities/actions/across.js.map +1 -0
  59. package/dist/esm/src/entities/actions/index.d.ts +3 -0
  60. package/dist/esm/src/entities/actions/index.js +4 -0
  61. package/dist/esm/src/entities/actions/index.js.map +1 -0
  62. package/dist/esm/src/entities/actions/uniswap.d.ts +38 -0
  63. package/dist/esm/src/entities/actions/uniswap.js +541 -0
  64. package/dist/esm/src/entities/actions/uniswap.js.map +1 -0
  65. package/dist/esm/src/entities/actions/unwrapWETH.d.ts +12 -0
  66. package/dist/esm/src/entities/actions/unwrapWETH.js +28 -0
  67. package/dist/esm/src/entities/actions/unwrapWETH.js.map +1 -0
  68. package/dist/esm/src/entities/index.d.ts +2 -0
  69. package/dist/esm/src/entities/index.js +3 -0
  70. package/dist/esm/src/entities/index.js.map +1 -0
  71. package/dist/esm/src/index.d.ts +11 -0
  72. package/dist/esm/src/index.js +8 -0
  73. package/dist/esm/src/index.js.map +1 -0
  74. package/dist/esm/src/swapRouter.d.ts +87 -0
  75. package/dist/esm/src/swapRouter.js +258 -0
  76. package/dist/esm/src/swapRouter.js.map +1 -0
  77. package/dist/esm/src/utils/commandParser.d.ts +34 -0
  78. package/dist/esm/src/utils/commandParser.js +137 -0
  79. package/dist/esm/src/utils/commandParser.js.map +1 -0
  80. package/dist/esm/src/utils/constants.d.ts +39 -0
  81. package/dist/esm/src/utils/constants.js +541 -0
  82. package/dist/esm/src/utils/constants.js.map +1 -0
  83. package/dist/esm/src/utils/eip712.d.ts +17 -0
  84. package/dist/esm/src/utils/eip712.js +38 -0
  85. package/dist/esm/src/utils/eip712.js.map +1 -0
  86. package/dist/esm/src/utils/getCurrencyAddress.d.ts +2 -0
  87. package/dist/esm/src/utils/getCurrencyAddress.js +5 -0
  88. package/dist/esm/src/utils/getCurrencyAddress.js.map +1 -0
  89. package/dist/esm/src/utils/inputTokens.d.ts +23 -0
  90. package/dist/esm/src/utils/inputTokens.js +51 -0
  91. package/dist/esm/src/utils/inputTokens.js.map +1 -0
  92. package/dist/esm/src/utils/numbers.d.ts +7 -0
  93. package/dist/esm/src/utils/numbers.js +19 -0
  94. package/dist/esm/src/utils/numbers.js.map +1 -0
  95. package/dist/esm/src/utils/pathCurrency.d.ts +3 -0
  96. package/dist/esm/src/utils/pathCurrency.js +23 -0
  97. package/dist/esm/src/utils/pathCurrency.js.map +1 -0
  98. package/dist/esm/src/utils/routerCommands.d.ts +77 -0
  99. package/dist/esm/src/utils/routerCommands.js +329 -0
  100. package/dist/esm/src/utils/routerCommands.js.map +1 -0
  101. package/dist/esm/src/utils/routerTradeAdapter.d.ts +73 -0
  102. package/dist/esm/src/utils/routerTradeAdapter.js +134 -0
  103. package/dist/esm/src/utils/routerTradeAdapter.js.map +1 -0
  104. package/dist/types/src/entities/Command.d.ts +12 -0
  105. package/dist/types/src/entities/actions/across.d.ts +21 -0
  106. package/dist/types/src/entities/actions/index.d.ts +3 -0
  107. package/dist/types/src/entities/actions/uniswap.d.ts +38 -0
  108. package/dist/types/src/entities/actions/unwrapWETH.d.ts +12 -0
  109. package/dist/types/src/entities/index.d.ts +2 -0
  110. package/dist/types/src/index.d.ts +11 -0
  111. package/dist/types/src/swapRouter.d.ts +87 -0
  112. package/dist/types/src/utils/commandParser.d.ts +34 -0
  113. package/dist/types/src/utils/constants.d.ts +39 -0
  114. package/dist/types/src/utils/eip712.d.ts +17 -0
  115. package/dist/types/src/utils/getCurrencyAddress.d.ts +2 -0
  116. package/dist/types/src/utils/inputTokens.d.ts +23 -0
  117. package/dist/types/src/utils/numbers.d.ts +7 -0
  118. package/dist/types/src/utils/pathCurrency.d.ts +3 -0
  119. package/dist/types/src/utils/routerCommands.d.ts +77 -0
  120. package/dist/types/src/utils/routerTradeAdapter.d.ts +73 -0
  121. package/package.json +85 -0
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const tslib_1 = require("tslib");
4
+ tslib_1.__exportStar(require("./actions"), exports);
5
+ tslib_1.__exportStar(require("./Command"), exports);
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/entities/index.ts"],"names":[],"mappings":";;;AAAA,oDAAyB;AACzB,oDAAyB"}
@@ -0,0 +1,11 @@
1
+ export { SwapRouter } from './swapRouter';
2
+ export type { MigrateV3ToV4Options, SignedRouteOptions, EIP712Payload } from './swapRouter';
3
+ export * from './entities';
4
+ export * from './utils/routerTradeAdapter';
5
+ export { RoutePlanner, CommandType, COMMAND_DEFINITION, Parser, Subparser } from './utils/routerCommands';
6
+ export type { CommandDefinition, ParamType } from './utils/routerCommands';
7
+ export { UNIVERSAL_ROUTER_CREATION_BLOCK, UNIVERSAL_ROUTER_ADDRESS, SWAP_PROXY_ADDRESS, ROUTER_AS_RECIPIENT, WETH_ADDRESS, UniversalRouterVersion, isAtLeastV2_1_1, } from './utils/constants';
8
+ export { CommandParser, GenericCommandParser } from './utils/commandParser';
9
+ export type { UniversalRouterCommand, UniversalRouterCall, Param, CommandsDefinition } from './utils/commandParser';
10
+ export type { Permit2Permit } from './utils/inputTokens';
11
+ export { NONCE_SKIP_CHECK, generateNonce, EXECUTE_SIGNED_TYPES, getUniversalRouterDomain } from './utils/eip712';
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getUniversalRouterDomain = exports.EXECUTE_SIGNED_TYPES = exports.generateNonce = exports.NONCE_SKIP_CHECK = exports.GenericCommandParser = exports.CommandParser = exports.isAtLeastV2_1_1 = exports.UniversalRouterVersion = exports.WETH_ADDRESS = exports.ROUTER_AS_RECIPIENT = exports.SWAP_PROXY_ADDRESS = exports.UNIVERSAL_ROUTER_ADDRESS = exports.UNIVERSAL_ROUTER_CREATION_BLOCK = exports.Subparser = exports.Parser = exports.COMMAND_DEFINITION = exports.CommandType = exports.RoutePlanner = exports.SwapRouter = void 0;
4
+ const tslib_1 = require("tslib");
5
+ var swapRouter_1 = require("./swapRouter");
6
+ Object.defineProperty(exports, "SwapRouter", { enumerable: true, get: function () { return swapRouter_1.SwapRouter; } });
7
+ tslib_1.__exportStar(require("./entities"), exports);
8
+ tslib_1.__exportStar(require("./utils/routerTradeAdapter"), exports);
9
+ var routerCommands_1 = require("./utils/routerCommands");
10
+ Object.defineProperty(exports, "RoutePlanner", { enumerable: true, get: function () { return routerCommands_1.RoutePlanner; } });
11
+ Object.defineProperty(exports, "CommandType", { enumerable: true, get: function () { return routerCommands_1.CommandType; } });
12
+ Object.defineProperty(exports, "COMMAND_DEFINITION", { enumerable: true, get: function () { return routerCommands_1.COMMAND_DEFINITION; } });
13
+ Object.defineProperty(exports, "Parser", { enumerable: true, get: function () { return routerCommands_1.Parser; } });
14
+ Object.defineProperty(exports, "Subparser", { enumerable: true, get: function () { return routerCommands_1.Subparser; } });
15
+ var constants_1 = require("./utils/constants");
16
+ Object.defineProperty(exports, "UNIVERSAL_ROUTER_CREATION_BLOCK", { enumerable: true, get: function () { return constants_1.UNIVERSAL_ROUTER_CREATION_BLOCK; } });
17
+ Object.defineProperty(exports, "UNIVERSAL_ROUTER_ADDRESS", { enumerable: true, get: function () { return constants_1.UNIVERSAL_ROUTER_ADDRESS; } });
18
+ Object.defineProperty(exports, "SWAP_PROXY_ADDRESS", { enumerable: true, get: function () { return constants_1.SWAP_PROXY_ADDRESS; } });
19
+ Object.defineProperty(exports, "ROUTER_AS_RECIPIENT", { enumerable: true, get: function () { return constants_1.ROUTER_AS_RECIPIENT; } });
20
+ Object.defineProperty(exports, "WETH_ADDRESS", { enumerable: true, get: function () { return constants_1.WETH_ADDRESS; } });
21
+ Object.defineProperty(exports, "UniversalRouterVersion", { enumerable: true, get: function () { return constants_1.UniversalRouterVersion; } });
22
+ Object.defineProperty(exports, "isAtLeastV2_1_1", { enumerable: true, get: function () { return constants_1.isAtLeastV2_1_1; } });
23
+ var commandParser_1 = require("./utils/commandParser");
24
+ Object.defineProperty(exports, "CommandParser", { enumerable: true, get: function () { return commandParser_1.CommandParser; } });
25
+ Object.defineProperty(exports, "GenericCommandParser", { enumerable: true, get: function () { return commandParser_1.GenericCommandParser; } });
26
+ var eip712_1 = require("./utils/eip712");
27
+ Object.defineProperty(exports, "NONCE_SKIP_CHECK", { enumerable: true, get: function () { return eip712_1.NONCE_SKIP_CHECK; } });
28
+ Object.defineProperty(exports, "generateNonce", { enumerable: true, get: function () { return eip712_1.generateNonce; } });
29
+ Object.defineProperty(exports, "EXECUTE_SIGNED_TYPES", { enumerable: true, get: function () { return eip712_1.EXECUTE_SIGNED_TYPES; } });
30
+ Object.defineProperty(exports, "getUniversalRouterDomain", { enumerable: true, get: function () { return eip712_1.getUniversalRouterDomain; } });
31
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":";;;;AAAA,2CAAyC;AAAhC,wGAAA,UAAU,OAAA;AAEnB,qDAA0B;AAC1B,qEAA0C;AAC1C,yDAAyG;AAAhG,8GAAA,YAAY,OAAA;AAAE,6GAAA,WAAW,OAAA;AAAE,oHAAA,kBAAkB,OAAA;AAAE,wGAAA,MAAM,OAAA;AAAE,2GAAA,SAAS,OAAA;AAEzE,+CAQ0B;AAPxB,4HAAA,+BAA+B,OAAA;AAC/B,qHAAA,wBAAwB,OAAA;AACxB,+GAAA,kBAAkB,OAAA;AAClB,gHAAA,mBAAmB,OAAA;AACnB,yGAAA,YAAY,OAAA;AACZ,mHAAA,sBAAsB,OAAA;AACtB,4GAAA,eAAe,OAAA;AAEjB,uDAA2E;AAAlE,8GAAA,aAAa,OAAA;AAAE,qHAAA,oBAAoB,OAAA;AAG5C,yCAAgH;AAAvG,0GAAA,gBAAgB,OAAA;AAAE,uGAAA,aAAa,OAAA;AAAE,8GAAA,oBAAoB,OAAA;AAAE,kHAAA,wBAAwB,OAAA"}
@@ -0,0 +1,87 @@
1
+ import { Interface } from '@ethersproject/abi';
2
+ import { BigNumber, BigNumberish } from 'ethers';
3
+ import { MethodParameters, Position as V3Position, RemoveLiquidityOptions as V3RemoveLiquidityOptions } from '@centurion_project/v3-sdk';
4
+ import { Position as V4Position, AddLiquidityOptions as V4AddLiquidityOptions } from '@uniswap/v4-sdk';
5
+ import { Trade as RouterTrade } from '@centurion_project/router-sdk';
6
+ import { Currency, TradeType } from '@centurion_project/sdk-core';
7
+ import { SwapOptions } from './entities/actions/uniswap';
8
+ import { AcrossV4DepositV3Params } from './entities/actions/across';
9
+ import { TypedDataDomain, TypedDataField } from '@ethersproject/abstract-signer';
10
+ export type SwapRouterConfig = {
11
+ sender?: string;
12
+ deadline?: BigNumberish;
13
+ };
14
+ export type SignedRouteOptions = {
15
+ intent: string;
16
+ data: string;
17
+ sender: string;
18
+ nonce?: string;
19
+ };
20
+ export type EIP712Payload = {
21
+ domain: TypedDataDomain;
22
+ types: Record<string, TypedDataField[]>;
23
+ value: {
24
+ commands: string;
25
+ inputs: string[];
26
+ intent: string;
27
+ data: string;
28
+ sender: string;
29
+ nonce: string;
30
+ deadline: string;
31
+ };
32
+ };
33
+ export interface MigrateV3ToV4Options {
34
+ inputPosition: V3Position;
35
+ outputPosition: V4Position;
36
+ v3RemoveLiquidityOptions: V3RemoveLiquidityOptions;
37
+ v4AddLiquidityOptions: V4AddLiquidityOptions;
38
+ }
39
+ export declare abstract class SwapRouter {
40
+ static INTERFACE: Interface;
41
+ static PROXY_INTERFACE: Interface;
42
+ static swapCallParameters(trades: RouterTrade<Currency, Currency, TradeType>, options: SwapOptions, bridgeOptions?: AcrossV4DepositV3Params[]): MethodParameters;
43
+ /**
44
+ * Generate EIP712 payload for signed execution (no signing performed)
45
+ * Decodes existing execute() calldata and prepares it for signing
46
+ *
47
+ * @param calldata The calldata from swapCallParameters() or similar
48
+ * @param signedOptions Options for signed execution (intent, data, sender, nonce)
49
+ * @param deadline The deadline timestamp
50
+ * @param chainId The chain ID
51
+ * @param routerAddress The Universal Router contract address
52
+ * @returns EIP712 payload ready to be signed externally
53
+ */
54
+ static getExecuteSignedPayload(calldata: string, signedOptions: SignedRouteOptions, deadline: BigNumberish, chainId: number, routerAddress: string): EIP712Payload;
55
+ /**
56
+ * Encode executeSigned() call with signature
57
+ *
58
+ * @param calldata The original calldata from swapCallParameters()
59
+ * @param signature The signature obtained from external signing
60
+ * @param signedOptions The same options used in getExecuteSignedPayload()
61
+ * @param deadline The deadline timestamp
62
+ * @param nativeCurrencyValue The native currency value (ETH) to send
63
+ * @returns Method parameters for executeSigned()
64
+ */
65
+ static encodeExecuteSigned(calldata: string, signature: string, signedOptions: SignedRouteOptions, deadline: BigNumberish, nativeCurrencyValue?: BigNumber): MethodParameters;
66
+ /**
67
+ * Builds the call parameters for a migration from a V3 position to a V4 position.
68
+ * Some requirements of the parameters:
69
+ * - v3RemoveLiquidityOptions.collectOptions.recipient must equal v4PositionManager
70
+ * - v3RemoveLiquidityOptions.liquidityPercentage must be 100%
71
+ * - input pool and output pool must have the same tokens
72
+ * - V3 NFT must be approved, or valid inputV3NFTPermit must be provided with UR as spender
73
+ */
74
+ static migrateV3ToV4CallParameters(options: MigrateV3ToV4Options, positionManagerOverride?: string): MethodParameters;
75
+ /**
76
+ * Encodes a planned route into a method name and parameters for the Router contract.
77
+ * @param planner the planned route
78
+ * @param nativeCurrencyValue the native currency value of the planned route
79
+ * @param config the router config
80
+ */
81
+ private static encodePlan;
82
+ /**
83
+ * Encodes a planned route into calldata targeting the SwapProxy contract.
84
+ * The proxy pulls ERC20 tokens from the user into the UR, then executes commands.
85
+ */
86
+ private static encodeProxyPlan;
87
+ }
@@ -0,0 +1,263 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SwapRouter = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const tiny_invariant_1 = tslib_1.__importDefault(require("tiny-invariant"));
6
+ const UniversalRouter_json_1 = tslib_1.__importDefault(require("@uniswap/universal-router/artifacts/contracts/UniversalRouter.sol/UniversalRouter.json"));
7
+ const abi_1 = require("@ethersproject/abi");
8
+ const ethers_1 = require("ethers");
9
+ const v3_sdk_1 = require("@centurion_project/v3-sdk");
10
+ const v4_sdk_1 = require("@uniswap/v4-sdk");
11
+ const sdk_core_1 = require("@centurion_project/sdk-core");
12
+ const uniswap_1 = require("./entities/actions/uniswap");
13
+ const routerCommands_1 = require("./utils/routerCommands");
14
+ const inputTokens_1 = require("./utils/inputTokens");
15
+ const constants_1 = require("./utils/constants");
16
+ const eip712_1 = require("./utils/eip712");
17
+ function isMint(options) {
18
+ return Object.keys(options).some((k) => k === 'recipient');
19
+ }
20
+ class SwapRouter {
21
+ static swapCallParameters(trades, options, bridgeOptions // Optional bridge parameters
22
+ ) {
23
+ // TODO: use permit if signature included in swapOptions
24
+ const planner = new routerCommands_1.RoutePlanner();
25
+ const trade = new uniswap_1.UniswapTrade(trades, options);
26
+ const inputCurrency = trade.trade.inputAmount.currency;
27
+ if (options.tokenTransferMode === uniswap_1.TokenTransferMode.ApproveProxy) {
28
+ (0, tiny_invariant_1.default)(!inputCurrency.isNative, 'PROXY_NATIVE_INPUT: SwapProxy only supports ERC20 input');
29
+ (0, tiny_invariant_1.default)(!!options.chainId, 'PROXY_MISSING_CHAIN_ID: chainId required when tokenTransferMode is ApproveProxy');
30
+ (0, tiny_invariant_1.default)(!options.inputTokenPermit, 'PROXY_PERMIT_CONFLICT: Permit2 not used with SwapProxy');
31
+ }
32
+ else {
33
+ (0, tiny_invariant_1.default)(!(inputCurrency.isNative && !!options.inputTokenPermit), 'NATIVE_INPUT_PERMIT');
34
+ if (options.inputTokenPermit) {
35
+ (0, inputTokens_1.encodePermit)(planner, options.inputTokenPermit);
36
+ }
37
+ }
38
+ const nativeCurrencyValue = inputCurrency.isNative
39
+ ? ethers_1.BigNumber.from(trade.trade.maximumAmountIn(options.slippageTolerance).quotient.toString())
40
+ : ethers_1.BigNumber.from(0);
41
+ trade.encode(planner, { allowRevert: false });
42
+ // Add bridge commands if provided
43
+ if (bridgeOptions) {
44
+ for (const bridge of bridgeOptions) {
45
+ planner.addAcrossBridge(bridge);
46
+ }
47
+ }
48
+ if (options.tokenTransferMode === uniswap_1.TokenTransferMode.ApproveProxy) {
49
+ return SwapRouter.encodeProxyPlan(planner, trade, options);
50
+ }
51
+ return SwapRouter.encodePlan(planner, nativeCurrencyValue, {
52
+ deadline: options.deadlineOrPreviousBlockhash ? ethers_1.BigNumber.from(options.deadlineOrPreviousBlockhash) : undefined,
53
+ });
54
+ }
55
+ /**
56
+ * Generate EIP712 payload for signed execution (no signing performed)
57
+ * Decodes existing execute() calldata and prepares it for signing
58
+ *
59
+ * @param calldata The calldata from swapCallParameters() or similar
60
+ * @param signedOptions Options for signed execution (intent, data, sender, nonce)
61
+ * @param deadline The deadline timestamp
62
+ * @param chainId The chain ID
63
+ * @param routerAddress The Universal Router contract address
64
+ * @returns EIP712 payload ready to be signed externally
65
+ */
66
+ static getExecuteSignedPayload(calldata, signedOptions, deadline, chainId, routerAddress) {
67
+ // Decode the execute() calldata to extract commands and inputs
68
+ // Try to decode with deadline first, then without
69
+ let decoded;
70
+ let commands;
71
+ let inputs;
72
+ try {
73
+ decoded = SwapRouter.INTERFACE.decodeFunctionData('execute(bytes,bytes[],uint256)', calldata);
74
+ commands = decoded.commands;
75
+ inputs = decoded.inputs;
76
+ }
77
+ catch (e) {
78
+ // Try without deadline
79
+ decoded = SwapRouter.INTERFACE.decodeFunctionData('execute(bytes,bytes[])', calldata);
80
+ commands = decoded.commands;
81
+ inputs = decoded.inputs;
82
+ }
83
+ // Use provided nonce or generate random one
84
+ const nonce = signedOptions.nonce || (0, eip712_1.generateNonce)();
85
+ // sender is provided directly (address(0) = skip verification)
86
+ const sender = signedOptions.sender;
87
+ const domain = (0, eip712_1.getUniversalRouterDomain)(chainId, routerAddress);
88
+ const intent = signedOptions.intent;
89
+ const data = signedOptions.data;
90
+ const deadlineStr = ethers_1.BigNumber.from(deadline).toString();
91
+ const value = {
92
+ commands,
93
+ inputs,
94
+ intent,
95
+ data,
96
+ sender,
97
+ nonce,
98
+ deadline: deadlineStr,
99
+ };
100
+ return {
101
+ domain,
102
+ types: eip712_1.EXECUTE_SIGNED_TYPES,
103
+ value,
104
+ };
105
+ }
106
+ /**
107
+ * Encode executeSigned() call with signature
108
+ *
109
+ * @param calldata The original calldata from swapCallParameters()
110
+ * @param signature The signature obtained from external signing
111
+ * @param signedOptions The same options used in getExecuteSignedPayload()
112
+ * @param deadline The deadline timestamp
113
+ * @param nativeCurrencyValue The native currency value (ETH) to send
114
+ * @returns Method parameters for executeSigned()
115
+ */
116
+ static encodeExecuteSigned(calldata, signature, signedOptions, deadline, nativeCurrencyValue = ethers_1.BigNumber.from(0)) {
117
+ // Decode the execute() calldata to extract commands and inputs
118
+ // Try to decode with deadline first, then without
119
+ let decoded;
120
+ let commands;
121
+ let inputs;
122
+ try {
123
+ decoded = SwapRouter.INTERFACE.decodeFunctionData('execute(bytes,bytes[],uint256)', calldata);
124
+ commands = decoded.commands;
125
+ inputs = decoded.inputs;
126
+ }
127
+ catch (e) {
128
+ // Try without deadline
129
+ decoded = SwapRouter.INTERFACE.decodeFunctionData('execute(bytes,bytes[])', calldata);
130
+ commands = decoded.commands;
131
+ inputs = decoded.inputs;
132
+ }
133
+ // Use provided nonce (must match what was signed)
134
+ // Nonce must match what was signed - require it to be provided
135
+ if (!signedOptions.nonce) {
136
+ throw new Error('Nonce is required for encodeExecuteSigned - use the nonce from getExecuteSignedPayload');
137
+ }
138
+ const nonce = signedOptions.nonce;
139
+ // Determine verifySender based on sender address
140
+ const verifySender = signedOptions.sender !== '0x0000000000000000000000000000000000000000';
141
+ // Encode executeSigned function call using the Universal Router v2.1 ABI
142
+ const signedCalldata = SwapRouter.INTERFACE.encodeFunctionData('executeSigned', [
143
+ commands,
144
+ inputs,
145
+ signedOptions.intent,
146
+ signedOptions.data,
147
+ verifySender,
148
+ nonce,
149
+ signature,
150
+ deadline,
151
+ ]);
152
+ return { calldata: signedCalldata, value: nativeCurrencyValue.toHexString() };
153
+ }
154
+ /**
155
+ * Builds the call parameters for a migration from a V3 position to a V4 position.
156
+ * Some requirements of the parameters:
157
+ * - v3RemoveLiquidityOptions.collectOptions.recipient must equal v4PositionManager
158
+ * - v3RemoveLiquidityOptions.liquidityPercentage must be 100%
159
+ * - input pool and output pool must have the same tokens
160
+ * - V3 NFT must be approved, or valid inputV3NFTPermit must be provided with UR as spender
161
+ */
162
+ static migrateV3ToV4CallParameters(options, positionManagerOverride) {
163
+ const v4Pool = options.outputPosition.pool;
164
+ const v3Token0 = options.inputPosition.pool.token0;
165
+ const v3Token1 = options.inputPosition.pool.token1;
166
+ const v4PositionManagerAddress = positionManagerOverride !== null && positionManagerOverride !== void 0 ? positionManagerOverride : sdk_core_1.CHAIN_TO_ADDRESSES_MAP[v4Pool.chainId].v4PositionManagerAddress;
167
+ // owner of the v3 nft must be the receiver of the v4 nft
168
+ // validate the parameters
169
+ if (v4Pool.currency0.isNative) {
170
+ (0, tiny_invariant_1.default)((v4Pool.currency0.wrapped.equals(v3Token0) && v4Pool.currency1.equals(v3Token1)) ||
171
+ (v4Pool.currency0.wrapped.equals(v3Token1) && v4Pool.currency1.equals(v3Token0)), 'TOKEN_MISMATCH');
172
+ }
173
+ else {
174
+ (0, tiny_invariant_1.default)(v3Token0 === v4Pool.token0, 'TOKEN0_MISMATCH');
175
+ (0, tiny_invariant_1.default)(v3Token1 === v4Pool.token1, 'TOKEN1_MISMATCH');
176
+ }
177
+ (0, tiny_invariant_1.default)(options.v3RemoveLiquidityOptions.liquidityPercentage.equalTo(new sdk_core_1.Percent(100, 100)), 'FULL_REMOVAL_REQUIRED');
178
+ (0, tiny_invariant_1.default)(options.v3RemoveLiquidityOptions.burnToken == true, 'BURN_TOKEN_REQUIRED');
179
+ (0, tiny_invariant_1.default)(options.v3RemoveLiquidityOptions.collectOptions.recipient === v4PositionManagerAddress, 'RECIPIENT_NOT_POSITION_MANAGER');
180
+ (0, tiny_invariant_1.default)(isMint(options.v4AddLiquidityOptions), 'MINT_REQUIRED');
181
+ (0, tiny_invariant_1.default)(options.v4AddLiquidityOptions.migrate, 'MIGRATE_REQUIRED');
182
+ const planner = new routerCommands_1.RoutePlanner();
183
+ // to prevent reentrancy by the pool hook, we initialize the v4 pool before moving funds
184
+ if (options.v4AddLiquidityOptions.createPool) {
185
+ const poolKey = v4_sdk_1.Pool.getPoolKey(v4Pool.currency0, v4Pool.currency1, v4Pool.fee, v4Pool.tickSpacing, v4Pool.hooks);
186
+ planner.addCommand(routerCommands_1.CommandType.V4_INITIALIZE_POOL, [poolKey, v4Pool.sqrtRatioX96.toString()]);
187
+ // remove createPool setting, so that it doesnt get encoded again later
188
+ delete options.v4AddLiquidityOptions.createPool;
189
+ }
190
+ // add position permit to the universal router planner
191
+ if (options.v3RemoveLiquidityOptions.permit) {
192
+ // permit spender should be UR
193
+ const universalRouterAddress = (0, constants_1.UNIVERSAL_ROUTER_ADDRESS)(constants_1.UniversalRouterVersion.V2_0, options.inputPosition.pool.chainId);
194
+ (0, tiny_invariant_1.default)(universalRouterAddress == options.v3RemoveLiquidityOptions.permit.spender, 'INVALID_SPENDER');
195
+ // don't need to transfer it because v3posm uses isApprovedOrOwner()
196
+ (0, inputTokens_1.encodeV3PositionPermit)(planner, options.v3RemoveLiquidityOptions.permit, options.v3RemoveLiquidityOptions.tokenId);
197
+ // remove permit so that multicall doesnt add it again
198
+ delete options.v3RemoveLiquidityOptions.permit;
199
+ }
200
+ // encode v3 withdraw
201
+ const v3RemoveParams = v3_sdk_1.NonfungiblePositionManager.removeCallParameters(options.inputPosition, options.v3RemoveLiquidityOptions);
202
+ const v3Calls = v3_sdk_1.Multicall.decodeMulticall(v3RemoveParams.calldata);
203
+ for (const v3Call of v3Calls) {
204
+ // slice selector - 0x + 4 bytes = 10 characters
205
+ const selector = v3Call.slice(0, 10);
206
+ (0, tiny_invariant_1.default)(selector == v3_sdk_1.NonfungiblePositionManager.INTERFACE.getSighash('collect') ||
207
+ selector == v3_sdk_1.NonfungiblePositionManager.INTERFACE.getSighash('decreaseLiquidity') ||
208
+ selector == v3_sdk_1.NonfungiblePositionManager.INTERFACE.getSighash('burn'), 'INVALID_V3_CALL: ' + selector);
209
+ planner.addCommand(routerCommands_1.CommandType.V3_POSITION_MANAGER_CALL, [v3Call]);
210
+ }
211
+ // encode v4 mint
212
+ const v4AddParams = v4_sdk_1.V4PositionManager.addCallParameters(options.outputPosition, options.v4AddLiquidityOptions);
213
+ // only modifyLiquidities can be called by the UniversalRouter
214
+ const selector = v4AddParams.calldata.slice(0, 10);
215
+ (0, tiny_invariant_1.default)(selector == v4_sdk_1.V4PositionManager.INTERFACE.getSighash('modifyLiquidities'), 'INVALID_V4_CALL: ' + selector);
216
+ planner.addCommand(routerCommands_1.CommandType.V4_POSITION_MANAGER_CALL, [v4AddParams.calldata]);
217
+ return SwapRouter.encodePlan(planner, ethers_1.BigNumber.from(0), {
218
+ deadline: ethers_1.BigNumber.from(options.v4AddLiquidityOptions.deadline),
219
+ });
220
+ }
221
+ /**
222
+ * Encodes a planned route into a method name and parameters for the Router contract.
223
+ * @param planner the planned route
224
+ * @param nativeCurrencyValue the native currency value of the planned route
225
+ * @param config the router config
226
+ */
227
+ static encodePlan(planner, nativeCurrencyValue, config = {}) {
228
+ const { commands, inputs } = planner;
229
+ const functionSignature = !!config.deadline ? 'execute(bytes,bytes[],uint256)' : 'execute(bytes,bytes[])';
230
+ const parameters = !!config.deadline ? [commands, inputs, config.deadline] : [commands, inputs];
231
+ const calldata = SwapRouter.INTERFACE.encodeFunctionData(functionSignature, parameters);
232
+ return { calldata, value: nativeCurrencyValue.toHexString() };
233
+ }
234
+ /**
235
+ * Encodes a planned route into calldata targeting the SwapProxy contract.
236
+ * The proxy pulls ERC20 tokens from the user into the UR, then executes commands.
237
+ */
238
+ static encodeProxyPlan(planner, trade, options) {
239
+ var _a;
240
+ const { commands, inputs } = planner;
241
+ const routerAddress = (0, constants_1.UNIVERSAL_ROUTER_ADDRESS)((_a = options.urVersion) !== null && _a !== void 0 ? _a : constants_1.UniversalRouterVersion.V2_0, options.chainId);
242
+ const inputToken = trade.trade.inputAmount.currency.address;
243
+ const inputAmount = ethers_1.BigNumber.from(trade.trade.maximumAmountIn(options.slippageTolerance).quotient.toString());
244
+ const deadline = options.deadlineOrPreviousBlockhash
245
+ ? ethers_1.BigNumber.from(options.deadlineOrPreviousBlockhash)
246
+ : ethers_1.BigNumber.from(Math.floor(Date.now() / 1000) + 1800); // 30 min default
247
+ const calldata = SwapRouter.PROXY_INTERFACE.encodeFunctionData('execute', [
248
+ routerAddress,
249
+ inputToken,
250
+ inputAmount,
251
+ commands,
252
+ inputs,
253
+ deadline,
254
+ ]);
255
+ return { calldata, value: ethers_1.BigNumber.from(0).toHexString() };
256
+ }
257
+ }
258
+ exports.SwapRouter = SwapRouter;
259
+ SwapRouter.INTERFACE = new abi_1.Interface(UniversalRouter_json_1.default.abi);
260
+ SwapRouter.PROXY_INTERFACE = new abi_1.Interface([
261
+ 'function execute(address router, address token, uint256 amount, bytes calldata commands, bytes[] calldata inputs, uint256 deadline) external',
262
+ ]);
263
+ //# sourceMappingURL=swapRouter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"swapRouter.js","sourceRoot":"","sources":["../../../src/swapRouter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ import { Interface } from '@ethersproject/abi';
2
+ import { CommandType, CommandDefinition } from '../utils/routerCommands';
3
+ export type Param = {
4
+ readonly name: string;
5
+ readonly value: any;
6
+ };
7
+ export type UniversalRouterCommand = {
8
+ readonly commandName: string;
9
+ readonly commandType: CommandType;
10
+ readonly params: readonly Param[];
11
+ };
12
+ export type UniversalRouterCall = {
13
+ readonly commands: readonly UniversalRouterCommand[];
14
+ };
15
+ export type V3PathItem = {
16
+ readonly tokenIn: string;
17
+ readonly tokenOut: string;
18
+ readonly fee: number;
19
+ };
20
+ export interface CommandsDefinition {
21
+ [key: number]: CommandDefinition;
22
+ }
23
+ export declare abstract class CommandParser {
24
+ static INTERFACE: Interface;
25
+ static parseCalldata(calldata: string): UniversalRouterCall;
26
+ }
27
+ export declare class GenericCommandParser {
28
+ private readonly commandDefinition;
29
+ constructor(commandDefinition: CommandsDefinition);
30
+ parse(commands: string, inputs: string[]): UniversalRouterCall;
31
+ private static getCommands;
32
+ }
33
+ export declare function parseV3PathExactIn(path: string): readonly V3PathItem[];
34
+ export declare function parseV3PathExactOut(path: string): readonly V3PathItem[];
@@ -0,0 +1,145 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parseV3PathExactOut = exports.parseV3PathExactIn = exports.GenericCommandParser = exports.CommandParser = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const ethers_1 = require("ethers");
6
+ const UniversalRouter_json_1 = tslib_1.__importDefault(require("@uniswap/universal-router/artifacts/contracts/UniversalRouter.sol/UniversalRouter.json"));
7
+ const abi_1 = require("@ethersproject/abi");
8
+ const v4_sdk_1 = require("@uniswap/v4-sdk");
9
+ const routerCommands_1 = require("../utils/routerCommands");
10
+ // Parses UniversalRouter V2 commands
11
+ class CommandParser {
12
+ static parseCalldata(calldata) {
13
+ const genericParser = new GenericCommandParser(routerCommands_1.COMMAND_DEFINITION);
14
+ const txDescription = CommandParser.INTERFACE.parseTransaction({ data: calldata });
15
+ const { commands, inputs } = txDescription.args;
16
+ return genericParser.parse(commands, inputs);
17
+ }
18
+ }
19
+ exports.CommandParser = CommandParser;
20
+ CommandParser.INTERFACE = new abi_1.Interface(UniversalRouter_json_1.default.abi);
21
+ // Parses commands based on given command definition
22
+ class GenericCommandParser {
23
+ constructor(commandDefinition) {
24
+ this.commandDefinition = commandDefinition;
25
+ }
26
+ parse(commands, inputs) {
27
+ const commandTypes = GenericCommandParser.getCommands(commands);
28
+ return {
29
+ commands: commandTypes.map((commandType, i) => {
30
+ const commandDef = this.commandDefinition[commandType];
31
+ if (commandDef.parser === routerCommands_1.Parser.V4Actions) {
32
+ const { actions } = v4_sdk_1.V4BaseActionsParser.parseCalldata(inputs[i]);
33
+ return {
34
+ commandName: routerCommands_1.CommandType[commandType],
35
+ commandType,
36
+ params: v4RouterCallToParams(actions),
37
+ };
38
+ }
39
+ else if (commandDef.parser === routerCommands_1.Parser.Abi) {
40
+ const abiDef = commandDef.params;
41
+ const rawParams = ethers_1.ethers.utils.defaultAbiCoder.decode(abiDef.map((command) => command.type), inputs[i]);
42
+ const params = rawParams.map((param, j) => {
43
+ switch (abiDef[j].subparser) {
44
+ case routerCommands_1.Subparser.V3PathExactIn:
45
+ return {
46
+ name: abiDef[j].name,
47
+ value: parseV3PathExactIn(param),
48
+ };
49
+ case routerCommands_1.Subparser.V3PathExactOut:
50
+ return {
51
+ name: abiDef[j].name,
52
+ value: parseV3PathExactOut(param),
53
+ };
54
+ default:
55
+ return {
56
+ name: abiDef[j].name,
57
+ value: param,
58
+ };
59
+ }
60
+ });
61
+ return {
62
+ commandName: routerCommands_1.CommandType[commandType],
63
+ commandType,
64
+ params,
65
+ };
66
+ }
67
+ else if (commandDef.parser === routerCommands_1.Parser.V3Actions) {
68
+ // TODO: implement better parsing here
69
+ return {
70
+ commandName: routerCommands_1.CommandType[commandType],
71
+ commandType,
72
+ params: inputs.map((input) => ({ name: 'command', value: input })),
73
+ };
74
+ }
75
+ else {
76
+ throw new Error(`Unsupported parser: ${commandDef}`);
77
+ }
78
+ }),
79
+ };
80
+ }
81
+ // parse command types from bytes string
82
+ static getCommands(commands) {
83
+ const commandTypes = [];
84
+ for (let i = 2; i < commands.length; i += 2) {
85
+ const byte = commands.substring(i, i + 2);
86
+ commandTypes.push(parseInt(byte, 16));
87
+ }
88
+ return commandTypes;
89
+ }
90
+ }
91
+ exports.GenericCommandParser = GenericCommandParser;
92
+ function parseV3PathExactIn(path) {
93
+ const strippedPath = path.replace('0x', '');
94
+ let tokenIn = ethers_1.ethers.utils.getAddress(strippedPath.substring(0, 40));
95
+ let loc = 40;
96
+ const res = [];
97
+ while (loc < strippedPath.length) {
98
+ const feeAndTokenOut = strippedPath.substring(loc, loc + 46);
99
+ const fee = parseInt(feeAndTokenOut.substring(0, 6), 16);
100
+ const tokenOut = ethers_1.ethers.utils.getAddress(feeAndTokenOut.substring(6, 46));
101
+ res.push({
102
+ tokenIn,
103
+ tokenOut,
104
+ fee,
105
+ });
106
+ tokenIn = tokenOut;
107
+ loc += 46;
108
+ }
109
+ return res;
110
+ }
111
+ exports.parseV3PathExactIn = parseV3PathExactIn;
112
+ function parseV3PathExactOut(path) {
113
+ const strippedPath = path.replace('0x', '');
114
+ let tokenIn = ethers_1.ethers.utils.getAddress(strippedPath.substring(strippedPath.length - 40));
115
+ let loc = strippedPath.length - 86; // 86 = (20 addr + 3 fee + 20 addr) * 2 (for hex characters)
116
+ const res = [];
117
+ while (loc >= 0) {
118
+ const feeAndTokenOut = strippedPath.substring(loc, loc + 46);
119
+ const tokenOut = ethers_1.ethers.utils.getAddress(feeAndTokenOut.substring(0, 40));
120
+ const fee = parseInt(feeAndTokenOut.substring(40, 46), 16);
121
+ res.push({
122
+ tokenIn,
123
+ tokenOut,
124
+ fee,
125
+ });
126
+ tokenIn = tokenOut;
127
+ loc -= 46;
128
+ }
129
+ return res;
130
+ }
131
+ exports.parseV3PathExactOut = parseV3PathExactOut;
132
+ function v4RouterCallToParams(actions) {
133
+ return actions.map((action) => {
134
+ return {
135
+ name: action.actionName,
136
+ value: action.params.map((param) => {
137
+ return {
138
+ name: param.name,
139
+ value: param.value,
140
+ };
141
+ }),
142
+ };
143
+ });
144
+ }
145
+ //# sourceMappingURL=commandParser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commandParser.js","sourceRoot":"","sources":["../../../../src/utils/commandParser.ts"],"names":[],"mappings":"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"}