@uniswap/universal-router-sdk 1.3.0 → 1.3.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/README.md +60 -3
- package/dist/entities/Command.d.ts +6 -0
- package/dist/entities/NFTTrade.d.ts +4 -3
- package/dist/entities/index.d.ts +1 -0
- package/dist/entities/protocols/UnwrapWETH.d.ts +13 -0
- package/dist/entities/protocols/cryptopunk.d.ts +2 -2
- package/dist/entities/protocols/foundation.d.ts +2 -2
- package/dist/entities/protocols/looksRare.d.ts +2 -2
- package/dist/entities/protocols/nft20.d.ts +2 -2
- package/dist/entities/protocols/nftx.d.ts +1 -1
- package/dist/entities/protocols/sudoswap.d.ts +2 -2
- package/dist/entities/protocols/uniswap.d.ts +2 -1
- package/dist/entities/protocols/x2y2.d.ts +2 -2
- package/dist/index.d.ts +1 -1
- package/dist/swapRouter.d.ts +7 -1
- package/dist/test/forge/writeInterop.d.ts +1 -0
- package/dist/test/orders/looksRare.d.ts +12 -0
- package/dist/test/orders/seaport.d.ts +4 -0
- package/dist/test/orders/x2y2.d.ts +6 -0
- package/dist/test/utils/addresses.d.ts +2 -0
- package/dist/test/utils/hexToDecimalString.d.ts +2 -0
- package/dist/test/utils/permit2.d.ts +6 -0
- package/dist/test/utils/uniswapData.d.ts +24 -0
- package/dist/universal-router-sdk.cjs.development.js +133 -18
- 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 +133 -19
- package/dist/universal-router-sdk.esm.js.map +1 -1
- package/dist/utils/constants.d.ts +3 -2
- package/package.json +5 -6
|
@@ -59,6 +59,12 @@ function _createForOfIteratorHelperLoose(o, allowArrayLike) {
|
|
|
59
59
|
throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
|
|
60
60
|
}
|
|
61
61
|
|
|
62
|
+
(function (RouterTradeType) {
|
|
63
|
+
RouterTradeType["UniswapTrade"] = "UniswapTrade";
|
|
64
|
+
RouterTradeType["NFTTrade"] = "NFTTrade";
|
|
65
|
+
RouterTradeType["UnwrapWETH"] = "UnwrapWETH";
|
|
66
|
+
})(exports.RouterTradeType || (exports.RouterTradeType = {}));
|
|
67
|
+
|
|
62
68
|
var _ABI_DEFINITION;
|
|
63
69
|
/**
|
|
64
70
|
* CommandTypes
|
|
@@ -132,7 +138,7 @@ function createCommand(type, parameters) {
|
|
|
132
138
|
var UNIVERSAL_ROUTER_ADDRESS = function UNIVERSAL_ROUTER_ADDRESS(chainId) {
|
|
133
139
|
switch (chainId) {
|
|
134
140
|
case 1:
|
|
135
|
-
//mainnet
|
|
141
|
+
// mainnet
|
|
136
142
|
return '0xEf1c6E67703c7BD7107eed8303Fbe6EC2554BF6B';
|
|
137
143
|
case 5:
|
|
138
144
|
// goerli
|
|
@@ -159,11 +165,38 @@ var UNIVERSAL_ROUTER_ADDRESS = function UNIVERSAL_ROUTER_ADDRESS(chainId) {
|
|
|
159
165
|
throw new Error("Universal Router not deployed on chain " + chainId);
|
|
160
166
|
}
|
|
161
167
|
};
|
|
168
|
+
var WETH_ADDRESS = function WETH_ADDRESS(chainId) {
|
|
169
|
+
switch (chainId) {
|
|
170
|
+
case 1:
|
|
171
|
+
//mainnet
|
|
172
|
+
return '0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2';
|
|
173
|
+
case 5:
|
|
174
|
+
// goerli
|
|
175
|
+
return '0xb4fbf271143f4fbf7b91a5ded31805e42b2208d6';
|
|
176
|
+
case 137:
|
|
177
|
+
// polygon
|
|
178
|
+
return '0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270';
|
|
179
|
+
case 10:
|
|
180
|
+
// optimism
|
|
181
|
+
return '0x4200000000000000000000000000000000000006';
|
|
182
|
+
case 42161:
|
|
183
|
+
// arbitrum
|
|
184
|
+
return '0x82aF49447D8a07e3bd95BD0d56f35241523fBab1';
|
|
185
|
+
case 420:
|
|
186
|
+
// optimism goerli
|
|
187
|
+
return '0x4200000000000000000000000000000000000006';
|
|
188
|
+
case 421613:
|
|
189
|
+
// arbitrum goerli
|
|
190
|
+
return '0xe39Ab88f8A4777030A534146A9Ca3B52bd5D43A3';
|
|
191
|
+
default:
|
|
192
|
+
throw new Error("WETH9 or UniversalRouter not deployed on chain " + chainId);
|
|
193
|
+
}
|
|
194
|
+
};
|
|
162
195
|
var PERMIT2_ADDRESS = '0x000000000022D473030F116dDEE9F6B43aC78BA3';
|
|
163
196
|
var CONTRACT_BALANCE = /*#__PURE__*/ethers.BigNumber.from(2).pow(255);
|
|
164
197
|
var ETH_ADDRESS = '0x0000000000000000000000000000000000000000';
|
|
165
|
-
var
|
|
166
|
-
var
|
|
198
|
+
var SENDER_AS_RECIPIENT = '0x0000000000000000000000000000000000000001';
|
|
199
|
+
var ROUTER_AS_RECIPIENT = '0x0000000000000000000000000000000000000002';
|
|
167
200
|
|
|
168
201
|
var REFUND_ETH_PRICE_IMPACT_THRESHOLD = /*#__PURE__*/new sdkCore.Percent( /*#__PURE__*/JSBI.BigInt(50), /*#__PURE__*/JSBI.BigInt(100));
|
|
169
202
|
// Wrapper for uniswap router-sdk trade entity to encode swaps for Universal Router
|
|
@@ -172,6 +205,7 @@ var UniswapTrade = /*#__PURE__*/function () {
|
|
|
172
205
|
function UniswapTrade(trade, options) {
|
|
173
206
|
this.trade = trade;
|
|
174
207
|
this.options = options;
|
|
208
|
+
this.tradeType = exports.RouterTradeType.UniswapTrade;
|
|
175
209
|
}
|
|
176
210
|
var _proto = UniswapTrade.prototype;
|
|
177
211
|
_proto.encode = function encode(planner, _config) {
|
|
@@ -179,11 +213,11 @@ var UniswapTrade = /*#__PURE__*/function () {
|
|
|
179
213
|
var payerIsUser = true;
|
|
180
214
|
if (this.trade.inputAmount.currency.isNative) {
|
|
181
215
|
// TODO: optimize if only one v2 pool we can directly send this to the pool
|
|
182
|
-
planner.addCommand(CommandType.WRAP_ETH, [
|
|
216
|
+
planner.addCommand(CommandType.WRAP_ETH, [ROUTER_AS_RECIPIENT, this.trade.maximumAmountIn(this.options.slippageTolerance).quotient.toString()]);
|
|
183
217
|
// since WETH is now owned by the router, the router pays for inputs
|
|
184
218
|
payerIsUser = false;
|
|
185
219
|
}
|
|
186
|
-
this.options.recipient = (_this$options$recipie = this.options.recipient) != null ? _this$options$recipie :
|
|
220
|
+
this.options.recipient = (_this$options$recipie = this.options.recipient) != null ? _this$options$recipie : SENDER_AS_RECIPIENT;
|
|
187
221
|
// flag for whether we want to perform slippage check on aggregate output of multiple routes
|
|
188
222
|
// 1. when there are >2 exact input trades. this is only a heuristic,
|
|
189
223
|
// as it's still more gas-expensive even in this case, but has benefits
|
|
@@ -232,11 +266,11 @@ function addV2Swap(planner, _ref, tradeType, options, payerIsUser, routerMustCus
|
|
|
232
266
|
if (tradeType == sdkCore.TradeType.EXACT_INPUT) {
|
|
233
267
|
planner.addCommand(CommandType.V2_SWAP_EXACT_IN, [
|
|
234
268
|
// if native, we have to unwrap so keep in the router for now
|
|
235
|
-
routerMustCustody ?
|
|
269
|
+
routerMustCustody ? ROUTER_AS_RECIPIENT : options.recipient, trade.maximumAmountIn(options.slippageTolerance).quotient.toString(), trade.minimumAmountOut(options.slippageTolerance).quotient.toString(), route.path.map(function (pool) {
|
|
236
270
|
return pool.address;
|
|
237
271
|
}), payerIsUser]);
|
|
238
272
|
} else if (tradeType == sdkCore.TradeType.EXACT_OUTPUT) {
|
|
239
|
-
planner.addCommand(CommandType.V2_SWAP_EXACT_OUT, [routerMustCustody ?
|
|
273
|
+
planner.addCommand(CommandType.V2_SWAP_EXACT_OUT, [routerMustCustody ? ROUTER_AS_RECIPIENT : options.recipient, trade.minimumAmountOut(options.slippageTolerance).quotient.toString(), trade.maximumAmountIn(options.slippageTolerance).quotient.toString(), route.path.map(function (pool) {
|
|
240
274
|
return pool.address;
|
|
241
275
|
}), payerIsUser]);
|
|
242
276
|
}
|
|
@@ -254,9 +288,9 @@ function addV3Swap(planner, _ref2, tradeType, options, payerIsUser, routerMustCu
|
|
|
254
288
|
});
|
|
255
289
|
var path = v3Sdk.encodeRouteToPath(route, trade.tradeType === sdkCore.TradeType.EXACT_OUTPUT);
|
|
256
290
|
if (tradeType == sdkCore.TradeType.EXACT_INPUT) {
|
|
257
|
-
planner.addCommand(CommandType.V3_SWAP_EXACT_IN, [routerMustCustody ?
|
|
291
|
+
planner.addCommand(CommandType.V3_SWAP_EXACT_IN, [routerMustCustody ? ROUTER_AS_RECIPIENT : options.recipient, trade.maximumAmountIn(options.slippageTolerance).quotient.toString(), trade.minimumAmountOut(options.slippageTolerance).quotient.toString(), path, payerIsUser]);
|
|
258
292
|
} else if (tradeType == sdkCore.TradeType.EXACT_OUTPUT) {
|
|
259
|
-
planner.addCommand(CommandType.V3_SWAP_EXACT_OUT, [routerMustCustody ?
|
|
293
|
+
planner.addCommand(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]);
|
|
260
294
|
}
|
|
261
295
|
}
|
|
262
296
|
// encode a mixed route swap, i.e. including both v2 and v3 pools
|
|
@@ -264,7 +298,7 @@ function addMixedSwap(planner, swap, tradeType, options, payerIsUser, routerMust
|
|
|
264
298
|
var route = swap.route,
|
|
265
299
|
inputAmount = swap.inputAmount,
|
|
266
300
|
outputAmount = swap.outputAmount;
|
|
267
|
-
var tradeRecipient = routerMustCustody ?
|
|
301
|
+
var tradeRecipient = routerMustCustody ? ROUTER_AS_RECIPIENT : options.recipient;
|
|
268
302
|
// single hop, so it can be reduced to plain v2 or v3 swap logic
|
|
269
303
|
if (route.pools.length === 1) {
|
|
270
304
|
if (route.pools[0] instanceof v3Sdk.Pool) {
|
|
@@ -311,7 +345,7 @@ function addMixedSwap(planner, swap, tradeType, options, payerIsUser, routerMust
|
|
|
311
345
|
// note: because of the partitioning function we can be sure that the next section is v2
|
|
312
346
|
isLastSectionInRoute(i) ? tradeRecipient : sections[i + 1][0].liquidityToken.address, i == 0 ? amountIn : CONTRACT_BALANCE, !isLastSectionInRoute(i) ? 0 : amountOut, path, payerIsUser && i === 0]);
|
|
313
347
|
} else {
|
|
314
|
-
planner.addCommand(CommandType.V2_SWAP_EXACT_IN, [isLastSectionInRoute(i) ? tradeRecipient :
|
|
348
|
+
planner.addCommand(CommandType.V2_SWAP_EXACT_IN, [isLastSectionInRoute(i) ? tradeRecipient : ROUTER_AS_RECIPIENT, i === 0 ? amountIn : CONTRACT_BALANCE, !isLastSectionInRoute(i) ? 0 : amountOut, newRoute.path.map(function (pool) {
|
|
315
349
|
return pool.address;
|
|
316
350
|
}), payerIsUser && i === 0]);
|
|
317
351
|
}
|
|
@@ -328,32 +362,110 @@ function encodePermit(planner, permit) {
|
|
|
328
362
|
|
|
329
363
|
var SwapRouter = /*#__PURE__*/function () {
|
|
330
364
|
function SwapRouter() {}
|
|
365
|
+
SwapRouter.swapCallParameters = function swapCallParameters(trades, config) {
|
|
366
|
+
if (config === void 0) {
|
|
367
|
+
config = {};
|
|
368
|
+
}
|
|
369
|
+
if (!Array.isArray(trades)) trades = [trades];
|
|
370
|
+
var nftTrades = trades.filter(function (trade, _, _ref) {
|
|
371
|
+
return trade.hasOwnProperty('market');
|
|
372
|
+
});
|
|
373
|
+
var allowRevert = nftTrades.length == 1 && nftTrades[0].orders.length == 1 ? false : true;
|
|
374
|
+
var planner = new RoutePlanner();
|
|
375
|
+
// track value flow to require the right amount of native value
|
|
376
|
+
var currentNativeValueInRouter = ethers.BigNumber.from(0);
|
|
377
|
+
var transactionValue = ethers.BigNumber.from(0);
|
|
378
|
+
for (var _iterator = _createForOfIteratorHelperLoose(trades), _step; !(_step = _iterator()).done;) {
|
|
379
|
+
var trade = _step.value;
|
|
380
|
+
/**
|
|
381
|
+
* is NFTTrade
|
|
382
|
+
*/
|
|
383
|
+
if (trade.tradeType == exports.RouterTradeType.NFTTrade) {
|
|
384
|
+
var nftTrade = trade;
|
|
385
|
+
nftTrade.encode(planner, {
|
|
386
|
+
allowRevert: allowRevert
|
|
387
|
+
});
|
|
388
|
+
var tradePrice = nftTrade.getTotalPrice();
|
|
389
|
+
// send enough native value to contract for NFT purchase
|
|
390
|
+
if (currentNativeValueInRouter.lt(tradePrice)) {
|
|
391
|
+
transactionValue = transactionValue.add(tradePrice.sub(currentNativeValueInRouter));
|
|
392
|
+
currentNativeValueInRouter = ethers.BigNumber.from(0);
|
|
393
|
+
} else {
|
|
394
|
+
currentNativeValueInRouter = currentNativeValueInRouter.sub(tradePrice);
|
|
395
|
+
}
|
|
396
|
+
/**
|
|
397
|
+
* is Uniswap Trade
|
|
398
|
+
*/
|
|
399
|
+
} else if (trade.tradeType == exports.RouterTradeType.UniswapTrade) {
|
|
400
|
+
var uniswapTrade = trade;
|
|
401
|
+
var inputIsNative = uniswapTrade.trade.inputAmount.currency.isNative;
|
|
402
|
+
var outputIsNative = uniswapTrade.trade.outputAmount.currency.isNative;
|
|
403
|
+
var swapOptions = uniswapTrade.options;
|
|
404
|
+
!!(inputIsNative && !!swapOptions.inputTokenPermit) ? invariant(false, 'NATIVE_INPUT_PERMIT') : void 0;
|
|
405
|
+
if (!!swapOptions.inputTokenPermit) {
|
|
406
|
+
encodePermit(planner, swapOptions.inputTokenPermit);
|
|
407
|
+
}
|
|
408
|
+
if (inputIsNative) {
|
|
409
|
+
transactionValue = transactionValue.add(ethers.BigNumber.from(uniswapTrade.trade.maximumAmountIn(swapOptions.slippageTolerance).quotient.toString()));
|
|
410
|
+
}
|
|
411
|
+
// track amount of native currency in the router
|
|
412
|
+
if (outputIsNative && swapOptions.recipient == ROUTER_AS_RECIPIENT) {
|
|
413
|
+
currentNativeValueInRouter = currentNativeValueInRouter.add(ethers.BigNumber.from(uniswapTrade.trade.minimumAmountOut(swapOptions.slippageTolerance).quotient.toString()));
|
|
414
|
+
}
|
|
415
|
+
uniswapTrade.encode(planner, {
|
|
416
|
+
allowRevert: false
|
|
417
|
+
});
|
|
418
|
+
/**
|
|
419
|
+
* is UnwrapWETH
|
|
420
|
+
*/
|
|
421
|
+
} else if (trade.tradeType == exports.RouterTradeType.UnwrapWETH) {
|
|
422
|
+
var UnwrapWETH = trade;
|
|
423
|
+
trade.encode(planner, {
|
|
424
|
+
allowRevert: false
|
|
425
|
+
});
|
|
426
|
+
currentNativeValueInRouter = currentNativeValueInRouter.add(UnwrapWETH.amount);
|
|
427
|
+
/**
|
|
428
|
+
* else
|
|
429
|
+
*/
|
|
430
|
+
} else {
|
|
431
|
+
throw 'trade must be of instance: UniswapTrade or NFTTrade';
|
|
432
|
+
}
|
|
433
|
+
}
|
|
434
|
+
// TODO: matches current logic for now, but should eventually only sweep for multiple NFT trades
|
|
435
|
+
// or NFT trades with potential slippage (i.e. sudo)
|
|
436
|
+
if (nftTrades.length > 0) planner.addCommand(CommandType.SWEEP, [ETH_ADDRESS, SENDER_AS_RECIPIENT, 0]);
|
|
437
|
+
return SwapRouter.encodePlan(planner, transactionValue, config);
|
|
438
|
+
}
|
|
331
439
|
/**
|
|
440
|
+
* @deprecated in favor of swapCallParameters. Update before next major version 2.0.0
|
|
332
441
|
* Produces the on-chain method name to call and the hex encoded parameters to pass as arguments for a given swap.
|
|
333
442
|
* @param trades to produce call parameters for
|
|
334
|
-
|
|
443
|
+
*/;
|
|
335
444
|
SwapRouter.swapNFTCallParameters = function swapNFTCallParameters(trades, config) {
|
|
336
|
-
|
|
445
|
+
if (config === void 0) {
|
|
446
|
+
config = {};
|
|
447
|
+
}
|
|
337
448
|
var planner = new RoutePlanner();
|
|
338
449
|
var totalPrice = ethers.BigNumber.from(0);
|
|
339
450
|
var allowRevert = trades.length == 1 && trades[0].orders.length == 1 ? false : true;
|
|
340
|
-
for (var
|
|
341
|
-
var trade =
|
|
451
|
+
for (var _iterator2 = _createForOfIteratorHelperLoose(trades), _step2; !(_step2 = _iterator2()).done;) {
|
|
452
|
+
var trade = _step2.value;
|
|
342
453
|
trade.encode(planner, {
|
|
343
454
|
allowRevert: allowRevert
|
|
344
455
|
});
|
|
345
456
|
totalPrice = totalPrice.add(trade.getTotalPrice());
|
|
346
457
|
}
|
|
347
|
-
planner.addCommand(CommandType.SWEEP, [ETH_ADDRESS,
|
|
458
|
+
planner.addCommand(CommandType.SWEEP, [ETH_ADDRESS, SENDER_AS_RECIPIENT, 0]);
|
|
348
459
|
return SwapRouter.encodePlan(planner, totalPrice, config);
|
|
349
460
|
}
|
|
350
461
|
/**
|
|
462
|
+
* @deprecated in favor of swapCallParameters. Update before next major version 2.0.0
|
|
351
463
|
* Produces the on-chain method name to call and the hex encoded parameters to pass as arguments for a given trade.
|
|
352
464
|
* @param trades to produce call parameters for
|
|
353
465
|
* @param options options for the call parameters
|
|
354
466
|
*/;
|
|
355
467
|
SwapRouter.swapERC20CallParameters = function swapERC20CallParameters(trades, options) {
|
|
356
|
-
// TODO: use permit if signature included in
|
|
468
|
+
// TODO: use permit if signature included in swapOptions
|
|
357
469
|
var planner = new RoutePlanner();
|
|
358
470
|
var trade = new UniswapTrade(trades, options);
|
|
359
471
|
var inputCurrency = trade.trade.inputAmount.currency;
|
|
@@ -386,7 +498,7 @@ var SwapRouter = /*#__PURE__*/function () {
|
|
|
386
498
|
var calldata = SwapRouter.INTERFACE.encodeFunctionData(functionSignature, parameters);
|
|
387
499
|
return {
|
|
388
500
|
calldata: calldata,
|
|
389
|
-
value: nativeCurrencyValue.
|
|
501
|
+
value: nativeCurrencyValue.toHexString()
|
|
390
502
|
};
|
|
391
503
|
};
|
|
392
504
|
return SwapRouter;
|
|
@@ -394,6 +506,7 @@ var SwapRouter = /*#__PURE__*/function () {
|
|
|
394
506
|
SwapRouter.INTERFACE = /*#__PURE__*/new abi$7.Interface(UniversalRouter_json.abi);
|
|
395
507
|
|
|
396
508
|
var NFTTrade = function NFTTrade(market, orders) {
|
|
509
|
+
this.tradeType = exports.RouterTradeType.NFTTrade;
|
|
397
510
|
!(orders.length > 0) ? invariant(false, 'no buy Items') : void 0;
|
|
398
511
|
this.market = market;
|
|
399
512
|
this.orders = orders;
|
|
@@ -9287,10 +9400,12 @@ exports.NFT20Trade = NFT20Trade;
|
|
|
9287
9400
|
exports.NFTTrade = NFTTrade;
|
|
9288
9401
|
exports.NFTXTrade = NFTXTrade;
|
|
9289
9402
|
exports.PERMIT2_ADDRESS = PERMIT2_ADDRESS;
|
|
9403
|
+
exports.ROUTER_AS_RECIPIENT = ROUTER_AS_RECIPIENT;
|
|
9290
9404
|
exports.SeaportTrade = SeaportTrade;
|
|
9291
9405
|
exports.SudoswapTrade = SudoswapTrade;
|
|
9292
9406
|
exports.SwapRouter = SwapRouter;
|
|
9293
9407
|
exports.UNIVERSAL_ROUTER_ADDRESS = UNIVERSAL_ROUTER_ADDRESS;
|
|
9294
9408
|
exports.UniswapTrade = UniswapTrade;
|
|
9409
|
+
exports.WETH_ADDRESS = WETH_ADDRESS;
|
|
9295
9410
|
exports.X2Y2Trade = X2Y2Trade;
|
|
9296
9411
|
//# sourceMappingURL=universal-router-sdk.cjs.development.js.map
|