danogo-clmm 0.1.4 → 0.1.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/sdk.d.mts +3 -5
- package/dist/sdk.d.ts +3 -5
- package/dist/sdk.js +1 -1
- package/dist/sdk.mjs +1 -1
- package/package.json +2 -1
package/dist/sdk.d.mts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { SigningClient } from '@evolution-sdk/evolution';
|
|
2
2
|
import { Transaction } from '@cardano-ogmios/schema';
|
|
3
3
|
|
|
4
4
|
interface PoolDatum {
|
|
@@ -68,8 +68,6 @@ interface QuoteSwapRequest {
|
|
|
68
68
|
protocolConfigOutRef?: string;
|
|
69
69
|
}
|
|
70
70
|
|
|
71
|
-
declare const toEvoOutRef: (outRefString: string) => TransactionInput.TransactionInput | undefined;
|
|
72
|
-
|
|
73
71
|
declare class DanogoClmm {
|
|
74
72
|
constructor();
|
|
75
73
|
/**
|
|
@@ -161,7 +159,7 @@ declare class DanogoClmm {
|
|
|
161
159
|
/**
|
|
162
160
|
* Helper function to handle staking rewards for ADA pools
|
|
163
161
|
*/
|
|
164
|
-
private
|
|
162
|
+
private getRewardAmount;
|
|
165
163
|
}
|
|
166
164
|
|
|
167
|
-
export { type ConcentratedPool, type PoolDatum, type QuoteSwapRequest, type SwapRequest, DanogoClmm as default
|
|
165
|
+
export { type ConcentratedPool, type PoolDatum, type QuoteSwapRequest, type SwapRequest, DanogoClmm as default };
|
package/dist/sdk.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { SigningClient } from '@evolution-sdk/evolution';
|
|
2
2
|
import { Transaction } from '@cardano-ogmios/schema';
|
|
3
3
|
|
|
4
4
|
interface PoolDatum {
|
|
@@ -68,8 +68,6 @@ interface QuoteSwapRequest {
|
|
|
68
68
|
protocolConfigOutRef?: string;
|
|
69
69
|
}
|
|
70
70
|
|
|
71
|
-
declare const toEvoOutRef: (outRefString: string) => TransactionInput.TransactionInput | undefined;
|
|
72
|
-
|
|
73
71
|
declare class DanogoClmm {
|
|
74
72
|
constructor();
|
|
75
73
|
/**
|
|
@@ -161,7 +159,7 @@ declare class DanogoClmm {
|
|
|
161
159
|
/**
|
|
162
160
|
* Helper function to handle staking rewards for ADA pools
|
|
163
161
|
*/
|
|
164
|
-
private
|
|
162
|
+
private getRewardAmount;
|
|
165
163
|
}
|
|
166
164
|
|
|
167
|
-
export { type ConcentratedPool, type PoolDatum, type QuoteSwapRequest, type SwapRequest, DanogoClmm as default
|
|
165
|
+
export { type ConcentratedPool, type PoolDatum, type QuoteSwapRequest, type SwapRequest, DanogoClmm as default };
|
package/dist/sdk.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
var G=Object.defineProperty;var ct=Object.getOwnPropertyDescriptor;var ut=Object.getOwnPropertyNames;var lt=Object.prototype.hasOwnProperty;var pt=(n,t)=>{for(var e in t)G(n,e,{get:t[e],enumerable:!0})},ft=(n,t,e,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of ut(t))!lt.call(n,o)&&o!==e&&G(n,o,{get:()=>t[o],enumerable:!(r=ct(t,o))||r.enumerable});return n};var mt=n=>ft(G({},"__esModule",{value:!0}),n);var Ot={};pt(Ot,{default:()=>Bt,toEvoOutRef:()=>U});module.exports=mt(Ot);var z=require("@evolution-sdk/evolution"),M=require("@evolution-sdk/evolution/ScriptHash"),b=require("@evolution-sdk/evolution/Assets");function F(n,t){let r=(n>=0n?n:n+(1n<<256n)).toString(16);r.length%2&&(r="0"+r);let o=r.length/2;if(o>t)throw new Error(`Number ${n} requires ${o} bytes, but target length is ${t}.`);let i=new Uint8Array(t),s=t-o;for(let a=0;a<o;a++)i[a+s]=parseInt(r.slice(a*2,a*2+2),16);return i}var L=(n,t,e,r)=>{try{let o=(i,s)=>{let a=3n,m=F(n?i:r,1),l=F(a,1),p=t.map((A,y)=>{let R=s.find(h=>h.utxo.transactionId===A.transactionId&&h.utxo.index===A.index);if(!R)throw new Error(`Pool UTxO at ${y} not found in indexedInputs`);if(e[y]===void 0)throw new Error(`deltaAmount for poolOutIdx ${y} is undefined`);let w=F(BigInt(R.index),1),O=F(BigInt(y),1),g=F(e[y],32);return{poolInBytes:w,poolOutBytes:O,amountBytes:g}}),I=2+34*p.length,u=new Uint8Array(I),d=0;u.set(m,d),d+=m.length,u.set(l,d),d+=l.length;for(let A of p)u.set(A.poolInBytes,d),d+=A.poolInBytes.length,u.set(A.poolOutBytes,d),d+=A.poolOutBytes.length,u.set(A.amountBytes,d),d+=A.amountBytes.length;return u};return{all:i=>{if(!i.length)throw new Error("swapTokensRedeemer batch all called with empty indexedInputs");let s=null;if(n&&(s=i.find(a=>a.utxo.transactionId===n.transactionId&&a.utxo.index===n.index),!s))throw new Error("Target pool UTxO is not found in poolInUTxOs");return o(s?.index,i)},inputs:t}}catch(o){throw console.error("Error creating pool redeemer:",o),o}};var B=require("@evolution-sdk/evolution"),J=require("@evolution-sdk/evolution/InlineDatum");var x="lovelace";var dt="64d111b957e7d7848ffdde5149aa77fa4090a7fa1ad0ac108067900614848501#0",gt="d8b69fc53637bcfadbc4469083f706bc293f4d9d2296646c5ca167bb",wt="2cafd7c92f7093e5229af274be83dea660b0590b4174bbed79ba662b44fbd1ee#0";var At="2e19cca74e3badcab26aef7574aa1885ba97228a254ca227ba2f79f2b75fd136#0",It="04041c3c6ba87b33f2c9eb7f7dbeae3b26003c3e199d438bb99932a2",xt="3775af36f485f9c97101ee5b9b360c34f0f8e12186bc9060f358b7fc8ce468a4#0",H=n=>n===1?{poolScriptOutRef:dt,poolScriptHash:gt,protocolScriptOutRef:wt}:{poolScriptOutRef:At,poolScriptHash:It,protocolScriptOutRef:xt};var K=n=>{let t=[new Uint8Array(Buffer.from(n.tokenX.slice(0,56),"hex")),new Uint8Array(Buffer.from(n.tokenX.slice(57),"hex"))],e=[new Uint8Array(Buffer.from(n.tokenY.slice(0,56),"hex")),new Uint8Array(Buffer.from(n.tokenY.slice(57),"hex"))],r=B.Data.constr(0n,[n.sqrtLowerPriceNum,n.sqrtLowerPriceDen]),o=B.Data.constr(0n,[n.sqrtUpperPriceNum,n.sqrtUpperPriceDen]),i=B.Data.constr(0n,[t,e,BigInt(n.lpFeeRate),n.platformFeeX,n.platformFeeY,n.totalSwapFee,r,o,n.minXChange,n.minYChange,n.circulatingLPToken,BigInt(n.lastWithdrawEpoch)]);return new J.InlineDatum({data:i})};var X=n=>{let t;if(typeof n=="string")t=B.CBOR.fromCBORHex(n);else{let i=n.data,s=B.Data.toCBORHex(i);t=B.CBOR.fromCBORHex(s)}let e=t._tag==="Tag"?t.value:t;if(!Array.isArray(e))throw new Error("Invalid datum structure: expected array of fields");let r=i=>{let s=i._tag==="Tag"?i.value:i;if(Array.isArray(s)&&s.length===2){let a=s[0]instanceof Uint8Array?s[0]:new Uint8Array(s[0]),m=s[1]instanceof Uint8Array?s[1]:new Uint8Array(s[1]),l=Buffer.from(a).toString("hex"),p=Buffer.from(m).toString("hex");return l===""&&p===""?x:l+"."+p}throw new Error("Invalid AssetClass structure")},o=i=>{let s=i._tag==="Tag"?i.value:i;if(Array.isArray(s)&&s.length===2)return{num:BigInt(s[0]),den:BigInt(s[1])};throw new Error("Invalid Ratio structure")};return{tokenX:r(e[0]),tokenY:r(e[1]),lpFeeRate:Number(e[2]),platformFeeX:BigInt(e[3]),platformFeeY:BigInt(e[4]),totalSwapFee:BigInt(e[5]),sqrtLowerPriceNum:o(e[6]).num,sqrtLowerPriceDen:o(e[6]).den,sqrtUpperPriceNum:o(e[7]).num,sqrtUpperPriceDen:o(e[7]).den,minXChange:BigInt(e[8]),minYChange:BigInt(e[9]),circulatingLPToken:BigInt(e[10]),lastWithdrawEpoch:Number(e[11])}},j=n=>{let t,e=B.Data.toCBORHex(n.data);t=B.CBOR.fromCBORHex(e);let r=t._tag==="Tag"?t.value:t;if(!Array.isArray(r))throw new Error("Invalid datum structure: expected array of fields");return{platformFeeRate:BigInt(r[0]),swapFee:BigInt(r[1])}};var E=require("@evolution-sdk/evolution");function S(n){if(n===x)return{unit:x};let t=n.indexOf("."),e=t===-1?n:n.slice(0,t),r=t===-1?"":n.slice(t+1),o=E.Bytes.fromHex(e),i=new E.PolicyId.PolicyId({hash:o}),s=r?E.Bytes.fromHex(r):new Uint8Array(0),a=new E.AssetName.AssetName({bytes:s});return{policyId:i,assetName:a,unit:n}}var tt=n=>{if(!n||Object.keys(n).length===0)return[];let t=[];for(let[e,r]of Object.entries(n)){if(e==="ada")continue;let o=[];for(let[i,s]of Object.entries(r))o.push({name:i,value:s});t.push({policyId:e,assets:o})}return t};var Y=require("@evolution-sdk/evolution");var ot=(n,t)=>{let e=432e6,r=1647899091e3,o=328;return t!==1&&(e=18e5),Math.floor((n-r)/e)+o};function ht(n,t,e,r,o=0n,i){let s=r<0n?-r:r,a=e.tokenX===x?3000000n+BigInt(e.totalSwapFee):0n,m=BigInt(n)-BigInt(e.platformFeeX)+o-a,l=BigInt(t)-BigInt(e.platformFeeY),p=Pt(m,l,[BigInt(e.sqrtLowerPriceNum),BigInt(e.sqrtLowerPriceDen)],[BigInt(e.sqrtUpperPriceNum),BigInt(e.sqrtUpperPriceDen)]),I=nt(p[0]*BigInt(e.sqrtUpperPriceDen),p[1]*BigInt(e.sqrtUpperPriceNum))+m,u=nt(p[0]*BigInt(e.sqrtLowerPriceNum),p[1]*BigInt(e.sqrtLowerPriceDen))+l;return r>0n?et(s,I,u,l,BigInt(e.lpFeeRate),i):et(s,u,I,m,BigInt(e.lpFeeRate),i)}var et=(n,t,e,r,o,i)=>{let s=10000n,m=n*o/s*BigInt(i)/10000n,l=s-o,p=t*s+n*l,I=t*e,d=(e*p-I*s)/p;if(d>r)throw new Error("pool out exceeded");return[d,m]},Pt=(n,t,e,r)=>{let o=e[1]*r[1],i=e[0]*r[0],s=(t*o-n*i)*(t*o-n*i),a=4n*n*t*e[1]*e[1]*r[0]*r[0],m=Rt(s+a),l=t*o+n*i+m,p=2n*(r[0]*e[1]-r[1]*e[0]);return[l,p]};function Rt(n){if(n<0n)throw new Error("Square root of negative number");if(n<2n)return n;let t=n,e=t+n/t>>1n;for(;e<t;)t=e,e=t+n/t>>1n;return t}function nt(n,t){if(t===0n)throw new Error("Division by zero");let e=n/t;return n%t===0n||n<0n!=t<0n?e:e+1n}function rt(n,t){let r=[...t].sort((o,i)=>o.transactionId===i.transactionId?o.index<i.index?-1:1:o.transactionId<i.transactionId?-1:1).findIndex(o=>o.transactionId===n.transactionId&&o.index===n.index);if(r===-1)throw new Error("Protocol config out ref not found in reference inputs");return BigInt(r)}function V(n,t,e){let r=[];for(let o=0;o<n.length;o++){let i=n[o],s=t[o];if(s===0n)continue;let[a,m]=ht(i.tokenAAmount,i.tokenBAmount,i.datum,s,i.rewardAmount||0n,e);r.push({poolIndex:o,deltaAmount:s,outputAmount:a,platformFee:m})}return r}var U=n=>{if(!n)return;let[t,e]=n.split("#");return new Y.TransactionInput.TransactionInput({transactionId:Y.TransactionHash.fromHex(t),index:BigInt(e)})};var it=require("@evolution-sdk/evolution/Bytes32"),Q=class{constructor(){}async calculateSwapOut(t,e){if(!t||!t.address)throw new Error("Please connect a wallet first.");let r=(await t.address()).networkId,o=await Promise.all(e.pools.map(u=>t.getUtxosByOutRef([U(u.poolOutRef)]))),i=H(r),s=e.protocolConfigOutRef??i.protocolScriptOutRef,a=(await t.getUtxosByOutRef([U(s)]))[0];if(!a.datumOption)throw new Error("Protocol config UTxO does not contain a datum.");let m=j(a.datumOption),l=await Promise.all(e.pools.map(async(u,d)=>{let A=o[d][0];if(!A.datumOption)throw new Error(`Pool input UTxO ${d} does not contain a datum.`);let y=X(A.datumOption),R=S(y.tokenX),w=S(y.tokenY),O=A.assets.lovelace,g=D=>D.unit===x?O:(0,b.quantityOf)(A.assets,D.policyId,D.assetName),h=null;u.stakingOutRef&&(h=(await t.getUtxosByOutRef([U(u.stakingOutRef)]))[0]);let{rewardAmount:N}=await this.getStakingRewards(t,r,h,R);return{tokenAAmount:g(R),tokenBAmount:g(w),datum:y,rewardAmount:N}})),p=e.pools.map(u=>u.deltaAmount);return V(l,p,m.platformFeeRate).map(u=>u.outputAmount)}async submitSwap(t,e){if(!t||!t.address)throw new Error("Please connect a wallet first.");let r=(await t.address()).networkId,o=await Promise.all(e.pools.map(async c=>(await t.getUtxosByOutRef([U(c.poolOutRef)]))[0])),i=H(r),s=i.poolScriptOutRef,a=e.protocolConfigOutRef??i.protocolScriptOutRef,m=(await t.getUtxosByOutRef([U(s)]))[0],l=(await t.getUtxosByOutRef([U(a)]))[0];if(!l.datumOption)throw new Error("Protocol config UTxO does not contain a datum.");let p=j(l.datumOption),I=[],u=[];for(let c=0;c<e.pools.length;c++){let f=e.pools[c],P=o[c];if(!P.datumOption)throw new Error(`Pool input UTxO ${c} does not contain a datum.`);let T=X(P.datumOption),C=S(T.tokenX),v=S(T.tokenY),$=P.assets.lovelace,q=W=>W.unit===x?$:(0,b.quantityOf)(P.assets,W.policyId,W.assetName),k=null;f.stakingOutRef&&(k=(await t.getUtxosByOutRef([U(f.stakingOutRef)]))[0]),u.push(k);let{rewardAmount:at}=await this.getStakingRewards(t,r,k,C);I.push({tokenAAmount:q(C),tokenBAmount:q(v),datum:T,rewardAmount:at,utxo:P,tokenA:C,tokenB:v})}let d=e.pools.map(c=>c.deltaAmount),A=V(I,d,p.platformFeeRate);A.forEach((c,f)=>{let P=e.pools[f].minOutChangeAmount;if(c.outputAmount<P)throw new Error(`Expected swap output at least ${P} but got ${c.outputAmount}`)});let y=A.reduce((c,f)=>c+f.deltaAmount,0n),R=e.pools.find(c=>c.deltaAmount!==0n);if(!R)throw new Error("At least one pool must have a non-zero delta amount");let w=R.deltaAmount>0?I[0].tokenA:I[0].tokenB,O=await this.getUserTokenBalance(t,w);if(O<y)throw new Error(`Insufficient ${w.unit} balance. Required: ${y}, Available: ${O}`);let g=t.newTx(),h=[l];h.push(m),u.forEach(c=>{c&&h.push(c)}),g=g.readFrom({referenceInputs:h});let N=ot(Date.now(),r),D=rt(l,h);g=g.withdraw({stakeCredential:(0,M.fromScript)(m.scriptRef),amount:0n,redeemer:L(null,o,d,D)});for(let c=0;c<I.length;c++){let f=I[c],P=A.find(k=>k.poolIndex===c);if(!P)continue;let T=P.deltaAmount,C=P.platformFee,v=K({...f.datum,platformFeeX:BigInt(f.datum.platformFeeX)+(T>0?C:0n),platformFeeY:BigInt(f.datum.platformFeeY)+(T<0?C:0n),lastWithdrawEpoch:N,totalSwapFee:BigInt(f.datum.totalSwapFee)+BigInt(p.swapFee)}),$=this.buildDeltaAssets(T>0?f.tokenA:f.tokenB,T>0?f.tokenB:f.tokenA,T,BigInt(P.outputAmount),BigInt(p.swapFee)),q=(0,b.merge)(f.utxo.assets,$);if(g=g.payToAddress({address:f.utxo.address,assets:q,datum:v}),g=g.collectFrom({inputs:[f.utxo],redeemer:L(f.utxo,o,d,D)}),f.tokenA.unit===x&&N>f.datum.lastWithdrawEpoch&&u[c]){let{stakingRewardAddress:k}=await this.getStakingRewards(t,r,u[c],f.tokenA);k&&(g=g.withdraw({stakeCredential:(0,M.fromScript)(u[c].scriptRef),amount:f.rewardAmount||0n,redeemer:L(f.utxo,o,d,D)}))}}g=g.attachMetadata({label:674n,metadata:new Map([["msg",["Danogo Multi-Pool Swap"]]])}),g.setValidity({from:BigInt(Date.now()-12e4),to:BigInt(Date.now()+24e4)});let _=await(await(await g.build({scriptDataFormat:"array"})).sign()).submit();return(0,it.toHex)(_.hash)}getPoolsFromOgmiosTx(t,e,r){let o=H(e),i=r??o.poolScriptHash;if(!i)throw new Error("Pool script hash is required but not provided or not found for this network.");let s=[];return t.outputs.forEach((a,m)=>{let l=a.value,p=l[i];if(p&&a.datum){for(let[I,u]of Object.entries(p))if(u===1n){let d=r+I,A=`${t.id}#${m}`,y=l.ada.lovelace,R=tt(l),w=X(a.datum),O=w.tokenX,g=w.tokenY,h=N=>{if(N===x)return y;let D=N.slice(0,56),Z=N.slice(56),_=R.find(c=>c.policyId===D)?.assets.find(c=>c.name===Z);return _?_.value:0n};s.push({outRef:A,address:a.address,coin:y,multiAssets:R,validityNft:d,tokenA:O,tokenAReserve:h(O),tokenB:g,tokenBReserve:h(g),lpFeeRate:w.lpFeeRate,priceLowerNum:w.sqrtLowerPriceNum,priceLowerDen:w.sqrtLowerPriceDen,priceUpperNum:w.sqrtUpperPriceNum,priceUpperDen:w.sqrtUpperPriceDen,platformFeeA:w.platformFeeX,platformFeeB:w.platformFeeY,minAChange:w.minXChange,minBChange:w.minYChange,lpTokenTotalSupply:w.circulatingLPToken,lastWithdrawEpoch:w.lastWithdrawEpoch,totalSwapFee:w.totalSwapFee})}}}),s}async getUserTokenBalance(t,e){return(await t.getWalletUtxos()).reduce((o,i)=>o+(e.unit===x?i.assets.lovelace:(0,b.quantityOf)(i.assets,e.policyId,e.assetName)||0n),0n)}buildDeltaAssets(t,e,r,o,i){let s=r>0n?r:-r,a;if(t.unit===x?a=(0,b.fromLovelace)(s+i):a=(0,b.fromAsset)(t.policyId,t.assetName,s,i),e.unit===x)a=(0,b.subtractLovelace)(a,o);else{let m=(0,b.fromAsset)(e.policyId,e.assetName,-o);a=(0,b.merge)(a,m)}return a}async getStakingRewards(t,e,r,o){if(o.unit!==x)return{rewardAmount:0n};let i=new z.RewardAccount.RewardAccount({networkId:e,stakeCredential:(0,M.fromScript)(r.scriptRef)}),s=z.RewardAccount.toBech32(i);return{rewardAmount:(await t.getDelegation(s)).rewards,stakingRewardAddress:s}}},Bt=Q;0&&(module.exports={toEvoOutRef});
|
|
1
|
+
var j=Object.defineProperty;var at=Object.getOwnPropertyDescriptor;var ct=Object.getOwnPropertyNames;var ut=Object.prototype.hasOwnProperty;var lt=(o,t)=>{for(var e in t)j(o,e,{get:t[e],enumerable:!0})},pt=(o,t,e,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of ct(t))!ut.call(o,r)&&r!==e&&j(o,r,{get:()=>t[r],enumerable:!(n=at(t,r))||n.enumerable});return o};var ft=o=>pt(j({},"__esModule",{value:!0}),o);var Ot={};lt(Ot,{default:()=>Bt});module.exports=ft(Ot);var Z=require("@evolution-sdk/evolution"),$=require("@evolution-sdk/evolution/ScriptHash"),y=require("@evolution-sdk/evolution/Assets");function S(o,t){let n=(o>=0n?o:o+(1n<<256n)).toString(16);n.length%2&&(n="0"+n);let r=n.length/2;if(r>t)throw new Error(`Number ${o} requires ${r} bytes, but target length is ${t}.`);let i=new Uint8Array(t),s=t-r;for(let a=0;a<r;a++)i[a+s]=parseInt(n.slice(a*2,a*2+2),16);return i}var H=(o,t,e,n)=>{try{let r=(i,s)=>{let a=3n,p=S(o?i:n,1),m=S(a,1),l=t.map((A,I)=>{let h=s.find(f=>f.utxo.transactionId===A.transactionId&&f.utxo.index===A.index);if(!h)throw new Error(`Pool UTxO at ${I} not found in indexedInputs`);if(e[I]===void 0)throw new Error(`deltaAmount for poolOutIdx ${I} is undefined`);let g=S(BigInt(h.index),1),R=S(BigInt(I),1),T=S(e[I],32);return{poolInBytes:g,poolOutBytes:R,amountBytes:T}}),b=2+34*l.length,w=new Uint8Array(b),u=0;w.set(p,u),u+=p.length,w.set(m,u),u+=m.length;for(let A of l)w.set(A.poolInBytes,u),u+=A.poolInBytes.length,w.set(A.poolOutBytes,u),u+=A.poolOutBytes.length,w.set(A.amountBytes,u),u+=A.amountBytes.length;return w};return{all:i=>{if(!i.length)throw new Error("swapTokensRedeemer batch all called with empty indexedInputs");let s=null;if(o&&(s=i.find(a=>a.utxo.transactionId===o.transactionId&&a.utxo.index===o.index),!s))throw new Error("Target pool UTxO is not found in poolInUTxOs");return r(s?.index,i)},inputs:t}}catch(r){throw console.error("Error creating pool redeemer:",r),r}};var O=require("@evolution-sdk/evolution"),K=require("@evolution-sdk/evolution/InlineDatum");var x="lovelace";var mt="64d111b957e7d7848ffdde5149aa77fa4090a7fa1ad0ac108067900614848501#0",gt="d8b69fc53637bcfadbc4469083f706bc293f4d9d2296646c5ca167bb",dt="2cafd7c92f7093e5229af274be83dea660b0590b4174bbed79ba662b44fbd1ee#0";var wt="2e19cca74e3badcab26aef7574aa1885ba97228a254ca227ba2f79f2b75fd136#0",At="04041c3c6ba87b33f2c9eb7f7dbeae3b26003c3e199d438bb99932a2",It="3775af36f485f9c97101ee5b9b360c34f0f8e12186bc9060f358b7fc8ce468a4#0",X=o=>o===1?{poolScriptOutRef:mt,poolScriptHash:gt,protocolScriptOutRef:dt}:{poolScriptOutRef:wt,poolScriptHash:At,protocolScriptOutRef:It};var tt=o=>{let t=[new Uint8Array(Buffer.from(o.tokenX.slice(0,56),"hex")),new Uint8Array(Buffer.from(o.tokenX.slice(57),"hex"))],e=[new Uint8Array(Buffer.from(o.tokenY.slice(0,56),"hex")),new Uint8Array(Buffer.from(o.tokenY.slice(57),"hex"))],n=O.Data.constr(0n,[o.sqrtLowerPriceNum,o.sqrtLowerPriceDen]),r=O.Data.constr(0n,[o.sqrtUpperPriceNum,o.sqrtUpperPriceDen]),i=O.Data.constr(0n,[t,e,BigInt(o.lpFeeRate),o.platformFeeX,o.platformFeeY,o.totalSwapFee,n,r,o.minXChange,o.minYChange,o.circulatingLPToken,BigInt(o.lastWithdrawEpoch)]);return new K.InlineDatum({data:i})};var Y=o=>{let t;if(typeof o=="string")t=O.CBOR.fromCBORHex(o);else{let i=o.data,s=O.Data.toCBORHex(i);t=O.CBOR.fromCBORHex(s)}let e=t._tag==="Tag"?t.value:t;if(!Array.isArray(e))throw new Error("Invalid datum structure: expected array of fields");let n=i=>{let s=i._tag==="Tag"?i.value:i;if(Array.isArray(s)&&s.length===2){let a=s[0]instanceof Uint8Array?s[0]:new Uint8Array(s[0]),p=s[1]instanceof Uint8Array?s[1]:new Uint8Array(s[1]),m=Buffer.from(a).toString("hex"),l=Buffer.from(p).toString("hex");return m===""&&l===""?x:m+"."+l}throw new Error("Invalid AssetClass structure")},r=i=>{let s=i._tag==="Tag"?i.value:i;if(Array.isArray(s)&&s.length===2)return{num:BigInt(s[0]),den:BigInt(s[1])};throw new Error("Invalid Ratio structure")};return{tokenX:n(e[0]),tokenY:n(e[1]),lpFeeRate:Number(e[2]),platformFeeX:BigInt(e[3]),platformFeeY:BigInt(e[4]),totalSwapFee:BigInt(e[5]),sqrtLowerPriceNum:r(e[6]).num,sqrtLowerPriceDen:r(e[6]).den,sqrtUpperPriceNum:r(e[7]).num,sqrtUpperPriceDen:r(e[7]).den,minXChange:BigInt(e[8]),minYChange:BigInt(e[9]),circulatingLPToken:BigInt(e[10]),lastWithdrawEpoch:Number(e[11])}},V=o=>{let t,e=O.Data.toCBORHex(o.data);t=O.CBOR.fromCBORHex(e);let n=t._tag==="Tag"?t.value:t;if(!Array.isArray(n))throw new Error("Invalid datum structure: expected array of fields");return{platformFeeRate:BigInt(n[0]),swapFee:BigInt(n[1])}};var E=require("@evolution-sdk/evolution");function _(o){if(o===x)return{unit:x};let t=o.indexOf("."),e=t===-1?o:o.slice(0,t),n=t===-1?"":o.slice(t+1),r=E.Bytes.fromHex(e),i=new E.PolicyId.PolicyId({hash:r}),s=n?E.Bytes.fromHex(n):new Uint8Array(0),a=new E.AssetName.AssetName({bytes:s});return{policyId:i,assetName:a,unit:o}}var et=o=>{if(!o||Object.keys(o).length===0)return[];let t=[];for(let[e,n]of Object.entries(o)){if(e==="ada")continue;let r=[];for(let[i,s]of Object.entries(n))r.push({name:i,value:s});t.push({policyId:e,assets:r})}return t};var M=require("@evolution-sdk/evolution");var z=(o,t)=>{let e=432e6,n=1647899091e3,r=328;return t!==1&&(e=18e5),Math.floor((o-n)/e)+r};function yt(o,t,e,n,r=0n,i){let s=n<0n?-n:n,a=e.tokenX===x?3000000n+BigInt(e.totalSwapFee):0n,p=BigInt(o)-BigInt(e.platformFeeX)+r-a,m=BigInt(t)-BigInt(e.platformFeeY),l=ht(p,m,[BigInt(e.sqrtLowerPriceNum),BigInt(e.sqrtLowerPriceDen)],[BigInt(e.sqrtUpperPriceNum),BigInt(e.sqrtUpperPriceDen)]),b=nt(l[0]*BigInt(e.sqrtUpperPriceDen),l[1]*BigInt(e.sqrtUpperPriceNum))+p,w=nt(l[0]*BigInt(e.sqrtLowerPriceNum),l[1]*BigInt(e.sqrtLowerPriceDen))+m;return n>0n?ot(s,b,w,m,BigInt(e.lpFeeRate),i):ot(s,w,b,p,BigInt(e.lpFeeRate),i)}var ot=(o,t,e,n,r,i)=>{let s=10000n,p=o*r/s*BigInt(i)/10000n,m=s-r,l=t*s+o*m,b=t*e,u=(e*l-b*s)/l;if(u>n)throw new Error("pool out exceeded");return[u,p]},ht=(o,t,e,n)=>{let r=e[1]*n[1],i=e[0]*n[0],s=(t*r-o*i)*(t*r-o*i),a=4n*o*t*e[1]*e[1]*n[0]*n[0],p=Pt(s+a),m=t*r+o*i+p,l=2n*(n[0]*e[1]-n[1]*e[0]);return[m,l]};function Pt(o){if(o<0n)throw new Error("Square root of negative number");if(o<2n)return o;let t=o,e=t+o/t>>1n;for(;e<t;)t=e,e=t+o/t>>1n;return t}function nt(o,t){if(t===0n)throw new Error("Division by zero");let e=o/t;return o%t===0n||o<0n!=t<0n?e:e+1n}function rt(o,t){let n=[...t].sort((r,i)=>r.transactionId===i.transactionId?r.index<i.index?-1:1:r.transactionId<i.transactionId?-1:1).findIndex(r=>r.transactionId===o.transactionId&&r.index===o.index);if(n===-1)throw new Error("Protocol config out ref not found in reference inputs");return BigInt(n)}function Q(o,t,e){let n=[];for(let r=0;r<o.length;r++){let i=o[r],s=t[r];if(s===0n)continue;let[a,p]=yt(i.tokenAAmount,i.tokenBAmount,i.datum,s,i.rewardAmount,e);n.push({poolIndex:r,deltaAmount:s,outputAmount:a,platformFee:p})}return n}var N=o=>{if(!o)return;let[t,e]=o.split("#");return new M.TransactionInput.TransactionInput({transactionId:M.TransactionHash.fromHex(t),index:BigInt(e)})};var it=require("@evolution-sdk/evolution/Bytes32"),J=class{constructor(){}async calculateSwapOut(t,e){if(!t||!t.address)throw new Error("Please connect a wallet first.");let n=(await t.address()).networkId,r=z(Date.now(),n),i=await Promise.all(e.pools.map(u=>t.getUtxosByOutRef([N(u.poolOutRef)]))),s=X(n),a=e.protocolConfigOutRef??s.protocolScriptOutRef,p=(await t.getUtxosByOutRef([N(a)]))[0];if(!p.datumOption)throw new Error("Protocol config UTxO does not contain a datum.");let m=V(p.datumOption),l=await Promise.all(e.pools.map(async(u,A)=>{let I=i[A][0];if(!I.datumOption)throw new Error(`Pool input UTxO ${A} does not contain a datum.`);let h=Y(I.datumOption),g=_(h.tokenX),R=_(h.tokenY),T=I.assets.lovelace,f=k=>k.unit===x?T:(0,y.quantityOf)(I.assets,k.policyId,k.assetName),B=null;u.stakingOutRef&&(B=(await t.getUtxosByOutRef([N(u.stakingOutRef)]))[0]);let U=0n;return g.unit===x&&B&&r>h.lastWithdrawEpoch&&(U=await this.getRewardAmount(t,n,B)),{tokenAAmount:f(g),tokenBAmount:f(R),datum:h,rewardAmount:U}})),b=e.pools.map(u=>u.deltaAmount);return Q(l,b,m.platformFeeRate).map(u=>u.outputAmount)}async submitSwap(t,e){if(!t||!t.address)throw new Error("Please connect a wallet first.");let n=(await t.address()).networkId,r=z(Date.now(),n),i=await Promise.all(e.pools.map(async c=>(await t.getUtxosByOutRef([N(c.poolOutRef)]))[0])),s=X(n),a=s.poolScriptOutRef,p=e.protocolConfigOutRef??s.protocolScriptOutRef,m=(await t.getUtxosByOutRef([N(a)]))[0],l=(await t.getUtxosByOutRef([N(p)]))[0];if(!l.datumOption)throw new Error("Protocol config UTxO does not contain a datum.");let b=V(l.datumOption),w=[],u=[];for(let c=0;c<e.pools.length;c++){let d=e.pools[c],P=i[c];if(!P.datumOption)throw new Error(`Pool input UTxO ${c} does not contain a datum.`);let D=Y(P.datumOption),F=_(D.tokenX),q=_(D.tokenY),W=P.assets.lovelace,L=G=>G.unit===x?W:(0,y.quantityOf)(P.assets,G.policyId,G.assetName),C=null;d.stakingOutRef&&(C=(await t.getUtxosByOutRef([N(d.stakingOutRef)]))[0]),u.push(C),w.push({tokenAAmount:L(F),tokenBAmount:L(q),datum:D,utxo:P,tokenA:F,tokenB:q})}let A=e.pools.map(c=>c.deltaAmount),I=Q(w,A,b.platformFeeRate);I.forEach((c,d)=>{let P=e.pools[d].minOutChangeAmount;if(c.outputAmount<P)throw new Error(`Expected swap output at least ${P} but got ${c.outputAmount}`)});let h=I.reduce((c,d)=>c+d.deltaAmount,0n),g=e.pools.find(c=>c.deltaAmount!==0n);if(!g)throw new Error("At least one pool must have a non-zero delta amount");let R=g.deltaAmount>0?w[0].tokenA:w[0].tokenB,T=await this.getUserTokenBalance(t,R);if(T<h)throw new Error(`Insufficient ${R.unit} balance. Required: ${h}, Available: ${T}`);let f=t.newTx(),B=[l];B.push(m),u.forEach(c=>{c&&B.push(c)}),f=f.readFrom({referenceInputs:B});let U=rt(l,B);f=f.withdraw({stakeCredential:(0,$.fromScript)(m.scriptRef),amount:0n,redeemer:H(null,i,A,U)});for(let c=0;c<w.length;c++){let d=w[c],P=I.find(C=>C.poolIndex===c);if(!P)continue;let D=P.deltaAmount,F=P.platformFee,q=tt({...d.datum,platformFeeX:BigInt(d.datum.platformFeeX)+(D>0?F:0n),platformFeeY:BigInt(d.datum.platformFeeY)+(D<0?F:0n),lastWithdrawEpoch:r,totalSwapFee:BigInt(d.datum.totalSwapFee)+BigInt(b.swapFee)}),W=this.buildDeltaAssets(D>0?d.tokenA:d.tokenB,D>0?d.tokenB:d.tokenA,D,BigInt(P.outputAmount),BigInt(b.swapFee)),L=(0,y.merge)(d.utxo.assets,W);if(f=f.payToAddress({address:d.utxo.address,assets:L,datum:q}),f=f.collectFrom({inputs:[d.utxo],redeemer:H(d.utxo,i,A,U)}),d.tokenA.unit===x&&r>d.datum.lastWithdrawEpoch&&u[c]){let C=await this.getRewardAmount(t,n,u[c]);f=f.withdraw({stakeCredential:(0,$.fromScript)(u[c].scriptRef),amount:C,redeemer:H(d.utxo,i,A,U)})}}f=f.attachMetadata({label:674n,metadata:new Map([["msg",["Danogo Multi-Pool Swap"]]])}),f.setValidity({from:BigInt(Date.now()-12e4),to:BigInt(Date.now()+24e4)});let v=await(await(await f.build({scriptDataFormat:"array"})).sign()).submit();return(0,it.toHex)(v.hash)}getPoolsFromOgmiosTx(t,e,n){let r=X(e),i=n??r.poolScriptHash;if(!i)throw new Error("Pool script hash is required but not provided or not found for this network.");let s=[];return t.outputs.forEach((a,p)=>{let m=a.value,l=m[i];if(l&&a.datum){for(let[b,w]of Object.entries(l))if(w===1n){let u=n+b,A=`${t.id}#${p}`,I=m.ada.lovelace,h=et(m),g=Y(a.datum),R=g.tokenX,T=g.tokenY,f=B=>{if(B===x)return I;let U=B.slice(0,56),k=B.slice(56),v=h.find(c=>c.policyId===U)?.assets.find(c=>c.name===k);return v?v.value:0n};s.push({outRef:A,address:a.address,coin:I,multiAssets:h,validityNft:u,tokenA:R,tokenAReserve:f(R),tokenB:T,tokenBReserve:f(T),lpFeeRate:g.lpFeeRate,priceLowerNum:g.sqrtLowerPriceNum,priceLowerDen:g.sqrtLowerPriceDen,priceUpperNum:g.sqrtUpperPriceNum,priceUpperDen:g.sqrtUpperPriceDen,platformFeeA:g.platformFeeX,platformFeeB:g.platformFeeY,minAChange:g.minXChange,minBChange:g.minYChange,lpTokenTotalSupply:g.circulatingLPToken,lastWithdrawEpoch:g.lastWithdrawEpoch,totalSwapFee:g.totalSwapFee})}}}),s}async getUserTokenBalance(t,e){return(await t.getWalletUtxos()).reduce((r,i)=>r+(e.unit===x?i.assets.lovelace:(0,y.quantityOf)(i.assets,e.policyId,e.assetName)||0n),0n)}buildDeltaAssets(t,e,n,r,i){let s=n>0n?n:-n,a;if(t.unit===x?a=(0,y.fromLovelace)(s+i):a=(0,y.fromAsset)(t.policyId,t.assetName,s,i),e.unit===x)a=(0,y.subtractLovelace)(a,r);else{let p=(0,y.fromAsset)(e.policyId,e.assetName,-r);a=(0,y.merge)(a,p)}return a}async getRewardAmount(t,e,n){let r=new Z.RewardAccount.RewardAccount({networkId:e,stakeCredential:(0,$.fromScript)(n.scriptRef)}),i=Z.RewardAccount.toBech32(r);return(await t.getDelegation(i)).rewards}},Bt=J;
|
package/dist/sdk.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{RewardAccount as nt}from"@evolution-sdk/evolution";import{fromScript as W}from"@evolution-sdk/evolution/ScriptHash";import{fromAsset as ot,merge as rt,quantityOf as G,fromLovelace as Pt,subtractLovelace as Rt}from"@evolution-sdk/evolution/Assets";function k(n,e){let o=(n>=0n?n:n+(1n<<256n)).toString(16);o.length%2&&(o="0"+o);let r=o.length/2;if(r>e)throw new Error(`Number ${n} requires ${r} bytes, but target length is ${e}.`);let i=new Uint8Array(e),s=e-r;for(let a=0;a<r;a++)i[a+s]=parseInt(o.slice(a*2,a*2+2),16);return i}var v=(n,e,t,o)=>{try{let r=(i,s)=>{let a=3n,m=k(n?i:o,1),l=k(a,1),p=e.map((A,y)=>{let P=s.find(b=>b.utxo.transactionId===A.transactionId&&b.utxo.index===A.index);if(!P)throw new Error(`Pool UTxO at ${y} not found in indexedInputs`);if(t[y]===void 0)throw new Error(`deltaAmount for poolOutIdx ${y} is undefined`);let w=k(BigInt(P.index),1),R=k(BigInt(y),1),g=k(t[y],32);return{poolInBytes:w,poolOutBytes:R,amountBytes:g}}),I=2+34*p.length,u=new Uint8Array(I),d=0;u.set(m,d),d+=m.length,u.set(l,d),d+=l.length;for(let A of p)u.set(A.poolInBytes,d),d+=A.poolInBytes.length,u.set(A.poolOutBytes,d),d+=A.poolOutBytes.length,u.set(A.amountBytes,d),d+=A.amountBytes.length;return u};return{all:i=>{if(!i.length)throw new Error("swapTokensRedeemer batch all called with empty indexedInputs");let s=null;if(n&&(s=i.find(a=>a.utxo.transactionId===n.transactionId&&a.utxo.index===n.index),!s))throw new Error("Target pool UTxO is not found in poolInUTxOs");return r(s?.index,i)},inputs:e}}catch(r){throw console.error("Error creating pool redeemer:",r),r}};import{Data as E,CBOR as Y}from"@evolution-sdk/evolution";import{InlineDatum as mt}from"@evolution-sdk/evolution/InlineDatum";var x="lovelace";var at="64d111b957e7d7848ffdde5149aa77fa4090a7fa1ad0ac108067900614848501#0",ct="d8b69fc53637bcfadbc4469083f706bc293f4d9d2296646c5ca167bb",ut="2cafd7c92f7093e5229af274be83dea660b0590b4174bbed79ba662b44fbd1ee#0";var lt="2e19cca74e3badcab26aef7574aa1885ba97228a254ca227ba2f79f2b75fd136#0",pt="04041c3c6ba87b33f2c9eb7f7dbeae3b26003c3e199d438bb99932a2",ft="3775af36f485f9c97101ee5b9b360c34f0f8e12186bc9060f358b7fc8ce468a4#0",q=n=>n===1?{poolScriptOutRef:at,poolScriptHash:ct,protocolScriptOutRef:ut}:{poolScriptOutRef:lt,poolScriptHash:pt,protocolScriptOutRef:ft};var z=n=>{let e=[new Uint8Array(Buffer.from(n.tokenX.slice(0,56),"hex")),new Uint8Array(Buffer.from(n.tokenX.slice(57),"hex"))],t=[new Uint8Array(Buffer.from(n.tokenY.slice(0,56),"hex")),new Uint8Array(Buffer.from(n.tokenY.slice(57),"hex"))],o=E.constr(0n,[n.sqrtLowerPriceNum,n.sqrtLowerPriceDen]),r=E.constr(0n,[n.sqrtUpperPriceNum,n.sqrtUpperPriceDen]),i=E.constr(0n,[e,t,BigInt(n.lpFeeRate),n.platformFeeX,n.platformFeeY,n.totalSwapFee,o,r,n.minXChange,n.minYChange,n.circulatingLPToken,BigInt(n.lastWithdrawEpoch)]);return new mt({data:i})};var L=n=>{let e;if(typeof n=="string")e=Y.fromCBORHex(n);else{let i=n.data,s=E.toCBORHex(i);e=Y.fromCBORHex(s)}let t=e._tag==="Tag"?e.value:e;if(!Array.isArray(t))throw new Error("Invalid datum structure: expected array of fields");let o=i=>{let s=i._tag==="Tag"?i.value:i;if(Array.isArray(s)&&s.length===2){let a=s[0]instanceof Uint8Array?s[0]:new Uint8Array(s[0]),m=s[1]instanceof Uint8Array?s[1]:new Uint8Array(s[1]),l=Buffer.from(a).toString("hex"),p=Buffer.from(m).toString("hex");return l===""&&p===""?x:l+"."+p}throw new Error("Invalid AssetClass structure")},r=i=>{let s=i._tag==="Tag"?i.value:i;if(Array.isArray(s)&&s.length===2)return{num:BigInt(s[0]),den:BigInt(s[1])};throw new Error("Invalid Ratio structure")};return{tokenX:o(t[0]),tokenY:o(t[1]),lpFeeRate:Number(t[2]),platformFeeX:BigInt(t[3]),platformFeeY:BigInt(t[4]),totalSwapFee:BigInt(t[5]),sqrtLowerPriceNum:r(t[6]).num,sqrtLowerPriceDen:r(t[6]).den,sqrtUpperPriceNum:r(t[7]).num,sqrtUpperPriceDen:r(t[7]).den,minXChange:BigInt(t[8]),minYChange:BigInt(t[9]),circulatingLPToken:BigInt(t[10]),lastWithdrawEpoch:Number(t[11])}},M=n=>{let e,t=E.toCBORHex(n.data);e=Y.fromCBORHex(t);let o=e._tag==="Tag"?e.value:e;if(!Array.isArray(o))throw new Error("Invalid datum structure: expected array of fields");return{platformFeeRate:BigInt(o[0]),swapFee:BigInt(o[1])}};import{AssetName as dt,Bytes as Q,PolicyId as gt}from"@evolution-sdk/evolution";function C(n){if(n===x)return{unit:x};let e=n.indexOf("."),t=e===-1?n:n.slice(0,e),o=e===-1?"":n.slice(e+1),r=Q.fromHex(t),i=new gt.PolicyId({hash:r}),s=o?Q.fromHex(o):new Uint8Array(0),a=new dt.AssetName({bytes:s});return{policyId:i,assetName:a,unit:n}}var Z=n=>{if(!n||Object.keys(n).length===0)return[];let e=[];for(let[t,o]of Object.entries(n)){if(t==="ada")continue;let r=[];for(let[i,s]of Object.entries(o))r.push({name:i,value:s});e.push({policyId:t,assets:r})}return e};import{TransactionHash as It,TransactionInput as xt}from"@evolution-sdk/evolution";var tt=(n,e)=>{let t=432e6,o=1647899091e3,r=328;return e!==1&&(t=18e5),Math.floor((n-o)/t)+r};function yt(n,e,t,o,r=0n,i){let s=o<0n?-o:o,a=t.tokenX===x?3000000n+BigInt(t.totalSwapFee):0n,m=BigInt(n)-BigInt(t.platformFeeX)+r-a,l=BigInt(e)-BigInt(t.platformFeeY),p=bt(m,l,[BigInt(t.sqrtLowerPriceNum),BigInt(t.sqrtLowerPriceDen)],[BigInt(t.sqrtUpperPriceNum),BigInt(t.sqrtUpperPriceDen)]),I=K(p[0]*BigInt(t.sqrtUpperPriceDen),p[1]*BigInt(t.sqrtUpperPriceNum))+m,u=K(p[0]*BigInt(t.sqrtLowerPriceNum),p[1]*BigInt(t.sqrtLowerPriceDen))+l;return o>0n?J(s,I,u,l,BigInt(t.lpFeeRate),i):J(s,u,I,m,BigInt(t.lpFeeRate),i)}var J=(n,e,t,o,r,i)=>{let s=10000n,m=n*r/s*BigInt(i)/10000n,l=s-r,p=e*s+n*l,I=e*t,d=(t*p-I*s)/p;if(d>o)throw new Error("pool out exceeded");return[d,m]},bt=(n,e,t,o)=>{let r=t[1]*o[1],i=t[0]*o[0],s=(e*r-n*i)*(e*r-n*i),a=4n*n*e*t[1]*t[1]*o[0]*o[0],m=ht(s+a),l=e*r+n*i+m,p=2n*(o[0]*t[1]-o[1]*t[0]);return[l,p]};function ht(n){if(n<0n)throw new Error("Square root of negative number");if(n<2n)return n;let e=n,t=e+n/e>>1n;for(;t<e;)e=t,t=e+n/e>>1n;return e}function K(n,e){if(e===0n)throw new Error("Division by zero");let t=n/e;return n%e===0n||n<0n!=e<0n?t:t+1n}function et(n,e){let o=[...e].sort((r,i)=>r.transactionId===i.transactionId?r.index<i.index?-1:1:r.transactionId<i.transactionId?-1:1).findIndex(r=>r.transactionId===n.transactionId&&r.index===n.index);if(o===-1)throw new Error("Protocol config out ref not found in reference inputs");return BigInt(o)}function $(n,e,t){let o=[];for(let r=0;r<n.length;r++){let i=n[r],s=e[r];if(s===0n)continue;let[a,m]=yt(i.tokenAAmount,i.tokenBAmount,i.datum,s,i.rewardAmount||0n,t);o.push({poolIndex:r,deltaAmount:s,outputAmount:a,platformFee:m})}return o}var T=n=>{if(!n)return;let[e,t]=n.split("#");return new xt.TransactionInput({transactionId:It.fromHex(e),index:BigInt(t)})};import{toHex as Bt}from"@evolution-sdk/evolution/Bytes32";var j=class{constructor(){}async calculateSwapOut(e,t){if(!e||!e.address)throw new Error("Please connect a wallet first.");let o=(await e.address()).networkId,r=await Promise.all(t.pools.map(u=>e.getUtxosByOutRef([T(u.poolOutRef)]))),i=q(o),s=t.protocolConfigOutRef??i.protocolScriptOutRef,a=(await e.getUtxosByOutRef([T(s)]))[0];if(!a.datumOption)throw new Error("Protocol config UTxO does not contain a datum.");let m=M(a.datumOption),l=await Promise.all(t.pools.map(async(u,d)=>{let A=r[d][0];if(!A.datumOption)throw new Error(`Pool input UTxO ${d} does not contain a datum.`);let y=L(A.datumOption),P=C(y.tokenX),w=C(y.tokenY),R=A.assets.lovelace,g=B=>B.unit===x?R:G(A.assets,B.policyId,B.assetName),b=null;u.stakingOutRef&&(b=(await e.getUtxosByOutRef([T(u.stakingOutRef)]))[0]);let{rewardAmount:D}=await this.getStakingRewards(e,o,b,P);return{tokenAAmount:g(P),tokenBAmount:g(w),datum:y,rewardAmount:D}})),p=t.pools.map(u=>u.deltaAmount);return $(l,p,m.platformFeeRate).map(u=>u.outputAmount)}async submitSwap(e,t){if(!e||!e.address)throw new Error("Please connect a wallet first.");let o=(await e.address()).networkId,r=await Promise.all(t.pools.map(async c=>(await e.getUtxosByOutRef([T(c.poolOutRef)]))[0])),i=q(o),s=i.poolScriptOutRef,a=t.protocolConfigOutRef??i.protocolScriptOutRef,m=(await e.getUtxosByOutRef([T(s)]))[0],l=(await e.getUtxosByOutRef([T(a)]))[0];if(!l.datumOption)throw new Error("Protocol config UTxO does not contain a datum.");let p=M(l.datumOption),I=[],u=[];for(let c=0;c<t.pools.length;c++){let f=t.pools[c],h=r[c];if(!h.datumOption)throw new Error(`Pool input UTxO ${c} does not contain a datum.`);let O=L(h.datumOption),N=C(O.tokenX),S=C(O.tokenY),H=h.assets.lovelace,_=X=>X.unit===x?H:G(h.assets,X.policyId,X.assetName),U=null;f.stakingOutRef&&(U=(await e.getUtxosByOutRef([T(f.stakingOutRef)]))[0]),u.push(U);let{rewardAmount:st}=await this.getStakingRewards(e,o,U,N);I.push({tokenAAmount:_(N),tokenBAmount:_(S),datum:O,rewardAmount:st,utxo:h,tokenA:N,tokenB:S})}let d=t.pools.map(c=>c.deltaAmount),A=$(I,d,p.platformFeeRate);A.forEach((c,f)=>{let h=t.pools[f].minOutChangeAmount;if(c.outputAmount<h)throw new Error(`Expected swap output at least ${h} but got ${c.outputAmount}`)});let y=A.reduce((c,f)=>c+f.deltaAmount,0n),P=t.pools.find(c=>c.deltaAmount!==0n);if(!P)throw new Error("At least one pool must have a non-zero delta amount");let w=P.deltaAmount>0?I[0].tokenA:I[0].tokenB,R=await this.getUserTokenBalance(e,w);if(R<y)throw new Error(`Insufficient ${w.unit} balance. Required: ${y}, Available: ${R}`);let g=e.newTx(),b=[l];b.push(m),u.forEach(c=>{c&&b.push(c)}),g=g.readFrom({referenceInputs:b});let D=tt(Date.now(),o),B=et(l,b);g=g.withdraw({stakeCredential:W(m.scriptRef),amount:0n,redeemer:v(null,r,d,B)});for(let c=0;c<I.length;c++){let f=I[c],h=A.find(U=>U.poolIndex===c);if(!h)continue;let O=h.deltaAmount,N=h.platformFee,S=z({...f.datum,platformFeeX:BigInt(f.datum.platformFeeX)+(O>0?N:0n),platformFeeY:BigInt(f.datum.platformFeeY)+(O<0?N:0n),lastWithdrawEpoch:D,totalSwapFee:BigInt(f.datum.totalSwapFee)+BigInt(p.swapFee)}),H=this.buildDeltaAssets(O>0?f.tokenA:f.tokenB,O>0?f.tokenB:f.tokenA,O,BigInt(h.outputAmount),BigInt(p.swapFee)),_=rt(f.utxo.assets,H);if(g=g.payToAddress({address:f.utxo.address,assets:_,datum:S}),g=g.collectFrom({inputs:[f.utxo],redeemer:v(f.utxo,r,d,B)}),f.tokenA.unit===x&&D>f.datum.lastWithdrawEpoch&&u[c]){let{stakingRewardAddress:U}=await this.getStakingRewards(e,o,u[c],f.tokenA);U&&(g=g.withdraw({stakeCredential:W(u[c].scriptRef),amount:f.rewardAmount||0n,redeemer:v(f.utxo,r,d,B)}))}}g=g.attachMetadata({label:674n,metadata:new Map([["msg",["Danogo Multi-Pool Swap"]]])}),g.setValidity({from:BigInt(Date.now()-12e4),to:BigInt(Date.now()+24e4)});let F=await(await(await g.build({scriptDataFormat:"array"})).sign()).submit();return Bt(F.hash)}getPoolsFromOgmiosTx(e,t,o){let r=q(t),i=o??r.poolScriptHash;if(!i)throw new Error("Pool script hash is required but not provided or not found for this network.");let s=[];return e.outputs.forEach((a,m)=>{let l=a.value,p=l[i];if(p&&a.datum){for(let[I,u]of Object.entries(p))if(u===1n){let d=o+I,A=`${e.id}#${m}`,y=l.ada.lovelace,P=Z(l),w=L(a.datum),R=w.tokenX,g=w.tokenY,b=D=>{if(D===x)return y;let B=D.slice(0,56),V=D.slice(56),F=P.find(c=>c.policyId===B)?.assets.find(c=>c.name===V);return F?F.value:0n};s.push({outRef:A,address:a.address,coin:y,multiAssets:P,validityNft:d,tokenA:R,tokenAReserve:b(R),tokenB:g,tokenBReserve:b(g),lpFeeRate:w.lpFeeRate,priceLowerNum:w.sqrtLowerPriceNum,priceLowerDen:w.sqrtLowerPriceDen,priceUpperNum:w.sqrtUpperPriceNum,priceUpperDen:w.sqrtUpperPriceDen,platformFeeA:w.platformFeeX,platformFeeB:w.platformFeeY,minAChange:w.minXChange,minBChange:w.minYChange,lpTokenTotalSupply:w.circulatingLPToken,lastWithdrawEpoch:w.lastWithdrawEpoch,totalSwapFee:w.totalSwapFee})}}}),s}async getUserTokenBalance(e,t){return(await e.getWalletUtxos()).reduce((r,i)=>r+(t.unit===x?i.assets.lovelace:G(i.assets,t.policyId,t.assetName)||0n),0n)}buildDeltaAssets(e,t,o,r,i){let s=o>0n?o:-o,a;if(e.unit===x?a=Pt(s+i):a=ot(e.policyId,e.assetName,s,i),t.unit===x)a=Rt(a,r);else{let m=ot(t.policyId,t.assetName,-r);a=rt(a,m)}return a}async getStakingRewards(e,t,o,r){if(r.unit!==x)return{rewardAmount:0n};let i=new nt.RewardAccount({networkId:t,stakeCredential:W(o.scriptRef)}),s=nt.toBech32(i);return{rewardAmount:(await e.getDelegation(s)).rewards,stakingRewardAddress:s}}},te=j;export{te as default,T as toEvoOutRef};
|
|
1
|
+
import{RewardAccount as ot}from"@evolution-sdk/evolution";import{fromScript as j}from"@evolution-sdk/evolution/ScriptHash";import{fromAsset as nt,merge as rt,quantityOf as V,fromLovelace as ht,subtractLovelace as Pt}from"@evolution-sdk/evolution/Assets";function k(o,e){let n=(o>=0n?o:o+(1n<<256n)).toString(16);n.length%2&&(n="0"+n);let i=n.length/2;if(i>e)throw new Error(`Number ${o} requires ${i} bytes, but target length is ${e}.`);let r=new Uint8Array(e),s=e-i;for(let a=0;a<i;a++)r[a+s]=parseInt(n.slice(a*2,a*2+2),16);return r}var q=(o,e,t,n)=>{try{let i=(r,s)=>{let a=3n,p=k(o?r:n,1),m=k(a,1),l=e.map((A,I)=>{let y=s.find(f=>f.utxo.transactionId===A.transactionId&&f.utxo.index===A.index);if(!y)throw new Error(`Pool UTxO at ${I} not found in indexedInputs`);if(t[I]===void 0)throw new Error(`deltaAmount for poolOutIdx ${I} is undefined`);let g=k(BigInt(y.index),1),B=k(BigInt(I),1),O=k(t[I],32);return{poolInBytes:g,poolOutBytes:B,amountBytes:O}}),b=2+34*l.length,w=new Uint8Array(b),u=0;w.set(p,u),u+=p.length,w.set(m,u),u+=m.length;for(let A of l)w.set(A.poolInBytes,u),u+=A.poolInBytes.length,w.set(A.poolOutBytes,u),u+=A.poolOutBytes.length,w.set(A.amountBytes,u),u+=A.amountBytes.length;return w};return{all:r=>{if(!r.length)throw new Error("swapTokensRedeemer batch all called with empty indexedInputs");let s=null;if(o&&(s=r.find(a=>a.utxo.transactionId===o.transactionId&&a.utxo.index===o.index),!s))throw new Error("Target pool UTxO is not found in poolInUTxOs");return i(s?.index,r)},inputs:e}}catch(i){throw console.error("Error creating pool redeemer:",i),i}};import{Data as C,CBOR as M}from"@evolution-sdk/evolution";import{InlineDatum as ft}from"@evolution-sdk/evolution/InlineDatum";var x="lovelace";var st="64d111b957e7d7848ffdde5149aa77fa4090a7fa1ad0ac108067900614848501#0",at="d8b69fc53637bcfadbc4469083f706bc293f4d9d2296646c5ca167bb",ct="2cafd7c92f7093e5229af274be83dea660b0590b4174bbed79ba662b44fbd1ee#0";var ut="2e19cca74e3badcab26aef7574aa1885ba97228a254ca227ba2f79f2b75fd136#0",lt="04041c3c6ba87b33f2c9eb7f7dbeae3b26003c3e199d438bb99932a2",pt="3775af36f485f9c97101ee5b9b360c34f0f8e12186bc9060f358b7fc8ce468a4#0",L=o=>o===1?{poolScriptOutRef:st,poolScriptHash:at,protocolScriptOutRef:ct}:{poolScriptOutRef:ut,poolScriptHash:lt,protocolScriptOutRef:pt};var Q=o=>{let e=[new Uint8Array(Buffer.from(o.tokenX.slice(0,56),"hex")),new Uint8Array(Buffer.from(o.tokenX.slice(57),"hex"))],t=[new Uint8Array(Buffer.from(o.tokenY.slice(0,56),"hex")),new Uint8Array(Buffer.from(o.tokenY.slice(57),"hex"))],n=C.constr(0n,[o.sqrtLowerPriceNum,o.sqrtLowerPriceDen]),i=C.constr(0n,[o.sqrtUpperPriceNum,o.sqrtUpperPriceDen]),r=C.constr(0n,[e,t,BigInt(o.lpFeeRate),o.platformFeeX,o.platformFeeY,o.totalSwapFee,n,i,o.minXChange,o.minYChange,o.circulatingLPToken,BigInt(o.lastWithdrawEpoch)]);return new ft({data:r})};var H=o=>{let e;if(typeof o=="string")e=M.fromCBORHex(o);else{let r=o.data,s=C.toCBORHex(r);e=M.fromCBORHex(s)}let t=e._tag==="Tag"?e.value:e;if(!Array.isArray(t))throw new Error("Invalid datum structure: expected array of fields");let n=r=>{let s=r._tag==="Tag"?r.value:r;if(Array.isArray(s)&&s.length===2){let a=s[0]instanceof Uint8Array?s[0]:new Uint8Array(s[0]),p=s[1]instanceof Uint8Array?s[1]:new Uint8Array(s[1]),m=Buffer.from(a).toString("hex"),l=Buffer.from(p).toString("hex");return m===""&&l===""?x:m+"."+l}throw new Error("Invalid AssetClass structure")},i=r=>{let s=r._tag==="Tag"?r.value:r;if(Array.isArray(s)&&s.length===2)return{num:BigInt(s[0]),den:BigInt(s[1])};throw new Error("Invalid Ratio structure")};return{tokenX:n(t[0]),tokenY:n(t[1]),lpFeeRate:Number(t[2]),platformFeeX:BigInt(t[3]),platformFeeY:BigInt(t[4]),totalSwapFee:BigInt(t[5]),sqrtLowerPriceNum:i(t[6]).num,sqrtLowerPriceDen:i(t[6]).den,sqrtUpperPriceNum:i(t[7]).num,sqrtUpperPriceDen:i(t[7]).den,minXChange:BigInt(t[8]),minYChange:BigInt(t[9]),circulatingLPToken:BigInt(t[10]),lastWithdrawEpoch:Number(t[11])}},$=o=>{let e,t=C.toCBORHex(o.data);e=M.fromCBORHex(t);let n=e._tag==="Tag"?e.value:e;if(!Array.isArray(n))throw new Error("Invalid datum structure: expected array of fields");return{platformFeeRate:BigInt(n[0]),swapFee:BigInt(n[1])}};import{AssetName as mt,Bytes as Z,PolicyId as gt}from"@evolution-sdk/evolution";function F(o){if(o===x)return{unit:x};let e=o.indexOf("."),t=e===-1?o:o.slice(0,e),n=e===-1?"":o.slice(e+1),i=Z.fromHex(t),r=new gt.PolicyId({hash:i}),s=n?Z.fromHex(n):new Uint8Array(0),a=new mt.AssetName({bytes:s});return{policyId:r,assetName:a,unit:o}}var J=o=>{if(!o||Object.keys(o).length===0)return[];let e=[];for(let[t,n]of Object.entries(o)){if(t==="ada")continue;let i=[];for(let[r,s]of Object.entries(n))i.push({name:r,value:s});e.push({policyId:t,assets:i})}return e};import{TransactionHash as At,TransactionInput as It}from"@evolution-sdk/evolution";var W=(o,e)=>{let t=432e6,n=1647899091e3,i=328;return e!==1&&(t=18e5),Math.floor((o-n)/t)+i};function xt(o,e,t,n,i=0n,r){let s=n<0n?-n:n,a=t.tokenX===x?3000000n+BigInt(t.totalSwapFee):0n,p=BigInt(o)-BigInt(t.platformFeeX)+i-a,m=BigInt(e)-BigInt(t.platformFeeY),l=bt(p,m,[BigInt(t.sqrtLowerPriceNum),BigInt(t.sqrtLowerPriceDen)],[BigInt(t.sqrtUpperPriceNum),BigInt(t.sqrtUpperPriceDen)]),b=tt(l[0]*BigInt(t.sqrtUpperPriceDen),l[1]*BigInt(t.sqrtUpperPriceNum))+p,w=tt(l[0]*BigInt(t.sqrtLowerPriceNum),l[1]*BigInt(t.sqrtLowerPriceDen))+m;return n>0n?K(s,b,w,m,BigInt(t.lpFeeRate),r):K(s,w,b,p,BigInt(t.lpFeeRate),r)}var K=(o,e,t,n,i,r)=>{let s=10000n,p=o*i/s*BigInt(r)/10000n,m=s-i,l=e*s+o*m,b=e*t,u=(t*l-b*s)/l;if(u>n)throw new Error("pool out exceeded");return[u,p]},bt=(o,e,t,n)=>{let i=t[1]*n[1],r=t[0]*n[0],s=(e*i-o*r)*(e*i-o*r),a=4n*o*e*t[1]*t[1]*n[0]*n[0],p=yt(s+a),m=e*i+o*r+p,l=2n*(n[0]*t[1]-n[1]*t[0]);return[m,l]};function yt(o){if(o<0n)throw new Error("Square root of negative number");if(o<2n)return o;let e=o,t=e+o/e>>1n;for(;t<e;)e=t,t=e+o/e>>1n;return e}function tt(o,e){if(e===0n)throw new Error("Division by zero");let t=o/e;return o%e===0n||o<0n!=e<0n?t:t+1n}function et(o,e){let n=[...e].sort((i,r)=>i.transactionId===r.transactionId?i.index<r.index?-1:1:i.transactionId<r.transactionId?-1:1).findIndex(i=>i.transactionId===o.transactionId&&i.index===o.index);if(n===-1)throw new Error("Protocol config out ref not found in reference inputs");return BigInt(n)}function G(o,e,t){let n=[];for(let i=0;i<o.length;i++){let r=o[i],s=e[i];if(s===0n)continue;let[a,p]=xt(r.tokenAAmount,r.tokenBAmount,r.datum,s,r.rewardAmount,t);n.push({poolIndex:i,deltaAmount:s,outputAmount:a,platformFee:p})}return n}var D=o=>{if(!o)return;let[e,t]=o.split("#");return new It.TransactionInput({transactionId:At.fromHex(e),index:BigInt(t)})};import{toHex as Bt}from"@evolution-sdk/evolution/Bytes32";var z=class{constructor(){}async calculateSwapOut(e,t){if(!e||!e.address)throw new Error("Please connect a wallet first.");let n=(await e.address()).networkId,i=W(Date.now(),n),r=await Promise.all(t.pools.map(u=>e.getUtxosByOutRef([D(u.poolOutRef)]))),s=L(n),a=t.protocolConfigOutRef??s.protocolScriptOutRef,p=(await e.getUtxosByOutRef([D(a)]))[0];if(!p.datumOption)throw new Error("Protocol config UTxO does not contain a datum.");let m=$(p.datumOption),l=await Promise.all(t.pools.map(async(u,A)=>{let I=r[A][0];if(!I.datumOption)throw new Error(`Pool input UTxO ${A} does not contain a datum.`);let y=H(I.datumOption),g=F(y.tokenX),B=F(y.tokenY),O=I.assets.lovelace,f=U=>U.unit===x?O:V(I.assets,U.policyId,U.assetName),P=null;u.stakingOutRef&&(P=(await e.getUtxosByOutRef([D(u.stakingOutRef)]))[0]);let T=0n;return g.unit===x&&P&&i>y.lastWithdrawEpoch&&(T=await this.getRewardAmount(e,n,P)),{tokenAAmount:f(g),tokenBAmount:f(B),datum:y,rewardAmount:T}})),b=t.pools.map(u=>u.deltaAmount);return G(l,b,m.platformFeeRate).map(u=>u.outputAmount)}async submitSwap(e,t){if(!e||!e.address)throw new Error("Please connect a wallet first.");let n=(await e.address()).networkId,i=W(Date.now(),n),r=await Promise.all(t.pools.map(async c=>(await e.getUtxosByOutRef([D(c.poolOutRef)]))[0])),s=L(n),a=s.poolScriptOutRef,p=t.protocolConfigOutRef??s.protocolScriptOutRef,m=(await e.getUtxosByOutRef([D(a)]))[0],l=(await e.getUtxosByOutRef([D(p)]))[0];if(!l.datumOption)throw new Error("Protocol config UTxO does not contain a datum.");let b=$(l.datumOption),w=[],u=[];for(let c=0;c<t.pools.length;c++){let d=t.pools[c],h=r[c];if(!h.datumOption)throw new Error(`Pool input UTxO ${c} does not contain a datum.`);let R=H(h.datumOption),E=F(R.tokenX),_=F(R.tokenY),X=h.assets.lovelace,v=Y=>Y.unit===x?X:V(h.assets,Y.policyId,Y.assetName),N=null;d.stakingOutRef&&(N=(await e.getUtxosByOutRef([D(d.stakingOutRef)]))[0]),u.push(N),w.push({tokenAAmount:v(E),tokenBAmount:v(_),datum:R,utxo:h,tokenA:E,tokenB:_})}let A=t.pools.map(c=>c.deltaAmount),I=G(w,A,b.platformFeeRate);I.forEach((c,d)=>{let h=t.pools[d].minOutChangeAmount;if(c.outputAmount<h)throw new Error(`Expected swap output at least ${h} but got ${c.outputAmount}`)});let y=I.reduce((c,d)=>c+d.deltaAmount,0n),g=t.pools.find(c=>c.deltaAmount!==0n);if(!g)throw new Error("At least one pool must have a non-zero delta amount");let B=g.deltaAmount>0?w[0].tokenA:w[0].tokenB,O=await this.getUserTokenBalance(e,B);if(O<y)throw new Error(`Insufficient ${B.unit} balance. Required: ${y}, Available: ${O}`);let f=e.newTx(),P=[l];P.push(m),u.forEach(c=>{c&&P.push(c)}),f=f.readFrom({referenceInputs:P});let T=et(l,P);f=f.withdraw({stakeCredential:j(m.scriptRef),amount:0n,redeemer:q(null,r,A,T)});for(let c=0;c<w.length;c++){let d=w[c],h=I.find(N=>N.poolIndex===c);if(!h)continue;let R=h.deltaAmount,E=h.platformFee,_=Q({...d.datum,platformFeeX:BigInt(d.datum.platformFeeX)+(R>0?E:0n),platformFeeY:BigInt(d.datum.platformFeeY)+(R<0?E:0n),lastWithdrawEpoch:i,totalSwapFee:BigInt(d.datum.totalSwapFee)+BigInt(b.swapFee)}),X=this.buildDeltaAssets(R>0?d.tokenA:d.tokenB,R>0?d.tokenB:d.tokenA,R,BigInt(h.outputAmount),BigInt(b.swapFee)),v=rt(d.utxo.assets,X);if(f=f.payToAddress({address:d.utxo.address,assets:v,datum:_}),f=f.collectFrom({inputs:[d.utxo],redeemer:q(d.utxo,r,A,T)}),d.tokenA.unit===x&&i>d.datum.lastWithdrawEpoch&&u[c]){let N=await this.getRewardAmount(e,n,u[c]);f=f.withdraw({stakeCredential:j(u[c].scriptRef),amount:N,redeemer:q(d.utxo,r,A,T)})}}f=f.attachMetadata({label:674n,metadata:new Map([["msg",["Danogo Multi-Pool Swap"]]])}),f.setValidity({from:BigInt(Date.now()-12e4),to:BigInt(Date.now()+24e4)});let S=await(await(await f.build({scriptDataFormat:"array"})).sign()).submit();return Bt(S.hash)}getPoolsFromOgmiosTx(e,t,n){let i=L(t),r=n??i.poolScriptHash;if(!r)throw new Error("Pool script hash is required but not provided or not found for this network.");let s=[];return e.outputs.forEach((a,p)=>{let m=a.value,l=m[r];if(l&&a.datum){for(let[b,w]of Object.entries(l))if(w===1n){let u=n+b,A=`${e.id}#${p}`,I=m.ada.lovelace,y=J(m),g=H(a.datum),B=g.tokenX,O=g.tokenY,f=P=>{if(P===x)return I;let T=P.slice(0,56),U=P.slice(56),S=y.find(c=>c.policyId===T)?.assets.find(c=>c.name===U);return S?S.value:0n};s.push({outRef:A,address:a.address,coin:I,multiAssets:y,validityNft:u,tokenA:B,tokenAReserve:f(B),tokenB:O,tokenBReserve:f(O),lpFeeRate:g.lpFeeRate,priceLowerNum:g.sqrtLowerPriceNum,priceLowerDen:g.sqrtLowerPriceDen,priceUpperNum:g.sqrtUpperPriceNum,priceUpperDen:g.sqrtUpperPriceDen,platformFeeA:g.platformFeeX,platformFeeB:g.platformFeeY,minAChange:g.minXChange,minBChange:g.minYChange,lpTokenTotalSupply:g.circulatingLPToken,lastWithdrawEpoch:g.lastWithdrawEpoch,totalSwapFee:g.totalSwapFee})}}}),s}async getUserTokenBalance(e,t){return(await e.getWalletUtxos()).reduce((i,r)=>i+(t.unit===x?r.assets.lovelace:V(r.assets,t.policyId,t.assetName)||0n),0n)}buildDeltaAssets(e,t,n,i,r){let s=n>0n?n:-n,a;if(e.unit===x?a=ht(s+r):a=nt(e.policyId,e.assetName,s,r),t.unit===x)a=Pt(a,i);else{let p=nt(t.policyId,t.assetName,-i);a=rt(a,p)}return a}async getRewardAmount(e,t,n){let i=new ot.RewardAccount({networkId:t,stakeCredential:j(n.scriptRef)}),r=ot.toBech32(i);return(await e.getDelegation(r)).rewards}},Kt=z;export{Kt as default};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "danogo-clmm",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.5",
|
|
4
4
|
"description": "An SDK to calculate and execute swaps on the Danogo liquidity platform.",
|
|
5
5
|
"main": "./dist/sdk.js",
|
|
6
6
|
"module": "./dist/sdk.mjs",
|
|
@@ -21,6 +21,7 @@
|
|
|
21
21
|
"swap",
|
|
22
22
|
"clmm"
|
|
23
23
|
],
|
|
24
|
+
"license": "MIT",
|
|
24
25
|
"repository": {
|
|
25
26
|
"type": "git",
|
|
26
27
|
"url": "https://github.com/dano-finance/clmm-sdk"
|