@galacticcouncil/sdk 4.2.0 → 4.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/build/index.cjs CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";var wt=Object.defineProperty;var as=Object.getOwnPropertyDescriptor;var ls=Object.getOwnPropertyNames;var us=Object.prototype.hasOwnProperty;var cs=(m,e)=>{for(var t in e)wt(m,t,{get:e[t],enumerable:!0})},ms=(m,e,t,s)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of ls(e))!us.call(m,r)&&r!==t&&wt(m,r,{get:()=>e[r],enumerable:!(s=as(e,r))||s.enumerable});return m};var ps=m=>ms(wt({},"__esModule",{value:!0}),m);var As={};cs(As,{AssetClient:()=>Le,AssetNotFound:()=>_t,BASILISK_PARACHAIN_ID:()=>bs,BalanceClient:()=>Me,BigNumber:()=>q,CachingPoolService:()=>bt,DECIMAL_PLACES:()=>zt,DENOMINATOR:()=>rt,FarmClient:()=>it,HYDRADX_OMNIPOOL_ADDRESS:()=>$e,HYDRADX_PARACHAIN_ID:()=>Ps,HYDRADX_SS58_PREFIX:()=>ke,INFINITY:()=>ds,LbpMath:()=>pe,LbpPool:()=>Ie,ONE:()=>ae,OmniMath:()=>W,OmniPool:()=>Ae,PoolConfigNotFound:()=>Ft,PoolError:()=>Ee,PoolFactory:()=>Ue,PoolNotFound:()=>je,PoolService:()=>Ce,PoolType:()=>ie,ProviderConfigNotFound:()=>kt,RUNTIME_DECIMALS:()=>Re,RouteNotFound:()=>De,Router:()=>_e,SYSTEM_ASSET_DECIMALS:()=>fs,SYSTEM_ASSET_ID:()=>Oe,StableMath:()=>se,StableSwap:()=>Ne,StorageConfigNotFound:()=>Et,SubscriptionNotSupported:()=>Rt,TRADEABLE_DEFAULT:()=>st,TradeRouter:()=>Ze,TradeType:()=>It,XykMath:()=>Se,XykPool:()=>Te,ZERO:()=>E,bnum:()=>v,buildRoute:()=>ct,calculateBuyFee:()=>qt,calculateDiffToAvg:()=>Is,calculateDiffToRef:()=>ze,calculateSellFee:()=>Gt,findNestedKey:()=>At,findNestedObj:()=>ys,scale:()=>K});module.exports=ps(As);var Ve=class{constructor(e=1/0){this.capacity=e}storage=[];enqueue(e){if(this.size()===this.capacity)throw Error("Queue has reached max capacity, you cannot add more items");this.storage.push(e)}dequeue(){return this.storage.shift()}size(){return this.storage.length}};var gs=5,We=class{isNotVisited(e,t){let s=!0;return t.forEach(r=>{(r[0]===e[0]||r[1]===e[1])&&(s=!1)}),s}findPaths(e,t,s){let r=[],i=new Ve,a=[];for(a.push([t,""]),i.enqueue(a);i.size()>0;){let c=i.dequeue();if(c==null||c.length>gs)return r;let u=c[c.length-1];(s===null||u[0]===s)&&r.push(c),e.get(u[0])?.forEach(O=>{if(this.isNotVisited(O,c)){let B=[...c];B.push(O),i.enqueue(B)}})}return r}buildAndPopulateGraph(e,t){let s=new Map;for(let r of e)s.set(parseInt(r),[]);for(let[r,i,a]of t){let c=parseInt(i),u=parseInt(a);s.get(c)?.push([u,r])}return s}};function xt(m){let e={};for(let t of m){let s=t.tokens.length;for(let r=0;r<s;r++){e[t.tokens[r].id]||(e[t.tokens[r].id]=[]);for(let i=0;i<s;i++){if(r==i)continue;let a=[t.address,t.tokens[r].id,t.tokens[i].id];e[t.tokens[r].id].push(a)}}}return e}var Ye=class{getProposals(e,t,s){let r=xt(s),i=Object.keys(r),a=i.map(O=>r[O]).flat(),c=new We,u=c.buildAndPopulateGraph(i,a),y=c.findPaths(u,parseInt(e),t?parseInt(t):null);return this.parsePaths(y)}parsePaths(e){let t=[];for(let s of e){let r=[];for(let i=0;i<s.length;i++){let a=s[i],c=s[i+1];if(c==null)break;r.push(this.toEdge(a,c))}t.push(r)}return t}toEdge(e,t){return[t[1],e[0].toString(),t[0].toString()]}};var hs=/^-?(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?$/i,Ot=Math.ceil,ce=Math.floor,re="[BigNumber Error] ",Ht=re+"Number primitive has more than 15 significant digits: ",he=1e14,T=14,Bt=9007199254740991,vt=[1,10,100,1e3,1e4,1e5,1e6,1e7,1e8,1e9,1e10,1e11,1e12,1e13],Be=1e7,J=1e9;function Ut(m){var e,t,s,r=w.prototype={constructor:w,toString:null,valueOf:null},i=new w(1),a=20,c=4,u=-7,y=21,O=-1e7,B=1e7,N=!1,F=1,_=0,C={prefix:"",groupSize:3,secondaryGroupSize:0,groupSeparator:",",decimalSeparator:".",fractionGroupSize:0,fractionGroupSeparator:"\xA0",suffix:""},k="0123456789abcdefghijklmnopqrstuvwxyz",U=!0;function w(n,o){var l,P,g,d,S,p,h,b,f=this;if(!(f instanceof w))return new w(n,o);if(o==null){if(n&&n._isBigNumber===!0){f.s=n.s,!n.c||n.e>B?f.c=f.e=null:n.e<O?f.c=[f.e=0]:(f.e=n.e,f.c=n.c.slice());return}if((p=typeof n=="number")&&n*0==0){if(f.s=1/n<0?(n=-n,-1):1,n===~~n){for(d=0,S=n;S>=10;S/=10,d++);d>B?f.c=f.e=null:(f.e=d,f.c=[n]);return}b=String(n)}else{if(!hs.test(b=String(n)))return s(f,b,p);f.s=b.charCodeAt(0)==45?(b=b.slice(1),-1):1}(d=b.indexOf("."))>-1&&(b=b.replace(".","")),(S=b.search(/e/i))>0?(d<0&&(d=S),d+=+b.slice(S+1),b=b.substring(0,S)):d<0&&(d=b.length)}else{if(H(o,2,k.length,"Base"),o==10&&U)return f=new w(n),R(f,a+f.e+1,c);if(b=String(n),p=typeof n=="number"){if(n*0!=0)return s(f,b,p,o);if(f.s=1/n<0?(b=b.slice(1),-1):1,w.DEBUG&&b.replace(/^0\.0*|\./,"").length>15)throw Error(Ht+n)}else f.s=b.charCodeAt(0)===45?(b=b.slice(1),-1):1;for(l=k.slice(0,o),d=S=0,h=b.length;S<h;S++)if(l.indexOf(P=b.charAt(S))<0){if(P=="."){if(S>d){d=h;continue}}else if(!g&&(b==b.toUpperCase()&&(b=b.toLowerCase())||b==b.toLowerCase()&&(b=b.toUpperCase()))){g=!0,S=-1,d=0;continue}return s(f,String(n),p,o)}p=!1,b=t(b,o,10,f.s),(d=b.indexOf("."))>-1?b=b.replace(".",""):d=b.length}for(S=0;b.charCodeAt(S)===48;S++);for(h=b.length;b.charCodeAt(--h)===48;);if(b=b.slice(S,++h)){if(h-=S,p&&w.DEBUG&&h>15&&(n>Bt||n!==ce(n)))throw Error(Ht+f.s*n);if((d=d-S-1)>B)f.c=f.e=null;else if(d<O)f.c=[f.e=0];else{if(f.e=d,f.c=[],S=(d+1)%T,d<0&&(S+=T),S<h){for(S&&f.c.push(+b.slice(0,S)),h-=T;S<h;)f.c.push(+b.slice(S,S+=T));S=T-(b=b.slice(S)).length}else S-=h;for(;S--;b+="0");f.c.push(+b)}}else f.c=[f.e=0]}w.clone=Ut,w.ROUND_UP=0,w.ROUND_DOWN=1,w.ROUND_CEIL=2,w.ROUND_FLOOR=3,w.ROUND_HALF_UP=4,w.ROUND_HALF_DOWN=5,w.ROUND_HALF_EVEN=6,w.ROUND_HALF_CEIL=7,w.ROUND_HALF_FLOOR=8,w.EUCLID=9,w.config=w.set=function(n){var o,l;if(n!=null)if(typeof n=="object"){if(n.hasOwnProperty(o="DECIMAL_PLACES")&&(l=n[o],H(l,0,J,o),a=l),n.hasOwnProperty(o="ROUNDING_MODE")&&(l=n[o],H(l,0,8,o),c=l),n.hasOwnProperty(o="EXPONENTIAL_AT")&&(l=n[o],l&&l.pop?(H(l[0],-J,0,o),H(l[1],0,J,o),u=l[0],y=l[1]):(H(l,-J,J,o),u=-(y=l<0?-l:l))),n.hasOwnProperty(o="RANGE"))if(l=n[o],l&&l.pop)H(l[0],-J,-1,o),H(l[1],1,J,o),O=l[0],B=l[1];else if(H(l,-J,J,o),l)O=-(B=l<0?-l:l);else throw Error(re+o+" cannot be zero: "+l);if(n.hasOwnProperty(o="CRYPTO"))if(l=n[o],l===!!l)if(l)if(typeof crypto<"u"&&crypto&&(crypto.getRandomValues||crypto.randomBytes))N=l;else throw N=!l,Error(re+"crypto unavailable");else N=l;else throw Error(re+o+" not true or false: "+l);if(n.hasOwnProperty(o="MODULO_MODE")&&(l=n[o],H(l,0,9,o),F=l),n.hasOwnProperty(o="POW_PRECISION")&&(l=n[o],H(l,0,J,o),_=l),n.hasOwnProperty(o="FORMAT"))if(l=n[o],typeof l=="object")C=l;else throw Error(re+o+" not an object: "+l);if(n.hasOwnProperty(o="ALPHABET"))if(l=n[o],typeof l=="string"&&!/^.?$|[+\-.\s]|(.).*\1/.test(l))U=l.slice(0,10)=="0123456789",k=l;else throw Error(re+o+" invalid: "+l)}else throw Error(re+"Object expected: "+n);return{DECIMAL_PLACES:a,ROUNDING_MODE:c,EXPONENTIAL_AT:[u,y],RANGE:[O,B],CRYPTO:N,MODULO_MODE:F,POW_PRECISION:_,FORMAT:C,ALPHABET:k}},w.isBigNumber=function(n){if(!n||n._isBigNumber!==!0)return!1;if(!w.DEBUG)return!0;var o,l,P=n.c,g=n.e,d=n.s;e:if({}.toString.call(P)=="[object Array]"){if((d===1||d===-1)&&g>=-J&&g<=J&&g===ce(g)){if(P[0]===0){if(g===0&&P.length===1)return!0;break e}if(o=(g+1)%T,o<1&&(o+=T),String(P[0]).length==o){for(o=0;o<P.length;o++)if(l=P[o],l<0||l>=he||l!==ce(l))break e;if(l!==0)return!0}}}else if(P===null&&g===null&&(d===null||d===1||d===-1))return!0;throw Error(re+"Invalid BigNumber: "+n)},w.maximum=w.max=function(){return oe(arguments,-1)},w.minimum=w.min=function(){return oe(arguments,1)},w.random=function(){var n=9007199254740992,o=Math.random()*n&2097151?function(){return ce(Math.random()*n)}:function(){return(Math.random()*1073741824|0)*8388608+(Math.random()*8388608|0)};return function(l){var P,g,d,S,p,h=0,b=[],f=new w(i);if(l==null?l=a:H(l,0,J),S=Ot(l/T),N)if(crypto.getRandomValues){for(P=crypto.getRandomValues(new Uint32Array(S*=2));h<S;)p=P[h]*131072+(P[h+1]>>>11),p>=9e15?(g=crypto.getRandomValues(new Uint32Array(2)),P[h]=g[0],P[h+1]=g[1]):(b.push(p%1e14),h+=2);h=S/2}else if(crypto.randomBytes){for(P=crypto.randomBytes(S*=7);h<S;)p=(P[h]&31)*281474976710656+P[h+1]*1099511627776+P[h+2]*4294967296+P[h+3]*16777216+(P[h+4]<<16)+(P[h+5]<<8)+P[h+6],p>=9e15?crypto.randomBytes(7).copy(P,h):(b.push(p%1e14),h+=7);h=S/7}else throw N=!1,Error(re+"crypto unavailable");if(!N)for(;h<S;)p=o(),p<9e15&&(b[h++]=p%1e14);for(S=b[--h],l%=T,S&&l&&(p=vt[T-l],b[h]=ce(S/p)*p);b[h]===0;b.pop(),h--);if(h<0)b=[d=0];else{for(d=-1;b[0]===0;b.splice(0,1),d-=T);for(h=1,p=b[0];p>=10;p/=10,h++);h<T&&(d-=T-h)}return f.e=d,f.c=b,f}}(),w.sum=function(){for(var n=1,o=arguments,l=new w(o[0]);n<o.length;)l=l.plus(o[n++]);return l},t=function(){var n="0123456789";function o(l,P,g,d){for(var S,p=[0],h,b=0,f=l.length;b<f;){for(h=p.length;h--;p[h]*=P);for(p[0]+=d.indexOf(l.charAt(b++)),S=0;S<p.length;S++)p[S]>g-1&&(p[S+1]==null&&(p[S+1]=0),p[S+1]+=p[S]/g|0,p[S]%=g)}return p.reverse()}return function(l,P,g,d,S){var p,h,b,f,x,I,A,M,z=l.indexOf("."),j=a,L=c;for(z>=0&&(f=_,_=0,l=l.replace(".",""),M=new w(P),I=M.pow(l.length-z),_=f,M.c=o(xe(ue(I.c),I.e,"0"),10,g,n),M.e=M.c.length),A=o(l,P,g,S?(p=k,n):(p=n,k)),b=f=A.length;A[--f]==0;A.pop());if(!A[0])return p.charAt(0);if(z<0?--b:(I.c=A,I.e=b,I.s=d,I=e(I,M,j,L,g),A=I.c,x=I.r,b=I.e),h=b+j+1,z=A[h],f=g/2,x=x||h<0||A[h+1]!=null,x=L<4?(z!=null||x)&&(L==0||L==(I.s<0?3:2)):z>f||z==f&&(L==4||x||L==6&&A[h-1]&1||L==(I.s<0?8:7)),h<1||!A[0])l=x?xe(p.charAt(1),-j,p.charAt(0)):p.charAt(0);else{if(A.length=h,x)for(--g;++A[--h]>g;)A[h]=0,h||(++b,A=[1].concat(A));for(f=A.length;!A[--f];);for(z=0,l="";z<=f;l+=p.charAt(A[z++]));l=xe(l,b,p.charAt(0))}return l}}(),e=function(){function n(P,g,d){var S,p,h,b,f=0,x=P.length,I=g%Be,A=g/Be|0;for(P=P.slice();x--;)h=P[x]%Be,b=P[x]/Be|0,S=A*h+b*I,p=I*h+S%Be*Be+f,f=(p/d|0)+(S/Be|0)+A*b,P[x]=p%d;return f&&(P=[f].concat(P)),P}function o(P,g,d,S){var p,h;if(d!=S)h=d>S?1:-1;else for(p=h=0;p<d;p++)if(P[p]!=g[p]){h=P[p]>g[p]?1:-1;break}return h}function l(P,g,d,S){for(var p=0;d--;)P[d]-=p,p=P[d]<g[d]?1:0,P[d]=p*S+P[d]-g[d];for(;!P[0]&&P.length>1;P.splice(0,1));}return function(P,g,d,S,p){var h,b,f,x,I,A,M,z,j,L,G,ee,Qe,yt,St,fe,Xe,le=P.s==g.s?1:-1,te=P.c,X=g.c;if(!te||!te[0]||!X||!X[0])return new w(!P.s||!g.s||(te?X&&te[0]==X[0]:!X)?NaN:te&&te[0]==0||!X?le*0:le/0);for(z=new w(le),j=z.c=[],b=P.e-g.e,le=d+b+1,p||(p=he,b=me(P.e/T)-me(g.e/T),le=le/T|0),f=0;X[f]==(te[f]||0);f++);if(X[f]>(te[f]||0)&&b--,le<0)j.push(1),x=!0;else{for(yt=te.length,fe=X.length,f=0,le+=2,I=ce(p/(X[0]+1)),I>1&&(X=n(X,I,p),te=n(te,I,p),fe=X.length,yt=te.length),Qe=fe,L=te.slice(0,fe),G=L.length;G<fe;L[G++]=0);Xe=X.slice(),Xe=[0].concat(Xe),St=X[0],X[1]>=p/2&&St++;do{if(I=0,h=o(X,L,fe,G),h<0){if(ee=L[0],fe!=G&&(ee=ee*p+(L[1]||0)),I=ce(ee/St),I>1)for(I>=p&&(I=p-1),A=n(X,I,p),M=A.length,G=L.length;o(A,L,M,G)==1;)I--,l(A,fe<M?Xe:X,M,p),M=A.length,h=1;else I==0&&(h=I=1),A=X.slice(),M=A.length;if(M<G&&(A=[0].concat(A)),l(L,A,G,p),G=L.length,h==-1)for(;o(X,L,fe,G)<1;)I++,l(L,fe<G?Xe:X,G,p),G=L.length}else h===0&&(I++,L=[0]);j[f++]=I,L[0]?L[G++]=te[Qe]||0:(L=[te[Qe]],G=1)}while((Qe++<yt||L[0]!=null)&&le--);x=L[0]!=null,j[0]||j.splice(0,1)}if(p==he){for(f=1,le=j[0];le>=10;le/=10,f++);R(z,d+(z.e=f+b*T-1)+1,S,x)}else z.e=b,z.r=+x;return z}}();function Q(n,o,l,P){var g,d,S,p,h;if(l==null?l=c:H(l,0,8),!n.c)return n.toString();if(g=n.c[0],S=n.e,o==null)h=ue(n.c),h=P==1||P==2&&(S<=u||S>=y)?tt(h,S):xe(h,S,"0");else if(n=R(new w(n),o,l),d=n.e,h=ue(n.c),p=h.length,P==1||P==2&&(o<=d||d<=u)){for(;p<o;h+="0",p++);h=tt(h,d)}else if(o-=S,h=xe(h,d,"0"),d+1>p){if(--o>0)for(h+=".";o--;h+="0");}else if(o+=d-p,o>0)for(d+1==p&&(h+=".");o--;h+="0");return n.s<0&&g?"-"+h:h}function oe(n,o){for(var l,P,g=1,d=new w(n[0]);g<n.length;g++)P=new w(n[g]),(!P.s||(l=Fe(d,P))===o||l===0&&d.s===o)&&(d=P);return d}function we(n,o,l){for(var P=1,g=o.length;!o[--g];o.pop());for(g=o[0];g>=10;g/=10,P++);return(l=P+l*T-1)>B?n.c=n.e=null:l<O?n.c=[n.e=0]:(n.e=l,n.c=o),n}s=function(){var n=/^(-?)0([xbo])(?=\w[\w.]*$)/i,o=/^([^.]+)\.$/,l=/^\.([^.]+)$/,P=/^-?(Infinity|NaN)$/,g=/^\s*\+(?=[\w.])|^\s+|\s+$/g;return function(d,S,p,h){var b,f=p?S:S.replace(g,"");if(P.test(f))d.s=isNaN(f)?null:f<0?-1:1;else{if(!p&&(f=f.replace(n,function(x,I,A){return b=(A=A.toLowerCase())=="x"?16:A=="b"?2:8,!h||h==b?I:x}),h&&(b=h,f=f.replace(o,"$1").replace(l,"0.$1")),S!=f))return new w(f,b);if(w.DEBUG)throw Error(re+"Not a"+(h?" base "+h:"")+" number: "+S);d.s=null}d.c=d.e=null}}();function R(n,o,l,P){var g,d,S,p,h,b,f,x=n.c,I=vt;if(x){e:{for(g=1,p=x[0];p>=10;p/=10,g++);if(d=o-g,d<0)d+=T,S=o,h=x[b=0],f=ce(h/I[g-S-1]%10);else if(b=Ot((d+1)/T),b>=x.length)if(P){for(;x.length<=b;x.push(0));h=f=0,g=1,d%=T,S=d-T+1}else break e;else{for(h=p=x[b],g=1;p>=10;p/=10,g++);d%=T,S=d-T+g,f=S<0?0:ce(h/I[g-S-1]%10)}if(P=P||o<0||x[b+1]!=null||(S<0?h:h%I[g-S-1]),P=l<4?(f||P)&&(l==0||l==(n.s<0?3:2)):f>5||f==5&&(l==4||P||l==6&&(d>0?S>0?h/I[g-S]:0:x[b-1])%10&1||l==(n.s<0?8:7)),o<1||!x[0])return x.length=0,P?(o-=n.e+1,x[0]=I[(T-o%T)%T],n.e=-o||0):x[0]=n.e=0,n;if(d==0?(x.length=b,p=1,b--):(x.length=b+1,p=I[T-d],x[b]=S>0?ce(h/I[g-S]%I[S])*p:0),P)for(;;)if(b==0){for(d=1,S=x[0];S>=10;S/=10,d++);for(S=x[0]+=p,p=1;S>=10;S/=10,p++);d!=p&&(n.e++,x[0]==he&&(x[0]=1));break}else{if(x[b]+=p,x[b]!=he)break;x[b--]=0,p=1}for(d=x.length;x[--d]===0;x.pop());}n.e>B?n.c=n.e=null:n.e<O&&(n.c=[n.e=0])}return n}function Y(n){var o,l=n.e;return l===null?n.toString():(o=ue(n.c),o=l<=u||l>=y?tt(o,l):xe(o,l,"0"),n.s<0?"-"+o:o)}return r.absoluteValue=r.abs=function(){var n=new w(this);return n.s<0&&(n.s=1),n},r.comparedTo=function(n,o){return Fe(this,new w(n,o))},r.decimalPlaces=r.dp=function(n,o){var l,P,g,d=this;if(n!=null)return H(n,0,J),o==null?o=c:H(o,0,8),R(new w(d),n+d.e+1,o);if(!(l=d.c))return null;if(P=((g=l.length-1)-me(this.e/T))*T,g=l[g])for(;g%10==0;g/=10,P--);return P<0&&(P=0),P},r.dividedBy=r.div=function(n,o){return e(this,new w(n,o),a,c)},r.dividedToIntegerBy=r.idiv=function(n,o){return e(this,new w(n,o),0,1)},r.exponentiatedBy=r.pow=function(n,o){var l,P,g,d,S,p,h,b,f,x=this;if(n=new w(n),n.c&&!n.isInteger())throw Error(re+"Exponent not an integer: "+Y(n));if(o!=null&&(o=new w(o)),p=n.e>14,!x.c||!x.c[0]||x.c[0]==1&&!x.e&&x.c.length==1||!n.c||!n.c[0])return f=new w(Math.pow(+Y(x),p?n.s*(2-et(n)):+Y(n))),o?f.mod(o):f;if(h=n.s<0,o){if(o.c?!o.c[0]:!o.s)return new w(NaN);P=!h&&x.isInteger()&&o.isInteger(),P&&(x=x.mod(o))}else{if(n.e>9&&(x.e>0||x.e<-1||(x.e==0?x.c[0]>1||p&&x.c[1]>=24e7:x.c[0]<8e13||p&&x.c[0]<=9999975e7)))return d=x.s<0&&et(n)?-0:0,x.e>-1&&(d=1/d),new w(h?1/d:d);_&&(d=Ot(_/T+2))}for(p?(l=new w(.5),h&&(n.s=1),b=et(n)):(g=Math.abs(+Y(n)),b=g%2),f=new w(i);;){if(b){if(f=f.times(x),!f.c)break;d?f.c.length>d&&(f.c.length=d):P&&(f=f.mod(o))}if(g){if(g=ce(g/2),g===0)break;b=g%2}else if(n=n.times(l),R(n,n.e+1,1),n.e>14)b=et(n);else{if(g=+Y(n),g===0)break;b=g%2}x=x.times(x),d?x.c&&x.c.length>d&&(x.c.length=d):P&&(x=x.mod(o))}return P?f:(h&&(f=i.div(f)),o?f.mod(o):d?R(f,_,c,S):f)},r.integerValue=function(n){var o=new w(this);return n==null?n=c:H(n,0,8),R(o,o.e+1,n)},r.isEqualTo=r.eq=function(n,o){return Fe(this,new w(n,o))===0},r.isFinite=function(){return!!this.c},r.isGreaterThan=r.gt=function(n,o){return Fe(this,new w(n,o))>0},r.isGreaterThanOrEqualTo=r.gte=function(n,o){return(o=Fe(this,new w(n,o)))===1||o===0},r.isInteger=function(){return!!this.c&&me(this.e/T)>this.c.length-2},r.isLessThan=r.lt=function(n,o){return Fe(this,new w(n,o))<0},r.isLessThanOrEqualTo=r.lte=function(n,o){return(o=Fe(this,new w(n,o)))===-1||o===0},r.isNaN=function(){return!this.s},r.isNegative=function(){return this.s<0},r.isPositive=function(){return this.s>0},r.isZero=function(){return!!this.c&&this.c[0]==0},r.minus=function(n,o){var l,P,g,d,S=this,p=S.s;if(n=new w(n,o),o=n.s,!p||!o)return new w(NaN);if(p!=o)return n.s=-o,S.plus(n);var h=S.e/T,b=n.e/T,f=S.c,x=n.c;if(!h||!b){if(!f||!x)return f?(n.s=-o,n):new w(x?S:NaN);if(!f[0]||!x[0])return x[0]?(n.s=-o,n):new w(f[0]?S:c==3?-0:0)}if(h=me(h),b=me(b),f=f.slice(),p=h-b){for((d=p<0)?(p=-p,g=f):(b=h,g=x),g.reverse(),o=p;o--;g.push(0));g.reverse()}else for(P=(d=(p=f.length)<(o=x.length))?p:o,p=o=0;o<P;o++)if(f[o]!=x[o]){d=f[o]<x[o];break}if(d&&(g=f,f=x,x=g,n.s=-n.s),o=(P=x.length)-(l=f.length),o>0)for(;o--;f[l++]=0);for(o=he-1;P>p;){if(f[--P]<x[P]){for(l=P;l&&!f[--l];f[l]=o);--f[l],f[P]+=he}f[P]-=x[P]}for(;f[0]==0;f.splice(0,1),--b);return f[0]?we(n,f,b):(n.s=c==3?-1:1,n.c=[n.e=0],n)},r.modulo=r.mod=function(n,o){var l,P,g=this;return n=new w(n,o),!g.c||!n.s||n.c&&!n.c[0]?new w(NaN):!n.c||g.c&&!g.c[0]?new w(g):(F==9?(P=n.s,n.s=1,l=e(g,n,0,3),n.s=P,l.s*=P):l=e(g,n,0,F),n=g.minus(l.times(n)),!n.c[0]&&F==1&&(n.s=g.s),n)},r.multipliedBy=r.times=function(n,o){var l,P,g,d,S,p,h,b,f,x,I,A,M,z,j,L=this,G=L.c,ee=(n=new w(n,o)).c;if(!G||!ee||!G[0]||!ee[0])return!L.s||!n.s||G&&!G[0]&&!ee||ee&&!ee[0]&&!G?n.c=n.e=n.s=null:(n.s*=L.s,!G||!ee?n.c=n.e=null:(n.c=[0],n.e=0)),n;for(P=me(L.e/T)+me(n.e/T),n.s*=L.s,h=G.length,x=ee.length,h<x&&(M=G,G=ee,ee=M,g=h,h=x,x=g),g=h+x,M=[];g--;M.push(0));for(z=he,j=Be,g=x;--g>=0;){for(l=0,I=ee[g]%j,A=ee[g]/j|0,S=h,d=g+S;d>g;)b=G[--S]%j,f=G[S]/j|0,p=A*b+f*I,b=I*b+p%j*j+M[d]+l,l=(b/z|0)+(p/j|0)+A*f,M[d--]=b%z;M[d]=l}return l?++P:M.splice(0,1),we(n,M,P)},r.negated=function(){var n=new w(this);return n.s=-n.s||null,n},r.plus=function(n,o){var l,P=this,g=P.s;if(n=new w(n,o),o=n.s,!g||!o)return new w(NaN);if(g!=o)return n.s=-o,P.minus(n);var d=P.e/T,S=n.e/T,p=P.c,h=n.c;if(!d||!S){if(!p||!h)return new w(g/0);if(!p[0]||!h[0])return h[0]?n:new w(p[0]?P:g*0)}if(d=me(d),S=me(S),p=p.slice(),g=d-S){for(g>0?(S=d,l=h):(g=-g,l=p),l.reverse();g--;l.push(0));l.reverse()}for(g=p.length,o=h.length,g-o<0&&(l=h,h=p,p=l,o=g),g=0;o;)g=(p[--o]=p[o]+h[o]+g)/he|0,p[o]=he===p[o]?0:p[o]%he;return g&&(p=[g].concat(p),++S),we(n,p,S)},r.precision=r.sd=function(n,o){var l,P,g,d=this;if(n!=null&&n!==!!n)return H(n,1,J),o==null?o=c:H(o,0,8),R(new w(d),n,o);if(!(l=d.c))return null;if(g=l.length-1,P=g*T+1,g=l[g]){for(;g%10==0;g/=10,P--);for(g=l[0];g>=10;g/=10,P++);}return n&&d.e+1>P&&(P=d.e+1),P},r.shiftedBy=function(n){return H(n,-Bt,Bt),this.times("1e"+n)},r.squareRoot=r.sqrt=function(){var n,o,l,P,g,d=this,S=d.c,p=d.s,h=d.e,b=a+4,f=new w("0.5");if(p!==1||!S||!S[0])return new w(!p||p<0&&(!S||S[0])?NaN:S?d:1/0);if(p=Math.sqrt(+Y(d)),p==0||p==1/0?(o=ue(S),(o.length+h)%2==0&&(o+="0"),p=Math.sqrt(+o),h=me((h+1)/2)-(h<0||h%2),p==1/0?o="5e"+h:(o=p.toExponential(),o=o.slice(0,o.indexOf("e")+1)+h),l=new w(o)):l=new w(p+""),l.c[0]){for(h=l.e,p=h+b,p<3&&(p=0);;)if(g=l,l=f.times(g.plus(e(d,g,b,1))),ue(g.c).slice(0,p)===(o=ue(l.c)).slice(0,p))if(l.e<h&&--p,o=o.slice(p-3,p+1),o=="9999"||!P&&o=="4999"){if(!P&&(R(g,g.e+a+2,0),g.times(g).eq(d))){l=g;break}b+=4,p+=4,P=1}else{(!+o||!+o.slice(1)&&o.charAt(0)=="5")&&(R(l,l.e+a+2,1),n=!l.times(l).eq(d));break}}return R(l,l.e+a+1,c,n)},r.toExponential=function(n,o){return n!=null&&(H(n,0,J),n++),Q(this,n,o,1)},r.toFixed=function(n,o){return n!=null&&(H(n,0,J),n=n+this.e+1),Q(this,n,o)},r.toFormat=function(n,o,l){var P,g=this;if(l==null)n!=null&&o&&typeof o=="object"?(l=o,o=null):n&&typeof n=="object"?(l=n,n=o=null):l=C;else if(typeof l!="object")throw Error(re+"Argument not an object: "+l);if(P=g.toFixed(n,o),g.c){var d,S=P.split("."),p=+l.groupSize,h=+l.secondaryGroupSize,b=l.groupSeparator||"",f=S[0],x=S[1],I=g.s<0,A=I?f.slice(1):f,M=A.length;if(h&&(d=p,p=h,h=d,M-=d),p>0&&M>0){for(d=M%p||p,f=A.substr(0,d);d<M;d+=p)f+=b+A.substr(d,p);h>0&&(f+=b+A.slice(d)),I&&(f="-"+f)}P=x?f+(l.decimalSeparator||"")+((h=+l.fractionGroupSize)?x.replace(new RegExp("\\d{"+h+"}\\B","g"),"$&"+(l.fractionGroupSeparator||"")):x):f}return(l.prefix||"")+P+(l.suffix||"")},r.toFraction=function(n){var o,l,P,g,d,S,p,h,b,f,x,I,A=this,M=A.c;if(n!=null&&(p=new w(n),!p.isInteger()&&(p.c||p.s!==1)||p.lt(i)))throw Error(re+"Argument "+(p.isInteger()?"out of range: ":"not an integer: ")+Y(p));if(!M)return new w(A);for(o=new w(i),b=l=new w(i),P=h=new w(i),I=ue(M),d=o.e=I.length-A.e-1,o.c[0]=vt[(S=d%T)<0?T+S:S],n=!n||p.comparedTo(o)>0?d>0?o:b:p,S=B,B=1/0,p=new w(I),h.c[0]=0;f=e(p,o,0,1),g=l.plus(f.times(P)),g.comparedTo(n)!=1;)l=P,P=g,b=h.plus(f.times(g=b)),h=g,o=p.minus(f.times(g=o)),p=g;return g=e(n.minus(l),P,0,1),h=h.plus(g.times(b)),l=l.plus(g.times(P)),h.s=b.s=A.s,d=d*2,x=e(b,P,d,c).minus(A).abs().comparedTo(e(h,l,d,c).minus(A).abs())<1?[b,P]:[h,l],B=S,x},r.toNumber=function(){return+Y(this)},r.toPrecision=function(n,o){return n!=null&&H(n,1,J),Q(this,n,o,2)},r.toString=function(n){var o,l=this,P=l.s,g=l.e;return g===null?P?(o="Infinity",P<0&&(o="-"+o)):o="NaN":(n==null?o=g<=u||g>=y?tt(ue(l.c),g):xe(ue(l.c),g,"0"):n===10&&U?(l=R(new w(l),a+g+1,c),o=xe(ue(l.c),l.e,"0")):(H(n,2,k.length,"Base"),o=t(xe(ue(l.c),g,"0"),10,n,P,!0)),P<0&&l.c[0]&&(o="-"+o)),o},r.valueOf=r.toJSON=function(){return Y(this)},r._isBigNumber=!0,r[Symbol.toStringTag]="BigNumber",r[Symbol.for("nodejs.util.inspect.custom")]=r.valueOf,m!=null&&w.set(m),w}function me(m){var e=m|0;return m>0||m===e?e:e-1}function ue(m){for(var e,t,s=1,r=m.length,i=m[0]+"";s<r;){for(e=m[s++]+"",t=T-e.length;t--;e="0"+e);i+=e}for(r=i.length;i.charCodeAt(--r)===48;);return i.slice(0,r+1||1)}function Fe(m,e){var t,s,r=m.c,i=e.c,a=m.s,c=e.s,u=m.e,y=e.e;if(!a||!c)return null;if(t=r&&!r[0],s=i&&!i[0],t||s)return t?s?0:-c:a;if(a!=c)return a;if(t=a<0,s=u==y,!r||!i)return s?0:!r^t?1:-1;if(!s)return u>y^t?1:-1;for(c=(u=r.length)<(y=i.length)?u:y,a=0;a<c;a++)if(r[a]!=i[a])return r[a]>i[a]^t?1:-1;return u==y?0:u>y^t?1:-1}function H(m,e,t,s){if(m<e||m>t||m!==ce(m))throw Error(re+(s||"Argument")+(typeof m=="number"?m<e||m>t?" out of range: ":" not an integer: ":" not a primitive number: ")+String(m))}function et(m){var e=m.c.length-1;return me(m.e/T)==e&&m.c[e]%2!=0}function tt(m,e){return(m.length>1?m.charAt(0)+"."+m.slice(1):m)+(e<0?"e":"e+")+e}function xe(m,e,t){var s,r;if(e<0){for(r=t+".";++e;r+=t);m=r+m}else if(s=m.length,++e>s){for(r=t,e-=s;--e;r+=t);m+=r}else e<s&&(m=m.slice(0,e)+"."+m.slice(e));return m}var q=Ut();var zt=12;q.config({EXPONENTIAL_AT:[-100,100],ROUNDING_MODE:4,DECIMAL_PLACES:zt});var E=v(0),ae=v(1),ds=v("Infinity");function K(m,e){let t=new q(e.toString()),s=new q(10).pow(t);return m.times(s)}function v(m){return new q(m.toString())}var ie=(r=>(r.XYK="Xyk",r.LBP="Lbp",r.Stable="Stableswap",r.Omni="Omnipool",r))(ie||{}),Ee=(i=>(i.UnknownError="UnknownError",i.InsufficientTradingAmount="InsufficientTradingAmount",i.MaxInRatioExceeded="MaxInRatioExceeded",i.MaxOutRatioExceeded="MaxOutRatioExceeded",i.TradeNotAllowed="TradeNotAllowed",i))(Ee||{}),It=(t=>(t.Buy="Buy",t.Sell="Sell",t))(It||{});var Pe=require("@galacticcouncil/math-lbp"),pe=class{static getSpotPrice(e,t,s,r,i){return(0,Pe.get_spot_price)(e,t,s,r,i)}static calculateInGivenOut(e,t,s,r,i){return(0,Pe.calculate_in_given_out)(e,t,s,r,i)}static calculateOutGivenIn(e,t,s,r,i){return(0,Pe.calculate_out_given_in)(e,t,s,r,i)}static calculateLinearWeights(e,t,s,r,i){return(0,Pe.calculate_linear_weights)(e,t,s,r,i)}static calculatePoolTradeFee(e,t,s){return(0,Pe.calculate_pool_trade_fee)(e,t,s)}};var Xt=require("@polkadot/util-crypto"),Wt=require("@polkadot/util"),Re=18,st=15,Oe="0",fs=12,Ps=2034,ke=63,bs=2090,rt=1e3,$e=(0,Xt.encodeAddress)((0,Wt.stringToU8a)("modlomnipool".padEnd(32,"\0")),ke);function At(m,e){let t=[];return JSON.stringify(m,(s,r)=>(r&&r[e]&&t.push(r),r)),t[0]}function ys(m,e,t){let s;return JSON.stringify(m,(r,i)=>(i&&i[e]===t&&(s=i),i)),s}var Qs=require("@polkadot/types/lookup");var Vs=require("@polkadot/api-base/types/consts");var er=require("@polkadot/api-base/types/errors");var tr=require("@polkadot/api-base/types/events");var sr=require("@polkadot/api-base/types/storage");var rr=require("@polkadot/api-base/types/submittable");var ir=require("@polkadot/rpc-core/types/jsonrpc");var nr=require("@polkadot/api-base/types/calls");var gr=require("@polkadot/types/types/registry");var Pr=require("@polkadot/types/lookup");var br=require("@polkadot/api-base/types/consts");var yr=require("@polkadot/api-base/types/errors");var Sr=require("@polkadot/api-base/types/events");var wr=require("@polkadot/api-base/types/storage");var xr=require("@polkadot/api-base/types/submittable");var Or=require("@polkadot/rpc-core/types/jsonrpc");var Br=require("@polkadot/api-base/types/calls");var Er=require("@polkadot/types/types/registry");var ve=class{api;constructor(e){this.api=e}get chainDecimals(){return this.api.registry.chainDecimals[0]}get chainToken(){return this.api.registry.chainTokens[0]}};var Le=class extends ve{SUPPORTED_TYPES=["StableSwap","Bond","Token","External"];constructor(e){super(e)}async safeSharesQuery(){try{let e=await this.api.query.stableswap.pools.entries();return new Map(e.map(([{args:[t]},s])=>[t.toString(),s.unwrap()]))}catch{return new Map([])}}async safeBondsQuery(){try{let e=await this.api.query.bonds.bonds.entries();return new Map(e.map(([{args:[t]},s])=>[t.toString(),s.unwrap()]))}catch{return new Map([])}}async metadataQuery(){try{let e=await this.api.query.assetRegistry.assetMetadataMap.entries();return new Map(e.map(([{args:[t]},s])=>{let{decimals:r,symbol:i}=s.unwrap();return[t.toString(),{decimals:r.toNumber(),symbol:i.toHuman()}]}))}catch{return new Map([])}}async locationsQuery(){try{let e=await this.api.query.assetRegistry.assetLocations.entries();return new Map(e.map(([{args:[t]},s])=>[t.toString(),s.unwrap()]))}catch{return new Map([])}}getSystemTokenName(e){switch(e){case"HDX":return"Hydration";case"BSX":return"Basilisk";default:return e}}getToken(e,t,s,r){if(e==Oe){let F=this.api.consts.balances.existentialDeposit;return{id:Oe,name:this.getSystemTokenName(this.chainToken),symbol:this.chainToken,decimals:this.chainDecimals,icon:this.chainToken,type:"Token",isSufficient:!0,existentialDeposit:F.toString()}}let{name:i,assetType:a,isSufficient:c,existentialDeposit:u}=t,{symbol:y,decimals:O}=s.get(e)??{},B=this.parseLocation("parachain",r),N=2094;return{id:e,name:i.toHuman(),symbol:y,decimals:O,icon:y,type:a.toHuman(),isSufficient:c?c.toHuman():!0,origin:B,externalId:this.parseLocation(N===B?"generalKey":"generalIndex",r),existentialDeposit:u.toString()}}getBond(e,t,s,r){let[i,a]=r,{assetType:c,isSufficient:u,existentialDeposit:y}=t,{symbol:O,decimals:B}=this.getToken(i.toString(),t,s),N=a.toNumber(),F=new Intl.DateTimeFormat("en-GB"),_=[O,"Bond",F.format(N)].join(" ");return{id:e,name:_,symbol:O+"b",decimals:B,icon:O,type:c.toString(),isSufficient:u.toHuman(),existentialDeposit:y.toString(),underlyingAssetId:i.toString(),maturity:N}}getShares(e,t,s,r){let{assets:i}=r,{name:a,symbol:c,assetType:u,isSufficient:y,existentialDeposit:O}=t,N=i.map(C=>C.toString()).map(C=>{let{symbol:k}=this.getToken(C,t,s);return[C,k]}),F=Object.fromEntries(N),_=Object.values(F);return{id:e,name:_.join(", "),symbol:c?.isSome?c.toHuman():a.toHuman(),decimals:18,icon:_.join("/"),type:u.toString(),isSufficient:y.toHuman(),existentialDeposit:O.toString(),meta:F}}getExternal(e,t,s,r){let i=this.getToken(e,t,new Map,r),a=s?.find(c=>c.internalId===i.id);return a?{...i,decimals:a.decimals,name:a.name,symbol:a.symbol,icon:a.symbol,isWhiteListed:a.isWhiteListed}:i}normalizeMetadata(e,t){return t.size?t:new Map(e.map(([{args:[s]},r])=>{let{decimals:i,symbol:a}=r.unwrap();return[s.toString(),{decimals:Number(i.toString()),symbol:a.toHuman()}]}))}getSupportedAssets(e){return e.filter(([t,s])=>{if(s.isNone)return!1;let r=s.unwrap();return this.isSupportedAsset(r)})}async getOnChainAssets(e,t){let[s,r,i,a,c]=await Promise.all([this.api.query.assetRegistry.assets.entries(),this.locationsQuery(),this.safeSharesQuery(),this.safeBondsQuery(),this.metadataQuery()]),u=this.getSupportedAssets(s),y=this.normalizeMetadata(u,c),O=u.map(([{args:[B]},N])=>{let F=N.unwrap(),_=r.get(B.toString()),{assetType:C}=F;switch(C.toString()){case"Bond":let k=a.get(B.toString());return this.getBond(B.toString(),F,y,k);case"StableSwap":let U=i.get(B.toString());return this.getShares(B.toString(),F,y,U);case"External":return this.getExternal(B.toString(),F,t,_);default:return this.getToken(B.toString(),F,y,_)}});return e?O:O.filter(B=>this.isValidAsset(B))}isValidAsset(e){return!!e.symbol&&!!e.decimals}isSupportedAsset(e){let t=e.assetType.toString();return this.SUPPORTED_TYPES.includes(t)}parseLocation(e,t){if(t){let s=At(t.toJSON(),e);return s&&s[e]}else return}};var Me=class extends ve{constructor(e){super(e)}async getBalance(e,t){return t===Oe?await this.getSystemBalance(e):await this.getTokenBalance(e,t)}async getSystemBalance(e){let{data:t}=await this.api.query.system.account(e);return this.calculateFreeBalance(t)}async getTokenBalance(e,t){let{free:s,reserved:r,frozen:i}=await this.api.query.tokens.accounts(e,t);return this.calculateFreeBalance({free:s,feeFrozen:r,frozen:i})}async subscribeBalance(e,t,s){let r=t.filter(i=>i!==Oe).map(i=>[e,i]);return this.api.query.tokens.accounts.multi(r,i=>{i.forEach(({free:a,reserved:c,frozen:u},y)=>{let O=this.calculateFreeBalance({free:a,feeFrozen:c,frozen:u}),B=r[y][1];s(B,O)})})}async subscribeTokenBalance(e,t,s){let r=t.filter(i=>i!==Oe).map(i=>[e,i]);return this.api.query.tokens.accounts.multi(r,i=>{i.forEach((a,c)=>{let u=this.calculateFreeBalance(a),y=r[c][1];s(y,u)})})}async subscribeSystemBalance(e,t){return this.api.query.system.account(e,({data:s})=>t(Oe,this.calculateFreeBalance(s)))}calculateFreeBalance(e){let{free:t,miscFrozen:s,feeFrozen:r,frozen:i}=e,a=new q(t),c=new q(s||i),u=new q(r||0),y=c.gt(u)?c:u;return a.minus(y)}};var Nt=require("@polkadot/util-crypto"),Tt=require("@galacticcouncil/math-liquidity-mining");var it=class extends ve{constructor(e){super(e)}secondsInYear=new q(365.2425).times(24).times(60).times(60);async getOmnipoolFarms(e){let t=await this.api.query.omnipoolWarehouseLM.activeYieldFarm.entries(e);return await Promise.all(t.map(async([r,i])=>{let[,a]=r.args,c=i.unwrap().toString(),u=a.toString(),y=(await this.api.query.omnipoolWarehouseLM.globalFarm(u)).unwrap(),O=(await this.api.query.omnipoolWarehouseLM.yieldFarm(e,u,c)).unwrap(),B=await this.getOraclePrice(y)??y.priceAdjustment.toString();return{assetId:e,globalFarm:y,yieldFarm:O,priceAdjustment:B}}))}async getIsolatedPoolFarms(e){let t=await this.api.query.xykWarehouseLM.activeYieldFarm.entries(e);return await Promise.all(t.map(async([r,i])=>{let[,a]=r.args,c=i.unwrap().toString(),u=a.toString(),y=(await this.api.query.xykWarehouseLM.globalFarm(u)).unwrap(),O=(await this.api.query.xykWarehouseLM.yieldFarm(e,u,c)).unwrap(),B=await this.getOraclePrice(y)??y.priceAdjustment.toString();return{assetId:e,globalFarm:y,yieldFarm:O,priceAdjustment:B}}))}async getOraclePrice(e){let t=e.rewardCurrency.toString(),s=e.incentivizedAsset.toString(),r=[t,s].sort();if(t===s)return new q(1).shiftedBy(18).toString();let i=await this.api.query.emaOracle.oracles("omnipool",r,"TenMinutes");if(i.isNone)return;let[a]=i.unwrap(),c=a.price.n.toString(),u=a.price.d.toString(),y;return Number(t)<Number(s)?y=(0,Tt.fixed_from_rational)(c,u):y=(0,Tt.fixed_from_rational)(u,c),y}getGlobalRewardPerPeriod(e,t,s,r){let a=e.times(t).shiftedBy(-18).times(r).shiftedBy(-18);return a.gte(s)?s:a}getPoolYieldPerPeriod(e,t,s,r){return e.times(t).div(s.times(r).shiftedBy(-18))}async getFarmApr(e,t){if(t==="isolatedpool"&&!(0,Nt.isAddress)(e))throw new Error("You must pass an address of isolated pool as id");if(t==="omnipool"&&(0,Nt.isAddress)(e))throw new Error("You must pass an asset id of omnipool");let s=6,r=t==="omnipool"?await this.getOmnipoolFarms(e):await this.getIsolatedPoolFarms(e);return r.length?r.map(({yieldFarm:c,globalFarm:u,priceAdjustment:y})=>{let O=new q(u.totalSharesZ.toString()),B=u.plannedYieldingPeriods.toString(),N=new q(u.yieldPerPeriod.toString()),F=new q(u.maxRewardPerPeriod.toString()),_=u.blocksPerPeriod.toString(),C=new q(c.multiplier.toString()).shiftedBy(-18),k=this.secondsInYear.div(new q(s).times(_)),U;if(O.isZero())U=N.times(C).times(k);else{let we=this.getGlobalRewardPerPeriod(O,N,F,y);U=this.getPoolYieldPerPeriod(we,C,O,y).times(k)}let w=new q(u.pendingRewards.toString()).plus(u.accumulatedPaidRewards.toString()),Q=F.times(B);return w.div(Q).gte(.99)?E:U.times(100)}).reduce((c,u)=>c.plus(u),E).toString():void 0}};var be=class extends Me{pools=[];subs=[];poolsLoaded=!1;constructor(e){super(e)}async getPools(){return this.poolsLoaded?this.pools:(this.pools=await this.loadPools(),this.subs=await this.subscribe(),this.poolsLoaded=!0,this.pools)}async subscribe(){let e=this.pools.map(async s=>{let r=[await this.subscribePoolChange(s),await this.subscribeTokensPoolBalance(s),await this.subscribeSystemPoolBalance(s)];if(this.hasShareAsset(s)){let i=await this.subscribeSharePoolBalance(s);r.push(i)}return this.subscribeLog(s),r});return(await Promise.all(e)).flat()}subscribeLog(e){let t=e.address.substring(0,10).concat("...");console.log(`${e.type} [${t}] balance subscribed`)}unsubscribe(){this.subs.forEach(e=>{e()})}hasShareAsset(e){return e.type==="Stableswap"&&e.id}subscribeTokensPoolBalance(e){return this.subscribeTokenBalance(e.address,e.tokens.map(t=>t.id),this.updateBalanceCallback(e,(t,s)=>t.id!==s))}subscribeSharePoolBalance(e){return this.subscribeTokenBalance($e,[e.id],this.updateBalanceCallback(e,()=>!0))}subscribeSystemPoolBalance(e){return this.subscribeSystemBalance(e.address,this.updateBalanceCallback(e,()=>!0))}updateBalanceCallback(e,t){return function(s,r){let i=e.tokens.findIndex(a=>a.id==s);i>=0&&t(e,s)&&(e.tokens[i].balance=r.toString())}}};var nt=class extends be{MAX_FINAL_WEIGHT=K(v(100),6);poolsData=new Map([]);isSupported(){return this.api.query.lbp!==void 0}async loadPools(){let[e,t]=await Promise.all([this.api.query.lbp.poolData.entries(),this.api.query.parachainSystem.validationData()]),{relayParentNumber:s}=t.unwrap(),r=e.filter(([i,a])=>this.isActivePool(a.unwrap(),s)).map(async([{args:[i]},a])=>{let c=a.unwrap(),u=i.toString(),y=await this.getPoolDelta(u,c,s.toString());return this.poolsData.set(i.toString(),c),{address:u,type:"Lbp",fee:c.fee.toJSON(),...y,...this.getPoolLimits()}});return Promise.all(r)}async getPoolFees(e,t){let s=this.pools.find(r=>r.address===t);return{repayFee:this.getRepayFee(),exchangeFee:s.fee}}getPoolType(){return"Lbp"}async subscribePoolChange(e){return this.api.query.parachainSystem.validationData(async t=>{let{relayParentNumber:s}=t.unwrap(),r=this.poolsData.get(e.address);if(this.isActivePool(r,s)){let a=await this.getPoolDelta(e.address,r,s.toString());Object.assign(e,a)}else{let a=this.pools.findIndex(c=>c.address==e.address);this.pools.splice(a,1)}})}async getPoolDelta(e,t,s){let{start:r,end:i,assets:a,initialWeight:c,finalWeight:u,repayTarget:y,feeCollector:O}=t,B=pe.calculateLinearWeights(r.toString(),i.toString(),c.toString(),u.toString(),s),[N,F]=a,_=N.toString(),C=v(B),k=F.toString(),U=this.MAX_FINAL_WEIGHT.minus(v(C)),[w,Q,oe]=await Promise.all([this.isRepayFeeApplied(_,y.toString(),O.toString()),this.getBalance(e,_),this.getBalance(e,k)]);return{repayFeeApply:w,tokens:[{id:_,weight:C,balance:Q.toString()},{id:k,weight:U,balance:oe.toString()}]}}isActivePool(e,t){if(e.start.isEmpty||e.end.isEmpty)return!1;let s=e.start.unwrap().toNumber(),r=e.end.unwrap().toNumber();return t.toNumber()>=s&&t.toNumber()<r}async isRepayFeeApplied(e,t,s){let r=v(t);if(r.isZero())return!1;try{return(await this.getBalance(e,s)).isLessThan(r)}catch{return!0}}getRepayFee(){return this.api.consts.lbp.repayFee.toJSON()}getPoolLimits(){let e=this.api.consts.lbp.maxInRatio.toJSON(),t=this.api.consts.lbp.maxOutRatio.toJSON(),s=this.api.consts.lbp.minTradingLimit.toJSON();return{maxInRatio:e,maxOutRatio:t,minTradingLimit:s}}};var Yt=require("@polkadot/util-crypto"),$t=require("@polkadot/util");function V(m,e){return m.shiftedBy(-1*e).toString()}function ge(m){return m[0]/m[1]*100}function ne(m){return m[0]/m[1]}function de(m){return[m/rt,rt]}var ot=class extends be{isSupported(){return this.api.query.omnipool!==void 0}async loadPools(){let e=this.api.consts.omnipool.hubAssetId.toString(),t=this.getPoolId(),[s,r,i]=await Promise.all([this.api.query.omnipool.assets.entries(),this.api.query.omnipool.hubAssetTradability(),this.getBalance(t,e)]),a=s.map(async([{args:[u]},y])=>{let{hubReserve:O,shares:B,tradable:N}=y.unwrap(),F=await this.getBalance(t,u.toString());return{id:u.toString(),hubReserves:v(O.toString()),shares:v(B.toString()),tradeable:N.bits.toNumber(),balance:F.toString()}}),c=await Promise.all(a);return c.push({id:e,tradeable:r.bits.toNumber(),balance:i.toString()}),[{address:t,type:"Omnipool",hubAssetId:e,tokens:c,...this.getPoolLimits()}]}async getPoolFees(e,t){let s=await this.api.query.dynamicFees.assetFee(e),r=this.api.consts.dynamicFees.assetFeeParameters,i=this.api.consts.dynamicFees.protocolFeeParameters,a=r.minFee.toNumber()+i.minFee.toNumber(),c=r.maxFee.toNumber()+i.maxFee.toNumber();if(s.isSome){let{assetFee:u,protocolFee:y}=s.unwrap();return{assetFee:de(u.toNumber()),protocolFee:de(y.toNumber()),min:de(a),max:de(c)}}else return{assetFee:this.getAssetFee(),protocolFee:this.getProtocolFee(),min:de(a),max:de(c)}}getPoolType(){return"Omnipool"}async subscribePoolChange(e){let t=e.tokens.map(s=>s.id);return this.api.query.omnipool.assets.multi(t,s=>{e.tokens=s.map((r,i)=>{let a=e.tokens[i];if(r.isNone)return a;let c=r.unwrap();return this.updateTokenState(a,c)})})}updateTokenState(e,t){let{hubReserve:s,shares:r,tradable:i}=t;return{...e,hubReserves:v(s.toString()),shares:v(r.toString()),tradeable:i.bits.toNumber()}}getAssetFee(){let t=this.api.consts.dynamicFees.assetFeeParameters.minFee.toNumber();return de(t)}getProtocolFee(){let t=this.api.consts.dynamicFees.protocolFeeParameters.minFee.toNumber();return de(t)}getPoolId(){return(0,Yt.encodeAddress)((0,$t.stringToU8a)("modlomnipool".padEnd(32,"\0")),ke)}getPoolLimits(){let e=this.api.consts.omnipool.maxInRatio.toJSON(),t=this.api.consts.omnipool.maxOutRatio.toJSON(),s=this.api.consts.omnipool.minimumTradingLimit.toJSON();return{maxInRatio:e,maxOutRatio:t,minTradingLimit:s}}};var at=class extends be{isSupported(){return this.api.query.xyk!==void 0}async loadPools(){let t=(await this.api.query.xyk.poolAssets.entries()).map(async([{args:[s]},r])=>{let i=s.toString(),[a,c]=r.unwrap(),[u,y]=await Promise.all([this.getBalance(i,a.toString()),this.getBalance(i,c.toString())]);return{address:i,type:"Xyk",tokens:[{id:a.toString(),balance:u.toString()},{id:c.toString(),balance:y.toString()}],...this.getPoolLimits()}});return Promise.all(t)}async getPoolFees(e,t){return{exchangeFee:this.getExchangeFee()}}getPoolType(){return"Xyk"}subscribePoolChange(e){return this.api.query.xyk.poolAssets(e.address,t=>{})}getExchangeFee(){return this.api.consts.xyk.getExchangeFee.toJSON()}getPoolLimits(){let e=this.api.consts.xyk.maxInRatio.toJSON(),t=this.api.consts.xyk.maxOutRatio.toJSON(),s=this.api.consts.xyk.minTradingLimit.toJSON();return{maxInRatio:e,maxOutRatio:t,minTradingLimit:s}}};var ut=require("@polkadot/util-crypto");var Z=require("@galacticcouncil/math-stableswap"),se=class{static getPoolAddress(e){return(0,Z.pool_account_name)(e)}static calculateAmplification(e,t,s,r,i){return(0,Z.calculate_amplification)(e,t,s,r,i)}static calculateInGivenOut(e,t,s,r,i,a){return(0,Z.calculate_in_given_out)(e,t,s,r,i,a)}static calculateAddOneAsset(e,t,s,r,i,a){return(0,Z.calculate_add_one_asset)(e,t,s,r,i,a)}static calculateSharesForAmount(e,t,s,r,i,a){return(0,Z.calculate_shares_for_amount)(e,t,s,r,i,a)}static calculateOutGivenIn(e,t,s,r,i,a){return(0,Z.calculate_out_given_in)(e,t,s,r,i,a)}static calculateLiquidityOutOneAsset(e,t,s,r,i,a){return(0,Z.calculate_liquidity_out_one_asset)(e,t,s,r,i,a)}static calculateShares(e,t,s,r,i){return(0,Z.calculate_shares)(e,t,s,r,i)}static calculatePoolTradeFee(e,t,s){return(0,Z.calculate_pool_trade_fee)(e,t,s)}};var lt=class extends be{stablePools=new Map([]);isSupported(){return this.api.query.stableswap!==void 0}async loadPools(){let[e,t]=await Promise.all([this.api.query.stableswap.pools.entries(),this.api.query.system.number()]),s=t.toNumber(),r=e.map(async([{args:[i]},a])=>{let c=a.unwrap(),u=i.toString(),y=this.getPoolAddress(u),[O,B]=await Promise.all([this.getPoolDelta(u,c,s.toString()),this.getPoolTokens(y,u,c)]);return this.stablePools.set(y,c),{address:y,id:u,type:"Stableswap",fee:de(c.fee.toNumber()),tokens:B,...O,...this.getPoolLimits()}});return Promise.all(r)}async getPoolFees(e,t){return{fee:this.pools.find(r=>r.address===t).fee}}getPoolType(){return"Stableswap"}async subscribePoolChange(e){return this.api.query.system.number(async t=>{let s=t.toNumber(),r=this.stablePools.get(e.address),i=await this.getPoolDelta(e.id,r,s.toString());Object.assign(e,i)})}async getPoolDelta(e,t,s){let{initialAmplification:r,finalAmplification:i,initialBlock:a,finalBlock:c}=t,u=se.calculateAmplification(r.toString(),i.toString(),a.toString(),c.toString(),s),y=await this.api.query.tokens.totalIssuance(e);return{amplification:u,totalIssuance:y.toString()}}async getPoolTokens(e,t,s){let{assets:r}=s,i=r.map(async u=>{let[y,O]=await Promise.all([this.api.query.stableswap.assetTradability(t,u.toString()),this.getBalance(e,u.toString())]);return{id:u.toString(),tradeable:y.bits.toNumber(),balance:O.toString()}}),a=await Promise.all(i),c=await this.api.query.omnipool.assets(t);if(c.isSome){let{tradable:u}=c.unwrap(),y=await this.getBalance($e,t);a.push({id:t,tradeable:u.bits.toNumber(),balance:y.toString()})}return a}getPoolAddress(e){let t=Number(e),s=se.getPoolAddress(t);return(0,ut.encodeAddress)((0,ut.blake2AsHex)(s),ke)}getPoolLimits(){return{maxInRatio:0,maxOutRatio:0,minTradingLimit:this.api.consts.stableswap.minTradingLimit.toJSON()}}};function ct(m){return m.map(({assetIn:e,assetOut:t,pool:s,poolId:r})=>s==="Stableswap"?{pool:{Stableswap:r},assetIn:e,assetOut:t}:{pool:s,assetIn:e,assetOut:t})}var je=class extends Error{constructor(e){super(),this.message=`${e} pool invalid`,this.name="PoolNotFound"}},Ft=class extends Error{constructor(e,t){super(),this.message=`${e} pool missing ${t}`,this.name="PoolConfigNotFound"}},De=class extends Error{constructor(e,t){super(),this.message=`Route from ${e} to ${t} not found in pool configuration`,this.name="RouteNotFound"}},_t=class extends Error{constructor(e){super(),this.message=`Asset ${e} not available in current network`,this.name="AssetNotFound"}},Et=class extends Error{constructor(e){super(),this.message=`Storage missing ${e}`,this.name="StorageConfigNotFound"}},Rt=class extends Error{constructor(e){super(),this.message=`Subscription type "${e}" not supported`,this.name="SubscriptionNotSupported"}},kt=class extends Error{constructor(e){super(),this.message=`${e}`,this.name="ProviderConfigNotFound"}};var Ce=class{api;assetClient;xykClient;omniClient;lbpClient;stableClient;onChainAssets=[];onChainAssetsLoaded=!1;constructor(e){this.api=e,this.assetClient=new Le(this.api),this.xykClient=new at(this.api),this.omniClient=new ot(this.api),this.lbpClient=new nt(this.api),this.stableClient=new lt(this.api)}get assets(){return this.onChainAssets}get isRegistrySynced(){return this.onChainAssetsLoaded}async syncRegistry(e){this.onChainAssets=await this.assetClient.getOnChainAssets(!1,e),this.onChainAssetsLoaded=!0}async getPools(e){if(this.onChainAssetsLoaded||this.syncRegistry(),e.length==0){let a=(await Promise.all([this.xykClient,this.omniClient,this.lbpClient,this.stableClient].filter(c=>c.isSupported()).map(c=>c.getPools()))).flat();return this.withMetadata(a)}let t=[];e.forEach(i=>{switch(i){case"Xyk":t.push(this.xykClient.getPools());break;case"Omnipool":t.push(this.omniClient.getPools());break;case"Lbp":t.push(this.lbpClient.getPools());break;case"Stableswap":t.push(this.stableClient.getPools());break}});let r=(await Promise.all(t)).flat();return this.withMetadata(r)}unsubscribe(){this.xykClient.unsubscribe(),this.omniClient.unsubscribe(),this.lbpClient.unsubscribe(),this.stableClient.unsubscribe()}async withMetadata(e){let t=new Map(this.onChainAssets.map(s=>[s.id,s]));return e.filter(s=>s.type==="Xyk"?s.tokens.every(r=>t.get(r.id)):!0).map(s=>{let r=s.tokens.map(i=>{let a=t.get(i.id);return{...i,...a}});return{...s,tokens:r}})}async getPoolFees(e,t){switch(t.type){case"Xyk":return this.xykClient.getPoolFees(e,t.address);case"Omnipool":return this.omniClient.getPoolFees(e,t.address);case"Lbp":return this.lbpClient.getPoolFees(e,t.address);case"Stableswap":return this.stableClient.getPoolFees(e,t.address);default:throw new je(t.type)}}isDirectOmnipoolTrade(e){return e.length==1&&e[0].pool=="Omnipool"}buildBuyTx(e,t,s,r,i){let a;this.isDirectOmnipoolTrade(i)?a=this.api.tx.omnipool.buy(t,e,s.toFixed(),r.toFixed()):a=this.api.tx.router.buy(e,t,s.toFixed(),r.toFixed(),ct(i));let c=()=>a;return{hex:a.toHex(),name:"RouterBuy",get:c}}buildSellTx(e,t,s,r,i){let a;this.isDirectOmnipoolTrade(i)?a=this.api.tx.omnipool.sell(e,t,s.toFixed(),r.toFixed()):a=this.api.tx.router.sell(e,t,s.toFixed(),r.toFixed(),ct(i));let c=()=>a;return{hex:a.toHex(),name:"RouterSell",get:c}}};var Je=(m,e)=>m===e?0:m==null?e==null?0:-1:e==null?m==null?0:1:typeof m.compare=="function"?m.compare(e):typeof e.compare=="function"?-e.compare(m):m<e?-1:m>e?1:0;var mt=(m,e=t=>t!==void 0?": "+t:"")=>class extends Error{constructor(t){super(m(t)+e(t))}};var Ss=mt(()=>"illegal argument(s)"),jt=m=>{throw new Ss(m)};var ws=mt(()=>"index out of bounds"),Lt=m=>{throw new ws(m)},pt=(m,e,t)=>(m<e||m>=t)&&Lt(m);var Jt=23283064365386963e-26,gt=class{float(e=1){return this.int()*Jt*e}probability(e){return this.float()<e}norm(e=1){return(this.int()*Jt-.5)*2*e}normMinMax(e,t){let s=this.minmax(e,t);return this.float()<.5?s:-s}minmax(e,t){return this.float()*(t-e)+e}minmaxInt(e,t){e|=0;let s=(t|0)-e;return s?e+this.int()%s:e}minmaxUint(e,t){e>>>=0;let s=(t>>>0)-e;return s?e+this.int()%s:e}};var Mt=Math.random,Dt=class extends gt{int(){return Mt()*4294967296>>>0}float(e=1){return Mt()*e}norm(e=1){return(Mt()-.5)*2*e}},Kt=new Dt;var Zt=m=>m!=null&&typeof m!="function"&&m.length!==void 0;var Qt=Object.getPrototypeOf({}),ht="function",Vt="string",Ge=(m,e)=>{let t;if(m===e)return!0;if(m!=null){if(typeof m.equiv===ht)return m.equiv(e)}else return m==e;if(e!=null){if(typeof e.equiv===ht)return e.equiv(m)}else return m==e;return typeof m===Vt||typeof e===Vt?!1:(t=Object.getPrototypeOf(m),(t==null||t===Qt)&&(t=Object.getPrototypeOf(e),t==null||t===Qt)?vs(m,e):typeof m!==ht&&m.length!==void 0&&typeof e!==ht&&e.length!==void 0?xs(m,e):m instanceof Set&&e instanceof Set?Os(m,e):m instanceof Map&&e instanceof Map?Bs(m,e):m instanceof Date&&e instanceof Date?m.getTime()===e.getTime():m instanceof RegExp&&e instanceof RegExp?m.toString()===e.toString():m!==m&&e!==e)},xs=(m,e,t=Ge)=>{let s=m.length;if(s===e.length)for(;s-- >0&&t(m[s],e[s]););return s<0},Os=(m,e,t=Ge)=>m.size===e.size&&t([...m.keys()].sort(),[...e.keys()].sort()),Bs=(m,e,t=Ge)=>m.size===e.size&&t([...m].sort(),[...e].sort()),vs=(m,e,t=Ge)=>{if(Object.keys(m).length!==Object.keys(e).length)return!1;for(let s in m)if(!e.hasOwnProperty(s)||!t(m[s],e[s]))return!1;return!0};var es=(m,e)=>m!=null&&typeof m[e]=="function";var ts=m=>es(m,"xform")?m.xform():m;var dt=Symbol(),Ct=()=>{};var ss=m=>m!=null&&typeof m[Symbol.iterator]=="function";var ft=class{value;constructor(e){this.value=e}deref(){return this.value}};var Pt=m=>m instanceof ft;var rs=m=>m instanceof ft?m.deref():m;function*is(m,e){let t=ts(m)([Ct,Ct,(s,r)=>r])[2];for(let s of e){let r=t(dt,s);if(Pt(r)){r=rs(r.deref()),r!==dt&&(yield r);return}r!==dt&&(yield r)}}var ns=(m,e)=>[m[0],m[1],e];function Ke(m,e){return ss(e)?is(Ke(m),e):t=>{let s=t[2];return ns(t,(r,i)=>s(r,m(i)))}}var qe=class{_head;_length=0;constructor(e){e&&this.into(e)}get length(){return this._length}get head(){return this._head}[Symbol.iterator](){return os("next",this._head)}reverseIterator(){return os("prev",this.tail)}clear(){this.release()}compare(e,t=Je){let s=this._length;if(s<e._length)return-1;if(s>e._length)return 1;if(s===0)return 0;{let r=this._head,i=e._head,a=0;for(;s-- >0&&a===0;)a=t(r.value,i.value),r=r.next,i=i.next;return a}}concat(...e){let t=this.copy();for(let s of e)t.into(s);return t}equiv(e){if(!(e instanceof qe||Zt(e))||this._length!==e.length)return!1;if(!this._length||this===e)return!0;let t=e[Symbol.iterator](),s=this._head;for(let r=this._length;r-- >0;){if(!Ge(s.value,t.next().value))return!1;s=s.next}return!0}filter(e){let t=this.empty();return this.traverse(s=>(e(s.value)&&t.append(s.value),!0)),t}find(e){return this.traverse(t=>t.value!==e)}findWith(e){return this.traverse(t=>!e(t.value))}first(){return this._head&&this._head.value}insertSorted(e,t){t=t||Je;for(let s=this._head,r=this._length;r-- >0;){if(t(e,s.value)<=0)return this.insertBefore(s,e);s=s.next}return this.append(e)}into(e){for(let t of e)this.append(t);return this}nth(e,t){let s=this.nthCell(e);return s?s.value:t}nthCellUnsafe(e){let t,s;for(e<=this._length>>>1?(t=this._head,s="next"):(t=this.tail,s="prev",e=this._length-e-1);e-- >0&&t;)t=t[s];return t}peek(){return this.tail&&this.tail.value}$reduce(e,t){let s=this._head;for(let r=this._length;r-- >0&&!Pt(t);)t=e(t,s.value),s=s.next;return t}reduce(e,t){return this.$reduce(e,t)}release(){let e=this._head;if(!e)return!0;let t;for(let s=this._length;s-- >0;)t=e.next,delete e.value,delete e.prev,delete e.next,e=t;return this._head=void 0,this._length=0,!0}reverse(){let e=this._head,t=this.tail,s=(this._length>>>1)+(this._length&1);for(;e&&t&&s>0;){let r=e.value;e.value=t.value,t.value=r,e=e.next,t=t.prev,s--}return this}setHead(e){let t=this._head;return t?(t.value=e,t):this.prepend(e)}setNth(e,t){let s=this.nthCell(e);return!s&&Lt(e),s.value=t,s}setTail(e){let t=this.tail;return t?(t.value=e,t):this.append(e)}swap(e,t){if(e!==t){let s=e.value;e.value=t.value,t.value=s}return this}toArray(e=[]){return this.traverse(t=>(e.push(t.value),!0)),e}toJSON(){return this.toArray()}toString(){let e=[];return this.traverse(t=>(e.push(String(t.value)),!0)),e.join(", ")}traverse(e,t=this._head,s){if(!this._head)return;let r=t;do{if(!e(r))break;r=r.next}while(r!==s);return r}_map(e,t){return this.traverse(s=>(e.append(t(s.value)),!0)),e}};function*os(m,e){for(;e;)yield e.value,e=e[m]}var ye=class extends qe{_tail;constructor(e){super(),e&&this.into(e)}get tail(){return this._tail}append(e){if(this._tail){let t={value:e,prev:this._tail};return this._tail.next=t,this._tail=t,this._length++,t}else return this.prepend(e)}asHead(e){return e===this._head?this:(this.remove(e),this._head.prev=e,e.next=this._head,e.prev=void 0,this._head=e,this._length++,this)}asTail(e){return e===this._tail?this:(this.remove(e),this._tail.next=e,e.prev=this._tail,e.next=void 0,this._tail=e,this._length++,this)}cons(e){return this.prepend(e),this}copy(){return new ye(this)}*cycle(){for(;;)yield*this}drop(){let e=this._head;if(e)return this._head=e.next,this._head?this._head.prev=void 0:this._tail=void 0,this._length--,e.value}empty(){return new ye}insertAfter(e,t){let s={value:t,next:e.next,prev:e};return e.next?e.next.prev=s:this._tail=s,e.next=s,this._length++,s}insertAfterNth(e,t){return e<0&&(e+=this._length),e>=this._length-1?this.append(t):(pt(e,0,this._length),this.insertAfter(this.nthCellUnsafe(e),t))}insertBefore(e,t){let s={value:t,next:e,prev:e.prev};return e.prev?e.prev.next=s:this._head=s,e.prev=s,this._length++,s}insertBeforeNth(e,t){return e<0&&(e+=this._length),e<=0?this.prepend(t):(pt(e,0,this._length),this.insertBefore(this.nthCellUnsafe(e),t))}map(e){return this._map(new ye,e)}nth(e,t){let s=this.nthCell(e);return s?s.value:t}nthCell(e){if(e<0&&(e+=this._length),!(e<0||e>=this._length))return this.nthCellUnsafe(e)}pop(){let e=this._tail;if(e)return this._tail=e.prev,this._tail?this._tail.next=void 0:this._head=void 0,this._length--,e.value}prepend(e){let t={value:e,next:this._head};return this._head?this._head.prev=t:this._tail=t,this._head=t,this._length++,t}push(e){return this.append(e),this}release(){return this._tail=void 0,super.release()}remove(e){return e.prev?e.prev.next=e.next:this._head=e.next,e.next?e.next.prev=e.prev:this._tail=e.prev,this._length--,this}rotateLeft(){switch(this._length){case 0:case 1:return this;case 2:return this.swap(this._head,this._tail);default:return this.push(this.drop())}}rotateRight(){switch(this._length){case 0:case 1:return this;case 2:return this.swap(this._head,this._tail);default:let e=this.peek();return this.pop(),this.prepend(e),this}}seq(e=0,t=this.length){if(e>=t||e<0)return;let s=this.nthCell(e),r=this.nthCell(t-1),i=a=>({first(){return a.value},next(){return a!==r&&a.next?i(a.next):void 0}});return s?i(s):void 0}shuffle(e,t=Kt){if(this._length<2)return this;for(e=e!==void 0?e:Math.ceil(1.5*Math.log2(this._length));e>0;e--){let s=this._head;for(;s;){let r=s.next;t.probability(.5)?this.asHead(s):this.asTail(s),s=r}}return this}slice(e=0,t=this.length){let s=e<0?e+this._length:e,r=t<0?t+this._length:t;(s<0||r<0)&&jt("invalid indices: ${from} / ${to}");let i=new ye,a=this.nthCell(s);for(;a&&++s<=r;)i.push(a.value),a=a.next;return i}sort(e=Je){if(!this._length)return this;let t=1;for(;;){let s=this._head;this._head=void 0,this._tail=void 0;let r=0;for(;s;){r++;let i=s,a=0;for(let u=0;u<t&&(a++,i=i.next,!!i);u++);let c=t;for(;a>0||c>0&&i;){let u;a===0?(u=i,i=i.next,c--):!i||c===0||e(s.value,i.value)<=0?(u=s,s=s.next,a--):(u=i,i=i.next,c--),this._tail?this._tail.next=u:this._head=u,u.prev=this._tail,this._tail=u}s=i}if(this._tail.next=void 0,r<=1)return this;t*=2}}splice(e,t=0,s){let r;typeof e=="number"?(e<0&&(e+=this._length),pt(e,0,this._length),r=this.nthCellUnsafe(e)):r=e;let i=new ye;if(t>0)for(;r&&t-- >0;)this.remove(r),i.push(r.value),r=r.next;else r&&(r=r.next);if(s)if(r)for(let a of s)this.insertBefore(r,a);else for(let a of s)this.push(a);return i}};var He=class{map;items;opts;_size;constructor(e,t){let s=Object.assign({maxlen:1/0,maxsize:1/0,map:()=>new Map,ksize:()=>0,vsize:()=>0},t);this.map=s.map(),this.items=new ye,this._size=0,this.opts=s,e&&this.into(e)}get length(){return this.items.length}get size(){return this._size}[Symbol.iterator](){return this.entries()}entries(){return Ke(e=>[e.k,e],this.items)}keys(){return Ke(e=>e.k,this.items)}values(){return Ke(e=>e.v,this.items)}copy(){let e=this.empty();e.items=this.items.copy();let t=e.items.head;for(;t;)e.map.set(t.value.k,t),t=t.next;return e}empty(){return new He(null,this.opts)}release(){this._size=0,this.map.clear();let e=this.opts.release;if(e){let t;for(;t=this.items.drop();)e(t.k,t.v);return!0}return this.items.release()}has(e){return this.map.has(e)}get(e,t){let s=this.map.get(e);return s?this.resetEntry(s):t}set(e,t){let s=this.opts.ksize(e)+this.opts.vsize(t),r=this.map.get(e);return this._size+=Math.max(0,s-(r?r.value.s:0)),this.ensureSize()&&this.doSetEntry(r,e,t,s),t}into(e){for(let t of e)this.set(t[0],t[1]);return this}getSet(e,t){let s=this.map.get(e);return s?Promise.resolve(this.resetEntry(s)):t().then(r=>this.set(e,r))}delete(e){let t=this.map.get(e);return t?(this.removeEntry(t),!0):!1}resetEntry(e){return this.items.asTail(e),e.value.v}ensureSize(){let e=this.opts.release,t=this.opts.maxsize,s=this.opts.maxlen;for(;this._size>t||this.length>=s;){let r=this.items.drop();if(!r)return!1;this.map.delete(r.k),e&&e(r.k,r.v),this._size-=r.s}return!0}removeEntry(e){let t=e.value;this.map.delete(t.k),this.items.remove(e),this.opts.release&&this.opts.release(t.k,t.v),this._size-=t.s}doSetEntry(e,t,s,r){e?(e.value.v=s,e.value.s=r,this.items.asTail(e)):(this.items.push({k:t,v:s,s:r}),this.map.set(t,this.items.tail))}};var bt=class extends Ce{feeCache;disconnectSubscribeNewHeads=null;constructor(e){super(e),this.feeCache=new He(null),this.api.rpc.chain.subscribeNewHeads(async t=>{this.feeCache.release()}).then(t=>{this.disconnectSubscribeNewHeads=t})}async getPoolFees(e,t){let s=[t.address,e].join("-");if(this.feeCache.has(s))return this.feeCache.get(s);{let i=await super.getPoolFees(e,t);return this.feeCache.set(s,i),i}}async destroy(){console.log(`Destroying pool cache!
2
- Items: [${this.feeCache.length}]`),this.feeCache.release(),this.disconnectSubscribeNewHeads?.()}};var Ie=class{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;fee;repayFeeApply;static fromPool(e){return new Ie(e.address,e.tokens,e.maxInRatio,e.maxOutRatio,e.minTradingLimit,e.fee,e.repayFeeApply)}constructor(e,t,s,r,i,a,c){this.type="Lbp",this.address=e,this.tokens=t,this.maxInRatio=s,this.maxOutRatio=r,this.minTradingLimit=i,this.fee=a,this.repayFeeApply=c}validatePair(e,t){return!0}parsePair(e,t){let s=new Map(this.tokens.map(u=>[u.id,u])),r=s.get(e),i=s.get(t);if(r==null)throw new Error("Pool does not contain tokenIn");if(i==null)throw new Error("Pool does not contain tokenOut");let a=v(r.balance),c=v(i.balance);return{assetIn:e,assetOut:t,balanceIn:a,balanceOut:c,decimalsIn:r.decimals,decimalsOut:i.decimals,weightIn:r.weight,weightOut:i.weight}}validateAndBuy(e,t,s){let r=this.tokens[0].id,i=[];t.isLessThan(this.minTradingLimit)&&i.push("InsufficientTradingAmount");let a=e.balanceOut.div(this.maxOutRatio);if(t.isGreaterThan(a)&&i.push("MaxOutRatioExceeded"),r===e.assetOut){let c=this.calculateTradeFee(t,s),u=ge(this.repayFeeApply?s.repayFee:s.exchangeFee),y=t.plus(c),O=this.calculateInGivenOut(e,y),B=e.balanceIn.div(this.maxInRatio);return O.isGreaterThan(B)&&i.push("MaxInRatioExceeded"),{amountIn:O,calculatedIn:O,amountOut:t,feePct:u,errors:i}}else{let c=this.calculateInGivenOut(e,t),u=e.balanceIn.div(this.maxInRatio);return c.isGreaterThan(u)&&i.push("MaxInRatioExceeded"),{amountIn:c,calculatedIn:c,amountOut:t,feePct:0,errors:i}}}validateAndSell(e,t,s){let r=this.tokens[0].id,i=[];t.isLessThan(this.minTradingLimit)&&i.push("InsufficientTradingAmount");let a=e.balanceIn.div(this.maxInRatio);if(t.isGreaterThan(a)&&i.push("MaxInRatioExceeded"),r===e.assetIn){let c=this.calculateOutGivenIn(e,t),u=e.balanceOut.div(this.maxOutRatio);return c.isGreaterThan(u)&&i.push("MaxOutRatioExceeded"),{amountIn:t,calculatedOut:c,amountOut:c,feePct:0,errors:i}}else{let c=this.calculateOutGivenIn(e,t),u=this.calculateTradeFee(c,s),y=ge(this.repayFeeApply?s.repayFee:s.exchangeFee),O=c.minus(u),B=e.balanceOut.div(this.maxOutRatio);return O.isGreaterThan(B)&&i.push("MaxOutRatioExceeded"),{amountIn:t,calculatedOut:c,amountOut:O,feePct:y,errors:i}}}calculateInGivenOut(e,t){let s=pe.calculateInGivenOut(e.balanceIn.toString(),e.balanceOut.toString(),e.weightIn.toString(),e.weightOut.toString(),t.toFixed(0)),r=v(s);return r.isNegative()?E:r}calculateOutGivenIn(e,t){let s=pe.calculateOutGivenIn(e.balanceIn.toString(),e.balanceOut.toString(),e.weightIn.toString(),e.weightOut.toString(),t.toFixed(0)),r=v(s);return r.isNegative()?E:r}spotPriceInGivenOut(e){let t=pe.getSpotPrice(e.balanceOut.toString(),e.balanceIn.toString(),e.weightOut.toString(),e.weightIn.toString(),K(ae,e.decimalsOut).toString());return v(t)}spotPriceOutGivenIn(e){let t=pe.getSpotPrice(e.balanceIn.toString(),e.balanceOut.toString(),e.weightIn.toString(),e.weightOut.toString(),K(ae,e.decimalsIn).toString());return v(t)}calculateTradeFee(e,t){let s=pe.calculatePoolTradeFee(e.toString(),this.repayFeeApply?t.repayFee[0]:t.exchangeFee[0],this.repayFeeApply?t.repayFee[1]:t.exchangeFee[1]);return v(s)}};var D=require("@galacticcouncil/math-omnipool");var W=class{static calculateSpotPrice(e,t,s,r){return(0,D.calculate_spot_price)(e,t,s,r)}static calculateLrnaSpotPrice(e,t){return(0,D.calculate_lrna_spot_price)(e,t)}static calculateInGivenOut(e,t,s,r,i,a,c,u,y){return(0,D.calculate_in_given_out)(e,t,s,r,i,a,c,u,y)}static calculateLrnaInGivenOut(e,t,s,r,i){return(0,D.calculate_lrna_in_given_out)(e,t,s,r,i)}static calculateOutGivenIn(e,t,s,r,i,a,c,u,y){return(0,D.calculate_out_given_in)(e,t,s,r,i,a,c,u,y)}static calculateOutGivenLrnaIn(e,t,s,r,i){return(0,D.calculate_out_given_lrna_in)(e,t,s,r,i)}static calculatePoolTradeFee(e,t,s){return(0,D.calculate_pool_trade_fee)(e,t,s)}static calculateShares(e,t,s,r){return(0,D.calculate_shares)(e,t,s,r)}static calculateLiquidityOut(e,t,s,r,i,a,c,u){return(0,D.calculate_liquidity_out)(e,t,s,r,i,a,c,u)}static calculateLiquidityLRNAOut(e,t,s,r,i,a,c,u){return(0,D.calculate_liquidity_lrna_out)(e,t,s,r,i,a,c,u)}static calculateCapDifference(e,t,s,r){let i=q(t),a=q(e),c=q(r),y=q(s).shiftedBy(-18);if(i.div(c).lt(y)){let B=y.times(c).minus(i).times(a),N=i.times(q(1).minus(y));return B.div(N).toFixed(0)}else return"0"}static verifyAssetCap(e,t,s,r){return(0,D.verify_asset_cap)(e,t,s,r)}static calculateLimitHubIn(e,t,s,r){return(0,D.calculate_liquidity_hub_in)(e,t,s,r)}static isSellAllowed(e){return(0,D.is_sell_allowed)(e)}static isBuyAllowed(e){return(0,D.is_buy_allowed)(e)}static isAddLiquidityAllowed(e){return(0,D.is_add_liquidity_allowed)(e)}static isRemoveLiquidityAllowed(e){return(0,D.is_remove_liquidity_allowed)(e)}};var Ae=class{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;hubAssetId;static fromPool(e){return new Ae(e.address,e.tokens,e.maxInRatio,e.maxOutRatio,e.minTradingLimit,e.hubAssetId)}constructor(e,t,s,r,i,a){this.type="Omnipool",this.address=e,this.tokens=t,this.maxInRatio=s,this.maxOutRatio=r,this.minTradingLimit=i,this.hubAssetId=a}validatePair(e,t){return this.hubAssetId!=t}parsePair(e,t){let s=new Map(this.tokens.map(O=>[O.id,O])),r=s.get(e),i=s.get(t);if(r==null)throw new Error("Pool does not contain tokenIn");if(i==null)throw new Error("Pool does not contain tokenOut");let a=v(r.balance),c=v(i.balance),u=v(r.existentialDeposit),y=v(i.existentialDeposit);return{assetIn:e,assetOut:t,hubReservesIn:r.hubReserves,hubReservesOut:i.hubReserves,sharesIn:r.shares,sharesOut:i.shares,decimalsIn:r.decimals,decimalsOut:i.decimals,balanceIn:a,balanceOut:c,tradeableIn:r.tradeable,tradeableOut:i.tradeable,assetInED:u,assetOutED:y}}validateAndBuy(e,t,s){let r=this.calculateInGivenOut(e,t),i=this.calculateInGivenOut(e,t,s),a=i.minus(r),c=r===E?E:a.div(r).multipliedBy(100).decimalPlaces(2),u=[],y=W.isSellAllowed(e.tradeableIn),O=W.isBuyAllowed(e.tradeableOut);(!y||!O)&&u.push("TradeNotAllowed"),(t.isLessThan(this.minTradingLimit)||r.isLessThan(e.assetInED))&&u.push("InsufficientTradingAmount");let B=e.balanceOut.div(this.maxOutRatio);t.isGreaterThan(B)&&u.push("MaxOutRatioExceeded");let N=e.balanceIn.div(this.maxInRatio);return i.isGreaterThan(N)&&u.push("MaxInRatioExceeded"),{amountIn:i,calculatedIn:r,amountOut:t,feePct:c.toNumber(),errors:u}}validateAndSell(e,t,s){let r=this.calculateOutGivenIn(e,t),i=this.calculateOutGivenIn(e,t,s),c=r.minus(i).div(r).multipliedBy(100).decimalPlaces(2),u=[],y=W.isSellAllowed(e.tradeableIn),O=W.isBuyAllowed(e.tradeableOut);(!y||!O)&&u.push("TradeNotAllowed"),(t.isLessThan(this.minTradingLimit)||r.isLessThan(e.assetOutED))&&u.push("InsufficientTradingAmount");let B=e.balanceIn.div(this.maxInRatio);t.isGreaterThan(B)&&u.push("MaxInRatioExceeded");let N=e.balanceOut.div(this.maxOutRatio);return i.isGreaterThan(N)&&u.push("MaxOutRatioExceeded"),{amountIn:t,calculatedOut:r,amountOut:i,feePct:c.toNumber(),errors:u}}calculateInGivenOut(e,t,s){if(e.assetIn==this.hubAssetId)return this.calculateLrnaInGivenOut(e,t,s);let r=W.calculateInGivenOut(e.balanceIn.toString(),e.hubReservesIn.toString(),e.sharesIn.toString(),e.balanceOut.toString(),e.hubReservesOut.toString(),e.sharesOut.toString(),t.toFixed(0),s?ne(s.assetFee).toString():E.toString(),s?ne(s.protocolFee).toString():E.toString()),i=v(r);return i.isNegative()?E:i}calculateLrnaInGivenOut(e,t,s){let r=W.calculateLrnaInGivenOut(e.balanceOut.toString(),e.hubReservesOut.toString(),e.sharesOut.toString(),t.toFixed(0),s?ne(s.assetFee).toString():E.toString()),i=v(r);return i.isNegative()?E:i}calculateOutGivenIn(e,t,s){if(e.assetIn==this.hubAssetId)return this.calculateOutGivenLrnaIn(e,t,s);let r=W.calculateOutGivenIn(e.balanceIn.toString(),e.hubReservesIn.toString(),e.sharesIn.toString(),e.balanceOut.toString(),e.hubReservesOut.toString(),e.sharesOut.toString(),t.toFixed(0),s?ne(s.assetFee).toString():E.toString(),s?ne(s.protocolFee).toString():E.toString()),i=v(r);return i.isNegative()?E:i}calculateOutGivenLrnaIn(e,t,s){let r=W.calculateOutGivenLrnaIn(e.balanceOut.toString(),e.hubReservesOut.toString(),e.sharesOut.toString(),t.toFixed(0),s?ne(s.assetFee).toString():E.toString()),i=v(r);return i.isNegative()?E:i}spotPriceInGivenOut(e){if(e.assetIn==this.hubAssetId)return this.spotPriceLrnaInGivenOut(e);let t=W.calculateSpotPrice(e.balanceOut.toString(),e.hubReservesOut.toString(),e.balanceIn.toString(),e.hubReservesIn.toString());return v(t).shiftedBy(-1*(Re-e.decimalsOut)).decimalPlaces(0,1)}spotPriceLrnaInGivenOut(e){let t=W.calculateLrnaSpotPrice(e.hubReservesOut.toString(),e.balanceOut.toString());return v(t).shiftedBy(-1*(Re-e.decimalsOut)).decimalPlaces(0,1)}spotPriceOutGivenIn(e){if(e.assetIn==this.hubAssetId)return this.spotPriceOutGivenLrnaIn(e);let t=W.calculateSpotPrice(e.balanceIn.toString(),e.hubReservesIn.toString(),e.balanceOut.toString(),e.hubReservesOut.toString());return v(t).shiftedBy(-1*(Re-e.decimalsIn)).decimalPlaces(0,1)}spotPriceOutGivenLrnaIn(e){let t=W.calculateLrnaSpotPrice(e.balanceOut.toString(),e.hubReservesOut.toString());return v(t).shiftedBy(-1*(Re-e.decimalsIn)).decimalPlaces(0,1)}};var Ne=class{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;amplification;id;fee;totalIssuance;static fromPool(e){return new Ne(e.address,e.tokens,e.maxInRatio,e.maxOutRatio,e.minTradingLimit,e.amplification,e.id,e.fee,e.totalIssuance)}constructor(e,t,s,r,i,a,c,u,y){this.type="Stableswap",this.address=e,this.tokens=t,this.maxInRatio=s,this.maxOutRatio=r,this.minTradingLimit=i,this.amplification=a,this.id=c,this.fee=u,this.totalIssuance=y}validatePair(e,t){return!0}parsePair(e,t){let s=new Map(this.tokens.map(O=>[O.id,O])),r=s.get(e),i=s.get(t);if(r==null)throw new Error("Pool does not contain tokenIn");if(i==null)throw new Error("Pool does not contain tokenOut");let a=v(r.balance),c=v(i.balance),u=v(r.existentialDeposit),y=v(i.existentialDeposit);return{assetIn:e,assetOut:t,balanceIn:a,balanceOut:c,decimalsIn:r.decimals,decimalsOut:i.decimals,tradeableIn:this.id===e?st:r.tradeable,tradeableOut:this.id===t?st:i.tradeable,assetInED:u,assetOutED:y}}validateAndBuy(e,t,s){let r=this.calculateInGivenOut(e,t),i=this.calculateInGivenOut(e,t,s),a=ge(s.fee),c=[],u=W.isSellAllowed(e.tradeableIn),y=W.isBuyAllowed(e.tradeableOut);return(!u||!y)&&c.push("TradeNotAllowed"),(t.isLessThan(this.minTradingLimit)||r.isLessThan(e.assetInED))&&c.push("InsufficientTradingAmount"),{amountIn:i,calculatedIn:r,amountOut:t,feePct:a,errors:c}}validateAndSell(e,t,s){let r=this.calculateOutGivenIn(e,t),i=this.calculateOutGivenIn(e,t,s),a=ge(s.fee),c=[],u=W.isSellAllowed(e.tradeableIn),y=W.isBuyAllowed(e.tradeableOut);return(!u||!y)&&c.push("TradeNotAllowed"),(t.isLessThan(this.minTradingLimit)||r.isLessThan(e.assetOutED))&&c.push("InsufficientTradingAmount"),{amountIn:t,calculatedOut:r,amountOut:i,feePct:a,errors:c}}calculateIn(e,t,s){let r=se.calculateInGivenOut(this.getReserves(),Number(e.assetIn),Number(e.assetOut),t.toFixed(0),this.amplification,s?ne(s.fee).toString():E.toString()),i=v(r);return i.isNegative()?E:i}calculateAddOneAsset(e,t,s){let r=se.calculateAddOneAsset(this.getReserves(),t.toFixed(0),Number(e.assetIn),this.amplification,this.totalIssuance,s?ne(s.fee).toString():E.toString()),i=v(r);return i.isNegative()?E:i}calculateSharesForAmount(e,t,s){let r=se.calculateSharesForAmount(this.getReserves(),Number(e.assetOut),t.toFixed(0),this.amplification,this.totalIssuance,s?ne(s.fee).toString():E.toString()),i=v(r);return i.isNegative()?E:i}calculateInGivenOut(e,t,s){return e.assetOut==this.id?this.calculateAddOneAsset(e,t,s):e.assetIn==this.id?this.calculateSharesForAmount(e,t,s):this.calculateIn(e,t,s)}spotPriceInGivenOut(e){let t=K(ae,e.decimalsOut);return e.assetOut==this.id?this.calculateAddOneAsset(e,t):e.assetIn==this.id?this.calculateSharesForAmount(e,t):this.calculateIn(e,t)}calculateOut(e,t,s){let r=se.calculateOutGivenIn(this.getReserves(),Number(e.assetIn),Number(e.assetOut),t.toFixed(0),this.amplification,s?ne(s.fee).toString():E.toString()),i=v(r);return i.isNegative()?E:i}calculateWithdrawOneAsset(e,t,s){let r=se.calculateLiquidityOutOneAsset(this.getReserves(),t.toFixed(0),Number(e.assetOut),this.amplification,this.totalIssuance,s?ne(s.fee).toString():E.toString()),i=v(r);return i.isNegative()?E:i}calculateShares(e,t,s){let r=se.calculateShares(this.getReserves(),this.getAssets(e.assetIn,t),this.amplification,this.totalIssuance,s?ne(s.fee).toString():E.toString()),i=v(r);return i.isNegative()?E:i}calculateOutGivenIn(e,t,s){return e.assetIn==this.id?this.calculateWithdrawOneAsset(e,t,s):e.assetOut==this.id?this.calculateShares(e,t,s):this.calculateOut(e,t,s)}spotPriceOutGivenIn(e){let t=K(ae,e.decimalsIn);return e.assetIn==this.id?this.calculateWithdrawOneAsset(e,t):e.assetOut==this.id?this.calculateShares(e,t):this.calculateOut(e,t)}calculateTradeFee(e,t){let s=se.calculatePoolTradeFee(e.toString(),t.fee[0],t.fee[1]);return v(s)}getReserves(){let e=this.tokens.filter(t=>t.id!=this.id).map(({id:t,balance:s,decimals:r})=>({asset_id:Number(t),amount:s,decimals:r}));return JSON.stringify(e)}getAssets(e,t){let s={asset_id:Number(e),amount:t.toFixed(0)};return JSON.stringify([s])}};var $=require("@galacticcouncil/math-xyk"),Se=class{static getSpotPrice(e,t,s){return(0,$.get_spot_price)(e,t,s)}static calculateInGivenOut(e,t,s){return(0,$.calculate_in_given_out)(e,t,s)}static calculateOutGivenIn(e,t,s){return(0,$.calculate_out_given_in)(e,t,s)}static calculatePoolTradeFee(e,t,s){return(0,$.calculate_pool_trade_fee)(e,t,s)}static calculateLiquidityIn(e,t,s){return(0,$.calculate_liquidity_in)(e,t,s)}static calculateSpotPrice(e,t){return(0,$.calculate_spot_price)(e,t)}static calculateSpotPriceWithFee(e,t,s,r){return(0,$.calculate_spot_price_with_fee)(e,t,s,r)}static calculateShares(e,t,s){return(0,$.calculate_shares)(e,t,s)}static calculateLiquidityOutAssetA(e,t,s,r){return(0,$.calculate_liquidity_out_asset_a)(e,t,s,r)}static calculateLiquidityOutAssetB(e,t,s,r){return(0,$.calculate_liquidity_out_asset_b)(e,t,s,r)}};var Te=class{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;static fromPool(e){return new Te(e.address,e.tokens,e.maxInRatio,e.maxOutRatio,e.minTradingLimit)}constructor(e,t,s,r,i){this.type="Xyk",this.address=e,this.tokens=t,this.maxInRatio=s,this.maxOutRatio=r,this.minTradingLimit=i}validatePair(e,t){return!0}parsePair(e,t){let s=new Map(this.tokens.map(O=>[O.id,O])),r=s.get(e),i=s.get(t);if(r==null)throw new Error("Pool does not contain tokenIn");if(i==null)throw new Error("Pool does not contain tokenOut");let a=v(r.balance),c=v(i.balance),u=v(r.existentialDeposit),y=v(i.existentialDeposit);return{assetIn:e,assetOut:t,decimalsIn:r.decimals,decimalsOut:i.decimals,balanceIn:a,balanceOut:c,assetInED:u,assetOutED:y}}validateAndBuy(e,t,s){let r=this.calculateInGivenOut(e,t),i=this.calculateTradeFee(r,s),a=ge(s.exchangeFee),c=r.plus(i),u=[];(t.isLessThan(this.minTradingLimit)||r.isLessThan(e.assetInED))&&u.push("InsufficientTradingAmount");let y=e.balanceOut.div(this.maxOutRatio);t.isGreaterThan(y)&&u.push("MaxOutRatioExceeded");let O=e.balanceIn.div(this.maxInRatio);return c.isGreaterThan(O)&&u.push("MaxInRatioExceeded"),{amountIn:c,calculatedIn:r,amountOut:t,feePct:a,errors:u}}validateAndSell(e,t,s){let r=this.calculateOutGivenIn(e,t),i=this.calculateTradeFee(r,s),a=ge(s.exchangeFee),c=r.minus(i),u=[];(t.isLessThan(this.minTradingLimit)||r.isLessThan(e.assetOutED))&&u.push("InsufficientTradingAmount");let y=e.balanceIn.div(this.maxInRatio);t.isGreaterThan(y)&&u.push("MaxInRatioExceeded");let O=e.balanceOut.div(this.maxOutRatio);return c.isGreaterThan(O)&&u.push("MaxOutRatioExceeded"),{amountIn:t,calculatedOut:r,amountOut:c,feePct:a,errors:u}}calculateInGivenOut(e,t){let s=Se.calculateInGivenOut(e.balanceIn.toString(),e.balanceOut.toString(),t.toFixed(0)),r=v(s);return r.isNegative()?E:r}calculateOutGivenIn(e,t){let s=Se.calculateOutGivenIn(e.balanceIn.toString(),e.balanceOut.toString(),t.toFixed(0)),r=v(s);return r.isNegative()?E:r}spotPriceInGivenOut(e){let t=Se.calculateSpotPrice(e.balanceOut.toString(),e.balanceIn.toString()),s=K(ae,18-e.decimalsOut);return v(t).div(s)}spotPriceOutGivenIn(e){let t=Se.calculateSpotPrice(e.balanceIn.toString(),e.balanceOut.toString()),s=K(ae,18-e.decimalsIn);return v(t).div(s)}calculateTradeFee(e,t){let s=Se.calculatePoolTradeFee(e.toString(),t.exchangeFee[0],t.exchangeFee[1]);return v(s)}};var Ue=class{static get(e){switch(e.type){case"Xyk":return Te.fromPool(e);case"Omnipool":return Ae.fromPool(e);case"Lbp":return Ie.fromPool(e);case"Stableswap":return Ne.fromPool(e);default:throw new Error("Pool type "+e.type+" is not supported yet")}}};var _e=class{routeSuggester;routerOptions;poolService;defaultRouterOptions={includeOnly:[]};constructor(e,t){this.poolService=e,this.routeSuggester=new Ye,this.routerOptions={...this.defaultRouterOptions,...t}}async getPools(){let e=this.routerOptions.includeOnly;return await this.poolService.getPools(e)}async getAllAssets(){let e=await this.getPools();if(e.length===0)throw new Error("No pools configured");let t=await this.getAssets(e);return[...new Map(t).values()]}async getAssetPairs(e){let t=await this.getPools();if(t.length===0)throw new Error("No pools configured");let{assets:s,poolsMap:r}=await this.validateToken(e,t),a=this.getPaths(e,null,r,t).map(c=>c[c.length-1].assetOut);return this.toAssets([...new Set(a)],s)}async getAllPaths(e,t){let s=await this.getPools();if(s.length===0)throw new Error("No pools configured");let{poolsMap:r}=await this.validateTokenPair(e,t,s);return this.getPaths(e,t,r,s)}async getAssets(e){let t=e.map(s=>s.tokens.map(r=>({id:r.id,name:r.name,symbol:r.symbol,decimals:r.decimals,icon:r.icon,type:r.type,isSufficient:r.isSufficient,existentialDeposit:r.existentialDeposit,origin:r.origin,meta:r.meta,externalId:r.externalId,isWhiteListed:r.isWhiteListed}))).flat();return new Map(t.map(s=>[s.id,s]))}getPaths(e,t,s,r){return this.routeSuggester.getProposals(e,t,r).filter(c=>this.validPath(c,s)).map(c=>this.toHops(c,s))}async validateTokenPair(e,t,s){let r=await this.getAssets(s);if(r.get(e)==null)throw new Error(e+" is not supported token");if(r.get(t)==null)throw new Error(t+" is not supported token");let i=this.getPoolMap(s);return{assets:r,poolsMap:i}}async validateToken(e,t){let s=await this.getAssets(t);if(s.get(e)==null)throw new Error(e+" is not supported token");let r=this.getPoolMap(t);return{assets:s,poolsMap:r}}getPoolMap(e){return new Map(e.map(t=>[t.address,Ue.get(t)]))}validPath(e,t){return e.length>0&&e.map(s=>this.validEdge(s,t)).reduce((s,r)=>s&&r)}validEdge([e,t,s],r){return r.get(e)?.validatePair(t,s)||!1}toHops(e,t){return e.map(([s,r,i])=>{let a=t.get(s);return{poolAddress:s,poolId:a?.id,pool:a?.type,assetIn:r,assetOut:i}})}toAssets(e,t){return e.map(s=>t.get(s))}};function Is(m,e){return m.minus(e).abs().div(m.plus(e).div(2)).multipliedBy(100).decimalPlaces(2)}function ze(m,e){return m.minus(e).div(e).multipliedBy(100).decimalPlaces(2)}function Gt(m,e){return ae.minus(e.div(m)).multipliedBy(100).decimalPlaces(2)}function qt(m,e){return e.div(m).minus(ae).multipliedBy(100).decimalPlaces(2)}var Ze=class extends _e{isDirectTrade(e){return e.length==1}findBestSellRoute(e){let t=e.sort((s,r)=>{let i=s[s.length-1].amountOut,a=r[r.length-1].amountOut;return i.isGreaterThan(a)?-1:1});return t.find(s=>s.every(r=>r.errors.length==0))||t[0]}getRouteFeeRange(e){if(e.filter(s=>s.tradeFeeRange).length>0){let s=e.map(i=>i.tradeFeeRange?.[0]??i.tradeFeePct).reduce((i,a)=>i+a),r=e.map(i=>i.tradeFeeRange?.[1]??i.tradeFeePct).reduce((i,a)=>i+a);return[s,r]}}getPoolFeeRange(e){let t=e.min?ge(e.min):void 0,s=e.max?ge(e.max):void 0;if(t&&s)return[t,s]}async getBestSell(e,t,s){return this.getSell(e,t,s)}async getSell(e,t,s,r){let i=await super.getPools();if(i.length===0)throw new Error("No pools configured");let{poolsMap:a}=await super.validateTokenPair(e,t,i),c=super.getPaths(e,t,a,i);if(c.length===0)throw new De(e,t);let u;if(r)u=await this.toSellSwaps(s,r,a);else{let R=c.map(async n=>await this.toSellSwaps(s,n,a)),Y=await Promise.all(R);u=this.findBestSellRoute(Y)}let y=u[0],O=u[u.length-1],B=this.isDirectTrade(u),N=u.map(R=>R.spotPrice.shiftedBy(-1*R.assetOutDecimals)).reduce((R,Y)=>R.multipliedBy(Y)),F=K(N,O.assetOutDecimals),_=B?O.calculatedOut:this.calculateDelta0Y(y.amountIn,u,a),C=O.amountOut,k=B?O.tradeFeePct:Gt(_,C).toNumber(),U=_.minus(C),w=this.getRouteFeeRange(u),Q=y.amountIn.shiftedBy(-1*y.assetInDecimals).multipliedBy(F),oe=ze(_,Q),we=R=>this.poolService.buildSellTx(e,t,y.amountIn,R,u.map(Y=>Y));return{type:"Sell",amountIn:y.amountIn,amountOut:O.amountOut,spotPrice:F,tradeFee:U,tradeFeePct:k,tradeFeeRange:w,priceImpactPct:oe.toNumber(),swaps:u,toTx:we,toHuman(){return{type:"Sell",amountIn:V(y.amountIn,y.assetInDecimals),amountOut:V(O.amountOut,O.assetOutDecimals),spotPrice:V(F,O.assetOutDecimals),tradeFee:V(U,O.assetOutDecimals),tradeFeePct:k,tradeFeeRange:w,priceImpactPct:oe.toNumber(),swaps:u.map(R=>R.toHuman())}}}}calculateDelta0Y(e,t,s){let r=[];for(let i=0;i<t.length;i++){let a=t[i],c=s.get(a.poolAddress);if(c==null)throw new Error("Pool does not exit");let u=c.parsePair(a.assetIn,a.assetOut),y;i>0?y=r[i-1]:y=e;let O=c.calculateOutGivenIn(u,y);r.push(O)}return r[r.length-1]}async toSellSwaps(e,t,s){let r=[];for(let i=0;i<t.length;i++){let a=t[i],c=s.get(a.poolAddress);if(c==null)throw new Error("Pool does not exit");let u=c.parsePair(a.assetIn,a.assetOut),y;i>0?y=r[i-1].amountOut:y=K(v(e),u.decimalsIn).decimalPlaces(0,1);let O=await this.poolService.getPoolFees(u.assetOut,c),{amountOut:B,calculatedOut:N,feePct:F,errors:_}=c.validateAndSell(u,y,O),C=this.getPoolFeeRange(O),k=c.spotPriceOutGivenIn(u),U=y.shiftedBy(-1*u.decimalsIn).multipliedBy(k),w=ze(N,U);r.push({...a,assetInDecimals:u.decimalsIn,assetOutDecimals:u.decimalsOut,amountIn:y,calculatedOut:N,amountOut:B,spotPrice:k,tradeFeePct:F,tradeFeeRange:C,priceImpactPct:w.toNumber(),errors:_,toHuman(){return{...a,amountIn:V(y,u.decimalsIn),calculatedOut:V(N,u.decimalsOut),amountOut:V(B,u.decimalsOut),spotPrice:V(k,u.decimalsOut),tradeFeePct:F,tradeFeeRange:C,priceImpactPct:w.toNumber(),errors:_}}})}return r}async getBestSpotPrice(e,t){let s=await super.getPools();if(s.length===0)throw new Error("No pools configured");let{poolsMap:r}=await super.validateTokenPair(e,t,s),i=super.getPaths(e,t,r,s);if(i.length===0)return Promise.resolve(void 0);let a=s.map(w=>w.tokens.find(Q=>Q.id===e)).filter(w=>!!w).sort((w,Q)=>Number(Q.balance)-Number(w.balance)),{balance:c,decimals:u}=a[0],O=v(c).shiftedBy(-1*u).div(100).multipliedBy(.1),B=i.map(async w=>await this.toSellSwaps(O,w,r)),N=await Promise.all(B),F=this.findBestSellRoute(N),_=await this.toSellSwaps("1",F,r),C=_.map(w=>w.spotPrice.shiftedBy(-1*w.assetOutDecimals)).reduce((w,Q)=>w.multipliedBy(Q)),k=_[_.length-1].assetOutDecimals;return{amount:K(C,k),decimals:k}}findBestBuyRoute(e){let t=e.sort((s,r)=>{let i=s[0].amountIn,a=r[0].amountIn;return i.isGreaterThan(a)?1:-1});return t.find(s=>s.every(r=>r.errors.length==0))||t[0]}async getBestBuy(e,t,s){return this.getBuy(e,t,s)}async getBuy(e,t,s,r){let i=await super.getPools();if(i.length===0)throw new Error("No pools configured");let{poolsMap:a}=await super.validateTokenPair(e,t,i),c=super.getPaths(e,t,a,i);if(c.length===0)throw new De(e,t);let u;if(r)u=await this.toBuySwaps(s,r,a);else{let R=c.map(async n=>await this.toBuySwaps(s,n,a)),Y=await Promise.all(R);u=this.findBestBuyRoute(Y)}let y=u[u.length-1],O=u[0],B=this.isDirectTrade(u),N=u.map(R=>R.spotPrice.shiftedBy(-1*R.assetInDecimals)).reduce((R,Y)=>R.multipliedBy(Y)),F=K(N,O.assetInDecimals),_=B?O.calculatedIn:this.calculateDelta0X(y.amountOut,u,a),C=O.amountIn,k=B?O.tradeFeePct:qt(_,C).toNumber(),U=C.minus(_),w=this.getRouteFeeRange(u),Q=y.amountOut.shiftedBy(-1*y.assetOutDecimals).multipliedBy(F),oe;_.isZero()?oe=-100:oe=ze(Q,_).toNumber();let we=R=>this.poolService.buildBuyTx(e,t,y.amountOut,R,u.map(Y=>Y));return{type:"Buy",amountOut:y.amountOut,amountIn:O.amountIn,spotPrice:F,tradeFee:U,tradeFeePct:k,tradeFeeRange:w,priceImpactPct:oe,swaps:u,toTx:we,toHuman(){return{type:"Buy",amountOut:V(y.amountOut,y.assetOutDecimals),amountIn:V(O.amountIn,O.assetInDecimals),spotPrice:V(F,O.assetInDecimals),tradeFee:V(U,O.assetInDecimals),tradeFeePct:k,tradeFeeRange:w,priceImpactPct:oe,swaps:u.map(R=>R.toHuman())}}}}calculateDelta0X(e,t,s){let r=[];for(let i=t.length-1;i>=0;i--){let a=t[i],c=s.get(a.poolAddress);if(c==null)throw new Error("Pool does not exit");let u=c.parsePair(a.assetIn,a.assetOut),y;i==t.length-1?y=e:y=r[0];let O=c.calculateInGivenOut(u,y);r.unshift(O)}return r[0]}async toBuySwaps(e,t,s){let r=[];for(let i=t.length-1;i>=0;i--){let a=t[i],c=s.get(a.poolAddress);if(c==null)throw new Error("Pool does not exit");let u=c.parsePair(a.assetIn,a.assetOut),y;i==t.length-1?y=K(v(e),u.decimalsOut).decimalPlaces(0,1):y=r[0].amountIn;let O=await this.poolService.getPoolFees(u.assetOut,c),{amountIn:B,calculatedIn:N,feePct:F,errors:_}=c.validateAndBuy(u,y,O),C=this.getPoolFeeRange(O),k=c.spotPriceInGivenOut(u),U=y.shiftedBy(-1*u.decimalsOut).multipliedBy(k),w;N.isZero()?w=-100:w=ze(U,N).toNumber(),r.unshift({...a,assetInDecimals:u.decimalsIn,assetOutDecimals:u.decimalsOut,amountOut:y,calculatedIn:N,amountIn:B,spotPrice:k,tradeFeePct:F,tradeFeeRange:C,priceImpactPct:w,errors:_,toHuman(){return{...a,amountOut:V(y,u.decimalsOut),calculatedIn:V(N,u.decimalsIn),amountIn:V(B,u.decimalsIn),spotPrice:V(k,u.decimalsIn),tradeFeePct:F,tradeFeeRange:C,priceImpactPct:w,errors:_}}})}return r}};0&&(module.exports={AssetClient,AssetNotFound,BASILISK_PARACHAIN_ID,BalanceClient,BigNumber,CachingPoolService,DECIMAL_PLACES,DENOMINATOR,FarmClient,HYDRADX_OMNIPOOL_ADDRESS,HYDRADX_PARACHAIN_ID,HYDRADX_SS58_PREFIX,INFINITY,LbpMath,LbpPool,ONE,OmniMath,OmniPool,PoolConfigNotFound,PoolError,PoolFactory,PoolNotFound,PoolService,PoolType,ProviderConfigNotFound,RUNTIME_DECIMALS,RouteNotFound,Router,SYSTEM_ASSET_DECIMALS,SYSTEM_ASSET_ID,StableMath,StableSwap,StorageConfigNotFound,SubscriptionNotSupported,TRADEABLE_DEFAULT,TradeRouter,TradeType,XykMath,XykPool,ZERO,bnum,buildRoute,calculateBuyFee,calculateDiffToAvg,calculateDiffToRef,calculateSellFee,findNestedKey,findNestedObj,scale});
1
+ "use strict";var wt=Object.defineProperty;var as=Object.getOwnPropertyDescriptor;var ls=Object.getOwnPropertyNames;var us=Object.prototype.hasOwnProperty;var cs=(l,e)=>{for(var t in e)wt(l,t,{get:e[t],enumerable:!0})},ms=(l,e,t,s)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of ls(e))!us.call(l,r)&&r!==t&&wt(l,r,{get:()=>e[r],enumerable:!(s=as(e,r))||s.enumerable});return l};var ps=l=>ms(wt({},"__esModule",{value:!0}),l);var As={};cs(As,{AssetClient:()=>Fe,AssetNotFound:()=>_t,BASILISK_PARACHAIN_ID:()=>bs,BalanceClient:()=>_e,BigNumber:()=>q,CachingPoolService:()=>bt,DECIMAL_PLACES:()=>zt,DENOMINATOR:()=>et,FarmClient:()=>tt,HYDRADX_OMNIPOOL_ADDRESS:()=>Xe,HYDRADX_PARACHAIN_ID:()=>Ps,HYDRADX_SS58_PREFIX:()=>Te,INFINITY:()=>ds,LbpMath:()=>pe,LbpPool:()=>Le,ONE:()=>ae,OmniMath:()=>W,OmniPool:()=>Me,PoolConfigNotFound:()=>Ft,PoolError:()=>Ae,PoolFactory:()=>Ge,PoolNotFound:()=>We,PoolService:()=>Re,PoolType:()=>ie,ProviderConfigNotFound:()=>kt,RUNTIME_DECIMALS:()=>Ne,RouteNotFound:()=>Ee,Router:()=>Ie,SYSTEM_ASSET_DECIMALS:()=>fs,SYSTEM_ASSET_ID:()=>xe,StableMath:()=>se,StableSwap:()=>De,StorageConfigNotFound:()=>Et,SubscriptionNotSupported:()=>Rt,TRADEABLE_DEFAULT:()=>Ve,TradeRouter:()=>je,TradeType:()=>It,XykMath:()=>ye,XykPool:()=>Ce,ZERO:()=>E,bnum:()=>v,buildRoute:()=>at,calculateBuyFee:()=>qt,calculateDiffToAvg:()=>Is,calculateDiffToRef:()=>qe,calculateSellFee:()=>Gt,findNestedKey:()=>At,findNestedObj:()=>ys,scale:()=>K});module.exports=ps(As);var Ke=class{constructor(e=1/0){this.capacity=e}storage=[];enqueue(e){if(this.size()===this.capacity)throw Error("Queue has reached max capacity, you cannot add more items");this.storage.push(e)}dequeue(){return this.storage.shift()}size(){return this.storage.length}};var gs=5,Ue=class{isNotVisited(e,t){let s=!0;return t.forEach(r=>{(r[0]===e[0]||r[1]===e[1])&&(s=!1)}),s}findPaths(e,t,s){let r=[],i=new Ke,a=[];for(a.push([t,""]),i.enqueue(a);i.size()>0;){let m=i.dequeue();if(m==null||m.length>gs)return r;let c=m[m.length-1];(s===null||c[0]===s)&&r.push(m),e.get(c[0])?.forEach(O=>{if(this.isNotVisited(O,m)){let B=[...m];B.push(O),i.enqueue(B)}})}return r}buildAndPopulateGraph(e,t){let s=new Map;for(let r of e)s.set(parseInt(r),[]);for(let[r,i,a]of t){let m=parseInt(i),c=parseInt(a);s.get(m)?.push([c,r])}return s}};function xt(l){let e={};for(let t of l){let s=t.tokens.length;for(let r=0;r<s;r++){e[t.tokens[r].id]||(e[t.tokens[r].id]=[]);for(let i=0;i<s;i++){if(r==i)continue;let a=[t.address,t.tokens[r].id,t.tokens[i].id];e[t.tokens[r].id].push(a)}}}return e}var ze=class{getProposals(e,t,s){let r=xt(s),i=Object.keys(r),a=i.map(O=>r[O]).flat(),m=new Ue,c=m.buildAndPopulateGraph(i,a),y=m.findPaths(c,parseInt(e),t?parseInt(t):null);return this.parsePaths(y)}parsePaths(e){let t=[];for(let s of e){let r=[];for(let i=0;i<s.length;i++){let a=s[i],m=s[i+1];if(m==null)break;r.push(this.toEdge(a,m))}t.push(r)}return t}toEdge(e,t){return[t[1],e[0].toString(),t[0].toString()]}};var hs=/^-?(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?$/i,Ot=Math.ceil,ce=Math.floor,re="[BigNumber Error] ",Ht=re+"Number primitive has more than 15 significant digits: ",he=1e14,T=14,Bt=9007199254740991,vt=[1,10,100,1e3,1e4,1e5,1e6,1e7,1e8,1e9,1e10,1e11,1e12,1e13],Oe=1e7,J=1e9;function Ut(l){var e,t,s,r=w.prototype={constructor:w,toString:null,valueOf:null},i=new w(1),a=20,m=4,c=-7,y=21,O=-1e7,B=1e7,N=!1,F=1,_=0,C={prefix:"",groupSize:3,secondaryGroupSize:0,groupSeparator:",",decimalSeparator:".",fractionGroupSize:0,fractionGroupSeparator:"\xA0",suffix:""},k="0123456789abcdefghijklmnopqrstuvwxyz",U=!0;function w(n,o){var u,P,g,d,S,p,h,b,f=this;if(!(f instanceof w))return new w(n,o);if(o==null){if(n&&n._isBigNumber===!0){f.s=n.s,!n.c||n.e>B?f.c=f.e=null:n.e<O?f.c=[f.e=0]:(f.e=n.e,f.c=n.c.slice());return}if((p=typeof n=="number")&&n*0==0){if(f.s=1/n<0?(n=-n,-1):1,n===~~n){for(d=0,S=n;S>=10;S/=10,d++);d>B?f.c=f.e=null:(f.e=d,f.c=[n]);return}b=String(n)}else{if(!hs.test(b=String(n)))return s(f,b,p);f.s=b.charCodeAt(0)==45?(b=b.slice(1),-1):1}(d=b.indexOf("."))>-1&&(b=b.replace(".","")),(S=b.search(/e/i))>0?(d<0&&(d=S),d+=+b.slice(S+1),b=b.substring(0,S)):d<0&&(d=b.length)}else{if(H(o,2,k.length,"Base"),o==10&&U)return f=new w(n),R(f,a+f.e+1,m);if(b=String(n),p=typeof n=="number"){if(n*0!=0)return s(f,b,p,o);if(f.s=1/n<0?(b=b.slice(1),-1):1,w.DEBUG&&b.replace(/^0\.0*|\./,"").length>15)throw Error(Ht+n)}else f.s=b.charCodeAt(0)===45?(b=b.slice(1),-1):1;for(u=k.slice(0,o),d=S=0,h=b.length;S<h;S++)if(u.indexOf(P=b.charAt(S))<0){if(P=="."){if(S>d){d=h;continue}}else if(!g&&(b==b.toUpperCase()&&(b=b.toLowerCase())||b==b.toLowerCase()&&(b=b.toUpperCase()))){g=!0,S=-1,d=0;continue}return s(f,String(n),p,o)}p=!1,b=t(b,o,10,f.s),(d=b.indexOf("."))>-1?b=b.replace(".",""):d=b.length}for(S=0;b.charCodeAt(S)===48;S++);for(h=b.length;b.charCodeAt(--h)===48;);if(b=b.slice(S,++h)){if(h-=S,p&&w.DEBUG&&h>15&&(n>Bt||n!==ce(n)))throw Error(Ht+f.s*n);if((d=d-S-1)>B)f.c=f.e=null;else if(d<O)f.c=[f.e=0];else{if(f.e=d,f.c=[],S=(d+1)%T,d<0&&(S+=T),S<h){for(S&&f.c.push(+b.slice(0,S)),h-=T;S<h;)f.c.push(+b.slice(S,S+=T));S=T-(b=b.slice(S)).length}else S-=h;for(;S--;b+="0");f.c.push(+b)}}else f.c=[f.e=0]}w.clone=Ut,w.ROUND_UP=0,w.ROUND_DOWN=1,w.ROUND_CEIL=2,w.ROUND_FLOOR=3,w.ROUND_HALF_UP=4,w.ROUND_HALF_DOWN=5,w.ROUND_HALF_EVEN=6,w.ROUND_HALF_CEIL=7,w.ROUND_HALF_FLOOR=8,w.EUCLID=9,w.config=w.set=function(n){var o,u;if(n!=null)if(typeof n=="object"){if(n.hasOwnProperty(o="DECIMAL_PLACES")&&(u=n[o],H(u,0,J,o),a=u),n.hasOwnProperty(o="ROUNDING_MODE")&&(u=n[o],H(u,0,8,o),m=u),n.hasOwnProperty(o="EXPONENTIAL_AT")&&(u=n[o],u&&u.pop?(H(u[0],-J,0,o),H(u[1],0,J,o),c=u[0],y=u[1]):(H(u,-J,J,o),c=-(y=u<0?-u:u))),n.hasOwnProperty(o="RANGE"))if(u=n[o],u&&u.pop)H(u[0],-J,-1,o),H(u[1],1,J,o),O=u[0],B=u[1];else if(H(u,-J,J,o),u)O=-(B=u<0?-u:u);else throw Error(re+o+" cannot be zero: "+u);if(n.hasOwnProperty(o="CRYPTO"))if(u=n[o],u===!!u)if(u)if(typeof crypto<"u"&&crypto&&(crypto.getRandomValues||crypto.randomBytes))N=u;else throw N=!u,Error(re+"crypto unavailable");else N=u;else throw Error(re+o+" not true or false: "+u);if(n.hasOwnProperty(o="MODULO_MODE")&&(u=n[o],H(u,0,9,o),F=u),n.hasOwnProperty(o="POW_PRECISION")&&(u=n[o],H(u,0,J,o),_=u),n.hasOwnProperty(o="FORMAT"))if(u=n[o],typeof u=="object")C=u;else throw Error(re+o+" not an object: "+u);if(n.hasOwnProperty(o="ALPHABET"))if(u=n[o],typeof u=="string"&&!/^.?$|[+\-.\s]|(.).*\1/.test(u))U=u.slice(0,10)=="0123456789",k=u;else throw Error(re+o+" invalid: "+u)}else throw Error(re+"Object expected: "+n);return{DECIMAL_PLACES:a,ROUNDING_MODE:m,EXPONENTIAL_AT:[c,y],RANGE:[O,B],CRYPTO:N,MODULO_MODE:F,POW_PRECISION:_,FORMAT:C,ALPHABET:k}},w.isBigNumber=function(n){if(!n||n._isBigNumber!==!0)return!1;if(!w.DEBUG)return!0;var o,u,P=n.c,g=n.e,d=n.s;e:if({}.toString.call(P)=="[object Array]"){if((d===1||d===-1)&&g>=-J&&g<=J&&g===ce(g)){if(P[0]===0){if(g===0&&P.length===1)return!0;break e}if(o=(g+1)%T,o<1&&(o+=T),String(P[0]).length==o){for(o=0;o<P.length;o++)if(u=P[o],u<0||u>=he||u!==ce(u))break e;if(u!==0)return!0}}}else if(P===null&&g===null&&(d===null||d===1||d===-1))return!0;throw Error(re+"Invalid BigNumber: "+n)},w.maximum=w.max=function(){return oe(arguments,-1)},w.minimum=w.min=function(){return oe(arguments,1)},w.random=function(){var n=9007199254740992,o=Math.random()*n&2097151?function(){return ce(Math.random()*n)}:function(){return(Math.random()*1073741824|0)*8388608+(Math.random()*8388608|0)};return function(u){var P,g,d,S,p,h=0,b=[],f=new w(i);if(u==null?u=a:H(u,0,J),S=Ot(u/T),N)if(crypto.getRandomValues){for(P=crypto.getRandomValues(new Uint32Array(S*=2));h<S;)p=P[h]*131072+(P[h+1]>>>11),p>=9e15?(g=crypto.getRandomValues(new Uint32Array(2)),P[h]=g[0],P[h+1]=g[1]):(b.push(p%1e14),h+=2);h=S/2}else if(crypto.randomBytes){for(P=crypto.randomBytes(S*=7);h<S;)p=(P[h]&31)*281474976710656+P[h+1]*1099511627776+P[h+2]*4294967296+P[h+3]*16777216+(P[h+4]<<16)+(P[h+5]<<8)+P[h+6],p>=9e15?crypto.randomBytes(7).copy(P,h):(b.push(p%1e14),h+=7);h=S/7}else throw N=!1,Error(re+"crypto unavailable");if(!N)for(;h<S;)p=o(),p<9e15&&(b[h++]=p%1e14);for(S=b[--h],u%=T,S&&u&&(p=vt[T-u],b[h]=ce(S/p)*p);b[h]===0;b.pop(),h--);if(h<0)b=[d=0];else{for(d=-1;b[0]===0;b.splice(0,1),d-=T);for(h=1,p=b[0];p>=10;p/=10,h++);h<T&&(d-=T-h)}return f.e=d,f.c=b,f}}(),w.sum=function(){for(var n=1,o=arguments,u=new w(o[0]);n<o.length;)u=u.plus(o[n++]);return u},t=function(){var n="0123456789";function o(u,P,g,d){for(var S,p=[0],h,b=0,f=u.length;b<f;){for(h=p.length;h--;p[h]*=P);for(p[0]+=d.indexOf(u.charAt(b++)),S=0;S<p.length;S++)p[S]>g-1&&(p[S+1]==null&&(p[S+1]=0),p[S+1]+=p[S]/g|0,p[S]%=g)}return p.reverse()}return function(u,P,g,d,S){var p,h,b,f,x,I,A,M,z=u.indexOf("."),j=a,L=m;for(z>=0&&(f=_,_=0,u=u.replace(".",""),M=new w(P),I=M.pow(u.length-z),_=f,M.c=o(we(ue(I.c),I.e,"0"),10,g,n),M.e=M.c.length),A=o(u,P,g,S?(p=k,n):(p=n,k)),b=f=A.length;A[--f]==0;A.pop());if(!A[0])return p.charAt(0);if(z<0?--b:(I.c=A,I.e=b,I.s=d,I=e(I,M,j,L,g),A=I.c,x=I.r,b=I.e),h=b+j+1,z=A[h],f=g/2,x=x||h<0||A[h+1]!=null,x=L<4?(z!=null||x)&&(L==0||L==(I.s<0?3:2)):z>f||z==f&&(L==4||x||L==6&&A[h-1]&1||L==(I.s<0?8:7)),h<1||!A[0])u=x?we(p.charAt(1),-j,p.charAt(0)):p.charAt(0);else{if(A.length=h,x)for(--g;++A[--h]>g;)A[h]=0,h||(++b,A=[1].concat(A));for(f=A.length;!A[--f];);for(z=0,u="";z<=f;u+=p.charAt(A[z++]));u=we(u,b,p.charAt(0))}return u}}(),e=function(){function n(P,g,d){var S,p,h,b,f=0,x=P.length,I=g%Oe,A=g/Oe|0;for(P=P.slice();x--;)h=P[x]%Oe,b=P[x]/Oe|0,S=A*h+b*I,p=I*h+S%Oe*Oe+f,f=(p/d|0)+(S/Oe|0)+A*b,P[x]=p%d;return f&&(P=[f].concat(P)),P}function o(P,g,d,S){var p,h;if(d!=S)h=d>S?1:-1;else for(p=h=0;p<d;p++)if(P[p]!=g[p]){h=P[p]>g[p]?1:-1;break}return h}function u(P,g,d,S){for(var p=0;d--;)P[d]-=p,p=P[d]<g[d]?1:0,P[d]=p*S+P[d]-g[d];for(;!P[0]&&P.length>1;P.splice(0,1));}return function(P,g,d,S,p){var h,b,f,x,I,A,M,z,j,L,G,ee,Je,yt,St,fe,He,le=P.s==g.s?1:-1,te=P.c,X=g.c;if(!te||!te[0]||!X||!X[0])return new w(!P.s||!g.s||(te?X&&te[0]==X[0]:!X)?NaN:te&&te[0]==0||!X?le*0:le/0);for(z=new w(le),j=z.c=[],b=P.e-g.e,le=d+b+1,p||(p=he,b=me(P.e/T)-me(g.e/T),le=le/T|0),f=0;X[f]==(te[f]||0);f++);if(X[f]>(te[f]||0)&&b--,le<0)j.push(1),x=!0;else{for(yt=te.length,fe=X.length,f=0,le+=2,I=ce(p/(X[0]+1)),I>1&&(X=n(X,I,p),te=n(te,I,p),fe=X.length,yt=te.length),Je=fe,L=te.slice(0,fe),G=L.length;G<fe;L[G++]=0);He=X.slice(),He=[0].concat(He),St=X[0],X[1]>=p/2&&St++;do{if(I=0,h=o(X,L,fe,G),h<0){if(ee=L[0],fe!=G&&(ee=ee*p+(L[1]||0)),I=ce(ee/St),I>1)for(I>=p&&(I=p-1),A=n(X,I,p),M=A.length,G=L.length;o(A,L,M,G)==1;)I--,u(A,fe<M?He:X,M,p),M=A.length,h=1;else I==0&&(h=I=1),A=X.slice(),M=A.length;if(M<G&&(A=[0].concat(A)),u(L,A,G,p),G=L.length,h==-1)for(;o(X,L,fe,G)<1;)I++,u(L,fe<G?He:X,G,p),G=L.length}else h===0&&(I++,L=[0]);j[f++]=I,L[0]?L[G++]=te[Je]||0:(L=[te[Je]],G=1)}while((Je++<yt||L[0]!=null)&&le--);x=L[0]!=null,j[0]||j.splice(0,1)}if(p==he){for(f=1,le=j[0];le>=10;le/=10,f++);R(z,d+(z.e=f+b*T-1)+1,S,x)}else z.e=b,z.r=+x;return z}}();function Q(n,o,u,P){var g,d,S,p,h;if(u==null?u=m:H(u,0,8),!n.c)return n.toString();if(g=n.c[0],S=n.e,o==null)h=ue(n.c),h=P==1||P==2&&(S<=c||S>=y)?Qe(h,S):we(h,S,"0");else if(n=R(new w(n),o,u),d=n.e,h=ue(n.c),p=h.length,P==1||P==2&&(o<=d||d<=c)){for(;p<o;h+="0",p++);h=Qe(h,d)}else if(o-=S,h=we(h,d,"0"),d+1>p){if(--o>0)for(h+=".";o--;h+="0");}else if(o+=d-p,o>0)for(d+1==p&&(h+=".");o--;h+="0");return n.s<0&&g?"-"+h:h}function oe(n,o){for(var u,P,g=1,d=new w(n[0]);g<n.length;g++)P=new w(n[g]),(!P.s||(u=ve(d,P))===o||u===0&&d.s===o)&&(d=P);return d}function Se(n,o,u){for(var P=1,g=o.length;!o[--g];o.pop());for(g=o[0];g>=10;g/=10,P++);return(u=P+u*T-1)>B?n.c=n.e=null:u<O?n.c=[n.e=0]:(n.e=u,n.c=o),n}s=function(){var n=/^(-?)0([xbo])(?=\w[\w.]*$)/i,o=/^([^.]+)\.$/,u=/^\.([^.]+)$/,P=/^-?(Infinity|NaN)$/,g=/^\s*\+(?=[\w.])|^\s+|\s+$/g;return function(d,S,p,h){var b,f=p?S:S.replace(g,"");if(P.test(f))d.s=isNaN(f)?null:f<0?-1:1;else{if(!p&&(f=f.replace(n,function(x,I,A){return b=(A=A.toLowerCase())=="x"?16:A=="b"?2:8,!h||h==b?I:x}),h&&(b=h,f=f.replace(o,"$1").replace(u,"0.$1")),S!=f))return new w(f,b);if(w.DEBUG)throw Error(re+"Not a"+(h?" base "+h:"")+" number: "+S);d.s=null}d.c=d.e=null}}();function R(n,o,u,P){var g,d,S,p,h,b,f,x=n.c,I=vt;if(x){e:{for(g=1,p=x[0];p>=10;p/=10,g++);if(d=o-g,d<0)d+=T,S=o,h=x[b=0],f=ce(h/I[g-S-1]%10);else if(b=Ot((d+1)/T),b>=x.length)if(P){for(;x.length<=b;x.push(0));h=f=0,g=1,d%=T,S=d-T+1}else break e;else{for(h=p=x[b],g=1;p>=10;p/=10,g++);d%=T,S=d-T+g,f=S<0?0:ce(h/I[g-S-1]%10)}if(P=P||o<0||x[b+1]!=null||(S<0?h:h%I[g-S-1]),P=u<4?(f||P)&&(u==0||u==(n.s<0?3:2)):f>5||f==5&&(u==4||P||u==6&&(d>0?S>0?h/I[g-S]:0:x[b-1])%10&1||u==(n.s<0?8:7)),o<1||!x[0])return x.length=0,P?(o-=n.e+1,x[0]=I[(T-o%T)%T],n.e=-o||0):x[0]=n.e=0,n;if(d==0?(x.length=b,p=1,b--):(x.length=b+1,p=I[T-d],x[b]=S>0?ce(h/I[g-S]%I[S])*p:0),P)for(;;)if(b==0){for(d=1,S=x[0];S>=10;S/=10,d++);for(S=x[0]+=p,p=1;S>=10;S/=10,p++);d!=p&&(n.e++,x[0]==he&&(x[0]=1));break}else{if(x[b]+=p,x[b]!=he)break;x[b--]=0,p=1}for(d=x.length;x[--d]===0;x.pop());}n.e>B?n.c=n.e=null:n.e<O&&(n.c=[n.e=0])}return n}function Y(n){var o,u=n.e;return u===null?n.toString():(o=ue(n.c),o=u<=c||u>=y?Qe(o,u):we(o,u,"0"),n.s<0?"-"+o:o)}return r.absoluteValue=r.abs=function(){var n=new w(this);return n.s<0&&(n.s=1),n},r.comparedTo=function(n,o){return ve(this,new w(n,o))},r.decimalPlaces=r.dp=function(n,o){var u,P,g,d=this;if(n!=null)return H(n,0,J),o==null?o=m:H(o,0,8),R(new w(d),n+d.e+1,o);if(!(u=d.c))return null;if(P=((g=u.length-1)-me(this.e/T))*T,g=u[g])for(;g%10==0;g/=10,P--);return P<0&&(P=0),P},r.dividedBy=r.div=function(n,o){return e(this,new w(n,o),a,m)},r.dividedToIntegerBy=r.idiv=function(n,o){return e(this,new w(n,o),0,1)},r.exponentiatedBy=r.pow=function(n,o){var u,P,g,d,S,p,h,b,f,x=this;if(n=new w(n),n.c&&!n.isInteger())throw Error(re+"Exponent not an integer: "+Y(n));if(o!=null&&(o=new w(o)),p=n.e>14,!x.c||!x.c[0]||x.c[0]==1&&!x.e&&x.c.length==1||!n.c||!n.c[0])return f=new w(Math.pow(+Y(x),p?n.s*(2-Ze(n)):+Y(n))),o?f.mod(o):f;if(h=n.s<0,o){if(o.c?!o.c[0]:!o.s)return new w(NaN);P=!h&&x.isInteger()&&o.isInteger(),P&&(x=x.mod(o))}else{if(n.e>9&&(x.e>0||x.e<-1||(x.e==0?x.c[0]>1||p&&x.c[1]>=24e7:x.c[0]<8e13||p&&x.c[0]<=9999975e7)))return d=x.s<0&&Ze(n)?-0:0,x.e>-1&&(d=1/d),new w(h?1/d:d);_&&(d=Ot(_/T+2))}for(p?(u=new w(.5),h&&(n.s=1),b=Ze(n)):(g=Math.abs(+Y(n)),b=g%2),f=new w(i);;){if(b){if(f=f.times(x),!f.c)break;d?f.c.length>d&&(f.c.length=d):P&&(f=f.mod(o))}if(g){if(g=ce(g/2),g===0)break;b=g%2}else if(n=n.times(u),R(n,n.e+1,1),n.e>14)b=Ze(n);else{if(g=+Y(n),g===0)break;b=g%2}x=x.times(x),d?x.c&&x.c.length>d&&(x.c.length=d):P&&(x=x.mod(o))}return P?f:(h&&(f=i.div(f)),o?f.mod(o):d?R(f,_,m,S):f)},r.integerValue=function(n){var o=new w(this);return n==null?n=m:H(n,0,8),R(o,o.e+1,n)},r.isEqualTo=r.eq=function(n,o){return ve(this,new w(n,o))===0},r.isFinite=function(){return!!this.c},r.isGreaterThan=r.gt=function(n,o){return ve(this,new w(n,o))>0},r.isGreaterThanOrEqualTo=r.gte=function(n,o){return(o=ve(this,new w(n,o)))===1||o===0},r.isInteger=function(){return!!this.c&&me(this.e/T)>this.c.length-2},r.isLessThan=r.lt=function(n,o){return ve(this,new w(n,o))<0},r.isLessThanOrEqualTo=r.lte=function(n,o){return(o=ve(this,new w(n,o)))===-1||o===0},r.isNaN=function(){return!this.s},r.isNegative=function(){return this.s<0},r.isPositive=function(){return this.s>0},r.isZero=function(){return!!this.c&&this.c[0]==0},r.minus=function(n,o){var u,P,g,d,S=this,p=S.s;if(n=new w(n,o),o=n.s,!p||!o)return new w(NaN);if(p!=o)return n.s=-o,S.plus(n);var h=S.e/T,b=n.e/T,f=S.c,x=n.c;if(!h||!b){if(!f||!x)return f?(n.s=-o,n):new w(x?S:NaN);if(!f[0]||!x[0])return x[0]?(n.s=-o,n):new w(f[0]?S:m==3?-0:0)}if(h=me(h),b=me(b),f=f.slice(),p=h-b){for((d=p<0)?(p=-p,g=f):(b=h,g=x),g.reverse(),o=p;o--;g.push(0));g.reverse()}else for(P=(d=(p=f.length)<(o=x.length))?p:o,p=o=0;o<P;o++)if(f[o]!=x[o]){d=f[o]<x[o];break}if(d&&(g=f,f=x,x=g,n.s=-n.s),o=(P=x.length)-(u=f.length),o>0)for(;o--;f[u++]=0);for(o=he-1;P>p;){if(f[--P]<x[P]){for(u=P;u&&!f[--u];f[u]=o);--f[u],f[P]+=he}f[P]-=x[P]}for(;f[0]==0;f.splice(0,1),--b);return f[0]?Se(n,f,b):(n.s=m==3?-1:1,n.c=[n.e=0],n)},r.modulo=r.mod=function(n,o){var u,P,g=this;return n=new w(n,o),!g.c||!n.s||n.c&&!n.c[0]?new w(NaN):!n.c||g.c&&!g.c[0]?new w(g):(F==9?(P=n.s,n.s=1,u=e(g,n,0,3),n.s=P,u.s*=P):u=e(g,n,0,F),n=g.minus(u.times(n)),!n.c[0]&&F==1&&(n.s=g.s),n)},r.multipliedBy=r.times=function(n,o){var u,P,g,d,S,p,h,b,f,x,I,A,M,z,j,L=this,G=L.c,ee=(n=new w(n,o)).c;if(!G||!ee||!G[0]||!ee[0])return!L.s||!n.s||G&&!G[0]&&!ee||ee&&!ee[0]&&!G?n.c=n.e=n.s=null:(n.s*=L.s,!G||!ee?n.c=n.e=null:(n.c=[0],n.e=0)),n;for(P=me(L.e/T)+me(n.e/T),n.s*=L.s,h=G.length,x=ee.length,h<x&&(M=G,G=ee,ee=M,g=h,h=x,x=g),g=h+x,M=[];g--;M.push(0));for(z=he,j=Oe,g=x;--g>=0;){for(u=0,I=ee[g]%j,A=ee[g]/j|0,S=h,d=g+S;d>g;)b=G[--S]%j,f=G[S]/j|0,p=A*b+f*I,b=I*b+p%j*j+M[d]+u,u=(b/z|0)+(p/j|0)+A*f,M[d--]=b%z;M[d]=u}return u?++P:M.splice(0,1),Se(n,M,P)},r.negated=function(){var n=new w(this);return n.s=-n.s||null,n},r.plus=function(n,o){var u,P=this,g=P.s;if(n=new w(n,o),o=n.s,!g||!o)return new w(NaN);if(g!=o)return n.s=-o,P.minus(n);var d=P.e/T,S=n.e/T,p=P.c,h=n.c;if(!d||!S){if(!p||!h)return new w(g/0);if(!p[0]||!h[0])return h[0]?n:new w(p[0]?P:g*0)}if(d=me(d),S=me(S),p=p.slice(),g=d-S){for(g>0?(S=d,u=h):(g=-g,u=p),u.reverse();g--;u.push(0));u.reverse()}for(g=p.length,o=h.length,g-o<0&&(u=h,h=p,p=u,o=g),g=0;o;)g=(p[--o]=p[o]+h[o]+g)/he|0,p[o]=he===p[o]?0:p[o]%he;return g&&(p=[g].concat(p),++S),Se(n,p,S)},r.precision=r.sd=function(n,o){var u,P,g,d=this;if(n!=null&&n!==!!n)return H(n,1,J),o==null?o=m:H(o,0,8),R(new w(d),n,o);if(!(u=d.c))return null;if(g=u.length-1,P=g*T+1,g=u[g]){for(;g%10==0;g/=10,P--);for(g=u[0];g>=10;g/=10,P++);}return n&&d.e+1>P&&(P=d.e+1),P},r.shiftedBy=function(n){return H(n,-Bt,Bt),this.times("1e"+n)},r.squareRoot=r.sqrt=function(){var n,o,u,P,g,d=this,S=d.c,p=d.s,h=d.e,b=a+4,f=new w("0.5");if(p!==1||!S||!S[0])return new w(!p||p<0&&(!S||S[0])?NaN:S?d:1/0);if(p=Math.sqrt(+Y(d)),p==0||p==1/0?(o=ue(S),(o.length+h)%2==0&&(o+="0"),p=Math.sqrt(+o),h=me((h+1)/2)-(h<0||h%2),p==1/0?o="5e"+h:(o=p.toExponential(),o=o.slice(0,o.indexOf("e")+1)+h),u=new w(o)):u=new w(p+""),u.c[0]){for(h=u.e,p=h+b,p<3&&(p=0);;)if(g=u,u=f.times(g.plus(e(d,g,b,1))),ue(g.c).slice(0,p)===(o=ue(u.c)).slice(0,p))if(u.e<h&&--p,o=o.slice(p-3,p+1),o=="9999"||!P&&o=="4999"){if(!P&&(R(g,g.e+a+2,0),g.times(g).eq(d))){u=g;break}b+=4,p+=4,P=1}else{(!+o||!+o.slice(1)&&o.charAt(0)=="5")&&(R(u,u.e+a+2,1),n=!u.times(u).eq(d));break}}return R(u,u.e+a+1,m,n)},r.toExponential=function(n,o){return n!=null&&(H(n,0,J),n++),Q(this,n,o,1)},r.toFixed=function(n,o){return n!=null&&(H(n,0,J),n=n+this.e+1),Q(this,n,o)},r.toFormat=function(n,o,u){var P,g=this;if(u==null)n!=null&&o&&typeof o=="object"?(u=o,o=null):n&&typeof n=="object"?(u=n,n=o=null):u=C;else if(typeof u!="object")throw Error(re+"Argument not an object: "+u);if(P=g.toFixed(n,o),g.c){var d,S=P.split("."),p=+u.groupSize,h=+u.secondaryGroupSize,b=u.groupSeparator||"",f=S[0],x=S[1],I=g.s<0,A=I?f.slice(1):f,M=A.length;if(h&&(d=p,p=h,h=d,M-=d),p>0&&M>0){for(d=M%p||p,f=A.substr(0,d);d<M;d+=p)f+=b+A.substr(d,p);h>0&&(f+=b+A.slice(d)),I&&(f="-"+f)}P=x?f+(u.decimalSeparator||"")+((h=+u.fractionGroupSize)?x.replace(new RegExp("\\d{"+h+"}\\B","g"),"$&"+(u.fractionGroupSeparator||"")):x):f}return(u.prefix||"")+P+(u.suffix||"")},r.toFraction=function(n){var o,u,P,g,d,S,p,h,b,f,x,I,A=this,M=A.c;if(n!=null&&(p=new w(n),!p.isInteger()&&(p.c||p.s!==1)||p.lt(i)))throw Error(re+"Argument "+(p.isInteger()?"out of range: ":"not an integer: ")+Y(p));if(!M)return new w(A);for(o=new w(i),b=u=new w(i),P=h=new w(i),I=ue(M),d=o.e=I.length-A.e-1,o.c[0]=vt[(S=d%T)<0?T+S:S],n=!n||p.comparedTo(o)>0?d>0?o:b:p,S=B,B=1/0,p=new w(I),h.c[0]=0;f=e(p,o,0,1),g=u.plus(f.times(P)),g.comparedTo(n)!=1;)u=P,P=g,b=h.plus(f.times(g=b)),h=g,o=p.minus(f.times(g=o)),p=g;return g=e(n.minus(u),P,0,1),h=h.plus(g.times(b)),u=u.plus(g.times(P)),h.s=b.s=A.s,d=d*2,x=e(b,P,d,m).minus(A).abs().comparedTo(e(h,u,d,m).minus(A).abs())<1?[b,P]:[h,u],B=S,x},r.toNumber=function(){return+Y(this)},r.toPrecision=function(n,o){return n!=null&&H(n,1,J),Q(this,n,o,2)},r.toString=function(n){var o,u=this,P=u.s,g=u.e;return g===null?P?(o="Infinity",P<0&&(o="-"+o)):o="NaN":(n==null?o=g<=c||g>=y?Qe(ue(u.c),g):we(ue(u.c),g,"0"):n===10&&U?(u=R(new w(u),a+g+1,m),o=we(ue(u.c),u.e,"0")):(H(n,2,k.length,"Base"),o=t(we(ue(u.c),g,"0"),10,n,P,!0)),P<0&&u.c[0]&&(o="-"+o)),o},r.valueOf=r.toJSON=function(){return Y(this)},r._isBigNumber=!0,r[Symbol.toStringTag]="BigNumber",r[Symbol.for("nodejs.util.inspect.custom")]=r.valueOf,l!=null&&w.set(l),w}function me(l){var e=l|0;return l>0||l===e?e:e-1}function ue(l){for(var e,t,s=1,r=l.length,i=l[0]+"";s<r;){for(e=l[s++]+"",t=T-e.length;t--;e="0"+e);i+=e}for(r=i.length;i.charCodeAt(--r)===48;);return i.slice(0,r+1||1)}function ve(l,e){var t,s,r=l.c,i=e.c,a=l.s,m=e.s,c=l.e,y=e.e;if(!a||!m)return null;if(t=r&&!r[0],s=i&&!i[0],t||s)return t?s?0:-m:a;if(a!=m)return a;if(t=a<0,s=c==y,!r||!i)return s?0:!r^t?1:-1;if(!s)return c>y^t?1:-1;for(m=(c=r.length)<(y=i.length)?c:y,a=0;a<m;a++)if(r[a]!=i[a])return r[a]>i[a]^t?1:-1;return c==y?0:c>y^t?1:-1}function H(l,e,t,s){if(l<e||l>t||l!==ce(l))throw Error(re+(s||"Argument")+(typeof l=="number"?l<e||l>t?" out of range: ":" not an integer: ":" not a primitive number: ")+String(l))}function Ze(l){var e=l.c.length-1;return me(l.e/T)==e&&l.c[e]%2!=0}function Qe(l,e){return(l.length>1?l.charAt(0)+"."+l.slice(1):l)+(e<0?"e":"e+")+e}function we(l,e,t){var s,r;if(e<0){for(r=t+".";++e;r+=t);l=r+l}else if(s=l.length,++e>s){for(r=t,e-=s;--e;r+=t);l+=r}else e<s&&(l=l.slice(0,e)+"."+l.slice(e));return l}var q=Ut();var zt=12;q.config({EXPONENTIAL_AT:[-100,100],ROUNDING_MODE:4,DECIMAL_PLACES:zt});var E=v(0),ae=v(1),ds=v("Infinity");function K(l,e){let t=new q(e.toString()),s=new q(10).pow(t);return l.times(s)}function v(l){return new q(l.toString())}var ie=(r=>(r.XYK="Xyk",r.LBP="Lbp",r.Stable="Stableswap",r.Omni="Omnipool",r))(ie||{}),Ae=(i=>(i.UnknownError="UnknownError",i.InsufficientTradingAmount="InsufficientTradingAmount",i.MaxInRatioExceeded="MaxInRatioExceeded",i.MaxOutRatioExceeded="MaxOutRatioExceeded",i.TradeNotAllowed="TradeNotAllowed",i))(Ae||{}),It=(t=>(t.Buy="Buy",t.Sell="Sell",t))(It||{});var Pe=require("@galacticcouncil/math-lbp"),pe=class{static getSpotPrice(e,t,s,r,i){return(0,Pe.get_spot_price)(e,t,s,r,i)}static calculateInGivenOut(e,t,s,r,i){return(0,Pe.calculate_in_given_out)(e,t,s,r,i)}static calculateOutGivenIn(e,t,s,r,i){return(0,Pe.calculate_out_given_in)(e,t,s,r,i)}static calculateLinearWeights(e,t,s,r,i){return(0,Pe.calculate_linear_weights)(e,t,s,r,i)}static calculatePoolTradeFee(e,t,s){return(0,Pe.calculate_pool_trade_fee)(e,t,s)}};var Xt=require("@polkadot/util-crypto"),Wt=require("@polkadot/util"),Ne=18,Ve=15,xe="0",fs=12,Ps=2034,Te=63,bs=2090,et=1e3,Xe=(0,Xt.encodeAddress)((0,Wt.stringToU8a)("modlomnipool".padEnd(32,"\0")),Te);function At(l,e){let t=[];return JSON.stringify(l,(s,r)=>(r&&r[e]&&t.push(r),r)),t[0]}function ys(l,e,t){let s;return JSON.stringify(l,(r,i)=>(i&&i[e]===t&&(s=i),i)),s}var Qs=require("@polkadot/types/lookup");var Vs=require("@polkadot/api-base/types/consts");var er=require("@polkadot/api-base/types/errors");var tr=require("@polkadot/api-base/types/events");var sr=require("@polkadot/api-base/types/storage");var rr=require("@polkadot/api-base/types/submittable");var ir=require("@polkadot/rpc-core/types/jsonrpc");var nr=require("@polkadot/api-base/types/calls");var gr=require("@polkadot/types/types/registry");var Pr=require("@polkadot/types/lookup");var br=require("@polkadot/api-base/types/consts");var yr=require("@polkadot/api-base/types/errors");var Sr=require("@polkadot/api-base/types/events");var wr=require("@polkadot/api-base/types/storage");var xr=require("@polkadot/api-base/types/submittable");var Or=require("@polkadot/rpc-core/types/jsonrpc");var Br=require("@polkadot/api-base/types/calls");var Er=require("@polkadot/types/types/registry");var Be=class{api;constructor(e){this.api=e}get chainDecimals(){return this.api.registry.chainDecimals[0]}get chainToken(){return this.api.registry.chainTokens[0]}};var Fe=class extends Be{SUPPORTED_TYPES=["StableSwap","Bond","Token","External"];constructor(e){super(e)}async safeSharesQuery(){try{let e=await this.api.query.stableswap.pools.entries();return new Map(e.map(([{args:[t]},s])=>[t.toString(),s.unwrap()]))}catch{return new Map([])}}async safeBondsQuery(){try{let e=await this.api.query.bonds.bonds.entries();return new Map(e.map(([{args:[t]},s])=>[t.toString(),s.unwrap()]))}catch{return new Map([])}}async metadataQuery(){try{let e=await this.api.query.assetRegistry.assetMetadataMap.entries();return new Map(e.map(([{args:[t]},s])=>{let{decimals:r,symbol:i}=s.unwrap();return[t.toString(),{decimals:r.toNumber(),symbol:i.toHuman()}]}))}catch{return new Map([])}}async locationsQuery(){try{let e=await this.api.query.assetRegistry.assetLocations.entries();return new Map(e.map(([{args:[t]},s])=>[t.toString(),s.unwrap()]))}catch{return new Map([])}}getSystemTokenName(e){switch(e){case"HDX":return"Hydration";case"BSX":return"Basilisk";default:return e}}getToken(e,t,s,r){if(e==xe){let F=this.api.consts.balances.existentialDeposit;return{id:xe,name:this.getSystemTokenName(this.chainToken),symbol:this.chainToken,decimals:this.chainDecimals,icon:this.chainToken,type:"Token",isSufficient:!0,existentialDeposit:F.toString()}}let{name:i,assetType:a,isSufficient:m,existentialDeposit:c}=t,{symbol:y,decimals:O}=s.get(e)??{},B=this.parseLocation("parachain",r);return{id:e,name:i.toHuman(),symbol:y,decimals:O,icon:y,type:a.toHuman(),isSufficient:m?m.toHuman():!0,origin:B,externalId:this.parseLocation(2094===B?"generalKey":"generalIndex",r),existentialDeposit:c.toString()}}getBond(e,t,s,r){let[i,a]=r,{assetType:m,isSufficient:c,existentialDeposit:y}=t,{symbol:O,decimals:B}=this.getToken(i.toString(),t,s),N=a.toNumber(),F=new Intl.DateTimeFormat("en-GB"),_=[O,"Bond",F.format(N)].join(" ");return{id:e,name:_,symbol:O+"b",decimals:B,icon:O,type:m.toString(),isSufficient:c.toHuman(),existentialDeposit:y.toString(),underlyingAssetId:i.toString(),maturity:N}}getShares(e,t,s,r){let{assets:i}=r,{name:a,symbol:m,assetType:c,isSufficient:y,existentialDeposit:O}=t,N=i.map(C=>C.toString()).map(C=>{let{symbol:k}=this.getToken(C,t,s);return[C,k]}),F=Object.fromEntries(N),_=Object.values(F);return{id:e,name:_.join(", "),symbol:m?.isSome?m.toHuman():a.toHuman(),decimals:18,icon:_.join("/"),type:c.toString(),isSufficient:y.toHuman(),existentialDeposit:O.toString(),meta:F}}getExternal(e,t,s,r){let i=this.getToken(e,t,new Map,r),a=s?.find(m=>m.internalId===i.id);return a?{...i,decimals:a.decimals,name:a.name,symbol:a.symbol,icon:a.symbol,isWhiteListed:a.isWhiteListed}:i}normalizeMetadata(e,t){return t.size?t:new Map(e.map(([{args:[s]},r])=>{let{decimals:i,symbol:a}=r.unwrap();return[s.toString(),{decimals:Number(i.toString()),symbol:a.toHuman()}]}))}getSupportedAssets(e){return e.filter(([t,s])=>{if(s.isNone)return!1;let r=s.unwrap();return this.isSupportedAsset(r)})}async getOnChainAssets(e,t){let[s,r,i,a,m]=await Promise.all([this.api.query.assetRegistry.assets.entries(),this.locationsQuery(),this.safeSharesQuery(),this.safeBondsQuery(),this.metadataQuery()]),c=this.getSupportedAssets(s),y=this.normalizeMetadata(c,m),O=c.map(([{args:[B]},N])=>{let F=N.unwrap(),_=r.get(B.toString()),{assetType:C}=F;switch(C.toString()){case"Bond":let k=a.get(B.toString());return this.getBond(B.toString(),F,y,k);case"StableSwap":let U=i.get(B.toString());return this.getShares(B.toString(),F,y,U);case"External":return this.getExternal(B.toString(),F,t,_);default:return this.getToken(B.toString(),F,y,_)}});return e?O:O.filter(B=>this.isValidAsset(B))}isValidAsset(e){let t=Math.sign(e.decimals);return!!e.symbol&&(t===0||t===1)}isSupportedAsset(e){let t=e.assetType.toString();return this.SUPPORTED_TYPES.includes(t)}parseLocation(e,t){if(t){let s=At(t.toJSON(),e);return s&&s[e]}else return}};var _e=class extends Be{constructor(e){super(e)}async getBalance(e,t){return t===xe?await this.getSystemBalance(e):await this.getTokenBalance(e,t)}async getSystemBalance(e){let{data:t}=await this.api.query.system.account(e);return this.calculateFreeBalance(t)}async getTokenBalance(e,t){let{free:s,reserved:r,frozen:i}=await this.api.query.tokens.accounts(e,t);return this.calculateFreeBalance({free:s,feeFrozen:r,frozen:i})}async subscribeBalance(e,t,s){let r=t.filter(i=>i!==xe).map(i=>[e,i]);return this.api.query.tokens.accounts.multi(r,i=>{i.forEach(({free:a,reserved:m,frozen:c},y)=>{let O=this.calculateFreeBalance({free:a,feeFrozen:m,frozen:c}),B=r[y][1];s(B,O)})})}async subscribeTokenBalance(e,t,s){let r=t.filter(i=>i!==xe).map(i=>[e,i]);return this.api.query.tokens.accounts.multi(r,i=>{i.forEach((a,m)=>{let c=this.calculateFreeBalance(a),y=r[m][1];s(y,c)})})}async subscribeSystemBalance(e,t){return this.api.query.system.account(e,({data:s})=>t(xe,this.calculateFreeBalance(s)))}calculateFreeBalance(e){let{free:t,miscFrozen:s,feeFrozen:r,frozen:i}=e,a=new q(t),m=new q(s||i),c=new q(r||0),y=m.gt(c)?m:c;return a.minus(y)}};var Nt=require("@polkadot/util-crypto"),Tt=require("@galacticcouncil/math-liquidity-mining");var tt=class extends Be{constructor(e){super(e)}secondsInYear=new q(365.2425).times(24).times(60).times(60);async getOmnipoolFarms(e){let t=await this.api.query.omnipoolWarehouseLM.activeYieldFarm.entries(e);return await Promise.all(t.map(async([r,i])=>{let[,a]=r.args,m=i.unwrap().toString(),c=a.toString(),y=(await this.api.query.omnipoolWarehouseLM.globalFarm(c)).unwrap(),O=(await this.api.query.omnipoolWarehouseLM.yieldFarm(e,c,m)).unwrap(),B=await this.getOraclePrice(y)??y.priceAdjustment.toString();return{assetId:e,globalFarm:y,yieldFarm:O,priceAdjustment:B}}))}async getIsolatedPoolFarms(e){let t=await this.api.query.xykWarehouseLM.activeYieldFarm.entries(e);return await Promise.all(t.map(async([r,i])=>{let[,a]=r.args,m=i.unwrap().toString(),c=a.toString(),y=(await this.api.query.xykWarehouseLM.globalFarm(c)).unwrap(),O=(await this.api.query.xykWarehouseLM.yieldFarm(e,c,m)).unwrap(),B=await this.getOraclePrice(y)??y.priceAdjustment.toString();return{assetId:e,globalFarm:y,yieldFarm:O,priceAdjustment:B}}))}async getOraclePrice(e){let t=e.rewardCurrency.toString(),s=e.incentivizedAsset.toString(),r=[t,s].sort();if(t===s)return new q(1).shiftedBy(18).toString();let i=await this.api.query.emaOracle.oracles("omnipool",r,"TenMinutes");if(i.isNone)return;let[a]=i.unwrap(),m=a.price.n.toString(),c=a.price.d.toString(),y;return Number(t)<Number(s)?y=(0,Tt.fixed_from_rational)(m,c):y=(0,Tt.fixed_from_rational)(c,m),y}getGlobalRewardPerPeriod(e,t,s,r){let a=e.times(t).shiftedBy(-18).times(r).shiftedBy(-18);return a.gte(s)?s:a}getPoolYieldPerPeriod(e,t,s,r){return e.times(t).div(s.times(r).shiftedBy(-18))}async getFarmApr(e,t){if(t==="isolatedpool"&&!(0,Nt.isAddress)(e))throw new Error("You must pass an address of isolated pool as id");if(t==="omnipool"&&(0,Nt.isAddress)(e))throw new Error("You must pass an asset id of omnipool");let s=6,r=t==="omnipool"?await this.getOmnipoolFarms(e):await this.getIsolatedPoolFarms(e);return r.length?r.map(({yieldFarm:m,globalFarm:c,priceAdjustment:y})=>{let O=new q(c.totalSharesZ.toString()),B=c.plannedYieldingPeriods.toString(),N=new q(c.yieldPerPeriod.toString()),F=new q(c.maxRewardPerPeriod.toString()),_=c.blocksPerPeriod.toString(),C=new q(m.multiplier.toString()).shiftedBy(-18),k=this.secondsInYear.div(new q(s).times(_)),U;if(O.isZero())U=N.times(C).times(k);else{let Se=this.getGlobalRewardPerPeriod(O,N,F,y);U=this.getPoolYieldPerPeriod(Se,C,O,y).times(k)}let w=new q(c.pendingRewards.toString()).plus(c.accumulatedPaidRewards.toString()),Q=F.times(B);return w.div(Q).gte(.99)?E:U.times(100)}).reduce((m,c)=>m.plus(c),E).toString():void 0}};var be=class extends _e{pools=[];subs=[];poolsLoaded=!1;constructor(e){super(e)}async getPools(){return this.poolsLoaded?this.pools:(this.pools=await this.loadPools(),this.subs=await this.subscribe(),this.poolsLoaded=!0,this.pools)}async subscribe(){let e=this.pools.map(async s=>{let r=[await this.subscribePoolChange(s),await this.subscribeTokensPoolBalance(s),await this.subscribeSystemPoolBalance(s)];if(this.hasShareAsset(s)){let i=await this.subscribeSharePoolBalance(s);r.push(i)}return this.subscribeLog(s),r});return(await Promise.all(e)).flat()}subscribeLog(e){let t=e.address.substring(0,10).concat("...");console.log(`${e.type} [${t}] balance subscribed`)}unsubscribe(){this.subs.forEach(e=>{e()})}hasShareAsset(e){return e.type==="Stableswap"&&e.id}subscribeTokensPoolBalance(e){return this.subscribeTokenBalance(e.address,e.tokens.map(t=>t.id),this.updateBalanceCallback(e,(t,s)=>t.id!==s))}subscribeSharePoolBalance(e){return this.subscribeTokenBalance(Xe,[e.id],this.updateBalanceCallback(e,()=>!0))}subscribeSystemPoolBalance(e){return this.subscribeSystemBalance(e.address,this.updateBalanceCallback(e,()=>!0))}updateBalanceCallback(e,t){return function(s,r){let i=e.tokens.findIndex(a=>a.id==s);i>=0&&t(e,s)&&(e.tokens[i].balance=r.toString())}}};var st=class extends be{MAX_FINAL_WEIGHT=K(v(100),6);poolsData=new Map([]);isSupported(){return this.api.query.lbp!==void 0}async loadPools(){let[e,t]=await Promise.all([this.api.query.lbp.poolData.entries(),this.api.query.parachainSystem.validationData()]),{relayParentNumber:s}=t.unwrap(),r=e.filter(([i,a])=>this.isActivePool(a.unwrap(),s)).map(async([{args:[i]},a])=>{let m=a.unwrap(),c=i.toString(),y=await this.getPoolDelta(c,m,s.toString());return this.poolsData.set(i.toString(),m),{address:c,type:"Lbp",fee:m.fee.toJSON(),...y,...this.getPoolLimits()}});return Promise.all(r)}async getPoolFees(e,t){let s=this.pools.find(r=>r.address===t);return{repayFee:this.getRepayFee(),exchangeFee:s.fee}}getPoolType(){return"Lbp"}async subscribePoolChange(e){return this.api.query.parachainSystem.validationData(async t=>{let{relayParentNumber:s}=t.unwrap(),r=this.poolsData.get(e.address);if(this.isActivePool(r,s)){let a=await this.getPoolDelta(e.address,r,s.toString());Object.assign(e,a)}else{let a=this.pools.findIndex(m=>m.address==e.address);this.pools.splice(a,1)}})}async getPoolDelta(e,t,s){let{start:r,end:i,assets:a,initialWeight:m,finalWeight:c,repayTarget:y,feeCollector:O}=t,B=pe.calculateLinearWeights(r.toString(),i.toString(),m.toString(),c.toString(),s),[N,F]=a,_=N.toString(),C=v(B),k=F.toString(),U=this.MAX_FINAL_WEIGHT.minus(v(C)),[w,Q,oe]=await Promise.all([this.isRepayFeeApplied(_,y.toString(),O.toString()),this.getBalance(e,_),this.getBalance(e,k)]);return{repayFeeApply:w,tokens:[{id:_,weight:C,balance:Q.toString()},{id:k,weight:U,balance:oe.toString()}]}}isActivePool(e,t){if(e.start.isEmpty||e.end.isEmpty)return!1;let s=e.start.unwrap().toNumber(),r=e.end.unwrap().toNumber();return t.toNumber()>=s&&t.toNumber()<r}async isRepayFeeApplied(e,t,s){let r=v(t);if(r.isZero())return!1;try{return(await this.getBalance(e,s)).isLessThan(r)}catch{return!0}}getRepayFee(){return this.api.consts.lbp.repayFee.toJSON()}getPoolLimits(){let e=this.api.consts.lbp.maxInRatio.toJSON(),t=this.api.consts.lbp.maxOutRatio.toJSON(),s=this.api.consts.lbp.minTradingLimit.toJSON();return{maxInRatio:e,maxOutRatio:t,minTradingLimit:s}}};var Yt=require("@polkadot/util-crypto"),$t=require("@polkadot/util");function V(l,e){return l.shiftedBy(-1*e).toString()}function ge(l){return l[0]/l[1]*100}function ne(l){return l[0]/l[1]}function de(l){return[l/et,et]}var rt=class extends be{isSupported(){return this.api.query.omnipool!==void 0}async loadPools(){let e=this.api.consts.omnipool.hubAssetId.toString(),t=this.getPoolId(),[s,r,i]=await Promise.all([this.api.query.omnipool.assets.entries(),this.api.query.omnipool.hubAssetTradability(),this.getBalance(t,e)]),a=s.map(async([{args:[c]},y])=>{let{hubReserve:O,shares:B,tradable:N}=y.unwrap(),F=await this.getBalance(t,c.toString());return{id:c.toString(),hubReserves:v(O.toString()),shares:v(B.toString()),tradeable:N.bits.toNumber(),balance:F.toString()}}),m=await Promise.all(a);return m.push({id:e,tradeable:r.bits.toNumber(),balance:i.toString()}),[{address:t,type:"Omnipool",hubAssetId:e,tokens:m,...this.getPoolLimits()}]}async getPoolFees(e,t){let s=await this.api.query.dynamicFees.assetFee(e),r=this.api.consts.dynamicFees.assetFeeParameters,i=this.api.consts.dynamicFees.protocolFeeParameters,a=r.minFee.toNumber()+i.minFee.toNumber(),m=r.maxFee.toNumber()+i.maxFee.toNumber();if(s.isSome){let{assetFee:c,protocolFee:y}=s.unwrap();return{assetFee:de(c.toNumber()),protocolFee:de(y.toNumber()),min:de(a),max:de(m)}}else return{assetFee:this.getAssetFee(),protocolFee:this.getProtocolFee(),min:de(a),max:de(m)}}getPoolType(){return"Omnipool"}async subscribePoolChange(e){let t=e.tokens.map(s=>s.id);return this.api.query.omnipool.assets.multi(t,s=>{e.tokens=s.map((r,i)=>{let a=e.tokens[i];if(r.isNone)return a;let m=r.unwrap();return this.updateTokenState(a,m)})})}updateTokenState(e,t){let{hubReserve:s,shares:r,tradable:i}=t;return{...e,hubReserves:v(s.toString()),shares:v(r.toString()),tradeable:i.bits.toNumber()}}getAssetFee(){let t=this.api.consts.dynamicFees.assetFeeParameters.minFee.toNumber();return de(t)}getProtocolFee(){let t=this.api.consts.dynamicFees.protocolFeeParameters.minFee.toNumber();return de(t)}getPoolId(){return(0,Yt.encodeAddress)((0,$t.stringToU8a)("modlomnipool".padEnd(32,"\0")),Te)}getPoolLimits(){let e=this.api.consts.omnipool.maxInRatio.toJSON(),t=this.api.consts.omnipool.maxOutRatio.toJSON(),s=this.api.consts.omnipool.minimumTradingLimit.toJSON();return{maxInRatio:e,maxOutRatio:t,minTradingLimit:s}}};var it=class extends be{isSupported(){return this.api.query.xyk!==void 0}async loadPools(){let t=(await this.api.query.xyk.poolAssets.entries()).map(async([{args:[s]},r])=>{let i=s.toString(),[a,m]=r.unwrap(),[c,y]=await Promise.all([this.getBalance(i,a.toString()),this.getBalance(i,m.toString())]);return{address:i,type:"Xyk",tokens:[{id:a.toString(),balance:c.toString()},{id:m.toString(),balance:y.toString()}],...this.getPoolLimits()}});return Promise.all(t)}async getPoolFees(e,t){return{exchangeFee:this.getExchangeFee()}}getPoolType(){return"Xyk"}subscribePoolChange(e){return this.api.query.xyk.poolAssets(e.address,t=>{})}getExchangeFee(){return this.api.consts.xyk.getExchangeFee.toJSON()}getPoolLimits(){let e=this.api.consts.xyk.maxInRatio.toJSON(),t=this.api.consts.xyk.maxOutRatio.toJSON(),s=this.api.consts.xyk.minTradingLimit.toJSON();return{maxInRatio:e,maxOutRatio:t,minTradingLimit:s}}};var ot=require("@polkadot/util-crypto");var Z=require("@galacticcouncil/math-stableswap"),se=class{static getPoolAddress(e){return(0,Z.pool_account_name)(e)}static calculateAmplification(e,t,s,r,i){return(0,Z.calculate_amplification)(e,t,s,r,i)}static calculateInGivenOut(e,t,s,r,i,a){return(0,Z.calculate_in_given_out)(e,t,s,r,i,a)}static calculateAddOneAsset(e,t,s,r,i,a){return(0,Z.calculate_add_one_asset)(e,t,s,r,i,a)}static calculateSharesForAmount(e,t,s,r,i,a){return(0,Z.calculate_shares_for_amount)(e,t,s,r,i,a)}static calculateOutGivenIn(e,t,s,r,i,a){return(0,Z.calculate_out_given_in)(e,t,s,r,i,a)}static calculateLiquidityOutOneAsset(e,t,s,r,i,a){return(0,Z.calculate_liquidity_out_one_asset)(e,t,s,r,i,a)}static calculateShares(e,t,s,r,i){return(0,Z.calculate_shares)(e,t,s,r,i)}static calculatePoolTradeFee(e,t,s){return(0,Z.calculate_pool_trade_fee)(e,t,s)}};var nt=class extends be{stablePools=new Map([]);isSupported(){return this.api.query.stableswap!==void 0}async loadPools(){let[e,t]=await Promise.all([this.api.query.stableswap.pools.entries(),this.api.query.system.number()]),s=t.toNumber(),r=e.map(async([{args:[i]},a])=>{let m=a.unwrap(),c=i.toString(),y=this.getPoolAddress(c),[O,B]=await Promise.all([this.getPoolDelta(c,m,s.toString()),this.getPoolTokens(y,c,m)]);return this.stablePools.set(y,m),{address:y,id:c,type:"Stableswap",fee:de(m.fee.toNumber()),tokens:B,...O,...this.getPoolLimits()}});return Promise.all(r)}async getPoolFees(e,t){return{fee:this.pools.find(r=>r.address===t).fee}}getPoolType(){return"Stableswap"}async subscribePoolChange(e){return this.api.query.system.number(async t=>{let s=t.toNumber(),r=this.stablePools.get(e.address),i=await this.getPoolDelta(e.id,r,s.toString());Object.assign(e,i)})}async getPoolDelta(e,t,s){let{initialAmplification:r,finalAmplification:i,initialBlock:a,finalBlock:m}=t,c=se.calculateAmplification(r.toString(),i.toString(),a.toString(),m.toString(),s),y=await this.api.query.tokens.totalIssuance(e);return{amplification:c,totalIssuance:y.toString()}}async getPoolTokens(e,t,s){let{assets:r}=s,i=r.map(async c=>{let[y,O]=await Promise.all([this.api.query.stableswap.assetTradability(t,c.toString()),this.getBalance(e,c.toString())]);return{id:c.toString(),tradeable:y.bits.toNumber(),balance:O.toString()}}),a=await Promise.all(i),m=await this.api.query.omnipool.assets(t);if(m.isSome){let{tradable:c}=m.unwrap(),y=await this.getBalance(Xe,t);a.push({id:t,tradeable:c.bits.toNumber(),balance:y.toString()})}return a}getPoolAddress(e){let t=Number(e),s=se.getPoolAddress(t);return(0,ot.encodeAddress)((0,ot.blake2AsHex)(s),Te)}getPoolLimits(){return{maxInRatio:0,maxOutRatio:0,minTradingLimit:this.api.consts.stableswap.minTradingLimit.toJSON()}}};function at(l){return l.map(({assetIn:e,assetOut:t,pool:s,poolId:r})=>s==="Stableswap"?{pool:{Stableswap:r},assetIn:e,assetOut:t}:{pool:s,assetIn:e,assetOut:t})}var We=class extends Error{constructor(e){super(),this.message=`${e} pool invalid`,this.name="PoolNotFound"}},Ft=class extends Error{constructor(e,t){super(),this.message=`${e} pool missing ${t}`,this.name="PoolConfigNotFound"}},Ee=class extends Error{constructor(e,t){super(),this.message=`Route from ${e} to ${t} not found in pool configuration`,this.name="RouteNotFound"}},_t=class extends Error{constructor(e){super(),this.message=`Asset ${e} not available in current network`,this.name="AssetNotFound"}},Et=class extends Error{constructor(e){super(),this.message=`Storage missing ${e}`,this.name="StorageConfigNotFound"}},Rt=class extends Error{constructor(e){super(),this.message=`Subscription type "${e}" not supported`,this.name="SubscriptionNotSupported"}},kt=class extends Error{constructor(e){super(),this.message=`${e}`,this.name="ProviderConfigNotFound"}};var Re=class{api;assetClient;xykClient;omniClient;lbpClient;stableClient;onChainAssets=[];onChainAssetsLoaded=!1;constructor(e){this.api=e,this.assetClient=new Fe(this.api),this.xykClient=new it(this.api),this.omniClient=new rt(this.api),this.lbpClient=new st(this.api),this.stableClient=new nt(this.api)}get assets(){return this.onChainAssets}get isRegistrySynced(){return this.onChainAssetsLoaded}async syncRegistry(e){this.onChainAssets=await this.assetClient.getOnChainAssets(!1,e),this.onChainAssetsLoaded=!0}async getPools(e){if(this.onChainAssetsLoaded||this.syncRegistry(),e.length==0){let a=(await Promise.all([this.xykClient,this.omniClient,this.lbpClient,this.stableClient].filter(m=>m.isSupported()).map(m=>m.getPools()))).flat();return this.withMetadata(a)}let t=[];e.forEach(i=>{switch(i){case"Xyk":t.push(this.xykClient.getPools());break;case"Omnipool":t.push(this.omniClient.getPools());break;case"Lbp":t.push(this.lbpClient.getPools());break;case"Stableswap":t.push(this.stableClient.getPools());break}});let r=(await Promise.all(t)).flat();return this.withMetadata(r)}unsubscribe(){this.xykClient.unsubscribe(),this.omniClient.unsubscribe(),this.lbpClient.unsubscribe(),this.stableClient.unsubscribe()}async withMetadata(e){let t=new Map(this.onChainAssets.map(s=>[s.id,s]));return e.filter(s=>s.type==="Xyk"?s.tokens.every(r=>t.get(r.id)):!0).map(s=>{let r=s.tokens.map(i=>{let a=t.get(i.id);return{...i,...a}});return{...s,tokens:r}})}async getPoolFees(e,t){switch(t.type){case"Xyk":return this.xykClient.getPoolFees(e,t.address);case"Omnipool":return this.omniClient.getPoolFees(e,t.address);case"Lbp":return this.lbpClient.getPoolFees(e,t.address);case"Stableswap":return this.stableClient.getPoolFees(e,t.address);default:throw new We(t.type)}}isDirectOmnipoolTrade(e){return e.length==1&&e[0].pool=="Omnipool"}buildBuyTx(e,t,s,r,i){let a;this.isDirectOmnipoolTrade(i)?a=this.api.tx.omnipool.buy(t,e,s.toFixed(),r.toFixed()):a=this.api.tx.router.buy(e,t,s.toFixed(),r.toFixed(),at(i));let m=()=>a;return{hex:a.toHex(),name:"RouterBuy",get:m}}buildSellTx(e,t,s,r,i){let a;this.isDirectOmnipoolTrade(i)?a=this.api.tx.omnipool.sell(e,t,s.toFixed(),r.toFixed()):a=this.api.tx.router.sell(e,t,s.toFixed(),r.toFixed(),at(i));let m=()=>a;return{hex:a.toHex(),name:"RouterSell",get:m}}};var Ye=(l,e)=>l===e?0:l==null?e==null?0:-1:e==null?l==null?0:1:typeof l.compare=="function"?l.compare(e):typeof e.compare=="function"?-e.compare(l):l<e?-1:l>e?1:0;var lt=(l,e=t=>t!==void 0?": "+t:"")=>class extends Error{constructor(t){super(l(t)+e(t))}};var Ss=lt(()=>"illegal argument(s)"),jt=l=>{throw new Ss(l)};var ws=lt(()=>"index out of bounds"),Lt=l=>{throw new ws(l)},ut=(l,e,t)=>(l<e||l>=t)&&Lt(l);var Jt=23283064365386963e-26,ct=class{float(e=1){return this.int()*Jt*e}probability(e){return this.float()<e}norm(e=1){return(this.int()*Jt-.5)*2*e}normMinMax(e,t){let s=this.minmax(e,t);return this.float()<.5?s:-s}minmax(e,t){return this.float()*(t-e)+e}minmaxInt(e,t){e|=0;let s=(t|0)-e;return s?e+this.int()%s:e}minmaxUint(e,t){e>>>=0;let s=(t>>>0)-e;return s?e+this.int()%s:e}};var Mt=Math.random,Dt=class extends ct{int(){return Mt()*4294967296>>>0}float(e=1){return Mt()*e}norm(e=1){return(Mt()-.5)*2*e}},Kt=new Dt;var Zt=l=>l!=null&&typeof l!="function"&&l.length!==void 0;var Qt=Object.getPrototypeOf({}),mt="function",Vt="string",ke=(l,e)=>{let t;if(l===e)return!0;if(l!=null){if(typeof l.equiv===mt)return l.equiv(e)}else return l==e;if(e!=null){if(typeof e.equiv===mt)return e.equiv(l)}else return l==e;return typeof l===Vt||typeof e===Vt?!1:(t=Object.getPrototypeOf(l),(t==null||t===Qt)&&(t=Object.getPrototypeOf(e),t==null||t===Qt)?vs(l,e):typeof l!==mt&&l.length!==void 0&&typeof e!==mt&&e.length!==void 0?xs(l,e):l instanceof Set&&e instanceof Set?Os(l,e):l instanceof Map&&e instanceof Map?Bs(l,e):l instanceof Date&&e instanceof Date?l.getTime()===e.getTime():l instanceof RegExp&&e instanceof RegExp?l.toString()===e.toString():l!==l&&e!==e)},xs=(l,e,t=ke)=>{let s=l.length;if(s===e.length)for(;s-- >0&&t(l[s],e[s]););return s<0},Os=(l,e,t=ke)=>l.size===e.size&&t([...l.keys()].sort(),[...e.keys()].sort()),Bs=(l,e,t=ke)=>l.size===e.size&&t([...l].sort(),[...e].sort()),vs=(l,e,t=ke)=>{if(Object.keys(l).length!==Object.keys(e).length)return!1;for(let s in l)if(!e.hasOwnProperty(s)||!t(l[s],e[s]))return!1;return!0};var es=(l,e)=>l!=null&&typeof l[e]=="function";var ts=l=>es(l,"xform")?l.xform():l;var pt=Symbol(),Ct=()=>{};var ss=l=>l!=null&&typeof l[Symbol.iterator]=="function";var gt=class{value;constructor(e){this.value=e}deref(){return this.value}};var ht=l=>l instanceof gt;var rs=l=>l instanceof gt?l.deref():l;function*is(l,e){let t=ts(l)([Ct,Ct,(s,r)=>r])[2];for(let s of e){let r=t(pt,s);if(ht(r)){r=rs(r.deref()),r!==pt&&(yield r);return}r!==pt&&(yield r)}}var ns=(l,e)=>[l[0],l[1],e];function $e(l,e){return ss(e)?is($e(l),e):t=>{let s=t[2];return ns(t,(r,i)=>s(r,l(i)))}}var dt=class l{_head;_length=0;constructor(e){e&&this.into(e)}get length(){return this._length}get head(){return this._head}[Symbol.iterator](){return os("next",this._head)}reverseIterator(){return os("prev",this.tail)}clear(){this.release()}compare(e,t=Ye){let s=this._length;if(s<e._length)return-1;if(s>e._length)return 1;if(s===0)return 0;{let r=this._head,i=e._head,a=0;for(;s-- >0&&a===0;)a=t(r.value,i.value),r=r.next,i=i.next;return a}}concat(...e){let t=this.copy();for(let s of e)t.into(s);return t}equiv(e){if(!(e instanceof l||Zt(e))||this._length!==e.length)return!1;if(!this._length||this===e)return!0;let t=e[Symbol.iterator](),s=this._head;for(let r=this._length;r-- >0;){if(!ke(s.value,t.next().value))return!1;s=s.next}return!0}filter(e){let t=this.empty();return this.traverse(s=>(e(s.value)&&t.append(s.value),!0)),t}find(e){return this.traverse(t=>t.value!==e)}findWith(e){return this.traverse(t=>!e(t.value))}first(){return this._head&&this._head.value}insertSorted(e,t){t=t||Ye;for(let s=this._head,r=this._length;r-- >0;){if(t(e,s.value)<=0)return this.insertBefore(s,e);s=s.next}return this.append(e)}into(e){for(let t of e)this.append(t);return this}nth(e,t){let s=this.nthCell(e);return s?s.value:t}nthCellUnsafe(e){let t,s;for(e<=this._length>>>1?(t=this._head,s="next"):(t=this.tail,s="prev",e=this._length-e-1);e-- >0&&t;)t=t[s];return t}peek(){return this.tail&&this.tail.value}$reduce(e,t){let s=this._head;for(let r=this._length;r-- >0&&!ht(t);)t=e(t,s.value),s=s.next;return t}reduce(e,t){return this.$reduce(e,t)}release(){let e=this._head;if(!e)return!0;let t;for(let s=this._length;s-- >0;)t=e.next,delete e.value,delete e.prev,delete e.next,e=t;return this._head=void 0,this._length=0,!0}reverse(){let e=this._head,t=this.tail,s=(this._length>>>1)+(this._length&1);for(;e&&t&&s>0;){let r=e.value;e.value=t.value,t.value=r,e=e.next,t=t.prev,s--}return this}setHead(e){let t=this._head;return t?(t.value=e,t):this.prepend(e)}setNth(e,t){let s=this.nthCell(e);return!s&&Lt(e),s.value=t,s}setTail(e){let t=this.tail;return t?(t.value=e,t):this.append(e)}swap(e,t){if(e!==t){let s=e.value;e.value=t.value,t.value=s}return this}toArray(e=[]){return this.traverse(t=>(e.push(t.value),!0)),e}toJSON(){return this.toArray()}toString(){let e=[];return this.traverse(t=>(e.push(String(t.value)),!0)),e.join(", ")}traverse(e,t=this._head,s){if(!this._head)return;let r=t;do{if(!e(r))break;r=r.next}while(r!==s);return r}_map(e,t){return this.traverse(s=>(e.append(t(s.value)),!0)),e}};function*os(l,e){for(;e;)yield e.value,e=e[l]}var ft=class l extends dt{_tail;constructor(e){super(),e&&this.into(e)}get tail(){return this._tail}append(e){if(this._tail){let t={value:e,prev:this._tail};return this._tail.next=t,this._tail=t,this._length++,t}else return this.prepend(e)}asHead(e){return e===this._head?this:(this.remove(e),this._head.prev=e,e.next=this._head,e.prev=void 0,this._head=e,this._length++,this)}asTail(e){return e===this._tail?this:(this.remove(e),this._tail.next=e,e.prev=this._tail,e.next=void 0,this._tail=e,this._length++,this)}cons(e){return this.prepend(e),this}copy(){return new l(this)}*cycle(){for(;;)yield*this}drop(){let e=this._head;if(e)return this._head=e.next,this._head?this._head.prev=void 0:this._tail=void 0,this._length--,e.value}empty(){return new l}insertAfter(e,t){let s={value:t,next:e.next,prev:e};return e.next?e.next.prev=s:this._tail=s,e.next=s,this._length++,s}insertAfterNth(e,t){return e<0&&(e+=this._length),e>=this._length-1?this.append(t):(ut(e,0,this._length),this.insertAfter(this.nthCellUnsafe(e),t))}insertBefore(e,t){let s={value:t,next:e,prev:e.prev};return e.prev?e.prev.next=s:this._head=s,e.prev=s,this._length++,s}insertBeforeNth(e,t){return e<0&&(e+=this._length),e<=0?this.prepend(t):(ut(e,0,this._length),this.insertBefore(this.nthCellUnsafe(e),t))}map(e){return this._map(new l,e)}nth(e,t){let s=this.nthCell(e);return s?s.value:t}nthCell(e){if(e<0&&(e+=this._length),!(e<0||e>=this._length))return this.nthCellUnsafe(e)}pop(){let e=this._tail;if(e)return this._tail=e.prev,this._tail?this._tail.next=void 0:this._head=void 0,this._length--,e.value}prepend(e){let t={value:e,next:this._head};return this._head?this._head.prev=t:this._tail=t,this._head=t,this._length++,t}push(e){return this.append(e),this}release(){return this._tail=void 0,super.release()}remove(e){return e.prev?e.prev.next=e.next:this._head=e.next,e.next?e.next.prev=e.prev:this._tail=e.prev,this._length--,this}rotateLeft(){switch(this._length){case 0:case 1:return this;case 2:return this.swap(this._head,this._tail);default:return this.push(this.drop())}}rotateRight(){switch(this._length){case 0:case 1:return this;case 2:return this.swap(this._head,this._tail);default:let e=this.peek();return this.pop(),this.prepend(e),this}}seq(e=0,t=this.length){if(e>=t||e<0)return;let s=this.nthCell(e),r=this.nthCell(t-1),i=a=>({first(){return a.value},next(){return a!==r&&a.next?i(a.next):void 0}});return s?i(s):void 0}shuffle(e,t=Kt){if(this._length<2)return this;for(e=e!==void 0?e:Math.ceil(1.5*Math.log2(this._length));e>0;e--){let s=this._head;for(;s;){let r=s.next;t.probability(.5)?this.asHead(s):this.asTail(s),s=r}}return this}slice(e=0,t=this.length){let s=e<0?e+this._length:e,r=t<0?t+this._length:t;(s<0||r<0)&&jt("invalid indices: ${from} / ${to}");let i=new l,a=this.nthCell(s);for(;a&&++s<=r;)i.push(a.value),a=a.next;return i}sort(e=Ye){if(!this._length)return this;let t=1;for(;;){let s=this._head;this._head=void 0,this._tail=void 0;let r=0;for(;s;){r++;let i=s,a=0;for(let c=0;c<t&&(a++,i=i.next,!!i);c++);let m=t;for(;a>0||m>0&&i;){let c;a===0?(c=i,i=i.next,m--):!i||m===0||e(s.value,i.value)<=0?(c=s,s=s.next,a--):(c=i,i=i.next,m--),this._tail?this._tail.next=c:this._head=c,c.prev=this._tail,this._tail=c}s=i}if(this._tail.next=void 0,r<=1)return this;t*=2}}splice(e,t=0,s){let r;typeof e=="number"?(e<0&&(e+=this._length),ut(e,0,this._length),r=this.nthCellUnsafe(e)):r=e;let i=new l;if(t>0)for(;r&&t-- >0;)this.remove(r),i.push(r.value),r=r.next;else r&&(r=r.next);if(s)if(r)for(let a of s)this.insertBefore(r,a);else for(let a of s)this.push(a);return i}};var Pt=class l{map;items;opts;_size;constructor(e,t){let s=Object.assign({maxlen:1/0,maxsize:1/0,map:()=>new Map,ksize:()=>0,vsize:()=>0},t);this.map=s.map(),this.items=new ft,this._size=0,this.opts=s,e&&this.into(e)}get length(){return this.items.length}get size(){return this._size}[Symbol.iterator](){return this.entries()}entries(){return $e(e=>[e.k,e],this.items)}keys(){return $e(e=>e.k,this.items)}values(){return $e(e=>e.v,this.items)}copy(){let e=this.empty();e.items=this.items.copy();let t=e.items.head;for(;t;)e.map.set(t.value.k,t),t=t.next;return e}empty(){return new l(null,this.opts)}release(){this._size=0,this.map.clear();let e=this.opts.release;if(e){let t;for(;t=this.items.drop();)e(t.k,t.v);return!0}return this.items.release()}has(e){return this.map.has(e)}get(e,t){let s=this.map.get(e);return s?this.resetEntry(s):t}set(e,t){let s=this.opts.ksize(e)+this.opts.vsize(t),r=this.map.get(e);return this._size+=Math.max(0,s-(r?r.value.s:0)),this.ensureSize()&&this.doSetEntry(r,e,t,s),t}into(e){for(let t of e)this.set(t[0],t[1]);return this}getSet(e,t){let s=this.map.get(e);return s?Promise.resolve(this.resetEntry(s)):t().then(r=>this.set(e,r))}delete(e){let t=this.map.get(e);return t?(this.removeEntry(t),!0):!1}resetEntry(e){return this.items.asTail(e),e.value.v}ensureSize(){let e=this.opts.release,t=this.opts.maxsize,s=this.opts.maxlen;for(;this._size>t||this.length>=s;){let r=this.items.drop();if(!r)return!1;this.map.delete(r.k),e&&e(r.k,r.v),this._size-=r.s}return!0}removeEntry(e){let t=e.value;this.map.delete(t.k),this.items.remove(e),this.opts.release&&this.opts.release(t.k,t.v),this._size-=t.s}doSetEntry(e,t,s,r){e?(e.value.v=s,e.value.s=r,this.items.asTail(e)):(this.items.push({k:t,v:s,s:r}),this.map.set(t,this.items.tail))}};var bt=class extends Re{feeCache;disconnectSubscribeNewHeads=null;constructor(e){super(e),this.feeCache=new Pt(null),this.api.rpc.chain.subscribeNewHeads(async t=>{this.feeCache.release()}).then(t=>{this.disconnectSubscribeNewHeads=t})}async getPoolFees(e,t){let s=[t.address,e].join("-");if(this.feeCache.has(s))return this.feeCache.get(s);{let i=await super.getPoolFees(e,t);return this.feeCache.set(s,i),i}}async destroy(){console.log(`Destroying pool cache!
2
+ Items: [${this.feeCache.length}]`),this.feeCache.release(),this.disconnectSubscribeNewHeads?.()}};var Le=class l{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;fee;repayFeeApply;static fromPool(e){return new l(e.address,e.tokens,e.maxInRatio,e.maxOutRatio,e.minTradingLimit,e.fee,e.repayFeeApply)}constructor(e,t,s,r,i,a,m){this.type="Lbp",this.address=e,this.tokens=t,this.maxInRatio=s,this.maxOutRatio=r,this.minTradingLimit=i,this.fee=a,this.repayFeeApply=m}validatePair(e,t){return!0}parsePair(e,t){let s=new Map(this.tokens.map(c=>[c.id,c])),r=s.get(e),i=s.get(t);if(r==null)throw new Error("Pool does not contain tokenIn");if(i==null)throw new Error("Pool does not contain tokenOut");let a=v(r.balance),m=v(i.balance);return{assetIn:e,assetOut:t,balanceIn:a,balanceOut:m,decimalsIn:r.decimals,decimalsOut:i.decimals,weightIn:r.weight,weightOut:i.weight}}validateAndBuy(e,t,s){let r=this.tokens[0].id,i=[];t.isLessThan(this.minTradingLimit)&&i.push("InsufficientTradingAmount");let a=e.balanceOut.div(this.maxOutRatio);if(t.isGreaterThan(a)&&i.push("MaxOutRatioExceeded"),r===e.assetOut){let m=this.calculateTradeFee(t,s),c=ge(this.repayFeeApply?s.repayFee:s.exchangeFee),y=t.plus(m),O=this.calculateInGivenOut(e,y),B=e.balanceIn.div(this.maxInRatio);return O.isGreaterThan(B)&&i.push("MaxInRatioExceeded"),{amountIn:O,calculatedIn:O,amountOut:t,feePct:c,errors:i}}else{let m=this.calculateInGivenOut(e,t),c=e.balanceIn.div(this.maxInRatio);return m.isGreaterThan(c)&&i.push("MaxInRatioExceeded"),{amountIn:m,calculatedIn:m,amountOut:t,feePct:0,errors:i}}}validateAndSell(e,t,s){let r=this.tokens[0].id,i=[];t.isLessThan(this.minTradingLimit)&&i.push("InsufficientTradingAmount");let a=e.balanceIn.div(this.maxInRatio);if(t.isGreaterThan(a)&&i.push("MaxInRatioExceeded"),r===e.assetIn){let m=this.calculateOutGivenIn(e,t),c=e.balanceOut.div(this.maxOutRatio);return m.isGreaterThan(c)&&i.push("MaxOutRatioExceeded"),{amountIn:t,calculatedOut:m,amountOut:m,feePct:0,errors:i}}else{let m=this.calculateOutGivenIn(e,t),c=this.calculateTradeFee(m,s),y=ge(this.repayFeeApply?s.repayFee:s.exchangeFee),O=m.minus(c),B=e.balanceOut.div(this.maxOutRatio);return O.isGreaterThan(B)&&i.push("MaxOutRatioExceeded"),{amountIn:t,calculatedOut:m,amountOut:O,feePct:y,errors:i}}}calculateInGivenOut(e,t){let s=pe.calculateInGivenOut(e.balanceIn.toString(),e.balanceOut.toString(),e.weightIn.toString(),e.weightOut.toString(),t.toFixed(0)),r=v(s);return r.isNegative()?E:r}calculateOutGivenIn(e,t){let s=pe.calculateOutGivenIn(e.balanceIn.toString(),e.balanceOut.toString(),e.weightIn.toString(),e.weightOut.toString(),t.toFixed(0)),r=v(s);return r.isNegative()?E:r}spotPriceInGivenOut(e){let t=pe.getSpotPrice(e.balanceOut.toString(),e.balanceIn.toString(),e.weightOut.toString(),e.weightIn.toString(),K(ae,e.decimalsOut).toString());return v(t)}spotPriceOutGivenIn(e){let t=pe.getSpotPrice(e.balanceIn.toString(),e.balanceOut.toString(),e.weightIn.toString(),e.weightOut.toString(),K(ae,e.decimalsIn).toString());return v(t)}calculateTradeFee(e,t){let s=pe.calculatePoolTradeFee(e.toString(),this.repayFeeApply?t.repayFee[0]:t.exchangeFee[0],this.repayFeeApply?t.repayFee[1]:t.exchangeFee[1]);return v(s)}};var D=require("@galacticcouncil/math-omnipool");var W=class{static calculateSpotPrice(e,t,s,r){return(0,D.calculate_spot_price)(e,t,s,r)}static calculateLrnaSpotPrice(e,t){return(0,D.calculate_lrna_spot_price)(e,t)}static calculateInGivenOut(e,t,s,r,i,a,m,c,y){return(0,D.calculate_in_given_out)(e,t,s,r,i,a,m,c,y)}static calculateLrnaInGivenOut(e,t,s,r,i){return(0,D.calculate_lrna_in_given_out)(e,t,s,r,i)}static calculateOutGivenIn(e,t,s,r,i,a,m,c,y){return(0,D.calculate_out_given_in)(e,t,s,r,i,a,m,c,y)}static calculateOutGivenLrnaIn(e,t,s,r,i){return(0,D.calculate_out_given_lrna_in)(e,t,s,r,i)}static calculatePoolTradeFee(e,t,s){return(0,D.calculate_pool_trade_fee)(e,t,s)}static calculateShares(e,t,s,r){return(0,D.calculate_shares)(e,t,s,r)}static calculateLiquidityOut(e,t,s,r,i,a,m,c){return(0,D.calculate_liquidity_out)(e,t,s,r,i,a,m,c)}static calculateLiquidityLRNAOut(e,t,s,r,i,a,m,c){return(0,D.calculate_liquidity_lrna_out)(e,t,s,r,i,a,m,c)}static calculateCapDifference(e,t,s,r){let i=q(t),a=q(e),m=q(r),y=q(s).shiftedBy(-18);if(i.div(m).lt(y)){let B=y.times(m).minus(i).times(a),N=i.times(q(1).minus(y));return B.div(N).toFixed(0)}else return"0"}static verifyAssetCap(e,t,s,r){return(0,D.verify_asset_cap)(e,t,s,r)}static calculateLimitHubIn(e,t,s,r){return(0,D.calculate_liquidity_hub_in)(e,t,s,r)}static isSellAllowed(e){return(0,D.is_sell_allowed)(e)}static isBuyAllowed(e){return(0,D.is_buy_allowed)(e)}static isAddLiquidityAllowed(e){return(0,D.is_add_liquidity_allowed)(e)}static isRemoveLiquidityAllowed(e){return(0,D.is_remove_liquidity_allowed)(e)}};var Me=class l{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;hubAssetId;static fromPool(e){return new l(e.address,e.tokens,e.maxInRatio,e.maxOutRatio,e.minTradingLimit,e.hubAssetId)}constructor(e,t,s,r,i,a){this.type="Omnipool",this.address=e,this.tokens=t,this.maxInRatio=s,this.maxOutRatio=r,this.minTradingLimit=i,this.hubAssetId=a}validatePair(e,t){return this.hubAssetId!=t}parsePair(e,t){let s=new Map(this.tokens.map(O=>[O.id,O])),r=s.get(e),i=s.get(t);if(r==null)throw new Error("Pool does not contain tokenIn");if(i==null)throw new Error("Pool does not contain tokenOut");let a=v(r.balance),m=v(i.balance),c=v(r.existentialDeposit),y=v(i.existentialDeposit);return{assetIn:e,assetOut:t,hubReservesIn:r.hubReserves,hubReservesOut:i.hubReserves,sharesIn:r.shares,sharesOut:i.shares,decimalsIn:r.decimals,decimalsOut:i.decimals,balanceIn:a,balanceOut:m,tradeableIn:r.tradeable,tradeableOut:i.tradeable,assetInED:c,assetOutED:y}}validateAndBuy(e,t,s){let r=this.calculateInGivenOut(e,t),i=this.calculateInGivenOut(e,t,s),a=i.minus(r),m=r===E?E:a.div(r).multipliedBy(100).decimalPlaces(2),c=[],y=W.isSellAllowed(e.tradeableIn),O=W.isBuyAllowed(e.tradeableOut);(!y||!O)&&c.push("TradeNotAllowed"),(t.isLessThan(this.minTradingLimit)||r.isLessThan(e.assetInED))&&c.push("InsufficientTradingAmount");let B=e.balanceOut.div(this.maxOutRatio);t.isGreaterThan(B)&&c.push("MaxOutRatioExceeded");let N=e.balanceIn.div(this.maxInRatio);return i.isGreaterThan(N)&&c.push("MaxInRatioExceeded"),{amountIn:i,calculatedIn:r,amountOut:t,feePct:m.toNumber(),errors:c}}validateAndSell(e,t,s){let r=this.calculateOutGivenIn(e,t),i=this.calculateOutGivenIn(e,t,s),m=r.minus(i).div(r).multipliedBy(100).decimalPlaces(2),c=[],y=W.isSellAllowed(e.tradeableIn),O=W.isBuyAllowed(e.tradeableOut);(!y||!O)&&c.push("TradeNotAllowed"),(t.isLessThan(this.minTradingLimit)||r.isLessThan(e.assetOutED))&&c.push("InsufficientTradingAmount");let B=e.balanceIn.div(this.maxInRatio);t.isGreaterThan(B)&&c.push("MaxInRatioExceeded");let N=e.balanceOut.div(this.maxOutRatio);return i.isGreaterThan(N)&&c.push("MaxOutRatioExceeded"),{amountIn:t,calculatedOut:r,amountOut:i,feePct:m.toNumber(),errors:c}}calculateInGivenOut(e,t,s){if(e.assetIn==this.hubAssetId)return this.calculateLrnaInGivenOut(e,t,s);let r=W.calculateInGivenOut(e.balanceIn.toString(),e.hubReservesIn.toString(),e.sharesIn.toString(),e.balanceOut.toString(),e.hubReservesOut.toString(),e.sharesOut.toString(),t.toFixed(0),s?ne(s.assetFee).toString():E.toString(),s?ne(s.protocolFee).toString():E.toString()),i=v(r);return i.isNegative()?E:i}calculateLrnaInGivenOut(e,t,s){let r=W.calculateLrnaInGivenOut(e.balanceOut.toString(),e.hubReservesOut.toString(),e.sharesOut.toString(),t.toFixed(0),s?ne(s.assetFee).toString():E.toString()),i=v(r);return i.isNegative()?E:i}calculateOutGivenIn(e,t,s){if(e.assetIn==this.hubAssetId)return this.calculateOutGivenLrnaIn(e,t,s);let r=W.calculateOutGivenIn(e.balanceIn.toString(),e.hubReservesIn.toString(),e.sharesIn.toString(),e.balanceOut.toString(),e.hubReservesOut.toString(),e.sharesOut.toString(),t.toFixed(0),s?ne(s.assetFee).toString():E.toString(),s?ne(s.protocolFee).toString():E.toString()),i=v(r);return i.isNegative()?E:i}calculateOutGivenLrnaIn(e,t,s){let r=W.calculateOutGivenLrnaIn(e.balanceOut.toString(),e.hubReservesOut.toString(),e.sharesOut.toString(),t.toFixed(0),s?ne(s.assetFee).toString():E.toString()),i=v(r);return i.isNegative()?E:i}spotPriceInGivenOut(e){if(e.assetIn==this.hubAssetId)return this.spotPriceLrnaInGivenOut(e);let t=W.calculateSpotPrice(e.balanceOut.toString(),e.hubReservesOut.toString(),e.balanceIn.toString(),e.hubReservesIn.toString());return v(t).shiftedBy(-1*(Ne-e.decimalsOut)).decimalPlaces(0,1)}spotPriceLrnaInGivenOut(e){let t=W.calculateLrnaSpotPrice(e.hubReservesOut.toString(),e.balanceOut.toString());return v(t).shiftedBy(-1*(Ne-e.decimalsOut)).decimalPlaces(0,1)}spotPriceOutGivenIn(e){if(e.assetIn==this.hubAssetId)return this.spotPriceOutGivenLrnaIn(e);let t=W.calculateSpotPrice(e.balanceIn.toString(),e.hubReservesIn.toString(),e.balanceOut.toString(),e.hubReservesOut.toString());return v(t).shiftedBy(-1*(Ne-e.decimalsIn)).decimalPlaces(0,1)}spotPriceOutGivenLrnaIn(e){let t=W.calculateLrnaSpotPrice(e.balanceOut.toString(),e.hubReservesOut.toString());return v(t).shiftedBy(-1*(Ne-e.decimalsIn)).decimalPlaces(0,1)}};var De=class l{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;amplification;id;fee;totalIssuance;static fromPool(e){return new l(e.address,e.tokens,e.maxInRatio,e.maxOutRatio,e.minTradingLimit,e.amplification,e.id,e.fee,e.totalIssuance)}constructor(e,t,s,r,i,a,m,c,y){this.type="Stableswap",this.address=e,this.tokens=t,this.maxInRatio=s,this.maxOutRatio=r,this.minTradingLimit=i,this.amplification=a,this.id=m,this.fee=c,this.totalIssuance=y}validatePair(e,t){return!0}parsePair(e,t){let s=new Map(this.tokens.map(O=>[O.id,O])),r=s.get(e),i=s.get(t);if(r==null)throw new Error("Pool does not contain tokenIn");if(i==null)throw new Error("Pool does not contain tokenOut");let a=v(r.balance),m=v(i.balance),c=v(r.existentialDeposit),y=v(i.existentialDeposit);return{assetIn:e,assetOut:t,balanceIn:a,balanceOut:m,decimalsIn:r.decimals,decimalsOut:i.decimals,tradeableIn:this.id===e?Ve:r.tradeable,tradeableOut:this.id===t?Ve:i.tradeable,assetInED:c,assetOutED:y}}validateAndBuy(e,t,s){let r=this.calculateInGivenOut(e,t),i=this.calculateInGivenOut(e,t,s),a=ge(s.fee),m=[],c=W.isSellAllowed(e.tradeableIn),y=W.isBuyAllowed(e.tradeableOut);return(!c||!y)&&m.push("TradeNotAllowed"),(t.isLessThan(this.minTradingLimit)||r.isLessThan(e.assetInED))&&m.push("InsufficientTradingAmount"),{amountIn:i,calculatedIn:r,amountOut:t,feePct:a,errors:m}}validateAndSell(e,t,s){let r=this.calculateOutGivenIn(e,t),i=this.calculateOutGivenIn(e,t,s),a=ge(s.fee),m=[],c=W.isSellAllowed(e.tradeableIn),y=W.isBuyAllowed(e.tradeableOut);return(!c||!y)&&m.push("TradeNotAllowed"),(t.isLessThan(this.minTradingLimit)||r.isLessThan(e.assetOutED))&&m.push("InsufficientTradingAmount"),{amountIn:t,calculatedOut:r,amountOut:i,feePct:a,errors:m}}calculateIn(e,t,s){let r=se.calculateInGivenOut(this.getReserves(),Number(e.assetIn),Number(e.assetOut),t.toFixed(0),this.amplification,s?ne(s.fee).toString():E.toString()),i=v(r);return i.isNegative()?E:i}calculateAddOneAsset(e,t,s){let r=se.calculateAddOneAsset(this.getReserves(),t.toFixed(0),Number(e.assetIn),this.amplification,this.totalIssuance,s?ne(s.fee).toString():E.toString()),i=v(r);return i.isNegative()?E:i}calculateSharesForAmount(e,t,s){let r=se.calculateSharesForAmount(this.getReserves(),Number(e.assetOut),t.toFixed(0),this.amplification,this.totalIssuance,s?ne(s.fee).toString():E.toString()),i=v(r);return i.isNegative()?E:i}calculateInGivenOut(e,t,s){return e.assetOut==this.id?this.calculateAddOneAsset(e,t,s):e.assetIn==this.id?this.calculateSharesForAmount(e,t,s):this.calculateIn(e,t,s)}spotPriceInGivenOut(e){let t=K(ae,e.decimalsOut);return e.assetOut==this.id?this.calculateAddOneAsset(e,t):e.assetIn==this.id?this.calculateSharesForAmount(e,t):this.calculateIn(e,t)}calculateOut(e,t,s){let r=se.calculateOutGivenIn(this.getReserves(),Number(e.assetIn),Number(e.assetOut),t.toFixed(0),this.amplification,s?ne(s.fee).toString():E.toString()),i=v(r);return i.isNegative()?E:i}calculateWithdrawOneAsset(e,t,s){let r=se.calculateLiquidityOutOneAsset(this.getReserves(),t.toFixed(0),Number(e.assetOut),this.amplification,this.totalIssuance,s?ne(s.fee).toString():E.toString()),i=v(r);return i.isNegative()?E:i}calculateShares(e,t,s){let r=se.calculateShares(this.getReserves(),this.getAssets(e.assetIn,t),this.amplification,this.totalIssuance,s?ne(s.fee).toString():E.toString()),i=v(r);return i.isNegative()?E:i}calculateOutGivenIn(e,t,s){return e.assetIn==this.id?this.calculateWithdrawOneAsset(e,t,s):e.assetOut==this.id?this.calculateShares(e,t,s):this.calculateOut(e,t,s)}spotPriceOutGivenIn(e){let t=K(ae,e.decimalsIn);return e.assetIn==this.id?this.calculateWithdrawOneAsset(e,t):e.assetOut==this.id?this.calculateShares(e,t):this.calculateOut(e,t)}calculateTradeFee(e,t){let s=se.calculatePoolTradeFee(e.toString(),t.fee[0],t.fee[1]);return v(s)}getReserves(){let e=this.tokens.filter(t=>t.id!=this.id).map(({id:t,balance:s,decimals:r})=>({asset_id:Number(t),amount:s,decimals:r}));return JSON.stringify(e)}getAssets(e,t){let s={asset_id:Number(e),amount:t.toFixed(0)};return JSON.stringify([s])}};var $=require("@galacticcouncil/math-xyk"),ye=class{static getSpotPrice(e,t,s){return(0,$.get_spot_price)(e,t,s)}static calculateInGivenOut(e,t,s){return(0,$.calculate_in_given_out)(e,t,s)}static calculateOutGivenIn(e,t,s){return(0,$.calculate_out_given_in)(e,t,s)}static calculatePoolTradeFee(e,t,s){return(0,$.calculate_pool_trade_fee)(e,t,s)}static calculateLiquidityIn(e,t,s){return(0,$.calculate_liquidity_in)(e,t,s)}static calculateSpotPrice(e,t){return(0,$.calculate_spot_price)(e,t)}static calculateSpotPriceWithFee(e,t,s,r){return(0,$.calculate_spot_price_with_fee)(e,t,s,r)}static calculateShares(e,t,s){return(0,$.calculate_shares)(e,t,s)}static calculateLiquidityOutAssetA(e,t,s,r){return(0,$.calculate_liquidity_out_asset_a)(e,t,s,r)}static calculateLiquidityOutAssetB(e,t,s,r){return(0,$.calculate_liquidity_out_asset_b)(e,t,s,r)}};var Ce=class l{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;static fromPool(e){return new l(e.address,e.tokens,e.maxInRatio,e.maxOutRatio,e.minTradingLimit)}constructor(e,t,s,r,i){this.type="Xyk",this.address=e,this.tokens=t,this.maxInRatio=s,this.maxOutRatio=r,this.minTradingLimit=i}validatePair(e,t){return!0}parsePair(e,t){let s=new Map(this.tokens.map(O=>[O.id,O])),r=s.get(e),i=s.get(t);if(r==null)throw new Error("Pool does not contain tokenIn");if(i==null)throw new Error("Pool does not contain tokenOut");let a=v(r.balance),m=v(i.balance),c=v(r.existentialDeposit),y=v(i.existentialDeposit);return{assetIn:e,assetOut:t,decimalsIn:r.decimals,decimalsOut:i.decimals,balanceIn:a,balanceOut:m,assetInED:c,assetOutED:y}}validateAndBuy(e,t,s){let r=this.calculateInGivenOut(e,t),i=this.calculateTradeFee(r,s),a=ge(s.exchangeFee),m=r.plus(i),c=[];(t.isLessThan(this.minTradingLimit)||r.isLessThan(e.assetInED))&&c.push("InsufficientTradingAmount");let y=e.balanceOut.div(this.maxOutRatio);t.isGreaterThan(y)&&c.push("MaxOutRatioExceeded");let O=e.balanceIn.div(this.maxInRatio);return m.isGreaterThan(O)&&c.push("MaxInRatioExceeded"),{amountIn:m,calculatedIn:r,amountOut:t,feePct:a,errors:c}}validateAndSell(e,t,s){let r=this.calculateOutGivenIn(e,t),i=this.calculateTradeFee(r,s),a=ge(s.exchangeFee),m=r.minus(i),c=[];(t.isLessThan(this.minTradingLimit)||r.isLessThan(e.assetOutED))&&c.push("InsufficientTradingAmount");let y=e.balanceIn.div(this.maxInRatio);t.isGreaterThan(y)&&c.push("MaxInRatioExceeded");let O=e.balanceOut.div(this.maxOutRatio);return m.isGreaterThan(O)&&c.push("MaxOutRatioExceeded"),{amountIn:t,calculatedOut:r,amountOut:m,feePct:a,errors:c}}calculateInGivenOut(e,t){let s=ye.calculateInGivenOut(e.balanceIn.toString(),e.balanceOut.toString(),t.toFixed(0)),r=v(s);return r.isNegative()?E:r}calculateOutGivenIn(e,t){let s=ye.calculateOutGivenIn(e.balanceIn.toString(),e.balanceOut.toString(),t.toFixed(0)),r=v(s);return r.isNegative()?E:r}spotPriceInGivenOut(e){let t=ye.calculateSpotPrice(e.balanceOut.toString(),e.balanceIn.toString()),s=K(ae,18-e.decimalsOut);return v(t).div(s)}spotPriceOutGivenIn(e){let t=ye.calculateSpotPrice(e.balanceIn.toString(),e.balanceOut.toString()),s=K(ae,18-e.decimalsIn);return v(t).div(s)}calculateTradeFee(e,t){let s=ye.calculatePoolTradeFee(e.toString(),t.exchangeFee[0],t.exchangeFee[1]);return v(s)}};var Ge=class{static get(e){switch(e.type){case"Xyk":return Ce.fromPool(e);case"Omnipool":return Me.fromPool(e);case"Lbp":return Le.fromPool(e);case"Stableswap":return De.fromPool(e);default:throw new Error("Pool type "+e.type+" is not supported yet")}}};var Ie=class{routeSuggester;routerOptions;poolService;defaultRouterOptions={includeOnly:[]};constructor(e,t){this.poolService=e,this.routeSuggester=new ze,this.routerOptions={...this.defaultRouterOptions,...t}}async getPools(){let e=this.routerOptions.includeOnly;return await this.poolService.getPools(e)}async getAllAssets(){let e=await this.getPools();if(e.length===0)throw new Error("No pools configured");let t=await this.getAssets(e);return[...new Map(t).values()]}async getAssetPairs(e){let t=await this.getPools();if(t.length===0)throw new Error("No pools configured");let{assets:s,poolsMap:r}=await this.validateToken(e,t),a=this.getPaths(e,null,r,t).map(m=>m[m.length-1].assetOut);return this.toAssets([...new Set(a)],s)}async getAllPaths(e,t){let s=await this.getPools();if(s.length===0)throw new Error("No pools configured");let{poolsMap:r}=await this.validateTokenPair(e,t,s);return this.getPaths(e,t,r,s)}async getAssets(e){let t=e.map(s=>s.tokens.map(r=>({id:r.id,name:r.name,symbol:r.symbol,decimals:r.decimals,icon:r.icon,type:r.type,isSufficient:r.isSufficient,existentialDeposit:r.existentialDeposit,origin:r.origin,meta:r.meta,externalId:r.externalId,isWhiteListed:r.isWhiteListed}))).flat();return new Map(t.map(s=>[s.id,s]))}getPaths(e,t,s,r){return this.routeSuggester.getProposals(e,t,r).filter(m=>this.validPath(m,s)).map(m=>this.toHops(m,s))}async validateTokenPair(e,t,s){let r=await this.getAssets(s);if(r.get(e)==null)throw new Error(e+" is not supported token");if(r.get(t)==null)throw new Error(t+" is not supported token");let i=this.getPoolMap(s);return{assets:r,poolsMap:i}}async validateToken(e,t){let s=await this.getAssets(t);if(s.get(e)==null)throw new Error(e+" is not supported token");let r=this.getPoolMap(t);return{assets:s,poolsMap:r}}getPoolMap(e){return new Map(e.map(t=>[t.address,Ge.get(t)]))}validPath(e,t){return e.length>0&&e.map(s=>this.validEdge(s,t)).reduce((s,r)=>s&&r)}validEdge([e,t,s],r){return r.get(e)?.validatePair(t,s)||!1}toHops(e,t){return e.map(([s,r,i])=>{let a=t.get(s);return{poolAddress:s,poolId:a?.id,pool:a?.type,assetIn:r,assetOut:i}})}toAssets(e,t){return e.map(s=>t.get(s))}};function Is(l,e){return l.minus(e).abs().div(l.plus(e).div(2)).multipliedBy(100).decimalPlaces(2)}function qe(l,e){return l.minus(e).div(e).multipliedBy(100).decimalPlaces(2)}function Gt(l,e){return ae.minus(e.div(l)).multipliedBy(100).decimalPlaces(2)}function qt(l,e){return e.div(l).minus(ae).multipliedBy(100).decimalPlaces(2)}var je=class extends Ie{isDirectTrade(e){return e.length==1}findBestSellRoute(e){let t=e.sort((s,r)=>{let i=s[s.length-1].amountOut,a=r[r.length-1].amountOut;return i.isGreaterThan(a)?-1:1});return t.find(s=>s.every(r=>r.errors.length==0))||t[0]}getRouteFeeRange(e){if(e.filter(s=>s.tradeFeeRange).length>0){let s=e.map(i=>i.tradeFeeRange?.[0]??i.tradeFeePct).reduce((i,a)=>i+a),r=e.map(i=>i.tradeFeeRange?.[1]??i.tradeFeePct).reduce((i,a)=>i+a);return[s,r]}}getPoolFeeRange(e){let t=e.min?ge(e.min):void 0,s=e.max?ge(e.max):void 0;if(t&&s)return[t,s]}async getBestSell(e,t,s){return this.getSell(e,t,s)}async getSell(e,t,s,r){let i=await super.getPools();if(i.length===0)throw new Error("No pools configured");let{poolsMap:a}=await super.validateTokenPair(e,t,i),m=super.getPaths(e,t,a,i);if(m.length===0)throw new Ee(e,t);let c;if(r)c=await this.toSellSwaps(s,r,a);else{let R=m.map(async n=>await this.toSellSwaps(s,n,a)),Y=await Promise.all(R);c=this.findBestSellRoute(Y)}let y=c[0],O=c[c.length-1],B=this.isDirectTrade(c),N=c.map(R=>R.spotPrice.shiftedBy(-1*R.assetOutDecimals)).reduce((R,Y)=>R.multipliedBy(Y)),F=K(N,O.assetOutDecimals),_=B?O.calculatedOut:this.calculateDelta0Y(y.amountIn,c,a),C=O.amountOut,k=B?O.tradeFeePct:Gt(_,C).toNumber(),U=_.minus(C),w=this.getRouteFeeRange(c),Q=y.amountIn.shiftedBy(-1*y.assetInDecimals).multipliedBy(F),oe=qe(_,Q),Se=R=>this.poolService.buildSellTx(e,t,y.amountIn,R,c.map(Y=>Y));return{type:"Sell",amountIn:y.amountIn,amountOut:O.amountOut,spotPrice:F,tradeFee:U,tradeFeePct:k,tradeFeeRange:w,priceImpactPct:oe.toNumber(),swaps:c,toTx:Se,toHuman(){return{type:"Sell",amountIn:V(y.amountIn,y.assetInDecimals),amountOut:V(O.amountOut,O.assetOutDecimals),spotPrice:V(F,O.assetOutDecimals),tradeFee:V(U,O.assetOutDecimals),tradeFeePct:k,tradeFeeRange:w,priceImpactPct:oe.toNumber(),swaps:c.map(R=>R.toHuman())}}}}calculateDelta0Y(e,t,s){let r=[];for(let i=0;i<t.length;i++){let a=t[i],m=s.get(a.poolAddress);if(m==null)throw new Error("Pool does not exit");let c=m.parsePair(a.assetIn,a.assetOut),y;i>0?y=r[i-1]:y=e;let O=m.calculateOutGivenIn(c,y);r.push(O)}return r[r.length-1]}async toSellSwaps(e,t,s){let r=[];for(let i=0;i<t.length;i++){let a=t[i],m=s.get(a.poolAddress);if(m==null)throw new Error("Pool does not exit");let c=m.parsePair(a.assetIn,a.assetOut),y;i>0?y=r[i-1].amountOut:y=K(v(e),c.decimalsIn).decimalPlaces(0,1);let O=await this.poolService.getPoolFees(c.assetOut,m),{amountOut:B,calculatedOut:N,feePct:F,errors:_}=m.validateAndSell(c,y,O),C=this.getPoolFeeRange(O),k=m.spotPriceOutGivenIn(c),U=y.shiftedBy(-1*c.decimalsIn).multipliedBy(k),w=qe(N,U);r.push({...a,assetInDecimals:c.decimalsIn,assetOutDecimals:c.decimalsOut,amountIn:y,calculatedOut:N,amountOut:B,spotPrice:k,tradeFeePct:F,tradeFeeRange:C,priceImpactPct:w.toNumber(),errors:_,toHuman(){return{...a,amountIn:V(y,c.decimalsIn),calculatedOut:V(N,c.decimalsOut),amountOut:V(B,c.decimalsOut),spotPrice:V(k,c.decimalsOut),tradeFeePct:F,tradeFeeRange:C,priceImpactPct:w.toNumber(),errors:_}}})}return r}async getBestSpotPrice(e,t){let s=await super.getPools();if(s.length===0)throw new Error("No pools configured");let{poolsMap:r}=await super.validateTokenPair(e,t,s),i=super.getPaths(e,t,r,s);if(i.length===0)return Promise.resolve(void 0);let a=s.map(w=>w.tokens.find(Q=>Q.id===e)).filter(w=>!!w).sort((w,Q)=>Number(Q.balance)-Number(w.balance)),{balance:m,decimals:c}=a[0],O=v(m).shiftedBy(-1*c).div(100).multipliedBy(.1),B=i.map(async w=>await this.toSellSwaps(O,w,r)),N=await Promise.all(B),F=this.findBestSellRoute(N),_=await this.toSellSwaps("1",F,r),C=_.map(w=>w.spotPrice.shiftedBy(-1*w.assetOutDecimals)).reduce((w,Q)=>w.multipliedBy(Q)),k=_[_.length-1].assetOutDecimals;return{amount:K(C,k),decimals:k}}findBestBuyRoute(e){let t=e.sort((s,r)=>{let i=s[0].amountIn,a=r[0].amountIn;return i.isGreaterThan(a)?1:-1});return t.find(s=>s.every(r=>r.errors.length==0))||t[0]}async getBestBuy(e,t,s){return this.getBuy(e,t,s)}async getBuy(e,t,s,r){let i=await super.getPools();if(i.length===0)throw new Error("No pools configured");let{poolsMap:a}=await super.validateTokenPair(e,t,i),m=super.getPaths(e,t,a,i);if(m.length===0)throw new Ee(e,t);let c;if(r)c=await this.toBuySwaps(s,r,a);else{let R=m.map(async n=>await this.toBuySwaps(s,n,a)),Y=await Promise.all(R);c=this.findBestBuyRoute(Y)}let y=c[c.length-1],O=c[0],B=this.isDirectTrade(c),N=c.map(R=>R.spotPrice.shiftedBy(-1*R.assetInDecimals)).reduce((R,Y)=>R.multipliedBy(Y)),F=K(N,O.assetInDecimals),_=B?O.calculatedIn:this.calculateDelta0X(y.amountOut,c,a),C=O.amountIn,k=B?O.tradeFeePct:qt(_,C).toNumber(),U=C.minus(_),w=this.getRouteFeeRange(c),Q=y.amountOut.shiftedBy(-1*y.assetOutDecimals).multipliedBy(F),oe;_.isZero()?oe=-100:oe=qe(Q,_).toNumber();let Se=R=>this.poolService.buildBuyTx(e,t,y.amountOut,R,c.map(Y=>Y));return{type:"Buy",amountOut:y.amountOut,amountIn:O.amountIn,spotPrice:F,tradeFee:U,tradeFeePct:k,tradeFeeRange:w,priceImpactPct:oe,swaps:c,toTx:Se,toHuman(){return{type:"Buy",amountOut:V(y.amountOut,y.assetOutDecimals),amountIn:V(O.amountIn,O.assetInDecimals),spotPrice:V(F,O.assetInDecimals),tradeFee:V(U,O.assetInDecimals),tradeFeePct:k,tradeFeeRange:w,priceImpactPct:oe,swaps:c.map(R=>R.toHuman())}}}}calculateDelta0X(e,t,s){let r=[];for(let i=t.length-1;i>=0;i--){let a=t[i],m=s.get(a.poolAddress);if(m==null)throw new Error("Pool does not exit");let c=m.parsePair(a.assetIn,a.assetOut),y;i==t.length-1?y=e:y=r[0];let O=m.calculateInGivenOut(c,y);r.unshift(O)}return r[0]}async toBuySwaps(e,t,s){let r=[];for(let i=t.length-1;i>=0;i--){let a=t[i],m=s.get(a.poolAddress);if(m==null)throw new Error("Pool does not exit");let c=m.parsePair(a.assetIn,a.assetOut),y;i==t.length-1?y=K(v(e),c.decimalsOut).decimalPlaces(0,1):y=r[0].amountIn;let O=await this.poolService.getPoolFees(c.assetOut,m),{amountIn:B,calculatedIn:N,feePct:F,errors:_}=m.validateAndBuy(c,y,O),C=this.getPoolFeeRange(O),k=m.spotPriceInGivenOut(c),U=y.shiftedBy(-1*c.decimalsOut).multipliedBy(k),w;N.isZero()?w=-100:w=qe(U,N).toNumber(),r.unshift({...a,assetInDecimals:c.decimalsIn,assetOutDecimals:c.decimalsOut,amountOut:y,calculatedIn:N,amountIn:B,spotPrice:k,tradeFeePct:F,tradeFeeRange:C,priceImpactPct:w,errors:_,toHuman(){return{...a,amountOut:V(y,c.decimalsOut),calculatedIn:V(N,c.decimalsIn),amountIn:V(B,c.decimalsIn),spotPrice:V(k,c.decimalsIn),tradeFeePct:F,tradeFeeRange:C,priceImpactPct:w,errors:_}}})}return r}};0&&(module.exports={AssetClient,AssetNotFound,BASILISK_PARACHAIN_ID,BalanceClient,BigNumber,CachingPoolService,DECIMAL_PLACES,DENOMINATOR,FarmClient,HYDRADX_OMNIPOOL_ADDRESS,HYDRADX_PARACHAIN_ID,HYDRADX_SS58_PREFIX,INFINITY,LbpMath,LbpPool,ONE,OmniMath,OmniPool,PoolConfigNotFound,PoolError,PoolFactory,PoolNotFound,PoolService,PoolType,ProviderConfigNotFound,RUNTIME_DECIMALS,RouteNotFound,Router,SYSTEM_ASSET_DECIMALS,SYSTEM_ASSET_ID,StableMath,StableSwap,StorageConfigNotFound,SubscriptionNotSupported,TRADEABLE_DEFAULT,TradeRouter,TradeType,XykMath,XykPool,ZERO,bnum,buildRoute,calculateBuyFee,calculateDiffToAvg,calculateDiffToRef,calculateSellFee,findNestedKey,findNestedObj,scale});
package/build/index.mjs CHANGED
@@ -1,2 +1,2 @@
1
- var Ye=class{constructor(e=1/0){this.capacity=e}storage=[];enqueue(e){if(this.size()===this.capacity)throw Error("Queue has reached max capacity, you cannot add more items");this.storage.push(e)}dequeue(){return this.storage.shift()}size(){return this.storage.length}};var Kt=5,Ee=class{isNotVisited(e,t){let s=!0;return t.forEach(r=>{(r[0]===e[0]||r[1]===e[1])&&(s=!1)}),s}findPaths(e,t,s){let r=[],i=new Ye,a=[];for(a.push([t,""]),i.enqueue(a);i.size()>0;){let c=i.dequeue();if(c==null||c.length>Kt)return r;let u=c[c.length-1];(s===null||u[0]===s)&&r.push(c),e.get(u[0])?.forEach(O=>{if(this.isNotVisited(O,c)){let B=[...c];B.push(O),i.enqueue(B)}})}return r}buildAndPopulateGraph(e,t){let s=new Map;for(let r of e)s.set(parseInt(r),[]);for(let[r,i,a]of t){let c=parseInt(i),u=parseInt(a);s.get(c)?.push([u,r])}return s}};function mt(m){let e={};for(let t of m){let s=t.tokens.length;for(let r=0;r<s;r++){e[t.tokens[r].id]||(e[t.tokens[r].id]=[]);for(let i=0;i<s;i++){if(r==i)continue;let a=[t.address,t.tokens[r].id,t.tokens[i].id];e[t.tokens[r].id].push(a)}}}return e}var Re=class{getProposals(e,t,s){let r=mt(s),i=Object.keys(r),a=i.map(O=>r[O]).flat(),c=new Ee,u=c.buildAndPopulateGraph(i,a),y=c.findPaths(u,parseInt(e),t?parseInt(t):null);return this.parsePaths(y)}parsePaths(e){let t=[];for(let s of e){let r=[];for(let i=0;i<s.length;i++){let a=s[i],c=s[i+1];if(c==null)break;r.push(this.toEdge(a,c))}t.push(r)}return t}toEdge(e,t){return[t[1],e[0].toString(),t[0].toString()]}};var Zt=/^-?(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?$/i,pt=Math.ceil,oe=Math.floor,V="[BigNumber Error] ",Bt=V+"Number primitive has more than 15 significant digits: ",ce=1e14,T=14,gt=9007199254740991,ht=[1,10,100,1e3,1e4,1e5,1e6,1e7,1e8,1e9,1e10,1e11,1e12,1e13],ye=1e7,$=1e9;function vt(m){var e,t,s,r=w.prototype={constructor:w,toString:null,valueOf:null},i=new w(1),a=20,c=4,u=-7,y=21,O=-1e7,B=1e7,N=!1,F=1,_=0,D={prefix:"",groupSize:3,secondaryGroupSize:0,groupSeparator:",",decimalSeparator:".",fractionGroupSize:0,fractionGroupSeparator:"\xA0",suffix:""},k="0123456789abcdefghijklmnopqrstuvwxyz",H=!0;function w(n,o){var l,P,g,d,S,p,h,b,f=this;if(!(f instanceof w))return new w(n,o);if(o==null){if(n&&n._isBigNumber===!0){f.s=n.s,!n.c||n.e>B?f.c=f.e=null:n.e<O?f.c=[f.e=0]:(f.e=n.e,f.c=n.c.slice());return}if((p=typeof n=="number")&&n*0==0){if(f.s=1/n<0?(n=-n,-1):1,n===~~n){for(d=0,S=n;S>=10;S/=10,d++);d>B?f.c=f.e=null:(f.e=d,f.c=[n]);return}b=String(n)}else{if(!Zt.test(b=String(n)))return s(f,b,p);f.s=b.charCodeAt(0)==45?(b=b.slice(1),-1):1}(d=b.indexOf("."))>-1&&(b=b.replace(".","")),(S=b.search(/e/i))>0?(d<0&&(d=S),d+=+b.slice(S+1),b=b.substring(0,S)):d<0&&(d=b.length)}else{if(q(o,2,k.length,"Base"),o==10&&H)return f=new w(n),E(f,a+f.e+1,c);if(b=String(n),p=typeof n=="number"){if(n*0!=0)return s(f,b,p,o);if(f.s=1/n<0?(b=b.slice(1),-1):1,w.DEBUG&&b.replace(/^0\.0*|\./,"").length>15)throw Error(Bt+n)}else f.s=b.charCodeAt(0)===45?(b=b.slice(1),-1):1;for(l=k.slice(0,o),d=S=0,h=b.length;S<h;S++)if(l.indexOf(P=b.charAt(S))<0){if(P=="."){if(S>d){d=h;continue}}else if(!g&&(b==b.toUpperCase()&&(b=b.toLowerCase())||b==b.toLowerCase()&&(b=b.toUpperCase()))){g=!0,S=-1,d=0;continue}return s(f,String(n),p,o)}p=!1,b=t(b,o,10,f.s),(d=b.indexOf("."))>-1?b=b.replace(".",""):d=b.length}for(S=0;b.charCodeAt(S)===48;S++);for(h=b.length;b.charCodeAt(--h)===48;);if(b=b.slice(S,++h)){if(h-=S,p&&w.DEBUG&&h>15&&(n>gt||n!==oe(n)))throw Error(Bt+f.s*n);if((d=d-S-1)>B)f.c=f.e=null;else if(d<O)f.c=[f.e=0];else{if(f.e=d,f.c=[],S=(d+1)%T,d<0&&(S+=T),S<h){for(S&&f.c.push(+b.slice(0,S)),h-=T;S<h;)f.c.push(+b.slice(S,S+=T));S=T-(b=b.slice(S)).length}else S-=h;for(;S--;b+="0");f.c.push(+b)}}else f.c=[f.e=0]}w.clone=vt,w.ROUND_UP=0,w.ROUND_DOWN=1,w.ROUND_CEIL=2,w.ROUND_FLOOR=3,w.ROUND_HALF_UP=4,w.ROUND_HALF_DOWN=5,w.ROUND_HALF_EVEN=6,w.ROUND_HALF_CEIL=7,w.ROUND_HALF_FLOOR=8,w.EUCLID=9,w.config=w.set=function(n){var o,l;if(n!=null)if(typeof n=="object"){if(n.hasOwnProperty(o="DECIMAL_PLACES")&&(l=n[o],q(l,0,$,o),a=l),n.hasOwnProperty(o="ROUNDING_MODE")&&(l=n[o],q(l,0,8,o),c=l),n.hasOwnProperty(o="EXPONENTIAL_AT")&&(l=n[o],l&&l.pop?(q(l[0],-$,0,o),q(l[1],0,$,o),u=l[0],y=l[1]):(q(l,-$,$,o),u=-(y=l<0?-l:l))),n.hasOwnProperty(o="RANGE"))if(l=n[o],l&&l.pop)q(l[0],-$,-1,o),q(l[1],1,$,o),O=l[0],B=l[1];else if(q(l,-$,$,o),l)O=-(B=l<0?-l:l);else throw Error(V+o+" cannot be zero: "+l);if(n.hasOwnProperty(o="CRYPTO"))if(l=n[o],l===!!l)if(l)if(typeof crypto<"u"&&crypto&&(crypto.getRandomValues||crypto.randomBytes))N=l;else throw N=!l,Error(V+"crypto unavailable");else N=l;else throw Error(V+o+" not true or false: "+l);if(n.hasOwnProperty(o="MODULO_MODE")&&(l=n[o],q(l,0,9,o),F=l),n.hasOwnProperty(o="POW_PRECISION")&&(l=n[o],q(l,0,$,o),_=l),n.hasOwnProperty(o="FORMAT"))if(l=n[o],typeof l=="object")D=l;else throw Error(V+o+" not an object: "+l);if(n.hasOwnProperty(o="ALPHABET"))if(l=n[o],typeof l=="string"&&!/^.?$|[+\-.\s]|(.).*\1/.test(l))H=l.slice(0,10)=="0123456789",k=l;else throw Error(V+o+" invalid: "+l)}else throw Error(V+"Object expected: "+n);return{DECIMAL_PLACES:a,ROUNDING_MODE:c,EXPONENTIAL_AT:[u,y],RANGE:[O,B],CRYPTO:N,MODULO_MODE:F,POW_PRECISION:_,FORMAT:D,ALPHABET:k}},w.isBigNumber=function(n){if(!n||n._isBigNumber!==!0)return!1;if(!w.DEBUG)return!0;var o,l,P=n.c,g=n.e,d=n.s;e:if({}.toString.call(P)=="[object Array]"){if((d===1||d===-1)&&g>=-$&&g<=$&&g===oe(g)){if(P[0]===0){if(g===0&&P.length===1)return!0;break e}if(o=(g+1)%T,o<1&&(o+=T),String(P[0]).length==o){for(o=0;o<P.length;o++)if(l=P[o],l<0||l>=ce||l!==oe(l))break e;if(l!==0)return!0}}}else if(P===null&&g===null&&(d===null||d===1||d===-1))return!0;throw Error(V+"Invalid BigNumber: "+n)},w.maximum=w.max=function(){return se(arguments,-1)},w.minimum=w.min=function(){return se(arguments,1)},w.random=function(){var n=9007199254740992,o=Math.random()*n&2097151?function(){return oe(Math.random()*n)}:function(){return(Math.random()*1073741824|0)*8388608+(Math.random()*8388608|0)};return function(l){var P,g,d,S,p,h=0,b=[],f=new w(i);if(l==null?l=a:q(l,0,$),S=pt(l/T),N)if(crypto.getRandomValues){for(P=crypto.getRandomValues(new Uint32Array(S*=2));h<S;)p=P[h]*131072+(P[h+1]>>>11),p>=9e15?(g=crypto.getRandomValues(new Uint32Array(2)),P[h]=g[0],P[h+1]=g[1]):(b.push(p%1e14),h+=2);h=S/2}else if(crypto.randomBytes){for(P=crypto.randomBytes(S*=7);h<S;)p=(P[h]&31)*281474976710656+P[h+1]*1099511627776+P[h+2]*4294967296+P[h+3]*16777216+(P[h+4]<<16)+(P[h+5]<<8)+P[h+6],p>=9e15?crypto.randomBytes(7).copy(P,h):(b.push(p%1e14),h+=7);h=S/7}else throw N=!1,Error(V+"crypto unavailable");if(!N)for(;h<S;)p=o(),p<9e15&&(b[h++]=p%1e14);for(S=b[--h],l%=T,S&&l&&(p=ht[T-l],b[h]=oe(S/p)*p);b[h]===0;b.pop(),h--);if(h<0)b=[d=0];else{for(d=-1;b[0]===0;b.splice(0,1),d-=T);for(h=1,p=b[0];p>=10;p/=10,h++);h<T&&(d-=T-h)}return f.e=d,f.c=b,f}}(),w.sum=function(){for(var n=1,o=arguments,l=new w(o[0]);n<o.length;)l=l.plus(o[n++]);return l},t=function(){var n="0123456789";function o(l,P,g,d){for(var S,p=[0],h,b=0,f=l.length;b<f;){for(h=p.length;h--;p[h]*=P);for(p[0]+=d.indexOf(l.charAt(b++)),S=0;S<p.length;S++)p[S]>g-1&&(p[S+1]==null&&(p[S+1]=0),p[S+1]+=p[S]/g|0,p[S]%=g)}return p.reverse()}return function(l,P,g,d,S){var p,h,b,f,x,I,A,M,U=l.indexOf("."),Y=a,L=c;for(U>=0&&(f=_,_=0,l=l.replace(".",""),M=new w(P),I=M.pow(l.length-U),_=f,M.c=o(Pe(ne(I.c),I.e,"0"),10,g,n),M.e=M.c.length),A=o(l,P,g,S?(p=k,n):(p=n,k)),b=f=A.length;A[--f]==0;A.pop());if(!A[0])return p.charAt(0);if(U<0?--b:(I.c=A,I.e=b,I.s=d,I=e(I,M,Y,L,g),A=I.c,x=I.r,b=I.e),h=b+Y+1,U=A[h],f=g/2,x=x||h<0||A[h+1]!=null,x=L<4?(U!=null||x)&&(L==0||L==(I.s<0?3:2)):U>f||U==f&&(L==4||x||L==6&&A[h-1]&1||L==(I.s<0?8:7)),h<1||!A[0])l=x?Pe(p.charAt(1),-Y,p.charAt(0)):p.charAt(0);else{if(A.length=h,x)for(--g;++A[--h]>g;)A[h]=0,h||(++b,A=[1].concat(A));for(f=A.length;!A[--f];);for(U=0,l="";U<=f;l+=p.charAt(A[U++]));l=Pe(l,b,p.charAt(0))}return l}}(),e=function(){function n(P,g,d){var S,p,h,b,f=0,x=P.length,I=g%ye,A=g/ye|0;for(P=P.slice();x--;)h=P[x]%ye,b=P[x]/ye|0,S=A*h+b*I,p=I*h+S%ye*ye+f,f=(p/d|0)+(S/ye|0)+A*b,P[x]=p%d;return f&&(P=[f].concat(P)),P}function o(P,g,d,S){var p,h;if(d!=S)h=d>S?1:-1;else for(p=h=0;p<d;p++)if(P[p]!=g[p]){h=P[p]>g[p]?1:-1;break}return h}function l(P,g,d,S){for(var p=0;d--;)P[d]-=p,p=P[d]<g[d]?1:0,P[d]=p*S+P[d]-g[d];for(;!P[0]&&P.length>1;P.splice(0,1));}return function(P,g,d,S,p){var h,b,f,x,I,A,M,U,Y,L,C,Z,We,ut,ct,ge,_e,ie=P.s==g.s?1:-1,Q=P.c,z=g.c;if(!Q||!Q[0]||!z||!z[0])return new w(!P.s||!g.s||(Q?z&&Q[0]==z[0]:!z)?NaN:Q&&Q[0]==0||!z?ie*0:ie/0);for(U=new w(ie),Y=U.c=[],b=P.e-g.e,ie=d+b+1,p||(p=ce,b=ae(P.e/T)-ae(g.e/T),ie=ie/T|0),f=0;z[f]==(Q[f]||0);f++);if(z[f]>(Q[f]||0)&&b--,ie<0)Y.push(1),x=!0;else{for(ut=Q.length,ge=z.length,f=0,ie+=2,I=oe(p/(z[0]+1)),I>1&&(z=n(z,I,p),Q=n(Q,I,p),ge=z.length,ut=Q.length),We=ge,L=Q.slice(0,ge),C=L.length;C<ge;L[C++]=0);_e=z.slice(),_e=[0].concat(_e),ct=z[0],z[1]>=p/2&&ct++;do{if(I=0,h=o(z,L,ge,C),h<0){if(Z=L[0],ge!=C&&(Z=Z*p+(L[1]||0)),I=oe(Z/ct),I>1)for(I>=p&&(I=p-1),A=n(z,I,p),M=A.length,C=L.length;o(A,L,M,C)==1;)I--,l(A,ge<M?_e:z,M,p),M=A.length,h=1;else I==0&&(h=I=1),A=z.slice(),M=A.length;if(M<C&&(A=[0].concat(A)),l(L,A,C,p),C=L.length,h==-1)for(;o(z,L,ge,C)<1;)I++,l(L,ge<C?_e:z,C,p),C=L.length}else h===0&&(I++,L=[0]);Y[f++]=I,L[0]?L[C++]=Q[We]||0:(L=[Q[We]],C=1)}while((We++<ut||L[0]!=null)&&ie--);x=L[0]!=null,Y[0]||Y.splice(0,1)}if(p==ce){for(f=1,ie=Y[0];ie>=10;ie/=10,f++);E(U,d+(U.e=f+b*T-1)+1,S,x)}else U.e=b,U.r=+x;return U}}();function j(n,o,l,P){var g,d,S,p,h;if(l==null?l=c:q(l,0,8),!n.c)return n.toString();if(g=n.c[0],S=n.e,o==null)h=ne(n.c),h=P==1||P==2&&(S<=u||S>=y)?je(h,S):Pe(h,S,"0");else if(n=E(new w(n),o,l),d=n.e,h=ne(n.c),p=h.length,P==1||P==2&&(o<=d||d<=u)){for(;p<o;h+="0",p++);h=je(h,d)}else if(o-=S,h=Pe(h,d,"0"),d+1>p){if(--o>0)for(h+=".";o--;h+="0");}else if(o+=d-p,o>0)for(d+1==p&&(h+=".");o--;h+="0");return n.s<0&&g?"-"+h:h}function se(n,o){for(var l,P,g=1,d=new w(n[0]);g<n.length;g++)P=new w(n[g]),(!P.s||(l=xe(d,P))===o||l===0&&d.s===o)&&(d=P);return d}function fe(n,o,l){for(var P=1,g=o.length;!o[--g];o.pop());for(g=o[0];g>=10;g/=10,P++);return(l=P+l*T-1)>B?n.c=n.e=null:l<O?n.c=[n.e=0]:(n.e=l,n.c=o),n}s=function(){var n=/^(-?)0([xbo])(?=\w[\w.]*$)/i,o=/^([^.]+)\.$/,l=/^\.([^.]+)$/,P=/^-?(Infinity|NaN)$/,g=/^\s*\+(?=[\w.])|^\s+|\s+$/g;return function(d,S,p,h){var b,f=p?S:S.replace(g,"");if(P.test(f))d.s=isNaN(f)?null:f<0?-1:1;else{if(!p&&(f=f.replace(n,function(x,I,A){return b=(A=A.toLowerCase())=="x"?16:A=="b"?2:8,!h||h==b?I:x}),h&&(b=h,f=f.replace(o,"$1").replace(l,"0.$1")),S!=f))return new w(f,b);if(w.DEBUG)throw Error(V+"Not a"+(h?" base "+h:"")+" number: "+S);d.s=null}d.c=d.e=null}}();function E(n,o,l,P){var g,d,S,p,h,b,f,x=n.c,I=ht;if(x){e:{for(g=1,p=x[0];p>=10;p/=10,g++);if(d=o-g,d<0)d+=T,S=o,h=x[b=0],f=oe(h/I[g-S-1]%10);else if(b=pt((d+1)/T),b>=x.length)if(P){for(;x.length<=b;x.push(0));h=f=0,g=1,d%=T,S=d-T+1}else break e;else{for(h=p=x[b],g=1;p>=10;p/=10,g++);d%=T,S=d-T+g,f=S<0?0:oe(h/I[g-S-1]%10)}if(P=P||o<0||x[b+1]!=null||(S<0?h:h%I[g-S-1]),P=l<4?(f||P)&&(l==0||l==(n.s<0?3:2)):f>5||f==5&&(l==4||P||l==6&&(d>0?S>0?h/I[g-S]:0:x[b-1])%10&1||l==(n.s<0?8:7)),o<1||!x[0])return x.length=0,P?(o-=n.e+1,x[0]=I[(T-o%T)%T],n.e=-o||0):x[0]=n.e=0,n;if(d==0?(x.length=b,p=1,b--):(x.length=b+1,p=I[T-d],x[b]=S>0?oe(h/I[g-S]%I[S])*p:0),P)for(;;)if(b==0){for(d=1,S=x[0];S>=10;S/=10,d++);for(S=x[0]+=p,p=1;S>=10;S/=10,p++);d!=p&&(n.e++,x[0]==ce&&(x[0]=1));break}else{if(x[b]+=p,x[b]!=ce)break;x[b--]=0,p=1}for(d=x.length;x[--d]===0;x.pop());}n.e>B?n.c=n.e=null:n.e<O&&(n.c=[n.e=0])}return n}function X(n){var o,l=n.e;return l===null?n.toString():(o=ne(n.c),o=l<=u||l>=y?je(o,l):Pe(o,l,"0"),n.s<0?"-"+o:o)}return r.absoluteValue=r.abs=function(){var n=new w(this);return n.s<0&&(n.s=1),n},r.comparedTo=function(n,o){return xe(this,new w(n,o))},r.decimalPlaces=r.dp=function(n,o){var l,P,g,d=this;if(n!=null)return q(n,0,$),o==null?o=c:q(o,0,8),E(new w(d),n+d.e+1,o);if(!(l=d.c))return null;if(P=((g=l.length-1)-ae(this.e/T))*T,g=l[g])for(;g%10==0;g/=10,P--);return P<0&&(P=0),P},r.dividedBy=r.div=function(n,o){return e(this,new w(n,o),a,c)},r.dividedToIntegerBy=r.idiv=function(n,o){return e(this,new w(n,o),0,1)},r.exponentiatedBy=r.pow=function(n,o){var l,P,g,d,S,p,h,b,f,x=this;if(n=new w(n),n.c&&!n.isInteger())throw Error(V+"Exponent not an integer: "+X(n));if(o!=null&&(o=new w(o)),p=n.e>14,!x.c||!x.c[0]||x.c[0]==1&&!x.e&&x.c.length==1||!n.c||!n.c[0])return f=new w(Math.pow(+X(x),p?n.s*(2-$e(n)):+X(n))),o?f.mod(o):f;if(h=n.s<0,o){if(o.c?!o.c[0]:!o.s)return new w(NaN);P=!h&&x.isInteger()&&o.isInteger(),P&&(x=x.mod(o))}else{if(n.e>9&&(x.e>0||x.e<-1||(x.e==0?x.c[0]>1||p&&x.c[1]>=24e7:x.c[0]<8e13||p&&x.c[0]<=9999975e7)))return d=x.s<0&&$e(n)?-0:0,x.e>-1&&(d=1/d),new w(h?1/d:d);_&&(d=pt(_/T+2))}for(p?(l=new w(.5),h&&(n.s=1),b=$e(n)):(g=Math.abs(+X(n)),b=g%2),f=new w(i);;){if(b){if(f=f.times(x),!f.c)break;d?f.c.length>d&&(f.c.length=d):P&&(f=f.mod(o))}if(g){if(g=oe(g/2),g===0)break;b=g%2}else if(n=n.times(l),E(n,n.e+1,1),n.e>14)b=$e(n);else{if(g=+X(n),g===0)break;b=g%2}x=x.times(x),d?x.c&&x.c.length>d&&(x.c.length=d):P&&(x=x.mod(o))}return P?f:(h&&(f=i.div(f)),o?f.mod(o):d?E(f,_,c,S):f)},r.integerValue=function(n){var o=new w(this);return n==null?n=c:q(n,0,8),E(o,o.e+1,n)},r.isEqualTo=r.eq=function(n,o){return xe(this,new w(n,o))===0},r.isFinite=function(){return!!this.c},r.isGreaterThan=r.gt=function(n,o){return xe(this,new w(n,o))>0},r.isGreaterThanOrEqualTo=r.gte=function(n,o){return(o=xe(this,new w(n,o)))===1||o===0},r.isInteger=function(){return!!this.c&&ae(this.e/T)>this.c.length-2},r.isLessThan=r.lt=function(n,o){return xe(this,new w(n,o))<0},r.isLessThanOrEqualTo=r.lte=function(n,o){return(o=xe(this,new w(n,o)))===-1||o===0},r.isNaN=function(){return!this.s},r.isNegative=function(){return this.s<0},r.isPositive=function(){return this.s>0},r.isZero=function(){return!!this.c&&this.c[0]==0},r.minus=function(n,o){var l,P,g,d,S=this,p=S.s;if(n=new w(n,o),o=n.s,!p||!o)return new w(NaN);if(p!=o)return n.s=-o,S.plus(n);var h=S.e/T,b=n.e/T,f=S.c,x=n.c;if(!h||!b){if(!f||!x)return f?(n.s=-o,n):new w(x?S:NaN);if(!f[0]||!x[0])return x[0]?(n.s=-o,n):new w(f[0]?S:c==3?-0:0)}if(h=ae(h),b=ae(b),f=f.slice(),p=h-b){for((d=p<0)?(p=-p,g=f):(b=h,g=x),g.reverse(),o=p;o--;g.push(0));g.reverse()}else for(P=(d=(p=f.length)<(o=x.length))?p:o,p=o=0;o<P;o++)if(f[o]!=x[o]){d=f[o]<x[o];break}if(d&&(g=f,f=x,x=g,n.s=-n.s),o=(P=x.length)-(l=f.length),o>0)for(;o--;f[l++]=0);for(o=ce-1;P>p;){if(f[--P]<x[P]){for(l=P;l&&!f[--l];f[l]=o);--f[l],f[P]+=ce}f[P]-=x[P]}for(;f[0]==0;f.splice(0,1),--b);return f[0]?fe(n,f,b):(n.s=c==3?-1:1,n.c=[n.e=0],n)},r.modulo=r.mod=function(n,o){var l,P,g=this;return n=new w(n,o),!g.c||!n.s||n.c&&!n.c[0]?new w(NaN):!n.c||g.c&&!g.c[0]?new w(g):(F==9?(P=n.s,n.s=1,l=e(g,n,0,3),n.s=P,l.s*=P):l=e(g,n,0,F),n=g.minus(l.times(n)),!n.c[0]&&F==1&&(n.s=g.s),n)},r.multipliedBy=r.times=function(n,o){var l,P,g,d,S,p,h,b,f,x,I,A,M,U,Y,L=this,C=L.c,Z=(n=new w(n,o)).c;if(!C||!Z||!C[0]||!Z[0])return!L.s||!n.s||C&&!C[0]&&!Z||Z&&!Z[0]&&!C?n.c=n.e=n.s=null:(n.s*=L.s,!C||!Z?n.c=n.e=null:(n.c=[0],n.e=0)),n;for(P=ae(L.e/T)+ae(n.e/T),n.s*=L.s,h=C.length,x=Z.length,h<x&&(M=C,C=Z,Z=M,g=h,h=x,x=g),g=h+x,M=[];g--;M.push(0));for(U=ce,Y=ye,g=x;--g>=0;){for(l=0,I=Z[g]%Y,A=Z[g]/Y|0,S=h,d=g+S;d>g;)b=C[--S]%Y,f=C[S]/Y|0,p=A*b+f*I,b=I*b+p%Y*Y+M[d]+l,l=(b/U|0)+(p/Y|0)+A*f,M[d--]=b%U;M[d]=l}return l?++P:M.splice(0,1),fe(n,M,P)},r.negated=function(){var n=new w(this);return n.s=-n.s||null,n},r.plus=function(n,o){var l,P=this,g=P.s;if(n=new w(n,o),o=n.s,!g||!o)return new w(NaN);if(g!=o)return n.s=-o,P.minus(n);var d=P.e/T,S=n.e/T,p=P.c,h=n.c;if(!d||!S){if(!p||!h)return new w(g/0);if(!p[0]||!h[0])return h[0]?n:new w(p[0]?P:g*0)}if(d=ae(d),S=ae(S),p=p.slice(),g=d-S){for(g>0?(S=d,l=h):(g=-g,l=p),l.reverse();g--;l.push(0));l.reverse()}for(g=p.length,o=h.length,g-o<0&&(l=h,h=p,p=l,o=g),g=0;o;)g=(p[--o]=p[o]+h[o]+g)/ce|0,p[o]=ce===p[o]?0:p[o]%ce;return g&&(p=[g].concat(p),++S),fe(n,p,S)},r.precision=r.sd=function(n,o){var l,P,g,d=this;if(n!=null&&n!==!!n)return q(n,1,$),o==null?o=c:q(o,0,8),E(new w(d),n,o);if(!(l=d.c))return null;if(g=l.length-1,P=g*T+1,g=l[g]){for(;g%10==0;g/=10,P--);for(g=l[0];g>=10;g/=10,P++);}return n&&d.e+1>P&&(P=d.e+1),P},r.shiftedBy=function(n){return q(n,-gt,gt),this.times("1e"+n)},r.squareRoot=r.sqrt=function(){var n,o,l,P,g,d=this,S=d.c,p=d.s,h=d.e,b=a+4,f=new w("0.5");if(p!==1||!S||!S[0])return new w(!p||p<0&&(!S||S[0])?NaN:S?d:1/0);if(p=Math.sqrt(+X(d)),p==0||p==1/0?(o=ne(S),(o.length+h)%2==0&&(o+="0"),p=Math.sqrt(+o),h=ae((h+1)/2)-(h<0||h%2),p==1/0?o="5e"+h:(o=p.toExponential(),o=o.slice(0,o.indexOf("e")+1)+h),l=new w(o)):l=new w(p+""),l.c[0]){for(h=l.e,p=h+b,p<3&&(p=0);;)if(g=l,l=f.times(g.plus(e(d,g,b,1))),ne(g.c).slice(0,p)===(o=ne(l.c)).slice(0,p))if(l.e<h&&--p,o=o.slice(p-3,p+1),o=="9999"||!P&&o=="4999"){if(!P&&(E(g,g.e+a+2,0),g.times(g).eq(d))){l=g;break}b+=4,p+=4,P=1}else{(!+o||!+o.slice(1)&&o.charAt(0)=="5")&&(E(l,l.e+a+2,1),n=!l.times(l).eq(d));break}}return E(l,l.e+a+1,c,n)},r.toExponential=function(n,o){return n!=null&&(q(n,0,$),n++),j(this,n,o,1)},r.toFixed=function(n,o){return n!=null&&(q(n,0,$),n=n+this.e+1),j(this,n,o)},r.toFormat=function(n,o,l){var P,g=this;if(l==null)n!=null&&o&&typeof o=="object"?(l=o,o=null):n&&typeof n=="object"?(l=n,n=o=null):l=D;else if(typeof l!="object")throw Error(V+"Argument not an object: "+l);if(P=g.toFixed(n,o),g.c){var d,S=P.split("."),p=+l.groupSize,h=+l.secondaryGroupSize,b=l.groupSeparator||"",f=S[0],x=S[1],I=g.s<0,A=I?f.slice(1):f,M=A.length;if(h&&(d=p,p=h,h=d,M-=d),p>0&&M>0){for(d=M%p||p,f=A.substr(0,d);d<M;d+=p)f+=b+A.substr(d,p);h>0&&(f+=b+A.slice(d)),I&&(f="-"+f)}P=x?f+(l.decimalSeparator||"")+((h=+l.fractionGroupSize)?x.replace(new RegExp("\\d{"+h+"}\\B","g"),"$&"+(l.fractionGroupSeparator||"")):x):f}return(l.prefix||"")+P+(l.suffix||"")},r.toFraction=function(n){var o,l,P,g,d,S,p,h,b,f,x,I,A=this,M=A.c;if(n!=null&&(p=new w(n),!p.isInteger()&&(p.c||p.s!==1)||p.lt(i)))throw Error(V+"Argument "+(p.isInteger()?"out of range: ":"not an integer: ")+X(p));if(!M)return new w(A);for(o=new w(i),b=l=new w(i),P=h=new w(i),I=ne(M),d=o.e=I.length-A.e-1,o.c[0]=ht[(S=d%T)<0?T+S:S],n=!n||p.comparedTo(o)>0?d>0?o:b:p,S=B,B=1/0,p=new w(I),h.c[0]=0;f=e(p,o,0,1),g=l.plus(f.times(P)),g.comparedTo(n)!=1;)l=P,P=g,b=h.plus(f.times(g=b)),h=g,o=p.minus(f.times(g=o)),p=g;return g=e(n.minus(l),P,0,1),h=h.plus(g.times(b)),l=l.plus(g.times(P)),h.s=b.s=A.s,d=d*2,x=e(b,P,d,c).minus(A).abs().comparedTo(e(h,l,d,c).minus(A).abs())<1?[b,P]:[h,l],B=S,x},r.toNumber=function(){return+X(this)},r.toPrecision=function(n,o){return n!=null&&q(n,1,$),j(this,n,o,2)},r.toString=function(n){var o,l=this,P=l.s,g=l.e;return g===null?P?(o="Infinity",P<0&&(o="-"+o)):o="NaN":(n==null?o=g<=u||g>=y?je(ne(l.c),g):Pe(ne(l.c),g,"0"):n===10&&H?(l=E(new w(l),a+g+1,c),o=Pe(ne(l.c),l.e,"0")):(q(n,2,k.length,"Base"),o=t(Pe(ne(l.c),g,"0"),10,n,P,!0)),P<0&&l.c[0]&&(o="-"+o)),o},r.valueOf=r.toJSON=function(){return X(this)},r._isBigNumber=!0,r[Symbol.toStringTag]="BigNumber",r[Symbol.for("nodejs.util.inspect.custom")]=r.valueOf,m!=null&&w.set(m),w}function ae(m){var e=m|0;return m>0||m===e?e:e-1}function ne(m){for(var e,t,s=1,r=m.length,i=m[0]+"";s<r;){for(e=m[s++]+"",t=T-e.length;t--;e="0"+e);i+=e}for(r=i.length;i.charCodeAt(--r)===48;);return i.slice(0,r+1||1)}function xe(m,e){var t,s,r=m.c,i=e.c,a=m.s,c=e.s,u=m.e,y=e.e;if(!a||!c)return null;if(t=r&&!r[0],s=i&&!i[0],t||s)return t?s?0:-c:a;if(a!=c)return a;if(t=a<0,s=u==y,!r||!i)return s?0:!r^t?1:-1;if(!s)return u>y^t?1:-1;for(c=(u=r.length)<(y=i.length)?u:y,a=0;a<c;a++)if(r[a]!=i[a])return r[a]>i[a]^t?1:-1;return u==y?0:u>y^t?1:-1}function q(m,e,t,s){if(m<e||m>t||m!==oe(m))throw Error(V+(s||"Argument")+(typeof m=="number"?m<e||m>t?" out of range: ":" not an integer: ":" not a primitive number: ")+String(m))}function $e(m){var e=m.c.length-1;return ae(m.e/T)==e&&m.c[e]%2!=0}function je(m,e){return(m.length>1?m.charAt(0)+"."+m.slice(1):m)+(e<0?"e":"e+")+e}function Pe(m,e,t){var s,r;if(e<0){for(r=t+".";++e;r+=t);m=r+m}else if(s=m.length,++e>s){for(r=t,e-=s;--e;r+=t);m+=r}else e<s&&(m=m.slice(0,e)+"."+m.slice(e));return m}var G=vt();var Qt=12;G.config({EXPONENTIAL_AT:[-100,100],ROUNDING_MODE:4,DECIMAL_PLACES:Qt});var R=v(0),le=v(1),dr=v("Infinity");function J(m,e){let t=new G(e.toString()),s=new G(10).pow(t);return m.times(s)}function v(m){return new G(m.toString())}var re=(r=>(r.XYK="Xyk",r.LBP="Lbp",r.Stable="Stableswap",r.Omni="Omnipool",r))(re||{}),ke=(i=>(i.UnknownError="UnknownError",i.InsufficientTradingAmount="InsufficientTradingAmount",i.MaxInRatioExceeded="MaxInRatioExceeded",i.MaxOutRatioExceeded="MaxOutRatioExceeded",i.TradeNotAllowed="TradeNotAllowed",i))(ke||{}),It=(t=>(t.Buy="Buy",t.Sell="Sell",t))(It||{});import{calculate_in_given_out as Vt,calculate_out_given_in as es,calculate_linear_weights as ts,calculate_pool_trade_fee as ss,get_spot_price as rs}from"@galacticcouncil/math-lbp";var me=class{static getSpotPrice(e,t,s,r,i){return rs(e,t,s,r,i)}static calculateInGivenOut(e,t,s,r,i){return Vt(e,t,s,r,i)}static calculateOutGivenIn(e,t,s,r,i){return es(e,t,s,r,i)}static calculateLinearWeights(e,t,s,r,i){return ts(e,t,s,r,i)}static calculatePoolTradeFee(e,t,s){return ss(e,t,s)}};import{encodeAddress as is}from"@polkadot/util-crypto";import{stringToU8a as ns}from"@polkadot/util";var Le=18,dt=15,Se="0",xr=12,Or=2034,Me=63,Br=2090,ft=1e3,Je=is(ns("modlomnipool".padEnd(32,"\0")),Me);function At(m,e){let t=[];return JSON.stringify(m,(s,r)=>(r&&r[e]&&t.push(r),r)),t[0]}function Ir(m,e,t){let s;return JSON.stringify(m,(r,i)=>(i&&i[e]===t&&(s=i),i)),s}import"@polkadot/types/lookup";import"@polkadot/api-base/types/consts";import"@polkadot/api-base/types/errors";import"@polkadot/api-base/types/events";import"@polkadot/api-base/types/storage";import"@polkadot/api-base/types/submittable";import"@polkadot/rpc-core/types/jsonrpc";import"@polkadot/api-base/types/calls";import"@polkadot/types/types/registry";import"@polkadot/types/lookup";import"@polkadot/api-base/types/consts";import"@polkadot/api-base/types/errors";import"@polkadot/api-base/types/events";import"@polkadot/api-base/types/storage";import"@polkadot/api-base/types/submittable";import"@polkadot/rpc-core/types/jsonrpc";import"@polkadot/api-base/types/calls";import"@polkadot/types/types/registry";var we=class{api;constructor(e){this.api=e}get chainDecimals(){return this.api.registry.chainDecimals[0]}get chainToken(){return this.api.registry.chainTokens[0]}};var De=class extends we{SUPPORTED_TYPES=["StableSwap","Bond","Token","External"];constructor(e){super(e)}async safeSharesQuery(){try{let e=await this.api.query.stableswap.pools.entries();return new Map(e.map(([{args:[t]},s])=>[t.toString(),s.unwrap()]))}catch{return new Map([])}}async safeBondsQuery(){try{let e=await this.api.query.bonds.bonds.entries();return new Map(e.map(([{args:[t]},s])=>[t.toString(),s.unwrap()]))}catch{return new Map([])}}async metadataQuery(){try{let e=await this.api.query.assetRegistry.assetMetadataMap.entries();return new Map(e.map(([{args:[t]},s])=>{let{decimals:r,symbol:i}=s.unwrap();return[t.toString(),{decimals:r.toNumber(),symbol:i.toHuman()}]}))}catch{return new Map([])}}async locationsQuery(){try{let e=await this.api.query.assetRegistry.assetLocations.entries();return new Map(e.map(([{args:[t]},s])=>[t.toString(),s.unwrap()]))}catch{return new Map([])}}getSystemTokenName(e){switch(e){case"HDX":return"Hydration";case"BSX":return"Basilisk";default:return e}}getToken(e,t,s,r){if(e==Se){let F=this.api.consts.balances.existentialDeposit;return{id:Se,name:this.getSystemTokenName(this.chainToken),symbol:this.chainToken,decimals:this.chainDecimals,icon:this.chainToken,type:"Token",isSufficient:!0,existentialDeposit:F.toString()}}let{name:i,assetType:a,isSufficient:c,existentialDeposit:u}=t,{symbol:y,decimals:O}=s.get(e)??{},B=this.parseLocation("parachain",r),N=2094;return{id:e,name:i.toHuman(),symbol:y,decimals:O,icon:y,type:a.toHuman(),isSufficient:c?c.toHuman():!0,origin:B,externalId:this.parseLocation(N===B?"generalKey":"generalIndex",r),existentialDeposit:u.toString()}}getBond(e,t,s,r){let[i,a]=r,{assetType:c,isSufficient:u,existentialDeposit:y}=t,{symbol:O,decimals:B}=this.getToken(i.toString(),t,s),N=a.toNumber(),F=new Intl.DateTimeFormat("en-GB"),_=[O,"Bond",F.format(N)].join(" ");return{id:e,name:_,symbol:O+"b",decimals:B,icon:O,type:c.toString(),isSufficient:u.toHuman(),existentialDeposit:y.toString(),underlyingAssetId:i.toString(),maturity:N}}getShares(e,t,s,r){let{assets:i}=r,{name:a,symbol:c,assetType:u,isSufficient:y,existentialDeposit:O}=t,N=i.map(D=>D.toString()).map(D=>{let{symbol:k}=this.getToken(D,t,s);return[D,k]}),F=Object.fromEntries(N),_=Object.values(F);return{id:e,name:_.join(", "),symbol:c?.isSome?c.toHuman():a.toHuman(),decimals:18,icon:_.join("/"),type:u.toString(),isSufficient:y.toHuman(),existentialDeposit:O.toString(),meta:F}}getExternal(e,t,s,r){let i=this.getToken(e,t,new Map,r),a=s?.find(c=>c.internalId===i.id);return a?{...i,decimals:a.decimals,name:a.name,symbol:a.symbol,icon:a.symbol,isWhiteListed:a.isWhiteListed}:i}normalizeMetadata(e,t){return t.size?t:new Map(e.map(([{args:[s]},r])=>{let{decimals:i,symbol:a}=r.unwrap();return[s.toString(),{decimals:Number(i.toString()),symbol:a.toHuman()}]}))}getSupportedAssets(e){return e.filter(([t,s])=>{if(s.isNone)return!1;let r=s.unwrap();return this.isSupportedAsset(r)})}async getOnChainAssets(e,t){let[s,r,i,a,c]=await Promise.all([this.api.query.assetRegistry.assets.entries(),this.locationsQuery(),this.safeSharesQuery(),this.safeBondsQuery(),this.metadataQuery()]),u=this.getSupportedAssets(s),y=this.normalizeMetadata(u,c),O=u.map(([{args:[B]},N])=>{let F=N.unwrap(),_=r.get(B.toString()),{assetType:D}=F;switch(D.toString()){case"Bond":let k=a.get(B.toString());return this.getBond(B.toString(),F,y,k);case"StableSwap":let H=i.get(B.toString());return this.getShares(B.toString(),F,y,H);case"External":return this.getExternal(B.toString(),F,t,_);default:return this.getToken(B.toString(),F,y,_)}});return e?O:O.filter(B=>this.isValidAsset(B))}isValidAsset(e){return!!e.symbol&&!!e.decimals}isSupportedAsset(e){let t=e.assetType.toString();return this.SUPPORTED_TYPES.includes(t)}parseLocation(e,t){if(t){let s=At(t.toJSON(),e);return s&&s[e]}else return}};var Ce=class extends we{constructor(e){super(e)}async getBalance(e,t){return t===Se?await this.getSystemBalance(e):await this.getTokenBalance(e,t)}async getSystemBalance(e){let{data:t}=await this.api.query.system.account(e);return this.calculateFreeBalance(t)}async getTokenBalance(e,t){let{free:s,reserved:r,frozen:i}=await this.api.query.tokens.accounts(e,t);return this.calculateFreeBalance({free:s,feeFrozen:r,frozen:i})}async subscribeBalance(e,t,s){let r=t.filter(i=>i!==Se).map(i=>[e,i]);return this.api.query.tokens.accounts.multi(r,i=>{i.forEach(({free:a,reserved:c,frozen:u},y)=>{let O=this.calculateFreeBalance({free:a,feeFrozen:c,frozen:u}),B=r[y][1];s(B,O)})})}async subscribeTokenBalance(e,t,s){let r=t.filter(i=>i!==Se).map(i=>[e,i]);return this.api.query.tokens.accounts.multi(r,i=>{i.forEach((a,c)=>{let u=this.calculateFreeBalance(a),y=r[c][1];s(y,u)})})}async subscribeSystemBalance(e,t){return this.api.query.system.account(e,({data:s})=>t(Se,this.calculateFreeBalance(s)))}calculateFreeBalance(e){let{free:t,miscFrozen:s,feeFrozen:r,frozen:i}=e,a=new G(t),c=new G(s||i),u=new G(r||0),y=c.gt(u)?c:u;return a.minus(y)}};import{isAddress as Nt}from"@polkadot/util-crypto";import{fixed_from_rational as Tt}from"@galacticcouncil/math-liquidity-mining";var Pt=class extends we{constructor(e){super(e)}secondsInYear=new G(365.2425).times(24).times(60).times(60);async getOmnipoolFarms(e){let t=await this.api.query.omnipoolWarehouseLM.activeYieldFarm.entries(e);return await Promise.all(t.map(async([r,i])=>{let[,a]=r.args,c=i.unwrap().toString(),u=a.toString(),y=(await this.api.query.omnipoolWarehouseLM.globalFarm(u)).unwrap(),O=(await this.api.query.omnipoolWarehouseLM.yieldFarm(e,u,c)).unwrap(),B=await this.getOraclePrice(y)??y.priceAdjustment.toString();return{assetId:e,globalFarm:y,yieldFarm:O,priceAdjustment:B}}))}async getIsolatedPoolFarms(e){let t=await this.api.query.xykWarehouseLM.activeYieldFarm.entries(e);return await Promise.all(t.map(async([r,i])=>{let[,a]=r.args,c=i.unwrap().toString(),u=a.toString(),y=(await this.api.query.xykWarehouseLM.globalFarm(u)).unwrap(),O=(await this.api.query.xykWarehouseLM.yieldFarm(e,u,c)).unwrap(),B=await this.getOraclePrice(y)??y.priceAdjustment.toString();return{assetId:e,globalFarm:y,yieldFarm:O,priceAdjustment:B}}))}async getOraclePrice(e){let t=e.rewardCurrency.toString(),s=e.incentivizedAsset.toString(),r=[t,s].sort();if(t===s)return new G(1).shiftedBy(18).toString();let i=await this.api.query.emaOracle.oracles("omnipool",r,"TenMinutes");if(i.isNone)return;let[a]=i.unwrap(),c=a.price.n.toString(),u=a.price.d.toString(),y;return Number(t)<Number(s)?y=Tt(c,u):y=Tt(u,c),y}getGlobalRewardPerPeriod(e,t,s,r){let a=e.times(t).shiftedBy(-18).times(r).shiftedBy(-18);return a.gte(s)?s:a}getPoolYieldPerPeriod(e,t,s,r){return e.times(t).div(s.times(r).shiftedBy(-18))}async getFarmApr(e,t){if(t==="isolatedpool"&&!Nt(e))throw new Error("You must pass an address of isolated pool as id");if(t==="omnipool"&&Nt(e))throw new Error("You must pass an asset id of omnipool");let s=6,r=t==="omnipool"?await this.getOmnipoolFarms(e):await this.getIsolatedPoolFarms(e);return r.length?r.map(({yieldFarm:c,globalFarm:u,priceAdjustment:y})=>{let O=new G(u.totalSharesZ.toString()),B=u.plannedYieldingPeriods.toString(),N=new G(u.yieldPerPeriod.toString()),F=new G(u.maxRewardPerPeriod.toString()),_=u.blocksPerPeriod.toString(),D=new G(c.multiplier.toString()).shiftedBy(-18),k=this.secondsInYear.div(new G(s).times(_)),H;if(O.isZero())H=N.times(D).times(k);else{let fe=this.getGlobalRewardPerPeriod(O,N,F,y);H=this.getPoolYieldPerPeriod(fe,D,O,y).times(k)}let w=new G(u.pendingRewards.toString()).plus(u.accumulatedPaidRewards.toString()),j=F.times(B);return w.div(j).gte(.99)?R:H.times(100)}).reduce((c,u)=>c.plus(u),R).toString():void 0}};var he=class extends Ce{pools=[];subs=[];poolsLoaded=!1;constructor(e){super(e)}async getPools(){return this.poolsLoaded?this.pools:(this.pools=await this.loadPools(),this.subs=await this.subscribe(),this.poolsLoaded=!0,this.pools)}async subscribe(){let e=this.pools.map(async s=>{let r=[await this.subscribePoolChange(s),await this.subscribeTokensPoolBalance(s),await this.subscribeSystemPoolBalance(s)];if(this.hasShareAsset(s)){let i=await this.subscribeSharePoolBalance(s);r.push(i)}return this.subscribeLog(s),r});return(await Promise.all(e)).flat()}subscribeLog(e){let t=e.address.substring(0,10).concat("...");console.log(`${e.type} [${t}] balance subscribed`)}unsubscribe(){this.subs.forEach(e=>{e()})}hasShareAsset(e){return e.type==="Stableswap"&&e.id}subscribeTokensPoolBalance(e){return this.subscribeTokenBalance(e.address,e.tokens.map(t=>t.id),this.updateBalanceCallback(e,(t,s)=>t.id!==s))}subscribeSharePoolBalance(e){return this.subscribeTokenBalance(Je,[e.id],this.updateBalanceCallback(e,()=>!0))}subscribeSystemPoolBalance(e){return this.subscribeSystemBalance(e.address,this.updateBalanceCallback(e,()=>!0))}updateBalanceCallback(e,t){return function(s,r){let i=e.tokens.findIndex(a=>a.id==s);i>=0&&t(e,s)&&(e.tokens[i].balance=r.toString())}}};var Ke=class extends he{MAX_FINAL_WEIGHT=J(v(100),6);poolsData=new Map([]);isSupported(){return this.api.query.lbp!==void 0}async loadPools(){let[e,t]=await Promise.all([this.api.query.lbp.poolData.entries(),this.api.query.parachainSystem.validationData()]),{relayParentNumber:s}=t.unwrap(),r=e.filter(([i,a])=>this.isActivePool(a.unwrap(),s)).map(async([{args:[i]},a])=>{let c=a.unwrap(),u=i.toString(),y=await this.getPoolDelta(u,c,s.toString());return this.poolsData.set(i.toString(),c),{address:u,type:"Lbp",fee:c.fee.toJSON(),...y,...this.getPoolLimits()}});return Promise.all(r)}async getPoolFees(e,t){let s=this.pools.find(r=>r.address===t);return{repayFee:this.getRepayFee(),exchangeFee:s.fee}}getPoolType(){return"Lbp"}async subscribePoolChange(e){return this.api.query.parachainSystem.validationData(async t=>{let{relayParentNumber:s}=t.unwrap(),r=this.poolsData.get(e.address);if(this.isActivePool(r,s)){let a=await this.getPoolDelta(e.address,r,s.toString());Object.assign(e,a)}else{let a=this.pools.findIndex(c=>c.address==e.address);this.pools.splice(a,1)}})}async getPoolDelta(e,t,s){let{start:r,end:i,assets:a,initialWeight:c,finalWeight:u,repayTarget:y,feeCollector:O}=t,B=me.calculateLinearWeights(r.toString(),i.toString(),c.toString(),u.toString(),s),[N,F]=a,_=N.toString(),D=v(B),k=F.toString(),H=this.MAX_FINAL_WEIGHT.minus(v(D)),[w,j,se]=await Promise.all([this.isRepayFeeApplied(_,y.toString(),O.toString()),this.getBalance(e,_),this.getBalance(e,k)]);return{repayFeeApply:w,tokens:[{id:_,weight:D,balance:j.toString()},{id:k,weight:H,balance:se.toString()}]}}isActivePool(e,t){if(e.start.isEmpty||e.end.isEmpty)return!1;let s=e.start.unwrap().toNumber(),r=e.end.unwrap().toNumber();return t.toNumber()>=s&&t.toNumber()<r}async isRepayFeeApplied(e,t,s){let r=v(t);if(r.isZero())return!1;try{return(await this.getBalance(e,s)).isLessThan(r)}catch{return!0}}getRepayFee(){return this.api.consts.lbp.repayFee.toJSON()}getPoolLimits(){let e=this.api.consts.lbp.maxInRatio.toJSON(),t=this.api.consts.lbp.maxOutRatio.toJSON(),s=this.api.consts.lbp.minTradingLimit.toJSON();return{maxInRatio:e,maxOutRatio:t,minTradingLimit:s}}};import{encodeAddress as os}from"@polkadot/util-crypto";import{stringToU8a as as}from"@polkadot/util";function K(m,e){return m.shiftedBy(-1*e).toString()}function ue(m){return m[0]/m[1]*100}function ee(m){return m[0]/m[1]}function pe(m){return[m/ft,ft]}var Ze=class extends he{isSupported(){return this.api.query.omnipool!==void 0}async loadPools(){let e=this.api.consts.omnipool.hubAssetId.toString(),t=this.getPoolId(),[s,r,i]=await Promise.all([this.api.query.omnipool.assets.entries(),this.api.query.omnipool.hubAssetTradability(),this.getBalance(t,e)]),a=s.map(async([{args:[u]},y])=>{let{hubReserve:O,shares:B,tradable:N}=y.unwrap(),F=await this.getBalance(t,u.toString());return{id:u.toString(),hubReserves:v(O.toString()),shares:v(B.toString()),tradeable:N.bits.toNumber(),balance:F.toString()}}),c=await Promise.all(a);return c.push({id:e,tradeable:r.bits.toNumber(),balance:i.toString()}),[{address:t,type:"Omnipool",hubAssetId:e,tokens:c,...this.getPoolLimits()}]}async getPoolFees(e,t){let s=await this.api.query.dynamicFees.assetFee(e),r=this.api.consts.dynamicFees.assetFeeParameters,i=this.api.consts.dynamicFees.protocolFeeParameters,a=r.minFee.toNumber()+i.minFee.toNumber(),c=r.maxFee.toNumber()+i.maxFee.toNumber();if(s.isSome){let{assetFee:u,protocolFee:y}=s.unwrap();return{assetFee:pe(u.toNumber()),protocolFee:pe(y.toNumber()),min:pe(a),max:pe(c)}}else return{assetFee:this.getAssetFee(),protocolFee:this.getProtocolFee(),min:pe(a),max:pe(c)}}getPoolType(){return"Omnipool"}async subscribePoolChange(e){let t=e.tokens.map(s=>s.id);return this.api.query.omnipool.assets.multi(t,s=>{e.tokens=s.map((r,i)=>{let a=e.tokens[i];if(r.isNone)return a;let c=r.unwrap();return this.updateTokenState(a,c)})})}updateTokenState(e,t){let{hubReserve:s,shares:r,tradable:i}=t;return{...e,hubReserves:v(s.toString()),shares:v(r.toString()),tradeable:i.bits.toNumber()}}getAssetFee(){let t=this.api.consts.dynamicFees.assetFeeParameters.minFee.toNumber();return pe(t)}getProtocolFee(){let t=this.api.consts.dynamicFees.protocolFeeParameters.minFee.toNumber();return pe(t)}getPoolId(){return os(as("modlomnipool".padEnd(32,"\0")),Me)}getPoolLimits(){let e=this.api.consts.omnipool.maxInRatio.toJSON(),t=this.api.consts.omnipool.maxOutRatio.toJSON(),s=this.api.consts.omnipool.minimumTradingLimit.toJSON();return{maxInRatio:e,maxOutRatio:t,minTradingLimit:s}}};var Qe=class extends he{isSupported(){return this.api.query.xyk!==void 0}async loadPools(){let t=(await this.api.query.xyk.poolAssets.entries()).map(async([{args:[s]},r])=>{let i=s.toString(),[a,c]=r.unwrap(),[u,y]=await Promise.all([this.getBalance(i,a.toString()),this.getBalance(i,c.toString())]);return{address:i,type:"Xyk",tokens:[{id:a.toString(),balance:u.toString()},{id:c.toString(),balance:y.toString()}],...this.getPoolLimits()}});return Promise.all(t)}async getPoolFees(e,t){return{exchangeFee:this.getExchangeFee()}}getPoolType(){return"Xyk"}subscribePoolChange(e){return this.api.query.xyk.poolAssets(e.address,t=>{})}getExchangeFee(){return this.api.consts.xyk.getExchangeFee.toJSON()}getPoolLimits(){let e=this.api.consts.xyk.maxInRatio.toJSON(),t=this.api.consts.xyk.maxOutRatio.toJSON(),s=this.api.consts.xyk.minTradingLimit.toJSON();return{maxInRatio:e,maxOutRatio:t,minTradingLimit:s}}};import{blake2AsHex as Ps,encodeAddress as bs}from"@polkadot/util-crypto";import{calculate_in_given_out as ls,calculate_out_given_in as us,calculate_amplification as cs,calculate_add_one_asset as ms,calculate_liquidity_out_one_asset as ps,calculate_pool_trade_fee as gs,calculate_shares as hs,calculate_shares_for_amount as ds,pool_account_name as fs}from"@galacticcouncil/math-stableswap";var te=class{static getPoolAddress(e){return fs(e)}static calculateAmplification(e,t,s,r,i){return cs(e,t,s,r,i)}static calculateInGivenOut(e,t,s,r,i,a){return ls(e,t,s,r,i,a)}static calculateAddOneAsset(e,t,s,r,i,a){return ms(e,t,s,r,i,a)}static calculateSharesForAmount(e,t,s,r,i,a){return ds(e,t,s,r,i,a)}static calculateOutGivenIn(e,t,s,r,i,a){return us(e,t,s,r,i,a)}static calculateLiquidityOutOneAsset(e,t,s,r,i,a){return ps(e,t,s,r,i,a)}static calculateShares(e,t,s,r,i){return hs(e,t,s,r,i)}static calculatePoolTradeFee(e,t,s){return gs(e,t,s)}};var Ve=class extends he{stablePools=new Map([]);isSupported(){return this.api.query.stableswap!==void 0}async loadPools(){let[e,t]=await Promise.all([this.api.query.stableswap.pools.entries(),this.api.query.system.number()]),s=t.toNumber(),r=e.map(async([{args:[i]},a])=>{let c=a.unwrap(),u=i.toString(),y=this.getPoolAddress(u),[O,B]=await Promise.all([this.getPoolDelta(u,c,s.toString()),this.getPoolTokens(y,u,c)]);return this.stablePools.set(y,c),{address:y,id:u,type:"Stableswap",fee:pe(c.fee.toNumber()),tokens:B,...O,...this.getPoolLimits()}});return Promise.all(r)}async getPoolFees(e,t){return{fee:this.pools.find(r=>r.address===t).fee}}getPoolType(){return"Stableswap"}async subscribePoolChange(e){return this.api.query.system.number(async t=>{let s=t.toNumber(),r=this.stablePools.get(e.address),i=await this.getPoolDelta(e.id,r,s.toString());Object.assign(e,i)})}async getPoolDelta(e,t,s){let{initialAmplification:r,finalAmplification:i,initialBlock:a,finalBlock:c}=t,u=te.calculateAmplification(r.toString(),i.toString(),a.toString(),c.toString(),s),y=await this.api.query.tokens.totalIssuance(e);return{amplification:u,totalIssuance:y.toString()}}async getPoolTokens(e,t,s){let{assets:r}=s,i=r.map(async u=>{let[y,O]=await Promise.all([this.api.query.stableswap.assetTradability(t,u.toString()),this.getBalance(e,u.toString())]);return{id:u.toString(),tradeable:y.bits.toNumber(),balance:O.toString()}}),a=await Promise.all(i),c=await this.api.query.omnipool.assets(t);if(c.isSome){let{tradable:u}=c.unwrap(),y=await this.getBalance(Je,t);a.push({id:t,tradeable:u.bits.toNumber(),balance:y.toString()})}return a}getPoolAddress(e){let t=Number(e),s=te.getPoolAddress(t);return bs(Ps(s),Me)}getPoolLimits(){return{maxInRatio:0,maxOutRatio:0,minTradingLimit:this.api.consts.stableswap.minTradingLimit.toJSON()}}};function bt(m){return m.map(({assetIn:e,assetOut:t,pool:s,poolId:r})=>s==="Stableswap"?{pool:{Stableswap:r},assetIn:e,assetOut:t}:{pool:s,assetIn:e,assetOut:t})}var et=class extends Error{constructor(e){super(),this.message=`${e} pool invalid`,this.name="PoolNotFound"}},Ft=class extends Error{constructor(e,t){super(),this.message=`${e} pool missing ${t}`,this.name="PoolConfigNotFound"}},Ge=class extends Error{constructor(e,t){super(),this.message=`Route from ${e} to ${t} not found in pool configuration`,this.name="RouteNotFound"}},_t=class extends Error{constructor(e){super(),this.message=`Asset ${e} not available in current network`,this.name="AssetNotFound"}},Et=class extends Error{constructor(e){super(),this.message=`Storage missing ${e}`,this.name="StorageConfigNotFound"}},Rt=class extends Error{constructor(e){super(),this.message=`Subscription type "${e}" not supported`,this.name="SubscriptionNotSupported"}},kt=class extends Error{constructor(e){super(),this.message=`${e}`,this.name="ProviderConfigNotFound"}};var qe=class{api;assetClient;xykClient;omniClient;lbpClient;stableClient;onChainAssets=[];onChainAssetsLoaded=!1;constructor(e){this.api=e,this.assetClient=new De(this.api),this.xykClient=new Qe(this.api),this.omniClient=new Ze(this.api),this.lbpClient=new Ke(this.api),this.stableClient=new Ve(this.api)}get assets(){return this.onChainAssets}get isRegistrySynced(){return this.onChainAssetsLoaded}async syncRegistry(e){this.onChainAssets=await this.assetClient.getOnChainAssets(!1,e),this.onChainAssetsLoaded=!0}async getPools(e){if(this.onChainAssetsLoaded||this.syncRegistry(),e.length==0){let a=(await Promise.all([this.xykClient,this.omniClient,this.lbpClient,this.stableClient].filter(c=>c.isSupported()).map(c=>c.getPools()))).flat();return this.withMetadata(a)}let t=[];e.forEach(i=>{switch(i){case"Xyk":t.push(this.xykClient.getPools());break;case"Omnipool":t.push(this.omniClient.getPools());break;case"Lbp":t.push(this.lbpClient.getPools());break;case"Stableswap":t.push(this.stableClient.getPools());break}});let r=(await Promise.all(t)).flat();return this.withMetadata(r)}unsubscribe(){this.xykClient.unsubscribe(),this.omniClient.unsubscribe(),this.lbpClient.unsubscribe(),this.stableClient.unsubscribe()}async withMetadata(e){let t=new Map(this.onChainAssets.map(s=>[s.id,s]));return e.filter(s=>s.type==="Xyk"?s.tokens.every(r=>t.get(r.id)):!0).map(s=>{let r=s.tokens.map(i=>{let a=t.get(i.id);return{...i,...a}});return{...s,tokens:r}})}async getPoolFees(e,t){switch(t.type){case"Xyk":return this.xykClient.getPoolFees(e,t.address);case"Omnipool":return this.omniClient.getPoolFees(e,t.address);case"Lbp":return this.lbpClient.getPoolFees(e,t.address);case"Stableswap":return this.stableClient.getPoolFees(e,t.address);default:throw new et(t.type)}}isDirectOmnipoolTrade(e){return e.length==1&&e[0].pool=="Omnipool"}buildBuyTx(e,t,s,r,i){let a;this.isDirectOmnipoolTrade(i)?a=this.api.tx.omnipool.buy(t,e,s.toFixed(),r.toFixed()):a=this.api.tx.router.buy(e,t,s.toFixed(),r.toFixed(),bt(i));let c=()=>a;return{hex:a.toHex(),name:"RouterBuy",get:c}}buildSellTx(e,t,s,r,i){let a;this.isDirectOmnipoolTrade(i)?a=this.api.tx.omnipool.sell(e,t,s.toFixed(),r.toFixed()):a=this.api.tx.router.sell(e,t,s.toFixed(),r.toFixed(),bt(i));let c=()=>a;return{hex:a.toHex(),name:"RouterSell",get:c}}};var He=(m,e)=>m===e?0:m==null?e==null?0:-1:e==null?m==null?0:1:typeof m.compare=="function"?m.compare(e):typeof e.compare=="function"?-e.compare(m):m<e?-1:m>e?1:0;var tt=(m,e=t=>t!==void 0?": "+t:"")=>class extends Error{constructor(t){super(m(t)+e(t))}};var ys=tt(()=>"illegal argument(s)"),Lt=m=>{throw new ys(m)};var Ss=tt(()=>"index out of bounds"),yt=m=>{throw new Ss(m)},st=(m,e,t)=>(m<e||m>=t)&&yt(m);var Mt=23283064365386963e-26,rt=class{float(e=1){return this.int()*Mt*e}probability(e){return this.float()<e}norm(e=1){return(this.int()*Mt-.5)*2*e}normMinMax(e,t){let s=this.minmax(e,t);return this.float()<.5?s:-s}minmax(e,t){return this.float()*(t-e)+e}minmaxInt(e,t){e|=0;let s=(t|0)-e;return s?e+this.int()%s:e}minmaxUint(e,t){e>>>=0;let s=(t>>>0)-e;return s?e+this.int()%s:e}};var St=Math.random,wt=class extends rt{int(){return St()*4294967296>>>0}float(e=1){return St()*e}norm(e=1){return(St()-.5)*2*e}},Dt=new wt;var Ct=m=>m!=null&&typeof m!="function"&&m.length!==void 0;var Gt=Object.getPrototypeOf({}),it="function",qt="string",Ae=(m,e)=>{let t;if(m===e)return!0;if(m!=null){if(typeof m.equiv===it)return m.equiv(e)}else return m==e;if(e!=null){if(typeof e.equiv===it)return e.equiv(m)}else return m==e;return typeof m===qt||typeof e===qt?!1:(t=Object.getPrototypeOf(m),(t==null||t===Gt)&&(t=Object.getPrototypeOf(e),t==null||t===Gt)?Bs(m,e):typeof m!==it&&m.length!==void 0&&typeof e!==it&&e.length!==void 0?ws(m,e):m instanceof Set&&e instanceof Set?xs(m,e):m instanceof Map&&e instanceof Map?Os(m,e):m instanceof Date&&e instanceof Date?m.getTime()===e.getTime():m instanceof RegExp&&e instanceof RegExp?m.toString()===e.toString():m!==m&&e!==e)},ws=(m,e,t=Ae)=>{let s=m.length;if(s===e.length)for(;s-- >0&&t(m[s],e[s]););return s<0},xs=(m,e,t=Ae)=>m.size===e.size&&t([...m.keys()].sort(),[...e.keys()].sort()),Os=(m,e,t=Ae)=>m.size===e.size&&t([...m].sort(),[...e].sort()),Bs=(m,e,t=Ae)=>{if(Object.keys(m).length!==Object.keys(e).length)return!1;for(let s in m)if(!e.hasOwnProperty(s)||!t(m[s],e[s]))return!1;return!0};var Ht=(m,e)=>m!=null&&typeof m[e]=="function";var Ut=m=>Ht(m,"xform")?m.xform():m;var nt=Symbol(),xt=()=>{};var zt=m=>m!=null&&typeof m[Symbol.iterator]=="function";var ot=class{value;constructor(e){this.value=e}deref(){return this.value}};var at=m=>m instanceof ot;var Xt=m=>m instanceof ot?m.deref():m;function*Wt(m,e){let t=Ut(m)([xt,xt,(s,r)=>r])[2];for(let s of e){let r=t(nt,s);if(at(r)){r=Xt(r.deref()),r!==nt&&(yield r);return}r!==nt&&(yield r)}}var Yt=(m,e)=>[m[0],m[1],e];function Ue(m,e){return zt(e)?Wt(Ue(m),e):t=>{let s=t[2];return Yt(t,(r,i)=>s(r,m(i)))}}var Ne=class{_head;_length=0;constructor(e){e&&this.into(e)}get length(){return this._length}get head(){return this._head}[Symbol.iterator](){return $t("next",this._head)}reverseIterator(){return $t("prev",this.tail)}clear(){this.release()}compare(e,t=He){let s=this._length;if(s<e._length)return-1;if(s>e._length)return 1;if(s===0)return 0;{let r=this._head,i=e._head,a=0;for(;s-- >0&&a===0;)a=t(r.value,i.value),r=r.next,i=i.next;return a}}concat(...e){let t=this.copy();for(let s of e)t.into(s);return t}equiv(e){if(!(e instanceof Ne||Ct(e))||this._length!==e.length)return!1;if(!this._length||this===e)return!0;let t=e[Symbol.iterator](),s=this._head;for(let r=this._length;r-- >0;){if(!Ae(s.value,t.next().value))return!1;s=s.next}return!0}filter(e){let t=this.empty();return this.traverse(s=>(e(s.value)&&t.append(s.value),!0)),t}find(e){return this.traverse(t=>t.value!==e)}findWith(e){return this.traverse(t=>!e(t.value))}first(){return this._head&&this._head.value}insertSorted(e,t){t=t||He;for(let s=this._head,r=this._length;r-- >0;){if(t(e,s.value)<=0)return this.insertBefore(s,e);s=s.next}return this.append(e)}into(e){for(let t of e)this.append(t);return this}nth(e,t){let s=this.nthCell(e);return s?s.value:t}nthCellUnsafe(e){let t,s;for(e<=this._length>>>1?(t=this._head,s="next"):(t=this.tail,s="prev",e=this._length-e-1);e-- >0&&t;)t=t[s];return t}peek(){return this.tail&&this.tail.value}$reduce(e,t){let s=this._head;for(let r=this._length;r-- >0&&!at(t);)t=e(t,s.value),s=s.next;return t}reduce(e,t){return this.$reduce(e,t)}release(){let e=this._head;if(!e)return!0;let t;for(let s=this._length;s-- >0;)t=e.next,delete e.value,delete e.prev,delete e.next,e=t;return this._head=void 0,this._length=0,!0}reverse(){let e=this._head,t=this.tail,s=(this._length>>>1)+(this._length&1);for(;e&&t&&s>0;){let r=e.value;e.value=t.value,t.value=r,e=e.next,t=t.prev,s--}return this}setHead(e){let t=this._head;return t?(t.value=e,t):this.prepend(e)}setNth(e,t){let s=this.nthCell(e);return!s&&yt(e),s.value=t,s}setTail(e){let t=this.tail;return t?(t.value=e,t):this.append(e)}swap(e,t){if(e!==t){let s=e.value;e.value=t.value,t.value=s}return this}toArray(e=[]){return this.traverse(t=>(e.push(t.value),!0)),e}toJSON(){return this.toArray()}toString(){let e=[];return this.traverse(t=>(e.push(String(t.value)),!0)),e.join(", ")}traverse(e,t=this._head,s){if(!this._head)return;let r=t;do{if(!e(r))break;r=r.next}while(r!==s);return r}_map(e,t){return this.traverse(s=>(e.append(t(s.value)),!0)),e}};function*$t(m,e){for(;e;)yield e.value,e=e[m]}var de=class extends Ne{_tail;constructor(e){super(),e&&this.into(e)}get tail(){return this._tail}append(e){if(this._tail){let t={value:e,prev:this._tail};return this._tail.next=t,this._tail=t,this._length++,t}else return this.prepend(e)}asHead(e){return e===this._head?this:(this.remove(e),this._head.prev=e,e.next=this._head,e.prev=void 0,this._head=e,this._length++,this)}asTail(e){return e===this._tail?this:(this.remove(e),this._tail.next=e,e.prev=this._tail,e.next=void 0,this._tail=e,this._length++,this)}cons(e){return this.prepend(e),this}copy(){return new de(this)}*cycle(){for(;;)yield*this}drop(){let e=this._head;if(e)return this._head=e.next,this._head?this._head.prev=void 0:this._tail=void 0,this._length--,e.value}empty(){return new de}insertAfter(e,t){let s={value:t,next:e.next,prev:e};return e.next?e.next.prev=s:this._tail=s,e.next=s,this._length++,s}insertAfterNth(e,t){return e<0&&(e+=this._length),e>=this._length-1?this.append(t):(st(e,0,this._length),this.insertAfter(this.nthCellUnsafe(e),t))}insertBefore(e,t){let s={value:t,next:e,prev:e.prev};return e.prev?e.prev.next=s:this._head=s,e.prev=s,this._length++,s}insertBeforeNth(e,t){return e<0&&(e+=this._length),e<=0?this.prepend(t):(st(e,0,this._length),this.insertBefore(this.nthCellUnsafe(e),t))}map(e){return this._map(new de,e)}nth(e,t){let s=this.nthCell(e);return s?s.value:t}nthCell(e){if(e<0&&(e+=this._length),!(e<0||e>=this._length))return this.nthCellUnsafe(e)}pop(){let e=this._tail;if(e)return this._tail=e.prev,this._tail?this._tail.next=void 0:this._head=void 0,this._length--,e.value}prepend(e){let t={value:e,next:this._head};return this._head?this._head.prev=t:this._tail=t,this._head=t,this._length++,t}push(e){return this.append(e),this}release(){return this._tail=void 0,super.release()}remove(e){return e.prev?e.prev.next=e.next:this._head=e.next,e.next?e.next.prev=e.prev:this._tail=e.prev,this._length--,this}rotateLeft(){switch(this._length){case 0:case 1:return this;case 2:return this.swap(this._head,this._tail);default:return this.push(this.drop())}}rotateRight(){switch(this._length){case 0:case 1:return this;case 2:return this.swap(this._head,this._tail);default:let e=this.peek();return this.pop(),this.prepend(e),this}}seq(e=0,t=this.length){if(e>=t||e<0)return;let s=this.nthCell(e),r=this.nthCell(t-1),i=a=>({first(){return a.value},next(){return a!==r&&a.next?i(a.next):void 0}});return s?i(s):void 0}shuffle(e,t=Dt){if(this._length<2)return this;for(e=e!==void 0?e:Math.ceil(1.5*Math.log2(this._length));e>0;e--){let s=this._head;for(;s;){let r=s.next;t.probability(.5)?this.asHead(s):this.asTail(s),s=r}}return this}slice(e=0,t=this.length){let s=e<0?e+this._length:e,r=t<0?t+this._length:t;(s<0||r<0)&&Lt("invalid indices: ${from} / ${to}");let i=new de,a=this.nthCell(s);for(;a&&++s<=r;)i.push(a.value),a=a.next;return i}sort(e=He){if(!this._length)return this;let t=1;for(;;){let s=this._head;this._head=void 0,this._tail=void 0;let r=0;for(;s;){r++;let i=s,a=0;for(let u=0;u<t&&(a++,i=i.next,!!i);u++);let c=t;for(;a>0||c>0&&i;){let u;a===0?(u=i,i=i.next,c--):!i||c===0||e(s.value,i.value)<=0?(u=s,s=s.next,a--):(u=i,i=i.next,c--),this._tail?this._tail.next=u:this._head=u,u.prev=this._tail,this._tail=u}s=i}if(this._tail.next=void 0,r<=1)return this;t*=2}}splice(e,t=0,s){let r;typeof e=="number"?(e<0&&(e+=this._length),st(e,0,this._length),r=this.nthCellUnsafe(e)):r=e;let i=new de;if(t>0)for(;r&&t-- >0;)this.remove(r),i.push(r.value),r=r.next;else r&&(r=r.next);if(s)if(r)for(let a of s)this.insertBefore(r,a);else for(let a of s)this.push(a);return i}};var Te=class{map;items;opts;_size;constructor(e,t){let s=Object.assign({maxlen:1/0,maxsize:1/0,map:()=>new Map,ksize:()=>0,vsize:()=>0},t);this.map=s.map(),this.items=new de,this._size=0,this.opts=s,e&&this.into(e)}get length(){return this.items.length}get size(){return this._size}[Symbol.iterator](){return this.entries()}entries(){return Ue(e=>[e.k,e],this.items)}keys(){return Ue(e=>e.k,this.items)}values(){return Ue(e=>e.v,this.items)}copy(){let e=this.empty();e.items=this.items.copy();let t=e.items.head;for(;t;)e.map.set(t.value.k,t),t=t.next;return e}empty(){return new Te(null,this.opts)}release(){this._size=0,this.map.clear();let e=this.opts.release;if(e){let t;for(;t=this.items.drop();)e(t.k,t.v);return!0}return this.items.release()}has(e){return this.map.has(e)}get(e,t){let s=this.map.get(e);return s?this.resetEntry(s):t}set(e,t){let s=this.opts.ksize(e)+this.opts.vsize(t),r=this.map.get(e);return this._size+=Math.max(0,s-(r?r.value.s:0)),this.ensureSize()&&this.doSetEntry(r,e,t,s),t}into(e){for(let t of e)this.set(t[0],t[1]);return this}getSet(e,t){let s=this.map.get(e);return s?Promise.resolve(this.resetEntry(s)):t().then(r=>this.set(e,r))}delete(e){let t=this.map.get(e);return t?(this.removeEntry(t),!0):!1}resetEntry(e){return this.items.asTail(e),e.value.v}ensureSize(){let e=this.opts.release,t=this.opts.maxsize,s=this.opts.maxlen;for(;this._size>t||this.length>=s;){let r=this.items.drop();if(!r)return!1;this.map.delete(r.k),e&&e(r.k,r.v),this._size-=r.s}return!0}removeEntry(e){let t=e.value;this.map.delete(t.k),this.items.remove(e),this.opts.release&&this.opts.release(t.k,t.v),this._size-=t.s}doSetEntry(e,t,s,r){e?(e.value.v=s,e.value.s=r,this.items.asTail(e)):(this.items.push({k:t,v:s,s:r}),this.map.set(t,this.items.tail))}};var Ot=class extends qe{feeCache;disconnectSubscribeNewHeads=null;constructor(e){super(e),this.feeCache=new Te(null),this.api.rpc.chain.subscribeNewHeads(async t=>{this.feeCache.release()}).then(t=>{this.disconnectSubscribeNewHeads=t})}async getPoolFees(e,t){let s=[t.address,e].join("-");if(this.feeCache.has(s))return this.feeCache.get(s);{let i=await super.getPoolFees(e,t);return this.feeCache.set(s,i),i}}async destroy(){console.log(`Destroying pool cache!
2
- Items: [${this.feeCache.length}]`),this.feeCache.release(),this.disconnectSubscribeNewHeads?.()}};var Oe=class{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;fee;repayFeeApply;static fromPool(e){return new Oe(e.address,e.tokens,e.maxInRatio,e.maxOutRatio,e.minTradingLimit,e.fee,e.repayFeeApply)}constructor(e,t,s,r,i,a,c){this.type="Lbp",this.address=e,this.tokens=t,this.maxInRatio=s,this.maxOutRatio=r,this.minTradingLimit=i,this.fee=a,this.repayFeeApply=c}validatePair(e,t){return!0}parsePair(e,t){let s=new Map(this.tokens.map(u=>[u.id,u])),r=s.get(e),i=s.get(t);if(r==null)throw new Error("Pool does not contain tokenIn");if(i==null)throw new Error("Pool does not contain tokenOut");let a=v(r.balance),c=v(i.balance);return{assetIn:e,assetOut:t,balanceIn:a,balanceOut:c,decimalsIn:r.decimals,decimalsOut:i.decimals,weightIn:r.weight,weightOut:i.weight}}validateAndBuy(e,t,s){let r=this.tokens[0].id,i=[];t.isLessThan(this.minTradingLimit)&&i.push("InsufficientTradingAmount");let a=e.balanceOut.div(this.maxOutRatio);if(t.isGreaterThan(a)&&i.push("MaxOutRatioExceeded"),r===e.assetOut){let c=this.calculateTradeFee(t,s),u=ue(this.repayFeeApply?s.repayFee:s.exchangeFee),y=t.plus(c),O=this.calculateInGivenOut(e,y),B=e.balanceIn.div(this.maxInRatio);return O.isGreaterThan(B)&&i.push("MaxInRatioExceeded"),{amountIn:O,calculatedIn:O,amountOut:t,feePct:u,errors:i}}else{let c=this.calculateInGivenOut(e,t),u=e.balanceIn.div(this.maxInRatio);return c.isGreaterThan(u)&&i.push("MaxInRatioExceeded"),{amountIn:c,calculatedIn:c,amountOut:t,feePct:0,errors:i}}}validateAndSell(e,t,s){let r=this.tokens[0].id,i=[];t.isLessThan(this.minTradingLimit)&&i.push("InsufficientTradingAmount");let a=e.balanceIn.div(this.maxInRatio);if(t.isGreaterThan(a)&&i.push("MaxInRatioExceeded"),r===e.assetIn){let c=this.calculateOutGivenIn(e,t),u=e.balanceOut.div(this.maxOutRatio);return c.isGreaterThan(u)&&i.push("MaxOutRatioExceeded"),{amountIn:t,calculatedOut:c,amountOut:c,feePct:0,errors:i}}else{let c=this.calculateOutGivenIn(e,t),u=this.calculateTradeFee(c,s),y=ue(this.repayFeeApply?s.repayFee:s.exchangeFee),O=c.minus(u),B=e.balanceOut.div(this.maxOutRatio);return O.isGreaterThan(B)&&i.push("MaxOutRatioExceeded"),{amountIn:t,calculatedOut:c,amountOut:O,feePct:y,errors:i}}}calculateInGivenOut(e,t){let s=me.calculateInGivenOut(e.balanceIn.toString(),e.balanceOut.toString(),e.weightIn.toString(),e.weightOut.toString(),t.toFixed(0)),r=v(s);return r.isNegative()?R:r}calculateOutGivenIn(e,t){let s=me.calculateOutGivenIn(e.balanceIn.toString(),e.balanceOut.toString(),e.weightIn.toString(),e.weightOut.toString(),t.toFixed(0)),r=v(s);return r.isNegative()?R:r}spotPriceInGivenOut(e){let t=me.getSpotPrice(e.balanceOut.toString(),e.balanceIn.toString(),e.weightOut.toString(),e.weightIn.toString(),J(le,e.decimalsOut).toString());return v(t)}spotPriceOutGivenIn(e){let t=me.getSpotPrice(e.balanceIn.toString(),e.balanceOut.toString(),e.weightIn.toString(),e.weightOut.toString(),J(le,e.decimalsIn).toString());return v(t)}calculateTradeFee(e,t){let s=me.calculatePoolTradeFee(e.toString(),this.repayFeeApply?t.repayFee[0]:t.exchangeFee[0],this.repayFeeApply?t.repayFee[1]:t.exchangeFee[1]);return v(s)}};import{calculate_in_given_out as vs,calculate_lrna_in_given_out as Is,calculate_out_given_in as As,calculate_out_given_lrna_in as Ns,calculate_pool_trade_fee as Ts,calculate_spot_price as Fs,calculate_lrna_spot_price as _s,calculate_shares as Es,calculate_liquidity_out as Rs,calculate_liquidity_lrna_out as ks,verify_asset_cap as Ls,calculate_liquidity_hub_in as Ms,is_sell_allowed as Ds,is_buy_allowed as Cs,is_add_liquidity_allowed as Gs,is_remove_liquidity_allowed as qs}from"@galacticcouncil/math-omnipool";var W=class{static calculateSpotPrice(e,t,s,r){return Fs(e,t,s,r)}static calculateLrnaSpotPrice(e,t){return _s(e,t)}static calculateInGivenOut(e,t,s,r,i,a,c,u,y){return vs(e,t,s,r,i,a,c,u,y)}static calculateLrnaInGivenOut(e,t,s,r,i){return Is(e,t,s,r,i)}static calculateOutGivenIn(e,t,s,r,i,a,c,u,y){return As(e,t,s,r,i,a,c,u,y)}static calculateOutGivenLrnaIn(e,t,s,r,i){return Ns(e,t,s,r,i)}static calculatePoolTradeFee(e,t,s){return Ts(e,t,s)}static calculateShares(e,t,s,r){return Es(e,t,s,r)}static calculateLiquidityOut(e,t,s,r,i,a,c,u){return Rs(e,t,s,r,i,a,c,u)}static calculateLiquidityLRNAOut(e,t,s,r,i,a,c,u){return ks(e,t,s,r,i,a,c,u)}static calculateCapDifference(e,t,s,r){let i=G(t),a=G(e),c=G(r),y=G(s).shiftedBy(-18);if(i.div(c).lt(y)){let B=y.times(c).minus(i).times(a),N=i.times(G(1).minus(y));return B.div(N).toFixed(0)}else return"0"}static verifyAssetCap(e,t,s,r){return Ls(e,t,s,r)}static calculateLimitHubIn(e,t,s,r){return Ms(e,t,s,r)}static isSellAllowed(e){return Ds(e)}static isBuyAllowed(e){return Cs(e)}static isAddLiquidityAllowed(e){return Gs(e)}static isRemoveLiquidityAllowed(e){return qs(e)}};var Be=class{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;hubAssetId;static fromPool(e){return new Be(e.address,e.tokens,e.maxInRatio,e.maxOutRatio,e.minTradingLimit,e.hubAssetId)}constructor(e,t,s,r,i,a){this.type="Omnipool",this.address=e,this.tokens=t,this.maxInRatio=s,this.maxOutRatio=r,this.minTradingLimit=i,this.hubAssetId=a}validatePair(e,t){return this.hubAssetId!=t}parsePair(e,t){let s=new Map(this.tokens.map(O=>[O.id,O])),r=s.get(e),i=s.get(t);if(r==null)throw new Error("Pool does not contain tokenIn");if(i==null)throw new Error("Pool does not contain tokenOut");let a=v(r.balance),c=v(i.balance),u=v(r.existentialDeposit),y=v(i.existentialDeposit);return{assetIn:e,assetOut:t,hubReservesIn:r.hubReserves,hubReservesOut:i.hubReserves,sharesIn:r.shares,sharesOut:i.shares,decimalsIn:r.decimals,decimalsOut:i.decimals,balanceIn:a,balanceOut:c,tradeableIn:r.tradeable,tradeableOut:i.tradeable,assetInED:u,assetOutED:y}}validateAndBuy(e,t,s){let r=this.calculateInGivenOut(e,t),i=this.calculateInGivenOut(e,t,s),a=i.minus(r),c=r===R?R:a.div(r).multipliedBy(100).decimalPlaces(2),u=[],y=W.isSellAllowed(e.tradeableIn),O=W.isBuyAllowed(e.tradeableOut);(!y||!O)&&u.push("TradeNotAllowed"),(t.isLessThan(this.minTradingLimit)||r.isLessThan(e.assetInED))&&u.push("InsufficientTradingAmount");let B=e.balanceOut.div(this.maxOutRatio);t.isGreaterThan(B)&&u.push("MaxOutRatioExceeded");let N=e.balanceIn.div(this.maxInRatio);return i.isGreaterThan(N)&&u.push("MaxInRatioExceeded"),{amountIn:i,calculatedIn:r,amountOut:t,feePct:c.toNumber(),errors:u}}validateAndSell(e,t,s){let r=this.calculateOutGivenIn(e,t),i=this.calculateOutGivenIn(e,t,s),c=r.minus(i).div(r).multipliedBy(100).decimalPlaces(2),u=[],y=W.isSellAllowed(e.tradeableIn),O=W.isBuyAllowed(e.tradeableOut);(!y||!O)&&u.push("TradeNotAllowed"),(t.isLessThan(this.minTradingLimit)||r.isLessThan(e.assetOutED))&&u.push("InsufficientTradingAmount");let B=e.balanceIn.div(this.maxInRatio);t.isGreaterThan(B)&&u.push("MaxInRatioExceeded");let N=e.balanceOut.div(this.maxOutRatio);return i.isGreaterThan(N)&&u.push("MaxOutRatioExceeded"),{amountIn:t,calculatedOut:r,amountOut:i,feePct:c.toNumber(),errors:u}}calculateInGivenOut(e,t,s){if(e.assetIn==this.hubAssetId)return this.calculateLrnaInGivenOut(e,t,s);let r=W.calculateInGivenOut(e.balanceIn.toString(),e.hubReservesIn.toString(),e.sharesIn.toString(),e.balanceOut.toString(),e.hubReservesOut.toString(),e.sharesOut.toString(),t.toFixed(0),s?ee(s.assetFee).toString():R.toString(),s?ee(s.protocolFee).toString():R.toString()),i=v(r);return i.isNegative()?R:i}calculateLrnaInGivenOut(e,t,s){let r=W.calculateLrnaInGivenOut(e.balanceOut.toString(),e.hubReservesOut.toString(),e.sharesOut.toString(),t.toFixed(0),s?ee(s.assetFee).toString():R.toString()),i=v(r);return i.isNegative()?R:i}calculateOutGivenIn(e,t,s){if(e.assetIn==this.hubAssetId)return this.calculateOutGivenLrnaIn(e,t,s);let r=W.calculateOutGivenIn(e.balanceIn.toString(),e.hubReservesIn.toString(),e.sharesIn.toString(),e.balanceOut.toString(),e.hubReservesOut.toString(),e.sharesOut.toString(),t.toFixed(0),s?ee(s.assetFee).toString():R.toString(),s?ee(s.protocolFee).toString():R.toString()),i=v(r);return i.isNegative()?R:i}calculateOutGivenLrnaIn(e,t,s){let r=W.calculateOutGivenLrnaIn(e.balanceOut.toString(),e.hubReservesOut.toString(),e.sharesOut.toString(),t.toFixed(0),s?ee(s.assetFee).toString():R.toString()),i=v(r);return i.isNegative()?R:i}spotPriceInGivenOut(e){if(e.assetIn==this.hubAssetId)return this.spotPriceLrnaInGivenOut(e);let t=W.calculateSpotPrice(e.balanceOut.toString(),e.hubReservesOut.toString(),e.balanceIn.toString(),e.hubReservesIn.toString());return v(t).shiftedBy(-1*(Le-e.decimalsOut)).decimalPlaces(0,1)}spotPriceLrnaInGivenOut(e){let t=W.calculateLrnaSpotPrice(e.hubReservesOut.toString(),e.balanceOut.toString());return v(t).shiftedBy(-1*(Le-e.decimalsOut)).decimalPlaces(0,1)}spotPriceOutGivenIn(e){if(e.assetIn==this.hubAssetId)return this.spotPriceOutGivenLrnaIn(e);let t=W.calculateSpotPrice(e.balanceIn.toString(),e.hubReservesIn.toString(),e.balanceOut.toString(),e.hubReservesOut.toString());return v(t).shiftedBy(-1*(Le-e.decimalsIn)).decimalPlaces(0,1)}spotPriceOutGivenLrnaIn(e){let t=W.calculateLrnaSpotPrice(e.balanceOut.toString(),e.hubReservesOut.toString());return v(t).shiftedBy(-1*(Le-e.decimalsIn)).decimalPlaces(0,1)}};var ve=class{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;amplification;id;fee;totalIssuance;static fromPool(e){return new ve(e.address,e.tokens,e.maxInRatio,e.maxOutRatio,e.minTradingLimit,e.amplification,e.id,e.fee,e.totalIssuance)}constructor(e,t,s,r,i,a,c,u,y){this.type="Stableswap",this.address=e,this.tokens=t,this.maxInRatio=s,this.maxOutRatio=r,this.minTradingLimit=i,this.amplification=a,this.id=c,this.fee=u,this.totalIssuance=y}validatePair(e,t){return!0}parsePair(e,t){let s=new Map(this.tokens.map(O=>[O.id,O])),r=s.get(e),i=s.get(t);if(r==null)throw new Error("Pool does not contain tokenIn");if(i==null)throw new Error("Pool does not contain tokenOut");let a=v(r.balance),c=v(i.balance),u=v(r.existentialDeposit),y=v(i.existentialDeposit);return{assetIn:e,assetOut:t,balanceIn:a,balanceOut:c,decimalsIn:r.decimals,decimalsOut:i.decimals,tradeableIn:this.id===e?dt:r.tradeable,tradeableOut:this.id===t?dt:i.tradeable,assetInED:u,assetOutED:y}}validateAndBuy(e,t,s){let r=this.calculateInGivenOut(e,t),i=this.calculateInGivenOut(e,t,s),a=ue(s.fee),c=[],u=W.isSellAllowed(e.tradeableIn),y=W.isBuyAllowed(e.tradeableOut);return(!u||!y)&&c.push("TradeNotAllowed"),(t.isLessThan(this.minTradingLimit)||r.isLessThan(e.assetInED))&&c.push("InsufficientTradingAmount"),{amountIn:i,calculatedIn:r,amountOut:t,feePct:a,errors:c}}validateAndSell(e,t,s){let r=this.calculateOutGivenIn(e,t),i=this.calculateOutGivenIn(e,t,s),a=ue(s.fee),c=[],u=W.isSellAllowed(e.tradeableIn),y=W.isBuyAllowed(e.tradeableOut);return(!u||!y)&&c.push("TradeNotAllowed"),(t.isLessThan(this.minTradingLimit)||r.isLessThan(e.assetOutED))&&c.push("InsufficientTradingAmount"),{amountIn:t,calculatedOut:r,amountOut:i,feePct:a,errors:c}}calculateIn(e,t,s){let r=te.calculateInGivenOut(this.getReserves(),Number(e.assetIn),Number(e.assetOut),t.toFixed(0),this.amplification,s?ee(s.fee).toString():R.toString()),i=v(r);return i.isNegative()?R:i}calculateAddOneAsset(e,t,s){let r=te.calculateAddOneAsset(this.getReserves(),t.toFixed(0),Number(e.assetIn),this.amplification,this.totalIssuance,s?ee(s.fee).toString():R.toString()),i=v(r);return i.isNegative()?R:i}calculateSharesForAmount(e,t,s){let r=te.calculateSharesForAmount(this.getReserves(),Number(e.assetOut),t.toFixed(0),this.amplification,this.totalIssuance,s?ee(s.fee).toString():R.toString()),i=v(r);return i.isNegative()?R:i}calculateInGivenOut(e,t,s){return e.assetOut==this.id?this.calculateAddOneAsset(e,t,s):e.assetIn==this.id?this.calculateSharesForAmount(e,t,s):this.calculateIn(e,t,s)}spotPriceInGivenOut(e){let t=J(le,e.decimalsOut);return e.assetOut==this.id?this.calculateAddOneAsset(e,t):e.assetIn==this.id?this.calculateSharesForAmount(e,t):this.calculateIn(e,t)}calculateOut(e,t,s){let r=te.calculateOutGivenIn(this.getReserves(),Number(e.assetIn),Number(e.assetOut),t.toFixed(0),this.amplification,s?ee(s.fee).toString():R.toString()),i=v(r);return i.isNegative()?R:i}calculateWithdrawOneAsset(e,t,s){let r=te.calculateLiquidityOutOneAsset(this.getReserves(),t.toFixed(0),Number(e.assetOut),this.amplification,this.totalIssuance,s?ee(s.fee).toString():R.toString()),i=v(r);return i.isNegative()?R:i}calculateShares(e,t,s){let r=te.calculateShares(this.getReserves(),this.getAssets(e.assetIn,t),this.amplification,this.totalIssuance,s?ee(s.fee).toString():R.toString()),i=v(r);return i.isNegative()?R:i}calculateOutGivenIn(e,t,s){return e.assetIn==this.id?this.calculateWithdrawOneAsset(e,t,s):e.assetOut==this.id?this.calculateShares(e,t,s):this.calculateOut(e,t,s)}spotPriceOutGivenIn(e){let t=J(le,e.decimalsIn);return e.assetIn==this.id?this.calculateWithdrawOneAsset(e,t):e.assetOut==this.id?this.calculateShares(e,t):this.calculateOut(e,t)}calculateTradeFee(e,t){let s=te.calculatePoolTradeFee(e.toString(),t.fee[0],t.fee[1]);return v(s)}getReserves(){let e=this.tokens.filter(t=>t.id!=this.id).map(({id:t,balance:s,decimals:r})=>({asset_id:Number(t),amount:s,decimals:r}));return JSON.stringify(e)}getAssets(e,t){let s={asset_id:Number(e),amount:t.toFixed(0)};return JSON.stringify([s])}};import{calculate_in_given_out as Hs,calculate_out_given_in as Us,calculate_pool_trade_fee as zs,get_spot_price as Xs,calculate_liquidity_in as Ws,calculate_shares as Ys,calculate_spot_price as $s,calculate_spot_price_with_fee as js,calculate_liquidity_out_asset_a as Js,calculate_liquidity_out_asset_b as Ks}from"@galacticcouncil/math-xyk";var be=class{static getSpotPrice(e,t,s){return Xs(e,t,s)}static calculateInGivenOut(e,t,s){return Hs(e,t,s)}static calculateOutGivenIn(e,t,s){return Us(e,t,s)}static calculatePoolTradeFee(e,t,s){return zs(e,t,s)}static calculateLiquidityIn(e,t,s){return Ws(e,t,s)}static calculateSpotPrice(e,t){return $s(e,t)}static calculateSpotPriceWithFee(e,t,s,r){return js(e,t,s,r)}static calculateShares(e,t,s){return Ys(e,t,s)}static calculateLiquidityOutAssetA(e,t,s,r){return Js(e,t,s,r)}static calculateLiquidityOutAssetB(e,t,s,r){return Ks(e,t,s,r)}};var Ie=class{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;static fromPool(e){return new Ie(e.address,e.tokens,e.maxInRatio,e.maxOutRatio,e.minTradingLimit)}constructor(e,t,s,r,i){this.type="Xyk",this.address=e,this.tokens=t,this.maxInRatio=s,this.maxOutRatio=r,this.minTradingLimit=i}validatePair(e,t){return!0}parsePair(e,t){let s=new Map(this.tokens.map(O=>[O.id,O])),r=s.get(e),i=s.get(t);if(r==null)throw new Error("Pool does not contain tokenIn");if(i==null)throw new Error("Pool does not contain tokenOut");let a=v(r.balance),c=v(i.balance),u=v(r.existentialDeposit),y=v(i.existentialDeposit);return{assetIn:e,assetOut:t,decimalsIn:r.decimals,decimalsOut:i.decimals,balanceIn:a,balanceOut:c,assetInED:u,assetOutED:y}}validateAndBuy(e,t,s){let r=this.calculateInGivenOut(e,t),i=this.calculateTradeFee(r,s),a=ue(s.exchangeFee),c=r.plus(i),u=[];(t.isLessThan(this.minTradingLimit)||r.isLessThan(e.assetInED))&&u.push("InsufficientTradingAmount");let y=e.balanceOut.div(this.maxOutRatio);t.isGreaterThan(y)&&u.push("MaxOutRatioExceeded");let O=e.balanceIn.div(this.maxInRatio);return c.isGreaterThan(O)&&u.push("MaxInRatioExceeded"),{amountIn:c,calculatedIn:r,amountOut:t,feePct:a,errors:u}}validateAndSell(e,t,s){let r=this.calculateOutGivenIn(e,t),i=this.calculateTradeFee(r,s),a=ue(s.exchangeFee),c=r.minus(i),u=[];(t.isLessThan(this.minTradingLimit)||r.isLessThan(e.assetOutED))&&u.push("InsufficientTradingAmount");let y=e.balanceIn.div(this.maxInRatio);t.isGreaterThan(y)&&u.push("MaxInRatioExceeded");let O=e.balanceOut.div(this.maxOutRatio);return c.isGreaterThan(O)&&u.push("MaxOutRatioExceeded"),{amountIn:t,calculatedOut:r,amountOut:c,feePct:a,errors:u}}calculateInGivenOut(e,t){let s=be.calculateInGivenOut(e.balanceIn.toString(),e.balanceOut.toString(),t.toFixed(0)),r=v(s);return r.isNegative()?R:r}calculateOutGivenIn(e,t){let s=be.calculateOutGivenIn(e.balanceIn.toString(),e.balanceOut.toString(),t.toFixed(0)),r=v(s);return r.isNegative()?R:r}spotPriceInGivenOut(e){let t=be.calculateSpotPrice(e.balanceOut.toString(),e.balanceIn.toString()),s=J(le,18-e.decimalsOut);return v(t).div(s)}spotPriceOutGivenIn(e){let t=be.calculateSpotPrice(e.balanceIn.toString(),e.balanceOut.toString()),s=J(le,18-e.decimalsIn);return v(t).div(s)}calculateTradeFee(e,t){let s=be.calculatePoolTradeFee(e.toString(),t.exchangeFee[0],t.exchangeFee[1]);return v(s)}};var ze=class{static get(e){switch(e.type){case"Xyk":return Ie.fromPool(e);case"Omnipool":return Be.fromPool(e);case"Lbp":return Oe.fromPool(e);case"Stableswap":return ve.fromPool(e);default:throw new Error("Pool type "+e.type+" is not supported yet")}}};var Fe=class{routeSuggester;routerOptions;poolService;defaultRouterOptions={includeOnly:[]};constructor(e,t){this.poolService=e,this.routeSuggester=new Re,this.routerOptions={...this.defaultRouterOptions,...t}}async getPools(){let e=this.routerOptions.includeOnly;return await this.poolService.getPools(e)}async getAllAssets(){let e=await this.getPools();if(e.length===0)throw new Error("No pools configured");let t=await this.getAssets(e);return[...new Map(t).values()]}async getAssetPairs(e){let t=await this.getPools();if(t.length===0)throw new Error("No pools configured");let{assets:s,poolsMap:r}=await this.validateToken(e,t),a=this.getPaths(e,null,r,t).map(c=>c[c.length-1].assetOut);return this.toAssets([...new Set(a)],s)}async getAllPaths(e,t){let s=await this.getPools();if(s.length===0)throw new Error("No pools configured");let{poolsMap:r}=await this.validateTokenPair(e,t,s);return this.getPaths(e,t,r,s)}async getAssets(e){let t=e.map(s=>s.tokens.map(r=>({id:r.id,name:r.name,symbol:r.symbol,decimals:r.decimals,icon:r.icon,type:r.type,isSufficient:r.isSufficient,existentialDeposit:r.existentialDeposit,origin:r.origin,meta:r.meta,externalId:r.externalId,isWhiteListed:r.isWhiteListed}))).flat();return new Map(t.map(s=>[s.id,s]))}getPaths(e,t,s,r){return this.routeSuggester.getProposals(e,t,r).filter(c=>this.validPath(c,s)).map(c=>this.toHops(c,s))}async validateTokenPair(e,t,s){let r=await this.getAssets(s);if(r.get(e)==null)throw new Error(e+" is not supported token");if(r.get(t)==null)throw new Error(t+" is not supported token");let i=this.getPoolMap(s);return{assets:r,poolsMap:i}}async validateToken(e,t){let s=await this.getAssets(t);if(s.get(e)==null)throw new Error(e+" is not supported token");let r=this.getPoolMap(t);return{assets:s,poolsMap:r}}getPoolMap(e){return new Map(e.map(t=>[t.address,ze.get(t)]))}validPath(e,t){return e.length>0&&e.map(s=>this.validEdge(s,t)).reduce((s,r)=>s&&r)}validEdge([e,t,s],r){return r.get(e)?.validatePair(t,s)||!1}toHops(e,t){return e.map(([s,r,i])=>{let a=t.get(s);return{poolAddress:s,poolId:a?.id,pool:a?.type,assetIn:r,assetOut:i}})}toAssets(e,t){return e.map(s=>t.get(s))}};function Tl(m,e){return m.minus(e).abs().div(m.plus(e).div(2)).multipliedBy(100).decimalPlaces(2)}function Xe(m,e){return m.minus(e).div(e).multipliedBy(100).decimalPlaces(2)}function jt(m,e){return le.minus(e.div(m)).multipliedBy(100).decimalPlaces(2)}function Jt(m,e){return e.div(m).minus(le).multipliedBy(100).decimalPlaces(2)}var lt=class extends Fe{isDirectTrade(e){return e.length==1}findBestSellRoute(e){let t=e.sort((s,r)=>{let i=s[s.length-1].amountOut,a=r[r.length-1].amountOut;return i.isGreaterThan(a)?-1:1});return t.find(s=>s.every(r=>r.errors.length==0))||t[0]}getRouteFeeRange(e){if(e.filter(s=>s.tradeFeeRange).length>0){let s=e.map(i=>i.tradeFeeRange?.[0]??i.tradeFeePct).reduce((i,a)=>i+a),r=e.map(i=>i.tradeFeeRange?.[1]??i.tradeFeePct).reduce((i,a)=>i+a);return[s,r]}}getPoolFeeRange(e){let t=e.min?ue(e.min):void 0,s=e.max?ue(e.max):void 0;if(t&&s)return[t,s]}async getBestSell(e,t,s){return this.getSell(e,t,s)}async getSell(e,t,s,r){let i=await super.getPools();if(i.length===0)throw new Error("No pools configured");let{poolsMap:a}=await super.validateTokenPair(e,t,i),c=super.getPaths(e,t,a,i);if(c.length===0)throw new Ge(e,t);let u;if(r)u=await this.toSellSwaps(s,r,a);else{let E=c.map(async n=>await this.toSellSwaps(s,n,a)),X=await Promise.all(E);u=this.findBestSellRoute(X)}let y=u[0],O=u[u.length-1],B=this.isDirectTrade(u),N=u.map(E=>E.spotPrice.shiftedBy(-1*E.assetOutDecimals)).reduce((E,X)=>E.multipliedBy(X)),F=J(N,O.assetOutDecimals),_=B?O.calculatedOut:this.calculateDelta0Y(y.amountIn,u,a),D=O.amountOut,k=B?O.tradeFeePct:jt(_,D).toNumber(),H=_.minus(D),w=this.getRouteFeeRange(u),j=y.amountIn.shiftedBy(-1*y.assetInDecimals).multipliedBy(F),se=Xe(_,j),fe=E=>this.poolService.buildSellTx(e,t,y.amountIn,E,u.map(X=>X));return{type:"Sell",amountIn:y.amountIn,amountOut:O.amountOut,spotPrice:F,tradeFee:H,tradeFeePct:k,tradeFeeRange:w,priceImpactPct:se.toNumber(),swaps:u,toTx:fe,toHuman(){return{type:"Sell",amountIn:K(y.amountIn,y.assetInDecimals),amountOut:K(O.amountOut,O.assetOutDecimals),spotPrice:K(F,O.assetOutDecimals),tradeFee:K(H,O.assetOutDecimals),tradeFeePct:k,tradeFeeRange:w,priceImpactPct:se.toNumber(),swaps:u.map(E=>E.toHuman())}}}}calculateDelta0Y(e,t,s){let r=[];for(let i=0;i<t.length;i++){let a=t[i],c=s.get(a.poolAddress);if(c==null)throw new Error("Pool does not exit");let u=c.parsePair(a.assetIn,a.assetOut),y;i>0?y=r[i-1]:y=e;let O=c.calculateOutGivenIn(u,y);r.push(O)}return r[r.length-1]}async toSellSwaps(e,t,s){let r=[];for(let i=0;i<t.length;i++){let a=t[i],c=s.get(a.poolAddress);if(c==null)throw new Error("Pool does not exit");let u=c.parsePair(a.assetIn,a.assetOut),y;i>0?y=r[i-1].amountOut:y=J(v(e),u.decimalsIn).decimalPlaces(0,1);let O=await this.poolService.getPoolFees(u.assetOut,c),{amountOut:B,calculatedOut:N,feePct:F,errors:_}=c.validateAndSell(u,y,O),D=this.getPoolFeeRange(O),k=c.spotPriceOutGivenIn(u),H=y.shiftedBy(-1*u.decimalsIn).multipliedBy(k),w=Xe(N,H);r.push({...a,assetInDecimals:u.decimalsIn,assetOutDecimals:u.decimalsOut,amountIn:y,calculatedOut:N,amountOut:B,spotPrice:k,tradeFeePct:F,tradeFeeRange:D,priceImpactPct:w.toNumber(),errors:_,toHuman(){return{...a,amountIn:K(y,u.decimalsIn),calculatedOut:K(N,u.decimalsOut),amountOut:K(B,u.decimalsOut),spotPrice:K(k,u.decimalsOut),tradeFeePct:F,tradeFeeRange:D,priceImpactPct:w.toNumber(),errors:_}}})}return r}async getBestSpotPrice(e,t){let s=await super.getPools();if(s.length===0)throw new Error("No pools configured");let{poolsMap:r}=await super.validateTokenPair(e,t,s),i=super.getPaths(e,t,r,s);if(i.length===0)return Promise.resolve(void 0);let a=s.map(w=>w.tokens.find(j=>j.id===e)).filter(w=>!!w).sort((w,j)=>Number(j.balance)-Number(w.balance)),{balance:c,decimals:u}=a[0],O=v(c).shiftedBy(-1*u).div(100).multipliedBy(.1),B=i.map(async w=>await this.toSellSwaps(O,w,r)),N=await Promise.all(B),F=this.findBestSellRoute(N),_=await this.toSellSwaps("1",F,r),D=_.map(w=>w.spotPrice.shiftedBy(-1*w.assetOutDecimals)).reduce((w,j)=>w.multipliedBy(j)),k=_[_.length-1].assetOutDecimals;return{amount:J(D,k),decimals:k}}findBestBuyRoute(e){let t=e.sort((s,r)=>{let i=s[0].amountIn,a=r[0].amountIn;return i.isGreaterThan(a)?1:-1});return t.find(s=>s.every(r=>r.errors.length==0))||t[0]}async getBestBuy(e,t,s){return this.getBuy(e,t,s)}async getBuy(e,t,s,r){let i=await super.getPools();if(i.length===0)throw new Error("No pools configured");let{poolsMap:a}=await super.validateTokenPair(e,t,i),c=super.getPaths(e,t,a,i);if(c.length===0)throw new Ge(e,t);let u;if(r)u=await this.toBuySwaps(s,r,a);else{let E=c.map(async n=>await this.toBuySwaps(s,n,a)),X=await Promise.all(E);u=this.findBestBuyRoute(X)}let y=u[u.length-1],O=u[0],B=this.isDirectTrade(u),N=u.map(E=>E.spotPrice.shiftedBy(-1*E.assetInDecimals)).reduce((E,X)=>E.multipliedBy(X)),F=J(N,O.assetInDecimals),_=B?O.calculatedIn:this.calculateDelta0X(y.amountOut,u,a),D=O.amountIn,k=B?O.tradeFeePct:Jt(_,D).toNumber(),H=D.minus(_),w=this.getRouteFeeRange(u),j=y.amountOut.shiftedBy(-1*y.assetOutDecimals).multipliedBy(F),se;_.isZero()?se=-100:se=Xe(j,_).toNumber();let fe=E=>this.poolService.buildBuyTx(e,t,y.amountOut,E,u.map(X=>X));return{type:"Buy",amountOut:y.amountOut,amountIn:O.amountIn,spotPrice:F,tradeFee:H,tradeFeePct:k,tradeFeeRange:w,priceImpactPct:se,swaps:u,toTx:fe,toHuman(){return{type:"Buy",amountOut:K(y.amountOut,y.assetOutDecimals),amountIn:K(O.amountIn,O.assetInDecimals),spotPrice:K(F,O.assetInDecimals),tradeFee:K(H,O.assetInDecimals),tradeFeePct:k,tradeFeeRange:w,priceImpactPct:se,swaps:u.map(E=>E.toHuman())}}}}calculateDelta0X(e,t,s){let r=[];for(let i=t.length-1;i>=0;i--){let a=t[i],c=s.get(a.poolAddress);if(c==null)throw new Error("Pool does not exit");let u=c.parsePair(a.assetIn,a.assetOut),y;i==t.length-1?y=e:y=r[0];let O=c.calculateInGivenOut(u,y);r.unshift(O)}return r[0]}async toBuySwaps(e,t,s){let r=[];for(let i=t.length-1;i>=0;i--){let a=t[i],c=s.get(a.poolAddress);if(c==null)throw new Error("Pool does not exit");let u=c.parsePair(a.assetIn,a.assetOut),y;i==t.length-1?y=J(v(e),u.decimalsOut).decimalPlaces(0,1):y=r[0].amountIn;let O=await this.poolService.getPoolFees(u.assetOut,c),{amountIn:B,calculatedIn:N,feePct:F,errors:_}=c.validateAndBuy(u,y,O),D=this.getPoolFeeRange(O),k=c.spotPriceInGivenOut(u),H=y.shiftedBy(-1*u.decimalsOut).multipliedBy(k),w;N.isZero()?w=-100:w=Xe(H,N).toNumber(),r.unshift({...a,assetInDecimals:u.decimalsIn,assetOutDecimals:u.decimalsOut,amountOut:y,calculatedIn:N,amountIn:B,spotPrice:k,tradeFeePct:F,tradeFeeRange:D,priceImpactPct:w,errors:_,toHuman(){return{...a,amountOut:K(y,u.decimalsOut),calculatedIn:K(N,u.decimalsIn),amountIn:K(B,u.decimalsIn),spotPrice:K(k,u.decimalsIn),tradeFeePct:F,tradeFeeRange:D,priceImpactPct:w,errors:_}}})}return r}};export{De as AssetClient,_t as AssetNotFound,Br as BASILISK_PARACHAIN_ID,Ce as BalanceClient,G as BigNumber,Ot as CachingPoolService,Qt as DECIMAL_PLACES,ft as DENOMINATOR,Pt as FarmClient,Je as HYDRADX_OMNIPOOL_ADDRESS,Or as HYDRADX_PARACHAIN_ID,Me as HYDRADX_SS58_PREFIX,dr as INFINITY,me as LbpMath,Oe as LbpPool,le as ONE,W as OmniMath,Be as OmniPool,Ft as PoolConfigNotFound,ke as PoolError,ze as PoolFactory,et as PoolNotFound,qe as PoolService,re as PoolType,kt as ProviderConfigNotFound,Le as RUNTIME_DECIMALS,Ge as RouteNotFound,Fe as Router,xr as SYSTEM_ASSET_DECIMALS,Se as SYSTEM_ASSET_ID,te as StableMath,ve as StableSwap,Et as StorageConfigNotFound,Rt as SubscriptionNotSupported,dt as TRADEABLE_DEFAULT,lt as TradeRouter,It as TradeType,be as XykMath,Ie as XykPool,R as ZERO,v as bnum,bt as buildRoute,Jt as calculateBuyFee,Tl as calculateDiffToAvg,Xe as calculateDiffToRef,jt as calculateSellFee,At as findNestedKey,Ir as findNestedObj,J as scale};
1
+ var ze=class{constructor(e=1/0){this.capacity=e}storage=[];enqueue(e){if(this.size()===this.capacity)throw Error("Queue has reached max capacity, you cannot add more items");this.storage.push(e)}dequeue(){return this.storage.shift()}size(){return this.storage.length}};var Kt=5,ve=class{isNotVisited(e,t){let s=!0;return t.forEach(r=>{(r[0]===e[0]||r[1]===e[1])&&(s=!1)}),s}findPaths(e,t,s){let r=[],i=new ze,a=[];for(a.push([t,""]),i.enqueue(a);i.size()>0;){let m=i.dequeue();if(m==null||m.length>Kt)return r;let c=m[m.length-1];(s===null||c[0]===s)&&r.push(m),e.get(c[0])?.forEach(O=>{if(this.isNotVisited(O,m)){let B=[...m];B.push(O),i.enqueue(B)}})}return r}buildAndPopulateGraph(e,t){let s=new Map;for(let r of e)s.set(parseInt(r),[]);for(let[r,i,a]of t){let m=parseInt(i),c=parseInt(a);s.get(m)?.push([c,r])}return s}};function mt(u){let e={};for(let t of u){let s=t.tokens.length;for(let r=0;r<s;r++){e[t.tokens[r].id]||(e[t.tokens[r].id]=[]);for(let i=0;i<s;i++){if(r==i)continue;let a=[t.address,t.tokens[r].id,t.tokens[i].id];e[t.tokens[r].id].push(a)}}}return e}var Ie=class{getProposals(e,t,s){let r=mt(s),i=Object.keys(r),a=i.map(O=>r[O]).flat(),m=new ve,c=m.buildAndPopulateGraph(i,a),y=m.findPaths(c,parseInt(e),t?parseInt(t):null);return this.parsePaths(y)}parsePaths(e){let t=[];for(let s of e){let r=[];for(let i=0;i<s.length;i++){let a=s[i],m=s[i+1];if(m==null)break;r.push(this.toEdge(a,m))}t.push(r)}return t}toEdge(e,t){return[t[1],e[0].toString(),t[0].toString()]}};var Zt=/^-?(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?$/i,pt=Math.ceil,oe=Math.floor,V="[BigNumber Error] ",Bt=V+"Number primitive has more than 15 significant digits: ",ce=1e14,T=14,gt=9007199254740991,ht=[1,10,100,1e3,1e4,1e5,1e6,1e7,1e8,1e9,1e10,1e11,1e12,1e13],be=1e7,$=1e9;function vt(u){var e,t,s,r=w.prototype={constructor:w,toString:null,valueOf:null},i=new w(1),a=20,m=4,c=-7,y=21,O=-1e7,B=1e7,N=!1,F=1,_=0,D={prefix:"",groupSize:3,secondaryGroupSize:0,groupSeparator:",",decimalSeparator:".",fractionGroupSize:0,fractionGroupSeparator:"\xA0",suffix:""},k="0123456789abcdefghijklmnopqrstuvwxyz",H=!0;function w(n,o){var l,P,g,d,S,p,h,b,f=this;if(!(f instanceof w))return new w(n,o);if(o==null){if(n&&n._isBigNumber===!0){f.s=n.s,!n.c||n.e>B?f.c=f.e=null:n.e<O?f.c=[f.e=0]:(f.e=n.e,f.c=n.c.slice());return}if((p=typeof n=="number")&&n*0==0){if(f.s=1/n<0?(n=-n,-1):1,n===~~n){for(d=0,S=n;S>=10;S/=10,d++);d>B?f.c=f.e=null:(f.e=d,f.c=[n]);return}b=String(n)}else{if(!Zt.test(b=String(n)))return s(f,b,p);f.s=b.charCodeAt(0)==45?(b=b.slice(1),-1):1}(d=b.indexOf("."))>-1&&(b=b.replace(".","")),(S=b.search(/e/i))>0?(d<0&&(d=S),d+=+b.slice(S+1),b=b.substring(0,S)):d<0&&(d=b.length)}else{if(q(o,2,k.length,"Base"),o==10&&H)return f=new w(n),E(f,a+f.e+1,m);if(b=String(n),p=typeof n=="number"){if(n*0!=0)return s(f,b,p,o);if(f.s=1/n<0?(b=b.slice(1),-1):1,w.DEBUG&&b.replace(/^0\.0*|\./,"").length>15)throw Error(Bt+n)}else f.s=b.charCodeAt(0)===45?(b=b.slice(1),-1):1;for(l=k.slice(0,o),d=S=0,h=b.length;S<h;S++)if(l.indexOf(P=b.charAt(S))<0){if(P=="."){if(S>d){d=h;continue}}else if(!g&&(b==b.toUpperCase()&&(b=b.toLowerCase())||b==b.toLowerCase()&&(b=b.toUpperCase()))){g=!0,S=-1,d=0;continue}return s(f,String(n),p,o)}p=!1,b=t(b,o,10,f.s),(d=b.indexOf("."))>-1?b=b.replace(".",""):d=b.length}for(S=0;b.charCodeAt(S)===48;S++);for(h=b.length;b.charCodeAt(--h)===48;);if(b=b.slice(S,++h)){if(h-=S,p&&w.DEBUG&&h>15&&(n>gt||n!==oe(n)))throw Error(Bt+f.s*n);if((d=d-S-1)>B)f.c=f.e=null;else if(d<O)f.c=[f.e=0];else{if(f.e=d,f.c=[],S=(d+1)%T,d<0&&(S+=T),S<h){for(S&&f.c.push(+b.slice(0,S)),h-=T;S<h;)f.c.push(+b.slice(S,S+=T));S=T-(b=b.slice(S)).length}else S-=h;for(;S--;b+="0");f.c.push(+b)}}else f.c=[f.e=0]}w.clone=vt,w.ROUND_UP=0,w.ROUND_DOWN=1,w.ROUND_CEIL=2,w.ROUND_FLOOR=3,w.ROUND_HALF_UP=4,w.ROUND_HALF_DOWN=5,w.ROUND_HALF_EVEN=6,w.ROUND_HALF_CEIL=7,w.ROUND_HALF_FLOOR=8,w.EUCLID=9,w.config=w.set=function(n){var o,l;if(n!=null)if(typeof n=="object"){if(n.hasOwnProperty(o="DECIMAL_PLACES")&&(l=n[o],q(l,0,$,o),a=l),n.hasOwnProperty(o="ROUNDING_MODE")&&(l=n[o],q(l,0,8,o),m=l),n.hasOwnProperty(o="EXPONENTIAL_AT")&&(l=n[o],l&&l.pop?(q(l[0],-$,0,o),q(l[1],0,$,o),c=l[0],y=l[1]):(q(l,-$,$,o),c=-(y=l<0?-l:l))),n.hasOwnProperty(o="RANGE"))if(l=n[o],l&&l.pop)q(l[0],-$,-1,o),q(l[1],1,$,o),O=l[0],B=l[1];else if(q(l,-$,$,o),l)O=-(B=l<0?-l:l);else throw Error(V+o+" cannot be zero: "+l);if(n.hasOwnProperty(o="CRYPTO"))if(l=n[o],l===!!l)if(l)if(typeof crypto<"u"&&crypto&&(crypto.getRandomValues||crypto.randomBytes))N=l;else throw N=!l,Error(V+"crypto unavailable");else N=l;else throw Error(V+o+" not true or false: "+l);if(n.hasOwnProperty(o="MODULO_MODE")&&(l=n[o],q(l,0,9,o),F=l),n.hasOwnProperty(o="POW_PRECISION")&&(l=n[o],q(l,0,$,o),_=l),n.hasOwnProperty(o="FORMAT"))if(l=n[o],typeof l=="object")D=l;else throw Error(V+o+" not an object: "+l);if(n.hasOwnProperty(o="ALPHABET"))if(l=n[o],typeof l=="string"&&!/^.?$|[+\-.\s]|(.).*\1/.test(l))H=l.slice(0,10)=="0123456789",k=l;else throw Error(V+o+" invalid: "+l)}else throw Error(V+"Object expected: "+n);return{DECIMAL_PLACES:a,ROUNDING_MODE:m,EXPONENTIAL_AT:[c,y],RANGE:[O,B],CRYPTO:N,MODULO_MODE:F,POW_PRECISION:_,FORMAT:D,ALPHABET:k}},w.isBigNumber=function(n){if(!n||n._isBigNumber!==!0)return!1;if(!w.DEBUG)return!0;var o,l,P=n.c,g=n.e,d=n.s;e:if({}.toString.call(P)=="[object Array]"){if((d===1||d===-1)&&g>=-$&&g<=$&&g===oe(g)){if(P[0]===0){if(g===0&&P.length===1)return!0;break e}if(o=(g+1)%T,o<1&&(o+=T),String(P[0]).length==o){for(o=0;o<P.length;o++)if(l=P[o],l<0||l>=ce||l!==oe(l))break e;if(l!==0)return!0}}}else if(P===null&&g===null&&(d===null||d===1||d===-1))return!0;throw Error(V+"Invalid BigNumber: "+n)},w.maximum=w.max=function(){return se(arguments,-1)},w.minimum=w.min=function(){return se(arguments,1)},w.random=function(){var n=9007199254740992,o=Math.random()*n&2097151?function(){return oe(Math.random()*n)}:function(){return(Math.random()*1073741824|0)*8388608+(Math.random()*8388608|0)};return function(l){var P,g,d,S,p,h=0,b=[],f=new w(i);if(l==null?l=a:q(l,0,$),S=pt(l/T),N)if(crypto.getRandomValues){for(P=crypto.getRandomValues(new Uint32Array(S*=2));h<S;)p=P[h]*131072+(P[h+1]>>>11),p>=9e15?(g=crypto.getRandomValues(new Uint32Array(2)),P[h]=g[0],P[h+1]=g[1]):(b.push(p%1e14),h+=2);h=S/2}else if(crypto.randomBytes){for(P=crypto.randomBytes(S*=7);h<S;)p=(P[h]&31)*281474976710656+P[h+1]*1099511627776+P[h+2]*4294967296+P[h+3]*16777216+(P[h+4]<<16)+(P[h+5]<<8)+P[h+6],p>=9e15?crypto.randomBytes(7).copy(P,h):(b.push(p%1e14),h+=7);h=S/7}else throw N=!1,Error(V+"crypto unavailable");if(!N)for(;h<S;)p=o(),p<9e15&&(b[h++]=p%1e14);for(S=b[--h],l%=T,S&&l&&(p=ht[T-l],b[h]=oe(S/p)*p);b[h]===0;b.pop(),h--);if(h<0)b=[d=0];else{for(d=-1;b[0]===0;b.splice(0,1),d-=T);for(h=1,p=b[0];p>=10;p/=10,h++);h<T&&(d-=T-h)}return f.e=d,f.c=b,f}}(),w.sum=function(){for(var n=1,o=arguments,l=new w(o[0]);n<o.length;)l=l.plus(o[n++]);return l},t=function(){var n="0123456789";function o(l,P,g,d){for(var S,p=[0],h,b=0,f=l.length;b<f;){for(h=p.length;h--;p[h]*=P);for(p[0]+=d.indexOf(l.charAt(b++)),S=0;S<p.length;S++)p[S]>g-1&&(p[S+1]==null&&(p[S+1]=0),p[S+1]+=p[S]/g|0,p[S]%=g)}return p.reverse()}return function(l,P,g,d,S){var p,h,b,f,x,I,A,M,U=l.indexOf("."),Y=a,L=m;for(U>=0&&(f=_,_=0,l=l.replace(".",""),M=new w(P),I=M.pow(l.length-U),_=f,M.c=o(fe(ne(I.c),I.e,"0"),10,g,n),M.e=M.c.length),A=o(l,P,g,S?(p=k,n):(p=n,k)),b=f=A.length;A[--f]==0;A.pop());if(!A[0])return p.charAt(0);if(U<0?--b:(I.c=A,I.e=b,I.s=d,I=e(I,M,Y,L,g),A=I.c,x=I.r,b=I.e),h=b+Y+1,U=A[h],f=g/2,x=x||h<0||A[h+1]!=null,x=L<4?(U!=null||x)&&(L==0||L==(I.s<0?3:2)):U>f||U==f&&(L==4||x||L==6&&A[h-1]&1||L==(I.s<0?8:7)),h<1||!A[0])l=x?fe(p.charAt(1),-Y,p.charAt(0)):p.charAt(0);else{if(A.length=h,x)for(--g;++A[--h]>g;)A[h]=0,h||(++b,A=[1].concat(A));for(f=A.length;!A[--f];);for(U=0,l="";U<=f;l+=p.charAt(A[U++]));l=fe(l,b,p.charAt(0))}return l}}(),e=function(){function n(P,g,d){var S,p,h,b,f=0,x=P.length,I=g%be,A=g/be|0;for(P=P.slice();x--;)h=P[x]%be,b=P[x]/be|0,S=A*h+b*I,p=I*h+S%be*be+f,f=(p/d|0)+(S/be|0)+A*b,P[x]=p%d;return f&&(P=[f].concat(P)),P}function o(P,g,d,S){var p,h;if(d!=S)h=d>S?1:-1;else for(p=h=0;p<d;p++)if(P[p]!=g[p]){h=P[p]>g[p]?1:-1;break}return h}function l(P,g,d,S){for(var p=0;d--;)P[d]-=p,p=P[d]<g[d]?1:0,P[d]=p*S+P[d]-g[d];for(;!P[0]&&P.length>1;P.splice(0,1));}return function(P,g,d,S,p){var h,b,f,x,I,A,M,U,Y,L,C,Z,Ue,ut,ct,ge,Be,ie=P.s==g.s?1:-1,Q=P.c,z=g.c;if(!Q||!Q[0]||!z||!z[0])return new w(!P.s||!g.s||(Q?z&&Q[0]==z[0]:!z)?NaN:Q&&Q[0]==0||!z?ie*0:ie/0);for(U=new w(ie),Y=U.c=[],b=P.e-g.e,ie=d+b+1,p||(p=ce,b=ae(P.e/T)-ae(g.e/T),ie=ie/T|0),f=0;z[f]==(Q[f]||0);f++);if(z[f]>(Q[f]||0)&&b--,ie<0)Y.push(1),x=!0;else{for(ut=Q.length,ge=z.length,f=0,ie+=2,I=oe(p/(z[0]+1)),I>1&&(z=n(z,I,p),Q=n(Q,I,p),ge=z.length,ut=Q.length),Ue=ge,L=Q.slice(0,ge),C=L.length;C<ge;L[C++]=0);Be=z.slice(),Be=[0].concat(Be),ct=z[0],z[1]>=p/2&&ct++;do{if(I=0,h=o(z,L,ge,C),h<0){if(Z=L[0],ge!=C&&(Z=Z*p+(L[1]||0)),I=oe(Z/ct),I>1)for(I>=p&&(I=p-1),A=n(z,I,p),M=A.length,C=L.length;o(A,L,M,C)==1;)I--,l(A,ge<M?Be:z,M,p),M=A.length,h=1;else I==0&&(h=I=1),A=z.slice(),M=A.length;if(M<C&&(A=[0].concat(A)),l(L,A,C,p),C=L.length,h==-1)for(;o(z,L,ge,C)<1;)I++,l(L,ge<C?Be:z,C,p),C=L.length}else h===0&&(I++,L=[0]);Y[f++]=I,L[0]?L[C++]=Q[Ue]||0:(L=[Q[Ue]],C=1)}while((Ue++<ut||L[0]!=null)&&ie--);x=L[0]!=null,Y[0]||Y.splice(0,1)}if(p==ce){for(f=1,ie=Y[0];ie>=10;ie/=10,f++);E(U,d+(U.e=f+b*T-1)+1,S,x)}else U.e=b,U.r=+x;return U}}();function j(n,o,l,P){var g,d,S,p,h;if(l==null?l=m:q(l,0,8),!n.c)return n.toString();if(g=n.c[0],S=n.e,o==null)h=ne(n.c),h=P==1||P==2&&(S<=c||S>=y)?We(h,S):fe(h,S,"0");else if(n=E(new w(n),o,l),d=n.e,h=ne(n.c),p=h.length,P==1||P==2&&(o<=d||d<=c)){for(;p<o;h+="0",p++);h=We(h,d)}else if(o-=S,h=fe(h,d,"0"),d+1>p){if(--o>0)for(h+=".";o--;h+="0");}else if(o+=d-p,o>0)for(d+1==p&&(h+=".");o--;h+="0");return n.s<0&&g?"-"+h:h}function se(n,o){for(var l,P,g=1,d=new w(n[0]);g<n.length;g++)P=new w(n[g]),(!P.s||(l=we(d,P))===o||l===0&&d.s===o)&&(d=P);return d}function de(n,o,l){for(var P=1,g=o.length;!o[--g];o.pop());for(g=o[0];g>=10;g/=10,P++);return(l=P+l*T-1)>B?n.c=n.e=null:l<O?n.c=[n.e=0]:(n.e=l,n.c=o),n}s=function(){var n=/^(-?)0([xbo])(?=\w[\w.]*$)/i,o=/^([^.]+)\.$/,l=/^\.([^.]+)$/,P=/^-?(Infinity|NaN)$/,g=/^\s*\+(?=[\w.])|^\s+|\s+$/g;return function(d,S,p,h){var b,f=p?S:S.replace(g,"");if(P.test(f))d.s=isNaN(f)?null:f<0?-1:1;else{if(!p&&(f=f.replace(n,function(x,I,A){return b=(A=A.toLowerCase())=="x"?16:A=="b"?2:8,!h||h==b?I:x}),h&&(b=h,f=f.replace(o,"$1").replace(l,"0.$1")),S!=f))return new w(f,b);if(w.DEBUG)throw Error(V+"Not a"+(h?" base "+h:"")+" number: "+S);d.s=null}d.c=d.e=null}}();function E(n,o,l,P){var g,d,S,p,h,b,f,x=n.c,I=ht;if(x){e:{for(g=1,p=x[0];p>=10;p/=10,g++);if(d=o-g,d<0)d+=T,S=o,h=x[b=0],f=oe(h/I[g-S-1]%10);else if(b=pt((d+1)/T),b>=x.length)if(P){for(;x.length<=b;x.push(0));h=f=0,g=1,d%=T,S=d-T+1}else break e;else{for(h=p=x[b],g=1;p>=10;p/=10,g++);d%=T,S=d-T+g,f=S<0?0:oe(h/I[g-S-1]%10)}if(P=P||o<0||x[b+1]!=null||(S<0?h:h%I[g-S-1]),P=l<4?(f||P)&&(l==0||l==(n.s<0?3:2)):f>5||f==5&&(l==4||P||l==6&&(d>0?S>0?h/I[g-S]:0:x[b-1])%10&1||l==(n.s<0?8:7)),o<1||!x[0])return x.length=0,P?(o-=n.e+1,x[0]=I[(T-o%T)%T],n.e=-o||0):x[0]=n.e=0,n;if(d==0?(x.length=b,p=1,b--):(x.length=b+1,p=I[T-d],x[b]=S>0?oe(h/I[g-S]%I[S])*p:0),P)for(;;)if(b==0){for(d=1,S=x[0];S>=10;S/=10,d++);for(S=x[0]+=p,p=1;S>=10;S/=10,p++);d!=p&&(n.e++,x[0]==ce&&(x[0]=1));break}else{if(x[b]+=p,x[b]!=ce)break;x[b--]=0,p=1}for(d=x.length;x[--d]===0;x.pop());}n.e>B?n.c=n.e=null:n.e<O&&(n.c=[n.e=0])}return n}function X(n){var o,l=n.e;return l===null?n.toString():(o=ne(n.c),o=l<=c||l>=y?We(o,l):fe(o,l,"0"),n.s<0?"-"+o:o)}return r.absoluteValue=r.abs=function(){var n=new w(this);return n.s<0&&(n.s=1),n},r.comparedTo=function(n,o){return we(this,new w(n,o))},r.decimalPlaces=r.dp=function(n,o){var l,P,g,d=this;if(n!=null)return q(n,0,$),o==null?o=m:q(o,0,8),E(new w(d),n+d.e+1,o);if(!(l=d.c))return null;if(P=((g=l.length-1)-ae(this.e/T))*T,g=l[g])for(;g%10==0;g/=10,P--);return P<0&&(P=0),P},r.dividedBy=r.div=function(n,o){return e(this,new w(n,o),a,m)},r.dividedToIntegerBy=r.idiv=function(n,o){return e(this,new w(n,o),0,1)},r.exponentiatedBy=r.pow=function(n,o){var l,P,g,d,S,p,h,b,f,x=this;if(n=new w(n),n.c&&!n.isInteger())throw Error(V+"Exponent not an integer: "+X(n));if(o!=null&&(o=new w(o)),p=n.e>14,!x.c||!x.c[0]||x.c[0]==1&&!x.e&&x.c.length==1||!n.c||!n.c[0])return f=new w(Math.pow(+X(x),p?n.s*(2-Xe(n)):+X(n))),o?f.mod(o):f;if(h=n.s<0,o){if(o.c?!o.c[0]:!o.s)return new w(NaN);P=!h&&x.isInteger()&&o.isInteger(),P&&(x=x.mod(o))}else{if(n.e>9&&(x.e>0||x.e<-1||(x.e==0?x.c[0]>1||p&&x.c[1]>=24e7:x.c[0]<8e13||p&&x.c[0]<=9999975e7)))return d=x.s<0&&Xe(n)?-0:0,x.e>-1&&(d=1/d),new w(h?1/d:d);_&&(d=pt(_/T+2))}for(p?(l=new w(.5),h&&(n.s=1),b=Xe(n)):(g=Math.abs(+X(n)),b=g%2),f=new w(i);;){if(b){if(f=f.times(x),!f.c)break;d?f.c.length>d&&(f.c.length=d):P&&(f=f.mod(o))}if(g){if(g=oe(g/2),g===0)break;b=g%2}else if(n=n.times(l),E(n,n.e+1,1),n.e>14)b=Xe(n);else{if(g=+X(n),g===0)break;b=g%2}x=x.times(x),d?x.c&&x.c.length>d&&(x.c.length=d):P&&(x=x.mod(o))}return P?f:(h&&(f=i.div(f)),o?f.mod(o):d?E(f,_,m,S):f)},r.integerValue=function(n){var o=new w(this);return n==null?n=m:q(n,0,8),E(o,o.e+1,n)},r.isEqualTo=r.eq=function(n,o){return we(this,new w(n,o))===0},r.isFinite=function(){return!!this.c},r.isGreaterThan=r.gt=function(n,o){return we(this,new w(n,o))>0},r.isGreaterThanOrEqualTo=r.gte=function(n,o){return(o=we(this,new w(n,o)))===1||o===0},r.isInteger=function(){return!!this.c&&ae(this.e/T)>this.c.length-2},r.isLessThan=r.lt=function(n,o){return we(this,new w(n,o))<0},r.isLessThanOrEqualTo=r.lte=function(n,o){return(o=we(this,new w(n,o)))===-1||o===0},r.isNaN=function(){return!this.s},r.isNegative=function(){return this.s<0},r.isPositive=function(){return this.s>0},r.isZero=function(){return!!this.c&&this.c[0]==0},r.minus=function(n,o){var l,P,g,d,S=this,p=S.s;if(n=new w(n,o),o=n.s,!p||!o)return new w(NaN);if(p!=o)return n.s=-o,S.plus(n);var h=S.e/T,b=n.e/T,f=S.c,x=n.c;if(!h||!b){if(!f||!x)return f?(n.s=-o,n):new w(x?S:NaN);if(!f[0]||!x[0])return x[0]?(n.s=-o,n):new w(f[0]?S:m==3?-0:0)}if(h=ae(h),b=ae(b),f=f.slice(),p=h-b){for((d=p<0)?(p=-p,g=f):(b=h,g=x),g.reverse(),o=p;o--;g.push(0));g.reverse()}else for(P=(d=(p=f.length)<(o=x.length))?p:o,p=o=0;o<P;o++)if(f[o]!=x[o]){d=f[o]<x[o];break}if(d&&(g=f,f=x,x=g,n.s=-n.s),o=(P=x.length)-(l=f.length),o>0)for(;o--;f[l++]=0);for(o=ce-1;P>p;){if(f[--P]<x[P]){for(l=P;l&&!f[--l];f[l]=o);--f[l],f[P]+=ce}f[P]-=x[P]}for(;f[0]==0;f.splice(0,1),--b);return f[0]?de(n,f,b):(n.s=m==3?-1:1,n.c=[n.e=0],n)},r.modulo=r.mod=function(n,o){var l,P,g=this;return n=new w(n,o),!g.c||!n.s||n.c&&!n.c[0]?new w(NaN):!n.c||g.c&&!g.c[0]?new w(g):(F==9?(P=n.s,n.s=1,l=e(g,n,0,3),n.s=P,l.s*=P):l=e(g,n,0,F),n=g.minus(l.times(n)),!n.c[0]&&F==1&&(n.s=g.s),n)},r.multipliedBy=r.times=function(n,o){var l,P,g,d,S,p,h,b,f,x,I,A,M,U,Y,L=this,C=L.c,Z=(n=new w(n,o)).c;if(!C||!Z||!C[0]||!Z[0])return!L.s||!n.s||C&&!C[0]&&!Z||Z&&!Z[0]&&!C?n.c=n.e=n.s=null:(n.s*=L.s,!C||!Z?n.c=n.e=null:(n.c=[0],n.e=0)),n;for(P=ae(L.e/T)+ae(n.e/T),n.s*=L.s,h=C.length,x=Z.length,h<x&&(M=C,C=Z,Z=M,g=h,h=x,x=g),g=h+x,M=[];g--;M.push(0));for(U=ce,Y=be,g=x;--g>=0;){for(l=0,I=Z[g]%Y,A=Z[g]/Y|0,S=h,d=g+S;d>g;)b=C[--S]%Y,f=C[S]/Y|0,p=A*b+f*I,b=I*b+p%Y*Y+M[d]+l,l=(b/U|0)+(p/Y|0)+A*f,M[d--]=b%U;M[d]=l}return l?++P:M.splice(0,1),de(n,M,P)},r.negated=function(){var n=new w(this);return n.s=-n.s||null,n},r.plus=function(n,o){var l,P=this,g=P.s;if(n=new w(n,o),o=n.s,!g||!o)return new w(NaN);if(g!=o)return n.s=-o,P.minus(n);var d=P.e/T,S=n.e/T,p=P.c,h=n.c;if(!d||!S){if(!p||!h)return new w(g/0);if(!p[0]||!h[0])return h[0]?n:new w(p[0]?P:g*0)}if(d=ae(d),S=ae(S),p=p.slice(),g=d-S){for(g>0?(S=d,l=h):(g=-g,l=p),l.reverse();g--;l.push(0));l.reverse()}for(g=p.length,o=h.length,g-o<0&&(l=h,h=p,p=l,o=g),g=0;o;)g=(p[--o]=p[o]+h[o]+g)/ce|0,p[o]=ce===p[o]?0:p[o]%ce;return g&&(p=[g].concat(p),++S),de(n,p,S)},r.precision=r.sd=function(n,o){var l,P,g,d=this;if(n!=null&&n!==!!n)return q(n,1,$),o==null?o=m:q(o,0,8),E(new w(d),n,o);if(!(l=d.c))return null;if(g=l.length-1,P=g*T+1,g=l[g]){for(;g%10==0;g/=10,P--);for(g=l[0];g>=10;g/=10,P++);}return n&&d.e+1>P&&(P=d.e+1),P},r.shiftedBy=function(n){return q(n,-gt,gt),this.times("1e"+n)},r.squareRoot=r.sqrt=function(){var n,o,l,P,g,d=this,S=d.c,p=d.s,h=d.e,b=a+4,f=new w("0.5");if(p!==1||!S||!S[0])return new w(!p||p<0&&(!S||S[0])?NaN:S?d:1/0);if(p=Math.sqrt(+X(d)),p==0||p==1/0?(o=ne(S),(o.length+h)%2==0&&(o+="0"),p=Math.sqrt(+o),h=ae((h+1)/2)-(h<0||h%2),p==1/0?o="5e"+h:(o=p.toExponential(),o=o.slice(0,o.indexOf("e")+1)+h),l=new w(o)):l=new w(p+""),l.c[0]){for(h=l.e,p=h+b,p<3&&(p=0);;)if(g=l,l=f.times(g.plus(e(d,g,b,1))),ne(g.c).slice(0,p)===(o=ne(l.c)).slice(0,p))if(l.e<h&&--p,o=o.slice(p-3,p+1),o=="9999"||!P&&o=="4999"){if(!P&&(E(g,g.e+a+2,0),g.times(g).eq(d))){l=g;break}b+=4,p+=4,P=1}else{(!+o||!+o.slice(1)&&o.charAt(0)=="5")&&(E(l,l.e+a+2,1),n=!l.times(l).eq(d));break}}return E(l,l.e+a+1,m,n)},r.toExponential=function(n,o){return n!=null&&(q(n,0,$),n++),j(this,n,o,1)},r.toFixed=function(n,o){return n!=null&&(q(n,0,$),n=n+this.e+1),j(this,n,o)},r.toFormat=function(n,o,l){var P,g=this;if(l==null)n!=null&&o&&typeof o=="object"?(l=o,o=null):n&&typeof n=="object"?(l=n,n=o=null):l=D;else if(typeof l!="object")throw Error(V+"Argument not an object: "+l);if(P=g.toFixed(n,o),g.c){var d,S=P.split("."),p=+l.groupSize,h=+l.secondaryGroupSize,b=l.groupSeparator||"",f=S[0],x=S[1],I=g.s<0,A=I?f.slice(1):f,M=A.length;if(h&&(d=p,p=h,h=d,M-=d),p>0&&M>0){for(d=M%p||p,f=A.substr(0,d);d<M;d+=p)f+=b+A.substr(d,p);h>0&&(f+=b+A.slice(d)),I&&(f="-"+f)}P=x?f+(l.decimalSeparator||"")+((h=+l.fractionGroupSize)?x.replace(new RegExp("\\d{"+h+"}\\B","g"),"$&"+(l.fractionGroupSeparator||"")):x):f}return(l.prefix||"")+P+(l.suffix||"")},r.toFraction=function(n){var o,l,P,g,d,S,p,h,b,f,x,I,A=this,M=A.c;if(n!=null&&(p=new w(n),!p.isInteger()&&(p.c||p.s!==1)||p.lt(i)))throw Error(V+"Argument "+(p.isInteger()?"out of range: ":"not an integer: ")+X(p));if(!M)return new w(A);for(o=new w(i),b=l=new w(i),P=h=new w(i),I=ne(M),d=o.e=I.length-A.e-1,o.c[0]=ht[(S=d%T)<0?T+S:S],n=!n||p.comparedTo(o)>0?d>0?o:b:p,S=B,B=1/0,p=new w(I),h.c[0]=0;f=e(p,o,0,1),g=l.plus(f.times(P)),g.comparedTo(n)!=1;)l=P,P=g,b=h.plus(f.times(g=b)),h=g,o=p.minus(f.times(g=o)),p=g;return g=e(n.minus(l),P,0,1),h=h.plus(g.times(b)),l=l.plus(g.times(P)),h.s=b.s=A.s,d=d*2,x=e(b,P,d,m).minus(A).abs().comparedTo(e(h,l,d,m).minus(A).abs())<1?[b,P]:[h,l],B=S,x},r.toNumber=function(){return+X(this)},r.toPrecision=function(n,o){return n!=null&&q(n,1,$),j(this,n,o,2)},r.toString=function(n){var o,l=this,P=l.s,g=l.e;return g===null?P?(o="Infinity",P<0&&(o="-"+o)):o="NaN":(n==null?o=g<=c||g>=y?We(ne(l.c),g):fe(ne(l.c),g,"0"):n===10&&H?(l=E(new w(l),a+g+1,m),o=fe(ne(l.c),l.e,"0")):(q(n,2,k.length,"Base"),o=t(fe(ne(l.c),g,"0"),10,n,P,!0)),P<0&&l.c[0]&&(o="-"+o)),o},r.valueOf=r.toJSON=function(){return X(this)},r._isBigNumber=!0,r[Symbol.toStringTag]="BigNumber",r[Symbol.for("nodejs.util.inspect.custom")]=r.valueOf,u!=null&&w.set(u),w}function ae(u){var e=u|0;return u>0||u===e?e:e-1}function ne(u){for(var e,t,s=1,r=u.length,i=u[0]+"";s<r;){for(e=u[s++]+"",t=T-e.length;t--;e="0"+e);i+=e}for(r=i.length;i.charCodeAt(--r)===48;);return i.slice(0,r+1||1)}function we(u,e){var t,s,r=u.c,i=e.c,a=u.s,m=e.s,c=u.e,y=e.e;if(!a||!m)return null;if(t=r&&!r[0],s=i&&!i[0],t||s)return t?s?0:-m:a;if(a!=m)return a;if(t=a<0,s=c==y,!r||!i)return s?0:!r^t?1:-1;if(!s)return c>y^t?1:-1;for(m=(c=r.length)<(y=i.length)?c:y,a=0;a<m;a++)if(r[a]!=i[a])return r[a]>i[a]^t?1:-1;return c==y?0:c>y^t?1:-1}function q(u,e,t,s){if(u<e||u>t||u!==oe(u))throw Error(V+(s||"Argument")+(typeof u=="number"?u<e||u>t?" out of range: ":" not an integer: ":" not a primitive number: ")+String(u))}function Xe(u){var e=u.c.length-1;return ae(u.e/T)==e&&u.c[e]%2!=0}function We(u,e){return(u.length>1?u.charAt(0)+"."+u.slice(1):u)+(e<0?"e":"e+")+e}function fe(u,e,t){var s,r;if(e<0){for(r=t+".";++e;r+=t);u=r+u}else if(s=u.length,++e>s){for(r=t,e-=s;--e;r+=t);u+=r}else e<s&&(u=u.slice(0,e)+"."+u.slice(e));return u}var G=vt();var Qt=12;G.config({EXPONENTIAL_AT:[-100,100],ROUNDING_MODE:4,DECIMAL_PLACES:Qt});var R=v(0),le=v(1),dr=v("Infinity");function J(u,e){let t=new G(e.toString()),s=new G(10).pow(t);return u.times(s)}function v(u){return new G(u.toString())}var re=(r=>(r.XYK="Xyk",r.LBP="Lbp",r.Stable="Stableswap",r.Omni="Omnipool",r))(re||{}),Ae=(i=>(i.UnknownError="UnknownError",i.InsufficientTradingAmount="InsufficientTradingAmount",i.MaxInRatioExceeded="MaxInRatioExceeded",i.MaxOutRatioExceeded="MaxOutRatioExceeded",i.TradeNotAllowed="TradeNotAllowed",i))(Ae||{}),It=(t=>(t.Buy="Buy",t.Sell="Sell",t))(It||{});import{calculate_in_given_out as Vt,calculate_out_given_in as es,calculate_linear_weights as ts,calculate_pool_trade_fee as ss,get_spot_price as rs}from"@galacticcouncil/math-lbp";var me=class{static getSpotPrice(e,t,s,r,i){return rs(e,t,s,r,i)}static calculateInGivenOut(e,t,s,r,i){return Vt(e,t,s,r,i)}static calculateOutGivenIn(e,t,s,r,i){return es(e,t,s,r,i)}static calculateLinearWeights(e,t,s,r,i){return ts(e,t,s,r,i)}static calculatePoolTradeFee(e,t,s){return ss(e,t,s)}};import{encodeAddress as is}from"@polkadot/util-crypto";import{stringToU8a as ns}from"@polkadot/util";var Ne=18,dt=15,ye="0",xr=12,Or=2034,Te=63,Br=2090,ft=1e3,Ye=is(ns("modlomnipool".padEnd(32,"\0")),Te);function At(u,e){let t=[];return JSON.stringify(u,(s,r)=>(r&&r[e]&&t.push(r),r)),t[0]}function Ir(u,e,t){let s;return JSON.stringify(u,(r,i)=>(i&&i[e]===t&&(s=i),i)),s}import"@polkadot/types/lookup";import"@polkadot/api-base/types/consts";import"@polkadot/api-base/types/errors";import"@polkadot/api-base/types/events";import"@polkadot/api-base/types/storage";import"@polkadot/api-base/types/submittable";import"@polkadot/rpc-core/types/jsonrpc";import"@polkadot/api-base/types/calls";import"@polkadot/types/types/registry";import"@polkadot/types/lookup";import"@polkadot/api-base/types/consts";import"@polkadot/api-base/types/errors";import"@polkadot/api-base/types/events";import"@polkadot/api-base/types/storage";import"@polkadot/api-base/types/submittable";import"@polkadot/rpc-core/types/jsonrpc";import"@polkadot/api-base/types/calls";import"@polkadot/types/types/registry";var Se=class{api;constructor(e){this.api=e}get chainDecimals(){return this.api.registry.chainDecimals[0]}get chainToken(){return this.api.registry.chainTokens[0]}};var Fe=class extends Se{SUPPORTED_TYPES=["StableSwap","Bond","Token","External"];constructor(e){super(e)}async safeSharesQuery(){try{let e=await this.api.query.stableswap.pools.entries();return new Map(e.map(([{args:[t]},s])=>[t.toString(),s.unwrap()]))}catch{return new Map([])}}async safeBondsQuery(){try{let e=await this.api.query.bonds.bonds.entries();return new Map(e.map(([{args:[t]},s])=>[t.toString(),s.unwrap()]))}catch{return new Map([])}}async metadataQuery(){try{let e=await this.api.query.assetRegistry.assetMetadataMap.entries();return new Map(e.map(([{args:[t]},s])=>{let{decimals:r,symbol:i}=s.unwrap();return[t.toString(),{decimals:r.toNumber(),symbol:i.toHuman()}]}))}catch{return new Map([])}}async locationsQuery(){try{let e=await this.api.query.assetRegistry.assetLocations.entries();return new Map(e.map(([{args:[t]},s])=>[t.toString(),s.unwrap()]))}catch{return new Map([])}}getSystemTokenName(e){switch(e){case"HDX":return"Hydration";case"BSX":return"Basilisk";default:return e}}getToken(e,t,s,r){if(e==ye){let F=this.api.consts.balances.existentialDeposit;return{id:ye,name:this.getSystemTokenName(this.chainToken),symbol:this.chainToken,decimals:this.chainDecimals,icon:this.chainToken,type:"Token",isSufficient:!0,existentialDeposit:F.toString()}}let{name:i,assetType:a,isSufficient:m,existentialDeposit:c}=t,{symbol:y,decimals:O}=s.get(e)??{},B=this.parseLocation("parachain",r);return{id:e,name:i.toHuman(),symbol:y,decimals:O,icon:y,type:a.toHuman(),isSufficient:m?m.toHuman():!0,origin:B,externalId:this.parseLocation(2094===B?"generalKey":"generalIndex",r),existentialDeposit:c.toString()}}getBond(e,t,s,r){let[i,a]=r,{assetType:m,isSufficient:c,existentialDeposit:y}=t,{symbol:O,decimals:B}=this.getToken(i.toString(),t,s),N=a.toNumber(),F=new Intl.DateTimeFormat("en-GB"),_=[O,"Bond",F.format(N)].join(" ");return{id:e,name:_,symbol:O+"b",decimals:B,icon:O,type:m.toString(),isSufficient:c.toHuman(),existentialDeposit:y.toString(),underlyingAssetId:i.toString(),maturity:N}}getShares(e,t,s,r){let{assets:i}=r,{name:a,symbol:m,assetType:c,isSufficient:y,existentialDeposit:O}=t,N=i.map(D=>D.toString()).map(D=>{let{symbol:k}=this.getToken(D,t,s);return[D,k]}),F=Object.fromEntries(N),_=Object.values(F);return{id:e,name:_.join(", "),symbol:m?.isSome?m.toHuman():a.toHuman(),decimals:18,icon:_.join("/"),type:c.toString(),isSufficient:y.toHuman(),existentialDeposit:O.toString(),meta:F}}getExternal(e,t,s,r){let i=this.getToken(e,t,new Map,r),a=s?.find(m=>m.internalId===i.id);return a?{...i,decimals:a.decimals,name:a.name,symbol:a.symbol,icon:a.symbol,isWhiteListed:a.isWhiteListed}:i}normalizeMetadata(e,t){return t.size?t:new Map(e.map(([{args:[s]},r])=>{let{decimals:i,symbol:a}=r.unwrap();return[s.toString(),{decimals:Number(i.toString()),symbol:a.toHuman()}]}))}getSupportedAssets(e){return e.filter(([t,s])=>{if(s.isNone)return!1;let r=s.unwrap();return this.isSupportedAsset(r)})}async getOnChainAssets(e,t){let[s,r,i,a,m]=await Promise.all([this.api.query.assetRegistry.assets.entries(),this.locationsQuery(),this.safeSharesQuery(),this.safeBondsQuery(),this.metadataQuery()]),c=this.getSupportedAssets(s),y=this.normalizeMetadata(c,m),O=c.map(([{args:[B]},N])=>{let F=N.unwrap(),_=r.get(B.toString()),{assetType:D}=F;switch(D.toString()){case"Bond":let k=a.get(B.toString());return this.getBond(B.toString(),F,y,k);case"StableSwap":let H=i.get(B.toString());return this.getShares(B.toString(),F,y,H);case"External":return this.getExternal(B.toString(),F,t,_);default:return this.getToken(B.toString(),F,y,_)}});return e?O:O.filter(B=>this.isValidAsset(B))}isValidAsset(e){let t=Math.sign(e.decimals);return!!e.symbol&&(t===0||t===1)}isSupportedAsset(e){let t=e.assetType.toString();return this.SUPPORTED_TYPES.includes(t)}parseLocation(e,t){if(t){let s=At(t.toJSON(),e);return s&&s[e]}else return}};var _e=class extends Se{constructor(e){super(e)}async getBalance(e,t){return t===ye?await this.getSystemBalance(e):await this.getTokenBalance(e,t)}async getSystemBalance(e){let{data:t}=await this.api.query.system.account(e);return this.calculateFreeBalance(t)}async getTokenBalance(e,t){let{free:s,reserved:r,frozen:i}=await this.api.query.tokens.accounts(e,t);return this.calculateFreeBalance({free:s,feeFrozen:r,frozen:i})}async subscribeBalance(e,t,s){let r=t.filter(i=>i!==ye).map(i=>[e,i]);return this.api.query.tokens.accounts.multi(r,i=>{i.forEach(({free:a,reserved:m,frozen:c},y)=>{let O=this.calculateFreeBalance({free:a,feeFrozen:m,frozen:c}),B=r[y][1];s(B,O)})})}async subscribeTokenBalance(e,t,s){let r=t.filter(i=>i!==ye).map(i=>[e,i]);return this.api.query.tokens.accounts.multi(r,i=>{i.forEach((a,m)=>{let c=this.calculateFreeBalance(a),y=r[m][1];s(y,c)})})}async subscribeSystemBalance(e,t){return this.api.query.system.account(e,({data:s})=>t(ye,this.calculateFreeBalance(s)))}calculateFreeBalance(e){let{free:t,miscFrozen:s,feeFrozen:r,frozen:i}=e,a=new G(t),m=new G(s||i),c=new G(r||0),y=m.gt(c)?m:c;return a.minus(y)}};import{isAddress as Nt}from"@polkadot/util-crypto";import{fixed_from_rational as Tt}from"@galacticcouncil/math-liquidity-mining";var Pt=class extends Se{constructor(e){super(e)}secondsInYear=new G(365.2425).times(24).times(60).times(60);async getOmnipoolFarms(e){let t=await this.api.query.omnipoolWarehouseLM.activeYieldFarm.entries(e);return await Promise.all(t.map(async([r,i])=>{let[,a]=r.args,m=i.unwrap().toString(),c=a.toString(),y=(await this.api.query.omnipoolWarehouseLM.globalFarm(c)).unwrap(),O=(await this.api.query.omnipoolWarehouseLM.yieldFarm(e,c,m)).unwrap(),B=await this.getOraclePrice(y)??y.priceAdjustment.toString();return{assetId:e,globalFarm:y,yieldFarm:O,priceAdjustment:B}}))}async getIsolatedPoolFarms(e){let t=await this.api.query.xykWarehouseLM.activeYieldFarm.entries(e);return await Promise.all(t.map(async([r,i])=>{let[,a]=r.args,m=i.unwrap().toString(),c=a.toString(),y=(await this.api.query.xykWarehouseLM.globalFarm(c)).unwrap(),O=(await this.api.query.xykWarehouseLM.yieldFarm(e,c,m)).unwrap(),B=await this.getOraclePrice(y)??y.priceAdjustment.toString();return{assetId:e,globalFarm:y,yieldFarm:O,priceAdjustment:B}}))}async getOraclePrice(e){let t=e.rewardCurrency.toString(),s=e.incentivizedAsset.toString(),r=[t,s].sort();if(t===s)return new G(1).shiftedBy(18).toString();let i=await this.api.query.emaOracle.oracles("omnipool",r,"TenMinutes");if(i.isNone)return;let[a]=i.unwrap(),m=a.price.n.toString(),c=a.price.d.toString(),y;return Number(t)<Number(s)?y=Tt(m,c):y=Tt(c,m),y}getGlobalRewardPerPeriod(e,t,s,r){let a=e.times(t).shiftedBy(-18).times(r).shiftedBy(-18);return a.gte(s)?s:a}getPoolYieldPerPeriod(e,t,s,r){return e.times(t).div(s.times(r).shiftedBy(-18))}async getFarmApr(e,t){if(t==="isolatedpool"&&!Nt(e))throw new Error("You must pass an address of isolated pool as id");if(t==="omnipool"&&Nt(e))throw new Error("You must pass an asset id of omnipool");let s=6,r=t==="omnipool"?await this.getOmnipoolFarms(e):await this.getIsolatedPoolFarms(e);return r.length?r.map(({yieldFarm:m,globalFarm:c,priceAdjustment:y})=>{let O=new G(c.totalSharesZ.toString()),B=c.plannedYieldingPeriods.toString(),N=new G(c.yieldPerPeriod.toString()),F=new G(c.maxRewardPerPeriod.toString()),_=c.blocksPerPeriod.toString(),D=new G(m.multiplier.toString()).shiftedBy(-18),k=this.secondsInYear.div(new G(s).times(_)),H;if(O.isZero())H=N.times(D).times(k);else{let de=this.getGlobalRewardPerPeriod(O,N,F,y);H=this.getPoolYieldPerPeriod(de,D,O,y).times(k)}let w=new G(c.pendingRewards.toString()).plus(c.accumulatedPaidRewards.toString()),j=F.times(B);return w.div(j).gte(.99)?R:H.times(100)}).reduce((m,c)=>m.plus(c),R).toString():void 0}};var he=class extends _e{pools=[];subs=[];poolsLoaded=!1;constructor(e){super(e)}async getPools(){return this.poolsLoaded?this.pools:(this.pools=await this.loadPools(),this.subs=await this.subscribe(),this.poolsLoaded=!0,this.pools)}async subscribe(){let e=this.pools.map(async s=>{let r=[await this.subscribePoolChange(s),await this.subscribeTokensPoolBalance(s),await this.subscribeSystemPoolBalance(s)];if(this.hasShareAsset(s)){let i=await this.subscribeSharePoolBalance(s);r.push(i)}return this.subscribeLog(s),r});return(await Promise.all(e)).flat()}subscribeLog(e){let t=e.address.substring(0,10).concat("...");console.log(`${e.type} [${t}] balance subscribed`)}unsubscribe(){this.subs.forEach(e=>{e()})}hasShareAsset(e){return e.type==="Stableswap"&&e.id}subscribeTokensPoolBalance(e){return this.subscribeTokenBalance(e.address,e.tokens.map(t=>t.id),this.updateBalanceCallback(e,(t,s)=>t.id!==s))}subscribeSharePoolBalance(e){return this.subscribeTokenBalance(Ye,[e.id],this.updateBalanceCallback(e,()=>!0))}subscribeSystemPoolBalance(e){return this.subscribeSystemBalance(e.address,this.updateBalanceCallback(e,()=>!0))}updateBalanceCallback(e,t){return function(s,r){let i=e.tokens.findIndex(a=>a.id==s);i>=0&&t(e,s)&&(e.tokens[i].balance=r.toString())}}};var $e=class extends he{MAX_FINAL_WEIGHT=J(v(100),6);poolsData=new Map([]);isSupported(){return this.api.query.lbp!==void 0}async loadPools(){let[e,t]=await Promise.all([this.api.query.lbp.poolData.entries(),this.api.query.parachainSystem.validationData()]),{relayParentNumber:s}=t.unwrap(),r=e.filter(([i,a])=>this.isActivePool(a.unwrap(),s)).map(async([{args:[i]},a])=>{let m=a.unwrap(),c=i.toString(),y=await this.getPoolDelta(c,m,s.toString());return this.poolsData.set(i.toString(),m),{address:c,type:"Lbp",fee:m.fee.toJSON(),...y,...this.getPoolLimits()}});return Promise.all(r)}async getPoolFees(e,t){let s=this.pools.find(r=>r.address===t);return{repayFee:this.getRepayFee(),exchangeFee:s.fee}}getPoolType(){return"Lbp"}async subscribePoolChange(e){return this.api.query.parachainSystem.validationData(async t=>{let{relayParentNumber:s}=t.unwrap(),r=this.poolsData.get(e.address);if(this.isActivePool(r,s)){let a=await this.getPoolDelta(e.address,r,s.toString());Object.assign(e,a)}else{let a=this.pools.findIndex(m=>m.address==e.address);this.pools.splice(a,1)}})}async getPoolDelta(e,t,s){let{start:r,end:i,assets:a,initialWeight:m,finalWeight:c,repayTarget:y,feeCollector:O}=t,B=me.calculateLinearWeights(r.toString(),i.toString(),m.toString(),c.toString(),s),[N,F]=a,_=N.toString(),D=v(B),k=F.toString(),H=this.MAX_FINAL_WEIGHT.minus(v(D)),[w,j,se]=await Promise.all([this.isRepayFeeApplied(_,y.toString(),O.toString()),this.getBalance(e,_),this.getBalance(e,k)]);return{repayFeeApply:w,tokens:[{id:_,weight:D,balance:j.toString()},{id:k,weight:H,balance:se.toString()}]}}isActivePool(e,t){if(e.start.isEmpty||e.end.isEmpty)return!1;let s=e.start.unwrap().toNumber(),r=e.end.unwrap().toNumber();return t.toNumber()>=s&&t.toNumber()<r}async isRepayFeeApplied(e,t,s){let r=v(t);if(r.isZero())return!1;try{return(await this.getBalance(e,s)).isLessThan(r)}catch{return!0}}getRepayFee(){return this.api.consts.lbp.repayFee.toJSON()}getPoolLimits(){let e=this.api.consts.lbp.maxInRatio.toJSON(),t=this.api.consts.lbp.maxOutRatio.toJSON(),s=this.api.consts.lbp.minTradingLimit.toJSON();return{maxInRatio:e,maxOutRatio:t,minTradingLimit:s}}};import{encodeAddress as os}from"@polkadot/util-crypto";import{stringToU8a as as}from"@polkadot/util";function K(u,e){return u.shiftedBy(-1*e).toString()}function ue(u){return u[0]/u[1]*100}function ee(u){return u[0]/u[1]}function pe(u){return[u/ft,ft]}var je=class extends he{isSupported(){return this.api.query.omnipool!==void 0}async loadPools(){let e=this.api.consts.omnipool.hubAssetId.toString(),t=this.getPoolId(),[s,r,i]=await Promise.all([this.api.query.omnipool.assets.entries(),this.api.query.omnipool.hubAssetTradability(),this.getBalance(t,e)]),a=s.map(async([{args:[c]},y])=>{let{hubReserve:O,shares:B,tradable:N}=y.unwrap(),F=await this.getBalance(t,c.toString());return{id:c.toString(),hubReserves:v(O.toString()),shares:v(B.toString()),tradeable:N.bits.toNumber(),balance:F.toString()}}),m=await Promise.all(a);return m.push({id:e,tradeable:r.bits.toNumber(),balance:i.toString()}),[{address:t,type:"Omnipool",hubAssetId:e,tokens:m,...this.getPoolLimits()}]}async getPoolFees(e,t){let s=await this.api.query.dynamicFees.assetFee(e),r=this.api.consts.dynamicFees.assetFeeParameters,i=this.api.consts.dynamicFees.protocolFeeParameters,a=r.minFee.toNumber()+i.minFee.toNumber(),m=r.maxFee.toNumber()+i.maxFee.toNumber();if(s.isSome){let{assetFee:c,protocolFee:y}=s.unwrap();return{assetFee:pe(c.toNumber()),protocolFee:pe(y.toNumber()),min:pe(a),max:pe(m)}}else return{assetFee:this.getAssetFee(),protocolFee:this.getProtocolFee(),min:pe(a),max:pe(m)}}getPoolType(){return"Omnipool"}async subscribePoolChange(e){let t=e.tokens.map(s=>s.id);return this.api.query.omnipool.assets.multi(t,s=>{e.tokens=s.map((r,i)=>{let a=e.tokens[i];if(r.isNone)return a;let m=r.unwrap();return this.updateTokenState(a,m)})})}updateTokenState(e,t){let{hubReserve:s,shares:r,tradable:i}=t;return{...e,hubReserves:v(s.toString()),shares:v(r.toString()),tradeable:i.bits.toNumber()}}getAssetFee(){let t=this.api.consts.dynamicFees.assetFeeParameters.minFee.toNumber();return pe(t)}getProtocolFee(){let t=this.api.consts.dynamicFees.protocolFeeParameters.minFee.toNumber();return pe(t)}getPoolId(){return os(as("modlomnipool".padEnd(32,"\0")),Te)}getPoolLimits(){let e=this.api.consts.omnipool.maxInRatio.toJSON(),t=this.api.consts.omnipool.maxOutRatio.toJSON(),s=this.api.consts.omnipool.minimumTradingLimit.toJSON();return{maxInRatio:e,maxOutRatio:t,minTradingLimit:s}}};var Je=class extends he{isSupported(){return this.api.query.xyk!==void 0}async loadPools(){let t=(await this.api.query.xyk.poolAssets.entries()).map(async([{args:[s]},r])=>{let i=s.toString(),[a,m]=r.unwrap(),[c,y]=await Promise.all([this.getBalance(i,a.toString()),this.getBalance(i,m.toString())]);return{address:i,type:"Xyk",tokens:[{id:a.toString(),balance:c.toString()},{id:m.toString(),balance:y.toString()}],...this.getPoolLimits()}});return Promise.all(t)}async getPoolFees(e,t){return{exchangeFee:this.getExchangeFee()}}getPoolType(){return"Xyk"}subscribePoolChange(e){return this.api.query.xyk.poolAssets(e.address,t=>{})}getExchangeFee(){return this.api.consts.xyk.getExchangeFee.toJSON()}getPoolLimits(){let e=this.api.consts.xyk.maxInRatio.toJSON(),t=this.api.consts.xyk.maxOutRatio.toJSON(),s=this.api.consts.xyk.minTradingLimit.toJSON();return{maxInRatio:e,maxOutRatio:t,minTradingLimit:s}}};import{blake2AsHex as Ps,encodeAddress as bs}from"@polkadot/util-crypto";import{calculate_in_given_out as ls,calculate_out_given_in as us,calculate_amplification as cs,calculate_add_one_asset as ms,calculate_liquidity_out_one_asset as ps,calculate_pool_trade_fee as gs,calculate_shares as hs,calculate_shares_for_amount as ds,pool_account_name as fs}from"@galacticcouncil/math-stableswap";var te=class{static getPoolAddress(e){return fs(e)}static calculateAmplification(e,t,s,r,i){return cs(e,t,s,r,i)}static calculateInGivenOut(e,t,s,r,i,a){return ls(e,t,s,r,i,a)}static calculateAddOneAsset(e,t,s,r,i,a){return ms(e,t,s,r,i,a)}static calculateSharesForAmount(e,t,s,r,i,a){return ds(e,t,s,r,i,a)}static calculateOutGivenIn(e,t,s,r,i,a){return us(e,t,s,r,i,a)}static calculateLiquidityOutOneAsset(e,t,s,r,i,a){return ps(e,t,s,r,i,a)}static calculateShares(e,t,s,r,i){return hs(e,t,s,r,i)}static calculatePoolTradeFee(e,t,s){return gs(e,t,s)}};var Ke=class extends he{stablePools=new Map([]);isSupported(){return this.api.query.stableswap!==void 0}async loadPools(){let[e,t]=await Promise.all([this.api.query.stableswap.pools.entries(),this.api.query.system.number()]),s=t.toNumber(),r=e.map(async([{args:[i]},a])=>{let m=a.unwrap(),c=i.toString(),y=this.getPoolAddress(c),[O,B]=await Promise.all([this.getPoolDelta(c,m,s.toString()),this.getPoolTokens(y,c,m)]);return this.stablePools.set(y,m),{address:y,id:c,type:"Stableswap",fee:pe(m.fee.toNumber()),tokens:B,...O,...this.getPoolLimits()}});return Promise.all(r)}async getPoolFees(e,t){return{fee:this.pools.find(r=>r.address===t).fee}}getPoolType(){return"Stableswap"}async subscribePoolChange(e){return this.api.query.system.number(async t=>{let s=t.toNumber(),r=this.stablePools.get(e.address),i=await this.getPoolDelta(e.id,r,s.toString());Object.assign(e,i)})}async getPoolDelta(e,t,s){let{initialAmplification:r,finalAmplification:i,initialBlock:a,finalBlock:m}=t,c=te.calculateAmplification(r.toString(),i.toString(),a.toString(),m.toString(),s),y=await this.api.query.tokens.totalIssuance(e);return{amplification:c,totalIssuance:y.toString()}}async getPoolTokens(e,t,s){let{assets:r}=s,i=r.map(async c=>{let[y,O]=await Promise.all([this.api.query.stableswap.assetTradability(t,c.toString()),this.getBalance(e,c.toString())]);return{id:c.toString(),tradeable:y.bits.toNumber(),balance:O.toString()}}),a=await Promise.all(i),m=await this.api.query.omnipool.assets(t);if(m.isSome){let{tradable:c}=m.unwrap(),y=await this.getBalance(Ye,t);a.push({id:t,tradeable:c.bits.toNumber(),balance:y.toString()})}return a}getPoolAddress(e){let t=Number(e),s=te.getPoolAddress(t);return bs(Ps(s),Te)}getPoolLimits(){return{maxInRatio:0,maxOutRatio:0,minTradingLimit:this.api.consts.stableswap.minTradingLimit.toJSON()}}};function bt(u){return u.map(({assetIn:e,assetOut:t,pool:s,poolId:r})=>s==="Stableswap"?{pool:{Stableswap:r},assetIn:e,assetOut:t}:{pool:s,assetIn:e,assetOut:t})}var Ze=class extends Error{constructor(e){super(),this.message=`${e} pool invalid`,this.name="PoolNotFound"}},Ft=class extends Error{constructor(e,t){super(),this.message=`${e} pool missing ${t}`,this.name="PoolConfigNotFound"}},Ee=class extends Error{constructor(e,t){super(),this.message=`Route from ${e} to ${t} not found in pool configuration`,this.name="RouteNotFound"}},_t=class extends Error{constructor(e){super(),this.message=`Asset ${e} not available in current network`,this.name="AssetNotFound"}},Et=class extends Error{constructor(e){super(),this.message=`Storage missing ${e}`,this.name="StorageConfigNotFound"}},Rt=class extends Error{constructor(e){super(),this.message=`Subscription type "${e}" not supported`,this.name="SubscriptionNotSupported"}},kt=class extends Error{constructor(e){super(),this.message=`${e}`,this.name="ProviderConfigNotFound"}};var Re=class{api;assetClient;xykClient;omniClient;lbpClient;stableClient;onChainAssets=[];onChainAssetsLoaded=!1;constructor(e){this.api=e,this.assetClient=new Fe(this.api),this.xykClient=new Je(this.api),this.omniClient=new je(this.api),this.lbpClient=new $e(this.api),this.stableClient=new Ke(this.api)}get assets(){return this.onChainAssets}get isRegistrySynced(){return this.onChainAssetsLoaded}async syncRegistry(e){this.onChainAssets=await this.assetClient.getOnChainAssets(!1,e),this.onChainAssetsLoaded=!0}async getPools(e){if(this.onChainAssetsLoaded||this.syncRegistry(),e.length==0){let a=(await Promise.all([this.xykClient,this.omniClient,this.lbpClient,this.stableClient].filter(m=>m.isSupported()).map(m=>m.getPools()))).flat();return this.withMetadata(a)}let t=[];e.forEach(i=>{switch(i){case"Xyk":t.push(this.xykClient.getPools());break;case"Omnipool":t.push(this.omniClient.getPools());break;case"Lbp":t.push(this.lbpClient.getPools());break;case"Stableswap":t.push(this.stableClient.getPools());break}});let r=(await Promise.all(t)).flat();return this.withMetadata(r)}unsubscribe(){this.xykClient.unsubscribe(),this.omniClient.unsubscribe(),this.lbpClient.unsubscribe(),this.stableClient.unsubscribe()}async withMetadata(e){let t=new Map(this.onChainAssets.map(s=>[s.id,s]));return e.filter(s=>s.type==="Xyk"?s.tokens.every(r=>t.get(r.id)):!0).map(s=>{let r=s.tokens.map(i=>{let a=t.get(i.id);return{...i,...a}});return{...s,tokens:r}})}async getPoolFees(e,t){switch(t.type){case"Xyk":return this.xykClient.getPoolFees(e,t.address);case"Omnipool":return this.omniClient.getPoolFees(e,t.address);case"Lbp":return this.lbpClient.getPoolFees(e,t.address);case"Stableswap":return this.stableClient.getPoolFees(e,t.address);default:throw new Ze(t.type)}}isDirectOmnipoolTrade(e){return e.length==1&&e[0].pool=="Omnipool"}buildBuyTx(e,t,s,r,i){let a;this.isDirectOmnipoolTrade(i)?a=this.api.tx.omnipool.buy(t,e,s.toFixed(),r.toFixed()):a=this.api.tx.router.buy(e,t,s.toFixed(),r.toFixed(),bt(i));let m=()=>a;return{hex:a.toHex(),name:"RouterBuy",get:m}}buildSellTx(e,t,s,r,i){let a;this.isDirectOmnipoolTrade(i)?a=this.api.tx.omnipool.sell(e,t,s.toFixed(),r.toFixed()):a=this.api.tx.router.sell(e,t,s.toFixed(),r.toFixed(),bt(i));let m=()=>a;return{hex:a.toHex(),name:"RouterSell",get:m}}};var ke=(u,e)=>u===e?0:u==null?e==null?0:-1:e==null?u==null?0:1:typeof u.compare=="function"?u.compare(e):typeof e.compare=="function"?-e.compare(u):u<e?-1:u>e?1:0;var Qe=(u,e=t=>t!==void 0?": "+t:"")=>class extends Error{constructor(t){super(u(t)+e(t))}};var ys=Qe(()=>"illegal argument(s)"),Lt=u=>{throw new ys(u)};var Ss=Qe(()=>"index out of bounds"),yt=u=>{throw new Ss(u)},Ve=(u,e,t)=>(u<e||u>=t)&&yt(u);var Mt=23283064365386963e-26,et=class{float(e=1){return this.int()*Mt*e}probability(e){return this.float()<e}norm(e=1){return(this.int()*Mt-.5)*2*e}normMinMax(e,t){let s=this.minmax(e,t);return this.float()<.5?s:-s}minmax(e,t){return this.float()*(t-e)+e}minmaxInt(e,t){e|=0;let s=(t|0)-e;return s?e+this.int()%s:e}minmaxUint(e,t){e>>>=0;let s=(t>>>0)-e;return s?e+this.int()%s:e}};var St=Math.random,wt=class extends et{int(){return St()*4294967296>>>0}float(e=1){return St()*e}norm(e=1){return(St()-.5)*2*e}},Dt=new wt;var Ct=u=>u!=null&&typeof u!="function"&&u.length!==void 0;var Gt=Object.getPrototypeOf({}),tt="function",qt="string",xe=(u,e)=>{let t;if(u===e)return!0;if(u!=null){if(typeof u.equiv===tt)return u.equiv(e)}else return u==e;if(e!=null){if(typeof e.equiv===tt)return e.equiv(u)}else return u==e;return typeof u===qt||typeof e===qt?!1:(t=Object.getPrototypeOf(u),(t==null||t===Gt)&&(t=Object.getPrototypeOf(e),t==null||t===Gt)?Bs(u,e):typeof u!==tt&&u.length!==void 0&&typeof e!==tt&&e.length!==void 0?ws(u,e):u instanceof Set&&e instanceof Set?xs(u,e):u instanceof Map&&e instanceof Map?Os(u,e):u instanceof Date&&e instanceof Date?u.getTime()===e.getTime():u instanceof RegExp&&e instanceof RegExp?u.toString()===e.toString():u!==u&&e!==e)},ws=(u,e,t=xe)=>{let s=u.length;if(s===e.length)for(;s-- >0&&t(u[s],e[s]););return s<0},xs=(u,e,t=xe)=>u.size===e.size&&t([...u.keys()].sort(),[...e.keys()].sort()),Os=(u,e,t=xe)=>u.size===e.size&&t([...u].sort(),[...e].sort()),Bs=(u,e,t=xe)=>{if(Object.keys(u).length!==Object.keys(e).length)return!1;for(let s in u)if(!e.hasOwnProperty(s)||!t(u[s],e[s]))return!1;return!0};var Ht=(u,e)=>u!=null&&typeof u[e]=="function";var Ut=u=>Ht(u,"xform")?u.xform():u;var st=Symbol(),xt=()=>{};var zt=u=>u!=null&&typeof u[Symbol.iterator]=="function";var rt=class{value;constructor(e){this.value=e}deref(){return this.value}};var it=u=>u instanceof rt;var Xt=u=>u instanceof rt?u.deref():u;function*Wt(u,e){let t=Ut(u)([xt,xt,(s,r)=>r])[2];for(let s of e){let r=t(st,s);if(it(r)){r=Xt(r.deref()),r!==st&&(yield r);return}r!==st&&(yield r)}}var Yt=(u,e)=>[u[0],u[1],e];function Le(u,e){return zt(e)?Wt(Le(u),e):t=>{let s=t[2];return Yt(t,(r,i)=>s(r,u(i)))}}var nt=class u{_head;_length=0;constructor(e){e&&this.into(e)}get length(){return this._length}get head(){return this._head}[Symbol.iterator](){return $t("next",this._head)}reverseIterator(){return $t("prev",this.tail)}clear(){this.release()}compare(e,t=ke){let s=this._length;if(s<e._length)return-1;if(s>e._length)return 1;if(s===0)return 0;{let r=this._head,i=e._head,a=0;for(;s-- >0&&a===0;)a=t(r.value,i.value),r=r.next,i=i.next;return a}}concat(...e){let t=this.copy();for(let s of e)t.into(s);return t}equiv(e){if(!(e instanceof u||Ct(e))||this._length!==e.length)return!1;if(!this._length||this===e)return!0;let t=e[Symbol.iterator](),s=this._head;for(let r=this._length;r-- >0;){if(!xe(s.value,t.next().value))return!1;s=s.next}return!0}filter(e){let t=this.empty();return this.traverse(s=>(e(s.value)&&t.append(s.value),!0)),t}find(e){return this.traverse(t=>t.value!==e)}findWith(e){return this.traverse(t=>!e(t.value))}first(){return this._head&&this._head.value}insertSorted(e,t){t=t||ke;for(let s=this._head,r=this._length;r-- >0;){if(t(e,s.value)<=0)return this.insertBefore(s,e);s=s.next}return this.append(e)}into(e){for(let t of e)this.append(t);return this}nth(e,t){let s=this.nthCell(e);return s?s.value:t}nthCellUnsafe(e){let t,s;for(e<=this._length>>>1?(t=this._head,s="next"):(t=this.tail,s="prev",e=this._length-e-1);e-- >0&&t;)t=t[s];return t}peek(){return this.tail&&this.tail.value}$reduce(e,t){let s=this._head;for(let r=this._length;r-- >0&&!it(t);)t=e(t,s.value),s=s.next;return t}reduce(e,t){return this.$reduce(e,t)}release(){let e=this._head;if(!e)return!0;let t;for(let s=this._length;s-- >0;)t=e.next,delete e.value,delete e.prev,delete e.next,e=t;return this._head=void 0,this._length=0,!0}reverse(){let e=this._head,t=this.tail,s=(this._length>>>1)+(this._length&1);for(;e&&t&&s>0;){let r=e.value;e.value=t.value,t.value=r,e=e.next,t=t.prev,s--}return this}setHead(e){let t=this._head;return t?(t.value=e,t):this.prepend(e)}setNth(e,t){let s=this.nthCell(e);return!s&&yt(e),s.value=t,s}setTail(e){let t=this.tail;return t?(t.value=e,t):this.append(e)}swap(e,t){if(e!==t){let s=e.value;e.value=t.value,t.value=s}return this}toArray(e=[]){return this.traverse(t=>(e.push(t.value),!0)),e}toJSON(){return this.toArray()}toString(){let e=[];return this.traverse(t=>(e.push(String(t.value)),!0)),e.join(", ")}traverse(e,t=this._head,s){if(!this._head)return;let r=t;do{if(!e(r))break;r=r.next}while(r!==s);return r}_map(e,t){return this.traverse(s=>(e.append(t(s.value)),!0)),e}};function*$t(u,e){for(;e;)yield e.value,e=e[u]}var ot=class u extends nt{_tail;constructor(e){super(),e&&this.into(e)}get tail(){return this._tail}append(e){if(this._tail){let t={value:e,prev:this._tail};return this._tail.next=t,this._tail=t,this._length++,t}else return this.prepend(e)}asHead(e){return e===this._head?this:(this.remove(e),this._head.prev=e,e.next=this._head,e.prev=void 0,this._head=e,this._length++,this)}asTail(e){return e===this._tail?this:(this.remove(e),this._tail.next=e,e.prev=this._tail,e.next=void 0,this._tail=e,this._length++,this)}cons(e){return this.prepend(e),this}copy(){return new u(this)}*cycle(){for(;;)yield*this}drop(){let e=this._head;if(e)return this._head=e.next,this._head?this._head.prev=void 0:this._tail=void 0,this._length--,e.value}empty(){return new u}insertAfter(e,t){let s={value:t,next:e.next,prev:e};return e.next?e.next.prev=s:this._tail=s,e.next=s,this._length++,s}insertAfterNth(e,t){return e<0&&(e+=this._length),e>=this._length-1?this.append(t):(Ve(e,0,this._length),this.insertAfter(this.nthCellUnsafe(e),t))}insertBefore(e,t){let s={value:t,next:e,prev:e.prev};return e.prev?e.prev.next=s:this._head=s,e.prev=s,this._length++,s}insertBeforeNth(e,t){return e<0&&(e+=this._length),e<=0?this.prepend(t):(Ve(e,0,this._length),this.insertBefore(this.nthCellUnsafe(e),t))}map(e){return this._map(new u,e)}nth(e,t){let s=this.nthCell(e);return s?s.value:t}nthCell(e){if(e<0&&(e+=this._length),!(e<0||e>=this._length))return this.nthCellUnsafe(e)}pop(){let e=this._tail;if(e)return this._tail=e.prev,this._tail?this._tail.next=void 0:this._head=void 0,this._length--,e.value}prepend(e){let t={value:e,next:this._head};return this._head?this._head.prev=t:this._tail=t,this._head=t,this._length++,t}push(e){return this.append(e),this}release(){return this._tail=void 0,super.release()}remove(e){return e.prev?e.prev.next=e.next:this._head=e.next,e.next?e.next.prev=e.prev:this._tail=e.prev,this._length--,this}rotateLeft(){switch(this._length){case 0:case 1:return this;case 2:return this.swap(this._head,this._tail);default:return this.push(this.drop())}}rotateRight(){switch(this._length){case 0:case 1:return this;case 2:return this.swap(this._head,this._tail);default:let e=this.peek();return this.pop(),this.prepend(e),this}}seq(e=0,t=this.length){if(e>=t||e<0)return;let s=this.nthCell(e),r=this.nthCell(t-1),i=a=>({first(){return a.value},next(){return a!==r&&a.next?i(a.next):void 0}});return s?i(s):void 0}shuffle(e,t=Dt){if(this._length<2)return this;for(e=e!==void 0?e:Math.ceil(1.5*Math.log2(this._length));e>0;e--){let s=this._head;for(;s;){let r=s.next;t.probability(.5)?this.asHead(s):this.asTail(s),s=r}}return this}slice(e=0,t=this.length){let s=e<0?e+this._length:e,r=t<0?t+this._length:t;(s<0||r<0)&&Lt("invalid indices: ${from} / ${to}");let i=new u,a=this.nthCell(s);for(;a&&++s<=r;)i.push(a.value),a=a.next;return i}sort(e=ke){if(!this._length)return this;let t=1;for(;;){let s=this._head;this._head=void 0,this._tail=void 0;let r=0;for(;s;){r++;let i=s,a=0;for(let c=0;c<t&&(a++,i=i.next,!!i);c++);let m=t;for(;a>0||m>0&&i;){let c;a===0?(c=i,i=i.next,m--):!i||m===0||e(s.value,i.value)<=0?(c=s,s=s.next,a--):(c=i,i=i.next,m--),this._tail?this._tail.next=c:this._head=c,c.prev=this._tail,this._tail=c}s=i}if(this._tail.next=void 0,r<=1)return this;t*=2}}splice(e,t=0,s){let r;typeof e=="number"?(e<0&&(e+=this._length),Ve(e,0,this._length),r=this.nthCellUnsafe(e)):r=e;let i=new u;if(t>0)for(;r&&t-- >0;)this.remove(r),i.push(r.value),r=r.next;else r&&(r=r.next);if(s)if(r)for(let a of s)this.insertBefore(r,a);else for(let a of s)this.push(a);return i}};var at=class u{map;items;opts;_size;constructor(e,t){let s=Object.assign({maxlen:1/0,maxsize:1/0,map:()=>new Map,ksize:()=>0,vsize:()=>0},t);this.map=s.map(),this.items=new ot,this._size=0,this.opts=s,e&&this.into(e)}get length(){return this.items.length}get size(){return this._size}[Symbol.iterator](){return this.entries()}entries(){return Le(e=>[e.k,e],this.items)}keys(){return Le(e=>e.k,this.items)}values(){return Le(e=>e.v,this.items)}copy(){let e=this.empty();e.items=this.items.copy();let t=e.items.head;for(;t;)e.map.set(t.value.k,t),t=t.next;return e}empty(){return new u(null,this.opts)}release(){this._size=0,this.map.clear();let e=this.opts.release;if(e){let t;for(;t=this.items.drop();)e(t.k,t.v);return!0}return this.items.release()}has(e){return this.map.has(e)}get(e,t){let s=this.map.get(e);return s?this.resetEntry(s):t}set(e,t){let s=this.opts.ksize(e)+this.opts.vsize(t),r=this.map.get(e);return this._size+=Math.max(0,s-(r?r.value.s:0)),this.ensureSize()&&this.doSetEntry(r,e,t,s),t}into(e){for(let t of e)this.set(t[0],t[1]);return this}getSet(e,t){let s=this.map.get(e);return s?Promise.resolve(this.resetEntry(s)):t().then(r=>this.set(e,r))}delete(e){let t=this.map.get(e);return t?(this.removeEntry(t),!0):!1}resetEntry(e){return this.items.asTail(e),e.value.v}ensureSize(){let e=this.opts.release,t=this.opts.maxsize,s=this.opts.maxlen;for(;this._size>t||this.length>=s;){let r=this.items.drop();if(!r)return!1;this.map.delete(r.k),e&&e(r.k,r.v),this._size-=r.s}return!0}removeEntry(e){let t=e.value;this.map.delete(t.k),this.items.remove(e),this.opts.release&&this.opts.release(t.k,t.v),this._size-=t.s}doSetEntry(e,t,s,r){e?(e.value.v=s,e.value.s=r,this.items.asTail(e)):(this.items.push({k:t,v:s,s:r}),this.map.set(t,this.items.tail))}};var Ot=class extends Re{feeCache;disconnectSubscribeNewHeads=null;constructor(e){super(e),this.feeCache=new at(null),this.api.rpc.chain.subscribeNewHeads(async t=>{this.feeCache.release()}).then(t=>{this.disconnectSubscribeNewHeads=t})}async getPoolFees(e,t){let s=[t.address,e].join("-");if(this.feeCache.has(s))return this.feeCache.get(s);{let i=await super.getPoolFees(e,t);return this.feeCache.set(s,i),i}}async destroy(){console.log(`Destroying pool cache!
2
+ Items: [${this.feeCache.length}]`),this.feeCache.release(),this.disconnectSubscribeNewHeads?.()}};var Me=class u{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;fee;repayFeeApply;static fromPool(e){return new u(e.address,e.tokens,e.maxInRatio,e.maxOutRatio,e.minTradingLimit,e.fee,e.repayFeeApply)}constructor(e,t,s,r,i,a,m){this.type="Lbp",this.address=e,this.tokens=t,this.maxInRatio=s,this.maxOutRatio=r,this.minTradingLimit=i,this.fee=a,this.repayFeeApply=m}validatePair(e,t){return!0}parsePair(e,t){let s=new Map(this.tokens.map(c=>[c.id,c])),r=s.get(e),i=s.get(t);if(r==null)throw new Error("Pool does not contain tokenIn");if(i==null)throw new Error("Pool does not contain tokenOut");let a=v(r.balance),m=v(i.balance);return{assetIn:e,assetOut:t,balanceIn:a,balanceOut:m,decimalsIn:r.decimals,decimalsOut:i.decimals,weightIn:r.weight,weightOut:i.weight}}validateAndBuy(e,t,s){let r=this.tokens[0].id,i=[];t.isLessThan(this.minTradingLimit)&&i.push("InsufficientTradingAmount");let a=e.balanceOut.div(this.maxOutRatio);if(t.isGreaterThan(a)&&i.push("MaxOutRatioExceeded"),r===e.assetOut){let m=this.calculateTradeFee(t,s),c=ue(this.repayFeeApply?s.repayFee:s.exchangeFee),y=t.plus(m),O=this.calculateInGivenOut(e,y),B=e.balanceIn.div(this.maxInRatio);return O.isGreaterThan(B)&&i.push("MaxInRatioExceeded"),{amountIn:O,calculatedIn:O,amountOut:t,feePct:c,errors:i}}else{let m=this.calculateInGivenOut(e,t),c=e.balanceIn.div(this.maxInRatio);return m.isGreaterThan(c)&&i.push("MaxInRatioExceeded"),{amountIn:m,calculatedIn:m,amountOut:t,feePct:0,errors:i}}}validateAndSell(e,t,s){let r=this.tokens[0].id,i=[];t.isLessThan(this.minTradingLimit)&&i.push("InsufficientTradingAmount");let a=e.balanceIn.div(this.maxInRatio);if(t.isGreaterThan(a)&&i.push("MaxInRatioExceeded"),r===e.assetIn){let m=this.calculateOutGivenIn(e,t),c=e.balanceOut.div(this.maxOutRatio);return m.isGreaterThan(c)&&i.push("MaxOutRatioExceeded"),{amountIn:t,calculatedOut:m,amountOut:m,feePct:0,errors:i}}else{let m=this.calculateOutGivenIn(e,t),c=this.calculateTradeFee(m,s),y=ue(this.repayFeeApply?s.repayFee:s.exchangeFee),O=m.minus(c),B=e.balanceOut.div(this.maxOutRatio);return O.isGreaterThan(B)&&i.push("MaxOutRatioExceeded"),{amountIn:t,calculatedOut:m,amountOut:O,feePct:y,errors:i}}}calculateInGivenOut(e,t){let s=me.calculateInGivenOut(e.balanceIn.toString(),e.balanceOut.toString(),e.weightIn.toString(),e.weightOut.toString(),t.toFixed(0)),r=v(s);return r.isNegative()?R:r}calculateOutGivenIn(e,t){let s=me.calculateOutGivenIn(e.balanceIn.toString(),e.balanceOut.toString(),e.weightIn.toString(),e.weightOut.toString(),t.toFixed(0)),r=v(s);return r.isNegative()?R:r}spotPriceInGivenOut(e){let t=me.getSpotPrice(e.balanceOut.toString(),e.balanceIn.toString(),e.weightOut.toString(),e.weightIn.toString(),J(le,e.decimalsOut).toString());return v(t)}spotPriceOutGivenIn(e){let t=me.getSpotPrice(e.balanceIn.toString(),e.balanceOut.toString(),e.weightIn.toString(),e.weightOut.toString(),J(le,e.decimalsIn).toString());return v(t)}calculateTradeFee(e,t){let s=me.calculatePoolTradeFee(e.toString(),this.repayFeeApply?t.repayFee[0]:t.exchangeFee[0],this.repayFeeApply?t.repayFee[1]:t.exchangeFee[1]);return v(s)}};import{calculate_in_given_out as vs,calculate_lrna_in_given_out as Is,calculate_out_given_in as As,calculate_out_given_lrna_in as Ns,calculate_pool_trade_fee as Ts,calculate_spot_price as Fs,calculate_lrna_spot_price as _s,calculate_shares as Es,calculate_liquidity_out as Rs,calculate_liquidity_lrna_out as ks,verify_asset_cap as Ls,calculate_liquidity_hub_in as Ms,is_sell_allowed as Ds,is_buy_allowed as Cs,is_add_liquidity_allowed as Gs,is_remove_liquidity_allowed as qs}from"@galacticcouncil/math-omnipool";var W=class{static calculateSpotPrice(e,t,s,r){return Fs(e,t,s,r)}static calculateLrnaSpotPrice(e,t){return _s(e,t)}static calculateInGivenOut(e,t,s,r,i,a,m,c,y){return vs(e,t,s,r,i,a,m,c,y)}static calculateLrnaInGivenOut(e,t,s,r,i){return Is(e,t,s,r,i)}static calculateOutGivenIn(e,t,s,r,i,a,m,c,y){return As(e,t,s,r,i,a,m,c,y)}static calculateOutGivenLrnaIn(e,t,s,r,i){return Ns(e,t,s,r,i)}static calculatePoolTradeFee(e,t,s){return Ts(e,t,s)}static calculateShares(e,t,s,r){return Es(e,t,s,r)}static calculateLiquidityOut(e,t,s,r,i,a,m,c){return Rs(e,t,s,r,i,a,m,c)}static calculateLiquidityLRNAOut(e,t,s,r,i,a,m,c){return ks(e,t,s,r,i,a,m,c)}static calculateCapDifference(e,t,s,r){let i=G(t),a=G(e),m=G(r),y=G(s).shiftedBy(-18);if(i.div(m).lt(y)){let B=y.times(m).minus(i).times(a),N=i.times(G(1).minus(y));return B.div(N).toFixed(0)}else return"0"}static verifyAssetCap(e,t,s,r){return Ls(e,t,s,r)}static calculateLimitHubIn(e,t,s,r){return Ms(e,t,s,r)}static isSellAllowed(e){return Ds(e)}static isBuyAllowed(e){return Cs(e)}static isAddLiquidityAllowed(e){return Gs(e)}static isRemoveLiquidityAllowed(e){return qs(e)}};var De=class u{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;hubAssetId;static fromPool(e){return new u(e.address,e.tokens,e.maxInRatio,e.maxOutRatio,e.minTradingLimit,e.hubAssetId)}constructor(e,t,s,r,i,a){this.type="Omnipool",this.address=e,this.tokens=t,this.maxInRatio=s,this.maxOutRatio=r,this.minTradingLimit=i,this.hubAssetId=a}validatePair(e,t){return this.hubAssetId!=t}parsePair(e,t){let s=new Map(this.tokens.map(O=>[O.id,O])),r=s.get(e),i=s.get(t);if(r==null)throw new Error("Pool does not contain tokenIn");if(i==null)throw new Error("Pool does not contain tokenOut");let a=v(r.balance),m=v(i.balance),c=v(r.existentialDeposit),y=v(i.existentialDeposit);return{assetIn:e,assetOut:t,hubReservesIn:r.hubReserves,hubReservesOut:i.hubReserves,sharesIn:r.shares,sharesOut:i.shares,decimalsIn:r.decimals,decimalsOut:i.decimals,balanceIn:a,balanceOut:m,tradeableIn:r.tradeable,tradeableOut:i.tradeable,assetInED:c,assetOutED:y}}validateAndBuy(e,t,s){let r=this.calculateInGivenOut(e,t),i=this.calculateInGivenOut(e,t,s),a=i.minus(r),m=r===R?R:a.div(r).multipliedBy(100).decimalPlaces(2),c=[],y=W.isSellAllowed(e.tradeableIn),O=W.isBuyAllowed(e.tradeableOut);(!y||!O)&&c.push("TradeNotAllowed"),(t.isLessThan(this.minTradingLimit)||r.isLessThan(e.assetInED))&&c.push("InsufficientTradingAmount");let B=e.balanceOut.div(this.maxOutRatio);t.isGreaterThan(B)&&c.push("MaxOutRatioExceeded");let N=e.balanceIn.div(this.maxInRatio);return i.isGreaterThan(N)&&c.push("MaxInRatioExceeded"),{amountIn:i,calculatedIn:r,amountOut:t,feePct:m.toNumber(),errors:c}}validateAndSell(e,t,s){let r=this.calculateOutGivenIn(e,t),i=this.calculateOutGivenIn(e,t,s),m=r.minus(i).div(r).multipliedBy(100).decimalPlaces(2),c=[],y=W.isSellAllowed(e.tradeableIn),O=W.isBuyAllowed(e.tradeableOut);(!y||!O)&&c.push("TradeNotAllowed"),(t.isLessThan(this.minTradingLimit)||r.isLessThan(e.assetOutED))&&c.push("InsufficientTradingAmount");let B=e.balanceIn.div(this.maxInRatio);t.isGreaterThan(B)&&c.push("MaxInRatioExceeded");let N=e.balanceOut.div(this.maxOutRatio);return i.isGreaterThan(N)&&c.push("MaxOutRatioExceeded"),{amountIn:t,calculatedOut:r,amountOut:i,feePct:m.toNumber(),errors:c}}calculateInGivenOut(e,t,s){if(e.assetIn==this.hubAssetId)return this.calculateLrnaInGivenOut(e,t,s);let r=W.calculateInGivenOut(e.balanceIn.toString(),e.hubReservesIn.toString(),e.sharesIn.toString(),e.balanceOut.toString(),e.hubReservesOut.toString(),e.sharesOut.toString(),t.toFixed(0),s?ee(s.assetFee).toString():R.toString(),s?ee(s.protocolFee).toString():R.toString()),i=v(r);return i.isNegative()?R:i}calculateLrnaInGivenOut(e,t,s){let r=W.calculateLrnaInGivenOut(e.balanceOut.toString(),e.hubReservesOut.toString(),e.sharesOut.toString(),t.toFixed(0),s?ee(s.assetFee).toString():R.toString()),i=v(r);return i.isNegative()?R:i}calculateOutGivenIn(e,t,s){if(e.assetIn==this.hubAssetId)return this.calculateOutGivenLrnaIn(e,t,s);let r=W.calculateOutGivenIn(e.balanceIn.toString(),e.hubReservesIn.toString(),e.sharesIn.toString(),e.balanceOut.toString(),e.hubReservesOut.toString(),e.sharesOut.toString(),t.toFixed(0),s?ee(s.assetFee).toString():R.toString(),s?ee(s.protocolFee).toString():R.toString()),i=v(r);return i.isNegative()?R:i}calculateOutGivenLrnaIn(e,t,s){let r=W.calculateOutGivenLrnaIn(e.balanceOut.toString(),e.hubReservesOut.toString(),e.sharesOut.toString(),t.toFixed(0),s?ee(s.assetFee).toString():R.toString()),i=v(r);return i.isNegative()?R:i}spotPriceInGivenOut(e){if(e.assetIn==this.hubAssetId)return this.spotPriceLrnaInGivenOut(e);let t=W.calculateSpotPrice(e.balanceOut.toString(),e.hubReservesOut.toString(),e.balanceIn.toString(),e.hubReservesIn.toString());return v(t).shiftedBy(-1*(Ne-e.decimalsOut)).decimalPlaces(0,1)}spotPriceLrnaInGivenOut(e){let t=W.calculateLrnaSpotPrice(e.hubReservesOut.toString(),e.balanceOut.toString());return v(t).shiftedBy(-1*(Ne-e.decimalsOut)).decimalPlaces(0,1)}spotPriceOutGivenIn(e){if(e.assetIn==this.hubAssetId)return this.spotPriceOutGivenLrnaIn(e);let t=W.calculateSpotPrice(e.balanceIn.toString(),e.hubReservesIn.toString(),e.balanceOut.toString(),e.hubReservesOut.toString());return v(t).shiftedBy(-1*(Ne-e.decimalsIn)).decimalPlaces(0,1)}spotPriceOutGivenLrnaIn(e){let t=W.calculateLrnaSpotPrice(e.balanceOut.toString(),e.hubReservesOut.toString());return v(t).shiftedBy(-1*(Ne-e.decimalsIn)).decimalPlaces(0,1)}};var Ce=class u{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;amplification;id;fee;totalIssuance;static fromPool(e){return new u(e.address,e.tokens,e.maxInRatio,e.maxOutRatio,e.minTradingLimit,e.amplification,e.id,e.fee,e.totalIssuance)}constructor(e,t,s,r,i,a,m,c,y){this.type="Stableswap",this.address=e,this.tokens=t,this.maxInRatio=s,this.maxOutRatio=r,this.minTradingLimit=i,this.amplification=a,this.id=m,this.fee=c,this.totalIssuance=y}validatePair(e,t){return!0}parsePair(e,t){let s=new Map(this.tokens.map(O=>[O.id,O])),r=s.get(e),i=s.get(t);if(r==null)throw new Error("Pool does not contain tokenIn");if(i==null)throw new Error("Pool does not contain tokenOut");let a=v(r.balance),m=v(i.balance),c=v(r.existentialDeposit),y=v(i.existentialDeposit);return{assetIn:e,assetOut:t,balanceIn:a,balanceOut:m,decimalsIn:r.decimals,decimalsOut:i.decimals,tradeableIn:this.id===e?dt:r.tradeable,tradeableOut:this.id===t?dt:i.tradeable,assetInED:c,assetOutED:y}}validateAndBuy(e,t,s){let r=this.calculateInGivenOut(e,t),i=this.calculateInGivenOut(e,t,s),a=ue(s.fee),m=[],c=W.isSellAllowed(e.tradeableIn),y=W.isBuyAllowed(e.tradeableOut);return(!c||!y)&&m.push("TradeNotAllowed"),(t.isLessThan(this.minTradingLimit)||r.isLessThan(e.assetInED))&&m.push("InsufficientTradingAmount"),{amountIn:i,calculatedIn:r,amountOut:t,feePct:a,errors:m}}validateAndSell(e,t,s){let r=this.calculateOutGivenIn(e,t),i=this.calculateOutGivenIn(e,t,s),a=ue(s.fee),m=[],c=W.isSellAllowed(e.tradeableIn),y=W.isBuyAllowed(e.tradeableOut);return(!c||!y)&&m.push("TradeNotAllowed"),(t.isLessThan(this.minTradingLimit)||r.isLessThan(e.assetOutED))&&m.push("InsufficientTradingAmount"),{amountIn:t,calculatedOut:r,amountOut:i,feePct:a,errors:m}}calculateIn(e,t,s){let r=te.calculateInGivenOut(this.getReserves(),Number(e.assetIn),Number(e.assetOut),t.toFixed(0),this.amplification,s?ee(s.fee).toString():R.toString()),i=v(r);return i.isNegative()?R:i}calculateAddOneAsset(e,t,s){let r=te.calculateAddOneAsset(this.getReserves(),t.toFixed(0),Number(e.assetIn),this.amplification,this.totalIssuance,s?ee(s.fee).toString():R.toString()),i=v(r);return i.isNegative()?R:i}calculateSharesForAmount(e,t,s){let r=te.calculateSharesForAmount(this.getReserves(),Number(e.assetOut),t.toFixed(0),this.amplification,this.totalIssuance,s?ee(s.fee).toString():R.toString()),i=v(r);return i.isNegative()?R:i}calculateInGivenOut(e,t,s){return e.assetOut==this.id?this.calculateAddOneAsset(e,t,s):e.assetIn==this.id?this.calculateSharesForAmount(e,t,s):this.calculateIn(e,t,s)}spotPriceInGivenOut(e){let t=J(le,e.decimalsOut);return e.assetOut==this.id?this.calculateAddOneAsset(e,t):e.assetIn==this.id?this.calculateSharesForAmount(e,t):this.calculateIn(e,t)}calculateOut(e,t,s){let r=te.calculateOutGivenIn(this.getReserves(),Number(e.assetIn),Number(e.assetOut),t.toFixed(0),this.amplification,s?ee(s.fee).toString():R.toString()),i=v(r);return i.isNegative()?R:i}calculateWithdrawOneAsset(e,t,s){let r=te.calculateLiquidityOutOneAsset(this.getReserves(),t.toFixed(0),Number(e.assetOut),this.amplification,this.totalIssuance,s?ee(s.fee).toString():R.toString()),i=v(r);return i.isNegative()?R:i}calculateShares(e,t,s){let r=te.calculateShares(this.getReserves(),this.getAssets(e.assetIn,t),this.amplification,this.totalIssuance,s?ee(s.fee).toString():R.toString()),i=v(r);return i.isNegative()?R:i}calculateOutGivenIn(e,t,s){return e.assetIn==this.id?this.calculateWithdrawOneAsset(e,t,s):e.assetOut==this.id?this.calculateShares(e,t,s):this.calculateOut(e,t,s)}spotPriceOutGivenIn(e){let t=J(le,e.decimalsIn);return e.assetIn==this.id?this.calculateWithdrawOneAsset(e,t):e.assetOut==this.id?this.calculateShares(e,t):this.calculateOut(e,t)}calculateTradeFee(e,t){let s=te.calculatePoolTradeFee(e.toString(),t.fee[0],t.fee[1]);return v(s)}getReserves(){let e=this.tokens.filter(t=>t.id!=this.id).map(({id:t,balance:s,decimals:r})=>({asset_id:Number(t),amount:s,decimals:r}));return JSON.stringify(e)}getAssets(e,t){let s={asset_id:Number(e),amount:t.toFixed(0)};return JSON.stringify([s])}};import{calculate_in_given_out as Hs,calculate_out_given_in as Us,calculate_pool_trade_fee as zs,get_spot_price as Xs,calculate_liquidity_in as Ws,calculate_shares as Ys,calculate_spot_price as $s,calculate_spot_price_with_fee as js,calculate_liquidity_out_asset_a as Js,calculate_liquidity_out_asset_b as Ks}from"@galacticcouncil/math-xyk";var Pe=class{static getSpotPrice(e,t,s){return Xs(e,t,s)}static calculateInGivenOut(e,t,s){return Hs(e,t,s)}static calculateOutGivenIn(e,t,s){return Us(e,t,s)}static calculatePoolTradeFee(e,t,s){return zs(e,t,s)}static calculateLiquidityIn(e,t,s){return Ws(e,t,s)}static calculateSpotPrice(e,t){return $s(e,t)}static calculateSpotPriceWithFee(e,t,s,r){return js(e,t,s,r)}static calculateShares(e,t,s){return Ys(e,t,s)}static calculateLiquidityOutAssetA(e,t,s,r){return Js(e,t,s,r)}static calculateLiquidityOutAssetB(e,t,s,r){return Ks(e,t,s,r)}};var Ge=class u{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;static fromPool(e){return new u(e.address,e.tokens,e.maxInRatio,e.maxOutRatio,e.minTradingLimit)}constructor(e,t,s,r,i){this.type="Xyk",this.address=e,this.tokens=t,this.maxInRatio=s,this.maxOutRatio=r,this.minTradingLimit=i}validatePair(e,t){return!0}parsePair(e,t){let s=new Map(this.tokens.map(O=>[O.id,O])),r=s.get(e),i=s.get(t);if(r==null)throw new Error("Pool does not contain tokenIn");if(i==null)throw new Error("Pool does not contain tokenOut");let a=v(r.balance),m=v(i.balance),c=v(r.existentialDeposit),y=v(i.existentialDeposit);return{assetIn:e,assetOut:t,decimalsIn:r.decimals,decimalsOut:i.decimals,balanceIn:a,balanceOut:m,assetInED:c,assetOutED:y}}validateAndBuy(e,t,s){let r=this.calculateInGivenOut(e,t),i=this.calculateTradeFee(r,s),a=ue(s.exchangeFee),m=r.plus(i),c=[];(t.isLessThan(this.minTradingLimit)||r.isLessThan(e.assetInED))&&c.push("InsufficientTradingAmount");let y=e.balanceOut.div(this.maxOutRatio);t.isGreaterThan(y)&&c.push("MaxOutRatioExceeded");let O=e.balanceIn.div(this.maxInRatio);return m.isGreaterThan(O)&&c.push("MaxInRatioExceeded"),{amountIn:m,calculatedIn:r,amountOut:t,feePct:a,errors:c}}validateAndSell(e,t,s){let r=this.calculateOutGivenIn(e,t),i=this.calculateTradeFee(r,s),a=ue(s.exchangeFee),m=r.minus(i),c=[];(t.isLessThan(this.minTradingLimit)||r.isLessThan(e.assetOutED))&&c.push("InsufficientTradingAmount");let y=e.balanceIn.div(this.maxInRatio);t.isGreaterThan(y)&&c.push("MaxInRatioExceeded");let O=e.balanceOut.div(this.maxOutRatio);return m.isGreaterThan(O)&&c.push("MaxOutRatioExceeded"),{amountIn:t,calculatedOut:r,amountOut:m,feePct:a,errors:c}}calculateInGivenOut(e,t){let s=Pe.calculateInGivenOut(e.balanceIn.toString(),e.balanceOut.toString(),t.toFixed(0)),r=v(s);return r.isNegative()?R:r}calculateOutGivenIn(e,t){let s=Pe.calculateOutGivenIn(e.balanceIn.toString(),e.balanceOut.toString(),t.toFixed(0)),r=v(s);return r.isNegative()?R:r}spotPriceInGivenOut(e){let t=Pe.calculateSpotPrice(e.balanceOut.toString(),e.balanceIn.toString()),s=J(le,18-e.decimalsOut);return v(t).div(s)}spotPriceOutGivenIn(e){let t=Pe.calculateSpotPrice(e.balanceIn.toString(),e.balanceOut.toString()),s=J(le,18-e.decimalsIn);return v(t).div(s)}calculateTradeFee(e,t){let s=Pe.calculatePoolTradeFee(e.toString(),t.exchangeFee[0],t.exchangeFee[1]);return v(s)}};var qe=class{static get(e){switch(e.type){case"Xyk":return Ge.fromPool(e);case"Omnipool":return De.fromPool(e);case"Lbp":return Me.fromPool(e);case"Stableswap":return Ce.fromPool(e);default:throw new Error("Pool type "+e.type+" is not supported yet")}}};var Oe=class{routeSuggester;routerOptions;poolService;defaultRouterOptions={includeOnly:[]};constructor(e,t){this.poolService=e,this.routeSuggester=new Ie,this.routerOptions={...this.defaultRouterOptions,...t}}async getPools(){let e=this.routerOptions.includeOnly;return await this.poolService.getPools(e)}async getAllAssets(){let e=await this.getPools();if(e.length===0)throw new Error("No pools configured");let t=await this.getAssets(e);return[...new Map(t).values()]}async getAssetPairs(e){let t=await this.getPools();if(t.length===0)throw new Error("No pools configured");let{assets:s,poolsMap:r}=await this.validateToken(e,t),a=this.getPaths(e,null,r,t).map(m=>m[m.length-1].assetOut);return this.toAssets([...new Set(a)],s)}async getAllPaths(e,t){let s=await this.getPools();if(s.length===0)throw new Error("No pools configured");let{poolsMap:r}=await this.validateTokenPair(e,t,s);return this.getPaths(e,t,r,s)}async getAssets(e){let t=e.map(s=>s.tokens.map(r=>({id:r.id,name:r.name,symbol:r.symbol,decimals:r.decimals,icon:r.icon,type:r.type,isSufficient:r.isSufficient,existentialDeposit:r.existentialDeposit,origin:r.origin,meta:r.meta,externalId:r.externalId,isWhiteListed:r.isWhiteListed}))).flat();return new Map(t.map(s=>[s.id,s]))}getPaths(e,t,s,r){return this.routeSuggester.getProposals(e,t,r).filter(m=>this.validPath(m,s)).map(m=>this.toHops(m,s))}async validateTokenPair(e,t,s){let r=await this.getAssets(s);if(r.get(e)==null)throw new Error(e+" is not supported token");if(r.get(t)==null)throw new Error(t+" is not supported token");let i=this.getPoolMap(s);return{assets:r,poolsMap:i}}async validateToken(e,t){let s=await this.getAssets(t);if(s.get(e)==null)throw new Error(e+" is not supported token");let r=this.getPoolMap(t);return{assets:s,poolsMap:r}}getPoolMap(e){return new Map(e.map(t=>[t.address,qe.get(t)]))}validPath(e,t){return e.length>0&&e.map(s=>this.validEdge(s,t)).reduce((s,r)=>s&&r)}validEdge([e,t,s],r){return r.get(e)?.validatePair(t,s)||!1}toHops(e,t){return e.map(([s,r,i])=>{let a=t.get(s);return{poolAddress:s,poolId:a?.id,pool:a?.type,assetIn:r,assetOut:i}})}toAssets(e,t){return e.map(s=>t.get(s))}};function Tl(u,e){return u.minus(e).abs().div(u.plus(e).div(2)).multipliedBy(100).decimalPlaces(2)}function He(u,e){return u.minus(e).div(e).multipliedBy(100).decimalPlaces(2)}function jt(u,e){return le.minus(e.div(u)).multipliedBy(100).decimalPlaces(2)}function Jt(u,e){return e.div(u).minus(le).multipliedBy(100).decimalPlaces(2)}var lt=class extends Oe{isDirectTrade(e){return e.length==1}findBestSellRoute(e){let t=e.sort((s,r)=>{let i=s[s.length-1].amountOut,a=r[r.length-1].amountOut;return i.isGreaterThan(a)?-1:1});return t.find(s=>s.every(r=>r.errors.length==0))||t[0]}getRouteFeeRange(e){if(e.filter(s=>s.tradeFeeRange).length>0){let s=e.map(i=>i.tradeFeeRange?.[0]??i.tradeFeePct).reduce((i,a)=>i+a),r=e.map(i=>i.tradeFeeRange?.[1]??i.tradeFeePct).reduce((i,a)=>i+a);return[s,r]}}getPoolFeeRange(e){let t=e.min?ue(e.min):void 0,s=e.max?ue(e.max):void 0;if(t&&s)return[t,s]}async getBestSell(e,t,s){return this.getSell(e,t,s)}async getSell(e,t,s,r){let i=await super.getPools();if(i.length===0)throw new Error("No pools configured");let{poolsMap:a}=await super.validateTokenPair(e,t,i),m=super.getPaths(e,t,a,i);if(m.length===0)throw new Ee(e,t);let c;if(r)c=await this.toSellSwaps(s,r,a);else{let E=m.map(async n=>await this.toSellSwaps(s,n,a)),X=await Promise.all(E);c=this.findBestSellRoute(X)}let y=c[0],O=c[c.length-1],B=this.isDirectTrade(c),N=c.map(E=>E.spotPrice.shiftedBy(-1*E.assetOutDecimals)).reduce((E,X)=>E.multipliedBy(X)),F=J(N,O.assetOutDecimals),_=B?O.calculatedOut:this.calculateDelta0Y(y.amountIn,c,a),D=O.amountOut,k=B?O.tradeFeePct:jt(_,D).toNumber(),H=_.minus(D),w=this.getRouteFeeRange(c),j=y.amountIn.shiftedBy(-1*y.assetInDecimals).multipliedBy(F),se=He(_,j),de=E=>this.poolService.buildSellTx(e,t,y.amountIn,E,c.map(X=>X));return{type:"Sell",amountIn:y.amountIn,amountOut:O.amountOut,spotPrice:F,tradeFee:H,tradeFeePct:k,tradeFeeRange:w,priceImpactPct:se.toNumber(),swaps:c,toTx:de,toHuman(){return{type:"Sell",amountIn:K(y.amountIn,y.assetInDecimals),amountOut:K(O.amountOut,O.assetOutDecimals),spotPrice:K(F,O.assetOutDecimals),tradeFee:K(H,O.assetOutDecimals),tradeFeePct:k,tradeFeeRange:w,priceImpactPct:se.toNumber(),swaps:c.map(E=>E.toHuman())}}}}calculateDelta0Y(e,t,s){let r=[];for(let i=0;i<t.length;i++){let a=t[i],m=s.get(a.poolAddress);if(m==null)throw new Error("Pool does not exit");let c=m.parsePair(a.assetIn,a.assetOut),y;i>0?y=r[i-1]:y=e;let O=m.calculateOutGivenIn(c,y);r.push(O)}return r[r.length-1]}async toSellSwaps(e,t,s){let r=[];for(let i=0;i<t.length;i++){let a=t[i],m=s.get(a.poolAddress);if(m==null)throw new Error("Pool does not exit");let c=m.parsePair(a.assetIn,a.assetOut),y;i>0?y=r[i-1].amountOut:y=J(v(e),c.decimalsIn).decimalPlaces(0,1);let O=await this.poolService.getPoolFees(c.assetOut,m),{amountOut:B,calculatedOut:N,feePct:F,errors:_}=m.validateAndSell(c,y,O),D=this.getPoolFeeRange(O),k=m.spotPriceOutGivenIn(c),H=y.shiftedBy(-1*c.decimalsIn).multipliedBy(k),w=He(N,H);r.push({...a,assetInDecimals:c.decimalsIn,assetOutDecimals:c.decimalsOut,amountIn:y,calculatedOut:N,amountOut:B,spotPrice:k,tradeFeePct:F,tradeFeeRange:D,priceImpactPct:w.toNumber(),errors:_,toHuman(){return{...a,amountIn:K(y,c.decimalsIn),calculatedOut:K(N,c.decimalsOut),amountOut:K(B,c.decimalsOut),spotPrice:K(k,c.decimalsOut),tradeFeePct:F,tradeFeeRange:D,priceImpactPct:w.toNumber(),errors:_}}})}return r}async getBestSpotPrice(e,t){let s=await super.getPools();if(s.length===0)throw new Error("No pools configured");let{poolsMap:r}=await super.validateTokenPair(e,t,s),i=super.getPaths(e,t,r,s);if(i.length===0)return Promise.resolve(void 0);let a=s.map(w=>w.tokens.find(j=>j.id===e)).filter(w=>!!w).sort((w,j)=>Number(j.balance)-Number(w.balance)),{balance:m,decimals:c}=a[0],O=v(m).shiftedBy(-1*c).div(100).multipliedBy(.1),B=i.map(async w=>await this.toSellSwaps(O,w,r)),N=await Promise.all(B),F=this.findBestSellRoute(N),_=await this.toSellSwaps("1",F,r),D=_.map(w=>w.spotPrice.shiftedBy(-1*w.assetOutDecimals)).reduce((w,j)=>w.multipliedBy(j)),k=_[_.length-1].assetOutDecimals;return{amount:J(D,k),decimals:k}}findBestBuyRoute(e){let t=e.sort((s,r)=>{let i=s[0].amountIn,a=r[0].amountIn;return i.isGreaterThan(a)?1:-1});return t.find(s=>s.every(r=>r.errors.length==0))||t[0]}async getBestBuy(e,t,s){return this.getBuy(e,t,s)}async getBuy(e,t,s,r){let i=await super.getPools();if(i.length===0)throw new Error("No pools configured");let{poolsMap:a}=await super.validateTokenPair(e,t,i),m=super.getPaths(e,t,a,i);if(m.length===0)throw new Ee(e,t);let c;if(r)c=await this.toBuySwaps(s,r,a);else{let E=m.map(async n=>await this.toBuySwaps(s,n,a)),X=await Promise.all(E);c=this.findBestBuyRoute(X)}let y=c[c.length-1],O=c[0],B=this.isDirectTrade(c),N=c.map(E=>E.spotPrice.shiftedBy(-1*E.assetInDecimals)).reduce((E,X)=>E.multipliedBy(X)),F=J(N,O.assetInDecimals),_=B?O.calculatedIn:this.calculateDelta0X(y.amountOut,c,a),D=O.amountIn,k=B?O.tradeFeePct:Jt(_,D).toNumber(),H=D.minus(_),w=this.getRouteFeeRange(c),j=y.amountOut.shiftedBy(-1*y.assetOutDecimals).multipliedBy(F),se;_.isZero()?se=-100:se=He(j,_).toNumber();let de=E=>this.poolService.buildBuyTx(e,t,y.amountOut,E,c.map(X=>X));return{type:"Buy",amountOut:y.amountOut,amountIn:O.amountIn,spotPrice:F,tradeFee:H,tradeFeePct:k,tradeFeeRange:w,priceImpactPct:se,swaps:c,toTx:de,toHuman(){return{type:"Buy",amountOut:K(y.amountOut,y.assetOutDecimals),amountIn:K(O.amountIn,O.assetInDecimals),spotPrice:K(F,O.assetInDecimals),tradeFee:K(H,O.assetInDecimals),tradeFeePct:k,tradeFeeRange:w,priceImpactPct:se,swaps:c.map(E=>E.toHuman())}}}}calculateDelta0X(e,t,s){let r=[];for(let i=t.length-1;i>=0;i--){let a=t[i],m=s.get(a.poolAddress);if(m==null)throw new Error("Pool does not exit");let c=m.parsePair(a.assetIn,a.assetOut),y;i==t.length-1?y=e:y=r[0];let O=m.calculateInGivenOut(c,y);r.unshift(O)}return r[0]}async toBuySwaps(e,t,s){let r=[];for(let i=t.length-1;i>=0;i--){let a=t[i],m=s.get(a.poolAddress);if(m==null)throw new Error("Pool does not exit");let c=m.parsePair(a.assetIn,a.assetOut),y;i==t.length-1?y=J(v(e),c.decimalsOut).decimalPlaces(0,1):y=r[0].amountIn;let O=await this.poolService.getPoolFees(c.assetOut,m),{amountIn:B,calculatedIn:N,feePct:F,errors:_}=m.validateAndBuy(c,y,O),D=this.getPoolFeeRange(O),k=m.spotPriceInGivenOut(c),H=y.shiftedBy(-1*c.decimalsOut).multipliedBy(k),w;N.isZero()?w=-100:w=He(H,N).toNumber(),r.unshift({...a,assetInDecimals:c.decimalsIn,assetOutDecimals:c.decimalsOut,amountOut:y,calculatedIn:N,amountIn:B,spotPrice:k,tradeFeePct:F,tradeFeeRange:D,priceImpactPct:w,errors:_,toHuman(){return{...a,amountOut:K(y,c.decimalsOut),calculatedIn:K(N,c.decimalsIn),amountIn:K(B,c.decimalsIn),spotPrice:K(k,c.decimalsIn),tradeFeePct:F,tradeFeeRange:D,priceImpactPct:w,errors:_}}})}return r}};export{Fe as AssetClient,_t as AssetNotFound,Br as BASILISK_PARACHAIN_ID,_e as BalanceClient,G as BigNumber,Ot as CachingPoolService,Qt as DECIMAL_PLACES,ft as DENOMINATOR,Pt as FarmClient,Ye as HYDRADX_OMNIPOOL_ADDRESS,Or as HYDRADX_PARACHAIN_ID,Te as HYDRADX_SS58_PREFIX,dr as INFINITY,me as LbpMath,Me as LbpPool,le as ONE,W as OmniMath,De as OmniPool,Ft as PoolConfigNotFound,Ae as PoolError,qe as PoolFactory,Ze as PoolNotFound,Re as PoolService,re as PoolType,kt as ProviderConfigNotFound,Ne as RUNTIME_DECIMALS,Ee as RouteNotFound,Oe as Router,xr as SYSTEM_ASSET_DECIMALS,ye as SYSTEM_ASSET_ID,te as StableMath,Ce as StableSwap,Et as StorageConfigNotFound,Rt as SubscriptionNotSupported,dt as TRADEABLE_DEFAULT,lt as TradeRouter,It as TradeType,Pe as XykMath,Ge as XykPool,R as ZERO,v as bnum,bt as buildRoute,Jt as calculateBuyFee,Tl as calculateDiffToAvg,He as calculateDiffToRef,jt as calculateSellFee,At as findNestedKey,Ir as findNestedObj,J as scale};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@galacticcouncil/sdk",
3
- "version": "4.2.0",
3
+ "version": "4.2.1",
4
4
  "description": "Galactic off-chain routing & optimization of orders across pools for best price execution",
5
5
  "author": "GalacticCouncil",
6
6
  "repository": {