@galacticcouncil/sdk-next 0.7.0-pr169-adc219c → 0.7.0-pr193-3d86320

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 jn=Object.create;var ie=Object.defineProperty;var zn=Object.getOwnPropertyDescriptor;var $n=Object.getOwnPropertyNames;var Qn=Object.getPrototypeOf,Jn=Object.prototype.hasOwnProperty;var ln=(u,t)=>()=>(u&&(t=u(u=0)),t);var x=(u,t)=>{for(var e in t)ie(u,e,{get:t[e],enumerable:!0})},se=(u,t,e,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let a of $n(t))!Jn.call(u,a)&&a!==e&&ie(u,a,{get:()=>t[a],enumerable:!(n=zn(t,a))||n.enumerable});return u},dt=(u,t,e)=>(se(u,t,"default"),e&&se(e,t,"default")),gt=(u,t,e)=>(e=u!=null?jn(Qn(u)):{},se(t||!u||!u.__esModule?ie(e,"default",{value:u,enumerable:!0}):e,u)),Zn=u=>se(ie({},"__esModule",{value:!0}),u);var Et={};var pn=ln(()=>{dt(Et,require("@polkadot-api/ws-provider/node"))});var kt={};var mn=ln(()=>{dt(kt,require("@polkadot-api/ws-provider/web"))});var Ba={};x(Ba,{aave:()=>De,api:()=>Se,big:()=>h,client:()=>Le,const:()=>Be,createSdkContext:()=>Aa,erc20:()=>st,error:()=>Ne,evm:()=>He,fmt:()=>C,h160:()=>Lt,json:()=>et,math:()=>O,pool:()=>je,sor:()=>en,staking:()=>nn,tx:()=>rn,xc:()=>ke});module.exports=Zn(Ba);var Se={};x(Se,{Papi:()=>k,getWs:()=>ta});var un=require("@galacticcouncil/descriptors");function cn(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(un.hydration)}log(t,...e){let n=typeof window>"u"?process.env.GC_DEBUG:window.localStorage.getItem("gc.debug");cn(n)&&console.log(t,...e)}};var dn=require("polkadot-api"),gn=require("polkadot-api/polkadot-sdk-compat"),ta=async u=>{let t=typeof u=="string"?u.split(","):u,a=(typeof window>"u"?(await Promise.resolve().then(()=>(pn(),Et))).getWsProvider:(await Promise.resolve().then(()=>(mn(),kt))).getWsProvider)(t);return(0,dn.createClient)((0,gn.withPolkadotSdkCompat)(a))};var De={};x(De,{AAVE_GAS_LIMIT:()=>xe,AAVE_LENDING_POOL_ADDRESS:()=>ce,AAVE_POOL_ABI:()=>Te,AAVE_POOL_DATA_PROVIDER:()=>le,AAVE_POOL_DATA_PROVIDER_ABI:()=>oe,AAVE_POOL_PROXY:()=>we,AAVE_ROUNDING_THRESHOLD:()=>Wa,AAVE_UINT_256_MAX:()=>ea,AaveClient:()=>Ct,AaveUtils:()=>it});var Te=[{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 oe=[{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 we="0x1b02E051683b5cfaC5929C25E84adb26ECf87B38",le="0x112b087b60C1a166130d59266363C45F8aa99db0",ce="0xf3Ba4D1b50f78301BDD7EAEa9B67822A15FCA691",xe=1000000n,Wa=5,ea=BigInt("0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");var Ct=class{client;constructor(t){this.client=t.getWsProvider()}async getReservesData(){return await this.client.readContract({abi:oe,address:le,args:[ce],functionName:"getReservesData"})}async getUserReservesData(t){return await this.client.readContract({abi:oe,address:le,args:[ce,t],functionName:"getUserReservesData"})}async getUserAccountData(t){return await this.client.readContract({abi:Te,address:we,args:[t],functionName:"getUserAccountData"})}};var h={};x(h,{asBigInt:()=>ra,toBigInt:()=>aa,toDecimal:()=>na});var tt=gt(require("big.js"));tt.default.NE=-18;function na(u,t,e=6,n){let a=(0,tt.default)(u.toString()),r=(0,tt.default)(10).pow(t);return a.div(r).round(e,n).toString()}function aa(u,t){let e=(0,tt.default)(10).pow(t),a=(0,tt.default)(u).mul(e).toFixed(0,tt.default.roundDown);return BigInt(a)}function ra(u){return BigInt(u.round(0,tt.default.roundDown).toFixed(0))}var st={};x(st,{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 C={};x(C,{FeeUtils:()=>_e,shiftNeg:()=>Mt});var bn=gt(require("big.js"));var Be={};x(Be,{HUB_ASSET_ID:()=>Ae,HYDRATION_OMNIPOOL_ADDRESS:()=>ia,HYDRATION_PARACHAIN_ID:()=>sa,HYDRATION_SS58_PREFIX:()=>q,PERBILL_DENOMINATOR:()=>ve,PERMILL_DENOMINATOR:()=>Dt,RUNTIME_DECIMALS:()=>B,SYSTEM_ASSET_DECIMALS:()=>Oe,SYSTEM_ASSET_ID:()=>Y,TRADEABLE_DEFAULT:()=>bt});var B=18,Dt=1e6,ve=1e9,Y=0,Oe=12,sa=2034,q=63,ia="7L53bUTBbfuj14UpdCNPwmgzzHSsrsTWBHX5pys32mVWM3C1",Ae=1,bt=15;var _e=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 a=10**n;return Math.round(t*a/e)/a}static safeRound(t){return parseFloat(t.toPrecision(15))}};function Mt(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 Lt={};x(Lt,{H160:()=>Ee,isEvmAccount:()=>yn,isEvmAddress:()=>hn,isSs58Address:()=>Pn});var yt=require("polkadot-api"),Re=require("@polkadot-api/utils"),Q=require("buffer");var Fe="ETH\0";function yn(u){if(!u)return!1;try{let t=(0,yt.AccountId)().enc(u),e=Q.Buffer.from(Fe);return Q.Buffer.from(t.subarray(0,e.length)).equals(e)}catch{return!1}}function hn(u){return!!/^0x[a-fA-F0-9]{40}$/.test(u)}function Pn(u){try{return(0,yt.AccountId)(63).enc(u),!0}catch{return!1}}var Ee=class u{static toAccount=t=>{let e=Q.Buffer.from(t.slice(2),"hex"),n=Q.Buffer.from(Fe),a=Uint8Array.from(Q.Buffer.concat([n,e,Q.Buffer.alloc(8)])),r=(0,Re.toHex)(a);return(0,yt.AccountId)(63).dec(r)};static fromAccount=t=>{let e=(0,yt.AccountId)().enc(t),n=Q.Buffer.from(Fe),a=e.slice(n.length,-8);return"0x"+Q.Buffer.from(a).toString("hex")};static fromSS58=t=>{let n=(0,yt.AccountId)().enc(t).slice(0,20);return(0,Re.toHex)(n)};static fromAny=t=>{if(hn(t))return t;if(yn(t))return u.fromAccount(t);if(Pn(t))return u.fromSS58(t);throw new Error("Unknown address type")}};var et={};x(et,{findNestedKey:()=>oa,findNestedObj:()=>la,jsonFormatter:()=>ca});var oa=(u,t)=>{let e=[];return JSON.stringify(u,(n,a)=>(a&&a[t]&&e.push(a),a)),e[0]},la=(u,t,e)=>{let n;return JSON.stringify(u,(a,r)=>(r&&r[t]===e&&(n=r),r)),n},ca=(u,t)=>typeof t=="bigint"?t.toString():t;var O={};x(O,{calculateBuyFee:()=>da,calculateDiffToAvg:()=>ua,calculateDiffToRef:()=>pa,calculateSellFee:()=>ma,getFraction:()=>ga});var K=gt(require("big.js"));function ua(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 pa(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 ma(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 da(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 ga(u,t,e=2){(t<.01||t>100)&&new Error("Supported range is from 0.01% - 100%");let n=Math.pow(10,e),a=BigInt(t*n);return u*a/BigInt(100*n)}var ke={};x(ke,{convertToId:()=>ba});var fn=require("buffer");function ba(u){let e=fn.Buffer.from(u.replace("0x",""),"hex").subarray(16);return e.readUIntBE(0,e.length)}var{ERC20:ue}=st,{H160:Ce}=Lt,ya=1.01,ha=99999,Pa=10n**27n,fa=10n**18n,it=class{client;constructor(t){this.client=new Ct(t)}async getSummary(t){let e=Ce.fromAny(t),[n,a,r]=await Promise.all([this.client.getReservesData(),this.client.getUserReservesData(e),this.client.getUserAccountData(e)]),[i]=n,[s,o]=a,[l,c,p,d,m,g]=r,y=h.toDecimal(g,18),b=[];for(let P of s){let f=P.underlyingAsset.toLowerCase(),S=i.find(({underlyingAsset:rt})=>rt.toLowerCase()===f);if(!S)throw new Error("Missing pool reserve for "+f);let v=P.scaledATokenBalance,L=S.liquidityIndex,N=S.priceInMarketReferenceCurrency,D=v*L/Pa,W=Number(o===S.eModeCategoryId?S.eModeLiquidationThreshold:S.reserveLiquidationThreshold)/1e4,Z=S.usageAsCollateralEnabled&&P.usageAsCollateralEnabledOnUser&&P.scaledATokenBalance>0n,Rt=ue.toAssetId(f);b.push({aTokenBalance:D,decimals:Number(S.decimals),isCollateral:Z,priceInRef:N,reserveId:Rt,reserveAsset:f,reserveLiquidationThreshold:W})}return{healthFactor:Number(y),totalCollateral:l,totalDebt:c,reserves:b}}async hasBorrowPositions(t){let e=Ce.fromAny(t),n=await this.client.getUserAccountData(e),[a,r]=n;return r>0n}async getHealthFactor(t){let e=Ce.fromAny(t),n=await this.client.getUserAccountData(e),[a,r,i,s,o,l]=n,c=h.toDecimal(l,18);return Number(c)}async getHealthFactorAfterWithdraw(t,e,n){let{totalCollateral:a,totalDebt:r,reserves:i}=await this.getSummary(t),s=ue.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:p,reserveLiquidationThreshold:d}=o,m=h.toBigInt(n,l),g=c?m*p/10n**BigInt(l):0n,y=a-g;return y<=0n?0:this.calculateHealthFactor(y,d,r)}async getHealthFactorAfterSupply(t,e,n){let{totalCollateral:a,totalDebt:r,reserves:i}=await this.getSummary(t),s=ue.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:p}=o,m=h.toBigInt(n,l)*c/10n**BigInt(l),g=a+m;return g<=0n?0:this.calculateHealthFactor(g,p,r)}async getMaxWithdraw(t,e){let{totalCollateral:n,totalDebt:a,reserves:r}=await this.getSummary(t),i=ue.fromAssetId(e),s=r.find(o=>o.reserveAsset===i);if(!s)throw new Error("Missing reserve ctx for "+i);return this.calculateWithdrawMax(s,n,a)}async getMaxWithdrawAll(t){let{totalCollateral:e,totalDebt:n,reserves:a}=await this.getSummary(t),r={};for(let i of a){let s=this.calculateWithdrawMax(i,e,n);i.reserveId&&(r[i.reserveId]=s)}return r}calculateHealthFactor(t,e,n){if(n===0n)return ha;let a=10n**6n,r=h.toBigInt(e,18),i=t*r*a,s=n*fa,o=i/s;return Number(o)/1e6}calculateRequiredCollateral(t,e,n){let a=h.toBigInt(t,18),r=h.toBigInt(e,18);return(a*n+r-1n)/r}calculateWithdrawMax(t,e,n){let{aTokenBalance:a,decimals:r,priceInRef:i,reserveLiquidationThreshold:s}=t,o=this.calculateRequiredCollateral(ya,s,n),l=e-o;if(l<=0n)return{amount:0n,decimals:r};let c=l*10n**BigInt(r)/i;return{amount:a<c?a:c,decimals:r}}};var Le={};x(Le,{AssetClient:()=>ht,BalanceClient:()=>G,ChainParams:()=>Pt,LiquidityMining:()=>pe});var ht=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:a})=>{let[r]=n;return[r,a]}))}async queryBonds(){let e=await this.api.query.Bonds.Bonds.getEntries();return new Map(e.map(({keyArgs:n,value:a})=>{let[r]=n;return[r,a]}))}async queryAssets(){let e=await this.api.query.AssetRegistry.Assets.getEntries();return new Map(e.filter(({value:n})=>{let{asset_type:a}=n;return this.SUPPORTED_TYPES.includes(a.type)}).map(({keyArgs:n,value:a})=>{let[r]=n;return[r,a]}))}async queryAssetLocations(){let e=await this.api.query.AssetRegistry.AssetLocations.getEntries();return new Map(e.map(({keyArgs:n,value:a})=>{let[r]=n;return[r,a]}))}async mapToken(t,e,n,a){let{name:r,asset_type:i,is_sufficient:s,existential_deposit:o}=e,{symbol:l,decimals:c}=n.get(t)??{};return{id:t,name:r?.asText(),symbol:l,decimals:c,icon:l,type:i.type,isSufficient:s,location:a,existentialDeposit:o}}async mapBond(t,e,n,a){let[r,i]=a,{asset_type:s,is_sufficient:o,existential_deposit:l}=e,{symbol:c,decimals:p}=await this.mapToken(r,e,n),d=Number(i),m=new Intl.DateTimeFormat("en-GB"),g=[c,"Bond",m.format(d)].join(" ");return{id:t,name:g,symbol:c+"b",decimals:p,icon:c,type:s.type,isSufficient:o,existentialDeposit:l,underlyingAssetId:r,maturity:d}}async mapShares(t,e,n,a){let{assets:r}=a,{name:i,symbol:s,asset_type:o,is_sufficient:l,existential_deposit:c}=e,p=await Promise.all(r.map(async g=>{let{symbol:y}=await this.mapToken(g,e,n);return[g,y]})),d=Object.fromEntries(p),m=Object.values(d);return{id:t,name:m.join(", "),symbol:s?.asText()||i?.asText(),decimals:18,icon:m.join("/"),type:o.type,isSufficient:l,existentialDeposit:c,meta:d}}async mapExternal(t,e,n,a){let r=await this.mapToken(t,e,new Map,a),i=n?.find(s=>s.internalId===r.id);return i?{...r,decimals:i.decimals,name:i.name,symbol:i.symbol,icon:i.symbol,isWhiteListed:i.isWhiteListed}:r}parseMetadata(t){return new Map(Array.from(t,([e,n])=>[e,{symbol:n.symbol?.asText(),decimals:n.decimals}]))}async getOnChainAssets(t,e){let[n,a,r,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 p=a.get(l),{asset_type:d}=c,m;switch(d.type){case"Bond":let g=i.get(l);m=await this.mapBond(l,c,s,g);break;case"StableSwap":let y=r.get(l);m=await this.mapShares(l,c,s,y);break;case"External":m=await this.mapExternal(l,c,e,p);break;default:m=await this.mapToken(l,c,s,p)}o.push(m)}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 w=require("rxjs");var G=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 a=await this.api.query.Tokens.Accounts.getValue(t,e);return this.calculateBalance(a)}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),a=this.subscribeErc20Balance(t);return(0,w.combineLatest)([e,n,a]).pipe((0,w.debounceTime)(250),(0,w.map)(r=>r.flat()),(0,w.startWith)([]),(0,w.bufferCount)(2,1),(0,w.map)(([r,i],s)=>{if(s===0)return i;let o=r.reduce((c,p)=>(c.set(p.id,p.balance),c),new Map);return i.filter(c=>!Sn(c.balance,o.get(c.id)))}))}subscribeSystemBalance(t){return this.api.query.System.Account.watchValue(t,"best").pipe((0,w.map)(n=>({id:0,balance:this.calculateBalance(n.data)})))}subscribeTokenBalance(t,e){return this.api.query.Tokens.Accounts.watchValue(t,e,"best").pipe((0,w.map)(a=>({id:e,balance:a})))}subscribeTokensBalance(t){return this.api.query.Tokens.Accounts.watchEntries(t,{at:"best"}).pipe((0,w.distinctUntilChanged)((n,a)=>!a.deltas),(0,w.map)(({deltas:n})=>{let a=[];return n?.deleted.forEach(r=>{let[i,s]=r.args;a.push({id:s,balance:this.calculateBalance({free:0n,reserved:0n,frozen:0n})})}),n?.upserted.forEach(r=>{let[i,s]=r.args;a.push({id:s,balance:this.calculateBalance(r.value)})}),a}))}subscribeErc20Balance(t,e){let n=new w.Subject,a=n.pipe((0,w.shareReplay)(1)),r=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 r(),l=async()=>{let d=(await Promise.all(o.map(async m=>{let g=await this.getTokenBalanceData(t,m);return[m,g]}))).map(([m,g])=>({id:m,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),a.pipe((0,w.finalize)(()=>s?.()),(0,w.pairwise)(),(0,w.map)(([o,l],c)=>{if(c===0)return l;let p=o.reduce((m,g)=>(m.set(g.id,g.balance),m),new Map);return l.filter(m=>!Sn(m.balance,p.get(m.id)))}),(0,w.distinctUntilChanged)((o,l)=>l.length===0))}async getTokenBalanceData(t,e){let n=await this.api.apis.CurrenciesApi.account(e,t);return this.calculateBalance(n)}},Sn=(u,t)=>u!==void 0&&t!==void 0&&u.transferable===t.transferable&&u.total===t.total;var Pt=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 ft=require("polkadot-api"),Me=require("@galacticcouncil/math-liquidity-mining"),M=gt(require("big.js"));var Sa=BigInt((0,M.default)(1).pow(18).toString()),Ta=6,pe=class extends k{balanceClient;omnipoolAssetIds=[];secondsInYear=(0,M.default)(365.2425).times(24).times(60).times(60);constructor(t){super(t),this.balanceClient=new G(t)}async getOraclePrice(t,e){let n=[t,e].sort((r,i)=>r-i);if(t===e)return Sa;let a=await this.api.query.EmaOracle.Oracles.getValue(ft.Binary.fromText("omnipool"),n,(0,ft.Enum)("TenMinutes"));if(a){let{n:r,d:i}=a[0].price,s;return t<e?s=(0,Me.fixed_from_rational)(r.toString(),i.toString()):s=(0,Me.fixed_from_rational)(i.toString(),r.toString()),BigInt(s)}}getFarmAddress=(t,e)=>{let n=Buffer.from("modl","utf-8"),a=Buffer.from(e?"78796b4c4d704944":"4f6d6e6957684c4d","hex"),r=Buffer.from([t]),i=Buffer.concat([n,a,r]),o="0x"+Buffer.concat([i,Buffer.alloc(32-i.length)]).toString("hex");return(0,ft.AccountId)(63).dec(o)};getGlobalRewardPerPeriod(t,e,n,a){let r=(0,M.default)(a).times(t.toString()).times(e.toString()).div(18);return r.gte(n.toString())?n.toString():r.toString()}getPoolYieldPerPeriod(t,e,n,a){let r=(0,M.default)(t.toString()).times(e),i=(0,M.default)(n.toString()).times(a);return r.div(i.toString()).toString()}farmData(t,e,n){let{yieldFarm:a,globalFarm:r,priceAdjustment:i,balance:s}=t,{multiplier:o,loyalty_curve:l}=a,{blocks_per_period:c,yield_per_period:p,total_shares_z:d,max_reward_per_period:m,pending_rewards:g,accumulated_paid_rewards:y,planned_yielding_periods:b,updated_at:P,incentivized_asset:f,reward_currency:S,price_adjustment:v}=r,L=Mt(i??v,18),N=Mt(o,18),D=Mt(l?.initial_reward_percentage??0,18),V=this.secondsInYear.div((0,M.default)(Ta).times(c)).toString(),W;if(d<0)W=(0,M.default)(N).times(p.toString()).times(V).toString();else{let Xn=this.getGlobalRewardPerPeriod(d,p,m,L),Kn=this.getPoolYieldPerPeriod(Xn,N,d,L);W=(0,M.default)(Kn).times(V).toString()}let Z=g+y,Rt=m*BigInt(b),rt=s.transferable+Z,fe=rt-Z,Ft=(0,M.default)(fe.toString()).div(m.toString()),sn=(0,M.default)(e).div(c.toString()).toString(),Vn=(d>=0?Ft.plus(P):Ft.plus(sn)).toString(),Wn=(0,M.default)(d.toString()).div((0,M.default)(m.toString()).div(p.toString())).div(Math.pow(10,18)).times(100).times(L).toFixed(2),on=(0,M.default)(Z.toString()).div(rt.toString()).gte(.999);W=on?"0":(0,M.default)(W).div(n?2:1).times(100).toString();let Yn=D?(0,M.default)(W).times(D).toString():void 0;return{apr:W,minApr:Yn,isDistributed:on,estimatedEndPeriod:Vn,maxRewards:Rt,incentivizedAsset:f,rewardCurrency:S,loyaltyCurve:l,currentPeriod:sn,potMaxRewards:rt,fullness:Wn}}async getOmnipoolFarms(t){let e=await this.api.query.OmnipoolWarehouseLM.ActiveYieldFarm.getEntries(Number(t)),a=(await this.api.query.ParachainSystem.ValidationData.getValue())?.relay_parent_number,r=await Promise.all(e.map(async({keyArgs:i,value:s})=>{let[,o]=i,l=s,c=await this.api.query.OmnipoolWarehouseLM.GlobalFarm.getValue(o),p=await this.api.query.OmnipoolWarehouseLM.YieldFarm.getValue(Number(t),o,l);if(!c||!p)return;let d=c.reward_currency,m=c.incentivized_asset,g=this.getFarmAddress(o),y=await this.getOraclePrice(d,m),b=await this.balanceClient.getTokenBalance(g,d);return{id:t,globalFarm:c,yieldFarm:p,priceAdjustment:y,balance:b}}));return a?r.map(i=>i?this.farmData(i,a):void 0):[]}async getIsolatedFarms(t){let e=await this.api.query.XYKWarehouseLM.ActiveYieldFarm.getEntries(t),a=(await this.api.query.ParachainSystem.ValidationData.getValue())?.relay_parent_number,r=await Promise.all(e.map(async({keyArgs:i,value:s})=>{let[,o]=i,l=s,c=await this.api.query.XYKWarehouseLM.GlobalFarm.getValue(o),p=await this.api.query.XYKWarehouseLM.YieldFarm.getValue(t,o,l);if(!c||!p)return;let d=c.reward_currency,m=c.incentivized_asset,g=this.getFarmAddress(o,!0),y=await this.getOraclePrice(d,m),b=await this.balanceClient.getBalance(g,d);return{id:t,globalFarm:c,yieldFarm:p,priceAdjustment:y,balance:b,farmAddress:g}}));return a?r.map(i=>i?this.farmData(i,a,!0):void 0):[]}};var Ne={};x(Ne,{AssetNotFound:()=>qe,PoolNotFound:()=>qt,RouteNotFound:()=>Nt});var qe=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 He={};x(He,{EvmClient:()=>Gt,createChain:()=>Ge});var Tn=require("viem"),wa=["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=()=>(0,Tn.defineChain)({id:222222,name:"Hydration",network:"hydration",nativeCurrency:{decimals:18,name:"WETH",symbol:"WETH"},rpcUrls:{default:{http:wa}},blockExplorers:{default:{name:"Hydration Explorer",url:"https://explorer.evm.hydration.cloud"}},testnet:!1});var j=require("viem");var Gt=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(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 je={};x(je,{PoolContextProvider:()=>It,PoolError:()=>ot,PoolFactory:()=>xt,PoolType:()=>F,aave:()=>Ke,lbp:()=>Ve,omni:()=>We,stable:()=>Ye,xyk:()=>Xe});var Ve={};x(Ve,{LbpMath:()=>X,LbpPool:()=>Ht,LbpPoolClient:()=>Vt});var z=require("@galacticcouncil/math-lbp"),X=class{static getSpotPrice(t,e,n,a,r){return(0,z.get_spot_price)(t,e,n,a,r)}static calculateInGivenOut(t,e,n,a,r){return(0,z.calculate_in_given_out)(t,e,n,a,r)}static calculateOutGivenIn(t,e,n,a,r){return(0,z.calculate_out_given_in)(t,e,n,a,r)}static calculateLinearWeights(t,e,n,a,r){return(0,z.calculate_linear_weights)(t,e,n,a,r)}static calculatePoolTradeFee(t,e,n){return(0,z.calculate_pool_trade_fee)(t,e,n)}};var F=(r=>(r.Aave="Aave",r.LBP="LBP",r.Omni="Omnipool",r.Stable="Stableswap",r.XYK="XYK",r))(F||{}),ot=(r=>(r.InsufficientTradingAmount="InsufficientTradingAmount",r.MaxInRatioExceeded="MaxInRatioExceeded",r.MaxOutRatioExceeded="MaxOutRatioExceeded",r.TradeNotAllowed="TradeNotAllowed",r.UnknownError="UnknownError",r))(ot||{});var{FeeUtils:wn}=C,Ht=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,a,r,i,s){this.type="LBP",this.address=t,this.tokens=e,this.maxInRatio=n,this.maxOutRatio=a,this.minTradingLimit=r,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])),a=n.get(t),r=n.get(e);if(a==null)throw new Error("Pool does not contain tokenIn");if(r==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,balanceIn:a.balance,balanceOut:r.balance,decimalsIn:a.decimals,decimalsOut:r.decimals,weightIn:a.weight,weightOut:r.weight}}validateAndBuy(t,e,n){let a=this.tokens[0].id,r=[];e<this.minTradingLimit&&r.push("InsufficientTradingAmount");let i=t.balanceOut/this.maxOutRatio;if(e>i&&r.push("MaxOutRatioExceeded"),a===t.assetOut){let s=this.calculateTradeFee(e,n),o=wn.toPct(this.repayFeeApply?n.repayFee:n.exchangeFee),l=e+s,c=this.calculateInGivenOut(t,l),p=t.balanceIn/this.maxInRatio;return c>p&&r.push("MaxInRatioExceeded"),{amountIn:c,calculatedIn:c,amountOut:e,feePct:o,errors:r}}else{let s=this.calculateInGivenOut(t,e),o=t.balanceIn/this.maxInRatio;return s>o&&r.push("MaxInRatioExceeded"),{amountIn:s,calculatedIn:s,amountOut:e,feePct:0,errors:r}}}validateAndSell(t,e,n){let a=this.tokens[0].id,r=[];e<this.minTradingLimit&&r.push("InsufficientTradingAmount");let i=t.balanceIn/this.maxInRatio;if(e>i&&r.push("MaxInRatioExceeded"),a===t.assetIn){let s=this.calculateOutGivenIn(t,e),o=t.balanceOut/this.maxOutRatio;return s>o&&r.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:s,amountOut:s,feePct:0,errors:r}}else{let s=this.calculateOutGivenIn(t,e),o=this.calculateTradeFee(s,n),l=wn.toPct(this.repayFeeApply?n.repayFee:n.exchangeFee),c=s-o,p=t.balanceOut/this.maxOutRatio;return c>p&&r.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:s,amountOut:c,feePct:l,errors:r}}}calculateInGivenOut(t,e){let n=X.calculateInGivenOut(t.balanceIn.toString(),t.balanceOut.toString(),t.weightIn.toString(),t.weightOut.toString(),e.toString()),a=BigInt(n);return a<0n?0n:a}calculateOutGivenIn(t,e){let n=X.calculateOutGivenIn(t.balanceIn.toString(),t.balanceOut.toString(),t.weightIn.toString(),t.weightOut.toString(),e.toString()),a=BigInt(n);return a<0n?0n:a}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 In=require("polkadot-api"),lt=require("rxjs");var xn=(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 Ue=[{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 Ut=class{client;constructor(t){this.client=t.getWsProvider()}async getData(t,e=6){let[n,a,r]=await Promise.all([this.client.readContract({abi:Ue,address:t,functionName:"latestRoundData"}),this.client.readContract({abi:Ue,address:t,functionName:"decimals"}),this.client.getBlock()]),[i,s,o,l]=n,c=r.number-(r.timestamp-l)/BigInt(e),p=Number(c);return{price:s,decimals:a,updatedAt:p<0?0:p}}};var H=class extends G{evm;mmOracle;override=[];mem=0;memPools=xn(t=>(this.log(this.getPoolType(),"mem pools",t,"\u2705"),this.loadPools()));constructor(t,e){super(t),this.evm=e,this.mmOracle=new Ut(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,a])=>this.updatePool(n,a))))}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(r=>r.type==="Erc20").map(r=>r.id),a=this.subscribeErc20Balance(t.address,n);e.push(a)}return(0,I.combineLatest)(e).pipe((0,I.map)(n=>n.map(a=>Array.isArray(a)?a:[a]).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:a})=>{let r=this.override.find(s=>s.id===e),i=!!n||!!r?.decimals;return a>0n&&i})}updatePool=(t,e)=>{let n=t.tokens.map(a=>{let r=e.find(s=>s.id===a.id),i=this.override.find(s=>s.id===a.id);return r?{...a,balance:r.balance.transferable,decimals:a.decimals||i?.decimals}:{...a,decimals:a.decimals||i?.decimals}});return{...t,tokens:n}}};var Vt=class extends H{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()]),a=e?.relay_parent_number||0,r=t.filter(({value:i})=>e&&this.isActivePool(i,a)).map(async({keyArgs:i,value:s})=>{let[o]=i,l=o.toString(),c=await this.getPoolDelta(l,s,a);return{address:l,type:"LBP",fee:s.fee,...c,...n}});return Promise.all(r)}async getPoolDelta(t,e,n){let{start:a,end:r,assets:i,initial_weight:s,final_weight:o,repay_target:l,fee_collector:c}=e,p=X.calculateLinearWeights(a?a.toString():"0",r?r.toString():"0",s.toString(),o.toString(),n.toString()),[d,m]=i,g=BigInt(p),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,m),this.api.query.AssetRegistry.Assets.getValue(m)]);return{repayFeeApply:b,tokens:[{id:d,decimals:f?.decimals,existentialDeposit:f?.existential_deposit,balance:P.transferable,weight:g,type:f?.asset_type.type},{id:m,decimals:v?.decimals,existentialDeposit:v?.existential_deposit,balance:S.transferable,weight:y,type:v?.asset_type.type}]}}isActivePool(t,e){let{start:n,end:a}=t;return n&&a?e>=n&&e<a:!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(In.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,lt.switchMap)(a=>a?this.getPoolDelta(t.address,n,a.relay_parent_number):(0,lt.of)(t)),(0,lt.map)(a=>Object.assign({},t,a))):(0,lt.of)(t)}};var We={};x(We,{OmniMath:()=>A,OmniPool:()=>Wt,OmniPoolClient:()=>Xt});var T=require("@galacticcouncil/math-omnipool"),ct=gt(require("big.js")),A=class{static calculateSpotPrice(t,e,n,a){return(0,T.calculate_spot_price)(t,e,n,a)}static calculateLrnaSpotPrice(t,e){return(0,T.calculate_lrna_spot_price)(t,e)}static calculateInGivenOut(t,e,n,a,r,i,s,o,l){return(0,T.calculate_in_given_out)(t,e,n,a,r,i,s,o,l)}static calculateLrnaInGivenOut(t,e,n,a,r){return(0,T.calculate_lrna_in_given_out)(t,e,n,a,r)}static calculateOutGivenIn(t,e,n,a,r,i,s,o,l){return(0,T.calculate_out_given_in)(t,e,n,a,r,i,s,o,l)}static calculateOutGivenLrnaIn(t,e,n,a,r){return(0,T.calculate_out_given_lrna_in)(t,e,n,a,r)}static calculateShares(t,e,n,a){return(0,T.calculate_shares)(t,e,n,a)}static calculateLiquidityOut(t,e,n,a,r,i,s,o){return(0,T.calculate_liquidity_out)(t,e,n,a,r,i,s,o)}static calculateLiquidityLRNAOut(t,e,n,a,r,i,s,o){return(0,T.calculate_liquidity_lrna_out)(t,e,n,a,r,i,s,o)}static calculateCapDifference(t,e,n,a){let r=(0,ct.default)(e),i=(0,ct.default)(t),s=(0,ct.default)(a),o=(0,ct.default)(n),l=(0,ct.default)(10).pow(18),c=o.div(l);if(r.div(s).lt(c)){let d=c.times(s).minus(r).times(i),m=r.times((0,ct.default)(1).minus(c));return d.div(m).toFixed(0)}else return"0"}static verifyAssetCap(t,e,n,a){return(0,T.verify_asset_cap)(t,e,n,a)}static calculateLimitHubIn(t,e,n,a){return(0,T.calculate_liquidity_hub_in)(t,e,n,a)}static isSellAllowed(t){return(0,T.is_sell_allowed)(t)}static isBuyAllowed(t){return(0,T.is_buy_allowed)(t)}static isAddLiquidityAllowed(t){return(0,T.is_add_liquidity_allowed)(t)}static isRemoveLiquidityAllowed(t){return(0,T.is_remove_liquidity_allowed)(t)}};var{FeeUtils:St}=C,Wt=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,a,r,i){this.type="Omnipool",this.address=t,this.tokens=e,this.maxInRatio=n,this.maxOutRatio=a,this.minTradingLimit=r,this.hubAssetId=i}validatePair(t,e){return this.hubAssetId!=e}parsePair(t,e){let n=new Map(this.tokens.map(i=>[i.id,i])),a=n.get(t),r=n.get(e);if(a==null)throw new Error("Pool does not contain tokenIn");if(r==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,hubReservesIn:a.hubReserves,hubReservesOut:r.hubReserves,sharesIn:a.shares,sharesOut:r.shares,decimalsIn:a.decimals,decimalsOut:r.decimals,balanceIn:a.balance,balanceOut:r.balance,tradeableIn:a.tradeable,tradeableOut:r.tradeable,assetInEd:a.existentialDeposit,assetOutEd:r.existentialDeposit}}validateAndBuy(t,e,n){let a=this.calculateInGivenOut(t,e),r=this.calculateInGivenOut(t,e,n),i=a===0n?0:O.calculateDiffToRef(r,a),s=[],o=A.isSellAllowed(t.tradeableIn),l=A.isBuyAllowed(t.tradeableOut);(!o||!l)&&s.push("TradeNotAllowed"),(e<this.minTradingLimit||a<t.assetInEd)&&s.push("InsufficientTradingAmount");let c=t.balanceOut/this.maxOutRatio;e>c&&s.push("MaxOutRatioExceeded");let p=t.balanceIn/this.maxInRatio;return r>p&&s.push("MaxInRatioExceeded"),{amountIn:r,calculatedIn:a,amountOut:e,feePct:i,errors:s}}validateAndSell(t,e,n){let a=this.calculateOutGivenIn(t,e),r=this.calculateOutGivenIn(t,e,n),i=O.calculateDiffToRef(a,r),s=[],o=A.isSellAllowed(t.tradeableIn),l=A.isBuyAllowed(t.tradeableOut);(!o||!l)&&s.push("TradeNotAllowed"),(e<this.minTradingLimit||a<t.assetOutEd)&&s.push("InsufficientTradingAmount");let c=t.balanceIn/this.maxInRatio;e>c&&s.push("MaxInRatioExceeded");let p=t.balanceOut/this.maxOutRatio;return r>p&&s.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:a,amountOut:r,feePct:i,errors:s}}calculateInGivenOut(t,e,n){if(t.assetIn==this.hubAssetId)return this.calculateLrnaInGivenOut(t,e,n);let a=A.calculateInGivenOut(t.balanceIn.toString(),t.hubReservesIn.toString(),t.sharesIn.toString(),t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),n?St.toRaw(n.assetFee).toString():"0",n?St.toRaw(n.protocolFee).toString():"0"),r=BigInt(a);return r<0n?0n:r}calculateLrnaInGivenOut(t,e,n){let a=A.calculateLrnaInGivenOut(t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),n?St.toRaw(n.assetFee).toString():"0"),r=BigInt(a);return r<0n?0n:r}calculateOutGivenIn(t,e,n){if(t.assetIn==this.hubAssetId)return this.calculateOutGivenLrnaIn(t,e,n);let a=A.calculateOutGivenIn(t.balanceIn.toString(),t.hubReservesIn.toString(),t.sharesIn.toString(),t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),n?St.toRaw(n.assetFee).toString():"0",n?St.toRaw(n.protocolFee).toString():"0"),r=BigInt(a);return r<0n?0n:r}calculateOutGivenLrnaIn(t,e,n){let a=A.calculateOutGivenLrnaIn(t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),n?St.toRaw(n.assetFee).toString():"0"),r=BigInt(a);return r<0n?0n:r}spotPriceInGivenOut(t){if(t.assetIn==this.hubAssetId)return this.spotPriceLrnaInGivenOut(t);let e=A.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=A.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=A.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=A.calculateLrnaSpotPrice(t.balanceOut.toString(),t.hubReservesOut.toString()),n=Math.pow(10,18-t.decimalsIn);return BigInt(e)/BigInt(n)}};var me=require("polkadot-api"),vn=require("@polkadot-api/utils"),Yt=require("rxjs");var{FeeUtils:nt}=C,Xt=class extends H{async loadPools(){let t=await this.api.constants.Omnipool.HubAssetId(),e=this.getPoolAddress(),[n,a,r,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:p})=>{let[d]=c,{hub_reserve:m,shares:g,tradable:y,cap:b,protocol_shares:P}=p,[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:m,protocolShares:P,shares:g,tradeable:y,type:f?.asset_type.type}}),l=await Promise.all(o);return l.push({id:t,decimals:r?.decimals,existentialDeposit:r?.existential_deposit,balance:i.transferable,tradeable:a,type:r?.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,vn.toHex)(e);return(0,me.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,a,r]=await Promise.all([this.api.constants.DynamicFees.AssetFeeParameters(),this.api.constants.DynamicFees.ProtocolFeeParameters(),this.api.query.DynamicFees.AssetFee.getValue(e)]),i=n.min_fee+a.min_fee,s=n.max_fee+a.max_fee;if(r){let{asset_fee:o,protocol_fee:l}=r;return{assetFee:nt.fromPermill(o),protocolFee:nt.fromPermill(l),min:nt.fromPermill(i),max:nt.fromPermill(s)}}else return{assetFee:nt.fromPermill(n.min_fee),protocolFee:nt.fromPermill(a.min_fee),min:nt.fromPermill(i),max:nt.fromPermill(s)}}getPoolType(){return"Omnipool"}async isSupported(){let t=this.api.query.Omnipool.Assets,e=await this.api.compatibilityToken;return t.isCompatible(me.CompatibilityLevel.BackwardsCompatible,e)}subscribePoolChange(t){return this.api.query.Omnipool.Assets.watchEntries({at:"best"}).pipe((0,Yt.distinctUntilChanged)((n,a)=>!a.deltas),(0,Yt.map)(({entries:n})=>n.map(a=>{let[r]=a.args,{hub_reserve:i,shares:s,tradable:o,cap:l,protocol_shares:c}=a.value,p=t.tokens.findIndex(m=>m.id===r);return{...t.tokens[p],cap:l,hubReserves:i,protocolShares:c,shares:s,tradeable:o}})),(0,Yt.map)(n=>{let a=t.tokens.find(r=>r.id===1);return{...t,tokens:[...n,a]}}))}};var Ye={};x(Ye,{StableMath:()=>E,StableSwap:()=>Kt,StableSwapClient:()=>jt});var _=require("@galacticcouncil/math-stableswap"),E=class{static getPoolAddress(t){return(0,_.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,a,r){return(0,_.calculate_amplification)(t,e,n,a,r)}static calculateInGivenOut(t,e,n,a,r,i,s){return(0,_.calculate_in_given_out)(t,e,n,a,r,i,s)}static calculateAddOneAsset(t,e,n,a,r,i,s){return(0,_.calculate_add_one_asset)(t,e,n,a,r,i,s)}static calculateSharesForAmount(t,e,n,a,r,i,s){return(0,_.calculate_shares_for_amount)(t,e,n,a,r,i,s)}static calculateOutGivenIn(t,e,n,a,r,i,s){return(0,_.calculate_out_given_in)(t,e,n,a,r,i,s)}static calculateLiquidityOutOneAsset(t,e,n,a,r,i,s){return(0,_.calculate_liquidity_out_one_asset)(t,e,n,a,r,i,s)}static calculateShares(t,e,n,a,r,i){return(0,_.calculate_shares)(t,e,n,a,r,i)}static calculateSpotPriceWithFee(t,e,n,a,r,i,s,o){return(0,_.calculate_spot_price_with_fee)(t,e,n,a,r,i,s,o)}static recalculatePegs(t,e,n,a,r){let i=(0,_.recalculate_peg)(t,e,n,a,r);return JSON.parse(i)}};var{FeeUtils:at}=C,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,a,r,i,s,o,l){this.type="Stableswap",this.address=t,this.tokens=e,this.maxInRatio=n,this.maxOutRatio=a,this.minTradingLimit=r,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])),a=n.get(t),r=n.get(e);if(a==null)throw new Error("Pool does not contain tokenIn");if(r==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,balanceIn:a.balance,balanceOut:r.balance,decimalsIn:a.decimals,decimalsOut:r.decimals,tradeableIn:this.id===t?15:a.tradeable,tradeableOut:this.id===e?15:r.tradeable,assetInEd:a.existentialDeposit,assetOutEd:r.existentialDeposit}}validateAndBuy(t,e,n){let a=this.calculateInGivenOut(t,e),r=this.calculateInGivenOut(t,e,n),i=at.toPct(n.fee),s=[],o=A.isSellAllowed(t.tradeableIn),l=A.isBuyAllowed(t.tradeableOut);return(!o||!l)&&s.push("TradeNotAllowed"),(e<this.minTradingLimit||a<t.assetInEd)&&s.push("InsufficientTradingAmount"),{amountIn:r,calculatedIn:a,amountOut:e,feePct:i,errors:s}}validateAndSell(t,e,n){let a=this.calculateOutGivenIn(t,e),r=this.calculateOutGivenIn(t,e,n),i=at.toPct(n.fee),s=[],o=A.isSellAllowed(t.tradeableIn),l=A.isBuyAllowed(t.tradeableOut);return(!o||!l)&&s.push("TradeNotAllowed"),(e<this.minTradingLimit||a<t.assetOutEd)&&s.push("InsufficientTradingAmount"),{amountIn:e,calculatedOut:a,amountOut:r,feePct:i,errors:s}}calculateIn(t,e,n){let a=E.calculateInGivenOut(this.getReserves(),Number(t.assetIn),Number(t.assetOut),e.toString(),this.amplification.toString(),n?at.toRaw(n.fee).toString():"0",this.getPegs()),r=BigInt(a);return r<0n?0n:r}calculateAddOneAsset(t,e,n){let a=E.calculateAddOneAsset(this.getReserves(),e.toString(),Number(t.assetIn),this.amplification.toString(),this.totalIssuance.toString(),n?at.toRaw(n.fee).toString():"0",this.getPegs()),r=BigInt(a);return r<0n?0n:r}calculateSharesForAmount(t,e,n){let a=E.calculateSharesForAmount(this.getReserves(),Number(t.assetOut),e.toString(),this.amplification.toString(),this.totalIssuance.toString(),n?at.toRaw(n.fee).toString():"0",this.getPegs()),r=BigInt(a);return r<0n?0n:r}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=E.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 a=Math.pow(10,t.decimalsIn-t.decimalsOut);return BigInt(e)/BigInt(a)}let n=Math.pow(10,18-t.decimalsIn);return BigInt(e)/BigInt(n)}calculateOut(t,e,n){let a=E.calculateOutGivenIn(this.getReserves(),Number(t.assetIn),Number(t.assetOut),e.toString(),this.amplification.toString(),n?at.toRaw(n.fee).toString():"0",this.getPegs()),r=BigInt(a);return r<0n?0n:r}calculateWithdrawOneAsset(t,e,n){let a=E.calculateLiquidityOutOneAsset(this.getReserves(),e.toString(),Number(t.assetOut),this.amplification.toString(),this.totalIssuance.toString(),n?at.toRaw(n.fee).toString():"0",this.getPegs()),r=BigInt(a);return r<0n?0n:r}calculateShares(t,e,n){let a=E.calculateShares(this.getReserves(),this.getAssets(t.assetIn,e),this.amplification.toString(),this.totalIssuance.toString(),n?at.toRaw(n.fee).toString():"0",this.getPegs()),r=BigInt(a);return r<0n?0n:r}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=E.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 a=Math.pow(10,t.decimalsOut-t.decimalsIn);return BigInt(e)/BigInt(a)}let n=Math.pow(10,18-t.decimalsOut);return BigInt(e)/BigInt(n)}getPegs(){let t=E.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:a})=>({asset_id:e,amount:n,decimals:a}));return JSON.stringify(t,et.jsonFormatter)}getAssets(t,e){let n={asset_id:Number(t),amount:e.toString()};return JSON.stringify([n],et.jsonFormatter)}};var de=require("polkadot-api"),On=require("@polkadot-api/utils"),An=require("@noble/hashes/blake2b"),Tt=require("rxjs");var{FeeUtils:ut}=C,jt=class extends H{poolsData=new Map([]);getPoolType(){return"Stableswap"}getPoolAddress(t){let e=E.getPoolAddress(t),n=(0,An.blake2b)(e,{dkLen:32}),a=(0,On.toHex)(n);return(0,de.AccountId)(63).dec(a)}async getPoolLimits(){return{maxInRatio:0n,maxOutRatio:0n,minTradingLimit:await this.api.constants.Stableswap.MinTradingLimit()}}async getPoolDelta(t,e,n){let{initial_amplification:a,final_amplification:r,initial_block:i,final_block:s}=e,o=E.calculateAmplification(a.toString(),r.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),a=e.assets.map(async r=>{let[i,s,o]=await Promise.all([this.api.query.Stableswap.AssetTradability.getValue(t,r),this.api.query.AssetRegistry.Assets.getValue(r),this.getBalance(n,r)]);return{id:r,decimals:s?.decimals,existentialDeposit:s?.existential_deposit,balance:o.transferable,tradeable:i,type:s?.asset_type.type}});return Promise.all(a)}async isSupported(){let t=this.api.query.Stableswap.Pools,e=await this.api.compatibilityToken;return t.isCompatible(de.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()]),a=t.map(async({keyArgs:r,value:i})=>{let[s]=r,o=this.getPoolAddress(s),[l,c,p]=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:ut.fromPermill(i.fee),tokens:c,...l,...p,...n}});return Promise.all(a)}async getPoolFees(t){return{fee:t.fee}}async getPoolPegs(t,e,n){let a=await this.api.query.Stableswap.PoolPegs.getValue(t);if(!a)return this.getDefaultPegs(e);let r=await this.getLatestPegs(e,a,n),i=this.getRecentPegs(a),s=ut.fromPermill(a.max_peg_update),o=ut.fromPermill(e.fee),[l,c]=E.recalculatePegs(JSON.stringify(i),JSON.stringify(r),n.toString(),ut.toRaw(s).toString(),ut.toRaw(o).toString()),p=Number(l)*1e6;return{pegsFee:ut.fromPermill(p),pegs:c}}getDefaultPegs(t){let e=t.fee,n=E.defaultPegs(t.assets.length);return{pegsFee:ut.fromPermill(e),pegs:n}}getRecentPegs(t){let{current:e}=t;return Array.from(e.entries()).map(([n,a])=>a.map(r=>r.toString()))}async getLatestPegs(t,e,n){let{source:a}=e,r=Array.from(t.assets.entries()).map(([s,o])=>o),i=a.map(async(s,o)=>{if(s.type==="Oracle"){let[l,c,p]=s.value,d=[p,r[o]].sort((f,S)=>f-S),m=await this.api.query.EmaOracle.Oracles.getValue(l,d,c);if(!m)return;let[{price:g,updated_at:y}]=m,b=g.n.toString(),P=g.d.toString();return p.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:p,updatedAt:d}=await this.mmOracle.getData(l),m=10**p;return[[c.toString(),m.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)(a=>Promise.all([this.getPoolDelta(t.id,n,a),this.getPoolPegs(t.id,n,a)])),(0,Tt.map)(([a,r])=>{let i=t.tokens.map(s=>s.id===t.id?{...s,balance:a.totalIssuance}:s);return Object.assign(t,{tokens:i},a,r)}))}};var Xe={};x(Xe,{XykMath:()=>J,XykPool:()=>zt,XykPoolClient:()=>$t});var R=require("@galacticcouncil/math-xyk"),J=class{static getSpotPrice(t,e,n){return(0,R.get_spot_price)(t,e,n)}static calculateInGivenOut(t,e,n){return(0,R.calculate_in_given_out)(t,e,n)}static calculateOutGivenIn(t,e,n){return(0,R.calculate_out_given_in)(t,e,n)}static calculatePoolTradeFee(t,e,n){return(0,R.calculate_pool_trade_fee)(t,e,n)}static calculateLiquidityIn(t,e,n){return(0,R.calculate_liquidity_in)(t,e,n)}static calculateSpotPrice(t,e){return(0,R.calculate_spot_price)(t,e)}static calculateSpotPriceWithFee(t,e,n,a){return(0,R.calculate_spot_price_with_fee)(t,e,n,a)}static calculateShares(t,e,n){return(0,R.calculate_shares)(t,e,n)}static calculateLiquidityOutAssetA(t,e,n,a){return(0,R.calculate_liquidity_out_asset_a)(t,e,n,a)}static calculateLiquidityOutAssetB(t,e,n,a){return(0,R.calculate_liquidity_out_asset_b)(t,e,n,a)}};var{FeeUtils:Bn}=C,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,a,r){this.type="XYK",this.address=t,this.tokens=e,this.maxInRatio=n,this.maxOutRatio=a,this.minTradingLimit=r}validatePair(t,e){return!0}parsePair(t,e){let n=new Map(this.tokens.map(i=>[i.id,i])),a=n.get(t),r=n.get(e);if(a==null)throw new Error("Pool does not contain tokenIn");if(r==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,decimalsIn:a.decimals,decimalsOut:r.decimals,balanceIn:a.balance,balanceOut:r.balance,assetInEd:a.existentialDeposit,assetOutEd:r.existentialDeposit}}validateAndBuy(t,e,n){let a=this.calculateInGivenOut(t,e),r=this.calculateTradeFee(a,n),i=Bn.toPct(n.exchangeFee),s=a+r,o=[];(e<this.minTradingLimit||a<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:a,amountOut:e,feePct:i,errors:o}}validateAndSell(t,e,n){let a=this.calculateOutGivenIn(t,e),r=this.calculateTradeFee(a,n),i=Bn.toPct(n.exchangeFee),s=a-r,o=[];(e<this.minTradingLimit||a<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:a,amountOut:s,feePct:i,errors:o}}calculateInGivenOut(t,e){let n=J.calculateInGivenOut(t.balanceIn.toString(),t.balanceOut.toString(),e.toString()),a=BigInt(n);return a<0n?0n:a}calculateOutGivenIn(t,e){let n=J.calculateOutGivenIn(t.balanceIn.toString(),t.balanceOut.toString(),e.toString()),a=BigInt(n);return a<0n?0n:a}spotPriceInGivenOut(t){let e=J.calculateSpotPrice(t.balanceOut.toString(),t.balanceIn.toString()),n=Math.pow(10,18-t.decimalsOut);return BigInt(e)/BigInt(n)}spotPriceOutGivenIn(t){let e=J.calculateSpotPrice(t.balanceIn.toString(),t.balanceOut.toString()),n=Math.pow(10,18-t.decimalsIn);return BigInt(e)/BigInt(n)}calculateTradeFee(t,e){let n=J.calculatePoolTradeFee(t.toString(),e.exchangeFee[0],e.exchangeFee[1]);return BigInt(n)}};var _n=require("polkadot-api"),Rn=require("rxjs");var $t=class extends H{async loadPools(){let t=this.api.query.XYK.PoolAssets,[e,n]=await Promise.all([t.getEntries(),this.getPoolLimits()]),a=e.map(async({keyArgs:r,value:i})=>{let[s]=r,[o,l]=i,[c,p,d,m]=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:p?.decimals,existentialDeposit:p?.existential_deposit,balance:c.transferable,type:p?.asset_type.type},{id:l,decimals:m?.decimals,existentialDeposit:m?.existential_deposit,balance:d.transferable,type:m?.asset_type.type}],...n}});return Promise.all(a)}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(_n.CompatibilityLevel.BackwardsCompatible,e)}subscribePoolChange(t){return(0,Rn.of)(t)}};var Ke={};x(Ke,{AavePool:()=>Qt,AavePoolClient:()=>Jt});var 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,a,r){this.type="Aave",this.address=t,this.tokens=e,this.maxInRatio=n,this.maxOutRatio=a,this.minTradingLimit=r}validatePair(t,e){return!0}parsePair(t,e){let n=new Map(this.tokens.map(i=>[i.id,i])),a=n.get(t),r=n.get(e);if(a==null)throw new Error("Pool does not contain tokenIn");if(r==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,balanceIn:a.balance,balanceOut:r.balance,decimalsIn:a.decimals,decimalsOut:r.decimals,assetInEd:0n,assetOutEd:0n}}validateAndBuy(t,e,n){let a=this.calculateInGivenOut(t,e),r=[];return e>t.balanceOut&&r.push("TradeNotAllowed"),{amountIn:a,calculatedIn:a,amountOut:e,feePct:0,errors:r}}validateAndSell(t,e,n){let a=this.calculateOutGivenIn(t,e),r=[];return a>t.balanceOut&&r.push("TradeNotAllowed"),{amountIn:e,calculatedOut:a,amountOut:a,feePct:0,errors:r}}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 En=require("polkadot-api"),kn=require("@polkadot-api/utils"),wt=require("rxjs"),Cn=require("viem");var Fn=[{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:xa}=st,Ia=["Supply","Withdraw","Repay","Borrow"],Jt=class extends H{async loadPools(){let e=(await this.api.apis.AaveTradeExecutor.pools()).map(async({reserve:n,atoken:a,liqudity_in:r,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(a),this.api.query.AssetRegistry.AssetLocations.getValue(a)]);return{address:this.getPoolId(n,a),type:"Aave",tokens:[{id:n,decimals:s?.decimals,existentialDeposit:s?.existential_deposit,balance:r,location:o,type:s?.asset_type.type},{id:a,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:a,liqudity_out:r}=await this.api.apis.AaveTradeExecutor.pool(e.id,n.id);return t.tokens.map(i=>{let s=i.id===e.id?a:r;return{...i,balance:s}})}getPoolId(t,e){let n=t+"/"+e,a=new TextEncoder().encode(n.padEnd(32,"\0")),r=(0,kn.toHex)(a);return(0,En.AccountId)(63).dec(r)}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,a=this.getReserveH160Id(e),r=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()),p=l.asHex(),{eventName:d,args:m}=(0,Cn.decodeEventLog)({abi:Fn,topics:c,data:p});return Ia.includes(d)&&m.reserve.toLowerCase()===a.toLowerCase()});return(0,wt.merge)([r,i]).pipe((0,wt.switchMap)(()=>this.getPoolDelta(t)),(0,wt.map)(s=>({...t,tokens:[...s]})))}getReserveH160Id(t){return t.type==="Erc20"?et.findNestedKey(t.location,"AccountKey20").AccountKey20.key:xa.fromAssetId(t.id)}};var xt=class{static get(t){switch(t.type){case"Aave":return Qt.fromPool(t);case"XYK":return zt.fromPool(t);case"Omnipool":return Wt.fromPool(t);case"LBP":return Ht.fromPool(t);case"Stableswap":return Kt.fromPool(t);default:throw new Error("Pool type "+t.type+" is not supported yet")}}};var $=require("rxjs");var It=class extends k{evm;lbpClient;omniClient;stableClient;xykClient;aaveClient;active=new Set([]);clients=[];pools=new Map([]);lbpSub=$.Subscription.EMPTY;omniSub=$.Subscription.EMPTY;stableSub=$.Subscription.EMPTY;xykSub=$.Subscription.EMPTY;aaveSub=$.Subscription.EMPTY;isReady=!1;isDestroyed=new $.Subject;constructor(t,e){super(t),this.evm=e,this.lbpClient=new Vt(t,e),this.omniClient=new Xt(t,e),this.stableClient=new jt(t,e),this.xykClient=new $t(t,e),this.aaveClient=new Jt(t,e),this.clients=[this.lbpClient,this.omniClient,this.stableClient,this.xykClient,this.aaveClient]}subscribe(t){return t.getSubscriber().pipe((0,$.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,a=new Set(e),r=new Set(n),i=async s=>{let o=s.getPoolType();return a.size>0?a.has(o):r.size>0?!r.has(o):s.isSupported()};return this.getFilteredPools(i)}async getFilteredPools(t){let e=await Promise.all(this.clients.map(t)),n=this.clients.filter((r,i)=>e[i]);return(await Promise.all(n.map(r=>r.getPoolsMem()))).flat()}async getPoolFees(t,e){let n=this.clients.find(a=>a.getPoolType()===t.type);if(n)return n.getPoolFees(t,e);throw new qt(t.type)}};var en={};x(en,{DEFAULT_BLOCK_TIME:()=>Mn,DEFAULT_MIN_BUDGET:()=>Qe,ORDER_MIN_BLOCK_PERIOD:()=>Ln,Router:()=>vt,TWAP_BLOCK_PERIOD:()=>ne,TWAP_MAX_DURATION:()=>Ze,TWAP_MAX_PRICE_IMPACT:()=>Je,TWAP_TX_MULTIPLIER:()=>Cl,TradeOrderError:()=>$e,TradeOrderType:()=>be,TradeRouteBuilder:()=>U,TradeRouter:()=>Ot,TradeScheduler:()=>At,TradeType:()=>ge});var Zt=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 va=8,te=class{isNotVisited(t,e){let n=!0;return e.forEach(a=>{(a[0]===t[0]||a[1]===t[1])&&(n=!1)}),n}findPaths(t,e,n){let a=[],r=new Zt,i=[];for(i.push([e,""]),r.enqueue(i);r.size()>0;){let s=r.dequeue();if(!s||s.length>va)continue;let o=s[s.length-1];(n===null||o[0]===n)&&a.push(s),t.get(o[0])?.forEach(c=>{if(this.isNotVisited(c,s)){let p=[...s];p.push(c),r.enqueue(p)}})}return a}findShortestPaths(t,e,n){let a=[],r=new Zt,i=[];i.push([e,""]),r.enqueue(i);let s=1/0;for(;r.size()>0;){let o=r.dequeue();if(!o)continue;let l=o[o.length-1];if(l[0]===n){o.length<s?(s=o.length,a.length=0,a.push(o)):o.length===s&&a.push(o);continue}let c=t.get(l[0]);for(let p of c??[])this.isNotVisited(p,o)&&r.enqueue([...o,p])}return a}buildAndPopulateGraph(t,e){let n=new Map;for(let a of t)n.set(parseInt(a),[]);for(let[a,r,i]of e)n.get(r)?.push([i,a]);return n}};function ze(u){let t={};for(let e of u){let n=e.tokens.length;for(let a=0;a<n;a++){t[e.tokens[a].id]||(t[e.tokens[a].id]=[]);for(let r=0;r<n;r++){if(a==r)continue;let i=[e.address,e.tokens[a].id,e.tokens[r].id];t[e.tokens[a].id].push(i)}}}return t}var ee=class{getProposals(t,e,n){let a=n.filter(b=>b.type==="XYK"),r=n.filter(b=>b.type!=="XYK"),i=new Set(r.map(b=>b.tokens).flat().map(b=>b.id)),s=i.has(t),o=i.has(e),l=new te,c=b=>{let P=ze(b),f=Object.keys(P),S=f.flatMap(v=>P[v]);return l.buildAndPopulateGraph(f,S)};if(!s&&!o){let b=a.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(r),P=l.findPaths(b,t,e);return this.parsePaths(P)}let p=s?e:t,d=a.filter(b=>b.tokens.some(P=>P.id===p));if(d.length===0)return[];let m=[...r,...d],g=c(m),y=l.findPaths(g,t,e);return this.parsePaths(y)}parsePaths(t){let e=[];for(let n of t){let a=[];for(let r=0;r<n.length;r++){let i=n[r],s=n[r+1];if(s==null)break;a.push(this.toEdge(i,s))}e.push(a)}return e}toEdge(t,e){return[e[1],t[0],e[0]]}};var vt=class{routeSuggester;routeProposals;routerOptions;ctx;constructor(t,e={}){this.ctx=t,this.routeSuggester=new ee,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(a=>a!==t).map(a=>this.getRoutes(a,t)))).filter(a=>a.length>0).map(([a])=>a[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 a=this.getAssets(n);if(!a.has(t))throw new Error(t+" is not supported asset");if(!a.has(e))throw new Error(e+" is not supported asset");return this.toPoolsMap(n)}getAssets(t){let e=t.map(n=>n.tokens.map(a=>a.id)).flat().sort((n,a)=>n>a?1:-1);return new Set(e)}getPaths(t,e,n){let a=this.toPoolsMap(n);return this.getProposals(t,e,n).filter(i=>this.validPath(i,a)).map(i=>this.toHops(i,a))}getProposals(t,e,n){let a=this.buildRouteKey(t,e,n);if(this.routeProposals.has(a))return this.routeProposals.get(a);let r=this.routeSuggester.getProposals(t,e,n);return this.routeProposals.set(a,r),r}validPath(t,e){return t.length>0&&t.map(n=>this.validEdge(n,e)).reduce((n,a)=>n&&a)}validEdge([t,e,n],a){return a.get(t)?.validatePair(e,n)||!1}toPoolsMap(t){return new Map(t.map(e=>[e.address,xt.get(e)]))}toHops(t,e){return t.map(([n,a,r])=>{let i=e.get(n);return{poolAddress:n,poolId:i?.id,pool:i?.type,assetIn:a,assetOut:r}})}};var ge=(e=>(e.Buy="Buy",e.Sell="Sell",e))(ge||{}),be=(n=>(n.Dca="Dca",n.TwapSell="TwapSell",n.TwapBuy="TwapBuy",n))(be||{}),$e=(n=>(n.OrderTooSmall="OrderTooSmall",n.OrderTooBig="OrderTooBig",n.OrderImpactTooBig="OrderImpactTooBig",n))($e||{});var{FeeUtils:Dn}=C,Ot=class extends vt{mlr;poolsSnapshot;constructor(t,e={}){super(t,e),this.mlr=new Map}buildCtxSync(t,e){let n=this.poolsSnapshot,a=super.validateInput(t,e,n),r=super.getPaths(t,e,n);if(!r.length)throw new Nt(t,e);return{paths:r,pools:n,poolsMap:a}}async withCtx(t,e,n){this.poolsSnapshot||(this.poolsSnapshot=await super.getPools());let a=this.buildCtxSync(t,e);return n(a)}isDirectTrade(t){return t.length==1}findBestSellRoute(t){let e=t.sort((n,a)=>{let r=n[n.length-1].amountOut,i=a[a.length-1].amountOut;return r>i?-1:1});return e.find(n=>n.every(a=>a.errors.length==0))||e[0]}getRouteFeeRange(t){if(t.filter(n=>n.tradeFeeRange).length>0){let n=t.map(r=>r.tradeFeeRange?.[0]??r.tradeFeePct).reduce((r,i)=>r+i),a=t.map(r=>r.tradeFeeRange?.[1]??r.tradeFeePct).reduce((r,i)=>r+i);return[n,a]}}getPoolFeeRange(t){let e=t.min?Dn.toPct(t.min):void 0,n=t.max?Dn.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),a=t.map(s=>s.spotPrice).reduce((s,o)=>s*o),r=n-e.assetOutDecimals,i=Math.pow(10,r);return a/BigInt(i)}async getSell(t,e,n,a){return this.withCtx(t,e,async({paths:r,poolsMap:i})=>{let s;if(a)s=await this.toSellSwaps(n,a,i);else{let o=r.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],a=e[e.length-1],r=this.isDirectTrade(e),i=this.getSellSpot(e),s=a.amountOut,o=r?a.calculatedOut:this.calculateDelta0Y(n.amountIn,e,t),l=o-s,c=this.getRouteFeeRange(e),p=r?a.tradeFeePct:O.calculateSellFee(o,s),d=Math.pow(10,n.assetInDecimals),m=n.amountIn*i/BigInt(d),g=O.calculateDiffToRef(o,m);return{type:"Sell",amountIn:n.amountIn,amountOut:a.amountOut,spotPrice:i,tradeFee:l,tradeFeePct:p,tradeFeeRange:c,priceImpactPct:g,swaps:e,toHuman(){return{type:"Sell",amountIn:h.toDecimal(n.amountIn,n.assetInDecimals),amountOut:h.toDecimal(a.amountOut,a.assetOutDecimals),spotPrice:h.toDecimal(i,a.assetOutDecimals),tradeFee:h.toDecimal(l,a.assetOutDecimals),tradeFeePct:p,tradeFeeRange:c,priceImpactPct:g,swaps:e.map(y=>y.toHuman())}}}}calculateDelta0Y(t,e,n){let a=[];for(let r=0;r<e.length;r++){let i=e[r],s=n.get(i.poolAddress);if(s==null)throw new Error("Pool does not exit");let o=s.parsePair(i.assetIn,i.assetOut),l;r>0?l=a[r-1]:l=t;let c=s.calculateOutGivenIn(o,l);a.push(c)}return a[a.length-1]}async calculateMostLiquidRoute(t,e,n){let{paths:a,pools:r,poolsMap:i}=n,l=r.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),p=await Promise.all(a.map(y=>this.toSellSwaps(c,y,i))),m=this.findBestSellRoute(p).map(y=>({poolAddress:y.poolAddress,poolId:y?.poolId,pool:y.pool,assetIn:y.assetIn,assetOut:y.assetOut})),g=this.buildRouteKey(t,e,r);return this.mlr.set(g,m),m}async toSellSwaps(t,e,n){let a=[];for(let r=0;r<e.length;r++){let i=e[r],s=n.get(i.poolAddress);if(s==null)throw new Error("Pool does not exit");let o=s.parsePair(i.assetIn,i.assetOut),l;r>0?l=a[r-1].amountOut:l=typeof t=="string"?h.toBigInt(t,o.decimalsIn):t;let c=await this.ctx.getPoolFees(s,o.assetOut),{amountOut:p,calculatedOut:d,feePct:m,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=O.calculateDiffToRef(d,f);a.push({...i,assetInDecimals:o.decimalsIn,assetOutDecimals:o.decimalsOut,amountIn:l,amountOut:p,calculatedOut:d,spotPrice:b,tradeFeePct:m,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(p,o.decimalsOut),calculatedOut:h.toDecimal(d,o.decimalsOut),spotPrice:h.toDecimal(b,o.decimalsOut),tradeFeePct:m,tradeFeeRange:y,priceImpactPct:S,errors:g}}})}return a}async getMostLiquidRoute(t,e){return this.withCtx(t,e,async n=>{let a=this.buildRouteKey(t,e,n.pools),r=this.mlr.get(a);return r||this.calculateMostLiquidRoute(t,e,n)})}async getSpotPrice(t,e){return this.withCtx(t,e,async n=>{let{pools:a,poolsMap:r}=n,i=this.buildRouteKey(t,e,a),s=this.mlr.get(i);s||(s=await this.calculateMostLiquidRoute(t,e,n));let o=await this.toSellSwaps("1",s,r),l=this.getSellSpot(o),c=o[o.length-1].assetOutDecimals;return{amount:l,decimals:c}})}findBestBuyRoute(t){let e=t.sort((n,a)=>{let r=n[0].amountIn,i=a[0].amountIn;return r>i?1:-1});return e.find(n=>n.every(a=>a.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),a=t.map(s=>s.spotPrice).reduce((s,o)=>s*o),r=n-e.assetInDecimals,i=Math.pow(10,r);return a/BigInt(i)}async getBuy(t,e,n,a){return this.withCtx(t,e,async({paths:r,poolsMap:i})=>{let s;if(a)s=await this.toBuySwaps(n,a,i);else{let o=r.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],a=e[0],r=this.isDirectTrade(e),i=this.getBuySpot(e),s=a.amountIn,o=r?a.calculatedIn:this.calculateDelta0X(n.amountOut,e,t),l=s-o,c=this.getRouteFeeRange(e),p=r?a.tradeFeePct:O.calculateBuyFee(o,s),d=Math.pow(10,n.assetOutDecimals),m=n.amountOut*i/BigInt(d),g;return o===0n?g=-100:g=O.calculateDiffToRef(m,o),{type:"Buy",amountOut:n.amountOut,amountIn:a.amountIn,spotPrice:i,tradeFee:l,tradeFeePct:p,tradeFeeRange:c,priceImpactPct:g,swaps:e,toHuman(){return{type:"Buy",amountOut:h.toDecimal(n.amountOut,n.assetOutDecimals),amountIn:h.toDecimal(a.amountIn,a.assetInDecimals),spotPrice:h.toDecimal(i,a.assetInDecimals),tradeFee:h.toDecimal(l,a.assetInDecimals),tradeFeePct:p,tradeFeeRange:c,priceImpactPct:g,swaps:e.map(y=>y.toHuman())}}}}calculateDelta0X(t,e,n){let a=[];for(let r=e.length-1;r>=0;r--){let i=e[r],s=n.get(i.poolAddress);if(s==null)throw new Error("Pool does not exit");let o=s.parsePair(i.assetIn,i.assetOut),l;r==e.length-1?l=t:l=a[0];let c=s.calculateInGivenOut(o,l);a.unshift(c)}return a[0]}async toBuySwaps(t,e,n){let a=[];for(let r=e.length-1;r>=0;r--){let i=e[r],s=n.get(i.poolAddress);if(s==null)throw new Error("Pool does not exit");let o=s.parsePair(i.assetIn,i.assetOut),l;r==e.length-1?l=typeof t=="string"?h.toBigInt(t,o.decimalsOut):t:l=a[0].amountIn;let c=await this.ctx.getPoolFees(s,o.assetOut),{amountIn:p,calculatedIn:d,feePct:m,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=O.calculateDiffToRef(f,d),a.unshift({...i,assetInDecimals:o.decimalsIn,assetOutDecimals:o.decimalsOut,amountOut:l,amountIn:p,calculatedIn:d,spotPrice:b,tradeFeePct:m,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(p,o.decimalsIn),calculatedIn:h.toDecimal(d,o.decimalsIn),spotPrice:h.toDecimal(b,o.decimalsIn),tradeFeePct:m,tradeFeeRange:y,priceImpactPct:S,errors:g}}})}return a}};var Mn=6e3,Qe=1000000000000000n,ne=6,Je=-5,Ze=216e5,Cl=3,Ln=6;var tn=require("polkadot-api");var U=class{static build(t){return t.map(({assetIn:e,assetOut:n,pool:a,poolId:r})=>a==="Stableswap"?{pool:(0,tn.Enum)("Stableswap",r),asset_in:e,asset_out:n}:{pool:(0,tn.Enum)(a),asset_in:e,asset_out:n})}};var At=class{schedulerOptions;router;constructor(t,e={}){this.router=t,this.schedulerOptions=Object.freeze({blockTime:e.blockTime??6e3,minBudgetInNative:e.minBudgetInNative??Qe})}get blockTime(){return this.schedulerOptions.blockTime}get minOrderBudget(){return this.schedulerOptions.minBudgetInNative}async getDcaOrder(t,e,n,a,r){let[i,s]=await Promise.all([this.getMinimumOrderBudget(t),this.router.getBestSell(t,e,n)]),{amountIn:o,swaps:l,priceImpactPct:c}=s,p=l[0],d=l[l.length-1],{assetInDecimals:m}=p,{assetOutDecimals:g}=d,y=Math.abs(c),b=this.getMinimumTradeCount(o,i),P=this.getOptimalTradeCount(y),f=r?Math.round(a/r):P,S=Math.ceil(a/b),v=Math.round(a/P),L=Math.round(a/f),N=o/BigInt(f),D=await this.router.getBestSell(t,e,N),V=o<i,W=[];V&&W.push("OrderTooSmall");let Z=D.amountOut*BigInt(f),Rt=this.toBlockPeriod(L),rt=D.tradeFee*BigInt(f),fe=U.build(l),Ft={assetIn:t,assetOut:e,errors:W,frequencyMin:S,frequencyOpt:v,frequency:L,tradeCount:f,tradeFee:rt,tradeImpactPct:D.priceImpactPct,tradePeriod:Rt,tradeRoute:fe,type:"Dca"};return{...Ft,amountIn:o,amountOut:Z,tradeAmountIn:D.amountIn,tradeAmountOut:D.amountOut,toHuman(){return{...Ft,amountIn:h.toDecimal(o,m),amountOut:h.toDecimal(Z,g),tradeAmountIn:h.toDecimal(D.amountIn,m),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 a=t+n/2n;return Number(a/n)}getOptimalTradeCount(t){let e=Math.round(t*10)||1;return Math.max(e,3)}async getTwapSellOrder(t,e,n){let[a,r]=await Promise.all([this.getMinimumOrderBudget(t),this.router.getBestSell(t,e,n)]),{amountIn:i,swaps:s,priceImpactPct:o}=r,l=s[0],c=s[s.length-1],{assetInDecimals:p}=l,{assetOutDecimals:d}=c,m=Math.abs(o),g=this.getTwapTradeCount(m),y=i/BigInt(g),b=await this.router.getBestSell(l.assetIn,c.assetOut,y),P=g===1,f=i<a,S=b.priceImpactPct<-5,v=[];f||P?v.push("OrderTooSmall"):S&&v.push("OrderImpactTooBig");let L=b.amountOut*BigInt(g),N=b.tradeFee*BigInt(g),D=U.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:L,tradeAmountIn:b.amountIn,tradeAmountOut:b.amountOut,tradeFee:N,toHuman(){return{...V,amountIn:h.toDecimal(i,p),amountOut:h.toDecimal(L,d),tradeAmountIn:h.toDecimal(b.amountIn,p),tradeAmountOut:h.toDecimal(b.amountOut,d),tradeFee:h.toDecimal(N,d)}}}}async getTwapBuyOrder(t,e,n){let[a,r]=await Promise.all([this.getMinimumOrderBudget(t),this.router.getBestBuy(t,e,n)]),{amountOut:i,swaps:s,priceImpactPct:o}=r,l=s[0],c=s[s.length-1],{assetInDecimals:p}=l,{assetOutDecimals:d}=c,m=Math.abs(o),g=this.getTwapTradeCount(m),y=i/BigInt(g),b=await this.router.getBestBuy(l.assetIn,c.assetOut,y),P=b.amountIn*BigInt(g),f=g===1,S=P<a,v=b.priceImpactPct<-5,L=[];S||f?L.push("OrderTooSmall"):v&&L.push("OrderImpactTooBig");let N=b.tradeFee*BigInt(g),D=U.build(s),V={assetIn:t,assetOut:e,errors:L,tradeCount:g,tradeImpactPct:b.priceImpactPct,tradePeriod:6,tradeRoute:D,type:"TwapBuy"};return{...V,amountIn:P,amountOut:i,tradeAmountIn:b.amountIn,tradeAmountOut:b.amountOut,tradeFee:N,toHuman(){return{...V,amountIn:h.toDecimal(P,p),amountOut:h.toDecimal(i,d),tradeAmountIn:h.toDecimal(b.amountIn,p),tradeAmountOut:h.toDecimal(b.amountOut,d),tradeFee:h.toDecimal(N,p)}}}}getTwapTradeCount(t){let e=this.getOptimalTradeCount(t);if(this.getTwapExecutionTime(e)>216e5){let a=216e5/(this.blockTime*6);return Math.round(a)}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 nn={};x(nn,{BIG_10:()=>Gn,BIG_BILL:()=>Hn,StakingApi:()=>ae,StakingClient:()=>re});var qn=require("@polkadot/util-crypto"),Nn=require("@polkadot/util"),mt=require("@galacticcouncil/math-staking"),pt=gt(require("big.js")),Gn=(0,pt.default)(10),Hn=(0,pt.default)(Gn.pow(12));function Oa(u){return(0,qn.encodeAddress)((0,Nn.stringToU8a)(("modl"+u).padEnd(32,"\0")),63)}var ae=class{client;balanceClient;constructor(t,e){this.client=t,this.balanceClient=e}async getFreePotBalance(){let t=await this.client.getPalletId(),e=Oa(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)]),a=e?.created_at,r=await n.reduce(async(i,[s,o])=>{let l=await i,c=s,p=o.amount,d=o.conviction.toString(),m=await this.client.getReferendumInfo(c);return m&&(m.type==="Approved"||m.type==="Rejected")&&l.push({id:c,amount:p,conviction:d}),l},Promise.resolve([]));return{stake:e?.stake,rewardPerStake:e?.reward_per_stake,createdAt:a,actionPoints:e?.action_points,accumulatedUnpaidRewards:e?.accumulated_unpaid_rewards,accumulatedSlashPoints:e?.accumulated_slash_points,accumulatedLockedRewards:e?.accumulated_locked_rewards,votes:r}}async getStake(t){let e=await this.client.getNFTCollectionId(),[n,a]=await Promise.all([this.client.getStaking(),this.client.getUniques(t,e)]),r=a.find(i=>i)?.itemId;return{totalStake:n?.total_stake,accumulatedRewardPerStake:n?.accumulated_reward_per_stake,potReservedBalance:n?.pot_reserved_balance,positionId:r,stakePosition:r?await this.getStakingPosition(r):void 0}}async getRewards(t,e){let n=await this.getStake(t),{potReservedBalance:a,accumulatedRewardPerStake:r,totalStake:i,stakePosition:s}=n;if(!s)return;let[o,l,c,p]=await Promise.all([this.getFreePotBalance(),this.client.getPeriodLength(),this.client.getUnclaimablePeriods(),this.client.getSixBlockSince()]),d=(0,pt.default)(o.toString()).minus(a.toString()),m=r.toString(),g=(0,pt.default)(e).plus(1).toString();d.gt(0)&&i>0&&(m=(0,mt.calculate_accumulated_rps)(r.toString(),d.toString(),i.toString()));let y=(0,mt.calculate_period_number)(l.toString(),e,p??g),b=(0,mt.calculate_period_number)(l.toString(),s.createdAt?.toString()??"",p??g),P=(0,mt.calculate_rewards)(m,s.rewardPerStake?.toString()??"",s.stake?.toString()??""),f=(0,pt.default)(P).plus(s.accumulatedUnpaidRewards?.toString()||"0").plus(s.accumulatedLockedRewards?.toString()||"0");if(!(0,pt.default)(y).minus(b).lte(c.toString()))return f.div(Hn).toString()}};var re=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 rn={};x(rn,{TxBuilderFactory:()=>_t});var an=require("polkadot-api");function Un(u){let t=[],e=u;for(;e&&typeof e=="object"&&"type"in e;)t.push(e.type),e=e.value;return t.join(".")}var Bt=class extends k{evm;evmClient;balanceClient;aaveUtils;constructor(t,e){super(t),this.evm=e,this.evmClient=e.getWsProvider(),this.balanceClient=new G(t),this.aaveUtils=new it(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:xe})}async dryRun(t,e){let n=(0,an.Enum)("Signed",t),a=(0,an.Enum)("system",n),i=await this.client.getUnsafeApi().apis.DryRunApi.dry_run_call(a,e.decodedCall),s=i.success&&!i.value.execution_result.success?i.value.execution_result.value.error:null;if(s){let o=Un(s.value);throw new Error("Dry run execution error!",{cause:o})}return i}isDirectOmnipoolTrade(t){return t.length===1&&t[0].pool==="Omnipool"}};var ye=class extends Bt{_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:a}=e[0],r=await this.balanceClient.getBalance(this.beneficiary,a);return t>=r.transferable-5n?this.buildSellAllTx():this.buildSellTx()}async buildBuyTx(){let{amountIn:t,amountOut:e,swaps:n}=this.trade,a=n[0],r=n[n.length-1],i=O.getFraction(t,this.slippagePct),s=a.assetIn,o=r.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:U.build(n)}),this.wrapTx("RouterBuy",c)}async buildSellTx(){let{amountIn:t,amountOut:e,swaps:n}=this.trade,a=n[0],r=n[n.length-1],i=O.getFraction(e,this.slippagePct),s=a.assetIn,o=r.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:U.build(n)}),a.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],a=e[e.length-1],r=O.getFraction(t,this.slippagePct),i=n.assetIn,s=a.assetOut,o=t-r,l=this.api.tx.Router.sell_all({asset_in:i,asset_out:s,min_amount_out:o,route:U.build(e)});return n.isWithdraw()&&await this.aaveUtils.hasBorrowPositions(this.beneficiary)&&(l=await this.dispatchWithExtraGas(l)),this.wrapTx("RouterSellAll",l)}};var he=require("polkadot-api");var Pe=class extends Bt{_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:a,tradePeriod:r,tradeRoute:i}=this.order,s=this.api.tx.DCA.schedule({schedule:{owner:this.beneficiary,period:r,max_retries:this.maxRetries,total_amount:t,slippage:this.slippagePct*1e4,stability_threshold:void 0,order:(0,he.Enum)("Sell",{asset_in:e,asset_out:n,amount_in:a,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:a,tradeAmountOut:r,tradePeriod:i,tradeRoute:s}=this.order,o=O.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,he.Enum)("Sell",{asset_in:e,asset_out:n,amount_in:a,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:a,tradeAmountOut:r,tradePeriod:i,tradeRoute:s}=this.order,o=O.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,he.Enum)("Buy",{asset_in:e,asset_out:n,amount_out:r,max_amount_in:l,route:s})},start_execution_block:void 0});return this.wrapTx("DcaSchedule.twapBuy",c)}};var _t=class{client;evmClient;constructor(t,e){this.client=t,this.evmClient=e}trade(t){return new ye(this.client,this.evmClient).setTrade(t)}order(t){return new Pe(this.client,this.evmClient).setOrder(t)}};async function Aa(u){let t=new Pt(u),e=new Gt(u),[n,a]=await Promise.all([t.getBlockTime(),t.getMinOrderBudget()]),r=new It(u,e).withAave().withOmnipool().withStableswap().withXyk(),i=new it(e),s=new Ot(r),o=new At(s,{blockTime:n,minBudgetInNative:a}),l=new G(u),c=new re(u),p=new ae(c,l);return{api:{aave:i,router:s,scheduler:o,staking:p},client:{asset:new ht(u),balance:l,evm:e},ctx:{pool:r},tx:new _t(u,e),destroy:()=>{r.destroy()}}}0&&(module.exports={aave,api,big,client,const:null,createSdkContext,erc20,error,evm,fmt,h160,json,math,pool,sor,staking,tx,xc});
1
+ "use strict";var tr=Object.create;var ue=Object.defineProperty;var er=Object.getOwnPropertyDescriptor;var nr=Object.getOwnPropertyNames;var rr=Object.getPrototypeOf,ar=Object.prototype.hasOwnProperty;var gn=(c,t)=>()=>(c&&(t=c(c=0)),t);var x=(c,t)=>{for(var e in t)ue(c,e,{get:t[e],enumerable:!0})},le=(c,t,e,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of nr(t))!ar.call(c,r)&&r!==e&&ue(c,r,{get:()=>t[r],enumerable:!(n=er(t,r))||n.enumerable});return c},bt=(c,t,e)=>(le(c,t,"default"),e&&le(e,t,"default")),ot=(c,t,e)=>(e=c!=null?tr(rr(c)):{},le(t||!c||!c.__esModule?ue(e,"default",{value:c,enumerable:!0}):e,c)),ir=c=>le(ue({},"__esModule",{value:!0}),c);var Dt={};var hn=gn(()=>{bt(Dt,require("@polkadot-api/ws-provider/node"))});var Mt={};var Pn=gn(()=>{bt(Mt,require("@polkadot-api/ws-provider/web"))});var Mr={};x(Mr,{aave:()=>qe,api:()=>xe,big:()=>h,client:()=>Ue,const:()=>Fe,createSdkContext:()=>Dr,erc20:()=>lt,error:()=>Ye,evm:()=>Ke,fmt:()=>k,h160:()=>Gt,json:()=>nt,math:()=>O,pool:()=>tn,sor:()=>ln,staking:()=>un,tx:()=>pn,xc:()=>Me});module.exports=ir(Mr);var xe={};x(xe,{Papi:()=>C,getWs:()=>sr});var bn=require("@galacticcouncil/descriptors");function yn(c){switch(c){case!0:case"true":case 1:case"1":case"on":case"yes":return!0;default:return!1}}var C=class{client;api;constructor(t){this.client=t,this.api=this.client.getTypedApi(bn.hydration)}log(t,...e){let n=typeof window>"u"?process.env.GC_DEBUG:window.localStorage.getItem("gc.debug");yn(n)&&console.log(t,...e)}};var fn=require("polkadot-api"),Sn=require("polkadot-api/polkadot-sdk-compat"),sr=async c=>{let t=typeof c=="string"?c.split(","):c,r=(typeof window>"u"?(await Promise.resolve().then(()=>(hn(),Dt))).getWsProvider:(await Promise.resolve().then(()=>(Pn(),Mt))).getWsProvider)(t);return(0,fn.createClient)((0,Sn.withPolkadotSdkCompat)(r))};var qe={};x(qe,{AAVE_GAS_LIMIT:()=>Oe,AAVE_LENDING_POOL_ADDRESS:()=>me,AAVE_POOL_ABI:()=>Ie,AAVE_POOL_DATA_PROVIDER:()=>pe,AAVE_POOL_DATA_PROVIDER_ABI:()=>ce,AAVE_POOL_PROXY:()=>ve,AAVE_ROUNDING_THRESHOLD:()=>Jr,AAVE_UINT_256_MAX:()=>or,AaveClient:()=>Lt,AaveUtils:()=>ut});var Ie=[{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 ce=[{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 ve="0x1b02E051683b5cfaC5929C25E84adb26ECf87B38",pe="0x112b087b60C1a166130d59266363C45F8aa99db0",me="0xf3Ba4D1b50f78301BDD7EAEa9B67822A15FCA691",Oe=1000000n,Jr=5,or=BigInt("0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");var Lt=class{client;constructor(t){this.client=t.getWsProvider()}async getReservesData(){return await this.client.readContract({abi:ce,address:pe,args:[me],functionName:"getReservesData"})}async getUserReservesData(t){return await this.client.readContract({abi:ce,address:pe,args:[me,t],functionName:"getUserReservesData"})}async getUserAccountData(t){return await this.client.readContract({abi:Ie,address:ve,args:[t],functionName:"getUserAccountData"})}};var h={};x(h,{asBigInt:()=>cr,toBigInt:()=>ur,toDecimal:()=>lr});var et=ot(require("big.js"));et.default.NE=-18;function lr(c,t,e=6,n){let r=(0,et.default)(c.toString()),a=(0,et.default)(10).pow(t);return r.div(a).round(e,n).toString()}function ur(c,t){let e=(0,et.default)(10).pow(t),r=(0,et.default)(c).mul(e).toFixed(0,et.default.roundDown);return BigInt(r)}function cr(c){return BigInt(c.round(0,et.default.roundDown).toFixed(0))}var lt={};x(lt,{ERC20:()=>Ae});var Ae=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 k={};x(k,{FeeUtils:()=>Ee,shiftNeg:()=>Nt});var Tn=ot(require("big.js"));var Fe={};x(Fe,{HUB_ASSET_ID:()=>Re,HYDRATION_OMNIPOOL_ADDRESS:()=>mr,HYDRATION_PARACHAIN_ID:()=>pr,HYDRATION_SS58_PREFIX:()=>q,PERBILL_DENOMINATOR:()=>_e,PERMILL_DENOMINATOR:()=>qt,RUNTIME_DECIMALS:()=>_,SYSTEM_ASSET_DECIMALS:()=>Be,SYSTEM_ASSET_ID:()=>Y,TRADEABLE_DEFAULT:()=>ht});var _=18,qt=1e6,_e=1e9,Y=0,Be=12,pr=2034,q=63,mr="7L53bUTBbfuj14UpdCNPwmgzzHSsrsTWBHX5pys32mVWM3C1",Re=1,ht=15;var Ee=class c{static toPct(t){let[e,n]=t;return c.safeDivide(e*100,n)}static toRaw(t){let[e,n]=t;return c.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 Nt(c,t){let e=(0,Tn.default)(typeof c=="bigint"?c.toString():c);return t===0?e.toString():e.div(Math.pow(10,t)).toString()}var Gt={};x(Gt,{H160:()=>De,isEvmAccount:()=>wn,isEvmAddress:()=>xn,isSs58Address:()=>In});var Pt=require("polkadot-api"),Ce=require("@polkadot-api/utils"),J=require("buffer");var ke="ETH\0";function wn(c){if(!c)return!1;try{let t=(0,Pt.AccountId)().enc(c),e=J.Buffer.from(ke);return J.Buffer.from(t.subarray(0,e.length)).equals(e)}catch{return!1}}function xn(c){return!!/^0x[a-fA-F0-9]{40}$/.test(c)}function In(c){try{return(0,Pt.AccountId)(63).enc(c),!0}catch{return!1}}var De=class c{static toAccount=t=>{let e=J.Buffer.from(t.slice(2),"hex"),n=J.Buffer.from(ke),r=Uint8Array.from(J.Buffer.concat([n,e,J.Buffer.alloc(8)])),a=(0,Ce.toHex)(r);return(0,Pt.AccountId)(63).dec(a)};static fromAccount=t=>{let e=(0,Pt.AccountId)().enc(t),n=J.Buffer.from(ke),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,Ce.toHex)(n)};static fromAny=t=>{if(xn(t))return t;if(wn(t))return c.fromAccount(t);if(In(t))return c.fromSS58(t);throw new Error("Unknown address type")}};var nt={};x(nt,{findNestedKey:()=>dr,findNestedObj:()=>gr,jsonFormatter:()=>yr});var dr=(c,t)=>{let e=[];return JSON.stringify(c,(n,r)=>(r&&r[t]&&e.push(r),r)),e[0]},gr=(c,t,e)=>{let n;return JSON.stringify(c,(r,a)=>(a&&a[t]===e&&(n=a),a)),n},yr=(c,t)=>typeof t=="bigint"?t.toString():t;var O={};x(O,{calculateBuyFee:()=>fr,calculateDiffToAvg:()=>br,calculateDiffToRef:()=>hr,calculateSellFee:()=>Pr,getFraction:()=>Sr});var z=ot(require("big.js"));function br(c,t){let e=(0,z.default)(c.toString()),n=(0,z.default)(t.toString());return e.minus(n).abs().div(e.plus(n).div(2)).mul(100).round(2).toNumber()}function hr(c,t){if(t===0n)return 0;let e=(0,z.default)(c.toString()),n=(0,z.default)(t.toString());return e.minus(n).div(n).mul(100).round(2).toNumber()}function Pr(c,t){let e=(0,z.default)(c.toString()),n=(0,z.default)(t.toString());return(0,z.default)(1).minus(n.div(e)).mul(100).round(2).toNumber()}function fr(c,t){let e=(0,z.default)(c.toString());return(0,z.default)(t.toString()).div(e).minus(1).mul(100).round(2).toNumber()}function Sr(c,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 c*r/BigInt(100*n)}var Me={};x(Me,{convertToId:()=>Tr});var vn=require("buffer");function Tr(c){let e=vn.Buffer.from(c.replace("0x",""),"hex").subarray(16);return e.readUIntBE(0,e.length)}var{ERC20:de}=lt,{H160:Le}=Gt,wr=1.01,xr=99999,Ir=10n**27n,vr=10n**18n,ut=class{client;constructor(t){this.client=new Lt(t)}async getSummary(t){let e=Le.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,u,p,d,m,y]=a,b=h.toDecimal(y,18),g=[];for(let P of i){let f=P.underlyingAsset.toLowerCase(),S=s.find(({underlyingAsset:st})=>st.toLowerCase()===f);if(!S)throw new Error("Missing pool reserve for "+f);let v=P.scaledATokenBalance,L=S.liquidityIndex,N=S.priceInMarketReferenceCurrency,M=v*L/Ir,W=Number(o===S.eModeCategoryId?S.eModeLiquidationThreshold:S.reserveLiquidationThreshold)/1e4,tt=S.usageAsCollateralEnabled&&P.usageAsCollateralEnabledOnUser&&P.scaledATokenBalance>0n,Ct=de.toAssetId(f);g.push({aTokenBalance:M,decimals:Number(S.decimals),isCollateral:tt,priceInRef:N,reserveId:Ct,reserveAsset:f,reserveLiquidationThreshold:W})}return{healthFactor:Number(b),totalCollateral:l,totalDebt:u,reserves:g}}async hasBorrowPositions(t){let e=Le.fromAny(t),n=await this.client.getUserAccountData(e),[r,a]=n;return a>0n}async getHealthFactor(t){let e=Le.fromAny(t),n=await this.client.getUserAccountData(e),[r,a,s,i,o,l]=n,u=h.toDecimal(l,18);return Number(u)}async getHealthFactorAfterWithdraw(t,e,n){let{totalCollateral:r,totalDebt:a,reserves:s}=await this.getSummary(t),i=de.fromAssetId(e),o=s.find(g=>g.reserveAsset===i);if(!o)throw new Error("Missing reserve ctx for "+i);let{decimals:l,isCollateral:u,priceInRef:p,reserveLiquidationThreshold:d}=o,m=h.toBigInt(n,l),y=u?m*p/10n**BigInt(l):0n,b=r-y;return b<=0n?0:this.calculateHealthFactor(b,d,a)}async getHealthFactorAfterSupply(t,e,n){let{totalCollateral:r,totalDebt:a,reserves:s}=await this.getSummary(t),i=de.fromAssetId(e),o=s.find(b=>b.reserveAsset===i);if(!o)throw new Error("Missing reserve ctx for "+i);let{decimals:l,priceInRef:u,reserveLiquidationThreshold:p}=o,m=h.toBigInt(n,l)*u/10n**BigInt(l),y=r+m;return y<=0n?0:this.calculateHealthFactor(y,p,a)}async getMaxWithdraw(t,e){let{totalCollateral:n,totalDebt:r,reserves:a}=await this.getSummary(t),s=de.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 xr;let r=10n**6n,a=h.toBigInt(e,18),s=t*a*r,i=n*vr,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(wr,i,n),l=e-o;if(l<=0n)return{amount:0n,decimals:a};let u=l*10n**BigInt(a)/s;return{amount:r<u?r:u,decimals:a}}};var Ue={};x(Ue,{AssetClient:()=>ft,BalanceClient:()=>G,ChainParams:()=>St,LiquidityMining:()=>Tt});var ft=class extends C{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:u}=n.get(t)??{};return{id:t,name:a?.asText(),symbol:l,decimals:u,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:u,decimals:p}=await this.mapToken(a,e,n),d=Number(s),m=new Intl.DateTimeFormat("en-GB"),y=[u,"Bond",m.format(d)].join(" ");return{id:t,name:y,symbol:u+"b",decimals:p,icon:u,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:u}=e,p=await Promise.all(a.map(async y=>{let{symbol:b}=await this.mapToken(y,e,n);return[y,b]})),d=Object.fromEntries(p),m=Object.values(d);return{id:t,name:m.join(", "),symbol:i?.asText()||s?.asText(),decimals:18,icon:m.join("/"),type:o.type,isSufficient:l,existentialDeposit:u,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,u]of Array.from(n)){let p=r.get(l),{asset_type:d}=u,m;switch(d.type){case"Bond":let y=s.get(l);m=await this.mapBond(l,u,i,y);break;case"StableSwap":let b=a.get(l);m=await this.mapShares(l,u,i,b);break;case"External":m=await this.mapExternal(l,u,e,p);break;default:m=await this.mapToken(l,u,i,p)}o.push(m)}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 w=require("rxjs");var G=class extends C{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,w.combineLatest)([e,n,r]).pipe((0,w.debounceTime)(250),(0,w.map)(a=>a.flat()),(0,w.startWith)([]),(0,w.bufferCount)(2,1),(0,w.map)(([a,s],i)=>{if(i===0)return s;let o=a.reduce((u,p)=>(u.set(p.id,p.balance),u),new Map);return s.filter(u=>!On(u.balance,o.get(u.id)))}))}subscribeSystemBalance(t){return this.api.query.System.Account.watchValue(t,"best").pipe((0,w.map)(n=>({id:0,balance:this.calculateBalance(n.data)})))}subscribeTokenBalance(t,e){return this.api.query.Tokens.Accounts.watchValue(t,e,"best").pipe((0,w.map)(r=>({id:e,balance:r})))}subscribeTokensBalance(t){return this.api.query.Tokens.Accounts.watchEntries(t,{at:"best"}).pipe((0,w.distinctUntilChanged)((n,r)=>!r.deltas),(0,w.map)(({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 w.Subject,r=n.pipe((0,w.shareReplay)(1)),a=async()=>(await this.api.query.AssetRegistry.Assets.getEntries()).filter(({value:l})=>{let{asset_type:u}=l;return u.type==="Erc20"}).map(({keyArgs:l})=>{let[u]=l;return u}),s=async()=>{let o=e||await a(),l=async()=>{let d=(await Promise.all(o.map(async m=>{let y=await this.getTokenBalanceData(t,m);return[m,y]}))).map(([m,y])=>({id:m,balance:y}));n.next(d)};await l();let u=this.api.query.System.Number.watchValue("best").subscribe(l);return()=>u.unsubscribe()},i;return s().then(o=>i=o),r.pipe((0,w.finalize)(()=>i?.()),(0,w.pairwise)(),(0,w.map)(([o,l],u)=>{if(u===0)return l;let p=o.reduce((m,y)=>(m.set(y.id,y.balance),m),new Map);return l.filter(m=>!On(m.balance,p.get(m.id)))}),(0,w.distinctUntilChanged)((o,l)=>l.length===0))}async getTokenBalanceData(t,e){let n=await this.api.apis.CurrenciesApi.account(e,t);return this.calculateBalance(n)}},On=(c,t)=>c!==void 0&&t!==void 0&&c.transferable===t.transferable&&c.total===t.total;var St=class extends C{_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 wt=require("polkadot-api"),Ve=require("@galacticcouncil/math-liquidity-mining"),D=ot(require("big.js"));var rt=ot(require("big.js")),X=require("@galacticcouncil/math-liquidity-mining"),Or="1000000000000000000",ge=class{constructor(t,e,n){this.get_account=t;this.multiCurrency=e;this.getAsset=n}async sync_global_farm(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.get_account(t.id),i=r?.existential_deposit;if(!i)throw new Error("Missing reward currency asset list");let o=this.multiCurrency.free_balance(t.reward_currency,s),l=(0,rt.default)(i.toString()),u=(0,rt.default)(o.toString()).minus(l.lt(o.toString())?i.toString():o.toString()),p=(0,rt.default)((0,X.calculate_global_farm_rewards)(t.total_shares_z.toString(),n.toString(),(0,rt.default)(t.yield_per_period.toString()).mul(Ne).round(0,rt.default.roundDown).toFixed(),t.max_reward_per_period.toString(),a.toFixed()));if(u.lt(p)&&(p=u),p.eq(0))return t;let d=this.get_account(0);return this.multiCurrency.transfer(t.reward_currency,s,d,BigInt(p.toFixed())),{...t,accumulated_rpz:BigInt((0,X.calculate_accumulated_rps)(t.accumulated_rpz.toString(),t.total_shares_z.toString(),p.toFixed()))}}sync_yield_farm(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,X.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}}get_loyalty_multiplier(t,e){let n=(0,rt.default)(1).mul(Ne).round(0,rt.default.roundDown).toString();if(!e)return n;let{initial_reward_percentage:r,scale_coef:a}=e;return(0,X.calculate_loyalty_multiplier)(t.toFixed(),r.toString(),a.toFixed())}async claim_rewards(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.sync_global_farm(t,s,a);if(!i)return null;let o=this.sync_yield_farm(e,i,s);if(!o)return null;let l=o.total_stopped-n.stopped_at_creation,u=o.updated_at-n.entered_at-l,p=this.get_loyalty_multiplier(u,o.loyalty_curve),d=BigInt((0,X.calculate_user_reward)(n.accumulated_rpvs.toString(),n.valued_shares.toString(),n.accumulated_claimed_rewards.toString(),o.accumulated_rpvs.toString(),p)),m=BigInt((0,X.calculate_user_reward)(n.accumulated_rpvs.toString(),n.valued_shares.toString(),n.accumulated_claimed_rewards.toString(),o.accumulated_rpvs.toString(),Or));return{reward:d,maxReward:m,assetId:i.reward_currency}}};var Ar=BigInt((0,D.default)(1).pow(18).toString()),_r=6,Tt=class extends C{balanceClient;omnipoolAssetIds=[];secondsInYear=(0,D.default)(365.2425).times(24).times(60).times(60);constructor(t){super(t),this.balanceClient=new G(t)}async getOraclePrice(t,e){let n=[t,e].sort((a,s)=>a-s);if(t===e)return Ar;let r=await this.api.query.EmaOracle.Oracles.getValue(wt.Binary.fromText("omnipool"),n,(0,wt.Enum)("TenMinutes"));if(r){let{n:a,d:s}=r[0].price,i;return t<e?i=(0,Ve.fixed_from_rational)(a.toString(),s.toString()):i=(0,Ve.fixed_from_rational)(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(0,wt.AccountId)(63).dec(o)};getGlobalRewardPerPeriod(t,e,n,r){let a=(0,D.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,D.default)(t.toString()).times(e),s=(0,D.default)(n.toString()).times(r);return a.div(s.toString()).toString()}farmData(t,e,n){let{yieldFarm:r,globalFarm:a,priceAdjustment:s,balance:i}=t,{multiplier:o,loyalty_curve:l}=r,{blocks_per_period:u,yield_per_period:p,total_shares_z:d,max_reward_per_period:m,pending_rewards:y,accumulated_paid_rewards:b,planned_yielding_periods:g,updated_at:P,incentivized_asset:f,reward_currency:S,price_adjustment:v}=a,L=Nt(s??v,18),N=Nt(o,18),M=Nt(l?.initial_reward_percentage??0,18),U=this.secondsInYear.div((0,D.default)(_r).times(u)).toString(),W;if(d<0)W=(0,D.default)(N).times(p.toString()).times(U).toString();else{let Jn=this.getGlobalRewardPerPeriod(d,p,m,L),Zn=this.getPoolYieldPerPeriod(Jn,N,d,L);W=(0,D.default)(Zn).times(U).toString()}let tt=y+b,Ct=m*BigInt(g),st=i.transferable+tt,we=st-tt,kt=(0,D.default)(we.toString()).div(m.toString()),mn=(0,D.default)(e).div(u.toString()).toString(),jn=(d>=0?kt.plus(P):kt.plus(mn)).toString(),Qn=(0,D.default)(d.toString()).div((0,D.default)(m.toString()).div(p.toString())).div(Math.pow(10,18)).times(100).times(L).toFixed(2),dn=(0,D.default)(tt.toString()).div(st.toString()).gte(.999);W=dn?"0":(0,D.default)(W).div(n?2:1).times(100).toString();let $n=M?(0,D.default)(W).times(M).toString():void 0;return{apr:W,minApr:$n,isDistributed:dn,estimatedEndPeriod:jn,maxRewards:Ct,incentivizedAsset:f,rewardCurrency:S,loyaltyCurve:l,currentPeriod:mn,potMaxRewards:st,fullness:Qn}}async getOmnipoolFarms(t){let e=await this.api.query.OmnipoolWarehouseLM.ActiveYieldFarm.getEntries(Number(t)),r=(await this.api.query.ParachainSystem.ValidationData.getValue())?.relay_parent_number,a=await Promise.all(e.map(async({keyArgs:s,value:i})=>{let[,o]=s,l=i,u=await this.api.query.OmnipoolWarehouseLM.GlobalFarm.getValue(o),p=await this.api.query.OmnipoolWarehouseLM.YieldFarm.getValue(Number(t),o,l);if(!u||!p)return;let d=u.reward_currency,m=u.incentivized_asset,y=this.getFarmAddress(o),b=await this.getOraclePrice(d,m),g=await this.balanceClient.getTokenBalance(y,d);return{id:t,globalFarm:u,yieldFarm:p,priceAdjustment:b,balance:g}}));return r?a.map(s=>s?this.farmData(s,r):void 0):[]}async getIsolatedFarms(t){let e=await this.api.query.XYKWarehouseLM.ActiveYieldFarm.getEntries(t),r=(await this.api.query.ParachainSystem.ValidationData.getValue())?.relay_parent_number,a=await Promise.all(e.map(async({keyArgs:s,value:i})=>{let[,o]=s,l=i,u=await this.api.query.XYKWarehouseLM.GlobalFarm.getValue(o),p=await this.api.query.XYKWarehouseLM.YieldFarm.getValue(t,o,l);if(!u||!p)return;let d=u.reward_currency,m=u.incentivized_asset,y=this.getFarmAddress(o,!0),b=await this.getOraclePrice(d,m),g=await this.balanceClient.getBalance(y,d);return{id:t,globalFarm:u,yieldFarm:p,priceAdjustment:b,balance:g,farmAddress:y}}));return r?a.map(s=>s?this.farmData(s,r,!0):void 0):[]}async getDepositReward(t,e,n,r){let a=e.global_farm_id,s=e.yield_farm_id,i=n?await this.api.query.XYKWarehouseLM.YieldFarm.getValue(t,a,s):await this.api.query.OmnipoolWarehouseLM.YieldFarm.getValue(Number(t),a,s),o=n?await this.api.query.XYKWarehouseLM.GlobalFarm.getValue(a):await this.api.query.OmnipoolWarehouseLM.GlobalFarm.getValue(a);if(!o||!i)return;let l=o.reward_currency,u=o.incentivized_asset,p=[[this.getFarmAddress(0,n),o.reward_currency],[this.getFarmAddress(o.id,n),o.reward_currency]],d=await Br(this.api,p)(),m=await this.getOraclePrice(l,u),y=new He(p,d),g=await new ge(f=>this.getFarmAddress(f),y,f=>this.api.query.AssetRegistry.Assets.getValue(f)).claim_rewards(o,i,e,r,m??o.price_adjustment);if(!g)return;let P=await this.api.query.AssetRegistry.Assets.getValue(g.assetId);if(P&&!(g.reward<=P.existential_deposit))return g}},Ne=(0,D.default)(10).pow(18),Ge="0",Br=(c,t)=>async()=>{let[e,n]=await Promise.all([c.query.Tokens.Accounts.getValues(t.filter(([a,s])=>s.toString()!==Ge)),c.query.System.Account.getValues(t.filter(([a,s])=>s.toString()===Ge).map(([a])=>[a]))]),r=[];for(let a=0,s=0;a+s<t.length;){let i=a+s,[,o]=t[i];o.toString()===Ge?(r.push({assetId:o.toString(),free:n[s].data.free,reserved:n[s].data.reserved,frozen:n[s].data.frozen}),s+=1):(r.push({assetId:o.toString(),free:e[a].free,reserved:e[a].reserved,frozen:e[a].frozen}),a+=1)}return r},He=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)}}free_balance(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)}};var Ye={};x(Ye,{AssetNotFound:()=>We,PoolNotFound:()=>Vt,RouteNotFound:()=>Ht});var We=class extends Error{constructor(t){super(),this.message=`${t} not found`,this.name="AssetNotFound"}},Vt=class extends Error{constructor(t){super(),this.message=`${t} pool invalid`,this.name="PoolNotFound"}},Ht=class extends Error{constructor(t,e){super(),this.message=`Route from ${t} to ${e} not found in current configuration`,this.name="RouteNotFound"}};var Ke={};x(Ke,{EvmClient:()=>Ut,createChain:()=>Xe});var An=require("viem"),Rr=["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"],Xe=()=>(0,An.defineChain)({id:222222,name:"Hydration",network:"hydration",nativeCurrency:{decimals:18,name:"WETH",symbol:"WETH"},rpcUrls:{default:{http:Rr}},blockExplorers:{default:{name:"Hydration Explorer",url:"https://explorer.evm.hydration.cloud"}},testnet:!1});var j=require("viem");var Ut=class{client;chain;constructor(t){this.client=t,this.chain=Xe()}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={};x(tn,{PoolContextProvider:()=>At,PoolError:()=>ct,PoolFactory:()=>Ot,PoolType:()=>F,aave:()=>Ze,lbp:()=>je,omni:()=>Qe,stable:()=>$e,xyk:()=>Je});var je={};x(je,{LbpMath:()=>K,LbpPool:()=>Wt,LbpPoolClient:()=>Xt});var Q=require("@galacticcouncil/math-lbp"),K=class{static getSpotPrice(t,e,n,r,a){return(0,Q.get_spot_price)(t,e,n,r,a)}static calculateInGivenOut(t,e,n,r,a){return(0,Q.calculate_in_given_out)(t,e,n,r,a)}static calculateOutGivenIn(t,e,n,r,a){return(0,Q.calculate_out_given_in)(t,e,n,r,a)}static calculateLinearWeights(t,e,n,r,a){return(0,Q.calculate_linear_weights)(t,e,n,r,a)}static calculatePoolTradeFee(t,e,n){return(0,Q.calculate_pool_trade_fee)(t,e,n)}};var F=(a=>(a.Aave="Aave",a.LBP="LBP",a.Omni="Omnipool",a.Stable="Stableswap",a.XYK="XYK",a))(F||{}),ct=(a=>(a.InsufficientTradingAmount="InsufficientTradingAmount",a.MaxInRatioExceeded="MaxInRatioExceeded",a.MaxOutRatioExceeded="MaxOutRatioExceeded",a.TradeNotAllowed="TradeNotAllowed",a.UnknownError="UnknownError",a))(ct||{});var{FeeUtils:_n}=k,Wt=class c{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;fee;repayFeeApply;static fromPool(t){return new c(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=_n.toPct(this.repayFeeApply?n.repayFee:n.exchangeFee),l=e+i,u=this.calculateInGivenOut(t,l),p=t.balanceIn/this.maxInRatio;return u>p&&a.push("MaxInRatioExceeded"),{amountIn:u,calculatedIn:u,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=_n.toPct(this.repayFeeApply?n.repayFee:n.exchangeFee),u=i-o,p=t.balanceOut/this.maxOutRatio;return u>p&&a.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:i,amountOut:u,feePct:l,errors:a}}}calculateInGivenOut(t,e){let n=K.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=K.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=K.getSpotPrice(t.balanceOut.toString(),t.balanceIn.toString(),t.weightOut.toString(),t.weightIn.toString(),this.maxOutRatio.toString());return BigInt(e)}spotPriceOutGivenIn(t){let e=K.getSpotPrice(t.balanceIn.toString(),t.balanceOut.toString(),t.weightIn.toString(),t.weightOut.toString(),this.maxInRatio.toString());return BigInt(e)}calculateTradeFee(t,e){let n=K.calculatePoolTradeFee(t.toString(),this.repayFeeApply?e.repayFee[0]:e.exchangeFee[0],this.repayFeeApply?e.repayFee[1]:e.exchangeFee[1]);return BigInt(n)}};var Rn=require("polkadot-api"),pt=require("rxjs");var Bn=(c,t=new Map)=>e=>{let n;return t.has(e)?t.get(e):(t.set(e,n=c(e)),n)};var I=require("rxjs");var ze=[{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 Yt=class{client;constructor(t){this.client=t.getWsProvider()}async getData(t,e=6){let[n,r,a]=await Promise.all([this.client.readContract({abi:ze,address:t,functionName:"latestRoundData"}),this.client.readContract({abi:ze,address:t,functionName:"decimals"}),this.client.getBlock()]),[s,i,o,l]=n,u=a.number-(a.timestamp-l)/BigInt(e),p=Number(u);return{price:i,decimals:r,updatedAt:p<0?0:p}}};var V=class extends G{evm;mmOracle;override=[];mem=0;memPools=Bn(t=>(this.log(this.getPoolType(),"mem pools",t,"\u2705"),this.loadPools()));constructor(t,e){super(t),this.evm=e,this.mmOracle=new Yt(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(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 Xt=class extends V{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(),u=await this.getPoolDelta(l,i,r);return{address:l,type:"LBP",fee:i.fee,...u,...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:u}=e,p=K.calculateLinearWeights(r?r.toString():"0",a?a.toString():"0",i.toString(),o.toString(),n.toString()),[d,m]=s,y=BigInt(p),b=this.MAX_FINAL_WEIGHT-BigInt(y),[g,P,f,S,v]=await Promise.all([this.isRepayFeeApplied(d,l,u.toString()),this.getBalance(t,d),this.api.query.AssetRegistry.Assets.getValue(d),this.getBalance(t,m),this.api.query.AssetRegistry.Assets.getValue(m)]);return{repayFeeApply:g,tokens:[{id:d,decimals:f?.decimals,existentialDeposit:f?.existential_deposit,balance:P.transferable,weight:y,type:f?.asset_type.type},{id:m,decimals:v?.decimals,existentialDeposit:v?.existential_deposit,balance:S.transferable,weight:b,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(Rn.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,pt.switchMap)(r=>r?this.getPoolDelta(t.address,n,r.relay_parent_number):(0,pt.of)(t)),(0,pt.map)(r=>Object.assign({},t,r))):(0,pt.of)(t)}};var Qe={};x(Qe,{OmniMath:()=>A,OmniPool:()=>Kt,OmniPoolClient:()=>jt});var T=require("@galacticcouncil/math-omnipool"),mt=ot(require("big.js")),A=class{static calculateSpotPrice(t,e,n,r){return(0,T.calculate_spot_price)(t,e,n,r)}static calculateLrnaSpotPrice(t,e){return(0,T.calculate_lrna_spot_price)(t,e)}static calculateInGivenOut(t,e,n,r,a,s,i,o,l){return(0,T.calculate_in_given_out)(t,e,n,r,a,s,i,o,l)}static calculateLrnaInGivenOut(t,e,n,r,a){return(0,T.calculate_lrna_in_given_out)(t,e,n,r,a)}static calculateOutGivenIn(t,e,n,r,a,s,i,o,l){return(0,T.calculate_out_given_in)(t,e,n,r,a,s,i,o,l)}static calculateOutGivenLrnaIn(t,e,n,r,a){return(0,T.calculate_out_given_lrna_in)(t,e,n,r,a)}static calculateShares(t,e,n,r){return(0,T.calculate_shares)(t,e,n,r)}static calculateLiquidityOut(t,e,n,r,a,s,i,o){return(0,T.calculate_liquidity_out)(t,e,n,r,a,s,i,o)}static calculateLiquidityLRNAOut(t,e,n,r,a,s,i,o){return(0,T.calculate_liquidity_lrna_out)(t,e,n,r,a,s,i,o)}static calculateCapDifference(t,e,n,r){let a=(0,mt.default)(e),s=(0,mt.default)(t),i=(0,mt.default)(r),o=(0,mt.default)(n),l=(0,mt.default)(10).pow(18),u=o.div(l);if(a.div(i).lt(u)){let d=u.times(i).minus(a).times(s),m=a.times((0,mt.default)(1).minus(u));return d.div(m).toFixed(0)}else return"0"}static verifyAssetCap(t,e,n,r){return(0,T.verify_asset_cap)(t,e,n,r)}static calculateLimitHubIn(t,e,n,r){return(0,T.calculate_liquidity_hub_in)(t,e,n,r)}static isSellAllowed(t){return(0,T.is_sell_allowed)(t)}static isBuyAllowed(t){return(0,T.is_buy_allowed)(t)}static isAddLiquidityAllowed(t){return(0,T.is_add_liquidity_allowed)(t)}static isRemoveLiquidityAllowed(t){return(0,T.is_remove_liquidity_allowed)(t)}};var{FeeUtils:xt}=k,Kt=class c{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;hubAssetId;static fromPool(t){return new c(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=A.isSellAllowed(t.tradeableIn),l=A.isBuyAllowed(t.tradeableOut);(!o||!l)&&i.push("TradeNotAllowed"),(e<this.minTradingLimit||r<t.assetInEd)&&i.push("InsufficientTradingAmount");let u=t.balanceOut/this.maxOutRatio;e>u&&i.push("MaxOutRatioExceeded");let p=t.balanceIn/this.maxInRatio;return a>p&&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=A.isSellAllowed(t.tradeableIn),l=A.isBuyAllowed(t.tradeableOut);(!o||!l)&&i.push("TradeNotAllowed"),(e<this.minTradingLimit||r<t.assetOutEd)&&i.push("InsufficientTradingAmount");let u=t.balanceIn/this.maxInRatio;e>u&&i.push("MaxInRatioExceeded");let p=t.balanceOut/this.maxOutRatio;return a>p&&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=A.calculateInGivenOut(t.balanceIn.toString(),t.hubReservesIn.toString(),t.sharesIn.toString(),t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),n?xt.toRaw(n.assetFee).toString():"0",n?xt.toRaw(n.protocolFee).toString():"0"),a=BigInt(r);return a<0n?0n:a}calculateLrnaInGivenOut(t,e,n){let r=A.calculateLrnaInGivenOut(t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),n?xt.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=A.calculateOutGivenIn(t.balanceIn.toString(),t.hubReservesIn.toString(),t.sharesIn.toString(),t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),n?xt.toRaw(n.assetFee).toString():"0",n?xt.toRaw(n.protocolFee).toString():"0"),a=BigInt(r);return a<0n?0n:a}calculateOutGivenLrnaIn(t,e,n){let r=A.calculateOutGivenLrnaIn(t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),n?xt.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=A.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=A.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=A.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=A.calculateLrnaSpotPrice(t.balanceOut.toString(),t.hubReservesOut.toString()),n=Math.pow(10,18-t.decimalsIn);return BigInt(e)/BigInt(n)}};var ye=require("polkadot-api"),Fn=require("@polkadot-api/utils"),zt=require("rxjs");var{FeeUtils:at}=k,jt=class extends V{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:u,value:p})=>{let[d]=u,{hub_reserve:m,shares:y,tradable:b,cap:g,protocol_shares:P}=p,[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:g,hubReserves:m,protocolShares:P,shares:y,tradeable:b,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=(0,Fn.toHex)(e);return(0,ye.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)]),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:at.fromPermill(o),protocolFee:at.fromPermill(l),min:at.fromPermill(s),max:at.fromPermill(i)}}else return{assetFee:at.fromPermill(n.min_fee),protocolFee:at.fromPermill(r.min_fee),min:at.fromPermill(s),max:at.fromPermill(i)}}getPoolType(){return"Omnipool"}async isSupported(){let t=this.api.query.Omnipool.Assets,e=await this.api.compatibilityToken;return t.isCompatible(ye.CompatibilityLevel.BackwardsCompatible,e)}subscribePoolChange(t){return this.api.query.Omnipool.Assets.watchEntries({at:"best"}).pipe((0,zt.distinctUntilChanged)((n,r)=>!r.deltas),(0,zt.map)(({entries:n})=>n.map(r=>{let[a]=r.args,{hub_reserve:s,shares:i,tradable:o,cap:l,protocol_shares:u}=r.value,p=t.tokens.findIndex(m=>m.id===a);return{...t.tokens[p],cap:l,hubReserves:s,protocolShares:u,shares:i,tradeable:o}})),(0,zt.map)(n=>{let r=t.tokens.find(a=>a.id===1);return{...t,tokens:[...n,r]}}))}};var $e={};x($e,{StableMath:()=>E,StableSwap:()=>Qt,StableSwapClient:()=>$t});var B=require("@galacticcouncil/math-stableswap"),E=class{static getPoolAddress(t){return(0,B.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,B.calculate_amplification)(t,e,n,r,a)}static calculateInGivenOut(t,e,n,r,a,s,i){return(0,B.calculate_in_given_out)(t,e,n,r,a,s,i)}static calculateAddOneAsset(t,e,n,r,a,s,i){return(0,B.calculate_add_one_asset)(t,e,n,r,a,s,i)}static calculateSharesForAmount(t,e,n,r,a,s,i){return(0,B.calculate_shares_for_amount)(t,e,n,r,a,s,i)}static calculateOutGivenIn(t,e,n,r,a,s,i){return(0,B.calculate_out_given_in)(t,e,n,r,a,s,i)}static calculateLiquidityOutOneAsset(t,e,n,r,a,s,i){return(0,B.calculate_liquidity_out_one_asset)(t,e,n,r,a,s,i)}static calculateShares(t,e,n,r,a,s){return(0,B.calculate_shares)(t,e,n,r,a,s)}static calculateSpotPriceWithFee(t,e,n,r,a,s,i,o){return(0,B.calculate_spot_price_with_fee)(t,e,n,r,a,s,i,o)}static recalculatePegs(t,e,n,r,a){let s=(0,B.recalculate_peg)(t,e,n,r,a);return JSON.parse(s)}};var{FeeUtils:it}=k,Qt=class c{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;amplification;id;fee;totalIssuance;static fromPool(t){return new c(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=it.toPct(n.fee),i=[],o=A.isSellAllowed(t.tradeableIn),l=A.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=it.toPct(n.fee),i=[],o=A.isSellAllowed(t.tradeableIn),l=A.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=E.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=E.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=E.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=E.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=E.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=E.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=E.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=E.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=E.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,nt.jsonFormatter)}getAssets(t,e){let n={asset_id:Number(t),amount:e.toString()};return JSON.stringify([n],nt.jsonFormatter)}};var be=require("polkadot-api"),En=require("@polkadot-api/utils"),Cn=require("@noble/hashes/blake2b"),It=require("rxjs");var{FeeUtils:dt}=k,$t=class extends V{poolsData=new Map([]);getPoolType(){return"Stableswap"}getPoolAddress(t){let e=E.getPoolAddress(t),n=(0,Cn.blake2b)(e,{dkLen:32}),r=(0,En.toHex)(n);return(0,be.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:s,final_block:i}=e,o=E.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(be.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:s})=>{let[i]=a,o=this.getPoolAddress(i),[l,u,p]=await Promise.all([this.getPoolDelta(i,s,e),this.getPoolTokens(i,s),this.getPoolPegs(i,s,e)]);return u.push({id:i,tradeable:15,balance:l.totalIssuance,decimals:18}),this.poolsData.set(o,s),{address:o,id:i,type:"Stableswap",fee:dt.fromPermill(s.fee),tokens:u,...l,...p,...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=dt.fromPermill(r.max_peg_update),o=dt.fromPermill(e.fee),[l,u]=E.recalculatePegs(JSON.stringify(s),JSON.stringify(a),n.toString(),dt.toRaw(i).toString(),dt.toRaw(o).toString()),p=Number(l)*1e6;return{pegsFee:dt.fromPermill(p),pegs:u}}getDefaultPegs(t){let e=t.fee,n=E.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(([i,o])=>o),s=r.map(async(i,o)=>{if(i.type==="Oracle"){let[l,u,p]=i.value,d=[p,a[o]].sort((f,S)=>f-S),m=await this.api.query.EmaOracle.Oracles.getValue(l,d,u);if(!m)return;let[{price:y,updated_at:b}]=m,g=y.n.toString(),P=y.d.toString();return p.toString()===d[0].toString()?[[g,P],b.toString()]:[[P,g],b.toString()]}else if(i.type==="MMOracle"){let l=i.value.asHex(),{price:u,decimals:p,updatedAt:d}=await this.mmOracle.getData(l),m=10**p;return[[u.toString(),m.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?(0,It.of)(t):e.watchValue("best").pipe((0,It.switchMap)(r=>Promise.all([this.getPoolDelta(t.id,n,r),this.getPoolPegs(t.id,n,r)])),(0,It.map)(([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 Je={};x(Je,{XykMath:()=>Z,XykPool:()=>Jt,XykPoolClient:()=>Zt});var R=require("@galacticcouncil/math-xyk"),Z=class{static getSpotPrice(t,e,n){return(0,R.get_spot_price)(t,e,n)}static calculateInGivenOut(t,e,n){return(0,R.calculate_in_given_out)(t,e,n)}static calculateOutGivenIn(t,e,n){return(0,R.calculate_out_given_in)(t,e,n)}static calculatePoolTradeFee(t,e,n){return(0,R.calculate_pool_trade_fee)(t,e,n)}static calculateLiquidityIn(t,e,n){return(0,R.calculate_liquidity_in)(t,e,n)}static calculateSpotPrice(t,e){return(0,R.calculate_spot_price)(t,e)}static calculateSpotPriceWithFee(t,e,n,r){return(0,R.calculate_spot_price_with_fee)(t,e,n,r)}static calculateShares(t,e,n){return(0,R.calculate_shares)(t,e,n)}static calculateLiquidityOutAssetA(t,e,n,r){return(0,R.calculate_liquidity_out_asset_a)(t,e,n,r)}static calculateLiquidityOutAssetB(t,e,n,r){return(0,R.calculate_liquidity_out_asset_b)(t,e,n,r)}};var{FeeUtils:kn}=k,Jt=class c{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;static fromPool(t){return new c(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=kn.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 u=t.balanceIn/this.maxInRatio;return i>u&&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=kn.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 u=t.balanceOut/this.maxOutRatio;return i>u&&o.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:r,amountOut:i,feePct:s,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 Dn=require("polkadot-api"),Mn=require("rxjs");var Zt=class extends V{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,[u,p,d,m]=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:p?.decimals,existentialDeposit:p?.existential_deposit,balance:u.transferable,type:p?.asset_type.type},{id:l,decimals:m?.decimals,existentialDeposit:m?.existential_deposit,balance:d.transferable,type:m?.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(Dn.CompatibilityLevel.BackwardsCompatible,e)}subscribePoolChange(t){return(0,Mn.of)(t)}};var Ze={};x(Ze,{AavePool:()=>te,AavePoolClient:()=>ee});var te=class c{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;static fromPool(t){return new c(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}};var qn=require("polkadot-api"),Nn=require("@polkadot-api/utils"),vt=require("rxjs"),Gn=require("viem");var Ln=[{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:Fr}=lt,Er=["Supply","Withdraw","Repay","Borrow"],ee=class extends V{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,u]=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:u,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=(0,Nn.toHex)(r);return(0,qn.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: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,u=o.map(y=>y.asHex()),p=l.asHex(),{eventName:d,args:m}=(0,Gn.decodeEventLog)({abi:Ln,topics:u,data:p});return Er.includes(d)&&m.reserve.toLowerCase()===r.toLowerCase()});return(0,vt.merge)([a,s]).pipe((0,vt.switchMap)(()=>this.getPoolDelta(t)),(0,vt.map)(i=>({...t,tokens:[...i]})))}getReserveH160Id(t){return t.type==="Erc20"?nt.findNestedKey(t.location,"AccountKey20").AccountKey20.key:Fr.fromAssetId(t.id)}};var Ot=class{static get(t){switch(t.type){case"Aave":return te.fromPool(t);case"XYK":return Jt.fromPool(t);case"Omnipool":return Kt.fromPool(t);case"LBP":return Wt.fromPool(t);case"Stableswap":return Qt.fromPool(t);default:throw new Error("Pool type "+t.type+" is not supported yet")}}};var $=require("rxjs");var At=class extends C{evm;lbpClient;omniClient;stableClient;xykClient;aaveClient;active=new Set([]);clients=[];pools=new Map([]);lbpSub=$.Subscription.EMPTY;omniSub=$.Subscription.EMPTY;stableSub=$.Subscription.EMPTY;xykSub=$.Subscription.EMPTY;aaveSub=$.Subscription.EMPTY;isReady=!1;isDestroyed=new $.Subject;constructor(t,e){super(t),this.evm=e,this.lbpClient=new Xt(t,e),this.omniClient=new jt(t,e),this.stableClient=new $t(t,e),this.xykClient=new Zt(t,e),this.aaveClient=new ee(t,e),this.clients=[this.lbpClient,this.omniClient,this.stableClient,this.xykClient,this.aaveClient]}subscribe(t){return t.getSubscriber().pipe((0,$.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),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 Vt(t.type)}};var ln={};x(ln,{DEFAULT_BLOCK_TIME:()=>Hn,DEFAULT_MIN_BUDGET:()=>rn,ORDER_MIN_BLOCK_PERIOD:()=>Un,Router:()=>_t,TWAP_BLOCK_PERIOD:()=>ie,TWAP_MAX_DURATION:()=>sn,TWAP_MAX_PRICE_IMPACT:()=>an,TWAP_TX_MULTIPLIER:()=>jl,TradeOrderError:()=>nn,TradeOrderType:()=>Pe,TradeRouteBuilder:()=>H,TradeRouter:()=>Bt,TradeScheduler:()=>Rt,TradeType:()=>he});var ne=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 Cr=8,re=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 ne,s=[];for(s.push([e,""]),a.enqueue(s);a.size()>0;){let i=a.dequeue();if(!i||i.length>Cr)continue;let o=i[i.length-1];(n===null||o[0]===n)&&r.push(i),t.get(o[0])?.forEach(u=>{if(this.isNotVisited(u,i)){let p=[...i];p.push(u),a.enqueue(p)}})}return r}findShortestPaths(t,e,n){let r=[],a=new ne,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 u=t.get(l[0]);for(let p of u??[])this.isNotVisited(p,o)&&a.enqueue([...o,p])}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 en(c){let t={};for(let e of c){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 ae=class{getProposals(t,e,n){let r=n.filter(g=>g.type==="XYK"),a=n.filter(g=>g.type!=="XYK"),s=new Set(a.map(g=>g.tokens).flat().map(g=>g.id)),i=s.has(t),o=s.has(e),l=new re,u=g=>{let P=en(g),f=Object.keys(P),S=f.flatMap(v=>P[v]);return l.buildAndPopulateGraph(f,S)};if(!i&&!o){let g=r.filter(S=>S.tokens.find(v=>v.id===t)||S.tokens.find(v=>v.id===e)),P=u(g),f=l.findPaths(P,t,e);return this.parsePaths(f)}if(i&&o){let g=u(a),P=l.findPaths(g,t,e);return this.parsePaths(P)}let p=i?e:t,d=r.filter(g=>g.tokens.some(P=>P.id===p));if(d.length===0)return[];let m=[...a,...d],y=u(m),b=l.findPaths(y,t,e);return this.parsePaths(b)}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 _t=class{routeSuggester;routeProposals;routerOptions;ctx;constructor(t,e={}){this.ctx=t,this.routeSuggester=new ae,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,Ot.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 he=(e=>(e.Buy="Buy",e.Sell="Sell",e))(he||{}),Pe=(n=>(n.Dca="Dca",n.TwapSell="TwapSell",n.TwapBuy="TwapBuy",n))(Pe||{}),nn=(n=>(n.OrderTooSmall="OrderTooSmall",n.OrderTooBig="OrderTooBig",n.OrderImpactTooBig="OrderImpactTooBig",n))(nn||{});var{FeeUtils:Vn}=k,Bt=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),a=super.getPaths(t,e,n);if(!a.length)throw new Ht(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?Vn.toPct(t.min):void 0,n=t.max?Vn.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(u=>this.toSellSwaps(n,u,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,u=this.getRouteFeeRange(e),p=a?r.tradeFeePct:O.calculateSellFee(o,i),d=Math.pow(10,n.assetInDecimals),m=n.amountIn*s/BigInt(d),y=O.calculateDiffToRef(o,m);return{type:"Sell",amountIn:n.amountIn,amountOut:r.amountOut,spotPrice:s,tradeFee:l,tradeFeePct:p,tradeFeeRange:u,priceImpactPct:y,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:p,tradeFeeRange:u,priceImpactPct:y,swaps:e.map(b=>b.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 u=i.calculateOutGivenIn(o,l);r.push(u)}return r[r.length-1]}async calculateMostLiquidRoute(t,e,n){let{paths:r,pools:a,poolsMap:s}=n,l=a.filter(b=>b.tokens.some(g=>g.id===t)).map(b=>b.type==="Aave"?b.tokens:b.tokens.filter(g=>g.id===t)).map(b=>b.map(g=>g.balance).reduce((g,P)=>g+P)).sort((b,g)=>g<b?-1:1)[0],u=O.getFraction(l,.1),p=await Promise.all(r.map(b=>this.toSellSwaps(u,b,s))),m=this.findBestSellRoute(p).map(b=>({poolAddress:b.poolAddress,poolId:b?.poolId,pool:b.pool,assetIn:b.assetIn,assetOut:b.assetOut})),y=this.buildRouteKey(t,e,a);return this.mlr.set(y,m),m}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 u=await this.ctx.getPoolFees(i,o.assetOut),{amountOut:p,calculatedOut:d,feePct:m,errors:y}=i.validateAndSell(o,l,u),b=this.getPoolFeeRange(u),g=i.spotPriceOutGivenIn(o),P=Math.pow(10,o.decimalsIn),f=l*g/BigInt(P),S=O.calculateDiffToRef(d,f);r.push({...s,assetInDecimals:o.decimalsIn,assetOutDecimals:o.decimalsOut,amountIn:l,amountOut:p,calculatedOut:d,spotPrice:g,tradeFeePct:m,tradeFeeRange:b,priceImpactPct:S,errors:y,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(p,o.decimalsOut),calculatedOut:h.toDecimal(d,o.decimalsOut),spotPrice:h.toDecimal(g,o.decimalsOut),tradeFeePct:m,tradeFeeRange:b,priceImpactPct:S,errors:y}}})}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),u=o[o.length-1].assetOutDecimals;return{amount:l,decimals:u}})}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(u=>this.toBuySwaps(n,u,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,u=this.getRouteFeeRange(e),p=a?r.tradeFeePct:O.calculateBuyFee(o,i),d=Math.pow(10,n.assetOutDecimals),m=n.amountOut*s/BigInt(d),y;return o===0n?y=-100:y=O.calculateDiffToRef(m,o),{type:"Buy",amountOut:n.amountOut,amountIn:r.amountIn,spotPrice:s,tradeFee:l,tradeFeePct:p,tradeFeeRange:u,priceImpactPct:y,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:p,tradeFeeRange:u,priceImpactPct:y,swaps:e.map(b=>b.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 u=i.calculateInGivenOut(o,l);r.unshift(u)}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 u=await this.ctx.getPoolFees(i,o.assetOut),{amountIn:p,calculatedIn:d,feePct:m,errors:y}=i.validateAndBuy(o,l,u),b=this.getPoolFeeRange(u),g=i.spotPriceInGivenOut(o),P=Math.pow(10,o.decimalsOut),f=l*g/BigInt(P),S;d===0n?S=-100:S=O.calculateDiffToRef(f,d),r.unshift({...s,assetInDecimals:o.decimalsIn,assetOutDecimals:o.decimalsOut,amountOut:l,amountIn:p,calculatedIn:d,spotPrice:g,tradeFeePct:m,tradeFeeRange:b,priceImpactPct:S,errors:y,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(p,o.decimalsIn),calculatedIn:h.toDecimal(d,o.decimalsIn),spotPrice:h.toDecimal(g,o.decimalsIn),tradeFeePct:m,tradeFeeRange:b,priceImpactPct:S,errors:y}}})}return r}};var Hn=6e3,rn=1000000000000000n,ie=6,an=-5,sn=216e5,jl=3,Un=6;var on=require("polkadot-api");var H=class{static build(t){return t.map(({assetIn:e,assetOut:n,pool:r,poolId:a})=>r==="Stableswap"?{pool:(0,on.Enum)("Stableswap",a),asset_in:e,asset_out:n}:{pool:(0,on.Enum)(r),asset_in:e,asset_out:n})}};var Rt=class{schedulerOptions;router;constructor(t,e={}){this.router=t,this.schedulerOptions=Object.freeze({blockTime:e.blockTime??6e3,minBudgetInNative:e.minBudgetInNative??rn})}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:u}=i,p=l[0],d=l[l.length-1],{assetInDecimals:m}=p,{assetOutDecimals:y}=d,b=Math.abs(u),g=this.getMinimumTradeCount(o,s),P=this.getOptimalTradeCount(b),f=a?Math.round(r/a):P,S=Math.ceil(r/g),v=Math.round(r/P),L=Math.round(r/f),N=o/BigInt(f),M=await this.router.getBestSell(t,e,N),U=o<s,W=[];U&&W.push("OrderTooSmall");let tt=M.amountOut*BigInt(f),Ct=this.toBlockPeriod(L),st=M.tradeFee*BigInt(f),we=H.build(l),kt={assetIn:t,assetOut:e,errors:W,frequencyMin:S,frequencyOpt:v,frequency:L,tradeCount:f,tradeFee:st,tradeImpactPct:M.priceImpactPct,tradePeriod:Ct,tradeRoute:we,type:"Dca"};return{...kt,amountIn:o,amountOut:tt,tradeAmountIn:M.amountIn,tradeAmountOut:M.amountOut,toHuman(){return{...kt,amountIn:h.toDecimal(o,m),amountOut:h.toDecimal(tt,y),tradeAmountIn:h.toDecimal(M.amountIn,m),tradeAmountOut:h.toDecimal(M.amountOut,y)}}}}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],u=i[i.length-1],{assetInDecimals:p}=l,{assetOutDecimals:d}=u,m=Math.abs(o),y=this.getTwapTradeCount(m),b=s/BigInt(y),g=await this.router.getBestSell(l.assetIn,u.assetOut,b),P=y===1,f=s<r,S=g.priceImpactPct<-5,v=[];f||P?v.push("OrderTooSmall"):S&&v.push("OrderImpactTooBig");let L=g.amountOut*BigInt(y),N=g.tradeFee*BigInt(y),M=H.build(i),U={assetIn:t,assetOut:e,errors:v,tradeCount:y,tradeImpactPct:g.priceImpactPct,tradePeriod:6,tradeRoute:M,type:"TwapSell"};return{...U,amountIn:s,amountOut:L,tradeAmountIn:g.amountIn,tradeAmountOut:g.amountOut,tradeFee:N,toHuman(){return{...U,amountIn:h.toDecimal(s,p),amountOut:h.toDecimal(L,d),tradeAmountIn:h.toDecimal(g.amountIn,p),tradeAmountOut:h.toDecimal(g.amountOut,d),tradeFee:h.toDecimal(N,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],u=i[i.length-1],{assetInDecimals:p}=l,{assetOutDecimals:d}=u,m=Math.abs(o),y=this.getTwapTradeCount(m),b=s/BigInt(y),g=await this.router.getBestBuy(l.assetIn,u.assetOut,b),P=g.amountIn*BigInt(y),f=y===1,S=P<r,v=g.priceImpactPct<-5,L=[];S||f?L.push("OrderTooSmall"):v&&L.push("OrderImpactTooBig");let N=g.tradeFee*BigInt(y),M=H.build(i),U={assetIn:t,assetOut:e,errors:L,tradeCount:y,tradeImpactPct:g.priceImpactPct,tradePeriod:6,tradeRoute:M,type:"TwapBuy"};return{...U,amountIn:P,amountOut:s,tradeAmountIn:g.amountIn,tradeAmountOut:g.amountOut,tradeFee:N,toHuman(){return{...U,amountIn:h.toDecimal(P,p),amountOut:h.toDecimal(s,d),tradeAmountIn:h.toDecimal(g.amountIn,p),tradeAmountOut:h.toDecimal(g.amountOut,d),tradeFee:h.toDecimal(N,p)}}}}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:()=>Xn,BIG_BILL:()=>Kn,StakingApi:()=>se,StakingClient:()=>oe});var Wn=require("@polkadot/util-crypto"),Yn=require("@polkadot/util"),yt=require("@galacticcouncil/math-staking"),gt=ot(require("big.js")),Xn=(0,gt.default)(10),Kn=(0,gt.default)(Xn.pow(12));function kr(c){return(0,Wn.encodeAddress)((0,Yn.stringToU8a)(("modl"+c).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=kr(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,u=i,p=o.amount,d=o.conviction.toString(),m=await this.client.getReferendumInfo(u);return m&&(m.type==="Approved"||m.type==="Rejected")&&l.push({id:u,amount:p,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,u,p]=await Promise.all([this.getFreePotBalance(),this.client.getPeriodLength(),this.client.getUnclaimablePeriods(),this.client.getSixBlockSince()]),d=(0,gt.default)(o.toString()).minus(r.toString()),m=a.toString(),y=(0,gt.default)(e).plus(1).toString();d.gt(0)&&s>0&&(m=(0,yt.calculate_accumulated_rps)(a.toString(),d.toString(),s.toString()));let b=(0,yt.calculate_period_number)(l.toString(),e,p??y),g=(0,yt.calculate_period_number)(l.toString(),i.createdAt?.toString()??"",p??y),P=(0,yt.calculate_rewards)(m,i.rewardPerStake?.toString()??"",i.stake?.toString()??""),f=(0,gt.default)(P).plus(i.accumulatedUnpaidRewards?.toString()||"0").plus(i.accumulatedLockedRewards?.toString()||"0");if(!(0,gt.default)(b).minus(g).lte(u.toString()))return f.div(Kn).toString()}};var oe=class extends C{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 pn={};x(pn,{TxBuilderFactory:()=>Et});var cn=require("polkadot-api");function zn(c){let t=[],e=c;for(;e&&typeof e=="object"&&"type"in e;)t.push(e.type),e=e.value;return t.join(".")}var Ft=class extends C{evm;evmClient;balanceClient;aaveUtils;constructor(t,e){super(t),this.evm=e,this.evmClient=e.getWsProvider(),this.balanceClient=new G(t),this.aaveUtils=new ut(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:Oe})}async dryRun(t,e){let n=(0,cn.Enum)("Signed",t),r=(0,cn.Enum)("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=zn(i.value);throw new Error("Dry run execution error!",{cause:o})}return s}isDirectOmnipoolTrade(t){return t.length===1&&t[0].pool==="Omnipool"}};var fe=class extends Ft{_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,u;return this.isDirectOmnipoolTrade(n)?u=this.api.tx.Omnipool.buy({asset_in:i,asset_out:o,amount:e,max_sell_amount:l}):u=this.api.tx.Router.buy({asset_in:i,asset_out:o,amount_out:e,max_amount_in:l,route:H.build(n)}),this.wrapTx("RouterBuy",u)}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,u;return this.isDirectOmnipoolTrade(n)?u=this.api.tx.Omnipool.sell({asset_in:i,asset_out:o,amount:t,min_buy_amount:l}):u=this.api.tx.Router.sell({asset_in:i,asset_out:o,amount_in:t,min_amount_out:l,route:H.build(n)}),r.isWithdraw()&&await this.aaveUtils.hasBorrowPositions(this.beneficiary)&&(u=await this.dispatchWithExtraGas(u)),this.wrapTx("RouterSell",u)}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:H.build(e)});return n.isWithdraw()&&await this.aaveUtils.hasBorrowPositions(this.beneficiary)&&(l=await this.dispatchWithExtraGas(l)),this.wrapTx("RouterSellAll",l)}};var Se=require("polkadot-api");var Te=class extends Ft{_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:(0,Se.Enum)("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,u=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:(0,Se.Enum)("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",u)}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,u=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:(0,Se.Enum)("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",u)}};var Et=class{client;evmClient;constructor(t,e){this.client=t,this.evmClient=e}trade(t){return new fe(this.client,this.evmClient).setTrade(t)}order(t){return new Te(this.client,this.evmClient).setOrder(t)}};async function Dr(c){let t=new St(c),e=new Ut(c),[n,r]=await Promise.all([t.getBlockTime(),t.getMinOrderBudget()]),a=new At(c,e).withAave().withOmnipool().withStableswap().withXyk(),s=new ut(e),i=new Bt(a),o=new Rt(i,{blockTime:n,minBudgetInNative:r}),l=new G(c),u=new oe(c),p=new se(u,l);return{api:{aave:s,router:i,scheduler:o,staking:p},client:{asset:new ft(c),balance:l,evm:e,mining:new Tt(c)},ctx:{pool:a},tx:new Et(c,e),destroy:()=>{a.destroy()}}}0&&(module.exports={aave,api,big,client,const:null,createSdkContext,erc20,error,evm,fmt,h160,json,math,pool,sor,staking,tx,xc});
package/build/index.mjs CHANGED
@@ -1 +1 @@
1
- var hn=Object.defineProperty;var T=(u,t)=>{for(var e in t)hn(u,e,{get:t[e],enumerable:!0})};var Ae={};T(Ae,{Papi:()=>B,getWs:()=>Tn});import{hydration as Pn}from"@galacticcouncil/descriptors";function Oe(u){switch(u){case!0:case"true":case 1:case"1":case"on":case"yes":return!0;default:return!1}}var B=class{client;api;constructor(t){this.client=t,this.api=this.client.getTypedApi(Pn)}log(t,...e){let n=typeof window>"u"?process.env.GC_DEBUG:window.localStorage.getItem("gc.debug");Oe(n)&&console.log(t,...e)}};import{createClient as fn}from"polkadot-api";import{withPolkadotSdkCompat as Sn}from"polkadot-api/polkadot-sdk-compat";var Tn=async u=>{let t=typeof u=="string"?u.split(","):u,a=(typeof window>"u"?(await import("polkadot-api/ws-provider/node")).getWsProvider:(await import("polkadot-api/ws-provider/web")).getWsProvider)(t);return fn(Sn(a))};var Ce={};T(Ce,{AAVE_GAS_LIMIT:()=>ee,AAVE_LENDING_POOL_ADDRESS:()=>Wt,AAVE_POOL_ABI:()=>Zt,AAVE_POOL_DATA_PROVIDER:()=>Vt,AAVE_POOL_DATA_PROVIDER_ABI:()=>Ut,AAVE_POOL_PROXY:()=>te,AAVE_ROUNDING_THRESHOLD:()=>Xr,AAVE_UINT_256_MAX:()=>xn,AaveClient:()=>ht,AaveUtils:()=>Q});var Zt=[{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 Ut=[{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 te="0x1b02E051683b5cfaC5929C25E84adb26ECf87B38",Vt="0x112b087b60C1a166130d59266363C45F8aa99db0",Wt="0xf3Ba4D1b50f78301BDD7EAEa9B67822A15FCA691",ee=1000000n,Xr=5,xn=BigInt("0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");var ht=class{client;constructor(t){this.client=t.getWsProvider()}async getReservesData(){return await this.client.readContract({abi:Ut,address:Vt,args:[Wt],functionName:"getReservesData"})}async getUserReservesData(t){return await this.client.readContract({abi:Ut,address:Vt,args:[Wt,t],functionName:"getUserReservesData"})}async getUserAccountData(t){return await this.client.readContract({abi:Zt,address:te,args:[t],functionName:"getUserAccountData"})}};var h={};T(h,{asBigInt:()=>vn,toBigInt:()=>In,toDecimal:()=>wn});import z from"big.js";z.NE=-18;function wn(u,t,e=6,n){let a=z(u.toString()),r=z(10).pow(t);return a.div(r).round(e,n).toString()}function In(u,t){let e=z(10).pow(t),a=z(u).mul(e).toFixed(0,z.roundDown);return BigInt(a)}function vn(u){return BigInt(u.round(0,z.roundDown).toFixed(0))}var tt={};T(tt,{ERC20:()=>ne});var ne=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 R={};T(R,{FeeUtils:()=>ie,shiftNeg:()=>ft});import Bn from"big.js";var Be={};T(Be,{HUB_ASSET_ID:()=>se,HYDRATION_OMNIPOOL_ADDRESS:()=>An,HYDRATION_PARACHAIN_ID:()=>On,HYDRATION_SS58_PREFIX:()=>k,PERBILL_DENOMINATOR:()=>ae,PERMILL_DENOMINATOR:()=>Pt,RUNTIME_DECIMALS:()=>I,SYSTEM_ASSET_DECIMALS:()=>re,SYSTEM_ASSET_ID:()=>G,TRADEABLE_DEFAULT:()=>et});var I=18,Pt=1e6,ae=1e9,G=0,re=12,On=2034,k=63,An="7L53bUTBbfuj14UpdCNPwmgzzHSsrsTWBHX5pys32mVWM3C1",se=1,et=15;var ie=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 a=10**n;return Math.round(t*a/e)/a}static safeRound(t){return parseFloat(t.toPrecision(15))}};function ft(u,t){let e=Bn(typeof u=="bigint"?u.toString():u);return t===0?e.toString():e.div(Math.pow(10,t)).toString()}var Yt={};T(Yt,{H160:()=>le,isEvmAccount:()=>Re,isEvmAddress:()=>Fe,isSs58Address:()=>Ee});import{AccountId as St}from"polkadot-api";import{toHex as _e}from"@polkadot-api/utils";import{Buffer as Y}from"buffer";var oe="ETH\0";function Re(u){if(!u)return!1;try{let t=St().enc(u),e=Y.from(oe);return Y.from(t.subarray(0,e.length)).equals(e)}catch{return!1}}function Fe(u){return!!/^0x[a-fA-F0-9]{40}$/.test(u)}function Ee(u){try{return St(63).enc(u),!0}catch{return!1}}var le=class u{static toAccount=t=>{let e=Y.from(t.slice(2),"hex"),n=Y.from(oe),a=Uint8Array.from(Y.concat([n,e,Y.alloc(8)])),r=_e(a);return St(63).dec(r)};static fromAccount=t=>{let e=St().enc(t),n=Y.from(oe),a=e.slice(n.length,-8);return"0x"+Y.from(a).toString("hex")};static fromSS58=t=>{let n=St().enc(t).slice(0,20);return _e(n)};static fromAny=t=>{if(Fe(t))return t;if(Re(t))return u.fromAccount(t);if(Ee(t))return u.fromSS58(t);throw new Error("Unknown address type")}};var $={};T($,{findNestedKey:()=>_n,findNestedObj:()=>Rn,jsonFormatter:()=>Fn});var _n=(u,t)=>{let e=[];return JSON.stringify(u,(n,a)=>(a&&a[t]&&e.push(a),a)),e[0]},Rn=(u,t,e)=>{let n;return JSON.stringify(u,(a,r)=>(r&&r[t]===e&&(n=r),r)),n},Fn=(u,t)=>typeof t=="bigint"?t.toString():t;var v={};T(v,{calculateBuyFee:()=>Dn,calculateDiffToAvg:()=>En,calculateDiffToRef:()=>kn,calculateSellFee:()=>Cn,getFraction:()=>Mn});import U from"big.js";function En(u,t){let e=U(u.toString()),n=U(t.toString());return e.minus(n).abs().div(e.plus(n).div(2)).mul(100).round(2).toNumber()}function kn(u,t){if(t===0n)return 0;let e=U(u.toString()),n=U(t.toString());return e.minus(n).div(n).mul(100).round(2).toNumber()}function Cn(u,t){let e=U(u.toString()),n=U(t.toString());return U(1).minus(n.div(e)).mul(100).round(2).toNumber()}function Dn(u,t){let e=U(u.toString());return U(t.toString()).div(e).minus(1).mul(100).round(2).toNumber()}function Mn(u,t,e=2){(t<.01||t>100)&&new Error("Supported range is from 0.01% - 100%");let n=Math.pow(10,e),a=BigInt(t*n);return u*a/BigInt(100*n)}var ke={};T(ke,{convertToId:()=>qn});import{Buffer as Ln}from"buffer";function qn(u){let e=Ln.from(u.replace("0x",""),"hex").subarray(16);return e.readUIntBE(0,e.length)}var{ERC20:Xt}=tt,{H160:ce}=Yt,Nn=1.01,Gn=99999,Hn=10n**27n,Un=10n**18n,Q=class{client;constructor(t){this.client=new ht(t)}async getSummary(t){let e=ce.fromAny(t),[n,a,r]=await Promise.all([this.client.getReservesData(),this.client.getUserReservesData(e),this.client.getUserAccountData(e)]),[i]=n,[s,o]=a,[l,c,p,d,m,g]=r,y=h.toDecimal(g,18),b=[];for(let P of s){let f=P.underlyingAsset.toLowerCase(),S=i.find(({underlyingAsset:j})=>j.toLowerCase()===f);if(!S)throw new Error("Missing pool reserve for "+f);let x=P.scaledATokenBalance,F=S.liquidityIndex,C=S.priceInMarketReferenceCurrency,_=x*F/Hn,N=Number(o===S.eModeCategoryId?S.eModeLiquidationThreshold:S.reserveLiquidationThreshold)/1e4,W=S.usageAsCollateralEnabled&&P.usageAsCollateralEnabledOnUser&&P.scaledATokenBalance>0n,bt=Xt.toAssetId(f);b.push({aTokenBalance:_,decimals:Number(S.decimals),isCollateral:W,priceInRef:C,reserveId:bt,reserveAsset:f,reserveLiquidationThreshold:N})}return{healthFactor:Number(y),totalCollateral:l,totalDebt:c,reserves:b}}async hasBorrowPositions(t){let e=ce.fromAny(t),n=await this.client.getUserAccountData(e),[a,r]=n;return r>0n}async getHealthFactor(t){let e=ce.fromAny(t),n=await this.client.getUserAccountData(e),[a,r,i,s,o,l]=n,c=h.toDecimal(l,18);return Number(c)}async getHealthFactorAfterWithdraw(t,e,n){let{totalCollateral:a,totalDebt:r,reserves:i}=await this.getSummary(t),s=Xt.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:p,reserveLiquidationThreshold:d}=o,m=h.toBigInt(n,l),g=c?m*p/10n**BigInt(l):0n,y=a-g;return y<=0n?0:this.calculateHealthFactor(y,d,r)}async getHealthFactorAfterSupply(t,e,n){let{totalCollateral:a,totalDebt:r,reserves:i}=await this.getSummary(t),s=Xt.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:p}=o,m=h.toBigInt(n,l)*c/10n**BigInt(l),g=a+m;return g<=0n?0:this.calculateHealthFactor(g,p,r)}async getMaxWithdraw(t,e){let{totalCollateral:n,totalDebt:a,reserves:r}=await this.getSummary(t),i=Xt.fromAssetId(e),s=r.find(o=>o.reserveAsset===i);if(!s)throw new Error("Missing reserve ctx for "+i);return this.calculateWithdrawMax(s,n,a)}async getMaxWithdrawAll(t){let{totalCollateral:e,totalDebt:n,reserves:a}=await this.getSummary(t),r={};for(let i of a){let s=this.calculateWithdrawMax(i,e,n);i.reserveId&&(r[i.reserveId]=s)}return r}calculateHealthFactor(t,e,n){if(n===0n)return Gn;let a=10n**6n,r=h.toBigInt(e,18),i=t*r*a,s=n*Un,o=i/s;return Number(o)/1e6}calculateRequiredCollateral(t,e,n){let a=h.toBigInt(t,18),r=h.toBigInt(e,18);return(a*n+r-1n)/r}calculateWithdrawMax(t,e,n){let{aTokenBalance:a,decimals:r,priceInRef:i,reserveLiquidationThreshold:s}=t,o=this.calculateRequiredCollateral(Nn,s,n),l=e-o;if(l<=0n)return{amount:0n,decimals:r};let c=l*10n**BigInt(r)/i;return{amount:a<c?a:c,decimals:r}}};var qe={};T(qe,{AssetClient:()=>nt,BalanceClient:()=>D,ChainParams:()=>rt,LiquidityMining:()=>Kt});var nt=class extends B{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:a})=>{let[r]=n;return[r,a]}))}async queryBonds(){let e=await this.api.query.Bonds.Bonds.getEntries();return new Map(e.map(({keyArgs:n,value:a})=>{let[r]=n;return[r,a]}))}async queryAssets(){let e=await this.api.query.AssetRegistry.Assets.getEntries();return new Map(e.filter(({value:n})=>{let{asset_type:a}=n;return this.SUPPORTED_TYPES.includes(a.type)}).map(({keyArgs:n,value:a})=>{let[r]=n;return[r,a]}))}async queryAssetLocations(){let e=await this.api.query.AssetRegistry.AssetLocations.getEntries();return new Map(e.map(({keyArgs:n,value:a})=>{let[r]=n;return[r,a]}))}async mapToken(t,e,n,a){let{name:r,asset_type:i,is_sufficient:s,existential_deposit:o}=e,{symbol:l,decimals:c}=n.get(t)??{};return{id:t,name:r?.asText(),symbol:l,decimals:c,icon:l,type:i.type,isSufficient:s,location:a,existentialDeposit:o}}async mapBond(t,e,n,a){let[r,i]=a,{asset_type:s,is_sufficient:o,existential_deposit:l}=e,{symbol:c,decimals:p}=await this.mapToken(r,e,n),d=Number(i),m=new Intl.DateTimeFormat("en-GB"),g=[c,"Bond",m.format(d)].join(" ");return{id:t,name:g,symbol:c+"b",decimals:p,icon:c,type:s.type,isSufficient:o,existentialDeposit:l,underlyingAssetId:r,maturity:d}}async mapShares(t,e,n,a){let{assets:r}=a,{name:i,symbol:s,asset_type:o,is_sufficient:l,existential_deposit:c}=e,p=await Promise.all(r.map(async g=>{let{symbol:y}=await this.mapToken(g,e,n);return[g,y]})),d=Object.fromEntries(p),m=Object.values(d);return{id:t,name:m.join(", "),symbol:s?.asText()||i?.asText(),decimals:18,icon:m.join("/"),type:o.type,isSufficient:l,existentialDeposit:c,meta:d}}async mapExternal(t,e,n,a){let r=await this.mapToken(t,e,new Map,a),i=n?.find(s=>s.internalId===r.id);return i?{...r,decimals:i.decimals,name:i.name,symbol:i.symbol,icon:i.symbol,isWhiteListed:i.isWhiteListed}:r}parseMetadata(t){return new Map(Array.from(t,([e,n])=>[e,{symbol:n.symbol?.asText(),decimals:n.decimals}]))}async getOnChainAssets(t,e){let[n,a,r,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 p=a.get(l),{asset_type:d}=c,m;switch(d.type){case"Bond":let g=i.get(l);m=await this.mapBond(l,c,s,g);break;case"StableSwap":let y=r.get(l);m=await this.mapShares(l,c,s,y);break;case"External":m=await this.mapExternal(l,c,e,p);break;default:m=await this.mapToken(l,c,s,p)}o.push(m)}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 Vn,bufferCount as Wn,combineLatest as Yn,debounceTime as Xn,distinctUntilChanged as De,finalize as Kn,map as at,pairwise as jn,shareReplay as zn,startWith as $n}from"rxjs";var D=class extends B{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 a=await this.api.query.Tokens.Accounts.getValue(t,e);return this.calculateBalance(a)}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),a=this.subscribeErc20Balance(t);return Yn([e,n,a]).pipe(Xn(250),at(r=>r.flat()),$n([]),Wn(2,1),at(([r,i],s)=>{if(s===0)return i;let o=r.reduce((c,p)=>(c.set(p.id,p.balance),c),new Map);return i.filter(c=>!Me(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(a=>({id:e,balance:a})))}subscribeTokensBalance(t){return this.api.query.Tokens.Accounts.watchEntries(t,{at:"best"}).pipe(De((n,a)=>!a.deltas),at(({deltas:n})=>{let a=[];return n?.deleted.forEach(r=>{let[i,s]=r.args;a.push({id:s,balance:this.calculateBalance({free:0n,reserved:0n,frozen:0n})})}),n?.upserted.forEach(r=>{let[i,s]=r.args;a.push({id:s,balance:this.calculateBalance(r.value)})}),a}))}subscribeErc20Balance(t,e){let n=new Vn,a=n.pipe(zn(1)),r=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 r(),l=async()=>{let d=(await Promise.all(o.map(async m=>{let g=await this.getTokenBalanceData(t,m);return[m,g]}))).map(([m,g])=>({id:m,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),a.pipe(Kn(()=>s?.()),jn(),at(([o,l],c)=>{if(c===0)return l;let p=o.reduce((m,g)=>(m.set(g.id,g.balance),m),new Map);return l.filter(m=>!Me(m.balance,p.get(m.id)))}),De((o,l)=>l.length===0))}async getTokenBalanceData(t,e){let n=await this.api.apis.CurrenciesApi.account(e,t);return this.calculateBalance(n)}},Me=(u,t)=>u!==void 0&&t!==void 0&&u.transferable===t.transferable&&u.total===t.total;var rt=class extends B{_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}};import{AccountId as Qn,Binary as Jn,Enum as Zn}from"polkadot-api";import{fixed_from_rational as Le}from"@galacticcouncil/math-liquidity-mining";import E from"big.js";var ta=BigInt(E(1).pow(18).toString()),ea=6,Kt=class extends B{balanceClient;omnipoolAssetIds=[];secondsInYear=E(365.2425).times(24).times(60).times(60);constructor(t){super(t),this.balanceClient=new D(t)}async getOraclePrice(t,e){let n=[t,e].sort((r,i)=>r-i);if(t===e)return ta;let a=await this.api.query.EmaOracle.Oracles.getValue(Jn.fromText("omnipool"),n,Zn("TenMinutes"));if(a){let{n:r,d:i}=a[0].price,s;return t<e?s=Le(r.toString(),i.toString()):s=Le(i.toString(),r.toString()),BigInt(s)}}getFarmAddress=(t,e)=>{let n=Buffer.from("modl","utf-8"),a=Buffer.from(e?"78796b4c4d704944":"4f6d6e6957684c4d","hex"),r=Buffer.from([t]),i=Buffer.concat([n,a,r]),o="0x"+Buffer.concat([i,Buffer.alloc(32-i.length)]).toString("hex");return Qn(63).dec(o)};getGlobalRewardPerPeriod(t,e,n,a){let r=E(a).times(t.toString()).times(e.toString()).div(18);return r.gte(n.toString())?n.toString():r.toString()}getPoolYieldPerPeriod(t,e,n,a){let r=E(t.toString()).times(e),i=E(n.toString()).times(a);return r.div(i.toString()).toString()}farmData(t,e,n){let{yieldFarm:a,globalFarm:r,priceAdjustment:i,balance:s}=t,{multiplier:o,loyalty_curve:l}=a,{blocks_per_period:c,yield_per_period:p,total_shares_z:d,max_reward_per_period:m,pending_rewards:g,accumulated_paid_rewards:y,planned_yielding_periods:b,updated_at:P,incentivized_asset:f,reward_currency:S,price_adjustment:x}=r,F=ft(i??x,18),C=ft(o,18),_=ft(l?.initial_reward_percentage??0,18),q=this.secondsInYear.div(E(ea).times(c)).toString(),N;if(d<0)N=E(C).times(p.toString()).times(q).toString();else{let bn=this.getGlobalRewardPerPeriod(d,p,m,F),yn=this.getPoolYieldPerPeriod(bn,C,d,F);N=E(yn).times(q).toString()}let W=g+y,bt=m*BigInt(b),j=s.transferable+W,Jt=j-W,yt=E(Jt.toString()).div(m.toString()),Ie=E(e).div(c.toString()).toString(),mn=(d>=0?yt.plus(P):yt.plus(Ie)).toString(),dn=E(d.toString()).div(E(m.toString()).div(p.toString())).div(Math.pow(10,18)).times(100).times(F).toFixed(2),ve=E(W.toString()).div(j.toString()).gte(.999);N=ve?"0":E(N).div(n?2:1).times(100).toString();let gn=_?E(N).times(_).toString():void 0;return{apr:N,minApr:gn,isDistributed:ve,estimatedEndPeriod:mn,maxRewards:bt,incentivizedAsset:f,rewardCurrency:S,loyaltyCurve:l,currentPeriod:Ie,potMaxRewards:j,fullness:dn}}async getOmnipoolFarms(t){let e=await this.api.query.OmnipoolWarehouseLM.ActiveYieldFarm.getEntries(Number(t)),a=(await this.api.query.ParachainSystem.ValidationData.getValue())?.relay_parent_number,r=await Promise.all(e.map(async({keyArgs:i,value:s})=>{let[,o]=i,l=s,c=await this.api.query.OmnipoolWarehouseLM.GlobalFarm.getValue(o),p=await this.api.query.OmnipoolWarehouseLM.YieldFarm.getValue(Number(t),o,l);if(!c||!p)return;let d=c.reward_currency,m=c.incentivized_asset,g=this.getFarmAddress(o),y=await this.getOraclePrice(d,m),b=await this.balanceClient.getTokenBalance(g,d);return{id:t,globalFarm:c,yieldFarm:p,priceAdjustment:y,balance:b}}));return a?r.map(i=>i?this.farmData(i,a):void 0):[]}async getIsolatedFarms(t){let e=await this.api.query.XYKWarehouseLM.ActiveYieldFarm.getEntries(t),a=(await this.api.query.ParachainSystem.ValidationData.getValue())?.relay_parent_number,r=await Promise.all(e.map(async({keyArgs:i,value:s})=>{let[,o]=i,l=s,c=await this.api.query.XYKWarehouseLM.GlobalFarm.getValue(o),p=await this.api.query.XYKWarehouseLM.YieldFarm.getValue(t,o,l);if(!c||!p)return;let d=c.reward_currency,m=c.incentivized_asset,g=this.getFarmAddress(o,!0),y=await this.getOraclePrice(d,m),b=await this.balanceClient.getBalance(g,d);return{id:t,globalFarm:c,yieldFarm:p,priceAdjustment:y,balance:b,farmAddress:g}}));return a?r.map(i=>i?this.farmData(i,a,!0):void 0):[]}};var Ne={};T(Ne,{AssetNotFound:()=>ue,PoolNotFound:()=>Tt,RouteNotFound:()=>xt});var ue=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"}},xt=class extends Error{constructor(t,e){super(),this.message=`Route from ${t} to ${e} not found in current configuration`,this.name="RouteNotFound"}};var Ue={};T(Ue,{EvmClient:()=>wt,createChain:()=>pe});import{defineChain as na}from"viem";var aa=["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"],pe=()=>na({id:222222,name:"Hydration",network:"hydration",nativeCurrency:{decimals:18,name:"WETH",symbol:"WETH"},rpcUrls:{default:{http:aa}},blockExplorers:{default:{name:"Hydration Explorer",url:"https://explorer.evm.hydration.cloud"}},testnet:!1});import{createPublicClient as Ge,createWalletClient as ra,custom as He,http as sa}from"viem";var wt=class{client;chain;constructor(t){this.client=t,this.chain=pe()}get chainId(){return this.chain.id}get chainCurrency(){return this.chain.nativeCurrency.symbol}get chainDecimals(){return this.chain.nativeCurrency.decimals}getProvider(){return Ge({chain:this.chain,transport:sa()})}getWsProvider(){return Ge({transport:He({request:({method:t,params:e})=>this.client._request(t,e||[])})})}getSigner(t){return ra({account:t,chain:this.chain,transport:He(window.ethereum)})}};var Je={};T(Je,{PoolContextProvider:()=>lt,PoolError:()=>J,PoolFactory:()=>ot,PoolType:()=>O,aave:()=>he,lbp:()=>de,omni:()=>ge,stable:()=>be,xyk:()=>ye});var de={};T(de,{LbpMath:()=>H,LbpPool:()=>It,LbpPoolClient:()=>Ot});import{calculate_in_given_out as ia,calculate_out_given_in as oa,calculate_linear_weights as la,calculate_pool_trade_fee as ca,get_spot_price as ua}from"@galacticcouncil/math-lbp";var H=class{static getSpotPrice(t,e,n,a,r){return ua(t,e,n,a,r)}static calculateInGivenOut(t,e,n,a,r){return ia(t,e,n,a,r)}static calculateOutGivenIn(t,e,n,a,r){return oa(t,e,n,a,r)}static calculateLinearWeights(t,e,n,a,r){return la(t,e,n,a,r)}static calculatePoolTradeFee(t,e,n){return ca(t,e,n)}};var O=(r=>(r.Aave="Aave",r.LBP="LBP",r.Omni="Omnipool",r.Stable="Stableswap",r.XYK="XYK",r))(O||{}),J=(r=>(r.InsufficientTradingAmount="InsufficientTradingAmount",r.MaxInRatioExceeded="MaxInRatioExceeded",r.MaxOutRatioExceeded="MaxOutRatioExceeded",r.TradeNotAllowed="TradeNotAllowed",r.UnknownError="UnknownError",r))(J||{});var{FeeUtils:Ve}=R,It=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,a,r,i,s){this.type="LBP",this.address=t,this.tokens=e,this.maxInRatio=n,this.maxOutRatio=a,this.minTradingLimit=r,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])),a=n.get(t),r=n.get(e);if(a==null)throw new Error("Pool does not contain tokenIn");if(r==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,balanceIn:a.balance,balanceOut:r.balance,decimalsIn:a.decimals,decimalsOut:r.decimals,weightIn:a.weight,weightOut:r.weight}}validateAndBuy(t,e,n){let a=this.tokens[0].id,r=[];e<this.minTradingLimit&&r.push("InsufficientTradingAmount");let i=t.balanceOut/this.maxOutRatio;if(e>i&&r.push("MaxOutRatioExceeded"),a===t.assetOut){let s=this.calculateTradeFee(e,n),o=Ve.toPct(this.repayFeeApply?n.repayFee:n.exchangeFee),l=e+s,c=this.calculateInGivenOut(t,l),p=t.balanceIn/this.maxInRatio;return c>p&&r.push("MaxInRatioExceeded"),{amountIn:c,calculatedIn:c,amountOut:e,feePct:o,errors:r}}else{let s=this.calculateInGivenOut(t,e),o=t.balanceIn/this.maxInRatio;return s>o&&r.push("MaxInRatioExceeded"),{amountIn:s,calculatedIn:s,amountOut:e,feePct:0,errors:r}}}validateAndSell(t,e,n){let a=this.tokens[0].id,r=[];e<this.minTradingLimit&&r.push("InsufficientTradingAmount");let i=t.balanceIn/this.maxInRatio;if(e>i&&r.push("MaxInRatioExceeded"),a===t.assetIn){let s=this.calculateOutGivenIn(t,e),o=t.balanceOut/this.maxOutRatio;return s>o&&r.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:s,amountOut:s,feePct:0,errors:r}}else{let s=this.calculateOutGivenIn(t,e),o=this.calculateTradeFee(s,n),l=Ve.toPct(this.repayFeeApply?n.repayFee:n.exchangeFee),c=s-o,p=t.balanceOut/this.maxOutRatio;return c>p&&r.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:s,amountOut:c,feePct:l,errors:r}}}calculateInGivenOut(t,e){let n=H.calculateInGivenOut(t.balanceIn.toString(),t.balanceOut.toString(),t.weightIn.toString(),t.weightOut.toString(),e.toString()),a=BigInt(n);return a<0n?0n:a}calculateOutGivenIn(t,e){let n=H.calculateOutGivenIn(t.balanceIn.toString(),t.balanceOut.toString(),t.weightIn.toString(),t.weightOut.toString(),e.toString()),a=BigInt(n);return a<0n?0n:a}spotPriceInGivenOut(t){let e=H.getSpotPrice(t.balanceOut.toString(),t.balanceIn.toString(),t.weightOut.toString(),t.weightIn.toString(),this.maxOutRatio.toString());return BigInt(e)}spotPriceOutGivenIn(t){let e=H.getSpotPrice(t.balanceIn.toString(),t.balanceOut.toString(),t.weightIn.toString(),t.weightOut.toString(),this.maxInRatio.toString());return BigInt(e)}calculateTradeFee(t,e){let n=H.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 ha}from"polkadot-api";import{map as Pa,of as je,switchMap as fa}from"rxjs";import{memoize1 as pa}from"@thi.ng/memoize";import{combineLatest as We,combineLatestAll as ma,debounceTime as da,firstValueFrom as ga,from as Ye,map as Xe,mergeAll as ba,of as ya,switchMap as Ke}from"rxjs";var me=[{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 vt=class{client;constructor(t){this.client=t.getWsProvider()}async getData(t,e=6){let[n,a,r]=await Promise.all([this.client.readContract({abi:me,address:t,functionName:"latestRoundData"}),this.client.readContract({abi:me,address:t,functionName:"decimals"}),this.client.getBlock()]),[i,s,o,l]=n,c=r.number-(r.timestamp-l)/BigInt(e),p=Number(c);return{price:s,decimals:a,updatedAt:p<0?0:p}}};var M=class extends D{evm;mmOracle;override=[];mem=0;memPools=pa(t=>(this.log(this.getPoolType(),"mem pools",t,"\u2705"),this.loadPools()));constructor(t,e){super(t),this.evm=e,this.mmOracle=new vt(e)}async withOverride(t){this.override=t||[]}async getPoolsMem(){return this.memPools(this.mem)}async getPools(){let t=Ye(this.getPoolsMem()).pipe(Ke(e=>this.subscribe(e)),ma());return ga(t)}getSubscriber(){return Ye(this.getPoolsMem()).pipe(Ke(t=>this.subscribe(t)),ba())}subscribe(t){return t.filter(e=>this.hasValidAssets(e)).map(e=>We([this.subscribePoolChange(e),this.subscribePoolBalance(e)]).pipe(da(250),Xe(([n,a])=>this.updatePool(n,a))))}subscribePoolBalance(t){if(t.type==="Aave")return ya([]);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(r=>r.type==="Erc20").map(r=>r.id),a=this.subscribeErc20Balance(t.address,n);e.push(a)}return We(e).pipe(Xe(n=>n.map(a=>Array.isArray(a)?a:[a]).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:a})=>{let r=this.override.find(s=>s.id===e),i=!!n||!!r?.decimals;return a>0n&&i})}updatePool=(t,e)=>{let n=t.tokens.map(a=>{let r=e.find(s=>s.id===a.id),i=this.override.find(s=>s.id===a.id);return r?{...a,balance:r.balance.transferable,decimals:a.decimals||i?.decimals}:{...a,decimals:a.decimals||i?.decimals}});return{...t,tokens:n}}};var Ot=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()]),a=e?.relay_parent_number||0,r=t.filter(({value:i})=>e&&this.isActivePool(i,a)).map(async({keyArgs:i,value:s})=>{let[o]=i,l=o.toString(),c=await this.getPoolDelta(l,s,a);return{address:l,type:"LBP",fee:s.fee,...c,...n}});return Promise.all(r)}async getPoolDelta(t,e,n){let{start:a,end:r,assets:i,initial_weight:s,final_weight:o,repay_target:l,fee_collector:c}=e,p=H.calculateLinearWeights(a?a.toString():"0",r?r.toString():"0",s.toString(),o.toString(),n.toString()),[d,m]=i,g=BigInt(p),y=this.MAX_FINAL_WEIGHT-BigInt(g),[b,P,f,S,x]=await Promise.all([this.isRepayFeeApplied(d,l,c.toString()),this.getBalance(t,d),this.api.query.AssetRegistry.Assets.getValue(d),this.getBalance(t,m),this.api.query.AssetRegistry.Assets.getValue(m)]);return{repayFeeApply:b,tokens:[{id:d,decimals:f?.decimals,existentialDeposit:f?.existential_deposit,balance:P.transferable,weight:g,type:f?.asset_type.type},{id:m,decimals:x?.decimals,existentialDeposit:x?.existential_deposit,balance:S.transferable,weight:y,type:x?.asset_type.type}]}}isActivePool(t,e){let{start:n,end:a}=t;return n&&a?e>=n&&e<a:!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(ha.BackwardsCompatible,e)}subscribePoolChange(t){let e=this.api.query.ParachainSystem.ValidationData,n=this.poolsData.get(t.address);return n?e.watchValue("best").pipe(fa(a=>a?this.getPoolDelta(t.address,n,a.relay_parent_number):je(t)),Pa(a=>Object.assign({},t,a))):je(t)}};var ge={};T(ge,{OmniMath:()=>w,OmniPool:()=>At,OmniPoolClient:()=>Bt});import{calculate_in_given_out as Sa,calculate_lrna_in_given_out as Ta,calculate_out_given_in as xa,calculate_out_given_lrna_in as wa,calculate_spot_price as Ia,calculate_lrna_spot_price as va,calculate_shares as Oa,calculate_liquidity_out as Aa,calculate_liquidity_lrna_out as Ba,verify_asset_cap as _a,calculate_liquidity_hub_in as Ra,is_sell_allowed as Fa,is_buy_allowed as Ea,is_add_liquidity_allowed as ka,is_remove_liquidity_allowed as Ca}from"@galacticcouncil/math-omnipool";import st from"big.js";var w=class{static calculateSpotPrice(t,e,n,a){return Ia(t,e,n,a)}static calculateLrnaSpotPrice(t,e){return va(t,e)}static calculateInGivenOut(t,e,n,a,r,i,s,o,l){return Sa(t,e,n,a,r,i,s,o,l)}static calculateLrnaInGivenOut(t,e,n,a,r){return Ta(t,e,n,a,r)}static calculateOutGivenIn(t,e,n,a,r,i,s,o,l){return xa(t,e,n,a,r,i,s,o,l)}static calculateOutGivenLrnaIn(t,e,n,a,r){return wa(t,e,n,a,r)}static calculateShares(t,e,n,a){return Oa(t,e,n,a)}static calculateLiquidityOut(t,e,n,a,r,i,s,o){return Aa(t,e,n,a,r,i,s,o)}static calculateLiquidityLRNAOut(t,e,n,a,r,i,s,o){return Ba(t,e,n,a,r,i,s,o)}static calculateCapDifference(t,e,n,a){let r=st(e),i=st(t),s=st(a),o=st(n),l=st(10).pow(18),c=o.div(l);if(r.div(s).lt(c)){let d=c.times(s).minus(r).times(i),m=r.times(st(1).minus(c));return d.div(m).toFixed(0)}else return"0"}static verifyAssetCap(t,e,n,a){return _a(t,e,n,a)}static calculateLimitHubIn(t,e,n,a){return Ra(t,e,n,a)}static isSellAllowed(t){return Fa(t)}static isBuyAllowed(t){return Ea(t)}static isAddLiquidityAllowed(t){return ka(t)}static isRemoveLiquidityAllowed(t){return Ca(t)}};var{FeeUtils:it}=R,At=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,a,r,i){this.type="Omnipool",this.address=t,this.tokens=e,this.maxInRatio=n,this.maxOutRatio=a,this.minTradingLimit=r,this.hubAssetId=i}validatePair(t,e){return this.hubAssetId!=e}parsePair(t,e){let n=new Map(this.tokens.map(i=>[i.id,i])),a=n.get(t),r=n.get(e);if(a==null)throw new Error("Pool does not contain tokenIn");if(r==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,hubReservesIn:a.hubReserves,hubReservesOut:r.hubReserves,sharesIn:a.shares,sharesOut:r.shares,decimalsIn:a.decimals,decimalsOut:r.decimals,balanceIn:a.balance,balanceOut:r.balance,tradeableIn:a.tradeable,tradeableOut:r.tradeable,assetInEd:a.existentialDeposit,assetOutEd:r.existentialDeposit}}validateAndBuy(t,e,n){let a=this.calculateInGivenOut(t,e),r=this.calculateInGivenOut(t,e,n),i=a===0n?0:v.calculateDiffToRef(r,a),s=[],o=w.isSellAllowed(t.tradeableIn),l=w.isBuyAllowed(t.tradeableOut);(!o||!l)&&s.push("TradeNotAllowed"),(e<this.minTradingLimit||a<t.assetInEd)&&s.push("InsufficientTradingAmount");let c=t.balanceOut/this.maxOutRatio;e>c&&s.push("MaxOutRatioExceeded");let p=t.balanceIn/this.maxInRatio;return r>p&&s.push("MaxInRatioExceeded"),{amountIn:r,calculatedIn:a,amountOut:e,feePct:i,errors:s}}validateAndSell(t,e,n){let a=this.calculateOutGivenIn(t,e),r=this.calculateOutGivenIn(t,e,n),i=v.calculateDiffToRef(a,r),s=[],o=w.isSellAllowed(t.tradeableIn),l=w.isBuyAllowed(t.tradeableOut);(!o||!l)&&s.push("TradeNotAllowed"),(e<this.minTradingLimit||a<t.assetOutEd)&&s.push("InsufficientTradingAmount");let c=t.balanceIn/this.maxInRatio;e>c&&s.push("MaxInRatioExceeded");let p=t.balanceOut/this.maxOutRatio;return r>p&&s.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:a,amountOut:r,feePct:i,errors:s}}calculateInGivenOut(t,e,n){if(t.assetIn==this.hubAssetId)return this.calculateLrnaInGivenOut(t,e,n);let a=w.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"),r=BigInt(a);return r<0n?0n:r}calculateLrnaInGivenOut(t,e,n){let a=w.calculateLrnaInGivenOut(t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),n?it.toRaw(n.assetFee).toString():"0"),r=BigInt(a);return r<0n?0n:r}calculateOutGivenIn(t,e,n){if(t.assetIn==this.hubAssetId)return this.calculateOutGivenLrnaIn(t,e,n);let a=w.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"),r=BigInt(a);return r<0n?0n:r}calculateOutGivenLrnaIn(t,e,n){let a=w.calculateOutGivenLrnaIn(t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),n?it.toRaw(n.assetFee).toString():"0"),r=BigInt(a);return r<0n?0n:r}spotPriceInGivenOut(t){if(t.assetIn==this.hubAssetId)return this.spotPriceLrnaInGivenOut(t);let e=w.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=w.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=w.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=w.calculateLrnaSpotPrice(t.balanceOut.toString(),t.hubReservesOut.toString()),n=Math.pow(10,18-t.decimalsIn);return BigInt(e)/BigInt(n)}};import{AccountId as Da,CompatibilityLevel as Ma}from"polkadot-api";import{toHex as La}from"@polkadot-api/utils";import{distinctUntilChanged as qa,map as ze}from"rxjs";var{FeeUtils:X}=R,Bt=class extends M{async loadPools(){let t=await this.api.constants.Omnipool.HubAssetId(),e=this.getPoolAddress(),[n,a,r,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:p})=>{let[d]=c,{hub_reserve:m,shares:g,tradable:y,cap:b,protocol_shares:P}=p,[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:m,protocolShares:P,shares:g,tradeable:y,type:f?.asset_type.type}}),l=await Promise.all(o);return l.push({id:t,decimals:r?.decimals,existentialDeposit:r?.existential_deposit,balance:i.transferable,tradeable:a,type:r?.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=La(e);return Da(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,a,r]=await Promise.all([this.api.constants.DynamicFees.AssetFeeParameters(),this.api.constants.DynamicFees.ProtocolFeeParameters(),this.api.query.DynamicFees.AssetFee.getValue(e)]),i=n.min_fee+a.min_fee,s=n.max_fee+a.max_fee;if(r){let{asset_fee:o,protocol_fee:l}=r;return{assetFee:X.fromPermill(o),protocolFee:X.fromPermill(l),min:X.fromPermill(i),max:X.fromPermill(s)}}else return{assetFee:X.fromPermill(n.min_fee),protocolFee:X.fromPermill(a.min_fee),min:X.fromPermill(i),max:X.fromPermill(s)}}getPoolType(){return"Omnipool"}async isSupported(){let t=this.api.query.Omnipool.Assets,e=await this.api.compatibilityToken;return t.isCompatible(Ma.BackwardsCompatible,e)}subscribePoolChange(t){return this.api.query.Omnipool.Assets.watchEntries({at:"best"}).pipe(qa((n,a)=>!a.deltas),ze(({entries:n})=>n.map(a=>{let[r]=a.args,{hub_reserve:i,shares:s,tradable:o,cap:l,protocol_shares:c}=a.value,p=t.tokens.findIndex(m=>m.id===r);return{...t.tokens[p],cap:l,hubReserves:i,protocolShares:c,shares:s,tradeable:o}})),ze(n=>{let a=t.tokens.find(r=>r.id===1);return{...t,tokens:[...n,a]}}))}};var be={};T(be,{StableMath:()=>A,StableSwap:()=>_t,StableSwapClient:()=>Rt});import{calculate_in_given_out as Na,calculate_out_given_in as Ga,calculate_amplification as Ha,calculate_add_one_asset as Ua,calculate_liquidity_out_one_asset as Va,calculate_shares as Wa,calculate_shares_for_amount as Ya,calculate_spot_price_with_fee as Xa,pool_account_name as Ka,recalculate_peg as ja}from"@galacticcouncil/math-stableswap";var A=class{static getPoolAddress(t){return Ka(t)}static defaultPegs(t){let e=[];for(let n=0;n<t;n++)e.push(["1","1"]);return e}static calculateAmplification(t,e,n,a,r){return Ha(t,e,n,a,r)}static calculateInGivenOut(t,e,n,a,r,i,s){return Na(t,e,n,a,r,i,s)}static calculateAddOneAsset(t,e,n,a,r,i,s){return Ua(t,e,n,a,r,i,s)}static calculateSharesForAmount(t,e,n,a,r,i,s){return Ya(t,e,n,a,r,i,s)}static calculateOutGivenIn(t,e,n,a,r,i,s){return Ga(t,e,n,a,r,i,s)}static calculateLiquidityOutOneAsset(t,e,n,a,r,i,s){return Va(t,e,n,a,r,i,s)}static calculateShares(t,e,n,a,r,i){return Wa(t,e,n,a,r,i)}static calculateSpotPriceWithFee(t,e,n,a,r,i,s,o){return Xa(t,e,n,a,r,i,s,o)}static recalculatePegs(t,e,n,a,r){let i=ja(t,e,n,a,r);return JSON.parse(i)}};var{FeeUtils:K}=R,_t=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,a,r,i,s,o,l){this.type="Stableswap",this.address=t,this.tokens=e,this.maxInRatio=n,this.maxOutRatio=a,this.minTradingLimit=r,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])),a=n.get(t),r=n.get(e);if(a==null)throw new Error("Pool does not contain tokenIn");if(r==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,balanceIn:a.balance,balanceOut:r.balance,decimalsIn:a.decimals,decimalsOut:r.decimals,tradeableIn:this.id===t?15:a.tradeable,tradeableOut:this.id===e?15:r.tradeable,assetInEd:a.existentialDeposit,assetOutEd:r.existentialDeposit}}validateAndBuy(t,e,n){let a=this.calculateInGivenOut(t,e),r=this.calculateInGivenOut(t,e,n),i=K.toPct(n.fee),s=[],o=w.isSellAllowed(t.tradeableIn),l=w.isBuyAllowed(t.tradeableOut);return(!o||!l)&&s.push("TradeNotAllowed"),(e<this.minTradingLimit||a<t.assetInEd)&&s.push("InsufficientTradingAmount"),{amountIn:r,calculatedIn:a,amountOut:e,feePct:i,errors:s}}validateAndSell(t,e,n){let a=this.calculateOutGivenIn(t,e),r=this.calculateOutGivenIn(t,e,n),i=K.toPct(n.fee),s=[],o=w.isSellAllowed(t.tradeableIn),l=w.isBuyAllowed(t.tradeableOut);return(!o||!l)&&s.push("TradeNotAllowed"),(e<this.minTradingLimit||a<t.assetOutEd)&&s.push("InsufficientTradingAmount"),{amountIn:e,calculatedOut:a,amountOut:r,feePct:i,errors:s}}calculateIn(t,e,n){let a=A.calculateInGivenOut(this.getReserves(),Number(t.assetIn),Number(t.assetOut),e.toString(),this.amplification.toString(),n?K.toRaw(n.fee).toString():"0",this.getPegs()),r=BigInt(a);return r<0n?0n:r}calculateAddOneAsset(t,e,n){let a=A.calculateAddOneAsset(this.getReserves(),e.toString(),Number(t.assetIn),this.amplification.toString(),this.totalIssuance.toString(),n?K.toRaw(n.fee).toString():"0",this.getPegs()),r=BigInt(a);return r<0n?0n:r}calculateSharesForAmount(t,e,n){let a=A.calculateSharesForAmount(this.getReserves(),Number(t.assetOut),e.toString(),this.amplification.toString(),this.totalIssuance.toString(),n?K.toRaw(n.fee).toString():"0",this.getPegs()),r=BigInt(a);return r<0n?0n:r}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=A.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 a=Math.pow(10,t.decimalsIn-t.decimalsOut);return BigInt(e)/BigInt(a)}let n=Math.pow(10,18-t.decimalsIn);return BigInt(e)/BigInt(n)}calculateOut(t,e,n){let a=A.calculateOutGivenIn(this.getReserves(),Number(t.assetIn),Number(t.assetOut),e.toString(),this.amplification.toString(),n?K.toRaw(n.fee).toString():"0",this.getPegs()),r=BigInt(a);return r<0n?0n:r}calculateWithdrawOneAsset(t,e,n){let a=A.calculateLiquidityOutOneAsset(this.getReserves(),e.toString(),Number(t.assetOut),this.amplification.toString(),this.totalIssuance.toString(),n?K.toRaw(n.fee).toString():"0",this.getPegs()),r=BigInt(a);return r<0n?0n:r}calculateShares(t,e,n){let a=A.calculateShares(this.getReserves(),this.getAssets(t.assetIn,e),this.amplification.toString(),this.totalIssuance.toString(),n?K.toRaw(n.fee).toString():"0",this.getPegs()),r=BigInt(a);return r<0n?0n:r}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=A.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 a=Math.pow(10,t.decimalsOut-t.decimalsIn);return BigInt(e)/BigInt(a)}let n=Math.pow(10,18-t.decimalsOut);return BigInt(e)/BigInt(n)}getPegs(){let t=A.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:a})=>({asset_id:e,amount:n,decimals:a}));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 za,CompatibilityLevel as $a}from"polkadot-api";import{toHex as Qa}from"@polkadot-api/utils";import{blake2b as Ja}from"@noble/hashes/blake2b";import{map as Za,of as tr,switchMap as er}from"rxjs";var{FeeUtils:Z}=R,Rt=class extends M{poolsData=new Map([]);getPoolType(){return"Stableswap"}getPoolAddress(t){let e=A.getPoolAddress(t),n=Ja(e,{dkLen:32}),a=Qa(n);return za(63).dec(a)}async getPoolLimits(){return{maxInRatio:0n,maxOutRatio:0n,minTradingLimit:await this.api.constants.Stableswap.MinTradingLimit()}}async getPoolDelta(t,e,n){let{initial_amplification:a,final_amplification:r,initial_block:i,final_block:s}=e,o=A.calculateAmplification(a.toString(),r.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),a=e.assets.map(async r=>{let[i,s,o]=await Promise.all([this.api.query.Stableswap.AssetTradability.getValue(t,r),this.api.query.AssetRegistry.Assets.getValue(r),this.getBalance(n,r)]);return{id:r,decimals:s?.decimals,existentialDeposit:s?.existential_deposit,balance:o.transferable,tradeable:i,type:s?.asset_type.type}});return Promise.all(a)}async isSupported(){let t=this.api.query.Stableswap.Pools,e=await this.api.compatibilityToken;return t.isCompatible($a.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()]),a=t.map(async({keyArgs:r,value:i})=>{let[s]=r,o=this.getPoolAddress(s),[l,c,p]=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:Z.fromPermill(i.fee),tokens:c,...l,...p,...n}});return Promise.all(a)}async getPoolFees(t){return{fee:t.fee}}async getPoolPegs(t,e,n){let a=await this.api.query.Stableswap.PoolPegs.getValue(t);if(!a)return this.getDefaultPegs(e);let r=await this.getLatestPegs(e,a,n),i=this.getRecentPegs(a),s=Z.fromPermill(a.max_peg_update),o=Z.fromPermill(e.fee),[l,c]=A.recalculatePegs(JSON.stringify(i),JSON.stringify(r),n.toString(),Z.toRaw(s).toString(),Z.toRaw(o).toString()),p=Number(l)*1e6;return{pegsFee:Z.fromPermill(p),pegs:c}}getDefaultPegs(t){let e=t.fee,n=A.defaultPegs(t.assets.length);return{pegsFee:Z.fromPermill(e),pegs:n}}getRecentPegs(t){let{current:e}=t;return Array.from(e.entries()).map(([n,a])=>a.map(r=>r.toString()))}async getLatestPegs(t,e,n){let{source:a}=e,r=Array.from(t.assets.entries()).map(([s,o])=>o),i=a.map(async(s,o)=>{if(s.type==="Oracle"){let[l,c,p]=s.value,d=[p,r[o]].sort((f,S)=>f-S),m=await this.api.query.EmaOracle.Oracles.getValue(l,d,c);if(!m)return;let[{price:g,updated_at:y}]=m,b=g.n.toString(),P=g.d.toString();return p.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:p,updatedAt:d}=await this.mmOracle.getData(l),m=10**p;return[[c.toString(),m.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?tr(t):e.watchValue("best").pipe(er(a=>Promise.all([this.getPoolDelta(t.id,n,a),this.getPoolPegs(t.id,n,a)])),Za(([a,r])=>{let i=t.tokens.map(s=>s.id===t.id?{...s,balance:a.totalIssuance}:s);return Object.assign(t,{tokens:i},a,r)}))}};var ye={};T(ye,{XykMath:()=>V,XykPool:()=>Ft,XykPoolClient:()=>Et});import{calculate_in_given_out as nr,calculate_out_given_in as ar,calculate_pool_trade_fee as rr,get_spot_price as sr,calculate_liquidity_in as ir,calculate_shares as or,calculate_spot_price as lr,calculate_spot_price_with_fee as cr,calculate_liquidity_out_asset_a as ur,calculate_liquidity_out_asset_b as pr}from"@galacticcouncil/math-xyk";var V=class{static getSpotPrice(t,e,n){return sr(t,e,n)}static calculateInGivenOut(t,e,n){return nr(t,e,n)}static calculateOutGivenIn(t,e,n){return ar(t,e,n)}static calculatePoolTradeFee(t,e,n){return rr(t,e,n)}static calculateLiquidityIn(t,e,n){return ir(t,e,n)}static calculateSpotPrice(t,e){return lr(t,e)}static calculateSpotPriceWithFee(t,e,n,a){return cr(t,e,n,a)}static calculateShares(t,e,n){return or(t,e,n)}static calculateLiquidityOutAssetA(t,e,n,a){return ur(t,e,n,a)}static calculateLiquidityOutAssetB(t,e,n,a){return pr(t,e,n,a)}};var{FeeUtils:$e}=R,Ft=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,a,r){this.type="XYK",this.address=t,this.tokens=e,this.maxInRatio=n,this.maxOutRatio=a,this.minTradingLimit=r}validatePair(t,e){return!0}parsePair(t,e){let n=new Map(this.tokens.map(i=>[i.id,i])),a=n.get(t),r=n.get(e);if(a==null)throw new Error("Pool does not contain tokenIn");if(r==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,decimalsIn:a.decimals,decimalsOut:r.decimals,balanceIn:a.balance,balanceOut:r.balance,assetInEd:a.existentialDeposit,assetOutEd:r.existentialDeposit}}validateAndBuy(t,e,n){let a=this.calculateInGivenOut(t,e),r=this.calculateTradeFee(a,n),i=$e.toPct(n.exchangeFee),s=a+r,o=[];(e<this.minTradingLimit||a<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:a,amountOut:e,feePct:i,errors:o}}validateAndSell(t,e,n){let a=this.calculateOutGivenIn(t,e),r=this.calculateTradeFee(a,n),i=$e.toPct(n.exchangeFee),s=a-r,o=[];(e<this.minTradingLimit||a<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:a,amountOut:s,feePct:i,errors:o}}calculateInGivenOut(t,e){let n=V.calculateInGivenOut(t.balanceIn.toString(),t.balanceOut.toString(),e.toString()),a=BigInt(n);return a<0n?0n:a}calculateOutGivenIn(t,e){let n=V.calculateOutGivenIn(t.balanceIn.toString(),t.balanceOut.toString(),e.toString()),a=BigInt(n);return a<0n?0n:a}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 mr}from"polkadot-api";import{of as dr}from"rxjs";var Et=class extends M{async loadPools(){let t=this.api.query.XYK.PoolAssets,[e,n]=await Promise.all([t.getEntries(),this.getPoolLimits()]),a=e.map(async({keyArgs:r,value:i})=>{let[s]=r,[o,l]=i,[c,p,d,m]=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:p?.decimals,existentialDeposit:p?.existential_deposit,balance:c.transferable,type:p?.asset_type.type},{id:l,decimals:m?.decimals,existentialDeposit:m?.existential_deposit,balance:d.transferable,type:m?.asset_type.type}],...n}});return Promise.all(a)}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(mr.BackwardsCompatible,e)}subscribePoolChange(t){return dr(t)}};var he={};T(he,{AavePool:()=>kt,AavePoolClient:()=>Ct});var kt=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,a,r){this.type="Aave",this.address=t,this.tokens=e,this.maxInRatio=n,this.maxOutRatio=a,this.minTradingLimit=r}validatePair(t,e){return!0}parsePair(t,e){let n=new Map(this.tokens.map(i=>[i.id,i])),a=n.get(t),r=n.get(e);if(a==null)throw new Error("Pool does not contain tokenIn");if(r==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,balanceIn:a.balance,balanceOut:r.balance,decimalsIn:a.decimals,decimalsOut:r.decimals,assetInEd:0n,assetOutEd:0n}}validateAndBuy(t,e,n){let a=this.calculateInGivenOut(t,e),r=[];return e>t.balanceOut&&r.push("TradeNotAllowed"),{amountIn:a,calculatedIn:a,amountOut:e,feePct:0,errors:r}}validateAndSell(t,e,n){let a=this.calculateOutGivenIn(t,e),r=[];return a>t.balanceOut&&r.push("TradeNotAllowed"),{amountIn:e,calculatedOut:a,amountOut:a,feePct:0,errors:r}}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 gr}from"polkadot-api";import{toHex as br}from"@polkadot-api/utils";import{map as yr,merge as hr,switchMap as Pr}from"rxjs";import{decodeEventLog as fr}from"viem";var Qe=[{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:Sr}=tt,Tr=["Supply","Withdraw","Repay","Borrow"],Ct=class extends M{async loadPools(){let e=(await this.api.apis.AaveTradeExecutor.pools()).map(async({reserve:n,atoken:a,liqudity_in:r,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(a),this.api.query.AssetRegistry.AssetLocations.getValue(a)]);return{address:this.getPoolId(n,a),type:"Aave",tokens:[{id:n,decimals:s?.decimals,existentialDeposit:s?.existential_deposit,balance:r,location:o,type:s?.asset_type.type},{id:a,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:a,liqudity_out:r}=await this.api.apis.AaveTradeExecutor.pool(e.id,n.id);return t.tokens.map(i=>{let s=i.id===e.id?a:r;return{...i,balance:s}})}getPoolId(t,e){let n=t+"/"+e,a=new TextEncoder().encode(n.padEnd(32,"\0")),r=br(a);return gr(63).dec(r)}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,a=this.getReserveH160Id(e),r=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()),p=l.asHex(),{eventName:d,args:m}=fr({abi:Qe,topics:c,data:p});return Tr.includes(d)&&m.reserve.toLowerCase()===a.toLowerCase()});return hr([r,i]).pipe(Pr(()=>this.getPoolDelta(t)),yr(s=>({...t,tokens:[...s]})))}getReserveH160Id(t){return t.type==="Erc20"?$.findNestedKey(t.location,"AccountKey20").AccountKey20.key:Sr.fromAssetId(t.id)}};var ot=class{static get(t){switch(t.type){case"Aave":return kt.fromPool(t);case"XYK":return Ft.fromPool(t);case"Omnipool":return At.fromPool(t);case"LBP":return It.fromPool(t);case"Stableswap":return _t.fromPool(t);default:throw new Error("Pool type "+t.type+" is not supported yet")}}};import{Subject as xr,Subscription as Dt,takeUntil as wr}from"rxjs";var lt=class extends B{evm;lbpClient;omniClient;stableClient;xykClient;aaveClient;active=new Set([]);clients=[];pools=new Map([]);lbpSub=Dt.EMPTY;omniSub=Dt.EMPTY;stableSub=Dt.EMPTY;xykSub=Dt.EMPTY;aaveSub=Dt.EMPTY;isReady=!1;isDestroyed=new xr;constructor(t,e){super(t),this.evm=e,this.lbpClient=new Ot(t,e),this.omniClient=new Bt(t,e),this.stableClient=new Rt(t,e),this.xykClient=new Et(t,e),this.aaveClient=new Ct(t,e),this.clients=[this.lbpClient,this.omniClient,this.stableClient,this.xykClient,this.aaveClient]}subscribe(t){return t.getSubscriber().pipe(wr(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,a=new Set(e),r=new Set(n),i=async s=>{let o=s.getPoolType();return a.size>0?a.has(o):r.size>0?!r.has(o):s.isSupported()};return this.getFilteredPools(i)}async getFilteredPools(t){let e=await Promise.all(this.clients.map(t)),n=this.clients.filter((r,i)=>e[i]);return(await Promise.all(n.map(r=>r.getPoolsMem()))).flat()}async getPoolFees(t,e){let n=this.clients.find(a=>a.getPoolType()===t.type);if(n)return n.getPoolFees(t,e);throw new Tt(t.type)}};var an={};T(an,{DEFAULT_BLOCK_TIME:()=>tn,DEFAULT_MIN_BUDGET:()=>Se,ORDER_MIN_BLOCK_PERIOD:()=>en,Router:()=>ct,TWAP_BLOCK_PERIOD:()=>Nt,TWAP_MAX_DURATION:()=>xe,TWAP_MAX_PRICE_IMPACT:()=>Te,TWAP_TX_MULTIPLIER:()=>yu,TradeOrderError:()=>fe,TradeOrderType:()=>zt,TradeRouteBuilder:()=>L,TradeRouter:()=>ut,TradeScheduler:()=>pt,TradeType:()=>jt});var Mt=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 Ir=8,Lt=class{isNotVisited(t,e){let n=!0;return e.forEach(a=>{(a[0]===t[0]||a[1]===t[1])&&(n=!1)}),n}findPaths(t,e,n){let a=[],r=new Mt,i=[];for(i.push([e,""]),r.enqueue(i);r.size()>0;){let s=r.dequeue();if(!s||s.length>Ir)continue;let o=s[s.length-1];(n===null||o[0]===n)&&a.push(s),t.get(o[0])?.forEach(c=>{if(this.isNotVisited(c,s)){let p=[...s];p.push(c),r.enqueue(p)}})}return a}findShortestPaths(t,e,n){let a=[],r=new Mt,i=[];i.push([e,""]),r.enqueue(i);let s=1/0;for(;r.size()>0;){let o=r.dequeue();if(!o)continue;let l=o[o.length-1];if(l[0]===n){o.length<s?(s=o.length,a.length=0,a.push(o)):o.length===s&&a.push(o);continue}let c=t.get(l[0]);for(let p of c??[])this.isNotVisited(p,o)&&r.enqueue([...o,p])}return a}buildAndPopulateGraph(t,e){let n=new Map;for(let a of t)n.set(parseInt(a),[]);for(let[a,r,i]of e)n.get(r)?.push([i,a]);return n}};function Pe(u){let t={};for(let e of u){let n=e.tokens.length;for(let a=0;a<n;a++){t[e.tokens[a].id]||(t[e.tokens[a].id]=[]);for(let r=0;r<n;r++){if(a==r)continue;let i=[e.address,e.tokens[a].id,e.tokens[r].id];t[e.tokens[a].id].push(i)}}}return t}var qt=class{getProposals(t,e,n){let a=n.filter(b=>b.type==="XYK"),r=n.filter(b=>b.type!=="XYK"),i=new Set(r.map(b=>b.tokens).flat().map(b=>b.id)),s=i.has(t),o=i.has(e),l=new Lt,c=b=>{let P=Pe(b),f=Object.keys(P),S=f.flatMap(x=>P[x]);return l.buildAndPopulateGraph(f,S)};if(!s&&!o){let b=a.filter(S=>S.tokens.find(x=>x.id===t)||S.tokens.find(x=>x.id===e)),P=c(b),f=l.findPaths(P,t,e);return this.parsePaths(f)}if(s&&o){let b=c(r),P=l.findPaths(b,t,e);return this.parsePaths(P)}let p=s?e:t,d=a.filter(b=>b.tokens.some(P=>P.id===p));if(d.length===0)return[];let m=[...r,...d],g=c(m),y=l.findPaths(g,t,e);return this.parsePaths(y)}parsePaths(t){let e=[];for(let n of t){let a=[];for(let r=0;r<n.length;r++){let i=n[r],s=n[r+1];if(s==null)break;a.push(this.toEdge(i,s))}e.push(a)}return e}toEdge(t,e){return[e[1],t[0],e[0]]}};var ct=class{routeSuggester;routeProposals;routerOptions;ctx;constructor(t,e={}){this.ctx=t,this.routeSuggester=new qt,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(a=>a!==t).map(a=>this.getRoutes(a,t)))).filter(a=>a.length>0).map(([a])=>a[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 a=this.getAssets(n);if(!a.has(t))throw new Error(t+" is not supported asset");if(!a.has(e))throw new Error(e+" is not supported asset");return this.toPoolsMap(n)}getAssets(t){let e=t.map(n=>n.tokens.map(a=>a.id)).flat().sort((n,a)=>n>a?1:-1);return new Set(e)}getPaths(t,e,n){let a=this.toPoolsMap(n);return this.getProposals(t,e,n).filter(i=>this.validPath(i,a)).map(i=>this.toHops(i,a))}getProposals(t,e,n){let a=this.buildRouteKey(t,e,n);if(this.routeProposals.has(a))return this.routeProposals.get(a);let r=this.routeSuggester.getProposals(t,e,n);return this.routeProposals.set(a,r),r}validPath(t,e){return t.length>0&&t.map(n=>this.validEdge(n,e)).reduce((n,a)=>n&&a)}validEdge([t,e,n],a){return a.get(t)?.validatePair(e,n)||!1}toPoolsMap(t){return new Map(t.map(e=>[e.address,ot.get(e)]))}toHops(t,e){return t.map(([n,a,r])=>{let i=e.get(n);return{poolAddress:n,poolId:i?.id,pool:i?.type,assetIn:a,assetOut:r}})}};var jt=(e=>(e.Buy="Buy",e.Sell="Sell",e))(jt||{}),zt=(n=>(n.Dca="Dca",n.TwapSell="TwapSell",n.TwapBuy="TwapBuy",n))(zt||{}),fe=(n=>(n.OrderTooSmall="OrderTooSmall",n.OrderTooBig="OrderTooBig",n.OrderImpactTooBig="OrderImpactTooBig",n))(fe||{});var{FeeUtils:Ze}=R,ut=class extends ct{mlr;poolsSnapshot;constructor(t,e={}){super(t,e),this.mlr=new Map}buildCtxSync(t,e){let n=this.poolsSnapshot,a=super.validateInput(t,e,n),r=super.getPaths(t,e,n);if(!r.length)throw new xt(t,e);return{paths:r,pools:n,poolsMap:a}}async withCtx(t,e,n){this.poolsSnapshot||(this.poolsSnapshot=await super.getPools());let a=this.buildCtxSync(t,e);return n(a)}isDirectTrade(t){return t.length==1}findBestSellRoute(t){let e=t.sort((n,a)=>{let r=n[n.length-1].amountOut,i=a[a.length-1].amountOut;return r>i?-1:1});return e.find(n=>n.every(a=>a.errors.length==0))||e[0]}getRouteFeeRange(t){if(t.filter(n=>n.tradeFeeRange).length>0){let n=t.map(r=>r.tradeFeeRange?.[0]??r.tradeFeePct).reduce((r,i)=>r+i),a=t.map(r=>r.tradeFeeRange?.[1]??r.tradeFeePct).reduce((r,i)=>r+i);return[n,a]}}getPoolFeeRange(t){let e=t.min?Ze.toPct(t.min):void 0,n=t.max?Ze.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),a=t.map(s=>s.spotPrice).reduce((s,o)=>s*o),r=n-e.assetOutDecimals,i=Math.pow(10,r);return a/BigInt(i)}async getSell(t,e,n,a){return this.withCtx(t,e,async({paths:r,poolsMap:i})=>{let s;if(a)s=await this.toSellSwaps(n,a,i);else{let o=r.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],a=e[e.length-1],r=this.isDirectTrade(e),i=this.getSellSpot(e),s=a.amountOut,o=r?a.calculatedOut:this.calculateDelta0Y(n.amountIn,e,t),l=o-s,c=this.getRouteFeeRange(e),p=r?a.tradeFeePct:v.calculateSellFee(o,s),d=Math.pow(10,n.assetInDecimals),m=n.amountIn*i/BigInt(d),g=v.calculateDiffToRef(o,m);return{type:"Sell",amountIn:n.amountIn,amountOut:a.amountOut,spotPrice:i,tradeFee:l,tradeFeePct:p,tradeFeeRange:c,priceImpactPct:g,swaps:e,toHuman(){return{type:"Sell",amountIn:h.toDecimal(n.amountIn,n.assetInDecimals),amountOut:h.toDecimal(a.amountOut,a.assetOutDecimals),spotPrice:h.toDecimal(i,a.assetOutDecimals),tradeFee:h.toDecimal(l,a.assetOutDecimals),tradeFeePct:p,tradeFeeRange:c,priceImpactPct:g,swaps:e.map(y=>y.toHuman())}}}}calculateDelta0Y(t,e,n){let a=[];for(let r=0;r<e.length;r++){let i=e[r],s=n.get(i.poolAddress);if(s==null)throw new Error("Pool does not exit");let o=s.parsePair(i.assetIn,i.assetOut),l;r>0?l=a[r-1]:l=t;let c=s.calculateOutGivenIn(o,l);a.push(c)}return a[a.length-1]}async calculateMostLiquidRoute(t,e,n){let{paths:a,pools:r,poolsMap:i}=n,l=r.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=v.getFraction(l,.1),p=await Promise.all(a.map(y=>this.toSellSwaps(c,y,i))),m=this.findBestSellRoute(p).map(y=>({poolAddress:y.poolAddress,poolId:y?.poolId,pool:y.pool,assetIn:y.assetIn,assetOut:y.assetOut})),g=this.buildRouteKey(t,e,r);return this.mlr.set(g,m),m}async toSellSwaps(t,e,n){let a=[];for(let r=0;r<e.length;r++){let i=e[r],s=n.get(i.poolAddress);if(s==null)throw new Error("Pool does not exit");let o=s.parsePair(i.assetIn,i.assetOut),l;r>0?l=a[r-1].amountOut:l=typeof t=="string"?h.toBigInt(t,o.decimalsIn):t;let c=await this.ctx.getPoolFees(s,o.assetOut),{amountOut:p,calculatedOut:d,feePct:m,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=v.calculateDiffToRef(d,f);a.push({...i,assetInDecimals:o.decimalsIn,assetOutDecimals:o.decimalsOut,amountIn:l,amountOut:p,calculatedOut:d,spotPrice:b,tradeFeePct:m,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(p,o.decimalsOut),calculatedOut:h.toDecimal(d,o.decimalsOut),spotPrice:h.toDecimal(b,o.decimalsOut),tradeFeePct:m,tradeFeeRange:y,priceImpactPct:S,errors:g}}})}return a}async getMostLiquidRoute(t,e){return this.withCtx(t,e,async n=>{let a=this.buildRouteKey(t,e,n.pools),r=this.mlr.get(a);return r||this.calculateMostLiquidRoute(t,e,n)})}async getSpotPrice(t,e){return this.withCtx(t,e,async n=>{let{pools:a,poolsMap:r}=n,i=this.buildRouteKey(t,e,a),s=this.mlr.get(i);s||(s=await this.calculateMostLiquidRoute(t,e,n));let o=await this.toSellSwaps("1",s,r),l=this.getSellSpot(o),c=o[o.length-1].assetOutDecimals;return{amount:l,decimals:c}})}findBestBuyRoute(t){let e=t.sort((n,a)=>{let r=n[0].amountIn,i=a[0].amountIn;return r>i?1:-1});return e.find(n=>n.every(a=>a.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),a=t.map(s=>s.spotPrice).reduce((s,o)=>s*o),r=n-e.assetInDecimals,i=Math.pow(10,r);return a/BigInt(i)}async getBuy(t,e,n,a){return this.withCtx(t,e,async({paths:r,poolsMap:i})=>{let s;if(a)s=await this.toBuySwaps(n,a,i);else{let o=r.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],a=e[0],r=this.isDirectTrade(e),i=this.getBuySpot(e),s=a.amountIn,o=r?a.calculatedIn:this.calculateDelta0X(n.amountOut,e,t),l=s-o,c=this.getRouteFeeRange(e),p=r?a.tradeFeePct:v.calculateBuyFee(o,s),d=Math.pow(10,n.assetOutDecimals),m=n.amountOut*i/BigInt(d),g;return o===0n?g=-100:g=v.calculateDiffToRef(m,o),{type:"Buy",amountOut:n.amountOut,amountIn:a.amountIn,spotPrice:i,tradeFee:l,tradeFeePct:p,tradeFeeRange:c,priceImpactPct:g,swaps:e,toHuman(){return{type:"Buy",amountOut:h.toDecimal(n.amountOut,n.assetOutDecimals),amountIn:h.toDecimal(a.amountIn,a.assetInDecimals),spotPrice:h.toDecimal(i,a.assetInDecimals),tradeFee:h.toDecimal(l,a.assetInDecimals),tradeFeePct:p,tradeFeeRange:c,priceImpactPct:g,swaps:e.map(y=>y.toHuman())}}}}calculateDelta0X(t,e,n){let a=[];for(let r=e.length-1;r>=0;r--){let i=e[r],s=n.get(i.poolAddress);if(s==null)throw new Error("Pool does not exit");let o=s.parsePair(i.assetIn,i.assetOut),l;r==e.length-1?l=t:l=a[0];let c=s.calculateInGivenOut(o,l);a.unshift(c)}return a[0]}async toBuySwaps(t,e,n){let a=[];for(let r=e.length-1;r>=0;r--){let i=e[r],s=n.get(i.poolAddress);if(s==null)throw new Error("Pool does not exit");let o=s.parsePair(i.assetIn,i.assetOut),l;r==e.length-1?l=typeof t=="string"?h.toBigInt(t,o.decimalsOut):t:l=a[0].amountIn;let c=await this.ctx.getPoolFees(s,o.assetOut),{amountIn:p,calculatedIn:d,feePct:m,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=v.calculateDiffToRef(f,d),a.unshift({...i,assetInDecimals:o.decimalsIn,assetOutDecimals:o.decimalsOut,amountOut:l,amountIn:p,calculatedIn:d,spotPrice:b,tradeFeePct:m,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(p,o.decimalsIn),calculatedIn:h.toDecimal(d,o.decimalsIn),spotPrice:h.toDecimal(b,o.decimalsIn),tradeFeePct:m,tradeFeeRange:y,priceImpactPct:S,errors:g}}})}return a}};var tn=6e3,Se=1000000000000000n,Nt=6,Te=-5,xe=216e5,yu=3,en=6;import{Enum as nn}from"polkadot-api";var L=class{static build(t){return t.map(({assetIn:e,assetOut:n,pool:a,poolId:r})=>a==="Stableswap"?{pool:nn("Stableswap",r),asset_in:e,asset_out:n}:{pool:nn(a),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??Se})}get blockTime(){return this.schedulerOptions.blockTime}get minOrderBudget(){return this.schedulerOptions.minBudgetInNative}async getDcaOrder(t,e,n,a,r){let[i,s]=await Promise.all([this.getMinimumOrderBudget(t),this.router.getBestSell(t,e,n)]),{amountIn:o,swaps:l,priceImpactPct:c}=s,p=l[0],d=l[l.length-1],{assetInDecimals:m}=p,{assetOutDecimals:g}=d,y=Math.abs(c),b=this.getMinimumTradeCount(o,i),P=this.getOptimalTradeCount(y),f=r?Math.round(a/r):P,S=Math.ceil(a/b),x=Math.round(a/P),F=Math.round(a/f),C=o/BigInt(f),_=await this.router.getBestSell(t,e,C),q=o<i,N=[];q&&N.push("OrderTooSmall");let W=_.amountOut*BigInt(f),bt=this.toBlockPeriod(F),j=_.tradeFee*BigInt(f),Jt=L.build(l),yt={assetIn:t,assetOut:e,errors:N,frequencyMin:S,frequencyOpt:x,frequency:F,tradeCount:f,tradeFee:j,tradeImpactPct:_.priceImpactPct,tradePeriod:bt,tradeRoute:Jt,type:"Dca"};return{...yt,amountIn:o,amountOut:W,tradeAmountIn:_.amountIn,tradeAmountOut:_.amountOut,toHuman(){return{...yt,amountIn:h.toDecimal(o,m),amountOut:h.toDecimal(W,g),tradeAmountIn:h.toDecimal(_.amountIn,m),tradeAmountOut:h.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 a=t+n/2n;return Number(a/n)}getOptimalTradeCount(t){let e=Math.round(t*10)||1;return Math.max(e,3)}async getTwapSellOrder(t,e,n){let[a,r]=await Promise.all([this.getMinimumOrderBudget(t),this.router.getBestSell(t,e,n)]),{amountIn:i,swaps:s,priceImpactPct:o}=r,l=s[0],c=s[s.length-1],{assetInDecimals:p}=l,{assetOutDecimals:d}=c,m=Math.abs(o),g=this.getTwapTradeCount(m),y=i/BigInt(g),b=await this.router.getBestSell(l.assetIn,c.assetOut,y),P=g===1,f=i<a,S=b.priceImpactPct<-5,x=[];f||P?x.push("OrderTooSmall"):S&&x.push("OrderImpactTooBig");let F=b.amountOut*BigInt(g),C=b.tradeFee*BigInt(g),_=L.build(s),q={assetIn:t,assetOut:e,errors:x,tradeCount:g,tradeImpactPct:b.priceImpactPct,tradePeriod:6,tradeRoute:_,type:"TwapSell"};return{...q,amountIn:i,amountOut:F,tradeAmountIn:b.amountIn,tradeAmountOut:b.amountOut,tradeFee:C,toHuman(){return{...q,amountIn:h.toDecimal(i,p),amountOut:h.toDecimal(F,d),tradeAmountIn:h.toDecimal(b.amountIn,p),tradeAmountOut:h.toDecimal(b.amountOut,d),tradeFee:h.toDecimal(C,d)}}}}async getTwapBuyOrder(t,e,n){let[a,r]=await Promise.all([this.getMinimumOrderBudget(t),this.router.getBestBuy(t,e,n)]),{amountOut:i,swaps:s,priceImpactPct:o}=r,l=s[0],c=s[s.length-1],{assetInDecimals:p}=l,{assetOutDecimals:d}=c,m=Math.abs(o),g=this.getTwapTradeCount(m),y=i/BigInt(g),b=await this.router.getBestBuy(l.assetIn,c.assetOut,y),P=b.amountIn*BigInt(g),f=g===1,S=P<a,x=b.priceImpactPct<-5,F=[];S||f?F.push("OrderTooSmall"):x&&F.push("OrderImpactTooBig");let C=b.tradeFee*BigInt(g),_=L.build(s),q={assetIn:t,assetOut:e,errors:F,tradeCount:g,tradeImpactPct:b.priceImpactPct,tradePeriod:6,tradeRoute:_,type:"TwapBuy"};return{...q,amountIn:P,amountOut:i,tradeAmountIn:b.amountIn,tradeAmountOut:b.amountOut,tradeFee:C,toHuman(){return{...q,amountIn:h.toDecimal(P,p),amountOut:h.toDecimal(i,d),tradeAmountIn:h.toDecimal(b.amountIn,p),tradeAmountOut:h.toDecimal(b.amountOut,d),tradeFee:h.toDecimal(C,p)}}}}getTwapTradeCount(t){let e=this.getOptimalTradeCount(t);if(this.getTwapExecutionTime(e)>216e5){let a=216e5/(this.blockTime*6);return Math.round(a)}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 ln={};T(ln,{BIG_10:()=>sn,BIG_BILL:()=>on,StakingApi:()=>Gt,StakingClient:()=>Ht});import{encodeAddress as vr}from"@polkadot/util-crypto";import{stringToU8a as Or}from"@polkadot/util";import{calculate_accumulated_rps as Ar,calculate_period_number as rn,calculate_rewards as Br}from"@galacticcouncil/math-staking";import mt from"big.js";var sn=mt(10),on=mt(sn.pow(12));function _r(u){return vr(Or(("modl"+u).padEnd(32,"\0")),63)}var Gt=class{client;balanceClient;constructor(t,e){this.client=t,this.balanceClient=e}async getFreePotBalance(){let t=await this.client.getPalletId(),e=_r(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)]),a=e?.created_at,r=await n.reduce(async(i,[s,o])=>{let l=await i,c=s,p=o.amount,d=o.conviction.toString(),m=await this.client.getReferendumInfo(c);return m&&(m.type==="Approved"||m.type==="Rejected")&&l.push({id:c,amount:p,conviction:d}),l},Promise.resolve([]));return{stake:e?.stake,rewardPerStake:e?.reward_per_stake,createdAt:a,actionPoints:e?.action_points,accumulatedUnpaidRewards:e?.accumulated_unpaid_rewards,accumulatedSlashPoints:e?.accumulated_slash_points,accumulatedLockedRewards:e?.accumulated_locked_rewards,votes:r}}async getStake(t){let e=await this.client.getNFTCollectionId(),[n,a]=await Promise.all([this.client.getStaking(),this.client.getUniques(t,e)]),r=a.find(i=>i)?.itemId;return{totalStake:n?.total_stake,accumulatedRewardPerStake:n?.accumulated_reward_per_stake,potReservedBalance:n?.pot_reserved_balance,positionId:r,stakePosition:r?await this.getStakingPosition(r):void 0}}async getRewards(t,e){let n=await this.getStake(t),{potReservedBalance:a,accumulatedRewardPerStake:r,totalStake:i,stakePosition:s}=n;if(!s)return;let[o,l,c,p]=await Promise.all([this.getFreePotBalance(),this.client.getPeriodLength(),this.client.getUnclaimablePeriods(),this.client.getSixBlockSince()]),d=mt(o.toString()).minus(a.toString()),m=r.toString(),g=mt(e).plus(1).toString();d.gt(0)&&i>0&&(m=Ar(r.toString(),d.toString(),i.toString()));let y=rn(l.toString(),e,p??g),b=rn(l.toString(),s.createdAt?.toString()??"",p??g),P=Br(m,s.rewardPerStake?.toString()??"",s.stake?.toString()??""),f=mt(P).plus(s.accumulatedUnpaidRewards?.toString()||"0").plus(s.accumulatedLockedRewards?.toString()||"0");if(!mt(y).minus(b).lte(c.toString()))return f.div(on).toString()}};var Ht=class extends B{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={};T(pn,{TxBuilderFactory:()=>gt});import{Enum as un}from"polkadot-api";function cn(u){let t=[],e=u;for(;e&&typeof e=="object"&&"type"in e;)t.push(e.type),e=e.value;return t.join(".")}var dt=class extends B{evm;evmClient;balanceClient;aaveUtils;constructor(t,e){super(t),this.evm=e,this.evmClient=e.getWsProvider(),this.balanceClient=new D(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:ee})}async dryRun(t,e){let n=un("Signed",t),a=un("system",n),i=await this.client.getUnsafeApi().apis.DryRunApi.dry_run_call(a,e.decodedCall),s=i.success&&!i.value.execution_result.success?i.value.execution_result.value.error:null;if(s){let o=cn(s.value);throw new Error("Dry run execution error!",{cause:o})}return i}isDirectOmnipoolTrade(t){return t.length===1&&t[0].pool==="Omnipool"}};var $t=class extends dt{_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:a}=e[0],r=await this.balanceClient.getBalance(this.beneficiary,a);return t>=r.transferable-5n?this.buildSellAllTx():this.buildSellTx()}async buildBuyTx(){let{amountIn:t,amountOut:e,swaps:n}=this.trade,a=n[0],r=n[n.length-1],i=v.getFraction(t,this.slippagePct),s=a.assetIn,o=r.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:L.build(n)}),this.wrapTx("RouterBuy",c)}async buildSellTx(){let{amountIn:t,amountOut:e,swaps:n}=this.trade,a=n[0],r=n[n.length-1],i=v.getFraction(e,this.slippagePct),s=a.assetIn,o=r.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:L.build(n)}),a.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],a=e[e.length-1],r=v.getFraction(t,this.slippagePct),i=n.assetIn,s=a.assetOut,o=t-r,l=this.api.tx.Router.sell_all({asset_in:i,asset_out:s,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 we}from"polkadot-api";var Qt=class extends dt{_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:a,tradePeriod:r,tradeRoute:i}=this.order,s=this.api.tx.DCA.schedule({schedule:{owner:this.beneficiary,period:r,max_retries:this.maxRetries,total_amount:t,slippage:this.slippagePct*1e4,stability_threshold:void 0,order:we("Sell",{asset_in:e,asset_out:n,amount_in:a,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:a,tradeAmountOut:r,tradePeriod:i,tradeRoute:s}=this.order,o=v.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:we("Sell",{asset_in:e,asset_out:n,amount_in:a,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:a,tradeAmountOut:r,tradePeriod:i,tradeRoute:s}=this.order,o=v.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:we("Buy",{asset_in:e,asset_out:n,amount_out:r,max_amount_in:l,route:s})},start_execution_block:void 0});return this.wrapTx("DcaSchedule.twapBuy",c)}};var gt=class{client;evmClient;constructor(t,e){this.client=t,this.evmClient=e}trade(t){return new $t(this.client,this.evmClient).setTrade(t)}order(t){return new Qt(this.client,this.evmClient).setOrder(t)}};async function Ip(u){let t=new rt(u),e=new wt(u),[n,a]=await Promise.all([t.getBlockTime(),t.getMinOrderBudget()]),r=new lt(u,e).withAave().withOmnipool().withStableswap().withXyk(),i=new Q(e),s=new ut(r),o=new pt(s,{blockTime:n,minBudgetInNative:a}),l=new D(u),c=new Ht(u),p=new Gt(c,l);return{api:{aave:i,router:s,scheduler:o,staking:p},client:{asset:new nt(u),balance:l,evm:e},ctx:{pool:r},tx:new gt(u,e),destroy:()=>{r.destroy()}}}export{Ce as aave,Ae as api,h as big,qe as client,Be as const,Ip as createSdkContext,tt as erc20,Ne as error,Ue as evm,R as fmt,Yt as h160,$ as json,v as math,Je as pool,an as sor,ln as staking,pn as tx,ke as xc};
1
+ var xn=Object.defineProperty;var T=(u,t)=>{for(var e in t)xn(u,e,{get:t[e],enumerable:!0})};var Ee={};T(Ee,{Papi:()=>_,getWs:()=>An});import{hydration as In}from"@galacticcouncil/descriptors";function Fe(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(In)}log(t,...e){let n=typeof window>"u"?process.env.GC_DEBUG:window.localStorage.getItem("gc.debug");Fe(n)&&console.log(t,...e)}};import{createClient as vn}from"polkadot-api";import{withPolkadotSdkCompat as On}from"polkadot-api/polkadot-sdk-compat";var An=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 vn(On(r))};var Ne={};T(Ne,{AAVE_GAS_LIMIT:()=>re,AAVE_LENDING_POOL_ADDRESS:()=>Xt,AAVE_POOL_ABI:()=>ee,AAVE_POOL_DATA_PROVIDER:()=>Yt,AAVE_POOL_DATA_PROVIDER_ABI:()=>Wt,AAVE_POOL_PROXY:()=>ne,AAVE_ROUNDING_THRESHOLD:()=>ai,AAVE_UINT_256_MAX:()=>_n,AaveClient:()=>ft,AaveUtils:()=>$});var ee=[{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 Wt=[{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 ne="0x1b02E051683b5cfaC5929C25E84adb26ECf87B38",Yt="0x112b087b60C1a166130d59266363C45F8aa99db0",Xt="0xf3Ba4D1b50f78301BDD7EAEa9B67822A15FCA691",re=1000000n,ai=5,_n=BigInt("0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");var ft=class{client;constructor(t){this.client=t.getWsProvider()}async getReservesData(){return await this.client.readContract({abi:Wt,address:Yt,args:[Xt],functionName:"getReservesData"})}async getUserReservesData(t){return await this.client.readContract({abi:Wt,address:Yt,args:[Xt,t],functionName:"getUserReservesData"})}async getUserAccountData(t){return await this.client.readContract({abi:ee,address:ne,args:[t],functionName:"getUserAccountData"})}};var h={};T(h,{asBigInt:()=>Fn,toBigInt:()=>Rn,toDecimal:()=>Bn});import j from"big.js";j.NE=-18;function Bn(u,t,e=6,n){let r=j(u.toString()),a=j(10).pow(t);return r.div(a).round(e,n).toString()}function Rn(u,t){let e=j(10).pow(t),r=j(u).mul(e).toFixed(0,j.roundDown);return BigInt(r)}function Fn(u){return BigInt(u.round(0,j.roundDown).toFixed(0))}var et={};T(et,{ERC20:()=>ae});var ae=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 R={};T(R,{FeeUtils:()=>le,shiftNeg:()=>Tt});import kn from"big.js";var Ce={};T(Ce,{HUB_ASSET_ID:()=>oe,HYDRATION_OMNIPOOL_ADDRESS:()=>Cn,HYDRATION_PARACHAIN_ID:()=>En,HYDRATION_SS58_PREFIX:()=>C,PERBILL_DENOMINATOR:()=>ie,PERMILL_DENOMINATOR:()=>St,RUNTIME_DECIMALS:()=>I,SYSTEM_ASSET_DECIMALS:()=>se,SYSTEM_ASSET_ID:()=>G,TRADEABLE_DEFAULT:()=>nt});var I=18,St=1e6,ie=1e9,G=0,se=12,En=2034,C=63,Cn="7L53bUTBbfuj14UpdCNPwmgzzHSsrsTWBHX5pys32mVWM3C1",oe=1,nt=15;var le=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 Tt(u,t){let e=kn(typeof u=="bigint"?u.toString():u);return t===0?e.toString():e.div(Math.pow(10,t)).toString()}var Kt={};T(Kt,{H160:()=>ue,isEvmAccount:()=>De,isEvmAddress:()=>Me,isSs58Address:()=>Le});import{AccountId as wt}from"polkadot-api";import{toHex as ke}from"@polkadot-api/utils";import{Buffer as Y}from"buffer";var ce="ETH\0";function De(u){if(!u)return!1;try{let t=wt().enc(u),e=Y.from(ce);return Y.from(t.subarray(0,e.length)).equals(e)}catch{return!1}}function Me(u){return!!/^0x[a-fA-F0-9]{40}$/.test(u)}function Le(u){try{return wt(63).enc(u),!0}catch{return!1}}var ue=class u{static toAccount=t=>{let e=Y.from(t.slice(2),"hex"),n=Y.from(ce),r=Uint8Array.from(Y.concat([n,e,Y.alloc(8)])),a=ke(r);return wt(63).dec(a)};static fromAccount=t=>{let e=wt().enc(t),n=Y.from(ce),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 ke(n)};static fromAny=t=>{if(Me(t))return t;if(De(t))return u.fromAccount(t);if(Le(t))return u.fromSS58(t);throw new Error("Unknown address type")}};var Q={};T(Q,{findNestedKey:()=>Dn,findNestedObj:()=>Mn,jsonFormatter:()=>Ln});var Dn=(u,t)=>{let e=[];return JSON.stringify(u,(n,r)=>(r&&r[t]&&e.push(r),r)),e[0]},Mn=(u,t,e)=>{let n;return JSON.stringify(u,(r,a)=>(a&&a[t]===e&&(n=a),a)),n},Ln=(u,t)=>typeof t=="bigint"?t.toString():t;var v={};T(v,{calculateBuyFee:()=>Vn,calculateDiffToAvg:()=>qn,calculateDiffToRef:()=>Nn,calculateSellFee:()=>Gn,getFraction:()=>Hn});import H from"big.js";function qn(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 Nn(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 Gn(u,t){let e=H(u.toString()),n=H(t.toString());return H(1).minus(n.div(e)).mul(100).round(2).toNumber()}function Vn(u,t){let e=H(u.toString());return H(t.toString()).div(e).minus(1).mul(100).round(2).toNumber()}function Hn(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 qe={};T(qe,{convertToId:()=>Wn});import{Buffer as Un}from"buffer";function Wn(u){let e=Un.from(u.replace("0x",""),"hex").subarray(16);return e.readUIntBE(0,e.length)}var{ERC20:zt}=et,{H160:pe}=Kt,Yn=1.01,Xn=99999,Kn=10n**27n,zn=10n**18n,$=class{client;constructor(t){this.client=new ft(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,p,d,m,y]=a,b=h.toDecimal(y,18),g=[];for(let P of i){let f=P.underlyingAsset.toLowerCase(),S=s.find(({underlyingAsset:z})=>z.toLowerCase()===f);if(!S)throw new Error("Missing pool reserve for "+f);let w=P.scaledATokenBalance,E=S.liquidityIndex,k=S.priceInMarketReferenceCurrency,B=w*E/Kn,N=Number(o===S.eModeCategoryId?S.eModeLiquidationThreshold:S.reserveLiquidationThreshold)/1e4,W=S.usageAsCollateralEnabled&&P.usageAsCollateralEnabledOnUser&&P.scaledATokenBalance>0n,ht=zt.toAssetId(f);g.push({aTokenBalance:B,decimals:Number(S.decimals),isCollateral:W,priceInRef:k,reserveId:ht,reserveAsset:f,reserveLiquidationThreshold:N})}return{healthFactor:Number(b),totalCollateral:l,totalDebt:c,reserves:g}}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=zt.fromAssetId(e),o=s.find(g=>g.reserveAsset===i);if(!o)throw new Error("Missing reserve ctx for "+i);let{decimals:l,isCollateral:c,priceInRef:p,reserveLiquidationThreshold:d}=o,m=h.toBigInt(n,l),y=c?m*p/10n**BigInt(l):0n,b=r-y;return b<=0n?0:this.calculateHealthFactor(b,d,a)}async getHealthFactorAfterSupply(t,e,n){let{totalCollateral:r,totalDebt:a,reserves:s}=await this.getSummary(t),i=zt.fromAssetId(e),o=s.find(b=>b.reserveAsset===i);if(!o)throw new Error("Missing reserve ctx for "+i);let{decimals:l,priceInRef:c,reserveLiquidationThreshold:p}=o,m=h.toBigInt(n,l)*c/10n**BigInt(l),y=r+m;return y<=0n?0:this.calculateHealthFactor(y,p,a)}async getMaxWithdraw(t,e){let{totalCollateral:n,totalDebt:r,reserves:a}=await this.getSummary(t),s=zt.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 Xn;let r=10n**6n,a=h.toBigInt(e,18),s=t*a*r,i=n*zn,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(Yn,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 We={};T(We,{AssetClient:()=>rt,BalanceClient:()=>D,ChainParams:()=>it,LiquidityMining:()=>st});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:p}=await this.mapToken(a,e,n),d=Number(s),m=new Intl.DateTimeFormat("en-GB"),y=[c,"Bond",m.format(d)].join(" ");return{id:t,name:y,symbol:c+"b",decimals:p,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,p=await Promise.all(a.map(async y=>{let{symbol:b}=await this.mapToken(y,e,n);return[y,b]})),d=Object.fromEntries(p),m=Object.values(d);return{id:t,name:m.join(", "),symbol:i?.asText()||s?.asText(),decimals:18,icon:m.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 p=r.get(l),{asset_type:d}=c,m;switch(d.type){case"Bond":let y=s.get(l);m=await this.mapBond(l,c,i,y);break;case"StableSwap":let b=a.get(l);m=await this.mapShares(l,c,i,b);break;case"External":m=await this.mapExternal(l,c,e,p);break;default:m=await this.mapToken(l,c,i,p)}o.push(m)}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 jn,bufferCount as Qn,combineLatest as $n,debounceTime as Jn,distinctUntilChanged as Ge,finalize as Zn,map as at,pairwise as tr,shareReplay as er,startWith as nr}from"rxjs";var D=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 $n([e,n,r]).pipe(Jn(250),at(a=>a.flat()),nr([]),Qn(2,1),at(([a,s],i)=>{if(i===0)return s;let o=a.reduce((c,p)=>(c.set(p.id,p.balance),c),new Map);return s.filter(c=>!Ve(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(Ge((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 jn,r=n.pipe(er(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 m=>{let y=await this.getTokenBalanceData(t,m);return[m,y]}))).map(([m,y])=>({id:m,balance:y}));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(Zn(()=>i?.()),tr(),at(([o,l],c)=>{if(c===0)return l;let p=o.reduce((m,y)=>(m.set(y.id,y.balance),m),new Map);return l.filter(m=>!Ve(m.balance,p.get(m.id)))}),Ge((o,l)=>l.length===0))}async getTokenBalanceData(t,e){let n=await this.api.apis.CurrenciesApi.account(e,t);return this.calculateBalance(n)}},Ve=(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}};import{AccountId as lr,Binary as cr,Enum as ur}from"polkadot-api";import{fixed_from_rational as Ue}from"@galacticcouncil/math-liquidity-mining";import F from"big.js";import J from"big.js";import{calculate_accumulated_rps as rr,calculate_global_farm_rewards as ar,calculate_loyalty_multiplier as ir,calculate_user_reward as He,calculate_yield_farm_delta_rpvs as sr}from"@galacticcouncil/math-liquidity-mining";var or="1000000000000000000",jt=class{constructor(t,e,n){this.get_account=t;this.multiCurrency=e;this.getAsset=n}async sync_global_farm(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.get_account(t.id),i=r?.existential_deposit;if(!i)throw new Error("Missing reward currency asset list");let o=this.multiCurrency.free_balance(t.reward_currency,s),l=J(i.toString()),c=J(o.toString()).minus(l.lt(o.toString())?i.toString():o.toString()),p=J(ar(t.total_shares_z.toString(),n.toString(),J(t.yield_per_period.toString()).mul(me).round(0,J.roundDown).toFixed(),t.max_reward_per_period.toString(),a.toFixed()));if(c.lt(p)&&(p=c),p.eq(0))return t;let d=this.get_account(0);return this.multiCurrency.transfer(t.reward_currency,s,d,BigInt(p.toFixed())),{...t,accumulated_rpz:BigInt(rr(t.accumulated_rpz.toString(),t.total_shares_z.toString(),p.toFixed()))}}sync_yield_farm(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=sr(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}}get_loyalty_multiplier(t,e){let n=J(1).mul(me).round(0,J.roundDown).toString();if(!e)return n;let{initial_reward_percentage:r,scale_coef:a}=e;return ir(t.toFixed(),r.toString(),a.toFixed())}async claim_rewards(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.sync_global_farm(t,s,a);if(!i)return null;let o=this.sync_yield_farm(e,i,s);if(!o)return null;let l=o.total_stopped-n.stopped_at_creation,c=o.updated_at-n.entered_at-l,p=this.get_loyalty_multiplier(c,o.loyalty_curve),d=BigInt(He(n.accumulated_rpvs.toString(),n.valued_shares.toString(),n.accumulated_claimed_rewards.toString(),o.accumulated_rpvs.toString(),p)),m=BigInt(He(n.accumulated_rpvs.toString(),n.valued_shares.toString(),n.accumulated_claimed_rewards.toString(),o.accumulated_rpvs.toString(),or));return{reward:d,maxReward:m,assetId:i.reward_currency}}};var pr=BigInt(F(1).pow(18).toString()),mr=6,st=class extends _{balanceClient;omnipoolAssetIds=[];secondsInYear=F(365.2425).times(24).times(60).times(60);constructor(t){super(t),this.balanceClient=new D(t)}async getOraclePrice(t,e){let n=[t,e].sort((a,s)=>a-s);if(t===e)return pr;let r=await this.api.query.EmaOracle.Oracles.getValue(cr.fromText("omnipool"),n,ur("TenMinutes"));if(r){let{n:a,d:s}=r[0].price,i;return t<e?i=Ue(a.toString(),s.toString()):i=Ue(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 lr(63).dec(o)};getGlobalRewardPerPeriod(t,e,n,r){let a=F(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=F(t.toString()).times(e),s=F(n.toString()).times(r);return a.div(s.toString()).toString()}farmData(t,e,n){let{yieldFarm:r,globalFarm:a,priceAdjustment:s,balance:i}=t,{multiplier:o,loyalty_curve:l}=r,{blocks_per_period:c,yield_per_period:p,total_shares_z:d,max_reward_per_period:m,pending_rewards:y,accumulated_paid_rewards:b,planned_yielding_periods:g,updated_at:P,incentivized_asset:f,reward_currency:S,price_adjustment:w}=a,E=Tt(s??w,18),k=Tt(o,18),B=Tt(l?.initial_reward_percentage??0,18),q=this.secondsInYear.div(F(mr).times(c)).toString(),N;if(d<0)N=F(k).times(p.toString()).times(q).toString();else{let Tn=this.getGlobalRewardPerPeriod(d,p,m,E),wn=this.getPoolYieldPerPeriod(Tn,k,d,E);N=F(wn).times(q).toString()}let W=y+b,ht=m*BigInt(g),z=i.transferable+W,te=z-W,Pt=F(te.toString()).div(m.toString()),Be=F(e).div(c.toString()).toString(),Pn=(d>=0?Pt.plus(P):Pt.plus(Be)).toString(),fn=F(d.toString()).div(F(m.toString()).div(p.toString())).div(Math.pow(10,18)).times(100).times(E).toFixed(2),Re=F(W.toString()).div(z.toString()).gte(.999);N=Re?"0":F(N).div(n?2:1).times(100).toString();let Sn=B?F(N).times(B).toString():void 0;return{apr:N,minApr:Sn,isDistributed:Re,estimatedEndPeriod:Pn,maxRewards:ht,incentivizedAsset:f,rewardCurrency:S,loyaltyCurve:l,currentPeriod:Be,potMaxRewards:z,fullness:fn}}async getOmnipoolFarms(t){let e=await this.api.query.OmnipoolWarehouseLM.ActiveYieldFarm.getEntries(Number(t)),r=(await this.api.query.ParachainSystem.ValidationData.getValue())?.relay_parent_number,a=await Promise.all(e.map(async({keyArgs:s,value:i})=>{let[,o]=s,l=i,c=await this.api.query.OmnipoolWarehouseLM.GlobalFarm.getValue(o),p=await this.api.query.OmnipoolWarehouseLM.YieldFarm.getValue(Number(t),o,l);if(!c||!p)return;let d=c.reward_currency,m=c.incentivized_asset,y=this.getFarmAddress(o),b=await this.getOraclePrice(d,m),g=await this.balanceClient.getTokenBalance(y,d);return{id:t,globalFarm:c,yieldFarm:p,priceAdjustment:b,balance:g}}));return r?a.map(s=>s?this.farmData(s,r):void 0):[]}async getIsolatedFarms(t){let e=await this.api.query.XYKWarehouseLM.ActiveYieldFarm.getEntries(t),r=(await this.api.query.ParachainSystem.ValidationData.getValue())?.relay_parent_number,a=await Promise.all(e.map(async({keyArgs:s,value:i})=>{let[,o]=s,l=i,c=await this.api.query.XYKWarehouseLM.GlobalFarm.getValue(o),p=await this.api.query.XYKWarehouseLM.YieldFarm.getValue(t,o,l);if(!c||!p)return;let d=c.reward_currency,m=c.incentivized_asset,y=this.getFarmAddress(o,!0),b=await this.getOraclePrice(d,m),g=await this.balanceClient.getBalance(y,d);return{id:t,globalFarm:c,yieldFarm:p,priceAdjustment:b,balance:g,farmAddress:y}}));return r?a.map(s=>s?this.farmData(s,r,!0):void 0):[]}async getDepositReward(t,e,n,r){let a=e.global_farm_id,s=e.yield_farm_id,i=n?await this.api.query.XYKWarehouseLM.YieldFarm.getValue(t,a,s):await this.api.query.OmnipoolWarehouseLM.YieldFarm.getValue(Number(t),a,s),o=n?await this.api.query.XYKWarehouseLM.GlobalFarm.getValue(a):await this.api.query.OmnipoolWarehouseLM.GlobalFarm.getValue(a);if(!o||!i)return;let l=o.reward_currency,c=o.incentivized_asset,p=[[this.getFarmAddress(0,n),o.reward_currency],[this.getFarmAddress(o.id,n),o.reward_currency]],d=await dr(this.api,p)(),m=await this.getOraclePrice(l,c),y=new ge(p,d),g=await new jt(f=>this.getFarmAddress(f),y,f=>this.api.query.AssetRegistry.Assets.getValue(f)).claim_rewards(o,i,e,r,m??o.price_adjustment);if(!g)return;let P=await this.api.query.AssetRegistry.Assets.getValue(g.assetId);if(P&&!(g.reward<=P.existential_deposit))return g}},me=F(10).pow(18),de="0",dr=(u,t)=>async()=>{let[e,n]=await Promise.all([u.query.Tokens.Accounts.getValues(t.filter(([a,s])=>s.toString()!==de)),u.query.System.Account.getValues(t.filter(([a,s])=>s.toString()===de).map(([a])=>[a]))]),r=[];for(let a=0,s=0;a+s<t.length;){let i=a+s,[,o]=t[i];o.toString()===de?(r.push({assetId:o.toString(),free:n[s].data.free,reserved:n[s].data.reserved,frozen:n[s].data.frozen}),s+=1):(r.push({assetId:o.toString(),free:e[a].free,reserved:e[a].reserved,frozen:e[a].frozen}),a+=1)}return r},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)}}free_balance(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)}};var Ye={};T(Ye,{AssetNotFound:()=>ye,PoolNotFound:()=>xt,RouteNotFound:()=>It});var ye=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 ze={};T(ze,{EvmClient:()=>vt,createChain:()=>be});import{defineChain as gr}from"viem";var yr=["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"],be=()=>gr({id:222222,name:"Hydration",network:"hydration",nativeCurrency:{decimals:18,name:"WETH",symbol:"WETH"},rpcUrls:{default:{http:yr}},blockExplorers:{default:{name:"Hydration Explorer",url:"https://explorer.evm.hydration.cloud"}},testnet:!1});import{createPublicClient as Xe,createWalletClient as br,custom as Ke,http as hr}from"viem";var vt=class{client;chain;constructor(t){this.client=t,this.chain=be()}get chainId(){return this.chain.id}get chainCurrency(){return this.chain.nativeCurrency.symbol}get chainDecimals(){return this.chain.nativeCurrency.decimals}getProvider(){return Xe({chain:this.chain,transport:hr()})}getWsProvider(){return Xe({transport:Ke({request:({method:t,params:e})=>this.client._request(t,e||[])})})}getSigner(t){return br({account:t,chain:this.chain,transport:Ke(window.ethereum)})}};var an={};T(an,{PoolContextProvider:()=>ut,PoolError:()=>Z,PoolFactory:()=>ct,PoolType:()=>O,aave:()=>we,lbp:()=>Pe,omni:()=>fe,stable:()=>Se,xyk:()=>Te});var Pe={};T(Pe,{LbpMath:()=>V,LbpPool:()=>Ot,LbpPoolClient:()=>_t});import{calculate_in_given_out as Pr,calculate_out_given_in as fr,calculate_linear_weights as Sr,calculate_pool_trade_fee as Tr,get_spot_price as wr}from"@galacticcouncil/math-lbp";var V=class{static getSpotPrice(t,e,n,r,a){return wr(t,e,n,r,a)}static calculateInGivenOut(t,e,n,r,a){return Pr(t,e,n,r,a)}static calculateOutGivenIn(t,e,n,r,a){return fr(t,e,n,r,a)}static calculateLinearWeights(t,e,n,r,a){return Sr(t,e,n,r,a)}static calculatePoolTradeFee(t,e,n){return Tr(t,e,n)}};var O=(a=>(a.Aave="Aave",a.LBP="LBP",a.Omni="Omnipool",a.Stable="Stableswap",a.XYK="XYK",a))(O||{}),Z=(a=>(a.InsufficientTradingAmount="InsufficientTradingAmount",a.MaxInRatioExceeded="MaxInRatioExceeded",a.MaxOutRatioExceeded="MaxOutRatioExceeded",a.TradeNotAllowed="TradeNotAllowed",a.UnknownError="UnknownError",a))(Z||{});var{FeeUtils:je}=R,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=je.toPct(this.repayFeeApply?n.repayFee:n.exchangeFee),l=e+i,c=this.calculateInGivenOut(t,l),p=t.balanceIn/this.maxInRatio;return c>p&&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=je.toPct(this.repayFeeApply?n.repayFee:n.exchangeFee),c=i-o,p=t.balanceOut/this.maxOutRatio;return c>p&&a.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:i,amountOut:c,feePct:l,errors:a}}}calculateInGivenOut(t,e){let n=V.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=V.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=V.getSpotPrice(t.balanceOut.toString(),t.balanceIn.toString(),t.weightOut.toString(),t.weightIn.toString(),this.maxOutRatio.toString());return BigInt(e)}spotPriceOutGivenIn(t){let e=V.getSpotPrice(t.balanceIn.toString(),t.balanceOut.toString(),t.weightIn.toString(),t.weightOut.toString(),this.maxInRatio.toString());return BigInt(e)}calculateTradeFee(t,e){let n=V.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 Br}from"polkadot-api";import{map as Rr,of as tn,switchMap as Fr}from"rxjs";import{memoize1 as xr}from"@thi.ng/memoize";import{combineLatest as Qe,combineLatestAll as Ir,debounceTime as vr,firstValueFrom as Or,from as $e,map as Je,mergeAll as Ar,of as _r,switchMap as Ze}from"rxjs";var he=[{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:he,address:t,functionName:"latestRoundData"}),this.client.readContract({abi:he,address:t,functionName:"decimals"}),this.client.getBlock()]),[s,i,o,l]=n,c=a.number-(a.timestamp-l)/BigInt(e),p=Number(c);return{price:i,decimals:r,updatedAt:p<0?0:p}}};var M=class extends D{evm;mmOracle;override=[];mem=0;memPools=xr(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=$e(this.getPoolsMem()).pipe(Ze(e=>this.subscribe(e)),Ir());return Or(t)}getSubscriber(){return $e(this.getPoolsMem()).pipe(Ze(t=>this.subscribe(t)),Ar())}subscribe(t){return t.filter(e=>this.hasValidAssets(e)).map(e=>Qe([this.subscribePoolChange(e),this.subscribePoolBalance(e)]).pipe(vr(250),Je(([n,r])=>this.updatePool(n,r))))}subscribePoolBalance(t){if(t.type==="Aave")return _r([]);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 Qe(e).pipe(Je(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 _t=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,p=V.calculateLinearWeights(r?r.toString():"0",a?a.toString():"0",i.toString(),o.toString(),n.toString()),[d,m]=s,y=BigInt(p),b=this.MAX_FINAL_WEIGHT-BigInt(y),[g,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,m),this.api.query.AssetRegistry.Assets.getValue(m)]);return{repayFeeApply:g,tokens:[{id:d,decimals:f?.decimals,existentialDeposit:f?.existential_deposit,balance:P.transferable,weight:y,type:f?.asset_type.type},{id:m,decimals:w?.decimals,existentialDeposit:w?.existential_deposit,balance:S.transferable,weight:b,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(Br.BackwardsCompatible,e)}subscribePoolChange(t){let e=this.api.query.ParachainSystem.ValidationData,n=this.poolsData.get(t.address);return n?e.watchValue("best").pipe(Fr(r=>r?this.getPoolDelta(t.address,n,r.relay_parent_number):tn(t)),Rr(r=>Object.assign({},t,r))):tn(t)}};var fe={};T(fe,{OmniMath:()=>x,OmniPool:()=>Bt,OmniPoolClient:()=>Rt});import{calculate_in_given_out as Er,calculate_lrna_in_given_out as Cr,calculate_out_given_in as kr,calculate_out_given_lrna_in as Dr,calculate_spot_price as Mr,calculate_lrna_spot_price as Lr,calculate_shares as qr,calculate_liquidity_out as Nr,calculate_liquidity_lrna_out as Gr,verify_asset_cap as Vr,calculate_liquidity_hub_in as Hr,is_sell_allowed as Ur,is_buy_allowed as Wr,is_add_liquidity_allowed as Yr,is_remove_liquidity_allowed as Xr}from"@galacticcouncil/math-omnipool";import ot from"big.js";var x=class{static calculateSpotPrice(t,e,n,r){return Mr(t,e,n,r)}static calculateLrnaSpotPrice(t,e){return Lr(t,e)}static calculateInGivenOut(t,e,n,r,a,s,i,o,l){return Er(t,e,n,r,a,s,i,o,l)}static calculateLrnaInGivenOut(t,e,n,r,a){return Cr(t,e,n,r,a)}static calculateOutGivenIn(t,e,n,r,a,s,i,o,l){return kr(t,e,n,r,a,s,i,o,l)}static calculateOutGivenLrnaIn(t,e,n,r,a){return Dr(t,e,n,r,a)}static calculateShares(t,e,n,r){return qr(t,e,n,r)}static calculateLiquidityOut(t,e,n,r,a,s,i,o){return Nr(t,e,n,r,a,s,i,o)}static calculateLiquidityLRNAOut(t,e,n,r,a,s,i,o){return Gr(t,e,n,r,a,s,i,o)}static calculateCapDifference(t,e,n,r){let a=ot(e),s=ot(t),i=ot(r),o=ot(n),l=ot(10).pow(18),c=o.div(l);if(a.div(i).lt(c)){let d=c.times(i).minus(a).times(s),m=a.times(ot(1).minus(c));return d.div(m).toFixed(0)}else return"0"}static verifyAssetCap(t,e,n,r){return Vr(t,e,n,r)}static calculateLimitHubIn(t,e,n,r){return Hr(t,e,n,r)}static isSellAllowed(t){return Ur(t)}static isBuyAllowed(t){return Wr(t)}static isAddLiquidityAllowed(t){return Yr(t)}static isRemoveLiquidityAllowed(t){return Xr(t)}};var{FeeUtils:lt}=R,Bt=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:v.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 p=t.balanceIn/this.maxInRatio;return a>p&&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=v.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 p=t.balanceOut/this.maxOutRatio;return a>p&&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?lt.toRaw(n.assetFee).toString():"0",n?lt.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?lt.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?lt.toRaw(n.assetFee).toString():"0",n?lt.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?lt.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 Kr,CompatibilityLevel as zr}from"polkadot-api";import{toHex as jr}from"@polkadot-api/utils";import{distinctUntilChanged as Qr,map as en}from"rxjs";var{FeeUtils:X}=R,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:p})=>{let[d]=c,{hub_reserve:m,shares:y,tradable:b,cap:g,protocol_shares:P}=p,[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:g,hubReserves:m,protocolShares:P,shares:y,tradeable:b,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=jr(e);return Kr(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(zr.BackwardsCompatible,e)}subscribePoolChange(t){return this.api.query.Omnipool.Assets.watchEntries({at:"best"}).pipe(Qr((n,r)=>!r.deltas),en(({entries:n})=>n.map(r=>{let[a]=r.args,{hub_reserve:s,shares:i,tradable:o,cap:l,protocol_shares:c}=r.value,p=t.tokens.findIndex(m=>m.id===a);return{...t.tokens[p],cap:l,hubReserves:s,protocolShares:c,shares:i,tradeable:o}})),en(n=>{let r=t.tokens.find(a=>a.id===1);return{...t,tokens:[...n,r]}}))}};var Se={};T(Se,{StableMath:()=>A,StableSwap:()=>Ft,StableSwapClient:()=>Et});import{calculate_in_given_out as $r,calculate_out_given_in as Jr,calculate_amplification as Zr,calculate_add_one_asset as ta,calculate_liquidity_out_one_asset as ea,calculate_shares as na,calculate_shares_for_amount as ra,calculate_spot_price_with_fee as aa,pool_account_name as ia,recalculate_peg as sa}from"@galacticcouncil/math-stableswap";var A=class{static getPoolAddress(t){return ia(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 Zr(t,e,n,r,a)}static calculateInGivenOut(t,e,n,r,a,s,i){return $r(t,e,n,r,a,s,i)}static calculateAddOneAsset(t,e,n,r,a,s,i){return ta(t,e,n,r,a,s,i)}static calculateSharesForAmount(t,e,n,r,a,s,i){return ra(t,e,n,r,a,s,i)}static calculateOutGivenIn(t,e,n,r,a,s,i){return Jr(t,e,n,r,a,s,i)}static calculateLiquidityOutOneAsset(t,e,n,r,a,s,i){return ea(t,e,n,r,a,s,i)}static calculateShares(t,e,n,r,a,s){return na(t,e,n,r,a,s)}static calculateSpotPriceWithFee(t,e,n,r,a,s,i,o){return aa(t,e,n,r,a,s,i,o)}static recalculatePegs(t,e,n,r,a){let s=sa(t,e,n,r,a);return JSON.parse(s)}};var{FeeUtils:K}=R,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=A.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=A.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=A.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=A.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=A.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=A.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=A.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=A.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=A.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,Q.jsonFormatter)}getAssets(t,e){let n={asset_id:Number(t),amount:e.toString()};return JSON.stringify([n],Q.jsonFormatter)}};import{AccountId as oa,CompatibilityLevel as la}from"polkadot-api";import{toHex as ca}from"@polkadot-api/utils";import{blake2b as ua}from"@noble/hashes/blake2b";import{map as pa,of as ma,switchMap as da}from"rxjs";var{FeeUtils:tt}=R,Et=class extends M{poolsData=new Map([]);getPoolType(){return"Stableswap"}getPoolAddress(t){let e=A.getPoolAddress(t),n=ua(e,{dkLen:32}),r=ca(n);return oa(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=A.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(la.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,p]=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,...p,...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]=A.recalculatePegs(JSON.stringify(s),JSON.stringify(a),n.toString(),tt.toRaw(i).toString(),tt.toRaw(o).toString()),p=Number(l)*1e6;return{pegsFee:tt.fromPermill(p),pegs:c}}getDefaultPegs(t){let e=t.fee,n=A.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,p]=i.value,d=[p,a[o]].sort((f,S)=>f-S),m=await this.api.query.EmaOracle.Oracles.getValue(l,d,c);if(!m)return;let[{price:y,updated_at:b}]=m,g=y.n.toString(),P=y.d.toString();return p.toString()===d[0].toString()?[[g,P],b.toString()]:[[P,g],b.toString()]}else if(i.type==="MMOracle"){let l=i.value.asHex(),{price:c,decimals:p,updatedAt:d}=await this.mmOracle.getData(l),m=10**p;return[[c.toString(),m.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?ma(t):e.watchValue("best").pipe(da(r=>Promise.all([this.getPoolDelta(t.id,n,r),this.getPoolPegs(t.id,n,r)])),pa(([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 Te={};T(Te,{XykMath:()=>U,XykPool:()=>Ct,XykPoolClient:()=>kt});import{calculate_in_given_out as ga,calculate_out_given_in as ya,calculate_pool_trade_fee as ba,get_spot_price as ha,calculate_liquidity_in as Pa,calculate_shares as fa,calculate_spot_price as Sa,calculate_spot_price_with_fee as Ta,calculate_liquidity_out_asset_a as wa,calculate_liquidity_out_asset_b as xa}from"@galacticcouncil/math-xyk";var U=class{static getSpotPrice(t,e,n){return ha(t,e,n)}static calculateInGivenOut(t,e,n){return ga(t,e,n)}static calculateOutGivenIn(t,e,n){return ya(t,e,n)}static calculatePoolTradeFee(t,e,n){return ba(t,e,n)}static calculateLiquidityIn(t,e,n){return Pa(t,e,n)}static calculateSpotPrice(t,e){return Sa(t,e)}static calculateSpotPriceWithFee(t,e,n,r){return Ta(t,e,n,r)}static calculateShares(t,e,n){return fa(t,e,n)}static calculateLiquidityOutAssetA(t,e,n,r){return wa(t,e,n,r)}static calculateLiquidityOutAssetB(t,e,n,r){return xa(t,e,n,r)}};var{FeeUtils:nn}=R,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=nn.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=nn.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=U.calculateInGivenOut(t.balanceIn.toString(),t.balanceOut.toString(),e.toString()),r=BigInt(n);return r<0n?0n:r}calculateOutGivenIn(t,e){let n=U.calculateOutGivenIn(t.balanceIn.toString(),t.balanceOut.toString(),e.toString()),r=BigInt(n);return r<0n?0n:r}spotPriceInGivenOut(t){let e=U.calculateSpotPrice(t.balanceOut.toString(),t.balanceIn.toString()),n=Math.pow(10,18-t.decimalsOut);return BigInt(e)/BigInt(n)}spotPriceOutGivenIn(t){let e=U.calculateSpotPrice(t.balanceIn.toString(),t.balanceOut.toString()),n=Math.pow(10,18-t.decimalsIn);return BigInt(e)/BigInt(n)}calculateTradeFee(t,e){let n=U.calculatePoolTradeFee(t.toString(),e.exchangeFee[0],e.exchangeFee[1]);return BigInt(n)}};import{CompatibilityLevel as Ia}from"polkadot-api";import{of as va}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,p,d,m]=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:p?.decimals,existentialDeposit:p?.existential_deposit,balance:c.transferable,type:p?.asset_type.type},{id:l,decimals:m?.decimals,existentialDeposit:m?.existential_deposit,balance:d.transferable,type:m?.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(Ia.BackwardsCompatible,e)}subscribePoolChange(t){return va(t)}};var we={};T(we,{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 Oa}from"polkadot-api";import{toHex as Aa}from"@polkadot-api/utils";import{map as _a,merge as Ba,switchMap as Ra}from"rxjs";import{decodeEventLog as Fa}from"viem";var rn=[{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:Ea}=et,Ca=["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=Aa(r);return Oa(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(y=>y.asHex()),p=l.asHex(),{eventName:d,args:m}=Fa({abi:rn,topics:c,data:p});return Ca.includes(d)&&m.reserve.toLowerCase()===r.toLowerCase()});return Ba([a,s]).pipe(Ra(()=>this.getPoolDelta(t)),_a(i=>({...t,tokens:[...i]})))}getReserveH160Id(t){return t.type==="Erc20"?Q.findNestedKey(t.location,"AccountKey20").AccountKey20.key:Ea.fromAssetId(t.id)}};var ct=class{static get(t){switch(t.type){case"Aave":return Dt.fromPool(t);case"XYK":return Ct.fromPool(t);case"Omnipool":return Bt.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 ka,Subscription as Lt,takeUntil as Da}from"rxjs";var ut=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 ka;constructor(t,e){super(t),this.evm=e,this.lbpClient=new _t(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(Da(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 xt(t.type)}};var un={};T(un,{DEFAULT_BLOCK_TIME:()=>on,DEFAULT_MIN_BUDGET:()=>ve,ORDER_MIN_BLOCK_PERIOD:()=>ln,Router:()=>pt,TWAP_BLOCK_PERIOD:()=>Vt,TWAP_MAX_DURATION:()=>Ae,TWAP_MAX_PRICE_IMPACT:()=>Oe,TWAP_TX_MULTIPLIER:()=>Lu,TradeOrderError:()=>Ie,TradeOrderType:()=>$t,TradeRouteBuilder:()=>L,TradeRouter:()=>mt,TradeScheduler:()=>dt,TradeType:()=>Qt});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 Ma=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>Ma)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 p=[...i];p.push(c),a.enqueue(p)}})}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 p of c??[])this.isNotVisited(p,o)&&a.enqueue([...o,p])}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 xe(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(g=>g.type==="XYK"),a=n.filter(g=>g.type!=="XYK"),s=new Set(a.map(g=>g.tokens).flat().map(g=>g.id)),i=s.has(t),o=s.has(e),l=new Nt,c=g=>{let P=xe(g),f=Object.keys(P),S=f.flatMap(w=>P[w]);return l.buildAndPopulateGraph(f,S)};if(!i&&!o){let g=r.filter(S=>S.tokens.find(w=>w.id===t)||S.tokens.find(w=>w.id===e)),P=c(g),f=l.findPaths(P,t,e);return this.parsePaths(f)}if(i&&o){let g=c(a),P=l.findPaths(g,t,e);return this.parsePaths(P)}let p=i?e:t,d=r.filter(g=>g.tokens.some(P=>P.id===p));if(d.length===0)return[];let m=[...a,...d],y=c(m),b=l.findPaths(y,t,e);return this.parsePaths(b)}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 pt=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,ct.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 Qt=(e=>(e.Buy="Buy",e.Sell="Sell",e))(Qt||{}),$t=(n=>(n.Dca="Dca",n.TwapSell="TwapSell",n.TwapBuy="TwapBuy",n))($t||{}),Ie=(n=>(n.OrderTooSmall="OrderTooSmall",n.OrderTooBig="OrderTooBig",n.OrderImpactTooBig="OrderImpactTooBig",n))(Ie||{});var{FeeUtils:sn}=R,mt=class extends pt{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 It(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?sn.toPct(t.min):void 0,n=t.max?sn.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),p=a?r.tradeFeePct:v.calculateSellFee(o,i),d=Math.pow(10,n.assetInDecimals),m=n.amountIn*s/BigInt(d),y=v.calculateDiffToRef(o,m);return{type:"Sell",amountIn:n.amountIn,amountOut:r.amountOut,spotPrice:s,tradeFee:l,tradeFeePct:p,tradeFeeRange:c,priceImpactPct:y,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:p,tradeFeeRange:c,priceImpactPct:y,swaps:e.map(b=>b.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(b=>b.tokens.some(g=>g.id===t)).map(b=>b.type==="Aave"?b.tokens:b.tokens.filter(g=>g.id===t)).map(b=>b.map(g=>g.balance).reduce((g,P)=>g+P)).sort((b,g)=>g<b?-1:1)[0],c=v.getFraction(l,.1),p=await Promise.all(r.map(b=>this.toSellSwaps(c,b,s))),m=this.findBestSellRoute(p).map(b=>({poolAddress:b.poolAddress,poolId:b?.poolId,pool:b.pool,assetIn:b.assetIn,assetOut:b.assetOut})),y=this.buildRouteKey(t,e,a);return this.mlr.set(y,m),m}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:p,calculatedOut:d,feePct:m,errors:y}=i.validateAndSell(o,l,c),b=this.getPoolFeeRange(c),g=i.spotPriceOutGivenIn(o),P=Math.pow(10,o.decimalsIn),f=l*g/BigInt(P),S=v.calculateDiffToRef(d,f);r.push({...s,assetInDecimals:o.decimalsIn,assetOutDecimals:o.decimalsOut,amountIn:l,amountOut:p,calculatedOut:d,spotPrice:g,tradeFeePct:m,tradeFeeRange:b,priceImpactPct:S,errors:y,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(p,o.decimalsOut),calculatedOut:h.toDecimal(d,o.decimalsOut),spotPrice:h.toDecimal(g,o.decimalsOut),tradeFeePct:m,tradeFeeRange:b,priceImpactPct:S,errors:y}}})}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),p=a?r.tradeFeePct:v.calculateBuyFee(o,i),d=Math.pow(10,n.assetOutDecimals),m=n.amountOut*s/BigInt(d),y;return o===0n?y=-100:y=v.calculateDiffToRef(m,o),{type:"Buy",amountOut:n.amountOut,amountIn:r.amountIn,spotPrice:s,tradeFee:l,tradeFeePct:p,tradeFeeRange:c,priceImpactPct:y,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:p,tradeFeeRange:c,priceImpactPct:y,swaps:e.map(b=>b.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:p,calculatedIn:d,feePct:m,errors:y}=i.validateAndBuy(o,l,c),b=this.getPoolFeeRange(c),g=i.spotPriceInGivenOut(o),P=Math.pow(10,o.decimalsOut),f=l*g/BigInt(P),S;d===0n?S=-100:S=v.calculateDiffToRef(f,d),r.unshift({...s,assetInDecimals:o.decimalsIn,assetOutDecimals:o.decimalsOut,amountOut:l,amountIn:p,calculatedIn:d,spotPrice:g,tradeFeePct:m,tradeFeeRange:b,priceImpactPct:S,errors:y,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(p,o.decimalsIn),calculatedIn:h.toDecimal(d,o.decimalsIn),spotPrice:h.toDecimal(g,o.decimalsIn),tradeFeePct:m,tradeFeeRange:b,priceImpactPct:S,errors:y}}})}return r}};var on=6e3,ve=1000000000000000n,Vt=6,Oe=-5,Ae=216e5,Lu=3,ln=6;import{Enum as cn}from"polkadot-api";var L=class{static build(t){return t.map(({assetIn:e,assetOut:n,pool:r,poolId:a})=>r==="Stableswap"?{pool:cn("Stableswap",a),asset_in:e,asset_out:n}:{pool:cn(r),asset_in:e,asset_out:n})}};var dt=class{schedulerOptions;router;constructor(t,e={}){this.router=t,this.schedulerOptions=Object.freeze({blockTime:e.blockTime??6e3,minBudgetInNative:e.minBudgetInNative??ve})}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,p=l[0],d=l[l.length-1],{assetInDecimals:m}=p,{assetOutDecimals:y}=d,b=Math.abs(c),g=this.getMinimumTradeCount(o,s),P=this.getOptimalTradeCount(b),f=a?Math.round(r/a):P,S=Math.ceil(r/g),w=Math.round(r/P),E=Math.round(r/f),k=o/BigInt(f),B=await this.router.getBestSell(t,e,k),q=o<s,N=[];q&&N.push("OrderTooSmall");let W=B.amountOut*BigInt(f),ht=this.toBlockPeriod(E),z=B.tradeFee*BigInt(f),te=L.build(l),Pt={assetIn:t,assetOut:e,errors:N,frequencyMin:S,frequencyOpt:w,frequency:E,tradeCount:f,tradeFee:z,tradeImpactPct:B.priceImpactPct,tradePeriod:ht,tradeRoute:te,type:"Dca"};return{...Pt,amountIn:o,amountOut:W,tradeAmountIn:B.amountIn,tradeAmountOut:B.amountOut,toHuman(){return{...Pt,amountIn:h.toDecimal(o,m),amountOut:h.toDecimal(W,y),tradeAmountIn:h.toDecimal(B.amountIn,m),tradeAmountOut:h.toDecimal(B.amountOut,y)}}}}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:p}=l,{assetOutDecimals:d}=c,m=Math.abs(o),y=this.getTwapTradeCount(m),b=s/BigInt(y),g=await this.router.getBestSell(l.assetIn,c.assetOut,b),P=y===1,f=s<r,S=g.priceImpactPct<-5,w=[];f||P?w.push("OrderTooSmall"):S&&w.push("OrderImpactTooBig");let E=g.amountOut*BigInt(y),k=g.tradeFee*BigInt(y),B=L.build(i),q={assetIn:t,assetOut:e,errors:w,tradeCount:y,tradeImpactPct:g.priceImpactPct,tradePeriod:6,tradeRoute:B,type:"TwapSell"};return{...q,amountIn:s,amountOut:E,tradeAmountIn:g.amountIn,tradeAmountOut:g.amountOut,tradeFee:k,toHuman(){return{...q,amountIn:h.toDecimal(s,p),amountOut:h.toDecimal(E,d),tradeAmountIn:h.toDecimal(g.amountIn,p),tradeAmountOut:h.toDecimal(g.amountOut,d),tradeFee:h.toDecimal(k,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:p}=l,{assetOutDecimals:d}=c,m=Math.abs(o),y=this.getTwapTradeCount(m),b=s/BigInt(y),g=await this.router.getBestBuy(l.assetIn,c.assetOut,b),P=g.amountIn*BigInt(y),f=y===1,S=P<r,w=g.priceImpactPct<-5,E=[];S||f?E.push("OrderTooSmall"):w&&E.push("OrderImpactTooBig");let k=g.tradeFee*BigInt(y),B=L.build(i),q={assetIn:t,assetOut:e,errors:E,tradeCount:y,tradeImpactPct:g.priceImpactPct,tradePeriod:6,tradeRoute:B,type:"TwapBuy"};return{...q,amountIn:P,amountOut:s,tradeAmountIn:g.amountIn,tradeAmountOut:g.amountOut,tradeFee:k,toHuman(){return{...q,amountIn:h.toDecimal(P,p),amountOut:h.toDecimal(s,d),tradeAmountIn:h.toDecimal(g.amountIn,p),tradeAmountOut:h.toDecimal(g.amountOut,d),tradeFee:h.toDecimal(k,p)}}}}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 gn={};T(gn,{BIG_10:()=>mn,BIG_BILL:()=>dn,StakingApi:()=>Ht,StakingClient:()=>Ut});import{encodeAddress as La}from"@polkadot/util-crypto";import{stringToU8a as qa}from"@polkadot/util";import{calculate_accumulated_rps as Na,calculate_period_number as pn,calculate_rewards as Ga}from"@galacticcouncil/math-staking";import gt from"big.js";var mn=gt(10),dn=gt(mn.pow(12));function Va(u){return La(qa(("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=Va(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,p=o.amount,d=o.conviction.toString(),m=await this.client.getReferendumInfo(c);return m&&(m.type==="Approved"||m.type==="Rejected")&&l.push({id:c,amount:p,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,p]=await Promise.all([this.getFreePotBalance(),this.client.getPeriodLength(),this.client.getUnclaimablePeriods(),this.client.getSixBlockSince()]),d=gt(o.toString()).minus(r.toString()),m=a.toString(),y=gt(e).plus(1).toString();d.gt(0)&&s>0&&(m=Na(a.toString(),d.toString(),s.toString()));let b=pn(l.toString(),e,p??y),g=pn(l.toString(),i.createdAt?.toString()??"",p??y),P=Ga(m,i.rewardPerStake?.toString()??"",i.stake?.toString()??""),f=gt(P).plus(i.accumulatedUnpaidRewards?.toString()||"0").plus(i.accumulatedLockedRewards?.toString()||"0");if(!gt(b).minus(g).lte(c.toString()))return f.div(dn).toString()}};var Ut=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 hn={};T(hn,{TxBuilderFactory:()=>bt});import{Enum as bn}from"polkadot-api";function yn(u){let t=[],e=u;for(;e&&typeof e=="object"&&"type"in e;)t.push(e.type),e=e.value;return t.join(".")}var yt=class extends _{evm;evmClient;balanceClient;aaveUtils;constructor(t,e){super(t),this.evm=e,this.evmClient=e.getWsProvider(),this.balanceClient=new D(t),this.aaveUtils=new $(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:re})}async dryRun(t,e){let n=bn("Signed",t),r=bn("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=yn(i.value);throw new Error("Dry run execution error!",{cause:o})}return s}isDirectOmnipoolTrade(t){return t.length===1&&t[0].pool==="Omnipool"}};var Jt=class extends yt{_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=v.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=v.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=v.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 _e}from"polkadot-api";var Zt=class extends yt{_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:_e("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=v.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:_e("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=v.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:_e("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 Jt(this.client,this.evmClient).setTrade(t)}order(t){return new Zt(this.client,this.evmClient).setOrder(t)}};async function Yp(u){let t=new it(u),e=new vt(u),[n,r]=await Promise.all([t.getBlockTime(),t.getMinOrderBudget()]),a=new ut(u,e).withAave().withOmnipool().withStableswap().withXyk(),s=new $(e),i=new mt(a),o=new dt(i,{blockTime:n,minBudgetInNative:r}),l=new D(u),c=new Ut(u),p=new Ht(c,l);return{api:{aave:s,router:i,scheduler:o,staking:p},client:{asset:new rt(u),balance:l,evm:e,mining:new st(u)},ctx:{pool:a},tx:new bt(u,e),destroy:()=>{a.destroy()}}}export{Ne as aave,Ee as api,h as big,We as client,Ce as const,Yp as createSdkContext,et as erc20,Ye as error,ze as evm,R as fmt,Kt as h160,Q as json,v as math,an as pool,un as sor,gn as staking,hn as tx,qe as xc};
@@ -1,6 +1,15 @@
1
- import { PolkadotClient } from 'polkadot-api';
1
+ import { PolkadotClient, TypedApi } from 'polkadot-api';
2
+ import Big from 'big.js';
2
3
  import { Papi } from '../api';
3
4
  import { BalanceClient } from './BalanceClient';
5
+ import { hydration, HydrationQueries } from '@galacticcouncil/descriptors';
6
+ export type OmnipoolWarehouseLMDeposit = HydrationQueries['OmnipoolWarehouseLM']['Deposit']['Value'];
7
+ export type OmnipoolWarehouseLMDepositYieldFarmEntry = OmnipoolWarehouseLMDeposit['yield_farm_entries'][number];
8
+ export type FarmDepositReward = {
9
+ readonly reward: bigint;
10
+ readonly maxReward: bigint;
11
+ readonly assetId: number;
12
+ };
4
13
  export declare class LiquidityMining extends Papi {
5
14
  protected readonly balanceClient: BalanceClient;
6
15
  protected omnipoolAssetIds: string[];
@@ -43,4 +52,25 @@ export declare class LiquidityMining extends Papi {
43
52
  potMaxRewards: bigint;
44
53
  fullness: string;
45
54
  } | undefined)[]>;
55
+ getDepositReward(poolId: string, farmEntry: OmnipoolWarehouseLMDepositYieldFarmEntry, isXyk: boolean, relayChainBlockNumber: number): Promise<FarmDepositReward | undefined>;
46
56
  }
57
+ export declare const BN_QUINTILL: Big.Big;
58
+ type Api = TypedApi<typeof hydration>;
59
+ export declare const getAccountAssetBalances: (api: Api, pairs: Array<[address: string, assetId: number]>) => () => Promise<{
60
+ free: bigint;
61
+ reserved: bigint;
62
+ frozen: bigint;
63
+ assetId: string;
64
+ }[]>;
65
+ export declare class MultiCurrencyContainer {
66
+ result: Map<string, bigint>;
67
+ getKey(asset: number, accountId: string): string;
68
+ constructor(keys: [string, number][], values: {
69
+ free: bigint;
70
+ reserved: bigint;
71
+ frozen: bigint;
72
+ }[]);
73
+ free_balance(asset: number, accountId: string): bigint;
74
+ transfer(asset: number, sourceAccount: string, targetAccount: string, amount: bigint): void;
75
+ }
76
+ export {};
@@ -0,0 +1,22 @@
1
+ import { TypedApi } from 'polkadot-api';
2
+ import { FarmDepositReward, MultiCurrencyContainer, OmnipoolWarehouseLMDepositYieldFarmEntry } from './LiquidityMiningClient';
3
+ import { hydration } from '@galacticcouncil/descriptors';
4
+ type Api = TypedApi<typeof hydration>;
5
+ type NotUndefined<T> = T extends undefined ? never : T;
6
+ type GlobalFarm = NotUndefined<Awaited<ReturnType<Api['query']['XYKWarehouseLM']['GlobalFarm']['getValue'] | Api['query']['OmnipoolWarehouseLM']['GlobalFarm']['getValue']>>>;
7
+ type YieldFarm = NotUndefined<Awaited<ReturnType<Api['query']['XYKWarehouseLM']['YieldFarm']['getValue'] | Api['query']['OmnipoolWarehouseLM']['YieldFarm']['getValue']>>>;
8
+ export declare class OmnipoolLiquidityMiningClaimSim {
9
+ protected get_account: (sub: number) => string;
10
+ protected multiCurrency: MultiCurrencyContainer;
11
+ protected getAsset: (id: number) => Promise<{
12
+ existential_deposit: bigint;
13
+ } | undefined>;
14
+ constructor(get_account: (sub: number) => string, multiCurrency: MultiCurrencyContainer, getAsset: (id: number) => Promise<{
15
+ existential_deposit: bigint;
16
+ } | undefined>);
17
+ sync_global_farm(global_farm: GlobalFarm, current_period: number, oraclePrice: bigint): Promise<GlobalFarm | null>;
18
+ sync_yield_farm(yield_farm: YieldFarm, global_farm: GlobalFarm, current_period: number): YieldFarm | null;
19
+ get_loyalty_multiplier(periods: number, loyaltyCurve: YieldFarm['loyalty_curve']): string;
20
+ claim_rewards(global_farm: GlobalFarm, yield_farm: YieldFarm, farmEntry: OmnipoolWarehouseLMDepositYieldFarmEntry, relaychainBlockNumber: number, oraclePrice: bigint): Promise<FarmDepositReward | null>;
21
+ }
22
+ export {};
@@ -1,6 +1,6 @@
1
1
  import { PolkadotClient } from 'polkadot-api';
2
2
  import { AaveUtils } from './aave';
3
- import { AssetClient, BalanceClient } from './client';
3
+ import { AssetClient, BalanceClient, LiquidityMining } from './client';
4
4
  import { EvmClient } from './evm';
5
5
  import { PoolContextProvider } from './pool';
6
6
  import { TradeRouter, TradeScheduler } from './sor';
@@ -17,6 +17,7 @@ export type SdkCtx = {
17
17
  asset: AssetClient;
18
18
  balance: BalanceClient;
19
19
  evm: EvmClient;
20
+ mining: LiquidityMining;
20
21
  };
21
22
  ctx: {
22
23
  pool: PoolContextProvider;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@galacticcouncil/sdk-next",
3
- "version": "0.7.0-pr169-adc219c",
3
+ "version": "0.7.0-pr193-3d86320",
4
4
  "description": "Galactic next gen sdk (papi)",
5
5
  "author": "GalacticCouncil",
6
6
  "repository": {