@uniswap/universal-router-sdk 1.8.2 → 1.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -9,6 +9,7 @@ export declare type FlatFeeOptions = {
9
9
  recipient: string;
10
10
  };
11
11
  export declare type SwapOptions = Omit<RouterSwapOptions, 'inputTokenPermit'> & {
12
+ useRouterBalance?: boolean;
12
13
  inputTokenPermit?: Permit2Permit;
13
14
  flatFee?: FlatFeeOptions;
14
15
  safeMode?: boolean;
@@ -17,6 +18,8 @@ export declare class UniswapTrade implements Command {
17
18
  trade: RouterTrade<Currency, Currency, TradeType>;
18
19
  options: SwapOptions;
19
20
  readonly tradeType: RouterTradeType;
21
+ readonly payerIsUser: boolean;
20
22
  constructor(trade: RouterTrade<Currency, Currency, TradeType>, options: SwapOptions);
23
+ get inputRequiresWrap(): boolean;
21
24
  encode(planner: RoutePlanner, _config: TradeConfig): void;
22
25
  }
package/dist/index.d.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  export { SwapRouter } from './swapRouter';
2
2
  export * from './entities';
3
+ export * from './utils/routerTradeAdapter';
3
4
  export { RoutePlanner, CommandType } from './utils/routerCommands';
4
5
  export { UNIVERSAL_ROUTER_ADDRESS, UNIVERSAL_ROUTER_CREATION_BLOCK, PERMIT2_ADDRESS, ROUTER_AS_RECIPIENT, WETH_ADDRESS, } from './utils/constants';
@@ -16,6 +16,23 @@ var sdkCore = require('@uniswap/sdk-core');
16
16
  require('jsbi');
17
17
  require('bignumber.js');
18
18
 
19
+ function _defineProperties(target, props) {
20
+ for (var i = 0; i < props.length; i++) {
21
+ var descriptor = props[i];
22
+ descriptor.enumerable = descriptor.enumerable || false;
23
+ descriptor.configurable = true;
24
+ if ("value" in descriptor) descriptor.writable = true;
25
+ Object.defineProperty(target, descriptor.key, descriptor);
26
+ }
27
+ }
28
+ function _createClass(Constructor, protoProps, staticProps) {
29
+ if (protoProps) _defineProperties(Constructor.prototype, protoProps);
30
+ if (staticProps) _defineProperties(Constructor, staticProps);
31
+ Object.defineProperty(Constructor, "prototype", {
32
+ writable: false
33
+ });
34
+ return Constructor;
35
+ }
19
36
  function _extends() {
20
37
  _extends = Object.assign ? Object.assign.bind() : function (target) {
21
38
  for (var i = 1; i < arguments.length; i++) {
@@ -262,6 +279,7 @@ var WETH_ADDRESS = function WETH_ADDRESS(chainId) {
262
279
  var PERMIT2_ADDRESS = '0x000000000022D473030F116dDEE9F6B43aC78BA3';
263
280
  var CONTRACT_BALANCE = /*#__PURE__*/ethers.BigNumber.from(2).pow(255);
264
281
  var ETH_ADDRESS = '0x0000000000000000000000000000000000000000';
282
+ var E_ETH_ADDRESS = '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee';
265
283
  var ZERO_ADDRESS = '0x0000000000000000000000000000000000000000';
266
284
  var SENDER_AS_RECIPIENT = '0x0000000000000000000000000000000000000001';
267
285
  var ROUTER_AS_RECIPIENT = '0x0000000000000000000000000000000000000002';
@@ -281,17 +299,15 @@ var UniswapTrade = /*#__PURE__*/function () {
281
299
  this.options = options;
282
300
  this.tradeType = exports.RouterTradeType.UniswapTrade;
283
301
  if (!!options.fee && !!options.flatFee) throw new Error('Only one fee option permitted');
302
+ if (this.inputRequiresWrap) this.payerIsUser = false;else if (this.options.useRouterBalance) this.payerIsUser = false;else this.payerIsUser = true;
284
303
  }
285
304
  var _proto = UniswapTrade.prototype;
286
305
  _proto.encode = function encode(planner, _config) {
287
306
  var _this$options$recipie;
288
- var payerIsUser = true;
289
307
  // If the input currency is the native currency, we need to wrap it with the router as the recipient
290
- if (this.trade.inputAmount.currency.isNative) {
308
+ if (this.inputRequiresWrap) {
291
309
  // TODO: optimize if only one v2 pool we can directly send this to the pool
292
310
  planner.addCommand(exports.CommandType.WRAP_ETH, [ROUTER_AS_RECIPIENT, this.trade.maximumAmountIn(this.options.slippageTolerance).quotient.toString()]);
293
- // since WETH is now owned by the router, the router pays for inputs
294
- payerIsUser = false;
295
311
  }
296
312
  // The overall recipient at the end of the trade, SENDER_AS_RECIPIENT uses the msg.sender
297
313
  this.options.recipient = (_this$options$recipie = this.options.recipient) != null ? _this$options$recipie : SENDER_AS_RECIPIENT;
@@ -301,19 +317,18 @@ var UniswapTrade = /*#__PURE__*/function () {
301
317
  // in that the reversion probability is lower
302
318
  var performAggregatedSlippageCheck = this.trade.tradeType === sdkCore.TradeType.EXACT_INPUT && this.trade.routes.length > 2;
303
319
  var outputIsNative = this.trade.outputAmount.currency.isNative;
304
- var inputIsNative = this.trade.inputAmount.currency.isNative;
305
320
  var routerMustCustody = performAggregatedSlippageCheck || outputIsNative || hasFeeOption(this.options);
306
321
  for (var _iterator = _createForOfIteratorHelperLoose(this.trade.swaps), _step; !(_step = _iterator()).done;) {
307
322
  var swap = _step.value;
308
323
  switch (swap.route.protocol) {
309
324
  case routerSdk.Protocol.V2:
310
- addV2Swap(planner, swap, this.trade.tradeType, this.options, payerIsUser, routerMustCustody);
325
+ addV2Swap(planner, swap, this.trade.tradeType, this.options, this.payerIsUser, routerMustCustody);
311
326
  break;
312
327
  case routerSdk.Protocol.V3:
313
- addV3Swap(planner, swap, this.trade.tradeType, this.options, payerIsUser, routerMustCustody);
328
+ addV3Swap(planner, swap, this.trade.tradeType, this.options, this.payerIsUser, routerMustCustody);
314
329
  break;
315
330
  case routerSdk.Protocol.MIXED:
316
- addMixedSwap(planner, swap, this.trade.tradeType, this.options, payerIsUser, routerMustCustody);
331
+ addMixedSwap(planner, swap, this.trade.tradeType, this.options, this.payerIsUser, routerMustCustody);
317
332
  break;
318
333
  default:
319
334
  throw new Error('UNSUPPORTED_TRADE_PROTOCOL');
@@ -353,13 +368,19 @@ var UniswapTrade = /*#__PURE__*/function () {
353
368
  planner.addCommand(exports.CommandType.SWEEP, [this.trade.outputAmount.currency.wrapped.address, this.options.recipient, minimumAmountOut]);
354
369
  }
355
370
  }
356
- if (inputIsNative && (this.trade.tradeType === sdkCore.TradeType.EXACT_OUTPUT || riskOfPartialFill(this.trade))) {
371
+ if (this.inputRequiresWrap && (this.trade.tradeType === sdkCore.TradeType.EXACT_OUTPUT || riskOfPartialFill(this.trade))) {
357
372
  // for exactOutput swaps that take native currency as input
358
373
  // we need to send back the change to the user
359
374
  planner.addCommand(exports.CommandType.UNWRAP_WETH, [this.options.recipient, 0]);
360
375
  }
361
376
  if (this.options.safeMode) planner.addCommand(exports.CommandType.SWEEP, [ETH_ADDRESS, this.options.recipient, 0]);
362
377
  };
378
+ _createClass(UniswapTrade, [{
379
+ key: "inputRequiresWrap",
380
+ get: function get() {
381
+ return this.trade.inputAmount.currency.isNative;
382
+ }
383
+ }]);
363
384
  return UniswapTrade;
364
385
  }();
365
386
  // encode a uniswap v2 swap
@@ -10546,6 +10567,123 @@ var UnwrapWETH = /*#__PURE__*/function () {
10546
10567
  return UnwrapWETH;
10547
10568
  }();
10548
10569
 
10570
+ (function (PoolType) {
10571
+ PoolType["V2Pool"] = "v2-pool";
10572
+ PoolType["V3Pool"] = "v3-pool";
10573
+ })(exports.PoolType || (exports.PoolType = {}));
10574
+ var isNativeCurrency = function isNativeCurrency(address) {
10575
+ return address.toLowerCase() === ETH_ADDRESS.toLowerCase() || address.toLowerCase() === E_ETH_ADDRESS.toLowerCase();
10576
+ };
10577
+ // Helper class to convert routing-specific quote entities to RouterTrade entities
10578
+ // the returned RouterTrade can then be used to build the UniswapTrade entity in this package
10579
+ var RouterTradeAdapter = /*#__PURE__*/function () {
10580
+ function RouterTradeAdapter() {}
10581
+ // Generate a RouterTrade using fields from a classic quote response
10582
+ RouterTradeAdapter.fromClassicQuote = function fromClassicQuote(quote) {
10583
+ var route = quote.route,
10584
+ tokenIn = quote.tokenIn,
10585
+ tokenOut = quote.tokenOut;
10586
+ if (!route) throw new Error('Expected route to be present');
10587
+ if (!route.length) throw new Error('Expected there to be at least one route');
10588
+ if (route.some(function (r) {
10589
+ return !r.length;
10590
+ })) throw new Error('Expected all routes to have at least one pool');
10591
+ var firstRoute = route[0];
10592
+ var tokenInData = firstRoute[0].tokenIn;
10593
+ var tokenOutData = firstRoute[firstRoute.length - 1].tokenOut;
10594
+ if (!tokenInData || !tokenOutData) throw new Error('Expected both tokenIn and tokenOut to be present');
10595
+ if (tokenInData.chainId !== tokenOutData.chainId) throw new Error('Expected tokenIn and tokenOut to be have same chainId');
10596
+ var parsedCurrencyIn = RouterTradeAdapter.toCurrency(isNativeCurrency(tokenIn), tokenInData);
10597
+ var parsedCurrencyOut = RouterTradeAdapter.toCurrency(isNativeCurrency(tokenOut), tokenOutData);
10598
+ var typedRoutes = route.map(function (subRoute) {
10599
+ var rawAmountIn = subRoute[0].amountIn;
10600
+ var rawAmountOut = subRoute[subRoute.length - 1].amountOut;
10601
+ if (!rawAmountIn || !rawAmountOut) {
10602
+ throw new Error('Expected both raw amountIn and raw amountOut to be present');
10603
+ }
10604
+ var inputAmount = sdkCore.CurrencyAmount.fromRawAmount(parsedCurrencyIn, rawAmountIn);
10605
+ var outputAmount = sdkCore.CurrencyAmount.fromRawAmount(parsedCurrencyOut, rawAmountOut);
10606
+ var isOnlyV2 = RouterTradeAdapter.isVersionedRoute(exports.PoolType.V2Pool, subRoute);
10607
+ var isOnlyV3 = RouterTradeAdapter.isVersionedRoute(exports.PoolType.V3Pool, subRoute);
10608
+ return {
10609
+ routev3: isOnlyV3 ? new v3Sdk.Route(subRoute.map(RouterTradeAdapter.toPool), parsedCurrencyIn, parsedCurrencyOut) : null,
10610
+ routev2: isOnlyV2 ? new v2Sdk.Route(subRoute.map(RouterTradeAdapter.toPair), parsedCurrencyIn, parsedCurrencyOut) : null,
10611
+ mixedRoute: !isOnlyV3 && !isOnlyV2 ? new routerSdk.MixedRouteSDK(subRoute.map(RouterTradeAdapter.toPoolOrPair), parsedCurrencyIn, parsedCurrencyOut) : null,
10612
+ inputAmount: inputAmount,
10613
+ outputAmount: outputAmount
10614
+ };
10615
+ });
10616
+ return new routerSdk.Trade({
10617
+ v2Routes: typedRoutes.filter(function (route) {
10618
+ return route.routev2;
10619
+ }).map(function (route) {
10620
+ return {
10621
+ routev2: route.routev2,
10622
+ inputAmount: route.inputAmount,
10623
+ outputAmount: route.outputAmount
10624
+ };
10625
+ }),
10626
+ v3Routes: typedRoutes.filter(function (route) {
10627
+ return route.routev3;
10628
+ }).map(function (route) {
10629
+ return {
10630
+ routev3: route.routev3,
10631
+ inputAmount: route.inputAmount,
10632
+ outputAmount: route.outputAmount
10633
+ };
10634
+ }),
10635
+ mixedRoutes: typedRoutes.filter(function (route) {
10636
+ return route.mixedRoute;
10637
+ }).map(function (route) {
10638
+ return {
10639
+ mixedRoute: route.mixedRoute,
10640
+ inputAmount: route.inputAmount,
10641
+ outputAmount: route.outputAmount
10642
+ };
10643
+ }),
10644
+ tradeType: quote.tradeType
10645
+ });
10646
+ };
10647
+ RouterTradeAdapter.toCurrency = function toCurrency(isNative, token) {
10648
+ if (isNative) {
10649
+ return sdkCore.Ether.onChain(token.chainId);
10650
+ }
10651
+ return this.toToken(token);
10652
+ };
10653
+ RouterTradeAdapter.toToken = function toToken(token) {
10654
+ var chainId = token.chainId,
10655
+ address = token.address,
10656
+ decimals = token.decimals,
10657
+ symbol = token.symbol,
10658
+ buyFeeBps = token.buyFeeBps,
10659
+ sellFeeBps = token.sellFeeBps;
10660
+ return new sdkCore.Token(chainId, address, parseInt(decimals.toString()), symbol, /* name */undefined, false, buyFeeBps ? ethers.BigNumber.from(buyFeeBps) : undefined, sellFeeBps ? ethers.BigNumber.from(sellFeeBps) : undefined);
10661
+ };
10662
+ RouterTradeAdapter.toPool = function toPool(_ref) {
10663
+ var fee = _ref.fee,
10664
+ sqrtRatioX96 = _ref.sqrtRatioX96,
10665
+ liquidity = _ref.liquidity,
10666
+ tickCurrent = _ref.tickCurrent,
10667
+ tokenIn = _ref.tokenIn,
10668
+ tokenOut = _ref.tokenOut;
10669
+ return new v3Sdk.Pool(RouterTradeAdapter.toToken(tokenIn), RouterTradeAdapter.toToken(tokenOut), parseInt(fee), sqrtRatioX96, liquidity, parseInt(tickCurrent));
10670
+ };
10671
+ RouterTradeAdapter.isVersionedRoute = function isVersionedRoute(type, route) {
10672
+ return route.every(function (pool) {
10673
+ return pool.type === type;
10674
+ });
10675
+ };
10676
+ return RouterTradeAdapter;
10677
+ }();
10678
+ RouterTradeAdapter.toPoolOrPair = function (pool) {
10679
+ return pool.type === exports.PoolType.V3Pool ? RouterTradeAdapter.toPool(pool) : RouterTradeAdapter.toPair(pool);
10680
+ };
10681
+ RouterTradeAdapter.toPair = function (_ref2) {
10682
+ var reserve0 = _ref2.reserve0,
10683
+ reserve1 = _ref2.reserve1;
10684
+ return new v2Sdk.Pair(sdkCore.CurrencyAmount.fromRawAmount(RouterTradeAdapter.toToken(reserve0.token), reserve0.quotient), sdkCore.CurrencyAmount.fromRawAmount(RouterTradeAdapter.toToken(reserve1.token), reserve1.quotient));
10685
+ };
10686
+
10549
10687
  exports.CryptopunkTrade = CryptopunkTrade;
10550
10688
  exports.FoundationTrade = FoundationTrade;
10551
10689
  exports.LooksRareV2Trade = LooksRareV2Trade;
@@ -10555,6 +10693,7 @@ exports.NFTXTrade = NFTXTrade;
10555
10693
  exports.PERMIT2_ADDRESS = PERMIT2_ADDRESS;
10556
10694
  exports.ROUTER_AS_RECIPIENT = ROUTER_AS_RECIPIENT;
10557
10695
  exports.RoutePlanner = RoutePlanner;
10696
+ exports.RouterTradeAdapter = RouterTradeAdapter;
10558
10697
  exports.SeaportTrade = SeaportTrade;
10559
10698
  exports.SudoswapTrade = SudoswapTrade;
10560
10699
  exports.SwapRouter = SwapRouter;
@@ -10564,4 +10703,5 @@ exports.UniswapTrade = UniswapTrade;
10564
10703
  exports.UnwrapWETH = UnwrapWETH;
10565
10704
  exports.WETH_ADDRESS = WETH_ADDRESS;
10566
10705
  exports.X2Y2Trade = X2Y2Trade;
10706
+ exports.isNativeCurrency = isNativeCurrency;
10567
10707
  //# sourceMappingURL=universal-router-sdk.cjs.development.js.map