@galacticcouncil/sdk-next 0.7.1-pr199-9b2819e → 0.8.0-pr203-91dcafe
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 +1 -1
- package/build/index.mjs +1 -1
- package/build/types/aave/AaveClient.d.ts +1 -0
- package/build/types/aave/AaveUtils.d.ts +6 -2
- package/build/types/aave/types.d.ts +1 -0
- package/build/types/farm/const.d.ts +1 -1
- package/build/types/farm/types.d.ts +0 -3
- package/build/types/staking/StakingApi.d.ts +46 -26
- package/build/types/staking/StakingClient.d.ts +3 -0
- package/package.json +1 -1
package/build/index.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var ir=Object.create;var ce=Object.defineProperty;var or=Object.getOwnPropertyDescriptor;var lr=Object.getOwnPropertyNames;var cr=Object.getPrototypeOf,ur=Object.prototype.hasOwnProperty;var hn=(u,t)=>()=>(u&&(t=u(u=0)),t);var x=(u,t)=>{for(var e in t)ce(u,e,{get:t[e],enumerable:!0})},le=(u,t,e,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of lr(t))!ur.call(u,r)&&r!==e&&ce(u,r,{get:()=>t[r],enumerable:!(n=or(t,r))||n.enumerable});return u},yt=(u,t,e)=>(le(u,t,"default"),e&&le(e,t,"default")),et=(u,t,e)=>(e=u!=null?ir(cr(u)):{},le(t||!u||!u.__esModule?ce(e,"default",{value:u,enumerable:!0}):e,u)),mr=u=>le(ce({},"__esModule",{value:!0}),u);var Ct={};var Sn=hn(()=>{yt(Ct,require("@polkadot-api/ws-provider/node"))});var kt={};var wn=hn(()=>{yt(kt,require("@polkadot-api/ws-provider/web"))});var Ur={};x(Ur,{aave:()=>Ne,api:()=>Ie,big:()=>h,client:()=>Ge,const:()=>Ee,createSdkContext:()=>Gr,erc20:()=>lt,error:()=>He,evm:()=>We,farm:()=>ze,fmt:()=>O,h160:()=>Lt,json:()=>rt,math:()=>A,pool:()=>en,sor:()=>cn,staking:()=>un,tx:()=>pn,xc:()=>Le});module.exports=mr(Ur);var Ie={};x(Ie,{Papi:()=>k,getWs:()=>pr});var fn=require("@galacticcouncil/descriptors");function Pn(u){switch(u){case!0:case"true":case 1:case"1":case"on":case"yes":return!0;default:return!1}}var k=class{client;api;constructor(t){this.client=t,this.api=this.client.getTypedApi(fn.hydration)}log(t,...e){let n=typeof window>"u"?process.env.GC_DEBUG:window.localStorage.getItem("gc.debug");Pn(n)&&console.log(t,...e)}};var Tn=require("polkadot-api"),xn=require("polkadot-api/polkadot-sdk-compat"),pr=async u=>{let t=typeof u=="string"?u.split(","):u,r=(typeof window>"u"?(await Promise.resolve().then(()=>(Sn(),Ct))).getWsProvider:(await Promise.resolve().then(()=>(wn(),kt))).getWsProvider)(t);return(0,Tn.createClient)((0,xn.withPolkadotSdkCompat)(r))};var Ne={};x(Ne,{AAVE_GAS_LIMIT:()=>Ae,AAVE_LENDING_POOL_ADDRESS:()=>pe,AAVE_POOL_ABI:()=>ve,AAVE_POOL_DATA_PROVIDER:()=>me,AAVE_POOL_DATA_PROVIDER_ABI:()=>ue,AAVE_POOL_PROXY:()=>Oe,AAVE_ROUNDING_THRESHOLD:()=>ra,AAVE_UINT_256_MAX:()=>dr,AaveClient:()=>Dt,AaveUtils:()=>ct});var ve=[{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"reserve",type:"address"},{indexed:!1,internalType:"address",name:"user",type:"address"},{indexed:!0,internalType:"address",name:"onBehalfOf",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"},{indexed:!0,internalType:"uint16",name:"referralCode",type:"uint16"}],name:"Supply",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"reserve",type:"address"},{indexed:!0,internalType:"address",name:"user",type:"address"},{indexed:!0,internalType:"address",name:"to",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"}],name:"Withdraw",type:"event"},{inputs:[{internalType:"address",name:"asset",type:"address"},{internalType:"uint256",name:"amount",type:"uint256"},{internalType:"address",name:"to",type:"address"}],name:"withdraw",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"nonpayable",type:"function"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"reserve",type:"address"},{indexed:!1,internalType:"address",name:"user",type:"address"},{indexed:!0,internalType:"address",name:"onBehalfOf",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"},{indexed:!1,internalType:"enum DataTypes.InterestRateMode",name:"interestRateMode",type:"uint8"},{indexed:!1,internalType:"uint256",name:"borrowRate",type:"uint256"},{indexed:!0,internalType:"uint16",name:"referralCode",type:"uint16"}],name:"Borrow",type:"event"},{inputs:[{internalType:"address",name:"asset",type:"address"},{internalType:"uint256",name:"amount",type:"uint256"},{internalType:"uint256",name:"interestRateMode",type:"uint256"},{internalType:"uint16",name:"referralCode",type:"uint16"},{internalType:"address",name:"onBehalfOf",type:"address"}],name:"borrow",outputs:[],stateMutability:"nonpayable",type:"function"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"reserve",type:"address"},{indexed:!0,internalType:"address",name:"user",type:"address"},{indexed:!0,internalType:"address",name:"repayer",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"},{indexed:!1,internalType:"bool",name:"useATokens",type:"bool"}],name:"Repay",type:"event"},{inputs:[{internalType:"address",name:"user",type:"address"}],name:"getUserAccountData",outputs:[{internalType:"uint256",name:"totalCollateralBase",type:"uint256"},{internalType:"uint256",name:"totalDebtBase",type:"uint256"},{internalType:"uint256",name:"availableBorrowsBase",type:"uint256"},{internalType:"uint256",name:"currentLiquidationThreshold",type:"uint256"},{internalType:"uint256",name:"ltv",type:"uint256"},{internalType:"uint256",name:"healthFactor",type:"uint256"}],stateMutability:"view",type:"function"}];var ue=[{inputs:[{internalType:"contract IEACAggregatorProxy",name:"_networkBaseTokenPriceInUsdProxyAggregator",type:"address"},{internalType:"contract IEACAggregatorProxy",name:"_marketReferenceCurrencyPriceInUsdProxyAggregator",type:"address"}],stateMutability:"nonpayable",type:"constructor"},{inputs:[],name:"ETH_CURRENCY_UNIT",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[],name:"MKR_ADDRESS",outputs:[{internalType:"address",name:"",type:"address"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"bytes32",name:"_bytes32",type:"bytes32"}],name:"bytes32ToString",outputs:[{internalType:"string",name:"",type:"string"}],stateMutability:"pure",type:"function"},{inputs:[{internalType:"contract IPoolAddressesProvider",name:"provider",type:"address"}],name:"getReservesData",outputs:[{components:[{internalType:"address",name:"underlyingAsset",type:"address"},{internalType:"string",name:"name",type:"string"},{internalType:"string",name:"symbol",type:"string"},{internalType:"uint256",name:"decimals",type:"uint256"},{internalType:"uint256",name:"baseLTVasCollateral",type:"uint256"},{internalType:"uint256",name:"reserveLiquidationThreshold",type:"uint256"},{internalType:"uint256",name:"reserveLiquidationBonus",type:"uint256"},{internalType:"uint256",name:"reserveFactor",type:"uint256"},{internalType:"bool",name:"usageAsCollateralEnabled",type:"bool"},{internalType:"bool",name:"borrowingEnabled",type:"bool"},{internalType:"bool",name:"stableBorrowRateEnabled",type:"bool"},{internalType:"bool",name:"isActive",type:"bool"},{internalType:"bool",name:"isFrozen",type:"bool"},{internalType:"uint128",name:"liquidityIndex",type:"uint128"},{internalType:"uint128",name:"variableBorrowIndex",type:"uint128"},{internalType:"uint128",name:"liquidityRate",type:"uint128"},{internalType:"uint128",name:"variableBorrowRate",type:"uint128"},{internalType:"uint128",name:"stableBorrowRate",type:"uint128"},{internalType:"uint40",name:"lastUpdateTimestamp",type:"uint40"},{internalType:"address",name:"aTokenAddress",type:"address"},{internalType:"address",name:"stableDebtTokenAddress",type:"address"},{internalType:"address",name:"variableDebtTokenAddress",type:"address"},{internalType:"address",name:"interestRateStrategyAddress",type:"address"},{internalType:"uint256",name:"availableLiquidity",type:"uint256"},{internalType:"uint256",name:"totalPrincipalStableDebt",type:"uint256"},{internalType:"uint256",name:"averageStableRate",type:"uint256"},{internalType:"uint256",name:"stableDebtLastUpdateTimestamp",type:"uint256"},{internalType:"uint256",name:"totalScaledVariableDebt",type:"uint256"},{internalType:"uint256",name:"priceInMarketReferenceCurrency",type:"uint256"},{internalType:"address",name:"priceOracle",type:"address"},{internalType:"uint256",name:"variableRateSlope1",type:"uint256"},{internalType:"uint256",name:"variableRateSlope2",type:"uint256"},{internalType:"uint256",name:"stableRateSlope1",type:"uint256"},{internalType:"uint256",name:"stableRateSlope2",type:"uint256"},{internalType:"uint256",name:"baseStableBorrowRate",type:"uint256"},{internalType:"uint256",name:"baseVariableBorrowRate",type:"uint256"},{internalType:"uint256",name:"optimalUsageRatio",type:"uint256"},{internalType:"bool",name:"isPaused",type:"bool"},{internalType:"bool",name:"isSiloedBorrowing",type:"bool"},{internalType:"uint128",name:"accruedToTreasury",type:"uint128"},{internalType:"uint128",name:"unbacked",type:"uint128"},{internalType:"uint128",name:"isolationModeTotalDebt",type:"uint128"},{internalType:"bool",name:"flashLoanEnabled",type:"bool"},{internalType:"uint256",name:"debtCeiling",type:"uint256"},{internalType:"uint256",name:"debtCeilingDecimals",type:"uint256"},{internalType:"uint8",name:"eModeCategoryId",type:"uint8"},{internalType:"uint256",name:"borrowCap",type:"uint256"},{internalType:"uint256",name:"supplyCap",type:"uint256"},{internalType:"uint16",name:"eModeLtv",type:"uint16"},{internalType:"uint16",name:"eModeLiquidationThreshold",type:"uint16"},{internalType:"uint16",name:"eModeLiquidationBonus",type:"uint16"},{internalType:"address",name:"eModePriceSource",type:"address"},{internalType:"string",name:"eModeLabel",type:"string"},{internalType:"bool",name:"borrowableInIsolation",type:"bool"}],internalType:"struct IUiPoolDataProviderV3.AggregatedReserveData[]",name:"",type:"tuple[]"},{components:[{internalType:"uint256",name:"marketReferenceCurrencyUnit",type:"uint256"},{internalType:"int256",name:"marketReferenceCurrencyPriceInUsd",type:"int256"},{internalType:"int256",name:"networkBaseTokenPriceInUsd",type:"int256"},{internalType:"uint8",name:"networkBaseTokenPriceDecimals",type:"uint8"}],internalType:"struct IUiPoolDataProviderV3.BaseCurrencyInfo",name:"",type:"tuple"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"contract IPoolAddressesProvider",name:"provider",type:"address"}],name:"getReservesList",outputs:[{internalType:"address[]",name:"",type:"address[]"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"contract IPoolAddressesProvider",name:"provider",type:"address"},{internalType:"address",name:"user",type:"address"}],name:"getUserReservesData",outputs:[{components:[{internalType:"address",name:"underlyingAsset",type:"address"},{internalType:"uint256",name:"scaledATokenBalance",type:"uint256"},{internalType:"bool",name:"usageAsCollateralEnabledOnUser",type:"bool"},{internalType:"uint256",name:"stableBorrowRate",type:"uint256"},{internalType:"uint256",name:"scaledVariableDebt",type:"uint256"},{internalType:"uint256",name:"principalStableDebt",type:"uint256"},{internalType:"uint256",name:"stableBorrowLastUpdateTimestamp",type:"uint256"}],internalType:"struct IUiPoolDataProviderV3.UserReserveData[]",name:"",type:"tuple[]"},{internalType:"uint8",name:"",type:"uint8"}],stateMutability:"view",type:"function"},{inputs:[],name:"marketReferenceCurrencyPriceInUsdProxyAggregator",outputs:[{internalType:"contract IEACAggregatorProxy",name:"",type:"address"}],stateMutability:"view",type:"function"},{inputs:[],name:"networkBaseTokenPriceInUsdProxyAggregator",outputs:[{internalType:"contract IEACAggregatorProxy",name:"",type:"address"}],stateMutability:"view",type:"function"}];var Oe="0x1b02E051683b5cfaC5929C25E84adb26ECf87B38",me="0x112b087b60C1a166130d59266363C45F8aa99db0",pe="0xf3Ba4D1b50f78301BDD7EAEa9B67822A15FCA691",Ae=1000000n,ra=5,dr=BigInt("0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");var Dt=class{client;constructor(t){this.client=t.getWsProvider()}async getReservesData(){return await this.client.readContract({abi:ue,address:me,args:[pe],functionName:"getReservesData"})}async getUserReservesData(t){return await this.client.readContract({abi:ue,address:me,args:[pe,t],functionName:"getUserReservesData"})}async getUserAccountData(t){return await this.client.readContract({abi:ve,address:Oe,args:[t],functionName:"getUserAccountData"})}};var h={};x(h,{asBigInt:()=>yr,toBigInt:()=>br,toDecimal:()=>gr});var nt=et(require("big.js"));nt.default.NE=-18;function gr(u,t,e=6,n){let r=(0,nt.default)(u.toString()),a=(0,nt.default)(10).pow(t);return r.div(a).round(e,n).toString()}function br(u,t){let e=(0,nt.default)(10).pow(t),r=(0,nt.default)(u).mul(e).toFixed(0,nt.default.roundDown);return BigInt(r)}function yr(u){return BigInt(u.round(0,nt.default.roundDown).toFixed(0))}var lt={};x(lt,{ERC20:()=>Be});var Be=class{static fromAssetId(t){let e=Buffer.alloc(20,0);return e[15]=1,e.writeUInt32BE(t,16),"0x"+e.toString("hex")}static toAssetId(t){let e=Buffer.from(t.replace("0x",""),"hex");return e.length!==20||!this.isAssetAddress(t)?null:e.readUInt32BE(16)}static isAssetAddress(t){let e=Buffer.from("0000000000000000000000000000000100000000","hex"),n=Buffer.from(t.replace("0x",""),"hex");return n.length!==20?!1:n.subarray(0,16).equals(e.subarray(0,16))}};var O={};x(O,{FeeUtils:()=>Ce,shiftNeg:()=>fr});var In=et(require("big.js"));var Ee={};x(Ee,{HUB_ASSET_ID:()=>Fe,HYDRATION_OMNIPOOL_ADDRESS:()=>Pr,HYDRATION_PARACHAIN_ID:()=>hr,HYDRATION_SS58_PREFIX:()=>q,PERBILL_DENOMINATOR:()=>_e,PERMILL_DENOMINATOR:()=>Mt,RUNTIME_DECIMALS:()=>_,SYSTEM_ASSET_DECIMALS:()=>Re,SYSTEM_ASSET_ID:()=>L,TRADEABLE_DEFAULT:()=>ht});var _=18,Mt=1e6,_e=1e9,L=0,Re=12,hr=2034,q=63,Pr="7L53bUTBbfuj14UpdCNPwmgzzHSsrsTWBHX5pys32mVWM3C1",Fe=1,ht=15;var Ce=class u{static toPct(t){let[e,n]=t;return u.safeDivide(e*100,n)}static toRaw(t){let[e,n]=t;return u.safeDivide(e,n)}static fromPermill(t){return[t,1e6]}static fromPerbill(t){return[t,1e9]}static fromRate(t,e){return[t,e]}static safeDivide(t,e,n=12){let r=10**n;return Math.round(t*r/e)/r}static safeRound(t){return parseFloat(t.toPrecision(15))}};function fr(u,t){let e=(0,In.default)(typeof u=="bigint"?u.toString():u);return t===0?e.toString():e.div(Math.pow(10,t)).toString()}var Lt={};x(Lt,{H160:()=>Me,isEvmAccount:()=>vn,isEvmAddress:()=>On,isSs58Address:()=>An});var Pt=require("polkadot-api"),ke=require("@polkadot-api/utils"),J=require("buffer");var De="ETH\0";function vn(u){if(!u)return!1;try{let t=(0,Pt.AccountId)().enc(u),e=J.Buffer.from(De);return J.Buffer.from(t.subarray(0,e.length)).equals(e)}catch{return!1}}function On(u){return!!/^0x[a-fA-F0-9]{40}$/.test(u)}function An(u){try{return(0,Pt.AccountId)(63).enc(u),!0}catch{return!1}}var Me=class u{static toAccount=t=>{let e=J.Buffer.from(t.slice(2),"hex"),n=J.Buffer.from(De),r=Uint8Array.from(J.Buffer.concat([n,e,J.Buffer.alloc(8)])),a=(0,ke.toHex)(r);return(0,Pt.AccountId)(63).dec(a)};static fromAccount=t=>{let e=(0,Pt.AccountId)().enc(t),n=J.Buffer.from(De),r=e.slice(n.length,-8);return"0x"+J.Buffer.from(r).toString("hex")};static fromSS58=t=>{let n=(0,Pt.AccountId)().enc(t).slice(0,20);return(0,ke.toHex)(n)};static fromAny=t=>{if(On(t))return t;if(vn(t))return u.fromAccount(t);if(An(t))return u.fromSS58(t);throw new Error("Unknown address type")}};var rt={};x(rt,{findNestedKey:()=>Sr,findNestedObj:()=>wr,jsonFormatter:()=>Tr});var Sr=(u,t)=>{let e=[];return JSON.stringify(u,(n,r)=>(r&&r[t]&&e.push(r),r)),e[0]},wr=(u,t,e)=>{let n;return JSON.stringify(u,(r,a)=>(a&&a[t]===e&&(n=a),a)),n},Tr=(u,t)=>typeof t=="bigint"?t.toString():t;var A={};x(A,{calculateBuyFee:()=>Or,calculateDiffToAvg:()=>xr,calculateDiffToRef:()=>Ir,calculateSellFee:()=>vr,getFraction:()=>Ar});var K=et(require("big.js"));function xr(u,t){let e=(0,K.default)(u.toString()),n=(0,K.default)(t.toString());return e.minus(n).abs().div(e.plus(n).div(2)).mul(100).round(2).toNumber()}function Ir(u,t){if(t===0n)return 0;let e=(0,K.default)(u.toString()),n=(0,K.default)(t.toString());return e.minus(n).div(n).mul(100).round(2).toNumber()}function vr(u,t){let e=(0,K.default)(u.toString()),n=(0,K.default)(t.toString());return(0,K.default)(1).minus(n.div(e)).mul(100).round(2).toNumber()}function Or(u,t){let e=(0,K.default)(u.toString());return(0,K.default)(t.toString()).div(e).minus(1).mul(100).round(2).toNumber()}function Ar(u,t,e=2){(t<.01||t>100)&&new Error("Supported range is from 0.01% - 100%");let n=Math.pow(10,e),r=BigInt(t*n);return u*r/BigInt(100*n)}var Le={};x(Le,{convertToId:()=>Br});var Bn=require("buffer");function Br(u){let e=Bn.Buffer.from(u.replace("0x",""),"hex").subarray(16);return e.readUIntBE(0,e.length)}var{ERC20:de}=lt,{H160:qe}=Lt,_r=1.01,Rr=99999,Fr=10n**27n,Er=10n**18n,ct=class{client;constructor(t){this.client=new Dt(t)}async getSummary(t){let e=qe.fromAny(t),[n,r,a]=await Promise.all([this.client.getReservesData(),this.client.getUserReservesData(e),this.client.getUserAccountData(e)]),[i]=n,[s,o]=r,[l,c,m,d,p,g]=a,y=h.toDecimal(g,18),b=[];for(let P of s){let f=P.underlyingAsset.toLowerCase(),S=i.find(({underlyingAsset:Ft})=>Ft.toLowerCase()===f);if(!S)throw new Error("Missing pool reserve for "+f);let v=P.scaledATokenBalance,N=S.liquidityIndex,G=S.priceInMarketReferenceCurrency,D=v*N/Fr,ot=Number(o===S.eModeCategoryId?S.eModeLiquidationThreshold:S.reserveLiquidationThreshold)/1e4,W=S.usageAsCollateralEnabled&&P.usageAsCollateralEnabledOnUser&&P.scaledATokenBalance>0n,tt=de.toAssetId(f);b.push({aTokenBalance:D,decimals:Number(S.decimals),isCollateral:W,priceInRef:G,reserveId:tt,reserveAsset:f,reserveLiquidationThreshold:ot})}return{healthFactor:Number(y),totalCollateral:l,totalDebt:c,reserves:b}}async hasBorrowPositions(t){let e=qe.fromAny(t),n=await this.client.getUserAccountData(e),[r,a]=n;return a>0n}async getHealthFactor(t){let e=qe.fromAny(t),n=await this.client.getUserAccountData(e),[r,a,i,s,o,l]=n,c=h.toDecimal(l,18);return Number(c)}async getHealthFactorAfterWithdraw(t,e,n){let{totalCollateral:r,totalDebt:a,reserves:i}=await this.getSummary(t),s=de.fromAssetId(e),o=i.find(b=>b.reserveAsset===s);if(!o)throw new Error("Missing reserve ctx for "+s);let{decimals:l,isCollateral:c,priceInRef:m,reserveLiquidationThreshold:d}=o,p=h.toBigInt(n,l),g=c?p*m/10n**BigInt(l):0n,y=r-g;return y<=0n?0:this.calculateHealthFactor(y,d,a)}async getHealthFactorAfterSupply(t,e,n){let{totalCollateral:r,totalDebt:a,reserves:i}=await this.getSummary(t),s=de.fromAssetId(e),o=i.find(y=>y.reserveAsset===s);if(!o)throw new Error("Missing reserve ctx for "+s);let{decimals:l,priceInRef:c,reserveLiquidationThreshold:m}=o,p=h.toBigInt(n,l)*c/10n**BigInt(l),g=r+p;return g<=0n?0:this.calculateHealthFactor(g,m,a)}async getMaxWithdraw(t,e){let{totalCollateral:n,totalDebt:r,reserves:a}=await this.getSummary(t),i=de.fromAssetId(e),s=a.find(o=>o.reserveAsset===i);if(!s)throw new Error("Missing reserve ctx for "+i);return this.calculateWithdrawMax(s,n,r)}async getMaxWithdrawAll(t){let{totalCollateral:e,totalDebt:n,reserves:r}=await this.getSummary(t),a={};for(let i of r){let s=this.calculateWithdrawMax(i,e,n);i.reserveId&&(a[i.reserveId]=s)}return a}calculateHealthFactor(t,e,n){if(n===0n)return Rr;let r=10n**6n,a=h.toBigInt(e,18),i=t*a*r,s=n*Er,o=i/s;return Number(o)/1e6}calculateRequiredCollateral(t,e,n){let r=h.toBigInt(t,18),a=h.toBigInt(e,18);return(r*n+a-1n)/a}calculateWithdrawMax(t,e,n){let{aTokenBalance:r,decimals:a,priceInRef:i,reserveLiquidationThreshold:s}=t,o=this.calculateRequiredCollateral(_r,s,n),l=e-o;if(l<=0n)return{amount:0n,decimals:a};let c=l*10n**BigInt(a)/i;return{amount:r<c?r:c,decimals:a}}};var Ge={};x(Ge,{AssetClient:()=>ft,BalanceClient:()=>z,ChainParams:()=>St});var ft=class extends k{SUPPORTED_TYPES=["StableSwap","Bond","Token","External","Erc20"];constructor(t){super(t)}async queryShares(){let e=await this.api.query.Stableswap.Pools.getEntries();return new Map(e.map(({keyArgs:n,value:r})=>{let[a]=n;return[a,r]}))}async queryBonds(){let e=await this.api.query.Bonds.Bonds.getEntries();return new Map(e.map(({keyArgs:n,value:r})=>{let[a]=n;return[a,r]}))}async queryAssets(){let e=await this.api.query.AssetRegistry.Assets.getEntries();return new Map(e.filter(({value:n})=>{let{asset_type:r}=n;return this.SUPPORTED_TYPES.includes(r.type)}).map(({keyArgs:n,value:r})=>{let[a]=n;return[a,r]}))}async queryAssetLocations(){let e=await this.api.query.AssetRegistry.AssetLocations.getEntries();return new Map(e.map(({keyArgs:n,value:r})=>{let[a]=n;return[a,r]}))}async mapToken(t,e,n,r){let{name:a,asset_type:i,is_sufficient:s,existential_deposit:o}=e,{symbol:l,decimals:c}=n.get(t)??{};return{id:t,name:a?.asText(),symbol:l,decimals:c,icon:l,type:i.type,isSufficient:s,location:r,existentialDeposit:o}}async mapBond(t,e,n,r){let[a,i]=r,{asset_type:s,is_sufficient:o,existential_deposit:l}=e,{symbol:c,decimals:m}=await this.mapToken(a,e,n),d=Number(i),p=new Intl.DateTimeFormat("en-GB"),g=[c,"Bond",p.format(d)].join(" ");return{id:t,name:g,symbol:c+"b",decimals:m,icon:c,type:s.type,isSufficient:o,existentialDeposit:l,underlyingAssetId:a,maturity:d}}async mapShares(t,e,n,r){let{assets:a}=r,{name:i,symbol:s,asset_type:o,is_sufficient:l,existential_deposit:c}=e,m=await Promise.all(a.map(async g=>{let{symbol:y}=await this.mapToken(g,e,n);return[g,y]})),d=Object.fromEntries(m),p=Object.values(d);return{id:t,name:p.join(", "),symbol:s?.asText()||i?.asText(),decimals:18,icon:p.join("/"),type:o.type,isSufficient:l,existentialDeposit:c,meta:d}}async mapExternal(t,e,n,r){let a=await this.mapToken(t,e,new Map,r),i=n?.find(s=>s.internalId===a.id);return i?{...a,decimals:i.decimals,name:i.name,symbol:i.symbol,icon:i.symbol,isWhiteListed:i.isWhiteListed}:a}parseMetadata(t){return new Map(Array.from(t,([e,n])=>[e,{symbol:n.symbol?.asText(),decimals:n.decimals}]))}async getOnChainAssets(t,e){let[n,r,a,i]=await Promise.all([this.queryAssets(),this.queryAssetLocations(),this.queryShares(),this.queryBonds()]),s=this.parseMetadata(n),o=[];for(let[l,c]of Array.from(n)){let m=r.get(l),{asset_type:d}=c,p;switch(d.type){case"Bond":let g=i.get(l);p=await this.mapBond(l,c,s,g);break;case"StableSwap":let y=a.get(l);p=await this.mapShares(l,c,s,y);break;case"External":p=await this.mapExternal(l,c,e,m);break;default:p=await this.mapToken(l,c,s,m)}o.push(p)}return t?o:o.filter(l=>this.isValidAsset(l))}isValidAsset(t){let e=Math.sign(t.decimals);return!!t.symbol&&(e===0||e===1)}};var T=require("rxjs");var z=class extends k{constructor(t){super(t)}async getBalance(t,e){return e===0?this.getSystemBalance(t):this.getTokenBalanceData(t,e)}async getSystemBalance(t){let e=this.api.query.System.Account,{data:n}=await e.getValue(t);return this.calculateBalance(n)}async getTokenBalance(t,e){let r=await this.api.query.Tokens.Accounts.getValue(t,e);return this.calculateBalance(r)}calculateBalance(t){let e=t.free>=t.frozen?t.free-t.frozen:0n,n=t.free+t.reserved;return{free:t.free,reserved:t.reserved,frozen:t.frozen,total:n,transferable:e}}async getErc20Balance(t,e){return this.getTokenBalanceData(t,e)}subscribeBalance(t){let e=this.subscribeSystemBalance(t),n=this.subscribeTokensBalance(t),r=this.subscribeErc20Balance(t);return(0,T.combineLatest)([e,n,r]).pipe((0,T.debounceTime)(250),(0,T.map)(a=>a.flat()),(0,T.startWith)([]),(0,T.bufferCount)(2,1),(0,T.map)(([a,i],s)=>{if(s===0)return i;let o=a.reduce((c,m)=>(c.set(m.id,m.balance),c),new Map);return i.filter(c=>!_n(c.balance,o.get(c.id)))}))}subscribeSystemBalance(t){return this.api.query.System.Account.watchValue(t,"best").pipe((0,T.map)(n=>({id:0,balance:this.calculateBalance(n.data)})))}subscribeTokenBalance(t,e){return this.api.query.Tokens.Accounts.watchValue(t,e,"best").pipe((0,T.map)(r=>({id:e,balance:r})))}subscribeTokensBalance(t){return this.api.query.Tokens.Accounts.watchEntries(t,{at:"best"}).pipe((0,T.distinctUntilChanged)((n,r)=>!r.deltas),(0,T.map)(({deltas:n})=>{let r=[];return n?.deleted.forEach(a=>{let[i,s]=a.args;r.push({id:s,balance:this.calculateBalance({free:0n,reserved:0n,frozen:0n})})}),n?.upserted.forEach(a=>{let[i,s]=a.args;r.push({id:s,balance:this.calculateBalance(a.value)})}),r}))}subscribeErc20Balance(t,e){let n=new T.Subject,r=n.pipe((0,T.shareReplay)(1)),a=async()=>(await this.api.query.AssetRegistry.Assets.getEntries()).filter(({value:l})=>{let{asset_type:c}=l;return c.type==="Erc20"}).map(({keyArgs:l})=>{let[c]=l;return c}),i=async()=>{let o=e||await a(),l=async()=>{let d=(await Promise.all(o.map(async p=>{let g=await this.getTokenBalanceData(t,p);return[p,g]}))).map(([p,g])=>({id:p,balance:g}));n.next(d)};await l();let c=this.api.query.System.Number.watchValue("best").subscribe(l);return()=>c.unsubscribe()},s;return i().then(o=>s=o),r.pipe((0,T.finalize)(()=>s?.()),(0,T.pairwise)(),(0,T.map)(([o,l],c)=>{if(c===0)return l;let m=o.reduce((p,g)=>(p.set(g.id,g.balance),p),new Map);return l.filter(p=>!_n(p.balance,m.get(p.id)))}),(0,T.distinctUntilChanged)((o,l)=>l.length===0))}async getTokenBalanceData(t,e){let n=await this.api.apis.CurrenciesApi.account(e,t);return this.calculateBalance(n)}},_n=(u,t)=>u!==void 0&&t!==void 0&&u.transferable===t.transferable&&u.total===t.total;var St=class extends k{_minOrderBudget;_blockTime;constructor(t){super(t)}async getBlockTime(){if(this._blockTime===void 0){let t=await this.api.constants.Aura.SlotDuration();this._blockTime=Number(t)}return this._blockTime}async getMinOrderBudget(){return this._minOrderBudget===void 0&&(this._minOrderBudget=await this.api.constants.DCA.MinBudgetInNativeCurrency()),this._minOrderBudget}};var He={};x(He,{AssetNotFound:()=>Ue,PoolNotFound:()=>qt,RouteNotFound:()=>Nt});var Ue=class extends Error{constructor(t){super(),this.message=`${t} not found`,this.name="AssetNotFound"}},qt=class extends Error{constructor(t){super(),this.message=`${t} pool invalid`,this.name="PoolNotFound"}},Nt=class extends Error{constructor(t,e){super(),this.message=`Route from ${t} to ${e} not found in current configuration`,this.name="RouteNotFound"}};var We={};x(We,{EvmClient:()=>Gt,createChain:()=>Ve});var Rn=require("viem"),Cr=["https://hydration-rpc.n.dwellir.com","https://hydration.dotters.network","https://rpc.helikon.io/hydradx","https://hydration.ibp.network","https://rpc.cay.hydration.cloud","https://rpc.parm.hydration.cloud","https://rpc.roach.hydration.cloud","https://rpc.zipp.hydration.cloud","https://rpc.sin.hydration.cloud","https://rpc.coke.hydration.cloud"],Ve=()=>(0,Rn.defineChain)({id:222222,name:"Hydration",network:"hydration",nativeCurrency:{decimals:18,name:"WETH",symbol:"WETH"},rpcUrls:{default:{http:Cr}},blockExplorers:{default:{name:"Hydration Explorer",url:"https://hydration.subscan.io"}},testnet:!1});var j=require("viem");var Gt=class{client;chain;constructor(t){this.client=t,this.chain=Ve()}get chainId(){return this.chain.id}get chainCurrency(){return this.chain.nativeCurrency.symbol}get chainDecimals(){return this.chain.nativeCurrency.decimals}getProvider(){return(0,j.createPublicClient)({chain:this.chain,transport:(0,j.http)()})}getWsProvider(){return(0,j.createPublicClient)({transport:(0,j.custom)({request:({method:t,params:e})=>this.client._request(t,e||[])})})}getSigner(t){return(0,j.createWalletClient)({account:t,chain:this.chain,transport:(0,j.custom)(window.ethereum)})}};var ze={};x(ze,{LiquidityMiningApi:()=>Ut,LiquidityMiningClient:()=>Ht});var Cn=require("polkadot-api"),M=et(require("big.js")),Ke=require("@galacticcouncil/math-liquidity-mining");var ge=class{result=new Map;getKey(t,e){return[e,t.toString()].join(",")}constructor(t,e){for(let n=0;n<t.length;++n){let[r,a]=t[n];this.result.set(this.getKey(a,r),e[n].free)}}freeBalance(t,e){return this.result.get(this.getKey(t,e))??0n}transfer(t,e,n,r){let a=this.getKey(t,e),i=this.getKey(t,n),s=this.result.get(a)??0n,o=this.result.get(i)??0n;if(s<r)throw new Error("Attempting to transfer more than is present");this.result.set(a,s+r),this.result.set(i,o+r)}};var at=et(require("big.js")),Y=require("@galacticcouncil/math-liquidity-mining");var Ye=et(require("big.js")),Xe=(0,Ye.default)(10).pow(18),Fn=BigInt((0,Ye.default)(1).pow(18).toString()),En=6e3;var kr="1000000000000000000",be=class{constructor(t,e,n){this.getAccount=t;this.getAsset=e;this.multiCurrency=n}async syncGlobalFarm(t,e,n){if(t.state.type!=="Active"||t.updated_at===e)return null;if(t.total_shares_z===0n)return t;let r=await this.getAsset(t.reward_currency),a=e-t.updated_at,i=this.getAccount(t.id),s=r?.existential_deposit;if(!s)throw new Error("Missing reward currency asset list");let o=this.multiCurrency.freeBalance(t.reward_currency,i),l=(0,at.default)(s.toString()),c=(0,at.default)(o.toString()).minus(l.lt(o.toString())?s.toString():o.toString()),m=(0,at.default)((0,Y.calculate_global_farm_rewards)(t.total_shares_z.toString(),n.toString(),(0,at.default)(t.yield_per_period.toString()).mul(Xe).round(0,at.default.roundDown).toFixed(),t.max_reward_per_period.toString(),a.toFixed()));if(c.lt(m)&&(m=c),m.eq(0))return t;let d=this.getAccount(0);return this.multiCurrency.transfer(t.reward_currency,i,d,BigInt(m.toFixed())),{...t,accumulated_rpz:BigInt((0,Y.calculate_accumulated_rps)(t.accumulated_rpz.toString(),t.total_shares_z.toString(),m.toFixed()))}}syncYieldFarm(t,e,n){if(t.state.type!=="Active"||t.updated_at===n)return null;if(t.total_valued_shares===0n)return{...t,updated_at:n};let r=(0,Y.calculate_yield_farm_delta_rpvs)(t.accumulated_rpz.toString(),e.accumulated_rpz.toString(),t.multiplier.toString(),t.total_valued_shares.toString());return{...t,accumulated_rpvs:t.accumulated_rpvs+BigInt(r),updated_at:n}}getLoyaltyMultiplier(t,e){let n=(0,at.default)(1).mul(Xe).round(0,at.default.roundDown).toString();if(!e)return n;let{initial_reward_percentage:r,scale_coef:a}=e;return(0,Y.calculate_loyalty_multiplier)(t.toFixed(),r.toString(),a.toFixed())}async claimRewards(t,e,n,r,a){if(e.state.type==="Terminated")return null;let i=Math.floor(r/t.blocks_per_period);if(n.updated_at===i)return null;let s=await this.syncGlobalFarm(t,i,a);if(!s)return null;let o=this.syncYieldFarm(e,s,i);if(!o)return null;let l=o.total_stopped-n.stopped_at_creation,c=o.updated_at-n.entered_at-l,m=this.getLoyaltyMultiplier(c,o.loyalty_curve),d=BigInt((0,Y.calculate_user_reward)(n.accumulated_rpvs.toString(),n.valued_shares.toString(),n.accumulated_claimed_rewards.toString(),o.accumulated_rpvs.toString(),m)),p=BigInt((0,Y.calculate_user_reward)(n.accumulated_rpvs.toString(),n.valued_shares.toString(),n.accumulated_claimed_rewards.toString(),o.accumulated_rpvs.toString(),kr));return{reward:d,maxReward:p,assetId:s.reward_currency}}};var Dr=(0,M.default)(365.2425).times(24).times(60).times(60),Ut=class{client;balanceClient;options;constructor(t,e,n={}){this.client=t,this.balanceClient=e,this.options=Object.freeze({blockTime:n.blockTime??En})}get blockTime(){return this.options.blockTime}async getOraclePrice(t,e){let n=[t,e].sort((a,i)=>a-i);if(t===e)return Fn;let r=await this.client.getOraclePrice(n);if(r){let{n:a,d:i}=r[0].price,s;return t<e?s=(0,Ke.fixed_from_rational)(a.toString(),i.toString()):s=(0,Ke.fixed_from_rational)(i.toString(),a.toString()),BigInt(s)}}getFarmAddress=(t,e)=>{let n=Buffer.from("modl","utf-8"),r=Buffer.from(e?"78796b4c4d704944":"4f6d6e6957684c4d","hex"),a=Buffer.from([t]),i=Buffer.concat([n,r,a]),o="0x"+Buffer.concat([i,Buffer.alloc(32-i.length)]).toString("hex");return(0,Cn.AccountId)(63).dec(o)};getGlobalRewardPerPeriod(t,e,n,r){let a=(0,M.default)(r).times(t.toString()).times(e.toString()).div(18);return a.gte(n.toString())?n.toString():a.toString()}getPoolYieldPerPeriod(t,e,n,r){let a=(0,M.default)(t.toString()).times(e),i=(0,M.default)(n.toString()).times(r);return a.div(i.toString()).toString()}farmData(t,e,n){let{yieldFarm:r,globalFarm:a,priceAdjustment:i,balance:s,id:o}=t,{multiplier:l,loyalty_curve:c}=r,{blocks_per_period:m,yield_per_period:d,total_shares_z:p,max_reward_per_period:g,pending_rewards:y,accumulated_paid_rewards:b,planned_yielding_periods:P,updated_at:f,incentivized_asset:S,reward_currency:v,price_adjustment:N}=a,G=O.shiftNeg(i??N,18),D=O.shiftNeg(l,18),V=O.shiftNeg(c?.initial_reward_percentage??0,18),ot=Dr.div((0,M.default)(this.blockTime).div(1e3).times(m)).toString(),W;if(p<=0)W=(0,M.default)(D).times(d.toString()).times(ot).toString();else{let ar=this.getGlobalRewardPerPeriod(p,d,g,G),sr=this.getPoolYieldPerPeriod(ar,D,p,G);W=(0,M.default)(sr).times(ot).toString()}let tt=y+b,Ft=g*BigInt(P),Et=s.transferable+tt,oe=Et-tt,dn=(0,M.default)(oe.toString()).div(g.toString()),gn=(0,M.default)(e).div(m.toString()).toString(),bn=(p>=0?dn.plus(f):dn.plus(gn)).toString(),er=(0,M.default)(bn).times(m).toString(),nr=(0,M.default)(p.toString()).div((0,M.default)(g.toString()).div(d.toString())).div(Math.pow(10,18)).times(100).times(G).toFixed(2),yn=(0,M.default)(tt.toString()).div(Et.toString()).gte(.999);W=yn?"0":(0,M.default)(W).div(n?2:1).times(100).toString();let rr=V?(0,M.default)(W).times(V).toString():void 0;return{apr:W,minApr:rr,isDistributed:yn,estimatedEndPeriod:bn,estimatedEndBlock:er,maxRewards:Ft,incentivizedAsset:S,rewardCurrency:v,loyaltyCurve:c,currentPeriod:gn,potMaxRewards:Et,fullness:nr,yieldFarmId:r.id,globalFarmId:a.id,poolId:o,distributedRewards:tt,plannedYieldingPeriods:P}}async getAllOmnipoolFarms(){let e=(await this.client.getAllOmnipooFarms()).reduce((r,a)=>r.includes(a.keyArgs[0].toString())?r:[...r,a.keyArgs[0].toString()],[]),n=await Promise.all(e.map(async r=>{let a=await this.getOmnipoolFarms(r);if(a)return[r,a]}));return Object.fromEntries(n.filter(r=>!!r))}async getOmnipoolFarms(t){let e=await this.client.getOmnipooFarms(Number(t)),n=await this.client.getRelayBlockNumber(),r=await Promise.all(e.map(async({keyArgs:a,value:i})=>{let[,s]=a,o=i,l=await this.client.getOmnipoolGlobalFarm(s),c=await this.client.getOmnipoolYieldFarm(Number(t),s,o);if(!l||!c)return;let m=l.reward_currency,d=l.incentivized_asset,p=this.getFarmAddress(s),g=await this.getOraclePrice(m,d),y=await this.balanceClient.getBalance(p,m);return{id:t,globalFarm:l,yieldFarm:c,priceAdjustment:g,balance:y}}));return n?r.map(a=>a?this.farmData(a,n):void 0):[]}async getAllIsolatedFarms(){let e=(await this.client.getAllIsolatedFarms()).reduce((r,a)=>r.includes(a.keyArgs[0].toString())?r:[...r,a.keyArgs[0].toString()],[]),n=await Promise.all(e.map(async r=>{let a=await this.getIsolatedFarms(r);if(a)return[r,a]}));return Object.fromEntries(n.filter(r=>!!r))}async getIsolatedFarms(t){let e=await this.client.getIsolatedFarms(t),n=await this.client.getRelayBlockNumber(),r=await Promise.all(e.map(async({keyArgs:a,value:i})=>{let[,s]=a,o=i,l=await this.client.getIsolatedGlobalFarm(s),c=await this.client.getIsolatedYieldFarm(t,s,o);if(!l||!c)return;let m=l.reward_currency,d=l.incentivized_asset,p=this.getFarmAddress(s,!0),g=await this.getOraclePrice(m,d),y=await this.balanceClient.getBalance(p,m);return{id:t,globalFarm:l,yieldFarm:c,priceAdjustment:g,balance:y,farmAddress:p}}));return n?r.map(a=>a?this.farmData(a,n,!0):void 0):[]}async getDepositReward(t,e,n,r){let a=e.global_farm_id,i=e.yield_farm_id,s=n?await this.client.getIsolatedYieldFarm(t,a,i):await this.client.getOmnipoolYieldFarm(Number(t),a,i),o=n?await this.client.getIsolatedGlobalFarm(a):await this.client.getOmnipoolGlobalFarm(a);if(!o||!s)return;let l=o.reward_currency,c=o.incentivized_asset,m=[[this.getFarmAddress(0,n),o.reward_currency],[this.getFarmAddress(o.id,n),o.reward_currency]],d=await this.getAccountAssetBalances(m),p=await this.getOraclePrice(l,c),g=new ge(m,d),b=await new be(f=>this.getFarmAddress(f),f=>this.client.getAsset(f),g).claimRewards(o,s,e,r,p??o.price_adjustment);if(!b)return;let P=await this.client.getAsset(b.assetId);if(P&&!(b.reward<=P.existential_deposit))return b}async getAccountAssetBalances(t){let[e,n]=await Promise.all([Promise.all(t.filter(([a,i])=>i!==0).map(([a,i])=>this.balanceClient.getTokenBalance(a,i))),Promise.all(t.filter(([a,i])=>i===0).map(([a])=>this.balanceClient.getSystemBalance(a)))]),r=[];for(let a=0,i=0;a+i<t.length;){let s=a+i,[,o]=t[s];o===0?(r.push(n[i]),i+=1):(r.push(e[a]),a+=1)}return r}};var ye=require("polkadot-api"),Ht=class extends k{omnipoolAssetIds=[];async getOraclePrice(t){return await this.api.query.EmaOracle.Oracles.getValue(ye.Binary.fromText("omnipool"),t,(0,ye.Enum)("TenMinutes"))}async getRelayBlockNumber(){return(await this.api.query.ParachainSystem.ValidationData.getValue())?.relay_parent_number}async getAllOmnipooFarms(){return this.api.query.OmnipoolWarehouseLM.ActiveYieldFarm.getEntries()}async getOmnipooFarms(t){return this.api.query.OmnipoolWarehouseLM.ActiveYieldFarm.getEntries(t)}async getOmnipoolGlobalFarm(t){return this.api.query.OmnipoolWarehouseLM.GlobalFarm.getValue(t)}async getOmnipoolYieldFarm(t,e,n){return this.api.query.OmnipoolWarehouseLM.YieldFarm.getValue(t,e,n)}async getAllIsolatedFarms(){return this.api.query.XYKWarehouseLM.ActiveYieldFarm.getEntries()}async getIsolatedFarms(t){return this.api.query.XYKWarehouseLM.ActiveYieldFarm.getEntries(t)}async getIsolatedGlobalFarm(t){return this.api.query.XYKWarehouseLM.GlobalFarm.getValue(t)}async getIsolatedYieldFarm(t,e,n){return this.api.query.XYKWarehouseLM.YieldFarm.getValue(t,e,n)}async getAsset(t){return this.api.query.AssetRegistry.Assets.getValue(t)}};var en={};x(en,{PoolContextProvider:()=>vt,PoolError:()=>ut,PoolFactory:()=>It,PoolType:()=>E,aave:()=>tn,lbp:()=>$e,omni:()=>Qe,stable:()=>Je,xyk:()=>Ze});var $e={};x($e,{LbpMath:()=>X,LbpPool:()=>Vt,LbpPoolClient:()=>Yt});var $=require("@galacticcouncil/math-lbp"),X=class{static getSpotPrice(t,e,n,r,a){return(0,$.get_spot_price)(t,e,n,r,a)}static calculateInGivenOut(t,e,n,r,a){return(0,$.calculate_in_given_out)(t,e,n,r,a)}static calculateOutGivenIn(t,e,n,r,a){return(0,$.calculate_out_given_in)(t,e,n,r,a)}static calculateLinearWeights(t,e,n,r,a){return(0,$.calculate_linear_weights)(t,e,n,r,a)}static calculatePoolTradeFee(t,e,n){return(0,$.calculate_pool_trade_fee)(t,e,n)}};var E=(a=>(a.Aave="Aave",a.LBP="LBP",a.Omni="Omnipool",a.Stable="Stableswap",a.XYK="XYK",a))(E||{}),ut=(a=>(a.InsufficientTradingAmount="InsufficientTradingAmount",a.MaxInRatioExceeded="MaxInRatioExceeded",a.MaxOutRatioExceeded="MaxOutRatioExceeded",a.TradeNotAllowed="TradeNotAllowed",a.UnknownError="UnknownError",a))(ut||{});var{FeeUtils:kn}=O,Vt=class u{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;fee;repayFeeApply;static fromPool(t){return new u(t.address,t.tokens,t.maxInRatio,t.maxOutRatio,t.minTradingLimit,t.fee,t.repayFeeApply)}constructor(t,e,n,r,a,i,s){this.type="LBP",this.address=t,this.tokens=e,this.maxInRatio=n,this.maxOutRatio=r,this.minTradingLimit=a,this.fee=i,this.repayFeeApply=s}validatePair(t,e){return!0}parsePair(t,e){let n=new Map(this.tokens.map(i=>[i.id,i])),r=n.get(t),a=n.get(e);if(r==null)throw new Error("Pool does not contain tokenIn");if(a==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,balanceIn:r.balance,balanceOut:a.balance,decimalsIn:r.decimals,decimalsOut:a.decimals,weightIn:r.weight,weightOut:a.weight}}validateAndBuy(t,e,n){let r=this.tokens[0].id,a=[];e<this.minTradingLimit&&a.push("InsufficientTradingAmount");let i=t.balanceOut/this.maxOutRatio;if(e>i&&a.push("MaxOutRatioExceeded"),r===t.assetOut){let s=this.calculateTradeFee(e,n),o=kn.toPct(this.repayFeeApply?n.repayFee:n.exchangeFee),l=e+s,c=this.calculateInGivenOut(t,l),m=t.balanceIn/this.maxInRatio;return c>m&&a.push("MaxInRatioExceeded"),{amountIn:c,calculatedIn:c,amountOut:e,feePct:o,errors:a}}else{let s=this.calculateInGivenOut(t,e),o=t.balanceIn/this.maxInRatio;return s>o&&a.push("MaxInRatioExceeded"),{amountIn:s,calculatedIn:s,amountOut:e,feePct:0,errors:a}}}validateAndSell(t,e,n){let r=this.tokens[0].id,a=[];e<this.minTradingLimit&&a.push("InsufficientTradingAmount");let i=t.balanceIn/this.maxInRatio;if(e>i&&a.push("MaxInRatioExceeded"),r===t.assetIn){let s=this.calculateOutGivenIn(t,e),o=t.balanceOut/this.maxOutRatio;return s>o&&a.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:s,amountOut:s,feePct:0,errors:a}}else{let s=this.calculateOutGivenIn(t,e),o=this.calculateTradeFee(s,n),l=kn.toPct(this.repayFeeApply?n.repayFee:n.exchangeFee),c=s-o,m=t.balanceOut/this.maxOutRatio;return c>m&&a.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:s,amountOut:c,feePct:l,errors:a}}}calculateInGivenOut(t,e){let n=X.calculateInGivenOut(t.balanceIn.toString(),t.balanceOut.toString(),t.weightIn.toString(),t.weightOut.toString(),e.toString()),r=BigInt(n);return r<0n?0n:r}calculateOutGivenIn(t,e){let n=X.calculateOutGivenIn(t.balanceIn.toString(),t.balanceOut.toString(),t.weightIn.toString(),t.weightOut.toString(),e.toString()),r=BigInt(n);return r<0n?0n:r}spotPriceInGivenOut(t){let e=X.getSpotPrice(t.balanceOut.toString(),t.balanceIn.toString(),t.weightOut.toString(),t.weightIn.toString(),this.maxOutRatio.toString());return BigInt(e)}spotPriceOutGivenIn(t){let e=X.getSpotPrice(t.balanceIn.toString(),t.balanceOut.toString(),t.weightIn.toString(),t.weightOut.toString(),this.maxInRatio.toString());return BigInt(e)}calculateTradeFee(t,e){let n=X.calculatePoolTradeFee(t.toString(),this.repayFeeApply?e.repayFee[0]:e.exchangeFee[0],this.repayFeeApply?e.repayFee[1]:e.exchangeFee[1]);return BigInt(n)}};var Mn=require("polkadot-api"),mt=require("rxjs");var Dn=(u,t=new Map)=>e=>{let n;return t.has(e)?t.get(e):(t.set(e,n=u(e)),n)};var I=require("rxjs");var je=[{inputs:[],name:"decimals",outputs:[{internalType:"uint8",name:"",type:"uint8"}],stateMutability:"view",type:"function"},{inputs:[],name:"description",outputs:[{internalType:"string",name:"",type:"string"}],stateMutability:"view",type:"function"},{inputs:[],name:"version",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"uint80",name:"_roundId",type:"uint80"}],name:"getRoundData",outputs:[{internalType:"uint80",name:"roundId",type:"uint80"},{internalType:"int256",name:"answer",type:"int256"},{internalType:"uint256",name:"startedAt",type:"uint256"},{internalType:"uint256",name:"updatedAt",type:"uint256"},{internalType:"uint80",name:"answeredInRound",type:"uint80"}],stateMutability:"view",type:"function"},{inputs:[],name:"latestRoundData",outputs:[{internalType:"uint80",name:"roundId",type:"uint80"},{internalType:"int256",name:"answer",type:"int256"},{internalType:"uint256",name:"startedAt",type:"uint256"},{internalType:"uint256",name:"updatedAt",type:"uint256"},{internalType:"uint80",name:"answeredInRound",type:"uint80"}],stateMutability:"view",type:"function"}];var Wt=class{client;constructor(t){this.client=t.getWsProvider()}async getData(t,e=6){let[n,r,a]=await Promise.all([this.client.readContract({abi:je,address:t,functionName:"latestRoundData"}),this.client.readContract({abi:je,address:t,functionName:"decimals"}),this.client.getBlock()]),[i,s,o,l]=n,c=a.number-(a.timestamp-l)/BigInt(e),m=Number(c);return{price:s,decimals:r,updatedAt:m<0?0:m}}};var U=class extends z{evm;mmOracle;override=[];mem=0;memPools=Dn(t=>(this.log(this.getPoolType(),"mem pools",t,"\u2705"),this.loadPools()));constructor(t,e){super(t),this.evm=e,this.mmOracle=new Wt(e)}async withOverride(t){this.override=t||[]}async getPoolsMem(){return this.memPools(this.mem)}async getPools(){let t=(0,I.from)(this.getPoolsMem()).pipe((0,I.switchMap)(e=>this.subscribe(e)),(0,I.combineLatestAll)());return(0,I.firstValueFrom)(t)}getSubscriber(){return(0,I.from)(this.getPoolsMem()).pipe((0,I.switchMap)(t=>this.subscribe(t)),(0,I.mergeAll)())}subscribe(t){return t.filter(e=>this.hasValidAssets(e)).map(e=>(0,I.combineLatest)([this.subscribePoolChange(e),this.subscribePoolBalance(e)]).pipe((0,I.debounceTime)(250),(0,I.map)(([n,r])=>this.updatePool(n,r))))}subscribePoolBalance(t){if(t.type==="Aave")return(0,I.of)([]);let e=[this.subscribeTokensBalance(t.address)];if(this.hasSystemAsset(t)){let n=this.subscribeSystemBalance(t.address);e.push(n)}if(this.hasErc20Asset(t)){let n=t.tokens.filter(a=>a.type==="Erc20").map(a=>a.id),r=this.subscribeErc20Balance(t.address,n);e.push(r)}return(0,I.combineLatest)(e).pipe((0,I.map)(n=>n.map(r=>Array.isArray(r)?r:[r]).flat()))}hasSystemAsset(t){return t.tokens.some(e=>e.id===0)}hasErc20Asset(t){return t.tokens.some(e=>e.type==="Erc20")}hasValidAssets(t){return t.tokens.every(({id:e,decimals:n,balance:r})=>{let a=this.override.find(s=>s.id===e),i=!!n||!!a?.decimals;return r>0n&&i})}updatePool=(t,e)=>{let n=t.tokens.map(r=>{let a=e.find(s=>s.id===r.id),i=this.override.find(s=>s.id===r.id);return a?{...r,balance:a.balance.transferable,decimals:r.decimals||i?.decimals}:{...r,decimals:r.decimals||i?.decimals}});return{...t,tokens:n}}};var Yt=class extends U{MAX_FINAL_WEIGHT=100000000n;poolsData=new Map([]);async loadPools(){let[t,e,n]=await Promise.all([this.api.query.LBP.PoolData.getEntries(),this.api.query.ParachainSystem.ValidationData.getValue(),this.getPoolLimits()]),r=e?.relay_parent_number||0,a=t.filter(({value:i})=>e&&this.isActivePool(i,r)).map(async({keyArgs:i,value:s})=>{let[o]=i,l=o.toString(),c=await this.getPoolDelta(l,s,r);return{address:l,type:"LBP",fee:s.fee,...c,...n}});return Promise.all(a)}async getPoolDelta(t,e,n){let{start:r,end:a,assets:i,initial_weight:s,final_weight:o,repay_target:l,fee_collector:c}=e,m=X.calculateLinearWeights(r?r.toString():"0",a?a.toString():"0",s.toString(),o.toString(),n.toString()),[d,p]=i,g=BigInt(m),y=this.MAX_FINAL_WEIGHT-BigInt(g),[b,P,f,S,v]=await Promise.all([this.isRepayFeeApplied(d,l,c.toString()),this.getBalance(t,d),this.api.query.AssetRegistry.Assets.getValue(d),this.getBalance(t,p),this.api.query.AssetRegistry.Assets.getValue(p)]);return{repayFeeApply:b,tokens:[{id:d,decimals:f?.decimals,existentialDeposit:f?.existential_deposit,balance:P.transferable,weight:g,type:f?.asset_type.type},{id:p,decimals:v?.decimals,existentialDeposit:v?.existential_deposit,balance:S.transferable,weight:y,type:v?.asset_type.type}]}}isActivePool(t,e){let{start:n,end:r}=t;return n&&r?e>=n&&e<r:!1}async isRepayFeeApplied(t,e,n){if(e===0n)return!1;try{return(await this.getBalance(n,t)).transferable<e}catch{return!0}}async getRepayFee(){return await this.api.constants.LBP.repay_fee()}async getPoolLimits(){let[t,e,n]=await Promise.all([this.api.constants.LBP.MaxInRatio(),this.api.constants.LBP.MaxOutRatio(),this.api.constants.LBP.MinTradingLimit()]);return{maxInRatio:t,maxOutRatio:e,minTradingLimit:n}}async getPoolFees(t){return{repayFee:await this.getRepayFee(),exchangeFee:t.fee}}getPoolType(){return"LBP"}async isSupported(){let t=this.api.query.LBP.PoolData,e=await this.api.compatibilityToken;return t.isCompatible(Mn.CompatibilityLevel.BackwardsCompatible,e)}subscribePoolChange(t){let e=this.api.query.ParachainSystem.ValidationData,n=this.poolsData.get(t.address);return n?e.watchValue("best").pipe((0,mt.switchMap)(r=>r?this.getPoolDelta(t.address,n,r.relay_parent_number):(0,mt.of)(t)),(0,mt.map)(r=>Object.assign({},t,r))):(0,mt.of)(t)}};var Qe={};x(Qe,{OmniMath:()=>B,OmniPool:()=>Xt,OmniPoolClient:()=>zt});var w=require("@galacticcouncil/math-omnipool"),pt=et(require("big.js")),B=class{static calculateSpotPrice(t,e,n,r){return(0,w.calculate_spot_price)(t,e,n,r)}static calculateLrnaSpotPrice(t,e){return(0,w.calculate_lrna_spot_price)(t,e)}static calculateInGivenOut(t,e,n,r,a,i,s,o,l){return(0,w.calculate_in_given_out)(t,e,n,r,a,i,s,o,l)}static calculateLrnaInGivenOut(t,e,n,r,a){return(0,w.calculate_lrna_in_given_out)(t,e,n,r,a)}static calculateOutGivenIn(t,e,n,r,a,i,s,o,l){return(0,w.calculate_out_given_in)(t,e,n,r,a,i,s,o,l)}static calculateOutGivenLrnaIn(t,e,n,r,a){return(0,w.calculate_out_given_lrna_in)(t,e,n,r,a)}static calculateShares(t,e,n,r){return(0,w.calculate_shares)(t,e,n,r)}static calculateLiquidityOut(t,e,n,r,a,i,s,o){return(0,w.calculate_liquidity_out)(t,e,n,r,a,i,s,o)}static calculateLiquidityLRNAOut(t,e,n,r,a,i,s,o){return(0,w.calculate_liquidity_lrna_out)(t,e,n,r,a,i,s,o)}static calculateCapDifference(t,e,n,r){let a=(0,pt.default)(e),i=(0,pt.default)(t),s=(0,pt.default)(r),o=(0,pt.default)(n),l=(0,pt.default)(10).pow(18),c=o.div(l);if(a.div(s).lt(c)){let d=c.times(s).minus(a).times(i),p=a.times((0,pt.default)(1).minus(c));return d.div(p).toFixed(0)}else return"0"}static verifyAssetCap(t,e,n,r){return(0,w.verify_asset_cap)(t,e,n,r)}static calculateLimitHubIn(t,e,n,r){return(0,w.calculate_liquidity_hub_in)(t,e,n,r)}static isSellAllowed(t){return(0,w.is_sell_allowed)(t)}static isBuyAllowed(t){return(0,w.is_buy_allowed)(t)}static isAddLiquidityAllowed(t){return(0,w.is_add_liquidity_allowed)(t)}static isRemoveLiquidityAllowed(t){return(0,w.is_remove_liquidity_allowed)(t)}};var{FeeUtils:wt}=O,Xt=class u{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;hubAssetId;static fromPool(t){return new u(t.address,t.tokens,t.maxInRatio,t.maxOutRatio,t.minTradingLimit,t.hubAssetId)}constructor(t,e,n,r,a,i){this.type="Omnipool",this.address=t,this.tokens=e,this.maxInRatio=n,this.maxOutRatio=r,this.minTradingLimit=a,this.hubAssetId=i}validatePair(t,e){return this.hubAssetId!=e}parsePair(t,e){let n=new Map(this.tokens.map(i=>[i.id,i])),r=n.get(t),a=n.get(e);if(r==null)throw new Error("Pool does not contain tokenIn");if(a==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,hubReservesIn:r.hubReserves,hubReservesOut:a.hubReserves,sharesIn:r.shares,sharesOut:a.shares,decimalsIn:r.decimals,decimalsOut:a.decimals,balanceIn:r.balance,balanceOut:a.balance,tradeableIn:r.tradeable,tradeableOut:a.tradeable,assetInEd:r.existentialDeposit,assetOutEd:a.existentialDeposit}}validateAndBuy(t,e,n){let r=this.calculateInGivenOut(t,e),a=this.calculateInGivenOut(t,e,n),i=r===0n?0:A.calculateDiffToRef(a,r),s=[],o=B.isSellAllowed(t.tradeableIn),l=B.isBuyAllowed(t.tradeableOut);(!o||!l)&&s.push("TradeNotAllowed"),(e<this.minTradingLimit||r<t.assetInEd)&&s.push("InsufficientTradingAmount");let c=t.balanceOut/this.maxOutRatio;e>c&&s.push("MaxOutRatioExceeded");let m=t.balanceIn/this.maxInRatio;return a>m&&s.push("MaxInRatioExceeded"),{amountIn:a,calculatedIn:r,amountOut:e,feePct:i,errors:s}}validateAndSell(t,e,n){let r=this.calculateOutGivenIn(t,e),a=this.calculateOutGivenIn(t,e,n),i=A.calculateDiffToRef(r,a),s=[],o=B.isSellAllowed(t.tradeableIn),l=B.isBuyAllowed(t.tradeableOut);(!o||!l)&&s.push("TradeNotAllowed"),(e<this.minTradingLimit||r<t.assetOutEd)&&s.push("InsufficientTradingAmount");let c=t.balanceIn/this.maxInRatio;e>c&&s.push("MaxInRatioExceeded");let m=t.balanceOut/this.maxOutRatio;return a>m&&s.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:r,amountOut:a,feePct:i,errors:s}}calculateInGivenOut(t,e,n){if(t.assetIn==this.hubAssetId)return this.calculateLrnaInGivenOut(t,e,n);let r=B.calculateInGivenOut(t.balanceIn.toString(),t.hubReservesIn.toString(),t.sharesIn.toString(),t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),n?wt.toRaw(n.assetFee).toString():"0",n?wt.toRaw(n.protocolFee).toString():"0"),a=BigInt(r);return a<0n?0n:a}calculateLrnaInGivenOut(t,e,n){let r=B.calculateLrnaInGivenOut(t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),n?wt.toRaw(n.assetFee).toString():"0"),a=BigInt(r);return a<0n?0n:a}calculateOutGivenIn(t,e,n){if(t.assetIn==this.hubAssetId)return this.calculateOutGivenLrnaIn(t,e,n);let r=B.calculateOutGivenIn(t.balanceIn.toString(),t.hubReservesIn.toString(),t.sharesIn.toString(),t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),n?wt.toRaw(n.assetFee).toString():"0",n?wt.toRaw(n.protocolFee).toString():"0"),a=BigInt(r);return a<0n?0n:a}calculateOutGivenLrnaIn(t,e,n){let r=B.calculateOutGivenLrnaIn(t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),n?wt.toRaw(n.assetFee).toString():"0"),a=BigInt(r);return a<0n?0n:a}spotPriceInGivenOut(t){if(t.assetIn==this.hubAssetId)return this.spotPriceLrnaInGivenOut(t);let e=B.calculateSpotPrice(t.balanceOut.toString(),t.hubReservesOut.toString(),t.balanceIn.toString(),t.hubReservesIn.toString()),n=Math.pow(10,18-t.decimalsOut);return BigInt(e)/BigInt(n)}spotPriceLrnaInGivenOut(t){let e=B.calculateLrnaSpotPrice(t.hubReservesOut.toString(),t.balanceOut.toString()),n=Math.pow(10,18-t.decimalsOut);return BigInt(e)/BigInt(n)}spotPriceOutGivenIn(t){if(t.assetIn==this.hubAssetId)return this.spotPriceOutGivenLrnaIn(t);let e=B.calculateSpotPrice(t.balanceIn.toString(),t.hubReservesIn.toString(),t.balanceOut.toString(),t.hubReservesOut.toString()),n=Math.pow(10,18-t.decimalsIn);return BigInt(e)/BigInt(n)}spotPriceOutGivenLrnaIn(t){let e=B.calculateLrnaSpotPrice(t.balanceOut.toString(),t.hubReservesOut.toString()),n=Math.pow(10,18-t.decimalsIn);return BigInt(e)/BigInt(n)}};var he=require("polkadot-api"),Ln=require("@polkadot-api/utils"),Kt=require("rxjs");var{FeeUtils:st}=O,zt=class extends U{async loadPools(){let t=await this.api.constants.Omnipool.HubAssetId(),e=this.getPoolAddress(),[n,r,a,i,s]=await Promise.all([this.api.query.Omnipool.Assets.getEntries(),this.api.query.Omnipool.HubAssetTradability.getValue(),this.api.query.AssetRegistry.Assets.getValue(t),this.getBalance(e,t),this.getPoolLimits()]),o=n.map(async({keyArgs:c,value:m})=>{let[d]=c,{hub_reserve:p,shares:g,tradable:y,cap:b,protocol_shares:P}=m,[f,S]=await Promise.all([this.api.query.AssetRegistry.Assets.getValue(d),this.getBalance(e,d)]);return{id:d,decimals:f?.decimals,existentialDeposit:f?.existential_deposit,balance:S.transferable,cap:b,hubReserves:p,protocolShares:P,shares:g,tradeable:y,type:f?.asset_type.type}}),l=await Promise.all(o);return l.push({id:t,decimals:a?.decimals,existentialDeposit:a?.existential_deposit,balance:i.transferable,tradeable:r,type:a?.asset_type.type}),[{address:e,type:"Omnipool",hubAssetId:t,tokens:l,...s}]}getPoolAddress(){let t="modlomnipool".padEnd(32,"\0"),e=new TextEncoder().encode(t),n=(0,Ln.toHex)(e);return(0,he.AccountId)(63).dec(n)}async getPoolLimits(){let[t,e,n]=await Promise.all([this.api.constants.Omnipool.MaxInRatio(),this.api.constants.Omnipool.MaxOutRatio(),this.api.constants.Omnipool.MinimumTradingLimit()]);return{maxInRatio:t,maxOutRatio:e,minTradingLimit:n}}async getPoolFees(t,e){let[n,r,a]=await Promise.all([this.api.constants.DynamicFees.AssetFeeParameters(),this.api.constants.DynamicFees.ProtocolFeeParameters(),this.api.query.DynamicFees.AssetFee.getValue(e)]),i=n.min_fee+r.min_fee,s=n.max_fee+r.max_fee;if(a){let{asset_fee:o,protocol_fee:l}=a;return{assetFee:st.fromPermill(o),protocolFee:st.fromPermill(l),min:st.fromPermill(i),max:st.fromPermill(s)}}else return{assetFee:st.fromPermill(n.min_fee),protocolFee:st.fromPermill(r.min_fee),min:st.fromPermill(i),max:st.fromPermill(s)}}getPoolType(){return"Omnipool"}async isSupported(){let t=this.api.query.Omnipool.Assets,e=await this.api.compatibilityToken;return t.isCompatible(he.CompatibilityLevel.BackwardsCompatible,e)}subscribePoolChange(t){return this.api.query.Omnipool.Assets.watchEntries({at:"best"}).pipe((0,Kt.distinctUntilChanged)((n,r)=>!r.deltas),(0,Kt.map)(({entries:n})=>n.map(r=>{let[a]=r.args,{hub_reserve:i,shares:s,tradable:o,cap:l,protocol_shares:c}=r.value,m=t.tokens.findIndex(p=>p.id===a);return{...t.tokens[m],cap:l,hubReserves:i,protocolShares:c,shares:s,tradeable:o}})),(0,Kt.map)(n=>{let r=t.tokens.find(a=>a.id===1);return{...t,tokens:[...n,r]}}))}};var Je={};x(Je,{StableMath:()=>C,StableSwap:()=>jt,StableSwapClient:()=>$t});var R=require("@galacticcouncil/math-stableswap"),C=class{static getPoolAddress(t){return(0,R.pool_account_name)(t)}static defaultPegs(t){let e=[];for(let n=0;n<t;n++)e.push(["1","1"]);return e}static calculateAmplification(t,e,n,r,a){return(0,R.calculate_amplification)(t,e,n,r,a)}static calculateInGivenOut(t,e,n,r,a,i,s){return(0,R.calculate_in_given_out)(t,e,n,r,a,i,s)}static calculateAddOneAsset(t,e,n,r,a,i,s){return(0,R.calculate_add_one_asset)(t,e,n,r,a,i,s)}static calculateSharesForAmount(t,e,n,r,a,i,s){return(0,R.calculate_shares_for_amount)(t,e,n,r,a,i,s)}static calculateOutGivenIn(t,e,n,r,a,i,s){return(0,R.calculate_out_given_in)(t,e,n,r,a,i,s)}static calculateLiquidityOutOneAsset(t,e,n,r,a,i,s){return(0,R.calculate_liquidity_out_one_asset)(t,e,n,r,a,i,s)}static calculateShares(t,e,n,r,a,i){return(0,R.calculate_shares)(t,e,n,r,a,i)}static calculateSpotPriceWithFee(t,e,n,r,a,i,s,o){return(0,R.calculate_spot_price_with_fee)(t,e,n,r,a,i,s,o)}static recalculatePegs(t,e,n,r,a){let i=(0,R.recalculate_peg)(t,e,n,r,a);return JSON.parse(i)}};var{FeeUtils:it}=O,jt=class u{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;amplification;id;fee;totalIssuance;static fromPool(t){return new u(t.address,t.tokens,t.maxInRatio,t.maxOutRatio,t.minTradingLimit,t.amplification,t.id,t.fee,t.totalIssuance)}constructor(t,e,n,r,a,i,s,o,l){this.type="Stableswap",this.address=t,this.tokens=e,this.maxInRatio=n,this.maxOutRatio=r,this.minTradingLimit=a,this.amplification=i,this.id=s,this.fee=o,this.totalIssuance=l}validatePair(t,e){return!0}parsePair(t,e){let n=new Map(this.tokens.map(i=>[i.id,i])),r=n.get(t),a=n.get(e);if(r==null)throw new Error("Pool does not contain tokenIn");if(a==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,balanceIn:r.balance,balanceOut:a.balance,decimalsIn:r.decimals,decimalsOut:a.decimals,tradeableIn:this.id===t?15:r.tradeable,tradeableOut:this.id===e?15:a.tradeable,assetInEd:r.existentialDeposit,assetOutEd:a.existentialDeposit}}validateAndBuy(t,e,n){let r=this.calculateInGivenOut(t,e),a=this.calculateInGivenOut(t,e,n),i=it.toPct(n.fee),s=[],o=B.isSellAllowed(t.tradeableIn),l=B.isBuyAllowed(t.tradeableOut);return(!o||!l)&&s.push("TradeNotAllowed"),(e<this.minTradingLimit||r<t.assetInEd)&&s.push("InsufficientTradingAmount"),{amountIn:a,calculatedIn:r,amountOut:e,feePct:i,errors:s}}validateAndSell(t,e,n){let r=this.calculateOutGivenIn(t,e),a=this.calculateOutGivenIn(t,e,n),i=it.toPct(n.fee),s=[],o=B.isSellAllowed(t.tradeableIn),l=B.isBuyAllowed(t.tradeableOut);return(!o||!l)&&s.push("TradeNotAllowed"),(e<this.minTradingLimit||r<t.assetOutEd)&&s.push("InsufficientTradingAmount"),{amountIn:e,calculatedOut:r,amountOut:a,feePct:i,errors:s}}calculateIn(t,e,n){let r=C.calculateInGivenOut(this.getReserves(),Number(t.assetIn),Number(t.assetOut),e.toString(),this.amplification.toString(),n?it.toRaw(n.fee).toString():"0",this.getPegs()),a=BigInt(r);return a<0n?0n:a}calculateAddOneAsset(t,e,n){let r=C.calculateAddOneAsset(this.getReserves(),e.toString(),Number(t.assetIn),this.amplification.toString(),this.totalIssuance.toString(),n?it.toRaw(n.fee).toString():"0",this.getPegs()),a=BigInt(r);return a<0n?0n:a}calculateSharesForAmount(t,e,n){let r=C.calculateSharesForAmount(this.getReserves(),Number(t.assetOut),e.toString(),this.amplification.toString(),this.totalIssuance.toString(),n?it.toRaw(n.fee).toString():"0",this.getPegs()),a=BigInt(r);return a<0n?0n:a}calculateInGivenOut(t,e,n){return t.assetOut==this.id?this.calculateAddOneAsset(t,e,n):t.assetIn==this.id?this.calculateSharesForAmount(t,e,n):this.calculateIn(t,e,n)}spotPriceInGivenOut(t){let e=C.calculateSpotPriceWithFee(this.id.toString(),this.getReserves(),this.amplification.toString(),t.assetOut.toString(),t.assetIn.toString(),this.totalIssuance.toString(),"0",this.getPegs());if(t.assetOut==this.id)return BigInt(e);if(t.assetIn==this.id){let r=Math.pow(10,t.decimalsIn-t.decimalsOut);return BigInt(e)/BigInt(r)}let n=Math.pow(10,18-t.decimalsIn);return BigInt(e)/BigInt(n)}calculateOut(t,e,n){let r=C.calculateOutGivenIn(this.getReserves(),Number(t.assetIn),Number(t.assetOut),e.toString(),this.amplification.toString(),n?it.toRaw(n.fee).toString():"0",this.getPegs()),a=BigInt(r);return a<0n?0n:a}calculateWithdrawOneAsset(t,e,n){let r=C.calculateLiquidityOutOneAsset(this.getReserves(),e.toString(),Number(t.assetOut),this.amplification.toString(),this.totalIssuance.toString(),n?it.toRaw(n.fee).toString():"0",this.getPegs()),a=BigInt(r);return a<0n?0n:a}calculateShares(t,e,n){let r=C.calculateShares(this.getReserves(),this.getAssets(t.assetIn,e),this.amplification.toString(),this.totalIssuance.toString(),n?it.toRaw(n.fee).toString():"0",this.getPegs()),a=BigInt(r);return a<0n?0n:a}calculateOutGivenIn(t,e,n){return t.assetIn==this.id?this.calculateWithdrawOneAsset(t,e,n):t.assetOut==this.id?this.calculateShares(t,e,n):this.calculateOut(t,e,n)}spotPriceOutGivenIn(t){let e=C.calculateSpotPriceWithFee(this.id.toString(),this.getReserves(),this.amplification.toString(),t.assetIn.toString(),t.assetOut.toString(),this.totalIssuance.toString(),"0",this.getPegs());if(t.assetIn==this.id)return BigInt(e);if(t.assetOut==this.id){let r=Math.pow(10,t.decimalsOut-t.decimalsIn);return BigInt(e)/BigInt(r)}let n=Math.pow(10,18-t.decimalsOut);return BigInt(e)/BigInt(n)}getPegs(){let t=C.defaultPegs(this.tokens.length-1);return JSON.stringify(t)}getReserves(){let t=this.tokens.filter(e=>e.id!=this.id).map(({id:e,balance:n,decimals:r})=>({asset_id:e,amount:n,decimals:r}));return JSON.stringify(t,rt.jsonFormatter)}getAssets(t,e){let n={asset_id:Number(t),amount:e.toString()};return JSON.stringify([n],rt.jsonFormatter)}};var Pe=require("polkadot-api"),qn=require("@polkadot-api/utils"),Nn=require("@noble/hashes/blake2b"),Tt=require("rxjs");var{FeeUtils:dt}=O,$t=class extends U{poolsData=new Map([]);getPoolType(){return"Stableswap"}getPoolAddress(t){let e=C.getPoolAddress(t),n=(0,Nn.blake2b)(e,{dkLen:32}),r=(0,qn.toHex)(n);return(0,Pe.AccountId)(63).dec(r)}async getPoolLimits(){return{maxInRatio:0n,maxOutRatio:0n,minTradingLimit:await this.api.constants.Stableswap.MinTradingLimit()}}async getPoolDelta(t,e,n){let{initial_amplification:r,final_amplification:a,initial_block:i,final_block:s}=e,o=C.calculateAmplification(r.toString(),a.toString(),i.toString(),s.toString(),n.toString()),l=await this.api.query.Tokens.TotalIssuance.getValue(t);return{amplification:BigInt(o),totalIssuance:l}}async getPoolTokens(t,e){let n=this.getPoolAddress(t),r=e.assets.map(async a=>{let[i,s,o]=await Promise.all([this.api.query.Stableswap.AssetTradability.getValue(t,a),this.api.query.AssetRegistry.Assets.getValue(a),this.getBalance(n,a)]);return{id:a,decimals:s?.decimals,existentialDeposit:s?.existential_deposit,balance:o.transferable,tradeable:i,type:s?.asset_type.type}});return Promise.all(r)}async isSupported(){let t=this.api.query.Stableswap.Pools,e=await this.api.compatibilityToken;return t.isCompatible(Pe.CompatibilityLevel.BackwardsCompatible,e)}async loadPools(){let[t,e,n]=await Promise.all([this.api.query.Stableswap.Pools.getEntries(),this.api.query.System.Number.getValue(),this.getPoolLimits()]),r=t.map(async({keyArgs:a,value:i})=>{let[s]=a,o=this.getPoolAddress(s),[l,c,m]=await Promise.all([this.getPoolDelta(s,i,e),this.getPoolTokens(s,i),this.getPoolPegs(s,i,e)]);return c.push({id:s,tradeable:15,balance:l.totalIssuance,decimals:18}),this.poolsData.set(o,i),{address:o,id:s,type:"Stableswap",fee:dt.fromPermill(i.fee),tokens:c,...l,...m,...n}});return Promise.all(r)}async getPoolFees(t){return{fee:t.fee}}async getPoolPegs(t,e,n){let r=await this.api.query.Stableswap.PoolPegs.getValue(t);if(!r)return this.getDefaultPegs(e);let a=await this.getLatestPegs(e,r,n),i=this.getRecentPegs(r),s=dt.fromPermill(r.max_peg_update),o=dt.fromPermill(e.fee),[l,c]=C.recalculatePegs(JSON.stringify(i),JSON.stringify(a),n.toString(),dt.toRaw(s).toString(),dt.toRaw(o).toString()),m=Number(l)*1e6;return{pegsFee:dt.fromPermill(m),pegs:c}}getDefaultPegs(t){let e=t.fee,n=C.defaultPegs(t.assets.length);return{pegsFee:dt.fromPermill(e),pegs:n}}getRecentPegs(t){let{current:e}=t;return Array.from(e.entries()).map(([n,r])=>r.map(a=>a.toString()))}async getLatestPegs(t,e,n){let{source:r}=e,a=Array.from(t.assets.entries()).map(([s,o])=>o),i=r.map(async(s,o)=>{if(s.type==="Oracle"){let[l,c,m]=s.value,d=[m,a[o]].sort((f,S)=>f-S),p=await this.api.query.EmaOracle.Oracles.getValue(l,d,c);if(!p)return;let[{price:g,updated_at:y}]=p,b=g.n.toString(),P=g.d.toString();return m.toString()===d[0].toString()?[[b,P],y.toString()]:[[P,b],y.toString()]}else if(s.type==="MMOracle"){let l=s.value.asHex(),{price:c,decimals:m,updatedAt:d}=await this.mmOracle.getData(l),p=10**m;return[[c.toString(),p.toString()],d.toString()]}else return[s.value.map(l=>l.toString()),n.toString()]});return Promise.all(i)}subscribePoolChange(t){let e=this.api.query.System.Number,n=this.poolsData.get(t.address);return!n||!t.id?(0,Tt.of)(t):e.watchValue("best").pipe((0,Tt.switchMap)(r=>Promise.all([this.getPoolDelta(t.id,n,r),this.getPoolPegs(t.id,n,r)])),(0,Tt.map)(([r,a])=>{let i=t.tokens.map(s=>s.id===t.id?{...s,balance:r.totalIssuance}:s);return Object.assign(t,{tokens:i},r,a)}))}};var Ze={};x(Ze,{XykMath:()=>Z,XykPool:()=>Qt,XykPoolClient:()=>Jt});var F=require("@galacticcouncil/math-xyk"),Z=class{static getSpotPrice(t,e,n){return(0,F.get_spot_price)(t,e,n)}static calculateInGivenOut(t,e,n){return(0,F.calculate_in_given_out)(t,e,n)}static calculateOutGivenIn(t,e,n){return(0,F.calculate_out_given_in)(t,e,n)}static calculatePoolTradeFee(t,e,n){return(0,F.calculate_pool_trade_fee)(t,e,n)}static calculateLiquidityIn(t,e,n){return(0,F.calculate_liquidity_in)(t,e,n)}static calculateSpotPrice(t,e){return(0,F.calculate_spot_price)(t,e)}static calculateSpotPriceWithFee(t,e,n,r){return(0,F.calculate_spot_price_with_fee)(t,e,n,r)}static calculateShares(t,e,n){return(0,F.calculate_shares)(t,e,n)}static calculateLiquidityOutAssetA(t,e,n,r){return(0,F.calculate_liquidity_out_asset_a)(t,e,n,r)}static calculateLiquidityOutAssetB(t,e,n,r){return(0,F.calculate_liquidity_out_asset_b)(t,e,n,r)}};var{FeeUtils:Gn}=O,Qt=class u{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;static fromPool(t){return new u(t.address,t.tokens,t.maxInRatio,t.maxOutRatio,t.minTradingLimit)}constructor(t,e,n,r,a){this.type="XYK",this.address=t,this.tokens=e,this.maxInRatio=n,this.maxOutRatio=r,this.minTradingLimit=a}validatePair(t,e){return!0}parsePair(t,e){let n=new Map(this.tokens.map(i=>[i.id,i])),r=n.get(t),a=n.get(e);if(r==null)throw new Error("Pool does not contain tokenIn");if(a==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,decimalsIn:r.decimals,decimalsOut:a.decimals,balanceIn:r.balance,balanceOut:a.balance,assetInEd:r.existentialDeposit,assetOutEd:a.existentialDeposit}}validateAndBuy(t,e,n){let r=this.calculateInGivenOut(t,e),a=this.calculateTradeFee(r,n),i=Gn.toPct(n.exchangeFee),s=r+a,o=[];(e<this.minTradingLimit||r<t.assetInEd)&&o.push("InsufficientTradingAmount");let l=t.balanceOut/this.maxOutRatio;e>l&&o.push("MaxOutRatioExceeded");let c=t.balanceIn/this.maxInRatio;return s>c&&o.push("MaxInRatioExceeded"),{amountIn:s,calculatedIn:r,amountOut:e,feePct:i,errors:o}}validateAndSell(t,e,n){let r=this.calculateOutGivenIn(t,e),a=this.calculateTradeFee(r,n),i=Gn.toPct(n.exchangeFee),s=r-a,o=[];(e<this.minTradingLimit||r<t.assetOutEd)&&o.push("InsufficientTradingAmount");let l=t.balanceIn/this.maxInRatio;e>l&&o.push("MaxInRatioExceeded");let c=t.balanceOut/this.maxOutRatio;return s>c&&o.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:r,amountOut:s,feePct:i,errors:o}}calculateInGivenOut(t,e){let n=Z.calculateInGivenOut(t.balanceIn.toString(),t.balanceOut.toString(),e.toString()),r=BigInt(n);return r<0n?0n:r}calculateOutGivenIn(t,e){let n=Z.calculateOutGivenIn(t.balanceIn.toString(),t.balanceOut.toString(),e.toString()),r=BigInt(n);return r<0n?0n:r}spotPriceInGivenOut(t){let e=Z.calculateSpotPrice(t.balanceOut.toString(),t.balanceIn.toString()),n=Math.pow(10,18-t.decimalsOut);return BigInt(e)/BigInt(n)}spotPriceOutGivenIn(t){let e=Z.calculateSpotPrice(t.balanceIn.toString(),t.balanceOut.toString()),n=Math.pow(10,18-t.decimalsIn);return BigInt(e)/BigInt(n)}calculateTradeFee(t,e){let n=Z.calculatePoolTradeFee(t.toString(),e.exchangeFee[0],e.exchangeFee[1]);return BigInt(n)}};var Un=require("polkadot-api"),Hn=require("rxjs");var Jt=class extends U{async loadPools(){let t=this.api.query.XYK.PoolAssets,[e,n]=await Promise.all([t.getEntries(),this.getPoolLimits()]),r=e.map(async({keyArgs:a,value:i})=>{let[s]=a,[o,l]=i,[c,m,d,p]=await Promise.all([this.getBalance(s,o),this.api.query.AssetRegistry.Assets.getValue(o),this.getBalance(s,l),this.api.query.AssetRegistry.Assets.getValue(l)]);return{address:s,type:"XYK",tokens:[{id:o,decimals:m?.decimals,existentialDeposit:m?.existential_deposit,balance:c.transferable,type:m?.asset_type.type},{id:l,decimals:p?.decimals,existentialDeposit:p?.existential_deposit,balance:d.transferable,type:p?.asset_type.type}],...n}});return Promise.all(r)}async getExchangeFee(){return await this.api.constants.XYK.GetExchangeFee()}async getPoolLimits(){let[t,e,n]=await Promise.all([this.api.constants.XYK.MaxInRatio(),this.api.constants.XYK.MaxOutRatio(),this.api.constants.XYK.MinTradingLimit()]);return{maxInRatio:t,maxOutRatio:e,minTradingLimit:n}}async getPoolFees(){return{exchangeFee:await this.getExchangeFee()}}getPoolType(){return"XYK"}async isSupported(){let t=this.api.query.XYK.PoolAssets,e=await this.api.compatibilityToken;return t.isCompatible(Un.CompatibilityLevel.BackwardsCompatible,e)}subscribePoolChange(t){return(0,Hn.of)(t)}};var tn={};x(tn,{AavePool:()=>Zt,AavePoolClient:()=>te});var Zt=class u{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;static fromPool(t){return new u(t.address,t.tokens,t.maxInRatio,t.maxOutRatio,t.minTradingLimit)}constructor(t,e,n,r,a){this.type="Aave",this.address=t,this.tokens=e,this.maxInRatio=n,this.maxOutRatio=r,this.minTradingLimit=a}validatePair(t,e){return!0}parsePair(t,e){let n=new Map(this.tokens.map(i=>[i.id,i])),r=n.get(t),a=n.get(e);if(r==null)throw new Error("Pool does not contain tokenIn");if(a==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,balanceIn:r.balance,balanceOut:a.balance,decimalsIn:r.decimals,decimalsOut:a.decimals,assetInEd:0n,assetOutEd:0n}}validateAndBuy(t,e,n){let r=this.calculateInGivenOut(t,e),a=[];return e>t.balanceOut&&a.push("TradeNotAllowed"),{amountIn:r,calculatedIn:r,amountOut:e,feePct:0,errors:a}}validateAndSell(t,e,n){let r=this.calculateOutGivenIn(t,e),a=[];return r>t.balanceOut&&a.push("TradeNotAllowed"),{amountIn:e,calculatedOut:r,amountOut:r,feePct:0,errors:a}}calculateInGivenOut(t,e){return e}calculateOutGivenIn(t,e){return e}spotPriceInGivenOut(t){let e=Math.pow(10,t.decimalsOut);return BigInt(e)}spotPriceOutGivenIn(t){let e=Math.pow(10,t.decimalsIn);return BigInt(e)}calculateTradeFee(t,e){return 0n}};var Wn=require("polkadot-api"),Yn=require("@polkadot-api/utils"),xt=require("rxjs"),Xn=require("viem");var Vn=[{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"reserve",type:"address"},{indexed:!1,internalType:"address",name:"user",type:"address"},{indexed:!0,internalType:"address",name:"onBehalfOf",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"},{indexed:!0,internalType:"uint16",name:"referralCode",type:"uint16"}],name:"Supply",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"reserve",type:"address"},{indexed:!0,internalType:"address",name:"user",type:"address"},{indexed:!0,internalType:"address",name:"to",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"}],name:"Withdraw",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"reserve",type:"address"},{indexed:!1,internalType:"address",name:"user",type:"address"},{indexed:!0,internalType:"address",name:"onBehalfOf",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"},{indexed:!1,internalType:"enum DataTypes.InterestRateMode",name:"interestRateMode",type:"uint8"},{indexed:!1,internalType:"uint256",name:"borrowRate",type:"uint256"},{indexed:!0,internalType:"uint16",name:"referralCode",type:"uint16"}],name:"Borrow",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"reserve",type:"address"},{indexed:!0,internalType:"address",name:"user",type:"address"},{indexed:!0,internalType:"address",name:"repayer",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"},{indexed:!1,internalType:"bool",name:"useATokens",type:"bool"}],name:"Repay",type:"event"}];var{ERC20:Mr}=lt,Lr=["Supply","Withdraw","Repay","Borrow"],te=class extends U{async loadPools(){let e=(await this.api.apis.AaveTradeExecutor.pools()).map(async({reserve:n,atoken:r,liqudity_in:a,liqudity_out:i})=>{let[s,o,l,c]=await Promise.all([this.api.query.AssetRegistry.Assets.getValue(n),this.api.query.AssetRegistry.AssetLocations.getValue(n),this.api.query.AssetRegistry.Assets.getValue(r),this.api.query.AssetRegistry.AssetLocations.getValue(r)]);return{address:this.getPoolId(n,r),type:"Aave",tokens:[{id:n,decimals:s?.decimals,existentialDeposit:s?.existential_deposit,balance:a,location:o,type:s?.asset_type.type},{id:r,decimals:l?.decimals,existentialDeposit:l?.existential_deposit,balance:i,location:c,type:l?.asset_type.type}],...this.getPoolLimits()}});return Promise.all(e)}async getPoolDelta(t){let[e,n]=t.tokens,{liqudity_in:r,liqudity_out:a}=await this.api.apis.AaveTradeExecutor.pool(e.id,n.id);return t.tokens.map(i=>{let s=i.id===e.id?r:a;return{...i,balance:s}})}getPoolId(t,e){let n=t+"/"+e,r=new TextEncoder().encode(n.padEnd(32,"\0")),a=(0,Yn.toHex)(r);return(0,Wn.AccountId)(63).dec(a)}getPoolLimits(){return{maxInRatio:0n,maxOutRatio:0n,minTradingLimit:0n}}async getPoolFees(t,e){return{}}getPoolType(){return"Aave"}async isSupported(){return!0}subscribePoolChange(t){let[e,n]=t.tokens,r=this.getReserveH160Id(e),a=this.api.event.Router.Executed.watch(({asset_in:s,asset_out:o})=>s===n.id||o===n.id),i=this.api.event.EVM.Log.watch(({log:s})=>{let{topics:o,data:l}=s,c=o.map(g=>g.asHex()),m=l.asHex(),{eventName:d,args:p}=(0,Xn.decodeEventLog)({abi:Vn,topics:c,data:m});return Lr.includes(d)&&p.reserve.toLowerCase()===r.toLowerCase()});return(0,xt.merge)([a,i]).pipe((0,xt.switchMap)(()=>this.getPoolDelta(t)),(0,xt.map)(s=>({...t,tokens:[...s]})))}getReserveH160Id(t){return t.type==="Erc20"?rt.findNestedKey(t.location,"AccountKey20").AccountKey20.key:Mr.fromAssetId(t.id)}};var It=class{static get(t){switch(t.type){case"Aave":return Zt.fromPool(t);case"XYK":return Qt.fromPool(t);case"Omnipool":return Xt.fromPool(t);case"LBP":return Vt.fromPool(t);case"Stableswap":return jt.fromPool(t);default:throw new Error("Pool type "+t.type+" is not supported yet")}}};var Q=require("rxjs");var vt=class extends k{evm;lbpClient;omniClient;stableClient;xykClient;aaveClient;active=new Set([]);clients=[];pools=new Map([]);lbpSub=Q.Subscription.EMPTY;omniSub=Q.Subscription.EMPTY;stableSub=Q.Subscription.EMPTY;xykSub=Q.Subscription.EMPTY;aaveSub=Q.Subscription.EMPTY;isReady=!1;isDestroyed=new Q.Subject;constructor(t,e){super(t),this.evm=e,this.lbpClient=new Yt(t,e),this.omniClient=new zt(t,e),this.stableClient=new $t(t,e),this.xykClient=new Jt(t,e),this.aaveClient=new te(t,e),this.clients=[this.lbpClient,this.omniClient,this.stableClient,this.xykClient,this.aaveClient]}subscribe(t){return t.getSubscriber().pipe((0,Q.takeUntil)(this.isDestroyed)).subscribe(e=>{this.pools.set(e.address,e)})}withOmnipool(){return this.omniSub.unsubscribe(),this.omniSub=this.subscribe(this.omniClient),this.active.add("Omnipool"),this}withStableswap(){return this.stableSub.unsubscribe(),this.stableSub=this.subscribe(this.stableClient),this.active.add("Stableswap"),this}withLbp(){return this.lbpSub.unsubscribe(),this.lbpSub=this.subscribe(this.lbpClient),this.active.add("LBP"),this}withAave(){return this.aaveSub.unsubscribe(),this.aaveSub=this.subscribe(this.aaveClient),this.active.add("Aave"),this}withXyk(t){return this.xykClient.withOverride(t),this.xykSub.unsubscribe(),this.xykSub=this.subscribe(this.xykClient),this.active.add("XYK"),this}destroy(){this.isDestroyed.next(!0),this.isDestroyed.complete(),this.active.clear(),this.pools.clear(),this.isReady=!1}async getPools(t={}){if(this.active.size===0)throw new Error("No pools selected");if(this.isReady)return Array.from(this.pools.values());let{useOnly:e=[],exclude:n=[]}=t,r=new Set(e),a=new Set(n),i=async s=>{let o=s.getPoolType();return r.size>0?r.has(o):a.size>0?!a.has(o):s.isSupported()};return this.getFilteredPools(i)}async getFilteredPools(t){let e=await Promise.all(this.clients.map(t)),n=this.clients.filter((a,i)=>e[i]);return(await Promise.all(n.map(a=>a.getPoolsMem()))).flat()}async getPoolFees(t,e){let n=this.clients.find(r=>r.getPoolType()===t.type);if(n)return n.getPoolFees(t,e);throw new qt(t.type)}};var cn={};x(cn,{DEFAULT_BLOCK_TIME:()=>zn,DEFAULT_MIN_BUDGET:()=>an,ORDER_MIN_BLOCK_PERIOD:()=>jn,Router:()=>Ot,TWAP_BLOCK_PERIOD:()=>ae,TWAP_MAX_DURATION:()=>on,TWAP_MAX_PRICE_IMPACT:()=>sn,TWAP_TX_MULTIPLIER:()=>ec,TradeOrderError:()=>rn,TradeOrderType:()=>Se,TradeRouteBuilder:()=>H,TradeRouter:()=>At,TradeScheduler:()=>Bt,TradeType:()=>fe});var ee=class{constructor(t=1/0){this.capacity=t}storage=[];enqueue(t){if(this.size()===this.capacity)throw Error("Queue has reached max capacity, you cannot add more items");this.storage.push(t)}dequeue(){return this.storage.shift()}size(){return this.storage.length}};var qr=8,ne=class{isNotVisited(t,e){let n=!0;return e.forEach(r=>{(r[0]===t[0]||r[1]===t[1])&&(n=!1)}),n}findPaths(t,e,n){let r=[],a=new ee,i=[];for(i.push([e,""]),a.enqueue(i);a.size()>0;){let s=a.dequeue();if(!s||s.length>qr)continue;let o=s[s.length-1];(n===null||o[0]===n)&&r.push(s),t.get(o[0])?.forEach(c=>{if(this.isNotVisited(c,s)){let m=[...s];m.push(c),a.enqueue(m)}})}return r}findShortestPaths(t,e,n){let r=[],a=new ee,i=[];i.push([e,""]),a.enqueue(i);let s=1/0;for(;a.size()>0;){let o=a.dequeue();if(!o)continue;let l=o[o.length-1];if(l[0]===n){o.length<s?(s=o.length,r.length=0,r.push(o)):o.length===s&&r.push(o);continue}let c=t.get(l[0]);for(let m of c??[])this.isNotVisited(m,o)&&a.enqueue([...o,m])}return r}buildAndPopulateGraph(t,e){let n=new Map;for(let r of t)n.set(parseInt(r),[]);for(let[r,a,i]of e)n.get(a)?.push([i,r]);return n}};function nn(u){let t={};for(let e of u){let n=e.tokens.length;for(let r=0;r<n;r++){t[e.tokens[r].id]||(t[e.tokens[r].id]=[]);for(let a=0;a<n;a++){if(r==a)continue;let i=[e.address,e.tokens[r].id,e.tokens[a].id];t[e.tokens[r].id].push(i)}}}return t}var re=class{getProposals(t,e,n){let r=n.filter(b=>b.type==="XYK"),a=n.filter(b=>b.type!=="XYK"),i=new Set(a.map(b=>b.tokens).flat().map(b=>b.id)),s=i.has(t),o=i.has(e),l=new ne,c=b=>{let P=nn(b),f=Object.keys(P),S=f.flatMap(v=>P[v]);return l.buildAndPopulateGraph(f,S)};if(!s&&!o){let b=r.filter(S=>S.tokens.find(v=>v.id===t)||S.tokens.find(v=>v.id===e)),P=c(b),f=l.findPaths(P,t,e);return this.parsePaths(f)}if(s&&o){let b=c(a),P=l.findPaths(b,t,e);return this.parsePaths(P)}let m=s?e:t,d=r.filter(b=>b.tokens.some(P=>P.id===m));if(d.length===0)return[];let p=[...a,...d],g=c(p),y=l.findPaths(g,t,e);return this.parsePaths(y)}parsePaths(t){let e=[];for(let n of t){let r=[];for(let a=0;a<n.length;a++){let i=n[a],s=n[a+1];if(s==null)break;r.push(this.toEdge(i,s))}e.push(r)}return e}toEdge(t,e){return[e[1],t[0],e[0]]}};var Ot=class{routeSuggester;routeProposals;routerOptions;ctx;constructor(t,e={}){this.ctx=t,this.routeSuggester=new re,this.routeProposals=new Map,this.routerOptions=Object.freeze(e)}buildRouteKey(t,e,n){return`${t}->${e}::${n.length}`}async getPools(){return this.ctx.getPools(this.routerOptions)}async getRoutes(t,e){let n=await this.getPools();return this.validateInput(t,e,n),this.getPaths(t,e,n)}async getTradeableAssets(){let t=await this.getPools(),e=this.getAssets(t);return Array.from(e)}async getRouteableAssets(t){let e=await this.getTradeableAssets();return(await Promise.all(e.filter(r=>r!==t).map(r=>this.getRoutes(r,t)))).filter(r=>r.length>0).map(([r])=>r[0].assetIn).sort()}validateInput(t,e,n){if(n.length===0)throw new Error("No pools configured");if(t===e)throw new Error("Trading pair can't be identical");let r=this.getAssets(n);if(!r.has(t))throw new Error(t+" is not supported asset");if(!r.has(e))throw new Error(e+" is not supported asset");return this.toPoolsMap(n)}getAssets(t){let e=t.map(n=>n.tokens.map(r=>r.id)).flat().sort((n,r)=>n>r?1:-1);return new Set(e)}getPaths(t,e,n){let r=this.toPoolsMap(n);return this.getProposals(t,e,n).filter(i=>this.validPath(i,r)).map(i=>this.toHops(i,r))}getProposals(t,e,n){let r=this.buildRouteKey(t,e,n);if(this.routeProposals.has(r))return this.routeProposals.get(r);let a=this.routeSuggester.getProposals(t,e,n);return this.routeProposals.set(r,a),a}validPath(t,e){return t.length>0&&t.map(n=>this.validEdge(n,e)).reduce((n,r)=>n&&r)}validEdge([t,e,n],r){return r.get(t)?.validatePair(e,n)||!1}toPoolsMap(t){return new Map(t.map(e=>[e.address,It.get(e)]))}toHops(t,e){return t.map(([n,r,a])=>{let i=e.get(n);return{poolAddress:n,poolId:i?.id,pool:i?.type,assetIn:r,assetOut:a}})}};var fe=(e=>(e.Buy="Buy",e.Sell="Sell",e))(fe||{}),Se=(n=>(n.Dca="Dca",n.TwapSell="TwapSell",n.TwapBuy="TwapBuy",n))(Se||{}),rn=(n=>(n.OrderTooSmall="OrderTooSmall",n.OrderTooBig="OrderTooBig",n.OrderImpactTooBig="OrderImpactTooBig",n))(rn||{});var{FeeUtils:Kn}=O,At=class extends Ot{mlr;poolsSnapshot;constructor(t,e={}){super(t,e),this.mlr=new Map}buildCtxSync(t,e){let n=this.poolsSnapshot,r=super.validateInput(t,e,n),a=super.getPaths(t,e,n);if(!a.length)throw new Nt(t,e);return{paths:a,pools:n,poolsMap:r}}async withCtx(t,e,n){this.poolsSnapshot||(this.poolsSnapshot=await super.getPools());let r=this.buildCtxSync(t,e);return n(r)}isDirectTrade(t){return t.length==1}findBestSellRoute(t){let e=t.sort((n,r)=>{let a=n[n.length-1].amountOut,i=r[r.length-1].amountOut;return a>i?-1:1});return e.find(n=>n.every(r=>r.errors.length==0))||e[0]}getRouteFeeRange(t){if(t.filter(n=>n.tradeFeeRange).length>0){let n=t.map(a=>a.tradeFeeRange?.[0]??a.tradeFeePct).reduce((a,i)=>a+i),r=t.map(a=>a.tradeFeeRange?.[1]??a.tradeFeePct).reduce((a,i)=>a+i);return[n,r]}}getPoolFeeRange(t){let e=t.min?Kn.toPct(t.min):void 0,n=t.max?Kn.toPct(t.max):void 0;if(e&&n)return[e,n]}async getBestSell(t,e,n){return this.getSell(t,e,n)}getSellSpot(t){let e=t[t.length-1];if(t.length===1)return e.spotPrice;let n=t.map(s=>s.assetOutDecimals).reduce((s,o)=>s+o),r=t.map(s=>s.spotPrice).reduce((s,o)=>s*o),a=n-e.assetOutDecimals,i=Math.pow(10,a);return r/BigInt(i)}async getSell(t,e,n,r){return this.withCtx(t,e,async({paths:a,poolsMap:i})=>{let s;if(r)s=await this.toSellSwaps(n,r,i);else{let o=a.map(c=>this.toSellSwaps(n,c,i)),l=await Promise.all(o);s=this.findBestSellRoute(l)}return this.buildSell(i,s)})}buildSell(t,e){let n=e[0],r=e[e.length-1],a=this.isDirectTrade(e),i=this.getSellSpot(e),s=r.amountOut,o=a?r.calculatedOut:this.calculateDelta0Y(n.amountIn,e,t),l=o-s,c=this.getRouteFeeRange(e),m=a?r.tradeFeePct:A.calculateSellFee(o,s),d=Math.pow(10,n.assetInDecimals),p=n.amountIn*i/BigInt(d),g=A.calculateDiffToRef(o,p);return{type:"Sell",amountIn:n.amountIn,amountOut:r.amountOut,spotPrice:i,tradeFee:l,tradeFeePct:m,tradeFeeRange:c,priceImpactPct:g,swaps:e,toHuman(){return{type:"Sell",amountIn:h.toDecimal(n.amountIn,n.assetInDecimals),amountOut:h.toDecimal(r.amountOut,r.assetOutDecimals),spotPrice:h.toDecimal(i,r.assetOutDecimals),tradeFee:h.toDecimal(l,r.assetOutDecimals),tradeFeePct:m,tradeFeeRange:c,priceImpactPct:g,swaps:e.map(y=>y.toHuman())}}}}calculateDelta0Y(t,e,n){let r=[];for(let a=0;a<e.length;a++){let i=e[a],s=n.get(i.poolAddress);if(s==null)throw new Error("Pool does not exit");let o=s.parsePair(i.assetIn,i.assetOut),l;a>0?l=r[a-1]:l=t;let c=s.calculateOutGivenIn(o,l);r.push(c)}return r[r.length-1]}async calculateMostLiquidRoute(t,e,n){let{paths:r,pools:a,poolsMap:i}=n,l=a.filter(y=>y.tokens.some(b=>b.id===t)).map(y=>y.type==="Aave"?y.tokens:y.tokens.filter(b=>b.id===t)).map(y=>y.map(b=>b.balance).reduce((b,P)=>b+P)).sort((y,b)=>b<y?-1:1)[0],c=A.getFraction(l,.1),m=await Promise.all(r.map(y=>this.toSellSwaps(c,y,i))),p=this.findBestSellRoute(m).map(y=>({poolAddress:y.poolAddress,poolId:y?.poolId,pool:y.pool,assetIn:y.assetIn,assetOut:y.assetOut})),g=this.buildRouteKey(t,e,a);return this.mlr.set(g,p),p}async toSellSwaps(t,e,n){let r=[];for(let a=0;a<e.length;a++){let i=e[a],s=n.get(i.poolAddress);if(s==null)throw new Error("Pool does not exit");let o=s.parsePair(i.assetIn,i.assetOut),l;a>0?l=r[a-1].amountOut:l=typeof t=="string"?h.toBigInt(t,o.decimalsIn):t;let c=await this.ctx.getPoolFees(s,o.assetOut),{amountOut:m,calculatedOut:d,feePct:p,errors:g}=s.validateAndSell(o,l,c),y=this.getPoolFeeRange(c),b=s.spotPriceOutGivenIn(o),P=Math.pow(10,o.decimalsIn),f=l*b/BigInt(P),S=A.calculateDiffToRef(d,f);r.push({...i,assetInDecimals:o.decimalsIn,assetOutDecimals:o.decimalsOut,amountIn:l,amountOut:m,calculatedOut:d,spotPrice:b,tradeFeePct:p,tradeFeeRange:y,priceImpactPct:S,errors:g,isSupply(){return s.type==="Aave"&&s.tokens[0].id===i.assetIn},isWithdraw(){return s.type==="Aave"&&s.tokens[1].id===i.assetIn},toHuman(){return{...i,amountIn:h.toDecimal(l,o.decimalsIn),amountOut:h.toDecimal(m,o.decimalsOut),calculatedOut:h.toDecimal(d,o.decimalsOut),spotPrice:h.toDecimal(b,o.decimalsOut),tradeFeePct:p,tradeFeeRange:y,priceImpactPct:S,errors:g}}})}return r}async getMostLiquidRoute(t,e){return this.withCtx(t,e,async n=>{let r=this.buildRouteKey(t,e,n.pools),a=this.mlr.get(r);return a||this.calculateMostLiquidRoute(t,e,n)})}async getSpotPrice(t,e){return this.withCtx(t,e,async n=>{let{pools:r,poolsMap:a}=n,i=this.buildRouteKey(t,e,r),s=this.mlr.get(i);s||(s=await this.calculateMostLiquidRoute(t,e,n));let o=await this.toSellSwaps("1",s,a),l=this.getSellSpot(o),c=o[o.length-1].assetOutDecimals;return{amount:l,decimals:c}})}findBestBuyRoute(t){let e=t.sort((n,r)=>{let a=n[0].amountIn,i=r[0].amountIn;return a>i?1:-1});return e.find(n=>n.every(r=>r.errors.length==0))||e[0]}async getBestBuy(t,e,n){return this.getBuy(t,e,n)}getBuySpot(t){let e=t[0];if(t.length===1)return e.spotPrice;let n=t.map(s=>s.assetInDecimals).reduce((s,o)=>s+o),r=t.map(s=>s.spotPrice).reduce((s,o)=>s*o),a=n-e.assetInDecimals,i=Math.pow(10,a);return r/BigInt(i)}async getBuy(t,e,n,r){return this.withCtx(t,e,async({paths:a,poolsMap:i})=>{let s;if(r)s=await this.toBuySwaps(n,r,i);else{let o=a.map(c=>this.toBuySwaps(n,c,i)),l=await Promise.all(o);s=this.findBestBuyRoute(l)}return this.buildBuy(i,s)})}buildBuy(t,e){let n=e[e.length-1],r=e[0],a=this.isDirectTrade(e),i=this.getBuySpot(e),s=r.amountIn,o=a?r.calculatedIn:this.calculateDelta0X(n.amountOut,e,t),l=s-o,c=this.getRouteFeeRange(e),m=a?r.tradeFeePct:A.calculateBuyFee(o,s),d=Math.pow(10,n.assetOutDecimals),p=n.amountOut*i/BigInt(d),g;return o===0n?g=-100:g=A.calculateDiffToRef(p,o),{type:"Buy",amountOut:n.amountOut,amountIn:r.amountIn,spotPrice:i,tradeFee:l,tradeFeePct:m,tradeFeeRange:c,priceImpactPct:g,swaps:e,toHuman(){return{type:"Buy",amountOut:h.toDecimal(n.amountOut,n.assetOutDecimals),amountIn:h.toDecimal(r.amountIn,r.assetInDecimals),spotPrice:h.toDecimal(i,r.assetInDecimals),tradeFee:h.toDecimal(l,r.assetInDecimals),tradeFeePct:m,tradeFeeRange:c,priceImpactPct:g,swaps:e.map(y=>y.toHuman())}}}}calculateDelta0X(t,e,n){let r=[];for(let a=e.length-1;a>=0;a--){let i=e[a],s=n.get(i.poolAddress);if(s==null)throw new Error("Pool does not exit");let o=s.parsePair(i.assetIn,i.assetOut),l;a==e.length-1?l=t:l=r[0];let c=s.calculateInGivenOut(o,l);r.unshift(c)}return r[0]}async toBuySwaps(t,e,n){let r=[];for(let a=e.length-1;a>=0;a--){let i=e[a],s=n.get(i.poolAddress);if(s==null)throw new Error("Pool does not exit");let o=s.parsePair(i.assetIn,i.assetOut),l;a==e.length-1?l=typeof t=="string"?h.toBigInt(t,o.decimalsOut):t:l=r[0].amountIn;let c=await this.ctx.getPoolFees(s,o.assetOut),{amountIn:m,calculatedIn:d,feePct:p,errors:g}=s.validateAndBuy(o,l,c),y=this.getPoolFeeRange(c),b=s.spotPriceInGivenOut(o),P=Math.pow(10,o.decimalsOut),f=l*b/BigInt(P),S;d===0n?S=-100:S=A.calculateDiffToRef(f,d),r.unshift({...i,assetInDecimals:o.decimalsIn,assetOutDecimals:o.decimalsOut,amountOut:l,amountIn:m,calculatedIn:d,spotPrice:b,tradeFeePct:p,tradeFeeRange:y,priceImpactPct:S,errors:g,isSupply(){return s.type==="Aave"&&s.tokens[0].id===i.assetIn},isWithdraw(){return s.type==="Aave"&&s.tokens[1].id===i.assetIn},toHuman(){return{...i,amountOut:h.toDecimal(l,o.decimalsOut),amountIn:h.toDecimal(m,o.decimalsIn),calculatedIn:h.toDecimal(d,o.decimalsIn),spotPrice:h.toDecimal(b,o.decimalsIn),tradeFeePct:p,tradeFeeRange:y,priceImpactPct:S,errors:g}}})}return r}};var zn=6e3,an=1000000000000000n,ae=6,sn=-5,on=216e5,ec=3,jn=6;var ln=require("polkadot-api");var H=class{static build(t){return t.map(({assetIn:e,assetOut:n,pool:r,poolId:a})=>r==="Stableswap"?{pool:(0,ln.Enum)("Stableswap",a),asset_in:e,asset_out:n}:{pool:(0,ln.Enum)(r),asset_in:e,asset_out:n})}};var Bt=class{schedulerOptions;router;constructor(t,e={}){this.router=t,this.schedulerOptions=Object.freeze({blockTime:e.blockTime??6e3,minBudgetInNative:e.minBudgetInNative??an})}get blockTime(){return this.schedulerOptions.blockTime}get minOrderBudget(){return this.schedulerOptions.minBudgetInNative}async getDcaOrder(t,e,n,r,a){let[i,s]=await Promise.all([this.getMinimumOrderBudget(t),this.router.getBestSell(t,e,n)]),{amountIn:o,swaps:l,priceImpactPct:c}=s,m=l[0],d=l[l.length-1],{assetInDecimals:p}=m,{assetOutDecimals:g}=d,y=Math.abs(c),b=this.getMinimumTradeCount(o,i),P=this.getOptimalTradeCount(y),f=a?Math.round(r/a):P,S=Math.ceil(r/b),v=Math.round(r/P),N=Math.round(r/f),G=o/BigInt(f),D=await this.router.getBestSell(t,e,G),V=o<i,ot=[];V&&ot.push("OrderTooSmall");let W=D.amountOut*BigInt(f),tt=this.toBlockPeriod(N),Ft=D.tradeFee*BigInt(f),Et=H.build(l),oe={assetIn:t,assetOut:e,errors:ot,frequencyMin:S,frequencyOpt:v,frequency:N,tradeCount:f,tradeFee:Ft,tradeImpactPct:D.priceImpactPct,tradePeriod:tt,tradeRoute:Et,type:"Dca"};return{...oe,amountIn:o,amountOut:W,tradeAmountIn:D.amountIn,tradeAmountOut:D.amountOut,toHuman(){return{...oe,amountIn:h.toDecimal(o,p),amountOut:h.toDecimal(W,g),tradeAmountIn:h.toDecimal(D.amountIn,p),tradeAmountOut:h.toDecimal(D.amountOut,g)}}}}async getMinimumOrderBudget(t){if(0===t)return this.minOrderBudget;let e=await this.router.getSpotPrice(0,t),n=10n**BigInt(12);if(e)return this.minOrderBudget*e.amount/n;throw new Error("Unable to calculate order budget")}getMinimumTradeCount(t,e){let n=e*2n/10n;if(n===0n)return 0;let r=t+n/2n;return Number(r/n)}getOptimalTradeCount(t){let e=Math.round(t*10)||1;return Math.max(e,3)}async getTwapSellOrder(t,e,n){let[r,a]=await Promise.all([this.getMinimumOrderBudget(t),this.router.getBestSell(t,e,n)]),{amountIn:i,swaps:s,priceImpactPct:o}=a,l=s[0],c=s[s.length-1],{assetInDecimals:m}=l,{assetOutDecimals:d}=c,p=Math.abs(o),g=this.getTwapTradeCount(p),y=i/BigInt(g),b=await this.router.getBestSell(l.assetIn,c.assetOut,y),P=g===1,f=i<r,S=b.priceImpactPct<-5,v=[];f||P?v.push("OrderTooSmall"):S&&v.push("OrderImpactTooBig");let N=b.amountOut*BigInt(g),G=b.tradeFee*BigInt(g),D=H.build(s),V={assetIn:t,assetOut:e,errors:v,tradeCount:g,tradeImpactPct:b.priceImpactPct,tradePeriod:6,tradeRoute:D,type:"TwapSell"};return{...V,amountIn:i,amountOut:N,tradeAmountIn:b.amountIn,tradeAmountOut:b.amountOut,tradeFee:G,toHuman(){return{...V,amountIn:h.toDecimal(i,m),amountOut:h.toDecimal(N,d),tradeAmountIn:h.toDecimal(b.amountIn,m),tradeAmountOut:h.toDecimal(b.amountOut,d),tradeFee:h.toDecimal(G,d)}}}}async getTwapBuyOrder(t,e,n){let[r,a]=await Promise.all([this.getMinimumOrderBudget(t),this.router.getBestBuy(t,e,n)]),{amountOut:i,swaps:s,priceImpactPct:o}=a,l=s[0],c=s[s.length-1],{assetInDecimals:m}=l,{assetOutDecimals:d}=c,p=Math.abs(o),g=this.getTwapTradeCount(p),y=i/BigInt(g),b=await this.router.getBestBuy(l.assetIn,c.assetOut,y),P=b.amountIn*BigInt(g),f=g===1,S=P<r,v=b.priceImpactPct<-5,N=[];S||f?N.push("OrderTooSmall"):v&&N.push("OrderImpactTooBig");let G=b.tradeFee*BigInt(g),D=H.build(s),V={assetIn:t,assetOut:e,errors:N,tradeCount:g,tradeImpactPct:b.priceImpactPct,tradePeriod:6,tradeRoute:D,type:"TwapBuy"};return{...V,amountIn:P,amountOut:i,tradeAmountIn:b.amountIn,tradeAmountOut:b.amountOut,tradeFee:G,toHuman(){return{...V,amountIn:h.toDecimal(P,m),amountOut:h.toDecimal(i,d),tradeAmountIn:h.toDecimal(b.amountIn,m),tradeAmountOut:h.toDecimal(b.amountOut,d),tradeFee:h.toDecimal(G,m)}}}}getTwapTradeCount(t){let e=this.getOptimalTradeCount(t);if(this.getTwapExecutionTime(e)>216e5){let r=216e5/(this.blockTime*6);return Math.round(r)}return e}getTwapExecutionTime(t){return t*6*this.blockTime}toBlockPeriod(t){let e=t/this.blockTime,n=Math.round(e);return Math.max(n,6)}};var un={};x(un,{BIG_10:()=>Jn,BIG_BILL:()=>Zn,StakingApi:()=>se,StakingClient:()=>ie});var $n=require("@polkadot/util-crypto"),Qn=require("@polkadot/util"),bt=require("@galacticcouncil/math-staking"),gt=et(require("big.js")),Jn=(0,gt.default)(10),Zn=(0,gt.default)(Jn.pow(12));function Nr(u){return(0,$n.encodeAddress)((0,Qn.stringToU8a)(("modl"+u).padEnd(32,"\0")),63)}var se=class{client;balanceClient;constructor(t,e){this.client=t,this.balanceClient=e}async getFreePotBalance(){let t=await this.client.getPalletId(),e=Nr(t);return(await this.balanceClient.getBalance(e,0)).transferable}async getStakingPosition(t){let[e,n]=await Promise.all([this.client.getStakingPositionsValue(t),this.client.getStakingVotes(t)]),r=e?.created_at,a=await n.reduce(async(i,[s,o])=>{let l=await i,c=s,m=o.amount,d=o.conviction.toString(),p=await this.client.getReferendumInfo(c);return p&&(p.type==="Approved"||p.type==="Rejected")&&l.push({id:c,amount:m,conviction:d}),l},Promise.resolve([]));return{stake:e?.stake,rewardPerStake:e?.reward_per_stake,createdAt:r,actionPoints:e?.action_points,accumulatedUnpaidRewards:e?.accumulated_unpaid_rewards,accumulatedSlashPoints:e?.accumulated_slash_points,accumulatedLockedRewards:e?.accumulated_locked_rewards,votes:a}}async getStake(t){let e=await this.client.getNFTCollectionId(),[n,r]=await Promise.all([this.client.getStaking(),this.client.getUniques(t,e)]),a=r.find(i=>i)?.itemId;return{totalStake:n?.total_stake,accumulatedRewardPerStake:n?.accumulated_reward_per_stake,potReservedBalance:n?.pot_reserved_balance,positionId:a,stakePosition:a?await this.getStakingPosition(a):void 0}}async getRewards(t,e){let n=await this.getStake(t),{potReservedBalance:r,accumulatedRewardPerStake:a,totalStake:i,stakePosition:s}=n;if(!s)return;let[o,l,c,m]=await Promise.all([this.getFreePotBalance(),this.client.getPeriodLength(),this.client.getUnclaimablePeriods(),this.client.getSixBlockSince()]),d=(0,gt.default)(o.toString()).minus(r.toString()),p=a.toString(),g=(0,gt.default)(e).plus(1).toString();d.gt(0)&&i>0&&(p=(0,bt.calculate_accumulated_rps)(a.toString(),d.toString(),i.toString()));let y=(0,bt.calculate_period_number)(l.toString(),e,m??g),b=(0,bt.calculate_period_number)(l.toString(),s.createdAt?.toString()??"",m??g),P=(0,bt.calculate_rewards)(p,s.rewardPerStake?.toString()??"",s.stake?.toString()??""),f=(0,gt.default)(P).plus(s.accumulatedUnpaidRewards?.toString()||"0").plus(s.accumulatedLockedRewards?.toString()||"0");if(!(0,gt.default)(y).minus(b).lte(c.toString()))return f.div(Zn).toString()}};var ie=class extends k{async getPalletId(){let t=this.api.constants.Staking.PalletId;return(await t()).asText()}async getPeriodLength(){let t=this.api.constants.Staking.PeriodLength;return await t()}async getUnclaimablePeriods(){let t=this.api.constants.Staking.UnclaimablePeriods;return await t()}async getNFTCollectionId(){let t=this.api.constants.Staking.NFTCollectionId;return await t()}async getStaking(){return await this.api.query.Staking.Staking.getValue()}async getUniques(t,e){return(await this.api.query.Uniques.Account.getEntries(t,e)).map(({keyArgs:i})=>{let[s,o,l]=i;return{address:s,collectionId:o,itemId:l}})}async getStakingPositionsValue(t){return await this.api.query.Staking.Positions.getValue(t)}async getStakingVotes(t){return await this.api.query.Staking.Votes.getValue(t)}async getReferendumInfo(t){return await this.api.query.Referenda.ReferendumInfoFor.getValue(t)}async getSixBlockSince(){return(await this.api.query.Staking.SixSecBlocksSince.getValue()).toString()}};var pn={};x(pn,{TxBuilderFactory:()=>Rt});var mn=require("polkadot-api");function tr(u){let t=[],e=u;for(;e&&typeof e=="object"&&"type"in e;)t.push(e.type),e=e.value;return t.join(".")}var _t=class extends k{evm;evmClient;balanceClient;aaveUtils;constructor(t,e){super(t),this.evm=e,this.evmClient=e.getWsProvider(),this.balanceClient=new z(t),this.aaveUtils=new ct(e)}wrapTx(t,e){return{name:t,get:()=>e,dryRun:n=>this.dryRun(n,e)}}async dispatchWithExtraGas(t){return this.api.tx.Dispatcher.dispatch_with_extra_gas({call:t.decodedCall,extra_gas:Ae})}async dryRun(t,e){let n=(0,mn.Enum)("Signed",t),r=(0,mn.Enum)("system",n),i=await this.client.getUnsafeApi().apis.DryRunApi.dry_run_call(r,e.decodedCall),s=i.success&&!i.value.execution_result.success?i.value.execution_result.value.error:null;if(s){let o=tr(s.value);throw new Error("Dry run execution error!",{cause:o})}return i}isDirectOmnipoolTrade(t){return t.length===1&&t[0].pool==="Omnipool"}};var we=class extends _t{_trade;_beneficiary;_slippagePct=1;setTrade(t){return this._trade=t,this}withBeneficiary(t){return this._beneficiary=t,this}withSlippage(t){return this._slippagePct=t,this}get trade(){if(!this._trade)throw new Error("Trade not set. Use setTrade().");return this._trade}get beneficiary(){if(!this._beneficiary)throw new Error("Beneficiary not set. Use withBeneficiary().");return this._beneficiary}get slippagePct(){return this._slippagePct}async build(){let{amountIn:t,swaps:e,type:n}=this.trade;if(n==="Buy")return this.buildBuyTx();let{assetIn:r}=e[0],a=await this.balanceClient.getBalance(this.beneficiary,r);return t>=a.transferable-5n?this.buildSellAllTx():this.buildSellTx()}async buildBuyTx(){let{amountIn:t,amountOut:e,swaps:n}=this.trade,r=n[0],a=n[n.length-1],i=A.getFraction(t,this.slippagePct),s=r.assetIn,o=a.assetOut,l=t+i,c;return this.isDirectOmnipoolTrade(n)?c=this.api.tx.Omnipool.buy({asset_in:s,asset_out:o,amount:e,max_sell_amount:l}):c=this.api.tx.Router.buy({asset_in:s,asset_out:o,amount_out:e,max_amount_in:l,route:H.build(n)}),this.wrapTx("RouterBuy",c)}async buildSellTx(){let{amountIn:t,amountOut:e,swaps:n}=this.trade,r=n[0],a=n[n.length-1],i=A.getFraction(e,this.slippagePct),s=r.assetIn,o=a.assetOut,l=e-i,c;return this.isDirectOmnipoolTrade(n)?c=this.api.tx.Omnipool.sell({asset_in:s,asset_out:o,amount:t,min_buy_amount:l}):c=this.api.tx.Router.sell({asset_in:s,asset_out:o,amount_in:t,min_amount_out:l,route:H.build(n)}),r.isWithdraw()&&await this.aaveUtils.hasBorrowPositions(this.beneficiary)&&(c=await this.dispatchWithExtraGas(c)),this.wrapTx("RouterSell",c)}async buildSellAllTx(){let{amountOut:t,swaps:e}=this.trade,n=e[0],r=e[e.length-1],a=A.getFraction(t,this.slippagePct),i=n.assetIn,s=r.assetOut,o=t-a,l=this.api.tx.Router.sell_all({asset_in:i,asset_out:s,min_amount_out:o,route:H.build(e)});return n.isWithdraw()&&await this.aaveUtils.hasBorrowPositions(this.beneficiary)&&(l=await this.dispatchWithExtraGas(l)),this.wrapTx("RouterSellAll",l)}};var Te=require("polkadot-api");var xe=class extends _t{_order;_beneficiary;_maxRetries=3;_slippagePct=1;setOrder(t){return this._order=t,this}withBeneficiary(t){return this._beneficiary=t,this}withMaxRetries(t){return this._maxRetries=t,this}withSlippage(t){return this._slippagePct=t,this}get order(){if(!this._order)throw new Error("Order not set. Use setOrder().");return this._order}get beneficiary(){if(!this._beneficiary)throw new Error("Beneficiary not set. Use withBeneficiary().");return this._beneficiary}get maxRetries(){return this._maxRetries}get slippagePct(){return this._slippagePct}async build(){let{type:t}=this.order;switch(t){case"Dca":return this.buildDcaTx();case"TwapSell":return this.buildTwapSellTx();case"TwapBuy":return this.buildTwapBuyTx();default:throw new Error(`Unsupported TradeOrderType: ${t}`)}}buildDcaTx(){let{amountIn:t,assetIn:e,assetOut:n,tradeAmountIn:r,tradePeriod:a,tradeRoute:i}=this.order,s=this.api.tx.DCA.schedule({schedule:{owner:this.beneficiary,period:a,max_retries:this.maxRetries,total_amount:t,slippage:this.slippagePct*1e4,stability_threshold:void 0,order:(0,Te.Enum)("Sell",{asset_in:e,asset_out:n,amount_in:r,min_amount_out:0n,route:i})},start_execution_block:void 0});return this.wrapTx("DcaSchedule",s)}buildTwapSellTx(){let{amountIn:t,assetIn:e,assetOut:n,tradeAmountIn:r,tradeAmountOut:a,tradePeriod:i,tradeRoute:s}=this.order,o=A.getFraction(a,this.slippagePct),l=a-o,c=this.api.tx.DCA.schedule({schedule:{owner:this.beneficiary,period:i,max_retries:this.maxRetries,total_amount:t,slippage:this.slippagePct*1e4,stability_threshold:void 0,order:(0,Te.Enum)("Sell",{asset_in:e,asset_out:n,amount_in:r,min_amount_out:l,route:s})},start_execution_block:void 0});return this.wrapTx("DcaSchedule.twapSell",c)}buildTwapBuyTx(){let{amountIn:t,assetIn:e,assetOut:n,tradeAmountIn:r,tradeAmountOut:a,tradePeriod:i,tradeRoute:s}=this.order,o=A.getFraction(r,this.slippagePct),l=r+o,c=this.api.tx.DCA.schedule({schedule:{owner:this.beneficiary,period:i,max_retries:this.maxRetries,total_amount:t,slippage:this.slippagePct*1e4,stability_threshold:void 0,order:(0,Te.Enum)("Buy",{asset_in:e,asset_out:n,amount_out:a,max_amount_in:l,route:s})},start_execution_block:void 0});return this.wrapTx("DcaSchedule.twapBuy",c)}};var Rt=class{client;evmClient;constructor(t,e){this.client=t,this.evmClient=e}trade(t){return new we(this.client,this.evmClient).setTrade(t)}order(t){return new xe(this.client,this.evmClient).setOrder(t)}};async function Gr(u){let t=new St(u),e=new Gt(u),[n,r]=await Promise.all([t.getBlockTime(),t.getMinOrderBudget()]),a=new vt(u,e).withAave().withOmnipool().withStableswap().withXyk(),i=new z(u),s=new ie(u),o=new Ht(u),l=new ct(e),c=new At(a),m=new Bt(c,{blockTime:n,minBudgetInNative:r}),d=new se(s,i),p=new Ut(o,i,{blockTime:n});return{api:{aave:l,router:c,scheduler:m,staking:d,farm:p},client:{asset:new ft(u),balance:i,evm:e},ctx:{pool:a},tx:new Rt(u,e),destroy:()=>{a.destroy()}}}0&&(module.exports={aave,api,big,client,const:null,createSdkContext,erc20,error,evm,farm,fmt,h160,json,math,pool,sor,staking,tx,xc});
|
|
1
|
+
"use strict";var lr=Object.create;var pe=Object.defineProperty;var cr=Object.getOwnPropertyDescriptor;var ur=Object.getOwnPropertyNames;var mr=Object.getPrototypeOf,pr=Object.prototype.hasOwnProperty;var wn=(u,t)=>()=>(u&&(t=u(u=0)),t);var I=(u,t)=>{for(var e in t)pe(u,e,{get:t[e],enumerable:!0})},me=(u,t,e,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of ur(t))!pr.call(u,r)&&r!==e&&pe(u,r,{get:()=>t[r],enumerable:!(n=cr(t,r))||n.enumerable});return u},ft=(u,t,e)=>(me(u,t,"default"),e&&me(e,t,"default")),nt=(u,t,e)=>(e=u!=null?lr(mr(u)):{},me(t||!u||!u.__esModule?pe(e,"default",{value:u,enumerable:!0}):e,u)),dr=u=>me(pe({},"__esModule",{value:!0}),u);var Dt={};var vn=wn(()=>{ft(Dt,require("@polkadot-api/ws-provider/node"))});var Mt={};var On=wn(()=>{ft(Mt,require("@polkadot-api/ws-provider/web"))});var Hr={};I(Hr,{aave:()=>Xe,api:()=>Fe,big:()=>f,client:()=>Ke,const:()=>Ne,createSdkContext:()=>Wr,erc20:()=>dt,error:()=>je,evm:()=>Qe,farm:()=>en,fmt:()=>O,h160:()=>Nt,json:()=>lt,math:()=>A,pool:()=>cn,sor:()=>bn,staking:()=>fn,tx:()=>Tn,xc:()=>He});module.exports=dr(Hr);var Fe={};I(Fe,{Papi:()=>D,getWs:()=>gr});var In=require("@galacticcouncil/descriptors");function xn(u){switch(u){case!0:case"true":case 1:case"1":case"on":case"yes":return!0;default:return!1}}var D=class{client;api;constructor(t){this.client=t,this.api=this.client.getTypedApi(In.hydration)}log(t,...e){let n=typeof window>"u"?process.env.GC_DEBUG:window.localStorage.getItem("gc.debug");xn(n)&&console.log(t,...e)}};var An=require("polkadot-api"),Bn=require("polkadot-api/polkadot-sdk-compat"),gr=async u=>{let t=typeof u=="string"?u.split(","):u,r=(typeof window>"u"?(await Promise.resolve().then(()=>(vn(),Dt))).getWsProvider:(await Promise.resolve().then(()=>(On(),Mt))).getWsProvider)(t);return(0,An.createClient)((0,Bn.withPolkadotSdkCompat)(r))};var Xe={};I(Xe,{AAVE_GAS_LIMIT:()=>Ce,AAVE_LENDING_POOL_ADDRESS:()=>ye,AAVE_POOL_ABI:()=>ke,AAVE_POOL_DATA_PROVIDER:()=>ge,AAVE_POOL_DATA_PROVIDER_ABI:()=>de,AAVE_POOL_PROXY:()=>Ee,AAVE_ROUNDING_THRESHOLD:()=>ai,AAVE_UINT_256_MAX:()=>yr,AaveClient:()=>Lt,AaveUtils:()=>gt});var ke=[{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 de=[{inputs:[{internalType:"contract IEACAggregatorProxy",name:"_networkBaseTokenPriceInUsdProxyAggregator",type:"address"},{internalType:"contract IEACAggregatorProxy",name:"_marketReferenceCurrencyPriceInUsdProxyAggregator",type:"address"}],stateMutability:"nonpayable",type:"constructor"},{inputs:[],name:"ETH_CURRENCY_UNIT",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[],name:"MKR_ADDRESS",outputs:[{internalType:"address",name:"",type:"address"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"bytes32",name:"_bytes32",type:"bytes32"}],name:"bytes32ToString",outputs:[{internalType:"string",name:"",type:"string"}],stateMutability:"pure",type:"function"},{inputs:[{internalType:"contract IPoolAddressesProvider",name:"provider",type:"address"}],name:"getReservesData",outputs:[{components:[{internalType:"address",name:"underlyingAsset",type:"address"},{internalType:"string",name:"name",type:"string"},{internalType:"string",name:"symbol",type:"string"},{internalType:"uint256",name:"decimals",type:"uint256"},{internalType:"uint256",name:"baseLTVasCollateral",type:"uint256"},{internalType:"uint256",name:"reserveLiquidationThreshold",type:"uint256"},{internalType:"uint256",name:"reserveLiquidationBonus",type:"uint256"},{internalType:"uint256",name:"reserveFactor",type:"uint256"},{internalType:"bool",name:"usageAsCollateralEnabled",type:"bool"},{internalType:"bool",name:"borrowingEnabled",type:"bool"},{internalType:"bool",name:"stableBorrowRateEnabled",type:"bool"},{internalType:"bool",name:"isActive",type:"bool"},{internalType:"bool",name:"isFrozen",type:"bool"},{internalType:"uint128",name:"liquidityIndex",type:"uint128"},{internalType:"uint128",name:"variableBorrowIndex",type:"uint128"},{internalType:"uint128",name:"liquidityRate",type:"uint128"},{internalType:"uint128",name:"variableBorrowRate",type:"uint128"},{internalType:"uint128",name:"stableBorrowRate",type:"uint128"},{internalType:"uint40",name:"lastUpdateTimestamp",type:"uint40"},{internalType:"address",name:"aTokenAddress",type:"address"},{internalType:"address",name:"stableDebtTokenAddress",type:"address"},{internalType:"address",name:"variableDebtTokenAddress",type:"address"},{internalType:"address",name:"interestRateStrategyAddress",type:"address"},{internalType:"uint256",name:"availableLiquidity",type:"uint256"},{internalType:"uint256",name:"totalPrincipalStableDebt",type:"uint256"},{internalType:"uint256",name:"averageStableRate",type:"uint256"},{internalType:"uint256",name:"stableDebtLastUpdateTimestamp",type:"uint256"},{internalType:"uint256",name:"totalScaledVariableDebt",type:"uint256"},{internalType:"uint256",name:"priceInMarketReferenceCurrency",type:"uint256"},{internalType:"address",name:"priceOracle",type:"address"},{internalType:"uint256",name:"variableRateSlope1",type:"uint256"},{internalType:"uint256",name:"variableRateSlope2",type:"uint256"},{internalType:"uint256",name:"stableRateSlope1",type:"uint256"},{internalType:"uint256",name:"stableRateSlope2",type:"uint256"},{internalType:"uint256",name:"baseStableBorrowRate",type:"uint256"},{internalType:"uint256",name:"baseVariableBorrowRate",type:"uint256"},{internalType:"uint256",name:"optimalUsageRatio",type:"uint256"},{internalType:"bool",name:"isPaused",type:"bool"},{internalType:"bool",name:"isSiloedBorrowing",type:"bool"},{internalType:"uint128",name:"accruedToTreasury",type:"uint128"},{internalType:"uint128",name:"unbacked",type:"uint128"},{internalType:"uint128",name:"isolationModeTotalDebt",type:"uint128"},{internalType:"bool",name:"flashLoanEnabled",type:"bool"},{internalType:"uint256",name:"debtCeiling",type:"uint256"},{internalType:"uint256",name:"debtCeilingDecimals",type:"uint256"},{internalType:"uint8",name:"eModeCategoryId",type:"uint8"},{internalType:"uint256",name:"borrowCap",type:"uint256"},{internalType:"uint256",name:"supplyCap",type:"uint256"},{internalType:"uint16",name:"eModeLtv",type:"uint16"},{internalType:"uint16",name:"eModeLiquidationThreshold",type:"uint16"},{internalType:"uint16",name:"eModeLiquidationBonus",type:"uint16"},{internalType:"address",name:"eModePriceSource",type:"address"},{internalType:"string",name:"eModeLabel",type:"string"},{internalType:"bool",name:"borrowableInIsolation",type:"bool"}],internalType:"struct IUiPoolDataProviderV3.AggregatedReserveData[]",name:"",type:"tuple[]"},{components:[{internalType:"uint256",name:"marketReferenceCurrencyUnit",type:"uint256"},{internalType:"int256",name:"marketReferenceCurrencyPriceInUsd",type:"int256"},{internalType:"int256",name:"networkBaseTokenPriceInUsd",type:"int256"},{internalType:"uint8",name:"networkBaseTokenPriceDecimals",type:"uint8"}],internalType:"struct IUiPoolDataProviderV3.BaseCurrencyInfo",name:"",type:"tuple"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"contract IPoolAddressesProvider",name:"provider",type:"address"}],name:"getReservesList",outputs:[{internalType:"address[]",name:"",type:"address[]"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"contract IPoolAddressesProvider",name:"provider",type:"address"},{internalType:"address",name:"user",type:"address"}],name:"getUserReservesData",outputs:[{components:[{internalType:"address",name:"underlyingAsset",type:"address"},{internalType:"uint256",name:"scaledATokenBalance",type:"uint256"},{internalType:"bool",name:"usageAsCollateralEnabledOnUser",type:"bool"},{internalType:"uint256",name:"stableBorrowRate",type:"uint256"},{internalType:"uint256",name:"scaledVariableDebt",type:"uint256"},{internalType:"uint256",name:"principalStableDebt",type:"uint256"},{internalType:"uint256",name:"stableBorrowLastUpdateTimestamp",type:"uint256"}],internalType:"struct IUiPoolDataProviderV3.UserReserveData[]",name:"",type:"tuple[]"},{internalType:"uint8",name:"",type:"uint8"}],stateMutability:"view",type:"function"},{inputs:[],name:"marketReferenceCurrencyPriceInUsdProxyAggregator",outputs:[{internalType:"contract IEACAggregatorProxy",name:"",type:"address"}],stateMutability:"view",type:"function"},{inputs:[],name:"networkBaseTokenPriceInUsdProxyAggregator",outputs:[{internalType:"contract IEACAggregatorProxy",name:"",type:"address"}],stateMutability:"view",type:"function"}];var Ee="0x1b02E051683b5cfaC5929C25E84adb26ECf87B38",ge="0x112b087b60C1a166130d59266363C45F8aa99db0",ye="0xf3Ba4D1b50f78301BDD7EAEa9B67822A15FCA691",Ce=1000000n,ai=5,yr=BigInt("0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");var Lt=class{client;constructor(t){this.client=t.getWsProvider()}async getBlockTimestamp(){let t=await this.client.getBlock();return Number(t.timestamp)}async getReservesData(){return await this.client.readContract({abi:de,address:ge,args:[ye],functionName:"getReservesData"})}async getUserReservesData(t){return await this.client.readContract({abi:de,address:ge,args:[ye,t],functionName:"getUserReservesData"})}async getUserAccountData(t){return await this.client.readContract({abi:ke,address:Ee,args:[t],functionName:"getUserAccountData"})}};var it=nt(require("big.js"));var f={};I(f,{asBigInt:()=>Pr,toBigInt:()=>hr,toDecimal:()=>br});var ot=nt(require("big.js"));ot.default.NE=-18;function br(u,t,e=6,n){let r=(0,ot.default)(u.toString()),i=(0,ot.default)(10).pow(t);return r.div(i).round(e,n).toString()}function hr(u,t){let e=(0,ot.default)(10).pow(t),r=(0,ot.default)(u).mul(e).toFixed(0,ot.default.roundDown);return BigInt(r)}function Pr(u){return BigInt(u.round(0,ot.default.roundDown).toFixed(0))}var dt={};I(dt,{ERC20:()=>De});var De=class{static fromAssetId(t){let e=Buffer.alloc(20,0);return e[15]=1,e.writeUInt32BE(t,16),"0x"+e.toString("hex")}static toAssetId(t){let e=Buffer.from(t.replace("0x",""),"hex");return e.length!==20||!this.isAssetAddress(t)?null:e.readUInt32BE(16)}static isAssetAddress(t){let e=Buffer.from("0000000000000000000000000000000100000000","hex"),n=Buffer.from(t.replace("0x",""),"hex");return n.length!==20?!1:n.subarray(0,16).equals(e.subarray(0,16))}};var O={};I(O,{FeeUtils:()=>Ge,shiftNeg:()=>Tr});var _n=nt(require("big.js"));var Ne={};I(Ne,{HUB_ASSET_ID:()=>qe,HYDRATION_OMNIPOOL_ADDRESS:()=>Sr,HYDRATION_PARACHAIN_ID:()=>fr,HYDRATION_SS58_PREFIX:()=>V,PERBILL_DENOMINATOR:()=>Me,PERMILL_DENOMINATOR:()=>qt,RUNTIME_DECIMALS:()=>_,SYSTEM_ASSET_DECIMALS:()=>Le,SYSTEM_ASSET_ID:()=>q,TRADEABLE_DEFAULT:()=>St});var _=18,qt=1e6,Me=1e9,q=0,Le=12,fr=2034,V=63,Sr="7L53bUTBbfuj14UpdCNPwmgzzHSsrsTWBHX5pys32mVWM3C1",qe=1,St=15;var Ge=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 Tr(u,t){let e=(0,_n.default)(typeof u=="bigint"?u.toString():u);return t===0?e.toString():e.div(Math.pow(10,t)).toString()}var Nt={};I(Nt,{H160:()=>We,isEvmAccount:()=>Rn,isEvmAddress:()=>Fn,isSs58Address:()=>kn});var Tt=require("polkadot-api"),Ue=require("@polkadot-api/utils"),rt=require("buffer");var Ve="ETH\0";function Rn(u){if(!u)return!1;try{let t=(0,Tt.AccountId)().enc(u),e=rt.Buffer.from(Ve);return rt.Buffer.from(t.subarray(0,e.length)).equals(e)}catch{return!1}}function Fn(u){return!!/^0x[a-fA-F0-9]{40}$/.test(u)}function kn(u){try{return(0,Tt.AccountId)(63).enc(u),!0}catch{return!1}}var We=class u{static toAccount=t=>{let e=rt.Buffer.from(t.slice(2),"hex"),n=rt.Buffer.from(Ve),r=Uint8Array.from(rt.Buffer.concat([n,e,rt.Buffer.alloc(8)])),i=(0,Ue.toHex)(r);return(0,Tt.AccountId)(63).dec(i)};static fromAccount=t=>{let e=(0,Tt.AccountId)().enc(t),n=rt.Buffer.from(Ve),r=e.slice(n.length,-8);return"0x"+rt.Buffer.from(r).toString("hex")};static fromSS58=t=>{let n=(0,Tt.AccountId)().enc(t).slice(0,20);return(0,Ue.toHex)(n)};static fromAny=t=>{if(Fn(t))return t;if(Rn(t))return u.fromAccount(t);if(kn(t))return u.fromSS58(t);throw new Error("Unknown address type")}};var lt={};I(lt,{findNestedKey:()=>wr,findNestedObj:()=>xr,jsonFormatter:()=>Ir});var wr=(u,t)=>{let e=[];return JSON.stringify(u,(n,r)=>(r&&r[t]&&e.push(r),r)),e[0]},xr=(u,t,e)=>{let n;return JSON.stringify(u,(r,i)=>(i&&i[t]===e&&(n=i),i)),n},Ir=(u,t)=>typeof t=="bigint"?t.toString():t;var A={};I(A,{calculateBuyFee:()=>Br,calculateDiffToAvg:()=>vr,calculateDiffToRef:()=>Or,calculateSellFee:()=>Ar,getFraction:()=>_r});var Q=nt(require("big.js"));function vr(u,t){let e=(0,Q.default)(u.toString()),n=(0,Q.default)(t.toString());return e.minus(n).abs().div(e.plus(n).div(2)).mul(100).round(2).toNumber()}function Or(u,t){if(t===0n)return 0;let e=(0,Q.default)(u.toString()),n=(0,Q.default)(t.toString());return e.minus(n).div(n).mul(100).round(2).toNumber()}function Ar(u,t){let e=(0,Q.default)(u.toString()),n=(0,Q.default)(t.toString());return(0,Q.default)(1).minus(n.div(e)).mul(100).round(2).toNumber()}function Br(u,t){let e=(0,Q.default)(u.toString());return(0,Q.default)(t.toString()).div(e).minus(1).mul(100).round(2).toNumber()}function _r(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 He={};I(He,{convertToId:()=>Rr});var En=require("buffer");function Rr(u){let e=En.Buffer.from(u.replace("0x",""),"hex").subarray(16);return e.readUIntBE(0,e.length)}var{ERC20:be}=dt,{H160:Ye}=Nt,Fr=1.01,kr=31536000n,he=10n**27n,gt=class{client;constructor(t){this.client=new Lt(t)}async getSummary(t){let e=Ye.fromAny(t),[n,r,i,a]=await Promise.all([this.client.getReservesData(),this.client.getUserReservesData(e),this.client.getUserAccountData(e),this.client.getBlockTimestamp()]),[s]=n,[o,l]=r,[c,m,d,p,g,b]=i,y=f.toDecimal(b,18),h=[];for(let P of o){let S=P.underlyingAsset.toLowerCase(),T=s.find(({underlyingAsset:ue})=>ue.toLowerCase()===S);if(!T)throw new Error("Missing pool reserve for "+S);let M=P.scaledATokenBalance,L=T.liquidityIndex,E=T.liquidityRate,G=T.availableLiquidity,K=T.priceInMarketReferenceCurrency,U=a+6,$=this.calculateLinearInterest(E,T.lastUpdateTimestamp,U),at=L*$/he,pt=M*at/he,ce=Number(l!==0&&l===T.eModeCategoryId?T.eModeLiquidationThreshold:T.reserveLiquidationThreshold)/1e4,_e=T.usageAsCollateralEnabled&&P.usageAsCollateralEnabledOnUser&&P.scaledATokenBalance>0n,Re=be.toAssetId(S);h.push({aTokenBalance:pt,availableLiquidity:G,decimals:Number(T.decimals),isCollateral:_e,priceInRef:K,reserveId:Re,reserveAsset:S,reserveLiquidationThreshold:ce})}return{healthFactor:Number(y),totalCollateral:c,totalDebt:m,reserves:h}}async hasBorrowPositions(t){let e=Ye.fromAny(t),n=await this.client.getUserAccountData(e),[r,i]=n;return i>0n}async getHealthFactor(t){let e=Ye.fromAny(t),n=await this.client.getUserAccountData(e),[r,i,a,s,o,l]=n,c=f.toDecimal(l,18);return Number(c)}async getHealthFactorAfterWithdraw(t,e,n){let{totalCollateral:r,totalDebt:i,reserves:a}=await this.getSummary(t),s=be.fromAssetId(e),o=a.find(h=>h.reserveAsset===s);if(!o)throw new Error("Missing reserve ctx for "+s);let{decimals:l,isCollateral:c,priceInRef:m,reserveLiquidationThreshold:d}=o,p=f.toBigInt(n,l),g=c?p*m/10n**BigInt(l):0n,b=r-g;if(b<=0n)return 0;let y=(0,it.default)(b.toString()).mul(d).div(i.toString()).toFixed(6,it.default.roundDown);return Number(y)}async getHealthFactorAfterSupply(t,e,n){let{totalCollateral:r,totalDebt:i,reserves:a}=await this.getSummary(t),s=be.fromAssetId(e),o=a.find(y=>y.reserveAsset===s);if(!o)throw new Error("Missing reserve ctx for "+s);let{decimals:l,priceInRef:c,reserveLiquidationThreshold:m}=o,p=f.toBigInt(n,l)*c/10n**BigInt(l),g=r+p;if(g<=0n)return 0;let b=(0,it.default)(g.toString()).mul(m).div(i.toString()).toFixed(6,it.default.roundDown);return Number(b)}async getMaxWithdraw(t,e){let{totalDebt:n,reserves:r,healthFactor:i}=await this.getSummary(t),a=be.fromAssetId(e),s=r.find(o=>o.reserveAsset===a);if(!s)throw new Error("Missing reserve ctx for "+a);return this.calculateWithdrawMax(s,n,i)}async getMaxWithdrawAll(t){let{totalDebt:e,reserves:n,healthFactor:r}=await this.getSummary(t),i={};for(let a of n){let s=this.calculateWithdrawMax(a,e,r);a.reserveId&&(i[a.reserveId]=s)}return i}calculateWithdrawMax(t,e,n){let{aTokenBalance:r,availableLiquidity:i,decimals:a,priceInRef:s,reserveLiquidationThreshold:o,isCollateral:l}=t,c=r;if(l&&e>0n){let d=n-Fr;if(d>0){let p=(0,it.default)(d).mul(e.toString()).div(o).toFixed(0,it.default.roundDown),g=(0,it.default)(p).div(s.toString()).mul(10**a).toFixed(0,it.default.roundDown);c=r<BigInt(g)?r:BigInt(g)}else c=0n}return{amount:c<i?c:i,decimals:a}}calculateLinearInterest(t,e,n){let r=n-e;if(r<=0)return he;let i=t*BigInt(r)/kr;return he+i}};var Ke={};I(Ke,{AssetClient:()=>wt,BalanceClient:()=>J,ChainParams:()=>xt});var wt=class extends D{SUPPORTED_TYPES=["StableSwap","Bond","Token","External","Erc20"];constructor(t){super(t)}async queryShares(){let e=await this.api.query.Stableswap.Pools.getEntries();return new Map(e.map(({keyArgs:n,value:r})=>{let[i]=n;return[i,r]}))}async queryBonds(){let e=await this.api.query.Bonds.Bonds.getEntries();return new Map(e.map(({keyArgs:n,value:r})=>{let[i]=n;return[i,r]}))}async queryAssets(){let e=await this.api.query.AssetRegistry.Assets.getEntries();return new Map(e.filter(({value:n})=>{let{asset_type:r}=n;return this.SUPPORTED_TYPES.includes(r.type)}).map(({keyArgs:n,value:r})=>{let[i]=n;return[i,r]}))}async queryAssetLocations(){let e=await this.api.query.AssetRegistry.AssetLocations.getEntries();return new Map(e.map(({keyArgs:n,value:r})=>{let[i]=n;return[i,r]}))}async mapToken(t,e,n,r){let{name:i,asset_type:a,is_sufficient:s,existential_deposit:o}=e,{symbol:l,decimals:c}=n.get(t)??{};return{id:t,name:i?.asText(),symbol:l,decimals:c,icon:l,type:a.type,isSufficient:s,location:r,existentialDeposit:o}}async mapBond(t,e,n,r){let[i,a]=r,{asset_type:s,is_sufficient:o,existential_deposit:l}=e,{symbol:c,decimals:m}=await this.mapToken(i,e,n),d=Number(a),p=new Intl.DateTimeFormat("en-GB"),g=[c,"Bond",p.format(d)].join(" ");return{id:t,name:g,symbol:c+"b",decimals:m,icon:c,type:s.type,isSufficient:o,existentialDeposit:l,underlyingAssetId:i,maturity:d}}async mapShares(t,e,n,r){let{assets:i}=r,{name:a,symbol:s,asset_type:o,is_sufficient:l,existential_deposit:c}=e,m=await Promise.all(i.map(async g=>{let{symbol:b}=await this.mapToken(g,e,n);return[g,b]})),d=Object.fromEntries(m),p=Object.values(d);return{id:t,name:p.join(", "),symbol:s?.asText()||a?.asText(),decimals:18,icon:p.join("/"),type:o.type,isSufficient:l,existentialDeposit:c,meta:d}}async mapExternal(t,e,n,r){let i=await this.mapToken(t,e,new Map,r),a=n?.find(s=>s.internalId===i.id);return a?{...i,decimals:a.decimals,name:a.name,symbol:a.symbol,icon:a.symbol,isWhiteListed:a.isWhiteListed}:i}parseMetadata(t){return new Map(Array.from(t,([e,n])=>[e,{symbol:n.symbol?.asText(),decimals:n.decimals}]))}async getOnChainAssets(t,e){let[n,r,i,a]=await Promise.all([this.queryAssets(),this.queryAssetLocations(),this.queryShares(),this.queryBonds()]),s=this.parseMetadata(n),o=[];for(let[l,c]of Array.from(n)){let m=r.get(l),{asset_type:d}=c,p;switch(d.type){case"Bond":let g=a.get(l);p=await this.mapBond(l,c,s,g);break;case"StableSwap":let b=i.get(l);p=await this.mapShares(l,c,s,b);break;case"External":p=await this.mapExternal(l,c,e,m);break;default:p=await this.mapToken(l,c,s,m)}o.push(p)}return t?o:o.filter(l=>this.isValidAsset(l))}isValidAsset(t){let e=Math.sign(t.decimals);return!!t.symbol&&(e===0||e===1)}};var x=require("rxjs");var J=class extends D{constructor(t){super(t)}async getBalance(t,e){return e===0?this.getSystemBalance(t):this.getTokenBalanceData(t,e)}async getSystemBalance(t){let e=this.api.query.System.Account,{data:n}=await e.getValue(t);return this.calculateBalance(n)}async getTokenBalance(t,e){let r=await this.api.query.Tokens.Accounts.getValue(t,e);return this.calculateBalance(r)}calculateBalance(t){let e=t.free>=t.frozen?t.free-t.frozen:0n,n=t.free+t.reserved;return{free:t.free,reserved:t.reserved,frozen:t.frozen,total:n,transferable:e}}async getErc20Balance(t,e){return this.getTokenBalanceData(t,e)}subscribeBalance(t){let e=this.subscribeSystemBalance(t),n=this.subscribeTokensBalance(t),r=this.subscribeErc20Balance(t);return(0,x.combineLatest)([e,n,r]).pipe((0,x.debounceTime)(250),(0,x.map)(i=>i.flat()),(0,x.startWith)([]),(0,x.bufferCount)(2,1),(0,x.map)(([i,a],s)=>{if(s===0)return a;let o=i.reduce((c,m)=>(c.set(m.id,m.balance),c),new Map);return a.filter(c=>!Cn(c.balance,o.get(c.id)))}))}subscribeSystemBalance(t){return this.api.query.System.Account.watchValue(t,"best").pipe((0,x.map)(n=>({id:0,balance:this.calculateBalance(n.data)})))}subscribeTokenBalance(t,e){return this.api.query.Tokens.Accounts.watchValue(t,e,"best").pipe((0,x.map)(r=>({id:e,balance:r})))}subscribeTokensBalance(t){return this.api.query.Tokens.Accounts.watchEntries(t,{at:"best"}).pipe((0,x.distinctUntilChanged)((n,r)=>!r.deltas),(0,x.map)(({deltas:n})=>{let r=[];return n?.deleted.forEach(i=>{let[a,s]=i.args;r.push({id:s,balance:this.calculateBalance({free:0n,reserved:0n,frozen:0n})})}),n?.upserted.forEach(i=>{let[a,s]=i.args;r.push({id:s,balance:this.calculateBalance(i.value)})}),r}))}subscribeErc20Balance(t,e){let n=new x.Subject,r=n.pipe((0,x.shareReplay)(1)),i=async()=>(await this.api.query.AssetRegistry.Assets.getEntries()).filter(({value:l})=>{let{asset_type:c}=l;return c.type==="Erc20"}).map(({keyArgs:l})=>{let[c]=l;return c}),a=async()=>{let o=e||await i(),l=async()=>{let d=(await Promise.all(o.map(async p=>{let g=await this.getTokenBalanceData(t,p);return[p,g]}))).map(([p,g])=>({id:p,balance:g}));n.next(d)};await l();let c=this.api.query.System.Number.watchValue("best").subscribe(l);return()=>c.unsubscribe()},s;return a().then(o=>s=o),r.pipe((0,x.finalize)(()=>s?.()),(0,x.pairwise)(),(0,x.map)(([o,l],c)=>{if(c===0)return l;let m=o.reduce((p,g)=>(p.set(g.id,g.balance),p),new Map);return l.filter(p=>!Cn(p.balance,m.get(p.id)))}),(0,x.distinctUntilChanged)((o,l)=>l.length===0))}async getTokenBalanceData(t,e){let n=await this.api.apis.CurrenciesApi.account(e,t);return this.calculateBalance(n)}},Cn=(u,t)=>u!==void 0&&t!==void 0&&u.transferable===t.transferable&&u.total===t.total;var xt=class extends D{_minOrderBudget;_blockTime;constructor(t){super(t)}async getBlockTime(){if(this._blockTime===void 0){let t=await this.api.constants.Aura.SlotDuration();this._blockTime=Number(t)}return this._blockTime}async getMinOrderBudget(){return this._minOrderBudget===void 0&&(this._minOrderBudget=await this.api.constants.DCA.MinBudgetInNativeCurrency()),this._minOrderBudget}};var je={};I(je,{AssetNotFound:()=>ze,PoolNotFound:()=>Gt,RouteNotFound:()=>Ut});var ze=class extends Error{constructor(t){super(),this.message=`${t} not found`,this.name="AssetNotFound"}},Gt=class extends Error{constructor(t){super(),this.message=`${t} pool invalid`,this.name="PoolNotFound"}},Ut=class extends Error{constructor(t,e){super(),this.message=`Route from ${t} to ${e} not found in current configuration`,this.name="RouteNotFound"}};var Qe={};I(Qe,{EvmClient:()=>Vt,createChain:()=>$e});var Dn=require("viem"),Er=["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"],$e=()=>(0,Dn.defineChain)({id:222222,name:"Hydration",network:"hydration",nativeCurrency:{decimals:18,name:"WETH",symbol:"WETH"},rpcUrls:{default:{http:Er}},blockExplorers:{default:{name:"Hydration Explorer",url:"https://hydration.subscan.io"}},testnet:!1});var Z=require("viem");var Vt=class{client;chain;constructor(t){this.client=t,this.chain=$e()}get chainId(){return this.chain.id}get chainCurrency(){return this.chain.nativeCurrency.symbol}get chainDecimals(){return this.chain.nativeCurrency.decimals}getProvider(){return(0,Z.createPublicClient)({chain:this.chain,transport:(0,Z.http)()})}getWsProvider(){return(0,Z.createPublicClient)({transport:(0,Z.custom)({request:({method:t,params:e})=>this.client._request(t,e||[])})})}getSigner(t){return(0,Z.createWalletClient)({account:t,chain:this.chain,transport:(0,Z.custom)(window.ethereum)})}};var en={};I(en,{LiquidityMiningApi:()=>Wt,LiquidityMiningClient:()=>Ht});var qn=require("polkadot-api"),N=nt(require("big.js")),tn=require("@galacticcouncil/math-liquidity-mining");var Pe=class{result=new Map;getKey(t,e){return[e,t.toString()].join(",")}constructor(t,e){for(let n=0;n<t.length;++n){let[r,i]=t[n];this.result.set(this.getKey(i,r),e[n].free)}}freeBalance(t,e){return this.result.get(this.getKey(t,e))??0n}transfer(t,e,n,r){let i=this.getKey(t,e),a=this.getKey(t,n),s=this.result.get(i)??0n,o=this.result.get(a)??0n;if(s<r)throw new Error("Attempting to transfer more than is present");this.result.set(i,s+r),this.result.set(a,o+r)}};var ct=nt(require("big.js")),z=require("@galacticcouncil/math-liquidity-mining");var Je=nt(require("big.js")),Ze=(0,Je.default)(10).pow(18),Mn=BigInt((0,Je.default)(1).pow(18).toString()),Ln=6;var Cr="1000000000000000000",fe=class{constructor(t,e,n){this.getAccount=t;this.getAsset=e;this.multiCurrency=n}async syncGlobalFarm(t,e,n){if(t.state.type!=="Active"||t.updated_at===e)return null;if(t.total_shares_z===0n)return t;let r=await this.getAsset(t.reward_currency),i=e-t.updated_at,a=this.getAccount(t.id),s=r?.existential_deposit;if(!s)throw new Error("Missing reward currency asset list");let o=this.multiCurrency.freeBalance(t.reward_currency,a),l=(0,ct.default)(s.toString()),c=(0,ct.default)(o.toString()).minus(l.lt(o.toString())?s.toString():o.toString()),m=(0,ct.default)((0,z.calculate_global_farm_rewards)(t.total_shares_z.toString(),n.toString(),(0,ct.default)(t.yield_per_period.toString()).mul(Ze).round(0,ct.default.roundDown).toFixed(),t.max_reward_per_period.toString(),i.toFixed()));if(c.lt(m)&&(m=c),m.eq(0))return t;let d=this.getAccount(0);return this.multiCurrency.transfer(t.reward_currency,a,d,BigInt(m.toFixed())),{...t,accumulated_rpz:BigInt((0,z.calculate_accumulated_rps)(t.accumulated_rpz.toString(),t.total_shares_z.toString(),m.toFixed()))}}syncYieldFarm(t,e,n){if(t.state.type!=="Active"||t.updated_at===n)return null;if(t.total_valued_shares===0n)return{...t,updated_at:n};let r=(0,z.calculate_yield_farm_delta_rpvs)(t.accumulated_rpz.toString(),e.accumulated_rpz.toString(),t.multiplier.toString(),t.total_valued_shares.toString());return{...t,accumulated_rpvs:t.accumulated_rpvs+BigInt(r),updated_at:n}}getLoyaltyMultiplier(t,e){let n=(0,ct.default)(1).mul(Ze).round(0,ct.default.roundDown).toString();if(!e)return n;let{initial_reward_percentage:r,scale_coef:i}=e;return(0,z.calculate_loyalty_multiplier)(t.toFixed(),r.toString(),i.toFixed())}async claimRewards(t,e,n,r,i){if(e.state.type==="Terminated")return null;let a=Math.floor(r/t.blocks_per_period);if(n.updated_at===a)return null;let s=await this.syncGlobalFarm(t,a,i);if(!s)return null;let o=this.syncYieldFarm(e,s,a);if(!o)return null;let l=o.total_stopped-n.stopped_at_creation,c=o.updated_at-n.entered_at-l,m=this.getLoyaltyMultiplier(c,o.loyalty_curve),d=BigInt((0,z.calculate_user_reward)(n.accumulated_rpvs.toString(),n.valued_shares.toString(),n.accumulated_claimed_rewards.toString(),o.accumulated_rpvs.toString(),m)),p=BigInt((0,z.calculate_user_reward)(n.accumulated_rpvs.toString(),n.valued_shares.toString(),n.accumulated_claimed_rewards.toString(),o.accumulated_rpvs.toString(),Cr));return{reward:d,maxReward:p,assetId:s.reward_currency}}};var Dr=(0,N.default)(365.2425).times(24).times(60).times(60),Wt=class{client;balanceClient;options;constructor(t,e,n={}){this.client=t,this.balanceClient=e,this.options=Object.freeze({blockTime:n.blockTime??Ln})}get blockTime(){return this.options.blockTime}async getOraclePrice(t,e){let n=[t,e].sort((i,a)=>i-a);if(t===e)return Mn;let r=await this.client.getOraclePrice(n);if(r){let{n:i,d:a}=r[0].price,s;return t<e?s=(0,tn.fixed_from_rational)(i.toString(),a.toString()):s=(0,tn.fixed_from_rational)(a.toString(),i.toString()),BigInt(s)}}getFarmAddress=(t,e)=>{let n=Buffer.from("modl","utf-8"),r=Buffer.from(e?"78796b4c4d704944":"4f6d6e6957684c4d","hex"),i=Buffer.from([t]),a=Buffer.concat([n,r,i]),o="0x"+Buffer.concat([a,Buffer.alloc(32-a.length)]).toString("hex");return(0,qn.AccountId)(63).dec(o)};getGlobalRewardPerPeriod(t,e,n,r){let i=(0,N.default)(r).times(t.toString()).times(e.toString()).div(18);return i.gte(n.toString())?n.toString():i.toString()}getPoolYieldPerPeriod(t,e,n,r){let i=(0,N.default)(t.toString()).times(e),a=(0,N.default)(n.toString()).times(r);return i.div(a.toString()).toString()}farmData(t,e,n){let{yieldFarm:r,globalFarm:i,priceAdjustment:a,balance:s,id:o}=t,{multiplier:l,loyalty_curve:c}=r,{blocks_per_period:m,yield_per_period:d,total_shares_z:p,max_reward_per_period:g,pending_rewards:b,accumulated_paid_rewards:y,planned_yielding_periods:h,updated_at:P,incentivized_asset:S,reward_currency:T,price_adjustment:M}=i,L=O.shiftNeg(a??M,18),E=O.shiftNeg(l,18),G=O.shiftNeg(c?.initial_reward_percentage??0,18),K=Dr.div((0,N.default)(this.blockTime).times(m)).toString(),U;if(p<=0)U=(0,N.default)(E).times(d.toString()).times(K).toString();else{let ar=this.getGlobalRewardPerPeriod(p,d,g,L),or=this.getPoolYieldPerPeriod(ar,E,p,L);U=(0,N.default)(or).times(K).toString()}let $=b+y,at=g*BigInt(h),pt=s.transferable+$,Ct=pt-$,Be=(0,N.default)(Ct.toString()).div(g.toString()),ce=(0,N.default)(e).div(m.toString()).toString(),_e=(p>=0?Be.plus(P):Be.plus(ce)).toString(),Re=(0,N.default)(p.toString()).div((0,N.default)(g.toString()).div(d.toString())).div(Math.pow(10,18)).times(100).times(L).toFixed(2),ue=(0,N.default)($.toString()).div(pt.toString()).gte(.999);U=ue?"0":(0,N.default)(U).div(n?2:1).times(100).toString();let sr=G?(0,N.default)(U).times(G).toString():void 0;return{apr:U,minApr:sr,isDistributed:ue,estimatedEndPeriod:_e,maxRewards:at,incentivizedAsset:S,rewardCurrency:T,loyaltyCurve:c,currentPeriod:ce,potMaxRewards:pt,fullness:Re,yieldFarmId:r.id,globalFarmId:i.id,poolId:o}}async getAllOmnipoolFarms(){let e=(await this.client.getAllOmnipooFarms()).reduce((r,i)=>r.includes(i.keyArgs[0].toString())?r:[...r,i.keyArgs[0].toString()],[]),n=await Promise.all(e.map(async r=>{let i=await this.getOmnipoolFarms(r);if(i)return[r,i]}));return Object.fromEntries(n.filter(r=>!!r))}async getOmnipoolFarms(t){let e=await this.client.getOmnipooFarms(Number(t)),n=await this.client.getRelayBlockNumber(),r=await Promise.all(e.map(async({keyArgs:i,value:a})=>{let[,s]=i,o=a,l=await this.client.getOmnipoolGlobalFarm(s),c=await this.client.getOmnipoolYieldFarm(Number(t),s,o);if(!l||!c)return;let m=l.reward_currency,d=l.incentivized_asset,p=this.getFarmAddress(s),g=await this.getOraclePrice(m,d),b=await this.balanceClient.getBalance(p,m);return{id:t,globalFarm:l,yieldFarm:c,priceAdjustment:g,balance:b}}));return n?r.map(i=>i?this.farmData(i,n):void 0):[]}async getAllIsolatedFarms(){let e=(await this.client.getAllIsolatedFarms()).reduce((r,i)=>r.includes(i.keyArgs[0].toString())?r:[...r,i.keyArgs[0].toString()],[]),n=await Promise.all(e.map(async r=>{let i=await this.getIsolatedFarms(r);if(i)return[r,i]}));return Object.fromEntries(n.filter(r=>!!r))}async getIsolatedFarms(t){let e=await this.client.getIsolatedFarms(t),n=await this.client.getRelayBlockNumber(),r=await Promise.all(e.map(async({keyArgs:i,value:a})=>{let[,s]=i,o=a,l=await this.client.getIsolatedGlobalFarm(s),c=await this.client.getIsolatedYieldFarm(t,s,o);if(!l||!c)return;let m=l.reward_currency,d=l.incentivized_asset,p=this.getFarmAddress(s,!0),g=await this.getOraclePrice(m,d),b=await this.balanceClient.getBalance(p,m);return{id:t,globalFarm:l,yieldFarm:c,priceAdjustment:g,balance:b,farmAddress:p}}));return n?r.map(i=>i?this.farmData(i,n,!0):void 0):[]}async getDepositReward(t,e,n,r){let i=e.global_farm_id,a=e.yield_farm_id,s=n?await this.client.getIsolatedYieldFarm(t,i,a):await this.client.getOmnipoolYieldFarm(Number(t),i,a),o=n?await this.client.getIsolatedGlobalFarm(i):await this.client.getOmnipoolGlobalFarm(i);if(!o||!s)return;let l=o.reward_currency,c=o.incentivized_asset,m=[[this.getFarmAddress(0,n),o.reward_currency],[this.getFarmAddress(o.id,n),o.reward_currency]],d=await this.getAccountAssetBalances(m),p=await this.getOraclePrice(l,c),g=new Pe(m,d),y=await new fe(P=>this.getFarmAddress(P),P=>this.client.getAsset(P),g).claimRewards(o,s,e,r,p??o.price_adjustment);if(!y)return;let h=await this.client.getAsset(y.assetId);if(h&&!(y.reward<=h.existential_deposit))return y}async getAccountAssetBalances(t){let[e,n]=await Promise.all([Promise.all(t.filter(([i,a])=>a!==0).map(([i,a])=>this.balanceClient.getTokenBalance(i,a))),Promise.all(t.filter(([i,a])=>a===0).map(([i])=>this.balanceClient.getSystemBalance(i)))]),r=[];for(let i=0,a=0;i+a<t.length;){let s=i+a,[,o]=t[s];o===0?(r.push(n[a]),a+=1):(r.push(e[i]),i+=1)}return r}};var Se=require("polkadot-api"),Ht=class extends D{omnipoolAssetIds=[];async getOraclePrice(t){return await this.api.query.EmaOracle.Oracles.getValue(Se.Binary.fromText("omnipool"),t,(0,Se.Enum)("TenMinutes"))}async getRelayBlockNumber(){return(await this.api.query.ParachainSystem.ValidationData.getValue())?.relay_parent_number}async getAllOmnipooFarms(){return this.api.query.OmnipoolWarehouseLM.ActiveYieldFarm.getEntries()}async getOmnipooFarms(t){return this.api.query.OmnipoolWarehouseLM.ActiveYieldFarm.getEntries(t)}async getOmnipoolGlobalFarm(t){return this.api.query.OmnipoolWarehouseLM.GlobalFarm.getValue(t)}async getOmnipoolYieldFarm(t,e,n){return this.api.query.OmnipoolWarehouseLM.YieldFarm.getValue(t,e,n)}async getAllIsolatedFarms(){return this.api.query.XYKWarehouseLM.ActiveYieldFarm.getEntries()}async getIsolatedFarms(t){return this.api.query.XYKWarehouseLM.ActiveYieldFarm.getEntries(t)}async getIsolatedGlobalFarm(t){return this.api.query.XYKWarehouseLM.GlobalFarm.getValue(t)}async getIsolatedYieldFarm(t,e,n){return this.api.query.XYKWarehouseLM.YieldFarm.getValue(t,e,n)}async getAsset(t){return this.api.query.AssetRegistry.Assets.getValue(t)}};var cn={};I(cn,{PoolContextProvider:()=>Bt,PoolError:()=>yt,PoolFactory:()=>At,PoolType:()=>k,aave:()=>ln,lbp:()=>rn,omni:()=>sn,stable:()=>an,xyk:()=>on});var rn={};I(rn,{LbpMath:()=>j,LbpPool:()=>Yt,LbpPoolClient:()=>Kt});var tt=require("@galacticcouncil/math-lbp"),j=class{static getSpotPrice(t,e,n,r,i){return(0,tt.get_spot_price)(t,e,n,r,i)}static calculateInGivenOut(t,e,n,r,i){return(0,tt.calculate_in_given_out)(t,e,n,r,i)}static calculateOutGivenIn(t,e,n,r,i){return(0,tt.calculate_out_given_in)(t,e,n,r,i)}static calculateLinearWeights(t,e,n,r,i){return(0,tt.calculate_linear_weights)(t,e,n,r,i)}static calculatePoolTradeFee(t,e,n){return(0,tt.calculate_pool_trade_fee)(t,e,n)}};var k=(i=>(i.Aave="Aave",i.LBP="LBP",i.Omni="Omnipool",i.Stable="Stableswap",i.XYK="XYK",i))(k||{}),yt=(i=>(i.InsufficientTradingAmount="InsufficientTradingAmount",i.MaxInRatioExceeded="MaxInRatioExceeded",i.MaxOutRatioExceeded="MaxOutRatioExceeded",i.TradeNotAllowed="TradeNotAllowed",i.UnknownError="UnknownError",i))(yt||{});var{FeeUtils:Nn}=O,Yt=class u{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;fee;repayFeeApply;static fromPool(t){return new u(t.address,t.tokens,t.maxInRatio,t.maxOutRatio,t.minTradingLimit,t.fee,t.repayFeeApply)}constructor(t,e,n,r,i,a,s){this.type="LBP",this.address=t,this.tokens=e,this.maxInRatio=n,this.maxOutRatio=r,this.minTradingLimit=i,this.fee=a,this.repayFeeApply=s}validatePair(t,e){return!0}parsePair(t,e){let n=new Map(this.tokens.map(a=>[a.id,a])),r=n.get(t),i=n.get(e);if(r==null)throw new Error("Pool does not contain tokenIn");if(i==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,balanceIn:r.balance,balanceOut:i.balance,decimalsIn:r.decimals,decimalsOut:i.decimals,weightIn:r.weight,weightOut:i.weight}}validateAndBuy(t,e,n){let r=this.tokens[0].id,i=[];e<this.minTradingLimit&&i.push("InsufficientTradingAmount");let a=t.balanceOut/this.maxOutRatio;if(e>a&&i.push("MaxOutRatioExceeded"),r===t.assetOut){let s=this.calculateTradeFee(e,n),o=Nn.toPct(this.repayFeeApply?n.repayFee:n.exchangeFee),l=e+s,c=this.calculateInGivenOut(t,l),m=t.balanceIn/this.maxInRatio;return c>m&&i.push("MaxInRatioExceeded"),{amountIn:c,calculatedIn:c,amountOut:e,feePct:o,errors:i}}else{let s=this.calculateInGivenOut(t,e),o=t.balanceIn/this.maxInRatio;return s>o&&i.push("MaxInRatioExceeded"),{amountIn:s,calculatedIn:s,amountOut:e,feePct:0,errors:i}}}validateAndSell(t,e,n){let r=this.tokens[0].id,i=[];e<this.minTradingLimit&&i.push("InsufficientTradingAmount");let a=t.balanceIn/this.maxInRatio;if(e>a&&i.push("MaxInRatioExceeded"),r===t.assetIn){let s=this.calculateOutGivenIn(t,e),o=t.balanceOut/this.maxOutRatio;return s>o&&i.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:s,amountOut:s,feePct:0,errors:i}}else{let s=this.calculateOutGivenIn(t,e),o=this.calculateTradeFee(s,n),l=Nn.toPct(this.repayFeeApply?n.repayFee:n.exchangeFee),c=s-o,m=t.balanceOut/this.maxOutRatio;return c>m&&i.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:s,amountOut:c,feePct:l,errors:i}}}calculateInGivenOut(t,e){let n=j.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=j.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=j.getSpotPrice(t.balanceOut.toString(),t.balanceIn.toString(),t.weightOut.toString(),t.weightIn.toString(),this.maxOutRatio.toString());return BigInt(e)}spotPriceOutGivenIn(t){let e=j.getSpotPrice(t.balanceIn.toString(),t.balanceOut.toString(),t.weightIn.toString(),t.weightOut.toString(),this.maxInRatio.toString());return BigInt(e)}calculateTradeFee(t,e){let n=j.calculatePoolTradeFee(t.toString(),this.repayFeeApply?e.repayFee[0]:e.exchangeFee[0],this.repayFeeApply?e.repayFee[1]:e.exchangeFee[1]);return BigInt(n)}};var Un=require("polkadot-api"),bt=require("rxjs");var Gn=(u,t=new Map)=>e=>{let n;return t.has(e)?t.get(e):(t.set(e,n=u(e)),n)};var v=require("rxjs");var nn=[{inputs:[],name:"decimals",outputs:[{internalType:"uint8",name:"",type:"uint8"}],stateMutability:"view",type:"function"},{inputs:[],name:"description",outputs:[{internalType:"string",name:"",type:"string"}],stateMutability:"view",type:"function"},{inputs:[],name:"version",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"uint80",name:"_roundId",type:"uint80"}],name:"getRoundData",outputs:[{internalType:"uint80",name:"roundId",type:"uint80"},{internalType:"int256",name:"answer",type:"int256"},{internalType:"uint256",name:"startedAt",type:"uint256"},{internalType:"uint256",name:"updatedAt",type:"uint256"},{internalType:"uint80",name:"answeredInRound",type:"uint80"}],stateMutability:"view",type:"function"},{inputs:[],name:"latestRoundData",outputs:[{internalType:"uint80",name:"roundId",type:"uint80"},{internalType:"int256",name:"answer",type:"int256"},{internalType:"uint256",name:"startedAt",type:"uint256"},{internalType:"uint256",name:"updatedAt",type:"uint256"},{internalType:"uint80",name:"answeredInRound",type:"uint80"}],stateMutability:"view",type:"function"}];var Xt=class{client;constructor(t){this.client=t.getWsProvider()}async getData(t,e=6){let[n,r,i]=await Promise.all([this.client.readContract({abi:nn,address:t,functionName:"latestRoundData"}),this.client.readContract({abi:nn,address:t,functionName:"decimals"}),this.client.getBlock()]),[a,s,o,l]=n,c=i.number-(i.timestamp-l)/BigInt(e),m=Number(c);return{price:s,decimals:r,updatedAt:m<0?0:m}}};var Y=class extends J{evm;mmOracle;override=[];mem=0;memPools=Gn(t=>(this.log(this.getPoolType(),"mem pools",t,"\u2705"),this.loadPools()));constructor(t,e){super(t),this.evm=e,this.mmOracle=new Xt(e)}async withOverride(t){this.override=t||[]}async getPoolsMem(){return this.memPools(this.mem)}async getPools(){let t=(0,v.from)(this.getPoolsMem()).pipe((0,v.switchMap)(e=>this.subscribe(e)),(0,v.combineLatestAll)());return(0,v.firstValueFrom)(t)}getSubscriber(){return(0,v.from)(this.getPoolsMem()).pipe((0,v.switchMap)(t=>this.subscribe(t)),(0,v.mergeAll)())}subscribe(t){return t.filter(e=>this.hasValidAssets(e)).map(e=>(0,v.combineLatest)([this.subscribePoolChange(e),this.subscribePoolBalance(e)]).pipe((0,v.debounceTime)(250),(0,v.map)(([n,r])=>this.updatePool(n,r))))}subscribePoolBalance(t){if(t.type==="Aave")return(0,v.of)([]);let e=[this.subscribeTokensBalance(t.address)];if(this.hasSystemAsset(t)){let n=this.subscribeSystemBalance(t.address);e.push(n)}if(this.hasErc20Asset(t)){let n=t.tokens.filter(i=>i.type==="Erc20").map(i=>i.id),r=this.subscribeErc20Balance(t.address,n);e.push(r)}return(0,v.combineLatest)(e).pipe((0,v.map)(n=>n.map(r=>Array.isArray(r)?r:[r]).flat()))}hasSystemAsset(t){return t.tokens.some(e=>e.id===0)}hasErc20Asset(t){return t.tokens.some(e=>e.type==="Erc20")}hasValidAssets(t){return t.tokens.every(({id:e,decimals:n,balance:r})=>{let i=this.override.find(s=>s.id===e),a=!!n||!!i?.decimals;return r>0n&&a})}updatePool=(t,e)=>{let n=t.tokens.map(r=>{let i=e.find(s=>s.id===r.id),a=this.override.find(s=>s.id===r.id);return i?{...r,balance:i.balance.transferable,decimals:r.decimals||a?.decimals}:{...r,decimals:r.decimals||a?.decimals}});return{...t,tokens:n}}};var Kt=class extends Y{MAX_FINAL_WEIGHT=100000000n;poolsData=new Map([]);async loadPools(){let[t,e,n]=await Promise.all([this.api.query.LBP.PoolData.getEntries(),this.api.query.ParachainSystem.ValidationData.getValue(),this.getPoolLimits()]),r=e?.relay_parent_number||0,i=t.filter(({value:a})=>e&&this.isActivePool(a,r)).map(async({keyArgs:a,value:s})=>{let[o]=a,l=o.toString(),c=await this.getPoolDelta(l,s,r);return{address:l,type:"LBP",fee:s.fee,...c,...n}});return Promise.all(i)}async getPoolDelta(t,e,n){let{start:r,end:i,assets:a,initial_weight:s,final_weight:o,repay_target:l,fee_collector:c}=e,m=j.calculateLinearWeights(r?r.toString():"0",i?i.toString():"0",s.toString(),o.toString(),n.toString()),[d,p]=a,g=BigInt(m),b=this.MAX_FINAL_WEIGHT-BigInt(g),[y,h,P,S,T]=await Promise.all([this.isRepayFeeApplied(d,l,c.toString()),this.getBalance(t,d),this.api.query.AssetRegistry.Assets.getValue(d),this.getBalance(t,p),this.api.query.AssetRegistry.Assets.getValue(p)]);return{repayFeeApply:y,tokens:[{id:d,decimals:P?.decimals,existentialDeposit:P?.existential_deposit,balance:h.transferable,weight:g,type:P?.asset_type.type},{id:p,decimals:T?.decimals,existentialDeposit:T?.existential_deposit,balance:S.transferable,weight:b,type:T?.asset_type.type}]}}isActivePool(t,e){let{start:n,end:r}=t;return n&&r?e>=n&&e<r:!1}async isRepayFeeApplied(t,e,n){if(e===0n)return!1;try{return(await this.getBalance(n,t)).transferable<e}catch{return!0}}async getRepayFee(){return await this.api.constants.LBP.repay_fee()}async getPoolLimits(){let[t,e,n]=await Promise.all([this.api.constants.LBP.MaxInRatio(),this.api.constants.LBP.MaxOutRatio(),this.api.constants.LBP.MinTradingLimit()]);return{maxInRatio:t,maxOutRatio:e,minTradingLimit:n}}async getPoolFees(t){return{repayFee:await this.getRepayFee(),exchangeFee:t.fee}}getPoolType(){return"LBP"}async isSupported(){let t=this.api.query.LBP.PoolData,e=await this.api.compatibilityToken;return t.isCompatible(Un.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,bt.switchMap)(r=>r?this.getPoolDelta(t.address,n,r.relay_parent_number):(0,bt.of)(t)),(0,bt.map)(r=>Object.assign({},t,r))):(0,bt.of)(t)}};var sn={};I(sn,{OmniMath:()=>B,OmniPool:()=>zt,OmniPoolClient:()=>$t});var w=require("@galacticcouncil/math-omnipool"),ht=nt(require("big.js")),B=class{static calculateSpotPrice(t,e,n,r){return(0,w.calculate_spot_price)(t,e,n,r)}static calculateLrnaSpotPrice(t,e){return(0,w.calculate_lrna_spot_price)(t,e)}static calculateInGivenOut(t,e,n,r,i,a,s,o,l){return(0,w.calculate_in_given_out)(t,e,n,r,i,a,s,o,l)}static calculateLrnaInGivenOut(t,e,n,r,i){return(0,w.calculate_lrna_in_given_out)(t,e,n,r,i)}static calculateOutGivenIn(t,e,n,r,i,a,s,o,l){return(0,w.calculate_out_given_in)(t,e,n,r,i,a,s,o,l)}static calculateOutGivenLrnaIn(t,e,n,r,i){return(0,w.calculate_out_given_lrna_in)(t,e,n,r,i)}static calculateShares(t,e,n,r){return(0,w.calculate_shares)(t,e,n,r)}static calculateLiquidityOut(t,e,n,r,i,a,s,o){return(0,w.calculate_liquidity_out)(t,e,n,r,i,a,s,o)}static calculateLiquidityLRNAOut(t,e,n,r,i,a,s,o){return(0,w.calculate_liquidity_lrna_out)(t,e,n,r,i,a,s,o)}static calculateCapDifference(t,e,n,r){let i=(0,ht.default)(e),a=(0,ht.default)(t),s=(0,ht.default)(r),o=(0,ht.default)(n),l=(0,ht.default)(10).pow(18),c=o.div(l);if(i.div(s).lt(c)){let d=c.times(s).minus(i).times(a),p=i.times((0,ht.default)(1).minus(c));return d.div(p).toFixed(0)}else return"0"}static verifyAssetCap(t,e,n,r){return(0,w.verify_asset_cap)(t,e,n,r)}static calculateLimitHubIn(t,e,n,r){return(0,w.calculate_liquidity_hub_in)(t,e,n,r)}static isSellAllowed(t){return(0,w.is_sell_allowed)(t)}static isBuyAllowed(t){return(0,w.is_buy_allowed)(t)}static isAddLiquidityAllowed(t){return(0,w.is_add_liquidity_allowed)(t)}static isRemoveLiquidityAllowed(t){return(0,w.is_remove_liquidity_allowed)(t)}};var{FeeUtils:It}=O,zt=class u{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;hubAssetId;static fromPool(t){return new u(t.address,t.tokens,t.maxInRatio,t.maxOutRatio,t.minTradingLimit,t.hubAssetId)}constructor(t,e,n,r,i,a){this.type="Omnipool",this.address=t,this.tokens=e,this.maxInRatio=n,this.maxOutRatio=r,this.minTradingLimit=i,this.hubAssetId=a}validatePair(t,e){return this.hubAssetId!=e}parsePair(t,e){let n=new Map(this.tokens.map(a=>[a.id,a])),r=n.get(t),i=n.get(e);if(r==null)throw new Error("Pool does not contain tokenIn");if(i==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,hubReservesIn:r.hubReserves,hubReservesOut:i.hubReserves,sharesIn:r.shares,sharesOut:i.shares,decimalsIn:r.decimals,decimalsOut:i.decimals,balanceIn:r.balance,balanceOut:i.balance,tradeableIn:r.tradeable,tradeableOut:i.tradeable,assetInEd:r.existentialDeposit,assetOutEd:i.existentialDeposit}}validateAndBuy(t,e,n){let r=this.calculateInGivenOut(t,e),i=this.calculateInGivenOut(t,e,n),a=r===0n?0:A.calculateDiffToRef(i,r),s=[],o=B.isSellAllowed(t.tradeableIn),l=B.isBuyAllowed(t.tradeableOut);(!o||!l)&&s.push("TradeNotAllowed"),(e<this.minTradingLimit||r<t.assetInEd)&&s.push("InsufficientTradingAmount");let c=t.balanceOut/this.maxOutRatio;e>c&&s.push("MaxOutRatioExceeded");let m=t.balanceIn/this.maxInRatio;return i>m&&s.push("MaxInRatioExceeded"),{amountIn:i,calculatedIn:r,amountOut:e,feePct:a,errors:s}}validateAndSell(t,e,n){let r=this.calculateOutGivenIn(t,e),i=this.calculateOutGivenIn(t,e,n),a=A.calculateDiffToRef(r,i),s=[],o=B.isSellAllowed(t.tradeableIn),l=B.isBuyAllowed(t.tradeableOut);(!o||!l)&&s.push("TradeNotAllowed"),(e<this.minTradingLimit||r<t.assetOutEd)&&s.push("InsufficientTradingAmount");let c=t.balanceIn/this.maxInRatio;e>c&&s.push("MaxInRatioExceeded");let m=t.balanceOut/this.maxOutRatio;return i>m&&s.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:r,amountOut:i,feePct:a,errors:s}}calculateInGivenOut(t,e,n){if(t.assetIn==this.hubAssetId)return this.calculateLrnaInGivenOut(t,e,n);let r=B.calculateInGivenOut(t.balanceIn.toString(),t.hubReservesIn.toString(),t.sharesIn.toString(),t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),n?It.toRaw(n.assetFee).toString():"0",n?It.toRaw(n.protocolFee).toString():"0"),i=BigInt(r);return i<0n?0n:i}calculateLrnaInGivenOut(t,e,n){let r=B.calculateLrnaInGivenOut(t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),n?It.toRaw(n.assetFee).toString():"0"),i=BigInt(r);return i<0n?0n:i}calculateOutGivenIn(t,e,n){if(t.assetIn==this.hubAssetId)return this.calculateOutGivenLrnaIn(t,e,n);let r=B.calculateOutGivenIn(t.balanceIn.toString(),t.hubReservesIn.toString(),t.sharesIn.toString(),t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),n?It.toRaw(n.assetFee).toString():"0",n?It.toRaw(n.protocolFee).toString():"0"),i=BigInt(r);return i<0n?0n:i}calculateOutGivenLrnaIn(t,e,n){let r=B.calculateOutGivenLrnaIn(t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),n?It.toRaw(n.assetFee).toString():"0"),i=BigInt(r);return i<0n?0n:i}spotPriceInGivenOut(t){if(t.assetIn==this.hubAssetId)return this.spotPriceLrnaInGivenOut(t);let e=B.calculateSpotPrice(t.balanceOut.toString(),t.hubReservesOut.toString(),t.balanceIn.toString(),t.hubReservesIn.toString()),n=Math.pow(10,18-t.decimalsOut);return BigInt(e)/BigInt(n)}spotPriceLrnaInGivenOut(t){let e=B.calculateLrnaSpotPrice(t.hubReservesOut.toString(),t.balanceOut.toString()),n=Math.pow(10,18-t.decimalsOut);return BigInt(e)/BigInt(n)}spotPriceOutGivenIn(t){if(t.assetIn==this.hubAssetId)return this.spotPriceOutGivenLrnaIn(t);let e=B.calculateSpotPrice(t.balanceIn.toString(),t.hubReservesIn.toString(),t.balanceOut.toString(),t.hubReservesOut.toString()),n=Math.pow(10,18-t.decimalsIn);return BigInt(e)/BigInt(n)}spotPriceOutGivenLrnaIn(t){let e=B.calculateLrnaSpotPrice(t.balanceOut.toString(),t.hubReservesOut.toString()),n=Math.pow(10,18-t.decimalsIn);return BigInt(e)/BigInt(n)}};var Te=require("polkadot-api"),Vn=require("@polkadot-api/utils"),jt=require("rxjs");var{FeeUtils:ut}=O,$t=class extends Y{async loadPools(){let t=await this.api.constants.Omnipool.HubAssetId(),e=this.getPoolAddress(),[n,r,i,a,s]=await Promise.all([this.api.query.Omnipool.Assets.getEntries(),this.api.query.Omnipool.HubAssetTradability.getValue(),this.api.query.AssetRegistry.Assets.getValue(t),this.getBalance(e,t),this.getPoolLimits()]),o=n.map(async({keyArgs:c,value:m})=>{let[d]=c,{hub_reserve:p,shares:g,tradable:b,cap:y,protocol_shares:h}=m,[P,S]=await Promise.all([this.api.query.AssetRegistry.Assets.getValue(d),this.getBalance(e,d)]);return{id:d,decimals:P?.decimals,existentialDeposit:P?.existential_deposit,balance:S.transferable,cap:y,hubReserves:p,protocolShares:h,shares:g,tradeable:b,type:P?.asset_type.type}}),l=await Promise.all(o);return l.push({id:t,decimals:i?.decimals,existentialDeposit:i?.existential_deposit,balance:a.transferable,tradeable:r,type:i?.asset_type.type}),[{address:e,type:"Omnipool",hubAssetId:t,tokens:l,...s}]}getPoolAddress(){let t="modlomnipool".padEnd(32,"\0"),e=new TextEncoder().encode(t),n=(0,Vn.toHex)(e);return(0,Te.AccountId)(63).dec(n)}async getPoolLimits(){let[t,e,n]=await Promise.all([this.api.constants.Omnipool.MaxInRatio(),this.api.constants.Omnipool.MaxOutRatio(),this.api.constants.Omnipool.MinimumTradingLimit()]);return{maxInRatio:t,maxOutRatio:e,minTradingLimit:n}}async getPoolFees(t,e){let[n,r,i]=await Promise.all([this.api.constants.DynamicFees.AssetFeeParameters(),this.api.constants.DynamicFees.ProtocolFeeParameters(),this.api.query.DynamicFees.AssetFee.getValue(e)]),a=n.min_fee+r.min_fee,s=n.max_fee+r.max_fee;if(i){let{asset_fee:o,protocol_fee:l}=i;return{assetFee:ut.fromPermill(o),protocolFee:ut.fromPermill(l),min:ut.fromPermill(a),max:ut.fromPermill(s)}}else return{assetFee:ut.fromPermill(n.min_fee),protocolFee:ut.fromPermill(r.min_fee),min:ut.fromPermill(a),max:ut.fromPermill(s)}}getPoolType(){return"Omnipool"}async isSupported(){let t=this.api.query.Omnipool.Assets,e=await this.api.compatibilityToken;return t.isCompatible(Te.CompatibilityLevel.BackwardsCompatible,e)}subscribePoolChange(t){return this.api.query.Omnipool.Assets.watchEntries({at:"best"}).pipe((0,jt.distinctUntilChanged)((n,r)=>!r.deltas),(0,jt.map)(({entries:n})=>n.map(r=>{let[i]=r.args,{hub_reserve:a,shares:s,tradable:o,cap:l,protocol_shares:c}=r.value,m=t.tokens.findIndex(p=>p.id===i);return{...t.tokens[m],cap:l,hubReserves:a,protocolShares:c,shares:s,tradeable:o}})),(0,jt.map)(n=>{let r=t.tokens.find(i=>i.id===1);return{...t,tokens:[...n,r]}}))}};var an={};I(an,{StableMath:()=>C,StableSwap:()=>Qt,StableSwapClient:()=>Jt});var R=require("@galacticcouncil/math-stableswap"),C=class{static getPoolAddress(t){return(0,R.pool_account_name)(t)}static defaultPegs(t){let e=[];for(let n=0;n<t;n++)e.push(["1","1"]);return e}static calculateAmplification(t,e,n,r,i){return(0,R.calculate_amplification)(t,e,n,r,i)}static calculateInGivenOut(t,e,n,r,i,a,s){return(0,R.calculate_in_given_out)(t,e,n,r,i,a,s)}static calculateAddOneAsset(t,e,n,r,i,a,s){return(0,R.calculate_add_one_asset)(t,e,n,r,i,a,s)}static calculateSharesForAmount(t,e,n,r,i,a,s){return(0,R.calculate_shares_for_amount)(t,e,n,r,i,a,s)}static calculateOutGivenIn(t,e,n,r,i,a,s){return(0,R.calculate_out_given_in)(t,e,n,r,i,a,s)}static calculateLiquidityOutOneAsset(t,e,n,r,i,a,s){return(0,R.calculate_liquidity_out_one_asset)(t,e,n,r,i,a,s)}static calculateShares(t,e,n,r,i,a){return(0,R.calculate_shares)(t,e,n,r,i,a)}static calculateSpotPriceWithFee(t,e,n,r,i,a,s,o){return(0,R.calculate_spot_price_with_fee)(t,e,n,r,i,a,s,o)}static recalculatePegs(t,e,n,r,i){let a=(0,R.recalculate_peg)(t,e,n,r,i);return JSON.parse(a)}};var{FeeUtils:mt}=O,Qt=class u{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;amplification;id;fee;totalIssuance;static fromPool(t){return new u(t.address,t.tokens,t.maxInRatio,t.maxOutRatio,t.minTradingLimit,t.amplification,t.id,t.fee,t.totalIssuance)}constructor(t,e,n,r,i,a,s,o,l){this.type="Stableswap",this.address=t,this.tokens=e,this.maxInRatio=n,this.maxOutRatio=r,this.minTradingLimit=i,this.amplification=a,this.id=s,this.fee=o,this.totalIssuance=l}validatePair(t,e){return!0}parsePair(t,e){let n=new Map(this.tokens.map(a=>[a.id,a])),r=n.get(t),i=n.get(e);if(r==null)throw new Error("Pool does not contain tokenIn");if(i==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,balanceIn:r.balance,balanceOut:i.balance,decimalsIn:r.decimals,decimalsOut:i.decimals,tradeableIn:this.id===t?15:r.tradeable,tradeableOut:this.id===e?15:i.tradeable,assetInEd:r.existentialDeposit,assetOutEd:i.existentialDeposit}}validateAndBuy(t,e,n){let r=this.calculateInGivenOut(t,e),i=this.calculateInGivenOut(t,e,n),a=mt.toPct(n.fee),s=[],o=B.isSellAllowed(t.tradeableIn),l=B.isBuyAllowed(t.tradeableOut);return(!o||!l)&&s.push("TradeNotAllowed"),(e<this.minTradingLimit||r<t.assetInEd)&&s.push("InsufficientTradingAmount"),{amountIn:i,calculatedIn:r,amountOut:e,feePct:a,errors:s}}validateAndSell(t,e,n){let r=this.calculateOutGivenIn(t,e),i=this.calculateOutGivenIn(t,e,n),a=mt.toPct(n.fee),s=[],o=B.isSellAllowed(t.tradeableIn),l=B.isBuyAllowed(t.tradeableOut);return(!o||!l)&&s.push("TradeNotAllowed"),(e<this.minTradingLimit||r<t.assetOutEd)&&s.push("InsufficientTradingAmount"),{amountIn:e,calculatedOut:r,amountOut:i,feePct:a,errors:s}}calculateIn(t,e,n){let r=C.calculateInGivenOut(this.getReserves(),Number(t.assetIn),Number(t.assetOut),e.toString(),this.amplification.toString(),n?mt.toRaw(n.fee).toString():"0",this.getPegs()),i=BigInt(r);return i<0n?0n:i}calculateAddOneAsset(t,e,n){let r=C.calculateAddOneAsset(this.getReserves(),e.toString(),Number(t.assetIn),this.amplification.toString(),this.totalIssuance.toString(),n?mt.toRaw(n.fee).toString():"0",this.getPegs()),i=BigInt(r);return i<0n?0n:i}calculateSharesForAmount(t,e,n){let r=C.calculateSharesForAmount(this.getReserves(),Number(t.assetOut),e.toString(),this.amplification.toString(),this.totalIssuance.toString(),n?mt.toRaw(n.fee).toString():"0",this.getPegs()),i=BigInt(r);return i<0n?0n:i}calculateInGivenOut(t,e,n){return t.assetOut==this.id?this.calculateAddOneAsset(t,e,n):t.assetIn==this.id?this.calculateSharesForAmount(t,e,n):this.calculateIn(t,e,n)}spotPriceInGivenOut(t){let e=C.calculateSpotPriceWithFee(this.id.toString(),this.getReserves(),this.amplification.toString(),t.assetOut.toString(),t.assetIn.toString(),this.totalIssuance.toString(),"0",this.getPegs());if(t.assetOut==this.id)return BigInt(e);if(t.assetIn==this.id){let r=Math.pow(10,t.decimalsIn-t.decimalsOut);return BigInt(e)/BigInt(r)}let n=Math.pow(10,18-t.decimalsIn);return BigInt(e)/BigInt(n)}calculateOut(t,e,n){let r=C.calculateOutGivenIn(this.getReserves(),Number(t.assetIn),Number(t.assetOut),e.toString(),this.amplification.toString(),n?mt.toRaw(n.fee).toString():"0",this.getPegs()),i=BigInt(r);return i<0n?0n:i}calculateWithdrawOneAsset(t,e,n){let r=C.calculateLiquidityOutOneAsset(this.getReserves(),e.toString(),Number(t.assetOut),this.amplification.toString(),this.totalIssuance.toString(),n?mt.toRaw(n.fee).toString():"0",this.getPegs()),i=BigInt(r);return i<0n?0n:i}calculateShares(t,e,n){let r=C.calculateShares(this.getReserves(),this.getAssets(t.assetIn,e),this.amplification.toString(),this.totalIssuance.toString(),n?mt.toRaw(n.fee).toString():"0",this.getPegs()),i=BigInt(r);return i<0n?0n:i}calculateOutGivenIn(t,e,n){return t.assetIn==this.id?this.calculateWithdrawOneAsset(t,e,n):t.assetOut==this.id?this.calculateShares(t,e,n):this.calculateOut(t,e,n)}spotPriceOutGivenIn(t){let e=C.calculateSpotPriceWithFee(this.id.toString(),this.getReserves(),this.amplification.toString(),t.assetIn.toString(),t.assetOut.toString(),this.totalIssuance.toString(),"0",this.getPegs());if(t.assetIn==this.id)return BigInt(e);if(t.assetOut==this.id){let r=Math.pow(10,t.decimalsOut-t.decimalsIn);return BigInt(e)/BigInt(r)}let n=Math.pow(10,18-t.decimalsOut);return BigInt(e)/BigInt(n)}getPegs(){let t=C.defaultPegs(this.tokens.length-1);return JSON.stringify(t)}getReserves(){let t=this.tokens.filter(e=>e.id!=this.id).map(({id:e,balance:n,decimals:r})=>({asset_id:e,amount:n,decimals:r}));return JSON.stringify(t,lt.jsonFormatter)}getAssets(t,e){let n={asset_id:Number(t),amount:e.toString()};return JSON.stringify([n],lt.jsonFormatter)}};var we=require("polkadot-api"),Wn=require("@polkadot-api/utils"),Hn=require("@noble/hashes/blake2b"),vt=require("rxjs");var{FeeUtils:Pt}=O,Jt=class extends Y{poolsData=new Map([]);getPoolType(){return"Stableswap"}getPoolAddress(t){let e=C.getPoolAddress(t),n=(0,Hn.blake2b)(e,{dkLen:32}),r=(0,Wn.toHex)(n);return(0,we.AccountId)(63).dec(r)}async getPoolLimits(){return{maxInRatio:0n,maxOutRatio:0n,minTradingLimit:await this.api.constants.Stableswap.MinTradingLimit()}}async getPoolDelta(t,e,n){let{initial_amplification:r,final_amplification:i,initial_block:a,final_block:s}=e,o=C.calculateAmplification(r.toString(),i.toString(),a.toString(),s.toString(),n.toString()),l=await this.api.query.Tokens.TotalIssuance.getValue(t);return{amplification:BigInt(o),totalIssuance:l}}async getPoolTokens(t,e){let n=this.getPoolAddress(t),r=e.assets.map(async i=>{let[a,s,o]=await Promise.all([this.api.query.Stableswap.AssetTradability.getValue(t,i),this.api.query.AssetRegistry.Assets.getValue(i),this.getBalance(n,i)]);return{id:i,decimals:s?.decimals,existentialDeposit:s?.existential_deposit,balance:o.transferable,tradeable:a,type:s?.asset_type.type}});return Promise.all(r)}async isSupported(){let t=this.api.query.Stableswap.Pools,e=await this.api.compatibilityToken;return t.isCompatible(we.CompatibilityLevel.BackwardsCompatible,e)}async loadPools(){let[t,e,n]=await Promise.all([this.api.query.Stableswap.Pools.getEntries(),this.api.query.System.Number.getValue(),this.getPoolLimits()]),r=t.map(async({keyArgs:i,value:a})=>{let[s]=i,o=this.getPoolAddress(s),[l,c,m]=await Promise.all([this.getPoolDelta(s,a,e),this.getPoolTokens(s,a),this.getPoolPegs(s,a,e)]);return c.push({id:s,tradeable:15,balance:l.totalIssuance,decimals:18}),this.poolsData.set(o,a),{address:o,id:s,type:"Stableswap",fee:Pt.fromPermill(a.fee),tokens:c,...l,...m,...n}});return Promise.all(r)}async getPoolFees(t){return{fee:t.fee}}async getPoolPegs(t,e,n){let r=await this.api.query.Stableswap.PoolPegs.getValue(t);if(!r)return this.getDefaultPegs(e);let i=await this.getLatestPegs(e,r,n),a=this.getRecentPegs(r),s=Pt.fromPermill(r.max_peg_update),o=Pt.fromPermill(e.fee),[l,c]=C.recalculatePegs(JSON.stringify(a),JSON.stringify(i),n.toString(),Pt.toRaw(s).toString(),Pt.toRaw(o).toString()),m=Number(l)*1e6;return{pegsFee:Pt.fromPermill(m),pegs:c}}getDefaultPegs(t){let e=t.fee,n=C.defaultPegs(t.assets.length);return{pegsFee:Pt.fromPermill(e),pegs:n}}getRecentPegs(t){let{current:e}=t;return Array.from(e.entries()).map(([n,r])=>r.map(i=>i.toString()))}async getLatestPegs(t,e,n){let{source:r}=e,i=Array.from(t.assets.entries()).map(([s,o])=>o),a=r.map(async(s,o)=>{if(s.type==="Oracle"){let[l,c,m]=s.value,d=[m,i[o]].sort((P,S)=>P-S),p=await this.api.query.EmaOracle.Oracles.getValue(l,d,c);if(!p)return;let[{price:g,updated_at:b}]=p,y=g.n.toString(),h=g.d.toString();return m.toString()===d[0].toString()?[[y,h],b.toString()]:[[h,y],b.toString()]}else if(s.type==="MMOracle"){let l=s.value.asHex(),{price:c,decimals:m,updatedAt:d}=await this.mmOracle.getData(l),p=10**m;return[[c.toString(),p.toString()],d.toString()]}else return[s.value.map(l=>l.toString()),n.toString()]});return Promise.all(a)}subscribePoolChange(t){let e=this.api.query.System.Number,n=this.poolsData.get(t.address);return!n||!t.id?(0,vt.of)(t):e.watchValue("best").pipe((0,vt.switchMap)(r=>Promise.all([this.getPoolDelta(t.id,n,r),this.getPoolPegs(t.id,n,r)])),(0,vt.map)(([r,i])=>{let a=t.tokens.map(s=>s.id===t.id?{...s,balance:r.totalIssuance}:s);return Object.assign(t,{tokens:a},r,i)}))}};var on={};I(on,{XykMath:()=>st,XykPool:()=>Zt,XykPoolClient:()=>te});var F=require("@galacticcouncil/math-xyk"),st=class{static getSpotPrice(t,e,n){return(0,F.get_spot_price)(t,e,n)}static calculateInGivenOut(t,e,n){return(0,F.calculate_in_given_out)(t,e,n)}static calculateOutGivenIn(t,e,n){return(0,F.calculate_out_given_in)(t,e,n)}static calculatePoolTradeFee(t,e,n){return(0,F.calculate_pool_trade_fee)(t,e,n)}static calculateLiquidityIn(t,e,n){return(0,F.calculate_liquidity_in)(t,e,n)}static calculateSpotPrice(t,e){return(0,F.calculate_spot_price)(t,e)}static calculateSpotPriceWithFee(t,e,n,r){return(0,F.calculate_spot_price_with_fee)(t,e,n,r)}static calculateShares(t,e,n){return(0,F.calculate_shares)(t,e,n)}static calculateLiquidityOutAssetA(t,e,n,r){return(0,F.calculate_liquidity_out_asset_a)(t,e,n,r)}static calculateLiquidityOutAssetB(t,e,n,r){return(0,F.calculate_liquidity_out_asset_b)(t,e,n,r)}};var{FeeUtils:Yn}=O,Zt=class u{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;static fromPool(t){return new u(t.address,t.tokens,t.maxInRatio,t.maxOutRatio,t.minTradingLimit)}constructor(t,e,n,r,i){this.type="XYK",this.address=t,this.tokens=e,this.maxInRatio=n,this.maxOutRatio=r,this.minTradingLimit=i}validatePair(t,e){return!0}parsePair(t,e){let n=new Map(this.tokens.map(a=>[a.id,a])),r=n.get(t),i=n.get(e);if(r==null)throw new Error("Pool does not contain tokenIn");if(i==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,decimalsIn:r.decimals,decimalsOut:i.decimals,balanceIn:r.balance,balanceOut:i.balance,assetInEd:r.existentialDeposit,assetOutEd:i.existentialDeposit}}validateAndBuy(t,e,n){let r=this.calculateInGivenOut(t,e),i=this.calculateTradeFee(r,n),a=Yn.toPct(n.exchangeFee),s=r+i,o=[];(e<this.minTradingLimit||r<t.assetInEd)&&o.push("InsufficientTradingAmount");let l=t.balanceOut/this.maxOutRatio;e>l&&o.push("MaxOutRatioExceeded");let c=t.balanceIn/this.maxInRatio;return s>c&&o.push("MaxInRatioExceeded"),{amountIn:s,calculatedIn:r,amountOut:e,feePct:a,errors:o}}validateAndSell(t,e,n){let r=this.calculateOutGivenIn(t,e),i=this.calculateTradeFee(r,n),a=Yn.toPct(n.exchangeFee),s=r-i,o=[];(e<this.minTradingLimit||r<t.assetOutEd)&&o.push("InsufficientTradingAmount");let l=t.balanceIn/this.maxInRatio;e>l&&o.push("MaxInRatioExceeded");let c=t.balanceOut/this.maxOutRatio;return s>c&&o.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:r,amountOut:s,feePct:a,errors:o}}calculateInGivenOut(t,e){let n=st.calculateInGivenOut(t.balanceIn.toString(),t.balanceOut.toString(),e.toString()),r=BigInt(n);return r<0n?0n:r}calculateOutGivenIn(t,e){let n=st.calculateOutGivenIn(t.balanceIn.toString(),t.balanceOut.toString(),e.toString()),r=BigInt(n);return r<0n?0n:r}spotPriceInGivenOut(t){let e=st.calculateSpotPrice(t.balanceOut.toString(),t.balanceIn.toString()),n=Math.pow(10,18-t.decimalsOut);return BigInt(e)/BigInt(n)}spotPriceOutGivenIn(t){let e=st.calculateSpotPrice(t.balanceIn.toString(),t.balanceOut.toString()),n=Math.pow(10,18-t.decimalsIn);return BigInt(e)/BigInt(n)}calculateTradeFee(t,e){let n=st.calculatePoolTradeFee(t.toString(),e.exchangeFee[0],e.exchangeFee[1]);return BigInt(n)}};var Xn=require("polkadot-api"),Kn=require("rxjs");var te=class extends Y{async loadPools(){let t=this.api.query.XYK.PoolAssets,[e,n]=await Promise.all([t.getEntries(),this.getPoolLimits()]),r=e.map(async({keyArgs:i,value:a})=>{let[s]=i,[o,l]=a,[c,m,d,p]=await Promise.all([this.getBalance(s,o),this.api.query.AssetRegistry.Assets.getValue(o),this.getBalance(s,l),this.api.query.AssetRegistry.Assets.getValue(l)]);return{address:s,type:"XYK",tokens:[{id:o,decimals:m?.decimals,existentialDeposit:m?.existential_deposit,balance:c.transferable,type:m?.asset_type.type},{id:l,decimals:p?.decimals,existentialDeposit:p?.existential_deposit,balance:d.transferable,type:p?.asset_type.type}],...n}});return Promise.all(r)}async getExchangeFee(){return await this.api.constants.XYK.GetExchangeFee()}async getPoolLimits(){let[t,e,n]=await Promise.all([this.api.constants.XYK.MaxInRatio(),this.api.constants.XYK.MaxOutRatio(),this.api.constants.XYK.MinTradingLimit()]);return{maxInRatio:t,maxOutRatio:e,minTradingLimit:n}}async getPoolFees(){return{exchangeFee:await this.getExchangeFee()}}getPoolType(){return"XYK"}async isSupported(){let t=this.api.query.XYK.PoolAssets,e=await this.api.compatibilityToken;return t.isCompatible(Xn.CompatibilityLevel.BackwardsCompatible,e)}subscribePoolChange(t){return(0,Kn.of)(t)}};var ln={};I(ln,{AavePool:()=>ee,AavePoolClient:()=>ne});var ee=class u{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;static fromPool(t){return new u(t.address,t.tokens,t.maxInRatio,t.maxOutRatio,t.minTradingLimit)}constructor(t,e,n,r,i){this.type="Aave",this.address=t,this.tokens=e,this.maxInRatio=n,this.maxOutRatio=r,this.minTradingLimit=i}validatePair(t,e){return!0}parsePair(t,e){let n=new Map(this.tokens.map(a=>[a.id,a])),r=n.get(t),i=n.get(e);if(r==null)throw new Error("Pool does not contain tokenIn");if(i==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,balanceIn:r.balance,balanceOut:i.balance,decimalsIn:r.decimals,decimalsOut:i.decimals,assetInEd:0n,assetOutEd:0n}}validateAndBuy(t,e,n){let r=this.calculateInGivenOut(t,e),i=[];return e>t.balanceOut&&i.push("TradeNotAllowed"),{amountIn:r,calculatedIn:r,amountOut:e,feePct:0,errors:i}}validateAndSell(t,e,n){let r=this.calculateOutGivenIn(t,e),i=[];return r>t.balanceOut&&i.push("TradeNotAllowed"),{amountIn:e,calculatedOut:r,amountOut:r,feePct:0,errors:i}}calculateInGivenOut(t,e){return e}calculateOutGivenIn(t,e){return e}spotPriceInGivenOut(t){let e=Math.pow(10,t.decimalsOut);return BigInt(e)}spotPriceOutGivenIn(t){let e=Math.pow(10,t.decimalsIn);return BigInt(e)}calculateTradeFee(t,e){return 0n}};var jn=require("polkadot-api"),$n=require("@polkadot-api/utils"),Ot=require("rxjs"),Qn=require("viem");var zn=[{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"reserve",type:"address"},{indexed:!1,internalType:"address",name:"user",type:"address"},{indexed:!0,internalType:"address",name:"onBehalfOf",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"},{indexed:!0,internalType:"uint16",name:"referralCode",type:"uint16"}],name:"Supply",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"reserve",type:"address"},{indexed:!0,internalType:"address",name:"user",type:"address"},{indexed:!0,internalType:"address",name:"to",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"}],name:"Withdraw",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"reserve",type:"address"},{indexed:!1,internalType:"address",name:"user",type:"address"},{indexed:!0,internalType:"address",name:"onBehalfOf",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"},{indexed:!1,internalType:"enum DataTypes.InterestRateMode",name:"interestRateMode",type:"uint8"},{indexed:!1,internalType:"uint256",name:"borrowRate",type:"uint256"},{indexed:!0,internalType:"uint16",name:"referralCode",type:"uint16"}],name:"Borrow",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"reserve",type:"address"},{indexed:!0,internalType:"address",name:"user",type:"address"},{indexed:!0,internalType:"address",name:"repayer",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"},{indexed:!1,internalType:"bool",name:"useATokens",type:"bool"}],name:"Repay",type:"event"}];var{ERC20:Mr}=dt,Lr=["Supply","Withdraw","Repay","Borrow"],ne=class extends Y{async loadPools(){let e=(await this.api.apis.AaveTradeExecutor.pools()).map(async({reserve:n,atoken:r,liqudity_in:i,liqudity_out:a})=>{let[s,o,l,c]=await Promise.all([this.api.query.AssetRegistry.Assets.getValue(n),this.api.query.AssetRegistry.AssetLocations.getValue(n),this.api.query.AssetRegistry.Assets.getValue(r),this.api.query.AssetRegistry.AssetLocations.getValue(r)]);return{address:this.getPoolId(n,r),type:"Aave",tokens:[{id:n,decimals:s?.decimals,existentialDeposit:s?.existential_deposit,balance:i,location:o,type:s?.asset_type.type},{id:r,decimals:l?.decimals,existentialDeposit:l?.existential_deposit,balance:a,location:c,type:l?.asset_type.type}],...this.getPoolLimits()}});return Promise.all(e)}async getPoolDelta(t){let[e,n]=t.tokens,{liqudity_in:r,liqudity_out:i}=await this.api.apis.AaveTradeExecutor.pool(e.id,n.id);return t.tokens.map(a=>{let s=a.id===e.id?r:i;return{...a,balance:s}})}getPoolId(t,e){let n=t+"/"+e,r=new TextEncoder().encode(n.padEnd(32,"\0")),i=(0,$n.toHex)(r);return(0,jn.AccountId)(63).dec(i)}getPoolLimits(){return{maxInRatio:0n,maxOutRatio:0n,minTradingLimit:0n}}async getPoolFees(t,e){return{}}getPoolType(){return"Aave"}async isSupported(){return!0}subscribePoolChange(t){let[e,n]=t.tokens,r=this.getReserveH160Id(e),i=this.api.event.Router.Executed.watch(({asset_in:s,asset_out:o})=>s===n.id||o===n.id),a=this.api.event.EVM.Log.watch(({log:s})=>{let{topics:o,data:l}=s,c=o.map(g=>g.asHex()),m=l.asHex(),{eventName:d,args:p}=(0,Qn.decodeEventLog)({abi:zn,topics:c,data:m});return Lr.includes(d)&&p.reserve.toLowerCase()===r.toLowerCase()});return(0,Ot.merge)([i,a]).pipe((0,Ot.switchMap)(()=>this.getPoolDelta(t)),(0,Ot.map)(s=>({...t,tokens:[...s]})))}getReserveH160Id(t){return t.type==="Erc20"?lt.findNestedKey(t.location,"AccountKey20").AccountKey20.key:Mr.fromAssetId(t.id)}};var At=class{static get(t){switch(t.type){case"Aave":return ee.fromPool(t);case"XYK":return Zt.fromPool(t);case"Omnipool":return zt.fromPool(t);case"LBP":return Yt.fromPool(t);case"Stableswap":return Qt.fromPool(t);default:throw new Error("Pool type "+t.type+" is not supported yet")}}};var et=require("rxjs");var Bt=class extends D{evm;lbpClient;omniClient;stableClient;xykClient;aaveClient;active=new Set([]);clients=[];pools=new Map([]);lbpSub=et.Subscription.EMPTY;omniSub=et.Subscription.EMPTY;stableSub=et.Subscription.EMPTY;xykSub=et.Subscription.EMPTY;aaveSub=et.Subscription.EMPTY;isReady=!1;isDestroyed=new et.Subject;constructor(t,e){super(t),this.evm=e,this.lbpClient=new Kt(t,e),this.omniClient=new $t(t,e),this.stableClient=new Jt(t,e),this.xykClient=new te(t,e),this.aaveClient=new ne(t,e),this.clients=[this.lbpClient,this.omniClient,this.stableClient,this.xykClient,this.aaveClient]}subscribe(t){return t.getSubscriber().pipe((0,et.takeUntil)(this.isDestroyed)).subscribe(e=>{this.pools.set(e.address,e)})}withOmnipool(){return this.omniSub.unsubscribe(),this.omniSub=this.subscribe(this.omniClient),this.active.add("Omnipool"),this}withStableswap(){return this.stableSub.unsubscribe(),this.stableSub=this.subscribe(this.stableClient),this.active.add("Stableswap"),this}withLbp(){return this.lbpSub.unsubscribe(),this.lbpSub=this.subscribe(this.lbpClient),this.active.add("LBP"),this}withAave(){return this.aaveSub.unsubscribe(),this.aaveSub=this.subscribe(this.aaveClient),this.active.add("Aave"),this}withXyk(t){return this.xykClient.withOverride(t),this.xykSub.unsubscribe(),this.xykSub=this.subscribe(this.xykClient),this.active.add("XYK"),this}destroy(){this.isDestroyed.next(!0),this.isDestroyed.complete(),this.active.clear(),this.pools.clear(),this.isReady=!1}async getPools(t={}){if(this.active.size===0)throw new Error("No pools selected");if(this.isReady)return Array.from(this.pools.values());let{useOnly:e=[],exclude:n=[]}=t,r=new Set(e),i=new Set(n),a=async s=>{let o=s.getPoolType();return r.size>0?r.has(o):i.size>0?!i.has(o):s.isSupported()};return this.getFilteredPools(a)}async getFilteredPools(t){let e=await Promise.all(this.clients.map(t)),n=this.clients.filter((i,a)=>e[a]);return(await Promise.all(n.map(i=>i.getPoolsMem()))).flat()}async getPoolFees(t,e){let n=this.clients.find(r=>r.getPoolType()===t.type);if(n)return n.getPoolFees(t,e);throw new Gt(t.type)}};var bn={};I(bn,{DEFAULT_BLOCK_TIME:()=>Zn,DEFAULT_MIN_BUDGET:()=>pn,ORDER_MIN_BLOCK_PERIOD:()=>tr,Router:()=>_t,TWAP_BLOCK_PERIOD:()=>ae,TWAP_MAX_DURATION:()=>gn,TWAP_MAX_PRICE_IMPACT:()=>dn,TWAP_TX_MULTIPLIER:()=>ic,TradeOrderError:()=>mn,TradeOrderType:()=>Ie,TradeRouteBuilder:()=>X,TradeRouter:()=>Rt,TradeScheduler:()=>Ft,TradeType:()=>xe});var re=class{constructor(t=1/0){this.capacity=t}storage=[];enqueue(t){if(this.size()===this.capacity)throw Error("Queue has reached max capacity, you cannot add more items");this.storage.push(t)}dequeue(){return this.storage.shift()}size(){return this.storage.length}};var qr=8,ie=class{isNotVisited(t,e){let n=!0;return e.forEach(r=>{(r[0]===t[0]||r[1]===t[1])&&(n=!1)}),n}findPaths(t,e,n){let r=[],i=new re,a=[];for(a.push([e,""]),i.enqueue(a);i.size()>0;){let s=i.dequeue();if(!s||s.length>qr)continue;let o=s[s.length-1];(n===null||o[0]===n)&&r.push(s),t.get(o[0])?.forEach(c=>{if(this.isNotVisited(c,s)){let m=[...s];m.push(c),i.enqueue(m)}})}return r}findShortestPaths(t,e,n){let r=[],i=new re,a=[];a.push([e,""]),i.enqueue(a);let s=1/0;for(;i.size()>0;){let o=i.dequeue();if(!o)continue;let l=o[o.length-1];if(l[0]===n){o.length<s?(s=o.length,r.length=0,r.push(o)):o.length===s&&r.push(o);continue}let c=t.get(l[0]);for(let m of c??[])this.isNotVisited(m,o)&&i.enqueue([...o,m])}return r}buildAndPopulateGraph(t,e){let n=new Map;for(let r of t)n.set(parseInt(r),[]);for(let[r,i,a]of e)n.get(i)?.push([a,r]);return n}};function un(u){let t={};for(let e of u){let n=e.tokens.length;for(let r=0;r<n;r++){t[e.tokens[r].id]||(t[e.tokens[r].id]=[]);for(let i=0;i<n;i++){if(r==i)continue;let a=[e.address,e.tokens[r].id,e.tokens[i].id];t[e.tokens[r].id].push(a)}}}return t}var se=class{getProposals(t,e,n){let r=n.filter(y=>y.type==="XYK"),i=n.filter(y=>y.type!=="XYK"),a=new Set(i.map(y=>y.tokens).flat().map(y=>y.id)),s=a.has(t),o=a.has(e),l=new ie,c=y=>{let h=un(y),P=Object.keys(h),S=P.flatMap(T=>h[T]);return l.buildAndPopulateGraph(P,S)};if(!s&&!o){let y=r.filter(S=>S.tokens.find(T=>T.id===t)||S.tokens.find(T=>T.id===e)),h=c(y),P=l.findPaths(h,t,e);return this.parsePaths(P)}if(s&&o){let y=c(i),h=l.findPaths(y,t,e);return this.parsePaths(h)}let m=s?e:t,d=r.filter(y=>y.tokens.some(h=>h.id===m));if(d.length===0)return[];let p=[...i,...d],g=c(p),b=l.findPaths(g,t,e);return this.parsePaths(b)}parsePaths(t){let e=[];for(let n of t){let r=[];for(let i=0;i<n.length;i++){let a=n[i],s=n[i+1];if(s==null)break;r.push(this.toEdge(a,s))}e.push(r)}return e}toEdge(t,e){return[e[1],t[0],e[0]]}};var _t=class{routeSuggester;routeProposals;routerOptions;ctx;constructor(t,e={}){this.ctx=t,this.routeSuggester=new se,this.routeProposals=new Map,this.routerOptions=Object.freeze(e)}buildRouteKey(t,e,n){return`${t}->${e}::${n.length}`}async getPools(){return this.ctx.getPools(this.routerOptions)}async getRoutes(t,e){let n=await this.getPools();return this.validateInput(t,e,n),this.getPaths(t,e,n)}async getTradeableAssets(){let t=await this.getPools(),e=this.getAssets(t);return Array.from(e)}async getRouteableAssets(t){let e=await this.getTradeableAssets();return(await Promise.all(e.filter(r=>r!==t).map(r=>this.getRoutes(r,t)))).filter(r=>r.length>0).map(([r])=>r[0].assetIn).sort()}validateInput(t,e,n){if(n.length===0)throw new Error("No pools configured");if(t===e)throw new Error("Trading pair can't be identical");let r=this.getAssets(n);if(!r.has(t))throw new Error(t+" is not supported asset");if(!r.has(e))throw new Error(e+" is not supported asset");return this.toPoolsMap(n)}getAssets(t){let e=t.map(n=>n.tokens.map(r=>r.id)).flat().sort((n,r)=>n>r?1:-1);return new Set(e)}getPaths(t,e,n){let r=this.toPoolsMap(n);return this.getProposals(t,e,n).filter(a=>this.validPath(a,r)).map(a=>this.toHops(a,r))}getProposals(t,e,n){let r=this.buildRouteKey(t,e,n);if(this.routeProposals.has(r))return this.routeProposals.get(r);let i=this.routeSuggester.getProposals(t,e,n);return this.routeProposals.set(r,i),i}validPath(t,e){return t.length>0&&t.map(n=>this.validEdge(n,e)).reduce((n,r)=>n&&r)}validEdge([t,e,n],r){return r.get(t)?.validatePair(e,n)||!1}toPoolsMap(t){return new Map(t.map(e=>[e.address,At.get(e)]))}toHops(t,e){return t.map(([n,r,i])=>{let a=e.get(n);return{poolAddress:n,poolId:a?.id,pool:a?.type,assetIn:r,assetOut:i}})}};var xe=(e=>(e.Buy="Buy",e.Sell="Sell",e))(xe||{}),Ie=(n=>(n.Dca="Dca",n.TwapSell="TwapSell",n.TwapBuy="TwapBuy",n))(Ie||{}),mn=(n=>(n.OrderTooSmall="OrderTooSmall",n.OrderTooBig="OrderTooBig",n.OrderImpactTooBig="OrderImpactTooBig",n))(mn||{});var{FeeUtils:Jn}=O,Rt=class extends _t{mlr;poolsSnapshot;constructor(t,e={}){super(t,e),this.mlr=new Map}buildCtxSync(t,e){let n=this.poolsSnapshot,r=super.validateInput(t,e,n),i=super.getPaths(t,e,n);if(!i.length)throw new Ut(t,e);return{paths:i,pools:n,poolsMap:r}}async withCtx(t,e,n){this.poolsSnapshot||(this.poolsSnapshot=await super.getPools());let r=this.buildCtxSync(t,e);return n(r)}isDirectTrade(t){return t.length==1}findBestSellRoute(t){let e=t.sort((n,r)=>{let i=n[n.length-1].amountOut,a=r[r.length-1].amountOut;return i>a?-1:1});return e.find(n=>n.every(r=>r.errors.length==0))||e[0]}getRouteFeeRange(t){if(t.filter(n=>n.tradeFeeRange).length>0){let n=t.map(i=>i.tradeFeeRange?.[0]??i.tradeFeePct).reduce((i,a)=>i+a),r=t.map(i=>i.tradeFeeRange?.[1]??i.tradeFeePct).reduce((i,a)=>i+a);return[n,r]}}getPoolFeeRange(t){let e=t.min?Jn.toPct(t.min):void 0,n=t.max?Jn.toPct(t.max):void 0;if(e&&n)return[e,n]}async getBestSell(t,e,n){return this.getSell(t,e,n)}getSellSpot(t){let e=t[t.length-1];if(t.length===1)return e.spotPrice;let n=t.map(s=>s.assetOutDecimals).reduce((s,o)=>s+o),r=t.map(s=>s.spotPrice).reduce((s,o)=>s*o),i=n-e.assetOutDecimals,a=Math.pow(10,i);return r/BigInt(a)}async getSell(t,e,n,r){return this.withCtx(t,e,async({paths:i,poolsMap:a})=>{let s;if(r)s=await this.toSellSwaps(n,r,a);else{let o=i.map(c=>this.toSellSwaps(n,c,a)),l=await Promise.all(o);s=this.findBestSellRoute(l)}return this.buildSell(a,s)})}buildSell(t,e){let n=e[0],r=e[e.length-1],i=this.isDirectTrade(e),a=this.getSellSpot(e),s=r.amountOut,o=i?r.calculatedOut:this.calculateDelta0Y(n.amountIn,e,t),l=o-s,c=this.getRouteFeeRange(e),m=i?r.tradeFeePct:A.calculateSellFee(o,s),d=Math.pow(10,n.assetInDecimals),p=n.amountIn*a/BigInt(d),g=A.calculateDiffToRef(o,p);return{type:"Sell",amountIn:n.amountIn,amountOut:r.amountOut,spotPrice:a,tradeFee:l,tradeFeePct:m,tradeFeeRange:c,priceImpactPct:g,swaps:e,toHuman(){return{type:"Sell",amountIn:f.toDecimal(n.amountIn,n.assetInDecimals),amountOut:f.toDecimal(r.amountOut,r.assetOutDecimals),spotPrice:f.toDecimal(a,r.assetOutDecimals),tradeFee:f.toDecimal(l,r.assetOutDecimals),tradeFeePct:m,tradeFeeRange:c,priceImpactPct:g,swaps:e.map(b=>b.toHuman())}}}}calculateDelta0Y(t,e,n){let r=[];for(let i=0;i<e.length;i++){let a=e[i],s=n.get(a.poolAddress);if(s==null)throw new Error("Pool does not exit");let o=s.parsePair(a.assetIn,a.assetOut),l;i>0?l=r[i-1]:l=t;let c=s.calculateOutGivenIn(o,l);r.push(c)}return r[r.length-1]}async calculateMostLiquidRoute(t,e,n){let{paths:r,pools:i,poolsMap:a}=n,l=i.filter(b=>b.tokens.some(y=>y.id===t)).map(b=>b.type==="Aave"?b.tokens:b.tokens.filter(y=>y.id===t)).map(b=>b.map(y=>y.balance).reduce((y,h)=>y+h)).sort((b,y)=>y<b?-1:1)[0],c=A.getFraction(l,.1),m=await Promise.all(r.map(b=>this.toSellSwaps(c,b,a))),p=this.findBestSellRoute(m).map(b=>({poolAddress:b.poolAddress,poolId:b?.poolId,pool:b.pool,assetIn:b.assetIn,assetOut:b.assetOut})),g=this.buildRouteKey(t,e,i);return this.mlr.set(g,p),p}async toSellSwaps(t,e,n){let r=[];for(let i=0;i<e.length;i++){let a=e[i],s=n.get(a.poolAddress);if(s==null)throw new Error("Pool does not exit");let o=s.parsePair(a.assetIn,a.assetOut),l;i>0?l=r[i-1].amountOut:l=typeof t=="string"?f.toBigInt(t,o.decimalsIn):t;let c=await this.ctx.getPoolFees(s,o.assetOut),{amountOut:m,calculatedOut:d,feePct:p,errors:g}=s.validateAndSell(o,l,c),b=this.getPoolFeeRange(c),y=s.spotPriceOutGivenIn(o),h=Math.pow(10,o.decimalsIn),P=l*y/BigInt(h),S=A.calculateDiffToRef(d,P);r.push({...a,assetInDecimals:o.decimalsIn,assetOutDecimals:o.decimalsOut,amountIn:l,amountOut:m,calculatedOut:d,spotPrice:y,tradeFeePct:p,tradeFeeRange:b,priceImpactPct:S,errors:g,isSupply(){return s.type==="Aave"&&s.tokens[0].id===a.assetIn},isWithdraw(){return s.type==="Aave"&&s.tokens[1].id===a.assetIn},toHuman(){return{...a,amountIn:f.toDecimal(l,o.decimalsIn),amountOut:f.toDecimal(m,o.decimalsOut),calculatedOut:f.toDecimal(d,o.decimalsOut),spotPrice:f.toDecimal(y,o.decimalsOut),tradeFeePct:p,tradeFeeRange:b,priceImpactPct:S,errors:g}}})}return r}async getMostLiquidRoute(t,e){return this.withCtx(t,e,async n=>{let r=this.buildRouteKey(t,e,n.pools),i=this.mlr.get(r);return i||this.calculateMostLiquidRoute(t,e,n)})}async getSpotPrice(t,e){return this.withCtx(t,e,async n=>{let{pools:r,poolsMap:i}=n,a=this.buildRouteKey(t,e,r),s=this.mlr.get(a);s||(s=await this.calculateMostLiquidRoute(t,e,n));let o=await this.toSellSwaps("1",s,i),l=this.getSellSpot(o),c=o[o.length-1].assetOutDecimals;return{amount:l,decimals:c}})}findBestBuyRoute(t){let e=t.sort((n,r)=>{let i=n[0].amountIn,a=r[0].amountIn;return i>a?1:-1});return e.find(n=>n.every(r=>r.errors.length==0))||e[0]}async getBestBuy(t,e,n){return this.getBuy(t,e,n)}getBuySpot(t){let e=t[0];if(t.length===1)return e.spotPrice;let n=t.map(s=>s.assetInDecimals).reduce((s,o)=>s+o),r=t.map(s=>s.spotPrice).reduce((s,o)=>s*o),i=n-e.assetInDecimals,a=Math.pow(10,i);return r/BigInt(a)}async getBuy(t,e,n,r){return this.withCtx(t,e,async({paths:i,poolsMap:a})=>{let s;if(r)s=await this.toBuySwaps(n,r,a);else{let o=i.map(c=>this.toBuySwaps(n,c,a)),l=await Promise.all(o);s=this.findBestBuyRoute(l)}return this.buildBuy(a,s)})}buildBuy(t,e){let n=e[e.length-1],r=e[0],i=this.isDirectTrade(e),a=this.getBuySpot(e),s=r.amountIn,o=i?r.calculatedIn:this.calculateDelta0X(n.amountOut,e,t),l=s-o,c=this.getRouteFeeRange(e),m=i?r.tradeFeePct:A.calculateBuyFee(o,s),d=Math.pow(10,n.assetOutDecimals),p=n.amountOut*a/BigInt(d),g;return o===0n?g=-100:g=A.calculateDiffToRef(p,o),{type:"Buy",amountOut:n.amountOut,amountIn:r.amountIn,spotPrice:a,tradeFee:l,tradeFeePct:m,tradeFeeRange:c,priceImpactPct:g,swaps:e,toHuman(){return{type:"Buy",amountOut:f.toDecimal(n.amountOut,n.assetOutDecimals),amountIn:f.toDecimal(r.amountIn,r.assetInDecimals),spotPrice:f.toDecimal(a,r.assetInDecimals),tradeFee:f.toDecimal(l,r.assetInDecimals),tradeFeePct:m,tradeFeeRange:c,priceImpactPct:g,swaps:e.map(b=>b.toHuman())}}}}calculateDelta0X(t,e,n){let r=[];for(let i=e.length-1;i>=0;i--){let a=e[i],s=n.get(a.poolAddress);if(s==null)throw new Error("Pool does not exit");let o=s.parsePair(a.assetIn,a.assetOut),l;i==e.length-1?l=t:l=r[0];let c=s.calculateInGivenOut(o,l);r.unshift(c)}return r[0]}async toBuySwaps(t,e,n){let r=[];for(let i=e.length-1;i>=0;i--){let a=e[i],s=n.get(a.poolAddress);if(s==null)throw new Error("Pool does not exit");let o=s.parsePair(a.assetIn,a.assetOut),l;i==e.length-1?l=typeof t=="string"?f.toBigInt(t,o.decimalsOut):t:l=r[0].amountIn;let c=await this.ctx.getPoolFees(s,o.assetOut),{amountIn:m,calculatedIn:d,feePct:p,errors:g}=s.validateAndBuy(o,l,c),b=this.getPoolFeeRange(c),y=s.spotPriceInGivenOut(o),h=Math.pow(10,o.decimalsOut),P=l*y/BigInt(h),S;d===0n?S=-100:S=A.calculateDiffToRef(P,d),r.unshift({...a,assetInDecimals:o.decimalsIn,assetOutDecimals:o.decimalsOut,amountOut:l,amountIn:m,calculatedIn:d,spotPrice:y,tradeFeePct:p,tradeFeeRange:b,priceImpactPct:S,errors:g,isSupply(){return s.type==="Aave"&&s.tokens[0].id===a.assetIn},isWithdraw(){return s.type==="Aave"&&s.tokens[1].id===a.assetIn},toHuman(){return{...a,amountOut:f.toDecimal(l,o.decimalsOut),amountIn:f.toDecimal(m,o.decimalsIn),calculatedIn:f.toDecimal(d,o.decimalsIn),spotPrice:f.toDecimal(y,o.decimalsIn),tradeFeePct:p,tradeFeeRange:b,priceImpactPct:S,errors:g}}})}return r}};var Zn=6e3,pn=1000000000000000n,ae=6,dn=-5,gn=216e5,ic=3,tr=6;var yn=require("polkadot-api");var X=class{static build(t){return t.map(({assetIn:e,assetOut:n,pool:r,poolId:i})=>r==="Stableswap"?{pool:(0,yn.Enum)("Stableswap",i),asset_in:e,asset_out:n}:{pool:(0,yn.Enum)(r),asset_in:e,asset_out:n})}};var Ft=class{schedulerOptions;router;constructor(t,e={}){this.router=t,this.schedulerOptions=Object.freeze({blockTime:e.blockTime??6e3,minBudgetInNative:e.minBudgetInNative??pn})}get blockTime(){return this.schedulerOptions.blockTime}get minOrderBudget(){return this.schedulerOptions.minBudgetInNative}async getDcaOrder(t,e,n,r,i){let[a,s]=await Promise.all([this.getMinimumOrderBudget(t),this.router.getBestSell(t,e,n)]),{amountIn:o,swaps:l,priceImpactPct:c}=s,m=l[0],d=l[l.length-1],{assetInDecimals:p}=m,{assetOutDecimals:g}=d,b=Math.abs(c),y=this.getMinimumTradeCount(o,a),h=this.getOptimalTradeCount(b),P=i?Math.round(r/i):h,S=Math.ceil(r/y),T=Math.round(r/h),M=Math.round(r/P),L=o/BigInt(P),E=await this.router.getBestSell(t,e,L),G=o<a,K=[];G&&K.push("OrderTooSmall");let U=E.amountOut*BigInt(P),$=this.toBlockPeriod(M),at=E.tradeFee*BigInt(P),pt=X.build(l),Ct={assetIn:t,assetOut:e,errors:K,frequencyMin:S,frequencyOpt:T,frequency:M,tradeCount:P,tradeFee:at,tradeImpactPct:E.priceImpactPct,tradePeriod:$,tradeRoute:pt,type:"Dca"};return{...Ct,amountIn:o,amountOut:U,tradeAmountIn:E.amountIn,tradeAmountOut:E.amountOut,toHuman(){return{...Ct,amountIn:f.toDecimal(o,p),amountOut:f.toDecimal(U,g),tradeAmountIn:f.toDecimal(E.amountIn,p),tradeAmountOut:f.toDecimal(E.amountOut,g)}}}}async getMinimumOrderBudget(t){if(0===t)return this.minOrderBudget;let e=await this.router.getSpotPrice(0,t),n=10n**BigInt(12);if(e)return this.minOrderBudget*e.amount/n;throw new Error("Unable to calculate order budget")}getMinimumTradeCount(t,e){let n=e*2n/10n;if(n===0n)return 0;let r=t+n/2n;return Number(r/n)}getOptimalTradeCount(t){let e=Math.round(t*10)||1;return Math.max(e,3)}async getTwapSellOrder(t,e,n){let[r,i]=await Promise.all([this.getMinimumOrderBudget(t),this.router.getBestSell(t,e,n)]),{amountIn:a,swaps:s,priceImpactPct:o}=i,l=s[0],c=s[s.length-1],{assetInDecimals:m}=l,{assetOutDecimals:d}=c,p=Math.abs(o),g=this.getTwapTradeCount(p),b=a/BigInt(g),y=await this.router.getBestSell(l.assetIn,c.assetOut,b),h=g===1,P=a<r,S=y.priceImpactPct<-5,T=[];P||h?T.push("OrderTooSmall"):S&&T.push("OrderImpactTooBig");let M=y.amountOut*BigInt(g),L=y.tradeFee*BigInt(g),E=X.build(s),G={assetIn:t,assetOut:e,errors:T,tradeCount:g,tradeImpactPct:y.priceImpactPct,tradePeriod:6,tradeRoute:E,type:"TwapSell"};return{...G,amountIn:a,amountOut:M,tradeAmountIn:y.amountIn,tradeAmountOut:y.amountOut,tradeFee:L,toHuman(){return{...G,amountIn:f.toDecimal(a,m),amountOut:f.toDecimal(M,d),tradeAmountIn:f.toDecimal(y.amountIn,m),tradeAmountOut:f.toDecimal(y.amountOut,d),tradeFee:f.toDecimal(L,d)}}}}async getTwapBuyOrder(t,e,n){let[r,i]=await Promise.all([this.getMinimumOrderBudget(t),this.router.getBestBuy(t,e,n)]),{amountOut:a,swaps:s,priceImpactPct:o}=i,l=s[0],c=s[s.length-1],{assetInDecimals:m}=l,{assetOutDecimals:d}=c,p=Math.abs(o),g=this.getTwapTradeCount(p),b=a/BigInt(g),y=await this.router.getBestBuy(l.assetIn,c.assetOut,b),h=y.amountIn*BigInt(g),P=g===1,S=h<r,T=y.priceImpactPct<-5,M=[];S||P?M.push("OrderTooSmall"):T&&M.push("OrderImpactTooBig");let L=y.tradeFee*BigInt(g),E=X.build(s),G={assetIn:t,assetOut:e,errors:M,tradeCount:g,tradeImpactPct:y.priceImpactPct,tradePeriod:6,tradeRoute:E,type:"TwapBuy"};return{...G,amountIn:h,amountOut:a,tradeAmountIn:y.amountIn,tradeAmountOut:y.amountOut,tradeFee:L,toHuman(){return{...G,amountIn:f.toDecimal(h,m),amountOut:f.toDecimal(a,d),tradeAmountIn:f.toDecimal(y.amountIn,m),tradeAmountOut:f.toDecimal(y.amountOut,d),tradeFee:f.toDecimal(L,m)}}}}getTwapTradeCount(t){let e=this.getOptimalTradeCount(t);if(this.getTwapExecutionTime(e)>216e5){let r=216e5/(this.blockTime*6);return Math.round(r)}return e}getTwapExecutionTime(t){return t*6*this.blockTime}toBlockPeriod(t){let e=t/this.blockTime,n=Math.round(e);return Math.max(n,6)}};var fn={};I(fn,{BIG_10:()=>rr,BIG_BILL:()=>Pn,StakingApi:()=>oe,StakingClient:()=>le});var er=require("@polkadot/util-crypto"),nr=require("@polkadot/util"),H=require("@galacticcouncil/math-staking"),W=nt(require("big.js")),hn={none:.1,locked1x:1,locked2x:2,locked3x:3,locked4x:4,locked5x:5,locked6x:6},Nr=u=>Object.keys(hn).includes(u),Gr="20000000000000000",Ur="2000",rr=(0,W.default)(10),Pn=(0,W.default)(rr.pow(12));function Vr(u){return(0,er.encodeAddress)((0,nr.stringToU8a)(("modl"+u).padEnd(32,"\0")),63)}var oe=class{client;balanceClient;constructor(t,e){this.client=t,this.balanceClient=e}async getFreePotBalance(){let t=await this.client.getPalletId(),e=Vr(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)]);if(!e)return;let r=e.created_at,i=await n.reduce(async(a,[s,o])=>{let l=await a,c=s,m=o.amount,d=o.conviction.toString().toLowerCase(),p=await this.client.getReferendumInfo(c);return p&&(p.type==="Approved"||p.type==="Rejected")&&Nr(d)&&l.push({id:c,amount:m,conviction:d}),l},Promise.resolve([]));return{stake:e.stake,rewardPerStake:e.reward_per_stake,createdAt:r,actionPoints:e.action_points,accumulatedUnpaidRewards:e.accumulated_unpaid_rewards,accumulatedSlashPoints:e.accumulated_slash_points,accumulatedLockedRewards:e.accumulated_locked_rewards,votes:i}}async getStake(t){let e=await this.client.getNFTCollectionId(),[n,r]=await Promise.all([this.client.getStaking(),this.client.getUniques(t,e)]),i=r.find(a=>a)?.itemId;return{totalStake:n?.total_stake,accumulatedRewardPerStake:n?.accumulated_reward_per_stake,potReservedBalance:n?.pot_reserved_balance,positionId:i,stakePosition:i?await this.getStakingPosition(i):void 0}}getCurrentActionPoints(t,e,n,r){let i=(0,W.default)(0),a=(0,W.default)(0),s=hn.locked6x,o=(0,W.default)(n.toString()).mul(s),l=100,c=[];t.forEach(p=>{let g=hn[p.conviction],b=r.includes(p.id.toString());b&&c.push(p.id.toString());let y=(0,W.default)(p.amount.toString()).mul(l).div(o);i=i.plus(Math.floor(y.mul(g).toNumber())),a=a.plus(Math.floor(y.mul(b?s:g).toNumber()))});let m=Math.floor((0,W.default)(n.toString()).mul(s).mul(l).div(o).toNumber());r.forEach(p=>{c.includes(p)||(a=a.plus(m))});let d={democracyVote:1};return i=i.mul(d.democracyVote),i=i.plus(e.toString()||"0"),a=a.mul(d.democracyVote),a=a.plus(e.toString()||"0"),{currentActionPoints:i.toString(),maxActionPoints:a.toString()}}async getRewards(t,e,n){let r=await this.getStake(t),{potReservedBalance:i,accumulatedRewardPerStake:a,totalStake:s,stakePosition:o}=r;if(!o)return;let[l,c,m,d,p,g,b]=await Promise.all([this.getFreePotBalance(),this.client.getPeriodLength(),this.client.getUnclaimablePeriods(),this.client.getTimePointsPerPeriod(),this.client.getTimePointsWeight(),this.client.getActionPointsWeight(),this.client.getSixBlockSince()]),y=(0,W.default)(l.toString()).minus(i.toString()),h=y.gt(0)&&s>0?(0,H.calculate_accumulated_rps)(a.toString(),y.toString(),s.toString()):a.toString(),P=(0,H.calculate_period_number)(c.toString(),n,b),S=(0,H.calculate_period_number)(c.toString(),o.createdAt.toString(),b),T=(0,H.calculate_rewards)(h,o.rewardPerStake.toString(),o.stake.toString()),M=this.getCurrentActionPoints(o.votes,o.actionPoints,o.stake,e),L=(0,H.calculate_points)(S,P,d.toString(),p.toString(),M.currentActionPoints,g.toString(),o.accumulatedSlashPoints.toString()),E=(0,W.default)(L).div(2).toString(),G=(0,H.sigmoid)(E,Gr,Ur),K=(0,W.default)(T).plus(o.accumulatedUnpaidRewards.toString()).plus(o.accumulatedLockedRewards.toString());if((0,W.default)(P).minus(S).lte(m.toString()))return{rewards:"0"};let U=(0,H.calculate_percentage_amount)(K.toString(),G),$=(0,W.default)(o.accumulatedLockedRewards.toString()),at=$.gt(U)?$:(0,W.default)(U);return{rewards:at.div(Pn).toString(),maxRewards:K.div(Pn).toString(),allocatedRewardsPercentage:at.div(K).mul(100).toNumber()}}};var le=class extends D{async getPalletId(){let t=this.api.constants.Staking.PalletId;return(await t()).asText()}async getPeriodLength(){let t=this.api.constants.Staking.PeriodLength;return await t()}async getUnclaimablePeriods(){let t=this.api.constants.Staking.UnclaimablePeriods;return await t()}async getNFTCollectionId(){let t=this.api.constants.Staking.NFTCollectionId;return await t()}async getStaking(){return await this.api.query.Staking.Staking.getValue()}async getUniques(t,e){return(await this.api.query.Uniques.Account.getEntries(t,e)).map(({keyArgs:a})=>{let[s,o,l]=a;return{address:s,collectionId:o,itemId:l}})}async getStakingPositionsValue(t){return await this.api.query.Staking.Positions.getValue(t)}async getStakingVotes(t){return await this.api.query.Staking.Votes.getValue(t)}async getReferendumInfo(t){return await this.api.query.Referenda.ReferendumInfoFor.getValue(t)}async getTimePointsPerPeriod(){let t=this.api.constants.Staking.TimePointsPerPeriod;return await t()}async getTimePointsWeight(){let t=this.api.constants.Staking.TimePointsWeight;return await t()/1e6}async getActionPointsWeight(){let t=this.api.constants.Staking.ActionPointsWeight;return await t()/1e9}async getSixBlockSince(){return(await this.api.query.Staking.SixSecBlocksSince.getValue()).toString()}};var Tn={};I(Tn,{TxBuilderFactory:()=>Et});var Sn=require("polkadot-api");function ir(u){let t=[],e=u;for(;e&&typeof e=="object"&&"type"in e;)t.push(e.type),e=e.value;return t.join(".")}var kt=class extends D{evm;evmClient;balanceClient;aaveUtils;constructor(t,e){super(t),this.evm=e,this.evmClient=e.getWsProvider(),this.balanceClient=new J(t),this.aaveUtils=new gt(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:Ce})}async dryRun(t,e){let n=(0,Sn.Enum)("Signed",t),r=(0,Sn.Enum)("system",n),a=await this.client.getUnsafeApi().apis.DryRunApi.dry_run_call(r,e.decodedCall),s=a.success&&!a.value.execution_result.success?a.value.execution_result.value.error:null;if(s){let o=ir(s.value);throw new Error("Dry run execution error!",{cause:o})}return a}isDirectOmnipoolTrade(t){return t.length===1&&t[0].pool==="Omnipool"}};var ve=class extends kt{_trade;_beneficiary;_slippagePct=1;setTrade(t){return this._trade=t,this}withBeneficiary(t){return this._beneficiary=t,this}withSlippage(t){return this._slippagePct=t,this}get trade(){if(!this._trade)throw new Error("Trade not set. Use setTrade().");return this._trade}get beneficiary(){if(!this._beneficiary)throw new Error("Beneficiary not set. Use withBeneficiary().");return this._beneficiary}get slippagePct(){return this._slippagePct}async build(){let{amountIn:t,swaps:e,type:n}=this.trade;if(n==="Buy")return this.buildBuyTx();let{assetIn:r}=e[0],i=await this.balanceClient.getBalance(this.beneficiary,r);return t>=i.transferable-5n?this.buildSellAllTx():this.buildSellTx()}async buildBuyTx(){let{amountIn:t,amountOut:e,swaps:n}=this.trade,r=n[0],i=n[n.length-1],a=A.getFraction(t,this.slippagePct),s=r.assetIn,o=i.assetOut,l=t+a,c;return this.isDirectOmnipoolTrade(n)?c=this.api.tx.Omnipool.buy({asset_in:s,asset_out:o,amount:e,max_sell_amount:l}):c=this.api.tx.Router.buy({asset_in:s,asset_out:o,amount_out:e,max_amount_in:l,route:X.build(n)}),this.wrapTx("RouterBuy",c)}async buildSellTx(){let{amountIn:t,amountOut:e,swaps:n}=this.trade,r=n[0],i=n[n.length-1],a=A.getFraction(e,this.slippagePct),s=r.assetIn,o=i.assetOut,l=e-a,c;return this.isDirectOmnipoolTrade(n)?c=this.api.tx.Omnipool.sell({asset_in:s,asset_out:o,amount:t,min_buy_amount:l}):c=this.api.tx.Router.sell({asset_in:s,asset_out:o,amount_in:t,min_amount_out:l,route:X.build(n)}),r.isWithdraw()&&await this.aaveUtils.hasBorrowPositions(this.beneficiary)&&(c=await this.dispatchWithExtraGas(c)),this.wrapTx("RouterSell",c)}async buildSellAllTx(){let{amountOut:t,swaps:e}=this.trade,n=e[0],r=e[e.length-1],i=A.getFraction(t,this.slippagePct),a=n.assetIn,s=r.assetOut,o=t-i,l=this.api.tx.Router.sell_all({asset_in:a,asset_out:s,min_amount_out:o,route:X.build(e)});return n.isWithdraw()&&await this.aaveUtils.hasBorrowPositions(this.beneficiary)&&(l=await this.dispatchWithExtraGas(l)),this.wrapTx("RouterSellAll",l)}};var Oe=require("polkadot-api");var Ae=class extends kt{_order;_beneficiary;_maxRetries=3;_slippagePct=1;setOrder(t){return this._order=t,this}withBeneficiary(t){return this._beneficiary=t,this}withMaxRetries(t){return this._maxRetries=t,this}withSlippage(t){return this._slippagePct=t,this}get order(){if(!this._order)throw new Error("Order not set. Use setOrder().");return this._order}get beneficiary(){if(!this._beneficiary)throw new Error("Beneficiary not set. Use withBeneficiary().");return this._beneficiary}get maxRetries(){return this._maxRetries}get slippagePct(){return this._slippagePct}async build(){let{type:t}=this.order;switch(t){case"Dca":return this.buildDcaTx();case"TwapSell":return this.buildTwapSellTx();case"TwapBuy":return this.buildTwapBuyTx();default:throw new Error(`Unsupported TradeOrderType: ${t}`)}}buildDcaTx(){let{amountIn:t,assetIn:e,assetOut:n,tradeAmountIn:r,tradePeriod:i,tradeRoute:a}=this.order,s=this.api.tx.DCA.schedule({schedule:{owner:this.beneficiary,period:i,max_retries:this.maxRetries,total_amount:t,slippage:this.slippagePct*1e4,stability_threshold:void 0,order:(0,Oe.Enum)("Sell",{asset_in:e,asset_out:n,amount_in:r,min_amount_out:0n,route:a})},start_execution_block:void 0});return this.wrapTx("DcaSchedule",s)}buildTwapSellTx(){let{amountIn:t,assetIn:e,assetOut:n,tradeAmountIn:r,tradeAmountOut:i,tradePeriod:a,tradeRoute:s}=this.order,o=A.getFraction(i,this.slippagePct),l=i-o,c=this.api.tx.DCA.schedule({schedule:{owner:this.beneficiary,period:a,max_retries:this.maxRetries,total_amount:t,slippage:this.slippagePct*1e4,stability_threshold:void 0,order:(0,Oe.Enum)("Sell",{asset_in:e,asset_out:n,amount_in:r,min_amount_out:l,route:s})},start_execution_block:void 0});return this.wrapTx("DcaSchedule.twapSell",c)}buildTwapBuyTx(){let{amountIn:t,assetIn:e,assetOut:n,tradeAmountIn:r,tradeAmountOut:i,tradePeriod:a,tradeRoute:s}=this.order,o=A.getFraction(r,this.slippagePct),l=r+o,c=this.api.tx.DCA.schedule({schedule:{owner:this.beneficiary,period:a,max_retries:this.maxRetries,total_amount:t,slippage:this.slippagePct*1e4,stability_threshold:void 0,order:(0,Oe.Enum)("Buy",{asset_in:e,asset_out:n,amount_out:i,max_amount_in:l,route:s})},start_execution_block:void 0});return this.wrapTx("DcaSchedule.twapBuy",c)}};var Et=class{client;evmClient;constructor(t,e){this.client=t,this.evmClient=e}trade(t){return new ve(this.client,this.evmClient).setTrade(t)}order(t){return new Ae(this.client,this.evmClient).setOrder(t)}};async function Wr(u){let t=new xt(u),e=new Vt(u),[n,r]=await Promise.all([t.getBlockTime(),t.getMinOrderBudget()]),i=new Bt(u,e).withAave().withOmnipool().withStableswap().withXyk(),a=new J(u),s=new le(u),o=new Ht(u),l=new gt(e),c=new Rt(i),m=new Ft(c,{blockTime:n,minBudgetInNative:r}),d=new oe(s,a),p=new Wt(o,a,{blockTime:n});return{api:{aave:l,router:c,scheduler:m,staking:d,farm:p},client:{asset:new wt(u),balance:a,evm:e},ctx:{pool:i},tx:new Et(u,e),destroy:()=>{i.destroy()}}}0&&(module.exports={aave,api,big,client,const:null,createSdkContext,erc20,error,evm,farm,fmt,h160,json,math,pool,sor,staking,tx,xc});
|