@uniswap/universal-router-sdk 4.4.0 → 4.4.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.
- package/dist/universal-router-sdk.cjs.development.js +77 -31
- package/dist/universal-router-sdk.cjs.development.js.map +1 -1
- package/dist/universal-router-sdk.cjs.production.min.js +1 -1
- package/dist/universal-router-sdk.cjs.production.min.js.map +1 -1
- package/dist/universal-router-sdk.esm.js +83 -37
- package/dist/universal-router-sdk.esm.js.map +1 -1
- package/dist/utils/pathCurrency.d.ts +3 -0
- package/dist/utils/routerTradeAdapter.d.ts +2 -1
- package/package.json +3 -3
|
@@ -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";
|
|
@@ -553,8 +574,8 @@ var CHAIN_CONFIGS = (_CHAIN_CONFIGS = {}, _CHAIN_CONFIGS[1] = {
|
|
|
553
574
|
address: '0x8909Dc15e40173Ff4699343b6eB8132c65e18eC6',
|
|
554
575
|
creationBlock: 1241811
|
|
555
576
|
}, _routerConfigs20[exports.UniversalRouterVersion.V2_0] = {
|
|
556
|
-
address: '
|
|
557
|
-
creationBlock:
|
|
577
|
+
address: '0xcA7577Afb670147c7b211C798B97118bd36058F3',
|
|
578
|
+
creationBlock: 1490973
|
|
558
579
|
}, _routerConfigs20)
|
|
559
580
|
}, _CHAIN_CONFIGS);
|
|
560
581
|
var UNIVERSAL_ROUTER_ADDRESS = function UNIVERSAL_ROUTER_ADDRESS(version, chainId) {
|
|
@@ -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
|
|
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
|
|
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 =
|
|
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
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
var
|
|
769
|
-
|
|
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
|
|
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
|
|
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
|
-
|
|
798
|
-
outputToken = routerSdk.getOutputOfPools(section, inputToken);
|
|
799
|
-
var
|
|
800
|
-
var
|
|
801
|
-
|
|
802
|
-
|
|
803
|
-
|
|
804
|
-
|
|
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
|
-
|
|
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();
|