@uniswap/universal-router-sdk 1.3.3 → 1.3.4

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 (36) hide show
  1. package/dist/entities/Command.d.ts +13 -7
  2. package/dist/entities/NFTTrade.d.ts +42 -49
  3. package/dist/entities/index.d.ts +3 -2
  4. package/dist/entities/protocols/cryptopunk.d.ts +16 -16
  5. package/dist/entities/protocols/foundation.d.ts +19 -19
  6. package/dist/entities/protocols/index.d.ts +10 -9
  7. package/dist/entities/protocols/looksRare.d.ts +44 -44
  8. package/dist/entities/protocols/nft20.d.ts +21 -21
  9. package/dist/entities/protocols/nftx.d.ts +20 -20
  10. package/dist/entities/protocols/seaport.d.ts +57 -57
  11. package/dist/entities/protocols/sudoswap.d.ts +27 -27
  12. package/dist/entities/protocols/uniswap.d.ts +15 -14
  13. package/dist/entities/protocols/unwrapWETH.d.ts +13 -0
  14. package/dist/entities/protocols/x2y2.d.ts +28 -28
  15. package/dist/index.d.ts +3 -3
  16. package/dist/swapRouter.d.ts +38 -35
  17. package/dist/test/forge/writeInterop.d.ts +1 -0
  18. package/dist/test/orders/looksRare.d.ts +12 -0
  19. package/dist/test/orders/seaport.d.ts +4 -0
  20. package/dist/test/orders/x2y2.d.ts +6 -0
  21. package/dist/test/utils/addresses.d.ts +2 -0
  22. package/dist/test/utils/hexToDecimalString.d.ts +2 -0
  23. package/dist/test/utils/permit2.d.ts +7 -0
  24. package/dist/test/utils/uniswapData.d.ts +24 -0
  25. package/dist/universal-router-sdk.cjs.development.js +158 -19
  26. package/dist/universal-router-sdk.cjs.development.js.map +1 -1
  27. package/dist/universal-router-sdk.cjs.production.min.js +1 -1
  28. package/dist/universal-router-sdk.cjs.production.min.js.map +1 -1
  29. package/dist/universal-router-sdk.esm.js +158 -21
  30. package/dist/universal-router-sdk.esm.js.map +1 -1
  31. package/dist/utils/constants.d.ts +8 -7
  32. package/dist/utils/expandTo18Decimals.d.ts +4 -4
  33. package/dist/utils/getNativeCurrencyValue.d.ts +2 -2
  34. package/dist/utils/permit2.d.ts +6 -6
  35. package/dist/utils/routerCommands.d.ts +43 -43
  36. package/package.json +1 -1
@@ -1,7 +1,7 @@
1
1
  import invariant from 'tiny-invariant';
2
2
  import { abi as abi$7 } from '@uniswap/universal-router/artifacts/contracts/UniversalRouter.sol/UniversalRouter.json';
3
3
  import { Interface } from '@ethersproject/abi';
4
- import { BigNumber } from 'ethers';
4
+ import { BigNumber, ethers } from 'ethers';
5
5
  import JSBI from 'jsbi';
6
6
  import { defaultAbiCoder } from 'ethers/lib/utils';
7
7
  import { Trade, Pair } from '@uniswap/v2-sdk';
@@ -53,6 +53,13 @@ function _createForOfIteratorHelperLoose(o, allowArrayLike) {
53
53
  throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
54
54
  }
55
55
 
56
+ var RouterTradeType;
57
+ (function (RouterTradeType) {
58
+ RouterTradeType["UniswapTrade"] = "UniswapTrade";
59
+ RouterTradeType["NFTTrade"] = "NFTTrade";
60
+ RouterTradeType["UnwrapWETH"] = "UnwrapWETH";
61
+ })(RouterTradeType || (RouterTradeType = {}));
62
+
56
63
  var _ABI_DEFINITION;
57
64
  /**
58
65
  * CommandTypes
@@ -126,7 +133,7 @@ function createCommand(type, parameters) {
126
133
  var UNIVERSAL_ROUTER_ADDRESS = function UNIVERSAL_ROUTER_ADDRESS(chainId) {
127
134
  switch (chainId) {
128
135
  case 1:
129
- //mainnet
136
+ // mainnet
130
137
  return '0xEf1c6E67703c7BD7107eed8303Fbe6EC2554BF6B';
131
138
  case 5:
132
139
  // goerli
@@ -153,11 +160,38 @@ var UNIVERSAL_ROUTER_ADDRESS = function UNIVERSAL_ROUTER_ADDRESS(chainId) {
153
160
  throw new Error("Universal Router not deployed on chain " + chainId);
154
161
  }
155
162
  };
163
+ var WETH_ADDRESS = function WETH_ADDRESS(chainId) {
164
+ switch (chainId) {
165
+ case 1:
166
+ //mainnet
167
+ return '0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2';
168
+ case 5:
169
+ // goerli
170
+ return '0xb4fbf271143f4fbf7b91a5ded31805e42b2208d6';
171
+ case 137:
172
+ // polygon
173
+ return '0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270';
174
+ case 10:
175
+ // optimism
176
+ return '0x4200000000000000000000000000000000000006';
177
+ case 42161:
178
+ // arbitrum
179
+ return '0x82aF49447D8a07e3bd95BD0d56f35241523fBab1';
180
+ case 420:
181
+ // optimism goerli
182
+ return '0x4200000000000000000000000000000000000006';
183
+ case 421613:
184
+ // arbitrum goerli
185
+ return '0xe39Ab88f8A4777030A534146A9Ca3B52bd5D43A3';
186
+ default:
187
+ throw new Error("WETH9 or UniversalRouter not deployed on chain " + chainId);
188
+ }
189
+ };
156
190
  var PERMIT2_ADDRESS = '0x000000000022D473030F116dDEE9F6B43aC78BA3';
157
191
  var CONTRACT_BALANCE = /*#__PURE__*/BigNumber.from(2).pow(255);
158
192
  var ETH_ADDRESS = '0x0000000000000000000000000000000000000000';
159
- var MSG_SENDER = '0x0000000000000000000000000000000000000001';
160
- var ADDRESS_THIS = '0x0000000000000000000000000000000000000002';
193
+ var SENDER_AS_RECIPIENT = '0x0000000000000000000000000000000000000001';
194
+ var ROUTER_AS_RECIPIENT = '0x0000000000000000000000000000000000000002';
161
195
 
162
196
  var REFUND_ETH_PRICE_IMPACT_THRESHOLD = /*#__PURE__*/new Percent( /*#__PURE__*/JSBI.BigInt(50), /*#__PURE__*/JSBI.BigInt(100));
163
197
  // Wrapper for uniswap router-sdk trade entity to encode swaps for Universal Router
@@ -166,6 +200,7 @@ var UniswapTrade = /*#__PURE__*/function () {
166
200
  function UniswapTrade(trade, options) {
167
201
  this.trade = trade;
168
202
  this.options = options;
203
+ this.tradeType = RouterTradeType.UniswapTrade;
169
204
  }
170
205
  var _proto = UniswapTrade.prototype;
171
206
  _proto.encode = function encode(planner, _config) {
@@ -173,11 +208,11 @@ var UniswapTrade = /*#__PURE__*/function () {
173
208
  var payerIsUser = true;
174
209
  if (this.trade.inputAmount.currency.isNative) {
175
210
  // TODO: optimize if only one v2 pool we can directly send this to the pool
176
- planner.addCommand(CommandType.WRAP_ETH, [ADDRESS_THIS, this.trade.maximumAmountIn(this.options.slippageTolerance).quotient.toString()]);
211
+ planner.addCommand(CommandType.WRAP_ETH, [ROUTER_AS_RECIPIENT, this.trade.maximumAmountIn(this.options.slippageTolerance).quotient.toString()]);
177
212
  // since WETH is now owned by the router, the router pays for inputs
178
213
  payerIsUser = false;
179
214
  }
180
- this.options.recipient = (_this$options$recipie = this.options.recipient) != null ? _this$options$recipie : MSG_SENDER;
215
+ this.options.recipient = (_this$options$recipie = this.options.recipient) != null ? _this$options$recipie : SENDER_AS_RECIPIENT;
181
216
  // flag for whether we want to perform slippage check on aggregate output of multiple routes
182
217
  // 1. when there are >2 exact input trades. this is only a heuristic,
183
218
  // as it's still more gas-expensive even in this case, but has benefits
@@ -226,11 +261,11 @@ function addV2Swap(planner, _ref, tradeType, options, payerIsUser, routerMustCus
226
261
  if (tradeType == TradeType.EXACT_INPUT) {
227
262
  planner.addCommand(CommandType.V2_SWAP_EXACT_IN, [
228
263
  // if native, we have to unwrap so keep in the router for now
229
- routerMustCustody ? ADDRESS_THIS : options.recipient, trade.maximumAmountIn(options.slippageTolerance).quotient.toString(), trade.minimumAmountOut(options.slippageTolerance).quotient.toString(), route.path.map(function (pool) {
264
+ routerMustCustody ? ROUTER_AS_RECIPIENT : options.recipient, trade.maximumAmountIn(options.slippageTolerance).quotient.toString(), trade.minimumAmountOut(options.slippageTolerance).quotient.toString(), route.path.map(function (pool) {
230
265
  return pool.address;
231
266
  }), payerIsUser]);
232
267
  } else if (tradeType == TradeType.EXACT_OUTPUT) {
233
- 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) {
268
+ 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) {
234
269
  return pool.address;
235
270
  }), payerIsUser]);
236
271
  }
@@ -248,9 +283,9 @@ function addV3Swap(planner, _ref2, tradeType, options, payerIsUser, routerMustCu
248
283
  });
249
284
  var path = encodeRouteToPath(route, trade.tradeType === TradeType.EXACT_OUTPUT);
250
285
  if (tradeType == TradeType.EXACT_INPUT) {
251
- 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]);
286
+ 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]);
252
287
  } else if (tradeType == TradeType.EXACT_OUTPUT) {
253
- 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]);
288
+ 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]);
254
289
  }
255
290
  }
256
291
  // encode a mixed route swap, i.e. including both v2 and v3 pools
@@ -258,7 +293,7 @@ function addMixedSwap(planner, swap, tradeType, options, payerIsUser, routerMust
258
293
  var route = swap.route,
259
294
  inputAmount = swap.inputAmount,
260
295
  outputAmount = swap.outputAmount;
261
- var tradeRecipient = routerMustCustody ? ADDRESS_THIS : options.recipient;
296
+ var tradeRecipient = routerMustCustody ? ROUTER_AS_RECIPIENT : options.recipient;
262
297
  // single hop, so it can be reduced to plain v2 or v3 swap logic
263
298
  if (route.pools.length === 1) {
264
299
  if (route.pools[0] instanceof Pool) {
@@ -305,7 +340,7 @@ function addMixedSwap(planner, swap, tradeType, options, payerIsUser, routerMust
305
340
  // note: because of the partitioning function we can be sure that the next section is v2
306
341
  isLastSectionInRoute(i) ? tradeRecipient : sections[i + 1][0].liquidityToken.address, i == 0 ? amountIn : CONTRACT_BALANCE, !isLastSectionInRoute(i) ? 0 : amountOut, path, payerIsUser && i === 0]);
307
342
  } else {
308
- 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) {
343
+ 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) {
309
344
  return pool.address;
310
345
  }), payerIsUser && i === 0]);
311
346
  }
@@ -317,37 +352,117 @@ function riskOfPartialFill(trade) {
317
352
  }
318
353
 
319
354
  function encodePermit(planner, permit) {
320
- planner.addCommand(CommandType.PERMIT, [permit, permit.signature]);
355
+ // sanitizes signature to cover edge cases like malformed EIP-2098 sigs and v used as recovery id
356
+ var sanitizedSignature = ethers.utils.joinSignature(ethers.utils.splitSignature(permit.signature));
357
+ planner.addCommand(CommandType.PERMIT, [permit, sanitizedSignature]);
321
358
  }
322
359
 
323
360
  var SwapRouter = /*#__PURE__*/function () {
324
361
  function SwapRouter() {}
362
+ SwapRouter.swapCallParameters = function swapCallParameters(trades, config) {
363
+ if (config === void 0) {
364
+ config = {};
365
+ }
366
+ if (!Array.isArray(trades)) trades = [trades];
367
+ var nftTrades = trades.filter(function (trade, _, _ref) {
368
+ return trade.hasOwnProperty('market');
369
+ });
370
+ var allowRevert = nftTrades.length == 1 && nftTrades[0].orders.length == 1 ? false : true;
371
+ var planner = new RoutePlanner();
372
+ // track value flow to require the right amount of native value
373
+ var currentNativeValueInRouter = BigNumber.from(0);
374
+ var transactionValue = BigNumber.from(0);
375
+ for (var _iterator = _createForOfIteratorHelperLoose(trades), _step; !(_step = _iterator()).done;) {
376
+ var trade = _step.value;
377
+ /**
378
+ * is NFTTrade
379
+ */
380
+ if (trade.tradeType == RouterTradeType.NFTTrade) {
381
+ var nftTrade = trade;
382
+ nftTrade.encode(planner, {
383
+ allowRevert: allowRevert
384
+ });
385
+ var tradePrice = nftTrade.getTotalPrice();
386
+ // send enough native value to contract for NFT purchase
387
+ if (currentNativeValueInRouter.lt(tradePrice)) {
388
+ transactionValue = transactionValue.add(tradePrice.sub(currentNativeValueInRouter));
389
+ currentNativeValueInRouter = BigNumber.from(0);
390
+ } else {
391
+ currentNativeValueInRouter = currentNativeValueInRouter.sub(tradePrice);
392
+ }
393
+ /**
394
+ * is Uniswap Trade
395
+ */
396
+ } else if (trade.tradeType == RouterTradeType.UniswapTrade) {
397
+ var uniswapTrade = trade;
398
+ var inputIsNative = uniswapTrade.trade.inputAmount.currency.isNative;
399
+ var outputIsNative = uniswapTrade.trade.outputAmount.currency.isNative;
400
+ var swapOptions = uniswapTrade.options;
401
+ !!(inputIsNative && !!swapOptions.inputTokenPermit) ? process.env.NODE_ENV !== "production" ? invariant(false, 'NATIVE_INPUT_PERMIT') : invariant(false) : void 0;
402
+ if (!!swapOptions.inputTokenPermit) {
403
+ encodePermit(planner, swapOptions.inputTokenPermit);
404
+ }
405
+ if (inputIsNative) {
406
+ transactionValue = transactionValue.add(BigNumber.from(uniswapTrade.trade.maximumAmountIn(swapOptions.slippageTolerance).quotient.toString()));
407
+ }
408
+ // track amount of native currency in the router
409
+ if (outputIsNative && swapOptions.recipient == ROUTER_AS_RECIPIENT) {
410
+ currentNativeValueInRouter = currentNativeValueInRouter.add(BigNumber.from(uniswapTrade.trade.minimumAmountOut(swapOptions.slippageTolerance).quotient.toString()));
411
+ }
412
+ uniswapTrade.encode(planner, {
413
+ allowRevert: false
414
+ });
415
+ /**
416
+ * is UnwrapWETH
417
+ */
418
+ } else if (trade.tradeType == RouterTradeType.UnwrapWETH) {
419
+ var UnwrapWETH = trade;
420
+ trade.encode(planner, {
421
+ allowRevert: false
422
+ });
423
+ currentNativeValueInRouter = currentNativeValueInRouter.add(UnwrapWETH.amount);
424
+ /**
425
+ * else
426
+ */
427
+ } else {
428
+ throw 'trade must be of instance: UniswapTrade or NFTTrade';
429
+ }
430
+ }
431
+ // TODO: matches current logic for now, but should eventually only sweep for multiple NFT trades
432
+ // or NFT trades with potential slippage (i.e. sudo)
433
+ if (nftTrades.length > 0) planner.addCommand(CommandType.SWEEP, [ETH_ADDRESS, SENDER_AS_RECIPIENT, 0]);
434
+ return SwapRouter.encodePlan(planner, transactionValue, config);
435
+ }
325
436
  /**
437
+ * @deprecated in favor of swapCallParameters. Update before next major version 2.0.0
326
438
  * Produces the on-chain method name to call and the hex encoded parameters to pass as arguments for a given swap.
327
439
  * @param trades to produce call parameters for
328
- */
440
+ */;
329
441
  SwapRouter.swapNFTCallParameters = function swapNFTCallParameters(trades, config) {
330
- !!!config.sender ? process.env.NODE_ENV !== "production" ? invariant(false, 'SENDER_REQUIRED') : invariant(false) : void 0;
442
+ if (config === void 0) {
443
+ config = {};
444
+ }
331
445
  var planner = new RoutePlanner();
332
446
  var totalPrice = BigNumber.from(0);
333
447
  var allowRevert = trades.length == 1 && trades[0].orders.length == 1 ? false : true;
334
- for (var _iterator = _createForOfIteratorHelperLoose(trades), _step; !(_step = _iterator()).done;) {
335
- var trade = _step.value;
448
+ for (var _iterator2 = _createForOfIteratorHelperLoose(trades), _step2; !(_step2 = _iterator2()).done;) {
449
+ var trade = _step2.value;
336
450
  trade.encode(planner, {
337
451
  allowRevert: allowRevert
338
452
  });
339
453
  totalPrice = totalPrice.add(trade.getTotalPrice());
340
454
  }
341
- planner.addCommand(CommandType.SWEEP, [ETH_ADDRESS, config.sender, 0]);
455
+ planner.addCommand(CommandType.SWEEP, [ETH_ADDRESS, SENDER_AS_RECIPIENT, 0]);
342
456
  return SwapRouter.encodePlan(planner, totalPrice, config);
343
457
  }
344
458
  /**
459
+ * @deprecated in favor of swapCallParameters. Update before next major version 2.0.0
345
460
  * Produces the on-chain method name to call and the hex encoded parameters to pass as arguments for a given trade.
346
461
  * @param trades to produce call parameters for
347
462
  * @param options options for the call parameters
348
463
  */;
349
464
  SwapRouter.swapERC20CallParameters = function swapERC20CallParameters(trades, options) {
350
- // TODO: use permit if signature included in options
465
+ // TODO: use permit if signature included in swapOptions
351
466
  var planner = new RoutePlanner();
352
467
  var trade = new UniswapTrade(trades, options);
353
468
  var inputCurrency = trade.trade.inputAmount.currency;
@@ -380,7 +495,7 @@ var SwapRouter = /*#__PURE__*/function () {
380
495
  var calldata = SwapRouter.INTERFACE.encodeFunctionData(functionSignature, parameters);
381
496
  return {
382
497
  calldata: calldata,
383
- value: nativeCurrencyValue.toString()
498
+ value: nativeCurrencyValue.toHexString()
384
499
  };
385
500
  };
386
501
  return SwapRouter;
@@ -388,6 +503,7 @@ var SwapRouter = /*#__PURE__*/function () {
388
503
  SwapRouter.INTERFACE = /*#__PURE__*/new Interface(abi$7);
389
504
 
390
505
  var NFTTrade = function NFTTrade(market, orders) {
506
+ this.tradeType = RouterTradeType.NFTTrade;
391
507
  !(orders.length > 0) ? process.env.NODE_ENV !== "production" ? invariant(false, 'no buy Items') : invariant(false) : void 0;
392
508
  this.market = market;
393
509
  this.orders = orders;
@@ -9276,5 +9392,26 @@ var X2Y2Trade = /*#__PURE__*/function (_NFTTrade) {
9276
9392
  }(NFTTrade);
9277
9393
  X2Y2Trade.INTERFACE = /*#__PURE__*/new Interface(abi$6);
9278
9394
 
9279
- export { CryptopunkTrade, FoundationTrade, LooksRareTrade, Market, NFT20Trade, NFTTrade, NFTXTrade, PERMIT2_ADDRESS, SeaportTrade, SudoswapTrade, SwapRouter, TokenType, UNIVERSAL_ROUTER_ADDRESS, UniswapTrade, X2Y2Trade };
9395
+ var UnwrapWETH = /*#__PURE__*/function () {
9396
+ function UnwrapWETH(amount, chainId, permit2) {
9397
+ this.tradeType = RouterTradeType.UnwrapWETH;
9398
+ this.wethAddress = WETH_ADDRESS(chainId);
9399
+ this.routerAddress = UNIVERSAL_ROUTER_ADDRESS(chainId);
9400
+ this.amount = amount;
9401
+ if (!!permit2) {
9402
+ !(permit2.details.token === this.wethAddress) ? process.env.NODE_ENV !== "production" ? invariant(false, "must be permitting WETH address: " + this.wethAddress) : invariant(false) : void 0;
9403
+ !(permit2.details.amount >= amount) ? process.env.NODE_ENV !== "production" ? invariant(false, "Did not permit enough WETH for unwrapWETH transaction") : invariant(false) : void 0;
9404
+ this.permit2Data = permit2;
9405
+ }
9406
+ }
9407
+ var _proto = UnwrapWETH.prototype;
9408
+ _proto.encode = function encode(planner, _) {
9409
+ if (!!this.permit2Data) encodePermit(planner, this.permit2Data);
9410
+ planner.addCommand(CommandType.PERMIT2_TRANSFER_FROM, [this.wethAddress, this.routerAddress, this.amount]);
9411
+ planner.addCommand(CommandType.UNWRAP_WETH, [ROUTER_AS_RECIPIENT, this.amount]);
9412
+ };
9413
+ return UnwrapWETH;
9414
+ }();
9415
+
9416
+ export { CryptopunkTrade, FoundationTrade, LooksRareTrade, Market, NFT20Trade, NFTTrade, NFTXTrade, PERMIT2_ADDRESS, ROUTER_AS_RECIPIENT, RouterTradeType, SeaportTrade, SudoswapTrade, SwapRouter, TokenType, UNIVERSAL_ROUTER_ADDRESS, UniswapTrade, UnwrapWETH, WETH_ADDRESS, X2Y2Trade };
9280
9417
  //# sourceMappingURL=universal-router-sdk.esm.js.map