@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.
@@ -1,2 +1,2 @@
1
- "use strict";function t(t){return t&&"object"==typeof t&&"default"in t?t.default:t}Object.defineProperty(exports,"__esModule",{value:!0});var e,n,r,o,i=t(require("jsbi")),a=t(require("tiny-invariant")),u=(t(require("tiny-warning")),require("@ethersproject/address")),s=t(require("big.js")),c=t(require("toformat")),d=t(require("decimal.js-light")),p=require("@ethersproject/solidity"),f=require("@ethersproject/contracts"),l=require("@ethersproject/networks"),h=require("@ethersproject/providers"),m=t(require("@uniswap/v2-core/build/IUniswapV2Pair.json"));(n=exports.ChainId||(exports.ChainId={}))[n.MAINNET=1]="MAINNET",n[n.ROPSTEN=3]="ROPSTEN",n[n.RINKEBY=4]="RINKEBY",n[n["GÖRLI"]=5]="GÖRLI",n[n.RSK=30]="RSK",n[n.RSKTEST=31]="RSKTEST",n[n.KOVAN=42]="KOVAN",n[n.BINANCE=56]="BINANCE",n[n.BINANCETEST=97]="BINANCETEST",n[n.XDAI=100]="XDAI",n[n.POLYGON=137]="POLYGON",(r=exports.TradeType||(exports.TradeType={}))[r.EXACT_INPUT=0]="EXACT_INPUT",r[r.EXACT_OUTPUT=1]="EXACT_OUTPUT",(o=exports.Rounding||(exports.Rounding={}))[o.ROUND_DOWN=0]="ROUND_DOWN",o[o.ROUND_HALF_UP=1]="ROUND_HALF_UP",o[o.ROUND_UP=2]="ROUND_UP";var v,y="0x6c0dd0b3d906c70e40fd9e96936f31ff1b70fe5784bae36fcbab40725d974a67",T=i.BigInt(1e3),w=i.BigInt(0),g=i.BigInt(1),k=i.BigInt(2),x=i.BigInt(3),I=i.BigInt(5),A=i.BigInt(10),b=i.BigInt(100),E=i.BigInt(997),O=i.BigInt(1e3);!function(t){t.uint8="uint8",t.uint256="uint256"}(v||(v={}));var N=((e={})[v.uint8]=i.BigInt("0xff"),e[v.uint256]=i.BigInt("0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"),e);function C(t,e){for(var n=0;n<e.length;n++){var r=e[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(t,r.key,r)}}function q(t,e,n){return e&&C(t.prototype,e),n&&C(t,n),t}function R(){return(R=Object.assign||function(t){for(var e=1;e<arguments.length;e++){var n=arguments[e];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(t[r]=n[r])}return t}).apply(this,arguments)}function B(t,e){t.prototype=Object.create(e.prototype),t.prototype.constructor=t,S(t,e)}function P(t){return(P=Object.setPrototypeOf?Object.getPrototypeOf:function(t){return t.__proto__||Object.getPrototypeOf(t)})(t)}function S(t,e){return(S=Object.setPrototypeOf||function(t,e){return t.__proto__=e,t})(t,e)}function U(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(t){return!1}}function _(t,e,n){return(_=U()?Reflect.construct:function(t,e,n){var r=[null];r.push.apply(r,e);var o=new(Function.bind.apply(t,r));return n&&S(o,n.prototype),o}).apply(null,arguments)}function D(t){var e="function"==typeof Map?new Map:void 0;return(D=function(t){if(null===t||-1===Function.toString.call(t).indexOf("[native code]"))return t;if("function"!=typeof t)throw new TypeError("Super expression must either be null or a function");if(void 0!==e){if(e.has(t))return e.get(t);e.set(t,n)}function n(){return _(t,arguments,P(this).constructor)}return n.prototype=Object.create(t.prototype,{constructor:{value:n,enumerable:!1,writable:!0,configurable:!0}}),S(n,t)})(t)}function F(t){if(void 0===t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return t}function j(t,e){(null==e||e>t.length)&&(e=t.length);for(var n=0,r=new Array(e);n<e;n++)r[n]=t[n];return r}function W(t,e){var n="undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(n)return(n=n.call(t)).next.bind(n);if(Array.isArray(t)||(n=function(t,e){if(t){if("string"==typeof t)return j(t,void 0);var n=Object.prototype.toString.call(t).slice(8,-1);return"Object"===n&&t.constructor&&(n=t.constructor.name),"Map"===n||"Set"===n?Array.from(t):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?j(t,void 0):void 0}}(t))||e&&t&&"number"==typeof t.length){n&&(t=n);var r=0;return function(){return r>=t.length?{done:!0}:{done:!1,value:t[r++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var H="setPrototypeOf"in Object,M=function(t){function e(){var n;return(n=t.call(this)||this).isInsufficientReservesError=!0,n.name=n.constructor.name,H&&Object.setPrototypeOf(F(n),(this instanceof e?this.constructor:void 0).prototype),n}return B(e,t),e}(D(Error)),X=function(t){function e(){var n;return(n=t.call(this)||this).isInsufficientInputAmountError=!0,n.name=n.constructor.name,H&&Object.setPrototypeOf(F(n),(this instanceof e?this.constructor:void 0).prototype),n}return B(e,t),e}(D(Error));function L(t,e){i.greaterThanOrEqual(t,w)||a(!1),i.lessThanOrEqual(t,N[e])||a(!1)}function K(t){try{return u.getAddress(t)}catch(t){a(!1)}}function Y(t){return t instanceof i?t:i.BigInt("bigint"==typeof t?t.toString():t)}function G(t){L(t,v.uint256);var e,n=w;if(i.greaterThan(t,x))for(n=t,e=i.add(i.divide(t,k),g);i.lessThan(e,n);)n=e,e=i.divide(i.add(i.divide(t,e),e),k);else i.notEqual(t,w)&&(n=g);return n}function V(t,e,n,r){if(n>0||a(!1),t.length<=n||a(!1),0===t.length)return t.push(e),null;var o=t.length===n;if(o&&r(t[t.length-1],e)<=0)return e;for(var i=0,u=t.length;i<u;){var s=i+u>>>1;r(t[s],e)<=0?i=s+1:u=s}return t.splice(i,0,e),o?t.pop():null}var J=function(){function t(t,e,n){L(i.BigInt(t),v.uint8),this.decimals=t,this.symbol=e,this.name=n}return t.prototype.change=function(t){1==t&&($.name="Ether",$.symbol="ETH"),56==t&&($.name="BNB",$.symbol="BNB"),137==t&&($.name="Matic",$.symbol="MATIC"),30==t&&($.name="Smart Bitcoin",$.symbol="RBTC"),31==t&&($.name="Smart Bitcoin",$.symbol="tRBTC")},t}();J.ETHER=new J(18,"BNB","BNB");var Q,$=J.ETHER,z=function(t){function e(e,n,r,o,i){var a;return(a=t.call(this,r,o,i)||this).chainId=e,a.address=K(n),a}B(e,t);var n=e.prototype;return n.equals=function(t){return this===t||this.chainId===t.chainId&&this.address===t.address},n.sortsBefore=function(t){return this.chainId!==t.chainId&&a(!1),this.address===t.address&&a(!1),this.address.toLowerCase()<t.address.toLowerCase()},e}(J);function Z(t,e){return t instanceof z&&e instanceof z?t.equals(e):!(t instanceof z||e instanceof z||t!==e)}var tt,et,nt=((Q={})[exports.ChainId.MAINNET]=new z(exports.ChainId.MAINNET,"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",18,"WETH","Wrapped Ether"),Q[exports.ChainId.ROPSTEN]=new z(exports.ChainId.ROPSTEN,"0xc778417E063141139Fce010982780140Aa0cD5Ab",18,"WETH","Wrapped Ether"),Q[exports.ChainId.RINKEBY]=new z(exports.ChainId.RINKEBY,"0xc778417E063141139Fce010982780140Aa0cD5Ab",18,"WETH","Wrapped Ether"),Q[exports.ChainId.GÖRLI]=new z(exports.ChainId.GÖRLI,"0xB4FBF271143F4FBf7B91A5ded31805e42b2208d6",18,"WETH","Wrapped Ether"),Q[exports.ChainId.KOVAN]=new z(exports.ChainId.KOVAN,"0xd0A1E359811322d97991E03f863a0C30C2cF029C",18,"WETH","Wrapped Ether"),Q[exports.ChainId.BINANCE]=new z(exports.ChainId.BINANCE,"0xbb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c",18,"WBNB","Wrapped BNB"),Q[exports.ChainId.BINANCETEST]=new z(exports.ChainId.BINANCETEST,"0xbb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c",18,"WBNB","Wrapped BNB"),Q[exports.ChainId.RSK]=new z(exports.ChainId.RSK,"0xFa26ecdA879AC88AfD047cc6e046E85B9aFBa2CC",18,"WrBTC","Wrapped rBTC"),Q[exports.ChainId.RSKTEST]=new z(exports.ChainId.RSKTEST,"0xbb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c",18,"WBNB","Wrapped BNB"),Q[exports.ChainId.XDAI]=new z(exports.ChainId.XDAI,"0xe91D153E0b41518A2Ce8Dd3D7944Fa863463a97d",18,"WXDAI","Wrapped XDAI"),Q[exports.ChainId.POLYGON]=new z(exports.ChainId.POLYGON,"0x0d500b1d8e8ef31e21c99d1db9a6444d3adf1270",18,"WMATIC","Wrapped Matic"),Q),rt=c(d),ot=c(s),it=((tt={})[exports.Rounding.ROUND_DOWN]=rt.ROUND_DOWN,tt[exports.Rounding.ROUND_HALF_UP]=rt.ROUND_HALF_UP,tt[exports.Rounding.ROUND_UP]=rt.ROUND_UP,tt),at=((et={})[exports.Rounding.ROUND_DOWN]=0,et[exports.Rounding.ROUND_HALF_UP]=1,et[exports.Rounding.ROUND_UP]=3,et),ut=function(){function t(t,e){void 0===e&&(e=g),this.numerator=Y(t),this.denominator=Y(e)}var e=t.prototype;return e.invert=function(){return new t(this.denominator,this.numerator)},e.add=function(e){var n=e instanceof t?e:new t(Y(e));return i.equal(this.denominator,n.denominator)?new t(i.add(this.numerator,n.numerator),this.denominator):new t(i.add(i.multiply(this.numerator,n.denominator),i.multiply(n.numerator,this.denominator)),i.multiply(this.denominator,n.denominator))},e.subtract=function(e){var n=e instanceof t?e:new t(Y(e));return i.equal(this.denominator,n.denominator)?new t(i.subtract(this.numerator,n.numerator),this.denominator):new t(i.subtract(i.multiply(this.numerator,n.denominator),i.multiply(n.numerator,this.denominator)),i.multiply(this.denominator,n.denominator))},e.lessThan=function(e){var n=e instanceof t?e:new t(Y(e));return i.lessThan(i.multiply(this.numerator,n.denominator),i.multiply(n.numerator,this.denominator))},e.equalTo=function(e){var n=e instanceof t?e:new t(Y(e));return i.equal(i.multiply(this.numerator,n.denominator),i.multiply(n.numerator,this.denominator))},e.greaterThan=function(e){var n=e instanceof t?e:new t(Y(e));return i.greaterThan(i.multiply(this.numerator,n.denominator),i.multiply(n.numerator,this.denominator))},e.multiply=function(e){var n=e instanceof t?e:new t(Y(e));return new t(i.multiply(this.numerator,n.numerator),i.multiply(this.denominator,n.denominator))},e.divide=function(e){var n=e instanceof t?e:new t(Y(e));return new t(i.multiply(this.numerator,n.denominator),i.multiply(this.denominator,n.numerator))},e.toSignificant=function(t,e,n){void 0===e&&(e={groupSeparator:""}),void 0===n&&(n=exports.Rounding.ROUND_HALF_UP),Number.isInteger(t)||a(!1),t>0||a(!1),rt.set({precision:t+1,rounding:it[n]});var r=new rt(this.numerator.toString()).div(this.denominator.toString()).toSignificantDigits(t);return r.toFormat(r.decimalPlaces(),e)},e.toFixed=function(t,e,n){return void 0===e&&(e={groupSeparator:""}),void 0===n&&(n=exports.Rounding.ROUND_HALF_UP),Number.isInteger(t)||a(!1),t>=0||a(!1),ot.DP=t,ot.RM=at[n],new ot(this.numerator.toString()).div(this.denominator.toString()).toFormat(t,e)},q(t,[{key:"quotient",get:function(){return i.divide(this.numerator,this.denominator)}},{key:"remainder",get:function(){return new t(i.remainder(this.numerator,this.denominator),this.denominator)}}]),t}(),st=c(s),ct=function(t){function e(e,n){var r,o=Y(n);return L(o,v.uint256),(r=t.call(this,o,i.exponentiate(A,i.BigInt(e.decimals)))||this).currency=e,r}B(e,t),e.ether=function(t){return new e($,t)};var n=e.prototype;return n.add=function(t){return Z(this.currency,t.currency)||a(!1),new e(this.currency,i.add(this.raw,t.raw))},n.subtract=function(t){return Z(this.currency,t.currency)||a(!1),new e(this.currency,i.subtract(this.raw,t.raw))},n.toSignificant=function(e,n,r){return void 0===e&&(e=6),void 0===r&&(r=exports.Rounding.ROUND_DOWN),t.prototype.toSignificant.call(this,e,n,r)},n.toFixed=function(e,n,r){return void 0===e&&(e=this.currency.decimals),void 0===r&&(r=exports.Rounding.ROUND_DOWN),e<=this.currency.decimals||a(!1),t.prototype.toFixed.call(this,e,n,r)},n.toExact=function(t){return void 0===t&&(t={groupSeparator:""}),st.DP=this.currency.decimals,new st(this.numerator.toString()).div(this.denominator.toString()).toFormat(t)},q(e,[{key:"raw",get:function(){return this.numerator}}]),e}(ut),dt=function(t){function e(e,n){var r;return(r=t.call(this,e,n)||this).token=e,r}B(e,t);var n=e.prototype;return n.add=function(t){return this.token.equals(t.token)||a(!1),new e(this.token,i.add(this.raw,t.raw))},n.subtract=function(t){return this.token.equals(t.token)||a(!1),new e(this.token,i.subtract(this.raw,t.raw))},e}(ct),pt=function(t){function e(e,n,r,o){var a;return(a=t.call(this,o,r)||this).baseCurrency=e,a.quoteCurrency=n,a.scalar=new ut(i.exponentiate(A,i.BigInt(e.decimals)),i.exponentiate(A,i.BigInt(n.decimals))),a}B(e,t),e.fromRoute=function(t){for(var n,r=[],o=W(t.pairs.entries());!(n=o()).done;){var i=n.value,a=i[1];r.push(t.path[i[0]].equals(a.token0)?new e(a.reserve0.currency,a.reserve1.currency,a.reserve0.raw,a.reserve1.raw):new e(a.reserve1.currency,a.reserve0.currency,a.reserve1.raw,a.reserve0.raw))}return r.slice(1).reduce((function(t,e){return t.multiply(e)}),r[0])};var n=e.prototype;return n.invert=function(){return new e(this.quoteCurrency,this.baseCurrency,this.numerator,this.denominator)},n.multiply=function(n){Z(this.quoteCurrency,n.baseCurrency)||a(!1);var r=t.prototype.multiply.call(this,n);return new e(this.baseCurrency,n.quoteCurrency,r.denominator,r.numerator)},n.quote=function(e){return Z(e.currency,this.baseCurrency)||a(!1),this.quoteCurrency instanceof z?new dt(this.quoteCurrency,t.prototype.multiply.call(this,e.raw).quotient):ct.ether(t.prototype.multiply.call(this,e.raw).quotient)},n.toSignificant=function(t,e,n){return void 0===t&&(t=6),this.adjusted.toSignificant(t,e,n)},n.toFixed=function(t,e,n){return void 0===t&&(t=4),this.adjusted.toFixed(t,e,n)},q(e,[{key:"raw",get:function(){return new ut(this.numerator,this.denominator)}},{key:"adjusted",get:function(){return t.prototype.multiply.call(this,this.scalar)}}]),e}(ut),ft={},lt=function(){function t(e,n){var r=e.token.sortsBefore(n.token)?[e,n]:[n,e];this.liquidityToken=new z(r[0].token.chainId,t.getAddress(r[0].token,r[1].token),18,"UNI-V2","Uniswap V2"),this.tokenAmounts=r}t.getAddress=function(t,e){var n,r,o,i,a,s=t.sortsBefore(e)?[t,e]:[e,t];return void 0===(null===(n=ft)||void 0===n||null===(r=n[s[0].address])||void 0===r?void 0:r[s[1].address])&&(ft=R({},ft,((a={})[s[0].address]=R({},null===(o=ft)||void 0===o?void 0:o[s[0].address],((i={})[s[1].address]=u.getCreate2Address("0x063af7b01B067eE135344FEf85d6Aecea14CFA05",p.keccak256(["bytes"],[p.pack(["address","address"],[s[0].address,s[1].address])]),y),i)),a))),ft[s[0].address][s[1].address]};var e=t.prototype;return e.involvesToken=function(t){return t.equals(this.token0)||t.equals(this.token1)},e.priceOf=function(t){return this.involvesToken(t)||a(!1),t.equals(this.token0)?this.token0Price:this.token1Price},e.reserveOf=function(t){return this.involvesToken(t)||a(!1),t.equals(this.token0)?this.reserve0:this.reserve1},e.getOutputAmount=function(e){if(this.involvesToken(e.token)||a(!1),i.equal(this.reserve0.raw,w)||i.equal(this.reserve1.raw,w))throw new M;var n=this.reserveOf(e.token),r=this.reserveOf(e.token.equals(this.token0)?this.token1:this.token0),o=i.multiply(e.raw,E),u=i.multiply(o,r.raw),s=i.add(i.multiply(n.raw,O),o),c=new dt(e.token.equals(this.token0)?this.token1:this.token0,i.divide(u,s));if(i.equal(c.raw,w))throw new X;return[c,new t(n.add(e),r.subtract(c))]},e.getInputAmount=function(e){if(this.involvesToken(e.token)||a(!1),i.equal(this.reserve0.raw,w)||i.equal(this.reserve1.raw,w)||i.greaterThanOrEqual(e.raw,this.reserveOf(e.token).raw))throw new M;var n=this.reserveOf(e.token),r=this.reserveOf(e.token.equals(this.token0)?this.token1:this.token0),o=i.multiply(i.multiply(r.raw,e.raw),O),u=i.multiply(i.subtract(n.raw,e.raw),E),s=new dt(e.token.equals(this.token0)?this.token1:this.token0,i.add(i.divide(o,u),g));return[s,new t(r.add(s),n.subtract(e))]},e.getLiquidityMinted=function(t,e,n){t.token.equals(this.liquidityToken)||a(!1);var r,o=e.token.sortsBefore(n.token)?[e,n]:[n,e];if(o[0].token.equals(this.token0)&&o[1].token.equals(this.token1)||a(!1),i.equal(t.raw,w))r=i.subtract(G(i.multiply(o[0].raw,o[1].raw)),T);else{var u=i.divide(i.multiply(o[0].raw,t.raw),this.reserve0.raw),s=i.divide(i.multiply(o[1].raw,t.raw),this.reserve1.raw);r=i.lessThanOrEqual(u,s)?u:s}if(!i.greaterThan(r,w))throw new X;return new dt(this.liquidityToken,r)},e.getLiquidityValue=function(t,e,n,r,o){var u;if(void 0===r&&(r=!1),this.involvesToken(t)||a(!1),e.token.equals(this.liquidityToken)||a(!1),n.token.equals(this.liquidityToken)||a(!1),i.lessThanOrEqual(n.raw,e.raw)||a(!1),r){o||a(!1);var s=Y(o);if(i.equal(s,w))u=e;else{var c=G(i.multiply(this.reserve0.raw,this.reserve1.raw)),d=G(s);if(i.greaterThan(c,d)){var p=i.multiply(e.raw,i.subtract(c,d)),f=i.add(i.multiply(c,I),d),l=i.divide(p,f);u=e.add(new dt(this.liquidityToken,l))}else u=e}}else u=e;return new dt(t,i.divide(i.multiply(n.raw,this.reserveOf(t).raw),u.raw))},q(t,[{key:"token0Price",get:function(){return new pt(this.token0,this.token1,this.tokenAmounts[0].raw,this.tokenAmounts[1].raw)}},{key:"token1Price",get:function(){return new pt(this.token1,this.token0,this.tokenAmounts[1].raw,this.tokenAmounts[0].raw)}},{key:"chainId",get:function(){return this.token0.chainId}},{key:"token0",get:function(){return this.tokenAmounts[0].token}},{key:"token1",get:function(){return this.tokenAmounts[1].token}},{key:"reserve0",get:function(){return this.tokenAmounts[0]}},{key:"reserve1",get:function(){return this.tokenAmounts[1]}}]),t}(),ht=function(){function t(t,e,n){t.length>0||a(!1),t.every((function(e){return e.chainId===t[0].chainId}))||a(!1),e instanceof z&&t[0].involvesToken(e)||e===$&&t[0].involvesToken(nt[t[0].chainId])||a(!1),void 0===n||n instanceof z&&t[t.length-1].involvesToken(n)||n===$&&t[t.length-1].involvesToken(nt[t[0].chainId])||a(!1);for(var r,o=[e instanceof z?e:nt[t[0].chainId]],i=W(t.entries());!(r=i()).done;){var u=r.value,s=u[1],c=o[u[0]];c.equals(s.token0)||c.equals(s.token1)||a(!1);var d=c.equals(s.token0)?s.token1:s.token0;o.push(d)}this.pairs=t,this.path=o,this.midPrice=pt.fromRoute(this),this.input=e,this.output=null!=n?n:o[o.length-1]}return q(t,[{key:"chainId",get:function(){return this.pairs[0].chainId}}]),t}(),mt=new ut(b),vt=function(t){function e(){return t.apply(this,arguments)||this}B(e,t);var n=e.prototype;return n.toSignificant=function(t,e,n){return void 0===t&&(t=5),this.multiply(mt).toSignificant(t,e,n)},n.toFixed=function(t,e,n){return void 0===t&&(t=2),this.multiply(mt).toFixed(t,e,n)},e}(ut);function yt(t,e){return Z(t.inputAmount.currency,e.inputAmount.currency)||a(!1),Z(t.outputAmount.currency,e.outputAmount.currency)||a(!1),t.outputAmount.equalTo(e.outputAmount)?t.inputAmount.equalTo(e.inputAmount)?0:t.inputAmount.lessThan(e.inputAmount)?-1:1:t.outputAmount.lessThan(e.outputAmount)?1:-1}function Tt(t,e){var n=yt(t,e);return 0!==n?n:t.priceImpact.lessThan(e.priceImpact)?-1:t.priceImpact.greaterThan(e.priceImpact)?1:t.route.path.length-e.route.path.length}function wt(t,e){return t instanceof dt?t:t.currency===$?new dt(nt[e],t.raw):void a(!1)}function gt(t,e){return t instanceof z?t:t===$?nt[e]:void a(!1)}var kt=function(){function t(t,e,n){var r,o,i,u=new Array(t.path.length),s=new Array(t.pairs.length);if(n===exports.TradeType.EXACT_INPUT){Z(e.currency,t.input)||a(!1),u[0]=wt(e,t.chainId);for(var c=0;c<t.path.length-1;c++){var d=t.pairs[c].getOutputAmount(u[c]),p=d[1];u[c+1]=d[0],s[c]=p}}else{Z(e.currency,t.output)||a(!1),u[u.length-1]=wt(e,t.chainId);for(var f=t.path.length-1;f>0;f--){var l=t.pairs[f-1].getInputAmount(u[f]),h=l[1];u[f-1]=l[0],s[f-1]=h}}this.route=t,this.tradeType=n,this.inputAmount=n===exports.TradeType.EXACT_INPUT?e:t.input===$?ct.ether(u[0].raw):u[0],this.outputAmount=n===exports.TradeType.EXACT_OUTPUT?e:t.output===$?ct.ether(u[u.length-1].raw):u[u.length-1],this.executionPrice=new pt(this.inputAmount.currency,this.outputAmount.currency,this.inputAmount.raw,this.outputAmount.raw),this.nextMidPrice=pt.fromRoute(new ht(s,t.input)),this.priceImpact=(r=this.outputAmount,i=(o=t.midPrice.raw.multiply(this.inputAmount.raw)).subtract(r.raw).divide(o),new vt(i.numerator,i.denominator))}t.exactIn=function(e,n){return new t(e,n,exports.TradeType.EXACT_INPUT)},t.exactOut=function(e,n){return new t(e,n,exports.TradeType.EXACT_OUTPUT)};var e=t.prototype;return e.minimumAmountOut=function(t){if(t.lessThan(w)&&a(!1),this.tradeType===exports.TradeType.EXACT_OUTPUT)return this.outputAmount;var e=new ut(g).add(t).invert().multiply(this.outputAmount.raw).quotient;return this.outputAmount instanceof dt?new dt(this.outputAmount.token,e):ct.ether(e)},e.maximumAmountIn=function(t){if(t.lessThan(w)&&a(!1),this.tradeType===exports.TradeType.EXACT_INPUT)return this.inputAmount;var e=new ut(g).add(t).multiply(this.inputAmount.raw).quotient;return this.inputAmount instanceof dt?new dt(this.inputAmount.token,e):ct.ether(e)},t.bestTradeExactIn=function(e,n,r,o,i,u,s){var c=void 0===o?{}:o,d=c.maxNumResults,p=void 0===d?3:d,f=c.maxHops,l=void 0===f?3:f;void 0===i&&(i=[]),void 0===u&&(u=n),void 0===s&&(s=[]),e.length>0||a(!1),l>0||a(!1),u===n||i.length>0||a(!1);var h=n instanceof dt?n.token.chainId:r instanceof z?r.chainId:void 0;void 0===h&&a(!1);for(var m=wt(n,h),v=gt(r,h),y=0;y<e.length;y++){var T=e[y];if((T.token0.equals(m.token)||T.token1.equals(m.token))&&!T.reserve0.equalTo(w)&&!T.reserve1.equalTo(w)){var g=void 0;try{g=T.getOutputAmount(m)[0]}catch(t){if(t.isInsufficientInputAmountError)continue;throw t}if(g.token.equals(v))V(s,new t(new ht([].concat(i,[T]),u.currency,r),u,exports.TradeType.EXACT_INPUT),p,Tt);else if(l>1&&e.length>1){var k=e.slice(0,y).concat(e.slice(y+1,e.length));t.bestTradeExactIn(k,g,r,{maxNumResults:p,maxHops:l-1},[].concat(i,[T]),u,s)}}}return s},t.bestTradeExactOut=function(e,n,r,o,i,u,s){var c=void 0===o?{}:o,d=c.maxNumResults,p=void 0===d?3:d,f=c.maxHops,l=void 0===f?3:f;void 0===i&&(i=[]),void 0===u&&(u=r),void 0===s&&(s=[]),e.length>0||a(!1),l>0||a(!1),u===r||i.length>0||a(!1);var h=r instanceof dt?r.token.chainId:n instanceof z?n.chainId:void 0;void 0===h&&a(!1);for(var m=wt(r,h),v=gt(n,h),y=0;y<e.length;y++){var T=e[y];if((T.token0.equals(m.token)||T.token1.equals(m.token))&&!T.reserve0.equalTo(w)&&!T.reserve1.equalTo(w)){var g=void 0;try{g=T.getInputAmount(m)[0]}catch(t){if(t.isInsufficientReservesError)continue;throw t}if(g.token.equals(v))V(s,new t(new ht([T].concat(i),n,u.currency),u,exports.TradeType.EXACT_OUTPUT),p,Tt);else if(l>1&&e.length>1){var k=e.slice(0,y).concat(e.slice(y+1,e.length));t.bestTradeExactOut(k,n,g,{maxNumResults:p,maxHops:l-1},[T].concat(i),u,s)}}}return s},t}();function xt(t){return"0x"+t.raw.toString(16)}var It,At=function(){function t(){}return t.swapCallParameters=function(t,e){var n=t.inputAmount.currency===$,r=t.outputAmount.currency===$;n&&r&&a(!1),!("ttl"in e)||e.ttl>0||a(!1);var o,i,u,s=K(e.recipient),c=xt(t.maximumAmountIn(e.allowedSlippage)),d=xt(t.minimumAmountOut(e.allowedSlippage)),p=t.route.path.map((function(t){return t.address})),f="ttl"in e?"0x"+(Math.floor((new Date).getTime()/1e3)+e.ttl).toString(16):"0x"+e.deadline.toString(16),l=Boolean(e.feeOnTransfer);switch(t.tradeType){case exports.TradeType.EXACT_INPUT:n?(o=l?"swapExactETHForTokensSupportingFeeOnTransferTokens":"swapExactETHForTokens",i=[d,p,s,f],u=c):r?(o=l?"swapExactTokensForETHSupportingFeeOnTransferTokens":"swapExactTokensForETH",i=[c,d,p,s,f],u="0x0"):(o=l?"swapExactTokensForTokensSupportingFeeOnTransferTokens":"swapExactTokensForTokens",i=[c,d,p,s,f],u="0x0");break;case exports.TradeType.EXACT_OUTPUT:l&&a(!1),n?(o="swapETHForExactTokens",i=[d,p,s,f],u=c):r?(o="swapTokensForExactETH",i=[d,c,p,s,f],u="0x0"):(o="swapTokensForExactTokens",i=[d,c,p,s,f],u="0x0")}return{methodName:o,args:i,value:u}},t}(),bt=[{constant:!0,inputs:[],name:"decimals",outputs:[{name:"",type:"uint8"}],payable:!1,stateMutability:"view",type:"function"},{constant:!0,inputs:[{name:"",type:"address"}],name:"balanceOf",outputs:[{name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"}],Et=((It={})[exports.ChainId.MAINNET]={"0xE0B7927c4aF23765Cb51314A0E0521A9645F0E2A":9},It),Ot=function(){function t(){}return t.fetchTokenData=function(t,e,n,r,o){try{var i,a,u=function(n){return new z(t,e,n,r,o)};void 0===n&&(n=h.getDefaultProvider(l.getNetwork(t)));var s="number"==typeof(null===(i=Et)||void 0===i||null===(a=i[t])||void 0===a?void 0:a[e]);return Promise.resolve(s?u(Et[t][e]):Promise.resolve(new f.Contract(e,bt,n).decimals().then((function(n){var r,o,i;return Et=R({},Et,((i={})[t]=R({},null===(r=Et)||void 0===r?void 0:r[t],((o={})[e]=n,o)),i)),n}))).then(u))}catch(t){return Promise.reject(t)}},t.fetchPairData=function(t,e,n){try{void 0===n&&(n=h.getDefaultProvider(l.getNetwork(t.chainId))),t.chainId!==e.chainId&&a(!1);var r=lt.getAddress(t,e);return Promise.resolve(new f.Contract(r,m.abi,n).getReserves()).then((function(n){var r=n[0],o=n[1],i=t.sortsBefore(e)?[r,o]:[o,r];return new lt(new dt(t,i[0]),new dt(e,i[1]))}))}catch(t){return Promise.reject(t)}},t}();exports.JSBI=i,exports.Currency=J,exports.CurrencyAmount=ct,exports.ETHER=$,exports.FACTORY_ADDRESS="0x063af7b01B067eE135344FEf85d6Aecea14CFA05",exports.Fetcher=Ot,exports.Fraction=ut,exports.INIT_CODE_HASH=y,exports.InsufficientInputAmountError=X,exports.InsufficientReservesError=M,exports.MINIMUM_LIQUIDITY=T,exports.Pair=lt,exports.Percent=vt,exports.Price=pt,exports.Route=ht,exports.Router=At,exports.Token=z,exports.TokenAmount=dt,exports.Trade=kt,exports.WETH=nt,exports.currencyEquals=Z,exports.inputOutputComparator=yt,exports.tradeComparator=Tt;
1
+ "use strict";function t(t){return t&&"object"==typeof t&&"default"in t?t.default:t}Object.defineProperty(exports,"__esModule",{value:!0});var e,n,r,o,i=t(require("jsbi")),a=t(require("tiny-invariant")),u=(t(require("tiny-warning")),require("@ethersproject/address")),s=t(require("big.js")),c=t(require("toformat")),d=t(require("decimal.js-light")),p=require("@ethersproject/solidity"),f=require("@ethersproject/contracts"),l=require("@ethersproject/networks"),h=require("@ethersproject/providers"),m=t(require("@uniswap/v2-core/build/IUniswapV2Pair.json"));(n=exports.ChainId||(exports.ChainId={}))[n.MAINNET=1]="MAINNET",n[n.ROPSTEN=3]="ROPSTEN",n[n.RINKEBY=4]="RINKEBY",n[n["GÖRLI"]=5]="GÖRLI",n[n.RSK=30]="RSK",n[n.RSKTEST=31]="RSKTEST",n[n.KOVAN=42]="KOVAN",n[n.BINANCE=56]="BINANCE",n[n.BINANCETEST=97]="BINANCETEST",n[n.XDAI=100]="XDAI",n[n.POLYGON=137]="POLYGON",(r=exports.TradeType||(exports.TradeType={}))[r.EXACT_INPUT=0]="EXACT_INPUT",r[r.EXACT_OUTPUT=1]="EXACT_OUTPUT",(o=exports.Rounding||(exports.Rounding={}))[o.ROUND_DOWN=0]="ROUND_DOWN",o[o.ROUND_HALF_UP=1]="ROUND_HALF_UP",o[o.ROUND_UP=2]="ROUND_UP";var v,y="0x6c0dd0b3d906c70e40fd9e96936f31ff1b70fe5784bae36fcbab40725d974a67",T=i.BigInt(1e3),w=i.BigInt(0),g=i.BigInt(1),k=i.BigInt(2),x=i.BigInt(3),I=i.BigInt(5),A=i.BigInt(10),b=i.BigInt(100),E=i.BigInt(997),O=i.BigInt(1e3);!function(t){t.uint8="uint8",t.uint256="uint256"}(v||(v={}));var N=((e={})[v.uint8]=i.BigInt("0xff"),e[v.uint256]=i.BigInt("0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"),e);function C(t,e){for(var n=0;n<e.length;n++){var r=e[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(t,r.key,r)}}function q(t,e,n){return e&&C(t.prototype,e),n&&C(t,n),t}function R(){return(R=Object.assign||function(t){for(var e=1;e<arguments.length;e++){var n=arguments[e];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(t[r]=n[r])}return t}).apply(this,arguments)}function B(t,e){t.prototype=Object.create(e.prototype),t.prototype.constructor=t,S(t,e)}function P(t){return(P=Object.setPrototypeOf?Object.getPrototypeOf:function(t){return t.__proto__||Object.getPrototypeOf(t)})(t)}function S(t,e){return(S=Object.setPrototypeOf||function(t,e){return t.__proto__=e,t})(t,e)}function U(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(t){return!1}}function _(t,e,n){return(_=U()?Reflect.construct:function(t,e,n){var r=[null];r.push.apply(r,e);var o=new(Function.bind.apply(t,r));return n&&S(o,n.prototype),o}).apply(null,arguments)}function D(t){var e="function"==typeof Map?new Map:void 0;return(D=function(t){if(null===t||-1===Function.toString.call(t).indexOf("[native code]"))return t;if("function"!=typeof t)throw new TypeError("Super expression must either be null or a function");if(void 0!==e){if(e.has(t))return e.get(t);e.set(t,n)}function n(){return _(t,arguments,P(this).constructor)}return n.prototype=Object.create(t.prototype,{constructor:{value:n,enumerable:!1,writable:!0,configurable:!0}}),S(n,t)})(t)}function F(t){if(void 0===t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return t}function j(t,e){(null==e||e>t.length)&&(e=t.length);for(var n=0,r=new Array(e);n<e;n++)r[n]=t[n];return r}function W(t,e){var n="undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(n)return(n=n.call(t)).next.bind(n);if(Array.isArray(t)||(n=function(t,e){if(t){if("string"==typeof t)return j(t,void 0);var n=Object.prototype.toString.call(t).slice(8,-1);return"Object"===n&&t.constructor&&(n=t.constructor.name),"Map"===n||"Set"===n?Array.from(t):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?j(t,void 0):void 0}}(t))||e&&t&&"number"==typeof t.length){n&&(t=n);var r=0;return function(){return r>=t.length?{done:!0}:{done:!1,value:t[r++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var H="setPrototypeOf"in Object,M=function(t){function e(){var n;return(n=t.call(this)||this).isInsufficientReservesError=!0,n.name=n.constructor.name,H&&Object.setPrototypeOf(F(n),(this instanceof e?this.constructor:void 0).prototype),n}return B(e,t),e}(D(Error)),X=function(t){function e(){var n;return(n=t.call(this)||this).isInsufficientInputAmountError=!0,n.name=n.constructor.name,H&&Object.setPrototypeOf(F(n),(this instanceof e?this.constructor:void 0).prototype),n}return B(e,t),e}(D(Error));function L(t,e){i.greaterThanOrEqual(t,w)||a(!1),i.lessThanOrEqual(t,N[e])||a(!1)}function K(t){try{return u.getAddress(t)}catch(t){a(!1)}}function Y(t){return t instanceof i?t:i.BigInt("bigint"==typeof t?t.toString():t)}function G(t){L(t,v.uint256);var e,n=w;if(i.greaterThan(t,x))for(n=t,e=i.add(i.divide(t,k),g);i.lessThan(e,n);)n=e,e=i.divide(i.add(i.divide(t,e),e),k);else i.notEqual(t,w)&&(n=g);return n}function V(t,e,n,r){if(n>0||a(!1),t.length<=n||a(!1),0===t.length)return t.push(e),null;var o=t.length===n;if(o&&r(t[t.length-1],e)<=0)return e;for(var i=0,u=t.length;i<u;){var s=i+u>>>1;r(t[s],e)<=0?i=s+1:u=s}return t.splice(i,0,e),o?t.pop():null}var J=function(){function t(t,e,n){L(i.BigInt(t),v.uint8),this.decimals=t,this.symbol=e,this.name=n}return t.prototype.change=function(t){1==t&&($.name="Ether",$.symbol="ETH"),56==t&&($.name="BNB",$.symbol="BNB"),137==t&&($.name="Matic",$.symbol="MATIC"),30==t&&($.name="Smart Bitcoin",$.symbol="RBTC"),31==t&&($.name="Smart Bitcoin",$.symbol="tRBTC")},t}();J.ETHER=new J(18,"BNB","BNB");var Q,$=J.ETHER,z=function(t){function e(e,n,r,o,i){var a;return(a=t.call(this,r,o,i)||this).chainId=e,a.address=K(n),a}B(e,t);var n=e.prototype;return n.equals=function(t){return this===t||this.chainId===t.chainId&&this.address===t.address},n.sortsBefore=function(t){return this.chainId!==t.chainId&&a(!1),this.address===t.address&&a(!1),this.address.toLowerCase()<t.address.toLowerCase()},e}(J);function Z(t,e){return t instanceof z&&e instanceof z?t.equals(e):!(t instanceof z||e instanceof z||t!==e)}var tt,et,nt=((Q={})[exports.ChainId.MAINNET]=new z(exports.ChainId.MAINNET,"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",18,"WETH","Wrapped Ether"),Q[exports.ChainId.ROPSTEN]=new z(exports.ChainId.ROPSTEN,"0xc778417E063141139Fce010982780140Aa0cD5Ab",18,"WETH","Wrapped Ether"),Q[exports.ChainId.RINKEBY]=new z(exports.ChainId.RINKEBY,"0xc778417E063141139Fce010982780140Aa0cD5Ab",18,"WETH","Wrapped Ether"),Q[exports.ChainId.GÖRLI]=new z(exports.ChainId.GÖRLI,"0xB4FBF271143F4FBf7B91A5ded31805e42b2208d6",18,"WETH","Wrapped Ether"),Q[exports.ChainId.KOVAN]=new z(exports.ChainId.KOVAN,"0xd0A1E359811322d97991E03f863a0C30C2cF029C",18,"WETH","Wrapped Ether"),Q[exports.ChainId.BINANCE]=new z(exports.ChainId.BINANCE,"0xbb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c",18,"WBNB","Wrapped BNB"),Q[exports.ChainId.BINANCETEST]=new z(exports.ChainId.BINANCETEST,"0xbb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c",18,"WBNB","Wrapped BNB"),Q[exports.ChainId.RSK]=new z(exports.ChainId.RSK,"0xFa26ecdA879AC88AfD047cc6e046E85B9aFBa2CC",18,"WrBTC","Wrapped rBTC"),Q[exports.ChainId.RSKTEST]=new z(exports.ChainId.RSKTEST,"0xbb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c",18,"WBNB","Wrapped BNB"),Q[exports.ChainId.XDAI]=new z(exports.ChainId.XDAI,"0xe91D153E0b41518A2Ce8Dd3D7944Fa863463a97d",18,"WXDAI","Wrapped XDAI"),Q[exports.ChainId.POLYGON]=new z(exports.ChainId.POLYGON,"0x0d500b1d8e8ef31e21c99d1db9a6444d3adf1270",18,"WMATIC","Wrapped Matic"),Q),rt=c(d),ot=c(s),it=((tt={})[exports.Rounding.ROUND_DOWN]=rt.ROUND_DOWN,tt[exports.Rounding.ROUND_HALF_UP]=rt.ROUND_HALF_UP,tt[exports.Rounding.ROUND_UP]=rt.ROUND_UP,tt),at=((et={})[exports.Rounding.ROUND_DOWN]=0,et[exports.Rounding.ROUND_HALF_UP]=1,et[exports.Rounding.ROUND_UP]=3,et),ut=function(){function t(t,e){void 0===e&&(e=g),this.numerator=Y(t),this.denominator=Y(e)}var e=t.prototype;return e.invert=function(){return new t(this.denominator,this.numerator)},e.add=function(e){var n=e instanceof t?e:new t(Y(e));return i.equal(this.denominator,n.denominator)?new t(i.add(this.numerator,n.numerator),this.denominator):new t(i.add(i.multiply(this.numerator,n.denominator),i.multiply(n.numerator,this.denominator)),i.multiply(this.denominator,n.denominator))},e.subtract=function(e){var n=e instanceof t?e:new t(Y(e));return i.equal(this.denominator,n.denominator)?new t(i.subtract(this.numerator,n.numerator),this.denominator):new t(i.subtract(i.multiply(this.numerator,n.denominator),i.multiply(n.numerator,this.denominator)),i.multiply(this.denominator,n.denominator))},e.lessThan=function(e){var n=e instanceof t?e:new t(Y(e));return i.lessThan(i.multiply(this.numerator,n.denominator),i.multiply(n.numerator,this.denominator))},e.equalTo=function(e){var n=e instanceof t?e:new t(Y(e));return i.equal(i.multiply(this.numerator,n.denominator),i.multiply(n.numerator,this.denominator))},e.greaterThan=function(e){var n=e instanceof t?e:new t(Y(e));return i.greaterThan(i.multiply(this.numerator,n.denominator),i.multiply(n.numerator,this.denominator))},e.multiply=function(e){var n=e instanceof t?e:new t(Y(e));return new t(i.multiply(this.numerator,n.numerator),i.multiply(this.denominator,n.denominator))},e.divide=function(e){var n=e instanceof t?e:new t(Y(e));return new t(i.multiply(this.numerator,n.denominator),i.multiply(this.denominator,n.numerator))},e.toSignificant=function(t,e,n){void 0===e&&(e={groupSeparator:""}),void 0===n&&(n=exports.Rounding.ROUND_HALF_UP),Number.isInteger(t)||a(!1),t>0||a(!1),rt.set({precision:t+1,rounding:it[n]});var r=new rt(this.numerator.toString()).div(this.denominator.toString()).toSignificantDigits(t);return r.toFormat(r.decimalPlaces(),e)},e.toFixed=function(t,e,n){return void 0===e&&(e={groupSeparator:""}),void 0===n&&(n=exports.Rounding.ROUND_HALF_UP),Number.isInteger(t)||a(!1),t>=0||a(!1),ot.DP=t,ot.RM=at[n],new ot(this.numerator.toString()).div(this.denominator.toString()).toFormat(t,e)},q(t,[{key:"quotient",get:function(){return i.divide(this.numerator,this.denominator)}},{key:"remainder",get:function(){return new t(i.remainder(this.numerator,this.denominator),this.denominator)}}]),t}(),st=c(s),ct=function(t){function e(e,n){var r,o=Y(n);return L(o,v.uint256),(r=t.call(this,o,i.exponentiate(A,i.BigInt(e.decimals)))||this).currency=e,r}B(e,t),e.ether=function(t){return new e($,t)};var n=e.prototype;return n.add=function(t){return Z(this.currency,t.currency)||a(!1),new e(this.currency,i.add(this.raw,t.raw))},n.subtract=function(t){return Z(this.currency,t.currency)||a(!1),new e(this.currency,i.subtract(this.raw,t.raw))},n.toSignificant=function(e,n,r){return void 0===e&&(e=6),void 0===r&&(r=exports.Rounding.ROUND_DOWN),t.prototype.toSignificant.call(this,e,n,r)},n.toFixed=function(e,n,r){return void 0===e&&(e=this.currency.decimals),void 0===r&&(r=exports.Rounding.ROUND_DOWN),e<=this.currency.decimals||a(!1),t.prototype.toFixed.call(this,e,n,r)},n.toExact=function(t){return void 0===t&&(t={groupSeparator:""}),st.DP=this.currency.decimals,new st(this.numerator.toString()).div(this.denominator.toString()).toFormat(t)},q(e,[{key:"raw",get:function(){return this.numerator}}]),e}(ut),dt=function(t){function e(e,n){var r;return(r=t.call(this,e,n)||this).token=e,r}B(e,t);var n=e.prototype;return n.add=function(t){return this.token.equals(t.token)||a(!1),new e(this.token,i.add(this.raw,t.raw))},n.subtract=function(t){return this.token.equals(t.token)||a(!1),new e(this.token,i.subtract(this.raw,t.raw))},e}(ct),pt=function(t){function e(e,n,r,o){var a;return(a=t.call(this,o,r)||this).baseCurrency=e,a.quoteCurrency=n,a.scalar=new ut(i.exponentiate(A,i.BigInt(e.decimals)),i.exponentiate(A,i.BigInt(n.decimals))),a}B(e,t),e.fromRoute=function(t){for(var n,r=[],o=W(t.pairs.entries());!(n=o()).done;){var i=n.value,a=i[1];r.push(t.path[i[0]].equals(a.token0)?new e(a.reserve0.currency,a.reserve1.currency,a.reserve0.raw,a.reserve1.raw):new e(a.reserve1.currency,a.reserve0.currency,a.reserve1.raw,a.reserve0.raw))}return r.slice(1).reduce((function(t,e){return t.multiply(e)}),r[0])};var n=e.prototype;return n.invert=function(){return new e(this.quoteCurrency,this.baseCurrency,this.numerator,this.denominator)},n.multiply=function(n){Z(this.quoteCurrency,n.baseCurrency)||a(!1);var r=t.prototype.multiply.call(this,n);return new e(this.baseCurrency,n.quoteCurrency,r.denominator,r.numerator)},n.quote=function(e){return Z(e.currency,this.baseCurrency)||a(!1),this.quoteCurrency instanceof z?new dt(this.quoteCurrency,t.prototype.multiply.call(this,e.raw).quotient):ct.ether(t.prototype.multiply.call(this,e.raw).quotient)},n.toSignificant=function(t,e,n){return void 0===t&&(t=6),this.adjusted.toSignificant(t,e,n)},n.toFixed=function(t,e,n){return void 0===t&&(t=4),this.adjusted.toFixed(t,e,n)},q(e,[{key:"raw",get:function(){return new ut(this.numerator,this.denominator)}},{key:"adjusted",get:function(){return t.prototype.multiply.call(this,this.scalar)}}]),e}(ut),ft={},lt=function(){function t(e,n){var r=e.token.sortsBefore(n.token)?[e,n]:[n,e];this.liquidityToken=new z(r[0].token.chainId,t.getAddress(r[0].token,r[1].token),18,"UNI-V2","Uniswap V2"),this.tokenAmounts=r}t.getAddress=function(t,e){var n,r,o,i,a,s=t.sortsBefore(e)?[t,e]:[e,t];return void 0===(null===(n=ft)||void 0===n||null===(r=n[s[0].address])||void 0===r?void 0:r[s[1].address])&&(ft=R({},ft,((a={})[s[0].address]=R({},null===(o=ft)||void 0===o?void 0:o[s[0].address],((i={})[s[1].address]=u.getCreate2Address("0x0dE70757dE21FAcD23c3aEb46e8bE20620b5269f",p.keccak256(["bytes"],[p.pack(["address","address"],[s[0].address,s[1].address])]),y),i)),a))),ft[s[0].address][s[1].address]};var e=t.prototype;return e.involvesToken=function(t){return t.equals(this.token0)||t.equals(this.token1)},e.priceOf=function(t){return this.involvesToken(t)||a(!1),t.equals(this.token0)?this.token0Price:this.token1Price},e.reserveOf=function(t){return this.involvesToken(t)||a(!1),t.equals(this.token0)?this.reserve0:this.reserve1},e.getOutputAmount=function(e){if(this.involvesToken(e.token)||a(!1),i.equal(this.reserve0.raw,w)||i.equal(this.reserve1.raw,w))throw new M;var n=this.reserveOf(e.token),r=this.reserveOf(e.token.equals(this.token0)?this.token1:this.token0),o=i.multiply(e.raw,E),u=i.multiply(o,r.raw),s=i.add(i.multiply(n.raw,O),o),c=new dt(e.token.equals(this.token0)?this.token1:this.token0,i.divide(u,s));if(i.equal(c.raw,w))throw new X;return[c,new t(n.add(e),r.subtract(c))]},e.getInputAmount=function(e){if(this.involvesToken(e.token)||a(!1),i.equal(this.reserve0.raw,w)||i.equal(this.reserve1.raw,w)||i.greaterThanOrEqual(e.raw,this.reserveOf(e.token).raw))throw new M;var n=this.reserveOf(e.token),r=this.reserveOf(e.token.equals(this.token0)?this.token1:this.token0),o=i.multiply(i.multiply(r.raw,e.raw),O),u=i.multiply(i.subtract(n.raw,e.raw),E),s=new dt(e.token.equals(this.token0)?this.token1:this.token0,i.add(i.divide(o,u),g));return[s,new t(r.add(s),n.subtract(e))]},e.getLiquidityMinted=function(t,e,n){t.token.equals(this.liquidityToken)||a(!1);var r,o=e.token.sortsBefore(n.token)?[e,n]:[n,e];if(o[0].token.equals(this.token0)&&o[1].token.equals(this.token1)||a(!1),i.equal(t.raw,w))r=i.subtract(G(i.multiply(o[0].raw,o[1].raw)),T);else{var u=i.divide(i.multiply(o[0].raw,t.raw),this.reserve0.raw),s=i.divide(i.multiply(o[1].raw,t.raw),this.reserve1.raw);r=i.lessThanOrEqual(u,s)?u:s}if(!i.greaterThan(r,w))throw new X;return new dt(this.liquidityToken,r)},e.getLiquidityValue=function(t,e,n,r,o){var u;if(void 0===r&&(r=!1),this.involvesToken(t)||a(!1),e.token.equals(this.liquidityToken)||a(!1),n.token.equals(this.liquidityToken)||a(!1),i.lessThanOrEqual(n.raw,e.raw)||a(!1),r){o||a(!1);var s=Y(o);if(i.equal(s,w))u=e;else{var c=G(i.multiply(this.reserve0.raw,this.reserve1.raw)),d=G(s);if(i.greaterThan(c,d)){var p=i.multiply(e.raw,i.subtract(c,d)),f=i.add(i.multiply(c,I),d),l=i.divide(p,f);u=e.add(new dt(this.liquidityToken,l))}else u=e}}else u=e;return new dt(t,i.divide(i.multiply(n.raw,this.reserveOf(t).raw),u.raw))},q(t,[{key:"token0Price",get:function(){return new pt(this.token0,this.token1,this.tokenAmounts[0].raw,this.tokenAmounts[1].raw)}},{key:"token1Price",get:function(){return new pt(this.token1,this.token0,this.tokenAmounts[1].raw,this.tokenAmounts[0].raw)}},{key:"chainId",get:function(){return this.token0.chainId}},{key:"token0",get:function(){return this.tokenAmounts[0].token}},{key:"token1",get:function(){return this.tokenAmounts[1].token}},{key:"reserve0",get:function(){return this.tokenAmounts[0]}},{key:"reserve1",get:function(){return this.tokenAmounts[1]}}]),t}(),ht=function(){function t(t,e,n){t.length>0||a(!1),t.every((function(e){return e.chainId===t[0].chainId}))||a(!1),e instanceof z&&t[0].involvesToken(e)||e===$&&t[0].involvesToken(nt[t[0].chainId])||a(!1),void 0===n||n instanceof z&&t[t.length-1].involvesToken(n)||n===$&&t[t.length-1].involvesToken(nt[t[0].chainId])||a(!1);for(var r,o=[e instanceof z?e:nt[t[0].chainId]],i=W(t.entries());!(r=i()).done;){var u=r.value,s=u[1],c=o[u[0]];c.equals(s.token0)||c.equals(s.token1)||a(!1);var d=c.equals(s.token0)?s.token1:s.token0;o.push(d)}this.pairs=t,this.path=o,this.midPrice=pt.fromRoute(this),this.input=e,this.output=null!=n?n:o[o.length-1]}return q(t,[{key:"chainId",get:function(){return this.pairs[0].chainId}}]),t}(),mt=new ut(b),vt=function(t){function e(){return t.apply(this,arguments)||this}B(e,t);var n=e.prototype;return n.toSignificant=function(t,e,n){return void 0===t&&(t=5),this.multiply(mt).toSignificant(t,e,n)},n.toFixed=function(t,e,n){return void 0===t&&(t=2),this.multiply(mt).toFixed(t,e,n)},e}(ut);function yt(t,e){return Z(t.inputAmount.currency,e.inputAmount.currency)||a(!1),Z(t.outputAmount.currency,e.outputAmount.currency)||a(!1),t.outputAmount.equalTo(e.outputAmount)?t.inputAmount.equalTo(e.inputAmount)?0:t.inputAmount.lessThan(e.inputAmount)?-1:1:t.outputAmount.lessThan(e.outputAmount)?1:-1}function Tt(t,e){var n=yt(t,e);return 0!==n?n:t.priceImpact.lessThan(e.priceImpact)?-1:t.priceImpact.greaterThan(e.priceImpact)?1:t.route.path.length-e.route.path.length}function wt(t,e){return t instanceof dt?t:t.currency===$?new dt(nt[e],t.raw):void a(!1)}function gt(t,e){return t instanceof z?t:t===$?nt[e]:void a(!1)}var kt=function(){function t(t,e,n){var r,o,i,u=new Array(t.path.length),s=new Array(t.pairs.length);if(n===exports.TradeType.EXACT_INPUT){Z(e.currency,t.input)||a(!1),u[0]=wt(e,t.chainId);for(var c=0;c<t.path.length-1;c++){var d=t.pairs[c].getOutputAmount(u[c]),p=d[1];u[c+1]=d[0],s[c]=p}}else{Z(e.currency,t.output)||a(!1),u[u.length-1]=wt(e,t.chainId);for(var f=t.path.length-1;f>0;f--){var l=t.pairs[f-1].getInputAmount(u[f]),h=l[1];u[f-1]=l[0],s[f-1]=h}}this.route=t,this.tradeType=n,this.inputAmount=n===exports.TradeType.EXACT_INPUT?e:t.input===$?ct.ether(u[0].raw):u[0],this.outputAmount=n===exports.TradeType.EXACT_OUTPUT?e:t.output===$?ct.ether(u[u.length-1].raw):u[u.length-1],this.executionPrice=new pt(this.inputAmount.currency,this.outputAmount.currency,this.inputAmount.raw,this.outputAmount.raw),this.nextMidPrice=pt.fromRoute(new ht(s,t.input)),this.priceImpact=(r=this.outputAmount,i=(o=t.midPrice.raw.multiply(this.inputAmount.raw)).subtract(r.raw).divide(o),new vt(i.numerator,i.denominator))}t.exactIn=function(e,n){return new t(e,n,exports.TradeType.EXACT_INPUT)},t.exactOut=function(e,n){return new t(e,n,exports.TradeType.EXACT_OUTPUT)};var e=t.prototype;return e.minimumAmountOut=function(t){if(t.lessThan(w)&&a(!1),this.tradeType===exports.TradeType.EXACT_OUTPUT)return this.outputAmount;var e=new ut(g).add(t).invert().multiply(this.outputAmount.raw).quotient;return this.outputAmount instanceof dt?new dt(this.outputAmount.token,e):ct.ether(e)},e.maximumAmountIn=function(t){if(t.lessThan(w)&&a(!1),this.tradeType===exports.TradeType.EXACT_INPUT)return this.inputAmount;var e=new ut(g).add(t).multiply(this.inputAmount.raw).quotient;return this.inputAmount instanceof dt?new dt(this.inputAmount.token,e):ct.ether(e)},t.bestTradeExactIn=function(e,n,r,o,i,u,s){var c=void 0===o?{}:o,d=c.maxNumResults,p=void 0===d?3:d,f=c.maxHops,l=void 0===f?3:f;void 0===i&&(i=[]),void 0===u&&(u=n),void 0===s&&(s=[]),e.length>0||a(!1),l>0||a(!1),u===n||i.length>0||a(!1);var h=n instanceof dt?n.token.chainId:r instanceof z?r.chainId:void 0;void 0===h&&a(!1);for(var m=wt(n,h),v=gt(r,h),y=0;y<e.length;y++){var T=e[y];if((T.token0.equals(m.token)||T.token1.equals(m.token))&&!T.reserve0.equalTo(w)&&!T.reserve1.equalTo(w)){var g=void 0;try{g=T.getOutputAmount(m)[0]}catch(t){if(t.isInsufficientInputAmountError)continue;throw t}if(g.token.equals(v))V(s,new t(new ht([].concat(i,[T]),u.currency,r),u,exports.TradeType.EXACT_INPUT),p,Tt);else if(l>1&&e.length>1){var k=e.slice(0,y).concat(e.slice(y+1,e.length));t.bestTradeExactIn(k,g,r,{maxNumResults:p,maxHops:l-1},[].concat(i,[T]),u,s)}}}return s},t.bestTradeExactOut=function(e,n,r,o,i,u,s){var c=void 0===o?{}:o,d=c.maxNumResults,p=void 0===d?3:d,f=c.maxHops,l=void 0===f?3:f;void 0===i&&(i=[]),void 0===u&&(u=r),void 0===s&&(s=[]),e.length>0||a(!1),l>0||a(!1),u===r||i.length>0||a(!1);var h=r instanceof dt?r.token.chainId:n instanceof z?n.chainId:void 0;void 0===h&&a(!1);for(var m=wt(r,h),v=gt(n,h),y=0;y<e.length;y++){var T=e[y];if((T.token0.equals(m.token)||T.token1.equals(m.token))&&!T.reserve0.equalTo(w)&&!T.reserve1.equalTo(w)){var g=void 0;try{g=T.getInputAmount(m)[0]}catch(t){if(t.isInsufficientReservesError)continue;throw t}if(g.token.equals(v))V(s,new t(new ht([T].concat(i),n,u.currency),u,exports.TradeType.EXACT_OUTPUT),p,Tt);else if(l>1&&e.length>1){var k=e.slice(0,y).concat(e.slice(y+1,e.length));t.bestTradeExactOut(k,n,g,{maxNumResults:p,maxHops:l-1},[T].concat(i),u,s)}}}return s},t}();function xt(t){return"0x"+t.raw.toString(16)}var It,At=function(){function t(){}return t.swapCallParameters=function(t,e){var n=t.inputAmount.currency===$,r=t.outputAmount.currency===$;n&&r&&a(!1),!("ttl"in e)||e.ttl>0||a(!1);var o,i,u,s=K(e.recipient),c=xt(t.maximumAmountIn(e.allowedSlippage)),d=xt(t.minimumAmountOut(e.allowedSlippage)),p=t.route.path.map((function(t){return t.address})),f="ttl"in e?"0x"+(Math.floor((new Date).getTime()/1e3)+e.ttl).toString(16):"0x"+e.deadline.toString(16),l=Boolean(e.feeOnTransfer);switch(t.tradeType){case exports.TradeType.EXACT_INPUT:n?(o=l?"swapExactETHForTokensSupportingFeeOnTransferTokens":"swapExactETHForTokens",i=[d,p,s,f],u=c):r?(o=l?"swapExactTokensForETHSupportingFeeOnTransferTokens":"swapExactTokensForETH",i=[c,d,p,s,f],u="0x0"):(o=l?"swapExactTokensForTokensSupportingFeeOnTransferTokens":"swapExactTokensForTokens",i=[c,d,p,s,f],u="0x0");break;case exports.TradeType.EXACT_OUTPUT:l&&a(!1),n?(o="swapETHForExactTokens",i=[d,p,s,f],u=c):r?(o="swapTokensForExactETH",i=[d,c,p,s,f],u="0x0"):(o="swapTokensForExactTokens",i=[d,c,p,s,f],u="0x0")}return{methodName:o,args:i,value:u}},t}(),bt=[{constant:!0,inputs:[],name:"decimals",outputs:[{name:"",type:"uint8"}],payable:!1,stateMutability:"view",type:"function"},{constant:!0,inputs:[{name:"",type:"address"}],name:"balanceOf",outputs:[{name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"}],Et=((It={})[exports.ChainId.MAINNET]={"0xE0B7927c4aF23765Cb51314A0E0521A9645F0E2A":9},It),Ot=function(){function t(){}return t.fetchTokenData=function(t,e,n,r,o){try{var i,a,u=function(n){return new z(t,e,n,r,o)};void 0===n&&(n=h.getDefaultProvider(l.getNetwork(t)));var s="number"==typeof(null===(i=Et)||void 0===i||null===(a=i[t])||void 0===a?void 0:a[e]);return Promise.resolve(s?u(Et[t][e]):Promise.resolve(new f.Contract(e,bt,n).decimals().then((function(n){var r,o,i;return Et=R({},Et,((i={})[t]=R({},null===(r=Et)||void 0===r?void 0:r[t],((o={})[e]=n,o)),i)),n}))).then(u))}catch(t){return Promise.reject(t)}},t.fetchPairData=function(t,e,n){try{void 0===n&&(n=h.getDefaultProvider(l.getNetwork(t.chainId))),t.chainId!==e.chainId&&a(!1);var r=lt.getAddress(t,e);return Promise.resolve(new f.Contract(r,m.abi,n).getReserves()).then((function(n){var r=n[0],o=n[1],i=t.sortsBefore(e)?[r,o]:[o,r];return new lt(new dt(t,i[0]),new dt(e,i[1]))}))}catch(t){return Promise.reject(t)}},t}();exports.JSBI=i,exports.Currency=J,exports.CurrencyAmount=ct,exports.ETHER=$,exports.FACTORY_ADDRESS="0x0dE70757dE21FAcD23c3aEb46e8bE20620b5269f",exports.Fetcher=Ot,exports.Fraction=ut,exports.INIT_CODE_HASH=y,exports.InsufficientInputAmountError=X,exports.InsufficientReservesError=M,exports.MINIMUM_LIQUIDITY=T,exports.Pair=lt,exports.Percent=vt,exports.Price=pt,exports.Route=ht,exports.Router=At,exports.Token=z,exports.TokenAmount=dt,exports.Trade=kt,exports.WETH=nt,exports.currencyEquals=Z,exports.inputOutputComparator=yt,exports.tradeComparator=Tt;
2
2
  //# sourceMappingURL=u-exchange-sdk.cjs.production.min.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"u-exchange-sdk.cjs.production.min.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","SolidityType","INIT_CODE_HASH","MINIMUM_LIQUIDITY","JSBI","BigInt","ZERO","ONE","TWO","THREE","FIVE","TEN","_100","_997","_1000","SOLIDITY_TYPE_MAXIMA","uint8","uint256","CAN_SET_PROTOTYPE","Object","InsufficientReservesError","name","_this","constructor","setPrototypeOf","prototype","Error","InsufficientInputAmountError","_this2","validateSolidityTypeInstance","value","solidityType","greaterThanOrEqual","invariant","lessThanOrEqual","validateAndParseAddress","address","getAddress","error","parseBigintIsh","bigintIsh","toString","sqrt","y","x","z","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","this","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","pair","path","token0","reserve0","reserve1","slice","reduce","accumulator","currentValue","fraction","quote","currencyAmount","_Fraction","adjusted","PAIR_ADDRESS_CACHE","Pair","tokenAmountA","tokenAmountB","tokenAmounts","liquidityToken","tokenA","tokenB","tokens","undefined","_PAIR_ADDRESS_CACHE2","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","inputOutputComparator","a","b","tradeComparator","ioComp","priceImpact","wrappedAmount","wrappedCurrency","Trade","tradeType","exactQuote","slippage","amounts","Array","nextPairs","EXACT_INPUT","i","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","Router","swapCallParameters","trade","options","etherIn","etherOut","ttl","methodName","args","to","recipient","allowedSlippage","map","deadline","Math","floor","Date","getTime","useFeeOnTransfer","Boolean","feeOnTransfer","TOKEN_DECIMALS_CACHE","Fetcher","fetchTokenData","provider","parsedDecimals","getDefaultProvider","getNetwork","_TOKEN_DECIMALS_CACHE2","_TOKEN_DECIMALS_CACHE3","Contract","ERC20","then","_TOKEN_DECIMALS_CACHE4","fetchPairData","IUniswapV2Pair","abi","getReserves","reserves0","reserves1","balances"],"mappings":"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"}
1
+ {"version":3,"file":"u-exchange-sdk.cjs.production.min.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","SolidityType","INIT_CODE_HASH","MINIMUM_LIQUIDITY","JSBI","BigInt","ZERO","ONE","TWO","THREE","FIVE","TEN","_100","_997","_1000","SOLIDITY_TYPE_MAXIMA","uint8","uint256","CAN_SET_PROTOTYPE","Object","InsufficientReservesError","name","_this","constructor","setPrototypeOf","prototype","Error","InsufficientInputAmountError","_this2","validateSolidityTypeInstance","value","solidityType","greaterThanOrEqual","invariant","lessThanOrEqual","validateAndParseAddress","address","getAddress","error","parseBigintIsh","bigintIsh","toString","sqrt","y","x","z","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","this","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","pair","path","token0","reserve0","reserve1","slice","reduce","accumulator","currentValue","fraction","quote","currencyAmount","_Fraction","adjusted","PAIR_ADDRESS_CACHE","Pair","tokenAmountA","tokenAmountB","tokenAmounts","liquidityToken","tokenA","tokenB","tokens","undefined","_PAIR_ADDRESS_CACHE2","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","inputOutputComparator","a","b","tradeComparator","ioComp","priceImpact","wrappedAmount","wrappedCurrency","Trade","tradeType","exactQuote","slippage","amounts","Array","nextPairs","EXACT_INPUT","i","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","Router","swapCallParameters","trade","options","etherIn","etherOut","ttl","methodName","args","to","recipient","allowedSlippage","map","deadline","Math","floor","Date","getTime","useFeeOnTransfer","Boolean","feeOnTransfer","TOKEN_DECIMALS_CACHE","Fetcher","fetchTokenData","provider","parsedDecimals","getDefaultProvider","getNetwork","_TOKEN_DECIMALS_CACHE2","_TOKEN_DECIMALS_CACHE3","Contract","ERC20","then","_TOKEN_DECIMALS_CACHE4","fetchPairData","IUniswapV2Pair","abi","getReserves","reserves0","reserves1","balances"],"mappings":"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"}
@@ -44,7 +44,7 @@ var Rounding;
44
44
  Rounding[Rounding["ROUND_UP"] = 2] = "ROUND_UP";
45
45
  })(Rounding || (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