@uniswap/universal-router-sdk 4.3.2 → 4.4.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.
package/dist/index.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  export { SwapRouter, MigrateV3ToV4Options } from './swapRouter';
2
2
  export * from './entities';
3
3
  export * from './utils/routerTradeAdapter';
4
- export { RoutePlanner, CommandType } from './utils/routerCommands';
4
+ export { RoutePlanner, CommandType, COMMAND_DEFINITION, CommandDefinition, Parser, Subparser, ParamType, } from './utils/routerCommands';
5
5
  export { UNIVERSAL_ROUTER_CREATION_BLOCK, UNIVERSAL_ROUTER_ADDRESS, ROUTER_AS_RECIPIENT, WETH_ADDRESS, UniversalRouterVersion, } from './utils/constants';
6
- export { CommandParser, UniversalRouterCommand, UniversalRouterCall, Param } from './utils/commandParser';
6
+ export { CommandParser, UniversalRouterCommand, UniversalRouterCall, Param, CommandsDefinition, } from './utils/commandParser';
@@ -102,17 +102,15 @@ var _COMMAND_DEFINITION;
102
102
  CommandType[CommandType["V4_POSITION_CALL"] = 19] = "V4_POSITION_CALL";
103
103
  CommandType[CommandType["EXECUTE_SUB_PLAN"] = 33] = "EXECUTE_SUB_PLAN";
104
104
  })(exports.CommandType || (exports.CommandType = {}));
105
- var Subparser;
106
105
  (function (Subparser) {
107
106
  Subparser[Subparser["V3PathExactIn"] = 0] = "V3PathExactIn";
108
107
  Subparser[Subparser["V3PathExactOut"] = 1] = "V3PathExactOut";
109
- })(Subparser || (Subparser = {}));
110
- var Parser;
108
+ })(exports.Subparser || (exports.Subparser = {}));
111
109
  (function (Parser) {
112
110
  Parser[Parser["Abi"] = 0] = "Abi";
113
111
  Parser[Parser["V4Actions"] = 1] = "V4Actions";
114
112
  Parser[Parser["V3Actions"] = 2] = "V3Actions";
115
- })(Parser || (Parser = {}));
113
+ })(exports.Parser || (exports.Parser = {}));
116
114
  var ALLOW_REVERT_FLAG = 0x80;
117
115
  var REVERTIBLE_COMMANDS = /*#__PURE__*/new Set([exports.CommandType.EXECUTE_SUB_PLAN]);
118
116
  var PERMIT_STRUCT = '((address token,uint160 amount,uint48 expiration,uint48 nonce) details,address spender,uint256 sigDeadline)';
@@ -120,7 +118,7 @@ var PERMIT_BATCH_STRUCT = '((address token,uint160 amount,uint48 expiration,uint
120
118
  var PERMIT2_TRANSFER_FROM_STRUCT = '(address from,address to,uint160 amount,address token)';
121
119
  var PERMIT2_TRANSFER_FROM_BATCH_STRUCT = PERMIT2_TRANSFER_FROM_STRUCT + '[]';
122
120
  var COMMAND_DEFINITION = (_COMMAND_DEFINITION = {}, _COMMAND_DEFINITION[exports.CommandType.EXECUTE_SUB_PLAN] = {
123
- parser: Parser.Abi,
121
+ parser: exports.Parser.Abi,
124
122
  params: [{
125
123
  name: 'commands',
126
124
  type: 'bytes'
@@ -129,7 +127,7 @@ var COMMAND_DEFINITION = (_COMMAND_DEFINITION = {}, _COMMAND_DEFINITION[exports.
129
127
  type: 'bytes[]'
130
128
  }]
131
129
  }, _COMMAND_DEFINITION[exports.CommandType.PERMIT2_PERMIT] = {
132
- parser: Parser.Abi,
130
+ parser: exports.Parser.Abi,
133
131
  params: [{
134
132
  name: 'permit',
135
133
  type: PERMIT_STRUCT
@@ -138,7 +136,7 @@ var COMMAND_DEFINITION = (_COMMAND_DEFINITION = {}, _COMMAND_DEFINITION[exports.
138
136
  type: 'bytes'
139
137
  }]
140
138
  }, _COMMAND_DEFINITION[exports.CommandType.PERMIT2_PERMIT_BATCH] = {
141
- parser: Parser.Abi,
139
+ parser: exports.Parser.Abi,
142
140
  params: [{
143
141
  name: 'permit',
144
142
  type: PERMIT_BATCH_STRUCT
@@ -147,7 +145,7 @@ var COMMAND_DEFINITION = (_COMMAND_DEFINITION = {}, _COMMAND_DEFINITION[exports.
147
145
  type: 'bytes'
148
146
  }]
149
147
  }, _COMMAND_DEFINITION[exports.CommandType.PERMIT2_TRANSFER_FROM] = {
150
- parser: Parser.Abi,
148
+ parser: exports.Parser.Abi,
151
149
  params: [{
152
150
  name: 'token',
153
151
  type: 'address'
@@ -159,13 +157,13 @@ var COMMAND_DEFINITION = (_COMMAND_DEFINITION = {}, _COMMAND_DEFINITION[exports.
159
157
  type: 'uint160'
160
158
  }]
161
159
  }, _COMMAND_DEFINITION[exports.CommandType.PERMIT2_TRANSFER_FROM_BATCH] = {
162
- parser: Parser.Abi,
160
+ parser: exports.Parser.Abi,
163
161
  params: [{
164
162
  name: 'transferFrom',
165
163
  type: PERMIT2_TRANSFER_FROM_BATCH_STRUCT
166
164
  }]
167
165
  }, _COMMAND_DEFINITION[exports.CommandType.V3_SWAP_EXACT_IN] = {
168
- parser: Parser.Abi,
166
+ parser: exports.Parser.Abi,
169
167
  params: [{
170
168
  name: 'recipient',
171
169
  type: 'address'
@@ -177,14 +175,14 @@ var COMMAND_DEFINITION = (_COMMAND_DEFINITION = {}, _COMMAND_DEFINITION[exports.
177
175
  type: 'uint256'
178
176
  }, {
179
177
  name: 'path',
180
- subparser: Subparser.V3PathExactIn,
178
+ subparser: exports.Subparser.V3PathExactIn,
181
179
  type: 'bytes'
182
180
  }, {
183
181
  name: 'payerIsUser',
184
182
  type: 'bool'
185
183
  }]
186
184
  }, _COMMAND_DEFINITION[exports.CommandType.V3_SWAP_EXACT_OUT] = {
187
- parser: Parser.Abi,
185
+ parser: exports.Parser.Abi,
188
186
  params: [{
189
187
  name: 'recipient',
190
188
  type: 'address'
@@ -196,14 +194,14 @@ var COMMAND_DEFINITION = (_COMMAND_DEFINITION = {}, _COMMAND_DEFINITION[exports.
196
194
  type: 'uint256'
197
195
  }, {
198
196
  name: 'path',
199
- subparser: Subparser.V3PathExactOut,
197
+ subparser: exports.Subparser.V3PathExactOut,
200
198
  type: 'bytes'
201
199
  }, {
202
200
  name: 'payerIsUser',
203
201
  type: 'bool'
204
202
  }]
205
203
  }, _COMMAND_DEFINITION[exports.CommandType.V2_SWAP_EXACT_IN] = {
206
- parser: Parser.Abi,
204
+ parser: exports.Parser.Abi,
207
205
  params: [{
208
206
  name: 'recipient',
209
207
  type: 'address'
@@ -221,7 +219,7 @@ var COMMAND_DEFINITION = (_COMMAND_DEFINITION = {}, _COMMAND_DEFINITION[exports.
221
219
  type: 'bool'
222
220
  }]
223
221
  }, _COMMAND_DEFINITION[exports.CommandType.V2_SWAP_EXACT_OUT] = {
224
- parser: Parser.Abi,
222
+ parser: exports.Parser.Abi,
225
223
  params: [{
226
224
  name: 'recipient',
227
225
  type: 'address'
@@ -239,9 +237,9 @@ var COMMAND_DEFINITION = (_COMMAND_DEFINITION = {}, _COMMAND_DEFINITION[exports.
239
237
  type: 'bool'
240
238
  }]
241
239
  }, _COMMAND_DEFINITION[exports.CommandType.V4_SWAP] = {
242
- parser: Parser.V4Actions
240
+ parser: exports.Parser.V4Actions
243
241
  }, _COMMAND_DEFINITION[exports.CommandType.WRAP_ETH] = {
244
- parser: Parser.Abi,
242
+ parser: exports.Parser.Abi,
245
243
  params: [{
246
244
  name: 'recipient',
247
245
  type: 'address'
@@ -250,7 +248,7 @@ var COMMAND_DEFINITION = (_COMMAND_DEFINITION = {}, _COMMAND_DEFINITION[exports.
250
248
  type: 'uint256'
251
249
  }]
252
250
  }, _COMMAND_DEFINITION[exports.CommandType.UNWRAP_WETH] = {
253
- parser: Parser.Abi,
251
+ parser: exports.Parser.Abi,
254
252
  params: [{
255
253
  name: 'recipient',
256
254
  type: 'address'
@@ -259,7 +257,7 @@ var COMMAND_DEFINITION = (_COMMAND_DEFINITION = {}, _COMMAND_DEFINITION[exports.
259
257
  type: 'uint256'
260
258
  }]
261
259
  }, _COMMAND_DEFINITION[exports.CommandType.SWEEP] = {
262
- parser: Parser.Abi,
260
+ parser: exports.Parser.Abi,
263
261
  params: [{
264
262
  name: 'token',
265
263
  type: 'address'
@@ -271,7 +269,7 @@ var COMMAND_DEFINITION = (_COMMAND_DEFINITION = {}, _COMMAND_DEFINITION[exports.
271
269
  type: 'uint256'
272
270
  }]
273
271
  }, _COMMAND_DEFINITION[exports.CommandType.TRANSFER] = {
274
- parser: Parser.Abi,
272
+ parser: exports.Parser.Abi,
275
273
  params: [{
276
274
  name: 'token',
277
275
  type: 'address'
@@ -283,7 +281,7 @@ var COMMAND_DEFINITION = (_COMMAND_DEFINITION = {}, _COMMAND_DEFINITION[exports.
283
281
  type: 'uint256'
284
282
  }]
285
283
  }, _COMMAND_DEFINITION[exports.CommandType.PAY_PORTION] = {
286
- parser: Parser.Abi,
284
+ parser: exports.Parser.Abi,
287
285
  params: [{
288
286
  name: 'token',
289
287
  type: 'address'
@@ -295,7 +293,7 @@ var COMMAND_DEFINITION = (_COMMAND_DEFINITION = {}, _COMMAND_DEFINITION[exports.
295
293
  type: 'uint256'
296
294
  }]
297
295
  }, _COMMAND_DEFINITION[exports.CommandType.BALANCE_CHECK_ERC20] = {
298
- parser: Parser.Abi,
296
+ parser: exports.Parser.Abi,
299
297
  params: [{
300
298
  name: 'owner',
301
299
  type: 'address'
@@ -307,11 +305,11 @@ var COMMAND_DEFINITION = (_COMMAND_DEFINITION = {}, _COMMAND_DEFINITION[exports.
307
305
  type: 'uint256'
308
306
  }]
309
307
  }, _COMMAND_DEFINITION[exports.CommandType.V3_POSITION_MANAGER_PERMIT] = {
310
- parser: Parser.V3Actions
308
+ parser: exports.Parser.V3Actions
311
309
  }, _COMMAND_DEFINITION[exports.CommandType.V3_POSITION_MANAGER_CALL] = {
312
- parser: Parser.V3Actions
310
+ parser: exports.Parser.V3Actions
313
311
  }, _COMMAND_DEFINITION[exports.CommandType.V4_POSITION_CALL] = {
314
- parser: Parser.V4Actions
312
+ parser: exports.Parser.V4Actions
315
313
  }, _COMMAND_DEFINITION);
316
314
  var RoutePlanner = /*#__PURE__*/function () {
317
315
  function RoutePlanner() {
@@ -343,7 +341,7 @@ var RoutePlanner = /*#__PURE__*/function () {
343
341
  function createCommand(type, parameters) {
344
342
  var commandDef = COMMAND_DEFINITION[type];
345
343
  switch (commandDef.parser) {
346
- case Parser.Abi:
344
+ case exports.Parser.Abi:
347
345
  var encodedInput = utils.defaultAbiCoder.encode(commandDef.params.map(function (abi) {
348
346
  return abi.type;
349
347
  }), parameters);
@@ -351,13 +349,13 @@ function createCommand(type, parameters) {
351
349
  type: type,
352
350
  encodedInput: encodedInput
353
351
  };
354
- case Parser.V4Actions:
352
+ case exports.Parser.V4Actions:
355
353
  // v4 swap data comes pre-encoded at index 0
356
354
  return {
357
355
  type: type,
358
356
  encodedInput: parameters[0]
359
357
  };
360
- case Parser.V3Actions:
358
+ case exports.Parser.V3Actions:
361
359
  // v4 swap data comes pre-encoded at index 0
362
360
  return {
363
361
  type: type,
@@ -366,6 +364,27 @@ function createCommand(type, parameters) {
366
364
  }
367
365
  }
368
366
 
367
+ function getPathCurrency(currency, pool) {
368
+ // return currency if the currency matches a currency of the pool
369
+ if (pool.involvesToken(currency)) {
370
+ return currency;
371
+ // return if currency.wrapped if pool involves wrapped currency
372
+ } else if (pool.involvesToken(currency.wrapped)) {
373
+ return currency.wrapped;
374
+ // return native currency if pool involves native version of wrapped currency (only applies to V4)
375
+ } else if (pool instanceof v4Sdk.Pool) {
376
+ if (pool.token0.wrapped.equals(currency)) {
377
+ return pool.token0;
378
+ } else if (pool.token1.wrapped.equals(currency)) {
379
+ return pool.token1;
380
+ }
381
+ // otherwise the token is invalid
382
+ } else {
383
+ throw new Error("Expected currency " + currency.symbol + " to be either " + pool.token0.symbol + " or " + pool.token1.symbol);
384
+ }
385
+ return currency; // this line needed for typescript to compile
386
+ }
387
+
369
388
  (function (RouterActionType) {
370
389
  RouterActionType["UniswapTrade"] = "UniswapTrade";
371
390
  RouterActionType["UnwrapWETH"] = "UnwrapWETH";
@@ -619,7 +638,7 @@ var UniswapTrade = /*#__PURE__*/function () {
619
638
  addV3Swap(planner, swap, this.trade.tradeType, this.options, this.payerIsUser, routerMustCustody);
620
639
  break;
621
640
  case routerSdk.Protocol.V4:
622
- addV4Swap(planner, swap, this.trade.tradeType, this.options, this.payerIsUser, routerMustCustody, performAggregatedSlippageCheck);
641
+ addV4Swap(planner, swap, this.trade.tradeType, this.options, this.payerIsUser, routerMustCustody);
623
642
  break;
624
643
  case routerSdk.Protocol.MIXED:
625
644
  addMixedSwap(planner, swap, this.trade.tradeType, this.options, this.payerIsUser, routerMustCustody);
@@ -741,7 +760,7 @@ function addV3Swap(planner, _ref2, tradeType, options, payerIsUser, routerMustCu
741
760
  planner.addCommand(exports.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]);
742
761
  }
743
762
  }
744
- function addV4Swap(planner, _ref3, tradeType, options, payerIsUser, routerMustCustody, performAggregatedSlippageCheck) {
763
+ function addV4Swap(planner, _ref3, tradeType, options, payerIsUser, routerMustCustody) {
745
764
  var _options$recipient;
746
765
  var route = _ref3.route,
747
766
  inputAmount = _ref3.inputAmount,
@@ -752,7 +771,7 @@ function addV4Swap(planner, _ref3, tradeType, options, payerIsUser, routerMustCu
752
771
  outputAmount: outputAmount,
753
772
  tradeType: tradeType
754
773
  });
755
- var slippageToleranceOnSwap = performAggregatedSlippageCheck ? undefined : options.slippageTolerance;
774
+ var slippageToleranceOnSwap = routerMustCustody && tradeType == sdkCore.TradeType.EXACT_INPUT ? undefined : options.slippageTolerance;
756
775
  var inputWethFromRouter = inputAmount.currency.isNative && !route.input.isNative;
757
776
  if (inputWethFromRouter && !payerIsUser) throw new Error('Inconsistent payer');
758
777
  var v4Planner = new v4Sdk.V4Planner();
@@ -764,13 +783,16 @@ function addV4Swap(planner, _ref3, tradeType, options, payerIsUser, routerMustCu
764
783
  }
765
784
  // encode a mixed route swap, i.e. including both v2 and v3 pools
766
785
  function addMixedSwap(planner, swap, tradeType, options, payerIsUser, routerMustCustody) {
767
- var route = swap.route,
768
- inputAmount = swap.inputAmount,
769
- outputAmount = swap.outputAmount;
770
- var tradeRecipient = routerMustCustody ? ROUTER_AS_RECIPIENT : options.recipient;
771
- // single hop, so it can be reduced to plain v2 or v3 swap logic
786
+ var _options$recipient2;
787
+ var route = swap.route;
788
+ var inputAmount = swap.inputAmount;
789
+ var outputAmount = swap.outputAmount;
790
+ var tradeRecipient = routerMustCustody ? ROUTER_AS_RECIPIENT : (_options$recipient2 = options.recipient) != null ? _options$recipient2 : SENDER_AS_RECIPIENT;
791
+ // single hop, so it can be reduced to plain swap logic for one protocol version
772
792
  if (route.pools.length === 1) {
773
- if (route.pools[0] instanceof v3Sdk.Pool) {
793
+ if (route.pools[0] instanceof v4Sdk.Pool) {
794
+ return addV4Swap(planner, swap, tradeType, options, payerIsUser, routerMustCustody);
795
+ } else if (route.pools[0] instanceof v3Sdk.Pool) {
774
796
  return addV3Swap(planner, swap, tradeType, options, payerIsUser, routerMustCustody);
775
797
  } else if (route.pools[0] instanceof v2Sdk.Pair) {
776
798
  return addV2Swap(planner, swap, tradeType, options, payerIsUser, routerMustCustody);
@@ -792,32 +814,53 @@ function addMixedSwap(planner, swap, tradeType, options, payerIsUser, routerMust
792
814
  var isLastSectionInRoute = function isLastSectionInRoute(i) {
793
815
  return i === sections.length - 1;
794
816
  };
795
- var outputToken;
796
- var inputToken = route.input.wrapped;
817
+ var inputToken = route.pathInput;
797
818
  for (var i = 0; i < sections.length; i++) {
798
819
  var section = sections[i];
799
- /// Now, we get output of this section
800
- outputToken = routerSdk.getOutputOfPools(section, inputToken);
801
- var newRouteOriginal = new routerSdk.MixedRouteSDK([].concat(section), section[0].token0.equals(inputToken) ? section[0].token0 : section[0].token1, outputToken);
802
- var newRoute = new routerSdk.MixedRoute(newRouteOriginal);
803
- /// Previous output is now input
804
- inputToken = outputToken.wrapped;
805
- var mixedRouteIsAllV3 = function mixedRouteIsAllV3(route) {
806
- return route.pools.every(function (pool) {
807
- return pool instanceof v3Sdk.Pool;
808
- });
809
- };
810
- if (mixedRouteIsAllV3(newRoute)) {
811
- var path = routerSdk.encodeMixedRouteToPath(newRoute);
812
- planner.addCommand(exports.CommandType.V3_SWAP_EXACT_IN, [
813
- // if not last section: send tokens directly to the first v2 pair of the next section
814
- // note: because of the partitioning function we can be sure that the next section is v2
815
- isLastSectionInRoute(i) ? tradeRecipient : sections[i + 1][0].liquidityToken.address, i == 0 ? amountIn : CONTRACT_BALANCE, !isLastSectionInRoute(i) ? 0 : amountOut, path, payerIsUser && i === 0]);
820
+ var routePool = section[0];
821
+ var outputToken = routerSdk.getOutputOfPools(section, inputToken);
822
+ var subRoute = new routerSdk.MixedRoute(new routerSdk.MixedRouteSDK([].concat(section), inputToken, outputToken));
823
+ var nextInputToken = void 0;
824
+ var swapRecipient = void 0;
825
+ if (isLastSectionInRoute(i)) {
826
+ nextInputToken = outputToken;
827
+ swapRecipient = tradeRecipient;
816
828
  } else {
817
- planner.addCommand(exports.CommandType.V2_SWAP_EXACT_IN, [isLastSectionInRoute(i) ? tradeRecipient : ROUTER_AS_RECIPIENT, i === 0 ? amountIn : CONTRACT_BALANCE, !isLastSectionInRoute(i) ? 0 : amountOut, newRoute.path.map(function (token) {
829
+ var nextPool = sections[i + 1][0];
830
+ nextInputToken = getPathCurrency(outputToken, nextPool);
831
+ var v2PoolIsSwapRecipient = nextPool instanceof v2Sdk.Pair && outputToken.equals(nextInputToken);
832
+ swapRecipient = v2PoolIsSwapRecipient ? nextPool.liquidityToken.address : ROUTER_AS_RECIPIENT;
833
+ }
834
+ if (routePool instanceof v4Sdk.Pool) {
835
+ var v4Planner = new v4Sdk.V4Planner();
836
+ var v4SubRoute = new v4Sdk.Route(section, subRoute.input, subRoute.output);
837
+ v4Planner.addSettle(inputToken, payerIsUser && i === 0, i == 0 ? amountIn : CONTRACT_BALANCE);
838
+ v4Planner.addAction(v4Sdk.Actions.SWAP_EXACT_IN, [{
839
+ currencyIn: inputToken.isNative ? ETH_ADDRESS : inputToken.address,
840
+ path: v4Sdk.encodeRouteToPath(v4SubRoute),
841
+ amountIn: 0,
842
+ amountOutMinimum: !isLastSectionInRoute(i) ? 0 : amountOut
843
+ }]);
844
+ v4Planner.addTake(outputToken, swapRecipient);
845
+ planner.addCommand(exports.CommandType.V4_SWAP, [v4Planner.finalize()]);
846
+ } else if (routePool instanceof v3Sdk.Pool) {
847
+ planner.addCommand(exports.CommandType.V3_SWAP_EXACT_IN, [swapRecipient, i == 0 ? amountIn : CONTRACT_BALANCE, !isLastSectionInRoute(i) ? 0 : amountOut, routerSdk.encodeMixedRouteToPath(subRoute), payerIsUser && i === 0]);
848
+ } else if (routePool instanceof v2Sdk.Pair) {
849
+ planner.addCommand(exports.CommandType.V2_SWAP_EXACT_IN, [swapRecipient, i === 0 ? amountIn : CONTRACT_BALANCE, !isLastSectionInRoute(i) ? 0 : amountOut, subRoute.path.map(function (token) {
818
850
  return token.wrapped.address;
819
851
  }), payerIsUser && i === 0]);
852
+ } else {
853
+ throw new Error('Unexpected Pool Type');
854
+ }
855
+ // perform a token transition (wrap/unwrap if necessary)
856
+ if (!isLastSectionInRoute(i)) {
857
+ if (outputToken.isNative && !nextInputToken.isNative) {
858
+ planner.addCommand(exports.CommandType.WRAP_ETH, [ROUTER_AS_RECIPIENT, CONTRACT_BALANCE]);
859
+ } else if (!outputToken.isNative && nextInputToken.isNative) {
860
+ planner.addCommand(exports.CommandType.UNWRAP_WETH, [ROUTER_AS_RECIPIENT, 0]);
861
+ }
820
862
  }
863
+ inputToken = nextInputToken;
821
864
  }
822
865
  }
823
866
  // if price impact is very high, there's a chance of hitting max/min prices resulting in a partial fill of the swap
@@ -974,6 +1017,7 @@ var UnwrapWETH = /*#__PURE__*/function () {
974
1017
  (function (PoolType) {
975
1018
  PoolType["V2Pool"] = "v2-pool";
976
1019
  PoolType["V3Pool"] = "v3-pool";
1020
+ PoolType["V4Pool"] = "v4-pool";
977
1021
  })(exports.PoolType || (exports.PoolType = {}));
978
1022
  var isNativeCurrency = function isNativeCurrency(address) {
979
1023
  return address.toLowerCase() === ETH_ADDRESS.toLowerCase() || address.toLowerCase() === E_ETH_ADDRESS.toLowerCase();
@@ -1090,21 +1134,35 @@ RouterTradeAdapter.toPair = function (_ref2) {
1090
1134
  return new v2Sdk.Pair(sdkCore.CurrencyAmount.fromRawAmount(RouterTradeAdapter.toToken(reserve0.token), reserve0.quotient), sdkCore.CurrencyAmount.fromRawAmount(RouterTradeAdapter.toToken(reserve1.token), reserve1.quotient));
1091
1135
  };
1092
1136
 
1093
- // Parses UniversalRouter commands
1137
+ // Parses UniversalRouter V2 commands
1094
1138
  var CommandParser = /*#__PURE__*/function () {
1095
1139
  function CommandParser() {}
1096
1140
  CommandParser.parseCalldata = function parseCalldata(calldata) {
1141
+ var genericParser = new GenericCommandParser(COMMAND_DEFINITION);
1097
1142
  var txDescription = CommandParser.INTERFACE.parseTransaction({
1098
1143
  data: calldata
1099
1144
  });
1100
1145
  var _txDescription$args = txDescription.args,
1101
1146
  commands = _txDescription$args.commands,
1102
1147
  inputs = _txDescription$args.inputs;
1103
- var commandTypes = CommandParser.getCommands(commands);
1148
+ return genericParser.parse(commands, inputs);
1149
+ };
1150
+ return CommandParser;
1151
+ }();
1152
+ CommandParser.INTERFACE = /*#__PURE__*/new abi.Interface(UniversalRouter_json.abi);
1153
+ // Parses commands based on given command definition
1154
+ var GenericCommandParser = /*#__PURE__*/function () {
1155
+ function GenericCommandParser(commandDefinition) {
1156
+ this.commandDefinition = commandDefinition;
1157
+ }
1158
+ var _proto = GenericCommandParser.prototype;
1159
+ _proto.parse = function parse(commands, inputs) {
1160
+ var _this = this;
1161
+ var commandTypes = GenericCommandParser.getCommands(commands);
1104
1162
  return {
1105
1163
  commands: commandTypes.map(function (commandType, i) {
1106
- var commandDef = COMMAND_DEFINITION[commandType];
1107
- if (commandDef.parser === Parser.V4Actions) {
1164
+ var commandDef = _this.commandDefinition[commandType];
1165
+ if (commandDef.parser === exports.Parser.V4Actions) {
1108
1166
  var _V4BaseActionsParser$ = v4Sdk.V4BaseActionsParser.parseCalldata(inputs[i]),
1109
1167
  actions = _V4BaseActionsParser$.actions;
1110
1168
  return {
@@ -1112,19 +1170,19 @@ var CommandParser = /*#__PURE__*/function () {
1112
1170
  commandType: commandType,
1113
1171
  params: v4RouterCallToParams(actions)
1114
1172
  };
1115
- } else if (commandDef.parser === Parser.Abi) {
1173
+ } else if (commandDef.parser === exports.Parser.Abi) {
1116
1174
  var abiDef = commandDef.params;
1117
1175
  var rawParams = ethers.ethers.utils.defaultAbiCoder.decode(abiDef.map(function (command) {
1118
1176
  return command.type;
1119
1177
  }), inputs[i]);
1120
1178
  var params = rawParams.map(function (param, j) {
1121
1179
  switch (abiDef[j].subparser) {
1122
- case Subparser.V3PathExactIn:
1180
+ case exports.Subparser.V3PathExactIn:
1123
1181
  return {
1124
1182
  name: abiDef[j].name,
1125
1183
  value: parseV3PathExactIn(param)
1126
1184
  };
1127
- case Subparser.V3PathExactOut:
1185
+ case exports.Subparser.V3PathExactOut:
1128
1186
  return {
1129
1187
  name: abiDef[j].name,
1130
1188
  value: parseV3PathExactOut(param)
@@ -1141,12 +1199,17 @@ var CommandParser = /*#__PURE__*/function () {
1141
1199
  commandType: commandType,
1142
1200
  params: params
1143
1201
  };
1144
- } else if (commandDef.parser === Parser.V3Actions) {
1202
+ } else if (commandDef.parser === exports.Parser.V3Actions) {
1145
1203
  // TODO: implement better parsing here
1146
1204
  return {
1147
1205
  commandName: exports.CommandType[commandType],
1148
1206
  commandType: commandType,
1149
- params: inputs
1207
+ params: inputs.map(function (input) {
1208
+ return {
1209
+ name: 'command',
1210
+ value: input
1211
+ };
1212
+ })
1150
1213
  };
1151
1214
  } else {
1152
1215
  throw new Error("Unsupported parser: " + commandDef);
@@ -1156,7 +1219,7 @@ var CommandParser = /*#__PURE__*/function () {
1156
1219
  }
1157
1220
  // parse command types from bytes string
1158
1221
  ;
1159
- CommandParser.getCommands = function getCommands(commands) {
1222
+ GenericCommandParser.getCommands = function getCommands(commands) {
1160
1223
  var commandTypes = [];
1161
1224
  for (var i = 2; i < commands.length; i += 2) {
1162
1225
  var _byte = commands.substring(i, i + 2);
@@ -1164,9 +1227,8 @@ var CommandParser = /*#__PURE__*/function () {
1164
1227
  }
1165
1228
  return commandTypes;
1166
1229
  };
1167
- return CommandParser;
1230
+ return GenericCommandParser;
1168
1231
  }();
1169
- CommandParser.INTERFACE = /*#__PURE__*/new abi.Interface(UniversalRouter_json.abi);
1170
1232
  function parseV3PathExactIn(path) {
1171
1233
  var strippedPath = path.replace('0x', '');
1172
1234
  var tokenIn = ethers.ethers.utils.getAddress(strippedPath.substring(0, 40));
@@ -1219,6 +1281,7 @@ function v4RouterCallToParams(actions) {
1219
1281
  });
1220
1282
  }
1221
1283
 
1284
+ exports.COMMAND_DEFINITION = COMMAND_DEFINITION;
1222
1285
  exports.CommandParser = CommandParser;
1223
1286
  exports.ROUTER_AS_RECIPIENT = ROUTER_AS_RECIPIENT;
1224
1287
  exports.RoutePlanner = RoutePlanner;