@oracle-agent/oracle 0.24.1 → 0.24.2
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/dist/assets/skills/chain/SKILL.md +34 -0
- package/dist/assets/skills/chain-defi-ecosystem-analysis/SKILL.md +181 -0
- package/dist/assets/skills/chain-ecosystem-gap-analysis/SKILL.md +162 -0
- package/dist/assets/skills/cross-chain-twap-execution/SKILL.md +125 -0
- package/dist/assets/skills/defi-protocol-pmf-assessment/SKILL.md +332 -0
- package/dist/assets/skills/evm-contract-research.md +8 -3
- package/dist/assets/skills/multi-venue-prepare-only-ranking/SKILL.md +93 -0
- package/dist/assets/skills/oracle-access-control/SKILL.md +71 -0
- package/dist/assets/skills/oracle-action-arming/SKILL.md +99 -0
- package/dist/assets/skills/oracle-airdrop-calculator/SKILL.md +111 -0
- package/dist/assets/skills/oracle-desk-product/SKILL.md +341 -0
- package/dist/assets/skills/oracle-evm/SKILL.md +55 -0
- package/dist/assets/skills/oracle-harness/SKILL.md +41 -0
- package/dist/assets/skills/oracle-mcp-install/SKILL.md +140 -0
- package/dist/assets/skills/oracle-multichain-convert/SKILL.md +87 -0
- package/dist/assets/skills/oracle-native-harness/SKILL.md +32 -0
- package/dist/assets/skills/oracle-ownership-gate/SKILL.md +42 -0
- package/dist/assets/skills/oracle-public-product-ux/SKILL.md +114 -0
- package/dist/assets/skills/oracle-tailscale/SKILL.md +32 -0
- package/dist/assets/skills/oracle-thin-client/SKILL.md +47 -0
- package/dist/assets/skills/perp-venue-funding-research/SKILL.md +161 -0
- package/dist/assets/skills/polymarket/SKILL.md +160 -0
- package/dist/assets/skills/protocol-api-key-integration/SKILL.md +141 -0
- package/dist/assets/skills/self-custodial-onchain-execution/SKILL.md +1284 -0
- package/dist/assets/skills/setup/SKILL.md +40 -0
- package/dist/assets/skills/stable-launch-ops/SKILL.md +89 -0
- package/dist/assets/skills/trade-loop-circuit-breaker/SKILL.md +441 -0
- package/dist/assets/skills/venue-capability-boundaries/SKILL.md +32 -0
- package/dist/bin/desk-server.mjs +16 -16
- package/dist/bin/oracle-data-mcp.mjs +1 -1
- package/dist/bin/oracle-equities.mjs +1 -1
- package/dist/bin/oracle-init.mjs +9 -9
- package/dist/cli/commands/bootstrap.mjs +1 -1
- package/dist/cli/commands/chat.mjs +78 -77
- package/dist/cli/commands/doctor.mjs +8 -6
- package/dist/cli/commands/eval.mjs +1 -1
- package/dist/cli/commands/harness.mjs +6 -6
- package/dist/cli/commands/model.mjs +82 -81
- package/dist/cli/commands/receipt.mjs +5 -0
- package/dist/cli/commands/setup.mjs +1 -1
- package/dist/cli/commands/venues.mjs +3 -0
- package/dist/cli/commands/watch.mjs +16 -0
- package/dist/equities/index.mjs +1 -1
- package/dist/index.mjs +1 -1
- package/package.json +1 -1
package/dist/index.mjs
CHANGED
|
@@ -55,7 +55,7 @@ ${i.stderr}`.slice(0,1500));let s=n.metadata.contractName;if(t.contractName&&t.c
|
|
|
55
55
|
}
|
|
56
56
|
}`,X_=`query Chains($filter: ChainsFilter!) {
|
|
57
57
|
chains(filter: $filter) { chainId name isTestnet explorerUrl }
|
|
58
|
-
}`;function Q_(e={}){let t=e.chainIds??(e.chainId!=null?[e.chainId]:null),n=(Array.isArray(t)?t:[t??1]).map(Number).filter(r=>Number.isInteger(r)&&r>0);if(!n.length)throw new Error("aave-v3: chainIds must contain at least one chain id");return[...new Set(n)]}async function M0(e={},t={}){let n={chainIds:Q_(e)};return e.user&&(n.user=String(e.user)),{markets:(await Ci(K_,{request:n},t))?.data?.markets??[]}}async function U0(e={},t={}){let n=String(e.address||e.market||e.marketAddress||"").trim();if(!/^0x[0-9a-fA-F]{40}$/.test(n))throw new Error("aave-v3: marketReserves requires an EVM market (pool) address");let r=Number(e.chainId??1);if(!Number.isInteger(r)||r<=0)throw new Error("aave-v3: chainId must be a positive integer");let o={address:n,chainId:r};e.user&&(o.user=String(e.user));let s=(await Ci(Y_,{request:o},t))?.data?.market??null;if(!s)throw new Error(`aave-v3: no market at ${n} on chain ${r}`);return{market:s}}async function B0(e={},t={}){let n=new Set(["MAINNET_ONLY","TESTNET_ONLY","ALL"]),r=String(e.filter||"MAINNET_ONLY").toUpperCase();if(!n.has(r))throw new Error(`aave-v3: filter must be one of ${[...n].join(", ")}`);return{chains:(await Ci(X_,{filter:r},t))?.data?.chains??[]}}async function D0(e={}){return{ok:(await Ci("query { health }",{},e))?.data?.health===!0,provider:"aave-v3"}}N();var Z_="https://staking-api.babylonlabs.io";function Tc(e={}){return String(e.baseUrl||process.env.BABYLON_STAKING_API_URL||Z_).replace(/\/$/,"")}function Ti(e,t={}){return y(`${Tc(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3,headers:{Accept:"application/json"}})}function F0(e,t="pkHex"){let n=String(e||"").trim().toLowerCase().replace(/^0x/,"");if(!/^[0-9a-f]+$/.test(n))throw new Error(`babylon-staking: ${t} must be hex`);if(n.length===66&&(n.startsWith("02")||n.startsWith("03")))return n.slice(2);if(n.length!==64)throw new Error(`babylon-staking: ${t} must be a 64-char x-only (or 66-char compressed) BTC public key`);return n}async function q0(e={}){try{let n=(await Ti("/v2/stats",e))?.data||{},r=Number(n.active_tvl??0);return{ok:Number.isFinite(r)&&r>0,provider:"babylon-staking",baseUrl:Tc(e),activeTvlSats:String(n.active_tvl??""),activeFinalityProviders:n.active_finality_providers??null,exec:!1}}catch(t){return{ok:!1,provider:"babylon-staking",baseUrl:Tc(e),error:String(t?.message||t),exec:!1}}}async function H0(e={},t={}){let r=(await Ti("/v2/stats",t))?.data||{};return{provider:"babylon-staking",activeTvlSats:String(r.active_tvl??""),totalActiveTvlSats:String(r.total_active_tvl??""),activeDelegations:r.active_delegations??null,totalActiveDelegations:r.total_active_delegations??null,activeFinalityProviders:r.active_finality_providers??null,totalFinalityProviders:r.total_finality_providers??null,btcStakingApr:r.btc_staking_apr??null,btcStakingAprPct:r.btc_staking_apr==null?null:Number(r.btc_staking_apr)*100,maxStakingApr:r.max_staking_apr??null,maxStakingAprPct:r.max_staking_apr==null?null:Number(r.max_staking_apr)*100,raw:r}}async function j0(e={},t={}){let n=await Ti("/v2/finality-providers",t),r=Array.isArray(n?.data)?n.data:[];if(e.state){let i=String(e.state).trim().toUpperCase();r=r.filter(s=>String(s.state||"").toUpperCase().includes(i))}if(e.btcPk){let i=F0(e.btcPk,"btcPk");r=r.filter(s=>String(s.btc_pk||"").toLowerCase()===i)}let o=Math.min(500,Math.max(1,Number(e.limit||r.length||1)));return{provider:"babylon-staking",count:r.length,finalityProviders:r.slice(0,o).map(i=>({btcPk:i.btc_pk??null,moniker:i.description?.moniker??null,website:i.description?.website??null,state:i.state??null,commission:i.commission??null,activeTvlSats:i.active_tvl==null?null:String(i.active_tvl),activeDelegations:i.active_delegations??null}))}}async function V0(e={},t={}){let n=F0(e.stakerPkHex||e.stakerPk||e.pkHex||e.pk,"stakerPkHex"),r=new URLSearchParams({staker_pk_hex:n});e.paginationKey&&r.set("pagination_key",String(e.paginationKey));let o=await Ti(`/v2/delegations?${r}`,t),i=Array.isArray(o?.data)?o.data:[],s=i.reduce((a,c)=>a+Number(c.delegation_staking?.staking_amount??c.staking_amount??0),0);return{provider:"babylon-staking",stakerPkHex:n,count:i.length,totalStakedSats:String(s),nextKey:o?.pagination?.next_key||null,delegations:i.map(a=>({stakingTxHashHex:a.delegation_staking?.staking_tx_hash_hex??a.staking_tx_hash_hex??null,state:a.state??null,stakingAmountSats:a.delegation_staking?.staking_amount==null&&a.staking_amount==null?null:String(a.delegation_staking?.staking_amount??a.staking_amount),stakingTimelock:a.delegation_staking?.staking_timelock??null,startHeight:a.delegation_staking?.start_height??null,finalityProviderBtcPks:a.finality_provider_btc_pks_hex??null})),raw:i}}N();var t1="https://markets.bisq.network";function Nc(e={}){return String(e.baseUrl||process.env.BISQ_MARKETS_URL||t1).replace(/\/$/,"")}function z0(e,t="market"){let n=String(e||"").trim().toLowerCase().replace(/[/\-\s]/g,"_");if(!/^[a-z0-9]{2,12}_[a-z0-9]{2,12}$/.test(n))throw new Error(`bisq-markets: ${t} must look like btc_usd (got "${e}")`);return n}function Ni(e,t={}){return y(`${Nc(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function W0(e={}){try{let t=await Ni("/api/markets",e),n=t&&typeof t=="object"?Object.keys(t).length:0;return{ok:n>0,provider:"bisq-markets",baseUrl:Nc(e),marketCount:n,exec:!1}}catch(t){return{ok:!1,provider:"bisq-markets",baseUrl:Nc(e),error:String(t?.message||t),exec:!1}}}async function G0(e={},t={}){let n=await Ni("/api/markets",t),r=Object.values(n&&typeof n=="object"?n:{});if(e.base){let o=String(e.base).trim().toLowerCase();r=r.filter(i=>String(i.lsymbol||"").toLowerCase()===o)}if(e.quote){let o=String(e.quote).trim().toLowerCase();r=r.filter(i=>String(i.rsymbol||"").toLowerCase()===o)}return{provider:"bisq-markets",count:r.length,markets:r.map(o=>({pair:o.pair??null,name:o.name??null,base:o.lsymbol??null,baseName:o.lname??null,quote:o.rsymbol??null,quoteName:o.rname??null,baseType:o.ltype??null,quoteType:o.rtype??null}))}}async function K0(e={},t={}){let n=z0(e.market||e.pair||"btc_usd","market"),r=await Ni(`/api/ticker?market=${encodeURIComponent(n)}`,t),o=Array.isArray(r)?r[0]||{}:r||{};return{provider:"bisq-markets",market:n,last:o.last==null?null:Number(o.last),high:o.high==null?null:Number(o.high),low:o.low==null?null:Number(o.low),bid:o.buy==null?null:Number(o.buy),ask:o.sell==null?null:Number(o.sell),volumeBase:o.volume_left==null?null:Number(o.volume_left),volumeQuote:o.volume_right==null?null:Number(o.volume_right),note:"Bisq is thin, non-KYC P2P \u2014 treat as a basis signal against centralized spot, not a reference rate",raw:o}}async function Y0(e={},t={}){let n=z0(e.market||e.pair||"btc_usd","market"),r=Math.min(2e3,Math.max(1,Number(e.limit||50))),o=new URLSearchParams({market:n,limit:String(r)});e.timestampFrom&&o.set("timestamp_from",String(e.timestampFrom)),e.timestampTo&&o.set("timestamp_to",String(e.timestampTo));let i=await Ni(`/api/trades?${o}`,t),s=Array.isArray(i)?i:[],a=s.length?Number(s[0].trade_date||0):null,c=s.reduce((l,u)=>l+Number(u.amount||0),0);return{provider:"bisq-markets",market:n,count:s.length,latestTradeAt:a?new Date(a).toISOString():null,latestTradeAgeHours:a?Math.round((Date.now()-a)/36e5*10)/10:null,volumeBase:c,trades:s.slice(0,r).map(l=>({price:l.price==null?null:Number(l.price),amount:l.amount==null?null:Number(l.amount),volume:l.volume==null?null:Number(l.volume),paymentMethod:l.payment_method??null,tradeDate:l.trade_date??null,tradeAt:l.trade_date?new Date(Number(l.trade_date)).toISOString():null}))}}N();var et=Object.freeze({60808:{name:"bob",label:"BOB (Build on Bitcoin)",url:"https://explorer.gobob.xyz",nativeSymbol:"ETH"},30:{name:"rootstock",label:"Rootstock (RSK)",url:"https://rootstock.blockscout.com",nativeSymbol:"RBTC"}}),r1=new Map([["bob",60808],["rootstock",30],["rsk",30]]),o1=60808;function Rr(e){if(e==null||e==="")return o1;let t=r1.get(String(e).trim().toLowerCase());if(t)return t;let n=Number(e);if(!et[n])throw new Error(`bob-rootstock: unsupported chain ${e} (supported: ${Object.keys(et).join(", ")} / bob, rootstock)`);return n}function Oc(e,t={}){if(t.baseUrl)return String(t.baseUrl).replace(/\/$/,"");let n=Rr(e),r=n===30?process.env.ROOTSTOCK_EXPLORER_URL:process.env.BOB_EXPLORER_URL;return String(r||et[n].url).replace(/\/$/,"")}function X0(e,t="address"){let n=String(e||"").trim();if(!/^0x[0-9a-fA-F]{40}$/.test(n))throw new Error(`bob-rootstock: ${t} must be a 0x EVM address`);return n}function Oi(e,t,n={}){return y(`${Oc(e,n)}${t.startsWith("/")?t:`/${t}`}`,{fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs??15e3})}async function Q0(e={},t={}){let n;try{n=Rr(t.chainId??t.chain??e.chainId)}catch(o){return{ok:!1,provider:"bob-rootstock",error:String(o?.message||o),exec:!1}}let r=et[n];try{let o=await Oi(n,"/api/v2/stats",e);return{ok:o?.total_blocks!=null||o?.total_transactions!=null,provider:"bob-rootstock",chainId:n,chain:r.name,baseUrl:Oc(n,e),totalBlocks:o?.total_blocks??null,averageBlockTimeMs:o?.average_block_time??null,exec:!1}}catch(o){return{ok:!1,provider:"bob-rootstock",chainId:n,chain:r.name,baseUrl:Oc(n,e),error:String(o?.message||o),exec:!1}}}async function Rc(e={},t={}){let n=e.chainId??e.chain;if(String(n).trim().toLowerCase()==="all"){let s=Object.keys(et).map(Number);return{provider:"bob-rootstock",chains:await Promise.all(s.map(async c=>{try{return await Rc({chainId:c},t)}catch(l){return{provider:"bob-rootstock",chainId:c,chain:et[c].name,error:String(l?.message||l)}}}))}}let r=Rr(n),o=et[r],i=await Oi(r,"/api/v2/stats",t);return{provider:"bob-rootstock",chainId:r,chain:o.name,label:o.label,nativeSymbol:o.nativeSymbol,averageBlockTimeMs:i.average_block_time??null,averageBlockTimeSec:i.average_block_time==null?null:Number(i.average_block_time)/1e3,gasPrices:i.gas_prices??null,gasPriceUpdatedAt:i.gas_price_updated_at??null,gasUsedToday:i.gas_used_today??null,coinPrice:i.coin_price??null,coinPriceChangePct:i.coin_price_change_percentage??null,marketCap:i.market_cap??null,tvl:i.tvl??null,totalBlocks:i.total_blocks??null,totalAddresses:i.total_addresses??null,totalTransactions:i.total_transactions??null,transactionsToday:i.transactions_today??null,networkUtilizationPct:i.network_utilization_percentage??null,raw:i}}async function J0(e={},t={}){let n=Rr(e.chainId??e.chain),r=X0(e.address||e.addr,"address"),o=et[n],i=await Oi(n,`/api/v2/addresses/${encodeURIComponent(r)}`,t);return{provider:"bob-rootstock",chainId:n,chain:o.name,address:r,nativeSymbol:o.nativeSymbol,coinBalanceWei:i.coin_balance==null?null:String(i.coin_balance),coinBalance:i.coin_balance==null?null:Number(i.coin_balance)/1e18,isContract:i.is_contract??null,isVerified:i.is_verified??null,name:i.name??null,blockNumberBalanceUpdatedAt:i.block_number_balance_updated_at??null,raw:i}}async function Z0(e={},t={}){let n=Rr(e.chainId??e.chain),r=X0(e.address||e.addr,"address"),o=await Oi(n,`/api/v2/addresses/${encodeURIComponent(r)}/token-balances`,t),i=Array.isArray(o)?o:[],s=Math.min(500,Math.max(1,Number(e.limit||i.length||1)));return{provider:"bob-rootstock",chainId:n,chain:et[n].name,address:r,count:i.length,tokens:i.slice(0,s).map(a=>({symbol:a.token?.symbol??null,name:a.token?.name??null,address:a.token?.address??a.token?.address_hash??null,type:a.token?.type??null,decimals:a.token?.decimals??null,rawBalance:a.value==null?null:String(a.value),balance:a.value==null||a.token?.decimals==null?null:Number(a.value)/10**Number(a.token.decimals),exchangeRate:a.token?.exchange_rate??null}))}}N();var s1="https://insights.braiins.com/api/v1.0";function $c(e={}){return String(e.baseUrl||process.env.BRAIINS_INSIGHTS_URL||s1).replace(/\/$/,"")}function Lc(e,t={}){return y(`${$c(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3,headers:{Accept:"application/json"}})}async function eg(e={}){try{let t=await Lc("/price-stats",e),n=Number(t?.price??0);return{ok:Number.isFinite(n)&&n>0,provider:"braiins-insights",baseUrl:$c(e),btcUsd:Number.isFinite(n)?n:null,timestamp:t?.timestamp??null,exec:!1}}catch(t){return{ok:!1,provider:"braiins-insights",baseUrl:$c(e),error:String(t?.message||t),exec:!1}}}async function tg(e={},t={}){let n=await Lc("/price-stats",t);return{provider:"braiins-insights",btcUsd:n?.price==null?null:Number(n.price),percentChange24h:n?.percent_change_24h??null,timestamp:n?.timestamp??null,raw:n}}async function ng(e={},t={}){let n=await Lc("/pool-stats",t),r=Array.isArray(n)?n:Array.isArray(n?.pools)?n.pools:[],o=String(e.window||"1w").trim().toLowerCase(),i=l=>l?.blocks_mined?.[o]||null,s=[...r].sort((l,u)=>Number(i(u)?.absolute||0)-Number(i(l)?.absolute||0)),a=Math.min(200,Math.max(1,Number(e.limit||s.length||1))),c=r.length?Object.keys(r[0]?.blocks_mined||{}):[];if(c.length&&!c.includes(o))throw new Error(`braiins-insights: window must be one of ${c.join(", ")}`);return{provider:"braiins-insights",window:o,availableWindows:c,count:s.length,pools:s.slice(0,a).map(l=>({name:l.pool_name??l.name??null,blocksMined:i(l)?.absolute??null,sharePct:i(l)?.relative_pct??null,blockValueAvg:l.block_value_avg??null,hashrate:l.hashrate??null,luck:l.luck??null,blocksMinedAllWindows:l.blocks_mined??null})),raw:s.slice(0,a)}}N();var c1="https://api.cow.fi",rg=Object.freeze({1:"mainnet",100:"xdai",42161:"arbitrum_one",8453:"base",11155111:"sepolia"});function og(e={}){return(e.baseUrl||process.env.COW_API_URL||c1).replace(/\/$/,"")}function l1(e={}){if(e.network)return String(e.network);let t=Number(e.chainId??1),n=rg[t];if(!n)throw new Error(`cow-protocol: unsupported chainId ${t} (have: ${Object.keys(rg).join(", ")})`);return n}function Mc(e,t,n){return`${og(n)}/${l1(e)}/api/v1${t}`}function ig(e,t){let n=String(e||"").trim();if(!/^0x[0-9a-fA-F]{40}$/.test(n))throw new Error(`cow-protocol: ${t} must be an EVM address`);return n}function sg(e,t=10){return Math.min(1e3,Math.max(1,Number(e.limit??t)))}async function ag(e={},t={}){return y(Mc(e,"/auction",t),{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function cg(e={},t={}){let n=ig(e.owner||e.address||e.user,"owner"),r=new URLSearchParams({limit:String(sg(e))});e.offset!=null&&r.set("offset",String(Math.max(0,Number(e.offset))));let o=await y(`${Mc(e,`/account/${n}/orders`,t)}?${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4}),i=Array.isArray(o)?o:[],s=e.openOnly===!1?i:i.filter(a=>String(a?.status||"").toLowerCase()==="open");return{owner:n,count:s.length,total:i.length,orders:s}}async function lg(e={},t={}){let n=new URLSearchParams;e.orderUid?n.set("orderUid",String(e.orderUid)):n.set("owner",ig(e.owner||e.address||e.user,"owner"));let r=await y(`${Mc(e,"/trades",t)}?${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4}),o=Array.isArray(r)?r:[];return{count:o.length,trades:o.slice(0,sg(e))}}async function ug(e={}){let t=await y(`${og(e)}/mainnet/api/v1/version`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??12e3}),n=typeof t=="string"?t:JSON.stringify(t??"");return{ok:n.trim().length>0,provider:"cow-protocol",version:n.trim()||null}}N();var d1="https://api.hiro.so",p1=20;function Uc(e={}){return String(e.baseUrl||process.env.HIRO_API_URL||d1).replace(/\/$/,"")}function m1(e={}){let t={Accept:"application/json"},n=e.apiKey||process.env.HIRO_API_KEY;return n&&(t["x-api-key"]=String(n)),t}function $r(e,t={}){return y(`${Uc(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3,headers:m1(t)})}async function dg(e={}){try{let t=await $r("/v2/info",e),n=Number(t?.burn_block_height??0);return{ok:Number.isFinite(n)&&n>0,provider:"hiro-stacks",baseUrl:Uc(e),burnBlockHeight:t?.burn_block_height??null,stacksTipHeight:t?.stacks_tip_height??null,serverVersion:t?.server_version??null,rateLimitRps:p1,keyed:!!(e.apiKey||process.env.HIRO_API_KEY),exec:!1}}catch(t){return{ok:!1,provider:"hiro-stacks",baseUrl:Uc(e),error:String(t?.message||t),exec:!1}}}async function pg(e={},t={}){let n=await $r("/v2/info",t);return{provider:"hiro-stacks",peerVersion:n.peer_version??null,serverVersion:n.server_version??null,networkId:n.network_id??null,burnBlockHeight:n.burn_block_height??null,stableBurnBlockHeight:n.stable_burn_block_height??null,stacksTipHeight:n.stacks_tip_height??null,stacksTip:n.stacks_tip??null,poxConsensus:n.pox_consensus??null,raw:n}}async function mg(e={},t={}){let n=await $r("/v2/pox",t),r=Number(n.total_liquid_supply_ustx||0),o=Number(n.current_cycle?.stacked_ustx||0);return{provider:"hiro-stacks",contractId:n.contract_id??null,currentCycleId:n.current_cycle?.id??null,currentCycleStackedUstx:n.current_cycle?.stacked_ustx==null?null:String(n.current_cycle.stacked_ustx),currentCycleIsPoX:n.current_cycle?.is_pox_active??null,nextCycleId:n.next_cycle?.id??null,nextCycleStackedUstx:n.next_cycle?.stacked_ustx==null?null:String(n.next_cycle.stacked_ustx),nextCycleMinThresholdUstx:n.next_cycle?.min_threshold_ustx==null?null:String(n.next_cycle.min_threshold_ustx),blocksUntilNextCycle:n.next_cycle?.blocks_until_prepare_phase??null,minAmountUstx:n.min_amount_ustx==null?null:String(n.min_amount_ustx),totalLiquidSupplyUstx:n.total_liquid_supply_ustx==null?null:String(n.total_liquid_supply_ustx),participationPct:r>0?o/r*100:null,rewardCycleLength:n.reward_cycle_length??null,rewardSlots:n.reward_slots??null,currentBurnchainBlockHeight:n.current_burnchain_block_height??null,raw:n}}async function fg(e={},t={}){let n=Math.min(60,Math.max(1,Number(e.limit||20))),r=Math.max(0,Number(e.offset||0)),o=await $r(`/extended/v2/pox/cycles?limit=${n}&offset=${r}`,t),i=Array.isArray(o?.results)?o.results:[];return{provider:"hiro-stacks",total:o?.total??null,limit:n,offset:r,cycles:i.map(s=>({cycleNumber:s.cycle_number??null,blockHeight:s.block_height??null,totalStackedAmount:s.total_stacked_amount==null?null:String(s.total_stacked_amount),totalWeight:s.total_weight??null,totalSigners:s.total_signers??null}))}}async function hg(e={},t={}){let n=Math.min(30,Math.max(1,Number(e.limit||1))),r=await $r(`/extended/v2/blocks?limit=${n}`,t),o=Array.isArray(r?.results)?r.results:[];return{provider:"hiro-stacks",total:r?.total??null,limit:n,blocks:o.map(i=>({height:i.height??null,hash:i.hash??null,burnBlockHeight:i.burn_block_height??null,burnBlockTime:i.burn_block_time??null,txCount:i.tx_count??null,canonical:i.canonical??null}))}}N();var h1="https://bundles.jito.wtf",yg=1e9;function Bc(e={}){return String(e.baseUrl||process.env.JITO_BUNDLES_URL||h1).replace(/\/$/,"")}function g1(e,t,n){let r=Number(e);return Number.isFinite(r)?Math.max(1,Math.min(Math.floor(r),n)):t}function gg(e){let t=Number(e);return Number.isFinite(t)?Math.round(t*yg):null}function y1(e={}){let t=Number(e.landedTipLamports);return{bundleId:e.bundleId||null,timestamp:e.timestamp||null,validator:e.validator||null,tippers:e.tippers||[],transactions:e.transactions||[],transactionCount:Array.isArray(e.transactions)?e.transactions.length:0,landedTipLamports:Number.isFinite(t)?t:null,landedTipSol:Number.isFinite(t)?t/yg:null,raw:e}}async function bg(e={}){try{let t=await y(`${Bc(e)}/api/v1/bundles/tip_floor`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??12e3}),n=Array.isArray(t)?t[0]:t,r=Number(n?.landed_tips_50th_percentile);return{ok:Number.isFinite(r),provider:"jito-mev",tipFloorP50Sol:Number.isFinite(r)?r:null,asOf:n?.time||null,exec:!1}}catch(t){return{ok:!1,provider:"jito-mev",error:String(t?.message||t),exec:!1}}}async function wg(e={},t={}){let n=g1(e.limit,5,100),r=new URL(`${Bc(t)}/api/v1/bundles/recent`);r.searchParams.set("limit",String(n)),r.searchParams.set("sort",String(e.sort||"Time")),r.searchParams.set("asc",String(!!e.asc));let o=await y(r.toString(),{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),s=(Array.isArray(o)?o:Array.isArray(o?.bundles)?o.bundles:[]).map(y1),a=s.map(c=>c.landedTipLamports).filter(c=>Number.isFinite(c));return{provider:"jito-mev",chain:"solana-mainnet-beta",count:s.length,totalTipLamports:a.reduce((c,l)=>c+l,0),maxTipLamports:a.length?Math.max(...a):null,bundles:s}}async function xg(e={}){let t=await y(`${Bc(e)}/api/v1/bundles/tip_floor`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??12e3}),n=(Array.isArray(t)?t[0]:t)||{},r={p25:Number(n.landed_tips_25th_percentile)||0,p50:Number(n.landed_tips_50th_percentile)||0,p75:Number(n.landed_tips_75th_percentile)||0,p95:Number(n.landed_tips_95th_percentile)||0,p99:Number(n.landed_tips_99th_percentile)||0,ema50:Number(n.ema_landed_tips_50th_percentile)||0};return{provider:"jito-mev",chain:"solana-mainnet-beta",asOf:n.time||null,tipFloorSol:r,tipFloorLamports:Object.fromEntries(Object.entries(r).map(([o,i])=>[o,gg(i)])),suggestedTipLamports:gg(r.p75||r.p50),raw:n}}N();var w1="https://api.kamino.finance";function x1(e={}){return String(e.baseUrl||process.env.KAMINO_API_URL||w1).replace(/\/$/,"")}function we(e){let t=Number(e);return Number.isFinite(t)?t:null}function Sg(e={}){let t=we(e.totalValueLocked)??0,n=we(e.apy?.totalApy)??0,r=we(e.kaminoApy?.totalApy)??0;return{strategy:e.strategy||null,pair:e.tokenA&&e.tokenB?`${e.tokenA}-${e.tokenB}`:null,tokenA:e.tokenA||null,tokenB:e.tokenB||null,tokenAMint:e.tokenAMint||null,tokenBMint:e.tokenBMint||null,tvlUsd:t,sharePrice:we(e.sharePrice),sharesIssued:we(e.sharesIssued),profitAndLoss:we(e.profitAndLoss),feeApy:n,feeApyPct:n*100,rewardApy:r,rewardApyPct:r*100,totalApy:n+r,totalApyPct:(n+r)*100,apr24h:we(e.apy?.vault?.totalApr),apy24h:we(e.kaminoApy?.vault?.apy24h),apy7d:we(e.kaminoApy?.vault?.apy7d),apy30d:we(e.kaminoApy?.vault?.apy30d),poolPrice:we(e.apy?.vault?.poolPrice),priceLower:we(e.apy?.vault?.priceLower),priceUpper:we(e.apy?.vault?.priceUpper),outOfRange:!!e.apy?.vault?.strategyOutOfRange,rewardMints:e.rewardMints||[],balances:e.vaultBalances||null,lastCalculated:e.kaminoApy?.vault?.lastCalculated||null}}async function Dc(e={},t={}){let n=new URL(`${x1(t)}/strategies/metrics`);n.searchParams.set("env",String(e.env||"mainnet-beta")),n.searchParams.set("status",String(e.status||"LIVE"));let r=await y(n.toString(),{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??45e3});return Array.isArray(r)?r:[]}async function kg(e={}){try{let t=await Dc({},e),n=t.filter(r=>(Number(r.totalValueLocked)||0)>0).length;return{ok:t.length>0,provider:"kamino-strategies",strategies:t.length,funded:n,exec:!1}}catch(t){return{ok:!1,provider:"kamino-strategies",error:String(t?.message||t),exec:!1}}}async function Eg(e={},t={}){let r=(await Dc(e,t)).map(Sg),o=r.length,i=Number.isFinite(Number(e.minTvlUsd))?Number(e.minTvlUsd):1e4;if(r=r.filter(l=>l.tvlUsd>=i),e.token){let l=String(e.token).toLowerCase();r=r.filter(u=>String(u.tokenA||"").toLowerCase()===l||String(u.tokenB||"").toLowerCase()===l||u.tokenAMint===e.token||u.tokenBMint===e.token)}if(e.pair){let l=String(e.pair).toLowerCase().replace(/[/_]/g,"-");r=r.filter(u=>String(u.pair||"").toLowerCase()===l)}e.inRangeOnly===!0&&(r=r.filter(l=>!l.outOfRange));let s=String(e.sortBy||"apy");r.sort((l,u)=>s==="tvl"?u.tvlUsd-l.tvlUsd:u.totalApy-l.totalApy);let a=Number.isFinite(Number(e.limit))&&Number(e.limit)>0?Number(e.limit):25,c=r.slice(0,a);return{provider:"kamino-strategies",chain:"solana-mainnet-beta",env:e.env||"mainnet-beta",status:e.status||"LIVE",totalStrategies:o,matched:r.length,count:c.length,minTvlUsd:i,tvlUsdMatched:r.reduce((l,u)=>l+u.tvlUsd,0),strategies:c}}async function vg(e={},t={}){let n=String(e.strategy||e.address||"").trim();if(!n)throw new Error("kamino-strategies: strategy address required");let o=(await Dc({...e,status:e.status||"ALL"},t)).find(i=>i.strategy===n);if(!o)throw new Error(`kamino-strategies: strategy ${n} not found`);return{provider:"kamino-strategies",chain:"solana-mainnet-beta",...Sg(o),raw:o}}N();var k1="https://blockstream.info/liquid/api",Ag="6f0279e9ed041c3d710a9f57d0c02928416460c4b722ae3457a11eec381c526d";function Ri(e={}){return String(e.baseUrl||process.env.LIQUID_ESPLORA_URL||k1).replace(/\/$/,"")}function E1(e,t="address"){let n=String(e||"").trim(),r=/^(ex1|lq1|el1|tex1|tlq1)[a-z0-9]{20,200}$/i.test(n),o=/^[QVGH][a-km-zA-HJ-NP-Z1-9]{25,110}$/.test(n);if(!r&&!o)throw new Error(`liquid-esplora: ${t} must look like a Liquid address (Q\u2026, VJL\u2026, ex1\u2026, lq1\u2026)`);return n}function v1(e,t="assetId"){let n=String(e||"").trim().toLowerCase().replace(/^0x/,"");if(!/^[0-9a-f]{64}$/.test(n))throw new Error(`liquid-esplora: ${t} must be 64-char hex`);return n}async function Ig(e,t={}){let n=`${Ri(t)}${e.startsWith("/")?e:`/${e}`}`,o=await(t.fetchImpl||fetch)(n,{method:"GET",headers:{accept:"application/json,text/plain;q=0.9,*/*;q=0.8"},signal:AbortSignal.timeout(t.timeoutMs??12e3)}),i=await o.text();if(!o.ok)throw new Error(`liquid-esplora GET ${e}: HTTP ${o.status} ${i.slice(0,160)}`);return i}function _g(e,t={}){return y(`${Ri(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3})}async function Pg(e={}){try{let t=await Ig("/blocks/tip/height",e),n=Number(t);return{ok:Number.isFinite(n)&&n>0,provider:"liquid-esplora",baseUrl:Ri(e),tipHeight:n,exec:!1,signing:"user-wallet"}}catch(t){return{ok:!1,provider:"liquid-esplora",baseUrl:Ri(e),error:String(t?.message||t),exec:!1}}}async function Cg(e={},t={}){let n=await Ig("/blocks/tip/height",t);return{provider:"liquid-esplora",tipHeight:Number(n)}}async function Tg(e={},t={}){let n=E1(e.address||e.addr,"address"),r=await _g(`/address/${n}`,t),o=r.chain_stats||{},i=r.mempool_stats||{},s=o.funded_txo_sum!=null,a=Number(o.funded_txo_sum||0)+Number(i.funded_txo_sum||0),c=Number(o.spent_txo_sum||0)+Number(i.spent_txo_sum||0);return{provider:"liquid-esplora",address:n,txCount:Number(o.tx_count||0)+Number(i.tx_count||0),balanceSats:s?String(a-c):null,confidential:!s,note:s?void 0:"Liquid amounts are blinded \u2014 Esplora returns TXO counts only for confidential outputs. Unblind with the wallet's blinding key for values.",chainStats:o,mempoolStats:i,raw:r}}async function Ng(e={},t={}){let n=v1(e.assetId||e.asset||Ag,"assetId"),r=await _g(`/asset/${n}`,t),o=r.chain_stats||{};return{provider:"liquid-esplora",assetId:n,isPolicyAsset:n===Ag,name:r.name??r.entity?.domain??null,ticker:r.ticker??null,precision:r.precision??null,issuanceTxid:r.issuance_txin?.txid??null,txCount:o.tx_count??null,pegInAmount:o.peg_in_amount==null?null:String(o.peg_in_amount),pegOutAmount:o.peg_out_amount==null?null:String(o.peg_out_amount),issuedAmount:o.issued_amount==null?null:String(o.issued_amount),burnedAmount:o.burned_amount==null?null:String(o.burned_amount),circulatingAmount:o.peg_in_amount!=null?String(Number(o.peg_in_amount)-Number(o.peg_out_amount||0)-Number(o.burned_amount||0)):o.issued_amount!=null?String(Number(o.issued_amount)-Number(o.burned_amount||0)):null,raw:r}}N();var I1="https://api-mainnet.magiceden.dev/v2/ord/btc",_1=600;function Fc(e={}){return String(e.baseUrl||process.env.MAGICEDEN_ORD_API_URL||I1).replace(/\/$/,"")}function P1(e={}){let t={Accept:"application/json"},n=e.apiKey||process.env.MAGICEDEN_API_KEY;return n&&(t.Authorization=`Bearer ${n}`),t}function Og(e,t="collectionSymbol"){let n=String(e||"").trim().toLowerCase();if(!/^[a-z0-9][a-z0-9_-]{0,63}$/.test(n))throw new Error(`magiceden-ordinals: ${t} must be a slug like "nodemonkes"`);return n}function Rg(e,t={}){return y(`${Fc(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3,headers:P1(t),retries:t.retries??1})}async function $g(e={}){let t=Og(e.probeCollection||process.env.MAGICEDEN_PROBE_COLLECTION||"nodemonkes");try{let n=await Rg(`/stat?collectionSymbol=${encodeURIComponent(t)}`,e);return{ok:n!=null&&typeof n=="object",provider:"magiceden-ordinals",baseUrl:Fc(e),probeCollection:t,rateLimitRpm:_1,exec:!1}}catch(n){let r=n?.status??null;return{ok:!1,provider:"magiceden-ordinals",baseUrl:Fc(e),probeCollection:t,status:r,upstreamDown:r===503||r===502||r===504,error:String(n?.message||n),fallback:"satflow",note:r===503?"Magic Eden ordinals API returned 503 'no healthy upstream'. Use the satflow provider for BTC NFT market data.":void 0,exec:!1}}}async function Lg(e={},t={}){let n=Og(e.collectionSymbol||e.symbol||e.collection,"collectionSymbol");try{let r=await Rg(`/stat?collectionSymbol=${encodeURIComponent(n)}`,t),o=r?.floorPrice==null?null:Number(r.floorPrice);return{ok:!0,provider:"magiceden-ordinals",collectionSymbol:n,floorPriceSats:o==null?null:String(r.floorPrice),floorPriceBtc:o==null?null:o/1e8,totalVolumeSats:r?.totalVolume==null?null:String(r.totalVolume),totalVolumeBtc:r?.totalVolume==null?null:Number(r.totalVolume)/1e8,totalListed:r?.totalListed??null,owners:r?.owners??null,supply:r?.supply??null,pendingTransactions:r?.pendingTransactions??null,inscriptionNumberMin:r?.inscriptionNumberMin??null,inscriptionNumberMax:r?.inscriptionNumberMax??null,raw:r}}catch(r){let o=r?.status??null;if(!(o===502||o===503||o===504))throw r;return{ok:!1,provider:"magiceden-ordinals",collectionSymbol:n,status:o,upstreamDown:!0,error:String(r?.message||r),fallback:"satflow",note:"Magic Eden ordinals API is returning 5xx ('no healthy upstream'). Query the satflow provider for floors and listings."}}}N();var T1="https://mempool.space/api",N1=7;function qc(e={}){return String(e.baseUrl||process.env.MEMPOOL_API_URL||T1).replace(/\/$/,"")}function $i(e,t={}){return y(`${qc(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}function Mg(e){if(!e)return{ageDays:null,stale:null};let t=new Date(e).getTime();if(!Number.isFinite(t))return{ageDays:null,stale:null};let n=(Date.now()-t)/864e5;return{ageDays:Math.round(n*10)/10,stale:n>N1}}async function Ug(e={}){try{let n=(await $i("/v1/lightning/statistics/latest",e))?.latest||{},{ageDays:r,stale:o}=Mg(n.added);return{ok:Number(n.node_count||0)>0,provider:"mempool-lightning",baseUrl:qc(e),snapshotAt:n.added??null,ageDays:r,stale:o,nodeCount:n.node_count??null,exec:!1}}catch(t){return{ok:!1,provider:"mempool-lightning",baseUrl:qc(e),error:String(t?.message||t),exec:!1}}}async function Bg(e={},t={}){let r=(await $i("/v1/lightning/statistics/latest",t))?.latest||{},{ageDays:o,stale:i}=Mg(r.added);return{provider:"mempool-lightning",snapshotAt:r.added??null,ageDays:o,stale:i,staleNote:i?`mempool.space Lightning snapshot is ${o} days old \u2014 trend only, not live state`:void 0,nodeCount:r.node_count??null,channelCount:r.channel_count??null,totalCapacitySats:r.total_capacity==null?null:String(r.total_capacity),totalCapacityBtc:r.total_capacity==null?null:Number(r.total_capacity)/1e8,avgCapacitySats:r.avg_capacity==null?null:String(r.avg_capacity),avgFeeRatePpm:r.avg_fee_rate??null,avgBaseFeeMsat:r.avg_base_fee_mtokens??null,torNodes:r.tor_nodes??null,clearnetNodes:r.clearnet_nodes??null,unannouncedNodes:r.unannounced_nodes??null,raw:r}}async function Dg(e={},t={}){let n=String(e.metric||e.ranking||"connectivity").trim().toLowerCase(),r=new Set(["connectivity","liquidity","channels"]);if(!r.has(n))throw new Error(`mempool-lightning: metric must be one of ${[...r].join(", ")}`);let o=await $i(`/v1/lightning/nodes/rankings/${n}`,t),i=Array.isArray(o)?o:[],s=Math.min(100,Math.max(1,Number(e.limit||i.length||1)));return{provider:"mempool-lightning",metric:n,count:i.length,nodes:i.slice(0,s).map(a=>({publicKey:a.publicKey??null,alias:a.alias??null,channels:a.channels??null,capacitySats:a.capacity==null?null:String(a.capacity),firstSeen:a.firstSeen??null,updatedAt:a.updatedAt??null,city:a.city?.en??a.city??null,country:a.country?.en??a.country??null,iso:a.iso_code??null}))}}async function Fg(e={},t={}){let n=await $i("/v1/lightning/nodes/countries",t),r=Array.isArray(n)?n:[],o=Math.min(250,Math.max(1,Number(e.limit||r.length||1))),i=r.reduce((s,a)=>s+Number(a.count||0),0);return{provider:"mempool-lightning",countryCount:r.length,totalNodes:i,topCountrySharePct:r[0]?.share??null,countries:r.slice(0,o).map(s=>({name:s.name?.en??s.name??null,iso:s.iso??null,count:s.count??null,sharePct:s.share??null,capacitySats:s.capacity==null?null:String(s.capacity)}))}}N();var R1="https://mempool.space/api",qg=new Set(["24h","3d","1w","1m","3m","6m","1y","2y","3y","all"]);function Hc(e={}){return String(e.baseUrl||process.env.MEMPOOL_API_URL||R1).replace(/\/$/,"")}function Hg(e,t){let n=String(e||t).trim().toLowerCase();if(!qg.has(n))throw new Error(`mempool-mining: window must be one of ${[...qg].join(", ")}`);return n}function Lr(e,t={}){return y(`${Hc(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function jg(e={}){try{let t=await Lr("/v1/difficulty-adjustment",e);return{ok:Number.isFinite(Number(t?.nextRetargetHeight))&&Number(t.nextRetargetHeight)>0,provider:"mempool-mining",baseUrl:Hc(e),nextRetargetHeight:t?.nextRetargetHeight??null,exec:!1}}catch(t){return{ok:!1,provider:"mempool-mining",baseUrl:Hc(e),error:String(t?.message||t),exec:!1}}}async function Vg(e={},t={}){let n=await Lr("/v1/difficulty-adjustment",t);return{provider:"mempool-mining",progressPercent:n.progressPercent??null,difficultyChangePct:n.difficultyChange??null,estimatedRetargetDate:n.estimatedRetargetDate??null,remainingBlocks:n.remainingBlocks??null,remainingTimeMs:n.remainingTime??null,previousRetargetPct:n.previousRetarget??null,nextRetargetHeight:n.nextRetargetHeight??null,timeAvgMs:n.timeAvg??null,raw:n}}async function zg(e={},t={}){let n=Hg(e.window||e.timeframe,"1w"),r=await Lr(`/v1/mining/pools/${n}`,t),o=Array.isArray(r?.pools)?r.pools:[],i=o.reduce((l,u)=>l+Number(u.blockCount||0),0),s=l=>i>0?Number(l.blockCount||0)/i*100:null,a=[...o].sort((l,u)=>Number(u.blockCount||0)-Number(l.blockCount||0)),c=Math.min(200,Math.max(1,Number(e.limit||a.length||1)));return{provider:"mempool-mining",window:n,totalBlocks:i,blockCount:r?.blockCount??null,lastEstimatedHashrate:r?.lastEstimatedHashrate??null,topPoolSharePct:a[0]?s(a[0]):null,top3SharePct:a.slice(0,3).reduce((l,u)=>l+(s(u)||0),0)||null,pools:a.slice(0,c).map(l=>({name:l.name??null,slug:l.slug??null,blockCount:l.blockCount??null,rank:l.rank??null,sharePct:s(l),emptyBlocks:l.emptyBlocks??null,avgMatchRate:l.avgMatchRate??null}))}}async function Wg(e={},t={}){let n=Hg(e.window||e.timeframe,"3d"),r=await Lr(`/v1/mining/hashrate/${n}`,t),o=Array.isArray(r?.hashrates)?r.hashrates:[];return{provider:"mempool-mining",window:n,currentHashrate:r?.currentHashrate??null,currentHashrateEhs:r?.currentHashrate==null?null:Number(r.currentHashrate)/1e18,currentDifficulty:r?.currentDifficulty??null,points:o.length,hashrates:o,difficulty:Array.isArray(r?.difficulty)?r.difficulty:[]}}async function Gg(e={},t={}){let n=Math.min(1e4,Math.max(1,Number(e.blockCount||e.blocks||144))),r=await Lr(`/v1/mining/reward-stats/${n}`,t),o=Number(r.totalReward||0),i=Number(r.totalFee||0);return{provider:"mempool-mining",blockCount:n,startBlock:r.startBlock??null,endBlock:r.endBlock??null,totalRewardSats:String(r.totalReward??""),totalFeeSats:String(r.totalFee??""),totalSubsidySats:String(o-i),feeSharePct:o>0?i/o*100:null,totalTx:r.totalTx??null,raw:r}}N();var L1="https://amm-v2.meteora.ag",Kg=new Set(["tvl","volume","fee_tvl_ratio","l_m"]),Yg=new Set(["dynamic","multitoken","lst","farms"]),M1=/^[1-9A-HJ-NP-Za-km-z]{32,44}$/;function U1(e={}){return String(e.baseUrl||process.env.METEORA_API_URL||L1).replace(/\/$/,"")}function le(e){let t=Number(e);return Number.isFinite(t)?t:null}function B1(e={}){return{address:e.pool_address||null,name:e.pool_name||null,type:e.pool_type||null,version:e.pool_version??null,mints:e.pool_token_mints||[],tokenAmounts:e.pool_token_amounts||[],tokenUsdAmounts:e.pool_token_usd_amounts||[],lpMint:e.lp_mint||null,lpDecimals:e.lp_decimal??null,lpPriceUsd:le(e.pool_lp_price_in_usd),tvlUsd:le(e.pool_tvl),farmTvlUsd:le(e.farm_tvl),volume24hUsd:le(e.trading_volume),volume7dUsd:le(e.weekly_trading_volume),fee24hUsd:le(e.fee_volume),fee7dUsd:le(e.weekly_fee_volume),tradeApyPct:le(e.trade_apy),weeklyTradeApyPct:le(e.weekly_trade_apy),baseApyPct:le(e.daily_base_apy),farmingApyPct:le(e.farming_apy),totalApyPct:(le(e.trade_apy)??0)+(le(e.farming_apy)??0),aprPct:le(e.apr),feePct:le(e.total_fee_pct),farmingPool:e.farming_pool||null,isLst:!!e.is_lst,isMeme:!!e.is_meme,permissioned:!!e.permissioned,unknownTokens:!!e.unknown,createdAt:e.created_at??null}}function D1(e={},t={}){let n=new URL(`${U1(t)}/pools/search`),r=Math.max(0,Number(e.page)||0),o=Math.max(1,Math.min(Number(e.size??e.limit)||20,100));if(n.searchParams.set("page",String(r)),n.searchParams.set("size",String(o)),e.sortKey!=null){let a=String(e.sortKey);if(!Kg.has(a))throw new Error(`meteora-dlmm: sortKey must be one of ${[...Kg].join(", ")}`);n.searchParams.set("sort_key",a),n.searchParams.set("order_by",e.orderBy==="asc"?"asc":"desc")}if(e.poolType!=null){let a=String(e.poolType);if(!Yg.has(a))throw new Error(`meteora-dlmm: poolType must be one of ${[...Yg].join(", ")}`);n.searchParams.set("pool_type",a)}let i=e.filter??e.query??e.search;i!=null&&String(i).trim()&&n.searchParams.set("filter",String(i).trim());let s=e.mints||e.includeTokenMints;if(s){let a=(Array.isArray(s)?s:[s]).map(c=>String(c).trim());for(let c of a)if(!M1.test(c))throw new Error(`meteora-dlmm: mint ${c} is not a base58 public key`);n.searchParams.set("include_token_mints",a.join(","))}return{url:n,page:r,size:o}}async function jc(e={},t={}){let{url:n,page:r,size:o}=D1(e,t),i=await y(n.toString(),{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4});return{pools:(Array.isArray(i?.data)?i.data:[]).map(B1),totalCount:i?.total_count??null,page:r,size:o}}async function Xg(e={}){try{let{pools:t,totalCount:n}=await jc({size:3},e);return{ok:t.length>0,provider:"meteora-dlmm",poolsIndexed:n,sample:t.length,exec:!1}}catch(t){return{ok:!1,provider:"meteora-dlmm",error:String(t?.message||t),exec:!1}}}async function Qg(e={},t={}){let n=await jc({sortKey:e.sortKey||"tvl",orderBy:e.orderBy||"desc",...e},t),r=n.pools,o=Number(e.minTvlUsd);return Number.isFinite(o)&&(r=r.filter(i=>(i.tvlUsd??0)>=o)),e.excludeUnknown===!0&&(r=r.filter(i=>!i.unknownTokens)),{provider:"meteora-dlmm",chain:"solana-mainnet-beta",page:n.page,size:n.size,totalCount:n.totalCount,count:r.length,tvlUsd:r.reduce((i,s)=>i+(s.tvlUsd??0),0),pools:r}}async function Jg(e={},t={}){let n=e.filter??e.query??e.search,r=e.mints||e.includeTokenMints;if((n==null||!String(n).trim())&&!r)throw new Error("meteora-dlmm: poolSearch requires filter text or mints[]");let o=await jc({sortKey:e.sortKey||"tvl",orderBy:"desc",...e},t);return{provider:"meteora-dlmm",chain:"solana-mainnet-beta",filter:n??null,mints:r?Array.isArray(r)?r:[r]:[],page:o.page,size:o.size,totalCount:o.totalCount,count:o.pools.length,pools:o.pools}}N();var q1="https://ordinals.com";function Li(e={}){return String(e.baseUrl||e.ordinalsBase||process.env.ORDINALS_BASE_URL||q1).replace(/\/$/,"")}function H1(e,t="name"){let n=String(e||"").trim().toUpperCase().replace(/[•.\s_-]/g,"");if(!/^[A-Z]{1,28}$/.test(n))throw new Error(`ordinals-runes: ${t} must be 1-28 letters (spacers are stripped automatically)`);return n}async function Zg(e,t={}){let n=`${Li(t)}${e.startsWith("/")?e:`/${e}`}`,o=await(t.fetchImpl||fetch)(n,{method:"GET",headers:{accept:"application/json,text/plain;q=0.9,*/*;q=0.8"},signal:AbortSignal.timeout(t.timeoutMs??12e3)}),i=await o.text();if(!o.ok)throw new Error(`ordinals-runes GET ${e}: HTTP ${o.status} ${i.slice(0,160)}`);return i.trim()}function Vc(e,t={}){return y(`${Li(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3,headers:{Accept:"application/json"}})}async function ey(e={}){try{let t=await Zg("/r/blockheight",e),n=Number(t);return{ok:Number.isFinite(n)&&n>0,provider:"ordinals-runes",baseUrl:Li(e),blockHeight:n,exec:!1}}catch(t){return{ok:!1,provider:"ordinals-runes",baseUrl:Li(e),error:String(t?.message||t),exec:!1}}}async function ty(e={},t={}){let n=await Zg("/r/blockheight",t),r=Number(n);if(!Number.isFinite(r))throw new Error(`ordinals-runes: unexpected blockheight response ${n.slice(0,60)}`);return{provider:"ordinals-runes",blockHeight:r}}async function ny(e={},t={}){let n=e.height??e.block??e.hash;if(n==null||n==="")throw new Error("ordinals-runes: blockInfo requires height or hash");let r;if(/^[0-9a-f]{64}$/i.test(String(n)))r=String(n).toLowerCase();else{let i=Number(n);if(!Number.isInteger(i)||i<0)throw new Error("ordinals-runes: height must be a non-negative integer or a 64-hex block hash");r=String(i)}let o=await Vc(`/r/blockinfo/${r}`,t);return{provider:"ordinals-runes",height:o.height??null,hash:o.hash??null,timestamp:o.timestamp??null,difficulty:o.difficulty??null,transactionCount:o.transaction_count??null,averageFee:o.average_fee??null,averageFeeRate:o.average_fee_rate??null,feerangeSats:o.feerange??null,totalFee:o.total_fee??null,totalSize:o.total_size??null,confirmations:o.confirmations??null,raw:o}}async function ry(e={},t={}){let n=e.sat??e.ordinal,r=Number(n);if(!Number.isInteger(r)||r<0||r>209999999769e4)throw new Error("ordinals-runes: sat must be an integer in [0, 2099999997690000]");let o=Math.max(0,Number(e.page||0)),i=o>0?`/r/sat/${r}/${o}`:`/r/sat/${r}`,s=await Vc(i,t),a=Array.isArray(s?.ids)?s.ids:[];return{provider:"ordinals-runes",sat:r,page:o,inscriptionCount:a.length,inscriptionIds:a,more:!!s?.more,raw:s}}async function oy(e={},t={}){let n=H1(e.name||e.rune||e.runeName,"name"),r=await Vc(`/rune/${n}`,t),o=r?.entry||{},i=o.terms||{},s=i.cap==null?null:Number(i.cap),a=o.mints==null?null:Number(o.mints);return{provider:"ordinals-runes",name:n,spacedRune:o.spaced_rune??null,number:o.number??null,symbol:o.symbol??null,divisibility:o.divisibility??null,etchingBlock:o.block??null,etchingTxid:o.etching??null,premine:o.premine==null?null:String(o.premine),mints:a==null?null:String(a),burned:o.burned==null?null:String(o.burned),mintCap:s==null?null:String(s),mintProgressPct:s&&s>0&&a!=null?a/s*100:null,mintable:r?.mintable??null,amountPerMint:i.amount==null?null:String(i.amount),turbo:o.turbo??null,parent:r?.parent??null,raw:r}}N();var V1="https://hermes.pyth.network",Wc={"SOL/USD":"ef0d8b6fda2ceba41da15d4095d1da392a0d2f8ed0c6c7bc0f4cfac8c280b56d","BTC/USD":"e62df6c8b4a85fe1a67db44dc12de5db330f7ac66b72dc658afedf0f4a415b43","ETH/USD":"ff61491a931112ddf1bd8147cd1b641375f79f5825126d665480874634fd0ace","USDC/USD":"eaa020c61cc479712813461ce153894a96a6c00b21ed0cfc2798d1f9a9e9c94a","USDT/USD":"2b89b9dc8fdf9f34709a5b106b472f0f39bb6ca9ce04b0fd7f2e971688e2e53b","JUP/USD":"0a0408d619e9380abad35060f9192039ed5042fa6f82301d0e48bb52be830996","JTO/USD":"b43660a5f790c69354b0729a5ef9d50d68f1df92107540210b9cccba1f947cc2","BONK/USD":"72b021217ca3fe68922a19aaf990109cb9d84e9ad004b4d2025ad6f529314419","PYTH/USD":"0bbf28e9a841a1cc788f6a361b17ca072d0ea3098a1e5df1c3922d06719579ff","HYPE/USD":"4279e31cc369bbcc2faf022b382b080e32a8e689ff20fbc530d2a603eb6cd98b"},z1=/^[0-9a-fA-F]{64}$/;function iy(e={}){return String(e.baseUrl||process.env.PYTH_HERMES_URL||V1).replace(/\/$/,"")}function sy(e,t="feedId"){let n=String(e??"").trim();if(!n)throw new Error(`pyth-price-feeds: ${t} required`);let r=Wc[n.toUpperCase()]||Wc[`${n.toUpperCase()}/USD`];if(r)return r;let o=n.startsWith("0x")||n.startsWith("0X")?n.slice(2):n;if(!z1.test(o))throw new Error(`pyth-price-feeds: ${t} must be a 32-byte hex feed id or a known symbol`);return o.toLowerCase()}function zc(e={}){let t=Number(e.price),n=Number(e.expo);return!Number.isFinite(t)||!Number.isFinite(n)?null:t*10**n}function Gc(e={}){let t=zc({price:Number(e.price?.conf),expo:e.price?.expo}),n=zc(e.price);return{id:e.id||null,price:n,confidence:t,confidenceBps:n&&t!=null?Math.round(t/Math.abs(n)*1e4):null,emaPrice:zc(e.ema_price),publishTime:e.price?.publish_time??null,publishTimeIso:e.price?.publish_time?new Date(e.price.publish_time*1e3).toISOString():null,ageSeconds:e.price?.publish_time?Math.max(0,Math.round(Date.now()/1e3-e.price.publish_time)):null,expo:e.price?.expo??null,raw:{price:e.price??null,emaPrice:e.ema_price??null,metadata:e.metadata??null}}}async function Kc(e,t={}){let n=new URL(`${iy(t)}/v2/updates/price/latest`);for(let r of e)n.searchParams.append("ids[]",r);return n.searchParams.set("encoding","hex"),n.searchParams.set("parsed","true"),n.searchParams.set("ignore_invalid_price_ids","true"),y(n.toString(),{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3})}async function ay(e={}){try{let t=await Kc([Wc["SOL/USD"]],e),r=(Array.isArray(t?.parsed)?t.parsed.map(Gc):[])[0]||null;return{ok:!!(r&&Number.isFinite(r.price)&&r.price>0),provider:"pyth-price-feeds",solUsd:r?.price??null,ageSeconds:r?.ageSeconds??null,exec:!1}}catch(t){return{ok:!1,provider:"pyth-price-feeds",error:String(t?.message||t),exec:!1}}}async function cy(e={},t={}){let n=sy(e.feedId||e.id||e.symbol,"feedId"),r=await Kc([n],t),o=Array.isArray(r?.parsed)?r.parsed.map(Gc):[],i=o.find(s=>String(s.id).toLowerCase()===n)||o[0]||null;if(!i)throw new Error(`pyth-price-feeds: no price returned for feed ${n}`);return{provider:"pyth-price-feeds",chain:"solana-mainnet-beta",feedId:n,...i,binaryUpdate:r?.binary?.data?.[0]||null,binaryEncoding:r?.binary?.encoding||null}}async function ly(e={},t={}){let n=Array.isArray(e)?e:e.feedIds||e.ids||e.symbols||[],r=[...new Set(n.map(l=>sy(l,"feedIds[]")))];if(!r.length)throw new Error("pyth-price-feeds: feedIds[] required");let o=40,i=[];for(let l=0;l<r.length;l+=o)i.push(r.slice(l,l+o));let s=[];for(let l of i)s.push(await Kc(l,t));let a=s.flatMap(l=>Array.isArray(l?.parsed)?l.parsed.map(Gc):[]),c=Object.fromEntries(a.map(l=>[String(l.id).toLowerCase(),l]));return{provider:"pyth-price-feeds",chain:"solana-mainnet-beta",requested:r.length,returned:a.length,missing:r.filter(l=>!c[l]),prices:a,byId:c}}async function uy(e={},t={}){let n=new URL(`${iy(t)}/v2/price_feeds`);e.query&&n.searchParams.set("query",String(e.query)),n.searchParams.set("asset_type",String(e.assetType||"crypto"));let r=await y(n.toString(),{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),o=Array.isArray(r)?r:[];return{provider:"pyth-price-feeds",count:o.length,feeds:o.map(i=>({id:i.id,symbol:i.attributes?.symbol||null,displaySymbol:i.attributes?.display_symbol||null,base:i.attributes?.base||null,quote:i.attributes?.quote_currency||null,assetType:i.attributes?.asset_type||null}))}}N();var G1="https://relayscan.io",dy=new Set(["1h","12h","24h","7d"]);function Yc(e={}){return(e.baseUrl||process.env.RELAYSCAN_API_URL||G1).replace(/\/$/,"")}function py(e={}){let t=String(e.timespan||e.t||"24h").toLowerCase();if(!dy.has(t))throw new Error(`relayscan-mev: timespan must be one of ${[...dy].join(", ")}`);return t}function K1(e={}){let t=e.date||e.day;if(t==null)return new Date(Date.now()-864e5).toISOString().slice(0,10);let n=String(t).trim();if(!/^\d{4}-\d{2}-\d{2}$/.test(n))throw new Error("relayscan-mev: date must be YYYY-MM-DD");return n}async function Xc(e={},t={}){return y(`${Yc(t)}/overview/json?t=${py(e)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function my(e={},t={}){return y(`${Yc(t)}/builder-profit/json?t=${py(e)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function fy(e={},t={}){let n=K1(e);return y(`${Yc(t)}/stats/day/${n}/json`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??25e3})}async function hy(e={}){let t=await Xc({timespan:"1h"},e);return{ok:Array.isArray(t?.relays)&&t.relays.length>0,provider:"relayscan-mev",relays:Array.isArray(t?.relays)?t.relays.length:0}}N();var X1="https://extra-api.sanctum.so",Q1=30,J1=["jitoSOL","mSOL","bSOL","INF","hSOL","bonkSOL","jupSOL","dSOL"];function Qc(e={}){return String(e.baseUrl||process.env.SANCTUM_API_URL||X1).replace(/\/$/,"")}function gy(e,t="lst"){let n=String(e??"").trim();if(!n||/[?&=\s]/.test(n))throw new Error(`sanctum-lst: ${t} must be an LST symbol or mint`);return n}function Z1(e,t){let n=[];for(let r=0;r<e.length;r+=t)n.push(e.slice(r,r+t));return n}async function jt(e,t,n={}){let r={},o={};for(let i of Z1(t,Q1)){let s=new URL(`${Qc(n)}/v1/${e}`);for(let l of i)s.searchParams.append("lst",l);let a=await y(s.toString(),{fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs??2e4}),c=a?.apys||a?.tvls||a?.solValues||{};Object.assign(r,c),Object.assign(o,a?.errs||{})}return{values:r,errs:o}}async function yy(e={}){try{let[t,n]=await Promise.all([y(`${Qc(e)}/v1/lsts`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??15e3}),jt("apy/inception",["jitoSOL"],e)]),r=Array.isArray(t?.lsts)?t.lsts:[];return{ok:r.length>0&&Number.isFinite(Number(n.values.jitoSOL)),provider:"sanctum-lst",lstCount:r.length,jitoSolApyInception:Number(n.values.jitoSOL)??null,exec:!1}}catch(t){return{ok:!1,provider:"sanctum-lst",error:String(t?.message||t),exec:!1}}}async function Jc(e={},t={}){let n=await y(`${Qc(t)}/v1/lsts`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4}),r=(Array.isArray(n?.lsts)?n.lsts:[]).map(i=>({symbol:i.symbol||null,name:i.name||null,mint:i.mint||null,decimals:i.decimals??null,pool:i.pool?.pool||null,poolProgram:i.pool?.program||null,voteAccount:i.pool?.vote_account||null,logoUri:i.logo_uri||null}));if(e.symbol){let i=String(e.symbol).toLowerCase();r=r.filter(s=>String(s.symbol||"").toLowerCase()===i||s.mint===e.symbol)}let o=Number(e.limit);return Number.isFinite(o)&&o>0&&(r=r.slice(0,o)),{provider:"sanctum-lst",chain:"solana-mainnet-beta",count:r.length,lsts:r}}async function by(e={},t={}){let n=e.lsts||e.symbols||null;e.all===!0&&(n=(await Jc({},t)).lsts.map(c=>c.symbol).filter(Boolean)),(!Array.isArray(n)||!n.length)&&(n=J1);let r=[...new Set(n.map(a=>gy(a,"lsts[]")))],[o,i]=await Promise.all([jt("apy/latest",r,t),jt("apy/inception",r,t)]),s=r.map(a=>{let c=Number(o.values[a]),l=Number(i.values[a]);return{lst:a,apyLatest:Number.isFinite(c)?c:null,apyLatestPct:Number.isFinite(c)?c*100:null,apyInception:Number.isFinite(l)?l:null,apyInceptionPct:Number.isFinite(l)?l*100:null,error:o.errs[a]||i.errs[a]||null}});return s.sort((a,c)=>(c.apyInception??-1)-(a.apyInception??-1)),{provider:"sanctum-lst",chain:"solana-mainnet-beta",count:s.length,apys:s,byLst:Object.fromEntries(s.map(a=>[a.lst,a]))}}async function wy(e={},t={}){let n=gy(e.lst||e.mint||e.symbol,"lst"),[r,o,i,s]=await Promise.all([jt("apy/latest",[n],t),jt("apy/inception",[n],t),jt("tvl/current",[n],t).catch(()=>({values:{},errs:{}})),jt("sol-value/current",[n],t).catch(()=>({values:{},errs:{}}))]),a=Number(r.values[n]),c=Number(o.values[n]),l=r.errs[n]||o.errs[n]||null;if(!Number.isFinite(a)&&!Number.isFinite(c))throw new Error(`sanctum-lst: no APY for ${n}${l?` (${JSON.stringify(l)})`:""}`);let u=s.values[n];return{provider:"sanctum-lst",chain:"solana-mainnet-beta",lst:n,apyLatest:Number.isFinite(a)?a:null,apyLatestPct:Number.isFinite(a)?a*100:null,apyInception:Number.isFinite(c)?c:null,apyInceptionPct:Number.isFinite(c)?c*100:null,tvlLamports:i.values[n]??null,tvlSol:i.values[n]!=null?Number(i.values[n])/1e9:null,solValueLamports:u??null,solPerToken:u!=null?Number(u)/1e9:null,error:l}}N();var tP="https://api.save.finance",nP="4UpD2fh7xH3VP9QQaXtsS1YY3bxzWhtfpks7FatyKvdY",xy="CCpirWrgNuBVLdkP2haxLTbD6XqEgaYuVXixbbpxUB6",rP=/^[1-9A-HJ-NP-Za-km-z]{32,44}$/;function Zc(e={}){return String(e.baseUrl||process.env.SAVE_API_URL||process.env.SOLEND_API_URL||tP).replace(/\/$/,"")}function Sy(e,t="address"){let n=String(e??"").trim();if(!rP.test(n))throw new Error(`solend-lending: ${t} must be a base58 public key`);return n}function ky(e){let t=Number(e);return Number.isFinite(t)?t:null}function oP(e={}){return{address:e.address||null,name:e.name||null,description:e.description||"",isPrimary:!!e.isPrimary,isPermissionless:!!e.isPermissionless,hidden:!!e.hidden,owner:e.owner||null,authorityAddress:e.authorityAddress||null,lookupTableAddress:e.lookupTableAddress||null,reserveCount:Array.isArray(e.reserves)?e.reserves.length:0,reserves:(e.reserves||[]).map(t=>({address:t.address||null,symbol:t.liquidityToken?.symbol||null,name:t.liquidityToken?.name||null,mint:t.liquidityToken?.mint||null,decimals:t.liquidityToken?.decimals??null,collateralMint:t.collateralMintAddress||null,pythOracle:t.pythOracle||null,switchboardOracle:t.switchboardOracle||null,volume24h:t.liquidityToken?.volume24h??null}))}}function iP(e={}){let t=e.reserve||{},n=t.liquidity||{},r=t.collateral||{};return{address:e.address||t.address||null,lendingMarket:t.lendingMarket||null,mint:n.mintPubkey||null,mintDecimals:n.mintDecimals??null,supplyApyPct:ky(e.rates?.supplyInterest),borrowApyPct:ky(e.rates?.borrowInterest),cTokenExchangeRate:e.cTokenExchangeRate??null,availableAmount:n.availableAmount??null,borrowedAmountWads:n.borrowedAmountWads??null,marketPrice:n.marketPrice??null,collateralMint:r.mintPubkey||null,collateralTotalSupply:r.mintTotalSupply??null,rewards:e.rewards||[],lastUpdateSlot:t.lastUpdate?.slot??null,stale:t.lastUpdate?.stale===1,raw:e}}async function Ey(e={}){try{let t=await y(`${Zc(e)}/v1/reserves?ids=${xy}`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??15e3}),n=Array.isArray(t?.results)?t.results:[];return{ok:n.length>0,provider:"solend-lending",probeReserve:xy,reserves:n.length,exec:!1}}catch(t){return{ok:!1,provider:"solend-lending",error:String(t?.message||t),exec:!1}}}async function el(e={},t={}){let n=new URL(`${Zc(t)}/v1/markets/configs`);e.scope&&n.searchParams.set("scope",String(e.scope)),e.deployment&&n.searchParams.set("deployment",String(e.deployment));let r=await y(n.toString(),{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??(e.scope==="all"?45e3:2e4)}),o=(Array.isArray(r)?r:[]).map(oP);if(e.includeHidden!==!0&&(o=o.filter(s=>!s.hidden)),e.name){let s=String(e.name).toLowerCase();o=o.filter(a=>String(a.name||"").toLowerCase()===s)}let i=Number(e.limit);return Number.isFinite(i)&&i>0&&(o=o.slice(0,i)),{provider:"solend-lending",chain:"solana-mainnet-beta",scope:e.scope||"default",count:o.length,markets:o}}async function vy(e={},t={}){let n=[];if(e.ids||e.reserves)n=(Array.isArray(e.ids||e.reserves)?e.ids||e.reserves:String(e.ids||e.reserves).split(",")).map(a=>Sy(String(a).trim(),"reserve"));else{let s=Sy(e.market||e.marketAddress||nP,"market"),c=(await el({scope:"all",includeHidden:!0},t)).markets.find(l=>l.address===s);if(!c)throw new Error(`solend-lending: market ${s} not found`);n=c.reserves.map(l=>l.address).filter(Boolean)}if(!n.length)throw new Error("solend-lending: no reserves to query");let r=Number.isFinite(Number(e.limit))&&Number(e.limit)>0?Number(e.limit):50;n=n.slice(0,r);let o=await y(`${Zc(t)}/v1/reserves?ids=${n.join(",")}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??25e3}),i=(Array.isArray(o?.results)?o.results:[]).map((s,a)=>({...iP(s),address:s.address||s.reserve?.address||n[a]||null}));return{provider:"solend-lending",chain:"solana-mainnet-beta",requested:n.length,count:i.length,reserves:i}}function tl(e,t){let n;try{n=BigInt(e)}catch{throw new Error(`${t} must be a positive integer amount`)}if(n<=0n)throw new Error(`${t} must be a positive integer amount`);return n}function Vt(e,t,n,r){let o=Number(e);if(!Number.isInteger(o)||o<n||o>r)throw new Error(`${t} must be an integer between ${n} and ${r}`);return o}function Mr(e={}){if(!Number.isInteger(Number(e.chainId))||Number(e.chainId)<=0)throw new Error("strategy requires chainId");if(!String(e.tokenIn||"").trim()||!String(e.tokenOut||"").trim())throw new Error("strategy requires tokenIn and tokenOut");if(!String(e.taker||"").trim())throw new Error("strategy requires taker");return{chainId:Number(e.chainId),tokenIn:String(e.tokenIn),tokenOut:String(e.tokenOut),taker:String(e.taker),total:tl(e.amount,"amount")}}function nl(e,t){let n=t.map(s=>BigInt(s)),r=n.reduce((s,a)=>s+a,0n);if(r<=0n)throw new Error("weights must total above zero");let o=n.map(s=>e*s/r),i=e-o.reduce((s,a)=>s+a,0n);for(let s=0;i>0n;s=(s+1)%o.length)o[s]+=1n,i-=1n;return o}function Ur(e,t,n,r={}){return{kind:"execution-strategy-plan",strategy:t,chainId:e.chainId,tokenIn:e.tokenIn,tokenOut:e.tokenOut,taker:e.taker,totalAmount:String(e.total),slices:n,executable:!1,signs:!1,broadcasts:!1,requiresFreshQuotePerSlice:!0,requiresPolicyCheckPerSlice:!0,requiresSimulationPerSlice:!0,requiresUserConfirmationPerSlice:!0,receiptRequiredPerSlice:!0,...r}}function rl(e,t,n=Date.now()){let r=Math.floor(t/e.length);return e.map((o,i)=>({index:i+1,amount:String(o),offsetSec:i*r,executeAfter:new Date(n+i*r*1e3).toISOString()}))}function aP(e={},t={}){let n=Mr(e),r=Vt(e.slices??10,"slices",2,100),o=Vt(e.durationSec??3600,"durationSec",r,604800),i=nl(n.total,Array(r).fill(1));return Ur(n,"TWAP",rl(i,o,t.nowMs),{durationSec:o})}function cP(e={},t={}){let n=Mr(e);if(!Array.isArray(e.volumeProfile)||e.volumeProfile.length<2||e.volumeProfile.length>100)throw new Error("volumeProfile must contain 2-100 positive weights");let r=e.volumeProfile.map(c=>{let l=Number(c);if(!Number.isFinite(l)||l<=0)throw new Error("volumeProfile must contain positive weights");return BigInt(Math.round(l*1e6))}),o=Vt(e.durationSec??3600,"durationSec",r.length,604800),i=nl(n.total,r),s=r.reduce((c,l)=>c+l,0n),a=rl(i,o,t.nowMs).map((c,l)=>({...c,volumeWeightBps:Number(r[l]*10000n/s)}));return Ur(n,"VWAP",a,{durationSec:o,requiresLiveVolumeValidation:!0})}function lP(e={}){let t=Mr(e),n=Vt(e.participationBps,"participationBps",1,1e4);if(!Array.isArray(e.observedMarketVolumes)||e.observedMarketVolumes.length===0||e.observedMarketVolumes.length>100)throw new Error("observedMarketVolumes must contain 1-100 positive integer amounts");let r=t.total,o=[];for(let[i,s]of e.observedMarketVolumes.entries()){let a=tl(s,"observedMarketVolumes"),c=a*BigInt(n)/10000n,l=c>r?r:c;if(l>0n&&o.push({index:i+1,amount:String(l),observedMarketVolume:String(a)}),r-=l,r===0n)break}return Ur(t,"POV",o,{participationBps:n,residualAmount:String(r),requiresLiveVolumeValidation:!0})}function uP(e={}){let t=Mr(e),n=tl(e.displayAmount,"displayAmount");if(n>t.total)throw new Error("displayAmount cannot exceed total amount");let r=[],o=t.total;for(;o>0n;){if(r.length>=100)throw new Error("iceberg requires more than 100 refills");let i=o>n?n:o;r.push({index:r.length+1,amount:String(i),displayAmount:String(n)}),o-=i}return Ur(t,"ICEBERG",r,{displayAmount:String(n),refillCount:r.length-1})}function dP(e={},t={}){let n=Mr(e),r=Vt(e.slices??10,"slices",2,100),o=Vt(e.durationSec??3600,"durationSec",r,604800),i=Vt(e.urgencyBps??5e3,"urgencyBps",1,1e4),s=Array.from({length:r},(c,l)=>{let u=Math.floor(i*l/Math.max(1,r-1));return BigInt(Math.max(1,1e4-u))}),a=nl(n.total,s);return Ur(n,"IS",rl(a,o,t.nowMs),{durationSec:o,urgencyBps:i})}function Ay(e={},t={}){let n=String(e.strategy||"").trim().toUpperCase();if(n==="TWAP")return aP(e,t);if(n==="VWAP")return cP(e,t);if(n==="POV")return lP(e,t);if(n==="ICEBERG")return uP(e,t);if(n==="IS"||n==="IMPLEMENTATION SHORTFALL")return dP(e,t);throw new Error("strategy must be TWAP, VWAP, POV, ICEBERG, or IS")}function Iy(){return{ok:!0,provider:"execution-strategies",strategies:["TWAP","VWAP","POV","ICEBERG","IS"],execution:"plan-only",externalProtocol:!1}}var mP={"hl-info":{health:e=>Ku(e),allMids:e=>Xe(e),l2Book:(e,t={})=>mo(t.coin,e),outcomeMeta:e=>sr(e),clearinghouse:(e,t={})=>fo(t.user,e),userFills:(e,t={})=>Yu(t.user,e),meta:e=>ho(e),metaAndAssetCtxs:e=>nn(e),candleSnapshot:(e,t={})=>rn(t,e),openOrders:(e,t={})=>Qu(t.user,e),frontendOpenOrders:(e,t={})=>Ju(t.user,e),userState:(e,t={})=>go(t.user,e),spotMeta:e=>yo(e)},"hl-vaults":{health:e=>nd(e),summaries:(e,t={})=>Vs(t,e),details:(e,t={})=>bo(t,e),userEquities:(e,t={})=>zs(t,e),tracker:(e,t={})=>Ws(t,e)},"poly-public":{health:e=>od(e),time:e=>Gs(e),markets:(e,t={})=>id(t,e),book:(e,t={})=>sd(t.tokenId,e),midpoint:(e,t={})=>ad(t.tokenId,e),spread:(e,t={})=>cd(t.tokenId,e),price:(e,t={})=>ld(t.tokenId,{side:t.side},e),events:(e,t={})=>ud(t,e)},"evm-rpc":{health:(e,t={})=>Qn(t.chainId??1,e),healthAll:(e,t={})=>fu({...e,chainIds:t.chainIds}),blockNumber:(e,t={})=>eo(t.chainId??1,e),chainId:(e,t={})=>pu(t.chainId??1,e),getBalance:(e,t={})=>Zt(t.chainId??1,t.address,e),call:(e,t={})=>L(t.chainId??1,t.method,t.params||[],e),erc20Allowance:(e,t={})=>mu(t,e),erc20Balance:(e,t={})=>to(t,e),transactionReceipt:(e,t={})=>no(t,e)},portfolio:{health:e=>ph(e),balances:(e,t={})=>yi(t,e),snapshot:(e,t={})=>Nh(t,e),history:(e,t={})=>pc(t,e),valueGraph:(e,t={})=>Oh(t,e)},"nft-portfolio":{health:e=>wh(e),inventory:(e,t={})=>Cn(t,e),gallery:(e,t={})=>Eh(t,e),pnl:(e,t={})=>kh(t,e),prepareList:(e,t={})=>xh(t,e),traitSnipe:(e,t={})=>Sh(t,e)},"contract-risk":{health:e=>Rh(e),scan:(e,t={})=>Ft(t,e)},"evm-token-sniper":{health:e=>Mh(e),scan:(e,t={})=>Lh(t,e)},"evm-simulate":{health:e=>Bh(e),simulate:(e,t={})=>Tr(t,e)},"nft-mint":{health:e=>Fh(e),discover:(e,t={})=>vi(t,e),prepare:(e,t={})=>hc(t,e),priceGas:(e,t={})=>Ei(t,e),createTrigger:(e,t={})=>qh(t,e),checkOpen:(e,t={})=>Hh(t,e)},"solana-rpc":{health:e=>pd(e),latestBlockhash:(e,t={})=>Ys(t,e),getBalance:(e,t={})=>wo(t,e),tokenAccounts:(e,t={})=>lr(t,e),simulate:(e,t={})=>md(t,e)},"bitcoin-esplora":{health:e=>fd(e),tipHeight:e=>hd(e),fees:e=>gd(e),address:(e,t={})=>So(t,e),utxos:(e,t={})=>yd(t,e),tx:(e,t={})=>bd(t,e),decode:(e,t={})=>wd(t,e)},"bitcoin-meta":{health:e=>Ed(e),runeBalances:(e,t={})=>Eo(t,e),inscriptions:(e,t={})=>an(t,e),inscriptionInfo:(e,t={})=>vd(t,e),inscriptionChildren:(e,t={})=>Ad(t,e),ordBlockInfo:(e,t={})=>Id(t,e)},satflow:{health:e=>Pd(e),collectionFloors:(e,t={})=>Cd(t,e),collectionStats:(e,t={})=>Td(t,e),item:(e,t={})=>Nd(t,e),walletContents:(e,t={})=>Ao(t,e),floorListings:(e,t={})=>Od(t,e),preparePurchase:(e,t={})=>$d(t,e),prepareList:(e,t={})=>Io(t,e)},jupiter:{health:e=>Hd(e),venues:(e,t={})=>qd(t,e),quote:(e,t={})=>Co(t,e),prepare:(e,t={})=>jd(t,e)},defillama:{health:e=>zd(e),prices:(e,t={})=>Oe(t.coins||[],e),pricesBySymbol:(e,t={})=>Yd(t.symbols,e),protocols:e=>To(e),yields:(e,t={})=>Wd(t,e),stablecoins:(e,t={})=>Gd(t,e),dexVolumes:(e,t={})=>Kd(t,e)},lifi:{health:e=>rp(e),quote:(e,t={})=>lt(t,e),prepare:(e,t={})=>op(t,e),chains:e=>ip(e)},dexscreener:{health:e=>hu(e),token:(e,t={})=>Nt(t.address||t.tokenAddress,e),search:(e,t={})=>Jn(t.q||t.query,e),pair:(e,t={})=>gu(t.chainId,t.pairAddress,e)},"uniswap-v3":{health:(e,t={})=>Tu({...e,chainId:t.chainId??8453}),quote:(e,t={})=>it(t,e),prepare:(e,t={})=>Cu(t,e),quotePath:(e,t={})=>Pu(t,e),ethUsdc:(e,t={})=>Os(t,e),chains:()=>Nu()},"uniswap-v4":{health:(e,t={})=>Uu({...e,chainId:t.chainId??8453}),quote:(e,t={})=>co(t,e),chains:()=>Mu()},aerodrome:{health:(e,t={})=>mp({...e,chainId:t.chainId??8453}),quote:(e,t={})=>$o(t,e),prepare:(e,t={})=>pp(t,e),chains:()=>fp()},zerox:{health:e=>bp(e),price:(e,t={})=>ua(t,e),quote:(e,t={})=>Rt(t,e),prepare:(e,t={})=>wp(t,e)},across:{health:e=>da(e),suggestedFees:(e,t={})=>Mo(t,e)},hop:{health:e=>pa(e),quote:(e,t={})=>Uo(t,e)},relay:{health:e=>ma(e),quote:(e,t={})=>dr(t,e),prepare:(e,t={})=>fa(t,e)},cowswap:{health:e=>_p(e),quote:(e,t={})=>dt(t,e),prepareOrder:(e,t={})=>Pp(t,e),order:(e,t={})=>Tp(t,e),status:(e,t={})=>Cp(t,e),chains:()=>Np()},oneinch:{health:e=>Rp(e),quote:(e,t={})=>fr(t,e),prepare:(e,t={})=>$p(t,e),approveSpender:(e,t={})=>xa(t,e)},"hl-ws":{health:e=>Lp(e),allMids:e=>Mp(e),l2Book:(e,t={})=>Up(t.coin,e),snapshot:(e,t={})=>hr(t.subscription||t,e)},"poly-ws":{health:(e,t={})=>Bp({...e,assetId:t.assetId}),book:(e,t={})=>Dp(t.assetId||t.tokenId,e),snapshot:(e,t={})=>qo(t.assetIds||t.assets_ids||[t.assetId],e)},"opensea-nft":{health:e=>zp(e),collection:(e,t={})=>Vo(t.slug,e),floor:(e,t={})=>Wp(t.slug,e),accountNfts:(e,t={})=>gr(t,e),accountPnl:(e,t={})=>zo(t,e),prepareList:(e,t={})=>Wo(t,e)},"hl-outcome":{list:e=>Pm(e),prepareOrder:(e,t={})=>Cm(t,e),prepareCancel:(e,t={})=>Tm(t,e)},"protocol-templates":{health:()=>({ok:!0,templates:si().map(e=>e.id),firmAudit:!1}),list:()=>si(),gate:(e,t={})=>Da(t.templateId||t.id,e),prepareDeploy:(e,t={})=>Zm(t,e)},"poly-clob":{prepareOrder:(e,t={})=>Mm(t||{})},"hl-perps":{health:e=>Ta(e),assetInfo:(e,t={})=>Lt(t,e),prepareOrder:(e,t={})=>Sr(t,e),prepareCancel:(e,t={})=>ei(t,e),prepareLeverage:(e,t={})=>Am(t,e),prepareIsolatedMargin:(e,t={})=>Im(t,e),prepareBracket:(e,t={})=>_m(t,e),prepareBuilderApproval:(e,t={})=>vm(t,e)},"hl-markets":{health:e=>Ta(e),markets:(e,t={})=>Yo(t,e),leaderboards:(e,t={})=>pm(t,e),coin:(e,t={})=>mm(t,e),spot:(e,t={})=>fm(t,e)},"magiceden-sol":{health:e=>Jp(e),stats:(e,t={})=>ka(t,e),listings:(e,t={})=>em(t,e),tokenListings:(e,t={})=>tm(t,e),prepareBuy:(e,t={})=>nm(t,e),prepareList:(e,t={})=>Go(t,e),prepareMint:(e,t={})=>rm(t,e)},"hl-staking":{health:e=>im(e),validators:e=>Aa(e),delegatorSummary:(e,t={})=>Ia(t,e),delegations:(e,t={})=>_a(t,e),rewards:(e,t={})=>sm(t,e),history:(e,t={})=>am(t,e),preflight:(e,t={})=>dm(t,e),prepareStakeDeposit:(e,t={})=>cm(t,e),prepareStakeWithdraw:(e,t={})=>lm(t,e),prepareDelegate:(e,t={})=>um(t,e)},"hyperevm-dex":{health:e=>Kp(e),search:(e,t={})=>Yp(t.q||t.query||"HYPE",e),token:(e,t={})=>Xp(t.address||t.tokenAddress,e)},geckoterminal:{health:e=>rf(e),networks:(e,t={})=>Fa(t,e),pool:(e,t={})=>ef(t,e),token:(e,t={})=>tf(t,e),ohlcv:(e,t={})=>nf(t,e)},curve:{health:e=>yf(e),openapi:e=>gf(e),pools:(e,t={})=>Ha(t,e),quote:(e,t={})=>ja(t,e),prepare:(e,t={})=>bf(t,e)},gmx:{health:e=>Cf(e),tickers:(e,t={})=>ui(t,e),markets:(e,t={})=>_f(t,e),marketsInfo:(e,t={})=>za(t,e),tokens:(e,t={})=>Pf(t,e),prepareOrder:(e,t={})=>Rf(t,e),positions:(e,t={})=>Tf(t,e),orderStatus:(e,t={})=>Nf(t,e),verifyOrder:(e,t={})=>Of(t,e)},morpho:{health:e=>Uf(e),markets:(e,t={})=>Mf(t,e),vaults:(e,t={})=>Ka(t,e),prepareVault:(e,t={})=>Bf(t,e)},balancer:{health:e=>Wf(e),pools:(e,t={})=>zf(t,e),quote:(e,t={})=>Qa(t,e),prepare:(e,t={})=>Gf(t,e)},pendle:{health:e=>Yf(e),markets:(e,t={})=>Za(t,e),quote:(e,t={})=>Xf(t,e),prepare:(e,t={})=>ec(t,e)},odos:{health:e=>eh(e),chains:e=>nc(e),quote:(e,t={})=>Jf(t,e),prepare:(e,t={})=>Zf(t,e)},blockscout:{health:e=>ch(e),stats:(e,t={})=>ic(t,e),address:(e,t={})=>oh(t,e),token:(e,t={})=>ih(t,e)},paraswap:{health:e=>Vh(e),tokens:(e,t={})=>yc(t,e),price:(e,t={})=>yt(t,e),quote:(e,t={})=>yt(t,e),prepare:(e,t={})=>jh(t,e)},rfq:{health:e=>a0(e),intent:(e,t={})=>i0(t,e),quote:(e,t={})=>s0(t,e)},"polygon-staking":{health:e=>L0(e),validators:(e,t={})=>R0(t,e),validatorDetail:(e,t={})=>$0(t,e)},"aave-v3":{health:e=>D0(e),markets:(e,t={})=>M0(t,e),marketReserves:(e,t={})=>U0(t,e),chains:e=>B0(e)},"babylon-staking":{health:e=>q0(e),stats:e=>H0(e),finalityProviders:e=>j0(e),delegations:(e,t={})=>V0(t,e)},"bisq-markets":{health:e=>W0(e),markets:e=>G0(e),ticker:(e,t={})=>K0(t,e),trades:(e,t={})=>Y0(t,e)},"bob-rootstock":{health:(e,t={})=>Q0(t.chainId,e),stats:(e,t={})=>Rc(t,e),addressInfo:(e,t={})=>J0(t,e),tokenBalances:(e,t={})=>Z0(t,e)},"braiins-insights":{health:e=>eg(e),priceStats:e=>tg(e),poolStats:e=>ng(e)},"cow-protocol":{health:e=>ug(e),auction:e=>ag(e),openOrders:(e,t={})=>cg(t,e),recentTrades:(e,t={})=>lg(t,e)},"hiro-stacks":{health:e=>dg(e),networkInfo:e=>pg(e),stackingInfo:e=>mg(e),poxCycles:e=>fg(e),blocks:(e,t={})=>hg(t,e)},"jito-mev":{health:e=>bg(e),recentBundles:(e,t={})=>wg(t,e),tipFloor:e=>xg(e)},"kamino-strategies":{health:e=>kg(e),strategies:(e,t={})=>Eg(t,e),strategyMetrics:(e,t={})=>vg(t,e)},"liquid-esplora":{health:e=>Pg(e),tipHeight:e=>Cg(e),addressInfo:(e,t={})=>Tg(t,e),assetInfo:(e,t={})=>Ng(t,e)},"magiceden-ordinals":{health:e=>$g(e),collectionStat:(e,t={})=>Lg(t,e)},"mempool-lightning":{health:e=>Ug(e),statistics:e=>Bg(e),nodeRankings:(e,t={})=>Dg(t,e),nodeCountries:e=>Fg(e)},"mempool-mining":{health:e=>jg(e),difficulty:e=>Vg(e),poolShare:(e,t={})=>zg(t,e),hashrate:(e,t={})=>Wg(t,e),rewardStats:(e,t={})=>Gg(t,e)},"meteora-dlmm":{health:e=>Xg(e),pools:(e,t={})=>Qg(t,e),poolSearch:(e,t={})=>Jg(t,e)},"ordinals-runes":{health:e=>ey(e),blockHeight:e=>ty(e),blockInfo:(e,t={})=>ny(t,e),satInfo:(e,t={})=>ry(t,e),runeInfo:(e,t={})=>oy(t,e)},"pyth-price-feeds":{health:e=>ay(e),latestPrice:(e,t={})=>cy(t,e),latestPrices:(e,t={})=>ly(t,e),feedDirectory:e=>uy(e)},"relayscan-mev":{health:e=>hy(e),overview:(e,t={})=>Xc(t,e),builderProfit:(e,t={})=>my(t,e),dailyStats:(e,t={})=>fy(t,e)},"sanctum-lst":{health:e=>yy(e),lstList:e=>Jc(e),apyAll:e=>by(e),apyIndividual:(e,t={})=>wy(t,e)},"solend-lending":{health:e=>Ey(e),markets:e=>el(e),reserves:(e,t={})=>vy(t,e)},"execution-strategies":{health:()=>Iy(),plan:(e,t={})=>Ay(t)},"across-bridge":{health:e=>c0(e),pools:(e,t={})=>l0(t,e),suggestedFees:(e,t={})=>u0(t,e)},"beefy-yields":{health:e=>d0(e),apy:(e,t={})=>p0(t,e),apyBreakdown:e=>m0(e)},"birdeye-tokens":{health:e=>h0(e),tokenList:(e,t={})=>g0(t,e)},"celestia-da":{health:e=>y0(e),stats:e=>b0(e),blockStats:(e,t={})=>w0(t,e)},"das-assets":{health:e=>x0(e),assetsByOwner:(e,t={})=>S0(t,e),searchAssets:(e,t={})=>k0(t,e),assetProof:(e,t={})=>E0(t,e)},"l2beat-tvl":{health:e=>v0(e),tvl:(e,t={})=>A0(t,e),activity:(e,t={})=>I0(t,e)},"spark-lend":{health:e=>_0(e),markets:(e,t={})=>P0(t,e)},"symbiotic-restaking":{health:e=>C0(e),vaults:(e,t={})=>T0(t,e),vaultDetail:(e,t={})=>N0(t,e)}},_y=new Set(["prepareBuilderApproval","prepareBracket","prepareIsolatedMargin","prepareLeverage","prepareCancel","prepareOrder","preparePurchase","prepareList","prepareSell","prepareBuy","prepareMint","prepare","prepareStakeDeposit","prepareStakeWithdraw","prepareDelegate","prepareSwap","prepareTransfer","createOrder","cancelOrder"]),Py=new Set(["hl-exec"]);function fP(e){return Py.has(String(e||""))}function hP(e,t,n={}){let r=String(t||""),o=`${e}.${r}`;if(Py.has(e))throw new Error(`data plane forbidden execution provider: ${e}`);let i=ir().find(s=>s.id===e);if(/sign|execute|broadcast|submit|send|write|place/i.test(r)&&!_y.has(r))throw new Error(`data plane forbidden op: ${o}`);if(i&&Array.isArray(i.ops)&&i.ops.length>0&&!i.ops.includes(r))throw new Error(`data plane: provider ${e} does not support op ${r}`);if(_y.has(r)&&n&&typeof n=="object"&&Object.defineProperty(n,"__oracleStateCreating",{value:!0,enumerable:!1,configurable:!0}),e==="evm-rpc"&&r==="call"){let s=String(n?.method||"").trim();if(!new Set(["eth_call","eth_getBalance","eth_blockNumber","eth_chainId","eth_getCode","eth_getLogs","eth_getTransactionByHash","eth_getTransactionReceipt","eth_getBlockByNumber","eth_getBlockByHash","eth_feeHistory","eth_gasPrice","eth_maxPriorityFeePerGas","net_version","web3_clientVersion"]).has(s))throw new Error(`data plane allows only read-only JSON-RPC methods through evm-rpc.call: ${s||"<missing>"}`)}}async function S(e,t,n={},r={}){if(fP(e))throw new Error(`${e} is an execution provider: it signs and submits with a real key. dataCall() is the public read plane and will not route to it.`);hP(e,t,n);let o=po(e);if(!o)throw new Error(`Unknown data provider: ${e}`);if(!o.ops.includes(t))throw new Error(`Provider ${e} does not support op '${t}' (has: ${o.ops.join(", ")})`);let i=mP[e];if(!i||typeof i[t]!="function")throw new Error(`No client implementation for ${e}.${t}`);return i[t](r,n)}async function Cy({providers:e,fetchImpl:t,timeoutMs:n,includeRpc:r,includeWs:o,concurrency:i,healthCall:s}={}){let a=e||ir().map(d=>d.id);!o&&!e&&(a=a.filter(d=>d!=="hl-ws"&&d!=="poly-ws"));let c={fetchImpl:t,timeoutMs:n??8e3},l=typeof s=="function"?s:(d,p,m)=>S(d,"health",p,m),u={};return await Jt(a,i??8,async d=>{if(!po(d)){u[d]={ok:!1,ms:0,reason:"transport",error:"unknown provider"};return}let p=d==="evm-rpc"?{chainId:1}:{},m=await ne(()=>l(d,p,c));if(!m.ok){u[d]={ok:!1,ms:m.ms,reason:"transport",error:m.error};return}let f=m.data;if(f&&typeof f=="object"&&f.ok===!1){u[d]={ok:!1,ms:m.ms,reason:"provider",error:f.error||f.message||"provider reported unhealthy",detail:f};return}u[d]={ok:!0,ms:m.ms,detail:f}}),{when:new Date().toISOString(),plane:"data",exec:!1,providers:u}}function Ty(){return ir().map(e=>({id:e.id,venue:e.venue,chainIds:e.chainIds,auth:e.auth,ops:e.ops,execution:e.execution||"read-only",description:e.description}))}var gP={catalog:Ty,health:Cy,call:S,hl:{health:e=>S("hl-info","health",{},e),allMids:e=>S("hl-info","allMids",{},e),l2Book:(e,t)=>S("hl-info","l2Book",{coin:e},t),outcomeMeta:e=>S("hl-info","outcomeMeta",{},e),clearinghouse:(e,t)=>S("hl-info","clearinghouse",{user:e},t),userFills:(e,t)=>S("hl-info","userFills",{user:e},t),meta:e=>S("hl-info","meta",{},e),metaAndAssetCtxs:e=>S("hl-info","metaAndAssetCtxs",{},e),candleSnapshot:(e,t)=>S("hl-info","candleSnapshot",e||{},t),openOrders:(e,t)=>S("hl-info","openOrders",{user:e},t),userState:(e,t)=>S("hl-info","userState",{user:e},t),spotMeta:e=>S("hl-info","spotMeta",{},e),vaults:{health:e=>S("hl-vaults","health",{},e),summaries:(e,t)=>S("hl-vaults","summaries",e||{},t),details:(e,t)=>S("hl-vaults","details",e||{},t),mine:(e,t)=>S("hl-vaults","userEquities",{user:e},t),track:(e,t)=>S("hl-vaults","tracker",e||{},t)},staking:{health:e=>S("hl-staking","health",{},e),validators:e=>S("hl-staking","validators",{},e),summary:(e,t)=>S("hl-staking","delegatorSummary",{user:e},t),delegations:(e,t)=>S("hl-staking","delegations",{user:e},t),rewards:(e,t)=>S("hl-staking","rewards",{user:e},t),history:(e,t)=>S("hl-staking","history",{user:e},t),preflight:(e,t)=>S("hl-staking","preflight",{user:e},t),prepareStake:(e,t)=>S("hl-staking","prepareStakeDeposit",e||{},t),prepareUnstake:(e,t)=>S("hl-staking","prepareStakeWithdraw",e||{},t),prepareDelegate:(e,t)=>S("hl-staking","prepareDelegate",e||{},t)}},poly:{health:e=>S("poly-public","health",{},e),time:e=>S("poly-public","time",{},e),markets:(e,t)=>S("poly-public","markets",e||{},t),book:(e,t)=>S("poly-public","book",{tokenId:e},t),midpoint:(e,t)=>S("poly-public","midpoint",{tokenId:e},t),spread:(e,t)=>S("poly-public","spread",{tokenId:e},t),price:(e,t,n)=>S("poly-public","price",{tokenId:e,side:t},n),events:(e,t)=>S("poly-public","events",e||{},t)},polyClob:{prepareOrder:(e,t)=>S("poly-clob","prepareOrder",e||{},t)},rpc:{health:(e,t)=>S("evm-rpc","health",{chainId:e},t),healthAll:(e,t)=>S("evm-rpc","healthAll",e||{},t),blockNumber:(e,t)=>S("evm-rpc","blockNumber",{chainId:e},t),getBalance:(e,t,n)=>S("evm-rpc","getBalance",{chainId:e,address:t},n),call:(e,t,n,r)=>S("evm-rpc","call",{chainId:e,method:t,params:n},r)},evmSniper:{health:e=>S("evm-token-sniper","health",{},e),scan:(e,t)=>S("evm-token-sniper","scan",e||{},t)},portfolio:{balance:(e,t)=>S("portfolio","balances",e||{},t),snapshot:(e,t)=>S("portfolio","snapshot",e||{},t),history:(e,t)=>S("portfolio","history",e||{},t),valueGraph:(e,t)=>S("portfolio","valueGraph",e||{},t)},nft:{inventory:(e,t)=>S("nft-portfolio","inventory",e||{},t),gallery:(e,t)=>S("nft-portfolio","gallery",e||{},t),pnl:(e,t)=>S("nft-portfolio","pnl",e||{},t),prepareList:(e,t)=>S("nft-portfolio","prepareList",e||{},t),traitSnipe:(e,t)=>S("nft-portfolio","traitSnipe",e||{},t),floor:(e,t)=>S("opensea-nft","floor",{slug:e},t),collection:(e,t)=>S("opensea-nft","collection",{slug:e},t)},solana:{health:e=>S("solana-rpc","health",{},e),latestBlockhash:(e,t)=>S("solana-rpc","latestBlockhash",e||{},t),balance:(e,t)=>S("solana-rpc","getBalance",{address:e},t),tokenAccounts:(e,t)=>S("solana-rpc","tokenAccounts",e||{},t),simulate:(e,t)=>S("solana-rpc","simulate",e||{},t),jupiterQuote:(e,t)=>S("jupiter","quote",e||{},t),jupiterPrepare:(e,t)=>S("jupiter","prepare",e||{},t),nftStats:(e,t)=>S("magiceden-sol","stats",e||{},t),nftListings:(e,t)=>S("magiceden-sol","listings",e||{},t),nftTokenListings:(e,t)=>S("magiceden-sol","tokenListings",e||{},t),nftPrepareBuy:(e,t)=>S("magiceden-sol","prepareBuy",e||{},t),nftPrepareList:(e,t)=>S("magiceden-sol","prepareList",e||{},t),nftPrepareMint:(e,t)=>S("magiceden-sol","prepareMint",e||{},t)},bitcoin:{health:e=>S("bitcoin-esplora","health",{},e),tipHeight:e=>S("bitcoin-esplora","tipHeight",{},e),fees:e=>S("bitcoin-esplora","fees",{},e),address:(e,t)=>S("bitcoin-esplora","address",{address:e},t),utxos:(e,t)=>S("bitcoin-esplora","utxos",{address:e},t),tx:(e,t)=>S("bitcoin-esplora","tx",{txid:e},t),decode:(e,t)=>S("bitcoin-esplora","decode",e||{},t),metaHealth:e=>S("bitcoin-meta","health",{},e),runeBalances:(e,t)=>S("bitcoin-meta","runeBalances",{address:e},t),inscriptions:(e,t)=>S("bitcoin-meta","inscriptions",{address:e},t),satflowHealth:e=>S("satflow","health",{},e),satflowFloors:(e,t)=>S("satflow","collectionFloors",e||{},t),satflowWallet:(e,t)=>S("satflow","walletContents",{address:e},t)},prices:{health:e=>S("defillama","health",{},e),current:(e,t)=>S("defillama","prices",{coins:e},t),bySymbol:(e,t)=>S("defillama","pricesBySymbol",{symbols:e},t),protocols:e=>S("defillama","protocols",{},e)},lifi:{health:e=>S("lifi","health",{},e),quote:(e,t)=>S("lifi","quote",e||{},t),chains:e=>S("lifi","chains",{},e)},dex:{health:e=>S("dexscreener","health",{},e),token:(e,t)=>S("dexscreener","token",{address:e},t),search:(e,t)=>S("dexscreener","search",{q:e},t),pair:(e,t,n)=>S("dexscreener","pair",{chainId:e,pairAddress:t},n)},uni:{health:(e,t)=>S("uniswap-v3","health",e||{},t),quote:(e,t)=>S("uniswap-v3","quote",e||{},t),quotePath:(e,t)=>S("uniswap-v3","quotePath",e||{},t),ethUsdc:(e,t)=>S("uniswap-v3","ethUsdc",e||{},t),chains:e=>S("uniswap-v3","chains",{},e)},univ4:{health:(e,t)=>S("uniswap-v4","health",e||{},t),quote:(e,t)=>S("uniswap-v4","quote",e||{},t),chains:e=>S("uniswap-v4","chains",{},e)},bridges:{across:(e,t)=>S("across","suggestedFees",e||{},t),hop:(e,t)=>S("hop","quote",e||{},t),relay:(e,t)=>S("relay","quote",e||{},t)},cow:{quote:(e,t)=>S("cowswap","quote",e||{},t)},hlWs:{allMids:e=>S("hl-ws","allMids",{},e),l2Book:(e,t)=>S("hl-ws","l2Book",{coin:e},t)},polyWs:{book:(e,t)=>S("poly-ws","book",{assetId:e},t)}};var Le=Object.freeze({FULL:"FULL",NO_GAS:"NO_GAS",FAILED:"FAILED"}),Oy={1:"coingecko:ethereum",10:"coingecko:ethereum",56:"coingecko:binancecoin",137:"coingecko:matic-network",8453:"coingecko:ethereum",42161:"coingecko:ethereum",43114:"coingecko:avalanche-2",999:"coingecko:ethereum"},Br=e=>{try{return e==null||e===""?null:BigInt(String(e).split(".")[0])}catch{return null}};function Ny(e){let{source:t,amountOut:n,minOut:r=null,gasUsd:o=null,feeUsd:i=null,oracleFeeBps:s=0,estimatedGas:a=null,liquidityUsd:c=null,error:l=null,executionReady:u=!1,meta:d={}}=e||{};if(l||n==null)return{source:t,quality:Le.FAILED,amountOut:null,error:l||"no amountOut returned"};let p=Br(n);if(p==null||p<=0n)return{source:t,quality:Le.FAILED,amountOut:null,error:"non-positive amountOut"};let m=Number(s);return{source:t,quality:o==null?Le.NO_GAS:Le.FULL,amountOut:p.toString(),minOut:Br(r)?.toString()??null,gasUsd:o,feeUsd:i,oracleFeeBps:Number.isFinite(m)&&m>0?Math.floor(m):0,estimatedGas:a==null?null:String(a),liquidityUsd:c==null?null:Number(c),executionReady:u,meta:d}}async function Ry(e,t,{divisor:n=1000n}={}){let r=Br(t);if(r==null||r<=0n)return null;let o=r/n>0n?r/n:1n;if(o>=r)return null;let i,s;try{[i,s]=await Promise.all([e(o),e(r)])}catch{return null}let a=Br(i),c=Br(s);if(a==null||c==null||a<=0n)return null;let l=Number(a)/Number(o),u=Number(c)/Number(r);return!Number.isFinite(l)||!Number.isFinite(u)||l<=0?null:{impactPct:(1-u/l)*100,probeAmountIn:o.toString(),probeAmountOut:a.toString(),fullAmountOut:c.toString()}}function $y(e,t,{maxImpactPct:n=25}={}){let r=[],o=[],i=(e.routes??[]).filter(a=>{let c=t?.[a.source];return c?c.impactPct>n?(r.push({source:a.source,impactPct:Number(c.impactPct.toFixed(2)),reason:`price impact ${c.impactPct.toFixed(1)}% exceeds ${n}% ceiling -- the venue cannot absorb this size near the quoted price`}),!1):!0:(o.push(a.source),!0)}),s=[...e.warnings??[]];return r.length&&s.push(`dropped ${r.length} route(s) on price impact: `+r.map(a=>`${a.source} (${a.impactPct}%)`).join(", ")),o.length&&s.push(`price impact NOT measured for: ${o.join(", ")}. These are unproven against thin liquidity, not proven safe.`),{...e,routes:i,best:i[0]??null,impactRejected:r,impactUnmeasured:o,warnings:s}}function ol(e,{destPriceUsd:t=null,destDecimals:n=null,liquidityFirst:r=!0,liquidityBandBps:o=50}={}){let i=e.filter(b=>b.quality!==Le.FAILED),s=e.filter(b=>b.quality===Le.FAILED),a=t!=null&&t>0&&n!=null&&n>=0,c=i.map(b=>{let k=BigInt(b.amountOut),x=0n,w=!1,v=BigInt(b.oracleFeeBps??0),T=v>0n?k*v/10000n:0n;if(a){let _=(b.gasUsd??0)+(b.feeUsd??0);if(_>0){let E=_/t*10**n;Number.isFinite(E)&&E>=0&&(x=BigInt(Math.floor(E)),w=!0)}else b.gasUsd===0&&(w=!0)}let I=x+T,R=k>I?k-I:0n;return{...b,grossOut:k.toString(),netOut:R.toString(),costInDest:x.toString(),oracleFeeInDest:T.toString(),costAccounted:w}}),l=Number(o)>0?Number(o):0,u=c.reduce((b,k)=>BigInt(k.netOut)>b?BigInt(k.netOut):b,0n),d=b=>u>0n?Number((u-BigInt(b))*10000n/u):0,p=[],m=c.slice().sort((b,k)=>BigInt(k.netOut)>BigInt(b.netOut)?1:-1)[0]??null;c.sort((b,k)=>{let x=d(b.netOut)<=l?0:1,w=d(k.netOut)<=l?0:1;if(r&&l>0&&x!==w)return x-w;if(r&&l>0){let v=b.liquidityUsd??-1,T=k.liquidityUsd??-1;if(v!==T)return T-v}return BigInt(k.netOut)>BigInt(b.netOut)?1:-1}),r&&l>0&&m&&c[0]&&c[0].source!==m.source&&p.push(`liquidity-first: chose ${c[0].source} (liquidity $${c[0].liquidityUsd??"unknown"}) over best-price ${m.source} within ${l} bps`);let f=c.filter(b=>!b.costAccounted).map(b=>b.source);a?f.length&&p.push(`gas not reported by: ${f.join(", ")}. These are ranked on gross output and may be overstated relative to gas-measured routes.`):p.push("destination price/decimals unavailable: ranked on GROSS output. Gas is not included, so a cheap-looking route may cost more to execute.");let h=null,g=null;if(c.length>=2&&c[0].costAccounted&&c[1].costAccounted){let b=BigInt(c[0].netOut),k=BigInt(c[1].netOut);k>0n&&(h=Number((b-k)*10000n/k),g=`${c[0].source} vs ${c[1].source}`)}return{best:c[0]??null,routes:c,failed:s,improvementBps:h,spreadBasis:g,rankedOn:a?"net-of-cost":"gross",warnings:p}}async function Mi(e,{timeoutMs:t=12e3}={}){let n=(o,i)=>Promise.race([o,new Promise((s,a)=>setTimeout(()=>a(new Error(`${i}: timeout`)),t))]);return(await Promise.allSettled(e.map(o=>n(Promise.resolve().then(o.run),o.source)))).map((o,i)=>{let s=e[i].source;return o.status==="rejected"?Ny({source:s,error:String(o.reason?.message||o.reason)}):Ny({source:s,...o.value})})}var We=e=>{let t=Number(e);return Number.isFinite(t)?t:null};function Ui(e){if(!Array.isArray(e))return null;let t=0,n=!1;for(let r of e){let o=We(r?.amountUSD);o!=null&&(t+=o,n=!0)}return n?t:null}async function My(e,t={}){let n=Oy[Number(e)];if(!n)return null;try{let r=await Oe([n],t);return We(r?.coins?.[n]?.price)}catch{return null}}var bt=e=>String(e??"").toLowerCase().replace(/[^a-z0-9]/g,""),Ly=Object.freeze({across:["across"],relay:["relaychain","relay"],lifi:["jumper-(li.fi-powered)","lifi"],stargate:["stargate-v2","stargate-v1","stargate"],hop:["hop-protocol","hop"],debridge:["debridge"],synapse:["synapse"],connext:["connext"],cbridge:["celer-bridge","celer-cbridge","cbridge"],celer:["celer-bridge","celer-cbridge","cbridge"],squid:["squid"],symbiosis:["symbiosis"],wormhole:["wormhole"],mayan:["mayan"],allbridge:["allbridge"],thorchain:["thorchain"]});async function yP(e={}){try{let t=await To({...e,baseUrl:e.defillamaApiBaseUrl,timeoutMs:e.defillamaTimeoutMs??Math.min(Number(e.timeoutMs??5e3),5e3)});return Array.isArray(t)?t:[]}catch{return[]}}function bP(e,t={}){let n=bt(t.tool||t.provider||t.bridge||t.protocol),r=[];return e==="lifi"&&n&&n!=="lifi"&&r.push(...Ly[n]||[n]),r.push(...Ly[bt(e)]||[e]),r}function wP(e,t,n={}){let r=Array.isArray(e)?e:[],o=bP(t,n).map(bt).filter(Boolean);for(let i of o){let s=r.find(c=>bt(c?.slug)===i||bt(c?.name)===i),a=We(s?.tvl);if(a!=null)return{liquidityUsd:a,protocol:s?.name??s?.slug??i}}for(let i of o){let s=r.find(c=>{let l=bt(c?.category);return!l.includes("bridge")&&!l.includes("crosschain")?!1:bt(c?.slug).includes(i)||bt(c?.name).includes(i)}),a=We(s?.tvl);if(a!=null)return{liquidityUsd:a,protocol:s?.name??s?.slug??i}}return null}function il({chainId:e,tokenIn:t,tokenOut:n,amountIn:r,taker:o,slippageBps:i,decimalsIn:s,decimalsOut:a,nativePriceUsd:c=null,destDecimalsPromise:l=null,opts:u={}}){let d=[];return d.push({source:"lifi",run:async()=>{let p=await lt({fromChain:e,toChain:e,fromToken:t,toToken:n,fromAmount:r},u),m=p?.estimate??p?.[0]?.estimate;return{amountOut:m?.toAmount,minOut:m?.toAmountMin,gasUsd:Ui(m?.gasCosts),feeUsd:Ui(m?.feeCosts),oracleFeeBps:p?.oracleFee?.applies?p.oracleFee.bps:0,meta:{tool:p?.tool??p?.toolDetails?.name,oracleFee:p?.oracleFee??null}}}}),s!=null&&d.push({source:"paraswap",run:async()=>{let p=a??(await Promise.resolve(l))?.decimals;if(p==null)throw new Error("paraswap needs destination decimals; none supplied or resolvable");let m=await yt({chainId:e,srcToken:t,destToken:n,amount:r,srcDecimals:s,destDecimals:p},u),f=m?.priceRoute;return{amountOut:f?.destAmount,gasUsd:We(f?.gasCostUSD),oracleFeeBps:m?.oracleFee?.applies?m.oracleFee.bps:0,meta:{bestRoute:f?.bestRoute?.[0]?.swaps?.[0]?.swapExchanges?.[0]?.exchange,oracleFee:m?.oracleFee??null}}}}),process.env.ZEROX_API_KEY&&d.push({source:"0x",run:async()=>{let p=await Rt({chainId:e,sellToken:t,buyToken:n,sellAmount:r,taker:o},u),m=null,f=p?.totalNetworkFee,h=await Promise.resolve(c);return f!=null&&h&&(m=Number(f)/1e18*h),{amountOut:p?.buyAmount,minOut:p?.minBuyAmount,gasUsd:m,meta:{source:p?.route?.fills?.[0]?.source}}}}),process.env.ONEINCH_API_KEY&&d.push({source:"1inch",run:async()=>{let p=await fr({chainId:e,src:t,dst:n,amount:r},u),m=null;return p?.gas!=null&&c&&(m=null),{amountOut:p?.dstAmount,gasUsd:m,meta:{gasUnits:p?.gas}}}}),d.push({source:"cow",run:async()=>{let p=await dt({chainId:e,sellToken:t,buyToken:n,sellAmountBeforeFee:String(r),from:o},u),m=p?.quote??p,f=m?.feeAmount;return{amountOut:m?.buyAmount,gasUsd:0,meta:{intent:!0,feeAmountInSellToken:f,settlement:"solver-executed"}}}}),ce[Number(e)]&&d.push({source:"uniswap-v3",run:async()=>{let p=await it({chainId:e,tokenIn:t,tokenOut:n,amountIn:r},u);return{amountOut:p?.amountOut,minOut:p?.minOut??p?.amountOutMinimum??null,gasUsd:null,liquidityUsd:p?.liquidityUsd??null,meta:{onchain:!0,fee:p?.fee,gasUnits:p?.gasEstimate,quoter:p?.quoter}}}}),je[Number(e)]&&d.push({source:"uniswap-v4",run:async()=>{let p=await co({chainId:e,tokenIn:t,tokenOut:n,amountIn:r,recipient:o,slippageBps:i},u);return{amountOut:p?.amountOut,minOut:p?.minOut??p?.amountOutMinimum??null,gasUsd:null,liquidityUsd:p?.liquidityUsd??null,meta:{onchain:!0,venue:"uniswap-v4",fee:p?.fee,tickSpacing:p?.tickSpacing,poolId:p?.poolId,hooks:p?.hooks,gasUnits:p?.gasEstimate,quoter:p?.quoter,poolManager:p?.poolManager,prepareReady:p?.prepareReady===!0,executionReady:!1}}}}),d}function Uy({fromChainId:e,toChainId:t,tokenIn:n,tokenOut:r,amountIn:o,taker:i,opts:s={}}){let a=[],c=null,l=async(u,d={})=>(c||=yP(s),wP(await c,u,d));return a.push({source:"lifi",run:async()=>{let u=await lt({fromChain:e,toChain:t,fromToken:n,toToken:r,fromAmount:o},s),d=u?.estimate??u?.[0]?.estimate,p={tool:u?.tool??u?.toolDetails?.name,durationSeconds:We(d?.executionDuration)},m=await l("lifi",p);return{amountOut:d?.toAmount,minOut:d?.toAmountMin,gasUsd:Ui(d?.gasCosts),feeUsd:Ui(d?.feeCosts),oracleFeeBps:u?.oracleFee?.applies?u.oracleFee.bps:0,liquidityUsd:m?.liquidityUsd??null,meta:{...p,liquidityProtocol:m?.protocol,oracleFee:u?.oracleFee??null}}}}),a.push({source:"relay",run:async()=>{let{relayQuote:u}=await Promise.resolve().then(()=>(Do(),Bo)),p=(await u({user:i,originChainId:e,destinationChainId:t,originCurrency:n,destinationCurrency:r,amount:String(o)},s))?.details,m={durationSeconds:We(p?.timeEstimate),rate:p?.rate},f=await l("relay",m);return{amountOut:p?.currencyOut?.amount,minOut:p?.currencyOut?.minimumAmount,gasUsd:We(p?.totalImpact?.usd)!=null?Math.abs(We(p.totalImpact.usd)):null,liquidityUsd:f?.liquidityUsd??null,meta:{...m,liquidityProtocol:f?.protocol}}}}),a.push({source:"across",run:async()=>{let{acrossSuggestedFees:u}=await Promise.resolve().then(()=>(Do(),Bo)),d=await u({token:n,destinationToken:r,originChainId:e,destinationChainId:t,amount:String(o)},s),p=d?.totalRelayFee?.total,m=null;if(p!=null)try{let h=BigInt(String(o))-BigInt(String(p));h>0n&&(m=h.toString())}catch{}let f=await l("across");return{amountOut:m,gasUsd:null,liquidityUsd:f?.liquidityUsd??null,meta:{derivedFromFees:!0,durationSeconds:We(d?.estimatedFillTimeSec),limits:d?.limits?{min:d.limits.minDeposit,max:d.limits.maxDeposit}:void 0,liquidityProtocol:f?.protocol}}}}),a}var xP={1:"ethereum",10:"optimism",56:"bsc",137:"polygon",8453:"base",42161:"arbitrum",43114:"avax"};async function By(e,t,n){let r=xP[Number(e)];if(!r)return{priceUsd:null,decimals:null};let o=`${r}:${t}`;try{let s=(await Oe([o],n))?.coins?.[o],a=Number(s?.price),c=Number(s?.decimals);return{priceUsd:Number.isFinite(a)?a:null,decimals:Number.isFinite(c)?c:null}}catch{return{priceUsd:null,decimals:null}}}async function SP(e,t={}){let{chainId:n,tokenIn:r,tokenOut:o,amountIn:i}=e;if(n==null||!r||!o||i==null)throw new Error("bestSwapRoute requires chainId, tokenIn, tokenOut, amountIn");let s=My(n,t),a=By(n,o,t),c=il({...e,nativePriceUsd:s,decimalsOut:e.decimalsOut,destDecimalsPromise:a,opts:t}),[l,u]=await Promise.all([Mi(c,{timeoutMs:t.timeoutMs??12e3}),a]);s.catch(()=>{});let d=ol(l,{destPriceUsd:u.priceUsd,destDecimals:e.decimalsOut??u.decimals,liquidityBandBps:t.liquidityBandBps??50}),p=t.maxImpactPct===void 0?25:t.maxImpactPct;if(p!=null&&d.best){let m=d.best.source,h=await Ry(async g=>{let b=il({...e,amountIn:g.toString(),nativePriceUsd:s,decimalsOut:e.decimalsOut,destDecimalsPromise:a,opts:t}).filter(x=>x.source===m);return b.length?(await Mi(b,{timeoutMs:t.timeoutMs??12e3}))?.[0]?.amountOut??null:null},i);if(h){let g=$y(d,{[m]:h},{maxImpactPct:p});return{kind:"swap",chainId:n,tokenIn:r,tokenOut:o,amountIn:String(i),...g,sourcesTried:c.length,sourcesAnswered:l.filter(b=>b.quality!==Le.FAILED).length,note:sl(g,c.length),priceImpact:{[m]:Number(h.impactPct.toFixed(2))}}}}return{kind:"swap",chainId:n,tokenIn:r,tokenOut:o,amountIn:String(i),...d,sourcesTried:c.length,sourcesAnswered:l.filter(m=>m.quality!==Le.FAILED).length,note:sl(d,c.length)}}async function kP(e,t={}){let{fromChainId:n,toChainId:r,tokenIn:o,tokenOut:i,amountIn:s}=e;if(n==null||r==null||!o||!i||s==null)throw new Error("bestBridgeRoute requires fromChainId, toChainId, tokenIn, tokenOut, amountIn");if(Number(n)===Number(r))throw new Error("bestBridgeRoute is for cross-chain; use bestSwapRoute for same-chain");let a=By(r,i,t),c=Uy({...e,opts:t}),[l,u]=await Promise.all([Mi(c,{timeoutMs:t.timeoutMs??15e3}),a]),d=ol(l,{destPriceUsd:u.priceUsd,destDecimals:e.decimalsOut??u.decimals,liquidityBandBps:t.liquidityBandBps??50}),p=d.routes.map(m=>({source:m.source,seconds:m.meta?.durationSeconds??null})).filter(m=>m.seconds!=null);return{kind:"bridge",fromChainId:n,toChainId:r,tokenIn:o,tokenOut:i,amountIn:String(s),...d,durations:p,sourcesTried:c.length,sourcesAnswered:l.filter(m=>m.quality!==Le.FAILED).length,note:sl(d,c.length)}}function EP(e){let t=e?.meta?.oracleFee;return t?.applies?` \xB7 ${Zd(t)}`:""}function sl(e,t){if(!e.best)return"no source returned a usable route";let n=e.routes.length,r=EP(e.best);if(n===1)return`only 1 of ${t} sources answered, so this is the ONLY route, not a proven best one. Treat it as unbenchmarked.`+r;if(e.improvementBps!=null){let o=e.improvementBps,i=o/100;if(o<.01)return`best of ${n} routes, ranked on ${e.rankedOn}: effectively tied with the runner-up (${e.spreadBasis}), inside quote noise. Re-quote before you size up.`+r;let s=i>=.01?`${i.toFixed(2)}%`:`${o.toFixed(2)}bps`;return`best of ${n} routes, ranked on ${e.rankedOn}: ${s} better than the runner-up (${e.spreadBasis})`+r}return`best of ${n} routes, ranked on ${e.rankedOn}. No spread quoted: the top routes report cost differently, so the margin is not comparable.`+r}var PU=Object.freeze({mantissa:10000n,scale:0});function zt(e){if(!Number.isSafeInteger(e)||e<0||e>1e3)throw new RangeError("scale must be a safe integer from 0 through 1000")}function Ge(e,t){if(typeof e!="bigint")throw new TypeError("mantissa must be a bigint");return zt(t),Object.freeze({mantissa:e,scale:t})}function wt(e,t="value"){if(e===null||typeof e!="object")throw new TypeError(`${t} must be a fixed point value`);if(typeof e.mantissa!="bigint")throw new TypeError(`${t}.mantissa must be a bigint`);zt(e.scale)}function Bi(e){return zt(e),10n**BigInt(e)}function D(e){if(typeof e!="string"||!/^[+-]?\d+(?:\.\d+)?$/.test(e))throw new TypeError("value must be a plain decimal string");let t=e.startsWith("-"),n=e[0]==="-"||e[0]==="+"?e.slice(1):e,[r,o=""]=n.split("."),i=`${r}${o}`,s=BigInt(i)*(t?-1n:1n);return Ge(s,o.length)}function fe(e,t){if(zt(t),typeof e=="bigint")return Ge(e,t);if(typeof e!="string"||!/^[+-]?\d+$/.test(e))throw new TypeError("value must be an integer string or bigint");return Ge(BigInt(e),t)}function Me(e){wt(e);let t=e.mantissa<0n,n=(t?-e.mantissa:e.mantissa).toString();if(e.scale===0)return`${t?"-":""}${n}`;let r=n.padStart(e.scale+1,"0"),o=r.length-e.scale;return`${t?"-":""}${r.slice(0,o)}.${r.slice(o)}`}function Dr(e,t){return wt(e),zt(t),t===e.scale?Ge(e.mantissa,e.scale):t>e.scale?Ge(e.mantissa*Bi(t-e.scale),t):Ge(e.mantissa/Bi(e.scale-t),t)}function al(e,t){wt(e,"left"),wt(t,"right");let n=Math.max(e.scale,t.scale);return[Dr(e,n),Dr(t,n),n]}function xt(e,t){let[n,r,o]=al(e,t);return Ge(n.mantissa+r.mantissa,o)}function Fr(e,t){let[n,r,o]=al(e,t);return Ge(n.mantissa-r.mantissa,o)}function xe(e,t){wt(e,"left"),wt(t,"right");let n=e.scale+t.scale;return zt(n),Ge(e.mantissa*t.mantissa,n)}function Ue(e,t,n=Math.max(e?.scale??0,t?.scale??0)){if(wt(e,"left"),wt(t,"right"),zt(n),t.mantissa===0n)throw new RangeError("division by zero");let r=e.mantissa*Bi(t.scale+n),o=t.mantissa*Bi(e.scale);return Ge(r/o,n)}function St(e,t){let[n,r]=al(e,t);return n.mantissa<r.mantissa?-1:n.mantissa>r.mantissa?1:0}import{readFileSync as _P,existsSync as PP}from"node:fs";import{fileURLToPath as CP}from"node:url";import{dirname as TP,join as jy}from"node:path";import{existsSync as Fy,readFileSync as vP}from"node:fs";import{dirname as Dy,join as cl}from"node:path";import{fileURLToPath as AP}from"node:url";function IP(e){let t=Dy(AP(e));for(let n=0;n<8;n+=1){let r=cl(t,"package.json");if(Fy(r))try{let i=JSON.parse(vP(r,"utf8"));if(i&&typeof i.version=="string")return t}catch{}let o=Dy(t);if(o===t)break;t=o}throw new Error(`oracle: could not resolve package root from ${e}`)}function qy(e,t){let n=IP(t),r=cl(n,"dist","assets",e);return Fy(r)?r:cl(n,e)}var NP=jy(TP(CP(import.meta.url)),"fixtures");function OP(){try{let e=qy("equities-fixtures",import.meta.url);if(e&&PP(e))return e}catch{}return NP}var RP=OP();var Vy=Object.freeze({venues:"venues.json",universe:"universe.json",oracles:"oracles.json",nyseHolidays:"nyse_holidays.json",dstTransitions:"dst_transitions.json",equityDexPools:"equity_dex_pools.json",rhPoolState:"rh_pool_state.json",solanaXstocks:"solana_xstocks.json",tonXstocks:"ton_xstocks.json",hip3L2Books:"hip3_l2books.json"});function $P(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function j(e,t){throw new TypeError(`Fixture fixtures/${e}: ${t}`)}function te(e,t,n){$P(e)||j(t,`${n} must be an object`)}function z(e,t,n){(typeof e!="string"||e.length===0)&&j(t,`${n} must be a nonempty string`)}function Ke(e,t,n){Number.isSafeInteger(e)||j(t,`${n} must be a safe integer`)}function kt(e,t,n){te(e,t,n);for(let[r,o]of Object.entries(e))z(r,t,`${n} key`),te(o,t,`${n}.${r}`)}function LP(e,t){te(e,t,"root"),Ke(e.capturedAt,t,"capturedAt"),te(e.venues,t,"venues");let n=[["hyperliquid_hip3","dexs"],["arcus","markets"],["arcus_spot","pairs"],["rh_uniswap","pools"],["rh_chainlink_oracles","assets"]];for(let[r,o]of n){let i=e.venues[r];te(i,t,`venues.${r}`),z(i.type,t,`venues.${r}.type`),z(i.chain,t,`venues.${r}.chain`),z(i.tier,t,`venues.${r}.tier`),kt(i[o],t,`venues.${r}.${o}`)}for(let[r,o]of Object.entries(e.venues.hyperliquid_hip3.dexs))kt(o,t,`venues.hyperliquid_hip3.dexs.${r}`)}function MP(e,t){kt(e,t,"root"),Object.keys(e).length===0&&j(t,"root must not be empty");for(let[n,r]of Object.entries(e))Array.isArray(r.venues)||j(t,`${n}.venues must be an array`),r.venues.forEach((o,i)=>z(o,t,`${n}.venues[${i}]`))}function UP(e,t){te(e,t,"root");for(let n of["chainId","block","oracleScaleExp","usdgDecimals","equityDecimals"])Ke(e[n],t,n);z(e.usdg,t,"usdg"),kt(e.assets,t,"assets");for(let[n,r]of Object.entries(e.assets))z(r.oracle,t,`assets.${n}.oracle`),z(r.token,t,`assets.${n}.token`),(typeof r.rawPrice!="string"||!/^\d+$/.test(r.rawPrice))&&j(t,`assets.${n}.rawPrice must be an integer string`),(typeof r.usd!="number"||!Number.isFinite(r.usd)||r.usd<0)&&j(t,`assets.${n}.usd must be a nonnegative finite source number`)}function BP(e,t){te(e,t,"root");for(let r of["holidayDayIndex","names","dates"])Array.isArray(e[r])||j(t,`${r} must be an array`);let n=e.holidayDayIndex.length;(e.names.length!==n||e.dates.length!==n)&&j(t,"holidayDayIndex, names, and dates must have equal lengths"),e.holidayDayIndex.forEach((r,o)=>Ke(r,t,`holidayDayIndex[${o}]`)),e.names.forEach((r,o)=>z(r,t,`names[${o}]`)),e.dates.forEach((r,o)=>{(typeof r!="string"||!/^\d{4}-\d{2}-\d{2}$/.test(r))&&j(t,`dates[${o}] must use YYYY-MM-DD`)})}function DP(e,t){te(e,t,"root"),(!Array.isArray(e.dstTransitions)||e.dstTransitions.length===0)&&j(t,"dstTransitions must be a nonempty array");let n=new Set;e.dstTransitions.forEach((r,o)=>{te(r,t,`dstTransitions[${o}]`);for(let i of["year","startUtc","endUtc"])Ke(r[i],t,`dstTransitions[${o}].${i}`);r.startUtc>=r.endUtc&&j(t,`dstTransitions[${o}] startUtc must be before endUtc`),n.has(r.year)&&j(t,`dstTransitions contains duplicate year ${r.year}`),n.add(r.year)})}function FP(e,t){kt(e,t,"root"),Object.keys(e).length===0&&j(t,"root must not be empty");for(let[n,r]of Object.entries(e)){for(let o of["addr","quote","quoteAddr","dex","pair"])z(r[o],t,`${n}.${o}`);(typeof r.liq!="number"||!Number.isFinite(r.liq)||r.liq<0)&&j(t,`${n}.liq must be a nonnegative finite source number`)}}function qP(e,t){te(e,t,"root"),Ke(e.capturedAt,t,"capturedAt"),Ke(e.block,t,"block"),Ke(e.chainId,t,"chainId"),z(e.gasPriceWei,t,"gasPriceWei"),z(e.stateView,t,"stateView"),kt(e.pools,t,"pools"),Object.keys(e.pools).length===0&&j(t,"pools must not be empty");for(let[n,r]of Object.entries(e.pools)){for(let o of["pair","version","quote","token","sqrtPriceX96"])z(r[o],t,`pools.${n}.${o}`);r.version!=="v3"&&r.version!=="v4"&&j(t,`pools.${n}.version must be v3 or v4`),typeof r.quoteIsToken0!="boolean"&&j(t,`pools.${n}.quoteIsToken0 must be a boolean`),(!/^[0-9]+$/.test(r.sqrtPriceX96)||BigInt(r.sqrtPriceX96)<=0n)&&j(t,`pools.${n}.sqrtPriceX96 must be a positive integer string`)}}function HP(e,t){te(e,t,"root"),Ke(e.capturedAt,t,"capturedAt"),z(e.source,t,"source"),te(e.books,t,"books"),Object.keys(e.books).length===0&&j(t,"books must not be empty");for(let[n,r]of Object.entries(e.books)){te(r,t,`books.${n}`),(!Array.isArray(r.bids)||!Array.isArray(r.asks))&&j(t,`books.${n} must have bids and asks arrays`);for(let[o,i]of r.bids.entries())te(i,t,`books.${n}.bids[${o}]`),z(i.px,t,`books.${n}.bids[${o}].px`),z(i.sz,t,`books.${n}.bids[${o}].sz`);for(let[o,i]of r.asks.entries())te(i,t,`books.${n}.asks[${o}]`),z(i.px,t,`books.${n}.asks[${o}].px`),z(i.sz,t,`books.${n}.asks[${o}].sz`)}}function jP(e,t){te(e,t,"root"),Ke(e.capturedAt,t,"capturedAt"),z(e.source,t,"source"),z(e.chain,t,"chain"),kt(e.tokens,t,"tokens"),te(e.pairs,t,"pairs"),Object.keys(e.tokens).length===0&&j(t,"tokens must not be empty");for(let[n,r]of Object.entries(e.tokens)){z(r.symbolRaw,t,`tokens.${n}.symbolRaw`),z(r.mint,t,`tokens.${n}.mint`),Object.hasOwn(e.pairs,n)||j(t,`pairs.${n} is required for token ${n}`),(!Array.isArray(e.pairs[n])||e.pairs[n].length===0)&&j(t,`pairs.${n} must be a nonempty array`);for(let[o,i]of e.pairs[n].entries())te(i,t,`pairs.${n}[${o}]`),z(i.pairAddress,t,`pairs.${n}[${o}].pairAddress`),z(i.dexId,t,`pairs.${n}[${o}].dexId`),(typeof i.priceUsd!="number"||!Number.isFinite(i.priceUsd)||i.priceUsd<=0)&&j(t,`pairs.${n}[${o}].priceUsd must be a positive finite number`),(typeof i.liquidityUsd!="number"||!Number.isFinite(i.liquidityUsd)||i.liquidityUsd<0)&&j(t,`pairs.${n}[${o}].liquidityUsd must be a nonnegative finite number`)}}function VP(e,t){te(e,t,"root"),Ke(e.capturedAt,t,"capturedAt"),z(e.source,t,"source"),z(e.chain,t,"chain"),e.chain!=="ton"&&j(t,'chain must be "ton"'),kt(e.tokens,t,"tokens"),te(e.pairs,t,"pairs"),Object.keys(e.tokens).length===0&&j(t,"tokens must not be empty");for(let[n,r]of Object.entries(e.tokens)){z(r.symbolRaw,t,`tokens.${n}.symbolRaw`),z(r.mint,t,`tokens.${n}.mint`),Object.hasOwn(e.pairs,n)||j(t,`pairs.${n} is required for token ${n}`),(!Array.isArray(e.pairs[n])||e.pairs[n].length===0)&&j(t,`pairs.${n} must be a nonempty array`);for(let[o,i]of e.pairs[n].entries())te(i,t,`pairs.${n}[${o}]`),z(i.pairAddress,t,`pairs.${n}[${o}].pairAddress`),z(i.dexId,t,`pairs.${n}[${o}].dexId`),(typeof i.priceUsd!="number"||!Number.isFinite(i.priceUsd)||i.priceUsd<=0)&&j(t,`pairs.${n}[${o}].priceUsd must be a positive finite number`),(typeof i.liquidityUsd!="number"||!Number.isFinite(i.liquidityUsd)||i.liquidityUsd<0)&&j(t,`pairs.${n}[${o}].liquidityUsd must be a nonnegative finite number`)}}var zP=Object.freeze({venues:LP,universe:MP,oracles:UP,nyseHolidays:BP,dstTransitions:DP,equityDexPools:FP,rhPoolState:qP,solanaXstocks:jP,tonXstocks:VP,hip3L2Books:HP});function WP(e,t){let n=Vy[t],r=jy(e,n),o;try{o=_P(r,"utf8")}catch(s){throw s?.code==="ENOENT"?new Error(`Fixture fixtures/${n} is missing at ${r}`):new Error(`Fixture fixtures/${n} could not be read: ${s.message}`)}let i;try{i=JSON.parse(o)}catch(s){throw new SyntaxError(`Fixture fixtures/${n} contains invalid JSON: ${s.message}`)}return zP[t](i,n),i}function zy(e){if(e!==null&&typeof e=="object"&&!Object.isFrozen(e)){Object.freeze(e);for(let t of Object.values(e))zy(t)}return e}function Wy({fixtureDir:e=RP}={}){if(typeof e!="string"||e.length===0)throw new TypeError("fixtureDir must be a nonempty path string");let t={};for(let n of Object.keys(Vy))t[n]=WP(e,n);return zy(t)}var Hy;function Et(){return Hy??=Wy(),Hy}function Ae(){return Et().venues}function Gy(){return Et().oracles}function Ky(){return Et().nyseHolidays}function Yy(){return Et().dstTransitions}function Di(){return Et().rhPoolState}function Xy(){return Et().solanaXstocks}function Qy(){return Et().tonXstocks}function Jy(){return Et().hip3L2Books}var ul=1e3,tb=60*ul,dl=60*tb,Zy=24*dl,GP=-5*dl,KP=-4*dl,nb=240,rb=570,ob=960,ib=1200,FU=Object.freeze([nb,rb,ob,ib]),qU=Object.freeze(["core","extended","dark"]),eb,ll;function YP(){let e=Yy().dstTransitions.map(r=>({year:r.year,startMs:r.startUtc*ul,endMs:r.endUtc*ul}));e.sort((r,o)=>r.startMs-o.startMs);let t=e[0].year,n=e[e.length-1].year;return Object.freeze({rows:Object.freeze(e),firstYear:t,lastYear:n,coverageStartMs:Date.UTC(t,0,1),coverageEndMs:Date.UTC(n+1,0,1)})}function sb(){return eb??=YP(),eb}function XP(){return ll===void 0&&(ll=new Set(Ky().holidayDayIndex)),ll}function ab(e,t){if(!Number.isSafeInteger(e))throw new TypeError(`${t}: epochMs must be a safe integer number of milliseconds`)}function QP(e,t){let{coverageStartMs:n,coverageEndMs:r,firstYear:o,lastYear:i}=sb();if(e<n||e>=r)throw new RangeError(`${t}: ${new Date(e).toISOString()} is outside DST fixture coverage (${o} through ${i}). Refusing to assume a UTC offset.`)}function JP(e){for(let t of sb().rows)if(e>=t.startMs&&e<t.endMs)return!0;return!1}function ZP(e){return JP(e)?KP:GP}function eC(e){let t=e+ZP(e),n=Math.floor(t/Zy),r=t-n*Zy,o=new Date(t);return{dayIndex:n,minuteOfDay:Math.floor(r/tb),msIntoDay:r,weekday:o.getUTCDay()}}function tC({dayIndex:e,weekday:t}){return t===0||t===6?!1:!XP().has(e)}function nC(e){return e<nb?"dark":e<rb?"extended":e<ob?"core":e<ib?"extended":"dark"}function qr(e){ab(e,"sessionState"),QP(e,"sessionState");let t=eC(e);return tC(t)?nC(t.minuteOfDay):"dark"}function pl(e){return ab(e,"isDark"),qr(e)==="dark"}var Fi=Object.freeze({DORMANT_VENUE:"dormant-venue",CROSSED_BOOK:"crossed-book",STALE_QUOTE:"stale-quote",STALE_ORACLE:"stale-oracle"}),rC=12e4,oC=6e5;function qi(e,t){e.push(Object.freeze({venue:t.venue,symbol:t.symbol??null,reason:t.reason,evidence:t.evidence??null}))}function iC(e){let t=e.raw?.vol24h;return!!(t===0||t===0||typeof t=="number"&&Number.isFinite(t)&&t<=0)}function sC(e){return!e.bid||!e.ask?!1:St(e.bid,e.ask)>0}function cb(e,t,n){return Number.isSafeInteger(e.capturedAt)?t-e.capturedAt>n:!1}function Hi(e,t={}){if(!Array.isArray(e))throw new TypeError("quotes must be an array");let n=t.nowMs??Date.now(),r=t.quoteFreshnessMs??rC,o=t.oracleFreshnessMs??oC,i=t.includeDormant===!0,s=[],a=[];for(let c of e){if(iC(c)){i?s.push(Object.freeze({...c,staleData:!0})):qi(a,{venue:c.venue,symbol:c.symbolRaw??c.symbol,reason:Fi.DORMANT_VENUE,evidence:{vol24h:c.raw?.vol24h??null}});continue}if(sC(c)){qi(a,{venue:c.venue,symbol:c.symbolRaw??c.symbol,reason:Fi.CROSSED_BOOK,evidence:{bid:c.bid?String(c.bid.mantissa)+"e-"+c.bid.scale:null,ask:c.ask?String(c.ask.mantissa)+"e-"+c.ask.scale:null}});continue}if(cb(c,n,r)){qi(a,{venue:c.venue,symbol:c.symbolRaw??c.symbol,reason:Fi.STALE_QUOTE,evidence:{capturedAt:c.capturedAt,nowMs:n,ageMs:n-c.capturedAt,freshnessMs:r}});continue}if(c.tier==="read-only"&&c.raw?.oracleRaw!==void 0){let l=qr(n),u=l==="core"?o:o*2;if(cb(c,n,u)){qi(a,{venue:c.venue,symbol:c.symbolRaw??c.symbol,reason:Fi.STALE_ORACLE,evidence:{capturedAt:c.capturedAt,nowMs:n,session:l}});continue}}s.push(c)}return{survivors:s,excluded:a}}function aC(e){if(typeof e!="number"||!Number.isFinite(e))throw new TypeError("value must be a finite number");let t=String(e);if(!t.includes("e")&&!t.includes("E"))return t;let[n,r]=t.split(/[eE]/),o=Number(r),i=n.startsWith("-"),s=i?n.slice(1):n,[a,c=""]=s.split("."),l=`${a}${c}`,u=a.length+o,d;return u<=0?d=`0.${"0".repeat(-u)}${l}`:u>=l.length?d=`${l}${"0".repeat(u-l.length)}`:d=`${l.slice(0,u)}.${l.slice(u)}`,`${i?"-":""}${d}`}function oe(e){return e==null?null:typeof e=="string"?D(e):typeof e!="number"||!Number.isFinite(e)?null:D(aC(e))}function Be(e,t){let n=oe(e);if(n===null)throw new TypeError(`${t} must be a finite source number`);return n}var cC=new Set(["spot","perp"]),lC=new Set(["read-only","quote-only","prepare","intent"]),uC=new Set(["buy","sell"]),dC=new Set(["net-of-cost","gross"]),pC=new Set(["homogeneous","heterogeneous"]),mC=["bid","ask","mid","mark"],lb=["fees","gasEstimate","priceImpact","fundingHourly"],fC=/^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$/;function Y(e,t){throw new TypeError(`${e} ${t}`)}function db(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function Wt(e,t){db(e)||Y(t,"must be an object")}function pb(e,t,n){Object.hasOwn(e,t)||Y(`${n}.${t}`,"is required")}function $n(e,t){(typeof e!="string"||e.length===0)&&Y(t,"must be a nonempty string")}function Hr(e,t,n){t.has(e)||Y(n,`must be one of ${[...t].join(", ")}`)}function fl(e,t){(!Number.isSafeInteger(e)||e<0)&&Y(t,"must be a nonnegative safe integer")}function ml(e,t,n=!1){e===null&&n||(db(e)||Y(t,"must be a fixed point value"),typeof e.mantissa!="bigint"&&Y(`${t}.mantissa`,"must be a bigint"),(!Number.isSafeInteger(e.scale)||e.scale<0)&&Y(`${t}.scale`,"must be a nonnegative safe integer"))}function ji(e,t,n=!1){e===null&&n||Wt(e,t)}function ub(e,t){Wt(e,t),$n(e.venue,`${t}.venue`),$n(e.reason,`${t}.reason`),fC.test(e.reason)||Y(`${t}.reason`,"must be a machine readable lower case code"),Object.hasOwn(e,"symbol")&&e.symbol!==null&&$n(e.symbol,`${t}.symbol`)}function Se(e){Wt(e,"quote");for(let n of["venue","chain","instrument","tier","symbolRaw","symbol","side","requestedSize",...lb,"costAccounted","capturedAt","blockOrSeq","raw"])pb(e,n,"quote");$n(e.venue,"quote.venue"),!(typeof e.chain=="string"&&e.chain.length>0)&&!(Number.isSafeInteger(e.chain)&&e.chain>=0)&&Y("quote.chain","must be a nonempty string or nonnegative chain id"),Hr(e.instrument,cC,"quote.instrument"),Hr(e.tier,lC,"quote.tier"),$n(e.symbolRaw,"quote.symbolRaw"),$n(e.symbol,"quote.symbol"),Hr(e.side,uC,"quote.side"),ml(e.requestedSize,"quote.requestedSize"),e.requestedSize.mantissa<0n&&Y("quote.requestedSize","must not be negative");let t=0;for(let n of mC)Object.hasOwn(e,n)&&(ml(e[n],`quote.${n}`),t+=1);t===0&&Y("quote","must contain at least one of bid, ask, mid, mark");for(let n of lb)ml(e[n],`quote.${n}`,!0);if(typeof e.costAccounted!="boolean"&&Y("quote.costAccounted","must be a boolean"),e.costAccounted){for(let n of["fees","gasEstimate","priceImpact"])e[n]===null&&Y(`quote.${n}`,"cannot be unknown when costAccounted is true");e.instrument==="perp"&&e.fundingHourly===null&&Y("quote.fundingHourly","cannot be unknown when costAccounted is true for a perp")}return e.instrument==="spot"&&e.fundingHourly!==null&&Y("quote.fundingHourly","must be null for a spot quote"),fl(e.capturedAt,"quote.capturedAt"),e.blockOrSeq!==null&&!(typeof e.blockOrSeq=="string"&&e.blockOrSeq.length>0)&&!(Number.isSafeInteger(e.blockOrSeq)&&e.blockOrSeq>=0)&&Y("quote.blockOrSeq","must be null, a nonempty string, or a nonnegative safe integer"),Wt(e.raw,"quote.raw"),e}function hl(e){Wt(e,"rankResult");for(let t of["rankedOn","ranked","winner","runnersUp","improvementBps","sourcesAnswered","sourcesTried","failed","excluded","darkWindow","instrumentMix","bestPreparable"])pb(e,t,"rankResult");return Hr(e.rankedOn,dC,"rankResult.rankedOn"),Array.isArray(e.ranked)||Y("rankResult.ranked","must be an array"),e.ranked.forEach((t,n)=>ji(t,`rankResult.ranked[${n}]`)),ji(e.winner,"rankResult.winner",!0),e.ranked.length===0&&e.winner!==null&&Y("rankResult.winner","must be null when ranked is empty"),e.ranked.length>0&&e.winner===null&&Y("rankResult.winner","must be present when ranked is not empty"),Array.isArray(e.runnersUp)||Y("rankResult.runnersUp","must be an array"),e.runnersUp.forEach((t,n)=>ji(t,`rankResult.runnersUp[${n}]`)),e.improvementBps!==null&&!(typeof e.improvementBps=="number"&&Number.isFinite(e.improvementBps))&&Y("rankResult.improvementBps","must be a finite number or null"),fl(e.sourcesAnswered,"rankResult.sourcesAnswered"),fl(e.sourcesTried,"rankResult.sourcesTried"),e.sourcesAnswered>e.sourcesTried&&Y("rankResult.sourcesAnswered","must not exceed sourcesTried"),Array.isArray(e.failed)||Y("rankResult.failed","must be an array"),e.failed.forEach((t,n)=>ub(t,`failed[${n}]`)),Array.isArray(e.excluded)||Y("rankResult.excluded","must be an array"),e.excluded.forEach((t,n)=>ub(t,`excluded[${n}]`)),e.darkWindow!==null&&Wt(e.darkWindow,"rankResult.darkWindow"),Hr(e.instrumentMix,pC,"rankResult.instrumentMix"),ji(e.bestPreparable,"rankResult.bestPreparable",!0),Object.hasOwn(e,"carry")&&e.carry!==null&&Wt(e.carry,"rankResult.carry"),e}var hC="arcus_perp",gC="robinhood-4663",yC="quote-only",Vi="0.00000480324074074";function mb(){return Ae().venues.arcus}function bC(){return Object.keys(mb().markets).sort()}function wC({symbol:e,side:t="buy",sizeUsd:n=null}={}){if(typeof e!="string"||e.length===0)return null;let r=e.endsWith("-USD")?e.slice(0,-4):e,o=mb().markets[r];if(!o)return null;let i=Be(o.mark,`${r}.mark`),s=oe(o.oracle),a=oe(o.fundingHourly),c=n===null?D("0"):n,l={venue:hC,chain:gC,instrument:"perp",tier:yC,symbolRaw:e,symbol:r,side:t,requestedSize:c,mark:i,fees:null,gasEstimate:null,priceImpact:null,fundingHourly:a,costAccounted:!1,capturedAt:Ae().capturedAt*1e3,blockOrSeq:null,raw:{fixture:"fixtures/venues.json#venues.arcus",oraclePrice:o.oracle,vol24h:o.vol24h,oi:o.oi,fundingAnnPct:o.fundingAnnPct,category:o.category,isOutsideRth:o.isOutsideRth===!0,rth:o.rth,darkWindowFundingHourly:Vi,initialMarginFraction:o.initialMarginFraction??null,offHoursInitialMarginFraction:o.offHoursInitialMarginFraction??null,reasonCostUnknown:"fees, gas, and impact at size not captured for Arcus perps"}};return s!==null&&(l.raw.oracleFixed=s),Se(l)}function zi({side:e="buy",sizeUsd:t=null}={}){return bC().map(n=>wC({symbol:n,side:e,sizeUsd:t})).filter(n=>n!==null)}var fb=36e5,oB=24*365;function gl(e,t,n=8){if(e==null)throw new TypeError("hourlyFundingRate is required");if(!Number.isFinite(t)||t<0)throw new RangeError("horizonHours must be a nonnegative finite number");if(t===0)return D("0");let r=D(String(t)),o=fe(10000n,0);return xe(xe(e,r),o)}function hb(e,t,n={}){if(e.instrument!=="perp")return{model:"current-funding-held-constant",horizonHours:t,carryBps:D("0"),carryBpsDisplay:"0",confidence:"estimate",note:"spot has no funding carry"};let r=n.nowMs??Date.now(),o=n.applyDarkWindowLock===!0,i=e.fundingHourly;if(o&&i!==null){let a=xC(r,t),c=t-a,l=D(Vi),u=gl(i,c),d=gl(l,a),p=Math.max(u.scale,d.scale),m={mantissa:u.mantissa*10n**BigInt(p-u.scale)+d.mantissa*10n**BigInt(p-d.scale),scale:p};return{model:"current-funding-held-constant",horizonHours:t,carryBps:m,carryBpsDisplay:Me(m),confidence:"estimate",darkHours:a,litHours:c,darkWindowRate:Vi,compounding:"ignored",compoundingErrorBoundNote:"simple sum; at 30d and 1e-5/h the ignored compound is under 0.5bp"}}if(i===null)return{model:"current-funding-held-constant",horizonHours:t,carryBps:null,carryBpsDisplay:null,confidence:"estimate",note:"funding rate unknown"};let s=gl(i,t);return{model:"current-funding-held-constant",horizonHours:t,carryBps:s,carryBpsDisplay:Me(s),confidence:"estimate",compounding:"ignored",compoundingErrorBoundNote:"simple sum; at 30d and 1e-5/h the ignored compound is under 0.5bp"}}function xC(e,t){if(t<=0)return 0;let n=0,r=Math.floor(t);for(let o=0;o<r;o+=1)pl(e+o*fb)&&(n+=1);return t>r&&pl(e+r*fb)&&(n+=t-r),n}function SC(e){return e.mid??e.mark??e.ask??e.bid??null}function kC(e){let t=SC(e);if(t===null)return null;let n=e.costAccounted===!0,r=D("0");e.fees!==null?r=xt(r,e.fees):n=!1,e.priceImpact!==null?r=xt(r,e.priceImpact):e.requestedSize&&e.requestedSize.mantissa>0n&&(n=!1),e.gasEstimate===null?n=!1:r=xt(r,e.gasEstimate);let o;if(e.fees!==null&&St(e.fees,D("1"))<0&&St(e.fees,D("0"))>=0){let i=xt(D("1"),e.fees);o=xe(t,i),e.priceImpact!==null&&(o=xt(o,xe(t,e.priceImpact)))}else o=xt(t,r);return{net:o,costAccounted:n,px:t}}function EC(e,t,n=null){return{venue:e.venue,chain:e.chain,instrument:e.instrument,tier:e.tier,symbol:e.symbol,symbolRaw:e.symbolRaw,side:e.side,price:t.px,net:t.net,costAccounted:t.costAccounted,fundingHourly:e.fundingHourly,carry:n,quote:e}}function vC(e,t){if(!e||!t||!e.costAccounted||!t.costAccounted||e.instrument!==t.instrument||e.net.mantissa===0n)return null;let n=Fr(t.net,e.net);return Ue(xe(n,fe(10000n,0)),t.net,4)}function yl(e,t={}){if(!Array.isArray(e))throw new TypeError("quotes must be an array");let n=t.nowMs??e[0]?.capturedAt??Date.now(),r=e.length,o=e,i=[];if(!t.skipLiveness){let I=Hi(e,{nowMs:n});o=I.survivors,i=I.excluded}let s=e.length,a=[],c=t.horizonHours,l=Number.isFinite(c)&&c>0,u=[];for(let I of o){let R=kC(I);if(R===null)continue;let _=null;if(l&&I.instrument==="perp"&&(_=hb(I,c,{nowMs:n}),_.carryBps!==null)){let E=xt(D("1"),Ue(_.carryBps,fe(10000n,0),12));R.net=xe(R.net,E),R.costAccounted=!1}u.push(EC(I,R,_))}let d=u,p="homogeneous";if(l)p="heterogeneous",d=u;else{let I=u.filter(_=>_.instrument==="spot"),R=u.filter(_=>_.instrument==="perp");I.length>0&&R.length>0?(d=I.length>=R.length?I:R,p="homogeneous"):(d=u,p="homogeneous")}d.sort((I,R)=>{let _=St(I.net,R.net);return _!==0?_:I.venue<R.venue?-1:I.venue>R.venue?1:0});let m=d[0]??null,f=d.slice(1),h=d,g="gross";m&&m.costAccounted&&(f.length===0||f[0].costAccounted)&&(g="net-of-cost");let b=f.length===0?null:vC(m,f[0]),k=u.find(I=>I.tier==="prepare")??null,x=qr(n),w=x==="core"?null:{session:x,warning:x==="dark"?"market is dark; marks are not real price discovery":"extended session; thinner books and higher staleness risk"},v=null;l&&(v=AC(u));let T={rankedOn:g,ranked:h,winner:m,runnersUp:f,improvementBps:b===null?null:Number(Me(b)),sourcesAnswered:s,sourcesTried:r,failed:a,excluded:i,darkWindow:w,instrumentMix:p,bestPreparable:k,carry:m?.carry??null,breakEvenHorizonHours:v};return hl(T)}function AC(e){let t=e.filter(i=>i.instrument==="spot").sort((i,s)=>St(i.net,s.net))[0],n=e.filter(i=>i.instrument==="perp").sort((i,s)=>St(i.net,s.net))[0];if(!t||!n||n.fundingHourly===null)return null;let r=Fr(t.net,n.net);if(r.mantissa===0n)return 0;let o=xe(n.fundingHourly,n.price);if(o.mantissa===0n)return null;try{let i=Ue(r,o,4),s=Number(Me(i));return!Number.isFinite(s)||s<0?null:s}catch{return null}}var IC="rh_uniswap",_C=4663,PC="prepare",CC=1n<<192n,Ln=18,TC=Object.freeze({v3:180000n,v4:240000n});function bl(){return Di()}function NC(e){return{mantissa:e*e*10n**BigInt(Ln)/CC,scale:Ln}}function OC(e){let t=NC(BigInt(e.sqrtPriceX96)),n=e.quote==="USDG"?6:18,r=18;if(e.quoteIsToken0){let o=Ue(xe(t,fe(10n**BigInt(n),0)),fe(10n**BigInt(r),0),Ln);return o.mantissa===0n?null:Ue(D("1"),o,Ln)}return Ue(xe(t,fe(10n**BigInt(r),0)),fe(10n**BigInt(n),0),Ln)}function RC(e){let t=Gy(),n=t.assets[e];return n?fe(n.rawPrice,t.oracleScaleExp):null}function $C(e,t){if(e===null||t===null||e.mantissa<=0n||t.mantissa<=0n)return null;let n={...e};return Ue(t,LC(n,t),Ln)}function LC(e,t){let n=Math.max(e.scale,t.scale);return{mantissa:Dr(e,n).mantissa+Dr(t,n).mantissa,scale:n}}function MC(e){let t=bl(),n=TC[e];return n?{wei:BigInt(t.gasPriceWei)*n,units:n,native:"ETH"}:null}function wl(){return Object.keys(bl().pools).sort()}function Mn({symbol:e,side:t="buy",sizeUsd:n=null}={}){if(typeof e!="string"||e.length===0)throw new TypeError("symbol must be a nonempty string");let r=bl(),o=r.pools[e];if(!o)return null;let i=OC(o);if(i===null)return null;let s=oe(o.liqUsd),a=n===null?D("0"):n,c=o.feePpm===null||o.feePpm===void 0?null:Ue(fe(BigInt(o.feePpm),0),fe(1000000n,0),8),l=a.mantissa===0n?D("0"):$C(s,a),u=MC(o.version),m={venue:IC,chain:_C,instrument:"spot",tier:PC,symbolRaw:e,symbol:e,side:t,requestedSize:a,mid:i,fees:c,gasEstimate:null,priceImpact:l,fundingHourly:null,costAccounted:!1,capturedAt:r.capturedAt*1e3,blockOrSeq:r.block,raw:{fixture:"fixtures/rh_pool_state.json",pair:o.pair,version:o.version,sqrtPriceX96:o.sqrtPriceX96,quote:o.quote,quoteIsToken0:o.quoteIsToken0,liqUsd:o.liqUsd,gasNativeWei:u===null?null:u.wei.toString(),gasUnits:u===null?null:u.units.toString(),impactModel:"constant-product-estimate",notes:["price read live from chain 4663",o.version==="v4"?"v4 fee may be dynamic via hook and was not captured":"v3 fee tier is the pool static fee","gas known in native wei only, no ETH price captured to denominate it"]}},f=RC(e);return f!==null&&(m.referencePrice=f,m.referenceBasisBps=Me(Ue(xe(Fr(i,f),fe(10000n,0)),f,4))),Se(m)}function gb({side:e="buy",sizeUsd:t=null}={}){return wl().map(n=>Mn({symbol:n,side:e,sizeUsd:t})).filter(n=>n!==null)}var yb=12e4,UC="0x0000000000000000000000000000000000000000",BC="0x84b75b19A3cdf8E2F56d0507d22D442847B2053C";function xl(e={}){let{symbol:t,side:n="buy",sizeUsd:r=null,recipient:o,nowMs:i=Date.now()}=e;if(typeof t!="string"||!t)throw new TypeError("symbol is required");if(typeof o!="string"||!/^0x[0-9a-fA-F]{40}$/.test(o))throw new TypeError("recipient must be a 0x-prefixed 20 byte address");let s=Mn({symbol:t,side:n,sizeUsd:r});if(s===null)throw new Error(`no RH Uniswap pool for ${t}`);if(s.tier!=="prepare")throw new Error(`route tier is ${s.tier}, only prepare tier can be prepared`);let a=i-s.capturedAt;if(a>yb)throw new Error(`quote is stale (${a}ms old, bound ${yb}ms); re-quote before preparing`);let l=Di().pools[t],u=l.version==="v4"?BC:UC,d=u,p=n==="buy"?l.quoteAddr:l.token;return Object.freeze({artifactKind:"unsigned-tx",chainId:4663,to:u,data:"0x",value:"0",requiresApproval:{spender:d,token:p,amount:null},requiresWalletSignature:!0,backendSigner:!1,unsigned:!0,houseSigned:!1,quoteRef:{venue:s.venue,symbol:s.symbol,symbolRaw:s.symbolRaw,capturedAt:s.capturedAt,blockOrSeq:s.blockOrSeq,mid:s.mid,version:l.version,pair:l.pair},quoteAgeMs:a,recipient:o,side:n,notes:["prepare-only: user wallet must sign","calldata encoding is deferred; this artifact is the bound intent",l.version==="v4"?"V4 route via PoolManager":"V3 route via SwapRouter (address not yet pinned)"]})}var DC="hyperliquid_hip3",FC="hyperliquid",qC="quote-only";function jr(){return Ae().venues.hyperliquid_hip3}function bb(){return Object.keys(jr().dexs).sort()}function HC(){let e=[];for(let[t,n]of Object.entries(jr().dexs))for(let r of Object.keys(n))e.push(`${t}:${r}`);return e.sort()}function jC(e){if(typeof e!="string"||e.length===0)return[];let t=e.indexOf(":");if(t>0){let r=e.slice(0,t),o=e.slice(t+1),i=jr().dexs[r]?.[o];return i?[{dex:r,ticker:o,market:i}]:[]}let n=[];for(let[r,o]of Object.entries(jr().dexs))Object.hasOwn(o,e)&&n.push({dex:r,ticker:e,market:o[e]});return n}function VC(e,t){try{return Jy().books[`${e}:${t}`]??null}catch{return null}}function zC(e,t,n){if(!e||n===null||n.mantissa<=0n)return null;let r=t==="buy"?e.asks:e.bids;if(!r||r.length===0)return null;let o=Number(Me(n));if(!Number.isFinite(o)||o<=0)return null;let i=0,s=0,a=0;for(let c of r){let l=Number(c.px),u=Number(c.sz);if(!(l>0)||!(u>0))continue;let d=l*u,p=Math.min(o,d),m=p/l;if(i+=p,s+=m,o-=p,a+=1,o<=1e-9)break}return s<=0?null:{vwap:i/s,filledUsd:i,unfilledUsd:Math.max(0,o),levelsUsed:a}}function WC(e,t,n,r){let o=zC(e,t,n);if(!o)return{impact:null,depth:null};let i=Number(Me(r));if(!(i>0))return{impact:null,depth:o};let s=t==="buy"?(o.vwap-i)/i:(i-o.vwap)/i,a=Math.max(0,s);return{impact:oe(Number(a.toPrecision(12))),depth:{...o,impactFraction:a,fullyFilled:o.unfilledUsd<=1e-6}}}function wb({dex:e,ticker:t,market:n,side:r,size:o}){let i=Be(n.mark,`${e}:${t}.mark`),s=oe(n.fundingHourly),a=oe(n.vol24h),c=oe(n.oi),l=o===null?D("0"):o,u=VC(e,t),d=null,p=null,m="fees and gas not captured";if(l.mantissa>0n)if(u){let g=WC(u,r,l,i);d=g.impact,p=g.depth,p?.fullyFilled?m="impact measured from l2Book; fees and gas still not captured":m="book walked but size exceeds visible depth; fees and gas not captured"}else m="no order book depth wired for this coin; fees and gas not captured";else u?m="zero size; fees and gas not captured":m="no order book depth wired for this coin; fees and gas not captured";let h={venue:DC,chain:FC,instrument:"perp",tier:qC,symbolRaw:`${e}:${t}`,symbol:t,side:r,requestedSize:l,mark:i,fees:null,gasEstimate:null,priceImpact:d,fundingHourly:s,costAccounted:!1,capturedAt:Ae().capturedAt*1e3,blockOrSeq:null,raw:{fixture:"fixtures/venues.json#venues.hyperliquid_hip3",dex:e,ticker:t,vol24h:n.vol24h,oi:n.oi,fundingAnnPct:n.fundingAnnPct,maxLev:n.maxLev,reasonCostUnknown:m,hasL2Book:u!==null,l2BookFixture:u?"fixtures/hip3_l2books.json":null,depth:p}};return a!==null&&(h.raw.vol24hFixed=a),c!==null&&(h.raw.oiFixed=c),u?.bids?.[0]&&u?.asks?.[0]&&(h.bid=D(String(u.bids[0].px)),h.ask=D(String(u.asks[0].px))),Se(h)}function xb({symbol:e,side:t="buy",sizeUsd:n=null}={}){let r=jC(e);return r.length===0||r.length>1?null:wb({...r[0],side:t,size:n})}function Wi({side:e="buy",sizeUsd:t=null,ticker:n=null}={}){let r=[];for(let o of HC()){let[i,s]=o.split(":");if(n!==null&&s!==n)continue;let a=jr().dexs[i][s];r.push(wb({dex:i,ticker:s,market:a,side:e,size:t}))}return r}var GC="arcus_spot",KC="robinhood-4663",YC="quote-only";function Sb(){return Ae().venues.arcus_spot}function XC(){return Object.keys(Sb().pairs).sort()}function QC({symbol:e,side:t="buy",sizeUsd:n=null}={}){if(typeof e!="string"||e.length===0)return null;let r=Sb().pairs[e];if(!r)return null;let o=r.bid===void 0||r.bid===null?null:Be(r.bid,`${e}.bid`),i=r.ask===void 0||r.ask===null?null:Be(r.ask,`${e}.ask`),s=oe(r.last),a=null;if(o!==null&&i!==null){a={mantissa:o.mantissa+i.mantissa,scale:o.scale===i.scale?o.scale+1:Math.max(o.scale,i.scale)+1};let d=Math.max(o.scale,i.scale),p=o.scale===d?o.mantissa:o.mantissa*10n**BigInt(d-o.scale),m=i.scale===d?i.mantissa:i.mantissa*10n**BigInt(d-i.scale);a={mantissa:p+m,scale:d+1},a={mantissa:(p+m)/2n,scale:d}}else s!==null&&(a=s);if(o===null&&i===null&&a===null)return null;let c=n===null?D("0"):n,l=D("0"),u={venue:GC,chain:KC,instrument:"spot",tier:YC,symbolRaw:e,symbol:e,side:t,requestedSize:c,fees:l,gasEstimate:null,priceImpact:null,fundingHourly:null,costAccounted:!1,capturedAt:Ae().capturedAt*1e3,blockOrSeq:null,raw:{fixture:"fixtures/venues.json#venues.arcus_spot",last:r.last,bid:r.bid,ask:r.ask,vol24h:r.vol24h,feeKnownZero:!0,reasonCostUnknown:"gas and impact at size not captured; fee is a known zero"}};return o!==null&&(u.bid=o),i!==null&&(u.ask=i),a!==null&&(u.mid=a),Se(u)}function Gi({side:e="buy",sizeUsd:t=null}={}){return XC().map(n=>QC({symbol:n,side:e,sizeUsd:t})).filter(n=>n!==null)}var JC="solana_xstocks",ZC="solana",eT="quote-only",kb=25e3;function Ki(){return Xy()}function Sl(){return Object.keys(Ki().tokens).sort()}function tT(e){let t=Ki().pairs[e];return!t||t.length===0?null:[...t].sort((n,r)=>(r.liquidityUsd??0)-(n.liquidityUsd??0))[0]}function nT(e,t){if(e===null||t===null)return null;if(e.mantissa<=0n||t.mantissa<=0n)return D("0");let n=Math.max(e.scale,t.scale),r=e.scale===n?e.mantissa:e.mantissa*10n**BigInt(n-e.scale),o=t.scale===n?t.mantissa:t.mantissa*10n**BigInt(n-t.scale),i=o*10n**6n,s=r+o;return{mantissa:i/s,scale:6}}function kl({symbol:e,side:t="buy",sizeUsd:n=null}={}){if(typeof e!="string"||e.length===0)return null;let r=e,o=e,i=Ki().tokens;if(Object.hasOwn(i,e))r=e,o=i[e].symbolRaw;else if(e.endsWith("x")||e.endsWith("X")){let f=e.slice(0,-1).toUpperCase();if(Object.hasOwn(i,f))r=f,o=i[f].symbolRaw;else return null}else return null;let s=i[r],a=tT(r);if(!s||!a)return null;let c=Be(a.priceUsd,`${r}.priceUsd`),l=oe(a.liquidityUsd),u=n===null?D("0"):n,d=u.mantissa===0n?D("0"):nT(l,u),p=!1;u.mantissa===0n&&(a.liquidityUsd??0)>=kb&&(p=!1);let m={venue:JC,chain:ZC,instrument:"spot",tier:eT,symbolRaw:o,symbol:r,side:t,requestedSize:u,mid:c,fees:null,gasEstimate:null,priceImpact:d,fundingHourly:null,costAccounted:p,capturedAt:Ki().capturedAt*1e3,blockOrSeq:null,raw:{fixture:"fixtures/solana_xstocks.json",mint:s.mint,pairAddress:a.pairAddress,dexId:a.dexId,quote:a.quote,liquidityUsd:a.liquidityUsd,volume24h:a.volume24h,priceUsd:a.priceUsd,source:"dexscreener",approximate:!0,reasonCostUnknown:"DexScreener liquidity.usd is a third-party float; fees and SOL gas not captured; impact is modeled",thin:(a.liquidityUsd??0)<kb}};return Se(m)}function Eb({side:e="buy",sizeUsd:t=null}={}){return Sl().map(n=>kl({symbol:n,side:e,sizeUsd:t})).filter(n=>n!==null)}var rT="ton_stonfi",oT="ton",iT="quote-only",sT=25e3,aT=.01;function Yi(){return Qy()}function El(){return Object.keys(Yi().tokens).sort()}function cT(e){let t=Yi().pairs[e];return!t||t.length===0?null:[...t].sort((n,r)=>(r.liquidityUsd??0)-(n.liquidityUsd??0))[0]}function lT(e,t){if(e===null||t===null)return null;if(e.mantissa<=0n||t.mantissa<=0n)return D("0");let n=Math.max(e.scale,t.scale),r=e.scale===n?e.mantissa:e.mantissa*10n**BigInt(n-e.scale),o=t.scale===n?t.mantissa:t.mantissa*10n**BigInt(n-t.scale),i=o*10n**6n,s=r+o;return{mantissa:i/s,scale:6}}function vl({symbol:e,side:t="buy",sizeUsd:n=null}={}){if(typeof e!="string"||e.length===0)return null;let r=e,o=e,i=Yi().tokens;if(Object.hasOwn(i,e))r=e,o=i[e].symbolRaw;else if(e.endsWith("x")||e.endsWith("X")){let f=e.slice(0,-1).toUpperCase();if(Object.hasOwn(i,f))r=f,o=i[f].symbolRaw;else return null}else{let f=e.toUpperCase();if(Object.hasOwn(i,f))r=f,o=i[f].symbolRaw;else return null}let s=i[r],a=cT(r);if(!s||!a)return null;let c=Be(a.priceUsd,`${r}.priceUsd`),l=oe(a.liquidityUsd),u=n===null?D("0"):n,d=u.mantissa===0n?D("0"):lT(l,u),m={venue:rT,chain:oT,instrument:"spot",tier:iT,symbolRaw:o,symbol:r,side:t,requestedSize:u,mid:c,fees:null,gasEstimate:null,priceImpact:d,fundingHourly:null,costAccounted:!1,capturedAt:Yi().capturedAt*1e3,blockOrSeq:null,raw:{fixture:"fixtures/ton_xstocks.json",mint:s.mint,pairAddress:a.pairAddress,dexId:a.dexId,quote:a.quote,liquidityUsd:a.liquidityUsd,volume24h:a.volume24h,priceUsd:a.priceUsd,source:"dexscreener",approximate:!0,reasonCostUnknown:"DexScreener liquidity.usd is a third-party float; fees and TON gas not captured; impact is modeled; TON books are thin",thin:(a.liquidityUsd??0)<sT,impactSizeFractionHint:aT}};return Se(m)}function vb({side:e="buy",sizeUsd:t=null}={}){return El().map(n=>vl({symbol:n,side:e,sizeUsd:t})).filter(n=>n!==null)}var Ab=3600*1e3;function Al(e){return e==null||e===""?null:typeof e=="object"&&e&&typeof e.mantissa=="bigint"?e:D(String(e))}function Ib(e,{sizeUsd:t=null}={}){if(typeof e!="string"||!e.trim())throw new TypeError("ticker is required");let n=e.trim().toUpperCase(),r=Al(t),o=[],i=xb({symbol:`xyz:${n}`,sizeUsd:r});if(i)o.push(i);else for(let l of Wi({ticker:n,sizeUsd:r}))o.push(l);for(let l of zi({sizeUsd:r}))l.symbol===n&&o.push(l);for(let l of Gi({sizeUsd:r}))l.symbol===n&&o.push(l);let s=Mn({symbol:n,sizeUsd:r});s&&o.push(s);let a=kl({symbol:n,sizeUsd:r});a&&o.push(a);let c=vl({symbol:n,sizeUsd:r});return c&&o.push(c),o}function uT(e={}){let t=String(e.ticker||e.symbol||"").trim().toUpperCase();if(!t)throw new Error("bestEquityRoute requires ticker");let n=Al(e.sizeUsd??e.size??null),r=Ib(t,{sizeUsd:n});if(r.length===0)return{ticker:t,rankedOn:"gross",ranked:[],winner:null,runnersUp:[],improvementBps:null,sourcesAnswered:0,sourcesTried:0,failed:[],excluded:[],bestPreparable:null,instrumentMix:"homogeneous",note:"no venue answered for this ticker in the pinned fixture capture"};let o=r[0].capturedAt,i=String(o).length<=10?o*1e3:o,s=e.nowMs==null,a=e.nowMs??o+1e3,c=Math.max(0,Date.now()-i),l=yl(r,{nowMs:a,horizonHours:e.horizonHours!=null?Number(e.horizonHours):void 0,skipLiveness:e.skipLiveness===!0});return{ticker:t,...l,dataSource:s?"fixture":"caller-clock",capturedAt:i,ageMs:c,stale:c>Ab}}function dT(){let e=[{venue:"hyperliquid_hip3",tier:"quote-only",chain:"hyperliquid",n:Wi().length},{venue:"arcus_perp",tier:"quote-only",chain:"robinhood-4663",n:zi().length},{venue:"arcus_spot",tier:"quote-only",chain:"robinhood-4663",n:Gi().length},{venue:"rh_uniswap",tier:"prepare",chain:4663,n:wl().length},{venue:"solana_xstocks",tier:"quote-only",chain:"solana",n:Sl().length},{venue:"ton_stonfi",tier:"quote-only",chain:"ton",n:El().length}],t=[...Wi(),...zi(),...Gi(),...gb(),...Eb(),...vb()],n=(t[0]?.capturedAt??Date.now())+1e3,{survivors:r,excluded:o}=Hi(t,{nowMs:n});return{inventory:e,hip3Dexs:bb(),liveness:{survivors:r.length,excluded:o.length,byReason:o.reduce((i,s)=>(i[s.reason]=(i[s.reason]??0)+1,i),{})},capturedAt:Ae().capturedAt,custody:"prepare-only",note:"quote-only venues are ranked for discovery; only rh_uniswap is preparable in v1"}}function pT(e={}){let t=String(e.ticker||e.symbol||"").trim().toUpperCase(),n=e.recipient||e.taker;if(!t)throw new Error("prepareEquityRoute requires ticker");if(!n)throw new Error("prepareEquityRoute requires recipient (signing wallet)");let r=Al(e.sizeUsd??e.size??null),o=Mn({symbol:t,sizeUsd:r});if(!o)return{ok:!1,failureKind:"no-prepare-path",ticker:t,note:"no RH Uniswap prepare-tier route for this ticker in fixtures"};try{let i=String(o.capturedAt).length<=10?o.capturedAt*1e3:o.capturedAt,s=e.nowMs!=null,a=s?Number(e.nowMs):Date.now(),c=Math.max(0,Date.now()-i),l=xl({symbol:t,sizeUsd:r,recipient:n,nowMs:a});return{ok:!0,ticker:t,artifact:l,bestPreparableVenue:"rh_uniswap",dataSource:s?"caller-clock":"live-clock",capturedAt:i,ageMs:c,stale:c>Ab}}catch(i){return{ok:!1,failureKind:"prepare-refused",ticker:t,error:String(i.message||i)}}}function mT(e){return JSON.parse(JSON.stringify(e,(t,n)=>typeof n=="bigint"?n.toString():n))}var ue=Object.freeze({SAFE:"SAFE",CAUTION:"CAUTION",HONEYPOT:"HONEYPOT",UNKNOWN:"UNKNOWN"}),fT=5e3,hT=1500;function gT(e,t){return t===0n?null:Number((t-e)*10000n/t)}function yT(e,t){if(e==null||e==="")throw new Error(`sell-sim: ${t} required`);if(typeof e=="bigint")return e;let n=String(e).trim();if(!/^\d+$/.test(n))throw new Error(`sell-sim: ${t} must be an integer base-unit amount`);return BigInt(n)}async function Cb(e={},t={}){let{token:n,base:r,chainId:o=null}=e;if(!n)throw new Error("sell-sim: token required");if(!r)throw new Error("sell-sim: base asset required");if(typeof t.quote!="function")throw new Error("sell-sim: opts.quote function required");let i=yT(e.amountIn,"amountIn"),s;try{s=await t.quote({chainId:o,inputMint:r,outputMint:n,amount:i.toString(),side:"buy"})}catch(p){return vt(ue.UNKNOWN,`buy leg could not be quoted: ${Pb(p)}`,{chainId:o,token:n,base:r})}let a=_b(s?.outAmount);if(a==null||a===0n)return vt(ue.UNKNOWN,"buy leg returned no output \u2014 no route or no liquidity",{chainId:o,token:n,base:r});let c;try{c=await t.quote({chainId:o,inputMint:n,outputMint:r,amount:a.toString(),side:"sell"})}catch(p){return vt(ue.HONEYPOT,`buy routes but the SELL leg fails to quote (${Pb(p)}) \u2014 you would not be able to exit`,{chainId:o,token:n,base:r,tokensOut:a.toString()})}let l=_b(c?.outAmount);if(l==null||l===0n)return vt(ue.HONEYPOT,"sell leg returns zero \u2014 the position cannot be exited for value",{chainId:o,token:n,base:r,tokensOut:a.toString()});let u=gT(l,i),d={chainId:o,token:n,base:r,amountIn:i.toString(),tokensOut:a.toString(),roundTripOut:l.toString(),roundTripLossBps:u};return u==null?vt(ue.UNKNOWN,"could not compute round-trip loss",d):u>=fT?vt(ue.HONEYPOT,`round trip loses ${(u/100).toFixed(1)}% \u2014 a sell tax or rigged curve, not normal slippage`,d):u>=hT?vt(ue.CAUTION,`round trip loses ${(u/100).toFixed(1)}% \u2014 high tax or thin liquidity`,d):vt(ue.SAFE,`round trip loses ${(u/100).toFixed(1)}% \u2014 exit path looks normal`,d)}function vt(e,t,n){return{status:e,safe:e===ue.SAFE,tradable:e===ue.SAFE||e===ue.CAUTION,reason:t,...n}}function _b(e){if(e==null)return null;try{let t=String(e).trim();return/^\d+$/.test(t)?BigInt(t):null}catch{return null}}function Pb(e){return String(e?.message||e).slice(0,120)}async function bT(e={},t={}){let n=await Cb(e,t);if(!(n.status===ue.SAFE||n.status===ue.CAUTION&&t.allowCaution!==!1||n.status===ue.UNKNOWN&&t.allowUnknown===!0)){let o=new Error(`sell-sim ${n.status}: ${n.reason}`);throw o.sellSim=n,o}return n}var At=Object.freeze({ALERT_ONLY:"alert_only",EXECUTE:"execute"}),wT=new Set(["watch","watch this","ping","ping me","alert","notify"]),xT=new Set(["watching","armed"]);function Tb(e){if(typeof e!="string"||!e.trim())throw new TypeError("explicit action verb required");let t=e.trim().toLowerCase().replace(/\s+/g," ");if(wT.has(t))return At.ALERT_ONLY;if(t==="arm")return At.EXECUTE;throw new TypeError(`unsupported action verb: ${t}`)}function ST(e={}){let{verb:t,...n}=e;return{...n,active:!0,actionMode:Tb(t)}}function kT(e){if(!e||typeof e!="object"||typeof e.active!="boolean")throw new TypeError("active must be boolean");if(!Object.values(At).includes(e.actionMode))throw new TypeError("actionMode must be alert_only or execute");return e}function ET(e){return e?.active===!0&&e?.actionMode===At.ALERT_ONLY}function vT(e){return e?.active===!0&&e?.actionMode===At.EXECUTE}function AT(e={}){if(e.actionMode!==void 0&&e.actionMode!==At.ALERT_ONLY)throw new TypeError("non-alert record cannot enter alert-only watch migration");let t=typeof e.active=="boolean"?e.active:xT.has(String(e.status||"").toLowerCase());return{...e,active:t,actionMode:At.ALERT_ONLY}}import{createHash as IT}from"node:crypto";var Il=1,Nb=Object.freeze(["chainId","agentAddress","accountAddress","actions","targets","maxValueWei","maxGasWei","maxSlippageBps","expiresAt","nonce","revocationKey"]),_T=Object.freeze(["read","simulate"]),Ob=1e4,Rb=1440*60,$b=128,Lb=256,Mb=64,Ub=256,Bb=/^0x[0-9a-fA-F]{40}$/,PT=/^[a-z][a-z0-9_-]*:[a-z0-9._-]+$/,CT=/^[a-z][a-z0-9_-]*:\*$/,TT=/^[A-Za-z0-9._:-]+$/,NT=/^[A-Za-z0-9._:-]+$/,Db=/^(0|[1-9][0-9]*)$/,Vr=class extends Error{constructor(t){let n=t.map(r=>`${r.field}: ${r.message}`);super(`invalid grant (${t.length} error${t.length===1?"":"s"}): ${n.join("; ")}`),this.name="GrantValidationError",this.errors=t}};function OT(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function RT(e){if(typeof e=="bigint")return e>=0n?e.toString(10):null;if(typeof e=="number")return!Number.isSafeInteger(e)||e<0?null:String(e);if(typeof e=="string"){let t=e.trim();return Db.test(t)?t:null}return null}function Un(e){if(typeof e=="bigint")return e<0n||e>BigInt(Number.MAX_SAFE_INTEGER)?null:Number(e);if(typeof e=="number")return!Number.isSafeInteger(e)||e<0?null:e;if(typeof e=="string"){let t=e.trim();if(!Db.test(t))return null;let n=Number(t);return Number.isSafeInteger(n)?n:null}return null}function Fb(e){let t=String(e).split(":")[0];return _T.includes(t)}function qb(e,t={}){let n=[],r=(d,p)=>n.push({field:d,message:p});if(!OT(e))return r("grant","grant must be a plain object"),{ok:!1,errors:n,grant:null};for(let d of Object.keys(e))Nb.includes(d)||r(d,"unknown field is not allowed");for(let d of Nb)(!(d in e)||e[d]==null)&&r(d,"required field is missing");if(n.length)return{ok:!1,errors:n,grant:null};let o={},i=Un(e.chainId);i==null||i<=0?r("chainId","must be a positive integer chain id"):o.chainId=i;for(let d of["agentAddress","accountAddress"]){let p=e[d];typeof p!="string"||!Bb.test(p.trim())?r(d,"must be a 0x-prefixed 20-byte hex address"):o[d]=p.trim().toLowerCase()}if(!Array.isArray(e.actions)||e.actions.length===0)r("actions","must be a non-empty array of action scopes");else if(e.actions.length>Mb)r("actions",`too many actions (max ${Mb})`);else{let d=[];for(let p of e.actions){let m=typeof p=="string"?p.trim():null;if(!m){r("actions","action entries must be non-empty strings");continue}if(m.includes("*")){t.allowWildcardActions===!0&&CT.test(m)?d.push(m):r("actions",`broad wildcard action "${m}" is rejected (fail closed)`);continue}if(!PT.test(m)){r("actions",`malformed action "${m}" (expected verb:resource)`);continue}d.push(m)}o.actions=[...new Set(d)].sort()}if(!Array.isArray(e.targets))r("targets","must be an array of contract addresses");else if(e.targets.length>Ub)r("targets",`too many targets (max ${Ub})`);else{let d=[];for(let p of e.targets){let m=typeof p=="string"?p.trim():null;if(!m||!Bb.test(m)){r("targets",`target "${p}" must be a 0x-prefixed 20-byte hex address (wildcards not allowed)`);continue}d.push(m.toLowerCase())}if(o.targets=[...new Set(d)].sort(),o.targets.length===0&&Array.isArray(o.actions)){let p=o.actions.filter(m=>!Fb(m));(p.length>0||o.actions.length===0)&&r("targets",`empty targets are only allowed for read/simulate scopes (blocked by: ${p.join(", ")||"no valid actions"})`)}}for(let d of["maxValueWei","maxGasWei"]){let p=RT(e[d]);p==null?r(d,"must be a non-negative integer wei amount"):o[d]=p}let s=Un(e.maxSlippageBps);s==null||s>Ob?r("maxSlippageBps",`must be an integer between 0 and ${Ob}`):o.maxSlippageBps=s;let a=864e10,c=Un(e.expiresAt);if(c==null||c<=0)r("expiresAt","must be a positive unix-seconds timestamp");else if(c>a)r("expiresAt","exceeds the max unix-seconds timestamp (pass seconds, not milliseconds)");else if(o.expiresAt=c,t.now!=null){let d=Un(t.now);d==null?r("expiresAt","opts.now must be a unix-seconds integer"):c<=d?r("expiresAt",`grant is expired (expiresAt ${c} <= now ${d})`):c-d>Rb&&r("expiresAt",`grant exceeds the hard 24-hour TTL (${Rb} seconds)`)}let l=typeof e.nonce=="string"?e.nonce.trim():Un(e.nonce)!=null?String(Un(e.nonce)):null;!l||l.length>$b||!TT.test(l)?r("nonce",`must be a non-empty string (max ${$b} chars, [A-Za-z0-9._:-])`):o.nonce=l;let u=typeof e.revocationKey=="string"?e.revocationKey.trim():null;return!u||u.length>Lb||!NT.test(u)?r("revocationKey",`must be a non-empty public identifier (max ${Lb} chars, [A-Za-z0-9._:-])`):o.revocationKey=u,n.length?{ok:!1,errors:n,grant:null}:{ok:!0,errors:[],grant:o}}function _l(e,t={}){let{ok:n,errors:r,grant:o}=qb(e,t);if(!n)throw new Vr(r);return o}function Pl(e,t={}){let n=_l(e,t),o=Object.keys(n).sort().map(i=>`${JSON.stringify(i)}:${JSON.stringify(n[i])}`);return`{"version":${Il},${o.join(",")}}`}function Hb(e,t={}){return IT("sha256").update(Pl(e,t),"utf8").digest("hex")}var jb=new Set(["read:markets","read:nfts","read:positions","watch:contracts","prepare:trade","prepare:mint","prepare:build","build:factory","agent:shadow","agent:execute"]),$T="agent:execute",LT="build:factory",Vb=["read:markets","read:nfts","read:positions","watch:contracts","prepare:trade","prepare:mint","prepare:build","agent:shadow"];function MT(e){let t=Array.isArray(e)&&e.length?e:Vb,n=[...new Set(t.map(o=>String(o).trim()).filter(Boolean))],r=n.filter(o=>!jb.has(o));if(r.length)throw new Error(`Invalid scope: ${r.join(", ")}`);return n}var zb=Object.freeze([{id:"oracle",label:"Oracle Native",kind:"oracle",bins:["oracle"],website:!0,detect:!0},{id:"hermes",label:"Hermes Agent",kind:"mcp",bins:["hermes"],mcpTarget:"generic",configKey:"hermes",website:!0,detect:!0},{id:"claude",label:"Claude Code",kind:"mcp",bins:["claude"],mcpTarget:"claude-code",configKey:"claudeCode",website:!0,detect:!0},{id:"claude-desktop",label:"Claude Desktop",kind:"mcp",bins:[],mcpTarget:"claude-desktop",configKey:"claudeDesktop",website:!0,detect:!1},{id:"chatgpt",label:"ChatGPT",kind:"mcp",bins:[],mcpTarget:"chatgpt",configKey:"chatgpt",website:!0,detect:!1},{id:"codex",label:"OpenAI Codex",kind:"mcp",bins:["codex"],mcpTarget:"codex",configKey:"codex",website:!0,detect:!0},{id:"cursor",label:"Cursor",kind:"mcp",bins:["cursor","cursor-agent"],mcpTarget:"cursor",configKey:"cursor",website:!0,detect:!0},{id:"windsurf",label:"Windsurf",kind:"mcp",bins:["windsurf"],mcpTarget:"vscode",configKey:"windsurf",website:!0,detect:!0},{id:"vscode",label:"VS Code / Copilot",kind:"mcp",bins:["code","code-insiders"],mcpTarget:"vscode",configKey:"vscode",website:!0,detect:!0},{id:"openclaw",label:"OpenClaw",kind:"mcp",bins:["openclaw","claw"],mcpTarget:"generic",configKey:"openclaw",website:!0,detect:!0},{id:"perplexity",label:"Perplexity",kind:"mcp",bins:["perplexity","pplx"],mcpTarget:"generic",configKey:"perplexity",website:!0,detect:!0},{id:"manus",label:"Manus",kind:"mcp",bins:["manus"],mcpTarget:"generic",configKey:"manus",website:!0,detect:!0},{id:"prime",label:"Prime Intellect Agent",kind:"mcp",bins:["prime-agent","prime"],mcpTarget:"generic",configKey:"prime",website:!1,detect:!0},{id:"opencode",label:"OpenCode",kind:"mcp",bins:["opencode"],mcpTarget:"generic",configKey:"opencode",website:!1,detect:!0},{id:"aider",label:"Aider",kind:"mcp",bins:["aider"],mcpTarget:"generic",configKey:"aider",website:!1,detect:!0},{id:"continue",label:"Continue",kind:"mcp",bins:["continue"],mcpTarget:"vscode",configKey:"continue",website:!1,detect:!0},{id:"goose",label:"Goose",kind:"mcp",bins:["goose"],mcpTarget:"generic",configKey:"goose",website:!1,detect:!0},{id:"amp",label:"Amp",kind:"mcp",bins:["amp"],mcpTarget:"generic",configKey:"amp",website:!1,detect:!0},{id:"generic",label:"Generic MCP",kind:"mcp",bins:[],mcpTarget:"generic",configKey:"genericMcp",website:!0,detect:!1}]);function Wb(){return zb.filter(e=>e.website)}var UT="@oracle-agent/oracle",BT="npx",DT=["-y","--package",UT,"oracle-data-mcp"],Kb=/(?:^|_)(?:PRIVATE_KEY|SECRET|TOKEN|PASSWORD|PASSPHRASE|MNEMONIC|SEED)(?:_|$)/i;function Tl(e,t){if(typeof e!="string"||!e.trim())throw new TypeError(`${t} must be a non-empty string`);if(/\r|\n|\0/.test(e))throw new TypeError(`${t} must be a single-line string`);return e.trim()}function FT(e){let t=Tl(e,"url"),n;try{n=new URL(t)}catch{throw new TypeError("url must be a valid http(s) URL")}if(!/^https?:$/.test(n.protocol)||n.username||n.password)throw new TypeError("url must be a credential-free http(s) URL");for(let r of n.searchParams.keys())if(Kb.test(r)||/^(?:key|api[_-]?key|auth)$/i.test(r))throw new TypeError(`url must not contain secret-shaped query parameter: ${r}`);return n.href}function qT(e){let t=Tl(e,"key");if(/^[A-Z][A-Z0-9_]*\s*=/.test(t)||/-----BEGIN [A-Z ]*PRIVATE KEY-----/.test(t))throw new TypeError("key must be an Oracle agent key, not an environment assignment or private key");if(/^(?:0x)?[0-9a-f]{64}$/i.test(t)||t.trim().split(/\s+/).length>=12)throw new TypeError("key looks like private signing material");return t}function HT(e){let t=Tl(e,"label");if(!/^[a-z0-9][a-z0-9_-]{0,62}$/i.test(t))throw new TypeError("label must contain only letters, digits, underscores, and hyphens");if(Kb.test(t))throw new TypeError("label must not be a secret-shaped environment name");return t}function Ie(e){return`${JSON.stringify(e,null,2)}
|
|
58
|
+
}`;function Q_(e={}){let t=e.chainIds??(e.chainId!=null?[e.chainId]:null),n=(Array.isArray(t)?t:[t??1]).map(Number).filter(r=>Number.isInteger(r)&&r>0);if(!n.length)throw new Error("aave-v3: chainIds must contain at least one chain id");return[...new Set(n)]}async function M0(e={},t={}){let n={chainIds:Q_(e)};return e.user&&(n.user=String(e.user)),{markets:(await Ci(K_,{request:n},t))?.data?.markets??[]}}async function U0(e={},t={}){let n=String(e.address||e.market||e.marketAddress||"").trim();if(!/^0x[0-9a-fA-F]{40}$/.test(n))throw new Error("aave-v3: marketReserves requires an EVM market (pool) address");let r=Number(e.chainId??1);if(!Number.isInteger(r)||r<=0)throw new Error("aave-v3: chainId must be a positive integer");let o={address:n,chainId:r};e.user&&(o.user=String(e.user));let s=(await Ci(Y_,{request:o},t))?.data?.market??null;if(!s)throw new Error(`aave-v3: no market at ${n} on chain ${r}`);return{market:s}}async function B0(e={},t={}){let n=new Set(["MAINNET_ONLY","TESTNET_ONLY","ALL"]),r=String(e.filter||"MAINNET_ONLY").toUpperCase();if(!n.has(r))throw new Error(`aave-v3: filter must be one of ${[...n].join(", ")}`);return{chains:(await Ci(X_,{filter:r},t))?.data?.chains??[]}}async function D0(e={}){return{ok:(await Ci("query { health }",{},e))?.data?.health===!0,provider:"aave-v3"}}N();var Z_="https://staking-api.babylonlabs.io";function Tc(e={}){return String(e.baseUrl||process.env.BABYLON_STAKING_API_URL||Z_).replace(/\/$/,"")}function Ti(e,t={}){return y(`${Tc(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3,headers:{Accept:"application/json"}})}function F0(e,t="pkHex"){let n=String(e||"").trim().toLowerCase().replace(/^0x/,"");if(!/^[0-9a-f]+$/.test(n))throw new Error(`babylon-staking: ${t} must be hex`);if(n.length===66&&(n.startsWith("02")||n.startsWith("03")))return n.slice(2);if(n.length!==64)throw new Error(`babylon-staking: ${t} must be a 64-char x-only (or 66-char compressed) BTC public key`);return n}async function q0(e={}){try{let n=(await Ti("/v2/stats",e))?.data||{},r=Number(n.active_tvl??0);return{ok:Number.isFinite(r)&&r>0,provider:"babylon-staking",baseUrl:Tc(e),activeTvlSats:String(n.active_tvl??""),activeFinalityProviders:n.active_finality_providers??null,exec:!1}}catch(t){return{ok:!1,provider:"babylon-staking",baseUrl:Tc(e),error:String(t?.message||t),exec:!1}}}async function H0(e={},t={}){let r=(await Ti("/v2/stats",t))?.data||{};return{provider:"babylon-staking",activeTvlSats:String(r.active_tvl??""),totalActiveTvlSats:String(r.total_active_tvl??""),activeDelegations:r.active_delegations??null,totalActiveDelegations:r.total_active_delegations??null,activeFinalityProviders:r.active_finality_providers??null,totalFinalityProviders:r.total_finality_providers??null,btcStakingApr:r.btc_staking_apr??null,btcStakingAprPct:r.btc_staking_apr==null?null:Number(r.btc_staking_apr)*100,maxStakingApr:r.max_staking_apr??null,maxStakingAprPct:r.max_staking_apr==null?null:Number(r.max_staking_apr)*100,raw:r}}async function j0(e={},t={}){let n=await Ti("/v2/finality-providers",t),r=Array.isArray(n?.data)?n.data:[];if(e.state){let i=String(e.state).trim().toUpperCase();r=r.filter(s=>String(s.state||"").toUpperCase().includes(i))}if(e.btcPk){let i=F0(e.btcPk,"btcPk");r=r.filter(s=>String(s.btc_pk||"").toLowerCase()===i)}let o=Math.min(500,Math.max(1,Number(e.limit||r.length||1)));return{provider:"babylon-staking",count:r.length,finalityProviders:r.slice(0,o).map(i=>({btcPk:i.btc_pk??null,moniker:i.description?.moniker??null,website:i.description?.website??null,state:i.state??null,commission:i.commission??null,activeTvlSats:i.active_tvl==null?null:String(i.active_tvl),activeDelegations:i.active_delegations??null}))}}async function V0(e={},t={}){let n=F0(e.stakerPkHex||e.stakerPk||e.pkHex||e.pk,"stakerPkHex"),r=new URLSearchParams({staker_pk_hex:n});e.paginationKey&&r.set("pagination_key",String(e.paginationKey));let o=await Ti(`/v2/delegations?${r}`,t),i=Array.isArray(o?.data)?o.data:[],s=i.reduce((a,c)=>a+Number(c.delegation_staking?.staking_amount??c.staking_amount??0),0);return{provider:"babylon-staking",stakerPkHex:n,count:i.length,totalStakedSats:String(s),nextKey:o?.pagination?.next_key||null,delegations:i.map(a=>({stakingTxHashHex:a.delegation_staking?.staking_tx_hash_hex??a.staking_tx_hash_hex??null,state:a.state??null,stakingAmountSats:a.delegation_staking?.staking_amount==null&&a.staking_amount==null?null:String(a.delegation_staking?.staking_amount??a.staking_amount),stakingTimelock:a.delegation_staking?.staking_timelock??null,startHeight:a.delegation_staking?.start_height??null,finalityProviderBtcPks:a.finality_provider_btc_pks_hex??null})),raw:i}}N();var t1="https://markets.bisq.network";function Nc(e={}){return String(e.baseUrl||process.env.BISQ_MARKETS_URL||t1).replace(/\/$/,"")}function z0(e,t="market"){let n=String(e||"").trim().toLowerCase().replace(/[/\-\s]/g,"_");if(!/^[a-z0-9]{2,12}_[a-z0-9]{2,12}$/.test(n))throw new Error(`bisq-markets: ${t} must look like btc_usd (got "${e}")`);return n}function Ni(e,t={}){return y(`${Nc(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function W0(e={}){try{let t=await Ni("/api/markets",e),n=t&&typeof t=="object"?Object.keys(t).length:0;return{ok:n>0,provider:"bisq-markets",baseUrl:Nc(e),marketCount:n,exec:!1}}catch(t){return{ok:!1,provider:"bisq-markets",baseUrl:Nc(e),error:String(t?.message||t),exec:!1}}}async function G0(e={},t={}){let n=await Ni("/api/markets",t),r=Object.values(n&&typeof n=="object"?n:{});if(e.base){let o=String(e.base).trim().toLowerCase();r=r.filter(i=>String(i.lsymbol||"").toLowerCase()===o)}if(e.quote){let o=String(e.quote).trim().toLowerCase();r=r.filter(i=>String(i.rsymbol||"").toLowerCase()===o)}return{provider:"bisq-markets",count:r.length,markets:r.map(o=>({pair:o.pair??null,name:o.name??null,base:o.lsymbol??null,baseName:o.lname??null,quote:o.rsymbol??null,quoteName:o.rname??null,baseType:o.ltype??null,quoteType:o.rtype??null}))}}async function K0(e={},t={}){let n=z0(e.market||e.pair||"btc_usd","market"),r=await Ni(`/api/ticker?market=${encodeURIComponent(n)}`,t),o=Array.isArray(r)?r[0]||{}:r||{};return{provider:"bisq-markets",market:n,last:o.last==null?null:Number(o.last),high:o.high==null?null:Number(o.high),low:o.low==null?null:Number(o.low),bid:o.buy==null?null:Number(o.buy),ask:o.sell==null?null:Number(o.sell),volumeBase:o.volume_left==null?null:Number(o.volume_left),volumeQuote:o.volume_right==null?null:Number(o.volume_right),note:"Bisq is thin, non-KYC P2P \u2014 treat as a basis signal against centralized spot, not a reference rate",raw:o}}async function Y0(e={},t={}){let n=z0(e.market||e.pair||"btc_usd","market"),r=Math.min(2e3,Math.max(1,Number(e.limit||50))),o=new URLSearchParams({market:n,limit:String(r)});e.timestampFrom&&o.set("timestamp_from",String(e.timestampFrom)),e.timestampTo&&o.set("timestamp_to",String(e.timestampTo));let i=await Ni(`/api/trades?${o}`,t),s=Array.isArray(i)?i:[],a=s.length?Number(s[0].trade_date||0):null,c=s.reduce((l,u)=>l+Number(u.amount||0),0);return{provider:"bisq-markets",market:n,count:s.length,latestTradeAt:a?new Date(a).toISOString():null,latestTradeAgeHours:a?Math.round((Date.now()-a)/36e5*10)/10:null,volumeBase:c,trades:s.slice(0,r).map(l=>({price:l.price==null?null:Number(l.price),amount:l.amount==null?null:Number(l.amount),volume:l.volume==null?null:Number(l.volume),paymentMethod:l.payment_method??null,tradeDate:l.trade_date??null,tradeAt:l.trade_date?new Date(Number(l.trade_date)).toISOString():null}))}}N();var et=Object.freeze({60808:{name:"bob",label:"BOB (Build on Bitcoin)",url:"https://explorer.gobob.xyz",nativeSymbol:"ETH"},30:{name:"rootstock",label:"Rootstock (RSK)",url:"https://rootstock.blockscout.com",nativeSymbol:"RBTC"}}),r1=new Map([["bob",60808],["rootstock",30],["rsk",30]]),o1=60808;function Rr(e){if(e==null||e==="")return o1;let t=r1.get(String(e).trim().toLowerCase());if(t)return t;let n=Number(e);if(!et[n])throw new Error(`bob-rootstock: unsupported chain ${e} (supported: ${Object.keys(et).join(", ")} / bob, rootstock)`);return n}function Oc(e,t={}){if(t.baseUrl)return String(t.baseUrl).replace(/\/$/,"");let n=Rr(e),r=n===30?process.env.ROOTSTOCK_EXPLORER_URL:process.env.BOB_EXPLORER_URL;return String(r||et[n].url).replace(/\/$/,"")}function X0(e,t="address"){let n=String(e||"").trim();if(!/^0x[0-9a-fA-F]{40}$/.test(n))throw new Error(`bob-rootstock: ${t} must be a 0x EVM address`);return n}function Oi(e,t,n={}){return y(`${Oc(e,n)}${t.startsWith("/")?t:`/${t}`}`,{fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs??15e3})}async function Q0(e={},t={}){let n;try{n=Rr(t.chainId??t.chain??e.chainId)}catch(o){return{ok:!1,provider:"bob-rootstock",error:String(o?.message||o),exec:!1}}let r=et[n];try{let o=await Oi(n,"/api/v2/stats",e);return{ok:o?.total_blocks!=null||o?.total_transactions!=null,provider:"bob-rootstock",chainId:n,chain:r.name,baseUrl:Oc(n,e),totalBlocks:o?.total_blocks??null,averageBlockTimeMs:o?.average_block_time??null,exec:!1}}catch(o){return{ok:!1,provider:"bob-rootstock",chainId:n,chain:r.name,baseUrl:Oc(n,e),error:String(o?.message||o),exec:!1}}}async function Rc(e={},t={}){let n=e.chainId??e.chain;if(String(n).trim().toLowerCase()==="all"){let s=Object.keys(et).map(Number);return{provider:"bob-rootstock",chains:await Promise.all(s.map(async c=>{try{return await Rc({chainId:c},t)}catch(l){return{provider:"bob-rootstock",chainId:c,chain:et[c].name,error:String(l?.message||l)}}}))}}let r=Rr(n),o=et[r],i=await Oi(r,"/api/v2/stats",t);return{provider:"bob-rootstock",chainId:r,chain:o.name,label:o.label,nativeSymbol:o.nativeSymbol,averageBlockTimeMs:i.average_block_time??null,averageBlockTimeSec:i.average_block_time==null?null:Number(i.average_block_time)/1e3,gasPrices:i.gas_prices??null,gasPriceUpdatedAt:i.gas_price_updated_at??null,gasUsedToday:i.gas_used_today??null,coinPrice:i.coin_price??null,coinPriceChangePct:i.coin_price_change_percentage??null,marketCap:i.market_cap??null,tvl:i.tvl??null,totalBlocks:i.total_blocks??null,totalAddresses:i.total_addresses??null,totalTransactions:i.total_transactions??null,transactionsToday:i.transactions_today??null,networkUtilizationPct:i.network_utilization_percentage??null,raw:i}}async function J0(e={},t={}){let n=Rr(e.chainId??e.chain),r=X0(e.address||e.addr,"address"),o=et[n],i=await Oi(n,`/api/v2/addresses/${encodeURIComponent(r)}`,t);return{provider:"bob-rootstock",chainId:n,chain:o.name,address:r,nativeSymbol:o.nativeSymbol,coinBalanceWei:i.coin_balance==null?null:String(i.coin_balance),coinBalance:i.coin_balance==null?null:Number(i.coin_balance)/1e18,isContract:i.is_contract??null,isVerified:i.is_verified??null,name:i.name??null,blockNumberBalanceUpdatedAt:i.block_number_balance_updated_at??null,raw:i}}async function Z0(e={},t={}){let n=Rr(e.chainId??e.chain),r=X0(e.address||e.addr,"address"),o=await Oi(n,`/api/v2/addresses/${encodeURIComponent(r)}/token-balances`,t),i=Array.isArray(o)?o:[],s=Math.min(500,Math.max(1,Number(e.limit||i.length||1)));return{provider:"bob-rootstock",chainId:n,chain:et[n].name,address:r,count:i.length,tokens:i.slice(0,s).map(a=>({symbol:a.token?.symbol??null,name:a.token?.name??null,address:a.token?.address??a.token?.address_hash??null,type:a.token?.type??null,decimals:a.token?.decimals??null,rawBalance:a.value==null?null:String(a.value),balance:a.value==null||a.token?.decimals==null?null:Number(a.value)/10**Number(a.token.decimals),exchangeRate:a.token?.exchange_rate??null}))}}N();var s1="https://insights.braiins.com/api/v1.0";function $c(e={}){return String(e.baseUrl||process.env.BRAIINS_INSIGHTS_URL||s1).replace(/\/$/,"")}function Lc(e,t={}){return y(`${$c(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3,headers:{Accept:"application/json"}})}async function eg(e={}){try{let t=await Lc("/price-stats",e),n=Number(t?.price??0);return{ok:Number.isFinite(n)&&n>0,provider:"braiins-insights",baseUrl:$c(e),btcUsd:Number.isFinite(n)?n:null,timestamp:t?.timestamp??null,exec:!1}}catch(t){return{ok:!1,provider:"braiins-insights",baseUrl:$c(e),error:String(t?.message||t),exec:!1}}}async function tg(e={},t={}){let n=await Lc("/price-stats",t);return{provider:"braiins-insights",btcUsd:n?.price==null?null:Number(n.price),percentChange24h:n?.percent_change_24h??null,timestamp:n?.timestamp??null,raw:n}}async function ng(e={},t={}){let n=await Lc("/pool-stats",t),r=Array.isArray(n)?n:Array.isArray(n?.pools)?n.pools:[],o=String(e.window||"1w").trim().toLowerCase(),i=l=>l?.blocks_mined?.[o]||null,s=[...r].sort((l,u)=>Number(i(u)?.absolute||0)-Number(i(l)?.absolute||0)),a=Math.min(200,Math.max(1,Number(e.limit||s.length||1))),c=r.length?Object.keys(r[0]?.blocks_mined||{}):[];if(c.length&&!c.includes(o))throw new Error(`braiins-insights: window must be one of ${c.join(", ")}`);return{provider:"braiins-insights",window:o,availableWindows:c,count:s.length,pools:s.slice(0,a).map(l=>({name:l.pool_name??l.name??null,blocksMined:i(l)?.absolute??null,sharePct:i(l)?.relative_pct??null,blockValueAvg:l.block_value_avg??null,hashrate:l.hashrate??null,luck:l.luck??null,blocksMinedAllWindows:l.blocks_mined??null})),raw:s.slice(0,a)}}N();var c1="https://api.cow.fi",rg=Object.freeze({1:"mainnet",100:"xdai",42161:"arbitrum_one",8453:"base",11155111:"sepolia"});function og(e={}){return(e.baseUrl||process.env.COW_API_URL||c1).replace(/\/$/,"")}function l1(e={}){if(e.network)return String(e.network);let t=Number(e.chainId??1),n=rg[t];if(!n)throw new Error(`cow-protocol: unsupported chainId ${t} (have: ${Object.keys(rg).join(", ")})`);return n}function Mc(e,t,n){return`${og(n)}/${l1(e)}/api/v1${t}`}function ig(e,t){let n=String(e||"").trim();if(!/^0x[0-9a-fA-F]{40}$/.test(n))throw new Error(`cow-protocol: ${t} must be an EVM address`);return n}function sg(e,t=10){return Math.min(1e3,Math.max(1,Number(e.limit??t)))}async function ag(e={},t={}){return y(Mc(e,"/auction",t),{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function cg(e={},t={}){let n=ig(e.owner||e.address||e.user,"owner"),r=new URLSearchParams({limit:String(sg(e))});e.offset!=null&&r.set("offset",String(Math.max(0,Number(e.offset))));let o=await y(`${Mc(e,`/account/${n}/orders`,t)}?${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4}),i=Array.isArray(o)?o:[],s=e.openOnly===!1?i:i.filter(a=>String(a?.status||"").toLowerCase()==="open");return{owner:n,count:s.length,total:i.length,orders:s}}async function lg(e={},t={}){let n=new URLSearchParams;e.orderUid?n.set("orderUid",String(e.orderUid)):n.set("owner",ig(e.owner||e.address||e.user,"owner"));let r=await y(`${Mc(e,"/trades",t)}?${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4}),o=Array.isArray(r)?r:[];return{count:o.length,trades:o.slice(0,sg(e))}}async function ug(e={}){let t=await y(`${og(e)}/mainnet/api/v1/version`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??12e3}),n=typeof t=="string"?t:JSON.stringify(t??"");return{ok:n.trim().length>0,provider:"cow-protocol",version:n.trim()||null}}N();var d1="https://api.hiro.so",p1=20;function Uc(e={}){return String(e.baseUrl||process.env.HIRO_API_URL||d1).replace(/\/$/,"")}function m1(e={}){let t={Accept:"application/json"},n=e.apiKey||process.env.HIRO_API_KEY;return n&&(t["x-api-key"]=String(n)),t}function $r(e,t={}){return y(`${Uc(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3,headers:m1(t)})}async function dg(e={}){try{let t=await $r("/v2/info",e),n=Number(t?.burn_block_height??0);return{ok:Number.isFinite(n)&&n>0,provider:"hiro-stacks",baseUrl:Uc(e),burnBlockHeight:t?.burn_block_height??null,stacksTipHeight:t?.stacks_tip_height??null,serverVersion:t?.server_version??null,rateLimitRps:p1,keyed:!!(e.apiKey||process.env.HIRO_API_KEY),exec:!1}}catch(t){return{ok:!1,provider:"hiro-stacks",baseUrl:Uc(e),error:String(t?.message||t),exec:!1}}}async function pg(e={},t={}){let n=await $r("/v2/info",t);return{provider:"hiro-stacks",peerVersion:n.peer_version??null,serverVersion:n.server_version??null,networkId:n.network_id??null,burnBlockHeight:n.burn_block_height??null,stableBurnBlockHeight:n.stable_burn_block_height??null,stacksTipHeight:n.stacks_tip_height??null,stacksTip:n.stacks_tip??null,poxConsensus:n.pox_consensus??null,raw:n}}async function mg(e={},t={}){let n=await $r("/v2/pox",t),r=Number(n.total_liquid_supply_ustx||0),o=Number(n.current_cycle?.stacked_ustx||0);return{provider:"hiro-stacks",contractId:n.contract_id??null,currentCycleId:n.current_cycle?.id??null,currentCycleStackedUstx:n.current_cycle?.stacked_ustx==null?null:String(n.current_cycle.stacked_ustx),currentCycleIsPoX:n.current_cycle?.is_pox_active??null,nextCycleId:n.next_cycle?.id??null,nextCycleStackedUstx:n.next_cycle?.stacked_ustx==null?null:String(n.next_cycle.stacked_ustx),nextCycleMinThresholdUstx:n.next_cycle?.min_threshold_ustx==null?null:String(n.next_cycle.min_threshold_ustx),blocksUntilNextCycle:n.next_cycle?.blocks_until_prepare_phase??null,minAmountUstx:n.min_amount_ustx==null?null:String(n.min_amount_ustx),totalLiquidSupplyUstx:n.total_liquid_supply_ustx==null?null:String(n.total_liquid_supply_ustx),participationPct:r>0?o/r*100:null,rewardCycleLength:n.reward_cycle_length??null,rewardSlots:n.reward_slots??null,currentBurnchainBlockHeight:n.current_burnchain_block_height??null,raw:n}}async function fg(e={},t={}){let n=Math.min(60,Math.max(1,Number(e.limit||20))),r=Math.max(0,Number(e.offset||0)),o=await $r(`/extended/v2/pox/cycles?limit=${n}&offset=${r}`,t),i=Array.isArray(o?.results)?o.results:[];return{provider:"hiro-stacks",total:o?.total??null,limit:n,offset:r,cycles:i.map(s=>({cycleNumber:s.cycle_number??null,blockHeight:s.block_height??null,totalStackedAmount:s.total_stacked_amount==null?null:String(s.total_stacked_amount),totalWeight:s.total_weight??null,totalSigners:s.total_signers??null}))}}async function hg(e={},t={}){let n=Math.min(30,Math.max(1,Number(e.limit||1))),r=await $r(`/extended/v2/blocks?limit=${n}`,t),o=Array.isArray(r?.results)?r.results:[];return{provider:"hiro-stacks",total:r?.total??null,limit:n,blocks:o.map(i=>({height:i.height??null,hash:i.hash??null,burnBlockHeight:i.burn_block_height??null,burnBlockTime:i.burn_block_time??null,txCount:i.tx_count??null,canonical:i.canonical??null}))}}N();var h1="https://bundles.jito.wtf",yg=1e9;function Bc(e={}){return String(e.baseUrl||process.env.JITO_BUNDLES_URL||h1).replace(/\/$/,"")}function g1(e,t,n){let r=Number(e);return Number.isFinite(r)?Math.max(1,Math.min(Math.floor(r),n)):t}function gg(e){let t=Number(e);return Number.isFinite(t)?Math.round(t*yg):null}function y1(e={}){let t=Number(e.landedTipLamports);return{bundleId:e.bundleId||null,timestamp:e.timestamp||null,validator:e.validator||null,tippers:e.tippers||[],transactions:e.transactions||[],transactionCount:Array.isArray(e.transactions)?e.transactions.length:0,landedTipLamports:Number.isFinite(t)?t:null,landedTipSol:Number.isFinite(t)?t/yg:null,raw:e}}async function bg(e={}){try{let t=await y(`${Bc(e)}/api/v1/bundles/tip_floor`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??12e3}),n=Array.isArray(t)?t[0]:t,r=Number(n?.landed_tips_50th_percentile);return{ok:Number.isFinite(r),provider:"jito-mev",tipFloorP50Sol:Number.isFinite(r)?r:null,asOf:n?.time||null,exec:!1}}catch(t){return{ok:!1,provider:"jito-mev",error:String(t?.message||t),exec:!1}}}async function wg(e={},t={}){let n=g1(e.limit,5,100),r=new URL(`${Bc(t)}/api/v1/bundles/recent`);r.searchParams.set("limit",String(n)),r.searchParams.set("sort",String(e.sort||"Time")),r.searchParams.set("asc",String(!!e.asc));let o=await y(r.toString(),{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),s=(Array.isArray(o)?o:Array.isArray(o?.bundles)?o.bundles:[]).map(y1),a=s.map(c=>c.landedTipLamports).filter(c=>Number.isFinite(c));return{provider:"jito-mev",chain:"solana-mainnet-beta",count:s.length,totalTipLamports:a.reduce((c,l)=>c+l,0),maxTipLamports:a.length?Math.max(...a):null,bundles:s}}async function xg(e={}){let t=await y(`${Bc(e)}/api/v1/bundles/tip_floor`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??12e3}),n=(Array.isArray(t)?t[0]:t)||{},r={p25:Number(n.landed_tips_25th_percentile)||0,p50:Number(n.landed_tips_50th_percentile)||0,p75:Number(n.landed_tips_75th_percentile)||0,p95:Number(n.landed_tips_95th_percentile)||0,p99:Number(n.landed_tips_99th_percentile)||0,ema50:Number(n.ema_landed_tips_50th_percentile)||0};return{provider:"jito-mev",chain:"solana-mainnet-beta",asOf:n.time||null,tipFloorSol:r,tipFloorLamports:Object.fromEntries(Object.entries(r).map(([o,i])=>[o,gg(i)])),suggestedTipLamports:gg(r.p75||r.p50),raw:n}}N();var w1="https://api.kamino.finance";function x1(e={}){return String(e.baseUrl||process.env.KAMINO_API_URL||w1).replace(/\/$/,"")}function we(e){let t=Number(e);return Number.isFinite(t)?t:null}function Sg(e={}){let t=we(e.totalValueLocked)??0,n=we(e.apy?.totalApy)??0,r=we(e.kaminoApy?.totalApy)??0;return{strategy:e.strategy||null,pair:e.tokenA&&e.tokenB?`${e.tokenA}-${e.tokenB}`:null,tokenA:e.tokenA||null,tokenB:e.tokenB||null,tokenAMint:e.tokenAMint||null,tokenBMint:e.tokenBMint||null,tvlUsd:t,sharePrice:we(e.sharePrice),sharesIssued:we(e.sharesIssued),profitAndLoss:we(e.profitAndLoss),feeApy:n,feeApyPct:n*100,rewardApy:r,rewardApyPct:r*100,totalApy:n+r,totalApyPct:(n+r)*100,apr24h:we(e.apy?.vault?.totalApr),apy24h:we(e.kaminoApy?.vault?.apy24h),apy7d:we(e.kaminoApy?.vault?.apy7d),apy30d:we(e.kaminoApy?.vault?.apy30d),poolPrice:we(e.apy?.vault?.poolPrice),priceLower:we(e.apy?.vault?.priceLower),priceUpper:we(e.apy?.vault?.priceUpper),outOfRange:!!e.apy?.vault?.strategyOutOfRange,rewardMints:e.rewardMints||[],balances:e.vaultBalances||null,lastCalculated:e.kaminoApy?.vault?.lastCalculated||null}}async function Dc(e={},t={}){let n=new URL(`${x1(t)}/strategies/metrics`);n.searchParams.set("env",String(e.env||"mainnet-beta")),n.searchParams.set("status",String(e.status||"LIVE"));let r=await y(n.toString(),{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??45e3});return Array.isArray(r)?r:[]}async function kg(e={}){try{let t=await Dc({},e),n=t.filter(r=>(Number(r.totalValueLocked)||0)>0).length;return{ok:t.length>0,provider:"kamino-strategies",strategies:t.length,funded:n,exec:!1}}catch(t){return{ok:!1,provider:"kamino-strategies",error:String(t?.message||t),exec:!1}}}async function Eg(e={},t={}){let r=(await Dc(e,t)).map(Sg),o=r.length,i=Number.isFinite(Number(e.minTvlUsd))?Number(e.minTvlUsd):1e4;if(r=r.filter(l=>l.tvlUsd>=i),e.token){let l=String(e.token).toLowerCase();r=r.filter(u=>String(u.tokenA||"").toLowerCase()===l||String(u.tokenB||"").toLowerCase()===l||u.tokenAMint===e.token||u.tokenBMint===e.token)}if(e.pair){let l=String(e.pair).toLowerCase().replace(/[/_]/g,"-");r=r.filter(u=>String(u.pair||"").toLowerCase()===l)}e.inRangeOnly===!0&&(r=r.filter(l=>!l.outOfRange));let s=String(e.sortBy||"apy");r.sort((l,u)=>s==="tvl"?u.tvlUsd-l.tvlUsd:u.totalApy-l.totalApy);let a=Number.isFinite(Number(e.limit))&&Number(e.limit)>0?Number(e.limit):25,c=r.slice(0,a);return{provider:"kamino-strategies",chain:"solana-mainnet-beta",env:e.env||"mainnet-beta",status:e.status||"LIVE",totalStrategies:o,matched:r.length,count:c.length,minTvlUsd:i,tvlUsdMatched:r.reduce((l,u)=>l+u.tvlUsd,0),strategies:c}}async function vg(e={},t={}){let n=String(e.strategy||e.address||"").trim();if(!n)throw new Error("kamino-strategies: strategy address required");let o=(await Dc({...e,status:e.status||"ALL"},t)).find(i=>i.strategy===n);if(!o)throw new Error(`kamino-strategies: strategy ${n} not found`);return{provider:"kamino-strategies",chain:"solana-mainnet-beta",...Sg(o),raw:o}}N();var k1="https://blockstream.info/liquid/api",Ag="6f0279e9ed041c3d710a9f57d0c02928416460c4b722ae3457a11eec381c526d";function Ri(e={}){return String(e.baseUrl||process.env.LIQUID_ESPLORA_URL||k1).replace(/\/$/,"")}function E1(e,t="address"){let n=String(e||"").trim(),r=/^(ex1|lq1|el1|tex1|tlq1)[a-z0-9]{20,200}$/i.test(n),o=/^[QVGH][a-km-zA-HJ-NP-Z1-9]{25,110}$/.test(n);if(!r&&!o)throw new Error(`liquid-esplora: ${t} must look like a Liquid address (Q\u2026, VJL\u2026, ex1\u2026, lq1\u2026)`);return n}function v1(e,t="assetId"){let n=String(e||"").trim().toLowerCase().replace(/^0x/,"");if(!/^[0-9a-f]{64}$/.test(n))throw new Error(`liquid-esplora: ${t} must be 64-char hex`);return n}async function Ig(e,t={}){let n=`${Ri(t)}${e.startsWith("/")?e:`/${e}`}`,o=await(t.fetchImpl||fetch)(n,{method:"GET",headers:{accept:"application/json,text/plain;q=0.9,*/*;q=0.8"},signal:AbortSignal.timeout(t.timeoutMs??12e3)}),i=await o.text();if(!o.ok)throw new Error(`liquid-esplora GET ${e}: HTTP ${o.status} ${i.slice(0,160)}`);return i}function _g(e,t={}){return y(`${Ri(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3})}async function Pg(e={}){try{let t=await Ig("/blocks/tip/height",e),n=Number(t);return{ok:Number.isFinite(n)&&n>0,provider:"liquid-esplora",baseUrl:Ri(e),tipHeight:n,exec:!1,signing:"user-wallet"}}catch(t){return{ok:!1,provider:"liquid-esplora",baseUrl:Ri(e),error:String(t?.message||t),exec:!1}}}async function Cg(e={},t={}){let n=await Ig("/blocks/tip/height",t);return{provider:"liquid-esplora",tipHeight:Number(n)}}async function Tg(e={},t={}){let n=E1(e.address||e.addr,"address"),r=await _g(`/address/${n}`,t),o=r.chain_stats||{},i=r.mempool_stats||{},s=o.funded_txo_sum!=null,a=Number(o.funded_txo_sum||0)+Number(i.funded_txo_sum||0),c=Number(o.spent_txo_sum||0)+Number(i.spent_txo_sum||0);return{provider:"liquid-esplora",address:n,txCount:Number(o.tx_count||0)+Number(i.tx_count||0),balanceSats:s?String(a-c):null,confidential:!s,note:s?void 0:"Liquid amounts are blinded \u2014 Esplora returns TXO counts only for confidential outputs. Unblind with the wallet's blinding key for values.",chainStats:o,mempoolStats:i,raw:r}}async function Ng(e={},t={}){let n=v1(e.assetId||e.asset||Ag,"assetId"),r=await _g(`/asset/${n}`,t),o=r.chain_stats||{};return{provider:"liquid-esplora",assetId:n,isPolicyAsset:n===Ag,name:r.name??r.entity?.domain??null,ticker:r.ticker??null,precision:r.precision??null,issuanceTxid:r.issuance_txin?.txid??null,txCount:o.tx_count??null,pegInAmount:o.peg_in_amount==null?null:String(o.peg_in_amount),pegOutAmount:o.peg_out_amount==null?null:String(o.peg_out_amount),issuedAmount:o.issued_amount==null?null:String(o.issued_amount),burnedAmount:o.burned_amount==null?null:String(o.burned_amount),circulatingAmount:o.peg_in_amount!=null?String(Number(o.peg_in_amount)-Number(o.peg_out_amount||0)-Number(o.burned_amount||0)):o.issued_amount!=null?String(Number(o.issued_amount)-Number(o.burned_amount||0)):null,raw:r}}N();var I1="https://api-mainnet.magiceden.dev/v2/ord/btc",_1=600;function Fc(e={}){return String(e.baseUrl||process.env.MAGICEDEN_ORD_API_URL||I1).replace(/\/$/,"")}function P1(e={}){let t={Accept:"application/json"},n=e.apiKey||process.env.MAGICEDEN_API_KEY;return n&&(t.Authorization=`Bearer ${n}`),t}function Og(e,t="collectionSymbol"){let n=String(e||"").trim().toLowerCase();if(!/^[a-z0-9][a-z0-9_-]{0,63}$/.test(n))throw new Error(`magiceden-ordinals: ${t} must be a slug like "nodemonkes"`);return n}function Rg(e,t={}){return y(`${Fc(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3,headers:P1(t),retries:t.retries??1})}async function $g(e={}){let t=Og(e.probeCollection||process.env.MAGICEDEN_PROBE_COLLECTION||"nodemonkes");try{let n=await Rg(`/stat?collectionSymbol=${encodeURIComponent(t)}`,e);return{ok:n!=null&&typeof n=="object",provider:"magiceden-ordinals",baseUrl:Fc(e),probeCollection:t,rateLimitRpm:_1,exec:!1}}catch(n){let r=n?.status??null;return{ok:!1,provider:"magiceden-ordinals",baseUrl:Fc(e),probeCollection:t,status:r,upstreamDown:r===503||r===502||r===504,error:String(n?.message||n),fallback:"satflow",note:r===503?"Magic Eden ordinals API returned 503 'no healthy upstream'. Use the satflow provider for BTC NFT market data.":void 0,exec:!1}}}async function Lg(e={},t={}){let n=Og(e.collectionSymbol||e.symbol||e.collection,"collectionSymbol");try{let r=await Rg(`/stat?collectionSymbol=${encodeURIComponent(n)}`,t),o=r?.floorPrice==null?null:Number(r.floorPrice);return{ok:!0,provider:"magiceden-ordinals",collectionSymbol:n,floorPriceSats:o==null?null:String(r.floorPrice),floorPriceBtc:o==null?null:o/1e8,totalVolumeSats:r?.totalVolume==null?null:String(r.totalVolume),totalVolumeBtc:r?.totalVolume==null?null:Number(r.totalVolume)/1e8,totalListed:r?.totalListed??null,owners:r?.owners??null,supply:r?.supply??null,pendingTransactions:r?.pendingTransactions??null,inscriptionNumberMin:r?.inscriptionNumberMin??null,inscriptionNumberMax:r?.inscriptionNumberMax??null,raw:r}}catch(r){let o=r?.status??null;if(!(o===502||o===503||o===504))throw r;return{ok:!1,provider:"magiceden-ordinals",collectionSymbol:n,status:o,upstreamDown:!0,error:String(r?.message||r),fallback:"satflow",note:"Magic Eden ordinals API is returning 5xx ('no healthy upstream'). Query the satflow provider for floors and listings."}}}N();var T1="https://mempool.space/api",N1=7;function qc(e={}){return String(e.baseUrl||process.env.MEMPOOL_API_URL||T1).replace(/\/$/,"")}function $i(e,t={}){return y(`${qc(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}function Mg(e){if(!e)return{ageDays:null,stale:null};let t=new Date(e).getTime();if(!Number.isFinite(t))return{ageDays:null,stale:null};let n=(Date.now()-t)/864e5;return{ageDays:Math.round(n*10)/10,stale:n>N1}}async function Ug(e={}){try{let n=(await $i("/v1/lightning/statistics/latest",e))?.latest||{},{ageDays:r,stale:o}=Mg(n.added);return{ok:Number(n.node_count||0)>0,provider:"mempool-lightning",baseUrl:qc(e),snapshotAt:n.added??null,ageDays:r,stale:o,nodeCount:n.node_count??null,exec:!1}}catch(t){return{ok:!1,provider:"mempool-lightning",baseUrl:qc(e),error:String(t?.message||t),exec:!1}}}async function Bg(e={},t={}){let r=(await $i("/v1/lightning/statistics/latest",t))?.latest||{},{ageDays:o,stale:i}=Mg(r.added);return{provider:"mempool-lightning",snapshotAt:r.added??null,ageDays:o,stale:i,staleNote:i?`mempool.space Lightning snapshot is ${o} days old \u2014 trend only, not live state`:void 0,nodeCount:r.node_count??null,channelCount:r.channel_count??null,totalCapacitySats:r.total_capacity==null?null:String(r.total_capacity),totalCapacityBtc:r.total_capacity==null?null:Number(r.total_capacity)/1e8,avgCapacitySats:r.avg_capacity==null?null:String(r.avg_capacity),avgFeeRatePpm:r.avg_fee_rate??null,avgBaseFeeMsat:r.avg_base_fee_mtokens??null,torNodes:r.tor_nodes??null,clearnetNodes:r.clearnet_nodes??null,unannouncedNodes:r.unannounced_nodes??null,raw:r}}async function Dg(e={},t={}){let n=String(e.metric||e.ranking||"connectivity").trim().toLowerCase(),r=new Set(["connectivity","liquidity","channels"]);if(!r.has(n))throw new Error(`mempool-lightning: metric must be one of ${[...r].join(", ")}`);let o=await $i(`/v1/lightning/nodes/rankings/${n}`,t),i=Array.isArray(o)?o:[],s=Math.min(100,Math.max(1,Number(e.limit||i.length||1)));return{provider:"mempool-lightning",metric:n,count:i.length,nodes:i.slice(0,s).map(a=>({publicKey:a.publicKey??null,alias:a.alias??null,channels:a.channels??null,capacitySats:a.capacity==null?null:String(a.capacity),firstSeen:a.firstSeen??null,updatedAt:a.updatedAt??null,city:a.city?.en??a.city??null,country:a.country?.en??a.country??null,iso:a.iso_code??null}))}}async function Fg(e={},t={}){let n=await $i("/v1/lightning/nodes/countries",t),r=Array.isArray(n)?n:[],o=Math.min(250,Math.max(1,Number(e.limit||r.length||1))),i=r.reduce((s,a)=>s+Number(a.count||0),0);return{provider:"mempool-lightning",countryCount:r.length,totalNodes:i,topCountrySharePct:r[0]?.share??null,countries:r.slice(0,o).map(s=>({name:s.name?.en??s.name??null,iso:s.iso??null,count:s.count??null,sharePct:s.share??null,capacitySats:s.capacity==null?null:String(s.capacity)}))}}N();var R1="https://mempool.space/api",qg=new Set(["24h","3d","1w","1m","3m","6m","1y","2y","3y","all"]);function Hc(e={}){return String(e.baseUrl||process.env.MEMPOOL_API_URL||R1).replace(/\/$/,"")}function Hg(e,t){let n=String(e||t).trim().toLowerCase();if(!qg.has(n))throw new Error(`mempool-mining: window must be one of ${[...qg].join(", ")}`);return n}function Lr(e,t={}){return y(`${Hc(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function jg(e={}){try{let t=await Lr("/v1/difficulty-adjustment",e);return{ok:Number.isFinite(Number(t?.nextRetargetHeight))&&Number(t.nextRetargetHeight)>0,provider:"mempool-mining",baseUrl:Hc(e),nextRetargetHeight:t?.nextRetargetHeight??null,exec:!1}}catch(t){return{ok:!1,provider:"mempool-mining",baseUrl:Hc(e),error:String(t?.message||t),exec:!1}}}async function Vg(e={},t={}){let n=await Lr("/v1/difficulty-adjustment",t);return{provider:"mempool-mining",progressPercent:n.progressPercent??null,difficultyChangePct:n.difficultyChange??null,estimatedRetargetDate:n.estimatedRetargetDate??null,remainingBlocks:n.remainingBlocks??null,remainingTimeMs:n.remainingTime??null,previousRetargetPct:n.previousRetarget??null,nextRetargetHeight:n.nextRetargetHeight??null,timeAvgMs:n.timeAvg??null,raw:n}}async function zg(e={},t={}){let n=Hg(e.window||e.timeframe,"1w"),r=await Lr(`/v1/mining/pools/${n}`,t),o=Array.isArray(r?.pools)?r.pools:[],i=o.reduce((l,u)=>l+Number(u.blockCount||0),0),s=l=>i>0?Number(l.blockCount||0)/i*100:null,a=[...o].sort((l,u)=>Number(u.blockCount||0)-Number(l.blockCount||0)),c=Math.min(200,Math.max(1,Number(e.limit||a.length||1)));return{provider:"mempool-mining",window:n,totalBlocks:i,blockCount:r?.blockCount??null,lastEstimatedHashrate:r?.lastEstimatedHashrate??null,topPoolSharePct:a[0]?s(a[0]):null,top3SharePct:a.slice(0,3).reduce((l,u)=>l+(s(u)||0),0)||null,pools:a.slice(0,c).map(l=>({name:l.name??null,slug:l.slug??null,blockCount:l.blockCount??null,rank:l.rank??null,sharePct:s(l),emptyBlocks:l.emptyBlocks??null,avgMatchRate:l.avgMatchRate??null}))}}async function Wg(e={},t={}){let n=Hg(e.window||e.timeframe,"3d"),r=await Lr(`/v1/mining/hashrate/${n}`,t),o=Array.isArray(r?.hashrates)?r.hashrates:[];return{provider:"mempool-mining",window:n,currentHashrate:r?.currentHashrate??null,currentHashrateEhs:r?.currentHashrate==null?null:Number(r.currentHashrate)/1e18,currentDifficulty:r?.currentDifficulty??null,points:o.length,hashrates:o,difficulty:Array.isArray(r?.difficulty)?r.difficulty:[]}}async function Gg(e={},t={}){let n=Math.min(1e4,Math.max(1,Number(e.blockCount||e.blocks||144))),r=await Lr(`/v1/mining/reward-stats/${n}`,t),o=Number(r.totalReward||0),i=Number(r.totalFee||0);return{provider:"mempool-mining",blockCount:n,startBlock:r.startBlock??null,endBlock:r.endBlock??null,totalRewardSats:String(r.totalReward??""),totalFeeSats:String(r.totalFee??""),totalSubsidySats:String(o-i),feeSharePct:o>0?i/o*100:null,totalTx:r.totalTx??null,raw:r}}N();var L1="https://amm-v2.meteora.ag",Kg=new Set(["tvl","volume","fee_tvl_ratio","l_m"]),Yg=new Set(["dynamic","multitoken","lst","farms"]),M1=/^[1-9A-HJ-NP-Za-km-z]{32,44}$/;function U1(e={}){return String(e.baseUrl||process.env.METEORA_API_URL||L1).replace(/\/$/,"")}function le(e){let t=Number(e);return Number.isFinite(t)?t:null}function B1(e={}){return{address:e.pool_address||null,name:e.pool_name||null,type:e.pool_type||null,version:e.pool_version??null,mints:e.pool_token_mints||[],tokenAmounts:e.pool_token_amounts||[],tokenUsdAmounts:e.pool_token_usd_amounts||[],lpMint:e.lp_mint||null,lpDecimals:e.lp_decimal??null,lpPriceUsd:le(e.pool_lp_price_in_usd),tvlUsd:le(e.pool_tvl),farmTvlUsd:le(e.farm_tvl),volume24hUsd:le(e.trading_volume),volume7dUsd:le(e.weekly_trading_volume),fee24hUsd:le(e.fee_volume),fee7dUsd:le(e.weekly_fee_volume),tradeApyPct:le(e.trade_apy),weeklyTradeApyPct:le(e.weekly_trade_apy),baseApyPct:le(e.daily_base_apy),farmingApyPct:le(e.farming_apy),totalApyPct:(le(e.trade_apy)??0)+(le(e.farming_apy)??0),aprPct:le(e.apr),feePct:le(e.total_fee_pct),farmingPool:e.farming_pool||null,isLst:!!e.is_lst,isMeme:!!e.is_meme,permissioned:!!e.permissioned,unknownTokens:!!e.unknown,createdAt:e.created_at??null}}function D1(e={},t={}){let n=new URL(`${U1(t)}/pools/search`),r=Math.max(0,Number(e.page)||0),o=Math.max(1,Math.min(Number(e.size??e.limit)||20,100));if(n.searchParams.set("page",String(r)),n.searchParams.set("size",String(o)),e.sortKey!=null){let a=String(e.sortKey);if(!Kg.has(a))throw new Error(`meteora-dlmm: sortKey must be one of ${[...Kg].join(", ")}`);n.searchParams.set("sort_key",a),n.searchParams.set("order_by",e.orderBy==="asc"?"asc":"desc")}if(e.poolType!=null){let a=String(e.poolType);if(!Yg.has(a))throw new Error(`meteora-dlmm: poolType must be one of ${[...Yg].join(", ")}`);n.searchParams.set("pool_type",a)}let i=e.filter??e.query??e.search;i!=null&&String(i).trim()&&n.searchParams.set("filter",String(i).trim());let s=e.mints||e.includeTokenMints;if(s){let a=(Array.isArray(s)?s:[s]).map(c=>String(c).trim());for(let c of a)if(!M1.test(c))throw new Error(`meteora-dlmm: mint ${c} is not a base58 public key`);n.searchParams.set("include_token_mints",a.join(","))}return{url:n,page:r,size:o}}async function jc(e={},t={}){let{url:n,page:r,size:o}=D1(e,t),i=await y(n.toString(),{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4});return{pools:(Array.isArray(i?.data)?i.data:[]).map(B1),totalCount:i?.total_count??null,page:r,size:o}}async function Xg(e={}){try{let{pools:t,totalCount:n}=await jc({size:3},e);return{ok:t.length>0,provider:"meteora-dlmm",poolsIndexed:n,sample:t.length,exec:!1}}catch(t){return{ok:!1,provider:"meteora-dlmm",error:String(t?.message||t),exec:!1}}}async function Qg(e={},t={}){let n=await jc({sortKey:e.sortKey||"tvl",orderBy:e.orderBy||"desc",...e},t),r=n.pools,o=Number(e.minTvlUsd);return Number.isFinite(o)&&(r=r.filter(i=>(i.tvlUsd??0)>=o)),e.excludeUnknown===!0&&(r=r.filter(i=>!i.unknownTokens)),{provider:"meteora-dlmm",chain:"solana-mainnet-beta",page:n.page,size:n.size,totalCount:n.totalCount,count:r.length,tvlUsd:r.reduce((i,s)=>i+(s.tvlUsd??0),0),pools:r}}async function Jg(e={},t={}){let n=e.filter??e.query??e.search,r=e.mints||e.includeTokenMints;if((n==null||!String(n).trim())&&!r)throw new Error("meteora-dlmm: poolSearch requires filter text or mints[]");let o=await jc({sortKey:e.sortKey||"tvl",orderBy:"desc",...e},t);return{provider:"meteora-dlmm",chain:"solana-mainnet-beta",filter:n??null,mints:r?Array.isArray(r)?r:[r]:[],page:o.page,size:o.size,totalCount:o.totalCount,count:o.pools.length,pools:o.pools}}N();var q1="https://ordinals.com";function Li(e={}){return String(e.baseUrl||e.ordinalsBase||process.env.ORDINALS_BASE_URL||q1).replace(/\/$/,"")}function H1(e,t="name"){let n=String(e||"").trim().toUpperCase().replace(/[•.\s_-]/g,"");if(!/^[A-Z]{1,28}$/.test(n))throw new Error(`ordinals-runes: ${t} must be 1-28 letters (spacers are stripped automatically)`);return n}async function Zg(e,t={}){let n=`${Li(t)}${e.startsWith("/")?e:`/${e}`}`,o=await(t.fetchImpl||fetch)(n,{method:"GET",headers:{accept:"application/json,text/plain;q=0.9,*/*;q=0.8"},signal:AbortSignal.timeout(t.timeoutMs??12e3)}),i=await o.text();if(!o.ok)throw new Error(`ordinals-runes GET ${e}: HTTP ${o.status} ${i.slice(0,160)}`);return i.trim()}function Vc(e,t={}){return y(`${Li(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3,headers:{Accept:"application/json"}})}async function ey(e={}){try{let t=await Zg("/r/blockheight",e),n=Number(t);return{ok:Number.isFinite(n)&&n>0,provider:"ordinals-runes",baseUrl:Li(e),blockHeight:n,exec:!1}}catch(t){return{ok:!1,provider:"ordinals-runes",baseUrl:Li(e),error:String(t?.message||t),exec:!1}}}async function ty(e={},t={}){let n=await Zg("/r/blockheight",t),r=Number(n);if(!Number.isFinite(r))throw new Error(`ordinals-runes: unexpected blockheight response ${n.slice(0,60)}`);return{provider:"ordinals-runes",blockHeight:r}}async function ny(e={},t={}){let n=e.height??e.block??e.hash;if(n==null||n==="")throw new Error("ordinals-runes: blockInfo requires height or hash");let r;if(/^[0-9a-f]{64}$/i.test(String(n)))r=String(n).toLowerCase();else{let i=Number(n);if(!Number.isInteger(i)||i<0)throw new Error("ordinals-runes: height must be a non-negative integer or a 64-hex block hash");r=String(i)}let o=await Vc(`/r/blockinfo/${r}`,t);return{provider:"ordinals-runes",height:o.height??null,hash:o.hash??null,timestamp:o.timestamp??null,difficulty:o.difficulty??null,transactionCount:o.transaction_count??null,averageFee:o.average_fee??null,averageFeeRate:o.average_fee_rate??null,feerangeSats:o.feerange??null,totalFee:o.total_fee??null,totalSize:o.total_size??null,confirmations:o.confirmations??null,raw:o}}async function ry(e={},t={}){let n=e.sat??e.ordinal,r=Number(n);if(!Number.isInteger(r)||r<0||r>209999999769e4)throw new Error("ordinals-runes: sat must be an integer in [0, 2099999997690000]");let o=Math.max(0,Number(e.page||0)),i=o>0?`/r/sat/${r}/${o}`:`/r/sat/${r}`,s=await Vc(i,t),a=Array.isArray(s?.ids)?s.ids:[];return{provider:"ordinals-runes",sat:r,page:o,inscriptionCount:a.length,inscriptionIds:a,more:!!s?.more,raw:s}}async function oy(e={},t={}){let n=H1(e.name||e.rune||e.runeName,"name"),r=await Vc(`/rune/${n}`,t),o=r?.entry||{},i=o.terms||{},s=i.cap==null?null:Number(i.cap),a=o.mints==null?null:Number(o.mints);return{provider:"ordinals-runes",name:n,spacedRune:o.spaced_rune??null,number:o.number??null,symbol:o.symbol??null,divisibility:o.divisibility??null,etchingBlock:o.block??null,etchingTxid:o.etching??null,premine:o.premine==null?null:String(o.premine),mints:a==null?null:String(a),burned:o.burned==null?null:String(o.burned),mintCap:s==null?null:String(s),mintProgressPct:s&&s>0&&a!=null?a/s*100:null,mintable:r?.mintable??null,amountPerMint:i.amount==null?null:String(i.amount),turbo:o.turbo??null,parent:r?.parent??null,raw:r}}N();var V1="https://hermes.pyth.network",Wc={"SOL/USD":"ef0d8b6fda2ceba41da15d4095d1da392a0d2f8ed0c6c7bc0f4cfac8c280b56d","BTC/USD":"e62df6c8b4a85fe1a67db44dc12de5db330f7ac66b72dc658afedf0f4a415b43","ETH/USD":"ff61491a931112ddf1bd8147cd1b641375f79f5825126d665480874634fd0ace","USDC/USD":"eaa020c61cc479712813461ce153894a96a6c00b21ed0cfc2798d1f9a9e9c94a","USDT/USD":"2b89b9dc8fdf9f34709a5b106b472f0f39bb6ca9ce04b0fd7f2e971688e2e53b","JUP/USD":"0a0408d619e9380abad35060f9192039ed5042fa6f82301d0e48bb52be830996","JTO/USD":"b43660a5f790c69354b0729a5ef9d50d68f1df92107540210b9cccba1f947cc2","BONK/USD":"72b021217ca3fe68922a19aaf990109cb9d84e9ad004b4d2025ad6f529314419","PYTH/USD":"0bbf28e9a841a1cc788f6a361b17ca072d0ea3098a1e5df1c3922d06719579ff","HYPE/USD":"4279e31cc369bbcc2faf022b382b080e32a8e689ff20fbc530d2a603eb6cd98b"},z1=/^[0-9a-fA-F]{64}$/;function iy(e={}){return String(e.baseUrl||process.env.PYTH_HERMES_URL||V1).replace(/\/$/,"")}function sy(e,t="feedId"){let n=String(e??"").trim();if(!n)throw new Error(`pyth-price-feeds: ${t} required`);let r=Wc[n.toUpperCase()]||Wc[`${n.toUpperCase()}/USD`];if(r)return r;let o=n.startsWith("0x")||n.startsWith("0X")?n.slice(2):n;if(!z1.test(o))throw new Error(`pyth-price-feeds: ${t} must be a 32-byte hex feed id or a known symbol`);return o.toLowerCase()}function zc(e={}){let t=Number(e.price),n=Number(e.expo);return!Number.isFinite(t)||!Number.isFinite(n)?null:t*10**n}function Gc(e={}){let t=zc({price:Number(e.price?.conf),expo:e.price?.expo}),n=zc(e.price);return{id:e.id||null,price:n,confidence:t,confidenceBps:n&&t!=null?Math.round(t/Math.abs(n)*1e4):null,emaPrice:zc(e.ema_price),publishTime:e.price?.publish_time??null,publishTimeIso:e.price?.publish_time?new Date(e.price.publish_time*1e3).toISOString():null,ageSeconds:e.price?.publish_time?Math.max(0,Math.round(Date.now()/1e3-e.price.publish_time)):null,expo:e.price?.expo??null,raw:{price:e.price??null,emaPrice:e.ema_price??null,metadata:e.metadata??null}}}async function Kc(e,t={}){let n=new URL(`${iy(t)}/v2/updates/price/latest`);for(let r of e)n.searchParams.append("ids[]",r);return n.searchParams.set("encoding","hex"),n.searchParams.set("parsed","true"),n.searchParams.set("ignore_invalid_price_ids","true"),y(n.toString(),{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3})}async function ay(e={}){try{let t=await Kc([Wc["SOL/USD"]],e),r=(Array.isArray(t?.parsed)?t.parsed.map(Gc):[])[0]||null;return{ok:!!(r&&Number.isFinite(r.price)&&r.price>0),provider:"pyth-price-feeds",solUsd:r?.price??null,ageSeconds:r?.ageSeconds??null,exec:!1}}catch(t){return{ok:!1,provider:"pyth-price-feeds",error:String(t?.message||t),exec:!1}}}async function cy(e={},t={}){let n=sy(e.feedId||e.id||e.symbol,"feedId"),r=await Kc([n],t),o=Array.isArray(r?.parsed)?r.parsed.map(Gc):[],i=o.find(s=>String(s.id).toLowerCase()===n)||o[0]||null;if(!i)throw new Error(`pyth-price-feeds: no price returned for feed ${n}`);return{provider:"pyth-price-feeds",chain:"solana-mainnet-beta",feedId:n,...i,binaryUpdate:r?.binary?.data?.[0]||null,binaryEncoding:r?.binary?.encoding||null}}async function ly(e={},t={}){let n=Array.isArray(e)?e:e.feedIds||e.ids||e.symbols||[],r=[...new Set(n.map(l=>sy(l,"feedIds[]")))];if(!r.length)throw new Error("pyth-price-feeds: feedIds[] required");let o=40,i=[];for(let l=0;l<r.length;l+=o)i.push(r.slice(l,l+o));let s=[];for(let l of i)s.push(await Kc(l,t));let a=s.flatMap(l=>Array.isArray(l?.parsed)?l.parsed.map(Gc):[]),c=Object.fromEntries(a.map(l=>[String(l.id).toLowerCase(),l]));return{provider:"pyth-price-feeds",chain:"solana-mainnet-beta",requested:r.length,returned:a.length,missing:r.filter(l=>!c[l]),prices:a,byId:c}}async function uy(e={},t={}){let n=new URL(`${iy(t)}/v2/price_feeds`);e.query&&n.searchParams.set("query",String(e.query)),n.searchParams.set("asset_type",String(e.assetType||"crypto"));let r=await y(n.toString(),{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),o=Array.isArray(r)?r:[];return{provider:"pyth-price-feeds",count:o.length,feeds:o.map(i=>({id:i.id,symbol:i.attributes?.symbol||null,displaySymbol:i.attributes?.display_symbol||null,base:i.attributes?.base||null,quote:i.attributes?.quote_currency||null,assetType:i.attributes?.asset_type||null}))}}N();var G1="https://relayscan.io",dy=new Set(["1h","12h","24h","7d"]);function Yc(e={}){return(e.baseUrl||process.env.RELAYSCAN_API_URL||G1).replace(/\/$/,"")}function py(e={}){let t=String(e.timespan||e.t||"24h").toLowerCase();if(!dy.has(t))throw new Error(`relayscan-mev: timespan must be one of ${[...dy].join(", ")}`);return t}function K1(e={}){let t=e.date||e.day;if(t==null)return new Date(Date.now()-864e5).toISOString().slice(0,10);let n=String(t).trim();if(!/^\d{4}-\d{2}-\d{2}$/.test(n))throw new Error("relayscan-mev: date must be YYYY-MM-DD");return n}async function Xc(e={},t={}){return y(`${Yc(t)}/overview/json?t=${py(e)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function my(e={},t={}){return y(`${Yc(t)}/builder-profit/json?t=${py(e)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function fy(e={},t={}){let n=K1(e);return y(`${Yc(t)}/stats/day/${n}/json`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??25e3})}async function hy(e={}){let t=await Xc({timespan:"1h"},e);return{ok:Array.isArray(t?.relays)&&t.relays.length>0,provider:"relayscan-mev",relays:Array.isArray(t?.relays)?t.relays.length:0}}N();var X1="https://extra-api.sanctum.so",Q1=30,J1=["jitoSOL","mSOL","bSOL","INF","hSOL","bonkSOL","jupSOL","dSOL"];function Qc(e={}){return String(e.baseUrl||process.env.SANCTUM_API_URL||X1).replace(/\/$/,"")}function gy(e,t="lst"){let n=String(e??"").trim();if(!n||/[?&=\s]/.test(n))throw new Error(`sanctum-lst: ${t} must be an LST symbol or mint`);return n}function Z1(e,t){let n=[];for(let r=0;r<e.length;r+=t)n.push(e.slice(r,r+t));return n}async function jt(e,t,n={}){let r={},o={};for(let i of Z1(t,Q1)){let s=new URL(`${Qc(n)}/v1/${e}`);for(let l of i)s.searchParams.append("lst",l);let a=await y(s.toString(),{fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs??2e4}),c=a?.apys||a?.tvls||a?.solValues||{};Object.assign(r,c),Object.assign(o,a?.errs||{})}return{values:r,errs:o}}async function yy(e={}){try{let[t,n]=await Promise.all([y(`${Qc(e)}/v1/lsts`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??15e3}),jt("apy/inception",["jitoSOL"],e)]),r=Array.isArray(t?.lsts)?t.lsts:[];return{ok:r.length>0&&Number.isFinite(Number(n.values.jitoSOL)),provider:"sanctum-lst",lstCount:r.length,jitoSolApyInception:Number(n.values.jitoSOL)??null,exec:!1}}catch(t){return{ok:!1,provider:"sanctum-lst",error:String(t?.message||t),exec:!1}}}async function Jc(e={},t={}){let n=await y(`${Qc(t)}/v1/lsts`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4}),r=(Array.isArray(n?.lsts)?n.lsts:[]).map(i=>({symbol:i.symbol||null,name:i.name||null,mint:i.mint||null,decimals:i.decimals??null,pool:i.pool?.pool||null,poolProgram:i.pool?.program||null,voteAccount:i.pool?.vote_account||null,logoUri:i.logo_uri||null}));if(e.symbol){let i=String(e.symbol).toLowerCase();r=r.filter(s=>String(s.symbol||"").toLowerCase()===i||s.mint===e.symbol)}let o=Number(e.limit);return Number.isFinite(o)&&o>0&&(r=r.slice(0,o)),{provider:"sanctum-lst",chain:"solana-mainnet-beta",count:r.length,lsts:r}}async function by(e={},t={}){let n=e.lsts||e.symbols||null;e.all===!0&&(n=(await Jc({},t)).lsts.map(c=>c.symbol).filter(Boolean)),(!Array.isArray(n)||!n.length)&&(n=J1);let r=[...new Set(n.map(a=>gy(a,"lsts[]")))],[o,i]=await Promise.all([jt("apy/latest",r,t),jt("apy/inception",r,t)]),s=r.map(a=>{let c=Number(o.values[a]),l=Number(i.values[a]);return{lst:a,apyLatest:Number.isFinite(c)?c:null,apyLatestPct:Number.isFinite(c)?c*100:null,apyInception:Number.isFinite(l)?l:null,apyInceptionPct:Number.isFinite(l)?l*100:null,error:o.errs[a]||i.errs[a]||null}});return s.sort((a,c)=>(c.apyInception??-1)-(a.apyInception??-1)),{provider:"sanctum-lst",chain:"solana-mainnet-beta",count:s.length,apys:s,byLst:Object.fromEntries(s.map(a=>[a.lst,a]))}}async function wy(e={},t={}){let n=gy(e.lst||e.mint||e.symbol,"lst"),[r,o,i,s]=await Promise.all([jt("apy/latest",[n],t),jt("apy/inception",[n],t),jt("tvl/current",[n],t).catch(()=>({values:{},errs:{}})),jt("sol-value/current",[n],t).catch(()=>({values:{},errs:{}}))]),a=Number(r.values[n]),c=Number(o.values[n]),l=r.errs[n]||o.errs[n]||null;if(!Number.isFinite(a)&&!Number.isFinite(c))throw new Error(`sanctum-lst: no APY for ${n}${l?` (${JSON.stringify(l)})`:""}`);let u=s.values[n];return{provider:"sanctum-lst",chain:"solana-mainnet-beta",lst:n,apyLatest:Number.isFinite(a)?a:null,apyLatestPct:Number.isFinite(a)?a*100:null,apyInception:Number.isFinite(c)?c:null,apyInceptionPct:Number.isFinite(c)?c*100:null,tvlLamports:i.values[n]??null,tvlSol:i.values[n]!=null?Number(i.values[n])/1e9:null,solValueLamports:u??null,solPerToken:u!=null?Number(u)/1e9:null,error:l}}N();var tP="https://api.save.finance",nP="4UpD2fh7xH3VP9QQaXtsS1YY3bxzWhtfpks7FatyKvdY",xy="CCpirWrgNuBVLdkP2haxLTbD6XqEgaYuVXixbbpxUB6",rP=/^[1-9A-HJ-NP-Za-km-z]{32,44}$/;function Zc(e={}){return String(e.baseUrl||process.env.SAVE_API_URL||process.env.SOLEND_API_URL||tP).replace(/\/$/,"")}function Sy(e,t="address"){let n=String(e??"").trim();if(!rP.test(n))throw new Error(`solend-lending: ${t} must be a base58 public key`);return n}function ky(e){let t=Number(e);return Number.isFinite(t)?t:null}function oP(e={}){return{address:e.address||null,name:e.name||null,description:e.description||"",isPrimary:!!e.isPrimary,isPermissionless:!!e.isPermissionless,hidden:!!e.hidden,owner:e.owner||null,authorityAddress:e.authorityAddress||null,lookupTableAddress:e.lookupTableAddress||null,reserveCount:Array.isArray(e.reserves)?e.reserves.length:0,reserves:(e.reserves||[]).map(t=>({address:t.address||null,symbol:t.liquidityToken?.symbol||null,name:t.liquidityToken?.name||null,mint:t.liquidityToken?.mint||null,decimals:t.liquidityToken?.decimals??null,collateralMint:t.collateralMintAddress||null,pythOracle:t.pythOracle||null,switchboardOracle:t.switchboardOracle||null,volume24h:t.liquidityToken?.volume24h??null}))}}function iP(e={}){let t=e.reserve||{},n=t.liquidity||{},r=t.collateral||{};return{address:e.address||t.address||null,lendingMarket:t.lendingMarket||null,mint:n.mintPubkey||null,mintDecimals:n.mintDecimals??null,supplyApyPct:ky(e.rates?.supplyInterest),borrowApyPct:ky(e.rates?.borrowInterest),cTokenExchangeRate:e.cTokenExchangeRate??null,availableAmount:n.availableAmount??null,borrowedAmountWads:n.borrowedAmountWads??null,marketPrice:n.marketPrice??null,collateralMint:r.mintPubkey||null,collateralTotalSupply:r.mintTotalSupply??null,rewards:e.rewards||[],lastUpdateSlot:t.lastUpdate?.slot??null,stale:t.lastUpdate?.stale===1,raw:e}}async function Ey(e={}){try{let t=await y(`${Zc(e)}/v1/reserves?ids=${xy}`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??15e3}),n=Array.isArray(t?.results)?t.results:[];return{ok:n.length>0,provider:"solend-lending",probeReserve:xy,reserves:n.length,exec:!1}}catch(t){return{ok:!1,provider:"solend-lending",error:String(t?.message||t),exec:!1}}}async function el(e={},t={}){let n=new URL(`${Zc(t)}/v1/markets/configs`);e.scope&&n.searchParams.set("scope",String(e.scope)),e.deployment&&n.searchParams.set("deployment",String(e.deployment));let r=await y(n.toString(),{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??(e.scope==="all"?45e3:2e4)}),o=(Array.isArray(r)?r:[]).map(oP);if(e.includeHidden!==!0&&(o=o.filter(s=>!s.hidden)),e.name){let s=String(e.name).toLowerCase();o=o.filter(a=>String(a.name||"").toLowerCase()===s)}let i=Number(e.limit);return Number.isFinite(i)&&i>0&&(o=o.slice(0,i)),{provider:"solend-lending",chain:"solana-mainnet-beta",scope:e.scope||"default",count:o.length,markets:o}}async function vy(e={},t={}){let n=[];if(e.ids||e.reserves)n=(Array.isArray(e.ids||e.reserves)?e.ids||e.reserves:String(e.ids||e.reserves).split(",")).map(a=>Sy(String(a).trim(),"reserve"));else{let s=Sy(e.market||e.marketAddress||nP,"market"),c=(await el({scope:"all",includeHidden:!0},t)).markets.find(l=>l.address===s);if(!c)throw new Error(`solend-lending: market ${s} not found`);n=c.reserves.map(l=>l.address).filter(Boolean)}if(!n.length)throw new Error("solend-lending: no reserves to query");let r=Number.isFinite(Number(e.limit))&&Number(e.limit)>0?Number(e.limit):50;n=n.slice(0,r);let o=await y(`${Zc(t)}/v1/reserves?ids=${n.join(",")}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??25e3}),i=(Array.isArray(o?.results)?o.results:[]).map((s,a)=>({...iP(s),address:s.address||s.reserve?.address||n[a]||null}));return{provider:"solend-lending",chain:"solana-mainnet-beta",requested:n.length,count:i.length,reserves:i}}function tl(e,t){let n;try{n=BigInt(e)}catch{throw new Error(`${t} must be a positive integer amount`)}if(n<=0n)throw new Error(`${t} must be a positive integer amount`);return n}function Vt(e,t,n,r){let o=Number(e);if(!Number.isInteger(o)||o<n||o>r)throw new Error(`${t} must be an integer between ${n} and ${r}`);return o}function Mr(e={}){if(!Number.isInteger(Number(e.chainId))||Number(e.chainId)<=0)throw new Error("strategy requires chainId");if(!String(e.tokenIn||"").trim()||!String(e.tokenOut||"").trim())throw new Error("strategy requires tokenIn and tokenOut");if(!String(e.taker||"").trim())throw new Error("strategy requires taker");return{chainId:Number(e.chainId),tokenIn:String(e.tokenIn),tokenOut:String(e.tokenOut),taker:String(e.taker),total:tl(e.amount,"amount")}}function nl(e,t){let n=t.map(s=>BigInt(s)),r=n.reduce((s,a)=>s+a,0n);if(r<=0n)throw new Error("weights must total above zero");let o=n.map(s=>e*s/r),i=e-o.reduce((s,a)=>s+a,0n);for(let s=0;i>0n;s=(s+1)%o.length)o[s]+=1n,i-=1n;return o}function Ur(e,t,n,r={}){return{kind:"execution-strategy-plan",strategy:t,chainId:e.chainId,tokenIn:e.tokenIn,tokenOut:e.tokenOut,taker:e.taker,totalAmount:String(e.total),slices:n,executable:!1,signs:!1,broadcasts:!1,requiresFreshQuotePerSlice:!0,requiresPolicyCheckPerSlice:!0,requiresSimulationPerSlice:!0,requiresUserConfirmationPerSlice:!0,receiptRequiredPerSlice:!0,...r}}function rl(e,t,n=Date.now()){let r=Math.floor(t/e.length);return e.map((o,i)=>({index:i+1,amount:String(o),offsetSec:i*r,executeAfter:new Date(n+i*r*1e3).toISOString()}))}function aP(e={},t={}){let n=Mr(e),r=Vt(e.slices??10,"slices",2,100),o=Vt(e.durationSec??3600,"durationSec",r,604800),i=nl(n.total,Array(r).fill(1));return Ur(n,"TWAP",rl(i,o,t.nowMs),{durationSec:o})}function cP(e={},t={}){let n=Mr(e);if(!Array.isArray(e.volumeProfile)||e.volumeProfile.length<2||e.volumeProfile.length>100)throw new Error("volumeProfile must contain 2-100 positive weights");let r=e.volumeProfile.map(c=>{let l=Number(c);if(!Number.isFinite(l)||l<=0)throw new Error("volumeProfile must contain positive weights");return BigInt(Math.round(l*1e6))}),o=Vt(e.durationSec??3600,"durationSec",r.length,604800),i=nl(n.total,r),s=r.reduce((c,l)=>c+l,0n),a=rl(i,o,t.nowMs).map((c,l)=>({...c,volumeWeightBps:Number(r[l]*10000n/s)}));return Ur(n,"VWAP",a,{durationSec:o,requiresLiveVolumeValidation:!0})}function lP(e={}){let t=Mr(e),n=Vt(e.participationBps,"participationBps",1,1e4);if(!Array.isArray(e.observedMarketVolumes)||e.observedMarketVolumes.length===0||e.observedMarketVolumes.length>100)throw new Error("observedMarketVolumes must contain 1-100 positive integer amounts");let r=t.total,o=[];for(let[i,s]of e.observedMarketVolumes.entries()){let a=tl(s,"observedMarketVolumes"),c=a*BigInt(n)/10000n,l=c>r?r:c;if(l>0n&&o.push({index:i+1,amount:String(l),observedMarketVolume:String(a)}),r-=l,r===0n)break}return Ur(t,"POV",o,{participationBps:n,residualAmount:String(r),requiresLiveVolumeValidation:!0})}function uP(e={}){let t=Mr(e),n=tl(e.displayAmount,"displayAmount");if(n>t.total)throw new Error("displayAmount cannot exceed total amount");let r=[],o=t.total;for(;o>0n;){if(r.length>=100)throw new Error("iceberg requires more than 100 refills");let i=o>n?n:o;r.push({index:r.length+1,amount:String(i),displayAmount:String(n)}),o-=i}return Ur(t,"ICEBERG",r,{displayAmount:String(n),refillCount:r.length-1})}function dP(e={},t={}){let n=Mr(e),r=Vt(e.slices??10,"slices",2,100),o=Vt(e.durationSec??3600,"durationSec",r,604800),i=Vt(e.urgencyBps??5e3,"urgencyBps",1,1e4),s=Array.from({length:r},(c,l)=>{let u=Math.floor(i*l/Math.max(1,r-1));return BigInt(Math.max(1,1e4-u))}),a=nl(n.total,s);return Ur(n,"IS",rl(a,o,t.nowMs),{durationSec:o,urgencyBps:i})}function Ay(e={},t={}){let n=String(e.strategy||"").trim().toUpperCase();if(n==="TWAP")return aP(e,t);if(n==="VWAP")return cP(e,t);if(n==="POV")return lP(e,t);if(n==="ICEBERG")return uP(e,t);if(n==="IS"||n==="IMPLEMENTATION SHORTFALL")return dP(e,t);throw new Error("strategy must be TWAP, VWAP, POV, ICEBERG, or IS")}function Iy(){return{ok:!0,provider:"execution-strategies",strategies:["TWAP","VWAP","POV","ICEBERG","IS"],execution:"plan-only",externalProtocol:!1}}var mP={"hl-info":{health:e=>Ku(e),allMids:e=>Xe(e),l2Book:(e,t={})=>mo(t.coin,e),outcomeMeta:e=>sr(e),clearinghouse:(e,t={})=>fo(t.user,e),userFills:(e,t={})=>Yu(t.user,e),meta:e=>ho(e),metaAndAssetCtxs:e=>nn(e),candleSnapshot:(e,t={})=>rn(t,e),openOrders:(e,t={})=>Qu(t.user,e),frontendOpenOrders:(e,t={})=>Ju(t.user,e),userState:(e,t={})=>go(t.user,e),spotMeta:e=>yo(e)},"hl-vaults":{health:e=>nd(e),summaries:(e,t={})=>Vs(t,e),details:(e,t={})=>bo(t,e),userEquities:(e,t={})=>zs(t,e),tracker:(e,t={})=>Ws(t,e)},"poly-public":{health:e=>od(e),time:e=>Gs(e),markets:(e,t={})=>id(t,e),book:(e,t={})=>sd(t.tokenId,e),midpoint:(e,t={})=>ad(t.tokenId,e),spread:(e,t={})=>cd(t.tokenId,e),price:(e,t={})=>ld(t.tokenId,{side:t.side},e),events:(e,t={})=>ud(t,e)},"evm-rpc":{health:(e,t={})=>Qn(t.chainId??1,e),healthAll:(e,t={})=>fu({...e,chainIds:t.chainIds}),blockNumber:(e,t={})=>eo(t.chainId??1,e),chainId:(e,t={})=>pu(t.chainId??1,e),getBalance:(e,t={})=>Zt(t.chainId??1,t.address,e),call:(e,t={})=>L(t.chainId??1,t.method,t.params||[],e),erc20Allowance:(e,t={})=>mu(t,e),erc20Balance:(e,t={})=>to(t,e),transactionReceipt:(e,t={})=>no(t,e)},portfolio:{health:e=>ph(e),balances:(e,t={})=>yi(t,e),snapshot:(e,t={})=>Nh(t,e),history:(e,t={})=>pc(t,e),valueGraph:(e,t={})=>Oh(t,e)},"nft-portfolio":{health:e=>wh(e),inventory:(e,t={})=>Cn(t,e),gallery:(e,t={})=>Eh(t,e),pnl:(e,t={})=>kh(t,e),prepareList:(e,t={})=>xh(t,e),traitSnipe:(e,t={})=>Sh(t,e)},"contract-risk":{health:e=>Rh(e),scan:(e,t={})=>Ft(t,e)},"evm-token-sniper":{health:e=>Mh(e),scan:(e,t={})=>Lh(t,e)},"evm-simulate":{health:e=>Bh(e),simulate:(e,t={})=>Tr(t,e)},"nft-mint":{health:e=>Fh(e),discover:(e,t={})=>vi(t,e),prepare:(e,t={})=>hc(t,e),priceGas:(e,t={})=>Ei(t,e),createTrigger:(e,t={})=>qh(t,e),checkOpen:(e,t={})=>Hh(t,e)},"solana-rpc":{health:e=>pd(e),latestBlockhash:(e,t={})=>Ys(t,e),getBalance:(e,t={})=>wo(t,e),tokenAccounts:(e,t={})=>lr(t,e),simulate:(e,t={})=>md(t,e)},"bitcoin-esplora":{health:e=>fd(e),tipHeight:e=>hd(e),fees:e=>gd(e),address:(e,t={})=>So(t,e),utxos:(e,t={})=>yd(t,e),tx:(e,t={})=>bd(t,e),decode:(e,t={})=>wd(t,e)},"bitcoin-meta":{health:e=>Ed(e),runeBalances:(e,t={})=>Eo(t,e),inscriptions:(e,t={})=>an(t,e),inscriptionInfo:(e,t={})=>vd(t,e),inscriptionChildren:(e,t={})=>Ad(t,e),ordBlockInfo:(e,t={})=>Id(t,e)},satflow:{health:e=>Pd(e),collectionFloors:(e,t={})=>Cd(t,e),collectionStats:(e,t={})=>Td(t,e),item:(e,t={})=>Nd(t,e),walletContents:(e,t={})=>Ao(t,e),floorListings:(e,t={})=>Od(t,e),preparePurchase:(e,t={})=>$d(t,e),prepareList:(e,t={})=>Io(t,e)},jupiter:{health:e=>Hd(e),venues:(e,t={})=>qd(t,e),quote:(e,t={})=>Co(t,e),prepare:(e,t={})=>jd(t,e)},defillama:{health:e=>zd(e),prices:(e,t={})=>Oe(t.coins||[],e),pricesBySymbol:(e,t={})=>Yd(t.symbols,e),protocols:e=>To(e),yields:(e,t={})=>Wd(t,e),stablecoins:(e,t={})=>Gd(t,e),dexVolumes:(e,t={})=>Kd(t,e)},lifi:{health:e=>rp(e),quote:(e,t={})=>lt(t,e),prepare:(e,t={})=>op(t,e),chains:e=>ip(e)},dexscreener:{health:e=>hu(e),token:(e,t={})=>Nt(t.address||t.tokenAddress,e),search:(e,t={})=>Jn(t.q||t.query,e),pair:(e,t={})=>gu(t.chainId,t.pairAddress,e)},"uniswap-v3":{health:(e,t={})=>Tu({...e,chainId:t.chainId??8453}),quote:(e,t={})=>it(t,e),prepare:(e,t={})=>Cu(t,e),quotePath:(e,t={})=>Pu(t,e),ethUsdc:(e,t={})=>Os(t,e),chains:()=>Nu()},"uniswap-v4":{health:(e,t={})=>Uu({...e,chainId:t.chainId??8453}),quote:(e,t={})=>co(t,e),chains:()=>Mu()},aerodrome:{health:(e,t={})=>mp({...e,chainId:t.chainId??8453}),quote:(e,t={})=>$o(t,e),prepare:(e,t={})=>pp(t,e),chains:()=>fp()},zerox:{health:e=>bp(e),price:(e,t={})=>ua(t,e),quote:(e,t={})=>Rt(t,e),prepare:(e,t={})=>wp(t,e)},across:{health:e=>da(e),suggestedFees:(e,t={})=>Mo(t,e)},hop:{health:e=>pa(e),quote:(e,t={})=>Uo(t,e)},relay:{health:e=>ma(e),quote:(e,t={})=>dr(t,e),prepare:(e,t={})=>fa(t,e)},cowswap:{health:e=>_p(e),quote:(e,t={})=>dt(t,e),prepareOrder:(e,t={})=>Pp(t,e),order:(e,t={})=>Tp(t,e),status:(e,t={})=>Cp(t,e),chains:()=>Np()},oneinch:{health:e=>Rp(e),quote:(e,t={})=>fr(t,e),prepare:(e,t={})=>$p(t,e),approveSpender:(e,t={})=>xa(t,e)},"hl-ws":{health:e=>Lp(e),allMids:e=>Mp(e),l2Book:(e,t={})=>Up(t.coin,e),snapshot:(e,t={})=>hr(t.subscription||t,e)},"poly-ws":{health:(e,t={})=>Bp({...e,assetId:t.assetId}),book:(e,t={})=>Dp(t.assetId||t.tokenId,e),snapshot:(e,t={})=>qo(t.assetIds||t.assets_ids||[t.assetId],e)},"opensea-nft":{health:e=>zp(e),collection:(e,t={})=>Vo(t.slug,e),floor:(e,t={})=>Wp(t.slug,e),accountNfts:(e,t={})=>gr(t,e),accountPnl:(e,t={})=>zo(t,e),prepareList:(e,t={})=>Wo(t,e)},"hl-outcome":{list:e=>Pm(e),prepareOrder:(e,t={})=>Cm(t,e),prepareCancel:(e,t={})=>Tm(t,e)},"protocol-templates":{health:()=>({ok:!0,templates:si().map(e=>e.id),firmAudit:!1}),list:()=>si(),gate:(e,t={})=>Da(t.templateId||t.id,e),prepareDeploy:(e,t={})=>Zm(t,e)},"poly-clob":{prepareOrder:(e,t={})=>Mm(t||{})},"hl-perps":{health:e=>Ta(e),assetInfo:(e,t={})=>Lt(t,e),prepareOrder:(e,t={})=>Sr(t,e),prepareCancel:(e,t={})=>ei(t,e),prepareLeverage:(e,t={})=>Am(t,e),prepareIsolatedMargin:(e,t={})=>Im(t,e),prepareBracket:(e,t={})=>_m(t,e),prepareBuilderApproval:(e,t={})=>vm(t,e)},"hl-markets":{health:e=>Ta(e),markets:(e,t={})=>Yo(t,e),leaderboards:(e,t={})=>pm(t,e),coin:(e,t={})=>mm(t,e),spot:(e,t={})=>fm(t,e)},"magiceden-sol":{health:e=>Jp(e),stats:(e,t={})=>ka(t,e),listings:(e,t={})=>em(t,e),tokenListings:(e,t={})=>tm(t,e),prepareBuy:(e,t={})=>nm(t,e),prepareList:(e,t={})=>Go(t,e),prepareMint:(e,t={})=>rm(t,e)},"hl-staking":{health:e=>im(e),validators:e=>Aa(e),delegatorSummary:(e,t={})=>Ia(t,e),delegations:(e,t={})=>_a(t,e),rewards:(e,t={})=>sm(t,e),history:(e,t={})=>am(t,e),preflight:(e,t={})=>dm(t,e),prepareStakeDeposit:(e,t={})=>cm(t,e),prepareStakeWithdraw:(e,t={})=>lm(t,e),prepareDelegate:(e,t={})=>um(t,e)},"hyperevm-dex":{health:e=>Kp(e),search:(e,t={})=>Yp(t.q||t.query||"HYPE",e),token:(e,t={})=>Xp(t.address||t.tokenAddress,e)},geckoterminal:{health:e=>rf(e),networks:(e,t={})=>Fa(t,e),pool:(e,t={})=>ef(t,e),token:(e,t={})=>tf(t,e),ohlcv:(e,t={})=>nf(t,e)},curve:{health:e=>yf(e),openapi:e=>gf(e),pools:(e,t={})=>Ha(t,e),quote:(e,t={})=>ja(t,e),prepare:(e,t={})=>bf(t,e)},gmx:{health:e=>Cf(e),tickers:(e,t={})=>ui(t,e),markets:(e,t={})=>_f(t,e),marketsInfo:(e,t={})=>za(t,e),tokens:(e,t={})=>Pf(t,e),prepareOrder:(e,t={})=>Rf(t,e),positions:(e,t={})=>Tf(t,e),orderStatus:(e,t={})=>Nf(t,e),verifyOrder:(e,t={})=>Of(t,e)},morpho:{health:e=>Uf(e),markets:(e,t={})=>Mf(t,e),vaults:(e,t={})=>Ka(t,e),prepareVault:(e,t={})=>Bf(t,e)},balancer:{health:e=>Wf(e),pools:(e,t={})=>zf(t,e),quote:(e,t={})=>Qa(t,e),prepare:(e,t={})=>Gf(t,e)},pendle:{health:e=>Yf(e),markets:(e,t={})=>Za(t,e),quote:(e,t={})=>Xf(t,e),prepare:(e,t={})=>ec(t,e)},odos:{health:e=>eh(e),chains:e=>nc(e),quote:(e,t={})=>Jf(t,e),prepare:(e,t={})=>Zf(t,e)},blockscout:{health:e=>ch(e),stats:(e,t={})=>ic(t,e),address:(e,t={})=>oh(t,e),token:(e,t={})=>ih(t,e)},paraswap:{health:e=>Vh(e),tokens:(e,t={})=>yc(t,e),price:(e,t={})=>yt(t,e),quote:(e,t={})=>yt(t,e),prepare:(e,t={})=>jh(t,e)},rfq:{health:e=>a0(e),intent:(e,t={})=>i0(t,e),quote:(e,t={})=>s0(t,e)},"polygon-staking":{health:e=>L0(e),validators:(e,t={})=>R0(t,e),validatorDetail:(e,t={})=>$0(t,e)},"aave-v3":{health:e=>D0(e),markets:(e,t={})=>M0(t,e),marketReserves:(e,t={})=>U0(t,e),chains:e=>B0(e)},"babylon-staking":{health:e=>q0(e),stats:e=>H0(e),finalityProviders:e=>j0(e),delegations:(e,t={})=>V0(t,e)},"bisq-markets":{health:e=>W0(e),markets:e=>G0(e),ticker:(e,t={})=>K0(t,e),trades:(e,t={})=>Y0(t,e)},"bob-rootstock":{health:(e,t={})=>Q0(t.chainId,e),stats:(e,t={})=>Rc(t,e),addressInfo:(e,t={})=>J0(t,e),tokenBalances:(e,t={})=>Z0(t,e)},"braiins-insights":{health:e=>eg(e),priceStats:e=>tg(e),poolStats:e=>ng(e)},"cow-protocol":{health:e=>ug(e),auction:e=>ag(e),openOrders:(e,t={})=>cg(t,e),recentTrades:(e,t={})=>lg(t,e)},"hiro-stacks":{health:e=>dg(e),networkInfo:e=>pg(e),stackingInfo:e=>mg(e),poxCycles:e=>fg(e),blocks:(e,t={})=>hg(t,e)},"jito-mev":{health:e=>bg(e),recentBundles:(e,t={})=>wg(t,e),tipFloor:e=>xg(e)},"kamino-strategies":{health:e=>kg(e),strategies:(e,t={})=>Eg(t,e),strategyMetrics:(e,t={})=>vg(t,e)},"liquid-esplora":{health:e=>Pg(e),tipHeight:e=>Cg(e),addressInfo:(e,t={})=>Tg(t,e),assetInfo:(e,t={})=>Ng(t,e)},"magiceden-ordinals":{health:e=>$g(e),collectionStat:(e,t={})=>Lg(t,e)},"mempool-lightning":{health:e=>Ug(e),statistics:e=>Bg(e),nodeRankings:(e,t={})=>Dg(t,e),nodeCountries:e=>Fg(e)},"mempool-mining":{health:e=>jg(e),difficulty:e=>Vg(e),poolShare:(e,t={})=>zg(t,e),hashrate:(e,t={})=>Wg(t,e),rewardStats:(e,t={})=>Gg(t,e)},"meteora-dlmm":{health:e=>Xg(e),pools:(e,t={})=>Qg(t,e),poolSearch:(e,t={})=>Jg(t,e)},"ordinals-runes":{health:e=>ey(e),blockHeight:e=>ty(e),blockInfo:(e,t={})=>ny(t,e),satInfo:(e,t={})=>ry(t,e),runeInfo:(e,t={})=>oy(t,e)},"pyth-price-feeds":{health:e=>ay(e),latestPrice:(e,t={})=>cy(t,e),latestPrices:(e,t={})=>ly(t,e),feedDirectory:e=>uy(e)},"relayscan-mev":{health:e=>hy(e),overview:(e,t={})=>Xc(t,e),builderProfit:(e,t={})=>my(t,e),dailyStats:(e,t={})=>fy(t,e)},"sanctum-lst":{health:e=>yy(e),lstList:e=>Jc(e),apyAll:e=>by(e),apyIndividual:(e,t={})=>wy(t,e)},"solend-lending":{health:e=>Ey(e),markets:e=>el(e),reserves:(e,t={})=>vy(t,e)},"execution-strategies":{health:()=>Iy(),plan:(e,t={})=>Ay(t)},"across-bridge":{health:e=>c0(e),pools:(e,t={})=>l0(t,e),suggestedFees:(e,t={})=>u0(t,e)},"beefy-yields":{health:e=>d0(e),apy:(e,t={})=>p0(t,e),apyBreakdown:e=>m0(e)},"birdeye-tokens":{health:e=>h0(e),tokenList:(e,t={})=>g0(t,e)},"celestia-da":{health:e=>y0(e),stats:e=>b0(e),blockStats:(e,t={})=>w0(t,e)},"das-assets":{health:e=>x0(e),assetsByOwner:(e,t={})=>S0(t,e),searchAssets:(e,t={})=>k0(t,e),assetProof:(e,t={})=>E0(t,e)},"l2beat-tvl":{health:e=>v0(e),tvl:(e,t={})=>A0(t,e),activity:(e,t={})=>I0(t,e)},"spark-lend":{health:e=>_0(e),markets:(e,t={})=>P0(t,e)},"symbiotic-restaking":{health:e=>C0(e),vaults:(e,t={})=>T0(t,e),vaultDetail:(e,t={})=>N0(t,e)}},_y=new Set(["prepareBuilderApproval","prepareBracket","prepareIsolatedMargin","prepareLeverage","prepareCancel","prepareOrder","preparePurchase","prepareList","prepareSell","prepareBuy","prepareMint","prepare","prepareStakeDeposit","prepareStakeWithdraw","prepareDelegate","prepareSwap","prepareTransfer","createOrder","cancelOrder"]),Py=new Set(["hl-exec"]);function fP(e){return Py.has(String(e||""))}function hP(e,t,n={}){let r=String(t||""),o=`${e}.${r}`;if(Py.has(e))throw new Error(`data plane forbidden execution provider: ${e}`);let i=ir().find(s=>s.id===e);if(/sign|execute|broadcast|submit|send|write|place/i.test(r)&&!_y.has(r))throw new Error(`data plane forbidden op: ${o}`);if(i&&Array.isArray(i.ops)&&i.ops.length>0&&!i.ops.includes(r))throw new Error(`data plane: provider ${e} does not support op ${r}`);if(_y.has(r)&&n&&typeof n=="object"&&Object.defineProperty(n,"__oracleStateCreating",{value:!0,enumerable:!1,configurable:!0}),e==="evm-rpc"&&r==="call"){let s=String(n?.method||"").trim();if(!new Set(["eth_call","eth_getBalance","eth_blockNumber","eth_chainId","eth_getCode","eth_getLogs","eth_getTransactionByHash","eth_getTransactionReceipt","eth_getBlockByNumber","eth_getBlockByHash","eth_feeHistory","eth_gasPrice","eth_maxPriorityFeePerGas","net_version","web3_clientVersion"]).has(s))throw new Error(`data plane allows only read-only JSON-RPC methods through evm-rpc.call: ${s||"<missing>"}`)}}async function S(e,t,n={},r={}){if(fP(e))throw new Error(`${e} is an execution provider: it signs and submits with a real key. dataCall() is the public read plane and will not route to it.`);hP(e,t,n);let o=po(e);if(!o)throw new Error(`Unknown data provider: ${e}`);if(!o.ops.includes(t))throw new Error(`Provider ${e} does not support op '${t}' (has: ${o.ops.join(", ")})`);let i=mP[e];if(!i||typeof i[t]!="function")throw new Error(`No client implementation for ${e}.${t}`);return i[t](r,n)}async function Cy({providers:e,fetchImpl:t,timeoutMs:n,includeRpc:r,includeWs:o,concurrency:i,healthCall:s}={}){let a=e||ir().map(d=>d.id);!o&&!e&&(a=a.filter(d=>d!=="hl-ws"&&d!=="poly-ws"));let c={fetchImpl:t,timeoutMs:n??8e3},l=typeof s=="function"?s:(d,p,m)=>S(d,"health",p,m),u={};return await Jt(a,i??8,async d=>{if(!po(d)){u[d]={ok:!1,ms:0,reason:"transport",error:"unknown provider"};return}let p=d==="evm-rpc"?{chainId:1}:{},m=await ne(()=>l(d,p,c));if(!m.ok){u[d]={ok:!1,ms:m.ms,reason:"transport",error:m.error};return}let f=m.data;if(f&&typeof f=="object"&&f.ok===!1){u[d]={ok:!1,ms:m.ms,reason:"provider",error:f.error||f.message||"provider reported unhealthy",detail:f};return}u[d]={ok:!0,ms:m.ms,detail:f}}),{when:new Date().toISOString(),plane:"data",exec:!1,providers:u}}function Ty(){return ir().map(e=>({id:e.id,venue:e.venue,chainIds:e.chainIds,auth:e.auth,ops:e.ops,execution:e.execution||"read-only",description:e.description}))}var gP={catalog:Ty,health:Cy,call:S,hl:{health:e=>S("hl-info","health",{},e),allMids:e=>S("hl-info","allMids",{},e),l2Book:(e,t)=>S("hl-info","l2Book",{coin:e},t),outcomeMeta:e=>S("hl-info","outcomeMeta",{},e),clearinghouse:(e,t)=>S("hl-info","clearinghouse",{user:e},t),userFills:(e,t)=>S("hl-info","userFills",{user:e},t),meta:e=>S("hl-info","meta",{},e),metaAndAssetCtxs:e=>S("hl-info","metaAndAssetCtxs",{},e),candleSnapshot:(e,t)=>S("hl-info","candleSnapshot",e||{},t),openOrders:(e,t)=>S("hl-info","openOrders",{user:e},t),userState:(e,t)=>S("hl-info","userState",{user:e},t),spotMeta:e=>S("hl-info","spotMeta",{},e),vaults:{health:e=>S("hl-vaults","health",{},e),summaries:(e,t)=>S("hl-vaults","summaries",e||{},t),details:(e,t)=>S("hl-vaults","details",e||{},t),mine:(e,t)=>S("hl-vaults","userEquities",{user:e},t),track:(e,t)=>S("hl-vaults","tracker",e||{},t)},staking:{health:e=>S("hl-staking","health",{},e),validators:e=>S("hl-staking","validators",{},e),summary:(e,t)=>S("hl-staking","delegatorSummary",{user:e},t),delegations:(e,t)=>S("hl-staking","delegations",{user:e},t),rewards:(e,t)=>S("hl-staking","rewards",{user:e},t),history:(e,t)=>S("hl-staking","history",{user:e},t),preflight:(e,t)=>S("hl-staking","preflight",{user:e},t),prepareStake:(e,t)=>S("hl-staking","prepareStakeDeposit",e||{},t),prepareUnstake:(e,t)=>S("hl-staking","prepareStakeWithdraw",e||{},t),prepareDelegate:(e,t)=>S("hl-staking","prepareDelegate",e||{},t)}},poly:{health:e=>S("poly-public","health",{},e),time:e=>S("poly-public","time",{},e),markets:(e,t)=>S("poly-public","markets",e||{},t),book:(e,t)=>S("poly-public","book",{tokenId:e},t),midpoint:(e,t)=>S("poly-public","midpoint",{tokenId:e},t),spread:(e,t)=>S("poly-public","spread",{tokenId:e},t),price:(e,t,n)=>S("poly-public","price",{tokenId:e,side:t},n),events:(e,t)=>S("poly-public","events",e||{},t)},polyClob:{prepareOrder:(e,t)=>S("poly-clob","prepareOrder",e||{},t)},rpc:{health:(e,t)=>S("evm-rpc","health",{chainId:e},t),healthAll:(e,t)=>S("evm-rpc","healthAll",e||{},t),blockNumber:(e,t)=>S("evm-rpc","blockNumber",{chainId:e},t),getBalance:(e,t,n)=>S("evm-rpc","getBalance",{chainId:e,address:t},n),call:(e,t,n,r)=>S("evm-rpc","call",{chainId:e,method:t,params:n},r)},evmSniper:{health:e=>S("evm-token-sniper","health",{},e),scan:(e,t)=>S("evm-token-sniper","scan",e||{},t)},portfolio:{balance:(e,t)=>S("portfolio","balances",e||{},t),snapshot:(e,t)=>S("portfolio","snapshot",e||{},t),history:(e,t)=>S("portfolio","history",e||{},t),valueGraph:(e,t)=>S("portfolio","valueGraph",e||{},t)},nft:{inventory:(e,t)=>S("nft-portfolio","inventory",e||{},t),gallery:(e,t)=>S("nft-portfolio","gallery",e||{},t),pnl:(e,t)=>S("nft-portfolio","pnl",e||{},t),prepareList:(e,t)=>S("nft-portfolio","prepareList",e||{},t),traitSnipe:(e,t)=>S("nft-portfolio","traitSnipe",e||{},t),floor:(e,t)=>S("opensea-nft","floor",{slug:e},t),collection:(e,t)=>S("opensea-nft","collection",{slug:e},t)},solana:{health:e=>S("solana-rpc","health",{},e),latestBlockhash:(e,t)=>S("solana-rpc","latestBlockhash",e||{},t),balance:(e,t)=>S("solana-rpc","getBalance",{address:e},t),tokenAccounts:(e,t)=>S("solana-rpc","tokenAccounts",e||{},t),simulate:(e,t)=>S("solana-rpc","simulate",e||{},t),jupiterQuote:(e,t)=>S("jupiter","quote",e||{},t),jupiterPrepare:(e,t)=>S("jupiter","prepare",e||{},t),nftStats:(e,t)=>S("magiceden-sol","stats",e||{},t),nftListings:(e,t)=>S("magiceden-sol","listings",e||{},t),nftTokenListings:(e,t)=>S("magiceden-sol","tokenListings",e||{},t),nftPrepareBuy:(e,t)=>S("magiceden-sol","prepareBuy",e||{},t),nftPrepareList:(e,t)=>S("magiceden-sol","prepareList",e||{},t),nftPrepareMint:(e,t)=>S("magiceden-sol","prepareMint",e||{},t)},bitcoin:{health:e=>S("bitcoin-esplora","health",{},e),tipHeight:e=>S("bitcoin-esplora","tipHeight",{},e),fees:e=>S("bitcoin-esplora","fees",{},e),address:(e,t)=>S("bitcoin-esplora","address",{address:e},t),utxos:(e,t)=>S("bitcoin-esplora","utxos",{address:e},t),tx:(e,t)=>S("bitcoin-esplora","tx",{txid:e},t),decode:(e,t)=>S("bitcoin-esplora","decode",e||{},t),metaHealth:e=>S("bitcoin-meta","health",{},e),runeBalances:(e,t)=>S("bitcoin-meta","runeBalances",{address:e},t),inscriptions:(e,t)=>S("bitcoin-meta","inscriptions",{address:e},t),satflowHealth:e=>S("satflow","health",{},e),satflowFloors:(e,t)=>S("satflow","collectionFloors",e||{},t),satflowWallet:(e,t)=>S("satflow","walletContents",{address:e},t)},prices:{health:e=>S("defillama","health",{},e),current:(e,t)=>S("defillama","prices",{coins:e},t),bySymbol:(e,t)=>S("defillama","pricesBySymbol",{symbols:e},t),protocols:e=>S("defillama","protocols",{},e)},lifi:{health:e=>S("lifi","health",{},e),quote:(e,t)=>S("lifi","quote",e||{},t),chains:e=>S("lifi","chains",{},e)},dex:{health:e=>S("dexscreener","health",{},e),token:(e,t)=>S("dexscreener","token",{address:e},t),search:(e,t)=>S("dexscreener","search",{q:e},t),pair:(e,t,n)=>S("dexscreener","pair",{chainId:e,pairAddress:t},n)},uni:{health:(e,t)=>S("uniswap-v3","health",e||{},t),quote:(e,t)=>S("uniswap-v3","quote",e||{},t),quotePath:(e,t)=>S("uniswap-v3","quotePath",e||{},t),ethUsdc:(e,t)=>S("uniswap-v3","ethUsdc",e||{},t),chains:e=>S("uniswap-v3","chains",{},e)},univ4:{health:(e,t)=>S("uniswap-v4","health",e||{},t),quote:(e,t)=>S("uniswap-v4","quote",e||{},t),chains:e=>S("uniswap-v4","chains",{},e)},bridges:{across:(e,t)=>S("across","suggestedFees",e||{},t),hop:(e,t)=>S("hop","quote",e||{},t),relay:(e,t)=>S("relay","quote",e||{},t)},cow:{quote:(e,t)=>S("cowswap","quote",e||{},t)},hlWs:{allMids:e=>S("hl-ws","allMids",{},e),l2Book:(e,t)=>S("hl-ws","l2Book",{coin:e},t)},polyWs:{book:(e,t)=>S("poly-ws","book",{assetId:e},t)}};var Le=Object.freeze({FULL:"FULL",NO_GAS:"NO_GAS",FAILED:"FAILED"}),Oy={1:"coingecko:ethereum",10:"coingecko:ethereum",56:"coingecko:binancecoin",137:"coingecko:matic-network",8453:"coingecko:ethereum",42161:"coingecko:ethereum",43114:"coingecko:avalanche-2",999:"coingecko:ethereum"},Br=e=>{try{return e==null||e===""?null:BigInt(String(e).split(".")[0])}catch{return null}};function Ny(e){let{source:t,amountOut:n,minOut:r=null,gasUsd:o=null,feeUsd:i=null,oracleFeeBps:s=0,estimatedGas:a=null,liquidityUsd:c=null,error:l=null,executionReady:u=!1,meta:d={}}=e||{};if(l||n==null)return{source:t,quality:Le.FAILED,amountOut:null,error:l||"no amountOut returned"};let p=Br(n);if(p==null||p<=0n)return{source:t,quality:Le.FAILED,amountOut:null,error:"non-positive amountOut"};let m=Number(s);return{source:t,quality:o==null?Le.NO_GAS:Le.FULL,amountOut:p.toString(),minOut:Br(r)?.toString()??null,gasUsd:o,feeUsd:i,oracleFeeBps:Number.isFinite(m)&&m>0?Math.floor(m):0,estimatedGas:a==null?null:String(a),liquidityUsd:c==null?null:Number(c),executionReady:u,meta:d}}async function Ry(e,t,{divisor:n=1000n}={}){let r=Br(t);if(r==null||r<=0n)return null;let o=r/n>0n?r/n:1n;if(o>=r)return null;let i,s;try{[i,s]=await Promise.all([e(o),e(r)])}catch{return null}let a=Br(i),c=Br(s);if(a==null||c==null||a<=0n)return null;let l=Number(a)/Number(o),u=Number(c)/Number(r);return!Number.isFinite(l)||!Number.isFinite(u)||l<=0?null:{impactPct:(1-u/l)*100,probeAmountIn:o.toString(),probeAmountOut:a.toString(),fullAmountOut:c.toString()}}function $y(e,t,{maxImpactPct:n=25}={}){let r=[],o=[],i=(e.routes??[]).filter(a=>{let c=t?.[a.source];return c?c.impactPct>n?(r.push({source:a.source,impactPct:Number(c.impactPct.toFixed(2)),reason:`price impact ${c.impactPct.toFixed(1)}% exceeds ${n}% ceiling -- the venue cannot absorb this size near the quoted price`}),!1):!0:(o.push(a.source),!0)}),s=[...e.warnings??[]];return r.length&&s.push(`dropped ${r.length} route(s) on price impact: `+r.map(a=>`${a.source} (${a.impactPct}%)`).join(", ")),o.length&&s.push(`price impact NOT measured for: ${o.join(", ")}. These are unproven against thin liquidity, not proven safe.`),{...e,routes:i,best:i[0]??null,impactRejected:r,impactUnmeasured:o,warnings:s}}function ol(e,{destPriceUsd:t=null,destDecimals:n=null,liquidityFirst:r=!0,liquidityBandBps:o=50}={}){let i=e.filter(b=>b.quality!==Le.FAILED),s=e.filter(b=>b.quality===Le.FAILED),a=t!=null&&t>0&&n!=null&&n>=0,c=i.map(b=>{let k=BigInt(b.amountOut),x=0n,w=!1,v=BigInt(b.oracleFeeBps??0),T=v>0n?k*v/10000n:0n;if(a){let _=(b.gasUsd??0)+(b.feeUsd??0);if(_>0){let E=_/t*10**n;Number.isFinite(E)&&E>=0&&(x=BigInt(Math.floor(E)),w=!0)}else b.gasUsd===0&&(w=!0)}let I=x+T,R=k>I?k-I:0n;return{...b,grossOut:k.toString(),netOut:R.toString(),costInDest:x.toString(),oracleFeeInDest:T.toString(),costAccounted:w}}),l=Number(o)>0?Number(o):0,u=c.reduce((b,k)=>BigInt(k.netOut)>b?BigInt(k.netOut):b,0n),d=b=>u>0n?Number((u-BigInt(b))*10000n/u):0,p=[],m=c.slice().sort((b,k)=>BigInt(k.netOut)>BigInt(b.netOut)?1:-1)[0]??null;c.sort((b,k)=>{let x=d(b.netOut)<=l?0:1,w=d(k.netOut)<=l?0:1;if(r&&l>0&&x!==w)return x-w;if(r&&l>0){let v=b.liquidityUsd??-1,T=k.liquidityUsd??-1;if(v!==T)return T-v}return BigInt(k.netOut)>BigInt(b.netOut)?1:-1}),r&&l>0&&m&&c[0]&&c[0].source!==m.source&&p.push(`liquidity-first: chose ${c[0].source} (liquidity $${c[0].liquidityUsd??"unknown"}) over best-price ${m.source} within ${l} bps`);let f=c.filter(b=>!b.costAccounted).map(b=>b.source);a?f.length&&p.push(`gas not reported by: ${f.join(", ")}. These are ranked on gross output and may be overstated relative to gas-measured routes.`):p.push("destination price/decimals unavailable: ranked on GROSS output. Gas is not included, so a cheap-looking route may cost more to execute.");let h=null,g=null;if(c.length>=2&&c[0].costAccounted&&c[1].costAccounted){let b=BigInt(c[0].netOut),k=BigInt(c[1].netOut);k>0n&&(h=Number((b-k)*10000n/k),g=`${c[0].source} vs ${c[1].source}`)}return{best:c[0]??null,routes:c,failed:s,improvementBps:h,spreadBasis:g,rankedOn:a?"net-of-cost":"gross",warnings:p}}async function Mi(e,{timeoutMs:t=12e3}={}){let n=(o,i)=>Promise.race([o,new Promise((s,a)=>setTimeout(()=>a(new Error(`${i}: timeout`)),t))]);return(await Promise.allSettled(e.map(o=>n(Promise.resolve().then(o.run),o.source)))).map((o,i)=>{let s=e[i].source;return o.status==="rejected"?Ny({source:s,error:String(o.reason?.message||o.reason)}):Ny({source:s,...o.value})})}var We=e=>{let t=Number(e);return Number.isFinite(t)?t:null};function Ui(e){if(!Array.isArray(e))return null;let t=0,n=!1;for(let r of e){let o=We(r?.amountUSD);o!=null&&(t+=o,n=!0)}return n?t:null}async function My(e,t={}){let n=Oy[Number(e)];if(!n)return null;try{let r=await Oe([n],t);return We(r?.coins?.[n]?.price)}catch{return null}}var bt=e=>String(e??"").toLowerCase().replace(/[^a-z0-9]/g,""),Ly=Object.freeze({across:["across"],relay:["relaychain","relay"],lifi:["jumper-(li.fi-powered)","lifi"],stargate:["stargate-v2","stargate-v1","stargate"],hop:["hop-protocol","hop"],debridge:["debridge"],synapse:["synapse"],connext:["connext"],cbridge:["celer-bridge","celer-cbridge","cbridge"],celer:["celer-bridge","celer-cbridge","cbridge"],squid:["squid"],symbiosis:["symbiosis"],wormhole:["wormhole"],mayan:["mayan"],allbridge:["allbridge"],thorchain:["thorchain"]});async function yP(e={}){try{let t=await To({...e,baseUrl:e.defillamaApiBaseUrl,timeoutMs:e.defillamaTimeoutMs??Math.min(Number(e.timeoutMs??5e3),5e3)});return Array.isArray(t)?t:[]}catch{return[]}}function bP(e,t={}){let n=bt(t.tool||t.provider||t.bridge||t.protocol),r=[];return e==="lifi"&&n&&n!=="lifi"&&r.push(...Ly[n]||[n]),r.push(...Ly[bt(e)]||[e]),r}function wP(e,t,n={}){let r=Array.isArray(e)?e:[],o=bP(t,n).map(bt).filter(Boolean);for(let i of o){let s=r.find(c=>bt(c?.slug)===i||bt(c?.name)===i),a=We(s?.tvl);if(a!=null)return{liquidityUsd:a,protocol:s?.name??s?.slug??i}}for(let i of o){let s=r.find(c=>{let l=bt(c?.category);return!l.includes("bridge")&&!l.includes("crosschain")?!1:bt(c?.slug).includes(i)||bt(c?.name).includes(i)}),a=We(s?.tvl);if(a!=null)return{liquidityUsd:a,protocol:s?.name??s?.slug??i}}return null}function il({chainId:e,tokenIn:t,tokenOut:n,amountIn:r,taker:o,slippageBps:i,decimalsIn:s,decimalsOut:a,nativePriceUsd:c=null,destDecimalsPromise:l=null,opts:u={}}){let d=[];return d.push({source:"lifi",run:async()=>{let p=await lt({fromChain:e,toChain:e,fromToken:t,toToken:n,fromAmount:r},u),m=p?.estimate??p?.[0]?.estimate;return{amountOut:m?.toAmount,minOut:m?.toAmountMin,gasUsd:Ui(m?.gasCosts),feeUsd:Ui(m?.feeCosts),oracleFeeBps:p?.oracleFee?.applies?p.oracleFee.bps:0,meta:{tool:p?.tool??p?.toolDetails?.name,oracleFee:p?.oracleFee??null}}}}),s!=null&&d.push({source:"paraswap",run:async()=>{let p=a??(await Promise.resolve(l))?.decimals;if(p==null)throw new Error("paraswap needs destination decimals; none supplied or resolvable");let m=await yt({chainId:e,srcToken:t,destToken:n,amount:r,srcDecimals:s,destDecimals:p},u),f=m?.priceRoute;return{amountOut:f?.destAmount,gasUsd:We(f?.gasCostUSD),oracleFeeBps:m?.oracleFee?.applies?m.oracleFee.bps:0,meta:{bestRoute:f?.bestRoute?.[0]?.swaps?.[0]?.swapExchanges?.[0]?.exchange,oracleFee:m?.oracleFee??null}}}}),process.env.ZEROX_API_KEY&&d.push({source:"0x",run:async()=>{let p=await Rt({chainId:e,sellToken:t,buyToken:n,sellAmount:r,taker:o},u),m=null,f=p?.totalNetworkFee,h=await Promise.resolve(c);return f!=null&&h&&(m=Number(f)/1e18*h),{amountOut:p?.buyAmount,minOut:p?.minBuyAmount,gasUsd:m,meta:{source:p?.route?.fills?.[0]?.source}}}}),process.env.ONEINCH_API_KEY&&d.push({source:"1inch",run:async()=>{let p=await fr({chainId:e,src:t,dst:n,amount:r},u),m=null;return p?.gas!=null&&c&&(m=null),{amountOut:p?.dstAmount,gasUsd:m,meta:{gasUnits:p?.gas}}}}),d.push({source:"cow",run:async()=>{let p=await dt({chainId:e,sellToken:t,buyToken:n,sellAmountBeforeFee:String(r),from:o},u),m=p?.quote??p,f=m?.feeAmount;return{amountOut:m?.buyAmount,gasUsd:0,meta:{intent:!0,feeAmountInSellToken:f,settlement:"solver-executed"}}}}),ce[Number(e)]&&d.push({source:"uniswap-v3",run:async()=>{let p=await it({chainId:e,tokenIn:t,tokenOut:n,amountIn:r},u);return{amountOut:p?.amountOut,minOut:p?.minOut??p?.amountOutMinimum??null,gasUsd:null,liquidityUsd:p?.liquidityUsd??null,meta:{onchain:!0,fee:p?.fee,gasUnits:p?.gasEstimate,quoter:p?.quoter}}}}),je[Number(e)]&&d.push({source:"uniswap-v4",run:async()=>{let p=await co({chainId:e,tokenIn:t,tokenOut:n,amountIn:r,recipient:o,slippageBps:i},u);return{amountOut:p?.amountOut,minOut:p?.minOut??p?.amountOutMinimum??null,gasUsd:null,liquidityUsd:p?.liquidityUsd??null,meta:{onchain:!0,venue:"uniswap-v4",fee:p?.fee,tickSpacing:p?.tickSpacing,poolId:p?.poolId,hooks:p?.hooks,gasUnits:p?.gasEstimate,quoter:p?.quoter,poolManager:p?.poolManager,prepareReady:p?.prepareReady===!0,executionReady:!1}}}}),d}function Uy({fromChainId:e,toChainId:t,tokenIn:n,tokenOut:r,amountIn:o,taker:i,opts:s={}}){let a=[],c=null,l=async(u,d={})=>(c||=yP(s),wP(await c,u,d));return a.push({source:"lifi",run:async()=>{let u=await lt({fromChain:e,toChain:t,fromToken:n,toToken:r,fromAmount:o},s),d=u?.estimate??u?.[0]?.estimate,p={tool:u?.tool??u?.toolDetails?.name,durationSeconds:We(d?.executionDuration)},m=await l("lifi",p);return{amountOut:d?.toAmount,minOut:d?.toAmountMin,gasUsd:Ui(d?.gasCosts),feeUsd:Ui(d?.feeCosts),oracleFeeBps:u?.oracleFee?.applies?u.oracleFee.bps:0,liquidityUsd:m?.liquidityUsd??null,meta:{...p,liquidityProtocol:m?.protocol,oracleFee:u?.oracleFee??null}}}}),a.push({source:"relay",run:async()=>{let{relayQuote:u}=await Promise.resolve().then(()=>(Do(),Bo)),p=(await u({user:i,originChainId:e,destinationChainId:t,originCurrency:n,destinationCurrency:r,amount:String(o)},s))?.details,m={durationSeconds:We(p?.timeEstimate),rate:p?.rate},f=await l("relay",m);return{amountOut:p?.currencyOut?.amount,minOut:p?.currencyOut?.minimumAmount,gasUsd:We(p?.totalImpact?.usd)!=null?Math.abs(We(p.totalImpact.usd)):null,liquidityUsd:f?.liquidityUsd??null,meta:{...m,liquidityProtocol:f?.protocol}}}}),a.push({source:"across",run:async()=>{let{acrossSuggestedFees:u}=await Promise.resolve().then(()=>(Do(),Bo)),d=await u({token:n,destinationToken:r,originChainId:e,destinationChainId:t,amount:String(o)},s),p=d?.totalRelayFee?.total,m=null;if(p!=null)try{let h=BigInt(String(o))-BigInt(String(p));h>0n&&(m=h.toString())}catch{}let f=await l("across");return{amountOut:m,gasUsd:null,liquidityUsd:f?.liquidityUsd??null,meta:{derivedFromFees:!0,durationSeconds:We(d?.estimatedFillTimeSec),limits:d?.limits?{min:d.limits.minDeposit,max:d.limits.maxDeposit}:void 0,liquidityProtocol:f?.protocol}}}}),a}var xP={1:"ethereum",10:"optimism",56:"bsc",137:"polygon",8453:"base",42161:"arbitrum",43114:"avax"};async function By(e,t,n){let r=xP[Number(e)];if(!r)return{priceUsd:null,decimals:null};let o=`${r}:${t}`;try{let s=(await Oe([o],n))?.coins?.[o],a=Number(s?.price),c=Number(s?.decimals);return{priceUsd:Number.isFinite(a)?a:null,decimals:Number.isFinite(c)?c:null}}catch{return{priceUsd:null,decimals:null}}}async function SP(e,t={}){let{chainId:n,tokenIn:r,tokenOut:o,amountIn:i}=e;if(n==null||!r||!o||i==null)throw new Error("bestSwapRoute requires chainId, tokenIn, tokenOut, amountIn");let s=My(n,t),a=By(n,o,t),c=il({...e,nativePriceUsd:s,decimalsOut:e.decimalsOut,destDecimalsPromise:a,opts:t}),[l,u]=await Promise.all([Mi(c,{timeoutMs:t.timeoutMs??12e3}),a]);s.catch(()=>{});let d=ol(l,{destPriceUsd:u.priceUsd,destDecimals:e.decimalsOut??u.decimals,liquidityBandBps:t.liquidityBandBps??50}),p=t.maxImpactPct===void 0?25:t.maxImpactPct;if(p!=null&&d.best){let m=d.best.source,h=await Ry(async g=>{let b=il({...e,amountIn:g.toString(),nativePriceUsd:s,decimalsOut:e.decimalsOut,destDecimalsPromise:a,opts:t}).filter(x=>x.source===m);return b.length?(await Mi(b,{timeoutMs:t.timeoutMs??12e3}))?.[0]?.amountOut??null:null},i);if(h){let g=$y(d,{[m]:h},{maxImpactPct:p});return{kind:"swap",chainId:n,tokenIn:r,tokenOut:o,amountIn:String(i),...g,sourcesTried:c.length,sourcesAnswered:l.filter(b=>b.quality!==Le.FAILED).length,note:sl(g,c.length),priceImpact:{[m]:Number(h.impactPct.toFixed(2))}}}}return{kind:"swap",chainId:n,tokenIn:r,tokenOut:o,amountIn:String(i),...d,sourcesTried:c.length,sourcesAnswered:l.filter(m=>m.quality!==Le.FAILED).length,note:sl(d,c.length)}}async function kP(e,t={}){let{fromChainId:n,toChainId:r,tokenIn:o,tokenOut:i,amountIn:s}=e;if(n==null||r==null||!o||!i||s==null)throw new Error("bestBridgeRoute requires fromChainId, toChainId, tokenIn, tokenOut, amountIn");if(Number(n)===Number(r))throw new Error("bestBridgeRoute is for cross-chain; use bestSwapRoute for same-chain");let a=By(r,i,t),c=Uy({...e,opts:t}),[l,u]=await Promise.all([Mi(c,{timeoutMs:t.timeoutMs??15e3}),a]),d=ol(l,{destPriceUsd:u.priceUsd,destDecimals:e.decimalsOut??u.decimals,liquidityBandBps:t.liquidityBandBps??50}),p=d.routes.map(m=>({source:m.source,seconds:m.meta?.durationSeconds??null})).filter(m=>m.seconds!=null);return{kind:"bridge",fromChainId:n,toChainId:r,tokenIn:o,tokenOut:i,amountIn:String(s),...d,durations:p,sourcesTried:c.length,sourcesAnswered:l.filter(m=>m.quality!==Le.FAILED).length,note:sl(d,c.length)}}function EP(e){let t=e?.meta?.oracleFee;return t?.applies?` \xB7 ${Zd(t)}`:""}function sl(e,t){if(!e.best)return"no source returned a usable route";let n=e.routes.length,r=EP(e.best);if(n===1)return`only 1 of ${t} sources answered, so this is the ONLY route, not a proven best one. Treat it as unbenchmarked.`+r;if(e.improvementBps!=null){let o=e.improvementBps,i=o/100;if(o<.01)return`best of ${n} routes, ranked on ${e.rankedOn}: effectively tied with the runner-up (${e.spreadBasis}), inside quote noise. Re-quote before you size up.`+r;let s=i>=.01?`${i.toFixed(2)}%`:`${o.toFixed(2)}bps`;return`best of ${n} routes, ranked on ${e.rankedOn}: ${s} better than the runner-up (${e.spreadBasis})`+r}return`best of ${n} routes, ranked on ${e.rankedOn}. No spread quoted: the top routes report cost differently, so the margin is not comparable.`+r}var PU=Object.freeze({mantissa:10000n,scale:0});function zt(e){if(!Number.isSafeInteger(e)||e<0||e>1e3)throw new RangeError("scale must be a safe integer from 0 through 1000")}function Ge(e,t){if(typeof e!="bigint")throw new TypeError("mantissa must be a bigint");return zt(t),Object.freeze({mantissa:e,scale:t})}function wt(e,t="value"){if(e===null||typeof e!="object")throw new TypeError(`${t} must be a fixed point value`);if(typeof e.mantissa!="bigint")throw new TypeError(`${t}.mantissa must be a bigint`);zt(e.scale)}function Bi(e){return zt(e),10n**BigInt(e)}function D(e){if(typeof e!="string"||!/^[+-]?\d+(?:\.\d+)?$/.test(e))throw new TypeError("value must be a plain decimal string");let t=e.startsWith("-"),n=e[0]==="-"||e[0]==="+"?e.slice(1):e,[r,o=""]=n.split("."),i=`${r}${o}`,s=BigInt(i)*(t?-1n:1n);return Ge(s,o.length)}function fe(e,t){if(zt(t),typeof e=="bigint")return Ge(e,t);if(typeof e!="string"||!/^[+-]?\d+$/.test(e))throw new TypeError("value must be an integer string or bigint");return Ge(BigInt(e),t)}function Me(e){wt(e);let t=e.mantissa<0n,n=(t?-e.mantissa:e.mantissa).toString();if(e.scale===0)return`${t?"-":""}${n}`;let r=n.padStart(e.scale+1,"0"),o=r.length-e.scale;return`${t?"-":""}${r.slice(0,o)}.${r.slice(o)}`}function Dr(e,t){return wt(e),zt(t),t===e.scale?Ge(e.mantissa,e.scale):t>e.scale?Ge(e.mantissa*Bi(t-e.scale),t):Ge(e.mantissa/Bi(e.scale-t),t)}function al(e,t){wt(e,"left"),wt(t,"right");let n=Math.max(e.scale,t.scale);return[Dr(e,n),Dr(t,n),n]}function xt(e,t){let[n,r,o]=al(e,t);return Ge(n.mantissa+r.mantissa,o)}function Fr(e,t){let[n,r,o]=al(e,t);return Ge(n.mantissa-r.mantissa,o)}function xe(e,t){wt(e,"left"),wt(t,"right");let n=e.scale+t.scale;return zt(n),Ge(e.mantissa*t.mantissa,n)}function Ue(e,t,n=Math.max(e?.scale??0,t?.scale??0)){if(wt(e,"left"),wt(t,"right"),zt(n),t.mantissa===0n)throw new RangeError("division by zero");let r=e.mantissa*Bi(t.scale+n),o=t.mantissa*Bi(e.scale);return Ge(r/o,n)}function St(e,t){let[n,r]=al(e,t);return n.mantissa<r.mantissa?-1:n.mantissa>r.mantissa?1:0}import{readFileSync as _P,existsSync as PP}from"node:fs";import{fileURLToPath as CP}from"node:url";import{dirname as TP,join as jy}from"node:path";import{existsSync as Fy,readFileSync as vP}from"node:fs";import{dirname as Dy,join as cl}from"node:path";import{fileURLToPath as AP}from"node:url";function IP(e){let t=Dy(AP(e));for(let n=0;n<8;n+=1){let r=cl(t,"package.json");if(Fy(r))try{let i=JSON.parse(vP(r,"utf8"));if(i&&typeof i.version=="string")return t}catch{}let o=Dy(t);if(o===t)break;t=o}throw new Error(`oracle: could not resolve package root from ${e}`)}function qy(e,t){let n=IP(t),r=cl(n,e);return Fy(r)?r:cl(n,"dist","assets",e)}var NP=jy(TP(CP(import.meta.url)),"fixtures");function OP(){try{let e=qy("equities-fixtures",import.meta.url);if(e&&PP(e))return e}catch{}return NP}var RP=OP();var Vy=Object.freeze({venues:"venues.json",universe:"universe.json",oracles:"oracles.json",nyseHolidays:"nyse_holidays.json",dstTransitions:"dst_transitions.json",equityDexPools:"equity_dex_pools.json",rhPoolState:"rh_pool_state.json",solanaXstocks:"solana_xstocks.json",tonXstocks:"ton_xstocks.json",hip3L2Books:"hip3_l2books.json"});function $P(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function j(e,t){throw new TypeError(`Fixture fixtures/${e}: ${t}`)}function te(e,t,n){$P(e)||j(t,`${n} must be an object`)}function z(e,t,n){(typeof e!="string"||e.length===0)&&j(t,`${n} must be a nonempty string`)}function Ke(e,t,n){Number.isSafeInteger(e)||j(t,`${n} must be a safe integer`)}function kt(e,t,n){te(e,t,n);for(let[r,o]of Object.entries(e))z(r,t,`${n} key`),te(o,t,`${n}.${r}`)}function LP(e,t){te(e,t,"root"),Ke(e.capturedAt,t,"capturedAt"),te(e.venues,t,"venues");let n=[["hyperliquid_hip3","dexs"],["arcus","markets"],["arcus_spot","pairs"],["rh_uniswap","pools"],["rh_chainlink_oracles","assets"]];for(let[r,o]of n){let i=e.venues[r];te(i,t,`venues.${r}`),z(i.type,t,`venues.${r}.type`),z(i.chain,t,`venues.${r}.chain`),z(i.tier,t,`venues.${r}.tier`),kt(i[o],t,`venues.${r}.${o}`)}for(let[r,o]of Object.entries(e.venues.hyperliquid_hip3.dexs))kt(o,t,`venues.hyperliquid_hip3.dexs.${r}`)}function MP(e,t){kt(e,t,"root"),Object.keys(e).length===0&&j(t,"root must not be empty");for(let[n,r]of Object.entries(e))Array.isArray(r.venues)||j(t,`${n}.venues must be an array`),r.venues.forEach((o,i)=>z(o,t,`${n}.venues[${i}]`))}function UP(e,t){te(e,t,"root");for(let n of["chainId","block","oracleScaleExp","usdgDecimals","equityDecimals"])Ke(e[n],t,n);z(e.usdg,t,"usdg"),kt(e.assets,t,"assets");for(let[n,r]of Object.entries(e.assets))z(r.oracle,t,`assets.${n}.oracle`),z(r.token,t,`assets.${n}.token`),(typeof r.rawPrice!="string"||!/^\d+$/.test(r.rawPrice))&&j(t,`assets.${n}.rawPrice must be an integer string`),(typeof r.usd!="number"||!Number.isFinite(r.usd)||r.usd<0)&&j(t,`assets.${n}.usd must be a nonnegative finite source number`)}function BP(e,t){te(e,t,"root");for(let r of["holidayDayIndex","names","dates"])Array.isArray(e[r])||j(t,`${r} must be an array`);let n=e.holidayDayIndex.length;(e.names.length!==n||e.dates.length!==n)&&j(t,"holidayDayIndex, names, and dates must have equal lengths"),e.holidayDayIndex.forEach((r,o)=>Ke(r,t,`holidayDayIndex[${o}]`)),e.names.forEach((r,o)=>z(r,t,`names[${o}]`)),e.dates.forEach((r,o)=>{(typeof r!="string"||!/^\d{4}-\d{2}-\d{2}$/.test(r))&&j(t,`dates[${o}] must use YYYY-MM-DD`)})}function DP(e,t){te(e,t,"root"),(!Array.isArray(e.dstTransitions)||e.dstTransitions.length===0)&&j(t,"dstTransitions must be a nonempty array");let n=new Set;e.dstTransitions.forEach((r,o)=>{te(r,t,`dstTransitions[${o}]`);for(let i of["year","startUtc","endUtc"])Ke(r[i],t,`dstTransitions[${o}].${i}`);r.startUtc>=r.endUtc&&j(t,`dstTransitions[${o}] startUtc must be before endUtc`),n.has(r.year)&&j(t,`dstTransitions contains duplicate year ${r.year}`),n.add(r.year)})}function FP(e,t){kt(e,t,"root"),Object.keys(e).length===0&&j(t,"root must not be empty");for(let[n,r]of Object.entries(e)){for(let o of["addr","quote","quoteAddr","dex","pair"])z(r[o],t,`${n}.${o}`);(typeof r.liq!="number"||!Number.isFinite(r.liq)||r.liq<0)&&j(t,`${n}.liq must be a nonnegative finite source number`)}}function qP(e,t){te(e,t,"root"),Ke(e.capturedAt,t,"capturedAt"),Ke(e.block,t,"block"),Ke(e.chainId,t,"chainId"),z(e.gasPriceWei,t,"gasPriceWei"),z(e.stateView,t,"stateView"),kt(e.pools,t,"pools"),Object.keys(e.pools).length===0&&j(t,"pools must not be empty");for(let[n,r]of Object.entries(e.pools)){for(let o of["pair","version","quote","token","sqrtPriceX96"])z(r[o],t,`pools.${n}.${o}`);r.version!=="v3"&&r.version!=="v4"&&j(t,`pools.${n}.version must be v3 or v4`),typeof r.quoteIsToken0!="boolean"&&j(t,`pools.${n}.quoteIsToken0 must be a boolean`),(!/^[0-9]+$/.test(r.sqrtPriceX96)||BigInt(r.sqrtPriceX96)<=0n)&&j(t,`pools.${n}.sqrtPriceX96 must be a positive integer string`)}}function HP(e,t){te(e,t,"root"),Ke(e.capturedAt,t,"capturedAt"),z(e.source,t,"source"),te(e.books,t,"books"),Object.keys(e.books).length===0&&j(t,"books must not be empty");for(let[n,r]of Object.entries(e.books)){te(r,t,`books.${n}`),(!Array.isArray(r.bids)||!Array.isArray(r.asks))&&j(t,`books.${n} must have bids and asks arrays`);for(let[o,i]of r.bids.entries())te(i,t,`books.${n}.bids[${o}]`),z(i.px,t,`books.${n}.bids[${o}].px`),z(i.sz,t,`books.${n}.bids[${o}].sz`);for(let[o,i]of r.asks.entries())te(i,t,`books.${n}.asks[${o}]`),z(i.px,t,`books.${n}.asks[${o}].px`),z(i.sz,t,`books.${n}.asks[${o}].sz`)}}function jP(e,t){te(e,t,"root"),Ke(e.capturedAt,t,"capturedAt"),z(e.source,t,"source"),z(e.chain,t,"chain"),kt(e.tokens,t,"tokens"),te(e.pairs,t,"pairs"),Object.keys(e.tokens).length===0&&j(t,"tokens must not be empty");for(let[n,r]of Object.entries(e.tokens)){z(r.symbolRaw,t,`tokens.${n}.symbolRaw`),z(r.mint,t,`tokens.${n}.mint`),Object.hasOwn(e.pairs,n)||j(t,`pairs.${n} is required for token ${n}`),(!Array.isArray(e.pairs[n])||e.pairs[n].length===0)&&j(t,`pairs.${n} must be a nonempty array`);for(let[o,i]of e.pairs[n].entries())te(i,t,`pairs.${n}[${o}]`),z(i.pairAddress,t,`pairs.${n}[${o}].pairAddress`),z(i.dexId,t,`pairs.${n}[${o}].dexId`),(typeof i.priceUsd!="number"||!Number.isFinite(i.priceUsd)||i.priceUsd<=0)&&j(t,`pairs.${n}[${o}].priceUsd must be a positive finite number`),(typeof i.liquidityUsd!="number"||!Number.isFinite(i.liquidityUsd)||i.liquidityUsd<0)&&j(t,`pairs.${n}[${o}].liquidityUsd must be a nonnegative finite number`)}}function VP(e,t){te(e,t,"root"),Ke(e.capturedAt,t,"capturedAt"),z(e.source,t,"source"),z(e.chain,t,"chain"),e.chain!=="ton"&&j(t,'chain must be "ton"'),kt(e.tokens,t,"tokens"),te(e.pairs,t,"pairs"),Object.keys(e.tokens).length===0&&j(t,"tokens must not be empty");for(let[n,r]of Object.entries(e.tokens)){z(r.symbolRaw,t,`tokens.${n}.symbolRaw`),z(r.mint,t,`tokens.${n}.mint`),Object.hasOwn(e.pairs,n)||j(t,`pairs.${n} is required for token ${n}`),(!Array.isArray(e.pairs[n])||e.pairs[n].length===0)&&j(t,`pairs.${n} must be a nonempty array`);for(let[o,i]of e.pairs[n].entries())te(i,t,`pairs.${n}[${o}]`),z(i.pairAddress,t,`pairs.${n}[${o}].pairAddress`),z(i.dexId,t,`pairs.${n}[${o}].dexId`),(typeof i.priceUsd!="number"||!Number.isFinite(i.priceUsd)||i.priceUsd<=0)&&j(t,`pairs.${n}[${o}].priceUsd must be a positive finite number`),(typeof i.liquidityUsd!="number"||!Number.isFinite(i.liquidityUsd)||i.liquidityUsd<0)&&j(t,`pairs.${n}[${o}].liquidityUsd must be a nonnegative finite number`)}}var zP=Object.freeze({venues:LP,universe:MP,oracles:UP,nyseHolidays:BP,dstTransitions:DP,equityDexPools:FP,rhPoolState:qP,solanaXstocks:jP,tonXstocks:VP,hip3L2Books:HP});function WP(e,t){let n=Vy[t],r=jy(e,n),o;try{o=_P(r,"utf8")}catch(s){throw s?.code==="ENOENT"?new Error(`Fixture fixtures/${n} is missing at ${r}`):new Error(`Fixture fixtures/${n} could not be read: ${s.message}`)}let i;try{i=JSON.parse(o)}catch(s){throw new SyntaxError(`Fixture fixtures/${n} contains invalid JSON: ${s.message}`)}return zP[t](i,n),i}function zy(e){if(e!==null&&typeof e=="object"&&!Object.isFrozen(e)){Object.freeze(e);for(let t of Object.values(e))zy(t)}return e}function Wy({fixtureDir:e=RP}={}){if(typeof e!="string"||e.length===0)throw new TypeError("fixtureDir must be a nonempty path string");let t={};for(let n of Object.keys(Vy))t[n]=WP(e,n);return zy(t)}var Hy;function Et(){return Hy??=Wy(),Hy}function Ae(){return Et().venues}function Gy(){return Et().oracles}function Ky(){return Et().nyseHolidays}function Yy(){return Et().dstTransitions}function Di(){return Et().rhPoolState}function Xy(){return Et().solanaXstocks}function Qy(){return Et().tonXstocks}function Jy(){return Et().hip3L2Books}var ul=1e3,tb=60*ul,dl=60*tb,Zy=24*dl,GP=-5*dl,KP=-4*dl,nb=240,rb=570,ob=960,ib=1200,FU=Object.freeze([nb,rb,ob,ib]),qU=Object.freeze(["core","extended","dark"]),eb,ll;function YP(){let e=Yy().dstTransitions.map(r=>({year:r.year,startMs:r.startUtc*ul,endMs:r.endUtc*ul}));e.sort((r,o)=>r.startMs-o.startMs);let t=e[0].year,n=e[e.length-1].year;return Object.freeze({rows:Object.freeze(e),firstYear:t,lastYear:n,coverageStartMs:Date.UTC(t,0,1),coverageEndMs:Date.UTC(n+1,0,1)})}function sb(){return eb??=YP(),eb}function XP(){return ll===void 0&&(ll=new Set(Ky().holidayDayIndex)),ll}function ab(e,t){if(!Number.isSafeInteger(e))throw new TypeError(`${t}: epochMs must be a safe integer number of milliseconds`)}function QP(e,t){let{coverageStartMs:n,coverageEndMs:r,firstYear:o,lastYear:i}=sb();if(e<n||e>=r)throw new RangeError(`${t}: ${new Date(e).toISOString()} is outside DST fixture coverage (${o} through ${i}). Refusing to assume a UTC offset.`)}function JP(e){for(let t of sb().rows)if(e>=t.startMs&&e<t.endMs)return!0;return!1}function ZP(e){return JP(e)?KP:GP}function eC(e){let t=e+ZP(e),n=Math.floor(t/Zy),r=t-n*Zy,o=new Date(t);return{dayIndex:n,minuteOfDay:Math.floor(r/tb),msIntoDay:r,weekday:o.getUTCDay()}}function tC({dayIndex:e,weekday:t}){return t===0||t===6?!1:!XP().has(e)}function nC(e){return e<nb?"dark":e<rb?"extended":e<ob?"core":e<ib?"extended":"dark"}function qr(e){ab(e,"sessionState"),QP(e,"sessionState");let t=eC(e);return tC(t)?nC(t.minuteOfDay):"dark"}function pl(e){return ab(e,"isDark"),qr(e)==="dark"}var Fi=Object.freeze({DORMANT_VENUE:"dormant-venue",CROSSED_BOOK:"crossed-book",STALE_QUOTE:"stale-quote",STALE_ORACLE:"stale-oracle"}),rC=12e4,oC=6e5;function qi(e,t){e.push(Object.freeze({venue:t.venue,symbol:t.symbol??null,reason:t.reason,evidence:t.evidence??null}))}function iC(e){let t=e.raw?.vol24h;return!!(t===0||t===0||typeof t=="number"&&Number.isFinite(t)&&t<=0)}function sC(e){return!e.bid||!e.ask?!1:St(e.bid,e.ask)>0}function cb(e,t,n){return Number.isSafeInteger(e.capturedAt)?t-e.capturedAt>n:!1}function Hi(e,t={}){if(!Array.isArray(e))throw new TypeError("quotes must be an array");let n=t.nowMs??Date.now(),r=t.quoteFreshnessMs??rC,o=t.oracleFreshnessMs??oC,i=t.includeDormant===!0,s=[],a=[];for(let c of e){if(iC(c)){i?s.push(Object.freeze({...c,staleData:!0})):qi(a,{venue:c.venue,symbol:c.symbolRaw??c.symbol,reason:Fi.DORMANT_VENUE,evidence:{vol24h:c.raw?.vol24h??null}});continue}if(sC(c)){qi(a,{venue:c.venue,symbol:c.symbolRaw??c.symbol,reason:Fi.CROSSED_BOOK,evidence:{bid:c.bid?String(c.bid.mantissa)+"e-"+c.bid.scale:null,ask:c.ask?String(c.ask.mantissa)+"e-"+c.ask.scale:null}});continue}if(cb(c,n,r)){qi(a,{venue:c.venue,symbol:c.symbolRaw??c.symbol,reason:Fi.STALE_QUOTE,evidence:{capturedAt:c.capturedAt,nowMs:n,ageMs:n-c.capturedAt,freshnessMs:r}});continue}if(c.tier==="read-only"&&c.raw?.oracleRaw!==void 0){let l=qr(n),u=l==="core"?o:o*2;if(cb(c,n,u)){qi(a,{venue:c.venue,symbol:c.symbolRaw??c.symbol,reason:Fi.STALE_ORACLE,evidence:{capturedAt:c.capturedAt,nowMs:n,session:l}});continue}}s.push(c)}return{survivors:s,excluded:a}}function aC(e){if(typeof e!="number"||!Number.isFinite(e))throw new TypeError("value must be a finite number");let t=String(e);if(!t.includes("e")&&!t.includes("E"))return t;let[n,r]=t.split(/[eE]/),o=Number(r),i=n.startsWith("-"),s=i?n.slice(1):n,[a,c=""]=s.split("."),l=`${a}${c}`,u=a.length+o,d;return u<=0?d=`0.${"0".repeat(-u)}${l}`:u>=l.length?d=`${l}${"0".repeat(u-l.length)}`:d=`${l.slice(0,u)}.${l.slice(u)}`,`${i?"-":""}${d}`}function oe(e){return e==null?null:typeof e=="string"?D(e):typeof e!="number"||!Number.isFinite(e)?null:D(aC(e))}function Be(e,t){let n=oe(e);if(n===null)throw new TypeError(`${t} must be a finite source number`);return n}var cC=new Set(["spot","perp"]),lC=new Set(["read-only","quote-only","prepare","intent"]),uC=new Set(["buy","sell"]),dC=new Set(["net-of-cost","gross"]),pC=new Set(["homogeneous","heterogeneous"]),mC=["bid","ask","mid","mark"],lb=["fees","gasEstimate","priceImpact","fundingHourly"],fC=/^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$/;function Y(e,t){throw new TypeError(`${e} ${t}`)}function db(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function Wt(e,t){db(e)||Y(t,"must be an object")}function pb(e,t,n){Object.hasOwn(e,t)||Y(`${n}.${t}`,"is required")}function $n(e,t){(typeof e!="string"||e.length===0)&&Y(t,"must be a nonempty string")}function Hr(e,t,n){t.has(e)||Y(n,`must be one of ${[...t].join(", ")}`)}function fl(e,t){(!Number.isSafeInteger(e)||e<0)&&Y(t,"must be a nonnegative safe integer")}function ml(e,t,n=!1){e===null&&n||(db(e)||Y(t,"must be a fixed point value"),typeof e.mantissa!="bigint"&&Y(`${t}.mantissa`,"must be a bigint"),(!Number.isSafeInteger(e.scale)||e.scale<0)&&Y(`${t}.scale`,"must be a nonnegative safe integer"))}function ji(e,t,n=!1){e===null&&n||Wt(e,t)}function ub(e,t){Wt(e,t),$n(e.venue,`${t}.venue`),$n(e.reason,`${t}.reason`),fC.test(e.reason)||Y(`${t}.reason`,"must be a machine readable lower case code"),Object.hasOwn(e,"symbol")&&e.symbol!==null&&$n(e.symbol,`${t}.symbol`)}function Se(e){Wt(e,"quote");for(let n of["venue","chain","instrument","tier","symbolRaw","symbol","side","requestedSize",...lb,"costAccounted","capturedAt","blockOrSeq","raw"])pb(e,n,"quote");$n(e.venue,"quote.venue"),!(typeof e.chain=="string"&&e.chain.length>0)&&!(Number.isSafeInteger(e.chain)&&e.chain>=0)&&Y("quote.chain","must be a nonempty string or nonnegative chain id"),Hr(e.instrument,cC,"quote.instrument"),Hr(e.tier,lC,"quote.tier"),$n(e.symbolRaw,"quote.symbolRaw"),$n(e.symbol,"quote.symbol"),Hr(e.side,uC,"quote.side"),ml(e.requestedSize,"quote.requestedSize"),e.requestedSize.mantissa<0n&&Y("quote.requestedSize","must not be negative");let t=0;for(let n of mC)Object.hasOwn(e,n)&&(ml(e[n],`quote.${n}`),t+=1);t===0&&Y("quote","must contain at least one of bid, ask, mid, mark");for(let n of lb)ml(e[n],`quote.${n}`,!0);if(typeof e.costAccounted!="boolean"&&Y("quote.costAccounted","must be a boolean"),e.costAccounted){for(let n of["fees","gasEstimate","priceImpact"])e[n]===null&&Y(`quote.${n}`,"cannot be unknown when costAccounted is true");e.instrument==="perp"&&e.fundingHourly===null&&Y("quote.fundingHourly","cannot be unknown when costAccounted is true for a perp")}return e.instrument==="spot"&&e.fundingHourly!==null&&Y("quote.fundingHourly","must be null for a spot quote"),fl(e.capturedAt,"quote.capturedAt"),e.blockOrSeq!==null&&!(typeof e.blockOrSeq=="string"&&e.blockOrSeq.length>0)&&!(Number.isSafeInteger(e.blockOrSeq)&&e.blockOrSeq>=0)&&Y("quote.blockOrSeq","must be null, a nonempty string, or a nonnegative safe integer"),Wt(e.raw,"quote.raw"),e}function hl(e){Wt(e,"rankResult");for(let t of["rankedOn","ranked","winner","runnersUp","improvementBps","sourcesAnswered","sourcesTried","failed","excluded","darkWindow","instrumentMix","bestPreparable"])pb(e,t,"rankResult");return Hr(e.rankedOn,dC,"rankResult.rankedOn"),Array.isArray(e.ranked)||Y("rankResult.ranked","must be an array"),e.ranked.forEach((t,n)=>ji(t,`rankResult.ranked[${n}]`)),ji(e.winner,"rankResult.winner",!0),e.ranked.length===0&&e.winner!==null&&Y("rankResult.winner","must be null when ranked is empty"),e.ranked.length>0&&e.winner===null&&Y("rankResult.winner","must be present when ranked is not empty"),Array.isArray(e.runnersUp)||Y("rankResult.runnersUp","must be an array"),e.runnersUp.forEach((t,n)=>ji(t,`rankResult.runnersUp[${n}]`)),e.improvementBps!==null&&!(typeof e.improvementBps=="number"&&Number.isFinite(e.improvementBps))&&Y("rankResult.improvementBps","must be a finite number or null"),fl(e.sourcesAnswered,"rankResult.sourcesAnswered"),fl(e.sourcesTried,"rankResult.sourcesTried"),e.sourcesAnswered>e.sourcesTried&&Y("rankResult.sourcesAnswered","must not exceed sourcesTried"),Array.isArray(e.failed)||Y("rankResult.failed","must be an array"),e.failed.forEach((t,n)=>ub(t,`failed[${n}]`)),Array.isArray(e.excluded)||Y("rankResult.excluded","must be an array"),e.excluded.forEach((t,n)=>ub(t,`excluded[${n}]`)),e.darkWindow!==null&&Wt(e.darkWindow,"rankResult.darkWindow"),Hr(e.instrumentMix,pC,"rankResult.instrumentMix"),ji(e.bestPreparable,"rankResult.bestPreparable",!0),Object.hasOwn(e,"carry")&&e.carry!==null&&Wt(e.carry,"rankResult.carry"),e}var hC="arcus_perp",gC="robinhood-4663",yC="quote-only",Vi="0.00000480324074074";function mb(){return Ae().venues.arcus}function bC(){return Object.keys(mb().markets).sort()}function wC({symbol:e,side:t="buy",sizeUsd:n=null}={}){if(typeof e!="string"||e.length===0)return null;let r=e.endsWith("-USD")?e.slice(0,-4):e,o=mb().markets[r];if(!o)return null;let i=Be(o.mark,`${r}.mark`),s=oe(o.oracle),a=oe(o.fundingHourly),c=n===null?D("0"):n,l={venue:hC,chain:gC,instrument:"perp",tier:yC,symbolRaw:e,symbol:r,side:t,requestedSize:c,mark:i,fees:null,gasEstimate:null,priceImpact:null,fundingHourly:a,costAccounted:!1,capturedAt:Ae().capturedAt*1e3,blockOrSeq:null,raw:{fixture:"fixtures/venues.json#venues.arcus",oraclePrice:o.oracle,vol24h:o.vol24h,oi:o.oi,fundingAnnPct:o.fundingAnnPct,category:o.category,isOutsideRth:o.isOutsideRth===!0,rth:o.rth,darkWindowFundingHourly:Vi,initialMarginFraction:o.initialMarginFraction??null,offHoursInitialMarginFraction:o.offHoursInitialMarginFraction??null,reasonCostUnknown:"fees, gas, and impact at size not captured for Arcus perps"}};return s!==null&&(l.raw.oracleFixed=s),Se(l)}function zi({side:e="buy",sizeUsd:t=null}={}){return bC().map(n=>wC({symbol:n,side:e,sizeUsd:t})).filter(n=>n!==null)}var fb=36e5,oB=24*365;function gl(e,t,n=8){if(e==null)throw new TypeError("hourlyFundingRate is required");if(!Number.isFinite(t)||t<0)throw new RangeError("horizonHours must be a nonnegative finite number");if(t===0)return D("0");let r=D(String(t)),o=fe(10000n,0);return xe(xe(e,r),o)}function hb(e,t,n={}){if(e.instrument!=="perp")return{model:"current-funding-held-constant",horizonHours:t,carryBps:D("0"),carryBpsDisplay:"0",confidence:"estimate",note:"spot has no funding carry"};let r=n.nowMs??Date.now(),o=n.applyDarkWindowLock===!0,i=e.fundingHourly;if(o&&i!==null){let a=xC(r,t),c=t-a,l=D(Vi),u=gl(i,c),d=gl(l,a),p=Math.max(u.scale,d.scale),m={mantissa:u.mantissa*10n**BigInt(p-u.scale)+d.mantissa*10n**BigInt(p-d.scale),scale:p};return{model:"current-funding-held-constant",horizonHours:t,carryBps:m,carryBpsDisplay:Me(m),confidence:"estimate",darkHours:a,litHours:c,darkWindowRate:Vi,compounding:"ignored",compoundingErrorBoundNote:"simple sum; at 30d and 1e-5/h the ignored compound is under 0.5bp"}}if(i===null)return{model:"current-funding-held-constant",horizonHours:t,carryBps:null,carryBpsDisplay:null,confidence:"estimate",note:"funding rate unknown"};let s=gl(i,t);return{model:"current-funding-held-constant",horizonHours:t,carryBps:s,carryBpsDisplay:Me(s),confidence:"estimate",compounding:"ignored",compoundingErrorBoundNote:"simple sum; at 30d and 1e-5/h the ignored compound is under 0.5bp"}}function xC(e,t){if(t<=0)return 0;let n=0,r=Math.floor(t);for(let o=0;o<r;o+=1)pl(e+o*fb)&&(n+=1);return t>r&&pl(e+r*fb)&&(n+=t-r),n}function SC(e){return e.mid??e.mark??e.ask??e.bid??null}function kC(e){let t=SC(e);if(t===null)return null;let n=e.costAccounted===!0,r=D("0");e.fees!==null?r=xt(r,e.fees):n=!1,e.priceImpact!==null?r=xt(r,e.priceImpact):e.requestedSize&&e.requestedSize.mantissa>0n&&(n=!1),e.gasEstimate===null?n=!1:r=xt(r,e.gasEstimate);let o;if(e.fees!==null&&St(e.fees,D("1"))<0&&St(e.fees,D("0"))>=0){let i=xt(D("1"),e.fees);o=xe(t,i),e.priceImpact!==null&&(o=xt(o,xe(t,e.priceImpact)))}else o=xt(t,r);return{net:o,costAccounted:n,px:t}}function EC(e,t,n=null){return{venue:e.venue,chain:e.chain,instrument:e.instrument,tier:e.tier,symbol:e.symbol,symbolRaw:e.symbolRaw,side:e.side,price:t.px,net:t.net,costAccounted:t.costAccounted,fundingHourly:e.fundingHourly,carry:n,quote:e}}function vC(e,t){if(!e||!t||!e.costAccounted||!t.costAccounted||e.instrument!==t.instrument||e.net.mantissa===0n)return null;let n=Fr(t.net,e.net);return Ue(xe(n,fe(10000n,0)),t.net,4)}function yl(e,t={}){if(!Array.isArray(e))throw new TypeError("quotes must be an array");let n=t.nowMs??e[0]?.capturedAt??Date.now(),r=e.length,o=e,i=[];if(!t.skipLiveness){let I=Hi(e,{nowMs:n});o=I.survivors,i=I.excluded}let s=e.length,a=[],c=t.horizonHours,l=Number.isFinite(c)&&c>0,u=[];for(let I of o){let R=kC(I);if(R===null)continue;let _=null;if(l&&I.instrument==="perp"&&(_=hb(I,c,{nowMs:n}),_.carryBps!==null)){let E=xt(D("1"),Ue(_.carryBps,fe(10000n,0),12));R.net=xe(R.net,E),R.costAccounted=!1}u.push(EC(I,R,_))}let d=u,p="homogeneous";if(l)p="heterogeneous",d=u;else{let I=u.filter(_=>_.instrument==="spot"),R=u.filter(_=>_.instrument==="perp");I.length>0&&R.length>0?(d=I.length>=R.length?I:R,p="homogeneous"):(d=u,p="homogeneous")}d.sort((I,R)=>{let _=St(I.net,R.net);return _!==0?_:I.venue<R.venue?-1:I.venue>R.venue?1:0});let m=d[0]??null,f=d.slice(1),h=d,g="gross";m&&m.costAccounted&&(f.length===0||f[0].costAccounted)&&(g="net-of-cost");let b=f.length===0?null:vC(m,f[0]),k=u.find(I=>I.tier==="prepare")??null,x=qr(n),w=x==="core"?null:{session:x,warning:x==="dark"?"market is dark; marks are not real price discovery":"extended session; thinner books and higher staleness risk"},v=null;l&&(v=AC(u));let T={rankedOn:g,ranked:h,winner:m,runnersUp:f,improvementBps:b===null?null:Number(Me(b)),sourcesAnswered:s,sourcesTried:r,failed:a,excluded:i,darkWindow:w,instrumentMix:p,bestPreparable:k,carry:m?.carry??null,breakEvenHorizonHours:v};return hl(T)}function AC(e){let t=e.filter(i=>i.instrument==="spot").sort((i,s)=>St(i.net,s.net))[0],n=e.filter(i=>i.instrument==="perp").sort((i,s)=>St(i.net,s.net))[0];if(!t||!n||n.fundingHourly===null)return null;let r=Fr(t.net,n.net);if(r.mantissa===0n)return 0;let o=xe(n.fundingHourly,n.price);if(o.mantissa===0n)return null;try{let i=Ue(r,o,4),s=Number(Me(i));return!Number.isFinite(s)||s<0?null:s}catch{return null}}var IC="rh_uniswap",_C=4663,PC="prepare",CC=1n<<192n,Ln=18,TC=Object.freeze({v3:180000n,v4:240000n});function bl(){return Di()}function NC(e){return{mantissa:e*e*10n**BigInt(Ln)/CC,scale:Ln}}function OC(e){let t=NC(BigInt(e.sqrtPriceX96)),n=e.quote==="USDG"?6:18,r=18;if(e.quoteIsToken0){let o=Ue(xe(t,fe(10n**BigInt(n),0)),fe(10n**BigInt(r),0),Ln);return o.mantissa===0n?null:Ue(D("1"),o,Ln)}return Ue(xe(t,fe(10n**BigInt(r),0)),fe(10n**BigInt(n),0),Ln)}function RC(e){let t=Gy(),n=t.assets[e];return n?fe(n.rawPrice,t.oracleScaleExp):null}function $C(e,t){if(e===null||t===null||e.mantissa<=0n||t.mantissa<=0n)return null;let n={...e};return Ue(t,LC(n,t),Ln)}function LC(e,t){let n=Math.max(e.scale,t.scale);return{mantissa:Dr(e,n).mantissa+Dr(t,n).mantissa,scale:n}}function MC(e){let t=bl(),n=TC[e];return n?{wei:BigInt(t.gasPriceWei)*n,units:n,native:"ETH"}:null}function wl(){return Object.keys(bl().pools).sort()}function Mn({symbol:e,side:t="buy",sizeUsd:n=null}={}){if(typeof e!="string"||e.length===0)throw new TypeError("symbol must be a nonempty string");let r=bl(),o=r.pools[e];if(!o)return null;let i=OC(o);if(i===null)return null;let s=oe(o.liqUsd),a=n===null?D("0"):n,c=o.feePpm===null||o.feePpm===void 0?null:Ue(fe(BigInt(o.feePpm),0),fe(1000000n,0),8),l=a.mantissa===0n?D("0"):$C(s,a),u=MC(o.version),m={venue:IC,chain:_C,instrument:"spot",tier:PC,symbolRaw:e,symbol:e,side:t,requestedSize:a,mid:i,fees:c,gasEstimate:null,priceImpact:l,fundingHourly:null,costAccounted:!1,capturedAt:r.capturedAt*1e3,blockOrSeq:r.block,raw:{fixture:"fixtures/rh_pool_state.json",pair:o.pair,version:o.version,sqrtPriceX96:o.sqrtPriceX96,quote:o.quote,quoteIsToken0:o.quoteIsToken0,liqUsd:o.liqUsd,gasNativeWei:u===null?null:u.wei.toString(),gasUnits:u===null?null:u.units.toString(),impactModel:"constant-product-estimate",notes:["price read live from chain 4663",o.version==="v4"?"v4 fee may be dynamic via hook and was not captured":"v3 fee tier is the pool static fee","gas known in native wei only, no ETH price captured to denominate it"]}},f=RC(e);return f!==null&&(m.referencePrice=f,m.referenceBasisBps=Me(Ue(xe(Fr(i,f),fe(10000n,0)),f,4))),Se(m)}function gb({side:e="buy",sizeUsd:t=null}={}){return wl().map(n=>Mn({symbol:n,side:e,sizeUsd:t})).filter(n=>n!==null)}var yb=12e4,UC="0x0000000000000000000000000000000000000000",BC="0x84b75b19A3cdf8E2F56d0507d22D442847B2053C";function xl(e={}){let{symbol:t,side:n="buy",sizeUsd:r=null,recipient:o,nowMs:i=Date.now()}=e;if(typeof t!="string"||!t)throw new TypeError("symbol is required");if(typeof o!="string"||!/^0x[0-9a-fA-F]{40}$/.test(o))throw new TypeError("recipient must be a 0x-prefixed 20 byte address");let s=Mn({symbol:t,side:n,sizeUsd:r});if(s===null)throw new Error(`no RH Uniswap pool for ${t}`);if(s.tier!=="prepare")throw new Error(`route tier is ${s.tier}, only prepare tier can be prepared`);let a=i-s.capturedAt;if(a>yb)throw new Error(`quote is stale (${a}ms old, bound ${yb}ms); re-quote before preparing`);let l=Di().pools[t],u=l.version==="v4"?BC:UC,d=u,p=n==="buy"?l.quoteAddr:l.token;return Object.freeze({artifactKind:"unsigned-tx",chainId:4663,to:u,data:"0x",value:"0",requiresApproval:{spender:d,token:p,amount:null},requiresWalletSignature:!0,backendSigner:!1,unsigned:!0,houseSigned:!1,quoteRef:{venue:s.venue,symbol:s.symbol,symbolRaw:s.symbolRaw,capturedAt:s.capturedAt,blockOrSeq:s.blockOrSeq,mid:s.mid,version:l.version,pair:l.pair},quoteAgeMs:a,recipient:o,side:n,notes:["prepare-only: user wallet must sign","calldata encoding is deferred; this artifact is the bound intent",l.version==="v4"?"V4 route via PoolManager":"V3 route via SwapRouter (address not yet pinned)"]})}var DC="hyperliquid_hip3",FC="hyperliquid",qC="quote-only";function jr(){return Ae().venues.hyperliquid_hip3}function bb(){return Object.keys(jr().dexs).sort()}function HC(){let e=[];for(let[t,n]of Object.entries(jr().dexs))for(let r of Object.keys(n))e.push(`${t}:${r}`);return e.sort()}function jC(e){if(typeof e!="string"||e.length===0)return[];let t=e.indexOf(":");if(t>0){let r=e.slice(0,t),o=e.slice(t+1),i=jr().dexs[r]?.[o];return i?[{dex:r,ticker:o,market:i}]:[]}let n=[];for(let[r,o]of Object.entries(jr().dexs))Object.hasOwn(o,e)&&n.push({dex:r,ticker:e,market:o[e]});return n}function VC(e,t){try{return Jy().books[`${e}:${t}`]??null}catch{return null}}function zC(e,t,n){if(!e||n===null||n.mantissa<=0n)return null;let r=t==="buy"?e.asks:e.bids;if(!r||r.length===0)return null;let o=Number(Me(n));if(!Number.isFinite(o)||o<=0)return null;let i=0,s=0,a=0;for(let c of r){let l=Number(c.px),u=Number(c.sz);if(!(l>0)||!(u>0))continue;let d=l*u,p=Math.min(o,d),m=p/l;if(i+=p,s+=m,o-=p,a+=1,o<=1e-9)break}return s<=0?null:{vwap:i/s,filledUsd:i,unfilledUsd:Math.max(0,o),levelsUsed:a}}function WC(e,t,n,r){let o=zC(e,t,n);if(!o)return{impact:null,depth:null};let i=Number(Me(r));if(!(i>0))return{impact:null,depth:o};let s=t==="buy"?(o.vwap-i)/i:(i-o.vwap)/i,a=Math.max(0,s);return{impact:oe(Number(a.toPrecision(12))),depth:{...o,impactFraction:a,fullyFilled:o.unfilledUsd<=1e-6}}}function wb({dex:e,ticker:t,market:n,side:r,size:o}){let i=Be(n.mark,`${e}:${t}.mark`),s=oe(n.fundingHourly),a=oe(n.vol24h),c=oe(n.oi),l=o===null?D("0"):o,u=VC(e,t),d=null,p=null,m="fees and gas not captured";if(l.mantissa>0n)if(u){let g=WC(u,r,l,i);d=g.impact,p=g.depth,p?.fullyFilled?m="impact measured from l2Book; fees and gas still not captured":m="book walked but size exceeds visible depth; fees and gas not captured"}else m="no order book depth wired for this coin; fees and gas not captured";else u?m="zero size; fees and gas not captured":m="no order book depth wired for this coin; fees and gas not captured";let h={venue:DC,chain:FC,instrument:"perp",tier:qC,symbolRaw:`${e}:${t}`,symbol:t,side:r,requestedSize:l,mark:i,fees:null,gasEstimate:null,priceImpact:d,fundingHourly:s,costAccounted:!1,capturedAt:Ae().capturedAt*1e3,blockOrSeq:null,raw:{fixture:"fixtures/venues.json#venues.hyperliquid_hip3",dex:e,ticker:t,vol24h:n.vol24h,oi:n.oi,fundingAnnPct:n.fundingAnnPct,maxLev:n.maxLev,reasonCostUnknown:m,hasL2Book:u!==null,l2BookFixture:u?"fixtures/hip3_l2books.json":null,depth:p}};return a!==null&&(h.raw.vol24hFixed=a),c!==null&&(h.raw.oiFixed=c),u?.bids?.[0]&&u?.asks?.[0]&&(h.bid=D(String(u.bids[0].px)),h.ask=D(String(u.asks[0].px))),Se(h)}function xb({symbol:e,side:t="buy",sizeUsd:n=null}={}){let r=jC(e);return r.length===0||r.length>1?null:wb({...r[0],side:t,size:n})}function Wi({side:e="buy",sizeUsd:t=null,ticker:n=null}={}){let r=[];for(let o of HC()){let[i,s]=o.split(":");if(n!==null&&s!==n)continue;let a=jr().dexs[i][s];r.push(wb({dex:i,ticker:s,market:a,side:e,size:t}))}return r}var GC="arcus_spot",KC="robinhood-4663",YC="quote-only";function Sb(){return Ae().venues.arcus_spot}function XC(){return Object.keys(Sb().pairs).sort()}function QC({symbol:e,side:t="buy",sizeUsd:n=null}={}){if(typeof e!="string"||e.length===0)return null;let r=Sb().pairs[e];if(!r)return null;let o=r.bid===void 0||r.bid===null?null:Be(r.bid,`${e}.bid`),i=r.ask===void 0||r.ask===null?null:Be(r.ask,`${e}.ask`),s=oe(r.last),a=null;if(o!==null&&i!==null){a={mantissa:o.mantissa+i.mantissa,scale:o.scale===i.scale?o.scale+1:Math.max(o.scale,i.scale)+1};let d=Math.max(o.scale,i.scale),p=o.scale===d?o.mantissa:o.mantissa*10n**BigInt(d-o.scale),m=i.scale===d?i.mantissa:i.mantissa*10n**BigInt(d-i.scale);a={mantissa:p+m,scale:d+1},a={mantissa:(p+m)/2n,scale:d}}else s!==null&&(a=s);if(o===null&&i===null&&a===null)return null;let c=n===null?D("0"):n,l=D("0"),u={venue:GC,chain:KC,instrument:"spot",tier:YC,symbolRaw:e,symbol:e,side:t,requestedSize:c,fees:l,gasEstimate:null,priceImpact:null,fundingHourly:null,costAccounted:!1,capturedAt:Ae().capturedAt*1e3,blockOrSeq:null,raw:{fixture:"fixtures/venues.json#venues.arcus_spot",last:r.last,bid:r.bid,ask:r.ask,vol24h:r.vol24h,feeKnownZero:!0,reasonCostUnknown:"gas and impact at size not captured; fee is a known zero"}};return o!==null&&(u.bid=o),i!==null&&(u.ask=i),a!==null&&(u.mid=a),Se(u)}function Gi({side:e="buy",sizeUsd:t=null}={}){return XC().map(n=>QC({symbol:n,side:e,sizeUsd:t})).filter(n=>n!==null)}var JC="solana_xstocks",ZC="solana",eT="quote-only",kb=25e3;function Ki(){return Xy()}function Sl(){return Object.keys(Ki().tokens).sort()}function tT(e){let t=Ki().pairs[e];return!t||t.length===0?null:[...t].sort((n,r)=>(r.liquidityUsd??0)-(n.liquidityUsd??0))[0]}function nT(e,t){if(e===null||t===null)return null;if(e.mantissa<=0n||t.mantissa<=0n)return D("0");let n=Math.max(e.scale,t.scale),r=e.scale===n?e.mantissa:e.mantissa*10n**BigInt(n-e.scale),o=t.scale===n?t.mantissa:t.mantissa*10n**BigInt(n-t.scale),i=o*10n**6n,s=r+o;return{mantissa:i/s,scale:6}}function kl({symbol:e,side:t="buy",sizeUsd:n=null}={}){if(typeof e!="string"||e.length===0)return null;let r=e,o=e,i=Ki().tokens;if(Object.hasOwn(i,e))r=e,o=i[e].symbolRaw;else if(e.endsWith("x")||e.endsWith("X")){let f=e.slice(0,-1).toUpperCase();if(Object.hasOwn(i,f))r=f,o=i[f].symbolRaw;else return null}else return null;let s=i[r],a=tT(r);if(!s||!a)return null;let c=Be(a.priceUsd,`${r}.priceUsd`),l=oe(a.liquidityUsd),u=n===null?D("0"):n,d=u.mantissa===0n?D("0"):nT(l,u),p=!1;u.mantissa===0n&&(a.liquidityUsd??0)>=kb&&(p=!1);let m={venue:JC,chain:ZC,instrument:"spot",tier:eT,symbolRaw:o,symbol:r,side:t,requestedSize:u,mid:c,fees:null,gasEstimate:null,priceImpact:d,fundingHourly:null,costAccounted:p,capturedAt:Ki().capturedAt*1e3,blockOrSeq:null,raw:{fixture:"fixtures/solana_xstocks.json",mint:s.mint,pairAddress:a.pairAddress,dexId:a.dexId,quote:a.quote,liquidityUsd:a.liquidityUsd,volume24h:a.volume24h,priceUsd:a.priceUsd,source:"dexscreener",approximate:!0,reasonCostUnknown:"DexScreener liquidity.usd is a third-party float; fees and SOL gas not captured; impact is modeled",thin:(a.liquidityUsd??0)<kb}};return Se(m)}function Eb({side:e="buy",sizeUsd:t=null}={}){return Sl().map(n=>kl({symbol:n,side:e,sizeUsd:t})).filter(n=>n!==null)}var rT="ton_stonfi",oT="ton",iT="quote-only",sT=25e3,aT=.01;function Yi(){return Qy()}function El(){return Object.keys(Yi().tokens).sort()}function cT(e){let t=Yi().pairs[e];return!t||t.length===0?null:[...t].sort((n,r)=>(r.liquidityUsd??0)-(n.liquidityUsd??0))[0]}function lT(e,t){if(e===null||t===null)return null;if(e.mantissa<=0n||t.mantissa<=0n)return D("0");let n=Math.max(e.scale,t.scale),r=e.scale===n?e.mantissa:e.mantissa*10n**BigInt(n-e.scale),o=t.scale===n?t.mantissa:t.mantissa*10n**BigInt(n-t.scale),i=o*10n**6n,s=r+o;return{mantissa:i/s,scale:6}}function vl({symbol:e,side:t="buy",sizeUsd:n=null}={}){if(typeof e!="string"||e.length===0)return null;let r=e,o=e,i=Yi().tokens;if(Object.hasOwn(i,e))r=e,o=i[e].symbolRaw;else if(e.endsWith("x")||e.endsWith("X")){let f=e.slice(0,-1).toUpperCase();if(Object.hasOwn(i,f))r=f,o=i[f].symbolRaw;else return null}else{let f=e.toUpperCase();if(Object.hasOwn(i,f))r=f,o=i[f].symbolRaw;else return null}let s=i[r],a=cT(r);if(!s||!a)return null;let c=Be(a.priceUsd,`${r}.priceUsd`),l=oe(a.liquidityUsd),u=n===null?D("0"):n,d=u.mantissa===0n?D("0"):lT(l,u),m={venue:rT,chain:oT,instrument:"spot",tier:iT,symbolRaw:o,symbol:r,side:t,requestedSize:u,mid:c,fees:null,gasEstimate:null,priceImpact:d,fundingHourly:null,costAccounted:!1,capturedAt:Yi().capturedAt*1e3,blockOrSeq:null,raw:{fixture:"fixtures/ton_xstocks.json",mint:s.mint,pairAddress:a.pairAddress,dexId:a.dexId,quote:a.quote,liquidityUsd:a.liquidityUsd,volume24h:a.volume24h,priceUsd:a.priceUsd,source:"dexscreener",approximate:!0,reasonCostUnknown:"DexScreener liquidity.usd is a third-party float; fees and TON gas not captured; impact is modeled; TON books are thin",thin:(a.liquidityUsd??0)<sT,impactSizeFractionHint:aT}};return Se(m)}function vb({side:e="buy",sizeUsd:t=null}={}){return El().map(n=>vl({symbol:n,side:e,sizeUsd:t})).filter(n=>n!==null)}var Ab=3600*1e3;function Al(e){return e==null||e===""?null:typeof e=="object"&&e&&typeof e.mantissa=="bigint"?e:D(String(e))}function Ib(e,{sizeUsd:t=null}={}){if(typeof e!="string"||!e.trim())throw new TypeError("ticker is required");let n=e.trim().toUpperCase(),r=Al(t),o=[],i=xb({symbol:`xyz:${n}`,sizeUsd:r});if(i)o.push(i);else for(let l of Wi({ticker:n,sizeUsd:r}))o.push(l);for(let l of zi({sizeUsd:r}))l.symbol===n&&o.push(l);for(let l of Gi({sizeUsd:r}))l.symbol===n&&o.push(l);let s=Mn({symbol:n,sizeUsd:r});s&&o.push(s);let a=kl({symbol:n,sizeUsd:r});a&&o.push(a);let c=vl({symbol:n,sizeUsd:r});return c&&o.push(c),o}function uT(e={}){let t=String(e.ticker||e.symbol||"").trim().toUpperCase();if(!t)throw new Error("bestEquityRoute requires ticker");let n=Al(e.sizeUsd??e.size??null),r=Ib(t,{sizeUsd:n});if(r.length===0)return{ticker:t,rankedOn:"gross",ranked:[],winner:null,runnersUp:[],improvementBps:null,sourcesAnswered:0,sourcesTried:0,failed:[],excluded:[],bestPreparable:null,instrumentMix:"homogeneous",note:"no venue answered for this ticker in the pinned fixture capture"};let o=r[0].capturedAt,i=String(o).length<=10?o*1e3:o,s=e.nowMs==null,a=e.nowMs??o+1e3,c=Math.max(0,Date.now()-i),l=yl(r,{nowMs:a,horizonHours:e.horizonHours!=null?Number(e.horizonHours):void 0,skipLiveness:e.skipLiveness===!0});return{ticker:t,...l,dataSource:s?"fixture":"caller-clock",capturedAt:i,ageMs:c,stale:c>Ab}}function dT(){let e=[{venue:"hyperliquid_hip3",tier:"quote-only",chain:"hyperliquid",n:Wi().length},{venue:"arcus_perp",tier:"quote-only",chain:"robinhood-4663",n:zi().length},{venue:"arcus_spot",tier:"quote-only",chain:"robinhood-4663",n:Gi().length},{venue:"rh_uniswap",tier:"prepare",chain:4663,n:wl().length},{venue:"solana_xstocks",tier:"quote-only",chain:"solana",n:Sl().length},{venue:"ton_stonfi",tier:"quote-only",chain:"ton",n:El().length}],t=[...Wi(),...zi(),...Gi(),...gb(),...Eb(),...vb()],n=(t[0]?.capturedAt??Date.now())+1e3,{survivors:r,excluded:o}=Hi(t,{nowMs:n});return{inventory:e,hip3Dexs:bb(),liveness:{survivors:r.length,excluded:o.length,byReason:o.reduce((i,s)=>(i[s.reason]=(i[s.reason]??0)+1,i),{})},capturedAt:Ae().capturedAt,custody:"prepare-only",note:"quote-only venues are ranked for discovery; only rh_uniswap is preparable in v1"}}function pT(e={}){let t=String(e.ticker||e.symbol||"").trim().toUpperCase(),n=e.recipient||e.taker;if(!t)throw new Error("prepareEquityRoute requires ticker");if(!n)throw new Error("prepareEquityRoute requires recipient (signing wallet)");let r=Al(e.sizeUsd??e.size??null),o=Mn({symbol:t,sizeUsd:r});if(!o)return{ok:!1,failureKind:"no-prepare-path",ticker:t,note:"no RH Uniswap prepare-tier route for this ticker in fixtures"};try{let i=String(o.capturedAt).length<=10?o.capturedAt*1e3:o.capturedAt,s=e.nowMs!=null,a=s?Number(e.nowMs):Date.now(),c=Math.max(0,Date.now()-i),l=xl({symbol:t,sizeUsd:r,recipient:n,nowMs:a});return{ok:!0,ticker:t,artifact:l,bestPreparableVenue:"rh_uniswap",dataSource:s?"caller-clock":"live-clock",capturedAt:i,ageMs:c,stale:c>Ab}}catch(i){return{ok:!1,failureKind:"prepare-refused",ticker:t,error:String(i.message||i)}}}function mT(e){return JSON.parse(JSON.stringify(e,(t,n)=>typeof n=="bigint"?n.toString():n))}var ue=Object.freeze({SAFE:"SAFE",CAUTION:"CAUTION",HONEYPOT:"HONEYPOT",UNKNOWN:"UNKNOWN"}),fT=5e3,hT=1500;function gT(e,t){return t===0n?null:Number((t-e)*10000n/t)}function yT(e,t){if(e==null||e==="")throw new Error(`sell-sim: ${t} required`);if(typeof e=="bigint")return e;let n=String(e).trim();if(!/^\d+$/.test(n))throw new Error(`sell-sim: ${t} must be an integer base-unit amount`);return BigInt(n)}async function Cb(e={},t={}){let{token:n,base:r,chainId:o=null}=e;if(!n)throw new Error("sell-sim: token required");if(!r)throw new Error("sell-sim: base asset required");if(typeof t.quote!="function")throw new Error("sell-sim: opts.quote function required");let i=yT(e.amountIn,"amountIn"),s;try{s=await t.quote({chainId:o,inputMint:r,outputMint:n,amount:i.toString(),side:"buy"})}catch(p){return vt(ue.UNKNOWN,`buy leg could not be quoted: ${Pb(p)}`,{chainId:o,token:n,base:r})}let a=_b(s?.outAmount);if(a==null||a===0n)return vt(ue.UNKNOWN,"buy leg returned no output \u2014 no route or no liquidity",{chainId:o,token:n,base:r});let c;try{c=await t.quote({chainId:o,inputMint:n,outputMint:r,amount:a.toString(),side:"sell"})}catch(p){return vt(ue.HONEYPOT,`buy routes but the SELL leg fails to quote (${Pb(p)}) \u2014 you would not be able to exit`,{chainId:o,token:n,base:r,tokensOut:a.toString()})}let l=_b(c?.outAmount);if(l==null||l===0n)return vt(ue.HONEYPOT,"sell leg returns zero \u2014 the position cannot be exited for value",{chainId:o,token:n,base:r,tokensOut:a.toString()});let u=gT(l,i),d={chainId:o,token:n,base:r,amountIn:i.toString(),tokensOut:a.toString(),roundTripOut:l.toString(),roundTripLossBps:u};return u==null?vt(ue.UNKNOWN,"could not compute round-trip loss",d):u>=fT?vt(ue.HONEYPOT,`round trip loses ${(u/100).toFixed(1)}% \u2014 a sell tax or rigged curve, not normal slippage`,d):u>=hT?vt(ue.CAUTION,`round trip loses ${(u/100).toFixed(1)}% \u2014 high tax or thin liquidity`,d):vt(ue.SAFE,`round trip loses ${(u/100).toFixed(1)}% \u2014 exit path looks normal`,d)}function vt(e,t,n){return{status:e,safe:e===ue.SAFE,tradable:e===ue.SAFE||e===ue.CAUTION,reason:t,...n}}function _b(e){if(e==null)return null;try{let t=String(e).trim();return/^\d+$/.test(t)?BigInt(t):null}catch{return null}}function Pb(e){return String(e?.message||e).slice(0,120)}async function bT(e={},t={}){let n=await Cb(e,t);if(!(n.status===ue.SAFE||n.status===ue.CAUTION&&t.allowCaution!==!1||n.status===ue.UNKNOWN&&t.allowUnknown===!0)){let o=new Error(`sell-sim ${n.status}: ${n.reason}`);throw o.sellSim=n,o}return n}var At=Object.freeze({ALERT_ONLY:"alert_only",EXECUTE:"execute"}),wT=new Set(["watch","watch this","ping","ping me","alert","notify"]),xT=new Set(["watching","armed"]);function Tb(e){if(typeof e!="string"||!e.trim())throw new TypeError("explicit action verb required");let t=e.trim().toLowerCase().replace(/\s+/g," ");if(wT.has(t))return At.ALERT_ONLY;if(t==="arm")return At.EXECUTE;throw new TypeError(`unsupported action verb: ${t}`)}function ST(e={}){let{verb:t,...n}=e;return{...n,active:!0,actionMode:Tb(t)}}function kT(e){if(!e||typeof e!="object"||typeof e.active!="boolean")throw new TypeError("active must be boolean");if(!Object.values(At).includes(e.actionMode))throw new TypeError("actionMode must be alert_only or execute");return e}function ET(e){return e?.active===!0&&e?.actionMode===At.ALERT_ONLY}function vT(e){return e?.active===!0&&e?.actionMode===At.EXECUTE}function AT(e={}){if(e.actionMode!==void 0&&e.actionMode!==At.ALERT_ONLY)throw new TypeError("non-alert record cannot enter alert-only watch migration");let t=typeof e.active=="boolean"?e.active:xT.has(String(e.status||"").toLowerCase());return{...e,active:t,actionMode:At.ALERT_ONLY}}import{createHash as IT}from"node:crypto";var Il=1,Nb=Object.freeze(["chainId","agentAddress","accountAddress","actions","targets","maxValueWei","maxGasWei","maxSlippageBps","expiresAt","nonce","revocationKey"]),_T=Object.freeze(["read","simulate"]),Ob=1e4,Rb=1440*60,$b=128,Lb=256,Mb=64,Ub=256,Bb=/^0x[0-9a-fA-F]{40}$/,PT=/^[a-z][a-z0-9_-]*:[a-z0-9._-]+$/,CT=/^[a-z][a-z0-9_-]*:\*$/,TT=/^[A-Za-z0-9._:-]+$/,NT=/^[A-Za-z0-9._:-]+$/,Db=/^(0|[1-9][0-9]*)$/,Vr=class extends Error{constructor(t){let n=t.map(r=>`${r.field}: ${r.message}`);super(`invalid grant (${t.length} error${t.length===1?"":"s"}): ${n.join("; ")}`),this.name="GrantValidationError",this.errors=t}};function OT(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function RT(e){if(typeof e=="bigint")return e>=0n?e.toString(10):null;if(typeof e=="number")return!Number.isSafeInteger(e)||e<0?null:String(e);if(typeof e=="string"){let t=e.trim();return Db.test(t)?t:null}return null}function Un(e){if(typeof e=="bigint")return e<0n||e>BigInt(Number.MAX_SAFE_INTEGER)?null:Number(e);if(typeof e=="number")return!Number.isSafeInteger(e)||e<0?null:e;if(typeof e=="string"){let t=e.trim();if(!Db.test(t))return null;let n=Number(t);return Number.isSafeInteger(n)?n:null}return null}function Fb(e){let t=String(e).split(":")[0];return _T.includes(t)}function qb(e,t={}){let n=[],r=(d,p)=>n.push({field:d,message:p});if(!OT(e))return r("grant","grant must be a plain object"),{ok:!1,errors:n,grant:null};for(let d of Object.keys(e))Nb.includes(d)||r(d,"unknown field is not allowed");for(let d of Nb)(!(d in e)||e[d]==null)&&r(d,"required field is missing");if(n.length)return{ok:!1,errors:n,grant:null};let o={},i=Un(e.chainId);i==null||i<=0?r("chainId","must be a positive integer chain id"):o.chainId=i;for(let d of["agentAddress","accountAddress"]){let p=e[d];typeof p!="string"||!Bb.test(p.trim())?r(d,"must be a 0x-prefixed 20-byte hex address"):o[d]=p.trim().toLowerCase()}if(!Array.isArray(e.actions)||e.actions.length===0)r("actions","must be a non-empty array of action scopes");else if(e.actions.length>Mb)r("actions",`too many actions (max ${Mb})`);else{let d=[];for(let p of e.actions){let m=typeof p=="string"?p.trim():null;if(!m){r("actions","action entries must be non-empty strings");continue}if(m.includes("*")){t.allowWildcardActions===!0&&CT.test(m)?d.push(m):r("actions",`broad wildcard action "${m}" is rejected (fail closed)`);continue}if(!PT.test(m)){r("actions",`malformed action "${m}" (expected verb:resource)`);continue}d.push(m)}o.actions=[...new Set(d)].sort()}if(!Array.isArray(e.targets))r("targets","must be an array of contract addresses");else if(e.targets.length>Ub)r("targets",`too many targets (max ${Ub})`);else{let d=[];for(let p of e.targets){let m=typeof p=="string"?p.trim():null;if(!m||!Bb.test(m)){r("targets",`target "${p}" must be a 0x-prefixed 20-byte hex address (wildcards not allowed)`);continue}d.push(m.toLowerCase())}if(o.targets=[...new Set(d)].sort(),o.targets.length===0&&Array.isArray(o.actions)){let p=o.actions.filter(m=>!Fb(m));(p.length>0||o.actions.length===0)&&r("targets",`empty targets are only allowed for read/simulate scopes (blocked by: ${p.join(", ")||"no valid actions"})`)}}for(let d of["maxValueWei","maxGasWei"]){let p=RT(e[d]);p==null?r(d,"must be a non-negative integer wei amount"):o[d]=p}let s=Un(e.maxSlippageBps);s==null||s>Ob?r("maxSlippageBps",`must be an integer between 0 and ${Ob}`):o.maxSlippageBps=s;let a=864e10,c=Un(e.expiresAt);if(c==null||c<=0)r("expiresAt","must be a positive unix-seconds timestamp");else if(c>a)r("expiresAt","exceeds the max unix-seconds timestamp (pass seconds, not milliseconds)");else if(o.expiresAt=c,t.now!=null){let d=Un(t.now);d==null?r("expiresAt","opts.now must be a unix-seconds integer"):c<=d?r("expiresAt",`grant is expired (expiresAt ${c} <= now ${d})`):c-d>Rb&&r("expiresAt",`grant exceeds the hard 24-hour TTL (${Rb} seconds)`)}let l=typeof e.nonce=="string"?e.nonce.trim():Un(e.nonce)!=null?String(Un(e.nonce)):null;!l||l.length>$b||!TT.test(l)?r("nonce",`must be a non-empty string (max ${$b} chars, [A-Za-z0-9._:-])`):o.nonce=l;let u=typeof e.revocationKey=="string"?e.revocationKey.trim():null;return!u||u.length>Lb||!NT.test(u)?r("revocationKey",`must be a non-empty public identifier (max ${Lb} chars, [A-Za-z0-9._:-])`):o.revocationKey=u,n.length?{ok:!1,errors:n,grant:null}:{ok:!0,errors:[],grant:o}}function _l(e,t={}){let{ok:n,errors:r,grant:o}=qb(e,t);if(!n)throw new Vr(r);return o}function Pl(e,t={}){let n=_l(e,t),o=Object.keys(n).sort().map(i=>`${JSON.stringify(i)}:${JSON.stringify(n[i])}`);return`{"version":${Il},${o.join(",")}}`}function Hb(e,t={}){return IT("sha256").update(Pl(e,t),"utf8").digest("hex")}var jb=new Set(["read:markets","read:nfts","read:positions","watch:contracts","prepare:trade","prepare:mint","prepare:build","build:factory","agent:shadow","agent:execute"]),$T="agent:execute",LT="build:factory",Vb=["read:markets","read:nfts","read:positions","watch:contracts","prepare:trade","prepare:mint","prepare:build","agent:shadow"];function MT(e){let t=Array.isArray(e)&&e.length?e:Vb,n=[...new Set(t.map(o=>String(o).trim()).filter(Boolean))],r=n.filter(o=>!jb.has(o));if(r.length)throw new Error(`Invalid scope: ${r.join(", ")}`);return n}var zb=Object.freeze([{id:"oracle",label:"Oracle Native",kind:"oracle",bins:["oracle"],website:!0,detect:!0},{id:"hermes",label:"Hermes Agent",kind:"mcp",bins:["hermes"],mcpTarget:"generic",configKey:"hermes",website:!0,detect:!0},{id:"claude",label:"Claude Code",kind:"mcp",bins:["claude"],mcpTarget:"claude-code",configKey:"claudeCode",website:!0,detect:!0},{id:"claude-desktop",label:"Claude Desktop",kind:"mcp",bins:[],mcpTarget:"claude-desktop",configKey:"claudeDesktop",website:!0,detect:!1},{id:"chatgpt",label:"ChatGPT",kind:"mcp",bins:[],mcpTarget:"chatgpt",configKey:"chatgpt",website:!0,detect:!1},{id:"codex",label:"OpenAI Codex",kind:"mcp",bins:["codex"],mcpTarget:"codex",configKey:"codex",website:!0,detect:!0},{id:"cursor",label:"Cursor",kind:"mcp",bins:["cursor","cursor-agent"],mcpTarget:"cursor",configKey:"cursor",website:!0,detect:!0},{id:"windsurf",label:"Windsurf",kind:"mcp",bins:["windsurf"],mcpTarget:"vscode",configKey:"windsurf",website:!0,detect:!0},{id:"vscode",label:"VS Code / Copilot",kind:"mcp",bins:["code","code-insiders"],mcpTarget:"vscode",configKey:"vscode",website:!0,detect:!0},{id:"openclaw",label:"OpenClaw",kind:"mcp",bins:["openclaw","claw"],mcpTarget:"generic",configKey:"openclaw",website:!0,detect:!0},{id:"perplexity",label:"Perplexity",kind:"mcp",bins:["perplexity","pplx"],mcpTarget:"generic",configKey:"perplexity",website:!0,detect:!0},{id:"manus",label:"Manus",kind:"mcp",bins:["manus"],mcpTarget:"generic",configKey:"manus",website:!0,detect:!0},{id:"prime",label:"Prime Intellect Agent",kind:"mcp",bins:["prime-agent","prime"],mcpTarget:"generic",configKey:"prime",website:!1,detect:!0},{id:"opencode",label:"OpenCode",kind:"mcp",bins:["opencode"],mcpTarget:"generic",configKey:"opencode",website:!1,detect:!0},{id:"aider",label:"Aider",kind:"mcp",bins:["aider"],mcpTarget:"generic",configKey:"aider",website:!1,detect:!0},{id:"continue",label:"Continue",kind:"mcp",bins:["continue"],mcpTarget:"vscode",configKey:"continue",website:!1,detect:!0},{id:"goose",label:"Goose",kind:"mcp",bins:["goose"],mcpTarget:"generic",configKey:"goose",website:!1,detect:!0},{id:"amp",label:"Amp",kind:"mcp",bins:["amp"],mcpTarget:"generic",configKey:"amp",website:!1,detect:!0},{id:"generic",label:"Generic MCP",kind:"mcp",bins:[],mcpTarget:"generic",configKey:"genericMcp",website:!0,detect:!1}]);function Wb(){return zb.filter(e=>e.website)}var UT="@oracle-agent/oracle",BT="npx",DT=["-y","--package",UT,"oracle-data-mcp"],Kb=/(?:^|_)(?:PRIVATE_KEY|SECRET|TOKEN|PASSWORD|PASSPHRASE|MNEMONIC|SEED)(?:_|$)/i;function Tl(e,t){if(typeof e!="string"||!e.trim())throw new TypeError(`${t} must be a non-empty string`);if(/\r|\n|\0/.test(e))throw new TypeError(`${t} must be a single-line string`);return e.trim()}function FT(e){let t=Tl(e,"url"),n;try{n=new URL(t)}catch{throw new TypeError("url must be a valid http(s) URL")}if(!/^https?:$/.test(n.protocol)||n.username||n.password)throw new TypeError("url must be a credential-free http(s) URL");for(let r of n.searchParams.keys())if(Kb.test(r)||/^(?:key|api[_-]?key|auth)$/i.test(r))throw new TypeError(`url must not contain secret-shaped query parameter: ${r}`);return n.href}function qT(e){let t=Tl(e,"key");if(/^[A-Z][A-Z0-9_]*\s*=/.test(t)||/-----BEGIN [A-Z ]*PRIVATE KEY-----/.test(t))throw new TypeError("key must be an Oracle agent key, not an environment assignment or private key");if(/^(?:0x)?[0-9a-f]{64}$/i.test(t)||t.trim().split(/\s+/).length>=12)throw new TypeError("key looks like private signing material");return t}function HT(e){let t=Tl(e,"label");if(!/^[a-z0-9][a-z0-9_-]{0,62}$/i.test(t))throw new TypeError("label must contain only letters, digits, underscores, and hyphens");if(Kb.test(t))throw new TypeError("label must not be a secret-shaped environment name");return t}function Ie(e){return`${JSON.stringify(e,null,2)}
|
|
59
59
|
`}function Cl(e){return JSON.stringify(e)}function zr(e){return JSON.stringify(e)}function Gb(e,t){return["mcp_servers:",` ${e}:`,` command: ${Cl(t.command)}`," args:",...t.args.map(n=>` - ${Cl(n)}`)," env:",...Object.entries(t.env).map(([n,r])=>` ${n}: ${Cl(r)}`),""].join(`
|
|
60
60
|
`)}function jT(e,t){return[`[mcp_servers.${zr(e)}]`,`command = ${zr(t.command)}`,`args = [${t.args.map(zr).join(", ")}]`,"",`[mcp_servers.${zr(e)}.env]`,...Object.entries(t.env).map(([n,r])=>`${n} = ${zr(r)}`),""].join(`
|
|
61
61
|
`)}function VT(){return["# Oracle native harness (default)","npm i -g @oracle-agent/oracle","oracle setup model","oracle chat",""].join(`
|