UNPKG

@bancor/carbon-sdk

Version:

The SDK is a READ-ONLY tool, intended to facilitate working with Carbon contracts. It's a convenient wrapper around our matching algorithm, allowing programs and users get a ready to use transaction data that will allow them to manage strategies and fulfi

2 lines (1 loc) 3.05 kB
"use strict";var t,n=require("./encoders-DBOv0ukp.cjs");exports.MatchType=void 0,(t=exports.MatchType||(exports.MatchType={})).Fast="Fast",t.Best="Best";const e=n.ONE,r=2n**128n-1n,u=2n**256n-1n;function o(t,n){if(t>=0n&&t<=n)return t;throw null}const c=t=>o(t,r),p=(t,n)=>o(t+n,u),i=(t,n)=>o(t*n,u),s=(t,n,e)=>o(t*n/e,u),a=(t,n,e)=>o((t*n+e-1n)/e,u),d=(t,r,c,d,l)=>{if(0n===d)return a(t,i(e,e),i(l,l));const y=i(c,e),f=p(i(r,d),i(c,l)),h=(g=f,m=i(t,d),o(g-m,u));var g,m;const B=a(y,y,u),x=a(f,h,u),M=n.BigNumberMax(B,x),T=a(y,y,M),b=s(f,h,M);return a(t,T,b)},l=(t,r)=>{const o=t,d=r.y,l=r.z,y=n.decodeFloat(r.A),f=n.decodeFloat(r.B);try{return c(((t,r,o,c,d)=>{if(0n===c)return s(t,i(d,d),i(e,e));const l=i(o,e),y=p(i(r,c),i(o,d)),f=i(y,t),h=a(l,l,u),g=a(f,c,u),m=n.BigNumberMax(h,g),B=a(l,l,m),x=a(f,c,m);return B+x<=u?s(y,f/m,B+x):y/p(c,a(l,l,f))})(o,d,l,y,f))}catch{return 0n}},y=(t,e)=>{const u=t,o=e.y,p=e.z,i=n.decodeFloat(e.A),s=n.decodeFloat(e.B);try{return c(d(u,o,p,i,s))}catch{return r}},f=(t,n)=>{const e=t.output*n.input,r=n.output*t.input,u=e<r,o=e>r,c=!u&&!o;return+(u||c&&t.output<n.output)-+(o||c&&t.output>n.output)},h=(t,n)=>f(n,t),g=(t,n)=>{let e=t,r=l(e,n);if(r>n.y)for(e=y(n.y,n),r=l(e,n);r>n.y;)e-=1n,r=l(e,n);return{input:e,output:r}},m=(t,e)=>{const r=n.BigNumberMin(t,e.y);return{input:r,output:y(r,e)}},B=t=>{const[e,r,u,o]=[t.y,t.z,n.decodeFloat(t.A),n.decodeFloat(t.B)];return[e,r,u,o]},x=t=>{const[n,e,r,u]=B(t);return e>0n?(n*r+e*u)/e:0n},M=(t,n)=>{const[e,r,u,o]=B(t);return u>0n?(e*u+r*(o-n))/u:e},T=(t,n)=>y(M(t,n),t),b=(t,e,r,u,o,c,p)=>{const i=((t,n,e,r)=>Object.keys(n).map((r=>({id:BigInt(r),rate:e(t,n[r])}))).sort(((t,n)=>r(t.rate,n.rate))))(t,e,o,c),s={};return r.includes(exports.MatchType.Fast)&&(s[exports.MatchType.Fast]=((t,e,r,u,o)=>{const c=[];let p=t;for(const t of r){const r=n.BigNumberMin(t.rate.input,p),i=o(r,e[t.id.toString()]).output;if(u({input:r,output:i})&&(c.push({id:t.id,input:r,output:i}),p-=r,0n===p))break}return c})(t,e,i,u,o)),r.includes(exports.MatchType.Best)&&(s[exports.MatchType.Best]=((t,n,e,r,u,o)=>{const c=e.map((t=>n[t.id.toString()])).concat({y:0n,z:0n,A:0n,B:0n});let p=[],i=0n,s=0n,a=0n;for(let n=1;n<c.length&&(i=x(c[n]),p=c.slice(0,n).map((t=>u(o(t,i),t))),s=p.reduce(((t,n)=>t+n.input),0n),a=s-t,0n!==a);n++)if(a>0n){let e=i,r=x(c[n-1]);for(;e+1n<r;)if(i=(e+r)/2n,p=c.slice(0,n).map((t=>u(o(t,i),t))),s=p.reduce(((t,n)=>t+n.input),0n),a=s-t,a>0n)e=i;else{if(!(a<0n))break;r=i}break}if(a>0n)for(let t=p.length-1;t>=0;t--){const n=u(p[t].input-a,c[t]);if(a+=n.input-p[t].input,p[t]=n,a<=0n)break}else if(a<0n)for(let t=0;t<=p.length-1;t++){const n=u(p[t].input-a,c[t]);if(a+=n.input-p[t].input,a>0n)break;p[t]=n}return[...Array(p.length).keys()].filter((t=>r(p[t]))).map((t=>({id:e[t].id,input:p[t].input,output:p[t].output})))})(t,e,i,u,o,p)),s},F=t=>t.input>0n&&t.output>0n;exports.getEncodedTradeSourceAmount=y,exports.getEncodedTradeTargetAmount=l,exports.matchBySourceAmount=(t,n,e,r=F)=>b(t,n,e,r,g,f,T),exports.matchByTargetAmount=(t,n,e,r=F)=>b(t,n,e,r,m,h,M);