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