@galacticcouncil/sdk-next 0.10.0 → 0.11.0
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.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
var ni=Object.defineProperty;var x=(p,t)=>{for(var e in t)ni(p,e,{get:t[e],enumerable:!0})};var tn={};x(tn,{Papi:()=>E,getWs:()=>ri});import{hydration as ii}from"@galacticcouncil/descriptors";function Ze(p){switch(p){case!0:case"true":case 1:case"1":case"on":case"yes":return!0;default:return!1}}var E=class{client;api;constructor(t){this.client=t,this.api=this.client.getTypedApi(ii)}log(t,...e){let n=typeof window>"u"?process.env.GC_DEBUG:window.localStorage.getItem("gc.debug");Ze(n)&&console.log(t,...e)}};import{createClient as si}from"polkadot-api";import{withPolkadotSdkCompat as ai}from"polkadot-api/polkadot-sdk-compat";var ri=async p=>{let t=typeof p=="string"?p.split(","):p,i=(typeof window>"u"?(await import("polkadot-api/ws-provider/node")).getWsProvider:(await import("polkadot-api/ws-provider/web")).getWsProvider)(t);return si(ai(i))};var cn={};x(cn,{AAVE_GAS_LIMIT:()=>Te,AAVE_LENDING_POOL_ADDRESS:()=>se,AAVE_POOL_ABI:()=>Pe,AAVE_POOL_DATA_PROVIDER:()=>ie,AAVE_POOL_DATA_PROVIDER_ABI:()=>ne,AAVE_POOL_PROXY:()=>Se,AAVE_ROUNDING_THRESHOLD:()=>hr,AAVE_UINT_256_MAX:()=>oi,AaveClient:()=>It,AaveUtils:()=>it});var Pe=[{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 ne=[{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 Se="0x1b02E051683b5cfaC5929C25E84adb26ECf87B38",ie="0x112b087b60C1a166130d59266363C45F8aa99db0",se="0xf3Ba4D1b50f78301BDD7EAEa9B67822A15FCA691",Te=1000000n,hr=5,oi=BigInt("0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");var It=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:ne,address:ie,args:[se],functionName:"getReservesData"})}async getUserReservesData(t){return await this.client.readContract({abi:ne,address:ie,args:[se,t],functionName:"getUserReservesData"})}async getUserAccountData(t){return await this.client.readContract({abi:Pe,address:Se,args:[t],functionName:"getUserAccountData"})}};import Q from"big.js";var P={};x(P,{asBigInt:()=>ui,toBigInt:()=>ci,toDecimal:()=>li});import nt from"big.js";nt.NE=-18;function li(p,t,e=6,n){let i=nt(p.toString()),s=nt(10).pow(t);return i.div(s).round(e,n).toString()}function ci(p,t){let e=nt(10).pow(t),i=nt(p).mul(e).toFixed(0,nt.roundDown);return BigInt(i)}function ui(p){return BigInt(p.round(0,nt.roundDown).toFixed(0))}var at={};x(at,{ERC20:()=>ve});var ve=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 w={};x(w,{FeeUtils:()=>Ie,shiftNeg:()=>gi});import di from"big.js";var en={};x(en,{HUB_ASSET_ID:()=>Ot,HYDRATION_OMNIPOOL_ADDRESS:()=>mi,HYDRATION_PARACHAIN_ID:()=>pi,HYDRATION_SS58_PREFIX:()=>k,PERBILL_DENOMINATOR:()=>xe,PERMILL_DENOMINATOR:()=>rt,RUNTIME_DECIMALS:()=>B,SYSTEM_ASSET_DECIMALS:()=>we,SYSTEM_ASSET_ID:()=>_,TRADEABLE_DEFAULT:()=>ot});var B=18,rt=1e6,xe=1e9,_=0,we=12,pi=2034,k=63,mi="7L53bUTBbfuj14UpdCNPwmgzzHSsrsTWBHX5pys32mVWM3C1",Ot=1,ot=15;var Ie=class p{static toPct(t){let[e,n]=t;return p.safeDivide(e*100,n)}static toRaw(t){let[e,n]=t;return p.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 i=10**n;return Math.round(t*i/e)/i}static safeRound(t){return parseFloat(t.toPrecision(15))}};function gi(p,t){let e=di(typeof p=="bigint"?p.toString():p);return t===0?e.toString():e.div(Math.pow(10,t)).toString()}var lt={};x(lt,{H160:()=>Ae,isEvmAccount:()=>sn,isEvmAddress:()=>an,isSs58Address:()=>rn});import{AccountId as At}from"polkadot-api";import{toHex as nn}from"@polkadot-api/utils";import{Buffer as $}from"buffer";var Oe="ETH\0";function sn(p){if(!p)return!1;try{let t=At().enc(p),e=$.from(Oe);return $.from(t.subarray(0,e.length)).equals(e)}catch{return!1}}function an(p){return!!/^0x[a-fA-F0-9]{40}$/.test(p)}function rn(p){try{return At(63).enc(p),!0}catch{return!1}}var Ae=class p{static toAccount=t=>{let e=$.from(t.slice(2),"hex"),n=$.from(Oe),i=Uint8Array.from($.concat([n,e,$.alloc(8)])),s=nn(i);return At(63).dec(s)};static fromAccount=t=>{let e=At().enc(t),n=$.from(Oe),i=e.slice(n.length,-8);return"0x"+$.from(i).toString("hex")};static fromSS58=t=>{let n=At().enc(t).slice(0,20);return nn(n)};static fromAny=t=>{if(an(t))return t;if(sn(t))return p.fromAccount(t);if(rn(t))return p.fromSS58(t);throw new Error("Unknown address type")}};var Bt={};x(Bt,{findNestedKey:()=>hi,findNestedObj:()=>bi,jsonFormatter:()=>yi});var hi=(p,t)=>{let e=[];return JSON.stringify(p,(n,i)=>(i&&i[t]&&e.push(i),i)),e[0]},bi=(p,t,e)=>{let n;return JSON.stringify(p,(i,s)=>(s&&s[t]===e&&(n=s),s)),n},yi=(p,t)=>typeof t=="bigint"?t.toString():t;var A={};x(A,{calculateBuyFee:()=>Ti,calculateDiffToAvg:()=>fi,calculateDiffToRef:()=>Pi,calculateSellFee:()=>Si,getFraction:()=>vi});import z from"big.js";function fi(p,t){let e=z(p.toString()),n=z(t.toString());return e.minus(n).abs().div(e.plus(n).div(2)).mul(100).round(2).toNumber()}function Pi(p,t){if(t===0n)return 0;let e=z(p.toString()),n=z(t.toString());return e.minus(n).div(n).mul(100).round(2).toNumber()}function Si(p,t){let e=z(p.toString()),n=z(t.toString());return z(1).minus(n.div(e)).mul(100).round(2).toNumber()}function Ti(p,t){let e=z(p.toString());return z(t.toString()).div(e).minus(1).mul(100).round(2).toNumber()}function vi(p,t,e=2){(t<.01||t>100)&&new Error("Supported range is from 0.01% - 100%");let n=Math.pow(10,e),i=BigInt(t*n);return p*i/BigInt(100*n)}var on={};x(on,{convertToId:()=>wi});import{Buffer as xi}from"buffer";function wi(p){let e=xi.from(p.replace("0x",""),"hex").subarray(16);return e.readUIntBE(0,e.length)}import{TLRUCache as ln}from"@thi.ng/cache";var ae=class{debug;constructor(t){this.debug=t||!1}log(t,e,n){this.debug&&console.log(t,e,n)}scope(t,e,n,i){let s=new Map,a=i!==void 0?new ln(null,{ttl:i}):new ln;return{get:(...c)=>{let u=n(...c);if(s.has(u)){this.log("[live]",t,u);let m=s.get(u);return Promise.resolve(m)}if(a.has(u))return this.log("[memo]",t,u),a.get(u);this.log("[fetch]",t,u);let d=e(...c).catch(m=>{throw a.delete(u),m});return a.set(u,d),d},set:(c,...u)=>{let d=n(...u);this.log("[set-live]",t,d),s.set(d,c)},clear:()=>{this.log("[clear]",t),s.clear(),a.release()}}}};var{ERC20:re}=at,{H160:Be}=lt,Ii=1.01,Oi=31536000n,oe=10n**27n,it=class{client;constructor(t){this.client=new It(t)}async getSummary(t){let e=Be.fromAny(t),[n,i,s,a]=await Promise.all([this.client.getReservesData(),this.client.getUserReservesData(e),this.client.getUserAccountData(e),this.client.getBlockTimestamp()]),[r]=n,[o,l]=i,[c,u,d,m,g,b]=s,h=P.toDecimal(b,18),f=[];for(let y of o){let S=y.underlyingAsset.toLowerCase(),T=r.find(({underlyingAsset:fe})=>fe.toLowerCase()===S);if(!T)throw new Error("Missing pool reserve for "+S);let v=y.scaledATokenBalance,R=T.liquidityIndex,O=T.liquidityRate,D=T.availableLiquidity,U=T.priceInMarketReferenceCurrency,X=a+6,H=this.calculateLinearInterest(O,T.lastUpdateTimestamp,X),V=R*H/oe,tt=v*V/oe,Zt=Number(l!==0&&l===T.eModeCategoryId?T.eModeLiquidationThreshold:T.reserveLiquidationThreshold)/1e4,te=T.usageAsCollateralEnabled&&y.usageAsCollateralEnabledOnUser&&y.scaledATokenBalance>0n,ee=re.toAssetId(S);f.push({aTokenBalance:tt,availableLiquidity:D,decimals:Number(T.decimals),isCollateral:te,priceInRef:U,reserveId:ee,reserveAsset:S,reserveLiquidationThreshold:Zt})}return{healthFactor:Number(h),totalCollateral:c,totalDebt:u,reserves:f}}async hasBorrowPositions(t){let e=Be.fromAny(t),n=await this.client.getUserAccountData(e),[i,s]=n;return s>0n}async getHealthFactor(t){let e=Be.fromAny(t),n=await this.client.getUserAccountData(e),[i,s,a,r,o,l]=n,c=P.toDecimal(l,18);return Number(c)}async getHealthFactorAfterWithdraw(t,e,n){let{totalCollateral:i,totalDebt:s,reserves:a}=await this.getSummary(t),r=re.fromAssetId(e),o=a.find(f=>f.reserveAsset===r);if(!o)throw new Error("Missing reserve ctx for "+r);let{decimals:l,isCollateral:c,priceInRef:u,reserveLiquidationThreshold:d}=o,m=P.toBigInt(n,l),g=c?m*u/10n**BigInt(l):0n,b=i-g;if(b<=0n)return 0;let h=Q(b.toString()).mul(d).div(s.toString()).toFixed(6,Q.roundDown);return Number(h)}async getHealthFactorAfterSupply(t,e,n){let{totalCollateral:i,totalDebt:s,reserves:a}=await this.getSummary(t),r=re.fromAssetId(e),o=a.find(h=>h.reserveAsset===r);if(!o)throw new Error("Missing reserve ctx for "+r);let{decimals:l,priceInRef:c,reserveLiquidationThreshold:u}=o,m=P.toBigInt(n,l)*c/10n**BigInt(l),g=i+m;if(g<=0n)return 0;let b=Q(g.toString()).mul(u).div(s.toString()).toFixed(6,Q.roundDown);return Number(b)}async getMaxWithdraw(t,e){let{totalDebt:n,reserves:i,healthFactor:s}=await this.getSummary(t),a=re.fromAssetId(e),r=i.find(o=>o.reserveAsset===a);if(!r)throw new Error("Missing reserve ctx for "+a);return this.calculateWithdrawMax(r,n,s)}async getMaxWithdrawAll(t){let{totalDebt:e,reserves:n,healthFactor:i}=await this.getSummary(t),s={};for(let a of n){let r=this.calculateWithdrawMax(a,e,i);a.reserveId&&(s[a.reserveId]=r)}return s}calculateWithdrawMax(t,e,n){let{aTokenBalance:i,availableLiquidity:s,decimals:a,priceInRef:r,reserveLiquidationThreshold:o,isCollateral:l}=t,c=i;if(l&&e>0n){let d=n-Ii;if(d>0){let m=Q(d).mul(e.toString()).div(o).toFixed(0,Q.roundDown),g=Q(m).div(r.toString()).mul(10**a).toFixed(0,Q.roundDown);c=i<BigInt(g)?i:BigInt(g)}else c=0n}return{amount:c<s?c:s,decimals:a}}calculateLinearInterest(t,e,n){let i=n-e;if(i<=0)return oe;let s=t*BigInt(i)/Oi;return oe+s}};var pn={};x(pn,{AssetClient:()=>ct,BalanceClient:()=>K,ChainParams:()=>pt});var ct=class extends E{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:i})=>{let[s]=n;return[s,i]}))}async queryBonds(){let e=await this.api.query.Bonds.Bonds.getEntries();return new Map(e.map(({keyArgs:n,value:i})=>{let[s]=n;return[s,i]}))}async queryAssets(){let e=await this.api.query.AssetRegistry.Assets.getEntries();return new Map(e.filter(({value:n})=>{let{asset_type:i}=n;return this.SUPPORTED_TYPES.includes(i.type)}).map(({keyArgs:n,value:i})=>{let[s]=n;return[s,i]}))}async queryAssetLocations(){let e=await this.api.query.AssetRegistry.AssetLocations.getEntries();return new Map(e.map(({keyArgs:n,value:i})=>{let[s]=n;return[s,i]}))}async mapToken(t,e,n,i){let{name:s,asset_type:a,is_sufficient:r,existential_deposit:o}=e,{symbol:l,decimals:c}=n.get(t)??{};return{id:t,name:s?.asText(),symbol:l,decimals:c,icon:l,type:a.type,isSufficient:r,location:i,existentialDeposit:o}}async mapBond(t,e,n,i){let[s,a]=i,{asset_type:r,is_sufficient:o,existential_deposit:l}=e,{symbol:c,decimals:u}=await this.mapToken(s,e,n),d=Number(a),m=new Intl.DateTimeFormat("en-GB"),g=[c,"Bond",m.format(d)].join(" ");return{id:t,name:g,symbol:c+"b",decimals:u,icon:c,type:r.type,isSufficient:o,existentialDeposit:l,underlyingAssetId:s,maturity:d}}async mapShares(t,e,n,i){let{assets:s}=i,{name:a,symbol:r,asset_type:o,is_sufficient:l,existential_deposit:c}=e,u=await Promise.all(s.map(async g=>{let{symbol:b}=await this.mapToken(g,e,n);return[g,b]})),d=Object.fromEntries(u),m=Object.values(d);return{id:t,name:m.join(", "),symbol:r?.asText()||a?.asText(),decimals:18,icon:m.join("/"),type:o.type,isSufficient:l,existentialDeposit:c,meta:d}}async mapExternal(t,e,n,i){let s=await this.mapToken(t,e,new Map,i),a=n?.find(r=>r.internalId===s.id);return a?{...s,decimals:a.decimals,name:a.name,symbol:a.symbol,icon:a.symbol,isWhiteListed:a.isWhiteListed}:s}parseMetadata(t){return new Map(Array.from(t,([e,n])=>[e,{symbol:n.symbol?.asText(),decimals:n.decimals}]))}async getOnChainAssets(t,e){let[n,i,s,a]=await Promise.all([this.queryAssets(),this.queryAssetLocations(),this.queryShares(),this.queryBonds()]),r=this.parseMetadata(n),o=[];for(let[l,c]of Array.from(n)){let u=i.get(l),{asset_type:d}=c,m;switch(d.type){case"Bond":let g=a.get(l);m=await this.mapBond(l,c,r,g);break;case"StableSwap":let b=s.get(l);m=await this.mapShares(l,c,r,b);break;case"External":m=await this.mapExternal(l,c,e,u);break;default:m=await this.mapToken(l,c,r,u)}o.push(m)}return t?o:o.filter(l=>this.isValidAsset(l))}isValidAsset(t){let e=Math.sign(t.decimals);return!!t.symbol&&(e===0||e===1)}};import{Subject as Ai,bufferCount as Bi,combineLatest as _i,debounceTime as Fi,distinctUntilChanged as un,finalize as Ri,map as ut,pairwise as Ci,shareReplay as Ei,startWith as ki}from"rxjs";var K=class extends E{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 i=await this.api.query.Tokens.Accounts.getValue(t,e);return this.calculateBalance(i)}async getErc20Balance(t,e){return this.getTokenBalanceData(t,e)}subscribeBalance(t){let e=this.subscribeSystemBalance(t),n=this.subscribeTokensBalance(t),i=this.subscribeErc20Balance(t);return _i([e,n,i]).pipe(Fi(250),ut(s=>s.flat()),ki([]),Bi(2,1),ut(([s,a],r)=>r===0?a:this.getDeltas(s,a)))}subscribeSystemBalance(t){return this.api.query.System.Account.watchValue(t,"best").pipe(ut(n=>({id:0,balance:this.calculateBalance(n.data)})))}subscribeTokenBalance(t,e){return this.api.query.Tokens.Accounts.watchValue(t,e,"best").pipe(ut(i=>({id:e,balance:i})))}subscribeTokensBalance(t){return this.api.query.Tokens.Accounts.watchEntries(t,{at:"best"}).pipe(un((n,i)=>!i.deltas),ut(({deltas:n})=>{let i=[];return n?.deleted.forEach(s=>{let[a,r]=s.args;i.push({id:r,balance:this.calculateBalance({free:0n,reserved:0n,frozen:0n})})}),n?.upserted.forEach(s=>{let[a,r]=s.args;i.push({id:r,balance:this.calculateBalance(s.value)})}),i}))}subscribeErc20Balance(t,e){let n=new Ai,i=n.pipe(Ei(1)),s=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 s(),l=async()=>{let d=(await Promise.all(o.map(async m=>{let g=await this.getTokenBalanceData(t,m);return[m,g]}))).map(([m,g])=>({id:m,balance:g}));n.next(d)};await l();let c=this.api.query.System.Number.watchValue("best").subscribe(l);return()=>c.unsubscribe()},r;return a().then(o=>r=o),i.pipe(Ri(()=>r?.()),Ci(),ut(([o,l],c)=>c===0?l.filter(u=>u.balance.transferable>0n):this.getDeltas(o,l)),un((o,l)=>l.length===0))}async getTokenBalanceData(t,e){let n=await this.api.apis.CurrenciesApi.account(e,t);return this.calculateBalance(n)}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}}getDeltas(t,e){let n=(s,a)=>s!==void 0&&a!==void 0&&s.transferable===a.transferable&&s.total===a.total,i=t.reduce((s,a)=>(s.set(a.id,a.balance),s),new Map);return e.filter(s=>!n(s.balance,i.get(s.id)))}};var pt=class extends E{_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 mn={};x(mn,{AssetNotFound:()=>_e,PoolNotFound:()=>_t,RouteNotFound:()=>Ft});var _e=class extends Error{constructor(t){super(),this.message=`${t} not found`,this.name="AssetNotFound"}},_t=class extends Error{constructor(t){super(),this.message=`${t} pool invalid`,this.name="PoolNotFound"}},Ft=class extends Error{constructor(t,e){super(),this.message=`Route from ${t} to ${e} not found in current configuration`,this.name="RouteNotFound"}};var hn={};x(hn,{EvmClient:()=>Rt,createChain:()=>Fe});import{defineChain as Mi}from"viem";var Di=["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"],Fe=()=>Mi({id:222222,name:"Hydration",network:"hydration",nativeCurrency:{decimals:18,name:"WETH",symbol:"WETH"},rpcUrls:{default:{http:Di}},blockExplorers:{default:{name:"Hydration Explorer",url:"https://hydration.subscan.io"}},testnet:!1});import{createPublicClient as dn,createWalletClient as Li,custom as gn,http as qi}from"viem";var Rt=class{client;chain;constructor(t){this.client=t,this.chain=Fe()}get chainId(){return this.chain.id}get chainCurrency(){return this.chain.nativeCurrency.symbol}get chainDecimals(){return this.chain.nativeCurrency.decimals}getProvider(){return dn({chain:this.chain,transport:qi()})}getWsProvider(){return dn({transport:gn({request:({method:t,params:e})=>this.client._request(t,e||[])})})}getSigner(t){return Li({account:t,chain:this.chain,transport:gn(window.ethereum)})}};var Tn={};x(Tn,{LiquidityMiningApi:()=>Ct,LiquidityMiningClient:()=>Et});import{AccountId as Wi}from"polkadot-api";import L from"big.js";import{fixed_from_rational as Sn}from"@galacticcouncil/math-liquidity-mining";var le=class{result=new Map;getKey(t,e){return[e,t.toString()].join(",")}constructor(t,e){for(let n=0;n<t.length;++n){let[i,s]=t[n];this.result.set(this.getKey(s,i),e[n].free)}}freeBalance(t,e){return this.result.get(this.getKey(t,e))??0n}transfer(t,e,n,i){let s=this.getKey(t,e),a=this.getKey(t,n),r=this.result.get(s)??0n,o=this.result.get(a)??0n;if(r<i)throw new Error("Attempting to transfer more than is present");this.result.set(s,r+i),this.result.set(a,o+i)}};import st from"big.js";import{calculate_accumulated_rps as Hi,calculate_global_farm_rewards as Ni,calculate_loyalty_multiplier as Gi,calculate_user_reward as Pn,calculate_yield_farm_delta_rpvs as Ui}from"@galacticcouncil/math-liquidity-mining";import bn from"big.js";var Re=bn(10).pow(18),yn=BigInt(bn(1).pow(18).toString()),fn=6e3;var Vi="1000000000000000000",ce=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 i=await this.getAsset(t.reward_currency),s=e-t.updated_at,a=this.getAccount(t.id),r=i?.existential_deposit;if(!r)throw new Error("Missing reward currency asset list");let o=this.multiCurrency.freeBalance(t.reward_currency,a),l=st(r.toString()),c=st(o.toString()).minus(l.lt(o.toString())?r.toString():o.toString()),u=st(Ni(t.total_shares_z.toString(),n.toString(),st(t.yield_per_period.toString()).mul(Re).round(0,st.roundDown).toFixed(),t.max_reward_per_period.toString(),s.toFixed()));if(c.lt(u)&&(u=c),u.eq(0))return t;let d=this.getAccount(0);return this.multiCurrency.transfer(t.reward_currency,a,d,BigInt(u.toFixed())),{...t,accumulated_rpz:BigInt(Hi(t.accumulated_rpz.toString(),t.total_shares_z.toString(),u.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 i=Ui(t.accumulated_rpz.toString(),e.accumulated_rpz.toString(),t.multiplier.toString(),t.total_valued_shares.toString());return{...t,accumulated_rpvs:t.accumulated_rpvs+BigInt(i),updated_at:n}}getLoyaltyMultiplier(t,e){let n=st(1).mul(Re).round(0,st.roundDown).toString();if(!e)return n;let{initial_reward_percentage:i,scale_coef:s}=e;return Gi(t.toFixed(),i.toString(),s.toFixed())}async claimRewards(t,e,n,i,s){if(e.state.type==="Terminated")return null;let a=Math.floor(i/t.blocks_per_period);if(n.updated_at===a)return null;let r=await this.syncGlobalFarm(t,a,s);if(!r)return null;let o=this.syncYieldFarm(e,r,a);if(!o)return null;let l=o.total_stopped-n.stopped_at_creation,c=o.updated_at-n.entered_at-l,u=this.getLoyaltyMultiplier(c,o.loyalty_curve),d=BigInt(Pn(n.accumulated_rpvs.toString(),n.valued_shares.toString(),n.accumulated_claimed_rewards.toString(),o.accumulated_rpvs.toString(),u)),m=BigInt(Pn(n.accumulated_rpvs.toString(),n.valued_shares.toString(),n.accumulated_claimed_rewards.toString(),o.accumulated_rpvs.toString(),Vi));return{reward:d,maxReward:m,assetId:r.reward_currency,yieldFarmId:o.id,isActiveFarm:o.state.type==="Active"}}};var Yi=L(365.2425).times(24).times(60).times(60),Ct=class{client;balanceClient;options;constructor(t,e,n={}){this.client=t,this.balanceClient=e,this.options=Object.freeze({blockTime:n.blockTime??fn})}get blockTime(){return this.options.blockTime}async getOraclePrice(t,e){let n=[t,e].sort((s,a)=>s-a);if(t===e)return yn;let i=await this.client.getOraclePrice(n);if(i){let{n:s,d:a}=i[0].price,r;return t<e?r=Sn(s.toString(),a.toString()):r=Sn(a.toString(),s.toString()),BigInt(r)}}getFarmAddress=(t,e)=>{let n=Buffer.from("modl","utf-8"),i=Buffer.from(e?"78796b4c4d704944":"4f6d6e6957684c4d","hex"),s=Buffer.from([t]),a=Buffer.concat([n,i,s]),o="0x"+Buffer.concat([a,Buffer.alloc(32-a.length)]).toString("hex");return Wi(63).dec(o)};getGlobalRewardPerPeriod(t,e,n,i){let s=L(i).times(t.toString()).times(e.toString()).div(18);return s.gte(n.toString())?n.toString():s.toString()}getPoolYieldPerPeriod(t,e,n,i){let s=L(t.toString()).times(e),a=L(n.toString()).times(i);return s.div(a.toString()).toString()}farmData(t,e,n){let{yieldFarm:i,globalFarm:s,priceAdjustment:a,balance:r,id:o}=t,{multiplier:l,loyalty_curve:c}=i,{blocks_per_period:u,yield_per_period:d,total_shares_z:m,max_reward_per_period:g,pending_rewards:b,accumulated_paid_rewards:h,planned_yielding_periods:f,updated_at:y,incentivized_asset:S,reward_currency:T,price_adjustment:v,min_deposit:R}=s,O=w.shiftNeg(a??v,18),D=w.shiftNeg(l,18),U=w.shiftNeg(c?.initial_reward_percentage??0,18),X=Yi.div(L(this.blockTime).div(1e3).times(u)).toString(),H;if(m<=0)H=L(D).times(d.toString()).times(X).toString();else{let ti=this.getGlobalRewardPerPeriod(m,d,g,O),ei=this.getPoolYieldPerPeriod(ti,D,m,O);H=L(ei).times(X).toString()}let V=b+h,tt=g*BigInt(f),et=r.transferable+V,Qe=et-V,Zt=L(Qe.toString()).div(g.toString()),te=L(e).div(u.toString()).toString(),ee=(m>=0?Zt.plus(y):Zt.plus(te)).toString(),fe=L(ee).times(u).toString(),Jn=L(m.toString()).div(L(g.toString()).div(d.toString())).div(Math.pow(10,18)).times(100).times(O).toFixed(2),Je=L(V.toString()).div(et.toString()).gte(.999);H=Je?"0":L(H).div(n?2:1).times(100).toString();let Zn=U?L(H).times(U).toString():void 0;return{apr:H,minApr:Zn,isDistributed:Je,estimatedEndPeriod:ee,estimatedEndBlock:fe,maxRewards:tt,incentivizedAsset:S,rewardCurrency:T,loyaltyCurve:c,currentPeriod:te,potMaxRewards:et,fullness:Jn,yieldFarmId:i.id,globalFarmId:s.id,poolId:o,distributedRewards:V,plannedYieldingPeriods:f,minDeposit:R}}async getAllOmnipoolFarms(){let e=(await this.client.getAllOmnipooFarms()).reduce((i,s)=>i.includes(s.keyArgs[0].toString())?i:[...i,s.keyArgs[0].toString()],[]),n=await Promise.all(e.map(async i=>{let s=await this.getOmnipoolFarms(i);if(s)return[i,s]}));return Object.fromEntries(n.filter(i=>!!i))}async getOmnipoolFarms(t){let e=await this.client.getOmnipooFarms(Number(t)),n=await this.client.getRelayBlockNumber(),i=await Promise.all(e.map(async({keyArgs:s,value:a})=>{let[,r]=s,o=a,l=await this.client.getOmnipoolGlobalFarm(r),c=await this.client.getOmnipoolYieldFarm(Number(t),r,o);if(!l||!c)return;let u=l.reward_currency,d=l.incentivized_asset,m=this.getFarmAddress(r),g=await this.getOraclePrice(u,d),b=await this.balanceClient.getBalance(m,u);return{id:t,globalFarm:l,yieldFarm:c,priceAdjustment:g,balance:b}}));return n?i.map(s=>s?this.farmData(s,n):void 0):[]}async getAllIsolatedFarms(){let e=(await this.client.getAllIsolatedFarms()).reduce((i,s)=>i.includes(s.keyArgs[0].toString())?i:[...i,s.keyArgs[0].toString()],[]),n=await Promise.all(e.map(async i=>{let s=await this.getIsolatedFarms(i);if(s)return[i,s]}));return Object.fromEntries(n.filter(i=>!!i))}async getIsolatedFarms(t){let e=await this.client.getIsolatedFarms(t),n=await this.client.getRelayBlockNumber(),i=await Promise.all(e.map(async({keyArgs:s,value:a})=>{let[,r]=s,o=a,l=await this.client.getIsolatedGlobalFarm(r),c=await this.client.getIsolatedYieldFarm(t,r,o);if(!l||!c)return;let u=l.reward_currency,d=l.incentivized_asset,m=this.getFarmAddress(r,!0),g=await this.getOraclePrice(u,d),b=await this.balanceClient.getBalance(m,u);return{id:t,globalFarm:l,yieldFarm:c,priceAdjustment:g,balance:b,farmAddress:m}}));return n?i.map(s=>s?this.farmData(s,n,!0):void 0):[]}async getDepositReward(t,e,n,i){let s=e.global_farm_id,a=e.yield_farm_id,r=n?await this.client.getIsolatedYieldFarm(t,s,a):await this.client.getOmnipoolYieldFarm(Number(t),s,a),o=n?await this.client.getIsolatedGlobalFarm(s):await this.client.getOmnipoolGlobalFarm(s);if(!o||!r)return;let l=o.reward_currency,c=o.incentivized_asset,u=[[this.getFarmAddress(0,n),o.reward_currency],[this.getFarmAddress(o.id,n),o.reward_currency]],d=await this.getAccountAssetBalances(u),m=await this.getOraclePrice(l,c),g=new le(u,d),h=await new ce(y=>this.getFarmAddress(y),y=>this.client.getAsset(y),g).claimRewards(o,r,e,i,m??o.price_adjustment);if(!h)return;let f=await this.client.getAsset(h.assetId);if(f&&!(h.reward<=f.existential_deposit))return h}async getAccountAssetBalances(t){let[e,n]=await Promise.all([Promise.all(t.filter(([s,a])=>a!==0).map(([s,a])=>this.balanceClient.getTokenBalance(s,a))),Promise.all(t.filter(([s,a])=>a===0).map(([s])=>this.balanceClient.getSystemBalance(s)))]),i=[];for(let s=0,a=0;s+a<t.length;){let r=s+a,[,o]=t[r];o===0?(i.push(n[a]),a+=1):(i.push(e[s]),s+=1)}return i}};import{Binary as Xi,Enum as Ki}from"polkadot-api";var Et=class extends E{omnipoolAssetIds=[];async getOraclePrice(t){return await this.api.query.EmaOracle.Oracles.getValue(Xi.fromText("omnipool"),t,Ki("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 Dn={};x(Dn,{PoolContextProvider:()=>Pt,PoolError:()=>J,PoolFactory:()=>yt,PoolType:()=>F,aave:()=>He,hsm:()=>Ve,lbp:()=>Ce,omni:()=>ke,stable:()=>De,xyk:()=>Le});var Ce={};x(Ce,{LbpMath:()=>W,LbpPool:()=>kt,LbpPoolClient:()=>Mt});import{calculate_in_given_out as zi,calculate_out_given_in as ji,calculate_linear_weights as $i,calculate_pool_trade_fee as Qi,get_spot_price as Ji}from"@galacticcouncil/math-lbp";var W=class{static getSpotPrice(t,e,n,i,s){return Ji(t,e,n,i,s)}static calculateInGivenOut(t,e,n,i,s){return zi(t,e,n,i,s)}static calculateOutGivenIn(t,e,n,i,s){return ji(t,e,n,i,s)}static calculateLinearWeights(t,e,n,i,s){return $i(t,e,n,i,s)}static calculatePoolTradeFee(t,e,n){return Qi(t,e,n)}};var F=(a=>(a.Aave="Aave",a.LBP="LBP",a.Omni="Omnipool",a.Stable="Stableswap",a.XYK="XYK",a.HSM="HSM",a))(F||{}),J=(c=>(c.UnknownError="UnknownError",c.FacilitatorCapacityExceeded="FacilitatorCapacityExceeded",c.InsufficientTradingAmount="InsufficientTradingAmount",c.InsufficientCollateral="InsufficientCollateral",c.MaxHoldingExceeded="MaxHoldingExceeded",c.MaxInRatioExceeded="MaxInRatioExceeded",c.MaxOutRatioExceeded="MaxOutRatioExceeded",c.TradeNotAllowed="TradeNotAllowed",c.MaxBuyBackExceeded="MaxBuyBackExceeded",c.MaxBuyPriceExceeded="MaxBuyPriceExceeded",c))(J||{});var{FeeUtils:vn}=w,kt=class p{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;fee;repayFeeApply;static fromPool(t){return new p(t)}constructor(t){this.type="LBP",this.address=t.address,this.tokens=t.tokens,this.maxInRatio=t.maxInRatio,this.maxOutRatio=t.maxOutRatio,this.minTradingLimit=t.minTradingLimit,this.fee=t.fee,this.repayFeeApply=t.repayFeeApply}validatePair(t,e){return!0}parsePair(t,e){let n=new Map(this.tokens.map(a=>[a.id,a])),i=n.get(t),s=n.get(e);if(i==null)throw new Error("Pool does not contain tokenIn");if(s==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,balanceIn:i.balance,balanceOut:s.balance,decimalsIn:i.decimals,decimalsOut:s.decimals,weightIn:i.weight,weightOut:s.weight}}validateAndBuy(t,e,n){let i=this.tokens[0].id,s=[];e<this.minTradingLimit&&s.push("InsufficientTradingAmount");let a=t.balanceOut/this.maxOutRatio;if(e>a&&s.push("MaxOutRatioExceeded"),i===t.assetOut){let r=this.calculateTradeFee(e,n),o=vn.toPct(this.repayFeeApply?n.repayFee:n.exchangeFee),l=e+r,c=this.calculateInGivenOut(t,l),u=t.balanceIn/this.maxInRatio;return c>u&&s.push("MaxInRatioExceeded"),{amountIn:c,calculatedIn:c,amountOut:e,feePct:o,errors:s}}else{let r=this.calculateInGivenOut(t,e),o=t.balanceIn/this.maxInRatio;return r>o&&s.push("MaxInRatioExceeded"),{amountIn:r,calculatedIn:r,amountOut:e,feePct:0,errors:s}}}validateAndSell(t,e,n){let i=this.tokens[0].id,s=[];e<this.minTradingLimit&&s.push("InsufficientTradingAmount");let a=t.balanceIn/this.maxInRatio;if(e>a&&s.push("MaxInRatioExceeded"),i===t.assetIn){let r=this.calculateOutGivenIn(t,e),o=t.balanceOut/this.maxOutRatio;return r>o&&s.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:r,amountOut:r,feePct:0,errors:s}}else{let r=this.calculateOutGivenIn(t,e),o=this.calculateTradeFee(r,n),l=vn.toPct(this.repayFeeApply?n.repayFee:n.exchangeFee),c=r-o,u=t.balanceOut/this.maxOutRatio;return c>u&&s.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:r,amountOut:c,feePct:l,errors:s}}}calculateInGivenOut(t,e){let n=W.calculateInGivenOut(t.balanceIn.toString(),t.balanceOut.toString(),t.weightIn.toString(),t.weightOut.toString(),e.toString()),i=BigInt(n);return i<0n?0n:i}calculateOutGivenIn(t,e){let n=W.calculateOutGivenIn(t.balanceIn.toString(),t.balanceOut.toString(),t.weightIn.toString(),t.weightOut.toString(),e.toString()),i=BigInt(n);return i<0n?0n:i}spotPriceInGivenOut(t){let e=W.getSpotPrice(t.balanceOut.toString(),t.balanceIn.toString(),t.weightOut.toString(),t.weightIn.toString(),this.maxOutRatio.toString());return BigInt(e)}spotPriceOutGivenIn(t){let e=W.getSpotPrice(t.balanceIn.toString(),t.balanceOut.toString(),t.weightIn.toString(),t.weightOut.toString(),this.maxInRatio.toString());return BigInt(e)}calculateTradeFee(t,e){let n=W.calculatePoolTradeFee(t.toString(),this.repayFeeApply?e.repayFee[0]:e.exchangeFee[0],this.repayFeeApply?e.repayFee[1]:e.exchangeFee[1]);return BigInt(n)}};import{CompatibilityLevel as fs}from"polkadot-api";import{Subscription as Ps,distinctUntilChanged as Ss,filter as Ts}from"rxjs";import{memoize1 as ts}from"@thi.ng/memoize";import{TLRUCache as es}from"@thi.ng/cache";import{ReplaySubject as ns,Subscription as is,bufferCount as ss,combineLatest as xn,debounceTime as as,defer as rs,filter as os,finalize as ls,from as cs,map as mt,merge as us,of as ps,pairwise as ms,skip as ds,share as gs,startWith as hs,switchMap as bs,tap as wn,throttleTime as ys}from"rxjs";import{BehaviorSubject as Zi}from"rxjs";var ue=class{store$=new Zi([]);updateQueue=Promise.resolve();changeset=new Set;get pools(){return this.store$.value}asObservable(){return this.store$.asObservable()}applyChangeset(t){return this.changeset.size===0?[]:t.filter(e=>this.changeset.has(e.address))}set(t){this.changeset=new Set(t.map(e=>e.address)),this.store$.next(t)}update(t){this.updateQueue=this.updateQueue.then(async()=>{let e=this.store$.value,n=new Map(e.map((r,o)=>[r.address,o])),i=await t(e),s=e.slice(),a=new Set;for(let r of i){let o=n.get(r.address);o===void 0?(n.set(r.address,s.length),s.push(r)):s[o]=r,a.add(r.address)}this.changeset=a,this.store$.next(s)}).catch(console.error)}destroy(){this.store$.complete()}};var q=class extends K{evm;store=new ue;shared$;mem=0;memPoolsCache=new es(null,{ttl:6*1e3});memPools=ts(t=>(this.log(this.getPoolType(),"sync mem pools",t),this.loadPools()),this.memPoolsCache);constructor(t,e){super(t),this.evm=e}async getMemPools(){return this.memPools(this.mem)}async getPools(){return(await this.getMemPools()).filter(e=>this.hasValidAssets(e))}getSubscriber(){return this.shared$||(this.shared$=this.subscribeStore()),this.shared$.pipe(hs([]),ss(2,1),mt(([t,e])=>t.length===0?e:this.store.applyChangeset(e)),os(t=>t.length>0),ys(1e3,void 0,{leading:!0,trailing:!0}))}subscribeStore(){return rs(()=>{let t=new is;return cs(this.getMemPools()).pipe(mt(n=>n.filter(i=>this.hasValidAssets(i))),wn(n=>this.store.set(n))).pipe(wn(()=>{t.add(this.subscribeBalances()),t.add(this.subscribeUpdates())}),bs(n=>us(ps(n),this.store.asObservable().pipe(ds(1)))),ls(()=>{t.unsubscribe()}))}).pipe(gs({connector:()=>new ns(1),resetOnRefCountZero:!0}))}subscribeBalances(){let t=this.store.pools.map(e=>{let{address:n}=e,i=[this.subscribeTokensBalance(n)];if(this.hasSystemAsset(e)){let s=this.subscribeSystemBalance(n);i.push(s)}if(this.hasErc20Asset(e)){let s=e.tokens.filter(r=>r.type==="Erc20").map(r=>r.id),a=this.subscribeErc20Balance(n,s);i.push(a)}return xn(i).pipe(mt(s=>s.flat()),ms(),mt(([s,a])=>this.getDeltas(s,a)),mt(s=>[n,s]))});return xn(t).pipe(as(250),mt(e=>new Map(e))).subscribe(e=>this.store.update(n=>this.updateBalances(n,e)))}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(({decimals:e,balance:n})=>n>0n&&!!e)}updateBalances=(t,e)=>{let n=[],i=new Map(t.map(s=>[s.address,s]));for(let[s,a]of e){let r=i.get(s);if(r){let o=r.tokens.map(l=>{let c=a.find(u=>u.id===l.id);return c&&l.id!==r.id?{...l,balance:c.balance.transferable}:l});n.push({...r,tokens:o})}}return n}};var Mt=class extends q{MAX_FINAL_WEIGHT=100000000n;poolsData=new Map([]);getPoolType(){return"LBP"}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}}getPoolWeights(t,e){let{start:n,end:i,initial_weight:s,final_weight:a}=t,r=W.calculateLinearWeights(n?n.toString():"0",i?i.toString():"0",s.toString(),a.toString(),e.toString()),o=BigInt(r),l=this.MAX_FINAL_WEIGHT-BigInt(o);return[o,l]}async isSupported(){let t=this.api.query.LBP.PoolData,e=await this.api.compatibilityToken;return t.isCompatible(fs.BackwardsCompatible,e)}async loadPools(){let[t,e,n]=await Promise.all([this.api.query.LBP.PoolData.getEntries(),this.api.query.ParachainSystem.ValidationData.getValue(),this.getPoolLimits()]),i=e?.relay_parent_number||0,s=t.filter(({value:a})=>e&&this.isActivePool(a,i)).map(async({keyArgs:a,value:r})=>{let[o]=a,l=o.toString(),c=await this.getPoolDelta(l,r,i);return{address:l,type:"LBP",fee:r.fee,...c,...n}});return Promise.all(s)}async getPoolDelta(t,e,n){let{assets:i,repay_target:s,fee_collector:a}=e,[r,o]=this.getPoolWeights(e,n),[l,c]=i,[u,d,m,g,b]=await Promise.all([this.isRepayFeeApplied(l,s,a.toString()),this.getBalance(t,l),this.api.query.AssetRegistry.Assets.getValue(l),this.getBalance(t,c),this.api.query.AssetRegistry.Assets.getValue(c)]);return{repayFeeApply:u,tokens:[{id:l,decimals:m?.decimals,existentialDeposit:m?.existential_deposit,balance:d.transferable,weight:r,type:m?.asset_type.type},{id:c,decimals:b?.decimals,existentialDeposit:b?.existential_deposit,balance:g.transferable,weight:o,type:b?.asset_type.type}]}}isActivePool(t,e){let{start:n,end:i}=t;return n&&i?e>=n&&e<i:!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 getPoolFees(t,e){let n=this.store.pools.find(s=>s.address===e);return{repayFee:await this.getRepayFee(),exchangeFee:n.fee}}subscribeValidationData(){return this.api.query.ParachainSystem.ValidationData.watchValue("best").pipe(Ts(t=>t!==void 0),Ss((t,e)=>t.relay_parent_number===e.relay_parent_number)).subscribe(({relay_parent_number:t})=>{this.store.update(async e=>{let n=[];for(let i of e){let s=this.poolsData.get(i.address);if(s){let{assets:a,repay_target:r,fee_collector:o}=s,[l]=a,[c,u]=this.getPoolWeights(s,t),[d,m]=i.tokens,g=[{...d,weight:c},{...m,weight:u}],b=await this.isRepayFeeApplied(l,r,o.toString());n.push({...i,tokens:g,repayFeeApply:b})}}return n})})}subscribeUpdates(){let t=new Ps;return t.add(this.subscribeValidationData()),t}};var ke={};x(ke,{OmniMath:()=>I,OmniPool:()=>Dt,OmniPoolClient:()=>Lt});import{calculate_in_given_out as vs,calculate_lrna_in_given_out as xs,calculate_out_given_in as ws,calculate_out_given_lrna_in as Is,calculate_spot_price as Os,calculate_lrna_spot_price as As,calculate_shares as Bs,calculate_liquidity_out as _s,calculate_liquidity_lrna_out as Fs,verify_asset_cap as Rs,calculate_liquidity_hub_in as Cs,is_sell_allowed as Es,is_buy_allowed as ks,is_add_liquidity_allowed as Ms,is_remove_liquidity_allowed as Ds,recalculate_asset_fee as Ls,recalculate_protocol_fee as qs}from"@galacticcouncil/math-omnipool";import dt from"big.js";var I=class{static calculateSpotPrice(t,e,n,i){return Os(t,e,n,i)}static calculateLrnaSpotPrice(t,e){return As(t,e)}static calculateInGivenOut(t,e,n,i,s,a,r,o,l){return vs(t,e,n,i,s,a,r,o,l)}static calculateLrnaInGivenOut(t,e,n,i,s){return xs(t,e,n,i,s)}static calculateOutGivenIn(t,e,n,i,s,a,r,o,l){return ws(t,e,n,i,s,a,r,o,l)}static calculateOutGivenLrnaIn(t,e,n,i,s){return Is(t,e,n,i,s)}static calculateShares(t,e,n,i){return Bs(t,e,n,i)}static calculateLiquidityOut(t,e,n,i,s,a,r,o){return _s(t,e,n,i,s,a,r,o)}static calculateLiquidityLRNAOut(t,e,n,i,s,a,r,o){return Fs(t,e,n,i,s,a,r,o)}static calculateCapDifference(t,e,n,i){let s=dt(e),a=dt(t),r=dt(i),o=dt(n),l=dt(10).pow(18),c=o.div(l);if(s.div(r).lt(c)){let d=c.times(r).minus(s).times(a),m=s.times(dt(1).minus(c));return d.div(m).toFixed(0)}else return"0"}static calculateLimitHubIn(t,e,n,i){return Cs(t,e,n,i)}static isSellAllowed(t){return Es(t)}static isBuyAllowed(t){return ks(t)}static isAddLiquidityAllowed(t){return Ms(t)}static isRemoveLiquidityAllowed(t){return Ds(t)}static recalculateAssetFee(t,e,n,i,s,a,r,o,l,c,u){return Ls(t,e,n,i,s,a,r,o,l,c,u)}static recalculateProtocolFee(t,e,n,i,s,a,r,o,l,c,u){return qs(t,e,n,i,s,a,r,o,l,c,u)}static verifyAssetCap(t,e,n,i){return Rs(t,e,n,i)}};var{FeeUtils:gt}=w,Dt=class p{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;hubAssetId;static fromPool(t){return new p(t)}constructor(t){this.type="Omnipool",this.address=t.address,this.tokens=t.tokens,this.maxInRatio=t.maxInRatio,this.maxOutRatio=t.maxOutRatio,this.minTradingLimit=t.minTradingLimit,this.hubAssetId=t.hubAssetId}validatePair(t,e){return this.hubAssetId!=e}parsePair(t,e){let n=new Map(this.tokens.map(a=>[a.id,a])),i=n.get(t),s=n.get(e);if(i==null)throw new Error("Pool does not contain tokenIn");if(s==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,hubReservesIn:i.hubReserves,hubReservesOut:s.hubReserves,sharesIn:i.shares,sharesOut:s.shares,decimalsIn:i.decimals,decimalsOut:s.decimals,balanceIn:i.balance,balanceOut:s.balance,tradeableIn:i.tradeable,tradeableOut:s.tradeable,assetInEd:i.existentialDeposit,assetOutEd:s.existentialDeposit}}validateAndBuy(t,e,n){let i=this.calculateInGivenOut(t,e),s=this.calculateInGivenOut(t,e,n),a=i===0n?0:A.calculateDiffToRef(s,i),r=[],o=I.isSellAllowed(t.tradeableIn),l=I.isBuyAllowed(t.tradeableOut);(!o||!l)&&r.push("TradeNotAllowed"),(e<this.minTradingLimit||i<t.assetInEd)&&r.push("InsufficientTradingAmount");let c=t.balanceOut/this.maxOutRatio;e>c&&r.push("MaxOutRatioExceeded");let u=t.balanceIn/this.maxInRatio;return s>u&&r.push("MaxInRatioExceeded"),{amountIn:s,calculatedIn:i,amountOut:e,feePct:a,errors:r}}validateAndSell(t,e,n){let i=this.calculateOutGivenIn(t,e),s=this.calculateOutGivenIn(t,e,n),a=A.calculateDiffToRef(i,s),r=[],o=I.isSellAllowed(t.tradeableIn),l=I.isBuyAllowed(t.tradeableOut);(!o||!l)&&r.push("TradeNotAllowed"),(e<this.minTradingLimit||i<t.assetOutEd)&&r.push("InsufficientTradingAmount");let c=t.balanceIn/this.maxInRatio;e>c&&r.push("MaxInRatioExceeded");let u=t.balanceOut/this.maxOutRatio;return s>u&&r.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:i,amountOut:s,feePct:a,errors:r}}calculateInGivenOut(t,e,n){if(t.assetIn==this.hubAssetId)return this.calculateLrnaInGivenOut(t,e,n);let i=I.calculateInGivenOut(t.balanceIn.toString(),t.hubReservesIn.toString(),t.sharesIn.toString(),t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),n?gt.toRaw(n.assetFee).toString():"0",n?gt.toRaw(n.protocolFee).toString():"0"),s=BigInt(i);return s<0n?0n:s}calculateLrnaInGivenOut(t,e,n){let i=I.calculateLrnaInGivenOut(t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),n?gt.toRaw(n.assetFee).toString():"0"),s=BigInt(i);return s<0n?0n:s}calculateOutGivenIn(t,e,n){if(t.assetIn==this.hubAssetId)return this.calculateOutGivenLrnaIn(t,e,n);let i=I.calculateOutGivenIn(t.balanceIn.toString(),t.hubReservesIn.toString(),t.sharesIn.toString(),t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),n?gt.toRaw(n.assetFee).toString():"0",n?gt.toRaw(n.protocolFee).toString():"0"),s=BigInt(i);return s<0n?0n:s}calculateOutGivenLrnaIn(t,e,n){let i=I.calculateOutGivenLrnaIn(t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),n?gt.toRaw(n.assetFee).toString():"0"),s=BigInt(i);return s<0n?0n:s}spotPriceInGivenOut(t){if(t.assetIn==this.hubAssetId)return this.spotPriceLrnaInGivenOut(t);let e=I.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=I.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=I.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=I.calculateLrnaSpotPrice(t.balanceOut.toString(),t.hubReservesOut.toString()),n=Math.pow(10,18-t.decimalsIn);return BigInt(e)/BigInt(n)}};import{AccountId as Hs,Binary as Ns,CompatibilityLevel as Gs,Enum as Us}from"polkadot-api";import{toHex as Vs}from"@polkadot-api/utils";import{Subscription as Ws,distinctUntilChanged as Ee,filter as Ys,finalize as ht,map as Xs,merge as Ks}from"rxjs";var{FeeUtils:C}=w,In=Ns.fromText("omnipool"),On=Us("Short"),Lt=class extends q{queryBus=new ae;block=0;dynamicFeesConfig=this.queryBus.scope("DynamicFees.AssetFeeConfiguration",t=>this.api.query.DynamicFees.AssetFeeConfiguration.getValue(t),t=>String(t));dynamicFees=this.queryBus.scope("DynamicFees.AssetFee",t=>this.api.query.DynamicFees.AssetFee.getValue(t),t=>String(t),6*1e3);emaOracles=this.queryBus.scope("EmaOracle.Oracles.Short",t=>this.api.query.EmaOracle.Oracles.getValue(In,t,On),t=>t.join(":"),6*1e3);getPoolType(){return"Omnipool"}getPoolAddress(){let t="modlomnipool".padEnd(32,"\0"),e=new TextEncoder().encode(t),n=Vs(e);return Hs(63).dec(n)}getOraclePair(t){return t===0?[0,1]:[1,t]}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 isSupported(){let t=this.api.query.Omnipool.Assets,e=await this.api.compatibilityToken;return t.isCompatible(Gs.BackwardsCompatible,e)}async loadPools(){let t=await this.api.constants.Omnipool.HubAssetId(),e=this.getPoolAddress(),[n,i,s,a,r]=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:u})=>{let[d]=c,{hub_reserve:m,shares:g,tradable:b,cap:h,protocol_shares:f}=u,[y,S]=await Promise.all([this.api.query.AssetRegistry.Assets.getValue(d),this.getBalance(e,d)]);return{id:d,decimals:y?.decimals,existentialDeposit:y?.existential_deposit,balance:S.transferable,cap:h,hubReserves:m,protocolShares:f,shares:g,tradeable:b,type:y?.asset_type.type}}),l=await Promise.all(o);return l.push({id:t,decimals:s?.decimals,existentialDeposit:s?.existential_deposit,balance:a.transferable,tradeable:i,type:s?.asset_type.type}),[{address:e,type:"Omnipool",hubAssetId:t,tokens:l,...r}]}async getPoolFees(t){let e=t.assetOut,n=t.assetIn,i=await this.dynamicFeesConfig.get(e);if(i?.type==="Fixed"){let{asset_fee:y,protocol_fee:S}=i.value;return{assetFee:C.fromPermill(y),protocolFee:C.fromPermill(S)}}let s=this.getOraclePair(e),a=this.getOraclePair(n),[r,o,l]=await Promise.all([this.dynamicFees.get(e),this.emaOracles.get(s),this.emaOracles.get(a)]),[c,u,d]=await this.getAssetFee(t,this.block,r,o,i?.value.asset_fee_params),[m,g,b]=n===1?[0,0,0]:await this.getProtocolFee(t,this.block,r,l,i?.value.protocol_fee_params),h=c+m,f=d+b;return{assetFee:C.fromPermill(u),protocolFee:C.fromPermill(g),min:C.fromPermill(h),max:C.fromPermill(f)}}async getAssetFee(t,e,n,i,s){let{assetOut:a,balanceOut:r}=t,{min_fee:o,max_fee:l,decay:c,amplification:u}=s||await this.api.constants.DynamicFees.AssetFeeParameters();if(!n||!i)return[o,o,l];let d=C.fromPermill(o),m=C.fromPermill(l),[g]=i,{asset_fee:b,timestamp:h}=n,f=Math.max(1,e-h),y=g.volume.b_in.toString(),S=g.volume.b_out.toString(),T=g.liquidity.b.toString();a===0&&(y=g.volume.a_in.toString(),S=g.volume.a_out.toString(),T=g.liquidity.a.toString());let v=C.fromPermill(b),R=I.recalculateAssetFee(y,S,T,"9",r.toString(),C.toRaw(v).toString(),f.toString(),C.toRaw(d).toString(),C.toRaw(m).toString(),c.toString(),u.toString());return[o,Number(R)*1e6,l]}async getProtocolFee(t,e,n,i,s){let{assetIn:a,balanceIn:r}=t,{min_fee:o,max_fee:l,decay:c,amplification:u}=s||await this.api.constants.DynamicFees.ProtocolFeeParameters();if(!n||!i)return[o,o,l];let d=C.fromPermill(o),m=C.fromPermill(l),[g]=i,{protocol_fee:b,timestamp:h}=n,f=Math.max(1,e-h),y=g.volume.b_in.toString(),S=g.volume.b_out.toString(),T=g.liquidity.b.toString();a===0&&(y=g.volume.a_in.toString(),S=g.volume.a_out.toString(),T=g.liquidity.a.toString());let v=C.fromPermill(b),R=I.recalculateProtocolFee(y,S,T,"9",r.toString(),C.toRaw(v).toString(),f.toString(),C.toRaw(d).toString(),C.toRaw(m).toString(),c.toString(),u.toString());return[o,Number(R)*1e6,l]}subscribeEmaOracles(){let[t]=this.store.pools,n=t.tokens.map(i=>i.id).map(i=>this.getOraclePair(i)).map(i=>this.api.query.EmaOracle.Oracles.watchValue(In,i,On,"best").pipe(Ys(s=>s!==void 0),Xs(s=>({pair:i,value:s}))));return Ks(...n).pipe(ht(()=>{this.log(this.getPoolType(),"unsub ema oracles"),this.emaOracles.clear()})).subscribe(i=>{let{pair:s,value:a}=i;this.emaOracles.set(a,s)})}subscribeDynamicFees(){return this.api.query.DynamicFees.AssetFee.watchEntries({at:"best"}).pipe(Ee((t,e)=>!e.deltas),ht(()=>{ht(()=>{this.log(this.getPoolType(),"unsub dyn fees"),this.dynamicFees.clear()})})).subscribe(({deltas:t})=>{t?.upserted.forEach(e=>{let[n]=e.args;this.dynamicFees.set(e.value,n)})})}subscribeDynamicFeesConfig(){return this.api.query.DynamicFees.AssetFeeConfiguration.watchEntries({at:"best"}).pipe(Ee((t,e)=>!e.deltas),ht(()=>{this.log(this.getPoolType(),"unsub dyn fees config"),this.dynamicFeesConfig.clear()})).subscribe(({deltas:t})=>{t?.upserted.forEach(e=>{let[n]=e.args;this.dynamicFeesConfig.set(e.value,n)})})}subscribeBlock(){return this.api.query.System.Number.watchValue("best").pipe(ht(()=>{this.log(this.getPoolType(),"unsub block change")})).subscribe(t=>{this.block=t})}subscribeAssets(){return this.api.query.Omnipool.Assets.watchEntries({at:"best"}).pipe(Ee((t,e)=>!e.deltas),ht(()=>{this.log(this.getPoolType(),"unsub assets")})).subscribe(({deltas:t})=>{this.store.update(([e])=>{let n=t?.upserted.reduce((s,a)=>{let[r]=a.args;return s.set(r,a.value),s},new Map),i=e.tokens.map(s=>{let a=n?.get(s.id);return a?this.updateTokenState(s,a):s});return[{...e,tokens:i}]})})}subscribeUpdates(){let t=new Ws;return t.add(this.subscribeAssets()),t.add(this.subscribeDynamicFees()),t.add(this.subscribeDynamicFeesConfig()),t.add(this.subscribeEmaOracles()),t.add(this.subscribeBlock()),t}updateTokenState(t,e){let{hub_reserve:n,shares:i,tradable:s,cap:a,protocol_shares:r}=e;return{...t,cap:a,hubReserves:n,protocolShares:r,shares:i,tradeable:s}}};var De={};x(De,{StableMath:()=>M,StableSwap:()=>Z,StableSwapClient:()=>qt});import{calculate_in_given_out as zs,calculate_out_given_in as js,calculate_amplification as $s,calculate_add_one_asset as Qs,calculate_liquidity_out_one_asset as Js,calculate_shares as Zs,calculate_shares_for_amount as ta,calculate_spot_price_with_fee as ea,pool_account_name as na,recalculate_peg as ia}from"@galacticcouncil/math-stableswap";var M=class{static getPoolAddress(t){return na(t)}static defaultPegs(t){let e=[];for(let n=0;n<t;n++)e.push(["1","1"]);return e}static calculateAmplification(t,e,n,i,s){return $s(t,e,n,i,s)}static calculateInGivenOut(t,e,n,i,s,a,r){return zs(t,e,n,i,s,a,r)}static calculateAddOneAsset(t,e,n,i,s,a,r){return Qs(t,e,n,i,s,a,r)}static calculateSharesForAmount(t,e,n,i,s,a,r){return ta(t,e,n,i,s,a,r)}static calculateOutGivenIn(t,e,n,i,s,a,r){return js(t,e,n,i,s,a,r)}static calculateLiquidityOutOneAsset(t,e,n,i,s,a,r){return Js(t,e,n,i,s,a,r)}static calculateShares(t,e,n,i,s,a){return Zs(t,e,n,i,s,a)}static calculateSpotPriceWithFee(t,e,n,i,s,a,r,o){return ea(t,e,n,i,s,a,r,o)}static recalculatePegs(t,e,n,i,s){let a=ia(t,e,n,i,s);return JSON.parse(a)}};var{FeeUtils:bt}=w,Z=class p{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;amplification;isRampPeriod;id;fee;totalIssuance;pegs;static fromPool(t){return new p(t)}constructor(t){this.type="Stableswap",this.address=t.address,this.tokens=t.tokens,this.maxInRatio=t.maxInRatio,this.maxOutRatio=t.maxOutRatio,this.minTradingLimit=t.minTradingLimit,this.amplification=t.amplification,this.isRampPeriod=t.isRampPeriod,this.id=t.id,this.fee=t.fee,this.totalIssuance=t.totalIssuance,this.pegs=t.pegs}validatePair(t,e){return!0}parsePair(t,e){let n=new Map(this.tokens.map(a=>[a.id,a])),i=n.get(t),s=n.get(e);if(i==null)throw new Error("Pool does not contain tokenIn");if(s==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,balanceIn:i.balance,balanceOut:s.balance,decimalsIn:i.decimals,decimalsOut:s.decimals,tradeableIn:this.id===t?15:i.tradeable,tradeableOut:this.id===e?15:s.tradeable,assetInEd:i.existentialDeposit,assetOutEd:s.existentialDeposit}}validateAndBuy(t,e,n){let i=this.calculateInGivenOut(t,e),s=this.calculateInGivenOut(t,e,n),a=i===0n?0:A.calculateDiffToRef(s,i),r=[],o=I.isSellAllowed(t.tradeableIn),l=I.isBuyAllowed(t.tradeableOut);return(!o||!l)&&r.push("TradeNotAllowed"),(e<this.minTradingLimit||i<t.assetInEd)&&r.push("InsufficientTradingAmount"),{amountIn:s,calculatedIn:i,amountOut:e,feePct:a,errors:r}}validateAndSell(t,e,n){let i=this.calculateOutGivenIn(t,e),s=this.calculateOutGivenIn(t,e,n),a=A.calculateDiffToRef(i,s),r=[],o=I.isSellAllowed(t.tradeableIn),l=I.isBuyAllowed(t.tradeableOut);return(!o||!l)&&r.push("TradeNotAllowed"),(e<this.minTradingLimit||i<t.assetOutEd)&&r.push("InsufficientTradingAmount"),{amountIn:e,calculatedOut:i,amountOut:s,feePct:a,errors:r}}calculateIn(t,e,n){let i=M.calculateInGivenOut(this.getReserves(),Number(t.assetIn),Number(t.assetOut),e.toString(),this.amplification.toString(),n?bt.toRaw(n.fee).toString():"0",this.getPegs()),s=BigInt(i);return s<0n?0n:s}calculateAddOneAsset(t,e,n){let i=M.calculateAddOneAsset(this.getReserves(),e.toString(),Number(t.assetIn),this.amplification.toString(),this.totalIssuance.toString(),n?bt.toRaw(n.fee).toString():"0",this.getPegs()),s=BigInt(i);return s<0n?0n:s}calculateSharesForAmount(t,e,n){let i=M.calculateSharesForAmount(this.getReserves(),Number(t.assetOut),e.toString(),this.amplification.toString(),this.totalIssuance.toString(),n?bt.toRaw(n.fee).toString():"0",this.getPegs()),s=BigInt(i);return s<0n?0n:s}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=M.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 i=Math.pow(10,t.decimalsIn-t.decimalsOut);return BigInt(e)/BigInt(i)}let n=Math.pow(10,18-t.decimalsIn);return BigInt(e)/BigInt(n)}calculateOut(t,e,n){let i=M.calculateOutGivenIn(this.getReserves(),Number(t.assetIn),Number(t.assetOut),e.toString(),this.amplification.toString(),n?bt.toRaw(n.fee).toString():"0",this.getPegs()),s=BigInt(i);return s<0n?0n:s}calculateWithdrawOneAsset(t,e,n){let i=M.calculateLiquidityOutOneAsset(this.getReserves(),e.toString(),Number(t.assetOut),this.amplification.toString(),this.totalIssuance.toString(),n?bt.toRaw(n.fee).toString():"0",this.getPegs()),s=BigInt(i);return s<0n?0n:s}calculateShares(t,e,n){let i=M.calculateShares(this.getReserves(),this.getAssets(t.assetIn,e),this.amplification.toString(),this.totalIssuance.toString(),n?bt.toRaw(n.fee).toString():"0",this.getPegs()),s=BigInt(i);return s<0n?0n:s}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=M.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 i=Math.pow(10,t.decimalsOut-t.decimalsIn);return BigInt(e)/BigInt(i)}let n=Math.pow(10,18-t.decimalsOut);return BigInt(e)/BigInt(n)}getPegs(){return JSON.stringify(this.pegs)}getReserves(){let t=this.tokens.filter(e=>e.id!=this.id).map(({id:e,balance:n,decimals:i})=>({asset_id:e,amount:n,decimals:i}));return JSON.stringify(t,Bt.jsonFormatter)}getAssets(t,e){let n={asset_id:Number(t),amount:e.toString()};return JSON.stringify([n],Bt.jsonFormatter)}};import{AccountId as sa,CompatibilityLevel as aa}from"polkadot-api";import{toHex as ra}from"@polkadot-api/utils";import{blake2b as oa}from"@noble/hashes/blake2b";import{Subscription as la,distinctUntilChanged as ca,finalize as Me,map as ua,merge as pa}from"rxjs";var{FeeUtils:ma}=w,qt=class extends q{poolsData=new Map([]);getPoolType(){return"Stableswap"}getPoolAddress(t){let e=M.getPoolAddress(t),n=oa(e,{dkLen:32}),i=ra(n);return sa(63).dec(i)}async getPoolLimits(){return{maxInRatio:0n,maxOutRatio:0n,minTradingLimit:await this.api.constants.Stableswap.MinTradingLimit()}}getPoolAmplification(t,e){let{initial_amplification:n,final_amplification:i,initial_block:s,final_block:a}=t,r=M.calculateAmplification(n.toString(),i.toString(),s.toString(),a.toString(),e.toString()),o=Number(r)<i;return{amplification:BigInt(r),isRampPeriod:o}}async getPoolTokens(t,e){let n=this.getPoolAddress(t),i=e.assets.map(async s=>{let[a,r,o]=await Promise.all([this.api.query.Stableswap.AssetTradability.getValue(t,s),this.api.query.AssetRegistry.Assets.getValue(s),this.getBalance(n,s)]);return{id:s,decimals:r?.decimals,existentialDeposit:r?.existential_deposit,balance:o.transferable,tradeable:a,type:r?.asset_type.type}});return Promise.all(i)}async isSupported(){let t=this.api.query.Stableswap.Pools,e=await this.api.compatibilityToken;return t.isCompatible(aa.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()]),i=t.map(async({keyArgs:s,value:a})=>{let[r]=s,o=this.getPoolAddress(r),[l,c,u]=await Promise.all([this.getPoolTokens(r,a),this.api.query.Stableswap.PoolPegs.getValue(r),this.api.query.Tokens.TotalIssuance.getValue(r)]),d=this.getPoolAmplification(a,e),m=c?this.getRecentPegs(c):this.getDefaultPegs(a);return l.push({id:r,tradeable:15,balance:u,decimals:18}),this.poolsData.set(r,a),{address:o,id:r,type:"Stableswap",fee:ma.fromPermill(a.fee),tokens:l,totalIssuance:u,pegs:m,...n,...d}});return Promise.all(i)}async getPoolFees(t,e){return{fee:this.store.pools.find(i=>i.address===e).fee}}getDefaultPegs(t){return M.defaultPegs(t.assets.length)}getRecentPegs(t){let{current:e}=t;return Array.from(e.entries()).map(([n,i])=>i.map(s=>s.toString()))}subscribeIssuance(){let e=this.store.pools.map(n=>n.id).map(n=>this.api.query.Tokens.TotalIssuance.watchValue(n,"best").pipe(ua(i=>({id:n,value:i}))));return pa(...e).pipe(Me(()=>{this.log(this.getPoolType(),"unsub total issuance")})).subscribe(n=>{let{id:i,value:s}=n;this.store.update(a=>{let r=[];return a.filter(o=>o.id===i).forEach(o=>{let l=o.tokens.map(c=>c.id===i?{...c,balance:s}:c);r.push({...o,tokens:l,totalIssuance:s})}),r})})}subscribePoolPegs(){return this.api.query.Stableswap.PoolPegs.watchEntries({at:"best"}).pipe(ca((t,e)=>!e.deltas),Me(()=>{this.log(this.getPoolType(),"unsub pool pegs")})).subscribe(({deltas:t})=>{this.store.update(e=>{let n=[],i=new Map(e.map(s=>[s.id,s]));return t?.upserted.forEach(({args:s,value:a})=>{let[r]=s,o=i.get(r);if(o){let l=this.getRecentPegs(a);n.push({...o,pegs:l})}}),n})})}subscribeBlock(){return this.api.query.System.Number.watchValue("best").pipe(Me(()=>{this.log(this.getPoolType(),"unsub block change")})).subscribe(t=>{this.store.update(e=>{let n=[];return e.filter(i=>i.isRampPeriod).forEach(i=>{let s=this.poolsData.get(i.id);if(s){let a=this.getPoolAmplification(s,t);n.push({...i,...a})}}),n})})}subscribeUpdates(){let t=new la;return t.add(this.subscribePoolPegs()),t.add(this.subscribeIssuance()),this.hasOnRamps()&&t.add(this.subscribeBlock()),t}hasOnRamps(){return this.store.pools.filter(t=>t.isRampPeriod).length>0}};var Le={};x(Le,{XykMath:()=>j,XykPool:()=>Ht,XykPoolClient:()=>Nt});import{calculate_in_given_out as da,calculate_out_given_in as ga,calculate_pool_trade_fee as ha,get_spot_price as ba,calculate_liquidity_in as ya,calculate_shares as fa,calculate_spot_price as Pa,calculate_spot_price_with_fee as Sa,calculate_liquidity_out_asset_a as Ta,calculate_liquidity_out_asset_b as va}from"@galacticcouncil/math-xyk";var j=class{static getSpotPrice(t,e,n){return ba(t,e,n)}static calculateInGivenOut(t,e,n){return da(t,e,n)}static calculateOutGivenIn(t,e,n){return ga(t,e,n)}static calculatePoolTradeFee(t,e,n){return ha(t,e,n)}static calculateLiquidityIn(t,e,n){return ya(t,e,n)}static calculateSpotPrice(t,e){return Pa(t,e)}static calculateSpotPriceWithFee(t,e,n,i){return Sa(t,e,n,i)}static calculateShares(t,e,n){return fa(t,e,n)}static calculateLiquidityOutAssetA(t,e,n,i){return Ta(t,e,n,i)}static calculateLiquidityOutAssetB(t,e,n,i){return va(t,e,n,i)}};var{FeeUtils:An}=w,Ht=class p{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;static fromPool(t){return new p(t)}constructor(t){this.type="XYK",this.address=t.address,this.tokens=t.tokens,this.maxInRatio=t.maxInRatio,this.maxOutRatio=t.maxOutRatio,this.minTradingLimit=t.minTradingLimit}validatePair(t,e){return!0}parsePair(t,e){let n=new Map(this.tokens.map(a=>[a.id,a])),i=n.get(t),s=n.get(e);if(i==null)throw new Error("Pool does not contain tokenIn");if(s==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,decimalsIn:i.decimals,decimalsOut:s.decimals,balanceIn:i.balance,balanceOut:s.balance,assetInEd:i.existentialDeposit,assetOutEd:s.existentialDeposit}}validateAndBuy(t,e,n){let i=this.calculateInGivenOut(t,e),s=this.calculateTradeFee(i,n),a=An.toPct(n.exchangeFee),r=i+s,o=[];(e<this.minTradingLimit||i<t.assetInEd)&&o.push("InsufficientTradingAmount");let l=t.balanceOut/this.maxOutRatio;e>l&&o.push("MaxOutRatioExceeded");let c=t.balanceIn/this.maxInRatio;return r>c&&o.push("MaxInRatioExceeded"),{amountIn:r,calculatedIn:i,amountOut:e,feePct:a,errors:o}}validateAndSell(t,e,n){let i=this.calculateOutGivenIn(t,e),s=this.calculateTradeFee(i,n),a=An.toPct(n.exchangeFee),r=i-s,o=[];(e<this.minTradingLimit||i<t.assetOutEd)&&o.push("InsufficientTradingAmount");let l=t.balanceIn/this.maxInRatio;e>l&&o.push("MaxInRatioExceeded");let c=t.balanceOut/this.maxOutRatio;return r>c&&o.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:i,amountOut:r,feePct:a,errors:o}}calculateInGivenOut(t,e){let n=j.calculateInGivenOut(t.balanceIn.toString(),t.balanceOut.toString(),e.toString()),i=BigInt(n);return i<0n?0n:i}calculateOutGivenIn(t,e){let n=j.calculateOutGivenIn(t.balanceIn.toString(),t.balanceOut.toString(),e.toString()),i=BigInt(n);return i<0n?0n:i}spotPriceInGivenOut(t){let e=j.calculateSpotPrice(t.balanceOut.toString(),t.balanceIn.toString()),n=Math.pow(10,18-t.decimalsOut);return BigInt(e)/BigInt(n)}spotPriceOutGivenIn(t){let e=j.calculateSpotPrice(t.balanceIn.toString(),t.balanceOut.toString()),n=Math.pow(10,18-t.decimalsIn);return BigInt(e)/BigInt(n)}calculateTradeFee(t,e){let n=j.calculatePoolTradeFee(t.toString(),e.exchangeFee[0],e.exchangeFee[1]);return BigInt(n)}};import{CompatibilityLevel as xa}from"polkadot-api";import{Subscription as wa}from"rxjs";var Nt=class extends q{decimals=new Map([]);getPoolType(){return"XYK"}async withOverride(t){this.decimals=t?new Map(t.map(e=>[e.id,e.decimals])):new Map}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 isSupported(){let t=this.api.query.XYK.PoolAssets,e=await this.api.compatibilityToken;return t.isCompatible(xa.BackwardsCompatible,e)}async loadPools(){let t=this.api.query.XYK.PoolAssets,[e,n]=await Promise.all([t.getEntries(),this.getPoolLimits()]),i=e.map(async({keyArgs:s,value:a})=>{let[r]=s,[o,l]=a,[c,u,d,m]=await Promise.all([this.getBalance(r,o),this.api.query.AssetRegistry.Assets.getValue(o),this.getBalance(r,l),this.api.query.AssetRegistry.Assets.getValue(l)]);return{address:r,type:"XYK",tokens:[{id:o,decimals:u?.decimals||this.decimals.get(o),existentialDeposit:u?.existential_deposit,balance:c.transferable,type:u?.asset_type.type},{id:l,decimals:m?.decimals||this.decimals.get(l),existentialDeposit:m?.existential_deposit,balance:d.transferable,type:m?.asset_type.type}],...n}});return Promise.all(i)}async getPoolFees(){return{exchangeFee:await this.getExchangeFee()}}async getExchangeFee(){return await this.api.constants.XYK.GetExchangeFee()}subscribeUpdates(){return wa.EMPTY}};var He={};x(He,{AavePool:()=>Gt,AavePoolClient:()=>Ut});var Gt=class p{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;static fromPool(t){return new p(t)}constructor(t){this.type="Aave",this.address=t.address,this.tokens=t.tokens,this.maxInRatio=t.maxInRatio,this.maxOutRatio=t.maxOutRatio,this.minTradingLimit=t.minTradingLimit}validatePair(t,e){return!0}parsePair(t,e){let n=new Map(this.tokens.map(a=>[a.id,a])),i=n.get(t),s=n.get(e);if(i==null)throw new Error("Pool does not contain tokenIn");if(s==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,balanceIn:i.balance,balanceOut:s.balance,decimalsIn:i.decimals,decimalsOut:s.decimals,assetInEd:0n,assetOutEd:0n}}validateAndBuy(t,e,n){let i=this.calculateInGivenOut(t,e),s=[];return e>t.balanceOut&&s.push("TradeNotAllowed"),{amountIn:i,calculatedIn:i,amountOut:e,feePct:0,errors:s}}validateAndSell(t,e,n){let i=this.calculateOutGivenIn(t,e),s=[];return i>t.balanceOut&&s.push("TradeNotAllowed"),{amountIn:e,calculatedOut:i,amountOut:i,feePct:0,errors:s}}calculateInGivenOut(t,e){return e}calculateOutGivenIn(t,e){return e}spotPriceInGivenOut(t){let e=Math.pow(10,t.decimalsOut);return BigInt(e)}spotPriceOutGivenIn(t){let e=Math.pow(10,t.decimalsIn);return BigInt(e)}calculateTradeFee(t,e){return 0n}};import{AccountId as Ia}from"polkadot-api";import{toHex as Oa}from"@polkadot-api/utils";import{Subscription as _n,filter as qe,finalize as Fn,map as Rn}from"rxjs";import{decodeEventLog as Aa}from"viem";var Bn=[{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:Ba}=at,_a=["Supply","Withdraw","Repay","Borrow"],Ut=class extends q{getPoolType(){return"Aave"}async isSupported(){return!0}getPoolId(t,e){let n=t+"/"+e,i=new TextEncoder().encode(n.padEnd(32,"\0")),s=Oa(i);return Ia(63).dec(s)}getPoolLimits(){return{maxInRatio:0n,maxOutRatio:0n,minTradingLimit:0n}}async loadPools(){let e=(await this.api.apis.AaveTradeExecutor.pools()).map(async({reserve:n,atoken:i,liqudity_in:s,liqudity_out:a})=>{let[r,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(i),this.api.query.AssetRegistry.AssetLocations.getValue(i)]);return{address:this.getPoolId(n,i),type:"Aave",tokens:[{id:n,decimals:r?.decimals,existentialDeposit:r?.existential_deposit,balance:s,location:o,type:r?.asset_type.type},{id:i,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:i,liqudity_out:s}=await this.api.apis.AaveTradeExecutor.pool(e.id,n.id);return t.tokens.map(a=>{let r=a.id===e.id?i:s;return{...a,balance:r}})}async getPoolFees(){return{}}getReserveH160Id(t){if(t.type==="Erc20"&&t.location){let e=t.location.interior;if(e.type==="X1"&&e.value.type==="AccountKey20"){let{value:n}=e.value;return n.key.asHex()}throw new Error("Invalid aave reserve multilocation")}return Ba.fromAssetId(t.id)}parseRouterLog(t){let{asset_in:e,asset_out:n}=t;return{assetIn:e,assetOut:n,key:`${e}:${n}`}}parseEvmLog(t){let{topics:e,data:n}=t.log,i=e.map(a=>a.asHex()),s=n.asHex();try{let{eventName:a,args:r}=Aa({abi:Bn,topics:i,data:s}),o=r.reserve.toLowerCase();return{eventName:a,reserve:o,key:`${a}:${o}`}}catch{return}}subscribeRouterExecuted(){let e=this.store.pools.map(n=>n.tokens).map(([n,i])=>i).map(n=>n.id);return this.api.event.Router.Executed.watch().pipe(Rn(({payload:n})=>this.parseRouterLog(n)),qe(({assetIn:n,assetOut:i})=>e.includes(n)||e.includes(i)),Fn(()=>{this.log(this.getPoolType(),"unsub router executed")})).subscribe(({assetIn:n,assetOut:i,key:s})=>{this.log(this.getPoolType(),"[router:Executed]",s),this.store.update(async a=>{let r=[];for(let o of a){let[l,c]=o.tokens;if(c.id===n||c.id===i){let d=await this.getPoolDelta(o);r.push({...o,tokens:d})}}return r})})}subscribeEvmLog(){return this.api.event.EVM.Log.watch().pipe(Rn(({payload:t})=>this.parseEvmLog(t)),qe(t=>t!==void 0),qe(({eventName:t})=>_a.includes(t)),Fn(()=>{this.log(this.getPoolType(),"unsub evm log")})).subscribe(({reserve:t,key:e})=>{this.log(this.getPoolType(),"[evm:Log]",e),this.store.update(async n=>{let i=[];for(let s of n){let[a]=s.tokens;if(this.getReserveH160Id(a).toLowerCase()===t){let o=await this.getPoolDelta(s);i.push({...s,tokens:o})}}return i})})}subscribeBalances(){return _n.EMPTY}subscribeUpdates(){let t=new _n;return t.add(this.subscribeRouterExecuted()),t.add(this.subscribeEvmLog()),t}};var yt=class{static get(t){switch(t.type){case"Aave":return Gt.fromPool(t);case"XYK":return Ht.fromPool(t);case"Omnipool":return Dt.fromPool(t);case"LBP":return kt.fromPool(t);case"Stableswap":return Z.fromPool(t);case"HSM":return Z.fromPool(t);default:throw new Error("Pool type "+t.type+" is not supported yet")}}};import{Subject as Ya,Subscription as ft,takeUntil as Xa}from"rxjs";var Ve={};x(Ve,{HsmMath:()=>Y,HsmPool:()=>Ne,HsmPoolClient:()=>Xt});import{calculate_collateral_in_given_hollar_out as Fa,calculate_collateral_out_given_hollar_in as Ra,calculate_hollar_in_given_collateral_out as Ca,calculate_hollar_out_given_collateral_in as Ea,calculate_imbalance as ka,calculate_max_price as Ma,calculate_buyback_limit as Da,calculate_buyback_price_with_fee as La}from"@galacticcouncil/math-hsm";var Y=class{static calculateCollateralInGivenHollarOut(t,e,n){return Fa(t,e,n)}static calculateCollateralOutGivenHollarIn(t,e,n){return Ra(t,e,n)}static calculateHollarOutGivenCollateralIn(t,e,n){return Ea(t,e,n)}static calculateHollarInGivenCollateralOut(t,e,n){return Ca(t,e,n)}static calculateImbalance(t,e,n){return ka(t,e,n)}static calculateBuybackLimit(t,e){return Da(t,e)}static calculateBuybackPriceWithFee(t,e,n){return La(t,e,n)}static calculateMaxPrice(t,e){return Ma(t,e)}};var{FeeUtils:Vt}=w,Ne=class p extends Z{hsmAddress;hsmMintCapacity;hollarId;hollarH160;collateralId;collateralBalance;maxBuyPriceCoefficient;maxInHolding;purchaseFee;buyBackFee;buyBackRate;static fromPool(t){return new p(t)}constructor(t){super(t),this.type="HSM",this.hsmAddress=t.hsmAddress,this.hsmMintCapacity=t.hsmMintCapacity,this.hollarId=t.hollarId,this.hollarH160=t.hollarH160,this.collateralId=t.collateralId,this.collateralBalance=t.collateralBalance,this.maxBuyPriceCoefficient=t.maxBuyPriceCoefficient,this.maxInHolding=t.maxInHolding,this.purchaseFee=t.purchaseFee,this.buyBackFee=t.buyBackFee,this.buyBackRate=t.buyBackRate}validatePair(t,e){return!0}parsePair(t,e){return super.parsePair(t,e)}validateTradeHollarIn(t,e,n,i){let s=this.calculateBuybackLimit(t);e>s&&i.push("MaxBuyBackExceeded");let a=this.calculateBuyPrice(t,e,n),r=this.calculateMaxPrice(t);return a>r&&i.push("MaxBuyPriceExceeded"),n>this.collateralBalance&&i.push("InsufficientCollateral"),i}validateTradeHollarOut(t,e,n){return this.collateralBalance+t>this.maxInHolding&&n.push("MaxHoldingExceeded"),e>this.hsmMintCapacity&&n.push("FacilitatorCapacityExceeded"),n}validateTradeConstraints(t,e,n){let i=[];return t.assetIn===this.hollarId?this.validateTradeHollarIn(t,e,n,i):this.validateTradeHollarOut(e,n,i)}validateAndBuy(t,e){let n=this.calculateInGivenOut(t,e),i=this.validateTradeConstraints(t,n,e);return{amountIn:n,calculatedIn:n,amountOut:e,feePct:0,errors:i}}validateAndSell(t,e){let n=this.calculateOutGivenIn(t,e),i=this.validateTradeConstraints(t,e,n);return{amountIn:e,calculatedOut:n,amountOut:n,feePct:0,errors:i}}calculateHollarInGivenCollateralOut(t,e){let n=super.calculateInGivenOut(t,e,{fee:this.fee}),i=Y.calculateHollarInGivenCollateralOut(e.toString(),n.toString(),Vt.toRaw(this.buyBackFee).toString());return BigInt(i)}calculateCollateralInGivenHollarOut(t){let e=this.getCollateralPeg(),n=Y.calculateCollateralInGivenHollarOut(t.toString(),JSON.stringify(e),Vt.toRaw(this.purchaseFee).toString());return BigInt(n)}calculateInGivenOut(t,e){return t.assetOut==this.hollarId?this.calculateCollateralInGivenHollarOut(e):this.calculateHollarInGivenCollateralOut(t,e)}calculateCollateralOutGivenHollarIn(t,e){let n=super.calculateOutGivenIn(t,e,{fee:this.fee}),i=Y.calculateCollateralOutGivenHollarIn(e.toString(),n.toString(),Vt.toRaw(this.buyBackFee).toString());return BigInt(i)}calculateHollarOutGivenCollateralIn(t){let e=this.getCollateralPeg(),n=Y.calculateHollarOutGivenCollateralIn(t.toString(),JSON.stringify(e),Vt.toRaw(this.purchaseFee).toString());return BigInt(n)}calculateOutGivenIn(t,e){return t.assetIn==this.hollarId?this.calculateCollateralOutGivenHollarIn(t,e):this.calculateHollarOutGivenCollateralIn(e)}calculateImbalance(t){let e=this.getCollateralPeg(),n=Y.calculateImbalance(t.balanceIn.toString(),JSON.stringify(e),t.balanceOut.toString());return BigInt(n)}calculateBuybackLimit(t){let e=this.calculateImbalance(t),n=Y.calculateBuybackLimit(e.toString(),Vt.toRaw(this.buyBackRate).toString());return BigInt(n)}calculateBuyPrice(t,e,n){let i=n*10n**BigInt(t.decimalsIn);return e*10n**BigInt(t.decimalsOut)/i}calculateMaxPrice(t){let e=this.getCollateralPeg(),n=Y.calculateMaxPrice(JSON.stringify(e),this.maxBuyPriceCoefficient.toString()),[i,s]=JSON.parse(n),a=10n**BigInt(18-t.decimalsOut);return BigInt(i)*a/BigInt(s)}spotPriceInGivenOut(t){let e=P.toBigInt(1,t.decimalsOut);return this.calculateInGivenOut(t,e)}spotPriceOutGivenIn(t){let e=P.toBigInt(1,t.decimalsIn);return this.calculateOutGivenIn(t,e)}getCollateralPeg(){let t=this.tokens.findIndex(i=>i.id!==this.hollarId),e=this.pegs[t],n=this.tokens[t].decimals;return this.isDefaultPeg(e)?[P.toBigInt(1,18).toString(),P.toBigInt(1,n).toString()]:e}isDefaultPeg(t){let[e,n]=t;return Array.isArray(t)&&t.length===2&&e==="1"&&n==="1"}};import{AccountId as qa,CompatibilityLevel as Ha}from"polkadot-api";import{toHex as Na}from"@polkadot-api/utils";import{Subscription as Cn,combineLatest as Ga,filter as En,finalize as kn,map as Ge,pairwise as Ua}from"rxjs";import{decodeEventLog as Va}from"viem";var Wt=[{inputs:[{internalType:"address",name:"facilitator",type:"address"}],name:"getFacilitator",outputs:[{type:"tuple",components:[{name:"addr",type:"address"},{name:"label",type:"bytes32"},{name:"bucketCapacity",type:"uint128"},{name:"bucketLevel",type:"uint128"}]}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"facilitator",type:"address"}],name:"getFacilitatorBucket",outputs:[{internalType:"uint256",name:"",type:"uint256"},{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[],name:"getFacilitatorsList",outputs:[{internalType:"address[]",name:"",type:"address[]"}],stateMutability:"view",type:"function"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"facilitatorAddress",type:"address"},{indexed:!0,internalType:"bytes32",name:"label",type:"bytes32"},{indexed:!1,internalType:"uint256",name:"bucketCapacity",type:"uint256"}],name:"FacilitatorAdded",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"facilitatorAddress",type:"address"},{indexed:!1,internalType:"uint256",name:"oldCapacity",type:"uint256"},{indexed:!1,internalType:"uint256",name:"newCapacity",type:"uint256"}],name:"FacilitatorBucketCapacityUpdated",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"facilitatorAddress",type:"address"},{indexed:!1,internalType:"uint256",name:"oldLevel",type:"uint256"},{indexed:!1,internalType:"uint256",name:"newLevel",type:"uint256"}],name:"FacilitatorBucketLevelUpdated",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"facilitatorAddress",type:"address"}],name:"FacilitatorRemoved",type:"event"}];var Yt=class{client;constructor(t){this.client=t.getWsProvider()}async getFacilitatorCapacity(t,e){let[n,i]=await this.client.readContract({abi:Wt,address:t,functionName:"getFacilitatorBucket",args:[e]});return n-i}};var{FeeUtils:Ue}=w,{H160:Mn}=lt,Wa=["FacilitatorBucketCapacityUpdated","FacilitatorBucketLevelUpdated"],Xt=class extends q{ghoClient;stableClient;constructor(t,e,n){super(t,e),this.stableClient=n,this.ghoClient=new Yt(e)}getPoolType(){return"HSM"}getPoolId(t){return this.getPoolAddress("hsm:"+t)}getFacilitatorAddress(){return this.getPoolAddress("modlpy/hsmod")}getHollarAddress(t){if(t){let e=t.interior;if(e.type==="X1"&&e.value.type==="AccountKey20"){let{value:n}=e.value;return n.key.asHex()}}throw Error("Invalid hollar multilocation")}getPoolAddress(t){let e=t.padEnd(32,"\0"),n=new TextEncoder().encode(e),i=Na(n);return qa(63).dec(i)}async isSupported(){let t=this.api.query.HSM.Collaterals,e=await this.api.compatibilityToken;return t.isCompatible(Ha.BackwardsCompatible,e)}async loadPools(){let t=await this.api.constants.HSM.HollarId(),[e,n,i]=await Promise.all([this.api.query.AssetRegistry.AssetLocations.getValue(t),this.api.query.HSM.Collaterals.getEntries(),this.stableClient.getPools()]);if(n.length===0)return[];let s=this.getFacilitatorAddress(),a=Mn.fromAny(s),r=this.getHollarAddress(e),o=await this.ghoClient.getFacilitatorCapacity(r,a),l=n.map(async({keyArgs:u,value:d})=>{let[m]=u,{pool_id:g,max_buy_price_coefficient:b,max_in_holding:h,purchase_fee:f,buy_back_fee:y,buyback_rate:S}=d,T=i.find(v=>v.id===g);if(T){let v=this.getPoolId(g),R=await this.getBalance(s,m);return{...T,address:v,type:"HSM",tokens:T.tokens.filter(O=>O.id!==g),hsmAddress:s,hsmMintCapacity:o,hollarId:t,hollarH160:r,collateralId:m,collateralBalance:R.transferable,maxBuyPriceCoefficient:b,maxInHolding:h,purchaseFee:Ue.fromPermill(f),buyBackFee:Ue.fromPermill(y),buyBackRate:Ue.fromPerbill(S)}}});return(await Promise.all(l)).filter(u=>u!==null)}async getPoolFees(){return{}}parseEvmLog(t){let{topics:e,data:n}=t.log,i=e.map(a=>a.asHex()),s=n.asHex();try{let{eventName:a,args:r}=Va({abi:Wt,topics:i,data:s}),o=r.facilitatorAddress.toLowerCase();return{eventName:a,facilitator:o,key:`${a}:${o}`}}catch{return}}subscribeEvmLog(){return this.api.event.EVM.Log.watch().pipe(Ge(({payload:t})=>this.parseEvmLog(t)),En(t=>t!==void 0),En(({eventName:t})=>Wa.includes(t)),kn(()=>{this.log(this.getPoolType(),"unsub evm log")})).subscribe(({facilitator:t,key:e})=>{this.log(this.getPoolType(),"[evm:Log]",e),this.store.update(async n=>{let i=[],[{hsmAddress:s,hollarH160:a}]=n,r=Mn.fromAny(s);if(r.toLowerCase()===t){let l=await this.ghoClient.getFacilitatorCapacity(a,r);for(let c of n)i.push({...c,hsmMintCapacity:l})}return i})})}subscribeBalances(){let t=[],e=[];this.store.pools.forEach(s=>{let{tokens:a,collateralId:r}=s;a.find(l=>l.id===r).type==="Erc20"?e.push(r):t.push(r)});let[{hsmAddress:n}]=this.store.pools,i=[];if(t.length>0){let s=this.subscribeTokensBalance(n);i.push(s)}if(e.length>0){let s=this.subscribeErc20Balance(n,e);i.push(s)}return i.length>0?Ga(i).pipe(Ge(s=>s.flat()),Ua(),Ge(([s,a])=>this.getDeltas(s,a)),kn(()=>{this.log(this.getPoolType(),"unsub collateral balance")})).subscribe(s=>{this.store.update(a=>{let r=[],o=new Map(a.map(l=>[l.collateralId,l]));return s.forEach(({id:l,balance:c})=>{let u=o.get(l);u&&(this.log(this.getPoolType(),"[collateral:Balance]",l,c.transferable),r.push({...u,collateralBalance:c.transferable}))}),r})}):Cn.EMPTY}subscribeUpdates(){let t=new Cn;return t.add(this.subscribeEvmLog()),t}};var Pt=class extends E{evm;aave;omnipool;stableswap;hsm;xyk;lbp;active=new Set([]);pools=new Map([]);clients=[];aaveSub=ft.EMPTY;omniSub=ft.EMPTY;stableSub=ft.EMPTY;hsmSub=ft.EMPTY;xykSub=ft.EMPTY;lbpSub=ft.EMPTY;isReady=!1;isDestroyed=new Ya;constructor(t,e){super(t),this.evm=e,this.aave=new Ut(t,e),this.omnipool=new Lt(t,e),this.stableswap=new qt(t,e),this.hsm=new Xt(t,e,this.stableswap),this.xyk=new Nt(t,e),this.lbp=new Mt(t,e),this.clients=[this.aave,this.omnipool,this.stableswap,this.hsm,this.xyk,this.lbp]}subscribe(t){return t.getSubscriber().pipe(Xa(this.isDestroyed)).subscribe(e=>{e.forEach(n=>{this.pools.set(n.address,n)})})}withAave(){return this.aaveSub.unsubscribe(),this.aaveSub=this.subscribe(this.aave),this.active.add("Aave"),this}withOmnipool(){return this.omniSub.unsubscribe(),this.omniSub=this.subscribe(this.omnipool),this.active.add("Omnipool"),this}withStableswap(){return this.stableSub.unsubscribe(),this.stableSub=this.subscribe(this.stableswap),this.active.add("Stableswap"),this}withHsm(){return this.hsmSub.unsubscribe(),this.hsmSub=this.subscribe(this.hsm),this.active.add("HSM"),this}withXyk(t){return this.xyk.withOverride(t),this.xykSub.unsubscribe(),this.xykSub=this.subscribe(this.xyk),this.active.add("XYK"),this}withLbp(){return this.lbpSub.unsubscribe(),this.lbpSub=this.subscribe(this.lbp),this.active.add("LBP"),this}destroy(){this.isDestroyed.next(!0),this.isDestroyed.complete(),this.active.clear(),this.pools.clear(),this.isReady=!1}async getPools(){if(this.isReady){let e=this.pools.values();return Array.from(e)}let t=await Promise.all(this.clients.filter(e=>this.active.has(e.getPoolType())).map(e=>e.getPools()));return this.isReady=!0,t.flat()}async getPoolFees(t,e){let n=this.clients.find(i=>i.getPoolType()===e.type);if(n)return n.getPoolFees(t,e.address);throw new _t(e.type)}};var Gn={};x(Gn,{DEFAULT_BLOCK_TIME:()=>qn,DEFAULT_MIN_BUDGET:()=>Xe,ORDER_MIN_BLOCK_PERIOD:()=>Hn,Router:()=>St,TWAP_BLOCK_PERIOD:()=>$t,TWAP_MAX_DURATION:()=>ze,TWAP_MAX_PRICE_IMPACT:()=>Ke,TWAP_TX_MULTIPLIER:()=>Hm,TradeOrderError:()=>Ye,TradeOrderType:()=>me,TradeRouteBuilder:()=>N,TradeRouter:()=>Tt,TradeScheduler:()=>vt,TradeType:()=>pe});var Kt=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 Ka=10,zt=class{isNotVisited(t,e){let n=!0;return e.forEach(i=>{(i[0]===t[0]||i[1]===t[1])&&(n=!1)}),n}findPaths(t,e,n){let i=[],s=new Kt,a=[];for(a.push([e,""]),s.enqueue(a);s.size()>0;){let r=s.dequeue();if(!r||r.length>Ka)continue;let o=r[r.length-1];(n===null||o[0]===n)&&i.push(r),t.get(o[0])?.forEach(c=>{if(this.isNotVisited(c,r)){let u=[...r];u.push(c),s.enqueue(u)}})}return i}findShortestPaths(t,e,n){let i=[],s=new Kt,a=[];a.push([e,""]),s.enqueue(a);let r=1/0;for(;s.size()>0;){let o=s.dequeue();if(!o)continue;let l=o[o.length-1];if(l[0]===n){o.length<r?(r=o.length,i.length=0,i.push(o)):o.length===r&&i.push(o);continue}let c=t.get(l[0]);for(let u of c??[])this.isNotVisited(u,o)&&s.enqueue([...o,u])}return i}buildAndPopulateGraph(t,e){let n=new Map;for(let i of t)n.set(parseInt(i),[]);for(let[i,s,a]of e)n.get(s)?.push([a,i]);return n}};function We(p){let t={};for(let e of p){let n=e.tokens.length;for(let i=0;i<n;i++){t[e.tokens[i].id]||(t[e.tokens[i].id]=[]);for(let s=0;s<n;s++){if(i==s)continue;let a=[e.address,e.tokens[i].id,e.tokens[s].id];t[e.tokens[i].id].push(a)}}}return t}var jt=class{getProposals(t,e,n){let i=n.filter(h=>h.type==="XYK"),s=n.filter(h=>h.type!=="XYK"),a=new Set(s.map(h=>h.tokens).flat().map(h=>h.id)),r=a.has(t),o=a.has(e),l=new zt,c=h=>{let f=We(h),y=Object.keys(f),S=y.flatMap(T=>f[T]);return l.buildAndPopulateGraph(y,S)};if(!r&&!o){let h=i.filter(S=>S.tokens.find(T=>T.id===t)||S.tokens.find(T=>T.id===e)),f=c(h),y=l.findPaths(f,t,e);return this.parsePaths(y)}if(r&&o){let h=c(s),f=l.findPaths(h,t,e);return this.parsePaths(f)}let u=r?e:t,d=i.filter(h=>h.tokens.some(f=>f.id===u));if(d.length===0)return[];let m=[...s,...d],g=c(m),b=l.findPaths(g,t,e);return this.parsePaths(b)}parsePaths(t){let e=[];for(let n of t){let i=[];for(let s=0;s<n.length;s++){let a=n[s],r=n[s+1];if(r==null)break;i.push(this.toEdge(a,r))}e.push(i)}return e}toEdge(t,e){return[e[1],t[0],e[0]]}};var St=class{routeSuggester;routeProposals;ctx;filter={};constructor(t){this.ctx=t,this.routeSuggester=new jt,this.routeProposals=new Map}async withFilter(t){this.filter=t||{},this.routeProposals.clear(),this.onFilterChanged()}onFilterChanged(){}buildRouteKey(t,e,n){return`${t}->${e}::${n.length}`}applyPoolFilter(t){let{useOnly:e=[],exclude:n=[]}=this.filter,i=new Set(e),s=new Set(n);return t.filter(a=>s.has(a.type)?!1:i.size>0?i.has(a.type):!0)}async getPools(){let t=await this.ctx.getPools();return this.applyPoolFilter(t)}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(i=>i!==t).map(i=>this.getRoutes(i,t)))).filter(i=>i.length>0).map(([i])=>i[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 i=this.getAssets(n);if(!i.has(t))throw new Error(t+" is not supported asset");if(!i.has(e))throw new Error(e+" is not supported asset");return this.toPoolsMap(n)}getAssets(t){let e=t.map(n=>n.tokens.map(i=>i.id)).flat().sort((n,i)=>n>i?1:-1);return new Set(e)}getPaths(t,e,n){let i=this.toPoolsMap(n);return this.getProposals(t,e,n).filter(a=>this.validPath(a,i)).map(a=>this.toHops(a,i))}getProposals(t,e,n){let i=this.buildRouteKey(t,e,n);if(this.routeProposals.has(i))return this.routeProposals.get(i);let s=this.routeSuggester.getProposals(t,e,n);return this.routeProposals.set(i,s),s}validPath(t,e){return t.length>0&&t.map(n=>this.validEdge(n,e)).reduce((n,i)=>n&&i)}validEdge([t,e,n],i){return i.get(t)?.validatePair(e,n)||!1}toPoolsMap(t){return new Map(t.map(e=>[e.address,yt.get(e)]))}toHops(t,e){return t.map(([n,i,s])=>{let a=e.get(n);return{poolAddress:n,poolId:a?.id,pool:a?.type,assetIn:i,assetOut:s}})}};var pe=(e=>(e.Buy="Buy",e.Sell="Sell",e))(pe||{}),me=(n=>(n.Dca="Dca",n.TwapSell="TwapSell",n.TwapBuy="TwapBuy",n))(me||{}),Ye=(n=>(n.OrderTooSmall="OrderTooSmall",n.OrderTooBig="OrderTooBig",n.OrderImpactTooBig="OrderImpactTooBig",n))(Ye||{});var{FeeUtils:Ln}=w,Tt=class extends St{mlr;constructor(t){super(t),this.mlr=new Map}onFilterChanged(){this.mlr.clear()}buildCtxSync(t,e,n){let i=super.validateInput(t,e,n),s=super.getPaths(t,e,n);if(!s.length)throw new Ft(t,e);return{paths:s,pools:n,poolsMap:i}}async withCtx(t,e,n){let i=await super.getPools(),s=this.buildCtxSync(t,e,i);return n(s)}isDirectTrade(t){return t.length==1}findBestSellRoute(t){let e=t.sort((n,i)=>{let s=n[n.length-1].amountOut,a=i[i.length-1].amountOut;return s>a?-1:1});return e.find(n=>n.every(i=>i.errors.length==0))||e[0]}getRouteFeeRange(t){if(t.filter(n=>n.tradeFeeRange).length>0){let n=t.map(s=>s.tradeFeeRange?.[0]??s.tradeFeePct).reduce((s,a)=>s+a),i=t.map(s=>s.tradeFeeRange?.[1]??s.tradeFeePct).reduce((s,a)=>s+a);return[n,i]}}getPoolFeeRange(t){let e=t.min?Ln.toPct(t.min):void 0,n=t.max?Ln.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(r=>r.assetOutDecimals).reduce((r,o)=>r+o),i=t.map(r=>r.spotPrice).reduce((r,o)=>r*o),s=n-e.assetOutDecimals,a=Math.pow(10,s);return i/BigInt(a)}async getSell(t,e,n,i){return this.withCtx(t,e,async({paths:s,poolsMap:a})=>{let r;if(i)r=await this.toSellSwaps(n,i,a);else{let o=s.map(c=>this.toSellSwaps(n,c,a)),l=await Promise.all(o);r=this.findBestSellRoute(l)}return this.buildSell(a,r)})}async getSells(t,e,n){return this.withCtx(t,e,async({paths:i,poolsMap:s})=>{let a=i.map(o=>this.toSellSwaps(n,o,s));return(await Promise.all(a)).filter(o=>o.every(l=>l.errors.length==0)).map(o=>this.buildSell(s,o)).sort((o,l)=>o.amountOut>l.amountOut?-1:1)})}buildSell(t,e){let n=e[0],i=e[e.length-1],s=this.isDirectTrade(e),a=this.getSellSpot(e),r=i.amountOut,o=s?i.calculatedOut:this.calculateDelta0Y(n.amountIn,e,t),l=o-r,c=this.getRouteFeeRange(e),u=s?i.tradeFeePct:A.calculateSellFee(o,r),d=Math.pow(10,n.assetInDecimals),m=n.amountIn*a/BigInt(d),g=A.calculateDiffToRef(o,m);return{type:"Sell",amountIn:n.amountIn,amountOut:i.amountOut,spotPrice:a,tradeFee:l,tradeFeePct:u,tradeFeeRange:c,priceImpactPct:g,swaps:e,toHuman(){return{type:"Sell",amountIn:P.toDecimal(n.amountIn,n.assetInDecimals),amountOut:P.toDecimal(i.amountOut,i.assetOutDecimals),spotPrice:P.toDecimal(a,i.assetOutDecimals),tradeFee:P.toDecimal(l,i.assetOutDecimals),tradeFeePct:u,tradeFeeRange:c,priceImpactPct:g,swaps:e.map(b=>b.toHuman())}}}}calculateDelta0Y(t,e,n){let i=[];for(let s=0;s<e.length;s++){let a=e[s],r=n.get(a.poolAddress);if(r==null)throw new Error("Pool does not exit");let o=r.parsePair(a.assetIn,a.assetOut),l;s>0?l=i[s-1]:l=t;let c=r.calculateOutGivenIn(o,l);i.push(c)}return i[i.length-1]}async calculateMostLiquidRoute(t,e,n){let{paths:i,pools:s,poolsMap:a}=n,l=s.filter(b=>b.tokens.some(h=>h.id===t)).map(b=>b.type==="Aave"?b.tokens:b.tokens.filter(h=>h.id===t)).map(b=>b.map(h=>h.balance).reduce((h,f)=>h+f)).sort((b,h)=>h<b?-1:1)[0],c=A.getFraction(l,.1),u=await Promise.all(i.map(b=>this.toSellSwaps(c,b,a))),m=this.findBestSellRoute(u).map(b=>({poolAddress:b.poolAddress,poolId:b?.poolId,pool:b.pool,assetIn:b.assetIn,assetOut:b.assetOut})),g=this.buildRouteKey(t,e,s);return this.mlr.set(g,m),m}async toSellSwaps(t,e,n){let i=[];for(let s=0;s<e.length;s++){let a=e[s],r=n.get(a.poolAddress);if(r==null)throw new Error("Pool does not exit");let o=r.parsePair(a.assetIn,a.assetOut),l;s>0?l=i[s-1].amountOut:l=typeof t=="string"?P.toBigInt(t,o.decimalsIn):t;let c=await this.ctx.getPoolFees(o,r),{amountOut:u,calculatedOut:d,feePct:m,errors:g}=r.validateAndSell(o,l,c),b=this.getPoolFeeRange(c),h=r.spotPriceOutGivenIn(o),f=Math.pow(10,o.decimalsIn),y=l*h/BigInt(f),S=A.calculateDiffToRef(d,y);i.push({...a,assetInDecimals:o.decimalsIn,assetOutDecimals:o.decimalsOut,amountIn:l,amountOut:u,calculatedOut:d,spotPrice:h,tradeFeePct:m,tradeFeeRange:b,priceImpactPct:S,errors:g,isSupply(){return r.type==="Aave"&&r.tokens[0].id===a.assetIn},isWithdraw(){return r.type==="Aave"&&r.tokens[1].id===a.assetIn},toHuman(){return{...a,amountIn:P.toDecimal(l,o.decimalsIn),amountOut:P.toDecimal(u,o.decimalsOut),calculatedOut:P.toDecimal(d,o.decimalsOut),spotPrice:P.toDecimal(h,o.decimalsOut),tradeFeePct:m,tradeFeeRange:b,priceImpactPct:S,errors:g}}})}return i}async getMostLiquidRoute(t,e){return this.withCtx(t,e,async n=>{let i=this.buildRouteKey(t,e,n.pools),s=this.mlr.get(i);return s||this.calculateMostLiquidRoute(t,e,n)})}async getSpotPrice(t,e){return this.withCtx(t,e,async n=>{let{pools:i,poolsMap:s}=n,a=this.buildRouteKey(t,e,i),r=this.mlr.get(a);r||(r=await this.calculateMostLiquidRoute(t,e,n));let o=await this.toSellSwaps("1",r,s),l=this.getSellSpot(o),c=o[o.length-1].assetOutDecimals;return{amount:l,decimals:c}}).catch(()=>{})}findBestBuyRoute(t){let e=t.sort((n,i)=>{let s=n[0].amountIn,a=i[0].amountIn;return s>a?1:-1});return e.find(n=>n.every(i=>i.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(r=>r.assetInDecimals).reduce((r,o)=>r+o),i=t.map(r=>r.spotPrice).reduce((r,o)=>r*o),s=n-e.assetInDecimals,a=Math.pow(10,s);return i/BigInt(a)}async getBuy(t,e,n,i){return this.withCtx(t,e,async({paths:s,poolsMap:a})=>{let r;if(i)r=await this.toBuySwaps(n,i,a);else{let o=s.map(c=>this.toBuySwaps(n,c,a)),l=await Promise.all(o);r=this.findBestBuyRoute(l)}return this.buildBuy(a,r)})}async getBuys(t,e,n){return this.withCtx(t,e,async({paths:i,poolsMap:s})=>{let a=i.map(o=>this.toBuySwaps(n,o,s));return(await Promise.all(a)).filter(o=>o.every(l=>l.errors.length==0)).map(o=>this.buildBuy(s,o)).sort((o,l)=>o.amountIn>l.amountIn?1:-1)})}buildBuy(t,e){let n=e[e.length-1],i=e[0],s=this.isDirectTrade(e),a=this.getBuySpot(e),r=i.amountIn,o=s?i.calculatedIn:this.calculateDelta0X(n.amountOut,e,t),l=r-o,c=this.getRouteFeeRange(e),u=s?i.tradeFeePct:A.calculateBuyFee(o,r),d=Math.pow(10,n.assetOutDecimals),m=n.amountOut*a/BigInt(d),g;return o===0n?g=-100:g=A.calculateDiffToRef(m,o),{type:"Buy",amountOut:n.amountOut,amountIn:i.amountIn,spotPrice:a,tradeFee:l,tradeFeePct:u,tradeFeeRange:c,priceImpactPct:g,swaps:e,toHuman(){return{type:"Buy",amountOut:P.toDecimal(n.amountOut,n.assetOutDecimals),amountIn:P.toDecimal(i.amountIn,i.assetInDecimals),spotPrice:P.toDecimal(a,i.assetInDecimals),tradeFee:P.toDecimal(l,i.assetInDecimals),tradeFeePct:u,tradeFeeRange:c,priceImpactPct:g,swaps:e.map(b=>b.toHuman())}}}}calculateDelta0X(t,e,n){let i=[];for(let s=e.length-1;s>=0;s--){let a=e[s],r=n.get(a.poolAddress);if(r==null)throw new Error("Pool does not exit");let o=r.parsePair(a.assetIn,a.assetOut),l;s==e.length-1?l=t:l=i[0];let c=r.calculateInGivenOut(o,l);i.unshift(c)}return i[0]}async toBuySwaps(t,e,n){let i=[];for(let s=e.length-1;s>=0;s--){let a=e[s],r=n.get(a.poolAddress);if(r==null)throw new Error("Pool does not exit");let o=r.parsePair(a.assetIn,a.assetOut),l;s==e.length-1?l=typeof t=="string"?P.toBigInt(t,o.decimalsOut):t:l=i[0].amountIn;let c=await this.ctx.getPoolFees(o,r),{amountIn:u,calculatedIn:d,feePct:m,errors:g}=r.validateAndBuy(o,l,c),b=this.getPoolFeeRange(c),h=r.spotPriceInGivenOut(o),f=Math.pow(10,o.decimalsOut),y=l*h/BigInt(f),S;d===0n?S=-100:S=A.calculateDiffToRef(y,d),i.unshift({...a,assetInDecimals:o.decimalsIn,assetOutDecimals:o.decimalsOut,amountOut:l,amountIn:u,calculatedIn:d,spotPrice:h,tradeFeePct:m,tradeFeeRange:b,priceImpactPct:S,errors:g,isSupply(){return r.type==="Aave"&&r.tokens[0].id===a.assetIn},isWithdraw(){return r.type==="Aave"&&r.tokens[1].id===a.assetIn},toHuman(){return{...a,amountOut:P.toDecimal(l,o.decimalsOut),amountIn:P.toDecimal(u,o.decimalsIn),calculatedIn:P.toDecimal(d,o.decimalsIn),spotPrice:P.toDecimal(h,o.decimalsIn),tradeFeePct:m,tradeFeeRange:b,priceImpactPct:S,errors:g}}})}return i}};var qn=6e3,Xe=1000000000000000n,$t=6,Ke=-5,ze=216e5,Hm=3,Hn=6;import{Enum as Nn}from"polkadot-api";var N=class{static build(t){return t.map(({assetIn:e,assetOut:n,pool:i,poolId:s})=>i==="Stableswap"?{pool:Nn("Stableswap",s),asset_in:e,asset_out:n}:{pool:Nn(i),asset_in:e,asset_out:n})}};var vt=class{schedulerOptions;router;constructor(t,e={}){this.router=t,this.schedulerOptions=Object.freeze({blockTime:e.blockTime??6e3,minBudgetInNative:e.minBudgetInNative??Xe})}get blockTime(){return this.schedulerOptions.blockTime}get minOrderBudget(){return this.schedulerOptions.minBudgetInNative}async getDcaOrder(t,e,n,i,s){let[a,r]=await Promise.all([this.getMinimumOrderBudget(t),this.router.getBestSell(t,e,n)]),{amountIn:o,swaps:l,priceImpactPct:c}=r,u=l[0],d=l[l.length-1],{assetInDecimals:m}=u,{assetOutDecimals:g}=d,b=Math.abs(c),h=this.getMinimumTradeCount(o,a),f=this.getOptimalTradeCount(b),y=s?Math.round(i/s):f,S=Math.ceil(i/h),T=Math.round(i/f),v=Math.round(i/y),R=o/BigInt(y),O=await this.router.getBestSell(t,e,R),D=o<a,U=[];D&&U.push("OrderTooSmall");let X=O.amountOut*BigInt(y),H=this.toBlockPeriod(v),V=O.tradeFee*BigInt(y),tt=N.build(l),et={assetIn:t,assetOut:e,errors:U,frequencyMin:S,frequencyOpt:T,frequency:v,tradeCount:y,tradeFee:V,tradeImpactPct:O.priceImpactPct,tradePeriod:H,tradeRoute:tt,type:"Dca"};return{...et,amountIn:o,amountOut:X,tradeAmountIn:O.amountIn,tradeAmountOut:O.amountOut,toHuman(){return{...et,amountIn:P.toDecimal(o,m),amountOut:P.toDecimal(X,g),tradeAmountIn:P.toDecimal(O.amountIn,m),tradeAmountOut:P.toDecimal(O.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 i=t+n/2n;return Number(i/n)}getOptimalTradeCount(t){let e=Math.round(t*10)||1;return Math.max(e,3)}async getTwapSellOrder(t,e,n){let[i,s]=await Promise.all([this.getMinimumOrderBudget(t),this.router.getBestSell(t,e,n)]),{amountIn:a,swaps:r,priceImpactPct:o}=s,l=r[0],c=r[r.length-1],{assetInDecimals:u}=l,{assetOutDecimals:d}=c,m=Math.abs(o),g=this.getTwapTradeCount(m),b=a/BigInt(g),h=await this.router.getBestSell(l.assetIn,c.assetOut,b),f=g===1,y=a<i,S=h.priceImpactPct<-5,T=[];y||f?T.push("OrderTooSmall"):S&&T.push("OrderImpactTooBig");let v=h.amountOut*BigInt(g),R=h.tradeFee*BigInt(g),O=N.build(r),D={assetIn:t,assetOut:e,errors:T,tradeCount:g,tradeImpactPct:h.priceImpactPct,tradePeriod:6,tradeRoute:O,type:"TwapSell"};return{...D,amountIn:a,amountOut:v,tradeAmountIn:h.amountIn,tradeAmountOut:h.amountOut,tradeFee:R,toHuman(){return{...D,amountIn:P.toDecimal(a,u),amountOut:P.toDecimal(v,d),tradeAmountIn:P.toDecimal(h.amountIn,u),tradeAmountOut:P.toDecimal(h.amountOut,d),tradeFee:P.toDecimal(R,d)}}}}async getTwapBuyOrder(t,e,n){let[i,s]=await Promise.all([this.getMinimumOrderBudget(t),this.router.getBestBuy(t,e,n)]),{amountOut:a,swaps:r,priceImpactPct:o}=s,l=r[0],c=r[r.length-1],{assetInDecimals:u}=l,{assetOutDecimals:d}=c,m=Math.abs(o),g=this.getTwapTradeCount(m),b=a/BigInt(g),h=await this.router.getBestBuy(l.assetIn,c.assetOut,b),f=h.amountIn*BigInt(g),y=g===1,S=f<i,T=h.priceImpactPct<-5,v=[];S||y?v.push("OrderTooSmall"):T&&v.push("OrderImpactTooBig");let R=h.tradeFee*BigInt(g),O=N.build(r),D={assetIn:t,assetOut:e,errors:v,tradeCount:g,tradeImpactPct:h.priceImpactPct,tradePeriod:6,tradeRoute:O,type:"TwapBuy"};return{...D,amountIn:f,amountOut:a,tradeAmountIn:h.amountIn,tradeAmountOut:h.amountOut,tradeFee:R,toHuman(){return{...D,amountIn:P.toDecimal(f,u),amountOut:P.toDecimal(a,d),tradeAmountIn:P.toDecimal(h.amountIn,u),tradeAmountOut:P.toDecimal(h.amountOut,d),tradeFee:P.toDecimal(R,u)}}}}getTwapTradeCount(t){let e=this.getOptimalTradeCount(t);if(this.getTwapExecutionTime(e)>216e5){let i=216e5/(this.blockTime*6);return Math.round(i)}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 zn={};x(zn,{BIG_10:()=>Kn,BIG_BILL:()=>je,StakingApi:()=>Qt,StakingClient:()=>Jt});import{calculate_accumulated_rps as $a,calculate_percentage_amount as Qa,calculate_period_number as Wn,calculate_points as Yn,calculate_rewards as Ja,sigmoid as Xn}from"@galacticcouncil/math-staking";import G from"big.js";var de={none:.1,locked1x:1,locked2x:2,locked3x:3,locked4x:4,locked5x:5,locked6x:6},Un=p=>Object.keys(de).includes(p);import{AccountId as za}from"polkadot-api";import{toHex as ja}from"@polkadot-api/utils";function Vn(p){let t=("modl"+p).padEnd(32,"\0"),e=new TextEncoder().encode(t),n=ja(e);return za(63).dec(n)}var ge="20000000000000000",he="2000",Kn=G(10),je=G(Kn.pow(12)),Qt=class{client;balanceClient;constructor(t,e){this.client=t,this.balanceClient=e}async getPotBalance(){let t=await this.client.getPalletId(),e=Vn(t);return await this.balanceClient.getBalance(e,0)}async getStakingPosition(t){let[e,n]=await Promise.all([this.client.getStakingPositionsValue(t),this.client.getStakingVotes(t)]);if(!e)return;let i=e.created_at,s=await n.reduce(async(a,[r,o])=>{let l=await a,c=r,u=o.amount,d=o.conviction.toString().toLowerCase(),m=await this.client.getReferendumInfo(c);return m&&(m.type==="Approved"||m.type==="Rejected")&&Un(d)&&l.push({id:c,amount:u,conviction:d}),l},Promise.resolve([]));return{stake:e.stake,rewardPerStake:e.reward_per_stake,createdAt:i,actionPoints:e.action_points,accumulatedUnpaidRewards:e.accumulated_unpaid_rewards,accumulatedSlashPoints:e.accumulated_slash_points,accumulatedLockedRewards:e.accumulated_locked_rewards,votes:s}}async getStake(t){let e=await this.client.getNFTCollectionId(),[n,i]=await Promise.all([this.client.getStaking(),this.client.getUniques(t,e)]),s=i.find(a=>a)?.itemId;return{totalStake:n?.total_stake,accumulatedRewardPerStake:n?.accumulated_reward_per_stake,potReservedBalance:n?.pot_reserved_balance,positionId:s,stakePosition:s?await this.getStakingPosition(s):void 0}}getCurrentActionPoints(t,e,n,i){let s=G(0),a=G(0),r=de.locked6x,o=G(n.toString()).mul(r),l=100,c=[];t.forEach(m=>{let g=de[m.conviction],b=i.includes(m.id.toString());b&&c.push(m.id.toString());let h=G(m.amount.toString()).mul(l).div(o);s=s.plus(Math.floor(h.mul(g).toNumber())),a=a.plus(Math.floor(h.mul(b?r:g).toNumber()))});let u=Math.floor(G(n.toString()).mul(r).mul(l).div(o).toNumber());i.forEach(m=>{c.includes(m)||(a=a.plus(u))});let d={democracyVote:1};return s=s.mul(d.democracyVote),s=s.plus(e.toString()||"0"),a=a.mul(d.democracyVote),a=a.plus(e.toString()||"0"),{currentActionPoints:s.toString(),maxActionPoints:a.toString()}}async getRewards(t,e,n){let i=await this.getStake(t),{potReservedBalance:s,accumulatedRewardPerStake:a,totalStake:r,stakePosition:o}=i;if(!o)return;let[l,c,u,d,m,g,b]=await Promise.all([this.getPotBalance(),this.client.getPeriodLength(),this.client.getUnclaimablePeriods(),this.client.getTimePointsPerPeriod(),this.client.getTimePointsWeight(),this.client.getActionPointsWeight(),this.client.getSixBlockSince()]),h=G(l.transferable.toString()).minus(s.toString()),f=h.gt(0)&&r>0?$a(a.toString(),h.toString(),r.toString()):a.toString(),y=Wn(c.toString(),n,b),S=Wn(c.toString(),o.createdAt.toString(),b),T=Ja(f,o.rewardPerStake.toString(),o.stake.toString()),v=this.getCurrentActionPoints(o.votes,o.actionPoints,o.stake,e),R=Yn(S,y,d.toString(),m.toString(),v.currentActionPoints,g.toString(),o.accumulatedSlashPoints.toString()),O=Xn(R,ge,he),D=(()=>{if(!e.length)return;let tt=Yn(S,y,d.toString(),m.toString(),v.maxActionPoints.toString(),g.toString(),o.accumulatedSlashPoints.toString());return Xn(tt,ge,he)})(),U=G(T).plus(o.accumulatedUnpaidRewards.toString()).plus(o.accumulatedLockedRewards.toString());if(G(y).minus(S).lte(u.toString()))return{rewards:"0",payablePercentage:O,extraPayablePercentage:D,constants:{a:ge,b:he}};let X=Qa(U.toString(),O),H=G(o.accumulatedLockedRewards.toString()),V=H.gt(X)?H:G(X);return{rewards:V.div(je).toString(),maxRewards:U.div(je).toString(),allocatedRewardsPercentage:V.div(U).mul(100).toNumber(),payablePercentage:O,extraPayablePercentage:D,constants:{a:ge,b:he}}}};var Jt=class extends E{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[r,o,l]=a;return{address:r,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 Qn={};x(Qn,{TxBuilderFactory:()=>wt});import{Enum as $n}from"polkadot-api";function jn(p){let t=[],e=p;for(;e&&typeof e=="object"&&"type"in e;)t.push(e.type),e=e.value;return t.join(".")}var xt=class extends E{evm;evmClient;balanceClient;aaveUtils;constructor(t,e){super(t),this.evm=e,this.evmClient=e.getWsProvider(),this.balanceClient=new K(t),this.aaveUtils=new it(e)}wrapTx(t,e){return{name:t,get:()=>e,dryRun:n=>this.dryRun(n,e)}}async dispatchWithExtraGas(t){return this.api.tx.Dispatcher.dispatch_with_extra_gas({call:t.decodedCall,extra_gas:Te})}async dryRun(t,e){let n=$n("Signed",t),i=$n("system",n),a=await this.client.getUnsafeApi().apis.DryRunApi.dry_run_call(i,e.decodedCall),r=a.success&&!a.value.execution_result.success?a.value.execution_result.value.error:null;if(r){let o=jn(r.value);throw new Error("Dry run execution error!",{cause:o})}return a}isDirectOmnipoolTrade(t){return t.length===1&&t[0].pool==="Omnipool"}};var be=class extends xt{_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:i}=e[0],s=await this.balanceClient.getBalance(this.beneficiary,i);return t>=s.transferable-5n?this.buildSellAllTx():this.buildSellTx()}async buildBuyTx(){let{amountIn:t,amountOut:e,swaps:n}=this.trade,i=n[0],s=n[n.length-1],a=A.getFraction(t,this.slippagePct),r=i.assetIn,o=s.assetOut,l=t+a,c;return this.isDirectOmnipoolTrade(n)?c=this.api.tx.Omnipool.buy({asset_in:r,asset_out:o,amount:e,max_sell_amount:l}):c=this.api.tx.Router.buy({asset_in:r,asset_out:o,amount_out:e,max_amount_in:l,route:N.build(n)}),this.wrapTx("RouterBuy",c)}async buildSellTx(){let{amountIn:t,amountOut:e,swaps:n}=this.trade,i=n[0],s=n[n.length-1],a=A.getFraction(e,this.slippagePct),r=i.assetIn,o=s.assetOut,l=e-a,c;return this.isDirectOmnipoolTrade(n)?c=this.api.tx.Omnipool.sell({asset_in:r,asset_out:o,amount:t,min_buy_amount:l}):c=this.api.tx.Router.sell({asset_in:r,asset_out:o,amount_in:t,min_amount_out:l,route:N.build(n)}),i.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],i=e[e.length-1],s=A.getFraction(t,this.slippagePct),a=n.assetIn,r=i.assetOut,o=t-s,l=this.api.tx.Router.sell_all({asset_in:a,asset_out:r,min_amount_out:o,route:N.build(e)});return n.isWithdraw()&&await this.aaveUtils.hasBorrowPositions(this.beneficiary)&&(l=await this.dispatchWithExtraGas(l)),this.wrapTx("RouterSellAll",l)}};import{Enum as $e}from"polkadot-api";var ye=class extends xt{_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:i,tradePeriod:s,tradeRoute:a}=this.order,r=this.api.tx.DCA.schedule({schedule:{owner:this.beneficiary,period:s,max_retries:this.maxRetries,total_amount:t,slippage:this.slippagePct*1e4,stability_threshold:void 0,order:$e("Sell",{asset_in:e,asset_out:n,amount_in:i,min_amount_out:0n,route:a})},start_execution_block:void 0});return this.wrapTx("DcaSchedule",r)}buildTwapSellTx(){let{amountIn:t,assetIn:e,assetOut:n,tradeAmountIn:i,tradeAmountOut:s,tradePeriod:a,tradeRoute:r}=this.order,o=A.getFraction(s,this.slippagePct),l=s-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:$e("Sell",{asset_in:e,asset_out:n,amount_in:i,min_amount_out:l,route:r})},start_execution_block:void 0});return this.wrapTx("DcaSchedule.twapSell",c)}buildTwapBuyTx(){let{amountIn:t,assetIn:e,assetOut:n,tradeAmountIn:i,tradeAmountOut:s,tradePeriod:a,tradeRoute:r}=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:$e("Buy",{asset_in:e,asset_out:n,amount_out:s,max_amount_in:l,route:r})},start_execution_block:void 0});return this.wrapTx("DcaSchedule.twapBuy",c)}};var wt=class{client;evmClient;constructor(t,e){this.client=t,this.evmClient=e}trade(t){return new be(this.client,this.evmClient).setTrade(t)}order(t){return new ye(this.client,this.evmClient).setOrder(t)}};async function tg(p){let t=new pt(p),e=new Rt(p),[n,i]=await Promise.all([t.getBlockTime(),t.getMinOrderBudget()]),s=new Pt(p,e).withAave().withOmnipool().withStableswap().withXyk(),a=new K(p),r=new Jt(p),o=new Et(p),l=new it(e),c=new Tt(s),u=new vt(c,{blockTime:n,minBudgetInNative:i}),d=new Qt(r,a),m=new Ct(o,a,{blockTime:n});return{api:{aave:l,router:c,scheduler:u,staking:d,farm:m},client:{asset:new ct(p),balance:a,evm:e},ctx:{pool:s},tx:new wt(p,e),destroy:()=>{s.destroy()}}}export{ae as QueryBus,cn as aave,tn as api,P as big,pn as client,en as const,tg as createSdkContext,at as erc20,mn as error,hn as evm,Tn as farm,w as fmt,lt as h160,Bt as json,A as math,Dn as pool,Gn as sor,zn as staking,Qn as tx,on as xc};
|
|
1
|
+
var ai=Object.defineProperty;var x=(p,t)=>{for(var e in t)ai(p,e,{get:t[e],enumerable:!0})};var en={};x(en,{Papi:()=>E,getWs:()=>li});import{hydration as si}from"@galacticcouncil/descriptors";function tn(p){switch(p){case!0:case"true":case 1:case"1":case"on":case"yes":return!0;default:return!1}}var E=class{client;api;constructor(t){this.client=t,this.api=this.client.getTypedApi(si)}log(t,...e){let n=typeof window>"u"?process.env.GC_DEBUG:window.localStorage.getItem("gc.debug");tn(n)&&console.log(t,...e)}};import{createClient as ri}from"polkadot-api";import{withPolkadotSdkCompat as oi}from"polkadot-api/polkadot-sdk-compat";var li=async p=>{let t=typeof p=="string"?p.split(","):p,i=(typeof window>"u"?(await import("polkadot-api/ws-provider/node")).getWsProvider:(await import("polkadot-api/ws-provider/web")).getWsProvider)(t);return ri(oi(i))};var un={};x(un,{AAVE_GAS_LIMIT:()=>ve,AAVE_LENDING_POOL_ADDRESS:()=>se,AAVE_POOL_ABI:()=>Se,AAVE_POOL_DATA_PROVIDER:()=>ae,AAVE_POOL_DATA_PROVIDER_ABI:()=>ie,AAVE_POOL_PROXY:()=>Te,AAVE_ROUNDING_THRESHOLD:()=>xr,AAVE_UINT_256_MAX:()=>ci,AaveClient:()=>It,AaveUtils:()=>it});var Se=[{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 ie=[{inputs:[{internalType:"contract IEACAggregatorProxy",name:"_networkBaseTokenPriceInUsdProxyAggregator",type:"address"},{internalType:"contract IEACAggregatorProxy",name:"_marketReferenceCurrencyPriceInUsdProxyAggregator",type:"address"}],stateMutability:"nonpayable",type:"constructor"},{inputs:[],name:"ETH_CURRENCY_UNIT",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[],name:"MKR_ADDRESS",outputs:[{internalType:"address",name:"",type:"address"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"bytes32",name:"_bytes32",type:"bytes32"}],name:"bytes32ToString",outputs:[{internalType:"string",name:"",type:"string"}],stateMutability:"pure",type:"function"},{inputs:[{internalType:"contract IPoolAddressesProvider",name:"provider",type:"address"}],name:"getReservesData",outputs:[{components:[{internalType:"address",name:"underlyingAsset",type:"address"},{internalType:"string",name:"name",type:"string"},{internalType:"string",name:"symbol",type:"string"},{internalType:"uint256",name:"decimals",type:"uint256"},{internalType:"uint256",name:"baseLTVasCollateral",type:"uint256"},{internalType:"uint256",name:"reserveLiquidationThreshold",type:"uint256"},{internalType:"uint256",name:"reserveLiquidationBonus",type:"uint256"},{internalType:"uint256",name:"reserveFactor",type:"uint256"},{internalType:"bool",name:"usageAsCollateralEnabled",type:"bool"},{internalType:"bool",name:"borrowingEnabled",type:"bool"},{internalType:"bool",name:"stableBorrowRateEnabled",type:"bool"},{internalType:"bool",name:"isActive",type:"bool"},{internalType:"bool",name:"isFrozen",type:"bool"},{internalType:"uint128",name:"liquidityIndex",type:"uint128"},{internalType:"uint128",name:"variableBorrowIndex",type:"uint128"},{internalType:"uint128",name:"liquidityRate",type:"uint128"},{internalType:"uint128",name:"variableBorrowRate",type:"uint128"},{internalType:"uint128",name:"stableBorrowRate",type:"uint128"},{internalType:"uint40",name:"lastUpdateTimestamp",type:"uint40"},{internalType:"address",name:"aTokenAddress",type:"address"},{internalType:"address",name:"stableDebtTokenAddress",type:"address"},{internalType:"address",name:"variableDebtTokenAddress",type:"address"},{internalType:"address",name:"interestRateStrategyAddress",type:"address"},{internalType:"uint256",name:"availableLiquidity",type:"uint256"},{internalType:"uint256",name:"totalPrincipalStableDebt",type:"uint256"},{internalType:"uint256",name:"averageStableRate",type:"uint256"},{internalType:"uint256",name:"stableDebtLastUpdateTimestamp",type:"uint256"},{internalType:"uint256",name:"totalScaledVariableDebt",type:"uint256"},{internalType:"uint256",name:"priceInMarketReferenceCurrency",type:"uint256"},{internalType:"address",name:"priceOracle",type:"address"},{internalType:"uint256",name:"variableRateSlope1",type:"uint256"},{internalType:"uint256",name:"variableRateSlope2",type:"uint256"},{internalType:"uint256",name:"stableRateSlope1",type:"uint256"},{internalType:"uint256",name:"stableRateSlope2",type:"uint256"},{internalType:"uint256",name:"baseStableBorrowRate",type:"uint256"},{internalType:"uint256",name:"baseVariableBorrowRate",type:"uint256"},{internalType:"uint256",name:"optimalUsageRatio",type:"uint256"},{internalType:"bool",name:"isPaused",type:"bool"},{internalType:"bool",name:"isSiloedBorrowing",type:"bool"},{internalType:"uint128",name:"accruedToTreasury",type:"uint128"},{internalType:"uint128",name:"unbacked",type:"uint128"},{internalType:"uint128",name:"isolationModeTotalDebt",type:"uint128"},{internalType:"bool",name:"flashLoanEnabled",type:"bool"},{internalType:"uint256",name:"debtCeiling",type:"uint256"},{internalType:"uint256",name:"debtCeilingDecimals",type:"uint256"},{internalType:"uint8",name:"eModeCategoryId",type:"uint8"},{internalType:"uint256",name:"borrowCap",type:"uint256"},{internalType:"uint256",name:"supplyCap",type:"uint256"},{internalType:"uint16",name:"eModeLtv",type:"uint16"},{internalType:"uint16",name:"eModeLiquidationThreshold",type:"uint16"},{internalType:"uint16",name:"eModeLiquidationBonus",type:"uint16"},{internalType:"address",name:"eModePriceSource",type:"address"},{internalType:"string",name:"eModeLabel",type:"string"},{internalType:"bool",name:"borrowableInIsolation",type:"bool"}],internalType:"struct IUiPoolDataProviderV3.AggregatedReserveData[]",name:"",type:"tuple[]"},{components:[{internalType:"uint256",name:"marketReferenceCurrencyUnit",type:"uint256"},{internalType:"int256",name:"marketReferenceCurrencyPriceInUsd",type:"int256"},{internalType:"int256",name:"networkBaseTokenPriceInUsd",type:"int256"},{internalType:"uint8",name:"networkBaseTokenPriceDecimals",type:"uint8"}],internalType:"struct IUiPoolDataProviderV3.BaseCurrencyInfo",name:"",type:"tuple"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"contract IPoolAddressesProvider",name:"provider",type:"address"}],name:"getReservesList",outputs:[{internalType:"address[]",name:"",type:"address[]"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"contract IPoolAddressesProvider",name:"provider",type:"address"},{internalType:"address",name:"user",type:"address"}],name:"getUserReservesData",outputs:[{components:[{internalType:"address",name:"underlyingAsset",type:"address"},{internalType:"uint256",name:"scaledATokenBalance",type:"uint256"},{internalType:"bool",name:"usageAsCollateralEnabledOnUser",type:"bool"},{internalType:"uint256",name:"stableBorrowRate",type:"uint256"},{internalType:"uint256",name:"scaledVariableDebt",type:"uint256"},{internalType:"uint256",name:"principalStableDebt",type:"uint256"},{internalType:"uint256",name:"stableBorrowLastUpdateTimestamp",type:"uint256"}],internalType:"struct IUiPoolDataProviderV3.UserReserveData[]",name:"",type:"tuple[]"},{internalType:"uint8",name:"",type:"uint8"}],stateMutability:"view",type:"function"},{inputs:[],name:"marketReferenceCurrencyPriceInUsdProxyAggregator",outputs:[{internalType:"contract IEACAggregatorProxy",name:"",type:"address"}],stateMutability:"view",type:"function"},{inputs:[],name:"networkBaseTokenPriceInUsdProxyAggregator",outputs:[{internalType:"contract IEACAggregatorProxy",name:"",type:"address"}],stateMutability:"view",type:"function"}];var Te="0x1b02E051683b5cfaC5929C25E84adb26ECf87B38",ae="0x112b087b60C1a166130d59266363C45F8aa99db0",se="0xf3Ba4D1b50f78301BDD7EAEa9B67822A15FCA691",ve=1000000n,xr=5,ci=BigInt("0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");var It=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:ie,address:ae,args:[se],functionName:"getReservesData"})}async getUserReservesData(t){return await this.client.readContract({abi:ie,address:ae,args:[se,t],functionName:"getUserReservesData"})}async getUserAccountData(t){return await this.client.readContract({abi:Se,address:Te,args:[t],functionName:"getUserAccountData"})}};import Q from"big.js";var P={};x(P,{asBigInt:()=>mi,toBigInt:()=>pi,toDecimal:()=>ui});import nt from"big.js";nt.NE=-18;function ui(p,t,e=6,n){let i=nt(p.toString()),a=nt(10).pow(t);return i.div(a).round(e,n).toString()}function pi(p,t){let e=nt(10).pow(t),i=nt(p).mul(e).toFixed(0,nt.roundDown);return BigInt(i)}function mi(p){return BigInt(p.round(0,nt.roundDown).toFixed(0))}var st={};x(st,{ERC20:()=>xe});var xe=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 w={};x(w,{FeeUtils:()=>Ae,shiftNeg:()=>bi});import hi from"big.js";var nn={};x(nn,{HUB_ASSET_ID:()=>At,HYDRATION_OMNIPOOL_ADDRESS:()=>gi,HYDRATION_PARACHAIN_ID:()=>di,HYDRATION_SS58_PREFIX:()=>k,PERBILL_DENOMINATOR:()=>we,PERMILL_DENOMINATOR:()=>rt,RUNTIME_DECIMALS:()=>B,SYSTEM_ASSET_DECIMALS:()=>Ie,SYSTEM_ASSET_ID:()=>_,TRADEABLE_DEFAULT:()=>ot});var B=18,rt=1e6,we=1e9,_=0,Ie=12,di=2034,k=63,gi="7L53bUTBbfuj14UpdCNPwmgzzHSsrsTWBHX5pys32mVWM3C1",At=1,ot=15;var Ae=class p{static toPct(t){let[e,n]=t;return p.safeDivide(e*100,n)}static toRaw(t){let[e,n]=t;return p.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 i=10**n;return Math.round(t*i/e)/i}static safeRound(t){return parseFloat(t.toPrecision(15))}};function bi(p,t){let e=hi(typeof p=="bigint"?p.toString():p);return t===0?e.toString():e.div(Math.pow(10,t)).toString()}var lt={};x(lt,{H160:()=>Be,isEvmAccount:()=>sn,isEvmAddress:()=>rn,isSs58Address:()=>on});import{AccountId as Ot}from"polkadot-api";import{toHex as an}from"@polkadot-api/utils";import{Buffer as $}from"buffer";var Oe="ETH\0";function sn(p){if(!p)return!1;try{let t=Ot().enc(p),e=$.from(Oe);return $.from(t.subarray(0,e.length)).equals(e)}catch{return!1}}function rn(p){return!!/^0x[a-fA-F0-9]{40}$/.test(p)}function on(p){try{return Ot(63).enc(p),!0}catch{return!1}}var Be=class p{static toAccount=t=>{let e=$.from(t.slice(2),"hex"),n=$.from(Oe),i=Uint8Array.from($.concat([n,e,$.alloc(8)])),a=an(i);return Ot(63).dec(a)};static fromAccount=t=>{let e=Ot().enc(t),n=$.from(Oe),i=e.slice(n.length,-8);return"0x"+$.from(i).toString("hex")};static fromSS58=t=>{let n=Ot().enc(t).slice(0,20);return an(n)};static fromAny=t=>{if(rn(t))return t;if(sn(t))return p.fromAccount(t);if(on(t))return p.fromSS58(t);throw new Error("Unknown address type")}};var Bt={};x(Bt,{findNestedKey:()=>yi,findNestedObj:()=>fi,jsonFormatter:()=>Pi});var yi=(p,t)=>{let e=[];return JSON.stringify(p,(n,i)=>(i&&i[t]&&e.push(i),i)),e[0]},fi=(p,t,e)=>{let n;return JSON.stringify(p,(i,a)=>(a&&a[t]===e&&(n=a),a)),n},Pi=(p,t)=>typeof t=="bigint"?t.toString():t;var O={};x(O,{calculateBuyFee:()=>xi,calculateDiffToAvg:()=>Si,calculateDiffToRef:()=>Ti,calculateSellFee:()=>vi,getFraction:()=>wi});import z from"big.js";function Si(p,t){let e=z(p.toString()),n=z(t.toString());return e.minus(n).abs().div(e.plus(n).div(2)).mul(100).round(2).toNumber()}function Ti(p,t){if(t===0n)return 0;let e=z(p.toString()),n=z(t.toString());return e.minus(n).div(n).mul(100).round(2).toNumber()}function vi(p,t){if(p===0n)return 0;let e=z(p.toString()),n=z(t.toString());return z(1).minus(n.div(e)).mul(100).round(2).toNumber()}function xi(p,t){if(p===0n)return 0;let e=z(p.toString());return z(t.toString()).div(e).minus(1).mul(100).round(2).toNumber()}function wi(p,t,e=2){(t<.01||t>100)&&new Error("Supported range is from 0.01% - 100%");let n=Math.pow(10,e),i=BigInt(t*n);return p*i/BigInt(100*n)}var ln={};x(ln,{convertToId:()=>Ai});import{Buffer as Ii}from"buffer";function Ai(p){let e=Ii.from(p.replace("0x",""),"hex").subarray(16);return e.readUIntBE(0,e.length)}import{TLRUCache as cn}from"@thi.ng/cache";var re=class{debug;constructor(t){this.debug=t||!1}log(t,e,n){this.debug&&console.log(t,e,n)}scope(t,e,n,i){let a=new Map,s=i!==void 0?new cn(null,{ttl:i}):new cn;return{get:(...c)=>{let u=n(...c);if(a.has(u)){this.log("[live]",t,u);let m=a.get(u);return Promise.resolve(m)}if(s.has(u))return this.log("[memo]",t,u),s.get(u);this.log("[fetch]",t,u);let d=e(...c).catch(m=>{throw s.delete(u),m});return s.set(u,d),d},set:(c,...u)=>{let d=n(...u);this.log("[set-live]",t,d),a.set(d,c)},clear:()=>{this.log("[clear]",t),a.clear(),s.release()}}}};var{ERC20:oe}=st,{H160:_e}=lt,Oi=1.01,Bi=31536000n,le=10n**27n,it=class{client;constructor(t){this.client=new It(t)}async getSummary(t){let e=_e.fromAny(t),[n,i,a,s]=await Promise.all([this.client.getReservesData(),this.client.getUserReservesData(e),this.client.getUserAccountData(e),this.client.getBlockTimestamp()]),[r]=n,[o,l]=i,[c,u,d,m,g,b]=a,h=P.toDecimal(b,18),f=[];for(let y of o){let S=y.underlyingAsset.toLowerCase(),T=r.find(({underlyingAsset:Pe})=>Pe.toLowerCase()===S);if(!T)throw new Error("Missing pool reserve for "+S);let v=y.scaledATokenBalance,F=T.liquidityIndex,A=T.liquidityRate,D=T.availableLiquidity,U=T.priceInMarketReferenceCurrency,X=s+6,N=this.calculateLinearInterest(A,T.lastUpdateTimestamp,X),V=F*N/le,tt=v*V/le,te=Number(l!==0&&l===T.eModeCategoryId?T.eModeLiquidationThreshold:T.reserveLiquidationThreshold)/1e4,ee=T.usageAsCollateralEnabled&&y.usageAsCollateralEnabledOnUser&&y.scaledATokenBalance>0n,ne=oe.toAssetId(S);f.push({aTokenBalance:tt,availableLiquidity:D,decimals:Number(T.decimals),isCollateral:ee,priceInRef:U,reserveId:ne,reserveAsset:S,reserveLiquidationThreshold:te})}return{healthFactor:Number(h),totalCollateral:c,totalDebt:u,reserves:f}}async hasBorrowPositions(t){let e=_e.fromAny(t),n=await this.client.getUserAccountData(e),[i,a]=n;return a>0n}async getHealthFactor(t){let e=_e.fromAny(t),n=await this.client.getUserAccountData(e),[i,a,s,r,o,l]=n,c=P.toDecimal(l,18);return Number(c)}async getHealthFactorAfterWithdraw(t,e,n){let{totalCollateral:i,totalDebt:a,reserves:s}=await this.getSummary(t),r=oe.fromAssetId(e),o=s.find(f=>f.reserveAsset===r);if(!o)throw new Error("Missing reserve ctx for "+r);let{decimals:l,isCollateral:c,priceInRef:u,reserveLiquidationThreshold:d}=o,m=P.toBigInt(n,l),g=c?m*u/10n**BigInt(l):0n,b=i-g;if(b<=0n)return 0;let h=Q(b.toString()).mul(d).div(a.toString()).toFixed(6,Q.roundDown);return Number(h)}async getHealthFactorAfterSupply(t,e,n){let{totalCollateral:i,totalDebt:a,reserves:s}=await this.getSummary(t),r=oe.fromAssetId(e),o=s.find(h=>h.reserveAsset===r);if(!o)throw new Error("Missing reserve ctx for "+r);let{decimals:l,priceInRef:c,reserveLiquidationThreshold:u}=o,m=P.toBigInt(n,l)*c/10n**BigInt(l),g=i+m;if(g<=0n)return 0;let b=Q(g.toString()).mul(u).div(a.toString()).toFixed(6,Q.roundDown);return Number(b)}async getMaxWithdraw(t,e){let{totalDebt:n,reserves:i,healthFactor:a}=await this.getSummary(t),s=oe.fromAssetId(e),r=i.find(o=>o.reserveAsset===s);if(!r)throw new Error("Missing reserve ctx for "+s);return this.calculateWithdrawMax(r,n,a)}async getMaxWithdrawAll(t){let{totalDebt:e,reserves:n,healthFactor:i}=await this.getSummary(t),a={};for(let s of n){let r=this.calculateWithdrawMax(s,e,i);s.reserveId&&(a[s.reserveId]=r)}return a}calculateWithdrawMax(t,e,n){let{aTokenBalance:i,availableLiquidity:a,decimals:s,priceInRef:r,reserveLiquidationThreshold:o,isCollateral:l}=t,c=i;if(l&&e>0n){let d=n-Oi;if(d>0){let m=Q(d).mul(e.toString()).div(o).toFixed(0,Q.roundDown),g=Q(m).div(r.toString()).mul(10**s).toFixed(0,Q.roundDown);c=i<BigInt(g)?i:BigInt(g)}else c=0n}return{amount:c<a?c:a,decimals:s}}calculateLinearInterest(t,e,n){let i=n-e;if(i<=0)return le;let a=t*BigInt(i)/Bi;return le+a}};var mn={};x(mn,{AssetClient:()=>ct,BalanceClient:()=>K,ChainParams:()=>pt});var ct=class extends E{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:i})=>{let[a]=n;return[a,i]}))}async queryBonds(){let e=await this.api.query.Bonds.Bonds.getEntries();return new Map(e.map(({keyArgs:n,value:i})=>{let[a]=n;return[a,i]}))}async queryAssets(){let e=await this.api.query.AssetRegistry.Assets.getEntries();return new Map(e.filter(({value:n})=>{let{asset_type:i}=n;return this.SUPPORTED_TYPES.includes(i.type)}).map(({keyArgs:n,value:i})=>{let[a]=n;return[a,i]}))}async queryAssetLocations(){let e=await this.api.query.AssetRegistry.AssetLocations.getEntries();return new Map(e.map(({keyArgs:n,value:i})=>{let[a]=n;return[a,i]}))}async mapToken(t,e,n,i){let{name:a,asset_type:s,is_sufficient:r,existential_deposit:o}=e,{symbol:l,decimals:c}=n.get(t)??{};return{id:t,name:a?.asText(),symbol:l,decimals:c,icon:l,type:s.type,isSufficient:r,location:i,existentialDeposit:o}}async mapBond(t,e,n,i){let[a,s]=i,{asset_type:r,is_sufficient:o,existential_deposit:l}=e,{symbol:c,decimals:u}=await this.mapToken(a,e,n),d=Number(s),m=new Intl.DateTimeFormat("en-GB"),g=[c,"Bond",m.format(d)].join(" ");return{id:t,name:g,symbol:c+"b",decimals:u,icon:c,type:r.type,isSufficient:o,existentialDeposit:l,underlyingAssetId:a,maturity:d}}async mapShares(t,e,n,i){let{assets:a}=i,{name:s,symbol:r,asset_type:o,is_sufficient:l,existential_deposit:c}=e,u=await Promise.all(a.map(async g=>{let{symbol:b}=await this.mapToken(g,e,n);return[g,b]})),d=Object.fromEntries(u),m=Object.values(d);return{id:t,name:m.join(", "),symbol:r?.asText()||s?.asText(),decimals:18,icon:m.join("/"),type:o.type,isSufficient:l,existentialDeposit:c,meta:d}}async mapExternal(t,e,n,i){let a=await this.mapToken(t,e,new Map,i),s=n?.find(r=>r.internalId===a.id);return s?{...a,decimals:s.decimals,name:s.name,symbol:s.symbol,icon:s.symbol,isWhiteListed:s.isWhiteListed}:a}parseMetadata(t){return new Map(Array.from(t,([e,n])=>[e,{symbol:n.symbol?.asText(),decimals:n.decimals}]))}async getOnChainAssets(t,e){let[n,i,a,s]=await Promise.all([this.queryAssets(),this.queryAssetLocations(),this.queryShares(),this.queryBonds()]),r=this.parseMetadata(n),o=[];for(let[l,c]of Array.from(n)){let u=i.get(l),{asset_type:d}=c,m;switch(d.type){case"Bond":let g=s.get(l);m=await this.mapBond(l,c,r,g);break;case"StableSwap":let b=a.get(l);m=await this.mapShares(l,c,r,b);break;case"External":m=await this.mapExternal(l,c,e,u);break;default:m=await this.mapToken(l,c,r,u)}o.push(m)}return t?o:o.filter(l=>this.isValidAsset(l))}isValidAsset(t){let e=Math.sign(t.decimals);return!!t.symbol&&(e===0||e===1)}};import{Subject as _i,bufferCount as Ri,combineLatest as Fi,debounceTime as Ci,distinctUntilChanged as pn,finalize as Ei,map as ut,pairwise as ki,shareReplay as Mi,startWith as Di}from"rxjs";var K=class extends E{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,{at:"best"});return this.calculateBalance(n)}async getTokenBalance(t,e){let i=await this.api.query.Tokens.Accounts.getValue(t,e,{at:"best"});return this.calculateBalance(i)}async getErc20Balance(t,e){return this.getTokenBalanceData(t,e)}subscribeBalance(t){let e=this.subscribeSystemBalance(t),n=this.subscribeTokensBalance(t),i=this.subscribeErc20Balance(t);return Fi([e,n,i]).pipe(Ci(250),ut(a=>a.flat()),Di([]),Ri(2,1),ut(([a,s],r)=>r===0?s:this.getDeltas(a,s)))}subscribeSystemBalance(t){return this.api.query.System.Account.watchValue(t,"best").pipe(ut(n=>({id:0,balance:this.calculateBalance(n.data)})))}subscribeTokenBalance(t,e){return this.api.query.Tokens.Accounts.watchValue(t,e,"best").pipe(ut(i=>({id:e,balance:this.calculateBalance(i)})))}subscribeTokensBalance(t){return this.api.query.Tokens.Accounts.watchEntries(t,{at:"best"}).pipe(pn((n,i)=>!i.deltas),ut(({deltas:n})=>{let i=[];return n?.deleted.forEach(a=>{let[s,r]=a.args;i.push({id:r,balance:this.calculateBalance({free:0n,reserved:0n,frozen:0n})})}),n?.upserted.forEach(a=>{let[s,r]=a.args;i.push({id:r,balance:this.calculateBalance(a.value)})}),i}))}subscribeErc20Balance(t,e){let n=new _i,i=n.pipe(Mi(1)),a=async()=>(await this.api.query.AssetRegistry.Assets.getEntries({at:"best"})).filter(({value:l})=>{let{asset_type:c}=l;return c.type==="Erc20"}).map(({keyArgs:l})=>{let[c]=l;return c}),s=async()=>{let o=e||await a(),l=async()=>{let d=(await Promise.all(o.map(async m=>{let g=await this.getTokenBalanceData(t,m);return[m,g]}))).map(([m,g])=>({id:m,balance:g}));n.next(d)};await l();let c=this.api.query.System.Number.watchValue("best").subscribe(l);return()=>c.unsubscribe()},r;return s().then(o=>r=o),i.pipe(Ei(()=>r?.()),ki(),ut(([o,l],c)=>c===0?l.filter(u=>u.balance.transferable>0n):this.getDeltas(o,l)),pn((o,l)=>l.length===0))}async getTokenBalanceData(t,e){let n=await this.api.apis.CurrenciesApi.account(e,t,{at:"best"});return this.calculateBalance(n)}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}}getDeltas(t,e){let n=(a,s)=>a!==void 0&&s!==void 0&&a.transferable===s.transferable&&a.total===s.total,i=t.reduce((a,s)=>(a.set(s.id,s.balance),a),new Map);return e.filter(a=>!n(a.balance,i.get(a.id)))}};var pt=class extends E{_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 dn={};x(dn,{AssetNotFound:()=>Re,PoolNotFound:()=>_t,RouteNotFound:()=>Rt});var Re=class extends Error{constructor(t){super(),this.message=`${t} not found`,this.name="AssetNotFound"}},_t=class extends Error{constructor(t){super(),this.message=`${t} pool invalid`,this.name="PoolNotFound"}},Rt=class extends Error{constructor(t,e){super(),this.message=`Route from ${t} to ${e} not found in current configuration`,this.name="RouteNotFound"}};var yn={};x(yn,{EvmClient:()=>Ct,EvmRpcAdapter:()=>Ft,createChain:()=>Fe});import{Binary as Li,CompatibilityLevel as qi,FixedSizeBinary as gn}from"polkadot-api";import{hydration as Ni}from"@galacticcouncil/descriptors";import{encodeFunctionData as Hi,decodeFunctionResult as Gi}from"viem";var Ui=10000000n,Ft=class{api;constructor(t){this.api=t.getTypedApi(Ni)}async getBlock(){let t=await this.api.query.Ethereum.CurrentBlock.getValue({at:"best"}),{header:e}=t,n=e.timestamp/1000n,[i]=e.number;return{timestamp:n,number:i}}readContract=(async t=>{let{abi:e,address:n,functionName:i,args:a}=t,s=Hi({abi:e,functionName:i,args:a}),r=this.api.apis.EthereumRuntimeRPCApi.call,o=await this.api.compatibilityToken,l=r.isCompatible(qi.BackwardsCompatible,o);console.log(l);let c=await this.api.apis.EthereumRuntimeRPCApi.call(gn.fromText(""),gn.fromHex(n),Li.fromHex(s),[0n,0n,0n,0n],[Ui,0n,0n,0n],void 0,void 0,void 0,!1,[]);if(console.log(c),!c.success)throw console.error(i,c.value.type),new Error("Contract read failure");let{exit_reason:u,value:d,used_gas:m}=c.value;if(console.log(m),u.type==="Succeed")return Gi({abi:e,functionName:i,data:d.asHex()});throw console.log(i,u.type,u.value.type),new Error("Contract read error")})};import{defineChain as Vi}from"viem";var Wi=["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"],Fe=()=>Vi({id:222222,name:"Hydration",network:"hydration",nativeCurrency:{decimals:18,name:"WETH",symbol:"WETH"},rpcUrls:{default:{http:Wi}},blockExplorers:{default:{name:"Hydration Explorer",url:"https://hydration.subscan.io"}},testnet:!1});import{createPublicClient as hn,createWalletClient as Yi,custom as bn,http as Xi}from"viem";var Ct=class{client;chain;constructor(t){this.client=t,this.chain=Fe()}get chainId(){return this.chain.id}get chainCurrency(){return this.chain.nativeCurrency.symbol}get chainDecimals(){return this.chain.nativeCurrency.decimals}getProvider(){return hn({chain:this.chain,transport:Xi()})}getWsProvider(){return hn({transport:bn({request:({method:t,params:e})=>this.client._request(t,e||[])})})}getSigner(t){return Yi({account:t,chain:this.chain,transport:bn(window.ethereum)})}getRPCAdapter(){return new Ft(this.client)}};var xn={};x(xn,{LiquidityMiningApi:()=>Et,LiquidityMiningClient:()=>kt});import{AccountId as Ji}from"polkadot-api";import L from"big.js";import{fixed_from_rational as vn}from"@galacticcouncil/math-liquidity-mining";var ce=class{result=new Map;getKey(t,e){return[e,t.toString()].join(",")}constructor(t,e){for(let n=0;n<t.length;++n){let[i,a]=t[n];this.result.set(this.getKey(a,i),e[n].free)}}freeBalance(t,e){return this.result.get(this.getKey(t,e))??0n}transfer(t,e,n,i){let a=this.getKey(t,e),s=this.getKey(t,n),r=this.result.get(a)??0n,o=this.result.get(s)??0n;if(r<i)throw new Error("Attempting to transfer more than is present");this.result.set(a,r+i),this.result.set(s,o+i)}};import at from"big.js";import{calculate_accumulated_rps as Ki,calculate_global_farm_rewards as zi,calculate_loyalty_multiplier as ji,calculate_user_reward as Tn,calculate_yield_farm_delta_rpvs as $i}from"@galacticcouncil/math-liquidity-mining";import fn from"big.js";var Ce=fn(10).pow(18),Pn=BigInt(fn(1).pow(18).toString()),Sn=6e3;var Qi="1000000000000000000",ue=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 i=await this.getAsset(t.reward_currency),a=e-t.updated_at,s=this.getAccount(t.id),r=i?.existential_deposit;if(!r)throw new Error("Missing reward currency asset list");let o=this.multiCurrency.freeBalance(t.reward_currency,s),l=at(r.toString()),c=at(o.toString()).minus(l.lt(o.toString())?r.toString():o.toString()),u=at(zi(t.total_shares_z.toString(),n.toString(),at(t.yield_per_period.toString()).mul(Ce).round(0,at.roundDown).toFixed(),t.max_reward_per_period.toString(),a.toFixed()));if(c.lt(u)&&(u=c),u.eq(0))return t;let d=this.getAccount(0);return this.multiCurrency.transfer(t.reward_currency,s,d,BigInt(u.toFixed())),{...t,accumulated_rpz:BigInt(Ki(t.accumulated_rpz.toString(),t.total_shares_z.toString(),u.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 i=$i(t.accumulated_rpz.toString(),e.accumulated_rpz.toString(),t.multiplier.toString(),t.total_valued_shares.toString());return{...t,accumulated_rpvs:t.accumulated_rpvs+BigInt(i),updated_at:n}}getLoyaltyMultiplier(t,e){let n=at(1).mul(Ce).round(0,at.roundDown).toString();if(!e)return n;let{initial_reward_percentage:i,scale_coef:a}=e;return ji(t.toFixed(),i.toString(),a.toFixed())}async claimRewards(t,e,n,i,a){if(e.state.type==="Terminated")return null;let s=Math.floor(i/t.blocks_per_period);if(n.updated_at===s)return null;let r=await this.syncGlobalFarm(t,s,a);if(!r)return null;let o=this.syncYieldFarm(e,r,s);if(!o)return null;let l=o.total_stopped-n.stopped_at_creation,c=o.updated_at-n.entered_at-l,u=this.getLoyaltyMultiplier(c,o.loyalty_curve),d=BigInt(Tn(n.accumulated_rpvs.toString(),n.valued_shares.toString(),n.accumulated_claimed_rewards.toString(),o.accumulated_rpvs.toString(),u)),m=BigInt(Tn(n.accumulated_rpvs.toString(),n.valued_shares.toString(),n.accumulated_claimed_rewards.toString(),o.accumulated_rpvs.toString(),Qi));return{reward:d,maxReward:m,assetId:r.reward_currency,yieldFarmId:o.id,isActiveFarm:o.state.type==="Active"}}};var Zi=L(365.2425).times(24).times(60).times(60),Et=class{client;balanceClient;options;constructor(t,e,n={}){this.client=t,this.balanceClient=e,this.options=Object.freeze({blockTime:n.blockTime??Sn})}get blockTime(){return this.options.blockTime}async getOraclePrice(t,e){let n=[t,e].sort((a,s)=>a-s);if(t===e)return Pn;let i=await this.client.getOraclePrice(n);if(i){let{n:a,d:s}=i[0].price,r;return t<e?r=vn(a.toString(),s.toString()):r=vn(s.toString(),a.toString()),BigInt(r)}}getFarmAddress=(t,e)=>{let n=Buffer.from("modl","utf-8"),i=Buffer.from(e?"78796b4c4d704944":"4f6d6e6957684c4d","hex"),a=Buffer.from([t]),s=Buffer.concat([n,i,a]),o="0x"+Buffer.concat([s,Buffer.alloc(32-s.length)]).toString("hex");return Ji(63).dec(o)};getGlobalRewardPerPeriod(t,e,n,i){let a=L(i).times(t.toString()).times(e.toString()).div(18);return a.gte(n.toString())?n.toString():a.toString()}getPoolYieldPerPeriod(t,e,n,i){let a=L(t.toString()).times(e),s=L(n.toString()).times(i);return a.div(s.toString()).toString()}farmData(t,e,n){let{yieldFarm:i,globalFarm:a,priceAdjustment:s,balance:r,id:o}=t,{multiplier:l,loyalty_curve:c}=i,{blocks_per_period:u,yield_per_period:d,total_shares_z:m,max_reward_per_period:g,pending_rewards:b,accumulated_paid_rewards:h,planned_yielding_periods:f,updated_at:y,incentivized_asset:S,reward_currency:T,price_adjustment:v,min_deposit:F}=a,A=w.shiftNeg(s??v,18),D=w.shiftNeg(l,18),U=w.shiftNeg(c?.initial_reward_percentage??0,18),X=Zi.div(L(this.blockTime).div(1e3).times(u)).toString(),N;if(m<=0)N=L(D).times(d.toString()).times(X).toString();else{let ni=this.getGlobalRewardPerPeriod(m,d,g,A),ii=this.getPoolYieldPerPeriod(ni,D,m,A);N=L(ii).times(X).toString()}let V=b+h,tt=g*BigInt(f),et=r.transferable+V,Je=et-V,te=L(Je.toString()).div(g.toString()),ee=L(e).div(u.toString()).toString(),ne=(m>=0?te.plus(y):te.plus(ee)).toString(),Pe=L(ne).times(u).toString(),ti=L(m.toString()).div(L(g.toString()).div(d.toString())).div(Math.pow(10,18)).times(100).times(A).toFixed(2),Ze=L(V.toString()).div(et.toString()).gte(.999);N=Ze?"0":L(N).div(n?2:1).times(100).toString();let ei=U?L(N).times(U).toString():void 0;return{apr:N,minApr:ei,isDistributed:Ze,estimatedEndPeriod:ne,estimatedEndBlock:Pe,maxRewards:tt,incentivizedAsset:S,rewardCurrency:T,loyaltyCurve:c,currentPeriod:ee,potMaxRewards:et,fullness:ti,yieldFarmId:i.id,globalFarmId:a.id,poolId:o,distributedRewards:V,plannedYieldingPeriods:f,minDeposit:F}}async getAllOmnipoolFarms(){let e=(await this.client.getAllOmnipooFarms()).reduce((i,a)=>i.includes(a.keyArgs[0].toString())?i:[...i,a.keyArgs[0].toString()],[]),n=await Promise.all(e.map(async i=>{let a=await this.getOmnipoolFarms(i);if(a)return[i,a]}));return Object.fromEntries(n.filter(i=>!!i))}async getOmnipoolFarms(t){let e=await this.client.getOmnipooFarms(Number(t)),n=await this.client.getRelayBlockNumber(),i=await Promise.all(e.map(async({keyArgs:a,value:s})=>{let[,r]=a,o=s,l=await this.client.getOmnipoolGlobalFarm(r),c=await this.client.getOmnipoolYieldFarm(Number(t),r,o);if(!l||!c)return;let u=l.reward_currency,d=l.incentivized_asset,m=this.getFarmAddress(r),g=await this.getOraclePrice(u,d),b=await this.balanceClient.getBalance(m,u);return{id:t,globalFarm:l,yieldFarm:c,priceAdjustment:g,balance:b}}));return n?i.map(a=>a?this.farmData(a,n):void 0):[]}async getAllIsolatedFarms(){let e=(await this.client.getAllIsolatedFarms()).reduce((i,a)=>i.includes(a.keyArgs[0].toString())?i:[...i,a.keyArgs[0].toString()],[]),n=await Promise.all(e.map(async i=>{let a=await this.getIsolatedFarms(i);if(a)return[i,a]}));return Object.fromEntries(n.filter(i=>!!i))}async getIsolatedFarms(t){let e=await this.client.getIsolatedFarms(t),n=await this.client.getRelayBlockNumber(),i=await Promise.all(e.map(async({keyArgs:a,value:s})=>{let[,r]=a,o=s,l=await this.client.getIsolatedGlobalFarm(r),c=await this.client.getIsolatedYieldFarm(t,r,o);if(!l||!c)return;let u=l.reward_currency,d=l.incentivized_asset,m=this.getFarmAddress(r,!0),g=await this.getOraclePrice(u,d),b=await this.balanceClient.getBalance(m,u);return{id:t,globalFarm:l,yieldFarm:c,priceAdjustment:g,balance:b,farmAddress:m}}));return n?i.map(a=>a?this.farmData(a,n,!0):void 0):[]}async getDepositReward(t,e,n,i){let a=e.global_farm_id,s=e.yield_farm_id,r=n?await this.client.getIsolatedYieldFarm(t,a,s):await this.client.getOmnipoolYieldFarm(Number(t),a,s),o=n?await this.client.getIsolatedGlobalFarm(a):await this.client.getOmnipoolGlobalFarm(a);if(!o||!r)return;let l=o.reward_currency,c=o.incentivized_asset,u=[[this.getFarmAddress(0,n),o.reward_currency],[this.getFarmAddress(o.id,n),o.reward_currency]],d=await this.getAccountAssetBalances(u),m=await this.getOraclePrice(l,c),g=new ce(u,d),h=await new ue(y=>this.getFarmAddress(y),y=>this.client.getAsset(y),g).claimRewards(o,r,e,i,m??o.price_adjustment);if(!h)return;let f=await this.client.getAsset(h.assetId);if(f&&!(h.reward<=f.existential_deposit))return h}async getAccountAssetBalances(t){let[e,n]=await Promise.all([Promise.all(t.filter(([a,s])=>s!==0).map(([a,s])=>this.balanceClient.getTokenBalance(a,s))),Promise.all(t.filter(([a,s])=>s===0).map(([a])=>this.balanceClient.getSystemBalance(a)))]),i=[];for(let a=0,s=0;a+s<t.length;){let r=a+s,[,o]=t[r];o===0?(i.push(n[s]),s+=1):(i.push(e[a]),a+=1)}return i}};import{Binary as ta,Enum as ea}from"polkadot-api";var kt=class extends E{omnipoolAssetIds=[];async getOraclePrice(t){return await this.api.query.EmaOracle.Oracles.getValue(ta.fromText("omnipool"),t,ea("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 qn={};x(qn,{PoolContextProvider:()=>Pt,PoolError:()=>J,PoolFactory:()=>yt,PoolType:()=>R,aave:()=>He,hsm:()=>We,lbp:()=>Ee,omni:()=>Me,stable:()=>Le,xyk:()=>qe});var Ee={};x(Ee,{LbpMath:()=>W,LbpPool:()=>Mt,LbpPoolClient:()=>Dt});import{calculate_in_given_out as na,calculate_out_given_in as ia,calculate_linear_weights as aa,calculate_pool_trade_fee as sa,get_spot_price as ra}from"@galacticcouncil/math-lbp";var W=class{static getSpotPrice(t,e,n,i,a){return ra(t,e,n,i,a)}static calculateInGivenOut(t,e,n,i,a){return na(t,e,n,i,a)}static calculateOutGivenIn(t,e,n,i,a){return ia(t,e,n,i,a)}static calculateLinearWeights(t,e,n,i,a){return aa(t,e,n,i,a)}static calculatePoolTradeFee(t,e,n){return sa(t,e,n)}};var R=(s=>(s.Aave="Aave",s.LBP="LBP",s.Omni="Omnipool",s.Stable="Stableswap",s.XYK="XYK",s.HSM="HSM",s))(R||{}),J=(c=>(c.UnknownError="UnknownError",c.FacilitatorCapacityExceeded="FacilitatorCapacityExceeded",c.InsufficientTradingAmount="InsufficientTradingAmount",c.InsufficientCollateral="InsufficientCollateral",c.MaxHoldingExceeded="MaxHoldingExceeded",c.MaxInRatioExceeded="MaxInRatioExceeded",c.MaxOutRatioExceeded="MaxOutRatioExceeded",c.TradeNotAllowed="TradeNotAllowed",c.MaxBuyBackExceeded="MaxBuyBackExceeded",c.MaxBuyPriceExceeded="MaxBuyPriceExceeded",c))(J||{});var{FeeUtils:wn}=w,Mt=class p{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;fee;repayFeeApply;static fromPool(t){return new p(t)}constructor(t){this.type="LBP",this.address=t.address,this.tokens=t.tokens,this.maxInRatio=t.maxInRatio,this.maxOutRatio=t.maxOutRatio,this.minTradingLimit=t.minTradingLimit,this.fee=t.fee,this.repayFeeApply=t.repayFeeApply}validatePair(t,e){return!0}parsePair(t,e){let n=new Map(this.tokens.map(s=>[s.id,s])),i=n.get(t),a=n.get(e);if(i==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:i.balance,balanceOut:a.balance,decimalsIn:i.decimals,decimalsOut:a.decimals,weightIn:i.weight,weightOut:a.weight}}validateAndBuy(t,e,n){let i=this.tokens[0].id,a=[];e<this.minTradingLimit&&a.push("InsufficientTradingAmount");let s=t.balanceOut/this.maxOutRatio;if(e>s&&a.push("MaxOutRatioExceeded"),i===t.assetOut){let r=this.calculateTradeFee(e,n),o=wn.toPct(this.repayFeeApply?n.repayFee:n.exchangeFee),l=e+r,c=this.calculateInGivenOut(t,l),u=t.balanceIn/this.maxInRatio;return c>u&&a.push("MaxInRatioExceeded"),{amountIn:c,calculatedIn:c,amountOut:e,feePct:o,errors:a}}else{let r=this.calculateInGivenOut(t,e),o=t.balanceIn/this.maxInRatio;return r>o&&a.push("MaxInRatioExceeded"),{amountIn:r,calculatedIn:r,amountOut:e,feePct:0,errors:a}}}validateAndSell(t,e,n){let i=this.tokens[0].id,a=[];e<this.minTradingLimit&&a.push("InsufficientTradingAmount");let s=t.balanceIn/this.maxInRatio;if(e>s&&a.push("MaxInRatioExceeded"),i===t.assetIn){let r=this.calculateOutGivenIn(t,e),o=t.balanceOut/this.maxOutRatio;return r>o&&a.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:r,amountOut:r,feePct:0,errors:a}}else{let r=this.calculateOutGivenIn(t,e),o=this.calculateTradeFee(r,n),l=wn.toPct(this.repayFeeApply?n.repayFee:n.exchangeFee),c=r-o,u=t.balanceOut/this.maxOutRatio;return c>u&&a.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:r,amountOut:c,feePct:l,errors:a}}}calculateInGivenOut(t,e){let n=W.calculateInGivenOut(t.balanceIn.toString(),t.balanceOut.toString(),t.weightIn.toString(),t.weightOut.toString(),e.toString()),i=BigInt(n);return i<0n?0n:i}calculateOutGivenIn(t,e){let n=W.calculateOutGivenIn(t.balanceIn.toString(),t.balanceOut.toString(),t.weightIn.toString(),t.weightOut.toString(),e.toString()),i=BigInt(n);return i<0n?0n:i}spotPriceInGivenOut(t){let e=W.getSpotPrice(t.balanceOut.toString(),t.balanceIn.toString(),t.weightOut.toString(),t.weightIn.toString(),this.maxOutRatio.toString());return BigInt(e)}spotPriceOutGivenIn(t){let e=W.getSpotPrice(t.balanceIn.toString(),t.balanceOut.toString(),t.weightIn.toString(),t.weightOut.toString(),this.maxInRatio.toString());return BigInt(e)}calculateTradeFee(t,e){let n=W.calculatePoolTradeFee(t.toString(),this.repayFeeApply?e.repayFee[0]:e.exchangeFee[0],this.repayFeeApply?e.repayFee[1]:e.exchangeFee[1]);return BigInt(n)}};import{CompatibilityLevel as Aa}from"polkadot-api";import{Subscription as Oa,distinctUntilChanged as Ba,filter as _a}from"rxjs";import{memoize1 as la}from"@thi.ng/memoize";import{TLRUCache as ca}from"@thi.ng/cache";import{ReplaySubject as ua,Subscription as pa,bufferCount as ma,combineLatest as In,debounceTime as da,defer as ga,filter as ha,finalize as ba,from as ya,map as mt,merge as fa,of as Pa,pairwise as Sa,skip as Ta,share as va,startWith as xa,switchMap as wa,tap as An,throttleTime as Ia}from"rxjs";import{BehaviorSubject as oa}from"rxjs";var pe=class{store$=new oa([]);updateQueue=Promise.resolve();changeset=new Set;get pools(){return this.store$.value}asObservable(){return this.store$.asObservable()}applyChangeset(t){return this.changeset.size===0?[]:t.filter(e=>this.changeset.has(e.address))}set(t){this.changeset=new Set(t.map(e=>e.address)),this.store$.next(t)}update(t){this.updateQueue=this.updateQueue.then(async()=>{let e=this.store$.value,n=new Map(e.map((r,o)=>[r.address,o])),i=await t(e),a=e.slice(),s=new Set;for(let r of i){let o=n.get(r.address);o===void 0?(n.set(r.address,a.length),a.push(r)):a[o]=r,s.add(r.address)}this.changeset=s,this.store$.next(a)}).catch(console.error)}destroy(){this.store$.complete()}};var q=class extends K{evm;store=new pe;shared$;mem=0;memPoolsCache=new ca(null,{ttl:6*1e3});memPools=la(t=>(this.log(this.getPoolType(),"sync mem pools",t),this.loadPools()),this.memPoolsCache);constructor(t,e){super(t),this.evm=e}async getMemPools(){return this.memPools(this.mem)}async getPools(){return(await this.getMemPools()).filter(e=>this.hasValidAssets(e))}getSubscriber(){return this.shared$||(this.shared$=this.subscribeStore()),this.shared$.pipe(xa([]),ma(2,1),mt(([t,e])=>t.length===0?e:this.store.applyChangeset(e)),ha(t=>t.length>0),Ia(1e3,void 0,{leading:!0,trailing:!0}))}subscribeStore(){return ga(()=>{let t=new pa;return ya(this.getMemPools()).pipe(mt(n=>n.filter(i=>this.hasValidAssets(i))),An(n=>this.store.set(n))).pipe(An(()=>{t.add(this.subscribeBalances()),t.add(this.subscribeUpdates())}),wa(n=>fa(Pa(n),this.store.asObservable().pipe(Ta(1)))),ba(()=>{t.unsubscribe()}))}).pipe(va({connector:()=>new ua(1),resetOnRefCountZero:!0}))}subscribeBalances(){let t=this.store.pools.map(e=>{let{address:n}=e,i=[this.subscribeTokensBalance(n)];if(this.hasSystemAsset(e)){let a=this.subscribeSystemBalance(n);i.push(a)}if(this.hasErc20Asset(e)){let a=e.tokens.filter(r=>r.type==="Erc20").map(r=>r.id),s=this.subscribeErc20Balance(n,a);i.push(s)}return In(i).pipe(mt(a=>a.flat()),Sa(),mt(([a,s])=>this.getDeltas(a,s)),mt(a=>[n,a]))});return In(t).pipe(da(250),mt(e=>new Map(e))).subscribe(e=>this.store.update(n=>this.updateBalances(n,e)))}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(({decimals:e,balance:n})=>n>0n&&!!e)}updateBalances=(t,e)=>{let n=[],i=new Map(t.map(a=>[a.address,a]));for(let[a,s]of e){let r=i.get(a);if(r){let o=r.tokens.map(l=>{let c=s.find(u=>u.id===l.id);return c&&l.id!==r.id?{...l,balance:c.balance.transferable}:l});n.push({...r,tokens:o})}}return n}};var Dt=class extends q{MAX_FINAL_WEIGHT=100000000n;poolsData=new Map([]);getPoolType(){return"LBP"}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}}getPoolWeights(t,e){let{start:n,end:i,initial_weight:a,final_weight:s}=t,r=W.calculateLinearWeights(n?n.toString():"0",i?i.toString():"0",a.toString(),s.toString(),e.toString()),o=BigInt(r),l=this.MAX_FINAL_WEIGHT-BigInt(o);return[o,l]}async isSupported(){let t=this.api.query.LBP.PoolData,e=await this.api.compatibilityToken;return t.isCompatible(Aa.BackwardsCompatible,e)}async loadPools(){let[t,e,n]=await Promise.all([this.api.query.LBP.PoolData.getEntries({at:"best"}),this.api.query.ParachainSystem.ValidationData.getValue({at:"best"}),this.getPoolLimits()]),i=e?.relay_parent_number||0,a=t.filter(({value:s})=>e&&this.isActivePool(s,i)).map(async({keyArgs:s,value:r})=>{let[o]=s,l=o.toString(),c=await this.getPoolDelta(l,r,i);return{address:l,type:"LBP",fee:r.fee,...c,...n}});return Promise.all(a)}async getPoolDelta(t,e,n){let{assets:i,repay_target:a,fee_collector:s}=e,[r,o]=this.getPoolWeights(e,n),[l,c]=i,[u,d,m,g,b]=await Promise.all([this.isRepayFeeApplied(l,a,s.toString()),this.getBalance(t,l),this.api.query.AssetRegistry.Assets.getValue(l),this.getBalance(t,c),this.api.query.AssetRegistry.Assets.getValue(c)]);return{repayFeeApply:u,tokens:[{id:l,decimals:m?.decimals,existentialDeposit:m?.existential_deposit,balance:d.transferable,weight:r,type:m?.asset_type.type},{id:c,decimals:b?.decimals,existentialDeposit:b?.existential_deposit,balance:g.transferable,weight:o,type:b?.asset_type.type}]}}isActivePool(t,e){let{start:n,end:i}=t;return n&&i?e>=n&&e<i:!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 getPoolFees(t,e){let n=this.store.pools.find(a=>a.address===e);return{repayFee:await this.getRepayFee(),exchangeFee:n.fee}}subscribeValidationData(){return this.api.query.ParachainSystem.ValidationData.watchValue("best").pipe(_a(t=>t!==void 0),Ba((t,e)=>t.relay_parent_number===e.relay_parent_number)).subscribe(({relay_parent_number:t})=>{this.store.update(async e=>{let n=[];for(let i of e){let a=this.poolsData.get(i.address);if(a){let{assets:s,repay_target:r,fee_collector:o}=a,[l]=s,[c,u]=this.getPoolWeights(a,t),[d,m]=i.tokens,g=[{...d,weight:c},{...m,weight:u}],b=await this.isRepayFeeApplied(l,r,o.toString());n.push({...i,tokens:g,repayFeeApply:b})}}return n})})}subscribeUpdates(){let t=new Oa;return t.add(this.subscribeValidationData()),t}};var Me={};x(Me,{OmniMath:()=>I,OmniPool:()=>Lt,OmniPoolClient:()=>qt});import{calculate_in_given_out as Ra,calculate_lrna_in_given_out as Fa,calculate_out_given_in as Ca,calculate_out_given_lrna_in as Ea,calculate_spot_price as ka,calculate_lrna_spot_price as Ma,calculate_shares as Da,calculate_liquidity_out as La,calculate_liquidity_lrna_out as qa,verify_asset_cap as Na,calculate_liquidity_hub_in as Ha,is_sell_allowed as Ga,is_buy_allowed as Ua,is_add_liquidity_allowed as Va,is_remove_liquidity_allowed as Wa,recalculate_asset_fee as Ya,recalculate_protocol_fee as Xa}from"@galacticcouncil/math-omnipool";import dt from"big.js";var I=class{static calculateSpotPrice(t,e,n,i){return ka(t,e,n,i)}static calculateLrnaSpotPrice(t,e){return Ma(t,e)}static calculateInGivenOut(t,e,n,i,a,s,r,o,l){return Ra(t,e,n,i,a,s,r,o,l)}static calculateLrnaInGivenOut(t,e,n,i,a){return Fa(t,e,n,i,a)}static calculateOutGivenIn(t,e,n,i,a,s,r,o,l){return Ca(t,e,n,i,a,s,r,o,l)}static calculateOutGivenLrnaIn(t,e,n,i,a){return Ea(t,e,n,i,a)}static calculateShares(t,e,n,i){return Da(t,e,n,i)}static calculateLiquidityOut(t,e,n,i,a,s,r,o){return La(t,e,n,i,a,s,r,o)}static calculateLiquidityLRNAOut(t,e,n,i,a,s,r,o){return qa(t,e,n,i,a,s,r,o)}static calculateCapDifference(t,e,n,i){let a=dt(e),s=dt(t),r=dt(i),o=dt(n),l=dt(10).pow(18),c=o.div(l);if(a.div(r).lt(c)){let d=c.times(r).minus(a).times(s),m=a.times(dt(1).minus(c));return d.div(m).toFixed(0)}else return"0"}static calculateLimitHubIn(t,e,n,i){return Ha(t,e,n,i)}static isSellAllowed(t){return Ga(t)}static isBuyAllowed(t){return Ua(t)}static isAddLiquidityAllowed(t){return Va(t)}static isRemoveLiquidityAllowed(t){return Wa(t)}static recalculateAssetFee(t,e,n,i,a,s,r,o,l,c,u){return Ya(t,e,n,i,a,s,r,o,l,c,u)}static recalculateProtocolFee(t,e,n,i,a,s,r,o,l,c,u){return Xa(t,e,n,i,a,s,r,o,l,c,u)}static verifyAssetCap(t,e,n,i){return Na(t,e,n,i)}};var{FeeUtils:gt}=w,Lt=class p{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;hubAssetId;static fromPool(t){return new p(t)}constructor(t){this.type="Omnipool",this.address=t.address,this.tokens=t.tokens,this.maxInRatio=t.maxInRatio,this.maxOutRatio=t.maxOutRatio,this.minTradingLimit=t.minTradingLimit,this.hubAssetId=t.hubAssetId}validatePair(t,e){return this.hubAssetId!=e}parsePair(t,e){let n=new Map(this.tokens.map(s=>[s.id,s])),i=n.get(t),a=n.get(e);if(i==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:i.hubReserves,hubReservesOut:a.hubReserves,sharesIn:i.shares,sharesOut:a.shares,decimalsIn:i.decimals,decimalsOut:a.decimals,balanceIn:i.balance,balanceOut:a.balance,tradeableIn:i.tradeable,tradeableOut:a.tradeable,assetInEd:i.existentialDeposit,assetOutEd:a.existentialDeposit}}validateAndBuy(t,e,n){let i=this.calculateInGivenOut(t,e),a=this.calculateInGivenOut(t,e,n),s=i===0n?0:O.calculateDiffToRef(a,i),r=[],o=I.isSellAllowed(t.tradeableIn),l=I.isBuyAllowed(t.tradeableOut);(!o||!l)&&r.push("TradeNotAllowed"),(e<this.minTradingLimit||i<t.assetInEd)&&r.push("InsufficientTradingAmount");let c=t.balanceOut/this.maxOutRatio;e>c&&r.push("MaxOutRatioExceeded");let u=t.balanceIn/this.maxInRatio;return a>u&&r.push("MaxInRatioExceeded"),{amountIn:a,calculatedIn:i,amountOut:e,feePct:s,errors:r}}validateAndSell(t,e,n){let i=this.calculateOutGivenIn(t,e),a=this.calculateOutGivenIn(t,e,n),s=O.calculateDiffToRef(i,a),r=[],o=I.isSellAllowed(t.tradeableIn),l=I.isBuyAllowed(t.tradeableOut);(!o||!l)&&r.push("TradeNotAllowed"),(e<this.minTradingLimit||i<t.assetOutEd)&&r.push("InsufficientTradingAmount");let c=t.balanceIn/this.maxInRatio;e>c&&r.push("MaxInRatioExceeded");let u=t.balanceOut/this.maxOutRatio;return a>u&&r.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:i,amountOut:a,feePct:s,errors:r}}calculateInGivenOut(t,e,n){if(t.assetIn==this.hubAssetId)return this.calculateLrnaInGivenOut(t,e,n);let i=I.calculateInGivenOut(t.balanceIn.toString(),t.hubReservesIn.toString(),t.sharesIn.toString(),t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),n?gt.toRaw(n.assetFee).toString():"0",n?gt.toRaw(n.protocolFee).toString():"0"),a=BigInt(i);return a<0n?0n:a}calculateLrnaInGivenOut(t,e,n){let i=I.calculateLrnaInGivenOut(t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),n?gt.toRaw(n.assetFee).toString():"0"),a=BigInt(i);return a<0n?0n:a}calculateOutGivenIn(t,e,n){if(t.assetIn==this.hubAssetId)return this.calculateOutGivenLrnaIn(t,e,n);let i=I.calculateOutGivenIn(t.balanceIn.toString(),t.hubReservesIn.toString(),t.sharesIn.toString(),t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),n?gt.toRaw(n.assetFee).toString():"0",n?gt.toRaw(n.protocolFee).toString():"0"),a=BigInt(i);return a<0n?0n:a}calculateOutGivenLrnaIn(t,e,n){let i=I.calculateOutGivenLrnaIn(t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),n?gt.toRaw(n.assetFee).toString():"0"),a=BigInt(i);return a<0n?0n:a}spotPriceInGivenOut(t){if(t.assetIn==this.hubAssetId)return this.spotPriceLrnaInGivenOut(t);let e=I.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=I.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=I.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=I.calculateLrnaSpotPrice(t.balanceOut.toString(),t.hubReservesOut.toString()),n=Math.pow(10,18-t.decimalsIn);return BigInt(e)/BigInt(n)}};import{AccountId as Ka,Binary as za,CompatibilityLevel as ja,Enum as $a}from"polkadot-api";import{toHex as Qa}from"@polkadot-api/utils";import{Subscription as Ja,distinctUntilChanged as ke,filter as Za,finalize as ht,map as ts,merge as es}from"rxjs";var{FeeUtils:C}=w,On=za.fromText("omnipool"),Bn=$a("Short"),qt=class extends q{queryBus=new re;block=0;dynamicFeesConfig=this.queryBus.scope("DynamicFees.AssetFeeConfiguration",t=>this.api.query.DynamicFees.AssetFeeConfiguration.getValue(t,{at:"best"}),t=>String(t));dynamicFees=this.queryBus.scope("DynamicFees.AssetFee",t=>this.api.query.DynamicFees.AssetFee.getValue(t,{at:"best"}),t=>String(t),6*1e3);emaOracles=this.queryBus.scope("EmaOracle.Oracles.Short",t=>this.api.query.EmaOracle.Oracles.getValue(On,t,Bn,{at:"best"}),t=>t.join(":"),6*1e3);getPoolType(){return"Omnipool"}getPoolAddress(){let t="modlomnipool".padEnd(32,"\0"),e=new TextEncoder().encode(t),n=Qa(e);return Ka(63).dec(n)}getOraclePair(t){return t===0?[0,1]:[1,t]}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 isSupported(){let t=this.api.query.Omnipool.Assets,e=await this.api.compatibilityToken;return t.isCompatible(ja.BackwardsCompatible,e)}async loadPools(){let t=await this.api.constants.Omnipool.HubAssetId(),e=this.getPoolAddress(),[n,i,a,s,r]=await Promise.all([this.api.query.Omnipool.Assets.getEntries({at:"best"}),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:u})=>{let[d]=c,{hub_reserve:m,shares:g,tradable:b,cap:h,protocol_shares:f}=u,[y,S]=await Promise.all([this.api.query.AssetRegistry.Assets.getValue(d),this.getBalance(e,d)]);return{id:d,decimals:y?.decimals,existentialDeposit:y?.existential_deposit,balance:S.transferable,cap:h,hubReserves:m,protocolShares:f,shares:g,tradeable:b,type:y?.asset_type.type}}),l=await Promise.all(o);return l.push({id:t,decimals:a?.decimals,existentialDeposit:a?.existential_deposit,balance:s.transferable,tradeable:i,type:a?.asset_type.type}),[{address:e,type:"Omnipool",hubAssetId:t,tokens:l,...r}]}async getPoolFees(t){let e=t.assetOut,n=t.assetIn,i=await this.dynamicFeesConfig.get(e);if(i?.type==="Fixed"){let{asset_fee:y,protocol_fee:S}=i.value;return{assetFee:C.fromPermill(y),protocolFee:C.fromPermill(S)}}let a=this.getOraclePair(e),s=this.getOraclePair(n),[r,o,l]=await Promise.all([this.dynamicFees.get(e),this.emaOracles.get(a),this.emaOracles.get(s)]),[c,u,d]=await this.getAssetFee(t,this.block,r,o,i?.value.asset_fee_params),[m,g,b]=n===1?[0,0,0]:await this.getProtocolFee(t,this.block,r,l,i?.value.protocol_fee_params),h=c+m,f=d+b;return{assetFee:C.fromPermill(u),protocolFee:C.fromPermill(g),min:C.fromPermill(h),max:C.fromPermill(f)}}async getAssetFee(t,e,n,i,a){let{assetOut:s,balanceOut:r}=t,{min_fee:o,max_fee:l,decay:c,amplification:u}=a||await this.api.constants.DynamicFees.AssetFeeParameters();if(!n||!i)return[o,o,l];let d=C.fromPermill(o),m=C.fromPermill(l),[g]=i,{asset_fee:b,timestamp:h}=n,f=Math.max(1,e-h),y=g.volume.b_in.toString(),S=g.volume.b_out.toString(),T=g.liquidity.b.toString();s===0&&(y=g.volume.a_in.toString(),S=g.volume.a_out.toString(),T=g.liquidity.a.toString());let v=C.fromPermill(b),F=I.recalculateAssetFee(y,S,T,"9",r.toString(),C.toRaw(v).toString(),f.toString(),C.toRaw(d).toString(),C.toRaw(m).toString(),c.toString(),u.toString());return[o,Number(F)*1e6,l]}async getProtocolFee(t,e,n,i,a){let{assetIn:s,balanceIn:r}=t,{min_fee:o,max_fee:l,decay:c,amplification:u}=a||await this.api.constants.DynamicFees.ProtocolFeeParameters();if(!n||!i)return[o,o,l];let d=C.fromPermill(o),m=C.fromPermill(l),[g]=i,{protocol_fee:b,timestamp:h}=n,f=Math.max(1,e-h),y=g.volume.b_in.toString(),S=g.volume.b_out.toString(),T=g.liquidity.b.toString();s===0&&(y=g.volume.a_in.toString(),S=g.volume.a_out.toString(),T=g.liquidity.a.toString());let v=C.fromPermill(b),F=I.recalculateProtocolFee(y,S,T,"9",r.toString(),C.toRaw(v).toString(),f.toString(),C.toRaw(d).toString(),C.toRaw(m).toString(),c.toString(),u.toString());return[o,Number(F)*1e6,l]}subscribeEmaOracles(){let[t]=this.store.pools,n=t.tokens.map(i=>i.id).map(i=>this.getOraclePair(i)).map(i=>this.api.query.EmaOracle.Oracles.watchValue(On,i,Bn,"best").pipe(Za(a=>a!==void 0),ts(a=>({pair:i,value:a}))));return es(...n).pipe(ht(()=>{this.log(this.getPoolType(),"unsub ema oracles"),this.emaOracles.clear()})).subscribe(i=>{let{pair:a,value:s}=i;this.emaOracles.set(s,a)})}subscribeDynamicFees(){return this.api.query.DynamicFees.AssetFee.watchEntries({at:"best"}).pipe(ke((t,e)=>!e.deltas),ht(()=>{ht(()=>{this.log(this.getPoolType(),"unsub dyn fees"),this.dynamicFees.clear()})})).subscribe(({deltas:t})=>{t?.upserted.forEach(e=>{let[n]=e.args;this.dynamicFees.set(e.value,n)})})}subscribeDynamicFeesConfig(){return this.api.query.DynamicFees.AssetFeeConfiguration.watchEntries({at:"best"}).pipe(ke((t,e)=>!e.deltas),ht(()=>{this.log(this.getPoolType(),"unsub dyn fees config"),this.dynamicFeesConfig.clear()})).subscribe(({deltas:t})=>{t?.upserted.forEach(e=>{let[n]=e.args;this.dynamicFeesConfig.set(e.value,n)})})}subscribeBlock(){return this.api.query.System.Number.watchValue("best").pipe(ht(()=>{this.log(this.getPoolType(),"unsub block change")})).subscribe(t=>{this.block=t})}subscribeAssets(){return this.api.query.Omnipool.Assets.watchEntries({at:"best"}).pipe(ke((t,e)=>!e.deltas),ht(()=>{this.log(this.getPoolType(),"unsub assets")})).subscribe(({deltas:t})=>{this.store.update(([e])=>{let n=t?.upserted.reduce((a,s)=>{let[r]=s.args;return a.set(r,s.value),a},new Map),i=e.tokens.map(a=>{let s=n?.get(a.id);return s?this.updateTokenState(a,s):a});return[{...e,tokens:i}]})})}subscribeUpdates(){let t=new Ja;return t.add(this.subscribeAssets()),t.add(this.subscribeDynamicFees()),t.add(this.subscribeDynamicFeesConfig()),t.add(this.subscribeEmaOracles()),t.add(this.subscribeBlock()),t}updateTokenState(t,e){let{hub_reserve:n,shares:i,tradable:a,cap:s,protocol_shares:r}=e;return{...t,cap:s,hubReserves:n,protocolShares:r,shares:i,tradeable:a}}};var Le={};x(Le,{StableMath:()=>M,StableSwap:()=>Z,StableSwapClient:()=>Nt});import{calculate_in_given_out as ns,calculate_out_given_in as is,calculate_amplification as as,calculate_add_one_asset as ss,calculate_liquidity_out_one_asset as rs,calculate_shares as os,calculate_shares_for_amount as ls,calculate_spot_price_with_fee as cs,pool_account_name as us,recalculate_peg as ps}from"@galacticcouncil/math-stableswap";var M=class{static getPoolAddress(t){return us(t)}static defaultPegs(t){let e=[];for(let n=0;n<t;n++)e.push(["1","1"]);return e}static calculateAmplification(t,e,n,i,a){return as(t,e,n,i,a)}static calculateInGivenOut(t,e,n,i,a,s,r){return ns(t,e,n,i,a,s,r)}static calculateAddOneAsset(t,e,n,i,a,s,r){return ss(t,e,n,i,a,s,r)}static calculateSharesForAmount(t,e,n,i,a,s,r){return ls(t,e,n,i,a,s,r)}static calculateOutGivenIn(t,e,n,i,a,s,r){return is(t,e,n,i,a,s,r)}static calculateLiquidityOutOneAsset(t,e,n,i,a,s,r){return rs(t,e,n,i,a,s,r)}static calculateShares(t,e,n,i,a,s){return os(t,e,n,i,a,s)}static calculateSpotPriceWithFee(t,e,n,i,a,s,r,o){return cs(t,e,n,i,a,s,r,o)}static recalculatePegs(t,e,n,i,a){let s=ps(t,e,n,i,a);return JSON.parse(s)}};var{FeeUtils:bt}=w,Z=class p{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;amplification;isRampPeriod;id;fee;totalIssuance;pegs;static fromPool(t){return new p(t)}constructor(t){this.type="Stableswap",this.address=t.address,this.tokens=t.tokens,this.maxInRatio=t.maxInRatio,this.maxOutRatio=t.maxOutRatio,this.minTradingLimit=t.minTradingLimit,this.amplification=t.amplification,this.isRampPeriod=t.isRampPeriod,this.id=t.id,this.fee=t.fee,this.totalIssuance=t.totalIssuance,this.pegs=t.pegs}validatePair(t,e){return!0}parsePair(t,e){let n=new Map(this.tokens.map(s=>[s.id,s])),i=n.get(t),a=n.get(e);if(i==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:i.balance,balanceOut:a.balance,decimalsIn:i.decimals,decimalsOut:a.decimals,tradeableIn:this.id===t?15:i.tradeable,tradeableOut:this.id===e?15:a.tradeable,assetInEd:i.existentialDeposit,assetOutEd:a.existentialDeposit}}validateAndBuy(t,e,n){let i=this.calculateInGivenOut(t,e),a=this.calculateInGivenOut(t,e,n),s=i===0n?0:O.calculateDiffToRef(a,i),r=[],o=I.isSellAllowed(t.tradeableIn),l=I.isBuyAllowed(t.tradeableOut);return(!o||!l)&&r.push("TradeNotAllowed"),(e<this.minTradingLimit||i<t.assetInEd)&&r.push("InsufficientTradingAmount"),{amountIn:a,calculatedIn:i,amountOut:e,feePct:s,errors:r}}validateAndSell(t,e,n){let i=this.calculateOutGivenIn(t,e),a=this.calculateOutGivenIn(t,e,n),s=O.calculateDiffToRef(i,a),r=[],o=I.isSellAllowed(t.tradeableIn),l=I.isBuyAllowed(t.tradeableOut);return(!o||!l)&&r.push("TradeNotAllowed"),(e<this.minTradingLimit||i<t.assetOutEd)&&r.push("InsufficientTradingAmount"),{amountIn:e,calculatedOut:i,amountOut:a,feePct:s,errors:r}}calculateIn(t,e,n){let i=M.calculateInGivenOut(this.getReserves(),Number(t.assetIn),Number(t.assetOut),e.toString(),this.amplification.toString(),n?bt.toRaw(n.fee).toString():"0",this.getPegs()),a=BigInt(i);return a<0n?0n:a}calculateAddOneAsset(t,e,n){let i=M.calculateAddOneAsset(this.getReserves(),e.toString(),Number(t.assetIn),this.amplification.toString(),this.totalIssuance.toString(),n?bt.toRaw(n.fee).toString():"0",this.getPegs()),a=BigInt(i);return a<0n?0n:a}calculateSharesForAmount(t,e,n){let i=M.calculateSharesForAmount(this.getReserves(),Number(t.assetOut),e.toString(),this.amplification.toString(),this.totalIssuance.toString(),n?bt.toRaw(n.fee).toString():"0",this.getPegs()),a=BigInt(i);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=M.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 i=Math.pow(10,t.decimalsIn-t.decimalsOut);return BigInt(e)/BigInt(i)}let n=Math.pow(10,18-t.decimalsIn);return BigInt(e)/BigInt(n)}calculateOut(t,e,n){let i=M.calculateOutGivenIn(this.getReserves(),Number(t.assetIn),Number(t.assetOut),e.toString(),this.amplification.toString(),n?bt.toRaw(n.fee).toString():"0",this.getPegs()),a=BigInt(i);return a<0n?0n:a}calculateWithdrawOneAsset(t,e,n){let i=M.calculateLiquidityOutOneAsset(this.getReserves(),e.toString(),Number(t.assetOut),this.amplification.toString(),this.totalIssuance.toString(),n?bt.toRaw(n.fee).toString():"0",this.getPegs()),a=BigInt(i);return a<0n?0n:a}calculateShares(t,e,n){let i=M.calculateShares(this.getReserves(),this.getAssets(t.assetIn,e),this.amplification.toString(),this.totalIssuance.toString(),n?bt.toRaw(n.fee).toString():"0",this.getPegs()),a=BigInt(i);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=M.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 i=Math.pow(10,t.decimalsOut-t.decimalsIn);return BigInt(e)/BigInt(i)}let n=Math.pow(10,18-t.decimalsOut);return BigInt(e)/BigInt(n)}getPegs(){return JSON.stringify(this.pegs)}getReserves(){let t=this.tokens.filter(e=>e.id!=this.id).map(({id:e,balance:n,decimals:i})=>({asset_id:e,amount:n,decimals:i}));return JSON.stringify(t,Bt.jsonFormatter)}getAssets(t,e){let n={asset_id:Number(t),amount:e.toString()};return JSON.stringify([n],Bt.jsonFormatter)}};import{AccountId as ms,CompatibilityLevel as ds}from"polkadot-api";import{toHex as gs}from"@polkadot-api/utils";import{blake2b as hs}from"@noble/hashes/blake2b";import{Subscription as bs,distinctUntilChanged as ys,finalize as De,map as fs,merge as Ps}from"rxjs";var{FeeUtils:Ss}=w,Nt=class extends q{poolsData=new Map([]);getPoolType(){return"Stableswap"}getPoolAddress(t){let e=M.getPoolAddress(t),n=hs(e,{dkLen:32}),i=gs(n);return ms(63).dec(i)}async getPoolLimits(){return{maxInRatio:0n,maxOutRatio:0n,minTradingLimit:await this.api.constants.Stableswap.MinTradingLimit()}}getPoolAmplification(t,e){let{initial_amplification:n,final_amplification:i,initial_block:a,final_block:s}=t,r=M.calculateAmplification(n.toString(),i.toString(),a.toString(),s.toString(),e.toString()),o=Number(r)<i;return{amplification:BigInt(r),isRampPeriod:o}}async getPoolTokens(t,e){let n=this.getPoolAddress(t),i=e.assets.map(async a=>{let[s,r,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:r?.decimals,existentialDeposit:r?.existential_deposit,balance:o.transferable,tradeable:s,type:r?.asset_type.type}});return Promise.all(i)}async isSupported(){let t=this.api.query.Stableswap.Pools,e=await this.api.compatibilityToken;return t.isCompatible(ds.BackwardsCompatible,e)}async loadPools(){let[t,e,n]=await Promise.all([this.api.query.Stableswap.Pools.getEntries({at:"best"}),this.api.query.System.Number.getValue({at:"best"}),this.getPoolLimits()]),i=t.map(async({keyArgs:a,value:s})=>{let[r]=a,o=this.getPoolAddress(r),[l,c,u]=await Promise.all([this.getPoolTokens(r,s),this.api.query.Stableswap.PoolPegs.getValue(r,{at:"best"}),this.api.query.Tokens.TotalIssuance.getValue(r,{at:"best"})]),d=this.getPoolAmplification(s,e),m=c?this.getRecentPegs(c):this.getDefaultPegs(s);return l.push({id:r,tradeable:15,balance:u,decimals:18}),this.poolsData.set(r,s),{address:o,id:r,type:"Stableswap",fee:Ss.fromPermill(s.fee),tokens:l,totalIssuance:u,pegs:m,...n,...d}});return Promise.all(i)}async getPoolFees(t,e){return{fee:this.store.pools.find(i=>i.address===e).fee}}getDefaultPegs(t){return M.defaultPegs(t.assets.length)}getRecentPegs(t){let{current:e}=t;return Array.from(e.entries()).map(([n,i])=>i.map(a=>a.toString()))}subscribeIssuance(){let e=this.store.pools.map(n=>n.id).map(n=>this.api.query.Tokens.TotalIssuance.watchValue(n,"best").pipe(fs(i=>({id:n,value:i}))));return Ps(...e).pipe(De(()=>{this.log(this.getPoolType(),"unsub total issuance")})).subscribe(n=>{let{id:i,value:a}=n;this.store.update(s=>{let r=[];return s.filter(o=>o.id===i).forEach(o=>{let l=o.tokens.map(c=>c.id===i?{...c,balance:a}:c);r.push({...o,tokens:l,totalIssuance:a})}),r})})}subscribePoolPegs(){return this.api.query.Stableswap.PoolPegs.watchEntries({at:"best"}).pipe(ys((t,e)=>!e.deltas),De(()=>{this.log(this.getPoolType(),"unsub pool pegs")})).subscribe(({deltas:t})=>{this.store.update(e=>{let n=[],i=new Map(e.map(a=>[a.id,a]));return t?.upserted.forEach(({args:a,value:s})=>{let[r]=a,o=i.get(r);if(o){let l=this.getRecentPegs(s);n.push({...o,pegs:l})}}),n})})}subscribeBlock(){return this.api.query.System.Number.watchValue("best").pipe(De(()=>{this.log(this.getPoolType(),"unsub block change")})).subscribe(t=>{this.store.update(e=>{let n=[];return e.filter(i=>i.isRampPeriod).forEach(i=>{let a=this.poolsData.get(i.id);if(a){let s=this.getPoolAmplification(a,t);n.push({...i,...s})}}),n})})}subscribeUpdates(){let t=new bs;return t.add(this.subscribePoolPegs()),t.add(this.subscribeIssuance()),this.hasOnRamps()&&t.add(this.subscribeBlock()),t}hasOnRamps(){return this.store.pools.filter(t=>t.isRampPeriod).length>0}};var qe={};x(qe,{XykMath:()=>j,XykPool:()=>Ht,XykPoolClient:()=>Gt});import{calculate_in_given_out as Ts,calculate_out_given_in as vs,calculate_pool_trade_fee as xs,get_spot_price as ws,calculate_liquidity_in as Is,calculate_shares as As,calculate_spot_price as Os,calculate_spot_price_with_fee as Bs,calculate_liquidity_out_asset_a as _s,calculate_liquidity_out_asset_b as Rs}from"@galacticcouncil/math-xyk";var j=class{static getSpotPrice(t,e,n){return ws(t,e,n)}static calculateInGivenOut(t,e,n){return Ts(t,e,n)}static calculateOutGivenIn(t,e,n){return vs(t,e,n)}static calculatePoolTradeFee(t,e,n){return xs(t,e,n)}static calculateLiquidityIn(t,e,n){return Is(t,e,n)}static calculateSpotPrice(t,e){return Os(t,e)}static calculateSpotPriceWithFee(t,e,n,i){return Bs(t,e,n,i)}static calculateShares(t,e,n){return As(t,e,n)}static calculateLiquidityOutAssetA(t,e,n,i){return _s(t,e,n,i)}static calculateLiquidityOutAssetB(t,e,n,i){return Rs(t,e,n,i)}};var{FeeUtils:_n}=w,Ht=class p{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;static fromPool(t){return new p(t)}constructor(t){this.type="XYK",this.address=t.address,this.tokens=t.tokens,this.maxInRatio=t.maxInRatio,this.maxOutRatio=t.maxOutRatio,this.minTradingLimit=t.minTradingLimit}validatePair(t,e){return!0}parsePair(t,e){let n=new Map(this.tokens.map(s=>[s.id,s])),i=n.get(t),a=n.get(e);if(i==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:i.decimals,decimalsOut:a.decimals,balanceIn:i.balance,balanceOut:a.balance,assetInEd:i.existentialDeposit,assetOutEd:a.existentialDeposit}}validateAndBuy(t,e,n){let i=this.calculateInGivenOut(t,e),a=this.calculateTradeFee(i,n),s=_n.toPct(n.exchangeFee),r=i+a,o=[];(e<this.minTradingLimit||i<t.assetInEd)&&o.push("InsufficientTradingAmount");let l=t.balanceOut/this.maxOutRatio;e>l&&o.push("MaxOutRatioExceeded");let c=t.balanceIn/this.maxInRatio;return r>c&&o.push("MaxInRatioExceeded"),{amountIn:r,calculatedIn:i,amountOut:e,feePct:s,errors:o}}validateAndSell(t,e,n){let i=this.calculateOutGivenIn(t,e),a=this.calculateTradeFee(i,n),s=_n.toPct(n.exchangeFee),r=i-a,o=[];(e<this.minTradingLimit||i<t.assetOutEd)&&o.push("InsufficientTradingAmount");let l=t.balanceIn/this.maxInRatio;e>l&&o.push("MaxInRatioExceeded");let c=t.balanceOut/this.maxOutRatio;return r>c&&o.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:i,amountOut:r,feePct:s,errors:o}}calculateInGivenOut(t,e){let n=j.calculateInGivenOut(t.balanceIn.toString(),t.balanceOut.toString(),e.toString()),i=BigInt(n);return i<0n?0n:i}calculateOutGivenIn(t,e){let n=j.calculateOutGivenIn(t.balanceIn.toString(),t.balanceOut.toString(),e.toString()),i=BigInt(n);return i<0n?0n:i}spotPriceInGivenOut(t){let e=j.calculateSpotPrice(t.balanceOut.toString(),t.balanceIn.toString()),n=Math.pow(10,18-t.decimalsOut);return BigInt(e)/BigInt(n)}spotPriceOutGivenIn(t){let e=j.calculateSpotPrice(t.balanceIn.toString(),t.balanceOut.toString()),n=Math.pow(10,18-t.decimalsIn);return BigInt(e)/BigInt(n)}calculateTradeFee(t,e){let n=j.calculatePoolTradeFee(t.toString(),e.exchangeFee[0],e.exchangeFee[1]);return BigInt(n)}};import{CompatibilityLevel as Fs}from"polkadot-api";import{Subscription as Cs}from"rxjs";var Gt=class extends q{decimals=new Map([]);getPoolType(){return"XYK"}async withOverride(t){this.decimals=t?new Map(t.map(e=>[e.id,e.decimals])):new Map}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 isSupported(){let t=this.api.query.XYK.PoolAssets,e=await this.api.compatibilityToken;return t.isCompatible(Fs.BackwardsCompatible,e)}async loadPools(){let[t,e]=await Promise.all([this.api.query.XYK.PoolAssets.getEntries(),this.getPoolLimits()]),n=t.map(async({keyArgs:i,value:a})=>{let[s]=i,[r,o]=a,[l,c,u,d]=await Promise.all([this.getBalance(s,r),this.api.query.AssetRegistry.Assets.getValue(r),this.getBalance(s,o),this.api.query.AssetRegistry.Assets.getValue(o)]);return{address:s,type:"XYK",tokens:[{id:r,decimals:c?.decimals||this.decimals.get(r),existentialDeposit:c?.existential_deposit,balance:l.transferable,type:c?.asset_type.type},{id:o,decimals:d?.decimals||this.decimals.get(o),existentialDeposit:d?.existential_deposit,balance:u.transferable,type:d?.asset_type.type}],...e}});return Promise.all(n)}async getPoolFees(){return{exchangeFee:await this.getExchangeFee()}}async getExchangeFee(){return await this.api.constants.XYK.GetExchangeFee()}subscribeUpdates(){return Cs.EMPTY}};var He={};x(He,{AavePool:()=>Ut,AavePoolClient:()=>Vt});var Ut=class p{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;static fromPool(t){return new p(t)}constructor(t){this.type="Aave",this.address=t.address,this.tokens=t.tokens,this.maxInRatio=t.maxInRatio,this.maxOutRatio=t.maxOutRatio,this.minTradingLimit=t.minTradingLimit}validatePair(t,e){return!0}parsePair(t,e){let n=new Map(this.tokens.map(s=>[s.id,s])),i=n.get(t),a=n.get(e);if(i==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:i.balance,balanceOut:a.balance,decimalsIn:i.decimals,decimalsOut:a.decimals,assetInEd:0n,assetOutEd:0n}}validateAndBuy(t,e,n){let i=this.calculateInGivenOut(t,e),a=[];return e>t.balanceOut&&a.push("TradeNotAllowed"),{amountIn:i,calculatedIn:i,amountOut:e,feePct:0,errors:a}}validateAndSell(t,e,n){let i=this.calculateOutGivenIn(t,e),a=[];return i>t.balanceOut&&a.push("TradeNotAllowed"),{amountIn:e,calculatedOut:i,amountOut:i,feePct:0,errors:a}}calculateInGivenOut(t,e){return e}calculateOutGivenIn(t,e){return e}spotPriceInGivenOut(t){let e=Math.pow(10,t.decimalsOut);return BigInt(e)}spotPriceOutGivenIn(t){let e=Math.pow(10,t.decimalsIn);return BigInt(e)}calculateTradeFee(t,e){return 0n}};import{AccountId as Es}from"polkadot-api";import{toHex as ks}from"@polkadot-api/utils";import{Subscription as Fn,filter as Ne,finalize as Cn,map as En}from"rxjs";import{decodeEventLog as Ms}from"viem";var Rn=[{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"reserve",type:"address"},{indexed:!1,internalType:"address",name:"user",type:"address"},{indexed:!0,internalType:"address",name:"onBehalfOf",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"},{indexed:!0,internalType:"uint16",name:"referralCode",type:"uint16"}],name:"Supply",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"reserve",type:"address"},{indexed:!0,internalType:"address",name:"user",type:"address"},{indexed:!0,internalType:"address",name:"to",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"}],name:"Withdraw",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"reserve",type:"address"},{indexed:!1,internalType:"address",name:"user",type:"address"},{indexed:!0,internalType:"address",name:"onBehalfOf",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"},{indexed:!1,internalType:"enum DataTypes.InterestRateMode",name:"interestRateMode",type:"uint8"},{indexed:!1,internalType:"uint256",name:"borrowRate",type:"uint256"},{indexed:!0,internalType:"uint16",name:"referralCode",type:"uint16"}],name:"Borrow",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"reserve",type:"address"},{indexed:!0,internalType:"address",name:"user",type:"address"},{indexed:!0,internalType:"address",name:"repayer",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"},{indexed:!1,internalType:"bool",name:"useATokens",type:"bool"}],name:"Repay",type:"event"}];var{ERC20:Ds}=st,Ls=["Supply","Withdraw","Repay","Borrow"],Vt=class extends q{getPoolType(){return"Aave"}async isSupported(){return!0}getPoolId(t,e){let n=t+"/"+e,i=new TextEncoder().encode(n.padEnd(32,"\0")),a=ks(i);return Es(63).dec(a)}getPoolLimits(){return{maxInRatio:0n,maxOutRatio:0n,minTradingLimit:0n}}async loadPools(){let e=(await this.api.apis.AaveTradeExecutor.pools({at:"best"})).map(async({reserve:n,atoken:i,liqudity_in:a,liqudity_out:s})=>{let[r,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(i),this.api.query.AssetRegistry.AssetLocations.getValue(i)]);return{address:this.getPoolId(n,i),type:"Aave",tokens:[{id:n,decimals:r?.decimals,existentialDeposit:r?.existential_deposit,balance:a,location:o,type:r?.asset_type.type},{id:i,decimals:l?.decimals,existentialDeposit:l?.existential_deposit,balance:s,location:c,type:l?.asset_type.type}],...this.getPoolLimits()}});return Promise.all(e)}async getPoolDelta(t){let[e,n]=t.tokens,{liqudity_in:i,liqudity_out:a}=await this.api.apis.AaveTradeExecutor.pool(e.id,n.id,{at:"best"});return t.tokens.map(s=>{let r=s.id===e.id?i:a;return{...s,balance:r}})}async getPoolFees(){return{}}getReserveH160Id(t){if(t.type==="Erc20"&&t.location){let e=t.location.interior;if(e.type==="X1"&&e.value.type==="AccountKey20"){let{value:n}=e.value;return n.key.asHex()}throw new Error("Invalid aave reserve multilocation")}return Ds.fromAssetId(t.id)}parseRouterLog(t){let{asset_in:e,asset_out:n}=t;return{assetIn:e,assetOut:n,key:`${e}:${n}`}}parseEvmLog(t){let{topics:e,data:n}=t.log,i=e.map(s=>s.asHex()),a=n.asHex();try{let{eventName:s,args:r}=Ms({abi:Rn,topics:i,data:a}),o=r.reserve.toLowerCase();return{eventName:s,reserve:o,key:`${s}:${o}`}}catch{return}}subscribeRouterExecuted(){let e=this.store.pools.map(n=>n.tokens).map(([n,i])=>i).map(n=>n.id);return this.api.event.Router.Executed.watch().pipe(En(({payload:n})=>this.parseRouterLog(n)),Ne(({assetIn:n,assetOut:i})=>e.includes(n)||e.includes(i)),Cn(()=>{this.log(this.getPoolType(),"unsub router executed")})).subscribe(({assetIn:n,assetOut:i,key:a})=>{this.log(this.getPoolType(),"[router:Executed]",a),this.store.update(async s=>{let r=[];for(let o of s){let[l,c]=o.tokens;if(c.id===n||c.id===i){let d=await this.getPoolDelta(o);r.push({...o,tokens:d})}}return r})})}subscribeEvmLog(){return this.api.event.EVM.Log.watch().pipe(En(({payload:t})=>this.parseEvmLog(t)),Ne(t=>t!==void 0),Ne(({eventName:t})=>Ls.includes(t)),Cn(()=>{this.log(this.getPoolType(),"unsub evm log")})).subscribe(({reserve:t,key:e})=>{this.log(this.getPoolType(),"[evm:Log]",e),this.store.update(async n=>{let i=[];for(let a of n){let[s]=a.tokens;if(this.getReserveH160Id(s).toLowerCase()===t){let o=await this.getPoolDelta(a);i.push({...a,tokens:o})}}return i})})}subscribeBalances(){return Fn.EMPTY}subscribeUpdates(){let t=new Fn;return t.add(this.subscribeRouterExecuted()),t.add(this.subscribeEvmLog()),t}};var yt=class{static get(t){switch(t.type){case"Aave":return Ut.fromPool(t);case"XYK":return Ht.fromPool(t);case"Omnipool":return Lt.fromPool(t);case"LBP":return Mt.fromPool(t);case"Stableswap":return Z.fromPool(t);case"HSM":return Z.fromPool(t);default:throw new Error("Pool type "+t.type+" is not supported yet")}}};import{Subject as Zs,Subscription as ft,takeUntil as tr}from"rxjs";var We={};x(We,{HsmMath:()=>Y,HsmPool:()=>Ge,HsmPoolClient:()=>Kt});import{calculate_collateral_in_given_hollar_out as qs,calculate_collateral_out_given_hollar_in as Ns,calculate_hollar_in_given_collateral_out as Hs,calculate_hollar_out_given_collateral_in as Gs,calculate_imbalance as Us,calculate_max_price as Vs,calculate_buyback_limit as Ws,calculate_buyback_price_with_fee as Ys}from"@galacticcouncil/math-hsm";var Y=class{static calculateCollateralInGivenHollarOut(t,e,n){return qs(t,e,n)}static calculateCollateralOutGivenHollarIn(t,e,n){return Ns(t,e,n)}static calculateHollarOutGivenCollateralIn(t,e,n){return Gs(t,e,n)}static calculateHollarInGivenCollateralOut(t,e,n){return Hs(t,e,n)}static calculateImbalance(t,e,n){return Us(t,e,n)}static calculateBuybackLimit(t,e){return Ws(t,e)}static calculateBuybackPriceWithFee(t,e,n){return Ys(t,e,n)}static calculateMaxPrice(t,e){return Vs(t,e)}};var{FeeUtils:Wt}=w,Ge=class p extends Z{hsmAddress;hsmMintCapacity;hollarId;hollarH160;collateralId;collateralBalance;maxBuyPriceCoefficient;maxInHolding;purchaseFee;buyBackFee;buyBackRate;static fromPool(t){return new p(t)}constructor(t){super(t),this.type="HSM",this.hsmAddress=t.hsmAddress,this.hsmMintCapacity=t.hsmMintCapacity,this.hollarId=t.hollarId,this.hollarH160=t.hollarH160,this.collateralId=t.collateralId,this.collateralBalance=t.collateralBalance,this.maxBuyPriceCoefficient=t.maxBuyPriceCoefficient,this.maxInHolding=t.maxInHolding,this.purchaseFee=t.purchaseFee,this.buyBackFee=t.buyBackFee,this.buyBackRate=t.buyBackRate}validatePair(t,e){return!0}parsePair(t,e){return super.parsePair(t,e)}validateTradeHollarIn(t,e,n,i){let a=this.calculateBuybackLimit(t);e>a&&i.push("MaxBuyBackExceeded");let s=this.calculateBuyPrice(t,e,n),r=this.calculateMaxPrice(t);return s>r&&i.push("MaxBuyPriceExceeded"),n>this.collateralBalance&&i.push("InsufficientCollateral"),i}validateTradeHollarOut(t,e,n){return this.collateralBalance+t>this.maxInHolding&&n.push("MaxHoldingExceeded"),e>this.hsmMintCapacity&&n.push("FacilitatorCapacityExceeded"),n}validateTradeConstraints(t,e,n){let i=[];return t.assetIn===this.hollarId?this.validateTradeHollarIn(t,e,n,i):this.validateTradeHollarOut(e,n,i)}validateAndBuy(t,e){let n=this.calculateInGivenOut(t,e),i=this.validateTradeConstraints(t,n,e);return{amountIn:n,calculatedIn:n,amountOut:e,feePct:0,errors:i}}validateAndSell(t,e){let n=this.calculateOutGivenIn(t,e),i=this.validateTradeConstraints(t,e,n);return{amountIn:e,calculatedOut:n,amountOut:n,feePct:0,errors:i}}calculateHollarInGivenCollateralOut(t,e){let n=super.calculateInGivenOut(t,e,{fee:this.fee}),i=Y.calculateHollarInGivenCollateralOut(e.toString(),n.toString(),Wt.toRaw(this.buyBackFee).toString());return BigInt(i)}calculateCollateralInGivenHollarOut(t){let e=this.getCollateralPeg(),n=Y.calculateCollateralInGivenHollarOut(t.toString(),JSON.stringify(e),Wt.toRaw(this.purchaseFee).toString());return BigInt(n)}calculateInGivenOut(t,e){return t.assetOut==this.hollarId?this.calculateCollateralInGivenHollarOut(e):this.calculateHollarInGivenCollateralOut(t,e)}calculateCollateralOutGivenHollarIn(t,e){let n=super.calculateOutGivenIn(t,e,{fee:this.fee}),i=Y.calculateCollateralOutGivenHollarIn(e.toString(),n.toString(),Wt.toRaw(this.buyBackFee).toString());return BigInt(i)}calculateHollarOutGivenCollateralIn(t){let e=this.getCollateralPeg(),n=Y.calculateHollarOutGivenCollateralIn(t.toString(),JSON.stringify(e),Wt.toRaw(this.purchaseFee).toString());return BigInt(n)}calculateOutGivenIn(t,e){return t.assetIn==this.hollarId?this.calculateCollateralOutGivenHollarIn(t,e):this.calculateHollarOutGivenCollateralIn(e)}calculateImbalance(t){let e=this.getCollateralPeg(),n=Y.calculateImbalance(t.balanceIn.toString(),JSON.stringify(e),t.balanceOut.toString());return BigInt(n)}calculateBuybackLimit(t){let e=this.calculateImbalance(t),n=Y.calculateBuybackLimit(e.toString(),Wt.toRaw(this.buyBackRate).toString());return BigInt(n)}calculateBuyPrice(t,e,n){let i=n*10n**BigInt(t.decimalsIn);return e*10n**BigInt(t.decimalsOut)/i}calculateMaxPrice(t){let e=this.getCollateralPeg(),n=Y.calculateMaxPrice(JSON.stringify(e),this.maxBuyPriceCoefficient.toString()),[i,a]=JSON.parse(n),s=10n**BigInt(18-t.decimalsOut);return BigInt(i)*s/BigInt(a)}spotPriceInGivenOut(t){let e=P.toBigInt(1,t.decimalsOut);return this.calculateInGivenOut(t,e)}spotPriceOutGivenIn(t){let e=P.toBigInt(1,t.decimalsIn);return this.calculateOutGivenIn(t,e)}getCollateralPeg(){let t=this.tokens.findIndex(i=>i.id!==this.hollarId),e=this.pegs[t],n=this.tokens[t].decimals;return this.isDefaultPeg(e)?[P.toBigInt(1,18).toString(),P.toBigInt(1,n).toString()]:e}isDefaultPeg(t){let[e,n]=t;return Array.isArray(t)&&t.length===2&&e==="1"&&n==="1"}};import{AccountId as Xs,CompatibilityLevel as Ks}from"polkadot-api";import{toHex as zs}from"@polkadot-api/utils";import{Subscription as kn,combineLatest as js,filter as Mn,finalize as Dn,map as Ue,pairwise as $s}from"rxjs";import{decodeEventLog as Qs}from"viem";var Yt=[{inputs:[{internalType:"address",name:"facilitator",type:"address"}],name:"getFacilitator",outputs:[{type:"tuple",components:[{name:"addr",type:"address"},{name:"label",type:"bytes32"},{name:"bucketCapacity",type:"uint128"},{name:"bucketLevel",type:"uint128"}]}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"facilitator",type:"address"}],name:"getFacilitatorBucket",outputs:[{internalType:"uint256",name:"",type:"uint256"},{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[],name:"getFacilitatorsList",outputs:[{internalType:"address[]",name:"",type:"address[]"}],stateMutability:"view",type:"function"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"facilitatorAddress",type:"address"},{indexed:!0,internalType:"bytes32",name:"label",type:"bytes32"},{indexed:!1,internalType:"uint256",name:"bucketCapacity",type:"uint256"}],name:"FacilitatorAdded",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"facilitatorAddress",type:"address"},{indexed:!1,internalType:"uint256",name:"oldCapacity",type:"uint256"},{indexed:!1,internalType:"uint256",name:"newCapacity",type:"uint256"}],name:"FacilitatorBucketCapacityUpdated",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"facilitatorAddress",type:"address"},{indexed:!1,internalType:"uint256",name:"oldLevel",type:"uint256"},{indexed:!1,internalType:"uint256",name:"newLevel",type:"uint256"}],name:"FacilitatorBucketLevelUpdated",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"facilitatorAddress",type:"address"}],name:"FacilitatorRemoved",type:"event"}];var Xt=class{client;constructor(t){this.client=t.getWsProvider()}async getFacilitatorCapacity(t,e){let[n,i]=await this.client.readContract({abi:Yt,address:t,functionName:"getFacilitatorBucket",args:[e]});return n-i}};var{FeeUtils:Ve}=w,{H160:Ln}=lt,Js=["FacilitatorBucketCapacityUpdated","FacilitatorBucketLevelUpdated"],Kt=class extends q{ghoClient;stableClient;constructor(t,e,n){super(t,e),this.stableClient=n,this.ghoClient=new Xt(e)}getPoolType(){return"HSM"}getPoolId(t){return this.getPoolAddress("hsm:"+t)}getFacilitatorAddress(){return this.getPoolAddress("modlpy/hsmod")}getHollarAddress(t){if(t){let e=t.interior;if(e.type==="X1"&&e.value.type==="AccountKey20"){let{value:n}=e.value;return n.key.asHex()}}throw Error("Invalid hollar multilocation")}getPoolAddress(t){let e=t.padEnd(32,"\0"),n=new TextEncoder().encode(e),i=zs(n);return Xs(63).dec(i)}async isSupported(){let t=this.api.query.HSM.Collaterals,e=await this.api.compatibilityToken;return t.isCompatible(Ks.BackwardsCompatible,e)}async loadPools(){let t=await this.api.constants.HSM.HollarId(),[e,n,i]=await Promise.all([this.api.query.AssetRegistry.AssetLocations.getValue(t),this.api.query.HSM.Collaterals.getEntries({at:"best"}),this.stableClient.getPools()]);if(n.length===0)return[];let a=this.getFacilitatorAddress(),s=Ln.fromAny(a),r=this.getHollarAddress(e),o=await this.ghoClient.getFacilitatorCapacity(r,s),l=n.map(async({keyArgs:u,value:d})=>{let[m]=u,{pool_id:g,max_buy_price_coefficient:b,max_in_holding:h,purchase_fee:f,buy_back_fee:y,buyback_rate:S}=d,T=i.find(v=>v.id===g);if(T){let v=this.getPoolId(g),F=await this.getBalance(a,m);return{...T,address:v,type:"HSM",tokens:T.tokens.filter(A=>A.id!==g),hsmAddress:a,hsmMintCapacity:o,hollarId:t,hollarH160:r,collateralId:m,collateralBalance:F.transferable,maxBuyPriceCoefficient:b,maxInHolding:h,purchaseFee:Ve.fromPermill(f),buyBackFee:Ve.fromPermill(y),buyBackRate:Ve.fromPerbill(S)}}});return(await Promise.all(l)).filter(u=>u!==null)}async getPoolFees(){return{}}parseEvmLog(t){let{topics:e,data:n}=t.log,i=e.map(s=>s.asHex()),a=n.asHex();try{let{eventName:s,args:r}=Qs({abi:Yt,topics:i,data:a}),o=r.facilitatorAddress.toLowerCase();return{eventName:s,facilitator:o,key:`${s}:${o}`}}catch{return}}subscribeEvmLog(){return this.api.event.EVM.Log.watch().pipe(Ue(({payload:t})=>this.parseEvmLog(t)),Mn(t=>t!==void 0),Mn(({eventName:t})=>Js.includes(t)),Dn(()=>{this.log(this.getPoolType(),"unsub evm log")})).subscribe(({facilitator:t,key:e})=>{this.log(this.getPoolType(),"[evm:Log]",e),this.store.update(async n=>{let i=[],[{hsmAddress:a,hollarH160:s}]=n,r=Ln.fromAny(a);if(r.toLowerCase()===t){let l=await this.ghoClient.getFacilitatorCapacity(s,r);for(let c of n)i.push({...c,hsmMintCapacity:l})}return i})})}subscribeBalances(){let t=[],e=[];this.store.pools.forEach(a=>{let{tokens:s,collateralId:r}=a;s.find(l=>l.id===r).type==="Erc20"?e.push(r):t.push(r)});let[{hsmAddress:n}]=this.store.pools,i=[];if(t.length>0){let a=this.subscribeTokensBalance(n);i.push(a)}if(e.length>0){let a=this.subscribeErc20Balance(n,e);i.push(a)}return i.length>0?js(i).pipe(Ue(a=>a.flat()),$s(),Ue(([a,s])=>this.getDeltas(a,s)),Dn(()=>{this.log(this.getPoolType(),"unsub collateral balance")})).subscribe(a=>{this.store.update(s=>{let r=[],o=new Map(s.map(l=>[l.collateralId,l]));return a.forEach(({id:l,balance:c})=>{let u=o.get(l);u&&(this.log(this.getPoolType(),"[collateral:Balance]",l,c.transferable),r.push({...u,collateralBalance:c.transferable}))}),r})}):kn.EMPTY}subscribeUpdates(){let t=new kn;return t.add(this.subscribeEvmLog()),t}};var Pt=class extends E{evm;aave;omnipool;stableswap;hsm;xyk;lbp;active=new Set([]);pools=new Map([]);clients=[];aaveSub=ft.EMPTY;omniSub=ft.EMPTY;stableSub=ft.EMPTY;hsmSub=ft.EMPTY;xykSub=ft.EMPTY;lbpSub=ft.EMPTY;isReady=!1;isDestroyed=new Zs;constructor(t,e){super(t),this.evm=e,this.aave=new Vt(t,e),this.omnipool=new qt(t,e),this.stableswap=new Nt(t,e),this.hsm=new Kt(t,e,this.stableswap),this.xyk=new Gt(t,e),this.lbp=new Dt(t,e),this.clients=[this.aave,this.omnipool,this.stableswap,this.hsm,this.xyk,this.lbp]}subscribe(t){return t.getSubscriber().pipe(tr(this.isDestroyed)).subscribe(e=>{e.forEach(n=>{this.pools.set(n.address,n)})})}withAave(){return this.aaveSub.unsubscribe(),this.aaveSub=this.subscribe(this.aave),this.active.add("Aave"),this}withOmnipool(){return this.omniSub.unsubscribe(),this.omniSub=this.subscribe(this.omnipool),this.active.add("Omnipool"),this}withStableswap(){return this.stableSub.unsubscribe(),this.stableSub=this.subscribe(this.stableswap),this.active.add("Stableswap"),this}withHsm(){return this.hsmSub.unsubscribe(),this.hsmSub=this.subscribe(this.hsm),this.active.add("HSM"),this}withXyk(t){return this.xyk.withOverride(t),this.xykSub.unsubscribe(),this.xykSub=this.subscribe(this.xyk),this.active.add("XYK"),this}withLbp(){return this.lbpSub.unsubscribe(),this.lbpSub=this.subscribe(this.lbp),this.active.add("LBP"),this}destroy(){this.isDestroyed.next(!0),this.isDestroyed.complete(),this.active.clear(),this.pools.clear(),this.isReady=!1}async getPools(){if(this.isReady){let e=this.pools.values();return Array.from(e)}let t=await Promise.all(this.clients.filter(e=>this.active.has(e.getPoolType())).map(e=>e.getPools()));return this.isReady=!0,t.flat()}async getPoolFees(t,e){let n=this.clients.find(i=>i.getPoolType()===e.type);if(n)return n.getPoolFees(t,e.address);throw new _t(e.type)}};var Vn={};x(Vn,{DEFAULT_BLOCK_TIME:()=>Hn,DEFAULT_MIN_BUDGET:()=>Ke,ORDER_MIN_BLOCK_PERIOD:()=>Gn,Router:()=>St,TWAP_BLOCK_PERIOD:()=>Qt,TWAP_MAX_DURATION:()=>je,TWAP_MAX_PRICE_IMPACT:()=>ze,TWAP_TX_MULTIPLIER:()=>ed,TradeOrderError:()=>Xe,TradeOrderType:()=>de,TradeRouteBuilder:()=>H,TradeRouter:()=>Tt,TradeScheduler:()=>vt,TradeType:()=>me});var zt=class{constructor(t=1/0){this.capacity=t}storage=[];enqueue(t){if(this.size()===this.capacity)throw Error("Queue has reached max capacity, you cannot add more items");this.storage.push(t)}dequeue(){return this.storage.shift()}size(){return this.storage.length}};var er=10,jt=class{isNotVisited(t,e){let n=!0;return e.forEach(i=>{(i[0]===t[0]||i[1]===t[1])&&(n=!1)}),n}findPaths(t,e,n){let i=[],a=new zt,s=[];for(s.push([e,""]),a.enqueue(s);a.size()>0;){let r=a.dequeue();if(!r||r.length>er)continue;let o=r[r.length-1];(n===null||o[0]===n)&&i.push(r),t.get(o[0])?.forEach(c=>{if(this.isNotVisited(c,r)){let u=[...r];u.push(c),a.enqueue(u)}})}return i}findShortestPaths(t,e,n){let i=[],a=new zt,s=[];s.push([e,""]),a.enqueue(s);let r=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<r?(r=o.length,i.length=0,i.push(o)):o.length===r&&i.push(o);continue}let c=t.get(l[0]);for(let u of c??[])this.isNotVisited(u,o)&&a.enqueue([...o,u])}return i}buildAndPopulateGraph(t,e){let n=new Map;for(let i of t)n.set(parseInt(i),[]);for(let[i,a,s]of e)n.get(a)?.push([s,i]);return n}};function Ye(p){let t={};for(let e of p){let n=e.tokens.length;for(let i=0;i<n;i++){t[e.tokens[i].id]||(t[e.tokens[i].id]=[]);for(let a=0;a<n;a++){if(i==a)continue;let s=[e.address,e.tokens[i].id,e.tokens[a].id];t[e.tokens[i].id].push(s)}}}return t}var $t=class{getProposals(t,e,n){let i=n.filter(h=>h.type==="XYK"),a=n.filter(h=>h.type!=="XYK"),s=new Set(a.map(h=>h.tokens).flat().map(h=>h.id)),r=s.has(t),o=s.has(e),l=new jt,c=h=>{let f=Ye(h),y=Object.keys(f),S=y.flatMap(T=>f[T]);return l.buildAndPopulateGraph(y,S)};if(!r&&!o){let h=i.filter(S=>S.tokens.find(T=>T.id===t)||S.tokens.find(T=>T.id===e)),f=c(h),y=l.findPaths(f,t,e);return this.parsePaths(y)}if(r&&o){let h=c(a),f=l.findPaths(h,t,e);return this.parsePaths(f)}let u=r?e:t,d=i.filter(h=>h.tokens.some(f=>f.id===u));if(d.length===0)return[];let m=[...a,...d],g=c(m),b=l.findPaths(g,t,e);return this.parsePaths(b)}parsePaths(t){let e=[];for(let n of t){let i=[];for(let a=0;a<n.length;a++){let s=n[a],r=n[a+1];if(r==null)break;i.push(this.toEdge(s,r))}e.push(i)}return e}toEdge(t,e){return[e[1],t[0],e[0]]}};var St=class{routeSuggester;routeProposals;ctx;filter={};constructor(t){this.ctx=t,this.routeSuggester=new $t,this.routeProposals=new Map}async withFilter(t){this.filter=t||{},this.routeProposals.clear(),this.onFilterChanged()}onFilterChanged(){}buildRouteKey(t,e,n){return`${t}->${e}::${n.length}`}applyPoolFilter(t){let{useOnly:e=[],exclude:n=[]}=this.filter,i=new Set(e),a=new Set(n);return t.filter(s=>a.has(s.type)?!1:i.size>0?i.has(s.type):!0)}async getPools(){let t=await this.ctx.getPools();return this.applyPoolFilter(t)}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(i=>i!==t).map(i=>this.getRoutes(i,t)))).filter(i=>i.length>0).map(([i])=>i[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 i=this.getAssets(n);if(!i.has(t))throw new Error(t+" is not supported asset");if(!i.has(e))throw new Error(e+" is not supported asset");return this.toPoolsMap(n)}getAssets(t){let e=t.map(n=>n.tokens.map(i=>i.id)).flat().sort((n,i)=>n>i?1:-1);return new Set(e)}getPaths(t,e,n){let i=this.toPoolsMap(n);return this.getProposals(t,e,n).filter(s=>this.validPath(s,i)).map(s=>this.toHops(s,i))}getProposals(t,e,n){let i=this.buildRouteKey(t,e,n);if(this.routeProposals.has(i))return this.routeProposals.get(i);let a=this.routeSuggester.getProposals(t,e,n);return this.routeProposals.set(i,a),a}validPath(t,e){return t.length>0&&t.map(n=>this.validEdge(n,e)).reduce((n,i)=>n&&i)}validEdge([t,e,n],i){return i.get(t)?.validatePair(e,n)||!1}toPoolsMap(t){return new Map(t.map(e=>[e.address,yt.get(e)]))}toHops(t,e){return t.map(([n,i,a])=>{let s=e.get(n);return{poolAddress:n,poolId:s?.id,pool:s?.type,assetIn:i,assetOut:a}})}};var me=(e=>(e.Buy="Buy",e.Sell="Sell",e))(me||{}),de=(n=>(n.Dca="Dca",n.TwapSell="TwapSell",n.TwapBuy="TwapBuy",n))(de||{}),Xe=(n=>(n.OrderTooSmall="OrderTooSmall",n.OrderTooBig="OrderTooBig",n.OrderImpactTooBig="OrderImpactTooBig",n))(Xe||{});var{FeeUtils:Nn}=w,Tt=class extends St{mlr;constructor(t){super(t),this.mlr=new Map}onFilterChanged(){this.mlr.clear()}buildCtxSync(t,e,n){let i=super.validateInput(t,e,n),a=super.getPaths(t,e,n);if(!a.length)throw new Rt(t,e);return{paths:a,pools:n,poolsMap:i}}async withCtx(t,e,n){let i=await super.getPools(),a=this.buildCtxSync(t,e,i);return n(a)}isDirectTrade(t){return t.length==1}findBestSellRoute(t){let e=t.sort((n,i)=>{let a=n[n.length-1].amountOut,s=i[i.length-1].amountOut;return a>s?-1:1});return e.find(n=>n.every(i=>i.errors.length==0))||e[0]}getRouteFeeRange(t){if(t.filter(n=>n.tradeFeeRange).length>0){let n=t.map(a=>a.tradeFeeRange?.[0]??a.tradeFeePct).reduce((a,s)=>a+s),i=t.map(a=>a.tradeFeeRange?.[1]??a.tradeFeePct).reduce((a,s)=>a+s);return[n,i]}}getPoolFeeRange(t){let e=t.min?Nn.toPct(t.min):void 0,n=t.max?Nn.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(r=>r.assetOutDecimals).reduce((r,o)=>r+o),i=t.map(r=>r.spotPrice).reduce((r,o)=>r*o),a=n-e.assetOutDecimals,s=Math.pow(10,a);return i/BigInt(s)}async getSell(t,e,n,i){return this.withCtx(t,e,async({paths:a,poolsMap:s})=>{let r;if(i)r=await this.toSellSwaps(n,i,s);else{let o=a.map(c=>this.toSellSwaps(n,c,s)),l=await Promise.all(o);r=this.findBestSellRoute(l)}return this.buildSell(s,r)})}async getSells(t,e,n){return this.withCtx(t,e,async({paths:i,poolsMap:a})=>{let s=i.map(o=>this.toSellSwaps(n,o,a));return(await Promise.all(s)).filter(o=>o.every(l=>l.errors.length==0)).map(o=>this.buildSell(a,o)).sort((o,l)=>o.amountOut>l.amountOut?-1:1)})}buildSell(t,e){let n=e[0],i=e[e.length-1],a=this.isDirectTrade(e),s=this.getSellSpot(e),r=i.amountOut,o=a?i.calculatedOut:this.calculateDelta0Y(n.amountIn,e,t),l=o-r,c=this.getRouteFeeRange(e),u=a?i.tradeFeePct:O.calculateSellFee(o,r),d=Math.pow(10,n.assetInDecimals),m=n.amountIn*s/BigInt(d),g=O.calculateDiffToRef(o,m);return{type:"Sell",amountIn:n.amountIn,amountOut:i.amountOut,spotPrice:s,tradeFee:l,tradeFeePct:u,tradeFeeRange:c,priceImpactPct:g,swaps:e,toHuman(){return{type:"Sell",amountIn:P.toDecimal(n.amountIn,n.assetInDecimals),amountOut:P.toDecimal(i.amountOut,i.assetOutDecimals),spotPrice:P.toDecimal(s,i.assetOutDecimals),tradeFee:P.toDecimal(l,i.assetOutDecimals),tradeFeePct:u,tradeFeeRange:c,priceImpactPct:g,swaps:e.map(b=>b.toHuman())}}}}calculateDelta0Y(t,e,n){let i=[];for(let a=0;a<e.length;a++){let s=e[a],r=n.get(s.poolAddress);if(r==null)throw new Error("Pool does not exit");let o=r.parsePair(s.assetIn,s.assetOut),l;a>0?l=i[a-1]:l=t;let c=r.calculateOutGivenIn(o,l);i.push(c)}return i[i.length-1]}async calculateMostLiquidRoute(t,e,n){let{paths:i,pools:a,poolsMap:s}=n,l=a.filter(b=>b.tokens.some(h=>h.id===t)).map(b=>b.type==="Aave"?b.tokens:b.tokens.filter(h=>h.id===t)).map(b=>b.map(h=>h.balance).reduce((h,f)=>h+f)).sort((b,h)=>h<b?-1:1)[0],c=O.getFraction(l,.1),u=await Promise.all(i.map(b=>this.toSellSwaps(c,b,s))),m=this.findBestSellRoute(u).map(b=>({poolAddress:b.poolAddress,poolId:b?.poolId,pool:b.pool,assetIn:b.assetIn,assetOut:b.assetOut})),g=this.buildRouteKey(t,e,a);return this.mlr.set(g,m),m}async toSellSwaps(t,e,n){let i=[];for(let a=0;a<e.length;a++){let s=e[a],r=n.get(s.poolAddress);if(r==null)throw new Error("Pool does not exit");let o=r.parsePair(s.assetIn,s.assetOut),l;a>0?l=i[a-1].amountOut:l=typeof t=="string"?P.toBigInt(t,o.decimalsIn):t;let c=await this.ctx.getPoolFees(o,r),{amountOut:u,calculatedOut:d,feePct:m,errors:g}=r.validateAndSell(o,l,c),b=this.getPoolFeeRange(c),h=r.spotPriceOutGivenIn(o),f=Math.pow(10,o.decimalsIn),y=l*h/BigInt(f),S=O.calculateDiffToRef(d,y);i.push({...s,assetInDecimals:o.decimalsIn,assetOutDecimals:o.decimalsOut,amountIn:l,amountOut:u,calculatedOut:d,spotPrice:h,tradeFeePct:m,tradeFeeRange:b,priceImpactPct:S,errors:g,isSupply(){return r.type==="Aave"&&r.tokens[0].id===s.assetIn},isWithdraw(){return r.type==="Aave"&&r.tokens[1].id===s.assetIn},toHuman(){return{...s,amountIn:P.toDecimal(l,o.decimalsIn),amountOut:P.toDecimal(u,o.decimalsOut),calculatedOut:P.toDecimal(d,o.decimalsOut),spotPrice:P.toDecimal(h,o.decimalsOut),tradeFeePct:m,tradeFeeRange:b,priceImpactPct:S,errors:g}}})}return i}async getMostLiquidRoute(t,e){return this.withCtx(t,e,async n=>{let i=this.buildRouteKey(t,e,n.pools),a=this.mlr.get(i);return a||this.calculateMostLiquidRoute(t,e,n)})}async getSpotPrice(t,e){return this.withCtx(t,e,async n=>{let{pools:i,poolsMap:a}=n,s=this.buildRouteKey(t,e,i),r=this.mlr.get(s);r||(r=await this.calculateMostLiquidRoute(t,e,n));let o=await this.toSellSwaps("1",r,a),l=this.getSellSpot(o),c=o[o.length-1].assetOutDecimals;return{amount:l,decimals:c}}).catch(()=>{})}findBestBuyRoute(t){let e=t.sort((n,i)=>{let a=n[0].amountIn,s=i[0].amountIn;return a>s?1:-1});return e.find(n=>n.every(i=>i.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(r=>r.assetInDecimals).reduce((r,o)=>r+o),i=t.map(r=>r.spotPrice).reduce((r,o)=>r*o),a=n-e.assetInDecimals,s=Math.pow(10,a);return i/BigInt(s)}async getBuy(t,e,n,i){return this.withCtx(t,e,async({paths:a,poolsMap:s})=>{let r;if(i)r=await this.toBuySwaps(n,i,s);else{let o=a.map(c=>this.toBuySwaps(n,c,s)),l=await Promise.all(o);r=this.findBestBuyRoute(l)}return this.buildBuy(s,r)})}async getBuys(t,e,n){return this.withCtx(t,e,async({paths:i,poolsMap:a})=>{let s=i.map(o=>this.toBuySwaps(n,o,a));return(await Promise.all(s)).filter(o=>o.every(l=>l.errors.length==0)).map(o=>this.buildBuy(a,o)).sort((o,l)=>o.amountIn>l.amountIn?1:-1)})}buildBuy(t,e){let n=e[e.length-1],i=e[0],a=this.isDirectTrade(e),s=this.getBuySpot(e),r=i.amountIn,o=a?i.calculatedIn:this.calculateDelta0X(n.amountOut,e,t),l=r-o,c=this.getRouteFeeRange(e),u=a?i.tradeFeePct:O.calculateBuyFee(o,r),d=Math.pow(10,n.assetOutDecimals),m=n.amountOut*s/BigInt(d),g;return o===0n?g=-100:g=O.calculateDiffToRef(m,o),{type:"Buy",amountOut:n.amountOut,amountIn:i.amountIn,spotPrice:s,tradeFee:l,tradeFeePct:u,tradeFeeRange:c,priceImpactPct:g,swaps:e,toHuman(){return{type:"Buy",amountOut:P.toDecimal(n.amountOut,n.assetOutDecimals),amountIn:P.toDecimal(i.amountIn,i.assetInDecimals),spotPrice:P.toDecimal(s,i.assetInDecimals),tradeFee:P.toDecimal(l,i.assetInDecimals),tradeFeePct:u,tradeFeeRange:c,priceImpactPct:g,swaps:e.map(b=>b.toHuman())}}}}calculateDelta0X(t,e,n){let i=[];for(let a=e.length-1;a>=0;a--){let s=e[a],r=n.get(s.poolAddress);if(r==null)throw new Error("Pool does not exit");let o=r.parsePair(s.assetIn,s.assetOut),l;a==e.length-1?l=t:l=i[0];let c=r.calculateInGivenOut(o,l);i.unshift(c)}return i[0]}async toBuySwaps(t,e,n){let i=[];for(let a=e.length-1;a>=0;a--){let s=e[a],r=n.get(s.poolAddress);if(r==null)throw new Error("Pool does not exit");let o=r.parsePair(s.assetIn,s.assetOut),l;a==e.length-1?l=typeof t=="string"?P.toBigInt(t,o.decimalsOut):t:l=i[0].amountIn;let c=await this.ctx.getPoolFees(o,r),{amountIn:u,calculatedIn:d,feePct:m,errors:g}=r.validateAndBuy(o,l,c),b=this.getPoolFeeRange(c),h=r.spotPriceInGivenOut(o),f=Math.pow(10,o.decimalsOut),y=l*h/BigInt(f),S;d===0n?S=-100:S=O.calculateDiffToRef(y,d),i.unshift({...s,assetInDecimals:o.decimalsIn,assetOutDecimals:o.decimalsOut,amountOut:l,amountIn:u,calculatedIn:d,spotPrice:h,tradeFeePct:m,tradeFeeRange:b,priceImpactPct:S,errors:g,isSupply(){return r.type==="Aave"&&r.tokens[0].id===s.assetIn},isWithdraw(){return r.type==="Aave"&&r.tokens[1].id===s.assetIn},toHuman(){return{...s,amountOut:P.toDecimal(l,o.decimalsOut),amountIn:P.toDecimal(u,o.decimalsIn),calculatedIn:P.toDecimal(d,o.decimalsIn),spotPrice:P.toDecimal(h,o.decimalsIn),tradeFeePct:m,tradeFeeRange:b,priceImpactPct:S,errors:g}}})}return i}};var Hn=6e3,Ke=1000000000000000n,Qt=6,ze=-5,je=216e5,ed=3,Gn=6;import{Enum as Un}from"polkadot-api";var H=class{static build(t){return t.map(({assetIn:e,assetOut:n,pool:i,poolId:a})=>i==="Stableswap"?{pool:Un("Stableswap",a),asset_in:e,asset_out:n}:{pool:Un(i),asset_in:e,asset_out:n})}};var vt=class{schedulerOptions;router;constructor(t,e={}){this.router=t,this.schedulerOptions=Object.freeze({blockTime:e.blockTime??6e3,minBudgetInNative:e.minBudgetInNative??Ke})}get blockTime(){return this.schedulerOptions.blockTime}get minOrderBudget(){return this.schedulerOptions.minBudgetInNative}async getDcaOrder(t,e,n,i,a){let[s,r]=await Promise.all([this.getMinimumOrderBudget(t),this.router.getBestSell(t,e,n)]),{amountIn:o,swaps:l,priceImpactPct:c}=r,u=l[0],d=l[l.length-1],{assetInDecimals:m}=u,{assetOutDecimals:g}=d,b=Math.abs(c),h=this.getMinimumTradeCount(o,s),f=this.getOptimalTradeCount(b),y=a?Math.round(i/a):f,S=Math.ceil(i/h),T=Math.round(i/f),v=Math.round(i/y),F=o/BigInt(y),A=await this.router.getBestSell(t,e,F),D=o<s,U=[];D&&U.push("OrderTooSmall");let X=A.amountOut*BigInt(y),N=this.toBlockPeriod(v),V=A.tradeFee*BigInt(y),tt=H.build(l),et={assetIn:t,assetOut:e,errors:U,frequencyMin:S,frequencyOpt:T,frequency:v,tradeCount:y,tradeFee:V,tradeImpactPct:A.priceImpactPct,tradePeriod:N,tradeRoute:tt,type:"Dca"};return{...et,amountIn:o,amountOut:X,tradeAmountIn:A.amountIn,tradeAmountOut:A.amountOut,toHuman(){return{...et,amountIn:P.toDecimal(o,m),amountOut:P.toDecimal(X,g),tradeAmountIn:P.toDecimal(A.amountIn,m),tradeAmountOut:P.toDecimal(A.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 i=t+n/2n;return Number(i/n)}getOptimalTradeCount(t){let e=Math.round(t*10)||1;return Math.max(e,3)}async getTwapSellOrder(t,e,n){let[i,a]=await Promise.all([this.getMinimumOrderBudget(t),this.router.getBestSell(t,e,n)]),{amountIn:s,swaps:r,priceImpactPct:o}=a,l=r[0],c=r[r.length-1],{assetInDecimals:u}=l,{assetOutDecimals:d}=c,m=Math.abs(o),g=this.getTwapTradeCount(m),b=s/BigInt(g),h=await this.router.getBestSell(l.assetIn,c.assetOut,b),f=g===1,y=s<i,S=h.priceImpactPct<-5,T=[];y||f?T.push("OrderTooSmall"):S&&T.push("OrderImpactTooBig");let v=h.amountOut*BigInt(g),F=h.tradeFee*BigInt(g),A=H.build(r),D={assetIn:t,assetOut:e,errors:T,tradeCount:g,tradeImpactPct:h.priceImpactPct,tradePeriod:6,tradeRoute:A,type:"TwapSell"};return{...D,amountIn:s,amountOut:v,tradeAmountIn:h.amountIn,tradeAmountOut:h.amountOut,tradeFee:F,toHuman(){return{...D,amountIn:P.toDecimal(s,u),amountOut:P.toDecimal(v,d),tradeAmountIn:P.toDecimal(h.amountIn,u),tradeAmountOut:P.toDecimal(h.amountOut,d),tradeFee:P.toDecimal(F,d)}}}}async getTwapBuyOrder(t,e,n){let[i,a]=await Promise.all([this.getMinimumOrderBudget(t),this.router.getBestBuy(t,e,n)]),{amountOut:s,swaps:r,priceImpactPct:o}=a,l=r[0],c=r[r.length-1],{assetInDecimals:u}=l,{assetOutDecimals:d}=c,m=Math.abs(o),g=this.getTwapTradeCount(m),b=s/BigInt(g),h=await this.router.getBestBuy(l.assetIn,c.assetOut,b),f=h.amountIn*BigInt(g),y=g===1,S=f<i,T=h.priceImpactPct<-5,v=[];S||y?v.push("OrderTooSmall"):T&&v.push("OrderImpactTooBig");let F=h.tradeFee*BigInt(g),A=H.build(r),D={assetIn:t,assetOut:e,errors:v,tradeCount:g,tradeImpactPct:h.priceImpactPct,tradePeriod:6,tradeRoute:A,type:"TwapBuy"};return{...D,amountIn:f,amountOut:s,tradeAmountIn:h.amountIn,tradeAmountOut:h.amountOut,tradeFee:F,toHuman(){return{...D,amountIn:P.toDecimal(f,u),amountOut:P.toDecimal(s,d),tradeAmountIn:P.toDecimal(h.amountIn,u),tradeAmountOut:P.toDecimal(h.amountOut,d),tradeFee:P.toDecimal(F,u)}}}}getTwapTradeCount(t){let e=this.getOptimalTradeCount(t);if(this.getTwapExecutionTime(e)>216e5){let i=216e5/(this.blockTime*6);return Math.round(i)}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 $n={};x($n,{BIG_10:()=>jn,BIG_BILL:()=>$e,StakingApi:()=>Jt,StakingClient:()=>Zt});import{calculate_accumulated_rps as ar,calculate_percentage_amount as sr,calculate_period_number as Xn,calculate_points as Kn,calculate_rewards as rr,sigmoid as zn}from"@galacticcouncil/math-staking";import G from"big.js";var ge={none:.1,locked1x:1,locked2x:2,locked3x:3,locked4x:4,locked5x:5,locked6x:6},Wn=p=>Object.keys(ge).includes(p);import{AccountId as nr}from"polkadot-api";import{toHex as ir}from"@polkadot-api/utils";function Yn(p){let t=("modl"+p).padEnd(32,"\0"),e=new TextEncoder().encode(t),n=ir(e);return nr(63).dec(n)}var he="20000000000000000",be="2000",jn=G(10),$e=G(jn.pow(12)),Jt=class{client;balanceClient;constructor(t,e){this.client=t,this.balanceClient=e}async getPotBalance(){let t=await this.client.getPalletId(),e=Yn(t);return await this.balanceClient.getBalance(e,0)}async getStakingPosition(t){let[e,n]=await Promise.all([this.client.getStakingPositionsValue(t),this.client.getStakingVotes(t)]);if(!e)return;let i=e.created_at,a=await n.reduce(async(s,[r,o])=>{let l=await s,c=r,u=o.amount,d=o.conviction.toString().toLowerCase(),m=await this.client.getReferendumInfo(c);return m&&(m.type==="Approved"||m.type==="Rejected")&&Wn(d)&&l.push({id:c,amount:u,conviction:d}),l},Promise.resolve([]));return{stake:e.stake,rewardPerStake:e.reward_per_stake,createdAt:i,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,i]=await Promise.all([this.client.getStaking(),this.client.getUniques(t,e)]),a=i.find(s=>s)?.itemId;return{totalStake:n?.total_stake,accumulatedRewardPerStake:n?.accumulated_reward_per_stake,potReservedBalance:n?.pot_reserved_balance,positionId:a,stakePosition:a?await this.getStakingPosition(a):void 0}}getCurrentActionPoints(t,e,n,i){let a=G(0),s=G(0),r=ge.locked6x,o=G(n.toString()).mul(r),l=100,c=[];t.forEach(m=>{let g=ge[m.conviction],b=i.includes(m.id.toString());b&&c.push(m.id.toString());let h=G(m.amount.toString()).mul(l).div(o);a=a.plus(Math.floor(h.mul(g).toNumber())),s=s.plus(Math.floor(h.mul(b?r:g).toNumber()))});let u=Math.floor(G(n.toString()).mul(r).mul(l).div(o).toNumber());i.forEach(m=>{c.includes(m)||(s=s.plus(u))});let d={democracyVote:1};return a=a.mul(d.democracyVote),a=a.plus(e.toString()||"0"),s=s.mul(d.democracyVote),s=s.plus(e.toString()||"0"),{currentActionPoints:a.toString(),maxActionPoints:s.toString()}}async getRewards(t,e,n){let i=await this.getStake(t),{potReservedBalance:a,accumulatedRewardPerStake:s,totalStake:r,stakePosition:o}=i;if(!o)return;let[l,c,u,d,m,g,b]=await Promise.all([this.getPotBalance(),this.client.getPeriodLength(),this.client.getUnclaimablePeriods(),this.client.getTimePointsPerPeriod(),this.client.getTimePointsWeight(),this.client.getActionPointsWeight(),this.client.getSixBlockSince()]),h=G(l.transferable.toString()).minus(a.toString()),f=h.gt(0)&&r>0?ar(s.toString(),h.toString(),r.toString()):s.toString(),y=Xn(c.toString(),n,b),S=Xn(c.toString(),o.createdAt.toString(),b),T=rr(f,o.rewardPerStake.toString(),o.stake.toString()),v=this.getCurrentActionPoints(o.votes,o.actionPoints,o.stake,e),F=Kn(S,y,d.toString(),m.toString(),v.currentActionPoints,g.toString(),o.accumulatedSlashPoints.toString()),A=zn(F,he,be),D=(()=>{if(!e.length)return;let tt=Kn(S,y,d.toString(),m.toString(),v.maxActionPoints.toString(),g.toString(),o.accumulatedSlashPoints.toString());return zn(tt,he,be)})(),U=G(T).plus(o.accumulatedUnpaidRewards.toString()).plus(o.accumulatedLockedRewards.toString());if(G(y).minus(S).lte(u.toString()))return{rewards:"0",payablePercentage:A,extraPayablePercentage:D,constants:{a:he,b:be}};let X=sr(U.toString(),A),N=G(o.accumulatedLockedRewards.toString()),V=N.gt(X)?N:G(X);return{rewards:V.div($e).toString(),maxRewards:U.div($e).toString(),allocatedRewardsPercentage:V.div(U).mul(100).toNumber(),payablePercentage:A,extraPayablePercentage:D,constants:{a:he,b:be}}}};var Zt=class extends E{async getPalletId(){let t=this.api.constants.Staking.PalletId;return(await t()).asText()}async getPeriodLength(){let t=this.api.constants.Staking.PeriodLength;return await t()}async getUnclaimablePeriods(){let t=this.api.constants.Staking.UnclaimablePeriods;return await t()}async getNFTCollectionId(){let t=this.api.constants.Staking.NFTCollectionId;return await t()}async getStaking(){return await this.api.query.Staking.Staking.getValue()}async getUniques(t,e){return(await this.api.query.Uniques.Account.getEntries(t,e)).map(({keyArgs:s})=>{let[r,o,l]=s;return{address:r,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 Zn={};x(Zn,{TxBuilderFactory:()=>wt});import{Enum as Jn}from"polkadot-api";function Qn(p){let t=[],e=p;for(;e&&typeof e=="object"&&"type"in e;)t.push(e.type),e=e.value;return t.join(".")}var xt=class extends E{evm;evmClient;balanceClient;aaveUtils;constructor(t,e){super(t),this.evm=e,this.evmClient=e.getWsProvider(),this.balanceClient=new K(t),this.aaveUtils=new it(e)}wrapTx(t,e){return{name:t,get:()=>e,dryRun:n=>this.dryRun(n,e)}}async dispatchWithExtraGas(t){return this.api.tx.Dispatcher.dispatch_with_extra_gas({call:t.decodedCall,extra_gas:ve})}async dryRun(t,e){let n=Jn("Signed",t),i=Jn("system",n),s=await this.client.getUnsafeApi().apis.DryRunApi.dry_run_call(i,e.decodedCall),r=s.success&&!s.value.execution_result.success?s.value.execution_result.value.error:null;if(r){let o=Qn(r.value);throw new Error("Dry run execution error!",{cause:o})}return s}isDirectOmnipoolTrade(t){return t.length===1&&t[0].pool==="Omnipool"}};var ye=class extends xt{_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:i}=e[0],a=await this.balanceClient.getBalance(this.beneficiary,i);return t>=a.transferable-5n?this.buildSellAllTx():this.buildSellTx()}async buildBuyTx(){let{amountIn:t,amountOut:e,swaps:n}=this.trade,i=n[0],a=n[n.length-1],s=O.getFraction(t,this.slippagePct),r=i.assetIn,o=a.assetOut,l=t+s,c;return this.isDirectOmnipoolTrade(n)?c=this.api.tx.Omnipool.buy({asset_in:r,asset_out:o,amount:e,max_sell_amount:l}):c=this.api.tx.Router.buy({asset_in:r,asset_out:o,amount_out:e,max_amount_in:l,route:H.build(n)}),await this.aaveUtils.hasBorrowPositions(this.beneficiary)&&(c=await this.dispatchWithExtraGas(c)),this.wrapTx("RouterBuy",c)}async buildSellTx(){let{amountIn:t,amountOut:e,swaps:n}=this.trade,i=n[0],a=n[n.length-1],s=O.getFraction(e,this.slippagePct),r=i.assetIn,o=a.assetOut,l=e-s,c;return this.isDirectOmnipoolTrade(n)?c=this.api.tx.Omnipool.sell({asset_in:r,asset_out:o,amount:t,min_buy_amount:l}):c=this.api.tx.Router.sell({asset_in:r,asset_out:o,amount_in:t,min_amount_out:l,route:H.build(n)}),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],i=e[e.length-1],a=O.getFraction(t,this.slippagePct),s=n.assetIn,r=i.assetOut,o=t-a,l=this.api.tx.Router.sell_all({asset_in:s,asset_out:r,min_amount_out:o,route:H.build(e)});return await this.aaveUtils.hasBorrowPositions(this.beneficiary)&&(l=await this.dispatchWithExtraGas(l)),this.wrapTx("RouterSellAll",l)}};import{Enum as Qe}from"polkadot-api";var fe=class extends xt{_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:i,tradePeriod:a,tradeRoute:s}=this.order,r=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:Qe("Sell",{asset_in:e,asset_out:n,amount_in:i,min_amount_out:0n,route:s})},start_execution_block:void 0});return this.wrapTx("DcaSchedule",r)}buildTwapSellTx(){let{amountIn:t,assetIn:e,assetOut:n,tradeAmountIn:i,tradeAmountOut:a,tradePeriod:s,tradeRoute:r}=this.order,o=O.getFraction(a,this.slippagePct),l=a-o,c=this.api.tx.DCA.schedule({schedule:{owner:this.beneficiary,period:s,max_retries:this.maxRetries,total_amount:t,slippage:this.slippagePct*1e4,stability_threshold:void 0,order:Qe("Sell",{asset_in:e,asset_out:n,amount_in:i,min_amount_out:l,route:r})},start_execution_block:void 0});return this.wrapTx("DcaSchedule.twapSell",c)}buildTwapBuyTx(){let{amountIn:t,assetIn:e,assetOut:n,tradeAmountIn:i,tradeAmountOut:a,tradePeriod:s,tradeRoute:r}=this.order,o=O.getFraction(i,this.slippagePct),l=i+o,c=this.api.tx.DCA.schedule({schedule:{owner:this.beneficiary,period:s,max_retries:this.maxRetries,total_amount:t,slippage:this.slippagePct*1e4,stability_threshold:void 0,order:Qe("Buy",{asset_in:e,asset_out:n,amount_out:a,max_amount_in:l,route:r})},start_execution_block:void 0});return this.wrapTx("DcaSchedule.twapBuy",c)}};var wt=class{client;evmClient;constructor(t,e){this.client=t,this.evmClient=e}trade(t){return new ye(this.client,this.evmClient).setTrade(t)}order(t){return new fe(this.client,this.evmClient).setOrder(t)}};async function bg(p){let t=new pt(p),e=new Ct(p),[n,i]=await Promise.all([t.getBlockTime(),t.getMinOrderBudget()]),a=new Pt(p,e).withAave().withOmnipool().withStableswap().withXyk(),s=new K(p),r=new Zt(p),o=new kt(p),l=new it(e),c=new Tt(a),u=new vt(c,{blockTime:n,minBudgetInNative:i}),d=new Jt(r,s),m=new Et(o,s,{blockTime:n});return{api:{aave:l,router:c,scheduler:u,staking:d,farm:m},client:{asset:new ct(p),balance:s,evm:e},ctx:{pool:a},tx:new wt(p,e),destroy:()=>{a.destroy()}}}export{re as QueryBus,un as aave,en as api,P as big,mn as client,nn as const,bg as createSdkContext,st as erc20,dn as error,yn as evm,xn as farm,w as fmt,lt as h160,Bt as json,O as math,qn as pool,Vn as sor,$n as staking,Zn as tx,ln as xc};
|