@sebtoday/u-exchange-sdk 1.0.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (38) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +56 -0
  3. package/dist/constants.d.ts +44 -0
  4. package/dist/entities/currency.d.ts +24 -0
  5. package/dist/entities/fractions/currencyAmount.d.ts +19 -0
  6. package/dist/entities/fractions/fraction.d.ts +19 -0
  7. package/dist/entities/fractions/index.d.ts +5 -0
  8. package/dist/entities/fractions/percent.d.ts +6 -0
  9. package/dist/entities/fractions/price.d.ts +19 -0
  10. package/dist/entities/fractions/tokenAmount.d.ts +9 -0
  11. package/dist/entities/index.d.ts +6 -0
  12. package/dist/entities/pair.d.ts +41 -0
  13. package/dist/entities/route.d.ts +14 -0
  14. package/dist/entities/token.d.ts +39 -0
  15. package/dist/entities/trade.d.ts +106 -0
  16. package/dist/errors.d.ts +16 -0
  17. package/dist/fetcher.d.ts +28 -0
  18. package/dist/index.d.ts +7 -0
  19. package/dist/index.js +8 -0
  20. package/dist/router.d.ts +63 -0
  21. package/dist/test/constants.test.d.ts +1 -0
  22. package/dist/test/data.test.d.ts +1 -0
  23. package/dist/test/entities.test.d.ts +1 -0
  24. package/dist/test/fraction.test.d.ts +1 -0
  25. package/dist/test/miscellaneous.test.d.ts +1 -0
  26. package/dist/test/pair.test.d.ts +1 -0
  27. package/dist/test/route.test.d.ts +1 -0
  28. package/dist/test/router.test.d.ts +1 -0
  29. package/dist/test/token.test.d.ts +1 -0
  30. package/dist/test/trade.test.d.ts +1 -0
  31. package/dist/u-exchange-sdk.cjs.development.js +1630 -0
  32. package/dist/u-exchange-sdk.cjs.development.js.map +1 -0
  33. package/dist/u-exchange-sdk.cjs.production.min.js +2 -0
  34. package/dist/u-exchange-sdk.cjs.production.min.js.map +1 -0
  35. package/dist/u-exchange-sdk.esm.js +1608 -0
  36. package/dist/u-exchange-sdk.esm.js.map +1 -0
  37. package/dist/utils.d.ts +7 -0
  38. package/package.json +70 -0
@@ -0,0 +1,1630 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; }
6
+
7
+ var JSBI = _interopDefault(require('jsbi'));
8
+ var invariant = _interopDefault(require('tiny-invariant'));
9
+ var warning = _interopDefault(require('tiny-warning'));
10
+ var address = require('@ethersproject/address');
11
+ var _Big = _interopDefault(require('big.js'));
12
+ var toFormat = _interopDefault(require('toformat'));
13
+ var _Decimal = _interopDefault(require('decimal.js-light'));
14
+ var solidity = require('@ethersproject/solidity');
15
+ var contracts = require('@ethersproject/contracts');
16
+ var networks = require('@ethersproject/networks');
17
+ var providers = require('@ethersproject/providers');
18
+ var IUniswapV2Pair = _interopDefault(require('@uniswap/v2-core/build/IUniswapV2Pair.json'));
19
+
20
+ var _SOLIDITY_TYPE_MAXIMA;
21
+
22
+ (function (ChainId) {
23
+ ChainId[ChainId["MAINNET"] = 1] = "MAINNET";
24
+ ChainId[ChainId["ROPSTEN"] = 3] = "ROPSTEN";
25
+ ChainId[ChainId["RINKEBY"] = 4] = "RINKEBY";
26
+ ChainId[ChainId["G\xD6RLI"] = 5] = "G\xD6RLI";
27
+ ChainId[ChainId["RSK"] = 30] = "RSK";
28
+ ChainId[ChainId["RSKTEST"] = 31] = "RSKTEST";
29
+ ChainId[ChainId["KOVAN"] = 42] = "KOVAN";
30
+ ChainId[ChainId["BINANCE"] = 56] = "BINANCE";
31
+ ChainId[ChainId["BINANCETEST"] = 97] = "BINANCETEST";
32
+ ChainId[ChainId["XDAI"] = 100] = "XDAI";
33
+ ChainId[ChainId["POLYGON"] = 137] = "POLYGON";
34
+ })(exports.ChainId || (exports.ChainId = {}));
35
+
36
+ (function (TradeType) {
37
+ TradeType[TradeType["EXACT_INPUT"] = 0] = "EXACT_INPUT";
38
+ TradeType[TradeType["EXACT_OUTPUT"] = 1] = "EXACT_OUTPUT";
39
+ })(exports.TradeType || (exports.TradeType = {}));
40
+
41
+ (function (Rounding) {
42
+ Rounding[Rounding["ROUND_DOWN"] = 0] = "ROUND_DOWN";
43
+ Rounding[Rounding["ROUND_HALF_UP"] = 1] = "ROUND_HALF_UP";
44
+ Rounding[Rounding["ROUND_UP"] = 2] = "ROUND_UP";
45
+ })(exports.Rounding || (exports.Rounding = {}));
46
+
47
+ var FACTORY_ADDRESS = '0x063af7b01B067eE135344FEf85d6Aecea14CFA05';
48
+ var INIT_CODE_HASH = '0x6c0dd0b3d906c70e40fd9e96936f31ff1b70fe5784bae36fcbab40725d974a67';
49
+ var MINIMUM_LIQUIDITY = /*#__PURE__*/JSBI.BigInt(1000); // exports for internal consumption
50
+
51
+ var ZERO = /*#__PURE__*/JSBI.BigInt(0);
52
+ var ONE = /*#__PURE__*/JSBI.BigInt(1);
53
+ var TWO = /*#__PURE__*/JSBI.BigInt(2);
54
+ var THREE = /*#__PURE__*/JSBI.BigInt(3);
55
+ var FIVE = /*#__PURE__*/JSBI.BigInt(5);
56
+ var TEN = /*#__PURE__*/JSBI.BigInt(10);
57
+ var _100 = /*#__PURE__*/JSBI.BigInt(100);
58
+ var _997 = /*#__PURE__*/JSBI.BigInt(997);
59
+ var _1000 = /*#__PURE__*/JSBI.BigInt(1000);
60
+ var SolidityType;
61
+
62
+ (function (SolidityType) {
63
+ SolidityType["uint8"] = "uint8";
64
+ SolidityType["uint256"] = "uint256";
65
+ })(SolidityType || (SolidityType = {}));
66
+
67
+ var SOLIDITY_TYPE_MAXIMA = (_SOLIDITY_TYPE_MAXIMA = {}, _SOLIDITY_TYPE_MAXIMA[SolidityType.uint8] = /*#__PURE__*/JSBI.BigInt('0xff'), _SOLIDITY_TYPE_MAXIMA[SolidityType.uint256] = /*#__PURE__*/JSBI.BigInt('0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff'), _SOLIDITY_TYPE_MAXIMA);
68
+
69
+ function _defineProperties(target, props) {
70
+ for (var i = 0; i < props.length; i++) {
71
+ var descriptor = props[i];
72
+ descriptor.enumerable = descriptor.enumerable || false;
73
+ descriptor.configurable = true;
74
+ if ("value" in descriptor) descriptor.writable = true;
75
+ Object.defineProperty(target, descriptor.key, descriptor);
76
+ }
77
+ }
78
+
79
+ function _createClass(Constructor, protoProps, staticProps) {
80
+ if (protoProps) _defineProperties(Constructor.prototype, protoProps);
81
+ if (staticProps) _defineProperties(Constructor, staticProps);
82
+ return Constructor;
83
+ }
84
+
85
+ function _extends() {
86
+ _extends = Object.assign || function (target) {
87
+ for (var i = 1; i < arguments.length; i++) {
88
+ var source = arguments[i];
89
+
90
+ for (var key in source) {
91
+ if (Object.prototype.hasOwnProperty.call(source, key)) {
92
+ target[key] = source[key];
93
+ }
94
+ }
95
+ }
96
+
97
+ return target;
98
+ };
99
+
100
+ return _extends.apply(this, arguments);
101
+ }
102
+
103
+ function _inheritsLoose(subClass, superClass) {
104
+ subClass.prototype = Object.create(superClass.prototype);
105
+ subClass.prototype.constructor = subClass;
106
+
107
+ _setPrototypeOf(subClass, superClass);
108
+ }
109
+
110
+ function _getPrototypeOf(o) {
111
+ _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) {
112
+ return o.__proto__ || Object.getPrototypeOf(o);
113
+ };
114
+ return _getPrototypeOf(o);
115
+ }
116
+
117
+ function _setPrototypeOf(o, p) {
118
+ _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {
119
+ o.__proto__ = p;
120
+ return o;
121
+ };
122
+
123
+ return _setPrototypeOf(o, p);
124
+ }
125
+
126
+ function _isNativeReflectConstruct() {
127
+ if (typeof Reflect === "undefined" || !Reflect.construct) return false;
128
+ if (Reflect.construct.sham) return false;
129
+ if (typeof Proxy === "function") return true;
130
+
131
+ try {
132
+ Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {}));
133
+ return true;
134
+ } catch (e) {
135
+ return false;
136
+ }
137
+ }
138
+
139
+ function _construct(Parent, args, Class) {
140
+ if (_isNativeReflectConstruct()) {
141
+ _construct = Reflect.construct;
142
+ } else {
143
+ _construct = function _construct(Parent, args, Class) {
144
+ var a = [null];
145
+ a.push.apply(a, args);
146
+ var Constructor = Function.bind.apply(Parent, a);
147
+ var instance = new Constructor();
148
+ if (Class) _setPrototypeOf(instance, Class.prototype);
149
+ return instance;
150
+ };
151
+ }
152
+
153
+ return _construct.apply(null, arguments);
154
+ }
155
+
156
+ function _isNativeFunction(fn) {
157
+ return Function.toString.call(fn).indexOf("[native code]") !== -1;
158
+ }
159
+
160
+ function _wrapNativeSuper(Class) {
161
+ var _cache = typeof Map === "function" ? new Map() : undefined;
162
+
163
+ _wrapNativeSuper = function _wrapNativeSuper(Class) {
164
+ if (Class === null || !_isNativeFunction(Class)) return Class;
165
+
166
+ if (typeof Class !== "function") {
167
+ throw new TypeError("Super expression must either be null or a function");
168
+ }
169
+
170
+ if (typeof _cache !== "undefined") {
171
+ if (_cache.has(Class)) return _cache.get(Class);
172
+
173
+ _cache.set(Class, Wrapper);
174
+ }
175
+
176
+ function Wrapper() {
177
+ return _construct(Class, arguments, _getPrototypeOf(this).constructor);
178
+ }
179
+
180
+ Wrapper.prototype = Object.create(Class.prototype, {
181
+ constructor: {
182
+ value: Wrapper,
183
+ enumerable: false,
184
+ writable: true,
185
+ configurable: true
186
+ }
187
+ });
188
+ return _setPrototypeOf(Wrapper, Class);
189
+ };
190
+
191
+ return _wrapNativeSuper(Class);
192
+ }
193
+
194
+ function _assertThisInitialized(self) {
195
+ if (self === void 0) {
196
+ throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
197
+ }
198
+
199
+ return self;
200
+ }
201
+
202
+ function _unsupportedIterableToArray(o, minLen) {
203
+ if (!o) return;
204
+ if (typeof o === "string") return _arrayLikeToArray(o, minLen);
205
+ var n = Object.prototype.toString.call(o).slice(8, -1);
206
+ if (n === "Object" && o.constructor) n = o.constructor.name;
207
+ if (n === "Map" || n === "Set") return Array.from(o);
208
+ if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);
209
+ }
210
+
211
+ function _arrayLikeToArray(arr, len) {
212
+ if (len == null || len > arr.length) len = arr.length;
213
+
214
+ for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];
215
+
216
+ return arr2;
217
+ }
218
+
219
+ function _createForOfIteratorHelperLoose(o, allowArrayLike) {
220
+ var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"];
221
+ if (it) return (it = it.call(o)).next.bind(it);
222
+
223
+ if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") {
224
+ if (it) o = it;
225
+ var i = 0;
226
+ return function () {
227
+ if (i >= o.length) return {
228
+ done: true
229
+ };
230
+ return {
231
+ done: false,
232
+ value: o[i++]
233
+ };
234
+ };
235
+ }
236
+
237
+ throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
238
+ }
239
+
240
+ // see https://stackoverflow.com/a/41102306
241
+ var CAN_SET_PROTOTYPE = ('setPrototypeOf' in Object);
242
+ /**
243
+ * Indicates that the pair has insufficient reserves for a desired output amount. I.e. the amount of output cannot be
244
+ * obtained by sending any amount of input.
245
+ */
246
+
247
+ var InsufficientReservesError = /*#__PURE__*/function (_Error) {
248
+ _inheritsLoose(InsufficientReservesError, _Error);
249
+
250
+ function InsufficientReservesError() {
251
+ var _this;
252
+
253
+ _this = _Error.call(this) || this;
254
+ _this.isInsufficientReservesError = true;
255
+ _this.name = _this.constructor.name;
256
+ if (CAN_SET_PROTOTYPE) Object.setPrototypeOf(_assertThisInitialized(_this), (this instanceof InsufficientReservesError ? this.constructor : void 0).prototype);
257
+ return _this;
258
+ }
259
+
260
+ return InsufficientReservesError;
261
+ }( /*#__PURE__*/_wrapNativeSuper(Error));
262
+ /**
263
+ * Indicates that the input amount is too small to produce any amount of output. I.e. the amount of input sent is less
264
+ * than the price of a single unit of output after fees.
265
+ */
266
+
267
+ var InsufficientInputAmountError = /*#__PURE__*/function (_Error2) {
268
+ _inheritsLoose(InsufficientInputAmountError, _Error2);
269
+
270
+ function InsufficientInputAmountError() {
271
+ var _this2;
272
+
273
+ _this2 = _Error2.call(this) || this;
274
+ _this2.isInsufficientInputAmountError = true;
275
+ _this2.name = _this2.constructor.name;
276
+ if (CAN_SET_PROTOTYPE) Object.setPrototypeOf(_assertThisInitialized(_this2), (this instanceof InsufficientInputAmountError ? this.constructor : void 0).prototype);
277
+ return _this2;
278
+ }
279
+
280
+ return InsufficientInputAmountError;
281
+ }( /*#__PURE__*/_wrapNativeSuper(Error));
282
+
283
+ function validateSolidityTypeInstance(value, solidityType) {
284
+ !JSBI.greaterThanOrEqual(value, ZERO) ? invariant(false, value + " is not a " + solidityType + ".") : void 0;
285
+ !JSBI.lessThanOrEqual(value, SOLIDITY_TYPE_MAXIMA[solidityType]) ? invariant(false, value + " is not a " + solidityType + ".") : void 0;
286
+ } // warns if addresses are not checksummed
287
+
288
+ function validateAndParseAddress(address$1) {
289
+ try {
290
+ var checksummedAddress = address.getAddress(address$1);
291
+ "development" !== "production" ? warning(address$1 === checksummedAddress, address$1 + " is not checksummed.") : void 0;
292
+ return checksummedAddress;
293
+ } catch (error) {
294
+ invariant(false, address$1 + " is not a valid address.") ;
295
+ }
296
+ }
297
+ function parseBigintIsh(bigintIsh) {
298
+ return bigintIsh instanceof JSBI ? bigintIsh : typeof bigintIsh === 'bigint' ? JSBI.BigInt(bigintIsh.toString()) : JSBI.BigInt(bigintIsh);
299
+ } // mock the on-chain sqrt function
300
+
301
+ function sqrt(y) {
302
+ validateSolidityTypeInstance(y, SolidityType.uint256);
303
+ var z = ZERO;
304
+ var x;
305
+
306
+ if (JSBI.greaterThan(y, THREE)) {
307
+ z = y;
308
+ x = JSBI.add(JSBI.divide(y, TWO), ONE);
309
+
310
+ while (JSBI.lessThan(x, z)) {
311
+ z = x;
312
+ x = JSBI.divide(JSBI.add(JSBI.divide(y, x), x), TWO);
313
+ }
314
+ } else if (JSBI.notEqual(y, ZERO)) {
315
+ z = ONE;
316
+ }
317
+
318
+ return z;
319
+ } // given an array of items sorted by `comparator`, insert an item into its sort index and constrain the size to
320
+ // `maxSize` by removing the last item
321
+
322
+ function sortedInsert(items, add, maxSize, comparator) {
323
+ !(maxSize > 0) ? invariant(false, 'MAX_SIZE_ZERO') : void 0; // this is an invariant because the interface cannot return multiple removed items if items.length exceeds maxSize
324
+
325
+ !(items.length <= maxSize) ? invariant(false, 'ITEMS_SIZE') : void 0; // short circuit first item add
326
+
327
+ if (items.length === 0) {
328
+ items.push(add);
329
+ return null;
330
+ } else {
331
+ var isFull = items.length === maxSize; // short circuit if full and the additional item does not come before the last item
332
+
333
+ if (isFull && comparator(items[items.length - 1], add) <= 0) {
334
+ return add;
335
+ }
336
+
337
+ var lo = 0,
338
+ hi = items.length;
339
+
340
+ while (lo < hi) {
341
+ var mid = lo + hi >>> 1;
342
+
343
+ if (comparator(items[mid], add) <= 0) {
344
+ lo = mid + 1;
345
+ } else {
346
+ hi = mid;
347
+ }
348
+ }
349
+
350
+ items.splice(lo, 0, add);
351
+ return isFull ? items.pop() : null;
352
+ }
353
+ }
354
+
355
+ /**
356
+ * A currency is any fungible financial instrument on Ethereum, including Ether and all ERC20 tokens.
357
+ *
358
+ * The only instance of the base class `Currency` is Ether.
359
+ */
360
+
361
+ var Currency = /*#__PURE__*/function () {
362
+ /**
363
+ * Constructs an instance of the base class `Currency`. The only instance of the base class `Currency` is `Currency.ETHER`.
364
+ * @param decimals decimals of the currency
365
+ * @param symbol symbol of the currency
366
+ * @param name of the currency
367
+ */
368
+ function Currency(decimals, symbol, name) {
369
+ validateSolidityTypeInstance(JSBI.BigInt(decimals), SolidityType.uint8);
370
+ this.decimals = decimals;
371
+ this.symbol = symbol;
372
+ this.name = name;
373
+ }
374
+
375
+ var _proto = Currency.prototype;
376
+
377
+ _proto.change = function change(cId) {
378
+ if (cId == 1) {
379
+ ETHER.name = "Ether";
380
+ ETHER.symbol = "ETH";
381
+ }
382
+
383
+ if (cId == 56) {
384
+ ETHER.name = "BNB";
385
+ ETHER.symbol = "BNB";
386
+ }
387
+
388
+ if (cId == 137) {
389
+ ETHER.name = "Matic";
390
+ ETHER.symbol = "MATIC";
391
+ }
392
+
393
+ if (cId == 30) {
394
+ ETHER.name = "Smart Bitcoin";
395
+ ETHER.symbol = "RBTC";
396
+ }
397
+
398
+ if (cId == 31) {
399
+ ETHER.name = "Smart Bitcoin";
400
+ ETHER.symbol = "tRBTC";
401
+ }
402
+ };
403
+
404
+ return Currency;
405
+ }();
406
+ /**
407
+ * The only instance of the base class `Currency`.
408
+ */
409
+
410
+ Currency.ETHER = /*#__PURE__*/new Currency(18, 'BNB', 'BNB');
411
+ var ETHER = Currency.ETHER;
412
+
413
+ var _WETH;
414
+ /**
415
+ * Represents an ERC20 token with a unique address and some metadata.
416
+ */
417
+
418
+ var Token = /*#__PURE__*/function (_Currency) {
419
+ _inheritsLoose(Token, _Currency);
420
+
421
+ function Token(chainId, address, decimals, symbol, name) {
422
+ var _this;
423
+
424
+ _this = _Currency.call(this, decimals, symbol, name) || this;
425
+ _this.chainId = chainId;
426
+ _this.address = validateAndParseAddress(address);
427
+ return _this;
428
+ }
429
+ /**
430
+ * Returns true if the two tokens are equivalent, i.e. have the same chainId and address.
431
+ * @param other other token to compare
432
+ */
433
+
434
+
435
+ var _proto = Token.prototype;
436
+
437
+ _proto.equals = function equals(other) {
438
+ // short circuit on reference equality
439
+ if (this === other) {
440
+ return true;
441
+ }
442
+
443
+ return this.chainId === other.chainId && this.address === other.address;
444
+ }
445
+ /**
446
+ * Returns true if the address of this token sorts before the address of the other token
447
+ * @param other other token to compare
448
+ * @throws if the tokens have the same address
449
+ * @throws if the tokens are on different chains
450
+ */
451
+ ;
452
+
453
+ _proto.sortsBefore = function sortsBefore(other) {
454
+ !(this.chainId === other.chainId) ? invariant(false, 'CHAIN_IDS') : void 0;
455
+ !(this.address !== other.address) ? invariant(false, 'ADDRESSES') : void 0;
456
+ return this.address.toLowerCase() < other.address.toLowerCase();
457
+ };
458
+
459
+ return Token;
460
+ }(Currency);
461
+ /**
462
+ * Compares two currencies for equality
463
+ */
464
+
465
+ function currencyEquals(currencyA, currencyB) {
466
+ if (currencyA instanceof Token && currencyB instanceof Token) {
467
+ return currencyA.equals(currencyB);
468
+ } else if (currencyA instanceof Token) {
469
+ return false;
470
+ } else if (currencyB instanceof Token) {
471
+ return false;
472
+ } else {
473
+ return currencyA === currencyB;
474
+ }
475
+ }
476
+ var WETH = (_WETH = {}, _WETH[exports.ChainId.MAINNET] = /*#__PURE__*/new Token(exports.ChainId.MAINNET, '0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2', 18, 'WETH', 'Wrapped Ether'), _WETH[exports.ChainId.ROPSTEN] = /*#__PURE__*/new Token(exports.ChainId.ROPSTEN, '0xc778417E063141139Fce010982780140Aa0cD5Ab', 18, 'WETH', 'Wrapped Ether'), _WETH[exports.ChainId.RINKEBY] = /*#__PURE__*/new Token(exports.ChainId.RINKEBY, '0xc778417E063141139Fce010982780140Aa0cD5Ab', 18, 'WETH', 'Wrapped Ether'), _WETH[exports.ChainId.GÖRLI] = /*#__PURE__*/new Token(exports.ChainId.GÖRLI, '0xB4FBF271143F4FBf7B91A5ded31805e42b2208d6', 18, 'WETH', 'Wrapped Ether'), _WETH[exports.ChainId.KOVAN] = /*#__PURE__*/new Token(exports.ChainId.KOVAN, '0xd0A1E359811322d97991E03f863a0C30C2cF029C', 18, 'WETH', 'Wrapped Ether'), _WETH[exports.ChainId.BINANCE] = /*#__PURE__*/new Token(exports.ChainId.BINANCE, '0xbb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c', 18, 'WBNB', 'Wrapped BNB'), _WETH[exports.ChainId.BINANCETEST] = /*#__PURE__*/new Token(exports.ChainId.BINANCETEST, '0xbb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c', 18, 'WBNB', 'Wrapped BNB'), _WETH[exports.ChainId.RSK] = /*#__PURE__*/new Token(exports.ChainId.RSK, '0xFa26ecdA879AC88AfD047cc6e046E85B9aFBa2CC', 18, 'WrBTC', 'Wrapped rBTC'), _WETH[exports.ChainId.RSKTEST] = /*#__PURE__*/new Token(exports.ChainId.RSKTEST, '0xbb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c', 18, 'WBNB', 'Wrapped BNB'), _WETH[exports.ChainId.XDAI] = /*#__PURE__*/new Token(exports.ChainId.XDAI, '0xe91D153E0b41518A2Ce8Dd3D7944Fa863463a97d', 18, 'WXDAI', 'Wrapped XDAI'), _WETH[exports.ChainId.POLYGON] = /*#__PURE__*/new Token(exports.ChainId.POLYGON, '0x0d500b1d8e8ef31e21c99d1db9a6444d3adf1270', 18, 'WMATIC', 'Wrapped Matic'), _WETH);
477
+
478
+ var _toSignificantRoundin, _toFixedRounding;
479
+ var Decimal = /*#__PURE__*/toFormat(_Decimal);
480
+ var Big = /*#__PURE__*/toFormat(_Big);
481
+ var toSignificantRounding = (_toSignificantRoundin = {}, _toSignificantRoundin[exports.Rounding.ROUND_DOWN] = Decimal.ROUND_DOWN, _toSignificantRoundin[exports.Rounding.ROUND_HALF_UP] = Decimal.ROUND_HALF_UP, _toSignificantRoundin[exports.Rounding.ROUND_UP] = Decimal.ROUND_UP, _toSignificantRoundin);
482
+ var toFixedRounding = (_toFixedRounding = {}, _toFixedRounding[exports.Rounding.ROUND_DOWN] = 0, _toFixedRounding[exports.Rounding.ROUND_HALF_UP] = 1, _toFixedRounding[exports.Rounding.ROUND_UP] = 3, _toFixedRounding);
483
+ var Fraction = /*#__PURE__*/function () {
484
+ function Fraction(numerator, denominator) {
485
+ if (denominator === void 0) {
486
+ denominator = ONE;
487
+ }
488
+
489
+ this.numerator = parseBigintIsh(numerator);
490
+ this.denominator = parseBigintIsh(denominator);
491
+ } // performs floor division
492
+
493
+
494
+ var _proto = Fraction.prototype;
495
+
496
+ _proto.invert = function invert() {
497
+ return new Fraction(this.denominator, this.numerator);
498
+ };
499
+
500
+ _proto.add = function add(other) {
501
+ var otherParsed = other instanceof Fraction ? other : new Fraction(parseBigintIsh(other));
502
+
503
+ if (JSBI.equal(this.denominator, otherParsed.denominator)) {
504
+ return new Fraction(JSBI.add(this.numerator, otherParsed.numerator), this.denominator);
505
+ }
506
+
507
+ return new Fraction(JSBI.add(JSBI.multiply(this.numerator, otherParsed.denominator), JSBI.multiply(otherParsed.numerator, this.denominator)), JSBI.multiply(this.denominator, otherParsed.denominator));
508
+ };
509
+
510
+ _proto.subtract = function subtract(other) {
511
+ var otherParsed = other instanceof Fraction ? other : new Fraction(parseBigintIsh(other));
512
+
513
+ if (JSBI.equal(this.denominator, otherParsed.denominator)) {
514
+ return new Fraction(JSBI.subtract(this.numerator, otherParsed.numerator), this.denominator);
515
+ }
516
+
517
+ return new Fraction(JSBI.subtract(JSBI.multiply(this.numerator, otherParsed.denominator), JSBI.multiply(otherParsed.numerator, this.denominator)), JSBI.multiply(this.denominator, otherParsed.denominator));
518
+ };
519
+
520
+ _proto.lessThan = function lessThan(other) {
521
+ var otherParsed = other instanceof Fraction ? other : new Fraction(parseBigintIsh(other));
522
+ return JSBI.lessThan(JSBI.multiply(this.numerator, otherParsed.denominator), JSBI.multiply(otherParsed.numerator, this.denominator));
523
+ };
524
+
525
+ _proto.equalTo = function equalTo(other) {
526
+ var otherParsed = other instanceof Fraction ? other : new Fraction(parseBigintIsh(other));
527
+ return JSBI.equal(JSBI.multiply(this.numerator, otherParsed.denominator), JSBI.multiply(otherParsed.numerator, this.denominator));
528
+ };
529
+
530
+ _proto.greaterThan = function greaterThan(other) {
531
+ var otherParsed = other instanceof Fraction ? other : new Fraction(parseBigintIsh(other));
532
+ return JSBI.greaterThan(JSBI.multiply(this.numerator, otherParsed.denominator), JSBI.multiply(otherParsed.numerator, this.denominator));
533
+ };
534
+
535
+ _proto.multiply = function multiply(other) {
536
+ var otherParsed = other instanceof Fraction ? other : new Fraction(parseBigintIsh(other));
537
+ return new Fraction(JSBI.multiply(this.numerator, otherParsed.numerator), JSBI.multiply(this.denominator, otherParsed.denominator));
538
+ };
539
+
540
+ _proto.divide = function divide(other) {
541
+ var otherParsed = other instanceof Fraction ? other : new Fraction(parseBigintIsh(other));
542
+ return new Fraction(JSBI.multiply(this.numerator, otherParsed.denominator), JSBI.multiply(this.denominator, otherParsed.numerator));
543
+ };
544
+
545
+ _proto.toSignificant = function toSignificant(significantDigits, format, rounding) {
546
+ if (format === void 0) {
547
+ format = {
548
+ groupSeparator: ''
549
+ };
550
+ }
551
+
552
+ if (rounding === void 0) {
553
+ rounding = exports.Rounding.ROUND_HALF_UP;
554
+ }
555
+
556
+ !Number.isInteger(significantDigits) ? invariant(false, significantDigits + " is not an integer.") : void 0;
557
+ !(significantDigits > 0) ? invariant(false, significantDigits + " is not positive.") : void 0;
558
+ Decimal.set({
559
+ precision: significantDigits + 1,
560
+ rounding: toSignificantRounding[rounding]
561
+ });
562
+ var quotient = new Decimal(this.numerator.toString()).div(this.denominator.toString()).toSignificantDigits(significantDigits);
563
+ return quotient.toFormat(quotient.decimalPlaces(), format);
564
+ };
565
+
566
+ _proto.toFixed = function toFixed(decimalPlaces, format, rounding) {
567
+ if (format === void 0) {
568
+ format = {
569
+ groupSeparator: ''
570
+ };
571
+ }
572
+
573
+ if (rounding === void 0) {
574
+ rounding = exports.Rounding.ROUND_HALF_UP;
575
+ }
576
+
577
+ !Number.isInteger(decimalPlaces) ? invariant(false, decimalPlaces + " is not an integer.") : void 0;
578
+ !(decimalPlaces >= 0) ? invariant(false, decimalPlaces + " is negative.") : void 0;
579
+ Big.DP = decimalPlaces;
580
+ Big.RM = toFixedRounding[rounding];
581
+ return new Big(this.numerator.toString()).div(this.denominator.toString()).toFormat(decimalPlaces, format);
582
+ };
583
+
584
+ _createClass(Fraction, [{
585
+ key: "quotient",
586
+ get: function get() {
587
+ return JSBI.divide(this.numerator, this.denominator);
588
+ } // remainder after floor division
589
+
590
+ }, {
591
+ key: "remainder",
592
+ get: function get() {
593
+ return new Fraction(JSBI.remainder(this.numerator, this.denominator), this.denominator);
594
+ }
595
+ }]);
596
+
597
+ return Fraction;
598
+ }();
599
+
600
+ var Big$1 = /*#__PURE__*/toFormat(_Big);
601
+ var CurrencyAmount = /*#__PURE__*/function (_Fraction) {
602
+ _inheritsLoose(CurrencyAmount, _Fraction);
603
+
604
+ // amount _must_ be raw, i.e. in the native representation
605
+ function CurrencyAmount(currency, amount) {
606
+ var _this;
607
+
608
+ var parsedAmount = parseBigintIsh(amount);
609
+ validateSolidityTypeInstance(parsedAmount, SolidityType.uint256);
610
+ _this = _Fraction.call(this, parsedAmount, JSBI.exponentiate(TEN, JSBI.BigInt(currency.decimals))) || this;
611
+ _this.currency = currency;
612
+ return _this;
613
+ }
614
+ /**
615
+ * Helper that calls the constructor with the ETHER currency
616
+ * @param amount ether amount in wei
617
+ */
618
+
619
+
620
+ CurrencyAmount.ether = function ether(amount) {
621
+ return new CurrencyAmount(ETHER, amount);
622
+ };
623
+
624
+ var _proto = CurrencyAmount.prototype;
625
+
626
+ _proto.add = function add(other) {
627
+ !currencyEquals(this.currency, other.currency) ? invariant(false, 'TOKEN') : void 0;
628
+ return new CurrencyAmount(this.currency, JSBI.add(this.raw, other.raw));
629
+ };
630
+
631
+ _proto.subtract = function subtract(other) {
632
+ !currencyEquals(this.currency, other.currency) ? invariant(false, 'TOKEN') : void 0;
633
+ return new CurrencyAmount(this.currency, JSBI.subtract(this.raw, other.raw));
634
+ };
635
+
636
+ _proto.toSignificant = function toSignificant(significantDigits, format, rounding) {
637
+ if (significantDigits === void 0) {
638
+ significantDigits = 6;
639
+ }
640
+
641
+ if (rounding === void 0) {
642
+ rounding = exports.Rounding.ROUND_DOWN;
643
+ }
644
+
645
+ return _Fraction.prototype.toSignificant.call(this, significantDigits, format, rounding);
646
+ };
647
+
648
+ _proto.toFixed = function toFixed(decimalPlaces, format, rounding) {
649
+ if (decimalPlaces === void 0) {
650
+ decimalPlaces = this.currency.decimals;
651
+ }
652
+
653
+ if (rounding === void 0) {
654
+ rounding = exports.Rounding.ROUND_DOWN;
655
+ }
656
+
657
+ !(decimalPlaces <= this.currency.decimals) ? invariant(false, 'DECIMALS') : void 0;
658
+ return _Fraction.prototype.toFixed.call(this, decimalPlaces, format, rounding);
659
+ };
660
+
661
+ _proto.toExact = function toExact(format) {
662
+ if (format === void 0) {
663
+ format = {
664
+ groupSeparator: ''
665
+ };
666
+ }
667
+
668
+ Big$1.DP = this.currency.decimals;
669
+ return new Big$1(this.numerator.toString()).div(this.denominator.toString()).toFormat(format);
670
+ };
671
+
672
+ _createClass(CurrencyAmount, [{
673
+ key: "raw",
674
+ get: function get() {
675
+ return this.numerator;
676
+ }
677
+ }]);
678
+
679
+ return CurrencyAmount;
680
+ }(Fraction);
681
+
682
+ var TokenAmount = /*#__PURE__*/function (_CurrencyAmount) {
683
+ _inheritsLoose(TokenAmount, _CurrencyAmount);
684
+
685
+ // amount _must_ be raw, i.e. in the native representation
686
+ function TokenAmount(token, amount) {
687
+ var _this;
688
+
689
+ _this = _CurrencyAmount.call(this, token, amount) || this;
690
+ _this.token = token;
691
+ return _this;
692
+ }
693
+
694
+ var _proto = TokenAmount.prototype;
695
+
696
+ _proto.add = function add(other) {
697
+ !this.token.equals(other.token) ? invariant(false, 'TOKEN') : void 0;
698
+ return new TokenAmount(this.token, JSBI.add(this.raw, other.raw));
699
+ };
700
+
701
+ _proto.subtract = function subtract(other) {
702
+ !this.token.equals(other.token) ? invariant(false, 'TOKEN') : void 0;
703
+ return new TokenAmount(this.token, JSBI.subtract(this.raw, other.raw));
704
+ };
705
+
706
+ return TokenAmount;
707
+ }(CurrencyAmount);
708
+
709
+ var Price = /*#__PURE__*/function (_Fraction) {
710
+ _inheritsLoose(Price, _Fraction);
711
+
712
+ // denominator and numerator _must_ be raw, i.e. in the native representation
713
+ function Price(baseCurrency, quoteCurrency, denominator, numerator) {
714
+ var _this;
715
+
716
+ _this = _Fraction.call(this, numerator, denominator) || this;
717
+ _this.baseCurrency = baseCurrency;
718
+ _this.quoteCurrency = quoteCurrency;
719
+ _this.scalar = new Fraction(JSBI.exponentiate(TEN, JSBI.BigInt(baseCurrency.decimals)), JSBI.exponentiate(TEN, JSBI.BigInt(quoteCurrency.decimals)));
720
+ return _this;
721
+ }
722
+
723
+ Price.fromRoute = function fromRoute(route) {
724
+ var prices = [];
725
+
726
+ for (var _iterator = _createForOfIteratorHelperLoose(route.pairs.entries()), _step; !(_step = _iterator()).done;) {
727
+ var _step$value = _step.value,
728
+ i = _step$value[0],
729
+ pair = _step$value[1];
730
+ prices.push(route.path[i].equals(pair.token0) ? new Price(pair.reserve0.currency, pair.reserve1.currency, pair.reserve0.raw, pair.reserve1.raw) : new Price(pair.reserve1.currency, pair.reserve0.currency, pair.reserve1.raw, pair.reserve0.raw));
731
+ }
732
+
733
+ return prices.slice(1).reduce(function (accumulator, currentValue) {
734
+ return accumulator.multiply(currentValue);
735
+ }, prices[0]);
736
+ };
737
+
738
+ var _proto = Price.prototype;
739
+
740
+ _proto.invert = function invert() {
741
+ return new Price(this.quoteCurrency, this.baseCurrency, this.numerator, this.denominator);
742
+ };
743
+
744
+ _proto.multiply = function multiply(other) {
745
+ !currencyEquals(this.quoteCurrency, other.baseCurrency) ? invariant(false, 'TOKEN') : void 0;
746
+
747
+ var fraction = _Fraction.prototype.multiply.call(this, other);
748
+
749
+ return new Price(this.baseCurrency, other.quoteCurrency, fraction.denominator, fraction.numerator);
750
+ } // performs floor division on overflow
751
+ ;
752
+
753
+ _proto.quote = function quote(currencyAmount) {
754
+ !currencyEquals(currencyAmount.currency, this.baseCurrency) ? invariant(false, 'TOKEN') : void 0;
755
+
756
+ if (this.quoteCurrency instanceof Token) {
757
+ return new TokenAmount(this.quoteCurrency, _Fraction.prototype.multiply.call(this, currencyAmount.raw).quotient);
758
+ }
759
+
760
+ return CurrencyAmount.ether(_Fraction.prototype.multiply.call(this, currencyAmount.raw).quotient);
761
+ };
762
+
763
+ _proto.toSignificant = function toSignificant(significantDigits, format, rounding) {
764
+ if (significantDigits === void 0) {
765
+ significantDigits = 6;
766
+ }
767
+
768
+ return this.adjusted.toSignificant(significantDigits, format, rounding);
769
+ };
770
+
771
+ _proto.toFixed = function toFixed(decimalPlaces, format, rounding) {
772
+ if (decimalPlaces === void 0) {
773
+ decimalPlaces = 4;
774
+ }
775
+
776
+ return this.adjusted.toFixed(decimalPlaces, format, rounding);
777
+ };
778
+
779
+ _createClass(Price, [{
780
+ key: "raw",
781
+ get: function get() {
782
+ return new Fraction(this.numerator, this.denominator);
783
+ }
784
+ }, {
785
+ key: "adjusted",
786
+ get: function get() {
787
+ return _Fraction.prototype.multiply.call(this, this.scalar);
788
+ }
789
+ }]);
790
+
791
+ return Price;
792
+ }(Fraction);
793
+
794
+ var PAIR_ADDRESS_CACHE = {};
795
+ var Pair = /*#__PURE__*/function () {
796
+ function Pair(tokenAmountA, tokenAmountB) {
797
+ var tokenAmounts = tokenAmountA.token.sortsBefore(tokenAmountB.token) // does safety checks
798
+ ? [tokenAmountA, tokenAmountB] : [tokenAmountB, tokenAmountA];
799
+ this.liquidityToken = new Token(tokenAmounts[0].token.chainId, Pair.getAddress(tokenAmounts[0].token, tokenAmounts[1].token), 18, 'UNI-V2', 'Uniswap V2');
800
+ this.tokenAmounts = tokenAmounts;
801
+ }
802
+
803
+ Pair.getAddress = function getAddress(tokenA, tokenB) {
804
+ var _PAIR_ADDRESS_CACHE, _PAIR_ADDRESS_CACHE$t;
805
+
806
+ var tokens = tokenA.sortsBefore(tokenB) ? [tokenA, tokenB] : [tokenB, tokenA]; // does safety checks
807
+
808
+ if (((_PAIR_ADDRESS_CACHE = PAIR_ADDRESS_CACHE) === null || _PAIR_ADDRESS_CACHE === void 0 ? void 0 : (_PAIR_ADDRESS_CACHE$t = _PAIR_ADDRESS_CACHE[tokens[0].address]) === null || _PAIR_ADDRESS_CACHE$t === void 0 ? void 0 : _PAIR_ADDRESS_CACHE$t[tokens[1].address]) === undefined) {
809
+ var _PAIR_ADDRESS_CACHE2, _extends2, _extends3;
810
+
811
+ PAIR_ADDRESS_CACHE = _extends({}, PAIR_ADDRESS_CACHE, (_extends3 = {}, _extends3[tokens[0].address] = _extends({}, (_PAIR_ADDRESS_CACHE2 = PAIR_ADDRESS_CACHE) === null || _PAIR_ADDRESS_CACHE2 === void 0 ? void 0 : _PAIR_ADDRESS_CACHE2[tokens[0].address], (_extends2 = {}, _extends2[tokens[1].address] = address.getCreate2Address(FACTORY_ADDRESS, solidity.keccak256(['bytes'], [solidity.pack(['address', 'address'], [tokens[0].address, tokens[1].address])]), INIT_CODE_HASH), _extends2)), _extends3));
812
+ }
813
+
814
+ return PAIR_ADDRESS_CACHE[tokens[0].address][tokens[1].address];
815
+ }
816
+ /**
817
+ * Returns true if the token is either token0 or token1
818
+ * @param token to check
819
+ */
820
+ ;
821
+
822
+ var _proto = Pair.prototype;
823
+
824
+ _proto.involvesToken = function involvesToken(token) {
825
+ return token.equals(this.token0) || token.equals(this.token1);
826
+ }
827
+ /**
828
+ * Returns the current mid price of the pair in terms of token0, i.e. the ratio of reserve1 to reserve0
829
+ */
830
+ ;
831
+
832
+ /**
833
+ * Return the price of the given token in terms of the other token in the pair.
834
+ * @param token token to return price of
835
+ */
836
+ _proto.priceOf = function priceOf(token) {
837
+ !this.involvesToken(token) ? invariant(false, 'TOKEN') : void 0;
838
+ return token.equals(this.token0) ? this.token0Price : this.token1Price;
839
+ }
840
+ /**
841
+ * Returns the chain ID of the tokens in the pair.
842
+ */
843
+ ;
844
+
845
+ _proto.reserveOf = function reserveOf(token) {
846
+ !this.involvesToken(token) ? invariant(false, 'TOKEN') : void 0;
847
+ return token.equals(this.token0) ? this.reserve0 : this.reserve1;
848
+ };
849
+
850
+ _proto.getOutputAmount = function getOutputAmount(inputAmount) {
851
+ !this.involvesToken(inputAmount.token) ? invariant(false, 'TOKEN') : void 0;
852
+
853
+ if (JSBI.equal(this.reserve0.raw, ZERO) || JSBI.equal(this.reserve1.raw, ZERO)) {
854
+ throw new InsufficientReservesError();
855
+ }
856
+
857
+ var inputReserve = this.reserveOf(inputAmount.token);
858
+ var outputReserve = this.reserveOf(inputAmount.token.equals(this.token0) ? this.token1 : this.token0);
859
+ var inputAmountWithFee = JSBI.multiply(inputAmount.raw, _997);
860
+ var numerator = JSBI.multiply(inputAmountWithFee, outputReserve.raw);
861
+ var denominator = JSBI.add(JSBI.multiply(inputReserve.raw, _1000), inputAmountWithFee);
862
+ var outputAmount = new TokenAmount(inputAmount.token.equals(this.token0) ? this.token1 : this.token0, JSBI.divide(numerator, denominator));
863
+
864
+ if (JSBI.equal(outputAmount.raw, ZERO)) {
865
+ throw new InsufficientInputAmountError();
866
+ }
867
+
868
+ return [outputAmount, new Pair(inputReserve.add(inputAmount), outputReserve.subtract(outputAmount))];
869
+ };
870
+
871
+ _proto.getInputAmount = function getInputAmount(outputAmount) {
872
+ !this.involvesToken(outputAmount.token) ? invariant(false, 'TOKEN') : void 0;
873
+
874
+ if (JSBI.equal(this.reserve0.raw, ZERO) || JSBI.equal(this.reserve1.raw, ZERO) || JSBI.greaterThanOrEqual(outputAmount.raw, this.reserveOf(outputAmount.token).raw)) {
875
+ throw new InsufficientReservesError();
876
+ }
877
+
878
+ var outputReserve = this.reserveOf(outputAmount.token);
879
+ var inputReserve = this.reserveOf(outputAmount.token.equals(this.token0) ? this.token1 : this.token0);
880
+ var numerator = JSBI.multiply(JSBI.multiply(inputReserve.raw, outputAmount.raw), _1000);
881
+ var denominator = JSBI.multiply(JSBI.subtract(outputReserve.raw, outputAmount.raw), _997);
882
+ var inputAmount = new TokenAmount(outputAmount.token.equals(this.token0) ? this.token1 : this.token0, JSBI.add(JSBI.divide(numerator, denominator), ONE));
883
+ return [inputAmount, new Pair(inputReserve.add(inputAmount), outputReserve.subtract(outputAmount))];
884
+ };
885
+
886
+ _proto.getLiquidityMinted = function getLiquidityMinted(totalSupply, tokenAmountA, tokenAmountB) {
887
+ !totalSupply.token.equals(this.liquidityToken) ? invariant(false, 'LIQUIDITY') : void 0;
888
+ var tokenAmounts = tokenAmountA.token.sortsBefore(tokenAmountB.token) // does safety checks
889
+ ? [tokenAmountA, tokenAmountB] : [tokenAmountB, tokenAmountA];
890
+ !(tokenAmounts[0].token.equals(this.token0) && tokenAmounts[1].token.equals(this.token1)) ? invariant(false, 'TOKEN') : void 0;
891
+ var liquidity;
892
+
893
+ if (JSBI.equal(totalSupply.raw, ZERO)) {
894
+ liquidity = JSBI.subtract(sqrt(JSBI.multiply(tokenAmounts[0].raw, tokenAmounts[1].raw)), MINIMUM_LIQUIDITY);
895
+ } else {
896
+ var amount0 = JSBI.divide(JSBI.multiply(tokenAmounts[0].raw, totalSupply.raw), this.reserve0.raw);
897
+ var amount1 = JSBI.divide(JSBI.multiply(tokenAmounts[1].raw, totalSupply.raw), this.reserve1.raw);
898
+ liquidity = JSBI.lessThanOrEqual(amount0, amount1) ? amount0 : amount1;
899
+ }
900
+
901
+ if (!JSBI.greaterThan(liquidity, ZERO)) {
902
+ throw new InsufficientInputAmountError();
903
+ }
904
+
905
+ return new TokenAmount(this.liquidityToken, liquidity);
906
+ };
907
+
908
+ _proto.getLiquidityValue = function getLiquidityValue(token, totalSupply, liquidity, feeOn, kLast) {
909
+ if (feeOn === void 0) {
910
+ feeOn = false;
911
+ }
912
+
913
+ !this.involvesToken(token) ? invariant(false, 'TOKEN') : void 0;
914
+ !totalSupply.token.equals(this.liquidityToken) ? invariant(false, 'TOTAL_SUPPLY') : void 0;
915
+ !liquidity.token.equals(this.liquidityToken) ? invariant(false, 'LIQUIDITY') : void 0;
916
+ !JSBI.lessThanOrEqual(liquidity.raw, totalSupply.raw) ? invariant(false, 'LIQUIDITY') : void 0;
917
+ var totalSupplyAdjusted;
918
+
919
+ if (!feeOn) {
920
+ totalSupplyAdjusted = totalSupply;
921
+ } else {
922
+ !!!kLast ? invariant(false, 'K_LAST') : void 0;
923
+ var kLastParsed = parseBigintIsh(kLast);
924
+
925
+ if (!JSBI.equal(kLastParsed, ZERO)) {
926
+ var rootK = sqrt(JSBI.multiply(this.reserve0.raw, this.reserve1.raw));
927
+ var rootKLast = sqrt(kLastParsed);
928
+
929
+ if (JSBI.greaterThan(rootK, rootKLast)) {
930
+ var numerator = JSBI.multiply(totalSupply.raw, JSBI.subtract(rootK, rootKLast));
931
+ var denominator = JSBI.add(JSBI.multiply(rootK, FIVE), rootKLast);
932
+ var feeLiquidity = JSBI.divide(numerator, denominator);
933
+ totalSupplyAdjusted = totalSupply.add(new TokenAmount(this.liquidityToken, feeLiquidity));
934
+ } else {
935
+ totalSupplyAdjusted = totalSupply;
936
+ }
937
+ } else {
938
+ totalSupplyAdjusted = totalSupply;
939
+ }
940
+ }
941
+
942
+ return new TokenAmount(token, JSBI.divide(JSBI.multiply(liquidity.raw, this.reserveOf(token).raw), totalSupplyAdjusted.raw));
943
+ };
944
+
945
+ _createClass(Pair, [{
946
+ key: "token0Price",
947
+ get: function get() {
948
+ return new Price(this.token0, this.token1, this.tokenAmounts[0].raw, this.tokenAmounts[1].raw);
949
+ }
950
+ /**
951
+ * Returns the current mid price of the pair in terms of token1, i.e. the ratio of reserve0 to reserve1
952
+ */
953
+
954
+ }, {
955
+ key: "token1Price",
956
+ get: function get() {
957
+ return new Price(this.token1, this.token0, this.tokenAmounts[1].raw, this.tokenAmounts[0].raw);
958
+ }
959
+ }, {
960
+ key: "chainId",
961
+ get: function get() {
962
+ return this.token0.chainId;
963
+ }
964
+ }, {
965
+ key: "token0",
966
+ get: function get() {
967
+ return this.tokenAmounts[0].token;
968
+ }
969
+ }, {
970
+ key: "token1",
971
+ get: function get() {
972
+ return this.tokenAmounts[1].token;
973
+ }
974
+ }, {
975
+ key: "reserve0",
976
+ get: function get() {
977
+ return this.tokenAmounts[0];
978
+ }
979
+ }, {
980
+ key: "reserve1",
981
+ get: function get() {
982
+ return this.tokenAmounts[1];
983
+ }
984
+ }]);
985
+
986
+ return Pair;
987
+ }();
988
+
989
+ var Route = /*#__PURE__*/function () {
990
+ function Route(pairs, input, output) {
991
+ !(pairs.length > 0) ? invariant(false, 'PAIRS') : void 0;
992
+ !pairs.every(function (pair) {
993
+ return pair.chainId === pairs[0].chainId;
994
+ }) ? invariant(false, 'CHAIN_IDS') : void 0;
995
+ !(input instanceof Token && pairs[0].involvesToken(input) || input === ETHER && pairs[0].involvesToken(WETH[pairs[0].chainId])) ? invariant(false, 'INPUT') : void 0;
996
+ !(typeof output === 'undefined' || output instanceof Token && pairs[pairs.length - 1].involvesToken(output) || output === ETHER && pairs[pairs.length - 1].involvesToken(WETH[pairs[0].chainId])) ? invariant(false, 'OUTPUT') : void 0;
997
+ var path = [input instanceof Token ? input : WETH[pairs[0].chainId]];
998
+
999
+ for (var _iterator = _createForOfIteratorHelperLoose(pairs.entries()), _step; !(_step = _iterator()).done;) {
1000
+ var _step$value = _step.value,
1001
+ i = _step$value[0],
1002
+ pair = _step$value[1];
1003
+ var currentInput = path[i];
1004
+ !(currentInput.equals(pair.token0) || currentInput.equals(pair.token1)) ? invariant(false, 'PATH') : void 0;
1005
+
1006
+ var _output = currentInput.equals(pair.token0) ? pair.token1 : pair.token0;
1007
+
1008
+ path.push(_output);
1009
+ }
1010
+
1011
+ this.pairs = pairs;
1012
+ this.path = path;
1013
+ this.midPrice = Price.fromRoute(this);
1014
+ this.input = input;
1015
+ this.output = output !== null && output !== void 0 ? output : path[path.length - 1];
1016
+ }
1017
+
1018
+ _createClass(Route, [{
1019
+ key: "chainId",
1020
+ get: function get() {
1021
+ return this.pairs[0].chainId;
1022
+ }
1023
+ }]);
1024
+
1025
+ return Route;
1026
+ }();
1027
+
1028
+ var _100_PERCENT = /*#__PURE__*/new Fraction(_100);
1029
+
1030
+ var Percent = /*#__PURE__*/function (_Fraction) {
1031
+ _inheritsLoose(Percent, _Fraction);
1032
+
1033
+ function Percent() {
1034
+ return _Fraction.apply(this, arguments) || this;
1035
+ }
1036
+
1037
+ var _proto = Percent.prototype;
1038
+
1039
+ _proto.toSignificant = function toSignificant(significantDigits, format, rounding) {
1040
+ if (significantDigits === void 0) {
1041
+ significantDigits = 5;
1042
+ }
1043
+
1044
+ return this.multiply(_100_PERCENT).toSignificant(significantDigits, format, rounding);
1045
+ };
1046
+
1047
+ _proto.toFixed = function toFixed(decimalPlaces, format, rounding) {
1048
+ if (decimalPlaces === void 0) {
1049
+ decimalPlaces = 2;
1050
+ }
1051
+
1052
+ return this.multiply(_100_PERCENT).toFixed(decimalPlaces, format, rounding);
1053
+ };
1054
+
1055
+ return Percent;
1056
+ }(Fraction);
1057
+
1058
+ /**
1059
+ * Returns the percent difference between the mid price and the execution price, i.e. price impact.
1060
+ * @param midPrice mid price before the trade
1061
+ * @param inputAmount the input amount of the trade
1062
+ * @param outputAmount the output amount of the trade
1063
+ */
1064
+
1065
+ function computePriceImpact(midPrice, inputAmount, outputAmount) {
1066
+ var exactQuote = midPrice.raw.multiply(inputAmount.raw); // calculate slippage := (exactQuote - outputAmount) / exactQuote
1067
+
1068
+ var slippage = exactQuote.subtract(outputAmount.raw).divide(exactQuote);
1069
+ return new Percent(slippage.numerator, slippage.denominator);
1070
+ } // comparator function that allows sorting trades by their output amounts, in decreasing order, and then input amounts
1071
+ // in increasing order. i.e. the best trades have the most outputs for the least inputs and are sorted first
1072
+
1073
+
1074
+ function inputOutputComparator(a, b) {
1075
+ // must have same input and output token for comparison
1076
+ !currencyEquals(a.inputAmount.currency, b.inputAmount.currency) ? invariant(false, 'INPUT_CURRENCY') : void 0;
1077
+ !currencyEquals(a.outputAmount.currency, b.outputAmount.currency) ? invariant(false, 'OUTPUT_CURRENCY') : void 0;
1078
+
1079
+ if (a.outputAmount.equalTo(b.outputAmount)) {
1080
+ if (a.inputAmount.equalTo(b.inputAmount)) {
1081
+ return 0;
1082
+ } // trade A requires less input than trade B, so A should come first
1083
+
1084
+
1085
+ if (a.inputAmount.lessThan(b.inputAmount)) {
1086
+ return -1;
1087
+ } else {
1088
+ return 1;
1089
+ }
1090
+ } else {
1091
+ // tradeA has less output than trade B, so should come second
1092
+ if (a.outputAmount.lessThan(b.outputAmount)) {
1093
+ return 1;
1094
+ } else {
1095
+ return -1;
1096
+ }
1097
+ }
1098
+ } // extension of the input output comparator that also considers other dimensions of the trade in ranking them
1099
+
1100
+ function tradeComparator(a, b) {
1101
+ var ioComp = inputOutputComparator(a, b);
1102
+
1103
+ if (ioComp !== 0) {
1104
+ return ioComp;
1105
+ } // consider lowest slippage next, since these are less likely to fail
1106
+
1107
+
1108
+ if (a.priceImpact.lessThan(b.priceImpact)) {
1109
+ return -1;
1110
+ } else if (a.priceImpact.greaterThan(b.priceImpact)) {
1111
+ return 1;
1112
+ } // finally consider the number of hops since each hop costs gas
1113
+
1114
+
1115
+ return a.route.path.length - b.route.path.length;
1116
+ }
1117
+ /**
1118
+ * Given a currency amount and a chain ID, returns the equivalent representation as the token amount.
1119
+ * In other words, if the currency is ETHER, returns the WETH token amount for the given chain. Otherwise, returns
1120
+ * the input currency amount.
1121
+ */
1122
+
1123
+ function wrappedAmount(currencyAmount, chainId) {
1124
+ if (currencyAmount instanceof TokenAmount) return currencyAmount;
1125
+ if (currencyAmount.currency === ETHER) return new TokenAmount(WETH[chainId], currencyAmount.raw);
1126
+ invariant(false, 'CURRENCY') ;
1127
+ }
1128
+
1129
+ function wrappedCurrency(currency, chainId) {
1130
+ if (currency instanceof Token) return currency;
1131
+ if (currency === ETHER) return WETH[chainId];
1132
+ invariant(false, 'CURRENCY') ;
1133
+ }
1134
+ /**
1135
+ * Represents a trade executed against a list of pairs.
1136
+ * Does not account for slippage, i.e. trades that front run this trade and move the price.
1137
+ */
1138
+
1139
+
1140
+ var Trade = /*#__PURE__*/function () {
1141
+ function Trade(route, amount, tradeType) {
1142
+ var amounts = new Array(route.path.length);
1143
+ var nextPairs = new Array(route.pairs.length);
1144
+
1145
+ if (tradeType === exports.TradeType.EXACT_INPUT) {
1146
+ !currencyEquals(amount.currency, route.input) ? invariant(false, 'INPUT') : void 0;
1147
+ amounts[0] = wrappedAmount(amount, route.chainId);
1148
+
1149
+ for (var i = 0; i < route.path.length - 1; i++) {
1150
+ var pair = route.pairs[i];
1151
+
1152
+ var _pair$getOutputAmount = pair.getOutputAmount(amounts[i]),
1153
+ outputAmount = _pair$getOutputAmount[0],
1154
+ nextPair = _pair$getOutputAmount[1];
1155
+
1156
+ amounts[i + 1] = outputAmount;
1157
+ nextPairs[i] = nextPair;
1158
+ }
1159
+ } else {
1160
+ !currencyEquals(amount.currency, route.output) ? invariant(false, 'OUTPUT') : void 0;
1161
+ amounts[amounts.length - 1] = wrappedAmount(amount, route.chainId);
1162
+
1163
+ for (var _i = route.path.length - 1; _i > 0; _i--) {
1164
+ var _pair = route.pairs[_i - 1];
1165
+
1166
+ var _pair$getInputAmount = _pair.getInputAmount(amounts[_i]),
1167
+ inputAmount = _pair$getInputAmount[0],
1168
+ _nextPair = _pair$getInputAmount[1];
1169
+
1170
+ amounts[_i - 1] = inputAmount;
1171
+ nextPairs[_i - 1] = _nextPair;
1172
+ }
1173
+ }
1174
+
1175
+ this.route = route;
1176
+ this.tradeType = tradeType;
1177
+ this.inputAmount = tradeType === exports.TradeType.EXACT_INPUT ? amount : route.input === ETHER ? CurrencyAmount.ether(amounts[0].raw) : amounts[0];
1178
+ this.outputAmount = tradeType === exports.TradeType.EXACT_OUTPUT ? amount : route.output === ETHER ? CurrencyAmount.ether(amounts[amounts.length - 1].raw) : amounts[amounts.length - 1];
1179
+ this.executionPrice = new Price(this.inputAmount.currency, this.outputAmount.currency, this.inputAmount.raw, this.outputAmount.raw);
1180
+ this.nextMidPrice = Price.fromRoute(new Route(nextPairs, route.input));
1181
+ this.priceImpact = computePriceImpact(route.midPrice, this.inputAmount, this.outputAmount);
1182
+ }
1183
+ /**
1184
+ * Constructs an exact in trade with the given amount in and route
1185
+ * @param route route of the exact in trade
1186
+ * @param amountIn the amount being passed in
1187
+ */
1188
+
1189
+
1190
+ Trade.exactIn = function exactIn(route, amountIn) {
1191
+ return new Trade(route, amountIn, exports.TradeType.EXACT_INPUT);
1192
+ }
1193
+ /**
1194
+ * Constructs an exact out trade with the given amount out and route
1195
+ * @param route route of the exact out trade
1196
+ * @param amountOut the amount returned by the trade
1197
+ */
1198
+ ;
1199
+
1200
+ Trade.exactOut = function exactOut(route, amountOut) {
1201
+ return new Trade(route, amountOut, exports.TradeType.EXACT_OUTPUT);
1202
+ }
1203
+ /**
1204
+ * Get the minimum amount that must be received from this trade for the given slippage tolerance
1205
+ * @param slippageTolerance tolerance of unfavorable slippage from the execution price of this trade
1206
+ */
1207
+ ;
1208
+
1209
+ var _proto = Trade.prototype;
1210
+
1211
+ _proto.minimumAmountOut = function minimumAmountOut(slippageTolerance) {
1212
+ !!slippageTolerance.lessThan(ZERO) ? invariant(false, 'SLIPPAGE_TOLERANCE') : void 0;
1213
+
1214
+ if (this.tradeType === exports.TradeType.EXACT_OUTPUT) {
1215
+ return this.outputAmount;
1216
+ } else {
1217
+ var slippageAdjustedAmountOut = new Fraction(ONE).add(slippageTolerance).invert().multiply(this.outputAmount.raw).quotient;
1218
+ return this.outputAmount instanceof TokenAmount ? new TokenAmount(this.outputAmount.token, slippageAdjustedAmountOut) : CurrencyAmount.ether(slippageAdjustedAmountOut);
1219
+ }
1220
+ }
1221
+ /**
1222
+ * Get the maximum amount in that can be spent via this trade for the given slippage tolerance
1223
+ * @param slippageTolerance tolerance of unfavorable slippage from the execution price of this trade
1224
+ */
1225
+ ;
1226
+
1227
+ _proto.maximumAmountIn = function maximumAmountIn(slippageTolerance) {
1228
+ !!slippageTolerance.lessThan(ZERO) ? invariant(false, 'SLIPPAGE_TOLERANCE') : void 0;
1229
+
1230
+ if (this.tradeType === exports.TradeType.EXACT_INPUT) {
1231
+ return this.inputAmount;
1232
+ } else {
1233
+ var slippageAdjustedAmountIn = new Fraction(ONE).add(slippageTolerance).multiply(this.inputAmount.raw).quotient;
1234
+ return this.inputAmount instanceof TokenAmount ? new TokenAmount(this.inputAmount.token, slippageAdjustedAmountIn) : CurrencyAmount.ether(slippageAdjustedAmountIn);
1235
+ }
1236
+ }
1237
+ /**
1238
+ * Given a list of pairs, and a fixed amount in, returns the top `maxNumResults` trades that go from an input token
1239
+ * amount to an output token, making at most `maxHops` hops.
1240
+ * Note this does not consider aggregation, as routes are linear. It's possible a better route exists by splitting
1241
+ * the amount in among multiple routes.
1242
+ * @param pairs the pairs to consider in finding the best trade
1243
+ * @param currencyAmountIn exact amount of input currency to spend
1244
+ * @param currencyOut the desired currency out
1245
+ * @param maxNumResults maximum number of results to return
1246
+ * @param maxHops maximum number of hops a returned trade can make, e.g. 1 hop goes through a single pair
1247
+ * @param currentPairs used in recursion; the current list of pairs
1248
+ * @param originalAmountIn used in recursion; the original value of the currencyAmountIn parameter
1249
+ * @param bestTrades used in recursion; the current list of best trades
1250
+ */
1251
+ ;
1252
+
1253
+ Trade.bestTradeExactIn = function bestTradeExactIn(pairs, currencyAmountIn, currencyOut, _temp, // used in recursion.
1254
+ currentPairs, originalAmountIn, bestTrades) {
1255
+ var _ref = _temp === void 0 ? {} : _temp,
1256
+ _ref$maxNumResults = _ref.maxNumResults,
1257
+ maxNumResults = _ref$maxNumResults === void 0 ? 3 : _ref$maxNumResults,
1258
+ _ref$maxHops = _ref.maxHops,
1259
+ maxHops = _ref$maxHops === void 0 ? 3 : _ref$maxHops;
1260
+
1261
+ if (currentPairs === void 0) {
1262
+ currentPairs = [];
1263
+ }
1264
+
1265
+ if (originalAmountIn === void 0) {
1266
+ originalAmountIn = currencyAmountIn;
1267
+ }
1268
+
1269
+ if (bestTrades === void 0) {
1270
+ bestTrades = [];
1271
+ }
1272
+
1273
+ !(pairs.length > 0) ? invariant(false, 'PAIRS') : void 0;
1274
+ !(maxHops > 0) ? invariant(false, 'MAX_HOPS') : void 0;
1275
+ !(originalAmountIn === currencyAmountIn || currentPairs.length > 0) ? invariant(false, 'INVALID_RECURSION') : void 0;
1276
+ var chainId = currencyAmountIn instanceof TokenAmount ? currencyAmountIn.token.chainId : currencyOut instanceof Token ? currencyOut.chainId : undefined;
1277
+ !(chainId !== undefined) ? invariant(false, 'CHAIN_ID') : void 0;
1278
+ var amountIn = wrappedAmount(currencyAmountIn, chainId);
1279
+ var tokenOut = wrappedCurrency(currencyOut, chainId);
1280
+
1281
+ for (var i = 0; i < pairs.length; i++) {
1282
+ var pair = pairs[i]; // pair irrelevant
1283
+
1284
+ if (!pair.token0.equals(amountIn.token) && !pair.token1.equals(amountIn.token)) continue;
1285
+ if (pair.reserve0.equalTo(ZERO) || pair.reserve1.equalTo(ZERO)) continue;
1286
+ var amountOut = void 0;
1287
+
1288
+ try {
1289
+ ;
1290
+
1291
+ var _pair$getOutputAmount2 = pair.getOutputAmount(amountIn);
1292
+
1293
+ amountOut = _pair$getOutputAmount2[0];
1294
+ } catch (error) {
1295
+ // input too low
1296
+ if (error.isInsufficientInputAmountError) {
1297
+ continue;
1298
+ }
1299
+
1300
+ throw error;
1301
+ } // we have arrived at the output token, so this is the final trade of one of the paths
1302
+
1303
+
1304
+ if (amountOut.token.equals(tokenOut)) {
1305
+ sortedInsert(bestTrades, new Trade(new Route([].concat(currentPairs, [pair]), originalAmountIn.currency, currencyOut), originalAmountIn, exports.TradeType.EXACT_INPUT), maxNumResults, tradeComparator);
1306
+ } else if (maxHops > 1 && pairs.length > 1) {
1307
+ var pairsExcludingThisPair = pairs.slice(0, i).concat(pairs.slice(i + 1, pairs.length)); // otherwise, consider all the other paths that lead from this token as long as we have not exceeded maxHops
1308
+
1309
+ Trade.bestTradeExactIn(pairsExcludingThisPair, amountOut, currencyOut, {
1310
+ maxNumResults: maxNumResults,
1311
+ maxHops: maxHops - 1
1312
+ }, [].concat(currentPairs, [pair]), originalAmountIn, bestTrades);
1313
+ }
1314
+ }
1315
+
1316
+ return bestTrades;
1317
+ }
1318
+ /**
1319
+ * similar to the above method but instead targets a fixed output amount
1320
+ * given a list of pairs, and a fixed amount out, returns the top `maxNumResults` trades that go from an input token
1321
+ * to an output token amount, making at most `maxHops` hops
1322
+ * note this does not consider aggregation, as routes are linear. it's possible a better route exists by splitting
1323
+ * the amount in among multiple routes.
1324
+ * @param pairs the pairs to consider in finding the best trade
1325
+ * @param currencyIn the currency to spend
1326
+ * @param currencyAmountOut the exact amount of currency out
1327
+ * @param maxNumResults maximum number of results to return
1328
+ * @param maxHops maximum number of hops a returned trade can make, e.g. 1 hop goes through a single pair
1329
+ * @param currentPairs used in recursion; the current list of pairs
1330
+ * @param originalAmountOut used in recursion; the original value of the currencyAmountOut parameter
1331
+ * @param bestTrades used in recursion; the current list of best trades
1332
+ */
1333
+ ;
1334
+
1335
+ Trade.bestTradeExactOut = function bestTradeExactOut(pairs, currencyIn, currencyAmountOut, _temp2, // used in recursion.
1336
+ currentPairs, originalAmountOut, bestTrades) {
1337
+ var _ref2 = _temp2 === void 0 ? {} : _temp2,
1338
+ _ref2$maxNumResults = _ref2.maxNumResults,
1339
+ maxNumResults = _ref2$maxNumResults === void 0 ? 3 : _ref2$maxNumResults,
1340
+ _ref2$maxHops = _ref2.maxHops,
1341
+ maxHops = _ref2$maxHops === void 0 ? 3 : _ref2$maxHops;
1342
+
1343
+ if (currentPairs === void 0) {
1344
+ currentPairs = [];
1345
+ }
1346
+
1347
+ if (originalAmountOut === void 0) {
1348
+ originalAmountOut = currencyAmountOut;
1349
+ }
1350
+
1351
+ if (bestTrades === void 0) {
1352
+ bestTrades = [];
1353
+ }
1354
+
1355
+ !(pairs.length > 0) ? invariant(false, 'PAIRS') : void 0;
1356
+ !(maxHops > 0) ? invariant(false, 'MAX_HOPS') : void 0;
1357
+ !(originalAmountOut === currencyAmountOut || currentPairs.length > 0) ? invariant(false, 'INVALID_RECURSION') : void 0;
1358
+ var chainId = currencyAmountOut instanceof TokenAmount ? currencyAmountOut.token.chainId : currencyIn instanceof Token ? currencyIn.chainId : undefined;
1359
+ !(chainId !== undefined) ? invariant(false, 'CHAIN_ID') : void 0;
1360
+ var amountOut = wrappedAmount(currencyAmountOut, chainId);
1361
+ var tokenIn = wrappedCurrency(currencyIn, chainId);
1362
+
1363
+ for (var i = 0; i < pairs.length; i++) {
1364
+ var pair = pairs[i]; // pair irrelevant
1365
+
1366
+ if (!pair.token0.equals(amountOut.token) && !pair.token1.equals(amountOut.token)) continue;
1367
+ if (pair.reserve0.equalTo(ZERO) || pair.reserve1.equalTo(ZERO)) continue;
1368
+ var amountIn = void 0;
1369
+
1370
+ try {
1371
+ ;
1372
+
1373
+ var _pair$getInputAmount2 = pair.getInputAmount(amountOut);
1374
+
1375
+ amountIn = _pair$getInputAmount2[0];
1376
+ } catch (error) {
1377
+ // not enough liquidity in this pair
1378
+ if (error.isInsufficientReservesError) {
1379
+ continue;
1380
+ }
1381
+
1382
+ throw error;
1383
+ } // we have arrived at the input token, so this is the first trade of one of the paths
1384
+
1385
+
1386
+ if (amountIn.token.equals(tokenIn)) {
1387
+ sortedInsert(bestTrades, new Trade(new Route([pair].concat(currentPairs), currencyIn, originalAmountOut.currency), originalAmountOut, exports.TradeType.EXACT_OUTPUT), maxNumResults, tradeComparator);
1388
+ } else if (maxHops > 1 && pairs.length > 1) {
1389
+ var pairsExcludingThisPair = pairs.slice(0, i).concat(pairs.slice(i + 1, pairs.length)); // otherwise, consider all the other paths that arrive at this token as long as we have not exceeded maxHops
1390
+
1391
+ Trade.bestTradeExactOut(pairsExcludingThisPair, currencyIn, amountIn, {
1392
+ maxNumResults: maxNumResults,
1393
+ maxHops: maxHops - 1
1394
+ }, [pair].concat(currentPairs), originalAmountOut, bestTrades);
1395
+ }
1396
+ }
1397
+
1398
+ return bestTrades;
1399
+ };
1400
+
1401
+ return Trade;
1402
+ }();
1403
+
1404
+ function toHex(currencyAmount) {
1405
+ return "0x" + currencyAmount.raw.toString(16);
1406
+ }
1407
+
1408
+ var ZERO_HEX = '0x0';
1409
+ /**
1410
+ * Represents the Uniswap V2 Router, and has static methods for helping execute trades.
1411
+ */
1412
+
1413
+ var Router = /*#__PURE__*/function () {
1414
+ /**
1415
+ * Cannot be constructed.
1416
+ */
1417
+ function Router() {}
1418
+ /**
1419
+ * Produces the on-chain method name to call and the hex encoded parameters to pass as arguments for a given trade.
1420
+ * @param trade to produce call parameters for
1421
+ * @param options options for the call parameters
1422
+ */
1423
+
1424
+
1425
+ Router.swapCallParameters = function swapCallParameters(trade, options) {
1426
+ var etherIn = trade.inputAmount.currency === ETHER;
1427
+ var etherOut = trade.outputAmount.currency === ETHER; // the router does not support both ether in and out
1428
+
1429
+ !!(etherIn && etherOut) ? invariant(false, 'ETHER_IN_OUT') : void 0;
1430
+ !(!('ttl' in options) || options.ttl > 0) ? invariant(false, 'TTL') : void 0;
1431
+ var to = validateAndParseAddress(options.recipient);
1432
+ var amountIn = toHex(trade.maximumAmountIn(options.allowedSlippage));
1433
+ var amountOut = toHex(trade.minimumAmountOut(options.allowedSlippage));
1434
+ var path = trade.route.path.map(function (token) {
1435
+ return token.address;
1436
+ });
1437
+ var deadline = 'ttl' in options ? "0x" + (Math.floor(new Date().getTime() / 1000) + options.ttl).toString(16) : "0x" + options.deadline.toString(16);
1438
+ var useFeeOnTransfer = Boolean(options.feeOnTransfer);
1439
+ var methodName;
1440
+ var args;
1441
+ var value;
1442
+
1443
+ switch (trade.tradeType) {
1444
+ case exports.TradeType.EXACT_INPUT:
1445
+ if (etherIn) {
1446
+ methodName = useFeeOnTransfer ? 'swapExactETHForTokensSupportingFeeOnTransferTokens' : 'swapExactETHForTokens'; // (uint amountOutMin, address[] calldata path, address to, uint deadline)
1447
+
1448
+ args = [amountOut, path, to, deadline];
1449
+ value = amountIn;
1450
+ } else if (etherOut) {
1451
+ methodName = useFeeOnTransfer ? 'swapExactTokensForETHSupportingFeeOnTransferTokens' : 'swapExactTokensForETH'; // (uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
1452
+
1453
+ args = [amountIn, amountOut, path, to, deadline];
1454
+ value = ZERO_HEX;
1455
+ } else {
1456
+ methodName = useFeeOnTransfer ? 'swapExactTokensForTokensSupportingFeeOnTransferTokens' : 'swapExactTokensForTokens'; // (uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
1457
+
1458
+ args = [amountIn, amountOut, path, to, deadline];
1459
+ value = ZERO_HEX;
1460
+ }
1461
+
1462
+ break;
1463
+
1464
+ case exports.TradeType.EXACT_OUTPUT:
1465
+ !!useFeeOnTransfer ? invariant(false, 'EXACT_OUT_FOT') : void 0;
1466
+
1467
+ if (etherIn) {
1468
+ methodName = 'swapETHForExactTokens'; // (uint amountOut, address[] calldata path, address to, uint deadline)
1469
+
1470
+ args = [amountOut, path, to, deadline];
1471
+ value = amountIn;
1472
+ } else if (etherOut) {
1473
+ methodName = 'swapTokensForExactETH'; // (uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
1474
+
1475
+ args = [amountOut, amountIn, path, to, deadline];
1476
+ value = ZERO_HEX;
1477
+ } else {
1478
+ methodName = 'swapTokensForExactTokens'; // (uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
1479
+
1480
+ args = [amountOut, amountIn, path, to, deadline];
1481
+ value = ZERO_HEX;
1482
+ }
1483
+
1484
+ break;
1485
+ }
1486
+
1487
+ return {
1488
+ methodName: methodName,
1489
+ args: args,
1490
+ value: value
1491
+ };
1492
+ };
1493
+
1494
+ return Router;
1495
+ }();
1496
+
1497
+ var ERC20 = [
1498
+ {
1499
+ constant: true,
1500
+ inputs: [
1501
+ ],
1502
+ name: "decimals",
1503
+ outputs: [
1504
+ {
1505
+ name: "",
1506
+ type: "uint8"
1507
+ }
1508
+ ],
1509
+ payable: false,
1510
+ stateMutability: "view",
1511
+ type: "function"
1512
+ },
1513
+ {
1514
+ constant: true,
1515
+ inputs: [
1516
+ {
1517
+ name: "",
1518
+ type: "address"
1519
+ }
1520
+ ],
1521
+ name: "balanceOf",
1522
+ outputs: [
1523
+ {
1524
+ name: "",
1525
+ type: "uint256"
1526
+ }
1527
+ ],
1528
+ payable: false,
1529
+ stateMutability: "view",
1530
+ type: "function"
1531
+ }
1532
+ ];
1533
+
1534
+ var _TOKEN_DECIMALS_CACHE;
1535
+ var TOKEN_DECIMALS_CACHE = (_TOKEN_DECIMALS_CACHE = {}, _TOKEN_DECIMALS_CACHE[exports.ChainId.MAINNET] = {
1536
+ '0xE0B7927c4aF23765Cb51314A0E0521A9645F0E2A': 9 // DGD
1537
+
1538
+ }, _TOKEN_DECIMALS_CACHE);
1539
+ /**
1540
+ * Contains methods for constructing instances of pairs and tokens from on-chain data.
1541
+ */
1542
+
1543
+ var Fetcher = /*#__PURE__*/function () {
1544
+ /**
1545
+ * Cannot be constructed.
1546
+ */
1547
+ function Fetcher() {}
1548
+ /**
1549
+ * Fetch information for a given token on the given chain, using the given ethers provider.
1550
+ * @param chainId chain of the token
1551
+ * @param address address of the token on the chain
1552
+ * @param provider provider used to fetch the token
1553
+ * @param symbol optional symbol of the token
1554
+ * @param name optional name of the token
1555
+ */
1556
+
1557
+
1558
+ Fetcher.fetchTokenData = function fetchTokenData(chainId, address, provider, symbol, name) {
1559
+ try {
1560
+ var _TOKEN_DECIMALS_CACHE2, _TOKEN_DECIMALS_CACHE3;
1561
+
1562
+ var _temp3 = function _temp3(parsedDecimals) {
1563
+ return new Token(chainId, address, parsedDecimals, symbol, name);
1564
+ };
1565
+
1566
+ if (provider === undefined) provider = providers.getDefaultProvider(networks.getNetwork(chainId));
1567
+
1568
+ var _temp4 = typeof ((_TOKEN_DECIMALS_CACHE2 = TOKEN_DECIMALS_CACHE) === null || _TOKEN_DECIMALS_CACHE2 === void 0 ? void 0 : (_TOKEN_DECIMALS_CACHE3 = _TOKEN_DECIMALS_CACHE2[chainId]) === null || _TOKEN_DECIMALS_CACHE3 === void 0 ? void 0 : _TOKEN_DECIMALS_CACHE3[address]) === 'number';
1569
+
1570
+ return Promise.resolve(_temp4 ? _temp3(TOKEN_DECIMALS_CACHE[chainId][address]) : Promise.resolve(new contracts.Contract(address, ERC20, provider).decimals().then(function (decimals) {
1571
+ var _TOKEN_DECIMALS_CACHE4, _extends2, _extends3;
1572
+
1573
+ TOKEN_DECIMALS_CACHE = _extends({}, TOKEN_DECIMALS_CACHE, (_extends3 = {}, _extends3[chainId] = _extends({}, (_TOKEN_DECIMALS_CACHE4 = TOKEN_DECIMALS_CACHE) === null || _TOKEN_DECIMALS_CACHE4 === void 0 ? void 0 : _TOKEN_DECIMALS_CACHE4[chainId], (_extends2 = {}, _extends2[address] = decimals, _extends2)), _extends3));
1574
+ return decimals;
1575
+ })).then(_temp3));
1576
+ } catch (e) {
1577
+ return Promise.reject(e);
1578
+ }
1579
+ }
1580
+ /**
1581
+ * Fetches information about a pair and constructs a pair from the given two tokens.
1582
+ * @param tokenA first token
1583
+ * @param tokenB second token
1584
+ * @param provider the provider to use to fetch the data
1585
+ */
1586
+ ;
1587
+
1588
+ Fetcher.fetchPairData = function fetchPairData(tokenA, tokenB, provider) {
1589
+ try {
1590
+ if (provider === undefined) provider = providers.getDefaultProvider(networks.getNetwork(tokenA.chainId));
1591
+ !(tokenA.chainId === tokenB.chainId) ? "development" !== "production" ? invariant(false, 'CHAIN_ID') : invariant(false) : void 0;
1592
+ var address = Pair.getAddress(tokenA, tokenB);
1593
+ return Promise.resolve(new contracts.Contract(address, IUniswapV2Pair.abi, provider).getReserves()).then(function (_ref) {
1594
+ var reserves0 = _ref[0],
1595
+ reserves1 = _ref[1];
1596
+ var balances = tokenA.sortsBefore(tokenB) ? [reserves0, reserves1] : [reserves1, reserves0];
1597
+ return new Pair(new TokenAmount(tokenA, balances[0]), new TokenAmount(tokenB, balances[1]));
1598
+ });
1599
+ } catch (e) {
1600
+ return Promise.reject(e);
1601
+ }
1602
+ };
1603
+
1604
+ return Fetcher;
1605
+ }();
1606
+
1607
+ exports.JSBI = JSBI;
1608
+ exports.Currency = Currency;
1609
+ exports.CurrencyAmount = CurrencyAmount;
1610
+ exports.ETHER = ETHER;
1611
+ exports.FACTORY_ADDRESS = FACTORY_ADDRESS;
1612
+ exports.Fetcher = Fetcher;
1613
+ exports.Fraction = Fraction;
1614
+ exports.INIT_CODE_HASH = INIT_CODE_HASH;
1615
+ exports.InsufficientInputAmountError = InsufficientInputAmountError;
1616
+ exports.InsufficientReservesError = InsufficientReservesError;
1617
+ exports.MINIMUM_LIQUIDITY = MINIMUM_LIQUIDITY;
1618
+ exports.Pair = Pair;
1619
+ exports.Percent = Percent;
1620
+ exports.Price = Price;
1621
+ exports.Route = Route;
1622
+ exports.Router = Router;
1623
+ exports.Token = Token;
1624
+ exports.TokenAmount = TokenAmount;
1625
+ exports.Trade = Trade;
1626
+ exports.WETH = WETH;
1627
+ exports.currencyEquals = currencyEquals;
1628
+ exports.inputOutputComparator = inputOutputComparator;
1629
+ exports.tradeComparator = tradeComparator;
1630
+ //# sourceMappingURL=u-exchange-sdk.cjs.development.js.map