goosefx-amm-sdk
Version:
SDK for the GooseFx AMM
2 lines • 3.67 kB
JavaScript
;var D=Object.create;var d=Object.defineProperty;var C=Object.getOwnPropertyDescriptor;var _=Object.getOwnPropertyNames;var h=Object.getPrototypeOf,A=Object.prototype.hasOwnProperty;var I=(n,e)=>{for(var t in e)d(n,t,{get:e[t],enumerable:!0})},F=(n,e,t,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of _(e))!A.call(n,i)&&i!==t&&d(n,i,{get:()=>e[i],enumerable:!(o=C(e,i))||o.enumerable});return n};var O=(n,e,t)=>(t=n!=null?D(h(n)):{},F(e||!n||!n.__esModule?d(t,"default",{value:n,enumerable:!0}):t,n)),L=n=>F(d({},"__esModule",{value:!0}),n);var z={};I(z,{DynamicFee:()=>g,FEE_RATE_DENOMINATOR_VALUE:()=>B,ONE_BASIS_POINT:()=>q});module.exports=L(z);var a=O(require("bn.js")),N=O(require("decimal.js-light"));var P=O(require("bn.js")),W=new P.default(0);function R(n,e){if(e.isZero())throw Error("rhs is zero");let t=n.div(e);return t.isZero()?[t,e]:n.sub(t.mul(e)).isZero()?[t,e]:[t.add(new P.default(1)),e]}function f(n,e){return n.gt(e)?n.sub(e):new P.default(0)}var q=new a.default(100),B=new a.default(1e6),Z=100,V=new a.default(3600),S=new a.default(1e5),M=new a.default(3e5),g=class{static calculateDynamicFee(e,t,o,i,l,c,b){let s=this.calculateDynamicFeeRate(t,o,i,l,c,b),[u,p]=R(e.mul(s),B);return u}static calculatePreDynamicFee(e,t,o,i,l,c,b){let s=this.calculateDynamicFeeRate(t,o,i,l,c,b);if(s.isZero())return e;let u=B.sub(s);if(u.isZero())throw new Error("Fee rate equals denominator, causing division by zero");return e.mul(B).add(u).sub(new a.default(1)).div(u)}static calculateDynamicFeeRate(e,t,o,i,l,c){switch(o){case"volatility":return this.calculateVolatileFee(e,t,i,l,c)}}static calculateVolatileFee(e,t,o,i,l){let{minPrice:c,maxPrice:b,twapPrice:s}=this.getPriceRange(t,e,V);if(c.eqn(0)||b.eqn(0)||s.eqn(0)||s.eqn(1))return o;let u=new N.default(b.toString()).ln(),p=new N.default(c.toString()).ln(),r=new N.default(s.toString()).ln(),m=u.sub(p),v=r.abs();if(v.eq(0))return o;let w=m.div(v),T=i.eqn(0)?M:i,E=new N.default(T.toString()).mul(w),k=new N.default(o.toString()).add(E),y=new a.default(k.lessThan(new N.default(S.toString()))?k.toString():S.toString());if(l){let x=f(y,q);return o.gt(x)?o:x}else return y}static getPriceRange(e,t,o){let i=new a.default(1).ushln(128).subn(1),l=new a.default(0),c=e.observations.map((r,m)=>({observation:r,idx:m})).filter(({observation:r})=>{r.blockTimestamp.eqn(0)&&!r.cumulativeToken0PriceX32.eqn(0)&&!r.cumulativeToken1PriceX32.eqn(0)&&t.sub(r.blockTimestamp)<=o}).map(({observation:r,idx:m})=>({index:m,observation:r}));if(c.length<2)return{minPrice:new a.default(0),maxPrice:new a.default(0),twapPrice:new a.default(0)};c.sort((r,m)=>m.observation.blockTimestamp.cmp(r.observation.blockTimestamp));let b=c[0],s=c[c.length-1],u=f(b.observation.blockTimestamp,s.observation.blockTimestamp);if(u.eqn(0))return{minPrice:new a.default(0),maxPrice:new a.default(0),twapPrice:new a.default(0)};let p=b.observation.cumulativeToken0PriceX32.sub(s.observation.cumulativeToken0PriceX32).div(u);for(let r of c){let m;if(r.index==0?m=e.observations[Z-1]:m=e.observations[r.index-1],m.blockTimestamp.eqn(0))continue;if(m.blockTimestamp>r.observation.blockTimestamp)break;let v=r.observation,w=f(v.blockTimestamp,m.blockTimestamp);if(w.eqn(0))continue;let T=v.cumulativeToken0PriceX32.sub(m.cumulativeToken0PriceX32).div(w);i=a.default.min(i,T),l=a.default.max(l,T)}return{minPrice:i,maxPrice:l,twapPrice:p}}static calculatePreFeeAmount(e,t,o,i,l,c,b){let s=this.calculateDynamicFeeRate(e,o,i,l,c,b);if(s.eqn(0))return t;{let u=t.mul(B),p=B.sub(s);return u.add(p).subn(1).div(p)}}};0&&(module.exports={DynamicFee,FEE_RATE_DENOMINATOR_VALUE,ONE_BASIS_POINT});
//# sourceMappingURL=fee.js.map