@sebtoday/u-exchange-sdk 1.0.6 → 1.0.7

Sign up to get free protection for your applications and to get access to all the features.
@@ -22,7 +22,7 @@ export declare enum Rounding {
22
22
  ROUND_HALF_UP = 1,
23
23
  ROUND_UP = 2
24
24
  }
25
- export declare const FACTORY_ADDRESS = "0x063af7b01B067eE135344FEf85d6Aecea14CFA05";
25
+ export declare const FACTORY_ADDRESS = "0x0dE70757dE21FAcD23c3aEb46e8bE20620b5269f";
26
26
  export declare const INIT_CODE_HASH = "0x6c0dd0b3d906c70e40fd9e96936f31ff1b70fe5784bae36fcbab40725d974a67";
27
27
  export declare const MINIMUM_LIQUIDITY: JSBI;
28
28
  export declare const ZERO: JSBI;
@@ -44,7 +44,7 @@ var _SOLIDITY_TYPE_MAXIMA;
44
44
  Rounding[Rounding["ROUND_UP"] = 2] = "ROUND_UP";
45
45
  })(exports.Rounding || (exports.Rounding = {}));
46
46
 
47
- var FACTORY_ADDRESS = '0x063af7b01B067eE135344FEf85d6Aecea14CFA05';
47
+ var FACTORY_ADDRESS = '0x0dE70757dE21FAcD23c3aEb46e8bE20620b5269f';
48
48
  var INIT_CODE_HASH = '0x6c0dd0b3d906c70e40fd9e96936f31ff1b70fe5784bae36fcbab40725d974a67';
49
49
  var MINIMUM_LIQUIDITY = /*#__PURE__*/JSBI.BigInt(1000); // exports for internal consumption
50
50
 
@@ -1 +1 @@
1
- {"version":3,"file":"u-exchange-sdk.cjs.development.js","sources":["../src/constants.ts","../src/errors.ts","../src/utils.ts","../src/entities/currency.ts","../src/entities/token.ts","../src/entities/fractions/fraction.ts","../src/entities/fractions/currencyAmount.ts","../src/entities/fractions/tokenAmount.ts","../src/entities/fractions/price.ts","../src/entities/pair.ts","../src/entities/route.ts","../src/entities/fractions/percent.ts","../src/entities/trade.ts","../src/router.ts","../src/fetcher.ts"],"sourcesContent":["import JSBI from 'jsbi'\r\n\r\n// exports for external consumption\r\nexport type BigintIsh = JSBI | bigint | string\r\n\r\nexport enum ChainId {\r\n MAINNET = 1,\r\n ROPSTEN = 3,\r\n RINKEBY = 4,\r\n GÖRLI = 5,\r\n RSK = 30,\r\n RSKTEST = 31,\r\n KOVAN = 42,\r\n BINANCE = 56,\r\n BINANCETEST = 97,\r\n XDAI = 100,\r\n POLYGON = 137\r\n}\r\n\r\nexport enum TradeType {\r\n EXACT_INPUT,\r\n EXACT_OUTPUT\r\n}\r\n\r\nexport enum Rounding {\r\n ROUND_DOWN,\r\n ROUND_HALF_UP,\r\n ROUND_UP\r\n}\r\n\r\nexport const FACTORY_ADDRESS = '0x063af7b01B067eE135344FEf85d6Aecea14CFA05'\r\n\r\nexport const INIT_CODE_HASH = '0x6c0dd0b3d906c70e40fd9e96936f31ff1b70fe5784bae36fcbab40725d974a67'\r\n\r\nexport const MINIMUM_LIQUIDITY = JSBI.BigInt(1000)\r\n\r\n// exports for internal consumption\r\nexport const ZERO = JSBI.BigInt(0)\r\nexport const ONE = JSBI.BigInt(1)\r\nexport const TWO = JSBI.BigInt(2)\r\nexport const THREE = JSBI.BigInt(3)\r\nexport const FIVE = JSBI.BigInt(5)\r\nexport const TEN = JSBI.BigInt(10)\r\nexport const _100 = JSBI.BigInt(100)\r\nexport const _997 = JSBI.BigInt(997)\r\nexport const _1000 = JSBI.BigInt(1000)\r\n\r\nexport enum SolidityType {\r\n uint8 = 'uint8',\r\n uint256 = 'uint256'\r\n}\r\n\r\nexport const SOLIDITY_TYPE_MAXIMA = {\r\n [SolidityType.uint8]: JSBI.BigInt('0xff'),\r\n [SolidityType.uint256]: JSBI.BigInt('0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff')\r\n}\r\n","// see https://stackoverflow.com/a/41102306\r\nconst CAN_SET_PROTOTYPE = 'setPrototypeOf' in Object\r\n\r\n/**\r\n * Indicates that the pair has insufficient reserves for a desired output amount. I.e. the amount of output cannot be\r\n * obtained by sending any amount of input.\r\n */\r\nexport class InsufficientReservesError extends Error {\r\n public readonly isInsufficientReservesError: true = true\r\n\r\n public constructor() {\r\n super()\r\n this.name = this.constructor.name\r\n if (CAN_SET_PROTOTYPE) Object.setPrototypeOf(this, new.target.prototype)\r\n }\r\n}\r\n\r\n/**\r\n * Indicates that the input amount is too small to produce any amount of output. I.e. the amount of input sent is less\r\n * than the price of a single unit of output after fees.\r\n */\r\nexport class InsufficientInputAmountError extends Error {\r\n public readonly isInsufficientInputAmountError: true = true\r\n\r\n public constructor() {\r\n super()\r\n this.name = this.constructor.name\r\n if (CAN_SET_PROTOTYPE) Object.setPrototypeOf(this, new.target.prototype)\r\n }\r\n}\r\n","import invariant from 'tiny-invariant'\r\nimport warning from 'tiny-warning'\r\nimport JSBI from 'jsbi'\r\nimport { getAddress } from '@ethersproject/address'\r\n\r\nimport { BigintIsh, ZERO, ONE, TWO, THREE, SolidityType, SOLIDITY_TYPE_MAXIMA } from './constants'\r\n\r\nexport function validateSolidityTypeInstance(value: JSBI, solidityType: SolidityType): void {\r\n invariant(JSBI.greaterThanOrEqual(value, ZERO), `${value} is not a ${solidityType}.`)\r\n invariant(JSBI.lessThanOrEqual(value, SOLIDITY_TYPE_MAXIMA[solidityType]), `${value} is not a ${solidityType}.`)\r\n}\r\n\r\n// warns if addresses are not checksummed\r\nexport function validateAndParseAddress(address: string): string {\r\n try {\r\n const checksummedAddress = getAddress(address)\r\n warning(address === checksummedAddress, `${address} is not checksummed.`)\r\n return checksummedAddress\r\n } catch (error) {\r\n invariant(false, `${address} is not a valid address.`)\r\n }\r\n}\r\n\r\nexport function parseBigintIsh(bigintIsh: BigintIsh): JSBI {\r\n return bigintIsh instanceof JSBI\r\n ? bigintIsh\r\n : typeof bigintIsh === 'bigint'\r\n ? JSBI.BigInt(bigintIsh.toString())\r\n : JSBI.BigInt(bigintIsh)\r\n}\r\n\r\n// mock the on-chain sqrt function\r\nexport function sqrt(y: JSBI): JSBI {\r\n validateSolidityTypeInstance(y, SolidityType.uint256)\r\n let z: JSBI = ZERO\r\n let x: JSBI\r\n if (JSBI.greaterThan(y, THREE)) {\r\n z = y\r\n x = JSBI.add(JSBI.divide(y, TWO), ONE)\r\n while (JSBI.lessThan(x, z)) {\r\n z = x\r\n x = JSBI.divide(JSBI.add(JSBI.divide(y, x), x), TWO)\r\n }\r\n } else if (JSBI.notEqual(y, ZERO)) {\r\n z = ONE\r\n }\r\n return z\r\n}\r\n\r\n// given an array of items sorted by `comparator`, insert an item into its sort index and constrain the size to\r\n// `maxSize` by removing the last item\r\nexport function sortedInsert<T>(items: T[], add: T, maxSize: number, comparator: (a: T, b: T) => number): T | null {\r\n invariant(maxSize > 0, 'MAX_SIZE_ZERO')\r\n // this is an invariant because the interface cannot return multiple removed items if items.length exceeds maxSize\r\n invariant(items.length <= maxSize, 'ITEMS_SIZE')\r\n\r\n // short circuit first item add\r\n if (items.length === 0) {\r\n items.push(add)\r\n return null\r\n } else {\r\n const isFull = items.length === maxSize\r\n // short circuit if full and the additional item does not come before the last item\r\n if (isFull && comparator(items[items.length - 1], add) <= 0) {\r\n return add\r\n }\r\n\r\n let lo = 0,\r\n hi = items.length\r\n\r\n while (lo < hi) {\r\n const mid = (lo + hi) >>> 1\r\n if (comparator(items[mid], add) <= 0) {\r\n lo = mid + 1\r\n } else {\r\n hi = mid\r\n }\r\n }\r\n items.splice(lo, 0, add)\r\n return isFull ? items.pop()! : null\r\n }\r\n}\r\n","import JSBI from 'jsbi'\r\n\r\nimport { SolidityType } from '../constants'\r\nimport { validateSolidityTypeInstance } from '../utils'\r\n\r\n/**\r\n * A currency is any fungible financial instrument on Ethereum, including Ether and all ERC20 tokens.\r\n *\r\n * The only instance of the base class `Currency` is Ether.\r\n */\r\nexport class Currency {\r\n public decimals: number\r\n public symbol?: string\r\n public name?: string\r\n\r\n /**\r\n * The only instance of the base class `Currency`.\r\n */\r\n public static ETHER: Currency = new Currency(18, 'BNB', 'BNB')\r\n\r\n\r\n /**\r\n * Constructs an instance of the base class `Currency`. The only instance of the base class `Currency` is `Currency.ETHER`.\r\n * @param decimals decimals of the currency\r\n * @param symbol symbol of the currency\r\n * @param name of the currency\r\n */\r\n protected constructor(decimals: number, symbol?: string, name?: string) {\r\n validateSolidityTypeInstance(JSBI.BigInt(decimals), SolidityType.uint8)\r\n\r\n this.decimals = decimals\r\n this.symbol = symbol\r\n this.name = name\r\n }\r\n\r\n change(cId:number){\r\n if(cId==1){\r\n ETHER.name = \"Ether\"\r\n ETHER.symbol = \"ETH\"\r\n }\r\n if(cId==56){\r\n ETHER.name = \"BNB\"\r\n ETHER.symbol = \"BNB\"\r\n }\r\n if(cId==137){\r\n ETHER.name = \"Matic\"\r\n ETHER.symbol = \"MATIC\"\r\n }\r\n if(cId==30){\r\n ETHER.name = \"Smart Bitcoin\"\r\n ETHER.symbol = \"RBTC\"\r\n }\r\n if(cId==31){\r\n ETHER.name = \"Smart Bitcoin\"\r\n ETHER.symbol = \"tRBTC\"\r\n }\r\n }\r\n}\r\n\r\nconst ETHER = Currency.ETHER\r\nexport { ETHER }\r\n","import invariant from 'tiny-invariant'\r\nimport { ChainId } from '../constants'\r\nimport { validateAndParseAddress } from '../utils'\r\nimport { Currency } from './currency'\r\n\r\n/**\r\n * Represents an ERC20 token with a unique address and some metadata.\r\n */\r\nexport class Token extends Currency {\r\n public readonly chainId: ChainId\r\n public readonly address: string\r\n\r\n public constructor(chainId: ChainId, address: string, decimals: number, symbol?: string, name?: string) {\r\n super(decimals, symbol, name)\r\n this.chainId = chainId\r\n this.address = validateAndParseAddress(address)\r\n }\r\n\r\n /**\r\n * Returns true if the two tokens are equivalent, i.e. have the same chainId and address.\r\n * @param other other token to compare\r\n */\r\n public equals(other: Token): boolean {\r\n // short circuit on reference equality\r\n if (this === other) {\r\n return true\r\n }\r\n return this.chainId === other.chainId && this.address === other.address\r\n }\r\n\r\n /**\r\n * Returns true if the address of this token sorts before the address of the other token\r\n * @param other other token to compare\r\n * @throws if the tokens have the same address\r\n * @throws if the tokens are on different chains\r\n */\r\n public sortsBefore(other: Token): boolean {\r\n invariant(this.chainId === other.chainId, 'CHAIN_IDS')\r\n invariant(this.address !== other.address, 'ADDRESSES')\r\n return this.address.toLowerCase() < other.address.toLowerCase()\r\n }\r\n}\r\n\r\n/**\r\n * Compares two currencies for equality\r\n */\r\nexport function currencyEquals(currencyA: Currency, currencyB: Currency): boolean {\r\n if (currencyA instanceof Token && currencyB instanceof Token) {\r\n return currencyA.equals(currencyB)\r\n } else if (currencyA instanceof Token) {\r\n return false\r\n } else if (currencyB instanceof Token) {\r\n return false\r\n } else {\r\n return currencyA === currencyB\r\n }\r\n}\r\n\r\nexport const WETH = {\r\n [ChainId.MAINNET]: new Token(\r\n ChainId.MAINNET,\r\n '0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2',\r\n 18,\r\n 'WETH',\r\n 'Wrapped Ether'\r\n ),\r\n [ChainId.ROPSTEN]: new Token(\r\n ChainId.ROPSTEN,\r\n '0xc778417E063141139Fce010982780140Aa0cD5Ab',\r\n 18,\r\n 'WETH',\r\n 'Wrapped Ether'\r\n ),\r\n [ChainId.RINKEBY]: new Token(\r\n ChainId.RINKEBY,\r\n '0xc778417E063141139Fce010982780140Aa0cD5Ab',\r\n 18,\r\n 'WETH',\r\n 'Wrapped Ether'\r\n ),\r\n [ChainId.GÖRLI]: new Token(ChainId.GÖRLI, '0xB4FBF271143F4FBf7B91A5ded31805e42b2208d6', 18, 'WETH', 'Wrapped Ether'),\r\n [ChainId.KOVAN]: new Token(ChainId.KOVAN, '0xd0A1E359811322d97991E03f863a0C30C2cF029C', 18, 'WETH', 'Wrapped Ether'),\r\n [ChainId.BINANCE]: new Token(ChainId.BINANCE, '0xbb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c', 18, 'WBNB', 'Wrapped BNB'),\r\n [ChainId.BINANCETEST]: new Token(ChainId.BINANCETEST, '0xbb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c', 18, 'WBNB', 'Wrapped BNB'),\r\n [ChainId.RSK]: new Token(ChainId.RSK, '0xFa26ecdA879AC88AfD047cc6e046E85B9aFBa2CC', 18, 'WrBTC', 'Wrapped rBTC'),\r\n [ChainId.RSKTEST]: new Token(ChainId.RSKTEST, '0xbb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c', 18, 'WBNB', 'Wrapped BNB'),\r\n [ChainId.XDAI]: new Token(ChainId.XDAI, '0xe91D153E0b41518A2Ce8Dd3D7944Fa863463a97d', 18, 'WXDAI', 'Wrapped XDAI'),\r\n [ChainId.POLYGON]: new Token(ChainId.POLYGON, '0x0d500b1d8e8ef31e21c99d1db9a6444d3adf1270', 18, 'WMATIC', 'Wrapped Matic'),\r\n}\r\n","import invariant from 'tiny-invariant'\r\nimport JSBI from 'jsbi'\r\nimport _Decimal from 'decimal.js-light'\r\nimport _Big, { RoundingMode } from 'big.js'\r\nimport toFormat from 'toformat'\r\n\r\nimport { BigintIsh, Rounding } from '../../constants'\r\nimport { ONE } from '../../constants'\r\nimport { parseBigintIsh } from '../../utils'\r\n\r\nconst Decimal = toFormat(_Decimal)\r\nconst Big = toFormat(_Big)\r\n\r\nconst toSignificantRounding = {\r\n [Rounding.ROUND_DOWN]: Decimal.ROUND_DOWN,\r\n [Rounding.ROUND_HALF_UP]: Decimal.ROUND_HALF_UP,\r\n [Rounding.ROUND_UP]: Decimal.ROUND_UP\r\n}\r\n\r\nconst toFixedRounding = {\r\n [Rounding.ROUND_DOWN]: RoundingMode.RoundDown,\r\n [Rounding.ROUND_HALF_UP]: RoundingMode.RoundHalfUp,\r\n [Rounding.ROUND_UP]: RoundingMode.RoundUp\r\n}\r\n\r\nexport class Fraction {\r\n public readonly numerator: JSBI\r\n public readonly denominator: JSBI\r\n\r\n public constructor(numerator: BigintIsh, denominator: BigintIsh = ONE) {\r\n this.numerator = parseBigintIsh(numerator)\r\n this.denominator = parseBigintIsh(denominator)\r\n }\r\n\r\n // performs floor division\r\n public get quotient(): JSBI {\r\n return JSBI.divide(this.numerator, this.denominator)\r\n }\r\n\r\n // remainder after floor division\r\n public get remainder(): Fraction {\r\n return new Fraction(JSBI.remainder(this.numerator, this.denominator), this.denominator)\r\n }\r\n\r\n public invert(): Fraction {\r\n return new Fraction(this.denominator, this.numerator)\r\n }\r\n\r\n public add(other: Fraction | BigintIsh): Fraction {\r\n const otherParsed = other instanceof Fraction ? other : new Fraction(parseBigintIsh(other))\r\n if (JSBI.equal(this.denominator, otherParsed.denominator)) {\r\n return new Fraction(JSBI.add(this.numerator, otherParsed.numerator), this.denominator)\r\n }\r\n return new Fraction(\r\n JSBI.add(\r\n JSBI.multiply(this.numerator, otherParsed.denominator),\r\n JSBI.multiply(otherParsed.numerator, this.denominator)\r\n ),\r\n JSBI.multiply(this.denominator, otherParsed.denominator)\r\n )\r\n }\r\n\r\n public subtract(other: Fraction | BigintIsh): Fraction {\r\n const otherParsed = other instanceof Fraction ? other : new Fraction(parseBigintIsh(other))\r\n if (JSBI.equal(this.denominator, otherParsed.denominator)) {\r\n return new Fraction(JSBI.subtract(this.numerator, otherParsed.numerator), this.denominator)\r\n }\r\n return new Fraction(\r\n JSBI.subtract(\r\n JSBI.multiply(this.numerator, otherParsed.denominator),\r\n JSBI.multiply(otherParsed.numerator, this.denominator)\r\n ),\r\n JSBI.multiply(this.denominator, otherParsed.denominator)\r\n )\r\n }\r\n\r\n public lessThan(other: Fraction | BigintIsh): boolean {\r\n const otherParsed = other instanceof Fraction ? other : new Fraction(parseBigintIsh(other))\r\n return JSBI.lessThan(\r\n JSBI.multiply(this.numerator, otherParsed.denominator),\r\n JSBI.multiply(otherParsed.numerator, this.denominator)\r\n )\r\n }\r\n\r\n public equalTo(other: Fraction | BigintIsh): boolean {\r\n const otherParsed = other instanceof Fraction ? other : new Fraction(parseBigintIsh(other))\r\n return JSBI.equal(\r\n JSBI.multiply(this.numerator, otherParsed.denominator),\r\n JSBI.multiply(otherParsed.numerator, this.denominator)\r\n )\r\n }\r\n\r\n public greaterThan(other: Fraction | BigintIsh): boolean {\r\n const otherParsed = other instanceof Fraction ? other : new Fraction(parseBigintIsh(other))\r\n return JSBI.greaterThan(\r\n JSBI.multiply(this.numerator, otherParsed.denominator),\r\n JSBI.multiply(otherParsed.numerator, this.denominator)\r\n )\r\n }\r\n\r\n public multiply(other: Fraction | BigintIsh): Fraction {\r\n const otherParsed = other instanceof Fraction ? other : new Fraction(parseBigintIsh(other))\r\n return new Fraction(\r\n JSBI.multiply(this.numerator, otherParsed.numerator),\r\n JSBI.multiply(this.denominator, otherParsed.denominator)\r\n )\r\n }\r\n\r\n public divide(other: Fraction | BigintIsh): Fraction {\r\n const otherParsed = other instanceof Fraction ? other : new Fraction(parseBigintIsh(other))\r\n return new Fraction(\r\n JSBI.multiply(this.numerator, otherParsed.denominator),\r\n JSBI.multiply(this.denominator, otherParsed.numerator)\r\n )\r\n }\r\n\r\n public toSignificant(\r\n significantDigits: number,\r\n format: object = { groupSeparator: '' },\r\n rounding: Rounding = Rounding.ROUND_HALF_UP\r\n ): string {\r\n invariant(Number.isInteger(significantDigits), `${significantDigits} is not an integer.`)\r\n invariant(significantDigits > 0, `${significantDigits} is not positive.`)\r\n\r\n Decimal.set({ precision: significantDigits + 1, rounding: toSignificantRounding[rounding] })\r\n const quotient = new Decimal(this.numerator.toString())\r\n .div(this.denominator.toString())\r\n .toSignificantDigits(significantDigits)\r\n return quotient.toFormat(quotient.decimalPlaces(), format)\r\n }\r\n\r\n public toFixed(\r\n decimalPlaces: number,\r\n format: object = { groupSeparator: '' },\r\n rounding: Rounding = Rounding.ROUND_HALF_UP\r\n ): string {\r\n invariant(Number.isInteger(decimalPlaces), `${decimalPlaces} is not an integer.`)\r\n invariant(decimalPlaces >= 0, `${decimalPlaces} is negative.`)\r\n\r\n Big.DP = decimalPlaces\r\n Big.RM = toFixedRounding[rounding]\r\n return new Big(this.numerator.toString()).div(this.denominator.toString()).toFormat(decimalPlaces, format)\r\n }\r\n}\r\n","import { currencyEquals } from '../token'\r\nimport { Currency, ETHER } from '../currency'\r\nimport invariant from 'tiny-invariant'\r\nimport JSBI from 'jsbi'\r\nimport _Big from 'big.js'\r\nimport toFormat from 'toformat'\r\n\r\nimport { BigintIsh, Rounding, TEN, SolidityType } from '../../constants'\r\nimport { parseBigintIsh, validateSolidityTypeInstance } from '../../utils'\r\nimport { Fraction } from './fraction'\r\n\r\nconst Big = toFormat(_Big)\r\n\r\nexport class CurrencyAmount extends Fraction {\r\n public readonly currency: Currency\r\n\r\n /**\r\n * Helper that calls the constructor with the ETHER currency\r\n * @param amount ether amount in wei\r\n */\r\n public static ether(amount: BigintIsh): CurrencyAmount {\r\n return new CurrencyAmount(ETHER, amount)\r\n }\r\n\r\n // amount _must_ be raw, i.e. in the native representation\r\n protected constructor(currency: Currency, amount: BigintIsh) {\r\n const parsedAmount = parseBigintIsh(amount)\r\n validateSolidityTypeInstance(parsedAmount, SolidityType.uint256)\r\n\r\n super(parsedAmount, JSBI.exponentiate(TEN, JSBI.BigInt(currency.decimals)))\r\n this.currency = currency\r\n }\r\n\r\n public get raw(): JSBI {\r\n return this.numerator\r\n }\r\n\r\n public add(other: CurrencyAmount): CurrencyAmount {\r\n invariant(currencyEquals(this.currency, other.currency), 'TOKEN')\r\n return new CurrencyAmount(this.currency, JSBI.add(this.raw, other.raw))\r\n }\r\n\r\n public subtract(other: CurrencyAmount): CurrencyAmount {\r\n invariant(currencyEquals(this.currency, other.currency), 'TOKEN')\r\n return new CurrencyAmount(this.currency, JSBI.subtract(this.raw, other.raw))\r\n }\r\n\r\n public toSignificant(\r\n significantDigits: number = 6,\r\n format?: object,\r\n rounding: Rounding = Rounding.ROUND_DOWN\r\n ): string {\r\n return super.toSignificant(significantDigits, format, rounding)\r\n }\r\n\r\n public toFixed(\r\n decimalPlaces: number = this.currency.decimals,\r\n format?: object,\r\n rounding: Rounding = Rounding.ROUND_DOWN\r\n ): string {\r\n invariant(decimalPlaces <= this.currency.decimals, 'DECIMALS')\r\n return super.toFixed(decimalPlaces, format, rounding)\r\n }\r\n\r\n public toExact(format: object = { groupSeparator: '' }): string {\r\n Big.DP = this.currency.decimals\r\n return new Big(this.numerator.toString()).div(this.denominator.toString()).toFormat(format)\r\n }\r\n}\r\n","import { CurrencyAmount } from './currencyAmount'\r\nimport { Token } from '../token'\r\nimport invariant from 'tiny-invariant'\r\nimport JSBI from 'jsbi'\r\n\r\nimport { BigintIsh } from '../../constants'\r\n\r\nexport class TokenAmount extends CurrencyAmount {\r\n public readonly token: Token\r\n\r\n // amount _must_ be raw, i.e. in the native representation\r\n public constructor(token: Token, amount: BigintIsh) {\r\n super(token, amount)\r\n this.token = token\r\n }\r\n\r\n public add(other: TokenAmount): TokenAmount {\r\n invariant(this.token.equals(other.token), 'TOKEN')\r\n return new TokenAmount(this.token, JSBI.add(this.raw, other.raw))\r\n }\r\n\r\n public subtract(other: TokenAmount): TokenAmount {\r\n invariant(this.token.equals(other.token), 'TOKEN')\r\n return new TokenAmount(this.token, JSBI.subtract(this.raw, other.raw))\r\n }\r\n}\r\n","import { Token } from '../token'\r\nimport { TokenAmount } from './tokenAmount'\r\nimport { currencyEquals } from '../token'\r\nimport invariant from 'tiny-invariant'\r\nimport JSBI from 'jsbi'\r\n\r\nimport { BigintIsh, Rounding, TEN } from '../../constants'\r\nimport { Currency } from '../currency'\r\nimport { Route } from '../route'\r\nimport { Fraction } from './fraction'\r\nimport { CurrencyAmount } from './currencyAmount'\r\n\r\nexport class Price extends Fraction {\r\n public readonly baseCurrency: Currency // input i.e. denominator\r\n public readonly quoteCurrency: Currency // output i.e. numerator\r\n public readonly scalar: Fraction // used to adjust the raw fraction w/r/t the decimals of the {base,quote}Token\r\n\r\n public static fromRoute(route: Route): Price {\r\n const prices: Price[] = []\r\n for (const [i, pair] of route.pairs.entries()) {\r\n prices.push(\r\n route.path[i].equals(pair.token0)\r\n ? new Price(pair.reserve0.currency, pair.reserve1.currency, pair.reserve0.raw, pair.reserve1.raw)\r\n : new Price(pair.reserve1.currency, pair.reserve0.currency, pair.reserve1.raw, pair.reserve0.raw)\r\n )\r\n }\r\n return prices.slice(1).reduce((accumulator, currentValue) => accumulator.multiply(currentValue), prices[0])\r\n }\r\n\r\n // denominator and numerator _must_ be raw, i.e. in the native representation\r\n public constructor(baseCurrency: Currency, quoteCurrency: Currency, denominator: BigintIsh, numerator: BigintIsh) {\r\n super(numerator, denominator)\r\n\r\n this.baseCurrency = baseCurrency\r\n this.quoteCurrency = quoteCurrency\r\n this.scalar = new Fraction(\r\n JSBI.exponentiate(TEN, JSBI.BigInt(baseCurrency.decimals)),\r\n JSBI.exponentiate(TEN, JSBI.BigInt(quoteCurrency.decimals))\r\n )\r\n }\r\n\r\n public get raw(): Fraction {\r\n return new Fraction(this.numerator, this.denominator)\r\n }\r\n\r\n public get adjusted(): Fraction {\r\n return super.multiply(this.scalar)\r\n }\r\n\r\n public invert(): Price {\r\n return new Price(this.quoteCurrency, this.baseCurrency, this.numerator, this.denominator)\r\n }\r\n\r\n public multiply(other: Price): Price {\r\n invariant(currencyEquals(this.quoteCurrency, other.baseCurrency), 'TOKEN')\r\n const fraction = super.multiply(other)\r\n return new Price(this.baseCurrency, other.quoteCurrency, fraction.denominator, fraction.numerator)\r\n }\r\n\r\n // performs floor division on overflow\r\n public quote(currencyAmount: CurrencyAmount): CurrencyAmount {\r\n invariant(currencyEquals(currencyAmount.currency, this.baseCurrency), 'TOKEN')\r\n if (this.quoteCurrency instanceof Token) {\r\n return new TokenAmount(this.quoteCurrency, super.multiply(currencyAmount.raw).quotient)\r\n }\r\n return CurrencyAmount.ether(super.multiply(currencyAmount.raw).quotient)\r\n }\r\n\r\n public toSignificant(significantDigits: number = 6, format?: object, rounding?: Rounding): string {\r\n return this.adjusted.toSignificant(significantDigits, format, rounding)\r\n }\r\n\r\n public toFixed(decimalPlaces: number = 4, format?: object, rounding?: Rounding): string {\r\n return this.adjusted.toFixed(decimalPlaces, format, rounding)\r\n }\r\n}\r\n","import { Price } from './fractions/price'\r\nimport { TokenAmount } from './fractions/tokenAmount'\r\nimport invariant from 'tiny-invariant'\r\nimport JSBI from 'jsbi'\r\nimport { pack, keccak256 } from '@ethersproject/solidity'\r\nimport { getCreate2Address } from '@ethersproject/address'\r\n\r\nimport {\r\n BigintIsh,\r\n FACTORY_ADDRESS,\r\n INIT_CODE_HASH,\r\n MINIMUM_LIQUIDITY,\r\n ZERO,\r\n ONE,\r\n FIVE,\r\n _997,\r\n _1000,\r\n ChainId\r\n} from '../constants'\r\nimport { sqrt, parseBigintIsh } from '../utils'\r\nimport { InsufficientReservesError, InsufficientInputAmountError } from '../errors'\r\nimport { Token } from './token'\r\n\r\nlet PAIR_ADDRESS_CACHE: { [token0Address: string]: { [token1Address: string]: string } } = {}\r\n\r\nexport class Pair {\r\n public readonly liquidityToken: Token\r\n private readonly tokenAmounts: [TokenAmount, TokenAmount]\r\n\r\n public static getAddress(tokenA: Token, tokenB: Token): string {\r\n const tokens = tokenA.sortsBefore(tokenB) ? [tokenA, tokenB] : [tokenB, tokenA] // does safety checks\r\n\r\n if (PAIR_ADDRESS_CACHE?.[tokens[0].address]?.[tokens[1].address] === undefined) {\r\n PAIR_ADDRESS_CACHE = {\r\n ...PAIR_ADDRESS_CACHE,\r\n [tokens[0].address]: {\r\n ...PAIR_ADDRESS_CACHE?.[tokens[0].address],\r\n [tokens[1].address]: getCreate2Address(\r\n FACTORY_ADDRESS,\r\n keccak256(['bytes'], [pack(['address', 'address'], [tokens[0].address, tokens[1].address])]),\r\n INIT_CODE_HASH\r\n )\r\n }\r\n }\r\n }\r\n\r\n return PAIR_ADDRESS_CACHE[tokens[0].address][tokens[1].address]\r\n }\r\n\r\n public constructor(tokenAmountA: TokenAmount, tokenAmountB: TokenAmount) {\r\n const tokenAmounts = tokenAmountA.token.sortsBefore(tokenAmountB.token) // does safety checks\r\n ? [tokenAmountA, tokenAmountB]\r\n : [tokenAmountB, tokenAmountA]\r\n this.liquidityToken = new Token(\r\n tokenAmounts[0].token.chainId,\r\n Pair.getAddress(tokenAmounts[0].token, tokenAmounts[1].token),\r\n 18,\r\n 'UNI-V2',\r\n 'Uniswap V2'\r\n )\r\n this.tokenAmounts = tokenAmounts as [TokenAmount, TokenAmount]\r\n }\r\n\r\n /**\r\n * Returns true if the token is either token0 or token1\r\n * @param token to check\r\n */\r\n public involvesToken(token: Token): boolean {\r\n return token.equals(this.token0) || token.equals(this.token1)\r\n }\r\n\r\n /**\r\n * Returns the current mid price of the pair in terms of token0, i.e. the ratio of reserve1 to reserve0\r\n */\r\n public get token0Price(): Price {\r\n return new Price(this.token0, this.token1, this.tokenAmounts[0].raw, this.tokenAmounts[1].raw)\r\n }\r\n\r\n /**\r\n * Returns the current mid price of the pair in terms of token1, i.e. the ratio of reserve0 to reserve1\r\n */\r\n public get token1Price(): Price {\r\n return new Price(this.token1, this.token0, this.tokenAmounts[1].raw, this.tokenAmounts[0].raw)\r\n }\r\n\r\n /**\r\n * Return the price of the given token in terms of the other token in the pair.\r\n * @param token token to return price of\r\n */\r\n public priceOf(token: Token): Price {\r\n invariant(this.involvesToken(token), 'TOKEN')\r\n return token.equals(this.token0) ? this.token0Price : this.token1Price\r\n }\r\n\r\n /**\r\n * Returns the chain ID of the tokens in the pair.\r\n */\r\n public get chainId(): ChainId {\r\n return this.token0.chainId\r\n }\r\n\r\n public get token0(): Token {\r\n return this.tokenAmounts[0].token\r\n }\r\n\r\n public get token1(): Token {\r\n return this.tokenAmounts[1].token\r\n }\r\n\r\n public get reserve0(): TokenAmount {\r\n return this.tokenAmounts[0]\r\n }\r\n\r\n public get reserve1(): TokenAmount {\r\n return this.tokenAmounts[1]\r\n }\r\n\r\n public reserveOf(token: Token): TokenAmount {\r\n invariant(this.involvesToken(token), 'TOKEN')\r\n return token.equals(this.token0) ? this.reserve0 : this.reserve1\r\n }\r\n\r\n public getOutputAmount(inputAmount: TokenAmount): [TokenAmount, Pair] {\r\n invariant(this.involvesToken(inputAmount.token), 'TOKEN')\r\n if (JSBI.equal(this.reserve0.raw, ZERO) || JSBI.equal(this.reserve1.raw, ZERO)) {\r\n throw new InsufficientReservesError()\r\n }\r\n const inputReserve = this.reserveOf(inputAmount.token)\r\n const outputReserve = this.reserveOf(inputAmount.token.equals(this.token0) ? this.token1 : this.token0)\r\n const inputAmountWithFee = JSBI.multiply(inputAmount.raw, _997)\r\n const numerator = JSBI.multiply(inputAmountWithFee, outputReserve.raw)\r\n const denominator = JSBI.add(JSBI.multiply(inputReserve.raw, _1000), inputAmountWithFee)\r\n const outputAmount = new TokenAmount(\r\n inputAmount.token.equals(this.token0) ? this.token1 : this.token0,\r\n JSBI.divide(numerator, denominator)\r\n )\r\n if (JSBI.equal(outputAmount.raw, ZERO)) {\r\n throw new InsufficientInputAmountError()\r\n }\r\n return [outputAmount, new Pair(inputReserve.add(inputAmount), outputReserve.subtract(outputAmount))]\r\n }\r\n\r\n public getInputAmount(outputAmount: TokenAmount): [TokenAmount, Pair] {\r\n invariant(this.involvesToken(outputAmount.token), 'TOKEN')\r\n if (\r\n JSBI.equal(this.reserve0.raw, ZERO) ||\r\n JSBI.equal(this.reserve1.raw, ZERO) ||\r\n JSBI.greaterThanOrEqual(outputAmount.raw, this.reserveOf(outputAmount.token).raw)\r\n ) {\r\n throw new InsufficientReservesError()\r\n }\r\n\r\n const outputReserve = this.reserveOf(outputAmount.token)\r\n const inputReserve = this.reserveOf(outputAmount.token.equals(this.token0) ? this.token1 : this.token0)\r\n const numerator = JSBI.multiply(JSBI.multiply(inputReserve.raw, outputAmount.raw), _1000)\r\n const denominator = JSBI.multiply(JSBI.subtract(outputReserve.raw, outputAmount.raw), _997)\r\n const inputAmount = new TokenAmount(\r\n outputAmount.token.equals(this.token0) ? this.token1 : this.token0,\r\n JSBI.add(JSBI.divide(numerator, denominator), ONE)\r\n )\r\n return [inputAmount, new Pair(inputReserve.add(inputAmount), outputReserve.subtract(outputAmount))]\r\n }\r\n\r\n public getLiquidityMinted(\r\n totalSupply: TokenAmount,\r\n tokenAmountA: TokenAmount,\r\n tokenAmountB: TokenAmount\r\n ): TokenAmount {\r\n invariant(totalSupply.token.equals(this.liquidityToken), 'LIQUIDITY')\r\n const tokenAmounts = tokenAmountA.token.sortsBefore(tokenAmountB.token) // does safety checks\r\n ? [tokenAmountA, tokenAmountB]\r\n : [tokenAmountB, tokenAmountA]\r\n invariant(tokenAmounts[0].token.equals(this.token0) && tokenAmounts[1].token.equals(this.token1), 'TOKEN')\r\n\r\n let liquidity: JSBI\r\n if (JSBI.equal(totalSupply.raw, ZERO)) {\r\n liquidity = JSBI.subtract(sqrt(JSBI.multiply(tokenAmounts[0].raw, tokenAmounts[1].raw)), MINIMUM_LIQUIDITY)\r\n } else {\r\n const amount0 = JSBI.divide(JSBI.multiply(tokenAmounts[0].raw, totalSupply.raw), this.reserve0.raw)\r\n const amount1 = JSBI.divide(JSBI.multiply(tokenAmounts[1].raw, totalSupply.raw), this.reserve1.raw)\r\n liquidity = JSBI.lessThanOrEqual(amount0, amount1) ? amount0 : amount1\r\n }\r\n if (!JSBI.greaterThan(liquidity, ZERO)) {\r\n throw new InsufficientInputAmountError()\r\n }\r\n return new TokenAmount(this.liquidityToken, liquidity)\r\n }\r\n\r\n public getLiquidityValue(\r\n token: Token,\r\n totalSupply: TokenAmount,\r\n liquidity: TokenAmount,\r\n feeOn: boolean = false,\r\n kLast?: BigintIsh\r\n ): TokenAmount {\r\n invariant(this.involvesToken(token), 'TOKEN')\r\n invariant(totalSupply.token.equals(this.liquidityToken), 'TOTAL_SUPPLY')\r\n invariant(liquidity.token.equals(this.liquidityToken), 'LIQUIDITY')\r\n invariant(JSBI.lessThanOrEqual(liquidity.raw, totalSupply.raw), 'LIQUIDITY')\r\n\r\n let totalSupplyAdjusted: TokenAmount\r\n if (!feeOn) {\r\n totalSupplyAdjusted = totalSupply\r\n } else {\r\n invariant(!!kLast, 'K_LAST')\r\n const kLastParsed = parseBigintIsh(kLast)\r\n if (!JSBI.equal(kLastParsed, ZERO)) {\r\n const rootK = sqrt(JSBI.multiply(this.reserve0.raw, this.reserve1.raw))\r\n const rootKLast = sqrt(kLastParsed)\r\n if (JSBI.greaterThan(rootK, rootKLast)) {\r\n const numerator = JSBI.multiply(totalSupply.raw, JSBI.subtract(rootK, rootKLast))\r\n const denominator = JSBI.add(JSBI.multiply(rootK, FIVE), rootKLast)\r\n const feeLiquidity = JSBI.divide(numerator, denominator)\r\n totalSupplyAdjusted = totalSupply.add(new TokenAmount(this.liquidityToken, feeLiquidity))\r\n } else {\r\n totalSupplyAdjusted = totalSupply\r\n }\r\n } else {\r\n totalSupplyAdjusted = totalSupply\r\n }\r\n }\r\n\r\n return new TokenAmount(\r\n token,\r\n JSBI.divide(JSBI.multiply(liquidity.raw, this.reserveOf(token).raw), totalSupplyAdjusted.raw)\r\n )\r\n }\r\n}\r\n","import { ChainId } from '../constants'\r\nimport invariant from 'tiny-invariant'\r\n\r\nimport { Currency, ETHER } from './currency'\r\nimport { Token, WETH } from './token'\r\nimport { Pair } from './pair'\r\nimport { Price } from './fractions/price'\r\n\r\nexport class Route {\r\n public readonly pairs: Pair[]\r\n public readonly path: Token[]\r\n public readonly input: Currency\r\n public readonly output: Currency\r\n public readonly midPrice: Price\r\n\r\n public constructor(pairs: Pair[], input: Currency, output?: Currency) {\r\n invariant(pairs.length > 0, 'PAIRS')\r\n invariant(\r\n pairs.every(pair => pair.chainId === pairs[0].chainId),\r\n 'CHAIN_IDS'\r\n )\r\n invariant(\r\n (input instanceof Token && pairs[0].involvesToken(input)) ||\r\n (input === ETHER && pairs[0].involvesToken(WETH[pairs[0].chainId])),\r\n 'INPUT'\r\n )\r\n invariant(\r\n typeof output === 'undefined' ||\r\n (output instanceof Token && pairs[pairs.length - 1].involvesToken(output)) ||\r\n (output === ETHER && pairs[pairs.length - 1].involvesToken(WETH[pairs[0].chainId])),\r\n 'OUTPUT'\r\n )\r\n\r\n const path: Token[] = [input instanceof Token ? input : WETH[pairs[0].chainId]]\r\n for (const [i, pair] of pairs.entries()) {\r\n const currentInput = path[i]\r\n invariant(currentInput.equals(pair.token0) || currentInput.equals(pair.token1), 'PATH')\r\n const output = currentInput.equals(pair.token0) ? pair.token1 : pair.token0\r\n path.push(output)\r\n }\r\n\r\n this.pairs = pairs\r\n this.path = path\r\n this.midPrice = Price.fromRoute(this)\r\n this.input = input\r\n this.output = output ?? path[path.length - 1]\r\n }\r\n\r\n public get chainId(): ChainId {\r\n return this.pairs[0].chainId\r\n }\r\n}\r\n","import { Rounding, _100 } from '../../constants'\r\nimport { Fraction } from './fraction'\r\n\r\nconst _100_PERCENT = new Fraction(_100)\r\n\r\nexport class Percent extends Fraction {\r\n public toSignificant(significantDigits: number = 5, format?: object, rounding?: Rounding): string {\r\n return this.multiply(_100_PERCENT).toSignificant(significantDigits, format, rounding)\r\n }\r\n\r\n public toFixed(decimalPlaces: number = 2, format?: object, rounding?: Rounding): string {\r\n return this.multiply(_100_PERCENT).toFixed(decimalPlaces, format, rounding)\r\n }\r\n}\r\n","import invariant from 'tiny-invariant'\r\n\r\nimport { ChainId, ONE, TradeType, ZERO } from '../constants'\r\nimport { sortedInsert } from '../utils'\r\nimport { Currency, ETHER } from './currency'\r\nimport { CurrencyAmount } from './fractions/currencyAmount'\r\nimport { Fraction } from './fractions/fraction'\r\nimport { Percent } from './fractions/percent'\r\nimport { Price } from './fractions/price'\r\nimport { TokenAmount } from './fractions/tokenAmount'\r\nimport { Pair } from './pair'\r\nimport { Route } from './route'\r\nimport { currencyEquals, Token, WETH } from './token'\r\n\r\n/**\r\n * Returns the percent difference between the mid price and the execution price, i.e. price impact.\r\n * @param midPrice mid price before the trade\r\n * @param inputAmount the input amount of the trade\r\n * @param outputAmount the output amount of the trade\r\n */\r\nfunction computePriceImpact(midPrice: Price, inputAmount: CurrencyAmount, outputAmount: CurrencyAmount): Percent {\r\n const exactQuote = midPrice.raw.multiply(inputAmount.raw)\r\n // calculate slippage := (exactQuote - outputAmount) / exactQuote\r\n const slippage = exactQuote.subtract(outputAmount.raw).divide(exactQuote)\r\n return new Percent(slippage.numerator, slippage.denominator)\r\n}\r\n\r\n// minimal interface so the input output comparator may be shared across types\r\ninterface InputOutput {\r\n readonly inputAmount: CurrencyAmount\r\n readonly outputAmount: CurrencyAmount\r\n}\r\n\r\n// comparator function that allows sorting trades by their output amounts, in decreasing order, and then input amounts\r\n// in increasing order. i.e. the best trades have the most outputs for the least inputs and are sorted first\r\nexport function inputOutputComparator(a: InputOutput, b: InputOutput): number {\r\n // must have same input and output token for comparison\r\n invariant(currencyEquals(a.inputAmount.currency, b.inputAmount.currency), 'INPUT_CURRENCY')\r\n invariant(currencyEquals(a.outputAmount.currency, b.outputAmount.currency), 'OUTPUT_CURRENCY')\r\n if (a.outputAmount.equalTo(b.outputAmount)) {\r\n if (a.inputAmount.equalTo(b.inputAmount)) {\r\n return 0\r\n }\r\n // trade A requires less input than trade B, so A should come first\r\n if (a.inputAmount.lessThan(b.inputAmount)) {\r\n return -1\r\n } else {\r\n return 1\r\n }\r\n } else {\r\n // tradeA has less output than trade B, so should come second\r\n if (a.outputAmount.lessThan(b.outputAmount)) {\r\n return 1\r\n } else {\r\n return -1\r\n }\r\n }\r\n}\r\n\r\n// extension of the input output comparator that also considers other dimensions of the trade in ranking them\r\nexport function tradeComparator(a: Trade, b: Trade) {\r\n const ioComp = inputOutputComparator(a, b)\r\n if (ioComp !== 0) {\r\n return ioComp\r\n }\r\n\r\n // consider lowest slippage next, since these are less likely to fail\r\n if (a.priceImpact.lessThan(b.priceImpact)) {\r\n return -1\r\n } else if (a.priceImpact.greaterThan(b.priceImpact)) {\r\n return 1\r\n }\r\n\r\n // finally consider the number of hops since each hop costs gas\r\n return a.route.path.length - b.route.path.length\r\n}\r\n\r\nexport interface BestTradeOptions {\r\n // how many results to return\r\n maxNumResults?: number\r\n // the maximum number of hops a trade should contain\r\n maxHops?: number\r\n}\r\n\r\n/**\r\n * Given a currency amount and a chain ID, returns the equivalent representation as the token amount.\r\n * In other words, if the currency is ETHER, returns the WETH token amount for the given chain. Otherwise, returns\r\n * the input currency amount.\r\n */\r\nfunction wrappedAmount(currencyAmount: CurrencyAmount, chainId: ChainId): TokenAmount {\r\n if (currencyAmount instanceof TokenAmount) return currencyAmount\r\n if (currencyAmount.currency === ETHER) return new TokenAmount(WETH[chainId], currencyAmount.raw)\r\n invariant(false, 'CURRENCY')\r\n}\r\n\r\nfunction wrappedCurrency(currency: Currency, chainId: ChainId): Token {\r\n if (currency instanceof Token) return currency\r\n if (currency === ETHER) return WETH[chainId]\r\n invariant(false, 'CURRENCY')\r\n}\r\n\r\n/**\r\n * Represents a trade executed against a list of pairs.\r\n * Does not account for slippage, i.e. trades that front run this trade and move the price.\r\n */\r\nexport class Trade {\r\n /**\r\n * The route of the trade, i.e. which pairs the trade goes through.\r\n */\r\n public readonly route: Route\r\n /**\r\n * The type of the trade, either exact in or exact out.\r\n */\r\n public readonly tradeType: TradeType\r\n /**\r\n * The input amount for the trade assuming no slippage.\r\n */\r\n public readonly inputAmount: CurrencyAmount\r\n /**\r\n * The output amount for the trade assuming no slippage.\r\n */\r\n public readonly outputAmount: CurrencyAmount\r\n /**\r\n * The price expressed in terms of output amount/input amount.\r\n */\r\n public readonly executionPrice: Price\r\n /**\r\n * The mid price after the trade executes assuming no slippage.\r\n */\r\n public readonly nextMidPrice: Price\r\n /**\r\n * The percent difference between the mid price before the trade and the trade execution price.\r\n */\r\n public readonly priceImpact: Percent\r\n\r\n /**\r\n * Constructs an exact in trade with the given amount in and route\r\n * @param route route of the exact in trade\r\n * @param amountIn the amount being passed in\r\n */\r\n public static exactIn(route: Route, amountIn: CurrencyAmount): Trade {\r\n return new Trade(route, amountIn, TradeType.EXACT_INPUT)\r\n }\r\n\r\n /**\r\n * Constructs an exact out trade with the given amount out and route\r\n * @param route route of the exact out trade\r\n * @param amountOut the amount returned by the trade\r\n */\r\n public static exactOut(route: Route, amountOut: CurrencyAmount): Trade {\r\n return new Trade(route, amountOut, TradeType.EXACT_OUTPUT)\r\n }\r\n\r\n public constructor(route: Route, amount: CurrencyAmount, tradeType: TradeType) {\r\n const amounts: TokenAmount[] = new Array(route.path.length)\r\n const nextPairs: Pair[] = new Array(route.pairs.length)\r\n if (tradeType === TradeType.EXACT_INPUT) {\r\n invariant(currencyEquals(amount.currency, route.input), 'INPUT')\r\n amounts[0] = wrappedAmount(amount, route.chainId)\r\n for (let i = 0; i < route.path.length - 1; i++) {\r\n const pair = route.pairs[i]\r\n const [outputAmount, nextPair] = pair.getOutputAmount(amounts[i])\r\n amounts[i + 1] = outputAmount\r\n nextPairs[i] = nextPair\r\n }\r\n } else {\r\n invariant(currencyEquals(amount.currency, route.output), 'OUTPUT')\r\n amounts[amounts.length - 1] = wrappedAmount(amount, route.chainId)\r\n for (let i = route.path.length - 1; i > 0; i--) {\r\n const pair = route.pairs[i - 1]\r\n const [inputAmount, nextPair] = pair.getInputAmount(amounts[i])\r\n amounts[i - 1] = inputAmount\r\n nextPairs[i - 1] = nextPair\r\n }\r\n }\r\n\r\n this.route = route\r\n this.tradeType = tradeType\r\n this.inputAmount =\r\n tradeType === TradeType.EXACT_INPUT\r\n ? amount\r\n : route.input === ETHER\r\n ? CurrencyAmount.ether(amounts[0].raw)\r\n : amounts[0]\r\n this.outputAmount =\r\n tradeType === TradeType.EXACT_OUTPUT\r\n ? amount\r\n : route.output === ETHER\r\n ? CurrencyAmount.ether(amounts[amounts.length - 1].raw)\r\n : amounts[amounts.length - 1]\r\n this.executionPrice = new Price(\r\n this.inputAmount.currency,\r\n this.outputAmount.currency,\r\n this.inputAmount.raw,\r\n this.outputAmount.raw\r\n )\r\n this.nextMidPrice = Price.fromRoute(new Route(nextPairs, route.input))\r\n this.priceImpact = computePriceImpact(route.midPrice, this.inputAmount, this.outputAmount)\r\n }\r\n\r\n /**\r\n * Get the minimum amount that must be received from this trade for the given slippage tolerance\r\n * @param slippageTolerance tolerance of unfavorable slippage from the execution price of this trade\r\n */\r\n public minimumAmountOut(slippageTolerance: Percent): CurrencyAmount {\r\n invariant(!slippageTolerance.lessThan(ZERO), 'SLIPPAGE_TOLERANCE')\r\n if (this.tradeType === TradeType.EXACT_OUTPUT) {\r\n return this.outputAmount\r\n } else {\r\n const slippageAdjustedAmountOut = new Fraction(ONE)\r\n .add(slippageTolerance)\r\n .invert()\r\n .multiply(this.outputAmount.raw).quotient\r\n return this.outputAmount instanceof TokenAmount\r\n ? new TokenAmount(this.outputAmount.token, slippageAdjustedAmountOut)\r\n : CurrencyAmount.ether(slippageAdjustedAmountOut)\r\n }\r\n }\r\n\r\n /**\r\n * Get the maximum amount in that can be spent via this trade for the given slippage tolerance\r\n * @param slippageTolerance tolerance of unfavorable slippage from the execution price of this trade\r\n */\r\n public maximumAmountIn(slippageTolerance: Percent): CurrencyAmount {\r\n invariant(!slippageTolerance.lessThan(ZERO), 'SLIPPAGE_TOLERANCE')\r\n if (this.tradeType === TradeType.EXACT_INPUT) {\r\n return this.inputAmount\r\n } else {\r\n const slippageAdjustedAmountIn = new Fraction(ONE).add(slippageTolerance).multiply(this.inputAmount.raw).quotient\r\n return this.inputAmount instanceof TokenAmount\r\n ? new TokenAmount(this.inputAmount.token, slippageAdjustedAmountIn)\r\n : CurrencyAmount.ether(slippageAdjustedAmountIn)\r\n }\r\n }\r\n\r\n /**\r\n * Given a list of pairs, and a fixed amount in, returns the top `maxNumResults` trades that go from an input token\r\n * amount to an output token, making at most `maxHops` hops.\r\n * Note this does not consider aggregation, as routes are linear. It's possible a better route exists by splitting\r\n * the amount in among multiple routes.\r\n * @param pairs the pairs to consider in finding the best trade\r\n * @param currencyAmountIn exact amount of input currency to spend\r\n * @param currencyOut the desired currency out\r\n * @param maxNumResults maximum number of results to return\r\n * @param maxHops maximum number of hops a returned trade can make, e.g. 1 hop goes through a single pair\r\n * @param currentPairs used in recursion; the current list of pairs\r\n * @param originalAmountIn used in recursion; the original value of the currencyAmountIn parameter\r\n * @param bestTrades used in recursion; the current list of best trades\r\n */\r\n public static bestTradeExactIn(\r\n pairs: Pair[],\r\n currencyAmountIn: CurrencyAmount,\r\n currencyOut: Currency,\r\n { maxNumResults = 3, maxHops = 3 }: BestTradeOptions = {},\r\n // used in recursion.\r\n currentPairs: Pair[] = [],\r\n originalAmountIn: CurrencyAmount = currencyAmountIn,\r\n bestTrades: Trade[] = []\r\n ): Trade[] {\r\n invariant(pairs.length > 0, 'PAIRS')\r\n invariant(maxHops > 0, 'MAX_HOPS')\r\n invariant(originalAmountIn === currencyAmountIn || currentPairs.length > 0, 'INVALID_RECURSION')\r\n const chainId: ChainId | undefined =\r\n currencyAmountIn instanceof TokenAmount\r\n ? currencyAmountIn.token.chainId\r\n : currencyOut instanceof Token\r\n ? currencyOut.chainId\r\n : undefined\r\n invariant(chainId !== undefined, 'CHAIN_ID')\r\n\r\n const amountIn = wrappedAmount(currencyAmountIn, chainId)\r\n const tokenOut = wrappedCurrency(currencyOut, chainId)\r\n for (let i = 0; i < pairs.length; i++) {\r\n const pair = pairs[i]\r\n // pair irrelevant\r\n if (!pair.token0.equals(amountIn.token) && !pair.token1.equals(amountIn.token)) continue\r\n if (pair.reserve0.equalTo(ZERO) || pair.reserve1.equalTo(ZERO)) continue\r\n\r\n let amountOut: TokenAmount\r\n try {\r\n ;[amountOut] = pair.getOutputAmount(amountIn)\r\n } catch (error) {\r\n // input too low\r\n if (error.isInsufficientInputAmountError) {\r\n continue\r\n }\r\n throw error\r\n }\r\n // we have arrived at the output token, so this is the final trade of one of the paths\r\n if (amountOut.token.equals(tokenOut)) {\r\n sortedInsert(\r\n bestTrades,\r\n new Trade(\r\n new Route([...currentPairs, pair], originalAmountIn.currency, currencyOut),\r\n originalAmountIn,\r\n TradeType.EXACT_INPUT\r\n ),\r\n maxNumResults,\r\n tradeComparator\r\n )\r\n } else if (maxHops > 1 && pairs.length > 1) {\r\n const pairsExcludingThisPair = pairs.slice(0, i).concat(pairs.slice(i + 1, pairs.length))\r\n\r\n // otherwise, consider all the other paths that lead from this token as long as we have not exceeded maxHops\r\n Trade.bestTradeExactIn(\r\n pairsExcludingThisPair,\r\n amountOut,\r\n currencyOut,\r\n {\r\n maxNumResults,\r\n maxHops: maxHops - 1\r\n },\r\n [...currentPairs, pair],\r\n originalAmountIn,\r\n bestTrades\r\n )\r\n }\r\n }\r\n\r\n return bestTrades\r\n }\r\n\r\n /**\r\n * similar to the above method but instead targets a fixed output amount\r\n * given a list of pairs, and a fixed amount out, returns the top `maxNumResults` trades that go from an input token\r\n * to an output token amount, making at most `maxHops` hops\r\n * note this does not consider aggregation, as routes are linear. it's possible a better route exists by splitting\r\n * the amount in among multiple routes.\r\n * @param pairs the pairs to consider in finding the best trade\r\n * @param currencyIn the currency to spend\r\n * @param currencyAmountOut the exact amount of currency out\r\n * @param maxNumResults maximum number of results to return\r\n * @param maxHops maximum number of hops a returned trade can make, e.g. 1 hop goes through a single pair\r\n * @param currentPairs used in recursion; the current list of pairs\r\n * @param originalAmountOut used in recursion; the original value of the currencyAmountOut parameter\r\n * @param bestTrades used in recursion; the current list of best trades\r\n */\r\n public static bestTradeExactOut(\r\n pairs: Pair[],\r\n currencyIn: Currency,\r\n currencyAmountOut: CurrencyAmount,\r\n { maxNumResults = 3, maxHops = 3 }: BestTradeOptions = {},\r\n // used in recursion.\r\n currentPairs: Pair[] = [],\r\n originalAmountOut: CurrencyAmount = currencyAmountOut,\r\n bestTrades: Trade[] = []\r\n ): Trade[] {\r\n invariant(pairs.length > 0, 'PAIRS')\r\n invariant(maxHops > 0, 'MAX_HOPS')\r\n invariant(originalAmountOut === currencyAmountOut || currentPairs.length > 0, 'INVALID_RECURSION')\r\n const chainId: ChainId | undefined =\r\n currencyAmountOut instanceof TokenAmount\r\n ? currencyAmountOut.token.chainId\r\n : currencyIn instanceof Token\r\n ? currencyIn.chainId\r\n : undefined\r\n invariant(chainId !== undefined, 'CHAIN_ID')\r\n\r\n const amountOut = wrappedAmount(currencyAmountOut, chainId)\r\n const tokenIn = wrappedCurrency(currencyIn, chainId)\r\n for (let i = 0; i < pairs.length; i++) {\r\n const pair = pairs[i]\r\n // pair irrelevant\r\n if (!pair.token0.equals(amountOut.token) && !pair.token1.equals(amountOut.token)) continue\r\n if (pair.reserve0.equalTo(ZERO) || pair.reserve1.equalTo(ZERO)) continue\r\n\r\n let amountIn: TokenAmount\r\n try {\r\n ;[amountIn] = pair.getInputAmount(amountOut)\r\n } catch (error) {\r\n // not enough liquidity in this pair\r\n if (error.isInsufficientReservesError) {\r\n continue\r\n }\r\n throw error\r\n }\r\n // we have arrived at the input token, so this is the first trade of one of the paths\r\n if (amountIn.token.equals(tokenIn)) {\r\n sortedInsert(\r\n bestTrades,\r\n new Trade(\r\n new Route([pair, ...currentPairs], currencyIn, originalAmountOut.currency),\r\n originalAmountOut,\r\n TradeType.EXACT_OUTPUT\r\n ),\r\n maxNumResults,\r\n tradeComparator\r\n )\r\n } else if (maxHops > 1 && pairs.length > 1) {\r\n const pairsExcludingThisPair = pairs.slice(0, i).concat(pairs.slice(i + 1, pairs.length))\r\n\r\n // otherwise, consider all the other paths that arrive at this token as long as we have not exceeded maxHops\r\n Trade.bestTradeExactOut(\r\n pairsExcludingThisPair,\r\n currencyIn,\r\n amountIn,\r\n {\r\n maxNumResults,\r\n maxHops: maxHops - 1\r\n },\r\n [pair, ...currentPairs],\r\n originalAmountOut,\r\n bestTrades\r\n )\r\n }\r\n }\r\n\r\n return bestTrades\r\n }\r\n}\r\n","import { TradeType } from './constants'\r\nimport invariant from 'tiny-invariant'\r\nimport { validateAndParseAddress } from './utils'\r\nimport { CurrencyAmount, ETHER, Percent, Trade } from './entities'\r\n\r\n/**\r\n * Options for producing the arguments to send call to the router.\r\n */\r\nexport interface TradeOptions {\r\n /**\r\n * How much the execution price is allowed to move unfavorably from the trade execution price.\r\n */\r\n allowedSlippage: Percent\r\n /**\r\n * How long the swap is valid until it expires, in seconds.\r\n * This will be used to produce a `deadline` parameter which is computed from when the swap call parameters\r\n * are generated.\r\n */\r\n ttl: number\r\n /**\r\n * The account that should receive the output of the swap.\r\n */\r\n recipient: string\r\n\r\n /**\r\n * Whether any of the tokens in the path are fee on transfer tokens, which should be handled with special methods\r\n */\r\n feeOnTransfer?: boolean\r\n}\r\n\r\nexport interface TradeOptionsDeadline extends Omit<TradeOptions, 'ttl'> {\r\n /**\r\n * When the transaction expires.\r\n * This is an atlernate to specifying the ttl, for when you do not want to use local time.\r\n */\r\n deadline: number\r\n}\r\n\r\n/**\r\n * The parameters to use in the call to the Uniswap V2 Router to execute a trade.\r\n */\r\nexport interface SwapParameters {\r\n /**\r\n * The method to call on the Uniswap V2 Router.\r\n */\r\n methodName: string\r\n /**\r\n * The arguments to pass to the method, all hex encoded.\r\n */\r\n args: (string | string[])[]\r\n /**\r\n * The amount of wei to send in hex.\r\n */\r\n value: string\r\n}\r\n\r\nfunction toHex(currencyAmount: CurrencyAmount) {\r\n return `0x${currencyAmount.raw.toString(16)}`\r\n}\r\n\r\nconst ZERO_HEX = '0x0'\r\n\r\n/**\r\n * Represents the Uniswap V2 Router, and has static methods for helping execute trades.\r\n */\r\nexport abstract class Router {\r\n /**\r\n * Cannot be constructed.\r\n */\r\n private constructor() {}\r\n /**\r\n * Produces the on-chain method name to call and the hex encoded parameters to pass as arguments for a given trade.\r\n * @param trade to produce call parameters for\r\n * @param options options for the call parameters\r\n */\r\n public static swapCallParameters(trade: Trade, options: TradeOptions | TradeOptionsDeadline): SwapParameters {\r\n const etherIn = trade.inputAmount.currency === ETHER\r\n const etherOut = trade.outputAmount.currency === ETHER\r\n // the router does not support both ether in and out\r\n invariant(!(etherIn && etherOut), 'ETHER_IN_OUT')\r\n invariant(!('ttl' in options) || options.ttl > 0, 'TTL')\r\n\r\n const to: string = validateAndParseAddress(options.recipient)\r\n const amountIn: string = toHex(trade.maximumAmountIn(options.allowedSlippage))\r\n const amountOut: string = toHex(trade.minimumAmountOut(options.allowedSlippage))\r\n const path: string[] = trade.route.path.map(token => token.address)\r\n const deadline =\r\n 'ttl' in options\r\n ? `0x${(Math.floor(new Date().getTime() / 1000) + options.ttl).toString(16)}`\r\n : `0x${options.deadline.toString(16)}`\r\n\r\n const useFeeOnTransfer = Boolean(options.feeOnTransfer)\r\n\r\n let methodName: string\r\n let args: (string | string[])[]\r\n let value: string\r\n switch (trade.tradeType) {\r\n case TradeType.EXACT_INPUT:\r\n if (etherIn) {\r\n methodName = useFeeOnTransfer ? 'swapExactETHForTokensSupportingFeeOnTransferTokens' : 'swapExactETHForTokens'\r\n // (uint amountOutMin, address[] calldata path, address to, uint deadline)\r\n args = [amountOut, path, to, deadline]\r\n value = amountIn\r\n } else if (etherOut) {\r\n methodName = useFeeOnTransfer ? 'swapExactTokensForETHSupportingFeeOnTransferTokens' : 'swapExactTokensForETH'\r\n // (uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)\r\n args = [amountIn, amountOut, path, to, deadline]\r\n value = ZERO_HEX\r\n } else {\r\n methodName = useFeeOnTransfer\r\n ? 'swapExactTokensForTokensSupportingFeeOnTransferTokens'\r\n : 'swapExactTokensForTokens'\r\n // (uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)\r\n args = [amountIn, amountOut, path, to, deadline]\r\n value = ZERO_HEX\r\n }\r\n break\r\n case TradeType.EXACT_OUTPUT:\r\n invariant(!useFeeOnTransfer, 'EXACT_OUT_FOT')\r\n if (etherIn) {\r\n methodName = 'swapETHForExactTokens'\r\n // (uint amountOut, address[] calldata path, address to, uint deadline)\r\n args = [amountOut, path, to, deadline]\r\n value = amountIn\r\n } else if (etherOut) {\r\n methodName = 'swapTokensForExactETH'\r\n // (uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)\r\n args = [amountOut, amountIn, path, to, deadline]\r\n value = ZERO_HEX\r\n } else {\r\n methodName = 'swapTokensForExactTokens'\r\n // (uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)\r\n args = [amountOut, amountIn, path, to, deadline]\r\n value = ZERO_HEX\r\n }\r\n break\r\n }\r\n return {\r\n methodName,\r\n args,\r\n value\r\n }\r\n }\r\n}\r\n","import { Contract } from '@ethersproject/contracts'\r\nimport { getNetwork } from '@ethersproject/networks'\r\nimport { getDefaultProvider } from '@ethersproject/providers'\r\nimport { TokenAmount } from './entities/fractions/tokenAmount'\r\nimport { Pair } from './entities/pair'\r\nimport IUniswapV2Pair from '@uniswap/v2-core/build/IUniswapV2Pair.json'\r\nimport invariant from 'tiny-invariant'\r\nimport ERC20 from './abis/ERC20.json'\r\nimport { ChainId } from './constants'\r\nimport { Token } from './entities/token'\r\n\r\nlet TOKEN_DECIMALS_CACHE: { [chainId: number]: { [address: string]: number } } = {\r\n [ChainId.MAINNET]: {\r\n '0xE0B7927c4aF23765Cb51314A0E0521A9645F0E2A': 9 // DGD\r\n }\r\n}\r\n\r\n/**\r\n * Contains methods for constructing instances of pairs and tokens from on-chain data.\r\n */\r\nexport abstract class Fetcher {\r\n /**\r\n * Cannot be constructed.\r\n */\r\n private constructor() {}\r\n\r\n /**\r\n * Fetch information for a given token on the given chain, using the given ethers provider.\r\n * @param chainId chain of the token\r\n * @param address address of the token on the chain\r\n * @param provider provider used to fetch the token\r\n * @param symbol optional symbol of the token\r\n * @param name optional name of the token\r\n */\r\n public static async fetchTokenData(\r\n chainId: ChainId,\r\n address: string,\r\n provider = getDefaultProvider(getNetwork(chainId)),\r\n symbol?: string,\r\n name?: string\r\n ): Promise<Token> {\r\n const parsedDecimals =\r\n typeof TOKEN_DECIMALS_CACHE?.[chainId]?.[address] === 'number'\r\n ? TOKEN_DECIMALS_CACHE[chainId][address]\r\n : await new Contract(address, ERC20, provider).decimals().then((decimals: number): number => {\r\n TOKEN_DECIMALS_CACHE = {\r\n ...TOKEN_DECIMALS_CACHE,\r\n [chainId]: {\r\n ...TOKEN_DECIMALS_CACHE?.[chainId],\r\n [address]: decimals\r\n }\r\n }\r\n return decimals\r\n })\r\n return new Token(chainId, address, parsedDecimals, symbol, name)\r\n }\r\n\r\n /**\r\n * Fetches information about a pair and constructs a pair from the given two tokens.\r\n * @param tokenA first token\r\n * @param tokenB second token\r\n * @param provider the provider to use to fetch the data\r\n */\r\n public static async fetchPairData(\r\n tokenA: Token,\r\n tokenB: Token,\r\n provider = getDefaultProvider(getNetwork(tokenA.chainId))\r\n ): Promise<Pair> {\r\n invariant(tokenA.chainId === tokenB.chainId, 'CHAIN_ID')\r\n const address = Pair.getAddress(tokenA, tokenB)\r\n const [reserves0, reserves1] = await new Contract(address, IUniswapV2Pair.abi, provider).getReserves()\r\n const balances = tokenA.sortsBefore(tokenB) ? [reserves0, reserves1] : [reserves1, reserves0]\r\n return new Pair(new TokenAmount(tokenA, balances[0]), new TokenAmount(tokenB, balances[1]))\r\n }\r\n}\r\n"],"names":["ChainId","TradeType","Rounding","FACTORY_ADDRESS","INIT_CODE_HASH","MINIMUM_LIQUIDITY","JSBI","BigInt","ZERO","ONE","TWO","THREE","FIVE","TEN","_100","_997","_1000","SolidityType","SOLIDITY_TYPE_MAXIMA","uint8","uint256","CAN_SET_PROTOTYPE","Object","InsufficientReservesError","name","constructor","setPrototypeOf","prototype","Error","InsufficientInputAmountError","validateSolidityTypeInstance","value","solidityType","greaterThanOrEqual","invariant","lessThanOrEqual","validateAndParseAddress","address","checksummedAddress","getAddress","warning","error","parseBigintIsh","bigintIsh","toString","sqrt","y","z","x","greaterThan","add","divide","lessThan","notEqual","sortedInsert","items","maxSize","comparator","length","push","isFull","lo","hi","mid","splice","pop","Currency","decimals","symbol","change","cId","ETHER","Token","chainId","equals","other","sortsBefore","toLowerCase","currencyEquals","currencyA","currencyB","WETH","MAINNET","ROPSTEN","RINKEBY","GÖRLI","KOVAN","BINANCE","BINANCETEST","RSK","RSKTEST","XDAI","POLYGON","Decimal","toFormat","_Decimal","Big","_Big","toSignificantRounding","ROUND_DOWN","ROUND_HALF_UP","ROUND_UP","toFixedRounding","Fraction","numerator","denominator","invert","otherParsed","equal","multiply","subtract","equalTo","toSignificant","significantDigits","format","rounding","groupSeparator","Number","isInteger","set","precision","quotient","div","toSignificantDigits","decimalPlaces","toFixed","DP","RM","remainder","CurrencyAmount","currency","amount","parsedAmount","exponentiate","ether","raw","toExact","TokenAmount","token","Price","baseCurrency","quoteCurrency","scalar","fromRoute","route","prices","pairs","entries","i","pair","path","token0","reserve0","reserve1","slice","reduce","accumulator","currentValue","fraction","quote","currencyAmount","adjusted","PAIR_ADDRESS_CACHE","Pair","tokenAmountA","tokenAmountB","tokenAmounts","liquidityToken","tokenA","tokenB","tokens","undefined","getCreate2Address","keccak256","pack","involvesToken","token1","priceOf","token0Price","token1Price","reserveOf","getOutputAmount","inputAmount","inputReserve","outputReserve","inputAmountWithFee","outputAmount","getInputAmount","getLiquidityMinted","totalSupply","liquidity","amount0","amount1","getLiquidityValue","feeOn","kLast","totalSupplyAdjusted","kLastParsed","rootK","rootKLast","feeLiquidity","Route","input","output","every","currentInput","midPrice","_100_PERCENT","Percent","computePriceImpact","exactQuote","slippage","inputOutputComparator","a","b","tradeComparator","ioComp","priceImpact","wrappedAmount","wrappedCurrency","Trade","tradeType","amounts","Array","nextPairs","EXACT_INPUT","nextPair","EXACT_OUTPUT","executionPrice","nextMidPrice","exactIn","amountIn","exactOut","amountOut","minimumAmountOut","slippageTolerance","slippageAdjustedAmountOut","maximumAmountIn","slippageAdjustedAmountIn","bestTradeExactIn","currencyAmountIn","currencyOut","currentPairs","originalAmountIn","bestTrades","maxNumResults","maxHops","tokenOut","isInsufficientInputAmountError","pairsExcludingThisPair","concat","bestTradeExactOut","currencyIn","currencyAmountOut","originalAmountOut","tokenIn","isInsufficientReservesError","toHex","ZERO_HEX","Router","swapCallParameters","trade","options","etherIn","etherOut","ttl","to","recipient","allowedSlippage","map","deadline","Math","floor","Date","getTime","useFeeOnTransfer","Boolean","feeOnTransfer","methodName","args","TOKEN_DECIMALS_CACHE","Fetcher","fetchTokenData","provider","parsedDecimals","getDefaultProvider","getNetwork","Contract","ERC20","then","fetchPairData","IUniswapV2Pair","abi","getReserves","reserves0","reserves1","balances"],"mappings":"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"}
1
+ {"version":3,"file":"u-exchange-sdk.cjs.development.js","sources":["../src/constants.ts","../src/errors.ts","../src/utils.ts","../src/entities/currency.ts","../src/entities/token.ts","../src/entities/fractions/fraction.ts","../src/entities/fractions/currencyAmount.ts","../src/entities/fractions/tokenAmount.ts","../src/entities/fractions/price.ts","../src/entities/pair.ts","../src/entities/route.ts","../src/entities/fractions/percent.ts","../src/entities/trade.ts","../src/router.ts","../src/fetcher.ts"],"sourcesContent":["import JSBI from 'jsbi'\r\n\r\n// exports for external consumption\r\nexport type BigintIsh = JSBI | bigint | string\r\n\r\nexport enum ChainId {\r\n MAINNET = 1,\r\n ROPSTEN = 3,\r\n RINKEBY = 4,\r\n GÖRLI = 5,\r\n RSK = 30,\r\n RSKTEST = 31,\r\n KOVAN = 42,\r\n BINANCE = 56,\r\n BINANCETEST = 97,\r\n XDAI = 100,\r\n POLYGON = 137\r\n}\r\n\r\nexport enum TradeType {\r\n EXACT_INPUT,\r\n EXACT_OUTPUT\r\n}\r\n\r\nexport enum Rounding {\r\n ROUND_DOWN,\r\n ROUND_HALF_UP,\r\n ROUND_UP\r\n}\r\n\r\nexport const FACTORY_ADDRESS = '0x0dE70757dE21FAcD23c3aEb46e8bE20620b5269f'\r\n\r\nexport const INIT_CODE_HASH = '0x6c0dd0b3d906c70e40fd9e96936f31ff1b70fe5784bae36fcbab40725d974a67'\r\n\r\nexport const MINIMUM_LIQUIDITY = JSBI.BigInt(1000)\r\n\r\n// exports for internal consumption\r\nexport const ZERO = JSBI.BigInt(0)\r\nexport const ONE = JSBI.BigInt(1)\r\nexport const TWO = JSBI.BigInt(2)\r\nexport const THREE = JSBI.BigInt(3)\r\nexport const FIVE = JSBI.BigInt(5)\r\nexport const TEN = JSBI.BigInt(10)\r\nexport const _100 = JSBI.BigInt(100)\r\nexport const _997 = JSBI.BigInt(997)\r\nexport const _1000 = JSBI.BigInt(1000)\r\n\r\nexport enum SolidityType {\r\n uint8 = 'uint8',\r\n uint256 = 'uint256'\r\n}\r\n\r\nexport const SOLIDITY_TYPE_MAXIMA = {\r\n [SolidityType.uint8]: JSBI.BigInt('0xff'),\r\n [SolidityType.uint256]: JSBI.BigInt('0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff')\r\n}\r\n","// see https://stackoverflow.com/a/41102306\r\nconst CAN_SET_PROTOTYPE = 'setPrototypeOf' in Object\r\n\r\n/**\r\n * Indicates that the pair has insufficient reserves for a desired output amount. I.e. the amount of output cannot be\r\n * obtained by sending any amount of input.\r\n */\r\nexport class InsufficientReservesError extends Error {\r\n public readonly isInsufficientReservesError: true = true\r\n\r\n public constructor() {\r\n super()\r\n this.name = this.constructor.name\r\n if (CAN_SET_PROTOTYPE) Object.setPrototypeOf(this, new.target.prototype)\r\n }\r\n}\r\n\r\n/**\r\n * Indicates that the input amount is too small to produce any amount of output. I.e. the amount of input sent is less\r\n * than the price of a single unit of output after fees.\r\n */\r\nexport class InsufficientInputAmountError extends Error {\r\n public readonly isInsufficientInputAmountError: true = true\r\n\r\n public constructor() {\r\n super()\r\n this.name = this.constructor.name\r\n if (CAN_SET_PROTOTYPE) Object.setPrototypeOf(this, new.target.prototype)\r\n }\r\n}\r\n","import invariant from 'tiny-invariant'\r\nimport warning from 'tiny-warning'\r\nimport JSBI from 'jsbi'\r\nimport { getAddress } from '@ethersproject/address'\r\n\r\nimport { BigintIsh, ZERO, ONE, TWO, THREE, SolidityType, SOLIDITY_TYPE_MAXIMA } from './constants'\r\n\r\nexport function validateSolidityTypeInstance(value: JSBI, solidityType: SolidityType): void {\r\n invariant(JSBI.greaterThanOrEqual(value, ZERO), `${value} is not a ${solidityType}.`)\r\n invariant(JSBI.lessThanOrEqual(value, SOLIDITY_TYPE_MAXIMA[solidityType]), `${value} is not a ${solidityType}.`)\r\n}\r\n\r\n// warns if addresses are not checksummed\r\nexport function validateAndParseAddress(address: string): string {\r\n try {\r\n const checksummedAddress = getAddress(address)\r\n warning(address === checksummedAddress, `${address} is not checksummed.`)\r\n return checksummedAddress\r\n } catch (error) {\r\n invariant(false, `${address} is not a valid address.`)\r\n }\r\n}\r\n\r\nexport function parseBigintIsh(bigintIsh: BigintIsh): JSBI {\r\n return bigintIsh instanceof JSBI\r\n ? bigintIsh\r\n : typeof bigintIsh === 'bigint'\r\n ? JSBI.BigInt(bigintIsh.toString())\r\n : JSBI.BigInt(bigintIsh)\r\n}\r\n\r\n// mock the on-chain sqrt function\r\nexport function sqrt(y: JSBI): JSBI {\r\n validateSolidityTypeInstance(y, SolidityType.uint256)\r\n let z: JSBI = ZERO\r\n let x: JSBI\r\n if (JSBI.greaterThan(y, THREE)) {\r\n z = y\r\n x = JSBI.add(JSBI.divide(y, TWO), ONE)\r\n while (JSBI.lessThan(x, z)) {\r\n z = x\r\n x = JSBI.divide(JSBI.add(JSBI.divide(y, x), x), TWO)\r\n }\r\n } else if (JSBI.notEqual(y, ZERO)) {\r\n z = ONE\r\n }\r\n return z\r\n}\r\n\r\n// given an array of items sorted by `comparator`, insert an item into its sort index and constrain the size to\r\n// `maxSize` by removing the last item\r\nexport function sortedInsert<T>(items: T[], add: T, maxSize: number, comparator: (a: T, b: T) => number): T | null {\r\n invariant(maxSize > 0, 'MAX_SIZE_ZERO')\r\n // this is an invariant because the interface cannot return multiple removed items if items.length exceeds maxSize\r\n invariant(items.length <= maxSize, 'ITEMS_SIZE')\r\n\r\n // short circuit first item add\r\n if (items.length === 0) {\r\n items.push(add)\r\n return null\r\n } else {\r\n const isFull = items.length === maxSize\r\n // short circuit if full and the additional item does not come before the last item\r\n if (isFull && comparator(items[items.length - 1], add) <= 0) {\r\n return add\r\n }\r\n\r\n let lo = 0,\r\n hi = items.length\r\n\r\n while (lo < hi) {\r\n const mid = (lo + hi) >>> 1\r\n if (comparator(items[mid], add) <= 0) {\r\n lo = mid + 1\r\n } else {\r\n hi = mid\r\n }\r\n }\r\n items.splice(lo, 0, add)\r\n return isFull ? items.pop()! : null\r\n }\r\n}\r\n","import JSBI from 'jsbi'\r\n\r\nimport { SolidityType } from '../constants'\r\nimport { validateSolidityTypeInstance } from '../utils'\r\n\r\n/**\r\n * A currency is any fungible financial instrument on Ethereum, including Ether and all ERC20 tokens.\r\n *\r\n * The only instance of the base class `Currency` is Ether.\r\n */\r\nexport class Currency {\r\n public decimals: number\r\n public symbol?: string\r\n public name?: string\r\n\r\n /**\r\n * The only instance of the base class `Currency`.\r\n */\r\n public static ETHER: Currency = new Currency(18, 'BNB', 'BNB')\r\n\r\n\r\n /**\r\n * Constructs an instance of the base class `Currency`. The only instance of the base class `Currency` is `Currency.ETHER`.\r\n * @param decimals decimals of the currency\r\n * @param symbol symbol of the currency\r\n * @param name of the currency\r\n */\r\n protected constructor(decimals: number, symbol?: string, name?: string) {\r\n validateSolidityTypeInstance(JSBI.BigInt(decimals), SolidityType.uint8)\r\n\r\n this.decimals = decimals\r\n this.symbol = symbol\r\n this.name = name\r\n }\r\n\r\n change(cId:number){\r\n if(cId==1){\r\n ETHER.name = \"Ether\"\r\n ETHER.symbol = \"ETH\"\r\n }\r\n if(cId==56){\r\n ETHER.name = \"BNB\"\r\n ETHER.symbol = \"BNB\"\r\n }\r\n if(cId==137){\r\n ETHER.name = \"Matic\"\r\n ETHER.symbol = \"MATIC\"\r\n }\r\n if(cId==30){\r\n ETHER.name = \"Smart Bitcoin\"\r\n ETHER.symbol = \"RBTC\"\r\n }\r\n if(cId==31){\r\n ETHER.name = \"Smart Bitcoin\"\r\n ETHER.symbol = \"tRBTC\"\r\n }\r\n }\r\n}\r\n\r\nconst ETHER = Currency.ETHER\r\nexport { ETHER }\r\n","import invariant from 'tiny-invariant'\r\nimport { ChainId } from '../constants'\r\nimport { validateAndParseAddress } from '../utils'\r\nimport { Currency } from './currency'\r\n\r\n/**\r\n * Represents an ERC20 token with a unique address and some metadata.\r\n */\r\nexport class Token extends Currency {\r\n public readonly chainId: ChainId\r\n public readonly address: string\r\n\r\n public constructor(chainId: ChainId, address: string, decimals: number, symbol?: string, name?: string) {\r\n super(decimals, symbol, name)\r\n this.chainId = chainId\r\n this.address = validateAndParseAddress(address)\r\n }\r\n\r\n /**\r\n * Returns true if the two tokens are equivalent, i.e. have the same chainId and address.\r\n * @param other other token to compare\r\n */\r\n public equals(other: Token): boolean {\r\n // short circuit on reference equality\r\n if (this === other) {\r\n return true\r\n }\r\n return this.chainId === other.chainId && this.address === other.address\r\n }\r\n\r\n /**\r\n * Returns true if the address of this token sorts before the address of the other token\r\n * @param other other token to compare\r\n * @throws if the tokens have the same address\r\n * @throws if the tokens are on different chains\r\n */\r\n public sortsBefore(other: Token): boolean {\r\n invariant(this.chainId === other.chainId, 'CHAIN_IDS')\r\n invariant(this.address !== other.address, 'ADDRESSES')\r\n return this.address.toLowerCase() < other.address.toLowerCase()\r\n }\r\n}\r\n\r\n/**\r\n * Compares two currencies for equality\r\n */\r\nexport function currencyEquals(currencyA: Currency, currencyB: Currency): boolean {\r\n if (currencyA instanceof Token && currencyB instanceof Token) {\r\n return currencyA.equals(currencyB)\r\n } else if (currencyA instanceof Token) {\r\n return false\r\n } else if (currencyB instanceof Token) {\r\n return false\r\n } else {\r\n return currencyA === currencyB\r\n }\r\n}\r\n\r\nexport const WETH = {\r\n [ChainId.MAINNET]: new Token(\r\n ChainId.MAINNET,\r\n '0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2',\r\n 18,\r\n 'WETH',\r\n 'Wrapped Ether'\r\n ),\r\n [ChainId.ROPSTEN]: new Token(\r\n ChainId.ROPSTEN,\r\n '0xc778417E063141139Fce010982780140Aa0cD5Ab',\r\n 18,\r\n 'WETH',\r\n 'Wrapped Ether'\r\n ),\r\n [ChainId.RINKEBY]: new Token(\r\n ChainId.RINKEBY,\r\n '0xc778417E063141139Fce010982780140Aa0cD5Ab',\r\n 18,\r\n 'WETH',\r\n 'Wrapped Ether'\r\n ),\r\n [ChainId.GÖRLI]: new Token(ChainId.GÖRLI, '0xB4FBF271143F4FBf7B91A5ded31805e42b2208d6', 18, 'WETH', 'Wrapped Ether'),\r\n [ChainId.KOVAN]: new Token(ChainId.KOVAN, '0xd0A1E359811322d97991E03f863a0C30C2cF029C', 18, 'WETH', 'Wrapped Ether'),\r\n [ChainId.BINANCE]: new Token(ChainId.BINANCE, '0xbb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c', 18, 'WBNB', 'Wrapped BNB'),\r\n [ChainId.BINANCETEST]: new Token(ChainId.BINANCETEST, '0xbb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c', 18, 'WBNB', 'Wrapped BNB'),\r\n [ChainId.RSK]: new Token(ChainId.RSK, '0xFa26ecdA879AC88AfD047cc6e046E85B9aFBa2CC', 18, 'WrBTC', 'Wrapped rBTC'),\r\n [ChainId.RSKTEST]: new Token(ChainId.RSKTEST, '0xbb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c', 18, 'WBNB', 'Wrapped BNB'),\r\n [ChainId.XDAI]: new Token(ChainId.XDAI, '0xe91D153E0b41518A2Ce8Dd3D7944Fa863463a97d', 18, 'WXDAI', 'Wrapped XDAI'),\r\n [ChainId.POLYGON]: new Token(ChainId.POLYGON, '0x0d500b1d8e8ef31e21c99d1db9a6444d3adf1270', 18, 'WMATIC', 'Wrapped Matic'),\r\n}\r\n","import invariant from 'tiny-invariant'\r\nimport JSBI from 'jsbi'\r\nimport _Decimal from 'decimal.js-light'\r\nimport _Big, { RoundingMode } from 'big.js'\r\nimport toFormat from 'toformat'\r\n\r\nimport { BigintIsh, Rounding } from '../../constants'\r\nimport { ONE } from '../../constants'\r\nimport { parseBigintIsh } from '../../utils'\r\n\r\nconst Decimal = toFormat(_Decimal)\r\nconst Big = toFormat(_Big)\r\n\r\nconst toSignificantRounding = {\r\n [Rounding.ROUND_DOWN]: Decimal.ROUND_DOWN,\r\n [Rounding.ROUND_HALF_UP]: Decimal.ROUND_HALF_UP,\r\n [Rounding.ROUND_UP]: Decimal.ROUND_UP\r\n}\r\n\r\nconst toFixedRounding = {\r\n [Rounding.ROUND_DOWN]: RoundingMode.RoundDown,\r\n [Rounding.ROUND_HALF_UP]: RoundingMode.RoundHalfUp,\r\n [Rounding.ROUND_UP]: RoundingMode.RoundUp\r\n}\r\n\r\nexport class Fraction {\r\n public readonly numerator: JSBI\r\n public readonly denominator: JSBI\r\n\r\n public constructor(numerator: BigintIsh, denominator: BigintIsh = ONE) {\r\n this.numerator = parseBigintIsh(numerator)\r\n this.denominator = parseBigintIsh(denominator)\r\n }\r\n\r\n // performs floor division\r\n public get quotient(): JSBI {\r\n return JSBI.divide(this.numerator, this.denominator)\r\n }\r\n\r\n // remainder after floor division\r\n public get remainder(): Fraction {\r\n return new Fraction(JSBI.remainder(this.numerator, this.denominator), this.denominator)\r\n }\r\n\r\n public invert(): Fraction {\r\n return new Fraction(this.denominator, this.numerator)\r\n }\r\n\r\n public add(other: Fraction | BigintIsh): Fraction {\r\n const otherParsed = other instanceof Fraction ? other : new Fraction(parseBigintIsh(other))\r\n if (JSBI.equal(this.denominator, otherParsed.denominator)) {\r\n return new Fraction(JSBI.add(this.numerator, otherParsed.numerator), this.denominator)\r\n }\r\n return new Fraction(\r\n JSBI.add(\r\n JSBI.multiply(this.numerator, otherParsed.denominator),\r\n JSBI.multiply(otherParsed.numerator, this.denominator)\r\n ),\r\n JSBI.multiply(this.denominator, otherParsed.denominator)\r\n )\r\n }\r\n\r\n public subtract(other: Fraction | BigintIsh): Fraction {\r\n const otherParsed = other instanceof Fraction ? other : new Fraction(parseBigintIsh(other))\r\n if (JSBI.equal(this.denominator, otherParsed.denominator)) {\r\n return new Fraction(JSBI.subtract(this.numerator, otherParsed.numerator), this.denominator)\r\n }\r\n return new Fraction(\r\n JSBI.subtract(\r\n JSBI.multiply(this.numerator, otherParsed.denominator),\r\n JSBI.multiply(otherParsed.numerator, this.denominator)\r\n ),\r\n JSBI.multiply(this.denominator, otherParsed.denominator)\r\n )\r\n }\r\n\r\n public lessThan(other: Fraction | BigintIsh): boolean {\r\n const otherParsed = other instanceof Fraction ? other : new Fraction(parseBigintIsh(other))\r\n return JSBI.lessThan(\r\n JSBI.multiply(this.numerator, otherParsed.denominator),\r\n JSBI.multiply(otherParsed.numerator, this.denominator)\r\n )\r\n }\r\n\r\n public equalTo(other: Fraction | BigintIsh): boolean {\r\n const otherParsed = other instanceof Fraction ? other : new Fraction(parseBigintIsh(other))\r\n return JSBI.equal(\r\n JSBI.multiply(this.numerator, otherParsed.denominator),\r\n JSBI.multiply(otherParsed.numerator, this.denominator)\r\n )\r\n }\r\n\r\n public greaterThan(other: Fraction | BigintIsh): boolean {\r\n const otherParsed = other instanceof Fraction ? other : new Fraction(parseBigintIsh(other))\r\n return JSBI.greaterThan(\r\n JSBI.multiply(this.numerator, otherParsed.denominator),\r\n JSBI.multiply(otherParsed.numerator, this.denominator)\r\n )\r\n }\r\n\r\n public multiply(other: Fraction | BigintIsh): Fraction {\r\n const otherParsed = other instanceof Fraction ? other : new Fraction(parseBigintIsh(other))\r\n return new Fraction(\r\n JSBI.multiply(this.numerator, otherParsed.numerator),\r\n JSBI.multiply(this.denominator, otherParsed.denominator)\r\n )\r\n }\r\n\r\n public divide(other: Fraction | BigintIsh): Fraction {\r\n const otherParsed = other instanceof Fraction ? other : new Fraction(parseBigintIsh(other))\r\n return new Fraction(\r\n JSBI.multiply(this.numerator, otherParsed.denominator),\r\n JSBI.multiply(this.denominator, otherParsed.numerator)\r\n )\r\n }\r\n\r\n public toSignificant(\r\n significantDigits: number,\r\n format: object = { groupSeparator: '' },\r\n rounding: Rounding = Rounding.ROUND_HALF_UP\r\n ): string {\r\n invariant(Number.isInteger(significantDigits), `${significantDigits} is not an integer.`)\r\n invariant(significantDigits > 0, `${significantDigits} is not positive.`)\r\n\r\n Decimal.set({ precision: significantDigits + 1, rounding: toSignificantRounding[rounding] })\r\n const quotient = new Decimal(this.numerator.toString())\r\n .div(this.denominator.toString())\r\n .toSignificantDigits(significantDigits)\r\n return quotient.toFormat(quotient.decimalPlaces(), format)\r\n }\r\n\r\n public toFixed(\r\n decimalPlaces: number,\r\n format: object = { groupSeparator: '' },\r\n rounding: Rounding = Rounding.ROUND_HALF_UP\r\n ): string {\r\n invariant(Number.isInteger(decimalPlaces), `${decimalPlaces} is not an integer.`)\r\n invariant(decimalPlaces >= 0, `${decimalPlaces} is negative.`)\r\n\r\n Big.DP = decimalPlaces\r\n Big.RM = toFixedRounding[rounding]\r\n return new Big(this.numerator.toString()).div(this.denominator.toString()).toFormat(decimalPlaces, format)\r\n }\r\n}\r\n","import { currencyEquals } from '../token'\r\nimport { Currency, ETHER } from '../currency'\r\nimport invariant from 'tiny-invariant'\r\nimport JSBI from 'jsbi'\r\nimport _Big from 'big.js'\r\nimport toFormat from 'toformat'\r\n\r\nimport { BigintIsh, Rounding, TEN, SolidityType } from '../../constants'\r\nimport { parseBigintIsh, validateSolidityTypeInstance } from '../../utils'\r\nimport { Fraction } from './fraction'\r\n\r\nconst Big = toFormat(_Big)\r\n\r\nexport class CurrencyAmount extends Fraction {\r\n public readonly currency: Currency\r\n\r\n /**\r\n * Helper that calls the constructor with the ETHER currency\r\n * @param amount ether amount in wei\r\n */\r\n public static ether(amount: BigintIsh): CurrencyAmount {\r\n return new CurrencyAmount(ETHER, amount)\r\n }\r\n\r\n // amount _must_ be raw, i.e. in the native representation\r\n protected constructor(currency: Currency, amount: BigintIsh) {\r\n const parsedAmount = parseBigintIsh(amount)\r\n validateSolidityTypeInstance(parsedAmount, SolidityType.uint256)\r\n\r\n super(parsedAmount, JSBI.exponentiate(TEN, JSBI.BigInt(currency.decimals)))\r\n this.currency = currency\r\n }\r\n\r\n public get raw(): JSBI {\r\n return this.numerator\r\n }\r\n\r\n public add(other: CurrencyAmount): CurrencyAmount {\r\n invariant(currencyEquals(this.currency, other.currency), 'TOKEN')\r\n return new CurrencyAmount(this.currency, JSBI.add(this.raw, other.raw))\r\n }\r\n\r\n public subtract(other: CurrencyAmount): CurrencyAmount {\r\n invariant(currencyEquals(this.currency, other.currency), 'TOKEN')\r\n return new CurrencyAmount(this.currency, JSBI.subtract(this.raw, other.raw))\r\n }\r\n\r\n public toSignificant(\r\n significantDigits: number = 6,\r\n format?: object,\r\n rounding: Rounding = Rounding.ROUND_DOWN\r\n ): string {\r\n return super.toSignificant(significantDigits, format, rounding)\r\n }\r\n\r\n public toFixed(\r\n decimalPlaces: number = this.currency.decimals,\r\n format?: object,\r\n rounding: Rounding = Rounding.ROUND_DOWN\r\n ): string {\r\n invariant(decimalPlaces <= this.currency.decimals, 'DECIMALS')\r\n return super.toFixed(decimalPlaces, format, rounding)\r\n }\r\n\r\n public toExact(format: object = { groupSeparator: '' }): string {\r\n Big.DP = this.currency.decimals\r\n return new Big(this.numerator.toString()).div(this.denominator.toString()).toFormat(format)\r\n }\r\n}\r\n","import { CurrencyAmount } from './currencyAmount'\r\nimport { Token } from '../token'\r\nimport invariant from 'tiny-invariant'\r\nimport JSBI from 'jsbi'\r\n\r\nimport { BigintIsh } from '../../constants'\r\n\r\nexport class TokenAmount extends CurrencyAmount {\r\n public readonly token: Token\r\n\r\n // amount _must_ be raw, i.e. in the native representation\r\n public constructor(token: Token, amount: BigintIsh) {\r\n super(token, amount)\r\n this.token = token\r\n }\r\n\r\n public add(other: TokenAmount): TokenAmount {\r\n invariant(this.token.equals(other.token), 'TOKEN')\r\n return new TokenAmount(this.token, JSBI.add(this.raw, other.raw))\r\n }\r\n\r\n public subtract(other: TokenAmount): TokenAmount {\r\n invariant(this.token.equals(other.token), 'TOKEN')\r\n return new TokenAmount(this.token, JSBI.subtract(this.raw, other.raw))\r\n }\r\n}\r\n","import { Token } from '../token'\r\nimport { TokenAmount } from './tokenAmount'\r\nimport { currencyEquals } from '../token'\r\nimport invariant from 'tiny-invariant'\r\nimport JSBI from 'jsbi'\r\n\r\nimport { BigintIsh, Rounding, TEN } from '../../constants'\r\nimport { Currency } from '../currency'\r\nimport { Route } from '../route'\r\nimport { Fraction } from './fraction'\r\nimport { CurrencyAmount } from './currencyAmount'\r\n\r\nexport class Price extends Fraction {\r\n public readonly baseCurrency: Currency // input i.e. denominator\r\n public readonly quoteCurrency: Currency // output i.e. numerator\r\n public readonly scalar: Fraction // used to adjust the raw fraction w/r/t the decimals of the {base,quote}Token\r\n\r\n public static fromRoute(route: Route): Price {\r\n const prices: Price[] = []\r\n for (const [i, pair] of route.pairs.entries()) {\r\n prices.push(\r\n route.path[i].equals(pair.token0)\r\n ? new Price(pair.reserve0.currency, pair.reserve1.currency, pair.reserve0.raw, pair.reserve1.raw)\r\n : new Price(pair.reserve1.currency, pair.reserve0.currency, pair.reserve1.raw, pair.reserve0.raw)\r\n )\r\n }\r\n return prices.slice(1).reduce((accumulator, currentValue) => accumulator.multiply(currentValue), prices[0])\r\n }\r\n\r\n // denominator and numerator _must_ be raw, i.e. in the native representation\r\n public constructor(baseCurrency: Currency, quoteCurrency: Currency, denominator: BigintIsh, numerator: BigintIsh) {\r\n super(numerator, denominator)\r\n\r\n this.baseCurrency = baseCurrency\r\n this.quoteCurrency = quoteCurrency\r\n this.scalar = new Fraction(\r\n JSBI.exponentiate(TEN, JSBI.BigInt(baseCurrency.decimals)),\r\n JSBI.exponentiate(TEN, JSBI.BigInt(quoteCurrency.decimals))\r\n )\r\n }\r\n\r\n public get raw(): Fraction {\r\n return new Fraction(this.numerator, this.denominator)\r\n }\r\n\r\n public get adjusted(): Fraction {\r\n return super.multiply(this.scalar)\r\n }\r\n\r\n public invert(): Price {\r\n return new Price(this.quoteCurrency, this.baseCurrency, this.numerator, this.denominator)\r\n }\r\n\r\n public multiply(other: Price): Price {\r\n invariant(currencyEquals(this.quoteCurrency, other.baseCurrency), 'TOKEN')\r\n const fraction = super.multiply(other)\r\n return new Price(this.baseCurrency, other.quoteCurrency, fraction.denominator, fraction.numerator)\r\n }\r\n\r\n // performs floor division on overflow\r\n public quote(currencyAmount: CurrencyAmount): CurrencyAmount {\r\n invariant(currencyEquals(currencyAmount.currency, this.baseCurrency), 'TOKEN')\r\n if (this.quoteCurrency instanceof Token) {\r\n return new TokenAmount(this.quoteCurrency, super.multiply(currencyAmount.raw).quotient)\r\n }\r\n return CurrencyAmount.ether(super.multiply(currencyAmount.raw).quotient)\r\n }\r\n\r\n public toSignificant(significantDigits: number = 6, format?: object, rounding?: Rounding): string {\r\n return this.adjusted.toSignificant(significantDigits, format, rounding)\r\n }\r\n\r\n public toFixed(decimalPlaces: number = 4, format?: object, rounding?: Rounding): string {\r\n return this.adjusted.toFixed(decimalPlaces, format, rounding)\r\n }\r\n}\r\n","import { Price } from './fractions/price'\r\nimport { TokenAmount } from './fractions/tokenAmount'\r\nimport invariant from 'tiny-invariant'\r\nimport JSBI from 'jsbi'\r\nimport { pack, keccak256 } from '@ethersproject/solidity'\r\nimport { getCreate2Address } from '@ethersproject/address'\r\n\r\nimport {\r\n BigintIsh,\r\n FACTORY_ADDRESS,\r\n INIT_CODE_HASH,\r\n MINIMUM_LIQUIDITY,\r\n ZERO,\r\n ONE,\r\n FIVE,\r\n _997,\r\n _1000,\r\n ChainId\r\n} from '../constants'\r\nimport { sqrt, parseBigintIsh } from '../utils'\r\nimport { InsufficientReservesError, InsufficientInputAmountError } from '../errors'\r\nimport { Token } from './token'\r\n\r\nlet PAIR_ADDRESS_CACHE: { [token0Address: string]: { [token1Address: string]: string } } = {}\r\n\r\nexport class Pair {\r\n public readonly liquidityToken: Token\r\n private readonly tokenAmounts: [TokenAmount, TokenAmount]\r\n\r\n public static getAddress(tokenA: Token, tokenB: Token): string {\r\n const tokens = tokenA.sortsBefore(tokenB) ? [tokenA, tokenB] : [tokenB, tokenA] // does safety checks\r\n\r\n if (PAIR_ADDRESS_CACHE?.[tokens[0].address]?.[tokens[1].address] === undefined) {\r\n PAIR_ADDRESS_CACHE = {\r\n ...PAIR_ADDRESS_CACHE,\r\n [tokens[0].address]: {\r\n ...PAIR_ADDRESS_CACHE?.[tokens[0].address],\r\n [tokens[1].address]: getCreate2Address(\r\n FACTORY_ADDRESS,\r\n keccak256(['bytes'], [pack(['address', 'address'], [tokens[0].address, tokens[1].address])]),\r\n INIT_CODE_HASH\r\n )\r\n }\r\n }\r\n }\r\n\r\n return PAIR_ADDRESS_CACHE[tokens[0].address][tokens[1].address]\r\n }\r\n\r\n public constructor(tokenAmountA: TokenAmount, tokenAmountB: TokenAmount) {\r\n const tokenAmounts = tokenAmountA.token.sortsBefore(tokenAmountB.token) // does safety checks\r\n ? [tokenAmountA, tokenAmountB]\r\n : [tokenAmountB, tokenAmountA]\r\n this.liquidityToken = new Token(\r\n tokenAmounts[0].token.chainId,\r\n Pair.getAddress(tokenAmounts[0].token, tokenAmounts[1].token),\r\n 18,\r\n 'UNI-V2',\r\n 'Uniswap V2'\r\n )\r\n this.tokenAmounts = tokenAmounts as [TokenAmount, TokenAmount]\r\n }\r\n\r\n /**\r\n * Returns true if the token is either token0 or token1\r\n * @param token to check\r\n */\r\n public involvesToken(token: Token): boolean {\r\n return token.equals(this.token0) || token.equals(this.token1)\r\n }\r\n\r\n /**\r\n * Returns the current mid price of the pair in terms of token0, i.e. the ratio of reserve1 to reserve0\r\n */\r\n public get token0Price(): Price {\r\n return new Price(this.token0, this.token1, this.tokenAmounts[0].raw, this.tokenAmounts[1].raw)\r\n }\r\n\r\n /**\r\n * Returns the current mid price of the pair in terms of token1, i.e. the ratio of reserve0 to reserve1\r\n */\r\n public get token1Price(): Price {\r\n return new Price(this.token1, this.token0, this.tokenAmounts[1].raw, this.tokenAmounts[0].raw)\r\n }\r\n\r\n /**\r\n * Return the price of the given token in terms of the other token in the pair.\r\n * @param token token to return price of\r\n */\r\n public priceOf(token: Token): Price {\r\n invariant(this.involvesToken(token), 'TOKEN')\r\n return token.equals(this.token0) ? this.token0Price : this.token1Price\r\n }\r\n\r\n /**\r\n * Returns the chain ID of the tokens in the pair.\r\n */\r\n public get chainId(): ChainId {\r\n return this.token0.chainId\r\n }\r\n\r\n public get token0(): Token {\r\n return this.tokenAmounts[0].token\r\n }\r\n\r\n public get token1(): Token {\r\n return this.tokenAmounts[1].token\r\n }\r\n\r\n public get reserve0(): TokenAmount {\r\n return this.tokenAmounts[0]\r\n }\r\n\r\n public get reserve1(): TokenAmount {\r\n return this.tokenAmounts[1]\r\n }\r\n\r\n public reserveOf(token: Token): TokenAmount {\r\n invariant(this.involvesToken(token), 'TOKEN')\r\n return token.equals(this.token0) ? this.reserve0 : this.reserve1\r\n }\r\n\r\n public getOutputAmount(inputAmount: TokenAmount): [TokenAmount, Pair] {\r\n invariant(this.involvesToken(inputAmount.token), 'TOKEN')\r\n if (JSBI.equal(this.reserve0.raw, ZERO) || JSBI.equal(this.reserve1.raw, ZERO)) {\r\n throw new InsufficientReservesError()\r\n }\r\n const inputReserve = this.reserveOf(inputAmount.token)\r\n const outputReserve = this.reserveOf(inputAmount.token.equals(this.token0) ? this.token1 : this.token0)\r\n const inputAmountWithFee = JSBI.multiply(inputAmount.raw, _997)\r\n const numerator = JSBI.multiply(inputAmountWithFee, outputReserve.raw)\r\n const denominator = JSBI.add(JSBI.multiply(inputReserve.raw, _1000), inputAmountWithFee)\r\n const outputAmount = new TokenAmount(\r\n inputAmount.token.equals(this.token0) ? this.token1 : this.token0,\r\n JSBI.divide(numerator, denominator)\r\n )\r\n if (JSBI.equal(outputAmount.raw, ZERO)) {\r\n throw new InsufficientInputAmountError()\r\n }\r\n return [outputAmount, new Pair(inputReserve.add(inputAmount), outputReserve.subtract(outputAmount))]\r\n }\r\n\r\n public getInputAmount(outputAmount: TokenAmount): [TokenAmount, Pair] {\r\n invariant(this.involvesToken(outputAmount.token), 'TOKEN')\r\n if (\r\n JSBI.equal(this.reserve0.raw, ZERO) ||\r\n JSBI.equal(this.reserve1.raw, ZERO) ||\r\n JSBI.greaterThanOrEqual(outputAmount.raw, this.reserveOf(outputAmount.token).raw)\r\n ) {\r\n throw new InsufficientReservesError()\r\n }\r\n\r\n const outputReserve = this.reserveOf(outputAmount.token)\r\n const inputReserve = this.reserveOf(outputAmount.token.equals(this.token0) ? this.token1 : this.token0)\r\n const numerator = JSBI.multiply(JSBI.multiply(inputReserve.raw, outputAmount.raw), _1000)\r\n const denominator = JSBI.multiply(JSBI.subtract(outputReserve.raw, outputAmount.raw), _997)\r\n const inputAmount = new TokenAmount(\r\n outputAmount.token.equals(this.token0) ? this.token1 : this.token0,\r\n JSBI.add(JSBI.divide(numerator, denominator), ONE)\r\n )\r\n return [inputAmount, new Pair(inputReserve.add(inputAmount), outputReserve.subtract(outputAmount))]\r\n }\r\n\r\n public getLiquidityMinted(\r\n totalSupply: TokenAmount,\r\n tokenAmountA: TokenAmount,\r\n tokenAmountB: TokenAmount\r\n ): TokenAmount {\r\n invariant(totalSupply.token.equals(this.liquidityToken), 'LIQUIDITY')\r\n const tokenAmounts = tokenAmountA.token.sortsBefore(tokenAmountB.token) // does safety checks\r\n ? [tokenAmountA, tokenAmountB]\r\n : [tokenAmountB, tokenAmountA]\r\n invariant(tokenAmounts[0].token.equals(this.token0) && tokenAmounts[1].token.equals(this.token1), 'TOKEN')\r\n\r\n let liquidity: JSBI\r\n if (JSBI.equal(totalSupply.raw, ZERO)) {\r\n liquidity = JSBI.subtract(sqrt(JSBI.multiply(tokenAmounts[0].raw, tokenAmounts[1].raw)), MINIMUM_LIQUIDITY)\r\n } else {\r\n const amount0 = JSBI.divide(JSBI.multiply(tokenAmounts[0].raw, totalSupply.raw), this.reserve0.raw)\r\n const amount1 = JSBI.divide(JSBI.multiply(tokenAmounts[1].raw, totalSupply.raw), this.reserve1.raw)\r\n liquidity = JSBI.lessThanOrEqual(amount0, amount1) ? amount0 : amount1\r\n }\r\n if (!JSBI.greaterThan(liquidity, ZERO)) {\r\n throw new InsufficientInputAmountError()\r\n }\r\n return new TokenAmount(this.liquidityToken, liquidity)\r\n }\r\n\r\n public getLiquidityValue(\r\n token: Token,\r\n totalSupply: TokenAmount,\r\n liquidity: TokenAmount,\r\n feeOn: boolean = false,\r\n kLast?: BigintIsh\r\n ): TokenAmount {\r\n invariant(this.involvesToken(token), 'TOKEN')\r\n invariant(totalSupply.token.equals(this.liquidityToken), 'TOTAL_SUPPLY')\r\n invariant(liquidity.token.equals(this.liquidityToken), 'LIQUIDITY')\r\n invariant(JSBI.lessThanOrEqual(liquidity.raw, totalSupply.raw), 'LIQUIDITY')\r\n\r\n let totalSupplyAdjusted: TokenAmount\r\n if (!feeOn) {\r\n totalSupplyAdjusted = totalSupply\r\n } else {\r\n invariant(!!kLast, 'K_LAST')\r\n const kLastParsed = parseBigintIsh(kLast)\r\n if (!JSBI.equal(kLastParsed, ZERO)) {\r\n const rootK = sqrt(JSBI.multiply(this.reserve0.raw, this.reserve1.raw))\r\n const rootKLast = sqrt(kLastParsed)\r\n if (JSBI.greaterThan(rootK, rootKLast)) {\r\n const numerator = JSBI.multiply(totalSupply.raw, JSBI.subtract(rootK, rootKLast))\r\n const denominator = JSBI.add(JSBI.multiply(rootK, FIVE), rootKLast)\r\n const feeLiquidity = JSBI.divide(numerator, denominator)\r\n totalSupplyAdjusted = totalSupply.add(new TokenAmount(this.liquidityToken, feeLiquidity))\r\n } else {\r\n totalSupplyAdjusted = totalSupply\r\n }\r\n } else {\r\n totalSupplyAdjusted = totalSupply\r\n }\r\n }\r\n\r\n return new TokenAmount(\r\n token,\r\n JSBI.divide(JSBI.multiply(liquidity.raw, this.reserveOf(token).raw), totalSupplyAdjusted.raw)\r\n )\r\n }\r\n}\r\n","import { ChainId } from '../constants'\r\nimport invariant from 'tiny-invariant'\r\n\r\nimport { Currency, ETHER } from './currency'\r\nimport { Token, WETH } from './token'\r\nimport { Pair } from './pair'\r\nimport { Price } from './fractions/price'\r\n\r\nexport class Route {\r\n public readonly pairs: Pair[]\r\n public readonly path: Token[]\r\n public readonly input: Currency\r\n public readonly output: Currency\r\n public readonly midPrice: Price\r\n\r\n public constructor(pairs: Pair[], input: Currency, output?: Currency) {\r\n invariant(pairs.length > 0, 'PAIRS')\r\n invariant(\r\n pairs.every(pair => pair.chainId === pairs[0].chainId),\r\n 'CHAIN_IDS'\r\n )\r\n invariant(\r\n (input instanceof Token && pairs[0].involvesToken(input)) ||\r\n (input === ETHER && pairs[0].involvesToken(WETH[pairs[0].chainId])),\r\n 'INPUT'\r\n )\r\n invariant(\r\n typeof output === 'undefined' ||\r\n (output instanceof Token && pairs[pairs.length - 1].involvesToken(output)) ||\r\n (output === ETHER && pairs[pairs.length - 1].involvesToken(WETH[pairs[0].chainId])),\r\n 'OUTPUT'\r\n )\r\n\r\n const path: Token[] = [input instanceof Token ? input : WETH[pairs[0].chainId]]\r\n for (const [i, pair] of pairs.entries()) {\r\n const currentInput = path[i]\r\n invariant(currentInput.equals(pair.token0) || currentInput.equals(pair.token1), 'PATH')\r\n const output = currentInput.equals(pair.token0) ? pair.token1 : pair.token0\r\n path.push(output)\r\n }\r\n\r\n this.pairs = pairs\r\n this.path = path\r\n this.midPrice = Price.fromRoute(this)\r\n this.input = input\r\n this.output = output ?? path[path.length - 1]\r\n }\r\n\r\n public get chainId(): ChainId {\r\n return this.pairs[0].chainId\r\n }\r\n}\r\n","import { Rounding, _100 } from '../../constants'\r\nimport { Fraction } from './fraction'\r\n\r\nconst _100_PERCENT = new Fraction(_100)\r\n\r\nexport class Percent extends Fraction {\r\n public toSignificant(significantDigits: number = 5, format?: object, rounding?: Rounding): string {\r\n return this.multiply(_100_PERCENT).toSignificant(significantDigits, format, rounding)\r\n }\r\n\r\n public toFixed(decimalPlaces: number = 2, format?: object, rounding?: Rounding): string {\r\n return this.multiply(_100_PERCENT).toFixed(decimalPlaces, format, rounding)\r\n }\r\n}\r\n","import invariant from 'tiny-invariant'\r\n\r\nimport { ChainId, ONE, TradeType, ZERO } from '../constants'\r\nimport { sortedInsert } from '../utils'\r\nimport { Currency, ETHER } from './currency'\r\nimport { CurrencyAmount } from './fractions/currencyAmount'\r\nimport { Fraction } from './fractions/fraction'\r\nimport { Percent } from './fractions/percent'\r\nimport { Price } from './fractions/price'\r\nimport { TokenAmount } from './fractions/tokenAmount'\r\nimport { Pair } from './pair'\r\nimport { Route } from './route'\r\nimport { currencyEquals, Token, WETH } from './token'\r\n\r\n/**\r\n * Returns the percent difference between the mid price and the execution price, i.e. price impact.\r\n * @param midPrice mid price before the trade\r\n * @param inputAmount the input amount of the trade\r\n * @param outputAmount the output amount of the trade\r\n */\r\nfunction computePriceImpact(midPrice: Price, inputAmount: CurrencyAmount, outputAmount: CurrencyAmount): Percent {\r\n const exactQuote = midPrice.raw.multiply(inputAmount.raw)\r\n // calculate slippage := (exactQuote - outputAmount) / exactQuote\r\n const slippage = exactQuote.subtract(outputAmount.raw).divide(exactQuote)\r\n return new Percent(slippage.numerator, slippage.denominator)\r\n}\r\n\r\n// minimal interface so the input output comparator may be shared across types\r\ninterface InputOutput {\r\n readonly inputAmount: CurrencyAmount\r\n readonly outputAmount: CurrencyAmount\r\n}\r\n\r\n// comparator function that allows sorting trades by their output amounts, in decreasing order, and then input amounts\r\n// in increasing order. i.e. the best trades have the most outputs for the least inputs and are sorted first\r\nexport function inputOutputComparator(a: InputOutput, b: InputOutput): number {\r\n // must have same input and output token for comparison\r\n invariant(currencyEquals(a.inputAmount.currency, b.inputAmount.currency), 'INPUT_CURRENCY')\r\n invariant(currencyEquals(a.outputAmount.currency, b.outputAmount.currency), 'OUTPUT_CURRENCY')\r\n if (a.outputAmount.equalTo(b.outputAmount)) {\r\n if (a.inputAmount.equalTo(b.inputAmount)) {\r\n return 0\r\n }\r\n // trade A requires less input than trade B, so A should come first\r\n if (a.inputAmount.lessThan(b.inputAmount)) {\r\n return -1\r\n } else {\r\n return 1\r\n }\r\n } else {\r\n // tradeA has less output than trade B, so should come second\r\n if (a.outputAmount.lessThan(b.outputAmount)) {\r\n return 1\r\n } else {\r\n return -1\r\n }\r\n }\r\n}\r\n\r\n// extension of the input output comparator that also considers other dimensions of the trade in ranking them\r\nexport function tradeComparator(a: Trade, b: Trade) {\r\n const ioComp = inputOutputComparator(a, b)\r\n if (ioComp !== 0) {\r\n return ioComp\r\n }\r\n\r\n // consider lowest slippage next, since these are less likely to fail\r\n if (a.priceImpact.lessThan(b.priceImpact)) {\r\n return -1\r\n } else if (a.priceImpact.greaterThan(b.priceImpact)) {\r\n return 1\r\n }\r\n\r\n // finally consider the number of hops since each hop costs gas\r\n return a.route.path.length - b.route.path.length\r\n}\r\n\r\nexport interface BestTradeOptions {\r\n // how many results to return\r\n maxNumResults?: number\r\n // the maximum number of hops a trade should contain\r\n maxHops?: number\r\n}\r\n\r\n/**\r\n * Given a currency amount and a chain ID, returns the equivalent representation as the token amount.\r\n * In other words, if the currency is ETHER, returns the WETH token amount for the given chain. Otherwise, returns\r\n * the input currency amount.\r\n */\r\nfunction wrappedAmount(currencyAmount: CurrencyAmount, chainId: ChainId): TokenAmount {\r\n if (currencyAmount instanceof TokenAmount) return currencyAmount\r\n if (currencyAmount.currency === ETHER) return new TokenAmount(WETH[chainId], currencyAmount.raw)\r\n invariant(false, 'CURRENCY')\r\n}\r\n\r\nfunction wrappedCurrency(currency: Currency, chainId: ChainId): Token {\r\n if (currency instanceof Token) return currency\r\n if (currency === ETHER) return WETH[chainId]\r\n invariant(false, 'CURRENCY')\r\n}\r\n\r\n/**\r\n * Represents a trade executed against a list of pairs.\r\n * Does not account for slippage, i.e. trades that front run this trade and move the price.\r\n */\r\nexport class Trade {\r\n /**\r\n * The route of the trade, i.e. which pairs the trade goes through.\r\n */\r\n public readonly route: Route\r\n /**\r\n * The type of the trade, either exact in or exact out.\r\n */\r\n public readonly tradeType: TradeType\r\n /**\r\n * The input amount for the trade assuming no slippage.\r\n */\r\n public readonly inputAmount: CurrencyAmount\r\n /**\r\n * The output amount for the trade assuming no slippage.\r\n */\r\n public readonly outputAmount: CurrencyAmount\r\n /**\r\n * The price expressed in terms of output amount/input amount.\r\n */\r\n public readonly executionPrice: Price\r\n /**\r\n * The mid price after the trade executes assuming no slippage.\r\n */\r\n public readonly nextMidPrice: Price\r\n /**\r\n * The percent difference between the mid price before the trade and the trade execution price.\r\n */\r\n public readonly priceImpact: Percent\r\n\r\n /**\r\n * Constructs an exact in trade with the given amount in and route\r\n * @param route route of the exact in trade\r\n * @param amountIn the amount being passed in\r\n */\r\n public static exactIn(route: Route, amountIn: CurrencyAmount): Trade {\r\n return new Trade(route, amountIn, TradeType.EXACT_INPUT)\r\n }\r\n\r\n /**\r\n * Constructs an exact out trade with the given amount out and route\r\n * @param route route of the exact out trade\r\n * @param amountOut the amount returned by the trade\r\n */\r\n public static exactOut(route: Route, amountOut: CurrencyAmount): Trade {\r\n return new Trade(route, amountOut, TradeType.EXACT_OUTPUT)\r\n }\r\n\r\n public constructor(route: Route, amount: CurrencyAmount, tradeType: TradeType) {\r\n const amounts: TokenAmount[] = new Array(route.path.length)\r\n const nextPairs: Pair[] = new Array(route.pairs.length)\r\n if (tradeType === TradeType.EXACT_INPUT) {\r\n invariant(currencyEquals(amount.currency, route.input), 'INPUT')\r\n amounts[0] = wrappedAmount(amount, route.chainId)\r\n for (let i = 0; i < route.path.length - 1; i++) {\r\n const pair = route.pairs[i]\r\n const [outputAmount, nextPair] = pair.getOutputAmount(amounts[i])\r\n amounts[i + 1] = outputAmount\r\n nextPairs[i] = nextPair\r\n }\r\n } else {\r\n invariant(currencyEquals(amount.currency, route.output), 'OUTPUT')\r\n amounts[amounts.length - 1] = wrappedAmount(amount, route.chainId)\r\n for (let i = route.path.length - 1; i > 0; i--) {\r\n const pair = route.pairs[i - 1]\r\n const [inputAmount, nextPair] = pair.getInputAmount(amounts[i])\r\n amounts[i - 1] = inputAmount\r\n nextPairs[i - 1] = nextPair\r\n }\r\n }\r\n\r\n this.route = route\r\n this.tradeType = tradeType\r\n this.inputAmount =\r\n tradeType === TradeType.EXACT_INPUT\r\n ? amount\r\n : route.input === ETHER\r\n ? CurrencyAmount.ether(amounts[0].raw)\r\n : amounts[0]\r\n this.outputAmount =\r\n tradeType === TradeType.EXACT_OUTPUT\r\n ? amount\r\n : route.output === ETHER\r\n ? CurrencyAmount.ether(amounts[amounts.length - 1].raw)\r\n : amounts[amounts.length - 1]\r\n this.executionPrice = new Price(\r\n this.inputAmount.currency,\r\n this.outputAmount.currency,\r\n this.inputAmount.raw,\r\n this.outputAmount.raw\r\n )\r\n this.nextMidPrice = Price.fromRoute(new Route(nextPairs, route.input))\r\n this.priceImpact = computePriceImpact(route.midPrice, this.inputAmount, this.outputAmount)\r\n }\r\n\r\n /**\r\n * Get the minimum amount that must be received from this trade for the given slippage tolerance\r\n * @param slippageTolerance tolerance of unfavorable slippage from the execution price of this trade\r\n */\r\n public minimumAmountOut(slippageTolerance: Percent): CurrencyAmount {\r\n invariant(!slippageTolerance.lessThan(ZERO), 'SLIPPAGE_TOLERANCE')\r\n if (this.tradeType === TradeType.EXACT_OUTPUT) {\r\n return this.outputAmount\r\n } else {\r\n const slippageAdjustedAmountOut = new Fraction(ONE)\r\n .add(slippageTolerance)\r\n .invert()\r\n .multiply(this.outputAmount.raw).quotient\r\n return this.outputAmount instanceof TokenAmount\r\n ? new TokenAmount(this.outputAmount.token, slippageAdjustedAmountOut)\r\n : CurrencyAmount.ether(slippageAdjustedAmountOut)\r\n }\r\n }\r\n\r\n /**\r\n * Get the maximum amount in that can be spent via this trade for the given slippage tolerance\r\n * @param slippageTolerance tolerance of unfavorable slippage from the execution price of this trade\r\n */\r\n public maximumAmountIn(slippageTolerance: Percent): CurrencyAmount {\r\n invariant(!slippageTolerance.lessThan(ZERO), 'SLIPPAGE_TOLERANCE')\r\n if (this.tradeType === TradeType.EXACT_INPUT) {\r\n return this.inputAmount\r\n } else {\r\n const slippageAdjustedAmountIn = new Fraction(ONE).add(slippageTolerance).multiply(this.inputAmount.raw).quotient\r\n return this.inputAmount instanceof TokenAmount\r\n ? new TokenAmount(this.inputAmount.token, slippageAdjustedAmountIn)\r\n : CurrencyAmount.ether(slippageAdjustedAmountIn)\r\n }\r\n }\r\n\r\n /**\r\n * Given a list of pairs, and a fixed amount in, returns the top `maxNumResults` trades that go from an input token\r\n * amount to an output token, making at most `maxHops` hops.\r\n * Note this does not consider aggregation, as routes are linear. It's possible a better route exists by splitting\r\n * the amount in among multiple routes.\r\n * @param pairs the pairs to consider in finding the best trade\r\n * @param currencyAmountIn exact amount of input currency to spend\r\n * @param currencyOut the desired currency out\r\n * @param maxNumResults maximum number of results to return\r\n * @param maxHops maximum number of hops a returned trade can make, e.g. 1 hop goes through a single pair\r\n * @param currentPairs used in recursion; the current list of pairs\r\n * @param originalAmountIn used in recursion; the original value of the currencyAmountIn parameter\r\n * @param bestTrades used in recursion; the current list of best trades\r\n */\r\n public static bestTradeExactIn(\r\n pairs: Pair[],\r\n currencyAmountIn: CurrencyAmount,\r\n currencyOut: Currency,\r\n { maxNumResults = 3, maxHops = 3 }: BestTradeOptions = {},\r\n // used in recursion.\r\n currentPairs: Pair[] = [],\r\n originalAmountIn: CurrencyAmount = currencyAmountIn,\r\n bestTrades: Trade[] = []\r\n ): Trade[] {\r\n invariant(pairs.length > 0, 'PAIRS')\r\n invariant(maxHops > 0, 'MAX_HOPS')\r\n invariant(originalAmountIn === currencyAmountIn || currentPairs.length > 0, 'INVALID_RECURSION')\r\n const chainId: ChainId | undefined =\r\n currencyAmountIn instanceof TokenAmount\r\n ? currencyAmountIn.token.chainId\r\n : currencyOut instanceof Token\r\n ? currencyOut.chainId\r\n : undefined\r\n invariant(chainId !== undefined, 'CHAIN_ID')\r\n\r\n const amountIn = wrappedAmount(currencyAmountIn, chainId)\r\n const tokenOut = wrappedCurrency(currencyOut, chainId)\r\n for (let i = 0; i < pairs.length; i++) {\r\n const pair = pairs[i]\r\n // pair irrelevant\r\n if (!pair.token0.equals(amountIn.token) && !pair.token1.equals(amountIn.token)) continue\r\n if (pair.reserve0.equalTo(ZERO) || pair.reserve1.equalTo(ZERO)) continue\r\n\r\n let amountOut: TokenAmount\r\n try {\r\n ;[amountOut] = pair.getOutputAmount(amountIn)\r\n } catch (error) {\r\n // input too low\r\n if (error.isInsufficientInputAmountError) {\r\n continue\r\n }\r\n throw error\r\n }\r\n // we have arrived at the output token, so this is the final trade of one of the paths\r\n if (amountOut.token.equals(tokenOut)) {\r\n sortedInsert(\r\n bestTrades,\r\n new Trade(\r\n new Route([...currentPairs, pair], originalAmountIn.currency, currencyOut),\r\n originalAmountIn,\r\n TradeType.EXACT_INPUT\r\n ),\r\n maxNumResults,\r\n tradeComparator\r\n )\r\n } else if (maxHops > 1 && pairs.length > 1) {\r\n const pairsExcludingThisPair = pairs.slice(0, i).concat(pairs.slice(i + 1, pairs.length))\r\n\r\n // otherwise, consider all the other paths that lead from this token as long as we have not exceeded maxHops\r\n Trade.bestTradeExactIn(\r\n pairsExcludingThisPair,\r\n amountOut,\r\n currencyOut,\r\n {\r\n maxNumResults,\r\n maxHops: maxHops - 1\r\n },\r\n [...currentPairs, pair],\r\n originalAmountIn,\r\n bestTrades\r\n )\r\n }\r\n }\r\n\r\n return bestTrades\r\n }\r\n\r\n /**\r\n * similar to the above method but instead targets a fixed output amount\r\n * given a list of pairs, and a fixed amount out, returns the top `maxNumResults` trades that go from an input token\r\n * to an output token amount, making at most `maxHops` hops\r\n * note this does not consider aggregation, as routes are linear. it's possible a better route exists by splitting\r\n * the amount in among multiple routes.\r\n * @param pairs the pairs to consider in finding the best trade\r\n * @param currencyIn the currency to spend\r\n * @param currencyAmountOut the exact amount of currency out\r\n * @param maxNumResults maximum number of results to return\r\n * @param maxHops maximum number of hops a returned trade can make, e.g. 1 hop goes through a single pair\r\n * @param currentPairs used in recursion; the current list of pairs\r\n * @param originalAmountOut used in recursion; the original value of the currencyAmountOut parameter\r\n * @param bestTrades used in recursion; the current list of best trades\r\n */\r\n public static bestTradeExactOut(\r\n pairs: Pair[],\r\n currencyIn: Currency,\r\n currencyAmountOut: CurrencyAmount,\r\n { maxNumResults = 3, maxHops = 3 }: BestTradeOptions = {},\r\n // used in recursion.\r\n currentPairs: Pair[] = [],\r\n originalAmountOut: CurrencyAmount = currencyAmountOut,\r\n bestTrades: Trade[] = []\r\n ): Trade[] {\r\n invariant(pairs.length > 0, 'PAIRS')\r\n invariant(maxHops > 0, 'MAX_HOPS')\r\n invariant(originalAmountOut === currencyAmountOut || currentPairs.length > 0, 'INVALID_RECURSION')\r\n const chainId: ChainId | undefined =\r\n currencyAmountOut instanceof TokenAmount\r\n ? currencyAmountOut.token.chainId\r\n : currencyIn instanceof Token\r\n ? currencyIn.chainId\r\n : undefined\r\n invariant(chainId !== undefined, 'CHAIN_ID')\r\n\r\n const amountOut = wrappedAmount(currencyAmountOut, chainId)\r\n const tokenIn = wrappedCurrency(currencyIn, chainId)\r\n for (let i = 0; i < pairs.length; i++) {\r\n const pair = pairs[i]\r\n // pair irrelevant\r\n if (!pair.token0.equals(amountOut.token) && !pair.token1.equals(amountOut.token)) continue\r\n if (pair.reserve0.equalTo(ZERO) || pair.reserve1.equalTo(ZERO)) continue\r\n\r\n let amountIn: TokenAmount\r\n try {\r\n ;[amountIn] = pair.getInputAmount(amountOut)\r\n } catch (error) {\r\n // not enough liquidity in this pair\r\n if (error.isInsufficientReservesError) {\r\n continue\r\n }\r\n throw error\r\n }\r\n // we have arrived at the input token, so this is the first trade of one of the paths\r\n if (amountIn.token.equals(tokenIn)) {\r\n sortedInsert(\r\n bestTrades,\r\n new Trade(\r\n new Route([pair, ...currentPairs], currencyIn, originalAmountOut.currency),\r\n originalAmountOut,\r\n TradeType.EXACT_OUTPUT\r\n ),\r\n maxNumResults,\r\n tradeComparator\r\n )\r\n } else if (maxHops > 1 && pairs.length > 1) {\r\n const pairsExcludingThisPair = pairs.slice(0, i).concat(pairs.slice(i + 1, pairs.length))\r\n\r\n // otherwise, consider all the other paths that arrive at this token as long as we have not exceeded maxHops\r\n Trade.bestTradeExactOut(\r\n pairsExcludingThisPair,\r\n currencyIn,\r\n amountIn,\r\n {\r\n maxNumResults,\r\n maxHops: maxHops - 1\r\n },\r\n [pair, ...currentPairs],\r\n originalAmountOut,\r\n bestTrades\r\n )\r\n }\r\n }\r\n\r\n return bestTrades\r\n }\r\n}\r\n","import { TradeType } from './constants'\r\nimport invariant from 'tiny-invariant'\r\nimport { validateAndParseAddress } from './utils'\r\nimport { CurrencyAmount, ETHER, Percent, Trade } from './entities'\r\n\r\n/**\r\n * Options for producing the arguments to send call to the router.\r\n */\r\nexport interface TradeOptions {\r\n /**\r\n * How much the execution price is allowed to move unfavorably from the trade execution price.\r\n */\r\n allowedSlippage: Percent\r\n /**\r\n * How long the swap is valid until it expires, in seconds.\r\n * This will be used to produce a `deadline` parameter which is computed from when the swap call parameters\r\n * are generated.\r\n */\r\n ttl: number\r\n /**\r\n * The account that should receive the output of the swap.\r\n */\r\n recipient: string\r\n\r\n /**\r\n * Whether any of the tokens in the path are fee on transfer tokens, which should be handled with special methods\r\n */\r\n feeOnTransfer?: boolean\r\n}\r\n\r\nexport interface TradeOptionsDeadline extends Omit<TradeOptions, 'ttl'> {\r\n /**\r\n * When the transaction expires.\r\n * This is an atlernate to specifying the ttl, for when you do not want to use local time.\r\n */\r\n deadline: number\r\n}\r\n\r\n/**\r\n * The parameters to use in the call to the Uniswap V2 Router to execute a trade.\r\n */\r\nexport interface SwapParameters {\r\n /**\r\n * The method to call on the Uniswap V2 Router.\r\n */\r\n methodName: string\r\n /**\r\n * The arguments to pass to the method, all hex encoded.\r\n */\r\n args: (string | string[])[]\r\n /**\r\n * The amount of wei to send in hex.\r\n */\r\n value: string\r\n}\r\n\r\nfunction toHex(currencyAmount: CurrencyAmount) {\r\n return `0x${currencyAmount.raw.toString(16)}`\r\n}\r\n\r\nconst ZERO_HEX = '0x0'\r\n\r\n/**\r\n * Represents the Uniswap V2 Router, and has static methods for helping execute trades.\r\n */\r\nexport abstract class Router {\r\n /**\r\n * Cannot be constructed.\r\n */\r\n private constructor() {}\r\n /**\r\n * Produces the on-chain method name to call and the hex encoded parameters to pass as arguments for a given trade.\r\n * @param trade to produce call parameters for\r\n * @param options options for the call parameters\r\n */\r\n public static swapCallParameters(trade: Trade, options: TradeOptions | TradeOptionsDeadline): SwapParameters {\r\n const etherIn = trade.inputAmount.currency === ETHER\r\n const etherOut = trade.outputAmount.currency === ETHER\r\n // the router does not support both ether in and out\r\n invariant(!(etherIn && etherOut), 'ETHER_IN_OUT')\r\n invariant(!('ttl' in options) || options.ttl > 0, 'TTL')\r\n\r\n const to: string = validateAndParseAddress(options.recipient)\r\n const amountIn: string = toHex(trade.maximumAmountIn(options.allowedSlippage))\r\n const amountOut: string = toHex(trade.minimumAmountOut(options.allowedSlippage))\r\n const path: string[] = trade.route.path.map(token => token.address)\r\n const deadline =\r\n 'ttl' in options\r\n ? `0x${(Math.floor(new Date().getTime() / 1000) + options.ttl).toString(16)}`\r\n : `0x${options.deadline.toString(16)}`\r\n\r\n const useFeeOnTransfer = Boolean(options.feeOnTransfer)\r\n\r\n let methodName: string\r\n let args: (string | string[])[]\r\n let value: string\r\n switch (trade.tradeType) {\r\n case TradeType.EXACT_INPUT:\r\n if (etherIn) {\r\n methodName = useFeeOnTransfer ? 'swapExactETHForTokensSupportingFeeOnTransferTokens' : 'swapExactETHForTokens'\r\n // (uint amountOutMin, address[] calldata path, address to, uint deadline)\r\n args = [amountOut, path, to, deadline]\r\n value = amountIn\r\n } else if (etherOut) {\r\n methodName = useFeeOnTransfer ? 'swapExactTokensForETHSupportingFeeOnTransferTokens' : 'swapExactTokensForETH'\r\n // (uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)\r\n args = [amountIn, amountOut, path, to, deadline]\r\n value = ZERO_HEX\r\n } else {\r\n methodName = useFeeOnTransfer\r\n ? 'swapExactTokensForTokensSupportingFeeOnTransferTokens'\r\n : 'swapExactTokensForTokens'\r\n // (uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)\r\n args = [amountIn, amountOut, path, to, deadline]\r\n value = ZERO_HEX\r\n }\r\n break\r\n case TradeType.EXACT_OUTPUT:\r\n invariant(!useFeeOnTransfer, 'EXACT_OUT_FOT')\r\n if (etherIn) {\r\n methodName = 'swapETHForExactTokens'\r\n // (uint amountOut, address[] calldata path, address to, uint deadline)\r\n args = [amountOut, path, to, deadline]\r\n value = amountIn\r\n } else if (etherOut) {\r\n methodName = 'swapTokensForExactETH'\r\n // (uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)\r\n args = [amountOut, amountIn, path, to, deadline]\r\n value = ZERO_HEX\r\n } else {\r\n methodName = 'swapTokensForExactTokens'\r\n // (uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)\r\n args = [amountOut, amountIn, path, to, deadline]\r\n value = ZERO_HEX\r\n }\r\n break\r\n }\r\n return {\r\n methodName,\r\n args,\r\n value\r\n }\r\n }\r\n}\r\n","import { Contract } from '@ethersproject/contracts'\r\nimport { getNetwork } from '@ethersproject/networks'\r\nimport { getDefaultProvider } from '@ethersproject/providers'\r\nimport { TokenAmount } from './entities/fractions/tokenAmount'\r\nimport { Pair } from './entities/pair'\r\nimport IUniswapV2Pair from '@uniswap/v2-core/build/IUniswapV2Pair.json'\r\nimport invariant from 'tiny-invariant'\r\nimport ERC20 from './abis/ERC20.json'\r\nimport { ChainId } from './constants'\r\nimport { Token } from './entities/token'\r\n\r\nlet TOKEN_DECIMALS_CACHE: { [chainId: number]: { [address: string]: number } } = {\r\n [ChainId.MAINNET]: {\r\n '0xE0B7927c4aF23765Cb51314A0E0521A9645F0E2A': 9 // DGD\r\n }\r\n}\r\n\r\n/**\r\n * Contains methods for constructing instances of pairs and tokens from on-chain data.\r\n */\r\nexport abstract class Fetcher {\r\n /**\r\n * Cannot be constructed.\r\n */\r\n private constructor() {}\r\n\r\n /**\r\n * Fetch information for a given token on the given chain, using the given ethers provider.\r\n * @param chainId chain of the token\r\n * @param address address of the token on the chain\r\n * @param provider provider used to fetch the token\r\n * @param symbol optional symbol of the token\r\n * @param name optional name of the token\r\n */\r\n public static async fetchTokenData(\r\n chainId: ChainId,\r\n address: string,\r\n provider = getDefaultProvider(getNetwork(chainId)),\r\n symbol?: string,\r\n name?: string\r\n ): Promise<Token> {\r\n const parsedDecimals =\r\n typeof TOKEN_DECIMALS_CACHE?.[chainId]?.[address] === 'number'\r\n ? TOKEN_DECIMALS_CACHE[chainId][address]\r\n : await new Contract(address, ERC20, provider).decimals().then((decimals: number): number => {\r\n TOKEN_DECIMALS_CACHE = {\r\n ...TOKEN_DECIMALS_CACHE,\r\n [chainId]: {\r\n ...TOKEN_DECIMALS_CACHE?.[chainId],\r\n [address]: decimals\r\n }\r\n }\r\n return decimals\r\n })\r\n return new Token(chainId, address, parsedDecimals, symbol, name)\r\n }\r\n\r\n /**\r\n * Fetches information about a pair and constructs a pair from the given two tokens.\r\n * @param tokenA first token\r\n * @param tokenB second token\r\n * @param provider the provider to use to fetch the data\r\n */\r\n public static async fetchPairData(\r\n tokenA: Token,\r\n tokenB: Token,\r\n provider = getDefaultProvider(getNetwork(tokenA.chainId))\r\n ): Promise<Pair> {\r\n invariant(tokenA.chainId === tokenB.chainId, 'CHAIN_ID')\r\n const address = Pair.getAddress(tokenA, tokenB)\r\n const [reserves0, reserves1] = await new Contract(address, IUniswapV2Pair.abi, provider).getReserves()\r\n const balances = tokenA.sortsBefore(tokenB) ? [reserves0, reserves1] : [reserves1, reserves0]\r\n return new Pair(new TokenAmount(tokenA, balances[0]), new TokenAmount(tokenB, balances[1]))\r\n }\r\n}\r\n"],"names":["ChainId","TradeType","Rounding","FACTORY_ADDRESS","INIT_CODE_HASH","MINIMUM_LIQUIDITY","JSBI","BigInt","ZERO","ONE","TWO","THREE","FIVE","TEN","_100","_997","_1000","SolidityType","SOLIDITY_TYPE_MAXIMA","uint8","uint256","CAN_SET_PROTOTYPE","Object","InsufficientReservesError","name","constructor","setPrototypeOf","prototype","Error","InsufficientInputAmountError","validateSolidityTypeInstance","value","solidityType","greaterThanOrEqual","invariant","lessThanOrEqual","validateAndParseAddress","address","checksummedAddress","getAddress","warning","error","parseBigintIsh","bigintIsh","toString","sqrt","y","z","x","greaterThan","add","divide","lessThan","notEqual","sortedInsert","items","maxSize","comparator","length","push","isFull","lo","hi","mid","splice","pop","Currency","decimals","symbol","change","cId","ETHER","Token","chainId","equals","other","sortsBefore","toLowerCase","currencyEquals","currencyA","currencyB","WETH","MAINNET","ROPSTEN","RINKEBY","GÖRLI","KOVAN","BINANCE","BINANCETEST","RSK","RSKTEST","XDAI","POLYGON","Decimal","toFormat","_Decimal","Big","_Big","toSignificantRounding","ROUND_DOWN","ROUND_HALF_UP","ROUND_UP","toFixedRounding","Fraction","numerator","denominator","invert","otherParsed","equal","multiply","subtract","equalTo","toSignificant","significantDigits","format","rounding","groupSeparator","Number","isInteger","set","precision","quotient","div","toSignificantDigits","decimalPlaces","toFixed","DP","RM","remainder","CurrencyAmount","currency","amount","parsedAmount","exponentiate","ether","raw","toExact","TokenAmount","token","Price","baseCurrency","quoteCurrency","scalar","fromRoute","route","prices","pairs","entries","i","pair","path","token0","reserve0","reserve1","slice","reduce","accumulator","currentValue","fraction","quote","currencyAmount","adjusted","PAIR_ADDRESS_CACHE","Pair","tokenAmountA","tokenAmountB","tokenAmounts","liquidityToken","tokenA","tokenB","tokens","undefined","getCreate2Address","keccak256","pack","involvesToken","token1","priceOf","token0Price","token1Price","reserveOf","getOutputAmount","inputAmount","inputReserve","outputReserve","inputAmountWithFee","outputAmount","getInputAmount","getLiquidityMinted","totalSupply","liquidity","amount0","amount1","getLiquidityValue","feeOn","kLast","totalSupplyAdjusted","kLastParsed","rootK","rootKLast","feeLiquidity","Route","input","output","every","currentInput","midPrice","_100_PERCENT","Percent","computePriceImpact","exactQuote","slippage","inputOutputComparator","a","b","tradeComparator","ioComp","priceImpact","wrappedAmount","wrappedCurrency","Trade","tradeType","amounts","Array","nextPairs","EXACT_INPUT","nextPair","EXACT_OUTPUT","executionPrice","nextMidPrice","exactIn","amountIn","exactOut","amountOut","minimumAmountOut","slippageTolerance","slippageAdjustedAmountOut","maximumAmountIn","slippageAdjustedAmountIn","bestTradeExactIn","currencyAmountIn","currencyOut","currentPairs","originalAmountIn","bestTrades","maxNumResults","maxHops","tokenOut","isInsufficientInputAmountError","pairsExcludingThisPair","concat","bestTradeExactOut","currencyIn","currencyAmountOut","originalAmountOut","tokenIn","isInsufficientReservesError","toHex","ZERO_HEX","Router","swapCallParameters","trade","options","etherIn","etherOut","ttl","to","recipient","allowedSlippage","map","deadline","Math","floor","Date","getTime","useFeeOnTransfer","Boolean","feeOnTransfer","methodName","args","TOKEN_DECIMALS_CACHE","Fetcher","fetchTokenData","provider","parsedDecimals","getDefaultProvider","getNetwork","Contract","ERC20","then","fetchPairData","IUniswapV2Pair","abi","getReserves","reserves0","reserves1","balances"],"mappings":"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"}