@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.82 kB
JavaScript
;var t,e=require("./encoders-Ff4HNvrj.cjs"),u=require("./numerics-WtCLBFmj.cjs"),r=require("@ethersproject/bignumber");exports.MatchType=void 0,(t=exports.MatchType||(exports.MatchType={})).Fast="Fast",t.Best="Best";const o=r.BigNumber.from(u.ONE),i=r.BigNumber.from(2).pow(128).sub(1),n=r.BigNumber.from(2).pow(256).sub(1);function p(t,e){if(t.gte(0)&&t.lte(e))return t;throw null}const s=t=>p(t,i),a=(t,e)=>p(t.add(e),n),d=(t,e)=>p(t.mul(e),n),c=(t,e,u)=>p(t.mul(e).div(u),n),m=(t,e,u)=>p(t.mul(e).add(u).sub(1).div(u),n),g=(t,e,r,i,s)=>{if(i.eq(0))return m(t,d(o,o),d(s,s));const g=d(r,o),l=a(d(e,i),d(r,s)),b=(f=l,B=d(t,i),p(f.sub(B),n));var f,B;const y=m(g,g,n),h=m(l,b,n),N=u.BigNumberMax(y,h),x=m(g,g,N),T=c(l,b,N);return m(t,x,T)},l=(t,i)=>{const p=t,g=i.y,l=i.z,b=e.decodeFloat(i.A),f=e.decodeFloat(i.B);try{return s(((t,e,r,i,p)=>{if(i.eq(0))return c(t,d(p,p),d(o,o));const s=d(r,o),g=a(d(e,i),d(r,p)),l=d(g,t),b=m(s,s,n),f=m(l,i,n),B=u.BigNumberMax(b,f),y=m(s,s,B),h=m(l,i,B);return y.add(h).lte(n)?c(g,l.div(B),y.add(h)):g.div(a(i,m(s,s,l)))})(p,g,l,b,f))}catch{return r.BigNumber.from(0)}},b=(t,u)=>{const r=t,o=u.y,n=u.z,p=e.decodeFloat(u.A),a=e.decodeFloat(u.B);try{return s(g(r,o,n,p,a))}catch{return i}},f=(t,e)=>{const u=t.output.mul(e.input),r=e.output.mul(t.input),o=u.lt(r),i=u.gt(r),n=!o&&!i;return+(o||n&&t.output.lt(e.output))-+(i||n&&t.output.gt(e.output))},B=(t,e)=>f(e,t),y=(t,e)=>{let u=t,r=l(u,e);if(r.gt(e.y))for(u=b(e.y,e),r=l(u,e);r.gt(e.y);)u=u.sub(1),r=l(u,e);return{input:u,output:r}},h=(t,e)=>{const r=u.BigNumberMin(t,e.y);return{input:r,output:b(r,e)}},N=t=>{const[u,r,o,i]=[t.y,t.z,t.A,t.B];return[u,r,e.decodeFloat(o),e.decodeFloat(i)]},x=t=>{const[e,u,o,i]=N(t);return u.gt(0)?e.mul(o).add(u.mul(i)).div(u):r.BigNumber.from(0)},T=(t,e)=>{const[u,r,o,i]=N(t);return o.gt(0)?u.mul(o).add(r.mul(i.sub(e))).div(o):u},v=(t,e)=>b(T(t,e),t),F=(t,e,u,o,i,n,p)=>{const s=((t,e,u,o)=>Object.keys(e).map((o=>({id:r.BigNumber.from(o),rate:u(t,e[o])}))).sort(((t,e)=>o(t.rate,e.rate))))(t,e,i,n),a={};return u.includes(exports.MatchType.Fast)&&(a[exports.MatchType.Fast]=((t,e,u,r,o)=>{const i=[];for(const n of u){if(!t.gt(n.rate.input)){if(t.eq(n.rate.input)){r(n.rate)&&i.push({id:n.id,input:n.rate.input,output:n.rate.output});break}{const u={input:t,output:o(t,e[n.id.toString()]).output};r(u)&&i.push({id:n.id,input:u.input,output:u.output});break}}r(n.rate)&&(i.push({id:n.id,input:n.rate.input,output:n.rate.output}),t=t.sub(n.rate.input))}return i})(t,e,s,o,i)),u.includes(exports.MatchType.Best)&&(a[exports.MatchType.Best]=((t,e,u,o,i,n)=>{const p={y:r.BigNumber.from(0),z:r.BigNumber.from(0),A:r.BigNumber.from(0),B:r.BigNumber.from(0)},s=u.map((t=>e[t.id.toString()])).concat(p);let a=[],d=r.BigNumber.from(0),c=r.BigNumber.from(0),m=r.BigNumber.from(0);for(let e=1;e<s.length&&(d=x(s[e]),a=s.slice(0,e).map((t=>i(n(t,d),t))),c=a.reduce(((t,e)=>t.add(e.input)),r.BigNumber.from(0)),m=c.sub(t),!m.eq(0));e++)if(m.gt(0)){let u=d,o=x(s[e-1]);for(;u.add(1).lt(o);)if(d=u.add(o).div(2),a=s.slice(0,e).map((t=>i(n(t,d),t))),c=a.reduce(((t,e)=>t.add(e.input)),r.BigNumber.from(0)),m=c.sub(t),m.gt(0))u=d;else{if(!m.lt(0))break;o=d}break}if(m.gt(0))for(let t=a.length-1;t>=0;t--){const e=i(a[t].input.sub(m),s[t]);if(m=m.add(e.input.sub(a[t].input)),a[t]=e,m.lte(0))break}else if(m.lt(0))for(let t=0;t<=a.length-1;t++){const e=i(a[t].input.sub(m),s[t]);if(m=m.add(e.input.sub(a[t].input)),m.gt(0))break;a[t]=e}return[...Array(a.length).keys()].filter((t=>o(a[t]))).map((t=>({id:u[t].id,input:a[t].input,output:a[t].output})))})(t,e,s,o,i,p)),a},M=t=>t.input.gt(0)&&t.output.gt(0);exports.getEncodedTradeSourceAmount=b,exports.getEncodedTradeTargetAmount=l,exports.matchBySourceAmount=(t,e,u,r=M)=>F(t,e,u,r,y,f,v),exports.matchByTargetAmount=(t,e,u,r=M)=>F(t,e,u,r,h,B,T);