@uniswap/universal-router-sdk 1.3.0 → 1.3.2

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.
@@ -59,6 +59,12 @@ function _createForOfIteratorHelperLoose(o, allowArrayLike) {
59
59
  throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
60
60
  }
61
61
 
62
+ (function (RouterTradeType) {
63
+ RouterTradeType["UniswapTrade"] = "UniswapTrade";
64
+ RouterTradeType["NFTTrade"] = "NFTTrade";
65
+ RouterTradeType["UnwrapWETH"] = "UnwrapWETH";
66
+ })(exports.RouterTradeType || (exports.RouterTradeType = {}));
67
+
62
68
  var _ABI_DEFINITION;
63
69
  /**
64
70
  * CommandTypes
@@ -132,7 +138,7 @@ function createCommand(type, parameters) {
132
138
  var UNIVERSAL_ROUTER_ADDRESS = function UNIVERSAL_ROUTER_ADDRESS(chainId) {
133
139
  switch (chainId) {
134
140
  case 1:
135
- //mainnet
141
+ // mainnet
136
142
  return '0xEf1c6E67703c7BD7107eed8303Fbe6EC2554BF6B';
137
143
  case 5:
138
144
  // goerli
@@ -159,11 +165,38 @@ var UNIVERSAL_ROUTER_ADDRESS = function UNIVERSAL_ROUTER_ADDRESS(chainId) {
159
165
  throw new Error("Universal Router not deployed on chain " + chainId);
160
166
  }
161
167
  };
168
+ var WETH_ADDRESS = function WETH_ADDRESS(chainId) {
169
+ switch (chainId) {
170
+ case 1:
171
+ //mainnet
172
+ return '0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2';
173
+ case 5:
174
+ // goerli
175
+ return '0xb4fbf271143f4fbf7b91a5ded31805e42b2208d6';
176
+ case 137:
177
+ // polygon
178
+ return '0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270';
179
+ case 10:
180
+ // optimism
181
+ return '0x4200000000000000000000000000000000000006';
182
+ case 42161:
183
+ // arbitrum
184
+ return '0x82aF49447D8a07e3bd95BD0d56f35241523fBab1';
185
+ case 420:
186
+ // optimism goerli
187
+ return '0x4200000000000000000000000000000000000006';
188
+ case 421613:
189
+ // arbitrum goerli
190
+ return '0xe39Ab88f8A4777030A534146A9Ca3B52bd5D43A3';
191
+ default:
192
+ throw new Error("WETH9 or UniversalRouter not deployed on chain " + chainId);
193
+ }
194
+ };
162
195
  var PERMIT2_ADDRESS = '0x000000000022D473030F116dDEE9F6B43aC78BA3';
163
196
  var CONTRACT_BALANCE = /*#__PURE__*/ethers.BigNumber.from(2).pow(255);
164
197
  var ETH_ADDRESS = '0x0000000000000000000000000000000000000000';
165
- var MSG_SENDER = '0x0000000000000000000000000000000000000001';
166
- var ADDRESS_THIS = '0x0000000000000000000000000000000000000002';
198
+ var SENDER_AS_RECIPIENT = '0x0000000000000000000000000000000000000001';
199
+ var ROUTER_AS_RECIPIENT = '0x0000000000000000000000000000000000000002';
167
200
 
168
201
  var REFUND_ETH_PRICE_IMPACT_THRESHOLD = /*#__PURE__*/new sdkCore.Percent( /*#__PURE__*/JSBI.BigInt(50), /*#__PURE__*/JSBI.BigInt(100));
169
202
  // Wrapper for uniswap router-sdk trade entity to encode swaps for Universal Router
@@ -172,6 +205,7 @@ var UniswapTrade = /*#__PURE__*/function () {
172
205
  function UniswapTrade(trade, options) {
173
206
  this.trade = trade;
174
207
  this.options = options;
208
+ this.tradeType = exports.RouterTradeType.UniswapTrade;
175
209
  }
176
210
  var _proto = UniswapTrade.prototype;
177
211
  _proto.encode = function encode(planner, _config) {
@@ -179,11 +213,11 @@ var UniswapTrade = /*#__PURE__*/function () {
179
213
  var payerIsUser = true;
180
214
  if (this.trade.inputAmount.currency.isNative) {
181
215
  // TODO: optimize if only one v2 pool we can directly send this to the pool
182
- planner.addCommand(CommandType.WRAP_ETH, [ADDRESS_THIS, this.trade.maximumAmountIn(this.options.slippageTolerance).quotient.toString()]);
216
+ planner.addCommand(CommandType.WRAP_ETH, [ROUTER_AS_RECIPIENT, this.trade.maximumAmountIn(this.options.slippageTolerance).quotient.toString()]);
183
217
  // since WETH is now owned by the router, the router pays for inputs
184
218
  payerIsUser = false;
185
219
  }
186
- this.options.recipient = (_this$options$recipie = this.options.recipient) != null ? _this$options$recipie : MSG_SENDER;
220
+ this.options.recipient = (_this$options$recipie = this.options.recipient) != null ? _this$options$recipie : SENDER_AS_RECIPIENT;
187
221
  // flag for whether we want to perform slippage check on aggregate output of multiple routes
188
222
  // 1. when there are >2 exact input trades. this is only a heuristic,
189
223
  // as it's still more gas-expensive even in this case, but has benefits
@@ -232,11 +266,11 @@ function addV2Swap(planner, _ref, tradeType, options, payerIsUser, routerMustCus
232
266
  if (tradeType == sdkCore.TradeType.EXACT_INPUT) {
233
267
  planner.addCommand(CommandType.V2_SWAP_EXACT_IN, [
234
268
  // if native, we have to unwrap so keep in the router for now
235
- routerMustCustody ? ADDRESS_THIS : options.recipient, trade.maximumAmountIn(options.slippageTolerance).quotient.toString(), trade.minimumAmountOut(options.slippageTolerance).quotient.toString(), route.path.map(function (pool) {
269
+ routerMustCustody ? ROUTER_AS_RECIPIENT : options.recipient, trade.maximumAmountIn(options.slippageTolerance).quotient.toString(), trade.minimumAmountOut(options.slippageTolerance).quotient.toString(), route.path.map(function (pool) {
236
270
  return pool.address;
237
271
  }), payerIsUser]);
238
272
  } else if (tradeType == sdkCore.TradeType.EXACT_OUTPUT) {
239
- planner.addCommand(CommandType.V2_SWAP_EXACT_OUT, [routerMustCustody ? ADDRESS_THIS : options.recipient, trade.minimumAmountOut(options.slippageTolerance).quotient.toString(), trade.maximumAmountIn(options.slippageTolerance).quotient.toString(), route.path.map(function (pool) {
273
+ 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 (pool) {
240
274
  return pool.address;
241
275
  }), payerIsUser]);
242
276
  }
@@ -254,9 +288,9 @@ function addV3Swap(planner, _ref2, tradeType, options, payerIsUser, routerMustCu
254
288
  });
255
289
  var path = v3Sdk.encodeRouteToPath(route, trade.tradeType === sdkCore.TradeType.EXACT_OUTPUT);
256
290
  if (tradeType == sdkCore.TradeType.EXACT_INPUT) {
257
- planner.addCommand(CommandType.V3_SWAP_EXACT_IN, [routerMustCustody ? ADDRESS_THIS : options.recipient, trade.maximumAmountIn(options.slippageTolerance).quotient.toString(), trade.minimumAmountOut(options.slippageTolerance).quotient.toString(), path, payerIsUser]);
291
+ planner.addCommand(CommandType.V3_SWAP_EXACT_IN, [routerMustCustody ? ROUTER_AS_RECIPIENT : options.recipient, trade.maximumAmountIn(options.slippageTolerance).quotient.toString(), trade.minimumAmountOut(options.slippageTolerance).quotient.toString(), path, payerIsUser]);
258
292
  } else if (tradeType == sdkCore.TradeType.EXACT_OUTPUT) {
259
- planner.addCommand(CommandType.V3_SWAP_EXACT_OUT, [routerMustCustody ? ADDRESS_THIS : options.recipient, trade.minimumAmountOut(options.slippageTolerance).quotient.toString(), trade.maximumAmountIn(options.slippageTolerance).quotient.toString(), path, payerIsUser]);
293
+ 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]);
260
294
  }
261
295
  }
262
296
  // encode a mixed route swap, i.e. including both v2 and v3 pools
@@ -264,7 +298,7 @@ function addMixedSwap(planner, swap, tradeType, options, payerIsUser, routerMust
264
298
  var route = swap.route,
265
299
  inputAmount = swap.inputAmount,
266
300
  outputAmount = swap.outputAmount;
267
- var tradeRecipient = routerMustCustody ? ADDRESS_THIS : options.recipient;
301
+ var tradeRecipient = routerMustCustody ? ROUTER_AS_RECIPIENT : options.recipient;
268
302
  // single hop, so it can be reduced to plain v2 or v3 swap logic
269
303
  if (route.pools.length === 1) {
270
304
  if (route.pools[0] instanceof v3Sdk.Pool) {
@@ -311,7 +345,7 @@ function addMixedSwap(planner, swap, tradeType, options, payerIsUser, routerMust
311
345
  // note: because of the partitioning function we can be sure that the next section is v2
312
346
  isLastSectionInRoute(i) ? tradeRecipient : sections[i + 1][0].liquidityToken.address, i == 0 ? amountIn : CONTRACT_BALANCE, !isLastSectionInRoute(i) ? 0 : amountOut, path, payerIsUser && i === 0]);
313
347
  } else {
314
- planner.addCommand(CommandType.V2_SWAP_EXACT_IN, [isLastSectionInRoute(i) ? tradeRecipient : ADDRESS_THIS, i === 0 ? amountIn : CONTRACT_BALANCE, !isLastSectionInRoute(i) ? 0 : amountOut, newRoute.path.map(function (pool) {
348
+ planner.addCommand(CommandType.V2_SWAP_EXACT_IN, [isLastSectionInRoute(i) ? tradeRecipient : ROUTER_AS_RECIPIENT, i === 0 ? amountIn : CONTRACT_BALANCE, !isLastSectionInRoute(i) ? 0 : amountOut, newRoute.path.map(function (pool) {
315
349
  return pool.address;
316
350
  }), payerIsUser && i === 0]);
317
351
  }
@@ -328,32 +362,110 @@ function encodePermit(planner, permit) {
328
362
 
329
363
  var SwapRouter = /*#__PURE__*/function () {
330
364
  function SwapRouter() {}
365
+ SwapRouter.swapCallParameters = function swapCallParameters(trades, config) {
366
+ if (config === void 0) {
367
+ config = {};
368
+ }
369
+ if (!Array.isArray(trades)) trades = [trades];
370
+ var nftTrades = trades.filter(function (trade, _, _ref) {
371
+ return trade.hasOwnProperty('market');
372
+ });
373
+ var allowRevert = nftTrades.length == 1 && nftTrades[0].orders.length == 1 ? false : true;
374
+ var planner = new RoutePlanner();
375
+ // track value flow to require the right amount of native value
376
+ var currentNativeValueInRouter = ethers.BigNumber.from(0);
377
+ var transactionValue = ethers.BigNumber.from(0);
378
+ for (var _iterator = _createForOfIteratorHelperLoose(trades), _step; !(_step = _iterator()).done;) {
379
+ var trade = _step.value;
380
+ /**
381
+ * is NFTTrade
382
+ */
383
+ if (trade.tradeType == exports.RouterTradeType.NFTTrade) {
384
+ var nftTrade = trade;
385
+ nftTrade.encode(planner, {
386
+ allowRevert: allowRevert
387
+ });
388
+ var tradePrice = nftTrade.getTotalPrice();
389
+ // send enough native value to contract for NFT purchase
390
+ if (currentNativeValueInRouter.lt(tradePrice)) {
391
+ transactionValue = transactionValue.add(tradePrice.sub(currentNativeValueInRouter));
392
+ currentNativeValueInRouter = ethers.BigNumber.from(0);
393
+ } else {
394
+ currentNativeValueInRouter = currentNativeValueInRouter.sub(tradePrice);
395
+ }
396
+ /**
397
+ * is Uniswap Trade
398
+ */
399
+ } else if (trade.tradeType == exports.RouterTradeType.UniswapTrade) {
400
+ var uniswapTrade = trade;
401
+ var inputIsNative = uniswapTrade.trade.inputAmount.currency.isNative;
402
+ var outputIsNative = uniswapTrade.trade.outputAmount.currency.isNative;
403
+ var swapOptions = uniswapTrade.options;
404
+ !!(inputIsNative && !!swapOptions.inputTokenPermit) ? invariant(false, 'NATIVE_INPUT_PERMIT') : void 0;
405
+ if (!!swapOptions.inputTokenPermit) {
406
+ encodePermit(planner, swapOptions.inputTokenPermit);
407
+ }
408
+ if (inputIsNative) {
409
+ transactionValue = transactionValue.add(ethers.BigNumber.from(uniswapTrade.trade.maximumAmountIn(swapOptions.slippageTolerance).quotient.toString()));
410
+ }
411
+ // track amount of native currency in the router
412
+ if (outputIsNative && swapOptions.recipient == ROUTER_AS_RECIPIENT) {
413
+ currentNativeValueInRouter = currentNativeValueInRouter.add(ethers.BigNumber.from(uniswapTrade.trade.minimumAmountOut(swapOptions.slippageTolerance).quotient.toString()));
414
+ }
415
+ uniswapTrade.encode(planner, {
416
+ allowRevert: false
417
+ });
418
+ /**
419
+ * is UnwrapWETH
420
+ */
421
+ } else if (trade.tradeType == exports.RouterTradeType.UnwrapWETH) {
422
+ var UnwrapWETH = trade;
423
+ trade.encode(planner, {
424
+ allowRevert: false
425
+ });
426
+ currentNativeValueInRouter = currentNativeValueInRouter.add(UnwrapWETH.amount);
427
+ /**
428
+ * else
429
+ */
430
+ } else {
431
+ throw 'trade must be of instance: UniswapTrade or NFTTrade';
432
+ }
433
+ }
434
+ // TODO: matches current logic for now, but should eventually only sweep for multiple NFT trades
435
+ // or NFT trades with potential slippage (i.e. sudo)
436
+ if (nftTrades.length > 0) planner.addCommand(CommandType.SWEEP, [ETH_ADDRESS, SENDER_AS_RECIPIENT, 0]);
437
+ return SwapRouter.encodePlan(planner, transactionValue, config);
438
+ }
331
439
  /**
440
+ * @deprecated in favor of swapCallParameters. Update before next major version 2.0.0
332
441
  * Produces the on-chain method name to call and the hex encoded parameters to pass as arguments for a given swap.
333
442
  * @param trades to produce call parameters for
334
- */
443
+ */;
335
444
  SwapRouter.swapNFTCallParameters = function swapNFTCallParameters(trades, config) {
336
- !!!config.sender ? invariant(false, 'SENDER_REQUIRED') : void 0;
445
+ if (config === void 0) {
446
+ config = {};
447
+ }
337
448
  var planner = new RoutePlanner();
338
449
  var totalPrice = ethers.BigNumber.from(0);
339
450
  var allowRevert = trades.length == 1 && trades[0].orders.length == 1 ? false : true;
340
- for (var _iterator = _createForOfIteratorHelperLoose(trades), _step; !(_step = _iterator()).done;) {
341
- var trade = _step.value;
451
+ for (var _iterator2 = _createForOfIteratorHelperLoose(trades), _step2; !(_step2 = _iterator2()).done;) {
452
+ var trade = _step2.value;
342
453
  trade.encode(planner, {
343
454
  allowRevert: allowRevert
344
455
  });
345
456
  totalPrice = totalPrice.add(trade.getTotalPrice());
346
457
  }
347
- planner.addCommand(CommandType.SWEEP, [ETH_ADDRESS, config.sender, 0]);
458
+ planner.addCommand(CommandType.SWEEP, [ETH_ADDRESS, SENDER_AS_RECIPIENT, 0]);
348
459
  return SwapRouter.encodePlan(planner, totalPrice, config);
349
460
  }
350
461
  /**
462
+ * @deprecated in favor of swapCallParameters. Update before next major version 2.0.0
351
463
  * Produces the on-chain method name to call and the hex encoded parameters to pass as arguments for a given trade.
352
464
  * @param trades to produce call parameters for
353
465
  * @param options options for the call parameters
354
466
  */;
355
467
  SwapRouter.swapERC20CallParameters = function swapERC20CallParameters(trades, options) {
356
- // TODO: use permit if signature included in options
468
+ // TODO: use permit if signature included in swapOptions
357
469
  var planner = new RoutePlanner();
358
470
  var trade = new UniswapTrade(trades, options);
359
471
  var inputCurrency = trade.trade.inputAmount.currency;
@@ -386,7 +498,7 @@ var SwapRouter = /*#__PURE__*/function () {
386
498
  var calldata = SwapRouter.INTERFACE.encodeFunctionData(functionSignature, parameters);
387
499
  return {
388
500
  calldata: calldata,
389
- value: nativeCurrencyValue.toString()
501
+ value: nativeCurrencyValue.toHexString()
390
502
  };
391
503
  };
392
504
  return SwapRouter;
@@ -394,6 +506,7 @@ var SwapRouter = /*#__PURE__*/function () {
394
506
  SwapRouter.INTERFACE = /*#__PURE__*/new abi$7.Interface(UniversalRouter_json.abi);
395
507
 
396
508
  var NFTTrade = function NFTTrade(market, orders) {
509
+ this.tradeType = exports.RouterTradeType.NFTTrade;
397
510
  !(orders.length > 0) ? invariant(false, 'no buy Items') : void 0;
398
511
  this.market = market;
399
512
  this.orders = orders;
@@ -9287,10 +9400,12 @@ exports.NFT20Trade = NFT20Trade;
9287
9400
  exports.NFTTrade = NFTTrade;
9288
9401
  exports.NFTXTrade = NFTXTrade;
9289
9402
  exports.PERMIT2_ADDRESS = PERMIT2_ADDRESS;
9403
+ exports.ROUTER_AS_RECIPIENT = ROUTER_AS_RECIPIENT;
9290
9404
  exports.SeaportTrade = SeaportTrade;
9291
9405
  exports.SudoswapTrade = SudoswapTrade;
9292
9406
  exports.SwapRouter = SwapRouter;
9293
9407
  exports.UNIVERSAL_ROUTER_ADDRESS = UNIVERSAL_ROUTER_ADDRESS;
9294
9408
  exports.UniswapTrade = UniswapTrade;
9409
+ exports.WETH_ADDRESS = WETH_ADDRESS;
9295
9410
  exports.X2Y2Trade = X2Y2Trade;
9296
9411
  //# sourceMappingURL=universal-router-sdk.cjs.development.js.map