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) 2.06 kB
import{MatchType as t}from"../../common/types/index.js";import{decodeFloat as n}from"../../utils/encoders/index.js";import{BigNumberMin as e}from"../../utils/numerics/index.js";import{getEncodedTradeSourceAmount as i,getEncodedTradeTargetAmount as r}from"../trade/index.js";import{sortByMinRate as u,sortByMaxRate as o}from"../utils/index.js";const p=(t,n)=>{let e=t,u=r(e,n);if(u>n.y)for(e=i(n.y,n),u=r(e,n);u>n.y;)e-=1n,u=r(e,n);return{input:e,output:u}},s=(t,n)=>{const r=e(t,n.y);return{input:r,output:i(r,n)}},c=t=>{const[e,i,r,u]=[t.y,t.z,n(t.A),n(t.B)];return[e,i,r,u]},f=t=>{const[n,e,i,r]=c(t);return e>0n?(n*i+e*r)/e:0n},l=(t,n)=>{const[e,i,r,u]=c(t);return r>0n?(e*r+i*(u-n))/r:e},a=(t,n)=>i(l(t,n),t),d=(n,i,r,u,o,p,s)=>{const c=((t,n,e,i)=>Object.keys(n).map((i=>({id:BigInt(i),rate:e(t,n[i])}))).sort(((t,n)=>i(t.rate,n.rate))))(n,i,o,p),l={};return r.includes(t.Fast)&&(l[t.Fast]=((t,n,i,r,u)=>{const o=[];let p=t;for(const t of i){const i=e(t.rate.input,p),s=u(i,n[t.id.toString()]).output;if(r({input:i,output:s})&&(o.push({id:t.id,input:i,output:s}),p-=i,0n===p))break}return o})(n,i,c,u,o)),r.includes(t.Best)&&(l[t.Best]=((t,n,e,i,r,u)=>{const o=e.map((t=>n[t.id.toString()])).concat({y:0n,z:0n,A:0n,B:0n});let p=[],s=0n,c=0n,l=0n;for(let n=1;n<o.length&&(s=f(o[n]),p=o.slice(0,n).map((t=>r(u(t,s),t))),c=p.reduce(((t,n)=>t+n.input),0n),l=c-t,0n!==l);n++)if(l>0n){let e=s,i=f(o[n-1]);for(;e+1n<i;)if(s=(e+i)/2n,p=o.slice(0,n).map((t=>r(u(t,s),t))),c=p.reduce(((t,n)=>t+n.input),0n),l=c-t,l>0n)e=s;else{if(!(l<0n))break;i=s}break}if(l>0n)for(let t=p.length-1;t>=0;t--){const n=r(p[t].input-l,o[t]);if(l+=n.input-p[t].input,p[t]=n,l<=0n)break}else if(l<0n)for(let t=0;t<=p.length-1;t++){const n=r(p[t].input-l,o[t]);if(l+=n.input-p[t].input,l>0n)break;p[t]=n}return[...Array(p.length).keys()].filter((t=>i(p[t]))).map((t=>({id:e[t].id,input:p[t].input,output:p[t].output})))})(n,i,c,u,o,s)),l},m=t=>t.input>0n&&t.output>0n,y=(t,n,e,i=m)=>d(t,n,e,i,p,u,a),g=(t,n,e,i=m)=>d(t,n,e,i,s,o,l);export{y as matchBySourceAmount,g as matchByTargetAmount};