@uniswap/universal-router-sdk 4.4.0 → 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.
@@ -364,6 +364,27 @@ function createCommand(type, parameters) {
364
364
  }
365
365
  }
366
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
+
367
388
  (function (RouterActionType) {
368
389
  RouterActionType["UniswapTrade"] = "UniswapTrade";
369
390
  RouterActionType["UnwrapWETH"] = "UnwrapWETH";
@@ -617,7 +638,7 @@ var UniswapTrade = /*#__PURE__*/function () {
617
638
  addV3Swap(planner, swap, this.trade.tradeType, this.options, this.payerIsUser, routerMustCustody);
618
639
  break;
619
640
  case routerSdk.Protocol.V4:
620
- addV4Swap(planner, swap, this.trade.tradeType, this.options, this.payerIsUser, routerMustCustody, performAggregatedSlippageCheck);
641
+ addV4Swap(planner, swap, this.trade.tradeType, this.options, this.payerIsUser, routerMustCustody);
621
642
  break;
622
643
  case routerSdk.Protocol.MIXED:
623
644
  addMixedSwap(planner, swap, this.trade.tradeType, this.options, this.payerIsUser, routerMustCustody);
@@ -739,7 +760,7 @@ function addV3Swap(planner, _ref2, tradeType, options, payerIsUser, routerMustCu
739
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]);
740
761
  }
741
762
  }
742
- function addV4Swap(planner, _ref3, tradeType, options, payerIsUser, routerMustCustody, performAggregatedSlippageCheck) {
763
+ function addV4Swap(planner, _ref3, tradeType, options, payerIsUser, routerMustCustody) {
743
764
  var _options$recipient;
744
765
  var route = _ref3.route,
745
766
  inputAmount = _ref3.inputAmount,
@@ -750,7 +771,7 @@ function addV4Swap(planner, _ref3, tradeType, options, payerIsUser, routerMustCu
750
771
  outputAmount: outputAmount,
751
772
  tradeType: tradeType
752
773
  });
753
- var slippageToleranceOnSwap = performAggregatedSlippageCheck ? undefined : options.slippageTolerance;
774
+ var slippageToleranceOnSwap = routerMustCustody && tradeType == sdkCore.TradeType.EXACT_INPUT ? undefined : options.slippageTolerance;
754
775
  var inputWethFromRouter = inputAmount.currency.isNative && !route.input.isNative;
755
776
  if (inputWethFromRouter && !payerIsUser) throw new Error('Inconsistent payer');
756
777
  var v4Planner = new v4Sdk.V4Planner();
@@ -762,13 +783,16 @@ function addV4Swap(planner, _ref3, tradeType, options, payerIsUser, routerMustCu
762
783
  }
763
784
  // encode a mixed route swap, i.e. including both v2 and v3 pools
764
785
  function addMixedSwap(planner, swap, tradeType, options, payerIsUser, routerMustCustody) {
765
- var route = swap.route,
766
- inputAmount = swap.inputAmount,
767
- outputAmount = swap.outputAmount;
768
- var tradeRecipient = routerMustCustody ? ROUTER_AS_RECIPIENT : options.recipient;
769
- // 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
770
792
  if (route.pools.length === 1) {
771
- 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) {
772
796
  return addV3Swap(planner, swap, tradeType, options, payerIsUser, routerMustCustody);
773
797
  } else if (route.pools[0] instanceof v2Sdk.Pair) {
774
798
  return addV2Swap(planner, swap, tradeType, options, payerIsUser, routerMustCustody);
@@ -790,32 +814,53 @@ function addMixedSwap(planner, swap, tradeType, options, payerIsUser, routerMust
790
814
  var isLastSectionInRoute = function isLastSectionInRoute(i) {
791
815
  return i === sections.length - 1;
792
816
  };
793
- var outputToken;
794
- var inputToken = route.input.wrapped;
817
+ var inputToken = route.pathInput;
795
818
  for (var i = 0; i < sections.length; i++) {
796
819
  var section = sections[i];
797
- /// Now, we get output of this section
798
- outputToken = routerSdk.getOutputOfPools(section, inputToken);
799
- var newRouteOriginal = new routerSdk.MixedRouteSDK([].concat(section), section[0].token0.equals(inputToken) ? section[0].token0 : section[0].token1, outputToken);
800
- var newRoute = new routerSdk.MixedRoute(newRouteOriginal);
801
- /// Previous output is now input
802
- inputToken = outputToken.wrapped;
803
- var mixedRouteIsAllV3 = function mixedRouteIsAllV3(route) {
804
- return route.pools.every(function (pool) {
805
- return pool instanceof v3Sdk.Pool;
806
- });
807
- };
808
- if (mixedRouteIsAllV3(newRoute)) {
809
- var path = routerSdk.encodeMixedRouteToPath(newRoute);
810
- planner.addCommand(exports.CommandType.V3_SWAP_EXACT_IN, [
811
- // if not last section: send tokens directly to the first v2 pair of the next section
812
- // note: because of the partitioning function we can be sure that the next section is v2
813
- 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;
814
828
  } else {
815
- 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) {
816
850
  return token.wrapped.address;
817
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
+ }
818
862
  }
863
+ inputToken = nextInputToken;
819
864
  }
820
865
  }
821
866
  // if price impact is very high, there's a chance of hitting max/min prices resulting in a partial fill of the swap
@@ -972,6 +1017,7 @@ var UnwrapWETH = /*#__PURE__*/function () {
972
1017
  (function (PoolType) {
973
1018
  PoolType["V2Pool"] = "v2-pool";
974
1019
  PoolType["V3Pool"] = "v3-pool";
1020
+ PoolType["V4Pool"] = "v4-pool";
975
1021
  })(exports.PoolType || (exports.PoolType = {}));
976
1022
  var isNativeCurrency = function isNativeCurrency(address) {
977
1023
  return address.toLowerCase() === ETH_ADDRESS.toLowerCase() || address.toLowerCase() === E_ETH_ADDRESS.toLowerCase();