@galacticcouncil/sdk-next 0.9.0 → 0.10.0-pr206-70b5b04

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/build/index.cjs CHANGED
@@ -1 +1 @@
1
- "use strict";var Cs=Object.create;var ye=Object.defineProperty;var Ds=Object.getOwnPropertyDescriptor;var Ms=Object.getOwnPropertyNames;var Ls=Object.getPrototypeOf,qs=Object.prototype.hasOwnProperty;var Dn=(c,t)=>()=>(c&&(t=c(c=0)),t);var I=(c,t)=>{for(var e in t)ye(c,e,{get:t[e],enumerable:!0})},be=(c,t,e,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of Ms(t))!qs.call(c,s)&&s!==e&&ye(c,s,{get:()=>t[s],enumerable:!(n=Ds(t,s))||n.enumerable});return c},vt=(c,t,e)=>(be(c,t,"default"),e&&be(e,t,"default")),at=(c,t,e)=>(e=c!=null?Cs(Ls(c)):{},be(t||!c||!c.__esModule?ye(e,"default",{value:c,enumerable:!0}):e,c)),Ns=c=>be(ye({},"__esModule",{value:!0}),c);var Nt={};var qn=Dn(()=>{vt(Nt,require("@polkadot-api/ws-provider/node"))});var Ut={};var Nn=Dn(()=>{vt(Ut,require("@polkadot-api/ws-provider/web"))});var vi={};I(vi,{QueryBus:()=>Yt,aave:()=>an,api:()=>We,big:()=>S,client:()=>on,const:()=>$e,createSdkContext:()=>Si,erc20:()=>bt,error:()=>cn,evm:()=>pn,farm:()=>hn,fmt:()=>O,h160:()=>Wt,json:()=>mt,math:()=>_,pool:()=>vn,sor:()=>On,staking:()=>Rn,tx:()=>En,xc:()=>en});module.exports=Ns(vi);var We={};I(We,{Papi:()=>N,getWs:()=>Us});var Ln=require("@galacticcouncil/descriptors");function Mn(c){switch(c){case!0:case"true":case 1:case"1":case"on":case"yes":return!0;default:return!1}}var N=class{client;api;constructor(t){this.client=t,this.api=this.client.getTypedApi(Ln.hydration)}log(t,...e){let n=typeof window>"u"?process.env.GC_DEBUG:window.localStorage.getItem("gc.debug");Mn(n)&&console.log(t,...e)}};var Un=require("polkadot-api"),Vn=require("polkadot-api/polkadot-sdk-compat"),Us=async c=>{let t=typeof c=="string"?c.split(","):c,s=(typeof window>"u"?(await Promise.resolve().then(()=>(qn(),Nt))).getWsProvider:(await Promise.resolve().then(()=>(Nn(),Ut))).getWsProvider)(t);return(0,Un.createClient)((0,Vn.withPolkadotSdkCompat)(s))};var an={};I(an,{AAVE_GAS_LIMIT:()=>ze,AAVE_LENDING_POOL_ADDRESS:()=>Se,AAVE_POOL_ABI:()=>He,AAVE_POOL_DATA_PROVIDER:()=>Pe,AAVE_POOL_DATA_PROVIDER_ABI:()=>fe,AAVE_POOL_PROXY:()=>Ye,AAVE_ROUNDING_THRESHOLD:()=>Li,AAVE_UINT_256_MAX:()=>Vs,AaveClient:()=>Vt,AaveUtils:()=>ft});var He=[{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 fe=[{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 Ye="0x1b02E051683b5cfaC5929C25E84adb26ECf87B38",Pe="0x112b087b60C1a166130d59266363C45F8aa99db0",Se="0xf3Ba4D1b50f78301BDD7EAEa9B67822A15FCA691",ze=1000000n,Li=5,Vs=BigInt("0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");var Vt=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:fe,address:Pe,args:[Se],functionName:"getReservesData"})}async getUserReservesData(t){return await this.client.readContract({abi:fe,address:Pe,args:[Se,t],functionName:"getUserReservesData"})}async getUserAccountData(t){return await this.client.readContract({abi:He,address:Ye,args:[t],functionName:"getUserAccountData"})}};var lt=at(require("big.js"));var S={};I(S,{asBigInt:()=>Hs,toBigInt:()=>Ws,toDecimal:()=>Gs});var pt=at(require("big.js"));pt.default.NE=-18;function Gs(c,t,e=6,n){let s=(0,pt.default)(c.toString()),i=(0,pt.default)(10).pow(t);return s.div(i).round(e,n).toString()}function Ws(c,t){let e=(0,pt.default)(10).pow(t),s=(0,pt.default)(c).mul(e).toFixed(0,pt.default.roundDown);return BigInt(s)}function Hs(c){return BigInt(c.round(0,pt.default.roundDown).toFixed(0))}var bt={};I(bt,{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 O={};I(O,{FeeUtils:()=>Qe,shiftNeg:()=>Xs});var Gn=at(require("big.js"));var $e={};I($e,{HUB_ASSET_ID:()=>Gt,HYDRATION_OMNIPOOL_ADDRESS:()=>zs,HYDRATION_PARACHAIN_ID:()=>Ys,HYDRATION_SS58_PREFIX:()=>W,PERBILL_DENOMINATOR:()=>Ke,PERMILL_DENOMINATOR:()=>wt,RUNTIME_DECIMALS:()=>B,SYSTEM_ASSET_DECIMALS:()=>je,SYSTEM_ASSET_ID:()=>R,TRADEABLE_DEFAULT:()=>Tt});var B=18,wt=1e6,Ke=1e9,R=0,je=12,Ys=2034,W=63,zs="7L53bUTBbfuj14UpdCNPwmgzzHSsrsTWBHX5pys32mVWM3C1",Gt=1,Tt=15;var Qe=class c{static toPct(t){let[e,n]=t;return c.safeDivide(e*100,n)}static toRaw(t){let[e,n]=t;return c.safeDivide(e,n)}static fromPermill(t){return[t,1e6]}static fromPerbill(t){return[t,1e9]}static fromRate(t,e){return[t,e]}static safeDivide(t,e,n=12){let s=10**n;return Math.round(t*s/e)/s}static safeRound(t){return parseFloat(t.toPrecision(15))}};function Xs(c,t){let e=(0,Gn.default)(typeof c=="bigint"?c.toString():c);return t===0?e.toString():e.div(Math.pow(10,t)).toString()}var Wt={};I(Wt,{H160:()=>tn,isEvmAccount:()=>Wn,isEvmAddress:()=>Hn,isSs58Address:()=>Yn});var xt=require("polkadot-api"),Je=require("@polkadot-api/utils"),ot=require("buffer");var Ze="ETH\0";function Wn(c){if(!c)return!1;try{let t=(0,xt.AccountId)().enc(c),e=ot.Buffer.from(Ze);return ot.Buffer.from(t.subarray(0,e.length)).equals(e)}catch{return!1}}function Hn(c){return!!/^0x[a-fA-F0-9]{40}$/.test(c)}function Yn(c){try{return(0,xt.AccountId)(63).enc(c),!0}catch{return!1}}var tn=class c{static toAccount=t=>{let e=ot.Buffer.from(t.slice(2),"hex"),n=ot.Buffer.from(Ze),s=Uint8Array.from(ot.Buffer.concat([n,e,ot.Buffer.alloc(8)])),i=(0,Je.toHex)(s);return(0,xt.AccountId)(63).dec(i)};static fromAccount=t=>{let e=(0,xt.AccountId)().enc(t),n=ot.Buffer.from(Ze),s=e.slice(n.length,-8);return"0x"+ot.Buffer.from(s).toString("hex")};static fromSS58=t=>{let n=(0,xt.AccountId)().enc(t).slice(0,20);return(0,Je.toHex)(n)};static fromAny=t=>{if(Hn(t))return t;if(Wn(t))return c.fromAccount(t);if(Yn(t))return c.fromSS58(t);throw new Error("Unknown address type")}};var mt={};I(mt,{findNestedKey:()=>Ks,findNestedObj:()=>js,jsonFormatter:()=>$s});var Ks=(c,t)=>{let e=[];return JSON.stringify(c,(n,s)=>(s&&s[t]&&e.push(s),s)),e[0]},js=(c,t,e)=>{let n;return JSON.stringify(c,(s,i)=>(i&&i[t]===e&&(n=i),i)),n},$s=(c,t)=>typeof t=="bigint"?t.toString():t;var _={};I(_,{calculateBuyFee:()=>ti,calculateDiffToAvg:()=>Qs,calculateDiffToRef:()=>Js,calculateSellFee:()=>Zs,getFraction:()=>ei});var et=at(require("big.js"));function Qs(c,t){let e=(0,et.default)(c.toString()),n=(0,et.default)(t.toString());return e.minus(n).abs().div(e.plus(n).div(2)).mul(100).round(2).toNumber()}function Js(c,t){if(t===0n)return 0;let e=(0,et.default)(c.toString()),n=(0,et.default)(t.toString());return e.minus(n).div(n).mul(100).round(2).toNumber()}function Zs(c,t){let e=(0,et.default)(c.toString()),n=(0,et.default)(t.toString());return(0,et.default)(1).minus(n.div(e)).mul(100).round(2).toNumber()}function ti(c,t){let e=(0,et.default)(c.toString());return(0,et.default)(t.toString()).div(e).minus(1).mul(100).round(2).toNumber()}function ei(c,t,e=2){(t<.01||t>100)&&new Error("Supported range is from 0.01% - 100%");let n=Math.pow(10,e),s=BigInt(t*n);return c*s/BigInt(100*n)}var en={};I(en,{convertToId:()=>ni});var zn=require("buffer");function ni(c){let e=zn.Buffer.from(c.replace("0x",""),"hex").subarray(16);return e.readUIntBE(0,e.length)}var Ht=(c,t)=>c===t?0:c==null?t==null?0:-1:t==null?c==null?0:1:typeof c.compare=="function"?c.compare(t):typeof t.compare=="function"?-t.compare(c):c<t?-1:c>t?1:0;var ve=(c,t=e=>e!==void 0?": "+e:"")=>class extends Error{origMessage;constructor(e){super(c(e)+t(e)),this.origMessage=e!==void 0?String(e):""}};var si=ve(()=>"illegal argument(s)"),Xn=c=>{throw new si(c)};var ii=ve(()=>"index out of bounds"),nn=c=>{throw new ii(c)},we=(c,t,e)=>(c<t||c>=e)&&nn(c);var Kn=23283064365386963e-26,Te=class{float(t=1){return this.int()*Kn*t}probability(t){return this.float()<t}norm(t=1){return(this.int()*Kn-.5)*2*t}normMinMax(t,e){let n=this.minmax(t,e);return this.float()<.5?n:-n}minmax(t,e){return this.float()*(e-t)+t}minmaxInt(t,e){t|=0;let n=(e|0)-t;return n?t+this.int()%n:t}minmaxUint(t,e){t>>>=0;let n=(e>>>0)-t;return n?t+this.int()%n:t}};var xe=class extends Te{constructor(t){super(),this.rnd=t}float(t=1){return this.rnd()*t}norm(t=1){return(this.rnd()-.5)*2*t}int(){return this.rnd()*4294967296>>>0}};var jn=new xe(Math.random);var $n=c=>c!=null&&typeof c!="function"&&c.length!==void 0;var Qn=Object.getPrototypeOf({}),Ie="function",Jn="string",It=(c,t)=>{let e;if(c===t)return!0;if(c!=null){if(typeof c.equiv===Ie)return c.equiv(t)}else return c==t;if(t!=null){if(typeof t.equiv===Ie)return t.equiv(c)}else return c==t;return typeof c===Jn||typeof t===Jn?!1:(e=Object.getPrototypeOf(c),(e==null||e===Qn)&&(e=Object.getPrototypeOf(t),e==null||e===Qn)?li(c,t):typeof c!==Ie&&c.length!==void 0&&typeof t!==Ie&&t.length!==void 0?ri(c,t):c instanceof Set&&t instanceof Set?ai(c,t):c instanceof Map&&t instanceof Map?oi(c,t):c instanceof Date&&t instanceof Date?c.getTime()===t.getTime():c instanceof RegExp&&t instanceof RegExp?c.toString()===t.toString():c!==c&&t!==t)},ri=(c,t,e=It)=>{let n=c.length;if(n===t.length)for(;n-- >0&&e(c[n],t[n]););return n<0},ai=(c,t,e=It)=>c.size===t.size&&e([...c.keys()].sort(),[...t.keys()].sort()),oi=(c,t,e=It)=>c.size===t.size&&e([...c].sort(),[...t].sort()),li=(c,t,e=It)=>{if(Object.keys(c).length!==Object.keys(t).length)return!1;for(let n in c)if(!t.hasOwnProperty(n)||!e(c[n],t[n]))return!1;return!0};var sn=class{value;constructor(t){this.value=t}deref(){return this.value}};var Zn=c=>c instanceof sn;var _e=class c{_head;_length=0;constructor(t){t&&this.into(t)}get length(){return this._length}get head(){return this._head}[Symbol.iterator](){return ts("next",this._head)}reverseIterator(){return ts("prev",this.tail)}clear(){this.release()}compare(t,e=Ht){let n=this._length;if(n<t._length)return-1;if(n>t._length)return 1;if(n===0)return 0;{let s=this._head,i=t._head,r=0;for(;n-- >0&&r===0;)r=e(s.value,i.value),s=s.next,i=i.next;return r}}concat(...t){let e=this.copy();for(let n of t)e.into(n);return e}equiv(t){if(!(t instanceof c||$n(t))||this._length!==t.length)return!1;if(!this._length||this===t)return!0;let e=t[Symbol.iterator](),n=this._head;for(let s=this._length;s-- >0;){if(!It(n.value,e.next().value))return!1;n=n.next}return!0}filter(t){let e=this.empty();return this.traverse(n=>(t(n.value)&&e.append(n.value),!0)),e}find(t){return this.traverse(e=>e.value!==t)}findWith(t){return this.traverse(e=>!t(e.value))}first(){return this._head?.value}insertSorted(t,e){e=e||Ht;for(let n=this._head,s=this._length;s-- >0;){if(e(t,n.value)<=0)return this.insertBefore(n,t);n=n.next}return this.append(t)}into(t){for(let e of t)this.append(e);return this}nth(t,e){let n=this.nthCell(t);return n?n.value:e}nthCellUnsafe(t){let e,n;for(t<=this._length>>>1?(e=this._head,n="next"):(e=this.tail,n="prev",t=this._length-t-1);t-- >0&&e;)e=e[n];return e}peek(){return this.tail?.value}$reduce(t,e){let n=this._head;for(let s=this._length;s-- >0&&!Zn(e);)e=t(e,n.value),n=n.next;return e}reduce(t,e){return this.$reduce(t,e)}release(){let t=this._head;if(!t)return!0;let e;for(let n=this._length;n-- >0;)e=t.next,delete t.value,delete t.prev,delete t.next,t=e;return this._head=void 0,this._length=0,!0}reverse(){let t=this._head,e=this.tail,n=(this._length>>>1)+(this._length&1);for(;t&&e&&n>0;){let s=t.value;t.value=e.value,e.value=s,t=t.next,e=e.prev,n--}return this}setHead(t){let e=this._head;return e?(e.value=t,e):this.prepend(t)}setNth(t,e){let n=this.nthCell(t);return!n&&nn(t),n.value=e,n}setTail(t){let e=this.tail;return e?(e.value=t,e):this.append(t)}swap(t,e){if(t!==e){let n=t.value;t.value=e.value,e.value=n}return this}toArray(t=[]){return this.traverse(e=>(t.push(e.value),!0)),t}toJSON(){return this.toArray()}toString(){let t=[];return this.traverse(e=>(t.push(String(e.value)),!0)),t.join(", ")}traverse(t,e=this._head,n){if(!this._head)return;let s=e;do{if(!t(s))break;s=s.next}while(s!==n);return s}_map(t,e){return this.traverse(n=>(t.append(e(n.value)),!0)),t}};function*ts(c,t){for(;t;)yield t.value,t=t[c]}var Ae=class c extends _e{_tail;constructor(t){super(),t&&this.into(t)}get tail(){return this._tail}append(t){if(this._tail){let e={value:t,prev:this._tail};return this._tail.next=e,this._tail=e,this._length++,e}else return this.prepend(t)}asHead(t){return t===this._head?this:(this.remove(t),this._head.prev=t,t.next=this._head,t.prev=void 0,this._head=t,this._length++,this)}asTail(t){return t===this._tail?this:(this.remove(t),this._tail.next=t,t.prev=this._tail,t.next=void 0,this._tail=t,this._length++,this)}cons(t){return this.prepend(t),this}copy(){return new c(this)}*cycle(){for(;;)yield*this}drop(){let t=this._head;if(t)return this._head=t.next,this._head?this._head.prev=void 0:this._tail=void 0,this._length--,t.value}empty(){return new c}insertAfter(t,e){let n={value:e,next:t.next,prev:t};return t.next?t.next.prev=n:this._tail=n,t.next=n,this._length++,n}insertAfterNth(t,e){return t<0&&(t+=this._length),t>=this._length-1?this.append(e):(we(t,0,this._length),this.insertAfter(this.nthCellUnsafe(t),e))}insertBefore(t,e){let n={value:e,next:t,prev:t.prev};return t.prev?t.prev.next=n:this._head=n,t.prev=n,this._length++,n}insertBeforeNth(t,e){return t<0&&(t+=this._length),t<=0?this.prepend(e):(we(t,0,this._length),this.insertBefore(this.nthCellUnsafe(t),e))}map(t){return this._map(new c,t)}nth(t,e){let n=this.nthCell(t);return n?n.value:e}nthCell(t){if(t<0&&(t+=this._length),!(t<0||t>=this._length))return this.nthCellUnsafe(t)}pop(){let t=this._tail;if(t)return this._tail=t.prev,this._tail?this._tail.next=void 0:this._head=void 0,this._length--,t.value}prepend(t){let e={value:t,next:this._head};return this._head?this._head.prev=e:this._tail=e,this._head=e,this._length++,e}push(t){return this.append(t),this}release(){return this._tail=void 0,super.release()}remove(t){return t.prev?t.prev.next=t.next:this._head=t.next,t.next?t.next.prev=t.prev:this._tail=t.prev,this._length--,this}rotateLeft(){switch(this._length){case 0:case 1:return this;case 2:return this.swap(this._head,this._tail);default:return this.push(this.drop())}}rotateRight(){switch(this._length){case 0:case 1:return this;case 2:return this.swap(this._head,this._tail);default:let t=this.peek();return this.pop(),this.prepend(t),this}}seq(t=0,e=this.length){if(t>=e||t<0)return;let n=this.nthCell(t),s=this.nthCell(e-1),i=r=>({first(){return r.value},next(){return r!==s&&r.next?i(r.next):void 0}});return n?i(n):void 0}shuffle(t,e=jn){if(this._length<2)return this;for(t=t!==void 0?t:Math.ceil(1.5*Math.log2(this._length));t>0;t--){let n=this._head;for(;n;){let s=n.next;e.probability(.5)?this.asHead(n):this.asTail(n),n=s}}return this}slice(t=0,e=this.length){let n=t<0?t+this._length:t,s=e<0?e+this._length:e;(n<0||s<0)&&Xn("invalid indices: ${from} / ${to}");let i=new c,r=this.nthCell(n);for(;r&&++n<=s;)i.push(r.value),r=r.next;return i}sort(t=Ht){if(!this._length)return this;let e=1;for(;;){let n=this._head;this._head=void 0,this._tail=void 0;let s=0;for(;n;){s++;let i=n,r=0;for(let o=0;o<e&&(r++,i=i.next,!!i);o++);let a=e;for(;r>0||a>0&&i;){let o;r===0?(o=i,i=i.next,a--):!i||a===0||t(n.value,i.value)<=0?(o=n,n=n.next,r--):(o=i,i=i.next,a--),this._tail?this._tail.next=o:this._head=o,o.prev=this._tail,this._tail=o}n=i}if(this._tail.next=void 0,s<=1)return this;e*=2}}splice(t,e=0,n){let s;typeof t=="number"?(t<0&&(t+=this._length),we(t,0,this._length),s=this.nthCellUnsafe(t)):s=t;let i=new c;if(e>0)for(;s&&e-- >0;)this.remove(s),i.push(s.value),s=s.next;else s&&(s=s.next);if(n)if(s)for(let r of n)this.insertBefore(s,r);else for(let r of n)this.push(r);return i}};var Oe=class c{map;items;opts;_size;constructor(t,e){let n={maxlen:1/0,maxsize:1/0,map:()=>new Map,ksize:()=>0,vsize:()=>0,...e};this.map=n.map(),this.items=new Ae,this._size=0,this.opts=n,t&&this.into(t)}get length(){return this.items.length}get size(){return this._size}[Symbol.iterator](){return this.entries()}*entries(){for(let t of this.items)yield[t.k,t]}*keys(){for(let t of this.items)yield t.k}*values(){for(let t of this.items)yield t.v}copy(){let t=this.empty();t.items=this.items.copy();let e=t.items.head;for(;e;)t.map.set(e.value.k,e),e=e.next;return t}empty(){return new c(null,this.opts)}release(){this._size=0,this.map.clear();let t=this.opts.release;if(t){let e;for(;e=this.items.drop();)t(e.k,e.v);return!0}return this.items.release()}has(t){return this.map.has(t)}get(t,e){let n=this.map.get(t);return n?this.resetEntry(n):e}set(t,e){let n=this.opts.ksize(t)+this.opts.vsize(e),s=this.map.get(t),i=Math.max(0,n-(s?s.value.s:0));return this._size+=i,this.ensureSize()?this.doSetEntry(s,t,e,n):this._size-=i,e}into(t){for(let e of t)this.set(e[0],e[1]);return this}async getSet(t,e){let n=this.map.get(t);return n?this.resetEntry(n):this.set(t,await e())}delete(t){let e=this.map.get(t);return e?(this.removeEntry(e),!0):!1}resetEntry(t){return this.items.asTail(t),t.value.v}ensureSize(){let{release:t,maxsize:e,maxlen:n}=this.opts;for(;this._size>e||this.length>=n;){let s=this.items.drop();if(!s)return!1;this.map.delete(s.k),t?.(s.k,s.v),this._size-=s.s}return!0}removeEntry(t){let e=t.value;this.map.delete(e.k),this.items.remove(t),this.opts.release?.(e.k,e.v),this._size-=e.s}doSetEntry(t,e,n,s){t?(this.opts.update?.(e,t.value.v,n),t.value.v=n,t.value.s=s,this.items.asTail(t)):(this.items.push({k:e,v:n,s}),this.map.set(e,this.items.tail))}};var yt=class c extends Oe{constructor(t,e){super(t,{ttl:3600*1e3,autoExtend:!1,...e})}empty(){return new c(null,this.opts)}has(t){return this.get(t)!==void 0}get(t,e){let n=this.map.get(t);if(n){if(n.value.t>=Date.now())return this.resetEntry(n);this.removeEntry(n)}return e}set(t,e,n=this.opts.ttl){let s=this.opts.ksize(t)+this.opts.vsize(e),i=this.map.get(t),r=Math.max(0,s-(i?i.value.s:0));return this._size+=r,this.ensureSize()?this.doSetEntry(i,t,e,s,n):this._size-=r,e}async getSet(t,e,n=this.opts.ttl){let s=this.get(t);return s!==void 0?s:this.set(t,await e(),n)}prune(){let t=Date.now(),e=this.items.head,n=0;for(;e;)e.value.t<t&&(this.removeEntry(e),n++),e=e.next;return n}ensureSize(){let{maxlen:t,maxsize:e}=this.opts,n=Date.now(),s=this.items.head;for(;s&&(this._size>e||this.length>=t);)s.value.t<n&&this.removeEntry(s),s=s.next;return super.ensureSize()}doSetEntry(t,e,n,s,i=this.opts.ttl){let r=Date.now()+i;t?(this.opts.update?.(e,t.value.v,n),t.value.v=n,t.value.s=s,t.value.t=r,this.items.asTail(t)):(this.items.push({k:e,v:n,s,t:r,ttl:i}),this.map.set(e,this.items.tail))}resetEntry(t){return this.opts.autoExtend&&(t.value.t=Date.now()+t.value.ttl),super.resetEntry(t)}};var Yt=class{debug;constructor(t){this.debug=t||!1}log(t,e,n){this.debug&&console.log(t,e,n)}scope(t,e,n,s){let i=new Map,r=s!==void 0?new yt(null,{ttl:s}):new yt;return{get:(...u)=>{let p=n(...u);if(i.has(p)){this.log("[live]",t,p);let m=i.get(p);return Promise.resolve(m)}if(r.has(p))return this.log("[memo]",t,p),r.get(p);this.log("[fetch]",t,p);let d=e(...u).catch(m=>{throw r.delete(p),m});return r.set(p,d),d},set:(u,...p)=>{let d=n(...p);this.log("[set-live]",t,d),i.set(d,u)},clear:()=>{this.log("[clear]",t),i.clear(),r.release()}}}};var{ERC20:Be}=bt,{H160:rn}=Wt,ci=1.01,ui=31536000n,Re=10n**27n,ft=class{client;constructor(t){this.client=new Vt(t)}async getSummary(t){let e=rn.fromAny(t),[n,s,i,r]=await Promise.all([this.client.getReservesData(),this.client.getUserReservesData(e),this.client.getUserAccountData(e),this.client.getBlockTimestamp()]),[a]=n,[o,l]=s,[u,p,d,m,g,b]=i,h=S.toDecimal(b,18),f=[];for(let P of o){let v=P.underlyingAsset.toLowerCase(),w=a.find(({underlyingAsset:Ge})=>Ge.toLowerCase()===v);if(!w)throw new Error("Missing pool reserve for "+v);let k=P.scaledATokenBalance,q=w.liquidityIndex,C=w.liquidityRate,U=w.availableLiquidity,Z=w.priceInMarketReferenceCurrency,tt=r+6,H=this.calculateLinearInterest(C,w.lastUpdateTimestamp,tt),ut=q*H/Re,qt=k*ut/Re,de=Number(l!==0&&l===w.eModeCategoryId?w.eModeLiquidationThreshold:w.reserveLiquidationThreshold)/1e4,ge=w.usageAsCollateralEnabled&&P.usageAsCollateralEnabledOnUser&&P.scaledATokenBalance>0n,he=Be.toAssetId(v);f.push({aTokenBalance:qt,availableLiquidity:U,decimals:Number(w.decimals),isCollateral:ge,priceInRef:Z,reserveId:he,reserveAsset:v,reserveLiquidationThreshold:de})}return{healthFactor:Number(h),totalCollateral:u,totalDebt:p,reserves:f}}async hasBorrowPositions(t){let e=rn.fromAny(t),n=await this.client.getUserAccountData(e),[s,i]=n;return i>0n}async getHealthFactor(t){let e=rn.fromAny(t),n=await this.client.getUserAccountData(e),[s,i,r,a,o,l]=n,u=S.toDecimal(l,18);return Number(u)}async getHealthFactorAfterWithdraw(t,e,n){let{totalCollateral:s,totalDebt:i,reserves:r}=await this.getSummary(t),a=Be.fromAssetId(e),o=r.find(f=>f.reserveAsset===a);if(!o)throw new Error("Missing reserve ctx for "+a);let{decimals:l,isCollateral:u,priceInRef:p,reserveLiquidationThreshold:d}=o,m=S.toBigInt(n,l),g=u?m*p/10n**BigInt(l):0n,b=s-g;if(b<=0n)return 0;let h=(0,lt.default)(b.toString()).mul(d).div(i.toString()).toFixed(6,lt.default.roundDown);return Number(h)}async getHealthFactorAfterSupply(t,e,n){let{totalCollateral:s,totalDebt:i,reserves:r}=await this.getSummary(t),a=Be.fromAssetId(e),o=r.find(h=>h.reserveAsset===a);if(!o)throw new Error("Missing reserve ctx for "+a);let{decimals:l,priceInRef:u,reserveLiquidationThreshold:p}=o,m=S.toBigInt(n,l)*u/10n**BigInt(l),g=s+m;if(g<=0n)return 0;let b=(0,lt.default)(g.toString()).mul(p).div(i.toString()).toFixed(6,lt.default.roundDown);return Number(b)}async getMaxWithdraw(t,e){let{totalDebt:n,reserves:s,healthFactor:i}=await this.getSummary(t),r=Be.fromAssetId(e),a=s.find(o=>o.reserveAsset===r);if(!a)throw new Error("Missing reserve ctx for "+r);return this.calculateWithdrawMax(a,n,i)}async getMaxWithdrawAll(t){let{totalDebt:e,reserves:n,healthFactor:s}=await this.getSummary(t),i={};for(let r of n){let a=this.calculateWithdrawMax(r,e,s);r.reserveId&&(i[r.reserveId]=a)}return i}calculateWithdrawMax(t,e,n){let{aTokenBalance:s,availableLiquidity:i,decimals:r,priceInRef:a,reserveLiquidationThreshold:o,isCollateral:l}=t,u=s;if(l&&e>0n){let d=n-ci;if(d>0){let m=(0,lt.default)(d).mul(e.toString()).div(o).toFixed(0,lt.default.roundDown),g=(0,lt.default)(m).div(a.toString()).mul(10**r).toFixed(0,lt.default.roundDown);u=s<BigInt(g)?s:BigInt(g)}else u=0n}return{amount:u<i?u:i,decimals:r}}calculateLinearInterest(t,e,n){let s=n-e;if(s<=0)return Re;let i=t*BigInt(s)/ui;return Re+i}};var on={};I(on,{AssetClient:()=>_t,BalanceClient:()=>nt,ChainParams:()=>At});var _t=class extends N{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:s})=>{let[i]=n;return[i,s]}))}async queryBonds(){let e=await this.api.query.Bonds.Bonds.getEntries();return new Map(e.map(({keyArgs:n,value:s})=>{let[i]=n;return[i,s]}))}async queryAssets(){let e=await this.api.query.AssetRegistry.Assets.getEntries();return new Map(e.filter(({value:n})=>{let{asset_type:s}=n;return this.SUPPORTED_TYPES.includes(s.type)}).map(({keyArgs:n,value:s})=>{let[i]=n;return[i,s]}))}async queryAssetLocations(){let e=await this.api.query.AssetRegistry.AssetLocations.getEntries();return new Map(e.map(({keyArgs:n,value:s})=>{let[i]=n;return[i,s]}))}async mapToken(t,e,n,s){let{name:i,asset_type:r,is_sufficient:a,existential_deposit:o}=e,{symbol:l,decimals:u}=n.get(t)??{};return{id:t,name:i?.asText(),symbol:l,decimals:u,icon:l,type:r.type,isSufficient:a,location:s,existentialDeposit:o}}async mapBond(t,e,n,s){let[i,r]=s,{asset_type:a,is_sufficient:o,existential_deposit:l}=e,{symbol:u,decimals:p}=await this.mapToken(i,e,n),d=Number(r),m=new Intl.DateTimeFormat("en-GB"),g=[u,"Bond",m.format(d)].join(" ");return{id:t,name:g,symbol:u+"b",decimals:p,icon:u,type:a.type,isSufficient:o,existentialDeposit:l,underlyingAssetId:i,maturity:d}}async mapShares(t,e,n,s){let{assets:i}=s,{name:r,symbol:a,asset_type:o,is_sufficient:l,existential_deposit:u}=e,p=await Promise.all(i.map(async g=>{let{symbol:b}=await this.mapToken(g,e,n);return[g,b]})),d=Object.fromEntries(p),m=Object.values(d);return{id:t,name:m.join(", "),symbol:a?.asText()||r?.asText(),decimals:18,icon:m.join("/"),type:o.type,isSufficient:l,existentialDeposit:u,meta:d}}async mapExternal(t,e,n,s){let i=await this.mapToken(t,e,new Map,s),r=n?.find(a=>a.internalId===i.id);return r?{...i,decimals:r.decimals,name:r.name,symbol:r.symbol,icon:r.symbol,isWhiteListed:r.isWhiteListed}:i}parseMetadata(t){return new Map(Array.from(t,([e,n])=>[e,{symbol:n.symbol?.asText(),decimals:n.decimals}]))}async getOnChainAssets(t,e){let[n,s,i,r]=await Promise.all([this.queryAssets(),this.queryAssetLocations(),this.queryShares(),this.queryBonds()]),a=this.parseMetadata(n),o=[];for(let[l,u]of Array.from(n)){let p=s.get(l),{asset_type:d}=u,m;switch(d.type){case"Bond":let g=r.get(l);m=await this.mapBond(l,u,a,g);break;case"StableSwap":let b=i.get(l);m=await this.mapShares(l,u,a,b);break;case"External":m=await this.mapExternal(l,u,e,p);break;default:m=await this.mapToken(l,u,a,p)}o.push(m)}return t?o:o.filter(l=>this.isValidAsset(l))}isValidAsset(t){let e=Math.sign(t.decimals);return!!t.symbol&&(e===0||e===1)}};var x=require("rxjs");var nt=class extends N{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 s=await this.api.query.Tokens.Accounts.getValue(t,e);return this.calculateBalance(s)}async getErc20Balance(t,e){return this.getTokenBalanceData(t,e)}subscribeBalance(t){let e=this.subscribeSystemBalance(t),n=this.subscribeTokensBalance(t),s=this.subscribeErc20Balance(t);return(0,x.combineLatest)([e,n,s]).pipe((0,x.debounceTime)(250),(0,x.map)(i=>i.flat()),(0,x.startWith)([]),(0,x.bufferCount)(2,1),(0,x.map)(([i,r],a)=>a===0?r:this.getDeltas(i,r)))}subscribeSystemBalance(t){return this.api.query.System.Account.watchValue(t,"best").pipe((0,x.map)(n=>({id:0,balance:this.calculateBalance(n.data)})))}subscribeTokenBalance(t,e){return this.api.query.Tokens.Accounts.watchValue(t,e,"best").pipe((0,x.map)(s=>({id:e,balance:s})))}subscribeTokensBalance(t){return this.api.query.Tokens.Accounts.watchEntries(t,{at:"best"}).pipe((0,x.distinctUntilChanged)((n,s)=>!s.deltas),(0,x.map)(({deltas:n})=>{let s=[];return n?.deleted.forEach(i=>{let[r,a]=i.args;s.push({id:a,balance:this.calculateBalance({free:0n,reserved:0n,frozen:0n})})}),n?.upserted.forEach(i=>{let[r,a]=i.args;s.push({id:a,balance:this.calculateBalance(i.value)})}),s}))}subscribeErc20Balance(t,e){let n=new x.Subject,s=n.pipe((0,x.shareReplay)(1)),i=async()=>(await this.api.query.AssetRegistry.Assets.getEntries()).filter(({value:l})=>{let{asset_type:u}=l;return u.type==="Erc20"}).map(({keyArgs:l})=>{let[u]=l;return u}),r=async()=>{let o=e||await i(),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 u=this.api.query.System.Number.watchValue("best").subscribe(l);return()=>u.unsubscribe()},a;return r().then(o=>a=o),s.pipe((0,x.finalize)(()=>a?.()),(0,x.pairwise)(),(0,x.map)(([o,l],u)=>u===0?l.filter(p=>p.balance.transferable>0n):this.getDeltas(o,l)),(0,x.distinctUntilChanged)((o,l)=>l.length===0))}async getTokenBalanceData(t,e){let n=await this.api.apis.CurrenciesApi.account(e,t);return this.calculateBalance(n)}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=(i,r)=>i!==void 0&&r!==void 0&&i.transferable===r.transferable&&i.total===r.total,s=t.reduce((i,r)=>(i.set(r.id,r.balance),i),new Map);return e.filter(i=>!n(i.balance,s.get(i.id)))}};var At=class extends N{_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 cn={};I(cn,{AssetNotFound:()=>ln,PoolNotFound:()=>zt,RouteNotFound:()=>Xt});var ln=class extends Error{constructor(t){super(),this.message=`${t} not found`,this.name="AssetNotFound"}},zt=class extends Error{constructor(t){super(),this.message=`${t} pool invalid`,this.name="PoolNotFound"}},Xt=class extends Error{constructor(t,e){super(),this.message=`Route from ${t} to ${e} not found in current configuration`,this.name="RouteNotFound"}};var pn={};I(pn,{EvmClient:()=>Kt,createChain:()=>un});var es=require("viem"),pi=["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"],un=()=>(0,es.defineChain)({id:222222,name:"Hydration",network:"hydration",nativeCurrency:{decimals:18,name:"WETH",symbol:"WETH"},rpcUrls:{default:{http:pi}},blockExplorers:{default:{name:"Hydration Explorer",url:"https://hydration.subscan.io"}},testnet:!1});var st=require("viem");var Kt=class{client;chain;constructor(t){this.client=t,this.chain=un()}get chainId(){return this.chain.id}get chainCurrency(){return this.chain.nativeCurrency.symbol}get chainDecimals(){return this.chain.nativeCurrency.decimals}getProvider(){return(0,st.createPublicClient)({chain:this.chain,transport:(0,st.http)()})}getWsProvider(){return(0,st.createPublicClient)({transport:(0,st.custom)({request:({method:t,params:e})=>this.client._request(t,e||[])})})}getSigner(t){return(0,st.createWalletClient)({account:t,chain:this.chain,transport:(0,st.custom)(window.ethereum)})}};var hn={};I(hn,{LiquidityMiningApi:()=>jt,LiquidityMiningClient:()=>$t});var is=require("polkadot-api"),V=at(require("big.js")),gn=require("@galacticcouncil/math-liquidity-mining");var Fe=class{result=new Map;getKey(t,e){return[e,t.toString()].join(",")}constructor(t,e){for(let n=0;n<t.length;++n){let[s,i]=t[n];this.result.set(this.getKey(i,s),e[n].free)}}freeBalance(t,e){return this.result.get(this.getKey(t,e))??0n}transfer(t,e,n,s){let i=this.getKey(t,e),r=this.getKey(t,n),a=this.result.get(i)??0n,o=this.result.get(r)??0n;if(a<s)throw new Error("Attempting to transfer more than is present");this.result.set(i,a+s),this.result.set(r,o+s)}};var dt=at(require("big.js")),Q=require("@galacticcouncil/math-liquidity-mining");var mn=at(require("big.js")),dn=(0,mn.default)(10).pow(18),ns=BigInt((0,mn.default)(1).pow(18).toString()),ss=6e3;var mi="1000000000000000000",Ee=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 s=await this.getAsset(t.reward_currency),i=e-t.updated_at,r=this.getAccount(t.id),a=s?.existential_deposit;if(!a)throw new Error("Missing reward currency asset list");let o=this.multiCurrency.freeBalance(t.reward_currency,r),l=(0,dt.default)(a.toString()),u=(0,dt.default)(o.toString()).minus(l.lt(o.toString())?a.toString():o.toString()),p=(0,dt.default)((0,Q.calculate_global_farm_rewards)(t.total_shares_z.toString(),n.toString(),(0,dt.default)(t.yield_per_period.toString()).mul(dn).round(0,dt.default.roundDown).toFixed(),t.max_reward_per_period.toString(),i.toFixed()));if(u.lt(p)&&(p=u),p.eq(0))return t;let d=this.getAccount(0);return this.multiCurrency.transfer(t.reward_currency,r,d,BigInt(p.toFixed())),{...t,accumulated_rpz:BigInt((0,Q.calculate_accumulated_rps)(t.accumulated_rpz.toString(),t.total_shares_z.toString(),p.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 s=(0,Q.calculate_yield_farm_delta_rpvs)(t.accumulated_rpz.toString(),e.accumulated_rpz.toString(),t.multiplier.toString(),t.total_valued_shares.toString());return{...t,accumulated_rpvs:t.accumulated_rpvs+BigInt(s),updated_at:n}}getLoyaltyMultiplier(t,e){let n=(0,dt.default)(1).mul(dn).round(0,dt.default.roundDown).toString();if(!e)return n;let{initial_reward_percentage:s,scale_coef:i}=e;return(0,Q.calculate_loyalty_multiplier)(t.toFixed(),s.toString(),i.toFixed())}async claimRewards(t,e,n,s,i){if(e.state.type==="Terminated")return null;let r=Math.floor(s/t.blocks_per_period);if(n.updated_at===r)return null;let a=await this.syncGlobalFarm(t,r,i);if(!a)return null;let o=this.syncYieldFarm(e,a,r);if(!o)return null;let l=o.total_stopped-n.stopped_at_creation,u=o.updated_at-n.entered_at-l,p=this.getLoyaltyMultiplier(u,o.loyalty_curve),d=BigInt((0,Q.calculate_user_reward)(n.accumulated_rpvs.toString(),n.valued_shares.toString(),n.accumulated_claimed_rewards.toString(),o.accumulated_rpvs.toString(),p)),m=BigInt((0,Q.calculate_user_reward)(n.accumulated_rpvs.toString(),n.valued_shares.toString(),n.accumulated_claimed_rewards.toString(),o.accumulated_rpvs.toString(),mi));return{reward:d,maxReward:m,assetId:a.reward_currency}}};var di=(0,V.default)(365.2425).times(24).times(60).times(60),jt=class{client;balanceClient;options;constructor(t,e,n={}){this.client=t,this.balanceClient=e,this.options=Object.freeze({blockTime:n.blockTime??ss})}get blockTime(){return this.options.blockTime}async getOraclePrice(t,e){let n=[t,e].sort((i,r)=>i-r);if(t===e)return ns;let s=await this.client.getOraclePrice(n);if(s){let{n:i,d:r}=s[0].price,a;return t<e?a=(0,gn.fixed_from_rational)(i.toString(),r.toString()):a=(0,gn.fixed_from_rational)(r.toString(),i.toString()),BigInt(a)}}getFarmAddress=(t,e)=>{let n=Buffer.from("modl","utf-8"),s=Buffer.from(e?"78796b4c4d704944":"4f6d6e6957684c4d","hex"),i=Buffer.from([t]),r=Buffer.concat([n,s,i]),o="0x"+Buffer.concat([r,Buffer.alloc(32-r.length)]).toString("hex");return(0,is.AccountId)(63).dec(o)};getGlobalRewardPerPeriod(t,e,n,s){let i=(0,V.default)(s).times(t.toString()).times(e.toString()).div(18);return i.gte(n.toString())?n.toString():i.toString()}getPoolYieldPerPeriod(t,e,n,s){let i=(0,V.default)(t.toString()).times(e),r=(0,V.default)(n.toString()).times(s);return i.div(r.toString()).toString()}farmData(t,e,n){let{yieldFarm:s,globalFarm:i,priceAdjustment:r,balance:a,id:o}=t,{multiplier:l,loyalty_curve:u}=s,{blocks_per_period:p,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:P,incentivized_asset:v,reward_currency:w,price_adjustment:k,min_deposit:q}=i,C=O.shiftNeg(r??k,18),U=O.shiftNeg(l,18),Z=O.shiftNeg(u?.initial_reward_percentage??0,18),tt=di.div((0,V.default)(this.blockTime).div(1e3).times(p)).toString(),H;if(m<=0)H=(0,V.default)(U).times(d.toString()).times(tt).toString();else{let Es=this.getGlobalRewardPerPeriod(m,d,g,C),ks=this.getPoolYieldPerPeriod(Es,U,m,C);H=(0,V.default)(ks).times(tt).toString()}let ut=b+h,qt=g*BigInt(f),ht=a.transferable+ut,kn=ht-ut,de=(0,V.default)(kn.toString()).div(g.toString()),ge=(0,V.default)(e).div(p.toString()).toString(),he=(m>=0?de.plus(P):de.plus(ge)).toString(),Ge=(0,V.default)(he).times(p).toString(),Rs=(0,V.default)(m.toString()).div((0,V.default)(g.toString()).div(d.toString())).div(Math.pow(10,18)).times(100).times(C).toFixed(2),Cn=(0,V.default)(ut.toString()).div(ht.toString()).gte(.999);H=Cn?"0":(0,V.default)(H).div(n?2:1).times(100).toString();let Fs=Z?(0,V.default)(H).times(Z).toString():void 0;return{apr:H,minApr:Fs,isDistributed:Cn,estimatedEndPeriod:he,estimatedEndBlock:Ge,maxRewards:qt,incentivizedAsset:v,rewardCurrency:w,loyaltyCurve:u,currentPeriod:ge,potMaxRewards:ht,fullness:Rs,yieldFarmId:s.id,globalFarmId:i.id,poolId:o,distributedRewards:ut,plannedYieldingPeriods:f,minDeposit:q}}async getAllOmnipoolFarms(){let e=(await this.client.getAllOmnipooFarms()).reduce((s,i)=>s.includes(i.keyArgs[0].toString())?s:[...s,i.keyArgs[0].toString()],[]),n=await Promise.all(e.map(async s=>{let i=await this.getOmnipoolFarms(s);if(i)return[s,i]}));return Object.fromEntries(n.filter(s=>!!s))}async getOmnipoolFarms(t){let e=await this.client.getOmnipooFarms(Number(t)),n=await this.client.getRelayBlockNumber(),s=await Promise.all(e.map(async({keyArgs:i,value:r})=>{let[,a]=i,o=r,l=await this.client.getOmnipoolGlobalFarm(a),u=await this.client.getOmnipoolYieldFarm(Number(t),a,o);if(!l||!u)return;let p=l.reward_currency,d=l.incentivized_asset,m=this.getFarmAddress(a),g=await this.getOraclePrice(p,d),b=await this.balanceClient.getBalance(m,p);return{id:t,globalFarm:l,yieldFarm:u,priceAdjustment:g,balance:b}}));return n?s.map(i=>i?this.farmData(i,n):void 0):[]}async getAllIsolatedFarms(){let e=(await this.client.getAllIsolatedFarms()).reduce((s,i)=>s.includes(i.keyArgs[0].toString())?s:[...s,i.keyArgs[0].toString()],[]),n=await Promise.all(e.map(async s=>{let i=await this.getIsolatedFarms(s);if(i)return[s,i]}));return Object.fromEntries(n.filter(s=>!!s))}async getIsolatedFarms(t){let e=await this.client.getIsolatedFarms(t),n=await this.client.getRelayBlockNumber(),s=await Promise.all(e.map(async({keyArgs:i,value:r})=>{let[,a]=i,o=r,l=await this.client.getIsolatedGlobalFarm(a),u=await this.client.getIsolatedYieldFarm(t,a,o);if(!l||!u)return;let p=l.reward_currency,d=l.incentivized_asset,m=this.getFarmAddress(a,!0),g=await this.getOraclePrice(p,d),b=await this.balanceClient.getBalance(m,p);return{id:t,globalFarm:l,yieldFarm:u,priceAdjustment:g,balance:b,farmAddress:m}}));return n?s.map(i=>i?this.farmData(i,n,!0):void 0):[]}async getDepositReward(t,e,n,s){let i=e.global_farm_id,r=e.yield_farm_id,a=n?await this.client.getIsolatedYieldFarm(t,i,r):await this.client.getOmnipoolYieldFarm(Number(t),i,r),o=n?await this.client.getIsolatedGlobalFarm(i):await this.client.getOmnipoolGlobalFarm(i);if(!o||!a)return;let l=o.reward_currency,u=o.incentivized_asset,p=[[this.getFarmAddress(0,n),o.reward_currency],[this.getFarmAddress(o.id,n),o.reward_currency]],d=await this.getAccountAssetBalances(p),m=await this.getOraclePrice(l,u),g=new Fe(p,d),h=await new Ee(P=>this.getFarmAddress(P),P=>this.client.getAsset(P),g).claimRewards(o,a,e,s,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(([i,r])=>r!==0).map(([i,r])=>this.balanceClient.getTokenBalance(i,r))),Promise.all(t.filter(([i,r])=>r===0).map(([i])=>this.balanceClient.getSystemBalance(i)))]),s=[];for(let i=0,r=0;i+r<t.length;){let a=i+r,[,o]=t[a];o===0?(s.push(n[r]),r+=1):(s.push(e[i]),i+=1)}return s}};var ke=require("polkadot-api"),$t=class extends N{omnipoolAssetIds=[];async getOraclePrice(t){return await this.api.query.EmaOracle.Oracles.getValue(ke.Binary.fromText("omnipool"),t,(0,ke.Enum)("TenMinutes"))}async getRelayBlockNumber(){return(await this.api.query.ParachainSystem.ValidationData.getValue())?.relay_parent_number}async getAllOmnipooFarms(){return this.api.query.OmnipoolWarehouseLM.ActiveYieldFarm.getEntries()}async getOmnipooFarms(t){return this.api.query.OmnipoolWarehouseLM.ActiveYieldFarm.getEntries(t)}async getOmnipoolGlobalFarm(t){return this.api.query.OmnipoolWarehouseLM.GlobalFarm.getValue(t)}async getOmnipoolYieldFarm(t,e,n){return this.api.query.OmnipoolWarehouseLM.YieldFarm.getValue(t,e,n)}async getAllIsolatedFarms(){return this.api.query.XYKWarehouseLM.ActiveYieldFarm.getEntries()}async getIsolatedFarms(t){return this.api.query.XYKWarehouseLM.ActiveYieldFarm.getEntries(t)}async getIsolatedGlobalFarm(t){return this.api.query.XYKWarehouseLM.GlobalFarm.getValue(t)}async getIsolatedYieldFarm(t,e,n){return this.api.query.XYKWarehouseLM.YieldFarm.getValue(t,e,n)}async getAsset(t){return this.api.query.AssetRegistry.Assets.getValue(t)}};var vn={};I(vn,{PoolContextProvider:()=>Et,PoolError:()=>Pt,PoolFactory:()=>Ft,PoolType:()=>M,aave:()=>Sn,lbp:()=>bn,omni:()=>yn,stable:()=>fn,xyk:()=>Pn});var bn={};I(bn,{LbpMath:()=>J,LbpPool:()=>Qt,LbpPoolClient:()=>Jt});var it=require("@galacticcouncil/math-lbp"),J=class{static getSpotPrice(t,e,n,s,i){return(0,it.get_spot_price)(t,e,n,s,i)}static calculateInGivenOut(t,e,n,s,i){return(0,it.calculate_in_given_out)(t,e,n,s,i)}static calculateOutGivenIn(t,e,n,s,i){return(0,it.calculate_out_given_in)(t,e,n,s,i)}static calculateLinearWeights(t,e,n,s,i){return(0,it.calculate_linear_weights)(t,e,n,s,i)}static calculatePoolTradeFee(t,e,n){return(0,it.calculate_pool_trade_fee)(t,e,n)}};var M=(i=>(i.Aave="Aave",i.LBP="LBP",i.Omni="Omnipool",i.Stable="Stableswap",i.XYK="XYK",i))(M||{}),Pt=(i=>(i.InsufficientTradingAmount="InsufficientTradingAmount",i.MaxInRatioExceeded="MaxInRatioExceeded",i.MaxOutRatioExceeded="MaxOutRatioExceeded",i.TradeNotAllowed="TradeNotAllowed",i.UnknownError="UnknownError",i))(Pt||{});var{FeeUtils:rs}=O,Qt=class c{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;fee;repayFeeApply;static fromPool(t){return new c(t.address,t.tokens,t.maxInRatio,t.maxOutRatio,t.minTradingLimit,t.fee,t.repayFeeApply)}constructor(t,e,n,s,i,r,a){this.type="LBP",this.address=t,this.tokens=e,this.maxInRatio=n,this.maxOutRatio=s,this.minTradingLimit=i,this.fee=r,this.repayFeeApply=a}validatePair(t,e){return!0}parsePair(t,e){let n=new Map(this.tokens.map(r=>[r.id,r])),s=n.get(t),i=n.get(e);if(s==null)throw new Error("Pool does not contain tokenIn");if(i==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,balanceIn:s.balance,balanceOut:i.balance,decimalsIn:s.decimals,decimalsOut:i.decimals,weightIn:s.weight,weightOut:i.weight}}validateAndBuy(t,e,n){let s=this.tokens[0].id,i=[];e<this.minTradingLimit&&i.push("InsufficientTradingAmount");let r=t.balanceOut/this.maxOutRatio;if(e>r&&i.push("MaxOutRatioExceeded"),s===t.assetOut){let a=this.calculateTradeFee(e,n),o=rs.toPct(this.repayFeeApply?n.repayFee:n.exchangeFee),l=e+a,u=this.calculateInGivenOut(t,l),p=t.balanceIn/this.maxInRatio;return u>p&&i.push("MaxInRatioExceeded"),{amountIn:u,calculatedIn:u,amountOut:e,feePct:o,errors:i}}else{let a=this.calculateInGivenOut(t,e),o=t.balanceIn/this.maxInRatio;return a>o&&i.push("MaxInRatioExceeded"),{amountIn:a,calculatedIn:a,amountOut:e,feePct:0,errors:i}}}validateAndSell(t,e,n){let s=this.tokens[0].id,i=[];e<this.minTradingLimit&&i.push("InsufficientTradingAmount");let r=t.balanceIn/this.maxInRatio;if(e>r&&i.push("MaxInRatioExceeded"),s===t.assetIn){let a=this.calculateOutGivenIn(t,e),o=t.balanceOut/this.maxOutRatio;return a>o&&i.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:a,amountOut:a,feePct:0,errors:i}}else{let a=this.calculateOutGivenIn(t,e),o=this.calculateTradeFee(a,n),l=rs.toPct(this.repayFeeApply?n.repayFee:n.exchangeFee),u=a-o,p=t.balanceOut/this.maxOutRatio;return u>p&&i.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:a,amountOut:u,feePct:l,errors:i}}}calculateInGivenOut(t,e){let n=J.calculateInGivenOut(t.balanceIn.toString(),t.balanceOut.toString(),t.weightIn.toString(),t.weightOut.toString(),e.toString()),s=BigInt(n);return s<0n?0n:s}calculateOutGivenIn(t,e){let n=J.calculateOutGivenIn(t.balanceIn.toString(),t.balanceOut.toString(),t.weightIn.toString(),t.weightOut.toString(),e.toString()),s=BigInt(n);return s<0n?0n:s}spotPriceInGivenOut(t){let e=J.getSpotPrice(t.balanceOut.toString(),t.balanceIn.toString(),t.weightOut.toString(),t.weightIn.toString(),this.maxOutRatio.toString());return BigInt(e)}spotPriceOutGivenIn(t){let e=J.getSpotPrice(t.balanceIn.toString(),t.balanceOut.toString(),t.weightIn.toString(),t.weightOut.toString(),this.maxInRatio.toString());return BigInt(e)}calculateTradeFee(t,e){let n=J.calculatePoolTradeFee(t.toString(),this.repayFeeApply?e.repayFee[0]:e.exchangeFee[0],this.repayFeeApply?e.repayFee[1]:e.exchangeFee[1]);return BigInt(n)}};var ls=require("polkadot-api"),Ot=require("rxjs");var as=(c,t=new Map)=>e=>{let n;return t.has(e)?t.get(e):(t.set(e,n=c(e)),n)};var y=require("rxjs");var os=require("rxjs"),Ce=class{store$=new os.BehaviorSubject([]);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((a,o)=>[a.address,o])),s=await t(e),i=e.slice(),r=new Set;for(let a of s){let o=n.get(a.address);o===void 0?(n.set(a.address,i.length),i.push(a)):i[o]=a,r.add(a.address)}this.changeset=r,this.store$.next(i)}).catch(console.error)}destroy(){this.store$.complete()}};var K=class extends nt{evm;store=new Ce;shared$;mem=0;memPoolsCache=new yt(null,{ttl:6*1e3});memPools=as(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((0,y.startWith)([]),(0,y.bufferCount)(2,1),(0,y.map)(([t,e])=>t.length===0?e:this.store.applyChangeset(e)),(0,y.filter)(t=>t.length>0),(0,y.throttleTime)(1e3,void 0,{leading:!0,trailing:!0}))}subscribeStore(){return(0,y.defer)(()=>{let t=new y.Subscription;return(0,y.from)(this.getMemPools()).pipe((0,y.map)(n=>n.filter(s=>this.hasValidAssets(s))),(0,y.tap)(n=>this.store.set(n))).pipe((0,y.tap)(()=>{t.add(this.subscribeUpdates())}),(0,y.switchMap)(n=>(0,y.merge)((0,y.of)(n),this.store.asObservable().pipe((0,y.skip)(1)))),(0,y.finalize)(()=>{t.unsubscribe()}))}).pipe((0,y.share)({connector:()=>new y.ReplaySubject(1),resetOnRefCountZero:!0}))}subscribeBalances(){let t=this.store.pools.map(e=>{let{address:n}=e,s=[this.subscribeTokensBalance(n)];if(this.hasSystemAsset(e)){let i=this.subscribeSystemBalance(n);s.push(i)}if(this.hasErc20Asset(e)){let i=e.tokens.filter(a=>a.type==="Erc20").map(a=>a.id),r=this.subscribeErc20Balance(n,i);s.push(r)}return(0,y.combineLatest)(s).pipe((0,y.map)(i=>i.flat()),(0,y.pairwise)(),(0,y.map)(([i,r])=>this.getDeltas(i,r)),(0,y.map)(i=>[n,i]))});return(0,y.combineLatest)(t).pipe((0,y.debounceTime)(250),(0,y.map)(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=[],s=new Map(t.map(i=>[i.address,i]));for(let[i,r]of e){let a=s.get(i);if(a){let o=a.tokens.map(l=>{let u=r.find(p=>p.id===l.id);return u&&l.id!==a.id?{...l,balance:u.balance.transferable}:l});n.push({...a,tokens:o})}}return n}};var Jt=class extends K{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:s,initial_weight:i,final_weight:r}=t,a=J.calculateLinearWeights(n?n.toString():"0",s?s.toString():"0",i.toString(),r.toString(),e.toString()),o=BigInt(a),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(ls.CompatibilityLevel.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()]),s=e?.relay_parent_number||0,i=t.filter(({value:r})=>e&&this.isActivePool(r,s)).map(async({keyArgs:r,value:a})=>{let[o]=r,l=o.toString(),u=await this.getPoolDelta(l,a,s);return{address:l,type:"LBP",fee:a.fee,...u,...n}});return Promise.all(i)}async getPoolDelta(t,e,n){let{assets:s,repay_target:i,fee_collector:r}=e,[a,o]=this.getPoolWeights(e,n),[l,u]=s,[p,d,m,g,b]=await Promise.all([this.isRepayFeeApplied(l,i,r.toString()),this.getBalance(t,l),this.api.query.AssetRegistry.Assets.getValue(l),this.getBalance(t,u),this.api.query.AssetRegistry.Assets.getValue(u)]);return{repayFeeApply:p,tokens:[{id:l,decimals:m?.decimals,existentialDeposit:m?.existential_deposit,balance:d.transferable,weight:a,type:m?.asset_type.type},{id:u,decimals:b?.decimals,existentialDeposit:b?.existential_deposit,balance:g.transferable,weight:o,type:b?.asset_type.type}]}}isActivePool(t,e){let{start:n,end:s}=t;return n&&s?e>=n&&e<s:!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(i=>i.address===e);return{repayFee:await this.getRepayFee(),exchangeFee:n.fee}}subscribeValidationData(){return this.api.query.ParachainSystem.ValidationData.watchValue("best").pipe((0,Ot.filter)(t=>t!==void 0),(0,Ot.distinctUntilChanged)((t,e)=>t.relay_parent_number===e.relay_parent_number)).subscribe(({relay_parent_number:t})=>{this.store.update(async e=>{let n=[];for(let s of e){let i=this.poolsData.get(s.address);if(i){let{assets:r,repay_target:a,fee_collector:o}=i,[l]=r,[u,p]=this.getPoolWeights(i,t),[d,m]=s.tokens,g=[{...d,weight:u},{...m,weight:p}],b=await this.isRepayFeeApplied(l,a,o.toString());n.push({...s,tokens:g,repayFeeApply:b})}}return n})})}subscribeUpdates(){let t=new Ot.Subscription;return t.add(this.subscribeValidationData()),t}};var yn={};I(yn,{OmniMath:()=>A,OmniPool:()=>Zt,OmniPoolClient:()=>te});var T=require("@galacticcouncil/math-omnipool"),St=at(require("big.js")),A=class{static calculateSpotPrice(t,e,n,s){return(0,T.calculate_spot_price)(t,e,n,s)}static calculateLrnaSpotPrice(t,e){return(0,T.calculate_lrna_spot_price)(t,e)}static calculateInGivenOut(t,e,n,s,i,r,a,o,l){return(0,T.calculate_in_given_out)(t,e,n,s,i,r,a,o,l)}static calculateLrnaInGivenOut(t,e,n,s,i){return(0,T.calculate_lrna_in_given_out)(t,e,n,s,i)}static calculateOutGivenIn(t,e,n,s,i,r,a,o,l){return(0,T.calculate_out_given_in)(t,e,n,s,i,r,a,o,l)}static calculateOutGivenLrnaIn(t,e,n,s,i){return(0,T.calculate_out_given_lrna_in)(t,e,n,s,i)}static calculateShares(t,e,n,s){return(0,T.calculate_shares)(t,e,n,s)}static calculateLiquidityOut(t,e,n,s,i,r,a,o){return(0,T.calculate_liquidity_out)(t,e,n,s,i,r,a,o)}static calculateLiquidityLRNAOut(t,e,n,s,i,r,a,o){return(0,T.calculate_liquidity_lrna_out)(t,e,n,s,i,r,a,o)}static calculateCapDifference(t,e,n,s){let i=(0,St.default)(e),r=(0,St.default)(t),a=(0,St.default)(s),o=(0,St.default)(n),l=(0,St.default)(10).pow(18),u=o.div(l);if(i.div(a).lt(u)){let d=u.times(a).minus(i).times(r),m=i.times((0,St.default)(1).minus(u));return d.div(m).toFixed(0)}else return"0"}static calculateLimitHubIn(t,e,n,s){return(0,T.calculate_liquidity_hub_in)(t,e,n,s)}static isSellAllowed(t){return(0,T.is_sell_allowed)(t)}static isBuyAllowed(t){return(0,T.is_buy_allowed)(t)}static isAddLiquidityAllowed(t){return(0,T.is_add_liquidity_allowed)(t)}static isRemoveLiquidityAllowed(t){return(0,T.is_remove_liquidity_allowed)(t)}static recalculateAssetFee(t,e,n,s,i,r,a,o,l,u,p){return(0,T.recalculate_asset_fee)(t,e,n,s,i,r,a,o,l,u,p)}static recalculateProtocolFee(t,e,n,s,i,r,a,o,l,u,p){return(0,T.recalculate_protocol_fee)(t,e,n,s,i,r,a,o,l,u,p)}static verifyAssetCap(t,e,n,s){return(0,T.verify_asset_cap)(t,e,n,s)}};var{FeeUtils:Bt}=O,Zt=class c{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;hubAssetId;static fromPool(t){return new c(t.address,t.tokens,t.maxInRatio,t.maxOutRatio,t.minTradingLimit,t.hubAssetId)}constructor(t,e,n,s,i,r){this.type="Omnipool",this.address=t,this.tokens=e,this.maxInRatio=n,this.maxOutRatio=s,this.minTradingLimit=i,this.hubAssetId=r}validatePair(t,e){return this.hubAssetId!=e}parsePair(t,e){let n=new Map(this.tokens.map(r=>[r.id,r])),s=n.get(t),i=n.get(e);if(s==null)throw new Error("Pool does not contain tokenIn");if(i==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,hubReservesIn:s.hubReserves,hubReservesOut:i.hubReserves,sharesIn:s.shares,sharesOut:i.shares,decimalsIn:s.decimals,decimalsOut:i.decimals,balanceIn:s.balance,balanceOut:i.balance,tradeableIn:s.tradeable,tradeableOut:i.tradeable,assetInEd:s.existentialDeposit,assetOutEd:i.existentialDeposit}}validateAndBuy(t,e,n){let s=this.calculateInGivenOut(t,e),i=this.calculateInGivenOut(t,e,n),r=s===0n?0:_.calculateDiffToRef(i,s),a=[],o=A.isSellAllowed(t.tradeableIn),l=A.isBuyAllowed(t.tradeableOut);(!o||!l)&&a.push("TradeNotAllowed"),(e<this.minTradingLimit||s<t.assetInEd)&&a.push("InsufficientTradingAmount");let u=t.balanceOut/this.maxOutRatio;e>u&&a.push("MaxOutRatioExceeded");let p=t.balanceIn/this.maxInRatio;return i>p&&a.push("MaxInRatioExceeded"),{amountIn:i,calculatedIn:s,amountOut:e,feePct:r,errors:a}}validateAndSell(t,e,n){let s=this.calculateOutGivenIn(t,e),i=this.calculateOutGivenIn(t,e,n),r=_.calculateDiffToRef(s,i),a=[],o=A.isSellAllowed(t.tradeableIn),l=A.isBuyAllowed(t.tradeableOut);(!o||!l)&&a.push("TradeNotAllowed"),(e<this.minTradingLimit||s<t.assetOutEd)&&a.push("InsufficientTradingAmount");let u=t.balanceIn/this.maxInRatio;e>u&&a.push("MaxInRatioExceeded");let p=t.balanceOut/this.maxOutRatio;return i>p&&a.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:s,amountOut:i,feePct:r,errors:a}}calculateInGivenOut(t,e,n){if(t.assetIn==this.hubAssetId)return this.calculateLrnaInGivenOut(t,e,n);let s=A.calculateInGivenOut(t.balanceIn.toString(),t.hubReservesIn.toString(),t.sharesIn.toString(),t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),n?Bt.toRaw(n.assetFee).toString():"0",n?Bt.toRaw(n.protocolFee).toString():"0"),i=BigInt(s);return i<0n?0n:i}calculateLrnaInGivenOut(t,e,n){let s=A.calculateLrnaInGivenOut(t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),n?Bt.toRaw(n.assetFee).toString():"0"),i=BigInt(s);return i<0n?0n:i}calculateOutGivenIn(t,e,n){if(t.assetIn==this.hubAssetId)return this.calculateOutGivenLrnaIn(t,e,n);let s=A.calculateOutGivenIn(t.balanceIn.toString(),t.hubReservesIn.toString(),t.sharesIn.toString(),t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),n?Bt.toRaw(n.assetFee).toString():"0",n?Bt.toRaw(n.protocolFee).toString():"0"),i=BigInt(s);return i<0n?0n:i}calculateOutGivenLrnaIn(t,e,n){let s=A.calculateOutGivenLrnaIn(t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),n?Bt.toRaw(n.assetFee).toString():"0"),i=BigInt(s);return i<0n?0n:i}spotPriceInGivenOut(t){if(t.assetIn==this.hubAssetId)return this.spotPriceLrnaInGivenOut(t);let e=A.calculateSpotPrice(t.balanceOut.toString(),t.hubReservesOut.toString(),t.balanceIn.toString(),t.hubReservesIn.toString()),n=Math.pow(10,18-t.decimalsOut);return BigInt(e)/BigInt(n)}spotPriceLrnaInGivenOut(t){let e=A.calculateLrnaSpotPrice(t.hubReservesOut.toString(),t.balanceOut.toString()),n=Math.pow(10,18-t.decimalsOut);return BigInt(e)/BigInt(n)}spotPriceOutGivenIn(t){if(t.assetIn==this.hubAssetId)return this.spotPriceOutGivenLrnaIn(t);let e=A.calculateSpotPrice(t.balanceIn.toString(),t.hubReservesIn.toString(),t.balanceOut.toString(),t.hubReservesOut.toString()),n=Math.pow(10,18-t.decimalsIn);return BigInt(e)/BigInt(n)}spotPriceOutGivenLrnaIn(t){let e=A.calculateLrnaSpotPrice(t.balanceOut.toString(),t.hubReservesOut.toString()),n=Math.pow(10,18-t.decimalsIn);return BigInt(e)/BigInt(n)}};var gt=require("polkadot-api"),ps=require("@polkadot-api/utils"),D=require("rxjs");var{FeeUtils:L}=O,cs=gt.Binary.fromText("omnipool"),us=(0,gt.Enum)("Short"),te=class extends K{queryBus=new Yt;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(cs,t,us),t=>t.join(":"),6*1e3);getPoolType(){return"Omnipool"}getPoolAddress(){let t="modlomnipool".padEnd(32,"\0"),e=new TextEncoder().encode(t),n=(0,ps.toHex)(e);return(0,gt.AccountId)(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(gt.CompatibilityLevel.BackwardsCompatible,e)}async loadPools(){let t=await this.api.constants.Omnipool.HubAssetId(),e=this.getPoolAddress(),[n,s,i,r,a]=await Promise.all([this.api.query.Omnipool.Assets.getEntries(),this.api.query.Omnipool.HubAssetTradability.getValue(),this.api.query.AssetRegistry.Assets.getValue(t),this.getBalance(e,t),this.getPoolLimits()]),o=n.map(async({keyArgs:u,value:p})=>{let[d]=u,{hub_reserve:m,shares:g,tradable:b,cap:h,protocol_shares:f}=p,[P,v]=await Promise.all([this.api.query.AssetRegistry.Assets.getValue(d),this.getBalance(e,d)]);return{id:d,decimals:P?.decimals,existentialDeposit:P?.existential_deposit,balance:v.transferable,cap:h,hubReserves:m,protocolShares:f,shares:g,tradeable:b,type:P?.asset_type.type}}),l=await Promise.all(o);return l.push({id:t,decimals:i?.decimals,existentialDeposit:i?.existential_deposit,balance:r.transferable,tradeable:s,type:i?.asset_type.type}),[{address:e,type:"Omnipool",hubAssetId:t,tokens:l,...a}]}async getPoolFees(t){let e=t.assetOut,n=t.assetIn,s=await this.dynamicFeesConfig.get(e);if(s?.type==="Fixed"){let{asset_fee:P,protocol_fee:v}=s.value;return{assetFee:L.fromPermill(P),protocolFee:L.fromPermill(v)}}let i=this.getOraclePair(e),r=this.getOraclePair(n),[a,o,l]=await Promise.all([this.dynamicFees.get(e),this.emaOracles.get(i),this.emaOracles.get(r)]),[u,p,d]=await this.getAssetFee(t,this.block,a,o,s?.value.asset_fee_params),[m,g,b]=n===1?[0,0,0]:await this.getProtocolFee(t,this.block,a,l,s?.value.protocol_fee_params),h=u+m,f=d+b;return{assetFee:L.fromPermill(p),protocolFee:L.fromPermill(g),min:L.fromPermill(h),max:L.fromPermill(f)}}async getAssetFee(t,e,n,s,i){let{assetOut:r,balanceOut:a}=t,{min_fee:o,max_fee:l,decay:u,amplification:p}=i||await this.api.constants.DynamicFees.AssetFeeParameters();if(!n||!s)return[o,o,l];let d=L.fromPermill(o),m=L.fromPermill(l),[g]=s,{asset_fee:b,timestamp:h}=n,f=Math.max(1,e-h),P=g.volume.b_in.toString(),v=g.volume.b_out.toString(),w=g.liquidity.b.toString();r===0&&(P=g.volume.a_in.toString(),v=g.volume.a_out.toString(),w=g.liquidity.a.toString());let k=L.fromPermill(b),q=A.recalculateAssetFee(P,v,w,"9",a.toString(),L.toRaw(k).toString(),f.toString(),L.toRaw(d).toString(),L.toRaw(m).toString(),u.toString(),p.toString());return[o,Number(q)*1e6,l]}async getProtocolFee(t,e,n,s,i){let{assetIn:r,balanceIn:a}=t,{min_fee:o,max_fee:l,decay:u,amplification:p}=i||await this.api.constants.DynamicFees.ProtocolFeeParameters();if(!n||!s)return[o,o,l];let d=L.fromPermill(o),m=L.fromPermill(l),[g]=s,{protocol_fee:b,timestamp:h}=n,f=Math.max(1,e-h),P=g.volume.b_in.toString(),v=g.volume.b_out.toString(),w=g.liquidity.b.toString();r===0&&(P=g.volume.a_in.toString(),v=g.volume.a_out.toString(),w=g.liquidity.a.toString());let k=L.fromPermill(b),q=A.recalculateProtocolFee(P,v,w,"9",a.toString(),L.toRaw(k).toString(),f.toString(),L.toRaw(d).toString(),L.toRaw(m).toString(),u.toString(),p.toString());return[o,Number(q)*1e6,l]}subscribeEmaOracles(){let[t]=this.store.pools,n=t.tokens.map(s=>s.id).map(s=>this.getOraclePair(s)).map(s=>this.api.query.EmaOracle.Oracles.watchValue(cs,s,us,"best").pipe((0,D.filter)(i=>i!==void 0),(0,D.map)(i=>({pair:s,value:i}))));return(0,D.merge)(...n).pipe((0,D.finalize)(()=>{this.log(this.getPoolType(),"unsub ema oracles"),this.emaOracles.clear()})).subscribe(s=>{let{pair:i,value:r}=s;this.emaOracles.set(r,i)})}subscribeDynamicFees(){return this.api.query.DynamicFees.AssetFee.watchEntries({at:"best"}).pipe((0,D.distinctUntilChanged)((t,e)=>!e.deltas),(0,D.finalize)(()=>{(0,D.finalize)(()=>{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((0,D.distinctUntilChanged)((t,e)=>!e.deltas),(0,D.finalize)(()=>{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((0,D.finalize)(()=>{this.log(this.getPoolType(),"unsub block change")})).subscribe(t=>{this.block=t})}subscribeAssets(){return this.api.query.Omnipool.Assets.watchEntries({at:"best"}).pipe((0,D.distinctUntilChanged)((t,e)=>!e.deltas),(0,D.finalize)(()=>{this.log(this.getPoolType(),"unsub assets")})).subscribe(({deltas:t})=>{this.store.update(([e])=>{let n=t?.upserted.reduce((i,r)=>{let[a]=r.args;return i.set(a,r.value),i},new Map),s=e.tokens.map(i=>{let r=n?.get(i.id);return r?this.updateTokenState(i,r):i});return[{...e,tokens:s}]})})}subscribeUpdates(){let t=new D.Subscription;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:s,tradable:i,cap:r,protocol_shares:a}=e;return{...t,cap:r,hubReserves:n,protocolShares:a,shares:s,tradeable:i}}};var fn={};I(fn,{StableMath:()=>G,StableSwap:()=>ee,StableSwapClient:()=>ne});var F=require("@galacticcouncil/math-stableswap"),G=class{static getPoolAddress(t){return(0,F.pool_account_name)(t)}static defaultPegs(t){let e=[];for(let n=0;n<t;n++)e.push(["1","1"]);return e}static calculateAmplification(t,e,n,s,i){return(0,F.calculate_amplification)(t,e,n,s,i)}static calculateInGivenOut(t,e,n,s,i,r,a){return(0,F.calculate_in_given_out)(t,e,n,s,i,r,a)}static calculateAddOneAsset(t,e,n,s,i,r,a){return(0,F.calculate_add_one_asset)(t,e,n,s,i,r,a)}static calculateSharesForAmount(t,e,n,s,i,r,a){return(0,F.calculate_shares_for_amount)(t,e,n,s,i,r,a)}static calculateOutGivenIn(t,e,n,s,i,r,a){return(0,F.calculate_out_given_in)(t,e,n,s,i,r,a)}static calculateLiquidityOutOneAsset(t,e,n,s,i,r,a){return(0,F.calculate_liquidity_out_one_asset)(t,e,n,s,i,r,a)}static calculateShares(t,e,n,s,i,r){return(0,F.calculate_shares)(t,e,n,s,i,r)}static calculateSpotPriceWithFee(t,e,n,s,i,r,a,o){return(0,F.calculate_spot_price_with_fee)(t,e,n,s,i,r,a,o)}static recalculatePegs(t,e,n,s,i){let r=(0,F.recalculate_peg)(t,e,n,s,i);return JSON.parse(r)}};var{FeeUtils:Rt}=O,ee=class c{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;amplification;isRampPeriod;id;fee;totalIssuance;pegs;static fromPool(t){return new c(t.address,t.tokens,t.maxInRatio,t.maxOutRatio,t.minTradingLimit,t.amplification,t.isRampPeriod,t.id,t.fee,t.totalIssuance,t.pegs)}constructor(t,e,n,s,i,r,a,o,l,u,p){this.type="Stableswap",this.address=t,this.tokens=e,this.maxInRatio=n,this.maxOutRatio=s,this.minTradingLimit=i,this.amplification=r,this.isRampPeriod=a,this.id=o,this.fee=l,this.totalIssuance=u,this.pegs=p}validatePair(t,e){return!0}parsePair(t,e){let n=new Map(this.tokens.map(r=>[r.id,r])),s=n.get(t),i=n.get(e);if(s==null)throw new Error("Pool does not contain tokenIn");if(i==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,balanceIn:s.balance,balanceOut:i.balance,decimalsIn:s.decimals,decimalsOut:i.decimals,tradeableIn:this.id===t?15:s.tradeable,tradeableOut:this.id===e?15:i.tradeable,assetInEd:s.existentialDeposit,assetOutEd:i.existentialDeposit}}validateAndBuy(t,e,n){let s=this.calculateInGivenOut(t,e),i=this.calculateInGivenOut(t,e,n),r=s===0n?0:_.calculateDiffToRef(i,s),a=[],o=A.isSellAllowed(t.tradeableIn),l=A.isBuyAllowed(t.tradeableOut);return(!o||!l)&&a.push("TradeNotAllowed"),(e<this.minTradingLimit||s<t.assetInEd)&&a.push("InsufficientTradingAmount"),{amountIn:i,calculatedIn:s,amountOut:e,feePct:r,errors:a}}validateAndSell(t,e,n){let s=this.calculateOutGivenIn(t,e),i=this.calculateOutGivenIn(t,e,n),r=_.calculateDiffToRef(s,i),a=[],o=A.isSellAllowed(t.tradeableIn),l=A.isBuyAllowed(t.tradeableOut);return(!o||!l)&&a.push("TradeNotAllowed"),(e<this.minTradingLimit||s<t.assetOutEd)&&a.push("InsufficientTradingAmount"),{amountIn:e,calculatedOut:s,amountOut:i,feePct:r,errors:a}}calculateIn(t,e,n){let s=G.calculateInGivenOut(this.getReserves(),Number(t.assetIn),Number(t.assetOut),e.toString(),this.amplification.toString(),n?Rt.toRaw(n.fee).toString():"0",this.getPegs()),i=BigInt(s);return i<0n?0n:i}calculateAddOneAsset(t,e,n){let s=G.calculateAddOneAsset(this.getReserves(),e.toString(),Number(t.assetIn),this.amplification.toString(),this.totalIssuance.toString(),n?Rt.toRaw(n.fee).toString():"0",this.getPegs()),i=BigInt(s);return i<0n?0n:i}calculateSharesForAmount(t,e,n){let s=G.calculateSharesForAmount(this.getReserves(),Number(t.assetOut),e.toString(),this.amplification.toString(),this.totalIssuance.toString(),n?Rt.toRaw(n.fee).toString():"0",this.getPegs()),i=BigInt(s);return i<0n?0n:i}calculateInGivenOut(t,e,n){return t.assetOut==this.id?this.calculateAddOneAsset(t,e,n):t.assetIn==this.id?this.calculateSharesForAmount(t,e,n):this.calculateIn(t,e,n)}spotPriceInGivenOut(t){let e=G.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 s=Math.pow(10,t.decimalsIn-t.decimalsOut);return BigInt(e)/BigInt(s)}let n=Math.pow(10,18-t.decimalsIn);return BigInt(e)/BigInt(n)}calculateOut(t,e,n){let s=G.calculateOutGivenIn(this.getReserves(),Number(t.assetIn),Number(t.assetOut),e.toString(),this.amplification.toString(),n?Rt.toRaw(n.fee).toString():"0",this.getPegs()),i=BigInt(s);return i<0n?0n:i}calculateWithdrawOneAsset(t,e,n){let s=G.calculateLiquidityOutOneAsset(this.getReserves(),e.toString(),Number(t.assetOut),this.amplification.toString(),this.totalIssuance.toString(),n?Rt.toRaw(n.fee).toString():"0",this.getPegs()),i=BigInt(s);return i<0n?0n:i}calculateShares(t,e,n){let s=G.calculateShares(this.getReserves(),this.getAssets(t.assetIn,e),this.amplification.toString(),this.totalIssuance.toString(),n?Rt.toRaw(n.fee).toString():"0",this.getPegs()),i=BigInt(s);return i<0n?0n:i}calculateOutGivenIn(t,e,n){return t.assetIn==this.id?this.calculateWithdrawOneAsset(t,e,n):t.assetOut==this.id?this.calculateShares(t,e,n):this.calculateOut(t,e,n)}spotPriceOutGivenIn(t){let e=G.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 s=Math.pow(10,t.decimalsOut-t.decimalsIn);return BigInt(e)/BigInt(s)}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:s})=>({asset_id:e,amount:n,decimals:s}));return JSON.stringify(t,mt.jsonFormatter)}getAssets(t,e){let n={asset_id:Number(t),amount:e.toString()};return JSON.stringify([n],mt.jsonFormatter)}};var De=require("polkadot-api"),ms=require("@polkadot-api/utils"),ds=require("@noble/hashes/blake2b"),j=require("rxjs");var{FeeUtils:gi}=O,ne=class extends K{poolsData=new Map([]);getPoolType(){return"Stableswap"}getPoolAddress(t){let e=G.getPoolAddress(t),n=(0,ds.blake2b)(e,{dkLen:32}),s=(0,ms.toHex)(n);return(0,De.AccountId)(63).dec(s)}async getPoolLimits(){return{maxInRatio:0n,maxOutRatio:0n,minTradingLimit:await this.api.constants.Stableswap.MinTradingLimit()}}getPoolAmplification(t,e){let{initial_amplification:n,final_amplification:s,initial_block:i,final_block:r}=t,a=G.calculateAmplification(n.toString(),s.toString(),i.toString(),r.toString(),e.toString()),o=Number(a)<s;return{amplification:BigInt(a),isRampPeriod:o}}async getPoolTokens(t,e){let n=this.getPoolAddress(t),s=e.assets.map(async i=>{let[r,a,o]=await Promise.all([this.api.query.Stableswap.AssetTradability.getValue(t,i),this.api.query.AssetRegistry.Assets.getValue(i),this.getBalance(n,i)]);return{id:i,decimals:a?.decimals,existentialDeposit:a?.existential_deposit,balance:o.transferable,tradeable:r,type:a?.asset_type.type}});return Promise.all(s)}async isSupported(){let t=this.api.query.Stableswap.Pools,e=await this.api.compatibilityToken;return t.isCompatible(De.CompatibilityLevel.BackwardsCompatible,e)}async loadPools(){let[t,e,n]=await Promise.all([this.api.query.Stableswap.Pools.getEntries(),this.api.query.System.Number.getValue(),this.getPoolLimits()]),s=t.map(async({keyArgs:i,value:r})=>{let[a]=i,o=this.getPoolAddress(a),[l,u,p]=await Promise.all([this.getPoolTokens(a,r),this.api.query.Stableswap.PoolPegs.getValue(a),this.api.query.Tokens.TotalIssuance.getValue(a)]),d=this.getPoolAmplification(r,e),m=u?this.getRecentPegs(u):this.getDefaultPegs(r);return l.push({id:a,tradeable:15,balance:p,decimals:18}),this.poolsData.set(a,r),{address:o,id:a,type:"Stableswap",fee:gi.fromPermill(r.fee),tokens:l,totalIssuance:p,pegs:m,...n,...d}});return Promise.all(s)}async getPoolFees(t,e){return{fee:this.store.pools.find(s=>s.address===e).fee}}getDefaultPegs(t){return G.defaultPegs(t.assets.length)}getRecentPegs(t){let{current:e}=t;return Array.from(e.entries()).map(([n,s])=>s.map(i=>i.toString()))}subscribeIssuance(){let e=this.store.pools.map(n=>n.id).map(n=>this.api.query.Tokens.TotalIssuance.watchValue(n,"best").pipe((0,j.map)(s=>({id:n,value:s}))));return(0,j.merge)(...e).pipe((0,j.finalize)(()=>{this.log(this.getPoolType(),"unsub total issuance")})).subscribe(n=>{let{id:s,value:i}=n;this.store.update(r=>{let a=[];return r.filter(o=>o.id===s).forEach(o=>{let l=o.tokens.map(u=>u.id===s?{...u,balance:i}:u);a.push({...o,tokens:l,totalIssuance:i})}),a})})}subscribePoolPegs(){return this.api.query.Stableswap.PoolPegs.watchEntries({at:"best"}).pipe((0,j.distinctUntilChanged)((t,e)=>!e.deltas),(0,j.finalize)(()=>{this.log(this.getPoolType(),"unsub pool pegs")})).subscribe(({deltas:t})=>{this.store.update(e=>{let n=[],s=new Map(e.map(i=>[i.id,i]));return t?.upserted.forEach(({args:i,value:r})=>{let[a]=i,o=s.get(a);if(o){let l=this.getRecentPegs(r);n.push({...o,pegs:l})}}),n})})}subscribeBlock(){return this.api.query.System.Number.watchValue("best").pipe((0,j.finalize)(()=>{this.log(this.getPoolType(),"unsub block change")})).subscribe(t=>{this.store.update(e=>{let n=[];return e.filter(s=>s.isRampPeriod).forEach(s=>{let i=this.poolsData.get(s.id);if(i){let r=this.getPoolAmplification(i,t);n.push({...s,...r})}}),n})})}subscribeUpdates(){let t=new j.Subscription;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 Pn={};I(Pn,{XykMath:()=>ct,XykPool:()=>se,XykPoolClient:()=>ie});var E=require("@galacticcouncil/math-xyk"),ct=class{static getSpotPrice(t,e,n){return(0,E.get_spot_price)(t,e,n)}static calculateInGivenOut(t,e,n){return(0,E.calculate_in_given_out)(t,e,n)}static calculateOutGivenIn(t,e,n){return(0,E.calculate_out_given_in)(t,e,n)}static calculatePoolTradeFee(t,e,n){return(0,E.calculate_pool_trade_fee)(t,e,n)}static calculateLiquidityIn(t,e,n){return(0,E.calculate_liquidity_in)(t,e,n)}static calculateSpotPrice(t,e){return(0,E.calculate_spot_price)(t,e)}static calculateSpotPriceWithFee(t,e,n,s){return(0,E.calculate_spot_price_with_fee)(t,e,n,s)}static calculateShares(t,e,n){return(0,E.calculate_shares)(t,e,n)}static calculateLiquidityOutAssetA(t,e,n,s){return(0,E.calculate_liquidity_out_asset_a)(t,e,n,s)}static calculateLiquidityOutAssetB(t,e,n,s){return(0,E.calculate_liquidity_out_asset_b)(t,e,n,s)}};var{FeeUtils:gs}=O,se=class c{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;static fromPool(t){return new c(t.address,t.tokens,t.maxInRatio,t.maxOutRatio,t.minTradingLimit)}constructor(t,e,n,s,i){this.type="XYK",this.address=t,this.tokens=e,this.maxInRatio=n,this.maxOutRatio=s,this.minTradingLimit=i}validatePair(t,e){return!0}parsePair(t,e){let n=new Map(this.tokens.map(r=>[r.id,r])),s=n.get(t),i=n.get(e);if(s==null)throw new Error("Pool does not contain tokenIn");if(i==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,decimalsIn:s.decimals,decimalsOut:i.decimals,balanceIn:s.balance,balanceOut:i.balance,assetInEd:s.existentialDeposit,assetOutEd:i.existentialDeposit}}validateAndBuy(t,e,n){let s=this.calculateInGivenOut(t,e),i=this.calculateTradeFee(s,n),r=gs.toPct(n.exchangeFee),a=s+i,o=[];(e<this.minTradingLimit||s<t.assetInEd)&&o.push("InsufficientTradingAmount");let l=t.balanceOut/this.maxOutRatio;e>l&&o.push("MaxOutRatioExceeded");let u=t.balanceIn/this.maxInRatio;return a>u&&o.push("MaxInRatioExceeded"),{amountIn:a,calculatedIn:s,amountOut:e,feePct:r,errors:o}}validateAndSell(t,e,n){let s=this.calculateOutGivenIn(t,e),i=this.calculateTradeFee(s,n),r=gs.toPct(n.exchangeFee),a=s-i,o=[];(e<this.minTradingLimit||s<t.assetOutEd)&&o.push("InsufficientTradingAmount");let l=t.balanceIn/this.maxInRatio;e>l&&o.push("MaxInRatioExceeded");let u=t.balanceOut/this.maxOutRatio;return a>u&&o.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:s,amountOut:a,feePct:r,errors:o}}calculateInGivenOut(t,e){let n=ct.calculateInGivenOut(t.balanceIn.toString(),t.balanceOut.toString(),e.toString()),s=BigInt(n);return s<0n?0n:s}calculateOutGivenIn(t,e){let n=ct.calculateOutGivenIn(t.balanceIn.toString(),t.balanceOut.toString(),e.toString()),s=BigInt(n);return s<0n?0n:s}spotPriceInGivenOut(t){let e=ct.calculateSpotPrice(t.balanceOut.toString(),t.balanceIn.toString()),n=Math.pow(10,18-t.decimalsOut);return BigInt(e)/BigInt(n)}spotPriceOutGivenIn(t){let e=ct.calculateSpotPrice(t.balanceIn.toString(),t.balanceOut.toString()),n=Math.pow(10,18-t.decimalsIn);return BigInt(e)/BigInt(n)}calculateTradeFee(t,e){let n=ct.calculatePoolTradeFee(t.toString(),e.exchangeFee[0],e.exchangeFee[1]);return BigInt(n)}};var hs=require("polkadot-api"),bs=require("rxjs");var ie=class extends K{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(hs.CompatibilityLevel.BackwardsCompatible,e)}async loadPools(){let t=this.api.query.XYK.PoolAssets,[e,n]=await Promise.all([t.getEntries(),this.getPoolLimits()]),s=e.map(async({keyArgs:i,value:r})=>{let[a]=i,[o,l]=r,[u,p,d,m]=await Promise.all([this.getBalance(a,o),this.api.query.AssetRegistry.Assets.getValue(o),this.getBalance(a,l),this.api.query.AssetRegistry.Assets.getValue(l)]);return{address:a,type:"XYK",tokens:[{id:o,decimals:p?.decimals||this.decimals.get(o),existentialDeposit:p?.existential_deposit,balance:u.transferable,type:p?.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(s)}async getPoolFees(){return{exchangeFee:await this.getExchangeFee()}}async getExchangeFee(){return await this.api.constants.XYK.GetExchangeFee()}subscribeUpdates(){return bs.Subscription.EMPTY}};var Sn={};I(Sn,{AavePool:()=>re,AavePoolClient:()=>ae});var re=class c{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;static fromPool(t){return new c(t.address,t.tokens,t.maxInRatio,t.maxOutRatio,t.minTradingLimit)}constructor(t,e,n,s,i){this.type="Aave",this.address=t,this.tokens=e,this.maxInRatio=n,this.maxOutRatio=s,this.minTradingLimit=i}validatePair(t,e){return!0}parsePair(t,e){let n=new Map(this.tokens.map(r=>[r.id,r])),s=n.get(t),i=n.get(e);if(s==null)throw new Error("Pool does not contain tokenIn");if(i==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,balanceIn:s.balance,balanceOut:i.balance,decimalsIn:s.decimals,decimalsOut:i.decimals,assetInEd:0n,assetOutEd:0n}}validateAndBuy(t,e,n){let s=this.calculateInGivenOut(t,e),i=[];return e>t.balanceOut&&i.push("TradeNotAllowed"),{amountIn:s,calculatedIn:s,amountOut:e,feePct:0,errors:i}}validateAndSell(t,e,n){let s=this.calculateOutGivenIn(t,e),i=[];return s>t.balanceOut&&i.push("TradeNotAllowed"),{amountIn:e,calculatedOut:s,amountOut:s,feePct:0,errors:i}}calculateInGivenOut(t,e){return e}calculateOutGivenIn(t,e){return e}spotPriceInGivenOut(t){let e=Math.pow(10,t.decimalsOut);return BigInt(e)}spotPriceOutGivenIn(t){let e=Math.pow(10,t.decimalsIn);return BigInt(e)}calculateTradeFee(t,e){return 0n}};var fs=require("polkadot-api"),Ps=require("@polkadot-api/utils"),Y=require("rxjs"),Ss=require("viem");var ys=[{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:hi}=bt,bi=["Supply","Withdraw","Repay","Borrow"],ae=class extends K{getPoolType(){return"Aave"}async isSupported(){return!0}getPoolId(t,e){let n=t+"/"+e,s=new TextEncoder().encode(n.padEnd(32,"\0")),i=(0,Ps.toHex)(s);return(0,fs.AccountId)(63).dec(i)}getPoolLimits(){return{maxInRatio:0n,maxOutRatio:0n,minTradingLimit:0n}}async loadPools(){let e=(await this.api.apis.AaveTradeExecutor.pools()).map(async({reserve:n,atoken:s,liqudity_in:i,liqudity_out:r})=>{let[a,o,l,u]=await Promise.all([this.api.query.AssetRegistry.Assets.getValue(n),this.api.query.AssetRegistry.AssetLocations.getValue(n),this.api.query.AssetRegistry.Assets.getValue(s),this.api.query.AssetRegistry.AssetLocations.getValue(s)]);return{address:this.getPoolId(n,s),type:"Aave",tokens:[{id:n,decimals:a?.decimals,existentialDeposit:a?.existential_deposit,balance:i,location:o,type:a?.asset_type.type},{id:s,decimals:l?.decimals,existentialDeposit:l?.existential_deposit,balance:r,location:u,type:l?.asset_type.type}],...this.getPoolLimits()}});return Promise.all(e)}async getPoolDelta(t){let[e,n]=t.tokens,{liqudity_in:s,liqudity_out:i}=await this.api.apis.AaveTradeExecutor.pool(e.id,n.id);return t.tokens.map(r=>{let a=r.id===e.id?s:i;return{...r,balance:a}})}async getPoolFees(){return{}}getReserveH160Id(t){return t.type==="Erc20"?mt.findNestedKey(t.location,"AccountKey20").AccountKey20.key:hi.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,s=e.map(r=>r.asHex()),i=n.asHex();try{let{eventName:r,args:a}=(0,Ss.decodeEventLog)({abi:ys,topics:s,data:i}),o=a.reserve.toLowerCase();return{eventName:r,reserve:o,key:`${r}:${o}`}}catch{return}}subscribeRouterExecuted(){let e=this.store.pools.map(n=>n.tokens).map(([n,s])=>s).map(n=>n.id);return this.api.event.Router.Executed.watch().pipe((0,Y.map)(({payload:n})=>this.parseRouterLog(n)),(0,Y.filter)(({assetIn:n,assetOut:s})=>e.includes(n)||e.includes(s)),(0,Y.finalize)(()=>{this.log(this.getPoolType(),"unsub router executed")})).subscribe(({assetIn:n,assetOut:s,key:i})=>{this.log(this.getPoolType(),"[router:Executed]",i),this.store.update(async r=>{let a=[];for(let o of r){let[l,u]=o.tokens;if(u.id===n||u.id===s){let d=await this.getPoolDelta(o);a.push({...o,tokens:d})}}return a})})}subscribeEvmLog(){return this.api.event.EVM.Log.watch().pipe((0,Y.map)(({payload:t})=>this.parseEvmLog(t)),(0,Y.filter)(t=>t!==void 0),(0,Y.filter)(({eventName:t})=>bi.includes(t)),(0,Y.finalize)(()=>{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 s=[];for(let i of n){let[r]=i.tokens;if(this.getReserveH160Id(r).toLowerCase()===t){let o=await this.getPoolDelta(i);s.push({...i,tokens:o})}}return s})})}subscribeBalances(){return Y.Subscription.EMPTY}subscribeUpdates(){let t=new Y.Subscription;return t.add(this.subscribeRouterExecuted()),t.add(this.subscribeEvmLog()),t}};var Ft=class{static get(t){switch(t.type){case"Aave":return re.fromPool(t);case"XYK":return se.fromPool(t);case"Omnipool":return Zt.fromPool(t);case"LBP":return Qt.fromPool(t);case"Stableswap":return ee.fromPool(t);default:throw new Error("Pool type "+t.type+" is not supported yet")}}};var rt=require("rxjs");var Et=class extends N{evm;aave;omnipool;stableswap;xyk;lbp;active=new Set([]);pools=new Map([]);clients=[];aaveSub=rt.Subscription.EMPTY;omniSub=rt.Subscription.EMPTY;stableSub=rt.Subscription.EMPTY;xykSub=rt.Subscription.EMPTY;lbpSub=rt.Subscription.EMPTY;isReady=!1;isDestroyed=new rt.Subject;constructor(t,e){super(t),this.evm=e,this.lbp=new Jt(t,e),this.omnipool=new te(t,e),this.stableswap=new ne(t,e),this.xyk=new ie(t,e),this.aave=new ae(t,e),this.clients=[this.lbp,this.omnipool,this.stableswap,this.xyk,this.aave]}subscribe(t){return t.getSubscriber().pipe((0,rt.takeUntil)(this.isDestroyed)).subscribe(e=>{e.forEach(n=>{this.pools.set(n.address,n)})})}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}withLbp(){return this.lbpSub.unsubscribe(),this.lbpSub=this.subscribe(this.lbp),this.active.add("LBP"),this}withAave(){return this.aaveSub.unsubscribe(),this.aaveSub=this.subscribe(this.aave),this.active.add("Aave"),this}withXyk(t){return this.xyk.withOverride(t),this.xykSub.unsubscribe(),this.xykSub=this.subscribe(this.xyk),this.active.add("XYK"),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(s=>s.getPoolType()===e.type);if(n)return n.getPoolFees(t,e.address);throw new zt(e.type)}};var On={};I(On,{DEFAULT_BLOCK_TIME:()=>ws,DEFAULT_MIN_BUDGET:()=>xn,ORDER_MIN_BLOCK_PERIOD:()=>Ts,Router:()=>kt,TWAP_BLOCK_PERIOD:()=>ue,TWAP_MAX_DURATION:()=>_n,TWAP_MAX_PRICE_IMPACT:()=>In,TWAP_TX_MULTIPLIER:()=>du,TradeOrderError:()=>Tn,TradeOrderType:()=>Le,TradeRouteBuilder:()=>$,TradeRouter:()=>Ct,TradeScheduler:()=>Dt,TradeType:()=>Me});var oe=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 yi=10,le=class{isNotVisited(t,e){let n=!0;return e.forEach(s=>{(s[0]===t[0]||s[1]===t[1])&&(n=!1)}),n}findPaths(t,e,n){let s=[],i=new oe,r=[];for(r.push([e,""]),i.enqueue(r);i.size()>0;){let a=i.dequeue();if(!a||a.length>yi)continue;let o=a[a.length-1];(n===null||o[0]===n)&&s.push(a),t.get(o[0])?.forEach(u=>{if(this.isNotVisited(u,a)){let p=[...a];p.push(u),i.enqueue(p)}})}return s}findShortestPaths(t,e,n){let s=[],i=new oe,r=[];r.push([e,""]),i.enqueue(r);let a=1/0;for(;i.size()>0;){let o=i.dequeue();if(!o)continue;let l=o[o.length-1];if(l[0]===n){o.length<a?(a=o.length,s.length=0,s.push(o)):o.length===a&&s.push(o);continue}let u=t.get(l[0]);for(let p of u??[])this.isNotVisited(p,o)&&i.enqueue([...o,p])}return s}buildAndPopulateGraph(t,e){let n=new Map;for(let s of t)n.set(parseInt(s),[]);for(let[s,i,r]of e)n.get(i)?.push([r,s]);return n}};function wn(c){let t={};for(let e of c){let n=e.tokens.length;for(let s=0;s<n;s++){t[e.tokens[s].id]||(t[e.tokens[s].id]=[]);for(let i=0;i<n;i++){if(s==i)continue;let r=[e.address,e.tokens[s].id,e.tokens[i].id];t[e.tokens[s].id].push(r)}}}return t}var ce=class{getProposals(t,e,n){let s=n.filter(h=>h.type==="XYK"),i=n.filter(h=>h.type!=="XYK"),r=new Set(i.map(h=>h.tokens).flat().map(h=>h.id)),a=r.has(t),o=r.has(e),l=new le,u=h=>{let f=wn(h),P=Object.keys(f),v=P.flatMap(w=>f[w]);return l.buildAndPopulateGraph(P,v)};if(!a&&!o){let h=s.filter(v=>v.tokens.find(w=>w.id===t)||v.tokens.find(w=>w.id===e)),f=u(h),P=l.findPaths(f,t,e);return this.parsePaths(P)}if(a&&o){let h=u(i),f=l.findPaths(h,t,e);return this.parsePaths(f)}let p=a?e:t,d=s.filter(h=>h.tokens.some(f=>f.id===p));if(d.length===0)return[];let m=[...i,...d],g=u(m),b=l.findPaths(g,t,e);return this.parsePaths(b)}parsePaths(t){let e=[];for(let n of t){let s=[];for(let i=0;i<n.length;i++){let r=n[i],a=n[i+1];if(a==null)break;s.push(this.toEdge(r,a))}e.push(s)}return e}toEdge(t,e){return[e[1],t[0],e[0]]}};var kt=class{routeSuggester;routeProposals;ctx;filter={};constructor(t){this.ctx=t,this.routeSuggester=new ce,this.routeProposals=new Map}async withFilter(t){this.filter=t||{}}buildRouteKey(t,e,n){return`${t}->${e}::${n.length}`}applyPoolFilter(t){let{useOnly:e=[],exclude:n=[]}=this.filter,s=new Set(e),i=new Set(n);return t.filter(r=>i.has(r.type)?!1:s.size>0?s.has(r.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(s=>s!==t).map(s=>this.getRoutes(s,t)))).filter(s=>s.length>0).map(([s])=>s[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 s=this.getAssets(n);if(!s.has(t))throw new Error(t+" is not supported asset");if(!s.has(e))throw new Error(e+" is not supported asset");return this.toPoolsMap(n)}getAssets(t){let e=t.map(n=>n.tokens.map(s=>s.id)).flat().sort((n,s)=>n>s?1:-1);return new Set(e)}getPaths(t,e,n){let s=this.toPoolsMap(n);return this.getProposals(t,e,n).filter(r=>this.validPath(r,s)).map(r=>this.toHops(r,s))}getProposals(t,e,n){let s=this.buildRouteKey(t,e,n);if(this.routeProposals.has(s))return this.routeProposals.get(s);let i=this.routeSuggester.getProposals(t,e,n);return this.routeProposals.set(s,i),i}validPath(t,e){return t.length>0&&t.map(n=>this.validEdge(n,e)).reduce((n,s)=>n&&s)}validEdge([t,e,n],s){return s.get(t)?.validatePair(e,n)||!1}toPoolsMap(t){return new Map(t.map(e=>[e.address,Ft.get(e)]))}toHops(t,e){return t.map(([n,s,i])=>{let r=e.get(n);return{poolAddress:n,poolId:r?.id,pool:r?.type,assetIn:s,assetOut:i}})}};var Me=(e=>(e.Buy="Buy",e.Sell="Sell",e))(Me||{}),Le=(n=>(n.Dca="Dca",n.TwapSell="TwapSell",n.TwapBuy="TwapBuy",n))(Le||{}),Tn=(n=>(n.OrderTooSmall="OrderTooSmall",n.OrderTooBig="OrderTooBig",n.OrderImpactTooBig="OrderImpactTooBig",n))(Tn||{});var{FeeUtils:vs}=O,Ct=class extends kt{mlr;poolsSnapshot;constructor(t){super(t),this.mlr=new Map}buildCtxSync(t,e){let n=this.poolsSnapshot,s=super.validateInput(t,e,n),i=super.getPaths(t,e,n);if(!i.length)throw new Xt(t,e);return{paths:i,pools:n,poolsMap:s}}async withCtx(t,e,n){this.poolsSnapshot||(this.poolsSnapshot=await super.getPools());let s=this.buildCtxSync(t,e);return n(s)}isDirectTrade(t){return t.length==1}findBestSellRoute(t){let e=t.sort((n,s)=>{let i=n[n.length-1].amountOut,r=s[s.length-1].amountOut;return i>r?-1:1});return e.find(n=>n.every(s=>s.errors.length==0))||e[0]}getRouteFeeRange(t){if(t.filter(n=>n.tradeFeeRange).length>0){let n=t.map(i=>i.tradeFeeRange?.[0]??i.tradeFeePct).reduce((i,r)=>i+r),s=t.map(i=>i.tradeFeeRange?.[1]??i.tradeFeePct).reduce((i,r)=>i+r);return[n,s]}}getPoolFeeRange(t){let e=t.min?vs.toPct(t.min):void 0,n=t.max?vs.toPct(t.max):void 0;if(e&&n)return[e,n]}async getBestSell(t,e,n){return this.getSell(t,e,n)}getSellSpot(t){let e=t[t.length-1];if(t.length===1)return e.spotPrice;let n=t.map(a=>a.assetOutDecimals).reduce((a,o)=>a+o),s=t.map(a=>a.spotPrice).reduce((a,o)=>a*o),i=n-e.assetOutDecimals,r=Math.pow(10,i);return s/BigInt(r)}async getSell(t,e,n,s){return this.withCtx(t,e,async({paths:i,poolsMap:r})=>{let a;if(s)a=await this.toSellSwaps(n,s,r);else{let o=i.map(u=>this.toSellSwaps(n,u,r)),l=await Promise.all(o);a=this.findBestSellRoute(l)}return this.buildSell(r,a)})}async getSells(t,e,n){return this.withCtx(t,e,async({paths:s,poolsMap:i})=>{let r=s.map(o=>this.toSellSwaps(n,o,i));return(await Promise.all(r)).filter(o=>o.every(l=>l.errors.length==0)).map(o=>this.buildSell(i,o)).sort((o,l)=>o.amountOut>l.amountOut?-1:1)})}buildSell(t,e){let n=e[0],s=e[e.length-1],i=this.isDirectTrade(e),r=this.getSellSpot(e),a=s.amountOut,o=i?s.calculatedOut:this.calculateDelta0Y(n.amountIn,e,t),l=o-a,u=this.getRouteFeeRange(e),p=i?s.tradeFeePct:_.calculateSellFee(o,a),d=Math.pow(10,n.assetInDecimals),m=n.amountIn*r/BigInt(d),g=_.calculateDiffToRef(o,m);return{type:"Sell",amountIn:n.amountIn,amountOut:s.amountOut,spotPrice:r,tradeFee:l,tradeFeePct:p,tradeFeeRange:u,priceImpactPct:g,swaps:e,toHuman(){return{type:"Sell",amountIn:S.toDecimal(n.amountIn,n.assetInDecimals),amountOut:S.toDecimal(s.amountOut,s.assetOutDecimals),spotPrice:S.toDecimal(r,s.assetOutDecimals),tradeFee:S.toDecimal(l,s.assetOutDecimals),tradeFeePct:p,tradeFeeRange:u,priceImpactPct:g,swaps:e.map(b=>b.toHuman())}}}}calculateDelta0Y(t,e,n){let s=[];for(let i=0;i<e.length;i++){let r=e[i],a=n.get(r.poolAddress);if(a==null)throw new Error("Pool does not exit");let o=a.parsePair(r.assetIn,r.assetOut),l;i>0?l=s[i-1]:l=t;let u=a.calculateOutGivenIn(o,l);s.push(u)}return s[s.length-1]}async calculateMostLiquidRoute(t,e,n){let{paths:s,pools:i,poolsMap:r}=n,l=i.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],u=_.getFraction(l,.1),p=await Promise.all(s.map(b=>this.toSellSwaps(u,b,r))),m=this.findBestSellRoute(p).map(b=>({poolAddress:b.poolAddress,poolId:b?.poolId,pool:b.pool,assetIn:b.assetIn,assetOut:b.assetOut})),g=this.buildRouteKey(t,e,i);return this.mlr.set(g,m),m}async toSellSwaps(t,e,n){let s=[];for(let i=0;i<e.length;i++){let r=e[i],a=n.get(r.poolAddress);if(a==null)throw new Error("Pool does not exit");let o=a.parsePair(r.assetIn,r.assetOut),l;i>0?l=s[i-1].amountOut:l=typeof t=="string"?S.toBigInt(t,o.decimalsIn):t;let u=await this.ctx.getPoolFees(o,a),{amountOut:p,calculatedOut:d,feePct:m,errors:g}=a.validateAndSell(o,l,u),b=this.getPoolFeeRange(u),h=a.spotPriceOutGivenIn(o),f=Math.pow(10,o.decimalsIn),P=l*h/BigInt(f),v=_.calculateDiffToRef(d,P);s.push({...r,assetInDecimals:o.decimalsIn,assetOutDecimals:o.decimalsOut,amountIn:l,amountOut:p,calculatedOut:d,spotPrice:h,tradeFeePct:m,tradeFeeRange:b,priceImpactPct:v,errors:g,isSupply(){return a.type==="Aave"&&a.tokens[0].id===r.assetIn},isWithdraw(){return a.type==="Aave"&&a.tokens[1].id===r.assetIn},toHuman(){return{...r,amountIn:S.toDecimal(l,o.decimalsIn),amountOut:S.toDecimal(p,o.decimalsOut),calculatedOut:S.toDecimal(d,o.decimalsOut),spotPrice:S.toDecimal(h,o.decimalsOut),tradeFeePct:m,tradeFeeRange:b,priceImpactPct:v,errors:g}}})}return s}async getMostLiquidRoute(t,e){return this.withCtx(t,e,async n=>{let s=this.buildRouteKey(t,e,n.pools),i=this.mlr.get(s);return i||this.calculateMostLiquidRoute(t,e,n)})}async getSpotPrice(t,e){return this.withCtx(t,e,async n=>{let{pools:s,poolsMap:i}=n,r=this.buildRouteKey(t,e,s),a=this.mlr.get(r);a||(a=await this.calculateMostLiquidRoute(t,e,n));let o=await this.toSellSwaps("1",a,i),l=this.getSellSpot(o),u=o[o.length-1].assetOutDecimals;return{amount:l,decimals:u}}).catch(()=>{})}findBestBuyRoute(t){let e=t.sort((n,s)=>{let i=n[0].amountIn,r=s[0].amountIn;return i>r?1:-1});return e.find(n=>n.every(s=>s.errors.length==0))||e[0]}async getBestBuy(t,e,n){return this.getBuy(t,e,n)}getBuySpot(t){let e=t[0];if(t.length===1)return e.spotPrice;let n=t.map(a=>a.assetInDecimals).reduce((a,o)=>a+o),s=t.map(a=>a.spotPrice).reduce((a,o)=>a*o),i=n-e.assetInDecimals,r=Math.pow(10,i);return s/BigInt(r)}async getBuy(t,e,n,s){return this.withCtx(t,e,async({paths:i,poolsMap:r})=>{let a;if(s)a=await this.toBuySwaps(n,s,r);else{let o=i.map(u=>this.toBuySwaps(n,u,r)),l=await Promise.all(o);a=this.findBestBuyRoute(l)}return this.buildBuy(r,a)})}async getBuys(t,e,n){return this.withCtx(t,e,async({paths:s,poolsMap:i})=>{let r=s.map(o=>this.toBuySwaps(n,o,i));return(await Promise.all(r)).filter(o=>o.every(l=>l.errors.length==0)).map(o=>this.buildBuy(i,o)).sort((o,l)=>o.amountIn>l.amountIn?1:-1)})}buildBuy(t,e){let n=e[e.length-1],s=e[0],i=this.isDirectTrade(e),r=this.getBuySpot(e),a=s.amountIn,o=i?s.calculatedIn:this.calculateDelta0X(n.amountOut,e,t),l=a-o,u=this.getRouteFeeRange(e),p=i?s.tradeFeePct:_.calculateBuyFee(o,a),d=Math.pow(10,n.assetOutDecimals),m=n.amountOut*r/BigInt(d),g;return o===0n?g=-100:g=_.calculateDiffToRef(m,o),{type:"Buy",amountOut:n.amountOut,amountIn:s.amountIn,spotPrice:r,tradeFee:l,tradeFeePct:p,tradeFeeRange:u,priceImpactPct:g,swaps:e,toHuman(){return{type:"Buy",amountOut:S.toDecimal(n.amountOut,n.assetOutDecimals),amountIn:S.toDecimal(s.amountIn,s.assetInDecimals),spotPrice:S.toDecimal(r,s.assetInDecimals),tradeFee:S.toDecimal(l,s.assetInDecimals),tradeFeePct:p,tradeFeeRange:u,priceImpactPct:g,swaps:e.map(b=>b.toHuman())}}}}calculateDelta0X(t,e,n){let s=[];for(let i=e.length-1;i>=0;i--){let r=e[i],a=n.get(r.poolAddress);if(a==null)throw new Error("Pool does not exit");let o=a.parsePair(r.assetIn,r.assetOut),l;i==e.length-1?l=t:l=s[0];let u=a.calculateInGivenOut(o,l);s.unshift(u)}return s[0]}async toBuySwaps(t,e,n){let s=[];for(let i=e.length-1;i>=0;i--){let r=e[i],a=n.get(r.poolAddress);if(a==null)throw new Error("Pool does not exit");let o=a.parsePair(r.assetIn,r.assetOut),l;i==e.length-1?l=typeof t=="string"?S.toBigInt(t,o.decimalsOut):t:l=s[0].amountIn;let u=await this.ctx.getPoolFees(o,a),{amountIn:p,calculatedIn:d,feePct:m,errors:g}=a.validateAndBuy(o,l,u),b=this.getPoolFeeRange(u),h=a.spotPriceInGivenOut(o),f=Math.pow(10,o.decimalsOut),P=l*h/BigInt(f),v;d===0n?v=-100:v=_.calculateDiffToRef(P,d),s.unshift({...r,assetInDecimals:o.decimalsIn,assetOutDecimals:o.decimalsOut,amountOut:l,amountIn:p,calculatedIn:d,spotPrice:h,tradeFeePct:m,tradeFeeRange:b,priceImpactPct:v,errors:g,isSupply(){return a.type==="Aave"&&a.tokens[0].id===r.assetIn},isWithdraw(){return a.type==="Aave"&&a.tokens[1].id===r.assetIn},toHuman(){return{...r,amountOut:S.toDecimal(l,o.decimalsOut),amountIn:S.toDecimal(p,o.decimalsIn),calculatedIn:S.toDecimal(d,o.decimalsIn),spotPrice:S.toDecimal(h,o.decimalsIn),tradeFeePct:m,tradeFeeRange:b,priceImpactPct:v,errors:g}}})}return s}};var ws=6e3,xn=1000000000000000n,ue=6,In=-5,_n=216e5,du=3,Ts=6;var An=require("polkadot-api");var $=class{static build(t){return t.map(({assetIn:e,assetOut:n,pool:s,poolId:i})=>s==="Stableswap"?{pool:(0,An.Enum)("Stableswap",i),asset_in:e,asset_out:n}:{pool:(0,An.Enum)(s),asset_in:e,asset_out:n})}};var Dt=class{schedulerOptions;router;constructor(t,e={}){this.router=t,this.schedulerOptions=Object.freeze({blockTime:e.blockTime??6e3,minBudgetInNative:e.minBudgetInNative??xn})}get blockTime(){return this.schedulerOptions.blockTime}get minOrderBudget(){return this.schedulerOptions.minBudgetInNative}async getDcaOrder(t,e,n,s,i){let[r,a]=await Promise.all([this.getMinimumOrderBudget(t),this.router.getBestSell(t,e,n)]),{amountIn:o,swaps:l,priceImpactPct:u}=a,p=l[0],d=l[l.length-1],{assetInDecimals:m}=p,{assetOutDecimals:g}=d,b=Math.abs(u),h=this.getMinimumTradeCount(o,r),f=this.getOptimalTradeCount(b),P=i?Math.round(s/i):f,v=Math.ceil(s/h),w=Math.round(s/f),k=Math.round(s/P),q=o/BigInt(P),C=await this.router.getBestSell(t,e,q),U=o<r,Z=[];U&&Z.push("OrderTooSmall");let tt=C.amountOut*BigInt(P),H=this.toBlockPeriod(k),ut=C.tradeFee*BigInt(P),qt=$.build(l),ht={assetIn:t,assetOut:e,errors:Z,frequencyMin:v,frequencyOpt:w,frequency:k,tradeCount:P,tradeFee:ut,tradeImpactPct:C.priceImpactPct,tradePeriod:H,tradeRoute:qt,type:"Dca"};return{...ht,amountIn:o,amountOut:tt,tradeAmountIn:C.amountIn,tradeAmountOut:C.amountOut,toHuman(){return{...ht,amountIn:S.toDecimal(o,m),amountOut:S.toDecimal(tt,g),tradeAmountIn:S.toDecimal(C.amountIn,m),tradeAmountOut:S.toDecimal(C.amountOut,g)}}}}async getMinimumOrderBudget(t){if(0===t)return this.minOrderBudget;let e=await this.router.getSpotPrice(0,t),n=10n**BigInt(12);if(e)return this.minOrderBudget*e.amount/n;throw new Error("Unable to calculate order budget")}getMinimumTradeCount(t,e){let n=e*2n/10n;if(n===0n)return 0;let s=t+n/2n;return Number(s/n)}getOptimalTradeCount(t){let e=Math.round(t*10)||1;return Math.max(e,3)}async getTwapSellOrder(t,e,n){let[s,i]=await Promise.all([this.getMinimumOrderBudget(t),this.router.getBestSell(t,e,n)]),{amountIn:r,swaps:a,priceImpactPct:o}=i,l=a[0],u=a[a.length-1],{assetInDecimals:p}=l,{assetOutDecimals:d}=u,m=Math.abs(o),g=this.getTwapTradeCount(m),b=r/BigInt(g),h=await this.router.getBestSell(l.assetIn,u.assetOut,b),f=g===1,P=r<s,v=h.priceImpactPct<-5,w=[];P||f?w.push("OrderTooSmall"):v&&w.push("OrderImpactTooBig");let k=h.amountOut*BigInt(g),q=h.tradeFee*BigInt(g),C=$.build(a),U={assetIn:t,assetOut:e,errors:w,tradeCount:g,tradeImpactPct:h.priceImpactPct,tradePeriod:6,tradeRoute:C,type:"TwapSell"};return{...U,amountIn:r,amountOut:k,tradeAmountIn:h.amountIn,tradeAmountOut:h.amountOut,tradeFee:q,toHuman(){return{...U,amountIn:S.toDecimal(r,p),amountOut:S.toDecimal(k,d),tradeAmountIn:S.toDecimal(h.amountIn,p),tradeAmountOut:S.toDecimal(h.amountOut,d),tradeFee:S.toDecimal(q,d)}}}}async getTwapBuyOrder(t,e,n){let[s,i]=await Promise.all([this.getMinimumOrderBudget(t),this.router.getBestBuy(t,e,n)]),{amountOut:r,swaps:a,priceImpactPct:o}=i,l=a[0],u=a[a.length-1],{assetInDecimals:p}=l,{assetOutDecimals:d}=u,m=Math.abs(o),g=this.getTwapTradeCount(m),b=r/BigInt(g),h=await this.router.getBestBuy(l.assetIn,u.assetOut,b),f=h.amountIn*BigInt(g),P=g===1,v=f<s,w=h.priceImpactPct<-5,k=[];v||P?k.push("OrderTooSmall"):w&&k.push("OrderImpactTooBig");let q=h.tradeFee*BigInt(g),C=$.build(a),U={assetIn:t,assetOut:e,errors:k,tradeCount:g,tradeImpactPct:h.priceImpactPct,tradePeriod:6,tradeRoute:C,type:"TwapBuy"};return{...U,amountIn:f,amountOut:r,tradeAmountIn:h.amountIn,tradeAmountOut:h.amountOut,tradeFee:q,toHuman(){return{...U,amountIn:S.toDecimal(f,p),amountOut:S.toDecimal(r,d),tradeAmountIn:S.toDecimal(h.amountIn,p),tradeAmountOut:S.toDecimal(h.amountOut,d),tradeFee:S.toDecimal(q,p)}}}}getTwapTradeCount(t){let e=this.getOptimalTradeCount(t);if(this.getTwapExecutionTime(e)>216e5){let s=216e5/(this.blockTime*6);return Math.round(s)}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 Rn={};I(Rn,{BIG_10:()=>Os,BIG_BILL:()=>Bn,StakingApi:()=>pe,StakingClient:()=>me});var X=require("@galacticcouncil/math-staking"),z=at(require("big.js"));var qe={none:.1,locked1x:1,locked2x:2,locked3x:3,locked4x:4,locked5x:5,locked6x:6},xs=c=>Object.keys(qe).includes(c);var Is=require("polkadot-api"),_s=require("@polkadot-api/utils");function As(c){let t=("modl"+c).padEnd(32,"\0"),e=new TextEncoder().encode(t),n=(0,_s.toHex)(e);return(0,Is.AccountId)(63).dec(n)}var fi="20000000000000000",Pi="2000",Os=(0,z.default)(10),Bn=(0,z.default)(Os.pow(12)),pe=class{client;balanceClient;constructor(t,e){this.client=t,this.balanceClient=e}async getPotBalance(){let t=await this.client.getPalletId(),e=As(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 s=e.created_at,i=await n.reduce(async(r,[a,o])=>{let l=await r,u=a,p=o.amount,d=o.conviction.toString().toLowerCase(),m=await this.client.getReferendumInfo(u);return m&&(m.type==="Approved"||m.type==="Rejected")&&xs(d)&&l.push({id:u,amount:p,conviction:d}),l},Promise.resolve([]));return{stake:e.stake,rewardPerStake:e.reward_per_stake,createdAt:s,actionPoints:e.action_points,accumulatedUnpaidRewards:e.accumulated_unpaid_rewards,accumulatedSlashPoints:e.accumulated_slash_points,accumulatedLockedRewards:e.accumulated_locked_rewards,votes:i}}async getStake(t){let e=await this.client.getNFTCollectionId(),[n,s]=await Promise.all([this.client.getStaking(),this.client.getUniques(t,e)]),i=s.find(r=>r)?.itemId;return{totalStake:n?.total_stake,accumulatedRewardPerStake:n?.accumulated_reward_per_stake,potReservedBalance:n?.pot_reserved_balance,positionId:i,stakePosition:i?await this.getStakingPosition(i):void 0}}getCurrentActionPoints(t,e,n,s){let i=(0,z.default)(0),r=(0,z.default)(0),a=qe.locked6x,o=(0,z.default)(n.toString()).mul(a),l=100,u=[];t.forEach(m=>{let g=qe[m.conviction],b=s.includes(m.id.toString());b&&u.push(m.id.toString());let h=(0,z.default)(m.amount.toString()).mul(l).div(o);i=i.plus(Math.floor(h.mul(g).toNumber())),r=r.plus(Math.floor(h.mul(b?a:g).toNumber()))});let p=Math.floor((0,z.default)(n.toString()).mul(a).mul(l).div(o).toNumber());s.forEach(m=>{u.includes(m)||(r=r.plus(p))});let d={democracyVote:1};return i=i.mul(d.democracyVote),i=i.plus(e.toString()||"0"),r=r.mul(d.democracyVote),r=r.plus(e.toString()||"0"),{currentActionPoints:i.toString(),maxActionPoints:r.toString()}}async getRewards(t,e,n){let s=await this.getStake(t),{potReservedBalance:i,accumulatedRewardPerStake:r,totalStake:a,stakePosition:o}=s;if(!o)return;let[l,u,p,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=(0,z.default)(l.transferable.toString()).minus(i.toString()),f=h.gt(0)&&a>0?(0,X.calculate_accumulated_rps)(r.toString(),h.toString(),a.toString()):r.toString(),P=(0,X.calculate_period_number)(u.toString(),n,b),v=(0,X.calculate_period_number)(u.toString(),o.createdAt.toString(),b),w=(0,X.calculate_rewards)(f,o.rewardPerStake.toString(),o.stake.toString()),k=this.getCurrentActionPoints(o.votes,o.actionPoints,o.stake,e),q=(0,X.calculate_points)(v,P,d.toString(),m.toString(),k.currentActionPoints,g.toString(),o.accumulatedSlashPoints.toString()),C=(0,X.sigmoid)(q,fi,Pi),U=(0,z.default)(w).plus(o.accumulatedUnpaidRewards.toString()).plus(o.accumulatedLockedRewards.toString());if((0,z.default)(P).minus(v).lte(p.toString()))return{rewards:"0"};let Z=(0,X.calculate_percentage_amount)(U.toString(),C),tt=(0,z.default)(o.accumulatedLockedRewards.toString()),H=tt.gt(Z)?tt:(0,z.default)(Z);return{rewards:H.div(Bn).toString(),maxRewards:U.div(Bn).toString(),allocatedRewardsPercentage:H.div(U).mul(100).toNumber()}}};var me=class extends N{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:r})=>{let[a,o,l]=r;return{address:a,collectionId:o,itemId:l}})}async getStakingPositionsValue(t){return await this.api.query.Staking.Positions.getValue(t)}async getStakingVotes(t){return await this.api.query.Staking.Votes.getValue(t)}async getReferendumInfo(t){return await this.api.query.Referenda.ReferendumInfoFor.getValue(t)}async 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 En={};I(En,{TxBuilderFactory:()=>Lt});var Fn=require("polkadot-api");function Bs(c){let t=[],e=c;for(;e&&typeof e=="object"&&"type"in e;)t.push(e.type),e=e.value;return t.join(".")}var Mt=class extends N{evm;evmClient;balanceClient;aaveUtils;constructor(t,e){super(t),this.evm=e,this.evmClient=e.getWsProvider(),this.balanceClient=new nt(t),this.aaveUtils=new ft(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:ze})}async dryRun(t,e){let n=(0,Fn.Enum)("Signed",t),s=(0,Fn.Enum)("system",n),r=await this.client.getUnsafeApi().apis.DryRunApi.dry_run_call(s,e.decodedCall),a=r.success&&!r.value.execution_result.success?r.value.execution_result.value.error:null;if(a){let o=Bs(a.value);throw new Error("Dry run execution error!",{cause:o})}return r}isDirectOmnipoolTrade(t){return t.length===1&&t[0].pool==="Omnipool"}};var Ne=class extends Mt{_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:s}=e[0],i=await this.balanceClient.getBalance(this.beneficiary,s);return t>=i.transferable-5n?this.buildSellAllTx():this.buildSellTx()}async buildBuyTx(){let{amountIn:t,amountOut:e,swaps:n}=this.trade,s=n[0],i=n[n.length-1],r=_.getFraction(t,this.slippagePct),a=s.assetIn,o=i.assetOut,l=t+r,u;return this.isDirectOmnipoolTrade(n)?u=this.api.tx.Omnipool.buy({asset_in:a,asset_out:o,amount:e,max_sell_amount:l}):u=this.api.tx.Router.buy({asset_in:a,asset_out:o,amount_out:e,max_amount_in:l,route:$.build(n)}),this.wrapTx("RouterBuy",u)}async buildSellTx(){let{amountIn:t,amountOut:e,swaps:n}=this.trade,s=n[0],i=n[n.length-1],r=_.getFraction(e,this.slippagePct),a=s.assetIn,o=i.assetOut,l=e-r,u;return this.isDirectOmnipoolTrade(n)?u=this.api.tx.Omnipool.sell({asset_in:a,asset_out:o,amount:t,min_buy_amount:l}):u=this.api.tx.Router.sell({asset_in:a,asset_out:o,amount_in:t,min_amount_out:l,route:$.build(n)}),s.isWithdraw()&&await this.aaveUtils.hasBorrowPositions(this.beneficiary)&&(u=await this.dispatchWithExtraGas(u)),this.wrapTx("RouterSell",u)}async buildSellAllTx(){let{amountOut:t,swaps:e}=this.trade,n=e[0],s=e[e.length-1],i=_.getFraction(t,this.slippagePct),r=n.assetIn,a=s.assetOut,o=t-i,l=this.api.tx.Router.sell_all({asset_in:r,asset_out:a,min_amount_out:o,route:$.build(e)});return n.isWithdraw()&&await this.aaveUtils.hasBorrowPositions(this.beneficiary)&&(l=await this.dispatchWithExtraGas(l)),this.wrapTx("RouterSellAll",l)}};var Ue=require("polkadot-api");var Ve=class extends Mt{_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:s,tradePeriod:i,tradeRoute:r}=this.order,a=this.api.tx.DCA.schedule({schedule:{owner:this.beneficiary,period:i,max_retries:this.maxRetries,total_amount:t,slippage:this.slippagePct*1e4,stability_threshold:void 0,order:(0,Ue.Enum)("Sell",{asset_in:e,asset_out:n,amount_in:s,min_amount_out:0n,route:r})},start_execution_block:void 0});return this.wrapTx("DcaSchedule",a)}buildTwapSellTx(){let{amountIn:t,assetIn:e,assetOut:n,tradeAmountIn:s,tradeAmountOut:i,tradePeriod:r,tradeRoute:a}=this.order,o=_.getFraction(i,this.slippagePct),l=i-o,u=this.api.tx.DCA.schedule({schedule:{owner:this.beneficiary,period:r,max_retries:this.maxRetries,total_amount:t,slippage:this.slippagePct*1e4,stability_threshold:void 0,order:(0,Ue.Enum)("Sell",{asset_in:e,asset_out:n,amount_in:s,min_amount_out:l,route:a})},start_execution_block:void 0});return this.wrapTx("DcaSchedule.twapSell",u)}buildTwapBuyTx(){let{amountIn:t,assetIn:e,assetOut:n,tradeAmountIn:s,tradeAmountOut:i,tradePeriod:r,tradeRoute:a}=this.order,o=_.getFraction(s,this.slippagePct),l=s+o,u=this.api.tx.DCA.schedule({schedule:{owner:this.beneficiary,period:r,max_retries:this.maxRetries,total_amount:t,slippage:this.slippagePct*1e4,stability_threshold:void 0,order:(0,Ue.Enum)("Buy",{asset_in:e,asset_out:n,amount_out:i,max_amount_in:l,route:a})},start_execution_block:void 0});return this.wrapTx("DcaSchedule.twapBuy",u)}};var Lt=class{client;evmClient;constructor(t,e){this.client=t,this.evmClient=e}trade(t){return new Ne(this.client,this.evmClient).setTrade(t)}order(t){return new Ve(this.client,this.evmClient).setOrder(t)}};async function Si(c){let t=new At(c),e=new Kt(c),[n,s]=await Promise.all([t.getBlockTime(),t.getMinOrderBudget()]),i=new Et(c,e).withAave().withOmnipool().withStableswap().withXyk(),r=new nt(c),a=new me(c),o=new $t(c),l=new ft(e),u=new Ct(i),p=new Dt(u,{blockTime:n,minBudgetInNative:s}),d=new pe(a,r),m=new jt(o,r,{blockTime:n});return{api:{aave:l,router:u,scheduler:p,staking:d,farm:m},client:{asset:new _t(c),balance:r,evm:e},ctx:{pool:i},tx:new Lt(c,e),destroy:()=>{i.destroy()}}}0&&(module.exports={QueryBus,aave,api,big,client,const:null,createSdkContext,erc20,error,evm,farm,fmt,h160,json,math,pool,sor,staking,tx,xc});
1
+ "use strict";var Ms=Object.create;var ye=Object.defineProperty;var Ls=Object.getOwnPropertyDescriptor;var qs=Object.getOwnPropertyNames;var Ns=Object.getPrototypeOf,Us=Object.prototype.hasOwnProperty;var Ln=(c,t)=>()=>(c&&(t=c(c=0)),t);var I=(c,t)=>{for(var e in t)ye(c,e,{get:t[e],enumerable:!0})},be=(c,t,e,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of qs(t))!Us.call(c,s)&&s!==e&&ye(c,s,{get:()=>t[s],enumerable:!(n=Ls(t,s))||n.enumerable});return c},wt=(c,t,e)=>(be(c,t,"default"),e&&be(e,t,"default")),ot=(c,t,e)=>(e=c!=null?Ms(Ns(c)):{},be(t||!c||!c.__esModule?ye(e,"default",{value:c,enumerable:!0}):e,c)),Vs=c=>be(ye({},"__esModule",{value:!0}),c);var Nt={};var Un=Ln(()=>{wt(Nt,require("@polkadot-api/ws-provider/node"))});var Ut={};var Vn=Ln(()=>{wt(Ut,require("@polkadot-api/ws-provider/web"))});var vi={};I(vi,{QueryBus:()=>Yt,aave:()=>ln,api:()=>Ye,big:()=>S,client:()=>cn,const:()=>Je,createSdkContext:()=>Si,erc20:()=>yt,error:()=>pn,evm:()=>dn,farm:()=>yn,fmt:()=>B,h160:()=>Wt,json:()=>mt,math:()=>_,pool:()=>Tn,sor:()=>Rn,staking:()=>En,tx:()=>Cn,xc:()=>sn});module.exports=Vs(vi);var Ye={};I(Ye,{Papi:()=>N,getWs:()=>Gs});var Nn=require("@galacticcouncil/descriptors");function qn(c){switch(c){case!0:case"true":case 1:case"1":case"on":case"yes":return!0;default:return!1}}var N=class{client;api;constructor(t){this.client=t,this.api=this.client.getTypedApi(Nn.hydration)}log(t,...e){let n=typeof window>"u"?process.env.GC_DEBUG:window.localStorage.getItem("gc.debug");qn(n)&&console.log(t,...e)}};var Gn=require("polkadot-api"),Wn=require("polkadot-api/polkadot-sdk-compat"),Gs=async c=>{let t=typeof c=="string"?c.split(","):c,s=(typeof window>"u"?(await Promise.resolve().then(()=>(Un(),Nt))).getWsProvider:(await Promise.resolve().then(()=>(Vn(),Ut))).getWsProvider)(t);return(0,Gn.createClient)((0,Wn.withPolkadotSdkCompat)(s))};var ln={};I(ln,{AAVE_GAS_LIMIT:()=>Ke,AAVE_LENDING_POOL_ADDRESS:()=>Se,AAVE_POOL_ABI:()=>ze,AAVE_POOL_DATA_PROVIDER:()=>Pe,AAVE_POOL_DATA_PROVIDER_ABI:()=>fe,AAVE_POOL_PROXY:()=>Xe,AAVE_ROUNDING_THRESHOLD:()=>Li,AAVE_UINT_256_MAX:()=>Ws,AaveClient:()=>Vt,AaveUtils:()=>Pt});var ze=[{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 fe=[{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 Xe="0x1b02E051683b5cfaC5929C25E84adb26ECf87B38",Pe="0x112b087b60C1a166130d59266363C45F8aa99db0",Se="0xf3Ba4D1b50f78301BDD7EAEa9B67822A15FCA691",Ke=1000000n,Li=5,Ws=BigInt("0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");var Vt=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:fe,address:Pe,args:[Se],functionName:"getReservesData"})}async getUserReservesData(t){return await this.client.readContract({abi:fe,address:Pe,args:[Se,t],functionName:"getUserReservesData"})}async getUserAccountData(t){return await this.client.readContract({abi:ze,address:Xe,args:[t],functionName:"getUserAccountData"})}};var ct=ot(require("big.js"));var S={};I(S,{asBigInt:()=>zs,toBigInt:()=>Ys,toDecimal:()=>Hs});var pt=ot(require("big.js"));pt.default.NE=-18;function Hs(c,t,e=6,n){let s=(0,pt.default)(c.toString()),i=(0,pt.default)(10).pow(t);return s.div(i).round(e,n).toString()}function Ys(c,t){let e=(0,pt.default)(10).pow(t),s=(0,pt.default)(c).mul(e).toFixed(0,pt.default.roundDown);return BigInt(s)}function zs(c){return BigInt(c.round(0,pt.default.roundDown).toFixed(0))}var yt={};I(yt,{ERC20:()=>je});var je=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 B={};I(B,{FeeUtils:()=>Ze,shiftNeg:()=>js});var Hn=ot(require("big.js"));var Je={};I(Je,{HUB_ASSET_ID:()=>Gt,HYDRATION_OMNIPOOL_ADDRESS:()=>Ks,HYDRATION_PARACHAIN_ID:()=>Xs,HYDRATION_SS58_PREFIX:()=>H,PERBILL_DENOMINATOR:()=>$e,PERMILL_DENOMINATOR:()=>Tt,RUNTIME_DECIMALS:()=>F,SYSTEM_ASSET_DECIMALS:()=>Qe,SYSTEM_ASSET_ID:()=>E,TRADEABLE_DEFAULT:()=>xt});var F=18,Tt=1e6,$e=1e9,E=0,Qe=12,Xs=2034,H=63,Ks="7L53bUTBbfuj14UpdCNPwmgzzHSsrsTWBHX5pys32mVWM3C1",Gt=1,xt=15;var Ze=class c{static toPct(t){let[e,n]=t;return c.safeDivide(e*100,n)}static toRaw(t){let[e,n]=t;return c.safeDivide(e,n)}static fromPermill(t){return[t,1e6]}static fromPerbill(t){return[t,1e9]}static fromRate(t,e){return[t,e]}static safeDivide(t,e,n=12){let s=10**n;return Math.round(t*s/e)/s}static safeRound(t){return parseFloat(t.toPrecision(15))}};function js(c,t){let e=(0,Hn.default)(typeof c=="bigint"?c.toString():c);return t===0?e.toString():e.div(Math.pow(10,t)).toString()}var Wt={};I(Wt,{H160:()=>nn,isEvmAccount:()=>Yn,isEvmAddress:()=>zn,isSs58Address:()=>Xn});var It=require("polkadot-api"),tn=require("@polkadot-api/utils"),lt=require("buffer");var en="ETH\0";function Yn(c){if(!c)return!1;try{let t=(0,It.AccountId)().enc(c),e=lt.Buffer.from(en);return lt.Buffer.from(t.subarray(0,e.length)).equals(e)}catch{return!1}}function zn(c){return!!/^0x[a-fA-F0-9]{40}$/.test(c)}function Xn(c){try{return(0,It.AccountId)(63).enc(c),!0}catch{return!1}}var nn=class c{static toAccount=t=>{let e=lt.Buffer.from(t.slice(2),"hex"),n=lt.Buffer.from(en),s=Uint8Array.from(lt.Buffer.concat([n,e,lt.Buffer.alloc(8)])),i=(0,tn.toHex)(s);return(0,It.AccountId)(63).dec(i)};static fromAccount=t=>{let e=(0,It.AccountId)().enc(t),n=lt.Buffer.from(en),s=e.slice(n.length,-8);return"0x"+lt.Buffer.from(s).toString("hex")};static fromSS58=t=>{let n=(0,It.AccountId)().enc(t).slice(0,20);return(0,tn.toHex)(n)};static fromAny=t=>{if(zn(t))return t;if(Yn(t))return c.fromAccount(t);if(Xn(t))return c.fromSS58(t);throw new Error("Unknown address type")}};var mt={};I(mt,{findNestedKey:()=>$s,findNestedObj:()=>Qs,jsonFormatter:()=>Js});var $s=(c,t)=>{let e=[];return JSON.stringify(c,(n,s)=>(s&&s[t]&&e.push(s),s)),e[0]},Qs=(c,t,e)=>{let n;return JSON.stringify(c,(s,i)=>(i&&i[t]===e&&(n=i),i)),n},Js=(c,t)=>typeof t=="bigint"?t.toString():t;var _={};I(_,{calculateBuyFee:()=>ni,calculateDiffToAvg:()=>Zs,calculateDiffToRef:()=>ti,calculateSellFee:()=>ei,getFraction:()=>si});var nt=ot(require("big.js"));function Zs(c,t){let e=(0,nt.default)(c.toString()),n=(0,nt.default)(t.toString());return e.minus(n).abs().div(e.plus(n).div(2)).mul(100).round(2).toNumber()}function ti(c,t){if(t===0n)return 0;let e=(0,nt.default)(c.toString()),n=(0,nt.default)(t.toString());return e.minus(n).div(n).mul(100).round(2).toNumber()}function ei(c,t){let e=(0,nt.default)(c.toString()),n=(0,nt.default)(t.toString());return(0,nt.default)(1).minus(n.div(e)).mul(100).round(2).toNumber()}function ni(c,t){let e=(0,nt.default)(c.toString());return(0,nt.default)(t.toString()).div(e).minus(1).mul(100).round(2).toNumber()}function si(c,t,e=2){(t<.01||t>100)&&new Error("Supported range is from 0.01% - 100%");let n=Math.pow(10,e),s=BigInt(t*n);return c*s/BigInt(100*n)}var sn={};I(sn,{convertToId:()=>ii});var Kn=require("buffer");function ii(c){let e=Kn.Buffer.from(c.replace("0x",""),"hex").subarray(16);return e.readUIntBE(0,e.length)}var Ht=(c,t)=>c===t?0:c==null?t==null?0:-1:t==null?c==null?0:1:typeof c.compare=="function"?c.compare(t):typeof t.compare=="function"?-t.compare(c):c<t?-1:c>t?1:0;var ve=(c,t=e=>e!==void 0?": "+e:"")=>class extends Error{origMessage;constructor(e){super(c(e)+t(e)),this.origMessage=e!==void 0?String(e):""}};var ri=ve(()=>"illegal argument(s)"),jn=c=>{throw new ri(c)};var ai=ve(()=>"index out of bounds"),rn=c=>{throw new ai(c)},we=(c,t,e)=>(c<t||c>=e)&&rn(c);var $n=23283064365386963e-26,Te=class{float(t=1){return this.int()*$n*t}probability(t){return this.float()<t}norm(t=1){return(this.int()*$n-.5)*2*t}normMinMax(t,e){let n=this.minmax(t,e);return this.float()<.5?n:-n}minmax(t,e){return this.float()*(e-t)+t}minmaxInt(t,e){t|=0;let n=(e|0)-t;return n?t+this.int()%n:t}minmaxUint(t,e){t>>>=0;let n=(e>>>0)-t;return n?t+this.int()%n:t}};var xe=class extends Te{constructor(t){super(),this.rnd=t}float(t=1){return this.rnd()*t}norm(t=1){return(this.rnd()-.5)*2*t}int(){return this.rnd()*4294967296>>>0}};var Qn=new xe(Math.random);var Jn=c=>c!=null&&typeof c!="function"&&c.length!==void 0;var Zn=Object.getPrototypeOf({}),Ie="function",ts="string",_t=(c,t)=>{let e;if(c===t)return!0;if(c!=null){if(typeof c.equiv===Ie)return c.equiv(t)}else return c==t;if(t!=null){if(typeof t.equiv===Ie)return t.equiv(c)}else return c==t;return typeof c===ts||typeof t===ts?!1:(e=Object.getPrototypeOf(c),(e==null||e===Zn)&&(e=Object.getPrototypeOf(t),e==null||e===Zn)?ui(c,t):typeof c!==Ie&&c.length!==void 0&&typeof t!==Ie&&t.length!==void 0?oi(c,t):c instanceof Set&&t instanceof Set?li(c,t):c instanceof Map&&t instanceof Map?ci(c,t):c instanceof Date&&t instanceof Date?c.getTime()===t.getTime():c instanceof RegExp&&t instanceof RegExp?c.toString()===t.toString():c!==c&&t!==t)},oi=(c,t,e=_t)=>{let n=c.length;if(n===t.length)for(;n-- >0&&e(c[n],t[n]););return n<0},li=(c,t,e=_t)=>c.size===t.size&&e([...c.keys()].sort(),[...t.keys()].sort()),ci=(c,t,e=_t)=>c.size===t.size&&e([...c].sort(),[...t].sort()),ui=(c,t,e=_t)=>{if(Object.keys(c).length!==Object.keys(t).length)return!1;for(let n in c)if(!t.hasOwnProperty(n)||!e(c[n],t[n]))return!1;return!0};var an=class{value;constructor(t){this.value=t}deref(){return this.value}};var es=c=>c instanceof an;var _e=class c{_head;_length=0;constructor(t){t&&this.into(t)}get length(){return this._length}get head(){return this._head}[Symbol.iterator](){return ns("next",this._head)}reverseIterator(){return ns("prev",this.tail)}clear(){this.release()}compare(t,e=Ht){let n=this._length;if(n<t._length)return-1;if(n>t._length)return 1;if(n===0)return 0;{let s=this._head,i=t._head,r=0;for(;n-- >0&&r===0;)r=e(s.value,i.value),s=s.next,i=i.next;return r}}concat(...t){let e=this.copy();for(let n of t)e.into(n);return e}equiv(t){if(!(t instanceof c||Jn(t))||this._length!==t.length)return!1;if(!this._length||this===t)return!0;let e=t[Symbol.iterator](),n=this._head;for(let s=this._length;s-- >0;){if(!_t(n.value,e.next().value))return!1;n=n.next}return!0}filter(t){let e=this.empty();return this.traverse(n=>(t(n.value)&&e.append(n.value),!0)),e}find(t){return this.traverse(e=>e.value!==t)}findWith(t){return this.traverse(e=>!t(e.value))}first(){return this._head?.value}insertSorted(t,e){e=e||Ht;for(let n=this._head,s=this._length;s-- >0;){if(e(t,n.value)<=0)return this.insertBefore(n,t);n=n.next}return this.append(t)}into(t){for(let e of t)this.append(e);return this}nth(t,e){let n=this.nthCell(t);return n?n.value:e}nthCellUnsafe(t){let e,n;for(t<=this._length>>>1?(e=this._head,n="next"):(e=this.tail,n="prev",t=this._length-t-1);t-- >0&&e;)e=e[n];return e}peek(){return this.tail?.value}$reduce(t,e){let n=this._head;for(let s=this._length;s-- >0&&!es(e);)e=t(e,n.value),n=n.next;return e}reduce(t,e){return this.$reduce(t,e)}release(){let t=this._head;if(!t)return!0;let e;for(let n=this._length;n-- >0;)e=t.next,delete t.value,delete t.prev,delete t.next,t=e;return this._head=void 0,this._length=0,!0}reverse(){let t=this._head,e=this.tail,n=(this._length>>>1)+(this._length&1);for(;t&&e&&n>0;){let s=t.value;t.value=e.value,e.value=s,t=t.next,e=e.prev,n--}return this}setHead(t){let e=this._head;return e?(e.value=t,e):this.prepend(t)}setNth(t,e){let n=this.nthCell(t);return!n&&rn(t),n.value=e,n}setTail(t){let e=this.tail;return e?(e.value=t,e):this.append(t)}swap(t,e){if(t!==e){let n=t.value;t.value=e.value,e.value=n}return this}toArray(t=[]){return this.traverse(e=>(t.push(e.value),!0)),t}toJSON(){return this.toArray()}toString(){let t=[];return this.traverse(e=>(t.push(String(e.value)),!0)),t.join(", ")}traverse(t,e=this._head,n){if(!this._head)return;let s=e;do{if(!t(s))break;s=s.next}while(s!==n);return s}_map(t,e){return this.traverse(n=>(t.append(e(n.value)),!0)),t}};function*ns(c,t){for(;t;)yield t.value,t=t[c]}var Ae=class c extends _e{_tail;constructor(t){super(),t&&this.into(t)}get tail(){return this._tail}append(t){if(this._tail){let e={value:t,prev:this._tail};return this._tail.next=e,this._tail=e,this._length++,e}else return this.prepend(t)}asHead(t){return t===this._head?this:(this.remove(t),this._head.prev=t,t.next=this._head,t.prev=void 0,this._head=t,this._length++,this)}asTail(t){return t===this._tail?this:(this.remove(t),this._tail.next=t,t.prev=this._tail,t.next=void 0,this._tail=t,this._length++,this)}cons(t){return this.prepend(t),this}copy(){return new c(this)}*cycle(){for(;;)yield*this}drop(){let t=this._head;if(t)return this._head=t.next,this._head?this._head.prev=void 0:this._tail=void 0,this._length--,t.value}empty(){return new c}insertAfter(t,e){let n={value:e,next:t.next,prev:t};return t.next?t.next.prev=n:this._tail=n,t.next=n,this._length++,n}insertAfterNth(t,e){return t<0&&(t+=this._length),t>=this._length-1?this.append(e):(we(t,0,this._length),this.insertAfter(this.nthCellUnsafe(t),e))}insertBefore(t,e){let n={value:e,next:t,prev:t.prev};return t.prev?t.prev.next=n:this._head=n,t.prev=n,this._length++,n}insertBeforeNth(t,e){return t<0&&(t+=this._length),t<=0?this.prepend(e):(we(t,0,this._length),this.insertBefore(this.nthCellUnsafe(t),e))}map(t){return this._map(new c,t)}nth(t,e){let n=this.nthCell(t);return n?n.value:e}nthCell(t){if(t<0&&(t+=this._length),!(t<0||t>=this._length))return this.nthCellUnsafe(t)}pop(){let t=this._tail;if(t)return this._tail=t.prev,this._tail?this._tail.next=void 0:this._head=void 0,this._length--,t.value}prepend(t){let e={value:t,next:this._head};return this._head?this._head.prev=e:this._tail=e,this._head=e,this._length++,e}push(t){return this.append(t),this}release(){return this._tail=void 0,super.release()}remove(t){return t.prev?t.prev.next=t.next:this._head=t.next,t.next?t.next.prev=t.prev:this._tail=t.prev,this._length--,this}rotateLeft(){switch(this._length){case 0:case 1:return this;case 2:return this.swap(this._head,this._tail);default:return this.push(this.drop())}}rotateRight(){switch(this._length){case 0:case 1:return this;case 2:return this.swap(this._head,this._tail);default:let t=this.peek();return this.pop(),this.prepend(t),this}}seq(t=0,e=this.length){if(t>=e||t<0)return;let n=this.nthCell(t),s=this.nthCell(e-1),i=r=>({first(){return r.value},next(){return r!==s&&r.next?i(r.next):void 0}});return n?i(n):void 0}shuffle(t,e=Qn){if(this._length<2)return this;for(t=t!==void 0?t:Math.ceil(1.5*Math.log2(this._length));t>0;t--){let n=this._head;for(;n;){let s=n.next;e.probability(.5)?this.asHead(n):this.asTail(n),n=s}}return this}slice(t=0,e=this.length){let n=t<0?t+this._length:t,s=e<0?e+this._length:e;(n<0||s<0)&&jn("invalid indices: ${from} / ${to}");let i=new c,r=this.nthCell(n);for(;r&&++n<=s;)i.push(r.value),r=r.next;return i}sort(t=Ht){if(!this._length)return this;let e=1;for(;;){let n=this._head;this._head=void 0,this._tail=void 0;let s=0;for(;n;){s++;let i=n,r=0;for(let o=0;o<e&&(r++,i=i.next,!!i);o++);let a=e;for(;r>0||a>0&&i;){let o;r===0?(o=i,i=i.next,a--):!i||a===0||t(n.value,i.value)<=0?(o=n,n=n.next,r--):(o=i,i=i.next,a--),this._tail?this._tail.next=o:this._head=o,o.prev=this._tail,this._tail=o}n=i}if(this._tail.next=void 0,s<=1)return this;e*=2}}splice(t,e=0,n){let s;typeof t=="number"?(t<0&&(t+=this._length),we(t,0,this._length),s=this.nthCellUnsafe(t)):s=t;let i=new c;if(e>0)for(;s&&e-- >0;)this.remove(s),i.push(s.value),s=s.next;else s&&(s=s.next);if(n)if(s)for(let r of n)this.insertBefore(s,r);else for(let r of n)this.push(r);return i}};var Oe=class c{map;items;opts;_size;constructor(t,e){let n={maxlen:1/0,maxsize:1/0,map:()=>new Map,ksize:()=>0,vsize:()=>0,...e};this.map=n.map(),this.items=new Ae,this._size=0,this.opts=n,t&&this.into(t)}get length(){return this.items.length}get size(){return this._size}[Symbol.iterator](){return this.entries()}*entries(){for(let t of this.items)yield[t.k,t]}*keys(){for(let t of this.items)yield t.k}*values(){for(let t of this.items)yield t.v}copy(){let t=this.empty();t.items=this.items.copy();let e=t.items.head;for(;e;)t.map.set(e.value.k,e),e=e.next;return t}empty(){return new c(null,this.opts)}release(){this._size=0,this.map.clear();let t=this.opts.release;if(t){let e;for(;e=this.items.drop();)t(e.k,e.v);return!0}return this.items.release()}has(t){return this.map.has(t)}get(t,e){let n=this.map.get(t);return n?this.resetEntry(n):e}set(t,e){let n=this.opts.ksize(t)+this.opts.vsize(e),s=this.map.get(t),i=Math.max(0,n-(s?s.value.s:0));return this._size+=i,this.ensureSize()?this.doSetEntry(s,t,e,n):this._size-=i,e}into(t){for(let e of t)this.set(e[0],e[1]);return this}async getSet(t,e){let n=this.map.get(t);return n?this.resetEntry(n):this.set(t,await e())}delete(t){let e=this.map.get(t);return e?(this.removeEntry(e),!0):!1}resetEntry(t){return this.items.asTail(t),t.value.v}ensureSize(){let{release:t,maxsize:e,maxlen:n}=this.opts;for(;this._size>e||this.length>=n;){let s=this.items.drop();if(!s)return!1;this.map.delete(s.k),t?.(s.k,s.v),this._size-=s.s}return!0}removeEntry(t){let e=t.value;this.map.delete(e.k),this.items.remove(t),this.opts.release?.(e.k,e.v),this._size-=e.s}doSetEntry(t,e,n,s){t?(this.opts.update?.(e,t.value.v,n),t.value.v=n,t.value.s=s,this.items.asTail(t)):(this.items.push({k:e,v:n,s}),this.map.set(e,this.items.tail))}};var ft=class c extends Oe{constructor(t,e){super(t,{ttl:3600*1e3,autoExtend:!1,...e})}empty(){return new c(null,this.opts)}has(t){return this.get(t)!==void 0}get(t,e){let n=this.map.get(t);if(n){if(n.value.t>=Date.now())return this.resetEntry(n);this.removeEntry(n)}return e}set(t,e,n=this.opts.ttl){let s=this.opts.ksize(t)+this.opts.vsize(e),i=this.map.get(t),r=Math.max(0,s-(i?i.value.s:0));return this._size+=r,this.ensureSize()?this.doSetEntry(i,t,e,s,n):this._size-=r,e}async getSet(t,e,n=this.opts.ttl){let s=this.get(t);return s!==void 0?s:this.set(t,await e(),n)}prune(){let t=Date.now(),e=this.items.head,n=0;for(;e;)e.value.t<t&&(this.removeEntry(e),n++),e=e.next;return n}ensureSize(){let{maxlen:t,maxsize:e}=this.opts,n=Date.now(),s=this.items.head;for(;s&&(this._size>e||this.length>=t);)s.value.t<n&&this.removeEntry(s),s=s.next;return super.ensureSize()}doSetEntry(t,e,n,s,i=this.opts.ttl){let r=Date.now()+i;t?(this.opts.update?.(e,t.value.v,n),t.value.v=n,t.value.s=s,t.value.t=r,this.items.asTail(t)):(this.items.push({k:e,v:n,s,t:r,ttl:i}),this.map.set(e,this.items.tail))}resetEntry(t){return this.opts.autoExtend&&(t.value.t=Date.now()+t.value.ttl),super.resetEntry(t)}};var Yt=class{debug;constructor(t){this.debug=t||!1}log(t,e,n){this.debug&&console.log(t,e,n)}scope(t,e,n,s){let i=new Map,r=s!==void 0?new ft(null,{ttl:s}):new ft;return{get:(...u)=>{let p=n(...u);if(i.has(p)){this.log("[live]",t,p);let m=i.get(p);return Promise.resolve(m)}if(r.has(p))return this.log("[memo]",t,p),r.get(p);this.log("[fetch]",t,p);let d=e(...u).catch(m=>{throw r.delete(p),m});return r.set(p,d),d},set:(u,...p)=>{let d=n(...p);this.log("[set-live]",t,d),i.set(d,u)},clear:()=>{this.log("[clear]",t),i.clear(),r.release()}}}};var{ERC20:Be}=yt,{H160:on}=Wt,pi=1.01,mi=31536000n,Re=10n**27n,Pt=class{client;constructor(t){this.client=new Vt(t)}async getSummary(t){let e=on.fromAny(t),[n,s,i,r]=await Promise.all([this.client.getReservesData(),this.client.getUserReservesData(e),this.client.getUserAccountData(e),this.client.getBlockTimestamp()]),[a]=n,[o,l]=s,[u,p,d,m,g,b]=i,h=S.toDecimal(b,18),P=[];for(let y of o){let v=y.underlyingAsset.toLowerCase(),w=a.find(({underlyingAsset:He})=>He.toLowerCase()===v);if(!w)throw new Error("Missing pool reserve for "+v);let R=y.scaledATokenBalance,q=w.liquidityIndex,O=w.liquidityRate,G=w.availableLiquidity,Q=w.priceInMarketReferenceCurrency,et=r+6,Y=this.calculateLinearInterest(O,w.lastUpdateTimestamp,et),J=q*Y/Re,ht=R*J/Re,de=Number(l!==0&&l===w.eModeCategoryId?w.eModeLiquidationThreshold:w.reserveLiquidationThreshold)/1e4,ge=w.usageAsCollateralEnabled&&y.usageAsCollateralEnabledOnUser&&y.scaledATokenBalance>0n,he=Be.toAssetId(v);P.push({aTokenBalance:ht,availableLiquidity:G,decimals:Number(w.decimals),isCollateral:ge,priceInRef:Q,reserveId:he,reserveAsset:v,reserveLiquidationThreshold:de})}return{healthFactor:Number(h),totalCollateral:u,totalDebt:p,reserves:P}}async hasBorrowPositions(t){let e=on.fromAny(t),n=await this.client.getUserAccountData(e),[s,i]=n;return i>0n}async getHealthFactor(t){let e=on.fromAny(t),n=await this.client.getUserAccountData(e),[s,i,r,a,o,l]=n,u=S.toDecimal(l,18);return Number(u)}async getHealthFactorAfterWithdraw(t,e,n){let{totalCollateral:s,totalDebt:i,reserves:r}=await this.getSummary(t),a=Be.fromAssetId(e),o=r.find(P=>P.reserveAsset===a);if(!o)throw new Error("Missing reserve ctx for "+a);let{decimals:l,isCollateral:u,priceInRef:p,reserveLiquidationThreshold:d}=o,m=S.toBigInt(n,l),g=u?m*p/10n**BigInt(l):0n,b=s-g;if(b<=0n)return 0;let h=(0,ct.default)(b.toString()).mul(d).div(i.toString()).toFixed(6,ct.default.roundDown);return Number(h)}async getHealthFactorAfterSupply(t,e,n){let{totalCollateral:s,totalDebt:i,reserves:r}=await this.getSummary(t),a=Be.fromAssetId(e),o=r.find(h=>h.reserveAsset===a);if(!o)throw new Error("Missing reserve ctx for "+a);let{decimals:l,priceInRef:u,reserveLiquidationThreshold:p}=o,m=S.toBigInt(n,l)*u/10n**BigInt(l),g=s+m;if(g<=0n)return 0;let b=(0,ct.default)(g.toString()).mul(p).div(i.toString()).toFixed(6,ct.default.roundDown);return Number(b)}async getMaxWithdraw(t,e){let{totalDebt:n,reserves:s,healthFactor:i}=await this.getSummary(t),r=Be.fromAssetId(e),a=s.find(o=>o.reserveAsset===r);if(!a)throw new Error("Missing reserve ctx for "+r);return this.calculateWithdrawMax(a,n,i)}async getMaxWithdrawAll(t){let{totalDebt:e,reserves:n,healthFactor:s}=await this.getSummary(t),i={};for(let r of n){let a=this.calculateWithdrawMax(r,e,s);r.reserveId&&(i[r.reserveId]=a)}return i}calculateWithdrawMax(t,e,n){let{aTokenBalance:s,availableLiquidity:i,decimals:r,priceInRef:a,reserveLiquidationThreshold:o,isCollateral:l}=t,u=s;if(l&&e>0n){let d=n-pi;if(d>0){let m=(0,ct.default)(d).mul(e.toString()).div(o).toFixed(0,ct.default.roundDown),g=(0,ct.default)(m).div(a.toString()).mul(10**r).toFixed(0,ct.default.roundDown);u=s<BigInt(g)?s:BigInt(g)}else u=0n}return{amount:u<i?u:i,decimals:r}}calculateLinearInterest(t,e,n){let s=n-e;if(s<=0)return Re;let i=t*BigInt(s)/mi;return Re+i}};var cn={};I(cn,{AssetClient:()=>At,BalanceClient:()=>st,ChainParams:()=>Ot});var At=class extends N{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:s})=>{let[i]=n;return[i,s]}))}async queryBonds(){let e=await this.api.query.Bonds.Bonds.getEntries();return new Map(e.map(({keyArgs:n,value:s})=>{let[i]=n;return[i,s]}))}async queryAssets(){let e=await this.api.query.AssetRegistry.Assets.getEntries();return new Map(e.filter(({value:n})=>{let{asset_type:s}=n;return this.SUPPORTED_TYPES.includes(s.type)}).map(({keyArgs:n,value:s})=>{let[i]=n;return[i,s]}))}async queryAssetLocations(){let e=await this.api.query.AssetRegistry.AssetLocations.getEntries();return new Map(e.map(({keyArgs:n,value:s})=>{let[i]=n;return[i,s]}))}async mapToken(t,e,n,s){let{name:i,asset_type:r,is_sufficient:a,existential_deposit:o}=e,{symbol:l,decimals:u}=n.get(t)??{};return{id:t,name:i?.asText(),symbol:l,decimals:u,icon:l,type:r.type,isSufficient:a,location:s,existentialDeposit:o}}async mapBond(t,e,n,s){let[i,r]=s,{asset_type:a,is_sufficient:o,existential_deposit:l}=e,{symbol:u,decimals:p}=await this.mapToken(i,e,n),d=Number(r),m=new Intl.DateTimeFormat("en-GB"),g=[u,"Bond",m.format(d)].join(" ");return{id:t,name:g,symbol:u+"b",decimals:p,icon:u,type:a.type,isSufficient:o,existentialDeposit:l,underlyingAssetId:i,maturity:d}}async mapShares(t,e,n,s){let{assets:i}=s,{name:r,symbol:a,asset_type:o,is_sufficient:l,existential_deposit:u}=e,p=await Promise.all(i.map(async g=>{let{symbol:b}=await this.mapToken(g,e,n);return[g,b]})),d=Object.fromEntries(p),m=Object.values(d);return{id:t,name:m.join(", "),symbol:a?.asText()||r?.asText(),decimals:18,icon:m.join("/"),type:o.type,isSufficient:l,existentialDeposit:u,meta:d}}async mapExternal(t,e,n,s){let i=await this.mapToken(t,e,new Map,s),r=n?.find(a=>a.internalId===i.id);return r?{...i,decimals:r.decimals,name:r.name,symbol:r.symbol,icon:r.symbol,isWhiteListed:r.isWhiteListed}:i}parseMetadata(t){return new Map(Array.from(t,([e,n])=>[e,{symbol:n.symbol?.asText(),decimals:n.decimals}]))}async getOnChainAssets(t,e){let[n,s,i,r]=await Promise.all([this.queryAssets(),this.queryAssetLocations(),this.queryShares(),this.queryBonds()]),a=this.parseMetadata(n),o=[];for(let[l,u]of Array.from(n)){let p=s.get(l),{asset_type:d}=u,m;switch(d.type){case"Bond":let g=r.get(l);m=await this.mapBond(l,u,a,g);break;case"StableSwap":let b=i.get(l);m=await this.mapShares(l,u,a,b);break;case"External":m=await this.mapExternal(l,u,e,p);break;default:m=await this.mapToken(l,u,a,p)}o.push(m)}return t?o:o.filter(l=>this.isValidAsset(l))}isValidAsset(t){let e=Math.sign(t.decimals);return!!t.symbol&&(e===0||e===1)}};var x=require("rxjs");var st=class extends N{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 s=await this.api.query.Tokens.Accounts.getValue(t,e);return this.calculateBalance(s)}async getErc20Balance(t,e){return this.getTokenBalanceData(t,e)}subscribeBalance(t){let e=this.subscribeSystemBalance(t),n=this.subscribeTokensBalance(t),s=this.subscribeErc20Balance(t);return(0,x.combineLatest)([e,n,s]).pipe((0,x.debounceTime)(250),(0,x.map)(i=>i.flat()),(0,x.startWith)([]),(0,x.bufferCount)(2,1),(0,x.map)(([i,r],a)=>a===0?r:this.getDeltas(i,r)))}subscribeSystemBalance(t){return this.api.query.System.Account.watchValue(t,"best").pipe((0,x.map)(n=>({id:0,balance:this.calculateBalance(n.data)})))}subscribeTokenBalance(t,e){return this.api.query.Tokens.Accounts.watchValue(t,e,"best").pipe((0,x.map)(s=>({id:e,balance:s})))}subscribeTokensBalance(t){return this.api.query.Tokens.Accounts.watchEntries(t,{at:"best"}).pipe((0,x.distinctUntilChanged)((n,s)=>!s.deltas),(0,x.map)(({deltas:n})=>{let s=[];return n?.deleted.forEach(i=>{let[r,a]=i.args;s.push({id:a,balance:this.calculateBalance({free:0n,reserved:0n,frozen:0n})})}),n?.upserted.forEach(i=>{let[r,a]=i.args;s.push({id:a,balance:this.calculateBalance(i.value)})}),s}))}subscribeErc20Balance(t,e){let n=new x.Subject,s=n.pipe((0,x.shareReplay)(1)),i=async()=>(await this.api.query.AssetRegistry.Assets.getEntries()).filter(({value:l})=>{let{asset_type:u}=l;return u.type==="Erc20"}).map(({keyArgs:l})=>{let[u]=l;return u}),r=async()=>{let o=e||await i(),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 u=this.api.query.System.Number.watchValue("best").subscribe(l);return()=>u.unsubscribe()},a;return r().then(o=>a=o),s.pipe((0,x.finalize)(()=>a?.()),(0,x.pairwise)(),(0,x.map)(([o,l],u)=>u===0?l.filter(p=>p.balance.transferable>0n):this.getDeltas(o,l)),(0,x.distinctUntilChanged)((o,l)=>l.length===0))}async getTokenBalanceData(t,e){let n=await this.api.apis.CurrenciesApi.account(e,t);return this.calculateBalance(n)}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=(i,r)=>i!==void 0&&r!==void 0&&i.transferable===r.transferable&&i.total===r.total,s=t.reduce((i,r)=>(i.set(r.id,r.balance),i),new Map);return e.filter(i=>!n(i.balance,s.get(i.id)))}};var Ot=class extends N{_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 pn={};I(pn,{AssetNotFound:()=>un,PoolNotFound:()=>zt,RouteNotFound:()=>Xt});var un=class extends Error{constructor(t){super(),this.message=`${t} not found`,this.name="AssetNotFound"}},zt=class extends Error{constructor(t){super(),this.message=`${t} pool invalid`,this.name="PoolNotFound"}},Xt=class extends Error{constructor(t,e){super(),this.message=`Route from ${t} to ${e} not found in current configuration`,this.name="RouteNotFound"}};var dn={};I(dn,{EvmClient:()=>Kt,createChain:()=>mn});var ss=require("viem"),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"],mn=()=>(0,ss.defineChain)({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});var it=require("viem");var Kt=class{client;chain;constructor(t){this.client=t,this.chain=mn()}get chainId(){return this.chain.id}get chainCurrency(){return this.chain.nativeCurrency.symbol}get chainDecimals(){return this.chain.nativeCurrency.decimals}getProvider(){return(0,it.createPublicClient)({chain:this.chain,transport:(0,it.http)()})}getWsProvider(){return(0,it.createPublicClient)({transport:(0,it.custom)({request:({method:t,params:e})=>this.client._request(t,e||[])})})}getSigner(t){return(0,it.createWalletClient)({account:t,chain:this.chain,transport:(0,it.custom)(window.ethereum)})}};var yn={};I(yn,{LiquidityMiningApi:()=>jt,LiquidityMiningClient:()=>$t});var as=require("polkadot-api"),U=ot(require("big.js")),bn=require("@galacticcouncil/math-liquidity-mining");var Fe=class{result=new Map;getKey(t,e){return[e,t.toString()].join(",")}constructor(t,e){for(let n=0;n<t.length;++n){let[s,i]=t[n];this.result.set(this.getKey(i,s),e[n].free)}}freeBalance(t,e){return this.result.get(this.getKey(t,e))??0n}transfer(t,e,n,s){let i=this.getKey(t,e),r=this.getKey(t,n),a=this.result.get(i)??0n,o=this.result.get(r)??0n;if(a<s)throw new Error("Attempting to transfer more than is present");this.result.set(i,a+s),this.result.set(r,o+s)}};var dt=ot(require("big.js")),Z=require("@galacticcouncil/math-liquidity-mining");var gn=ot(require("big.js")),hn=(0,gn.default)(10).pow(18),is=BigInt((0,gn.default)(1).pow(18).toString()),rs=6e3;var gi="1000000000000000000",Ee=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 s=await this.getAsset(t.reward_currency),i=e-t.updated_at,r=this.getAccount(t.id),a=s?.existential_deposit;if(!a)throw new Error("Missing reward currency asset list");let o=this.multiCurrency.freeBalance(t.reward_currency,r),l=(0,dt.default)(a.toString()),u=(0,dt.default)(o.toString()).minus(l.lt(o.toString())?a.toString():o.toString()),p=(0,dt.default)((0,Z.calculate_global_farm_rewards)(t.total_shares_z.toString(),n.toString(),(0,dt.default)(t.yield_per_period.toString()).mul(hn).round(0,dt.default.roundDown).toFixed(),t.max_reward_per_period.toString(),i.toFixed()));if(u.lt(p)&&(p=u),p.eq(0))return t;let d=this.getAccount(0);return this.multiCurrency.transfer(t.reward_currency,r,d,BigInt(p.toFixed())),{...t,accumulated_rpz:BigInt((0,Z.calculate_accumulated_rps)(t.accumulated_rpz.toString(),t.total_shares_z.toString(),p.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 s=(0,Z.calculate_yield_farm_delta_rpvs)(t.accumulated_rpz.toString(),e.accumulated_rpz.toString(),t.multiplier.toString(),t.total_valued_shares.toString());return{...t,accumulated_rpvs:t.accumulated_rpvs+BigInt(s),updated_at:n}}getLoyaltyMultiplier(t,e){let n=(0,dt.default)(1).mul(hn).round(0,dt.default.roundDown).toString();if(!e)return n;let{initial_reward_percentage:s,scale_coef:i}=e;return(0,Z.calculate_loyalty_multiplier)(t.toFixed(),s.toString(),i.toFixed())}async claimRewards(t,e,n,s,i){if(e.state.type==="Terminated")return null;let r=Math.floor(s/t.blocks_per_period);if(n.updated_at===r)return null;let a=await this.syncGlobalFarm(t,r,i);if(!a)return null;let o=this.syncYieldFarm(e,a,r);if(!o)return null;let l=o.total_stopped-n.stopped_at_creation,u=o.updated_at-n.entered_at-l,p=this.getLoyaltyMultiplier(u,o.loyalty_curve),d=BigInt((0,Z.calculate_user_reward)(n.accumulated_rpvs.toString(),n.valued_shares.toString(),n.accumulated_claimed_rewards.toString(),o.accumulated_rpvs.toString(),p)),m=BigInt((0,Z.calculate_user_reward)(n.accumulated_rpvs.toString(),n.valued_shares.toString(),n.accumulated_claimed_rewards.toString(),o.accumulated_rpvs.toString(),gi));return{reward:d,maxReward:m,assetId:a.reward_currency}}};var hi=(0,U.default)(365.2425).times(24).times(60).times(60),jt=class{client;balanceClient;options;constructor(t,e,n={}){this.client=t,this.balanceClient=e,this.options=Object.freeze({blockTime:n.blockTime??rs})}get blockTime(){return this.options.blockTime}async getOraclePrice(t,e){let n=[t,e].sort((i,r)=>i-r);if(t===e)return is;let s=await this.client.getOraclePrice(n);if(s){let{n:i,d:r}=s[0].price,a;return t<e?a=(0,bn.fixed_from_rational)(i.toString(),r.toString()):a=(0,bn.fixed_from_rational)(r.toString(),i.toString()),BigInt(a)}}getFarmAddress=(t,e)=>{let n=Buffer.from("modl","utf-8"),s=Buffer.from(e?"78796b4c4d704944":"4f6d6e6957684c4d","hex"),i=Buffer.from([t]),r=Buffer.concat([n,s,i]),o="0x"+Buffer.concat([r,Buffer.alloc(32-r.length)]).toString("hex");return(0,as.AccountId)(63).dec(o)};getGlobalRewardPerPeriod(t,e,n,s){let i=(0,U.default)(s).times(t.toString()).times(e.toString()).div(18);return i.gte(n.toString())?n.toString():i.toString()}getPoolYieldPerPeriod(t,e,n,s){let i=(0,U.default)(t.toString()).times(e),r=(0,U.default)(n.toString()).times(s);return i.div(r.toString()).toString()}farmData(t,e,n){let{yieldFarm:s,globalFarm:i,priceAdjustment:r,balance:a,id:o}=t,{multiplier:l,loyalty_curve:u}=s,{blocks_per_period:p,yield_per_period:d,total_shares_z:m,max_reward_per_period:g,pending_rewards:b,accumulated_paid_rewards:h,planned_yielding_periods:P,updated_at:y,incentivized_asset:v,reward_currency:w,price_adjustment:R,min_deposit:q}=i,O=B.shiftNeg(r??R,18),G=B.shiftNeg(l,18),Q=B.shiftNeg(u?.initial_reward_percentage??0,18),et=hi.div((0,U.default)(this.blockTime).div(1e3).times(p)).toString(),Y;if(m<=0)Y=(0,U.default)(G).times(d.toString()).times(et).toString();else{let Cs=this.getGlobalRewardPerPeriod(m,d,g,O),Ds=this.getPoolYieldPerPeriod(Cs,G,m,O);Y=(0,U.default)(Ds).times(et).toString()}let J=b+h,ht=g*BigInt(P),bt=a.transferable+J,Dn=bt-J,de=(0,U.default)(Dn.toString()).div(g.toString()),ge=(0,U.default)(e).div(p.toString()).toString(),he=(m>=0?de.plus(y):de.plus(ge)).toString(),He=(0,U.default)(he).times(p).toString(),Es=(0,U.default)(m.toString()).div((0,U.default)(g.toString()).div(d.toString())).div(Math.pow(10,18)).times(100).times(O).toFixed(2),Mn=(0,U.default)(J.toString()).div(bt.toString()).gte(.999);Y=Mn?"0":(0,U.default)(Y).div(n?2:1).times(100).toString();let ks=Q?(0,U.default)(Y).times(Q).toString():void 0;return{apr:Y,minApr:ks,isDistributed:Mn,estimatedEndPeriod:he,estimatedEndBlock:He,maxRewards:ht,incentivizedAsset:v,rewardCurrency:w,loyaltyCurve:u,currentPeriod:ge,potMaxRewards:bt,fullness:Es,yieldFarmId:s.id,globalFarmId:i.id,poolId:o,distributedRewards:J,plannedYieldingPeriods:P,minDeposit:q}}async getAllOmnipoolFarms(){let e=(await this.client.getAllOmnipooFarms()).reduce((s,i)=>s.includes(i.keyArgs[0].toString())?s:[...s,i.keyArgs[0].toString()],[]),n=await Promise.all(e.map(async s=>{let i=await this.getOmnipoolFarms(s);if(i)return[s,i]}));return Object.fromEntries(n.filter(s=>!!s))}async getOmnipoolFarms(t){let e=await this.client.getOmnipooFarms(Number(t)),n=await this.client.getRelayBlockNumber(),s=await Promise.all(e.map(async({keyArgs:i,value:r})=>{let[,a]=i,o=r,l=await this.client.getOmnipoolGlobalFarm(a),u=await this.client.getOmnipoolYieldFarm(Number(t),a,o);if(!l||!u)return;let p=l.reward_currency,d=l.incentivized_asset,m=this.getFarmAddress(a),g=await this.getOraclePrice(p,d),b=await this.balanceClient.getBalance(m,p);return{id:t,globalFarm:l,yieldFarm:u,priceAdjustment:g,balance:b}}));return n?s.map(i=>i?this.farmData(i,n):void 0):[]}async getAllIsolatedFarms(){let e=(await this.client.getAllIsolatedFarms()).reduce((s,i)=>s.includes(i.keyArgs[0].toString())?s:[...s,i.keyArgs[0].toString()],[]),n=await Promise.all(e.map(async s=>{let i=await this.getIsolatedFarms(s);if(i)return[s,i]}));return Object.fromEntries(n.filter(s=>!!s))}async getIsolatedFarms(t){let e=await this.client.getIsolatedFarms(t),n=await this.client.getRelayBlockNumber(),s=await Promise.all(e.map(async({keyArgs:i,value:r})=>{let[,a]=i,o=r,l=await this.client.getIsolatedGlobalFarm(a),u=await this.client.getIsolatedYieldFarm(t,a,o);if(!l||!u)return;let p=l.reward_currency,d=l.incentivized_asset,m=this.getFarmAddress(a,!0),g=await this.getOraclePrice(p,d),b=await this.balanceClient.getBalance(m,p);return{id:t,globalFarm:l,yieldFarm:u,priceAdjustment:g,balance:b,farmAddress:m}}));return n?s.map(i=>i?this.farmData(i,n,!0):void 0):[]}async getDepositReward(t,e,n,s){let i=e.global_farm_id,r=e.yield_farm_id,a=n?await this.client.getIsolatedYieldFarm(t,i,r):await this.client.getOmnipoolYieldFarm(Number(t),i,r),o=n?await this.client.getIsolatedGlobalFarm(i):await this.client.getOmnipoolGlobalFarm(i);if(!o||!a)return;let l=o.reward_currency,u=o.incentivized_asset,p=[[this.getFarmAddress(0,n),o.reward_currency],[this.getFarmAddress(o.id,n),o.reward_currency]],d=await this.getAccountAssetBalances(p),m=await this.getOraclePrice(l,u),g=new Fe(p,d),h=await new Ee(y=>this.getFarmAddress(y),y=>this.client.getAsset(y),g).claimRewards(o,a,e,s,m??o.price_adjustment);if(!h)return;let P=await this.client.getAsset(h.assetId);if(P&&!(h.reward<=P.existential_deposit))return h}async getAccountAssetBalances(t){let[e,n]=await Promise.all([Promise.all(t.filter(([i,r])=>r!==0).map(([i,r])=>this.balanceClient.getTokenBalance(i,r))),Promise.all(t.filter(([i,r])=>r===0).map(([i])=>this.balanceClient.getSystemBalance(i)))]),s=[];for(let i=0,r=0;i+r<t.length;){let a=i+r,[,o]=t[a];o===0?(s.push(n[r]),r+=1):(s.push(e[i]),i+=1)}return s}};var ke=require("polkadot-api"),$t=class extends N{omnipoolAssetIds=[];async getOraclePrice(t){return await this.api.query.EmaOracle.Oracles.getValue(ke.Binary.fromText("omnipool"),t,(0,ke.Enum)("TenMinutes"))}async getRelayBlockNumber(){return(await this.api.query.ParachainSystem.ValidationData.getValue())?.relay_parent_number}async getAllOmnipooFarms(){return this.api.query.OmnipoolWarehouseLM.ActiveYieldFarm.getEntries()}async getOmnipooFarms(t){return this.api.query.OmnipoolWarehouseLM.ActiveYieldFarm.getEntries(t)}async getOmnipoolGlobalFarm(t){return this.api.query.OmnipoolWarehouseLM.GlobalFarm.getValue(t)}async getOmnipoolYieldFarm(t,e,n){return this.api.query.OmnipoolWarehouseLM.YieldFarm.getValue(t,e,n)}async getAllIsolatedFarms(){return this.api.query.XYKWarehouseLM.ActiveYieldFarm.getEntries()}async getIsolatedFarms(t){return this.api.query.XYKWarehouseLM.ActiveYieldFarm.getEntries(t)}async getIsolatedGlobalFarm(t){return this.api.query.XYKWarehouseLM.GlobalFarm.getValue(t)}async getIsolatedYieldFarm(t,e,n){return this.api.query.XYKWarehouseLM.YieldFarm.getValue(t,e,n)}async getAsset(t){return this.api.query.AssetRegistry.Assets.getValue(t)}};var Tn={};I(Tn,{PoolContextProvider:()=>kt,PoolError:()=>St,PoolFactory:()=>Et,PoolType:()=>M,aave:()=>wn,lbp:()=>fn,omni:()=>Pn,stable:()=>Sn,xyk:()=>vn});var fn={};I(fn,{LbpMath:()=>tt,LbpPool:()=>Qt,LbpPoolClient:()=>Jt});var rt=require("@galacticcouncil/math-lbp"),tt=class{static getSpotPrice(t,e,n,s,i){return(0,rt.get_spot_price)(t,e,n,s,i)}static calculateInGivenOut(t,e,n,s,i){return(0,rt.calculate_in_given_out)(t,e,n,s,i)}static calculateOutGivenIn(t,e,n,s,i){return(0,rt.calculate_out_given_in)(t,e,n,s,i)}static calculateLinearWeights(t,e,n,s,i){return(0,rt.calculate_linear_weights)(t,e,n,s,i)}static calculatePoolTradeFee(t,e,n){return(0,rt.calculate_pool_trade_fee)(t,e,n)}};var M=(i=>(i.Aave="Aave",i.LBP="LBP",i.Omni="Omnipool",i.Stable="Stableswap",i.XYK="XYK",i))(M||{}),St=(i=>(i.InsufficientTradingAmount="InsufficientTradingAmount",i.MaxInRatioExceeded="MaxInRatioExceeded",i.MaxOutRatioExceeded="MaxOutRatioExceeded",i.TradeNotAllowed="TradeNotAllowed",i.UnknownError="UnknownError",i))(St||{});var{FeeUtils:os}=B,Qt=class c{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;fee;repayFeeApply;static fromPool(t){return new c(t.address,t.tokens,t.maxInRatio,t.maxOutRatio,t.minTradingLimit,t.fee,t.repayFeeApply)}constructor(t,e,n,s,i,r,a){this.type="LBP",this.address=t,this.tokens=e,this.maxInRatio=n,this.maxOutRatio=s,this.minTradingLimit=i,this.fee=r,this.repayFeeApply=a}validatePair(t,e){return!0}parsePair(t,e){let n=new Map(this.tokens.map(r=>[r.id,r])),s=n.get(t),i=n.get(e);if(s==null)throw new Error("Pool does not contain tokenIn");if(i==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,balanceIn:s.balance,balanceOut:i.balance,decimalsIn:s.decimals,decimalsOut:i.decimals,weightIn:s.weight,weightOut:i.weight}}validateAndBuy(t,e,n){let s=this.tokens[0].id,i=[];e<this.minTradingLimit&&i.push("InsufficientTradingAmount");let r=t.balanceOut/this.maxOutRatio;if(e>r&&i.push("MaxOutRatioExceeded"),s===t.assetOut){let a=this.calculateTradeFee(e,n),o=os.toPct(this.repayFeeApply?n.repayFee:n.exchangeFee),l=e+a,u=this.calculateInGivenOut(t,l),p=t.balanceIn/this.maxInRatio;return u>p&&i.push("MaxInRatioExceeded"),{amountIn:u,calculatedIn:u,amountOut:e,feePct:o,errors:i}}else{let a=this.calculateInGivenOut(t,e),o=t.balanceIn/this.maxInRatio;return a>o&&i.push("MaxInRatioExceeded"),{amountIn:a,calculatedIn:a,amountOut:e,feePct:0,errors:i}}}validateAndSell(t,e,n){let s=this.tokens[0].id,i=[];e<this.minTradingLimit&&i.push("InsufficientTradingAmount");let r=t.balanceIn/this.maxInRatio;if(e>r&&i.push("MaxInRatioExceeded"),s===t.assetIn){let a=this.calculateOutGivenIn(t,e),o=t.balanceOut/this.maxOutRatio;return a>o&&i.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:a,amountOut:a,feePct:0,errors:i}}else{let a=this.calculateOutGivenIn(t,e),o=this.calculateTradeFee(a,n),l=os.toPct(this.repayFeeApply?n.repayFee:n.exchangeFee),u=a-o,p=t.balanceOut/this.maxOutRatio;return u>p&&i.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:a,amountOut:u,feePct:l,errors:i}}}calculateInGivenOut(t,e){let n=tt.calculateInGivenOut(t.balanceIn.toString(),t.balanceOut.toString(),t.weightIn.toString(),t.weightOut.toString(),e.toString()),s=BigInt(n);return s<0n?0n:s}calculateOutGivenIn(t,e){let n=tt.calculateOutGivenIn(t.balanceIn.toString(),t.balanceOut.toString(),t.weightIn.toString(),t.weightOut.toString(),e.toString()),s=BigInt(n);return s<0n?0n:s}spotPriceInGivenOut(t){let e=tt.getSpotPrice(t.balanceOut.toString(),t.balanceIn.toString(),t.weightOut.toString(),t.weightIn.toString(),this.maxOutRatio.toString());return BigInt(e)}spotPriceOutGivenIn(t){let e=tt.getSpotPrice(t.balanceIn.toString(),t.balanceOut.toString(),t.weightIn.toString(),t.weightOut.toString(),this.maxInRatio.toString());return BigInt(e)}calculateTradeFee(t,e){let n=tt.calculatePoolTradeFee(t.toString(),this.repayFeeApply?e.repayFee[0]:e.exchangeFee[0],this.repayFeeApply?e.repayFee[1]:e.exchangeFee[1]);return BigInt(n)}};var us=require("polkadot-api"),Bt=require("rxjs");var ls=(c,t=new Map)=>e=>{let n;return t.has(e)?t.get(e):(t.set(e,n=c(e)),n)};var f=require("rxjs");var cs=require("rxjs"),Ce=class{store$=new cs.BehaviorSubject([]);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((a,o)=>[a.address,o])),s=await t(e),i=e.slice(),r=new Set;for(let a of s){let o=n.get(a.address);o===void 0?(n.set(a.address,i.length),i.push(a)):i[o]=a,r.add(a.address)}this.changeset=r,this.store$.next(i)}).catch(console.error)}destroy(){this.store$.complete()}};var K=class extends st{evm;store=new Ce;shared$;mem=0;memPoolsCache=new ft(null,{ttl:6*1e3});memPools=ls(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((0,f.startWith)([]),(0,f.bufferCount)(2,1),(0,f.map)(([t,e])=>t.length===0?e:this.store.applyChangeset(e)),(0,f.filter)(t=>t.length>0),(0,f.throttleTime)(1e3,void 0,{leading:!0,trailing:!0}))}subscribeStore(){return(0,f.defer)(()=>{let t=new f.Subscription;return(0,f.from)(this.getMemPools()).pipe((0,f.map)(n=>n.filter(s=>this.hasValidAssets(s))),(0,f.tap)(n=>this.store.set(n))).pipe((0,f.tap)(()=>{t.add(this.subscribeUpdates())}),(0,f.switchMap)(n=>(0,f.merge)((0,f.of)(n),this.store.asObservable().pipe((0,f.skip)(1)))),(0,f.finalize)(()=>{t.unsubscribe()}))}).pipe((0,f.share)({connector:()=>new f.ReplaySubject(1),resetOnRefCountZero:!0}))}subscribeBalances(){let t=this.store.pools.map(e=>{let{address:n}=e,s=[this.subscribeTokensBalance(n)];if(this.hasSystemAsset(e)){let i=this.subscribeSystemBalance(n);s.push(i)}if(this.hasErc20Asset(e)){let i=e.tokens.filter(a=>a.type==="Erc20").map(a=>a.id),r=this.subscribeErc20Balance(n,i);s.push(r)}return(0,f.combineLatest)(s).pipe((0,f.map)(i=>i.flat()),(0,f.pairwise)(),(0,f.map)(([i,r])=>this.getDeltas(i,r)),(0,f.map)(i=>[n,i]))});return(0,f.combineLatest)(t).pipe((0,f.debounceTime)(250),(0,f.map)(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=[],s=new Map(t.map(i=>[i.address,i]));for(let[i,r]of e){let a=s.get(i);if(a){let o=a.tokens.map(l=>{let u=r.find(p=>p.id===l.id);return u&&l.id!==a.id?{...l,balance:u.balance.transferable}:l});n.push({...a,tokens:o})}}return n}};var Jt=class extends K{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:s,initial_weight:i,final_weight:r}=t,a=tt.calculateLinearWeights(n?n.toString():"0",s?s.toString():"0",i.toString(),r.toString(),e.toString()),o=BigInt(a),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(us.CompatibilityLevel.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()]),s=e?.relay_parent_number||0,i=t.filter(({value:r})=>e&&this.isActivePool(r,s)).map(async({keyArgs:r,value:a})=>{let[o]=r,l=o.toString(),u=await this.getPoolDelta(l,a,s);return{address:l,type:"LBP",fee:a.fee,...u,...n}});return Promise.all(i)}async getPoolDelta(t,e,n){let{assets:s,repay_target:i,fee_collector:r}=e,[a,o]=this.getPoolWeights(e,n),[l,u]=s,[p,d,m,g,b]=await Promise.all([this.isRepayFeeApplied(l,i,r.toString()),this.getBalance(t,l),this.api.query.AssetRegistry.Assets.getValue(l),this.getBalance(t,u),this.api.query.AssetRegistry.Assets.getValue(u)]);return{repayFeeApply:p,tokens:[{id:l,decimals:m?.decimals,existentialDeposit:m?.existential_deposit,balance:d.transferable,weight:a,type:m?.asset_type.type},{id:u,decimals:b?.decimals,existentialDeposit:b?.existential_deposit,balance:g.transferable,weight:o,type:b?.asset_type.type}]}}isActivePool(t,e){let{start:n,end:s}=t;return n&&s?e>=n&&e<s:!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(i=>i.address===e);return{repayFee:await this.getRepayFee(),exchangeFee:n.fee}}subscribeValidationData(){return this.api.query.ParachainSystem.ValidationData.watchValue("best").pipe((0,Bt.filter)(t=>t!==void 0),(0,Bt.distinctUntilChanged)((t,e)=>t.relay_parent_number===e.relay_parent_number)).subscribe(({relay_parent_number:t})=>{this.store.update(async e=>{let n=[];for(let s of e){let i=this.poolsData.get(s.address);if(i){let{assets:r,repay_target:a,fee_collector:o}=i,[l]=r,[u,p]=this.getPoolWeights(i,t),[d,m]=s.tokens,g=[{...d,weight:u},{...m,weight:p}],b=await this.isRepayFeeApplied(l,a,o.toString());n.push({...s,tokens:g,repayFeeApply:b})}}return n})})}subscribeUpdates(){let t=new Bt.Subscription;return t.add(this.subscribeValidationData()),t}};var Pn={};I(Pn,{OmniMath:()=>A,OmniPool:()=>Zt,OmniPoolClient:()=>te});var T=require("@galacticcouncil/math-omnipool"),vt=ot(require("big.js")),A=class{static calculateSpotPrice(t,e,n,s){return(0,T.calculate_spot_price)(t,e,n,s)}static calculateLrnaSpotPrice(t,e){return(0,T.calculate_lrna_spot_price)(t,e)}static calculateInGivenOut(t,e,n,s,i,r,a,o,l){return(0,T.calculate_in_given_out)(t,e,n,s,i,r,a,o,l)}static calculateLrnaInGivenOut(t,e,n,s,i){return(0,T.calculate_lrna_in_given_out)(t,e,n,s,i)}static calculateOutGivenIn(t,e,n,s,i,r,a,o,l){return(0,T.calculate_out_given_in)(t,e,n,s,i,r,a,o,l)}static calculateOutGivenLrnaIn(t,e,n,s,i){return(0,T.calculate_out_given_lrna_in)(t,e,n,s,i)}static calculateShares(t,e,n,s){return(0,T.calculate_shares)(t,e,n,s)}static calculateLiquidityOut(t,e,n,s,i,r,a,o){return(0,T.calculate_liquidity_out)(t,e,n,s,i,r,a,o)}static calculateLiquidityLRNAOut(t,e,n,s,i,r,a,o){return(0,T.calculate_liquidity_lrna_out)(t,e,n,s,i,r,a,o)}static calculateCapDifference(t,e,n,s){let i=(0,vt.default)(e),r=(0,vt.default)(t),a=(0,vt.default)(s),o=(0,vt.default)(n),l=(0,vt.default)(10).pow(18),u=o.div(l);if(i.div(a).lt(u)){let d=u.times(a).minus(i).times(r),m=i.times((0,vt.default)(1).minus(u));return d.div(m).toFixed(0)}else return"0"}static calculateLimitHubIn(t,e,n,s){return(0,T.calculate_liquidity_hub_in)(t,e,n,s)}static isSellAllowed(t){return(0,T.is_sell_allowed)(t)}static isBuyAllowed(t){return(0,T.is_buy_allowed)(t)}static isAddLiquidityAllowed(t){return(0,T.is_add_liquidity_allowed)(t)}static isRemoveLiquidityAllowed(t){return(0,T.is_remove_liquidity_allowed)(t)}static recalculateAssetFee(t,e,n,s,i,r,a,o,l,u,p){return(0,T.recalculate_asset_fee)(t,e,n,s,i,r,a,o,l,u,p)}static recalculateProtocolFee(t,e,n,s,i,r,a,o,l,u,p){return(0,T.recalculate_protocol_fee)(t,e,n,s,i,r,a,o,l,u,p)}static verifyAssetCap(t,e,n,s){return(0,T.verify_asset_cap)(t,e,n,s)}};var{FeeUtils:Rt}=B,Zt=class c{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;hubAssetId;static fromPool(t){return new c(t.address,t.tokens,t.maxInRatio,t.maxOutRatio,t.minTradingLimit,t.hubAssetId)}constructor(t,e,n,s,i,r){this.type="Omnipool",this.address=t,this.tokens=e,this.maxInRatio=n,this.maxOutRatio=s,this.minTradingLimit=i,this.hubAssetId=r}validatePair(t,e){return this.hubAssetId!=e}parsePair(t,e){let n=new Map(this.tokens.map(r=>[r.id,r])),s=n.get(t),i=n.get(e);if(s==null)throw new Error("Pool does not contain tokenIn");if(i==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,hubReservesIn:s.hubReserves,hubReservesOut:i.hubReserves,sharesIn:s.shares,sharesOut:i.shares,decimalsIn:s.decimals,decimalsOut:i.decimals,balanceIn:s.balance,balanceOut:i.balance,tradeableIn:s.tradeable,tradeableOut:i.tradeable,assetInEd:s.existentialDeposit,assetOutEd:i.existentialDeposit}}validateAndBuy(t,e,n){let s=this.calculateInGivenOut(t,e),i=this.calculateInGivenOut(t,e,n),r=s===0n?0:_.calculateDiffToRef(i,s),a=[],o=A.isSellAllowed(t.tradeableIn),l=A.isBuyAllowed(t.tradeableOut);(!o||!l)&&a.push("TradeNotAllowed"),(e<this.minTradingLimit||s<t.assetInEd)&&a.push("InsufficientTradingAmount");let u=t.balanceOut/this.maxOutRatio;e>u&&a.push("MaxOutRatioExceeded");let p=t.balanceIn/this.maxInRatio;return i>p&&a.push("MaxInRatioExceeded"),{amountIn:i,calculatedIn:s,amountOut:e,feePct:r,errors:a}}validateAndSell(t,e,n){let s=this.calculateOutGivenIn(t,e),i=this.calculateOutGivenIn(t,e,n),r=_.calculateDiffToRef(s,i),a=[],o=A.isSellAllowed(t.tradeableIn),l=A.isBuyAllowed(t.tradeableOut);(!o||!l)&&a.push("TradeNotAllowed"),(e<this.minTradingLimit||s<t.assetOutEd)&&a.push("InsufficientTradingAmount");let u=t.balanceIn/this.maxInRatio;e>u&&a.push("MaxInRatioExceeded");let p=t.balanceOut/this.maxOutRatio;return i>p&&a.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:s,amountOut:i,feePct:r,errors:a}}calculateInGivenOut(t,e,n){if(t.assetIn==this.hubAssetId)return this.calculateLrnaInGivenOut(t,e,n);let s=A.calculateInGivenOut(t.balanceIn.toString(),t.hubReservesIn.toString(),t.sharesIn.toString(),t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),n?Rt.toRaw(n.assetFee).toString():"0",n?Rt.toRaw(n.protocolFee).toString():"0"),i=BigInt(s);return i<0n?0n:i}calculateLrnaInGivenOut(t,e,n){let s=A.calculateLrnaInGivenOut(t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),n?Rt.toRaw(n.assetFee).toString():"0"),i=BigInt(s);return i<0n?0n:i}calculateOutGivenIn(t,e,n){if(t.assetIn==this.hubAssetId)return this.calculateOutGivenLrnaIn(t,e,n);let s=A.calculateOutGivenIn(t.balanceIn.toString(),t.hubReservesIn.toString(),t.sharesIn.toString(),t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),n?Rt.toRaw(n.assetFee).toString():"0",n?Rt.toRaw(n.protocolFee).toString():"0"),i=BigInt(s);return i<0n?0n:i}calculateOutGivenLrnaIn(t,e,n){let s=A.calculateOutGivenLrnaIn(t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),n?Rt.toRaw(n.assetFee).toString():"0"),i=BigInt(s);return i<0n?0n:i}spotPriceInGivenOut(t){if(t.assetIn==this.hubAssetId)return this.spotPriceLrnaInGivenOut(t);let e=A.calculateSpotPrice(t.balanceOut.toString(),t.hubReservesOut.toString(),t.balanceIn.toString(),t.hubReservesIn.toString()),n=Math.pow(10,18-t.decimalsOut);return BigInt(e)/BigInt(n)}spotPriceLrnaInGivenOut(t){let e=A.calculateLrnaSpotPrice(t.hubReservesOut.toString(),t.balanceOut.toString()),n=Math.pow(10,18-t.decimalsOut);return BigInt(e)/BigInt(n)}spotPriceOutGivenIn(t){if(t.assetIn==this.hubAssetId)return this.spotPriceOutGivenLrnaIn(t);let e=A.calculateSpotPrice(t.balanceIn.toString(),t.hubReservesIn.toString(),t.balanceOut.toString(),t.hubReservesOut.toString()),n=Math.pow(10,18-t.decimalsIn);return BigInt(e)/BigInt(n)}spotPriceOutGivenLrnaIn(t){let e=A.calculateLrnaSpotPrice(t.balanceOut.toString(),t.hubReservesOut.toString()),n=Math.pow(10,18-t.decimalsIn);return BigInt(e)/BigInt(n)}};var gt=require("polkadot-api"),ds=require("@polkadot-api/utils"),D=require("rxjs");var{FeeUtils:L}=B,ps=gt.Binary.fromText("omnipool"),ms=(0,gt.Enum)("Short"),te=class extends K{queryBus=new Yt;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(ps,t,ms),t=>t.join(":"),6*1e3);getPoolType(){return"Omnipool"}getPoolAddress(){let t="modlomnipool".padEnd(32,"\0"),e=new TextEncoder().encode(t),n=(0,ds.toHex)(e);return(0,gt.AccountId)(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(gt.CompatibilityLevel.BackwardsCompatible,e)}async loadPools(){let t=await this.api.constants.Omnipool.HubAssetId(),e=this.getPoolAddress(),[n,s,i,r,a]=await Promise.all([this.api.query.Omnipool.Assets.getEntries(),this.api.query.Omnipool.HubAssetTradability.getValue(),this.api.query.AssetRegistry.Assets.getValue(t),this.getBalance(e,t),this.getPoolLimits()]),o=n.map(async({keyArgs:u,value:p})=>{let[d]=u,{hub_reserve:m,shares:g,tradable:b,cap:h,protocol_shares:P}=p,[y,v]=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:v.transferable,cap:h,hubReserves:m,protocolShares:P,shares:g,tradeable:b,type:y?.asset_type.type}}),l=await Promise.all(o);return l.push({id:t,decimals:i?.decimals,existentialDeposit:i?.existential_deposit,balance:r.transferable,tradeable:s,type:i?.asset_type.type}),[{address:e,type:"Omnipool",hubAssetId:t,tokens:l,...a}]}async getPoolFees(t){let e=t.assetOut,n=t.assetIn,s=await this.dynamicFeesConfig.get(e);if(s?.type==="Fixed"){let{asset_fee:y,protocol_fee:v}=s.value;return{assetFee:L.fromPermill(y),protocolFee:L.fromPermill(v)}}let i=this.getOraclePair(e),r=this.getOraclePair(n),[a,o,l]=await Promise.all([this.dynamicFees.get(e),this.emaOracles.get(i),this.emaOracles.get(r)]),[u,p,d]=await this.getAssetFee(t,this.block,a,o,s?.value.asset_fee_params),[m,g,b]=n===1?[0,0,0]:await this.getProtocolFee(t,this.block,a,l,s?.value.protocol_fee_params),h=u+m,P=d+b;return{assetFee:L.fromPermill(p),protocolFee:L.fromPermill(g),min:L.fromPermill(h),max:L.fromPermill(P)}}async getAssetFee(t,e,n,s,i){let{assetOut:r,balanceOut:a}=t,{min_fee:o,max_fee:l,decay:u,amplification:p}=i||await this.api.constants.DynamicFees.AssetFeeParameters();if(!n||!s)return[o,o,l];let d=L.fromPermill(o),m=L.fromPermill(l),[g]=s,{asset_fee:b,timestamp:h}=n,P=Math.max(1,e-h),y=g.volume.b_in.toString(),v=g.volume.b_out.toString(),w=g.liquidity.b.toString();r===0&&(y=g.volume.a_in.toString(),v=g.volume.a_out.toString(),w=g.liquidity.a.toString());let R=L.fromPermill(b),q=A.recalculateAssetFee(y,v,w,"9",a.toString(),L.toRaw(R).toString(),P.toString(),L.toRaw(d).toString(),L.toRaw(m).toString(),u.toString(),p.toString());return[o,Number(q)*1e6,l]}async getProtocolFee(t,e,n,s,i){let{assetIn:r,balanceIn:a}=t,{min_fee:o,max_fee:l,decay:u,amplification:p}=i||await this.api.constants.DynamicFees.ProtocolFeeParameters();if(!n||!s)return[o,o,l];let d=L.fromPermill(o),m=L.fromPermill(l),[g]=s,{protocol_fee:b,timestamp:h}=n,P=Math.max(1,e-h),y=g.volume.b_in.toString(),v=g.volume.b_out.toString(),w=g.liquidity.b.toString();r===0&&(y=g.volume.a_in.toString(),v=g.volume.a_out.toString(),w=g.liquidity.a.toString());let R=L.fromPermill(b),q=A.recalculateProtocolFee(y,v,w,"9",a.toString(),L.toRaw(R).toString(),P.toString(),L.toRaw(d).toString(),L.toRaw(m).toString(),u.toString(),p.toString());return[o,Number(q)*1e6,l]}subscribeEmaOracles(){let[t]=this.store.pools,n=t.tokens.map(s=>s.id).map(s=>this.getOraclePair(s)).map(s=>this.api.query.EmaOracle.Oracles.watchValue(ps,s,ms,"best").pipe((0,D.filter)(i=>i!==void 0),(0,D.map)(i=>({pair:s,value:i}))));return(0,D.merge)(...n).pipe((0,D.finalize)(()=>{this.log(this.getPoolType(),"unsub ema oracles"),this.emaOracles.clear()})).subscribe(s=>{let{pair:i,value:r}=s;this.emaOracles.set(r,i)})}subscribeDynamicFees(){return this.api.query.DynamicFees.AssetFee.watchEntries({at:"best"}).pipe((0,D.distinctUntilChanged)((t,e)=>!e.deltas),(0,D.finalize)(()=>{(0,D.finalize)(()=>{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((0,D.distinctUntilChanged)((t,e)=>!e.deltas),(0,D.finalize)(()=>{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((0,D.finalize)(()=>{this.log(this.getPoolType(),"unsub block change")})).subscribe(t=>{this.block=t})}subscribeAssets(){return this.api.query.Omnipool.Assets.watchEntries({at:"best"}).pipe((0,D.distinctUntilChanged)((t,e)=>!e.deltas),(0,D.finalize)(()=>{this.log(this.getPoolType(),"unsub assets")})).subscribe(({deltas:t})=>{this.store.update(([e])=>{let n=t?.upserted.reduce((i,r)=>{let[a]=r.args;return i.set(a,r.value),i},new Map),s=e.tokens.map(i=>{let r=n?.get(i.id);return r?this.updateTokenState(i,r):i});return[{...e,tokens:s}]})})}subscribeUpdates(){let t=new D.Subscription;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:s,tradable:i,cap:r,protocol_shares:a}=e;return{...t,cap:r,hubReserves:n,protocolShares:a,shares:s,tradeable:i}}};var Sn={};I(Sn,{StableMath:()=>V,StableSwap:()=>ee,StableSwapClient:()=>ne});var k=require("@galacticcouncil/math-stableswap"),V=class{static getPoolAddress(t){return(0,k.pool_account_name)(t)}static defaultPegs(t){let e=[];for(let n=0;n<t;n++)e.push(["1","1"]);return e}static calculateAmplification(t,e,n,s,i){return(0,k.calculate_amplification)(t,e,n,s,i)}static calculateInGivenOut(t,e,n,s,i,r,a){return(0,k.calculate_in_given_out)(t,e,n,s,i,r,a)}static calculateAddOneAsset(t,e,n,s,i,r,a){return(0,k.calculate_add_one_asset)(t,e,n,s,i,r,a)}static calculateSharesForAmount(t,e,n,s,i,r,a){return(0,k.calculate_shares_for_amount)(t,e,n,s,i,r,a)}static calculateOutGivenIn(t,e,n,s,i,r,a){return(0,k.calculate_out_given_in)(t,e,n,s,i,r,a)}static calculateLiquidityOutOneAsset(t,e,n,s,i,r,a){return(0,k.calculate_liquidity_out_one_asset)(t,e,n,s,i,r,a)}static calculateShares(t,e,n,s,i,r){return(0,k.calculate_shares)(t,e,n,s,i,r)}static calculateSpotPriceWithFee(t,e,n,s,i,r,a,o){return(0,k.calculate_spot_price_with_fee)(t,e,n,s,i,r,a,o)}static recalculatePegs(t,e,n,s,i){let r=(0,k.recalculate_peg)(t,e,n,s,i);return JSON.parse(r)}};var{FeeUtils:Ft}=B,ee=class c{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;amplification;isRampPeriod;id;fee;totalIssuance;pegs;static fromPool(t){return new c(t.address,t.tokens,t.maxInRatio,t.maxOutRatio,t.minTradingLimit,t.amplification,t.isRampPeriod,t.id,t.fee,t.totalIssuance,t.pegs)}constructor(t,e,n,s,i,r,a,o,l,u,p){this.type="Stableswap",this.address=t,this.tokens=e,this.maxInRatio=n,this.maxOutRatio=s,this.minTradingLimit=i,this.amplification=r,this.isRampPeriod=a,this.id=o,this.fee=l,this.totalIssuance=u,this.pegs=p}validatePair(t,e){return!0}parsePair(t,e){let n=new Map(this.tokens.map(r=>[r.id,r])),s=n.get(t),i=n.get(e);if(s==null)throw new Error("Pool does not contain tokenIn");if(i==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,balanceIn:s.balance,balanceOut:i.balance,decimalsIn:s.decimals,decimalsOut:i.decimals,tradeableIn:this.id===t?15:s.tradeable,tradeableOut:this.id===e?15:i.tradeable,assetInEd:s.existentialDeposit,assetOutEd:i.existentialDeposit}}validateAndBuy(t,e,n){let s=this.calculateInGivenOut(t,e),i=this.calculateInGivenOut(t,e,n),r=s===0n?0:_.calculateDiffToRef(i,s),a=[],o=A.isSellAllowed(t.tradeableIn),l=A.isBuyAllowed(t.tradeableOut);return(!o||!l)&&a.push("TradeNotAllowed"),(e<this.minTradingLimit||s<t.assetInEd)&&a.push("InsufficientTradingAmount"),{amountIn:i,calculatedIn:s,amountOut:e,feePct:r,errors:a}}validateAndSell(t,e,n){let s=this.calculateOutGivenIn(t,e),i=this.calculateOutGivenIn(t,e,n),r=_.calculateDiffToRef(s,i),a=[],o=A.isSellAllowed(t.tradeableIn),l=A.isBuyAllowed(t.tradeableOut);return(!o||!l)&&a.push("TradeNotAllowed"),(e<this.minTradingLimit||s<t.assetOutEd)&&a.push("InsufficientTradingAmount"),{amountIn:e,calculatedOut:s,amountOut:i,feePct:r,errors:a}}calculateIn(t,e,n){let s=V.calculateInGivenOut(this.getReserves(),Number(t.assetIn),Number(t.assetOut),e.toString(),this.amplification.toString(),n?Ft.toRaw(n.fee).toString():"0",this.getPegs()),i=BigInt(s);return i<0n?0n:i}calculateAddOneAsset(t,e,n){let s=V.calculateAddOneAsset(this.getReserves(),e.toString(),Number(t.assetIn),this.amplification.toString(),this.totalIssuance.toString(),n?Ft.toRaw(n.fee).toString():"0",this.getPegs()),i=BigInt(s);return i<0n?0n:i}calculateSharesForAmount(t,e,n){let s=V.calculateSharesForAmount(this.getReserves(),Number(t.assetOut),e.toString(),this.amplification.toString(),this.totalIssuance.toString(),n?Ft.toRaw(n.fee).toString():"0",this.getPegs()),i=BigInt(s);return i<0n?0n:i}calculateInGivenOut(t,e,n){return t.assetOut==this.id?this.calculateAddOneAsset(t,e,n):t.assetIn==this.id?this.calculateSharesForAmount(t,e,n):this.calculateIn(t,e,n)}spotPriceInGivenOut(t){let e=V.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 s=Math.pow(10,t.decimalsIn-t.decimalsOut);return BigInt(e)/BigInt(s)}let n=Math.pow(10,18-t.decimalsIn);return BigInt(e)/BigInt(n)}calculateOut(t,e,n){let s=V.calculateOutGivenIn(this.getReserves(),Number(t.assetIn),Number(t.assetOut),e.toString(),this.amplification.toString(),n?Ft.toRaw(n.fee).toString():"0",this.getPegs()),i=BigInt(s);return i<0n?0n:i}calculateWithdrawOneAsset(t,e,n){let s=V.calculateLiquidityOutOneAsset(this.getReserves(),e.toString(),Number(t.assetOut),this.amplification.toString(),this.totalIssuance.toString(),n?Ft.toRaw(n.fee).toString():"0",this.getPegs()),i=BigInt(s);return i<0n?0n:i}calculateShares(t,e,n){let s=V.calculateShares(this.getReserves(),this.getAssets(t.assetIn,e),this.amplification.toString(),this.totalIssuance.toString(),n?Ft.toRaw(n.fee).toString():"0",this.getPegs()),i=BigInt(s);return i<0n?0n:i}calculateOutGivenIn(t,e,n){return t.assetIn==this.id?this.calculateWithdrawOneAsset(t,e,n):t.assetOut==this.id?this.calculateShares(t,e,n):this.calculateOut(t,e,n)}spotPriceOutGivenIn(t){let e=V.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 s=Math.pow(10,t.decimalsOut-t.decimalsIn);return BigInt(e)/BigInt(s)}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:s})=>({asset_id:e,amount:n,decimals:s}));return JSON.stringify(t,mt.jsonFormatter)}getAssets(t,e){let n={asset_id:Number(t),amount:e.toString()};return JSON.stringify([n],mt.jsonFormatter)}};var De=require("polkadot-api"),gs=require("@polkadot-api/utils"),hs=require("@noble/hashes/blake2b"),j=require("rxjs");var{FeeUtils:bi}=B,ne=class extends K{poolsData=new Map([]);getPoolType(){return"Stableswap"}getPoolAddress(t){let e=V.getPoolAddress(t),n=(0,hs.blake2b)(e,{dkLen:32}),s=(0,gs.toHex)(n);return(0,De.AccountId)(63).dec(s)}async getPoolLimits(){return{maxInRatio:0n,maxOutRatio:0n,minTradingLimit:await this.api.constants.Stableswap.MinTradingLimit()}}getPoolAmplification(t,e){let{initial_amplification:n,final_amplification:s,initial_block:i,final_block:r}=t,a=V.calculateAmplification(n.toString(),s.toString(),i.toString(),r.toString(),e.toString()),o=Number(a)<s;return{amplification:BigInt(a),isRampPeriod:o}}async getPoolTokens(t,e){let n=this.getPoolAddress(t),s=e.assets.map(async i=>{let[r,a,o]=await Promise.all([this.api.query.Stableswap.AssetTradability.getValue(t,i),this.api.query.AssetRegistry.Assets.getValue(i),this.getBalance(n,i)]);return{id:i,decimals:a?.decimals,existentialDeposit:a?.existential_deposit,balance:o.transferable,tradeable:r,type:a?.asset_type.type}});return Promise.all(s)}async isSupported(){let t=this.api.query.Stableswap.Pools,e=await this.api.compatibilityToken;return t.isCompatible(De.CompatibilityLevel.BackwardsCompatible,e)}async loadPools(){let[t,e,n]=await Promise.all([this.api.query.Stableswap.Pools.getEntries(),this.api.query.System.Number.getValue(),this.getPoolLimits()]),s=t.map(async({keyArgs:i,value:r})=>{let[a]=i,o=this.getPoolAddress(a),[l,u,p]=await Promise.all([this.getPoolTokens(a,r),this.api.query.Stableswap.PoolPegs.getValue(a),this.api.query.Tokens.TotalIssuance.getValue(a)]),d=this.getPoolAmplification(r,e),m=u?this.getRecentPegs(u):this.getDefaultPegs(r);return l.push({id:a,tradeable:15,balance:p,decimals:18}),this.poolsData.set(a,r),{address:o,id:a,type:"Stableswap",fee:bi.fromPermill(r.fee),tokens:l,totalIssuance:p,pegs:m,...n,...d}});return Promise.all(s)}async getPoolFees(t,e){return{fee:this.store.pools.find(s=>s.address===e).fee}}getDefaultPegs(t){return V.defaultPegs(t.assets.length)}getRecentPegs(t){let{current:e}=t;return Array.from(e.entries()).map(([n,s])=>s.map(i=>i.toString()))}subscribeIssuance(){let e=this.store.pools.map(n=>n.id).map(n=>this.api.query.Tokens.TotalIssuance.watchValue(n,"best").pipe((0,j.map)(s=>({id:n,value:s}))));return(0,j.merge)(...e).pipe((0,j.finalize)(()=>{this.log(this.getPoolType(),"unsub total issuance")})).subscribe(n=>{let{id:s,value:i}=n;this.store.update(r=>{let a=[];return r.filter(o=>o.id===s).forEach(o=>{let l=o.tokens.map(u=>u.id===s?{...u,balance:i}:u);a.push({...o,tokens:l,totalIssuance:i})}),a})})}subscribePoolPegs(){return this.api.query.Stableswap.PoolPegs.watchEntries({at:"best"}).pipe((0,j.distinctUntilChanged)((t,e)=>!e.deltas),(0,j.finalize)(()=>{this.log(this.getPoolType(),"unsub pool pegs")})).subscribe(({deltas:t})=>{this.store.update(e=>{let n=[],s=new Map(e.map(i=>[i.id,i]));return t?.upserted.forEach(({args:i,value:r})=>{let[a]=i,o=s.get(a);if(o){let l=this.getRecentPegs(r);n.push({...o,pegs:l})}}),n})})}subscribeBlock(){return this.api.query.System.Number.watchValue("best").pipe((0,j.finalize)(()=>{this.log(this.getPoolType(),"unsub block change")})).subscribe(t=>{this.store.update(e=>{let n=[];return e.filter(s=>s.isRampPeriod).forEach(s=>{let i=this.poolsData.get(s.id);if(i){let r=this.getPoolAmplification(i,t);n.push({...s,...r})}}),n})})}subscribeUpdates(){let t=new j.Subscription;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 vn={};I(vn,{XykMath:()=>ut,XykPool:()=>se,XykPoolClient:()=>ie});var C=require("@galacticcouncil/math-xyk"),ut=class{static getSpotPrice(t,e,n){return(0,C.get_spot_price)(t,e,n)}static calculateInGivenOut(t,e,n){return(0,C.calculate_in_given_out)(t,e,n)}static calculateOutGivenIn(t,e,n){return(0,C.calculate_out_given_in)(t,e,n)}static calculatePoolTradeFee(t,e,n){return(0,C.calculate_pool_trade_fee)(t,e,n)}static calculateLiquidityIn(t,e,n){return(0,C.calculate_liquidity_in)(t,e,n)}static calculateSpotPrice(t,e){return(0,C.calculate_spot_price)(t,e)}static calculateSpotPriceWithFee(t,e,n,s){return(0,C.calculate_spot_price_with_fee)(t,e,n,s)}static calculateShares(t,e,n){return(0,C.calculate_shares)(t,e,n)}static calculateLiquidityOutAssetA(t,e,n,s){return(0,C.calculate_liquidity_out_asset_a)(t,e,n,s)}static calculateLiquidityOutAssetB(t,e,n,s){return(0,C.calculate_liquidity_out_asset_b)(t,e,n,s)}};var{FeeUtils:bs}=B,se=class c{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;static fromPool(t){return new c(t.address,t.tokens,t.maxInRatio,t.maxOutRatio,t.minTradingLimit)}constructor(t,e,n,s,i){this.type="XYK",this.address=t,this.tokens=e,this.maxInRatio=n,this.maxOutRatio=s,this.minTradingLimit=i}validatePair(t,e){return!0}parsePair(t,e){let n=new Map(this.tokens.map(r=>[r.id,r])),s=n.get(t),i=n.get(e);if(s==null)throw new Error("Pool does not contain tokenIn");if(i==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,decimalsIn:s.decimals,decimalsOut:i.decimals,balanceIn:s.balance,balanceOut:i.balance,assetInEd:s.existentialDeposit,assetOutEd:i.existentialDeposit}}validateAndBuy(t,e,n){let s=this.calculateInGivenOut(t,e),i=this.calculateTradeFee(s,n),r=bs.toPct(n.exchangeFee),a=s+i,o=[];(e<this.minTradingLimit||s<t.assetInEd)&&o.push("InsufficientTradingAmount");let l=t.balanceOut/this.maxOutRatio;e>l&&o.push("MaxOutRatioExceeded");let u=t.balanceIn/this.maxInRatio;return a>u&&o.push("MaxInRatioExceeded"),{amountIn:a,calculatedIn:s,amountOut:e,feePct:r,errors:o}}validateAndSell(t,e,n){let s=this.calculateOutGivenIn(t,e),i=this.calculateTradeFee(s,n),r=bs.toPct(n.exchangeFee),a=s-i,o=[];(e<this.minTradingLimit||s<t.assetOutEd)&&o.push("InsufficientTradingAmount");let l=t.balanceIn/this.maxInRatio;e>l&&o.push("MaxInRatioExceeded");let u=t.balanceOut/this.maxOutRatio;return a>u&&o.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:s,amountOut:a,feePct:r,errors:o}}calculateInGivenOut(t,e){let n=ut.calculateInGivenOut(t.balanceIn.toString(),t.balanceOut.toString(),e.toString()),s=BigInt(n);return s<0n?0n:s}calculateOutGivenIn(t,e){let n=ut.calculateOutGivenIn(t.balanceIn.toString(),t.balanceOut.toString(),e.toString()),s=BigInt(n);return s<0n?0n:s}spotPriceInGivenOut(t){let e=ut.calculateSpotPrice(t.balanceOut.toString(),t.balanceIn.toString()),n=Math.pow(10,18-t.decimalsOut);return BigInt(e)/BigInt(n)}spotPriceOutGivenIn(t){let e=ut.calculateSpotPrice(t.balanceIn.toString(),t.balanceOut.toString()),n=Math.pow(10,18-t.decimalsIn);return BigInt(e)/BigInt(n)}calculateTradeFee(t,e){let n=ut.calculatePoolTradeFee(t.toString(),e.exchangeFee[0],e.exchangeFee[1]);return BigInt(n)}};var ys=require("polkadot-api"),fs=require("rxjs");var ie=class extends K{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(ys.CompatibilityLevel.BackwardsCompatible,e)}async loadPools(){let t=this.api.query.XYK.PoolAssets,[e,n]=await Promise.all([t.getEntries(),this.getPoolLimits()]),s=e.map(async({keyArgs:i,value:r})=>{let[a]=i,[o,l]=r,[u,p,d,m]=await Promise.all([this.getBalance(a,o),this.api.query.AssetRegistry.Assets.getValue(o),this.getBalance(a,l),this.api.query.AssetRegistry.Assets.getValue(l)]);return{address:a,type:"XYK",tokens:[{id:o,decimals:p?.decimals||this.decimals.get(o),existentialDeposit:p?.existential_deposit,balance:u.transferable,type:p?.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(s)}async getPoolFees(){return{exchangeFee:await this.getExchangeFee()}}async getExchangeFee(){return await this.api.constants.XYK.GetExchangeFee()}subscribeUpdates(){return fs.Subscription.EMPTY}};var wn={};I(wn,{AavePool:()=>re,AavePoolClient:()=>ae});var re=class c{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;static fromPool(t){return new c(t.address,t.tokens,t.maxInRatio,t.maxOutRatio,t.minTradingLimit)}constructor(t,e,n,s,i){this.type="Aave",this.address=t,this.tokens=e,this.maxInRatio=n,this.maxOutRatio=s,this.minTradingLimit=i}validatePair(t,e){return!0}parsePair(t,e){let n=new Map(this.tokens.map(r=>[r.id,r])),s=n.get(t),i=n.get(e);if(s==null)throw new Error("Pool does not contain tokenIn");if(i==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,balanceIn:s.balance,balanceOut:i.balance,decimalsIn:s.decimals,decimalsOut:i.decimals,assetInEd:0n,assetOutEd:0n}}validateAndBuy(t,e,n){let s=this.calculateInGivenOut(t,e),i=[];return e>t.balanceOut&&i.push("TradeNotAllowed"),{amountIn:s,calculatedIn:s,amountOut:e,feePct:0,errors:i}}validateAndSell(t,e,n){let s=this.calculateOutGivenIn(t,e),i=[];return s>t.balanceOut&&i.push("TradeNotAllowed"),{amountIn:e,calculatedOut:s,amountOut:s,feePct:0,errors:i}}calculateInGivenOut(t,e){return e}calculateOutGivenIn(t,e){return e}spotPriceInGivenOut(t){let e=Math.pow(10,t.decimalsOut);return BigInt(e)}spotPriceOutGivenIn(t){let e=Math.pow(10,t.decimalsIn);return BigInt(e)}calculateTradeFee(t,e){return 0n}};var Ss=require("polkadot-api"),vs=require("@polkadot-api/utils"),z=require("rxjs"),ws=require("viem");var Ps=[{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:yi}=yt,fi=["Supply","Withdraw","Repay","Borrow"],ae=class extends K{getPoolType(){return"Aave"}async isSupported(){return!0}getPoolId(t,e){let n=t+"/"+e,s=new TextEncoder().encode(n.padEnd(32,"\0")),i=(0,vs.toHex)(s);return(0,Ss.AccountId)(63).dec(i)}getPoolLimits(){return{maxInRatio:0n,maxOutRatio:0n,minTradingLimit:0n}}async loadPools(){let e=(await this.api.apis.AaveTradeExecutor.pools()).map(async({reserve:n,atoken:s,liqudity_in:i,liqudity_out:r})=>{let[a,o,l,u]=await Promise.all([this.api.query.AssetRegistry.Assets.getValue(n),this.api.query.AssetRegistry.AssetLocations.getValue(n),this.api.query.AssetRegistry.Assets.getValue(s),this.api.query.AssetRegistry.AssetLocations.getValue(s)]);return{address:this.getPoolId(n,s),type:"Aave",tokens:[{id:n,decimals:a?.decimals,existentialDeposit:a?.existential_deposit,balance:i,location:o,type:a?.asset_type.type},{id:s,decimals:l?.decimals,existentialDeposit:l?.existential_deposit,balance:r,location:u,type:l?.asset_type.type}],...this.getPoolLimits()}});return Promise.all(e)}async getPoolDelta(t){let[e,n]=t.tokens,{liqudity_in:s,liqudity_out:i}=await this.api.apis.AaveTradeExecutor.pool(e.id,n.id);return t.tokens.map(r=>{let a=r.id===e.id?s:i;return{...r,balance:a}})}async getPoolFees(){return{}}getReserveH160Id(t){return t.type==="Erc20"?mt.findNestedKey(t.location,"AccountKey20").AccountKey20.key:yi.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,s=e.map(r=>r.asHex()),i=n.asHex();try{let{eventName:r,args:a}=(0,ws.decodeEventLog)({abi:Ps,topics:s,data:i}),o=a.reserve.toLowerCase();return{eventName:r,reserve:o,key:`${r}:${o}`}}catch{return}}subscribeRouterExecuted(){let e=this.store.pools.map(n=>n.tokens).map(([n,s])=>s).map(n=>n.id);return this.api.event.Router.Executed.watch().pipe((0,z.map)(({payload:n})=>this.parseRouterLog(n)),(0,z.filter)(({assetIn:n,assetOut:s})=>e.includes(n)||e.includes(s)),(0,z.finalize)(()=>{this.log(this.getPoolType(),"unsub router executed")})).subscribe(({assetIn:n,assetOut:s,key:i})=>{this.log(this.getPoolType(),"[router:Executed]",i),this.store.update(async r=>{let a=[];for(let o of r){let[l,u]=o.tokens;if(u.id===n||u.id===s){let d=await this.getPoolDelta(o);a.push({...o,tokens:d})}}return a})})}subscribeEvmLog(){return this.api.event.EVM.Log.watch().pipe((0,z.map)(({payload:t})=>this.parseEvmLog(t)),(0,z.filter)(t=>t!==void 0),(0,z.filter)(({eventName:t})=>fi.includes(t)),(0,z.finalize)(()=>{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 s=[];for(let i of n){let[r]=i.tokens;if(this.getReserveH160Id(r).toLowerCase()===t){let o=await this.getPoolDelta(i);s.push({...i,tokens:o})}}return s})})}subscribeBalances(){return z.Subscription.EMPTY}subscribeUpdates(){let t=new z.Subscription;return t.add(this.subscribeRouterExecuted()),t.add(this.subscribeEvmLog()),t}};var Et=class{static get(t){switch(t.type){case"Aave":return re.fromPool(t);case"XYK":return se.fromPool(t);case"Omnipool":return Zt.fromPool(t);case"LBP":return Qt.fromPool(t);case"Stableswap":return ee.fromPool(t);default:throw new Error("Pool type "+t.type+" is not supported yet")}}};var at=require("rxjs");var kt=class extends N{evm;aave;omnipool;stableswap;xyk;lbp;active=new Set([]);pools=new Map([]);clients=[];aaveSub=at.Subscription.EMPTY;omniSub=at.Subscription.EMPTY;stableSub=at.Subscription.EMPTY;xykSub=at.Subscription.EMPTY;lbpSub=at.Subscription.EMPTY;isReady=!1;isDestroyed=new at.Subject;constructor(t,e){super(t),this.evm=e,this.lbp=new Jt(t,e),this.omnipool=new te(t,e),this.stableswap=new ne(t,e),this.xyk=new ie(t,e),this.aave=new ae(t,e),this.clients=[this.lbp,this.omnipool,this.stableswap,this.xyk,this.aave]}subscribe(t){return t.getSubscriber().pipe((0,at.takeUntil)(this.isDestroyed)).subscribe(e=>{e.forEach(n=>{this.pools.set(n.address,n)})})}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}withLbp(){return this.lbpSub.unsubscribe(),this.lbpSub=this.subscribe(this.lbp),this.active.add("LBP"),this}withAave(){return this.aaveSub.unsubscribe(),this.aaveSub=this.subscribe(this.aave),this.active.add("Aave"),this}withXyk(t){return this.xyk.withOverride(t),this.xykSub.unsubscribe(),this.xykSub=this.subscribe(this.xyk),this.active.add("XYK"),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(s=>s.getPoolType()===e.type);if(n)return n.getPoolFees(t,e.address);throw new zt(e.type)}};var Rn={};I(Rn,{DEFAULT_BLOCK_TIME:()=>xs,DEFAULT_MIN_BUDGET:()=>_n,ORDER_MIN_BLOCK_PERIOD:()=>Is,Router:()=>Ct,TWAP_BLOCK_PERIOD:()=>ue,TWAP_MAX_DURATION:()=>On,TWAP_MAX_PRICE_IMPACT:()=>An,TWAP_TX_MULTIPLIER:()=>du,TradeOrderError:()=>In,TradeOrderType:()=>Le,TradeRouteBuilder:()=>$,TradeRouter:()=>Dt,TradeScheduler:()=>Mt,TradeType:()=>Me});var oe=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 Pi=10,le=class{isNotVisited(t,e){let n=!0;return e.forEach(s=>{(s[0]===t[0]||s[1]===t[1])&&(n=!1)}),n}findPaths(t,e,n){let s=[],i=new oe,r=[];for(r.push([e,""]),i.enqueue(r);i.size()>0;){let a=i.dequeue();if(!a||a.length>Pi)continue;let o=a[a.length-1];(n===null||o[0]===n)&&s.push(a),t.get(o[0])?.forEach(u=>{if(this.isNotVisited(u,a)){let p=[...a];p.push(u),i.enqueue(p)}})}return s}findShortestPaths(t,e,n){let s=[],i=new oe,r=[];r.push([e,""]),i.enqueue(r);let a=1/0;for(;i.size()>0;){let o=i.dequeue();if(!o)continue;let l=o[o.length-1];if(l[0]===n){o.length<a?(a=o.length,s.length=0,s.push(o)):o.length===a&&s.push(o);continue}let u=t.get(l[0]);for(let p of u??[])this.isNotVisited(p,o)&&i.enqueue([...o,p])}return s}buildAndPopulateGraph(t,e){let n=new Map;for(let s of t)n.set(parseInt(s),[]);for(let[s,i,r]of e)n.get(i)?.push([r,s]);return n}};function xn(c){let t={};for(let e of c){let n=e.tokens.length;for(let s=0;s<n;s++){t[e.tokens[s].id]||(t[e.tokens[s].id]=[]);for(let i=0;i<n;i++){if(s==i)continue;let r=[e.address,e.tokens[s].id,e.tokens[i].id];t[e.tokens[s].id].push(r)}}}return t}var ce=class{getProposals(t,e,n){let s=n.filter(h=>h.type==="XYK"),i=n.filter(h=>h.type!=="XYK"),r=new Set(i.map(h=>h.tokens).flat().map(h=>h.id)),a=r.has(t),o=r.has(e),l=new le,u=h=>{let P=xn(h),y=Object.keys(P),v=y.flatMap(w=>P[w]);return l.buildAndPopulateGraph(y,v)};if(!a&&!o){let h=s.filter(v=>v.tokens.find(w=>w.id===t)||v.tokens.find(w=>w.id===e)),P=u(h),y=l.findPaths(P,t,e);return this.parsePaths(y)}if(a&&o){let h=u(i),P=l.findPaths(h,t,e);return this.parsePaths(P)}let p=a?e:t,d=s.filter(h=>h.tokens.some(P=>P.id===p));if(d.length===0)return[];let m=[...i,...d],g=u(m),b=l.findPaths(g,t,e);return this.parsePaths(b)}parsePaths(t){let e=[];for(let n of t){let s=[];for(let i=0;i<n.length;i++){let r=n[i],a=n[i+1];if(a==null)break;s.push(this.toEdge(r,a))}e.push(s)}return e}toEdge(t,e){return[e[1],t[0],e[0]]}};var Ct=class{routeSuggester;routeProposals;ctx;filter={};constructor(t){this.ctx=t,this.routeSuggester=new ce,this.routeProposals=new Map}async withFilter(t){this.filter=t||{}}buildRouteKey(t,e,n){return`${t}->${e}::${n.length}`}applyPoolFilter(t){let{useOnly:e=[],exclude:n=[]}=this.filter,s=new Set(e),i=new Set(n);return t.filter(r=>i.has(r.type)?!1:s.size>0?s.has(r.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(s=>s!==t).map(s=>this.getRoutes(s,t)))).filter(s=>s.length>0).map(([s])=>s[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 s=this.getAssets(n);if(!s.has(t))throw new Error(t+" is not supported asset");if(!s.has(e))throw new Error(e+" is not supported asset");return this.toPoolsMap(n)}getAssets(t){let e=t.map(n=>n.tokens.map(s=>s.id)).flat().sort((n,s)=>n>s?1:-1);return new Set(e)}getPaths(t,e,n){let s=this.toPoolsMap(n);return this.getProposals(t,e,n).filter(r=>this.validPath(r,s)).map(r=>this.toHops(r,s))}getProposals(t,e,n){let s=this.buildRouteKey(t,e,n);if(this.routeProposals.has(s))return this.routeProposals.get(s);let i=this.routeSuggester.getProposals(t,e,n);return this.routeProposals.set(s,i),i}validPath(t,e){return t.length>0&&t.map(n=>this.validEdge(n,e)).reduce((n,s)=>n&&s)}validEdge([t,e,n],s){return s.get(t)?.validatePair(e,n)||!1}toPoolsMap(t){return new Map(t.map(e=>[e.address,Et.get(e)]))}toHops(t,e){return t.map(([n,s,i])=>{let r=e.get(n);return{poolAddress:n,poolId:r?.id,pool:r?.type,assetIn:s,assetOut:i}})}};var Me=(e=>(e.Buy="Buy",e.Sell="Sell",e))(Me||{}),Le=(n=>(n.Dca="Dca",n.TwapSell="TwapSell",n.TwapBuy="TwapBuy",n))(Le||{}),In=(n=>(n.OrderTooSmall="OrderTooSmall",n.OrderTooBig="OrderTooBig",n.OrderImpactTooBig="OrderImpactTooBig",n))(In||{});var{FeeUtils:Ts}=B,Dt=class extends Ct{mlr;poolsSnapshot;constructor(t){super(t),this.mlr=new Map}buildCtxSync(t,e){let n=this.poolsSnapshot,s=super.validateInput(t,e,n),i=super.getPaths(t,e,n);if(!i.length)throw new Xt(t,e);return{paths:i,pools:n,poolsMap:s}}async withCtx(t,e,n){this.poolsSnapshot||(this.poolsSnapshot=await super.getPools());let s=this.buildCtxSync(t,e);return n(s)}isDirectTrade(t){return t.length==1}findBestSellRoute(t){let e=t.sort((n,s)=>{let i=n[n.length-1].amountOut,r=s[s.length-1].amountOut;return i>r?-1:1});return e.find(n=>n.every(s=>s.errors.length==0))||e[0]}getRouteFeeRange(t){if(t.filter(n=>n.tradeFeeRange).length>0){let n=t.map(i=>i.tradeFeeRange?.[0]??i.tradeFeePct).reduce((i,r)=>i+r),s=t.map(i=>i.tradeFeeRange?.[1]??i.tradeFeePct).reduce((i,r)=>i+r);return[n,s]}}getPoolFeeRange(t){let e=t.min?Ts.toPct(t.min):void 0,n=t.max?Ts.toPct(t.max):void 0;if(e&&n)return[e,n]}async getBestSell(t,e,n){return this.getSell(t,e,n)}getSellSpot(t){let e=t[t.length-1];if(t.length===1)return e.spotPrice;let n=t.map(a=>a.assetOutDecimals).reduce((a,o)=>a+o),s=t.map(a=>a.spotPrice).reduce((a,o)=>a*o),i=n-e.assetOutDecimals,r=Math.pow(10,i);return s/BigInt(r)}async getSell(t,e,n,s){return this.withCtx(t,e,async({paths:i,poolsMap:r})=>{let a;if(s)a=await this.toSellSwaps(n,s,r);else{let o=i.map(u=>this.toSellSwaps(n,u,r)),l=await Promise.all(o);a=this.findBestSellRoute(l)}return this.buildSell(r,a)})}async getSells(t,e,n){return this.withCtx(t,e,async({paths:s,poolsMap:i})=>{let r=s.map(o=>this.toSellSwaps(n,o,i));return(await Promise.all(r)).filter(o=>o.every(l=>l.errors.length==0)).map(o=>this.buildSell(i,o)).sort((o,l)=>o.amountOut>l.amountOut?-1:1)})}buildSell(t,e){let n=e[0],s=e[e.length-1],i=this.isDirectTrade(e),r=this.getSellSpot(e),a=s.amountOut,o=i?s.calculatedOut:this.calculateDelta0Y(n.amountIn,e,t),l=o-a,u=this.getRouteFeeRange(e),p=i?s.tradeFeePct:_.calculateSellFee(o,a),d=Math.pow(10,n.assetInDecimals),m=n.amountIn*r/BigInt(d),g=_.calculateDiffToRef(o,m);return{type:"Sell",amountIn:n.amountIn,amountOut:s.amountOut,spotPrice:r,tradeFee:l,tradeFeePct:p,tradeFeeRange:u,priceImpactPct:g,swaps:e,toHuman(){return{type:"Sell",amountIn:S.toDecimal(n.amountIn,n.assetInDecimals),amountOut:S.toDecimal(s.amountOut,s.assetOutDecimals),spotPrice:S.toDecimal(r,s.assetOutDecimals),tradeFee:S.toDecimal(l,s.assetOutDecimals),tradeFeePct:p,tradeFeeRange:u,priceImpactPct:g,swaps:e.map(b=>b.toHuman())}}}}calculateDelta0Y(t,e,n){let s=[];for(let i=0;i<e.length;i++){let r=e[i],a=n.get(r.poolAddress);if(a==null)throw new Error("Pool does not exit");let o=a.parsePair(r.assetIn,r.assetOut),l;i>0?l=s[i-1]:l=t;let u=a.calculateOutGivenIn(o,l);s.push(u)}return s[s.length-1]}async calculateMostLiquidRoute(t,e,n){let{paths:s,pools:i,poolsMap:r}=n,l=i.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,P)=>h+P)).sort((b,h)=>h<b?-1:1)[0],u=_.getFraction(l,.1),p=await Promise.all(s.map(b=>this.toSellSwaps(u,b,r))),m=this.findBestSellRoute(p).map(b=>({poolAddress:b.poolAddress,poolId:b?.poolId,pool:b.pool,assetIn:b.assetIn,assetOut:b.assetOut})),g=this.buildRouteKey(t,e,i);return this.mlr.set(g,m),m}async toSellSwaps(t,e,n){let s=[];for(let i=0;i<e.length;i++){let r=e[i],a=n.get(r.poolAddress);if(a==null)throw new Error("Pool does not exit");let o=a.parsePair(r.assetIn,r.assetOut),l;i>0?l=s[i-1].amountOut:l=typeof t=="string"?S.toBigInt(t,o.decimalsIn):t;let u=await this.ctx.getPoolFees(o,a),{amountOut:p,calculatedOut:d,feePct:m,errors:g}=a.validateAndSell(o,l,u),b=this.getPoolFeeRange(u),h=a.spotPriceOutGivenIn(o),P=Math.pow(10,o.decimalsIn),y=l*h/BigInt(P),v=_.calculateDiffToRef(d,y);s.push({...r,assetInDecimals:o.decimalsIn,assetOutDecimals:o.decimalsOut,amountIn:l,amountOut:p,calculatedOut:d,spotPrice:h,tradeFeePct:m,tradeFeeRange:b,priceImpactPct:v,errors:g,isSupply(){return a.type==="Aave"&&a.tokens[0].id===r.assetIn},isWithdraw(){return a.type==="Aave"&&a.tokens[1].id===r.assetIn},toHuman(){return{...r,amountIn:S.toDecimal(l,o.decimalsIn),amountOut:S.toDecimal(p,o.decimalsOut),calculatedOut:S.toDecimal(d,o.decimalsOut),spotPrice:S.toDecimal(h,o.decimalsOut),tradeFeePct:m,tradeFeeRange:b,priceImpactPct:v,errors:g}}})}return s}async getMostLiquidRoute(t,e){return this.withCtx(t,e,async n=>{let s=this.buildRouteKey(t,e,n.pools),i=this.mlr.get(s);return i||this.calculateMostLiquidRoute(t,e,n)})}async getSpotPrice(t,e){return this.withCtx(t,e,async n=>{let{pools:s,poolsMap:i}=n,r=this.buildRouteKey(t,e,s),a=this.mlr.get(r);a||(a=await this.calculateMostLiquidRoute(t,e,n));let o=await this.toSellSwaps("1",a,i),l=this.getSellSpot(o),u=o[o.length-1].assetOutDecimals;return{amount:l,decimals:u}}).catch(()=>{})}findBestBuyRoute(t){let e=t.sort((n,s)=>{let i=n[0].amountIn,r=s[0].amountIn;return i>r?1:-1});return e.find(n=>n.every(s=>s.errors.length==0))||e[0]}async getBestBuy(t,e,n){return this.getBuy(t,e,n)}getBuySpot(t){let e=t[0];if(t.length===1)return e.spotPrice;let n=t.map(a=>a.assetInDecimals).reduce((a,o)=>a+o),s=t.map(a=>a.spotPrice).reduce((a,o)=>a*o),i=n-e.assetInDecimals,r=Math.pow(10,i);return s/BigInt(r)}async getBuy(t,e,n,s){return this.withCtx(t,e,async({paths:i,poolsMap:r})=>{let a;if(s)a=await this.toBuySwaps(n,s,r);else{let o=i.map(u=>this.toBuySwaps(n,u,r)),l=await Promise.all(o);a=this.findBestBuyRoute(l)}return this.buildBuy(r,a)})}async getBuys(t,e,n){return this.withCtx(t,e,async({paths:s,poolsMap:i})=>{let r=s.map(o=>this.toBuySwaps(n,o,i));return(await Promise.all(r)).filter(o=>o.every(l=>l.errors.length==0)).map(o=>this.buildBuy(i,o)).sort((o,l)=>o.amountIn>l.amountIn?1:-1)})}buildBuy(t,e){let n=e[e.length-1],s=e[0],i=this.isDirectTrade(e),r=this.getBuySpot(e),a=s.amountIn,o=i?s.calculatedIn:this.calculateDelta0X(n.amountOut,e,t),l=a-o,u=this.getRouteFeeRange(e),p=i?s.tradeFeePct:_.calculateBuyFee(o,a),d=Math.pow(10,n.assetOutDecimals),m=n.amountOut*r/BigInt(d),g;return o===0n?g=-100:g=_.calculateDiffToRef(m,o),{type:"Buy",amountOut:n.amountOut,amountIn:s.amountIn,spotPrice:r,tradeFee:l,tradeFeePct:p,tradeFeeRange:u,priceImpactPct:g,swaps:e,toHuman(){return{type:"Buy",amountOut:S.toDecimal(n.amountOut,n.assetOutDecimals),amountIn:S.toDecimal(s.amountIn,s.assetInDecimals),spotPrice:S.toDecimal(r,s.assetInDecimals),tradeFee:S.toDecimal(l,s.assetInDecimals),tradeFeePct:p,tradeFeeRange:u,priceImpactPct:g,swaps:e.map(b=>b.toHuman())}}}}calculateDelta0X(t,e,n){let s=[];for(let i=e.length-1;i>=0;i--){let r=e[i],a=n.get(r.poolAddress);if(a==null)throw new Error("Pool does not exit");let o=a.parsePair(r.assetIn,r.assetOut),l;i==e.length-1?l=t:l=s[0];let u=a.calculateInGivenOut(o,l);s.unshift(u)}return s[0]}async toBuySwaps(t,e,n){let s=[];for(let i=e.length-1;i>=0;i--){let r=e[i],a=n.get(r.poolAddress);if(a==null)throw new Error("Pool does not exit");let o=a.parsePair(r.assetIn,r.assetOut),l;i==e.length-1?l=typeof t=="string"?S.toBigInt(t,o.decimalsOut):t:l=s[0].amountIn;let u=await this.ctx.getPoolFees(o,a),{amountIn:p,calculatedIn:d,feePct:m,errors:g}=a.validateAndBuy(o,l,u),b=this.getPoolFeeRange(u),h=a.spotPriceInGivenOut(o),P=Math.pow(10,o.decimalsOut),y=l*h/BigInt(P),v;d===0n?v=-100:v=_.calculateDiffToRef(y,d),s.unshift({...r,assetInDecimals:o.decimalsIn,assetOutDecimals:o.decimalsOut,amountOut:l,amountIn:p,calculatedIn:d,spotPrice:h,tradeFeePct:m,tradeFeeRange:b,priceImpactPct:v,errors:g,isSupply(){return a.type==="Aave"&&a.tokens[0].id===r.assetIn},isWithdraw(){return a.type==="Aave"&&a.tokens[1].id===r.assetIn},toHuman(){return{...r,amountOut:S.toDecimal(l,o.decimalsOut),amountIn:S.toDecimal(p,o.decimalsIn),calculatedIn:S.toDecimal(d,o.decimalsIn),spotPrice:S.toDecimal(h,o.decimalsIn),tradeFeePct:m,tradeFeeRange:b,priceImpactPct:v,errors:g}}})}return s}};var xs=6e3,_n=1000000000000000n,ue=6,An=-5,On=216e5,du=3,Is=6;var Bn=require("polkadot-api");var $=class{static build(t){return t.map(({assetIn:e,assetOut:n,pool:s,poolId:i})=>s==="Stableswap"?{pool:(0,Bn.Enum)("Stableswap",i),asset_in:e,asset_out:n}:{pool:(0,Bn.Enum)(s),asset_in:e,asset_out:n})}};var Mt=class{schedulerOptions;router;constructor(t,e={}){this.router=t,this.schedulerOptions=Object.freeze({blockTime:e.blockTime??6e3,minBudgetInNative:e.minBudgetInNative??_n})}get blockTime(){return this.schedulerOptions.blockTime}get minOrderBudget(){return this.schedulerOptions.minBudgetInNative}async getDcaOrder(t,e,n,s,i){let[r,a]=await Promise.all([this.getMinimumOrderBudget(t),this.router.getBestSell(t,e,n)]),{amountIn:o,swaps:l,priceImpactPct:u}=a,p=l[0],d=l[l.length-1],{assetInDecimals:m}=p,{assetOutDecimals:g}=d,b=Math.abs(u),h=this.getMinimumTradeCount(o,r),P=this.getOptimalTradeCount(b),y=i?Math.round(s/i):P,v=Math.ceil(s/h),w=Math.round(s/P),R=Math.round(s/y),q=o/BigInt(y),O=await this.router.getBestSell(t,e,q),G=o<r,Q=[];G&&Q.push("OrderTooSmall");let et=O.amountOut*BigInt(y),Y=this.toBlockPeriod(R),J=O.tradeFee*BigInt(y),ht=$.build(l),bt={assetIn:t,assetOut:e,errors:Q,frequencyMin:v,frequencyOpt:w,frequency:R,tradeCount:y,tradeFee:J,tradeImpactPct:O.priceImpactPct,tradePeriod:Y,tradeRoute:ht,type:"Dca"};return{...bt,amountIn:o,amountOut:et,tradeAmountIn:O.amountIn,tradeAmountOut:O.amountOut,toHuman(){return{...bt,amountIn:S.toDecimal(o,m),amountOut:S.toDecimal(et,g),tradeAmountIn:S.toDecimal(O.amountIn,m),tradeAmountOut:S.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 s=t+n/2n;return Number(s/n)}getOptimalTradeCount(t){let e=Math.round(t*10)||1;return Math.max(e,3)}async getTwapSellOrder(t,e,n){let[s,i]=await Promise.all([this.getMinimumOrderBudget(t),this.router.getBestSell(t,e,n)]),{amountIn:r,swaps:a,priceImpactPct:o}=i,l=a[0],u=a[a.length-1],{assetInDecimals:p}=l,{assetOutDecimals:d}=u,m=Math.abs(o),g=this.getTwapTradeCount(m),b=r/BigInt(g),h=await this.router.getBestSell(l.assetIn,u.assetOut,b),P=g===1,y=r<s,v=h.priceImpactPct<-5,w=[];y||P?w.push("OrderTooSmall"):v&&w.push("OrderImpactTooBig");let R=h.amountOut*BigInt(g),q=h.tradeFee*BigInt(g),O=$.build(a),G={assetIn:t,assetOut:e,errors:w,tradeCount:g,tradeImpactPct:h.priceImpactPct,tradePeriod:6,tradeRoute:O,type:"TwapSell"};return{...G,amountIn:r,amountOut:R,tradeAmountIn:h.amountIn,tradeAmountOut:h.amountOut,tradeFee:q,toHuman(){return{...G,amountIn:S.toDecimal(r,p),amountOut:S.toDecimal(R,d),tradeAmountIn:S.toDecimal(h.amountIn,p),tradeAmountOut:S.toDecimal(h.amountOut,d),tradeFee:S.toDecimal(q,d)}}}}async getTwapBuyOrder(t,e,n){let[s,i]=await Promise.all([this.getMinimumOrderBudget(t),this.router.getBestBuy(t,e,n)]),{amountOut:r,swaps:a,priceImpactPct:o}=i,l=a[0],u=a[a.length-1],{assetInDecimals:p}=l,{assetOutDecimals:d}=u,m=Math.abs(o),g=this.getTwapTradeCount(m),b=r/BigInt(g),h=await this.router.getBestBuy(l.assetIn,u.assetOut,b),P=h.amountIn*BigInt(g),y=g===1,v=P<s,w=h.priceImpactPct<-5,R=[];v||y?R.push("OrderTooSmall"):w&&R.push("OrderImpactTooBig");let q=h.tradeFee*BigInt(g),O=$.build(a),G={assetIn:t,assetOut:e,errors:R,tradeCount:g,tradeImpactPct:h.priceImpactPct,tradePeriod:6,tradeRoute:O,type:"TwapBuy"};return{...G,amountIn:P,amountOut:r,tradeAmountIn:h.amountIn,tradeAmountOut:h.amountOut,tradeFee:q,toHuman(){return{...G,amountIn:S.toDecimal(P,p),amountOut:S.toDecimal(r,d),tradeAmountIn:S.toDecimal(h.amountIn,p),tradeAmountOut:S.toDecimal(h.amountOut,d),tradeFee:S.toDecimal(q,p)}}}}getTwapTradeCount(t){let e=this.getOptimalTradeCount(t);if(this.getTwapExecutionTime(e)>216e5){let s=216e5/(this.blockTime*6);return Math.round(s)}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 En={};I(En,{BIG_10:()=>Rs,BIG_BILL:()=>Fn,StakingApi:()=>pe,StakingClient:()=>me});var W=require("@galacticcouncil/math-staking"),X=ot(require("big.js"));var qe={none:.1,locked1x:1,locked2x:2,locked3x:3,locked4x:4,locked5x:5,locked6x:6},_s=c=>Object.keys(qe).includes(c);var As=require("polkadot-api"),Os=require("@polkadot-api/utils");function Bs(c){let t=("modl"+c).padEnd(32,"\0"),e=new TextEncoder().encode(t),n=(0,Os.toHex)(e);return(0,As.AccountId)(63).dec(n)}var Ne="20000000000000000",Ue="2000",Rs=(0,X.default)(10),Fn=(0,X.default)(Rs.pow(12)),pe=class{client;balanceClient;constructor(t,e){this.client=t,this.balanceClient=e}async getPotBalance(){let t=await this.client.getPalletId(),e=Bs(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 s=e.created_at,i=await n.reduce(async(r,[a,o])=>{let l=await r,u=a,p=o.amount,d=o.conviction.toString().toLowerCase(),m=await this.client.getReferendumInfo(u);return m&&(m.type==="Approved"||m.type==="Rejected")&&_s(d)&&l.push({id:u,amount:p,conviction:d}),l},Promise.resolve([]));return{stake:e.stake,rewardPerStake:e.reward_per_stake,createdAt:s,actionPoints:e.action_points,accumulatedUnpaidRewards:e.accumulated_unpaid_rewards,accumulatedSlashPoints:e.accumulated_slash_points,accumulatedLockedRewards:e.accumulated_locked_rewards,votes:i}}async getStake(t){let e=await this.client.getNFTCollectionId(),[n,s]=await Promise.all([this.client.getStaking(),this.client.getUniques(t,e)]),i=s.find(r=>r)?.itemId;return{totalStake:n?.total_stake,accumulatedRewardPerStake:n?.accumulated_reward_per_stake,potReservedBalance:n?.pot_reserved_balance,positionId:i,stakePosition:i?await this.getStakingPosition(i):void 0}}getCurrentActionPoints(t,e,n,s){let i=(0,X.default)(0),r=(0,X.default)(0),a=qe.locked6x,o=(0,X.default)(n.toString()).mul(a),l=100,u=[];t.forEach(m=>{let g=qe[m.conviction],b=s.includes(m.id.toString());b&&u.push(m.id.toString());let h=(0,X.default)(m.amount.toString()).mul(l).div(o);i=i.plus(Math.floor(h.mul(g).toNumber())),r=r.plus(Math.floor(h.mul(b?a:g).toNumber()))});let p=Math.floor((0,X.default)(n.toString()).mul(a).mul(l).div(o).toNumber());s.forEach(m=>{u.includes(m)||(r=r.plus(p))});let d={democracyVote:1};return i=i.mul(d.democracyVote),i=i.plus(e.toString()||"0"),r=r.mul(d.democracyVote),r=r.plus(e.toString()||"0"),{currentActionPoints:i.toString(),maxActionPoints:r.toString()}}async getRewards(t,e,n){let s=await this.getStake(t),{potReservedBalance:i,accumulatedRewardPerStake:r,totalStake:a,stakePosition:o}=s;if(!o)return;let[l,u,p,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=(0,X.default)(l.transferable.toString()).minus(i.toString()),P=h.gt(0)&&a>0?(0,W.calculate_accumulated_rps)(r.toString(),h.toString(),a.toString()):r.toString(),y=(0,W.calculate_period_number)(u.toString(),n,b),v=(0,W.calculate_period_number)(u.toString(),o.createdAt.toString(),b),w=(0,W.calculate_rewards)(P,o.rewardPerStake.toString(),o.stake.toString()),R=this.getCurrentActionPoints(o.votes,o.actionPoints,o.stake,e),q=(0,W.calculate_points)(v,y,d.toString(),m.toString(),R.currentActionPoints,g.toString(),o.accumulatedSlashPoints.toString()),O=(0,W.sigmoid)(q,Ne,Ue),G=(()=>{if(!e.length)return;let ht=(0,W.calculate_points)(v,y,d.toString(),m.toString(),R.maxActionPoints.toString(),g.toString(),o.accumulatedSlashPoints.toString());return(0,W.sigmoid)(ht,Ne,Ue)})(),Q=(0,X.default)(w).plus(o.accumulatedUnpaidRewards.toString()).plus(o.accumulatedLockedRewards.toString());if((0,X.default)(y).minus(v).lte(p.toString()))return{rewards:"0",payablePercentage:O,extraPayablePercentage:G,constants:{a:Ne,b:Ue}};let et=(0,W.calculate_percentage_amount)(Q.toString(),O),Y=(0,X.default)(o.accumulatedLockedRewards.toString()),J=Y.gt(et)?Y:(0,X.default)(et);return{rewards:J.div(Fn).toString(),maxRewards:Q.div(Fn).toString(),allocatedRewardsPercentage:J.div(Q).mul(100).toNumber(),payablePercentage:O,extraPayablePercentage:G,constants:{a:Ne,b:Ue}}}};var me=class extends N{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:r})=>{let[a,o,l]=r;return{address:a,collectionId:o,itemId:l}})}async getStakingPositionsValue(t){return await this.api.query.Staking.Positions.getValue(t)}async getStakingVotes(t){return await this.api.query.Staking.Votes.getValue(t)}async getReferendumInfo(t){return await this.api.query.Referenda.ReferendumInfoFor.getValue(t)}async 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 Cn={};I(Cn,{TxBuilderFactory:()=>qt});var kn=require("polkadot-api");function Fs(c){let t=[],e=c;for(;e&&typeof e=="object"&&"type"in e;)t.push(e.type),e=e.value;return t.join(".")}var Lt=class extends N{evm;evmClient;balanceClient;aaveUtils;constructor(t,e){super(t),this.evm=e,this.evmClient=e.getWsProvider(),this.balanceClient=new st(t),this.aaveUtils=new Pt(e)}wrapTx(t,e){return{name:t,get:()=>e,dryRun:n=>this.dryRun(n,e)}}async dispatchWithExtraGas(t){return this.api.tx.Dispatcher.dispatch_with_extra_gas({call:t.decodedCall,extra_gas:Ke})}async dryRun(t,e){let n=(0,kn.Enum)("Signed",t),s=(0,kn.Enum)("system",n),r=await this.client.getUnsafeApi().apis.DryRunApi.dry_run_call(s,e.decodedCall),a=r.success&&!r.value.execution_result.success?r.value.execution_result.value.error:null;if(a){let o=Fs(a.value);throw new Error("Dry run execution error!",{cause:o})}return r}isDirectOmnipoolTrade(t){return t.length===1&&t[0].pool==="Omnipool"}};var Ve=class extends Lt{_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:s}=e[0],i=await this.balanceClient.getBalance(this.beneficiary,s);return t>=i.transferable-5n?this.buildSellAllTx():this.buildSellTx()}async buildBuyTx(){let{amountIn:t,amountOut:e,swaps:n}=this.trade,s=n[0],i=n[n.length-1],r=_.getFraction(t,this.slippagePct),a=s.assetIn,o=i.assetOut,l=t+r,u;return this.isDirectOmnipoolTrade(n)?u=this.api.tx.Omnipool.buy({asset_in:a,asset_out:o,amount:e,max_sell_amount:l}):u=this.api.tx.Router.buy({asset_in:a,asset_out:o,amount_out:e,max_amount_in:l,route:$.build(n)}),this.wrapTx("RouterBuy",u)}async buildSellTx(){let{amountIn:t,amountOut:e,swaps:n}=this.trade,s=n[0],i=n[n.length-1],r=_.getFraction(e,this.slippagePct),a=s.assetIn,o=i.assetOut,l=e-r,u;return this.isDirectOmnipoolTrade(n)?u=this.api.tx.Omnipool.sell({asset_in:a,asset_out:o,amount:t,min_buy_amount:l}):u=this.api.tx.Router.sell({asset_in:a,asset_out:o,amount_in:t,min_amount_out:l,route:$.build(n)}),s.isWithdraw()&&await this.aaveUtils.hasBorrowPositions(this.beneficiary)&&(u=await this.dispatchWithExtraGas(u)),this.wrapTx("RouterSell",u)}async buildSellAllTx(){let{amountOut:t,swaps:e}=this.trade,n=e[0],s=e[e.length-1],i=_.getFraction(t,this.slippagePct),r=n.assetIn,a=s.assetOut,o=t-i,l=this.api.tx.Router.sell_all({asset_in:r,asset_out:a,min_amount_out:o,route:$.build(e)});return n.isWithdraw()&&await this.aaveUtils.hasBorrowPositions(this.beneficiary)&&(l=await this.dispatchWithExtraGas(l)),this.wrapTx("RouterSellAll",l)}};var Ge=require("polkadot-api");var We=class extends Lt{_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:s,tradePeriod:i,tradeRoute:r}=this.order,a=this.api.tx.DCA.schedule({schedule:{owner:this.beneficiary,period:i,max_retries:this.maxRetries,total_amount:t,slippage:this.slippagePct*1e4,stability_threshold:void 0,order:(0,Ge.Enum)("Sell",{asset_in:e,asset_out:n,amount_in:s,min_amount_out:0n,route:r})},start_execution_block:void 0});return this.wrapTx("DcaSchedule",a)}buildTwapSellTx(){let{amountIn:t,assetIn:e,assetOut:n,tradeAmountIn:s,tradeAmountOut:i,tradePeriod:r,tradeRoute:a}=this.order,o=_.getFraction(i,this.slippagePct),l=i-o,u=this.api.tx.DCA.schedule({schedule:{owner:this.beneficiary,period:r,max_retries:this.maxRetries,total_amount:t,slippage:this.slippagePct*1e4,stability_threshold:void 0,order:(0,Ge.Enum)("Sell",{asset_in:e,asset_out:n,amount_in:s,min_amount_out:l,route:a})},start_execution_block:void 0});return this.wrapTx("DcaSchedule.twapSell",u)}buildTwapBuyTx(){let{amountIn:t,assetIn:e,assetOut:n,tradeAmountIn:s,tradeAmountOut:i,tradePeriod:r,tradeRoute:a}=this.order,o=_.getFraction(s,this.slippagePct),l=s+o,u=this.api.tx.DCA.schedule({schedule:{owner:this.beneficiary,period:r,max_retries:this.maxRetries,total_amount:t,slippage:this.slippagePct*1e4,stability_threshold:void 0,order:(0,Ge.Enum)("Buy",{asset_in:e,asset_out:n,amount_out:i,max_amount_in:l,route:a})},start_execution_block:void 0});return this.wrapTx("DcaSchedule.twapBuy",u)}};var qt=class{client;evmClient;constructor(t,e){this.client=t,this.evmClient=e}trade(t){return new Ve(this.client,this.evmClient).setTrade(t)}order(t){return new We(this.client,this.evmClient).setOrder(t)}};async function Si(c){let t=new Ot(c),e=new Kt(c),[n,s]=await Promise.all([t.getBlockTime(),t.getMinOrderBudget()]),i=new kt(c,e).withAave().withOmnipool().withStableswap().withXyk(),r=new st(c),a=new me(c),o=new $t(c),l=new Pt(e),u=new Dt(i),p=new Mt(u,{blockTime:n,minBudgetInNative:s}),d=new pe(a,r),m=new jt(o,r,{blockTime:n});return{api:{aave:l,router:u,scheduler:p,staking:d,farm:m},client:{asset:new At(c),balance:r,evm:e},ctx:{pool:i},tx:new qt(c,e),destroy:()=>{i.destroy()}}}0&&(module.exports={QueryBus,aave,api,big,client,const:null,createSdkContext,erc20,error,evm,farm,fmt,h160,json,math,pool,sor,staking,tx,xc});