@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
|
@@ -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.
|
|
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 (
|
|
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
|