UNPKG

goosefx-amm-sdk

Version:

SDK for the GooseFx AMM

2 lines 5.71 kB
"use strict";var W=Object.create;var O=Object.defineProperty;var z=Object.getOwnPropertyDescriptor;var L=Object.getOwnPropertyNames;var X=Object.getPrototypeOf,V=Object.prototype.hasOwnProperty;var M=(i,e)=>{for(var t in e)O(i,t,{get:e[t],enumerable:!0})},q=(i,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of L(e))!V.call(i,o)&&o!==t&&O(i,o,{get:()=>e[o],enumerable:!(n=z(e,o))||n.enumerable});return i};var B=(i,e,t)=>(t=i!=null?W(X(i)):{},q(e||!i||!i.__esModule?O(t,"default",{value:i,enumerable:!0}):t,i)),U=i=>q(O({},"__esModule",{value:!0}),i);var J={};M(J,{CurveCalculator:()=>E,RoundDirection:()=>A});module.exports=U(J);var y=B(require("bn.js"));var l=B(require("bn.js")),d=B(require("decimal.js-light"));var P=B(require("bn.js")),b=new P.default(0);function k(i,e){if(e.isZero())throw Error("divisor is zero");return i.mod(e)}function v(i,e){if(e.isZero())throw Error("rhs is zero");let t=i.div(e);return t.isZero()?[t,e]:i.sub(t.mul(e)).isZero()?[t,e]:[t.add(new P.default(1)),e]}function R(i,e){return i.gt(e)?i.sub(e):new P.default(0)}var Y=new l.default(100),f=new l.default(1e6),j=100,G=new l.default(3600),Z=new l.default(1e5),H=new l.default(3e5),S=class{static calculateDynamicFee(e,t,n,o,a,r,c){let s=this.calculateDynamicFeeRate(t,n,o,a,r,c),[m,w]=v(e.mul(s),f);return m}static calculatePreDynamicFee(e,t,n,o,a,r,c){let s=this.calculateDynamicFeeRate(t,n,o,a,r,c);if(s.isZero())return e;let m=f.sub(s);if(m.isZero())throw new Error("Fee rate equals denominator, causing division by zero");return e.mul(f).add(m).sub(new l.default(1)).div(m)}static calculateDynamicFeeRate(e,t,n,o,a,r){switch(n){case"volatility":return this.calculateVolatileFee(e,t,o,a,r)}}static calculateVolatileFee(e,t,n,o,a){let{minPrice:r,maxPrice:c,twapPrice:s}=this.getPriceRange(t,e,G);if(r.eqn(0)||c.eqn(0)||s.eqn(0)||s.eqn(1))return n;let m=new d.default(c.toString()).ln(),w=new d.default(r.toString()).ln(),u=new d.default(s.toString()).ln(),p=m.sub(w),N=u.abs();if(N.eq(0))return n;let T=p.div(N),F=o.eqn(0)?H:o,I=new d.default(F.toString()).mul(T),C=new d.default(n.toString()).add(I),D=new l.default(C.lessThan(new d.default(Z.toString()))?C.toString():Z.toString());if(a){let _=R(D,Y);return n.gt(_)?n:_}else return D}static getPriceRange(e,t,n){let o=new l.default(1).ushln(128).subn(1),a=new l.default(0),r=e.observations.map((u,p)=>({observation:u,idx:p})).filter(({observation:u})=>{u.blockTimestamp.eqn(0)&&!u.cumulativeToken0PriceX32.eqn(0)&&!u.cumulativeToken1PriceX32.eqn(0)&&t.sub(u.blockTimestamp)<=n}).map(({observation:u,idx:p})=>({index:p,observation:u}));if(r.length<2)return{minPrice:new l.default(0),maxPrice:new l.default(0),twapPrice:new l.default(0)};r.sort((u,p)=>p.observation.blockTimestamp.cmp(u.observation.blockTimestamp));let c=r[0],s=r[r.length-1],m=R(c.observation.blockTimestamp,s.observation.blockTimestamp);if(m.eqn(0))return{minPrice:new l.default(0),maxPrice:new l.default(0),twapPrice:new l.default(0)};let w=c.observation.cumulativeToken0PriceX32.sub(s.observation.cumulativeToken0PriceX32).div(m);for(let u of r){let p;if(u.index==0?p=e.observations[j-1]:p=e.observations[u.index-1],p.blockTimestamp.eqn(0))continue;if(p.blockTimestamp>u.observation.blockTimestamp)break;let N=u.observation,T=R(N.blockTimestamp,p.blockTimestamp);if(T.eqn(0))continue;let F=N.cumulativeToken0PriceX32.sub(p.cumulativeToken0PriceX32).div(T);o=l.default.min(o,F),a=l.default.max(a,F)}return{minPrice:o,maxPrice:a,twapPrice:w}}static calculatePreFeeAmount(e,t,n,o,a,r,c){let s=this.calculateDynamicFeeRate(e,n,o,a,r,c);if(s.eqn(0))return t;{let m=t.mul(f),w=f.sub(s);return m.add(w).subn(1).div(w)}}};var x=B(require("bn.js"));var g=class{static swapWithoutFees(e,t,n){let o=t.mul(n),a=t.add(e),[r,c]=v(o,a),s=c.sub(t),m=n.sub(r);if(m.isZero())throw Error("destinationAmountSwapped is zero");return{sourceAmountSwapped:s,destinationAmountSwapped:m}}static swapWithoutFeesBaseOut(e,t,n){if(e.isZero())throw new Error("destinationAmount is zero");if(e.gt(n))throw new Error("destinationAmount exceeds available destination reserve");let o=t.mul(e),a=n.sub(e);if(a.isZero())throw new Error("denominator is zero");let[r]=v(o,a);return{sourceAmountSwapped:r,destinationAmountSwapped:e}}static lpTokensToTradingTokens(e,t,n,o,a){let r=e.mul(n).div(t),c=e.mul(o).div(t);if(a===0)return{tokenAmount0:r,tokenAmount1:c};if(a===1)return k(e.mul(n),t).gt(b)&&r.gt(b)&&(r=r.add(new x.default(1))),k(e.mul(o),t).gt(b)&&c.gt(b)&&(c=c.add(new x.default(1))),{tokenAmount0:r,tokenAmount1:c};throw Error("roundDirection value error")}};var A=(t=>(t[t.Floor=0]="Floor",t[t.Ceiling=1]="Ceiling",t))(A||{}),E=class{static validate_supply(e,t){if(e.isZero())throw Error("tokenAmount0 is zero");if(t.isZero())throw Error("tokenAmount1 is zero")}static swapBaseIn(e,t,n,o,a,r,c=!1){let s=S.calculateDynamicFee(e,new y.default(new Date().getTime()/1e3),a,"volatility",o,r,c),m=e.sub(s),{sourceAmountSwapped:w,destinationAmountSwapped:u}=g.swapWithoutFees(m,t,n),p=w.add(s);return{newSwapSourceAmount:t.add(p),newSwapDestinationAmount:n.sub(u),sourceAmountSwapped:p,destinationAmountSwapped:u,tradeFee:s}}static swapBaseOut(e,t,n,o,a,r,c=!1){if(e.isZero())throw new Error("destinationAmount is zero");if(e.gt(n))throw new Error("destinationAmount exceeds available destination reserve");let{sourceAmountSwapped:s,destinationAmountSwapped:m}=g.swapWithoutFeesBaseOut(e,t,n),w=S.calculatePreDynamicFee(s,new y.default(new Date().getTime()/1e3),a,"volatility",o,r,c);return{newSwapSourceAmount:t.add(w),newSwapDestinationAmount:n.sub(m),sourceAmountSwapped:w,destinationAmountSwapped:m,tradeFee:w.sub(s)}}};0&&(module.exports={CurveCalculator,RoundDirection}); //# sourceMappingURL=calculator.js.map