@uniswap/universal-router-sdk 4.19.0 → 4.19.1

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 (119) hide show
  1. package/dist/{entities → cjs/src/entities}/Command.d.ts +12 -12
  2. package/dist/cjs/src/entities/Command.js +9 -0
  3. package/dist/cjs/src/entities/Command.js.map +1 -0
  4. package/dist/{entities → cjs/src/entities}/actions/index.d.ts +2 -2
  5. package/dist/cjs/src/entities/actions/index.js +6 -0
  6. package/dist/cjs/src/entities/actions/index.js.map +1 -0
  7. package/dist/{entities → cjs/src/entities}/actions/uniswap.d.ts +30 -30
  8. package/dist/cjs/src/entities/actions/uniswap.js +365 -0
  9. package/dist/cjs/src/entities/actions/uniswap.js.map +1 -0
  10. package/dist/{entities → cjs/src/entities}/actions/unwrapWETH.d.ts +12 -12
  11. package/dist/cjs/src/entities/actions/unwrapWETH.js +33 -0
  12. package/dist/cjs/src/entities/actions/unwrapWETH.js.map +1 -0
  13. package/dist/{entities → cjs/src/entities}/index.d.ts +2 -2
  14. package/dist/cjs/src/entities/index.js +6 -0
  15. package/dist/cjs/src/entities/index.js.map +1 -0
  16. package/dist/cjs/src/index.d.ts +9 -0
  17. package/dist/cjs/src/index.js +24 -0
  18. package/dist/cjs/src/index.js.map +1 -0
  19. package/dist/{swapRouter.d.ts → cjs/src/swapRouter.d.ts} +37 -37
  20. package/dist/cjs/src/swapRouter.js +120 -0
  21. package/dist/cjs/src/swapRouter.js.map +1 -0
  22. package/dist/{utils → cjs/src/utils}/commandParser.d.ts +34 -34
  23. package/dist/cjs/src/utils/commandParser.js +144 -0
  24. package/dist/cjs/src/utils/commandParser.js.map +1 -0
  25. package/dist/{utils → cjs/src/utils}/constants.d.ts +30 -30
  26. package/dist/cjs/src/utils/constants.js +373 -0
  27. package/dist/cjs/src/utils/constants.js.map +1 -0
  28. package/dist/{utils → cjs/src/utils}/getCurrencyAddress.d.ts +2 -2
  29. package/dist/cjs/src/utils/getCurrencyAddress.js +9 -0
  30. package/dist/cjs/src/utils/getCurrencyAddress.js.map +1 -0
  31. package/dist/{utils → cjs/src/utils}/inputTokens.d.ts +23 -23
  32. package/dist/cjs/src/utils/inputTokens.js +58 -0
  33. package/dist/cjs/src/utils/inputTokens.js.map +1 -0
  34. package/dist/{utils → cjs/src/utils}/numbers.d.ts +6 -6
  35. package/dist/cjs/src/utils/numbers.js +22 -0
  36. package/dist/cjs/src/utils/numbers.js.map +1 -0
  37. package/dist/{utils → cjs/src/utils}/pathCurrency.d.ts +3 -3
  38. package/dist/cjs/src/utils/pathCurrency.js +27 -0
  39. package/dist/cjs/src/utils/pathCurrency.js.map +1 -0
  40. package/dist/{utils → cjs/src/utils}/routerCommands.d.ts +64 -64
  41. package/dist/cjs/src/utils/routerCommands.js +231 -0
  42. package/dist/cjs/src/utils/routerCommands.js.map +1 -0
  43. package/dist/{utils → cjs/src/utils}/routerTradeAdapter.d.ts +73 -73
  44. package/dist/cjs/src/utils/routerTradeAdapter.js +139 -0
  45. package/dist/cjs/src/utils/routerTradeAdapter.js.map +1 -0
  46. package/dist/esm/src/entities/Command.d.ts +12 -0
  47. package/dist/esm/src/entities/Command.js +6 -0
  48. package/dist/esm/src/entities/Command.js.map +1 -0
  49. package/dist/esm/src/entities/actions/index.d.ts +2 -0
  50. package/dist/esm/src/entities/actions/index.js +3 -0
  51. package/dist/esm/src/entities/actions/index.js.map +1 -0
  52. package/dist/esm/src/entities/actions/uniswap.d.ts +30 -0
  53. package/dist/esm/src/entities/actions/uniswap.js +361 -0
  54. package/dist/esm/src/entities/actions/uniswap.js.map +1 -0
  55. package/dist/esm/src/entities/actions/unwrapWETH.d.ts +12 -0
  56. package/dist/esm/src/entities/actions/unwrapWETH.js +28 -0
  57. package/dist/esm/src/entities/actions/unwrapWETH.js.map +1 -0
  58. package/dist/esm/src/entities/index.d.ts +2 -0
  59. package/dist/esm/src/entities/index.js +3 -0
  60. package/dist/esm/src/entities/index.js.map +1 -0
  61. package/dist/esm/src/index.d.ts +9 -0
  62. package/dist/esm/src/index.js +7 -0
  63. package/dist/esm/src/index.js.map +1 -0
  64. package/dist/esm/src/swapRouter.d.ts +37 -0
  65. package/dist/esm/src/swapRouter.js +115 -0
  66. package/dist/esm/src/swapRouter.js.map +1 -0
  67. package/dist/esm/src/utils/commandParser.d.ts +34 -0
  68. package/dist/esm/src/utils/commandParser.js +137 -0
  69. package/dist/esm/src/utils/commandParser.js.map +1 -0
  70. package/dist/esm/src/utils/constants.d.ts +30 -0
  71. package/dist/esm/src/utils/constants.js +367 -0
  72. package/dist/esm/src/utils/constants.js.map +1 -0
  73. package/dist/esm/src/utils/getCurrencyAddress.d.ts +2 -0
  74. package/dist/esm/src/utils/getCurrencyAddress.js +5 -0
  75. package/dist/esm/src/utils/getCurrencyAddress.js.map +1 -0
  76. package/dist/esm/src/utils/inputTokens.d.ts +23 -0
  77. package/dist/esm/src/utils/inputTokens.js +51 -0
  78. package/dist/esm/src/utils/inputTokens.js.map +1 -0
  79. package/dist/esm/src/utils/numbers.d.ts +6 -0
  80. package/dist/esm/src/utils/numbers.js +15 -0
  81. package/dist/esm/src/utils/numbers.js.map +1 -0
  82. package/dist/esm/src/utils/pathCurrency.d.ts +3 -0
  83. package/dist/esm/src/utils/pathCurrency.js +23 -0
  84. package/dist/esm/src/utils/pathCurrency.js.map +1 -0
  85. package/dist/esm/src/utils/routerCommands.d.ts +64 -0
  86. package/dist/esm/src/utils/routerCommands.js +226 -0
  87. package/dist/esm/src/utils/routerCommands.js.map +1 -0
  88. package/dist/esm/src/utils/routerTradeAdapter.d.ts +73 -0
  89. package/dist/esm/src/utils/routerTradeAdapter.js +134 -0
  90. package/dist/esm/src/utils/routerTradeAdapter.js.map +1 -0
  91. package/dist/types/src/entities/Command.d.ts +12 -0
  92. package/dist/types/src/entities/actions/index.d.ts +2 -0
  93. package/dist/types/src/entities/actions/uniswap.d.ts +30 -0
  94. package/dist/types/src/entities/actions/unwrapWETH.d.ts +12 -0
  95. package/dist/types/src/entities/index.d.ts +2 -0
  96. package/dist/types/src/index.d.ts +9 -0
  97. package/dist/types/src/swapRouter.d.ts +37 -0
  98. package/dist/types/src/utils/commandParser.d.ts +34 -0
  99. package/dist/types/src/utils/constants.d.ts +30 -0
  100. package/dist/types/src/utils/getCurrencyAddress.d.ts +2 -0
  101. package/dist/types/src/utils/inputTokens.d.ts +23 -0
  102. package/dist/types/src/utils/numbers.d.ts +6 -0
  103. package/dist/types/src/utils/pathCurrency.d.ts +3 -0
  104. package/dist/types/src/utils/routerCommands.d.ts +64 -0
  105. package/dist/types/src/utils/routerTradeAdapter.d.ts +73 -0
  106. package/package.json +17 -5
  107. package/dist/index.d.ts +0 -6
  108. package/dist/index.js +0 -8
  109. package/dist/test/forge/writeInterop.d.ts +0 -2
  110. package/dist/test/utils/addresses.d.ts +0 -5
  111. package/dist/test/utils/hexToDecimalString.d.ts +0 -2
  112. package/dist/test/utils/permit2.d.ts +0 -7
  113. package/dist/test/utils/uniswapData.d.ts +0 -24
  114. package/dist/universal-router-sdk.cjs.development.js +0 -1433
  115. package/dist/universal-router-sdk.cjs.development.js.map +0 -1
  116. package/dist/universal-router-sdk.cjs.production.min.js +0 -2
  117. package/dist/universal-router-sdk.cjs.production.min.js.map +0 -1
  118. package/dist/universal-router-sdk.esm.js +0 -1426
  119. package/dist/universal-router-sdk.esm.js.map +0 -1
@@ -1,1426 +0,0 @@
1
- import invariant from 'tiny-invariant';
2
- import { abi } from '@uniswap/universal-router/artifacts/contracts/UniversalRouter.sol/UniversalRouter.json';
3
- import { Interface } from '@ethersproject/abi';
4
- import { BigNumber, ethers } from 'ethers';
5
- import { toHex, Trade as Trade$1, encodeRouteToPath, Pool as Pool$1, NonfungiblePositionManager, Multicall, Route as Route$1 } from '@uniswap/v3-sdk';
6
- import { Pool, Route, Trade as Trade$2, V4Planner, Actions, encodeRouteToPath as encodeRouteToPath$1, V4PositionManager, V4BaseActionsParser } from '@uniswap/v4-sdk';
7
- import { TradeType, Percent, validateAndParseAddress, CHAIN_TO_ADDRESSES_MAP, CurrencyAmount, Ether, Token } from '@uniswap/sdk-core';
8
- import { defaultAbiCoder } from 'ethers/lib/utils';
9
- import { Trade, Pair, Route as Route$2 } from '@uniswap/v2-sdk';
10
- import { Protocol, MixedRouteTrade, partitionMixedRouteByProtocol, getOutputOfPools, MixedRoute, MixedRouteSDK, encodeMixedRouteToPath, Trade as Trade$3 } from '@uniswap/router-sdk';
11
- import 'jsbi';
12
- import 'bignumber.js';
13
-
14
- function _toPrimitive(t, r) {
15
- if ("object" != typeof t || !t) return t;
16
- var e = t[Symbol.toPrimitive];
17
- if (void 0 !== e) {
18
- var i = e.call(t, r || "default");
19
- if ("object" != typeof i) return i;
20
- throw new TypeError("@@toPrimitive must return a primitive value.");
21
- }
22
- return ("string" === r ? String : Number)(t);
23
- }
24
- function _toPropertyKey(t) {
25
- var i = _toPrimitive(t, "string");
26
- return "symbol" == typeof i ? i : String(i);
27
- }
28
- function _defineProperties(target, props) {
29
- for (var i = 0; i < props.length; i++) {
30
- var descriptor = props[i];
31
- descriptor.enumerable = descriptor.enumerable || false;
32
- descriptor.configurable = true;
33
- if ("value" in descriptor) descriptor.writable = true;
34
- Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor);
35
- }
36
- }
37
- function _createClass(Constructor, protoProps, staticProps) {
38
- if (protoProps) _defineProperties(Constructor.prototype, protoProps);
39
- if (staticProps) _defineProperties(Constructor, staticProps);
40
- Object.defineProperty(Constructor, "prototype", {
41
- writable: false
42
- });
43
- return Constructor;
44
- }
45
- function _unsupportedIterableToArray(o, minLen) {
46
- if (!o) return;
47
- if (typeof o === "string") return _arrayLikeToArray(o, minLen);
48
- var n = Object.prototype.toString.call(o).slice(8, -1);
49
- if (n === "Object" && o.constructor) n = o.constructor.name;
50
- if (n === "Map" || n === "Set") return Array.from(o);
51
- if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);
52
- }
53
- function _arrayLikeToArray(arr, len) {
54
- if (len == null || len > arr.length) len = arr.length;
55
- for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];
56
- return arr2;
57
- }
58
- function _createForOfIteratorHelperLoose(o, allowArrayLike) {
59
- var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"];
60
- if (it) return (it = it.call(o)).next.bind(it);
61
- if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") {
62
- if (it) o = it;
63
- var i = 0;
64
- return function () {
65
- if (i >= o.length) return {
66
- done: true
67
- };
68
- return {
69
- done: false,
70
- value: o[i++]
71
- };
72
- };
73
- }
74
- throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
75
- }
76
-
77
- var _COMMAND_DEFINITION;
78
- /**
79
- * CommandTypes
80
- * @description Flags that modify a command's execution
81
- * @enum {number}
82
- */
83
- var CommandType;
84
- (function (CommandType) {
85
- CommandType[CommandType["V3_SWAP_EXACT_IN"] = 0] = "V3_SWAP_EXACT_IN";
86
- CommandType[CommandType["V3_SWAP_EXACT_OUT"] = 1] = "V3_SWAP_EXACT_OUT";
87
- CommandType[CommandType["PERMIT2_TRANSFER_FROM"] = 2] = "PERMIT2_TRANSFER_FROM";
88
- CommandType[CommandType["PERMIT2_PERMIT_BATCH"] = 3] = "PERMIT2_PERMIT_BATCH";
89
- CommandType[CommandType["SWEEP"] = 4] = "SWEEP";
90
- CommandType[CommandType["TRANSFER"] = 5] = "TRANSFER";
91
- CommandType[CommandType["PAY_PORTION"] = 6] = "PAY_PORTION";
92
- CommandType[CommandType["V2_SWAP_EXACT_IN"] = 8] = "V2_SWAP_EXACT_IN";
93
- CommandType[CommandType["V2_SWAP_EXACT_OUT"] = 9] = "V2_SWAP_EXACT_OUT";
94
- CommandType[CommandType["PERMIT2_PERMIT"] = 10] = "PERMIT2_PERMIT";
95
- CommandType[CommandType["WRAP_ETH"] = 11] = "WRAP_ETH";
96
- CommandType[CommandType["UNWRAP_WETH"] = 12] = "UNWRAP_WETH";
97
- CommandType[CommandType["PERMIT2_TRANSFER_FROM_BATCH"] = 13] = "PERMIT2_TRANSFER_FROM_BATCH";
98
- CommandType[CommandType["BALANCE_CHECK_ERC20"] = 14] = "BALANCE_CHECK_ERC20";
99
- CommandType[CommandType["V4_SWAP"] = 16] = "V4_SWAP";
100
- CommandType[CommandType["V3_POSITION_MANAGER_PERMIT"] = 17] = "V3_POSITION_MANAGER_PERMIT";
101
- CommandType[CommandType["V3_POSITION_MANAGER_CALL"] = 18] = "V3_POSITION_MANAGER_CALL";
102
- CommandType[CommandType["V4_INITIALIZE_POOL"] = 19] = "V4_INITIALIZE_POOL";
103
- CommandType[CommandType["V4_POSITION_MANAGER_CALL"] = 20] = "V4_POSITION_MANAGER_CALL";
104
- CommandType[CommandType["EXECUTE_SUB_PLAN"] = 33] = "EXECUTE_SUB_PLAN";
105
- })(CommandType || (CommandType = {}));
106
- var Subparser;
107
- (function (Subparser) {
108
- Subparser[Subparser["V3PathExactIn"] = 0] = "V3PathExactIn";
109
- Subparser[Subparser["V3PathExactOut"] = 1] = "V3PathExactOut";
110
- })(Subparser || (Subparser = {}));
111
- var Parser;
112
- (function (Parser) {
113
- Parser[Parser["Abi"] = 0] = "Abi";
114
- Parser[Parser["V4Actions"] = 1] = "V4Actions";
115
- Parser[Parser["V3Actions"] = 2] = "V3Actions";
116
- })(Parser || (Parser = {}));
117
- var ALLOW_REVERT_FLAG = 0x80;
118
- var REVERTIBLE_COMMANDS = /*#__PURE__*/new Set([CommandType.EXECUTE_SUB_PLAN]);
119
- var PERMIT_STRUCT = '((address token,uint160 amount,uint48 expiration,uint48 nonce) details,address spender,uint256 sigDeadline)';
120
- var PERMIT_BATCH_STRUCT = '((address token,uint160 amount,uint48 expiration,uint48 nonce)[] details,address spender,uint256 sigDeadline)';
121
- var POOL_KEY_STRUCT = '(address currency0,address currency1,uint24 fee,int24 tickSpacing,address hooks)';
122
- var PERMIT2_TRANSFER_FROM_STRUCT = '(address from,address to,uint160 amount,address token)';
123
- var PERMIT2_TRANSFER_FROM_BATCH_STRUCT = PERMIT2_TRANSFER_FROM_STRUCT + '[]';
124
- var COMMAND_DEFINITION = (_COMMAND_DEFINITION = {}, _COMMAND_DEFINITION[CommandType.EXECUTE_SUB_PLAN] = {
125
- parser: Parser.Abi,
126
- params: [{
127
- name: 'commands',
128
- type: 'bytes'
129
- }, {
130
- name: 'inputs',
131
- type: 'bytes[]'
132
- }]
133
- }, _COMMAND_DEFINITION[CommandType.PERMIT2_PERMIT] = {
134
- parser: Parser.Abi,
135
- params: [{
136
- name: 'permit',
137
- type: PERMIT_STRUCT
138
- }, {
139
- name: 'signature',
140
- type: 'bytes'
141
- }]
142
- }, _COMMAND_DEFINITION[CommandType.PERMIT2_PERMIT_BATCH] = {
143
- parser: Parser.Abi,
144
- params: [{
145
- name: 'permit',
146
- type: PERMIT_BATCH_STRUCT
147
- }, {
148
- name: 'signature',
149
- type: 'bytes'
150
- }]
151
- }, _COMMAND_DEFINITION[CommandType.PERMIT2_TRANSFER_FROM] = {
152
- parser: Parser.Abi,
153
- params: [{
154
- name: 'token',
155
- type: 'address'
156
- }, {
157
- name: 'recipient',
158
- type: 'address'
159
- }, {
160
- name: 'amount',
161
- type: 'uint160'
162
- }]
163
- }, _COMMAND_DEFINITION[CommandType.PERMIT2_TRANSFER_FROM_BATCH] = {
164
- parser: Parser.Abi,
165
- params: [{
166
- name: 'transferFrom',
167
- type: PERMIT2_TRANSFER_FROM_BATCH_STRUCT
168
- }]
169
- }, _COMMAND_DEFINITION[CommandType.V3_SWAP_EXACT_IN] = {
170
- parser: Parser.Abi,
171
- params: [{
172
- name: 'recipient',
173
- type: 'address'
174
- }, {
175
- name: 'amountIn',
176
- type: 'uint256'
177
- }, {
178
- name: 'amountOutMin',
179
- type: 'uint256'
180
- }, {
181
- name: 'path',
182
- subparser: Subparser.V3PathExactIn,
183
- type: 'bytes'
184
- }, {
185
- name: 'payerIsUser',
186
- type: 'bool'
187
- }]
188
- }, _COMMAND_DEFINITION[CommandType.V3_SWAP_EXACT_OUT] = {
189
- parser: Parser.Abi,
190
- params: [{
191
- name: 'recipient',
192
- type: 'address'
193
- }, {
194
- name: 'amountOut',
195
- type: 'uint256'
196
- }, {
197
- name: 'amountInMax',
198
- type: 'uint256'
199
- }, {
200
- name: 'path',
201
- subparser: Subparser.V3PathExactOut,
202
- type: 'bytes'
203
- }, {
204
- name: 'payerIsUser',
205
- type: 'bool'
206
- }]
207
- }, _COMMAND_DEFINITION[CommandType.V2_SWAP_EXACT_IN] = {
208
- parser: Parser.Abi,
209
- params: [{
210
- name: 'recipient',
211
- type: 'address'
212
- }, {
213
- name: 'amountIn',
214
- type: 'uint256'
215
- }, {
216
- name: 'amountOutMin',
217
- type: 'uint256'
218
- }, {
219
- name: 'path',
220
- type: 'address[]'
221
- }, {
222
- name: 'payerIsUser',
223
- type: 'bool'
224
- }]
225
- }, _COMMAND_DEFINITION[CommandType.V2_SWAP_EXACT_OUT] = {
226
- parser: Parser.Abi,
227
- params: [{
228
- name: 'recipient',
229
- type: 'address'
230
- }, {
231
- name: 'amountOut',
232
- type: 'uint256'
233
- }, {
234
- name: 'amountInMax',
235
- type: 'uint256'
236
- }, {
237
- name: 'path',
238
- type: 'address[]'
239
- }, {
240
- name: 'payerIsUser',
241
- type: 'bool'
242
- }]
243
- }, _COMMAND_DEFINITION[CommandType.V4_SWAP] = {
244
- parser: Parser.V4Actions
245
- }, _COMMAND_DEFINITION[CommandType.WRAP_ETH] = {
246
- parser: Parser.Abi,
247
- params: [{
248
- name: 'recipient',
249
- type: 'address'
250
- }, {
251
- name: 'amount',
252
- type: 'uint256'
253
- }]
254
- }, _COMMAND_DEFINITION[CommandType.UNWRAP_WETH] = {
255
- parser: Parser.Abi,
256
- params: [{
257
- name: 'recipient',
258
- type: 'address'
259
- }, {
260
- name: 'amountMin',
261
- type: 'uint256'
262
- }]
263
- }, _COMMAND_DEFINITION[CommandType.SWEEP] = {
264
- parser: Parser.Abi,
265
- params: [{
266
- name: 'token',
267
- type: 'address'
268
- }, {
269
- name: 'recipient',
270
- type: 'address'
271
- }, {
272
- name: 'amountMin',
273
- type: 'uint256'
274
- }]
275
- }, _COMMAND_DEFINITION[CommandType.TRANSFER] = {
276
- parser: Parser.Abi,
277
- params: [{
278
- name: 'token',
279
- type: 'address'
280
- }, {
281
- name: 'recipient',
282
- type: 'address'
283
- }, {
284
- name: 'value',
285
- type: 'uint256'
286
- }]
287
- }, _COMMAND_DEFINITION[CommandType.PAY_PORTION] = {
288
- parser: Parser.Abi,
289
- params: [{
290
- name: 'token',
291
- type: 'address'
292
- }, {
293
- name: 'recipient',
294
- type: 'address'
295
- }, {
296
- name: 'bips',
297
- type: 'uint256'
298
- }]
299
- }, _COMMAND_DEFINITION[CommandType.BALANCE_CHECK_ERC20] = {
300
- parser: Parser.Abi,
301
- params: [{
302
- name: 'owner',
303
- type: 'address'
304
- }, {
305
- name: 'token',
306
- type: 'address'
307
- }, {
308
- name: 'minBalance',
309
- type: 'uint256'
310
- }]
311
- }, _COMMAND_DEFINITION[CommandType.V4_INITIALIZE_POOL] = {
312
- parser: Parser.Abi,
313
- params: [{
314
- name: 'poolKey',
315
- type: POOL_KEY_STRUCT
316
- }, {
317
- name: 'sqrtPriceX96',
318
- type: 'uint160'
319
- }]
320
- }, _COMMAND_DEFINITION[CommandType.V3_POSITION_MANAGER_PERMIT] = {
321
- parser: Parser.V3Actions
322
- }, _COMMAND_DEFINITION[CommandType.V3_POSITION_MANAGER_CALL] = {
323
- parser: Parser.V3Actions
324
- }, _COMMAND_DEFINITION[CommandType.V4_POSITION_MANAGER_CALL] = {
325
- parser: Parser.V4Actions
326
- }, _COMMAND_DEFINITION);
327
- var RoutePlanner = /*#__PURE__*/function () {
328
- function RoutePlanner() {
329
- this.commands = '0x';
330
- this.inputs = [];
331
- }
332
- var _proto = RoutePlanner.prototype;
333
- _proto.addSubPlan = function addSubPlan(subplan) {
334
- this.addCommand(CommandType.EXECUTE_SUB_PLAN, [subplan.commands, subplan.inputs], true);
335
- return this;
336
- };
337
- _proto.addCommand = function addCommand(type, parameters, allowRevert) {
338
- if (allowRevert === void 0) {
339
- allowRevert = false;
340
- }
341
- var command = createCommand(type, parameters);
342
- this.inputs.push(command.encodedInput);
343
- if (allowRevert) {
344
- if (!REVERTIBLE_COMMANDS.has(command.type)) {
345
- throw new Error("command type: " + command.type + " cannot be allowed to revert");
346
- }
347
- command.type = command.type | ALLOW_REVERT_FLAG;
348
- }
349
- this.commands = this.commands.concat(command.type.toString(16).padStart(2, '0'));
350
- return this;
351
- };
352
- return RoutePlanner;
353
- }();
354
- function createCommand(type, parameters) {
355
- var commandDef = COMMAND_DEFINITION[type];
356
- switch (commandDef.parser) {
357
- case Parser.Abi:
358
- var encodedInput = defaultAbiCoder.encode(commandDef.params.map(function (abi) {
359
- return abi.type;
360
- }), parameters);
361
- return {
362
- type: type,
363
- encodedInput: encodedInput
364
- };
365
- case Parser.V4Actions:
366
- // v4 swap data comes pre-encoded at index 0
367
- return {
368
- type: type,
369
- encodedInput: parameters[0]
370
- };
371
- case Parser.V3Actions:
372
- // v4 swap data comes pre-encoded at index 0
373
- return {
374
- type: type,
375
- encodedInput: parameters[0]
376
- };
377
- }
378
- }
379
-
380
- function getPathCurrency(currency, pool) {
381
- // return currency if the currency matches a currency of the pool
382
- if (pool.involvesToken(currency)) {
383
- return currency;
384
- // return if currency.wrapped if pool involves wrapped currency
385
- } else if (pool.involvesToken(currency.wrapped)) {
386
- return currency.wrapped;
387
- // return native currency if pool involves native version of wrapped currency (only applies to V4)
388
- } else if (pool instanceof Pool && pool.token0.wrapped.equals(currency)) {
389
- return pool.token0;
390
- } else if (pool instanceof Pool && pool.token1.wrapped.equals(currency)) {
391
- return pool.token1;
392
- } else {
393
- throw new Error("Expected currency " + currency.symbol + " to be either " + pool.token0.symbol + " or " + pool.token1.symbol);
394
- }
395
- }
396
-
397
- var RouterActionType;
398
- (function (RouterActionType) {
399
- RouterActionType["UniswapTrade"] = "UniswapTrade";
400
- RouterActionType["UnwrapWETH"] = "UnwrapWETH";
401
- })(RouterActionType || (RouterActionType = {}));
402
-
403
- var _routerConfigs, _routerConfigs2, _routerConfigs3, _routerConfigs4, _routerConfigs5, _routerConfigs6, _routerConfigs7, _routerConfigs8, _routerConfigs9, _routerConfigs10, _routerConfigs11, _routerConfigs12, _routerConfigs13, _routerConfigs14, _routerConfigs15, _routerConfigs16, _routerConfigs17, _routerConfigs18, _routerConfigs19, _routerConfigs20, _routerConfigs21, _routerConfigs22, _routerConfigs23, _routerConfigs24, _CHAIN_CONFIGS;
404
- var UniversalRouterVersion;
405
- (function (UniversalRouterVersion) {
406
- UniversalRouterVersion["V1_2"] = "1.2";
407
- UniversalRouterVersion["V2_0"] = "2.0";
408
- })(UniversalRouterVersion || (UniversalRouterVersion = {}));
409
- var WETH_NOT_SUPPORTED_ON_CHAIN = '0x0000000000000000000000000000000000000000';
410
- // Todo: Change `CHAIN_CONFIGS` to pull the UR address with v4
411
- var CHAIN_CONFIGS = (_CHAIN_CONFIGS = {}, _CHAIN_CONFIGS[1] = {
412
- weth: '0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2',
413
- routerConfigs: (_routerConfigs = {}, _routerConfigs[UniversalRouterVersion.V1_2] = {
414
- address: '0x3fC91A3afd70395Cd496C647d5a6CC9D4B2b7FAD',
415
- creationBlock: 17143817
416
- }, _routerConfigs[UniversalRouterVersion.V2_0] = {
417
- address: '0x66a9893cc07d91d95644aedd05d03f95e1dba8af',
418
- creationBlock: 1737658355
419
- }, _routerConfigs)
420
- }, _CHAIN_CONFIGS[5] = {
421
- weth: '0xb4fbf271143f4fbf7b91a5ded31805e42b2208d6',
422
- routerConfigs: (_routerConfigs2 = {}, _routerConfigs2[UniversalRouterVersion.V1_2] = {
423
- address: '0x3fC91A3afd70395Cd496C647d5a6CC9D4B2b7FAD',
424
- creationBlock: 8940568
425
- }, _routerConfigs2[UniversalRouterVersion.V2_0] = {
426
- address: '0x3fC91A3afd70395Cd496C647d5a6CC9D4B2b7FAD',
427
- creationBlock: 8940568
428
- }, _routerConfigs2)
429
- }, _CHAIN_CONFIGS[11155111] = {
430
- weth: '0xfFf9976782d46CC05630D1f6eBAb18b2324d6B14',
431
- routerConfigs: (_routerConfigs3 = {}, _routerConfigs3[UniversalRouterVersion.V1_2] = {
432
- address: '0x3fC91A3afd70395Cd496C647d5a6CC9D4B2b7FAD',
433
- creationBlock: 3543575
434
- }, _routerConfigs3[UniversalRouterVersion.V2_0] = {
435
- address: '0x3a9d48ab9751398bbfa63ad67599bb04e4bdf98b',
436
- creationBlock: 7259601
437
- }, _routerConfigs3)
438
- }, _CHAIN_CONFIGS[137] = {
439
- weth: '0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270',
440
- routerConfigs: (_routerConfigs4 = {}, _routerConfigs4[UniversalRouterVersion.V1_2] = {
441
- address: '0xec7BE89e9d109e7e3Fec59c222CF297125FEFda2',
442
- creationBlock: 52210153
443
- }, _routerConfigs4[UniversalRouterVersion.V2_0] = {
444
- address: '0x1095692a6237d83c6a72f3f5efedb9a670c49223',
445
- creationBlock: 1737492197
446
- }, _routerConfigs4)
447
- }, _CHAIN_CONFIGS[80001] = {
448
- weth: '0x9c3C9283D3e44854697Cd22D3Faa240Cfb032889',
449
- routerConfigs: (_routerConfigs5 = {}, _routerConfigs5[UniversalRouterVersion.V1_2] = {
450
- address: '0x3fC91A3afd70395Cd496C647d5a6CC9D4B2b7FAD',
451
- creationBlock: 35176052
452
- }, _routerConfigs5[UniversalRouterVersion.V2_0] = {
453
- address: '0x3fC91A3afd70395Cd496C647d5a6CC9D4B2b7FAD',
454
- creationBlock: 35176052
455
- }, _routerConfigs5)
456
- }, _CHAIN_CONFIGS[10] = {
457
- weth: '0x4200000000000000000000000000000000000006',
458
- routerConfigs: (_routerConfigs6 = {}, _routerConfigs6[UniversalRouterVersion.V1_2] = {
459
- address: '0xCb1355ff08Ab38bBCE60111F1bb2B784bE25D7e8',
460
- creationBlock: 114702266
461
- }, _routerConfigs6[UniversalRouterVersion.V2_0] = {
462
- address: '0x851116d9223fabed8e56c0e6b8ad0c31d98b3507',
463
- creationBlock: 1737494278
464
- }, _routerConfigs6)
465
- }, _CHAIN_CONFIGS[420] = {
466
- weth: '0x4200000000000000000000000000000000000006',
467
- routerConfigs: (_routerConfigs7 = {}, _routerConfigs7[UniversalRouterVersion.V1_2] = {
468
- address: '0x3fC91A3afd70395Cd496C647d5a6CC9D4B2b7FAD',
469
- creationBlock: 8887728
470
- }, _routerConfigs7[UniversalRouterVersion.V2_0] = {
471
- address: '0x3fC91A3afd70395Cd496C647d5a6CC9D4B2b7FAD',
472
- creationBlock: 8887728
473
- }, _routerConfigs7)
474
- }, _CHAIN_CONFIGS[42161] = {
475
- weth: '0x82aF49447D8a07e3bd95BD0d56f35241523fBab1',
476
- routerConfigs: (_routerConfigs8 = {}, _routerConfigs8[UniversalRouterVersion.V1_2] = {
477
- address: '0x5E325eDA8064b456f4781070C0738d849c824258',
478
- creationBlock: 169472836
479
- }, _routerConfigs8[UniversalRouterVersion.V2_0] = {
480
- address: '0xa51afafe0263b40edaef0df8781ea9aa03e381a3',
481
- creationBlock: 1737487458
482
- }, _routerConfigs8)
483
- }, _CHAIN_CONFIGS[421613] = {
484
- weth: '0xe39Ab88f8A4777030A534146A9Ca3B52bd5D43A3',
485
- routerConfigs: (_routerConfigs9 = {}, _routerConfigs9[UniversalRouterVersion.V1_2] = {
486
- address: '0x3fC91A3afd70395Cd496C647d5a6CC9D4B2b7FAD',
487
- creationBlock: 18815277
488
- }, _routerConfigs9[UniversalRouterVersion.V2_0] = {
489
- address: '0x3fC91A3afd70395Cd496C647d5a6CC9D4B2b7FAD',
490
- creationBlock: 18815277
491
- }, _routerConfigs9)
492
- }, _CHAIN_CONFIGS[42220] = {
493
- weth: WETH_NOT_SUPPORTED_ON_CHAIN,
494
- routerConfigs: (_routerConfigs10 = {}, _routerConfigs10[UniversalRouterVersion.V1_2] = {
495
- address: '0x643770e279d5d0733f21d6dc03a8efbabf3255b4',
496
- creationBlock: 21407637
497
- }, _routerConfigs10[UniversalRouterVersion.V2_0] = {
498
- address: '0x643770e279d5d0733f21d6dc03a8efbabf3255b4',
499
- creationBlock: 21407637
500
- }, _routerConfigs10)
501
- }, _CHAIN_CONFIGS[44787] = {
502
- weth: WETH_NOT_SUPPORTED_ON_CHAIN,
503
- routerConfigs: (_routerConfigs11 = {}, _routerConfigs11[UniversalRouterVersion.V1_2] = {
504
- address: '0x3fC91A3afd70395Cd496C647d5a6CC9D4B2b7FAD',
505
- creationBlock: 17566658
506
- }, _routerConfigs11[UniversalRouterVersion.V2_0] = {
507
- address: '0x3fC91A3afd70395Cd496C647d5a6CC9D4B2b7FAD',
508
- creationBlock: 17566658
509
- }, _routerConfigs11)
510
- }, _CHAIN_CONFIGS[56] = {
511
- weth: '0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c',
512
- routerConfigs: (_routerConfigs12 = {}, _routerConfigs12[UniversalRouterVersion.V1_2] = {
513
- address: '0x4Dae2f939ACf50408e13d58534Ff8c2776d45265',
514
- creationBlock: 35160263
515
- }, _routerConfigs12[UniversalRouterVersion.V2_0] = {
516
- address: '0x1906c1d672b88cd1b9ac7593301ca990f94eae07',
517
- creationBlock: 1737493275
518
- }, _routerConfigs12)
519
- }, _CHAIN_CONFIGS[43114] = {
520
- weth: '0xB31f66AA3C1e785363F0875A1B74E27b85FD66c7',
521
- routerConfigs: (_routerConfigs13 = {}, _routerConfigs13[UniversalRouterVersion.V1_2] = {
522
- address: '0x4Dae2f939ACf50408e13d58534Ff8c2776d45265',
523
- creationBlock: 40237257
524
- }, _routerConfigs13[UniversalRouterVersion.V2_0] = {
525
- address: '0x94b75331ae8d42c1b61065089b7d48fe14aa73b7',
526
- creationBlock: 1737558236
527
- }, _routerConfigs13)
528
- }, _CHAIN_CONFIGS[84531] = {
529
- weth: '0x4200000000000000000000000000000000000006',
530
- routerConfigs: (_routerConfigs14 = {}, _routerConfigs14[UniversalRouterVersion.V1_2] = {
531
- address: '0xd0872d928672ae2ff74bdb2f5130ac12229cafaf',
532
- creationBlock: 6915289
533
- }, _routerConfigs14[UniversalRouterVersion.V2_0] = {
534
- address: '0xd0872d928672ae2ff74bdb2f5130ac12229cafaf',
535
- creationBlock: 6915289
536
- }, _routerConfigs14)
537
- }, _CHAIN_CONFIGS[8453] = {
538
- weth: '0x4200000000000000000000000000000000000006',
539
- routerConfigs: (_routerConfigs15 = {}, _routerConfigs15[UniversalRouterVersion.V1_2] = {
540
- address: '0x3fC91A3afd70395Cd496C647d5a6CC9D4B2b7FAD',
541
- creationBlock: 9107268
542
- }, _routerConfigs15[UniversalRouterVersion.V2_0] = {
543
- address: '0x6ff5693b99212da76ad316178a184ab56d299b43',
544
- creationBlock: 1737491485
545
- }, _routerConfigs15)
546
- }, _CHAIN_CONFIGS[81457] = {
547
- weth: '0x4300000000000000000000000000000000000004',
548
- routerConfigs: (_routerConfigs16 = {}, _routerConfigs16[UniversalRouterVersion.V1_2] = {
549
- address: '0x643770E279d5D0733F21d6DC03A8efbABf3255B4',
550
- creationBlock: 1116444
551
- }, _routerConfigs16[UniversalRouterVersion.V2_0] = {
552
- address: '0xeabbcb3e8e415306207ef514f660a3f820025be3',
553
- creationBlock: 1737564586
554
- }, _routerConfigs16)
555
- }, _CHAIN_CONFIGS[7777777] = {
556
- weth: '0x4200000000000000000000000000000000000006',
557
- routerConfigs: (_routerConfigs17 = {}, _routerConfigs17[UniversalRouterVersion.V1_2] = {
558
- address: '0x2986d9721A49838ab4297b695858aF7F17f38014',
559
- creationBlock: 11832155
560
- }, _routerConfigs17[UniversalRouterVersion.V2_0] = {
561
- address: '0x3315ef7ca28db74abadc6c44570efdf06b04b020',
562
- creationBlock: 1737562927
563
- }, _routerConfigs17)
564
- }, _CHAIN_CONFIGS[324] = {
565
- weth: '0x5aea5775959fbc2557cc8789bc1bf90a239d9a91',
566
- routerConfigs: (_routerConfigs18 = {}, _routerConfigs18[UniversalRouterVersion.V1_2] = {
567
- address: '0x28731BCC616B5f51dD52CF2e4dF0E78dD1136C06',
568
- creationBlock: 12640979
569
- }, _routerConfigs18[UniversalRouterVersion.V2_0] = {
570
- address: '0x28731BCC616B5f51dD52CF2e4dF0E78dD1136C06',
571
- creationBlock: 12640979
572
- }, _routerConfigs18)
573
- }, _CHAIN_CONFIGS[480] = {
574
- weth: '0x4200000000000000000000000000000000000006',
575
- routerConfigs: (_routerConfigs19 = {}, _routerConfigs19[UniversalRouterVersion.V1_2] = {
576
- address: '0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D',
577
- creationBlock: 4063979
578
- }, _routerConfigs19[UniversalRouterVersion.V2_0] = {
579
- address: '0x8ac7bee993bb44dab564ea4bc9ea67bf9eb5e743',
580
- creationBlock: 1737559557
581
- }, _routerConfigs19)
582
- }, _CHAIN_CONFIGS[1301] = {
583
- weth: '0x4200000000000000000000000000000000000006',
584
- routerConfigs: (_routerConfigs20 = {}, _routerConfigs20[UniversalRouterVersion.V1_2] = {
585
- address: '0x8909Dc15e40173Ff4699343b6eB8132c65e18eC6',
586
- creationBlock: 1241811
587
- }, _routerConfigs20[UniversalRouterVersion.V2_0] = {
588
- address: '0xf70536b3bcc1bd1a972dc186a2cf84cc6da6be5d',
589
- creationBlock: 7100543
590
- }, _routerConfigs20)
591
- }, _CHAIN_CONFIGS[130] = {
592
- weth: '0x4200000000000000000000000000000000000006',
593
- routerConfigs: (_routerConfigs21 = {}, _routerConfigs21[UniversalRouterVersion.V1_2] = {
594
- address: '0x4D73A4411CA1c660035e4AECC8270E5DdDEC8C17',
595
- creationBlock: 23678
596
- }, _routerConfigs21[UniversalRouterVersion.V2_0] = {
597
- address: '0xef740bf23acae26f6492b10de645d6b98dc8eaf3',
598
- creationBlock: 1737568156
599
- }, _routerConfigs21)
600
- }, _CHAIN_CONFIGS[10143] = {
601
- weth: '0x760AfE86e5de5fa0Ee542fc7B7B713e1c5425701',
602
- routerConfigs: (_routerConfigs22 = {}, _routerConfigs22[UniversalRouterVersion.V1_2] = {
603
- address: '0x3ae6d8a282d67893e17aa70ebffb33ee5aa65893',
604
- creationBlock: 23678
605
- }, _routerConfigs22[UniversalRouterVersion.V2_0] = {
606
- address: '0x3ae6d8a282d67893e17aa70ebffb33ee5aa65893',
607
- creationBlock: 23678
608
- }, _routerConfigs22)
609
- }, _CHAIN_CONFIGS[84532] = {
610
- weth: '0x4200000000000000000000000000000000000006',
611
- routerConfigs: (_routerConfigs23 = {}, _routerConfigs23[UniversalRouterVersion.V1_2] = {
612
- address: '0x492e6456d9528771018deb9e87ef7750ef184104',
613
- creationBlock: 20216585
614
- }, _routerConfigs23[UniversalRouterVersion.V2_0] = {
615
- address: '0x492e6456d9528771018deb9e87ef7750ef184104',
616
- creationBlock: 20216585
617
- }, _routerConfigs23)
618
- }, _CHAIN_CONFIGS[1868] = {
619
- weth: '0x4200000000000000000000000000000000000006',
620
- routerConfigs: (_routerConfigs24 = {}, _routerConfigs24[UniversalRouterVersion.V1_2] = {
621
- address: '0x0e2850543f69f678257266e0907ff9a58b3f13de',
622
- creationBlock: 3254782
623
- }, _routerConfigs24[UniversalRouterVersion.V2_0] = {
624
- address: '0x0e2850543f69f678257266e0907ff9a58b3f13de',
625
- creationBlock: 3254782
626
- }, _routerConfigs24)
627
- }, _CHAIN_CONFIGS);
628
- var UNIVERSAL_ROUTER_ADDRESS = function UNIVERSAL_ROUTER_ADDRESS(version, chainId) {
629
- if (!(chainId in CHAIN_CONFIGS)) throw new Error("Universal Router not deployed on chain " + chainId);
630
- return CHAIN_CONFIGS[chainId].routerConfigs[version].address;
631
- };
632
- var UNIVERSAL_ROUTER_CREATION_BLOCK = function UNIVERSAL_ROUTER_CREATION_BLOCK(version, chainId) {
633
- if (!(chainId in CHAIN_CONFIGS)) throw new Error("Universal Router not deployed on chain " + chainId);
634
- return CHAIN_CONFIGS[chainId].routerConfigs[version].creationBlock;
635
- };
636
- var WETH_ADDRESS = function WETH_ADDRESS(chainId) {
637
- if (!(chainId in CHAIN_CONFIGS)) throw new Error("Universal Router not deployed on chain " + chainId);
638
- if (CHAIN_CONFIGS[chainId].weth == WETH_NOT_SUPPORTED_ON_CHAIN) throw new Error("Chain " + chainId + " does not have WETH");
639
- return CHAIN_CONFIGS[chainId].weth;
640
- };
641
- var CONTRACT_BALANCE = /*#__PURE__*/BigNumber.from(2).pow(255);
642
- var ETH_ADDRESS = '0x0000000000000000000000000000000000000000';
643
- var E_ETH_ADDRESS = '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee';
644
- var SENDER_AS_RECIPIENT = '0x0000000000000000000000000000000000000001';
645
- var ROUTER_AS_RECIPIENT = '0x0000000000000000000000000000000000000002';
646
-
647
- function getCurrencyAddress(currency) {
648
- return currency.isNative ? ETH_ADDRESS : currency.wrapped.address;
649
- }
650
-
651
- function encodeFeeBips(fee) {
652
- return toHex(fee.multiply(10000).quotient);
653
- }
654
-
655
- var REFUND_ETH_PRICE_IMPACT_THRESHOLD = /*#__PURE__*/new Percent(50, 100);
656
- // Wrapper for uniswap router-sdk trade entity to encode swaps for Universal Router
657
- // also translates trade objects from previous (v2, v3) SDKs
658
- var UniswapTrade = /*#__PURE__*/function () {
659
- function UniswapTrade(trade, options) {
660
- this.trade = trade;
661
- this.options = options;
662
- this.tradeType = RouterActionType.UniswapTrade;
663
- if (!!options.fee && !!options.flatFee) throw new Error('Only one fee option permitted');
664
- if (this.inputRequiresWrap || this.inputRequiresUnwrap || this.options.useRouterBalance) {
665
- this.payerIsUser = false;
666
- } else {
667
- this.payerIsUser = true;
668
- }
669
- }
670
- var _proto = UniswapTrade.prototype;
671
- _proto.encode = function encode(planner, _config) {
672
- var _this$options$recipie;
673
- // If the input currency is the native currency, we need to wrap it with the router as the recipient
674
- if (this.inputRequiresWrap) {
675
- // TODO: optimize if only one v2 pool we can directly send this to the pool
676
- planner.addCommand(CommandType.WRAP_ETH, [ROUTER_AS_RECIPIENT, this.trade.maximumAmountIn(this.options.slippageTolerance).quotient.toString()]);
677
- } else if (this.inputRequiresUnwrap) {
678
- // send wrapped token to router to unwrap
679
- planner.addCommand(CommandType.PERMIT2_TRANSFER_FROM, [this.trade.inputAmount.currency.address, ROUTER_AS_RECIPIENT, this.trade.maximumAmountIn(this.options.slippageTolerance).quotient.toString()]);
680
- planner.addCommand(CommandType.UNWRAP_WETH, [ROUTER_AS_RECIPIENT, 0]);
681
- }
682
- // The overall recipient at the end of the trade, SENDER_AS_RECIPIENT uses the msg.sender
683
- this.options.recipient = (_this$options$recipie = this.options.recipient) != null ? _this$options$recipie : SENDER_AS_RECIPIENT;
684
- // flag for whether we want to perform slippage check on aggregate output of multiple routes
685
- // 1. when there are >2 exact input trades. this is only a heuristic,
686
- // as it's still more gas-expensive even in this case, but has benefits
687
- // in that the reversion probability is lower
688
- var performAggregatedSlippageCheck = this.trade.tradeType === TradeType.EXACT_INPUT && this.trade.routes.length > 2;
689
- var routerMustCustody = performAggregatedSlippageCheck || this.outputRequiresTransition || hasFeeOption(this.options);
690
- for (var _iterator = _createForOfIteratorHelperLoose(this.trade.swaps), _step; !(_step = _iterator()).done;) {
691
- var swap = _step.value;
692
- switch (swap.route.protocol) {
693
- case Protocol.V2:
694
- addV2Swap(planner, swap, this.trade.tradeType, this.options, this.payerIsUser, routerMustCustody);
695
- break;
696
- case Protocol.V3:
697
- addV3Swap(planner, swap, this.trade.tradeType, this.options, this.payerIsUser, routerMustCustody);
698
- break;
699
- case Protocol.V4:
700
- addV4Swap(planner, swap, this.trade.tradeType, this.options, this.payerIsUser, routerMustCustody);
701
- break;
702
- case Protocol.MIXED:
703
- addMixedSwap(planner, swap, this.trade.tradeType, this.options, this.payerIsUser, routerMustCustody);
704
- break;
705
- default:
706
- throw new Error('UNSUPPORTED_TRADE_PROTOCOL');
707
- }
708
- }
709
- var minimumAmountOut = BigNumber.from(this.trade.minimumAmountOut(this.options.slippageTolerance).quotient.toString());
710
- // The router custodies for 3 reasons: to unwrap, to take a fee, and/or to do a slippage check
711
- if (routerMustCustody) {
712
- var pools = this.trade.swaps[0].route.pools;
713
- var pathOutputCurrencyAddress = getCurrencyAddress(getPathCurrency(this.trade.outputAmount.currency, pools[pools.length - 1]));
714
- // If there is a fee, that percentage is sent to the fee recipient
715
- // In the case where ETH is the output currency, the fee is taken in WETH (for gas reasons)
716
- if (!!this.options.fee) {
717
- var feeBips = encodeFeeBips(this.options.fee.fee);
718
- planner.addCommand(CommandType.PAY_PORTION, [pathOutputCurrencyAddress, this.options.fee.recipient, feeBips]);
719
- // If the trade is exact output, and a fee was taken, we must adjust the amount out to be the amount after the fee
720
- // Otherwise we continue as expected with the trade's normal expected output
721
- if (this.trade.tradeType === TradeType.EXACT_OUTPUT) {
722
- minimumAmountOut = minimumAmountOut.sub(minimumAmountOut.mul(feeBips).div(10000));
723
- }
724
- }
725
- // If there is a flat fee, that absolute amount is sent to the fee recipient
726
- // In the case where ETH is the output currency, the fee is taken in WETH (for gas reasons)
727
- if (!!this.options.flatFee) {
728
- var feeAmount = this.options.flatFee.amount;
729
- if (minimumAmountOut.lt(feeAmount)) throw new Error('Flat fee amount greater than minimumAmountOut');
730
- planner.addCommand(CommandType.TRANSFER, [pathOutputCurrencyAddress, this.options.flatFee.recipient, feeAmount]);
731
- // If the trade is exact output, and a fee was taken, we must adjust the amount out to be the amount after the fee
732
- // Otherwise we continue as expected with the trade's normal expected output
733
- if (this.trade.tradeType === TradeType.EXACT_OUTPUT) {
734
- minimumAmountOut = minimumAmountOut.sub(feeAmount);
735
- }
736
- }
737
- // The remaining tokens that need to be sent to the user after the fee is taken will be caught
738
- // by this if-else clause.
739
- if (this.outputRequiresUnwrap) {
740
- planner.addCommand(CommandType.UNWRAP_WETH, [this.options.recipient, minimumAmountOut]);
741
- } else if (this.outputRequiresWrap) {
742
- planner.addCommand(CommandType.WRAP_ETH, [this.options.recipient, CONTRACT_BALANCE]);
743
- } else {
744
- planner.addCommand(CommandType.SWEEP, [getCurrencyAddress(this.trade.outputAmount.currency), this.options.recipient, minimumAmountOut]);
745
- }
746
- }
747
- // for exactOutput swaps with native input or that perform an inputToken transition (wrap or unwrap)
748
- // we need to send back the change to the user
749
- if (this.trade.tradeType === TradeType.EXACT_OUTPUT || riskOfPartialFill(this.trade)) {
750
- if (this.inputRequiresWrap) {
751
- planner.addCommand(CommandType.UNWRAP_WETH, [this.options.recipient, 0]);
752
- } else if (this.inputRequiresUnwrap) {
753
- planner.addCommand(CommandType.WRAP_ETH, [this.options.recipient, CONTRACT_BALANCE]);
754
- } else if (this.trade.inputAmount.currency.isNative) {
755
- // must refund extra native currency sent along for native v4 trades (no input transition)
756
- planner.addCommand(CommandType.SWEEP, [ETH_ADDRESS, this.options.recipient, 0]);
757
- }
758
- }
759
- if (this.options.safeMode) planner.addCommand(CommandType.SWEEP, [ETH_ADDRESS, this.options.recipient, 0]);
760
- };
761
- _createClass(UniswapTrade, [{
762
- key: "isAllV4",
763
- get: function get() {
764
- var result = true;
765
- for (var _iterator2 = _createForOfIteratorHelperLoose(this.trade.swaps), _step2; !(_step2 = _iterator2()).done;) {
766
- var swap = _step2.value;
767
- result = result && swap.route.protocol == Protocol.V4;
768
- }
769
- return result;
770
- }
771
- }, {
772
- key: "inputRequiresWrap",
773
- get: function get() {
774
- if (this.isAllV4) {
775
- return this.trade.inputAmount.currency.isNative && !this.trade.swaps[0].route.pathInput.isNative;
776
- } else {
777
- return this.trade.inputAmount.currency.isNative;
778
- }
779
- }
780
- }, {
781
- key: "inputRequiresUnwrap",
782
- get: function get() {
783
- if (this.isAllV4) {
784
- return !this.trade.inputAmount.currency.isNative && this.trade.swaps[0].route.pathInput.isNative;
785
- }
786
- return false;
787
- }
788
- }, {
789
- key: "outputRequiresWrap",
790
- get: function get() {
791
- if (this.isAllV4) {
792
- return !this.trade.outputAmount.currency.isNative && this.trade.swaps[0].route.pathOutput.isNative;
793
- }
794
- return false;
795
- }
796
- }, {
797
- key: "outputRequiresUnwrap",
798
- get: function get() {
799
- if (this.isAllV4) {
800
- return this.trade.outputAmount.currency.isNative && !this.trade.swaps[0].route.pathOutput.isNative;
801
- } else {
802
- return this.trade.outputAmount.currency.isNative;
803
- }
804
- }
805
- }, {
806
- key: "outputRequiresTransition",
807
- get: function get() {
808
- return this.outputRequiresWrap || this.outputRequiresUnwrap;
809
- }
810
- }]);
811
- return UniswapTrade;
812
- }();
813
- // encode a uniswap v2 swap
814
- function addV2Swap(planner, _ref, tradeType, options, payerIsUser, routerMustCustody) {
815
- var route = _ref.route,
816
- inputAmount = _ref.inputAmount,
817
- outputAmount = _ref.outputAmount;
818
- var trade = new Trade(route, tradeType == TradeType.EXACT_INPUT ? inputAmount : outputAmount, tradeType);
819
- if (tradeType == TradeType.EXACT_INPUT) {
820
- planner.addCommand(CommandType.V2_SWAP_EXACT_IN, [
821
- // if native, we have to unwrap so keep in the router for now
822
- routerMustCustody ? ROUTER_AS_RECIPIENT : options.recipient, trade.maximumAmountIn(options.slippageTolerance).quotient.toString(),
823
- // if router will custody funds, we do aggregated slippage check from router
824
- routerMustCustody ? 0 : trade.minimumAmountOut(options.slippageTolerance).quotient.toString(), route.path.map(function (token) {
825
- return token.wrapped.address;
826
- }), payerIsUser]);
827
- } else if (tradeType == TradeType.EXACT_OUTPUT) {
828
- planner.addCommand(CommandType.V2_SWAP_EXACT_OUT, [routerMustCustody ? ROUTER_AS_RECIPIENT : options.recipient, trade.minimumAmountOut(options.slippageTolerance).quotient.toString(), trade.maximumAmountIn(options.slippageTolerance).quotient.toString(), route.path.map(function (token) {
829
- return token.wrapped.address;
830
- }), payerIsUser]);
831
- }
832
- }
833
- // encode a uniswap v3 swap
834
- function addV3Swap(planner, _ref2, tradeType, options, payerIsUser, routerMustCustody) {
835
- var route = _ref2.route,
836
- inputAmount = _ref2.inputAmount,
837
- outputAmount = _ref2.outputAmount;
838
- var trade = Trade$1.createUncheckedTrade({
839
- route: route,
840
- inputAmount: inputAmount,
841
- outputAmount: outputAmount,
842
- tradeType: tradeType
843
- });
844
- var path = encodeRouteToPath(route, trade.tradeType === TradeType.EXACT_OUTPUT);
845
- if (tradeType == TradeType.EXACT_INPUT) {
846
- planner.addCommand(CommandType.V3_SWAP_EXACT_IN, [routerMustCustody ? ROUTER_AS_RECIPIENT : options.recipient, trade.maximumAmountIn(options.slippageTolerance).quotient.toString(), routerMustCustody ? 0 : trade.minimumAmountOut(options.slippageTolerance).quotient.toString(), path, payerIsUser]);
847
- } else if (tradeType == TradeType.EXACT_OUTPUT) {
848
- planner.addCommand(CommandType.V3_SWAP_EXACT_OUT, [routerMustCustody ? ROUTER_AS_RECIPIENT : options.recipient, trade.minimumAmountOut(options.slippageTolerance).quotient.toString(), trade.maximumAmountIn(options.slippageTolerance).quotient.toString(), path, payerIsUser]);
849
- }
850
- }
851
- function addV4Swap(planner, _ref3, tradeType, options, payerIsUser, routerMustCustody) {
852
- var _options$recipient;
853
- var inputAmount = _ref3.inputAmount,
854
- outputAmount = _ref3.outputAmount,
855
- route = _ref3.route;
856
- // create a deep copy of pools since v4Planner encoding tampers with array
857
- var pools = route.pools.map(function (p) {
858
- return p;
859
- });
860
- var v4Route = new Route(pools, inputAmount.currency, outputAmount.currency);
861
- var trade = Trade$2.createUncheckedTrade({
862
- route: v4Route,
863
- inputAmount: inputAmount,
864
- outputAmount: outputAmount,
865
- tradeType: tradeType
866
- });
867
- var slippageToleranceOnSwap = routerMustCustody && tradeType == TradeType.EXACT_INPUT ? undefined : options.slippageTolerance;
868
- var v4Planner = new V4Planner();
869
- v4Planner.addTrade(trade, slippageToleranceOnSwap);
870
- v4Planner.addSettle(trade.route.pathInput, payerIsUser);
871
- v4Planner.addTake(trade.route.pathOutput, routerMustCustody ? ROUTER_AS_RECIPIENT : (_options$recipient = options.recipient) != null ? _options$recipient : SENDER_AS_RECIPIENT);
872
- planner.addCommand(CommandType.V4_SWAP, [v4Planner.finalize()]);
873
- }
874
- // encode a mixed route swap, i.e. including both v2 and v3 pools
875
- function addMixedSwap(planner, swap, tradeType, options, payerIsUser, routerMustCustody) {
876
- var _options$recipient2;
877
- var route = swap.route;
878
- var inputAmount = swap.inputAmount;
879
- var outputAmount = swap.outputAmount;
880
- var tradeRecipient = routerMustCustody ? ROUTER_AS_RECIPIENT : (_options$recipient2 = options.recipient) != null ? _options$recipient2 : SENDER_AS_RECIPIENT;
881
- // single hop, so it can be reduced to plain swap logic for one protocol version
882
- if (route.pools.length === 1) {
883
- if (route.pools[0] instanceof Pool) {
884
- return addV4Swap(planner, swap, tradeType, options, payerIsUser, routerMustCustody);
885
- } else if (route.pools[0] instanceof Pool$1) {
886
- return addV3Swap(planner, swap, tradeType, options, payerIsUser, routerMustCustody);
887
- } else if (route.pools[0] instanceof Pair) {
888
- return addV2Swap(planner, swap, tradeType, options, payerIsUser, routerMustCustody);
889
- } else {
890
- throw new Error('Invalid route type');
891
- }
892
- }
893
- var trade = MixedRouteTrade.createUncheckedTrade({
894
- route: route,
895
- inputAmount: inputAmount,
896
- outputAmount: outputAmount,
897
- tradeType: tradeType
898
- });
899
- var amountIn = trade.maximumAmountIn(options.slippageTolerance, inputAmount).quotient.toString();
900
- var amountOut = routerMustCustody ? 0 : trade.minimumAmountOut(options.slippageTolerance, outputAmount).quotient.toString();
901
- // logic from
902
- // https://github.com/Uniswap/router-sdk/blob/d8eed164e6c79519983844ca8b6a3fc24ebcb8f8/src/swapRouter.ts#L276
903
- var sections = partitionMixedRouteByProtocol(route);
904
- var isLastSectionInRoute = function isLastSectionInRoute(i) {
905
- return i === sections.length - 1;
906
- };
907
- var inputToken = route.pathInput;
908
- for (var i = 0; i < sections.length; i++) {
909
- var section = sections[i];
910
- var routePool = section[0];
911
- var outputToken = getOutputOfPools(section, inputToken);
912
- var subRoute = new MixedRoute(new MixedRouteSDK([].concat(section), inputToken, outputToken));
913
- var nextInputToken = void 0;
914
- var swapRecipient = void 0;
915
- if (isLastSectionInRoute(i)) {
916
- nextInputToken = outputToken;
917
- swapRecipient = tradeRecipient;
918
- } else {
919
- var nextPool = sections[i + 1][0];
920
- nextInputToken = getPathCurrency(outputToken, nextPool);
921
- var v2PoolIsSwapRecipient = nextPool instanceof Pair && outputToken.equals(nextInputToken);
922
- swapRecipient = v2PoolIsSwapRecipient ? nextPool.liquidityToken.address : ROUTER_AS_RECIPIENT;
923
- }
924
- if (routePool instanceof Pool) {
925
- var v4Planner = new V4Planner();
926
- var v4SubRoute = new Route(section, subRoute.input, subRoute.output);
927
- v4Planner.addSettle(inputToken, payerIsUser && i === 0, i == 0 ? amountIn : CONTRACT_BALANCE);
928
- v4Planner.addAction(Actions.SWAP_EXACT_IN, [{
929
- currencyIn: inputToken.isNative ? ETH_ADDRESS : inputToken.address,
930
- path: encodeRouteToPath$1(v4SubRoute),
931
- amountIn: 0,
932
- amountOutMinimum: !isLastSectionInRoute(i) ? 0 : amountOut
933
- }]);
934
- v4Planner.addTake(outputToken, swapRecipient);
935
- planner.addCommand(CommandType.V4_SWAP, [v4Planner.finalize()]);
936
- } else if (routePool instanceof Pool$1) {
937
- planner.addCommand(CommandType.V3_SWAP_EXACT_IN, [swapRecipient, i == 0 ? amountIn : CONTRACT_BALANCE, !isLastSectionInRoute(i) ? 0 : amountOut, encodeMixedRouteToPath(subRoute), payerIsUser && i === 0]);
938
- } else if (routePool instanceof Pair) {
939
- planner.addCommand(CommandType.V2_SWAP_EXACT_IN, [swapRecipient, i === 0 ? amountIn : CONTRACT_BALANCE, !isLastSectionInRoute(i) ? 0 : amountOut, subRoute.path.map(function (token) {
940
- return token.wrapped.address;
941
- }), payerIsUser && i === 0]);
942
- } else {
943
- throw new Error('Unexpected Pool Type');
944
- }
945
- // perform a token transition (wrap/unwrap if necessary)
946
- if (!isLastSectionInRoute(i)) {
947
- if (outputToken.isNative && !nextInputToken.isNative) {
948
- planner.addCommand(CommandType.WRAP_ETH, [ROUTER_AS_RECIPIENT, CONTRACT_BALANCE]);
949
- } else if (!outputToken.isNative && nextInputToken.isNative) {
950
- planner.addCommand(CommandType.UNWRAP_WETH, [ROUTER_AS_RECIPIENT, 0]);
951
- }
952
- }
953
- inputToken = nextInputToken;
954
- }
955
- }
956
- // if price impact is very high, there's a chance of hitting max/min prices resulting in a partial fill of the swap
957
- function riskOfPartialFill(trade) {
958
- return trade.priceImpact.greaterThan(REFUND_ETH_PRICE_IMPACT_THRESHOLD);
959
- }
960
- function hasFeeOption(swapOptions) {
961
- return !!swapOptions.fee || !!swapOptions.flatFee;
962
- }
963
-
964
- var SIGNATURE_LENGTH = 65;
965
- var EIP_2098_SIGNATURE_LENGTH = 64;
966
- function encodePermit(planner, permit2) {
967
- var signature = permit2.signature;
968
- var length = ethers.utils.arrayify(permit2.signature).length;
969
- // signature data provided for EIP-1271 may have length different from ECDSA signature
970
- if (length === SIGNATURE_LENGTH || length === EIP_2098_SIGNATURE_LENGTH) {
971
- // sanitizes signature to cover edge cases of malformed EIP-2098 sigs and v used as recovery id
972
- signature = ethers.utils.joinSignature(ethers.utils.splitSignature(permit2.signature));
973
- }
974
- planner.addCommand(CommandType.PERMIT2_PERMIT, [permit2, signature]);
975
- }
976
- function encodeV3PositionPermit(planner, permit, tokenId) {
977
- var calldata = NonfungiblePositionManager.INTERFACE.encodeFunctionData('permit', [validateAndParseAddress(permit.spender), tokenId, permit.deadline, permit.v, permit.r, permit.s]);
978
- planner.addCommand(CommandType.V3_POSITION_MANAGER_PERMIT, [calldata]);
979
- }
980
- // Handles the encoding of commands needed to gather input tokens for a trade
981
- // Approval: The router approving another address to take tokens.
982
- // note: Only seaport and sudoswap support this action. Approvals are left open.
983
- // Permit: A Permit2 signature-based Permit to allow the router to access a user's tokens
984
- // Transfer: A Permit2 TransferFrom of tokens from a user to either the router or another address
985
- function encodeInputTokenOptions(planner, options) {
986
- // first ensure that all tokens provided for encoding are the same
987
- if (!!options.permit2TransferFrom && !!options.permit2Permit) !(options.permit2TransferFrom.token === options.permit2Permit.details.token) ? process.env.NODE_ENV !== "production" ? invariant(false, "inconsistent token") : invariant(false) : void 0;
988
- // if this order has a options.permit2Permit, encode it
989
- if (!!options.permit2Permit) {
990
- encodePermit(planner, options.permit2Permit);
991
- }
992
- if (!!options.permit2TransferFrom) {
993
- planner.addCommand(CommandType.PERMIT2_TRANSFER_FROM, [options.permit2TransferFrom.token, options.permit2TransferFrom.recipient ? options.permit2TransferFrom.recipient : ROUTER_AS_RECIPIENT, options.permit2TransferFrom.amount]);
994
- }
995
- }
996
-
997
- function isMint(options) {
998
- return Object.keys(options).some(function (k) {
999
- return k === 'recipient';
1000
- });
1001
- }
1002
- var SwapRouter = /*#__PURE__*/function () {
1003
- function SwapRouter() {}
1004
- SwapRouter.swapCallParameters = function swapCallParameters(trades, options) {
1005
- // TODO: use permit if signature included in swapOptions
1006
- var planner = new RoutePlanner();
1007
- var trade = new UniswapTrade(trades, options);
1008
- var inputCurrency = trade.trade.inputAmount.currency;
1009
- !!(inputCurrency.isNative && !!options.inputTokenPermit) ? process.env.NODE_ENV !== "production" ? invariant(false, 'NATIVE_INPUT_PERMIT') : invariant(false) : void 0;
1010
- if (options.inputTokenPermit) {
1011
- encodePermit(planner, options.inputTokenPermit);
1012
- }
1013
- var nativeCurrencyValue = inputCurrency.isNative ? BigNumber.from(trade.trade.maximumAmountIn(options.slippageTolerance).quotient.toString()) : BigNumber.from(0);
1014
- trade.encode(planner, {
1015
- allowRevert: false
1016
- });
1017
- return SwapRouter.encodePlan(planner, nativeCurrencyValue, {
1018
- deadline: options.deadlineOrPreviousBlockhash ? BigNumber.from(options.deadlineOrPreviousBlockhash) : undefined
1019
- });
1020
- }
1021
- /**
1022
- * Builds the call parameters for a migration from a V3 position to a V4 position.
1023
- * Some requirements of the parameters:
1024
- * - v3RemoveLiquidityOptions.collectOptions.recipient must equal v4PositionManager
1025
- * - v3RemoveLiquidityOptions.liquidityPercentage must be 100%
1026
- * - input pool and output pool must have the same tokens
1027
- * - V3 NFT must be approved, or valid inputV3NFTPermit must be provided with UR as spender
1028
- */;
1029
- SwapRouter.migrateV3ToV4CallParameters = function migrateV3ToV4CallParameters(options, positionManagerOverride) {
1030
- var v4Pool = options.outputPosition.pool;
1031
- var v3Token0 = options.inputPosition.pool.token0;
1032
- var v3Token1 = options.inputPosition.pool.token1;
1033
- var v4PositionManagerAddress = positionManagerOverride != null ? positionManagerOverride : CHAIN_TO_ADDRESSES_MAP[v4Pool.chainId].v4PositionManagerAddress;
1034
- // owner of the v3 nft must be the receiver of the v4 nft
1035
- // validate the parameters
1036
- if (v4Pool.currency0.isNative) {
1037
- !(v4Pool.currency0.wrapped.equals(v3Token0) && v4Pool.currency1.equals(v3Token1) || v4Pool.currency0.wrapped.equals(v3Token1) && v4Pool.currency1.equals(v3Token0)) ? process.env.NODE_ENV !== "production" ? invariant(false, 'TOKEN_MISMATCH') : invariant(false) : void 0;
1038
- } else {
1039
- !(v3Token0 === v4Pool.token0) ? process.env.NODE_ENV !== "production" ? invariant(false, 'TOKEN0_MISMATCH') : invariant(false) : void 0;
1040
- !(v3Token1 === v4Pool.token1) ? process.env.NODE_ENV !== "production" ? invariant(false, 'TOKEN1_MISMATCH') : invariant(false) : void 0;
1041
- }
1042
- !options.v3RemoveLiquidityOptions.liquidityPercentage.equalTo(new Percent(100, 100)) ? process.env.NODE_ENV !== "production" ? invariant(false, 'FULL_REMOVAL_REQUIRED') : invariant(false) : void 0;
1043
- !(options.v3RemoveLiquidityOptions.burnToken == true) ? process.env.NODE_ENV !== "production" ? invariant(false, 'BURN_TOKEN_REQUIRED') : invariant(false) : void 0;
1044
- !(options.v3RemoveLiquidityOptions.collectOptions.recipient === v4PositionManagerAddress) ? process.env.NODE_ENV !== "production" ? invariant(false, 'RECIPIENT_NOT_POSITION_MANAGER') : invariant(false) : void 0;
1045
- !isMint(options.v4AddLiquidityOptions) ? process.env.NODE_ENV !== "production" ? invariant(false, 'MINT_REQUIRED') : invariant(false) : void 0;
1046
- !options.v4AddLiquidityOptions.migrate ? process.env.NODE_ENV !== "production" ? invariant(false, 'MIGRATE_REQUIRED') : invariant(false) : void 0;
1047
- var planner = new RoutePlanner();
1048
- // to prevent reentrancy by the pool hook, we initialize the v4 pool before moving funds
1049
- if (options.v4AddLiquidityOptions.createPool) {
1050
- var poolKey = Pool.getPoolKey(v4Pool.currency0, v4Pool.currency1, v4Pool.fee, v4Pool.tickSpacing, v4Pool.hooks);
1051
- planner.addCommand(CommandType.V4_INITIALIZE_POOL, [poolKey, v4Pool.sqrtRatioX96.toString()]);
1052
- // remove createPool setting, so that it doesnt get encoded again later
1053
- delete options.v4AddLiquidityOptions.createPool;
1054
- }
1055
- // add position permit to the universal router planner
1056
- if (options.v3RemoveLiquidityOptions.permit) {
1057
- // permit spender should be UR
1058
- var universalRouterAddress = UNIVERSAL_ROUTER_ADDRESS(UniversalRouterVersion.V2_0, options.inputPosition.pool.chainId);
1059
- !(universalRouterAddress == options.v3RemoveLiquidityOptions.permit.spender) ? process.env.NODE_ENV !== "production" ? invariant(false, 'INVALID_SPENDER') : invariant(false) : void 0;
1060
- // don't need to transfer it because v3posm uses isApprovedOrOwner()
1061
- encodeV3PositionPermit(planner, options.v3RemoveLiquidityOptions.permit, options.v3RemoveLiquidityOptions.tokenId);
1062
- // remove permit so that multicall doesnt add it again
1063
- delete options.v3RemoveLiquidityOptions.permit;
1064
- }
1065
- // encode v3 withdraw
1066
- var v3RemoveParams = NonfungiblePositionManager.removeCallParameters(options.inputPosition, options.v3RemoveLiquidityOptions);
1067
- var v3Calls = Multicall.decodeMulticall(v3RemoveParams.calldata);
1068
- for (var _iterator = _createForOfIteratorHelperLoose(v3Calls), _step; !(_step = _iterator()).done;) {
1069
- var v3Call = _step.value;
1070
- // slice selector - 0x + 4 bytes = 10 characters
1071
- var _selector = v3Call.slice(0, 10);
1072
- !(_selector == NonfungiblePositionManager.INTERFACE.getSighash('collect') || _selector == NonfungiblePositionManager.INTERFACE.getSighash('decreaseLiquidity') || _selector == NonfungiblePositionManager.INTERFACE.getSighash('burn')) ? process.env.NODE_ENV !== "production" ? invariant(false, 'INVALID_V3_CALL: ' + _selector) : invariant(false) : void 0;
1073
- planner.addCommand(CommandType.V3_POSITION_MANAGER_CALL, [v3Call]);
1074
- }
1075
- // encode v4 mint
1076
- var v4AddParams = V4PositionManager.addCallParameters(options.outputPosition, options.v4AddLiquidityOptions);
1077
- // only modifyLiquidities can be called by the UniversalRouter
1078
- var selector = v4AddParams.calldata.slice(0, 10);
1079
- !(selector == V4PositionManager.INTERFACE.getSighash('modifyLiquidities')) ? process.env.NODE_ENV !== "production" ? invariant(false, 'INVALID_V4_CALL: ' + selector) : invariant(false) : void 0;
1080
- planner.addCommand(CommandType.V4_POSITION_MANAGER_CALL, [v4AddParams.calldata]);
1081
- return SwapRouter.encodePlan(planner, BigNumber.from(0), {
1082
- deadline: BigNumber.from(options.v4AddLiquidityOptions.deadline)
1083
- });
1084
- }
1085
- /**
1086
- * Encodes a planned route into a method name and parameters for the Router contract.
1087
- * @param planner the planned route
1088
- * @param nativeCurrencyValue the native currency value of the planned route
1089
- * @param config the router config
1090
- */;
1091
- SwapRouter.encodePlan = function encodePlan(planner, nativeCurrencyValue, config) {
1092
- if (config === void 0) {
1093
- config = {};
1094
- }
1095
- var commands = planner.commands,
1096
- inputs = planner.inputs;
1097
- var functionSignature = !!config.deadline ? 'execute(bytes,bytes[],uint256)' : 'execute(bytes,bytes[])';
1098
- var parameters = !!config.deadline ? [commands, inputs, config.deadline] : [commands, inputs];
1099
- var calldata = SwapRouter.INTERFACE.encodeFunctionData(functionSignature, parameters);
1100
- return {
1101
- calldata: calldata,
1102
- value: nativeCurrencyValue.toHexString()
1103
- };
1104
- };
1105
- return SwapRouter;
1106
- }();
1107
- SwapRouter.INTERFACE = /*#__PURE__*/new Interface(abi);
1108
-
1109
- var UnwrapWETH = /*#__PURE__*/function () {
1110
- function UnwrapWETH(amount, chainId, permit2) {
1111
- this.tradeType = RouterActionType.UnwrapWETH;
1112
- this.wethAddress = WETH_ADDRESS(chainId);
1113
- this.amount = amount;
1114
- if (!!permit2) {
1115
- !(permit2.details.token.toLowerCase() === this.wethAddress.toLowerCase()) ? process.env.NODE_ENV !== "production" ? invariant(false, "must be permitting WETH address: " + this.wethAddress) : invariant(false) : void 0;
1116
- !(permit2.details.amount >= amount) ? process.env.NODE_ENV !== "production" ? invariant(false, "Did not permit enough WETH for unwrapWETH transaction") : invariant(false) : void 0;
1117
- this.permit2Data = permit2;
1118
- }
1119
- }
1120
- var _proto = UnwrapWETH.prototype;
1121
- _proto.encode = function encode(planner, _) {
1122
- encodeInputTokenOptions(planner, {
1123
- permit2Permit: this.permit2Data,
1124
- permit2TransferFrom: {
1125
- token: this.wethAddress,
1126
- amount: this.amount.toString()
1127
- }
1128
- });
1129
- planner.addCommand(CommandType.UNWRAP_WETH, [ROUTER_AS_RECIPIENT, this.amount]);
1130
- };
1131
- return UnwrapWETH;
1132
- }();
1133
-
1134
- var PoolType;
1135
- (function (PoolType) {
1136
- PoolType["V2Pool"] = "v2-pool";
1137
- PoolType["V3Pool"] = "v3-pool";
1138
- PoolType["V4Pool"] = "v4-pool";
1139
- })(PoolType || (PoolType = {}));
1140
- var isNativeCurrency = function isNativeCurrency(address) {
1141
- return address.toLowerCase() === ETH_ADDRESS.toLowerCase() || address.toLowerCase() === E_ETH_ADDRESS.toLowerCase();
1142
- };
1143
- // Helper class to convert routing-specific quote entities to RouterTrade entities
1144
- // the returned RouterTrade can then be used to build the UniswapTrade entity in this package
1145
- var RouterTradeAdapter = /*#__PURE__*/function () {
1146
- function RouterTradeAdapter() {}
1147
- // Generate a RouterTrade using fields from a classic quote response
1148
- RouterTradeAdapter.fromClassicQuote = function fromClassicQuote(quote) {
1149
- var route = quote.route,
1150
- tokenIn = quote.tokenIn,
1151
- tokenOut = quote.tokenOut;
1152
- if (!route) throw new Error('Expected route to be present');
1153
- if (!route.length) throw new Error('Expected there to be at least one route');
1154
- if (route.some(function (r) {
1155
- return !r.length;
1156
- })) throw new Error('Expected all routes to have at least one pool');
1157
- var firstRoute = route[0];
1158
- var tokenInData = firstRoute[0].tokenIn;
1159
- var tokenOutData = firstRoute[firstRoute.length - 1].tokenOut;
1160
- if (!tokenInData || !tokenOutData) throw new Error('Expected both tokenIn and tokenOut to be present');
1161
- if (tokenInData.chainId !== tokenOutData.chainId) throw new Error('Expected tokenIn and tokenOut to be have same chainId');
1162
- var parsedCurrencyIn = RouterTradeAdapter.toCurrency(isNativeCurrency(tokenIn), tokenInData);
1163
- var parsedCurrencyOut = RouterTradeAdapter.toCurrency(isNativeCurrency(tokenOut), tokenOutData);
1164
- var typedRoutes = route.map(function (subRoute) {
1165
- var rawAmountIn = subRoute[0].amountIn;
1166
- var rawAmountOut = subRoute[subRoute.length - 1].amountOut;
1167
- if (!rawAmountIn || !rawAmountOut) {
1168
- throw new Error('Expected both raw amountIn and raw amountOut to be present');
1169
- }
1170
- var inputAmount = CurrencyAmount.fromRawAmount(parsedCurrencyIn, rawAmountIn);
1171
- var outputAmount = CurrencyAmount.fromRawAmount(parsedCurrencyOut, rawAmountOut);
1172
- var isOnlyV2 = RouterTradeAdapter.isVersionedRoute(PoolType.V2Pool, subRoute);
1173
- var isOnlyV3 = RouterTradeAdapter.isVersionedRoute(PoolType.V3Pool, subRoute);
1174
- var isOnlyV4 = RouterTradeAdapter.isVersionedRoute(PoolType.V4Pool, subRoute);
1175
- return {
1176
- routev4: isOnlyV4 ? new Route(subRoute.map(RouterTradeAdapter.toV4Pool), parsedCurrencyIn, parsedCurrencyOut) : null,
1177
- routev3: isOnlyV3 ? new Route$1(subRoute.map(RouterTradeAdapter.toV3Pool), parsedCurrencyIn, parsedCurrencyOut) : null,
1178
- routev2: isOnlyV2 ? new Route$2(subRoute.map(RouterTradeAdapter.toPair), parsedCurrencyIn, parsedCurrencyOut) : null,
1179
- mixedRoute: !isOnlyV4 && !isOnlyV3 && !isOnlyV2 ? new MixedRouteSDK(subRoute.map(RouterTradeAdapter.toPoolOrPair), parsedCurrencyIn, parsedCurrencyOut) : null,
1180
- inputAmount: inputAmount,
1181
- outputAmount: outputAmount
1182
- };
1183
- });
1184
- return new Trade$3({
1185
- v2Routes: typedRoutes.filter(function (route) {
1186
- return route.routev2;
1187
- }).map(function (route) {
1188
- return {
1189
- routev2: route.routev2,
1190
- inputAmount: route.inputAmount,
1191
- outputAmount: route.outputAmount
1192
- };
1193
- }),
1194
- v3Routes: typedRoutes.filter(function (route) {
1195
- return route.routev3;
1196
- }).map(function (route) {
1197
- return {
1198
- routev3: route.routev3,
1199
- inputAmount: route.inputAmount,
1200
- outputAmount: route.outputAmount
1201
- };
1202
- }),
1203
- v4Routes: typedRoutes.filter(function (route) {
1204
- return route.routev4;
1205
- }).map(function (route) {
1206
- return {
1207
- routev4: route.routev4,
1208
- inputAmount: route.inputAmount,
1209
- outputAmount: route.outputAmount
1210
- };
1211
- }),
1212
- mixedRoutes: typedRoutes.filter(function (route) {
1213
- return route.mixedRoute;
1214
- }).map(function (route) {
1215
- return {
1216
- mixedRoute: route.mixedRoute,
1217
- inputAmount: route.inputAmount,
1218
- outputAmount: route.outputAmount
1219
- };
1220
- }),
1221
- tradeType: quote.tradeType
1222
- });
1223
- };
1224
- RouterTradeAdapter.toCurrency = function toCurrency(isNative, token) {
1225
- if (isNative) {
1226
- return Ether.onChain(token.chainId);
1227
- }
1228
- return this.toToken(token);
1229
- };
1230
- RouterTradeAdapter.toToken = function toToken(token) {
1231
- var chainId = token.chainId,
1232
- address = token.address,
1233
- decimals = token.decimals,
1234
- symbol = token.symbol,
1235
- buyFeeBps = token.buyFeeBps,
1236
- sellFeeBps = token.sellFeeBps;
1237
- return new Token(chainId, address, parseInt(decimals.toString()), symbol, /* name */undefined, false, buyFeeBps ? BigNumber.from(buyFeeBps) : undefined, sellFeeBps ? BigNumber.from(sellFeeBps) : undefined);
1238
- };
1239
- RouterTradeAdapter.toV3Pool = function toV3Pool(_ref) {
1240
- var fee = _ref.fee,
1241
- sqrtRatioX96 = _ref.sqrtRatioX96,
1242
- liquidity = _ref.liquidity,
1243
- tickCurrent = _ref.tickCurrent,
1244
- tokenIn = _ref.tokenIn,
1245
- tokenOut = _ref.tokenOut;
1246
- return new Pool$1(RouterTradeAdapter.toToken(tokenIn), RouterTradeAdapter.toToken(tokenOut), parseInt(fee), sqrtRatioX96, liquidity, parseInt(tickCurrent));
1247
- };
1248
- RouterTradeAdapter.toV4Pool = function toV4Pool(pool) {
1249
- var parsedCurrencyIn = RouterTradeAdapter.toCurrency(isNativeCurrency(pool.tokenIn.address), pool.tokenIn);
1250
- var parsedCurrencyOut = RouterTradeAdapter.toCurrency(isNativeCurrency(pool.tokenOut.address), pool.tokenOut);
1251
- return new Pool(parsedCurrencyIn, parsedCurrencyOut, parseInt(pool.fee), parseInt(pool.tickSpacing), pool.hooks, pool.sqrtRatioX96, pool.liquidity, parseInt(pool.tickCurrent));
1252
- };
1253
- RouterTradeAdapter.isVersionedRoute = function isVersionedRoute(type, route) {
1254
- return route.every(function (pool) {
1255
- return pool.type === type;
1256
- });
1257
- };
1258
- return RouterTradeAdapter;
1259
- }();
1260
- RouterTradeAdapter.toPoolOrPair = function (pool) {
1261
- switch (pool.type) {
1262
- case PoolType.V4Pool:
1263
- return RouterTradeAdapter.toV4Pool(pool);
1264
- case PoolType.V3Pool:
1265
- return RouterTradeAdapter.toV3Pool(pool);
1266
- case PoolType.V2Pool:
1267
- return RouterTradeAdapter.toPair(pool);
1268
- default:
1269
- throw new Error('Invalid pool type');
1270
- }
1271
- };
1272
- RouterTradeAdapter.toPair = function (_ref2) {
1273
- var reserve0 = _ref2.reserve0,
1274
- reserve1 = _ref2.reserve1;
1275
- return new Pair(CurrencyAmount.fromRawAmount(RouterTradeAdapter.toToken(reserve0.token), reserve0.quotient), CurrencyAmount.fromRawAmount(RouterTradeAdapter.toToken(reserve1.token), reserve1.quotient));
1276
- };
1277
-
1278
- // Parses UniversalRouter V2 commands
1279
- var CommandParser = /*#__PURE__*/function () {
1280
- function CommandParser() {}
1281
- CommandParser.parseCalldata = function parseCalldata(calldata) {
1282
- var genericParser = new GenericCommandParser(COMMAND_DEFINITION);
1283
- var txDescription = CommandParser.INTERFACE.parseTransaction({
1284
- data: calldata
1285
- });
1286
- var _txDescription$args = txDescription.args,
1287
- commands = _txDescription$args.commands,
1288
- inputs = _txDescription$args.inputs;
1289
- return genericParser.parse(commands, inputs);
1290
- };
1291
- return CommandParser;
1292
- }();
1293
- CommandParser.INTERFACE = /*#__PURE__*/new Interface(abi);
1294
- // Parses commands based on given command definition
1295
- var GenericCommandParser = /*#__PURE__*/function () {
1296
- function GenericCommandParser(commandDefinition) {
1297
- this.commandDefinition = commandDefinition;
1298
- }
1299
- var _proto = GenericCommandParser.prototype;
1300
- _proto.parse = function parse(commands, inputs) {
1301
- var _this = this;
1302
- var commandTypes = GenericCommandParser.getCommands(commands);
1303
- return {
1304
- commands: commandTypes.map(function (commandType, i) {
1305
- var commandDef = _this.commandDefinition[commandType];
1306
- if (commandDef.parser === Parser.V4Actions) {
1307
- var _V4BaseActionsParser$ = V4BaseActionsParser.parseCalldata(inputs[i]),
1308
- actions = _V4BaseActionsParser$.actions;
1309
- return {
1310
- commandName: CommandType[commandType],
1311
- commandType: commandType,
1312
- params: v4RouterCallToParams(actions)
1313
- };
1314
- } else if (commandDef.parser === Parser.Abi) {
1315
- var abiDef = commandDef.params;
1316
- var rawParams = ethers.utils.defaultAbiCoder.decode(abiDef.map(function (command) {
1317
- return command.type;
1318
- }), inputs[i]);
1319
- var params = rawParams.map(function (param, j) {
1320
- switch (abiDef[j].subparser) {
1321
- case Subparser.V3PathExactIn:
1322
- return {
1323
- name: abiDef[j].name,
1324
- value: parseV3PathExactIn(param)
1325
- };
1326
- case Subparser.V3PathExactOut:
1327
- return {
1328
- name: abiDef[j].name,
1329
- value: parseV3PathExactOut(param)
1330
- };
1331
- default:
1332
- return {
1333
- name: abiDef[j].name,
1334
- value: param
1335
- };
1336
- }
1337
- });
1338
- return {
1339
- commandName: CommandType[commandType],
1340
- commandType: commandType,
1341
- params: params
1342
- };
1343
- } else if (commandDef.parser === Parser.V3Actions) {
1344
- // TODO: implement better parsing here
1345
- return {
1346
- commandName: CommandType[commandType],
1347
- commandType: commandType,
1348
- params: inputs.map(function (input) {
1349
- return {
1350
- name: 'command',
1351
- value: input
1352
- };
1353
- })
1354
- };
1355
- } else {
1356
- throw new Error("Unsupported parser: " + commandDef);
1357
- }
1358
- })
1359
- };
1360
- }
1361
- // parse command types from bytes string
1362
- ;
1363
- GenericCommandParser.getCommands = function getCommands(commands) {
1364
- var commandTypes = [];
1365
- for (var i = 2; i < commands.length; i += 2) {
1366
- var _byte = commands.substring(i, i + 2);
1367
- commandTypes.push(parseInt(_byte, 16));
1368
- }
1369
- return commandTypes;
1370
- };
1371
- return GenericCommandParser;
1372
- }();
1373
- function parseV3PathExactIn(path) {
1374
- var strippedPath = path.replace('0x', '');
1375
- var tokenIn = ethers.utils.getAddress(strippedPath.substring(0, 40));
1376
- var loc = 40;
1377
- var res = [];
1378
- while (loc < strippedPath.length) {
1379
- var feeAndTokenOut = strippedPath.substring(loc, loc + 46);
1380
- var fee = parseInt(feeAndTokenOut.substring(0, 6), 16);
1381
- var tokenOut = ethers.utils.getAddress(feeAndTokenOut.substring(6, 46));
1382
- res.push({
1383
- tokenIn: tokenIn,
1384
- tokenOut: tokenOut,
1385
- fee: fee
1386
- });
1387
- tokenIn = tokenOut;
1388
- loc += 46;
1389
- }
1390
- return res;
1391
- }
1392
- function parseV3PathExactOut(path) {
1393
- var strippedPath = path.replace('0x', '');
1394
- var tokenIn = ethers.utils.getAddress(strippedPath.substring(strippedPath.length - 40));
1395
- var loc = strippedPath.length - 86; // 86 = (20 addr + 3 fee + 20 addr) * 2 (for hex characters)
1396
- var res = [];
1397
- while (loc >= 0) {
1398
- var feeAndTokenOut = strippedPath.substring(loc, loc + 46);
1399
- var tokenOut = ethers.utils.getAddress(feeAndTokenOut.substring(0, 40));
1400
- var fee = parseInt(feeAndTokenOut.substring(40, 46), 16);
1401
- res.push({
1402
- tokenIn: tokenIn,
1403
- tokenOut: tokenOut,
1404
- fee: fee
1405
- });
1406
- tokenIn = tokenOut;
1407
- loc -= 46;
1408
- }
1409
- return res;
1410
- }
1411
- function v4RouterCallToParams(actions) {
1412
- return actions.map(function (action) {
1413
- return {
1414
- name: action.actionName,
1415
- value: action.params.map(function (param) {
1416
- return {
1417
- name: param.name,
1418
- value: param.value
1419
- };
1420
- })
1421
- };
1422
- });
1423
- }
1424
-
1425
- export { COMMAND_DEFINITION, CommandParser, CommandType, GenericCommandParser, Parser, PoolType, ROUTER_AS_RECIPIENT, RoutePlanner, RouterActionType, RouterTradeAdapter, Subparser, SwapRouter, UNIVERSAL_ROUTER_ADDRESS, UNIVERSAL_ROUTER_CREATION_BLOCK, UniswapTrade, UniversalRouterVersion, UnwrapWETH, WETH_ADDRESS, isNativeCurrency };
1426
- //# sourceMappingURL=universal-router-sdk.esm.js.map