@galacticcouncil/sdk-next 0.7.1-pr199-9b2819e → 0.7.1

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/build/index.cjs CHANGED
@@ -1 +1 @@
1
- "use strict";var ir=Object.create;var ce=Object.defineProperty;var or=Object.getOwnPropertyDescriptor;var lr=Object.getOwnPropertyNames;var cr=Object.getPrototypeOf,ur=Object.prototype.hasOwnProperty;var hn=(u,t)=>()=>(u&&(t=u(u=0)),t);var x=(u,t)=>{for(var e in t)ce(u,e,{get:t[e],enumerable:!0})},le=(u,t,e,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of lr(t))!ur.call(u,r)&&r!==e&&ce(u,r,{get:()=>t[r],enumerable:!(n=or(t,r))||n.enumerable});return u},yt=(u,t,e)=>(le(u,t,"default"),e&&le(e,t,"default")),et=(u,t,e)=>(e=u!=null?ir(cr(u)):{},le(t||!u||!u.__esModule?ce(e,"default",{value:u,enumerable:!0}):e,u)),mr=u=>le(ce({},"__esModule",{value:!0}),u);var Ct={};var Sn=hn(()=>{yt(Ct,require("@polkadot-api/ws-provider/node"))});var kt={};var wn=hn(()=>{yt(kt,require("@polkadot-api/ws-provider/web"))});var Ur={};x(Ur,{aave:()=>Ne,api:()=>Ie,big:()=>h,client:()=>Ge,const:()=>Ee,createSdkContext:()=>Gr,erc20:()=>lt,error:()=>He,evm:()=>We,farm:()=>ze,fmt:()=>O,h160:()=>Lt,json:()=>rt,math:()=>A,pool:()=>en,sor:()=>cn,staking:()=>un,tx:()=>pn,xc:()=>Le});module.exports=mr(Ur);var Ie={};x(Ie,{Papi:()=>k,getWs:()=>pr});var fn=require("@galacticcouncil/descriptors");function Pn(u){switch(u){case!0:case"true":case 1:case"1":case"on":case"yes":return!0;default:return!1}}var k=class{client;api;constructor(t){this.client=t,this.api=this.client.getTypedApi(fn.hydration)}log(t,...e){let n=typeof window>"u"?process.env.GC_DEBUG:window.localStorage.getItem("gc.debug");Pn(n)&&console.log(t,...e)}};var Tn=require("polkadot-api"),xn=require("polkadot-api/polkadot-sdk-compat"),pr=async u=>{let t=typeof u=="string"?u.split(","):u,r=(typeof window>"u"?(await Promise.resolve().then(()=>(Sn(),Ct))).getWsProvider:(await Promise.resolve().then(()=>(wn(),kt))).getWsProvider)(t);return(0,Tn.createClient)((0,xn.withPolkadotSdkCompat)(r))};var Ne={};x(Ne,{AAVE_GAS_LIMIT:()=>Ae,AAVE_LENDING_POOL_ADDRESS:()=>pe,AAVE_POOL_ABI:()=>ve,AAVE_POOL_DATA_PROVIDER:()=>me,AAVE_POOL_DATA_PROVIDER_ABI:()=>ue,AAVE_POOL_PROXY:()=>Oe,AAVE_ROUNDING_THRESHOLD:()=>ra,AAVE_UINT_256_MAX:()=>dr,AaveClient:()=>Dt,AaveUtils:()=>ct});var ve=[{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"reserve",type:"address"},{indexed:!1,internalType:"address",name:"user",type:"address"},{indexed:!0,internalType:"address",name:"onBehalfOf",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"},{indexed:!0,internalType:"uint16",name:"referralCode",type:"uint16"}],name:"Supply",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"reserve",type:"address"},{indexed:!0,internalType:"address",name:"user",type:"address"},{indexed:!0,internalType:"address",name:"to",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"}],name:"Withdraw",type:"event"},{inputs:[{internalType:"address",name:"asset",type:"address"},{internalType:"uint256",name:"amount",type:"uint256"},{internalType:"address",name:"to",type:"address"}],name:"withdraw",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"nonpayable",type:"function"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"reserve",type:"address"},{indexed:!1,internalType:"address",name:"user",type:"address"},{indexed:!0,internalType:"address",name:"onBehalfOf",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"},{indexed:!1,internalType:"enum DataTypes.InterestRateMode",name:"interestRateMode",type:"uint8"},{indexed:!1,internalType:"uint256",name:"borrowRate",type:"uint256"},{indexed:!0,internalType:"uint16",name:"referralCode",type:"uint16"}],name:"Borrow",type:"event"},{inputs:[{internalType:"address",name:"asset",type:"address"},{internalType:"uint256",name:"amount",type:"uint256"},{internalType:"uint256",name:"interestRateMode",type:"uint256"},{internalType:"uint16",name:"referralCode",type:"uint16"},{internalType:"address",name:"onBehalfOf",type:"address"}],name:"borrow",outputs:[],stateMutability:"nonpayable",type:"function"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"reserve",type:"address"},{indexed:!0,internalType:"address",name:"user",type:"address"},{indexed:!0,internalType:"address",name:"repayer",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"},{indexed:!1,internalType:"bool",name:"useATokens",type:"bool"}],name:"Repay",type:"event"},{inputs:[{internalType:"address",name:"user",type:"address"}],name:"getUserAccountData",outputs:[{internalType:"uint256",name:"totalCollateralBase",type:"uint256"},{internalType:"uint256",name:"totalDebtBase",type:"uint256"},{internalType:"uint256",name:"availableBorrowsBase",type:"uint256"},{internalType:"uint256",name:"currentLiquidationThreshold",type:"uint256"},{internalType:"uint256",name:"ltv",type:"uint256"},{internalType:"uint256",name:"healthFactor",type:"uint256"}],stateMutability:"view",type:"function"}];var ue=[{inputs:[{internalType:"contract IEACAggregatorProxy",name:"_networkBaseTokenPriceInUsdProxyAggregator",type:"address"},{internalType:"contract IEACAggregatorProxy",name:"_marketReferenceCurrencyPriceInUsdProxyAggregator",type:"address"}],stateMutability:"nonpayable",type:"constructor"},{inputs:[],name:"ETH_CURRENCY_UNIT",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[],name:"MKR_ADDRESS",outputs:[{internalType:"address",name:"",type:"address"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"bytes32",name:"_bytes32",type:"bytes32"}],name:"bytes32ToString",outputs:[{internalType:"string",name:"",type:"string"}],stateMutability:"pure",type:"function"},{inputs:[{internalType:"contract IPoolAddressesProvider",name:"provider",type:"address"}],name:"getReservesData",outputs:[{components:[{internalType:"address",name:"underlyingAsset",type:"address"},{internalType:"string",name:"name",type:"string"},{internalType:"string",name:"symbol",type:"string"},{internalType:"uint256",name:"decimals",type:"uint256"},{internalType:"uint256",name:"baseLTVasCollateral",type:"uint256"},{internalType:"uint256",name:"reserveLiquidationThreshold",type:"uint256"},{internalType:"uint256",name:"reserveLiquidationBonus",type:"uint256"},{internalType:"uint256",name:"reserveFactor",type:"uint256"},{internalType:"bool",name:"usageAsCollateralEnabled",type:"bool"},{internalType:"bool",name:"borrowingEnabled",type:"bool"},{internalType:"bool",name:"stableBorrowRateEnabled",type:"bool"},{internalType:"bool",name:"isActive",type:"bool"},{internalType:"bool",name:"isFrozen",type:"bool"},{internalType:"uint128",name:"liquidityIndex",type:"uint128"},{internalType:"uint128",name:"variableBorrowIndex",type:"uint128"},{internalType:"uint128",name:"liquidityRate",type:"uint128"},{internalType:"uint128",name:"variableBorrowRate",type:"uint128"},{internalType:"uint128",name:"stableBorrowRate",type:"uint128"},{internalType:"uint40",name:"lastUpdateTimestamp",type:"uint40"},{internalType:"address",name:"aTokenAddress",type:"address"},{internalType:"address",name:"stableDebtTokenAddress",type:"address"},{internalType:"address",name:"variableDebtTokenAddress",type:"address"},{internalType:"address",name:"interestRateStrategyAddress",type:"address"},{internalType:"uint256",name:"availableLiquidity",type:"uint256"},{internalType:"uint256",name:"totalPrincipalStableDebt",type:"uint256"},{internalType:"uint256",name:"averageStableRate",type:"uint256"},{internalType:"uint256",name:"stableDebtLastUpdateTimestamp",type:"uint256"},{internalType:"uint256",name:"totalScaledVariableDebt",type:"uint256"},{internalType:"uint256",name:"priceInMarketReferenceCurrency",type:"uint256"},{internalType:"address",name:"priceOracle",type:"address"},{internalType:"uint256",name:"variableRateSlope1",type:"uint256"},{internalType:"uint256",name:"variableRateSlope2",type:"uint256"},{internalType:"uint256",name:"stableRateSlope1",type:"uint256"},{internalType:"uint256",name:"stableRateSlope2",type:"uint256"},{internalType:"uint256",name:"baseStableBorrowRate",type:"uint256"},{internalType:"uint256",name:"baseVariableBorrowRate",type:"uint256"},{internalType:"uint256",name:"optimalUsageRatio",type:"uint256"},{internalType:"bool",name:"isPaused",type:"bool"},{internalType:"bool",name:"isSiloedBorrowing",type:"bool"},{internalType:"uint128",name:"accruedToTreasury",type:"uint128"},{internalType:"uint128",name:"unbacked",type:"uint128"},{internalType:"uint128",name:"isolationModeTotalDebt",type:"uint128"},{internalType:"bool",name:"flashLoanEnabled",type:"bool"},{internalType:"uint256",name:"debtCeiling",type:"uint256"},{internalType:"uint256",name:"debtCeilingDecimals",type:"uint256"},{internalType:"uint8",name:"eModeCategoryId",type:"uint8"},{internalType:"uint256",name:"borrowCap",type:"uint256"},{internalType:"uint256",name:"supplyCap",type:"uint256"},{internalType:"uint16",name:"eModeLtv",type:"uint16"},{internalType:"uint16",name:"eModeLiquidationThreshold",type:"uint16"},{internalType:"uint16",name:"eModeLiquidationBonus",type:"uint16"},{internalType:"address",name:"eModePriceSource",type:"address"},{internalType:"string",name:"eModeLabel",type:"string"},{internalType:"bool",name:"borrowableInIsolation",type:"bool"}],internalType:"struct IUiPoolDataProviderV3.AggregatedReserveData[]",name:"",type:"tuple[]"},{components:[{internalType:"uint256",name:"marketReferenceCurrencyUnit",type:"uint256"},{internalType:"int256",name:"marketReferenceCurrencyPriceInUsd",type:"int256"},{internalType:"int256",name:"networkBaseTokenPriceInUsd",type:"int256"},{internalType:"uint8",name:"networkBaseTokenPriceDecimals",type:"uint8"}],internalType:"struct IUiPoolDataProviderV3.BaseCurrencyInfo",name:"",type:"tuple"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"contract IPoolAddressesProvider",name:"provider",type:"address"}],name:"getReservesList",outputs:[{internalType:"address[]",name:"",type:"address[]"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"contract IPoolAddressesProvider",name:"provider",type:"address"},{internalType:"address",name:"user",type:"address"}],name:"getUserReservesData",outputs:[{components:[{internalType:"address",name:"underlyingAsset",type:"address"},{internalType:"uint256",name:"scaledATokenBalance",type:"uint256"},{internalType:"bool",name:"usageAsCollateralEnabledOnUser",type:"bool"},{internalType:"uint256",name:"stableBorrowRate",type:"uint256"},{internalType:"uint256",name:"scaledVariableDebt",type:"uint256"},{internalType:"uint256",name:"principalStableDebt",type:"uint256"},{internalType:"uint256",name:"stableBorrowLastUpdateTimestamp",type:"uint256"}],internalType:"struct IUiPoolDataProviderV3.UserReserveData[]",name:"",type:"tuple[]"},{internalType:"uint8",name:"",type:"uint8"}],stateMutability:"view",type:"function"},{inputs:[],name:"marketReferenceCurrencyPriceInUsdProxyAggregator",outputs:[{internalType:"contract IEACAggregatorProxy",name:"",type:"address"}],stateMutability:"view",type:"function"},{inputs:[],name:"networkBaseTokenPriceInUsdProxyAggregator",outputs:[{internalType:"contract IEACAggregatorProxy",name:"",type:"address"}],stateMutability:"view",type:"function"}];var Oe="0x1b02E051683b5cfaC5929C25E84adb26ECf87B38",me="0x112b087b60C1a166130d59266363C45F8aa99db0",pe="0xf3Ba4D1b50f78301BDD7EAEa9B67822A15FCA691",Ae=1000000n,ra=5,dr=BigInt("0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");var Dt=class{client;constructor(t){this.client=t.getWsProvider()}async getReservesData(){return await this.client.readContract({abi:ue,address:me,args:[pe],functionName:"getReservesData"})}async getUserReservesData(t){return await this.client.readContract({abi:ue,address:me,args:[pe,t],functionName:"getUserReservesData"})}async getUserAccountData(t){return await this.client.readContract({abi:ve,address:Oe,args:[t],functionName:"getUserAccountData"})}};var h={};x(h,{asBigInt:()=>yr,toBigInt:()=>br,toDecimal:()=>gr});var nt=et(require("big.js"));nt.default.NE=-18;function gr(u,t,e=6,n){let r=(0,nt.default)(u.toString()),a=(0,nt.default)(10).pow(t);return r.div(a).round(e,n).toString()}function br(u,t){let e=(0,nt.default)(10).pow(t),r=(0,nt.default)(u).mul(e).toFixed(0,nt.default.roundDown);return BigInt(r)}function yr(u){return BigInt(u.round(0,nt.default.roundDown).toFixed(0))}var lt={};x(lt,{ERC20:()=>Be});var Be=class{static fromAssetId(t){let e=Buffer.alloc(20,0);return e[15]=1,e.writeUInt32BE(t,16),"0x"+e.toString("hex")}static toAssetId(t){let e=Buffer.from(t.replace("0x",""),"hex");return e.length!==20||!this.isAssetAddress(t)?null:e.readUInt32BE(16)}static isAssetAddress(t){let e=Buffer.from("0000000000000000000000000000000100000000","hex"),n=Buffer.from(t.replace("0x",""),"hex");return n.length!==20?!1:n.subarray(0,16).equals(e.subarray(0,16))}};var O={};x(O,{FeeUtils:()=>Ce,shiftNeg:()=>fr});var In=et(require("big.js"));var Ee={};x(Ee,{HUB_ASSET_ID:()=>Fe,HYDRATION_OMNIPOOL_ADDRESS:()=>Pr,HYDRATION_PARACHAIN_ID:()=>hr,HYDRATION_SS58_PREFIX:()=>q,PERBILL_DENOMINATOR:()=>_e,PERMILL_DENOMINATOR:()=>Mt,RUNTIME_DECIMALS:()=>_,SYSTEM_ASSET_DECIMALS:()=>Re,SYSTEM_ASSET_ID:()=>L,TRADEABLE_DEFAULT:()=>ht});var _=18,Mt=1e6,_e=1e9,L=0,Re=12,hr=2034,q=63,Pr="7L53bUTBbfuj14UpdCNPwmgzzHSsrsTWBHX5pys32mVWM3C1",Fe=1,ht=15;var Ce=class u{static toPct(t){let[e,n]=t;return u.safeDivide(e*100,n)}static toRaw(t){let[e,n]=t;return u.safeDivide(e,n)}static fromPermill(t){return[t,1e6]}static fromPerbill(t){return[t,1e9]}static fromRate(t,e){return[t,e]}static safeDivide(t,e,n=12){let r=10**n;return Math.round(t*r/e)/r}static safeRound(t){return parseFloat(t.toPrecision(15))}};function fr(u,t){let e=(0,In.default)(typeof u=="bigint"?u.toString():u);return t===0?e.toString():e.div(Math.pow(10,t)).toString()}var Lt={};x(Lt,{H160:()=>Me,isEvmAccount:()=>vn,isEvmAddress:()=>On,isSs58Address:()=>An});var Pt=require("polkadot-api"),ke=require("@polkadot-api/utils"),J=require("buffer");var De="ETH\0";function vn(u){if(!u)return!1;try{let t=(0,Pt.AccountId)().enc(u),e=J.Buffer.from(De);return J.Buffer.from(t.subarray(0,e.length)).equals(e)}catch{return!1}}function On(u){return!!/^0x[a-fA-F0-9]{40}$/.test(u)}function An(u){try{return(0,Pt.AccountId)(63).enc(u),!0}catch{return!1}}var Me=class u{static toAccount=t=>{let e=J.Buffer.from(t.slice(2),"hex"),n=J.Buffer.from(De),r=Uint8Array.from(J.Buffer.concat([n,e,J.Buffer.alloc(8)])),a=(0,ke.toHex)(r);return(0,Pt.AccountId)(63).dec(a)};static fromAccount=t=>{let e=(0,Pt.AccountId)().enc(t),n=J.Buffer.from(De),r=e.slice(n.length,-8);return"0x"+J.Buffer.from(r).toString("hex")};static fromSS58=t=>{let n=(0,Pt.AccountId)().enc(t).slice(0,20);return(0,ke.toHex)(n)};static fromAny=t=>{if(On(t))return t;if(vn(t))return u.fromAccount(t);if(An(t))return u.fromSS58(t);throw new Error("Unknown address type")}};var rt={};x(rt,{findNestedKey:()=>Sr,findNestedObj:()=>wr,jsonFormatter:()=>Tr});var Sr=(u,t)=>{let e=[];return JSON.stringify(u,(n,r)=>(r&&r[t]&&e.push(r),r)),e[0]},wr=(u,t,e)=>{let n;return JSON.stringify(u,(r,a)=>(a&&a[t]===e&&(n=a),a)),n},Tr=(u,t)=>typeof t=="bigint"?t.toString():t;var A={};x(A,{calculateBuyFee:()=>Or,calculateDiffToAvg:()=>xr,calculateDiffToRef:()=>Ir,calculateSellFee:()=>vr,getFraction:()=>Ar});var K=et(require("big.js"));function xr(u,t){let e=(0,K.default)(u.toString()),n=(0,K.default)(t.toString());return e.minus(n).abs().div(e.plus(n).div(2)).mul(100).round(2).toNumber()}function Ir(u,t){if(t===0n)return 0;let e=(0,K.default)(u.toString()),n=(0,K.default)(t.toString());return e.minus(n).div(n).mul(100).round(2).toNumber()}function vr(u,t){let e=(0,K.default)(u.toString()),n=(0,K.default)(t.toString());return(0,K.default)(1).minus(n.div(e)).mul(100).round(2).toNumber()}function Or(u,t){let e=(0,K.default)(u.toString());return(0,K.default)(t.toString()).div(e).minus(1).mul(100).round(2).toNumber()}function Ar(u,t,e=2){(t<.01||t>100)&&new Error("Supported range is from 0.01% - 100%");let n=Math.pow(10,e),r=BigInt(t*n);return u*r/BigInt(100*n)}var Le={};x(Le,{convertToId:()=>Br});var Bn=require("buffer");function Br(u){let e=Bn.Buffer.from(u.replace("0x",""),"hex").subarray(16);return e.readUIntBE(0,e.length)}var{ERC20:de}=lt,{H160:qe}=Lt,_r=1.01,Rr=99999,Fr=10n**27n,Er=10n**18n,ct=class{client;constructor(t){this.client=new Dt(t)}async getSummary(t){let e=qe.fromAny(t),[n,r,a]=await Promise.all([this.client.getReservesData(),this.client.getUserReservesData(e),this.client.getUserAccountData(e)]),[i]=n,[s,o]=r,[l,c,m,d,p,g]=a,y=h.toDecimal(g,18),b=[];for(let P of s){let f=P.underlyingAsset.toLowerCase(),S=i.find(({underlyingAsset:Ft})=>Ft.toLowerCase()===f);if(!S)throw new Error("Missing pool reserve for "+f);let v=P.scaledATokenBalance,N=S.liquidityIndex,G=S.priceInMarketReferenceCurrency,D=v*N/Fr,ot=Number(o===S.eModeCategoryId?S.eModeLiquidationThreshold:S.reserveLiquidationThreshold)/1e4,W=S.usageAsCollateralEnabled&&P.usageAsCollateralEnabledOnUser&&P.scaledATokenBalance>0n,tt=de.toAssetId(f);b.push({aTokenBalance:D,decimals:Number(S.decimals),isCollateral:W,priceInRef:G,reserveId:tt,reserveAsset:f,reserveLiquidationThreshold:ot})}return{healthFactor:Number(y),totalCollateral:l,totalDebt:c,reserves:b}}async hasBorrowPositions(t){let e=qe.fromAny(t),n=await this.client.getUserAccountData(e),[r,a]=n;return a>0n}async getHealthFactor(t){let e=qe.fromAny(t),n=await this.client.getUserAccountData(e),[r,a,i,s,o,l]=n,c=h.toDecimal(l,18);return Number(c)}async getHealthFactorAfterWithdraw(t,e,n){let{totalCollateral:r,totalDebt:a,reserves:i}=await this.getSummary(t),s=de.fromAssetId(e),o=i.find(b=>b.reserveAsset===s);if(!o)throw new Error("Missing reserve ctx for "+s);let{decimals:l,isCollateral:c,priceInRef:m,reserveLiquidationThreshold:d}=o,p=h.toBigInt(n,l),g=c?p*m/10n**BigInt(l):0n,y=r-g;return y<=0n?0:this.calculateHealthFactor(y,d,a)}async getHealthFactorAfterSupply(t,e,n){let{totalCollateral:r,totalDebt:a,reserves:i}=await this.getSummary(t),s=de.fromAssetId(e),o=i.find(y=>y.reserveAsset===s);if(!o)throw new Error("Missing reserve ctx for "+s);let{decimals:l,priceInRef:c,reserveLiquidationThreshold:m}=o,p=h.toBigInt(n,l)*c/10n**BigInt(l),g=r+p;return g<=0n?0:this.calculateHealthFactor(g,m,a)}async getMaxWithdraw(t,e){let{totalCollateral:n,totalDebt:r,reserves:a}=await this.getSummary(t),i=de.fromAssetId(e),s=a.find(o=>o.reserveAsset===i);if(!s)throw new Error("Missing reserve ctx for "+i);return this.calculateWithdrawMax(s,n,r)}async getMaxWithdrawAll(t){let{totalCollateral:e,totalDebt:n,reserves:r}=await this.getSummary(t),a={};for(let i of r){let s=this.calculateWithdrawMax(i,e,n);i.reserveId&&(a[i.reserveId]=s)}return a}calculateHealthFactor(t,e,n){if(n===0n)return Rr;let r=10n**6n,a=h.toBigInt(e,18),i=t*a*r,s=n*Er,o=i/s;return Number(o)/1e6}calculateRequiredCollateral(t,e,n){let r=h.toBigInt(t,18),a=h.toBigInt(e,18);return(r*n+a-1n)/a}calculateWithdrawMax(t,e,n){let{aTokenBalance:r,decimals:a,priceInRef:i,reserveLiquidationThreshold:s}=t,o=this.calculateRequiredCollateral(_r,s,n),l=e-o;if(l<=0n)return{amount:0n,decimals:a};let c=l*10n**BigInt(a)/i;return{amount:r<c?r:c,decimals:a}}};var Ge={};x(Ge,{AssetClient:()=>ft,BalanceClient:()=>z,ChainParams:()=>St});var ft=class extends k{SUPPORTED_TYPES=["StableSwap","Bond","Token","External","Erc20"];constructor(t){super(t)}async queryShares(){let e=await this.api.query.Stableswap.Pools.getEntries();return new Map(e.map(({keyArgs:n,value:r})=>{let[a]=n;return[a,r]}))}async queryBonds(){let e=await this.api.query.Bonds.Bonds.getEntries();return new Map(e.map(({keyArgs:n,value:r})=>{let[a]=n;return[a,r]}))}async queryAssets(){let e=await this.api.query.AssetRegistry.Assets.getEntries();return new Map(e.filter(({value:n})=>{let{asset_type:r}=n;return this.SUPPORTED_TYPES.includes(r.type)}).map(({keyArgs:n,value:r})=>{let[a]=n;return[a,r]}))}async queryAssetLocations(){let e=await this.api.query.AssetRegistry.AssetLocations.getEntries();return new Map(e.map(({keyArgs:n,value:r})=>{let[a]=n;return[a,r]}))}async mapToken(t,e,n,r){let{name:a,asset_type:i,is_sufficient:s,existential_deposit:o}=e,{symbol:l,decimals:c}=n.get(t)??{};return{id:t,name:a?.asText(),symbol:l,decimals:c,icon:l,type:i.type,isSufficient:s,location:r,existentialDeposit:o}}async mapBond(t,e,n,r){let[a,i]=r,{asset_type:s,is_sufficient:o,existential_deposit:l}=e,{symbol:c,decimals:m}=await this.mapToken(a,e,n),d=Number(i),p=new Intl.DateTimeFormat("en-GB"),g=[c,"Bond",p.format(d)].join(" ");return{id:t,name:g,symbol:c+"b",decimals:m,icon:c,type:s.type,isSufficient:o,existentialDeposit:l,underlyingAssetId:a,maturity:d}}async mapShares(t,e,n,r){let{assets:a}=r,{name:i,symbol:s,asset_type:o,is_sufficient:l,existential_deposit:c}=e,m=await Promise.all(a.map(async g=>{let{symbol:y}=await this.mapToken(g,e,n);return[g,y]})),d=Object.fromEntries(m),p=Object.values(d);return{id:t,name:p.join(", "),symbol:s?.asText()||i?.asText(),decimals:18,icon:p.join("/"),type:o.type,isSufficient:l,existentialDeposit:c,meta:d}}async mapExternal(t,e,n,r){let a=await this.mapToken(t,e,new Map,r),i=n?.find(s=>s.internalId===a.id);return i?{...a,decimals:i.decimals,name:i.name,symbol:i.symbol,icon:i.symbol,isWhiteListed:i.isWhiteListed}:a}parseMetadata(t){return new Map(Array.from(t,([e,n])=>[e,{symbol:n.symbol?.asText(),decimals:n.decimals}]))}async getOnChainAssets(t,e){let[n,r,a,i]=await Promise.all([this.queryAssets(),this.queryAssetLocations(),this.queryShares(),this.queryBonds()]),s=this.parseMetadata(n),o=[];for(let[l,c]of Array.from(n)){let m=r.get(l),{asset_type:d}=c,p;switch(d.type){case"Bond":let g=i.get(l);p=await this.mapBond(l,c,s,g);break;case"StableSwap":let y=a.get(l);p=await this.mapShares(l,c,s,y);break;case"External":p=await this.mapExternal(l,c,e,m);break;default:p=await this.mapToken(l,c,s,m)}o.push(p)}return t?o:o.filter(l=>this.isValidAsset(l))}isValidAsset(t){let e=Math.sign(t.decimals);return!!t.symbol&&(e===0||e===1)}};var T=require("rxjs");var z=class extends k{constructor(t){super(t)}async getBalance(t,e){return e===0?this.getSystemBalance(t):this.getTokenBalanceData(t,e)}async getSystemBalance(t){let e=this.api.query.System.Account,{data:n}=await e.getValue(t);return this.calculateBalance(n)}async getTokenBalance(t,e){let r=await this.api.query.Tokens.Accounts.getValue(t,e);return this.calculateBalance(r)}calculateBalance(t){let e=t.free>=t.frozen?t.free-t.frozen:0n,n=t.free+t.reserved;return{free:t.free,reserved:t.reserved,frozen:t.frozen,total:n,transferable:e}}async getErc20Balance(t,e){return this.getTokenBalanceData(t,e)}subscribeBalance(t){let e=this.subscribeSystemBalance(t),n=this.subscribeTokensBalance(t),r=this.subscribeErc20Balance(t);return(0,T.combineLatest)([e,n,r]).pipe((0,T.debounceTime)(250),(0,T.map)(a=>a.flat()),(0,T.startWith)([]),(0,T.bufferCount)(2,1),(0,T.map)(([a,i],s)=>{if(s===0)return i;let o=a.reduce((c,m)=>(c.set(m.id,m.balance),c),new Map);return i.filter(c=>!_n(c.balance,o.get(c.id)))}))}subscribeSystemBalance(t){return this.api.query.System.Account.watchValue(t,"best").pipe((0,T.map)(n=>({id:0,balance:this.calculateBalance(n.data)})))}subscribeTokenBalance(t,e){return this.api.query.Tokens.Accounts.watchValue(t,e,"best").pipe((0,T.map)(r=>({id:e,balance:r})))}subscribeTokensBalance(t){return this.api.query.Tokens.Accounts.watchEntries(t,{at:"best"}).pipe((0,T.distinctUntilChanged)((n,r)=>!r.deltas),(0,T.map)(({deltas:n})=>{let r=[];return n?.deleted.forEach(a=>{let[i,s]=a.args;r.push({id:s,balance:this.calculateBalance({free:0n,reserved:0n,frozen:0n})})}),n?.upserted.forEach(a=>{let[i,s]=a.args;r.push({id:s,balance:this.calculateBalance(a.value)})}),r}))}subscribeErc20Balance(t,e){let n=new T.Subject,r=n.pipe((0,T.shareReplay)(1)),a=async()=>(await this.api.query.AssetRegistry.Assets.getEntries()).filter(({value:l})=>{let{asset_type:c}=l;return c.type==="Erc20"}).map(({keyArgs:l})=>{let[c]=l;return c}),i=async()=>{let o=e||await a(),l=async()=>{let d=(await Promise.all(o.map(async p=>{let g=await this.getTokenBalanceData(t,p);return[p,g]}))).map(([p,g])=>({id:p,balance:g}));n.next(d)};await l();let c=this.api.query.System.Number.watchValue("best").subscribe(l);return()=>c.unsubscribe()},s;return i().then(o=>s=o),r.pipe((0,T.finalize)(()=>s?.()),(0,T.pairwise)(),(0,T.map)(([o,l],c)=>{if(c===0)return l;let m=o.reduce((p,g)=>(p.set(g.id,g.balance),p),new Map);return l.filter(p=>!_n(p.balance,m.get(p.id)))}),(0,T.distinctUntilChanged)((o,l)=>l.length===0))}async getTokenBalanceData(t,e){let n=await this.api.apis.CurrenciesApi.account(e,t);return this.calculateBalance(n)}},_n=(u,t)=>u!==void 0&&t!==void 0&&u.transferable===t.transferable&&u.total===t.total;var St=class extends k{_minOrderBudget;_blockTime;constructor(t){super(t)}async getBlockTime(){if(this._blockTime===void 0){let t=await this.api.constants.Aura.SlotDuration();this._blockTime=Number(t)}return this._blockTime}async getMinOrderBudget(){return this._minOrderBudget===void 0&&(this._minOrderBudget=await this.api.constants.DCA.MinBudgetInNativeCurrency()),this._minOrderBudget}};var He={};x(He,{AssetNotFound:()=>Ue,PoolNotFound:()=>qt,RouteNotFound:()=>Nt});var Ue=class extends Error{constructor(t){super(),this.message=`${t} not found`,this.name="AssetNotFound"}},qt=class extends Error{constructor(t){super(),this.message=`${t} pool invalid`,this.name="PoolNotFound"}},Nt=class extends Error{constructor(t,e){super(),this.message=`Route from ${t} to ${e} not found in current configuration`,this.name="RouteNotFound"}};var We={};x(We,{EvmClient:()=>Gt,createChain:()=>Ve});var Rn=require("viem"),Cr=["https://hydration-rpc.n.dwellir.com","https://hydration.dotters.network","https://rpc.helikon.io/hydradx","https://hydration.ibp.network","https://rpc.cay.hydration.cloud","https://rpc.parm.hydration.cloud","https://rpc.roach.hydration.cloud","https://rpc.zipp.hydration.cloud","https://rpc.sin.hydration.cloud","https://rpc.coke.hydration.cloud"],Ve=()=>(0,Rn.defineChain)({id:222222,name:"Hydration",network:"hydration",nativeCurrency:{decimals:18,name:"WETH",symbol:"WETH"},rpcUrls:{default:{http:Cr}},blockExplorers:{default:{name:"Hydration Explorer",url:"https://hydration.subscan.io"}},testnet:!1});var j=require("viem");var Gt=class{client;chain;constructor(t){this.client=t,this.chain=Ve()}get chainId(){return this.chain.id}get chainCurrency(){return this.chain.nativeCurrency.symbol}get chainDecimals(){return this.chain.nativeCurrency.decimals}getProvider(){return(0,j.createPublicClient)({chain:this.chain,transport:(0,j.http)()})}getWsProvider(){return(0,j.createPublicClient)({transport:(0,j.custom)({request:({method:t,params:e})=>this.client._request(t,e||[])})})}getSigner(t){return(0,j.createWalletClient)({account:t,chain:this.chain,transport:(0,j.custom)(window.ethereum)})}};var ze={};x(ze,{LiquidityMiningApi:()=>Ut,LiquidityMiningClient:()=>Ht});var Cn=require("polkadot-api"),M=et(require("big.js")),Ke=require("@galacticcouncil/math-liquidity-mining");var ge=class{result=new Map;getKey(t,e){return[e,t.toString()].join(",")}constructor(t,e){for(let n=0;n<t.length;++n){let[r,a]=t[n];this.result.set(this.getKey(a,r),e[n].free)}}freeBalance(t,e){return this.result.get(this.getKey(t,e))??0n}transfer(t,e,n,r){let a=this.getKey(t,e),i=this.getKey(t,n),s=this.result.get(a)??0n,o=this.result.get(i)??0n;if(s<r)throw new Error("Attempting to transfer more than is present");this.result.set(a,s+r),this.result.set(i,o+r)}};var at=et(require("big.js")),Y=require("@galacticcouncil/math-liquidity-mining");var Ye=et(require("big.js")),Xe=(0,Ye.default)(10).pow(18),Fn=BigInt((0,Ye.default)(1).pow(18).toString()),En=6e3;var kr="1000000000000000000",be=class{constructor(t,e,n){this.getAccount=t;this.getAsset=e;this.multiCurrency=n}async syncGlobalFarm(t,e,n){if(t.state.type!=="Active"||t.updated_at===e)return null;if(t.total_shares_z===0n)return t;let r=await this.getAsset(t.reward_currency),a=e-t.updated_at,i=this.getAccount(t.id),s=r?.existential_deposit;if(!s)throw new Error("Missing reward currency asset list");let o=this.multiCurrency.freeBalance(t.reward_currency,i),l=(0,at.default)(s.toString()),c=(0,at.default)(o.toString()).minus(l.lt(o.toString())?s.toString():o.toString()),m=(0,at.default)((0,Y.calculate_global_farm_rewards)(t.total_shares_z.toString(),n.toString(),(0,at.default)(t.yield_per_period.toString()).mul(Xe).round(0,at.default.roundDown).toFixed(),t.max_reward_per_period.toString(),a.toFixed()));if(c.lt(m)&&(m=c),m.eq(0))return t;let d=this.getAccount(0);return this.multiCurrency.transfer(t.reward_currency,i,d,BigInt(m.toFixed())),{...t,accumulated_rpz:BigInt((0,Y.calculate_accumulated_rps)(t.accumulated_rpz.toString(),t.total_shares_z.toString(),m.toFixed()))}}syncYieldFarm(t,e,n){if(t.state.type!=="Active"||t.updated_at===n)return null;if(t.total_valued_shares===0n)return{...t,updated_at:n};let r=(0,Y.calculate_yield_farm_delta_rpvs)(t.accumulated_rpz.toString(),e.accumulated_rpz.toString(),t.multiplier.toString(),t.total_valued_shares.toString());return{...t,accumulated_rpvs:t.accumulated_rpvs+BigInt(r),updated_at:n}}getLoyaltyMultiplier(t,e){let n=(0,at.default)(1).mul(Xe).round(0,at.default.roundDown).toString();if(!e)return n;let{initial_reward_percentage:r,scale_coef:a}=e;return(0,Y.calculate_loyalty_multiplier)(t.toFixed(),r.toString(),a.toFixed())}async claimRewards(t,e,n,r,a){if(e.state.type==="Terminated")return null;let i=Math.floor(r/t.blocks_per_period);if(n.updated_at===i)return null;let s=await this.syncGlobalFarm(t,i,a);if(!s)return null;let o=this.syncYieldFarm(e,s,i);if(!o)return null;let l=o.total_stopped-n.stopped_at_creation,c=o.updated_at-n.entered_at-l,m=this.getLoyaltyMultiplier(c,o.loyalty_curve),d=BigInt((0,Y.calculate_user_reward)(n.accumulated_rpvs.toString(),n.valued_shares.toString(),n.accumulated_claimed_rewards.toString(),o.accumulated_rpvs.toString(),m)),p=BigInt((0,Y.calculate_user_reward)(n.accumulated_rpvs.toString(),n.valued_shares.toString(),n.accumulated_claimed_rewards.toString(),o.accumulated_rpvs.toString(),kr));return{reward:d,maxReward:p,assetId:s.reward_currency}}};var Dr=(0,M.default)(365.2425).times(24).times(60).times(60),Ut=class{client;balanceClient;options;constructor(t,e,n={}){this.client=t,this.balanceClient=e,this.options=Object.freeze({blockTime:n.blockTime??En})}get blockTime(){return this.options.blockTime}async getOraclePrice(t,e){let n=[t,e].sort((a,i)=>a-i);if(t===e)return Fn;let r=await this.client.getOraclePrice(n);if(r){let{n:a,d:i}=r[0].price,s;return t<e?s=(0,Ke.fixed_from_rational)(a.toString(),i.toString()):s=(0,Ke.fixed_from_rational)(i.toString(),a.toString()),BigInt(s)}}getFarmAddress=(t,e)=>{let n=Buffer.from("modl","utf-8"),r=Buffer.from(e?"78796b4c4d704944":"4f6d6e6957684c4d","hex"),a=Buffer.from([t]),i=Buffer.concat([n,r,a]),o="0x"+Buffer.concat([i,Buffer.alloc(32-i.length)]).toString("hex");return(0,Cn.AccountId)(63).dec(o)};getGlobalRewardPerPeriod(t,e,n,r){let a=(0,M.default)(r).times(t.toString()).times(e.toString()).div(18);return a.gte(n.toString())?n.toString():a.toString()}getPoolYieldPerPeriod(t,e,n,r){let a=(0,M.default)(t.toString()).times(e),i=(0,M.default)(n.toString()).times(r);return a.div(i.toString()).toString()}farmData(t,e,n){let{yieldFarm:r,globalFarm:a,priceAdjustment:i,balance:s,id:o}=t,{multiplier:l,loyalty_curve:c}=r,{blocks_per_period:m,yield_per_period:d,total_shares_z:p,max_reward_per_period:g,pending_rewards:y,accumulated_paid_rewards:b,planned_yielding_periods:P,updated_at:f,incentivized_asset:S,reward_currency:v,price_adjustment:N}=a,G=O.shiftNeg(i??N,18),D=O.shiftNeg(l,18),V=O.shiftNeg(c?.initial_reward_percentage??0,18),ot=Dr.div((0,M.default)(this.blockTime).div(1e3).times(m)).toString(),W;if(p<=0)W=(0,M.default)(D).times(d.toString()).times(ot).toString();else{let ar=this.getGlobalRewardPerPeriod(p,d,g,G),sr=this.getPoolYieldPerPeriod(ar,D,p,G);W=(0,M.default)(sr).times(ot).toString()}let tt=y+b,Ft=g*BigInt(P),Et=s.transferable+tt,oe=Et-tt,dn=(0,M.default)(oe.toString()).div(g.toString()),gn=(0,M.default)(e).div(m.toString()).toString(),bn=(p>=0?dn.plus(f):dn.plus(gn)).toString(),er=(0,M.default)(bn).times(m).toString(),nr=(0,M.default)(p.toString()).div((0,M.default)(g.toString()).div(d.toString())).div(Math.pow(10,18)).times(100).times(G).toFixed(2),yn=(0,M.default)(tt.toString()).div(Et.toString()).gte(.999);W=yn?"0":(0,M.default)(W).div(n?2:1).times(100).toString();let rr=V?(0,M.default)(W).times(V).toString():void 0;return{apr:W,minApr:rr,isDistributed:yn,estimatedEndPeriod:bn,estimatedEndBlock:er,maxRewards:Ft,incentivizedAsset:S,rewardCurrency:v,loyaltyCurve:c,currentPeriod:gn,potMaxRewards:Et,fullness:nr,yieldFarmId:r.id,globalFarmId:a.id,poolId:o,distributedRewards:tt,plannedYieldingPeriods:P}}async getAllOmnipoolFarms(){let e=(await this.client.getAllOmnipooFarms()).reduce((r,a)=>r.includes(a.keyArgs[0].toString())?r:[...r,a.keyArgs[0].toString()],[]),n=await Promise.all(e.map(async r=>{let a=await this.getOmnipoolFarms(r);if(a)return[r,a]}));return Object.fromEntries(n.filter(r=>!!r))}async getOmnipoolFarms(t){let e=await this.client.getOmnipooFarms(Number(t)),n=await this.client.getRelayBlockNumber(),r=await Promise.all(e.map(async({keyArgs:a,value:i})=>{let[,s]=a,o=i,l=await this.client.getOmnipoolGlobalFarm(s),c=await this.client.getOmnipoolYieldFarm(Number(t),s,o);if(!l||!c)return;let m=l.reward_currency,d=l.incentivized_asset,p=this.getFarmAddress(s),g=await this.getOraclePrice(m,d),y=await this.balanceClient.getBalance(p,m);return{id:t,globalFarm:l,yieldFarm:c,priceAdjustment:g,balance:y}}));return n?r.map(a=>a?this.farmData(a,n):void 0):[]}async getAllIsolatedFarms(){let e=(await this.client.getAllIsolatedFarms()).reduce((r,a)=>r.includes(a.keyArgs[0].toString())?r:[...r,a.keyArgs[0].toString()],[]),n=await Promise.all(e.map(async r=>{let a=await this.getIsolatedFarms(r);if(a)return[r,a]}));return Object.fromEntries(n.filter(r=>!!r))}async getIsolatedFarms(t){let e=await this.client.getIsolatedFarms(t),n=await this.client.getRelayBlockNumber(),r=await Promise.all(e.map(async({keyArgs:a,value:i})=>{let[,s]=a,o=i,l=await this.client.getIsolatedGlobalFarm(s),c=await this.client.getIsolatedYieldFarm(t,s,o);if(!l||!c)return;let m=l.reward_currency,d=l.incentivized_asset,p=this.getFarmAddress(s,!0),g=await this.getOraclePrice(m,d),y=await this.balanceClient.getBalance(p,m);return{id:t,globalFarm:l,yieldFarm:c,priceAdjustment:g,balance:y,farmAddress:p}}));return n?r.map(a=>a?this.farmData(a,n,!0):void 0):[]}async getDepositReward(t,e,n,r){let a=e.global_farm_id,i=e.yield_farm_id,s=n?await this.client.getIsolatedYieldFarm(t,a,i):await this.client.getOmnipoolYieldFarm(Number(t),a,i),o=n?await this.client.getIsolatedGlobalFarm(a):await this.client.getOmnipoolGlobalFarm(a);if(!o||!s)return;let l=o.reward_currency,c=o.incentivized_asset,m=[[this.getFarmAddress(0,n),o.reward_currency],[this.getFarmAddress(o.id,n),o.reward_currency]],d=await this.getAccountAssetBalances(m),p=await this.getOraclePrice(l,c),g=new ge(m,d),b=await new be(f=>this.getFarmAddress(f),f=>this.client.getAsset(f),g).claimRewards(o,s,e,r,p??o.price_adjustment);if(!b)return;let P=await this.client.getAsset(b.assetId);if(P&&!(b.reward<=P.existential_deposit))return b}async getAccountAssetBalances(t){let[e,n]=await Promise.all([Promise.all(t.filter(([a,i])=>i!==0).map(([a,i])=>this.balanceClient.getTokenBalance(a,i))),Promise.all(t.filter(([a,i])=>i===0).map(([a])=>this.balanceClient.getSystemBalance(a)))]),r=[];for(let a=0,i=0;a+i<t.length;){let s=a+i,[,o]=t[s];o===0?(r.push(n[i]),i+=1):(r.push(e[a]),a+=1)}return r}};var ye=require("polkadot-api"),Ht=class extends k{omnipoolAssetIds=[];async getOraclePrice(t){return await this.api.query.EmaOracle.Oracles.getValue(ye.Binary.fromText("omnipool"),t,(0,ye.Enum)("TenMinutes"))}async getRelayBlockNumber(){return(await this.api.query.ParachainSystem.ValidationData.getValue())?.relay_parent_number}async getAllOmnipooFarms(){return this.api.query.OmnipoolWarehouseLM.ActiveYieldFarm.getEntries()}async getOmnipooFarms(t){return this.api.query.OmnipoolWarehouseLM.ActiveYieldFarm.getEntries(t)}async getOmnipoolGlobalFarm(t){return this.api.query.OmnipoolWarehouseLM.GlobalFarm.getValue(t)}async getOmnipoolYieldFarm(t,e,n){return this.api.query.OmnipoolWarehouseLM.YieldFarm.getValue(t,e,n)}async getAllIsolatedFarms(){return this.api.query.XYKWarehouseLM.ActiveYieldFarm.getEntries()}async getIsolatedFarms(t){return this.api.query.XYKWarehouseLM.ActiveYieldFarm.getEntries(t)}async getIsolatedGlobalFarm(t){return this.api.query.XYKWarehouseLM.GlobalFarm.getValue(t)}async getIsolatedYieldFarm(t,e,n){return this.api.query.XYKWarehouseLM.YieldFarm.getValue(t,e,n)}async getAsset(t){return this.api.query.AssetRegistry.Assets.getValue(t)}};var en={};x(en,{PoolContextProvider:()=>vt,PoolError:()=>ut,PoolFactory:()=>It,PoolType:()=>E,aave:()=>tn,lbp:()=>$e,omni:()=>Qe,stable:()=>Je,xyk:()=>Ze});var $e={};x($e,{LbpMath:()=>X,LbpPool:()=>Vt,LbpPoolClient:()=>Yt});var $=require("@galacticcouncil/math-lbp"),X=class{static getSpotPrice(t,e,n,r,a){return(0,$.get_spot_price)(t,e,n,r,a)}static calculateInGivenOut(t,e,n,r,a){return(0,$.calculate_in_given_out)(t,e,n,r,a)}static calculateOutGivenIn(t,e,n,r,a){return(0,$.calculate_out_given_in)(t,e,n,r,a)}static calculateLinearWeights(t,e,n,r,a){return(0,$.calculate_linear_weights)(t,e,n,r,a)}static calculatePoolTradeFee(t,e,n){return(0,$.calculate_pool_trade_fee)(t,e,n)}};var E=(a=>(a.Aave="Aave",a.LBP="LBP",a.Omni="Omnipool",a.Stable="Stableswap",a.XYK="XYK",a))(E||{}),ut=(a=>(a.InsufficientTradingAmount="InsufficientTradingAmount",a.MaxInRatioExceeded="MaxInRatioExceeded",a.MaxOutRatioExceeded="MaxOutRatioExceeded",a.TradeNotAllowed="TradeNotAllowed",a.UnknownError="UnknownError",a))(ut||{});var{FeeUtils:kn}=O,Vt=class u{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;fee;repayFeeApply;static fromPool(t){return new u(t.address,t.tokens,t.maxInRatio,t.maxOutRatio,t.minTradingLimit,t.fee,t.repayFeeApply)}constructor(t,e,n,r,a,i,s){this.type="LBP",this.address=t,this.tokens=e,this.maxInRatio=n,this.maxOutRatio=r,this.minTradingLimit=a,this.fee=i,this.repayFeeApply=s}validatePair(t,e){return!0}parsePair(t,e){let n=new Map(this.tokens.map(i=>[i.id,i])),r=n.get(t),a=n.get(e);if(r==null)throw new Error("Pool does not contain tokenIn");if(a==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,balanceIn:r.balance,balanceOut:a.balance,decimalsIn:r.decimals,decimalsOut:a.decimals,weightIn:r.weight,weightOut:a.weight}}validateAndBuy(t,e,n){let r=this.tokens[0].id,a=[];e<this.minTradingLimit&&a.push("InsufficientTradingAmount");let i=t.balanceOut/this.maxOutRatio;if(e>i&&a.push("MaxOutRatioExceeded"),r===t.assetOut){let s=this.calculateTradeFee(e,n),o=kn.toPct(this.repayFeeApply?n.repayFee:n.exchangeFee),l=e+s,c=this.calculateInGivenOut(t,l),m=t.balanceIn/this.maxInRatio;return c>m&&a.push("MaxInRatioExceeded"),{amountIn:c,calculatedIn:c,amountOut:e,feePct:o,errors:a}}else{let s=this.calculateInGivenOut(t,e),o=t.balanceIn/this.maxInRatio;return s>o&&a.push("MaxInRatioExceeded"),{amountIn:s,calculatedIn:s,amountOut:e,feePct:0,errors:a}}}validateAndSell(t,e,n){let r=this.tokens[0].id,a=[];e<this.minTradingLimit&&a.push("InsufficientTradingAmount");let i=t.balanceIn/this.maxInRatio;if(e>i&&a.push("MaxInRatioExceeded"),r===t.assetIn){let s=this.calculateOutGivenIn(t,e),o=t.balanceOut/this.maxOutRatio;return s>o&&a.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:s,amountOut:s,feePct:0,errors:a}}else{let s=this.calculateOutGivenIn(t,e),o=this.calculateTradeFee(s,n),l=kn.toPct(this.repayFeeApply?n.repayFee:n.exchangeFee),c=s-o,m=t.balanceOut/this.maxOutRatio;return c>m&&a.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:s,amountOut:c,feePct:l,errors:a}}}calculateInGivenOut(t,e){let n=X.calculateInGivenOut(t.balanceIn.toString(),t.balanceOut.toString(),t.weightIn.toString(),t.weightOut.toString(),e.toString()),r=BigInt(n);return r<0n?0n:r}calculateOutGivenIn(t,e){let n=X.calculateOutGivenIn(t.balanceIn.toString(),t.balanceOut.toString(),t.weightIn.toString(),t.weightOut.toString(),e.toString()),r=BigInt(n);return r<0n?0n:r}spotPriceInGivenOut(t){let e=X.getSpotPrice(t.balanceOut.toString(),t.balanceIn.toString(),t.weightOut.toString(),t.weightIn.toString(),this.maxOutRatio.toString());return BigInt(e)}spotPriceOutGivenIn(t){let e=X.getSpotPrice(t.balanceIn.toString(),t.balanceOut.toString(),t.weightIn.toString(),t.weightOut.toString(),this.maxInRatio.toString());return BigInt(e)}calculateTradeFee(t,e){let n=X.calculatePoolTradeFee(t.toString(),this.repayFeeApply?e.repayFee[0]:e.exchangeFee[0],this.repayFeeApply?e.repayFee[1]:e.exchangeFee[1]);return BigInt(n)}};var Mn=require("polkadot-api"),mt=require("rxjs");var Dn=(u,t=new Map)=>e=>{let n;return t.has(e)?t.get(e):(t.set(e,n=u(e)),n)};var I=require("rxjs");var je=[{inputs:[],name:"decimals",outputs:[{internalType:"uint8",name:"",type:"uint8"}],stateMutability:"view",type:"function"},{inputs:[],name:"description",outputs:[{internalType:"string",name:"",type:"string"}],stateMutability:"view",type:"function"},{inputs:[],name:"version",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"uint80",name:"_roundId",type:"uint80"}],name:"getRoundData",outputs:[{internalType:"uint80",name:"roundId",type:"uint80"},{internalType:"int256",name:"answer",type:"int256"},{internalType:"uint256",name:"startedAt",type:"uint256"},{internalType:"uint256",name:"updatedAt",type:"uint256"},{internalType:"uint80",name:"answeredInRound",type:"uint80"}],stateMutability:"view",type:"function"},{inputs:[],name:"latestRoundData",outputs:[{internalType:"uint80",name:"roundId",type:"uint80"},{internalType:"int256",name:"answer",type:"int256"},{internalType:"uint256",name:"startedAt",type:"uint256"},{internalType:"uint256",name:"updatedAt",type:"uint256"},{internalType:"uint80",name:"answeredInRound",type:"uint80"}],stateMutability:"view",type:"function"}];var Wt=class{client;constructor(t){this.client=t.getWsProvider()}async getData(t,e=6){let[n,r,a]=await Promise.all([this.client.readContract({abi:je,address:t,functionName:"latestRoundData"}),this.client.readContract({abi:je,address:t,functionName:"decimals"}),this.client.getBlock()]),[i,s,o,l]=n,c=a.number-(a.timestamp-l)/BigInt(e),m=Number(c);return{price:s,decimals:r,updatedAt:m<0?0:m}}};var U=class extends z{evm;mmOracle;override=[];mem=0;memPools=Dn(t=>(this.log(this.getPoolType(),"mem pools",t,"\u2705"),this.loadPools()));constructor(t,e){super(t),this.evm=e,this.mmOracle=new Wt(e)}async withOverride(t){this.override=t||[]}async getPoolsMem(){return this.memPools(this.mem)}async getPools(){let t=(0,I.from)(this.getPoolsMem()).pipe((0,I.switchMap)(e=>this.subscribe(e)),(0,I.combineLatestAll)());return(0,I.firstValueFrom)(t)}getSubscriber(){return(0,I.from)(this.getPoolsMem()).pipe((0,I.switchMap)(t=>this.subscribe(t)),(0,I.mergeAll)())}subscribe(t){return t.filter(e=>this.hasValidAssets(e)).map(e=>(0,I.combineLatest)([this.subscribePoolChange(e),this.subscribePoolBalance(e)]).pipe((0,I.debounceTime)(250),(0,I.map)(([n,r])=>this.updatePool(n,r))))}subscribePoolBalance(t){if(t.type==="Aave")return(0,I.of)([]);let e=[this.subscribeTokensBalance(t.address)];if(this.hasSystemAsset(t)){let n=this.subscribeSystemBalance(t.address);e.push(n)}if(this.hasErc20Asset(t)){let n=t.tokens.filter(a=>a.type==="Erc20").map(a=>a.id),r=this.subscribeErc20Balance(t.address,n);e.push(r)}return(0,I.combineLatest)(e).pipe((0,I.map)(n=>n.map(r=>Array.isArray(r)?r:[r]).flat()))}hasSystemAsset(t){return t.tokens.some(e=>e.id===0)}hasErc20Asset(t){return t.tokens.some(e=>e.type==="Erc20")}hasValidAssets(t){return t.tokens.every(({id:e,decimals:n,balance:r})=>{let a=this.override.find(s=>s.id===e),i=!!n||!!a?.decimals;return r>0n&&i})}updatePool=(t,e)=>{let n=t.tokens.map(r=>{let a=e.find(s=>s.id===r.id),i=this.override.find(s=>s.id===r.id);return a?{...r,balance:a.balance.transferable,decimals:r.decimals||i?.decimals}:{...r,decimals:r.decimals||i?.decimals}});return{...t,tokens:n}}};var Yt=class extends U{MAX_FINAL_WEIGHT=100000000n;poolsData=new Map([]);async loadPools(){let[t,e,n]=await Promise.all([this.api.query.LBP.PoolData.getEntries(),this.api.query.ParachainSystem.ValidationData.getValue(),this.getPoolLimits()]),r=e?.relay_parent_number||0,a=t.filter(({value:i})=>e&&this.isActivePool(i,r)).map(async({keyArgs:i,value:s})=>{let[o]=i,l=o.toString(),c=await this.getPoolDelta(l,s,r);return{address:l,type:"LBP",fee:s.fee,...c,...n}});return Promise.all(a)}async getPoolDelta(t,e,n){let{start:r,end:a,assets:i,initial_weight:s,final_weight:o,repay_target:l,fee_collector:c}=e,m=X.calculateLinearWeights(r?r.toString():"0",a?a.toString():"0",s.toString(),o.toString(),n.toString()),[d,p]=i,g=BigInt(m),y=this.MAX_FINAL_WEIGHT-BigInt(g),[b,P,f,S,v]=await Promise.all([this.isRepayFeeApplied(d,l,c.toString()),this.getBalance(t,d),this.api.query.AssetRegistry.Assets.getValue(d),this.getBalance(t,p),this.api.query.AssetRegistry.Assets.getValue(p)]);return{repayFeeApply:b,tokens:[{id:d,decimals:f?.decimals,existentialDeposit:f?.existential_deposit,balance:P.transferable,weight:g,type:f?.asset_type.type},{id:p,decimals:v?.decimals,existentialDeposit:v?.existential_deposit,balance:S.transferable,weight:y,type:v?.asset_type.type}]}}isActivePool(t,e){let{start:n,end:r}=t;return n&&r?e>=n&&e<r:!1}async isRepayFeeApplied(t,e,n){if(e===0n)return!1;try{return(await this.getBalance(n,t)).transferable<e}catch{return!0}}async getRepayFee(){return await this.api.constants.LBP.repay_fee()}async getPoolLimits(){let[t,e,n]=await Promise.all([this.api.constants.LBP.MaxInRatio(),this.api.constants.LBP.MaxOutRatio(),this.api.constants.LBP.MinTradingLimit()]);return{maxInRatio:t,maxOutRatio:e,minTradingLimit:n}}async getPoolFees(t){return{repayFee:await this.getRepayFee(),exchangeFee:t.fee}}getPoolType(){return"LBP"}async isSupported(){let t=this.api.query.LBP.PoolData,e=await this.api.compatibilityToken;return t.isCompatible(Mn.CompatibilityLevel.BackwardsCompatible,e)}subscribePoolChange(t){let e=this.api.query.ParachainSystem.ValidationData,n=this.poolsData.get(t.address);return n?e.watchValue("best").pipe((0,mt.switchMap)(r=>r?this.getPoolDelta(t.address,n,r.relay_parent_number):(0,mt.of)(t)),(0,mt.map)(r=>Object.assign({},t,r))):(0,mt.of)(t)}};var Qe={};x(Qe,{OmniMath:()=>B,OmniPool:()=>Xt,OmniPoolClient:()=>zt});var w=require("@galacticcouncil/math-omnipool"),pt=et(require("big.js")),B=class{static calculateSpotPrice(t,e,n,r){return(0,w.calculate_spot_price)(t,e,n,r)}static calculateLrnaSpotPrice(t,e){return(0,w.calculate_lrna_spot_price)(t,e)}static calculateInGivenOut(t,e,n,r,a,i,s,o,l){return(0,w.calculate_in_given_out)(t,e,n,r,a,i,s,o,l)}static calculateLrnaInGivenOut(t,e,n,r,a){return(0,w.calculate_lrna_in_given_out)(t,e,n,r,a)}static calculateOutGivenIn(t,e,n,r,a,i,s,o,l){return(0,w.calculate_out_given_in)(t,e,n,r,a,i,s,o,l)}static calculateOutGivenLrnaIn(t,e,n,r,a){return(0,w.calculate_out_given_lrna_in)(t,e,n,r,a)}static calculateShares(t,e,n,r){return(0,w.calculate_shares)(t,e,n,r)}static calculateLiquidityOut(t,e,n,r,a,i,s,o){return(0,w.calculate_liquidity_out)(t,e,n,r,a,i,s,o)}static calculateLiquidityLRNAOut(t,e,n,r,a,i,s,o){return(0,w.calculate_liquidity_lrna_out)(t,e,n,r,a,i,s,o)}static calculateCapDifference(t,e,n,r){let a=(0,pt.default)(e),i=(0,pt.default)(t),s=(0,pt.default)(r),o=(0,pt.default)(n),l=(0,pt.default)(10).pow(18),c=o.div(l);if(a.div(s).lt(c)){let d=c.times(s).minus(a).times(i),p=a.times((0,pt.default)(1).minus(c));return d.div(p).toFixed(0)}else return"0"}static verifyAssetCap(t,e,n,r){return(0,w.verify_asset_cap)(t,e,n,r)}static calculateLimitHubIn(t,e,n,r){return(0,w.calculate_liquidity_hub_in)(t,e,n,r)}static isSellAllowed(t){return(0,w.is_sell_allowed)(t)}static isBuyAllowed(t){return(0,w.is_buy_allowed)(t)}static isAddLiquidityAllowed(t){return(0,w.is_add_liquidity_allowed)(t)}static isRemoveLiquidityAllowed(t){return(0,w.is_remove_liquidity_allowed)(t)}};var{FeeUtils:wt}=O,Xt=class u{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;hubAssetId;static fromPool(t){return new u(t.address,t.tokens,t.maxInRatio,t.maxOutRatio,t.minTradingLimit,t.hubAssetId)}constructor(t,e,n,r,a,i){this.type="Omnipool",this.address=t,this.tokens=e,this.maxInRatio=n,this.maxOutRatio=r,this.minTradingLimit=a,this.hubAssetId=i}validatePair(t,e){return this.hubAssetId!=e}parsePair(t,e){let n=new Map(this.tokens.map(i=>[i.id,i])),r=n.get(t),a=n.get(e);if(r==null)throw new Error("Pool does not contain tokenIn");if(a==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,hubReservesIn:r.hubReserves,hubReservesOut:a.hubReserves,sharesIn:r.shares,sharesOut:a.shares,decimalsIn:r.decimals,decimalsOut:a.decimals,balanceIn:r.balance,balanceOut:a.balance,tradeableIn:r.tradeable,tradeableOut:a.tradeable,assetInEd:r.existentialDeposit,assetOutEd:a.existentialDeposit}}validateAndBuy(t,e,n){let r=this.calculateInGivenOut(t,e),a=this.calculateInGivenOut(t,e,n),i=r===0n?0:A.calculateDiffToRef(a,r),s=[],o=B.isSellAllowed(t.tradeableIn),l=B.isBuyAllowed(t.tradeableOut);(!o||!l)&&s.push("TradeNotAllowed"),(e<this.minTradingLimit||r<t.assetInEd)&&s.push("InsufficientTradingAmount");let c=t.balanceOut/this.maxOutRatio;e>c&&s.push("MaxOutRatioExceeded");let m=t.balanceIn/this.maxInRatio;return a>m&&s.push("MaxInRatioExceeded"),{amountIn:a,calculatedIn:r,amountOut:e,feePct:i,errors:s}}validateAndSell(t,e,n){let r=this.calculateOutGivenIn(t,e),a=this.calculateOutGivenIn(t,e,n),i=A.calculateDiffToRef(r,a),s=[],o=B.isSellAllowed(t.tradeableIn),l=B.isBuyAllowed(t.tradeableOut);(!o||!l)&&s.push("TradeNotAllowed"),(e<this.minTradingLimit||r<t.assetOutEd)&&s.push("InsufficientTradingAmount");let c=t.balanceIn/this.maxInRatio;e>c&&s.push("MaxInRatioExceeded");let m=t.balanceOut/this.maxOutRatio;return a>m&&s.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:r,amountOut:a,feePct:i,errors:s}}calculateInGivenOut(t,e,n){if(t.assetIn==this.hubAssetId)return this.calculateLrnaInGivenOut(t,e,n);let r=B.calculateInGivenOut(t.balanceIn.toString(),t.hubReservesIn.toString(),t.sharesIn.toString(),t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),n?wt.toRaw(n.assetFee).toString():"0",n?wt.toRaw(n.protocolFee).toString():"0"),a=BigInt(r);return a<0n?0n:a}calculateLrnaInGivenOut(t,e,n){let r=B.calculateLrnaInGivenOut(t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),n?wt.toRaw(n.assetFee).toString():"0"),a=BigInt(r);return a<0n?0n:a}calculateOutGivenIn(t,e,n){if(t.assetIn==this.hubAssetId)return this.calculateOutGivenLrnaIn(t,e,n);let r=B.calculateOutGivenIn(t.balanceIn.toString(),t.hubReservesIn.toString(),t.sharesIn.toString(),t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),n?wt.toRaw(n.assetFee).toString():"0",n?wt.toRaw(n.protocolFee).toString():"0"),a=BigInt(r);return a<0n?0n:a}calculateOutGivenLrnaIn(t,e,n){let r=B.calculateOutGivenLrnaIn(t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),n?wt.toRaw(n.assetFee).toString():"0"),a=BigInt(r);return a<0n?0n:a}spotPriceInGivenOut(t){if(t.assetIn==this.hubAssetId)return this.spotPriceLrnaInGivenOut(t);let e=B.calculateSpotPrice(t.balanceOut.toString(),t.hubReservesOut.toString(),t.balanceIn.toString(),t.hubReservesIn.toString()),n=Math.pow(10,18-t.decimalsOut);return BigInt(e)/BigInt(n)}spotPriceLrnaInGivenOut(t){let e=B.calculateLrnaSpotPrice(t.hubReservesOut.toString(),t.balanceOut.toString()),n=Math.pow(10,18-t.decimalsOut);return BigInt(e)/BigInt(n)}spotPriceOutGivenIn(t){if(t.assetIn==this.hubAssetId)return this.spotPriceOutGivenLrnaIn(t);let e=B.calculateSpotPrice(t.balanceIn.toString(),t.hubReservesIn.toString(),t.balanceOut.toString(),t.hubReservesOut.toString()),n=Math.pow(10,18-t.decimalsIn);return BigInt(e)/BigInt(n)}spotPriceOutGivenLrnaIn(t){let e=B.calculateLrnaSpotPrice(t.balanceOut.toString(),t.hubReservesOut.toString()),n=Math.pow(10,18-t.decimalsIn);return BigInt(e)/BigInt(n)}};var he=require("polkadot-api"),Ln=require("@polkadot-api/utils"),Kt=require("rxjs");var{FeeUtils:st}=O,zt=class extends U{async loadPools(){let t=await this.api.constants.Omnipool.HubAssetId(),e=this.getPoolAddress(),[n,r,a,i,s]=await Promise.all([this.api.query.Omnipool.Assets.getEntries(),this.api.query.Omnipool.HubAssetTradability.getValue(),this.api.query.AssetRegistry.Assets.getValue(t),this.getBalance(e,t),this.getPoolLimits()]),o=n.map(async({keyArgs:c,value:m})=>{let[d]=c,{hub_reserve:p,shares:g,tradable:y,cap:b,protocol_shares:P}=m,[f,S]=await Promise.all([this.api.query.AssetRegistry.Assets.getValue(d),this.getBalance(e,d)]);return{id:d,decimals:f?.decimals,existentialDeposit:f?.existential_deposit,balance:S.transferable,cap:b,hubReserves:p,protocolShares:P,shares:g,tradeable:y,type:f?.asset_type.type}}),l=await Promise.all(o);return l.push({id:t,decimals:a?.decimals,existentialDeposit:a?.existential_deposit,balance:i.transferable,tradeable:r,type:a?.asset_type.type}),[{address:e,type:"Omnipool",hubAssetId:t,tokens:l,...s}]}getPoolAddress(){let t="modlomnipool".padEnd(32,"\0"),e=new TextEncoder().encode(t),n=(0,Ln.toHex)(e);return(0,he.AccountId)(63).dec(n)}async getPoolLimits(){let[t,e,n]=await Promise.all([this.api.constants.Omnipool.MaxInRatio(),this.api.constants.Omnipool.MaxOutRatio(),this.api.constants.Omnipool.MinimumTradingLimit()]);return{maxInRatio:t,maxOutRatio:e,minTradingLimit:n}}async getPoolFees(t,e){let[n,r,a]=await Promise.all([this.api.constants.DynamicFees.AssetFeeParameters(),this.api.constants.DynamicFees.ProtocolFeeParameters(),this.api.query.DynamicFees.AssetFee.getValue(e)]),i=n.min_fee+r.min_fee,s=n.max_fee+r.max_fee;if(a){let{asset_fee:o,protocol_fee:l}=a;return{assetFee:st.fromPermill(o),protocolFee:st.fromPermill(l),min:st.fromPermill(i),max:st.fromPermill(s)}}else return{assetFee:st.fromPermill(n.min_fee),protocolFee:st.fromPermill(r.min_fee),min:st.fromPermill(i),max:st.fromPermill(s)}}getPoolType(){return"Omnipool"}async isSupported(){let t=this.api.query.Omnipool.Assets,e=await this.api.compatibilityToken;return t.isCompatible(he.CompatibilityLevel.BackwardsCompatible,e)}subscribePoolChange(t){return this.api.query.Omnipool.Assets.watchEntries({at:"best"}).pipe((0,Kt.distinctUntilChanged)((n,r)=>!r.deltas),(0,Kt.map)(({entries:n})=>n.map(r=>{let[a]=r.args,{hub_reserve:i,shares:s,tradable:o,cap:l,protocol_shares:c}=r.value,m=t.tokens.findIndex(p=>p.id===a);return{...t.tokens[m],cap:l,hubReserves:i,protocolShares:c,shares:s,tradeable:o}})),(0,Kt.map)(n=>{let r=t.tokens.find(a=>a.id===1);return{...t,tokens:[...n,r]}}))}};var Je={};x(Je,{StableMath:()=>C,StableSwap:()=>jt,StableSwapClient:()=>$t});var R=require("@galacticcouncil/math-stableswap"),C=class{static getPoolAddress(t){return(0,R.pool_account_name)(t)}static defaultPegs(t){let e=[];for(let n=0;n<t;n++)e.push(["1","1"]);return e}static calculateAmplification(t,e,n,r,a){return(0,R.calculate_amplification)(t,e,n,r,a)}static calculateInGivenOut(t,e,n,r,a,i,s){return(0,R.calculate_in_given_out)(t,e,n,r,a,i,s)}static calculateAddOneAsset(t,e,n,r,a,i,s){return(0,R.calculate_add_one_asset)(t,e,n,r,a,i,s)}static calculateSharesForAmount(t,e,n,r,a,i,s){return(0,R.calculate_shares_for_amount)(t,e,n,r,a,i,s)}static calculateOutGivenIn(t,e,n,r,a,i,s){return(0,R.calculate_out_given_in)(t,e,n,r,a,i,s)}static calculateLiquidityOutOneAsset(t,e,n,r,a,i,s){return(0,R.calculate_liquidity_out_one_asset)(t,e,n,r,a,i,s)}static calculateShares(t,e,n,r,a,i){return(0,R.calculate_shares)(t,e,n,r,a,i)}static calculateSpotPriceWithFee(t,e,n,r,a,i,s,o){return(0,R.calculate_spot_price_with_fee)(t,e,n,r,a,i,s,o)}static recalculatePegs(t,e,n,r,a){let i=(0,R.recalculate_peg)(t,e,n,r,a);return JSON.parse(i)}};var{FeeUtils:it}=O,jt=class u{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;amplification;id;fee;totalIssuance;static fromPool(t){return new u(t.address,t.tokens,t.maxInRatio,t.maxOutRatio,t.minTradingLimit,t.amplification,t.id,t.fee,t.totalIssuance)}constructor(t,e,n,r,a,i,s,o,l){this.type="Stableswap",this.address=t,this.tokens=e,this.maxInRatio=n,this.maxOutRatio=r,this.minTradingLimit=a,this.amplification=i,this.id=s,this.fee=o,this.totalIssuance=l}validatePair(t,e){return!0}parsePair(t,e){let n=new Map(this.tokens.map(i=>[i.id,i])),r=n.get(t),a=n.get(e);if(r==null)throw new Error("Pool does not contain tokenIn");if(a==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,balanceIn:r.balance,balanceOut:a.balance,decimalsIn:r.decimals,decimalsOut:a.decimals,tradeableIn:this.id===t?15:r.tradeable,tradeableOut:this.id===e?15:a.tradeable,assetInEd:r.existentialDeposit,assetOutEd:a.existentialDeposit}}validateAndBuy(t,e,n){let r=this.calculateInGivenOut(t,e),a=this.calculateInGivenOut(t,e,n),i=it.toPct(n.fee),s=[],o=B.isSellAllowed(t.tradeableIn),l=B.isBuyAllowed(t.tradeableOut);return(!o||!l)&&s.push("TradeNotAllowed"),(e<this.minTradingLimit||r<t.assetInEd)&&s.push("InsufficientTradingAmount"),{amountIn:a,calculatedIn:r,amountOut:e,feePct:i,errors:s}}validateAndSell(t,e,n){let r=this.calculateOutGivenIn(t,e),a=this.calculateOutGivenIn(t,e,n),i=it.toPct(n.fee),s=[],o=B.isSellAllowed(t.tradeableIn),l=B.isBuyAllowed(t.tradeableOut);return(!o||!l)&&s.push("TradeNotAllowed"),(e<this.minTradingLimit||r<t.assetOutEd)&&s.push("InsufficientTradingAmount"),{amountIn:e,calculatedOut:r,amountOut:a,feePct:i,errors:s}}calculateIn(t,e,n){let r=C.calculateInGivenOut(this.getReserves(),Number(t.assetIn),Number(t.assetOut),e.toString(),this.amplification.toString(),n?it.toRaw(n.fee).toString():"0",this.getPegs()),a=BigInt(r);return a<0n?0n:a}calculateAddOneAsset(t,e,n){let r=C.calculateAddOneAsset(this.getReserves(),e.toString(),Number(t.assetIn),this.amplification.toString(),this.totalIssuance.toString(),n?it.toRaw(n.fee).toString():"0",this.getPegs()),a=BigInt(r);return a<0n?0n:a}calculateSharesForAmount(t,e,n){let r=C.calculateSharesForAmount(this.getReserves(),Number(t.assetOut),e.toString(),this.amplification.toString(),this.totalIssuance.toString(),n?it.toRaw(n.fee).toString():"0",this.getPegs()),a=BigInt(r);return a<0n?0n:a}calculateInGivenOut(t,e,n){return t.assetOut==this.id?this.calculateAddOneAsset(t,e,n):t.assetIn==this.id?this.calculateSharesForAmount(t,e,n):this.calculateIn(t,e,n)}spotPriceInGivenOut(t){let e=C.calculateSpotPriceWithFee(this.id.toString(),this.getReserves(),this.amplification.toString(),t.assetOut.toString(),t.assetIn.toString(),this.totalIssuance.toString(),"0",this.getPegs());if(t.assetOut==this.id)return BigInt(e);if(t.assetIn==this.id){let r=Math.pow(10,t.decimalsIn-t.decimalsOut);return BigInt(e)/BigInt(r)}let n=Math.pow(10,18-t.decimalsIn);return BigInt(e)/BigInt(n)}calculateOut(t,e,n){let r=C.calculateOutGivenIn(this.getReserves(),Number(t.assetIn),Number(t.assetOut),e.toString(),this.amplification.toString(),n?it.toRaw(n.fee).toString():"0",this.getPegs()),a=BigInt(r);return a<0n?0n:a}calculateWithdrawOneAsset(t,e,n){let r=C.calculateLiquidityOutOneAsset(this.getReserves(),e.toString(),Number(t.assetOut),this.amplification.toString(),this.totalIssuance.toString(),n?it.toRaw(n.fee).toString():"0",this.getPegs()),a=BigInt(r);return a<0n?0n:a}calculateShares(t,e,n){let r=C.calculateShares(this.getReserves(),this.getAssets(t.assetIn,e),this.amplification.toString(),this.totalIssuance.toString(),n?it.toRaw(n.fee).toString():"0",this.getPegs()),a=BigInt(r);return a<0n?0n:a}calculateOutGivenIn(t,e,n){return t.assetIn==this.id?this.calculateWithdrawOneAsset(t,e,n):t.assetOut==this.id?this.calculateShares(t,e,n):this.calculateOut(t,e,n)}spotPriceOutGivenIn(t){let e=C.calculateSpotPriceWithFee(this.id.toString(),this.getReserves(),this.amplification.toString(),t.assetIn.toString(),t.assetOut.toString(),this.totalIssuance.toString(),"0",this.getPegs());if(t.assetIn==this.id)return BigInt(e);if(t.assetOut==this.id){let r=Math.pow(10,t.decimalsOut-t.decimalsIn);return BigInt(e)/BigInt(r)}let n=Math.pow(10,18-t.decimalsOut);return BigInt(e)/BigInt(n)}getPegs(){let t=C.defaultPegs(this.tokens.length-1);return JSON.stringify(t)}getReserves(){let t=this.tokens.filter(e=>e.id!=this.id).map(({id:e,balance:n,decimals:r})=>({asset_id:e,amount:n,decimals:r}));return JSON.stringify(t,rt.jsonFormatter)}getAssets(t,e){let n={asset_id:Number(t),amount:e.toString()};return JSON.stringify([n],rt.jsonFormatter)}};var Pe=require("polkadot-api"),qn=require("@polkadot-api/utils"),Nn=require("@noble/hashes/blake2b"),Tt=require("rxjs");var{FeeUtils:dt}=O,$t=class extends U{poolsData=new Map([]);getPoolType(){return"Stableswap"}getPoolAddress(t){let e=C.getPoolAddress(t),n=(0,Nn.blake2b)(e,{dkLen:32}),r=(0,qn.toHex)(n);return(0,Pe.AccountId)(63).dec(r)}async getPoolLimits(){return{maxInRatio:0n,maxOutRatio:0n,minTradingLimit:await this.api.constants.Stableswap.MinTradingLimit()}}async getPoolDelta(t,e,n){let{initial_amplification:r,final_amplification:a,initial_block:i,final_block:s}=e,o=C.calculateAmplification(r.toString(),a.toString(),i.toString(),s.toString(),n.toString()),l=await this.api.query.Tokens.TotalIssuance.getValue(t);return{amplification:BigInt(o),totalIssuance:l}}async getPoolTokens(t,e){let n=this.getPoolAddress(t),r=e.assets.map(async a=>{let[i,s,o]=await Promise.all([this.api.query.Stableswap.AssetTradability.getValue(t,a),this.api.query.AssetRegistry.Assets.getValue(a),this.getBalance(n,a)]);return{id:a,decimals:s?.decimals,existentialDeposit:s?.existential_deposit,balance:o.transferable,tradeable:i,type:s?.asset_type.type}});return Promise.all(r)}async isSupported(){let t=this.api.query.Stableswap.Pools,e=await this.api.compatibilityToken;return t.isCompatible(Pe.CompatibilityLevel.BackwardsCompatible,e)}async loadPools(){let[t,e,n]=await Promise.all([this.api.query.Stableswap.Pools.getEntries(),this.api.query.System.Number.getValue(),this.getPoolLimits()]),r=t.map(async({keyArgs:a,value:i})=>{let[s]=a,o=this.getPoolAddress(s),[l,c,m]=await Promise.all([this.getPoolDelta(s,i,e),this.getPoolTokens(s,i),this.getPoolPegs(s,i,e)]);return c.push({id:s,tradeable:15,balance:l.totalIssuance,decimals:18}),this.poolsData.set(o,i),{address:o,id:s,type:"Stableswap",fee:dt.fromPermill(i.fee),tokens:c,...l,...m,...n}});return Promise.all(r)}async getPoolFees(t){return{fee:t.fee}}async getPoolPegs(t,e,n){let r=await this.api.query.Stableswap.PoolPegs.getValue(t);if(!r)return this.getDefaultPegs(e);let a=await this.getLatestPegs(e,r,n),i=this.getRecentPegs(r),s=dt.fromPermill(r.max_peg_update),o=dt.fromPermill(e.fee),[l,c]=C.recalculatePegs(JSON.stringify(i),JSON.stringify(a),n.toString(),dt.toRaw(s).toString(),dt.toRaw(o).toString()),m=Number(l)*1e6;return{pegsFee:dt.fromPermill(m),pegs:c}}getDefaultPegs(t){let e=t.fee,n=C.defaultPegs(t.assets.length);return{pegsFee:dt.fromPermill(e),pegs:n}}getRecentPegs(t){let{current:e}=t;return Array.from(e.entries()).map(([n,r])=>r.map(a=>a.toString()))}async getLatestPegs(t,e,n){let{source:r}=e,a=Array.from(t.assets.entries()).map(([s,o])=>o),i=r.map(async(s,o)=>{if(s.type==="Oracle"){let[l,c,m]=s.value,d=[m,a[o]].sort((f,S)=>f-S),p=await this.api.query.EmaOracle.Oracles.getValue(l,d,c);if(!p)return;let[{price:g,updated_at:y}]=p,b=g.n.toString(),P=g.d.toString();return m.toString()===d[0].toString()?[[b,P],y.toString()]:[[P,b],y.toString()]}else if(s.type==="MMOracle"){let l=s.value.asHex(),{price:c,decimals:m,updatedAt:d}=await this.mmOracle.getData(l),p=10**m;return[[c.toString(),p.toString()],d.toString()]}else return[s.value.map(l=>l.toString()),n.toString()]});return Promise.all(i)}subscribePoolChange(t){let e=this.api.query.System.Number,n=this.poolsData.get(t.address);return!n||!t.id?(0,Tt.of)(t):e.watchValue("best").pipe((0,Tt.switchMap)(r=>Promise.all([this.getPoolDelta(t.id,n,r),this.getPoolPegs(t.id,n,r)])),(0,Tt.map)(([r,a])=>{let i=t.tokens.map(s=>s.id===t.id?{...s,balance:r.totalIssuance}:s);return Object.assign(t,{tokens:i},r,a)}))}};var Ze={};x(Ze,{XykMath:()=>Z,XykPool:()=>Qt,XykPoolClient:()=>Jt});var F=require("@galacticcouncil/math-xyk"),Z=class{static getSpotPrice(t,e,n){return(0,F.get_spot_price)(t,e,n)}static calculateInGivenOut(t,e,n){return(0,F.calculate_in_given_out)(t,e,n)}static calculateOutGivenIn(t,e,n){return(0,F.calculate_out_given_in)(t,e,n)}static calculatePoolTradeFee(t,e,n){return(0,F.calculate_pool_trade_fee)(t,e,n)}static calculateLiquidityIn(t,e,n){return(0,F.calculate_liquidity_in)(t,e,n)}static calculateSpotPrice(t,e){return(0,F.calculate_spot_price)(t,e)}static calculateSpotPriceWithFee(t,e,n,r){return(0,F.calculate_spot_price_with_fee)(t,e,n,r)}static calculateShares(t,e,n){return(0,F.calculate_shares)(t,e,n)}static calculateLiquidityOutAssetA(t,e,n,r){return(0,F.calculate_liquidity_out_asset_a)(t,e,n,r)}static calculateLiquidityOutAssetB(t,e,n,r){return(0,F.calculate_liquidity_out_asset_b)(t,e,n,r)}};var{FeeUtils:Gn}=O,Qt=class u{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;static fromPool(t){return new u(t.address,t.tokens,t.maxInRatio,t.maxOutRatio,t.minTradingLimit)}constructor(t,e,n,r,a){this.type="XYK",this.address=t,this.tokens=e,this.maxInRatio=n,this.maxOutRatio=r,this.minTradingLimit=a}validatePair(t,e){return!0}parsePair(t,e){let n=new Map(this.tokens.map(i=>[i.id,i])),r=n.get(t),a=n.get(e);if(r==null)throw new Error("Pool does not contain tokenIn");if(a==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,decimalsIn:r.decimals,decimalsOut:a.decimals,balanceIn:r.balance,balanceOut:a.balance,assetInEd:r.existentialDeposit,assetOutEd:a.existentialDeposit}}validateAndBuy(t,e,n){let r=this.calculateInGivenOut(t,e),a=this.calculateTradeFee(r,n),i=Gn.toPct(n.exchangeFee),s=r+a,o=[];(e<this.minTradingLimit||r<t.assetInEd)&&o.push("InsufficientTradingAmount");let l=t.balanceOut/this.maxOutRatio;e>l&&o.push("MaxOutRatioExceeded");let c=t.balanceIn/this.maxInRatio;return s>c&&o.push("MaxInRatioExceeded"),{amountIn:s,calculatedIn:r,amountOut:e,feePct:i,errors:o}}validateAndSell(t,e,n){let r=this.calculateOutGivenIn(t,e),a=this.calculateTradeFee(r,n),i=Gn.toPct(n.exchangeFee),s=r-a,o=[];(e<this.minTradingLimit||r<t.assetOutEd)&&o.push("InsufficientTradingAmount");let l=t.balanceIn/this.maxInRatio;e>l&&o.push("MaxInRatioExceeded");let c=t.balanceOut/this.maxOutRatio;return s>c&&o.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:r,amountOut:s,feePct:i,errors:o}}calculateInGivenOut(t,e){let n=Z.calculateInGivenOut(t.balanceIn.toString(),t.balanceOut.toString(),e.toString()),r=BigInt(n);return r<0n?0n:r}calculateOutGivenIn(t,e){let n=Z.calculateOutGivenIn(t.balanceIn.toString(),t.balanceOut.toString(),e.toString()),r=BigInt(n);return r<0n?0n:r}spotPriceInGivenOut(t){let e=Z.calculateSpotPrice(t.balanceOut.toString(),t.balanceIn.toString()),n=Math.pow(10,18-t.decimalsOut);return BigInt(e)/BigInt(n)}spotPriceOutGivenIn(t){let e=Z.calculateSpotPrice(t.balanceIn.toString(),t.balanceOut.toString()),n=Math.pow(10,18-t.decimalsIn);return BigInt(e)/BigInt(n)}calculateTradeFee(t,e){let n=Z.calculatePoolTradeFee(t.toString(),e.exchangeFee[0],e.exchangeFee[1]);return BigInt(n)}};var Un=require("polkadot-api"),Hn=require("rxjs");var Jt=class extends U{async loadPools(){let t=this.api.query.XYK.PoolAssets,[e,n]=await Promise.all([t.getEntries(),this.getPoolLimits()]),r=e.map(async({keyArgs:a,value:i})=>{let[s]=a,[o,l]=i,[c,m,d,p]=await Promise.all([this.getBalance(s,o),this.api.query.AssetRegistry.Assets.getValue(o),this.getBalance(s,l),this.api.query.AssetRegistry.Assets.getValue(l)]);return{address:s,type:"XYK",tokens:[{id:o,decimals:m?.decimals,existentialDeposit:m?.existential_deposit,balance:c.transferable,type:m?.asset_type.type},{id:l,decimals:p?.decimals,existentialDeposit:p?.existential_deposit,balance:d.transferable,type:p?.asset_type.type}],...n}});return Promise.all(r)}async getExchangeFee(){return await this.api.constants.XYK.GetExchangeFee()}async getPoolLimits(){let[t,e,n]=await Promise.all([this.api.constants.XYK.MaxInRatio(),this.api.constants.XYK.MaxOutRatio(),this.api.constants.XYK.MinTradingLimit()]);return{maxInRatio:t,maxOutRatio:e,minTradingLimit:n}}async getPoolFees(){return{exchangeFee:await this.getExchangeFee()}}getPoolType(){return"XYK"}async isSupported(){let t=this.api.query.XYK.PoolAssets,e=await this.api.compatibilityToken;return t.isCompatible(Un.CompatibilityLevel.BackwardsCompatible,e)}subscribePoolChange(t){return(0,Hn.of)(t)}};var tn={};x(tn,{AavePool:()=>Zt,AavePoolClient:()=>te});var Zt=class u{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;static fromPool(t){return new u(t.address,t.tokens,t.maxInRatio,t.maxOutRatio,t.minTradingLimit)}constructor(t,e,n,r,a){this.type="Aave",this.address=t,this.tokens=e,this.maxInRatio=n,this.maxOutRatio=r,this.minTradingLimit=a}validatePair(t,e){return!0}parsePair(t,e){let n=new Map(this.tokens.map(i=>[i.id,i])),r=n.get(t),a=n.get(e);if(r==null)throw new Error("Pool does not contain tokenIn");if(a==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,balanceIn:r.balance,balanceOut:a.balance,decimalsIn:r.decimals,decimalsOut:a.decimals,assetInEd:0n,assetOutEd:0n}}validateAndBuy(t,e,n){let r=this.calculateInGivenOut(t,e),a=[];return e>t.balanceOut&&a.push("TradeNotAllowed"),{amountIn:r,calculatedIn:r,amountOut:e,feePct:0,errors:a}}validateAndSell(t,e,n){let r=this.calculateOutGivenIn(t,e),a=[];return r>t.balanceOut&&a.push("TradeNotAllowed"),{amountIn:e,calculatedOut:r,amountOut:r,feePct:0,errors:a}}calculateInGivenOut(t,e){return e}calculateOutGivenIn(t,e){return e}spotPriceInGivenOut(t){let e=Math.pow(10,t.decimalsOut);return BigInt(e)}spotPriceOutGivenIn(t){let e=Math.pow(10,t.decimalsIn);return BigInt(e)}calculateTradeFee(t,e){return 0n}};var Wn=require("polkadot-api"),Yn=require("@polkadot-api/utils"),xt=require("rxjs"),Xn=require("viem");var Vn=[{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"reserve",type:"address"},{indexed:!1,internalType:"address",name:"user",type:"address"},{indexed:!0,internalType:"address",name:"onBehalfOf",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"},{indexed:!0,internalType:"uint16",name:"referralCode",type:"uint16"}],name:"Supply",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"reserve",type:"address"},{indexed:!0,internalType:"address",name:"user",type:"address"},{indexed:!0,internalType:"address",name:"to",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"}],name:"Withdraw",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"reserve",type:"address"},{indexed:!1,internalType:"address",name:"user",type:"address"},{indexed:!0,internalType:"address",name:"onBehalfOf",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"},{indexed:!1,internalType:"enum DataTypes.InterestRateMode",name:"interestRateMode",type:"uint8"},{indexed:!1,internalType:"uint256",name:"borrowRate",type:"uint256"},{indexed:!0,internalType:"uint16",name:"referralCode",type:"uint16"}],name:"Borrow",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"reserve",type:"address"},{indexed:!0,internalType:"address",name:"user",type:"address"},{indexed:!0,internalType:"address",name:"repayer",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"},{indexed:!1,internalType:"bool",name:"useATokens",type:"bool"}],name:"Repay",type:"event"}];var{ERC20:Mr}=lt,Lr=["Supply","Withdraw","Repay","Borrow"],te=class extends U{async loadPools(){let e=(await this.api.apis.AaveTradeExecutor.pools()).map(async({reserve:n,atoken:r,liqudity_in:a,liqudity_out:i})=>{let[s,o,l,c]=await Promise.all([this.api.query.AssetRegistry.Assets.getValue(n),this.api.query.AssetRegistry.AssetLocations.getValue(n),this.api.query.AssetRegistry.Assets.getValue(r),this.api.query.AssetRegistry.AssetLocations.getValue(r)]);return{address:this.getPoolId(n,r),type:"Aave",tokens:[{id:n,decimals:s?.decimals,existentialDeposit:s?.existential_deposit,balance:a,location:o,type:s?.asset_type.type},{id:r,decimals:l?.decimals,existentialDeposit:l?.existential_deposit,balance:i,location:c,type:l?.asset_type.type}],...this.getPoolLimits()}});return Promise.all(e)}async getPoolDelta(t){let[e,n]=t.tokens,{liqudity_in:r,liqudity_out:a}=await this.api.apis.AaveTradeExecutor.pool(e.id,n.id);return t.tokens.map(i=>{let s=i.id===e.id?r:a;return{...i,balance:s}})}getPoolId(t,e){let n=t+"/"+e,r=new TextEncoder().encode(n.padEnd(32,"\0")),a=(0,Yn.toHex)(r);return(0,Wn.AccountId)(63).dec(a)}getPoolLimits(){return{maxInRatio:0n,maxOutRatio:0n,minTradingLimit:0n}}async getPoolFees(t,e){return{}}getPoolType(){return"Aave"}async isSupported(){return!0}subscribePoolChange(t){let[e,n]=t.tokens,r=this.getReserveH160Id(e),a=this.api.event.Router.Executed.watch(({asset_in:s,asset_out:o})=>s===n.id||o===n.id),i=this.api.event.EVM.Log.watch(({log:s})=>{let{topics:o,data:l}=s,c=o.map(g=>g.asHex()),m=l.asHex(),{eventName:d,args:p}=(0,Xn.decodeEventLog)({abi:Vn,topics:c,data:m});return Lr.includes(d)&&p.reserve.toLowerCase()===r.toLowerCase()});return(0,xt.merge)([a,i]).pipe((0,xt.switchMap)(()=>this.getPoolDelta(t)),(0,xt.map)(s=>({...t,tokens:[...s]})))}getReserveH160Id(t){return t.type==="Erc20"?rt.findNestedKey(t.location,"AccountKey20").AccountKey20.key:Mr.fromAssetId(t.id)}};var It=class{static get(t){switch(t.type){case"Aave":return Zt.fromPool(t);case"XYK":return Qt.fromPool(t);case"Omnipool":return Xt.fromPool(t);case"LBP":return Vt.fromPool(t);case"Stableswap":return jt.fromPool(t);default:throw new Error("Pool type "+t.type+" is not supported yet")}}};var Q=require("rxjs");var vt=class extends k{evm;lbpClient;omniClient;stableClient;xykClient;aaveClient;active=new Set([]);clients=[];pools=new Map([]);lbpSub=Q.Subscription.EMPTY;omniSub=Q.Subscription.EMPTY;stableSub=Q.Subscription.EMPTY;xykSub=Q.Subscription.EMPTY;aaveSub=Q.Subscription.EMPTY;isReady=!1;isDestroyed=new Q.Subject;constructor(t,e){super(t),this.evm=e,this.lbpClient=new Yt(t,e),this.omniClient=new zt(t,e),this.stableClient=new $t(t,e),this.xykClient=new Jt(t,e),this.aaveClient=new te(t,e),this.clients=[this.lbpClient,this.omniClient,this.stableClient,this.xykClient,this.aaveClient]}subscribe(t){return t.getSubscriber().pipe((0,Q.takeUntil)(this.isDestroyed)).subscribe(e=>{this.pools.set(e.address,e)})}withOmnipool(){return this.omniSub.unsubscribe(),this.omniSub=this.subscribe(this.omniClient),this.active.add("Omnipool"),this}withStableswap(){return this.stableSub.unsubscribe(),this.stableSub=this.subscribe(this.stableClient),this.active.add("Stableswap"),this}withLbp(){return this.lbpSub.unsubscribe(),this.lbpSub=this.subscribe(this.lbpClient),this.active.add("LBP"),this}withAave(){return this.aaveSub.unsubscribe(),this.aaveSub=this.subscribe(this.aaveClient),this.active.add("Aave"),this}withXyk(t){return this.xykClient.withOverride(t),this.xykSub.unsubscribe(),this.xykSub=this.subscribe(this.xykClient),this.active.add("XYK"),this}destroy(){this.isDestroyed.next(!0),this.isDestroyed.complete(),this.active.clear(),this.pools.clear(),this.isReady=!1}async getPools(t={}){if(this.active.size===0)throw new Error("No pools selected");if(this.isReady)return Array.from(this.pools.values());let{useOnly:e=[],exclude:n=[]}=t,r=new Set(e),a=new Set(n),i=async s=>{let o=s.getPoolType();return r.size>0?r.has(o):a.size>0?!a.has(o):s.isSupported()};return this.getFilteredPools(i)}async getFilteredPools(t){let e=await Promise.all(this.clients.map(t)),n=this.clients.filter((a,i)=>e[i]);return(await Promise.all(n.map(a=>a.getPoolsMem()))).flat()}async getPoolFees(t,e){let n=this.clients.find(r=>r.getPoolType()===t.type);if(n)return n.getPoolFees(t,e);throw new qt(t.type)}};var cn={};x(cn,{DEFAULT_BLOCK_TIME:()=>zn,DEFAULT_MIN_BUDGET:()=>an,ORDER_MIN_BLOCK_PERIOD:()=>jn,Router:()=>Ot,TWAP_BLOCK_PERIOD:()=>ae,TWAP_MAX_DURATION:()=>on,TWAP_MAX_PRICE_IMPACT:()=>sn,TWAP_TX_MULTIPLIER:()=>ec,TradeOrderError:()=>rn,TradeOrderType:()=>Se,TradeRouteBuilder:()=>H,TradeRouter:()=>At,TradeScheduler:()=>Bt,TradeType:()=>fe});var ee=class{constructor(t=1/0){this.capacity=t}storage=[];enqueue(t){if(this.size()===this.capacity)throw Error("Queue has reached max capacity, you cannot add more items");this.storage.push(t)}dequeue(){return this.storage.shift()}size(){return this.storage.length}};var qr=8,ne=class{isNotVisited(t,e){let n=!0;return e.forEach(r=>{(r[0]===t[0]||r[1]===t[1])&&(n=!1)}),n}findPaths(t,e,n){let r=[],a=new ee,i=[];for(i.push([e,""]),a.enqueue(i);a.size()>0;){let s=a.dequeue();if(!s||s.length>qr)continue;let o=s[s.length-1];(n===null||o[0]===n)&&r.push(s),t.get(o[0])?.forEach(c=>{if(this.isNotVisited(c,s)){let m=[...s];m.push(c),a.enqueue(m)}})}return r}findShortestPaths(t,e,n){let r=[],a=new ee,i=[];i.push([e,""]),a.enqueue(i);let s=1/0;for(;a.size()>0;){let o=a.dequeue();if(!o)continue;let l=o[o.length-1];if(l[0]===n){o.length<s?(s=o.length,r.length=0,r.push(o)):o.length===s&&r.push(o);continue}let c=t.get(l[0]);for(let m of c??[])this.isNotVisited(m,o)&&a.enqueue([...o,m])}return r}buildAndPopulateGraph(t,e){let n=new Map;for(let r of t)n.set(parseInt(r),[]);for(let[r,a,i]of e)n.get(a)?.push([i,r]);return n}};function nn(u){let t={};for(let e of u){let n=e.tokens.length;for(let r=0;r<n;r++){t[e.tokens[r].id]||(t[e.tokens[r].id]=[]);for(let a=0;a<n;a++){if(r==a)continue;let i=[e.address,e.tokens[r].id,e.tokens[a].id];t[e.tokens[r].id].push(i)}}}return t}var re=class{getProposals(t,e,n){let r=n.filter(b=>b.type==="XYK"),a=n.filter(b=>b.type!=="XYK"),i=new Set(a.map(b=>b.tokens).flat().map(b=>b.id)),s=i.has(t),o=i.has(e),l=new ne,c=b=>{let P=nn(b),f=Object.keys(P),S=f.flatMap(v=>P[v]);return l.buildAndPopulateGraph(f,S)};if(!s&&!o){let b=r.filter(S=>S.tokens.find(v=>v.id===t)||S.tokens.find(v=>v.id===e)),P=c(b),f=l.findPaths(P,t,e);return this.parsePaths(f)}if(s&&o){let b=c(a),P=l.findPaths(b,t,e);return this.parsePaths(P)}let m=s?e:t,d=r.filter(b=>b.tokens.some(P=>P.id===m));if(d.length===0)return[];let p=[...a,...d],g=c(p),y=l.findPaths(g,t,e);return this.parsePaths(y)}parsePaths(t){let e=[];for(let n of t){let r=[];for(let a=0;a<n.length;a++){let i=n[a],s=n[a+1];if(s==null)break;r.push(this.toEdge(i,s))}e.push(r)}return e}toEdge(t,e){return[e[1],t[0],e[0]]}};var Ot=class{routeSuggester;routeProposals;routerOptions;ctx;constructor(t,e={}){this.ctx=t,this.routeSuggester=new re,this.routeProposals=new Map,this.routerOptions=Object.freeze(e)}buildRouteKey(t,e,n){return`${t}->${e}::${n.length}`}async getPools(){return this.ctx.getPools(this.routerOptions)}async getRoutes(t,e){let n=await this.getPools();return this.validateInput(t,e,n),this.getPaths(t,e,n)}async getTradeableAssets(){let t=await this.getPools(),e=this.getAssets(t);return Array.from(e)}async getRouteableAssets(t){let e=await this.getTradeableAssets();return(await Promise.all(e.filter(r=>r!==t).map(r=>this.getRoutes(r,t)))).filter(r=>r.length>0).map(([r])=>r[0].assetIn).sort()}validateInput(t,e,n){if(n.length===0)throw new Error("No pools configured");if(t===e)throw new Error("Trading pair can't be identical");let r=this.getAssets(n);if(!r.has(t))throw new Error(t+" is not supported asset");if(!r.has(e))throw new Error(e+" is not supported asset");return this.toPoolsMap(n)}getAssets(t){let e=t.map(n=>n.tokens.map(r=>r.id)).flat().sort((n,r)=>n>r?1:-1);return new Set(e)}getPaths(t,e,n){let r=this.toPoolsMap(n);return this.getProposals(t,e,n).filter(i=>this.validPath(i,r)).map(i=>this.toHops(i,r))}getProposals(t,e,n){let r=this.buildRouteKey(t,e,n);if(this.routeProposals.has(r))return this.routeProposals.get(r);let a=this.routeSuggester.getProposals(t,e,n);return this.routeProposals.set(r,a),a}validPath(t,e){return t.length>0&&t.map(n=>this.validEdge(n,e)).reduce((n,r)=>n&&r)}validEdge([t,e,n],r){return r.get(t)?.validatePair(e,n)||!1}toPoolsMap(t){return new Map(t.map(e=>[e.address,It.get(e)]))}toHops(t,e){return t.map(([n,r,a])=>{let i=e.get(n);return{poolAddress:n,poolId:i?.id,pool:i?.type,assetIn:r,assetOut:a}})}};var fe=(e=>(e.Buy="Buy",e.Sell="Sell",e))(fe||{}),Se=(n=>(n.Dca="Dca",n.TwapSell="TwapSell",n.TwapBuy="TwapBuy",n))(Se||{}),rn=(n=>(n.OrderTooSmall="OrderTooSmall",n.OrderTooBig="OrderTooBig",n.OrderImpactTooBig="OrderImpactTooBig",n))(rn||{});var{FeeUtils:Kn}=O,At=class extends Ot{mlr;poolsSnapshot;constructor(t,e={}){super(t,e),this.mlr=new Map}buildCtxSync(t,e){let n=this.poolsSnapshot,r=super.validateInput(t,e,n),a=super.getPaths(t,e,n);if(!a.length)throw new Nt(t,e);return{paths:a,pools:n,poolsMap:r}}async withCtx(t,e,n){this.poolsSnapshot||(this.poolsSnapshot=await super.getPools());let r=this.buildCtxSync(t,e);return n(r)}isDirectTrade(t){return t.length==1}findBestSellRoute(t){let e=t.sort((n,r)=>{let a=n[n.length-1].amountOut,i=r[r.length-1].amountOut;return a>i?-1:1});return e.find(n=>n.every(r=>r.errors.length==0))||e[0]}getRouteFeeRange(t){if(t.filter(n=>n.tradeFeeRange).length>0){let n=t.map(a=>a.tradeFeeRange?.[0]??a.tradeFeePct).reduce((a,i)=>a+i),r=t.map(a=>a.tradeFeeRange?.[1]??a.tradeFeePct).reduce((a,i)=>a+i);return[n,r]}}getPoolFeeRange(t){let e=t.min?Kn.toPct(t.min):void 0,n=t.max?Kn.toPct(t.max):void 0;if(e&&n)return[e,n]}async getBestSell(t,e,n){return this.getSell(t,e,n)}getSellSpot(t){let e=t[t.length-1];if(t.length===1)return e.spotPrice;let n=t.map(s=>s.assetOutDecimals).reduce((s,o)=>s+o),r=t.map(s=>s.spotPrice).reduce((s,o)=>s*o),a=n-e.assetOutDecimals,i=Math.pow(10,a);return r/BigInt(i)}async getSell(t,e,n,r){return this.withCtx(t,e,async({paths:a,poolsMap:i})=>{let s;if(r)s=await this.toSellSwaps(n,r,i);else{let o=a.map(c=>this.toSellSwaps(n,c,i)),l=await Promise.all(o);s=this.findBestSellRoute(l)}return this.buildSell(i,s)})}buildSell(t,e){let n=e[0],r=e[e.length-1],a=this.isDirectTrade(e),i=this.getSellSpot(e),s=r.amountOut,o=a?r.calculatedOut:this.calculateDelta0Y(n.amountIn,e,t),l=o-s,c=this.getRouteFeeRange(e),m=a?r.tradeFeePct:A.calculateSellFee(o,s),d=Math.pow(10,n.assetInDecimals),p=n.amountIn*i/BigInt(d),g=A.calculateDiffToRef(o,p);return{type:"Sell",amountIn:n.amountIn,amountOut:r.amountOut,spotPrice:i,tradeFee:l,tradeFeePct:m,tradeFeeRange:c,priceImpactPct:g,swaps:e,toHuman(){return{type:"Sell",amountIn:h.toDecimal(n.amountIn,n.assetInDecimals),amountOut:h.toDecimal(r.amountOut,r.assetOutDecimals),spotPrice:h.toDecimal(i,r.assetOutDecimals),tradeFee:h.toDecimal(l,r.assetOutDecimals),tradeFeePct:m,tradeFeeRange:c,priceImpactPct:g,swaps:e.map(y=>y.toHuman())}}}}calculateDelta0Y(t,e,n){let r=[];for(let a=0;a<e.length;a++){let i=e[a],s=n.get(i.poolAddress);if(s==null)throw new Error("Pool does not exit");let o=s.parsePair(i.assetIn,i.assetOut),l;a>0?l=r[a-1]:l=t;let c=s.calculateOutGivenIn(o,l);r.push(c)}return r[r.length-1]}async calculateMostLiquidRoute(t,e,n){let{paths:r,pools:a,poolsMap:i}=n,l=a.filter(y=>y.tokens.some(b=>b.id===t)).map(y=>y.type==="Aave"?y.tokens:y.tokens.filter(b=>b.id===t)).map(y=>y.map(b=>b.balance).reduce((b,P)=>b+P)).sort((y,b)=>b<y?-1:1)[0],c=A.getFraction(l,.1),m=await Promise.all(r.map(y=>this.toSellSwaps(c,y,i))),p=this.findBestSellRoute(m).map(y=>({poolAddress:y.poolAddress,poolId:y?.poolId,pool:y.pool,assetIn:y.assetIn,assetOut:y.assetOut})),g=this.buildRouteKey(t,e,a);return this.mlr.set(g,p),p}async toSellSwaps(t,e,n){let r=[];for(let a=0;a<e.length;a++){let i=e[a],s=n.get(i.poolAddress);if(s==null)throw new Error("Pool does not exit");let o=s.parsePair(i.assetIn,i.assetOut),l;a>0?l=r[a-1].amountOut:l=typeof t=="string"?h.toBigInt(t,o.decimalsIn):t;let c=await this.ctx.getPoolFees(s,o.assetOut),{amountOut:m,calculatedOut:d,feePct:p,errors:g}=s.validateAndSell(o,l,c),y=this.getPoolFeeRange(c),b=s.spotPriceOutGivenIn(o),P=Math.pow(10,o.decimalsIn),f=l*b/BigInt(P),S=A.calculateDiffToRef(d,f);r.push({...i,assetInDecimals:o.decimalsIn,assetOutDecimals:o.decimalsOut,amountIn:l,amountOut:m,calculatedOut:d,spotPrice:b,tradeFeePct:p,tradeFeeRange:y,priceImpactPct:S,errors:g,isSupply(){return s.type==="Aave"&&s.tokens[0].id===i.assetIn},isWithdraw(){return s.type==="Aave"&&s.tokens[1].id===i.assetIn},toHuman(){return{...i,amountIn:h.toDecimal(l,o.decimalsIn),amountOut:h.toDecimal(m,o.decimalsOut),calculatedOut:h.toDecimal(d,o.decimalsOut),spotPrice:h.toDecimal(b,o.decimalsOut),tradeFeePct:p,tradeFeeRange:y,priceImpactPct:S,errors:g}}})}return r}async getMostLiquidRoute(t,e){return this.withCtx(t,e,async n=>{let r=this.buildRouteKey(t,e,n.pools),a=this.mlr.get(r);return a||this.calculateMostLiquidRoute(t,e,n)})}async getSpotPrice(t,e){return this.withCtx(t,e,async n=>{let{pools:r,poolsMap:a}=n,i=this.buildRouteKey(t,e,r),s=this.mlr.get(i);s||(s=await this.calculateMostLiquidRoute(t,e,n));let o=await this.toSellSwaps("1",s,a),l=this.getSellSpot(o),c=o[o.length-1].assetOutDecimals;return{amount:l,decimals:c}})}findBestBuyRoute(t){let e=t.sort((n,r)=>{let a=n[0].amountIn,i=r[0].amountIn;return a>i?1:-1});return e.find(n=>n.every(r=>r.errors.length==0))||e[0]}async getBestBuy(t,e,n){return this.getBuy(t,e,n)}getBuySpot(t){let e=t[0];if(t.length===1)return e.spotPrice;let n=t.map(s=>s.assetInDecimals).reduce((s,o)=>s+o),r=t.map(s=>s.spotPrice).reduce((s,o)=>s*o),a=n-e.assetInDecimals,i=Math.pow(10,a);return r/BigInt(i)}async getBuy(t,e,n,r){return this.withCtx(t,e,async({paths:a,poolsMap:i})=>{let s;if(r)s=await this.toBuySwaps(n,r,i);else{let o=a.map(c=>this.toBuySwaps(n,c,i)),l=await Promise.all(o);s=this.findBestBuyRoute(l)}return this.buildBuy(i,s)})}buildBuy(t,e){let n=e[e.length-1],r=e[0],a=this.isDirectTrade(e),i=this.getBuySpot(e),s=r.amountIn,o=a?r.calculatedIn:this.calculateDelta0X(n.amountOut,e,t),l=s-o,c=this.getRouteFeeRange(e),m=a?r.tradeFeePct:A.calculateBuyFee(o,s),d=Math.pow(10,n.assetOutDecimals),p=n.amountOut*i/BigInt(d),g;return o===0n?g=-100:g=A.calculateDiffToRef(p,o),{type:"Buy",amountOut:n.amountOut,amountIn:r.amountIn,spotPrice:i,tradeFee:l,tradeFeePct:m,tradeFeeRange:c,priceImpactPct:g,swaps:e,toHuman(){return{type:"Buy",amountOut:h.toDecimal(n.amountOut,n.assetOutDecimals),amountIn:h.toDecimal(r.amountIn,r.assetInDecimals),spotPrice:h.toDecimal(i,r.assetInDecimals),tradeFee:h.toDecimal(l,r.assetInDecimals),tradeFeePct:m,tradeFeeRange:c,priceImpactPct:g,swaps:e.map(y=>y.toHuman())}}}}calculateDelta0X(t,e,n){let r=[];for(let a=e.length-1;a>=0;a--){let i=e[a],s=n.get(i.poolAddress);if(s==null)throw new Error("Pool does not exit");let o=s.parsePair(i.assetIn,i.assetOut),l;a==e.length-1?l=t:l=r[0];let c=s.calculateInGivenOut(o,l);r.unshift(c)}return r[0]}async toBuySwaps(t,e,n){let r=[];for(let a=e.length-1;a>=0;a--){let i=e[a],s=n.get(i.poolAddress);if(s==null)throw new Error("Pool does not exit");let o=s.parsePair(i.assetIn,i.assetOut),l;a==e.length-1?l=typeof t=="string"?h.toBigInt(t,o.decimalsOut):t:l=r[0].amountIn;let c=await this.ctx.getPoolFees(s,o.assetOut),{amountIn:m,calculatedIn:d,feePct:p,errors:g}=s.validateAndBuy(o,l,c),y=this.getPoolFeeRange(c),b=s.spotPriceInGivenOut(o),P=Math.pow(10,o.decimalsOut),f=l*b/BigInt(P),S;d===0n?S=-100:S=A.calculateDiffToRef(f,d),r.unshift({...i,assetInDecimals:o.decimalsIn,assetOutDecimals:o.decimalsOut,amountOut:l,amountIn:m,calculatedIn:d,spotPrice:b,tradeFeePct:p,tradeFeeRange:y,priceImpactPct:S,errors:g,isSupply(){return s.type==="Aave"&&s.tokens[0].id===i.assetIn},isWithdraw(){return s.type==="Aave"&&s.tokens[1].id===i.assetIn},toHuman(){return{...i,amountOut:h.toDecimal(l,o.decimalsOut),amountIn:h.toDecimal(m,o.decimalsIn),calculatedIn:h.toDecimal(d,o.decimalsIn),spotPrice:h.toDecimal(b,o.decimalsIn),tradeFeePct:p,tradeFeeRange:y,priceImpactPct:S,errors:g}}})}return r}};var zn=6e3,an=1000000000000000n,ae=6,sn=-5,on=216e5,ec=3,jn=6;var ln=require("polkadot-api");var H=class{static build(t){return t.map(({assetIn:e,assetOut:n,pool:r,poolId:a})=>r==="Stableswap"?{pool:(0,ln.Enum)("Stableswap",a),asset_in:e,asset_out:n}:{pool:(0,ln.Enum)(r),asset_in:e,asset_out:n})}};var Bt=class{schedulerOptions;router;constructor(t,e={}){this.router=t,this.schedulerOptions=Object.freeze({blockTime:e.blockTime??6e3,minBudgetInNative:e.minBudgetInNative??an})}get blockTime(){return this.schedulerOptions.blockTime}get minOrderBudget(){return this.schedulerOptions.minBudgetInNative}async getDcaOrder(t,e,n,r,a){let[i,s]=await Promise.all([this.getMinimumOrderBudget(t),this.router.getBestSell(t,e,n)]),{amountIn:o,swaps:l,priceImpactPct:c}=s,m=l[0],d=l[l.length-1],{assetInDecimals:p}=m,{assetOutDecimals:g}=d,y=Math.abs(c),b=this.getMinimumTradeCount(o,i),P=this.getOptimalTradeCount(y),f=a?Math.round(r/a):P,S=Math.ceil(r/b),v=Math.round(r/P),N=Math.round(r/f),G=o/BigInt(f),D=await this.router.getBestSell(t,e,G),V=o<i,ot=[];V&&ot.push("OrderTooSmall");let W=D.amountOut*BigInt(f),tt=this.toBlockPeriod(N),Ft=D.tradeFee*BigInt(f),Et=H.build(l),oe={assetIn:t,assetOut:e,errors:ot,frequencyMin:S,frequencyOpt:v,frequency:N,tradeCount:f,tradeFee:Ft,tradeImpactPct:D.priceImpactPct,tradePeriod:tt,tradeRoute:Et,type:"Dca"};return{...oe,amountIn:o,amountOut:W,tradeAmountIn:D.amountIn,tradeAmountOut:D.amountOut,toHuman(){return{...oe,amountIn:h.toDecimal(o,p),amountOut:h.toDecimal(W,g),tradeAmountIn:h.toDecimal(D.amountIn,p),tradeAmountOut:h.toDecimal(D.amountOut,g)}}}}async getMinimumOrderBudget(t){if(0===t)return this.minOrderBudget;let e=await this.router.getSpotPrice(0,t),n=10n**BigInt(12);if(e)return this.minOrderBudget*e.amount/n;throw new Error("Unable to calculate order budget")}getMinimumTradeCount(t,e){let n=e*2n/10n;if(n===0n)return 0;let r=t+n/2n;return Number(r/n)}getOptimalTradeCount(t){let e=Math.round(t*10)||1;return Math.max(e,3)}async getTwapSellOrder(t,e,n){let[r,a]=await Promise.all([this.getMinimumOrderBudget(t),this.router.getBestSell(t,e,n)]),{amountIn:i,swaps:s,priceImpactPct:o}=a,l=s[0],c=s[s.length-1],{assetInDecimals:m}=l,{assetOutDecimals:d}=c,p=Math.abs(o),g=this.getTwapTradeCount(p),y=i/BigInt(g),b=await this.router.getBestSell(l.assetIn,c.assetOut,y),P=g===1,f=i<r,S=b.priceImpactPct<-5,v=[];f||P?v.push("OrderTooSmall"):S&&v.push("OrderImpactTooBig");let N=b.amountOut*BigInt(g),G=b.tradeFee*BigInt(g),D=H.build(s),V={assetIn:t,assetOut:e,errors:v,tradeCount:g,tradeImpactPct:b.priceImpactPct,tradePeriod:6,tradeRoute:D,type:"TwapSell"};return{...V,amountIn:i,amountOut:N,tradeAmountIn:b.amountIn,tradeAmountOut:b.amountOut,tradeFee:G,toHuman(){return{...V,amountIn:h.toDecimal(i,m),amountOut:h.toDecimal(N,d),tradeAmountIn:h.toDecimal(b.amountIn,m),tradeAmountOut:h.toDecimal(b.amountOut,d),tradeFee:h.toDecimal(G,d)}}}}async getTwapBuyOrder(t,e,n){let[r,a]=await Promise.all([this.getMinimumOrderBudget(t),this.router.getBestBuy(t,e,n)]),{amountOut:i,swaps:s,priceImpactPct:o}=a,l=s[0],c=s[s.length-1],{assetInDecimals:m}=l,{assetOutDecimals:d}=c,p=Math.abs(o),g=this.getTwapTradeCount(p),y=i/BigInt(g),b=await this.router.getBestBuy(l.assetIn,c.assetOut,y),P=b.amountIn*BigInt(g),f=g===1,S=P<r,v=b.priceImpactPct<-5,N=[];S||f?N.push("OrderTooSmall"):v&&N.push("OrderImpactTooBig");let G=b.tradeFee*BigInt(g),D=H.build(s),V={assetIn:t,assetOut:e,errors:N,tradeCount:g,tradeImpactPct:b.priceImpactPct,tradePeriod:6,tradeRoute:D,type:"TwapBuy"};return{...V,amountIn:P,amountOut:i,tradeAmountIn:b.amountIn,tradeAmountOut:b.amountOut,tradeFee:G,toHuman(){return{...V,amountIn:h.toDecimal(P,m),amountOut:h.toDecimal(i,d),tradeAmountIn:h.toDecimal(b.amountIn,m),tradeAmountOut:h.toDecimal(b.amountOut,d),tradeFee:h.toDecimal(G,m)}}}}getTwapTradeCount(t){let e=this.getOptimalTradeCount(t);if(this.getTwapExecutionTime(e)>216e5){let r=216e5/(this.blockTime*6);return Math.round(r)}return e}getTwapExecutionTime(t){return t*6*this.blockTime}toBlockPeriod(t){let e=t/this.blockTime,n=Math.round(e);return Math.max(n,6)}};var un={};x(un,{BIG_10:()=>Jn,BIG_BILL:()=>Zn,StakingApi:()=>se,StakingClient:()=>ie});var $n=require("@polkadot/util-crypto"),Qn=require("@polkadot/util"),bt=require("@galacticcouncil/math-staking"),gt=et(require("big.js")),Jn=(0,gt.default)(10),Zn=(0,gt.default)(Jn.pow(12));function Nr(u){return(0,$n.encodeAddress)((0,Qn.stringToU8a)(("modl"+u).padEnd(32,"\0")),63)}var se=class{client;balanceClient;constructor(t,e){this.client=t,this.balanceClient=e}async getFreePotBalance(){let t=await this.client.getPalletId(),e=Nr(t);return(await this.balanceClient.getBalance(e,0)).transferable}async getStakingPosition(t){let[e,n]=await Promise.all([this.client.getStakingPositionsValue(t),this.client.getStakingVotes(t)]),r=e?.created_at,a=await n.reduce(async(i,[s,o])=>{let l=await i,c=s,m=o.amount,d=o.conviction.toString(),p=await this.client.getReferendumInfo(c);return p&&(p.type==="Approved"||p.type==="Rejected")&&l.push({id:c,amount:m,conviction:d}),l},Promise.resolve([]));return{stake:e?.stake,rewardPerStake:e?.reward_per_stake,createdAt:r,actionPoints:e?.action_points,accumulatedUnpaidRewards:e?.accumulated_unpaid_rewards,accumulatedSlashPoints:e?.accumulated_slash_points,accumulatedLockedRewards:e?.accumulated_locked_rewards,votes:a}}async getStake(t){let e=await this.client.getNFTCollectionId(),[n,r]=await Promise.all([this.client.getStaking(),this.client.getUniques(t,e)]),a=r.find(i=>i)?.itemId;return{totalStake:n?.total_stake,accumulatedRewardPerStake:n?.accumulated_reward_per_stake,potReservedBalance:n?.pot_reserved_balance,positionId:a,stakePosition:a?await this.getStakingPosition(a):void 0}}async getRewards(t,e){let n=await this.getStake(t),{potReservedBalance:r,accumulatedRewardPerStake:a,totalStake:i,stakePosition:s}=n;if(!s)return;let[o,l,c,m]=await Promise.all([this.getFreePotBalance(),this.client.getPeriodLength(),this.client.getUnclaimablePeriods(),this.client.getSixBlockSince()]),d=(0,gt.default)(o.toString()).minus(r.toString()),p=a.toString(),g=(0,gt.default)(e).plus(1).toString();d.gt(0)&&i>0&&(p=(0,bt.calculate_accumulated_rps)(a.toString(),d.toString(),i.toString()));let y=(0,bt.calculate_period_number)(l.toString(),e,m??g),b=(0,bt.calculate_period_number)(l.toString(),s.createdAt?.toString()??"",m??g),P=(0,bt.calculate_rewards)(p,s.rewardPerStake?.toString()??"",s.stake?.toString()??""),f=(0,gt.default)(P).plus(s.accumulatedUnpaidRewards?.toString()||"0").plus(s.accumulatedLockedRewards?.toString()||"0");if(!(0,gt.default)(y).minus(b).lte(c.toString()))return f.div(Zn).toString()}};var ie=class extends k{async getPalletId(){let t=this.api.constants.Staking.PalletId;return(await t()).asText()}async getPeriodLength(){let t=this.api.constants.Staking.PeriodLength;return await t()}async getUnclaimablePeriods(){let t=this.api.constants.Staking.UnclaimablePeriods;return await t()}async getNFTCollectionId(){let t=this.api.constants.Staking.NFTCollectionId;return await t()}async getStaking(){return await this.api.query.Staking.Staking.getValue()}async getUniques(t,e){return(await this.api.query.Uniques.Account.getEntries(t,e)).map(({keyArgs:i})=>{let[s,o,l]=i;return{address:s,collectionId:o,itemId:l}})}async getStakingPositionsValue(t){return await this.api.query.Staking.Positions.getValue(t)}async getStakingVotes(t){return await this.api.query.Staking.Votes.getValue(t)}async getReferendumInfo(t){return await this.api.query.Referenda.ReferendumInfoFor.getValue(t)}async getSixBlockSince(){return(await this.api.query.Staking.SixSecBlocksSince.getValue()).toString()}};var pn={};x(pn,{TxBuilderFactory:()=>Rt});var mn=require("polkadot-api");function tr(u){let t=[],e=u;for(;e&&typeof e=="object"&&"type"in e;)t.push(e.type),e=e.value;return t.join(".")}var _t=class extends k{evm;evmClient;balanceClient;aaveUtils;constructor(t,e){super(t),this.evm=e,this.evmClient=e.getWsProvider(),this.balanceClient=new z(t),this.aaveUtils=new ct(e)}wrapTx(t,e){return{name:t,get:()=>e,dryRun:n=>this.dryRun(n,e)}}async dispatchWithExtraGas(t){return this.api.tx.Dispatcher.dispatch_with_extra_gas({call:t.decodedCall,extra_gas:Ae})}async dryRun(t,e){let n=(0,mn.Enum)("Signed",t),r=(0,mn.Enum)("system",n),i=await this.client.getUnsafeApi().apis.DryRunApi.dry_run_call(r,e.decodedCall),s=i.success&&!i.value.execution_result.success?i.value.execution_result.value.error:null;if(s){let o=tr(s.value);throw new Error("Dry run execution error!",{cause:o})}return i}isDirectOmnipoolTrade(t){return t.length===1&&t[0].pool==="Omnipool"}};var we=class extends _t{_trade;_beneficiary;_slippagePct=1;setTrade(t){return this._trade=t,this}withBeneficiary(t){return this._beneficiary=t,this}withSlippage(t){return this._slippagePct=t,this}get trade(){if(!this._trade)throw new Error("Trade not set. Use setTrade().");return this._trade}get beneficiary(){if(!this._beneficiary)throw new Error("Beneficiary not set. Use withBeneficiary().");return this._beneficiary}get slippagePct(){return this._slippagePct}async build(){let{amountIn:t,swaps:e,type:n}=this.trade;if(n==="Buy")return this.buildBuyTx();let{assetIn:r}=e[0],a=await this.balanceClient.getBalance(this.beneficiary,r);return t>=a.transferable-5n?this.buildSellAllTx():this.buildSellTx()}async buildBuyTx(){let{amountIn:t,amountOut:e,swaps:n}=this.trade,r=n[0],a=n[n.length-1],i=A.getFraction(t,this.slippagePct),s=r.assetIn,o=a.assetOut,l=t+i,c;return this.isDirectOmnipoolTrade(n)?c=this.api.tx.Omnipool.buy({asset_in:s,asset_out:o,amount:e,max_sell_amount:l}):c=this.api.tx.Router.buy({asset_in:s,asset_out:o,amount_out:e,max_amount_in:l,route:H.build(n)}),this.wrapTx("RouterBuy",c)}async buildSellTx(){let{amountIn:t,amountOut:e,swaps:n}=this.trade,r=n[0],a=n[n.length-1],i=A.getFraction(e,this.slippagePct),s=r.assetIn,o=a.assetOut,l=e-i,c;return this.isDirectOmnipoolTrade(n)?c=this.api.tx.Omnipool.sell({asset_in:s,asset_out:o,amount:t,min_buy_amount:l}):c=this.api.tx.Router.sell({asset_in:s,asset_out:o,amount_in:t,min_amount_out:l,route:H.build(n)}),r.isWithdraw()&&await this.aaveUtils.hasBorrowPositions(this.beneficiary)&&(c=await this.dispatchWithExtraGas(c)),this.wrapTx("RouterSell",c)}async buildSellAllTx(){let{amountOut:t,swaps:e}=this.trade,n=e[0],r=e[e.length-1],a=A.getFraction(t,this.slippagePct),i=n.assetIn,s=r.assetOut,o=t-a,l=this.api.tx.Router.sell_all({asset_in:i,asset_out:s,min_amount_out:o,route:H.build(e)});return n.isWithdraw()&&await this.aaveUtils.hasBorrowPositions(this.beneficiary)&&(l=await this.dispatchWithExtraGas(l)),this.wrapTx("RouterSellAll",l)}};var Te=require("polkadot-api");var xe=class extends _t{_order;_beneficiary;_maxRetries=3;_slippagePct=1;setOrder(t){return this._order=t,this}withBeneficiary(t){return this._beneficiary=t,this}withMaxRetries(t){return this._maxRetries=t,this}withSlippage(t){return this._slippagePct=t,this}get order(){if(!this._order)throw new Error("Order not set. Use setOrder().");return this._order}get beneficiary(){if(!this._beneficiary)throw new Error("Beneficiary not set. Use withBeneficiary().");return this._beneficiary}get maxRetries(){return this._maxRetries}get slippagePct(){return this._slippagePct}async build(){let{type:t}=this.order;switch(t){case"Dca":return this.buildDcaTx();case"TwapSell":return this.buildTwapSellTx();case"TwapBuy":return this.buildTwapBuyTx();default:throw new Error(`Unsupported TradeOrderType: ${t}`)}}buildDcaTx(){let{amountIn:t,assetIn:e,assetOut:n,tradeAmountIn:r,tradePeriod:a,tradeRoute:i}=this.order,s=this.api.tx.DCA.schedule({schedule:{owner:this.beneficiary,period:a,max_retries:this.maxRetries,total_amount:t,slippage:this.slippagePct*1e4,stability_threshold:void 0,order:(0,Te.Enum)("Sell",{asset_in:e,asset_out:n,amount_in:r,min_amount_out:0n,route:i})},start_execution_block:void 0});return this.wrapTx("DcaSchedule",s)}buildTwapSellTx(){let{amountIn:t,assetIn:e,assetOut:n,tradeAmountIn:r,tradeAmountOut:a,tradePeriod:i,tradeRoute:s}=this.order,o=A.getFraction(a,this.slippagePct),l=a-o,c=this.api.tx.DCA.schedule({schedule:{owner:this.beneficiary,period:i,max_retries:this.maxRetries,total_amount:t,slippage:this.slippagePct*1e4,stability_threshold:void 0,order:(0,Te.Enum)("Sell",{asset_in:e,asset_out:n,amount_in:r,min_amount_out:l,route:s})},start_execution_block:void 0});return this.wrapTx("DcaSchedule.twapSell",c)}buildTwapBuyTx(){let{amountIn:t,assetIn:e,assetOut:n,tradeAmountIn:r,tradeAmountOut:a,tradePeriod:i,tradeRoute:s}=this.order,o=A.getFraction(r,this.slippagePct),l=r+o,c=this.api.tx.DCA.schedule({schedule:{owner:this.beneficiary,period:i,max_retries:this.maxRetries,total_amount:t,slippage:this.slippagePct*1e4,stability_threshold:void 0,order:(0,Te.Enum)("Buy",{asset_in:e,asset_out:n,amount_out:a,max_amount_in:l,route:s})},start_execution_block:void 0});return this.wrapTx("DcaSchedule.twapBuy",c)}};var Rt=class{client;evmClient;constructor(t,e){this.client=t,this.evmClient=e}trade(t){return new we(this.client,this.evmClient).setTrade(t)}order(t){return new xe(this.client,this.evmClient).setOrder(t)}};async function Gr(u){let t=new St(u),e=new Gt(u),[n,r]=await Promise.all([t.getBlockTime(),t.getMinOrderBudget()]),a=new vt(u,e).withAave().withOmnipool().withStableswap().withXyk(),i=new z(u),s=new ie(u),o=new Ht(u),l=new ct(e),c=new At(a),m=new Bt(c,{blockTime:n,minBudgetInNative:r}),d=new se(s,i),p=new Ut(o,i,{blockTime:n});return{api:{aave:l,router:c,scheduler:m,staking:d,farm:p},client:{asset:new ft(u),balance:i,evm:e},ctx:{pool:a},tx:new Rt(u,e),destroy:()=>{a.destroy()}}}0&&(module.exports={aave,api,big,client,const:null,createSdkContext,erc20,error,evm,farm,fmt,h160,json,math,pool,sor,staking,tx,xc});
1
+ "use strict";var cr=Object.create;var de=Object.defineProperty;var ur=Object.getOwnPropertyDescriptor;var mr=Object.getOwnPropertyNames;var pr=Object.getPrototypeOf,dr=Object.prototype.hasOwnProperty;var Tn=(u,t)=>()=>(u&&(t=u(u=0)),t);var I=(u,t)=>{for(var e in t)de(u,e,{get:t[e],enumerable:!0})},pe=(u,t,e,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of mr(t))!dr.call(u,r)&&r!==e&&de(u,r,{get:()=>t[r],enumerable:!(n=ur(t,r))||n.enumerable});return u},ft=(u,t,e)=>(pe(u,t,"default"),e&&pe(e,t,"default")),J=(u,t,e)=>(e=u!=null?cr(pr(u)):{},pe(t||!u||!u.__esModule?de(e,"default",{value:u,enumerable:!0}):e,u)),gr=u=>pe(de({},"__esModule",{value:!0}),u);var Dt={};var In=Tn(()=>{ft(Dt,require("@polkadot-api/ws-provider/node"))});var Mt={};var vn=Tn(()=>{ft(Mt,require("@polkadot-api/ws-provider/web"))});var Hr={};I(Hr,{aave:()=>Ye,api:()=>Re,big:()=>P,client:()=>Xe,const:()=>qe,createSdkContext:()=>Ur,erc20:()=>mt,error:()=>ze,evm:()=>$e,farm:()=>tn,fmt:()=>O,h160:()=>Nt,json:()=>it,math:()=>A,pool:()=>ln,sor:()=>yn,staking:()=>bn,tx:()=>Pn,xc:()=>Ve});module.exports=gr(Hr);var Re={};I(Re,{Papi:()=>D,getWs:()=>yr});var xn=require("@galacticcouncil/descriptors");function wn(u){switch(u){case!0:case"true":case 1:case"1":case"on":case"yes":return!0;default:return!1}}var D=class{client;api;constructor(t){this.client=t,this.api=this.client.getTypedApi(xn.hydration)}log(t,...e){let n=typeof window>"u"?process.env.GC_DEBUG:window.localStorage.getItem("gc.debug");wn(n)&&console.log(t,...e)}};var On=require("polkadot-api"),An=require("polkadot-api/polkadot-sdk-compat"),yr=async u=>{let t=typeof u=="string"?u.split(","):u,r=(typeof window>"u"?(await Promise.resolve().then(()=>(In(),Dt))).getWsProvider:(await Promise.resolve().then(()=>(vn(),Mt))).getWsProvider)(t);return(0,On.createClient)((0,An.withPolkadotSdkCompat)(r))};var Ye={};I(Ye,{AAVE_GAS_LIMIT:()=>ke,AAVE_LENDING_POOL_ADDRESS:()=>be,AAVE_POOL_ABI:()=>Fe,AAVE_POOL_DATA_PROVIDER:()=>ye,AAVE_POOL_DATA_PROVIDER_ABI:()=>ge,AAVE_POOL_PROXY:()=>Ee,AAVE_ROUNDING_THRESHOLD:()=>ii,AAVE_UINT_256_MAX:()=>br,AaveClient:()=>Lt,AaveUtils:()=>pt});var Fe=[{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"reserve",type:"address"},{indexed:!1,internalType:"address",name:"user",type:"address"},{indexed:!0,internalType:"address",name:"onBehalfOf",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"},{indexed:!0,internalType:"uint16",name:"referralCode",type:"uint16"}],name:"Supply",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"reserve",type:"address"},{indexed:!0,internalType:"address",name:"user",type:"address"},{indexed:!0,internalType:"address",name:"to",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"}],name:"Withdraw",type:"event"},{inputs:[{internalType:"address",name:"asset",type:"address"},{internalType:"uint256",name:"amount",type:"uint256"},{internalType:"address",name:"to",type:"address"}],name:"withdraw",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"nonpayable",type:"function"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"reserve",type:"address"},{indexed:!1,internalType:"address",name:"user",type:"address"},{indexed:!0,internalType:"address",name:"onBehalfOf",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"},{indexed:!1,internalType:"enum DataTypes.InterestRateMode",name:"interestRateMode",type:"uint8"},{indexed:!1,internalType:"uint256",name:"borrowRate",type:"uint256"},{indexed:!0,internalType:"uint16",name:"referralCode",type:"uint16"}],name:"Borrow",type:"event"},{inputs:[{internalType:"address",name:"asset",type:"address"},{internalType:"uint256",name:"amount",type:"uint256"},{internalType:"uint256",name:"interestRateMode",type:"uint256"},{internalType:"uint16",name:"referralCode",type:"uint16"},{internalType:"address",name:"onBehalfOf",type:"address"}],name:"borrow",outputs:[],stateMutability:"nonpayable",type:"function"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"reserve",type:"address"},{indexed:!0,internalType:"address",name:"user",type:"address"},{indexed:!0,internalType:"address",name:"repayer",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"},{indexed:!1,internalType:"bool",name:"useATokens",type:"bool"}],name:"Repay",type:"event"},{inputs:[{internalType:"address",name:"user",type:"address"}],name:"getUserAccountData",outputs:[{internalType:"uint256",name:"totalCollateralBase",type:"uint256"},{internalType:"uint256",name:"totalDebtBase",type:"uint256"},{internalType:"uint256",name:"availableBorrowsBase",type:"uint256"},{internalType:"uint256",name:"currentLiquidationThreshold",type:"uint256"},{internalType:"uint256",name:"ltv",type:"uint256"},{internalType:"uint256",name:"healthFactor",type:"uint256"}],stateMutability:"view",type:"function"}];var ge=[{inputs:[{internalType:"contract IEACAggregatorProxy",name:"_networkBaseTokenPriceInUsdProxyAggregator",type:"address"},{internalType:"contract IEACAggregatorProxy",name:"_marketReferenceCurrencyPriceInUsdProxyAggregator",type:"address"}],stateMutability:"nonpayable",type:"constructor"},{inputs:[],name:"ETH_CURRENCY_UNIT",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[],name:"MKR_ADDRESS",outputs:[{internalType:"address",name:"",type:"address"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"bytes32",name:"_bytes32",type:"bytes32"}],name:"bytes32ToString",outputs:[{internalType:"string",name:"",type:"string"}],stateMutability:"pure",type:"function"},{inputs:[{internalType:"contract IPoolAddressesProvider",name:"provider",type:"address"}],name:"getReservesData",outputs:[{components:[{internalType:"address",name:"underlyingAsset",type:"address"},{internalType:"string",name:"name",type:"string"},{internalType:"string",name:"symbol",type:"string"},{internalType:"uint256",name:"decimals",type:"uint256"},{internalType:"uint256",name:"baseLTVasCollateral",type:"uint256"},{internalType:"uint256",name:"reserveLiquidationThreshold",type:"uint256"},{internalType:"uint256",name:"reserveLiquidationBonus",type:"uint256"},{internalType:"uint256",name:"reserveFactor",type:"uint256"},{internalType:"bool",name:"usageAsCollateralEnabled",type:"bool"},{internalType:"bool",name:"borrowingEnabled",type:"bool"},{internalType:"bool",name:"stableBorrowRateEnabled",type:"bool"},{internalType:"bool",name:"isActive",type:"bool"},{internalType:"bool",name:"isFrozen",type:"bool"},{internalType:"uint128",name:"liquidityIndex",type:"uint128"},{internalType:"uint128",name:"variableBorrowIndex",type:"uint128"},{internalType:"uint128",name:"liquidityRate",type:"uint128"},{internalType:"uint128",name:"variableBorrowRate",type:"uint128"},{internalType:"uint128",name:"stableBorrowRate",type:"uint128"},{internalType:"uint40",name:"lastUpdateTimestamp",type:"uint40"},{internalType:"address",name:"aTokenAddress",type:"address"},{internalType:"address",name:"stableDebtTokenAddress",type:"address"},{internalType:"address",name:"variableDebtTokenAddress",type:"address"},{internalType:"address",name:"interestRateStrategyAddress",type:"address"},{internalType:"uint256",name:"availableLiquidity",type:"uint256"},{internalType:"uint256",name:"totalPrincipalStableDebt",type:"uint256"},{internalType:"uint256",name:"averageStableRate",type:"uint256"},{internalType:"uint256",name:"stableDebtLastUpdateTimestamp",type:"uint256"},{internalType:"uint256",name:"totalScaledVariableDebt",type:"uint256"},{internalType:"uint256",name:"priceInMarketReferenceCurrency",type:"uint256"},{internalType:"address",name:"priceOracle",type:"address"},{internalType:"uint256",name:"variableRateSlope1",type:"uint256"},{internalType:"uint256",name:"variableRateSlope2",type:"uint256"},{internalType:"uint256",name:"stableRateSlope1",type:"uint256"},{internalType:"uint256",name:"stableRateSlope2",type:"uint256"},{internalType:"uint256",name:"baseStableBorrowRate",type:"uint256"},{internalType:"uint256",name:"baseVariableBorrowRate",type:"uint256"},{internalType:"uint256",name:"optimalUsageRatio",type:"uint256"},{internalType:"bool",name:"isPaused",type:"bool"},{internalType:"bool",name:"isSiloedBorrowing",type:"bool"},{internalType:"uint128",name:"accruedToTreasury",type:"uint128"},{internalType:"uint128",name:"unbacked",type:"uint128"},{internalType:"uint128",name:"isolationModeTotalDebt",type:"uint128"},{internalType:"bool",name:"flashLoanEnabled",type:"bool"},{internalType:"uint256",name:"debtCeiling",type:"uint256"},{internalType:"uint256",name:"debtCeilingDecimals",type:"uint256"},{internalType:"uint8",name:"eModeCategoryId",type:"uint8"},{internalType:"uint256",name:"borrowCap",type:"uint256"},{internalType:"uint256",name:"supplyCap",type:"uint256"},{internalType:"uint16",name:"eModeLtv",type:"uint16"},{internalType:"uint16",name:"eModeLiquidationThreshold",type:"uint16"},{internalType:"uint16",name:"eModeLiquidationBonus",type:"uint16"},{internalType:"address",name:"eModePriceSource",type:"address"},{internalType:"string",name:"eModeLabel",type:"string"},{internalType:"bool",name:"borrowableInIsolation",type:"bool"}],internalType:"struct IUiPoolDataProviderV3.AggregatedReserveData[]",name:"",type:"tuple[]"},{components:[{internalType:"uint256",name:"marketReferenceCurrencyUnit",type:"uint256"},{internalType:"int256",name:"marketReferenceCurrencyPriceInUsd",type:"int256"},{internalType:"int256",name:"networkBaseTokenPriceInUsd",type:"int256"},{internalType:"uint8",name:"networkBaseTokenPriceDecimals",type:"uint8"}],internalType:"struct IUiPoolDataProviderV3.BaseCurrencyInfo",name:"",type:"tuple"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"contract IPoolAddressesProvider",name:"provider",type:"address"}],name:"getReservesList",outputs:[{internalType:"address[]",name:"",type:"address[]"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"contract IPoolAddressesProvider",name:"provider",type:"address"},{internalType:"address",name:"user",type:"address"}],name:"getUserReservesData",outputs:[{components:[{internalType:"address",name:"underlyingAsset",type:"address"},{internalType:"uint256",name:"scaledATokenBalance",type:"uint256"},{internalType:"bool",name:"usageAsCollateralEnabledOnUser",type:"bool"},{internalType:"uint256",name:"stableBorrowRate",type:"uint256"},{internalType:"uint256",name:"scaledVariableDebt",type:"uint256"},{internalType:"uint256",name:"principalStableDebt",type:"uint256"},{internalType:"uint256",name:"stableBorrowLastUpdateTimestamp",type:"uint256"}],internalType:"struct IUiPoolDataProviderV3.UserReserveData[]",name:"",type:"tuple[]"},{internalType:"uint8",name:"",type:"uint8"}],stateMutability:"view",type:"function"},{inputs:[],name:"marketReferenceCurrencyPriceInUsdProxyAggregator",outputs:[{internalType:"contract IEACAggregatorProxy",name:"",type:"address"}],stateMutability:"view",type:"function"},{inputs:[],name:"networkBaseTokenPriceInUsdProxyAggregator",outputs:[{internalType:"contract IEACAggregatorProxy",name:"",type:"address"}],stateMutability:"view",type:"function"}];var Ee="0x1b02E051683b5cfaC5929C25E84adb26ECf87B38",ye="0x112b087b60C1a166130d59266363C45F8aa99db0",be="0xf3Ba4D1b50f78301BDD7EAEa9B67822A15FCA691",ke=1000000n,ii=5,br=BigInt("0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");var Lt=class{client;constructor(t){this.client=t.getWsProvider()}async getBlockTimestamp(){let t=await this.client.getBlock();return Number(t.timestamp)}async getReservesData(){return await this.client.readContract({abi:ge,address:ye,args:[be],functionName:"getReservesData"})}async getUserReservesData(t){return await this.client.readContract({abi:ge,address:ye,args:[be,t],functionName:"getUserReservesData"})}async getUserAccountData(t){return await this.client.readContract({abi:Fe,address:Ee,args:[t],functionName:"getUserAccountData"})}};var tt=J(require("big.js"));var P={};I(P,{asBigInt:()=>fr,toBigInt:()=>Pr,toDecimal:()=>hr});var rt=J(require("big.js"));rt.default.NE=-18;function hr(u,t,e=6,n){let r=(0,rt.default)(u.toString()),i=(0,rt.default)(10).pow(t);return r.div(i).round(e,n).toString()}function Pr(u,t){let e=(0,rt.default)(10).pow(t),r=(0,rt.default)(u).mul(e).toFixed(0,rt.default.roundDown);return BigInt(r)}function fr(u){return BigInt(u.round(0,rt.default.roundDown).toFixed(0))}var mt={};I(mt,{ERC20:()=>Ce});var Ce=class{static fromAssetId(t){let e=Buffer.alloc(20,0);return e[15]=1,e.writeUInt32BE(t,16),"0x"+e.toString("hex")}static toAssetId(t){let e=Buffer.from(t.replace("0x",""),"hex");return e.length!==20||!this.isAssetAddress(t)?null:e.readUInt32BE(16)}static isAssetAddress(t){let e=Buffer.from("0000000000000000000000000000000100000000","hex"),n=Buffer.from(t.replace("0x",""),"hex");return n.length!==20?!1:n.subarray(0,16).equals(e.subarray(0,16))}};var O={};I(O,{FeeUtils:()=>Ne,shiftNeg:()=>wr});var Bn=J(require("big.js"));var qe={};I(qe,{HUB_ASSET_ID:()=>Le,HYDRATION_OMNIPOOL_ADDRESS:()=>Tr,HYDRATION_PARACHAIN_ID:()=>Sr,HYDRATION_SS58_PREFIX:()=>q,PERBILL_DENOMINATOR:()=>De,PERMILL_DENOMINATOR:()=>qt,RUNTIME_DECIMALS:()=>_,SYSTEM_ASSET_DECIMALS:()=>Me,SYSTEM_ASSET_ID:()=>L,TRADEABLE_DEFAULT:()=>St});var _=18,qt=1e6,De=1e9,L=0,Me=12,Sr=2034,q=63,Tr="7L53bUTBbfuj14UpdCNPwmgzzHSsrsTWBHX5pys32mVWM3C1",Le=1,St=15;var Ne=class u{static toPct(t){let[e,n]=t;return u.safeDivide(e*100,n)}static toRaw(t){let[e,n]=t;return u.safeDivide(e,n)}static fromPermill(t){return[t,1e6]}static fromPerbill(t){return[t,1e9]}static fromRate(t,e){return[t,e]}static safeDivide(t,e,n=12){let r=10**n;return Math.round(t*r/e)/r}static safeRound(t){return parseFloat(t.toPrecision(15))}};function wr(u,t){let e=(0,Bn.default)(typeof u=="bigint"?u.toString():u);return t===0?e.toString():e.div(Math.pow(10,t)).toString()}var Nt={};I(Nt,{H160:()=>He,isEvmAccount:()=>_n,isEvmAddress:()=>Rn,isSs58Address:()=>Fn});var Tt=require("polkadot-api"),Ge=require("@polkadot-api/utils"),Z=require("buffer");var Ue="ETH\0";function _n(u){if(!u)return!1;try{let t=(0,Tt.AccountId)().enc(u),e=Z.Buffer.from(Ue);return Z.Buffer.from(t.subarray(0,e.length)).equals(e)}catch{return!1}}function Rn(u){return!!/^0x[a-fA-F0-9]{40}$/.test(u)}function Fn(u){try{return(0,Tt.AccountId)(63).enc(u),!0}catch{return!1}}var He=class u{static toAccount=t=>{let e=Z.Buffer.from(t.slice(2),"hex"),n=Z.Buffer.from(Ue),r=Uint8Array.from(Z.Buffer.concat([n,e,Z.Buffer.alloc(8)])),i=(0,Ge.toHex)(r);return(0,Tt.AccountId)(63).dec(i)};static fromAccount=t=>{let e=(0,Tt.AccountId)().enc(t),n=Z.Buffer.from(Ue),r=e.slice(n.length,-8);return"0x"+Z.Buffer.from(r).toString("hex")};static fromSS58=t=>{let n=(0,Tt.AccountId)().enc(t).slice(0,20);return(0,Ge.toHex)(n)};static fromAny=t=>{if(Rn(t))return t;if(_n(t))return u.fromAccount(t);if(Fn(t))return u.fromSS58(t);throw new Error("Unknown address type")}};var it={};I(it,{findNestedKey:()=>xr,findNestedObj:()=>Ir,jsonFormatter:()=>vr});var xr=(u,t)=>{let e=[];return JSON.stringify(u,(n,r)=>(r&&r[t]&&e.push(r),r)),e[0]},Ir=(u,t,e)=>{let n;return JSON.stringify(u,(r,i)=>(i&&i[t]===e&&(n=i),i)),n},vr=(u,t)=>typeof t=="bigint"?t.toString():t;var A={};I(A,{calculateBuyFee:()=>_r,calculateDiffToAvg:()=>Or,calculateDiffToRef:()=>Ar,calculateSellFee:()=>Br,getFraction:()=>Rr});var K=J(require("big.js"));function Or(u,t){let e=(0,K.default)(u.toString()),n=(0,K.default)(t.toString());return e.minus(n).abs().div(e.plus(n).div(2)).mul(100).round(2).toNumber()}function Ar(u,t){if(t===0n)return 0;let e=(0,K.default)(u.toString()),n=(0,K.default)(t.toString());return e.minus(n).div(n).mul(100).round(2).toNumber()}function Br(u,t){let e=(0,K.default)(u.toString()),n=(0,K.default)(t.toString());return(0,K.default)(1).minus(n.div(e)).mul(100).round(2).toNumber()}function _r(u,t){let e=(0,K.default)(u.toString());return(0,K.default)(t.toString()).div(e).minus(1).mul(100).round(2).toNumber()}function Rr(u,t,e=2){(t<.01||t>100)&&new Error("Supported range is from 0.01% - 100%");let n=Math.pow(10,e),r=BigInt(t*n);return u*r/BigInt(100*n)}var Ve={};I(Ve,{convertToId:()=>Fr});var En=require("buffer");function Fr(u){let e=En.Buffer.from(u.replace("0x",""),"hex").subarray(16);return e.readUIntBE(0,e.length)}var{ERC20:he}=mt,{H160:We}=Nt,Er=1.01,kr=31536000n,Pe=10n**27n,pt=class{client;constructor(t){this.client=new Lt(t)}async getSummary(t){let e=We.fromAny(t),[n,r,i,a]=await Promise.all([this.client.getReservesData(),this.client.getUserReservesData(e),this.client.getUserAccountData(e),this.client.getBlockTimestamp()]),[s]=n,[o,l]=r,[c,m,d,p,g,b]=i,y=P.toDecimal(b,18),h=[];for(let f of o){let S=f.underlyingAsset.toLowerCase(),T=s.find(({underlyingAsset:_e})=>_e.toLowerCase()===S);if(!T)throw new Error("Missing pool reserve for "+S);let N=f.scaledATokenBalance,V=T.liquidityIndex,C=T.liquidityRate,G=T.availableLiquidity,lt=T.priceInMarketReferenceCurrency,ct=a+6,X=this.calculateLinearInterest(C,T.lastUpdateTimestamp,ct),nt=V*X/Pe,Ct=N*nt/Pe,ce=Number(l!==0&&l===T.eModeCategoryId?T.eModeLiquidationThreshold:T.reserveLiquidationThreshold)/1e4,ue=T.usageAsCollateralEnabled&&f.usageAsCollateralEnabledOnUser&&f.scaledATokenBalance>0n,me=he.toAssetId(S);h.push({aTokenBalance:Ct,availableLiquidity:G,decimals:Number(T.decimals),isCollateral:ue,priceInRef:lt,reserveId:me,reserveAsset:S,reserveLiquidationThreshold:ce})}return{healthFactor:Number(y),totalCollateral:c,totalDebt:m,reserves:h}}async hasBorrowPositions(t){let e=We.fromAny(t),n=await this.client.getUserAccountData(e),[r,i]=n;return i>0n}async getHealthFactor(t){let e=We.fromAny(t),n=await this.client.getUserAccountData(e),[r,i,a,s,o,l]=n,c=P.toDecimal(l,18);return Number(c)}async getHealthFactorAfterWithdraw(t,e,n){let{totalCollateral:r,totalDebt:i,reserves:a}=await this.getSummary(t),s=he.fromAssetId(e),o=a.find(h=>h.reserveAsset===s);if(!o)throw new Error("Missing reserve ctx for "+s);let{decimals:l,isCollateral:c,priceInRef:m,reserveLiquidationThreshold:d}=o,p=P.toBigInt(n,l),g=c?p*m/10n**BigInt(l):0n,b=r-g;if(b<=0n)return 0;let y=(0,tt.default)(b.toString()).mul(d).div(i.toString()).toFixed(6,tt.default.roundDown);return Number(y)}async getHealthFactorAfterSupply(t,e,n){let{totalCollateral:r,totalDebt:i,reserves:a}=await this.getSummary(t),s=he.fromAssetId(e),o=a.find(y=>y.reserveAsset===s);if(!o)throw new Error("Missing reserve ctx for "+s);let{decimals:l,priceInRef:c,reserveLiquidationThreshold:m}=o,p=P.toBigInt(n,l)*c/10n**BigInt(l),g=r+p;if(g<=0n)return 0;let b=(0,tt.default)(g.toString()).mul(m).div(i.toString()).toFixed(6,tt.default.roundDown);return Number(b)}async getMaxWithdraw(t,e){let{totalDebt:n,reserves:r,healthFactor:i}=await this.getSummary(t),a=he.fromAssetId(e),s=r.find(o=>o.reserveAsset===a);if(!s)throw new Error("Missing reserve ctx for "+a);return this.calculateWithdrawMax(s,n,i)}async getMaxWithdrawAll(t){let{totalDebt:e,reserves:n,healthFactor:r}=await this.getSummary(t),i={};for(let a of n){let s=this.calculateWithdrawMax(a,e,r);a.reserveId&&(i[a.reserveId]=s)}return i}calculateWithdrawMax(t,e,n){let{aTokenBalance:r,availableLiquidity:i,decimals:a,priceInRef:s,reserveLiquidationThreshold:o,isCollateral:l}=t,c=r;if(l&&e>0n){let d=n-Er;if(d>0){let p=(0,tt.default)(d).mul(e.toString()).div(o).toFixed(0,tt.default.roundDown),g=(0,tt.default)(p).div(s.toString()).mul(10**a).toFixed(0,tt.default.roundDown);c=r<BigInt(g)?r:BigInt(g)}else c=0n}return{amount:c<i?c:i,decimals:a}}calculateLinearInterest(t,e,n){let r=n-e;if(r<=0)return Pe;let i=t*BigInt(r)/kr;return Pe+i}};var Xe={};I(Xe,{AssetClient:()=>wt,BalanceClient:()=>z,ChainParams:()=>xt});var wt=class extends D{SUPPORTED_TYPES=["StableSwap","Bond","Token","External","Erc20"];constructor(t){super(t)}async queryShares(){let e=await this.api.query.Stableswap.Pools.getEntries();return new Map(e.map(({keyArgs:n,value:r})=>{let[i]=n;return[i,r]}))}async queryBonds(){let e=await this.api.query.Bonds.Bonds.getEntries();return new Map(e.map(({keyArgs:n,value:r})=>{let[i]=n;return[i,r]}))}async queryAssets(){let e=await this.api.query.AssetRegistry.Assets.getEntries();return new Map(e.filter(({value:n})=>{let{asset_type:r}=n;return this.SUPPORTED_TYPES.includes(r.type)}).map(({keyArgs:n,value:r})=>{let[i]=n;return[i,r]}))}async queryAssetLocations(){let e=await this.api.query.AssetRegistry.AssetLocations.getEntries();return new Map(e.map(({keyArgs:n,value:r})=>{let[i]=n;return[i,r]}))}async mapToken(t,e,n,r){let{name:i,asset_type:a,is_sufficient:s,existential_deposit:o}=e,{symbol:l,decimals:c}=n.get(t)??{};return{id:t,name:i?.asText(),symbol:l,decimals:c,icon:l,type:a.type,isSufficient:s,location:r,existentialDeposit:o}}async mapBond(t,e,n,r){let[i,a]=r,{asset_type:s,is_sufficient:o,existential_deposit:l}=e,{symbol:c,decimals:m}=await this.mapToken(i,e,n),d=Number(a),p=new Intl.DateTimeFormat("en-GB"),g=[c,"Bond",p.format(d)].join(" ");return{id:t,name:g,symbol:c+"b",decimals:m,icon:c,type:s.type,isSufficient:o,existentialDeposit:l,underlyingAssetId:i,maturity:d}}async mapShares(t,e,n,r){let{assets:i}=r,{name:a,symbol:s,asset_type:o,is_sufficient:l,existential_deposit:c}=e,m=await Promise.all(i.map(async g=>{let{symbol:b}=await this.mapToken(g,e,n);return[g,b]})),d=Object.fromEntries(m),p=Object.values(d);return{id:t,name:p.join(", "),symbol:s?.asText()||a?.asText(),decimals:18,icon:p.join("/"),type:o.type,isSufficient:l,existentialDeposit:c,meta:d}}async mapExternal(t,e,n,r){let i=await this.mapToken(t,e,new Map,r),a=n?.find(s=>s.internalId===i.id);return a?{...i,decimals:a.decimals,name:a.name,symbol:a.symbol,icon:a.symbol,isWhiteListed:a.isWhiteListed}:i}parseMetadata(t){return new Map(Array.from(t,([e,n])=>[e,{symbol:n.symbol?.asText(),decimals:n.decimals}]))}async getOnChainAssets(t,e){let[n,r,i,a]=await Promise.all([this.queryAssets(),this.queryAssetLocations(),this.queryShares(),this.queryBonds()]),s=this.parseMetadata(n),o=[];for(let[l,c]of Array.from(n)){let m=r.get(l),{asset_type:d}=c,p;switch(d.type){case"Bond":let g=a.get(l);p=await this.mapBond(l,c,s,g);break;case"StableSwap":let b=i.get(l);p=await this.mapShares(l,c,s,b);break;case"External":p=await this.mapExternal(l,c,e,m);break;default:p=await this.mapToken(l,c,s,m)}o.push(p)}return t?o:o.filter(l=>this.isValidAsset(l))}isValidAsset(t){let e=Math.sign(t.decimals);return!!t.symbol&&(e===0||e===1)}};var x=require("rxjs");var z=class extends D{constructor(t){super(t)}async getBalance(t,e){return e===0?this.getSystemBalance(t):this.getTokenBalanceData(t,e)}async getSystemBalance(t){let e=this.api.query.System.Account,{data:n}=await e.getValue(t);return this.calculateBalance(n)}async getTokenBalance(t,e){let r=await this.api.query.Tokens.Accounts.getValue(t,e);return this.calculateBalance(r)}calculateBalance(t){let e=t.free>=t.frozen?t.free-t.frozen:0n,n=t.free+t.reserved;return{free:t.free,reserved:t.reserved,frozen:t.frozen,total:n,transferable:e}}async getErc20Balance(t,e){return this.getTokenBalanceData(t,e)}subscribeBalance(t){let e=this.subscribeSystemBalance(t),n=this.subscribeTokensBalance(t),r=this.subscribeErc20Balance(t);return(0,x.combineLatest)([e,n,r]).pipe((0,x.debounceTime)(250),(0,x.map)(i=>i.flat()),(0,x.startWith)([]),(0,x.bufferCount)(2,1),(0,x.map)(([i,a],s)=>{if(s===0)return a;let o=i.reduce((c,m)=>(c.set(m.id,m.balance),c),new Map);return a.filter(c=>!kn(c.balance,o.get(c.id)))}))}subscribeSystemBalance(t){return this.api.query.System.Account.watchValue(t,"best").pipe((0,x.map)(n=>({id:0,balance:this.calculateBalance(n.data)})))}subscribeTokenBalance(t,e){return this.api.query.Tokens.Accounts.watchValue(t,e,"best").pipe((0,x.map)(r=>({id:e,balance:r})))}subscribeTokensBalance(t){return this.api.query.Tokens.Accounts.watchEntries(t,{at:"best"}).pipe((0,x.distinctUntilChanged)((n,r)=>!r.deltas),(0,x.map)(({deltas:n})=>{let r=[];return n?.deleted.forEach(i=>{let[a,s]=i.args;r.push({id:s,balance:this.calculateBalance({free:0n,reserved:0n,frozen:0n})})}),n?.upserted.forEach(i=>{let[a,s]=i.args;r.push({id:s,balance:this.calculateBalance(i.value)})}),r}))}subscribeErc20Balance(t,e){let n=new x.Subject,r=n.pipe((0,x.shareReplay)(1)),i=async()=>(await this.api.query.AssetRegistry.Assets.getEntries()).filter(({value:l})=>{let{asset_type:c}=l;return c.type==="Erc20"}).map(({keyArgs:l})=>{let[c]=l;return c}),a=async()=>{let o=e||await i(),l=async()=>{let d=(await Promise.all(o.map(async p=>{let g=await this.getTokenBalanceData(t,p);return[p,g]}))).map(([p,g])=>({id:p,balance:g}));n.next(d)};await l();let c=this.api.query.System.Number.watchValue("best").subscribe(l);return()=>c.unsubscribe()},s;return a().then(o=>s=o),r.pipe((0,x.finalize)(()=>s?.()),(0,x.pairwise)(),(0,x.map)(([o,l],c)=>{if(c===0)return l;let m=o.reduce((p,g)=>(p.set(g.id,g.balance),p),new Map);return l.filter(p=>!kn(p.balance,m.get(p.id)))}),(0,x.distinctUntilChanged)((o,l)=>l.length===0))}async getTokenBalanceData(t,e){let n=await this.api.apis.CurrenciesApi.account(e,t);return this.calculateBalance(n)}},kn=(u,t)=>u!==void 0&&t!==void 0&&u.transferable===t.transferable&&u.total===t.total;var xt=class extends D{_minOrderBudget;_blockTime;constructor(t){super(t)}async getBlockTime(){if(this._blockTime===void 0){let t=await this.api.constants.Aura.SlotDuration();this._blockTime=Number(t)}return this._blockTime}async getMinOrderBudget(){return this._minOrderBudget===void 0&&(this._minOrderBudget=await this.api.constants.DCA.MinBudgetInNativeCurrency()),this._minOrderBudget}};var ze={};I(ze,{AssetNotFound:()=>Ke,PoolNotFound:()=>Gt,RouteNotFound:()=>Ut});var Ke=class extends Error{constructor(t){super(),this.message=`${t} not found`,this.name="AssetNotFound"}},Gt=class extends Error{constructor(t){super(),this.message=`${t} pool invalid`,this.name="PoolNotFound"}},Ut=class extends Error{constructor(t,e){super(),this.message=`Route from ${t} to ${e} not found in current configuration`,this.name="RouteNotFound"}};var $e={};I($e,{EvmClient:()=>Ht,createChain:()=>je});var Cn=require("viem"),Cr=["https://hydration-rpc.n.dwellir.com","https://hydration.dotters.network","https://rpc.helikon.io/hydradx","https://hydration.ibp.network","https://rpc.cay.hydration.cloud","https://rpc.parm.hydration.cloud","https://rpc.roach.hydration.cloud","https://rpc.zipp.hydration.cloud","https://rpc.sin.hydration.cloud","https://rpc.coke.hydration.cloud"],je=()=>(0,Cn.defineChain)({id:222222,name:"Hydration",network:"hydration",nativeCurrency:{decimals:18,name:"WETH",symbol:"WETH"},rpcUrls:{default:{http:Cr}},blockExplorers:{default:{name:"Hydration Explorer",url:"https://hydration.subscan.io"}},testnet:!1});var j=require("viem");var Ht=class{client;chain;constructor(t){this.client=t,this.chain=je()}get chainId(){return this.chain.id}get chainCurrency(){return this.chain.nativeCurrency.symbol}get chainDecimals(){return this.chain.nativeCurrency.decimals}getProvider(){return(0,j.createPublicClient)({chain:this.chain,transport:(0,j.http)()})}getWsProvider(){return(0,j.createPublicClient)({transport:(0,j.custom)({request:({method:t,params:e})=>this.client._request(t,e||[])})})}getSigner(t){return(0,j.createWalletClient)({account:t,chain:this.chain,transport:(0,j.custom)(window.ethereum)})}};var tn={};I(tn,{LiquidityMiningApi:()=>Vt,LiquidityMiningClient:()=>Wt});var Ln=require("polkadot-api"),M=J(require("big.js")),Ze=require("@galacticcouncil/math-liquidity-mining");var fe=class{result=new Map;getKey(t,e){return[e,t.toString()].join(",")}constructor(t,e){for(let n=0;n<t.length;++n){let[r,i]=t[n];this.result.set(this.getKey(i,r),e[n].free)}}freeBalance(t,e){return this.result.get(this.getKey(t,e))??0n}transfer(t,e,n,r){let i=this.getKey(t,e),a=this.getKey(t,n),s=this.result.get(i)??0n,o=this.result.get(a)??0n;if(s<r)throw new Error("Attempting to transfer more than is present");this.result.set(i,s+r),this.result.set(a,o+r)}};var st=J(require("big.js")),W=require("@galacticcouncil/math-liquidity-mining");var Qe=J(require("big.js")),Je=(0,Qe.default)(10).pow(18),Dn=BigInt((0,Qe.default)(1).pow(18).toString()),Mn=6e3;var Dr="1000000000000000000",Se=class{constructor(t,e,n){this.getAccount=t;this.getAsset=e;this.multiCurrency=n}async syncGlobalFarm(t,e,n){if(t.state.type!=="Active"||t.updated_at===e)return null;if(t.total_shares_z===0n)return t;let r=await this.getAsset(t.reward_currency),i=e-t.updated_at,a=this.getAccount(t.id),s=r?.existential_deposit;if(!s)throw new Error("Missing reward currency asset list");let o=this.multiCurrency.freeBalance(t.reward_currency,a),l=(0,st.default)(s.toString()),c=(0,st.default)(o.toString()).minus(l.lt(o.toString())?s.toString():o.toString()),m=(0,st.default)((0,W.calculate_global_farm_rewards)(t.total_shares_z.toString(),n.toString(),(0,st.default)(t.yield_per_period.toString()).mul(Je).round(0,st.default.roundDown).toFixed(),t.max_reward_per_period.toString(),i.toFixed()));if(c.lt(m)&&(m=c),m.eq(0))return t;let d=this.getAccount(0);return this.multiCurrency.transfer(t.reward_currency,a,d,BigInt(m.toFixed())),{...t,accumulated_rpz:BigInt((0,W.calculate_accumulated_rps)(t.accumulated_rpz.toString(),t.total_shares_z.toString(),m.toFixed()))}}syncYieldFarm(t,e,n){if(t.state.type!=="Active"||t.updated_at===n)return null;if(t.total_valued_shares===0n)return{...t,updated_at:n};let r=(0,W.calculate_yield_farm_delta_rpvs)(t.accumulated_rpz.toString(),e.accumulated_rpz.toString(),t.multiplier.toString(),t.total_valued_shares.toString());return{...t,accumulated_rpvs:t.accumulated_rpvs+BigInt(r),updated_at:n}}getLoyaltyMultiplier(t,e){let n=(0,st.default)(1).mul(Je).round(0,st.default.roundDown).toString();if(!e)return n;let{initial_reward_percentage:r,scale_coef:i}=e;return(0,W.calculate_loyalty_multiplier)(t.toFixed(),r.toString(),i.toFixed())}async claimRewards(t,e,n,r,i){if(e.state.type==="Terminated")return null;let a=Math.floor(r/t.blocks_per_period);if(n.updated_at===a)return null;let s=await this.syncGlobalFarm(t,a,i);if(!s)return null;let o=this.syncYieldFarm(e,s,a);if(!o)return null;let l=o.total_stopped-n.stopped_at_creation,c=o.updated_at-n.entered_at-l,m=this.getLoyaltyMultiplier(c,o.loyalty_curve),d=BigInt((0,W.calculate_user_reward)(n.accumulated_rpvs.toString(),n.valued_shares.toString(),n.accumulated_claimed_rewards.toString(),o.accumulated_rpvs.toString(),m)),p=BigInt((0,W.calculate_user_reward)(n.accumulated_rpvs.toString(),n.valued_shares.toString(),n.accumulated_claimed_rewards.toString(),o.accumulated_rpvs.toString(),Dr));return{reward:d,maxReward:p,assetId:s.reward_currency}}};var Mr=(0,M.default)(365.2425).times(24).times(60).times(60),Vt=class{client;balanceClient;options;constructor(t,e,n={}){this.client=t,this.balanceClient=e,this.options=Object.freeze({blockTime:n.blockTime??Mn})}get blockTime(){return this.options.blockTime}async getOraclePrice(t,e){let n=[t,e].sort((i,a)=>i-a);if(t===e)return Dn;let r=await this.client.getOraclePrice(n);if(r){let{n:i,d:a}=r[0].price,s;return t<e?s=(0,Ze.fixed_from_rational)(i.toString(),a.toString()):s=(0,Ze.fixed_from_rational)(a.toString(),i.toString()),BigInt(s)}}getFarmAddress=(t,e)=>{let n=Buffer.from("modl","utf-8"),r=Buffer.from(e?"78796b4c4d704944":"4f6d6e6957684c4d","hex"),i=Buffer.from([t]),a=Buffer.concat([n,r,i]),o="0x"+Buffer.concat([a,Buffer.alloc(32-a.length)]).toString("hex");return(0,Ln.AccountId)(63).dec(o)};getGlobalRewardPerPeriod(t,e,n,r){let i=(0,M.default)(r).times(t.toString()).times(e.toString()).div(18);return i.gte(n.toString())?n.toString():i.toString()}getPoolYieldPerPeriod(t,e,n,r){let i=(0,M.default)(t.toString()).times(e),a=(0,M.default)(n.toString()).times(r);return i.div(a.toString()).toString()}farmData(t,e,n){let{yieldFarm:r,globalFarm:i,priceAdjustment:a,balance:s,id:o}=t,{multiplier:l,loyalty_curve:c}=r,{blocks_per_period:m,yield_per_period:d,total_shares_z:p,max_reward_per_period:g,pending_rewards:b,accumulated_paid_rewards:y,planned_yielding_periods:h,updated_at:f,incentivized_asset:S,reward_currency:T,price_adjustment:N,min_deposit:V}=i,C=O.shiftNeg(a??N,18),G=O.shiftNeg(l,18),lt=O.shiftNeg(c?.initial_reward_percentage??0,18),ct=Mr.div((0,M.default)(this.blockTime).div(1e3).times(m)).toString(),X;if(p<=0)X=(0,M.default)(G).times(d.toString()).times(ct).toString();else{let or=this.getGlobalRewardPerPeriod(p,d,g,C),lr=this.getPoolYieldPerPeriod(or,G,p,C);X=(0,M.default)(lr).times(ct).toString()}let nt=b+y,Ct=g*BigInt(h),ut=s.transferable+nt,fn=ut-nt,ce=(0,M.default)(fn.toString()).div(g.toString()),ue=(0,M.default)(e).div(m.toString()).toString(),me=(p>=0?ce.plus(f):ce.plus(ue)).toString(),_e=(0,M.default)(me).times(m).toString(),sr=(0,M.default)(p.toString()).div((0,M.default)(g.toString()).div(d.toString())).div(Math.pow(10,18)).times(100).times(C).toFixed(2),Sn=(0,M.default)(nt.toString()).div(ut.toString()).gte(.999);X=Sn?"0":(0,M.default)(X).div(n?2:1).times(100).toString();let ar=lt?(0,M.default)(X).times(lt).toString():void 0;return{apr:X,minApr:ar,isDistributed:Sn,estimatedEndPeriod:me,estimatedEndBlock:_e,maxRewards:Ct,incentivizedAsset:S,rewardCurrency:T,loyaltyCurve:c,currentPeriod:ue,potMaxRewards:ut,fullness:sr,yieldFarmId:r.id,globalFarmId:i.id,poolId:o,distributedRewards:nt,plannedYieldingPeriods:h,minDeposit:V}}async getAllOmnipoolFarms(){let e=(await this.client.getAllOmnipooFarms()).reduce((r,i)=>r.includes(i.keyArgs[0].toString())?r:[...r,i.keyArgs[0].toString()],[]),n=await Promise.all(e.map(async r=>{let i=await this.getOmnipoolFarms(r);if(i)return[r,i]}));return Object.fromEntries(n.filter(r=>!!r))}async getOmnipoolFarms(t){let e=await this.client.getOmnipooFarms(Number(t)),n=await this.client.getRelayBlockNumber(),r=await Promise.all(e.map(async({keyArgs:i,value:a})=>{let[,s]=i,o=a,l=await this.client.getOmnipoolGlobalFarm(s),c=await this.client.getOmnipoolYieldFarm(Number(t),s,o);if(!l||!c)return;let m=l.reward_currency,d=l.incentivized_asset,p=this.getFarmAddress(s),g=await this.getOraclePrice(m,d),b=await this.balanceClient.getBalance(p,m);return{id:t,globalFarm:l,yieldFarm:c,priceAdjustment:g,balance:b}}));return n?r.map(i=>i?this.farmData(i,n):void 0):[]}async getAllIsolatedFarms(){let e=(await this.client.getAllIsolatedFarms()).reduce((r,i)=>r.includes(i.keyArgs[0].toString())?r:[...r,i.keyArgs[0].toString()],[]),n=await Promise.all(e.map(async r=>{let i=await this.getIsolatedFarms(r);if(i)return[r,i]}));return Object.fromEntries(n.filter(r=>!!r))}async getIsolatedFarms(t){let e=await this.client.getIsolatedFarms(t),n=await this.client.getRelayBlockNumber(),r=await Promise.all(e.map(async({keyArgs:i,value:a})=>{let[,s]=i,o=a,l=await this.client.getIsolatedGlobalFarm(s),c=await this.client.getIsolatedYieldFarm(t,s,o);if(!l||!c)return;let m=l.reward_currency,d=l.incentivized_asset,p=this.getFarmAddress(s,!0),g=await this.getOraclePrice(m,d),b=await this.balanceClient.getBalance(p,m);return{id:t,globalFarm:l,yieldFarm:c,priceAdjustment:g,balance:b,farmAddress:p}}));return n?r.map(i=>i?this.farmData(i,n,!0):void 0):[]}async getDepositReward(t,e,n,r){let i=e.global_farm_id,a=e.yield_farm_id,s=n?await this.client.getIsolatedYieldFarm(t,i,a):await this.client.getOmnipoolYieldFarm(Number(t),i,a),o=n?await this.client.getIsolatedGlobalFarm(i):await this.client.getOmnipoolGlobalFarm(i);if(!o||!s)return;let l=o.reward_currency,c=o.incentivized_asset,m=[[this.getFarmAddress(0,n),o.reward_currency],[this.getFarmAddress(o.id,n),o.reward_currency]],d=await this.getAccountAssetBalances(m),p=await this.getOraclePrice(l,c),g=new fe(m,d),y=await new Se(f=>this.getFarmAddress(f),f=>this.client.getAsset(f),g).claimRewards(o,s,e,r,p??o.price_adjustment);if(!y)return;let h=await this.client.getAsset(y.assetId);if(h&&!(y.reward<=h.existential_deposit))return y}async getAccountAssetBalances(t){let[e,n]=await Promise.all([Promise.all(t.filter(([i,a])=>a!==0).map(([i,a])=>this.balanceClient.getTokenBalance(i,a))),Promise.all(t.filter(([i,a])=>a===0).map(([i])=>this.balanceClient.getSystemBalance(i)))]),r=[];for(let i=0,a=0;i+a<t.length;){let s=i+a,[,o]=t[s];o===0?(r.push(n[a]),a+=1):(r.push(e[i]),i+=1)}return r}};var Te=require("polkadot-api"),Wt=class extends D{omnipoolAssetIds=[];async getOraclePrice(t){return await this.api.query.EmaOracle.Oracles.getValue(Te.Binary.fromText("omnipool"),t,(0,Te.Enum)("TenMinutes"))}async getRelayBlockNumber(){return(await this.api.query.ParachainSystem.ValidationData.getValue())?.relay_parent_number}async getAllOmnipooFarms(){return this.api.query.OmnipoolWarehouseLM.ActiveYieldFarm.getEntries()}async getOmnipooFarms(t){return this.api.query.OmnipoolWarehouseLM.ActiveYieldFarm.getEntries(t)}async getOmnipoolGlobalFarm(t){return this.api.query.OmnipoolWarehouseLM.GlobalFarm.getValue(t)}async getOmnipoolYieldFarm(t,e,n){return this.api.query.OmnipoolWarehouseLM.YieldFarm.getValue(t,e,n)}async getAllIsolatedFarms(){return this.api.query.XYKWarehouseLM.ActiveYieldFarm.getEntries()}async getIsolatedFarms(t){return this.api.query.XYKWarehouseLM.ActiveYieldFarm.getEntries(t)}async getIsolatedGlobalFarm(t){return this.api.query.XYKWarehouseLM.GlobalFarm.getValue(t)}async getIsolatedYieldFarm(t,e,n){return this.api.query.XYKWarehouseLM.YieldFarm.getValue(t,e,n)}async getAsset(t){return this.api.query.AssetRegistry.Assets.getValue(t)}};var ln={};I(ln,{PoolContextProvider:()=>Bt,PoolError:()=>dt,PoolFactory:()=>At,PoolType:()=>E,aave:()=>on,lbp:()=>nn,omni:()=>rn,stable:()=>sn,xyk:()=>an});var nn={};I(nn,{LbpMath:()=>Y,LbpPool:()=>Yt,LbpPoolClient:()=>Kt});var $=require("@galacticcouncil/math-lbp"),Y=class{static getSpotPrice(t,e,n,r,i){return(0,$.get_spot_price)(t,e,n,r,i)}static calculateInGivenOut(t,e,n,r,i){return(0,$.calculate_in_given_out)(t,e,n,r,i)}static calculateOutGivenIn(t,e,n,r,i){return(0,$.calculate_out_given_in)(t,e,n,r,i)}static calculateLinearWeights(t,e,n,r,i){return(0,$.calculate_linear_weights)(t,e,n,r,i)}static calculatePoolTradeFee(t,e,n){return(0,$.calculate_pool_trade_fee)(t,e,n)}};var E=(i=>(i.Aave="Aave",i.LBP="LBP",i.Omni="Omnipool",i.Stable="Stableswap",i.XYK="XYK",i))(E||{}),dt=(i=>(i.InsufficientTradingAmount="InsufficientTradingAmount",i.MaxInRatioExceeded="MaxInRatioExceeded",i.MaxOutRatioExceeded="MaxOutRatioExceeded",i.TradeNotAllowed="TradeNotAllowed",i.UnknownError="UnknownError",i))(dt||{});var{FeeUtils:qn}=O,Yt=class u{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;fee;repayFeeApply;static fromPool(t){return new u(t.address,t.tokens,t.maxInRatio,t.maxOutRatio,t.minTradingLimit,t.fee,t.repayFeeApply)}constructor(t,e,n,r,i,a,s){this.type="LBP",this.address=t,this.tokens=e,this.maxInRatio=n,this.maxOutRatio=r,this.minTradingLimit=i,this.fee=a,this.repayFeeApply=s}validatePair(t,e){return!0}parsePair(t,e){let n=new Map(this.tokens.map(a=>[a.id,a])),r=n.get(t),i=n.get(e);if(r==null)throw new Error("Pool does not contain tokenIn");if(i==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,balanceIn:r.balance,balanceOut:i.balance,decimalsIn:r.decimals,decimalsOut:i.decimals,weightIn:r.weight,weightOut:i.weight}}validateAndBuy(t,e,n){let r=this.tokens[0].id,i=[];e<this.minTradingLimit&&i.push("InsufficientTradingAmount");let a=t.balanceOut/this.maxOutRatio;if(e>a&&i.push("MaxOutRatioExceeded"),r===t.assetOut){let s=this.calculateTradeFee(e,n),o=qn.toPct(this.repayFeeApply?n.repayFee:n.exchangeFee),l=e+s,c=this.calculateInGivenOut(t,l),m=t.balanceIn/this.maxInRatio;return c>m&&i.push("MaxInRatioExceeded"),{amountIn:c,calculatedIn:c,amountOut:e,feePct:o,errors:i}}else{let s=this.calculateInGivenOut(t,e),o=t.balanceIn/this.maxInRatio;return s>o&&i.push("MaxInRatioExceeded"),{amountIn:s,calculatedIn:s,amountOut:e,feePct:0,errors:i}}}validateAndSell(t,e,n){let r=this.tokens[0].id,i=[];e<this.minTradingLimit&&i.push("InsufficientTradingAmount");let a=t.balanceIn/this.maxInRatio;if(e>a&&i.push("MaxInRatioExceeded"),r===t.assetIn){let s=this.calculateOutGivenIn(t,e),o=t.balanceOut/this.maxOutRatio;return s>o&&i.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:s,amountOut:s,feePct:0,errors:i}}else{let s=this.calculateOutGivenIn(t,e),o=this.calculateTradeFee(s,n),l=qn.toPct(this.repayFeeApply?n.repayFee:n.exchangeFee),c=s-o,m=t.balanceOut/this.maxOutRatio;return c>m&&i.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:s,amountOut:c,feePct:l,errors:i}}}calculateInGivenOut(t,e){let n=Y.calculateInGivenOut(t.balanceIn.toString(),t.balanceOut.toString(),t.weightIn.toString(),t.weightOut.toString(),e.toString()),r=BigInt(n);return r<0n?0n:r}calculateOutGivenIn(t,e){let n=Y.calculateOutGivenIn(t.balanceIn.toString(),t.balanceOut.toString(),t.weightIn.toString(),t.weightOut.toString(),e.toString()),r=BigInt(n);return r<0n?0n:r}spotPriceInGivenOut(t){let e=Y.getSpotPrice(t.balanceOut.toString(),t.balanceIn.toString(),t.weightOut.toString(),t.weightIn.toString(),this.maxOutRatio.toString());return BigInt(e)}spotPriceOutGivenIn(t){let e=Y.getSpotPrice(t.balanceIn.toString(),t.balanceOut.toString(),t.weightIn.toString(),t.weightOut.toString(),this.maxInRatio.toString());return BigInt(e)}calculateTradeFee(t,e){let n=Y.calculatePoolTradeFee(t.toString(),this.repayFeeApply?e.repayFee[0]:e.exchangeFee[0],this.repayFeeApply?e.repayFee[1]:e.exchangeFee[1]);return BigInt(n)}};var Gn=require("polkadot-api"),gt=require("rxjs");var Nn=(u,t=new Map)=>e=>{let n;return t.has(e)?t.get(e):(t.set(e,n=u(e)),n)};var v=require("rxjs");var en=[{inputs:[],name:"decimals",outputs:[{internalType:"uint8",name:"",type:"uint8"}],stateMutability:"view",type:"function"},{inputs:[],name:"description",outputs:[{internalType:"string",name:"",type:"string"}],stateMutability:"view",type:"function"},{inputs:[],name:"version",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"uint80",name:"_roundId",type:"uint80"}],name:"getRoundData",outputs:[{internalType:"uint80",name:"roundId",type:"uint80"},{internalType:"int256",name:"answer",type:"int256"},{internalType:"uint256",name:"startedAt",type:"uint256"},{internalType:"uint256",name:"updatedAt",type:"uint256"},{internalType:"uint80",name:"answeredInRound",type:"uint80"}],stateMutability:"view",type:"function"},{inputs:[],name:"latestRoundData",outputs:[{internalType:"uint80",name:"roundId",type:"uint80"},{internalType:"int256",name:"answer",type:"int256"},{internalType:"uint256",name:"startedAt",type:"uint256"},{internalType:"uint256",name:"updatedAt",type:"uint256"},{internalType:"uint80",name:"answeredInRound",type:"uint80"}],stateMutability:"view",type:"function"}];var Xt=class{client;constructor(t){this.client=t.getWsProvider()}async getData(t,e=6){let[n,r,i]=await Promise.all([this.client.readContract({abi:en,address:t,functionName:"latestRoundData"}),this.client.readContract({abi:en,address:t,functionName:"decimals"}),this.client.getBlock()]),[a,s,o,l]=n,c=i.number-(i.timestamp-l)/BigInt(e),m=Number(c);return{price:s,decimals:r,updatedAt:m<0?0:m}}};var U=class extends z{evm;mmOracle;override=[];mem=0;memPools=Nn(t=>(this.log(this.getPoolType(),"mem pools",t,"\u2705"),this.loadPools()));constructor(t,e){super(t),this.evm=e,this.mmOracle=new Xt(e)}async withOverride(t){this.override=t||[]}async getPoolsMem(){return this.memPools(this.mem)}async getPools(){let t=(0,v.from)(this.getPoolsMem()).pipe((0,v.switchMap)(e=>this.subscribe(e)),(0,v.combineLatestAll)());return(0,v.firstValueFrom)(t)}getSubscriber(){return(0,v.from)(this.getPoolsMem()).pipe((0,v.switchMap)(t=>this.subscribe(t)),(0,v.mergeAll)())}subscribe(t){return t.filter(e=>this.hasValidAssets(e)).map(e=>(0,v.combineLatest)([this.subscribePoolChange(e),this.subscribePoolBalance(e)]).pipe((0,v.debounceTime)(250),(0,v.map)(([n,r])=>this.updatePool(n,r))))}subscribePoolBalance(t){if(t.type==="Aave")return(0,v.of)([]);let e=[this.subscribeTokensBalance(t.address)];if(this.hasSystemAsset(t)){let n=this.subscribeSystemBalance(t.address);e.push(n)}if(this.hasErc20Asset(t)){let n=t.tokens.filter(i=>i.type==="Erc20").map(i=>i.id),r=this.subscribeErc20Balance(t.address,n);e.push(r)}return(0,v.combineLatest)(e).pipe((0,v.map)(n=>n.map(r=>Array.isArray(r)?r:[r]).flat()))}hasSystemAsset(t){return t.tokens.some(e=>e.id===0)}hasErc20Asset(t){return t.tokens.some(e=>e.type==="Erc20")}hasValidAssets(t){return t.tokens.every(({id:e,decimals:n,balance:r})=>{let i=this.override.find(s=>s.id===e),a=!!n||!!i?.decimals;return r>0n&&a})}updatePool=(t,e)=>{let n=t.tokens.map(r=>{let i=e.find(s=>s.id===r.id),a=this.override.find(s=>s.id===r.id);return i?{...r,balance:i.balance.transferable,decimals:r.decimals||a?.decimals}:{...r,decimals:r.decimals||a?.decimals}});return{...t,tokens:n}}};var Kt=class extends U{MAX_FINAL_WEIGHT=100000000n;poolsData=new Map([]);async loadPools(){let[t,e,n]=await Promise.all([this.api.query.LBP.PoolData.getEntries(),this.api.query.ParachainSystem.ValidationData.getValue(),this.getPoolLimits()]),r=e?.relay_parent_number||0,i=t.filter(({value:a})=>e&&this.isActivePool(a,r)).map(async({keyArgs:a,value:s})=>{let[o]=a,l=o.toString(),c=await this.getPoolDelta(l,s,r);return{address:l,type:"LBP",fee:s.fee,...c,...n}});return Promise.all(i)}async getPoolDelta(t,e,n){let{start:r,end:i,assets:a,initial_weight:s,final_weight:o,repay_target:l,fee_collector:c}=e,m=Y.calculateLinearWeights(r?r.toString():"0",i?i.toString():"0",s.toString(),o.toString(),n.toString()),[d,p]=a,g=BigInt(m),b=this.MAX_FINAL_WEIGHT-BigInt(g),[y,h,f,S,T]=await Promise.all([this.isRepayFeeApplied(d,l,c.toString()),this.getBalance(t,d),this.api.query.AssetRegistry.Assets.getValue(d),this.getBalance(t,p),this.api.query.AssetRegistry.Assets.getValue(p)]);return{repayFeeApply:y,tokens:[{id:d,decimals:f?.decimals,existentialDeposit:f?.existential_deposit,balance:h.transferable,weight:g,type:f?.asset_type.type},{id:p,decimals:T?.decimals,existentialDeposit:T?.existential_deposit,balance:S.transferable,weight:b,type:T?.asset_type.type}]}}isActivePool(t,e){let{start:n,end:r}=t;return n&&r?e>=n&&e<r:!1}async isRepayFeeApplied(t,e,n){if(e===0n)return!1;try{return(await this.getBalance(n,t)).transferable<e}catch{return!0}}async getRepayFee(){return await this.api.constants.LBP.repay_fee()}async getPoolLimits(){let[t,e,n]=await Promise.all([this.api.constants.LBP.MaxInRatio(),this.api.constants.LBP.MaxOutRatio(),this.api.constants.LBP.MinTradingLimit()]);return{maxInRatio:t,maxOutRatio:e,minTradingLimit:n}}async getPoolFees(t){return{repayFee:await this.getRepayFee(),exchangeFee:t.fee}}getPoolType(){return"LBP"}async isSupported(){let t=this.api.query.LBP.PoolData,e=await this.api.compatibilityToken;return t.isCompatible(Gn.CompatibilityLevel.BackwardsCompatible,e)}subscribePoolChange(t){let e=this.api.query.ParachainSystem.ValidationData,n=this.poolsData.get(t.address);return n?e.watchValue("best").pipe((0,gt.switchMap)(r=>r?this.getPoolDelta(t.address,n,r.relay_parent_number):(0,gt.of)(t)),(0,gt.map)(r=>Object.assign({},t,r))):(0,gt.of)(t)}};var rn={};I(rn,{OmniMath:()=>B,OmniPool:()=>zt,OmniPoolClient:()=>$t});var w=require("@galacticcouncil/math-omnipool"),yt=J(require("big.js")),B=class{static calculateSpotPrice(t,e,n,r){return(0,w.calculate_spot_price)(t,e,n,r)}static calculateLrnaSpotPrice(t,e){return(0,w.calculate_lrna_spot_price)(t,e)}static calculateInGivenOut(t,e,n,r,i,a,s,o,l){return(0,w.calculate_in_given_out)(t,e,n,r,i,a,s,o,l)}static calculateLrnaInGivenOut(t,e,n,r,i){return(0,w.calculate_lrna_in_given_out)(t,e,n,r,i)}static calculateOutGivenIn(t,e,n,r,i,a,s,o,l){return(0,w.calculate_out_given_in)(t,e,n,r,i,a,s,o,l)}static calculateOutGivenLrnaIn(t,e,n,r,i){return(0,w.calculate_out_given_lrna_in)(t,e,n,r,i)}static calculateShares(t,e,n,r){return(0,w.calculate_shares)(t,e,n,r)}static calculateLiquidityOut(t,e,n,r,i,a,s,o){return(0,w.calculate_liquidity_out)(t,e,n,r,i,a,s,o)}static calculateLiquidityLRNAOut(t,e,n,r,i,a,s,o){return(0,w.calculate_liquidity_lrna_out)(t,e,n,r,i,a,s,o)}static calculateCapDifference(t,e,n,r){let i=(0,yt.default)(e),a=(0,yt.default)(t),s=(0,yt.default)(r),o=(0,yt.default)(n),l=(0,yt.default)(10).pow(18),c=o.div(l);if(i.div(s).lt(c)){let d=c.times(s).minus(i).times(a),p=i.times((0,yt.default)(1).minus(c));return d.div(p).toFixed(0)}else return"0"}static verifyAssetCap(t,e,n,r){return(0,w.verify_asset_cap)(t,e,n,r)}static calculateLimitHubIn(t,e,n,r){return(0,w.calculate_liquidity_hub_in)(t,e,n,r)}static isSellAllowed(t){return(0,w.is_sell_allowed)(t)}static isBuyAllowed(t){return(0,w.is_buy_allowed)(t)}static isAddLiquidityAllowed(t){return(0,w.is_add_liquidity_allowed)(t)}static isRemoveLiquidityAllowed(t){return(0,w.is_remove_liquidity_allowed)(t)}};var{FeeUtils:It}=O,zt=class u{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;hubAssetId;static fromPool(t){return new u(t.address,t.tokens,t.maxInRatio,t.maxOutRatio,t.minTradingLimit,t.hubAssetId)}constructor(t,e,n,r,i,a){this.type="Omnipool",this.address=t,this.tokens=e,this.maxInRatio=n,this.maxOutRatio=r,this.minTradingLimit=i,this.hubAssetId=a}validatePair(t,e){return this.hubAssetId!=e}parsePair(t,e){let n=new Map(this.tokens.map(a=>[a.id,a])),r=n.get(t),i=n.get(e);if(r==null)throw new Error("Pool does not contain tokenIn");if(i==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,hubReservesIn:r.hubReserves,hubReservesOut:i.hubReserves,sharesIn:r.shares,sharesOut:i.shares,decimalsIn:r.decimals,decimalsOut:i.decimals,balanceIn:r.balance,balanceOut:i.balance,tradeableIn:r.tradeable,tradeableOut:i.tradeable,assetInEd:r.existentialDeposit,assetOutEd:i.existentialDeposit}}validateAndBuy(t,e,n){let r=this.calculateInGivenOut(t,e),i=this.calculateInGivenOut(t,e,n),a=r===0n?0:A.calculateDiffToRef(i,r),s=[],o=B.isSellAllowed(t.tradeableIn),l=B.isBuyAllowed(t.tradeableOut);(!o||!l)&&s.push("TradeNotAllowed"),(e<this.minTradingLimit||r<t.assetInEd)&&s.push("InsufficientTradingAmount");let c=t.balanceOut/this.maxOutRatio;e>c&&s.push("MaxOutRatioExceeded");let m=t.balanceIn/this.maxInRatio;return i>m&&s.push("MaxInRatioExceeded"),{amountIn:i,calculatedIn:r,amountOut:e,feePct:a,errors:s}}validateAndSell(t,e,n){let r=this.calculateOutGivenIn(t,e),i=this.calculateOutGivenIn(t,e,n),a=A.calculateDiffToRef(r,i),s=[],o=B.isSellAllowed(t.tradeableIn),l=B.isBuyAllowed(t.tradeableOut);(!o||!l)&&s.push("TradeNotAllowed"),(e<this.minTradingLimit||r<t.assetOutEd)&&s.push("InsufficientTradingAmount");let c=t.balanceIn/this.maxInRatio;e>c&&s.push("MaxInRatioExceeded");let m=t.balanceOut/this.maxOutRatio;return i>m&&s.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:r,amountOut:i,feePct:a,errors:s}}calculateInGivenOut(t,e,n){if(t.assetIn==this.hubAssetId)return this.calculateLrnaInGivenOut(t,e,n);let r=B.calculateInGivenOut(t.balanceIn.toString(),t.hubReservesIn.toString(),t.sharesIn.toString(),t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),n?It.toRaw(n.assetFee).toString():"0",n?It.toRaw(n.protocolFee).toString():"0"),i=BigInt(r);return i<0n?0n:i}calculateLrnaInGivenOut(t,e,n){let r=B.calculateLrnaInGivenOut(t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),n?It.toRaw(n.assetFee).toString():"0"),i=BigInt(r);return i<0n?0n:i}calculateOutGivenIn(t,e,n){if(t.assetIn==this.hubAssetId)return this.calculateOutGivenLrnaIn(t,e,n);let r=B.calculateOutGivenIn(t.balanceIn.toString(),t.hubReservesIn.toString(),t.sharesIn.toString(),t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),n?It.toRaw(n.assetFee).toString():"0",n?It.toRaw(n.protocolFee).toString():"0"),i=BigInt(r);return i<0n?0n:i}calculateOutGivenLrnaIn(t,e,n){let r=B.calculateOutGivenLrnaIn(t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),n?It.toRaw(n.assetFee).toString():"0"),i=BigInt(r);return i<0n?0n:i}spotPriceInGivenOut(t){if(t.assetIn==this.hubAssetId)return this.spotPriceLrnaInGivenOut(t);let e=B.calculateSpotPrice(t.balanceOut.toString(),t.hubReservesOut.toString(),t.balanceIn.toString(),t.hubReservesIn.toString()),n=Math.pow(10,18-t.decimalsOut);return BigInt(e)/BigInt(n)}spotPriceLrnaInGivenOut(t){let e=B.calculateLrnaSpotPrice(t.hubReservesOut.toString(),t.balanceOut.toString()),n=Math.pow(10,18-t.decimalsOut);return BigInt(e)/BigInt(n)}spotPriceOutGivenIn(t){if(t.assetIn==this.hubAssetId)return this.spotPriceOutGivenLrnaIn(t);let e=B.calculateSpotPrice(t.balanceIn.toString(),t.hubReservesIn.toString(),t.balanceOut.toString(),t.hubReservesOut.toString()),n=Math.pow(10,18-t.decimalsIn);return BigInt(e)/BigInt(n)}spotPriceOutGivenLrnaIn(t){let e=B.calculateLrnaSpotPrice(t.balanceOut.toString(),t.hubReservesOut.toString()),n=Math.pow(10,18-t.decimalsIn);return BigInt(e)/BigInt(n)}};var we=require("polkadot-api"),Un=require("@polkadot-api/utils"),jt=require("rxjs");var{FeeUtils:at}=O,$t=class extends U{async loadPools(){let t=await this.api.constants.Omnipool.HubAssetId(),e=this.getPoolAddress(),[n,r,i,a,s]=await Promise.all([this.api.query.Omnipool.Assets.getEntries(),this.api.query.Omnipool.HubAssetTradability.getValue(),this.api.query.AssetRegistry.Assets.getValue(t),this.getBalance(e,t),this.getPoolLimits()]),o=n.map(async({keyArgs:c,value:m})=>{let[d]=c,{hub_reserve:p,shares:g,tradable:b,cap:y,protocol_shares:h}=m,[f,S]=await Promise.all([this.api.query.AssetRegistry.Assets.getValue(d),this.getBalance(e,d)]);return{id:d,decimals:f?.decimals,existentialDeposit:f?.existential_deposit,balance:S.transferable,cap:y,hubReserves:p,protocolShares:h,shares:g,tradeable:b,type:f?.asset_type.type}}),l=await Promise.all(o);return l.push({id:t,decimals:i?.decimals,existentialDeposit:i?.existential_deposit,balance:a.transferable,tradeable:r,type:i?.asset_type.type}),[{address:e,type:"Omnipool",hubAssetId:t,tokens:l,...s}]}getPoolAddress(){let t="modlomnipool".padEnd(32,"\0"),e=new TextEncoder().encode(t),n=(0,Un.toHex)(e);return(0,we.AccountId)(63).dec(n)}async getPoolLimits(){let[t,e,n]=await Promise.all([this.api.constants.Omnipool.MaxInRatio(),this.api.constants.Omnipool.MaxOutRatio(),this.api.constants.Omnipool.MinimumTradingLimit()]);return{maxInRatio:t,maxOutRatio:e,minTradingLimit:n}}async getPoolFees(t,e){let[n,r,i]=await Promise.all([this.api.constants.DynamicFees.AssetFeeParameters(),this.api.constants.DynamicFees.ProtocolFeeParameters(),this.api.query.DynamicFees.AssetFee.getValue(e)]),a=n.min_fee+r.min_fee,s=n.max_fee+r.max_fee;if(i){let{asset_fee:o,protocol_fee:l}=i;return{assetFee:at.fromPermill(o),protocolFee:at.fromPermill(l),min:at.fromPermill(a),max:at.fromPermill(s)}}else return{assetFee:at.fromPermill(n.min_fee),protocolFee:at.fromPermill(r.min_fee),min:at.fromPermill(a),max:at.fromPermill(s)}}getPoolType(){return"Omnipool"}async isSupported(){let t=this.api.query.Omnipool.Assets,e=await this.api.compatibilityToken;return t.isCompatible(we.CompatibilityLevel.BackwardsCompatible,e)}subscribePoolChange(t){return this.api.query.Omnipool.Assets.watchEntries({at:"best"}).pipe((0,jt.distinctUntilChanged)((n,r)=>!r.deltas),(0,jt.map)(({entries:n})=>n.map(r=>{let[i]=r.args,{hub_reserve:a,shares:s,tradable:o,cap:l,protocol_shares:c}=r.value,m=t.tokens.findIndex(p=>p.id===i);return{...t.tokens[m],cap:l,hubReserves:a,protocolShares:c,shares:s,tradeable:o}})),(0,jt.map)(n=>{let r=t.tokens.find(i=>i.id===1);return{...t,tokens:[...n,r]}}))}};var sn={};I(sn,{StableMath:()=>k,StableSwap:()=>Qt,StableSwapClient:()=>Jt});var R=require("@galacticcouncil/math-stableswap"),k=class{static getPoolAddress(t){return(0,R.pool_account_name)(t)}static defaultPegs(t){let e=[];for(let n=0;n<t;n++)e.push(["1","1"]);return e}static calculateAmplification(t,e,n,r,i){return(0,R.calculate_amplification)(t,e,n,r,i)}static calculateInGivenOut(t,e,n,r,i,a,s){return(0,R.calculate_in_given_out)(t,e,n,r,i,a,s)}static calculateAddOneAsset(t,e,n,r,i,a,s){return(0,R.calculate_add_one_asset)(t,e,n,r,i,a,s)}static calculateSharesForAmount(t,e,n,r,i,a,s){return(0,R.calculate_shares_for_amount)(t,e,n,r,i,a,s)}static calculateOutGivenIn(t,e,n,r,i,a,s){return(0,R.calculate_out_given_in)(t,e,n,r,i,a,s)}static calculateLiquidityOutOneAsset(t,e,n,r,i,a,s){return(0,R.calculate_liquidity_out_one_asset)(t,e,n,r,i,a,s)}static calculateShares(t,e,n,r,i,a){return(0,R.calculate_shares)(t,e,n,r,i,a)}static calculateSpotPriceWithFee(t,e,n,r,i,a,s,o){return(0,R.calculate_spot_price_with_fee)(t,e,n,r,i,a,s,o)}static recalculatePegs(t,e,n,r,i){let a=(0,R.recalculate_peg)(t,e,n,r,i);return JSON.parse(a)}};var{FeeUtils:ot}=O,Qt=class u{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;amplification;id;fee;totalIssuance;static fromPool(t){return new u(t.address,t.tokens,t.maxInRatio,t.maxOutRatio,t.minTradingLimit,t.amplification,t.id,t.fee,t.totalIssuance)}constructor(t,e,n,r,i,a,s,o,l){this.type="Stableswap",this.address=t,this.tokens=e,this.maxInRatio=n,this.maxOutRatio=r,this.minTradingLimit=i,this.amplification=a,this.id=s,this.fee=o,this.totalIssuance=l}validatePair(t,e){return!0}parsePair(t,e){let n=new Map(this.tokens.map(a=>[a.id,a])),r=n.get(t),i=n.get(e);if(r==null)throw new Error("Pool does not contain tokenIn");if(i==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,balanceIn:r.balance,balanceOut:i.balance,decimalsIn:r.decimals,decimalsOut:i.decimals,tradeableIn:this.id===t?15:r.tradeable,tradeableOut:this.id===e?15:i.tradeable,assetInEd:r.existentialDeposit,assetOutEd:i.existentialDeposit}}validateAndBuy(t,e,n){let r=this.calculateInGivenOut(t,e),i=this.calculateInGivenOut(t,e,n),a=ot.toPct(n.fee),s=[],o=B.isSellAllowed(t.tradeableIn),l=B.isBuyAllowed(t.tradeableOut);return(!o||!l)&&s.push("TradeNotAllowed"),(e<this.minTradingLimit||r<t.assetInEd)&&s.push("InsufficientTradingAmount"),{amountIn:i,calculatedIn:r,amountOut:e,feePct:a,errors:s}}validateAndSell(t,e,n){let r=this.calculateOutGivenIn(t,e),i=this.calculateOutGivenIn(t,e,n),a=ot.toPct(n.fee),s=[],o=B.isSellAllowed(t.tradeableIn),l=B.isBuyAllowed(t.tradeableOut);return(!o||!l)&&s.push("TradeNotAllowed"),(e<this.minTradingLimit||r<t.assetOutEd)&&s.push("InsufficientTradingAmount"),{amountIn:e,calculatedOut:r,amountOut:i,feePct:a,errors:s}}calculateIn(t,e,n){let r=k.calculateInGivenOut(this.getReserves(),Number(t.assetIn),Number(t.assetOut),e.toString(),this.amplification.toString(),n?ot.toRaw(n.fee).toString():"0",this.getPegs()),i=BigInt(r);return i<0n?0n:i}calculateAddOneAsset(t,e,n){let r=k.calculateAddOneAsset(this.getReserves(),e.toString(),Number(t.assetIn),this.amplification.toString(),this.totalIssuance.toString(),n?ot.toRaw(n.fee).toString():"0",this.getPegs()),i=BigInt(r);return i<0n?0n:i}calculateSharesForAmount(t,e,n){let r=k.calculateSharesForAmount(this.getReserves(),Number(t.assetOut),e.toString(),this.amplification.toString(),this.totalIssuance.toString(),n?ot.toRaw(n.fee).toString():"0",this.getPegs()),i=BigInt(r);return i<0n?0n:i}calculateInGivenOut(t,e,n){return t.assetOut==this.id?this.calculateAddOneAsset(t,e,n):t.assetIn==this.id?this.calculateSharesForAmount(t,e,n):this.calculateIn(t,e,n)}spotPriceInGivenOut(t){let e=k.calculateSpotPriceWithFee(this.id.toString(),this.getReserves(),this.amplification.toString(),t.assetOut.toString(),t.assetIn.toString(),this.totalIssuance.toString(),"0",this.getPegs());if(t.assetOut==this.id)return BigInt(e);if(t.assetIn==this.id){let r=Math.pow(10,t.decimalsIn-t.decimalsOut);return BigInt(e)/BigInt(r)}let n=Math.pow(10,18-t.decimalsIn);return BigInt(e)/BigInt(n)}calculateOut(t,e,n){let r=k.calculateOutGivenIn(this.getReserves(),Number(t.assetIn),Number(t.assetOut),e.toString(),this.amplification.toString(),n?ot.toRaw(n.fee).toString():"0",this.getPegs()),i=BigInt(r);return i<0n?0n:i}calculateWithdrawOneAsset(t,e,n){let r=k.calculateLiquidityOutOneAsset(this.getReserves(),e.toString(),Number(t.assetOut),this.amplification.toString(),this.totalIssuance.toString(),n?ot.toRaw(n.fee).toString():"0",this.getPegs()),i=BigInt(r);return i<0n?0n:i}calculateShares(t,e,n){let r=k.calculateShares(this.getReserves(),this.getAssets(t.assetIn,e),this.amplification.toString(),this.totalIssuance.toString(),n?ot.toRaw(n.fee).toString():"0",this.getPegs()),i=BigInt(r);return i<0n?0n:i}calculateOutGivenIn(t,e,n){return t.assetIn==this.id?this.calculateWithdrawOneAsset(t,e,n):t.assetOut==this.id?this.calculateShares(t,e,n):this.calculateOut(t,e,n)}spotPriceOutGivenIn(t){let e=k.calculateSpotPriceWithFee(this.id.toString(),this.getReserves(),this.amplification.toString(),t.assetIn.toString(),t.assetOut.toString(),this.totalIssuance.toString(),"0",this.getPegs());if(t.assetIn==this.id)return BigInt(e);if(t.assetOut==this.id){let r=Math.pow(10,t.decimalsOut-t.decimalsIn);return BigInt(e)/BigInt(r)}let n=Math.pow(10,18-t.decimalsOut);return BigInt(e)/BigInt(n)}getPegs(){let t=k.defaultPegs(this.tokens.length-1);return JSON.stringify(t)}getReserves(){let t=this.tokens.filter(e=>e.id!=this.id).map(({id:e,balance:n,decimals:r})=>({asset_id:e,amount:n,decimals:r}));return JSON.stringify(t,it.jsonFormatter)}getAssets(t,e){let n={asset_id:Number(t),amount:e.toString()};return JSON.stringify([n],it.jsonFormatter)}};var xe=require("polkadot-api"),Hn=require("@polkadot-api/utils"),Vn=require("@noble/hashes/blake2b"),vt=require("rxjs");var{FeeUtils:bt}=O,Jt=class extends U{poolsData=new Map([]);getPoolType(){return"Stableswap"}getPoolAddress(t){let e=k.getPoolAddress(t),n=(0,Vn.blake2b)(e,{dkLen:32}),r=(0,Hn.toHex)(n);return(0,xe.AccountId)(63).dec(r)}async getPoolLimits(){return{maxInRatio:0n,maxOutRatio:0n,minTradingLimit:await this.api.constants.Stableswap.MinTradingLimit()}}async getPoolDelta(t,e,n){let{initial_amplification:r,final_amplification:i,initial_block:a,final_block:s}=e,o=k.calculateAmplification(r.toString(),i.toString(),a.toString(),s.toString(),n.toString()),l=await this.api.query.Tokens.TotalIssuance.getValue(t);return{amplification:BigInt(o),totalIssuance:l}}async getPoolTokens(t,e){let n=this.getPoolAddress(t),r=e.assets.map(async i=>{let[a,s,o]=await Promise.all([this.api.query.Stableswap.AssetTradability.getValue(t,i),this.api.query.AssetRegistry.Assets.getValue(i),this.getBalance(n,i)]);return{id:i,decimals:s?.decimals,existentialDeposit:s?.existential_deposit,balance:o.transferable,tradeable:a,type:s?.asset_type.type}});return Promise.all(r)}async isSupported(){let t=this.api.query.Stableswap.Pools,e=await this.api.compatibilityToken;return t.isCompatible(xe.CompatibilityLevel.BackwardsCompatible,e)}async loadPools(){let[t,e,n]=await Promise.all([this.api.query.Stableswap.Pools.getEntries(),this.api.query.System.Number.getValue(),this.getPoolLimits()]),r=t.map(async({keyArgs:i,value:a})=>{let[s]=i,o=this.getPoolAddress(s),[l,c,m]=await Promise.all([this.getPoolDelta(s,a,e),this.getPoolTokens(s,a),this.getPoolPegs(s,a,e)]);return c.push({id:s,tradeable:15,balance:l.totalIssuance,decimals:18}),this.poolsData.set(o,a),{address:o,id:s,type:"Stableswap",fee:bt.fromPermill(a.fee),tokens:c,...l,...m,...n}});return Promise.all(r)}async getPoolFees(t){return{fee:t.fee}}async getPoolPegs(t,e,n){let r=await this.api.query.Stableswap.PoolPegs.getValue(t);if(!r)return this.getDefaultPegs(e);let i=await this.getLatestPegs(e,r,n),a=this.getRecentPegs(r),s=bt.fromPermill(r.max_peg_update),o=bt.fromPermill(e.fee),[l,c]=k.recalculatePegs(JSON.stringify(a),JSON.stringify(i),n.toString(),bt.toRaw(s).toString(),bt.toRaw(o).toString()),m=Number(l)*1e6;return{pegsFee:bt.fromPermill(m),pegs:c}}getDefaultPegs(t){let e=t.fee,n=k.defaultPegs(t.assets.length);return{pegsFee:bt.fromPermill(e),pegs:n}}getRecentPegs(t){let{current:e}=t;return Array.from(e.entries()).map(([n,r])=>r.map(i=>i.toString()))}async getLatestPegs(t,e,n){let{source:r}=e,i=Array.from(t.assets.entries()).map(([s,o])=>o),a=r.map(async(s,o)=>{if(s.type==="Oracle"){let[l,c,m]=s.value,d=[m,i[o]].sort((f,S)=>f-S),p=await this.api.query.EmaOracle.Oracles.getValue(l,d,c);if(!p)return;let[{price:g,updated_at:b}]=p,y=g.n.toString(),h=g.d.toString();return m.toString()===d[0].toString()?[[y,h],b.toString()]:[[h,y],b.toString()]}else if(s.type==="MMOracle"){let l=s.value.asHex(),{price:c,decimals:m,updatedAt:d}=await this.mmOracle.getData(l),p=10**m;return[[c.toString(),p.toString()],d.toString()]}else return[s.value.map(l=>l.toString()),n.toString()]});return Promise.all(a)}subscribePoolChange(t){let e=this.api.query.System.Number,n=this.poolsData.get(t.address);return!n||!t.id?(0,vt.of)(t):e.watchValue("best").pipe((0,vt.switchMap)(r=>Promise.all([this.getPoolDelta(t.id,n,r),this.getPoolPegs(t.id,n,r)])),(0,vt.map)(([r,i])=>{let a=t.tokens.map(s=>s.id===t.id?{...s,balance:r.totalIssuance}:s);return Object.assign(t,{tokens:a},r,i)}))}};var an={};I(an,{XykMath:()=>et,XykPool:()=>Zt,XykPoolClient:()=>te});var F=require("@galacticcouncil/math-xyk"),et=class{static getSpotPrice(t,e,n){return(0,F.get_spot_price)(t,e,n)}static calculateInGivenOut(t,e,n){return(0,F.calculate_in_given_out)(t,e,n)}static calculateOutGivenIn(t,e,n){return(0,F.calculate_out_given_in)(t,e,n)}static calculatePoolTradeFee(t,e,n){return(0,F.calculate_pool_trade_fee)(t,e,n)}static calculateLiquidityIn(t,e,n){return(0,F.calculate_liquidity_in)(t,e,n)}static calculateSpotPrice(t,e){return(0,F.calculate_spot_price)(t,e)}static calculateSpotPriceWithFee(t,e,n,r){return(0,F.calculate_spot_price_with_fee)(t,e,n,r)}static calculateShares(t,e,n){return(0,F.calculate_shares)(t,e,n)}static calculateLiquidityOutAssetA(t,e,n,r){return(0,F.calculate_liquidity_out_asset_a)(t,e,n,r)}static calculateLiquidityOutAssetB(t,e,n,r){return(0,F.calculate_liquidity_out_asset_b)(t,e,n,r)}};var{FeeUtils:Wn}=O,Zt=class u{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;static fromPool(t){return new u(t.address,t.tokens,t.maxInRatio,t.maxOutRatio,t.minTradingLimit)}constructor(t,e,n,r,i){this.type="XYK",this.address=t,this.tokens=e,this.maxInRatio=n,this.maxOutRatio=r,this.minTradingLimit=i}validatePair(t,e){return!0}parsePair(t,e){let n=new Map(this.tokens.map(a=>[a.id,a])),r=n.get(t),i=n.get(e);if(r==null)throw new Error("Pool does not contain tokenIn");if(i==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,decimalsIn:r.decimals,decimalsOut:i.decimals,balanceIn:r.balance,balanceOut:i.balance,assetInEd:r.existentialDeposit,assetOutEd:i.existentialDeposit}}validateAndBuy(t,e,n){let r=this.calculateInGivenOut(t,e),i=this.calculateTradeFee(r,n),a=Wn.toPct(n.exchangeFee),s=r+i,o=[];(e<this.minTradingLimit||r<t.assetInEd)&&o.push("InsufficientTradingAmount");let l=t.balanceOut/this.maxOutRatio;e>l&&o.push("MaxOutRatioExceeded");let c=t.balanceIn/this.maxInRatio;return s>c&&o.push("MaxInRatioExceeded"),{amountIn:s,calculatedIn:r,amountOut:e,feePct:a,errors:o}}validateAndSell(t,e,n){let r=this.calculateOutGivenIn(t,e),i=this.calculateTradeFee(r,n),a=Wn.toPct(n.exchangeFee),s=r-i,o=[];(e<this.minTradingLimit||r<t.assetOutEd)&&o.push("InsufficientTradingAmount");let l=t.balanceIn/this.maxInRatio;e>l&&o.push("MaxInRatioExceeded");let c=t.balanceOut/this.maxOutRatio;return s>c&&o.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:r,amountOut:s,feePct:a,errors:o}}calculateInGivenOut(t,e){let n=et.calculateInGivenOut(t.balanceIn.toString(),t.balanceOut.toString(),e.toString()),r=BigInt(n);return r<0n?0n:r}calculateOutGivenIn(t,e){let n=et.calculateOutGivenIn(t.balanceIn.toString(),t.balanceOut.toString(),e.toString()),r=BigInt(n);return r<0n?0n:r}spotPriceInGivenOut(t){let e=et.calculateSpotPrice(t.balanceOut.toString(),t.balanceIn.toString()),n=Math.pow(10,18-t.decimalsOut);return BigInt(e)/BigInt(n)}spotPriceOutGivenIn(t){let e=et.calculateSpotPrice(t.balanceIn.toString(),t.balanceOut.toString()),n=Math.pow(10,18-t.decimalsIn);return BigInt(e)/BigInt(n)}calculateTradeFee(t,e){let n=et.calculatePoolTradeFee(t.toString(),e.exchangeFee[0],e.exchangeFee[1]);return BigInt(n)}};var Yn=require("polkadot-api"),Xn=require("rxjs");var te=class extends U{async loadPools(){let t=this.api.query.XYK.PoolAssets,[e,n]=await Promise.all([t.getEntries(),this.getPoolLimits()]),r=e.map(async({keyArgs:i,value:a})=>{let[s]=i,[o,l]=a,[c,m,d,p]=await Promise.all([this.getBalance(s,o),this.api.query.AssetRegistry.Assets.getValue(o),this.getBalance(s,l),this.api.query.AssetRegistry.Assets.getValue(l)]);return{address:s,type:"XYK",tokens:[{id:o,decimals:m?.decimals,existentialDeposit:m?.existential_deposit,balance:c.transferable,type:m?.asset_type.type},{id:l,decimals:p?.decimals,existentialDeposit:p?.existential_deposit,balance:d.transferable,type:p?.asset_type.type}],...n}});return Promise.all(r)}async getExchangeFee(){return await this.api.constants.XYK.GetExchangeFee()}async getPoolLimits(){let[t,e,n]=await Promise.all([this.api.constants.XYK.MaxInRatio(),this.api.constants.XYK.MaxOutRatio(),this.api.constants.XYK.MinTradingLimit()]);return{maxInRatio:t,maxOutRatio:e,minTradingLimit:n}}async getPoolFees(){return{exchangeFee:await this.getExchangeFee()}}getPoolType(){return"XYK"}async isSupported(){let t=this.api.query.XYK.PoolAssets,e=await this.api.compatibilityToken;return t.isCompatible(Yn.CompatibilityLevel.BackwardsCompatible,e)}subscribePoolChange(t){return(0,Xn.of)(t)}};var on={};I(on,{AavePool:()=>ee,AavePoolClient:()=>ne});var ee=class u{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;static fromPool(t){return new u(t.address,t.tokens,t.maxInRatio,t.maxOutRatio,t.minTradingLimit)}constructor(t,e,n,r,i){this.type="Aave",this.address=t,this.tokens=e,this.maxInRatio=n,this.maxOutRatio=r,this.minTradingLimit=i}validatePair(t,e){return!0}parsePair(t,e){let n=new Map(this.tokens.map(a=>[a.id,a])),r=n.get(t),i=n.get(e);if(r==null)throw new Error("Pool does not contain tokenIn");if(i==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,balanceIn:r.balance,balanceOut:i.balance,decimalsIn:r.decimals,decimalsOut:i.decimals,assetInEd:0n,assetOutEd:0n}}validateAndBuy(t,e,n){let r=this.calculateInGivenOut(t,e),i=[];return e>t.balanceOut&&i.push("TradeNotAllowed"),{amountIn:r,calculatedIn:r,amountOut:e,feePct:0,errors:i}}validateAndSell(t,e,n){let r=this.calculateOutGivenIn(t,e),i=[];return r>t.balanceOut&&i.push("TradeNotAllowed"),{amountIn:e,calculatedOut:r,amountOut:r,feePct:0,errors:i}}calculateInGivenOut(t,e){return e}calculateOutGivenIn(t,e){return e}spotPriceInGivenOut(t){let e=Math.pow(10,t.decimalsOut);return BigInt(e)}spotPriceOutGivenIn(t){let e=Math.pow(10,t.decimalsIn);return BigInt(e)}calculateTradeFee(t,e){return 0n}};var zn=require("polkadot-api"),jn=require("@polkadot-api/utils"),Ot=require("rxjs"),$n=require("viem");var Kn=[{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"reserve",type:"address"},{indexed:!1,internalType:"address",name:"user",type:"address"},{indexed:!0,internalType:"address",name:"onBehalfOf",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"},{indexed:!0,internalType:"uint16",name:"referralCode",type:"uint16"}],name:"Supply",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"reserve",type:"address"},{indexed:!0,internalType:"address",name:"user",type:"address"},{indexed:!0,internalType:"address",name:"to",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"}],name:"Withdraw",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"reserve",type:"address"},{indexed:!1,internalType:"address",name:"user",type:"address"},{indexed:!0,internalType:"address",name:"onBehalfOf",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"},{indexed:!1,internalType:"enum DataTypes.InterestRateMode",name:"interestRateMode",type:"uint8"},{indexed:!1,internalType:"uint256",name:"borrowRate",type:"uint256"},{indexed:!0,internalType:"uint16",name:"referralCode",type:"uint16"}],name:"Borrow",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"reserve",type:"address"},{indexed:!0,internalType:"address",name:"user",type:"address"},{indexed:!0,internalType:"address",name:"repayer",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"},{indexed:!1,internalType:"bool",name:"useATokens",type:"bool"}],name:"Repay",type:"event"}];var{ERC20:Lr}=mt,qr=["Supply","Withdraw","Repay","Borrow"],ne=class extends U{async loadPools(){let e=(await this.api.apis.AaveTradeExecutor.pools()).map(async({reserve:n,atoken:r,liqudity_in:i,liqudity_out:a})=>{let[s,o,l,c]=await Promise.all([this.api.query.AssetRegistry.Assets.getValue(n),this.api.query.AssetRegistry.AssetLocations.getValue(n),this.api.query.AssetRegistry.Assets.getValue(r),this.api.query.AssetRegistry.AssetLocations.getValue(r)]);return{address:this.getPoolId(n,r),type:"Aave",tokens:[{id:n,decimals:s?.decimals,existentialDeposit:s?.existential_deposit,balance:i,location:o,type:s?.asset_type.type},{id:r,decimals:l?.decimals,existentialDeposit:l?.existential_deposit,balance:a,location:c,type:l?.asset_type.type}],...this.getPoolLimits()}});return Promise.all(e)}async getPoolDelta(t){let[e,n]=t.tokens,{liqudity_in:r,liqudity_out:i}=await this.api.apis.AaveTradeExecutor.pool(e.id,n.id);return t.tokens.map(a=>{let s=a.id===e.id?r:i;return{...a,balance:s}})}getPoolId(t,e){let n=t+"/"+e,r=new TextEncoder().encode(n.padEnd(32,"\0")),i=(0,jn.toHex)(r);return(0,zn.AccountId)(63).dec(i)}getPoolLimits(){return{maxInRatio:0n,maxOutRatio:0n,minTradingLimit:0n}}async getPoolFees(t,e){return{}}getPoolType(){return"Aave"}async isSupported(){return!0}subscribePoolChange(t){let[e,n]=t.tokens,r=this.getReserveH160Id(e),i=this.api.event.Router.Executed.watch(({asset_in:s,asset_out:o})=>s===n.id||o===n.id),a=this.api.event.EVM.Log.watch(({log:s})=>{let{topics:o,data:l}=s,c=o.map(g=>g.asHex()),m=l.asHex(),{eventName:d,args:p}=(0,$n.decodeEventLog)({abi:Kn,topics:c,data:m});return qr.includes(d)&&p.reserve.toLowerCase()===r.toLowerCase()});return(0,Ot.merge)([i,a]).pipe((0,Ot.switchMap)(()=>this.getPoolDelta(t)),(0,Ot.map)(s=>({...t,tokens:[...s]})))}getReserveH160Id(t){return t.type==="Erc20"?it.findNestedKey(t.location,"AccountKey20").AccountKey20.key:Lr.fromAssetId(t.id)}};var At=class{static get(t){switch(t.type){case"Aave":return ee.fromPool(t);case"XYK":return Zt.fromPool(t);case"Omnipool":return zt.fromPool(t);case"LBP":return Yt.fromPool(t);case"Stableswap":return Qt.fromPool(t);default:throw new Error("Pool type "+t.type+" is not supported yet")}}};var Q=require("rxjs");var Bt=class extends D{evm;lbpClient;omniClient;stableClient;xykClient;aaveClient;active=new Set([]);clients=[];pools=new Map([]);lbpSub=Q.Subscription.EMPTY;omniSub=Q.Subscription.EMPTY;stableSub=Q.Subscription.EMPTY;xykSub=Q.Subscription.EMPTY;aaveSub=Q.Subscription.EMPTY;isReady=!1;isDestroyed=new Q.Subject;constructor(t,e){super(t),this.evm=e,this.lbpClient=new Kt(t,e),this.omniClient=new $t(t,e),this.stableClient=new Jt(t,e),this.xykClient=new te(t,e),this.aaveClient=new ne(t,e),this.clients=[this.lbpClient,this.omniClient,this.stableClient,this.xykClient,this.aaveClient]}subscribe(t){return t.getSubscriber().pipe((0,Q.takeUntil)(this.isDestroyed)).subscribe(e=>{this.pools.set(e.address,e)})}withOmnipool(){return this.omniSub.unsubscribe(),this.omniSub=this.subscribe(this.omniClient),this.active.add("Omnipool"),this}withStableswap(){return this.stableSub.unsubscribe(),this.stableSub=this.subscribe(this.stableClient),this.active.add("Stableswap"),this}withLbp(){return this.lbpSub.unsubscribe(),this.lbpSub=this.subscribe(this.lbpClient),this.active.add("LBP"),this}withAave(){return this.aaveSub.unsubscribe(),this.aaveSub=this.subscribe(this.aaveClient),this.active.add("Aave"),this}withXyk(t){return this.xykClient.withOverride(t),this.xykSub.unsubscribe(),this.xykSub=this.subscribe(this.xykClient),this.active.add("XYK"),this}destroy(){this.isDestroyed.next(!0),this.isDestroyed.complete(),this.active.clear(),this.pools.clear(),this.isReady=!1}async getPools(t={}){if(this.active.size===0)throw new Error("No pools selected");if(this.isReady)return Array.from(this.pools.values());let{useOnly:e=[],exclude:n=[]}=t,r=new Set(e),i=new Set(n),a=async s=>{let o=s.getPoolType();return r.size>0?r.has(o):i.size>0?!i.has(o):s.isSupported()};return this.getFilteredPools(a)}async getFilteredPools(t){let e=await Promise.all(this.clients.map(t)),n=this.clients.filter((i,a)=>e[a]);return(await Promise.all(n.map(i=>i.getPoolsMem()))).flat()}async getPoolFees(t,e){let n=this.clients.find(r=>r.getPoolType()===t.type);if(n)return n.getPoolFees(t,e);throw new Gt(t.type)}};var yn={};I(yn,{DEFAULT_BLOCK_TIME:()=>Jn,DEFAULT_MIN_BUDGET:()=>mn,ORDER_MIN_BLOCK_PERIOD:()=>Zn,Router:()=>_t,TWAP_BLOCK_PERIOD:()=>ae,TWAP_MAX_DURATION:()=>dn,TWAP_MAX_PRICE_IMPACT:()=>pn,TWAP_TX_MULTIPLIER:()=>nc,TradeOrderError:()=>un,TradeOrderType:()=>ve,TradeRouteBuilder:()=>H,TradeRouter:()=>Rt,TradeScheduler:()=>Ft,TradeType:()=>Ie});var re=class{constructor(t=1/0){this.capacity=t}storage=[];enqueue(t){if(this.size()===this.capacity)throw Error("Queue has reached max capacity, you cannot add more items");this.storage.push(t)}dequeue(){return this.storage.shift()}size(){return this.storage.length}};var Nr=8,ie=class{isNotVisited(t,e){let n=!0;return e.forEach(r=>{(r[0]===t[0]||r[1]===t[1])&&(n=!1)}),n}findPaths(t,e,n){let r=[],i=new re,a=[];for(a.push([e,""]),i.enqueue(a);i.size()>0;){let s=i.dequeue();if(!s||s.length>Nr)continue;let o=s[s.length-1];(n===null||o[0]===n)&&r.push(s),t.get(o[0])?.forEach(c=>{if(this.isNotVisited(c,s)){let m=[...s];m.push(c),i.enqueue(m)}})}return r}findShortestPaths(t,e,n){let r=[],i=new re,a=[];a.push([e,""]),i.enqueue(a);let s=1/0;for(;i.size()>0;){let o=i.dequeue();if(!o)continue;let l=o[o.length-1];if(l[0]===n){o.length<s?(s=o.length,r.length=0,r.push(o)):o.length===s&&r.push(o);continue}let c=t.get(l[0]);for(let m of c??[])this.isNotVisited(m,o)&&i.enqueue([...o,m])}return r}buildAndPopulateGraph(t,e){let n=new Map;for(let r of t)n.set(parseInt(r),[]);for(let[r,i,a]of e)n.get(i)?.push([a,r]);return n}};function cn(u){let t={};for(let e of u){let n=e.tokens.length;for(let r=0;r<n;r++){t[e.tokens[r].id]||(t[e.tokens[r].id]=[]);for(let i=0;i<n;i++){if(r==i)continue;let a=[e.address,e.tokens[r].id,e.tokens[i].id];t[e.tokens[r].id].push(a)}}}return t}var se=class{getProposals(t,e,n){let r=n.filter(y=>y.type==="XYK"),i=n.filter(y=>y.type!=="XYK"),a=new Set(i.map(y=>y.tokens).flat().map(y=>y.id)),s=a.has(t),o=a.has(e),l=new ie,c=y=>{let h=cn(y),f=Object.keys(h),S=f.flatMap(T=>h[T]);return l.buildAndPopulateGraph(f,S)};if(!s&&!o){let y=r.filter(S=>S.tokens.find(T=>T.id===t)||S.tokens.find(T=>T.id===e)),h=c(y),f=l.findPaths(h,t,e);return this.parsePaths(f)}if(s&&o){let y=c(i),h=l.findPaths(y,t,e);return this.parsePaths(h)}let m=s?e:t,d=r.filter(y=>y.tokens.some(h=>h.id===m));if(d.length===0)return[];let p=[...i,...d],g=c(p),b=l.findPaths(g,t,e);return this.parsePaths(b)}parsePaths(t){let e=[];for(let n of t){let r=[];for(let i=0;i<n.length;i++){let a=n[i],s=n[i+1];if(s==null)break;r.push(this.toEdge(a,s))}e.push(r)}return e}toEdge(t,e){return[e[1],t[0],e[0]]}};var _t=class{routeSuggester;routeProposals;routerOptions;ctx;constructor(t,e={}){this.ctx=t,this.routeSuggester=new se,this.routeProposals=new Map,this.routerOptions=Object.freeze(e)}buildRouteKey(t,e,n){return`${t}->${e}::${n.length}`}async getPools(){return this.ctx.getPools(this.routerOptions)}async getRoutes(t,e){let n=await this.getPools();return this.validateInput(t,e,n),this.getPaths(t,e,n)}async getTradeableAssets(){let t=await this.getPools(),e=this.getAssets(t);return Array.from(e)}async getRouteableAssets(t){let e=await this.getTradeableAssets();return(await Promise.all(e.filter(r=>r!==t).map(r=>this.getRoutes(r,t)))).filter(r=>r.length>0).map(([r])=>r[0].assetIn).sort()}validateInput(t,e,n){if(n.length===0)throw new Error("No pools configured");if(t===e)throw new Error("Trading pair can't be identical");let r=this.getAssets(n);if(!r.has(t))throw new Error(t+" is not supported asset");if(!r.has(e))throw new Error(e+" is not supported asset");return this.toPoolsMap(n)}getAssets(t){let e=t.map(n=>n.tokens.map(r=>r.id)).flat().sort((n,r)=>n>r?1:-1);return new Set(e)}getPaths(t,e,n){let r=this.toPoolsMap(n);return this.getProposals(t,e,n).filter(a=>this.validPath(a,r)).map(a=>this.toHops(a,r))}getProposals(t,e,n){let r=this.buildRouteKey(t,e,n);if(this.routeProposals.has(r))return this.routeProposals.get(r);let i=this.routeSuggester.getProposals(t,e,n);return this.routeProposals.set(r,i),i}validPath(t,e){return t.length>0&&t.map(n=>this.validEdge(n,e)).reduce((n,r)=>n&&r)}validEdge([t,e,n],r){return r.get(t)?.validatePair(e,n)||!1}toPoolsMap(t){return new Map(t.map(e=>[e.address,At.get(e)]))}toHops(t,e){return t.map(([n,r,i])=>{let a=e.get(n);return{poolAddress:n,poolId:a?.id,pool:a?.type,assetIn:r,assetOut:i}})}};var Ie=(e=>(e.Buy="Buy",e.Sell="Sell",e))(Ie||{}),ve=(n=>(n.Dca="Dca",n.TwapSell="TwapSell",n.TwapBuy="TwapBuy",n))(ve||{}),un=(n=>(n.OrderTooSmall="OrderTooSmall",n.OrderTooBig="OrderTooBig",n.OrderImpactTooBig="OrderImpactTooBig",n))(un||{});var{FeeUtils:Qn}=O,Rt=class extends _t{mlr;poolsSnapshot;constructor(t,e={}){super(t,e),this.mlr=new Map}buildCtxSync(t,e){let n=this.poolsSnapshot,r=super.validateInput(t,e,n),i=super.getPaths(t,e,n);if(!i.length)throw new Ut(t,e);return{paths:i,pools:n,poolsMap:r}}async withCtx(t,e,n){this.poolsSnapshot||(this.poolsSnapshot=await super.getPools());let r=this.buildCtxSync(t,e);return n(r)}isDirectTrade(t){return t.length==1}findBestSellRoute(t){let e=t.sort((n,r)=>{let i=n[n.length-1].amountOut,a=r[r.length-1].amountOut;return i>a?-1:1});return e.find(n=>n.every(r=>r.errors.length==0))||e[0]}getRouteFeeRange(t){if(t.filter(n=>n.tradeFeeRange).length>0){let n=t.map(i=>i.tradeFeeRange?.[0]??i.tradeFeePct).reduce((i,a)=>i+a),r=t.map(i=>i.tradeFeeRange?.[1]??i.tradeFeePct).reduce((i,a)=>i+a);return[n,r]}}getPoolFeeRange(t){let e=t.min?Qn.toPct(t.min):void 0,n=t.max?Qn.toPct(t.max):void 0;if(e&&n)return[e,n]}async getBestSell(t,e,n){return this.getSell(t,e,n)}getSellSpot(t){let e=t[t.length-1];if(t.length===1)return e.spotPrice;let n=t.map(s=>s.assetOutDecimals).reduce((s,o)=>s+o),r=t.map(s=>s.spotPrice).reduce((s,o)=>s*o),i=n-e.assetOutDecimals,a=Math.pow(10,i);return r/BigInt(a)}async getSell(t,e,n,r){return this.withCtx(t,e,async({paths:i,poolsMap:a})=>{let s;if(r)s=await this.toSellSwaps(n,r,a);else{let o=i.map(c=>this.toSellSwaps(n,c,a)),l=await Promise.all(o);s=this.findBestSellRoute(l)}return this.buildSell(a,s)})}buildSell(t,e){let n=e[0],r=e[e.length-1],i=this.isDirectTrade(e),a=this.getSellSpot(e),s=r.amountOut,o=i?r.calculatedOut:this.calculateDelta0Y(n.amountIn,e,t),l=o-s,c=this.getRouteFeeRange(e),m=i?r.tradeFeePct:A.calculateSellFee(o,s),d=Math.pow(10,n.assetInDecimals),p=n.amountIn*a/BigInt(d),g=A.calculateDiffToRef(o,p);return{type:"Sell",amountIn:n.amountIn,amountOut:r.amountOut,spotPrice:a,tradeFee:l,tradeFeePct:m,tradeFeeRange:c,priceImpactPct:g,swaps:e,toHuman(){return{type:"Sell",amountIn:P.toDecimal(n.amountIn,n.assetInDecimals),amountOut:P.toDecimal(r.amountOut,r.assetOutDecimals),spotPrice:P.toDecimal(a,r.assetOutDecimals),tradeFee:P.toDecimal(l,r.assetOutDecimals),tradeFeePct:m,tradeFeeRange:c,priceImpactPct:g,swaps:e.map(b=>b.toHuman())}}}}calculateDelta0Y(t,e,n){let r=[];for(let i=0;i<e.length;i++){let a=e[i],s=n.get(a.poolAddress);if(s==null)throw new Error("Pool does not exit");let o=s.parsePair(a.assetIn,a.assetOut),l;i>0?l=r[i-1]:l=t;let c=s.calculateOutGivenIn(o,l);r.push(c)}return r[r.length-1]}async calculateMostLiquidRoute(t,e,n){let{paths:r,pools:i,poolsMap:a}=n,l=i.filter(b=>b.tokens.some(y=>y.id===t)).map(b=>b.type==="Aave"?b.tokens:b.tokens.filter(y=>y.id===t)).map(b=>b.map(y=>y.balance).reduce((y,h)=>y+h)).sort((b,y)=>y<b?-1:1)[0],c=A.getFraction(l,.1),m=await Promise.all(r.map(b=>this.toSellSwaps(c,b,a))),p=this.findBestSellRoute(m).map(b=>({poolAddress:b.poolAddress,poolId:b?.poolId,pool:b.pool,assetIn:b.assetIn,assetOut:b.assetOut})),g=this.buildRouteKey(t,e,i);return this.mlr.set(g,p),p}async toSellSwaps(t,e,n){let r=[];for(let i=0;i<e.length;i++){let a=e[i],s=n.get(a.poolAddress);if(s==null)throw new Error("Pool does not exit");let o=s.parsePair(a.assetIn,a.assetOut),l;i>0?l=r[i-1].amountOut:l=typeof t=="string"?P.toBigInt(t,o.decimalsIn):t;let c=await this.ctx.getPoolFees(s,o.assetOut),{amountOut:m,calculatedOut:d,feePct:p,errors:g}=s.validateAndSell(o,l,c),b=this.getPoolFeeRange(c),y=s.spotPriceOutGivenIn(o),h=Math.pow(10,o.decimalsIn),f=l*y/BigInt(h),S=A.calculateDiffToRef(d,f);r.push({...a,assetInDecimals:o.decimalsIn,assetOutDecimals:o.decimalsOut,amountIn:l,amountOut:m,calculatedOut:d,spotPrice:y,tradeFeePct:p,tradeFeeRange:b,priceImpactPct:S,errors:g,isSupply(){return s.type==="Aave"&&s.tokens[0].id===a.assetIn},isWithdraw(){return s.type==="Aave"&&s.tokens[1].id===a.assetIn},toHuman(){return{...a,amountIn:P.toDecimal(l,o.decimalsIn),amountOut:P.toDecimal(m,o.decimalsOut),calculatedOut:P.toDecimal(d,o.decimalsOut),spotPrice:P.toDecimal(y,o.decimalsOut),tradeFeePct:p,tradeFeeRange:b,priceImpactPct:S,errors:g}}})}return r}async getMostLiquidRoute(t,e){return this.withCtx(t,e,async n=>{let r=this.buildRouteKey(t,e,n.pools),i=this.mlr.get(r);return i||this.calculateMostLiquidRoute(t,e,n)})}async getSpotPrice(t,e){return this.withCtx(t,e,async n=>{let{pools:r,poolsMap:i}=n,a=this.buildRouteKey(t,e,r),s=this.mlr.get(a);s||(s=await this.calculateMostLiquidRoute(t,e,n));let o=await this.toSellSwaps("1",s,i),l=this.getSellSpot(o),c=o[o.length-1].assetOutDecimals;return{amount:l,decimals:c}})}findBestBuyRoute(t){let e=t.sort((n,r)=>{let i=n[0].amountIn,a=r[0].amountIn;return i>a?1:-1});return e.find(n=>n.every(r=>r.errors.length==0))||e[0]}async getBestBuy(t,e,n){return this.getBuy(t,e,n)}getBuySpot(t){let e=t[0];if(t.length===1)return e.spotPrice;let n=t.map(s=>s.assetInDecimals).reduce((s,o)=>s+o),r=t.map(s=>s.spotPrice).reduce((s,o)=>s*o),i=n-e.assetInDecimals,a=Math.pow(10,i);return r/BigInt(a)}async getBuy(t,e,n,r){return this.withCtx(t,e,async({paths:i,poolsMap:a})=>{let s;if(r)s=await this.toBuySwaps(n,r,a);else{let o=i.map(c=>this.toBuySwaps(n,c,a)),l=await Promise.all(o);s=this.findBestBuyRoute(l)}return this.buildBuy(a,s)})}buildBuy(t,e){let n=e[e.length-1],r=e[0],i=this.isDirectTrade(e),a=this.getBuySpot(e),s=r.amountIn,o=i?r.calculatedIn:this.calculateDelta0X(n.amountOut,e,t),l=s-o,c=this.getRouteFeeRange(e),m=i?r.tradeFeePct:A.calculateBuyFee(o,s),d=Math.pow(10,n.assetOutDecimals),p=n.amountOut*a/BigInt(d),g;return o===0n?g=-100:g=A.calculateDiffToRef(p,o),{type:"Buy",amountOut:n.amountOut,amountIn:r.amountIn,spotPrice:a,tradeFee:l,tradeFeePct:m,tradeFeeRange:c,priceImpactPct:g,swaps:e,toHuman(){return{type:"Buy",amountOut:P.toDecimal(n.amountOut,n.assetOutDecimals),amountIn:P.toDecimal(r.amountIn,r.assetInDecimals),spotPrice:P.toDecimal(a,r.assetInDecimals),tradeFee:P.toDecimal(l,r.assetInDecimals),tradeFeePct:m,tradeFeeRange:c,priceImpactPct:g,swaps:e.map(b=>b.toHuman())}}}}calculateDelta0X(t,e,n){let r=[];for(let i=e.length-1;i>=0;i--){let a=e[i],s=n.get(a.poolAddress);if(s==null)throw new Error("Pool does not exit");let o=s.parsePair(a.assetIn,a.assetOut),l;i==e.length-1?l=t:l=r[0];let c=s.calculateInGivenOut(o,l);r.unshift(c)}return r[0]}async toBuySwaps(t,e,n){let r=[];for(let i=e.length-1;i>=0;i--){let a=e[i],s=n.get(a.poolAddress);if(s==null)throw new Error("Pool does not exit");let o=s.parsePair(a.assetIn,a.assetOut),l;i==e.length-1?l=typeof t=="string"?P.toBigInt(t,o.decimalsOut):t:l=r[0].amountIn;let c=await this.ctx.getPoolFees(s,o.assetOut),{amountIn:m,calculatedIn:d,feePct:p,errors:g}=s.validateAndBuy(o,l,c),b=this.getPoolFeeRange(c),y=s.spotPriceInGivenOut(o),h=Math.pow(10,o.decimalsOut),f=l*y/BigInt(h),S;d===0n?S=-100:S=A.calculateDiffToRef(f,d),r.unshift({...a,assetInDecimals:o.decimalsIn,assetOutDecimals:o.decimalsOut,amountOut:l,amountIn:m,calculatedIn:d,spotPrice:y,tradeFeePct:p,tradeFeeRange:b,priceImpactPct:S,errors:g,isSupply(){return s.type==="Aave"&&s.tokens[0].id===a.assetIn},isWithdraw(){return s.type==="Aave"&&s.tokens[1].id===a.assetIn},toHuman(){return{...a,amountOut:P.toDecimal(l,o.decimalsOut),amountIn:P.toDecimal(m,o.decimalsIn),calculatedIn:P.toDecimal(d,o.decimalsIn),spotPrice:P.toDecimal(y,o.decimalsIn),tradeFeePct:p,tradeFeeRange:b,priceImpactPct:S,errors:g}}})}return r}};var Jn=6e3,mn=1000000000000000n,ae=6,pn=-5,dn=216e5,nc=3,Zn=6;var gn=require("polkadot-api");var H=class{static build(t){return t.map(({assetIn:e,assetOut:n,pool:r,poolId:i})=>r==="Stableswap"?{pool:(0,gn.Enum)("Stableswap",i),asset_in:e,asset_out:n}:{pool:(0,gn.Enum)(r),asset_in:e,asset_out:n})}};var Ft=class{schedulerOptions;router;constructor(t,e={}){this.router=t,this.schedulerOptions=Object.freeze({blockTime:e.blockTime??6e3,minBudgetInNative:e.minBudgetInNative??mn})}get blockTime(){return this.schedulerOptions.blockTime}get minOrderBudget(){return this.schedulerOptions.minBudgetInNative}async getDcaOrder(t,e,n,r,i){let[a,s]=await Promise.all([this.getMinimumOrderBudget(t),this.router.getBestSell(t,e,n)]),{amountIn:o,swaps:l,priceImpactPct:c}=s,m=l[0],d=l[l.length-1],{assetInDecimals:p}=m,{assetOutDecimals:g}=d,b=Math.abs(c),y=this.getMinimumTradeCount(o,a),h=this.getOptimalTradeCount(b),f=i?Math.round(r/i):h,S=Math.ceil(r/y),T=Math.round(r/h),N=Math.round(r/f),V=o/BigInt(f),C=await this.router.getBestSell(t,e,V),G=o<a,lt=[];G&&lt.push("OrderTooSmall");let ct=C.amountOut*BigInt(f),X=this.toBlockPeriod(N),nt=C.tradeFee*BigInt(f),Ct=H.build(l),ut={assetIn:t,assetOut:e,errors:lt,frequencyMin:S,frequencyOpt:T,frequency:N,tradeCount:f,tradeFee:nt,tradeImpactPct:C.priceImpactPct,tradePeriod:X,tradeRoute:Ct,type:"Dca"};return{...ut,amountIn:o,amountOut:ct,tradeAmountIn:C.amountIn,tradeAmountOut:C.amountOut,toHuman(){return{...ut,amountIn:P.toDecimal(o,p),amountOut:P.toDecimal(ct,g),tradeAmountIn:P.toDecimal(C.amountIn,p),tradeAmountOut:P.toDecimal(C.amountOut,g)}}}}async getMinimumOrderBudget(t){if(0===t)return this.minOrderBudget;let e=await this.router.getSpotPrice(0,t),n=10n**BigInt(12);if(e)return this.minOrderBudget*e.amount/n;throw new Error("Unable to calculate order budget")}getMinimumTradeCount(t,e){let n=e*2n/10n;if(n===0n)return 0;let r=t+n/2n;return Number(r/n)}getOptimalTradeCount(t){let e=Math.round(t*10)||1;return Math.max(e,3)}async getTwapSellOrder(t,e,n){let[r,i]=await Promise.all([this.getMinimumOrderBudget(t),this.router.getBestSell(t,e,n)]),{amountIn:a,swaps:s,priceImpactPct:o}=i,l=s[0],c=s[s.length-1],{assetInDecimals:m}=l,{assetOutDecimals:d}=c,p=Math.abs(o),g=this.getTwapTradeCount(p),b=a/BigInt(g),y=await this.router.getBestSell(l.assetIn,c.assetOut,b),h=g===1,f=a<r,S=y.priceImpactPct<-5,T=[];f||h?T.push("OrderTooSmall"):S&&T.push("OrderImpactTooBig");let N=y.amountOut*BigInt(g),V=y.tradeFee*BigInt(g),C=H.build(s),G={assetIn:t,assetOut:e,errors:T,tradeCount:g,tradeImpactPct:y.priceImpactPct,tradePeriod:6,tradeRoute:C,type:"TwapSell"};return{...G,amountIn:a,amountOut:N,tradeAmountIn:y.amountIn,tradeAmountOut:y.amountOut,tradeFee:V,toHuman(){return{...G,amountIn:P.toDecimal(a,m),amountOut:P.toDecimal(N,d),tradeAmountIn:P.toDecimal(y.amountIn,m),tradeAmountOut:P.toDecimal(y.amountOut,d),tradeFee:P.toDecimal(V,d)}}}}async getTwapBuyOrder(t,e,n){let[r,i]=await Promise.all([this.getMinimumOrderBudget(t),this.router.getBestBuy(t,e,n)]),{amountOut:a,swaps:s,priceImpactPct:o}=i,l=s[0],c=s[s.length-1],{assetInDecimals:m}=l,{assetOutDecimals:d}=c,p=Math.abs(o),g=this.getTwapTradeCount(p),b=a/BigInt(g),y=await this.router.getBestBuy(l.assetIn,c.assetOut,b),h=y.amountIn*BigInt(g),f=g===1,S=h<r,T=y.priceImpactPct<-5,N=[];S||f?N.push("OrderTooSmall"):T&&N.push("OrderImpactTooBig");let V=y.tradeFee*BigInt(g),C=H.build(s),G={assetIn:t,assetOut:e,errors:N,tradeCount:g,tradeImpactPct:y.priceImpactPct,tradePeriod:6,tradeRoute:C,type:"TwapBuy"};return{...G,amountIn:h,amountOut:a,tradeAmountIn:y.amountIn,tradeAmountOut:y.amountOut,tradeFee:V,toHuman(){return{...G,amountIn:P.toDecimal(h,m),amountOut:P.toDecimal(a,d),tradeAmountIn:P.toDecimal(y.amountIn,m),tradeAmountOut:P.toDecimal(y.amountOut,d),tradeFee:P.toDecimal(V,m)}}}}getTwapTradeCount(t){let e=this.getOptimalTradeCount(t);if(this.getTwapExecutionTime(e)>216e5){let r=216e5/(this.blockTime*6);return Math.round(r)}return e}getTwapExecutionTime(t){return t*6*this.blockTime}toBlockPeriod(t){let e=t/this.blockTime,n=Math.round(e);return Math.max(n,6)}};var bn={};I(bn,{BIG_10:()=>nr,BIG_BILL:()=>rr,StakingApi:()=>oe,StakingClient:()=>le});var tr=require("@polkadot/util-crypto"),er=require("@polkadot/util"),Pt=require("@galacticcouncil/math-staking"),ht=J(require("big.js")),nr=(0,ht.default)(10),rr=(0,ht.default)(nr.pow(12));function Gr(u){return(0,tr.encodeAddress)((0,er.stringToU8a)(("modl"+u).padEnd(32,"\0")),63)}var oe=class{client;balanceClient;constructor(t,e){this.client=t,this.balanceClient=e}async getFreePotBalance(){let t=await this.client.getPalletId(),e=Gr(t);return(await this.balanceClient.getBalance(e,0)).transferable}async getStakingPosition(t){let[e,n]=await Promise.all([this.client.getStakingPositionsValue(t),this.client.getStakingVotes(t)]),r=e?.created_at,i=await n.reduce(async(a,[s,o])=>{let l=await a,c=s,m=o.amount,d=o.conviction.toString(),p=await this.client.getReferendumInfo(c);return p&&(p.type==="Approved"||p.type==="Rejected")&&l.push({id:c,amount:m,conviction:d}),l},Promise.resolve([]));return{stake:e?.stake,rewardPerStake:e?.reward_per_stake,createdAt:r,actionPoints:e?.action_points,accumulatedUnpaidRewards:e?.accumulated_unpaid_rewards,accumulatedSlashPoints:e?.accumulated_slash_points,accumulatedLockedRewards:e?.accumulated_locked_rewards,votes:i}}async getStake(t){let e=await this.client.getNFTCollectionId(),[n,r]=await Promise.all([this.client.getStaking(),this.client.getUniques(t,e)]),i=r.find(a=>a)?.itemId;return{totalStake:n?.total_stake,accumulatedRewardPerStake:n?.accumulated_reward_per_stake,potReservedBalance:n?.pot_reserved_balance,positionId:i,stakePosition:i?await this.getStakingPosition(i):void 0}}async getRewards(t,e){let n=await this.getStake(t),{potReservedBalance:r,accumulatedRewardPerStake:i,totalStake:a,stakePosition:s}=n;if(!s)return;let[o,l,c,m]=await Promise.all([this.getFreePotBalance(),this.client.getPeriodLength(),this.client.getUnclaimablePeriods(),this.client.getSixBlockSince()]),d=(0,ht.default)(o.toString()).minus(r.toString()),p=i.toString(),g=(0,ht.default)(e).plus(1).toString();d.gt(0)&&a>0&&(p=(0,Pt.calculate_accumulated_rps)(i.toString(),d.toString(),a.toString()));let b=(0,Pt.calculate_period_number)(l.toString(),e,m??g),y=(0,Pt.calculate_period_number)(l.toString(),s.createdAt?.toString()??"",m??g),h=(0,Pt.calculate_rewards)(p,s.rewardPerStake?.toString()??"",s.stake?.toString()??""),f=(0,ht.default)(h).plus(s.accumulatedUnpaidRewards?.toString()||"0").plus(s.accumulatedLockedRewards?.toString()||"0");if(!(0,ht.default)(b).minus(y).lte(c.toString()))return f.div(rr).toString()}};var le=class extends D{async getPalletId(){let t=this.api.constants.Staking.PalletId;return(await t()).asText()}async getPeriodLength(){let t=this.api.constants.Staking.PeriodLength;return await t()}async getUnclaimablePeriods(){let t=this.api.constants.Staking.UnclaimablePeriods;return await t()}async getNFTCollectionId(){let t=this.api.constants.Staking.NFTCollectionId;return await t()}async getStaking(){return await this.api.query.Staking.Staking.getValue()}async getUniques(t,e){return(await this.api.query.Uniques.Account.getEntries(t,e)).map(({keyArgs:a})=>{let[s,o,l]=a;return{address:s,collectionId:o,itemId:l}})}async getStakingPositionsValue(t){return await this.api.query.Staking.Positions.getValue(t)}async getStakingVotes(t){return await this.api.query.Staking.Votes.getValue(t)}async getReferendumInfo(t){return await this.api.query.Referenda.ReferendumInfoFor.getValue(t)}async getSixBlockSince(){return(await this.api.query.Staking.SixSecBlocksSince.getValue()).toString()}};var Pn={};I(Pn,{TxBuilderFactory:()=>kt});var hn=require("polkadot-api");function ir(u){let t=[],e=u;for(;e&&typeof e=="object"&&"type"in e;)t.push(e.type),e=e.value;return t.join(".")}var Et=class extends D{evm;evmClient;balanceClient;aaveUtils;constructor(t,e){super(t),this.evm=e,this.evmClient=e.getWsProvider(),this.balanceClient=new z(t),this.aaveUtils=new pt(e)}wrapTx(t,e){return{name:t,get:()=>e,dryRun:n=>this.dryRun(n,e)}}async dispatchWithExtraGas(t){return this.api.tx.Dispatcher.dispatch_with_extra_gas({call:t.decodedCall,extra_gas:ke})}async dryRun(t,e){let n=(0,hn.Enum)("Signed",t),r=(0,hn.Enum)("system",n),a=await this.client.getUnsafeApi().apis.DryRunApi.dry_run_call(r,e.decodedCall),s=a.success&&!a.value.execution_result.success?a.value.execution_result.value.error:null;if(s){let o=ir(s.value);throw new Error("Dry run execution error!",{cause:o})}return a}isDirectOmnipoolTrade(t){return t.length===1&&t[0].pool==="Omnipool"}};var Oe=class extends Et{_trade;_beneficiary;_slippagePct=1;setTrade(t){return this._trade=t,this}withBeneficiary(t){return this._beneficiary=t,this}withSlippage(t){return this._slippagePct=t,this}get trade(){if(!this._trade)throw new Error("Trade not set. Use setTrade().");return this._trade}get beneficiary(){if(!this._beneficiary)throw new Error("Beneficiary not set. Use withBeneficiary().");return this._beneficiary}get slippagePct(){return this._slippagePct}async build(){let{amountIn:t,swaps:e,type:n}=this.trade;if(n==="Buy")return this.buildBuyTx();let{assetIn:r}=e[0],i=await this.balanceClient.getBalance(this.beneficiary,r);return t>=i.transferable-5n?this.buildSellAllTx():this.buildSellTx()}async buildBuyTx(){let{amountIn:t,amountOut:e,swaps:n}=this.trade,r=n[0],i=n[n.length-1],a=A.getFraction(t,this.slippagePct),s=r.assetIn,o=i.assetOut,l=t+a,c;return this.isDirectOmnipoolTrade(n)?c=this.api.tx.Omnipool.buy({asset_in:s,asset_out:o,amount:e,max_sell_amount:l}):c=this.api.tx.Router.buy({asset_in:s,asset_out:o,amount_out:e,max_amount_in:l,route:H.build(n)}),this.wrapTx("RouterBuy",c)}async buildSellTx(){let{amountIn:t,amountOut:e,swaps:n}=this.trade,r=n[0],i=n[n.length-1],a=A.getFraction(e,this.slippagePct),s=r.assetIn,o=i.assetOut,l=e-a,c;return this.isDirectOmnipoolTrade(n)?c=this.api.tx.Omnipool.sell({asset_in:s,asset_out:o,amount:t,min_buy_amount:l}):c=this.api.tx.Router.sell({asset_in:s,asset_out:o,amount_in:t,min_amount_out:l,route:H.build(n)}),r.isWithdraw()&&await this.aaveUtils.hasBorrowPositions(this.beneficiary)&&(c=await this.dispatchWithExtraGas(c)),this.wrapTx("RouterSell",c)}async buildSellAllTx(){let{amountOut:t,swaps:e}=this.trade,n=e[0],r=e[e.length-1],i=A.getFraction(t,this.slippagePct),a=n.assetIn,s=r.assetOut,o=t-i,l=this.api.tx.Router.sell_all({asset_in:a,asset_out:s,min_amount_out:o,route:H.build(e)});return n.isWithdraw()&&await this.aaveUtils.hasBorrowPositions(this.beneficiary)&&(l=await this.dispatchWithExtraGas(l)),this.wrapTx("RouterSellAll",l)}};var Ae=require("polkadot-api");var Be=class extends Et{_order;_beneficiary;_maxRetries=3;_slippagePct=1;setOrder(t){return this._order=t,this}withBeneficiary(t){return this._beneficiary=t,this}withMaxRetries(t){return this._maxRetries=t,this}withSlippage(t){return this._slippagePct=t,this}get order(){if(!this._order)throw new Error("Order not set. Use setOrder().");return this._order}get beneficiary(){if(!this._beneficiary)throw new Error("Beneficiary not set. Use withBeneficiary().");return this._beneficiary}get maxRetries(){return this._maxRetries}get slippagePct(){return this._slippagePct}async build(){let{type:t}=this.order;switch(t){case"Dca":return this.buildDcaTx();case"TwapSell":return this.buildTwapSellTx();case"TwapBuy":return this.buildTwapBuyTx();default:throw new Error(`Unsupported TradeOrderType: ${t}`)}}buildDcaTx(){let{amountIn:t,assetIn:e,assetOut:n,tradeAmountIn:r,tradePeriod:i,tradeRoute:a}=this.order,s=this.api.tx.DCA.schedule({schedule:{owner:this.beneficiary,period:i,max_retries:this.maxRetries,total_amount:t,slippage:this.slippagePct*1e4,stability_threshold:void 0,order:(0,Ae.Enum)("Sell",{asset_in:e,asset_out:n,amount_in:r,min_amount_out:0n,route:a})},start_execution_block:void 0});return this.wrapTx("DcaSchedule",s)}buildTwapSellTx(){let{amountIn:t,assetIn:e,assetOut:n,tradeAmountIn:r,tradeAmountOut:i,tradePeriod:a,tradeRoute:s}=this.order,o=A.getFraction(i,this.slippagePct),l=i-o,c=this.api.tx.DCA.schedule({schedule:{owner:this.beneficiary,period:a,max_retries:this.maxRetries,total_amount:t,slippage:this.slippagePct*1e4,stability_threshold:void 0,order:(0,Ae.Enum)("Sell",{asset_in:e,asset_out:n,amount_in:r,min_amount_out:l,route:s})},start_execution_block:void 0});return this.wrapTx("DcaSchedule.twapSell",c)}buildTwapBuyTx(){let{amountIn:t,assetIn:e,assetOut:n,tradeAmountIn:r,tradeAmountOut:i,tradePeriod:a,tradeRoute:s}=this.order,o=A.getFraction(r,this.slippagePct),l=r+o,c=this.api.tx.DCA.schedule({schedule:{owner:this.beneficiary,period:a,max_retries:this.maxRetries,total_amount:t,slippage:this.slippagePct*1e4,stability_threshold:void 0,order:(0,Ae.Enum)("Buy",{asset_in:e,asset_out:n,amount_out:i,max_amount_in:l,route:s})},start_execution_block:void 0});return this.wrapTx("DcaSchedule.twapBuy",c)}};var kt=class{client;evmClient;constructor(t,e){this.client=t,this.evmClient=e}trade(t){return new Oe(this.client,this.evmClient).setTrade(t)}order(t){return new Be(this.client,this.evmClient).setOrder(t)}};async function Ur(u){let t=new xt(u),e=new Ht(u),[n,r]=await Promise.all([t.getBlockTime(),t.getMinOrderBudget()]),i=new Bt(u,e).withAave().withOmnipool().withStableswap().withXyk(),a=new z(u),s=new le(u),o=new Wt(u),l=new pt(e),c=new Rt(i),m=new Ft(c,{blockTime:n,minBudgetInNative:r}),d=new oe(s,a),p=new Vt(o,a,{blockTime:n});return{api:{aave:l,router:c,scheduler:m,staking:d,farm:p},client:{asset:new wt(u),balance:a,evm:e},ctx:{pool:i},tx:new kt(u,e),destroy:()=>{i.destroy()}}}0&&(module.exports={aave,api,big,client,const:null,createSdkContext,erc20,error,evm,farm,fmt,h160,json,math,pool,sor,staking,tx,xc});
package/build/index.mjs CHANGED
@@ -1 +1 @@
1
- var Bn=Object.defineProperty;var T=(u,t)=>{for(var e in t)Bn(u,e,{get:t[e],enumerable:!0})};var Ce={};T(Ce,{Papi:()=>_,getWs:()=>En});import{hydration as _n}from"@galacticcouncil/descriptors";function Ee(u){switch(u){case!0:case"true":case 1:case"1":case"on":case"yes":return!0;default:return!1}}var _=class{client;api;constructor(t){this.client=t,this.api=this.client.getTypedApi(_n)}log(t,...e){let n=typeof window>"u"?process.env.GC_DEBUG:window.localStorage.getItem("gc.debug");Ee(n)&&console.log(t,...e)}};import{createClient as Rn}from"polkadot-api";import{withPolkadotSdkCompat as Fn}from"polkadot-api/polkadot-sdk-compat";var En=async u=>{let t=typeof u=="string"?u.split(","):u,r=(typeof window>"u"?(await import("polkadot-api/ws-provider/node")).getWsProvider:(await import("polkadot-api/ws-provider/web")).getWsProvider)(t);return Rn(Fn(r))};var Ge={};T(Ge,{AAVE_GAS_LIMIT:()=>ae,AAVE_LENDING_POOL_ADDRESS:()=>Kt,AAVE_POOL_ABI:()=>ne,AAVE_POOL_DATA_PROVIDER:()=>Xt,AAVE_POOL_DATA_PROVIDER_ABI:()=>Yt,AAVE_POOL_PROXY:()=>re,AAVE_ROUNDING_THRESHOLD:()=>li,AAVE_UINT_256_MAX:()=>Cn,AaveClient:()=>Pt,AaveUtils:()=>Q});var ne=[{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"reserve",type:"address"},{indexed:!1,internalType:"address",name:"user",type:"address"},{indexed:!0,internalType:"address",name:"onBehalfOf",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"},{indexed:!0,internalType:"uint16",name:"referralCode",type:"uint16"}],name:"Supply",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"reserve",type:"address"},{indexed:!0,internalType:"address",name:"user",type:"address"},{indexed:!0,internalType:"address",name:"to",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"}],name:"Withdraw",type:"event"},{inputs:[{internalType:"address",name:"asset",type:"address"},{internalType:"uint256",name:"amount",type:"uint256"},{internalType:"address",name:"to",type:"address"}],name:"withdraw",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"nonpayable",type:"function"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"reserve",type:"address"},{indexed:!1,internalType:"address",name:"user",type:"address"},{indexed:!0,internalType:"address",name:"onBehalfOf",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"},{indexed:!1,internalType:"enum DataTypes.InterestRateMode",name:"interestRateMode",type:"uint8"},{indexed:!1,internalType:"uint256",name:"borrowRate",type:"uint256"},{indexed:!0,internalType:"uint16",name:"referralCode",type:"uint16"}],name:"Borrow",type:"event"},{inputs:[{internalType:"address",name:"asset",type:"address"},{internalType:"uint256",name:"amount",type:"uint256"},{internalType:"uint256",name:"interestRateMode",type:"uint256"},{internalType:"uint16",name:"referralCode",type:"uint16"},{internalType:"address",name:"onBehalfOf",type:"address"}],name:"borrow",outputs:[],stateMutability:"nonpayable",type:"function"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"reserve",type:"address"},{indexed:!0,internalType:"address",name:"user",type:"address"},{indexed:!0,internalType:"address",name:"repayer",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"},{indexed:!1,internalType:"bool",name:"useATokens",type:"bool"}],name:"Repay",type:"event"},{inputs:[{internalType:"address",name:"user",type:"address"}],name:"getUserAccountData",outputs:[{internalType:"uint256",name:"totalCollateralBase",type:"uint256"},{internalType:"uint256",name:"totalDebtBase",type:"uint256"},{internalType:"uint256",name:"availableBorrowsBase",type:"uint256"},{internalType:"uint256",name:"currentLiquidationThreshold",type:"uint256"},{internalType:"uint256",name:"ltv",type:"uint256"},{internalType:"uint256",name:"healthFactor",type:"uint256"}],stateMutability:"view",type:"function"}];var Yt=[{inputs:[{internalType:"contract IEACAggregatorProxy",name:"_networkBaseTokenPriceInUsdProxyAggregator",type:"address"},{internalType:"contract IEACAggregatorProxy",name:"_marketReferenceCurrencyPriceInUsdProxyAggregator",type:"address"}],stateMutability:"nonpayable",type:"constructor"},{inputs:[],name:"ETH_CURRENCY_UNIT",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[],name:"MKR_ADDRESS",outputs:[{internalType:"address",name:"",type:"address"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"bytes32",name:"_bytes32",type:"bytes32"}],name:"bytes32ToString",outputs:[{internalType:"string",name:"",type:"string"}],stateMutability:"pure",type:"function"},{inputs:[{internalType:"contract IPoolAddressesProvider",name:"provider",type:"address"}],name:"getReservesData",outputs:[{components:[{internalType:"address",name:"underlyingAsset",type:"address"},{internalType:"string",name:"name",type:"string"},{internalType:"string",name:"symbol",type:"string"},{internalType:"uint256",name:"decimals",type:"uint256"},{internalType:"uint256",name:"baseLTVasCollateral",type:"uint256"},{internalType:"uint256",name:"reserveLiquidationThreshold",type:"uint256"},{internalType:"uint256",name:"reserveLiquidationBonus",type:"uint256"},{internalType:"uint256",name:"reserveFactor",type:"uint256"},{internalType:"bool",name:"usageAsCollateralEnabled",type:"bool"},{internalType:"bool",name:"borrowingEnabled",type:"bool"},{internalType:"bool",name:"stableBorrowRateEnabled",type:"bool"},{internalType:"bool",name:"isActive",type:"bool"},{internalType:"bool",name:"isFrozen",type:"bool"},{internalType:"uint128",name:"liquidityIndex",type:"uint128"},{internalType:"uint128",name:"variableBorrowIndex",type:"uint128"},{internalType:"uint128",name:"liquidityRate",type:"uint128"},{internalType:"uint128",name:"variableBorrowRate",type:"uint128"},{internalType:"uint128",name:"stableBorrowRate",type:"uint128"},{internalType:"uint40",name:"lastUpdateTimestamp",type:"uint40"},{internalType:"address",name:"aTokenAddress",type:"address"},{internalType:"address",name:"stableDebtTokenAddress",type:"address"},{internalType:"address",name:"variableDebtTokenAddress",type:"address"},{internalType:"address",name:"interestRateStrategyAddress",type:"address"},{internalType:"uint256",name:"availableLiquidity",type:"uint256"},{internalType:"uint256",name:"totalPrincipalStableDebt",type:"uint256"},{internalType:"uint256",name:"averageStableRate",type:"uint256"},{internalType:"uint256",name:"stableDebtLastUpdateTimestamp",type:"uint256"},{internalType:"uint256",name:"totalScaledVariableDebt",type:"uint256"},{internalType:"uint256",name:"priceInMarketReferenceCurrency",type:"uint256"},{internalType:"address",name:"priceOracle",type:"address"},{internalType:"uint256",name:"variableRateSlope1",type:"uint256"},{internalType:"uint256",name:"variableRateSlope2",type:"uint256"},{internalType:"uint256",name:"stableRateSlope1",type:"uint256"},{internalType:"uint256",name:"stableRateSlope2",type:"uint256"},{internalType:"uint256",name:"baseStableBorrowRate",type:"uint256"},{internalType:"uint256",name:"baseVariableBorrowRate",type:"uint256"},{internalType:"uint256",name:"optimalUsageRatio",type:"uint256"},{internalType:"bool",name:"isPaused",type:"bool"},{internalType:"bool",name:"isSiloedBorrowing",type:"bool"},{internalType:"uint128",name:"accruedToTreasury",type:"uint128"},{internalType:"uint128",name:"unbacked",type:"uint128"},{internalType:"uint128",name:"isolationModeTotalDebt",type:"uint128"},{internalType:"bool",name:"flashLoanEnabled",type:"bool"},{internalType:"uint256",name:"debtCeiling",type:"uint256"},{internalType:"uint256",name:"debtCeilingDecimals",type:"uint256"},{internalType:"uint8",name:"eModeCategoryId",type:"uint8"},{internalType:"uint256",name:"borrowCap",type:"uint256"},{internalType:"uint256",name:"supplyCap",type:"uint256"},{internalType:"uint16",name:"eModeLtv",type:"uint16"},{internalType:"uint16",name:"eModeLiquidationThreshold",type:"uint16"},{internalType:"uint16",name:"eModeLiquidationBonus",type:"uint16"},{internalType:"address",name:"eModePriceSource",type:"address"},{internalType:"string",name:"eModeLabel",type:"string"},{internalType:"bool",name:"borrowableInIsolation",type:"bool"}],internalType:"struct IUiPoolDataProviderV3.AggregatedReserveData[]",name:"",type:"tuple[]"},{components:[{internalType:"uint256",name:"marketReferenceCurrencyUnit",type:"uint256"},{internalType:"int256",name:"marketReferenceCurrencyPriceInUsd",type:"int256"},{internalType:"int256",name:"networkBaseTokenPriceInUsd",type:"int256"},{internalType:"uint8",name:"networkBaseTokenPriceDecimals",type:"uint8"}],internalType:"struct IUiPoolDataProviderV3.BaseCurrencyInfo",name:"",type:"tuple"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"contract IPoolAddressesProvider",name:"provider",type:"address"}],name:"getReservesList",outputs:[{internalType:"address[]",name:"",type:"address[]"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"contract IPoolAddressesProvider",name:"provider",type:"address"},{internalType:"address",name:"user",type:"address"}],name:"getUserReservesData",outputs:[{components:[{internalType:"address",name:"underlyingAsset",type:"address"},{internalType:"uint256",name:"scaledATokenBalance",type:"uint256"},{internalType:"bool",name:"usageAsCollateralEnabledOnUser",type:"bool"},{internalType:"uint256",name:"stableBorrowRate",type:"uint256"},{internalType:"uint256",name:"scaledVariableDebt",type:"uint256"},{internalType:"uint256",name:"principalStableDebt",type:"uint256"},{internalType:"uint256",name:"stableBorrowLastUpdateTimestamp",type:"uint256"}],internalType:"struct IUiPoolDataProviderV3.UserReserveData[]",name:"",type:"tuple[]"},{internalType:"uint8",name:"",type:"uint8"}],stateMutability:"view",type:"function"},{inputs:[],name:"marketReferenceCurrencyPriceInUsdProxyAggregator",outputs:[{internalType:"contract IEACAggregatorProxy",name:"",type:"address"}],stateMutability:"view",type:"function"},{inputs:[],name:"networkBaseTokenPriceInUsdProxyAggregator",outputs:[{internalType:"contract IEACAggregatorProxy",name:"",type:"address"}],stateMutability:"view",type:"function"}];var re="0x1b02E051683b5cfaC5929C25E84adb26ECf87B38",Xt="0x112b087b60C1a166130d59266363C45F8aa99db0",Kt="0xf3Ba4D1b50f78301BDD7EAEa9B67822A15FCA691",ae=1000000n,li=5,Cn=BigInt("0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");var Pt=class{client;constructor(t){this.client=t.getWsProvider()}async getReservesData(){return await this.client.readContract({abi:Yt,address:Xt,args:[Kt],functionName:"getReservesData"})}async getUserReservesData(t){return await this.client.readContract({abi:Yt,address:Xt,args:[Kt,t],functionName:"getUserReservesData"})}async getUserAccountData(t){return await this.client.readContract({abi:ne,address:re,args:[t],functionName:"getUserAccountData"})}};var h={};T(h,{asBigInt:()=>Mn,toBigInt:()=>Dn,toDecimal:()=>kn});import j from"big.js";j.NE=-18;function kn(u,t,e=6,n){let r=j(u.toString()),a=j(10).pow(t);return r.div(a).round(e,n).toString()}function Dn(u,t){let e=j(10).pow(t),r=j(u).mul(e).toFixed(0,j.roundDown);return BigInt(r)}function Mn(u){return BigInt(u.round(0,j.roundDown).toFixed(0))}var et={};T(et,{ERC20:()=>ie});var ie=class{static fromAssetId(t){let e=Buffer.alloc(20,0);return e[15]=1,e.writeUInt32BE(t,16),"0x"+e.toString("hex")}static toAssetId(t){let e=Buffer.from(t.replace("0x",""),"hex");return e.length!==20||!this.isAssetAddress(t)?null:e.readUInt32BE(16)}static isAssetAddress(t){let e=Buffer.from("0000000000000000000000000000000100000000","hex"),n=Buffer.from(t.replace("0x",""),"hex");return n.length!==20?!1:n.subarray(0,16).equals(e.subarray(0,16))}};var v={};T(v,{FeeUtils:()=>ce,shiftNeg:()=>Gn});import Nn from"big.js";var ke={};T(ke,{HUB_ASSET_ID:()=>le,HYDRATION_OMNIPOOL_ADDRESS:()=>qn,HYDRATION_PARACHAIN_ID:()=>Ln,HYDRATION_SS58_PREFIX:()=>C,PERBILL_DENOMINATOR:()=>se,PERMILL_DENOMINATOR:()=>ft,RUNTIME_DECIMALS:()=>I,SYSTEM_ASSET_DECIMALS:()=>oe,SYSTEM_ASSET_ID:()=>F,TRADEABLE_DEFAULT:()=>nt});var I=18,ft=1e6,se=1e9,F=0,oe=12,Ln=2034,C=63,qn="7L53bUTBbfuj14UpdCNPwmgzzHSsrsTWBHX5pys32mVWM3C1",le=1,nt=15;var ce=class u{static toPct(t){let[e,n]=t;return u.safeDivide(e*100,n)}static toRaw(t){let[e,n]=t;return u.safeDivide(e,n)}static fromPermill(t){return[t,1e6]}static fromPerbill(t){return[t,1e9]}static fromRate(t,e){return[t,e]}static safeDivide(t,e,n=12){let r=10**n;return Math.round(t*r/e)/r}static safeRound(t){return parseFloat(t.toPrecision(15))}};function Gn(u,t){let e=Nn(typeof u=="bigint"?u.toString():u);return t===0?e.toString():e.div(Math.pow(10,t)).toString()}var zt={};T(zt,{H160:()=>me,isEvmAccount:()=>Me,isEvmAddress:()=>Le,isSs58Address:()=>qe});import{AccountId as St}from"polkadot-api";import{toHex as De}from"@polkadot-api/utils";import{Buffer as Y}from"buffer";var ue="ETH\0";function Me(u){if(!u)return!1;try{let t=St().enc(u),e=Y.from(ue);return Y.from(t.subarray(0,e.length)).equals(e)}catch{return!1}}function Le(u){return!!/^0x[a-fA-F0-9]{40}$/.test(u)}function qe(u){try{return St(63).enc(u),!0}catch{return!1}}var me=class u{static toAccount=t=>{let e=Y.from(t.slice(2),"hex"),n=Y.from(ue),r=Uint8Array.from(Y.concat([n,e,Y.alloc(8)])),a=De(r);return St(63).dec(a)};static fromAccount=t=>{let e=St().enc(t),n=Y.from(ue),r=e.slice(n.length,-8);return"0x"+Y.from(r).toString("hex")};static fromSS58=t=>{let n=St().enc(t).slice(0,20);return De(n)};static fromAny=t=>{if(Le(t))return t;if(Me(t))return u.fromAccount(t);if(qe(t))return u.fromSS58(t);throw new Error("Unknown address type")}};var $={};T($,{findNestedKey:()=>Un,findNestedObj:()=>Hn,jsonFormatter:()=>Vn});var Un=(u,t)=>{let e=[];return JSON.stringify(u,(n,r)=>(r&&r[t]&&e.push(r),r)),e[0]},Hn=(u,t,e)=>{let n;return JSON.stringify(u,(r,a)=>(a&&a[t]===e&&(n=a),a)),n},Vn=(u,t)=>typeof t=="bigint"?t.toString():t;var O={};T(O,{calculateBuyFee:()=>Kn,calculateDiffToAvg:()=>Wn,calculateDiffToRef:()=>Yn,calculateSellFee:()=>Xn,getFraction:()=>zn});import H from"big.js";function Wn(u,t){let e=H(u.toString()),n=H(t.toString());return e.minus(n).abs().div(e.plus(n).div(2)).mul(100).round(2).toNumber()}function Yn(u,t){if(t===0n)return 0;let e=H(u.toString()),n=H(t.toString());return e.minus(n).div(n).mul(100).round(2).toNumber()}function Xn(u,t){let e=H(u.toString()),n=H(t.toString());return H(1).minus(n.div(e)).mul(100).round(2).toNumber()}function Kn(u,t){let e=H(u.toString());return H(t.toString()).div(e).minus(1).mul(100).round(2).toNumber()}function zn(u,t,e=2){(t<.01||t>100)&&new Error("Supported range is from 0.01% - 100%");let n=Math.pow(10,e),r=BigInt(t*n);return u*r/BigInt(100*n)}var Ne={};T(Ne,{convertToId:()=>$n});import{Buffer as jn}from"buffer";function $n(u){let e=jn.from(u.replace("0x",""),"hex").subarray(16);return e.readUIntBE(0,e.length)}var{ERC20:jt}=et,{H160:pe}=zt,Qn=1.01,Jn=99999,Zn=10n**27n,tr=10n**18n,Q=class{client;constructor(t){this.client=new Pt(t)}async getSummary(t){let e=pe.fromAny(t),[n,r,a]=await Promise.all([this.client.getReservesData(),this.client.getUserReservesData(e),this.client.getUserAccountData(e)]),[s]=n,[i,o]=r,[l,c,m,d,p,g]=a,y=h.toDecimal(g,18),b=[];for(let P of i){let f=P.underlyingAsset.toLowerCase(),S=s.find(({underlyingAsset:yt})=>yt.toLowerCase()===f);if(!S)throw new Error("Missing pool reserve for "+f);let w=P.scaledATokenBalance,k=S.liquidityIndex,D=S.priceInMarketReferenceCurrency,R=w*k/Zn,z=Number(o===S.eModeCategoryId?S.eModeLiquidationThreshold:S.reserveLiquidationThreshold)/1e4,N=S.usageAsCollateralEnabled&&P.usageAsCollateralEnabledOnUser&&P.scaledATokenBalance>0n,W=jt.toAssetId(f);b.push({aTokenBalance:R,decimals:Number(S.decimals),isCollateral:N,priceInRef:D,reserveId:W,reserveAsset:f,reserveLiquidationThreshold:z})}return{healthFactor:Number(y),totalCollateral:l,totalDebt:c,reserves:b}}async hasBorrowPositions(t){let e=pe.fromAny(t),n=await this.client.getUserAccountData(e),[r,a]=n;return a>0n}async getHealthFactor(t){let e=pe.fromAny(t),n=await this.client.getUserAccountData(e),[r,a,s,i,o,l]=n,c=h.toDecimal(l,18);return Number(c)}async getHealthFactorAfterWithdraw(t,e,n){let{totalCollateral:r,totalDebt:a,reserves:s}=await this.getSummary(t),i=jt.fromAssetId(e),o=s.find(b=>b.reserveAsset===i);if(!o)throw new Error("Missing reserve ctx for "+i);let{decimals:l,isCollateral:c,priceInRef:m,reserveLiquidationThreshold:d}=o,p=h.toBigInt(n,l),g=c?p*m/10n**BigInt(l):0n,y=r-g;return y<=0n?0:this.calculateHealthFactor(y,d,a)}async getHealthFactorAfterSupply(t,e,n){let{totalCollateral:r,totalDebt:a,reserves:s}=await this.getSummary(t),i=jt.fromAssetId(e),o=s.find(y=>y.reserveAsset===i);if(!o)throw new Error("Missing reserve ctx for "+i);let{decimals:l,priceInRef:c,reserveLiquidationThreshold:m}=o,p=h.toBigInt(n,l)*c/10n**BigInt(l),g=r+p;return g<=0n?0:this.calculateHealthFactor(g,m,a)}async getMaxWithdraw(t,e){let{totalCollateral:n,totalDebt:r,reserves:a}=await this.getSummary(t),s=jt.fromAssetId(e),i=a.find(o=>o.reserveAsset===s);if(!i)throw new Error("Missing reserve ctx for "+s);return this.calculateWithdrawMax(i,n,r)}async getMaxWithdrawAll(t){let{totalCollateral:e,totalDebt:n,reserves:r}=await this.getSummary(t),a={};for(let s of r){let i=this.calculateWithdrawMax(s,e,n);s.reserveId&&(a[s.reserveId]=i)}return a}calculateHealthFactor(t,e,n){if(n===0n)return Jn;let r=10n**6n,a=h.toBigInt(e,18),s=t*a*r,i=n*tr,o=s/i;return Number(o)/1e6}calculateRequiredCollateral(t,e,n){let r=h.toBigInt(t,18),a=h.toBigInt(e,18);return(r*n+a-1n)/a}calculateWithdrawMax(t,e,n){let{aTokenBalance:r,decimals:a,priceInRef:s,reserveLiquidationThreshold:i}=t,o=this.calculateRequiredCollateral(Qn,i,n),l=e-o;if(l<=0n)return{amount:0n,decimals:a};let c=l*10n**BigInt(a)/s;return{amount:r<c?r:c,decimals:a}}};var Ve={};T(Ve,{AssetClient:()=>rt,BalanceClient:()=>U,ChainParams:()=>it});var rt=class extends _{SUPPORTED_TYPES=["StableSwap","Bond","Token","External","Erc20"];constructor(t){super(t)}async queryShares(){let e=await this.api.query.Stableswap.Pools.getEntries();return new Map(e.map(({keyArgs:n,value:r})=>{let[a]=n;return[a,r]}))}async queryBonds(){let e=await this.api.query.Bonds.Bonds.getEntries();return new Map(e.map(({keyArgs:n,value:r})=>{let[a]=n;return[a,r]}))}async queryAssets(){let e=await this.api.query.AssetRegistry.Assets.getEntries();return new Map(e.filter(({value:n})=>{let{asset_type:r}=n;return this.SUPPORTED_TYPES.includes(r.type)}).map(({keyArgs:n,value:r})=>{let[a]=n;return[a,r]}))}async queryAssetLocations(){let e=await this.api.query.AssetRegistry.AssetLocations.getEntries();return new Map(e.map(({keyArgs:n,value:r})=>{let[a]=n;return[a,r]}))}async mapToken(t,e,n,r){let{name:a,asset_type:s,is_sufficient:i,existential_deposit:o}=e,{symbol:l,decimals:c}=n.get(t)??{};return{id:t,name:a?.asText(),symbol:l,decimals:c,icon:l,type:s.type,isSufficient:i,location:r,existentialDeposit:o}}async mapBond(t,e,n,r){let[a,s]=r,{asset_type:i,is_sufficient:o,existential_deposit:l}=e,{symbol:c,decimals:m}=await this.mapToken(a,e,n),d=Number(s),p=new Intl.DateTimeFormat("en-GB"),g=[c,"Bond",p.format(d)].join(" ");return{id:t,name:g,symbol:c+"b",decimals:m,icon:c,type:i.type,isSufficient:o,existentialDeposit:l,underlyingAssetId:a,maturity:d}}async mapShares(t,e,n,r){let{assets:a}=r,{name:s,symbol:i,asset_type:o,is_sufficient:l,existential_deposit:c}=e,m=await Promise.all(a.map(async g=>{let{symbol:y}=await this.mapToken(g,e,n);return[g,y]})),d=Object.fromEntries(m),p=Object.values(d);return{id:t,name:p.join(", "),symbol:i?.asText()||s?.asText(),decimals:18,icon:p.join("/"),type:o.type,isSufficient:l,existentialDeposit:c,meta:d}}async mapExternal(t,e,n,r){let a=await this.mapToken(t,e,new Map,r),s=n?.find(i=>i.internalId===a.id);return s?{...a,decimals:s.decimals,name:s.name,symbol:s.symbol,icon:s.symbol,isWhiteListed:s.isWhiteListed}:a}parseMetadata(t){return new Map(Array.from(t,([e,n])=>[e,{symbol:n.symbol?.asText(),decimals:n.decimals}]))}async getOnChainAssets(t,e){let[n,r,a,s]=await Promise.all([this.queryAssets(),this.queryAssetLocations(),this.queryShares(),this.queryBonds()]),i=this.parseMetadata(n),o=[];for(let[l,c]of Array.from(n)){let m=r.get(l),{asset_type:d}=c,p;switch(d.type){case"Bond":let g=s.get(l);p=await this.mapBond(l,c,i,g);break;case"StableSwap":let y=a.get(l);p=await this.mapShares(l,c,i,y);break;case"External":p=await this.mapExternal(l,c,e,m);break;default:p=await this.mapToken(l,c,i,m)}o.push(p)}return t?o:o.filter(l=>this.isValidAsset(l))}isValidAsset(t){let e=Math.sign(t.decimals);return!!t.symbol&&(e===0||e===1)}};import{Subject as er,bufferCount as nr,combineLatest as rr,debounceTime as ar,distinctUntilChanged as Ue,finalize as ir,map as at,pairwise as sr,shareReplay as or,startWith as lr}from"rxjs";var U=class extends _{constructor(t){super(t)}async getBalance(t,e){return e===0?this.getSystemBalance(t):this.getTokenBalanceData(t,e)}async getSystemBalance(t){let e=this.api.query.System.Account,{data:n}=await e.getValue(t);return this.calculateBalance(n)}async getTokenBalance(t,e){let r=await this.api.query.Tokens.Accounts.getValue(t,e);return this.calculateBalance(r)}calculateBalance(t){let e=t.free>=t.frozen?t.free-t.frozen:0n,n=t.free+t.reserved;return{free:t.free,reserved:t.reserved,frozen:t.frozen,total:n,transferable:e}}async getErc20Balance(t,e){return this.getTokenBalanceData(t,e)}subscribeBalance(t){let e=this.subscribeSystemBalance(t),n=this.subscribeTokensBalance(t),r=this.subscribeErc20Balance(t);return rr([e,n,r]).pipe(ar(250),at(a=>a.flat()),lr([]),nr(2,1),at(([a,s],i)=>{if(i===0)return s;let o=a.reduce((c,m)=>(c.set(m.id,m.balance),c),new Map);return s.filter(c=>!He(c.balance,o.get(c.id)))}))}subscribeSystemBalance(t){return this.api.query.System.Account.watchValue(t,"best").pipe(at(n=>({id:0,balance:this.calculateBalance(n.data)})))}subscribeTokenBalance(t,e){return this.api.query.Tokens.Accounts.watchValue(t,e,"best").pipe(at(r=>({id:e,balance:r})))}subscribeTokensBalance(t){return this.api.query.Tokens.Accounts.watchEntries(t,{at:"best"}).pipe(Ue((n,r)=>!r.deltas),at(({deltas:n})=>{let r=[];return n?.deleted.forEach(a=>{let[s,i]=a.args;r.push({id:i,balance:this.calculateBalance({free:0n,reserved:0n,frozen:0n})})}),n?.upserted.forEach(a=>{let[s,i]=a.args;r.push({id:i,balance:this.calculateBalance(a.value)})}),r}))}subscribeErc20Balance(t,e){let n=new er,r=n.pipe(or(1)),a=async()=>(await this.api.query.AssetRegistry.Assets.getEntries()).filter(({value:l})=>{let{asset_type:c}=l;return c.type==="Erc20"}).map(({keyArgs:l})=>{let[c]=l;return c}),s=async()=>{let o=e||await a(),l=async()=>{let d=(await Promise.all(o.map(async p=>{let g=await this.getTokenBalanceData(t,p);return[p,g]}))).map(([p,g])=>({id:p,balance:g}));n.next(d)};await l();let c=this.api.query.System.Number.watchValue("best").subscribe(l);return()=>c.unsubscribe()},i;return s().then(o=>i=o),r.pipe(ir(()=>i?.()),sr(),at(([o,l],c)=>{if(c===0)return l;let m=o.reduce((p,g)=>(p.set(g.id,g.balance),p),new Map);return l.filter(p=>!He(p.balance,m.get(p.id)))}),Ue((o,l)=>l.length===0))}async getTokenBalanceData(t,e){let n=await this.api.apis.CurrenciesApi.account(e,t);return this.calculateBalance(n)}},He=(u,t)=>u!==void 0&&t!==void 0&&u.transferable===t.transferable&&u.total===t.total;var it=class extends _{_minOrderBudget;_blockTime;constructor(t){super(t)}async getBlockTime(){if(this._blockTime===void 0){let t=await this.api.constants.Aura.SlotDuration();this._blockTime=Number(t)}return this._blockTime}async getMinOrderBudget(){return this._minOrderBudget===void 0&&(this._minOrderBudget=await this.api.constants.DCA.MinBudgetInNativeCurrency()),this._minOrderBudget}};var We={};T(We,{AssetNotFound:()=>de,PoolNotFound:()=>Tt,RouteNotFound:()=>wt});var de=class extends Error{constructor(t){super(),this.message=`${t} not found`,this.name="AssetNotFound"}},Tt=class extends Error{constructor(t){super(),this.message=`${t} pool invalid`,this.name="PoolNotFound"}},wt=class extends Error{constructor(t,e){super(),this.message=`Route from ${t} to ${e} not found in current configuration`,this.name="RouteNotFound"}};var Ke={};T(Ke,{EvmClient:()=>xt,createChain:()=>ge});import{defineChain as cr}from"viem";var ur=["https://hydration-rpc.n.dwellir.com","https://hydration.dotters.network","https://rpc.helikon.io/hydradx","https://hydration.ibp.network","https://rpc.cay.hydration.cloud","https://rpc.parm.hydration.cloud","https://rpc.roach.hydration.cloud","https://rpc.zipp.hydration.cloud","https://rpc.sin.hydration.cloud","https://rpc.coke.hydration.cloud"],ge=()=>cr({id:222222,name:"Hydration",network:"hydration",nativeCurrency:{decimals:18,name:"WETH",symbol:"WETH"},rpcUrls:{default:{http:ur}},blockExplorers:{default:{name:"Hydration Explorer",url:"https://hydration.subscan.io"}},testnet:!1});import{createPublicClient as Ye,createWalletClient as mr,custom as Xe,http as pr}from"viem";var xt=class{client;chain;constructor(t){this.client=t,this.chain=ge()}get chainId(){return this.chain.id}get chainCurrency(){return this.chain.nativeCurrency.symbol}get chainDecimals(){return this.chain.nativeCurrency.decimals}getProvider(){return Ye({chain:this.chain,transport:pr()})}getWsProvider(){return Ye({transport:Xe({request:({method:t,params:e})=>this.client._request(t,e||[])})})}getSigner(t){return mr({account:t,chain:this.chain,transport:Xe(window.ethereum)})}};var Ze={};T(Ze,{LiquidityMiningApi:()=>It,LiquidityMiningClient:()=>vt});import{AccountId as Pr}from"polkadot-api";import E from"big.js";import{fixed_from_rational as Je}from"@galacticcouncil/math-liquidity-mining";var $t=class{result=new Map;getKey(t,e){return[e,t.toString()].join(",")}constructor(t,e){for(let n=0;n<t.length;++n){let[r,a]=t[n];this.result.set(this.getKey(a,r),e[n].free)}}freeBalance(t,e){return this.result.get(this.getKey(t,e))??0n}transfer(t,e,n,r){let a=this.getKey(t,e),s=this.getKey(t,n),i=this.result.get(a)??0n,o=this.result.get(s)??0n;if(i<r)throw new Error("Attempting to transfer more than is present");this.result.set(a,i+r),this.result.set(s,o+r)}};import J from"big.js";import{calculate_accumulated_rps as dr,calculate_global_farm_rewards as gr,calculate_loyalty_multiplier as br,calculate_user_reward as Qe,calculate_yield_farm_delta_rpvs as yr}from"@galacticcouncil/math-liquidity-mining";import ze from"big.js";var be=ze(10).pow(18),je=BigInt(ze(1).pow(18).toString()),$e=6e3;var hr="1000000000000000000",Qt=class{constructor(t,e,n){this.getAccount=t;this.getAsset=e;this.multiCurrency=n}async syncGlobalFarm(t,e,n){if(t.state.type!=="Active"||t.updated_at===e)return null;if(t.total_shares_z===0n)return t;let r=await this.getAsset(t.reward_currency),a=e-t.updated_at,s=this.getAccount(t.id),i=r?.existential_deposit;if(!i)throw new Error("Missing reward currency asset list");let o=this.multiCurrency.freeBalance(t.reward_currency,s),l=J(i.toString()),c=J(o.toString()).minus(l.lt(o.toString())?i.toString():o.toString()),m=J(gr(t.total_shares_z.toString(),n.toString(),J(t.yield_per_period.toString()).mul(be).round(0,J.roundDown).toFixed(),t.max_reward_per_period.toString(),a.toFixed()));if(c.lt(m)&&(m=c),m.eq(0))return t;let d=this.getAccount(0);return this.multiCurrency.transfer(t.reward_currency,s,d,BigInt(m.toFixed())),{...t,accumulated_rpz:BigInt(dr(t.accumulated_rpz.toString(),t.total_shares_z.toString(),m.toFixed()))}}syncYieldFarm(t,e,n){if(t.state.type!=="Active"||t.updated_at===n)return null;if(t.total_valued_shares===0n)return{...t,updated_at:n};let r=yr(t.accumulated_rpz.toString(),e.accumulated_rpz.toString(),t.multiplier.toString(),t.total_valued_shares.toString());return{...t,accumulated_rpvs:t.accumulated_rpvs+BigInt(r),updated_at:n}}getLoyaltyMultiplier(t,e){let n=J(1).mul(be).round(0,J.roundDown).toString();if(!e)return n;let{initial_reward_percentage:r,scale_coef:a}=e;return br(t.toFixed(),r.toString(),a.toFixed())}async claimRewards(t,e,n,r,a){if(e.state.type==="Terminated")return null;let s=Math.floor(r/t.blocks_per_period);if(n.updated_at===s)return null;let i=await this.syncGlobalFarm(t,s,a);if(!i)return null;let o=this.syncYieldFarm(e,i,s);if(!o)return null;let l=o.total_stopped-n.stopped_at_creation,c=o.updated_at-n.entered_at-l,m=this.getLoyaltyMultiplier(c,o.loyalty_curve),d=BigInt(Qe(n.accumulated_rpvs.toString(),n.valued_shares.toString(),n.accumulated_claimed_rewards.toString(),o.accumulated_rpvs.toString(),m)),p=BigInt(Qe(n.accumulated_rpvs.toString(),n.valued_shares.toString(),n.accumulated_claimed_rewards.toString(),o.accumulated_rpvs.toString(),hr));return{reward:d,maxReward:p,assetId:i.reward_currency}}};var fr=E(365.2425).times(24).times(60).times(60),It=class{client;balanceClient;options;constructor(t,e,n={}){this.client=t,this.balanceClient=e,this.options=Object.freeze({blockTime:n.blockTime??$e})}get blockTime(){return this.options.blockTime}async getOraclePrice(t,e){let n=[t,e].sort((a,s)=>a-s);if(t===e)return je;let r=await this.client.getOraclePrice(n);if(r){let{n:a,d:s}=r[0].price,i;return t<e?i=Je(a.toString(),s.toString()):i=Je(s.toString(),a.toString()),BigInt(i)}}getFarmAddress=(t,e)=>{let n=Buffer.from("modl","utf-8"),r=Buffer.from(e?"78796b4c4d704944":"4f6d6e6957684c4d","hex"),a=Buffer.from([t]),s=Buffer.concat([n,r,a]),o="0x"+Buffer.concat([s,Buffer.alloc(32-s.length)]).toString("hex");return Pr(63).dec(o)};getGlobalRewardPerPeriod(t,e,n,r){let a=E(r).times(t.toString()).times(e.toString()).div(18);return a.gte(n.toString())?n.toString():a.toString()}getPoolYieldPerPeriod(t,e,n,r){let a=E(t.toString()).times(e),s=E(n.toString()).times(r);return a.div(s.toString()).toString()}farmData(t,e,n){let{yieldFarm:r,globalFarm:a,priceAdjustment:s,balance:i,id:o}=t,{multiplier:l,loyalty_curve:c}=r,{blocks_per_period:m,yield_per_period:d,total_shares_z:p,max_reward_per_period:g,pending_rewards:y,accumulated_paid_rewards:b,planned_yielding_periods:P,updated_at:f,incentivized_asset:S,reward_currency:w,price_adjustment:k}=a,D=v.shiftNeg(s??k,18),R=v.shiftNeg(l,18),q=v.shiftNeg(c?.initial_reward_percentage??0,18),z=fr.div(E(this.blockTime).div(1e3).times(m)).toString(),N;if(p<=0)N=E(R).times(d.toString()).times(z).toString();else{let On=this.getGlobalRewardPerPeriod(p,d,g,D),An=this.getPoolYieldPerPeriod(On,R,p,D);N=E(An).times(z).toString()}let W=y+b,yt=g*BigInt(P),ht=i.transferable+W,Wt=ht-W,Be=E(Wt.toString()).div(g.toString()),_e=E(e).div(m.toString()).toString(),Re=(p>=0?Be.plus(f):Be.plus(_e)).toString(),xn=E(Re).times(m).toString(),In=E(p.toString()).div(E(g.toString()).div(d.toString())).div(Math.pow(10,18)).times(100).times(D).toFixed(2),Fe=E(W.toString()).div(ht.toString()).gte(.999);N=Fe?"0":E(N).div(n?2:1).times(100).toString();let vn=q?E(N).times(q).toString():void 0;return{apr:N,minApr:vn,isDistributed:Fe,estimatedEndPeriod:Re,estimatedEndBlock:xn,maxRewards:yt,incentivizedAsset:S,rewardCurrency:w,loyaltyCurve:c,currentPeriod:_e,potMaxRewards:ht,fullness:In,yieldFarmId:r.id,globalFarmId:a.id,poolId:o,distributedRewards:W,plannedYieldingPeriods:P}}async getAllOmnipoolFarms(){let e=(await this.client.getAllOmnipooFarms()).reduce((r,a)=>r.includes(a.keyArgs[0].toString())?r:[...r,a.keyArgs[0].toString()],[]),n=await Promise.all(e.map(async r=>{let a=await this.getOmnipoolFarms(r);if(a)return[r,a]}));return Object.fromEntries(n.filter(r=>!!r))}async getOmnipoolFarms(t){let e=await this.client.getOmnipooFarms(Number(t)),n=await this.client.getRelayBlockNumber(),r=await Promise.all(e.map(async({keyArgs:a,value:s})=>{let[,i]=a,o=s,l=await this.client.getOmnipoolGlobalFarm(i),c=await this.client.getOmnipoolYieldFarm(Number(t),i,o);if(!l||!c)return;let m=l.reward_currency,d=l.incentivized_asset,p=this.getFarmAddress(i),g=await this.getOraclePrice(m,d),y=await this.balanceClient.getBalance(p,m);return{id:t,globalFarm:l,yieldFarm:c,priceAdjustment:g,balance:y}}));return n?r.map(a=>a?this.farmData(a,n):void 0):[]}async getAllIsolatedFarms(){let e=(await this.client.getAllIsolatedFarms()).reduce((r,a)=>r.includes(a.keyArgs[0].toString())?r:[...r,a.keyArgs[0].toString()],[]),n=await Promise.all(e.map(async r=>{let a=await this.getIsolatedFarms(r);if(a)return[r,a]}));return Object.fromEntries(n.filter(r=>!!r))}async getIsolatedFarms(t){let e=await this.client.getIsolatedFarms(t),n=await this.client.getRelayBlockNumber(),r=await Promise.all(e.map(async({keyArgs:a,value:s})=>{let[,i]=a,o=s,l=await this.client.getIsolatedGlobalFarm(i),c=await this.client.getIsolatedYieldFarm(t,i,o);if(!l||!c)return;let m=l.reward_currency,d=l.incentivized_asset,p=this.getFarmAddress(i,!0),g=await this.getOraclePrice(m,d),y=await this.balanceClient.getBalance(p,m);return{id:t,globalFarm:l,yieldFarm:c,priceAdjustment:g,balance:y,farmAddress:p}}));return n?r.map(a=>a?this.farmData(a,n,!0):void 0):[]}async getDepositReward(t,e,n,r){let a=e.global_farm_id,s=e.yield_farm_id,i=n?await this.client.getIsolatedYieldFarm(t,a,s):await this.client.getOmnipoolYieldFarm(Number(t),a,s),o=n?await this.client.getIsolatedGlobalFarm(a):await this.client.getOmnipoolGlobalFarm(a);if(!o||!i)return;let l=o.reward_currency,c=o.incentivized_asset,m=[[this.getFarmAddress(0,n),o.reward_currency],[this.getFarmAddress(o.id,n),o.reward_currency]],d=await this.getAccountAssetBalances(m),p=await this.getOraclePrice(l,c),g=new $t(m,d),b=await new Qt(f=>this.getFarmAddress(f),f=>this.client.getAsset(f),g).claimRewards(o,i,e,r,p??o.price_adjustment);if(!b)return;let P=await this.client.getAsset(b.assetId);if(P&&!(b.reward<=P.existential_deposit))return b}async getAccountAssetBalances(t){let[e,n]=await Promise.all([Promise.all(t.filter(([a,s])=>s!==0).map(([a,s])=>this.balanceClient.getTokenBalance(a,s))),Promise.all(t.filter(([a,s])=>s===0).map(([a])=>this.balanceClient.getSystemBalance(a)))]),r=[];for(let a=0,s=0;a+s<t.length;){let i=a+s,[,o]=t[i];o===0?(r.push(n[s]),s+=1):(r.push(e[a]),a+=1)}return r}};import{Binary as Sr,Enum as Tr}from"polkadot-api";var vt=class extends _{omnipoolAssetIds=[];async getOraclePrice(t){return await this.api.query.EmaOracle.Oracles.getValue(Sr.fromText("omnipool"),t,Tr("TenMinutes"))}async getRelayBlockNumber(){return(await this.api.query.ParachainSystem.ValidationData.getValue())?.relay_parent_number}async getAllOmnipooFarms(){return this.api.query.OmnipoolWarehouseLM.ActiveYieldFarm.getEntries()}async getOmnipooFarms(t){return this.api.query.OmnipoolWarehouseLM.ActiveYieldFarm.getEntries(t)}async getOmnipoolGlobalFarm(t){return this.api.query.OmnipoolWarehouseLM.GlobalFarm.getValue(t)}async getOmnipoolYieldFarm(t,e,n){return this.api.query.OmnipoolWarehouseLM.YieldFarm.getValue(t,e,n)}async getAllIsolatedFarms(){return this.api.query.XYKWarehouseLM.ActiveYieldFarm.getEntries()}async getIsolatedFarms(t){return this.api.query.XYKWarehouseLM.ActiveYieldFarm.getEntries(t)}async getIsolatedGlobalFarm(t){return this.api.query.XYKWarehouseLM.GlobalFarm.getValue(t)}async getIsolatedYieldFarm(t,e,n){return this.api.query.XYKWarehouseLM.YieldFarm.getValue(t,e,n)}async getAsset(t){return this.api.query.AssetRegistry.Assets.getValue(t)}};var un={};T(un,{PoolContextProvider:()=>ct,PoolError:()=>Z,PoolFactory:()=>lt,PoolType:()=>A,aave:()=>Te,lbp:()=>he,omni:()=>Pe,stable:()=>fe,xyk:()=>Se});var he={};T(he,{LbpMath:()=>G,LbpPool:()=>Ot,LbpPoolClient:()=>Bt});import{calculate_in_given_out as wr,calculate_out_given_in as xr,calculate_linear_weights as Ir,calculate_pool_trade_fee as vr,get_spot_price as Or}from"@galacticcouncil/math-lbp";var G=class{static getSpotPrice(t,e,n,r,a){return Or(t,e,n,r,a)}static calculateInGivenOut(t,e,n,r,a){return wr(t,e,n,r,a)}static calculateOutGivenIn(t,e,n,r,a){return xr(t,e,n,r,a)}static calculateLinearWeights(t,e,n,r,a){return Ir(t,e,n,r,a)}static calculatePoolTradeFee(t,e,n){return vr(t,e,n)}};var A=(a=>(a.Aave="Aave",a.LBP="LBP",a.Omni="Omnipool",a.Stable="Stableswap",a.XYK="XYK",a))(A||{}),Z=(a=>(a.InsufficientTradingAmount="InsufficientTradingAmount",a.MaxInRatioExceeded="MaxInRatioExceeded",a.MaxOutRatioExceeded="MaxOutRatioExceeded",a.TradeNotAllowed="TradeNotAllowed",a.UnknownError="UnknownError",a))(Z||{});var{FeeUtils:tn}=v,Ot=class u{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;fee;repayFeeApply;static fromPool(t){return new u(t.address,t.tokens,t.maxInRatio,t.maxOutRatio,t.minTradingLimit,t.fee,t.repayFeeApply)}constructor(t,e,n,r,a,s,i){this.type="LBP",this.address=t,this.tokens=e,this.maxInRatio=n,this.maxOutRatio=r,this.minTradingLimit=a,this.fee=s,this.repayFeeApply=i}validatePair(t,e){return!0}parsePair(t,e){let n=new Map(this.tokens.map(s=>[s.id,s])),r=n.get(t),a=n.get(e);if(r==null)throw new Error("Pool does not contain tokenIn");if(a==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,balanceIn:r.balance,balanceOut:a.balance,decimalsIn:r.decimals,decimalsOut:a.decimals,weightIn:r.weight,weightOut:a.weight}}validateAndBuy(t,e,n){let r=this.tokens[0].id,a=[];e<this.minTradingLimit&&a.push("InsufficientTradingAmount");let s=t.balanceOut/this.maxOutRatio;if(e>s&&a.push("MaxOutRatioExceeded"),r===t.assetOut){let i=this.calculateTradeFee(e,n),o=tn.toPct(this.repayFeeApply?n.repayFee:n.exchangeFee),l=e+i,c=this.calculateInGivenOut(t,l),m=t.balanceIn/this.maxInRatio;return c>m&&a.push("MaxInRatioExceeded"),{amountIn:c,calculatedIn:c,amountOut:e,feePct:o,errors:a}}else{let i=this.calculateInGivenOut(t,e),o=t.balanceIn/this.maxInRatio;return i>o&&a.push("MaxInRatioExceeded"),{amountIn:i,calculatedIn:i,amountOut:e,feePct:0,errors:a}}}validateAndSell(t,e,n){let r=this.tokens[0].id,a=[];e<this.minTradingLimit&&a.push("InsufficientTradingAmount");let s=t.balanceIn/this.maxInRatio;if(e>s&&a.push("MaxInRatioExceeded"),r===t.assetIn){let i=this.calculateOutGivenIn(t,e),o=t.balanceOut/this.maxOutRatio;return i>o&&a.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:i,amountOut:i,feePct:0,errors:a}}else{let i=this.calculateOutGivenIn(t,e),o=this.calculateTradeFee(i,n),l=tn.toPct(this.repayFeeApply?n.repayFee:n.exchangeFee),c=i-o,m=t.balanceOut/this.maxOutRatio;return c>m&&a.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:i,amountOut:c,feePct:l,errors:a}}}calculateInGivenOut(t,e){let n=G.calculateInGivenOut(t.balanceIn.toString(),t.balanceOut.toString(),t.weightIn.toString(),t.weightOut.toString(),e.toString()),r=BigInt(n);return r<0n?0n:r}calculateOutGivenIn(t,e){let n=G.calculateOutGivenIn(t.balanceIn.toString(),t.balanceOut.toString(),t.weightIn.toString(),t.weightOut.toString(),e.toString()),r=BigInt(n);return r<0n?0n:r}spotPriceInGivenOut(t){let e=G.getSpotPrice(t.balanceOut.toString(),t.balanceIn.toString(),t.weightOut.toString(),t.weightIn.toString(),this.maxOutRatio.toString());return BigInt(e)}spotPriceOutGivenIn(t){let e=G.getSpotPrice(t.balanceIn.toString(),t.balanceOut.toString(),t.weightIn.toString(),t.weightOut.toString(),this.maxInRatio.toString());return BigInt(e)}calculateTradeFee(t,e){let n=G.calculatePoolTradeFee(t.toString(),this.repayFeeApply?e.repayFee[0]:e.exchangeFee[0],this.repayFeeApply?e.repayFee[1]:e.exchangeFee[1]);return BigInt(n)}};import{CompatibilityLevel as Cr}from"polkadot-api";import{map as kr,of as sn,switchMap as Dr}from"rxjs";import{memoize1 as Ar}from"@thi.ng/memoize";import{combineLatest as en,combineLatestAll as Br,debounceTime as _r,firstValueFrom as Rr,from as nn,map as rn,mergeAll as Fr,of as Er,switchMap as an}from"rxjs";var ye=[{inputs:[],name:"decimals",outputs:[{internalType:"uint8",name:"",type:"uint8"}],stateMutability:"view",type:"function"},{inputs:[],name:"description",outputs:[{internalType:"string",name:"",type:"string"}],stateMutability:"view",type:"function"},{inputs:[],name:"version",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"uint80",name:"_roundId",type:"uint80"}],name:"getRoundData",outputs:[{internalType:"uint80",name:"roundId",type:"uint80"},{internalType:"int256",name:"answer",type:"int256"},{internalType:"uint256",name:"startedAt",type:"uint256"},{internalType:"uint256",name:"updatedAt",type:"uint256"},{internalType:"uint80",name:"answeredInRound",type:"uint80"}],stateMutability:"view",type:"function"},{inputs:[],name:"latestRoundData",outputs:[{internalType:"uint80",name:"roundId",type:"uint80"},{internalType:"int256",name:"answer",type:"int256"},{internalType:"uint256",name:"startedAt",type:"uint256"},{internalType:"uint256",name:"updatedAt",type:"uint256"},{internalType:"uint80",name:"answeredInRound",type:"uint80"}],stateMutability:"view",type:"function"}];var At=class{client;constructor(t){this.client=t.getWsProvider()}async getData(t,e=6){let[n,r,a]=await Promise.all([this.client.readContract({abi:ye,address:t,functionName:"latestRoundData"}),this.client.readContract({abi:ye,address:t,functionName:"decimals"}),this.client.getBlock()]),[s,i,o,l]=n,c=a.number-(a.timestamp-l)/BigInt(e),m=Number(c);return{price:i,decimals:r,updatedAt:m<0?0:m}}};var M=class extends U{evm;mmOracle;override=[];mem=0;memPools=Ar(t=>(this.log(this.getPoolType(),"mem pools",t,"\u2705"),this.loadPools()));constructor(t,e){super(t),this.evm=e,this.mmOracle=new At(e)}async withOverride(t){this.override=t||[]}async getPoolsMem(){return this.memPools(this.mem)}async getPools(){let t=nn(this.getPoolsMem()).pipe(an(e=>this.subscribe(e)),Br());return Rr(t)}getSubscriber(){return nn(this.getPoolsMem()).pipe(an(t=>this.subscribe(t)),Fr())}subscribe(t){return t.filter(e=>this.hasValidAssets(e)).map(e=>en([this.subscribePoolChange(e),this.subscribePoolBalance(e)]).pipe(_r(250),rn(([n,r])=>this.updatePool(n,r))))}subscribePoolBalance(t){if(t.type==="Aave")return Er([]);let e=[this.subscribeTokensBalance(t.address)];if(this.hasSystemAsset(t)){let n=this.subscribeSystemBalance(t.address);e.push(n)}if(this.hasErc20Asset(t)){let n=t.tokens.filter(a=>a.type==="Erc20").map(a=>a.id),r=this.subscribeErc20Balance(t.address,n);e.push(r)}return en(e).pipe(rn(n=>n.map(r=>Array.isArray(r)?r:[r]).flat()))}hasSystemAsset(t){return t.tokens.some(e=>e.id===0)}hasErc20Asset(t){return t.tokens.some(e=>e.type==="Erc20")}hasValidAssets(t){return t.tokens.every(({id:e,decimals:n,balance:r})=>{let a=this.override.find(i=>i.id===e),s=!!n||!!a?.decimals;return r>0n&&s})}updatePool=(t,e)=>{let n=t.tokens.map(r=>{let a=e.find(i=>i.id===r.id),s=this.override.find(i=>i.id===r.id);return a?{...r,balance:a.balance.transferable,decimals:r.decimals||s?.decimals}:{...r,decimals:r.decimals||s?.decimals}});return{...t,tokens:n}}};var Bt=class extends M{MAX_FINAL_WEIGHT=100000000n;poolsData=new Map([]);async loadPools(){let[t,e,n]=await Promise.all([this.api.query.LBP.PoolData.getEntries(),this.api.query.ParachainSystem.ValidationData.getValue(),this.getPoolLimits()]),r=e?.relay_parent_number||0,a=t.filter(({value:s})=>e&&this.isActivePool(s,r)).map(async({keyArgs:s,value:i})=>{let[o]=s,l=o.toString(),c=await this.getPoolDelta(l,i,r);return{address:l,type:"LBP",fee:i.fee,...c,...n}});return Promise.all(a)}async getPoolDelta(t,e,n){let{start:r,end:a,assets:s,initial_weight:i,final_weight:o,repay_target:l,fee_collector:c}=e,m=G.calculateLinearWeights(r?r.toString():"0",a?a.toString():"0",i.toString(),o.toString(),n.toString()),[d,p]=s,g=BigInt(m),y=this.MAX_FINAL_WEIGHT-BigInt(g),[b,P,f,S,w]=await Promise.all([this.isRepayFeeApplied(d,l,c.toString()),this.getBalance(t,d),this.api.query.AssetRegistry.Assets.getValue(d),this.getBalance(t,p),this.api.query.AssetRegistry.Assets.getValue(p)]);return{repayFeeApply:b,tokens:[{id:d,decimals:f?.decimals,existentialDeposit:f?.existential_deposit,balance:P.transferable,weight:g,type:f?.asset_type.type},{id:p,decimals:w?.decimals,existentialDeposit:w?.existential_deposit,balance:S.transferable,weight:y,type:w?.asset_type.type}]}}isActivePool(t,e){let{start:n,end:r}=t;return n&&r?e>=n&&e<r:!1}async isRepayFeeApplied(t,e,n){if(e===0n)return!1;try{return(await this.getBalance(n,t)).transferable<e}catch{return!0}}async getRepayFee(){return await this.api.constants.LBP.repay_fee()}async getPoolLimits(){let[t,e,n]=await Promise.all([this.api.constants.LBP.MaxInRatio(),this.api.constants.LBP.MaxOutRatio(),this.api.constants.LBP.MinTradingLimit()]);return{maxInRatio:t,maxOutRatio:e,minTradingLimit:n}}async getPoolFees(t){return{repayFee:await this.getRepayFee(),exchangeFee:t.fee}}getPoolType(){return"LBP"}async isSupported(){let t=this.api.query.LBP.PoolData,e=await this.api.compatibilityToken;return t.isCompatible(Cr.BackwardsCompatible,e)}subscribePoolChange(t){let e=this.api.query.ParachainSystem.ValidationData,n=this.poolsData.get(t.address);return n?e.watchValue("best").pipe(Dr(r=>r?this.getPoolDelta(t.address,n,r.relay_parent_number):sn(t)),kr(r=>Object.assign({},t,r))):sn(t)}};var Pe={};T(Pe,{OmniMath:()=>x,OmniPool:()=>_t,OmniPoolClient:()=>Rt});import{calculate_in_given_out as Mr,calculate_lrna_in_given_out as Lr,calculate_out_given_in as qr,calculate_out_given_lrna_in as Nr,calculate_spot_price as Gr,calculate_lrna_spot_price as Ur,calculate_shares as Hr,calculate_liquidity_out as Vr,calculate_liquidity_lrna_out as Wr,verify_asset_cap as Yr,calculate_liquidity_hub_in as Xr,is_sell_allowed as Kr,is_buy_allowed as zr,is_add_liquidity_allowed as jr,is_remove_liquidity_allowed as $r}from"@galacticcouncil/math-omnipool";import st from"big.js";var x=class{static calculateSpotPrice(t,e,n,r){return Gr(t,e,n,r)}static calculateLrnaSpotPrice(t,e){return Ur(t,e)}static calculateInGivenOut(t,e,n,r,a,s,i,o,l){return Mr(t,e,n,r,a,s,i,o,l)}static calculateLrnaInGivenOut(t,e,n,r,a){return Lr(t,e,n,r,a)}static calculateOutGivenIn(t,e,n,r,a,s,i,o,l){return qr(t,e,n,r,a,s,i,o,l)}static calculateOutGivenLrnaIn(t,e,n,r,a){return Nr(t,e,n,r,a)}static calculateShares(t,e,n,r){return Hr(t,e,n,r)}static calculateLiquidityOut(t,e,n,r,a,s,i,o){return Vr(t,e,n,r,a,s,i,o)}static calculateLiquidityLRNAOut(t,e,n,r,a,s,i,o){return Wr(t,e,n,r,a,s,i,o)}static calculateCapDifference(t,e,n,r){let a=st(e),s=st(t),i=st(r),o=st(n),l=st(10).pow(18),c=o.div(l);if(a.div(i).lt(c)){let d=c.times(i).minus(a).times(s),p=a.times(st(1).minus(c));return d.div(p).toFixed(0)}else return"0"}static verifyAssetCap(t,e,n,r){return Yr(t,e,n,r)}static calculateLimitHubIn(t,e,n,r){return Xr(t,e,n,r)}static isSellAllowed(t){return Kr(t)}static isBuyAllowed(t){return zr(t)}static isAddLiquidityAllowed(t){return jr(t)}static isRemoveLiquidityAllowed(t){return $r(t)}};var{FeeUtils:ot}=v,_t=class u{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;hubAssetId;static fromPool(t){return new u(t.address,t.tokens,t.maxInRatio,t.maxOutRatio,t.minTradingLimit,t.hubAssetId)}constructor(t,e,n,r,a,s){this.type="Omnipool",this.address=t,this.tokens=e,this.maxInRatio=n,this.maxOutRatio=r,this.minTradingLimit=a,this.hubAssetId=s}validatePair(t,e){return this.hubAssetId!=e}parsePair(t,e){let n=new Map(this.tokens.map(s=>[s.id,s])),r=n.get(t),a=n.get(e);if(r==null)throw new Error("Pool does not contain tokenIn");if(a==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,hubReservesIn:r.hubReserves,hubReservesOut:a.hubReserves,sharesIn:r.shares,sharesOut:a.shares,decimalsIn:r.decimals,decimalsOut:a.decimals,balanceIn:r.balance,balanceOut:a.balance,tradeableIn:r.tradeable,tradeableOut:a.tradeable,assetInEd:r.existentialDeposit,assetOutEd:a.existentialDeposit}}validateAndBuy(t,e,n){let r=this.calculateInGivenOut(t,e),a=this.calculateInGivenOut(t,e,n),s=r===0n?0:O.calculateDiffToRef(a,r),i=[],o=x.isSellAllowed(t.tradeableIn),l=x.isBuyAllowed(t.tradeableOut);(!o||!l)&&i.push("TradeNotAllowed"),(e<this.minTradingLimit||r<t.assetInEd)&&i.push("InsufficientTradingAmount");let c=t.balanceOut/this.maxOutRatio;e>c&&i.push("MaxOutRatioExceeded");let m=t.balanceIn/this.maxInRatio;return a>m&&i.push("MaxInRatioExceeded"),{amountIn:a,calculatedIn:r,amountOut:e,feePct:s,errors:i}}validateAndSell(t,e,n){let r=this.calculateOutGivenIn(t,e),a=this.calculateOutGivenIn(t,e,n),s=O.calculateDiffToRef(r,a),i=[],o=x.isSellAllowed(t.tradeableIn),l=x.isBuyAllowed(t.tradeableOut);(!o||!l)&&i.push("TradeNotAllowed"),(e<this.minTradingLimit||r<t.assetOutEd)&&i.push("InsufficientTradingAmount");let c=t.balanceIn/this.maxInRatio;e>c&&i.push("MaxInRatioExceeded");let m=t.balanceOut/this.maxOutRatio;return a>m&&i.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:r,amountOut:a,feePct:s,errors:i}}calculateInGivenOut(t,e,n){if(t.assetIn==this.hubAssetId)return this.calculateLrnaInGivenOut(t,e,n);let r=x.calculateInGivenOut(t.balanceIn.toString(),t.hubReservesIn.toString(),t.sharesIn.toString(),t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),n?ot.toRaw(n.assetFee).toString():"0",n?ot.toRaw(n.protocolFee).toString():"0"),a=BigInt(r);return a<0n?0n:a}calculateLrnaInGivenOut(t,e,n){let r=x.calculateLrnaInGivenOut(t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),n?ot.toRaw(n.assetFee).toString():"0"),a=BigInt(r);return a<0n?0n:a}calculateOutGivenIn(t,e,n){if(t.assetIn==this.hubAssetId)return this.calculateOutGivenLrnaIn(t,e,n);let r=x.calculateOutGivenIn(t.balanceIn.toString(),t.hubReservesIn.toString(),t.sharesIn.toString(),t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),n?ot.toRaw(n.assetFee).toString():"0",n?ot.toRaw(n.protocolFee).toString():"0"),a=BigInt(r);return a<0n?0n:a}calculateOutGivenLrnaIn(t,e,n){let r=x.calculateOutGivenLrnaIn(t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),n?ot.toRaw(n.assetFee).toString():"0"),a=BigInt(r);return a<0n?0n:a}spotPriceInGivenOut(t){if(t.assetIn==this.hubAssetId)return this.spotPriceLrnaInGivenOut(t);let e=x.calculateSpotPrice(t.balanceOut.toString(),t.hubReservesOut.toString(),t.balanceIn.toString(),t.hubReservesIn.toString()),n=Math.pow(10,18-t.decimalsOut);return BigInt(e)/BigInt(n)}spotPriceLrnaInGivenOut(t){let e=x.calculateLrnaSpotPrice(t.hubReservesOut.toString(),t.balanceOut.toString()),n=Math.pow(10,18-t.decimalsOut);return BigInt(e)/BigInt(n)}spotPriceOutGivenIn(t){if(t.assetIn==this.hubAssetId)return this.spotPriceOutGivenLrnaIn(t);let e=x.calculateSpotPrice(t.balanceIn.toString(),t.hubReservesIn.toString(),t.balanceOut.toString(),t.hubReservesOut.toString()),n=Math.pow(10,18-t.decimalsIn);return BigInt(e)/BigInt(n)}spotPriceOutGivenLrnaIn(t){let e=x.calculateLrnaSpotPrice(t.balanceOut.toString(),t.hubReservesOut.toString()),n=Math.pow(10,18-t.decimalsIn);return BigInt(e)/BigInt(n)}};import{AccountId as Qr,CompatibilityLevel as Jr}from"polkadot-api";import{toHex as Zr}from"@polkadot-api/utils";import{distinctUntilChanged as ta,map as on}from"rxjs";var{FeeUtils:X}=v,Rt=class extends M{async loadPools(){let t=await this.api.constants.Omnipool.HubAssetId(),e=this.getPoolAddress(),[n,r,a,s,i]=await Promise.all([this.api.query.Omnipool.Assets.getEntries(),this.api.query.Omnipool.HubAssetTradability.getValue(),this.api.query.AssetRegistry.Assets.getValue(t),this.getBalance(e,t),this.getPoolLimits()]),o=n.map(async({keyArgs:c,value:m})=>{let[d]=c,{hub_reserve:p,shares:g,tradable:y,cap:b,protocol_shares:P}=m,[f,S]=await Promise.all([this.api.query.AssetRegistry.Assets.getValue(d),this.getBalance(e,d)]);return{id:d,decimals:f?.decimals,existentialDeposit:f?.existential_deposit,balance:S.transferable,cap:b,hubReserves:p,protocolShares:P,shares:g,tradeable:y,type:f?.asset_type.type}}),l=await Promise.all(o);return l.push({id:t,decimals:a?.decimals,existentialDeposit:a?.existential_deposit,balance:s.transferable,tradeable:r,type:a?.asset_type.type}),[{address:e,type:"Omnipool",hubAssetId:t,tokens:l,...i}]}getPoolAddress(){let t="modlomnipool".padEnd(32,"\0"),e=new TextEncoder().encode(t),n=Zr(e);return Qr(63).dec(n)}async getPoolLimits(){let[t,e,n]=await Promise.all([this.api.constants.Omnipool.MaxInRatio(),this.api.constants.Omnipool.MaxOutRatio(),this.api.constants.Omnipool.MinimumTradingLimit()]);return{maxInRatio:t,maxOutRatio:e,minTradingLimit:n}}async getPoolFees(t,e){let[n,r,a]=await Promise.all([this.api.constants.DynamicFees.AssetFeeParameters(),this.api.constants.DynamicFees.ProtocolFeeParameters(),this.api.query.DynamicFees.AssetFee.getValue(e)]),s=n.min_fee+r.min_fee,i=n.max_fee+r.max_fee;if(a){let{asset_fee:o,protocol_fee:l}=a;return{assetFee:X.fromPermill(o),protocolFee:X.fromPermill(l),min:X.fromPermill(s),max:X.fromPermill(i)}}else return{assetFee:X.fromPermill(n.min_fee),protocolFee:X.fromPermill(r.min_fee),min:X.fromPermill(s),max:X.fromPermill(i)}}getPoolType(){return"Omnipool"}async isSupported(){let t=this.api.query.Omnipool.Assets,e=await this.api.compatibilityToken;return t.isCompatible(Jr.BackwardsCompatible,e)}subscribePoolChange(t){return this.api.query.Omnipool.Assets.watchEntries({at:"best"}).pipe(ta((n,r)=>!r.deltas),on(({entries:n})=>n.map(r=>{let[a]=r.args,{hub_reserve:s,shares:i,tradable:o,cap:l,protocol_shares:c}=r.value,m=t.tokens.findIndex(p=>p.id===a);return{...t.tokens[m],cap:l,hubReserves:s,protocolShares:c,shares:i,tradeable:o}})),on(n=>{let r=t.tokens.find(a=>a.id===1);return{...t,tokens:[...n,r]}}))}};var fe={};T(fe,{StableMath:()=>B,StableSwap:()=>Ft,StableSwapClient:()=>Et});import{calculate_in_given_out as ea,calculate_out_given_in as na,calculate_amplification as ra,calculate_add_one_asset as aa,calculate_liquidity_out_one_asset as ia,calculate_shares as sa,calculate_shares_for_amount as oa,calculate_spot_price_with_fee as la,pool_account_name as ca,recalculate_peg as ua}from"@galacticcouncil/math-stableswap";var B=class{static getPoolAddress(t){return ca(t)}static defaultPegs(t){let e=[];for(let n=0;n<t;n++)e.push(["1","1"]);return e}static calculateAmplification(t,e,n,r,a){return ra(t,e,n,r,a)}static calculateInGivenOut(t,e,n,r,a,s,i){return ea(t,e,n,r,a,s,i)}static calculateAddOneAsset(t,e,n,r,a,s,i){return aa(t,e,n,r,a,s,i)}static calculateSharesForAmount(t,e,n,r,a,s,i){return oa(t,e,n,r,a,s,i)}static calculateOutGivenIn(t,e,n,r,a,s,i){return na(t,e,n,r,a,s,i)}static calculateLiquidityOutOneAsset(t,e,n,r,a,s,i){return ia(t,e,n,r,a,s,i)}static calculateShares(t,e,n,r,a,s){return sa(t,e,n,r,a,s)}static calculateSpotPriceWithFee(t,e,n,r,a,s,i,o){return la(t,e,n,r,a,s,i,o)}static recalculatePegs(t,e,n,r,a){let s=ua(t,e,n,r,a);return JSON.parse(s)}};var{FeeUtils:K}=v,Ft=class u{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;amplification;id;fee;totalIssuance;static fromPool(t){return new u(t.address,t.tokens,t.maxInRatio,t.maxOutRatio,t.minTradingLimit,t.amplification,t.id,t.fee,t.totalIssuance)}constructor(t,e,n,r,a,s,i,o,l){this.type="Stableswap",this.address=t,this.tokens=e,this.maxInRatio=n,this.maxOutRatio=r,this.minTradingLimit=a,this.amplification=s,this.id=i,this.fee=o,this.totalIssuance=l}validatePair(t,e){return!0}parsePair(t,e){let n=new Map(this.tokens.map(s=>[s.id,s])),r=n.get(t),a=n.get(e);if(r==null)throw new Error("Pool does not contain tokenIn");if(a==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,balanceIn:r.balance,balanceOut:a.balance,decimalsIn:r.decimals,decimalsOut:a.decimals,tradeableIn:this.id===t?15:r.tradeable,tradeableOut:this.id===e?15:a.tradeable,assetInEd:r.existentialDeposit,assetOutEd:a.existentialDeposit}}validateAndBuy(t,e,n){let r=this.calculateInGivenOut(t,e),a=this.calculateInGivenOut(t,e,n),s=K.toPct(n.fee),i=[],o=x.isSellAllowed(t.tradeableIn),l=x.isBuyAllowed(t.tradeableOut);return(!o||!l)&&i.push("TradeNotAllowed"),(e<this.minTradingLimit||r<t.assetInEd)&&i.push("InsufficientTradingAmount"),{amountIn:a,calculatedIn:r,amountOut:e,feePct:s,errors:i}}validateAndSell(t,e,n){let r=this.calculateOutGivenIn(t,e),a=this.calculateOutGivenIn(t,e,n),s=K.toPct(n.fee),i=[],o=x.isSellAllowed(t.tradeableIn),l=x.isBuyAllowed(t.tradeableOut);return(!o||!l)&&i.push("TradeNotAllowed"),(e<this.minTradingLimit||r<t.assetOutEd)&&i.push("InsufficientTradingAmount"),{amountIn:e,calculatedOut:r,amountOut:a,feePct:s,errors:i}}calculateIn(t,e,n){let r=B.calculateInGivenOut(this.getReserves(),Number(t.assetIn),Number(t.assetOut),e.toString(),this.amplification.toString(),n?K.toRaw(n.fee).toString():"0",this.getPegs()),a=BigInt(r);return a<0n?0n:a}calculateAddOneAsset(t,e,n){let r=B.calculateAddOneAsset(this.getReserves(),e.toString(),Number(t.assetIn),this.amplification.toString(),this.totalIssuance.toString(),n?K.toRaw(n.fee).toString():"0",this.getPegs()),a=BigInt(r);return a<0n?0n:a}calculateSharesForAmount(t,e,n){let r=B.calculateSharesForAmount(this.getReserves(),Number(t.assetOut),e.toString(),this.amplification.toString(),this.totalIssuance.toString(),n?K.toRaw(n.fee).toString():"0",this.getPegs()),a=BigInt(r);return a<0n?0n:a}calculateInGivenOut(t,e,n){return t.assetOut==this.id?this.calculateAddOneAsset(t,e,n):t.assetIn==this.id?this.calculateSharesForAmount(t,e,n):this.calculateIn(t,e,n)}spotPriceInGivenOut(t){let e=B.calculateSpotPriceWithFee(this.id.toString(),this.getReserves(),this.amplification.toString(),t.assetOut.toString(),t.assetIn.toString(),this.totalIssuance.toString(),"0",this.getPegs());if(t.assetOut==this.id)return BigInt(e);if(t.assetIn==this.id){let r=Math.pow(10,t.decimalsIn-t.decimalsOut);return BigInt(e)/BigInt(r)}let n=Math.pow(10,18-t.decimalsIn);return BigInt(e)/BigInt(n)}calculateOut(t,e,n){let r=B.calculateOutGivenIn(this.getReserves(),Number(t.assetIn),Number(t.assetOut),e.toString(),this.amplification.toString(),n?K.toRaw(n.fee).toString():"0",this.getPegs()),a=BigInt(r);return a<0n?0n:a}calculateWithdrawOneAsset(t,e,n){let r=B.calculateLiquidityOutOneAsset(this.getReserves(),e.toString(),Number(t.assetOut),this.amplification.toString(),this.totalIssuance.toString(),n?K.toRaw(n.fee).toString():"0",this.getPegs()),a=BigInt(r);return a<0n?0n:a}calculateShares(t,e,n){let r=B.calculateShares(this.getReserves(),this.getAssets(t.assetIn,e),this.amplification.toString(),this.totalIssuance.toString(),n?K.toRaw(n.fee).toString():"0",this.getPegs()),a=BigInt(r);return a<0n?0n:a}calculateOutGivenIn(t,e,n){return t.assetIn==this.id?this.calculateWithdrawOneAsset(t,e,n):t.assetOut==this.id?this.calculateShares(t,e,n):this.calculateOut(t,e,n)}spotPriceOutGivenIn(t){let e=B.calculateSpotPriceWithFee(this.id.toString(),this.getReserves(),this.amplification.toString(),t.assetIn.toString(),t.assetOut.toString(),this.totalIssuance.toString(),"0",this.getPegs());if(t.assetIn==this.id)return BigInt(e);if(t.assetOut==this.id){let r=Math.pow(10,t.decimalsOut-t.decimalsIn);return BigInt(e)/BigInt(r)}let n=Math.pow(10,18-t.decimalsOut);return BigInt(e)/BigInt(n)}getPegs(){let t=B.defaultPegs(this.tokens.length-1);return JSON.stringify(t)}getReserves(){let t=this.tokens.filter(e=>e.id!=this.id).map(({id:e,balance:n,decimals:r})=>({asset_id:e,amount:n,decimals:r}));return JSON.stringify(t,$.jsonFormatter)}getAssets(t,e){let n={asset_id:Number(t),amount:e.toString()};return JSON.stringify([n],$.jsonFormatter)}};import{AccountId as ma,CompatibilityLevel as pa}from"polkadot-api";import{toHex as da}from"@polkadot-api/utils";import{blake2b as ga}from"@noble/hashes/blake2b";import{map as ba,of as ya,switchMap as ha}from"rxjs";var{FeeUtils:tt}=v,Et=class extends M{poolsData=new Map([]);getPoolType(){return"Stableswap"}getPoolAddress(t){let e=B.getPoolAddress(t),n=ga(e,{dkLen:32}),r=da(n);return ma(63).dec(r)}async getPoolLimits(){return{maxInRatio:0n,maxOutRatio:0n,minTradingLimit:await this.api.constants.Stableswap.MinTradingLimit()}}async getPoolDelta(t,e,n){let{initial_amplification:r,final_amplification:a,initial_block:s,final_block:i}=e,o=B.calculateAmplification(r.toString(),a.toString(),s.toString(),i.toString(),n.toString()),l=await this.api.query.Tokens.TotalIssuance.getValue(t);return{amplification:BigInt(o),totalIssuance:l}}async getPoolTokens(t,e){let n=this.getPoolAddress(t),r=e.assets.map(async a=>{let[s,i,o]=await Promise.all([this.api.query.Stableswap.AssetTradability.getValue(t,a),this.api.query.AssetRegistry.Assets.getValue(a),this.getBalance(n,a)]);return{id:a,decimals:i?.decimals,existentialDeposit:i?.existential_deposit,balance:o.transferable,tradeable:s,type:i?.asset_type.type}});return Promise.all(r)}async isSupported(){let t=this.api.query.Stableswap.Pools,e=await this.api.compatibilityToken;return t.isCompatible(pa.BackwardsCompatible,e)}async loadPools(){let[t,e,n]=await Promise.all([this.api.query.Stableswap.Pools.getEntries(),this.api.query.System.Number.getValue(),this.getPoolLimits()]),r=t.map(async({keyArgs:a,value:s})=>{let[i]=a,o=this.getPoolAddress(i),[l,c,m]=await Promise.all([this.getPoolDelta(i,s,e),this.getPoolTokens(i,s),this.getPoolPegs(i,s,e)]);return c.push({id:i,tradeable:15,balance:l.totalIssuance,decimals:18}),this.poolsData.set(o,s),{address:o,id:i,type:"Stableswap",fee:tt.fromPermill(s.fee),tokens:c,...l,...m,...n}});return Promise.all(r)}async getPoolFees(t){return{fee:t.fee}}async getPoolPegs(t,e,n){let r=await this.api.query.Stableswap.PoolPegs.getValue(t);if(!r)return this.getDefaultPegs(e);let a=await this.getLatestPegs(e,r,n),s=this.getRecentPegs(r),i=tt.fromPermill(r.max_peg_update),o=tt.fromPermill(e.fee),[l,c]=B.recalculatePegs(JSON.stringify(s),JSON.stringify(a),n.toString(),tt.toRaw(i).toString(),tt.toRaw(o).toString()),m=Number(l)*1e6;return{pegsFee:tt.fromPermill(m),pegs:c}}getDefaultPegs(t){let e=t.fee,n=B.defaultPegs(t.assets.length);return{pegsFee:tt.fromPermill(e),pegs:n}}getRecentPegs(t){let{current:e}=t;return Array.from(e.entries()).map(([n,r])=>r.map(a=>a.toString()))}async getLatestPegs(t,e,n){let{source:r}=e,a=Array.from(t.assets.entries()).map(([i,o])=>o),s=r.map(async(i,o)=>{if(i.type==="Oracle"){let[l,c,m]=i.value,d=[m,a[o]].sort((f,S)=>f-S),p=await this.api.query.EmaOracle.Oracles.getValue(l,d,c);if(!p)return;let[{price:g,updated_at:y}]=p,b=g.n.toString(),P=g.d.toString();return m.toString()===d[0].toString()?[[b,P],y.toString()]:[[P,b],y.toString()]}else if(i.type==="MMOracle"){let l=i.value.asHex(),{price:c,decimals:m,updatedAt:d}=await this.mmOracle.getData(l),p=10**m;return[[c.toString(),p.toString()],d.toString()]}else return[i.value.map(l=>l.toString()),n.toString()]});return Promise.all(s)}subscribePoolChange(t){let e=this.api.query.System.Number,n=this.poolsData.get(t.address);return!n||!t.id?ya(t):e.watchValue("best").pipe(ha(r=>Promise.all([this.getPoolDelta(t.id,n,r),this.getPoolPegs(t.id,n,r)])),ba(([r,a])=>{let s=t.tokens.map(i=>i.id===t.id?{...i,balance:r.totalIssuance}:i);return Object.assign(t,{tokens:s},r,a)}))}};var Se={};T(Se,{XykMath:()=>V,XykPool:()=>Ct,XykPoolClient:()=>kt});import{calculate_in_given_out as Pa,calculate_out_given_in as fa,calculate_pool_trade_fee as Sa,get_spot_price as Ta,calculate_liquidity_in as wa,calculate_shares as xa,calculate_spot_price as Ia,calculate_spot_price_with_fee as va,calculate_liquidity_out_asset_a as Oa,calculate_liquidity_out_asset_b as Aa}from"@galacticcouncil/math-xyk";var V=class{static getSpotPrice(t,e,n){return Ta(t,e,n)}static calculateInGivenOut(t,e,n){return Pa(t,e,n)}static calculateOutGivenIn(t,e,n){return fa(t,e,n)}static calculatePoolTradeFee(t,e,n){return Sa(t,e,n)}static calculateLiquidityIn(t,e,n){return wa(t,e,n)}static calculateSpotPrice(t,e){return Ia(t,e)}static calculateSpotPriceWithFee(t,e,n,r){return va(t,e,n,r)}static calculateShares(t,e,n){return xa(t,e,n)}static calculateLiquidityOutAssetA(t,e,n,r){return Oa(t,e,n,r)}static calculateLiquidityOutAssetB(t,e,n,r){return Aa(t,e,n,r)}};var{FeeUtils:ln}=v,Ct=class u{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;static fromPool(t){return new u(t.address,t.tokens,t.maxInRatio,t.maxOutRatio,t.minTradingLimit)}constructor(t,e,n,r,a){this.type="XYK",this.address=t,this.tokens=e,this.maxInRatio=n,this.maxOutRatio=r,this.minTradingLimit=a}validatePair(t,e){return!0}parsePair(t,e){let n=new Map(this.tokens.map(s=>[s.id,s])),r=n.get(t),a=n.get(e);if(r==null)throw new Error("Pool does not contain tokenIn");if(a==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,decimalsIn:r.decimals,decimalsOut:a.decimals,balanceIn:r.balance,balanceOut:a.balance,assetInEd:r.existentialDeposit,assetOutEd:a.existentialDeposit}}validateAndBuy(t,e,n){let r=this.calculateInGivenOut(t,e),a=this.calculateTradeFee(r,n),s=ln.toPct(n.exchangeFee),i=r+a,o=[];(e<this.minTradingLimit||r<t.assetInEd)&&o.push("InsufficientTradingAmount");let l=t.balanceOut/this.maxOutRatio;e>l&&o.push("MaxOutRatioExceeded");let c=t.balanceIn/this.maxInRatio;return i>c&&o.push("MaxInRatioExceeded"),{amountIn:i,calculatedIn:r,amountOut:e,feePct:s,errors:o}}validateAndSell(t,e,n){let r=this.calculateOutGivenIn(t,e),a=this.calculateTradeFee(r,n),s=ln.toPct(n.exchangeFee),i=r-a,o=[];(e<this.minTradingLimit||r<t.assetOutEd)&&o.push("InsufficientTradingAmount");let l=t.balanceIn/this.maxInRatio;e>l&&o.push("MaxInRatioExceeded");let c=t.balanceOut/this.maxOutRatio;return i>c&&o.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:r,amountOut:i,feePct:s,errors:o}}calculateInGivenOut(t,e){let n=V.calculateInGivenOut(t.balanceIn.toString(),t.balanceOut.toString(),e.toString()),r=BigInt(n);return r<0n?0n:r}calculateOutGivenIn(t,e){let n=V.calculateOutGivenIn(t.balanceIn.toString(),t.balanceOut.toString(),e.toString()),r=BigInt(n);return r<0n?0n:r}spotPriceInGivenOut(t){let e=V.calculateSpotPrice(t.balanceOut.toString(),t.balanceIn.toString()),n=Math.pow(10,18-t.decimalsOut);return BigInt(e)/BigInt(n)}spotPriceOutGivenIn(t){let e=V.calculateSpotPrice(t.balanceIn.toString(),t.balanceOut.toString()),n=Math.pow(10,18-t.decimalsIn);return BigInt(e)/BigInt(n)}calculateTradeFee(t,e){let n=V.calculatePoolTradeFee(t.toString(),e.exchangeFee[0],e.exchangeFee[1]);return BigInt(n)}};import{CompatibilityLevel as Ba}from"polkadot-api";import{of as _a}from"rxjs";var kt=class extends M{async loadPools(){let t=this.api.query.XYK.PoolAssets,[e,n]=await Promise.all([t.getEntries(),this.getPoolLimits()]),r=e.map(async({keyArgs:a,value:s})=>{let[i]=a,[o,l]=s,[c,m,d,p]=await Promise.all([this.getBalance(i,o),this.api.query.AssetRegistry.Assets.getValue(o),this.getBalance(i,l),this.api.query.AssetRegistry.Assets.getValue(l)]);return{address:i,type:"XYK",tokens:[{id:o,decimals:m?.decimals,existentialDeposit:m?.existential_deposit,balance:c.transferable,type:m?.asset_type.type},{id:l,decimals:p?.decimals,existentialDeposit:p?.existential_deposit,balance:d.transferable,type:p?.asset_type.type}],...n}});return Promise.all(r)}async getExchangeFee(){return await this.api.constants.XYK.GetExchangeFee()}async getPoolLimits(){let[t,e,n]=await Promise.all([this.api.constants.XYK.MaxInRatio(),this.api.constants.XYK.MaxOutRatio(),this.api.constants.XYK.MinTradingLimit()]);return{maxInRatio:t,maxOutRatio:e,minTradingLimit:n}}async getPoolFees(){return{exchangeFee:await this.getExchangeFee()}}getPoolType(){return"XYK"}async isSupported(){let t=this.api.query.XYK.PoolAssets,e=await this.api.compatibilityToken;return t.isCompatible(Ba.BackwardsCompatible,e)}subscribePoolChange(t){return _a(t)}};var Te={};T(Te,{AavePool:()=>Dt,AavePoolClient:()=>Mt});var Dt=class u{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;static fromPool(t){return new u(t.address,t.tokens,t.maxInRatio,t.maxOutRatio,t.minTradingLimit)}constructor(t,e,n,r,a){this.type="Aave",this.address=t,this.tokens=e,this.maxInRatio=n,this.maxOutRatio=r,this.minTradingLimit=a}validatePair(t,e){return!0}parsePair(t,e){let n=new Map(this.tokens.map(s=>[s.id,s])),r=n.get(t),a=n.get(e);if(r==null)throw new Error("Pool does not contain tokenIn");if(a==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,balanceIn:r.balance,balanceOut:a.balance,decimalsIn:r.decimals,decimalsOut:a.decimals,assetInEd:0n,assetOutEd:0n}}validateAndBuy(t,e,n){let r=this.calculateInGivenOut(t,e),a=[];return e>t.balanceOut&&a.push("TradeNotAllowed"),{amountIn:r,calculatedIn:r,amountOut:e,feePct:0,errors:a}}validateAndSell(t,e,n){let r=this.calculateOutGivenIn(t,e),a=[];return r>t.balanceOut&&a.push("TradeNotAllowed"),{amountIn:e,calculatedOut:r,amountOut:r,feePct:0,errors:a}}calculateInGivenOut(t,e){return e}calculateOutGivenIn(t,e){return e}spotPriceInGivenOut(t){let e=Math.pow(10,t.decimalsOut);return BigInt(e)}spotPriceOutGivenIn(t){let e=Math.pow(10,t.decimalsIn);return BigInt(e)}calculateTradeFee(t,e){return 0n}};import{AccountId as Ra}from"polkadot-api";import{toHex as Fa}from"@polkadot-api/utils";import{map as Ea,merge as Ca,switchMap as ka}from"rxjs";import{decodeEventLog as Da}from"viem";var cn=[{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"reserve",type:"address"},{indexed:!1,internalType:"address",name:"user",type:"address"},{indexed:!0,internalType:"address",name:"onBehalfOf",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"},{indexed:!0,internalType:"uint16",name:"referralCode",type:"uint16"}],name:"Supply",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"reserve",type:"address"},{indexed:!0,internalType:"address",name:"user",type:"address"},{indexed:!0,internalType:"address",name:"to",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"}],name:"Withdraw",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"reserve",type:"address"},{indexed:!1,internalType:"address",name:"user",type:"address"},{indexed:!0,internalType:"address",name:"onBehalfOf",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"},{indexed:!1,internalType:"enum DataTypes.InterestRateMode",name:"interestRateMode",type:"uint8"},{indexed:!1,internalType:"uint256",name:"borrowRate",type:"uint256"},{indexed:!0,internalType:"uint16",name:"referralCode",type:"uint16"}],name:"Borrow",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"reserve",type:"address"},{indexed:!0,internalType:"address",name:"user",type:"address"},{indexed:!0,internalType:"address",name:"repayer",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"},{indexed:!1,internalType:"bool",name:"useATokens",type:"bool"}],name:"Repay",type:"event"}];var{ERC20:Ma}=et,La=["Supply","Withdraw","Repay","Borrow"],Mt=class extends M{async loadPools(){let e=(await this.api.apis.AaveTradeExecutor.pools()).map(async({reserve:n,atoken:r,liqudity_in:a,liqudity_out:s})=>{let[i,o,l,c]=await Promise.all([this.api.query.AssetRegistry.Assets.getValue(n),this.api.query.AssetRegistry.AssetLocations.getValue(n),this.api.query.AssetRegistry.Assets.getValue(r),this.api.query.AssetRegistry.AssetLocations.getValue(r)]);return{address:this.getPoolId(n,r),type:"Aave",tokens:[{id:n,decimals:i?.decimals,existentialDeposit:i?.existential_deposit,balance:a,location:o,type:i?.asset_type.type},{id:r,decimals:l?.decimals,existentialDeposit:l?.existential_deposit,balance:s,location:c,type:l?.asset_type.type}],...this.getPoolLimits()}});return Promise.all(e)}async getPoolDelta(t){let[e,n]=t.tokens,{liqudity_in:r,liqudity_out:a}=await this.api.apis.AaveTradeExecutor.pool(e.id,n.id);return t.tokens.map(s=>{let i=s.id===e.id?r:a;return{...s,balance:i}})}getPoolId(t,e){let n=t+"/"+e,r=new TextEncoder().encode(n.padEnd(32,"\0")),a=Fa(r);return Ra(63).dec(a)}getPoolLimits(){return{maxInRatio:0n,maxOutRatio:0n,minTradingLimit:0n}}async getPoolFees(t,e){return{}}getPoolType(){return"Aave"}async isSupported(){return!0}subscribePoolChange(t){let[e,n]=t.tokens,r=this.getReserveH160Id(e),a=this.api.event.Router.Executed.watch(({asset_in:i,asset_out:o})=>i===n.id||o===n.id),s=this.api.event.EVM.Log.watch(({log:i})=>{let{topics:o,data:l}=i,c=o.map(g=>g.asHex()),m=l.asHex(),{eventName:d,args:p}=Da({abi:cn,topics:c,data:m});return La.includes(d)&&p.reserve.toLowerCase()===r.toLowerCase()});return Ca([a,s]).pipe(ka(()=>this.getPoolDelta(t)),Ea(i=>({...t,tokens:[...i]})))}getReserveH160Id(t){return t.type==="Erc20"?$.findNestedKey(t.location,"AccountKey20").AccountKey20.key:Ma.fromAssetId(t.id)}};var lt=class{static get(t){switch(t.type){case"Aave":return Dt.fromPool(t);case"XYK":return Ct.fromPool(t);case"Omnipool":return _t.fromPool(t);case"LBP":return Ot.fromPool(t);case"Stableswap":return Ft.fromPool(t);default:throw new Error("Pool type "+t.type+" is not supported yet")}}};import{Subject as qa,Subscription as Lt,takeUntil as Na}from"rxjs";var ct=class extends _{evm;lbpClient;omniClient;stableClient;xykClient;aaveClient;active=new Set([]);clients=[];pools=new Map([]);lbpSub=Lt.EMPTY;omniSub=Lt.EMPTY;stableSub=Lt.EMPTY;xykSub=Lt.EMPTY;aaveSub=Lt.EMPTY;isReady=!1;isDestroyed=new qa;constructor(t,e){super(t),this.evm=e,this.lbpClient=new Bt(t,e),this.omniClient=new Rt(t,e),this.stableClient=new Et(t,e),this.xykClient=new kt(t,e),this.aaveClient=new Mt(t,e),this.clients=[this.lbpClient,this.omniClient,this.stableClient,this.xykClient,this.aaveClient]}subscribe(t){return t.getSubscriber().pipe(Na(this.isDestroyed)).subscribe(e=>{this.pools.set(e.address,e)})}withOmnipool(){return this.omniSub.unsubscribe(),this.omniSub=this.subscribe(this.omniClient),this.active.add("Omnipool"),this}withStableswap(){return this.stableSub.unsubscribe(),this.stableSub=this.subscribe(this.stableClient),this.active.add("Stableswap"),this}withLbp(){return this.lbpSub.unsubscribe(),this.lbpSub=this.subscribe(this.lbpClient),this.active.add("LBP"),this}withAave(){return this.aaveSub.unsubscribe(),this.aaveSub=this.subscribe(this.aaveClient),this.active.add("Aave"),this}withXyk(t){return this.xykClient.withOverride(t),this.xykSub.unsubscribe(),this.xykSub=this.subscribe(this.xykClient),this.active.add("XYK"),this}destroy(){this.isDestroyed.next(!0),this.isDestroyed.complete(),this.active.clear(),this.pools.clear(),this.isReady=!1}async getPools(t={}){if(this.active.size===0)throw new Error("No pools selected");if(this.isReady)return Array.from(this.pools.values());let{useOnly:e=[],exclude:n=[]}=t,r=new Set(e),a=new Set(n),s=async i=>{let o=i.getPoolType();return r.size>0?r.has(o):a.size>0?!a.has(o):i.isSupported()};return this.getFilteredPools(s)}async getFilteredPools(t){let e=await Promise.all(this.clients.map(t)),n=this.clients.filter((a,s)=>e[s]);return(await Promise.all(n.map(a=>a.getPoolsMem()))).flat()}async getPoolFees(t,e){let n=this.clients.find(r=>r.getPoolType()===t.type);if(n)return n.getPoolFees(t,e);throw new Tt(t.type)}};var bn={};T(bn,{DEFAULT_BLOCK_TIME:()=>pn,DEFAULT_MIN_BUDGET:()=>Ie,ORDER_MIN_BLOCK_PERIOD:()=>dn,Router:()=>ut,TWAP_BLOCK_PERIOD:()=>Ut,TWAP_MAX_DURATION:()=>Oe,TWAP_MAX_PRICE_IMPACT:()=>ve,TWAP_TX_MULTIPLIER:()=>Wu,TradeOrderError:()=>xe,TradeOrderType:()=>Zt,TradeRouteBuilder:()=>L,TradeRouter:()=>mt,TradeScheduler:()=>pt,TradeType:()=>Jt});var qt=class{constructor(t=1/0){this.capacity=t}storage=[];enqueue(t){if(this.size()===this.capacity)throw Error("Queue has reached max capacity, you cannot add more items");this.storage.push(t)}dequeue(){return this.storage.shift()}size(){return this.storage.length}};var Ga=8,Nt=class{isNotVisited(t,e){let n=!0;return e.forEach(r=>{(r[0]===t[0]||r[1]===t[1])&&(n=!1)}),n}findPaths(t,e,n){let r=[],a=new qt,s=[];for(s.push([e,""]),a.enqueue(s);a.size()>0;){let i=a.dequeue();if(!i||i.length>Ga)continue;let o=i[i.length-1];(n===null||o[0]===n)&&r.push(i),t.get(o[0])?.forEach(c=>{if(this.isNotVisited(c,i)){let m=[...i];m.push(c),a.enqueue(m)}})}return r}findShortestPaths(t,e,n){let r=[],a=new qt,s=[];s.push([e,""]),a.enqueue(s);let i=1/0;for(;a.size()>0;){let o=a.dequeue();if(!o)continue;let l=o[o.length-1];if(l[0]===n){o.length<i?(i=o.length,r.length=0,r.push(o)):o.length===i&&r.push(o);continue}let c=t.get(l[0]);for(let m of c??[])this.isNotVisited(m,o)&&a.enqueue([...o,m])}return r}buildAndPopulateGraph(t,e){let n=new Map;for(let r of t)n.set(parseInt(r),[]);for(let[r,a,s]of e)n.get(a)?.push([s,r]);return n}};function we(u){let t={};for(let e of u){let n=e.tokens.length;for(let r=0;r<n;r++){t[e.tokens[r].id]||(t[e.tokens[r].id]=[]);for(let a=0;a<n;a++){if(r==a)continue;let s=[e.address,e.tokens[r].id,e.tokens[a].id];t[e.tokens[r].id].push(s)}}}return t}var Gt=class{getProposals(t,e,n){let r=n.filter(b=>b.type==="XYK"),a=n.filter(b=>b.type!=="XYK"),s=new Set(a.map(b=>b.tokens).flat().map(b=>b.id)),i=s.has(t),o=s.has(e),l=new Nt,c=b=>{let P=we(b),f=Object.keys(P),S=f.flatMap(w=>P[w]);return l.buildAndPopulateGraph(f,S)};if(!i&&!o){let b=r.filter(S=>S.tokens.find(w=>w.id===t)||S.tokens.find(w=>w.id===e)),P=c(b),f=l.findPaths(P,t,e);return this.parsePaths(f)}if(i&&o){let b=c(a),P=l.findPaths(b,t,e);return this.parsePaths(P)}let m=i?e:t,d=r.filter(b=>b.tokens.some(P=>P.id===m));if(d.length===0)return[];let p=[...a,...d],g=c(p),y=l.findPaths(g,t,e);return this.parsePaths(y)}parsePaths(t){let e=[];for(let n of t){let r=[];for(let a=0;a<n.length;a++){let s=n[a],i=n[a+1];if(i==null)break;r.push(this.toEdge(s,i))}e.push(r)}return e}toEdge(t,e){return[e[1],t[0],e[0]]}};var ut=class{routeSuggester;routeProposals;routerOptions;ctx;constructor(t,e={}){this.ctx=t,this.routeSuggester=new Gt,this.routeProposals=new Map,this.routerOptions=Object.freeze(e)}buildRouteKey(t,e,n){return`${t}->${e}::${n.length}`}async getPools(){return this.ctx.getPools(this.routerOptions)}async getRoutes(t,e){let n=await this.getPools();return this.validateInput(t,e,n),this.getPaths(t,e,n)}async getTradeableAssets(){let t=await this.getPools(),e=this.getAssets(t);return Array.from(e)}async getRouteableAssets(t){let e=await this.getTradeableAssets();return(await Promise.all(e.filter(r=>r!==t).map(r=>this.getRoutes(r,t)))).filter(r=>r.length>0).map(([r])=>r[0].assetIn).sort()}validateInput(t,e,n){if(n.length===0)throw new Error("No pools configured");if(t===e)throw new Error("Trading pair can't be identical");let r=this.getAssets(n);if(!r.has(t))throw new Error(t+" is not supported asset");if(!r.has(e))throw new Error(e+" is not supported asset");return this.toPoolsMap(n)}getAssets(t){let e=t.map(n=>n.tokens.map(r=>r.id)).flat().sort((n,r)=>n>r?1:-1);return new Set(e)}getPaths(t,e,n){let r=this.toPoolsMap(n);return this.getProposals(t,e,n).filter(s=>this.validPath(s,r)).map(s=>this.toHops(s,r))}getProposals(t,e,n){let r=this.buildRouteKey(t,e,n);if(this.routeProposals.has(r))return this.routeProposals.get(r);let a=this.routeSuggester.getProposals(t,e,n);return this.routeProposals.set(r,a),a}validPath(t,e){return t.length>0&&t.map(n=>this.validEdge(n,e)).reduce((n,r)=>n&&r)}validEdge([t,e,n],r){return r.get(t)?.validatePair(e,n)||!1}toPoolsMap(t){return new Map(t.map(e=>[e.address,lt.get(e)]))}toHops(t,e){return t.map(([n,r,a])=>{let s=e.get(n);return{poolAddress:n,poolId:s?.id,pool:s?.type,assetIn:r,assetOut:a}})}};var Jt=(e=>(e.Buy="Buy",e.Sell="Sell",e))(Jt||{}),Zt=(n=>(n.Dca="Dca",n.TwapSell="TwapSell",n.TwapBuy="TwapBuy",n))(Zt||{}),xe=(n=>(n.OrderTooSmall="OrderTooSmall",n.OrderTooBig="OrderTooBig",n.OrderImpactTooBig="OrderImpactTooBig",n))(xe||{});var{FeeUtils:mn}=v,mt=class extends ut{mlr;poolsSnapshot;constructor(t,e={}){super(t,e),this.mlr=new Map}buildCtxSync(t,e){let n=this.poolsSnapshot,r=super.validateInput(t,e,n),a=super.getPaths(t,e,n);if(!a.length)throw new wt(t,e);return{paths:a,pools:n,poolsMap:r}}async withCtx(t,e,n){this.poolsSnapshot||(this.poolsSnapshot=await super.getPools());let r=this.buildCtxSync(t,e);return n(r)}isDirectTrade(t){return t.length==1}findBestSellRoute(t){let e=t.sort((n,r)=>{let a=n[n.length-1].amountOut,s=r[r.length-1].amountOut;return a>s?-1:1});return e.find(n=>n.every(r=>r.errors.length==0))||e[0]}getRouteFeeRange(t){if(t.filter(n=>n.tradeFeeRange).length>0){let n=t.map(a=>a.tradeFeeRange?.[0]??a.tradeFeePct).reduce((a,s)=>a+s),r=t.map(a=>a.tradeFeeRange?.[1]??a.tradeFeePct).reduce((a,s)=>a+s);return[n,r]}}getPoolFeeRange(t){let e=t.min?mn.toPct(t.min):void 0,n=t.max?mn.toPct(t.max):void 0;if(e&&n)return[e,n]}async getBestSell(t,e,n){return this.getSell(t,e,n)}getSellSpot(t){let e=t[t.length-1];if(t.length===1)return e.spotPrice;let n=t.map(i=>i.assetOutDecimals).reduce((i,o)=>i+o),r=t.map(i=>i.spotPrice).reduce((i,o)=>i*o),a=n-e.assetOutDecimals,s=Math.pow(10,a);return r/BigInt(s)}async getSell(t,e,n,r){return this.withCtx(t,e,async({paths:a,poolsMap:s})=>{let i;if(r)i=await this.toSellSwaps(n,r,s);else{let o=a.map(c=>this.toSellSwaps(n,c,s)),l=await Promise.all(o);i=this.findBestSellRoute(l)}return this.buildSell(s,i)})}buildSell(t,e){let n=e[0],r=e[e.length-1],a=this.isDirectTrade(e),s=this.getSellSpot(e),i=r.amountOut,o=a?r.calculatedOut:this.calculateDelta0Y(n.amountIn,e,t),l=o-i,c=this.getRouteFeeRange(e),m=a?r.tradeFeePct:O.calculateSellFee(o,i),d=Math.pow(10,n.assetInDecimals),p=n.amountIn*s/BigInt(d),g=O.calculateDiffToRef(o,p);return{type:"Sell",amountIn:n.amountIn,amountOut:r.amountOut,spotPrice:s,tradeFee:l,tradeFeePct:m,tradeFeeRange:c,priceImpactPct:g,swaps:e,toHuman(){return{type:"Sell",amountIn:h.toDecimal(n.amountIn,n.assetInDecimals),amountOut:h.toDecimal(r.amountOut,r.assetOutDecimals),spotPrice:h.toDecimal(s,r.assetOutDecimals),tradeFee:h.toDecimal(l,r.assetOutDecimals),tradeFeePct:m,tradeFeeRange:c,priceImpactPct:g,swaps:e.map(y=>y.toHuman())}}}}calculateDelta0Y(t,e,n){let r=[];for(let a=0;a<e.length;a++){let s=e[a],i=n.get(s.poolAddress);if(i==null)throw new Error("Pool does not exit");let o=i.parsePair(s.assetIn,s.assetOut),l;a>0?l=r[a-1]:l=t;let c=i.calculateOutGivenIn(o,l);r.push(c)}return r[r.length-1]}async calculateMostLiquidRoute(t,e,n){let{paths:r,pools:a,poolsMap:s}=n,l=a.filter(y=>y.tokens.some(b=>b.id===t)).map(y=>y.type==="Aave"?y.tokens:y.tokens.filter(b=>b.id===t)).map(y=>y.map(b=>b.balance).reduce((b,P)=>b+P)).sort((y,b)=>b<y?-1:1)[0],c=O.getFraction(l,.1),m=await Promise.all(r.map(y=>this.toSellSwaps(c,y,s))),p=this.findBestSellRoute(m).map(y=>({poolAddress:y.poolAddress,poolId:y?.poolId,pool:y.pool,assetIn:y.assetIn,assetOut:y.assetOut})),g=this.buildRouteKey(t,e,a);return this.mlr.set(g,p),p}async toSellSwaps(t,e,n){let r=[];for(let a=0;a<e.length;a++){let s=e[a],i=n.get(s.poolAddress);if(i==null)throw new Error("Pool does not exit");let o=i.parsePair(s.assetIn,s.assetOut),l;a>0?l=r[a-1].amountOut:l=typeof t=="string"?h.toBigInt(t,o.decimalsIn):t;let c=await this.ctx.getPoolFees(i,o.assetOut),{amountOut:m,calculatedOut:d,feePct:p,errors:g}=i.validateAndSell(o,l,c),y=this.getPoolFeeRange(c),b=i.spotPriceOutGivenIn(o),P=Math.pow(10,o.decimalsIn),f=l*b/BigInt(P),S=O.calculateDiffToRef(d,f);r.push({...s,assetInDecimals:o.decimalsIn,assetOutDecimals:o.decimalsOut,amountIn:l,amountOut:m,calculatedOut:d,spotPrice:b,tradeFeePct:p,tradeFeeRange:y,priceImpactPct:S,errors:g,isSupply(){return i.type==="Aave"&&i.tokens[0].id===s.assetIn},isWithdraw(){return i.type==="Aave"&&i.tokens[1].id===s.assetIn},toHuman(){return{...s,amountIn:h.toDecimal(l,o.decimalsIn),amountOut:h.toDecimal(m,o.decimalsOut),calculatedOut:h.toDecimal(d,o.decimalsOut),spotPrice:h.toDecimal(b,o.decimalsOut),tradeFeePct:p,tradeFeeRange:y,priceImpactPct:S,errors:g}}})}return r}async getMostLiquidRoute(t,e){return this.withCtx(t,e,async n=>{let r=this.buildRouteKey(t,e,n.pools),a=this.mlr.get(r);return a||this.calculateMostLiquidRoute(t,e,n)})}async getSpotPrice(t,e){return this.withCtx(t,e,async n=>{let{pools:r,poolsMap:a}=n,s=this.buildRouteKey(t,e,r),i=this.mlr.get(s);i||(i=await this.calculateMostLiquidRoute(t,e,n));let o=await this.toSellSwaps("1",i,a),l=this.getSellSpot(o),c=o[o.length-1].assetOutDecimals;return{amount:l,decimals:c}})}findBestBuyRoute(t){let e=t.sort((n,r)=>{let a=n[0].amountIn,s=r[0].amountIn;return a>s?1:-1});return e.find(n=>n.every(r=>r.errors.length==0))||e[0]}async getBestBuy(t,e,n){return this.getBuy(t,e,n)}getBuySpot(t){let e=t[0];if(t.length===1)return e.spotPrice;let n=t.map(i=>i.assetInDecimals).reduce((i,o)=>i+o),r=t.map(i=>i.spotPrice).reduce((i,o)=>i*o),a=n-e.assetInDecimals,s=Math.pow(10,a);return r/BigInt(s)}async getBuy(t,e,n,r){return this.withCtx(t,e,async({paths:a,poolsMap:s})=>{let i;if(r)i=await this.toBuySwaps(n,r,s);else{let o=a.map(c=>this.toBuySwaps(n,c,s)),l=await Promise.all(o);i=this.findBestBuyRoute(l)}return this.buildBuy(s,i)})}buildBuy(t,e){let n=e[e.length-1],r=e[0],a=this.isDirectTrade(e),s=this.getBuySpot(e),i=r.amountIn,o=a?r.calculatedIn:this.calculateDelta0X(n.amountOut,e,t),l=i-o,c=this.getRouteFeeRange(e),m=a?r.tradeFeePct:O.calculateBuyFee(o,i),d=Math.pow(10,n.assetOutDecimals),p=n.amountOut*s/BigInt(d),g;return o===0n?g=-100:g=O.calculateDiffToRef(p,o),{type:"Buy",amountOut:n.amountOut,amountIn:r.amountIn,spotPrice:s,tradeFee:l,tradeFeePct:m,tradeFeeRange:c,priceImpactPct:g,swaps:e,toHuman(){return{type:"Buy",amountOut:h.toDecimal(n.amountOut,n.assetOutDecimals),amountIn:h.toDecimal(r.amountIn,r.assetInDecimals),spotPrice:h.toDecimal(s,r.assetInDecimals),tradeFee:h.toDecimal(l,r.assetInDecimals),tradeFeePct:m,tradeFeeRange:c,priceImpactPct:g,swaps:e.map(y=>y.toHuman())}}}}calculateDelta0X(t,e,n){let r=[];for(let a=e.length-1;a>=0;a--){let s=e[a],i=n.get(s.poolAddress);if(i==null)throw new Error("Pool does not exit");let o=i.parsePair(s.assetIn,s.assetOut),l;a==e.length-1?l=t:l=r[0];let c=i.calculateInGivenOut(o,l);r.unshift(c)}return r[0]}async toBuySwaps(t,e,n){let r=[];for(let a=e.length-1;a>=0;a--){let s=e[a],i=n.get(s.poolAddress);if(i==null)throw new Error("Pool does not exit");let o=i.parsePair(s.assetIn,s.assetOut),l;a==e.length-1?l=typeof t=="string"?h.toBigInt(t,o.decimalsOut):t:l=r[0].amountIn;let c=await this.ctx.getPoolFees(i,o.assetOut),{amountIn:m,calculatedIn:d,feePct:p,errors:g}=i.validateAndBuy(o,l,c),y=this.getPoolFeeRange(c),b=i.spotPriceInGivenOut(o),P=Math.pow(10,o.decimalsOut),f=l*b/BigInt(P),S;d===0n?S=-100:S=O.calculateDiffToRef(f,d),r.unshift({...s,assetInDecimals:o.decimalsIn,assetOutDecimals:o.decimalsOut,amountOut:l,amountIn:m,calculatedIn:d,spotPrice:b,tradeFeePct:p,tradeFeeRange:y,priceImpactPct:S,errors:g,isSupply(){return i.type==="Aave"&&i.tokens[0].id===s.assetIn},isWithdraw(){return i.type==="Aave"&&i.tokens[1].id===s.assetIn},toHuman(){return{...s,amountOut:h.toDecimal(l,o.decimalsOut),amountIn:h.toDecimal(m,o.decimalsIn),calculatedIn:h.toDecimal(d,o.decimalsIn),spotPrice:h.toDecimal(b,o.decimalsIn),tradeFeePct:p,tradeFeeRange:y,priceImpactPct:S,errors:g}}})}return r}};var pn=6e3,Ie=1000000000000000n,Ut=6,ve=-5,Oe=216e5,Wu=3,dn=6;import{Enum as gn}from"polkadot-api";var L=class{static build(t){return t.map(({assetIn:e,assetOut:n,pool:r,poolId:a})=>r==="Stableswap"?{pool:gn("Stableswap",a),asset_in:e,asset_out:n}:{pool:gn(r),asset_in:e,asset_out:n})}};var pt=class{schedulerOptions;router;constructor(t,e={}){this.router=t,this.schedulerOptions=Object.freeze({blockTime:e.blockTime??6e3,minBudgetInNative:e.minBudgetInNative??Ie})}get blockTime(){return this.schedulerOptions.blockTime}get minOrderBudget(){return this.schedulerOptions.minBudgetInNative}async getDcaOrder(t,e,n,r,a){let[s,i]=await Promise.all([this.getMinimumOrderBudget(t),this.router.getBestSell(t,e,n)]),{amountIn:o,swaps:l,priceImpactPct:c}=i,m=l[0],d=l[l.length-1],{assetInDecimals:p}=m,{assetOutDecimals:g}=d,y=Math.abs(c),b=this.getMinimumTradeCount(o,s),P=this.getOptimalTradeCount(y),f=a?Math.round(r/a):P,S=Math.ceil(r/b),w=Math.round(r/P),k=Math.round(r/f),D=o/BigInt(f),R=await this.router.getBestSell(t,e,D),q=o<s,z=[];q&&z.push("OrderTooSmall");let N=R.amountOut*BigInt(f),W=this.toBlockPeriod(k),yt=R.tradeFee*BigInt(f),ht=L.build(l),Wt={assetIn:t,assetOut:e,errors:z,frequencyMin:S,frequencyOpt:w,frequency:k,tradeCount:f,tradeFee:yt,tradeImpactPct:R.priceImpactPct,tradePeriod:W,tradeRoute:ht,type:"Dca"};return{...Wt,amountIn:o,amountOut:N,tradeAmountIn:R.amountIn,tradeAmountOut:R.amountOut,toHuman(){return{...Wt,amountIn:h.toDecimal(o,p),amountOut:h.toDecimal(N,g),tradeAmountIn:h.toDecimal(R.amountIn,p),tradeAmountOut:h.toDecimal(R.amountOut,g)}}}}async getMinimumOrderBudget(t){if(0===t)return this.minOrderBudget;let e=await this.router.getSpotPrice(0,t),n=10n**BigInt(12);if(e)return this.minOrderBudget*e.amount/n;throw new Error("Unable to calculate order budget")}getMinimumTradeCount(t,e){let n=e*2n/10n;if(n===0n)return 0;let r=t+n/2n;return Number(r/n)}getOptimalTradeCount(t){let e=Math.round(t*10)||1;return Math.max(e,3)}async getTwapSellOrder(t,e,n){let[r,a]=await Promise.all([this.getMinimumOrderBudget(t),this.router.getBestSell(t,e,n)]),{amountIn:s,swaps:i,priceImpactPct:o}=a,l=i[0],c=i[i.length-1],{assetInDecimals:m}=l,{assetOutDecimals:d}=c,p=Math.abs(o),g=this.getTwapTradeCount(p),y=s/BigInt(g),b=await this.router.getBestSell(l.assetIn,c.assetOut,y),P=g===1,f=s<r,S=b.priceImpactPct<-5,w=[];f||P?w.push("OrderTooSmall"):S&&w.push("OrderImpactTooBig");let k=b.amountOut*BigInt(g),D=b.tradeFee*BigInt(g),R=L.build(i),q={assetIn:t,assetOut:e,errors:w,tradeCount:g,tradeImpactPct:b.priceImpactPct,tradePeriod:6,tradeRoute:R,type:"TwapSell"};return{...q,amountIn:s,amountOut:k,tradeAmountIn:b.amountIn,tradeAmountOut:b.amountOut,tradeFee:D,toHuman(){return{...q,amountIn:h.toDecimal(s,m),amountOut:h.toDecimal(k,d),tradeAmountIn:h.toDecimal(b.amountIn,m),tradeAmountOut:h.toDecimal(b.amountOut,d),tradeFee:h.toDecimal(D,d)}}}}async getTwapBuyOrder(t,e,n){let[r,a]=await Promise.all([this.getMinimumOrderBudget(t),this.router.getBestBuy(t,e,n)]),{amountOut:s,swaps:i,priceImpactPct:o}=a,l=i[0],c=i[i.length-1],{assetInDecimals:m}=l,{assetOutDecimals:d}=c,p=Math.abs(o),g=this.getTwapTradeCount(p),y=s/BigInt(g),b=await this.router.getBestBuy(l.assetIn,c.assetOut,y),P=b.amountIn*BigInt(g),f=g===1,S=P<r,w=b.priceImpactPct<-5,k=[];S||f?k.push("OrderTooSmall"):w&&k.push("OrderImpactTooBig");let D=b.tradeFee*BigInt(g),R=L.build(i),q={assetIn:t,assetOut:e,errors:k,tradeCount:g,tradeImpactPct:b.priceImpactPct,tradePeriod:6,tradeRoute:R,type:"TwapBuy"};return{...q,amountIn:P,amountOut:s,tradeAmountIn:b.amountIn,tradeAmountOut:b.amountOut,tradeFee:D,toHuman(){return{...q,amountIn:h.toDecimal(P,m),amountOut:h.toDecimal(s,d),tradeAmountIn:h.toDecimal(b.amountIn,m),tradeAmountOut:h.toDecimal(b.amountOut,d),tradeFee:h.toDecimal(D,m)}}}}getTwapTradeCount(t){let e=this.getOptimalTradeCount(t);if(this.getTwapExecutionTime(e)>216e5){let r=216e5/(this.blockTime*6);return Math.round(r)}return e}getTwapExecutionTime(t){return t*6*this.blockTime}toBlockPeriod(t){let e=t/this.blockTime,n=Math.round(e);return Math.max(n,6)}};var fn={};T(fn,{BIG_10:()=>hn,BIG_BILL:()=>Pn,StakingApi:()=>Ht,StakingClient:()=>Vt});import{encodeAddress as Ua}from"@polkadot/util-crypto";import{stringToU8a as Ha}from"@polkadot/util";import{calculate_accumulated_rps as Va,calculate_period_number as yn,calculate_rewards as Wa}from"@galacticcouncil/math-staking";import dt from"big.js";var hn=dt(10),Pn=dt(hn.pow(12));function Ya(u){return Ua(Ha(("modl"+u).padEnd(32,"\0")),63)}var Ht=class{client;balanceClient;constructor(t,e){this.client=t,this.balanceClient=e}async getFreePotBalance(){let t=await this.client.getPalletId(),e=Ya(t);return(await this.balanceClient.getBalance(e,0)).transferable}async getStakingPosition(t){let[e,n]=await Promise.all([this.client.getStakingPositionsValue(t),this.client.getStakingVotes(t)]),r=e?.created_at,a=await n.reduce(async(s,[i,o])=>{let l=await s,c=i,m=o.amount,d=o.conviction.toString(),p=await this.client.getReferendumInfo(c);return p&&(p.type==="Approved"||p.type==="Rejected")&&l.push({id:c,amount:m,conviction:d}),l},Promise.resolve([]));return{stake:e?.stake,rewardPerStake:e?.reward_per_stake,createdAt:r,actionPoints:e?.action_points,accumulatedUnpaidRewards:e?.accumulated_unpaid_rewards,accumulatedSlashPoints:e?.accumulated_slash_points,accumulatedLockedRewards:e?.accumulated_locked_rewards,votes:a}}async getStake(t){let e=await this.client.getNFTCollectionId(),[n,r]=await Promise.all([this.client.getStaking(),this.client.getUniques(t,e)]),a=r.find(s=>s)?.itemId;return{totalStake:n?.total_stake,accumulatedRewardPerStake:n?.accumulated_reward_per_stake,potReservedBalance:n?.pot_reserved_balance,positionId:a,stakePosition:a?await this.getStakingPosition(a):void 0}}async getRewards(t,e){let n=await this.getStake(t),{potReservedBalance:r,accumulatedRewardPerStake:a,totalStake:s,stakePosition:i}=n;if(!i)return;let[o,l,c,m]=await Promise.all([this.getFreePotBalance(),this.client.getPeriodLength(),this.client.getUnclaimablePeriods(),this.client.getSixBlockSince()]),d=dt(o.toString()).minus(r.toString()),p=a.toString(),g=dt(e).plus(1).toString();d.gt(0)&&s>0&&(p=Va(a.toString(),d.toString(),s.toString()));let y=yn(l.toString(),e,m??g),b=yn(l.toString(),i.createdAt?.toString()??"",m??g),P=Wa(p,i.rewardPerStake?.toString()??"",i.stake?.toString()??""),f=dt(P).plus(i.accumulatedUnpaidRewards?.toString()||"0").plus(i.accumulatedLockedRewards?.toString()||"0");if(!dt(y).minus(b).lte(c.toString()))return f.div(Pn).toString()}};var Vt=class extends _{async getPalletId(){let t=this.api.constants.Staking.PalletId;return(await t()).asText()}async getPeriodLength(){let t=this.api.constants.Staking.PeriodLength;return await t()}async getUnclaimablePeriods(){let t=this.api.constants.Staking.UnclaimablePeriods;return await t()}async getNFTCollectionId(){let t=this.api.constants.Staking.NFTCollectionId;return await t()}async getStaking(){return await this.api.query.Staking.Staking.getValue()}async getUniques(t,e){return(await this.api.query.Uniques.Account.getEntries(t,e)).map(({keyArgs:s})=>{let[i,o,l]=s;return{address:i,collectionId:o,itemId:l}})}async getStakingPositionsValue(t){return await this.api.query.Staking.Positions.getValue(t)}async getStakingVotes(t){return await this.api.query.Staking.Votes.getValue(t)}async getReferendumInfo(t){return await this.api.query.Referenda.ReferendumInfoFor.getValue(t)}async getSixBlockSince(){return(await this.api.query.Staking.SixSecBlocksSince.getValue()).toString()}};var wn={};T(wn,{TxBuilderFactory:()=>bt});import{Enum as Tn}from"polkadot-api";function Sn(u){let t=[],e=u;for(;e&&typeof e=="object"&&"type"in e;)t.push(e.type),e=e.value;return t.join(".")}var gt=class extends _{evm;evmClient;balanceClient;aaveUtils;constructor(t,e){super(t),this.evm=e,this.evmClient=e.getWsProvider(),this.balanceClient=new U(t),this.aaveUtils=new Q(e)}wrapTx(t,e){return{name:t,get:()=>e,dryRun:n=>this.dryRun(n,e)}}async dispatchWithExtraGas(t){return this.api.tx.Dispatcher.dispatch_with_extra_gas({call:t.decodedCall,extra_gas:ae})}async dryRun(t,e){let n=Tn("Signed",t),r=Tn("system",n),s=await this.client.getUnsafeApi().apis.DryRunApi.dry_run_call(r,e.decodedCall),i=s.success&&!s.value.execution_result.success?s.value.execution_result.value.error:null;if(i){let o=Sn(i.value);throw new Error("Dry run execution error!",{cause:o})}return s}isDirectOmnipoolTrade(t){return t.length===1&&t[0].pool==="Omnipool"}};var te=class extends gt{_trade;_beneficiary;_slippagePct=1;setTrade(t){return this._trade=t,this}withBeneficiary(t){return this._beneficiary=t,this}withSlippage(t){return this._slippagePct=t,this}get trade(){if(!this._trade)throw new Error("Trade not set. Use setTrade().");return this._trade}get beneficiary(){if(!this._beneficiary)throw new Error("Beneficiary not set. Use withBeneficiary().");return this._beneficiary}get slippagePct(){return this._slippagePct}async build(){let{amountIn:t,swaps:e,type:n}=this.trade;if(n==="Buy")return this.buildBuyTx();let{assetIn:r}=e[0],a=await this.balanceClient.getBalance(this.beneficiary,r);return t>=a.transferable-5n?this.buildSellAllTx():this.buildSellTx()}async buildBuyTx(){let{amountIn:t,amountOut:e,swaps:n}=this.trade,r=n[0],a=n[n.length-1],s=O.getFraction(t,this.slippagePct),i=r.assetIn,o=a.assetOut,l=t+s,c;return this.isDirectOmnipoolTrade(n)?c=this.api.tx.Omnipool.buy({asset_in:i,asset_out:o,amount:e,max_sell_amount:l}):c=this.api.tx.Router.buy({asset_in:i,asset_out:o,amount_out:e,max_amount_in:l,route:L.build(n)}),this.wrapTx("RouterBuy",c)}async buildSellTx(){let{amountIn:t,amountOut:e,swaps:n}=this.trade,r=n[0],a=n[n.length-1],s=O.getFraction(e,this.slippagePct),i=r.assetIn,o=a.assetOut,l=e-s,c;return this.isDirectOmnipoolTrade(n)?c=this.api.tx.Omnipool.sell({asset_in:i,asset_out:o,amount:t,min_buy_amount:l}):c=this.api.tx.Router.sell({asset_in:i,asset_out:o,amount_in:t,min_amount_out:l,route:L.build(n)}),r.isWithdraw()&&await this.aaveUtils.hasBorrowPositions(this.beneficiary)&&(c=await this.dispatchWithExtraGas(c)),this.wrapTx("RouterSell",c)}async buildSellAllTx(){let{amountOut:t,swaps:e}=this.trade,n=e[0],r=e[e.length-1],a=O.getFraction(t,this.slippagePct),s=n.assetIn,i=r.assetOut,o=t-a,l=this.api.tx.Router.sell_all({asset_in:s,asset_out:i,min_amount_out:o,route:L.build(e)});return n.isWithdraw()&&await this.aaveUtils.hasBorrowPositions(this.beneficiary)&&(l=await this.dispatchWithExtraGas(l)),this.wrapTx("RouterSellAll",l)}};import{Enum as Ae}from"polkadot-api";var ee=class extends gt{_order;_beneficiary;_maxRetries=3;_slippagePct=1;setOrder(t){return this._order=t,this}withBeneficiary(t){return this._beneficiary=t,this}withMaxRetries(t){return this._maxRetries=t,this}withSlippage(t){return this._slippagePct=t,this}get order(){if(!this._order)throw new Error("Order not set. Use setOrder().");return this._order}get beneficiary(){if(!this._beneficiary)throw new Error("Beneficiary not set. Use withBeneficiary().");return this._beneficiary}get maxRetries(){return this._maxRetries}get slippagePct(){return this._slippagePct}async build(){let{type:t}=this.order;switch(t){case"Dca":return this.buildDcaTx();case"TwapSell":return this.buildTwapSellTx();case"TwapBuy":return this.buildTwapBuyTx();default:throw new Error(`Unsupported TradeOrderType: ${t}`)}}buildDcaTx(){let{amountIn:t,assetIn:e,assetOut:n,tradeAmountIn:r,tradePeriod:a,tradeRoute:s}=this.order,i=this.api.tx.DCA.schedule({schedule:{owner:this.beneficiary,period:a,max_retries:this.maxRetries,total_amount:t,slippage:this.slippagePct*1e4,stability_threshold:void 0,order:Ae("Sell",{asset_in:e,asset_out:n,amount_in:r,min_amount_out:0n,route:s})},start_execution_block:void 0});return this.wrapTx("DcaSchedule",i)}buildTwapSellTx(){let{amountIn:t,assetIn:e,assetOut:n,tradeAmountIn:r,tradeAmountOut:a,tradePeriod:s,tradeRoute:i}=this.order,o=O.getFraction(a,this.slippagePct),l=a-o,c=this.api.tx.DCA.schedule({schedule:{owner:this.beneficiary,period:s,max_retries:this.maxRetries,total_amount:t,slippage:this.slippagePct*1e4,stability_threshold:void 0,order:Ae("Sell",{asset_in:e,asset_out:n,amount_in:r,min_amount_out:l,route:i})},start_execution_block:void 0});return this.wrapTx("DcaSchedule.twapSell",c)}buildTwapBuyTx(){let{amountIn:t,assetIn:e,assetOut:n,tradeAmountIn:r,tradeAmountOut:a,tradePeriod:s,tradeRoute:i}=this.order,o=O.getFraction(r,this.slippagePct),l=r+o,c=this.api.tx.DCA.schedule({schedule:{owner:this.beneficiary,period:s,max_retries:this.maxRetries,total_amount:t,slippage:this.slippagePct*1e4,stability_threshold:void 0,order:Ae("Buy",{asset_in:e,asset_out:n,amount_out:a,max_amount_in:l,route:i})},start_execution_block:void 0});return this.wrapTx("DcaSchedule.twapBuy",c)}};var bt=class{client;evmClient;constructor(t,e){this.client=t,this.evmClient=e}trade(t){return new te(this.client,this.evmClient).setTrade(t)}order(t){return new ee(this.client,this.evmClient).setOrder(t)}};async function Zm(u){let t=new it(u),e=new xt(u),[n,r]=await Promise.all([t.getBlockTime(),t.getMinOrderBudget()]),a=new ct(u,e).withAave().withOmnipool().withStableswap().withXyk(),s=new U(u),i=new Vt(u),o=new vt(u),l=new Q(e),c=new mt(a),m=new pt(c,{blockTime:n,minBudgetInNative:r}),d=new Ht(i,s),p=new It(o,s,{blockTime:n});return{api:{aave:l,router:c,scheduler:m,staking:d,farm:p},client:{asset:new rt(u),balance:s,evm:e},ctx:{pool:a},tx:new bt(u,e),destroy:()=>{a.destroy()}}}export{Ge as aave,Ce as api,h as big,Ve as client,ke as const,Zm as createSdkContext,et as erc20,We as error,Ke as evm,Ze as farm,v as fmt,zt as h160,$ as json,O as math,un as pool,bn as sor,fn as staking,wn as tx,Ne as xc};
1
+ var Fn=Object.defineProperty;var w=(u,t)=>{for(var e in t)Fn(u,e,{get:t[e],enumerable:!0})};var Le={};w(Le,{Papi:()=>R,getWs:()=>Dn});import{hydration as En}from"@galacticcouncil/descriptors";function Me(u){switch(u){case!0:case"true":case 1:case"1":case"on":case"yes":return!0;default:return!1}}var R=class{client;api;constructor(t){this.client=t,this.api=this.client.getTypedApi(En)}log(t,...e){let n=typeof window>"u"?process.env.GC_DEBUG:window.localStorage.getItem("gc.debug");Me(n)&&console.log(t,...e)}};import{createClient as kn}from"polkadot-api";import{withPolkadotSdkCompat as Cn}from"polkadot-api/polkadot-sdk-compat";var Dn=async u=>{let t=typeof u=="string"?u.split(","):u,r=(typeof window>"u"?(await import("polkadot-api/ws-provider/node")).getWsProvider:(await import("polkadot-api/ws-provider/web")).getWsProvider)(t);return kn(Cn(r))};var We={};w(We,{AAVE_GAS_LIMIT:()=>ue,AAVE_LENDING_POOL_ADDRESS:()=>Qt,AAVE_POOL_ABI:()=>le,AAVE_POOL_DATA_PROVIDER:()=>$t,AAVE_POOL_DATA_PROVIDER_ABI:()=>jt,AAVE_POOL_PROXY:()=>ce,AAVE_ROUNDING_THRESHOLD:()=>ca,AAVE_UINT_256_MAX:()=>Mn,AaveClient:()=>St,AaveUtils:()=>tt});var le=[{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"reserve",type:"address"},{indexed:!1,internalType:"address",name:"user",type:"address"},{indexed:!0,internalType:"address",name:"onBehalfOf",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"},{indexed:!0,internalType:"uint16",name:"referralCode",type:"uint16"}],name:"Supply",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"reserve",type:"address"},{indexed:!0,internalType:"address",name:"user",type:"address"},{indexed:!0,internalType:"address",name:"to",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"}],name:"Withdraw",type:"event"},{inputs:[{internalType:"address",name:"asset",type:"address"},{internalType:"uint256",name:"amount",type:"uint256"},{internalType:"address",name:"to",type:"address"}],name:"withdraw",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"nonpayable",type:"function"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"reserve",type:"address"},{indexed:!1,internalType:"address",name:"user",type:"address"},{indexed:!0,internalType:"address",name:"onBehalfOf",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"},{indexed:!1,internalType:"enum DataTypes.InterestRateMode",name:"interestRateMode",type:"uint8"},{indexed:!1,internalType:"uint256",name:"borrowRate",type:"uint256"},{indexed:!0,internalType:"uint16",name:"referralCode",type:"uint16"}],name:"Borrow",type:"event"},{inputs:[{internalType:"address",name:"asset",type:"address"},{internalType:"uint256",name:"amount",type:"uint256"},{internalType:"uint256",name:"interestRateMode",type:"uint256"},{internalType:"uint16",name:"referralCode",type:"uint16"},{internalType:"address",name:"onBehalfOf",type:"address"}],name:"borrow",outputs:[],stateMutability:"nonpayable",type:"function"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"reserve",type:"address"},{indexed:!0,internalType:"address",name:"user",type:"address"},{indexed:!0,internalType:"address",name:"repayer",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"},{indexed:!1,internalType:"bool",name:"useATokens",type:"bool"}],name:"Repay",type:"event"},{inputs:[{internalType:"address",name:"user",type:"address"}],name:"getUserAccountData",outputs:[{internalType:"uint256",name:"totalCollateralBase",type:"uint256"},{internalType:"uint256",name:"totalDebtBase",type:"uint256"},{internalType:"uint256",name:"availableBorrowsBase",type:"uint256"},{internalType:"uint256",name:"currentLiquidationThreshold",type:"uint256"},{internalType:"uint256",name:"ltv",type:"uint256"},{internalType:"uint256",name:"healthFactor",type:"uint256"}],stateMutability:"view",type:"function"}];var jt=[{inputs:[{internalType:"contract IEACAggregatorProxy",name:"_networkBaseTokenPriceInUsdProxyAggregator",type:"address"},{internalType:"contract IEACAggregatorProxy",name:"_marketReferenceCurrencyPriceInUsdProxyAggregator",type:"address"}],stateMutability:"nonpayable",type:"constructor"},{inputs:[],name:"ETH_CURRENCY_UNIT",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[],name:"MKR_ADDRESS",outputs:[{internalType:"address",name:"",type:"address"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"bytes32",name:"_bytes32",type:"bytes32"}],name:"bytes32ToString",outputs:[{internalType:"string",name:"",type:"string"}],stateMutability:"pure",type:"function"},{inputs:[{internalType:"contract IPoolAddressesProvider",name:"provider",type:"address"}],name:"getReservesData",outputs:[{components:[{internalType:"address",name:"underlyingAsset",type:"address"},{internalType:"string",name:"name",type:"string"},{internalType:"string",name:"symbol",type:"string"},{internalType:"uint256",name:"decimals",type:"uint256"},{internalType:"uint256",name:"baseLTVasCollateral",type:"uint256"},{internalType:"uint256",name:"reserveLiquidationThreshold",type:"uint256"},{internalType:"uint256",name:"reserveLiquidationBonus",type:"uint256"},{internalType:"uint256",name:"reserveFactor",type:"uint256"},{internalType:"bool",name:"usageAsCollateralEnabled",type:"bool"},{internalType:"bool",name:"borrowingEnabled",type:"bool"},{internalType:"bool",name:"stableBorrowRateEnabled",type:"bool"},{internalType:"bool",name:"isActive",type:"bool"},{internalType:"bool",name:"isFrozen",type:"bool"},{internalType:"uint128",name:"liquidityIndex",type:"uint128"},{internalType:"uint128",name:"variableBorrowIndex",type:"uint128"},{internalType:"uint128",name:"liquidityRate",type:"uint128"},{internalType:"uint128",name:"variableBorrowRate",type:"uint128"},{internalType:"uint128",name:"stableBorrowRate",type:"uint128"},{internalType:"uint40",name:"lastUpdateTimestamp",type:"uint40"},{internalType:"address",name:"aTokenAddress",type:"address"},{internalType:"address",name:"stableDebtTokenAddress",type:"address"},{internalType:"address",name:"variableDebtTokenAddress",type:"address"},{internalType:"address",name:"interestRateStrategyAddress",type:"address"},{internalType:"uint256",name:"availableLiquidity",type:"uint256"},{internalType:"uint256",name:"totalPrincipalStableDebt",type:"uint256"},{internalType:"uint256",name:"averageStableRate",type:"uint256"},{internalType:"uint256",name:"stableDebtLastUpdateTimestamp",type:"uint256"},{internalType:"uint256",name:"totalScaledVariableDebt",type:"uint256"},{internalType:"uint256",name:"priceInMarketReferenceCurrency",type:"uint256"},{internalType:"address",name:"priceOracle",type:"address"},{internalType:"uint256",name:"variableRateSlope1",type:"uint256"},{internalType:"uint256",name:"variableRateSlope2",type:"uint256"},{internalType:"uint256",name:"stableRateSlope1",type:"uint256"},{internalType:"uint256",name:"stableRateSlope2",type:"uint256"},{internalType:"uint256",name:"baseStableBorrowRate",type:"uint256"},{internalType:"uint256",name:"baseVariableBorrowRate",type:"uint256"},{internalType:"uint256",name:"optimalUsageRatio",type:"uint256"},{internalType:"bool",name:"isPaused",type:"bool"},{internalType:"bool",name:"isSiloedBorrowing",type:"bool"},{internalType:"uint128",name:"accruedToTreasury",type:"uint128"},{internalType:"uint128",name:"unbacked",type:"uint128"},{internalType:"uint128",name:"isolationModeTotalDebt",type:"uint128"},{internalType:"bool",name:"flashLoanEnabled",type:"bool"},{internalType:"uint256",name:"debtCeiling",type:"uint256"},{internalType:"uint256",name:"debtCeilingDecimals",type:"uint256"},{internalType:"uint8",name:"eModeCategoryId",type:"uint8"},{internalType:"uint256",name:"borrowCap",type:"uint256"},{internalType:"uint256",name:"supplyCap",type:"uint256"},{internalType:"uint16",name:"eModeLtv",type:"uint16"},{internalType:"uint16",name:"eModeLiquidationThreshold",type:"uint16"},{internalType:"uint16",name:"eModeLiquidationBonus",type:"uint16"},{internalType:"address",name:"eModePriceSource",type:"address"},{internalType:"string",name:"eModeLabel",type:"string"},{internalType:"bool",name:"borrowableInIsolation",type:"bool"}],internalType:"struct IUiPoolDataProviderV3.AggregatedReserveData[]",name:"",type:"tuple[]"},{components:[{internalType:"uint256",name:"marketReferenceCurrencyUnit",type:"uint256"},{internalType:"int256",name:"marketReferenceCurrencyPriceInUsd",type:"int256"},{internalType:"int256",name:"networkBaseTokenPriceInUsd",type:"int256"},{internalType:"uint8",name:"networkBaseTokenPriceDecimals",type:"uint8"}],internalType:"struct IUiPoolDataProviderV3.BaseCurrencyInfo",name:"",type:"tuple"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"contract IPoolAddressesProvider",name:"provider",type:"address"}],name:"getReservesList",outputs:[{internalType:"address[]",name:"",type:"address[]"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"contract IPoolAddressesProvider",name:"provider",type:"address"},{internalType:"address",name:"user",type:"address"}],name:"getUserReservesData",outputs:[{components:[{internalType:"address",name:"underlyingAsset",type:"address"},{internalType:"uint256",name:"scaledATokenBalance",type:"uint256"},{internalType:"bool",name:"usageAsCollateralEnabledOnUser",type:"bool"},{internalType:"uint256",name:"stableBorrowRate",type:"uint256"},{internalType:"uint256",name:"scaledVariableDebt",type:"uint256"},{internalType:"uint256",name:"principalStableDebt",type:"uint256"},{internalType:"uint256",name:"stableBorrowLastUpdateTimestamp",type:"uint256"}],internalType:"struct IUiPoolDataProviderV3.UserReserveData[]",name:"",type:"tuple[]"},{internalType:"uint8",name:"",type:"uint8"}],stateMutability:"view",type:"function"},{inputs:[],name:"marketReferenceCurrencyPriceInUsdProxyAggregator",outputs:[{internalType:"contract IEACAggregatorProxy",name:"",type:"address"}],stateMutability:"view",type:"function"},{inputs:[],name:"networkBaseTokenPriceInUsdProxyAggregator",outputs:[{internalType:"contract IEACAggregatorProxy",name:"",type:"address"}],stateMutability:"view",type:"function"}];var ce="0x1b02E051683b5cfaC5929C25E84adb26ECf87B38",$t="0x112b087b60C1a166130d59266363C45F8aa99db0",Qt="0xf3Ba4D1b50f78301BDD7EAEa9B67822A15FCA691",ue=1000000n,ca=5,Mn=BigInt("0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");var St=class{client;constructor(t){this.client=t.getWsProvider()}async getBlockTimestamp(){let t=await this.client.getBlock();return Number(t.timestamp)}async getReservesData(){return await this.client.readContract({abi:jt,address:$t,args:[Qt],functionName:"getReservesData"})}async getUserReservesData(t){return await this.client.readContract({abi:jt,address:$t,args:[Qt,t],functionName:"getUserReservesData"})}async getUserAccountData(t){return await this.client.readContract({abi:le,address:ce,args:[t],functionName:"getUserAccountData"})}};import X from"big.js";var f={};w(f,{asBigInt:()=>Nn,toBigInt:()=>qn,toDecimal:()=>Ln});import J from"big.js";J.NE=-18;function Ln(u,t,e=6,n){let r=J(u.toString()),i=J(10).pow(t);return r.div(i).round(e,n).toString()}function qn(u,t){let e=J(10).pow(t),r=J(u).mul(e).toFixed(0,J.roundDown);return BigInt(r)}function Nn(u){return BigInt(u.round(0,J.roundDown).toFixed(0))}var it={};w(it,{ERC20:()=>me});var me=class{static fromAssetId(t){let e=Buffer.alloc(20,0);return e[15]=1,e.writeUInt32BE(t,16),"0x"+e.toString("hex")}static toAssetId(t){let e=Buffer.from(t.replace("0x",""),"hex");return e.length!==20||!this.isAssetAddress(t)?null:e.readUInt32BE(16)}static isAssetAddress(t){let e=Buffer.from("0000000000000000000000000000000100000000","hex"),n=Buffer.from(t.replace("0x",""),"hex");return n.length!==20?!1:n.subarray(0,16).equals(e.subarray(0,16))}};var v={};w(v,{FeeUtils:()=>ye,shiftNeg:()=>Vn});import Hn from"big.js";var qe={};w(qe,{HUB_ASSET_ID:()=>ge,HYDRATION_OMNIPOOL_ADDRESS:()=>Un,HYDRATION_PARACHAIN_ID:()=>Gn,HYDRATION_SS58_PREFIX:()=>k,PERBILL_DENOMINATOR:()=>pe,PERMILL_DENOMINATOR:()=>Tt,RUNTIME_DECIMALS:()=>I,SYSTEM_ASSET_DECIMALS:()=>de,SYSTEM_ASSET_ID:()=>F,TRADEABLE_DEFAULT:()=>at});var I=18,Tt=1e6,pe=1e9,F=0,de=12,Gn=2034,k=63,Un="7L53bUTBbfuj14UpdCNPwmgzzHSsrsTWBHX5pys32mVWM3C1",ge=1,at=15;var ye=class u{static toPct(t){let[e,n]=t;return u.safeDivide(e*100,n)}static toRaw(t){let[e,n]=t;return u.safeDivide(e,n)}static fromPermill(t){return[t,1e6]}static fromPerbill(t){return[t,1e9]}static fromRate(t,e){return[t,e]}static safeDivide(t,e,n=12){let r=10**n;return Math.round(t*r/e)/r}static safeRound(t){return parseFloat(t.toPrecision(15))}};function Vn(u,t){let e=Hn(typeof u=="bigint"?u.toString():u);return t===0?e.toString():e.div(Math.pow(10,t)).toString()}var Jt={};w(Jt,{H160:()=>he,isEvmAccount:()=>Ge,isEvmAddress:()=>Ue,isSs58Address:()=>He});import{AccountId as wt}from"polkadot-api";import{toHex as Ne}from"@polkadot-api/utils";import{Buffer as Y}from"buffer";var be="ETH\0";function Ge(u){if(!u)return!1;try{let t=wt().enc(u),e=Y.from(be);return Y.from(t.subarray(0,e.length)).equals(e)}catch{return!1}}function Ue(u){return!!/^0x[a-fA-F0-9]{40}$/.test(u)}function He(u){try{return wt(63).enc(u),!0}catch{return!1}}var he=class u{static toAccount=t=>{let e=Y.from(t.slice(2),"hex"),n=Y.from(be),r=Uint8Array.from(Y.concat([n,e,Y.alloc(8)])),i=Ne(r);return wt(63).dec(i)};static fromAccount=t=>{let e=wt().enc(t),n=Y.from(be),r=e.slice(n.length,-8);return"0x"+Y.from(r).toString("hex")};static fromSS58=t=>{let n=wt().enc(t).slice(0,20);return Ne(n)};static fromAny=t=>{if(Ue(t))return t;if(Ge(t))return u.fromAccount(t);if(He(t))return u.fromSS58(t);throw new Error("Unknown address type")}};var Z={};w(Z,{findNestedKey:()=>Wn,findNestedObj:()=>Yn,jsonFormatter:()=>Xn});var Wn=(u,t)=>{let e=[];return JSON.stringify(u,(n,r)=>(r&&r[t]&&e.push(r),r)),e[0]},Yn=(u,t,e)=>{let n;return JSON.stringify(u,(r,i)=>(i&&i[t]===e&&(n=i),i)),n},Xn=(u,t)=>typeof t=="bigint"?t.toString():t;var O={};w(O,{calculateBuyFee:()=>$n,calculateDiffToAvg:()=>Kn,calculateDiffToRef:()=>zn,calculateSellFee:()=>jn,getFraction:()=>Qn});import H from"big.js";function Kn(u,t){let e=H(u.toString()),n=H(t.toString());return e.minus(n).abs().div(e.plus(n).div(2)).mul(100).round(2).toNumber()}function zn(u,t){if(t===0n)return 0;let e=H(u.toString()),n=H(t.toString());return e.minus(n).div(n).mul(100).round(2).toNumber()}function jn(u,t){let e=H(u.toString()),n=H(t.toString());return H(1).minus(n.div(e)).mul(100).round(2).toNumber()}function $n(u,t){let e=H(u.toString());return H(t.toString()).div(e).minus(1).mul(100).round(2).toNumber()}function Qn(u,t,e=2){(t<.01||t>100)&&new Error("Supported range is from 0.01% - 100%");let n=Math.pow(10,e),r=BigInt(t*n);return u*r/BigInt(100*n)}var Ve={};w(Ve,{convertToId:()=>Zn});import{Buffer as Jn}from"buffer";function Zn(u){let e=Jn.from(u.replace("0x",""),"hex").subarray(16);return e.readUIntBE(0,e.length)}var{ERC20:Zt}=it,{H160:Pe}=Jt,tr=1.01,er=31536000n,te=10n**27n,tt=class{client;constructor(t){this.client=new St(t)}async getSummary(t){let e=Pe.fromAny(t),[n,r,i,s]=await Promise.all([this.client.getReservesData(),this.client.getUserReservesData(e),this.client.getUserAccountData(e),this.client.getBlockTimestamp()]),[a]=n,[o,l]=r,[c,m,d,p,g,b]=i,y=f.toDecimal(b,18),h=[];for(let P of o){let S=P.underlyingAsset.toLowerCase(),T=a.find(({underlyingAsset:oe})=>oe.toLowerCase()===S);if(!T)throw new Error("Missing pool reserve for "+S);let C=P.scaledATokenBalance,q=T.liquidityIndex,_=T.liquidityRate,D=T.availableLiquidity,j=T.priceInMarketReferenceCurrency,$=s+6,G=this.calculateLinearInterest(_,T.lastUpdateTimestamp,$),W=q*G/te,ft=C*W/te,Xt=Number(l!==0&&l===T.eModeCategoryId?T.eModeLiquidationThreshold:T.reserveLiquidationThreshold)/1e4,Kt=T.usageAsCollateralEnabled&&P.usageAsCollateralEnabledOnUser&&P.scaledATokenBalance>0n,zt=Zt.toAssetId(S);h.push({aTokenBalance:ft,availableLiquidity:D,decimals:Number(T.decimals),isCollateral:Kt,priceInRef:j,reserveId:zt,reserveAsset:S,reserveLiquidationThreshold:Xt})}return{healthFactor:Number(y),totalCollateral:c,totalDebt:m,reserves:h}}async hasBorrowPositions(t){let e=Pe.fromAny(t),n=await this.client.getUserAccountData(e),[r,i]=n;return i>0n}async getHealthFactor(t){let e=Pe.fromAny(t),n=await this.client.getUserAccountData(e),[r,i,s,a,o,l]=n,c=f.toDecimal(l,18);return Number(c)}async getHealthFactorAfterWithdraw(t,e,n){let{totalCollateral:r,totalDebt:i,reserves:s}=await this.getSummary(t),a=Zt.fromAssetId(e),o=s.find(h=>h.reserveAsset===a);if(!o)throw new Error("Missing reserve ctx for "+a);let{decimals:l,isCollateral:c,priceInRef:m,reserveLiquidationThreshold:d}=o,p=f.toBigInt(n,l),g=c?p*m/10n**BigInt(l):0n,b=r-g;if(b<=0n)return 0;let y=X(b.toString()).mul(d).div(i.toString()).toFixed(6,X.roundDown);return Number(y)}async getHealthFactorAfterSupply(t,e,n){let{totalCollateral:r,totalDebt:i,reserves:s}=await this.getSummary(t),a=Zt.fromAssetId(e),o=s.find(y=>y.reserveAsset===a);if(!o)throw new Error("Missing reserve ctx for "+a);let{decimals:l,priceInRef:c,reserveLiquidationThreshold:m}=o,p=f.toBigInt(n,l)*c/10n**BigInt(l),g=r+p;if(g<=0n)return 0;let b=X(g.toString()).mul(m).div(i.toString()).toFixed(6,X.roundDown);return Number(b)}async getMaxWithdraw(t,e){let{totalDebt:n,reserves:r,healthFactor:i}=await this.getSummary(t),s=Zt.fromAssetId(e),a=r.find(o=>o.reserveAsset===s);if(!a)throw new Error("Missing reserve ctx for "+s);return this.calculateWithdrawMax(a,n,i)}async getMaxWithdrawAll(t){let{totalDebt:e,reserves:n,healthFactor:r}=await this.getSummary(t),i={};for(let s of n){let a=this.calculateWithdrawMax(s,e,r);s.reserveId&&(i[s.reserveId]=a)}return i}calculateWithdrawMax(t,e,n){let{aTokenBalance:r,availableLiquidity:i,decimals:s,priceInRef:a,reserveLiquidationThreshold:o,isCollateral:l}=t,c=r;if(l&&e>0n){let d=n-tr;if(d>0){let p=X(d).mul(e.toString()).div(o).toFixed(0,X.roundDown),g=X(p).div(a.toString()).mul(10**s).toFixed(0,X.roundDown);c=r<BigInt(g)?r:BigInt(g)}else c=0n}return{amount:c<i?c:i,decimals:s}}calculateLinearInterest(t,e,n){let r=n-e;if(r<=0)return te;let i=t*BigInt(r)/er;return te+i}};var Ke={};w(Ke,{AssetClient:()=>st,BalanceClient:()=>U,ChainParams:()=>lt});var st=class extends R{SUPPORTED_TYPES=["StableSwap","Bond","Token","External","Erc20"];constructor(t){super(t)}async queryShares(){let e=await this.api.query.Stableswap.Pools.getEntries();return new Map(e.map(({keyArgs:n,value:r})=>{let[i]=n;return[i,r]}))}async queryBonds(){let e=await this.api.query.Bonds.Bonds.getEntries();return new Map(e.map(({keyArgs:n,value:r})=>{let[i]=n;return[i,r]}))}async queryAssets(){let e=await this.api.query.AssetRegistry.Assets.getEntries();return new Map(e.filter(({value:n})=>{let{asset_type:r}=n;return this.SUPPORTED_TYPES.includes(r.type)}).map(({keyArgs:n,value:r})=>{let[i]=n;return[i,r]}))}async queryAssetLocations(){let e=await this.api.query.AssetRegistry.AssetLocations.getEntries();return new Map(e.map(({keyArgs:n,value:r})=>{let[i]=n;return[i,r]}))}async mapToken(t,e,n,r){let{name:i,asset_type:s,is_sufficient:a,existential_deposit:o}=e,{symbol:l,decimals:c}=n.get(t)??{};return{id:t,name:i?.asText(),symbol:l,decimals:c,icon:l,type:s.type,isSufficient:a,location:r,existentialDeposit:o}}async mapBond(t,e,n,r){let[i,s]=r,{asset_type:a,is_sufficient:o,existential_deposit:l}=e,{symbol:c,decimals:m}=await this.mapToken(i,e,n),d=Number(s),p=new Intl.DateTimeFormat("en-GB"),g=[c,"Bond",p.format(d)].join(" ");return{id:t,name:g,symbol:c+"b",decimals:m,icon:c,type:a.type,isSufficient:o,existentialDeposit:l,underlyingAssetId:i,maturity:d}}async mapShares(t,e,n,r){let{assets:i}=r,{name:s,symbol:a,asset_type:o,is_sufficient:l,existential_deposit:c}=e,m=await Promise.all(i.map(async g=>{let{symbol:b}=await this.mapToken(g,e,n);return[g,b]})),d=Object.fromEntries(m),p=Object.values(d);return{id:t,name:p.join(", "),symbol:a?.asText()||s?.asText(),decimals:18,icon:p.join("/"),type:o.type,isSufficient:l,existentialDeposit:c,meta:d}}async mapExternal(t,e,n,r){let i=await this.mapToken(t,e,new Map,r),s=n?.find(a=>a.internalId===i.id);return s?{...i,decimals:s.decimals,name:s.name,symbol:s.symbol,icon:s.symbol,isWhiteListed:s.isWhiteListed}:i}parseMetadata(t){return new Map(Array.from(t,([e,n])=>[e,{symbol:n.symbol?.asText(),decimals:n.decimals}]))}async getOnChainAssets(t,e){let[n,r,i,s]=await Promise.all([this.queryAssets(),this.queryAssetLocations(),this.queryShares(),this.queryBonds()]),a=this.parseMetadata(n),o=[];for(let[l,c]of Array.from(n)){let m=r.get(l),{asset_type:d}=c,p;switch(d.type){case"Bond":let g=s.get(l);p=await this.mapBond(l,c,a,g);break;case"StableSwap":let b=i.get(l);p=await this.mapShares(l,c,a,b);break;case"External":p=await this.mapExternal(l,c,e,m);break;default:p=await this.mapToken(l,c,a,m)}o.push(p)}return t?o:o.filter(l=>this.isValidAsset(l))}isValidAsset(t){let e=Math.sign(t.decimals);return!!t.symbol&&(e===0||e===1)}};import{Subject as nr,bufferCount as rr,combineLatest as ir,debounceTime as ar,distinctUntilChanged as Ye,finalize as sr,map as ot,pairwise as or,shareReplay as lr,startWith as cr}from"rxjs";var U=class extends R{constructor(t){super(t)}async getBalance(t,e){return e===0?this.getSystemBalance(t):this.getTokenBalanceData(t,e)}async getSystemBalance(t){let e=this.api.query.System.Account,{data:n}=await e.getValue(t);return this.calculateBalance(n)}async getTokenBalance(t,e){let r=await this.api.query.Tokens.Accounts.getValue(t,e);return this.calculateBalance(r)}calculateBalance(t){let e=t.free>=t.frozen?t.free-t.frozen:0n,n=t.free+t.reserved;return{free:t.free,reserved:t.reserved,frozen:t.frozen,total:n,transferable:e}}async getErc20Balance(t,e){return this.getTokenBalanceData(t,e)}subscribeBalance(t){let e=this.subscribeSystemBalance(t),n=this.subscribeTokensBalance(t),r=this.subscribeErc20Balance(t);return ir([e,n,r]).pipe(ar(250),ot(i=>i.flat()),cr([]),rr(2,1),ot(([i,s],a)=>{if(a===0)return s;let o=i.reduce((c,m)=>(c.set(m.id,m.balance),c),new Map);return s.filter(c=>!Xe(c.balance,o.get(c.id)))}))}subscribeSystemBalance(t){return this.api.query.System.Account.watchValue(t,"best").pipe(ot(n=>({id:0,balance:this.calculateBalance(n.data)})))}subscribeTokenBalance(t,e){return this.api.query.Tokens.Accounts.watchValue(t,e,"best").pipe(ot(r=>({id:e,balance:r})))}subscribeTokensBalance(t){return this.api.query.Tokens.Accounts.watchEntries(t,{at:"best"}).pipe(Ye((n,r)=>!r.deltas),ot(({deltas:n})=>{let r=[];return n?.deleted.forEach(i=>{let[s,a]=i.args;r.push({id:a,balance:this.calculateBalance({free:0n,reserved:0n,frozen:0n})})}),n?.upserted.forEach(i=>{let[s,a]=i.args;r.push({id:a,balance:this.calculateBalance(i.value)})}),r}))}subscribeErc20Balance(t,e){let n=new nr,r=n.pipe(lr(1)),i=async()=>(await this.api.query.AssetRegistry.Assets.getEntries()).filter(({value:l})=>{let{asset_type:c}=l;return c.type==="Erc20"}).map(({keyArgs:l})=>{let[c]=l;return c}),s=async()=>{let o=e||await i(),l=async()=>{let d=(await Promise.all(o.map(async p=>{let g=await this.getTokenBalanceData(t,p);return[p,g]}))).map(([p,g])=>({id:p,balance:g}));n.next(d)};await l();let c=this.api.query.System.Number.watchValue("best").subscribe(l);return()=>c.unsubscribe()},a;return s().then(o=>a=o),r.pipe(sr(()=>a?.()),or(),ot(([o,l],c)=>{if(c===0)return l;let m=o.reduce((p,g)=>(p.set(g.id,g.balance),p),new Map);return l.filter(p=>!Xe(p.balance,m.get(p.id)))}),Ye((o,l)=>l.length===0))}async getTokenBalanceData(t,e){let n=await this.api.apis.CurrenciesApi.account(e,t);return this.calculateBalance(n)}},Xe=(u,t)=>u!==void 0&&t!==void 0&&u.transferable===t.transferable&&u.total===t.total;var lt=class extends R{_minOrderBudget;_blockTime;constructor(t){super(t)}async getBlockTime(){if(this._blockTime===void 0){let t=await this.api.constants.Aura.SlotDuration();this._blockTime=Number(t)}return this._blockTime}async getMinOrderBudget(){return this._minOrderBudget===void 0&&(this._minOrderBudget=await this.api.constants.DCA.MinBudgetInNativeCurrency()),this._minOrderBudget}};var ze={};w(ze,{AssetNotFound:()=>fe,PoolNotFound:()=>xt,RouteNotFound:()=>It});var fe=class extends Error{constructor(t){super(),this.message=`${t} not found`,this.name="AssetNotFound"}},xt=class extends Error{constructor(t){super(),this.message=`${t} pool invalid`,this.name="PoolNotFound"}},It=class extends Error{constructor(t,e){super(),this.message=`Route from ${t} to ${e} not found in current configuration`,this.name="RouteNotFound"}};var Qe={};w(Qe,{EvmClient:()=>vt,createChain:()=>Se});import{defineChain as ur}from"viem";var mr=["https://hydration-rpc.n.dwellir.com","https://hydration.dotters.network","https://rpc.helikon.io/hydradx","https://hydration.ibp.network","https://rpc.cay.hydration.cloud","https://rpc.parm.hydration.cloud","https://rpc.roach.hydration.cloud","https://rpc.zipp.hydration.cloud","https://rpc.sin.hydration.cloud","https://rpc.coke.hydration.cloud"],Se=()=>ur({id:222222,name:"Hydration",network:"hydration",nativeCurrency:{decimals:18,name:"WETH",symbol:"WETH"},rpcUrls:{default:{http:mr}},blockExplorers:{default:{name:"Hydration Explorer",url:"https://hydration.subscan.io"}},testnet:!1});import{createPublicClient as je,createWalletClient as pr,custom as $e,http as dr}from"viem";var vt=class{client;chain;constructor(t){this.client=t,this.chain=Se()}get chainId(){return this.chain.id}get chainCurrency(){return this.chain.nativeCurrency.symbol}get chainDecimals(){return this.chain.nativeCurrency.decimals}getProvider(){return je({chain:this.chain,transport:dr()})}getWsProvider(){return je({transport:$e({request:({method:t,params:e})=>this.client._request(t,e||[])})})}getSigner(t){return pr({account:t,chain:this.chain,transport:$e(window.ethereum)})}};var rn={};w(rn,{LiquidityMiningApi:()=>Ot,LiquidityMiningClient:()=>At});import{AccountId as fr}from"polkadot-api";import E from"big.js";import{fixed_from_rational as nn}from"@galacticcouncil/math-liquidity-mining";var ee=class{result=new Map;getKey(t,e){return[e,t.toString()].join(",")}constructor(t,e){for(let n=0;n<t.length;++n){let[r,i]=t[n];this.result.set(this.getKey(i,r),e[n].free)}}freeBalance(t,e){return this.result.get(this.getKey(t,e))??0n}transfer(t,e,n,r){let i=this.getKey(t,e),s=this.getKey(t,n),a=this.result.get(i)??0n,o=this.result.get(s)??0n;if(a<r)throw new Error("Attempting to transfer more than is present");this.result.set(i,a+r),this.result.set(s,o+r)}};import et from"big.js";import{calculate_accumulated_rps as gr,calculate_global_farm_rewards as yr,calculate_loyalty_multiplier as br,calculate_user_reward as en,calculate_yield_farm_delta_rpvs as hr}from"@galacticcouncil/math-liquidity-mining";import Je from"big.js";var Te=Je(10).pow(18),Ze=BigInt(Je(1).pow(18).toString()),tn=6e3;var Pr="1000000000000000000",ne=class{constructor(t,e,n){this.getAccount=t;this.getAsset=e;this.multiCurrency=n}async syncGlobalFarm(t,e,n){if(t.state.type!=="Active"||t.updated_at===e)return null;if(t.total_shares_z===0n)return t;let r=await this.getAsset(t.reward_currency),i=e-t.updated_at,s=this.getAccount(t.id),a=r?.existential_deposit;if(!a)throw new Error("Missing reward currency asset list");let o=this.multiCurrency.freeBalance(t.reward_currency,s),l=et(a.toString()),c=et(o.toString()).minus(l.lt(o.toString())?a.toString():o.toString()),m=et(yr(t.total_shares_z.toString(),n.toString(),et(t.yield_per_period.toString()).mul(Te).round(0,et.roundDown).toFixed(),t.max_reward_per_period.toString(),i.toFixed()));if(c.lt(m)&&(m=c),m.eq(0))return t;let d=this.getAccount(0);return this.multiCurrency.transfer(t.reward_currency,s,d,BigInt(m.toFixed())),{...t,accumulated_rpz:BigInt(gr(t.accumulated_rpz.toString(),t.total_shares_z.toString(),m.toFixed()))}}syncYieldFarm(t,e,n){if(t.state.type!=="Active"||t.updated_at===n)return null;if(t.total_valued_shares===0n)return{...t,updated_at:n};let r=hr(t.accumulated_rpz.toString(),e.accumulated_rpz.toString(),t.multiplier.toString(),t.total_valued_shares.toString());return{...t,accumulated_rpvs:t.accumulated_rpvs+BigInt(r),updated_at:n}}getLoyaltyMultiplier(t,e){let n=et(1).mul(Te).round(0,et.roundDown).toString();if(!e)return n;let{initial_reward_percentage:r,scale_coef:i}=e;return br(t.toFixed(),r.toString(),i.toFixed())}async claimRewards(t,e,n,r,i){if(e.state.type==="Terminated")return null;let s=Math.floor(r/t.blocks_per_period);if(n.updated_at===s)return null;let a=await this.syncGlobalFarm(t,s,i);if(!a)return null;let o=this.syncYieldFarm(e,a,s);if(!o)return null;let l=o.total_stopped-n.stopped_at_creation,c=o.updated_at-n.entered_at-l,m=this.getLoyaltyMultiplier(c,o.loyalty_curve),d=BigInt(en(n.accumulated_rpvs.toString(),n.valued_shares.toString(),n.accumulated_claimed_rewards.toString(),o.accumulated_rpvs.toString(),m)),p=BigInt(en(n.accumulated_rpvs.toString(),n.valued_shares.toString(),n.accumulated_claimed_rewards.toString(),o.accumulated_rpvs.toString(),Pr));return{reward:d,maxReward:p,assetId:a.reward_currency}}};var Sr=E(365.2425).times(24).times(60).times(60),Ot=class{client;balanceClient;options;constructor(t,e,n={}){this.client=t,this.balanceClient=e,this.options=Object.freeze({blockTime:n.blockTime??tn})}get blockTime(){return this.options.blockTime}async getOraclePrice(t,e){let n=[t,e].sort((i,s)=>i-s);if(t===e)return Ze;let r=await this.client.getOraclePrice(n);if(r){let{n:i,d:s}=r[0].price,a;return t<e?a=nn(i.toString(),s.toString()):a=nn(s.toString(),i.toString()),BigInt(a)}}getFarmAddress=(t,e)=>{let n=Buffer.from("modl","utf-8"),r=Buffer.from(e?"78796b4c4d704944":"4f6d6e6957684c4d","hex"),i=Buffer.from([t]),s=Buffer.concat([n,r,i]),o="0x"+Buffer.concat([s,Buffer.alloc(32-s.length)]).toString("hex");return fr(63).dec(o)};getGlobalRewardPerPeriod(t,e,n,r){let i=E(r).times(t.toString()).times(e.toString()).div(18);return i.gte(n.toString())?n.toString():i.toString()}getPoolYieldPerPeriod(t,e,n,r){let i=E(t.toString()).times(e),s=E(n.toString()).times(r);return i.div(s.toString()).toString()}farmData(t,e,n){let{yieldFarm:r,globalFarm:i,priceAdjustment:s,balance:a,id:o}=t,{multiplier:l,loyalty_curve:c}=r,{blocks_per_period:m,yield_per_period:d,total_shares_z:p,max_reward_per_period:g,pending_rewards:b,accumulated_paid_rewards:y,planned_yielding_periods:h,updated_at:P,incentivized_asset:S,reward_currency:T,price_adjustment:C,min_deposit:q}=i,_=v.shiftNeg(s??C,18),D=v.shiftNeg(l,18),j=v.shiftNeg(c?.initial_reward_percentage??0,18),$=Sr.div(E(this.blockTime).div(1e3).times(m)).toString(),G;if(p<=0)G=E(D).times(d.toString()).times($).toString();else{let _n=this.getGlobalRewardPerPeriod(p,d,g,_),Rn=this.getPoolYieldPerPeriod(_n,D,p,_);G=E(Rn).times($).toString()}let W=b+y,ft=g*BigInt(h),Q=a.transferable+W,Ce=Q-W,Xt=E(Ce.toString()).div(g.toString()),Kt=E(e).div(m.toString()).toString(),zt=(p>=0?Xt.plus(P):Xt.plus(Kt)).toString(),oe=E(zt).times(m).toString(),An=E(p.toString()).div(E(g.toString()).div(d.toString())).div(Math.pow(10,18)).times(100).times(_).toFixed(2),De=E(W.toString()).div(Q.toString()).gte(.999);G=De?"0":E(G).div(n?2:1).times(100).toString();let Bn=j?E(G).times(j).toString():void 0;return{apr:G,minApr:Bn,isDistributed:De,estimatedEndPeriod:zt,estimatedEndBlock:oe,maxRewards:ft,incentivizedAsset:S,rewardCurrency:T,loyaltyCurve:c,currentPeriod:Kt,potMaxRewards:Q,fullness:An,yieldFarmId:r.id,globalFarmId:i.id,poolId:o,distributedRewards:W,plannedYieldingPeriods:h,minDeposit:q}}async getAllOmnipoolFarms(){let e=(await this.client.getAllOmnipooFarms()).reduce((r,i)=>r.includes(i.keyArgs[0].toString())?r:[...r,i.keyArgs[0].toString()],[]),n=await Promise.all(e.map(async r=>{let i=await this.getOmnipoolFarms(r);if(i)return[r,i]}));return Object.fromEntries(n.filter(r=>!!r))}async getOmnipoolFarms(t){let e=await this.client.getOmnipooFarms(Number(t)),n=await this.client.getRelayBlockNumber(),r=await Promise.all(e.map(async({keyArgs:i,value:s})=>{let[,a]=i,o=s,l=await this.client.getOmnipoolGlobalFarm(a),c=await this.client.getOmnipoolYieldFarm(Number(t),a,o);if(!l||!c)return;let m=l.reward_currency,d=l.incentivized_asset,p=this.getFarmAddress(a),g=await this.getOraclePrice(m,d),b=await this.balanceClient.getBalance(p,m);return{id:t,globalFarm:l,yieldFarm:c,priceAdjustment:g,balance:b}}));return n?r.map(i=>i?this.farmData(i,n):void 0):[]}async getAllIsolatedFarms(){let e=(await this.client.getAllIsolatedFarms()).reduce((r,i)=>r.includes(i.keyArgs[0].toString())?r:[...r,i.keyArgs[0].toString()],[]),n=await Promise.all(e.map(async r=>{let i=await this.getIsolatedFarms(r);if(i)return[r,i]}));return Object.fromEntries(n.filter(r=>!!r))}async getIsolatedFarms(t){let e=await this.client.getIsolatedFarms(t),n=await this.client.getRelayBlockNumber(),r=await Promise.all(e.map(async({keyArgs:i,value:s})=>{let[,a]=i,o=s,l=await this.client.getIsolatedGlobalFarm(a),c=await this.client.getIsolatedYieldFarm(t,a,o);if(!l||!c)return;let m=l.reward_currency,d=l.incentivized_asset,p=this.getFarmAddress(a,!0),g=await this.getOraclePrice(m,d),b=await this.balanceClient.getBalance(p,m);return{id:t,globalFarm:l,yieldFarm:c,priceAdjustment:g,balance:b,farmAddress:p}}));return n?r.map(i=>i?this.farmData(i,n,!0):void 0):[]}async getDepositReward(t,e,n,r){let i=e.global_farm_id,s=e.yield_farm_id,a=n?await this.client.getIsolatedYieldFarm(t,i,s):await this.client.getOmnipoolYieldFarm(Number(t),i,s),o=n?await this.client.getIsolatedGlobalFarm(i):await this.client.getOmnipoolGlobalFarm(i);if(!o||!a)return;let l=o.reward_currency,c=o.incentivized_asset,m=[[this.getFarmAddress(0,n),o.reward_currency],[this.getFarmAddress(o.id,n),o.reward_currency]],d=await this.getAccountAssetBalances(m),p=await this.getOraclePrice(l,c),g=new ee(m,d),y=await new ne(P=>this.getFarmAddress(P),P=>this.client.getAsset(P),g).claimRewards(o,a,e,r,p??o.price_adjustment);if(!y)return;let h=await this.client.getAsset(y.assetId);if(h&&!(y.reward<=h.existential_deposit))return y}async getAccountAssetBalances(t){let[e,n]=await Promise.all([Promise.all(t.filter(([i,s])=>s!==0).map(([i,s])=>this.balanceClient.getTokenBalance(i,s))),Promise.all(t.filter(([i,s])=>s===0).map(([i])=>this.balanceClient.getSystemBalance(i)))]),r=[];for(let i=0,s=0;i+s<t.length;){let a=i+s,[,o]=t[a];o===0?(r.push(n[s]),s+=1):(r.push(e[i]),i+=1)}return r}};import{Binary as Tr,Enum as wr}from"polkadot-api";var At=class extends R{omnipoolAssetIds=[];async getOraclePrice(t){return await this.api.query.EmaOracle.Oracles.getValue(Tr.fromText("omnipool"),t,wr("TenMinutes"))}async getRelayBlockNumber(){return(await this.api.query.ParachainSystem.ValidationData.getValue())?.relay_parent_number}async getAllOmnipooFarms(){return this.api.query.OmnipoolWarehouseLM.ActiveYieldFarm.getEntries()}async getOmnipooFarms(t){return this.api.query.OmnipoolWarehouseLM.ActiveYieldFarm.getEntries(t)}async getOmnipoolGlobalFarm(t){return this.api.query.OmnipoolWarehouseLM.GlobalFarm.getValue(t)}async getOmnipoolYieldFarm(t,e,n){return this.api.query.OmnipoolWarehouseLM.YieldFarm.getValue(t,e,n)}async getAllIsolatedFarms(){return this.api.query.XYKWarehouseLM.ActiveYieldFarm.getEntries()}async getIsolatedFarms(t){return this.api.query.XYKWarehouseLM.ActiveYieldFarm.getEntries(t)}async getIsolatedGlobalFarm(t){return this.api.query.XYKWarehouseLM.GlobalFarm.getValue(t)}async getIsolatedYieldFarm(t,e,n){return this.api.query.XYKWarehouseLM.YieldFarm.getValue(t,e,n)}async getAsset(t){return this.api.query.AssetRegistry.Assets.getValue(t)}};var gn={};w(gn,{PoolContextProvider:()=>pt,PoolError:()=>nt,PoolFactory:()=>mt,PoolType:()=>A,aave:()=>Ae,lbp:()=>xe,omni:()=>Ie,stable:()=>ve,xyk:()=>Oe});var xe={};w(xe,{LbpMath:()=>N,LbpPool:()=>Bt,LbpPoolClient:()=>Rt});import{calculate_in_given_out as xr,calculate_out_given_in as Ir,calculate_linear_weights as vr,calculate_pool_trade_fee as Or,get_spot_price as Ar}from"@galacticcouncil/math-lbp";var N=class{static getSpotPrice(t,e,n,r,i){return Ar(t,e,n,r,i)}static calculateInGivenOut(t,e,n,r,i){return xr(t,e,n,r,i)}static calculateOutGivenIn(t,e,n,r,i){return Ir(t,e,n,r,i)}static calculateLinearWeights(t,e,n,r,i){return vr(t,e,n,r,i)}static calculatePoolTradeFee(t,e,n){return Or(t,e,n)}};var A=(i=>(i.Aave="Aave",i.LBP="LBP",i.Omni="Omnipool",i.Stable="Stableswap",i.XYK="XYK",i))(A||{}),nt=(i=>(i.InsufficientTradingAmount="InsufficientTradingAmount",i.MaxInRatioExceeded="MaxInRatioExceeded",i.MaxOutRatioExceeded="MaxOutRatioExceeded",i.TradeNotAllowed="TradeNotAllowed",i.UnknownError="UnknownError",i))(nt||{});var{FeeUtils:an}=v,Bt=class u{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;fee;repayFeeApply;static fromPool(t){return new u(t.address,t.tokens,t.maxInRatio,t.maxOutRatio,t.minTradingLimit,t.fee,t.repayFeeApply)}constructor(t,e,n,r,i,s,a){this.type="LBP",this.address=t,this.tokens=e,this.maxInRatio=n,this.maxOutRatio=r,this.minTradingLimit=i,this.fee=s,this.repayFeeApply=a}validatePair(t,e){return!0}parsePair(t,e){let n=new Map(this.tokens.map(s=>[s.id,s])),r=n.get(t),i=n.get(e);if(r==null)throw new Error("Pool does not contain tokenIn");if(i==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,balanceIn:r.balance,balanceOut:i.balance,decimalsIn:r.decimals,decimalsOut:i.decimals,weightIn:r.weight,weightOut:i.weight}}validateAndBuy(t,e,n){let r=this.tokens[0].id,i=[];e<this.minTradingLimit&&i.push("InsufficientTradingAmount");let s=t.balanceOut/this.maxOutRatio;if(e>s&&i.push("MaxOutRatioExceeded"),r===t.assetOut){let a=this.calculateTradeFee(e,n),o=an.toPct(this.repayFeeApply?n.repayFee:n.exchangeFee),l=e+a,c=this.calculateInGivenOut(t,l),m=t.balanceIn/this.maxInRatio;return c>m&&i.push("MaxInRatioExceeded"),{amountIn:c,calculatedIn:c,amountOut:e,feePct:o,errors:i}}else{let a=this.calculateInGivenOut(t,e),o=t.balanceIn/this.maxInRatio;return a>o&&i.push("MaxInRatioExceeded"),{amountIn:a,calculatedIn:a,amountOut:e,feePct:0,errors:i}}}validateAndSell(t,e,n){let r=this.tokens[0].id,i=[];e<this.minTradingLimit&&i.push("InsufficientTradingAmount");let s=t.balanceIn/this.maxInRatio;if(e>s&&i.push("MaxInRatioExceeded"),r===t.assetIn){let a=this.calculateOutGivenIn(t,e),o=t.balanceOut/this.maxOutRatio;return a>o&&i.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:a,amountOut:a,feePct:0,errors:i}}else{let a=this.calculateOutGivenIn(t,e),o=this.calculateTradeFee(a,n),l=an.toPct(this.repayFeeApply?n.repayFee:n.exchangeFee),c=a-o,m=t.balanceOut/this.maxOutRatio;return c>m&&i.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:a,amountOut:c,feePct:l,errors:i}}}calculateInGivenOut(t,e){let n=N.calculateInGivenOut(t.balanceIn.toString(),t.balanceOut.toString(),t.weightIn.toString(),t.weightOut.toString(),e.toString()),r=BigInt(n);return r<0n?0n:r}calculateOutGivenIn(t,e){let n=N.calculateOutGivenIn(t.balanceIn.toString(),t.balanceOut.toString(),t.weightIn.toString(),t.weightOut.toString(),e.toString()),r=BigInt(n);return r<0n?0n:r}spotPriceInGivenOut(t){let e=N.getSpotPrice(t.balanceOut.toString(),t.balanceIn.toString(),t.weightOut.toString(),t.weightIn.toString(),this.maxOutRatio.toString());return BigInt(e)}spotPriceOutGivenIn(t){let e=N.getSpotPrice(t.balanceIn.toString(),t.balanceOut.toString(),t.weightIn.toString(),t.weightOut.toString(),this.maxInRatio.toString());return BigInt(e)}calculateTradeFee(t,e){let n=N.calculatePoolTradeFee(t.toString(),this.repayFeeApply?e.repayFee[0]:e.exchangeFee[0],this.repayFeeApply?e.repayFee[1]:e.exchangeFee[1]);return BigInt(n)}};import{CompatibilityLevel as Cr}from"polkadot-api";import{map as Dr,of as un,switchMap as Mr}from"rxjs";import{memoize1 as Br}from"@thi.ng/memoize";import{combineLatest as sn,combineLatestAll as _r,debounceTime as Rr,firstValueFrom as Fr,from as on,map as ln,mergeAll as Er,of as kr,switchMap as cn}from"rxjs";var we=[{inputs:[],name:"decimals",outputs:[{internalType:"uint8",name:"",type:"uint8"}],stateMutability:"view",type:"function"},{inputs:[],name:"description",outputs:[{internalType:"string",name:"",type:"string"}],stateMutability:"view",type:"function"},{inputs:[],name:"version",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"uint80",name:"_roundId",type:"uint80"}],name:"getRoundData",outputs:[{internalType:"uint80",name:"roundId",type:"uint80"},{internalType:"int256",name:"answer",type:"int256"},{internalType:"uint256",name:"startedAt",type:"uint256"},{internalType:"uint256",name:"updatedAt",type:"uint256"},{internalType:"uint80",name:"answeredInRound",type:"uint80"}],stateMutability:"view",type:"function"},{inputs:[],name:"latestRoundData",outputs:[{internalType:"uint80",name:"roundId",type:"uint80"},{internalType:"int256",name:"answer",type:"int256"},{internalType:"uint256",name:"startedAt",type:"uint256"},{internalType:"uint256",name:"updatedAt",type:"uint256"},{internalType:"uint80",name:"answeredInRound",type:"uint80"}],stateMutability:"view",type:"function"}];var _t=class{client;constructor(t){this.client=t.getWsProvider()}async getData(t,e=6){let[n,r,i]=await Promise.all([this.client.readContract({abi:we,address:t,functionName:"latestRoundData"}),this.client.readContract({abi:we,address:t,functionName:"decimals"}),this.client.getBlock()]),[s,a,o,l]=n,c=i.number-(i.timestamp-l)/BigInt(e),m=Number(c);return{price:a,decimals:r,updatedAt:m<0?0:m}}};var M=class extends U{evm;mmOracle;override=[];mem=0;memPools=Br(t=>(this.log(this.getPoolType(),"mem pools",t,"\u2705"),this.loadPools()));constructor(t,e){super(t),this.evm=e,this.mmOracle=new _t(e)}async withOverride(t){this.override=t||[]}async getPoolsMem(){return this.memPools(this.mem)}async getPools(){let t=on(this.getPoolsMem()).pipe(cn(e=>this.subscribe(e)),_r());return Fr(t)}getSubscriber(){return on(this.getPoolsMem()).pipe(cn(t=>this.subscribe(t)),Er())}subscribe(t){return t.filter(e=>this.hasValidAssets(e)).map(e=>sn([this.subscribePoolChange(e),this.subscribePoolBalance(e)]).pipe(Rr(250),ln(([n,r])=>this.updatePool(n,r))))}subscribePoolBalance(t){if(t.type==="Aave")return kr([]);let e=[this.subscribeTokensBalance(t.address)];if(this.hasSystemAsset(t)){let n=this.subscribeSystemBalance(t.address);e.push(n)}if(this.hasErc20Asset(t)){let n=t.tokens.filter(i=>i.type==="Erc20").map(i=>i.id),r=this.subscribeErc20Balance(t.address,n);e.push(r)}return sn(e).pipe(ln(n=>n.map(r=>Array.isArray(r)?r:[r]).flat()))}hasSystemAsset(t){return t.tokens.some(e=>e.id===0)}hasErc20Asset(t){return t.tokens.some(e=>e.type==="Erc20")}hasValidAssets(t){return t.tokens.every(({id:e,decimals:n,balance:r})=>{let i=this.override.find(a=>a.id===e),s=!!n||!!i?.decimals;return r>0n&&s})}updatePool=(t,e)=>{let n=t.tokens.map(r=>{let i=e.find(a=>a.id===r.id),s=this.override.find(a=>a.id===r.id);return i?{...r,balance:i.balance.transferable,decimals:r.decimals||s?.decimals}:{...r,decimals:r.decimals||s?.decimals}});return{...t,tokens:n}}};var Rt=class extends M{MAX_FINAL_WEIGHT=100000000n;poolsData=new Map([]);async loadPools(){let[t,e,n]=await Promise.all([this.api.query.LBP.PoolData.getEntries(),this.api.query.ParachainSystem.ValidationData.getValue(),this.getPoolLimits()]),r=e?.relay_parent_number||0,i=t.filter(({value:s})=>e&&this.isActivePool(s,r)).map(async({keyArgs:s,value:a})=>{let[o]=s,l=o.toString(),c=await this.getPoolDelta(l,a,r);return{address:l,type:"LBP",fee:a.fee,...c,...n}});return Promise.all(i)}async getPoolDelta(t,e,n){let{start:r,end:i,assets:s,initial_weight:a,final_weight:o,repay_target:l,fee_collector:c}=e,m=N.calculateLinearWeights(r?r.toString():"0",i?i.toString():"0",a.toString(),o.toString(),n.toString()),[d,p]=s,g=BigInt(m),b=this.MAX_FINAL_WEIGHT-BigInt(g),[y,h,P,S,T]=await Promise.all([this.isRepayFeeApplied(d,l,c.toString()),this.getBalance(t,d),this.api.query.AssetRegistry.Assets.getValue(d),this.getBalance(t,p),this.api.query.AssetRegistry.Assets.getValue(p)]);return{repayFeeApply:y,tokens:[{id:d,decimals:P?.decimals,existentialDeposit:P?.existential_deposit,balance:h.transferable,weight:g,type:P?.asset_type.type},{id:p,decimals:T?.decimals,existentialDeposit:T?.existential_deposit,balance:S.transferable,weight:b,type:T?.asset_type.type}]}}isActivePool(t,e){let{start:n,end:r}=t;return n&&r?e>=n&&e<r:!1}async isRepayFeeApplied(t,e,n){if(e===0n)return!1;try{return(await this.getBalance(n,t)).transferable<e}catch{return!0}}async getRepayFee(){return await this.api.constants.LBP.repay_fee()}async getPoolLimits(){let[t,e,n]=await Promise.all([this.api.constants.LBP.MaxInRatio(),this.api.constants.LBP.MaxOutRatio(),this.api.constants.LBP.MinTradingLimit()]);return{maxInRatio:t,maxOutRatio:e,minTradingLimit:n}}async getPoolFees(t){return{repayFee:await this.getRepayFee(),exchangeFee:t.fee}}getPoolType(){return"LBP"}async isSupported(){let t=this.api.query.LBP.PoolData,e=await this.api.compatibilityToken;return t.isCompatible(Cr.BackwardsCompatible,e)}subscribePoolChange(t){let e=this.api.query.ParachainSystem.ValidationData,n=this.poolsData.get(t.address);return n?e.watchValue("best").pipe(Mr(r=>r?this.getPoolDelta(t.address,n,r.relay_parent_number):un(t)),Dr(r=>Object.assign({},t,r))):un(t)}};var Ie={};w(Ie,{OmniMath:()=>x,OmniPool:()=>Ft,OmniPoolClient:()=>Et});import{calculate_in_given_out as Lr,calculate_lrna_in_given_out as qr,calculate_out_given_in as Nr,calculate_out_given_lrna_in as Gr,calculate_spot_price as Ur,calculate_lrna_spot_price as Hr,calculate_shares as Vr,calculate_liquidity_out as Wr,calculate_liquidity_lrna_out as Yr,verify_asset_cap as Xr,calculate_liquidity_hub_in as Kr,is_sell_allowed as zr,is_buy_allowed as jr,is_add_liquidity_allowed as $r,is_remove_liquidity_allowed as Qr}from"@galacticcouncil/math-omnipool";import ct from"big.js";var x=class{static calculateSpotPrice(t,e,n,r){return Ur(t,e,n,r)}static calculateLrnaSpotPrice(t,e){return Hr(t,e)}static calculateInGivenOut(t,e,n,r,i,s,a,o,l){return Lr(t,e,n,r,i,s,a,o,l)}static calculateLrnaInGivenOut(t,e,n,r,i){return qr(t,e,n,r,i)}static calculateOutGivenIn(t,e,n,r,i,s,a,o,l){return Nr(t,e,n,r,i,s,a,o,l)}static calculateOutGivenLrnaIn(t,e,n,r,i){return Gr(t,e,n,r,i)}static calculateShares(t,e,n,r){return Vr(t,e,n,r)}static calculateLiquidityOut(t,e,n,r,i,s,a,o){return Wr(t,e,n,r,i,s,a,o)}static calculateLiquidityLRNAOut(t,e,n,r,i,s,a,o){return Yr(t,e,n,r,i,s,a,o)}static calculateCapDifference(t,e,n,r){let i=ct(e),s=ct(t),a=ct(r),o=ct(n),l=ct(10).pow(18),c=o.div(l);if(i.div(a).lt(c)){let d=c.times(a).minus(i).times(s),p=i.times(ct(1).minus(c));return d.div(p).toFixed(0)}else return"0"}static verifyAssetCap(t,e,n,r){return Xr(t,e,n,r)}static calculateLimitHubIn(t,e,n,r){return Kr(t,e,n,r)}static isSellAllowed(t){return zr(t)}static isBuyAllowed(t){return jr(t)}static isAddLiquidityAllowed(t){return $r(t)}static isRemoveLiquidityAllowed(t){return Qr(t)}};var{FeeUtils:ut}=v,Ft=class u{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;hubAssetId;static fromPool(t){return new u(t.address,t.tokens,t.maxInRatio,t.maxOutRatio,t.minTradingLimit,t.hubAssetId)}constructor(t,e,n,r,i,s){this.type="Omnipool",this.address=t,this.tokens=e,this.maxInRatio=n,this.maxOutRatio=r,this.minTradingLimit=i,this.hubAssetId=s}validatePair(t,e){return this.hubAssetId!=e}parsePair(t,e){let n=new Map(this.tokens.map(s=>[s.id,s])),r=n.get(t),i=n.get(e);if(r==null)throw new Error("Pool does not contain tokenIn");if(i==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,hubReservesIn:r.hubReserves,hubReservesOut:i.hubReserves,sharesIn:r.shares,sharesOut:i.shares,decimalsIn:r.decimals,decimalsOut:i.decimals,balanceIn:r.balance,balanceOut:i.balance,tradeableIn:r.tradeable,tradeableOut:i.tradeable,assetInEd:r.existentialDeposit,assetOutEd:i.existentialDeposit}}validateAndBuy(t,e,n){let r=this.calculateInGivenOut(t,e),i=this.calculateInGivenOut(t,e,n),s=r===0n?0:O.calculateDiffToRef(i,r),a=[],o=x.isSellAllowed(t.tradeableIn),l=x.isBuyAllowed(t.tradeableOut);(!o||!l)&&a.push("TradeNotAllowed"),(e<this.minTradingLimit||r<t.assetInEd)&&a.push("InsufficientTradingAmount");let c=t.balanceOut/this.maxOutRatio;e>c&&a.push("MaxOutRatioExceeded");let m=t.balanceIn/this.maxInRatio;return i>m&&a.push("MaxInRatioExceeded"),{amountIn:i,calculatedIn:r,amountOut:e,feePct:s,errors:a}}validateAndSell(t,e,n){let r=this.calculateOutGivenIn(t,e),i=this.calculateOutGivenIn(t,e,n),s=O.calculateDiffToRef(r,i),a=[],o=x.isSellAllowed(t.tradeableIn),l=x.isBuyAllowed(t.tradeableOut);(!o||!l)&&a.push("TradeNotAllowed"),(e<this.minTradingLimit||r<t.assetOutEd)&&a.push("InsufficientTradingAmount");let c=t.balanceIn/this.maxInRatio;e>c&&a.push("MaxInRatioExceeded");let m=t.balanceOut/this.maxOutRatio;return i>m&&a.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:r,amountOut:i,feePct:s,errors:a}}calculateInGivenOut(t,e,n){if(t.assetIn==this.hubAssetId)return this.calculateLrnaInGivenOut(t,e,n);let r=x.calculateInGivenOut(t.balanceIn.toString(),t.hubReservesIn.toString(),t.sharesIn.toString(),t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),n?ut.toRaw(n.assetFee).toString():"0",n?ut.toRaw(n.protocolFee).toString():"0"),i=BigInt(r);return i<0n?0n:i}calculateLrnaInGivenOut(t,e,n){let r=x.calculateLrnaInGivenOut(t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),n?ut.toRaw(n.assetFee).toString():"0"),i=BigInt(r);return i<0n?0n:i}calculateOutGivenIn(t,e,n){if(t.assetIn==this.hubAssetId)return this.calculateOutGivenLrnaIn(t,e,n);let r=x.calculateOutGivenIn(t.balanceIn.toString(),t.hubReservesIn.toString(),t.sharesIn.toString(),t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),n?ut.toRaw(n.assetFee).toString():"0",n?ut.toRaw(n.protocolFee).toString():"0"),i=BigInt(r);return i<0n?0n:i}calculateOutGivenLrnaIn(t,e,n){let r=x.calculateOutGivenLrnaIn(t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),n?ut.toRaw(n.assetFee).toString():"0"),i=BigInt(r);return i<0n?0n:i}spotPriceInGivenOut(t){if(t.assetIn==this.hubAssetId)return this.spotPriceLrnaInGivenOut(t);let e=x.calculateSpotPrice(t.balanceOut.toString(),t.hubReservesOut.toString(),t.balanceIn.toString(),t.hubReservesIn.toString()),n=Math.pow(10,18-t.decimalsOut);return BigInt(e)/BigInt(n)}spotPriceLrnaInGivenOut(t){let e=x.calculateLrnaSpotPrice(t.hubReservesOut.toString(),t.balanceOut.toString()),n=Math.pow(10,18-t.decimalsOut);return BigInt(e)/BigInt(n)}spotPriceOutGivenIn(t){if(t.assetIn==this.hubAssetId)return this.spotPriceOutGivenLrnaIn(t);let e=x.calculateSpotPrice(t.balanceIn.toString(),t.hubReservesIn.toString(),t.balanceOut.toString(),t.hubReservesOut.toString()),n=Math.pow(10,18-t.decimalsIn);return BigInt(e)/BigInt(n)}spotPriceOutGivenLrnaIn(t){let e=x.calculateLrnaSpotPrice(t.balanceOut.toString(),t.hubReservesOut.toString()),n=Math.pow(10,18-t.decimalsIn);return BigInt(e)/BigInt(n)}};import{AccountId as Jr,CompatibilityLevel as Zr}from"polkadot-api";import{toHex as ti}from"@polkadot-api/utils";import{distinctUntilChanged as ei,map as mn}from"rxjs";var{FeeUtils:K}=v,Et=class extends M{async loadPools(){let t=await this.api.constants.Omnipool.HubAssetId(),e=this.getPoolAddress(),[n,r,i,s,a]=await Promise.all([this.api.query.Omnipool.Assets.getEntries(),this.api.query.Omnipool.HubAssetTradability.getValue(),this.api.query.AssetRegistry.Assets.getValue(t),this.getBalance(e,t),this.getPoolLimits()]),o=n.map(async({keyArgs:c,value:m})=>{let[d]=c,{hub_reserve:p,shares:g,tradable:b,cap:y,protocol_shares:h}=m,[P,S]=await Promise.all([this.api.query.AssetRegistry.Assets.getValue(d),this.getBalance(e,d)]);return{id:d,decimals:P?.decimals,existentialDeposit:P?.existential_deposit,balance:S.transferable,cap:y,hubReserves:p,protocolShares:h,shares:g,tradeable:b,type:P?.asset_type.type}}),l=await Promise.all(o);return l.push({id:t,decimals:i?.decimals,existentialDeposit:i?.existential_deposit,balance:s.transferable,tradeable:r,type:i?.asset_type.type}),[{address:e,type:"Omnipool",hubAssetId:t,tokens:l,...a}]}getPoolAddress(){let t="modlomnipool".padEnd(32,"\0"),e=new TextEncoder().encode(t),n=ti(e);return Jr(63).dec(n)}async getPoolLimits(){let[t,e,n]=await Promise.all([this.api.constants.Omnipool.MaxInRatio(),this.api.constants.Omnipool.MaxOutRatio(),this.api.constants.Omnipool.MinimumTradingLimit()]);return{maxInRatio:t,maxOutRatio:e,minTradingLimit:n}}async getPoolFees(t,e){let[n,r,i]=await Promise.all([this.api.constants.DynamicFees.AssetFeeParameters(),this.api.constants.DynamicFees.ProtocolFeeParameters(),this.api.query.DynamicFees.AssetFee.getValue(e)]),s=n.min_fee+r.min_fee,a=n.max_fee+r.max_fee;if(i){let{asset_fee:o,protocol_fee:l}=i;return{assetFee:K.fromPermill(o),protocolFee:K.fromPermill(l),min:K.fromPermill(s),max:K.fromPermill(a)}}else return{assetFee:K.fromPermill(n.min_fee),protocolFee:K.fromPermill(r.min_fee),min:K.fromPermill(s),max:K.fromPermill(a)}}getPoolType(){return"Omnipool"}async isSupported(){let t=this.api.query.Omnipool.Assets,e=await this.api.compatibilityToken;return t.isCompatible(Zr.BackwardsCompatible,e)}subscribePoolChange(t){return this.api.query.Omnipool.Assets.watchEntries({at:"best"}).pipe(ei((n,r)=>!r.deltas),mn(({entries:n})=>n.map(r=>{let[i]=r.args,{hub_reserve:s,shares:a,tradable:o,cap:l,protocol_shares:c}=r.value,m=t.tokens.findIndex(p=>p.id===i);return{...t.tokens[m],cap:l,hubReserves:s,protocolShares:c,shares:a,tradeable:o}})),mn(n=>{let r=t.tokens.find(i=>i.id===1);return{...t,tokens:[...n,r]}}))}};var ve={};w(ve,{StableMath:()=>B,StableSwap:()=>kt,StableSwapClient:()=>Ct});import{calculate_in_given_out as ni,calculate_out_given_in as ri,calculate_amplification as ii,calculate_add_one_asset as ai,calculate_liquidity_out_one_asset as si,calculate_shares as oi,calculate_shares_for_amount as li,calculate_spot_price_with_fee as ci,pool_account_name as ui,recalculate_peg as mi}from"@galacticcouncil/math-stableswap";var B=class{static getPoolAddress(t){return ui(t)}static defaultPegs(t){let e=[];for(let n=0;n<t;n++)e.push(["1","1"]);return e}static calculateAmplification(t,e,n,r,i){return ii(t,e,n,r,i)}static calculateInGivenOut(t,e,n,r,i,s,a){return ni(t,e,n,r,i,s,a)}static calculateAddOneAsset(t,e,n,r,i,s,a){return ai(t,e,n,r,i,s,a)}static calculateSharesForAmount(t,e,n,r,i,s,a){return li(t,e,n,r,i,s,a)}static calculateOutGivenIn(t,e,n,r,i,s,a){return ri(t,e,n,r,i,s,a)}static calculateLiquidityOutOneAsset(t,e,n,r,i,s,a){return si(t,e,n,r,i,s,a)}static calculateShares(t,e,n,r,i,s){return oi(t,e,n,r,i,s)}static calculateSpotPriceWithFee(t,e,n,r,i,s,a,o){return ci(t,e,n,r,i,s,a,o)}static recalculatePegs(t,e,n,r,i){let s=mi(t,e,n,r,i);return JSON.parse(s)}};var{FeeUtils:z}=v,kt=class u{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;amplification;id;fee;totalIssuance;static fromPool(t){return new u(t.address,t.tokens,t.maxInRatio,t.maxOutRatio,t.minTradingLimit,t.amplification,t.id,t.fee,t.totalIssuance)}constructor(t,e,n,r,i,s,a,o,l){this.type="Stableswap",this.address=t,this.tokens=e,this.maxInRatio=n,this.maxOutRatio=r,this.minTradingLimit=i,this.amplification=s,this.id=a,this.fee=o,this.totalIssuance=l}validatePair(t,e){return!0}parsePair(t,e){let n=new Map(this.tokens.map(s=>[s.id,s])),r=n.get(t),i=n.get(e);if(r==null)throw new Error("Pool does not contain tokenIn");if(i==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,balanceIn:r.balance,balanceOut:i.balance,decimalsIn:r.decimals,decimalsOut:i.decimals,tradeableIn:this.id===t?15:r.tradeable,tradeableOut:this.id===e?15:i.tradeable,assetInEd:r.existentialDeposit,assetOutEd:i.existentialDeposit}}validateAndBuy(t,e,n){let r=this.calculateInGivenOut(t,e),i=this.calculateInGivenOut(t,e,n),s=z.toPct(n.fee),a=[],o=x.isSellAllowed(t.tradeableIn),l=x.isBuyAllowed(t.tradeableOut);return(!o||!l)&&a.push("TradeNotAllowed"),(e<this.minTradingLimit||r<t.assetInEd)&&a.push("InsufficientTradingAmount"),{amountIn:i,calculatedIn:r,amountOut:e,feePct:s,errors:a}}validateAndSell(t,e,n){let r=this.calculateOutGivenIn(t,e),i=this.calculateOutGivenIn(t,e,n),s=z.toPct(n.fee),a=[],o=x.isSellAllowed(t.tradeableIn),l=x.isBuyAllowed(t.tradeableOut);return(!o||!l)&&a.push("TradeNotAllowed"),(e<this.minTradingLimit||r<t.assetOutEd)&&a.push("InsufficientTradingAmount"),{amountIn:e,calculatedOut:r,amountOut:i,feePct:s,errors:a}}calculateIn(t,e,n){let r=B.calculateInGivenOut(this.getReserves(),Number(t.assetIn),Number(t.assetOut),e.toString(),this.amplification.toString(),n?z.toRaw(n.fee).toString():"0",this.getPegs()),i=BigInt(r);return i<0n?0n:i}calculateAddOneAsset(t,e,n){let r=B.calculateAddOneAsset(this.getReserves(),e.toString(),Number(t.assetIn),this.amplification.toString(),this.totalIssuance.toString(),n?z.toRaw(n.fee).toString():"0",this.getPegs()),i=BigInt(r);return i<0n?0n:i}calculateSharesForAmount(t,e,n){let r=B.calculateSharesForAmount(this.getReserves(),Number(t.assetOut),e.toString(),this.amplification.toString(),this.totalIssuance.toString(),n?z.toRaw(n.fee).toString():"0",this.getPegs()),i=BigInt(r);return i<0n?0n:i}calculateInGivenOut(t,e,n){return t.assetOut==this.id?this.calculateAddOneAsset(t,e,n):t.assetIn==this.id?this.calculateSharesForAmount(t,e,n):this.calculateIn(t,e,n)}spotPriceInGivenOut(t){let e=B.calculateSpotPriceWithFee(this.id.toString(),this.getReserves(),this.amplification.toString(),t.assetOut.toString(),t.assetIn.toString(),this.totalIssuance.toString(),"0",this.getPegs());if(t.assetOut==this.id)return BigInt(e);if(t.assetIn==this.id){let r=Math.pow(10,t.decimalsIn-t.decimalsOut);return BigInt(e)/BigInt(r)}let n=Math.pow(10,18-t.decimalsIn);return BigInt(e)/BigInt(n)}calculateOut(t,e,n){let r=B.calculateOutGivenIn(this.getReserves(),Number(t.assetIn),Number(t.assetOut),e.toString(),this.amplification.toString(),n?z.toRaw(n.fee).toString():"0",this.getPegs()),i=BigInt(r);return i<0n?0n:i}calculateWithdrawOneAsset(t,e,n){let r=B.calculateLiquidityOutOneAsset(this.getReserves(),e.toString(),Number(t.assetOut),this.amplification.toString(),this.totalIssuance.toString(),n?z.toRaw(n.fee).toString():"0",this.getPegs()),i=BigInt(r);return i<0n?0n:i}calculateShares(t,e,n){let r=B.calculateShares(this.getReserves(),this.getAssets(t.assetIn,e),this.amplification.toString(),this.totalIssuance.toString(),n?z.toRaw(n.fee).toString():"0",this.getPegs()),i=BigInt(r);return i<0n?0n:i}calculateOutGivenIn(t,e,n){return t.assetIn==this.id?this.calculateWithdrawOneAsset(t,e,n):t.assetOut==this.id?this.calculateShares(t,e,n):this.calculateOut(t,e,n)}spotPriceOutGivenIn(t){let e=B.calculateSpotPriceWithFee(this.id.toString(),this.getReserves(),this.amplification.toString(),t.assetIn.toString(),t.assetOut.toString(),this.totalIssuance.toString(),"0",this.getPegs());if(t.assetIn==this.id)return BigInt(e);if(t.assetOut==this.id){let r=Math.pow(10,t.decimalsOut-t.decimalsIn);return BigInt(e)/BigInt(r)}let n=Math.pow(10,18-t.decimalsOut);return BigInt(e)/BigInt(n)}getPegs(){let t=B.defaultPegs(this.tokens.length-1);return JSON.stringify(t)}getReserves(){let t=this.tokens.filter(e=>e.id!=this.id).map(({id:e,balance:n,decimals:r})=>({asset_id:e,amount:n,decimals:r}));return JSON.stringify(t,Z.jsonFormatter)}getAssets(t,e){let n={asset_id:Number(t),amount:e.toString()};return JSON.stringify([n],Z.jsonFormatter)}};import{AccountId as pi,CompatibilityLevel as di}from"polkadot-api";import{toHex as gi}from"@polkadot-api/utils";import{blake2b as yi}from"@noble/hashes/blake2b";import{map as bi,of as hi,switchMap as Pi}from"rxjs";var{FeeUtils:rt}=v,Ct=class extends M{poolsData=new Map([]);getPoolType(){return"Stableswap"}getPoolAddress(t){let e=B.getPoolAddress(t),n=yi(e,{dkLen:32}),r=gi(n);return pi(63).dec(r)}async getPoolLimits(){return{maxInRatio:0n,maxOutRatio:0n,minTradingLimit:await this.api.constants.Stableswap.MinTradingLimit()}}async getPoolDelta(t,e,n){let{initial_amplification:r,final_amplification:i,initial_block:s,final_block:a}=e,o=B.calculateAmplification(r.toString(),i.toString(),s.toString(),a.toString(),n.toString()),l=await this.api.query.Tokens.TotalIssuance.getValue(t);return{amplification:BigInt(o),totalIssuance:l}}async getPoolTokens(t,e){let n=this.getPoolAddress(t),r=e.assets.map(async i=>{let[s,a,o]=await Promise.all([this.api.query.Stableswap.AssetTradability.getValue(t,i),this.api.query.AssetRegistry.Assets.getValue(i),this.getBalance(n,i)]);return{id:i,decimals:a?.decimals,existentialDeposit:a?.existential_deposit,balance:o.transferable,tradeable:s,type:a?.asset_type.type}});return Promise.all(r)}async isSupported(){let t=this.api.query.Stableswap.Pools,e=await this.api.compatibilityToken;return t.isCompatible(di.BackwardsCompatible,e)}async loadPools(){let[t,e,n]=await Promise.all([this.api.query.Stableswap.Pools.getEntries(),this.api.query.System.Number.getValue(),this.getPoolLimits()]),r=t.map(async({keyArgs:i,value:s})=>{let[a]=i,o=this.getPoolAddress(a),[l,c,m]=await Promise.all([this.getPoolDelta(a,s,e),this.getPoolTokens(a,s),this.getPoolPegs(a,s,e)]);return c.push({id:a,tradeable:15,balance:l.totalIssuance,decimals:18}),this.poolsData.set(o,s),{address:o,id:a,type:"Stableswap",fee:rt.fromPermill(s.fee),tokens:c,...l,...m,...n}});return Promise.all(r)}async getPoolFees(t){return{fee:t.fee}}async getPoolPegs(t,e,n){let r=await this.api.query.Stableswap.PoolPegs.getValue(t);if(!r)return this.getDefaultPegs(e);let i=await this.getLatestPegs(e,r,n),s=this.getRecentPegs(r),a=rt.fromPermill(r.max_peg_update),o=rt.fromPermill(e.fee),[l,c]=B.recalculatePegs(JSON.stringify(s),JSON.stringify(i),n.toString(),rt.toRaw(a).toString(),rt.toRaw(o).toString()),m=Number(l)*1e6;return{pegsFee:rt.fromPermill(m),pegs:c}}getDefaultPegs(t){let e=t.fee,n=B.defaultPegs(t.assets.length);return{pegsFee:rt.fromPermill(e),pegs:n}}getRecentPegs(t){let{current:e}=t;return Array.from(e.entries()).map(([n,r])=>r.map(i=>i.toString()))}async getLatestPegs(t,e,n){let{source:r}=e,i=Array.from(t.assets.entries()).map(([a,o])=>o),s=r.map(async(a,o)=>{if(a.type==="Oracle"){let[l,c,m]=a.value,d=[m,i[o]].sort((P,S)=>P-S),p=await this.api.query.EmaOracle.Oracles.getValue(l,d,c);if(!p)return;let[{price:g,updated_at:b}]=p,y=g.n.toString(),h=g.d.toString();return m.toString()===d[0].toString()?[[y,h],b.toString()]:[[h,y],b.toString()]}else if(a.type==="MMOracle"){let l=a.value.asHex(),{price:c,decimals:m,updatedAt:d}=await this.mmOracle.getData(l),p=10**m;return[[c.toString(),p.toString()],d.toString()]}else return[a.value.map(l=>l.toString()),n.toString()]});return Promise.all(s)}subscribePoolChange(t){let e=this.api.query.System.Number,n=this.poolsData.get(t.address);return!n||!t.id?hi(t):e.watchValue("best").pipe(Pi(r=>Promise.all([this.getPoolDelta(t.id,n,r),this.getPoolPegs(t.id,n,r)])),bi(([r,i])=>{let s=t.tokens.map(a=>a.id===t.id?{...a,balance:r.totalIssuance}:a);return Object.assign(t,{tokens:s},r,i)}))}};var Oe={};w(Oe,{XykMath:()=>V,XykPool:()=>Dt,XykPoolClient:()=>Mt});import{calculate_in_given_out as fi,calculate_out_given_in as Si,calculate_pool_trade_fee as Ti,get_spot_price as wi,calculate_liquidity_in as xi,calculate_shares as Ii,calculate_spot_price as vi,calculate_spot_price_with_fee as Oi,calculate_liquidity_out_asset_a as Ai,calculate_liquidity_out_asset_b as Bi}from"@galacticcouncil/math-xyk";var V=class{static getSpotPrice(t,e,n){return wi(t,e,n)}static calculateInGivenOut(t,e,n){return fi(t,e,n)}static calculateOutGivenIn(t,e,n){return Si(t,e,n)}static calculatePoolTradeFee(t,e,n){return Ti(t,e,n)}static calculateLiquidityIn(t,e,n){return xi(t,e,n)}static calculateSpotPrice(t,e){return vi(t,e)}static calculateSpotPriceWithFee(t,e,n,r){return Oi(t,e,n,r)}static calculateShares(t,e,n){return Ii(t,e,n)}static calculateLiquidityOutAssetA(t,e,n,r){return Ai(t,e,n,r)}static calculateLiquidityOutAssetB(t,e,n,r){return Bi(t,e,n,r)}};var{FeeUtils:pn}=v,Dt=class u{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;static fromPool(t){return new u(t.address,t.tokens,t.maxInRatio,t.maxOutRatio,t.minTradingLimit)}constructor(t,e,n,r,i){this.type="XYK",this.address=t,this.tokens=e,this.maxInRatio=n,this.maxOutRatio=r,this.minTradingLimit=i}validatePair(t,e){return!0}parsePair(t,e){let n=new Map(this.tokens.map(s=>[s.id,s])),r=n.get(t),i=n.get(e);if(r==null)throw new Error("Pool does not contain tokenIn");if(i==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,decimalsIn:r.decimals,decimalsOut:i.decimals,balanceIn:r.balance,balanceOut:i.balance,assetInEd:r.existentialDeposit,assetOutEd:i.existentialDeposit}}validateAndBuy(t,e,n){let r=this.calculateInGivenOut(t,e),i=this.calculateTradeFee(r,n),s=pn.toPct(n.exchangeFee),a=r+i,o=[];(e<this.minTradingLimit||r<t.assetInEd)&&o.push("InsufficientTradingAmount");let l=t.balanceOut/this.maxOutRatio;e>l&&o.push("MaxOutRatioExceeded");let c=t.balanceIn/this.maxInRatio;return a>c&&o.push("MaxInRatioExceeded"),{amountIn:a,calculatedIn:r,amountOut:e,feePct:s,errors:o}}validateAndSell(t,e,n){let r=this.calculateOutGivenIn(t,e),i=this.calculateTradeFee(r,n),s=pn.toPct(n.exchangeFee),a=r-i,o=[];(e<this.minTradingLimit||r<t.assetOutEd)&&o.push("InsufficientTradingAmount");let l=t.balanceIn/this.maxInRatio;e>l&&o.push("MaxInRatioExceeded");let c=t.balanceOut/this.maxOutRatio;return a>c&&o.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:r,amountOut:a,feePct:s,errors:o}}calculateInGivenOut(t,e){let n=V.calculateInGivenOut(t.balanceIn.toString(),t.balanceOut.toString(),e.toString()),r=BigInt(n);return r<0n?0n:r}calculateOutGivenIn(t,e){let n=V.calculateOutGivenIn(t.balanceIn.toString(),t.balanceOut.toString(),e.toString()),r=BigInt(n);return r<0n?0n:r}spotPriceInGivenOut(t){let e=V.calculateSpotPrice(t.balanceOut.toString(),t.balanceIn.toString()),n=Math.pow(10,18-t.decimalsOut);return BigInt(e)/BigInt(n)}spotPriceOutGivenIn(t){let e=V.calculateSpotPrice(t.balanceIn.toString(),t.balanceOut.toString()),n=Math.pow(10,18-t.decimalsIn);return BigInt(e)/BigInt(n)}calculateTradeFee(t,e){let n=V.calculatePoolTradeFee(t.toString(),e.exchangeFee[0],e.exchangeFee[1]);return BigInt(n)}};import{CompatibilityLevel as _i}from"polkadot-api";import{of as Ri}from"rxjs";var Mt=class extends M{async loadPools(){let t=this.api.query.XYK.PoolAssets,[e,n]=await Promise.all([t.getEntries(),this.getPoolLimits()]),r=e.map(async({keyArgs:i,value:s})=>{let[a]=i,[o,l]=s,[c,m,d,p]=await Promise.all([this.getBalance(a,o),this.api.query.AssetRegistry.Assets.getValue(o),this.getBalance(a,l),this.api.query.AssetRegistry.Assets.getValue(l)]);return{address:a,type:"XYK",tokens:[{id:o,decimals:m?.decimals,existentialDeposit:m?.existential_deposit,balance:c.transferable,type:m?.asset_type.type},{id:l,decimals:p?.decimals,existentialDeposit:p?.existential_deposit,balance:d.transferable,type:p?.asset_type.type}],...n}});return Promise.all(r)}async getExchangeFee(){return await this.api.constants.XYK.GetExchangeFee()}async getPoolLimits(){let[t,e,n]=await Promise.all([this.api.constants.XYK.MaxInRatio(),this.api.constants.XYK.MaxOutRatio(),this.api.constants.XYK.MinTradingLimit()]);return{maxInRatio:t,maxOutRatio:e,minTradingLimit:n}}async getPoolFees(){return{exchangeFee:await this.getExchangeFee()}}getPoolType(){return"XYK"}async isSupported(){let t=this.api.query.XYK.PoolAssets,e=await this.api.compatibilityToken;return t.isCompatible(_i.BackwardsCompatible,e)}subscribePoolChange(t){return Ri(t)}};var Ae={};w(Ae,{AavePool:()=>Lt,AavePoolClient:()=>qt});var Lt=class u{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;static fromPool(t){return new u(t.address,t.tokens,t.maxInRatio,t.maxOutRatio,t.minTradingLimit)}constructor(t,e,n,r,i){this.type="Aave",this.address=t,this.tokens=e,this.maxInRatio=n,this.maxOutRatio=r,this.minTradingLimit=i}validatePair(t,e){return!0}parsePair(t,e){let n=new Map(this.tokens.map(s=>[s.id,s])),r=n.get(t),i=n.get(e);if(r==null)throw new Error("Pool does not contain tokenIn");if(i==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,balanceIn:r.balance,balanceOut:i.balance,decimalsIn:r.decimals,decimalsOut:i.decimals,assetInEd:0n,assetOutEd:0n}}validateAndBuy(t,e,n){let r=this.calculateInGivenOut(t,e),i=[];return e>t.balanceOut&&i.push("TradeNotAllowed"),{amountIn:r,calculatedIn:r,amountOut:e,feePct:0,errors:i}}validateAndSell(t,e,n){let r=this.calculateOutGivenIn(t,e),i=[];return r>t.balanceOut&&i.push("TradeNotAllowed"),{amountIn:e,calculatedOut:r,amountOut:r,feePct:0,errors:i}}calculateInGivenOut(t,e){return e}calculateOutGivenIn(t,e){return e}spotPriceInGivenOut(t){let e=Math.pow(10,t.decimalsOut);return BigInt(e)}spotPriceOutGivenIn(t){let e=Math.pow(10,t.decimalsIn);return BigInt(e)}calculateTradeFee(t,e){return 0n}};import{AccountId as Fi}from"polkadot-api";import{toHex as Ei}from"@polkadot-api/utils";import{map as ki,merge as Ci,switchMap as Di}from"rxjs";import{decodeEventLog as Mi}from"viem";var dn=[{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"reserve",type:"address"},{indexed:!1,internalType:"address",name:"user",type:"address"},{indexed:!0,internalType:"address",name:"onBehalfOf",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"},{indexed:!0,internalType:"uint16",name:"referralCode",type:"uint16"}],name:"Supply",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"reserve",type:"address"},{indexed:!0,internalType:"address",name:"user",type:"address"},{indexed:!0,internalType:"address",name:"to",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"}],name:"Withdraw",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"reserve",type:"address"},{indexed:!1,internalType:"address",name:"user",type:"address"},{indexed:!0,internalType:"address",name:"onBehalfOf",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"},{indexed:!1,internalType:"enum DataTypes.InterestRateMode",name:"interestRateMode",type:"uint8"},{indexed:!1,internalType:"uint256",name:"borrowRate",type:"uint256"},{indexed:!0,internalType:"uint16",name:"referralCode",type:"uint16"}],name:"Borrow",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"reserve",type:"address"},{indexed:!0,internalType:"address",name:"user",type:"address"},{indexed:!0,internalType:"address",name:"repayer",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"},{indexed:!1,internalType:"bool",name:"useATokens",type:"bool"}],name:"Repay",type:"event"}];var{ERC20:Li}=it,qi=["Supply","Withdraw","Repay","Borrow"],qt=class extends M{async loadPools(){let e=(await this.api.apis.AaveTradeExecutor.pools()).map(async({reserve:n,atoken:r,liqudity_in:i,liqudity_out:s})=>{let[a,o,l,c]=await Promise.all([this.api.query.AssetRegistry.Assets.getValue(n),this.api.query.AssetRegistry.AssetLocations.getValue(n),this.api.query.AssetRegistry.Assets.getValue(r),this.api.query.AssetRegistry.AssetLocations.getValue(r)]);return{address:this.getPoolId(n,r),type:"Aave",tokens:[{id:n,decimals:a?.decimals,existentialDeposit:a?.existential_deposit,balance:i,location:o,type:a?.asset_type.type},{id:r,decimals:l?.decimals,existentialDeposit:l?.existential_deposit,balance:s,location:c,type:l?.asset_type.type}],...this.getPoolLimits()}});return Promise.all(e)}async getPoolDelta(t){let[e,n]=t.tokens,{liqudity_in:r,liqudity_out:i}=await this.api.apis.AaveTradeExecutor.pool(e.id,n.id);return t.tokens.map(s=>{let a=s.id===e.id?r:i;return{...s,balance:a}})}getPoolId(t,e){let n=t+"/"+e,r=new TextEncoder().encode(n.padEnd(32,"\0")),i=Ei(r);return Fi(63).dec(i)}getPoolLimits(){return{maxInRatio:0n,maxOutRatio:0n,minTradingLimit:0n}}async getPoolFees(t,e){return{}}getPoolType(){return"Aave"}async isSupported(){return!0}subscribePoolChange(t){let[e,n]=t.tokens,r=this.getReserveH160Id(e),i=this.api.event.Router.Executed.watch(({asset_in:a,asset_out:o})=>a===n.id||o===n.id),s=this.api.event.EVM.Log.watch(({log:a})=>{let{topics:o,data:l}=a,c=o.map(g=>g.asHex()),m=l.asHex(),{eventName:d,args:p}=Mi({abi:dn,topics:c,data:m});return qi.includes(d)&&p.reserve.toLowerCase()===r.toLowerCase()});return Ci([i,s]).pipe(Di(()=>this.getPoolDelta(t)),ki(a=>({...t,tokens:[...a]})))}getReserveH160Id(t){return t.type==="Erc20"?Z.findNestedKey(t.location,"AccountKey20").AccountKey20.key:Li.fromAssetId(t.id)}};var mt=class{static get(t){switch(t.type){case"Aave":return Lt.fromPool(t);case"XYK":return Dt.fromPool(t);case"Omnipool":return Ft.fromPool(t);case"LBP":return Bt.fromPool(t);case"Stableswap":return kt.fromPool(t);default:throw new Error("Pool type "+t.type+" is not supported yet")}}};import{Subject as Ni,Subscription as Nt,takeUntil as Gi}from"rxjs";var pt=class extends R{evm;lbpClient;omniClient;stableClient;xykClient;aaveClient;active=new Set([]);clients=[];pools=new Map([]);lbpSub=Nt.EMPTY;omniSub=Nt.EMPTY;stableSub=Nt.EMPTY;xykSub=Nt.EMPTY;aaveSub=Nt.EMPTY;isReady=!1;isDestroyed=new Ni;constructor(t,e){super(t),this.evm=e,this.lbpClient=new Rt(t,e),this.omniClient=new Et(t,e),this.stableClient=new Ct(t,e),this.xykClient=new Mt(t,e),this.aaveClient=new qt(t,e),this.clients=[this.lbpClient,this.omniClient,this.stableClient,this.xykClient,this.aaveClient]}subscribe(t){return t.getSubscriber().pipe(Gi(this.isDestroyed)).subscribe(e=>{this.pools.set(e.address,e)})}withOmnipool(){return this.omniSub.unsubscribe(),this.omniSub=this.subscribe(this.omniClient),this.active.add("Omnipool"),this}withStableswap(){return this.stableSub.unsubscribe(),this.stableSub=this.subscribe(this.stableClient),this.active.add("Stableswap"),this}withLbp(){return this.lbpSub.unsubscribe(),this.lbpSub=this.subscribe(this.lbpClient),this.active.add("LBP"),this}withAave(){return this.aaveSub.unsubscribe(),this.aaveSub=this.subscribe(this.aaveClient),this.active.add("Aave"),this}withXyk(t){return this.xykClient.withOverride(t),this.xykSub.unsubscribe(),this.xykSub=this.subscribe(this.xykClient),this.active.add("XYK"),this}destroy(){this.isDestroyed.next(!0),this.isDestroyed.complete(),this.active.clear(),this.pools.clear(),this.isReady=!1}async getPools(t={}){if(this.active.size===0)throw new Error("No pools selected");if(this.isReady)return Array.from(this.pools.values());let{useOnly:e=[],exclude:n=[]}=t,r=new Set(e),i=new Set(n),s=async a=>{let o=a.getPoolType();return r.size>0?r.has(o):i.size>0?!i.has(o):a.isSupported()};return this.getFilteredPools(s)}async getFilteredPools(t){let e=await Promise.all(this.clients.map(t)),n=this.clients.filter((i,s)=>e[s]);return(await Promise.all(n.map(i=>i.getPoolsMem()))).flat()}async getPoolFees(t,e){let n=this.clients.find(r=>r.getPoolType()===t.type);if(n)return n.getPoolFees(t,e);throw new xt(t.type)}};var fn={};w(fn,{DEFAULT_BLOCK_TIME:()=>bn,DEFAULT_MIN_BUDGET:()=>Re,ORDER_MIN_BLOCK_PERIOD:()=>hn,Router:()=>dt,TWAP_BLOCK_PERIOD:()=>Vt,TWAP_MAX_DURATION:()=>Ee,TWAP_MAX_PRICE_IMPACT:()=>Fe,TWAP_TX_MULTIPLIER:()=>Xu,TradeOrderError:()=>_e,TradeOrderType:()=>ie,TradeRouteBuilder:()=>L,TradeRouter:()=>gt,TradeScheduler:()=>yt,TradeType:()=>re});var Gt=class{constructor(t=1/0){this.capacity=t}storage=[];enqueue(t){if(this.size()===this.capacity)throw Error("Queue has reached max capacity, you cannot add more items");this.storage.push(t)}dequeue(){return this.storage.shift()}size(){return this.storage.length}};var Ui=8,Ut=class{isNotVisited(t,e){let n=!0;return e.forEach(r=>{(r[0]===t[0]||r[1]===t[1])&&(n=!1)}),n}findPaths(t,e,n){let r=[],i=new Gt,s=[];for(s.push([e,""]),i.enqueue(s);i.size()>0;){let a=i.dequeue();if(!a||a.length>Ui)continue;let o=a[a.length-1];(n===null||o[0]===n)&&r.push(a),t.get(o[0])?.forEach(c=>{if(this.isNotVisited(c,a)){let m=[...a];m.push(c),i.enqueue(m)}})}return r}findShortestPaths(t,e,n){let r=[],i=new Gt,s=[];s.push([e,""]),i.enqueue(s);let a=1/0;for(;i.size()>0;){let o=i.dequeue();if(!o)continue;let l=o[o.length-1];if(l[0]===n){o.length<a?(a=o.length,r.length=0,r.push(o)):o.length===a&&r.push(o);continue}let c=t.get(l[0]);for(let m of c??[])this.isNotVisited(m,o)&&i.enqueue([...o,m])}return r}buildAndPopulateGraph(t,e){let n=new Map;for(let r of t)n.set(parseInt(r),[]);for(let[r,i,s]of e)n.get(i)?.push([s,r]);return n}};function Be(u){let t={};for(let e of u){let n=e.tokens.length;for(let r=0;r<n;r++){t[e.tokens[r].id]||(t[e.tokens[r].id]=[]);for(let i=0;i<n;i++){if(r==i)continue;let s=[e.address,e.tokens[r].id,e.tokens[i].id];t[e.tokens[r].id].push(s)}}}return t}var Ht=class{getProposals(t,e,n){let r=n.filter(y=>y.type==="XYK"),i=n.filter(y=>y.type!=="XYK"),s=new Set(i.map(y=>y.tokens).flat().map(y=>y.id)),a=s.has(t),o=s.has(e),l=new Ut,c=y=>{let h=Be(y),P=Object.keys(h),S=P.flatMap(T=>h[T]);return l.buildAndPopulateGraph(P,S)};if(!a&&!o){let y=r.filter(S=>S.tokens.find(T=>T.id===t)||S.tokens.find(T=>T.id===e)),h=c(y),P=l.findPaths(h,t,e);return this.parsePaths(P)}if(a&&o){let y=c(i),h=l.findPaths(y,t,e);return this.parsePaths(h)}let m=a?e:t,d=r.filter(y=>y.tokens.some(h=>h.id===m));if(d.length===0)return[];let p=[...i,...d],g=c(p),b=l.findPaths(g,t,e);return this.parsePaths(b)}parsePaths(t){let e=[];for(let n of t){let r=[];for(let i=0;i<n.length;i++){let s=n[i],a=n[i+1];if(a==null)break;r.push(this.toEdge(s,a))}e.push(r)}return e}toEdge(t,e){return[e[1],t[0],e[0]]}};var dt=class{routeSuggester;routeProposals;routerOptions;ctx;constructor(t,e={}){this.ctx=t,this.routeSuggester=new Ht,this.routeProposals=new Map,this.routerOptions=Object.freeze(e)}buildRouteKey(t,e,n){return`${t}->${e}::${n.length}`}async getPools(){return this.ctx.getPools(this.routerOptions)}async getRoutes(t,e){let n=await this.getPools();return this.validateInput(t,e,n),this.getPaths(t,e,n)}async getTradeableAssets(){let t=await this.getPools(),e=this.getAssets(t);return Array.from(e)}async getRouteableAssets(t){let e=await this.getTradeableAssets();return(await Promise.all(e.filter(r=>r!==t).map(r=>this.getRoutes(r,t)))).filter(r=>r.length>0).map(([r])=>r[0].assetIn).sort()}validateInput(t,e,n){if(n.length===0)throw new Error("No pools configured");if(t===e)throw new Error("Trading pair can't be identical");let r=this.getAssets(n);if(!r.has(t))throw new Error(t+" is not supported asset");if(!r.has(e))throw new Error(e+" is not supported asset");return this.toPoolsMap(n)}getAssets(t){let e=t.map(n=>n.tokens.map(r=>r.id)).flat().sort((n,r)=>n>r?1:-1);return new Set(e)}getPaths(t,e,n){let r=this.toPoolsMap(n);return this.getProposals(t,e,n).filter(s=>this.validPath(s,r)).map(s=>this.toHops(s,r))}getProposals(t,e,n){let r=this.buildRouteKey(t,e,n);if(this.routeProposals.has(r))return this.routeProposals.get(r);let i=this.routeSuggester.getProposals(t,e,n);return this.routeProposals.set(r,i),i}validPath(t,e){return t.length>0&&t.map(n=>this.validEdge(n,e)).reduce((n,r)=>n&&r)}validEdge([t,e,n],r){return r.get(t)?.validatePair(e,n)||!1}toPoolsMap(t){return new Map(t.map(e=>[e.address,mt.get(e)]))}toHops(t,e){return t.map(([n,r,i])=>{let s=e.get(n);return{poolAddress:n,poolId:s?.id,pool:s?.type,assetIn:r,assetOut:i}})}};var re=(e=>(e.Buy="Buy",e.Sell="Sell",e))(re||{}),ie=(n=>(n.Dca="Dca",n.TwapSell="TwapSell",n.TwapBuy="TwapBuy",n))(ie||{}),_e=(n=>(n.OrderTooSmall="OrderTooSmall",n.OrderTooBig="OrderTooBig",n.OrderImpactTooBig="OrderImpactTooBig",n))(_e||{});var{FeeUtils:yn}=v,gt=class extends dt{mlr;poolsSnapshot;constructor(t,e={}){super(t,e),this.mlr=new Map}buildCtxSync(t,e){let n=this.poolsSnapshot,r=super.validateInput(t,e,n),i=super.getPaths(t,e,n);if(!i.length)throw new It(t,e);return{paths:i,pools:n,poolsMap:r}}async withCtx(t,e,n){this.poolsSnapshot||(this.poolsSnapshot=await super.getPools());let r=this.buildCtxSync(t,e);return n(r)}isDirectTrade(t){return t.length==1}findBestSellRoute(t){let e=t.sort((n,r)=>{let i=n[n.length-1].amountOut,s=r[r.length-1].amountOut;return i>s?-1:1});return e.find(n=>n.every(r=>r.errors.length==0))||e[0]}getRouteFeeRange(t){if(t.filter(n=>n.tradeFeeRange).length>0){let n=t.map(i=>i.tradeFeeRange?.[0]??i.tradeFeePct).reduce((i,s)=>i+s),r=t.map(i=>i.tradeFeeRange?.[1]??i.tradeFeePct).reduce((i,s)=>i+s);return[n,r]}}getPoolFeeRange(t){let e=t.min?yn.toPct(t.min):void 0,n=t.max?yn.toPct(t.max):void 0;if(e&&n)return[e,n]}async getBestSell(t,e,n){return this.getSell(t,e,n)}getSellSpot(t){let e=t[t.length-1];if(t.length===1)return e.spotPrice;let n=t.map(a=>a.assetOutDecimals).reduce((a,o)=>a+o),r=t.map(a=>a.spotPrice).reduce((a,o)=>a*o),i=n-e.assetOutDecimals,s=Math.pow(10,i);return r/BigInt(s)}async getSell(t,e,n,r){return this.withCtx(t,e,async({paths:i,poolsMap:s})=>{let a;if(r)a=await this.toSellSwaps(n,r,s);else{let o=i.map(c=>this.toSellSwaps(n,c,s)),l=await Promise.all(o);a=this.findBestSellRoute(l)}return this.buildSell(s,a)})}buildSell(t,e){let n=e[0],r=e[e.length-1],i=this.isDirectTrade(e),s=this.getSellSpot(e),a=r.amountOut,o=i?r.calculatedOut:this.calculateDelta0Y(n.amountIn,e,t),l=o-a,c=this.getRouteFeeRange(e),m=i?r.tradeFeePct:O.calculateSellFee(o,a),d=Math.pow(10,n.assetInDecimals),p=n.amountIn*s/BigInt(d),g=O.calculateDiffToRef(o,p);return{type:"Sell",amountIn:n.amountIn,amountOut:r.amountOut,spotPrice:s,tradeFee:l,tradeFeePct:m,tradeFeeRange:c,priceImpactPct:g,swaps:e,toHuman(){return{type:"Sell",amountIn:f.toDecimal(n.amountIn,n.assetInDecimals),amountOut:f.toDecimal(r.amountOut,r.assetOutDecimals),spotPrice:f.toDecimal(s,r.assetOutDecimals),tradeFee:f.toDecimal(l,r.assetOutDecimals),tradeFeePct:m,tradeFeeRange:c,priceImpactPct:g,swaps:e.map(b=>b.toHuman())}}}}calculateDelta0Y(t,e,n){let r=[];for(let i=0;i<e.length;i++){let s=e[i],a=n.get(s.poolAddress);if(a==null)throw new Error("Pool does not exit");let o=a.parsePair(s.assetIn,s.assetOut),l;i>0?l=r[i-1]:l=t;let c=a.calculateOutGivenIn(o,l);r.push(c)}return r[r.length-1]}async calculateMostLiquidRoute(t,e,n){let{paths:r,pools:i,poolsMap:s}=n,l=i.filter(b=>b.tokens.some(y=>y.id===t)).map(b=>b.type==="Aave"?b.tokens:b.tokens.filter(y=>y.id===t)).map(b=>b.map(y=>y.balance).reduce((y,h)=>y+h)).sort((b,y)=>y<b?-1:1)[0],c=O.getFraction(l,.1),m=await Promise.all(r.map(b=>this.toSellSwaps(c,b,s))),p=this.findBestSellRoute(m).map(b=>({poolAddress:b.poolAddress,poolId:b?.poolId,pool:b.pool,assetIn:b.assetIn,assetOut:b.assetOut})),g=this.buildRouteKey(t,e,i);return this.mlr.set(g,p),p}async toSellSwaps(t,e,n){let r=[];for(let i=0;i<e.length;i++){let s=e[i],a=n.get(s.poolAddress);if(a==null)throw new Error("Pool does not exit");let o=a.parsePair(s.assetIn,s.assetOut),l;i>0?l=r[i-1].amountOut:l=typeof t=="string"?f.toBigInt(t,o.decimalsIn):t;let c=await this.ctx.getPoolFees(a,o.assetOut),{amountOut:m,calculatedOut:d,feePct:p,errors:g}=a.validateAndSell(o,l,c),b=this.getPoolFeeRange(c),y=a.spotPriceOutGivenIn(o),h=Math.pow(10,o.decimalsIn),P=l*y/BigInt(h),S=O.calculateDiffToRef(d,P);r.push({...s,assetInDecimals:o.decimalsIn,assetOutDecimals:o.decimalsOut,amountIn:l,amountOut:m,calculatedOut:d,spotPrice:y,tradeFeePct:p,tradeFeeRange:b,priceImpactPct:S,errors:g,isSupply(){return a.type==="Aave"&&a.tokens[0].id===s.assetIn},isWithdraw(){return a.type==="Aave"&&a.tokens[1].id===s.assetIn},toHuman(){return{...s,amountIn:f.toDecimal(l,o.decimalsIn),amountOut:f.toDecimal(m,o.decimalsOut),calculatedOut:f.toDecimal(d,o.decimalsOut),spotPrice:f.toDecimal(y,o.decimalsOut),tradeFeePct:p,tradeFeeRange:b,priceImpactPct:S,errors:g}}})}return r}async getMostLiquidRoute(t,e){return this.withCtx(t,e,async n=>{let r=this.buildRouteKey(t,e,n.pools),i=this.mlr.get(r);return i||this.calculateMostLiquidRoute(t,e,n)})}async getSpotPrice(t,e){return this.withCtx(t,e,async n=>{let{pools:r,poolsMap:i}=n,s=this.buildRouteKey(t,e,r),a=this.mlr.get(s);a||(a=await this.calculateMostLiquidRoute(t,e,n));let o=await this.toSellSwaps("1",a,i),l=this.getSellSpot(o),c=o[o.length-1].assetOutDecimals;return{amount:l,decimals:c}})}findBestBuyRoute(t){let e=t.sort((n,r)=>{let i=n[0].amountIn,s=r[0].amountIn;return i>s?1:-1});return e.find(n=>n.every(r=>r.errors.length==0))||e[0]}async getBestBuy(t,e,n){return this.getBuy(t,e,n)}getBuySpot(t){let e=t[0];if(t.length===1)return e.spotPrice;let n=t.map(a=>a.assetInDecimals).reduce((a,o)=>a+o),r=t.map(a=>a.spotPrice).reduce((a,o)=>a*o),i=n-e.assetInDecimals,s=Math.pow(10,i);return r/BigInt(s)}async getBuy(t,e,n,r){return this.withCtx(t,e,async({paths:i,poolsMap:s})=>{let a;if(r)a=await this.toBuySwaps(n,r,s);else{let o=i.map(c=>this.toBuySwaps(n,c,s)),l=await Promise.all(o);a=this.findBestBuyRoute(l)}return this.buildBuy(s,a)})}buildBuy(t,e){let n=e[e.length-1],r=e[0],i=this.isDirectTrade(e),s=this.getBuySpot(e),a=r.amountIn,o=i?r.calculatedIn:this.calculateDelta0X(n.amountOut,e,t),l=a-o,c=this.getRouteFeeRange(e),m=i?r.tradeFeePct:O.calculateBuyFee(o,a),d=Math.pow(10,n.assetOutDecimals),p=n.amountOut*s/BigInt(d),g;return o===0n?g=-100:g=O.calculateDiffToRef(p,o),{type:"Buy",amountOut:n.amountOut,amountIn:r.amountIn,spotPrice:s,tradeFee:l,tradeFeePct:m,tradeFeeRange:c,priceImpactPct:g,swaps:e,toHuman(){return{type:"Buy",amountOut:f.toDecimal(n.amountOut,n.assetOutDecimals),amountIn:f.toDecimal(r.amountIn,r.assetInDecimals),spotPrice:f.toDecimal(s,r.assetInDecimals),tradeFee:f.toDecimal(l,r.assetInDecimals),tradeFeePct:m,tradeFeeRange:c,priceImpactPct:g,swaps:e.map(b=>b.toHuman())}}}}calculateDelta0X(t,e,n){let r=[];for(let i=e.length-1;i>=0;i--){let s=e[i],a=n.get(s.poolAddress);if(a==null)throw new Error("Pool does not exit");let o=a.parsePair(s.assetIn,s.assetOut),l;i==e.length-1?l=t:l=r[0];let c=a.calculateInGivenOut(o,l);r.unshift(c)}return r[0]}async toBuySwaps(t,e,n){let r=[];for(let i=e.length-1;i>=0;i--){let s=e[i],a=n.get(s.poolAddress);if(a==null)throw new Error("Pool does not exit");let o=a.parsePair(s.assetIn,s.assetOut),l;i==e.length-1?l=typeof t=="string"?f.toBigInt(t,o.decimalsOut):t:l=r[0].amountIn;let c=await this.ctx.getPoolFees(a,o.assetOut),{amountIn:m,calculatedIn:d,feePct:p,errors:g}=a.validateAndBuy(o,l,c),b=this.getPoolFeeRange(c),y=a.spotPriceInGivenOut(o),h=Math.pow(10,o.decimalsOut),P=l*y/BigInt(h),S;d===0n?S=-100:S=O.calculateDiffToRef(P,d),r.unshift({...s,assetInDecimals:o.decimalsIn,assetOutDecimals:o.decimalsOut,amountOut:l,amountIn:m,calculatedIn:d,spotPrice:y,tradeFeePct:p,tradeFeeRange:b,priceImpactPct:S,errors:g,isSupply(){return a.type==="Aave"&&a.tokens[0].id===s.assetIn},isWithdraw(){return a.type==="Aave"&&a.tokens[1].id===s.assetIn},toHuman(){return{...s,amountOut:f.toDecimal(l,o.decimalsOut),amountIn:f.toDecimal(m,o.decimalsIn),calculatedIn:f.toDecimal(d,o.decimalsIn),spotPrice:f.toDecimal(y,o.decimalsIn),tradeFeePct:p,tradeFeeRange:b,priceImpactPct:S,errors:g}}})}return r}};var bn=6e3,Re=1000000000000000n,Vt=6,Fe=-5,Ee=216e5,Xu=3,hn=6;import{Enum as Pn}from"polkadot-api";var L=class{static build(t){return t.map(({assetIn:e,assetOut:n,pool:r,poolId:i})=>r==="Stableswap"?{pool:Pn("Stableswap",i),asset_in:e,asset_out:n}:{pool:Pn(r),asset_in:e,asset_out:n})}};var yt=class{schedulerOptions;router;constructor(t,e={}){this.router=t,this.schedulerOptions=Object.freeze({blockTime:e.blockTime??6e3,minBudgetInNative:e.minBudgetInNative??Re})}get blockTime(){return this.schedulerOptions.blockTime}get minOrderBudget(){return this.schedulerOptions.minBudgetInNative}async getDcaOrder(t,e,n,r,i){let[s,a]=await Promise.all([this.getMinimumOrderBudget(t),this.router.getBestSell(t,e,n)]),{amountIn:o,swaps:l,priceImpactPct:c}=a,m=l[0],d=l[l.length-1],{assetInDecimals:p}=m,{assetOutDecimals:g}=d,b=Math.abs(c),y=this.getMinimumTradeCount(o,s),h=this.getOptimalTradeCount(b),P=i?Math.round(r/i):h,S=Math.ceil(r/y),T=Math.round(r/h),C=Math.round(r/P),q=o/BigInt(P),_=await this.router.getBestSell(t,e,q),D=o<s,j=[];D&&j.push("OrderTooSmall");let $=_.amountOut*BigInt(P),G=this.toBlockPeriod(C),W=_.tradeFee*BigInt(P),ft=L.build(l),Q={assetIn:t,assetOut:e,errors:j,frequencyMin:S,frequencyOpt:T,frequency:C,tradeCount:P,tradeFee:W,tradeImpactPct:_.priceImpactPct,tradePeriod:G,tradeRoute:ft,type:"Dca"};return{...Q,amountIn:o,amountOut:$,tradeAmountIn:_.amountIn,tradeAmountOut:_.amountOut,toHuman(){return{...Q,amountIn:f.toDecimal(o,p),amountOut:f.toDecimal($,g),tradeAmountIn:f.toDecimal(_.amountIn,p),tradeAmountOut:f.toDecimal(_.amountOut,g)}}}}async getMinimumOrderBudget(t){if(0===t)return this.minOrderBudget;let e=await this.router.getSpotPrice(0,t),n=10n**BigInt(12);if(e)return this.minOrderBudget*e.amount/n;throw new Error("Unable to calculate order budget")}getMinimumTradeCount(t,e){let n=e*2n/10n;if(n===0n)return 0;let r=t+n/2n;return Number(r/n)}getOptimalTradeCount(t){let e=Math.round(t*10)||1;return Math.max(e,3)}async getTwapSellOrder(t,e,n){let[r,i]=await Promise.all([this.getMinimumOrderBudget(t),this.router.getBestSell(t,e,n)]),{amountIn:s,swaps:a,priceImpactPct:o}=i,l=a[0],c=a[a.length-1],{assetInDecimals:m}=l,{assetOutDecimals:d}=c,p=Math.abs(o),g=this.getTwapTradeCount(p),b=s/BigInt(g),y=await this.router.getBestSell(l.assetIn,c.assetOut,b),h=g===1,P=s<r,S=y.priceImpactPct<-5,T=[];P||h?T.push("OrderTooSmall"):S&&T.push("OrderImpactTooBig");let C=y.amountOut*BigInt(g),q=y.tradeFee*BigInt(g),_=L.build(a),D={assetIn:t,assetOut:e,errors:T,tradeCount:g,tradeImpactPct:y.priceImpactPct,tradePeriod:6,tradeRoute:_,type:"TwapSell"};return{...D,amountIn:s,amountOut:C,tradeAmountIn:y.amountIn,tradeAmountOut:y.amountOut,tradeFee:q,toHuman(){return{...D,amountIn:f.toDecimal(s,m),amountOut:f.toDecimal(C,d),tradeAmountIn:f.toDecimal(y.amountIn,m),tradeAmountOut:f.toDecimal(y.amountOut,d),tradeFee:f.toDecimal(q,d)}}}}async getTwapBuyOrder(t,e,n){let[r,i]=await Promise.all([this.getMinimumOrderBudget(t),this.router.getBestBuy(t,e,n)]),{amountOut:s,swaps:a,priceImpactPct:o}=i,l=a[0],c=a[a.length-1],{assetInDecimals:m}=l,{assetOutDecimals:d}=c,p=Math.abs(o),g=this.getTwapTradeCount(p),b=s/BigInt(g),y=await this.router.getBestBuy(l.assetIn,c.assetOut,b),h=y.amountIn*BigInt(g),P=g===1,S=h<r,T=y.priceImpactPct<-5,C=[];S||P?C.push("OrderTooSmall"):T&&C.push("OrderImpactTooBig");let q=y.tradeFee*BigInt(g),_=L.build(a),D={assetIn:t,assetOut:e,errors:C,tradeCount:g,tradeImpactPct:y.priceImpactPct,tradePeriod:6,tradeRoute:_,type:"TwapBuy"};return{...D,amountIn:h,amountOut:s,tradeAmountIn:y.amountIn,tradeAmountOut:y.amountOut,tradeFee:q,toHuman(){return{...D,amountIn:f.toDecimal(h,m),amountOut:f.toDecimal(s,d),tradeAmountIn:f.toDecimal(y.amountIn,m),tradeAmountOut:f.toDecimal(y.amountOut,d),tradeFee:f.toDecimal(q,m)}}}}getTwapTradeCount(t){let e=this.getOptimalTradeCount(t);if(this.getTwapExecutionTime(e)>216e5){let r=216e5/(this.blockTime*6);return Math.round(r)}return e}getTwapExecutionTime(t){return t*6*this.blockTime}toBlockPeriod(t){let e=t/this.blockTime,n=Math.round(e);return Math.max(n,6)}};var xn={};w(xn,{BIG_10:()=>Tn,BIG_BILL:()=>wn,StakingApi:()=>Wt,StakingClient:()=>Yt});import{encodeAddress as Hi}from"@polkadot/util-crypto";import{stringToU8a as Vi}from"@polkadot/util";import{calculate_accumulated_rps as Wi,calculate_period_number as Sn,calculate_rewards as Yi}from"@galacticcouncil/math-staking";import bt from"big.js";var Tn=bt(10),wn=bt(Tn.pow(12));function Xi(u){return Hi(Vi(("modl"+u).padEnd(32,"\0")),63)}var Wt=class{client;balanceClient;constructor(t,e){this.client=t,this.balanceClient=e}async getFreePotBalance(){let t=await this.client.getPalletId(),e=Xi(t);return(await this.balanceClient.getBalance(e,0)).transferable}async getStakingPosition(t){let[e,n]=await Promise.all([this.client.getStakingPositionsValue(t),this.client.getStakingVotes(t)]),r=e?.created_at,i=await n.reduce(async(s,[a,o])=>{let l=await s,c=a,m=o.amount,d=o.conviction.toString(),p=await this.client.getReferendumInfo(c);return p&&(p.type==="Approved"||p.type==="Rejected")&&l.push({id:c,amount:m,conviction:d}),l},Promise.resolve([]));return{stake:e?.stake,rewardPerStake:e?.reward_per_stake,createdAt:r,actionPoints:e?.action_points,accumulatedUnpaidRewards:e?.accumulated_unpaid_rewards,accumulatedSlashPoints:e?.accumulated_slash_points,accumulatedLockedRewards:e?.accumulated_locked_rewards,votes:i}}async getStake(t){let e=await this.client.getNFTCollectionId(),[n,r]=await Promise.all([this.client.getStaking(),this.client.getUniques(t,e)]),i=r.find(s=>s)?.itemId;return{totalStake:n?.total_stake,accumulatedRewardPerStake:n?.accumulated_reward_per_stake,potReservedBalance:n?.pot_reserved_balance,positionId:i,stakePosition:i?await this.getStakingPosition(i):void 0}}async getRewards(t,e){let n=await this.getStake(t),{potReservedBalance:r,accumulatedRewardPerStake:i,totalStake:s,stakePosition:a}=n;if(!a)return;let[o,l,c,m]=await Promise.all([this.getFreePotBalance(),this.client.getPeriodLength(),this.client.getUnclaimablePeriods(),this.client.getSixBlockSince()]),d=bt(o.toString()).minus(r.toString()),p=i.toString(),g=bt(e).plus(1).toString();d.gt(0)&&s>0&&(p=Wi(i.toString(),d.toString(),s.toString()));let b=Sn(l.toString(),e,m??g),y=Sn(l.toString(),a.createdAt?.toString()??"",m??g),h=Yi(p,a.rewardPerStake?.toString()??"",a.stake?.toString()??""),P=bt(h).plus(a.accumulatedUnpaidRewards?.toString()||"0").plus(a.accumulatedLockedRewards?.toString()||"0");if(!bt(b).minus(y).lte(c.toString()))return P.div(wn).toString()}};var Yt=class extends R{async getPalletId(){let t=this.api.constants.Staking.PalletId;return(await t()).asText()}async getPeriodLength(){let t=this.api.constants.Staking.PeriodLength;return await t()}async getUnclaimablePeriods(){let t=this.api.constants.Staking.UnclaimablePeriods;return await t()}async getNFTCollectionId(){let t=this.api.constants.Staking.NFTCollectionId;return await t()}async getStaking(){return await this.api.query.Staking.Staking.getValue()}async getUniques(t,e){return(await this.api.query.Uniques.Account.getEntries(t,e)).map(({keyArgs:s})=>{let[a,o,l]=s;return{address:a,collectionId:o,itemId:l}})}async getStakingPositionsValue(t){return await this.api.query.Staking.Positions.getValue(t)}async getStakingVotes(t){return await this.api.query.Staking.Votes.getValue(t)}async getReferendumInfo(t){return await this.api.query.Referenda.ReferendumInfoFor.getValue(t)}async getSixBlockSince(){return(await this.api.query.Staking.SixSecBlocksSince.getValue()).toString()}};var On={};w(On,{TxBuilderFactory:()=>Pt});import{Enum as vn}from"polkadot-api";function In(u){let t=[],e=u;for(;e&&typeof e=="object"&&"type"in e;)t.push(e.type),e=e.value;return t.join(".")}var ht=class extends R{evm;evmClient;balanceClient;aaveUtils;constructor(t,e){super(t),this.evm=e,this.evmClient=e.getWsProvider(),this.balanceClient=new U(t),this.aaveUtils=new tt(e)}wrapTx(t,e){return{name:t,get:()=>e,dryRun:n=>this.dryRun(n,e)}}async dispatchWithExtraGas(t){return this.api.tx.Dispatcher.dispatch_with_extra_gas({call:t.decodedCall,extra_gas:ue})}async dryRun(t,e){let n=vn("Signed",t),r=vn("system",n),s=await this.client.getUnsafeApi().apis.DryRunApi.dry_run_call(r,e.decodedCall),a=s.success&&!s.value.execution_result.success?s.value.execution_result.value.error:null;if(a){let o=In(a.value);throw new Error("Dry run execution error!",{cause:o})}return s}isDirectOmnipoolTrade(t){return t.length===1&&t[0].pool==="Omnipool"}};var ae=class extends ht{_trade;_beneficiary;_slippagePct=1;setTrade(t){return this._trade=t,this}withBeneficiary(t){return this._beneficiary=t,this}withSlippage(t){return this._slippagePct=t,this}get trade(){if(!this._trade)throw new Error("Trade not set. Use setTrade().");return this._trade}get beneficiary(){if(!this._beneficiary)throw new Error("Beneficiary not set. Use withBeneficiary().");return this._beneficiary}get slippagePct(){return this._slippagePct}async build(){let{amountIn:t,swaps:e,type:n}=this.trade;if(n==="Buy")return this.buildBuyTx();let{assetIn:r}=e[0],i=await this.balanceClient.getBalance(this.beneficiary,r);return t>=i.transferable-5n?this.buildSellAllTx():this.buildSellTx()}async buildBuyTx(){let{amountIn:t,amountOut:e,swaps:n}=this.trade,r=n[0],i=n[n.length-1],s=O.getFraction(t,this.slippagePct),a=r.assetIn,o=i.assetOut,l=t+s,c;return this.isDirectOmnipoolTrade(n)?c=this.api.tx.Omnipool.buy({asset_in:a,asset_out:o,amount:e,max_sell_amount:l}):c=this.api.tx.Router.buy({asset_in:a,asset_out:o,amount_out:e,max_amount_in:l,route:L.build(n)}),this.wrapTx("RouterBuy",c)}async buildSellTx(){let{amountIn:t,amountOut:e,swaps:n}=this.trade,r=n[0],i=n[n.length-1],s=O.getFraction(e,this.slippagePct),a=r.assetIn,o=i.assetOut,l=e-s,c;return this.isDirectOmnipoolTrade(n)?c=this.api.tx.Omnipool.sell({asset_in:a,asset_out:o,amount:t,min_buy_amount:l}):c=this.api.tx.Router.sell({asset_in:a,asset_out:o,amount_in:t,min_amount_out:l,route:L.build(n)}),r.isWithdraw()&&await this.aaveUtils.hasBorrowPositions(this.beneficiary)&&(c=await this.dispatchWithExtraGas(c)),this.wrapTx("RouterSell",c)}async buildSellAllTx(){let{amountOut:t,swaps:e}=this.trade,n=e[0],r=e[e.length-1],i=O.getFraction(t,this.slippagePct),s=n.assetIn,a=r.assetOut,o=t-i,l=this.api.tx.Router.sell_all({asset_in:s,asset_out:a,min_amount_out:o,route:L.build(e)});return n.isWithdraw()&&await this.aaveUtils.hasBorrowPositions(this.beneficiary)&&(l=await this.dispatchWithExtraGas(l)),this.wrapTx("RouterSellAll",l)}};import{Enum as ke}from"polkadot-api";var se=class extends ht{_order;_beneficiary;_maxRetries=3;_slippagePct=1;setOrder(t){return this._order=t,this}withBeneficiary(t){return this._beneficiary=t,this}withMaxRetries(t){return this._maxRetries=t,this}withSlippage(t){return this._slippagePct=t,this}get order(){if(!this._order)throw new Error("Order not set. Use setOrder().");return this._order}get beneficiary(){if(!this._beneficiary)throw new Error("Beneficiary not set. Use withBeneficiary().");return this._beneficiary}get maxRetries(){return this._maxRetries}get slippagePct(){return this._slippagePct}async build(){let{type:t}=this.order;switch(t){case"Dca":return this.buildDcaTx();case"TwapSell":return this.buildTwapSellTx();case"TwapBuy":return this.buildTwapBuyTx();default:throw new Error(`Unsupported TradeOrderType: ${t}`)}}buildDcaTx(){let{amountIn:t,assetIn:e,assetOut:n,tradeAmountIn:r,tradePeriod:i,tradeRoute:s}=this.order,a=this.api.tx.DCA.schedule({schedule:{owner:this.beneficiary,period:i,max_retries:this.maxRetries,total_amount:t,slippage:this.slippagePct*1e4,stability_threshold:void 0,order:ke("Sell",{asset_in:e,asset_out:n,amount_in:r,min_amount_out:0n,route:s})},start_execution_block:void 0});return this.wrapTx("DcaSchedule",a)}buildTwapSellTx(){let{amountIn:t,assetIn:e,assetOut:n,tradeAmountIn:r,tradeAmountOut:i,tradePeriod:s,tradeRoute:a}=this.order,o=O.getFraction(i,this.slippagePct),l=i-o,c=this.api.tx.DCA.schedule({schedule:{owner:this.beneficiary,period:s,max_retries:this.maxRetries,total_amount:t,slippage:this.slippagePct*1e4,stability_threshold:void 0,order:ke("Sell",{asset_in:e,asset_out:n,amount_in:r,min_amount_out:l,route:a})},start_execution_block:void 0});return this.wrapTx("DcaSchedule.twapSell",c)}buildTwapBuyTx(){let{amountIn:t,assetIn:e,assetOut:n,tradeAmountIn:r,tradeAmountOut:i,tradePeriod:s,tradeRoute:a}=this.order,o=O.getFraction(r,this.slippagePct),l=r+o,c=this.api.tx.DCA.schedule({schedule:{owner:this.beneficiary,period:s,max_retries:this.maxRetries,total_amount:t,slippage:this.slippagePct*1e4,stability_threshold:void 0,order:ke("Buy",{asset_in:e,asset_out:n,amount_out:i,max_amount_in:l,route:a})},start_execution_block:void 0});return this.wrapTx("DcaSchedule.twapBuy",c)}};var Pt=class{client;evmClient;constructor(t,e){this.client=t,this.evmClient=e}trade(t){return new ae(this.client,this.evmClient).setTrade(t)}order(t){return new se(this.client,this.evmClient).setOrder(t)}};async function ep(u){let t=new lt(u),e=new vt(u),[n,r]=await Promise.all([t.getBlockTime(),t.getMinOrderBudget()]),i=new pt(u,e).withAave().withOmnipool().withStableswap().withXyk(),s=new U(u),a=new Yt(u),o=new At(u),l=new tt(e),c=new gt(i),m=new yt(c,{blockTime:n,minBudgetInNative:r}),d=new Wt(a,s),p=new Ot(o,s,{blockTime:n});return{api:{aave:l,router:c,scheduler:m,staking:d,farm:p},client:{asset:new st(u),balance:s,evm:e},ctx:{pool:i},tx:new Pt(u,e),destroy:()=>{i.destroy()}}}export{We as aave,Le as api,f as big,Ke as client,qe as const,ep as createSdkContext,it as erc20,ze as error,Qe as evm,rn as farm,v as fmt,Jt as h160,Z as json,O as math,gn as pool,fn as sor,xn as staking,On as tx,Ve as xc};
@@ -2,6 +2,7 @@ import { EvmClient } from '../evm';
2
2
  export declare class AaveClient {
3
3
  private client;
4
4
  constructor(evm: EvmClient);
5
+ getBlockTimestamp(): Promise<number>;
5
6
  getReservesData(): Promise<readonly [readonly {
6
7
  underlyingAsset: `0x${string}`;
7
8
  name: string;
@@ -52,7 +52,11 @@ export declare class AaveUtils {
52
52
  * @returns aTokens max withdrawable balances
53
53
  */
54
54
  getMaxWithdrawAll(user: string): Promise<Record<number, Amount>>;
55
- private calculateHealthFactor;
56
- private calculateRequiredCollateral;
55
+ /**
56
+ * Calculate maxWithdraw using following formula:
57
+ *
58
+ * maxWithdraw = (HF - 1.01 x totalDebt) / reserveLT
59
+ */
57
60
  private calculateWithdrawMax;
61
+ private calculateLinearInterest;
58
62
  }
@@ -6,6 +6,7 @@ export type AaveSummary = {
6
6
  };
7
7
  export type AaveReserveData = {
8
8
  aTokenBalance: bigint;
9
+ availableLiquidity: bigint;
9
10
  decimals: number;
10
11
  isCollateral: boolean;
11
12
  priceInRef: bigint;
@@ -39,4 +39,5 @@ export type Farm = {
39
39
  poolId: string;
40
40
  distributedRewards: bigint;
41
41
  plannedYieldingPeriods: number;
42
+ minDeposit: bigint;
42
43
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@galacticcouncil/sdk-next",
3
- "version": "0.7.1-pr199-9b2819e",
3
+ "version": "0.7.1",
4
4
  "description": "Galactic next gen sdk (papi)",
5
5
  "author": "GalacticCouncil",
6
6
  "repository": {