@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.
- package/dist/entities/protocols/uniswap.d.ts +3 -0
- package/dist/index.d.ts +1 -0
- package/dist/universal-router-sdk.cjs.development.js +149 -9
- 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 +153 -14
- package/dist/universal-router-sdk.esm.js.map +1 -1
- package/dist/utils/constants.d.ts +1 -0
- package/dist/utils/routerTradeAdapter.d.ts +57 -0
- package/package.json +2 -2
|
@@ -3,13 +3,30 @@ import { abi as abi$7 } from '@uniswap/universal-router/artifacts/contracts/Univ
|
|
|
3
3
|
import { Interface } from '@ethersproject/abi';
|
|
4
4
|
import { BigNumber, ethers } from 'ethers';
|
|
5
5
|
import { defaultAbiCoder } from 'ethers/lib/utils';
|
|
6
|
-
import { Trade, Pair } from '@uniswap/v2-sdk';
|
|
7
|
-
import { toHex, Trade as Trade$1, encodeRouteToPath, Pool } from '@uniswap/v3-sdk';
|
|
8
|
-
import { Protocol, MixedRouteTrade, partitionMixedRouteByProtocol, getOutputOfPools, MixedRouteSDK, MixedRoute, encodeMixedRouteToPath } from '@uniswap/router-sdk';
|
|
9
|
-
import { TradeType, Percent } from '@uniswap/sdk-core';
|
|
6
|
+
import { Trade, Pair, Route as Route$1 } from '@uniswap/v2-sdk';
|
|
7
|
+
import { toHex, Trade as Trade$1, encodeRouteToPath, Pool, Route } from '@uniswap/v3-sdk';
|
|
8
|
+
import { Protocol, MixedRouteTrade, partitionMixedRouteByProtocol, getOutputOfPools, MixedRouteSDK, MixedRoute, encodeMixedRouteToPath, Trade as Trade$2 } from '@uniswap/router-sdk';
|
|
9
|
+
import { TradeType, Percent, CurrencyAmount, Ether, Token } from '@uniswap/sdk-core';
|
|
10
10
|
import 'jsbi';
|
|
11
11
|
import 'bignumber.js';
|
|
12
12
|
|
|
13
|
+
function _defineProperties(target, props) {
|
|
14
|
+
for (var i = 0; i < props.length; i++) {
|
|
15
|
+
var descriptor = props[i];
|
|
16
|
+
descriptor.enumerable = descriptor.enumerable || false;
|
|
17
|
+
descriptor.configurable = true;
|
|
18
|
+
if ("value" in descriptor) descriptor.writable = true;
|
|
19
|
+
Object.defineProperty(target, descriptor.key, descriptor);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
function _createClass(Constructor, protoProps, staticProps) {
|
|
23
|
+
if (protoProps) _defineProperties(Constructor.prototype, protoProps);
|
|
24
|
+
if (staticProps) _defineProperties(Constructor, staticProps);
|
|
25
|
+
Object.defineProperty(Constructor, "prototype", {
|
|
26
|
+
writable: false
|
|
27
|
+
});
|
|
28
|
+
return Constructor;
|
|
29
|
+
}
|
|
13
30
|
function _extends() {
|
|
14
31
|
_extends = Object.assign ? Object.assign.bind() : function (target) {
|
|
15
32
|
for (var i = 1; i < arguments.length; i++) {
|
|
@@ -265,6 +282,7 @@ var WETH_ADDRESS = function WETH_ADDRESS(chainId) {
|
|
|
265
282
|
var PERMIT2_ADDRESS = '0x000000000022D473030F116dDEE9F6B43aC78BA3';
|
|
266
283
|
var CONTRACT_BALANCE = /*#__PURE__*/BigNumber.from(2).pow(255);
|
|
267
284
|
var ETH_ADDRESS = '0x0000000000000000000000000000000000000000';
|
|
285
|
+
var E_ETH_ADDRESS = '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee';
|
|
268
286
|
var ZERO_ADDRESS = '0x0000000000000000000000000000000000000000';
|
|
269
287
|
var SENDER_AS_RECIPIENT = '0x0000000000000000000000000000000000000001';
|
|
270
288
|
var ROUTER_AS_RECIPIENT = '0x0000000000000000000000000000000000000002';
|
|
@@ -284,17 +302,15 @@ var UniswapTrade = /*#__PURE__*/function () {
|
|
|
284
302
|
this.options = options;
|
|
285
303
|
this.tradeType = RouterTradeType.UniswapTrade;
|
|
286
304
|
if (!!options.fee && !!options.flatFee) throw new Error('Only one fee option permitted');
|
|
305
|
+
if (this.inputRequiresWrap) this.payerIsUser = false;else if (this.options.useRouterBalance) this.payerIsUser = false;else this.payerIsUser = true;
|
|
287
306
|
}
|
|
288
307
|
var _proto = UniswapTrade.prototype;
|
|
289
308
|
_proto.encode = function encode(planner, _config) {
|
|
290
309
|
var _this$options$recipie;
|
|
291
|
-
var payerIsUser = true;
|
|
292
310
|
// If the input currency is the native currency, we need to wrap it with the router as the recipient
|
|
293
|
-
if (this.
|
|
311
|
+
if (this.inputRequiresWrap) {
|
|
294
312
|
// TODO: optimize if only one v2 pool we can directly send this to the pool
|
|
295
313
|
planner.addCommand(CommandType.WRAP_ETH, [ROUTER_AS_RECIPIENT, this.trade.maximumAmountIn(this.options.slippageTolerance).quotient.toString()]);
|
|
296
|
-
// since WETH is now owned by the router, the router pays for inputs
|
|
297
|
-
payerIsUser = false;
|
|
298
314
|
}
|
|
299
315
|
// The overall recipient at the end of the trade, SENDER_AS_RECIPIENT uses the msg.sender
|
|
300
316
|
this.options.recipient = (_this$options$recipie = this.options.recipient) != null ? _this$options$recipie : SENDER_AS_RECIPIENT;
|
|
@@ -304,19 +320,18 @@ var UniswapTrade = /*#__PURE__*/function () {
|
|
|
304
320
|
// in that the reversion probability is lower
|
|
305
321
|
var performAggregatedSlippageCheck = this.trade.tradeType === TradeType.EXACT_INPUT && this.trade.routes.length > 2;
|
|
306
322
|
var outputIsNative = this.trade.outputAmount.currency.isNative;
|
|
307
|
-
var inputIsNative = this.trade.inputAmount.currency.isNative;
|
|
308
323
|
var routerMustCustody = performAggregatedSlippageCheck || outputIsNative || hasFeeOption(this.options);
|
|
309
324
|
for (var _iterator = _createForOfIteratorHelperLoose(this.trade.swaps), _step; !(_step = _iterator()).done;) {
|
|
310
325
|
var swap = _step.value;
|
|
311
326
|
switch (swap.route.protocol) {
|
|
312
327
|
case Protocol.V2:
|
|
313
|
-
addV2Swap(planner, swap, this.trade.tradeType, this.options, payerIsUser, routerMustCustody);
|
|
328
|
+
addV2Swap(planner, swap, this.trade.tradeType, this.options, this.payerIsUser, routerMustCustody);
|
|
314
329
|
break;
|
|
315
330
|
case Protocol.V3:
|
|
316
|
-
addV3Swap(planner, swap, this.trade.tradeType, this.options, payerIsUser, routerMustCustody);
|
|
331
|
+
addV3Swap(planner, swap, this.trade.tradeType, this.options, this.payerIsUser, routerMustCustody);
|
|
317
332
|
break;
|
|
318
333
|
case Protocol.MIXED:
|
|
319
|
-
addMixedSwap(planner, swap, this.trade.tradeType, this.options, payerIsUser, routerMustCustody);
|
|
334
|
+
addMixedSwap(planner, swap, this.trade.tradeType, this.options, this.payerIsUser, routerMustCustody);
|
|
320
335
|
break;
|
|
321
336
|
default:
|
|
322
337
|
throw new Error('UNSUPPORTED_TRADE_PROTOCOL');
|
|
@@ -356,13 +371,19 @@ var UniswapTrade = /*#__PURE__*/function () {
|
|
|
356
371
|
planner.addCommand(CommandType.SWEEP, [this.trade.outputAmount.currency.wrapped.address, this.options.recipient, minimumAmountOut]);
|
|
357
372
|
}
|
|
358
373
|
}
|
|
359
|
-
if (
|
|
374
|
+
if (this.inputRequiresWrap && (this.trade.tradeType === TradeType.EXACT_OUTPUT || riskOfPartialFill(this.trade))) {
|
|
360
375
|
// for exactOutput swaps that take native currency as input
|
|
361
376
|
// we need to send back the change to the user
|
|
362
377
|
planner.addCommand(CommandType.UNWRAP_WETH, [this.options.recipient, 0]);
|
|
363
378
|
}
|
|
364
379
|
if (this.options.safeMode) planner.addCommand(CommandType.SWEEP, [ETH_ADDRESS, this.options.recipient, 0]);
|
|
365
380
|
};
|
|
381
|
+
_createClass(UniswapTrade, [{
|
|
382
|
+
key: "inputRequiresWrap",
|
|
383
|
+
get: function get() {
|
|
384
|
+
return this.trade.inputAmount.currency.isNative;
|
|
385
|
+
}
|
|
386
|
+
}]);
|
|
366
387
|
return UniswapTrade;
|
|
367
388
|
}();
|
|
368
389
|
// encode a uniswap v2 swap
|
|
@@ -10549,5 +10570,123 @@ var UnwrapWETH = /*#__PURE__*/function () {
|
|
|
10549
10570
|
return UnwrapWETH;
|
|
10550
10571
|
}();
|
|
10551
10572
|
|
|
10552
|
-
|
|
10573
|
+
var PoolType;
|
|
10574
|
+
(function (PoolType) {
|
|
10575
|
+
PoolType["V2Pool"] = "v2-pool";
|
|
10576
|
+
PoolType["V3Pool"] = "v3-pool";
|
|
10577
|
+
})(PoolType || (PoolType = {}));
|
|
10578
|
+
var isNativeCurrency = function isNativeCurrency(address) {
|
|
10579
|
+
return address.toLowerCase() === ETH_ADDRESS.toLowerCase() || address.toLowerCase() === E_ETH_ADDRESS.toLowerCase();
|
|
10580
|
+
};
|
|
10581
|
+
// Helper class to convert routing-specific quote entities to RouterTrade entities
|
|
10582
|
+
// the returned RouterTrade can then be used to build the UniswapTrade entity in this package
|
|
10583
|
+
var RouterTradeAdapter = /*#__PURE__*/function () {
|
|
10584
|
+
function RouterTradeAdapter() {}
|
|
10585
|
+
// Generate a RouterTrade using fields from a classic quote response
|
|
10586
|
+
RouterTradeAdapter.fromClassicQuote = function fromClassicQuote(quote) {
|
|
10587
|
+
var route = quote.route,
|
|
10588
|
+
tokenIn = quote.tokenIn,
|
|
10589
|
+
tokenOut = quote.tokenOut;
|
|
10590
|
+
if (!route) throw new Error('Expected route to be present');
|
|
10591
|
+
if (!route.length) throw new Error('Expected there to be at least one route');
|
|
10592
|
+
if (route.some(function (r) {
|
|
10593
|
+
return !r.length;
|
|
10594
|
+
})) throw new Error('Expected all routes to have at least one pool');
|
|
10595
|
+
var firstRoute = route[0];
|
|
10596
|
+
var tokenInData = firstRoute[0].tokenIn;
|
|
10597
|
+
var tokenOutData = firstRoute[firstRoute.length - 1].tokenOut;
|
|
10598
|
+
if (!tokenInData || !tokenOutData) throw new Error('Expected both tokenIn and tokenOut to be present');
|
|
10599
|
+
if (tokenInData.chainId !== tokenOutData.chainId) throw new Error('Expected tokenIn and tokenOut to be have same chainId');
|
|
10600
|
+
var parsedCurrencyIn = RouterTradeAdapter.toCurrency(isNativeCurrency(tokenIn), tokenInData);
|
|
10601
|
+
var parsedCurrencyOut = RouterTradeAdapter.toCurrency(isNativeCurrency(tokenOut), tokenOutData);
|
|
10602
|
+
var typedRoutes = route.map(function (subRoute) {
|
|
10603
|
+
var rawAmountIn = subRoute[0].amountIn;
|
|
10604
|
+
var rawAmountOut = subRoute[subRoute.length - 1].amountOut;
|
|
10605
|
+
if (!rawAmountIn || !rawAmountOut) {
|
|
10606
|
+
throw new Error('Expected both raw amountIn and raw amountOut to be present');
|
|
10607
|
+
}
|
|
10608
|
+
var inputAmount = CurrencyAmount.fromRawAmount(parsedCurrencyIn, rawAmountIn);
|
|
10609
|
+
var outputAmount = CurrencyAmount.fromRawAmount(parsedCurrencyOut, rawAmountOut);
|
|
10610
|
+
var isOnlyV2 = RouterTradeAdapter.isVersionedRoute(PoolType.V2Pool, subRoute);
|
|
10611
|
+
var isOnlyV3 = RouterTradeAdapter.isVersionedRoute(PoolType.V3Pool, subRoute);
|
|
10612
|
+
return {
|
|
10613
|
+
routev3: isOnlyV3 ? new Route(subRoute.map(RouterTradeAdapter.toPool), parsedCurrencyIn, parsedCurrencyOut) : null,
|
|
10614
|
+
routev2: isOnlyV2 ? new Route$1(subRoute.map(RouterTradeAdapter.toPair), parsedCurrencyIn, parsedCurrencyOut) : null,
|
|
10615
|
+
mixedRoute: !isOnlyV3 && !isOnlyV2 ? new MixedRouteSDK(subRoute.map(RouterTradeAdapter.toPoolOrPair), parsedCurrencyIn, parsedCurrencyOut) : null,
|
|
10616
|
+
inputAmount: inputAmount,
|
|
10617
|
+
outputAmount: outputAmount
|
|
10618
|
+
};
|
|
10619
|
+
});
|
|
10620
|
+
return new Trade$2({
|
|
10621
|
+
v2Routes: typedRoutes.filter(function (route) {
|
|
10622
|
+
return route.routev2;
|
|
10623
|
+
}).map(function (route) {
|
|
10624
|
+
return {
|
|
10625
|
+
routev2: route.routev2,
|
|
10626
|
+
inputAmount: route.inputAmount,
|
|
10627
|
+
outputAmount: route.outputAmount
|
|
10628
|
+
};
|
|
10629
|
+
}),
|
|
10630
|
+
v3Routes: typedRoutes.filter(function (route) {
|
|
10631
|
+
return route.routev3;
|
|
10632
|
+
}).map(function (route) {
|
|
10633
|
+
return {
|
|
10634
|
+
routev3: route.routev3,
|
|
10635
|
+
inputAmount: route.inputAmount,
|
|
10636
|
+
outputAmount: route.outputAmount
|
|
10637
|
+
};
|
|
10638
|
+
}),
|
|
10639
|
+
mixedRoutes: typedRoutes.filter(function (route) {
|
|
10640
|
+
return route.mixedRoute;
|
|
10641
|
+
}).map(function (route) {
|
|
10642
|
+
return {
|
|
10643
|
+
mixedRoute: route.mixedRoute,
|
|
10644
|
+
inputAmount: route.inputAmount,
|
|
10645
|
+
outputAmount: route.outputAmount
|
|
10646
|
+
};
|
|
10647
|
+
}),
|
|
10648
|
+
tradeType: quote.tradeType
|
|
10649
|
+
});
|
|
10650
|
+
};
|
|
10651
|
+
RouterTradeAdapter.toCurrency = function toCurrency(isNative, token) {
|
|
10652
|
+
if (isNative) {
|
|
10653
|
+
return Ether.onChain(token.chainId);
|
|
10654
|
+
}
|
|
10655
|
+
return this.toToken(token);
|
|
10656
|
+
};
|
|
10657
|
+
RouterTradeAdapter.toToken = function toToken(token) {
|
|
10658
|
+
var chainId = token.chainId,
|
|
10659
|
+
address = token.address,
|
|
10660
|
+
decimals = token.decimals,
|
|
10661
|
+
symbol = token.symbol,
|
|
10662
|
+
buyFeeBps = token.buyFeeBps,
|
|
10663
|
+
sellFeeBps = token.sellFeeBps;
|
|
10664
|
+
return new Token(chainId, address, parseInt(decimals.toString()), symbol, /* name */undefined, false, buyFeeBps ? BigNumber.from(buyFeeBps) : undefined, sellFeeBps ? BigNumber.from(sellFeeBps) : undefined);
|
|
10665
|
+
};
|
|
10666
|
+
RouterTradeAdapter.toPool = function toPool(_ref) {
|
|
10667
|
+
var fee = _ref.fee,
|
|
10668
|
+
sqrtRatioX96 = _ref.sqrtRatioX96,
|
|
10669
|
+
liquidity = _ref.liquidity,
|
|
10670
|
+
tickCurrent = _ref.tickCurrent,
|
|
10671
|
+
tokenIn = _ref.tokenIn,
|
|
10672
|
+
tokenOut = _ref.tokenOut;
|
|
10673
|
+
return new Pool(RouterTradeAdapter.toToken(tokenIn), RouterTradeAdapter.toToken(tokenOut), parseInt(fee), sqrtRatioX96, liquidity, parseInt(tickCurrent));
|
|
10674
|
+
};
|
|
10675
|
+
RouterTradeAdapter.isVersionedRoute = function isVersionedRoute(type, route) {
|
|
10676
|
+
return route.every(function (pool) {
|
|
10677
|
+
return pool.type === type;
|
|
10678
|
+
});
|
|
10679
|
+
};
|
|
10680
|
+
return RouterTradeAdapter;
|
|
10681
|
+
}();
|
|
10682
|
+
RouterTradeAdapter.toPoolOrPair = function (pool) {
|
|
10683
|
+
return pool.type === PoolType.V3Pool ? RouterTradeAdapter.toPool(pool) : RouterTradeAdapter.toPair(pool);
|
|
10684
|
+
};
|
|
10685
|
+
RouterTradeAdapter.toPair = function (_ref2) {
|
|
10686
|
+
var reserve0 = _ref2.reserve0,
|
|
10687
|
+
reserve1 = _ref2.reserve1;
|
|
10688
|
+
return new Pair(CurrencyAmount.fromRawAmount(RouterTradeAdapter.toToken(reserve0.token), reserve0.quotient), CurrencyAmount.fromRawAmount(RouterTradeAdapter.toToken(reserve1.token), reserve1.quotient));
|
|
10689
|
+
};
|
|
10690
|
+
|
|
10691
|
+
export { CommandType, CryptopunkTrade, FoundationTrade, LooksRareV2Trade, Market, NFT20Trade, NFTTrade, NFTXTrade, PERMIT2_ADDRESS, PoolType, ROUTER_AS_RECIPIENT, RoutePlanner, RouterTradeAdapter, RouterTradeType, SeaportTrade, SudoswapTrade, SwapRouter, TokenType, UNIVERSAL_ROUTER_ADDRESS, UNIVERSAL_ROUTER_CREATION_BLOCK, UniswapTrade, UnwrapWETH, WETH_ADDRESS, X2Y2Trade, isNativeCurrency };
|
|
10553
10692
|
//# sourceMappingURL=universal-router-sdk.esm.js.map
|