danogo-clmm 0.1.3 → 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/README.md CHANGED
@@ -14,6 +14,7 @@ This SDK requires:
14
14
  - Node.js 18+
15
15
  - `@evolution-sdk/evolution` version `0.32.2` for wallet management and transaction building
16
16
  - A Kupmios provider for blockchain data and transaction submission
17
+ - Support network: Preprod & Mainnet
17
18
 
18
19
  ## Usage
19
20
 
@@ -46,14 +47,14 @@ Calculate the expected output of a swap without submitting a transaction. You ca
46
47
  const quote = await danogoClmm.calculateSwapOut(evolutionClient, {
47
48
  pools: [
48
49
  {
49
- poolOutRef: pool1OutRef,
50
+ poolOutRef: "tx_hash#index",
50
51
  deltaAmount: 5_000_000n,
51
- stakingOutRef: staking1OutRef // required if pool contains ADA and swap for the first time in current epoch
52
+ stakingOutRef: "tx_hash#index" // required if pool contains ADA and swap for the first time in current epoch
52
53
  },
53
54
  {
54
- poolOutRef: pool2OutRef,
55
+ poolOutRef: "tx_hash#index",
55
56
  deltaAmount: 5_000_000n,
56
- stakingOutRef: staking2OutRef // required if pool contains ADA and swap for the first time in current epoch
57
+ stakingOutRef: "tx_hash#index" // required if pool contains ADA and swap for the first time in current epoch
57
58
  }
58
59
  ]
59
60
  });
@@ -68,19 +69,19 @@ Build and submit a swap transaction across one or more pools.
68
69
  const txHash = await danogoClmm.submitSwap(evolutionClient, {
69
70
  pools: [
70
71
  {
71
- poolOutRef: pool1OutRef,
72
+ poolOutRef: "tx_hash#index",
72
73
  deltaAmount: 5_000_000n,
73
74
  minOutChangeAmount: 4_500_000n, // retrieve from calculateSwapOut to avoid slippage
74
- stakingOutRef: staking1OutRef // required if pool contains ADA and swap for the first time in current epoch
75
+ stakingOutRef: "tx_hash#index" // required if pool contains ADA and swap for the first time in current epoch
75
76
  },
76
77
  {
77
- poolOutRef: pool2OutRef,
78
+ poolOutRef: "tx_hash#index",
78
79
  deltaAmount: 5_000_000n,
79
80
  minOutChangeAmount: 4_500_000n, // retrieve from calculateSwapOut to avoid slippage
80
- stakingOutRef: staking2OutRef // required if pool contains ADA and swap for the first time in current epoch
81
+ stakingOutRef: "tx_hash#index" // required if pool contains ADA and swap for the first time in current epoch
81
82
  }
82
83
  ],
83
- protocolConfigOutRef: protocolConfigRef
84
+ protocolConfigOutRef: "tx_hash#index"
84
85
  });
85
86
  ```
86
87
 
package/dist/sdk.d.mts CHANGED
@@ -1,4 +1,4 @@
1
- import { TransactionInput, SigningClient } from '@evolution-sdk/evolution';
1
+ import { SigningClient } from '@evolution-sdk/evolution';
2
2
  import { Transaction } from '@cardano-ogmios/schema';
3
3
 
4
4
  interface PoolDatum {
@@ -52,20 +52,20 @@ interface ConcentratedPool {
52
52
  }
53
53
  interface SwapRequest {
54
54
  pools: {
55
- poolOutRef: TransactionInput.TransactionInput;
55
+ poolOutRef: string;
56
56
  deltaAmount: bigint;
57
57
  minOutChangeAmount: bigint;
58
- stakingOutRef?: TransactionInput.TransactionInput;
58
+ stakingOutRef?: string;
59
59
  }[];
60
- protocolConfigOutRef?: TransactionInput.TransactionInput;
60
+ protocolConfigOutRef?: string;
61
61
  }
62
62
  interface QuoteSwapRequest {
63
63
  pools: {
64
- poolOutRef: TransactionInput.TransactionInput;
64
+ poolOutRef: string;
65
65
  deltaAmount: bigint;
66
- stakingOutRef?: TransactionInput.TransactionInput;
66
+ stakingOutRef?: string;
67
67
  }[];
68
- protocolConfigOutRef?: TransactionInput.TransactionInput;
68
+ protocolConfigOutRef?: string;
69
69
  }
70
70
 
71
71
  declare class DanogoClmm {
@@ -159,7 +159,7 @@ declare class DanogoClmm {
159
159
  /**
160
160
  * Helper function to handle staking rewards for ADA pools
161
161
  */
162
- private getStakingRewards;
162
+ private getRewardAmount;
163
163
  }
164
164
 
165
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 { TransactionInput, SigningClient } from '@evolution-sdk/evolution';
1
+ import { SigningClient } from '@evolution-sdk/evolution';
2
2
  import { Transaction } from '@cardano-ogmios/schema';
3
3
 
4
4
  interface PoolDatum {
@@ -52,20 +52,20 @@ interface ConcentratedPool {
52
52
  }
53
53
  interface SwapRequest {
54
54
  pools: {
55
- poolOutRef: TransactionInput.TransactionInput;
55
+ poolOutRef: string;
56
56
  deltaAmount: bigint;
57
57
  minOutChangeAmount: bigint;
58
- stakingOutRef?: TransactionInput.TransactionInput;
58
+ stakingOutRef?: string;
59
59
  }[];
60
- protocolConfigOutRef?: TransactionInput.TransactionInput;
60
+ protocolConfigOutRef?: string;
61
61
  }
62
62
  interface QuoteSwapRequest {
63
63
  pools: {
64
- poolOutRef: TransactionInput.TransactionInput;
64
+ poolOutRef: string;
65
65
  deltaAmount: bigint;
66
- stakingOutRef?: TransactionInput.TransactionInput;
66
+ stakingOutRef?: string;
67
67
  }[];
68
- protocolConfigOutRef?: TransactionInput.TransactionInput;
68
+ protocolConfigOutRef?: string;
69
69
  }
70
70
 
71
71
  declare class DanogoClmm {
@@ -159,7 +159,7 @@ declare class DanogoClmm {
159
159
  /**
160
160
  * Helper function to handle staking rewards for ADA pools
161
161
  */
162
- private getStakingRewards;
162
+ private getRewardAmount;
163
163
  }
164
164
 
165
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 ut=Object.getOwnPropertyDescriptor;var lt=Object.getOwnPropertyNames;var pt=Object.prototype.hasOwnProperty;var ft=(n,t)=>{for(var e in t)G(n,e,{get:t[e],enumerable:!0})},mt=(n,t,e,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of lt(t))!pt.call(n,o)&&o!==e&&G(n,o,{get:()=>t[o],enumerable:!(r=ut(t,o))||r.enumerable});return n};var dt=n=>mt(G({},"__esModule",{value:!0}),n);var Bt={};ft(Bt,{default:()=>Rt});module.exports=dt(Bt);var z=require("@evolution-sdk/evolution"),Y=require("@evolution-sdk/evolution/ScriptHash"),b=require("@evolution-sdk/evolution/Assets");function C(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 v=(n,t,e,r)=>{try{let o=(i,s)=>{let a=3n,m=C(n?i:r,1),l=C(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=C(BigInt(R.index),1),O=C(BigInt(y),1),g=C(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"),tt=require("@evolution-sdk/evolution/InlineDatum");var L=require("@evolution-sdk/evolution"),x="lovelace",J=432e6,gt="64d111b957e7d7848ffdde5149aa77fa4090a7fa1ad0ac108067900614848501#0",wt="d8b69fc53637bcfadbc4469083f706bc293f4d9d2296646c5ca167bb",At="2cafd7c92f7093e5229af274be83dea660b0590b4174bbed79ba662b44fbd1ee#0",K=18e5,It="2e19cca74e3badcab26aef7574aa1885ba97228a254ca227ba2f79f2b75fd136#0",xt="04041c3c6ba87b33f2c9eb7f7dbeae3b26003c3e199d438bb99932a2",yt="3775af36f485f9c97101ee5b9b360c34f0f8e12186bc9060f358b7fc8ce468a4#0",H=n=>n===1?{poolScriptOutRef:q(gt),poolScriptHash:wt,protocolScriptOutRef:q(At)}:{poolScriptOutRef:q(It),poolScriptHash:xt,protocolScriptOutRef:q(yt)},q=n=>{if(!n)return;let[t,e]=n.split("#");return new L.TransactionInput.TransactionInput({transactionId:L.TransactionHash.fromHex(t),index:BigInt(e)})};var et=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 tt.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 k=require("@evolution-sdk/evolution");function F(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=k.Bytes.fromHex(e),i=new k.PolicyId.PolicyId({hash:o}),s=r?k.Bytes.fromHex(r):new Uint8Array(0),a=new k.AssetName.AssetName({bytes:s});return{policyId:i,assetName:a,unit:n}}var nt=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 it=(n,t)=>{let e=J,r=1647899091e3,o=328;return t!==1&&(e=K),Math.floor((n-r)/e)+o};function bt(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=ht(m,l,[BigInt(e.sqrtLowerPriceNum),BigInt(e.sqrtLowerPriceDen)],[BigInt(e.sqrtUpperPriceNum),BigInt(e.sqrtUpperPriceDen)]),I=rt(p[0]*BigInt(e.sqrtUpperPriceDen),p[1]*BigInt(e.sqrtUpperPriceNum))+m,u=rt(p[0]*BigInt(e.sqrtLowerPriceNum),p[1]*BigInt(e.sqrtLowerPriceDen))+l;return r>0n?ot(s,I,u,l,BigInt(e.lpFeeRate),i):ot(s,u,I,m,BigInt(e.lpFeeRate),i)}var ot=(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]},ht=(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=Pt(s+a),l=t*o+n*i+m,p=2n*(r[0]*e[1]-r[1]*e[0]);return[l,p]};function Pt(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 rt(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 st(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]=bt(i.tokenAAmount,i.tokenBAmount,i.datum,s,i.rewardAmount||0n,e);r.push({poolIndex:o,deltaAmount:s,outputAmount:a,platformFee:m})}return r}var 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.poolOutRef]))),i=H(r),s=e.protocolConfigOutRef??i.protocolScriptOutRef,a=(await t.getUtxosByOutRef([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=F(y.tokenX),w=F(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.stakingOutRef]))[0]);let{rewardAmount:U}=await this.getStakingRewards(t,r,h,R);return{tokenAAmount:g(R),tokenBAmount:g(w),datum:y,rewardAmount:U}})),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([c.poolOutRef]))[0])),i=H(r),s=i.poolScriptOutRef,a=e.protocolConfigOutRef??i.protocolScriptOutRef,m=(await t.getUtxosByOutRef([s]))[0],l=(await t.getUtxosByOutRef([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),E=F(T.tokenX),S=F(T.tokenY),$=P.assets.lovelace,_=W=>W.unit===x?$:(0,b.quantityOf)(P.assets,W.policyId,W.assetName),N=null;f.stakingOutRef&&(N=(await t.getUtxosByOutRef([f.stakingOutRef]))[0]),u.push(N);let{rewardAmount:ct}=await this.getStakingRewards(t,r,N,E);I.push({tokenAAmount:_(E),tokenBAmount:_(S),datum:T,rewardAmount:ct,utxo:P,tokenA:E,tokenB:S})}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 U=it(Date.now(),r),D=st(l,h);g=g.withdraw({stakeCredential:(0,Y.fromScript)(m.scriptRef),amount:0n,redeemer:v(null,o,d,D)});for(let c=0;c<I.length;c++){let f=I[c],P=A.find(N=>N.poolIndex===c);if(!P)continue;let T=P.deltaAmount,E=P.platformFee,S=et({...f.datum,platformFeeX:BigInt(f.datum.platformFeeX)+(T>0?E:0n),platformFeeY:BigInt(f.datum.platformFeeY)+(T<0?E:0n),lastWithdrawEpoch:U,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)),_=(0,b.merge)(f.utxo.assets,$);if(g=g.payToAddress({address:f.utxo.address,assets:_,datum:S}),g=g.collectFrom({inputs:[f.utxo],redeemer:v(f.utxo,o,d,D)}),f.tokenA.unit===x&&U>f.datum.lastWithdrawEpoch&&u[c]){let{stakingRewardAddress:N}=await this.getStakingRewards(t,r,u[c],f.tokenA);N&&(g=g.withdraw({stakeCredential:(0,Y.fromScript)(u[c].scriptRef),amount:f.rewardAmount||0n,redeemer:v(f.utxo,o,d,D)}))}}return 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)}),(await(await(await g.build({scriptDataFormat:"array"})).sign()).submit()).toString()}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=nt(l),w=X(a.datum),O=w.tokenX,g=w.tokenY,h=U=>{if(U===x)return y;let D=U.slice(0,56),Z=U.slice(56),M=R.find(c=>c.policyId===D)?.assets.find(c=>c.name===Z);return M?M.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,Y.fromScript)(r.scriptRef)}),s=z.RewardAccount.toBech32(i);return{rewardAmount:(await t.getDelegation(s)).rewards,stakingRewardAddress:s}}},Rt=Q;
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 rt}from"@evolution-sdk/evolution";import{fromScript as W}from"@evolution-sdk/evolution/ScriptHash";import{fromAsset as it,merge as st,quantityOf as G,fromLovelace as Pt,subtractLovelace as Rt}from"@evolution-sdk/evolution/Assets";function N(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 S=(n,e,t,o)=>{try{let r=(i,s)=>{let a=3n,m=N(n?i:o,1),l=N(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=N(BigInt(P.index),1),R=N(BigInt(y),1),g=N(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 k,CBOR as Y}from"@evolution-sdk/evolution";import{InlineDatum as At}from"@evolution-sdk/evolution/InlineDatum";import{TransactionHash as ut,TransactionInput as lt}from"@evolution-sdk/evolution";var x="lovelace",z=432e6,pt="64d111b957e7d7848ffdde5149aa77fa4090a7fa1ad0ac108067900614848501#0",ft="d8b69fc53637bcfadbc4469083f706bc293f4d9d2296646c5ca167bb",mt="2cafd7c92f7093e5229af274be83dea660b0590b4174bbed79ba662b44fbd1ee#0",Q=18e5,dt="2e19cca74e3badcab26aef7574aa1885ba97228a254ca227ba2f79f2b75fd136#0",gt="04041c3c6ba87b33f2c9eb7f7dbeae3b26003c3e199d438bb99932a2",wt="3775af36f485f9c97101ee5b9b360c34f0f8e12186bc9060f358b7fc8ce468a4#0",v=n=>n===1?{poolScriptOutRef:_(pt),poolScriptHash:ft,protocolScriptOutRef:_(mt)}:{poolScriptOutRef:_(dt),poolScriptHash:gt,protocolScriptOutRef:_(wt)},_=n=>{if(!n)return;let[e,t]=n.split("#");return new lt.TransactionInput({transactionId:ut.fromHex(e),index:BigInt(t)})};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=k.constr(0n,[n.sqrtLowerPriceNum,n.sqrtLowerPriceDen]),r=k.constr(0n,[n.sqrtUpperPriceNum,n.sqrtUpperPriceDen]),i=k.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 At({data:i})};var q=n=>{let e;if(typeof n=="string")e=Y.fromCBORHex(n);else{let i=n.data,s=k.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=k.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 It,Bytes as J,PolicyId as xt}from"@evolution-sdk/evolution";function E(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=J.fromHex(t),i=new xt.PolicyId({hash:r}),s=o?J.fromHex(o):new Uint8Array(0),a=new It.AssetName({bytes:s});return{policyId:i,assetName:a,unit:n}}var K=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};var nt=(n,e)=>{let t=z,o=1647899091e3,r=328;return e!==1&&(t=Q),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=et(p[0]*BigInt(t.sqrtUpperPriceDen),p[1]*BigInt(t.sqrtUpperPriceNum))+m,u=et(p[0]*BigInt(t.sqrtLowerPriceNum),p[1]*BigInt(t.sqrtLowerPriceDen))+l;return o>0n?tt(s,I,u,l,BigInt(t.lpFeeRate),i):tt(s,u,I,m,BigInt(t.lpFeeRate),i)}var tt=(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 et(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 ot(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 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([u.poolOutRef]))),i=v(o),s=t.protocolConfigOutRef??i.protocolScriptOutRef,a=(await e.getUtxosByOutRef([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=q(A.datumOption),P=E(y.tokenX),w=E(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([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([c.poolOutRef]))[0])),i=v(o),s=i.poolScriptOutRef,a=t.protocolConfigOutRef??i.protocolScriptOutRef,m=(await e.getUtxosByOutRef([s]))[0],l=(await e.getUtxosByOutRef([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=q(h.datumOption),U=E(O.tokenX),C=E(O.tokenY),H=h.assets.lovelace,F=X=>X.unit===x?H:G(h.assets,X.policyId,X.assetName),T=null;f.stakingOutRef&&(T=(await e.getUtxosByOutRef([f.stakingOutRef]))[0]),u.push(T);let{rewardAmount:ct}=await this.getStakingRewards(e,o,T,U);I.push({tokenAAmount:F(U),tokenBAmount:F(C),datum:O,rewardAmount:ct,utxo:h,tokenA:U,tokenB:C})}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=nt(Date.now(),o),B=ot(l,b);g=g.withdraw({stakeCredential:W(m.scriptRef),amount:0n,redeemer:S(null,r,d,B)});for(let c=0;c<I.length;c++){let f=I[c],h=A.find(T=>T.poolIndex===c);if(!h)continue;let O=h.deltaAmount,U=h.platformFee,C=Z({...f.datum,platformFeeX:BigInt(f.datum.platformFeeX)+(O>0?U:0n),platformFeeY:BigInt(f.datum.platformFeeY)+(O<0?U: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)),F=st(f.utxo.assets,H);if(g=g.payToAddress({address:f.utxo.address,assets:F,datum:C}),g=g.collectFrom({inputs:[f.utxo],redeemer:S(f.utxo,r,d,B)}),f.tokenA.unit===x&&D>f.datum.lastWithdrawEpoch&&u[c]){let{stakingRewardAddress:T}=await this.getStakingRewards(e,o,u[c],f.tokenA);T&&(g=g.withdraw({stakeCredential:W(u[c].scriptRef),amount:f.rewardAmount||0n,redeemer:S(f.utxo,r,d,B)}))}}return 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)}),(await(await(await g.build({scriptDataFormat:"array"})).sign()).submit()).toString()}getPoolsFromOgmiosTx(e,t,o){let r=v(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=K(l),w=q(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),L=P.find(c=>c.policyId===B)?.assets.find(c=>c.name===V);return L?L.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=it(e.policyId,e.assetName,s,i),t.unit===x)a=Rt(a,r);else{let m=it(t.policyId,t.assetName,-r);a=st(a,m)}return a}async getStakingRewards(e,t,o,r){if(r.unit!==x)return{rewardAmount:0n};let i=new rt.RewardAccount({networkId:t,stakeCredential:W(o.scriptRef)}),s=rt.toBech32(i);return{rewardAmount:(await e.getDelegation(s)).rewards,stakingRewardAddress:s}}},Qt=j;export{Qt as default};
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",
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"