@oracle-agent/oracle 0.24.4 → 0.24.6
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/README.md +39 -30
- package/SETUP.md +23 -2
- package/dist/assets/profiles/protocol-builder/SOUL.md +6 -1
- package/dist/assets/profiles/protocol-builder/profile.json +1 -1
- package/dist/assets/skills/oracle-desk-product/SKILL.md +1 -1
- package/dist/assets/skills/oracle-multichain-nft-launch/SKILL.md +2 -2
- package/dist/assets/skills/oracle-multichain-token-launch/SKILL.md +2 -2
- package/dist/assets/skills/oracle-protocol-builder/SKILL.md +44 -8
- package/dist/bin/desk-server.mjs +147 -17
- package/dist/bin/oracle-data-mcp.mjs +7 -7
- package/dist/bin/oracle-route.mjs +3 -3
- package/dist/cli/commands/chat.mjs +89 -89
- package/dist/cli/commands/doctor.mjs +5 -5
- package/dist/cli/commands/harness.mjs +5 -5
- package/dist/cli/commands/model.mjs +96 -96
- package/dist/cli/commands/receipt.mjs +3 -3
- package/dist/cli/commands/sign.mjs +12 -12
- package/dist/cli/commands/signer.mjs +14 -8
- package/dist/cli/commands/swap.mjs +2 -2
- package/dist/cli/commands/venues.mjs +3 -3
- package/dist/data/desk-data.mjs +145 -15
- package/dist/index.mjs +150 -20
- package/dist/local-signer/index.mjs +1 -4
- package/dist/router/index.mjs +2 -2
- package/package.json +1 -1
package/dist/index.mjs
CHANGED
|
@@ -1,18 +1,148 @@
|
|
|
1
|
-
var
|
|
2
|
-
`),a=tx("sha256").update(s).digest("hex").slice(0,32);return`${e} ${t} ${a}`}function ux(e,t){let n=Number(t);return Number.isFinite(n)&&n>0?Math.min(n*1e3,cu):Math.min(250*2**e,cu)+Math.floor(Math.random()*100)}async function px(e,{fetchImpl:t,method:n,headers:r,body:o,timeoutMs:i}){let s=new AbortController,a=setTimeout(()=>s.abort(),i);try{let c=String(e),l={...r||{}};for(let u=0;u<=lu;u+=1){let d=await t(c,{method:n,headers:l,body:o,signal:s.signal,redirect:"manual"}),p=await d.text(),m=null;if(p)try{m=JSON.parse(p)}catch{m=null}if(ox.has(d.status)){if(n!=="GET"&&n!=="HEAD"){let h=new Error(`HTTP ${d.status} ${n} ${c} redirected non-idempotent request`);throw h.status=d.status,h.body=m??p.slice(0,300),h}if(u===lu)throw new Error(`HTTP redirect loop for ${e}`);let f=ax(d.headers?.get?.("location"),c);cx(f,c)||(l=sx(l)),c=f;continue}if(!d.ok){let f=new Error(`HTTP ${d.status} ${n} ${c}`);throw f.status=d.status,f.retryAfter=d.headers?.get?.("retry-after")??null,f.body=m??p.slice(0,300),f}return m??p}throw new Error(`HTTP redirect loop for ${e}`)}finally{clearTimeout(a)}}async function y(e,t={}){let n=t.fetchImpl||globalThis.fetch;if(typeof n!="function")throw new Error("fetch unavailable \u2014 pass opts.fetchImpl");let r=t.timeoutMs??12e3,o=(t.method||"GET").toUpperCase(),i={Accept:"application/json",...t.headers||{}},s=t.body;s!=null&&typeof s!="string"&&(i["Content-Type"]=i["Content-Type"]||"application/json",s=JSON.stringify(s));let a=Number.isInteger(t.retries)?Math.max(t.retries,0):rx,c=async()=>{let m;for(let f=0;f<=a;f++)try{return await px(e,{fetchImpl:n,method:o,headers:i,body:s,timeoutMs:r})}catch(h){m=h;let g=h?.status,b=h?.name==="AbortError",k=new Set([408,425,429]),x=g!=null?k.has(g)||nx.has(g)&&au.has(o):!b&&au.has(o);if(f===a||!x)throw h;await dx(ux(f,h?.retryAfter))}throw m};if(!(t.dedupe!==!1&&o==="GET"&&s==null))return c();let u=lx(o,e,i),d=Es.get(u);if(d)return d;let p=c().finally(()=>Es.delete(u));return Es.set(u,p),p}async function ne(e){let t=Date.now();try{let n=await e();return{ok:!0,ms:Date.now()-t,data:n}}catch(n){return{ok:!1,ms:Date.now()-t,error:String(n.message||n),status:n.status??null}}}async function Jt(e,t,n){let r=Array.from(e),o=Math.max(1,Math.min(Number(t)||1,r.length||1)),i=new Array(r.length),s=0;return await Promise.all(Array.from({length:o},async()=>{for(;s<r.length;){let a=s++;i[a]=await n(r[a],a)}})),i}var nx,au,rx,cu,uu,ox,lu,Es,dx,N=Tt(()=>{nx=new Set([408,425,429,500,502,503,504]),au=new Set(["GET","HEAD","OPTIONS","PUT","DELETE"]),rx=2,cu=4e3,uu=["authorization","x-api-key","x-tensor-api-key","0x-api-key","api-key","cookie","proxy-authorization"],ox=new Set([301,302,303,307,308]),lu=3;Es=new Map;dx=e=>new Promise(t=>setTimeout(t,e))});import{readFileSync as Ix}from"node:fs";import{homedir as _x}from"node:os";import{join as io}from"node:path";function Px(){if(process.env.ORACLE_TEST_ISOLATE_SECRETS==="1"){let n=(process.env.ORACLE_EXEC_ENV_FILE||"").trim();return n?[n]:[]}let e=(process.env.ORACLE_EXEC_ENV_FILE||process.env.MAD_EXEC_ENV_FILE||"").trim(),t=_x();if(process.env.ORACLE_PUBLIC_DESKTOP==="1"){let n=(process.env.ORACLE_CONFIG_DIR||io(t,".config","oracle")).trim();return[e,io(n,"exec.env")].filter(Boolean)}return[e,io(t,".config","oracle","exec.env"),io(t,".config","mad-desk","exec.env")].filter(Boolean)}function bu(e,t,n){let r=e??process.env[t]??process.env[n];if(!String(r||"").trim())for(let o of Px())try{let i=Ix(o,"utf8"),s=i.match(new RegExp(`^${t}=(.*)$`,"m"))||i.match(new RegExp(`^${n}=(.*)$`,"m"));if(s&&(r=s[1].trim(),r))break}catch{}if(!String(r||"").trim())throw new Error(`${t} required for attestation. Set it in the environment, or place ${t}=<value> in ~/.config/oracle/exec.env`);return r}var wu=Tt(()=>{});var xu=Tt(()=>{});import{createHash as Cx,createHmac as Tx,timingSafeEqual as XO}from"node:crypto";function Cs(e){return Array.isArray(e)?`[${e.map(Cs).join(",")}]`:e&&typeof e=="object"?`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${Cs(e[t])}`).join(",")}}`:JSON.stringify(e??null)}function Nx(e,{required:t=!1}={}){try{return bu(e,"ORACLE_ROUTE_ATTESTATION_SECRET","MAD_ROUTE_ATTESTATION_SECRET")}catch(n){if(t)throw n;return null}}function Eu(e){let{signature:t,...n}=e;return n}function vu(e,{secret:t}={}){let n=Nx(t);return n?{...e,signature:Tx("sha256",n).update(Cs(Eu(e))).digest("hex")}:e}function Ox(e){let t=String(e||"").toLowerCase();if(!/^0x[0-9a-f]+$/.test(t)||t.length<10||t.length%2!==0)throw new Error("auto-slippage calldata must be even-length hex with a selector");return Cx("sha256").update(Buffer.from(t.slice(2),"hex")).digest("hex")}function J(e,{chainId:t,venue:n,data:r,secret:o}={}){if(!e||e.mode!=="auto")throw new Error("bounded auto-slippage guard required");if(Number(e.chainId)!==Number(t))throw new Error("auto-slippage guard chain mismatch");if(String(e.venue).toLowerCase()!==String(n||"").toLowerCase())throw new Error("auto-slippage guard venue mismatch");return vu({...Eu(e),calldataHash:Ox(r)},{secret:o})}function Ps(e,t=0){let n=Number(e);return Number.isFinite(n)?n:t}function Rx(e){let t=e==null?Su:Number(e);if(!Number.isInteger(t)||t<0)throw new Error("auto-slippage cap must be a non-negative integer bps value");return Math.min(t,Su)}function pe({liquidityUsd:e,priceChange5m:t=0,quoteAgeMs:n=0,crossChain:r=!1,requestedCapBps:o}={}){let i=Ps(e,0),s=i>0?i>=25e4?5:i>=1e5?10:i>=5e4?20:i>=1e4?40:70:r?30:10,a=Math.min(60,Math.abs(Ps(t,0))*2),c=Math.min(40,Math.floor(Math.max(0,Ps(n,0))/5e3)*5),l=Math.max(25,Math.ceil(20+s+a+c)),u=Rx(o);return{mode:"auto",requiredBps:l,selectedBps:Math.min(l,u),capBps:u,executable:l<=u}}function $x({chainId:e,venue:t,quoteAmountOut:n,liquidityUsd:r,priceChange5m:o=0,quoteAgeMs:i=0,crossChain:s=!1,requestedCapBps:a,quotedAtMs:c=Date.now(),ttlMs:l=ku,secret:u}={}){let d=BigInt(n??0);if(d<=0n)throw new Error("auto-slippage guard requires positive quoteAmountOut");let p=pe({liquidityUsd:r,priceChange5m:o,quoteAgeMs:i,crossChain:s,requestedCapBps:a});if(!p.executable)throw new Error(`auto-slippage requires ${p.requiredBps} bps above hard/requested cap ${p.capBps}; route blocked`);let m=Number(c);if(!Number.isFinite(m))throw new Error("auto-slippage: quotedAtMs must be a finite number");let f=Math.min(3e4,Math.max(1e3,Number(l)||ku)),h=d*BigInt(1e4-p.selectedBps),g=h/10000n;if(h%10000n!==0n&&(g+=1n),g>d&&(g=d),d>0n&&g<=0n)throw new Error(`auto-slippage: quote ${d} is too small to express a ${p.selectedBps} bps floor without rounding to zero`);let b=Number((d-g)*10000n/(d===0n?1n:d));if(b>p.capBps)throw new Error(`auto-slippage: realised floor implies ${b} bps, above cap ${p.capBps} \u2014 refusing to issue a guard weaker than advertised`);return vu({mode:"auto",chainId:Number(e),venue:String(t||"unknown"),quoteAmountOut:d.toString(),minAmountOut:g.toString(),requiredBps:p.requiredBps,selectedBps:p.selectedBps,capBps:p.capBps,quotedAtMs:m,expiresAtMs:m+f},{secret:u})}function V(e,{chainId:t,venue:n,amountOut:r,liquidityUsd:o,priceChange5m:i,crossChain:s,requestedCapBps:a,quotedAtMs:c=Date.now(),ttlMs:l}={}){let u=$x({chainId:t,venue:n,quoteAmountOut:r,liquidityUsd:o,priceChange5m:i,crossChain:s,requestedCapBps:a,quotedAtMs:c,ttlMs:l});return{...e,autoSlippage:u,amountOutMinimum:u.minAmountOut}}var Su,ku,me=Tt(()=>{wu();xu();Su=100,ku=2e4});function aa(e){let t=String(e||"").trim();return/^0x[0-9a-fA-F]{40}$/.test(t)?t:ct}var ct,No=Tt(()=>{ct="0x000000000000000000000000000000000000dEaD"});var Bo={};Gw(Bo,{ACROSS_API:()=>Sp,HOP_API:()=>kp,RELAY_API:()=>Ep,acrossHealth:()=>pa,acrossSuggestedFees:()=>Mo,hopHealth:()=>ma,hopQuote:()=>Uo,relayHealth:()=>fa,relayPrepare:()=>ha,relayQuote:()=>dr});async function pa(e={}){try{return{ok:!0,estimatedFillTimeSec:(await Mo({token:"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",destinationToken:"0x82aF49447D8a07e3bd95BD0d56f35241523fBab1",originChainId:1,destinationChainId:42161,amount:"1000000000000000"},e)).estimatedFillTimeSec}}catch(t){return{ok:!1,error:String(t.message||t).slice(0,160)}}}async function Mo(e={},t={}){let{token:n,destinationToken:r=n,originChainId:o,destinationChainId:i,amount:s}=e;if(!n||o==null||i==null||!s)throw new Error("acrossSuggestedFees requires token, originChainId, destinationChainId, amount");let a=new URLSearchParams({token:n,destinationToken:r,originChainId:String(o),destinationChainId:String(i),amount:String(s)}),c=(t.baseUrl||process.env.ACROSS_API_URL||Sp).replace(/\/$/,"");return y(`${c}/suggested-fees?${a}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function ma(e={}){try{let t=await Uo({amount:"1000000000000000",token:"ETH",fromChain:"ethereum",toChain:"arbitrum",slippage:.5},e);return{ok:!0,estimatedRecieved:t.estimatedRecieved||t.estimatedReceived}}catch(t){return{ok:!1,error:String(t.message||t).slice(0,160)}}}async function Uo(e={},t={}){let{amount:n,token:r="ETH",fromChain:o="ethereum",toChain:i="arbitrum"}=e;if(!n)throw new Error("hopQuote requires amount");let s=e.slippage==null?void 0:Math.round(Number(e.slippage)*100),a=pe({liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,crossChain:o!==i,requestedCapBps:e.maxSlippageBps??e.slippageBps??s});if(!a.executable)throw new Error(`hop: route requires ${a.requiredBps} bps above cap ${a.capBps}`);let c=new URLSearchParams({amount:String(n),token:r,fromChain:o,toChain:i,slippage:String(a.selectedBps/100)}),l=(t.baseUrl||process.env.HOP_API_URL||kp).replace(/\/$/,""),u=await y(`${l}/quote?${c}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),d=u?.estimatedRecieved||u?.estimatedReceived;return d?V(u,{chainId:Number(e.originChainId||e.chainId||Mk[o]||0),venue:u?.tx?.to||"hop",amountOut:d,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,crossChain:o!==i,requestedCapBps:e.maxSlippageBps??e.slippageBps??s}):{...u,autoSlippagePolicy:a}}async function fa(e={}){try{let t=await dr({user:ct,originChainId:1,destinationChainId:8453,originCurrency:"0x0000000000000000000000000000000000000000",destinationCurrency:"0x0000000000000000000000000000000000000000",amount:"1000000000000000",tradeType:"EXACT_INPUT"},e);return{ok:!0,hasSteps:Array.isArray(t.steps),stepCount:t.steps?.length||0}}catch(t){return{ok:!1,error:String(t.message||t).slice(0,160)}}}async function dr(e={},t={}){let{user:n=ct,originChainId:r,destinationChainId:o,originCurrency:i="0x0000000000000000000000000000000000000000",destinationCurrency:s="0x0000000000000000000000000000000000000000",amount:a,tradeType:c="EXACT_INPUT"}=e;if(r==null||o==null||!a)throw new Error("relayQuote requires originChainId, destinationChainId, amount");let l=pe({liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,crossChain:Number(r)!==Number(o),requestedCapBps:e.maxSlippageBps??e.slippageBps});if(!l.executable)throw new Error(`relay: route requires ${l.requiredBps} bps above cap ${l.capBps}`);let u=(t.baseUrl||process.env.RELAY_API_URL||Ep).replace(/\/$/,""),d=await y(`${u}/quote`,{method:"POST",body:{user:n,originChainId:Number(r),destinationChainId:Number(o),originCurrency:i,destinationCurrency:s,amount:String(a),tradeType:c,slippageTolerance:String(l.selectedBps)},fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4}),p=d?.details?.currencyOut?.amount;return!p||!/^\d+$/.test(String(p))?{...d,autoSlippagePolicy:l}:V(d,{chainId:Number(r),venue:d?.steps?.[0]?.items?.[0]?.data?.to||"relay",amountOut:p,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,crossChain:Number(r)!==Number(o),requestedCapBps:e.maxSlippageBps??e.slippageBps})}async function ha(e={},t={}){let n=await dr(e,t),r=Number(e.originChainId),o=(n.steps||[]).flatMap(a=>(a.items||[]).filter(c=>c?.data?.to&&c?.data?.data).map(c=>({stepId:a.id,...c.data})));if(!o.length)throw new Error("relay: quote returned no executable transaction items");let i=String(n?.autoSlippage?.venue||"").toLowerCase();if(o.some(a=>String(a.to).toLowerCase()!==i))throw new Error("relay: route includes a separate approval/transaction that is not yet safely bound");let s=o.map(a=>({chainId:r,from:a.from||e.user,to:a.to,data:a.data,value:a.value??"0x0",...a.gasLimit!=null||a.gas!=null?{gasLimit:a.gasLimit??a.gas}:{},slippageGuard:J(n.autoSlippage,{chainId:r,venue:a.to,data:a.data})}));return O({provider:"relay",calldataReady:!0,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:r,quote:n,autoSlippage:n.autoSlippage,transactions:s},{provider:"relay",kind:"relay-tx"})}var Sp,kp,Ep,Mk,Do=Tt(()=>{N();me();No();W();Sp="https://across.to/api",kp="https://api.hop.exchange/v1",Ep="https://api.relay.link",Mk={ethereum:1,optimism:10,bsc:56,polygon:137,arbitrum:42161,avalanche:43114,base:8453}});W();import{Interface as Iu,getAddress as Zn,isAddress as Lx}from"ethers";N();var Xn={robinhood:{chainId:4663,name:"Robinhood Chain",rpcEnv:["RH_CHAIN_RPC"],evm:!0},ethereum:{chainId:1,name:"Ethereum",rpcEnv:["ETH_RPC_URL","ETHEREUM_RPC_URL","MAINNET_RPC_URL"],evm:!0},polygon:{chainId:137,name:"Polygon",rpcEnv:["POLYGON_RPC_URL","POLYGON_RPC"],evm:!0},arbitrum:{chainId:42161,name:"Arbitrum One",rpcEnv:["ARBITRUM_RPC_URL","ARB_RPC_URL"],evm:!0},base:{chainId:8453,name:"Base",rpcEnv:["BASE_RPC_URL"],evm:!0},hyperevm:{chainId:999,name:"HyperEVM",rpcEnv:["HYPEREVM_RPC_URL","HYPER_EVM_RPC"],evm:!0},bsc:{chainId:56,name:"BNB Smart Chain",rpcEnv:["BSC_RPC_URL","BNB_RPC_URL"],evm:!0},avalanche:{chainId:43114,name:"Avalanche C-Chain",rpcEnv:["AVALANCHE_RPC_URL","AVAX_RPC_URL"],evm:!0},optimism:{chainId:10,name:"OP Mainnet",rpcEnv:["OPTIMISM_RPC_URL","OP_RPC_URL"],evm:!0},abstract:{chainId:2741,name:"Abstract",rpcEnv:["ABSTRACT_RPC_URL","ABS_RPC_URL"],evm:!0},stable:{chainId:988,name:"Stable Mainnet",rpcEnv:["STABLE_RPC_URL","STABLE_RPC"],evm:!0}},vs=new Map(Object.values(Xn).map(e=>[e.chainId,e]));function Jr(e){return vs.get(Number(e))||null}function mx({key:e,chainId:t,name:n,rpcEnv:r=[]}){if(!e)throw new Error("registerChain requires a key");if(!Number.isInteger(Number(t)))throw new Error("registerChain requires a numeric chainId");let o={chainId:Number(t),name:n||e,rpcEnv:r,evm:!0};return Xn[e]=o,vs.set(o.chainId,o),o}function As(e,t=process.env){let n=Jr(e);if(!n)return null;for(let r of n.rpcEnv){let o=(t[r]||"").trim();if(o)return o}return null}function Is(e){return vs.has(Number(e))}import{Interface as fx,getAddress as hx}from"ethers";var Zr=new fx(["function allowance(address owner,address spender) view returns (uint256)","function balanceOf(address account) view returns (uint256)"]);function ot(e,t){try{return hx(e).toLowerCase()}catch{throw new Error(`${t} must be a valid EVM address`)}}function gx(e){let t=String(e||"").trim();if(!/^0x[0-9a-fA-F]{64}$/.test(t))throw new Error("txHash must be a 32-byte hex transaction hash");return t.toLowerCase()}function _s(e){return e==null?null:Number.parseInt(String(e),16)}var du={1:"https://ethereum.publicnode.com",137:"https://polygon-bor-rpc.publicnode.com",42161:"https://arbitrum-one-rpc.publicnode.com",8453:"https://base-rpc.publicnode.com",10:"https://optimism-rpc.publicnode.com",988:"https://rpc.stable.xyz",56:"https://bsc-rpc.publicnode.com",43114:"https://avalanche-c-chain-rpc.publicnode.com",999:"https://rpc.hyperliquid.xyz/evm",2741:"https://api.mainnet.abs.xyz",4663:"https://rpc.mainnet.chain.robinhood.com"};function pu(e,{rpcUrl:t,env:n=process.env}={}){if(t)return t;let r=As(e,n);return r||du[Number(e)]||null}var yx=/^(?:eth_(?:call|blocknumber|chainid|get[a-z0-9]+|feehistory|gasprice|maxpriorityfeepergas|syncing|protocolversion|estimategas|createaccesslist)|net_(?:version|listening|peercount)|web3_(?:clientversion|sha3))$/;function bx(e){let t=String(e||""),n=t.toLowerCase();if(t!==t.trim()||!/^[a-zA-Z0-9_]+$/.test(t)||!yx.test(n))throw new Error(`evm-rpc: ${t} refused \u2014 @oracle-agent/oracle is prepare-only (read RPC only; no broadcast/sign)`);return n}async function L(e,t,n=[],r={}){let o=String(t||"");bx(o);let i=pu(e,r);if(!i)throw new Error(`No RPC URL for chainId ${e} (set env from chain registry rpcEnv or pass rpcUrl)`);let a=await y(i,{method:"POST",body:{jsonrpc:"2.0",id:1,method:t,params:n},fetchImpl:r.fetchImpl,timeoutMs:r.timeoutMs??12e3});if(a?.error){let c=new Error(a.error.message||JSON.stringify(a.error));throw c.code=a.error.code,c}return a.result}async function Qn(e,t={}){let n=await L(e,"eth_blockNumber",[],t),r=parseInt(n,16),o=await L(e,"eth_chainId",[],t),i=parseInt(o,16);return{ok:Number.isFinite(r)&&i===Number(e),chainId:Number(e),reportedChainId:i,blockNumber:r,name:Jr(e)?.name||null}}async function eo(e,t={}){let n=await L(e,"eth_blockNumber",[],t);return parseInt(n,16)}async function mu(e,t={}){let n=await L(e,"eth_chainId",[],t);return parseInt(n,16)}async function Zt(e,t,n={}){if(!t)throw new Error("rpcGetBalance requires address");let r=await L(e,"eth_getBalance",[t,"latest"],n);return{chainId:Number(e),address:t,balanceWei:BigInt(r).toString(),balanceHex:r}}async function fu(e={},t={}){let n=Number(e.chainId??t.chainId??1),r=ot(e.token||e.tokenAddress,"token"),o=ot(e.owner,"owner"),i=ot(e.spender,"spender"),s=Zr.encodeFunctionData("allowance",[o,i]),a=await L(n,"eth_call",[{to:r,data:s},e.blockTag||"latest"],t),c=Zr.decodeFunctionResult("allowance",a),l=BigInt(c[0]);return{chainId:n,token:r,owner:o,spender:i,allowance:l.toString(),allowanceHex:`0x${l.toString(16)}`,blockTag:e.blockTag||"latest"}}async function to(e={},t={}){let n=Number(e.chainId??t.chainId??1),r=ot(e.token||e.tokenAddress,"token"),o=ot(e.account||e.owner||e.address,"account"),i=Zr.encodeFunctionData("balanceOf",[o]),s=await L(n,"eth_call",[{to:r,data:i},e.blockTag||"latest"],t),a=Zr.decodeFunctionResult("balanceOf",s),c=BigInt(a[0]);return{chainId:n,token:r,account:o,balance:c.toString(),balanceHex:`0x${c.toString(16)}`,blockTag:e.blockTag||"latest"}}async function no(e={},t={}){let n=Number(e.chainId??t.chainId??1),r=gx(e.txHash||e.hash||e.transactionHash),o=await L(n,"eth_getTransactionReceipt",[r],t);if(!o)return{ok:!1,chainId:n,txHash:r,status:"pending",receipt:null,reason:"receipt pending"};let i=_s(o.status),s=i===1,a=i===1?"success":i===0?"reverted":"unknown",c=s?null:a==="reverted"?"transaction reverted":"unknown receipt status",l=e.expectedTo?ot(e.expectedTo,"expectedTo"):null,u=o.to?ot(o.to,"receipt.to"):null;return l&&u!==l&&(s=!1,c=`to mismatch: expected ${l}, got ${u||"null"}`),{ok:s,chainId:n,txHash:r,status:a,reason:c,statusCode:i,to:u,from:o.from?ot(o.from,"receipt.from"):null,blockNumber:_s(o.blockNumber),transactionIndex:_s(o.transactionIndex),logs:Array.isArray(o.logs)?o.logs:[],receipt:o}}async function hu(e={}){let t=e.chainIds||Object.values(Xn).map(r=>r.chainId),n={};return await Promise.all(t.map(async r=>{if(!Is(r)&&!du[r]&&!pu(r,e)){n[r]={ok:!1,error:"no rpc configured",chainId:r};return}try{n[r]=await Qn(r,e)}catch(o){n[r]={ok:!1,chainId:r,error:String(o.message||o)}}})),n}N();var xx="https://api.dexscreener.com",Sx=Object.freeze({1:"ethereum",10:"optimism",56:"bsc",137:"polygon",8453:"base",42161:"arbitrum",43114:"avalanche",999:"hyperevm",4663:"robinhood"}),Te=e=>String(e??"").toLowerCase(),kx=e=>Array.isArray(e)?e:e==null?[]:[e];function Ex(e,t,n){let r=Te(t),o=Te(n),i=Te(e?.baseToken?.address),s=Te(e?.quoteToken?.address);return i===r&&s===o||i===o&&s===r}function vx(e){let t=Number(e?.liquidity?.usd);return Number.isFinite(t)&&t>=0?t:null}function ro(e={}){return(e.baseUrl||process.env.DEXSCREENER_API_URL||xx).replace(/\/$/,"")}async function gu(e={}){let n=(await y(`${ro(e)}/latest/dex/search?q=USDC`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??12e3}))?.pairs?.length||0;return{ok:n>0,pairSample:n}}async function Nt(e,t={}){if(!e)throw new Error("tokenAddress required");return y(`${ro(t)}/latest/dex/tokens/${e}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3})}async function Jn(e,t={}){if(!e)throw new Error("query required");return y(`${ro(t)}/latest/dex/search?q=${encodeURIComponent(e)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3})}async function yu(e,t,n={}){if(!e||!t)throw new Error("chainId and pairAddress required");return y(`${ro(n)}/latest/dex/pairs/${e}/${t}`,{fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs??12e3})}async function oo({chainId:e,tokenA:t,tokenB:n,dexIds:r=[]}={},o={}){if(e==null||!t||!n)throw new Error("chainId, tokenA, and tokenB required");let i=Te(Sx[Number(e)]||e),s=new Set(kx(r).filter(Boolean).map(Te)),a=[...new Set([t,n].map(p=>String(p)).filter(Boolean))],c=await Promise.allSettled(a.map(p=>Nt(p,{...o,baseUrl:o.dexscreenerBaseUrl,timeoutMs:o.dexscreenerTimeoutMs??Math.min(Number(o.timeoutMs??4e3),4e3)}))),l=new Set,u=[];for(let p of c)if(p.status==="fulfilled")for(let m of p.value?.pairs||p.value?.data?.pairs||[]){let f=`${Te(m?.chainId)}:${Te(m?.dexId)}:${Te(m?.pairAddress)}`;l.has(f)||(l.add(f),u.push(m))}return u.filter(p=>Te(p?.chainId)===i).filter(p=>Ex(p,t,n)).filter(p=>!s.size||s.has(Te(p?.dexId))).map(p=>({pairAddress:p.pairAddress??null,dexId:p.dexId??null,chainId:p.chainId??null,liquidityUsd:vx(p),pairCreatedAt:p.pairCreatedAt??null})).filter(p=>p.liquidityUsd!=null).sort((p,m)=>m.liquidityUsd-p.liquidityUsd)[0]??null}me();W();var ce={1:{name:"ethereum",quoter:"0x61fFE014bA17989E743c5F6cB21bF9697530B21e",router:"0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45",weth:"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",usdc:"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48"},8453:{name:"base",quoter:"0x3d4e44Eb1374240CE5F1B871ab261CD16335B76a",router:"0x2626664c2603336E57B271c5C0b26F421741e481",weth:"0x4200000000000000000000000000000000000006",usdc:"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"},42161:{name:"arbitrum",quoter:"0x61fFE014bA17989E743c5F6cB21bF9697530B21e",router:"0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45",weth:"0x82aF49447D8a07e3bd95BD0d56f35241523fBab1",usdc:"0xaf88d065e77c8cC2239327C5EDb3A432268e5831"},4663:{name:"robinhood",quoter:"0x33e885ed0ec9bf04ecfb19341582aadcb4c8a9e7",router:"0xcaf681a66d020601342297493863e78c959e5cb2",weth:"0x0bd7d308f8e1639fab988df18a8011f41eacad73",usdc:"0x5fc5360D0400a0Fd4f2af552ADD042D716F1d168"},999:{name:"hyperevm",weth:"0x5555555555555555555555555555555555555555",usdc:"0xB8CE59FC3717ada4C02eaDF9682A9e934F625ebb"},10:{name:"optimism",quoter:"0x61fFE014bA17989E743c5F6cB21bF9697530B21e",router:"0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45",weth:"0x4200000000000000000000000000000000000006",usdc:"0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85"},56:{name:"bsc",quoter:"0x78D78E420Da98ad378D7799bE8f4AF69033EB077",router:"0xB971eF87ede563556b2ED4b1C0b0019111Dd85d2",weth:"0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c",usdc:"0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d"},137:{name:"polygon",quoter:"0x61fFE014bA17989E743c5F6cB21bF9697530B21e",router:"0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45",weth:"0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270",usdc:"0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359"},43114:{name:"avalanche",quoter:"0xbe0F5544EC67e9B3b2D979aaA43f18Fd87E6257F",router:"0xbb00FF08d01D300023C629E8fFfFcb65A5a578cE",weth:"0xB31f66AA3C1e785363F0875A1B74E27b85FD66c7",usdc:"0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E"}},Mx=[100,500,3e3,1e4],so=new Iu(["function quoteExactInputSingle((address tokenIn, address tokenOut, uint256 amountIn, uint24 fee, uint160 sqrtPriceLimitX96) params) returns (uint256 amountOut, uint160 sqrtPriceX96After, uint32 initializedTicksCrossed, uint256 gasEstimate)","function quoteExactInput(bytes path, uint256 amountIn) returns (uint256 amountOut, uint160[] sqrtPriceX96AfterList, uint32[] initializedTicksCrossedList, uint256 gasEstimate)"]),Au=new Iu(["function exactInputSingle((address tokenIn,address tokenOut,uint24 fee,address recipient,uint256 amountIn,uint256 amountOutMinimum,uint160 sqrtPriceLimitX96) params) payable returns (uint256 amountOut)","function multicall(uint256 deadline,bytes[] data) payable returns (bytes[] results)"]),_u="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",Pu="0x0000000000000000000000000000000000000000",Ts=[100,500,2500,1e4],Ux={56:{pancakeswap:{name:"pancakeswap",quoter:"0xB048Bbc1Ee6b733FFfCFb9e9CeF7375518e25997",router:"0x13f4EA83D0bd40E75C8222255bc855a974568Dd4",feeTiers:Ts}},8453:{pancakeswap:{name:"pancakeswap",quoter:"0xB048Bbc1Ee6b733FFfCFb9e9CeF7375518e25997",router:"0x13f4EA83D0bd40E75C8222255bc855a974568Dd4",feeTiers:Ts}},42161:{pancakeswap:{name:"pancakeswap",quoter:"0xB048Bbc1Ee6b733FFfCFb9e9CeF7375518e25997",router:"0x13f4EA83D0bd40E75C8222255bc855a974568Dd4",feeTiers:Ts}},999:{hyperswap:{name:"hyperswap",quoter:"0x03A918028f22D9E1473B7959C927AD7425A45C7C",router:"0x4E2960a8cd19B467b82d26D83fAcb0fAE26b094D"}}};function Os(e,t){let n=Number(e),r=ce[n];if(!r)throw new Error(`uniswap-v3: unsupported chainId ${e} (supported: ${Object.keys(ce).join(", ")})`);let o=Ux[n]||{};if(!t){if(!r.quoter||!r.router){let c=Object.keys(o).join(", ")||"none registered";throw new Error(`uniswap-v3: chain ${n} (${r.name}) has no canonical Uniswap v3 deployment -- name a venue explicitly (known: ${c})`)}return{chainId:n,venue:r.name,...r}}let i=String(t).toLowerCase();if(i===r.name&&r.quoter&&r.router)return{chainId:n,venue:r.name,...r};let s=o,a=s[i];if(!a){let c=[...r.quoter&&r.router?[r.name]:[],...Object.keys(s)].join(", ");throw new Error(`uniswap-v3: unknown venue "${t}" on chain ${n} (known: ${c})`)}return{chainId:n,venue:i,...r,quoter:a.quoter,router:a.router,feeTiers:a.feeTiers||null}}function Ns(e,t){let n=ce[Number(t)];if(!e||e===_u||e===Pu||/^eth$/i.test(String(e)))return Zn(n.weth);let r=String(e);if(/^weth$/i.test(r))return Zn(n.weth);if(/^usdc$/i.test(r))return Zn(n.usdc);if(!Lx(r))throw new Error(`invalid token address: ${e}`);return Zn(r)}function Bx(e){let t=String(e||"uniswap").toLowerCase();return t==="uniswap"?["uniswap-v3","uniswap"]:t==="pancakeswap"?["pancakeswap-v3","pancakeswap"]:t==="hyperswap"?["hyperswap-v3","hyperswap"]:[t,`${t}-v3`]}function Dx(e,t){if(e.length!==t.length+1)throw new Error("path: fees.length must be tokens.length - 1");let n="0x";for(let r=0;r<t.length;r++)n+=e[r].slice(2).toLowerCase(),n+=Number(t[r]).toString(16).padStart(6,"0");return n+=e[e.length-1].slice(2).toLowerCase(),n}async function it(e={},t={}){let{chainId:n,quoter:r,router:o,feeTiers:i}=Os(e.chainId??8453,e.venue),s=Ns(e.tokenIn||"WETH",n),a=Ns(e.tokenOut||ce[n].usdc,n),c=BigInt(e.amountIn??0);if(c<=0n)throw new Error("amountIn required (raw base units)");let l=i&&i.length?i:Mx,u=e.fee!=null?[Number(e.fee)]:e.tryFees===!1?[l[Math.min(2,l.length-1)]]:[...l],d=[],p=null;for(let h of u){let g=so.encodeFunctionData("quoteExactInputSingle",[{tokenIn:s,tokenOut:a,amountIn:c,fee:h,sqrtPriceLimitX96:0n}]);try{let b=await L(n,"eth_call",[{to:r,data:g},"latest"],t);if(!b||b==="0x"){d.push({fee:h,ok:!1,error:"empty result"});continue}let k=so.decodeFunctionResult("quoteExactInputSingle",b),x={fee:h,ok:!0,amountOut:k[0].toString(),sqrtPriceX96After:k[1].toString(),initializedTicksCrossed:Number(k[2]),gasEstimate:k[3].toString()};d.push(x),(!p||BigInt(x.amountOut)>BigInt(p.amountOut))&&(p=x)}catch(b){d.push({fee:h,ok:!1,error:String(b.message||b).slice(0,160)})}}if(!p){let h=d.map(g=>`${g.fee}:${g.error||"fail"}`).join("; ");throw new Error(`uniswap-v3 quote failed chain=${n}: ${h}`)}let m=e.liquidityUsd==null?await oo({chainId:n,tokenA:s,tokenB:a,dexIds:Bx(e.venue)},t).catch(()=>null):null,f=e.liquidityUsd??m?.liquidityUsd??null;return V({venue:"uniswap-v3",chainId:n,chain:ce[n].name,quoter:r,tokenIn:s,tokenOut:a,amountIn:c.toString(),fee:p.fee,amountOut:p.amountOut,gasEstimate:p.gasEstimate,liquidityUsd:f,liquiditySource:m,sqrtPriceX96After:p.sqrtPriceX96After,initializedTicksCrossed:p.initializedTicksCrossed,triedFees:d,best:!0},{chainId:n,venue:o,amountOut:p.amountOut,liquidityUsd:f,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps})}async function Cu(e={},t={}){let{chainId:n,quoter:r,router:o}=Os(e.chainId??8453),i=(e.tokens||[]).map(p=>Ns(p,n)),s=(e.fees||[]).map(Number);if(i.length<2)throw new Error("tokens[] need at least 2 addresses");let a=BigInt(e.amountIn??0);if(a<=0n)throw new Error("amountIn required");let c=Dx(i,s),l=so.encodeFunctionData("quoteExactInput",[c,a]),u=await L(n,"eth_call",[{to:r,data:l},"latest"],t),d=so.decodeFunctionResult("quoteExactInput",u);return V({venue:"uniswap-v3",chainId:n,chain:ce[n].name,quoter:r,tokens:i,fees:s,path:c,amountIn:a.toString(),amountOut:d[0].toString(),gasEstimate:d[3].toString()},{chainId:n,venue:o,amountOut:d[0].toString(),liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps})}async function Rs(e={},t={}){let n=Number(e.chainId??8453),r=e.amountIn??"1000000000000000",o=await it({chainId:n,tokenIn:ce[n].weth,tokenOut:ce[n].usdc,amountIn:r,fee:e.fee},t),i=Number(o.amountOut)/1e6;return{...o,amountOutUsdc:i,pair:"WETH/USDC"}}async function Tu(e={},t={}){let n=Number(e.chainId??8453),r=Os(n,e.venue),o=Zn(e.recipient),i=String(e.tokenIn||"WETH"),s=!e.tokenIn||i===_u||i===Pu||/^eth$/i.test(i),a=await it(e,t),c=Au.encodeFunctionData("exactInputSingle",[{tokenIn:a.tokenIn,tokenOut:a.tokenOut,fee:a.fee,recipient:o,amountIn:BigInt(a.amountIn),amountOutMinimum:BigInt(a.amountOutMinimum),sqrtPriceLimitX96:0n}]),l=Math.min(600,Math.max(30,Number(e.deadlineSeconds??300))),d=Number(t.nowSeconds??Math.floor(Date.now()/1e3))+l,p=Au.encodeFunctionData("multicall",[d,[c]]);return O({provider:"uniswap-v3",calldataReady:!0,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:n,deadline:d,quote:a,autoSlippage:a.autoSlippage,requiresApproval:s?null:{token:a.tokenIn,spender:r.router,amount:a.amountIn},transaction:{chainId:n,from:o,to:r.router,data:p,value:s?a.amountIn:"0",slippageGuard:J(a.autoSlippage,{chainId:n,venue:r.router,data:p})}},{provider:"uniswap-v3",kind:"univ3-swap-tx"})}async function Nu(e={}){let t=Number(e.chainId??8453);try{let n=await Rs({chainId:t,amountIn:"1000000000000000"},e);return{ok:!0,chainId:t,fee:n.fee,amountOutUsdc:n.amountOutUsdc,midPxHint:n.amountOutUsdc/.001}}catch(n){return{ok:!1,chainId:t,error:String(n.message||n).slice(0,200)}}}async function Ou(){return Object.entries(ce).map(([e,t])=>({chainId:Number(e),name:t.name,quoter:t.quoter,weth:t.weth,usdc:t.usdc}))}import{AbiCoder as qx,Interface as Lu,getAddress as qe,isAddress as ao,keccak256 as Hx}from"ethers";me();W();var jx=qx.defaultAbiCoder(),en="0x0000000000000000000000000000000000000000",He={1:{name:"ethereum",poolManager:"0x000000000004444c5dc75cB358380D2e3dE08A90",quoter:"0x52f0e24d1c21c8a0cb1e5a5dd6198556bd9e1203",stateView:"0x7ffe42c4a5deea5b0fec41c94c136cf115597227",universalRouter:"0x66a9893cc07d91d95644aedd05d03f95e1dba8af",weth:"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",usdc:"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48"},10:{name:"optimism",poolManager:"0x9a13f98cb987694c9f086b1f5eb990eea8264ec3",quoter:"0x1f3131a13296fb91c90870043742c3cdbff1a8d7",stateView:"0xc18a3169788f4f75a170290584eca6395c75ecdb",universalRouter:"0x851116d9223fabed8e56c0e6b8ad0c31d98b3507",weth:"0x4200000000000000000000000000000000000006",usdc:"0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85"},56:{name:"bsc",poolManager:"0x28e2ea090877bf75740558f6bfb36a5ffee9e9df",quoter:"0x9f75dd27d6664c475b90e105573e550ff69437b0",stateView:"0xd13dd3d6e93f276fafc9db9e6bb47c1180aee0c4",universalRouter:"0x1906c1d672b88cd1b9ac7593301ca990f94eae07",weth:"0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c",usdc:"0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d"},137:{name:"polygon",poolManager:"0x67366782805870060151383f4bbff9dab53e5cd6",quoter:"0xb3d5c3dfc3a7aebff71895a7191796bffc2c81b9",stateView:"0x5ea1bd7974c8a611cbab0bdcafcb1d9cc9b3ba5a",universalRouter:"0x1095692a6237d83c6a72f3f5efedb9a670c49223",weth:"0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270",usdc:"0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359"},8453:{name:"base",poolManager:"0x498581fF718922c3f8e6A244956aF099B2652b2b",quoter:"0x0d5e0f971ed27fbff6c2837bf31316121532048d",stateView:"0xa3c0c9b65bad0b08107aa264b0f3db444b867a71",universalRouter:"0x6ff5693b99212da76ad316178a184ab56d299b43",weth:"0x4200000000000000000000000000000000000006",usdc:"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"},42161:{name:"arbitrum",poolManager:"0x360e68faccca8ca495c1b759fd9eee466db9fb32",quoter:"0x3972c00f7ed4885e145823eb7c655375d275a1c5",stateView:"0x76fd297e2d437cd7f76d50f01afe6160f86e9990",universalRouter:"0xa51afafe0263b40edaef0df8781ea9aa03e381a3",weth:"0x82aF49447D8a07e3bd95BD0d56f35241523fBab1",usdc:"0xaf88d065e77c8cC2239327C5EDb3A432268e5831"},43114:{name:"avalanche",poolManager:"0x06380c0e0912312b5150364b9dc4542ba0dbbc85",quoter:"0xbe40675bb704506a3c2ccfb762dcfd1e979845c2",stateView:"0xc3c9e198c735a4b97e3e683f391ccbdd60b69286",universalRouter:"0x94b75331ae8d42c1b61065089b7d48fe14aa73b7",weth:"0xB31f66AA3C1e785363F0875A1B74E27b85FD66c7",usdc:"0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E"},4663:{name:"robinhood",poolManager:"0x8366a39cc670b4001a1121b8f6a443a643e40951",quoter:"0x8dc178efb8111bb0973dd9d722ebeff267c98f94",stateView:"0xf3334192d15450cdd385c8b70e03f9a6bd9e673b",universalRouter:"0x8876789976dEcBfCbBbe364623C63652db8C0904",weth:"0x0bd7d308f8e1639fab988df18a8011f41eacad73",usdc:"0x5fc5360D0400a0Fd4f2af552ADD042D716F1d168"}},Vx=[{fee:100,tickSpacing:1},{fee:500,tickSpacing:10},{fee:3e3,tickSpacing:60},{fee:1e4,tickSpacing:200},{fee:25e3,tickSpacing:8}],Ru=new Lu(["function quoteExactInputSingle(((address currency0,address currency1,uint24 fee,int24 tickSpacing,address hooks) poolKey,bool zeroForOne,uint128 exactAmount,bytes hookData) params) returns (uint256 amountOut, uint256 gasEstimate)"]),uR=new Lu(["function execute(bytes commands,bytes[] inputs,uint256 deadline) payable"]);var zx="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE";function Mu(e){let t=Number(e),n=He[t];if(!n)throw new Error(`uniswap-v4: unsupported chainId ${e} (supported: ${Object.keys(He).join(", ")})`);return{chainId:t,...n}}function $u(e,t){let n=He[Number(t)];if(!e||e===zx||e===en||/^eth$/i.test(String(e)))return qe(n.weth);let r=String(e);if(/^weth$/i.test(r))return qe(n.weth);if(/^usdc$/i.test(r)||/^usdg$/i.test(r))return qe(n.usdc);if(!ao(r))throw new Error(`invalid token address: ${e}`);return qe(r)}function Wx({currency0:e,currency1:t,fee:n,tickSpacing:r,hooks:o=en}){let i=qe(e),s=qe(t);if(i.toLowerCase()===s.toLowerCase())throw new Error("poolKey currencies must differ");let[a,c]=i.toLowerCase()<s.toLowerCase()?[i,s]:[s,i],l=o&&ao(o)?qe(o):en;return Hx(jx.encode(["address","address","uint24","int24","address"],[a,c,Number(n),Number(r),l]))}function Gx({tokenIn:e,tokenOut:t,fee:n,tickSpacing:r,hooks:o=en}){let i=qe(e),s=qe(t),[a,c]=i.toLowerCase()<s.toLowerCase()?[i,s]:[s,i],l=i.toLowerCase()===a.toLowerCase();return{poolKey:{currency0:a,currency1:c,fee:Number(n),tickSpacing:Number(r),hooks:o&&ao(o)?qe(o):en},zeroForOne:l}}var Kx=["uniswap-v4","uniswapv4"];async function co(e={},t={}){let{chainId:n,quoter:r,poolManager:o,universalRouter:i}=Mu(e.chainId??8453),s=$u(e.tokenIn||"WETH",n),a=$u(e.tokenOut||He[n].usdc,n),c=BigInt(e.amountIn??0);if(c<=0n)throw new Error("amountIn required (raw base units)");if(c>0xffffffffffffffffffffffffffffffffn)throw new Error("amountIn exceeds uint128");let l=e.fee!=null&&e.tickSpacing!=null?[{fee:Number(e.fee),tickSpacing:Number(e.tickSpacing)}]:e.tryTiers===!1?[{fee:500,tickSpacing:10}]:[...Vx],u=e.hooks||en,d=[],p=null;for(let h of l){let{poolKey:g,zeroForOne:b}=Gx({tokenIn:s,tokenOut:a,fee:h.fee,tickSpacing:h.tickSpacing,hooks:u}),k=Ru.encodeFunctionData("quoteExactInputSingle",[{poolKey:g,zeroForOne:b,exactAmount:c,hookData:"0x"}]);try{let x=await L(n,"eth_call",[{to:r,data:k},"latest"],t);if(!x||x==="0x"){d.push({...h,ok:!1,error:"empty result"});continue}let w=Ru.decodeFunctionResult("quoteExactInputSingle",x),v={fee:h.fee,tickSpacing:h.tickSpacing,ok:!0,amountOut:w[0].toString(),gasEstimate:w[1].toString(),poolKey:g,zeroForOne:b,poolId:Wx({...g})};d.push(v),(!p||BigInt(v.amountOut)>BigInt(p.amountOut))&&(p=v)}catch(x){d.push({...h,ok:!1,error:String(x.message||x).slice(0,160)})}}if(!p){let h=d.map(g=>`${g.fee}/${g.tickSpacing}:${g.error||"fail"}`).join("; ");throw new Error(`uniswap-v4 quote failed chain=${n}: ${h}`)}let m=e.liquidityUsd==null?await oo({chainId:n,tokenA:s,tokenB:a,dexIds:Kx},t).catch(()=>null):null,f=e.liquidityUsd??m?.liquidityUsd??null;return V({venue:"uniswap-v4",chainId:n,chain:He[n].name,poolManager:o,quoter:r,universalRouter:i||null,tokenIn:s,tokenOut:a,amountIn:c.toString(),fee:p.fee,tickSpacing:p.tickSpacing,hooks:p.poolKey.hooks,poolId:p.poolId,zeroForOne:p.zeroForOne,amountOut:p.amountOut,gasEstimate:p.gasEstimate,liquidityUsd:f,liquiditySource:m,triedTiers:d,best:!0,executionReady:!1,prepareReady:typeof e.recipient=="string"&&ao(e.recipient)&&e.slippageBps!=null},{chainId:n,venue:i||r,amountOut:p.amountOut,liquidityUsd:f,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps})}async function Uu(){return Object.entries(He).map(([e,t])=>({chainId:Number(e),name:t.name,poolManager:t.poolManager,quoter:t.quoter,stateView:t.stateView||null,universalRouter:t.universalRouter||null,weth:t.weth,usdc:t.usdc}))}async function Bu(e={}){let t=Mu(e.chainId??8453),n=await L(t.chainId,"eth_getCode",[t.quoter,"latest"],e),r=typeof n=="string"&&n!=="0x"&&n.length>4;return{ok:r,chainId:t.chainId,quoter:t.quoter,poolManager:t.poolManager,codeBytes:r?(n.length-2)/2:0}}var tn=Object.freeze(["blockNumber","nativeBalance","tokenBalance","resolveToken","resolvePools","scanBlocks","scoreRisk","quote","sellSimulation","prepareUnsignedTx"]),B=Object.freeze({LIVE:"LIVE",CACHED:"CACHED",STALE:"STALE",UNKNOWN:"UNKNOWN",UNAVAILABLE:"UNAVAILABLE"}),M=Object.freeze({PASS:"PASS",CAUTION:"CAUTION",FAIL:"FAIL",UNKNOWN:"UNKNOWN"}),Xx=/^0x[0-9a-fA-F]{40}$/;function Du(e={}){let t=[],n=[];if(!e||typeof e!="object")return{ok:!1,errors:["definition must be an object"],warnings:n};if((!Number.isInteger(e.chainId)||e.chainId<=0)&&t.push("chainId must be a positive integer"),(typeof e.key!="string"||!/^[a-z][a-z0-9-]*$/.test(e.key||""))&&t.push('key must be a lowercase slug (e.g. "base")'),(typeof e.name!="string"||!e.name.trim())&&t.push("name is required"),!Array.isArray(e.rpcEnv)||e.rpcEnv.length===0)t.push("rpcEnv must list at least one environment variable name");else for(let o of e.rpcEnv)(typeof o!="string"||!/^[A-Z][A-Z0-9_]*$/.test(o))&&t.push(`rpcEnv entry "${o}" should be an UPPER_SNAKE env var name`);if(e.nativeCurrency){let o=e.nativeCurrency;(typeof o.symbol!="string"||!o.symbol)&&t.push("nativeCurrency.symbol is required when nativeCurrency is set"),Number.isInteger(o.decimals)||t.push("nativeCurrency.decimals must be an integer")}for(let[o,i]of(e.venues||[]).entries()){let s=`venues[${o}]`;if(!i||typeof i!="object"){t.push(`${s} must be an object`);continue}Xx.test(i.address||"")||t.push(`${s}.address is not a valid 20-byte address`),/^0x0{40}$/.test(i.address||"")&&t.push(`${s}.address is the zero address -- placeholder left in place?`),i.kind||t.push(`${s}.kind is required (router|quoter|factory|...)`),i.verified?(i.verified.method||t.push(`${s}.verified.method is required`),i.verified.source||t.push(`${s}.verified.source is required`),i.verified.date||n.push(`${s}.verified.date missing -- add one so staleness is visible`)):t.push(`${s} must record verification: { verified: { method, source, date } }. An unverified venue stays blocked.`)}let r=e.capabilities||{};for(let o of Object.keys(r))tn.includes(o)?typeof r[o]!="function"&&t.push(`capability "${o}" must be a function`):t.push(`unknown capability "${o}"`);return Object.keys(r).length===0&&n.push("scanner implements no capabilities -- it can only be registered, not used"),r.prepareUnsignedTx&&!r.quote&&n.push("prepareUnsignedTx without quote: no priced expectation to validate the built tx against"),r.prepareUnsignedTx&&!r.sellSimulation&&n.push("prepareUnsignedTx without sellSimulation: cannot prove an asset is exitable before buying"),{ok:t.length===0,errors:t,warnings:n}}function Fu(e){let{ok:t,errors:n,warnings:r}=Du(e);if(!t)throw new Error(`invalid scanner for ${e?.key??"<unknown>"}:
|
|
1
|
+
var gx=Object.defineProperty;var Ot=(e,t,n)=>()=>{if(n)throw n[0];try{return e&&(t=e(e=0)),t}catch(r){throw n=[r],r}};var yx=(e,t)=>{for(var n in t)gx(e,n,{get:t[n],enumerable:!0})};import{createHash as bx,createHmac as wx,timingSafeEqual as xx}from"node:crypto";function bu(e){let t=e==null||e===""?Jn:Number(e);return!Number.isFinite(t)||t<0?Jn:Math.min(t,As)}function vs(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(vs).join(",")}]`:`{${Object.keys(e).sort().map(n=>`${JSON.stringify(n)}:${vs(e[n])}`).join(",")}}`}function yu(e){let t=String(e?.ORACLE_STAMP_HMAC_SECRET||"").trim();return t.length>=16?t:""}function Is(e=process.env){return yu(process.env)||yu(e)}function Sx(e=process.env){return String(process.env.ORACLE_STAMP_REQUIRE_MAC||"").trim()==="1"||String(e?.ORACLE_STAMP_REQUIRE_MAC||"").trim()==="1"}function kx(e){let{oraclePrepared:t,prepareHash:n,prepareMac:r,note:o,...i}=e||{};return i}function _s(e){let t=kx(e);return bx("sha256").update(vs(t)).digest("hex")}function Ps(e,t=Is()){return t?wx("sha256",t).update(String(e)).digest("hex"):""}function vx(e,t){try{let n=Buffer.from(String(e),"hex"),r=Buffer.from(String(t),"hex");return n.length===0||n.length!==r.length?!1:xx(n,r)}catch{return!1}}function O(e,{provider:t,kind:n,env:r=process.env}={}){if(!e||typeof e!="object")throw new Error("stampPrepared: payload object required");let o={...e,provider:e.provider||t,kind:e.kind||n,requiresUserSignature:e.requiresUserSignature!==!1,signingReady:!1,broadcastReady:!1,executionReady:!1};if(!o.provider)throw new Error("stampPrepared: provider required");if(!o.kind)throw new Error("stampPrepared: kind required");let i=Date.now(),s=i+Jn,c={...o,preparedAt:i,expiresAt:s,prepareVersion:Es},l=_s(c),u=Is(r),d=u?Ps(l,u):void 0,p={...c,oraclePrepared:!0,prepareHash:l};return d&&(p.prepareMac=d),p}function Ex(e,{maxAgeMs:t=Jn,nowMs:n=Date.now(),providers:r=null,kinds:o=null,label:i="operator",env:s=process.env}={}){if(!e||typeof e!="object")throw new Error(`${i}: prepared envelope object required`);if(e.oraclePrepared!==!0)throw new Error(`${i}: prepared integrity envelope missing \u2014 use an @oracle-agent/oracle prepare result`);if(Number(e.prepareVersion)!==Es)throw new Error(`${i}: unsupported prepareVersion ${e.prepareVersion}`);let a=_s(e);if(String(e.prepareHash||"")!==a)throw new Error(`${i}: prepareHash mismatch \u2014 payload was altered after prepare`);let c=Is(s),l=String(e.prepareMac||"");if(Sx(s)||l||c){if(!c)throw new Error(`${i}: prepareMac present or ORACLE_STAMP_REQUIRE_MAC=1 but ORACLE_STAMP_HMAC_SECRET missing in signer`);let h=Ps(a,c);if(!l||!vx(l,h))throw new Error(`${i}: prepareMac mismatch \u2014 stamp not from trusted preparer`)}let u=Number(e.preparedAt),d=Number(e.expiresAt),p=bu(t),m=n-u,f=d-u;if(!Number.isFinite(m)||!Number.isFinite(d)||!Number.isFinite(f)||m<0||f<=0||f>As||m>p||n>d)throw new Error(`${i}: prepare envelope expired or clock-skewed (ageMs=${m}, max=${p})`);if(r&&!new Set(r).has(e.provider))throw new Error(`${i}: provider ${e.provider} not allowed here`);if(o&&!new Set(o).has(e.kind))throw new Error(`${i}: kind ${e.kind} not allowed here`);return!0}var Es,Jn,As,W=Ot(()=>{Es=2,Jn=300*1e3,As=(()=>{let e=Number(process.env.ORACLE_PREPARE_HARD_MAX_AGE_MS);return Number.isFinite(e)&&e>0?e:1800*1e3})()});import{createHash as Ax}from"node:crypto";function Nx(e){let t=String(e||"").toLowerCase();return ku.includes(t)||/(^|-)(api[-_]?key|key|token|secret|auth|authorization|session|cookie|signature|access)(-|$)/.test(t)}function Cx(e){let t={};for(let[n,r]of Object.entries(e||{}))Nx(n)||(t[n]=r);return t}function Tx(e,t){if(!e)throw new Error(`HTTP redirect from ${t} missing Location`);let n=new URL(String(e),String(t));if(n.protocol!=="http:"&&n.protocol!=="https:")throw new Error(`HTTP redirect from ${t} used unsupported protocol ${n.protocol}`);return n.toString()}function Ox(e,t){return new URL(String(e)).origin===new URL(String(t)).origin}function Rx(e,t,n){let r={};for(let[c,l]of Object.entries(n||{}))r[c.toLowerCase()]=l;let o=Object.keys(r).filter(c=>/(^|-)(api[-_]?key|key|token|secret|auth|authorization|session|cookie|signature|access)(-|$)/.test(c)),s=[...new Set([...ku,...o])].sort().map(c=>`${c}=${r[c]??""}`).join(`
|
|
2
|
+
`),a=Ax("sha256").update(s).digest("hex").slice(0,32);return`${e} ${t} ${a}`}function $x(e,t){let n=Number(t);return Number.isFinite(n)&&n>0?Math.min(n*1e3,xu):Math.min(250*2**e,xu)+Math.floor(Math.random()*100)}async function Mx(e,{fetchImpl:t,method:n,headers:r,body:o,timeoutMs:i}){let s=new AbortController,a=setTimeout(()=>s.abort(),i);try{let c=String(e),l={...r||{}};for(let u=0;u<=Su;u+=1){let d=await t(c,{method:n,headers:l,body:o,signal:s.signal,redirect:"manual"}),p=await d.text(),m=null;if(p)try{m=JSON.parse(p)}catch{m=null}if(Px.has(d.status)){if(n!=="GET"&&n!=="HEAD"){let h=new Error(`HTTP ${d.status} ${n} ${c} redirected non-idempotent request`);throw h.status=d.status,h.body=m??p.slice(0,300),h}if(u===Su)throw new Error(`HTTP redirect loop for ${e}`);let f=Tx(d.headers?.get?.("location"),c);Ox(f,c)||(l=Cx(l)),c=f;continue}if(!d.ok){let f=new Error(`HTTP ${d.status} ${n} ${c}`);throw f.status=d.status,f.retryAfter=d.headers?.get?.("retry-after")??null,f.body=m??p.slice(0,300),f}return m??p}throw new Error(`HTTP redirect loop for ${e}`)}finally{clearTimeout(a)}}async function y(e,t={}){let n=t.fetchImpl||globalThis.fetch;if(typeof n!="function")throw new Error("fetch unavailable \u2014 pass opts.fetchImpl");let r=t.timeoutMs??12e3,o=(t.method||"GET").toUpperCase(),i={Accept:"application/json",...t.headers||{}},s=t.body;s!=null&&typeof s!="string"&&(i["Content-Type"]=i["Content-Type"]||"application/json",s=JSON.stringify(s));let a=Number.isInteger(t.retries)?Math.max(t.retries,0):_x,c=async()=>{let m;for(let f=0;f<=a;f++)try{return await Mx(e,{fetchImpl:n,method:o,headers:i,body:s,timeoutMs:r})}catch(h){m=h;let g=h?.status,b=h?.name==="AbortError",k=new Set([408,425,429]),x=g!=null?k.has(g)||Ix.has(g)&&wu.has(o):!b&&wu.has(o);if(f===a||!x)throw h;await Lx($x(f,h?.retryAfter))}throw m};if(!(t.dedupe!==!1&&o==="GET"&&s==null))return c();let u=Rx(o,e,i),d=Ns.get(u);if(d)return d;let p=c().finally(()=>Ns.delete(u));return Ns.set(u,p),p}async function ne(e){let t=Date.now();try{let n=await e();return{ok:!0,ms:Date.now()-t,data:n}}catch(n){return{ok:!1,ms:Date.now()-t,error:String(n.message||n),status:n.status??null}}}async function en(e,t,n){let r=Array.from(e),o=Math.max(1,Math.min(Number(t)||1,r.length||1)),i=new Array(r.length),s=0;return await Promise.all(Array.from({length:o},async()=>{for(;s<r.length;){let a=s++;i[a]=await n(r[a],a)}})),i}var Ix,wu,_x,xu,ku,Px,Su,Ns,Lx,T=Ot(()=>{Ix=new Set([408,425,429,500,502,503,504]),wu=new Set(["GET","HEAD","OPTIONS","PUT","DELETE"]),_x=2,xu=4e3,ku=["authorization","x-api-key","x-tensor-api-key","0x-api-key","api-key","cookie","proxy-authorization"],Px=new Set([301,302,303,307,308]),Su=3;Ns=new Map;Lx=e=>new Promise(t=>setTimeout(t,e))});import{readFileSync as Xx}from"node:fs";import{homedir as Qx}from"node:os";import{join as lo}from"node:path";function Jx(){if(process.env.ORACLE_TEST_ISOLATE_SECRETS==="1"){let n=(process.env.ORACLE_EXEC_ENV_FILE||"").trim();return n?[n]:[]}let e=(process.env.ORACLE_EXEC_ENV_FILE||process.env.MAD_EXEC_ENV_FILE||"").trim(),t=Qx();if(process.env.ORACLE_PUBLIC_DESKTOP==="1"){let n=(process.env.ORACLE_CONFIG_DIR||lo(t,".config","oracle")).trim();return[e,lo(n,"exec.env")].filter(Boolean)}return[e,lo(t,".config","oracle","exec.env"),lo(t,".config","mad-desk","exec.env")].filter(Boolean)}function Cu(e,t,n){let r=e??process.env[t]??process.env[n];if(!String(r||"").trim())for(let o of Jx())try{let i=Xx(o,"utf8"),s=i.match(new RegExp(`^${t}=(.*)$`,"m"))||i.match(new RegExp(`^${n}=(.*)$`,"m"));if(s&&(r=s[1].trim(),r))break}catch{}if(!String(r||"").trim())throw new Error(`${t} required for attestation. Set it in the environment, or place ${t}=<value> in ~/.config/oracle/exec.env`);return r}var Tu=Ot(()=>{});var Ou=Ot(()=>{});import{createHash as Zx,createHmac as eS,timingSafeEqual as qR}from"node:crypto";function Ls(e){return Array.isArray(e)?`[${e.map(Ls).join(",")}]`:e&&typeof e=="object"?`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${Ls(e[t])}`).join(",")}}`:JSON.stringify(e??null)}function tS(e,{required:t=!1}={}){try{return Cu(e,"ORACLE_ROUTE_ATTESTATION_SECRET","MAD_ROUTE_ATTESTATION_SECRET")}catch(n){if(t)throw n;return null}}function Lu(e){let{signature:t,...n}=e;return n}function Mu(e,{secret:t}={}){let n=tS(t);return n?{...e,signature:eS("sha256",n).update(Ls(Lu(e))).digest("hex")}:e}function nS(e){let t=String(e||"").toLowerCase();if(!/^0x[0-9a-f]+$/.test(t)||t.length<10||t.length%2!==0)throw new Error("auto-slippage calldata must be even-length hex with a selector");return Zx("sha256").update(Buffer.from(t.slice(2),"hex")).digest("hex")}function J(e,{chainId:t,venue:n,data:r,secret:o}={}){if(!e||e.mode!=="auto")throw new Error("bounded auto-slippage guard required");if(Number(e.chainId)!==Number(t))throw new Error("auto-slippage guard chain mismatch");if(String(e.venue).toLowerCase()!==String(n||"").toLowerCase())throw new Error("auto-slippage guard venue mismatch");return Mu({...Lu(e),calldataHash:nS(r)},{secret:o})}function $s(e,t=0){let n=Number(e);return Number.isFinite(n)?n:t}function rS(e){let t=e==null?Ru:Number(e);if(!Number.isInteger(t)||t<0)throw new Error("auto-slippage cap must be a non-negative integer bps value");return Math.min(t,Ru)}function pe({liquidityUsd:e,priceChange5m:t=0,quoteAgeMs:n=0,crossChain:r=!1,requestedCapBps:o}={}){let i=$s(e,0),s=i>0?i>=25e4?5:i>=1e5?10:i>=5e4?20:i>=1e4?40:70:r?30:10,a=Math.min(60,Math.abs($s(t,0))*2),c=Math.min(40,Math.floor(Math.max(0,$s(n,0))/5e3)*5),l=Math.max(25,Math.ceil(20+s+a+c)),u=rS(o);return{mode:"auto",requiredBps:l,selectedBps:Math.min(l,u),capBps:u,executable:l<=u}}function oS({chainId:e,venue:t,quoteAmountOut:n,liquidityUsd:r,priceChange5m:o=0,quoteAgeMs:i=0,crossChain:s=!1,requestedCapBps:a,quotedAtMs:c=Date.now(),ttlMs:l=$u,secret:u}={}){let d=BigInt(n??0);if(d<=0n)throw new Error("auto-slippage guard requires positive quoteAmountOut");let p=pe({liquidityUsd:r,priceChange5m:o,quoteAgeMs:i,crossChain:s,requestedCapBps:a});if(!p.executable)throw new Error(`auto-slippage requires ${p.requiredBps} bps above hard/requested cap ${p.capBps}; route blocked`);let m=Number(c);if(!Number.isFinite(m))throw new Error("auto-slippage: quotedAtMs must be a finite number");let f=Math.min(3e4,Math.max(1e3,Number(l)||$u)),h=d*BigInt(1e4-p.selectedBps),g=h/10000n;if(h%10000n!==0n&&(g+=1n),g>d&&(g=d),d>0n&&g<=0n)throw new Error(`auto-slippage: quote ${d} is too small to express a ${p.selectedBps} bps floor without rounding to zero`);let b=Number((d-g)*10000n/(d===0n?1n:d));if(b>p.capBps)throw new Error(`auto-slippage: realised floor implies ${b} bps, above cap ${p.capBps} \u2014 refusing to issue a guard weaker than advertised`);return Mu({mode:"auto",chainId:Number(e),venue:String(t||"unknown"),quoteAmountOut:d.toString(),minAmountOut:g.toString(),requiredBps:p.requiredBps,selectedBps:p.selectedBps,capBps:p.capBps,quotedAtMs:m,expiresAtMs:m+f},{secret:u})}function V(e,{chainId:t,venue:n,amountOut:r,liquidityUsd:o,priceChange5m:i,crossChain:s,requestedCapBps:a,quotedAtMs:c=Date.now(),ttlMs:l}={}){let u=oS({chainId:t,venue:n,quoteAmountOut:r,liquidityUsd:o,priceChange5m:i,crossChain:s,requestedCapBps:a,quotedAtMs:c,ttlMs:l});return{...e,autoSlippage:u,amountOutMinimum:u.minAmountOut}}var Ru,$u,me=Ot(()=>{Tu();Ou();Ru=100,$u=2e4});function ma(e){let t=String(e||"").trim();return/^0x[0-9a-fA-F]{40}$/.test(t)?t:ut}var ut,Lo=Ot(()=>{ut="0x000000000000000000000000000000000000dEaD"});var Ho={};yx(Ho,{ACROSS_API:()=>Rp,HOP_API:()=>$p,RELAY_API:()=>Lp,acrossHealth:()=>ba,acrossSuggestedFees:()=>Fo,hopHealth:()=>wa,hopQuote:()=>qo,relayHealth:()=>xa,relayPrepare:()=>Sa,relayQuote:()=>fr});async function ba(e={}){try{return{ok:!0,estimatedFillTimeSec:(await Fo({token:"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",destinationToken:"0x82aF49447D8a07e3bd95BD0d56f35241523fBab1",originChainId:1,destinationChainId:42161,amount:"1000000000000000"},e)).estimatedFillTimeSec}}catch(t){return{ok:!1,error:String(t.message||t).slice(0,160)}}}async function Fo(e={},t={}){let{token:n,destinationToken:r=n,originChainId:o,destinationChainId:i,amount:s}=e;if(!n||o==null||i==null||!s)throw new Error("acrossSuggestedFees requires token, originChainId, destinationChainId, amount");let a=new URLSearchParams({token:n,destinationToken:r,originChainId:String(o),destinationChainId:String(i),amount:String(s)}),c=(t.baseUrl||process.env.ACROSS_API_URL||Rp).replace(/\/$/,"");return y(`${c}/suggested-fees?${a}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function wa(e={}){try{let t=await qo({amount:"1000000000000000",token:"ETH",fromChain:"ethereum",toChain:"arbitrum",slippage:.5},e);return{ok:!0,estimatedRecieved:t.estimatedRecieved||t.estimatedReceived}}catch(t){return{ok:!1,error:String(t.message||t).slice(0,160)}}}async function qo(e={},t={}){let{amount:n,token:r="ETH",fromChain:o="ethereum",toChain:i="arbitrum"}=e;if(!n)throw new Error("hopQuote requires amount");let s=e.slippage==null?void 0:Math.round(Number(e.slippage)*100),a=pe({liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,crossChain:o!==i,requestedCapBps:e.maxSlippageBps??e.slippageBps??s});if(!a.executable)throw new Error(`hop: route requires ${a.requiredBps} bps above cap ${a.capBps}`);let c=new URLSearchParams({amount:String(n),token:r,fromChain:o,toChain:i,slippage:String(a.selectedBps/100)}),l=(t.baseUrl||process.env.HOP_API_URL||$p).replace(/\/$/,""),u=await y(`${l}/quote?${c}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),d=u?.estimatedRecieved||u?.estimatedReceived;return d?V(u,{chainId:Number(e.originChainId||e.chainId||sv[o]||0),venue:u?.tx?.to||"hop",amountOut:d,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,crossChain:o!==i,requestedCapBps:e.maxSlippageBps??e.slippageBps??s}):{...u,autoSlippagePolicy:a}}async function xa(e={}){try{let t=await fr({user:ut,originChainId:1,destinationChainId:8453,originCurrency:"0x0000000000000000000000000000000000000000",destinationCurrency:"0x0000000000000000000000000000000000000000",amount:"1000000000000000",tradeType:"EXACT_INPUT"},e);return{ok:!0,hasSteps:Array.isArray(t.steps),stepCount:t.steps?.length||0}}catch(t){return{ok:!1,error:String(t.message||t).slice(0,160)}}}async function fr(e={},t={}){let{user:n=ut,originChainId:r,destinationChainId:o,originCurrency:i="0x0000000000000000000000000000000000000000",destinationCurrency:s="0x0000000000000000000000000000000000000000",amount:a,tradeType:c="EXACT_INPUT"}=e;if(r==null||o==null||!a)throw new Error("relayQuote requires originChainId, destinationChainId, amount");let l=pe({liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,crossChain:Number(r)!==Number(o),requestedCapBps:e.maxSlippageBps??e.slippageBps});if(!l.executable)throw new Error(`relay: route requires ${l.requiredBps} bps above cap ${l.capBps}`);let u=(t.baseUrl||process.env.RELAY_API_URL||Lp).replace(/\/$/,""),d=await y(`${u}/quote`,{method:"POST",body:{user:n,originChainId:Number(r),destinationChainId:Number(o),originCurrency:i,destinationCurrency:s,amount:String(a),tradeType:c,slippageTolerance:String(l.selectedBps)},fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4}),p=d?.details?.currencyOut?.amount;return!p||!/^\d+$/.test(String(p))?{...d,autoSlippagePolicy:l}:V(d,{chainId:Number(r),venue:d?.steps?.[0]?.items?.[0]?.data?.to||"relay",amountOut:p,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,crossChain:Number(r)!==Number(o),requestedCapBps:e.maxSlippageBps??e.slippageBps})}async function Sa(e={},t={}){let n=await fr(e,t),r=Number(e.originChainId),o=(n.steps||[]).flatMap(a=>(a.items||[]).filter(c=>c?.data?.to&&c?.data?.data).map(c=>({stepId:a.id,...c.data})));if(!o.length)throw new Error("relay: quote returned no executable transaction items");let i=String(n?.autoSlippage?.venue||"").toLowerCase();if(o.some(a=>String(a.to).toLowerCase()!==i))throw new Error("relay: route includes a separate approval/transaction that is not yet safely bound");let s=o.map(a=>({chainId:r,from:a.from||e.user,to:a.to,data:a.data,value:a.value??"0x0",...a.gasLimit!=null||a.gas!=null?{gasLimit:a.gasLimit??a.gas}:{},slippageGuard:J(n.autoSlippage,{chainId:r,venue:a.to,data:a.data})}));return O({provider:"relay",calldataReady:!0,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:r,quote:n,autoSlippage:n.autoSlippage,transactions:s},{provider:"relay",kind:"relay-tx"})}var Rp,$p,Lp,sv,jo=Ot(()=>{T();me();Lo();W();Rp="https://across.to/api",$p="https://api.hop.exchange/v1",Lp="https://api.relay.link",sv={ethereum:1,optimism:10,bsc:56,polygon:137,arbitrum:42161,avalanche:43114,base:8453}});W();import{Interface as Bu,getAddress as nr,isAddress as iS}from"ethers";T();var Zn={robinhood:{chainId:4663,name:"Robinhood Chain",rpcEnv:["RH_CHAIN_RPC"],evm:!0},ethereum:{chainId:1,name:"Ethereum",rpcEnv:["ETH_RPC_URL","ETHEREUM_RPC_URL","MAINNET_RPC_URL"],evm:!0},polygon:{chainId:137,name:"Polygon",rpcEnv:["POLYGON_RPC_URL","POLYGON_RPC"],evm:!0},arbitrum:{chainId:42161,name:"Arbitrum One",rpcEnv:["ARBITRUM_RPC_URL","ARB_RPC_URL"],evm:!0},base:{chainId:8453,name:"Base",rpcEnv:["BASE_RPC_URL"],evm:!0},hyperevm:{chainId:999,name:"HyperEVM",rpcEnv:["HYPEREVM_RPC_URL","HYPER_EVM_RPC"],evm:!0},bsc:{chainId:56,name:"BNB Smart Chain",rpcEnv:["BSC_RPC_URL","BNB_RPC_URL"],evm:!0},avalanche:{chainId:43114,name:"Avalanche C-Chain",rpcEnv:["AVALANCHE_RPC_URL","AVAX_RPC_URL"],evm:!0},optimism:{chainId:10,name:"OP Mainnet",rpcEnv:["OPTIMISM_RPC_URL","OP_RPC_URL"],evm:!0},abstract:{chainId:2741,name:"Abstract",rpcEnv:["ABSTRACT_RPC_URL","ABS_RPC_URL"],evm:!0},stable:{chainId:988,name:"Stable Mainnet",rpcEnv:["STABLE_RPC_URL","STABLE_RPC"],evm:!0}},Cs=new Map(Object.values(Zn).map(e=>[e.chainId,e]));function no(e){return Cs.get(Number(e))||null}function Ux({key:e,chainId:t,name:n,rpcEnv:r=[]}){if(!e)throw new Error("registerChain requires a key");if(!Number.isInteger(Number(t)))throw new Error("registerChain requires a numeric chainId");let o={chainId:Number(t),name:n||e,rpcEnv:r,evm:!0};return Zn[e]=o,Cs.set(o.chainId,o),o}function Ts(e,t=process.env){let n=no(e);if(!n)return null;for(let r of n.rpcEnv){let o=(t[r]||"").trim();if(o)return o}return null}function Os(e){return Cs.has(Number(e))}import{Interface as Bx,getAddress as Dx}from"ethers";var ro=new Bx(["function allowance(address owner,address spender) view returns (uint256)","function balanceOf(address account) view returns (uint256)"]);function st(e,t){try{return Dx(e).toLowerCase()}catch{throw new Error(`${t} must be a valid EVM address`)}}function Fx(e){let t=String(e||"").trim();if(!/^0x[0-9a-fA-F]{64}$/.test(t))throw new Error("txHash must be a 32-byte hex transaction hash");return t.toLowerCase()}function Rs(e){return e==null?null:Number.parseInt(String(e),16)}var vu={1:"https://ethereum.publicnode.com",137:"https://polygon-bor-rpc.publicnode.com",42161:"https://arbitrum-one-rpc.publicnode.com",8453:"https://base-rpc.publicnode.com",10:"https://optimism-rpc.publicnode.com",988:"https://rpc.stable.xyz",56:"https://bsc-rpc.publicnode.com",43114:"https://avalanche-c-chain-rpc.publicnode.com",999:"https://rpc.hyperliquid.xyz/evm",2741:"https://api.mainnet.abs.xyz",4663:"https://rpc.mainnet.chain.robinhood.com"};function Eu(e,{rpcUrl:t,env:n=process.env}={}){if(t)return t;let r=Ts(e,n);return r||vu[Number(e)]||null}var qx=/^(?:eth_(?:call|blocknumber|chainid|get[a-z0-9]+|feehistory|gasprice|maxpriorityfeepergas|syncing|protocolversion|estimategas|createaccesslist)|net_(?:version|listening|peercount)|web3_(?:clientversion|sha3))$/;function Hx(e){let t=String(e||""),n=t.toLowerCase();if(t!==t.trim()||!/^[a-zA-Z0-9_]+$/.test(t)||!qx.test(n))throw new Error(`evm-rpc: ${t} refused \u2014 @oracle-agent/oracle is prepare-only (read RPC only; no broadcast/sign)`);return n}async function L(e,t,n=[],r={}){let o=String(t||"");Hx(o);let i=Eu(e,r);if(!i)throw new Error(`No RPC URL for chainId ${e} (set env from chain registry rpcEnv or pass rpcUrl)`);let a=await y(i,{method:"POST",body:{jsonrpc:"2.0",id:1,method:t,params:n},fetchImpl:r.fetchImpl,timeoutMs:r.timeoutMs??12e3});if(a?.error){let c=new Error(a.error.message||JSON.stringify(a.error));throw c.code=a.error.code,c}return a.result}async function er(e,t={}){let n=await L(e,"eth_blockNumber",[],t),r=parseInt(n,16),o=await L(e,"eth_chainId",[],t),i=parseInt(o,16);return{ok:Number.isFinite(r)&&i===Number(e),chainId:Number(e),reportedChainId:i,blockNumber:r,name:no(e)?.name||null}}async function oo(e,t={}){let n=await L(e,"eth_blockNumber",[],t);return parseInt(n,16)}async function Au(e,t={}){let n=await L(e,"eth_chainId",[],t);return parseInt(n,16)}async function tn(e,t,n={}){if(!t)throw new Error("rpcGetBalance requires address");let r=await L(e,"eth_getBalance",[t,"latest"],n);return{chainId:Number(e),address:t,balanceWei:BigInt(r).toString(),balanceHex:r}}async function Iu(e={},t={}){let n=Number(e.chainId??t.chainId??1),r=st(e.token||e.tokenAddress,"token"),o=st(e.owner,"owner"),i=st(e.spender,"spender"),s=ro.encodeFunctionData("allowance",[o,i]),a=await L(n,"eth_call",[{to:r,data:s},e.blockTag||"latest"],t),c=ro.decodeFunctionResult("allowance",a),l=BigInt(c[0]);return{chainId:n,token:r,owner:o,spender:i,allowance:l.toString(),allowanceHex:`0x${l.toString(16)}`,blockTag:e.blockTag||"latest"}}async function io(e={},t={}){let n=Number(e.chainId??t.chainId??1),r=st(e.token||e.tokenAddress,"token"),o=st(e.account||e.owner||e.address,"account"),i=ro.encodeFunctionData("balanceOf",[o]),s=await L(n,"eth_call",[{to:r,data:i},e.blockTag||"latest"],t),a=ro.decodeFunctionResult("balanceOf",s),c=BigInt(a[0]);return{chainId:n,token:r,account:o,balance:c.toString(),balanceHex:`0x${c.toString(16)}`,blockTag:e.blockTag||"latest"}}async function so(e={},t={}){let n=Number(e.chainId??t.chainId??1),r=Fx(e.txHash||e.hash||e.transactionHash),o=await L(n,"eth_getTransactionReceipt",[r],t);if(!o)return{ok:!1,chainId:n,txHash:r,status:"pending",receipt:null,reason:"receipt pending"};let i=Rs(o.status),s=i===1,a=i===1?"success":i===0?"reverted":"unknown",c=s?null:a==="reverted"?"transaction reverted":"unknown receipt status",l=e.expectedTo?st(e.expectedTo,"expectedTo"):null,u=o.to?st(o.to,"receipt.to"):null;return l&&u!==l&&(s=!1,c=`to mismatch: expected ${l}, got ${u||"null"}`),{ok:s,chainId:n,txHash:r,status:a,reason:c,statusCode:i,to:u,from:o.from?st(o.from,"receipt.from"):null,blockNumber:Rs(o.blockNumber),transactionIndex:Rs(o.transactionIndex),logs:Array.isArray(o.logs)?o.logs:[],receipt:o}}async function _u(e={}){let t=e.chainIds||Object.values(Zn).map(r=>r.chainId),n={};return await Promise.all(t.map(async r=>{if(!Os(r)&&!vu[r]&&!Eu(r,e)){n[r]={ok:!1,error:"no rpc configured",chainId:r};return}try{n[r]=await er(r,e)}catch(o){n[r]={ok:!1,chainId:r,error:String(o.message||o)}}})),n}T();var Vx="https://api.dexscreener.com",zx=Object.freeze({1:"ethereum",10:"optimism",56:"bsc",137:"polygon",8453:"base",42161:"arbitrum",43114:"avalanche",999:"hyperevm",4663:"robinhood"}),Te=e=>String(e??"").toLowerCase(),Wx=e=>Array.isArray(e)?e:e==null?[]:[e];function Gx(e,t,n){let r=Te(t),o=Te(n),i=Te(e?.baseToken?.address),s=Te(e?.quoteToken?.address);return i===r&&s===o||i===o&&s===r}function Kx(e){let t=Number(e?.liquidity?.usd);return Number.isFinite(t)&&t>=0?t:null}function ao(e={}){return(e.baseUrl||process.env.DEXSCREENER_API_URL||Vx).replace(/\/$/,"")}async function Pu(e={}){let n=(await y(`${ao(e)}/latest/dex/search?q=USDC`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??12e3}))?.pairs?.length||0;return{ok:n>0,pairSample:n}}async function Rt(e,t={}){if(!e)throw new Error("tokenAddress required");return y(`${ao(t)}/latest/dex/tokens/${e}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3})}async function tr(e,t={}){if(!e)throw new Error("query required");return y(`${ao(t)}/latest/dex/search?q=${encodeURIComponent(e)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3})}async function Nu(e,t,n={}){if(!e||!t)throw new Error("chainId and pairAddress required");return y(`${ao(n)}/latest/dex/pairs/${e}/${t}`,{fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs??12e3})}async function co({chainId:e,tokenA:t,tokenB:n,dexIds:r=[]}={},o={}){if(e==null||!t||!n)throw new Error("chainId, tokenA, and tokenB required");let i=Te(zx[Number(e)]||e),s=new Set(Wx(r).filter(Boolean).map(Te)),a=[...new Set([t,n].map(p=>String(p)).filter(Boolean))],c=await Promise.allSettled(a.map(p=>Rt(p,{...o,baseUrl:o.dexscreenerBaseUrl,timeoutMs:o.dexscreenerTimeoutMs??Math.min(Number(o.timeoutMs??4e3),4e3)}))),l=new Set,u=[];for(let p of c)if(p.status==="fulfilled")for(let m of p.value?.pairs||p.value?.data?.pairs||[]){let f=`${Te(m?.chainId)}:${Te(m?.dexId)}:${Te(m?.pairAddress)}`;l.has(f)||(l.add(f),u.push(m))}return u.filter(p=>Te(p?.chainId)===i).filter(p=>Gx(p,t,n)).filter(p=>!s.size||s.has(Te(p?.dexId))).map(p=>({pairAddress:p.pairAddress??null,dexId:p.dexId??null,chainId:p.chainId??null,liquidityUsd:Kx(p),pairCreatedAt:p.pairCreatedAt??null})).filter(p=>p.liquidityUsd!=null).sort((p,m)=>m.liquidityUsd-p.liquidityUsd)[0]??null}me();W();var ce={1:{name:"ethereum",quoter:"0x61fFE014bA17989E743c5F6cB21bF9697530B21e",router:"0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45",weth:"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",usdc:"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48"},8453:{name:"base",quoter:"0x3d4e44Eb1374240CE5F1B871ab261CD16335B76a",router:"0x2626664c2603336E57B271c5C0b26F421741e481",weth:"0x4200000000000000000000000000000000000006",usdc:"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"},42161:{name:"arbitrum",quoter:"0x61fFE014bA17989E743c5F6cB21bF9697530B21e",router:"0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45",weth:"0x82aF49447D8a07e3bd95BD0d56f35241523fBab1",usdc:"0xaf88d065e77c8cC2239327C5EDb3A432268e5831"},4663:{name:"robinhood",quoter:"0x33e885ed0ec9bf04ecfb19341582aadcb4c8a9e7",router:"0xcaf681a66d020601342297493863e78c959e5cb2",weth:"0x0bd7d308f8e1639fab988df18a8011f41eacad73",usdc:"0x5fc5360D0400a0Fd4f2af552ADD042D716F1d168"},999:{name:"hyperevm",weth:"0x5555555555555555555555555555555555555555",usdc:"0xB8CE59FC3717ada4C02eaDF9682A9e934F625ebb"},10:{name:"optimism",quoter:"0x61fFE014bA17989E743c5F6cB21bF9697530B21e",router:"0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45",weth:"0x4200000000000000000000000000000000000006",usdc:"0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85"},56:{name:"bsc",quoter:"0x78D78E420Da98ad378D7799bE8f4AF69033EB077",router:"0xB971eF87ede563556b2ED4b1C0b0019111Dd85d2",weth:"0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c",usdc:"0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d"},137:{name:"polygon",quoter:"0x61fFE014bA17989E743c5F6cB21bF9697530B21e",router:"0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45",weth:"0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270",usdc:"0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359"},43114:{name:"avalanche",quoter:"0xbe0F5544EC67e9B3b2D979aaA43f18Fd87E6257F",router:"0xbb00FF08d01D300023C629E8fFfFcb65A5a578cE",weth:"0xB31f66AA3C1e785363F0875A1B74E27b85FD66c7",usdc:"0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E"}},sS=[100,500,3e3,1e4],uo=new Bu(["function quoteExactInputSingle((address tokenIn, address tokenOut, uint256 amountIn, uint24 fee, uint160 sqrtPriceLimitX96) params) returns (uint256 amountOut, uint160 sqrtPriceX96After, uint32 initializedTicksCrossed, uint256 gasEstimate)","function quoteExactInput(bytes path, uint256 amountIn) returns (uint256 amountOut, uint160[] sqrtPriceX96AfterList, uint32[] initializedTicksCrossedList, uint256 gasEstimate)"]),Uu=new Bu(["function exactInputSingle((address tokenIn,address tokenOut,uint24 fee,address recipient,uint256 amountIn,uint256 amountOutMinimum,uint160 sqrtPriceLimitX96) params) payable returns (uint256 amountOut)","function multicall(uint256 deadline,bytes[] data) payable returns (bytes[] results)"]),Du="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",Fu="0x0000000000000000000000000000000000000000",Ms=[100,500,2500,1e4],aS={56:{pancakeswap:{name:"pancakeswap",quoter:"0xB048Bbc1Ee6b733FFfCFb9e9CeF7375518e25997",router:"0x13f4EA83D0bd40E75C8222255bc855a974568Dd4",feeTiers:Ms}},8453:{pancakeswap:{name:"pancakeswap",quoter:"0xB048Bbc1Ee6b733FFfCFb9e9CeF7375518e25997",router:"0x13f4EA83D0bd40E75C8222255bc855a974568Dd4",feeTiers:Ms}},42161:{pancakeswap:{name:"pancakeswap",quoter:"0xB048Bbc1Ee6b733FFfCFb9e9CeF7375518e25997",router:"0x13f4EA83D0bd40E75C8222255bc855a974568Dd4",feeTiers:Ms}},999:{hyperswap:{name:"hyperswap",quoter:"0x03A918028f22D9E1473B7959C927AD7425A45C7C",router:"0x4E2960a8cd19B467b82d26D83fAcb0fAE26b094D"}}};function Bs(e,t){let n=Number(e),r=ce[n];if(!r)throw new Error(`uniswap-v3: unsupported chainId ${e} (supported: ${Object.keys(ce).join(", ")})`);let o=aS[n]||{};if(!t){if(!r.quoter||!r.router){let c=Object.keys(o).join(", ")||"none registered";throw new Error(`uniswap-v3: chain ${n} (${r.name}) has no canonical Uniswap v3 deployment -- name a venue explicitly (known: ${c})`)}return{chainId:n,venue:r.name,...r}}let i=String(t).toLowerCase();if(i===r.name&&r.quoter&&r.router)return{chainId:n,venue:r.name,...r};let s=o,a=s[i];if(!a){let c=[...r.quoter&&r.router?[r.name]:[],...Object.keys(s)].join(", ");throw new Error(`uniswap-v3: unknown venue "${t}" on chain ${n} (known: ${c})`)}return{chainId:n,venue:i,...r,quoter:a.quoter,router:a.router,feeTiers:a.feeTiers||null}}function Us(e,t){let n=ce[Number(t)];if(!e||e===Du||e===Fu||/^eth$/i.test(String(e)))return nr(n.weth);let r=String(e);if(/^weth$/i.test(r))return nr(n.weth);if(/^usdc$/i.test(r))return nr(n.usdc);if(!iS(r))throw new Error(`invalid token address: ${e}`);return nr(r)}function cS(e){let t=String(e||"uniswap").toLowerCase();return t==="uniswap"?["uniswap-v3","uniswap"]:t==="pancakeswap"?["pancakeswap-v3","pancakeswap"]:t==="hyperswap"?["hyperswap-v3","hyperswap"]:[t,`${t}-v3`]}function lS(e,t){if(e.length!==t.length+1)throw new Error("path: fees.length must be tokens.length - 1");let n="0x";for(let r=0;r<t.length;r++)n+=e[r].slice(2).toLowerCase(),n+=Number(t[r]).toString(16).padStart(6,"0");return n+=e[e.length-1].slice(2).toLowerCase(),n}async function at(e={},t={}){let{chainId:n,quoter:r,router:o,feeTiers:i}=Bs(e.chainId??8453,e.venue),s=Us(e.tokenIn||"WETH",n),a=Us(e.tokenOut||ce[n].usdc,n),c=BigInt(e.amountIn??0);if(c<=0n)throw new Error("amountIn required (raw base units)");let l=i&&i.length?i:sS,u=e.fee!=null?[Number(e.fee)]:e.tryFees===!1?[l[Math.min(2,l.length-1)]]:[...l],d=[],p=null;for(let h of u){let g=uo.encodeFunctionData("quoteExactInputSingle",[{tokenIn:s,tokenOut:a,amountIn:c,fee:h,sqrtPriceLimitX96:0n}]);try{let b=await L(n,"eth_call",[{to:r,data:g},"latest"],t);if(!b||b==="0x"){d.push({fee:h,ok:!1,error:"empty result"});continue}let k=uo.decodeFunctionResult("quoteExactInputSingle",b),x={fee:h,ok:!0,amountOut:k[0].toString(),sqrtPriceX96After:k[1].toString(),initializedTicksCrossed:Number(k[2]),gasEstimate:k[3].toString()};d.push(x),(!p||BigInt(x.amountOut)>BigInt(p.amountOut))&&(p=x)}catch(b){d.push({fee:h,ok:!1,error:String(b.message||b).slice(0,160)})}}if(!p){let h=d.map(g=>`${g.fee}:${g.error||"fail"}`).join("; ");throw new Error(`uniswap-v3 quote failed chain=${n}: ${h}`)}let m=e.liquidityUsd==null?await co({chainId:n,tokenA:s,tokenB:a,dexIds:cS(e.venue)},t).catch(()=>null):null,f=e.liquidityUsd??m?.liquidityUsd??null;return V({venue:"uniswap-v3",chainId:n,chain:ce[n].name,quoter:r,tokenIn:s,tokenOut:a,amountIn:c.toString(),fee:p.fee,amountOut:p.amountOut,gasEstimate:p.gasEstimate,liquidityUsd:f,liquiditySource:m,sqrtPriceX96After:p.sqrtPriceX96After,initializedTicksCrossed:p.initializedTicksCrossed,triedFees:d,best:!0},{chainId:n,venue:o,amountOut:p.amountOut,liquidityUsd:f,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps})}async function qu(e={},t={}){let{chainId:n,quoter:r,router:o}=Bs(e.chainId??8453),i=(e.tokens||[]).map(p=>Us(p,n)),s=(e.fees||[]).map(Number);if(i.length<2)throw new Error("tokens[] need at least 2 addresses");let a=BigInt(e.amountIn??0);if(a<=0n)throw new Error("amountIn required");let c=lS(i,s),l=uo.encodeFunctionData("quoteExactInput",[c,a]),u=await L(n,"eth_call",[{to:r,data:l},"latest"],t),d=uo.decodeFunctionResult("quoteExactInput",u);return V({venue:"uniswap-v3",chainId:n,chain:ce[n].name,quoter:r,tokens:i,fees:s,path:c,amountIn:a.toString(),amountOut:d[0].toString(),gasEstimate:d[3].toString()},{chainId:n,venue:o,amountOut:d[0].toString(),liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps})}async function Ds(e={},t={}){let n=Number(e.chainId??8453),r=e.amountIn??"1000000000000000",o=await at({chainId:n,tokenIn:ce[n].weth,tokenOut:ce[n].usdc,amountIn:r,fee:e.fee},t),i=Number(o.amountOut)/1e6;return{...o,amountOutUsdc:i,pair:"WETH/USDC"}}async function Hu(e={},t={}){let n=Number(e.chainId??8453),r=Bs(n,e.venue),o=nr(e.recipient),i=String(e.tokenIn||"WETH"),s=!e.tokenIn||i===Du||i===Fu||/^eth$/i.test(i),a=await at(e,t),c=Uu.encodeFunctionData("exactInputSingle",[{tokenIn:a.tokenIn,tokenOut:a.tokenOut,fee:a.fee,recipient:o,amountIn:BigInt(a.amountIn),amountOutMinimum:BigInt(a.amountOutMinimum),sqrtPriceLimitX96:0n}]),l=Math.min(600,Math.max(30,Number(e.deadlineSeconds??300))),d=Number(t.nowSeconds??Math.floor(Date.now()/1e3))+l,p=Uu.encodeFunctionData("multicall",[d,[c]]);return O({provider:"uniswap-v3",calldataReady:!0,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:n,deadline:d,quote:a,autoSlippage:a.autoSlippage,requiresApproval:s?null:{token:a.tokenIn,spender:r.router,amount:a.amountIn},transaction:{chainId:n,from:o,to:r.router,data:p,value:s?a.amountIn:"0",slippageGuard:J(a.autoSlippage,{chainId:n,venue:r.router,data:p})}},{provider:"uniswap-v3",kind:"univ3-swap-tx"})}async function ju(e={}){let t=Number(e.chainId??8453);try{let n=await Ds({chainId:t,amountIn:"1000000000000000"},e);return{ok:!0,chainId:t,fee:n.fee,amountOutUsdc:n.amountOutUsdc,midPxHint:n.amountOutUsdc/.001}}catch(n){return{ok:!1,chainId:t,error:String(n.message||n).slice(0,200)}}}async function Vu(){return Object.entries(ce).map(([e,t])=>({chainId:Number(e),name:t.name,quoter:t.quoter,weth:t.weth,usdc:t.usdc}))}import{AbiCoder as dS,Interface as Gu,getAddress as je,isAddress as po,keccak256 as pS}from"ethers";me();W();var mS=dS.defaultAbiCoder(),nn="0x0000000000000000000000000000000000000000",Ve={1:{name:"ethereum",poolManager:"0x000000000004444c5dc75cB358380D2e3dE08A90",quoter:"0x52f0e24d1c21c8a0cb1e5a5dd6198556bd9e1203",stateView:"0x7ffe42c4a5deea5b0fec41c94c136cf115597227",universalRouter:"0x66a9893cc07d91d95644aedd05d03f95e1dba8af",weth:"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",usdc:"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48"},10:{name:"optimism",poolManager:"0x9a13f98cb987694c9f086b1f5eb990eea8264ec3",quoter:"0x1f3131a13296fb91c90870043742c3cdbff1a8d7",stateView:"0xc18a3169788f4f75a170290584eca6395c75ecdb",universalRouter:"0x851116d9223fabed8e56c0e6b8ad0c31d98b3507",weth:"0x4200000000000000000000000000000000000006",usdc:"0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85"},56:{name:"bsc",poolManager:"0x28e2ea090877bf75740558f6bfb36a5ffee9e9df",quoter:"0x9f75dd27d6664c475b90e105573e550ff69437b0",stateView:"0xd13dd3d6e93f276fafc9db9e6bb47c1180aee0c4",universalRouter:"0x1906c1d672b88cd1b9ac7593301ca990f94eae07",weth:"0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c",usdc:"0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d"},137:{name:"polygon",poolManager:"0x67366782805870060151383f4bbff9dab53e5cd6",quoter:"0xb3d5c3dfc3a7aebff71895a7191796bffc2c81b9",stateView:"0x5ea1bd7974c8a611cbab0bdcafcb1d9cc9b3ba5a",universalRouter:"0x1095692a6237d83c6a72f3f5efedb9a670c49223",weth:"0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270",usdc:"0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359"},8453:{name:"base",poolManager:"0x498581fF718922c3f8e6A244956aF099B2652b2b",quoter:"0x0d5e0f971ed27fbff6c2837bf31316121532048d",stateView:"0xa3c0c9b65bad0b08107aa264b0f3db444b867a71",universalRouter:"0x6ff5693b99212da76ad316178a184ab56d299b43",weth:"0x4200000000000000000000000000000000000006",usdc:"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"},42161:{name:"arbitrum",poolManager:"0x360e68faccca8ca495c1b759fd9eee466db9fb32",quoter:"0x3972c00f7ed4885e145823eb7c655375d275a1c5",stateView:"0x76fd297e2d437cd7f76d50f01afe6160f86e9990",universalRouter:"0xa51afafe0263b40edaef0df8781ea9aa03e381a3",weth:"0x82aF49447D8a07e3bd95BD0d56f35241523fBab1",usdc:"0xaf88d065e77c8cC2239327C5EDb3A432268e5831"},43114:{name:"avalanche",poolManager:"0x06380c0e0912312b5150364b9dc4542ba0dbbc85",quoter:"0xbe40675bb704506a3c2ccfb762dcfd1e979845c2",stateView:"0xc3c9e198c735a4b97e3e683f391ccbdd60b69286",universalRouter:"0x94b75331ae8d42c1b61065089b7d48fe14aa73b7",weth:"0xB31f66AA3C1e785363F0875A1B74E27b85FD66c7",usdc:"0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E"},4663:{name:"robinhood",poolManager:"0x8366a39cc670b4001a1121b8f6a443a643e40951",quoter:"0x8dc178efb8111bb0973dd9d722ebeff267c98f94",stateView:"0xf3334192d15450cdd385c8b70e03f9a6bd9e673b",universalRouter:"0x8876789976dEcBfCbBbe364623C63652db8C0904",weth:"0x0bd7d308f8e1639fab988df18a8011f41eacad73",usdc:"0x5fc5360D0400a0Fd4f2af552ADD042D716F1d168"}},fS=[{fee:100,tickSpacing:1},{fee:500,tickSpacing:10},{fee:3e3,tickSpacing:60},{fee:1e4,tickSpacing:200},{fee:25e3,tickSpacing:8}],zu=new Gu(["function quoteExactInputSingle(((address currency0,address currency1,uint24 fee,int24 tickSpacing,address hooks) poolKey,bool zeroForOne,uint128 exactAmount,bytes hookData) params) returns (uint256 amountOut, uint256 gasEstimate)"]),t$=new Gu(["function execute(bytes commands,bytes[] inputs,uint256 deadline) payable"]);var hS="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE";function Ku(e){let t=Number(e),n=Ve[t];if(!n)throw new Error(`uniswap-v4: unsupported chainId ${e} (supported: ${Object.keys(Ve).join(", ")})`);return{chainId:t,...n}}function Wu(e,t){let n=Ve[Number(t)];if(!e||e===hS||e===nn||/^eth$/i.test(String(e)))return je(n.weth);let r=String(e);if(/^weth$/i.test(r))return je(n.weth);if(/^usdc$/i.test(r)||/^usdg$/i.test(r))return je(n.usdc);if(!po(r))throw new Error(`invalid token address: ${e}`);return je(r)}function gS({currency0:e,currency1:t,fee:n,tickSpacing:r,hooks:o=nn}){let i=je(e),s=je(t);if(i.toLowerCase()===s.toLowerCase())throw new Error("poolKey currencies must differ");let[a,c]=i.toLowerCase()<s.toLowerCase()?[i,s]:[s,i],l=o&&po(o)?je(o):nn;return pS(mS.encode(["address","address","uint24","int24","address"],[a,c,Number(n),Number(r),l]))}function yS({tokenIn:e,tokenOut:t,fee:n,tickSpacing:r,hooks:o=nn}){let i=je(e),s=je(t),[a,c]=i.toLowerCase()<s.toLowerCase()?[i,s]:[s,i],l=i.toLowerCase()===a.toLowerCase();return{poolKey:{currency0:a,currency1:c,fee:Number(n),tickSpacing:Number(r),hooks:o&&po(o)?je(o):nn},zeroForOne:l}}var bS=["uniswap-v4","uniswapv4"];async function mo(e={},t={}){let{chainId:n,quoter:r,poolManager:o,universalRouter:i}=Ku(e.chainId??8453),s=Wu(e.tokenIn||"WETH",n),a=Wu(e.tokenOut||Ve[n].usdc,n),c=BigInt(e.amountIn??0);if(c<=0n)throw new Error("amountIn required (raw base units)");if(c>0xffffffffffffffffffffffffffffffffn)throw new Error("amountIn exceeds uint128");let l=e.fee!=null&&e.tickSpacing!=null?[{fee:Number(e.fee),tickSpacing:Number(e.tickSpacing)}]:e.tryTiers===!1?[{fee:500,tickSpacing:10}]:[...fS],u=e.hooks||nn,d=[],p=null;for(let h of l){let{poolKey:g,zeroForOne:b}=yS({tokenIn:s,tokenOut:a,fee:h.fee,tickSpacing:h.tickSpacing,hooks:u}),k=zu.encodeFunctionData("quoteExactInputSingle",[{poolKey:g,zeroForOne:b,exactAmount:c,hookData:"0x"}]);try{let x=await L(n,"eth_call",[{to:r,data:k},"latest"],t);if(!x||x==="0x"){d.push({...h,ok:!1,error:"empty result"});continue}let w=zu.decodeFunctionResult("quoteExactInputSingle",x),E={fee:h.fee,tickSpacing:h.tickSpacing,ok:!0,amountOut:w[0].toString(),gasEstimate:w[1].toString(),poolKey:g,zeroForOne:b,poolId:gS({...g})};d.push(E),(!p||BigInt(E.amountOut)>BigInt(p.amountOut))&&(p=E)}catch(x){d.push({...h,ok:!1,error:String(x.message||x).slice(0,160)})}}if(!p){let h=d.map(g=>`${g.fee}/${g.tickSpacing}:${g.error||"fail"}`).join("; ");throw new Error(`uniswap-v4 quote failed chain=${n}: ${h}`)}let m=e.liquidityUsd==null?await co({chainId:n,tokenA:s,tokenB:a,dexIds:bS},t).catch(()=>null):null,f=e.liquidityUsd??m?.liquidityUsd??null;return V({venue:"uniswap-v4",chainId:n,chain:Ve[n].name,poolManager:o,quoter:r,universalRouter:i||null,tokenIn:s,tokenOut:a,amountIn:c.toString(),fee:p.fee,tickSpacing:p.tickSpacing,hooks:p.poolKey.hooks,poolId:p.poolId,zeroForOne:p.zeroForOne,amountOut:p.amountOut,gasEstimate:p.gasEstimate,liquidityUsd:f,liquiditySource:m,triedTiers:d,best:!0,executionReady:!1,prepareReady:typeof e.recipient=="string"&&po(e.recipient)&&e.slippageBps!=null},{chainId:n,venue:i||r,amountOut:p.amountOut,liquidityUsd:f,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps})}async function Yu(){return Object.entries(Ve).map(([e,t])=>({chainId:Number(e),name:t.name,poolManager:t.poolManager,quoter:t.quoter,stateView:t.stateView||null,universalRouter:t.universalRouter||null,weth:t.weth,usdc:t.usdc}))}async function Xu(e={}){let t=Ku(e.chainId??8453),n=await L(t.chainId,"eth_getCode",[t.quoter,"latest"],e),r=typeof n=="string"&&n!=="0x"&&n.length>4;return{ok:r,chainId:t.chainId,quoter:t.quoter,poolManager:t.poolManager,codeBytes:r?(n.length-2)/2:0}}var rn=Object.freeze(["blockNumber","nativeBalance","tokenBalance","resolveToken","resolvePools","scanBlocks","scoreRisk","quote","sellSimulation","prepareUnsignedTx"]),B=Object.freeze({LIVE:"LIVE",CACHED:"CACHED",STALE:"STALE",UNKNOWN:"UNKNOWN",UNAVAILABLE:"UNAVAILABLE"}),M=Object.freeze({PASS:"PASS",CAUTION:"CAUTION",FAIL:"FAIL",UNKNOWN:"UNKNOWN"}),xS=/^0x[0-9a-fA-F]{40}$/;function Qu(e={}){let t=[],n=[];if(!e||typeof e!="object")return{ok:!1,errors:["definition must be an object"],warnings:n};if((!Number.isInteger(e.chainId)||e.chainId<=0)&&t.push("chainId must be a positive integer"),(typeof e.key!="string"||!/^[a-z][a-z0-9-]*$/.test(e.key||""))&&t.push('key must be a lowercase slug (e.g. "base")'),(typeof e.name!="string"||!e.name.trim())&&t.push("name is required"),!Array.isArray(e.rpcEnv)||e.rpcEnv.length===0)t.push("rpcEnv must list at least one environment variable name");else for(let o of e.rpcEnv)(typeof o!="string"||!/^[A-Z][A-Z0-9_]*$/.test(o))&&t.push(`rpcEnv entry "${o}" should be an UPPER_SNAKE env var name`);if(e.nativeCurrency){let o=e.nativeCurrency;(typeof o.symbol!="string"||!o.symbol)&&t.push("nativeCurrency.symbol is required when nativeCurrency is set"),Number.isInteger(o.decimals)||t.push("nativeCurrency.decimals must be an integer")}for(let[o,i]of(e.venues||[]).entries()){let s=`venues[${o}]`;if(!i||typeof i!="object"){t.push(`${s} must be an object`);continue}xS.test(i.address||"")||t.push(`${s}.address is not a valid 20-byte address`),/^0x0{40}$/.test(i.address||"")&&t.push(`${s}.address is the zero address -- placeholder left in place?`),i.kind||t.push(`${s}.kind is required (router|quoter|factory|...)`),i.verified?(i.verified.method||t.push(`${s}.verified.method is required`),i.verified.source||t.push(`${s}.verified.source is required`),i.verified.date||n.push(`${s}.verified.date missing -- add one so staleness is visible`)):t.push(`${s} must record verification: { verified: { method, source, date } }. An unverified venue stays blocked.`)}let r=e.capabilities||{};for(let o of Object.keys(r))rn.includes(o)?typeof r[o]!="function"&&t.push(`capability "${o}" must be a function`):t.push(`unknown capability "${o}"`);return Object.keys(r).length===0&&n.push("scanner implements no capabilities -- it can only be registered, not used"),r.prepareUnsignedTx&&!r.quote&&n.push("prepareUnsignedTx without quote: no priced expectation to validate the built tx against"),r.prepareUnsignedTx&&!r.sellSimulation&&n.push("prepareUnsignedTx without sellSimulation: cannot prove an asset is exitable before buying"),{ok:t.length===0,errors:t,warnings:n}}function Ju(e){let{ok:t,errors:n,warnings:r}=Qu(e);if(!t)throw new Error(`invalid scanner for ${e?.key??"<unknown>"}:
|
|
3
3
|
- ${n.join(`
|
|
4
|
-
- `)}`);let o=e.capabilities||{},i=tn.filter(a=>typeof o[a]=="function"),s={key:e.key,chainId:e.chainId,name:e.name,rpcEnv:[...e.rpcEnv],nativeCurrency:e.nativeCurrency?{...e.nativeCurrency}:null,explorer:e.explorer||null,venues:(e.venues||[]).map(a=>({...a})),warnings:r,capabilities(){return{chainId:e.chainId,key:e.key,supported:[...i],unsupported:tn.filter(a=>!i.includes(a))}},supports(a){return i.includes(a)}};for(let a of tn)i.includes(a)?s[a]=async(...c)=>o[a](...c,{scanner:s}):s[a]=async()=>{throw new Error(`${e.key} (chain ${e.chainId}) does not implement "${a}". Supported: ${i.join(", ")||"none"}. An unimplemented capability is absent, not assumed -- implement it or treat this chain as fail-closed for that operation.`)};return Object.freeze(s)}var er=new Map;function lo(e){let t=Fu(e);return er.set(t.chainId,t),t}function $s(e){return er.get(Number(e))||null}function Ls(){return[...er.values()]}function Qx(){let e={};for(let t of er.values())e[t.chainId]={key:t.key,name:t.name,...t.capabilities(),venueCount:t.venues.length,failClosed:t.venues.length===0};return{generatedAt:new Date().toISOString(),chainCount:er.size,capabilities:[...tn],chains:e}}var Us={getAmountsOut:"d06ca61f",swapExactTokensForTokens:"38ed1739",swapExactETHForTokens:"7ff36ab5"},ke=e=>BigInt(e).toString(16).padStart(64,"0"),tr=e=>e.slice(2).toLowerCase().padStart(64,"0");function Jx(e,t){return`0x${Us.getAmountsOut}`+ke(e)+ke(64)+ke(t.length)+t.map(tr).join("")}function Zx(e){if(!e||e==="0x")return null;let t=e.slice(2);if(t.length<128)return null;let n=Number(BigInt(`0x${t.slice(64,128)}`));if(!Number.isFinite(n)||n<1||n>16)return null;let r=[];for(let o=0;o<n;o++){let i=128+o*64;if(t.length<i+64)return null;r.push(BigInt(`0x${t.slice(i,i+64)}`))}return r}function Ms(e,t="router"){return(e?.venues||[]).find(r=>r.kind===t)?.address??null}var Bs=100;function eS(e,t){let n=Number(t);if(!Number.isFinite(n)||n<0)throw new Error("slippageBps must be a non-negative number");if(n>Bs)throw new Error(`slippageBps ${n} exceeds the ${Bs} bps ceiling. Block and requote or split the order -- do not widen the guard to force a fill.`);return BigInt(e)*BigInt(1e4-Math.floor(n))/10000n}function qu(e){let{chainId:t,wrappedNative:n}=e;async function r(o,i,s,a){let c=await L(t,"eth_call",[{to:o,data:Jx(i,s)},"latest"],a);return Zx(c?.result??c)}return{async quote({tokenIn:o,tokenOut:i,amountIn:s,path:a},c={}){let l=Ms(c.scanner);if(!l)return{chainId:t,evidence:B.UNAVAILABLE,reason:"no verified router configured for this chain; quoting stays fail-closed rather than guessing a venue address"};let u=a||[o,i];if(u.some(p=>!/^0x[0-9a-fA-F]{40}$/.test(p||"")))throw new Error("quote requires valid 20-byte addresses");let d=await r(l,s,u,c);return d?{chainId:t,router:l,path:u,amountIn:String(s),amountOut:d[d.length-1].toString(),hops:u.length-1,evidence:B.LIVE,note:"exact-input quote at current reserves; not a guaranteed fill"}:{chainId:t,router:l,path:u,evidence:B.UNKNOWN,reason:"router returned no amounts -- no pool for this path, or the call reverted"}},async sellSimulation({token:o,amountIn:i,base:s},a={}){let c=Ms(a.scanner),l=s||n;if(l&&String(o).toLowerCase()===String(l).toLowerCase())return{chainId:t,token:o,verdict:M.UNKNOWN,evidence:B.UNAVAILABLE,reason:"token is the base asset for this chain, so there is nothing to round-trip against. Sellability must be judged against a different quote asset."};if(!c||!l)return{chainId:t,token:o,verdict:M.UNKNOWN,evidence:B.UNAVAILABLE,reason:c?"no wrappedNative configured for this chain, so no base asset to round-trip against":"no verified router configured for this chain"};let u=await r(c,i,[l,o],a);if(!u)return{chainId:t,token:o,verdict:M.FAIL,evidence:B.LIVE,leg:"buy",reason:"buy leg returned no amounts -- no route in"};let d=u[u.length-1];if(d===0n)return{chainId:t,token:o,verdict:M.FAIL,evidence:B.LIVE,leg:"buy",reason:"buy leg quotes zero output"};let p=await r(c,d,[o,l],a);if(!p)return{chainId:t,token:o,verdict:M.FAIL,evidence:B.LIVE,leg:"sell",bought:d.toString(),reason:"SELL LEG FAILED while the buy leg quoted fine. This is the honeypot signature: do not trade."};let m=p[p.length-1],f=Number(m*10000n/BigInt(i)),h=M.PASS,g="round trip completes with expected fee/impact loss";return f<5e3?(h=M.FAIL,g=`round trip returns only ${(f/100).toFixed(2)}% -- punitive tax or no real liquidity`):f<9e3&&(h=M.CAUTION,g=`round trip returns ${(f/100).toFixed(2)}% -- transfer tax or thin liquidity at this size`),{chainId:t,token:o,base:l,router:c,verdict:h,reason:g,amountIn:String(i),bought:d.toString(),returned:m.toString(),retentionBps:f,evidence:B.LIVE,note:"Quote-level round trip. It does not prove transfer hooks absent at execution time."}},async prepareUnsignedTx({tokenIn:o,tokenOut:i,amountIn:s,recipient:a,slippageBps:c=50,deadlineSeconds:l=900,path:u},d={}){let p=d.scanner,m=Ms(p);if(!m)throw new Error(`chain ${t} has no verified router; preparing a swap stays fail-closed. Add a venue with recorded provenance first (see docs/adding-a-chain.md).`);if(!/^0x[0-9a-fA-F]{40}$/.test(a||""))throw new Error("prepareUnsignedTx requires a valid recipient address");let f=u||[o,i],h=await this.quote({tokenIn:o,tokenOut:i,amountIn:s,path:f},d);if(h.evidence!==B.LIVE)throw new Error(`cannot prepare without a live quote (${h.evidence}: ${h.reason??"no reason given"})`);let g=eS(h.amountOut,c);if(g<=0n)throw new Error("computed minOut is zero -- refusing to prepare");let b=BigInt(Math.floor(Date.now()/1e3)+Number(l)),k=n&&f[0].toLowerCase()===n.toLowerCase()&&d.useNative,x=k?`0x${Us.swapExactETHForTokens}`+ke(g)+ke(128)+tr(a)+ke(b)+ke(f.length)+f.map(tr).join(""):`0x${Us.swapExactTokensForTokens}`+ke(s)+ke(g)+ke(160)+tr(a)+ke(b)+ke(f.length)+f.map(tr).join("");return{unsigned:!0,signedBy:"user-wallet",chainId:t,tx:{to:m,data:x,value:k?`0x${BigInt(s).toString(16)}`:"0x0"},guard:{quotedOut:h.amountOut,minOut:g.toString(),slippageBps:c,maxSlippageBps:Bs,deadline:b.toString()},requires:k?[]:[{step:"approve",token:f[0],spender:m,amount:String(s)}],note:"UNSIGNED. Re-verify the guard against a fresh quote immediately before signing -- a quote-time minimum is not a minimum at broadcast time."}}}}var tS=[100,500,3e3,1e4],Hu={quoteExactInputSingle:"c6a5026a",exactInputSingle:"04e45aaf"},Ot=e=>BigInt(e).toString(16).padStart(64,"0"),nr=e=>e.slice(2).toLowerCase().padStart(64,"0"),ju=/^0x[0-9a-fA-F]{40}$/,Fs=100;function nS(e,t){let n=Number(t);if(!Number.isFinite(n)||n<0)throw new Error("slippageBps must be a non-negative number");if(n>Fs)throw new Error(`slippageBps ${n} exceeds the ${Fs} bps ceiling. Block and requote or split the order -- do not widen the guard to force a fill.`);return BigInt(e)*BigInt(1e4-Math.floor(n))/10000n}function Ds(e,t){return(e?.venues||[]).find(n=>n.kind===t)?.address??null}function Vu(e){let{chainId:t,wrappedNative:n}=e;async function r({quoter:i,tokenIn:s,tokenOut:a,amountIn:c,fee:l},u){let d=`0x${Hu.quoteExactInputSingle}`+nr(s)+nr(a)+Ot(c)+Ot(l)+Ot(0),p=await L(t,"eth_call",[{to:i,data:d},"latest"],u).catch(()=>null),m=p?.result??p;if(!m||m==="0x"||m.length<66)return null;let f=BigInt(`0x${m.slice(2,66)}`);return f>0n?f:null}async function o({quoter:i,tokenIn:s,tokenOut:a,amountIn:c},l){let u=[],d=null;for(let p of tS){let m=await r({quoter:i,tokenIn:s,tokenOut:a,amountIn:c,fee:p},l);u.push({fee:p,amountOut:m?m.toString():null}),m&&(!d||m>d.amountOut)&&(d={fee:p,amountOut:m})}return{best:d,tried:u}}return{async quote({tokenIn:i,tokenOut:s,amountIn:a},c={}){let l=Ds(c.scanner,"quoter");if(!l)return{chainId:t,evidence:B.UNAVAILABLE,reason:"no verified quoter configured for this chain; quoting stays fail-closed rather than guessing a venue address"};for(let p of[i,s])if(!ju.test(p||""))throw new Error("quote requires valid 20-byte addresses");let{best:u,tried:d}=await o({quoter:l,tokenIn:i,tokenOut:s,amountIn:a},c);return u?{chainId:t,venue:"uniswap-v3",quoter:l,tokenIn:i,tokenOut:s,amountIn:String(a),amountOut:u.amountOut.toString(),fee:u.fee,triedFeeTiers:d,evidence:B.LIVE,note:"exact-input single-hop quote at current tick; not a guaranteed fill"}:{chainId:t,quoter:l,tokenIn:i,tokenOut:s,triedFeeTiers:d,evidence:B.UNKNOWN,reason:"no fee tier returned a quote -- no V3 pool for this pair, or no liquidity"}},async sellSimulation({token:i,amountIn:s,base:a},c={}){let l=Ds(c.scanner,"quoter"),u=a||n;if(u&&String(i).toLowerCase()===String(u).toLowerCase())return{chainId:t,token:i,verdict:M.UNKNOWN,evidence:B.UNAVAILABLE,reason:"token is the base asset for this chain, so there is nothing to round-trip against. Sellability must be judged against a different quote asset."};if(!l||!u)return{chainId:t,token:i,verdict:M.UNKNOWN,evidence:B.UNAVAILABLE,reason:l?"no wrappedNative configured, so there is no base asset to round-trip against":"no verified quoter configured for this chain"};let d=await o({quoter:l,tokenIn:u,tokenOut:i,amountIn:s},c);if(!d.best)return{chainId:t,token:i,verdict:M.FAIL,evidence:B.LIVE,leg:"buy",reason:"no V3 pool priced the buy leg on any fee tier"};let p=await o({quoter:l,tokenIn:i,tokenOut:u,amountIn:d.best.amountOut},c);if(!p.best)return{chainId:t,token:i,verdict:M.FAIL,evidence:B.LIVE,leg:"sell",bought:d.best.amountOut.toString(),reason:"SELL LEG FAILED while the buy leg quoted fine. This is the honeypot signature: do not trade."};let m=p.best.amountOut,f=Number(m*10000n/BigInt(s)),h=M.PASS,g="round trip completes with expected fee/impact loss";return f<5e3?(h=M.FAIL,g=`round trip returns only ${(f/100).toFixed(2)}% -- punitive tax or no real liquidity`):f<9e3&&(h=M.CAUTION,g=`round trip returns ${(f/100).toFixed(2)}% -- transfer tax or thin liquidity at this size`),{chainId:t,venue:"uniswap-v3",token:i,base:u,verdict:h,reason:g,amountIn:String(s),bought:d.best.amountOut.toString(),returned:m.toString(),retentionBps:f,buyFee:d.best.fee,sellFee:p.best.fee,evidence:B.LIVE,note:"Quote-level round trip. It does not prove transfer hooks absent at execution time."}},async prepareUnsignedTx({tokenIn:i,tokenOut:s,amountIn:a,recipient:c,slippageBps:l=50,fee:u},d={}){let p=Ds(d.scanner,"router");if(!p)throw new Error(`chain ${t} has no verified V3 router; preparing a swap stays fail-closed. Add a venue with recorded provenance first (see docs/adding-a-chain.md).`);if(!ju.test(c||""))throw new Error("prepareUnsignedTx requires a valid recipient address");let m=await this.quote({tokenIn:i,tokenOut:s,amountIn:a},d);if(m.evidence!==B.LIVE)throw new Error(`cannot prepare without a live quote (${m.evidence}: ${m.reason??"no reason given"})`);let f=u??m.fee,h=nS(m.amountOut,l);if(h<=0n)throw new Error("computed minOut is zero -- refusing to prepare");let g=`0x${Hu.exactInputSingle}`+nr(i)+nr(s)+Ot(f)+nr(c)+Ot(a)+Ot(h)+Ot(0);return{unsigned:!0,signedBy:"user-wallet",chainId:t,venue:"uniswap-v3",tx:{to:p,data:g,value:"0x0"},guard:{quotedOut:m.amountOut,minOut:h.toString(),slippageBps:l,maxSlippageBps:Fs,fee:f},requires:[{step:"approve",token:i,spender:p,amount:String(a)}],note:"UNSIGNED. Re-verify the guard against a fresh quote immediately before signing -- a quote-time minimum is not a minimum at broadcast time."}}}}var uo={decimals:"0x313ce567",symbol:"0x95d89b41",name:"0x06fdde03",totalSupply:"0x18160ddd",owner:"0x8da5cb5b"};function zu(e){if(!e||e==="0x")return null;try{return BigInt(e)}catch{return null}}function Wu(e){if(!e||e==="0x")return null;let t=e.slice(2);if(t.length>=128){let r=Number(BigInt(`0x${t.slice(64,128)}`));if(r>0&&r<=256&&t.length>=128+r*2){let o=t.slice(128,128+r*2),i=Buffer.from(o,"hex").toString("utf8").replace(/\0+$/,"");if(i)return i}}return Buffer.from(t.slice(0,64),"hex").toString("utf8").replace(/\0+$/,"")||null}function rS(e){let{chainId:t}=e;async function n(r,o,i){return L(t,"eth_call",[{to:r,data:o},"latest"],i)}return{async blockNumber(r={}){let o=await eo(t,r);return{chainId:t,blockNumber:o?.blockNumber??o,evidence:B.LIVE}},async nativeBalance(r,o={}){let i=await Zt(t,r,o);return{chainId:t,address:r,wei:i?.wei??i?.balance??null,symbol:e.nativeCurrency?.symbol??null,decimals:e.nativeCurrency?.decimals??18,evidence:B.LIVE}},async tokenBalance({token:r,owner:o},i={}){let s=await to({chainId:t,token:r,owner:o},i);return{chainId:t,token:r,owner:o,raw:s?.balance??s,evidence:B.LIVE}},async resolveToken(r,o={}){if(!/^0x[0-9a-fA-F]{40}$/.test(r||""))return{chainId:t,token:r,evidence:B.UNKNOWN,error:"resolveToken needs a 20-byte address; symbol lookup is a market-data concern"};let[i,s,a,c]=await Promise.all([n(r,uo.decimals,o).catch(()=>null),n(r,uo.symbol,o).catch(()=>null),n(r,uo.name,o).catch(()=>null),n(r,uo.totalSupply,o).catch(()=>null)]),l=zu(i?.result??i),u=l!==null||s?.result||a?.result;return{chainId:t,address:r,decimals:l===null?null:Number(l),symbol:Wu(s?.result??s),name:Wu(a?.result??a),totalSupply:(zu(c?.result??c)??null)?.toString()??null,evidence:u?B.LIVE:B.UNKNOWN,warning:u?void 0:"no ERC-20 metadata returned -- may not be a token contract"}},async resolvePools(r,o={}){let i=e.dexscreenerSlug;if(!i)return{chainId:t,token:r,pools:[],evidence:B.UNAVAILABLE,reason:"no dexscreenerSlug configured for this chain; pool discovery is unavailable rather than guessed"};let s=await Nt(r,o).catch(()=>null),c=(s?.pairs||s?.data?.pairs||[]).filter(l=>String(l.chainId).toLowerCase()===String(i).toLowerCase()).map(l=>({pair:l.pairAddress,dex:l.dexId,base:l.baseToken?.address,quote:l.quoteToken?.address,liquidityUsd:l.liquidity?.usd??null,priceUsd:l.priceUsd??null,volume24hUsd:l.volume?.h24??null,createdAt:l.pairCreatedAt??null})).sort((l,u)=>(u.liquidityUsd??0)-(l.liquidityUsd??0));return{chainId:t,token:r,pools:c,evidence:c.length?B.LIVE:B.UNKNOWN}},async scanBlocks({fromBlock:r,toBlock:o,address:i,topics:s,chunkSize:a=2e3}={},c={}){if(!Number.isInteger(r)||!Number.isInteger(o))throw new Error("scanBlocks requires integer fromBlock and toBlock");if(o<r)throw new Error("toBlock must be >= fromBlock");let l=[],u=[];for(let d=r;d<=o;d+=a){let p=Math.min(d+a-1,o);u.push([d,p])}for(let[d,p]of u){let m={fromBlock:`0x${d.toString(16)}`,toBlock:`0x${p.toString(16)}`};i&&(m.address=i),s&&(m.topics=s);let f=await L(t,"eth_getLogs",[m],c).catch(h=>({error:String(h?.message||h)}));if(f?.error)return{chainId:t,fromBlock:r,toBlock:o,logs:l,complete:!1,failedAt:[d,p],error:f.error,evidence:B.UNKNOWN};for(let h of f?.result??f??[])l.push(h)}return{chainId:t,fromBlock:r,toBlock:o,logs:l,complete:!0,chunks:u.length,evidence:B.LIVE}},async scoreRisk(r,o={}){let i=[],s=M.PASS,a=u=>{let d={[M.PASS]:0,[M.CAUTION]:1,[M.UNKNOWN]:2,[M.FAIL]:3};d[u]>d[s]&&(s=u)},c=await this.resolveToken(r,o);c.evidence!==B.LIVE?(i.push({check:"erc20-metadata",result:M.UNKNOWN,detail:c.warning}),a(M.UNKNOWN)):i.push({check:"erc20-metadata",result:M.PASS,detail:`${c.symbol} / ${c.decimals}d`});let l=await this.resolvePools(r,o);if(l.evidence===B.UNAVAILABLE)i.push({check:"liquidity",result:M.UNKNOWN,detail:l.reason}),a(M.UNKNOWN);else if(!l.pools.length)i.push({check:"liquidity",result:M.FAIL,detail:"no pool with liquidity found"}),a(M.FAIL);else{let u=l.pools[0],d=u.liquidityUsd??0;d<5e3?(i.push({check:"liquidity",result:M.CAUTION,detail:`top pool only $${d}`}),a(M.CAUTION)):i.push({check:"liquidity",result:M.PASS,detail:`$${d} on ${u.dex}`}),u.createdAt&&Date.now()-u.createdAt<24*3600*1e3&&(i.push({check:"age",result:M.CAUTION,detail:"pool under 24h old"}),a(M.CAUTION))}if(typeof this.sellSimulation=="function"){let u=await this.sellSimulation({token:r,amountIn:(10n**16n).toString()},o).catch(d=>({verdict:M.UNKNOWN,reason:String(d?.message||d)}));i.push({check:"sellability",result:u.verdict,detail:u.retentionBps!=null?`round trip returns ${(u.retentionBps/100).toFixed(2)}% -- ${u.reason}`:u.reason}),a(u.verdict)}else i.push({check:"sellability",result:M.UNKNOWN,detail:"no verified router on this chain, so a round-trip sell simulation cannot run. Treat as unproven -- a buy path is not an exit path."}),a(M.UNKNOWN);return{chainId:t,token:r,verdict:s,checks:i,note:"Structural checks only. UNKNOWN is not PASS. A token is not tradeable until a sell simulation succeeds."}}}}function qs(e){let n={...rS(e)},r=new Set((e.venues||[]).map(i=>i.kind));e.venueKind==="uniswap-v3"&&r.has("quoter")&&r.has("router")?Object.assign(n,Vu({chainId:e.chainId,wrappedNative:e.wrappedNative})):e.venueKind==="uniswap-v2"&&r.has("router")&&Object.assign(n,qu({chainId:e.chainId,wrappedNative:e.wrappedNative}));let o={};for(let[i,s]of Object.entries(n))o[i]=s.bind(n);return{key:e.key,chainId:e.chainId,name:e.name,rpcEnv:e.rpcEnv,nativeCurrency:e.nativeCurrency,explorer:e.explorer,venues:e.venues||[],capabilities:o}}var st=Object.freeze([{key:"ethereum",chainId:1,name:"Ethereum",rpcEnv:["ETH_RPC_URL","ETHEREUM_RPC_URL","MAINNET_RPC_URL"],nativeCurrency:{symbol:"ETH",decimals:18},explorer:"https://etherscan.io",dexscreenerSlug:"ethereum",venueKind:"uniswap-v3",wrappedNative:"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",venues:[{kind:"quoter",address:"0x61fFE014bA17989E743c5F6cB21bF9697530B21e",label:"Uniswap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle returned a live sane price (WETH->USDC fee 500 quoted 1908.71 USDC). A contract that correctly prices a known pair IS a working V3 quoter",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:1}},{kind:"router",address:"0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45",label:"Uniswap V3 SwapRouter02",verified:{method:"eth_getCode returned real bytecode on this chain and the paired quoter at the same deployment passed a live functional quote",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:1}}]},{key:"optimism",chainId:10,name:"OP Mainnet",rpcEnv:["OPTIMISM_RPC_URL","OP_RPC_URL"],nativeCurrency:{symbol:"ETH",decimals:18},explorer:"https://optimistic.etherscan.io",dexscreenerSlug:"optimism",venueKind:"uniswap-v3",wrappedNative:"0x4200000000000000000000000000000000000006",venues:[{kind:"quoter",address:"0x61fFE014bA17989E743c5F6cB21bF9697530B21e",label:"Uniswap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle returned a live sane price (WETH->USDC fee 500 quoted 1905.23 USDC). A contract that correctly prices a known pair IS a working V3 quoter",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:10}},{kind:"router",address:"0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45",label:"Uniswap V3 SwapRouter02",verified:{method:"eth_getCode returned real bytecode on this chain and the paired quoter at the same deployment passed a live functional quote",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:10}}]},{key:"bsc",chainId:56,name:"BNB Smart Chain",rpcEnv:["BSC_RPC_URL","BNB_RPC_URL"],nativeCurrency:{symbol:"BNB",decimals:18},explorer:"https://bscscan.com",dexscreenerSlug:"bsc",venueKind:"uniswap-v3",wrappedNative:"0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c",venues:[{kind:"quoter",address:"0x78D78E420Da98ad378D7799bE8f4AF69033EB077",label:"Uniswap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle returned a live sane price (WBNB->USDC fee 500 quoted 413.86 USDC). A contract that correctly prices a known pair IS a working V3 quoter",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:56}},{kind:"router",address:"0xB971eF87ede563556b2ED4b1C0b0019111Dd85d2",label:"Uniswap V3 SwapRouter02",verified:{method:"eth_getCode returned real bytecode on this chain and the paired quoter at the same deployment passed a live functional quote",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:56}}]},{key:"polygon",chainId:137,name:"Polygon",rpcEnv:["POLYGON_RPC_URL","POLYGON_RPC"],nativeCurrency:{symbol:"POL",decimals:18},explorer:"https://polygonscan.com",dexscreenerSlug:"polygon",venueKind:"uniswap-v3",wrappedNative:"0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270",venues:[{kind:"quoter",address:"0x61fFE014bA17989E743c5F6cB21bF9697530B21e",label:"Uniswap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle returned a live sane price (WMATIC->USDC fee 500 quoted 0.0720 USDC). A contract that correctly prices a known pair IS a working V3 quoter",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:137}},{kind:"router",address:"0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45",label:"Uniswap V3 SwapRouter02",verified:{method:"eth_getCode returned real bytecode on this chain and the paired quoter at the same deployment passed a live functional quote",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:137}}]},{key:"stable",chainId:988,name:"Stable Mainnet",rpcEnv:["STABLE_RPC_URL","STABLE_RPC"],nativeCurrency:{symbol:"USDT0",decimals:18},venueKind:"uniswap-v3",wrappedNative:"0x5d442b349590a6048Eb2dC0eC346cAA5F47A9ab5",venues:[{kind:"quoter",address:"0xb070179E7032CdA868b53e6C1742F80c9e940d1A",label:"Uniswap V3 QuoterV2 (canonical)",verified:{method:"Stable is on the OFFICIAL Uniswap v3 Deployments List (governance-recognised 2026-05-12, UAC process completed 2026-04, deployed by Protofire), so this is a canonical deployment rather than a fork. eth_getCode returned 8273 bytes, the same size as the canonical quoter on the seven already-verified chains. Functional probe on a live pool (TOAST -> USDT0, fee 10000): 100 in -> 0.000003, 1000 -> 0.000031, 10000 -> 0.000319 USDT0. Output scales monotonically with input, which is a working quoter answering, not a revert. Two of three sampled pools carry non-zero liquidity. NOTE: the pools discovered so far are thin, so real routing size is limited -- the venue is proved, deep liquidity is not.",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-08-05",chainId:988}},{kind:"router",address:"0x32eaf9B5d5F2CD7361c5012890C943D7de84C22a",label:"Uniswap SwapRouter02 (canonical)",verified:{method:"eth_getCode returned 24497 bytes. Cross-checked on-chain rather than trusted from docs: router.factory() returns 0x88f0a512ef09175d456bc9547f914f48c013e4aa, the same v3 core factory that created the pools quoted above, and router.WETH9() returns the wrappedNative recorded on this chain entry. Address published in the Stable docs DEX reference and the Uniswap deployments list.",source:"docs.stable.xyz/en/reference/dexes + on-chain factory()/WETH9() round-trip",date:"2026-08-05",chainId:988}}]},{key:"hyperevm",chainId:999,name:"HyperEVM",rpcEnv:["HYPEREVM_RPC_URL","HYPER_EVM_RPC"],nativeCurrency:{symbol:"HYPE",decimals:18},dexscreenerSlug:"hyperevm",venueKind:"uniswap-v3",wrappedNative:"0x5555555555555555555555555555555555555555",venues:[{kind:"quoter",address:"0x03A918028f22D9E1473B7959C927AD7425A45C7C",label:"HyperSwap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle(1 WHYPE -> USDT0) returned live output on all four fee tiers (100: 57.3385, 500: 57.4187, 3000: 57.3237, 10000: 56.1963 USDT0). Decimals read on-chain: WHYPE 18, USDT0 6. Best tier checked against an INDEPENDENT control the same minute -- Hyperliquid allMids put HYPE at 57.3205, so the pool is 0.171% from the perp mid, which is the right shape for fee plus impact rather than a wrong contract or a decimals bug.",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-08-05",chainId:999}},{kind:"router",address:"0x4E2960a8cd19B467b82d26D83fAcb0fAE26b094D",label:"HyperSwap V3 SwapRouter",verified:{method:"eth_getCode returned 12070 bytes, and it is the router paired with the quoter proved above -- the same pair already shipped in UNI_V3_VENUES[999].hyperswap, which is the map the quote/prepare path actually routes through.",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-08-05",chainId:999}}]},{key:"abstract",chainId:2741,name:"Abstract",rpcEnv:["ABSTRACT_RPC_URL","ABS_RPC_URL"],nativeCurrency:{symbol:"ETH",decimals:18},venueKind:"uniswap-v3",wrappedNative:"0x3439153EB7AF838Ad19d56E1571FBD09333C2809",venues:[{kind:"quoter",address:"0x728BD3eC25D5EDBafebB84F3d67367Cd9EBC7693",label:"Uniswap V3 QuoterV2 (Abstract deployment)",verified:{method:"Abstract is a ZK-stack chain, so CREATE2 addresses differ and the canonical Uniswap addresses are NOT valid here -- probing them returns codesize 0, which is what previously made this chain look like it had no V3 at all. Found the real deployment from live traffic instead: scanned recent Swap(...) logs, took the busiest pool, read pool.factory() = 0xa1160e73b63f322ae88cc2d8e700833e71d0b2a1, then enumerated that factory's deployer (0xf3d63166F0Ca56C3c1A3508FcE03Ff0Cf3Fb691e) and probed each of its 56 contracts with a real quoteExactInputSingle call. Exactly one answered: 1 WETH -> 1846.475731 USDC.e at fee 500. Independent sanity check: the pool's own slot0() spot price is 1873.11 USDC.e per WETH, so the quoter sits ~1.4% below spot, the right shape for fee plus price impact on this size.",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-08-05",chainId:2741}},{kind:"router",address:"0x7712FA47387542819d4E35A23f8116C90C18767C",label:"Uniswap SwapRouter02 (Abstract deployment)",verified:{method:"eth_getCode returned 167392 bytes and the runtime contains the exactInputSingle selector. router.factory() matches the factory proved above and router.WETH9() matches the wrappedNative on this entry. Chosen over its byte-identical twin (0xfD6257F4...) because this is the address real users actually route through: it appeared as tx.to on live swaps against the WETH/USDC.e pool.",source:"on-chain factory()/WETH9() round-trip + live swap tx.to sampling",date:"2026-08-05",chainId:2741}}]},{key:"robinhood",chainId:4663,name:"Robinhood Chain",rpcEnv:["RH_CHAIN_RPC","ROBINHOOD_RPC_URL"],nativeCurrency:{symbol:"ETH",decimals:18},dexscreenerSlug:"robinhood",venueKind:"uniswap-v3",wrappedNative:"0x0bd7d308f8e1639fab988df18a8011f41eacad73",venues:[{kind:"quoter",address:"0x33e885ed0ec9bf04ecfb19341582aadcb4c8a9e7",label:"Uniswap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle returned a live sane price (WETH->USDG fee 100 quoted 1866.58 USDG, and USDG->CASHCAT fee 10000 quoted a live amount). A contract that correctly prices known pairs IS a working V3 quoter",source:"live eth_call against rpc.mainnet.chain.robinhood.com",date:"2026-07-31",chainId:4663}},{kind:"router",address:"0xcaf681a66d020601342297493863e78c959e5cb2",label:"Uniswap V3 SwapRouter02",verified:{method:"eth_getCode returned real bytecode (24497 bytes) on this chain and the paired quoter at the same deployment passed a live functional quote",source:"live eth_getCode against rpc.mainnet.chain.robinhood.com",date:"2026-07-31",chainId:4663}},{kind:"factory",address:"0x1f7d7550b1b028f7571e69a784071f0205fd2efa",label:"Uniswap V3 Factory",verified:{method:"eth_getCode returned real bytecode (24535 bytes) and a PoolCreated log scan over this factory returned 76 pools in ~9000 recent blocks",source:"live eth_getLogs against rpc.mainnet.chain.robinhood.com",date:"2026-07-31",chainId:4663}}]},{key:"base",chainId:8453,name:"Base",rpcEnv:["BASE_RPC_URL"],nativeCurrency:{symbol:"ETH",decimals:18},explorer:"https://basescan.org",dexscreenerSlug:"base",venueKind:"uniswap-v3",wrappedNative:"0x4200000000000000000000000000000000000006",venues:[{kind:"quoter",address:"0x3d4e44Eb1374240CE5F1B871ab261CD16335B76a",label:"Uniswap V3 QuoterV2 (Base)",verified:{method:"functional probe: quoteExactInputSingle returned WETH->USDC at fee 500 = 1908.44 USDC, a live sane price. The canonical mainnet quoter address also has bytecode on Base but does NOT price this pair, which is exactly the false positive a codesize-only check accepts",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:8453}},{kind:"router",address:"0x2626664c2603336E57B271c5C0b26F421741e481",label:"Uniswap V3 SwapRouter02 (Base)",verified:{method:"eth_getCode returned real bytecode and the paired Base quoter passed a live functional quote",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:8453}},{kind:"router-v2",address:"0x4752ba5DBc23f44D87826276BF6Fd6b1C372aD24",label:"Uniswap V2 Router02 (Base)",verified:{method:"eth_getCode returned 17891 bytes; live getAmountsOut on WETH->USDC round-tripped to 98.75% (2x0.30% fee + impact)",source:"https://docs.uniswap.org/contracts/v2/reference/smart-contracts/v2-deployments",date:"2026-07-30",chainId:8453}}]},{key:"arbitrum",chainId:42161,name:"Arbitrum One",rpcEnv:["ARBITRUM_RPC_URL","ARB_RPC_URL"],nativeCurrency:{symbol:"ETH",decimals:18},explorer:"https://arbiscan.io",dexscreenerSlug:"arbitrum",venueKind:"uniswap-v3",wrappedNative:"0x82aF49447D8a07e3bd95BD0d56f35241523fBab1",venues:[{kind:"quoter",address:"0x61fFE014bA17989E743c5F6cB21bF9697530B21e",label:"Uniswap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle returned a live sane price (WETH->USDC fee 500 quoted 1908.72 USDC). A contract that correctly prices a known pair IS a working V3 quoter",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:42161}},{kind:"router",address:"0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45",label:"Uniswap V3 SwapRouter02",verified:{method:"eth_getCode returned real bytecode on this chain and the paired quoter at the same deployment passed a live functional quote",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:42161}}]},{key:"avalanche",chainId:43114,name:"Avalanche C-Chain",rpcEnv:["AVALANCHE_RPC_URL","AVAX_RPC_URL"],nativeCurrency:{symbol:"AVAX",decimals:18},explorer:"https://snowtrace.io",dexscreenerSlug:"avalanche",venueKind:"uniswap-v3",wrappedNative:"0xB31f66AA3C1e785363F0875A1B74E27b85FD66c7",venues:[{kind:"quoter",address:"0xbe0F5544EC67e9B3b2D979aaA43f18Fd87E6257F",label:"Uniswap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle returned a live sane price (WAVAX->USDC fee 500 quoted 6.48 USDC). A contract that correctly prices a known pair IS a working V3 quoter",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:43114}},{kind:"router",address:"0xbb00FF08d01D300023C629E8fFfFcb65A5a578cE",label:"Uniswap V3 SwapRouter02",verified:{method:"eth_getCode returned real bytecode on this chain and the paired quoter at the same deployment passed a live functional quote",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:43114}}]}]);function rr(){return st.map(e=>lo(qs(e)))}function Gu(e){return lo(qs(e))}var or=new Map,oS=Object.keys(ce).map(Number),iS=Object.keys(He).map(Number),sS=st.map(e=>e.chainId),Hs=new Set,Ku=!1;function P(e){if(!e?.id)throw new Error("registerProvider requires id");if(!e.venue)throw new Error("registerProvider requires venue");if(!Array.isArray(e.ops))throw new Error("registerProvider requires ops[]");let t=String(e.id);if(Ku&&Hs.has(t))throw new Error(`registerProvider refuses to overwrite built-in provider: ${t}`);return or.set(t,{chainIds:e.chainIds||[],auth:e.auth||"none",description:e.description||"",baseEnv:e.baseEnv||[],...e,id:t}),or.get(t)}function po(e){return or.get(e)||null}function ir({venue:e,op:t}={}){let n=[...or.values()];return e&&(n=n.filter(r=>r.venue===e)),t&&(n=n.filter(r=>r.ops.includes(t))),n}function aS(){Hs.clear();for(let e of or.keys())Hs.add(e);Ku=!0}P({id:"hl-info",venue:"hl",chainIds:[],auth:"none",ops:["health","allMids","l2Book","outcomeMeta","clearinghouse","userFills","meta","metaAndAssetCtxs","candleSnapshot","openOrders","frontendOpenOrders","userState","spotMeta"],baseEnv:["HL_INFO_URL","HL_API_URL"],description:"Hyperliquid public /info"});P({id:"hl-vaults",venue:"hyperliquid-vaults",chainIds:[],auth:"none",ops:["health","summaries","details","userEquities","tracker"],execution:"read-only",baseEnv:["HL_INFO_URL","HL_API_URL"],description:"Read-only Hyperliquid vault summaries, vault details, and user vault equities, including HLP tracking."});P({id:"protocol-templates",venue:"protocol-builder",chainIds:[],auth:"none",ops:["health","list","gate","prepareDeploy"],description:"Gated Safe* Solidity templates: forge test required before unsigned deploy prepare. NOT a firm audit."});P({id:"poly-public",venue:"poly",chainIds:[137],auth:"none",ops:["health","time","markets","book","midpoint","spread","price","events"],baseEnv:["POLY_CLOB_URL","POLY_GAMMA_URL"],description:"Polymarket CLOB + Gamma public REST"});P({id:"portfolio",venue:"multichain-wallet",chainIds:[1,10,56,137,988,999,2741,4663,8453,42161,43114],auth:"none",ops:["health","balances","snapshot","history","valueGraph"],execution:"read-only",description:"Read-only balance aggregation across configured EVM chains, Solana, Bitcoin, and Hyperliquid, plus profile-local observation snapshots, history, and value graphs with explicit partial coverage."});P({id:"nft-portfolio",venue:"multichain-nft-wallet",chainIds:[1,10,137,988,999,2741,4663,8453,42161,43114],auth:"optionalApiKey",ops:["health","inventory","gallery","pnl","prepareList","traitSnipe"],execution:"prepare",baseEnv:["OPENSEA_API_KEY","MAGICEDEN_API_KEY","SATFLOW_API_KEY"],description:"Normalized EVM, Solana, and Bitcoin NFT inventory, static contact-sheet galleries, explicit PnL coverage, user-confirmed unsigned listing preparation, and evidence-gated trait-snipe buy intents."});P({id:"evm-simulate",venue:"onchain-simulation",chainIds:[1,10,56,137,988,999,2741,4663,8453,42161,43114],auth:"none",ops:["health","simulate"],execution:"read",baseEnv:[],description:"Pre-sign EVM transaction simulation: eth_call at pending state to catch reverts, decoded revert reasons (Error(string), Panic codes, custom-error selectors), and a buffered gas estimate. Distinguishes a genuine revert from an unreachable node \u2014 an infra failure is never reported as 'would fail'. A pass reflects current chain state and is explicitly not a guarantee."});P({id:"nft-mint",venue:"onchain-mint",chainIds:[1,10,56,137,988,999,2741,4663,8453,42161,43114],auth:"none",ops:["health","discover","prepare","priceGas","createTrigger","checkOpen"],execution:"prepare",baseEnv:[],description:"Prepare unsigned EVM NFT mints: discover the collection's mint entrypoint from bytecode, price a competitive EIP-1559 bid from fee-history percentiles, enforce gas-war caps, and surface contract risk. Triggers are alert_only unless explicitly armed with ORACLE_AUTONOMOUS_TRADING=1 plus a bounded grant. Never signs."});P({id:"contract-risk",venue:"onchain-bytecode",chainIds:[1,10,56,137,988,999,2741,4663,8453,42161,43114],auth:"none",ops:["health","scan"],execution:"read",baseEnv:[],description:"Structural contract risk from on-chain bytecode: retained owner powers (mint, blacklist, pause, fee changes) and upgradeability across EIP-1967, legacy zeppelinos, and EIP-1822 proxy slots. Complements behavioural sell simulation. Never reports 'safe' \u2014 a clean scan is weak evidence, not a guarantee."});P({id:"evm-token-sniper",venue:"evm-token-launches",chainIds:sS,auth:"none",ops:["health","scan"],execution:"prepare",baseEnv:st.flatMap(e=>e.rpcEnv),description:"One generic EVM token-sniping path across every configured EVM chain: live identity, pools, structural risk, sell simulation, quote, and guarded unsigned transaction preparation. Robinhood Chain is the default, not a special implementation. Never signs or broadcasts."});P({id:"evm-rpc",venue:"evm",chainIds:[1,137,42161,8453,10,4663,999],auth:"none",ops:["health","healthAll","blockNumber","chainId","getBalance","call","erc20Allowance","erc20Balance","transactionReceipt"],baseEnv:["ETH_RPC_URL","POLYGON_RPC_URL","RH_CHAIN_RPC","BASE_RPC_URL","ARBITRUM_RPC_URL"],description:"EVM JSON-RPC multi-chain (env RPC or public fallbacks)"});P({id:"solana-rpc",venue:"solana",chainIds:[],auth:"none",ops:["health","latestBlockhash","getBalance","tokenAccounts","simulate"],baseEnv:["SOLANA_RPC_URL"],description:"Solana mainnet JSON-RPC read/prepare surface (no key, no signing, no broadcast)"});P({id:"bitcoin-esplora",venue:"bitcoin",chainIds:[],auth:"none",ops:["health","tipHeight","fees","address","utxos","tx","decode"],execution:"read-only",baseEnv:["BTC_ESPLORA_URL","BTC_NETWORK"],description:"Bitcoin L1 via Esplora (mempool.space/Blockstream). Reads only on data plane. User-signed broadcast is bitcoin_send on exec MCP. No Core RPC, no house keys. Wallets: Xverse/UniSat/Leather/OKX/Phantom"});P({id:"bitcoin-meta",venue:"bitcoin-metaprotocol",chainIds:[],auth:"optionalApiKey",ops:["health","runeBalances","inscriptions","inscriptionInfo","inscriptionChildren","ordBlockInfo"],execution:"read-only",baseEnv:["BTC_META_API_URL","UNISAT_API_KEY","BESTINSLOT_API_KEY"],description:"Bitcoin ordinals/runes reads. Keyless tier via ordinals.com recursive (inscriptionInfo/children/blockInfo); address-indexed ops (inscriptions, runeBalances) need a keyed indexer. Hiro is deprecated (410) and Magic Eden BTC is dead \u2014 use satflow for market."});P({id:"satflow",venue:"bitcoin-marketplace",chainIds:[],auth:"apiKey",ops:["health","collectionFloors","collectionStats","item","walletContents","floorListings","preparePurchase","prepareList"],execution:"prepare",baseEnv:["SATFLOW_API_KEY","SATFLOW_API_URL"],description:"Satflow ordinals+runes marketplace (api.satflow.com). Primary BTC NFT market after Magic Eden BTC sunset. PSBT intents for buy/list; key via x-api-key."});P({id:"jupiter",venue:"solana-dex",chainIds:[],auth:"none",ops:["health","venues","quote","prepare"],execution:"prepare",baseEnv:["JUPITER_SWAP_API_URL","SOLANA_RPC_URL"],description:"Jupiter Swap API v1 quote + unsigned user-signature swap transaction preparation"});P({id:"hl-perps",venue:"hyperliquid",chainIds:[],auth:"none",ops:["health","assetInfo","prepareOrder","prepareCancel","prepareLeverage","prepareIsolatedMargin","prepareBracket","prepareBuilderApproval"],notes:"Hyperliquid perp orders/leverage. PREPARE-ONLY: returns signable actions, never submits."});P({id:"hl-markets",venue:"hyperliquid",chainIds:[],auth:"none",ops:["health","markets","leaderboards","coin","spot"],notes:"Joined Hyperliquid market datapoints for the Hyperliquid agent. Read-only."});P({id:"hl-staking",venue:"hypercore-staking",chainIds:[],auth:"none",ops:["health","validators","delegatorSummary","delegations","rewards","history","preflight","prepareStakeDeposit","prepareStakeWithdraw","prepareDelegate"],execution:"prepare",baseEnv:["HL_INFO_URL","HL_EXCHANGE_URL","HL_TESTNET"],description:"Hyperliquid HyperCore HYPE staking. Public reads (validators, delegations, rewards) plus EIP-712 prepare for cDeposit / cWithdraw / tokenDelegate. Prepare-only: the user's wallet signs and submits, Oracle never posts to /exchange."});P({id:"magiceden-sol",venue:"solana-nft",chainIds:[],auth:"optionalApiKey",ops:["health","stats","listings","tokenListings","prepareBuy","prepareList","prepareMint"],execution:"prepare",baseEnv:["MAGICEDEN_API_KEY","MAGICEDEN_API_URL"],description:"Magic Eden Solana NFT market. Reads (stats/listings) are keyless; buy/list/mint instruction builders need MAGICEDEN_API_KEY and return an unsigned base64 transaction for the user's Solana wallet. Never signs or broadcasts."});P({id:"defillama",venue:"prices",chainIds:[],auth:"none",ops:["health","prices","pricesBySymbol","protocols","yields","stablecoins","dexVolumes"],baseEnv:["DEFILLAMA_COINS_URL","DEFILLAMA_API_URL"],description:"DeFiLlama public prices + protocols TVL"});P({id:"lifi",venue:"dex",chainIds:[1,10,56,137,988,999,2741,4663,8453,42161,43114],auth:"none",ops:["health","quote","prepare","chains"],execution:"prepare",baseEnv:["LIFI_API_URL"],description:"LI.FI public cross-chain / DEX aggregator quotes (no key)"});P({id:"dexscreener",venue:"dex",chainIds:[],auth:"none",ops:["health","token","search","pair"],baseEnv:["DEXSCREENER_API_URL"],description:"DexScreener public token/pair discovery"});P({id:"uniswap-v3",venue:"dex",chainIds:oS,auth:"none",ops:["health","quote","prepare","quotePath","ethUsdc","chains"],execution:"prepare",baseEnv:["ETH_RPC_URL","BASE_RPC_URL","ARBITRUM_RPC_URL","OPTIMISM_RPC_URL","BSC_RPC_URL","POLYGON_RPC_URL","AVALANCHE_RPC_URL","RH_CHAIN_RPC"],description:"Uniswap V3 QuoterV2 exact-in quotes via eth_call across official deployments plus Robinhood Chain, no key"});P({id:"uniswap-v4",venue:"dex",chainIds:iS,auth:"none",ops:["health","quote","chains"],execution:"read-only",baseEnv:["ETH_RPC_URL","BASE_RPC_URL","ARBITRUM_RPC_URL","OPTIMISM_RPC_URL","BSC_RPC_URL","POLYGON_RPC_URL","AVALANCHE_RPC_URL","RH_CHAIN_RPC"],description:"Uniswap V4 Quoter exact-in quotes via eth_call across official deployments plus Robinhood Chain. Quote-only until Universal Router prepare is classified."});P({id:"aerodrome",venue:"dex",chainIds:[8453],auth:"none",ops:["health","quote","prepare","chains"],execution:"prepare",baseEnv:["BASE_RPC_URL"],description:"Aerodrome Slipstream CL on Base \u2014 QuoterV2 + SwapRouter exact-input via eth_call (tickSpacing, no key)"});P({id:"zerox",venue:"dex",chainIds:[1,10,137,8453,42161],auth:"apiKey",ops:["health","price","quote","prepare"],execution:"prepare",baseEnv:["ZEROX_API_KEY","ZEROX_API_URL"],description:"0x Swap API v2 price/quote/prepare \u2014 requires ZEROX_API_KEY (unconfigured without key; no Oracle key shipped)"});P({id:"across",venue:"bridge",chainIds:[1,10,137,42161,8453],auth:"none",ops:["health","suggestedFees"],baseEnv:["ACROSS_API_URL"],description:"Across bridge suggested-fees (public)"});P({id:"hop",venue:"bridge",chainIds:[1,10,137,42161],auth:"none",ops:["health","quote"],baseEnv:["HOP_API_URL"],description:"Hop Protocol bridge quotes (public)"});P({id:"relay",venue:"bridge",chainIds:[1,10,137,8453,42161],auth:"none",ops:["health","quote","prepare"],execution:"prepare",baseEnv:["RELAY_API_URL"],description:"Relay.link bridge/swap quotes (public)"});P({id:"cowswap",venue:"dex",chainIds:[1,100,42161,8453],auth:"none",ops:["health","quote","prepareOrder","order","status","chains"],execution:"intent",baseEnv:[],description:"CowSwap batch auction quotes + guarded EIP-712 order intents (public)"});P({id:"oneinch",venue:"dex",chainIds:[1,10,137,8453,42161],auth:"apiKey",ops:["health","quote","prepare","approveSpender"],execution:"prepare",baseEnv:["ONEINCH_API_KEY","ONEINCH_API_URL"],description:"1inch Swap API v6 quote/prepare \u2014 requires ONEINCH_API_KEY (unconfigured without key; no Oracle key shipped)"});P({id:"hl-ws",venue:"hl",chainIds:[],auth:"none",ops:["health","allMids","l2Book","snapshot"],baseEnv:["HL_WS_URL"],description:"Hyperliquid short-lived WS snapshots (allMids/l2Book)"});P({id:"poly-ws",venue:"poly",chainIds:[137],auth:"none",ops:["health","book","snapshot"],baseEnv:["POLY_WS_URL"],description:"Polymarket CLOB short-lived WS market snapshots"});P({id:"opensea-nft",venue:"nft",chainIds:[1,10,137,988,999,2741,4663,8453,42161,43114],auth:"apiKey",ops:["health","collection","floor","accountNfts","accountPnl","prepareList"],execution:"prepare",baseEnv:["OPENSEA_API_KEY","OPENSEA_ENV_FILE"],description:"OpenSea multichain NFT inventory, estimated values, indexed account PnL, collection floors, and unsigned listing actions"});P({id:"hyperevm-dex",venue:"hyperevm",chainIds:[999],auth:"none",ops:["health","search","token"],baseEnv:["HYPEREVM_RPC_URL"],description:"HyperEVM pair discovery via DexScreener + optional RPC"});P({id:"geckoterminal",venue:"dex-data",chainIds:[],auth:"none",ops:["health","networks","pool","token","ohlcv"],baseEnv:["GECKOTERMINAL_API_URL"],description:"GeckoTerminal public networks, pools, tokens, and OHLCV"});P({id:"curve",venue:"dex",chainIds:[1,10,56,137,988,999,4663,8453,42161,43114],auth:"none",ops:["health","openapi","pools","quote","prepare"],execution:"prepare",baseEnv:["CURVE_API_URL"],description:"Curve public pool registry API + RouterNG validated single-hop prepare"});P({id:"gmx",venue:"perps-data",chainIds:[42161,43114],auth:"none",ops:["health","tickers","markets","marketsInfo","tokens","prepareOrder","positions","orderStatus","verifyOrder"],execution:"intent",baseEnv:[],description:"GMX v2 public oracle/markets plus guarded async order intents on Arbitrum and Avalanche"});P({id:"morpho",venue:"lending-data",chainIds:[1,10,137,2741,8453,42161,4663,999,988],auth:"none",ops:["health","markets","vaults","prepareVault"],execution:"intent",baseEnv:["MORPHO_API_URL"],description:"Morpho public GraphQL markets/vaults + guarded ERC-4626 vault intents"});P({id:"balancer",venue:"dex",chainIds:[1,10,137,42161,43114,8453],auth:"none",ops:["health","pools","quote","prepare"],execution:"prepare",baseEnv:["BALANCER_API_URL"],description:"Balancer public GraphQL pool data + v3 Router exact-input prepare (Polygon read-only)"});P({id:"pendle",venue:"yield",chainIds:[1,10,56,8453,42161,999],auth:"none",ops:["health","markets","quote","prepare"],execution:"prepare",baseEnv:["PENDLE_API_URL"],description:"Pendle public yield-market API + Hosted SDK direct Convert prepare"});P({id:"odos",venue:"dex",chainIds:[1,10,56,137,8453,42161,43114,4663],auth:"none",ops:["health","chains","quote","prepare"],execution:"unavailable",deprecated:{since:"2026-07-30",reason:"Odos sunset the public SOR API; /sor/quote/v2 and v3 both return 410 Gone",evidence:"sunset: Thu, 30 Jul 2026 12:00:00 GMT response header"},baseEnv:["ODOS_API_URL"],description:"Odos public SOR (DEPRECATED upstream 2026-07-30 -- endpoint returns 410)"});P({id:"blockscout",venue:"explorer",chainIds:[1,10,137,8453,42161],auth:"none",ops:["health","stats","address","token"],baseEnv:[],description:"Verified public Blockscout REST v2 instances"});P({id:"paraswap",venue:"dex",chainIds:[1,10,56,137,8453,42161,43114,4663],auth:"none",ops:["health","tokens","price","quote","prepare"],execution:"prepare",baseEnv:["PARASWAP_API_URL"],description:"ParaSwap/Velora public price routes + validated transaction builder"});P({id:"rfq",venue:"intent-rfq",chainIds:[1,10,56,137,8453,42161,43114,4663],auth:"none",ops:["health","intent","quote"],execution:"prepare",baseEnv:["ZEROX_API_KEY","ONEINCH_API_KEY"],description:"Cross-chain RFQ intent normalizer and firm-quote fanout over reviewed venues. Prepares artifacts only, never signs or broadcasts."});P({id:"execution-strategies",venue:"oracle-native",chainIds:[],auth:"none",ops:["health","plan"],execution:"plan-only",baseEnv:[],description:"Oracle-native TWAP, VWAP, POV, iceberg, and implementation-shortfall planners. No Tread.fi/API dependency. Plans never sign or broadcast; every slice requires a fresh best-execution quote, policy check, simulation, confirmation, wallet signature, and receipt."});aS();P({id:"polygon-staking",venue:"polygon-staking",chainIds:[137],auth:"none",ops:["health","validators","validatorDetail"],baseEnv:["POLYGON_STAKING_API_URL"],description:"Polygon POS staking validators"});P({id:"babylon-staking",venue:"btc-staking",chainIds:[],auth:"none",ops:["health","stats","finalityProviders","delegations"],execution:"read-only",baseEnv:["BABYLON_STAKING_API_URL"],description:"Babylon native BTC staking (staking-api.babylonlabs.io v2). Keyless per-staker positions from a PUBLIC key alone \u2014 APR, TVL, finality-provider roster, and delegations. Read-only; staking/unbonding is user-wallet."});P({id:"mempool-mining",venue:"btc-mining",chainIds:[],auth:"none",ops:["health","difficulty","poolShare","hashrate","rewardStats"],execution:"read-only",baseEnv:["MEMPOOL_API_URL"],description:"Bitcoin mining + network security telemetry via mempool.space /api/v1/mining. Difficulty retarget, pool concentration (top-1/top-3 share), hashrate trend, subsidy-vs-fee split."});P({id:"liquid-esplora",venue:"liquid",chainIds:[],auth:"none",ops:["health","tipHeight","addressInfo","assetInfo"],execution:"read-only",baseEnv:["LIQUID_ESPLORA_URL"],description:"Liquid Network (Blockstream sidechain) via Esplora. Same schema as bitcoin-esplora plus multi-asset issuance/peg stats. Confidential addresses return TXO counts only \u2014 amounts are blinded on chain and reported as such."});P({id:"hiro-stacks",venue:"stacks",chainIds:[],auth:"none",ops:["health","networkInfo","stackingInfo","poxCycles","blocks"],execution:"read-only",baseEnv:["HIRO_API_URL","HIRO_API_KEY"],description:"Stacks (Bitcoin L2) via Hiro public API. Network tip, PoX stacking state (the BTC-yield mechanism), and historical reward cycles. Keyless tier is ~20 rps; HIRO_API_KEY is optional and never required."});P({id:"ordinals-runes",venue:"btc-runes",chainIds:[],auth:"none",ops:["health","blockHeight","blockInfo","satInfo","runeInfo"],execution:"read-only",baseEnv:["ORDINALS_BASE_URL"],description:"Runes + sat/block index via a public ord server (ordinals.com). /r/blockheight is PLAIN TEXT; the /runes listing is 406 'JSON API disabled' so only per-rune lookup exists; rune names must drop the bullet spacer (UNCOMMONGOODS)."});P({id:"mempool-lightning",venue:"btc-lightning",chainIds:[],auth:"none",ops:["health","statistics","nodeRankings","nodeCountries"],execution:"read-only",baseEnv:["MEMPOOL_API_URL"],description:"Lightning Network topology via mempool.space. Capacity/channel/node aggregates, node rankings, country distribution. STALE-PRONE: the crawler snapshot has been observed weeks behind, so every response carries ageDays + a stale flag."});P({id:"bob-rootstock",venue:"btc-l2",chainIds:[60808,30],auth:"none",ops:["health","stats","addressInfo","tokenBalances"],execution:"read-only",baseEnv:["BOB_EXPLORER_URL","ROOTSTOCK_EXPLORER_URL"],description:"BOB (60808) and Rootstock (30) \u2014 the EVM Bitcoin L2s \u2014 via their Blockscout v2 instances (identical schema, one code path). Chain stats, gas prices, native balances, token holdings. Pass chainId 'all' to fan out."});P({id:"bisq-markets",venue:"bisq",chainIds:[],auth:"none",ops:["health","markets","ticker","trades"],execution:"read-only",baseEnv:["BISQ_MARKETS_URL"],description:"Bisq non-KYC P2P BTC price discovery (markets.bisq.network). Value is the BASIS against centralized spot, not the absolute print: volume is thin and the last trade can be hours old, so trade age is always reported."});P({id:"magiceden-ordinals",venue:"btc-ordinals-market",chainIds:[],auth:"none",ops:["health","collectionStat"],execution:"read-only",baseEnv:["MAGICEDEN_ORD_API_URL","MAGICEDEN_API_KEY","MAGICEDEN_PROBE_COLLECTION"],description:"Magic Eden ordinals collection stats. DEGRADED UPSTREAM: /v2/ord/btc/* returned 503 'no healthy upstream' on every verification attempt. health() reports ok:false while it is down and collectionStat() returns upstreamDown:true with fallback 'satflow' instead of throwing. Only /stat is wired; 600 req/min documented."});P({id:"braiins-insights",venue:"btc-mining",chainIds:[],auth:"none",ops:["health","priceStats","poolStats"],execution:"read-only",baseEnv:["BRAIINS_INSIGHTS_URL"],description:"Braiins mining insights \u2014 BTC price tick + per-pool block/hashrate distribution. Use insights.braiins.com (302s to learn.braiins.com, followed transparently); pool.braiins.com/api is 403 and is NOT the public API."});P({id:"pyth-price-feeds",venue:"solana-oracle",chainIds:[],auth:"none",ops:["health","latestPrice","latestPrices","feedDirectory"],baseEnv:["PYTH_HERMES_URL"],description:"Pyth Network: Solana price feeds with confidence intervals, real-time updates, zero auth"});P({id:"solend-lending",venue:"solana-lending",chainIds:[],auth:"none",ops:["health","markets","reserves"],baseEnv:["SAVE_API_URL"],description:"Solend/Save lending: markets + per-reserve supply/borrow APY, Solana's Aave equivalent (keyless)"});P({id:"jito-mev",venue:"solana-mev",chainIds:[],auth:"none",ops:["health","recentBundles","tipFloor"],baseEnv:["JITO_API_URL"],description:"Jito MEV: recent bundles, tippers, tip floor \u2014 real-time Solana MEV data (keyless)"});P({id:"sanctum-lst",venue:"solana-staking",chainIds:[],auth:"none",ops:["health","lstList","apyAll","apyIndividual"],baseEnv:["SANCTUM_API_URL"],description:"Sanctum LST: liquid staking tokens with per-token APY \u2014 JitoSOL, mSOL, bSOL, compSOL, pathSOL, etc. (keyless)"});P({id:"kamino-strategies",venue:"solana-yield",chainIds:[],auth:"none",ops:["health","strategies","strategyMetrics"],baseEnv:["KAMINO_API_URL"],description:"Kamino: live yield strategies with APY, TVL, vault balances (keyless)"});P({id:"meteora-dlmm",venue:"solana-dex",chainIds:[],auth:"none",ops:["health","pools","poolSearch"],baseEnv:["METEORA_API_URL"],description:"Meteora DLMM: concentrated liquidity pools via amm-v2 API, distinct from Jupiter DEX routes (keyless)"});P({id:"aave-v3",venue:"evm-lending",chainIds:[1,10,56,137,59144,1088,534352,8453,42161,43114,5e3,1868],auth:"none",ops:["health","markets","marketReserves","chains"],baseEnv:["AAVE_V3_API_URL"],description:"Aave V3 GraphQL: multi-chain lending, full market + reserve schema with supplyInfo/borrowInfo (keyless)"});P({id:"cow-protocol",venue:"evm-intent",chainIds:[1,100,42161],auth:"none",ops:["health","auction","openOrders","recentTrades"],baseEnv:["COW_API_URL"],description:"CoW Protocol: intent/solver auction data, open orders, trades \u2014 intent-based DEX not covered by existing providers (keyless)"});P({id:"relayscan-mev",venue:"evm-mev",chainIds:[1],auth:"none",ops:["health","overview","builderProfit","dailyStats"],baseEnv:["RELAYSCAN_API_URL"],description:"Relayscan: MEV relay overview, builder profit rankings, daily block stats (keyless)"});P({id:"birdeye-tokens",venue:"solana-tokens",chainIds:[],auth:"none",ops:["health","tokenList"],baseEnv:["BIRDEYE_API_URL"],description:"Birdeye public token list: Solana tokens ranked by 24h volume, market cap (keyless)"});P({id:"das-assets",venue:"solana-nft",chainIds:[],auth:"none",ops:["health","assetsByOwner","searchAssets","assetProof"],baseEnv:["SOLANA_RPC_URL"],description:"Digital Asset Standard (DAS): compressed NFT reads via public Solana RPC \u2014 getAssetsByOwner, searchAssets, assetProof. No Helius key needed."});P({id:"symbiotic-restaking",venue:"evm-restaking",chainIds:[1],auth:"none",ops:["health","vaults","vaultDetail"],baseEnv:["SYMBIOTIC_API_URL"],description:"Symbiotic restaking: vaults with collateral data, approved status, operator metadata (keyless)"});P({id:"beefy-yields",venue:"evm-yield",chainIds:[1,10,56,137,8453,42161,43114,250,1088],auth:"none",ops:["health","apy","apyBreakdown"],baseEnv:["BEEFY_API_URL"],description:"Beefy Finance: cross-chain yield aggregator vaults with APY breakdowns (keyless)"});P({id:"across-bridge",venue:"evm-bridge",chainIds:[1,10,42161,8453,324,59144],auth:"none",ops:["health","pools","suggestedFees"],baseEnv:["ACROSS_API_URL"],description:"Across bridge: pool liquidity + APY per bridge pool with suggested fees (keyless)"});P({id:"spark-lend",venue:"evm-lending",chainIds:[1],auth:"none",ops:["health","markets"],baseEnv:["SPARK_API_URL"],description:"Spark Lend / Sky Savings: ERC-4626 vault APY + TVL + user count (keyless)"});P({id:"l2beat-tvl",venue:"evm-l2",chainIds:[],auth:"none",ops:["health","tvl","activity"],baseEnv:["L2BEAT_API_URL"],description:"L2Beat: L2 scaling TVL, project-level breakdowns, activity metrics (keyless)"});P({id:"celestia-da",venue:"evm-da",chainIds:[],auth:"none",ops:["health","stats","blockStats"],baseEnv:["CELENIUM_API_URL"],description:"Celestia DA via Celenium: blob stats, block-level blob counts, network metrics (keyless)"});N();N();var cS="https://api.hyperliquid.xyz/info",lS="https://api.hyperliquid-testnet.xyz/info";function uS({testnet:e,baseUrl:t}={}){if(t)return t.replace(/\/$/,"").endsWith("/info")?t:`${t.replace(/\/$/,"")}/info`;if(process.env.HL_INFO_URL)return process.env.HL_INFO_URL;if(process.env.HL_API_URL){let n=process.env.HL_API_URL.replace(/\/$/,"");return n.endsWith("/info")?n:`${n}/info`}return e||process.env.HL_TESTNET==="1"?lS:cS}async function G(e,t={}){if(!e||!e.type)throw new Error("hlInfo requires body.type");let n=uS(t);return y(n,{method:"POST",body:e,fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function Yu(e={}){let t=await G({type:"allMids"},e),n=t&&typeof t=="object"?Object.keys(t).length:0;return{ok:n>0,midCount:n}}async function Xe(e={}){return G({type:"allMids"},e)}async function mo(e,t={}){if(!e)throw new Error("hlL2Book requires coin");return G({type:"l2Book",coin:String(e)},t)}async function sr(e={}){return G({type:"outcomeMeta"},e)}async function fo(e,t={}){if(!e)throw new Error("hlClearinghouse requires user address");return G({type:"spotClearinghouseState",user:e},t)}async function Xu(e,t={}){if(!e)throw new Error("hlUserFills requires user address");return G({type:"userFills",user:e},t)}async function ho(e={}){return G({type:"meta"},e)}async function nn(e={}){let t={type:"metaAndAssetCtxs"};return e.dex&&(t.dex=e.dex),G(t,e)}async function rn({coin:e,interval:t="1h",startTime:n,endTime:r},o={}){if(!e)throw new Error("hlCandleSnapshot requires coin");let i={type:"candleSnapshot",req:{coin:String(e),interval:t,startTime:n??Date.now()-24*3600*1e3,endTime:r??Date.now()}};return G(i,o)}async function Qu({coin:e,startTime:t,endTime:n},r={}){if(!e)throw new Error("hlFundingHistory requires coin");return G({type:"fundingHistory",coin:String(e),startTime:t??Date.now()-24*3600*1e3,endTime:n??Date.now()},r)}async function Ju(e,t={}){if(!e)throw new Error("hlOpenOrders requires user");return G({type:"openOrders",user:e},t)}async function Zu(e,t={}){if(!e)throw new Error("hlFrontendOpenOrders requires user");return G({type:"frontendOpenOrders",user:e},t)}async function go(e,t={}){if(!e)throw new Error("hlUserState requires user");return G({type:"clearinghouseState",user:e},t)}async function yo(e={}){return G({type:"spotMeta"},e)}var pS=/^0x[0-9a-fA-F]{40}$/,td="0xdfc24b077bc1425ad1dea75bcb6f8158e10df303";function js(e,t){let n=String(e||"").trim();if(!pS.test(n))throw new Error(`hl-vaults: ${t} must be a 0x EVM address`);return n.toLowerCase()}function ed(e){if(e==null||e==="")return null;let t=Number(e);return Number.isFinite(t)?t:null}function nd(e={}){let t=Array.isArray(e.portfolio)?e.portfolio:[],n=t.find(([i])=>i==="day")?.[1]||null,r=Array.isArray(n?.accountValueHistory)?n.accountValueHistory:[],o=Array.isArray(n?.pnlHistory)?n.pnlHistory:[];return{name:e.name??null,vaultAddress:e.vaultAddress??e.address??null,leader:e.leader??null,description:e.description??null,tvl:e.tvl??r.at(-1)?.[1]??null,apr:e.apr??null,pnl:e.pnl??o.at(-1)?.[1]??null,isClosed:e.isClosed??null,allowDeposits:e.allowDeposits??null,maxDistributable:e.maxDistributable??null,followers:e.followers??null,portfolio:t}}function mS(e){return[...e].sort((t,n)=>(ed(n.tvl)??-1)-(ed(t.tvl)??-1))}function Vs(e){return e.hlInfo||G}async function zs(e={},t={}){let n=await Vs(t)({type:"vaultSummaries"},t),r=mS((Array.isArray(n)?n:[]).map(nd));return{provider:"hl-vaults",count:r.length,vaults:r,exec:!1,raw:n}}async function bo(e={},t={}){let r={type:"vaultDetails",vaultAddress:js(e.vaultAddress||e.address,"vaultAddress")};e.user&&(r.user=js(e.user,"user"));let o=await Vs(t)(r,t);return{provider:"hl-vaults",vault:nd(o||{}),exec:!1,raw:o}}async function Ws(e={},t={}){let n=js(e.user||e.address,"user"),r=await Vs(t)({type:"userVaultEquities",user:n},t),o=(Array.isArray(r)?r:[]).map(i=>({vaultAddress:i.vaultAddress??i.address??null,equity:i.equity??i.vaultEquity??null}));return{provider:"hl-vaults",user:n,count:o.length,positions:o,exec:!1,raw:r}}async function Gs(e={},t={}){let n=String(e.mode||"hlp").toLowerCase();if(n==="hlp")return bo({...e,vaultAddress:td},t);if(n==="summaries")return zs(e,t);if(n==="details")return bo(e,t);if(n==="mine")return Ws(e,t);throw new Error("hl-vaults: mode must be hlp, summaries, details, or mine")}async function rd(e={}){try{let t=await Gs({mode:"hlp"},e);return{ok:t.vault.vaultAddress===td&&!!t.vault.name,provider:"hl-vaults",hlp:{name:t.vault.name,vaultAddress:t.vault.vaultAddress,tvl:t.vault.tvl,apr:t.vault.apr,allowDeposits:t.vault.allowDeposits},exec:!1}}catch(t){return{ok:!1,provider:"hl-vaults",error:String(t?.message||t).slice(0,160),exec:!1}}}N();var hS="https://clob.polymarket.com",gS="https://gamma-api.polymarket.com";function ar(e={}){return(e.clobUrl||process.env.POLY_CLOB_URL||hS).replace(/\/$/,"")}function od(e={}){return(e.gammaUrl||process.env.POLY_GAMMA_URL||gS).replace(/\/$/,"")}async function Ks(e={}){return y(`${ar(e)}/time`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs})}async function id(e={}){let t=await Ks(e);return{ok:t!=null&&t!=="",time:t}}async function sd({limit:e=5,offset:t=0,...n}={},r={}){let o=new URLSearchParams({limit:String(e),offset:String(t),...Object.fromEntries(Object.entries(n).filter(([,i])=>i!=null).map(([i,s])=>[i,String(s)]))});return y(`${od(r)}/markets?${o}`,{fetchImpl:r.fetchImpl,timeoutMs:r.timeoutMs})}async function ad(e,t={}){if(!e)throw new Error("polyBook requires tokenId");let n=new URLSearchParams({token_id:String(e)});return y(`${ar(t)}/book?${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function cd(e,t={}){if(!e)throw new Error("polyMidpoint requires tokenId");let n=new URLSearchParams({token_id:String(e)});return y(`${ar(t)}/midpoint?${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function ld(e,t={}){if(!e)throw new Error("polySpread requires tokenId");let n=new URLSearchParams({token_id:String(e)});return y(`${ar(t)}/spread?${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function ud(e,{side:t="buy"}={},n={}){if(!e)throw new Error("polyPrice requires tokenId");let r=new URLSearchParams({token_id:String(e),side:String(t)});return y(`${ar(n)}/price?${r}`,{fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs})}async function dd({limit:e=5,offset:t=0,...n}={},r={}){let o=new URLSearchParams({limit:String(e),offset:String(t),...Object.fromEntries(Object.entries(n).filter(([,i])=>i!=null).map(([i,s])=>[i,String(s)]))});return y(`${od(r)}/events?${o}`,{fetchImpl:r.fetchImpl,timeoutMs:r.timeoutMs})}N();import{createHash as pd}from"node:crypto";var on="mainnet-beta",bS="https://api.mainnet-beta.solana.com",Ys="TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA";function wS(e={}){return String(e.rpcUrl||process.env.SOLANA_RPC_URL||bS).trim()}function K(e,t="address"){let n=String(e||"").trim();if(!/^[1-9A-HJ-NP-Za-km-z]{32,44}$/.test(n))throw new Error(`solana-rpc: ${t} must be a base58 public key`);return n}function xS(e,t){return t?[...e,{commitment:t}]:e}async function cr(e,t=[],n={}){let r=String(e||"");if(r==="sendTransaction"||r==="sendRawTransaction"||r==="requestAirdrop"||r==="requestAirDrop"||/airdrop/i.test(r)||/^send/i.test(r))throw new Error(`solana-rpc: ${r} refused \u2014 @oracle-agent/oracle is prepare-only (no broadcast/airdrop)`);let o=await y(wS(n),{method:"POST",body:{jsonrpc:"2.0",id:n.id||1,method:e,params:t},fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs??12e3});if(o?.error)throw new Error(`solana-rpc ${e}: ${o.error.message||JSON.stringify(o.error)}`);return o?.result}async function Xs(e={},t={}){let n=e.commitment?[{commitment:e.commitment}]:[],r=await cr("getLatestBlockhash",n,t);return{provider:"solana-rpc",cluster:on,blockhash:r?.value?.blockhash||null,lastValidBlockHeight:r?.value?.lastValidBlockHeight??null,slot:r?.context?.slot??null,raw:r}}async function md(e={}){try{let[t,n]=await Promise.all([cr("getHealth",[],e),Xs({},e)]);return{ok:t==="ok",provider:"solana-rpc",cluster:on,health:t,latestBlockhash:n,exec:!1}}catch(t){return{ok:!1,provider:"solana-rpc",cluster:on,error:String(t?.message||t),exec:!1}}}async function wo(e={},t={}){let n=K(e.address||e.owner,"address"),r=await cr("getBalance",xS([n],e.commitment),t);return{provider:"solana-rpc",cluster:on,address:n,lamports:String(r?.value??0),slot:r?.context?.slot??null,raw:r}}function SS(e={}){let t=e.account?.data?.parsed?.info||{},n=t.tokenAmount||{};return{pubkey:e.pubkey,mint:t.mint||null,owner:t.owner||null,amount:String(n.amount??"0"),decimals:n.decimals??null,uiAmount:n.uiAmount??null,uiAmountString:n.uiAmountString??null,raw:e}}async function lr(e={},t={}){let n=K(e.owner||e.address,"owner"),r=e.mint?{mint:K(e.mint,"mint")}:{programId:K(e.programId||Ys,"token program")},o={encoding:"jsonParsed"};e.commitment&&(o.commitment=e.commitment);let i=await cr("getTokenAccountsByOwner",[n,r,o],t),s=Array.isArray(i?.value)?i.value.map(SS):[];return{provider:"solana-rpc",cluster:on,owner:n,filter:r,slot:i?.context?.slot??null,accounts:s,raw:i}}function kS(e){let t=String(e||"").trim();if(!/^[A-Za-z0-9+/]+={0,2}$/.test(t)||t.length%4!==0)throw new Error("solana-rpc: transaction must be base64");return t}function ES(e,t){let n=0,r=0,o=t;for(let i=0;i<3;i++){if(o>=e.length)throw new Error("solana-rpc: transaction shortvec truncated");let s=e[o++];if(n|=(s&127)<<r,(s&128)===0)return{value:n,offset:o};r+=7}throw new Error("solana-rpc: transaction shortvec too long")}function vS(e){let t=Buffer.from(e,"base64");try{let n=ES(t,0),r=n.offset+n.value*64;if(r>=t.length)throw new Error("missing message");return pd("sha256").update(t.subarray(r)).digest("hex")}catch{return pd("sha256").update(t).digest("hex")}}async function fd(e={},t={}){let n=kS(e.transaction||e.swapTransaction),r={encoding:"base64",sigVerify:!!e.sigVerify,replaceRecentBlockhash:e.replaceRecentBlockhash!==!1};e.commitment&&(r.commitment=e.commitment);let o=await cr("simulateTransaction",[n,r],t),i=o?.value||{};return{provider:"solana-rpc",cluster:on,ok:i.err==null,transactionHash:vS(n),err:i.err??null,logs:i.logs||[],unitsConsumed:i.unitsConsumed??null,replacementBlockhash:i.replacementBlockhash||null,slot:o?.context?.slot??null,raw:o}}N();var IS="mainnet",_S="https://mempool.space/api",PS="https://mempool.space/testnet/api";function je(e={}){return String(e.network||process.env.BTC_NETWORK||IS).trim().toLowerCase()==="testnet"?"testnet":"mainnet"}function Js(e={}){return e.baseUrl?String(e.baseUrl).replace(/\/$/,""):process.env.BTC_ESPLORA_URL?String(process.env.BTC_ESPLORA_URL).replace(/\/$/,""):je(e)==="testnet"?PS:_S}function Qs(e){let t=String(e||"");try{let n=new URL(t);(n.username||n.password)&&(n.username="[REDACTED]",n.password="");for(let r of[...n.searchParams.keys()])/^(key|api[_-]?key|token|secret|password|auth|bearer)$/i.test(r)&&n.searchParams.set(r,"[REDACTED]");t=n.toString().replace(/\/$/,"")}catch{}return t.replace(/(https?:\/\/)([^\s/:@]+):([^\s@/]+)@/gi,"$1[REDACTED]@").replace(/([?&](?:key|api[_-]?key|token|secret|password|auth|bearer)=)[^&\s]+/gi,"$1[REDACTED]")}function Qe(e,t="address"){let n=String(e||"").trim();if(!/^(bc1|tb1|bcrt1)[a-z0-9]{20,90}$/i.test(n)&&!/^[13mn2][a-km-zA-HJ-NP-Z1-9]{25,34}$/.test(n))throw new Error(`bitcoin-esplora: ${t} must look like a Bitcoin address`);return n}function CS(e,t="txHex"){let n=String(e||"").trim().toLowerCase().replace(/^0x/,"");if(!/^[0-9a-f]+$/.test(n)||n.length<20||n.length%2!==0)throw new Error(`bitcoin-esplora: ${t} must be even-length hex`);return n}async function Zs(e,t={}){let n=`${Js(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(`bitcoin-esplora GET ${e}: HTTP ${o.status} ${i.slice(0,160)}`);return i}async function xo(e,t={}){let n=await Zs(e,t);try{return JSON.parse(n)}catch{return n}}async function hd(e={}){try{let t=await Zs("/blocks/tip/height",e),n=Number(t);return{ok:Number.isFinite(n)&&n>0,provider:"bitcoin-esplora",network:je(e),baseUrl:Qs(Js(e)),tipHeight:n,exec:!1,signing:"user-wallet"}}catch(t){return{ok:!1,provider:"bitcoin-esplora",network:je(e),baseUrl:Qs(Js(e)),error:Qs(t?.message||t),exec:!1}}}async function gd(e={}){let t=await Zs("/blocks/tip/height",e);return{provider:"bitcoin-esplora",network:je(e),tipHeight:Number(t)}}async function yd(e={}){try{let t=await xo("/v1/fees/recommended",e);return{provider:"bitcoin-esplora",network:je(e),fastestFee:t.fastestFee??null,halfHourFee:t.halfHourFee??null,hourFee:t.hourFee??null,economyFee:t.economyFee??null,minimumFee:t.minimumFee??null,raw:t}}catch{return{provider:"bitcoin-esplora",network:je(e),fastestFee:null,halfHourFee:null,hourFee:null,note:"fee endpoint unavailable on this Esplora host"}}}async function So(e={},t={}){let n=Qe(e.address||e.addr,"address"),r=await xo(`/address/${n}`,t),o=r.chain_stats||{},i=r.mempool_stats||{},s=Number(o.funded_txo_sum||0)+Number(i.funded_txo_sum||0),a=Number(o.spent_txo_sum||0)+Number(i.spent_txo_sum||0);return{provider:"bitcoin-esplora",network:je(t),address:n,balanceSats:String(s-a),chainStats:o,mempoolStats:i,raw:r}}async function bd(e={},t={}){let n=Qe(e.address||e.addr,"address"),r=await xo(`/address/${n}/utxo`,t),o=Array.isArray(r)?r:[];return{provider:"bitcoin-esplora",network:je(t),address:n,count:o.length,totalSats:String(o.reduce((i,s)=>i+Number(s.value||0),0)),utxos:o.map(i=>({txid:i.txid,vout:i.vout,value:Number(i.value||0),status:i.status||null}))}}async function wd(e={},t={}){let n=String(e.txid||e.txId||"").trim().toLowerCase();if(!/^[0-9a-f]{64}$/.test(n))throw new Error("bitcoin-esplora: txid must be 64-char hex");let r=await xo(`/tx/${n}`,t);return{provider:"bitcoin-esplora",network:je(t),txid:n,confirmed:!!r.status?.confirmed,fee:r.fee??null,size:r.size??null,weight:r.weight??null,vinCount:Array.isArray(r.vin)?r.vin.length:null,voutCount:Array.isArray(r.vout)?r.vout.length:null,raw:r}}async function xd(e={},t={}){let n=CS(e.txHex||e.hex||e.transaction,"txHex");return{provider:"bitcoin-esplora",network:je(t),encoding:"hex",txHex:n,byteLength:n.length/2,note:"full decode is wallet/client-side or via bitcoinjs; Esplora returns broadcast acceptance only"}}var Sd="ORACLE_ALLOW_CUSTOM_PROVIDER_URL";function Ne({provider:e,defaultUrl:t,hosts:n=[],url:r,strict:o=!1}){let s=(String(r??"").trim()||String(t)).replace(/\/$/,"");if(s===String(t).replace(/\/$/,""))return{baseUrl:s,trusted:!0,host:kd(t)};let a;try{a=new URL(s)}catch{throw new Error(`${e}: baseUrl must be an absolute http(s) URL`)}if(a.protocol!=="http:"&&a.protocol!=="https:")throw new Error(`${e}: baseUrl must be an absolute http(s) URL`);let c=a.host;if(!c)throw new Error(`${e}: baseUrl must be an absolute http(s) URL`);if(new Set([kd(t),...n]).has(c)){let u=/^(127\.0\.0\.1|localhost|\[::1\])(:\d+)?$/i.test(c);return a.protocol==="http:"&&!u?{baseUrl:s,trusted:!1,host:c,reason:"plaintext http downgrade"}:{baseUrl:s,trusted:!0,host:c}}if(String(process.env[Sd]||"")==="1")return{baseUrl:s,trusted:!1,host:c};if(o)throw new Error(`${e}: refusing to call non-allowlisted host ${c} (set ${Sd}=1 to permit it)`);return{baseUrl:s,trusted:!1,host:c}}function kd(e){let t=new URL(String(e));if(t.protocol!=="http:"&&t.protocol!=="https:")throw new Error("unsupported protocol");return t.host}function Ee(e,t,n){let r={...e};if(!n)return r;for(let[o,i]of Object.entries(t||{}))i&&(r[o]=i);return r}var ea="https://ordinals.com";function ko(e={}){return String(e.baseUrl||process.env.BTC_META_API_URL||process.env.UNISAT_API_URL||"").trim().replace(/\/$/,"")}var NS=["open-api.unisat.io","open-api-testnet.unisat.io","api.bestinslot.xyz","api.hiro.so"];function Ed(e={}){let t=e.apiKey||process.env.UNISAT_API_KEY||process.env.BESTINSLOT_API_KEY||process.env.BTC_META_API_KEY||"",n=!1;try{let r=ko(e);if(r){let o=new URL(r).host,i=new URL(r).protocol,s=/^(127\.0\.0\.1|localhost|\[::1\])(:\d+)?$/i.test(o);n=NS.includes(o)&&(i==="https:"||s)}}catch{n=!1}return Ee({accept:"application/json","user-agent":"oracle-btc-meta/0.1"},{authorization:t?`Bearer ${t}`:"","x-api-key":t},n)}async function sn(e,t={}){let r=await(t.fetchImpl||fetch)(e,{method:"GET",headers:Ed(t),signal:AbortSignal.timeout(t.timeoutMs??12e3)}),o=await r.text(),i;try{i=JSON.parse(o)}catch{i=o}if(!r.ok)throw new Error(`bitcoin-meta GET ${e}: HTTP ${r.status} ${String(o).slice(0,160)}`);return i}async function vd(e={}){let t=ko(e),n=null;try{let i=await(e.fetchImpl||fetch)("https://ordinals.com/r/blockheight",{signal:AbortSignal.timeout(8e3)});n=Number(await i.text())}catch{n=null}if(!t)return{ok:n!=null,provider:"bitcoin-meta",indexerConfigured:!1,ordinalsComTip:n,note:"Set BTC_META_API_URL and/or UNISAT_API_KEY / BESTINSLOT_API_KEY for balances. Marketplace = Satflow (SATFLOW_API_KEY). Magic Eden BTC is dead.",capabilities:{tip:n!=null,runeBalances:!1,inscriptions:!1,marketplace:!1}};let r={ok:!1,path:null,status:null};for(let o of["/v1/indexer/brc20/best-height","/v1/health","/health","/"])try{let s=await(e.fetchImpl||fetch)(`${t}${o}`,{headers:Ed(e),signal:AbortSignal.timeout(8e3)});if(r={ok:s.status>0&&s.status<500,path:o,status:s.status},s.ok)break}catch{}return{ok:r.ok||n!=null,provider:"bitcoin-meta",indexerConfigured:!0,baseUrl:t,probe:r,ordinalsComTip:n,apiKeyPresent:!!(process.env.UNISAT_API_KEY||process.env.BESTINSLOT_API_KEY||process.env.BTC_META_API_KEY),capabilities:{tip:n!=null,runeBalances:!0,inscriptions:!0,marketplace:!!process.env.SATFLOW_API_KEY}}}async function Eo(e={},t={}){let n=Qe(e.address||e.addr,"address"),r=ko(t);if(!r)return{provider:"bitcoin-meta",address:n,ok:!1,balances:[],error:"no indexer configured (set BTC_META_API_URL or vendor API key env)"};let o=[`${r}/v1/indexer/address/${n}/runes/balance-list?start=0&limit=100`,`${r}/v1/runes/address/${n}`,`${r}/runes/balance/${n}`,`${r}/address/${n}/runes`],i=null;for(let s of o)try{let a=await sn(s,t),c=OS(a);return{provider:"bitcoin-meta",address:n,ok:!0,count:c.length,balances:c,source:s}}catch(a){i=a}return{provider:"bitcoin-meta",address:n,ok:!1,balances:[],error:String(i?.message||i||"all indexer paths failed")}}function OS(e){let t=e?.data?.detail||e?.data?.list||e?.data||e?.balances||e?.results||e?.runes||(Array.isArray(e)?e:[]);return(Array.isArray(t)?t:[]).map(r=>({rune:r.rune||r.runeid||r.runeId||r.spacedRune||r.name||r.ticker||null,runeId:r.runeid||r.runeId||r.id||null,amount:String(r.amount??r.balance??r.total??r.qty??"0"),symbol:r.symbol||null,divisibility:r.divisibility??r.div??null,raw:r}))}async function an(e={},t={}){let n=Qe(e.address||e.addr,"address"),r=ko(t);if(!r)return{provider:"bitcoin-meta",address:n,ok:!1,inscriptions:[],error:"no indexer configured \u2014 address-indexed lookups need a keyed indexer (BTC_META_API_URL + UNISAT_API_KEY / BESTINSLOT_API_KEY). ordinals.com recursive is keyless but has no address index.",unknownNotEmpty:!0,keylessAlternatives:["btc_inscription_info (by inscription id)","btc_meta_health"]};let o=Math.min(Number(e.limit||50),200),i=[`${r}/v1/indexer/address/${n}/inscription-data?cursor=0&size=${o}`,`${r}/v1/inscriptions/address/${n}?limit=${o}`,`${r}/address/${n}/inscriptions?limit=${o}`],s=null;for(let a of i)try{let c=await sn(a,t),l=RS(c);return{provider:"bitcoin-meta",address:n,ok:!0,count:l.length,inscriptions:l,source:a}}catch(c){s=c}return{provider:"bitcoin-meta",address:n,ok:!1,inscriptions:[],error:String(s?.message||s||"all indexer paths failed")}}async function Ad(e={},t={}){let n=String(e.inscriptionId||e.id||"").trim();if(!/^[0-9a-f]{64}i\d+$/i.test(n))throw new Error("bitcoin-meta: inscriptionId must look like <64-hex-txid>i<index>");let r=t.ordinalsBase||ea,o=await sn(`${r}/r/inscription/${n}`,t);return{provider:"bitcoin-meta",source:"ordinals.com/r",keyless:!0,inscriptionId:n,info:o}}async function Id(e={},t={}){let n=String(e.inscriptionId||e.id||"").trim();if(!/^[0-9a-f]{64}i\d+$/i.test(n))throw new Error("bitcoin-meta: inscriptionId must look like <64-hex-txid>i<index>");let r=t.ordinalsBase||ea,o=Number(e.page||0),i=await sn(`${r}/r/children/${n}${o?`/${o}`:""}`,t);return{provider:"bitcoin-meta",source:"ordinals.com/r",keyless:!0,inscriptionId:n,page:o,children:Array.isArray(i?.ids)?i.ids:[],more:!!i?.more}}async function _d(e={},t={}){let n=t.ordinalsBase||ea,r=e.height??await sn(`${n}/r/blockheight`,t),o=await sn(`${n}/r/blockinfo/${Number(r)}`,t);return{provider:"bitcoin-meta",source:"ordinals.com/r",keyless:!0,height:Number(r),info:o}}function RS(e){let t=e?.data?.inscription||e?.data?.detail||e?.data?.list||e?.data||e?.inscriptions||e?.results||(Array.isArray(e)?e:[]);return(Array.isArray(t)?t:[]).map(r=>({id:r.inscriptionId||r.id||r.inscription_id||null,number:r.inscriptionNumber??r.number??null,sat:r.sat||r.satoshi||null,contentType:r.contentType||r.content_type||null,utxo:r.utxo||r.output||(r.txid!=null?`${r.txid}:${r.vout??r.n}`:null),raw:r}))}W();var LS=["unsigned","notsigned","tosign","signable"],MS=new Set(["requiresusersignature","requiressignature","needssignature","signaturerequired","signaturesrequired","signingready","signaturecount","signaturethreshold","requiredsignatures","signatureneeded","hassignature","allowsignatures","requestsignature","multisig","cosig","msig"]),US=new Set(["sig","sigs","scriptsig","witness","psbt","finalizedpsbt","completepsbt","finalpsbt","psbtfinalized","serializedtransaction"]);function ta(e){return String(e).toLowerCase().replace(/[^a-z0-9]/g,"")}function BS(e){return LS.some(t=>e.startsWith(t))||MS.has(e)}function DS(e){let t=String(e);if(!/^[\x20-\x7e]+$/.test(t))return!0;let n=ta(t);return BS(n)?!1:US.has(n)?!0:n.includes("signed")||n.includes("signature")||n.endsWith("sig")||n.endsWith("sigs")}function FS(e){let t=Number(e?.v),n=String(e?.r||""),r=String(e?.s||"");return[0,1,27,28].includes(t)&&/^0x[0-9a-f]{2,64}$/i.test(n)&&/^0x[0-9a-f]{2,64}$/i.test(r)}function na(e,t=0,n=new Set,r={nodes:0}){if(e==null||typeof e!="object")return[];if(t>16)return["<max-depth>"];if(n.has(e))return[];if(r.nodes+=1,r.nodes>2048)return["<max-nodes>"];if(n.add(e),Array.isArray(e))return e.flatMap(c=>na(c,t+1,n,r));let o=[];for(let[c,l]of Object.entries(e)){if(DS(c)){o.push(c);continue}o.push(...na(l,t+1,n,r))}let s=Object.keys(e).map(ta).some(c=>c.endsWith("psbt")||c.endsWith("psbtbase64")),a=Object.entries(e).some(([c,l])=>/complete|finalized|isfinal/.test(ta(c))&&l===!0);return s&&a&&o.push("psbt(complete)"),FS(e)&&o.push("v/r/s"),o}function Je(e,t){let n=na(t);if(n.length)throw new Error(`${e}: refused a pre-signed transaction payload from the API (fields: ${[...new Set(n)].join(", ")}) \u2014 @oracle-agent/oracle is prepare-only and will not bind signed material into a prepared envelope`)}var qS="https://api.satflow.com/v1";function Pd(e={}){return Ne({provider:"satflow",defaultUrl:qS,hosts:["api.satflow.com"],url:e.baseUrl||process.env.SATFLOW_API_URL})}function vo(e={}){return Pd(e).baseUrl}function oa(e={}){return String(e.apiKey||process.env.SATFLOW_API_KEY||process.env.BTC_SATFLOW_API_KEY||"").trim()}function HS(e={}){return Ee({accept:"application/json","content-type":"application/json","user-agent":"oracle-btc-satflow/0.1"},{"x-api-key":oa(e)},Pd(e).trusted)}async function at(e,{method:t="GET",body:n,opts:r={}}={}){if(!oa(r))throw new Error("satflow: SATFLOW_API_KEY not set (request key via Satflow docs form)");let i=`${vo(r)}${e.startsWith("/")?e:`/${e}`}`,a=await(r.fetchImpl||fetch)(i,{method:t,headers:HS(r),body:n!=null?JSON.stringify(n):void 0,signal:AbortSignal.timeout(r.timeoutMs??2e4)}),c=await a.text(),l;try{l=JSON.parse(c)}catch{l=c}if(!a.ok)throw new Error(`satflow ${t} ${e}: HTTP ${a.status} ${String(c).slice(0,200)}`);return l}async function Cd(e={}){if(!!!oa(e))return{ok:!1,provider:"satflow",baseUrl:vo(e),apiKeyPresent:!1,marketplace:"satflow",magicEdenOrdinals:"deprecated-dead",note:"Set SATFLOW_API_KEY. Magic Eden BTC ordinals marketplace is shut down \u2014 do not use ME."};try{return await at("/collection/stats/floors?type=ordinals",{opts:e}),{ok:!0,provider:"satflow",baseUrl:vo(e),apiKeyPresent:!0,marketplace:"satflow",magicEdenOrdinals:"deprecated-dead",capabilities:{floors:!0,walletContents:!0,purchaseIntent:!0,listIntent:!0,bidIntent:!0}}}catch(n){return{ok:!1,provider:"satflow",baseUrl:vo(e),apiKeyPresent:!0,error:String(n?.message||n).slice(0,200),magicEdenOrdinals:"deprecated-dead"}}}async function Td(e={},t={}){let n=String(e.type||"ordinals").toLowerCase();if(!["ordinals","runes"].includes(n))throw new Error("satflow: type must be ordinals|runes");let r=new URLSearchParams({type:n});e.ids&&r.set("ids",Array.isArray(e.ids)?e.ids.join(","):String(e.ids));let o=await at(`/collection/stats/floors?${r}`,{opts:t});return{provider:"satflow",type:n,floors:o,magicEdenOrdinals:"deprecated-dead"}}async function Nd(e={},t={}){let n=String(e.collectionId||e.id||e.slug||"").trim();if(!n)throw new Error("satflow: collectionId required");let r=new URLSearchParams({id:n});e.type&&r.set("type",e.type);let o=await at(`/collection/stats?${r}`,{opts:t});return{provider:"satflow",collectionId:n,stats:o}}async function Od(e={},t={}){let n=String(e.inscriptionId||e.id||"").trim();if(!n)throw new Error("satflow: inscriptionId required");let r=new URLSearchParams({id:n});return{provider:"satflow",item:await at(`/item?${r}`,{opts:t})}}async function Ao(e={},t={}){let n=Qe(e.address||e.addr,"address"),r=new URLSearchParams({address:n});e.type&&r.set("type",e.type),e.limit!=null&&r.set("limit",String(e.limit)),e.offset!=null&&r.set("offset",String(e.offset));let o=await at(`/address/wallet-contents?${r}`,{opts:t});return{provider:"satflow",address:n,contents:o}}async function Rd(e={},t={}){let n=e.collectionIds||e.ids||e.collectionId;if(!n)throw new Error("satflow: collectionIds required");let r=new URLSearchParams({ids:Array.isArray(n)?n.join(","):String(n)});return e.limit!=null&&r.set("limit",String(e.limit)),{provider:"satflow",listings:await at(`/orders/floor?${r}`,{opts:t})}}var jS=new Set(["body","execute","fetchImpl","opts","apiKey","baseUrl","timeoutMs","maxSats","operator"]);function $d(e={},t=null){let n=e.body&&typeof e.body=="object"?e.body:e,r={};for(let[o,i]of Object.entries(n))jS.has(o)||t&&!t.has(o)||i!==void 0&&(r[o]=i);return r}var VS=new Set(["listing_id","listingId","inscription_id","inscriptionId","runes_output","runesOutput","buyer_address","buyerAddress","ord_address","receive_address","payment_address","pay_address","tap_key","public_key","publicKey","fee_rate","feeRate","price","quantity","slug","collection_slug"]),zS=new Set(["inscription_id","inscriptionId","runes_output","runesOutput","ord_address","receive_address","price","tap_key","collection_slug","expires_at"]);function ra(e){if(!e||typeof e!="object")return null;let t=[e.price,e.priceSats,e.price_sats,e.totalSats,e.total_sats,e.amount,e.satoshis];for(let n of t){if(n==null)continue;let r=String(n).trim();if(/^\d+$/.test(r))return BigInt(r)}return null}async function Ld(e={},t={}){let n=$d(e,VS);if(!n||Object.keys(n).length===0)throw new Error("satflow: purchase body required (see docs.satflow.com intent/satflow-purchase)");let r=e.maxSats??e.body?.maxSats;if(r==null)throw new Error("satflow: maxSats is required to prepare a purchase \u2014 an uncapped buy has no spend ceiling");let o=BigInt(String(r).trim());if(o<=0n)throw new Error("satflow: maxSats must be a positive integer sat amount");let i=ra(n);if(i!=null&&i>o)throw new Error(`satflow: requested price ${i} sats exceeds maxSats cap ${o}`);let s=await at("/intent/satflow-purchase",{method:"POST",body:n,opts:t}),a=ra(s)??ra(s?.intent);if(a==null)throw new Error("satflow: purchase intent did not report a price \u2014 refusing to return an unverifiable PSBT");if(a>o)throw new Error(`satflow: purchase price ${a} sats exceeds maxSats cap ${o} \u2014 PSBT withheld`);return Je("satflow",s),O({provider:"satflow",kind:"purchase-intent",executionReady:!1,signingReady:!1,broadcastReady:!1,requiresUserSignature:!0,marketplace:"satflow",magicEdenOrdinals:"deprecated-dead",priceSats:a.toString(),maxSats:o.toString(),intent:s,unsignedPsbt:s?.unsignedPSBTBase64||s?.unsignedPsbtBase64||s?.unsigned_psbt||null,note:"Sign PSBT in a Bitcoin wallet. Broadcast only through the user's wallet or an explicitly armed Bitcoin execution plane."})}async function Io(e={},t={}){let n=$d(e,zS);if(!n.inscription_id&&!n.runes_output&&!n.inscriptionId&&!n.runesOutput)throw new Error("satflow: list requires inscription_id or runes_output");let r=await at("/intent/sell",{method:"POST",body:n,opts:t});return Je("satflow",r),O({provider:"satflow",kind:"list-intent",requiresUserSignature:!0,marketplace:"satflow",listingRequest:n,intent:r,unsignedPsbt:r?.unsignedListingPSBTBase64||r?.unsigned_psbt||null,note:"Sign listing PSBTs in a Bitcoin wallet; listing broadcast is outside the data plane."})}N();W();var _o="https://lite-api.jup.ag/swap/v1",Bd="So11111111111111111111111111111111111111112",Dd="EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",GS=100,Md=2e4;function Fd(e={}){return String(e.baseUrl||process.env.JUPITER_SWAP_API_URL||_o).replace(/\/$/,"")}function Po(e,t="amount"){try{let n=BigInt(String(e));if(n<=0n)throw new Error("nonpositive");return n.toString()}catch{throw new Error(`jupiter: ${t} must be a positive integer string`)}}function qd(e){let t=e==null?50:Number(e);if(!Number.isInteger(t)||t<0)throw new Error("jupiter: slippageBps must be a non-negative integer");if(t>GS)throw new Error("jupiter: slippage exceeds hard 100 bps cap");return t}function ia(e,t){return e==null?t:!!e}function KS(e){let t=String(e||"").trim();if(!/^[A-Za-z0-9+/]+={0,2}$/.test(t)||t.length%4!==0)throw new Error("jupiter: swapTransaction must be base64");return t}function sa(e={},{quotedAtMs:t=Date.now(),ttlMs:n=Md}={}){let r=K(e.inputMint,"inputMint"),o=K(e.outputMint,"outputMint"),i=Po(e.inAmount,"inAmount"),s=Po(e.outAmount,"outAmount"),a=Po(e.otherAmountThreshold??e.outAmount,"otherAmountThreshold"),c=qd(e.slippageBps??50);return{mode:"solana-jupiter-quote",provider:"jupiter",venue:"jupiter-swap-v1",inputMint:r,outputMint:o,inAmount:i,outAmount:s,otherAmountThreshold:a,slippageBps:c,contextSlot:e.contextSlot??null,quotedAtMs:t,expiresAtMs:t+Math.min(Math.max(Number(n)||Md,1e3),3e4)}}var YS=new Set(["BPFLoaderUpgradeab1e11111111111111111111111","BPFLoader2111111111111111111111111111111111","BPFLoader1111111111111111111111111111111111"]),XS="123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz";function Ud(e){if(typeof e!="string"||!e.length)return!1;let t=0n;for(let o of e){let i=XS.indexOf(o);if(i<0)return!1;t=t*58n+BigInt(i)}let n=t.toString(16);n.length%2&&(n="0"+n);let r=n.length/2;for(let o of e)if(o==="1")r++;else break;return r===32}async function Hd(e={},t={}){let n=e.rpc||t.solanaRpc||process.env.SOLANA_RPC||"https://api.mainnet-beta.solana.com",r=t.fetchImpl||fetch,o=await r(`${_o}/program-id-to-label`,{signal:AbortSignal.timeout(Number(t.timeoutMs)||15e3)});if(!o.ok)throw new Error(`jupiter venue map failed: HTTP ${o.status}`);let i=await o.json(),s=Object.entries(i),a=s.filter(([p])=>Ud(p)),c=[],l=s.filter(([p])=>!Ud(p)).map(([p,m])=>({programId:p,label:m,reason:"malformed program id"}));if(e.verify===!1)return{source:`${_o}/program-id-to-label`,verified:a.map(([p,m])=>({programId:p,label:m})),unresolved:l,verifiedOnChain:!1,totals:{fromRouterMap:s.length,verified:a.length}};let u=async p=>{let f=await(await r(n,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(p),signal:AbortSignal.timeout(Number(t.timeoutMs)||2e4)})).json();if(f.error)throw new Error(f.error.message);return f.result};for(let p=0;p<a.length;p+=90){let m=a.slice(p,p+90),f=null;for(let h=0;h<3&&!f;h++)try{f=await u({jsonrpc:"2.0",id:1,method:"getMultipleAccounts",params:[m.map(([g])=>g),{encoding:"base64",dataSlice:{offset:0,length:0}}]})}catch{await new Promise(g=>setTimeout(g,2e3*(h+1)))}if(!f){for(let[h,g]of m)l.push({programId:h,label:g,reason:"rpc batch failed after 3 attempts"});continue}f.value.forEach((h,g)=>{let[b,k]=m[g];h&&h.executable===!0&&YS.has(h.owner)?c.push({programId:b,label:k,owner:h.owner}):l.push({programId:b,label:k,reason:h?h.executable!==!0?"not executable":`unknown owner ${h.owner}`:"account not found"})}),p+90<a.length&&await new Promise(h=>setTimeout(h,700))}let d=new Set(c.map(p=>p.label.replace(/\s+(CLMM|CP|V\d+|Launchlab|DLMM|Pools?)$/i,"").trim()));return{source:`${_o}/program-id-to-label`,rpc:n,verifiedOnChain:!0,verifiedAt:new Date().toISOString(),totals:{fromRouterMap:s.length,verified:c.length,unresolved:l.length,distinctLabels:new Set(c.map(p=>p.label)).size,distinctBrands:d.size},verified:c.sort((p,m)=>p.label.localeCompare(m.label)),unresolved:l}}async function jd(e={}){try{return{ok:!0,provider:"jupiter",outAmount:(await Co({inputMint:Bd,outputMint:Dd,amount:"1000000",slippageBps:50},e)).quote.outAmount,exec:!1}}catch(t){return{ok:!1,provider:"jupiter",error:String(t?.message||t),exec:!1}}}async function Co(e={},t={}){let n=K(e.inputMint||e.fromMint||Bd,"inputMint"),r=K(e.outputMint||e.toMint||Dd,"outputMint"),o=Po(e.amount||e.inAmount,"amount"),i=qd(e.slippageBps??e.maxSlippageBps??50),s=new URL(`${Fd(t)}/quote`);s.searchParams.set("inputMint",n),s.searchParams.set("outputMint",r),s.searchParams.set("amount",o),s.searchParams.set("slippageBps",String(i)),s.searchParams.set("swapMode",e.swapMode||"ExactIn"),e.onlyDirectRoutes!=null&&s.searchParams.set("onlyDirectRoutes",String(!!e.onlyDirectRoutes)),e.platformFeeBps!=null&&s.searchParams.set("platformFeeBps",String(e.platformFeeBps));let a=await y(s.toString(),{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),c=sa({...a,slippageBps:i},t);return{provider:"jupiter",chain:"solana-mainnet-beta",quoteReady:!0,executionReady:!1,inputMint:n,outputMint:r,amount:o,quote:a,solanaGuard:c}}function QS(e){return Object.fromEntries(Object.entries(e).filter(([,t])=>t!==void 0))}async function Vd(e={},t={}){let n=K(e.userPublicKey||e.owner||e.wallet,"userPublicKey"),r=e.quoteResponse?{quote:e.quoteResponse,solanaGuard:sa(e.quoteResponse,t)}:await Co(e,t),o=r.quote,i=r.solanaGuard||sa(o,t);if(ia(e.dynamicSlippage,!1)===!0)throw new Error("jupiter: dynamicSlippage would override the enforced slippage ceiling \u2014 pass an explicit slippageBps instead");let s=await y(`${Fd(t)}/swap`,{method:"POST",body:QS({quoteResponse:o,userPublicKey:n,wrapAndUnwrapSol:ia(e.wrapAndUnwrapSol,!0),dynamicComputeUnitLimit:ia(e.dynamicComputeUnitLimit,!0),dynamicSlippage:!1,prioritizationFeeLamports:e.prioritizationFeeLamports}),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),a=KS(s?.swapTransaction);Je("jupiter",s);let c=s?.quoteResponse??s?.quote??null;if(c)for(let l of["inAmount","outAmount","otherAmountThreshold","inputMint","outputMint"]){let u=o?.[l],d=c?.[l];if(u!=null&&d!=null&&String(u)!==String(d))throw new Error(`jupiter: swap response ${l} (${d}) does not match the quoted ${l} (${u}) \u2014 refusing to prepare`)}return O({provider:"jupiter",chain:"solana-mainnet-beta",prepareReady:!0,executionReady:!1,signingReady:!1,broadcastReady:!1,requiresUserSignature:!0,verifiedAgainstQuote:!!c,userPublicKey:n,quote:o,solanaGuard:i,swapTransaction:a,swapTransactionEncoding:"base64",lastValidBlockHeight:s?.lastValidBlockHeight??null,prioritizationFeeLamports:s?.prioritizationFeeLamports??null,computeUnitLimit:s?.computeUnitLimit??null,raw:s},{provider:"jupiter",kind:"jupiter-swap"})}N();var ZS="https://coins.llama.fi",ek="https://api.llama.fi",tk="https://yields.llama.fi",nk="https://stablecoins.llama.fi";function rk(e={}){return(e.baseUrl||process.env.DEFILLAMA_COINS_URL||ZS).replace(/\/$/,"")}function zd(e={}){return(e.baseUrl||process.env.DEFILLAMA_API_URL||ek).replace(/\/$/,"")}async function Oe(e,t={}){if(!Array.isArray(e)||!e.length)throw new Error("llamaPrices requires coins[]");let n=e.map(encodeURIComponent).join(",");return y(`${rk(t)}/prices/current/${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function Wd(e={}){let n=(await Oe(["coingecko:ethereum"],e))?.coins?.["coingecko:ethereum"];return{ok:!!n?.price,ethUsd:n?.price??null}}async function To(e={}){return y(`${zd(e)}/protocols`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??2e4})}async function Gd(e={},t={}){let n=(t.yieldsBaseUrl||process.env.DEFILLAMA_YIELDS_URL||tk).replace(/\/$/,""),r=await y(`${n}/pools`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??3e4}),o=Array.isArray(r?.data)?r.data:[];e.chain&&(o=o.filter(s=>String(s.chain).toLowerCase()===String(e.chain).toLowerCase())),e.project&&(o=o.filter(s=>String(s.project).toLowerCase()===String(e.project).toLowerCase())),e.stablecoin!=null&&(o=o.filter(s=>!!s.stablecoin==!!e.stablecoin)),o.sort((s,a)=>Number(a.tvlUsd||0)-Number(s.tvlUsd||0));let i=Math.min(5e3,Math.max(1,Number(e.limit||o.length||1)));return{...r,data:o.slice(0,i)}}async function Kd(e={},t={}){let n=(t.stablecoinsBaseUrl||process.env.DEFILLAMA_STABLECOINS_URL||nk).replace(/\/$/,""),r=e.includePrices!==!1;return y(`${n}/stablecoins?includePrices=${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??3e4})}async function Yd(e={},t={}){let n=encodeURIComponent(String(e.chain||"Ethereum")),r=new URLSearchParams({excludeTotalDataChart:String(e.includeChart!==!0),excludeTotalDataChartBreakdown:String(e.includeBreakdown!==!0),dataType:"dailyVolume"});return y(`${zd(t)}/overview/dexs/${n}?${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??3e4})}async function Xd(e=["ethereum","bitcoin","solana"],t={}){let n=e.map(i=>`coingecko:${String(i).toLowerCase()}`),r=await Oe(n,t),o={};for(let i of e){let s=`coingecko:${String(i).toLowerCase()}`;o[i]=r?.coins?.[s]||null}return o}N();me();No();W();import{existsSync as mk,readFileSync as fk}from"node:fs";import{homedir as hk}from"node:os";import{join as Qd}from"node:path";import{Contract as ik,JsonRpcProvider as sk}from"ethers";var ak="0x62FCFAf7573AD8B41a0FBF347AfEb85e06599A75",ck=999,lk="https://rpc.hyperliquid.xyz/evm",uk=["function balanceOf(address owner) view returns (uint256)"],dk=/^0x[a-fA-F0-9]{40}$/;function pk(e){return dk.test(String(e||""))}async function Oo(e,{contract:t=ak,rpc:n=lk,chainId:r=ck,balanceOf:o}={}){if(!pk(e))throw new Error("invalid-address");if(o)return BigInt(await o(e));let i=new sk(n,r,{staticNetwork:!0}),s=new ik(t,uk,i);return BigInt(await s.balanceOf(e))}var gk=100,yk=5,Jd=Object.freeze({swap:5,bridge:5,perps:0,nft:0});function bk(e){let t=String(e||"swap").toLowerCase();return Object.prototype.hasOwnProperty.call(Jd,t)?Jd[t]:yk}var wk="ORACLE_INTEGRATOR_FEE_BPS",xk="ORACLE_INTEGRATOR_FEE_RECIPIENT",Sk="ORACLE_INTEGRATOR_ID",Zd="ORACLE_INTEGRATOR_FEE_RECIPIENT_PIN",kk="oracle";function Ek(e=process.env){if(e[Zd])return String(e[Zd]);let t=e.ORACLE_CONFIG_DIR||Qd(hk(),".config","oracle");return Qd(t,"fee-recipient")}function ca(e=process.env){try{let t=Ek(e);if(!mk(t))return"";let n=fk(t,"utf8").trim().toLowerCase();return/^0x[a-f0-9]{40}$/.test(n)?n:""}catch{return""}}function vk(e,{fallback:t=0}={}){if(e==null)return t;if(String(e).trim()==="")return 0;let n=Number(e);return!Number.isFinite(n)||n<=0?0:Math.min(Math.floor(n),gk)}function Ak({env:e=process.env,action:t="swap",admin:n=!1}={}){let r=String(e[xk]||"").trim(),o=String(e[Sk]||kk).trim();if(n===!0)return{bps:0,recipient:"",integrator:o,action:t,applies:!1,reason:"admin-oracle"};let i=bk(t),s=vk(e[wk],{fallback:r?i:0}),a=Math.min(s,i);if(!a)return{bps:0,recipient:"",integrator:o,action:t,applies:!1,reason:"not-configured"};if(!/^0x[a-fA-F0-9]{40}$/.test(r))return{bps:0,recipient:"",integrator:o,action:t,applies:!1,reason:"no-recipient"};let c=ca(e);return!c||c!==r.toLowerCase()?{bps:0,recipient:"",integrator:o,action:t,applies:!1,reason:"recipient-not-pinned"}:{bps:a,recipient:r,integrator:o,action:t,applies:!0,reason:"configured"}}async function Ro({wallet:e,env:t=process.env,action:n="swap",holderCheck:r={},admin:o=!1}={}){let i=Ak({env:t,action:n,admin:o});if(o===!0)return{...i,holderVerificationStatus:"admin-oracle"};let s=String(e||"").trim().toLowerCase();if(!/^0x[a-f0-9]{40}$/.test(s))return{...i,holderVerificationStatus:"wallet-required"};try{return BigInt(await Oo(s,r))>0n?{...i,bps:0,applies:!1,reason:"locals-only-holder",holderVerificationStatus:"holder"}:{...i,holderVerificationStatus:"non-holder"}}catch{return{...i,holderVerificationStatus:"unavailable"}}}function ep(e){return e?.applies?`Oracle routing fee ${e.bps} bps (${(e.bps/100).toFixed(2)}%) to ${e.recipient}.`:e?.reason==="admin-oracle"?"No Oracle fee (admin Oracle).":e?.reason==="locals-only-holder"?"No Oracle fee (Locals Only holder).":"No Oracle fee."}function tp(e){return e?.applies?{integrator:e.integrator,fee:String(e.bps/1e4)}:{}}function np(e){return e?.applies?{partner:e.integrator,partnerFeeBps:String(e.bps),partnerAddress:e.recipient}:{}}var Ik="https://li.quest/v1";function ua(e={}){return(e.baseUrl||process.env.LIFI_API_URL||Ik).replace(/\/$/,"")}var la="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",_k="0x0000000000000000000000000000000000000000";function Pk(e){let t=String(e||la).toLowerCase();return t===la.toLowerCase()||t===_k}function rp(e,t){let n=String(e||"").trim();if(!/^0x[0-9a-fA-F]{40}$/.test(n))throw new Error(`lifi: ${t} must be a 20-byte address`);return n.toLowerCase()}async function op(e={}){let t=await y(`${ua(e)}/chains`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??12e3}),n=Array.isArray(t)?t.length:t?.chains?.length||0;return{ok:n>0,chainCount:n}}async function lt(e={},t={}){let{fromChain:n,toChain:r=n,fromToken:o=la,toToken:i,fromAmount:s,fromAddress:a=ct}=e;if(n==null||!i||!s)throw new Error("lifiQuote requires fromChain, toToken, fromAmount");let c=new URLSearchParams({fromChain:String(n),toChain:String(r),fromToken:o,toToken:i,fromAmount:String(s),fromAddress:a}),l=pe({liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,crossChain:Number(r)!==Number(n),requestedCapBps:e.maxSlippageBps??e.slippageBps});if(!l.executable)throw new Error(`lifi: route requires ${l.requiredBps} bps above cap ${l.capBps}`);c.set("slippage",String(l.selectedBps/1e4));let u=await Ro({wallet:e.fromAddress,env:t.env,action:e.feeAction||"swap",holderCheck:t.holderCheck});for(let[g,b]of Object.entries(tp(u)))c.set(g,b);let d=await y(`${ua(t)}/quote?${c}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4}),p=d?.estimate?.toAmount||d?.toAmount;if(!p)return{...d,autoSlippagePolicy:l,oracleFee:u};let m=d?.transactionRequest?.to||d?.estimate?.approvalAddress||"lifi",f=V(d,{chainId:Number(n),venue:m,amountOut:p,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,crossChain:Number(r)!==Number(n),requestedCapBps:e.maxSlippageBps??e.slippageBps}),h=d?.estimate?.toAmountMin||d?.toAmountMin;if(h!=null&&BigInt(h)<BigInt(f.amountOutMinimum))throw new Error("lifi: provider transaction is under-protected versus bounded auto-slippage floor");return{...f,oracleFee:u}}async function ip(e={},t={}){let n=await lt(e,t),r=n?.transactionRequest;if(!r?.to||!r?.data)throw new Error("lifi: quote did not return an executable transactionRequest");let o=Number(e.fromChain);if(r.chainId!=null&&Number(r.chainId)!==o)throw new Error("lifi: transaction chain mismatch");if(e.fromAddress&&r.from&&String(r.from).toLowerCase()!==String(e.fromAddress).toLowerCase())throw new Error("lifi: transaction sender mismatch");let i=null;if(!Pk(e.fromToken)){let s=n?.estimate?.approvalAddress||n?.approvalAddress;if(!s)throw new Error("lifi: ERC20 route missing approvalAddress");let a=n?.action?.fromToken?.address||n?.estimate?.fromToken?.address||e.fromToken;i={token:rp(a,"approval token"),spender:rp(s,"approval spender"),amount:String(e.fromAmount)}}return O({provider:"lifi",calldataReady:!0,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:o,quote:n,autoSlippage:n.autoSlippage,requiresApproval:i,transaction:{chainId:o,from:r.from||e.fromAddress,to:r.to,data:r.data,value:r.value??"0x0",...r.gasLimit!=null?{gasLimit:r.gasLimit}:{},slippageGuard:J(n.autoSlippage,{chainId:o,venue:r.to,data:r.data})}},{provider:"lifi",kind:"lifi-tx"})}async function sp(e={}){return y(`${ua(e)}/chains`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??12e3})}import{Interface as lp,getAddress as ur,isAddress as Tk}from"ethers";me();W();var ut={8453:{name:"base",quoter:"0x254cF9E1E6e233aa1AC962CB9B05b2cfeAaE15b0",router:"0xBE6D8f0d05cC4be24d5167a3eF062215bE6D18a5",factory:"0x5e7BB104d84c7CB9B682AaC2F3d509f5F406809A",weth:"0x4200000000000000000000000000000000000006",usdc:"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"}},Nk=[1,50,100,200,2e3],ap=new lp(["function quoteExactInputSingle((address tokenIn, address tokenOut, uint256 amountIn, int24 tickSpacing, uint160 sqrtPriceLimitX96) params) returns (uint256 amountOut, uint160 sqrtPriceX96After, uint32 initializedTicksCrossed, uint256 gasEstimate)"]),Ok=new lp(["function exactInputSingle((address tokenIn, address tokenOut, int24 tickSpacing, address recipient, uint256 deadline, uint256 amountIn, uint256 amountOutMinimum, uint160 sqrtPriceLimitX96) params) payable returns (uint256 amountOut)"]),up="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",dp="0x0000000000000000000000000000000000000000";function pp(e){let t=Number(e),n=ut[t];if(!n)throw new Error(`aerodrome: unsupported chainId ${e} (supported: ${Object.keys(ut).join(", ")})`);return{chainId:t,...n}}function cp(e,t){let n=ut[Number(t)];if(!e||e===up||e===dp||/^eth$/i.test(String(e)))return ur(n.weth);let r=String(e);if(/^weth$/i.test(r))return ur(n.weth);if(/^usdc$/i.test(r))return ur(n.usdc);if(!Tk(r))throw new Error(`invalid token address: ${e}`);return ur(r)}async function $o(e={},t={}){let{chainId:n,quoter:r,router:o}=pp(e.chainId??8453),i=cp(e.tokenIn||"WETH",n),s=cp(e.tokenOut||ut[n].usdc,n),a=BigInt(e.amountIn??0);if(a<=0n)throw new Error("amountIn required (raw base units)");let c=e.tickSpacing!=null?[Number(e.tickSpacing)]:e.tryTickSpacings===!1?[100]:[...Nk],l=[],u=null;for(let d of c){let p=ap.encodeFunctionData("quoteExactInputSingle",[{tokenIn:i,tokenOut:s,amountIn:a,tickSpacing:d,sqrtPriceLimitX96:0n}]);try{let m=await L(n,"eth_call",[{to:r,data:p},"latest"],t);if(!m||m==="0x"){l.push({tickSpacing:d,ok:!1,error:"empty result"});continue}let f=ap.decodeFunctionResult("quoteExactInputSingle",m),h={tickSpacing:d,ok:!0,amountOut:f[0].toString(),sqrtPriceX96After:f[1].toString(),initializedTicksCrossed:Number(f[2]),gasEstimate:f[3].toString()};l.push(h),(!u||BigInt(h.amountOut)>BigInt(u.amountOut))&&(u=h)}catch(m){l.push({tickSpacing:d,ok:!1,error:String(m.message||m).slice(0,160)})}}if(!u){let d=l.map(p=>`${p.tickSpacing}:${p.error||"fail"}`).join("; ");throw new Error(`aerodrome quote failed chain=${n}: ${d}`)}return V({venue:"aerodrome",chainId:n,chain:ut[n].name,quoter:r,router:o,tokenIn:i,tokenOut:s,amountIn:a.toString(),tickSpacing:u.tickSpacing,amountOut:u.amountOut,gasEstimate:u.gasEstimate,sqrtPriceX96After:u.sqrtPriceX96After,initializedTicksCrossed:u.initializedTicksCrossed,triedTickSpacings:l,best:!0},{chainId:n,venue:o,amountOut:u.amountOut,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps})}async function mp(e={},t={}){let n=Number(e.chainId??8453),r=pp(n),o=ur(e.recipient||e.from||e.userAddress),i=String(e.tokenIn||"WETH"),s=!e.tokenIn||i===up||i===dp||/^eth$/i.test(i),a=await $o(e,t),c=Math.min(600,Math.max(30,Number(e.deadlineSeconds??300))),u=Number(t.nowSeconds??Math.floor(Date.now()/1e3))+c,d=Ok.encodeFunctionData("exactInputSingle",[{tokenIn:a.tokenIn,tokenOut:a.tokenOut,tickSpacing:a.tickSpacing,recipient:o,deadline:u,amountIn:BigInt(a.amountIn),amountOutMinimum:BigInt(a.amountOutMinimum),sqrtPriceLimitX96:0n}]);return O({provider:"aerodrome",calldataReady:!0,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:n,deadline:u,quote:a,autoSlippage:a.autoSlippage,requiresApproval:s?null:{token:a.tokenIn,spender:r.router,amount:a.amountIn},transaction:{chainId:n,from:o,to:r.router,data:d,value:s?a.amountIn:"0",slippageGuard:J(a.autoSlippage,{chainId:n,venue:r.router,data:d})}},{provider:"aerodrome",kind:"aerodrome-exact-in"})}async function fp(e={}){let t=Number(e.chainId??8453);try{let n=await $o({chainId:t,tokenIn:"WETH",tokenOut:"USDC",amountIn:"1000000000000000"},e),r=Number(n.amountOut)/1e6;return{ok:!0,chainId:t,tickSpacing:n.tickSpacing,amountOutUsdc:r,midPxHint:r/.001,router:ut[t]?.router,quoter:ut[t]?.quoter}}catch(n){return{ok:!1,chainId:t,error:String(n.message||n).slice(0,200)}}}async function hp(){return Object.entries(ut).map(([e,t])=>({chainId:Number(e),name:t.name,quoter:t.quoter,router:t.router,factory:t.factory,weth:t.weth,usdc:t.usdc}))}N();me();W();var $k="https://api.0x.org";function gp(e={}){return Ne({provider:"zerox",defaultUrl:$k,hosts:["api.0x.org"],url:e.baseUrl||process.env.ZEROX_API_URL})}function yp(e={}){return gp(e).baseUrl}function Lo(e={}){return e.apiKey||process.env.ZEROX_API_KEY||process.env.OX_API_KEY||process.env["0X_API_KEY"]||""}function bp(e={}){return Ee({"0x-version":"v2",accept:"application/json"},{"0x-api-key":Lo(e)},gp(e).trusted)}async function wp(e={}){if(!Lo(e))return{ok:!1,configured:!1,error:"ZEROX_API_KEY not set"};try{let t=await da({chainId:8453,sellToken:"0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",buyToken:"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",sellAmount:"1000000000000000"},e);return{ok:!0,configured:!0,buyAmount:t.buyAmount||t.grossBuyAmount}}catch(t){return{ok:!1,configured:!0,error:String(t.message||t).slice(0,160)}}}async function da(e={},t={}){if(!Lo(t))throw new Error("ZEROX_API_KEY required for 0x");let{chainId:n=8453,sellToken:r,buyToken:o,sellAmount:i,taker:s}=e;if(!r||!o||!i)throw new Error("zeroxPrice requires sellToken, buyToken, sellAmount");let a=new URLSearchParams({chainId:String(n),sellToken:r,buyToken:o,sellAmount:String(i)});return s&&a.set("taker",s),y(`${yp(t)}/swap/allowance-holder/price?${a}`,{headers:bp(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function Rt(e={},t={}){if(!Lo(t))throw new Error("ZEROX_API_KEY required for 0x");let{chainId:n=8453,sellToken:r,buyToken:o,sellAmount:i,taker:s}=e;if(!r||!o||!i)throw new Error("zeroxQuote requires sellToken, buyToken, sellAmount");let a=pe({liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps});if(!a.executable)throw new Error(`0x: route requires ${a.requiredBps} bps above cap ${a.capBps}`);let c=new URLSearchParams({chainId:String(n),sellToken:r,buyToken:o,sellAmount:String(i),slippageBps:String(a.selectedBps)});s&&c.set("taker",s);let l=await y(`${yp(t)}/swap/allowance-holder/quote?${c}`,{headers:bp(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),u=l?.buyAmount||l?.grossBuyAmount;return u?V(l,{chainId:n,venue:l?.transaction?.to||l?.to||"0x",amountOut:u,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps}):{...l,autoSlippagePolicy:a}}async function xp(e={},t={}){if(!e.taker)throw new Error("0x: taker required for executable prepare");let n=await Rt(e,t),r=n?.transaction;if(!r?.to||!r?.data)throw new Error("0x: firm quote returned no transaction");let o=Number(e.chainId??8453),i=n?.issues?.allowance?.spender||n?.allowanceTarget;return O({provider:"zerox",calldataReady:!0,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:o,quote:n,autoSlippage:n.autoSlippage,requiresApproval:n?.issues?.allowance?.actual!=null&&BigInt(n.issues.allowance.actual)<BigInt(e.sellAmount)?{token:e.sellToken,spender:i,amount:String(e.sellAmount)}:null,transaction:{chainId:o,from:e.taker,to:r.to,data:r.data,value:r.value??"0x0",...r.gas!=null?{gasLimit:r.gas}:{},slippageGuard:J(n.autoSlippage,{chainId:o,venue:r.to,data:r.data})}},{provider:"zerox",kind:"zerox-tx"})}Do();N();me();import{TypedDataEncoder as Hk,getAddress as pr,isAddress as jk}from"ethers";var E$=Object.freeze({READ:"read",PREPARE:"prepare",EXECUTE:"execute",AUTONOMOUS:"autonomous"}),Uk=new Set(["evm:execute","btc:execute","solana:execute","nft:buy","nft:mint","cow:submit"]),Bk=new Set(["evm:prepare"]),Dk="public package is prepare-only; the user wallet or private operator must sign and submit";function cn(e=process.env){return String(e.ORACLE_AUTONOMOUS_TRADING??"").trim()==="1"}function vp(e,{env:t=process.env,userInitiated:n=!1,autonomous:r=!1}={}){return Uk.has(e)?{capability:e,armed:!1,allowed:!1,reason:Dk}:Bk.has(e)?String(t.ORACLE_EVM_ADDRESS??"").trim()?!n&&!r?{capability:e,armed:!1,allowed:!1,reason:"preparation requires an explicit request or enabled unattended preparation"}:r&&!cn(t)?{capability:e,armed:!1,allowed:!1,reason:"unattended preparation is off"}:{capability:e,armed:!1,allowed:!0,reason:null}:{capability:e,armed:!1,allowed:!1,reason:"a public address is required to prepare this action"}:{capability:e,armed:!1,allowed:!1,reason:`unknown capability: ${e}`}}function Fk(e,t={}){let n=vp(e,t);if(!n.allowed){let r=new Error(`oracle: ${e} not permitted: ${n.reason}`);throw r.status=n,r}return n}function qk(e=process.env){return{model:"public prepare-only; execution is unavailable",armed:[],autonomousTrading:"off",autonomousPreparation:cn(e)?"ENABLED":"off",note:"Oracle prepares unsigned actions. The user wallet or private operator signs and submits."}}No();W();var Ip={1:"https://api.cow.fi/mainnet/api/v1",100:"https://api.cow.fi/xdai/api/v1",42161:"https://api.cow.fi/arbitrum_one/api/v1",8453:"https://api.cow.fi/base/api/v1"},Vk=Object.freeze({1:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41",100:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41",42161:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41",8453:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41"}),zk=Object.freeze({1:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110",100:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110",42161:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110",8453:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110"}),ya={1:"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",8453:"0x4200000000000000000000000000000000000006",42161:"0x82aF49447D8a07e3bd95BD0d56f35241523fBab1"},_p={1:"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",8453:"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",42161:"0xaf88d065e77c8cC2239327C5EDb3A432268e5831"},Ap=Object.freeze({Order:[{name:"sellToken",type:"address"},{name:"buyToken",type:"address"},{name:"receiver",type:"address"},{name:"sellAmount",type:"uint256"},{name:"buyAmount",type:"uint256"},{name:"validTo",type:"uint32"},{name:"appData",type:"bytes32"},{name:"feeAmount",type:"uint256"},{name:"kind",type:"string"},{name:"partiallyFillable",type:"bool"},{name:"sellTokenBalance",type:"string"},{name:"buyTokenBalance",type:"string"}]}),O$=Object.freeze({OrderCancellations:[{name:"orderUids",type:"bytes[]"}]});function ba(e,t={}){if(t.baseUrl)return t.baseUrl.replace(/\/$/,"");let n=Ip[Number(e)];if(!n)throw new Error(`cowswap: unsupported chainId ${e}`);return n}function Fo(e,t){let n=String(e||"").trim();if(!jk(n))throw new Error(`cowswap: ${t} must be an address`);return pr(n).toLowerCase()}function ga(e,t){try{let n=BigInt(String(e));if(n<0n)throw new Error("negative");return n.toString()}catch{throw new Error(`cowswap: ${t} must be a non-negative integer string`)}}function Wk(e,t){let n=String(e||"").trim();if(!/^0x[0-9a-fA-F]{64}$/.test(n))throw new Error(`cowswap: ${t} must be bytes32 hex`);return n.toLowerCase()}function Gk(e){let t=Vk[Number(e)];if(!t)throw new Error(`cowswap: settlement contract not registered for chain ${e}`);return{name:"Gnosis Protocol",version:"v2",chainId:Number(e),verifyingContract:pr(t)}}function Kk(e={},t,n){let r=Fo(e.sellToken,"sellToken"),o=Fo(e.buyToken,"buyToken"),i=Fo(e.receiver||n,"receiver"),s=Number(e.validTo);if(!Number.isInteger(s)||s<=0)throw new Error("cowswap: quote.validTo required");let a=Wk(e.appData||e.appDataHash||`0x${"0".repeat(64)}`,"appData");return{sellToken:r,buyToken:o,receiver:i,sellAmount:ga(e.sellAmount,"sellAmount"),buyAmount:ga(e.buyAmount,"buyAmount"),validTo:s,appData:a,feeAmount:ga(e.feeAmount??"0","feeAmount"),kind:String(e.kind||"sell"),partiallyFillable:!!e.partiallyFillable,sellTokenBalance:String(e.sellTokenBalance||"erc20"),buyTokenBalance:String(e.buyTokenBalance||"erc20")}}async function Pp(e={}){try{let t=await dt({chainId:1,sellToken:ya[1],buyToken:_p[1],sellAmountBeforeFee:"1000000000000000",from:ct},e);return{ok:!0,buyAmount:t.quote?.buyAmount||t.buyAmount}}catch(t){return{ok:!1,error:String(t.message||t).slice(0,160)}}}async function dt(e={},t={}){let n=Number(e.chainId??1),r=aa(e.from||e.owner),o=e.sellToken||ya[n],i=e.buyToken||_p[n],s=String(e.sellAmountBeforeFee||e.sellAmount||"0");if(!o||!i||s==="0")throw new Error("cowQuote requires sellToken, buyToken, sellAmountBeforeFee");if(/eeeeeeee|native|^eth$/i.test(o)&&(o=ya[n],!o))throw new Error("no WETH mapping for chain");let a={sellToken:o,buyToken:i,from:r,receiver:e.receiver||r,sellAmountBeforeFee:s,kind:e.kind||"sell",signingScheme:e.signingScheme||"eip1271"},c=await y(`${ba(n,t)}/quote`,{method:"POST",body:a,fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),l=c?.quote?.buyAmount||c?.buyAmount;return l?V(c,{chainId:n,venue:"cowswap-order",amountOut:l,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps}):c}async function Cp(e={},t={}){let n=Number(e.chainId??1),r=Fo(aa(e.from||e.owner||e.signer),"owner"),o=await dt({...e,chainId:n,from:r,signingScheme:e.signingScheme||"eip712"},t),i=Kk(o?.quote||o,n,r),s=Gk(n),a={domain:s,types:Ap,primaryType:"Order",message:i},c=Hk.hash(s,Ap,i),l=zk[n];if(!l)throw new Error(`cowswap: vault relayer not registered for chain ${n}`);return O({provider:"cowswap",orderReady:!0,executionReady:!1,chainId:n,owner:r,signingScheme:"eip712",settlement:s.verifyingContract.toLowerCase(),vaultRelayer:pr(l).toLowerCase(),quote:o,quoteId:o?.id??e.quoteId??null,typedData:a,cowGuard:{mode:"cow-order",version:1,provider:"cowswap",chainId:n,owner:r,settlement:s.verifyingContract.toLowerCase(),vaultRelayer:pr(l).toLowerCase(),sellToken:i.sellToken,buyToken:i.buyToken,sellAmount:i.sellAmount,buyAmount:i.buyAmount,validTo:i.validTo,quoteId:o?.id??e.quoteId??null,typedDataHash:c,issuedAtMs:Date.now(),expiresAtMs:Math.min(i.validTo*1e3,Date.now()+2e4)},requiresApproval:{token:i.sellToken,spender:pr(l).toLowerCase(),amount:i.sellAmount}},{provider:"cowswap",kind:"cow-order"})}async function Tp(e={},t={}){let n=Number(e.chainId??1),r=String(e.uid||e.orderUid||"").trim();if(!r)throw new Error("cowOrderStatus requires uid");return y(`${ba(n,t)}/orders/${encodeURIComponent(r)}/status`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function Np(e={},t={}){let n=Number(e.chainId??1),r=String(e.uid||e.orderUid||"").trim();if(!r)throw new Error("cowOrder requires uid");return y(`${ba(n,t)}/orders/${encodeURIComponent(r)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}function Op(){return Object.keys(Ip).map(Number)}N();me();W();var Xk="https://api.1inch.dev/swap/v6.0";function Rp(e={}){return Ne({provider:"oneinch",defaultUrl:Xk,hosts:["api.1inch.dev"],url:e.baseUrl||process.env.ONEINCH_API_URL})}function wa(e={}){return Rp(e).baseUrl}function mr(e={}){return e.apiKey||process.env.ONEINCH_API_KEY||process.env.ONE_INCH_API_KEY||""}function xa(e={}){let t=mr(e);return Ee({accept:"application/json"},{Authorization:t?`Bearer ${t}`:""},Rp(e).trusted)}async function $p(e={}){if(!mr(e))return{ok:!1,configured:!1,error:"ONEINCH_API_KEY not set"};try{return{ok:!0,configured:!0,dstAmount:(await fr({chainId:8453,src:"0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",dst:"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",amount:"1000000000000000"},e)).dstAmount}}catch(t){return{ok:!1,configured:!0,error:String(t.message||t).slice(0,160)}}}async function fr(e={},t={}){if(!mr(t))throw new Error("ONEINCH_API_KEY required for 1inch");let n=Number(e.chainId??1),{src:r,dst:o,amount:i}=e;if(!r||!o||!i)throw new Error("oneinchQuote requires src, dst, amount");let s=new URLSearchParams({src:r,dst:o,amount:String(i)}),a=await y(`${wa(t)}/${n}/quote?${s}`,{headers:xa(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3});return a?.dstAmount?V(a,{chainId:n,venue:"1inch-quote",amountOut:a.dstAmount,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps}):a}function Qk(e){return/^(eth|native|0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee)$/i.test(String(e||""))}async function Sa(e={},t={}){if(!mr(t))throw new Error("ONEINCH_API_KEY required for 1inch");let n=Number(e.chainId??1);return y(`${wa(t)}/${n}/approve/spender`,{headers:xa(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function Lp(e={},t={}){if(!mr(t))throw new Error("ONEINCH_API_KEY required for 1inch");let n=Number(e.chainId??1),{src:r,dst:o,amount:i}=e,s=e.from||e.fromAddress||e.userAddress||e.taker;if(!r||!o||!i||!s)throw new Error("oneinchPrepare requires src, dst, amount, from");let a=pe({liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps});if(!a.executable)throw new Error(`1inch: route requires ${a.requiredBps} bps above cap ${a.capBps}`);let c=new URLSearchParams({src:r,dst:o,amount:String(i),from:s,slippage:String(a.selectedBps/100)});e.receiver&&c.set("receiver",e.receiver),e.referrer&&c.set("referrer",e.referrer),e.disableEstimate!=null&&c.set("disableEstimate",String(!!e.disableEstimate)),e.allowPartialFill!=null&&c.set("allowPartialFill",String(!!e.allowPartialFill)),e.includeProtocols&&c.set("includeProtocols",String(e.includeProtocols)),e.excludeProtocols&&c.set("excludeProtocols",String(e.excludeProtocols));let l=await y(`${wa(t)}/${n}/swap?${c}`,{headers:xa(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??25e3}),u=l?.tx;if(!u?.to||!u?.data)throw new Error("1inch: swap returned no executable tx");if(u.from&&String(u.from).toLowerCase()!==String(s).toLowerCase())throw new Error("1inch: transaction sender mismatch");let d=l?.dstAmount||l?.toTokenAmount||l?.buyAmount;if(!d)throw new Error("1inch: swap response missing dstAmount");let p=V(l,{chainId:n,venue:u.to,amountOut:d,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps}),m=null;if(!Qk(r)){let f=l?.spender||l?.approvalAddress||(await Sa({chainId:n},t))?.address;if(!f)throw new Error("1inch: ERC-20 route missing approval spender");m={token:r,spender:f,amount:String(i)}}return O({provider:"oneinch",calldataReady:!0,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:n,quote:p,autoSlippage:p.autoSlippage,requiresApproval:m,transaction:{chainId:n,from:u.from||s,to:u.to,data:u.data,value:u.value??"0x0",...u.gas!=null?{gasLimit:u.gas}:{},slippageGuard:J(p.autoSlippage,{chainId:n,venue:u.to,data:u.data})}},{provider:"oneinch",kind:"oneinch-tx"})}var Zk=process.env.HL_WS_URL||"wss://api.hyperliquid.xyz/ws";async function hr(e,t={}){if(!e?.type)throw new Error("hlWsSnapshot requires subscription.type");let n=t.timeoutMs??8e3,r=t.maxMessages??1,o=t.WebSocket||globalThis.WebSocket;if(!o)throw new Error("WebSocket not available in this runtime");let i=t.url||Zk,s=Date.now();return new Promise((a,c)=>{let l=!1,u=[],d=0,p=new o(i),m=setTimeout(()=>{f(),l||(l=!0,u.length?a({ok:!0,partial:!0,ms:Date.now()-s,messages:u}):c(new Error(`hl ws timeout after ${n}ms`)))},n);function f(){clearTimeout(m);try{p.close()}catch{}}p.addEventListener("open",()=>{p.send(JSON.stringify({method:"subscribe",subscription:e}))}),p.addEventListener("message",h=>{let g;try{g=JSON.parse(typeof h.data=="string"?h.data:String(h.data))}catch{g={raw:String(h.data).slice(0,200)}}u.push(g),g.channel&&g.channel!=="subscriptionResponse"?d+=1:g.data&&g.channel==="subscriptionResponse"||g.channel||(d+=1),d>=r&&(f(),l||(l=!0,a({ok:!0,ms:Date.now()-s,subscription:e,messages:u,last:u[u.length-1]})))}),p.addEventListener("error",()=>{f(),l||(l=!0,c(new Error("hl ws error")))})})}async function Mp(e={}){try{let t=await hr({type:"allMids"},{...e,maxMessages:1}),n=t.last||{},r=n.data?.mids||n.data||{},o=typeof r=="object"?Object.keys(r).length:0;return{ok:!0,ms:t.ms,midCount:o,channel:n.channel||null}}catch(t){return{ok:!1,error:String(t.message||t).slice(0,160)}}}async function Up(e={}){let t=await hr({type:"allMids"},e),n=t.last||{};return{ms:t.ms,mids:n.data?.mids||n.data||{},channel:n.channel}}async function Bp(e,t={}){if(!e)throw new Error("coin required");let n=await hr({type:"l2Book",coin:String(e)},t);return{ms:n.ms,book:n.last?.data||n.last,channel:n.last?.channel}}var tE=process.env.POLY_WS_URL||"wss://ws-subscriptions-clob.polymarket.com/ws/market";async function qo(e=[],t={}){let n=Array.isArray(e)?e.map(String):[String(e)];if(!n.length||!n[0])throw new Error("polyWsSnapshot requires assetIds");let r=t.timeoutMs??8e3,o=t.maxMessages??1,i=t.WebSocket||globalThis.WebSocket;if(!i)throw new Error("WebSocket not available");let s=t.url||tE,a=Date.now();return new Promise((c,l)=>{let u=!1,d=[],p=0,m=new i(s),f=setTimeout(()=>{h(),u||(u=!0,d.length?c({ok:!0,partial:!0,ms:Date.now()-a,messages:d}):l(new Error(`poly ws timeout after ${r}ms`)))},r);function h(){clearTimeout(f);try{m.close()}catch{}}m.addEventListener("open",()=>{m.send(JSON.stringify({assets_ids:n,type:"market"}))}),m.addEventListener("message",g=>{let b;try{b=JSON.parse(typeof g.data=="string"?g.data:String(g.data))}catch{b={raw:String(g.data).slice(0,300)}}d.push(b),p+=1,p>=o&&(h(),u||(u=!0,c({ok:!0,ms:Date.now()-a,assetIds:n,messages:d,last:d[d.length-1]})))}),m.addEventListener("error",()=>{h(),u||(u=!0,l(new Error("poly ws error")))})})}async function Dp(e={}){let t=e.assetId||"98022490269692409998126496127597032490334070080325855126491859374983463996227";try{let n=await qo([t],{...e,maxMessages:1});return{ok:!0,ms:n.ms,got:!!n.last,partial:n.partial||!1}}catch(n){return{ok:!1,error:String(n.message||n).slice(0,160)}}}async function Fp(e,t={}){if(!e)throw new Error("assetId required");let n=await qo([e],t);return{ms:n.ms,assetId:String(e),data:n.last,messages:n.messages}}N();import{readFileSync as rE,existsSync as oE}from"node:fs";import{getAddress as iE}from"ethers";W();var sE="https://api.opensea.io/api/v2",aE=Object.freeze(["blast","base","ethereum","zora","arbitrum","sei","avalanche","polygon","optimism","ape_chain","flow","b3","soneium","ronin","bera_chain","solana","shape","unichain","gunzilla","abstract","animechain","hyperevm","somnia","monad","hyperliquid","megaeth","ink","robinhood","stablechain"]),cE=new Set(aE),Hp=new Set(["solana","flow"]),lE="0x0000000000000000000000000000000000000000";function uE(){let e=process.env.OPENSEA_ENV_FILE||`${process.env.HOME||""}/.config/locals-only/opensea.env`;if(!oE(e))return"";try{for(let t of rE(e,"utf8").split(`
|
|
5
|
-
`)){let n=t.match(/^\s*OPENSEA_API_KEY\s*=\s*(.+)\s*$/);if(n)return n[1].replace(/^["']|["']$/g,"").trim()}}catch{}return""}function un(e={}){return e.apiKey?e.apiKey:e.allowAmbientCredentials===!1||e.allowDiskCredentials===!1?e.env?.OPENSEA_API_KEY||e.env?.OPEN_SEA_API_KEY||"":e.env?.OPENSEA_API_KEY||process.env.OPENSEA_API_KEY||process.env.OPEN_SEA_API_KEY||uE()}function jp(e={}){return Ne({provider:"opensea",defaultUrl:sE,hosts:["api.opensea.io","testnets-api.opensea.io"],url:e.baseUrl||process.env.OPENSEA_API_URL})}function Ho(e={}){return jp(e).baseUrl}function jo(e={}){return Ee({accept:"application/json"},{"x-api-key":un(e)},jp(e).trusted)}function Vp(e){let t=String(e||"ethereum").trim().toLowerCase();if(!cE.has(t))throw new Error(`opensea: unsupported account chain ${t}`);return t}function ln(e,t="address"){try{return iE(String(e||"").trim().toLowerCase())}catch{throw new Error(`opensea: invalid ${t}`)}}function zp(e,t=null){let n=String(e||"").trim();if(!n)throw new Error("opensea: account address required");if(t&&!Hp.has(t)||!t&&/^0x[0-9a-fA-F]{40}$/.test(n))return ln(n,"account address");if(!/^[1-9A-HJ-NP-Za-km-z]{32,64}$/.test(n))throw new Error("opensea: invalid account address");return n}function dE(e,t){let n=String(e??"").trim();if(!/^(?:0|[1-9]\d*)(?:\.\d+)?$/.test(n)||Number(n)<=0)throw new Error(`opensea: ${t} must be a positive plain decimal`);return n}function pE(e,t){let n=Number(e);if(!Number.isSafeInteger(n)||n<=0)throw new Error(`opensea: ${t} must be a positive integer`);return n}function qp(e,t){let n=String(e||"").trim(),r=Date.parse(n);if(!n||!Number.isFinite(r))throw new Error(`opensea: ${t} must be an ISO 8601 timestamp`);return{text:new Date(r).toISOString(),ms:r}}function mE(e={},t,n){return{chain:t,owner:n,contract:e.contract||null,tokenId:e.identifier==null?null:String(e.identifier),tokenStandard:e.token_standard||null,collection:e.collection||null,name:e.name||null,description:e.description||null,imageUrl:e.display_image_url||e.image_url||e.original_image_url||null,originalImageUrl:e.original_image_url||e.image_url||null,animationUrl:e.display_animation_url||e.original_animation_url||null,metadataUrl:e.metadata_url||null,marketplaceUrl:e.opensea_url||null,estimatedValueUsd:e.estimated_value_usd!=null&&Number.isFinite(Number(e.estimated_value_usd))?Number(e.estimated_value_usd):null,spam:e.is_disabled===!0,disabled:e.is_disabled===!0,nsfw:e.is_nsfw===!0,traits:Array.isArray(e.traits)?e.traits:[],updatedAt:e.updated_at||null,acquisitionCost:null,itemPnl:{status:"unavailable",reason:"OpenSea account inventory does not expose trustworthy per-item acquisition cost"}}}async function Wp(e={}){if(!un(e))return{ok:!1,configured:!1,error:"OPENSEA_API_KEY not set"};try{let t=await Vo("boredapeyachtclub",e);return{ok:!0,configured:!0,name:t.name||t.collection}}catch(t){return{ok:!1,configured:!0,error:String(t.message||t).slice(0,160)}}}async function Vo(e,t={}){if(!e)throw new Error("collection slug required");if(!un(t))throw new Error("OPENSEA_API_KEY required");return y(`${Ho(t)}/collections/${encodeURIComponent(e)}`,{headers:jo(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function Gp(e,t={}){let n=await Vo(e,t),r=n.stats||n.total||{},o=n.floor_price??n.floorPrice??r.floor_price??r.floorPrice??null;return{slug:n.collection||e,name:n.name||null,floor:o,totalSupply:n.total_supply??r.total_supply??null,numOwners:n.num_owners??r.num_owners??null,raw:{contracts:n.contracts,fees:n.fees,category:n.category}}}async function gr(e={},t={}){if(!un(t))throw new Error("OPENSEA_API_KEY required");let n=Vp(e.chain),r=zp(e.address||e.owner,n),o=Math.min(Math.max(Number(e.pageSize??e.limit??200)||200,1),200),i=Math.min(Math.max(Number(e.maxPages??5)||5,1),25),s=[],a=e.next?String(e.next):null,c=0;do{let l=new URL(`${Ho(t)}/chain/${encodeURIComponent(n)}/account/${encodeURIComponent(r)}/nfts`);l.searchParams.set("limit",String(o)),e.collection&&l.searchParams.set("collection",String(e.collection)),a&&l.searchParams.set("next",a);let u=await y(l.toString(),{headers:jo(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4});for(let d of Array.isArray(u?.nfts)?u.nfts:[])s.push(mE(d,n,r));a=u?.next?String(u.next):null,c+=1}while(a&&c<i);return{provider:"opensea-nft",source:"opensea-account-inventory",chain:n,owner:r,count:s.length,pages:c,complete:!a,next:a,nfts:s,exec:!1,readOnly:!0}}async function zo(e={},t={}){if(!un(t))throw new Error("OPENSEA_API_KEY required");let n=zp(e.address||e.owner),r=await y(`${Ho(t)}/account/${encodeURIComponent(n)}/pnl`,{headers:jo(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4});return{provider:"opensea-nft",source:"opensea-indexed-account-pnl",address:n,scope:"OpenSea-indexed account trading PnL across supported currencies, not per-item NFT cost basis",methodology:"provider-indexed",realizedPnlUsd:r?.realized_pnl_usd??null,unrealizedPnlUsd:r?.unrealized_pnl_usd??null,totalPnlUsd:r?.total_pnl_usd??null,netInvestedUsd:r?.net_invested_usd??null,currentValueUsd:r?.current_value_usd??null,returnPercentage:r?.return_percentage??null,itemLevelPnlAvailable:!1,raw:r,exec:!1,readOnly:!0}}function fE(e={}){let t=Vp(e.chain);if(Hp.has(t))throw new Error("opensea: listing actions currently require an EVM NFT chain");let n=e.startTime||e.start_time?qp(e.startTime||e.start_time,"startTime"):{text:new Date().toISOString(),ms:Date.now()},r=qp(e.endTime||e.end_time,"endTime");if(r.ms<=n.ms)throw new Error("opensea: endTime must be after startTime");let o=String(e.tokenId??e.token_id??"").trim();if(!/^\d+$/.test(o))throw new Error("opensea: tokenId must be an unsigned integer string");return{chain:t,contract:ln(e.contract,"NFT contract"),token_id:o,quantity:pE(e.quantity??1,"quantity"),price:{amount:dE(e.price?.amount??e.amount??e.priceAmount,"price amount"),currency:ln(e.price?.currency??e.currency??lE,"price currency")},start_time:n.text,end_time:r.text}}function hE(e=[]){return e.some(t=>/approv|setapprovalforall/i.test(JSON.stringify(t)))}async function Wo(e={},t={}){if(!un(t))throw new Error("OPENSEA_API_KEY required");if(e.userConfirmed!==!0)throw new Error("opensea: userConfirmed=true required after NFT, marketplace, price, currency, and expiry review");let n=ln(e.seller||e.address||e.owner,"seller"),r=Array.isArray(e.items)&&e.items.length?e.items:[e];if(r.length>50)throw new Error("opensea: at most 50 listing items per preparation");let o=r.map(fE);if(new Set(o.map(u=>u.chain)).size!==1)throw new Error("opensea: all prepared listing items must be on one chain");let s=e.useCreatorFee!==!1,a={address:n,items:o,use_creator_fee:s};e.taker&&(a.taker=ln(e.taker,"taker"));let c=await y(`${Ho(t)}/listings/actions`,{method:"POST",headers:jo(t),body:a,fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??25e3,retries:0,dedupe:!1}),l=Array.isArray(c?.steps)?c.steps:[];if(!l.length)throw new Error("opensea: listing action response contained no wallet steps");return O({provider:"opensea-nft",marketplace:"opensea",chain:o[0].chain,kind:"nft-list-actions",prepareReady:!0,executionReady:!1,signingReady:!1,broadcastReady:!1,requiresUserSignature:!0,requiresSeparateApproval:hE(l),seller:n,items:o,useCreatorFee:s,taker:a.taker||null,feeDisclosure:s?"Creator fees requested. Inspect the returned Seaport consideration recipients and wallet simulation before signing.":"Creator fees disabled by explicit request. Marketplace protocol fees may still apply and must be inspected before signing.",steps:l,note:"Execute approvals separately, then sign the Seaport order in the user's wallet. Oracle does not submit or broadcast the listing."})}var Kp=999;async function Yp(e={}){let t={chainId:Kp,rpc:null,dex:null};try{t.rpc=await Qn(Kp,e)}catch(n){t.rpc={ok:!1,error:String(n.message||n).slice(0,120)}}try{let n=await Jn("HYPE",e),r=(n.pairs||[]).filter(o=>/hyper|hl|hyperevm/i.test(String(o.chainId||o.chain||"")));t.dex={ok:!0,hypePairs:r.length||(n.pairs||[]).length,sample:(r[0]||n.pairs?.[0])?.pairAddress||null}}catch(n){t.dex={ok:!1,error:String(n.message||n).slice(0,120)}}return{ok:!!(t.rpc?.ok||t.dex?.ok),...t}}async function Xp(e="HYPE",t={}){let r=(await Jn(e,t)).pairs||[],o=r.filter(i=>/hyper|hl|hyperevm/i.test(String(i.chainId||"")));return{query:e,hyperPairs:o,allPairs:r.slice(0,20),count:o.length||r.length}}async function Qp(e,t={}){return Nt(e,t)}N();W();var bE="https://api-mainnet.magiceden.dev/v2",yr=1e9;function Jp(e={}){return Ne({provider:"magiceden",defaultUrl:bE,hosts:["api-mainnet.magiceden.dev","api-devnet.magiceden.dev"],url:e.baseUrl||process.env.MAGICEDEN_API_URL})}function pn(e={}){return Jp(e).baseUrl}function $t(e={}){return e.apiKey||process.env.MAGICEDEN_API_KEY||""}function mn(e={}){let t=$t(e);return Ee({accept:"application/json"},{Authorization:t?`Bearer ${t}`:""},Jp(e).trusted)}function ka(e){let t=String(e||"").trim();if(!/^[a-z0-9_]{1,64}$/i.test(t))throw new Error("magiceden: symbol must be a collection slug");return t}function dn(e,t){if(typeof e=="number"){if(!Number.isFinite(e)||e<=0)throw new Error(`magiceden: ${t} must be a positive number`);return e}let n=String(e??"").trim();if(!/^\d+(\.\d+)?$/.test(n))throw new Error(`magiceden: ${t} must be a plain decimal number (no hex, exponent, or sign)`);let r=Number(n);if(!Number.isFinite(r)||r<=0)throw new Error(`magiceden: ${t} must be a positive number`);return r}function wE(e){let t=[e?.price,e?.mintPrice,e?.priceSol,e?.v0?.price,e?.launchStageInfo?.price,e?.stage?.price];for(let n of t){if(n==null)continue;let r=Number(n);if(Number.isFinite(r)&&r>=0)return r}return e?.isFree===!0?0:null}function xE(e){return Math.round(dn(e,"priceSol")*yr)}function SE(e){if(e==null||e==="")throw new Error("magiceden: listing expiry is required and must be in the future");let t=Number(e);if(!Number.isSafeInteger(t)||t<=0)throw new Error("magiceden: expiry must be a future Unix timestamp in seconds");if(t<=Math.floor(Date.now()/1e3))throw new Error("magiceden: expiry must be in the future");return t}function kE({tokenMint:e,priceSol:t,expiry:n}){return`list ${e} on magiceden-sol for ${t} SOL until ${n}`}function EE(e,t){if(e.userConfirmed!==!0)throw new Error("magiceden: listing requires userConfirmed=true after reviewing tokenMint, priceSol, and expiry");let n=kE(t);if(String(e.confirmation||e.confirmationPhrase||"").trim()!==n)throw new Error(`magiceden: confirmation must equal ${JSON.stringify(n)}`);return n}async function Zp(e={}){try{let t=await Ea({symbol:"mad_lads"},e);return{ok:!0,provider:"magiceden-sol",keyed:!!$t(e),readTier:"keyless",prepareTier:$t(e)?"keyed":"requires MAGICEDEN_API_KEY",floorPriceSol:t.floorPriceSol,exec:!1}}catch(t){return{ok:!1,provider:"magiceden-sol",keyed:!!$t(e),error:String(t?.message||t).slice(0,160),exec:!1}}}async function Ea(e={},t={}){let n=ka(e.symbol||e.collection),r=await y(`${pn(t)}/collections/${encodeURIComponent(n)}/stats`,{headers:mn(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),o=Number(r?.floorPrice??0);return{provider:"magiceden-sol",chain:"solana-mainnet-beta",symbol:n,floorPriceLamports:o||null,floorPriceSol:o?o/yr:null,listedCount:r?.listedCount??null,volume24hrSol:r?.volume24hr!=null?Number(r.volume24hr)/yr:null,avgPrice24hrSol:r?.avgPrice24hr!=null?Number(r.avgPrice24hr)/yr:null,exec:!1,raw:r}}function em(e={}){let t=Number(e.price??0);return{tokenMint:e.tokenMint??null,tokenATA:e.tokenAddress??null,seller:e.seller??null,sellerReferral:e.sellerReferral??null,auctionHouse:e.auctionHouse??null,pdaAddress:e.pdaAddress??null,priceSol:t||null,priceLamports:t?Math.round(t*yr):null,tokenSize:e.tokenSize??1}}async function tm(e={},t={}){let n=ka(e.symbol||e.collection),r=Math.min(Math.max(Number(e.limit??20)||20,1),100),o=Math.max(Number(e.offset??0)||0,0),i=new URL(`${pn(t)}/collections/${encodeURIComponent(n)}/listings`);i.searchParams.set("offset",String(o)),i.searchParams.set("limit",String(r)),e.sort&&i.searchParams.set("sort",String(e.sort));let s=await y(i.toString(),{headers:mn(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),a=(Array.isArray(s)?s:[]).map(em);return{provider:"magiceden-sol",chain:"solana-mainnet-beta",symbol:n,count:a.length,listings:a,exec:!1}}async function nm(e={},t={}){let n=K(e.tokenMint||e.mint,"tokenMint"),r=await y(`${pn(t)}/tokens/${encodeURIComponent(n)}/listings`,{headers:mn(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),o=(Array.isArray(r)?r:[]).map(em);return{provider:"magiceden-sol",chain:"solana-mainnet-beta",tokenMint:n,listings:o,exec:!1}}async function rm(e={},t={}){if(!$t(t))throw new Error("magiceden: MAGICEDEN_API_KEY required to build a buy instruction");let n=K(e.buyer||e.userPublicKey,"buyer"),r=K(e.seller,"seller"),o=K(e.tokenMint,"tokenMint"),i=K(e.tokenATA||e.tokenAddress,"tokenATA"),s=K(e.auctionHouse,"auctionHouse"),a=dn(e.priceSol??e.price,"priceSol"),c=e.maxPriceSol==null?a:dn(e.maxPriceSol,"maxPriceSol");if(a>c)throw new Error(`magiceden: listing price ${a} SOL exceeds maxPriceSol cap ${c} SOL`);let l=new URL(`${pn(t)}/instructions/buy_now`);l.searchParams.set("buyer",n),l.searchParams.set("seller",r),l.searchParams.set("auctionHouseAddress",s),l.searchParams.set("tokenMint",o),l.searchParams.set("tokenATA",i),l.searchParams.set("price",String(a)),e.sellerReferral&&l.searchParams.set("sellerReferral",String(e.sellerReferral)),e.buyerReferral&&l.searchParams.set("buyerReferral",String(e.buyerReferral));let u=await y(l.toString(),{headers:mn(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3});Je("magiceden",u);let d=u?.v0?.tx?.data??u?.tx?.data??null;if(!Array.isArray(d))throw u?.txSigned?new Error("magiceden: refused a pre-signed transaction payload from the API"):new Error("magiceden: buy_now returned no unsigned transaction payload");let p=Buffer.from(d).toString("base64");return O({provider:"magiceden-sol",chain:"solana-mainnet-beta",kind:"nft-buy",prepareReady:!0,executionReady:!1,signingReady:!1,broadcastReady:!1,requiresUserSignature:!0,buyer:n,seller:r,tokenMint:o,priceSol:a,maxPriceSol:c,lamports:xE(a),transaction:p,transactionEncoding:"base64",raw:u})}async function Go(e={},t={}){if(!$t(t))throw new Error("magiceden: MAGICEDEN_API_KEY required to build a list instruction");let n=K(e.seller||e.userPublicKey,"seller"),r=K(e.tokenMint,"tokenMint"),o=K(e.tokenATA||e.tokenAddress,"tokenATA"),i=K(e.auctionHouse,"auctionHouse"),s=dn(e.priceSol??e.price,"priceSol"),a=SE(e.expiry),c=EE(e,{tokenMint:r,priceSol:s,expiry:a}),l=new URL(`${pn(t)}/instructions/sell`);l.searchParams.set("seller",n),l.searchParams.set("auctionHouseAddress",i),l.searchParams.set("tokenMint",r),l.searchParams.set("tokenAccount",o),l.searchParams.set("price",String(s)),e.sellerReferral&&l.searchParams.set("sellerReferral",K(e.sellerReferral,"sellerReferral")),a!=null&&l.searchParams.set("expiry",String(a));let u=await y(l.toString(),{headers:mn(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3});Je("magiceden",u);let d=u?.v0?.tx?.data??u?.tx?.data??null;if(!Array.isArray(d))throw u?.txSigned?new Error("magiceden: refused a pre-signed transaction payload from the API"):new Error("magiceden: sell returned no unsigned transaction payload");let p=Buffer.from(d).toString("base64");return O({provider:"magiceden-sol",chain:"solana-mainnet-beta",kind:"nft-list",prepareReady:!0,executionReady:!1,signingReady:!1,broadcastReady:!1,requiresUserSignature:!0,seller:n,tokenMint:r,priceSol:s,expiry:a,confirmation:c,transaction:p,transactionEncoding:"base64",raw:u})}async function om(e={},t={}){if(!$t(t))throw new Error("magiceden: MAGICEDEN_API_KEY required to build a mint instruction");let n=K(e.buyer||e.userPublicKey,"buyer"),r=ka(e.symbol||e.collection);if(e.maxPriceSol==null)throw new Error("magiceden: maxPriceSol is required to prepare a mint \u2014 an uncapped mint has no spend ceiling");let o=dn(e.maxPriceSol,"maxPriceSol"),i=e.nftAmount==null?1:dn(e.nftAmount,"nftAmount");if(!Number.isInteger(i))throw new Error("magiceden: nftAmount must be a whole number");let s=new URL(`${pn(t)}/instructions/mint`);s.searchParams.set("symbol",r),s.searchParams.set("wallet",n),s.searchParams.set("nftAmount",String(i));let a=await y(s.toString(),{headers:mn(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),c=wE(a);if(c==null)throw new Error("magiceden: mint price not present in the API response \u2014 refusing to prepare an unverifiable spend");let l=c*i;if(l>o)throw new Error(`magiceden: mint cost ${l} SOL exceeds maxPriceSol cap ${o} SOL`);Je("magiceden",a);let u=a?.v0?.tx?.data??a?.tx?.data??null;if(!Array.isArray(u))throw a?.txSigned?new Error("magiceden: refused a pre-signed transaction payload from the API"):new Error("magiceden: mint returned no unsigned transaction payload");let d=Buffer.from(u).toString("base64");return O({provider:"magiceden-sol",chain:"solana-mainnet-beta",kind:"nft-mint",prepareReady:!0,executionReady:!1,signingReady:!1,broadcastReady:!1,requiresUserSignature:!0,buyer:n,symbol:r,nftAmount:i,priceSol:c,totalSol:l,maxPriceSol:o,transaction:d,transactionEncoding:"base64",raw:a})}W();N();var fn=8,va=10n**BigInt(fn),AE="0xa4b1",im=7,Aa=1,IE=2n**64n-1n;function _E(e={}){return e.exchangeUrl?e.exchangeUrl:process.env.HL_EXCHANGE_URL?process.env.HL_EXCHANGE_URL:e.testnet||process.env.HL_TESTNET==="1"?"https://api.hyperliquid-testnet.xyz/exchange":"https://api.hyperliquid.xyz/exchange"}function wr(e={}){return e.testnet||process.env.HL_TESTNET==="1"?"Testnet":"Mainnet"}function gn(e,t){let n=String(e||"").trim();if(!/^0x[0-9a-fA-F]{40}$/.test(n))throw new Error(`hl-staking: ${t} must be a 0x EVM address`);return n.toLowerCase()}function br(e,t="amount"){let n=String(e??"").trim();if(!/^\d+(\.\d+)?$/.test(n))throw new Error(`hl-staking: ${t} must be a positive decimal HYPE amount`);let[r,o=""]=n.split(".");if(o.length>fn)throw new Error(`hl-staking: ${t} has more than ${fn} decimals`);let i=BigInt(r)*va+BigInt((o+"0".repeat(fn)).slice(0,fn)||"0");if(i<=0n)throw new Error(`hl-staking: ${t} must be greater than zero`);if(i>IE)throw new Error(`hl-staking: ${t} exceeds the uint64 range the signed action encodes`);return i.toString()}function hn(e){let t=BigInt(e);return t<=BigInt(Number.MAX_SAFE_INTEGER)?Number(t):e}function Ze(e){let t=BigInt(String(e||"0")),n=t/va,r=(t%va).toString().padStart(fn,"0").replace(/0+$/,"");return r?`${n}.${r}`:String(n)}async function sm(e={}){try{let t=await Ia(e);return{ok:t.count>0,provider:"hl-staking",chain:wr(e),validators:t.count,exec:!1}}catch(t){return{ok:!1,provider:"hl-staking",error:String(t?.message||t).slice(0,160),exec:!1}}}async function Ia(e={}){let t=await G({type:"validatorSummaries"},e),r=(Array.isArray(t)?t:[]).map(o=>({validator:o.validator??null,name:o.name??null,isActive:o.isActive??null,isJailed:o.isJailed??null,commission:o.commission??null,stake:o.stake??null,nRecentBlocks:o.nRecentBlocks??null}));return{provider:"hl-staking",count:r.length,validators:r,exec:!1,raw:t}}async function _a(e={},t={}){let n=gn(e.user||e.address,"user"),r=await G({type:"delegatorSummary",user:n},t);return{provider:"hl-staking",user:n,delegatedWei:r?.delegated??null,undelegatedWei:r?.undelegated??null,totalPendingWithdrawalWei:r?.totalPendingWithdrawal??null,nPendingWithdrawals:r?.nPendingWithdrawals??null,delegatedHype:r?.delegated!=null?String(r.delegated):null,undelegatedHype:r?.undelegated!=null?String(r.undelegated):null,exec:!1,raw:r}}async function Pa(e={},t={}){let n=gn(e.user||e.address,"user"),r=await G({type:"delegations",user:n},t),o=Array.isArray(r)?r:[];return{provider:"hl-staking",user:n,count:o.length,delegations:o.map(i=>({validator:i.validator??null,amount:i.amount??null,lockedUntilTimestamp:i.lockedUntilTimestamp??null})),exec:!1,raw:r}}async function am(e={},t={}){let n=gn(e.user||e.address,"user"),r=await G({type:"delegatorRewards",user:n},t);return{provider:"hl-staking",user:n,rewards:Array.isArray(r)?r:[],exec:!1}}async function cm(e={},t={}){let n=gn(e.user||e.address,"user"),r=await G({type:"delegatorHistory",user:n},t);return{provider:"hl-staking",user:n,history:Array.isArray(r)?r:[],exec:!1}}function Ca(e={}){let t=e.nonce==null?Date.now():Number(e.nonce);if(!Number.isInteger(t)||t<=0)throw new Error("hl-staking: nonce must be a positive integer ms timestamp");return t}function Ko(e={}){return String(e.signatureChainId||process.env.HL_SIGNATURE_CHAIN_ID||AE)}function PE(e={}){return{name:"HyperliquidSignTransaction",version:"1",chainId:Number(BigInt(Ko(e))),verifyingContract:"0x0000000000000000000000000000000000000000"}}function Ta({kind:e,action:t,types:n,primaryType:r,message:o,opts:i,notes:s,caps:a}){return O({provider:"hl-staking",venue:"hypercore",chain:wr(i),kind:e,prepareReady:!0,executionReady:!1,signingReady:!1,broadcastReady:!1,requiresUserSignature:!0,signWith:"user wallet (EIP-712 typed data)",submitTo:_E(i),submitShape:{action:t,nonce:t.nonce,signature:"<user 65-byte signature>"},action:t,typedData:{domain:PE(i),types:n,primaryType:r,message:o},caps:a||null,notes:s,exec:!1},{provider:"hl-staking",kind:e})}function lm(e={},t={}){let n=br(e.amountHype??e.amount,"amountHype"),r=e.maxHype==null?null:br(e.maxHype,"maxHype");if(r&&BigInt(n)>BigInt(r))throw new Error(`hl-staking: amount ${Ze(n)} HYPE exceeds maxHype cap ${Ze(r)} HYPE`);let o=Ca(e),i=wr(t),s={type:"cDeposit",hyperliquidChain:i,signatureChainId:Ko(t),wei:hn(n),nonce:o};return Ta({kind:"hype-stake-deposit",action:s,primaryType:"HyperliquidTransaction:CDeposit",types:{"HyperliquidTransaction:CDeposit":[{name:"hyperliquidChain",type:"string"},{name:"wei",type:"uint64"},{name:"nonce",type:"uint64"}]},message:{hyperliquidChain:i,wei:hn(n),nonce:o},opts:t,caps:{amountHype:Ze(n),maxHype:r?Ze(r):null},notes:["Moves HYPE from your Hyperliquid spot balance into your staking balance.","Staking balance still earns nothing until it is delegated to a validator.","Oracle prepared this. Your wallet signs it. Nothing was submitted."]})}function um(e={},t={}){let n=br(e.amountHype??e.amount,"amountHype"),r=Ca(e),o=wr(t),i={type:"cWithdraw",hyperliquidChain:o,signatureChainId:Ko(t),wei:hn(n),nonce:r};return Ta({kind:"hype-stake-withdraw",action:i,primaryType:"HyperliquidTransaction:CWithdraw",types:{"HyperliquidTransaction:CWithdraw":[{name:"hyperliquidChain",type:"string"},{name:"wei",type:"uint64"},{name:"nonce",type:"uint64"}]},message:{hyperliquidChain:o,wei:hn(n),nonce:r},opts:t,caps:{amountHype:Ze(n)},notes:[`Starts the ${im} day unstaking queue back to spot. The HYPE is not liquid during the queue.`,"Undelegate from the validator first: only undelegated staking balance can be withdrawn.","Oracle prepared this. Your wallet signs it. Nothing was submitted."]})}function dm(e={},t={}){let n=gn(e.validator,"validator"),r=br(e.amountHype??e.amount,"amountHype"),o=!!(e.isUndelegate??e.undelegate??!1),i=e.maxHype==null?null:br(e.maxHype,"maxHype");if(!o&&i&&BigInt(r)>BigInt(i))throw new Error(`hl-staking: delegate amount ${Ze(r)} HYPE exceeds maxHype cap ${Ze(i)} HYPE`);let s=Ca(e),a=wr(t),c={type:"tokenDelegate",hyperliquidChain:a,signatureChainId:Ko(t),validator:n,wei:hn(r),isUndelegate:o,nonce:s};return Ta({kind:o?"hype-undelegate":"hype-delegate",action:c,primaryType:"HyperliquidTransaction:TokenDelegate",types:{"HyperliquidTransaction:TokenDelegate":[{name:"hyperliquidChain",type:"string"},{name:"validator",type:"address"},{name:"wei",type:"uint64"},{name:"isUndelegate",type:"bool"},{name:"nonce",type:"uint64"}]},message:{hyperliquidChain:a,validator:n,wei:hn(r),isUndelegate:o,nonce:s},opts:t,caps:{amountHype:Ze(r),maxHype:i?Ze(i):null,validator:n},notes:o?["Returns stake from the validator to your staking balance.",`Delegations carry a ${Aa} day validator lockup before they can be undelegated.`,"Oracle prepared this. Your wallet signs it. Nothing was submitted."]:["Delegates staking balance to the chosen validator so it starts earning.",`Once delegated, the stake is locked with that validator for ${Aa} day.`,"Check the validator's commission and jail status before delegating.","Oracle prepared this. Your wallet signs it. Nothing was submitted."]})}async function pm(e={},t={}){let n=gn(e.user||e.address,"user"),r=await _a({user:n},t),o=await Pa({user:n},t);return{provider:"hl-staking",user:n,stakingBalanceUndelegated:r.undelegatedWei,stakingBalanceDelegated:r.delegatedWei,pendingWithdrawals:r.nPendingWithdrawals,delegations:o.delegations,unstakingQueueDays:im,validatorLockupDays:Aa,exec:!1}}async function Na(e={}){let t=Date.now();try{let n=await Xe(e);return{provider:"hl-markets",ok:!0,venue:"hyperliquid",symbols:Object.keys(n||{}).length,latencyMs:Date.now()-t}}catch(n){return{provider:"hl-markets",ok:!1,error:String(n?.message||n),latencyMs:Date.now()-t}}}var TE=24*365,NE=8;function se(e){if(e==null)return null;let t=Number(e);return Number.isFinite(t)?t:null}function OE(e,t){return e==null||t==null||t===0?null:(e-t)/t*100}async function Yo(e={},t={}){let[n,r]=await Promise.all([nn(t),Xe(t).catch(()=>({}))]),o=n?.[0]?.universe??n?.universe??[],i=Array.isArray(n?.[1])?n[1]:[],a=o.map((c,l)=>{let u=i[l]||{},d=se(u.markPx),p=se(u.prevDayPx),m=se(u.openInterest),f=se(u.funding);return{coin:c.name,index:l,markPx:d,oraclePx:se(u.oraclePx),midPx:se(u.midPx)??se(r?.[c.name]),prevDayPx:p,change24hPct:OE(d,p),dayNtlVolumeUsd:se(u.dayNtlVlm),premium:se(u.premium),fundingRate:f,fundingRateAprPct:f==null?null:f*(TE/NE)*100,openInterestCoin:m,openInterestUsd:m==null||d==null?null:m*d,maxLeverage:c.maxLeverage??null,szDecimals:c.szDecimals??null,isDelisted:!!c.isDelisted}}).filter(c=>!c.isDelisted);return{provider:"hl-info",venue:"hyperliquid",kind:"market-datapoints",asOfMs:Date.now(),count:a.length,markets:a,totals:{openInterestUsd:a.reduce((c,l)=>c+(l.openInterestUsd||0),0),dayNtlVolumeUsd:a.reduce((c,l)=>c+(l.dayNtlVolumeUsd||0),0)}}}async function mm(e={},t={}){let n=Math.max(1,Math.min(Number(e.limit)||10,50)),{markets:r,asOfMs:o,totals:i}=await Yo(e,t),s=(a,c=-1)=>r.filter(l=>l[a]!=null).sort((l,u)=>(l[a]-u[a])*c).slice(0,n);return{provider:"hl-info",venue:"hyperliquid",kind:"leaderboards",asOfMs:o,totals:i,gainers:s("change24hPct"),losers:s("change24hPct",1),byVolume:s("dayNtlVolumeUsd"),byOpenInterest:s("openInterestUsd"),fundingHighest:s("fundingRateAprPct"),fundingLowest:s("fundingRateAprPct",1)}}async function fm(e={},t={}){let n=String(e.coin||e.symbol||"").trim().toUpperCase();if(!n)throw new Error("hl-markets: coin required");let r=String(e.interval||"1h"),o=Number(e.lookbackMs)||1440*60*1e3,i=Date.now(),s=i-o,[a,c,l]=await Promise.all([Yo({},t),rn({coin:n,interval:r,startTime:s,endTime:i},t).catch(()=>[]),mo(n,t).catch(()=>null)]),u=a.markets.find(h=>h.coin===n)||null;if(!u)throw new Error(`hl-markets: ${n} is not a listed perp`);let d=(Array.isArray(c)?c:[]).map(h=>({t:Number(h.t),open:se(h.o),high:se(h.h),low:se(h.l),close:se(h.c),volume:se(h.v)})),p=l?.levels??[],m=se(p?.[0]?.[0]?.px),f=se(p?.[1]?.[0]?.px);return{provider:"hl-info",venue:"hyperliquid",kind:"coin-datapoints",asOfMs:Date.now(),coin:n,market:u,book:{bestBid:m,bestAsk:f,spread:m==null||f==null?null:f-m,spreadBps:m==null||f==null||f===0?null:(f-m)/f*1e4},candles:{interval:r,count:d.length,series:d}}}async function hm(e={},t={}){let n=await yo(t),r=n?.tokens??[],o=n?.universe??[];return{provider:"hl-info",venue:"hyperliquid",kind:"spot-datapoints",asOfMs:Date.now(),tokenCount:r.length,pairCount:o.length,tokens:r.map(i=>({name:i.name,index:i.index,szDecimals:i.szDecimals??null,weiDecimals:i.weiDecimals??null,tokenId:i.tokenId??null,isCanonical:!!i.isCanonical})),pairs:o.map(i=>({name:i.name,index:i.index,tokens:i.tokens,isCanonical:!!i.isCanonical}))}}W();var wm=1e8,$E=1e5,xr={at:0,dexs:null},gm=new Map;async function ym(e={}){let t=Date.now();if(xr.dexs&&t-xr.at<6e4&&!e.fetchImpl)return xr.dexs;let n=await G({type:"perpDexs"},e);return xr={at:t,dexs:Array.isArray(n)?n:[]},xr.dexs}async function bm(e="",t={}){let n=e||"",r=Date.now(),o=gm.get(n);if(o&&r-o.at<3e4&&!t.fetchImpl)return o;let i=e?await G({type:"metaAndAssetCtxs",dex:e},t):await nn(t),s=i?.[0]?.universe??i?.universe??[],a=Array.isArray(i?.[1])?i[1]:[],c={at:r,universe:s,ctxs:a};return gm.set(n,c),c}function LE(e){let t=String(e||"").trim(),n;if(t.startsWith("#"))n=Number(t.slice(1));else if(/^\d+$/.test(t))n=Number(t);else return null;if(!Number.isInteger(n)||n<0)return null;let r=n%10;if(r!==0&&r!==1)return null;let o=Math.floor(n/10);return{encoding:n,outcome:o,side:r,coin:`#${n}`,assetId:wm+n}}function Xo(e,t){let n=Number(e),r=Number(t);if(!Number.isInteger(n)||n<0)throw new Error("hl-assets: outcome id must be a non-negative integer");if(r!==0&&r!==1)throw new Error("hl-assets: outcome side must be 0 or 1");let o=10*n+r;return{encoding:o,outcome:n,side:r,coin:`#${o}`,assetId:wm+o}}async function Oa(e={},t={}){if(e.outcome!=null||e.coin&&String(e.coin).startsWith("#")){let l=e.outcome!=null?Xo(e.outcome,e.side??e.outcomeSide??0):LE(e.coin);if(!l)throw new Error(`hl-assets: invalid outcome coin ${e.coin}`);let u=e.szDecimals!=null?Number(e.szDecimals):2;return{kind:"outcome",coin:l.coin,assetId:l.assetId,encoding:l.encoding,outcome:l.outcome,side:l.side,szDecimals:u,maxLeverage:1,dex:null,markPx:null}}let n=String(e.coin||e.symbol||e.name||"").trim();if(!n)throw new Error("hl-assets: coin required");if(n.includes(":")){let[l,...u]=n.split(":"),d=u.join(":");if(!l||!d)throw new Error(`hl-assets: bad builder coin ${n}`);let m=(await ym(t)).findIndex(w=>w&&w.name===l);if(m<1)throw new Error(`hl-assets: unknown builder dex "${l}"`);let{universe:f,ctxs:h}=await bm(l,t),g=f.findIndex(w=>w.name===n||w.name===`${l}:${d}`||w.name.endsWith(`:${d}`));if(g<0)throw new Error(`hl-assets: ${n} not in dex ${l} meta`);let b=f[g];if(b.isDelisted)throw new Error(`hl-assets: ${n} is delisted`);let k=$E+m*1e4+g,x=h[g]||{};return{kind:"hip3",coin:b.name||n,assetId:k,szDecimals:b.szDecimals??0,maxLeverage:b.maxLeverage??null,dex:l,dexIndex:m,indexInMeta:g,markPx:x.markPx??null}}let{universe:r,ctxs:o}=await bm("",t),i=n.toUpperCase(),s=r.findIndex(l=>l.name===i);if(s<0){if(t.allowBareBuilderLeaf===!0)try{let l=await ym(t);for(let u=1;u<l.length;u++){let d=l[u];if(!d?.name)continue;let p=`${d.name}:${i}`;try{return await Oa({coin:p},t)}catch{}}}catch{}throw new Error(`hl-perps: ${i} is not a listed perp`)}let a=r[s];if(a.isDelisted)throw new Error(`hl-assets: ${i} is delisted`);let c=o[s]||{};return{kind:"main",coin:a.name,assetId:s,szDecimals:a.szDecimals??0,maxLeverage:a.maxLeverage??null,dex:"",markPx:c.markPx??null}}function xm(e,t,n="amount"){let r=String(e??"").trim();if(!/^-?\d*(\.\d+)?$/.test(r)||r===""||r==="."||r==="-")throw new Error(`${n} must be a decimal number, got ${JSON.stringify(r)}`);let o=r.startsWith("-"),i=o?r.slice(1):r,[s="0",a=""]=i.split(".");if(a.length>t)throw new Error(`${n} has more than ${t} decimal places, which would lose precision`);let c=BigInt((s||"0")+a.padEnd(t,"0"));return o?-c:c}W();var ME=5,UE=6,Em="0x66eee";var Sm=10,Ra="ORACLE_HL_BUILDER_ADDRESS",km="ORACLE_HL_BUILDER_FEE_BPS",Qo=Object.freeze({perp:2,spot:1,hip3:1,hip4:1}),be=Object.freeze({LIMIT:"limit",MARKET:"market",STOP_MARKET:"stopMarket",STOP_LIMIT:"stopLimit",TAKE_PROFIT_MARKET:"takeProfitMarket",TAKE_PROFIT_LIMIT:"takeProfitLimit"}),Zo=Object.freeze({GTC:"Gtc",IOC:"Ioc",ALO:"Alo"}),Jo=Object.freeze({CROSS:"cross",ISOLATED:"isolated"});function BE(e="perp"){if(e==="perp"||e==="main")return Qo.perp;if(e==="spot")return Qo.spot;if(e==="hip3")return Qo.hip3;if(e==="outcome"||e==="hip4")return Qo.hip4;throw new Error(`hl-perps: unknown builder fee kind ${e}`)}function vm({env:e=process.env,isHolder:t=!1,kind:n="perp"}={}){if(t)return null;let r=String(e?.[Ra]||"").trim().toLowerCase();if(!r)return null;if(!/^0x[a-f0-9]{40}$/.test(r))throw new Error(`hl-perps: ${Ra} must be an EVM address`);let o=ca(e);if(!o||o!==r)return null;let i=e?.[km],s=BE(n),a=i==null?s:Number(i);if(!Number.isFinite(a)||a<=0||Math.abs(a*10-Math.round(a*10))>1e-9)throw new Error(`hl-perps: ${km} must be a positive number in 0.1 bps increments`);if(a>Sm)throw new Error(`hl-perps: builder fee ${a} bps exceeds the ${Sm} bps cap`);if(a>s)throw new Error(`hl-perps: builder fee ${a} bps exceeds the ${s} bps product tier for ${n}`);let c=Math.round(a*10),l=(c/1e3).toFixed(3).replace(/0+$/,"").replace(/\.$/,"");return{wire:{b:r,f:c},disclosure:{address:r,bps:a,percent:`${l}%`}}}async function DE(e,t={},n={}){if(!e)return{approved:!1,approvedFeeBps:0,status:"not-configured"};let r=String(t.user||n.user||"").trim().toLowerCase();if(!/^0x[a-f0-9]{40}$/.test(r))return{approved:!1,approvedFeeBps:0,status:"wallet-required"};try{let o=Number(await G({type:"maxBuilderFee",user:r,builder:e.disclosure.address},n));return!Number.isInteger(o)||o<0?{approved:!1,approvedFeeBps:0,status:"invalid-response"}:{approved:o>=e.wire.f,approvedFeeBps:o/10,status:o>=e.wire.f?"approved":"insufficient"}}catch{return{approved:!1,approvedFeeBps:0,status:"unavailable"}}}async function FE(e,t={},n={}){if(!e)return{exempt:!1,status:"not-configured"};let r=String(t.user||n.user||"").trim().toLowerCase();if(!/^0x[a-f0-9]{40}$/.test(r))return{exempt:!1,status:"wallet-required"};try{let o=n.holderBalance||Oo;return BigInt(await o(r))>0n?{exempt:!0,status:"holder"}:{exempt:!1,status:"non-holder"}}catch{return{exempt:!1,status:"unavailable"}}}function La(e,t,{roundDown:n=null}={}){let r=typeof e=="number"?e.toFixed(Math.min(20,t+8)):String(e).trim();if(!/^-?\d+(\.\d+)?$/.test(r))throw new Error(`hl-perps: "${e}" is not a decimal number`);let o=r.startsWith("-"),[i,s=""]=r.replace(/^-/,"").split(".");if(s.length<=t){let f=s.replace(/0+$/,"");return(o?"-":"")+(f?`${i}.${f}`:i)}let a=s.slice(0,t),c=Number(s[t]),l=BigInt(i+a),u=s.slice(t).replace(/0+$/,"")!=="";n===!0||(n===!1?u&&(l+=1n):c>=5&&(l+=1n));let d=l.toString().padStart(t+1,"0"),m=(t===0?d:`${d.slice(0,-t)}.${d.slice(-t)}`).replace(/(\.\d*?)0+$/,"$1").replace(/\.$/,"");return(o?"-":"")+m}function qE(e,t,n={}){let r=String(e);if(!r.includes("."))return r;let o=Number(r);if(!Number.isFinite(o)||o===0)return r;let i=Math.floor(Math.log10(Math.abs(o))),s=Math.max(0,t-1-i);return La(r,s,n)}function pt(e,t,n={}){let r=UE-Number(t??0);if(r<0)throw new Error("hl-perps: szDecimals out of range");return La(qE(e,ME,n),r,n)}function HE(e,t){let n=La(e,Number(t??0));if(BigInt(n.split(".")[0])<0n)throw new Error("hl-perps: size must be positive");if(Number(n)<=0)throw new Error("hl-perps: size rounds to zero at this asset's precision");return n}async function Lt(e={},t={}){let n=await Oa(e,t);return{coin:n.coin,assetId:n.assetId,szDecimals:n.szDecimals,maxLeverage:n.maxLeverage,markPx:n.markPx,kind:n.kind,dex:n.dex??null,outcome:n.outcome??null,side:n.side??null}}function $a(e,{tif:t=Zo.GTC,triggerPx:n,isMarket:r,szDecimals:o}={}){switch(e){case be.LIMIT:return{limit:{tif:t}};case be.MARKET:return{limit:{tif:Zo.IOC}};case be.STOP_MARKET:case be.TAKE_PROFIT_MARKET:return{trigger:{isMarket:!0,triggerPx:pt(n,o),tpsl:e===be.STOP_MARKET?"sl":"tp"}};case be.STOP_LIMIT:case be.TAKE_PROFIT_LIMIT:return{trigger:{isMarket:!1,triggerPx:pt(n,o),tpsl:e===be.STOP_LIMIT?"sl":"tp"}};default:throw new Error(`hl-perps: unknown order type ${e}`)}}function yn(e,t){return{action:e,nonce:t,signatureChainId:Em,submitTo:"https://api.hyperliquid.xyz/exchange",note:"Sign locally via @oracle-agent/operator or a wallet. Oracle does not submit."}}function bn(e){return O(e,{provider:e.provider||"hl-perps",kind:e.kind})}function Am(e={},t={}){let n=vm({env:t.env});if(!n)throw new Error(`hl-perps: ${Ra} is required`);let r=Number(e.nonce??t.nonce??Date.now());if(!Number.isSafeInteger(r)||r<=0)throw new Error("hl-perps: nonce must be a positive integer");let o={type:"approveBuilderFee",hyperliquidChain:t.testnet||process.env.HL_TESTNET==="1"?"Testnet":"Mainnet",signatureChainId:Em,maxFeeRate:n.disclosure.percent,builder:n.disclosure.address,nonce:r};return bn({provider:"hl-perps",venue:"hyperliquid",kind:"builder-fee-approval",builderFee:n.disclosure,...yn(o,r)})}async function Sr(e={},t={}){let n=await Lt(e,t),r=String(e.type||be.LIMIT),o=e.side?String(e.side).toLowerCase()==="buy":!!e.isBuy,i=!!e.reduceOnly,s=HE(e.size??e.sz,n.szDecimals),a;if(r===be.MARKET){let k=Number(n.markPx);if(!Number.isFinite(k)){let T=await Xe(t);k=Number(T?.[n.coin]??T?.[String(n.assetId)]??NaN)}if(!Number.isFinite(k))throw new Error("hl-perps: no mark price available for a market order");let x=Number(e.maxSlippageBps??50);if(!Number.isInteger(x)||x<0)throw new Error("hl-perps: maxSlippageBps must be a non-negative integer");if(x>100)throw new Error(`hl-perps: maxSlippageBps ${x} exceeds the hard 100 bps cap`);let w=o?k*(1+x/1e4):k*(1-x/1e4);a=pt(w,n.szDecimals,{roundDown:o});let v=Math.abs(Number(a)/k-1)*1e4;if(v>x+1e-9)throw new Error(`hl-perps: tick rounding makes the limit ${v.toFixed(2)} bps from mark, above the ${x} bps cap`)}else{if(e.price==null&&e.limitPx==null)throw new Error("hl-perps: a limit order requires an explicit price");a=pt(e.price??e.limitPx,n.szDecimals)}let c=$a(r,{tif:e.tif??(r===be.MARKET?Zo.IOC:Zo.GTC),triggerPx:e.triggerPx,szDecimals:n.szDecimals}),l={a:n.assetId,b:o,p:a,s,r:i,t:c};e.clientOrderId&&(l.c=String(e.clientOrderId));let u={type:"order",orders:[l],grouping:e.grouping||"na"},d=vm({env:t.env,kind:n.kind}),p=await FE(d,e,t),m=p.exempt?null:d,f=await DE(m,e,t),h=f.approved?m:null;h&&(u.builder=h.wire);let g=Number(e.nonce??Date.now()),b=Number(a)*Number(s);return bn({provider:"hl-perps",venue:"hyperliquid",kind:n.kind==="outcome"?"hip4-order":n.kind==="hip3"?"hip3-order":"perp-order",coin:n.coin,assetId:n.assetId,assetKind:n.kind,outcome:n.outcome??null,outcomeSide:n.side??null,dex:n.dex??null,side:o?"buy":"sell",orderType:r,price:a,size:s,reduceOnly:i,notionalUsd:Number.isFinite(b)?b:null,maxLeverage:n.maxLeverage,markPx:n.markPx,builderFee:h?.disclosure??null,holderExempt:p.exempt,holderVerificationStatus:p.status,builderApprovalRequired:m&&!h?{...d.disclosure,...f}:null,...yn(u,g)})}async function ei(e={},t={}){let n=await Lt(e,t),r=e.orderId??e.oid;if(r==null)throw new Error("hl-perps: orderId required");let o={type:"cancel",cancels:[{a:n.assetId,o:Number(r)}]};return bn({provider:"hl-perps",venue:"hyperliquid",kind:"perp-cancel",coin:n.coin,orderId:Number(r),...yn(o,Number(e.nonce??Date.now()))})}async function Im(e={},t={}){let n=await Lt(e,t),r=Number(e.leverage);if(!Number.isInteger(r)||r<1)throw new Error("hl-perps: leverage must be a positive integer");if(n.maxLeverage!=null&&r>n.maxLeverage)throw new Error(`hl-perps: ${n.coin} allows at most ${n.maxLeverage}x, requested ${r}x`);let o=String(e.marginMode||Jo.CROSS).toLowerCase();if(o!==Jo.CROSS&&o!==Jo.ISOLATED)throw new Error('hl-perps: marginMode must be "cross" or "isolated"');let i={type:"updateLeverage",asset:n.assetId,isCross:o===Jo.CROSS,leverage:r};return bn({provider:"hl-perps",venue:"hyperliquid",kind:"perp-leverage",coin:n.coin,leverage:r,marginMode:o,maxLeverage:n.maxLeverage,liquidationWarning:r>=20?`${r}x liquidates on roughly a ${(100/r).toFixed(2)}% adverse move before fees`:null,...yn(i,Number(e.nonce??Date.now()))})}async function _m(e={},t={}){let n=await Lt(e,t),r=e.usd??e.amountUsd;if(r==null)throw new Error("hl-perps: usd amount required");let o=String(r).trim();if(!/^-?\d+(\.\d+)?$/.test(o))throw new Error("hl-perps: usd must be a decimal number");let i=xm(o,6,"hl-perps: usd"),s={type:"updateIsolatedMargin",asset:n.assetId,isBuy:!0,ntli:i<=BigInt(Number.MAX_SAFE_INTEGER)?Number(i):i.toString()};return bn({provider:"hl-perps",venue:"hyperliquid",kind:"perp-isolated-margin",coin:n.coin,usd:o,...yn(s,Number(e.nonce??Date.now()))})}async function Pm(e={},t={}){let n=await Sr(e,t),r=await Lt(e,t),o=n.side==="buy",i=[n.action.orders[0]];if(e.takeProfitPx!=null&&i.push({a:r.assetId,b:!o,p:pt(e.takeProfitPx,r.szDecimals),s:n.size,r:!0,t:$a(be.TAKE_PROFIT_MARKET,{triggerPx:e.takeProfitPx,szDecimals:r.szDecimals})}),e.stopLossPx!=null&&i.push({a:r.assetId,b:!o,p:pt(e.stopLossPx,r.szDecimals),s:n.size,r:!0,t:$a(be.STOP_MARKET,{triggerPx:e.stopLossPx,szDecimals:r.szDecimals})}),i.length===1)throw new Error("hl-perps: a bracket needs takeProfitPx and/or stopLossPx");let s={type:"order",orders:i,grouping:"normalTpsl",...n.action.builder?{builder:n.action.builder}:{}};return bn({provider:"hl-perps",venue:"hyperliquid",kind:"perp-bracket",coin:r.coin,legs:i.length,entry:{side:n.side,price:n.price,size:n.size},takeProfitPx:e.takeProfitPx==null?null:pt(e.takeProfitPx,r.szDecimals),stopLossPx:e.stopLossPx==null?null:pt(e.stopLossPx,r.szDecimals),builderFee:n.builderFee,...yn(s,Number(e.nonce??Date.now()))})}async function Cm(e={}){let t=await sr(e);return{provider:"hl-outcome",kind:"outcome-meta",outcomes:t?.outcomes||[],questions:t?.questions||[]}}async function Tm(e={},t={}){let n=e.coin,r=e.outcome,o=e.side;if(typeof o=="string"){let s=o.toLowerCase();s==="yes"||s==="0"?o=0:(s==="no"||s==="1")&&(o=1)}if(e.sideName&&r!=null){let a=((await sr(t))?.outcomes||[]).find(c=>Number(c.outcome)===Number(r));if(a?.sideSpecs){let c=a.sideSpecs.findIndex(l=>String(l.name).toLowerCase()===String(e.sideName).toLowerCase());c>=0&&(o=c)}}if(!n){if(r==null||o==null)throw new Error("hl-outcome: provide coin (#N) or outcome + side (0/1 or yes/no)");n=Xo(r,o).coin}let i=await Sr({...e,coin:n},t);return O({...i,kind:"hip4-order",provider:"hl-perps"},{provider:"hl-perps",kind:"hip4-order"})}async function Nm(e={},t={}){let n=e.coin;if(!n&&e.outcome!=null){let r=e.side??0;n=Xo(e.outcome,r).coin}return ei({...e,coin:n},t)}W();import{createHmac as y2,randomInt as zE}from"node:crypto";import{keccak256 as w2,concat as x2,zeroPadValue as S2,getCreate2Address as k2,AbiCoder as E2}from"ethers";var Mm=137;var WE="0xE111180000d2663C0091e4f400237545B87B996B",GE="0xe2222d279d744050d28e00520010520000310F59",Om="0x0000000000000000000000000000000000000000000000000000000000000000",Ma=6;var KE={name:"Polymarket CTF Exchange",version:"2",chainId:Mm},YE={Order:[{name:"salt",type:"uint256"},{name:"maker",type:"address"},{name:"signer",type:"address"},{name:"tokenId",type:"uint256"},{name:"makerAmount",type:"uint256"},{name:"takerAmount",type:"uint256"},{name:"side",type:"uint8"},{name:"signatureType",type:"uint8"},{name:"timestamp",type:"uint256"},{name:"metadata",type:"bytes32"},{name:"builder",type:"bytes32"}]},Rm={"0.1":{price:1,size:2,amount:3},"0.01":{price:2,size:2,amount:4},"0.001":{price:3,size:2,amount:5},"0.0001":{price:4,size:2,amount:6}};function ti(e){let t=String(e);return t.includes(".")?t.split(".")[1].replace(/0+$/,"").length:0}function ni(e,t){let n=10**t;return Math.floor(e*n+1e-12)/n}function $m(e,t){let n=10**t;return Math.ceil(e*n-1e-12)/n}function XE(e,t){let n=10**t;return Math.round(e*n+Number.EPSILON)/n}function QE(e,t,n,r){let o=XE(Number(n),r.price);if(e==="BUY"){let c=ni(Number(t),r.size),l=c*o;return ti(l)>r.amount&&(l=$m(l,r.amount+4),ti(l)>r.amount&&(l=ni(l,r.amount))),{rawMakerAmt:l,rawTakerAmt:c}}let s=ni(Number(t),r.size),a=s*o;return ti(a)>r.amount&&(a=$m(a,r.amount+4),ti(a)>r.amount&&(a=ni(a,r.amount))),{rawMakerAmt:s,rawTakerAmt:a}}function Lm(e){let t=Number(e).toFixed(Ma),[n,r=""]=t.split(".");return(n+r.padEnd(Ma,"0").slice(0,Ma)).replace(/^0+/,"")||"0"}function JE(e={}){let{tokenId:t,side:n,price:r,size:o,maker:i,signer:s,negRisk:a=!1,tickSize:c="0.01",orderType:l="GTC",signatureType:u=0,metadata:d=Om,builder:p=Om}=e;if(!t)throw new Error("tokenId required");if(n!=="BUY"&&n!=="SELL")throw new Error("side must be BUY or SELL");if(!i||!s)throw new Error("maker and signer required");let m=Number(r),f=Number(o);if(!(m>0&&m<1))throw new Error(`price out of (0,1): ${r}`);if(!(f>0))throw new Error(`size must be > 0: ${o}`);if(![0,3].includes(Number(u)))throw new Error(`Desk poly supports signatureType 0 (EOA) or 3 (deposit wallet), got ${u}`);let h=Rm[String(c)]||Rm["0.01"],{rawMakerAmt:g,rawTakerAmt:b}=QE(n,f,m,h),k=Lm(g),x=Lm(b),w=String(zE(1,2**31-1)),v=Date.now().toString(),T=n==="BUY"?0:1,I=a?GE:WE,R={salt:w,maker:i,signer:s,tokenId:String(t),makerAmount:k,takerAmount:x,side:T,signatureType:Number(u),timestamp:v,metadata:d,builder:p};return{domain:{...KE,verifyingContract:I},types:YE,value:R,orderType:l,side:n,notionalUsdc:n==="BUY"?g:b,exchange:I}}function Um(e={}){let t=JE(e);return O({provider:"poly-clob",kind:"poly-order",chainId:Mm,tokenId:String(e.tokenId),side:t.side,orderType:t.orderType,notionalUsdc:t.notionalUsdc,exchange:t.exchange,domain:t.domain,types:t.types,value:t.value,tickSize:e.tickSize||"0.01",negRisk:!!e.negRisk,signatureType:Number(e.signatureType??0),maxNotionalUsdc:e.maxNotionalUsdc??null},{provider:"poly-clob",kind:"poly-order"})}import{ContractFactory as vv,keccak256 as tf}from"ethers";import{createHash as ev}from"node:crypto";import{wordlists as tv}from"ethers";var Fm=1,nv=new Set(["privatekey","privkey","secretkey","seedphrase","seed","mnemonic","passphrase","password","keystore","keymaterial","wif","xprv","xpriv","bearer","authorization","signature","apikey","credential"]),rv=[/\b[5KL][1-9A-HJ-NP-Za-km-z]{50,51}\b/,/\bxprv[0-9A-Za-z]{50,}\b/],ov=new Set([12,15,18,21,24]);function iv(e){let t=String(e).trim().toLowerCase().split(/\s+/).filter(Boolean);return ov.has(t.length)&&t.every(n=>tv.en.getWordIndex(n)>=0)}var sv=/^\s*(?:0x)?[0-9a-fA-F]{64}\s*$/,av=/(hash|digest|root|salt|nonce|proof|commitment|sig|id)(?:e?s)?$/i,cv=new Set(["calldata","data","publickey","pubkey","message","payload","input","extradata"]);function lv(e){let t=qm(e);return cv.has(t)||av.test(t)}var Sn=class extends Error{constructor(t){super(`action receipt refused: secret-bearing field at ${t}`),this.name="ActionReceiptSecretError",this.code="ACTION_RECEIPT_SECRET"}};function qm(e){return String(e).replace(/[^a-z0-9]/gi,"").toLowerCase()}function uv(e){let t=qm(e);return[...nv].some(n=>t.includes(n))}function dv(e,t,n){if(typeof t=="string"){if(rv.some(r=>r.test(t))||iv(t))throw new Sn(n);if(sv.test(t)&&!lv(e))throw new Sn(n)}}function kn(e,t="$",n=""){if(e==null||typeof e=="boolean")return e;if(typeof e=="string")return dv(n,e,t),e;if(typeof e=="number"){if(!Number.isFinite(e))throw new TypeError(`action receipt: non-finite number at ${t}`);return e}if(typeof e=="bigint")return e.toString();if(Array.isArray(e))return e.map((o,i)=>kn(o,`${t}[${i}]`,n));if(typeof e!="object"||Object.getPrototypeOf(e)!==Object.prototype)throw new TypeError(`action receipt: JSON-like value required at ${t}`);let r={};for(let o of Object.keys(e).sort()){let i=`${t}.${o}`;if(uv(o))throw new Sn(i);e[o]!==void 0&&(r[o]=kn(e[o],i,o))}return r}function Re(e){return kn(e)}function Ua(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(Ua).join(",")}]`:`{${Object.keys(e).map(t=>`${JSON.stringify(t)}:${Ua(e[t])}`).join(",")}}`}function Hm(e){return Ua(kn(e))}function jm(e){if(!e||typeof e!="object"||Array.isArray(e))throw new TypeError("action receipt: object required");let{receiptId:t,summary:n,...r}=e;return ev("sha256").update(Hm(r)).digest("hex")}function xn(e,...t){for(let n of t)if(e[n]!==void 0)return e[n]}function wn(e,t,n){let r=xn(e,...t);if(r==null)throw new TypeError(`action receipt: ${n} required`);return r}function pv(e){let t=xn(e,"balances","balanceChanges"),n=xn(e,"beforeBalances","balancesBefore","before"),r=xn(e,"afterBalances","balancesAfter","after");return t!==void 0?{balances:t}:n===void 0&&r===void 0?{}:{balances:{...n===void 0?{}:{before:n},...r===void 0?{}:{after:r}}}}function Vm(e={}){if(!e||typeof e!="object"||Array.isArray(e))throw new TypeError("action receipt: input object required");kn(e);let t=xn(e,"txHash","transactionHash"),n=xn(e,"phase","stage","resultType")??(t==null?"prepare":"execute");if(n!=="prepare"&&n!=="execute")throw new TypeError('action receipt: phase must be "prepare" or "execute"');let r={receiptVersion:Fm,phase:n,intent:wn(e,["intent"],"intent"),route:wn(e,["route"],"route"),decodedAction:wn(e,["decodedAction","action"],"decodedAction"),policyChecks:wn(e,["policyChecks","checks"],"policyChecks"),allowlistHits:wn(e,["allowlistHits","allowlistMatches"],"allowlistHits"),prepareHash:wn(e,["prepareHash"],"prepareHash"),...t==null?{}:{txHash:t},...pv(e)},o=kn(r);return Object.freeze({...o,receiptId:jm(o)})}var mv=Vm;function Bm(e,t=[]){if(typeof e=="string"||typeof e=="number")return String(e);for(let n of t)if(e?.[n]!=null)return String(e[n]);return"recorded"}function Dm(e){if(typeof e=="boolean")return e;if(e&&typeof e=="object"){if(typeof e.ok=="boolean")return e.ok;if(typeof e.allowed=="boolean")return e.allowed;if(typeof e.passed=="boolean")return e.passed}return null}function zm(e){if(!e||typeof e!="object")throw new TypeError("action receipt: object required");let t=Bm(e.decodedAction,["type","action","method","name"]),n=Bm(e.route,["name","provider","venue","id"]),r=Array.isArray(e.policyChecks)?e.policyChecks:Object.values(e.policyChecks||{}),o=r.filter(l=>Dm(l)===!0).length,i=r.filter(l=>Dm(l)===!1).length,s=Array.isArray(e.allowlistHits)?e.allowlistHits.length:Object.keys(e.allowlistHits||{}).length,a=e.txHash==null?"no transaction hash":`tx ${e.txHash}`,c=e.balances==null?"balances not provided":"before/after balances recorded";return`${e.phase} ${t} via ${n}; policy ${o} passed, ${i} failed; ${s} allowlist hit${s===1?"":"s"}; ${a}; ${c}; receipt ${e.receiptId}`}var fv=zm;W();import{spawnSync as Fa}from"node:child_process";import{existsSync as Mt,readFileSync as ii,readdirSync as Qm,statSync as Jm}from"node:fs";import{join as Ve}from"node:path";import{createHash as Sv}from"node:crypto";import{existsSync as Gm,readFileSync as hv}from"node:fs";import{dirname as Wm,join as Ba}from"node:path";import{fileURLToPath as gv}from"node:url";function yv(e){let t=Wm(gv(e));for(let n=0;n<8;n+=1){let r=Ba(t,"package.json");if(Gm(r))try{let i=JSON.parse(hv(r,"utf8"));if(i&&typeof i.version=="string")return t}catch{}let o=Wm(t);if(o===t)break;t=o}throw new Error(`oracle: could not resolve package root from ${e}`)}function ri(e,t){let n=yv(t),r=Ba(n,e);return Gm(r)?r:Ba(n,"dist","assets",e)}import{isAddress as bv}from"ethers";var Km="5.0.2",wv={"safe-erc20":{contractName:"SafeERC20",source:"src/SafeERC20.sol",constructor:["string name","string symbol","uint256 initialSupply","address initialHolder","address initialOwner"],authority:["initialOwner may pause transfers and use Ownable2Step"],monitor:["OwnershipTransferStarted","OwnershipTransferred","Paused","Unpaused","Transfer"]},"safe-erc721-drop":{contractName:"SafeERC721Drop",source:"src/SafeERC721Drop.sol",constructor:["string name","string symbol","uint256 cap","address treasury","uint256 mintPrice","uint256 perWalletCap","address initialOwner"],authority:["initialOwner may withdraw the full balance to immutable treasury","no mint, proxy, upgrade, or delegatecall authority"],monitor:["Transfer","OwnershipTransferred","Withdrawal"]},"safe-vesting":{contractName:"SafeVesting",source:"src/SafeVesting.sol",constructor:["address beneficiary","uint64 startTimestamp","uint64 durationSeconds"],authority:["beneficiary is the immutable OpenZeppelin owner/recipient identity","ownership transfer and renunciation are disabled","no separate administrator, proxy, upgrade, or delegatecall authority"],monitor:["EtherReleased","ERC20Released"]}};function xv(e,t){return Object.freeze({id:e,contractName:t.contractName,source:t.source,dependency:Object.freeze({name:"OpenZeppelin Contracts",version:Km,tag:`v${Km}`}),constructor:Object.freeze([...t.constructor]),authority:Object.freeze([...t.authority]),monitor:Object.freeze([...t.monitor]),fixedSource:!0,proxy:!1,upgradeable:!1,arbitraryDelegatecall:!1,modelEmittedSource:!1})}var Da=Object.freeze(Object.fromEntries(Object.entries(wv).map(([e,t])=>[e,xv(e,t)])));function oi(e){let t=Da[String(e||"")];if(!t)throw new Error(`protocol-templates: unknown template "${e}"`);return t}function kr(e,t){try{if(BigInt(e)<=0n)throw new Error}catch{throw new Error(`${t} must be > 0`)}}function Er(e,t){let n=String(e||"");if(!bv(n)||/^0x0{40}$/i.test(n))throw new Error(`${t} must be nonzero address`)}function Ym(e,t){let n=oi(e);if(!Array.isArray(t))throw new Error(`${e}: constructor args must be an array`);if(t.length!==n.constructor.length)throw new Error(`${e}: expected ${n.constructor.length} constructor args`);if(e==="safe-erc20"){let[r,o,i,s,a]=t;if(!String(r||"").trim()||!String(o||"").trim())throw new Error("safe-erc20: name/symbol required");kr(i,"safe-erc20: supply"),Er(s,"safe-erc20: initialHolder"),Er(a,"safe-erc20: initialOwner")}else if(e==="safe-erc721-drop"){let[r,o,i,s,a,c,l]=t;if(!String(r||"").trim()||!String(o||"").trim())throw new Error("safe-erc721-drop: name/symbol required");if(kr(i,"safe-erc721-drop: cap"),Er(s,"safe-erc721-drop: treasury"),kr(a,"safe-erc721-drop: mintPrice"),kr(c,"safe-erc721-drop: perWalletCap"),BigInt(c)>BigInt(i))throw new Error("safe-erc721-drop: perWalletCap exceeds cap");Er(l,"safe-erc721-drop: initialOwner")}else if(e==="safe-vesting"){let[r,o,i]=t;Er(r,"safe-vesting: beneficiary");for(let[s,a]of[[o,"startTimestamp"],[i,"durationSeconds"]])try{let c=BigInt(s);if(c<0n||c>18446744073709551615n)throw new Error}catch{throw new Error(`safe-vesting: ${a} must be uint64`)}kr(i,"safe-vesting: durationSeconds")}return n}function Xm(e){return{authorities:[...e.authority],proxy:!1,upgradeable:!1,arbitraryDelegatecall:!1}}var vr=ri("protocols/templates",import.meta.url),si="Template + Foundry tests + optional static analysis. NOT a paid security-firm audit. Do not put mainnet TVL on forks without an independent Solidity audit.";function ai(){return Mt(vr)?Qm(vr).filter(e=>Da[e]&&Jm(Ve(vr,e)).isDirectory()).map(e=>{let t=Ve(vr,e),n=Ve(t,"SECURITY.md");return{id:e,path:t,metadata:oi(e),securityNotice:Mt(n)?ii(n,"utf8").slice(0,500):null,disclaimer:si}}):[]}function Zm(){if(process.env.FORGE_BIN)return process.env.FORGE_BIN;let e=process.env.HOME||"",t=["forge",Ve(e,".foundry/bin/forge")];for(let n of t)if(Fa(n,["--version"],{encoding:"utf8"}).status===0)return n;return null}function kv(){return process.env.SLITHER_BIN?process.env.SLITHER_BIN:Fa("slither",["--version"],{encoding:"utf8"}).status===0?"slither":null}function En(e,t,n){let r=Fa(e,t,{cwd:n,encoding:"utf8",env:{...process.env,PATH:`${process.env.HOME||""}/.foundry/bin:${process.env.PATH||""}`},timeout:12e4});return{ok:r.status===0,status:r.status,stdout:r.stdout||"",stderr:r.stderr||""}}function Ev(e){let t=Sv("sha256");function n(r){let o=Jm(r);if(o.isDirectory()){if(["lib","out","cache",".git"].includes(r.split("/").pop()))return;for(let i of Qm(r).sort())n(Ve(r,i))}else o.isFile()&&(r.endsWith(".sol")||r.endsWith(".toml")||r.endsWith(".md")||r.endsWith(".txt"))&&(t.update(r.slice(e.length)),t.update(ii(r)))}return n(e),t.digest("hex")}function qa(e,t={}){let n=oi(e),r=t.allowSkipStatic!==!1,o=Ve(vr,e);if(!Mt(o))throw new Error(`protocol-templates: unknown template "${e}"`);let i=Zm();if(!i)throw new Error("protocol-templates: forge not found. Install Foundry (https://getfoundry.sh) then: cd protocols/templates/"+e+" && forge install && forge test");if(!Mt(Ve(o,"lib","forge-std"))){let m=En(i,["install","foundry-rs/forge-std","--no-git"],o);if(!m.ok)throw new Error(`protocol-templates: forge install forge-std failed
|
|
6
|
-
${m.stderr}`)}if(!
|
|
7
|
-
${m.stderr}`)}let s=
|
|
8
|
-
${c.stderr}`.slice(0,2e3));let l=
|
|
4
|
+
- `)}`);let o=e.capabilities||{},i=rn.filter(a=>typeof o[a]=="function"),s={key:e.key,chainId:e.chainId,name:e.name,rpcEnv:[...e.rpcEnv],nativeCurrency:e.nativeCurrency?{...e.nativeCurrency}:null,explorer:e.explorer||null,venues:(e.venues||[]).map(a=>({...a})),warnings:r,capabilities(){return{chainId:e.chainId,key:e.key,supported:[...i],unsupported:rn.filter(a=>!i.includes(a))}},supports(a){return i.includes(a)}};for(let a of rn)i.includes(a)?s[a]=async(...c)=>o[a](...c,{scanner:s}):s[a]=async()=>{throw new Error(`${e.key} (chain ${e.chainId}) does not implement "${a}". Supported: ${i.join(", ")||"none"}. An unimplemented capability is absent, not assumed -- implement it or treat this chain as fail-closed for that operation.`)};return Object.freeze(s)}var rr=new Map;function fo(e){let t=Ju(e);return rr.set(t.chainId,t),t}function Fs(e){return rr.get(Number(e))||null}function qs(){return[...rr.values()]}function SS(){let e={};for(let t of rr.values())e[t.chainId]={key:t.key,name:t.name,...t.capabilities(),venueCount:t.venues.length,failClosed:t.venues.length===0};return{generatedAt:new Date().toISOString(),chainCount:rr.size,capabilities:[...rn],chains:e}}var js={getAmountsOut:"d06ca61f",swapExactTokensForTokens:"38ed1739",swapExactETHForTokens:"7ff36ab5"},ke=e=>BigInt(e).toString(16).padStart(64,"0"),or=e=>e.slice(2).toLowerCase().padStart(64,"0");function kS(e,t){return`0x${js.getAmountsOut}`+ke(e)+ke(64)+ke(t.length)+t.map(or).join("")}function vS(e){if(!e||e==="0x")return null;let t=e.slice(2);if(t.length<128)return null;let n=Number(BigInt(`0x${t.slice(64,128)}`));if(!Number.isFinite(n)||n<1||n>16)return null;let r=[];for(let o=0;o<n;o++){let i=128+o*64;if(t.length<i+64)return null;r.push(BigInt(`0x${t.slice(i,i+64)}`))}return r}function Hs(e,t="router"){return(e?.venues||[]).find(r=>r.kind===t)?.address??null}var Vs=100;function ES(e,t){let n=Number(t);if(!Number.isFinite(n)||n<0)throw new Error("slippageBps must be a non-negative number");if(n>Vs)throw new Error(`slippageBps ${n} exceeds the ${Vs} bps ceiling. Block and requote or split the order -- do not widen the guard to force a fill.`);return BigInt(e)*BigInt(1e4-Math.floor(n))/10000n}function Zu(e){let{chainId:t,wrappedNative:n}=e;async function r(o,i,s,a){let c=await L(t,"eth_call",[{to:o,data:kS(i,s)},"latest"],a);return vS(c?.result??c)}return{async quote({tokenIn:o,tokenOut:i,amountIn:s,path:a},c={}){let l=Hs(c.scanner);if(!l)return{chainId:t,evidence:B.UNAVAILABLE,reason:"no verified router configured for this chain; quoting stays fail-closed rather than guessing a venue address"};let u=a||[o,i];if(u.some(p=>!/^0x[0-9a-fA-F]{40}$/.test(p||"")))throw new Error("quote requires valid 20-byte addresses");let d=await r(l,s,u,c);return d?{chainId:t,router:l,path:u,amountIn:String(s),amountOut:d[d.length-1].toString(),hops:u.length-1,evidence:B.LIVE,note:"exact-input quote at current reserves; not a guaranteed fill"}:{chainId:t,router:l,path:u,evidence:B.UNKNOWN,reason:"router returned no amounts -- no pool for this path, or the call reverted"}},async sellSimulation({token:o,amountIn:i,base:s},a={}){let c=Hs(a.scanner),l=s||n;if(l&&String(o).toLowerCase()===String(l).toLowerCase())return{chainId:t,token:o,verdict:M.UNKNOWN,evidence:B.UNAVAILABLE,reason:"token is the base asset for this chain, so there is nothing to round-trip against. Sellability must be judged against a different quote asset."};if(!c||!l)return{chainId:t,token:o,verdict:M.UNKNOWN,evidence:B.UNAVAILABLE,reason:c?"no wrappedNative configured for this chain, so no base asset to round-trip against":"no verified router configured for this chain"};let u=await r(c,i,[l,o],a);if(!u)return{chainId:t,token:o,verdict:M.FAIL,evidence:B.LIVE,leg:"buy",reason:"buy leg returned no amounts -- no route in"};let d=u[u.length-1];if(d===0n)return{chainId:t,token:o,verdict:M.FAIL,evidence:B.LIVE,leg:"buy",reason:"buy leg quotes zero output"};let p=await r(c,d,[o,l],a);if(!p)return{chainId:t,token:o,verdict:M.FAIL,evidence:B.LIVE,leg:"sell",bought:d.toString(),reason:"SELL LEG FAILED while the buy leg quoted fine. This is the honeypot signature: do not trade."};let m=p[p.length-1],f=Number(m*10000n/BigInt(i)),h=M.PASS,g="round trip completes with expected fee/impact loss";return f<5e3?(h=M.FAIL,g=`round trip returns only ${(f/100).toFixed(2)}% -- punitive tax or no real liquidity`):f<9e3&&(h=M.CAUTION,g=`round trip returns ${(f/100).toFixed(2)}% -- transfer tax or thin liquidity at this size`),{chainId:t,token:o,base:l,router:c,verdict:h,reason:g,amountIn:String(i),bought:d.toString(),returned:m.toString(),retentionBps:f,evidence:B.LIVE,note:"Quote-level round trip. It does not prove transfer hooks absent at execution time."}},async prepareUnsignedTx({tokenIn:o,tokenOut:i,amountIn:s,recipient:a,slippageBps:c=50,deadlineSeconds:l=900,path:u},d={}){let p=d.scanner,m=Hs(p);if(!m)throw new Error(`chain ${t} has no verified router; preparing a swap stays fail-closed. Add a venue with recorded provenance first (see docs/adding-a-chain.md).`);if(!/^0x[0-9a-fA-F]{40}$/.test(a||""))throw new Error("prepareUnsignedTx requires a valid recipient address");let f=u||[o,i],h=await this.quote({tokenIn:o,tokenOut:i,amountIn:s,path:f},d);if(h.evidence!==B.LIVE)throw new Error(`cannot prepare without a live quote (${h.evidence}: ${h.reason??"no reason given"})`);let g=ES(h.amountOut,c);if(g<=0n)throw new Error("computed minOut is zero -- refusing to prepare");let b=BigInt(Math.floor(Date.now()/1e3)+Number(l)),k=n&&f[0].toLowerCase()===n.toLowerCase()&&d.useNative,x=k?`0x${js.swapExactETHForTokens}`+ke(g)+ke(128)+or(a)+ke(b)+ke(f.length)+f.map(or).join(""):`0x${js.swapExactTokensForTokens}`+ke(s)+ke(g)+ke(160)+or(a)+ke(b)+ke(f.length)+f.map(or).join("");return{unsigned:!0,signedBy:"user-wallet",chainId:t,tx:{to:m,data:x,value:k?`0x${BigInt(s).toString(16)}`:"0x0"},guard:{quotedOut:h.amountOut,minOut:g.toString(),slippageBps:c,maxSlippageBps:Vs,deadline:b.toString()},requires:k?[]:[{step:"approve",token:f[0],spender:m,amount:String(s)}],note:"UNSIGNED. Re-verify the guard against a fresh quote immediately before signing -- a quote-time minimum is not a minimum at broadcast time."}}}}var AS=[100,500,3e3,1e4],ed={quoteExactInputSingle:"c6a5026a",exactInputSingle:"04e45aaf"},$t=e=>BigInt(e).toString(16).padStart(64,"0"),ir=e=>e.slice(2).toLowerCase().padStart(64,"0"),td=/^0x[0-9a-fA-F]{40}$/,Ws=100;function IS(e,t){let n=Number(t);if(!Number.isFinite(n)||n<0)throw new Error("slippageBps must be a non-negative number");if(n>Ws)throw new Error(`slippageBps ${n} exceeds the ${Ws} bps ceiling. Block and requote or split the order -- do not widen the guard to force a fill.`);return BigInt(e)*BigInt(1e4-Math.floor(n))/10000n}function zs(e,t){return(e?.venues||[]).find(n=>n.kind===t)?.address??null}function nd(e){let{chainId:t,wrappedNative:n}=e;async function r({quoter:i,tokenIn:s,tokenOut:a,amountIn:c,fee:l},u){let d=`0x${ed.quoteExactInputSingle}`+ir(s)+ir(a)+$t(c)+$t(l)+$t(0),p=await L(t,"eth_call",[{to:i,data:d},"latest"],u).catch(()=>null),m=p?.result??p;if(!m||m==="0x"||m.length<66)return null;let f=BigInt(`0x${m.slice(2,66)}`);return f>0n?f:null}async function o({quoter:i,tokenIn:s,tokenOut:a,amountIn:c},l){let u=[],d=null;for(let p of AS){let m=await r({quoter:i,tokenIn:s,tokenOut:a,amountIn:c,fee:p},l);u.push({fee:p,amountOut:m?m.toString():null}),m&&(!d||m>d.amountOut)&&(d={fee:p,amountOut:m})}return{best:d,tried:u}}return{async quote({tokenIn:i,tokenOut:s,amountIn:a},c={}){let l=zs(c.scanner,"quoter");if(!l)return{chainId:t,evidence:B.UNAVAILABLE,reason:"no verified quoter configured for this chain; quoting stays fail-closed rather than guessing a venue address"};for(let p of[i,s])if(!td.test(p||""))throw new Error("quote requires valid 20-byte addresses");let{best:u,tried:d}=await o({quoter:l,tokenIn:i,tokenOut:s,amountIn:a},c);return u?{chainId:t,venue:"uniswap-v3",quoter:l,tokenIn:i,tokenOut:s,amountIn:String(a),amountOut:u.amountOut.toString(),fee:u.fee,triedFeeTiers:d,evidence:B.LIVE,note:"exact-input single-hop quote at current tick; not a guaranteed fill"}:{chainId:t,quoter:l,tokenIn:i,tokenOut:s,triedFeeTiers:d,evidence:B.UNKNOWN,reason:"no fee tier returned a quote -- no V3 pool for this pair, or no liquidity"}},async sellSimulation({token:i,amountIn:s,base:a},c={}){let l=zs(c.scanner,"quoter"),u=a||n;if(u&&String(i).toLowerCase()===String(u).toLowerCase())return{chainId:t,token:i,verdict:M.UNKNOWN,evidence:B.UNAVAILABLE,reason:"token is the base asset for this chain, so there is nothing to round-trip against. Sellability must be judged against a different quote asset."};if(!l||!u)return{chainId:t,token:i,verdict:M.UNKNOWN,evidence:B.UNAVAILABLE,reason:l?"no wrappedNative configured, so there is no base asset to round-trip against":"no verified quoter configured for this chain"};let d=await o({quoter:l,tokenIn:u,tokenOut:i,amountIn:s},c);if(!d.best)return{chainId:t,token:i,verdict:M.FAIL,evidence:B.LIVE,leg:"buy",reason:"no V3 pool priced the buy leg on any fee tier"};let p=await o({quoter:l,tokenIn:i,tokenOut:u,amountIn:d.best.amountOut},c);if(!p.best)return{chainId:t,token:i,verdict:M.FAIL,evidence:B.LIVE,leg:"sell",bought:d.best.amountOut.toString(),reason:"SELL LEG FAILED while the buy leg quoted fine. This is the honeypot signature: do not trade."};let m=p.best.amountOut,f=Number(m*10000n/BigInt(s)),h=M.PASS,g="round trip completes with expected fee/impact loss";return f<5e3?(h=M.FAIL,g=`round trip returns only ${(f/100).toFixed(2)}% -- punitive tax or no real liquidity`):f<9e3&&(h=M.CAUTION,g=`round trip returns ${(f/100).toFixed(2)}% -- transfer tax or thin liquidity at this size`),{chainId:t,venue:"uniswap-v3",token:i,base:u,verdict:h,reason:g,amountIn:String(s),bought:d.best.amountOut.toString(),returned:m.toString(),retentionBps:f,buyFee:d.best.fee,sellFee:p.best.fee,evidence:B.LIVE,note:"Quote-level round trip. It does not prove transfer hooks absent at execution time."}},async prepareUnsignedTx({tokenIn:i,tokenOut:s,amountIn:a,recipient:c,slippageBps:l=50,fee:u},d={}){let p=zs(d.scanner,"router");if(!p)throw new Error(`chain ${t} has no verified V3 router; preparing a swap stays fail-closed. Add a venue with recorded provenance first (see docs/adding-a-chain.md).`);if(!td.test(c||""))throw new Error("prepareUnsignedTx requires a valid recipient address");let m=await this.quote({tokenIn:i,tokenOut:s,amountIn:a},d);if(m.evidence!==B.LIVE)throw new Error(`cannot prepare without a live quote (${m.evidence}: ${m.reason??"no reason given"})`);let f=u??m.fee,h=IS(m.amountOut,l);if(h<=0n)throw new Error("computed minOut is zero -- refusing to prepare");let g=`0x${ed.exactInputSingle}`+ir(i)+ir(s)+$t(f)+ir(c)+$t(a)+$t(h)+$t(0);return{unsigned:!0,signedBy:"user-wallet",chainId:t,venue:"uniswap-v3",tx:{to:p,data:g,value:"0x0"},guard:{quotedOut:m.amountOut,minOut:h.toString(),slippageBps:l,maxSlippageBps:Ws,fee:f},requires:[{step:"approve",token:i,spender:p,amount:String(a)}],note:"UNSIGNED. Re-verify the guard against a fresh quote immediately before signing -- a quote-time minimum is not a minimum at broadcast time."}}}}var ho={decimals:"0x313ce567",symbol:"0x95d89b41",name:"0x06fdde03",totalSupply:"0x18160ddd",owner:"0x8da5cb5b"};function rd(e){if(!e||e==="0x")return null;try{return BigInt(e)}catch{return null}}function od(e){if(!e||e==="0x")return null;let t=e.slice(2);if(t.length>=128){let r=Number(BigInt(`0x${t.slice(64,128)}`));if(r>0&&r<=256&&t.length>=128+r*2){let o=t.slice(128,128+r*2),i=Buffer.from(o,"hex").toString("utf8").replace(/\0+$/,"");if(i)return i}}return Buffer.from(t.slice(0,64),"hex").toString("utf8").replace(/\0+$/,"")||null}function _S(e){let{chainId:t}=e;async function n(r,o,i){return L(t,"eth_call",[{to:r,data:o},"latest"],i)}return{async blockNumber(r={}){let o=await oo(t,r);return{chainId:t,blockNumber:o?.blockNumber??o,evidence:B.LIVE}},async nativeBalance(r,o={}){let i=await tn(t,r,o);return{chainId:t,address:r,wei:i?.wei??i?.balance??null,symbol:e.nativeCurrency?.symbol??null,decimals:e.nativeCurrency?.decimals??18,evidence:B.LIVE}},async tokenBalance({token:r,owner:o},i={}){let s=await io({chainId:t,token:r,owner:o},i);return{chainId:t,token:r,owner:o,raw:s?.balance??s,evidence:B.LIVE}},async resolveToken(r,o={}){if(!/^0x[0-9a-fA-F]{40}$/.test(r||""))return{chainId:t,token:r,evidence:B.UNKNOWN,error:"resolveToken needs a 20-byte address; symbol lookup is a market-data concern"};let[i,s,a,c]=await Promise.all([n(r,ho.decimals,o).catch(()=>null),n(r,ho.symbol,o).catch(()=>null),n(r,ho.name,o).catch(()=>null),n(r,ho.totalSupply,o).catch(()=>null)]),l=rd(i?.result??i),u=l!==null||s?.result||a?.result;return{chainId:t,address:r,decimals:l===null?null:Number(l),symbol:od(s?.result??s),name:od(a?.result??a),totalSupply:(rd(c?.result??c)??null)?.toString()??null,evidence:u?B.LIVE:B.UNKNOWN,warning:u?void 0:"no ERC-20 metadata returned -- may not be a token contract"}},async resolvePools(r,o={}){let i=e.dexscreenerSlug;if(!i)return{chainId:t,token:r,pools:[],evidence:B.UNAVAILABLE,reason:"no dexscreenerSlug configured for this chain; pool discovery is unavailable rather than guessed"};let s=await Rt(r,o).catch(()=>null),c=(s?.pairs||s?.data?.pairs||[]).filter(l=>String(l.chainId).toLowerCase()===String(i).toLowerCase()).map(l=>({pair:l.pairAddress,dex:l.dexId,base:l.baseToken?.address,quote:l.quoteToken?.address,liquidityUsd:l.liquidity?.usd??null,priceUsd:l.priceUsd??null,volume24hUsd:l.volume?.h24??null,createdAt:l.pairCreatedAt??null})).sort((l,u)=>(u.liquidityUsd??0)-(l.liquidityUsd??0));return{chainId:t,token:r,pools:c,evidence:c.length?B.LIVE:B.UNKNOWN}},async scanBlocks({fromBlock:r,toBlock:o,address:i,topics:s,chunkSize:a=2e3}={},c={}){if(!Number.isInteger(r)||!Number.isInteger(o))throw new Error("scanBlocks requires integer fromBlock and toBlock");if(o<r)throw new Error("toBlock must be >= fromBlock");let l=[],u=[];for(let d=r;d<=o;d+=a){let p=Math.min(d+a-1,o);u.push([d,p])}for(let[d,p]of u){let m={fromBlock:`0x${d.toString(16)}`,toBlock:`0x${p.toString(16)}`};i&&(m.address=i),s&&(m.topics=s);let f=await L(t,"eth_getLogs",[m],c).catch(h=>({error:String(h?.message||h)}));if(f?.error)return{chainId:t,fromBlock:r,toBlock:o,logs:l,complete:!1,failedAt:[d,p],error:f.error,evidence:B.UNKNOWN};for(let h of f?.result??f??[])l.push(h)}return{chainId:t,fromBlock:r,toBlock:o,logs:l,complete:!0,chunks:u.length,evidence:B.LIVE}},async scoreRisk(r,o={}){let i=[],s=M.PASS,a=u=>{let d={[M.PASS]:0,[M.CAUTION]:1,[M.UNKNOWN]:2,[M.FAIL]:3};d[u]>d[s]&&(s=u)},c=await this.resolveToken(r,o);c.evidence!==B.LIVE?(i.push({check:"erc20-metadata",result:M.UNKNOWN,detail:c.warning}),a(M.UNKNOWN)):i.push({check:"erc20-metadata",result:M.PASS,detail:`${c.symbol} / ${c.decimals}d`});let l=await this.resolvePools(r,o);if(l.evidence===B.UNAVAILABLE)i.push({check:"liquidity",result:M.UNKNOWN,detail:l.reason}),a(M.UNKNOWN);else if(!l.pools.length)i.push({check:"liquidity",result:M.FAIL,detail:"no pool with liquidity found"}),a(M.FAIL);else{let u=l.pools[0],d=u.liquidityUsd??0;d<5e3?(i.push({check:"liquidity",result:M.CAUTION,detail:`top pool only $${d}`}),a(M.CAUTION)):i.push({check:"liquidity",result:M.PASS,detail:`$${d} on ${u.dex}`}),u.createdAt&&Date.now()-u.createdAt<24*3600*1e3&&(i.push({check:"age",result:M.CAUTION,detail:"pool under 24h old"}),a(M.CAUTION))}if(typeof this.sellSimulation=="function"){let u=await this.sellSimulation({token:r,amountIn:(10n**16n).toString()},o).catch(d=>({verdict:M.UNKNOWN,reason:String(d?.message||d)}));i.push({check:"sellability",result:u.verdict,detail:u.retentionBps!=null?`round trip returns ${(u.retentionBps/100).toFixed(2)}% -- ${u.reason}`:u.reason}),a(u.verdict)}else i.push({check:"sellability",result:M.UNKNOWN,detail:"no verified router on this chain, so a round-trip sell simulation cannot run. Treat as unproven -- a buy path is not an exit path."}),a(M.UNKNOWN);return{chainId:t,token:r,verdict:s,checks:i,note:"Structural checks only. UNKNOWN is not PASS. A token is not tradeable until a sell simulation succeeds."}}}}function Gs(e){let n={..._S(e)},r=new Set((e.venues||[]).map(i=>i.kind));e.venueKind==="uniswap-v3"&&r.has("quoter")&&r.has("router")?Object.assign(n,nd({chainId:e.chainId,wrappedNative:e.wrappedNative})):e.venueKind==="uniswap-v2"&&r.has("router")&&Object.assign(n,Zu({chainId:e.chainId,wrappedNative:e.wrappedNative}));let o={};for(let[i,s]of Object.entries(n))o[i]=s.bind(n);return{key:e.key,chainId:e.chainId,name:e.name,rpcEnv:e.rpcEnv,nativeCurrency:e.nativeCurrency,explorer:e.explorer,venues:e.venues||[],capabilities:o}}var ct=Object.freeze([{key:"ethereum",chainId:1,name:"Ethereum",rpcEnv:["ETH_RPC_URL","ETHEREUM_RPC_URL","MAINNET_RPC_URL"],nativeCurrency:{symbol:"ETH",decimals:18},explorer:"https://etherscan.io",dexscreenerSlug:"ethereum",venueKind:"uniswap-v3",wrappedNative:"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",venues:[{kind:"quoter",address:"0x61fFE014bA17989E743c5F6cB21bF9697530B21e",label:"Uniswap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle returned a live sane price (WETH->USDC fee 500 quoted 1908.71 USDC). A contract that correctly prices a known pair IS a working V3 quoter",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:1}},{kind:"router",address:"0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45",label:"Uniswap V3 SwapRouter02",verified:{method:"eth_getCode returned real bytecode on this chain and the paired quoter at the same deployment passed a live functional quote",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:1}}]},{key:"optimism",chainId:10,name:"OP Mainnet",rpcEnv:["OPTIMISM_RPC_URL","OP_RPC_URL"],nativeCurrency:{symbol:"ETH",decimals:18},explorer:"https://optimistic.etherscan.io",dexscreenerSlug:"optimism",venueKind:"uniswap-v3",wrappedNative:"0x4200000000000000000000000000000000000006",venues:[{kind:"quoter",address:"0x61fFE014bA17989E743c5F6cB21bF9697530B21e",label:"Uniswap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle returned a live sane price (WETH->USDC fee 500 quoted 1905.23 USDC). A contract that correctly prices a known pair IS a working V3 quoter",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:10}},{kind:"router",address:"0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45",label:"Uniswap V3 SwapRouter02",verified:{method:"eth_getCode returned real bytecode on this chain and the paired quoter at the same deployment passed a live functional quote",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:10}}]},{key:"bsc",chainId:56,name:"BNB Smart Chain",rpcEnv:["BSC_RPC_URL","BNB_RPC_URL"],nativeCurrency:{symbol:"BNB",decimals:18},explorer:"https://bscscan.com",dexscreenerSlug:"bsc",venueKind:"uniswap-v3",wrappedNative:"0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c",venues:[{kind:"quoter",address:"0x78D78E420Da98ad378D7799bE8f4AF69033EB077",label:"Uniswap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle returned a live sane price (WBNB->USDC fee 500 quoted 413.86 USDC). A contract that correctly prices a known pair IS a working V3 quoter",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:56}},{kind:"router",address:"0xB971eF87ede563556b2ED4b1C0b0019111Dd85d2",label:"Uniswap V3 SwapRouter02",verified:{method:"eth_getCode returned real bytecode on this chain and the paired quoter at the same deployment passed a live functional quote",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:56}}]},{key:"polygon",chainId:137,name:"Polygon",rpcEnv:["POLYGON_RPC_URL","POLYGON_RPC"],nativeCurrency:{symbol:"POL",decimals:18},explorer:"https://polygonscan.com",dexscreenerSlug:"polygon",venueKind:"uniswap-v3",wrappedNative:"0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270",venues:[{kind:"quoter",address:"0x61fFE014bA17989E743c5F6cB21bF9697530B21e",label:"Uniswap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle returned a live sane price (WMATIC->USDC fee 500 quoted 0.0720 USDC). A contract that correctly prices a known pair IS a working V3 quoter",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:137}},{kind:"router",address:"0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45",label:"Uniswap V3 SwapRouter02",verified:{method:"eth_getCode returned real bytecode on this chain and the paired quoter at the same deployment passed a live functional quote",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:137}}]},{key:"stable",chainId:988,name:"Stable Mainnet",rpcEnv:["STABLE_RPC_URL","STABLE_RPC"],nativeCurrency:{symbol:"USDT0",decimals:18},venueKind:"uniswap-v3",wrappedNative:"0x5d442b349590a6048Eb2dC0eC346cAA5F47A9ab5",venues:[{kind:"quoter",address:"0xb070179E7032CdA868b53e6C1742F80c9e940d1A",label:"Uniswap V3 QuoterV2 (canonical)",verified:{method:"Stable is on the OFFICIAL Uniswap v3 Deployments List (governance-recognised 2026-05-12, UAC process completed 2026-04, deployed by Protofire), so this is a canonical deployment rather than a fork. eth_getCode returned 8273 bytes, the same size as the canonical quoter on the seven already-verified chains. Functional probe on a live pool (TOAST -> USDT0, fee 10000): 100 in -> 0.000003, 1000 -> 0.000031, 10000 -> 0.000319 USDT0. Output scales monotonically with input, which is a working quoter answering, not a revert. Two of three sampled pools carry non-zero liquidity. NOTE: the pools discovered so far are thin, so real routing size is limited -- the venue is proved, deep liquidity is not.",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-08-05",chainId:988}},{kind:"router",address:"0x32eaf9B5d5F2CD7361c5012890C943D7de84C22a",label:"Uniswap SwapRouter02 (canonical)",verified:{method:"eth_getCode returned 24497 bytes. Cross-checked on-chain rather than trusted from docs: router.factory() returns 0x88f0a512ef09175d456bc9547f914f48c013e4aa, the same v3 core factory that created the pools quoted above, and router.WETH9() returns the wrappedNative recorded on this chain entry. Address published in the Stable docs DEX reference and the Uniswap deployments list.",source:"docs.stable.xyz/en/reference/dexes + on-chain factory()/WETH9() round-trip",date:"2026-08-05",chainId:988}}]},{key:"hyperevm",chainId:999,name:"HyperEVM",rpcEnv:["HYPEREVM_RPC_URL","HYPER_EVM_RPC"],nativeCurrency:{symbol:"HYPE",decimals:18},dexscreenerSlug:"hyperevm",venueKind:"uniswap-v3",wrappedNative:"0x5555555555555555555555555555555555555555",venues:[{kind:"quoter",address:"0x03A918028f22D9E1473B7959C927AD7425A45C7C",label:"HyperSwap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle(1 WHYPE -> USDT0) returned live output on all four fee tiers (100: 57.3385, 500: 57.4187, 3000: 57.3237, 10000: 56.1963 USDT0). Decimals read on-chain: WHYPE 18, USDT0 6. Best tier checked against an INDEPENDENT control the same minute -- Hyperliquid allMids put HYPE at 57.3205, so the pool is 0.171% from the perp mid, which is the right shape for fee plus impact rather than a wrong contract or a decimals bug.",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-08-05",chainId:999}},{kind:"router",address:"0x4E2960a8cd19B467b82d26D83fAcb0fAE26b094D",label:"HyperSwap V3 SwapRouter",verified:{method:"eth_getCode returned 12070 bytes, and it is the router paired with the quoter proved above -- the same pair already shipped in UNI_V3_VENUES[999].hyperswap, which is the map the quote/prepare path actually routes through.",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-08-05",chainId:999}}]},{key:"abstract",chainId:2741,name:"Abstract",rpcEnv:["ABSTRACT_RPC_URL","ABS_RPC_URL"],nativeCurrency:{symbol:"ETH",decimals:18},venueKind:"uniswap-v3",wrappedNative:"0x3439153EB7AF838Ad19d56E1571FBD09333C2809",venues:[{kind:"quoter",address:"0x728BD3eC25D5EDBafebB84F3d67367Cd9EBC7693",label:"Uniswap V3 QuoterV2 (Abstract deployment)",verified:{method:"Abstract is a ZK-stack chain, so CREATE2 addresses differ and the canonical Uniswap addresses are NOT valid here -- probing them returns codesize 0, which is what previously made this chain look like it had no V3 at all. Found the real deployment from live traffic instead: scanned recent Swap(...) logs, took the busiest pool, read pool.factory() = 0xa1160e73b63f322ae88cc2d8e700833e71d0b2a1, then enumerated that factory's deployer (0xf3d63166F0Ca56C3c1A3508FcE03Ff0Cf3Fb691e) and probed each of its 56 contracts with a real quoteExactInputSingle call. Exactly one answered: 1 WETH -> 1846.475731 USDC.e at fee 500. Independent sanity check: the pool's own slot0() spot price is 1873.11 USDC.e per WETH, so the quoter sits ~1.4% below spot, the right shape for fee plus price impact on this size.",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-08-05",chainId:2741}},{kind:"router",address:"0x7712FA47387542819d4E35A23f8116C90C18767C",label:"Uniswap SwapRouter02 (Abstract deployment)",verified:{method:"eth_getCode returned 167392 bytes and the runtime contains the exactInputSingle selector. router.factory() matches the factory proved above and router.WETH9() matches the wrappedNative on this entry. Chosen over its byte-identical twin (0xfD6257F4...) because this is the address real users actually route through: it appeared as tx.to on live swaps against the WETH/USDC.e pool.",source:"on-chain factory()/WETH9() round-trip + live swap tx.to sampling",date:"2026-08-05",chainId:2741}}]},{key:"robinhood",chainId:4663,name:"Robinhood Chain",rpcEnv:["RH_CHAIN_RPC","ROBINHOOD_RPC_URL"],nativeCurrency:{symbol:"ETH",decimals:18},dexscreenerSlug:"robinhood",venueKind:"uniswap-v3",wrappedNative:"0x0bd7d308f8e1639fab988df18a8011f41eacad73",venues:[{kind:"quoter",address:"0x33e885ed0ec9bf04ecfb19341582aadcb4c8a9e7",label:"Uniswap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle returned a live sane price (WETH->USDG fee 100 quoted 1866.58 USDG, and USDG->CASHCAT fee 10000 quoted a live amount). A contract that correctly prices known pairs IS a working V3 quoter",source:"live eth_call against rpc.mainnet.chain.robinhood.com",date:"2026-07-31",chainId:4663}},{kind:"router",address:"0xcaf681a66d020601342297493863e78c959e5cb2",label:"Uniswap V3 SwapRouter02",verified:{method:"eth_getCode returned real bytecode (24497 bytes) on this chain and the paired quoter at the same deployment passed a live functional quote",source:"live eth_getCode against rpc.mainnet.chain.robinhood.com",date:"2026-07-31",chainId:4663}},{kind:"factory",address:"0x1f7d7550b1b028f7571e69a784071f0205fd2efa",label:"Uniswap V3 Factory",verified:{method:"eth_getCode returned real bytecode (24535 bytes) and a PoolCreated log scan over this factory returned 76 pools in ~9000 recent blocks",source:"live eth_getLogs against rpc.mainnet.chain.robinhood.com",date:"2026-07-31",chainId:4663}}]},{key:"base",chainId:8453,name:"Base",rpcEnv:["BASE_RPC_URL"],nativeCurrency:{symbol:"ETH",decimals:18},explorer:"https://basescan.org",dexscreenerSlug:"base",venueKind:"uniswap-v3",wrappedNative:"0x4200000000000000000000000000000000000006",venues:[{kind:"quoter",address:"0x3d4e44Eb1374240CE5F1B871ab261CD16335B76a",label:"Uniswap V3 QuoterV2 (Base)",verified:{method:"functional probe: quoteExactInputSingle returned WETH->USDC at fee 500 = 1908.44 USDC, a live sane price. The canonical mainnet quoter address also has bytecode on Base but does NOT price this pair, which is exactly the false positive a codesize-only check accepts",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:8453}},{kind:"router",address:"0x2626664c2603336E57B271c5C0b26F421741e481",label:"Uniswap V3 SwapRouter02 (Base)",verified:{method:"eth_getCode returned real bytecode and the paired Base quoter passed a live functional quote",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:8453}},{kind:"router-v2",address:"0x4752ba5DBc23f44D87826276BF6Fd6b1C372aD24",label:"Uniswap V2 Router02 (Base)",verified:{method:"eth_getCode returned 17891 bytes; live getAmountsOut on WETH->USDC round-tripped to 98.75% (2x0.30% fee + impact)",source:"https://docs.uniswap.org/contracts/v2/reference/smart-contracts/v2-deployments",date:"2026-07-30",chainId:8453}}]},{key:"arbitrum",chainId:42161,name:"Arbitrum One",rpcEnv:["ARBITRUM_RPC_URL","ARB_RPC_URL"],nativeCurrency:{symbol:"ETH",decimals:18},explorer:"https://arbiscan.io",dexscreenerSlug:"arbitrum",venueKind:"uniswap-v3",wrappedNative:"0x82aF49447D8a07e3bd95BD0d56f35241523fBab1",venues:[{kind:"quoter",address:"0x61fFE014bA17989E743c5F6cB21bF9697530B21e",label:"Uniswap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle returned a live sane price (WETH->USDC fee 500 quoted 1908.72 USDC). A contract that correctly prices a known pair IS a working V3 quoter",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:42161}},{kind:"router",address:"0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45",label:"Uniswap V3 SwapRouter02",verified:{method:"eth_getCode returned real bytecode on this chain and the paired quoter at the same deployment passed a live functional quote",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:42161}}]},{key:"avalanche",chainId:43114,name:"Avalanche C-Chain",rpcEnv:["AVALANCHE_RPC_URL","AVAX_RPC_URL"],nativeCurrency:{symbol:"AVAX",decimals:18},explorer:"https://snowtrace.io",dexscreenerSlug:"avalanche",venueKind:"uniswap-v3",wrappedNative:"0xB31f66AA3C1e785363F0875A1B74E27b85FD66c7",venues:[{kind:"quoter",address:"0xbe0F5544EC67e9B3b2D979aaA43f18Fd87E6257F",label:"Uniswap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle returned a live sane price (WAVAX->USDC fee 500 quoted 6.48 USDC). A contract that correctly prices a known pair IS a working V3 quoter",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:43114}},{kind:"router",address:"0xbb00FF08d01D300023C629E8fFfFcb65A5a578cE",label:"Uniswap V3 SwapRouter02",verified:{method:"eth_getCode returned real bytecode on this chain and the paired quoter at the same deployment passed a live functional quote",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:43114}}]}]);function sr(){return ct.map(e=>fo(Gs(e)))}function id(e){return fo(Gs(e))}var ar=new Map,PS=Object.keys(ce).map(Number),NS=Object.keys(Ve).map(Number),CS=ct.map(e=>e.chainId),Ks=new Set,sd=!1;function P(e){if(!e?.id)throw new Error("registerProvider requires id");if(!e.venue)throw new Error("registerProvider requires venue");if(!Array.isArray(e.ops))throw new Error("registerProvider requires ops[]");let t=String(e.id);if(sd&&Ks.has(t))throw new Error(`registerProvider refuses to overwrite built-in provider: ${t}`);return ar.set(t,{chainIds:e.chainIds||[],auth:e.auth||"none",description:e.description||"",baseEnv:e.baseEnv||[],...e,id:t}),ar.get(t)}function go(e){return ar.get(e)||null}function cr({venue:e,op:t}={}){let n=[...ar.values()];return e&&(n=n.filter(r=>r.venue===e)),t&&(n=n.filter(r=>r.ops.includes(t))),n}function TS(){Ks.clear();for(let e of ar.keys())Ks.add(e);sd=!0}P({id:"hl-info",venue:"hl",chainIds:[],auth:"none",ops:["health","allMids","l2Book","outcomeMeta","clearinghouse","userFills","meta","metaAndAssetCtxs","candleSnapshot","openOrders","frontendOpenOrders","userState","spotMeta"],baseEnv:["HL_INFO_URL","HL_API_URL"],description:"Hyperliquid public /info"});P({id:"hl-vaults",venue:"hyperliquid-vaults",chainIds:[],auth:"none",ops:["health","summaries","details","userEquities","tracker"],execution:"read-only",baseEnv:["HL_INFO_URL","HL_API_URL"],description:"Read-only Hyperliquid vault summaries, vault details, and user vault equities, including HLP tracking."});P({id:"protocol-templates",venue:"protocol-builder",chainIds:[],auth:"none",ops:["health","list","listNative","gate","prepareDeploy","buildNative"],description:"Gated EVM templates plus deterministic Solana program and Bitcoin policy scaffolds. Native bundles require chain-specific compile, tests, and simulation before any unsigned deploy/funding prepare. NOT a firm audit."});P({id:"poly-public",venue:"poly",chainIds:[137],auth:"none",ops:["health","time","markets","book","midpoint","spread","price","events"],baseEnv:["POLY_CLOB_URL","POLY_GAMMA_URL"],description:"Polymarket CLOB + Gamma public REST"});P({id:"portfolio",venue:"multichain-wallet",chainIds:[1,10,56,137,988,999,2741,4663,8453,42161,43114],auth:"none",ops:["health","balances","snapshot","history","valueGraph"],execution:"read-only",description:"Read-only balance aggregation across configured EVM chains, Solana, Bitcoin, and Hyperliquid, plus profile-local observation snapshots, history, and value graphs with explicit partial coverage."});P({id:"nft-portfolio",venue:"multichain-nft-wallet",chainIds:[1,10,137,988,999,2741,4663,8453,42161,43114],auth:"optionalApiKey",ops:["health","inventory","gallery","pnl","prepareList","traitSnipe"],execution:"prepare",baseEnv:["OPENSEA_API_KEY","MAGICEDEN_API_KEY","SATFLOW_API_KEY"],description:"Normalized EVM, Solana, and Bitcoin NFT inventory, static contact-sheet galleries, explicit PnL coverage, user-confirmed unsigned listing preparation, and evidence-gated trait-snipe buy intents."});P({id:"evm-simulate",venue:"onchain-simulation",chainIds:[1,10,56,137,988,999,2741,4663,8453,42161,43114],auth:"none",ops:["health","simulate"],execution:"read",baseEnv:[],description:"Pre-sign EVM transaction simulation: eth_call at pending state to catch reverts, decoded revert reasons (Error(string), Panic codes, custom-error selectors), and a buffered gas estimate. Distinguishes a genuine revert from an unreachable node \u2014 an infra failure is never reported as 'would fail'. A pass reflects current chain state and is explicitly not a guarantee."});P({id:"nft-mint",venue:"onchain-mint",chainIds:[1,10,56,137,988,999,2741,4663,8453,42161,43114],auth:"none",ops:["health","discover","prepare","priceGas","createTrigger","checkOpen"],execution:"prepare",baseEnv:[],description:"Prepare unsigned EVM NFT mints: discover the collection's mint entrypoint from bytecode, price a competitive EIP-1559 bid from fee-history percentiles, enforce gas-war caps, and surface contract risk. Triggers are alert_only unless explicitly armed with ORACLE_AUTONOMOUS_TRADING=1 plus a bounded grant. Never signs."});P({id:"contract-risk",venue:"onchain-bytecode",chainIds:[1,10,56,137,988,999,2741,4663,8453,42161,43114],auth:"none",ops:["health","scan"],execution:"read",baseEnv:[],description:"Structural contract risk from on-chain bytecode: retained owner powers (mint, blacklist, pause, fee changes) and upgradeability across EIP-1967, legacy zeppelinos, and EIP-1822 proxy slots. Complements behavioural sell simulation. Never reports 'safe' \u2014 a clean scan is weak evidence, not a guarantee."});P({id:"evm-token-sniper",venue:"evm-token-launches",chainIds:CS,auth:"none",ops:["health","scan"],execution:"prepare",baseEnv:ct.flatMap(e=>e.rpcEnv),description:"One generic EVM token-sniping path across every configured EVM chain: live identity, pools, structural risk, sell simulation, quote, and guarded unsigned transaction preparation. Robinhood Chain is the default, not a special implementation. Never signs or broadcasts."});P({id:"evm-rpc",venue:"evm",chainIds:[1,137,42161,8453,10,4663,999],auth:"none",ops:["health","healthAll","blockNumber","chainId","getBalance","call","erc20Allowance","erc20Balance","transactionReceipt"],baseEnv:["ETH_RPC_URL","POLYGON_RPC_URL","RH_CHAIN_RPC","BASE_RPC_URL","ARBITRUM_RPC_URL"],description:"EVM JSON-RPC multi-chain (env RPC or public fallbacks)"});P({id:"solana-rpc",venue:"solana",chainIds:[],auth:"none",ops:["health","latestBlockhash","getBalance","tokenAccounts","simulate"],baseEnv:["SOLANA_RPC_URL"],description:"Solana mainnet JSON-RPC read/prepare surface (no key, no signing, no broadcast)"});P({id:"bitcoin-esplora",venue:"bitcoin",chainIds:[],auth:"none",ops:["health","tipHeight","fees","address","utxos","tx","decode"],execution:"read-only",baseEnv:["BTC_ESPLORA_URL","BTC_NETWORK"],description:"Bitcoin L1 via Esplora (mempool.space/Blockstream). Reads only on data plane. User-signed broadcast is bitcoin_send on exec MCP. No Core RPC, no house keys. Wallets: Xverse/UniSat/Leather/OKX/Phantom"});P({id:"bitcoin-meta",venue:"bitcoin-metaprotocol",chainIds:[],auth:"optionalApiKey",ops:["health","runeBalances","inscriptions","inscriptionInfo","inscriptionChildren","ordBlockInfo"],execution:"read-only",baseEnv:["BTC_META_API_URL","UNISAT_API_KEY","BESTINSLOT_API_KEY"],description:"Bitcoin ordinals/runes reads. Keyless tier via ordinals.com recursive (inscriptionInfo/children/blockInfo); address-indexed ops (inscriptions, runeBalances) need a keyed indexer. Hiro is deprecated (410) and Magic Eden BTC is dead \u2014 use satflow for market."});P({id:"satflow",venue:"bitcoin-marketplace",chainIds:[],auth:"apiKey",ops:["health","collectionFloors","collectionStats","item","walletContents","floorListings","preparePurchase","prepareList"],execution:"prepare",baseEnv:["SATFLOW_API_KEY","SATFLOW_API_URL"],description:"Satflow ordinals+runes marketplace (api.satflow.com). Primary BTC NFT market after Magic Eden BTC sunset. PSBT intents for buy/list; key via x-api-key."});P({id:"jupiter",venue:"solana-dex",chainIds:[],auth:"none",ops:["health","venues","quote","prepare"],execution:"prepare",baseEnv:["JUPITER_SWAP_API_URL","SOLANA_RPC_URL"],description:"Jupiter Swap API v1 quote + unsigned user-signature swap transaction preparation"});P({id:"hl-perps",venue:"hyperliquid",chainIds:[],auth:"none",ops:["health","assetInfo","prepareOrder","prepareCancel","prepareLeverage","prepareIsolatedMargin","prepareBracket","prepareBuilderApproval"],notes:"Hyperliquid perp orders/leverage. PREPARE-ONLY: returns signable actions, never submits."});P({id:"hl-markets",venue:"hyperliquid",chainIds:[],auth:"none",ops:["health","markets","leaderboards","coin","spot"],notes:"Joined Hyperliquid market datapoints for the Hyperliquid agent. Read-only."});P({id:"hl-staking",venue:"hypercore-staking",chainIds:[],auth:"none",ops:["health","validators","delegatorSummary","delegations","rewards","history","preflight","prepareStakeDeposit","prepareStakeWithdraw","prepareDelegate"],execution:"prepare",baseEnv:["HL_INFO_URL","HL_EXCHANGE_URL","HL_TESTNET"],description:"Hyperliquid HyperCore HYPE staking. Public reads (validators, delegations, rewards) plus EIP-712 prepare for cDeposit / cWithdraw / tokenDelegate. Prepare-only: the user's wallet signs and submits, Oracle never posts to /exchange."});P({id:"magiceden-sol",venue:"solana-nft",chainIds:[],auth:"optionalApiKey",ops:["health","stats","listings","tokenListings","prepareBuy","prepareList","prepareMint"],execution:"prepare",baseEnv:["MAGICEDEN_API_KEY","MAGICEDEN_API_URL"],description:"Magic Eden Solana NFT market. Reads (stats/listings) are keyless; buy/list/mint instruction builders need MAGICEDEN_API_KEY and return an unsigned base64 transaction for the user's Solana wallet. Never signs or broadcasts."});P({id:"defillama",venue:"prices",chainIds:[],auth:"none",ops:["health","prices","pricesBySymbol","protocols","yields","stablecoins","dexVolumes"],baseEnv:["DEFILLAMA_COINS_URL","DEFILLAMA_API_URL"],description:"DeFiLlama public prices + protocols TVL"});P({id:"lifi",venue:"dex",chainIds:[1,10,56,137,988,999,2741,4663,8453,42161,43114],auth:"none",ops:["health","quote","prepare","chains"],execution:"prepare",baseEnv:["LIFI_API_URL"],description:"LI.FI public cross-chain / DEX aggregator quotes (no key)"});P({id:"dexscreener",venue:"dex",chainIds:[],auth:"none",ops:["health","token","search","pair"],baseEnv:["DEXSCREENER_API_URL"],description:"DexScreener public token/pair discovery"});P({id:"uniswap-v3",venue:"dex",chainIds:PS,auth:"none",ops:["health","quote","prepare","quotePath","ethUsdc","chains"],execution:"prepare",baseEnv:["ETH_RPC_URL","BASE_RPC_URL","ARBITRUM_RPC_URL","OPTIMISM_RPC_URL","BSC_RPC_URL","POLYGON_RPC_URL","AVALANCHE_RPC_URL","RH_CHAIN_RPC"],description:"Uniswap V3 QuoterV2 exact-in quotes via eth_call across official deployments plus Robinhood Chain, no key"});P({id:"uniswap-v4",venue:"dex",chainIds:NS,auth:"none",ops:["health","quote","chains"],execution:"read-only",baseEnv:["ETH_RPC_URL","BASE_RPC_URL","ARBITRUM_RPC_URL","OPTIMISM_RPC_URL","BSC_RPC_URL","POLYGON_RPC_URL","AVALANCHE_RPC_URL","RH_CHAIN_RPC"],description:"Uniswap V4 Quoter exact-in quotes via eth_call across official deployments plus Robinhood Chain. Quote-only until Universal Router prepare is classified."});P({id:"aerodrome",venue:"dex",chainIds:[8453],auth:"none",ops:["health","quote","prepare","chains"],execution:"prepare",baseEnv:["BASE_RPC_URL"],description:"Aerodrome Slipstream CL on Base \u2014 QuoterV2 + SwapRouter exact-input via eth_call (tickSpacing, no key)"});P({id:"zerox",venue:"dex",chainIds:[1,10,137,8453,42161],auth:"apiKey",ops:["health","price","quote","prepare"],execution:"prepare",baseEnv:["ZEROX_API_KEY","ZEROX_API_URL"],description:"0x Swap API v2 price/quote/prepare \u2014 requires ZEROX_API_KEY (unconfigured without key; no Oracle key shipped)"});P({id:"across",venue:"bridge",chainIds:[1,10,137,42161,8453],auth:"none",ops:["health","suggestedFees"],baseEnv:["ACROSS_API_URL"],description:"Across bridge suggested-fees (public)"});P({id:"hop",venue:"bridge",chainIds:[1,10,137,42161],auth:"none",ops:["health","quote"],baseEnv:["HOP_API_URL"],description:"Hop Protocol bridge quotes (public)"});P({id:"relay",venue:"bridge",chainIds:[1,10,137,8453,42161],auth:"none",ops:["health","quote","prepare"],execution:"prepare",baseEnv:["RELAY_API_URL"],description:"Relay.link bridge/swap quotes (public)"});P({id:"cowswap",venue:"dex",chainIds:[1,100,42161,8453],auth:"none",ops:["health","quote","prepareOrder","order","status","chains"],execution:"intent",baseEnv:[],description:"CowSwap batch auction quotes + guarded EIP-712 order intents (public)"});P({id:"oneinch",venue:"dex",chainIds:[1,10,137,8453,42161],auth:"apiKey",ops:["health","quote","prepare","approveSpender"],execution:"prepare",baseEnv:["ONEINCH_API_KEY","ONEINCH_API_URL"],description:"1inch Swap API v6 quote/prepare \u2014 requires ONEINCH_API_KEY (unconfigured without key; no Oracle key shipped)"});P({id:"hl-ws",venue:"hl",chainIds:[],auth:"none",ops:["health","allMids","l2Book","snapshot"],baseEnv:["HL_WS_URL"],description:"Hyperliquid short-lived WS snapshots (allMids/l2Book)"});P({id:"poly-ws",venue:"poly",chainIds:[137],auth:"none",ops:["health","book","snapshot"],baseEnv:["POLY_WS_URL"],description:"Polymarket CLOB short-lived WS market snapshots"});P({id:"opensea-nft",venue:"nft",chainIds:[1,10,137,988,999,2741,4663,8453,42161,43114],auth:"apiKey",ops:["health","collection","floor","accountNfts","accountPnl","prepareList"],execution:"prepare",baseEnv:["OPENSEA_API_KEY","OPENSEA_ENV_FILE"],description:"OpenSea multichain NFT inventory, estimated values, indexed account PnL, collection floors, and unsigned listing actions"});P({id:"hyperevm-dex",venue:"hyperevm",chainIds:[999],auth:"none",ops:["health","search","token"],baseEnv:["HYPEREVM_RPC_URL"],description:"HyperEVM pair discovery via DexScreener + optional RPC"});P({id:"geckoterminal",venue:"dex-data",chainIds:[],auth:"none",ops:["health","networks","pool","token","ohlcv"],baseEnv:["GECKOTERMINAL_API_URL"],description:"GeckoTerminal public networks, pools, tokens, and OHLCV"});P({id:"curve",venue:"dex",chainIds:[1,10,56,137,988,999,4663,8453,42161,43114],auth:"none",ops:["health","openapi","pools","quote","prepare"],execution:"prepare",baseEnv:["CURVE_API_URL"],description:"Curve public pool registry API + RouterNG validated single-hop prepare"});P({id:"gmx",venue:"perps-data",chainIds:[42161,43114],auth:"none",ops:["health","tickers","markets","marketsInfo","tokens","prepareOrder","positions","orderStatus","verifyOrder"],execution:"intent",baseEnv:[],description:"GMX v2 public oracle/markets plus guarded async order intents on Arbitrum and Avalanche"});P({id:"morpho",venue:"lending-data",chainIds:[1,10,137,2741,8453,42161,4663,999,988],auth:"none",ops:["health","markets","vaults","prepareVault"],execution:"intent",baseEnv:["MORPHO_API_URL"],description:"Morpho public GraphQL markets/vaults + guarded ERC-4626 vault intents"});P({id:"balancer",venue:"dex",chainIds:[1,10,137,42161,43114,8453],auth:"none",ops:["health","pools","quote","prepare"],execution:"prepare",baseEnv:["BALANCER_API_URL"],description:"Balancer public GraphQL pool data + v3 Router exact-input prepare (Polygon read-only)"});P({id:"pendle",venue:"yield",chainIds:[1,10,56,8453,42161,999],auth:"none",ops:["health","markets","quote","prepare"],execution:"prepare",baseEnv:["PENDLE_API_URL"],description:"Pendle public yield-market API + Hosted SDK direct Convert prepare"});P({id:"odos",venue:"dex",chainIds:[1,10,56,137,8453,42161,43114,4663],auth:"none",ops:["health","chains","quote","prepare"],execution:"unavailable",deprecated:{since:"2026-07-30",reason:"Odos sunset the public SOR API; /sor/quote/v2 and v3 both return 410 Gone",evidence:"sunset: Thu, 30 Jul 2026 12:00:00 GMT response header"},baseEnv:["ODOS_API_URL"],description:"Odos public SOR (DEPRECATED upstream 2026-07-30 -- endpoint returns 410)"});P({id:"blockscout",venue:"explorer",chainIds:[1,10,137,8453,42161],auth:"none",ops:["health","stats","address","token"],baseEnv:[],description:"Verified public Blockscout REST v2 instances"});P({id:"paraswap",venue:"dex",chainIds:[1,10,56,137,8453,42161,43114,4663],auth:"none",ops:["health","tokens","price","quote","prepare"],execution:"prepare",baseEnv:["PARASWAP_API_URL"],description:"ParaSwap/Velora public price routes + validated transaction builder"});P({id:"rfq",venue:"intent-rfq",chainIds:[1,10,56,137,8453,42161,43114,4663],auth:"none",ops:["health","intent","quote"],execution:"prepare",baseEnv:["ZEROX_API_KEY","ONEINCH_API_KEY"],description:"Cross-chain RFQ intent normalizer and firm-quote fanout over reviewed venues. Prepares artifacts only, never signs or broadcasts."});P({id:"execution-strategies",venue:"oracle-native",chainIds:[],auth:"none",ops:["health","plan"],execution:"plan-only",baseEnv:[],description:"Oracle-native TWAP, VWAP, POV, iceberg, and implementation-shortfall planners. No Tread.fi/API dependency. Plans never sign or broadcast; every slice requires a fresh best-execution quote, policy check, simulation, confirmation, wallet signature, and receipt."});TS();P({id:"polygon-staking",venue:"polygon-staking",chainIds:[137],auth:"none",ops:["health","validators","validatorDetail"],baseEnv:["POLYGON_STAKING_API_URL"],description:"Polygon POS staking validators"});P({id:"babylon-staking",venue:"btc-staking",chainIds:[],auth:"none",ops:["health","stats","finalityProviders","delegations"],execution:"read-only",baseEnv:["BABYLON_STAKING_API_URL"],description:"Babylon native BTC staking (staking-api.babylonlabs.io v2). Keyless per-staker positions from a PUBLIC key alone \u2014 APR, TVL, finality-provider roster, and delegations. Read-only; staking/unbonding is user-wallet."});P({id:"mempool-mining",venue:"btc-mining",chainIds:[],auth:"none",ops:["health","difficulty","poolShare","hashrate","rewardStats"],execution:"read-only",baseEnv:["MEMPOOL_API_URL"],description:"Bitcoin mining + network security telemetry via mempool.space /api/v1/mining. Difficulty retarget, pool concentration (top-1/top-3 share), hashrate trend, subsidy-vs-fee split."});P({id:"liquid-esplora",venue:"liquid",chainIds:[],auth:"none",ops:["health","tipHeight","addressInfo","assetInfo"],execution:"read-only",baseEnv:["LIQUID_ESPLORA_URL"],description:"Liquid Network (Blockstream sidechain) via Esplora. Same schema as bitcoin-esplora plus multi-asset issuance/peg stats. Confidential addresses return TXO counts only \u2014 amounts are blinded on chain and reported as such."});P({id:"hiro-stacks",venue:"stacks",chainIds:[],auth:"none",ops:["health","networkInfo","stackingInfo","poxCycles","blocks"],execution:"read-only",baseEnv:["HIRO_API_URL","HIRO_API_KEY"],description:"Stacks (Bitcoin L2) via Hiro public API. Network tip, PoX stacking state (the BTC-yield mechanism), and historical reward cycles. Keyless tier is ~20 rps; HIRO_API_KEY is optional and never required."});P({id:"ordinals-runes",venue:"btc-runes",chainIds:[],auth:"none",ops:["health","blockHeight","blockInfo","satInfo","runeInfo"],execution:"read-only",baseEnv:["ORDINALS_BASE_URL"],description:"Runes + sat/block index via a public ord server (ordinals.com). /r/blockheight is PLAIN TEXT; the /runes listing is 406 'JSON API disabled' so only per-rune lookup exists; rune names must drop the bullet spacer (UNCOMMONGOODS)."});P({id:"mempool-lightning",venue:"btc-lightning",chainIds:[],auth:"none",ops:["health","statistics","nodeRankings","nodeCountries"],execution:"read-only",baseEnv:["MEMPOOL_API_URL"],description:"Lightning Network topology via mempool.space. Capacity/channel/node aggregates, node rankings, country distribution. STALE-PRONE: the crawler snapshot has been observed weeks behind, so every response carries ageDays + a stale flag."});P({id:"bob-rootstock",venue:"btc-l2",chainIds:[60808,30],auth:"none",ops:["health","stats","addressInfo","tokenBalances"],execution:"read-only",baseEnv:["BOB_EXPLORER_URL","ROOTSTOCK_EXPLORER_URL"],description:"BOB (60808) and Rootstock (30) \u2014 the EVM Bitcoin L2s \u2014 via their Blockscout v2 instances (identical schema, one code path). Chain stats, gas prices, native balances, token holdings. Pass chainId 'all' to fan out."});P({id:"bisq-markets",venue:"bisq",chainIds:[],auth:"none",ops:["health","markets","ticker","trades"],execution:"read-only",baseEnv:["BISQ_MARKETS_URL"],description:"Bisq non-KYC P2P BTC price discovery (markets.bisq.network). Value is the BASIS against centralized spot, not the absolute print: volume is thin and the last trade can be hours old, so trade age is always reported."});P({id:"magiceden-ordinals",venue:"btc-ordinals-market",chainIds:[],auth:"none",ops:["health","collectionStat"],execution:"read-only",baseEnv:["MAGICEDEN_ORD_API_URL","MAGICEDEN_API_KEY","MAGICEDEN_PROBE_COLLECTION"],description:"Magic Eden ordinals collection stats. DEGRADED UPSTREAM: /v2/ord/btc/* returned 503 'no healthy upstream' on every verification attempt. health() reports ok:false while it is down and collectionStat() returns upstreamDown:true with fallback 'satflow' instead of throwing. Only /stat is wired; 600 req/min documented."});P({id:"braiins-insights",venue:"btc-mining",chainIds:[],auth:"none",ops:["health","priceStats","poolStats"],execution:"read-only",baseEnv:["BRAIINS_INSIGHTS_URL"],description:"Braiins mining insights \u2014 BTC price tick + per-pool block/hashrate distribution. Use insights.braiins.com (302s to learn.braiins.com, followed transparently); pool.braiins.com/api is 403 and is NOT the public API."});P({id:"pyth-price-feeds",venue:"solana-oracle",chainIds:[],auth:"none",ops:["health","latestPrice","latestPrices","feedDirectory"],baseEnv:["PYTH_HERMES_URL"],description:"Pyth Network: Solana price feeds with confidence intervals, real-time updates, zero auth"});P({id:"solend-lending",venue:"solana-lending",chainIds:[],auth:"none",ops:["health","markets","reserves"],baseEnv:["SAVE_API_URL"],description:"Solend/Save lending: markets + per-reserve supply/borrow APY, Solana's Aave equivalent (keyless)"});P({id:"jito-mev",venue:"solana-mev",chainIds:[],auth:"none",ops:["health","recentBundles","tipFloor"],baseEnv:["JITO_API_URL"],description:"Jito MEV: recent bundles, tippers, tip floor \u2014 real-time Solana MEV data (keyless)"});P({id:"sanctum-lst",venue:"solana-staking",chainIds:[],auth:"none",ops:["health","lstList","apyAll","apyIndividual"],baseEnv:["SANCTUM_API_URL"],description:"Sanctum LST: liquid staking tokens with per-token APY \u2014 JitoSOL, mSOL, bSOL, compSOL, pathSOL, etc. (keyless)"});P({id:"kamino-strategies",venue:"solana-yield",chainIds:[],auth:"none",ops:["health","strategies","strategyMetrics"],baseEnv:["KAMINO_API_URL"],description:"Kamino: live yield strategies with APY, TVL, vault balances (keyless)"});P({id:"meteora-dlmm",venue:"solana-dex",chainIds:[],auth:"none",ops:["health","pools","poolSearch"],baseEnv:["METEORA_API_URL"],description:"Meteora DLMM: concentrated liquidity pools via amm-v2 API, distinct from Jupiter DEX routes (keyless)"});P({id:"aave-v3",venue:"evm-lending",chainIds:[1,10,56,137,59144,1088,534352,8453,42161,43114,5e3,1868],auth:"none",ops:["health","markets","marketReserves","chains"],baseEnv:["AAVE_V3_API_URL"],description:"Aave V3 GraphQL: multi-chain lending, full market + reserve schema with supplyInfo/borrowInfo (keyless)"});P({id:"cow-protocol",venue:"evm-intent",chainIds:[1,100,42161],auth:"none",ops:["health","auction","openOrders","recentTrades"],baseEnv:["COW_API_URL"],description:"CoW Protocol: intent/solver auction data, open orders, trades \u2014 intent-based DEX not covered by existing providers (keyless)"});P({id:"relayscan-mev",venue:"evm-mev",chainIds:[1],auth:"none",ops:["health","overview","builderProfit","dailyStats"],baseEnv:["RELAYSCAN_API_URL"],description:"Relayscan: MEV relay overview, builder profit rankings, daily block stats (keyless)"});P({id:"birdeye-tokens",venue:"solana-tokens",chainIds:[],auth:"none",ops:["health","tokenList"],baseEnv:["BIRDEYE_API_URL"],description:"Birdeye public token list: Solana tokens ranked by 24h volume, market cap (keyless)"});P({id:"das-assets",venue:"solana-nft",chainIds:[],auth:"none",ops:["health","assetsByOwner","searchAssets","assetProof"],baseEnv:["SOLANA_RPC_URL"],description:"Digital Asset Standard (DAS): compressed NFT reads via public Solana RPC \u2014 getAssetsByOwner, searchAssets, assetProof. No Helius key needed."});P({id:"symbiotic-restaking",venue:"evm-restaking",chainIds:[1],auth:"none",ops:["health","vaults","vaultDetail"],baseEnv:["SYMBIOTIC_API_URL"],description:"Symbiotic restaking: vaults with collateral data, approved status, operator metadata (keyless)"});P({id:"beefy-yields",venue:"evm-yield",chainIds:[1,10,56,137,8453,42161,43114,250,1088],auth:"none",ops:["health","apy","apyBreakdown"],baseEnv:["BEEFY_API_URL"],description:"Beefy Finance: cross-chain yield aggregator vaults with APY breakdowns (keyless)"});P({id:"across-bridge",venue:"evm-bridge",chainIds:[1,10,42161,8453,324,59144],auth:"none",ops:["health","pools","suggestedFees"],baseEnv:["ACROSS_API_URL"],description:"Across bridge: pool liquidity + APY per bridge pool with suggested fees (keyless)"});P({id:"spark-lend",venue:"evm-lending",chainIds:[1],auth:"none",ops:["health","markets"],baseEnv:["SPARK_API_URL"],description:"Spark Lend / Sky Savings: ERC-4626 vault APY + TVL + user count (keyless)"});P({id:"l2beat-tvl",venue:"evm-l2",chainIds:[],auth:"none",ops:["health","tvl","activity"],baseEnv:["L2BEAT_API_URL"],description:"L2Beat: L2 scaling TVL, project-level breakdowns, activity metrics (keyless)"});P({id:"celestia-da",venue:"evm-da",chainIds:[],auth:"none",ops:["health","stats","blockStats"],baseEnv:["CELENIUM_API_URL"],description:"Celestia DA via Celenium: blob stats, block-level blob counts, network metrics (keyless)"});T();T();var OS="https://api.hyperliquid.xyz/info",RS="https://api.hyperliquid-testnet.xyz/info";function $S({testnet:e,baseUrl:t}={}){if(t)return t.replace(/\/$/,"").endsWith("/info")?t:`${t.replace(/\/$/,"")}/info`;if(process.env.HL_INFO_URL)return process.env.HL_INFO_URL;if(process.env.HL_API_URL){let n=process.env.HL_API_URL.replace(/\/$/,"");return n.endsWith("/info")?n:`${n}/info`}return e||process.env.HL_TESTNET==="1"?RS:OS}async function G(e,t={}){if(!e||!e.type)throw new Error("hlInfo requires body.type");let n=$S(t);return y(n,{method:"POST",body:e,fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function ad(e={}){let t=await G({type:"allMids"},e),n=t&&typeof t=="object"?Object.keys(t).length:0;return{ok:n>0,midCount:n}}async function Je(e={}){return G({type:"allMids"},e)}async function yo(e,t={}){if(!e)throw new Error("hlL2Book requires coin");return G({type:"l2Book",coin:String(e)},t)}async function lr(e={}){return G({type:"outcomeMeta"},e)}async function bo(e,t={}){if(!e)throw new Error("hlClearinghouse requires user address");return G({type:"spotClearinghouseState",user:e},t)}async function cd(e,t={}){if(!e)throw new Error("hlUserFills requires user address");return G({type:"userFills",user:e},t)}async function wo(e={}){return G({type:"meta"},e)}async function on(e={}){let t={type:"metaAndAssetCtxs"};return e.dex&&(t.dex=e.dex),G(t,e)}async function sn({coin:e,interval:t="1h",startTime:n,endTime:r},o={}){if(!e)throw new Error("hlCandleSnapshot requires coin");let i={type:"candleSnapshot",req:{coin:String(e),interval:t,startTime:n??Date.now()-24*3600*1e3,endTime:r??Date.now()}};return G(i,o)}async function ld({coin:e,startTime:t,endTime:n},r={}){if(!e)throw new Error("hlFundingHistory requires coin");return G({type:"fundingHistory",coin:String(e),startTime:t??Date.now()-24*3600*1e3,endTime:n??Date.now()},r)}async function ud(e,t={}){if(!e)throw new Error("hlOpenOrders requires user");return G({type:"openOrders",user:e},t)}async function dd(e,t={}){if(!e)throw new Error("hlFrontendOpenOrders requires user");return G({type:"frontendOpenOrders",user:e},t)}async function xo(e,t={}){if(!e)throw new Error("hlUserState requires user");return G({type:"clearinghouseState",user:e},t)}async function So(e={}){return G({type:"spotMeta"},e)}var MS=/^0x[0-9a-fA-F]{40}$/,md="0xdfc24b077bc1425ad1dea75bcb6f8158e10df303";function Ys(e,t){let n=String(e||"").trim();if(!MS.test(n))throw new Error(`hl-vaults: ${t} must be a 0x EVM address`);return n.toLowerCase()}function pd(e){if(e==null||e==="")return null;let t=Number(e);return Number.isFinite(t)?t:null}function fd(e={}){let t=Array.isArray(e.portfolio)?e.portfolio:[],n=t.find(([i])=>i==="day")?.[1]||null,r=Array.isArray(n?.accountValueHistory)?n.accountValueHistory:[],o=Array.isArray(n?.pnlHistory)?n.pnlHistory:[];return{name:e.name??null,vaultAddress:e.vaultAddress??e.address??null,leader:e.leader??null,description:e.description??null,tvl:e.tvl??r.at(-1)?.[1]??null,apr:e.apr??null,pnl:e.pnl??o.at(-1)?.[1]??null,isClosed:e.isClosed??null,allowDeposits:e.allowDeposits??null,maxDistributable:e.maxDistributable??null,followers:e.followers??null,portfolio:t}}function US(e){return[...e].sort((t,n)=>(pd(n.tvl)??-1)-(pd(t.tvl)??-1))}function Xs(e){return e.hlInfo||G}async function Qs(e={},t={}){let n=await Xs(t)({type:"vaultSummaries"},t),r=US((Array.isArray(n)?n:[]).map(fd));return{provider:"hl-vaults",count:r.length,vaults:r,exec:!1,raw:n}}async function ko(e={},t={}){let r={type:"vaultDetails",vaultAddress:Ys(e.vaultAddress||e.address,"vaultAddress")};e.user&&(r.user=Ys(e.user,"user"));let o=await Xs(t)(r,t);return{provider:"hl-vaults",vault:fd(o||{}),exec:!1,raw:o}}async function Js(e={},t={}){let n=Ys(e.user||e.address,"user"),r=await Xs(t)({type:"userVaultEquities",user:n},t),o=(Array.isArray(r)?r:[]).map(i=>({vaultAddress:i.vaultAddress??i.address??null,equity:i.equity??i.vaultEquity??null}));return{provider:"hl-vaults",user:n,count:o.length,positions:o,exec:!1,raw:r}}async function Zs(e={},t={}){let n=String(e.mode||"hlp").toLowerCase();if(n==="hlp")return ko({...e,vaultAddress:md},t);if(n==="summaries")return Qs(e,t);if(n==="details")return ko(e,t);if(n==="mine")return Js(e,t);throw new Error("hl-vaults: mode must be hlp, summaries, details, or mine")}async function hd(e={}){try{let t=await Zs({mode:"hlp"},e);return{ok:t.vault.vaultAddress===md&&!!t.vault.name,provider:"hl-vaults",hlp:{name:t.vault.name,vaultAddress:t.vault.vaultAddress,tvl:t.vault.tvl,apr:t.vault.apr,allowDeposits:t.vault.allowDeposits},exec:!1}}catch(t){return{ok:!1,provider:"hl-vaults",error:String(t?.message||t).slice(0,160),exec:!1}}}T();var DS="https://clob.polymarket.com",FS="https://gamma-api.polymarket.com";function ur(e={}){return(e.clobUrl||process.env.POLY_CLOB_URL||DS).replace(/\/$/,"")}function gd(e={}){return(e.gammaUrl||process.env.POLY_GAMMA_URL||FS).replace(/\/$/,"")}async function ea(e={}){return y(`${ur(e)}/time`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs})}async function yd(e={}){let t=await ea(e);return{ok:t!=null&&t!=="",time:t}}async function bd({limit:e=5,offset:t=0,...n}={},r={}){let o=new URLSearchParams({limit:String(e),offset:String(t),...Object.fromEntries(Object.entries(n).filter(([,i])=>i!=null).map(([i,s])=>[i,String(s)]))});return y(`${gd(r)}/markets?${o}`,{fetchImpl:r.fetchImpl,timeoutMs:r.timeoutMs})}async function wd(e,t={}){if(!e)throw new Error("polyBook requires tokenId");let n=new URLSearchParams({token_id:String(e)});return y(`${ur(t)}/book?${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function xd(e,t={}){if(!e)throw new Error("polyMidpoint requires tokenId");let n=new URLSearchParams({token_id:String(e)});return y(`${ur(t)}/midpoint?${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function Sd(e,t={}){if(!e)throw new Error("polySpread requires tokenId");let n=new URLSearchParams({token_id:String(e)});return y(`${ur(t)}/spread?${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function kd(e,{side:t="buy"}={},n={}){if(!e)throw new Error("polyPrice requires tokenId");let r=new URLSearchParams({token_id:String(e),side:String(t)});return y(`${ur(n)}/price?${r}`,{fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs})}async function vd({limit:e=5,offset:t=0,...n}={},r={}){let o=new URLSearchParams({limit:String(e),offset:String(t),...Object.fromEntries(Object.entries(n).filter(([,i])=>i!=null).map(([i,s])=>[i,String(s)]))});return y(`${gd(r)}/events?${o}`,{fetchImpl:r.fetchImpl,timeoutMs:r.timeoutMs})}T();import{createHash as Ed}from"node:crypto";var an="mainnet-beta",HS="https://api.mainnet-beta.solana.com",ta="TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA";function jS(e={}){return String(e.rpcUrl||process.env.SOLANA_RPC_URL||HS).trim()}function K(e,t="address"){let n=String(e||"").trim();if(!/^[1-9A-HJ-NP-Za-km-z]{32,44}$/.test(n))throw new Error(`solana-rpc: ${t} must be a base58 public key`);return n}function VS(e,t){return t?[...e,{commitment:t}]:e}async function dr(e,t=[],n={}){let r=String(e||"");if(r==="sendTransaction"||r==="sendRawTransaction"||r==="requestAirdrop"||r==="requestAirDrop"||/airdrop/i.test(r)||/^send/i.test(r))throw new Error(`solana-rpc: ${r} refused \u2014 @oracle-agent/oracle is prepare-only (no broadcast/airdrop)`);let o=await y(jS(n),{method:"POST",body:{jsonrpc:"2.0",id:n.id||1,method:e,params:t},fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs??12e3});if(o?.error)throw new Error(`solana-rpc ${e}: ${o.error.message||JSON.stringify(o.error)}`);return o?.result}async function na(e={},t={}){let n=e.commitment?[{commitment:e.commitment}]:[],r=await dr("getLatestBlockhash",n,t);return{provider:"solana-rpc",cluster:an,blockhash:r?.value?.blockhash||null,lastValidBlockHeight:r?.value?.lastValidBlockHeight??null,slot:r?.context?.slot??null,raw:r}}async function Ad(e={}){try{let[t,n]=await Promise.all([dr("getHealth",[],e),na({},e)]);return{ok:t==="ok",provider:"solana-rpc",cluster:an,health:t,latestBlockhash:n,exec:!1}}catch(t){return{ok:!1,provider:"solana-rpc",cluster:an,error:String(t?.message||t),exec:!1}}}async function vo(e={},t={}){let n=K(e.address||e.owner,"address"),r=await dr("getBalance",VS([n],e.commitment),t);return{provider:"solana-rpc",cluster:an,address:n,lamports:String(r?.value??0),slot:r?.context?.slot??null,raw:r}}function zS(e={}){let t=e.account?.data?.parsed?.info||{},n=t.tokenAmount||{};return{pubkey:e.pubkey,mint:t.mint||null,owner:t.owner||null,amount:String(n.amount??"0"),decimals:n.decimals??null,uiAmount:n.uiAmount??null,uiAmountString:n.uiAmountString??null,raw:e}}async function pr(e={},t={}){let n=K(e.owner||e.address,"owner"),r=e.mint?{mint:K(e.mint,"mint")}:{programId:K(e.programId||ta,"token program")},o={encoding:"jsonParsed"};e.commitment&&(o.commitment=e.commitment);let i=await dr("getTokenAccountsByOwner",[n,r,o],t),s=Array.isArray(i?.value)?i.value.map(zS):[];return{provider:"solana-rpc",cluster:an,owner:n,filter:r,slot:i?.context?.slot??null,accounts:s,raw:i}}function WS(e){let t=String(e||"").trim();if(!/^[A-Za-z0-9+/]+={0,2}$/.test(t)||t.length%4!==0)throw new Error("solana-rpc: transaction must be base64");return t}function GS(e,t){let n=0,r=0,o=t;for(let i=0;i<3;i++){if(o>=e.length)throw new Error("solana-rpc: transaction shortvec truncated");let s=e[o++];if(n|=(s&127)<<r,(s&128)===0)return{value:n,offset:o};r+=7}throw new Error("solana-rpc: transaction shortvec too long")}function KS(e){let t=Buffer.from(e,"base64");try{let n=GS(t,0),r=n.offset+n.value*64;if(r>=t.length)throw new Error("missing message");return Ed("sha256").update(t.subarray(r)).digest("hex")}catch{return Ed("sha256").update(t).digest("hex")}}async function Id(e={},t={}){let n=WS(e.transaction||e.swapTransaction),r={encoding:"base64",sigVerify:!!e.sigVerify,replaceRecentBlockhash:e.replaceRecentBlockhash!==!1};e.commitment&&(r.commitment=e.commitment);let o=await dr("simulateTransaction",[n,r],t),i=o?.value||{};return{provider:"solana-rpc",cluster:an,ok:i.err==null,transactionHash:KS(n),err:i.err??null,logs:i.logs||[],unitsConsumed:i.unitsConsumed??null,replacementBlockhash:i.replacementBlockhash||null,slot:o?.context?.slot??null,raw:o}}T();var XS="mainnet",QS="https://mempool.space/api",JS="https://mempool.space/testnet/api";function ze(e={}){return String(e.network||process.env.BTC_NETWORK||XS).trim().toLowerCase()==="testnet"?"testnet":"mainnet"}function oa(e={}){return e.baseUrl?String(e.baseUrl).replace(/\/$/,""):process.env.BTC_ESPLORA_URL?String(process.env.BTC_ESPLORA_URL).replace(/\/$/,""):ze(e)==="testnet"?JS:QS}function ra(e){let t=String(e||"");try{let n=new URL(t);(n.username||n.password)&&(n.username="[REDACTED]",n.password="");for(let r of[...n.searchParams.keys()])/^(key|api[_-]?key|token|secret|password|auth|bearer)$/i.test(r)&&n.searchParams.set(r,"[REDACTED]");t=n.toString().replace(/\/$/,"")}catch{}return t.replace(/(https?:\/\/)([^\s/:@]+):([^\s@/]+)@/gi,"$1[REDACTED]@").replace(/([?&](?:key|api[_-]?key|token|secret|password|auth|bearer)=)[^&\s]+/gi,"$1[REDACTED]")}function Ze(e,t="address"){let n=String(e||"").trim();if(!/^(bc1|tb1|bcrt1)[a-z0-9]{20,90}$/i.test(n)&&!/^[13mn2][a-km-zA-HJ-NP-Z1-9]{25,34}$/.test(n))throw new Error(`bitcoin-esplora: ${t} must look like a Bitcoin address`);return n}function ZS(e,t="txHex"){let n=String(e||"").trim().toLowerCase().replace(/^0x/,"");if(!/^[0-9a-f]+$/.test(n)||n.length<20||n.length%2!==0)throw new Error(`bitcoin-esplora: ${t} must be even-length hex`);return n}async function ia(e,t={}){let n=`${oa(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(`bitcoin-esplora GET ${e}: HTTP ${o.status} ${i.slice(0,160)}`);return i}async function Eo(e,t={}){let n=await ia(e,t);try{return JSON.parse(n)}catch{return n}}async function _d(e={}){try{let t=await ia("/blocks/tip/height",e),n=Number(t);return{ok:Number.isFinite(n)&&n>0,provider:"bitcoin-esplora",network:ze(e),baseUrl:ra(oa(e)),tipHeight:n,exec:!1,signing:"user-wallet"}}catch(t){return{ok:!1,provider:"bitcoin-esplora",network:ze(e),baseUrl:ra(oa(e)),error:ra(t?.message||t),exec:!1}}}async function Pd(e={}){let t=await ia("/blocks/tip/height",e);return{provider:"bitcoin-esplora",network:ze(e),tipHeight:Number(t)}}async function Nd(e={}){try{let t=await Eo("/v1/fees/recommended",e);return{provider:"bitcoin-esplora",network:ze(e),fastestFee:t.fastestFee??null,halfHourFee:t.halfHourFee??null,hourFee:t.hourFee??null,economyFee:t.economyFee??null,minimumFee:t.minimumFee??null,raw:t}}catch{return{provider:"bitcoin-esplora",network:ze(e),fastestFee:null,halfHourFee:null,hourFee:null,note:"fee endpoint unavailable on this Esplora host"}}}async function Ao(e={},t={}){let n=Ze(e.address||e.addr,"address"),r=await Eo(`/address/${n}`,t),o=r.chain_stats||{},i=r.mempool_stats||{},s=Number(o.funded_txo_sum||0)+Number(i.funded_txo_sum||0),a=Number(o.spent_txo_sum||0)+Number(i.spent_txo_sum||0);return{provider:"bitcoin-esplora",network:ze(t),address:n,balanceSats:String(s-a),chainStats:o,mempoolStats:i,raw:r}}async function Cd(e={},t={}){let n=Ze(e.address||e.addr,"address"),r=await Eo(`/address/${n}/utxo`,t),o=Array.isArray(r)?r:[];return{provider:"bitcoin-esplora",network:ze(t),address:n,count:o.length,totalSats:String(o.reduce((i,s)=>i+Number(s.value||0),0)),utxos:o.map(i=>({txid:i.txid,vout:i.vout,value:Number(i.value||0),status:i.status||null}))}}async function Td(e={},t={}){let n=String(e.txid||e.txId||"").trim().toLowerCase();if(!/^[0-9a-f]{64}$/.test(n))throw new Error("bitcoin-esplora: txid must be 64-char hex");let r=await Eo(`/tx/${n}`,t);return{provider:"bitcoin-esplora",network:ze(t),txid:n,confirmed:!!r.status?.confirmed,fee:r.fee??null,size:r.size??null,weight:r.weight??null,vinCount:Array.isArray(r.vin)?r.vin.length:null,voutCount:Array.isArray(r.vout)?r.vout.length:null,raw:r}}async function Od(e={},t={}){let n=ZS(e.txHex||e.hex||e.transaction,"txHex");return{provider:"bitcoin-esplora",network:ze(t),encoding:"hex",txHex:n,byteLength:n.length/2,note:"full decode is wallet/client-side or via bitcoinjs; Esplora returns broadcast acceptance only"}}var Rd="ORACLE_ALLOW_CUSTOM_PROVIDER_URL";function Oe({provider:e,defaultUrl:t,hosts:n=[],url:r,strict:o=!1}){let s=(String(r??"").trim()||String(t)).replace(/\/$/,"");if(s===String(t).replace(/\/$/,""))return{baseUrl:s,trusted:!0,host:$d(t)};let a;try{a=new URL(s)}catch{throw new Error(`${e}: baseUrl must be an absolute http(s) URL`)}if(a.protocol!=="http:"&&a.protocol!=="https:")throw new Error(`${e}: baseUrl must be an absolute http(s) URL`);let c=a.host;if(!c)throw new Error(`${e}: baseUrl must be an absolute http(s) URL`);if(new Set([$d(t),...n]).has(c)){let u=/^(127\.0\.0\.1|localhost|\[::1\])(:\d+)?$/i.test(c);return a.protocol==="http:"&&!u?{baseUrl:s,trusted:!1,host:c,reason:"plaintext http downgrade"}:{baseUrl:s,trusted:!0,host:c}}if(String(process.env[Rd]||"")==="1")return{baseUrl:s,trusted:!1,host:c};if(o)throw new Error(`${e}: refusing to call non-allowlisted host ${c} (set ${Rd}=1 to permit it)`);return{baseUrl:s,trusted:!1,host:c}}function $d(e){let t=new URL(String(e));if(t.protocol!=="http:"&&t.protocol!=="https:")throw new Error("unsupported protocol");return t.host}function ve(e,t,n){let r={...e};if(!n)return r;for(let[o,i]of Object.entries(t||{}))i&&(r[o]=i);return r}var sa="https://ordinals.com";function Io(e={}){return String(e.baseUrl||process.env.BTC_META_API_URL||process.env.UNISAT_API_URL||"").trim().replace(/\/$/,"")}var tk=["open-api.unisat.io","open-api-testnet.unisat.io","api.bestinslot.xyz","api.hiro.so"];function Ld(e={}){let t=e.apiKey||process.env.UNISAT_API_KEY||process.env.BESTINSLOT_API_KEY||process.env.BTC_META_API_KEY||"",n=!1;try{let r=Io(e);if(r){let o=new URL(r).host,i=new URL(r).protocol,s=/^(127\.0\.0\.1|localhost|\[::1\])(:\d+)?$/i.test(o);n=tk.includes(o)&&(i==="https:"||s)}}catch{n=!1}return ve({accept:"application/json","user-agent":"oracle-btc-meta/0.1"},{authorization:t?`Bearer ${t}`:"","x-api-key":t},n)}async function cn(e,t={}){let r=await(t.fetchImpl||fetch)(e,{method:"GET",headers:Ld(t),signal:AbortSignal.timeout(t.timeoutMs??12e3)}),o=await r.text(),i;try{i=JSON.parse(o)}catch{i=o}if(!r.ok)throw new Error(`bitcoin-meta GET ${e}: HTTP ${r.status} ${String(o).slice(0,160)}`);return i}async function Md(e={}){let t=Io(e),n=null;try{let i=await(e.fetchImpl||fetch)("https://ordinals.com/r/blockheight",{signal:AbortSignal.timeout(8e3)});n=Number(await i.text())}catch{n=null}if(!t)return{ok:n!=null,provider:"bitcoin-meta",indexerConfigured:!1,ordinalsComTip:n,note:"Set BTC_META_API_URL and/or UNISAT_API_KEY / BESTINSLOT_API_KEY for balances. Marketplace = Satflow (SATFLOW_API_KEY). Magic Eden BTC is dead.",capabilities:{tip:n!=null,runeBalances:!1,inscriptions:!1,marketplace:!1}};let r={ok:!1,path:null,status:null};for(let o of["/v1/indexer/brc20/best-height","/v1/health","/health","/"])try{let s=await(e.fetchImpl||fetch)(`${t}${o}`,{headers:Ld(e),signal:AbortSignal.timeout(8e3)});if(r={ok:s.status>0&&s.status<500,path:o,status:s.status},s.ok)break}catch{}return{ok:r.ok||n!=null,provider:"bitcoin-meta",indexerConfigured:!0,baseUrl:t,probe:r,ordinalsComTip:n,apiKeyPresent:!!(process.env.UNISAT_API_KEY||process.env.BESTINSLOT_API_KEY||process.env.BTC_META_API_KEY),capabilities:{tip:n!=null,runeBalances:!0,inscriptions:!0,marketplace:!!process.env.SATFLOW_API_KEY}}}async function _o(e={},t={}){let n=Ze(e.address||e.addr,"address"),r=Io(t);if(!r)return{provider:"bitcoin-meta",address:n,ok:!1,balances:[],error:"no indexer configured (set BTC_META_API_URL or vendor API key env)"};let o=[`${r}/v1/indexer/address/${n}/runes/balance-list?start=0&limit=100`,`${r}/v1/runes/address/${n}`,`${r}/runes/balance/${n}`,`${r}/address/${n}/runes`],i=null;for(let s of o)try{let a=await cn(s,t),c=nk(a);return{provider:"bitcoin-meta",address:n,ok:!0,count:c.length,balances:c,source:s}}catch(a){i=a}return{provider:"bitcoin-meta",address:n,ok:!1,balances:[],error:String(i?.message||i||"all indexer paths failed")}}function nk(e){let t=e?.data?.detail||e?.data?.list||e?.data||e?.balances||e?.results||e?.runes||(Array.isArray(e)?e:[]);return(Array.isArray(t)?t:[]).map(r=>({rune:r.rune||r.runeid||r.runeId||r.spacedRune||r.name||r.ticker||null,runeId:r.runeid||r.runeId||r.id||null,amount:String(r.amount??r.balance??r.total??r.qty??"0"),symbol:r.symbol||null,divisibility:r.divisibility??r.div??null,raw:r}))}async function ln(e={},t={}){let n=Ze(e.address||e.addr,"address"),r=Io(t);if(!r)return{provider:"bitcoin-meta",address:n,ok:!1,inscriptions:[],error:"no indexer configured \u2014 address-indexed lookups need a keyed indexer (BTC_META_API_URL + UNISAT_API_KEY / BESTINSLOT_API_KEY). ordinals.com recursive is keyless but has no address index.",unknownNotEmpty:!0,keylessAlternatives:["btc_inscription_info (by inscription id)","btc_meta_health"]};let o=Math.min(Number(e.limit||50),200),i=[`${r}/v1/indexer/address/${n}/inscription-data?cursor=0&size=${o}`,`${r}/v1/inscriptions/address/${n}?limit=${o}`,`${r}/address/${n}/inscriptions?limit=${o}`],s=null;for(let a of i)try{let c=await cn(a,t),l=rk(c);return{provider:"bitcoin-meta",address:n,ok:!0,count:l.length,inscriptions:l,source:a}}catch(c){s=c}return{provider:"bitcoin-meta",address:n,ok:!1,inscriptions:[],error:String(s?.message||s||"all indexer paths failed")}}async function Ud(e={},t={}){let n=String(e.inscriptionId||e.id||"").trim();if(!/^[0-9a-f]{64}i\d+$/i.test(n))throw new Error("bitcoin-meta: inscriptionId must look like <64-hex-txid>i<index>");let r=t.ordinalsBase||sa,o=await cn(`${r}/r/inscription/${n}`,t);return{provider:"bitcoin-meta",source:"ordinals.com/r",keyless:!0,inscriptionId:n,info:o}}async function Bd(e={},t={}){let n=String(e.inscriptionId||e.id||"").trim();if(!/^[0-9a-f]{64}i\d+$/i.test(n))throw new Error("bitcoin-meta: inscriptionId must look like <64-hex-txid>i<index>");let r=t.ordinalsBase||sa,o=Number(e.page||0),i=await cn(`${r}/r/children/${n}${o?`/${o}`:""}`,t);return{provider:"bitcoin-meta",source:"ordinals.com/r",keyless:!0,inscriptionId:n,page:o,children:Array.isArray(i?.ids)?i.ids:[],more:!!i?.more}}async function Dd(e={},t={}){let n=t.ordinalsBase||sa,r=e.height??await cn(`${n}/r/blockheight`,t),o=await cn(`${n}/r/blockinfo/${Number(r)}`,t);return{provider:"bitcoin-meta",source:"ordinals.com/r",keyless:!0,height:Number(r),info:o}}function rk(e){let t=e?.data?.inscription||e?.data?.detail||e?.data?.list||e?.data||e?.inscriptions||e?.results||(Array.isArray(e)?e:[]);return(Array.isArray(t)?t:[]).map(r=>({id:r.inscriptionId||r.id||r.inscription_id||null,number:r.inscriptionNumber??r.number??null,sat:r.sat||r.satoshi||null,contentType:r.contentType||r.content_type||null,utxo:r.utxo||r.output||(r.txid!=null?`${r.txid}:${r.vout??r.n}`:null),raw:r}))}W();var ik=["unsigned","notsigned","tosign","signable"],sk=new Set(["requiresusersignature","requiressignature","needssignature","signaturerequired","signaturesrequired","signingready","signaturecount","signaturethreshold","requiredsignatures","signatureneeded","hassignature","allowsignatures","requestsignature","multisig","cosig","msig"]),ak=new Set(["sig","sigs","scriptsig","witness","psbt","finalizedpsbt","completepsbt","finalpsbt","psbtfinalized","serializedtransaction"]);function aa(e){return String(e).toLowerCase().replace(/[^a-z0-9]/g,"")}function ck(e){return ik.some(t=>e.startsWith(t))||sk.has(e)}function lk(e){let t=String(e);if(!/^[\x20-\x7e]+$/.test(t))return!0;let n=aa(t);return ck(n)?!1:ak.has(n)?!0:n.includes("signed")||n.includes("signature")||n.endsWith("sig")||n.endsWith("sigs")}function uk(e){let t=Number(e?.v),n=String(e?.r||""),r=String(e?.s||"");return[0,1,27,28].includes(t)&&/^0x[0-9a-f]{2,64}$/i.test(n)&&/^0x[0-9a-f]{2,64}$/i.test(r)}function ca(e,t=0,n=new Set,r={nodes:0}){if(e==null||typeof e!="object")return[];if(t>16)return["<max-depth>"];if(n.has(e))return[];if(r.nodes+=1,r.nodes>2048)return["<max-nodes>"];if(n.add(e),Array.isArray(e))return e.flatMap(c=>ca(c,t+1,n,r));let o=[];for(let[c,l]of Object.entries(e)){if(lk(c)){o.push(c);continue}o.push(...ca(l,t+1,n,r))}let s=Object.keys(e).map(aa).some(c=>c.endsWith("psbt")||c.endsWith("psbtbase64")),a=Object.entries(e).some(([c,l])=>/complete|finalized|isfinal/.test(aa(c))&&l===!0);return s&&a&&o.push("psbt(complete)"),uk(e)&&o.push("v/r/s"),o}function et(e,t){let n=ca(t);if(n.length)throw new Error(`${e}: refused a pre-signed transaction payload from the API (fields: ${[...new Set(n)].join(", ")}) \u2014 @oracle-agent/oracle is prepare-only and will not bind signed material into a prepared envelope`)}var dk="https://api.satflow.com/v1";function Fd(e={}){return Oe({provider:"satflow",defaultUrl:dk,hosts:["api.satflow.com"],url:e.baseUrl||process.env.SATFLOW_API_URL})}function Po(e={}){return Fd(e).baseUrl}function ua(e={}){return String(e.apiKey||process.env.SATFLOW_API_KEY||process.env.BTC_SATFLOW_API_KEY||"").trim()}function pk(e={}){return ve({accept:"application/json","content-type":"application/json","user-agent":"oracle-btc-satflow/0.1"},{"x-api-key":ua(e)},Fd(e).trusted)}async function lt(e,{method:t="GET",body:n,opts:r={}}={}){if(!ua(r))throw new Error("satflow: SATFLOW_API_KEY not set (request key via Satflow docs form)");let i=`${Po(r)}${e.startsWith("/")?e:`/${e}`}`,a=await(r.fetchImpl||fetch)(i,{method:t,headers:pk(r),body:n!=null?JSON.stringify(n):void 0,signal:AbortSignal.timeout(r.timeoutMs??2e4)}),c=await a.text(),l;try{l=JSON.parse(c)}catch{l=c}if(!a.ok)throw new Error(`satflow ${t} ${e}: HTTP ${a.status} ${String(c).slice(0,200)}`);return l}async function qd(e={}){if(!!!ua(e))return{ok:!1,provider:"satflow",baseUrl:Po(e),apiKeyPresent:!1,marketplace:"satflow",magicEdenOrdinals:"deprecated-dead",note:"Set SATFLOW_API_KEY. Magic Eden BTC ordinals marketplace is shut down \u2014 do not use ME."};try{return await lt("/collection/stats/floors?type=ordinals",{opts:e}),{ok:!0,provider:"satflow",baseUrl:Po(e),apiKeyPresent:!0,marketplace:"satflow",magicEdenOrdinals:"deprecated-dead",capabilities:{floors:!0,walletContents:!0,purchaseIntent:!0,listIntent:!0,bidIntent:!0}}}catch(n){return{ok:!1,provider:"satflow",baseUrl:Po(e),apiKeyPresent:!0,error:String(n?.message||n).slice(0,200),magicEdenOrdinals:"deprecated-dead"}}}async function Hd(e={},t={}){let n=String(e.type||"ordinals").toLowerCase();if(!["ordinals","runes"].includes(n))throw new Error("satflow: type must be ordinals|runes");let r=new URLSearchParams({type:n});e.ids&&r.set("ids",Array.isArray(e.ids)?e.ids.join(","):String(e.ids));let o=await lt(`/collection/stats/floors?${r}`,{opts:t});return{provider:"satflow",type:n,floors:o,magicEdenOrdinals:"deprecated-dead"}}async function jd(e={},t={}){let n=String(e.collectionId||e.id||e.slug||"").trim();if(!n)throw new Error("satflow: collectionId required");let r=new URLSearchParams({id:n});e.type&&r.set("type",e.type);let o=await lt(`/collection/stats?${r}`,{opts:t});return{provider:"satflow",collectionId:n,stats:o}}async function Vd(e={},t={}){let n=String(e.inscriptionId||e.id||"").trim();if(!n)throw new Error("satflow: inscriptionId required");let r=new URLSearchParams({id:n});return{provider:"satflow",item:await lt(`/item?${r}`,{opts:t})}}async function No(e={},t={}){let n=Ze(e.address||e.addr,"address"),r=new URLSearchParams({address:n});e.type&&r.set("type",e.type),e.limit!=null&&r.set("limit",String(e.limit)),e.offset!=null&&r.set("offset",String(e.offset));let o=await lt(`/address/wallet-contents?${r}`,{opts:t});return{provider:"satflow",address:n,contents:o}}async function zd(e={},t={}){let n=e.collectionIds||e.ids||e.collectionId;if(!n)throw new Error("satflow: collectionIds required");let r=new URLSearchParams({ids:Array.isArray(n)?n.join(","):String(n)});return e.limit!=null&&r.set("limit",String(e.limit)),{provider:"satflow",listings:await lt(`/orders/floor?${r}`,{opts:t})}}var mk=new Set(["body","execute","fetchImpl","opts","apiKey","baseUrl","timeoutMs","maxSats","operator"]);function Wd(e={},t=null){let n=e.body&&typeof e.body=="object"?e.body:e,r={};for(let[o,i]of Object.entries(n))mk.has(o)||t&&!t.has(o)||i!==void 0&&(r[o]=i);return r}var fk=new Set(["listing_id","listingId","inscription_id","inscriptionId","runes_output","runesOutput","buyer_address","buyerAddress","ord_address","receive_address","payment_address","pay_address","tap_key","public_key","publicKey","fee_rate","feeRate","price","quantity","slug","collection_slug"]),hk=new Set(["inscription_id","inscriptionId","runes_output","runesOutput","ord_address","receive_address","price","tap_key","collection_slug","expires_at"]);function la(e){if(!e||typeof e!="object")return null;let t=[e.price,e.priceSats,e.price_sats,e.totalSats,e.total_sats,e.amount,e.satoshis];for(let n of t){if(n==null)continue;let r=String(n).trim();if(/^\d+$/.test(r))return BigInt(r)}return null}async function Gd(e={},t={}){let n=Wd(e,fk);if(!n||Object.keys(n).length===0)throw new Error("satflow: purchase body required (see docs.satflow.com intent/satflow-purchase)");let r=e.maxSats??e.body?.maxSats;if(r==null)throw new Error("satflow: maxSats is required to prepare a purchase \u2014 an uncapped buy has no spend ceiling");let o=BigInt(String(r).trim());if(o<=0n)throw new Error("satflow: maxSats must be a positive integer sat amount");let i=la(n);if(i!=null&&i>o)throw new Error(`satflow: requested price ${i} sats exceeds maxSats cap ${o}`);let s=await lt("/intent/satflow-purchase",{method:"POST",body:n,opts:t}),a=la(s)??la(s?.intent);if(a==null)throw new Error("satflow: purchase intent did not report a price \u2014 refusing to return an unverifiable PSBT");if(a>o)throw new Error(`satflow: purchase price ${a} sats exceeds maxSats cap ${o} \u2014 PSBT withheld`);return et("satflow",s),O({provider:"satflow",kind:"purchase-intent",executionReady:!1,signingReady:!1,broadcastReady:!1,requiresUserSignature:!0,marketplace:"satflow",magicEdenOrdinals:"deprecated-dead",priceSats:a.toString(),maxSats:o.toString(),intent:s,unsignedPsbt:s?.unsignedPSBTBase64||s?.unsignedPsbtBase64||s?.unsigned_psbt||null,note:"Sign PSBT in a Bitcoin wallet. Broadcast only through the user's wallet or an explicitly armed Bitcoin execution plane."})}async function Co(e={},t={}){let n=Wd(e,hk);if(!n.inscription_id&&!n.runes_output&&!n.inscriptionId&&!n.runesOutput)throw new Error("satflow: list requires inscription_id or runes_output");let r=await lt("/intent/sell",{method:"POST",body:n,opts:t});return et("satflow",r),O({provider:"satflow",kind:"list-intent",requiresUserSignature:!0,marketplace:"satflow",listingRequest:n,intent:r,unsignedPsbt:r?.unsignedListingPSBTBase64||r?.unsigned_psbt||null,note:"Sign listing PSBTs in a Bitcoin wallet; listing broadcast is outside the data plane."})}T();W();var To="https://lite-api.jup.ag/swap/v1",Xd="So11111111111111111111111111111111111111112",Qd="EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",yk=100,Kd=2e4;function Jd(e={}){return String(e.baseUrl||process.env.JUPITER_SWAP_API_URL||To).replace(/\/$/,"")}function Oo(e,t="amount"){try{let n=BigInt(String(e));if(n<=0n)throw new Error("nonpositive");return n.toString()}catch{throw new Error(`jupiter: ${t} must be a positive integer string`)}}function Zd(e){let t=e==null?50:Number(e);if(!Number.isInteger(t)||t<0)throw new Error("jupiter: slippageBps must be a non-negative integer");if(t>yk)throw new Error("jupiter: slippage exceeds hard 100 bps cap");return t}function da(e,t){return e==null?t:!!e}function bk(e){let t=String(e||"").trim();if(!/^[A-Za-z0-9+/]+={0,2}$/.test(t)||t.length%4!==0)throw new Error("jupiter: swapTransaction must be base64");return t}function pa(e={},{quotedAtMs:t=Date.now(),ttlMs:n=Kd}={}){let r=K(e.inputMint,"inputMint"),o=K(e.outputMint,"outputMint"),i=Oo(e.inAmount,"inAmount"),s=Oo(e.outAmount,"outAmount"),a=Oo(e.otherAmountThreshold??e.outAmount,"otherAmountThreshold"),c=Zd(e.slippageBps??50);return{mode:"solana-jupiter-quote",provider:"jupiter",venue:"jupiter-swap-v1",inputMint:r,outputMint:o,inAmount:i,outAmount:s,otherAmountThreshold:a,slippageBps:c,contextSlot:e.contextSlot??null,quotedAtMs:t,expiresAtMs:t+Math.min(Math.max(Number(n)||Kd,1e3),3e4)}}var wk=new Set(["BPFLoaderUpgradeab1e11111111111111111111111","BPFLoader2111111111111111111111111111111111","BPFLoader1111111111111111111111111111111111"]),xk="123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz";function Yd(e){if(typeof e!="string"||!e.length)return!1;let t=0n;for(let o of e){let i=xk.indexOf(o);if(i<0)return!1;t=t*58n+BigInt(i)}let n=t.toString(16);n.length%2&&(n="0"+n);let r=n.length/2;for(let o of e)if(o==="1")r++;else break;return r===32}async function ep(e={},t={}){let n=e.rpc||t.solanaRpc||process.env.SOLANA_RPC||"https://api.mainnet-beta.solana.com",r=t.fetchImpl||fetch,o=await r(`${To}/program-id-to-label`,{signal:AbortSignal.timeout(Number(t.timeoutMs)||15e3)});if(!o.ok)throw new Error(`jupiter venue map failed: HTTP ${o.status}`);let i=await o.json(),s=Object.entries(i),a=s.filter(([p])=>Yd(p)),c=[],l=s.filter(([p])=>!Yd(p)).map(([p,m])=>({programId:p,label:m,reason:"malformed program id"}));if(e.verify===!1)return{source:`${To}/program-id-to-label`,verified:a.map(([p,m])=>({programId:p,label:m})),unresolved:l,verifiedOnChain:!1,totals:{fromRouterMap:s.length,verified:a.length}};let u=async p=>{let f=await(await r(n,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(p),signal:AbortSignal.timeout(Number(t.timeoutMs)||2e4)})).json();if(f.error)throw new Error(f.error.message);return f.result};for(let p=0;p<a.length;p+=90){let m=a.slice(p,p+90),f=null;for(let h=0;h<3&&!f;h++)try{f=await u({jsonrpc:"2.0",id:1,method:"getMultipleAccounts",params:[m.map(([g])=>g),{encoding:"base64",dataSlice:{offset:0,length:0}}]})}catch{await new Promise(g=>setTimeout(g,2e3*(h+1)))}if(!f){for(let[h,g]of m)l.push({programId:h,label:g,reason:"rpc batch failed after 3 attempts"});continue}f.value.forEach((h,g)=>{let[b,k]=m[g];h&&h.executable===!0&&wk.has(h.owner)?c.push({programId:b,label:k,owner:h.owner}):l.push({programId:b,label:k,reason:h?h.executable!==!0?"not executable":`unknown owner ${h.owner}`:"account not found"})}),p+90<a.length&&await new Promise(h=>setTimeout(h,700))}let d=new Set(c.map(p=>p.label.replace(/\s+(CLMM|CP|V\d+|Launchlab|DLMM|Pools?)$/i,"").trim()));return{source:`${To}/program-id-to-label`,rpc:n,verifiedOnChain:!0,verifiedAt:new Date().toISOString(),totals:{fromRouterMap:s.length,verified:c.length,unresolved:l.length,distinctLabels:new Set(c.map(p=>p.label)).size,distinctBrands:d.size},verified:c.sort((p,m)=>p.label.localeCompare(m.label)),unresolved:l}}async function tp(e={}){try{return{ok:!0,provider:"jupiter",outAmount:(await Ro({inputMint:Xd,outputMint:Qd,amount:"1000000",slippageBps:50},e)).quote.outAmount,exec:!1}}catch(t){return{ok:!1,provider:"jupiter",error:String(t?.message||t),exec:!1}}}async function Ro(e={},t={}){let n=K(e.inputMint||e.fromMint||Xd,"inputMint"),r=K(e.outputMint||e.toMint||Qd,"outputMint"),o=Oo(e.amount||e.inAmount,"amount"),i=Zd(e.slippageBps??e.maxSlippageBps??50),s=new URL(`${Jd(t)}/quote`);s.searchParams.set("inputMint",n),s.searchParams.set("outputMint",r),s.searchParams.set("amount",o),s.searchParams.set("slippageBps",String(i)),s.searchParams.set("swapMode",e.swapMode||"ExactIn"),e.onlyDirectRoutes!=null&&s.searchParams.set("onlyDirectRoutes",String(!!e.onlyDirectRoutes)),e.platformFeeBps!=null&&s.searchParams.set("platformFeeBps",String(e.platformFeeBps));let a=await y(s.toString(),{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),c=pa({...a,slippageBps:i},t);return{provider:"jupiter",chain:"solana-mainnet-beta",quoteReady:!0,executionReady:!1,inputMint:n,outputMint:r,amount:o,quote:a,solanaGuard:c}}function Sk(e){return Object.fromEntries(Object.entries(e).filter(([,t])=>t!==void 0))}async function np(e={},t={}){let n=K(e.userPublicKey||e.owner||e.wallet,"userPublicKey"),r=e.quoteResponse?{quote:e.quoteResponse,solanaGuard:pa(e.quoteResponse,t)}:await Ro(e,t),o=r.quote,i=r.solanaGuard||pa(o,t);if(da(e.dynamicSlippage,!1)===!0)throw new Error("jupiter: dynamicSlippage would override the enforced slippage ceiling \u2014 pass an explicit slippageBps instead");let s=await y(`${Jd(t)}/swap`,{method:"POST",body:Sk({quoteResponse:o,userPublicKey:n,wrapAndUnwrapSol:da(e.wrapAndUnwrapSol,!0),dynamicComputeUnitLimit:da(e.dynamicComputeUnitLimit,!0),dynamicSlippage:!1,prioritizationFeeLamports:e.prioritizationFeeLamports}),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),a=bk(s?.swapTransaction);et("jupiter",s);let c=s?.quoteResponse??s?.quote??null;if(c)for(let l of["inAmount","outAmount","otherAmountThreshold","inputMint","outputMint"]){let u=o?.[l],d=c?.[l];if(u!=null&&d!=null&&String(u)!==String(d))throw new Error(`jupiter: swap response ${l} (${d}) does not match the quoted ${l} (${u}) \u2014 refusing to prepare`)}return O({provider:"jupiter",chain:"solana-mainnet-beta",prepareReady:!0,executionReady:!1,signingReady:!1,broadcastReady:!1,requiresUserSignature:!0,verifiedAgainstQuote:!!c,userPublicKey:n,quote:o,solanaGuard:i,swapTransaction:a,swapTransactionEncoding:"base64",lastValidBlockHeight:s?.lastValidBlockHeight??null,prioritizationFeeLamports:s?.prioritizationFeeLamports??null,computeUnitLimit:s?.computeUnitLimit??null,raw:s},{provider:"jupiter",kind:"jupiter-swap"})}T();var vk="https://coins.llama.fi",Ek="https://api.llama.fi",Ak="https://yields.llama.fi",Ik="https://stablecoins.llama.fi";function _k(e={}){return(e.baseUrl||process.env.DEFILLAMA_COINS_URL||vk).replace(/\/$/,"")}function rp(e={}){return(e.baseUrl||process.env.DEFILLAMA_API_URL||Ek).replace(/\/$/,"")}async function Re(e,t={}){if(!Array.isArray(e)||!e.length)throw new Error("llamaPrices requires coins[]");let n=e.map(encodeURIComponent).join(",");return y(`${_k(t)}/prices/current/${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function op(e={}){let n=(await Re(["coingecko:ethereum"],e))?.coins?.["coingecko:ethereum"];return{ok:!!n?.price,ethUsd:n?.price??null}}async function $o(e={}){return y(`${rp(e)}/protocols`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??2e4})}async function ip(e={},t={}){let n=(t.yieldsBaseUrl||process.env.DEFILLAMA_YIELDS_URL||Ak).replace(/\/$/,""),r=await y(`${n}/pools`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??3e4}),o=Array.isArray(r?.data)?r.data:[];e.chain&&(o=o.filter(s=>String(s.chain).toLowerCase()===String(e.chain).toLowerCase())),e.project&&(o=o.filter(s=>String(s.project).toLowerCase()===String(e.project).toLowerCase())),e.stablecoin!=null&&(o=o.filter(s=>!!s.stablecoin==!!e.stablecoin)),o.sort((s,a)=>Number(a.tvlUsd||0)-Number(s.tvlUsd||0));let i=Math.min(5e3,Math.max(1,Number(e.limit||o.length||1)));return{...r,data:o.slice(0,i)}}async function sp(e={},t={}){let n=(t.stablecoinsBaseUrl||process.env.DEFILLAMA_STABLECOINS_URL||Ik).replace(/\/$/,""),r=e.includePrices!==!1;return y(`${n}/stablecoins?includePrices=${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??3e4})}async function ap(e={},t={}){let n=encodeURIComponent(String(e.chain||"Ethereum")),r=new URLSearchParams({excludeTotalDataChart:String(e.includeChart!==!0),excludeTotalDataChartBreakdown:String(e.includeBreakdown!==!0),dataType:"dailyVolume"});return y(`${rp(t)}/overview/dexs/${n}?${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??3e4})}async function cp(e=["ethereum","bitcoin","solana"],t={}){let n=e.map(i=>`coingecko:${String(i).toLowerCase()}`),r=await Re(n,t),o={};for(let i of e){let s=`coingecko:${String(i).toLowerCase()}`;o[i]=r?.coins?.[s]||null}return o}T();me();Lo();W();import{existsSync as Uk,readFileSync as Bk}from"node:fs";import{homedir as Dk}from"node:os";import{join as lp}from"node:path";import{Contract as Nk,JsonRpcProvider as Ck}from"ethers";var Tk="0x62FCFAf7573AD8B41a0FBF347AfEb85e06599A75",Ok=999,Rk="https://rpc.hyperliquid.xyz/evm",$k=["function balanceOf(address owner) view returns (uint256)"],Lk=/^0x[a-fA-F0-9]{40}$/;function Mk(e){return Lk.test(String(e||""))}async function Mo(e,{contract:t=Tk,rpc:n=Rk,chainId:r=Ok,balanceOf:o}={}){if(!Mk(e))throw new Error("invalid-address");if(o)return BigInt(await o(e));let i=new Ck(n,r,{staticNetwork:!0}),s=new Nk(t,$k,i);return BigInt(await s.balanceOf(e))}var Fk=100,qk=5,up=Object.freeze({swap:5,bridge:5,perps:0,nft:0});function Hk(e){let t=String(e||"swap").toLowerCase();return Object.prototype.hasOwnProperty.call(up,t)?up[t]:qk}var jk="ORACLE_INTEGRATOR_FEE_BPS",Vk="ORACLE_INTEGRATOR_FEE_RECIPIENT",zk="ORACLE_INTEGRATOR_ID",dp="ORACLE_INTEGRATOR_FEE_RECIPIENT_PIN",Wk="oracle";function Gk(e=process.env){if(e[dp])return String(e[dp]);let t=e.ORACLE_CONFIG_DIR||lp(Dk(),".config","oracle");return lp(t,"fee-recipient")}function fa(e=process.env){try{let t=Gk(e);if(!Uk(t))return"";let n=Bk(t,"utf8").trim().toLowerCase();return/^0x[a-f0-9]{40}$/.test(n)?n:""}catch{return""}}function Kk(e,{fallback:t=0}={}){if(e==null)return t;if(String(e).trim()==="")return 0;let n=Number(e);return!Number.isFinite(n)||n<=0?0:Math.min(Math.floor(n),Fk)}function Yk({env:e=process.env,action:t="swap",admin:n=!1}={}){let r=String(e[Vk]||"").trim(),o=String(e[zk]||Wk).trim();if(n===!0)return{bps:0,recipient:"",integrator:o,action:t,applies:!1,reason:"admin-oracle"};let i=Hk(t),s=Kk(e[jk],{fallback:r?i:0}),a=Math.min(s,i);if(!a)return{bps:0,recipient:"",integrator:o,action:t,applies:!1,reason:"not-configured"};if(!/^0x[a-fA-F0-9]{40}$/.test(r))return{bps:0,recipient:"",integrator:o,action:t,applies:!1,reason:"no-recipient"};let c=fa(e);return!c||c!==r.toLowerCase()?{bps:0,recipient:"",integrator:o,action:t,applies:!1,reason:"recipient-not-pinned"}:{bps:a,recipient:r,integrator:o,action:t,applies:!0,reason:"configured"}}async function Uo({wallet:e,env:t=process.env,action:n="swap",holderCheck:r={},admin:o=!1}={}){let i=Yk({env:t,action:n,admin:o});if(o===!0)return{...i,holderVerificationStatus:"admin-oracle"};let s=String(e||"").trim().toLowerCase();if(!/^0x[a-f0-9]{40}$/.test(s))return{...i,holderVerificationStatus:"wallet-required"};try{return BigInt(await Mo(s,r))>0n?{...i,bps:0,applies:!1,reason:"locals-only-holder",holderVerificationStatus:"holder"}:{...i,holderVerificationStatus:"non-holder"}}catch{return{...i,holderVerificationStatus:"unavailable"}}}function pp(e){return e?.applies?`Oracle routing fee ${e.bps} bps (${(e.bps/100).toFixed(2)}%) to ${e.recipient}.`:e?.reason==="admin-oracle"?"No Oracle fee (admin Oracle).":e?.reason==="locals-only-holder"?"No Oracle fee (Locals Only holder).":"No Oracle fee."}function mp(e){return e?.applies?{integrator:e.integrator,fee:String(e.bps/1e4)}:{}}function fp(e){return e?.applies?{partner:e.integrator,partnerFeeBps:String(e.bps),partnerAddress:e.recipient}:{}}var Xk="https://li.quest/v1";function ga(e={}){return(e.baseUrl||process.env.LIFI_API_URL||Xk).replace(/\/$/,"")}var ha="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",Qk="0x0000000000000000000000000000000000000000";function Jk(e){let t=String(e||ha).toLowerCase();return t===ha.toLowerCase()||t===Qk}function hp(e,t){let n=String(e||"").trim();if(!/^0x[0-9a-fA-F]{40}$/.test(n))throw new Error(`lifi: ${t} must be a 20-byte address`);return n.toLowerCase()}async function gp(e={}){let t=await y(`${ga(e)}/chains`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??12e3}),n=Array.isArray(t)?t.length:t?.chains?.length||0;return{ok:n>0,chainCount:n}}async function dt(e={},t={}){let{fromChain:n,toChain:r=n,fromToken:o=ha,toToken:i,fromAmount:s,fromAddress:a=ut}=e;if(n==null||!i||!s)throw new Error("lifiQuote requires fromChain, toToken, fromAmount");let c=new URLSearchParams({fromChain:String(n),toChain:String(r),fromToken:o,toToken:i,fromAmount:String(s),fromAddress:a}),l=pe({liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,crossChain:Number(r)!==Number(n),requestedCapBps:e.maxSlippageBps??e.slippageBps});if(!l.executable)throw new Error(`lifi: route requires ${l.requiredBps} bps above cap ${l.capBps}`);c.set("slippage",String(l.selectedBps/1e4));let u=await Uo({wallet:e.fromAddress,env:t.env,action:e.feeAction||"swap",holderCheck:t.holderCheck});for(let[g,b]of Object.entries(mp(u)))c.set(g,b);let d=await y(`${ga(t)}/quote?${c}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4}),p=d?.estimate?.toAmount||d?.toAmount;if(!p)return{...d,autoSlippagePolicy:l,oracleFee:u};let m=d?.transactionRequest?.to||d?.estimate?.approvalAddress||"lifi",f=V(d,{chainId:Number(n),venue:m,amountOut:p,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,crossChain:Number(r)!==Number(n),requestedCapBps:e.maxSlippageBps??e.slippageBps}),h=d?.estimate?.toAmountMin||d?.toAmountMin;if(h!=null&&BigInt(h)<BigInt(f.amountOutMinimum))throw new Error("lifi: provider transaction is under-protected versus bounded auto-slippage floor");return{...f,oracleFee:u}}async function yp(e={},t={}){let n=await dt(e,t),r=n?.transactionRequest;if(!r?.to||!r?.data)throw new Error("lifi: quote did not return an executable transactionRequest");let o=Number(e.fromChain);if(r.chainId!=null&&Number(r.chainId)!==o)throw new Error("lifi: transaction chain mismatch");if(e.fromAddress&&r.from&&String(r.from).toLowerCase()!==String(e.fromAddress).toLowerCase())throw new Error("lifi: transaction sender mismatch");let i=null;if(!Jk(e.fromToken)){let s=n?.estimate?.approvalAddress||n?.approvalAddress;if(!s)throw new Error("lifi: ERC20 route missing approvalAddress");let a=n?.action?.fromToken?.address||n?.estimate?.fromToken?.address||e.fromToken;i={token:hp(a,"approval token"),spender:hp(s,"approval spender"),amount:String(e.fromAmount)}}return O({provider:"lifi",calldataReady:!0,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:o,quote:n,autoSlippage:n.autoSlippage,requiresApproval:i,transaction:{chainId:o,from:r.from||e.fromAddress,to:r.to,data:r.data,value:r.value??"0x0",...r.gasLimit!=null?{gasLimit:r.gasLimit}:{},slippageGuard:J(n.autoSlippage,{chainId:o,venue:r.to,data:r.data})}},{provider:"lifi",kind:"lifi-tx"})}async function bp(e={}){return y(`${ga(e)}/chains`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??12e3})}import{Interface as Sp,getAddress as mr,isAddress as ev}from"ethers";me();W();var pt={8453:{name:"base",quoter:"0x254cF9E1E6e233aa1AC962CB9B05b2cfeAaE15b0",router:"0xBE6D8f0d05cC4be24d5167a3eF062215bE6D18a5",factory:"0x5e7BB104d84c7CB9B682AaC2F3d509f5F406809A",weth:"0x4200000000000000000000000000000000000006",usdc:"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"}},tv=[1,50,100,200,2e3],wp=new Sp(["function quoteExactInputSingle((address tokenIn, address tokenOut, uint256 amountIn, int24 tickSpacing, uint160 sqrtPriceLimitX96) params) returns (uint256 amountOut, uint160 sqrtPriceX96After, uint32 initializedTicksCrossed, uint256 gasEstimate)"]),nv=new Sp(["function exactInputSingle((address tokenIn, address tokenOut, int24 tickSpacing, address recipient, uint256 deadline, uint256 amountIn, uint256 amountOutMinimum, uint160 sqrtPriceLimitX96) params) payable returns (uint256 amountOut)"]),kp="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",vp="0x0000000000000000000000000000000000000000";function Ep(e){let t=Number(e),n=pt[t];if(!n)throw new Error(`aerodrome: unsupported chainId ${e} (supported: ${Object.keys(pt).join(", ")})`);return{chainId:t,...n}}function xp(e,t){let n=pt[Number(t)];if(!e||e===kp||e===vp||/^eth$/i.test(String(e)))return mr(n.weth);let r=String(e);if(/^weth$/i.test(r))return mr(n.weth);if(/^usdc$/i.test(r))return mr(n.usdc);if(!ev(r))throw new Error(`invalid token address: ${e}`);return mr(r)}async function Bo(e={},t={}){let{chainId:n,quoter:r,router:o}=Ep(e.chainId??8453),i=xp(e.tokenIn||"WETH",n),s=xp(e.tokenOut||pt[n].usdc,n),a=BigInt(e.amountIn??0);if(a<=0n)throw new Error("amountIn required (raw base units)");let c=e.tickSpacing!=null?[Number(e.tickSpacing)]:e.tryTickSpacings===!1?[100]:[...tv],l=[],u=null;for(let d of c){let p=wp.encodeFunctionData("quoteExactInputSingle",[{tokenIn:i,tokenOut:s,amountIn:a,tickSpacing:d,sqrtPriceLimitX96:0n}]);try{let m=await L(n,"eth_call",[{to:r,data:p},"latest"],t);if(!m||m==="0x"){l.push({tickSpacing:d,ok:!1,error:"empty result"});continue}let f=wp.decodeFunctionResult("quoteExactInputSingle",m),h={tickSpacing:d,ok:!0,amountOut:f[0].toString(),sqrtPriceX96After:f[1].toString(),initializedTicksCrossed:Number(f[2]),gasEstimate:f[3].toString()};l.push(h),(!u||BigInt(h.amountOut)>BigInt(u.amountOut))&&(u=h)}catch(m){l.push({tickSpacing:d,ok:!1,error:String(m.message||m).slice(0,160)})}}if(!u){let d=l.map(p=>`${p.tickSpacing}:${p.error||"fail"}`).join("; ");throw new Error(`aerodrome quote failed chain=${n}: ${d}`)}return V({venue:"aerodrome",chainId:n,chain:pt[n].name,quoter:r,router:o,tokenIn:i,tokenOut:s,amountIn:a.toString(),tickSpacing:u.tickSpacing,amountOut:u.amountOut,gasEstimate:u.gasEstimate,sqrtPriceX96After:u.sqrtPriceX96After,initializedTicksCrossed:u.initializedTicksCrossed,triedTickSpacings:l,best:!0},{chainId:n,venue:o,amountOut:u.amountOut,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps})}async function Ap(e={},t={}){let n=Number(e.chainId??8453),r=Ep(n),o=mr(e.recipient||e.from||e.userAddress),i=String(e.tokenIn||"WETH"),s=!e.tokenIn||i===kp||i===vp||/^eth$/i.test(i),a=await Bo(e,t),c=Math.min(600,Math.max(30,Number(e.deadlineSeconds??300))),u=Number(t.nowSeconds??Math.floor(Date.now()/1e3))+c,d=nv.encodeFunctionData("exactInputSingle",[{tokenIn:a.tokenIn,tokenOut:a.tokenOut,tickSpacing:a.tickSpacing,recipient:o,deadline:u,amountIn:BigInt(a.amountIn),amountOutMinimum:BigInt(a.amountOutMinimum),sqrtPriceLimitX96:0n}]);return O({provider:"aerodrome",calldataReady:!0,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:n,deadline:u,quote:a,autoSlippage:a.autoSlippage,requiresApproval:s?null:{token:a.tokenIn,spender:r.router,amount:a.amountIn},transaction:{chainId:n,from:o,to:r.router,data:d,value:s?a.amountIn:"0",slippageGuard:J(a.autoSlippage,{chainId:n,venue:r.router,data:d})}},{provider:"aerodrome",kind:"aerodrome-exact-in"})}async function Ip(e={}){let t=Number(e.chainId??8453);try{let n=await Bo({chainId:t,tokenIn:"WETH",tokenOut:"USDC",amountIn:"1000000000000000"},e),r=Number(n.amountOut)/1e6;return{ok:!0,chainId:t,tickSpacing:n.tickSpacing,amountOutUsdc:r,midPxHint:r/.001,router:pt[t]?.router,quoter:pt[t]?.quoter}}catch(n){return{ok:!1,chainId:t,error:String(n.message||n).slice(0,200)}}}async function _p(){return Object.entries(pt).map(([e,t])=>({chainId:Number(e),name:t.name,quoter:t.quoter,router:t.router,factory:t.factory,weth:t.weth,usdc:t.usdc}))}T();me();W();var ov="https://api.0x.org";function Pp(e={}){return Oe({provider:"zerox",defaultUrl:ov,hosts:["api.0x.org"],url:e.baseUrl||process.env.ZEROX_API_URL})}function Np(e={}){return Pp(e).baseUrl}function Do(e={}){return e.apiKey||process.env.ZEROX_API_KEY||process.env.OX_API_KEY||process.env["0X_API_KEY"]||""}function Cp(e={}){return ve({"0x-version":"v2",accept:"application/json"},{"0x-api-key":Do(e)},Pp(e).trusted)}async function Tp(e={}){if(!Do(e))return{ok:!1,configured:!1,error:"ZEROX_API_KEY not set"};try{let t=await ya({chainId:8453,sellToken:"0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",buyToken:"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",sellAmount:"1000000000000000"},e);return{ok:!0,configured:!0,buyAmount:t.buyAmount||t.grossBuyAmount}}catch(t){return{ok:!1,configured:!0,error:String(t.message||t).slice(0,160)}}}async function ya(e={},t={}){if(!Do(t))throw new Error("ZEROX_API_KEY required for 0x");let{chainId:n=8453,sellToken:r,buyToken:o,sellAmount:i,taker:s}=e;if(!r||!o||!i)throw new Error("zeroxPrice requires sellToken, buyToken, sellAmount");let a=new URLSearchParams({chainId:String(n),sellToken:r,buyToken:o,sellAmount:String(i)});return s&&a.set("taker",s),y(`${Np(t)}/swap/allowance-holder/price?${a}`,{headers:Cp(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function Lt(e={},t={}){if(!Do(t))throw new Error("ZEROX_API_KEY required for 0x");let{chainId:n=8453,sellToken:r,buyToken:o,sellAmount:i,taker:s}=e;if(!r||!o||!i)throw new Error("zeroxQuote requires sellToken, buyToken, sellAmount");let a=pe({liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps});if(!a.executable)throw new Error(`0x: route requires ${a.requiredBps} bps above cap ${a.capBps}`);let c=new URLSearchParams({chainId:String(n),sellToken:r,buyToken:o,sellAmount:String(i),slippageBps:String(a.selectedBps)});s&&c.set("taker",s);let l=await y(`${Np(t)}/swap/allowance-holder/quote?${c}`,{headers:Cp(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),u=l?.buyAmount||l?.grossBuyAmount;return u?V(l,{chainId:n,venue:l?.transaction?.to||l?.to||"0x",amountOut:u,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps}):{...l,autoSlippagePolicy:a}}async function Op(e={},t={}){if(!e.taker)throw new Error("0x: taker required for executable prepare");let n=await Lt(e,t),r=n?.transaction;if(!r?.to||!r?.data)throw new Error("0x: firm quote returned no transaction");let o=Number(e.chainId??8453),i=n?.issues?.allowance?.spender||n?.allowanceTarget;return O({provider:"zerox",calldataReady:!0,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:o,quote:n,autoSlippage:n.autoSlippage,requiresApproval:n?.issues?.allowance?.actual!=null&&BigInt(n.issues.allowance.actual)<BigInt(e.sellAmount)?{token:e.sellToken,spender:i,amount:String(e.sellAmount)}:null,transaction:{chainId:o,from:e.taker,to:r.to,data:r.data,value:r.value??"0x0",...r.gas!=null?{gasLimit:r.gas}:{},slippageGuard:J(n.autoSlippage,{chainId:o,venue:r.to,data:r.data})}},{provider:"zerox",kind:"zerox-tx"})}jo();T();me();import{TypedDataEncoder as pv,getAddress as hr,isAddress as mv}from"ethers";var f2=Object.freeze({READ:"read",PREPARE:"prepare",EXECUTE:"execute",AUTONOMOUS:"autonomous"}),av=new Set(["evm:execute","btc:execute","solana:execute","nft:buy","nft:mint","cow:submit"]),cv=new Set(["evm:prepare"]),lv="public package is prepare-only; the user wallet or private operator must sign and submit";function un(e=process.env){return String(e.ORACLE_AUTONOMOUS_TRADING??"").trim()==="1"}function Mp(e=process.env){return String(e.ORACLE_AUTONOMOUS_MINT??process.env.ORACLE_AUTONOMOUS_MINT??"").trim()==="1"}function Up(e,{env:t=process.env,userInitiated:n=!1,autonomous:r=!1}={}){return av.has(e)?{capability:e,armed:!1,allowed:!1,reason:lv}:cv.has(e)?String(t.ORACLE_EVM_ADDRESS??"").trim()?!n&&!r?{capability:e,armed:!1,allowed:!1,reason:"preparation requires an explicit request or enabled unattended preparation"}:r&&!un(t)?{capability:e,armed:!1,allowed:!1,reason:"unattended preparation is off"}:{capability:e,armed:!1,allowed:!0,reason:null}:{capability:e,armed:!1,allowed:!1,reason:"a public address is required to prepare this action"}:{capability:e,armed:!1,allowed:!1,reason:`unknown capability: ${e}`}}function uv(e,t={}){let n=Up(e,t);if(!n.allowed){let r=new Error(`oracle: ${e} not permitted: ${n.reason}`);throw r.status=n,r}return n}function dv(e=process.env){return{model:"public prepare-only; execution is unavailable",armed:[],autonomousTrading:"off",autonomousPreparation:un(e)?"ENABLED":"off",note:"Oracle prepares unsigned actions. The user wallet or private operator signs and submits."}}Lo();W();var Dp={1:"https://api.cow.fi/mainnet/api/v1",100:"https://api.cow.fi/xdai/api/v1",42161:"https://api.cow.fi/arbitrum_one/api/v1",8453:"https://api.cow.fi/base/api/v1"},fv=Object.freeze({1:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41",100:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41",42161:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41",8453:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41"}),hv=Object.freeze({1:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110",100:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110",42161:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110",8453:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110"}),va={1:"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",8453:"0x4200000000000000000000000000000000000006",42161:"0x82aF49447D8a07e3bd95BD0d56f35241523fBab1"},Fp={1:"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",8453:"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",42161:"0xaf88d065e77c8cC2239327C5EDb3A432268e5831"},Bp=Object.freeze({Order:[{name:"sellToken",type:"address"},{name:"buyToken",type:"address"},{name:"receiver",type:"address"},{name:"sellAmount",type:"uint256"},{name:"buyAmount",type:"uint256"},{name:"validTo",type:"uint32"},{name:"appData",type:"bytes32"},{name:"feeAmount",type:"uint256"},{name:"kind",type:"string"},{name:"partiallyFillable",type:"bool"},{name:"sellTokenBalance",type:"string"},{name:"buyTokenBalance",type:"string"}]}),v2=Object.freeze({OrderCancellations:[{name:"orderUids",type:"bytes[]"}]});function Ea(e,t={}){if(t.baseUrl)return t.baseUrl.replace(/\/$/,"");let n=Dp[Number(e)];if(!n)throw new Error(`cowswap: unsupported chainId ${e}`);return n}function Vo(e,t){let n=String(e||"").trim();if(!mv(n))throw new Error(`cowswap: ${t} must be an address`);return hr(n).toLowerCase()}function ka(e,t){try{let n=BigInt(String(e));if(n<0n)throw new Error("negative");return n.toString()}catch{throw new Error(`cowswap: ${t} must be a non-negative integer string`)}}function gv(e,t){let n=String(e||"").trim();if(!/^0x[0-9a-fA-F]{64}$/.test(n))throw new Error(`cowswap: ${t} must be bytes32 hex`);return n.toLowerCase()}function yv(e){let t=fv[Number(e)];if(!t)throw new Error(`cowswap: settlement contract not registered for chain ${e}`);return{name:"Gnosis Protocol",version:"v2",chainId:Number(e),verifyingContract:hr(t)}}function bv(e={},t,n){let r=Vo(e.sellToken,"sellToken"),o=Vo(e.buyToken,"buyToken"),i=Vo(e.receiver||n,"receiver"),s=Number(e.validTo);if(!Number.isInteger(s)||s<=0)throw new Error("cowswap: quote.validTo required");let a=gv(e.appData||e.appDataHash||`0x${"0".repeat(64)}`,"appData");return{sellToken:r,buyToken:o,receiver:i,sellAmount:ka(e.sellAmount,"sellAmount"),buyAmount:ka(e.buyAmount,"buyAmount"),validTo:s,appData:a,feeAmount:ka(e.feeAmount??"0","feeAmount"),kind:String(e.kind||"sell"),partiallyFillable:!!e.partiallyFillable,sellTokenBalance:String(e.sellTokenBalance||"erc20"),buyTokenBalance:String(e.buyTokenBalance||"erc20")}}async function qp(e={}){try{let t=await mt({chainId:1,sellToken:va[1],buyToken:Fp[1],sellAmountBeforeFee:"1000000000000000",from:ut},e);return{ok:!0,buyAmount:t.quote?.buyAmount||t.buyAmount}}catch(t){return{ok:!1,error:String(t.message||t).slice(0,160)}}}async function mt(e={},t={}){let n=Number(e.chainId??1),r=ma(e.from||e.owner),o=e.sellToken||va[n],i=e.buyToken||Fp[n],s=String(e.sellAmountBeforeFee||e.sellAmount||"0");if(!o||!i||s==="0")throw new Error("cowQuote requires sellToken, buyToken, sellAmountBeforeFee");if(/eeeeeeee|native|^eth$/i.test(o)&&(o=va[n],!o))throw new Error("no WETH mapping for chain");let a={sellToken:o,buyToken:i,from:r,receiver:e.receiver||r,sellAmountBeforeFee:s,kind:e.kind||"sell",signingScheme:e.signingScheme||"eip1271"},c=await y(`${Ea(n,t)}/quote`,{method:"POST",body:a,fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),l=c?.quote?.buyAmount||c?.buyAmount;return l?V(c,{chainId:n,venue:"cowswap-order",amountOut:l,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps}):c}async function Hp(e={},t={}){let n=Number(e.chainId??1),r=Vo(ma(e.from||e.owner||e.signer),"owner"),o=await mt({...e,chainId:n,from:r,signingScheme:e.signingScheme||"eip712"},t),i=bv(o?.quote||o,n,r),s=yv(n),a={domain:s,types:Bp,primaryType:"Order",message:i},c=pv.hash(s,Bp,i),l=hv[n];if(!l)throw new Error(`cowswap: vault relayer not registered for chain ${n}`);return O({provider:"cowswap",orderReady:!0,executionReady:!1,chainId:n,owner:r,signingScheme:"eip712",settlement:s.verifyingContract.toLowerCase(),vaultRelayer:hr(l).toLowerCase(),quote:o,quoteId:o?.id??e.quoteId??null,typedData:a,cowGuard:{mode:"cow-order",version:1,provider:"cowswap",chainId:n,owner:r,settlement:s.verifyingContract.toLowerCase(),vaultRelayer:hr(l).toLowerCase(),sellToken:i.sellToken,buyToken:i.buyToken,sellAmount:i.sellAmount,buyAmount:i.buyAmount,validTo:i.validTo,quoteId:o?.id??e.quoteId??null,typedDataHash:c,issuedAtMs:Date.now(),expiresAtMs:Math.min(i.validTo*1e3,Date.now()+2e4)},requiresApproval:{token:i.sellToken,spender:hr(l).toLowerCase(),amount:i.sellAmount}},{provider:"cowswap",kind:"cow-order"})}async function jp(e={},t={}){let n=Number(e.chainId??1),r=String(e.uid||e.orderUid||"").trim();if(!r)throw new Error("cowOrderStatus requires uid");return y(`${Ea(n,t)}/orders/${encodeURIComponent(r)}/status`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function Vp(e={},t={}){let n=Number(e.chainId??1),r=String(e.uid||e.orderUid||"").trim();if(!r)throw new Error("cowOrder requires uid");return y(`${Ea(n,t)}/orders/${encodeURIComponent(r)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}function zp(){return Object.keys(Dp).map(Number)}T();me();W();var xv="https://api.1inch.dev/swap/v6.0";function Wp(e={}){return Oe({provider:"oneinch",defaultUrl:xv,hosts:["api.1inch.dev"],url:e.baseUrl||process.env.ONEINCH_API_URL})}function Aa(e={}){return Wp(e).baseUrl}function gr(e={}){return e.apiKey||process.env.ONEINCH_API_KEY||process.env.ONE_INCH_API_KEY||""}function Ia(e={}){let t=gr(e);return ve({accept:"application/json"},{Authorization:t?`Bearer ${t}`:""},Wp(e).trusted)}async function Gp(e={}){if(!gr(e))return{ok:!1,configured:!1,error:"ONEINCH_API_KEY not set"};try{return{ok:!0,configured:!0,dstAmount:(await yr({chainId:8453,src:"0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",dst:"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",amount:"1000000000000000"},e)).dstAmount}}catch(t){return{ok:!1,configured:!0,error:String(t.message||t).slice(0,160)}}}async function yr(e={},t={}){if(!gr(t))throw new Error("ONEINCH_API_KEY required for 1inch");let n=Number(e.chainId??1),{src:r,dst:o,amount:i}=e;if(!r||!o||!i)throw new Error("oneinchQuote requires src, dst, amount");let s=new URLSearchParams({src:r,dst:o,amount:String(i)}),a=await y(`${Aa(t)}/${n}/quote?${s}`,{headers:Ia(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3});return a?.dstAmount?V(a,{chainId:n,venue:"1inch-quote",amountOut:a.dstAmount,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps}):a}function Sv(e){return/^(eth|native|0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee)$/i.test(String(e||""))}async function _a(e={},t={}){if(!gr(t))throw new Error("ONEINCH_API_KEY required for 1inch");let n=Number(e.chainId??1);return y(`${Aa(t)}/${n}/approve/spender`,{headers:Ia(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function Kp(e={},t={}){if(!gr(t))throw new Error("ONEINCH_API_KEY required for 1inch");let n=Number(e.chainId??1),{src:r,dst:o,amount:i}=e,s=e.from||e.fromAddress||e.userAddress||e.taker;if(!r||!o||!i||!s)throw new Error("oneinchPrepare requires src, dst, amount, from");let a=pe({liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps});if(!a.executable)throw new Error(`1inch: route requires ${a.requiredBps} bps above cap ${a.capBps}`);let c=new URLSearchParams({src:r,dst:o,amount:String(i),from:s,slippage:String(a.selectedBps/100)});e.receiver&&c.set("receiver",e.receiver),e.referrer&&c.set("referrer",e.referrer),e.disableEstimate!=null&&c.set("disableEstimate",String(!!e.disableEstimate)),e.allowPartialFill!=null&&c.set("allowPartialFill",String(!!e.allowPartialFill)),e.includeProtocols&&c.set("includeProtocols",String(e.includeProtocols)),e.excludeProtocols&&c.set("excludeProtocols",String(e.excludeProtocols));let l=await y(`${Aa(t)}/${n}/swap?${c}`,{headers:Ia(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??25e3}),u=l?.tx;if(!u?.to||!u?.data)throw new Error("1inch: swap returned no executable tx");if(u.from&&String(u.from).toLowerCase()!==String(s).toLowerCase())throw new Error("1inch: transaction sender mismatch");let d=l?.dstAmount||l?.toTokenAmount||l?.buyAmount;if(!d)throw new Error("1inch: swap response missing dstAmount");let p=V(l,{chainId:n,venue:u.to,amountOut:d,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps}),m=null;if(!Sv(r)){let f=l?.spender||l?.approvalAddress||(await _a({chainId:n},t))?.address;if(!f)throw new Error("1inch: ERC-20 route missing approval spender");m={token:r,spender:f,amount:String(i)}}return O({provider:"oneinch",calldataReady:!0,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:n,quote:p,autoSlippage:p.autoSlippage,requiresApproval:m,transaction:{chainId:n,from:u.from||s,to:u.to,data:u.data,value:u.value??"0x0",...u.gas!=null?{gasLimit:u.gas}:{},slippageGuard:J(p.autoSlippage,{chainId:n,venue:u.to,data:u.data})}},{provider:"oneinch",kind:"oneinch-tx"})}var vv=process.env.HL_WS_URL||"wss://api.hyperliquid.xyz/ws";async function br(e,t={}){if(!e?.type)throw new Error("hlWsSnapshot requires subscription.type");let n=t.timeoutMs??8e3,r=t.maxMessages??1,o=t.WebSocket||globalThis.WebSocket;if(!o)throw new Error("WebSocket not available in this runtime");let i=t.url||vv,s=Date.now();return new Promise((a,c)=>{let l=!1,u=[],d=0,p=new o(i),m=setTimeout(()=>{f(),l||(l=!0,u.length?a({ok:!0,partial:!0,ms:Date.now()-s,messages:u}):c(new Error(`hl ws timeout after ${n}ms`)))},n);function f(){clearTimeout(m);try{p.close()}catch{}}p.addEventListener("open",()=>{p.send(JSON.stringify({method:"subscribe",subscription:e}))}),p.addEventListener("message",h=>{let g;try{g=JSON.parse(typeof h.data=="string"?h.data:String(h.data))}catch{g={raw:String(h.data).slice(0,200)}}u.push(g),g.channel&&g.channel!=="subscriptionResponse"?d+=1:g.data&&g.channel==="subscriptionResponse"||g.channel||(d+=1),d>=r&&(f(),l||(l=!0,a({ok:!0,ms:Date.now()-s,subscription:e,messages:u,last:u[u.length-1]})))}),p.addEventListener("error",()=>{f(),l||(l=!0,c(new Error("hl ws error")))})})}async function Yp(e={}){try{let t=await br({type:"allMids"},{...e,maxMessages:1}),n=t.last||{},r=n.data?.mids||n.data||{},o=typeof r=="object"?Object.keys(r).length:0;return{ok:!0,ms:t.ms,midCount:o,channel:n.channel||null}}catch(t){return{ok:!1,error:String(t.message||t).slice(0,160)}}}async function Xp(e={}){let t=await br({type:"allMids"},e),n=t.last||{};return{ms:t.ms,mids:n.data?.mids||n.data||{},channel:n.channel}}async function Qp(e,t={}){if(!e)throw new Error("coin required");let n=await br({type:"l2Book",coin:String(e)},t);return{ms:n.ms,book:n.last?.data||n.last,channel:n.last?.channel}}var Av=process.env.POLY_WS_URL||"wss://ws-subscriptions-clob.polymarket.com/ws/market";async function zo(e=[],t={}){let n=Array.isArray(e)?e.map(String):[String(e)];if(!n.length||!n[0])throw new Error("polyWsSnapshot requires assetIds");let r=t.timeoutMs??8e3,o=t.maxMessages??1,i=t.WebSocket||globalThis.WebSocket;if(!i)throw new Error("WebSocket not available");let s=t.url||Av,a=Date.now();return new Promise((c,l)=>{let u=!1,d=[],p=0,m=new i(s),f=setTimeout(()=>{h(),u||(u=!0,d.length?c({ok:!0,partial:!0,ms:Date.now()-a,messages:d}):l(new Error(`poly ws timeout after ${r}ms`)))},r);function h(){clearTimeout(f);try{m.close()}catch{}}m.addEventListener("open",()=>{m.send(JSON.stringify({assets_ids:n,type:"market"}))}),m.addEventListener("message",g=>{let b;try{b=JSON.parse(typeof g.data=="string"?g.data:String(g.data))}catch{b={raw:String(g.data).slice(0,300)}}d.push(b),p+=1,p>=o&&(h(),u||(u=!0,c({ok:!0,ms:Date.now()-a,assetIds:n,messages:d,last:d[d.length-1]})))}),m.addEventListener("error",()=>{h(),u||(u=!0,l(new Error("poly ws error")))})})}async function Jp(e={}){let t=e.assetId||"98022490269692409998126496127597032490334070080325855126491859374983463996227";try{let n=await zo([t],{...e,maxMessages:1});return{ok:!0,ms:n.ms,got:!!n.last,partial:n.partial||!1}}catch(n){return{ok:!1,error:String(n.message||n).slice(0,160)}}}async function Zp(e,t={}){if(!e)throw new Error("assetId required");let n=await zo([e],t);return{ms:n.ms,assetId:String(e),data:n.last,messages:n.messages}}T();import{readFileSync as _v,existsSync as Pv}from"node:fs";import{getAddress as Nv}from"ethers";W();var Cv="https://api.opensea.io/api/v2",Tv=Object.freeze(["blast","base","ethereum","zora","arbitrum","sei","avalanche","polygon","optimism","ape_chain","flow","b3","soneium","ronin","bera_chain","solana","shape","unichain","gunzilla","abstract","animechain","hyperevm","somnia","monad","hyperliquid","megaeth","ink","robinhood","stablechain"]),Ov=new Set(Tv),tm=new Set(["solana","flow"]),Rv="0x0000000000000000000000000000000000000000";function $v(){let e=process.env.OPENSEA_ENV_FILE||`${process.env.HOME||""}/.config/locals-only/opensea.env`;if(!Pv(e))return"";try{for(let t of _v(e,"utf8").split(`
|
|
5
|
+
`)){let n=t.match(/^\s*OPENSEA_API_KEY\s*=\s*(.+)\s*$/);if(n)return n[1].replace(/^["']|["']$/g,"").trim()}}catch{}return""}function pn(e={}){return e.apiKey?e.apiKey:e.allowAmbientCredentials===!1||e.allowDiskCredentials===!1?e.env?.OPENSEA_API_KEY||e.env?.OPEN_SEA_API_KEY||"":e.env?.OPENSEA_API_KEY||process.env.OPENSEA_API_KEY||process.env.OPEN_SEA_API_KEY||$v()}function nm(e={}){return Oe({provider:"opensea",defaultUrl:Cv,hosts:["api.opensea.io","testnets-api.opensea.io"],url:e.baseUrl||process.env.OPENSEA_API_URL})}function Wo(e={}){return nm(e).baseUrl}function Go(e={}){return ve({accept:"application/json"},{"x-api-key":pn(e)},nm(e).trusted)}function rm(e){let t=String(e||"ethereum").trim().toLowerCase();if(!Ov.has(t))throw new Error(`opensea: unsupported account chain ${t}`);return t}function dn(e,t="address"){try{return Nv(String(e||"").trim().toLowerCase())}catch{throw new Error(`opensea: invalid ${t}`)}}function om(e,t=null){let n=String(e||"").trim();if(!n)throw new Error("opensea: account address required");if(t&&!tm.has(t)||!t&&/^0x[0-9a-fA-F]{40}$/.test(n))return dn(n,"account address");if(!/^[1-9A-HJ-NP-Za-km-z]{32,64}$/.test(n))throw new Error("opensea: invalid account address");return n}function Lv(e,t){let n=String(e??"").trim();if(!/^(?:0|[1-9]\d*)(?:\.\d+)?$/.test(n)||Number(n)<=0)throw new Error(`opensea: ${t} must be a positive plain decimal`);return n}function Mv(e,t){let n=Number(e);if(!Number.isSafeInteger(n)||n<=0)throw new Error(`opensea: ${t} must be a positive integer`);return n}function em(e,t){let n=String(e||"").trim(),r=Date.parse(n);if(!n||!Number.isFinite(r))throw new Error(`opensea: ${t} must be an ISO 8601 timestamp`);return{text:new Date(r).toISOString(),ms:r}}function Uv(e={},t,n){return{chain:t,owner:n,contract:e.contract||null,tokenId:e.identifier==null?null:String(e.identifier),tokenStandard:e.token_standard||null,collection:e.collection||null,name:e.name||null,description:e.description||null,imageUrl:e.display_image_url||e.image_url||e.original_image_url||null,originalImageUrl:e.original_image_url||e.image_url||null,animationUrl:e.display_animation_url||e.original_animation_url||null,metadataUrl:e.metadata_url||null,marketplaceUrl:e.opensea_url||null,estimatedValueUsd:e.estimated_value_usd!=null&&Number.isFinite(Number(e.estimated_value_usd))?Number(e.estimated_value_usd):null,spam:e.is_disabled===!0,disabled:e.is_disabled===!0,nsfw:e.is_nsfw===!0,traits:Array.isArray(e.traits)?e.traits:[],updatedAt:e.updated_at||null,acquisitionCost:null,itemPnl:{status:"unavailable",reason:"OpenSea account inventory does not expose trustworthy per-item acquisition cost"}}}async function im(e={}){if(!pn(e))return{ok:!1,configured:!1,error:"OPENSEA_API_KEY not set"};try{let t=await Ko("boredapeyachtclub",e);return{ok:!0,configured:!0,name:t.name||t.collection}}catch(t){return{ok:!1,configured:!0,error:String(t.message||t).slice(0,160)}}}async function Ko(e,t={}){if(!e)throw new Error("collection slug required");if(!pn(t))throw new Error("OPENSEA_API_KEY required");return y(`${Wo(t)}/collections/${encodeURIComponent(e)}`,{headers:Go(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function sm(e,t={}){let n=await Ko(e,t),r=n.stats||n.total||{},o=n.floor_price??n.floorPrice??r.floor_price??r.floorPrice??null;return{slug:n.collection||e,name:n.name||null,floor:o,totalSupply:n.total_supply??r.total_supply??null,numOwners:n.num_owners??r.num_owners??null,raw:{contracts:n.contracts,fees:n.fees,category:n.category}}}async function wr(e={},t={}){if(!pn(t))throw new Error("OPENSEA_API_KEY required");let n=rm(e.chain),r=om(e.address||e.owner,n),o=Math.min(Math.max(Number(e.pageSize??e.limit??200)||200,1),200),i=Math.min(Math.max(Number(e.maxPages??5)||5,1),25),s=[],a=e.next?String(e.next):null,c=0;do{let l=new URL(`${Wo(t)}/chain/${encodeURIComponent(n)}/account/${encodeURIComponent(r)}/nfts`);l.searchParams.set("limit",String(o)),e.collection&&l.searchParams.set("collection",String(e.collection)),a&&l.searchParams.set("next",a);let u=await y(l.toString(),{headers:Go(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4});for(let d of Array.isArray(u?.nfts)?u.nfts:[])s.push(Uv(d,n,r));a=u?.next?String(u.next):null,c+=1}while(a&&c<i);return{provider:"opensea-nft",source:"opensea-account-inventory",chain:n,owner:r,count:s.length,pages:c,complete:!a,next:a,nfts:s,exec:!1,readOnly:!0}}async function Yo(e={},t={}){if(!pn(t))throw new Error("OPENSEA_API_KEY required");let n=om(e.address||e.owner),r=await y(`${Wo(t)}/account/${encodeURIComponent(n)}/pnl`,{headers:Go(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4});return{provider:"opensea-nft",source:"opensea-indexed-account-pnl",address:n,scope:"OpenSea-indexed account trading PnL across supported currencies, not per-item NFT cost basis",methodology:"provider-indexed",realizedPnlUsd:r?.realized_pnl_usd??null,unrealizedPnlUsd:r?.unrealized_pnl_usd??null,totalPnlUsd:r?.total_pnl_usd??null,netInvestedUsd:r?.net_invested_usd??null,currentValueUsd:r?.current_value_usd??null,returnPercentage:r?.return_percentage??null,itemLevelPnlAvailable:!1,raw:r,exec:!1,readOnly:!0}}function Bv(e={}){let t=rm(e.chain);if(tm.has(t))throw new Error("opensea: listing actions currently require an EVM NFT chain");let n=e.startTime||e.start_time?em(e.startTime||e.start_time,"startTime"):{text:new Date().toISOString(),ms:Date.now()},r=em(e.endTime||e.end_time,"endTime");if(r.ms<=n.ms)throw new Error("opensea: endTime must be after startTime");let o=String(e.tokenId??e.token_id??"").trim();if(!/^\d+$/.test(o))throw new Error("opensea: tokenId must be an unsigned integer string");return{chain:t,contract:dn(e.contract,"NFT contract"),token_id:o,quantity:Mv(e.quantity??1,"quantity"),price:{amount:Lv(e.price?.amount??e.amount??e.priceAmount,"price amount"),currency:dn(e.price?.currency??e.currency??Rv,"price currency")},start_time:n.text,end_time:r.text}}function Dv(e=[]){return e.some(t=>/approv|setapprovalforall/i.test(JSON.stringify(t)))}async function Xo(e={},t={}){if(!pn(t))throw new Error("OPENSEA_API_KEY required");if(e.userConfirmed!==!0)throw new Error("opensea: userConfirmed=true required after NFT, marketplace, price, currency, and expiry review");let n=dn(e.seller||e.address||e.owner,"seller"),r=Array.isArray(e.items)&&e.items.length?e.items:[e];if(r.length>50)throw new Error("opensea: at most 50 listing items per preparation");let o=r.map(Bv);if(new Set(o.map(u=>u.chain)).size!==1)throw new Error("opensea: all prepared listing items must be on one chain");let s=e.useCreatorFee!==!1,a={address:n,items:o,use_creator_fee:s};e.taker&&(a.taker=dn(e.taker,"taker"));let c=await y(`${Wo(t)}/listings/actions`,{method:"POST",headers:Go(t),body:a,fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??25e3,retries:0,dedupe:!1}),l=Array.isArray(c?.steps)?c.steps:[];if(!l.length)throw new Error("opensea: listing action response contained no wallet steps");return O({provider:"opensea-nft",marketplace:"opensea",chain:o[0].chain,kind:"nft-list-actions",prepareReady:!0,executionReady:!1,signingReady:!1,broadcastReady:!1,requiresUserSignature:!0,requiresSeparateApproval:Dv(l),seller:n,items:o,useCreatorFee:s,taker:a.taker||null,feeDisclosure:s?"Creator fees requested. Inspect the returned Seaport consideration recipients and wallet simulation before signing.":"Creator fees disabled by explicit request. Marketplace protocol fees may still apply and must be inspected before signing.",steps:l,note:"Execute approvals separately, then sign the Seaport order in the user's wallet. Oracle does not submit or broadcast the listing."})}var am=999;async function cm(e={}){let t={chainId:am,rpc:null,dex:null};try{t.rpc=await er(am,e)}catch(n){t.rpc={ok:!1,error:String(n.message||n).slice(0,120)}}try{let n=await tr("HYPE",e),r=(n.pairs||[]).filter(o=>/hyper|hl|hyperevm/i.test(String(o.chainId||o.chain||"")));t.dex={ok:!0,hypePairs:r.length||(n.pairs||[]).length,sample:(r[0]||n.pairs?.[0])?.pairAddress||null}}catch(n){t.dex={ok:!1,error:String(n.message||n).slice(0,120)}}return{ok:!!(t.rpc?.ok||t.dex?.ok),...t}}async function lm(e="HYPE",t={}){let r=(await tr(e,t)).pairs||[],o=r.filter(i=>/hyper|hl|hyperevm/i.test(String(i.chainId||"")));return{query:e,hyperPairs:o,allPairs:r.slice(0,20),count:o.length||r.length}}async function um(e,t={}){return Rt(e,t)}T();W();var Hv="https://api-mainnet.magiceden.dev/v2",xr=1e9;function dm(e={}){return Oe({provider:"magiceden",defaultUrl:Hv,hosts:["api-mainnet.magiceden.dev","api-devnet.magiceden.dev"],url:e.baseUrl||process.env.MAGICEDEN_API_URL})}function fn(e={}){return dm(e).baseUrl}function Mt(e={}){return e.apiKey||process.env.MAGICEDEN_API_KEY||""}function hn(e={}){let t=Mt(e);return ve({accept:"application/json"},{Authorization:t?`Bearer ${t}`:""},dm(e).trusted)}function Pa(e){let t=String(e||"").trim();if(!/^[a-z0-9_]{1,64}$/i.test(t))throw new Error("magiceden: symbol must be a collection slug");return t}function mn(e,t){if(typeof e=="number"){if(!Number.isFinite(e)||e<=0)throw new Error(`magiceden: ${t} must be a positive number`);return e}let n=String(e??"").trim();if(!/^\d+(\.\d+)?$/.test(n))throw new Error(`magiceden: ${t} must be a plain decimal number (no hex, exponent, or sign)`);let r=Number(n);if(!Number.isFinite(r)||r<=0)throw new Error(`magiceden: ${t} must be a positive number`);return r}function jv(e){let t=[e?.price,e?.mintPrice,e?.priceSol,e?.v0?.price,e?.launchStageInfo?.price,e?.stage?.price];for(let n of t){if(n==null)continue;let r=Number(n);if(Number.isFinite(r)&&r>=0)return r}return e?.isFree===!0?0:null}function Vv(e){return Math.round(mn(e,"priceSol")*xr)}function zv(e){if(e==null||e==="")throw new Error("magiceden: listing expiry is required and must be in the future");let t=Number(e);if(!Number.isSafeInteger(t)||t<=0)throw new Error("magiceden: expiry must be a future Unix timestamp in seconds");if(t<=Math.floor(Date.now()/1e3))throw new Error("magiceden: expiry must be in the future");return t}function Wv({tokenMint:e,priceSol:t,expiry:n}){return`list ${e} on magiceden-sol for ${t} SOL until ${n}`}function Gv(e,t){if(e.userConfirmed!==!0)throw new Error("magiceden: listing requires userConfirmed=true after reviewing tokenMint, priceSol, and expiry");let n=Wv(t);if(String(e.confirmation||e.confirmationPhrase||"").trim()!==n)throw new Error(`magiceden: confirmation must equal ${JSON.stringify(n)}`);return n}async function pm(e={}){try{let t=await Na({symbol:"mad_lads"},e);return{ok:!0,provider:"magiceden-sol",keyed:!!Mt(e),readTier:"keyless",prepareTier:Mt(e)?"keyed":"requires MAGICEDEN_API_KEY",floorPriceSol:t.floorPriceSol,exec:!1}}catch(t){return{ok:!1,provider:"magiceden-sol",keyed:!!Mt(e),error:String(t?.message||t).slice(0,160),exec:!1}}}async function Na(e={},t={}){let n=Pa(e.symbol||e.collection),r=await y(`${fn(t)}/collections/${encodeURIComponent(n)}/stats`,{headers:hn(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),o=Number(r?.floorPrice??0);return{provider:"magiceden-sol",chain:"solana-mainnet-beta",symbol:n,floorPriceLamports:o||null,floorPriceSol:o?o/xr:null,listedCount:r?.listedCount??null,volume24hrSol:r?.volume24hr!=null?Number(r.volume24hr)/xr:null,avgPrice24hrSol:r?.avgPrice24hr!=null?Number(r.avgPrice24hr)/xr:null,exec:!1,raw:r}}function mm(e={}){let t=Number(e.price??0);return{tokenMint:e.tokenMint??null,tokenATA:e.tokenAddress??null,seller:e.seller??null,sellerReferral:e.sellerReferral??null,auctionHouse:e.auctionHouse??null,pdaAddress:e.pdaAddress??null,priceSol:t||null,priceLamports:t?Math.round(t*xr):null,tokenSize:e.tokenSize??1}}async function fm(e={},t={}){let n=Pa(e.symbol||e.collection),r=Math.min(Math.max(Number(e.limit??20)||20,1),100),o=Math.max(Number(e.offset??0)||0,0),i=new URL(`${fn(t)}/collections/${encodeURIComponent(n)}/listings`);i.searchParams.set("offset",String(o)),i.searchParams.set("limit",String(r)),e.sort&&i.searchParams.set("sort",String(e.sort));let s=await y(i.toString(),{headers:hn(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),a=(Array.isArray(s)?s:[]).map(mm);return{provider:"magiceden-sol",chain:"solana-mainnet-beta",symbol:n,count:a.length,listings:a,exec:!1}}async function hm(e={},t={}){let n=K(e.tokenMint||e.mint,"tokenMint"),r=await y(`${fn(t)}/tokens/${encodeURIComponent(n)}/listings`,{headers:hn(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),o=(Array.isArray(r)?r:[]).map(mm);return{provider:"magiceden-sol",chain:"solana-mainnet-beta",tokenMint:n,listings:o,exec:!1}}async function gm(e={},t={}){if(!Mt(t))throw new Error("magiceden: MAGICEDEN_API_KEY required to build a buy instruction");let n=K(e.buyer||e.userPublicKey,"buyer"),r=K(e.seller,"seller"),o=K(e.tokenMint,"tokenMint"),i=K(e.tokenATA||e.tokenAddress,"tokenATA"),s=K(e.auctionHouse,"auctionHouse"),a=mn(e.priceSol??e.price,"priceSol"),c=e.maxPriceSol==null?a:mn(e.maxPriceSol,"maxPriceSol");if(a>c)throw new Error(`magiceden: listing price ${a} SOL exceeds maxPriceSol cap ${c} SOL`);let l=new URL(`${fn(t)}/instructions/buy_now`);l.searchParams.set("buyer",n),l.searchParams.set("seller",r),l.searchParams.set("auctionHouseAddress",s),l.searchParams.set("tokenMint",o),l.searchParams.set("tokenATA",i),l.searchParams.set("price",String(a)),e.sellerReferral&&l.searchParams.set("sellerReferral",String(e.sellerReferral)),e.buyerReferral&&l.searchParams.set("buyerReferral",String(e.buyerReferral));let u=await y(l.toString(),{headers:hn(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3});et("magiceden",u);let d=u?.v0?.tx?.data??u?.tx?.data??null;if(!Array.isArray(d))throw u?.txSigned?new Error("magiceden: refused a pre-signed transaction payload from the API"):new Error("magiceden: buy_now returned no unsigned transaction payload");let p=Buffer.from(d).toString("base64");return O({provider:"magiceden-sol",chain:"solana-mainnet-beta",kind:"nft-buy",prepareReady:!0,executionReady:!1,signingReady:!1,broadcastReady:!1,requiresUserSignature:!0,buyer:n,seller:r,tokenMint:o,priceSol:a,maxPriceSol:c,lamports:Vv(a),transaction:p,transactionEncoding:"base64",raw:u})}async function Qo(e={},t={}){if(!Mt(t))throw new Error("magiceden: MAGICEDEN_API_KEY required to build a list instruction");let n=K(e.seller||e.userPublicKey,"seller"),r=K(e.tokenMint,"tokenMint"),o=K(e.tokenATA||e.tokenAddress,"tokenATA"),i=K(e.auctionHouse,"auctionHouse"),s=mn(e.priceSol??e.price,"priceSol"),a=zv(e.expiry),c=Gv(e,{tokenMint:r,priceSol:s,expiry:a}),l=new URL(`${fn(t)}/instructions/sell`);l.searchParams.set("seller",n),l.searchParams.set("auctionHouseAddress",i),l.searchParams.set("tokenMint",r),l.searchParams.set("tokenAccount",o),l.searchParams.set("price",String(s)),e.sellerReferral&&l.searchParams.set("sellerReferral",K(e.sellerReferral,"sellerReferral")),a!=null&&l.searchParams.set("expiry",String(a));let u=await y(l.toString(),{headers:hn(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3});et("magiceden",u);let d=u?.v0?.tx?.data??u?.tx?.data??null;if(!Array.isArray(d))throw u?.txSigned?new Error("magiceden: refused a pre-signed transaction payload from the API"):new Error("magiceden: sell returned no unsigned transaction payload");let p=Buffer.from(d).toString("base64");return O({provider:"magiceden-sol",chain:"solana-mainnet-beta",kind:"nft-list",prepareReady:!0,executionReady:!1,signingReady:!1,broadcastReady:!1,requiresUserSignature:!0,seller:n,tokenMint:r,priceSol:s,expiry:a,confirmation:c,transaction:p,transactionEncoding:"base64",raw:u})}async function ym(e={},t={}){if(!Mt(t))throw new Error("magiceden: MAGICEDEN_API_KEY required to build a mint instruction");let n=K(e.buyer||e.userPublicKey,"buyer"),r=Pa(e.symbol||e.collection);if(e.maxPriceSol==null)throw new Error("magiceden: maxPriceSol is required to prepare a mint \u2014 an uncapped mint has no spend ceiling");let o=mn(e.maxPriceSol,"maxPriceSol"),i=e.nftAmount==null?1:mn(e.nftAmount,"nftAmount");if(!Number.isInteger(i))throw new Error("magiceden: nftAmount must be a whole number");let s=new URL(`${fn(t)}/instructions/mint`);s.searchParams.set("symbol",r),s.searchParams.set("wallet",n),s.searchParams.set("nftAmount",String(i));let a=await y(s.toString(),{headers:hn(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),c=jv(a);if(c==null)throw new Error("magiceden: mint price not present in the API response \u2014 refusing to prepare an unverifiable spend");let l=c*i;if(l>o)throw new Error(`magiceden: mint cost ${l} SOL exceeds maxPriceSol cap ${o} SOL`);et("magiceden",a);let u=a?.v0?.tx?.data??a?.tx?.data??null;if(!Array.isArray(u))throw a?.txSigned?new Error("magiceden: refused a pre-signed transaction payload from the API"):new Error("magiceden: mint returned no unsigned transaction payload");let d=Buffer.from(u).toString("base64");return O({provider:"magiceden-sol",chain:"solana-mainnet-beta",kind:"nft-mint",prepareReady:!0,executionReady:!1,signingReady:!1,broadcastReady:!1,requiresUserSignature:!0,buyer:n,symbol:r,nftAmount:i,priceSol:c,totalSol:l,maxPriceSol:o,transaction:d,transactionEncoding:"base64",raw:a})}W();T();var gn=8,Ca=10n**BigInt(gn),Yv="0xa4b1",bm=7,Ta=1,Xv=2n**64n-1n;function Qv(e={}){return e.exchangeUrl?e.exchangeUrl:process.env.HL_EXCHANGE_URL?process.env.HL_EXCHANGE_URL:e.testnet||process.env.HL_TESTNET==="1"?"https://api.hyperliquid-testnet.xyz/exchange":"https://api.hyperliquid.xyz/exchange"}function kr(e={}){return e.testnet||process.env.HL_TESTNET==="1"?"Testnet":"Mainnet"}function bn(e,t){let n=String(e||"").trim();if(!/^0x[0-9a-fA-F]{40}$/.test(n))throw new Error(`hl-staking: ${t} must be a 0x EVM address`);return n.toLowerCase()}function Sr(e,t="amount"){let n=String(e??"").trim();if(!/^\d+(\.\d+)?$/.test(n))throw new Error(`hl-staking: ${t} must be a positive decimal HYPE amount`);let[r,o=""]=n.split(".");if(o.length>gn)throw new Error(`hl-staking: ${t} has more than ${gn} decimals`);let i=BigInt(r)*Ca+BigInt((o+"0".repeat(gn)).slice(0,gn)||"0");if(i<=0n)throw new Error(`hl-staking: ${t} must be greater than zero`);if(i>Xv)throw new Error(`hl-staking: ${t} exceeds the uint64 range the signed action encodes`);return i.toString()}function yn(e){let t=BigInt(e);return t<=BigInt(Number.MAX_SAFE_INTEGER)?Number(t):e}function tt(e){let t=BigInt(String(e||"0")),n=t/Ca,r=(t%Ca).toString().padStart(gn,"0").replace(/0+$/,"");return r?`${n}.${r}`:String(n)}async function wm(e={}){try{let t=await Oa(e);return{ok:t.count>0,provider:"hl-staking",chain:kr(e),validators:t.count,exec:!1}}catch(t){return{ok:!1,provider:"hl-staking",error:String(t?.message||t).slice(0,160),exec:!1}}}async function Oa(e={}){let t=await G({type:"validatorSummaries"},e),r=(Array.isArray(t)?t:[]).map(o=>({validator:o.validator??null,name:o.name??null,isActive:o.isActive??null,isJailed:o.isJailed??null,commission:o.commission??null,stake:o.stake??null,nRecentBlocks:o.nRecentBlocks??null}));return{provider:"hl-staking",count:r.length,validators:r,exec:!1,raw:t}}async function Ra(e={},t={}){let n=bn(e.user||e.address,"user"),r=await G({type:"delegatorSummary",user:n},t);return{provider:"hl-staking",user:n,delegatedWei:r?.delegated??null,undelegatedWei:r?.undelegated??null,totalPendingWithdrawalWei:r?.totalPendingWithdrawal??null,nPendingWithdrawals:r?.nPendingWithdrawals??null,delegatedHype:r?.delegated!=null?String(r.delegated):null,undelegatedHype:r?.undelegated!=null?String(r.undelegated):null,exec:!1,raw:r}}async function $a(e={},t={}){let n=bn(e.user||e.address,"user"),r=await G({type:"delegations",user:n},t),o=Array.isArray(r)?r:[];return{provider:"hl-staking",user:n,count:o.length,delegations:o.map(i=>({validator:i.validator??null,amount:i.amount??null,lockedUntilTimestamp:i.lockedUntilTimestamp??null})),exec:!1,raw:r}}async function xm(e={},t={}){let n=bn(e.user||e.address,"user"),r=await G({type:"delegatorRewards",user:n},t);return{provider:"hl-staking",user:n,rewards:Array.isArray(r)?r:[],exec:!1}}async function Sm(e={},t={}){let n=bn(e.user||e.address,"user"),r=await G({type:"delegatorHistory",user:n},t);return{provider:"hl-staking",user:n,history:Array.isArray(r)?r:[],exec:!1}}function La(e={}){let t=e.nonce==null?Date.now():Number(e.nonce);if(!Number.isInteger(t)||t<=0)throw new Error("hl-staking: nonce must be a positive integer ms timestamp");return t}function Jo(e={}){return String(e.signatureChainId||process.env.HL_SIGNATURE_CHAIN_ID||Yv)}function Jv(e={}){return{name:"HyperliquidSignTransaction",version:"1",chainId:Number(BigInt(Jo(e))),verifyingContract:"0x0000000000000000000000000000000000000000"}}function Ma({kind:e,action:t,types:n,primaryType:r,message:o,opts:i,notes:s,caps:a}){return O({provider:"hl-staking",venue:"hypercore",chain:kr(i),kind:e,prepareReady:!0,executionReady:!1,signingReady:!1,broadcastReady:!1,requiresUserSignature:!0,signWith:"user wallet (EIP-712 typed data)",submitTo:Qv(i),submitShape:{action:t,nonce:t.nonce,signature:"<user 65-byte signature>"},action:t,typedData:{domain:Jv(i),types:n,primaryType:r,message:o},caps:a||null,notes:s,exec:!1},{provider:"hl-staking",kind:e})}function km(e={},t={}){let n=Sr(e.amountHype??e.amount,"amountHype"),r=e.maxHype==null?null:Sr(e.maxHype,"maxHype");if(r&&BigInt(n)>BigInt(r))throw new Error(`hl-staking: amount ${tt(n)} HYPE exceeds maxHype cap ${tt(r)} HYPE`);let o=La(e),i=kr(t),s={type:"cDeposit",hyperliquidChain:i,signatureChainId:Jo(t),wei:yn(n),nonce:o};return Ma({kind:"hype-stake-deposit",action:s,primaryType:"HyperliquidTransaction:CDeposit",types:{"HyperliquidTransaction:CDeposit":[{name:"hyperliquidChain",type:"string"},{name:"wei",type:"uint64"},{name:"nonce",type:"uint64"}]},message:{hyperliquidChain:i,wei:yn(n),nonce:o},opts:t,caps:{amountHype:tt(n),maxHype:r?tt(r):null},notes:["Moves HYPE from your Hyperliquid spot balance into your staking balance.","Staking balance still earns nothing until it is delegated to a validator.","Oracle prepared this. Your wallet signs it. Nothing was submitted."]})}function vm(e={},t={}){let n=Sr(e.amountHype??e.amount,"amountHype"),r=La(e),o=kr(t),i={type:"cWithdraw",hyperliquidChain:o,signatureChainId:Jo(t),wei:yn(n),nonce:r};return Ma({kind:"hype-stake-withdraw",action:i,primaryType:"HyperliquidTransaction:CWithdraw",types:{"HyperliquidTransaction:CWithdraw":[{name:"hyperliquidChain",type:"string"},{name:"wei",type:"uint64"},{name:"nonce",type:"uint64"}]},message:{hyperliquidChain:o,wei:yn(n),nonce:r},opts:t,caps:{amountHype:tt(n)},notes:[`Starts the ${bm} day unstaking queue back to spot. The HYPE is not liquid during the queue.`,"Undelegate from the validator first: only undelegated staking balance can be withdrawn.","Oracle prepared this. Your wallet signs it. Nothing was submitted."]})}function Em(e={},t={}){let n=bn(e.validator,"validator"),r=Sr(e.amountHype??e.amount,"amountHype"),o=!!(e.isUndelegate??e.undelegate??!1),i=e.maxHype==null?null:Sr(e.maxHype,"maxHype");if(!o&&i&&BigInt(r)>BigInt(i))throw new Error(`hl-staking: delegate amount ${tt(r)} HYPE exceeds maxHype cap ${tt(i)} HYPE`);let s=La(e),a=kr(t),c={type:"tokenDelegate",hyperliquidChain:a,signatureChainId:Jo(t),validator:n,wei:yn(r),isUndelegate:o,nonce:s};return Ma({kind:o?"hype-undelegate":"hype-delegate",action:c,primaryType:"HyperliquidTransaction:TokenDelegate",types:{"HyperliquidTransaction:TokenDelegate":[{name:"hyperliquidChain",type:"string"},{name:"validator",type:"address"},{name:"wei",type:"uint64"},{name:"isUndelegate",type:"bool"},{name:"nonce",type:"uint64"}]},message:{hyperliquidChain:a,validator:n,wei:yn(r),isUndelegate:o,nonce:s},opts:t,caps:{amountHype:tt(r),maxHype:i?tt(i):null,validator:n},notes:o?["Returns stake from the validator to your staking balance.",`Delegations carry a ${Ta} day validator lockup before they can be undelegated.`,"Oracle prepared this. Your wallet signs it. Nothing was submitted."]:["Delegates staking balance to the chosen validator so it starts earning.",`Once delegated, the stake is locked with that validator for ${Ta} day.`,"Check the validator's commission and jail status before delegating.","Oracle prepared this. Your wallet signs it. Nothing was submitted."]})}async function Am(e={},t={}){let n=bn(e.user||e.address,"user"),r=await Ra({user:n},t),o=await $a({user:n},t);return{provider:"hl-staking",user:n,stakingBalanceUndelegated:r.undelegatedWei,stakingBalanceDelegated:r.delegatedWei,pendingWithdrawals:r.nPendingWithdrawals,delegations:o.delegations,unstakingQueueDays:bm,validatorLockupDays:Ta,exec:!1}}async function Ua(e={}){let t=Date.now();try{let n=await Je(e);return{provider:"hl-markets",ok:!0,venue:"hyperliquid",symbols:Object.keys(n||{}).length,latencyMs:Date.now()-t}}catch(n){return{provider:"hl-markets",ok:!1,error:String(n?.message||n),latencyMs:Date.now()-t}}}var eE=24*365,tE=8;function se(e){if(e==null)return null;let t=Number(e);return Number.isFinite(t)?t:null}function nE(e,t){return e==null||t==null||t===0?null:(e-t)/t*100}async function Zo(e={},t={}){let[n,r]=await Promise.all([on(t),Je(t).catch(()=>({}))]),o=n?.[0]?.universe??n?.universe??[],i=Array.isArray(n?.[1])?n[1]:[],a=o.map((c,l)=>{let u=i[l]||{},d=se(u.markPx),p=se(u.prevDayPx),m=se(u.openInterest),f=se(u.funding);return{coin:c.name,index:l,markPx:d,oraclePx:se(u.oraclePx),midPx:se(u.midPx)??se(r?.[c.name]),prevDayPx:p,change24hPct:nE(d,p),dayNtlVolumeUsd:se(u.dayNtlVlm),premium:se(u.premium),fundingRate:f,fundingRateAprPct:f==null?null:f*(eE/tE)*100,openInterestCoin:m,openInterestUsd:m==null||d==null?null:m*d,maxLeverage:c.maxLeverage??null,szDecimals:c.szDecimals??null,isDelisted:!!c.isDelisted}}).filter(c=>!c.isDelisted);return{provider:"hl-info",venue:"hyperliquid",kind:"market-datapoints",asOfMs:Date.now(),count:a.length,markets:a,totals:{openInterestUsd:a.reduce((c,l)=>c+(l.openInterestUsd||0),0),dayNtlVolumeUsd:a.reduce((c,l)=>c+(l.dayNtlVolumeUsd||0),0)}}}async function Im(e={},t={}){let n=Math.max(1,Math.min(Number(e.limit)||10,50)),{markets:r,asOfMs:o,totals:i}=await Zo(e,t),s=(a,c=-1)=>r.filter(l=>l[a]!=null).sort((l,u)=>(l[a]-u[a])*c).slice(0,n);return{provider:"hl-info",venue:"hyperliquid",kind:"leaderboards",asOfMs:o,totals:i,gainers:s("change24hPct"),losers:s("change24hPct",1),byVolume:s("dayNtlVolumeUsd"),byOpenInterest:s("openInterestUsd"),fundingHighest:s("fundingRateAprPct"),fundingLowest:s("fundingRateAprPct",1)}}async function _m(e={},t={}){let n=String(e.coin||e.symbol||"").trim().toUpperCase();if(!n)throw new Error("hl-markets: coin required");let r=String(e.interval||"1h"),o=Number(e.lookbackMs)||1440*60*1e3,i=Date.now(),s=i-o,[a,c,l]=await Promise.all([Zo({},t),sn({coin:n,interval:r,startTime:s,endTime:i},t).catch(()=>[]),yo(n,t).catch(()=>null)]),u=a.markets.find(h=>h.coin===n)||null;if(!u)throw new Error(`hl-markets: ${n} is not a listed perp`);let d=(Array.isArray(c)?c:[]).map(h=>({t:Number(h.t),open:se(h.o),high:se(h.h),low:se(h.l),close:se(h.c),volume:se(h.v)})),p=l?.levels??[],m=se(p?.[0]?.[0]?.px),f=se(p?.[1]?.[0]?.px);return{provider:"hl-info",venue:"hyperliquid",kind:"coin-datapoints",asOfMs:Date.now(),coin:n,market:u,book:{bestBid:m,bestAsk:f,spread:m==null||f==null?null:f-m,spreadBps:m==null||f==null||f===0?null:(f-m)/f*1e4},candles:{interval:r,count:d.length,series:d}}}async function Pm(e={},t={}){let n=await So(t),r=n?.tokens??[],o=n?.universe??[];return{provider:"hl-info",venue:"hyperliquid",kind:"spot-datapoints",asOfMs:Date.now(),tokenCount:r.length,pairCount:o.length,tokens:r.map(i=>({name:i.name,index:i.index,szDecimals:i.szDecimals??null,weiDecimals:i.weiDecimals??null,tokenId:i.tokenId??null,isCanonical:!!i.isCanonical})),pairs:o.map(i=>({name:i.name,index:i.index,tokens:i.tokens,isCanonical:!!i.isCanonical}))}}W();var Om=1e8,oE=1e5,vr={at:0,dexs:null},Nm=new Map;async function Cm(e={}){let t=Date.now();if(vr.dexs&&t-vr.at<6e4&&!e.fetchImpl)return vr.dexs;let n=await G({type:"perpDexs"},e);return vr={at:t,dexs:Array.isArray(n)?n:[]},vr.dexs}async function Tm(e="",t={}){let n=e||"",r=Date.now(),o=Nm.get(n);if(o&&r-o.at<3e4&&!t.fetchImpl)return o;let i=e?await G({type:"metaAndAssetCtxs",dex:e},t):await on(t),s=i?.[0]?.universe??i?.universe??[],a=Array.isArray(i?.[1])?i[1]:[],c={at:r,universe:s,ctxs:a};return Nm.set(n,c),c}function iE(e){let t=String(e||"").trim(),n;if(t.startsWith("#"))n=Number(t.slice(1));else if(/^\d+$/.test(t))n=Number(t);else return null;if(!Number.isInteger(n)||n<0)return null;let r=n%10;if(r!==0&&r!==1)return null;let o=Math.floor(n/10);return{encoding:n,outcome:o,side:r,coin:`#${n}`,assetId:Om+n}}function ei(e,t){let n=Number(e),r=Number(t);if(!Number.isInteger(n)||n<0)throw new Error("hl-assets: outcome id must be a non-negative integer");if(r!==0&&r!==1)throw new Error("hl-assets: outcome side must be 0 or 1");let o=10*n+r;return{encoding:o,outcome:n,side:r,coin:`#${o}`,assetId:Om+o}}async function Ba(e={},t={}){if(e.outcome!=null||e.coin&&String(e.coin).startsWith("#")){let l=e.outcome!=null?ei(e.outcome,e.side??e.outcomeSide??0):iE(e.coin);if(!l)throw new Error(`hl-assets: invalid outcome coin ${e.coin}`);let u=e.szDecimals!=null?Number(e.szDecimals):2;return{kind:"outcome",coin:l.coin,assetId:l.assetId,encoding:l.encoding,outcome:l.outcome,side:l.side,szDecimals:u,maxLeverage:1,dex:null,markPx:null}}let n=String(e.coin||e.symbol||e.name||"").trim();if(!n)throw new Error("hl-assets: coin required");if(n.includes(":")){let[l,...u]=n.split(":"),d=u.join(":");if(!l||!d)throw new Error(`hl-assets: bad builder coin ${n}`);let m=(await Cm(t)).findIndex(w=>w&&w.name===l);if(m<1)throw new Error(`hl-assets: unknown builder dex "${l}"`);let{universe:f,ctxs:h}=await Tm(l,t),g=f.findIndex(w=>w.name===n||w.name===`${l}:${d}`||w.name.endsWith(`:${d}`));if(g<0)throw new Error(`hl-assets: ${n} not in dex ${l} meta`);let b=f[g];if(b.isDelisted)throw new Error(`hl-assets: ${n} is delisted`);let k=oE+m*1e4+g,x=h[g]||{};return{kind:"hip3",coin:b.name||n,assetId:k,szDecimals:b.szDecimals??0,maxLeverage:b.maxLeverage??null,dex:l,dexIndex:m,indexInMeta:g,markPx:x.markPx??null}}let{universe:r,ctxs:o}=await Tm("",t),i=n.toUpperCase(),s=r.findIndex(l=>l.name===i);if(s<0){if(t.allowBareBuilderLeaf===!0)try{let l=await Cm(t);for(let u=1;u<l.length;u++){let d=l[u];if(!d?.name)continue;let p=`${d.name}:${i}`;try{return await Ba({coin:p},t)}catch{}}}catch{}throw new Error(`hl-perps: ${i} is not a listed perp`)}let a=r[s];if(a.isDelisted)throw new Error(`hl-assets: ${i} is delisted`);let c=o[s]||{};return{kind:"main",coin:a.name,assetId:s,szDecimals:a.szDecimals??0,maxLeverage:a.maxLeverage??null,dex:"",markPx:c.markPx??null}}function Rm(e,t,n="amount"){let r=String(e??"").trim();if(!/^-?\d*(\.\d+)?$/.test(r)||r===""||r==="."||r==="-")throw new Error(`${n} must be a decimal number, got ${JSON.stringify(r)}`);let o=r.startsWith("-"),i=o?r.slice(1):r,[s="0",a=""]=i.split(".");if(a.length>t)throw new Error(`${n} has more than ${t} decimal places, which would lose precision`);let c=BigInt((s||"0")+a.padEnd(t,"0"));return o?-c:c}W();var sE=5,aE=6,Mm="0x66eee";var $m=10,Da="ORACLE_HL_BUILDER_ADDRESS",Lm="ORACLE_HL_BUILDER_FEE_BPS",ti=Object.freeze({perp:2,spot:1,hip3:1,hip4:1}),be=Object.freeze({LIMIT:"limit",MARKET:"market",STOP_MARKET:"stopMarket",STOP_LIMIT:"stopLimit",TAKE_PROFIT_MARKET:"takeProfitMarket",TAKE_PROFIT_LIMIT:"takeProfitLimit"}),ri=Object.freeze({GTC:"Gtc",IOC:"Ioc",ALO:"Alo"}),ni=Object.freeze({CROSS:"cross",ISOLATED:"isolated"});function cE(e="perp"){if(e==="perp"||e==="main")return ti.perp;if(e==="spot")return ti.spot;if(e==="hip3")return ti.hip3;if(e==="outcome"||e==="hip4")return ti.hip4;throw new Error(`hl-perps: unknown builder fee kind ${e}`)}function Um({env:e=process.env,isHolder:t=!1,kind:n="perp"}={}){if(t)return null;let r=String(e?.[Da]||"").trim().toLowerCase();if(!r)return null;if(!/^0x[a-f0-9]{40}$/.test(r))throw new Error(`hl-perps: ${Da} must be an EVM address`);let o=fa(e);if(!o||o!==r)return null;let i=e?.[Lm],s=cE(n),a=i==null?s:Number(i);if(!Number.isFinite(a)||a<=0||Math.abs(a*10-Math.round(a*10))>1e-9)throw new Error(`hl-perps: ${Lm} must be a positive number in 0.1 bps increments`);if(a>$m)throw new Error(`hl-perps: builder fee ${a} bps exceeds the ${$m} bps cap`);if(a>s)throw new Error(`hl-perps: builder fee ${a} bps exceeds the ${s} bps product tier for ${n}`);let c=Math.round(a*10),l=(c/1e3).toFixed(3).replace(/0+$/,"").replace(/\.$/,"");return{wire:{b:r,f:c},disclosure:{address:r,bps:a,percent:`${l}%`}}}async function lE(e,t={},n={}){if(!e)return{approved:!1,approvedFeeBps:0,status:"not-configured"};let r=String(t.user||n.user||"").trim().toLowerCase();if(!/^0x[a-f0-9]{40}$/.test(r))return{approved:!1,approvedFeeBps:0,status:"wallet-required"};try{let o=Number(await G({type:"maxBuilderFee",user:r,builder:e.disclosure.address},n));return!Number.isInteger(o)||o<0?{approved:!1,approvedFeeBps:0,status:"invalid-response"}:{approved:o>=e.wire.f,approvedFeeBps:o/10,status:o>=e.wire.f?"approved":"insufficient"}}catch{return{approved:!1,approvedFeeBps:0,status:"unavailable"}}}async function uE(e,t={},n={}){if(!e)return{exempt:!1,status:"not-configured"};let r=String(t.user||n.user||"").trim().toLowerCase();if(!/^0x[a-f0-9]{40}$/.test(r))return{exempt:!1,status:"wallet-required"};try{let o=n.holderBalance||Mo;return BigInt(await o(r))>0n?{exempt:!0,status:"holder"}:{exempt:!1,status:"non-holder"}}catch{return{exempt:!1,status:"unavailable"}}}function qa(e,t,{roundDown:n=null}={}){let r=typeof e=="number"?e.toFixed(Math.min(20,t+8)):String(e).trim();if(!/^-?\d+(\.\d+)?$/.test(r))throw new Error(`hl-perps: "${e}" is not a decimal number`);let o=r.startsWith("-"),[i,s=""]=r.replace(/^-/,"").split(".");if(s.length<=t){let f=s.replace(/0+$/,"");return(o?"-":"")+(f?`${i}.${f}`:i)}let a=s.slice(0,t),c=Number(s[t]),l=BigInt(i+a),u=s.slice(t).replace(/0+$/,"")!=="";n===!0||(n===!1?u&&(l+=1n):c>=5&&(l+=1n));let d=l.toString().padStart(t+1,"0"),m=(t===0?d:`${d.slice(0,-t)}.${d.slice(-t)}`).replace(/(\.\d*?)0+$/,"$1").replace(/\.$/,"");return(o?"-":"")+m}function dE(e,t,n={}){let r=String(e);if(!r.includes("."))return r;let o=Number(r);if(!Number.isFinite(o)||o===0)return r;let i=Math.floor(Math.log10(Math.abs(o))),s=Math.max(0,t-1-i);return qa(r,s,n)}function ft(e,t,n={}){let r=aE-Number(t??0);if(r<0)throw new Error("hl-perps: szDecimals out of range");return qa(dE(e,sE,n),r,n)}function pE(e,t){let n=qa(e,Number(t??0));if(BigInt(n.split(".")[0])<0n)throw new Error("hl-perps: size must be positive");if(Number(n)<=0)throw new Error("hl-perps: size rounds to zero at this asset's precision");return n}async function Ut(e={},t={}){let n=await Ba(e,t);return{coin:n.coin,assetId:n.assetId,szDecimals:n.szDecimals,maxLeverage:n.maxLeverage,markPx:n.markPx,kind:n.kind,dex:n.dex??null,outcome:n.outcome??null,side:n.side??null}}function Fa(e,{tif:t=ri.GTC,triggerPx:n,isMarket:r,szDecimals:o}={}){switch(e){case be.LIMIT:return{limit:{tif:t}};case be.MARKET:return{limit:{tif:ri.IOC}};case be.STOP_MARKET:case be.TAKE_PROFIT_MARKET:return{trigger:{isMarket:!0,triggerPx:ft(n,o),tpsl:e===be.STOP_MARKET?"sl":"tp"}};case be.STOP_LIMIT:case be.TAKE_PROFIT_LIMIT:return{trigger:{isMarket:!1,triggerPx:ft(n,o),tpsl:e===be.STOP_LIMIT?"sl":"tp"}};default:throw new Error(`hl-perps: unknown order type ${e}`)}}function wn(e,t){return{action:e,nonce:t,signatureChainId:Mm,submitTo:"https://api.hyperliquid.xyz/exchange",note:"Sign locally via @oracle-agent/operator or a wallet. Oracle does not submit."}}function xn(e){return O(e,{provider:e.provider||"hl-perps",kind:e.kind})}function Bm(e={},t={}){let n=Um({env:t.env});if(!n)throw new Error(`hl-perps: ${Da} is required`);let r=Number(e.nonce??t.nonce??Date.now());if(!Number.isSafeInteger(r)||r<=0)throw new Error("hl-perps: nonce must be a positive integer");let o={type:"approveBuilderFee",hyperliquidChain:t.testnet||process.env.HL_TESTNET==="1"?"Testnet":"Mainnet",signatureChainId:Mm,maxFeeRate:n.disclosure.percent,builder:n.disclosure.address,nonce:r};return xn({provider:"hl-perps",venue:"hyperliquid",kind:"builder-fee-approval",builderFee:n.disclosure,...wn(o,r)})}async function Er(e={},t={}){let n=await Ut(e,t),r=String(e.type||be.LIMIT),o=e.side?String(e.side).toLowerCase()==="buy":!!e.isBuy,i=!!e.reduceOnly,s=pE(e.size??e.sz,n.szDecimals),a;if(r===be.MARKET){let k=Number(n.markPx);if(!Number.isFinite(k)){let C=await Je(t);k=Number(C?.[n.coin]??C?.[String(n.assetId)]??NaN)}if(!Number.isFinite(k))throw new Error("hl-perps: no mark price available for a market order");let x=Number(e.maxSlippageBps??50);if(!Number.isInteger(x)||x<0)throw new Error("hl-perps: maxSlippageBps must be a non-negative integer");if(x>100)throw new Error(`hl-perps: maxSlippageBps ${x} exceeds the hard 100 bps cap`);let w=o?k*(1+x/1e4):k*(1-x/1e4);a=ft(w,n.szDecimals,{roundDown:o});let E=Math.abs(Number(a)/k-1)*1e4;if(E>x+1e-9)throw new Error(`hl-perps: tick rounding makes the limit ${E.toFixed(2)} bps from mark, above the ${x} bps cap`)}else{if(e.price==null&&e.limitPx==null)throw new Error("hl-perps: a limit order requires an explicit price");a=ft(e.price??e.limitPx,n.szDecimals)}let c=Fa(r,{tif:e.tif??(r===be.MARKET?ri.IOC:ri.GTC),triggerPx:e.triggerPx,szDecimals:n.szDecimals}),l={a:n.assetId,b:o,p:a,s,r:i,t:c};e.clientOrderId&&(l.c=String(e.clientOrderId));let u={type:"order",orders:[l],grouping:e.grouping||"na"},d=Um({env:t.env,kind:n.kind}),p=await uE(d,e,t),m=p.exempt?null:d,f=await lE(m,e,t),h=f.approved?m:null;h&&(u.builder=h.wire);let g=Number(e.nonce??Date.now()),b=Number(a)*Number(s);return xn({provider:"hl-perps",venue:"hyperliquid",kind:n.kind==="outcome"?"hip4-order":n.kind==="hip3"?"hip3-order":"perp-order",coin:n.coin,assetId:n.assetId,assetKind:n.kind,outcome:n.outcome??null,outcomeSide:n.side??null,dex:n.dex??null,side:o?"buy":"sell",orderType:r,price:a,size:s,reduceOnly:i,notionalUsd:Number.isFinite(b)?b:null,maxLeverage:n.maxLeverage,markPx:n.markPx,builderFee:h?.disclosure??null,holderExempt:p.exempt,holderVerificationStatus:p.status,builderApprovalRequired:m&&!h?{...d.disclosure,...f}:null,...wn(u,g)})}async function oi(e={},t={}){let n=await Ut(e,t),r=e.orderId??e.oid;if(r==null)throw new Error("hl-perps: orderId required");let o={type:"cancel",cancels:[{a:n.assetId,o:Number(r)}]};return xn({provider:"hl-perps",venue:"hyperliquid",kind:"perp-cancel",coin:n.coin,orderId:Number(r),...wn(o,Number(e.nonce??Date.now()))})}async function Dm(e={},t={}){let n=await Ut(e,t),r=Number(e.leverage);if(!Number.isInteger(r)||r<1)throw new Error("hl-perps: leverage must be a positive integer");if(n.maxLeverage!=null&&r>n.maxLeverage)throw new Error(`hl-perps: ${n.coin} allows at most ${n.maxLeverage}x, requested ${r}x`);let o=String(e.marginMode||ni.CROSS).toLowerCase();if(o!==ni.CROSS&&o!==ni.ISOLATED)throw new Error('hl-perps: marginMode must be "cross" or "isolated"');let i={type:"updateLeverage",asset:n.assetId,isCross:o===ni.CROSS,leverage:r};return xn({provider:"hl-perps",venue:"hyperliquid",kind:"perp-leverage",coin:n.coin,leverage:r,marginMode:o,maxLeverage:n.maxLeverage,liquidationWarning:r>=20?`${r}x liquidates on roughly a ${(100/r).toFixed(2)}% adverse move before fees`:null,...wn(i,Number(e.nonce??Date.now()))})}async function Fm(e={},t={}){let n=await Ut(e,t),r=e.usd??e.amountUsd;if(r==null)throw new Error("hl-perps: usd amount required");let o=String(r).trim();if(!/^-?\d+(\.\d+)?$/.test(o))throw new Error("hl-perps: usd must be a decimal number");let i=Rm(o,6,"hl-perps: usd"),s={type:"updateIsolatedMargin",asset:n.assetId,isBuy:!0,ntli:i<=BigInt(Number.MAX_SAFE_INTEGER)?Number(i):i.toString()};return xn({provider:"hl-perps",venue:"hyperliquid",kind:"perp-isolated-margin",coin:n.coin,usd:o,...wn(s,Number(e.nonce??Date.now()))})}async function qm(e={},t={}){let n=await Er(e,t),r=await Ut(e,t),o=n.side==="buy",i=[n.action.orders[0]];if(e.takeProfitPx!=null&&i.push({a:r.assetId,b:!o,p:ft(e.takeProfitPx,r.szDecimals),s:n.size,r:!0,t:Fa(be.TAKE_PROFIT_MARKET,{triggerPx:e.takeProfitPx,szDecimals:r.szDecimals})}),e.stopLossPx!=null&&i.push({a:r.assetId,b:!o,p:ft(e.stopLossPx,r.szDecimals),s:n.size,r:!0,t:Fa(be.STOP_MARKET,{triggerPx:e.stopLossPx,szDecimals:r.szDecimals})}),i.length===1)throw new Error("hl-perps: a bracket needs takeProfitPx and/or stopLossPx");let s={type:"order",orders:i,grouping:"normalTpsl",...n.action.builder?{builder:n.action.builder}:{}};return xn({provider:"hl-perps",venue:"hyperliquid",kind:"perp-bracket",coin:r.coin,legs:i.length,entry:{side:n.side,price:n.price,size:n.size},takeProfitPx:e.takeProfitPx==null?null:ft(e.takeProfitPx,r.szDecimals),stopLossPx:e.stopLossPx==null?null:ft(e.stopLossPx,r.szDecimals),builderFee:n.builderFee,...wn(s,Number(e.nonce??Date.now()))})}async function Hm(e={}){let t=await lr(e);return{provider:"hl-outcome",kind:"outcome-meta",outcomes:t?.outcomes||[],questions:t?.questions||[]}}async function jm(e={},t={}){let n=e.coin,r=e.outcome,o=e.side;if(typeof o=="string"){let s=o.toLowerCase();s==="yes"||s==="0"?o=0:(s==="no"||s==="1")&&(o=1)}if(e.sideName&&r!=null){let a=((await lr(t))?.outcomes||[]).find(c=>Number(c.outcome)===Number(r));if(a?.sideSpecs){let c=a.sideSpecs.findIndex(l=>String(l.name).toLowerCase()===String(e.sideName).toLowerCase());c>=0&&(o=c)}}if(!n){if(r==null||o==null)throw new Error("hl-outcome: provide coin (#N) or outcome + side (0/1 or yes/no)");n=ei(r,o).coin}let i=await Er({...e,coin:n},t);return O({...i,kind:"hip4-order",provider:"hl-perps"},{provider:"hl-perps",kind:"hip4-order"})}async function Vm(e={},t={}){let n=e.coin;if(!n&&e.outcome!=null){let r=e.side??0;n=ei(e.outcome,r).coin}return oi({...e,coin:n},t)}W();import{createHmac as cL,randomInt as hE}from"node:crypto";import{keccak256 as uL,concat as dL,zeroPadValue as pL,getCreate2Address as mL,AbiCoder as fL}from"ethers";var Ym=137;var gE="0xE111180000d2663C0091e4f400237545B87B996B",yE="0xe2222d279d744050d28e00520010520000310F59",zm="0x0000000000000000000000000000000000000000000000000000000000000000",Ha=6;var bE={name:"Polymarket CTF Exchange",version:"2",chainId:Ym},wE={Order:[{name:"salt",type:"uint256"},{name:"maker",type:"address"},{name:"signer",type:"address"},{name:"tokenId",type:"uint256"},{name:"makerAmount",type:"uint256"},{name:"takerAmount",type:"uint256"},{name:"side",type:"uint8"},{name:"signatureType",type:"uint8"},{name:"timestamp",type:"uint256"},{name:"metadata",type:"bytes32"},{name:"builder",type:"bytes32"}]},Wm={"0.1":{price:1,size:2,amount:3},"0.01":{price:2,size:2,amount:4},"0.001":{price:3,size:2,amount:5},"0.0001":{price:4,size:2,amount:6}};function ii(e){let t=String(e);return t.includes(".")?t.split(".")[1].replace(/0+$/,"").length:0}function si(e,t){let n=10**t;return Math.floor(e*n+1e-12)/n}function Gm(e,t){let n=10**t;return Math.ceil(e*n-1e-12)/n}function xE(e,t){let n=10**t;return Math.round(e*n+Number.EPSILON)/n}function SE(e,t,n,r){let o=xE(Number(n),r.price);if(e==="BUY"){let c=si(Number(t),r.size),l=c*o;return ii(l)>r.amount&&(l=Gm(l,r.amount+4),ii(l)>r.amount&&(l=si(l,r.amount))),{rawMakerAmt:l,rawTakerAmt:c}}let s=si(Number(t),r.size),a=s*o;return ii(a)>r.amount&&(a=Gm(a,r.amount+4),ii(a)>r.amount&&(a=si(a,r.amount))),{rawMakerAmt:s,rawTakerAmt:a}}function Km(e){let t=Number(e).toFixed(Ha),[n,r=""]=t.split(".");return(n+r.padEnd(Ha,"0").slice(0,Ha)).replace(/^0+/,"")||"0"}function kE(e={}){let{tokenId:t,side:n,price:r,size:o,maker:i,signer:s,negRisk:a=!1,tickSize:c="0.01",orderType:l="GTC",signatureType:u=0,metadata:d=zm,builder:p=zm}=e;if(!t)throw new Error("tokenId required");if(n!=="BUY"&&n!=="SELL")throw new Error("side must be BUY or SELL");if(!i||!s)throw new Error("maker and signer required");let m=Number(r),f=Number(o);if(!(m>0&&m<1))throw new Error(`price out of (0,1): ${r}`);if(!(f>0))throw new Error(`size must be > 0: ${o}`);if(![0,3].includes(Number(u)))throw new Error(`Desk poly supports signatureType 0 (EOA) or 3 (deposit wallet), got ${u}`);let h=Wm[String(c)]||Wm["0.01"],{rawMakerAmt:g,rawTakerAmt:b}=SE(n,f,m,h),k=Km(g),x=Km(b),w=String(hE(1,2**31-1)),E=Date.now().toString(),C=n==="BUY"?0:1,I=a?yE:gE,R={salt:w,maker:i,signer:s,tokenId:String(t),makerAmount:k,takerAmount:x,side:C,signatureType:Number(u),timestamp:E,metadata:d,builder:p};return{domain:{...bE,verifyingContract:I},types:wE,value:R,orderType:l,side:n,notionalUsdc:n==="BUY"?g:b,exchange:I}}function Xm(e={}){let t=kE(e);return O({provider:"poly-clob",kind:"poly-order",chainId:Ym,tokenId:String(e.tokenId),side:t.side,orderType:t.orderType,notionalUsdc:t.notionalUsdc,exchange:t.exchange,domain:t.domain,types:t.types,value:t.value,tickSize:e.tickSize||"0.01",negRisk:!!e.negRisk,signatureType:Number(e.signatureType??0),maxNotionalUsdc:e.maxNotionalUsdc??null},{provider:"poly-clob",kind:"poly-order"})}import{ContractFactory as KE,keccak256 as hf}from"ethers";import{createHash as EE}from"node:crypto";import{wordlists as AE}from"ethers";var Zm=1,IE=new Set(["privatekey","privkey","secretkey","seedphrase","seed","mnemonic","passphrase","password","keystore","keymaterial","wif","xprv","xpriv","bearer","authorization","signature","apikey","credential"]),_E=[/\b[5KL][1-9A-HJ-NP-Za-km-z]{50,51}\b/,/\bxprv[0-9A-Za-z]{50,}\b/],PE=new Set([12,15,18,21,24]);function NE(e){let t=String(e).trim().toLowerCase().split(/\s+/).filter(Boolean);return PE.has(t.length)&&t.every(n=>AE.en.getWordIndex(n)>=0)}var CE=/^\s*(?:0x)?[0-9a-fA-F]{64}\s*$/,TE=/(hash|digest|root|salt|nonce|proof|commitment|sig|id)(?:e?s)?$/i,OE=new Set(["calldata","data","publickey","pubkey","message","payload","input","extradata"]);function RE(e){let t=ef(e);return OE.has(t)||TE.test(t)}var vn=class extends Error{constructor(t){super(`action receipt refused: secret-bearing field at ${t}`),this.name="ActionReceiptSecretError",this.code="ACTION_RECEIPT_SECRET"}};function ef(e){return String(e).replace(/[^a-z0-9]/gi,"").toLowerCase()}function $E(e){let t=ef(e);return[...IE].some(n=>t.includes(n))}function LE(e,t,n){if(typeof t=="string"){if(_E.some(r=>r.test(t))||NE(t))throw new vn(n);if(CE.test(t)&&!RE(e))throw new vn(n)}}function En(e,t="$",n=""){if(e==null||typeof e=="boolean")return e;if(typeof e=="string")return LE(n,e,t),e;if(typeof e=="number"){if(!Number.isFinite(e))throw new TypeError(`action receipt: non-finite number at ${t}`);return e}if(typeof e=="bigint")return e.toString();if(Array.isArray(e))return e.map((o,i)=>En(o,`${t}[${i}]`,n));if(typeof e!="object"||Object.getPrototypeOf(e)!==Object.prototype)throw new TypeError(`action receipt: JSON-like value required at ${t}`);let r={};for(let o of Object.keys(e).sort()){let i=`${t}.${o}`;if($E(o))throw new vn(i);e[o]!==void 0&&(r[o]=En(e[o],i,o))}return r}function $e(e){return En(e)}function ja(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(ja).join(",")}]`:`{${Object.keys(e).map(t=>`${JSON.stringify(t)}:${ja(e[t])}`).join(",")}}`}function tf(e){return ja(En(e))}function nf(e){if(!e||typeof e!="object"||Array.isArray(e))throw new TypeError("action receipt: object required");let{receiptId:t,summary:n,...r}=e;return EE("sha256").update(tf(r)).digest("hex")}function kn(e,...t){for(let n of t)if(e[n]!==void 0)return e[n]}function Sn(e,t,n){let r=kn(e,...t);if(r==null)throw new TypeError(`action receipt: ${n} required`);return r}function ME(e){let t=kn(e,"balances","balanceChanges"),n=kn(e,"beforeBalances","balancesBefore","before"),r=kn(e,"afterBalances","balancesAfter","after");return t!==void 0?{balances:t}:n===void 0&&r===void 0?{}:{balances:{...n===void 0?{}:{before:n},...r===void 0?{}:{after:r}}}}function rf(e={}){if(!e||typeof e!="object"||Array.isArray(e))throw new TypeError("action receipt: input object required");En(e);let t=kn(e,"txHash","transactionHash"),n=kn(e,"phase","stage","resultType")??(t==null?"prepare":"execute");if(n!=="prepare"&&n!=="execute")throw new TypeError('action receipt: phase must be "prepare" or "execute"');let r={receiptVersion:Zm,phase:n,intent:Sn(e,["intent"],"intent"),route:Sn(e,["route"],"route"),decodedAction:Sn(e,["decodedAction","action"],"decodedAction"),policyChecks:Sn(e,["policyChecks","checks"],"policyChecks"),allowlistHits:Sn(e,["allowlistHits","allowlistMatches"],"allowlistHits"),prepareHash:Sn(e,["prepareHash"],"prepareHash"),...t==null?{}:{txHash:t},...ME(e)},o=En(r);return Object.freeze({...o,receiptId:nf(o)})}var UE=rf;function Qm(e,t=[]){if(typeof e=="string"||typeof e=="number")return String(e);for(let n of t)if(e?.[n]!=null)return String(e[n]);return"recorded"}function Jm(e){if(typeof e=="boolean")return e;if(e&&typeof e=="object"){if(typeof e.ok=="boolean")return e.ok;if(typeof e.allowed=="boolean")return e.allowed;if(typeof e.passed=="boolean")return e.passed}return null}function of(e){if(!e||typeof e!="object")throw new TypeError("action receipt: object required");let t=Qm(e.decodedAction,["type","action","method","name"]),n=Qm(e.route,["name","provider","venue","id"]),r=Array.isArray(e.policyChecks)?e.policyChecks:Object.values(e.policyChecks||{}),o=r.filter(l=>Jm(l)===!0).length,i=r.filter(l=>Jm(l)===!1).length,s=Array.isArray(e.allowlistHits)?e.allowlistHits.length:Object.keys(e.allowlistHits||{}).length,a=e.txHash==null?"no transaction hash":`tx ${e.txHash}`,c=e.balances==null?"balances not provided":"before/after balances recorded";return`${e.phase} ${t} via ${n}; policy ${o} passed, ${i} failed; ${s} allowlist hit${s===1?"":"s"}; ${a}; ${c}; receipt ${e.receiptId}`}var BE=of;W();import{spawnSync as Wa}from"node:child_process";import{existsSync as Bt,readFileSync as li,readdirSync as df,statSync as pf}from"node:fs";import{join as We}from"node:path";import{createHash as zE}from"node:crypto";import{existsSync as af,readFileSync as DE}from"node:fs";import{dirname as sf,join as Va}from"node:path";import{fileURLToPath as FE}from"node:url";function qE(e){let t=sf(FE(e));for(let n=0;n<8;n+=1){let r=Va(t,"package.json");if(af(r))try{let i=JSON.parse(DE(r,"utf8"));if(i&&typeof i.version=="string")return t}catch{}let o=sf(t);if(o===t)break;t=o}throw new Error(`oracle: could not resolve package root from ${e}`)}function ai(e,t){let n=qE(t),r=Va(n,e);return af(r)?r:Va(n,"dist","assets",e)}import{isAddress as HE}from"ethers";var cf="5.0.2",jE={"safe-erc20":{contractName:"SafeERC20",source:"src/SafeERC20.sol",constructor:["string name","string symbol","uint256 initialSupply","address initialHolder","address initialOwner"],authority:["initialOwner may pause transfers and use Ownable2Step"],monitor:["OwnershipTransferStarted","OwnershipTransferred","Paused","Unpaused","Transfer"]},"safe-erc721-drop":{contractName:"SafeERC721Drop",source:"src/SafeERC721Drop.sol",constructor:["string name","string symbol","uint256 cap","address treasury","uint256 mintPrice","uint256 perWalletCap","address initialOwner"],authority:["initialOwner may withdraw the full balance to immutable treasury","no mint, proxy, upgrade, or delegatecall authority"],monitor:["Transfer","OwnershipTransferred","Withdrawal"]},"safe-vesting":{contractName:"SafeVesting",source:"src/SafeVesting.sol",constructor:["address beneficiary","uint64 startTimestamp","uint64 durationSeconds"],authority:["beneficiary is the immutable OpenZeppelin owner/recipient identity","ownership transfer and renunciation are disabled","no separate administrator, proxy, upgrade, or delegatecall authority"],monitor:["EtherReleased","ERC20Released"]}};function VE(e,t){return Object.freeze({id:e,contractName:t.contractName,source:t.source,dependency:Object.freeze({name:"OpenZeppelin Contracts",version:cf,tag:`v${cf}`}),constructor:Object.freeze([...t.constructor]),authority:Object.freeze([...t.authority]),monitor:Object.freeze([...t.monitor]),fixedSource:!0,proxy:!1,upgradeable:!1,arbitraryDelegatecall:!1,modelEmittedSource:!1})}var za=Object.freeze(Object.fromEntries(Object.entries(jE).map(([e,t])=>[e,VE(e,t)])));function ci(e){let t=za[String(e||"")];if(!t)throw new Error(`protocol-templates: unknown template "${e}"`);return t}function Ar(e,t){try{if(BigInt(e)<=0n)throw new Error}catch{throw new Error(`${t} must be > 0`)}}function Ir(e,t){let n=String(e||"");if(!HE(n)||/^0x0{40}$/i.test(n))throw new Error(`${t} must be nonzero address`)}function lf(e,t){let n=ci(e);if(!Array.isArray(t))throw new Error(`${e}: constructor args must be an array`);if(t.length!==n.constructor.length)throw new Error(`${e}: expected ${n.constructor.length} constructor args`);if(e==="safe-erc20"){let[r,o,i,s,a]=t;if(!String(r||"").trim()||!String(o||"").trim())throw new Error("safe-erc20: name/symbol required");Ar(i,"safe-erc20: supply"),Ir(s,"safe-erc20: initialHolder"),Ir(a,"safe-erc20: initialOwner")}else if(e==="safe-erc721-drop"){let[r,o,i,s,a,c,l]=t;if(!String(r||"").trim()||!String(o||"").trim())throw new Error("safe-erc721-drop: name/symbol required");if(Ar(i,"safe-erc721-drop: cap"),Ir(s,"safe-erc721-drop: treasury"),Ar(a,"safe-erc721-drop: mintPrice"),Ar(c,"safe-erc721-drop: perWalletCap"),BigInt(c)>BigInt(i))throw new Error("safe-erc721-drop: perWalletCap exceeds cap");Ir(l,"safe-erc721-drop: initialOwner")}else if(e==="safe-vesting"){let[r,o,i]=t;Ir(r,"safe-vesting: beneficiary");for(let[s,a]of[[o,"startTimestamp"],[i,"durationSeconds"]])try{let c=BigInt(s);if(c<0n||c>18446744073709551615n)throw new Error}catch{throw new Error(`safe-vesting: ${a} must be uint64`)}Ar(i,"safe-vesting: durationSeconds")}return n}function uf(e){return{authorities:[...e.authority],proxy:!1,upgradeable:!1,arbitraryDelegatecall:!1}}var _r=ai("protocols/templates",import.meta.url),ui="Template + Foundry tests + optional static analysis. NOT a paid security-firm audit. Do not put mainnet TVL on forks without an independent Solidity audit.";function di(){return Bt(_r)?df(_r).filter(e=>za[e]&&pf(We(_r,e)).isDirectory()).map(e=>{let t=We(_r,e),n=We(t,"SECURITY.md");return{id:e,path:t,metadata:ci(e),securityNotice:Bt(n)?li(n,"utf8").slice(0,500):null,disclaimer:ui}}):[]}function mf(){if(process.env.FORGE_BIN)return process.env.FORGE_BIN;let e=process.env.HOME||"",t=["forge",We(e,".foundry/bin/forge")];for(let n of t)if(Wa(n,["--version"],{encoding:"utf8"}).status===0)return n;return null}function WE(){return process.env.SLITHER_BIN?process.env.SLITHER_BIN:Wa("slither",["--version"],{encoding:"utf8"}).status===0?"slither":null}function An(e,t,n){let r=Wa(e,t,{cwd:n,encoding:"utf8",env:{...process.env,PATH:`${process.env.HOME||""}/.foundry/bin:${process.env.PATH||""}`},timeout:12e4});return{ok:r.status===0,status:r.status,stdout:r.stdout||"",stderr:r.stderr||""}}function GE(e){let t=zE("sha256");function n(r){let o=pf(r);if(o.isDirectory()){if(["lib","out","cache",".git"].includes(r.split("/").pop()))return;for(let i of df(r).sort())n(We(r,i))}else o.isFile()&&(r.endsWith(".sol")||r.endsWith(".toml")||r.endsWith(".md")||r.endsWith(".txt"))&&(t.update(r.slice(e.length)),t.update(li(r)))}return n(e),t.digest("hex")}function Ga(e,t={}){let n=ci(e),r=t.allowSkipStatic!==!1,o=We(_r,e);if(!Bt(o))throw new Error(`protocol-templates: unknown template "${e}"`);let i=mf();if(!i)throw new Error("protocol-templates: forge not found. Install Foundry (https://getfoundry.sh) then: cd protocols/templates/"+e+" && forge install && forge test");if(!Bt(We(o,"lib","forge-std"))){let m=An(i,["install","foundry-rs/forge-std","--no-git"],o);if(!m.ok)throw new Error(`protocol-templates: forge install forge-std failed
|
|
6
|
+
${m.stderr}`)}if(!Bt(We(o,"lib","openzeppelin-contracts"))){let m=An(i,["install","OpenZeppelin/openzeppelin-contracts@v5.0.2","--no-git"],o);if(!m.ok)throw new Error(`protocol-templates: forge install openzeppelin failed
|
|
7
|
+
${m.stderr}`)}let s=We(o,"lib","openzeppelin-contracts","package.json"),a=Bt(s)?JSON.parse(li(s,"utf8")).version:null;if(a!==n.dependency.version)throw new Error(`protocol-templates: OpenZeppelin ${n.dependency.version} required, found ${a||"unknown"}`);let c=An(i,["build","-q"],o);if(!c.ok)throw new Error(`protocol-templates: forge build FAILED for ${e}
|
|
8
|
+
${c.stderr}`.slice(0,2e3));let l=An(i,["test","-q"],o);if(!l.ok)throw new Error(`protocol-templates: forge test FAILED for ${e}
|
|
9
9
|
${l.stdout}
|
|
10
|
-
${l.stderr}`.slice(0,2e3));let u={tool:null,ok:!0,skipped:!0,reason:"slither not installed"},d=
|
|
10
|
+
${l.stderr}`.slice(0,2e3));let u={tool:null,ok:!0,skipped:!0,reason:"slither not installed"},d=WE();if(d){let m=An(d,[".","--filter-paths","lib","--exclude-dependencies"],o);if(u={tool:"slither",ok:m.ok,skipped:!1,stdout:(m.stdout||"").slice(0,1500),stderr:(m.stderr||"").slice(0,500)},!m.ok&&!t.allowStaticFail)throw new Error(`protocol-templates: slither FAILED for ${e}
|
|
11
11
|
${m.stdout}
|
|
12
|
-
${m.stderr}`.slice(0,2e3))}else if(!r)throw new Error("protocol-templates: slither required (allowSkipStatic=false) but not installed");let p=
|
|
13
|
-
${i.stderr}`.slice(0,1500));let s=n.metadata.contractName;if(t.contractName&&t.contractName!==s)throw new Error(`protocol-templates: fixed contract name is ${s}`);let a=Ve(o,"out",`${s}.sol`,`${s}.json`);if(!Mt(a))throw new Error(`protocol-templates: artifact missing at ${a}`);let c=JSON.parse(ii(a,"utf8"));return{gate:n,metadata:n.metadata,contractName:s,abi:c.abi,bytecode:c.bytecode?.object||c.bytecode,deployedBytecode:c.deployedBytecode?.object||c.deployedBytecode,artifactPath:a}}var Av=new Set(["status","chainId","forkBlockNumber","gasUsed","transactionHash","contractAddress","revertReason"]);function Iv(e,t){if(typeof e!="object"||e===null||Array.isArray(e))throw new Error("prepareTemplateDeploy: localForkSimulationReceipt must be an object");let n=Re(e);for(let o of Object.keys(n))if(!Av.has(o))throw new Error(`prepareTemplateDeploy: unsupported field "${o}" in localForkSimulationReceipt`);if(n.status!=="success"&&n.status!=="reverted")throw new Error('prepareTemplateDeploy: simulation status must be "success" or "reverted"');let r={status:n.status};if(n.chainId!==void 0){let o=Number(n.chainId);if(!Number.isSafeInteger(o)||o!==t)throw new Error("prepareTemplateDeploy: simulation chainId must match deployment chainId");r.chainId=o}if(n.forkBlockNumber!==void 0){let o=Number(n.forkBlockNumber);if(!Number.isSafeInteger(o)||o<0)throw new Error("prepareTemplateDeploy: simulation forkBlockNumber must be a nonnegative safe integer");r.forkBlockNumber=o}if(n.gasUsed!==void 0){let o=String(n.gasUsed);if(!/^(0|[1-9][0-9]*)$/.test(o))throw new Error("prepareTemplateDeploy: simulation gasUsed must be a nonnegative integer");r.gasUsed=o}if(n.transactionHash!==void 0){if(!/^0x[0-9a-fA-F]{64}$/.test(n.transactionHash))throw new Error("prepareTemplateDeploy: simulation transactionHash must be bytes32 hex");r.transactionHash=n.transactionHash}if(n.contractAddress!==void 0){if(!/^0x[0-9a-fA-F]{40}$/.test(n.contractAddress))throw new Error("prepareTemplateDeploy: simulation contractAddress must be an EVM address");r.contractAddress=n.contractAddress}if(n.revertReason!==void 0){if(typeof n.revertReason!="string"||n.revertReason.length>500)throw new Error("prepareTemplateDeploy: simulation revertReason must be at most 500 characters");r.revertReason=n.revertReason}return r}async function nf(e={},t={}){let n=String(e.templateId||"").trim();if(!n)throw new Error("prepareTemplateDeploy: templateId required");let r=Number(e.chainId);if(!Number.isInteger(r)||r<=0)throw new Error("prepareTemplateDeploy: chainId required");let o=e.args??e.constructorArgs??[],i=Ym(n,o),s=ef(n,{contractName:e.contractName,allowSkipStatic:t.allowSkipStatic!==!1,allowStaticFail:t.allowStaticFail===!0});if(!s.bytecode||s.bytecode==="0x")throw new Error("prepareTemplateDeploy: empty bytecode");let a=s.bytecode.startsWith("0x")?s.bytecode:`0x${s.bytecode}`,u=(await new vv(s.abi,a).getDeployTransaction(...o)).data,d=t.localForkSimulationReceipt??e.localForkSimulationReceipt??null,p=d===null?{status:"not-run",injected:!1,trusted:!1,gateDecision:!1,networkSideEffects:!1}:{...Iv(d,r),kind:"local-fork",injected:!0,trusted:!1,gateDecision:!1,networkSideEffects:!1},m={chainId:r,to:null,data:u,value:"0x0"};return O({provider:"protocol-templates",kind:"template-deploy",templateId:n,contractName:s.contractName,template:i,chainId:r,transaction:m,unsignedDeployEnvelope:{transaction:m,signed:!1,broadcast:!1},abi:s.abi,sourceHash:s.gate.sourceHash,bytecodeHash:tf(a),authorityReport:Xm(i),simulationReceipt:p,verificationManifest:{contractName:s.contractName,source:i.source,compiler:"0.8.24",optimizer:{enabled:!0,runs:200},openZeppelin:i.dependency,sourceHash:s.gate.sourceHash,creationBytecodeHash:tf(a),constructorData:`0x${u.slice(a.length)}`},addressBookRecord:{status:"pending-deployment",address:null,chainId:r,label:`${n}:${s.contractName}`},monitoringPlan:{activation:"after user-signed deployment confirmation",enabled:!1,events:[...i.monitor],checks:["deployment bytecode matches verification manifest","authority changes","contract balance and release/withdraw events"]},gate:{forgeBuild:s.gate.forgeBuild,forgeTests:s.gate.forgeTests,staticAnalysis:{tool:s.gate.staticAnalysis.tool,ok:s.gate.staticAnalysis.ok,skipped:s.gate.staticAnalysis.skipped},firmAudit:!1,disclaimer:si},requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,deploymentActivated:!1,note:"Unsigned deploy. User wallet signs. Template tests passed; not a firm audit."},{provider:"protocol-templates",kind:"template-deploy"})}N();var Pv="https://api.geckoterminal.com/api/v2",ci=(e={})=>(e.baseUrl||process.env.GECKOTERMINAL_API_URL||Pv).replace(/\/$/,""),vn=e=>encodeURIComponent(String(e));async function Ha(e={},t={}){let n=Math.max(1,Number(e.page||1));return y(`${ci(t)}/networks?page=${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function rf(e={},t={}){if(!e.network||!e.poolAddress)throw new Error("network and poolAddress required");return y(`${ci(t)}/networks/${vn(e.network)}/pools/${vn(e.poolAddress)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function of(e={},t={}){if(!e.network||!(e.address||e.tokenAddress))throw new Error("network and token address required");return y(`${ci(t)}/networks/${vn(e.network)}/tokens/${vn(e.address||e.tokenAddress)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function sf(e={},t={}){if(!e.network||!e.poolAddress)throw new Error("network and poolAddress required");let n=["minute","hour","day"].includes(e.timeframe)?e.timeframe:"hour",r=new URLSearchParams;return r.set("aggregate",String(Math.max(1,Number(e.aggregate||1)))),r.set("limit",String(Math.min(1e3,Math.max(1,Number(e.limit||168))))),e.beforeTimestamp!=null&&r.set("before_timestamp",String(e.beforeTimestamp)),e.currency&&r.set("currency",String(e.currency)),e.token&&r.set("token",String(e.token)),y(`${ci(t)}/networks/${vn(e.network)}/pools/${vn(e.poolAddress)}/ohlcv/${n}?${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function af(e={}){let t=await Ha({page:1},e);return{ok:Array.isArray(t?.data)&&t.data.length>0,networkSample:t?.data?.length||0}}N();import{Interface as df,getAddress as pf,isAddress as Tv}from"ethers";me();W();var Nv="https://api.curve.finance/v1",mf=(e={})=>(e.baseUrl||process.env.CURVE_API_URL||Nv).replace(/\/$/,""),Ov=Object.freeze({1:"0x45312ea0eFf7E09C83CBE249fa1d7598c4C8cd4e",10:"0x0DCDED3545D565bA3B19E683431381007245d983",56:"0xA72C85C258A81761433B4e8da60505Fe3Dd551CC",137:"0x0DCDED3545D565bA3B19E683431381007245d983",988:"0xFF5Cb29241F002fFeD2eAa224e3e996D24A6E8d1",999:"0xd2002373543Ce3527023C75e7518C274A51ce712",4663:"0xFF5Cb29241F002fFeD2eAa224e3e996D24A6E8d1",8453:"0x4f37A9d177470499A2dD084621020b023fcffc1F",42161:"0x2191718CD32d02B8E60BAdFFeA33E4B5DD9A0A0D",43114:"0x0DCDED3545D565bA3B19E683431381007245d983"}),ff="0x0000000000000000000000000000000000000000",ja=new df(["function get_dy(address[11] route,uint256[5][5] swap_params,uint256 amount,address[5] pools) view returns (uint256)","function exchange(address[11] route,uint256[5][5] swap_params,uint256 amount,uint256 expected,address[5] pools,address receiver) payable returns (uint256)"]),cf=new df(["function coins(uint256) view returns (address)"]);function hf(e){let t=Ov[Number(e)];if(!t)throw new Error(`curve-router-ng: unsupported chainId ${e}`);return t}function Ar(e,t){if(!Tv(e))throw new Error(`${t} must be a valid EVM address`);return pf(e)}function Rv(e,t){let n;try{n=BigInt(String(e))}catch{throw new Error(`${t} must be an integer string`)}if(n<=0n)throw new Error(`${t} must be positive`);return n}function lf(e,t,n,r){let o=Number(e);if(!Number.isInteger(o)||o<n||o>r)throw new Error(`${t} must be an integer ${n}..${r}`);return o}function gf(e,t,n){return[e,t,n,...Array(8).fill(ff)]}function yf(e,t,n,r){return[[BigInt(e),BigInt(t),1n,BigInt(n),BigInt(r)],...Array.from({length:4},()=>[0n,0n,0n,0n,0n])]}function bf(e){return[e,...Array(4).fill(ff)]}async function $v({chainId:e,pool:t,nCoins:n,rpcCall:r,opts:o}){let i=[];for(let s=0;s<n;s++){let a=cf.encodeFunctionData("coins",[s]),c=await r(e,"eth_call",[{to:t,data:a},o.blockTag||"latest"],o),l=cf.decodeFunctionResult("coins",c);i.push(pf(l[0]))}return i}function uf(e,t,n){let r=t.toLowerCase(),o=e.findIndex(i=>i.toLowerCase()===r);if(o<0)throw new Error(`Curve pool does not contain ${n}`);return o}async function wf(e={}){return y(`${mf(e)}/openapi.json`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs})}async function Va(e={},t={}){let n=String(e.chain||e.network||"ethereum").toLowerCase(),r=String(e.registry||"main").toLowerCase();if(!/^[a-z0-9-]+$/.test(n)||!/^[a-z0-9-]+$/.test(r))throw new Error("invalid Curve chain or registry");return y(`${mf(t)}/getPools/${n}/${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function xf(e={}){let t=await Va({chain:"ethereum",registry:"main"},e),n=t?.data?.poolData?.length||0;return{ok:t?.success===!0&&n>0,poolSample:n}}async function za(e={},t={}){let n=Number(e.chainId??8453),r=hf(n),o=Ar(e.pool,"curve pool"),i=Ar(e.tokenIn,"curve tokenIn"),s=Ar(e.tokenOut,"curve tokenOut"),a=Rv(e.amountIn,"curve amountIn"),c=lf(e.nCoins??2,"curve nCoins",2,8),l=lf(e.poolType,"curve poolType",1,4),u=t.rpcCall||L,d=await $v({chainId:n,pool:o,nCoins:c,rpcCall:u,opts:t}),p=uf(d,i,"tokenIn"),m=uf(d,s,"tokenOut");if(p===m)throw new Error("Curve token indexes must differ");let f=gf(i,o,s),h=yf(p,m,l,c),g=bf(o),b=ja.encodeFunctionData("get_dy",[f,h,a,g]),k=await u(n,"eth_call",[{to:r,data:b},e.blockTag||"latest"],t),x=ja.decodeFunctionResult("get_dy",k),w=BigInt(x[0]);if(w<=0n)throw new Error("curve quote returned zero output");return V({venue:"curve",router:r,chainId:n,pool:o,tokenIn:i,tokenOut:s,amountIn:a.toString(),amountOut:w.toString(),nCoins:c,poolType:l,swapType:1,i:p,j:m,route:f,swapParams:h.map(v=>v.map(T=>T.toString())),pools:g},{chainId:n,venue:r,amountOut:w.toString(),liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps})}async function Sf(e={},t={}){let n=Number(e.chainId??8453),r=hf(n),o=Ar(e.sender||e.from||e.fromAddress||e.receiver,"curve sender"),i=Ar(e.receiver||e.recipient||o,"curve receiver"),s=await za({...e,sender:o},t),a=gf(s.tokenIn,s.pool,s.tokenOut),c=yf(s.i,s.j,s.poolType,s.nCoins),l=bf(s.pool),u=ja.encodeFunctionData("exchange",[a,c,BigInt(s.amountIn),BigInt(s.amountOutMinimum),l,i]);return O({provider:"curve",calldataReady:!0,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:n,quote:s,autoSlippage:s.autoSlippage,requiresApproval:{token:s.tokenIn,spender:r,amount:s.amountIn},transaction:{chainId:n,from:o,to:r,data:u,value:"0",slippageGuard:J(s.autoSlippage,{chainId:n,venue:r,data:u})}},{provider:"curve",kind:"curve-tx"})}N();import{Interface as Wa,getAddress as Pf,isAddress as Mv}from"ethers";W();var kf=Object.freeze({42161:"https://arbitrum-api.gmxinfra.io",43114:"https://avalanche-api.gmxinfra.io"}),Ef=Object.freeze({42161:{name:"arbitrum",api:kf[42161],exchangeRouter:"0x1C3fa76e6E1088bCE750f23a5BFcffa1efEF6A41",router:"0x7452c558d45f8afC8c83dAe62C3f8A5BE19c71f6",orderVault:"0x31eF83a530Fde1B38EE9A18093A333D8Bbbc40D5",dataStore:"0xFD70de6b91282D8017aA4E741e9Ae325CAb992d8",reader:"0x470fbC46bcC0f16532691Df360A07d8Bf5ee0789",eventEmitter:"0xC8ee91A54287DB53897056e12D9819156D3822Fb",wnt:"0x82aF49447D8a07e3bd95BD0d56f35241523fBab1",usdc:"0xaf88d065e77c8cC2239327C5EDb3A432268e5831"},43114:{name:"avalanche",api:kf[43114],exchangeRouter:"0x8f550E53DFe96C055D5Bdb267c21F268fCAF63B2",router:"0x820F5FfC5b525cD4d88Cd91aCf2c28F16530Cc68",orderVault:"0xD3D60D22d415aD43b7e64b510D86A30f19B1B12C",dataStore:"0x2F0b22339414ADeD7D5F06f9D604c7fF5b2fe3f6",reader:"0x62Cb8740E6986B29dC671B2EB596676f60590A5B",eventEmitter:"0xDb17B211c34240B014ab6d61d4A31FA0C0e20c26",wnt:"0xB31f66AA3C1e785363F0875A1B74E27b85FD66c7",usdc:"0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E"}}),vf="0x0000000000000000000000000000000000000000",Uv=`0x${"0".repeat(64)}`,Af=Object.freeze({marketSwap:0,limitSwap:1,marketIncrease:2,limitIncrease:3,marketDecrease:4,limitDecrease:5,stopLossDecrease:6,stopIncrease:8}),If=Object.freeze({noSwap:0,swapPnlTokenToCollateralToken:1,swapCollateralTokenToPnlToken:2}),li=new Wa(["function multicall(bytes[] data) payable returns (bytes[] results)","function sendTokens(address token,address receiver,uint256 amount) payable","function sendWnt(address receiver,uint256 amount) payable","function createOrder(((address receiver,address cancellationReceiver,address callbackContract,address uiFeeReceiver,address market,address initialCollateralToken,address[] swapPath) addresses,(uint256 sizeDeltaUsd,uint256 initialCollateralDeltaAmount,uint256 triggerPrice,uint256 acceptablePrice,uint256 executionFee,uint256 callbackGasLimit,uint256 minOutputAmount,uint256 validFromTime) numbers,uint8 orderType,uint8 decreasePositionSwapType,bool isLong,bool shouldUnwrapNativeToken,bool autoCancel,bytes32 referralCode,bytes32[] dataList) params) payable returns (bytes32)","function cancelOrder(bytes32 key) payable"]),Cf=new Wa(["function getAccountPositions(address dataStore,address account,uint256 start,uint256 end) view returns (bytes)","function getAccountOrders(address dataStore,address account,uint256 start,uint256 end) view returns (bytes)","function getOrder(address dataStore,bytes32 key) view returns (bytes)"]),Bv=new Wa(["event EventLog1(address msgSender,string eventName,string indexed eventNameHash,bytes32 indexed topic1,((tuple(string key,address value)[] items,tuple(string key,address[] value)[] arrayItems),(tuple(string key,uint256 value)[] items,tuple(string key,uint256[] value)[] arrayItems),(tuple(string key,int256 value)[] items,tuple(string key,int256[] value)[] arrayItems),(tuple(string key,bool value)[] items,tuple(string key,bool[] value)[] arrayItems),(tuple(string key,bytes32 value)[] items,tuple(string key,bytes32[] value)[] arrayItems),(tuple(string key,bytes value)[] items,tuple(string key,bytes[] value)[] arrayItems),(tuple(string key,string value)[] items,tuple(string key,string[] value)[] arrayItems)) eventData)","event EventLog2(address msgSender,string eventName,string indexed eventNameHash,bytes32 indexed topic1,bytes32 indexed topic2,((tuple(string key,address value)[] items,tuple(string key,address[] value)[] arrayItems),(tuple(string key,uint256 value)[] items,tuple(string key,uint256[] value)[] arrayItems),(tuple(string key,int256 value)[] items,tuple(string key,int256[] value)[] arrayItems),(tuple(string key,bool value)[] items,tuple(string key,bool[] value)[] arrayItems),(tuple(string key,bytes32 value)[] items,tuple(string key,bytes32[] value)[] arrayItems),(tuple(string key,bytes value)[] items,tuple(string key,bytes[] value)[] arrayItems),(tuple(string key,string value)[] items,tuple(string key,string[] value)[] arrayItems)) eventData)"]),Dv=Object.freeze({OrderCreated:"created",OrderUpdated:"updated",OrderExecuted:"executed",OrderCancelled:"cancelled",OrderFrozen:"frozen"});function In(e){let t=Number(e??42161),n=Ef[t];if(!n)throw new Error(`gmx: unsupported chainId ${e} (supported: ${Object.keys(Ef).join(", ")})`);return{chainId:t,...n}}function ui(e,t={}){let n=In(e);return(t.baseUrl||n.api).replace(/\/$/,"")}function ve(e,t){if(!Mv(e))throw new Error(`${t} must be a valid EVM address`);return Pf(e)}function H(e){return Pf(e).toLowerCase()}function An(e,t){let n;try{n=BigInt(String(e))}catch{throw new Error(`${t} must be an integer string`)}if(n<=0n)throw new Error(`${t} must be positive`);return n}function Ut(e,t){let n;try{n=BigInt(String(e??"0"))}catch{throw new Error(`${t} must be an integer string`)}if(n<0n)throw new Error(`${t} must be non-negative`);return n}function Fv(e,t=50){let n=Number(e??t);if(!Number.isFinite(n)||n<0||n>100)throw new Error("gmx maxSlippageBps must be 0..100");return Math.floor(n)}function qv(e){let t=String(e||"marketIncrease").trim();if(!(t in Af))throw new Error(`gmx unsupported orderType ${t}`);if(!["marketIncrease","marketDecrease"].includes(t))throw new Error("gmx prepare currently supports marketIncrease and marketDecrease only");return{key:t,code:Af[t]}}function Hv(e){let t=String(e||"noSwap").trim();if(!(t in If))throw new Error(`gmx unsupported decreasePositionSwapType ${t}`);return{key:t,code:If[t]}}function jv(e,t){return Array.isArray(e)?e:Array.isArray(e?.[t])?e[t]:[]}function Vv(e,t){let n=H(t);return e.find(r=>H(r.marketToken||r.market||r.address)===n)||null}function zv(e,t){let n=H(t);return e.find(r=>H(r.tokenAddress||r.address)===n)||null}function Wv({ticker:e,isLong:t,typeKey:n,maxSlippageBps:r}){let o=An(e?.minPrice,"gmx minPrice"),i=An(e?.maxPrice,"gmx maxPrice"),s=BigInt(r),a=10000n;return n==="marketIncrease"?(t?i*(a+s)/a:o*(a-s)/a).toString():(t?o*(a-s)/a:i*(a+s)/a).toString()}function Gv(e,t){let n=t?e.availableLiquidityLong:e.availableLiquidityShort;try{return BigInt(String(n??"0"))}catch{return 0n}}function Kv(e){let t=String(e||"").toLowerCase();return/^0x[0-9a-f]{64}$/.test(t)?`0x${t.slice(-40)}`:null}function ze(e,t,n=r=>r){let o=Array.from(e?.items||e?.[0]||[]).find(i=>String(i?.key??i?.[0]??"")===t);return o?n(o.value??o[1]):null}function Yv(e={}){let t=e.addressItems||e[0],n=e.uintItems||e[1],r=e.boolItems||e[3],o=e.bytes32Items||e[4],i=e.stringItems||e[6];return{account:ze(t,"account",s=>H(s)),market:ze(t,"market",s=>H(s)),initialCollateralToken:ze(t,"initialCollateralToken",s=>H(s)),key:ze(o,"key",s=>String(s).toLowerCase()),reason:ze(i,"reason",s=>String(s)),sizeDeltaUsd:ze(n,"sizeDeltaUsd",s=>BigInt(s).toString()),initialCollateralDeltaAmount:ze(n,"initialCollateralDeltaAmount",s=>BigInt(s).toString()),executionFee:ze(n,"executionFee",s=>BigInt(s).toString()),acceptablePrice:ze(n,"acceptablePrice",s=>BigInt(s).toString()),isLong:ze(r,"isLong",s=>!!s)}}function Xv(e={},t){if(H(e.address)!==H(t.eventEmitter))return null;let n;try{n=Bv.parseLog({topics:e.topics,data:e.data})}catch{return null}let r=String(n?.args?.eventName||""),o=Dv[r];if(!o)return null;let i=Yv(n.args.eventData||{}),s=(i.key||String(n.args.topic1||"")).toLowerCase(),a=i.account||Kv(n.args.topic2);return{eventName:r,status:o,orderKey:s,account:a?H(a):null,market:i.market,initialCollateralToken:i.initialCollateralToken,sizeDeltaUsd:i.sizeDeltaUsd,initialCollateralDeltaAmount:i.initialCollateralDeltaAmount,executionFee:i.executionFee,acceptablePrice:i.acceptablePrice,isLong:i.isLong,reason:i.reason,logIndex:e.logIndex==null?null:Number.parseInt(String(e.logIndex),16)}}function _f(e){return{executed:5,cancelled:4,frozen:3,created:2,updated:1}[e]||0}function Qv(e=[],{chainId:t}={}){let n=In(t);return(Array.isArray(e)?e:[]).map(r=>Xv(r,n)).filter(Boolean).sort((r,o)=>(r.logIndex??0)-(o.logIndex??0))}async function Tf(e={},t={}){return y(`${ui(e.chainId??42161,t)}/markets`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function Ga(e={},t={}){return y(`${ui(e.chainId??42161,t)}/markets/info`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function Nf(e={},t={}){return y(`${ui(e.chainId??42161,t)}/tokens`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function di(e={},t={}){return y(`${ui(e.chainId??42161,t)}/prices/tickers`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function Of(e={}){let t=await di({chainId:42161},e);return{ok:Array.isArray(t)&&t.length>0,tickerSample:Array.isArray(t)?t.length:0}}async function Rf(e={},t={}){let n=In(e.chainId??42161),r=ve(e.account||e.owner||e.user,"gmx account"),o=Ut(e.start??0,"gmx start"),i=Ut(e.end??e.limit??20,"gmx end"),s=Cf.encodeFunctionData("getAccountPositions",[n.dataStore,r,o,i]),c=await(t.rpcCall||L)(n.chainId,"eth_call",[{to:n.reader,data:s},e.blockTag||"latest"],t);return{provider:"gmx",chainId:n.chainId,reader:H(n.reader),dataStore:H(n.dataStore),account:H(r),raw:c}}async function $f(e={},t={}){let n=In(e.chainId??42161),r=String(e.key||e.orderKey||"").trim();if(!/^0x[0-9a-fA-F]{64}$/.test(r))throw new Error("gmx order key must be bytes32 hex");let o=Cf.encodeFunctionData("getOrder",[n.dataStore,r]),s=await(t.rpcCall||L)(n.chainId,"eth_call",[{to:n.reader,data:o},e.blockTag||"latest"],t);return{provider:"gmx",chainId:n.chainId,reader:H(n.reader),dataStore:H(n.dataStore),key:r,raw:s}}async function Lf(e={},t={}){let n=In(e.chainId??42161),r=t.receipt||await no({chainId:n.chainId,txHash:e.txHash,expectedTo:e.expectedTo||n.exchangeRouter},t),o=String(e.txHash||r.txHash||"").toLowerCase();if(r.ok!==!0)return{ok:!1,provider:"gmx",chainId:n.chainId,txHash:o,status:r.status||"unknown",reason:r.reason||"receipt not successful",receipt:r};let i=Qv(r.logs||[],{chainId:n.chainId}),s=e.expectedOrderKey||e.orderKey?String(e.expectedOrderKey||e.orderKey).toLowerCase():null,a=s?i.filter(u=>u.orderKey===s):i;if(a.length===0)return{ok:!1,provider:"gmx",chainId:n.chainId,txHash:o,status:"unknown",reason:s?"order key not found in GMX EventEmitter logs":"no GMX order lifecycle event found",events:i,receipt:r};let c=a.reduce((u,d)=>_f(d.status)>=_f(u.status)?d:u,a[0]),l=e.expectedAccount||e.account?H(e.expectedAccount||e.account):null;return l&&c.account!==l?{ok:!1,provider:"gmx",chainId:n.chainId,txHash:o,status:c.status,reason:`account mismatch: expected ${l}, got ${c.account||"null"}`,orderKey:c.orderKey,account:c.account,events:i,receipt:r}:{ok:!0,provider:"gmx",chainId:n.chainId,txHash:o,status:c.status,orderKey:c.orderKey,account:c.account,market:c.market,eventEmitter:H(n.eventEmitter),events:a,receipt:r}}async function Mf(e={},t={}){let n=In(e.chainId??42161),r=qv(e.orderType||e.type),o=Hv(e.decreasePositionSwapType),i=ve(e.account||e.owner||e.from||e.sender||e.receiver,"gmx account"),s=ve(e.receiver||i,"gmx receiver"),a=ve(e.cancellationReceiver||s,"gmx cancellationReceiver"),c=e.callbackContract?ve(e.callbackContract,"gmx callbackContract"):vf,l=e.uiFeeReceiver?ve(e.uiFeeReceiver,"gmx uiFeeReceiver"):vf,u=ve(e.market||e.marketToken,"gmx market"),d=ve(e.initialCollateralToken||e.collateralToken||n.usdc,"gmx initialCollateralToken"),p=r.key==="marketIncrease"?An(e.initialCollateralDeltaAmount??e.collateralAmount??e.amountIn,"gmx initialCollateralDeltaAmount"):Ut(e.initialCollateralDeltaAmount??e.collateralAmount??"0","gmx initialCollateralDeltaAmount"),m=An(e.sizeDeltaUsd,"gmx sizeDeltaUsd"),f=An(e.executionFee,"gmx executionFee"),h=BigInt(String(e.maxExecutionFeeWei??"10000000000000000"));if(f>h)throw new Error("gmx executionFee exceeds maxExecutionFeeWei");let g=BigInt(String(e.maxSizeDeltaUsd??"50000000000000000000000000000000000"));if(m>g)throw new Error("gmx sizeDeltaUsd exceeds maxSizeDeltaUsd");let b=Fv(e.maxSlippageBps??e.slippageBps,50),k=e.isLong==null?!0:!!e.isLong,[x,w]=await Promise.all([Ga({chainId:n.chainId},t),di({chainId:n.chainId},t)]),v=Vv(jv(x,"markets"),u);if(!v)throw new Error("gmx market not found in public registry");if(v.isListed===!1)throw new Error("gmx market is not listed");let T=ve(v.indexToken,"gmx market indexToken"),I=ve(v.longToken,"gmx market longToken"),R=ve(v.shortToken,"gmx market shortToken"),_=H(d);if(![H(I),H(R)].includes(_))throw new Error("gmx collateral token must match market longToken or shortToken for this guarded slice");let E=Gv(v,k);if(E>0n&&m>E)throw new Error("gmx sizeDeltaUsd exceeds available market liquidity");let q=zv(w,T);if(!q)throw new Error("gmx index ticker not found");let ge=e.acceptablePrice?An(e.acceptablePrice,"gmx acceptablePrice").toString():Wv({ticker:q,isLong:k,typeKey:r.key,maxSlippageBps:b}),Ce=(e.swapPath||[]).map(X=>ve(X,"gmx swapPath market"));if(Ce.length>3)throw new Error("gmx swapPath too long for guarded slice");let jn=Ut(e.triggerPrice??"0","gmx triggerPrice"),Xt=Ut(e.callbackGasLimit??"0","gmx callbackGasLimit"),Vn=Ut(e.minOutputAmount??"0","gmx minOutputAmount"),nt=Ut(e.validFromTime??"0","gmx validFromTime"),rt=!!e.shouldUnwrapNativeToken,zn=e.autoCancel==null?!0:!!e.autoCancel,Wn=String(e.referralCode||Uv);if(!/^0x[0-9a-fA-F]{64}$/.test(Wn))throw new Error("gmx referralCode must be bytes32 hex");let Qt=Array.isArray(e.dataList)?e.dataList:[];for(let X of Qt)if(!/^0x[0-9a-fA-F]{64}$/.test(String(X)))throw new Error("gmx dataList entries must be bytes32 hex");let gs={addresses:{receiver:s,cancellationReceiver:a,callbackContract:c,uiFeeReceiver:l,market:u,initialCollateralToken:d,swapPath:Ce},numbers:{sizeDeltaUsd:m,initialCollateralDeltaAmount:p,triggerPrice:jn,acceptablePrice:BigInt(ge),executionFee:f,callbackGasLimit:Xt,minOutputAmount:Vn,validFromTime:nt},orderType:r.code,decreasePositionSwapType:o.code,isLong:k,shouldUnwrapNativeToken:rt,autoCancel:zn,referralCode:Wn,dataList:Qt},C=[];r.key==="marketIncrease"&&p>0n&&C.push(li.encodeFunctionData("sendTokens",[d,n.orderVault,p])),C.push(li.encodeFunctionData("sendWnt",[n.orderVault,f])),C.push(li.encodeFunctionData("createOrder",[gs]));let $=li.encodeFunctionData("multicall",[C]),F={mode:"gmx-order",provider:"gmx",chainId:n.chainId,chain:n.name,orderType:r.key,orderTypeCode:r.code,decreasePositionSwapType:o.key,account:H(i),receiver:H(s),exchangeRouter:H(n.exchangeRouter),router:H(n.router),orderVault:H(n.orderVault),market:H(u),indexToken:H(T),initialCollateralToken:H(d),initialCollateralDeltaAmount:p.toString(),sizeDeltaUsd:m.toString(),executionFee:f.toString(),acceptablePrice:ge,maxSlippageBps:b,isLong:k,asyncExecution:!0,issuedAtMs:Number(t.nowMs??Date.now())};return O({provider:"gmx",chainId:n.chainId,chain:n.name,orderReady:!0,executionReady:!1,asyncExecution:!0,orderType:r.key,market:H(u),requiresApproval:r.key==="marketIncrease"&&p>0n?{token:H(d),spender:H(n.router),amount:p.toString()}:null,gmxGuard:F,transaction:{chainId:n.chainId,from:H(i),to:H(n.exchangeRouter),data:$,value:f.toString(),gmxGuard:F}},{provider:"gmx",kind:"gmx-order"})}N();import{Interface as Zv,getAddress as eA,isAddress as tA,keccak256 as Uf,toUtf8Bytes as Bf}from"ethers";W();var nA="https://api.morpho.org/graphql",pi=new Zv(["function asset() view returns (address)","function maxDeposit(address owner) view returns (uint256)","function previewDeposit(uint256 assets) view returns (uint256)","function deposit(uint256 assets,address receiver) returns (uint256)","function maxWithdraw(address owner) view returns (uint256)","function previewWithdraw(uint256 assets) view returns (uint256)","function withdraw(uint256 assets,address receiver,address owner) returns (uint256)"]),rA=(e={})=>e.baseUrl||process.env.MORPHO_API_URL||nA;async function Ya(e,t,n={}){return y(rA(n),{method:"POST",body:{query:e,variables:t},fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs??2e4})}var oA="query Markets($first: Int, $where: MarketFilters) { markets(first: $first, where: $where) { items { marketId lltv listed loanAsset { address symbol decimals } collateralAsset { address symbol decimals } state { supplyAssetsUsd borrowAssetsUsd } } } }",iA="query Vaults($first: Int, $where: VaultFilters) { vaults(first: $first, where: $where) { items { address name symbol listed asset { address symbol decimals } state { totalAssets totalAssetsUsd apy } } } }";function Ir(e,t){let n=String(e||"").trim();if(!tA(n))throw new Error(`morpho: ${t} must be an address`);return eA(n).toLowerCase()}function sA(e,t="amount"){try{let n=BigInt(String(e));if(n<=0n)throw new Error("nonpositive");return n.toString()}catch{throw new Error(`morpho: ${t} must be a positive integer string`)}}function Ka(e){return Array.isArray(e)?`[${e.map(Ka).join(",")}]`:e&&typeof e=="object"?`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${Ka(e[t])}`).join(",")}}`:JSON.stringify(e)}async function _r(e,t,n,r,o={}){let i=pi.encodeFunctionData(n,r),a=await(o.rpcCall||L)(Number(e),"eth_call",[{to:t,data:i},"latest"],o);return pi.decodeFunctionResult(n,a)}function aA(e,t){let n=t.toLowerCase();return(e||[]).find(r=>String(r?.address||"").toLowerCase()===n)||null}async function Df(e={},t={}){let n=Math.min(100,Math.max(1,Number(e.first||20))),r=(e.chainIds||[e.chainId||1]).map(Number);return Ya(oA,{first:n,chainIds:r,where:{chainId_in:r}},t)}async function Xa(e={},t={}){let n=Math.min(100,Math.max(1,Number(e.first||20))),r=(e.chainIds||[e.chainId||1]).map(Number);return Ya(iA,{first:n,chainIds:r,where:{chainId_in:r}},t)}async function Ff(e={}){return{ok:(await Ya("query { __typename }",{},e))?.data?.__typename==="Query"}}async function qf(e={},t={}){let n=Number(e.chainId??8453),r=String(e.action||"deposit").toLowerCase();if(!["deposit","withdraw"].includes(r))throw new Error("morpho: action must be deposit or withdraw");let o=Ir(e.vault||e.vaultAddress,"vault"),i=Ir(e.owner||e.from||e.sender,"owner"),s=Ir(e.receiver||i,"receiver"),a=sA(e.amount||e.assets,"amount"),c=Number(e.minTotalAssetsUsd??1e5),l=await Xa({chainId:n,first:100},t),u=aA(l?.data?.vaults?.items,o);if(!u)throw new Error("morpho: vault not found in public Morpho vault registry");if(u.listed===!1)throw new Error("morpho: vault is not listed");let d=Number(u?.state?.totalAssetsUsd??0);if(Number.isFinite(c)&&d<c)throw new Error(`morpho: vault totalAssetsUsd ${d} below minimum ${c}`);let[p]=await _r(n,o,"asset",[],t),m=Ir(p,"vault asset");if((u?.asset?.address?Ir(u.asset.address,"api vault asset"):m)!==m)throw new Error("morpho: API asset and on-chain asset mismatch");let h,g;if(r==="deposit"){let[k]=await _r(n,o,"maxDeposit",[i],t);if(BigInt(a)>BigInt(k.toString()))throw new Error("morpho: amount exceeds maxDeposit");let[x]=await _r(n,o,"previewDeposit",[a],t);if(BigInt(x.toString())<=0n)throw new Error("morpho: previewDeposit returned zero shares");g={minSharesOut:x.toString()},h=pi.encodeFunctionData("deposit",[a,s])}else{let[k]=await _r(n,o,"maxWithdraw",[i],t);if(BigInt(a)>BigInt(k.toString()))throw new Error("morpho: amount exceeds maxWithdraw");let[x]=await _r(n,o,"previewWithdraw",[a],t);if(BigInt(x.toString())<=0n)throw new Error("morpho: previewWithdraw returned zero shares");g={maxSharesIn:x.toString()},h=pi.encodeFunctionData("withdraw",[a,s,i])}let b={mode:"erc4626-vault",version:1,provider:"morpho",chainId:n,action:r,vault:o,asset:m,owner:i,receiver:s,amount:a,totalAssetsUsd:d,...g,calldataHash:Uf(Bf(h)),issuedAtMs:Date.now(),expiresAtMs:Date.now()+2e4};return b.guardHash=Uf(Bf(Ka(b))),O({provider:"morpho",protocol:"erc4626-vault",vaultReady:!0,executionReady:!1,signingReady:!1,broadcastReady:!1,requiresUserSignature:!0,chainId:n,action:r,vault:o,asset:m,owner:i,receiver:s,amount:a,vaultInfo:u,vaultGuard:b,requiresApproval:r==="deposit"?{token:m,spender:o,amount:a}:null,transaction:{chainId:n,from:i,to:o,data:h,value:"0x0",madVault:b}},{provider:"morpho",kind:"erc4626-vault"})}N();import{Interface as lA,getAddress as Qa,isAddress as uA}from"ethers";me();W();var dA="https://api-v3.balancer.fi/",pA=(e={})=>e.baseUrl||process.env.BALANCER_API_URL||dA;async function Vf(e,t,n={}){return y(pA(n),{method:"POST",body:{query:e,variables:t},fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs??2e4})}var mA="query Pools($first: Int, $where: GqlPoolFilter) { poolGetPools(first: $first, where: $where) { id address chain type protocolVersion dynamicData { totalLiquidity volume24h fees24h } } }",Hf=Object.freeze({1:{name:"ethereum",router:"0xAE563E3f8219521950555F5962419C8919758Ea2",weth:"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",usdc:"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48"},10:{name:"optimism",router:"0xe2fa4e1d17725e72dcdAfe943Ecf45dF4B9E285b",weth:"0x4200000000000000000000000000000000000006",usdc:"0x0b2c639c533813f4aa9d7837caf62653d097ff85"},8453:{name:"base",router:"0x3f170631ed9821Ca51A59D996aB095162438DC10",weth:"0x4200000000000000000000000000000000000006",usdc:"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"},42161:{name:"arbitrum",router:"0xEAedc32a51c510d35ebC11088fD5fF2b47aACF2E",weth:"0x82aF49447D8a07e3bd95BD0d56f35241523fBab1",usdc:"0xaf88d065e77c8cC2239327C5EDb3A432268e5831"},43114:{name:"avalanche",router:"0xF39CA6ede9BF7820a952b52f3c94af526bAB9015",weth:"0xB31f66AA3C1e785363F0875A1B74E27b85FD66c7",usdc:"0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E"}}),fA="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",hA="0x0000000000000000000000000000000000000000",Ja=new lA(["function querySwapSingleTokenExactIn(address pool,address tokenIn,address tokenOut,uint256 exactAmountIn,address sender,bytes userData) returns (uint256 amountOut)","function swapSingleTokenExactIn(address pool,address tokenIn,address tokenOut,uint256 exactAmountIn,uint256 minAmountOut,uint256 deadline,bool wethIsEth,bytes userData) payable returns (uint256 amountOut)"]);function zf(e){let t=Number(e??8453),n=Hf[t];if(!n)throw new Error(`balancer-v3: unsupported chainId ${e} (supported: ${Object.keys(Hf).join(", ")})`);return{chainId:t,...n}}function Wf(e){let t=String(e||"").toLowerCase();return!t||t==="eth"||t==="native"||t===hA||t===fA.toLowerCase()}function mi(e,t){if(!uA(e))throw new Error(`${t} must be a valid EVM address`);return Qa(e)}function jf(e,t,n){let r=String(e||"");return Wf(r)||/^weth$/i.test(r)?Qa(t.weth):/^usdc$/i.test(r)?Qa(t.usdc):mi(r,n)}function gA(e,t){let n;try{n=BigInt(String(e))}catch{throw new Error(`${t} must be an integer string`)}if(n<=0n)throw new Error(`${t} must be positive`);return n}function Gf(e){if(e==null||e==="")return"0x";let t=String(e);if(!/^0x[0-9a-fA-F]*$/.test(t))throw new Error("balancer userData must be hex");return t}async function Kf(e={},t={}){let n=Math.min(100,Math.max(1,Number(e.first||20))),r=(e.chains||[e.chain||"ETHEREUM"]).map(o=>String(o).toUpperCase());return Vf(mA,{first:n,chains:r,where:{chainIn:r}},t)}async function Yf(e={}){return{ok:(await Vf("query { __typename }",{},e))?.data?.__typename==="Query"}}async function Za(e={},t={}){let n=zf(e.chainId),r=mi(e.pool,"balancer pool"),o=e.tokenIn||"WETH",i=jf(o,n,"balancer tokenIn"),s=jf(e.tokenOut||"USDC",n,"balancer tokenOut"),a=gA(e.amountIn,"balancer amountIn"),c=mi(e.sender||e.from||e.fromAddress||e.recipient,"balancer sender"),l=Ja.encodeFunctionData("querySwapSingleTokenExactIn",[r,i,s,a,c,Gf(e.userData)]),d=await(t.rpcCall||L)(n.chainId,"eth_call",[{to:n.router,data:l},e.blockTag||"latest"],t),p=Ja.decodeFunctionResult("querySwapSingleTokenExactIn",d),m=BigInt(p[0]);if(m<=0n)throw new Error("balancer quote returned zero output");return V({venue:"balancer",protocolVersion:3,chainId:n.chainId,chain:n.name,router:n.router,pool:r,tokenIn:i,tokenOut:s,amountIn:a.toString(),amountOut:m.toString()},{chainId:n.chainId,venue:n.router,amountOut:m.toString(),liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps})}async function Xf(e={},t={}){let n=zf(e.chainId),r=mi(e.sender||e.from||e.fromAddress||e.recipient,"balancer sender"),o=e.tokenIn||"WETH",i=Wf(o),s=await Za({...e,sender:r},t),a=Math.min(600,Math.max(30,Number(e.deadlineSeconds??300))),c=Number(t.nowSeconds??Math.floor(Date.now()/1e3)),l=BigInt(c+a),u=e.wethIsEth!=null?!!e.wethIsEth:i,d=Ja.encodeFunctionData("swapSingleTokenExactIn",[s.pool,s.tokenIn,s.tokenOut,BigInt(s.amountIn),BigInt(s.amountOutMinimum),l,u,Gf(e.userData)]);return O({provider:"balancer",calldataReady:!0,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:n.chainId,deadline:l.toString(),quote:s,autoSlippage:s.autoSlippage,requiresApproval:i?null:{token:s.tokenIn,spender:n.router,amount:s.amountIn},transaction:{chainId:n.chainId,from:r,to:n.router,data:d,value:i?s.amountIn:"0",slippageGuard:J(s.autoSlippage,{chainId:n.chainId,venue:n.router,data:d})}},{provider:"balancer",kind:"balancer-tx"})}N();me();W();import{getAddress as bA}from"ethers";var wA="https://api-v2.pendle.finance/core",xA=Object.freeze({42161:"0x888888888889758F76e7103c6CbF23ABbF58F946",8453:"0x888888888889758F76e7103c6CbF23ABbF58F946"}),SA="0x0000000000000000000000000000000000000000",kA="0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee",Qf=(e={})=>(e.baseUrl||process.env.PENDLE_API_URL||wA).replace(/\/$/,"");function fi(e,t){try{return bA(e)}catch{throw new Error(`${t} must be a valid EVM address`)}}function _n(e,t){return fi(e,t).toLowerCase()}function EA(e){let t=String(e||"").toLowerCase();return t==="native"||t==="eth"||t===kA||t===SA}function ec(e,t){let n;try{n=BigInt(String(e))}catch{throw new Error(`${t} must be an integer string`)}if(n<=0n)throw new Error(`${t} must be positive`);return n.toString()}function vA(e){if(!Array.isArray(e)||e.length===0)throw new Error("pendle convert requires inputs[]");return e.map((t,n)=>({token:fi(t.token,`pendle input ${n} token`),amount:ec(t.amount,`pendle input ${n} amount`)}))}function AA(e){if(!Array.isArray(e)||e.length===0)throw new Error("pendle convert requires outputs[]");return e.map((t,n)=>fi(t,`pendle output ${n} token`))}function IA(e){let t=xA[Number(e)];if(!t)throw new Error(`Pendle prepare not enabled for chainId ${e}`);return t}function _A(e){let t=e?.routes?.[0]?.outputs?.[0]?.amount||e?.outputs?.[0]?.amount;if(!t)throw new Error("Pendle convert response missing output amount");return ec(t,"pendle output amount")}function PA(e,t){let n=(Array.isArray(e)?e:[]).filter(r=>r?.token&&r?.amount&&!EA(r.token)).map(r=>({token:_n(r.token,"pendle approval token"),spender:_n(t,"pendle approval spender"),amount:ec(r.amount,"pendle approval amount")}));return n.length?n.length===1?n[0]:n:null}async function tc(e={},t={}){let n=Number(e.chainId||42161),r=new URLSearchParams({limit:String(Math.min(100,Math.max(1,Number(e.limit||20)))),skip:String(Math.max(0,Number(e.skip||0)))});return e.isExpired!=null&&r.set("isExpired",String(!!e.isExpired)),y(`${Qf(t)}/v1/${n}/markets?${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function Jf(e={}){let t=await tc({chainId:42161,limit:1},e);return{ok:Array.isArray(t?.results),marketSample:t?.results?.length||0}}async function nc(e={},t={}){let n=Number(e.chainId??42161),r=IA(n),o=e.from||e.fromAddress||e.userAddress||e.taker||e.receiver;if(!o)throw new Error("pendlePrepare requires from/receiver");let i=fi(e.receiver||o,"pendle receiver"),s=vA(e.inputs),a=AA(e.outputs);if(e.enableAggregator===!0||Array.isArray(e.aggregators)&&e.aggregators.length)throw new Error("Pendle aggregator paths are disabled by policy; use direct convert only");let c=pe({liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps});if(!c.executable)throw new Error(`Pendle: route requires ${c.requiredBps} bps above cap ${c.capBps}`);let l={receiver:i,slippage:c.selectedBps/1e4,enableAggregator:!1,useLimitOrder:!1,inputs:s,outputs:a,...e.redeemRewards!=null?{redeemRewards:!!e.redeemRewards}:{},...e.needScale!=null?{needScale:!!e.needScale}:{},...e.additionalData?{additionalData:String(e.additionalData)}:{}},u=await y(`${Qf(t)}/v3/sdk/${n}/convert`,{method:"POST",body:l,fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??25e3}),p=u?.routes?.[0]?.tx;if(!p?.to||!p?.data)throw new Error("Pendle convert returned no executable tx");if(_n(p.to,"pendle tx target")!==_n(r,"pendle router"))throw new Error("Pendle convert returned unexpected router target");if(p.from&&_n(p.from,"pendle tx sender")!==_n(o,"pendle sender"))throw new Error("Pendle convert transaction sender mismatch");let m=_A(u),f=V(u,{chainId:n,venue:p.to,amountOut:m,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps});return O({provider:"pendle",calldataReady:!0,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:n,action:u.action||null,quote:f,autoSlippage:f.autoSlippage,requiresApproval:PA(u.requiredApprovals,p.to),transaction:{chainId:n,from:p.from||o,to:p.to,data:p.data,value:p.value??"0x0",slippageGuard:J(f.autoSlippage,{chainId:n,venue:p.to,data:p.data})}},{provider:"pendle",kind:"pendle-swap"})}async function Zf(e={},t={}){let n=await nc(e,t),{transaction:r,...o}=n;return o}N();me();W();import{isAddress as TA}from"ethers";var NA="https://api.odos.xyz",rc=(e={})=>(e.baseUrl||process.env.ODOS_API_URL||NA).replace(/\/$/,"");async function oc(e={}){return y(`${rc(e)}/info/chains`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs})}function OA(e={}){let t=Number(e.chainId);if(!Number.isInteger(t))throw new Error("odos: chainId required");if(!Array.isArray(e.inputTokens)||e.inputTokens.length<1)throw new Error("odos: inputTokens[] required");if(!Array.isArray(e.outputTokens)||e.outputTokens.length!==1)throw new Error("odos: agentic execution currently requires exactly one output token");if(!TA(String(e.userAddr||"")))throw new Error("odos: valid userAddr required");return t}async function eh(e={},t={}){let n=OA(e),r=pe({liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps});if(!r.executable)throw new Error(`odos: route requires ${r.requiredBps} bps above cap ${r.capBps}`);let o={chainId:n,inputTokens:e.inputTokens,outputTokens:e.outputTokens,userAddr:e.userAddr,slippageLimitPercent:r.selectedBps/100,disableRFQs:e.disableRFQs??!0,compact:e.compact??!0,simple:e.simple??!1},i=await y(`${rc(t)}/sor/quote/v3`,{method:"POST",body:o,fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??25e3}),s=i?.outAmounts?.[0];if(!i?.pathId||!s)throw new Error("odos: quote missing pathId or outAmounts[0]");return{chainId:n,selected:r,quote:i,amountOut:s}}async function th(e={},t={}){let{chainId:n,quote:r,amountOut:o}=await eh(e,t);return{...V(r,{chainId:n,venue:"odos-quote",amountOut:o,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps}),executionReady:!1,executionBlocker:"call prepare to assemble and simulate the path"}}async function nh(e={},t={}){let{chainId:n,quote:r,amountOut:o}=await eh(e,t),i=await y(`${rc(t)}/sor/assemble`,{method:"POST",body:{userAddr:e.userAddr,pathId:r.pathId,simulate:!0,...e.receiver?{receiver:e.receiver}:{}},fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??3e4}),s=i?.transaction;if(!s?.to||!s?.data)throw new Error("odos: assemble returned no executable transaction");if(Number(s.chainId??n)!==n)throw new Error("odos: transaction chain mismatch");if(s.from&&String(s.from).toLowerCase()!==String(e.userAddr).toLowerCase())throw new Error("odos: transaction sender mismatch");if(i?.simulation?.isSuccess!==!0)throw new Error(`odos: assembled transaction simulation failed: ${i?.simulation?.simulationError||"unknown"}`);let a=V(r,{chainId:n,venue:s.to,amountOut:o,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps}),c=i?.simulation?.amountsOut?.[0];if(c!=null&&BigInt(c)<BigInt(a.amountOutMinimum))throw new Error("odos: simulation output is below the bounded automatic floor");let l="0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee",u="0x0000000000000000000000000000000000000000",d=e.inputTokens.filter(p=>![l,u].includes(String(p.tokenAddress).toLowerCase())).map(p=>({token:p.tokenAddress,spender:s.to,amount:String(p.amount)}));return O({provider:"odos",calldataReady:!0,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:n,quote:a,simulation:i.simulation,requiresApproval:d,autoSlippage:a.autoSlippage,transaction:{chainId:n,from:s.from||e.userAddr,to:s.to,data:s.data,value:s.value??"0x0",...s.gas!=null?{gasLimit:s.gas}:{},...s.nonce!=null?{nonce:s.nonce}:{},slippageGuard:J(a.autoSlippage,{chainId:n,venue:s.to,data:s.data})}},{provider:"odos",kind:"odos-tx"})}async function rh(e={}){let t=await oc(e);return{ok:Array.isArray(t?.chains)&&t.chains.length>0,chainCount:t?.chains?.length||0}}N();var oh=/[\u200B-\u200F\u202A-\u202E\u2060-\u2064\uFEFF]/g,$A=/[<>&`*_~[\]()|\\]/g,LA=/[\u0000-\u001F\u007F]/g;function ic(e,{max:t=32,fallback:n=""}={}){return e==null?n:String(e).normalize("NFKC").replace(oh,"").replace(LA,"").replace($A,"").replace(/\s+/g," ").trim().slice(0,t).trim()||n}function sc(e){if(e==null)return!1;let t=String(e);return oh.test(t)?!0:/[\u0400-\u04FF\u0370-\u03FF]/.test(t)&&/[A-Za-z]/.test(t)}var ih=Object.freeze({1:"https://eth.blockscout.com",10:"https://explorer.optimism.io",137:"https://polygon.blockscout.com",324:"https://zksync.blockscout.com",8453:"https://base.blockscout.com",42161:"https://arbitrum.blockscout.com",534352:"https://scrollscan.com"});function hi(e,t={}){let n=Number(e),r=t.baseUrl||ih[n];if(!r)throw new Error(`Blockscout not configured for chainId ${n}`);return r.replace(/\/$/,"")}function sh(e){return!!ih[Number(e)]}async function ac(e={},t={}){return y(`${hi(e.chainId||1,t)}/api/v2/stats`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3})}async function ah(e={},t={}){if(!e.address)throw new Error("address required");return y(`${hi(e.chainId||1,t)}/api/v2/addresses/${encodeURIComponent(e.address)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3})}async function ch(e={},t={}){if(!e.address&&!e.tokenAddress)throw new Error("token address required");return y(`${hi(e.chainId||1,t)}/api/v2/tokens/${encodeURIComponent(e.address||e.tokenAddress)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3})}async function lh(e={},t={}){if(!e.address)throw new Error("address required");let n=Number(e.chainId||1),r=`${hi(n,t)}/api/v2/addresses/${encodeURIComponent(e.address)}/token-balances`,o=await y(r,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??18e3,headers:{accept:"application/json","user-agent":"OraclePortfolio/1.0"}});return Array.isArray(o)?o:[]}function uh(e=[],{fungibleOnly:t=!0}={}){let n=[];for(let r of e){if(!r||typeof r!="object")continue;let o=r.token&&typeof r.token=="object"?r.token:{},i=String(o.type||r.token_type||"").toUpperCase();if(t&&i&&!i.includes("ERC-20")&&i!=="ERC20")continue;let s=o.address_hash||o.address||r.token_address||r.tokenAddress||null;if(!s||typeof s!="string")continue;let a=String(r.value??r.balance??"0").replace(/^0x/i,"");if(!/^\d+$/.test(a)||a==="0")continue;let c=o.decimals??r.decimals;typeof c=="string"&&/^\d+$/.test(c)&&(c=Number(c)),(typeof c!="number"||!Number.isInteger(c)||c<0||c>36)&&(c=18);let l=ic(o.symbol||o.name,{max:32,fallback:"TOKEN"}),u=ic(o.name,{max:80,fallback:""})||null;n.push({address:s.toLowerCase().startsWith("0x")?s:`0x${s}`,symbol:l,name:u,decimals:c,amountRaw:a,tokenType:i||"ERC-20",source:"blockscout",verification:"indexer-reported",displaySuspicious:sc(o.symbol)||sc(o.name)||void 0})}return n}async function dh(e={}){let t=await ac({chainId:8453},e);return{ok:t?.total_blocks!=null||t?.total_transactions!=null,chainId:8453}}import{getAddress as UA}from"ethers";N();var BA="TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb",mh=Object.freeze({ETH:"coingecko:ethereum",POL:"coingecko:polygon-ecosystem-token",BNB:"coingecko:binancecoin",AVAX:"coingecko:avalanche-2",HYPE:"coingecko:hyperliquid",USDT0:"coingecko:tether",SOL:"coingecko:solana",BTC:"coingecko:bitcoin"});function mt(e={},t){return{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs,env:e.env,...e[t]||{}}}function gi(e,...t){for(let n of t){let r=String(e?.[n]||"").trim();if(r)return r}return null}function ph(e){if(!e)return null;try{return UA(String(e).trim().toLowerCase())}catch{throw new Error("portfolio: EVM address must be a valid 20-byte address")}}function Bt(e={},t=process.env){let n=e.addresses||{},r=ph(n.evm||e.evmAddress||gi(t,"ORACLE_EVM_ADDRESS","ORACLE_DEFAULT_ADDRESS","MAD_OPERATOR_ADDRESS")),o=n.solana||e.solanaAddress||gi(t,"ORACLE_SOLANA_ADDRESS"),i=n.bitcoin||e.bitcoinAddress||gi(t,"ORACLE_BITCOIN_ADDRESS"),s=ph(n.hyperliquid||e.hyperliquidAddress||gi(t,"ORACLE_HYPERLIQUID_ADDRESS")||r);return{evm:r,solana:o?K(o,"portfolio Solana address"):null,bitcoin:i?Qe(i,"portfolio Bitcoin address"):null,hyperliquid:s}}function Pr(e,t){let n=BigInt(String(e||"0")),r=Number(t);if(!Number.isInteger(r)||r<0||r>36)throw new Error("portfolio: decimals must be an integer from 0 to 36");if(r===0)return n.toString();let o=n<0n,i=o?-n:n,s=10n**BigInt(r),a=i/s,c=String(i%s).padStart(r,"0").replace(/0+$/,"");return`${o?"-":""}${a}${c?`.${c}`:""}`}function Pn(e){let t=Number(e);return Number.isFinite(t)?t:null}function yi(e){return Number.isFinite(e)?Number(e.toFixed(2)):null}function ft(e){let t=Number(e);return Number.isFinite(t)&&t!==0}function fh(e,t){let n=mh[t],r=n?e?.coins?.[n]:null,o=Number(r?.price);return{key:n||null,priceUsd:Number.isFinite(o)?o:null,timestamp:r?.timestamp??null,confidence:r?.confidence??null}}function DA(e){let t=new Map;for(let n of e)if(n?.ok)for(let r of n.data?.accounts||[]){let o=BigInt(String(r.amount||"0"));if(o===0n||!r.mint)continue;let i=`${r.mint}:${r.decimals??"unknown"}`,s=t.get(i)||{mint:r.mint,amountRaw:0n,decimals:r.decimals??null,programs:new Set,accounts:0};s.amountRaw+=o,s.accounts+=1,n.program&&s.programs.add(n.program),t.set(i,s)}return[...t.values()].map(n=>{let r=n.amountRaw.toString(),o=n.decimals==null?null:Pr(r,n.decimals),i=n.decimals===0&&n.amountRaw===1n;return{mint:n.mint,amountRaw:r,amount:o,decimals:n.decimals,tokenPrograms:[...n.programs],accountCount:n.accounts,verification:"unverified",classification:i?"collectible-candidate":"fungible-or-unclassified",priceUsd:null,usdValue:null}})}function cc(e,t){return{family:e,status:"unsupported",reason:t}}function lc(e,t){if(!e||e.status!=="ok")return e;let n=fh(t,e.symbol),r=Pn(e.amount),o=r!=null&&n.priceUsd!=null?yi(r*n.priceUsd):null;return{...e,price:n,usdValue:o}}async function hh(e={}){let t=Bt({},e.env||process.env);return{ok:!0,provider:"portfolio",readOnly:!0,configuredFamilies:Object.entries(t).filter(([,n])=>!!n).map(([n])=>n)}}async function bi(e={},t={}){let n=new Date().toISOString(),r=Bt(e,t.env||process.env),o=e.includePrices!==!1,i=e.includeTokens!==!1,s=e.includeCollectibles!==!1,a=new Map(st.map(C=>[C.chainId,C])),c=Array.isArray(e.evmChainIds)&&e.evmChainIds.length?[...new Set(e.evmChainIds.map(Number))]:[...a.keys()],l=[...new Set(Object.values(mh))],u=o?ne(()=>Oe(l,mt(t,"prices"))):Promise.resolve({ok:!1,ms:0,error:"price lookup disabled"}),d=Jt(c,e.concurrency||5,async C=>{let $=a.get(C);if(!$)return{family:"evm",chainId:C,name:null,address:r.evm,status:"unsupported",error:"chainId is not in Oracle's configured EVM registry"};if(!r.evm)return{family:"evm",chainId:C,name:$.name,address:null,status:"not-configured",error:"set ORACLE_EVM_ADDRESS or pass addresses.evm"};let F={...mt(t,"evm"),rpcUrl:e.rpcUrls?.[C]||t.evm?.rpcUrls?.[C]},X=await ne(()=>Zt(C,r.evm,F));if(!X.ok)return{family:"evm",chainId:C,name:$.name,address:r.evm,status:"unavailable",latencyMs:X.ms,error:X.error};let ie=$.nativeCurrency?.decimals??18,ye=$.nativeCurrency?.symbol||"NATIVE",U=X.data.balanceWei,ee={status:i?"unavailable":"not-requested",assets:[],reason:i?"EVM JSON-RPC cannot enumerate wallet tokens without an address indexer":"token discovery disabled"};if(i&&sh(C)){let Ct=await ne(()=>lh({chainId:C,address:r.evm},{...mt(t,"blockscout"),timeoutMs:t.timeoutMs??18e3}));Ct.ok?ee={status:"ok",assets:uh(Ct.data,{fungibleOnly:!0}).map(Gn=>{let Kn=Pr(Gn.amountRaw,Gn.decimals);return{...Gn,amount:Kn,priceUsd:null,usdValue:null}}),reason:null,source:"blockscout",latencyMs:Ct.ms}:ee={status:"unavailable",assets:[],reason:Ct.error||"blockscout token-balances failed",source:"blockscout",latencyMs:Ct.ms}}return{family:"evm",chainId:C,name:$.name,address:r.evm,status:"ok",latencyMs:X.ms,native:{status:"ok",symbol:ye,amountRaw:U,decimals:ie,amount:Pr(U,ie)},fungibleTokens:ee,collectibles:{status:s?"unavailable":"not-requested",assets:[],reason:s?"EVM JSON-RPC cannot enumerate wallet NFTs without an address indexer":"collectible discovery disabled"},source:ee.source==="blockscout"?"evm-rpc+blockscout":"evm-rpc"}}),p=(async()=>{if(!r.solana)return{family:"solana",name:"Solana Mainnet",address:null,status:"not-configured",error:"set ORACLE_SOLANA_ADDRESS or pass addresses.solana"};let C=mt(t,"solana"),$=await ne(()=>wo({address:r.solana},C)),F=i||s?await Promise.all([ne(()=>lr({owner:r.solana,programId:Ys},C)).then(ee=>({...ee,program:"spl-token"})),ne(()=>lr({owner:r.solana,programId:BA},C)).then(ee=>({...ee,program:"token-2022"}))]):[],X=DA(F),ie=X.filter(ee=>ee.classification==="collectible-candidate"),ye=X.filter(ee=>ee.classification!=="collectible-candidate"),U=F.filter(ee=>!ee.ok).map(ee=>ee.error);return{family:"solana",name:"Solana Mainnet",address:r.solana,status:$.ok||F.some(ee=>ee.ok)?"ok":"unavailable",native:$.ok?{status:"ok",symbol:"SOL",amountRaw:$.data.lamports,decimals:9,amount:Pr($.data.lamports,9),slot:$.data.slot}:{status:"unavailable",symbol:"SOL",error:$.error},fungibleTokens:{status:i?U.length===F.length?"unavailable":U.length?"partial":"ok":"not-requested",assets:i?ye:[],errors:U,note:"SPL accounts are unverified until a metadata/indexer source confirms symbol and spam status"},collectibles:{status:s?U.length===F.length?"unavailable":"partial":"not-requested",assets:s?ie:[],errors:U,note:"decimals=0 and amount=1 is only a collectible candidate, not verified NFT metadata"},source:"solana-rpc"}})(),m=(async()=>{if(!r.bitcoin)return{family:"bitcoin",name:"Bitcoin Mainnet",address:null,status:"not-configured",error:"set ORACLE_BITCOIN_ADDRESS or pass addresses.bitcoin"};let C=mt(t,"bitcoin"),$=mt(t,"bitcoinMeta"),[F,X,ie]=await Promise.all([ne(()=>So({address:r.bitcoin},C)),i?ne(()=>Eo({address:r.bitcoin},$)):Promise.resolve({ok:!1,ms:0,error:"token discovery disabled"}),s?ne(()=>an({address:r.bitcoin},$)):Promise.resolve({ok:!1,ms:0,error:"collectible discovery disabled"})]),ye=X.ok?X.data:null,U=ie.ok?ie.data:null;return{family:"bitcoin",name:"Bitcoin Mainnet",address:r.bitcoin,status:F.ok||ye?.ok||U?.ok?"ok":"unavailable",native:F.ok?{status:"ok",symbol:"BTC",amountRaw:F.data.balanceSats,decimals:8,amount:Pr(F.data.balanceSats,8)}:{status:"unavailable",symbol:"BTC",error:F.error},fungibleTokens:{status:i?ye?.ok?"ok":"unavailable":"not-requested",assets:ye?.balances||[],error:ye?.ok?null:ye?.error||X.error,verification:"indexer-reported"},collectibles:{status:s?U?.ok?"ok":"unavailable":"not-requested",assets:U?.inscriptions||[],error:U?.ok?null:U?.error||ie.error,unknownNotEmpty:!!U?.unknownNotEmpty,verification:"indexer-reported"},source:"bitcoin-esplora+bitcoin-meta"}})(),f=(async()=>{if(!r.hyperliquid)return{family:"hyperliquid",name:"Hyperliquid HyperCore",address:null,status:"not-configured",error:"set ORACLE_HYPERLIQUID_ADDRESS or pass addresses.hyperliquid"};let C=mt(t,"hyperliquid"),[$,F,X]=await Promise.all([ne(()=>fo(r.hyperliquid,C)),ne(()=>go(r.hyperliquid,C)),ne(()=>Xe(C))]),ie=($.ok&&Array.isArray($.data?.balances)?$.data.balances:[]).filter(U=>ft(U.total)||ft(U.hold)).map(U=>({coin:U.coin||null,total:String(U.total??"0"),hold:String(U.hold??"0"),priceUsd:null,usdValue:null})),ye=(F.ok&&Array.isArray(F.data?.assetPositions)?F.data.assetPositions:[]).map(U=>U.position||U).filter(U=>ft(U.szi)).map(U=>({coin:U.coin||null,size:String(U.szi??"0"),entryPrice:U.entryPx??null,positionValueUsd:U.positionValue??null,unrealizedPnlUsd:U.unrealizedPnl??null,liquidationPrice:U.liquidationPx??null}));return{family:"hyperliquid",name:"Hyperliquid HyperCore",address:r.hyperliquid,status:$.ok||F.ok?"ok":"unavailable",spot:{status:$.ok?"ok":"unavailable",balances:ie,error:$.ok?null:$.error},perps:{status:F.ok?"ok":"unavailable",accountValueUsd:F.data?.marginSummary?.accountValue??null,withdrawableUsd:F.data?.withdrawable??null,positions:ye,error:F.ok?null:F.error},mids:X.ok?X.data:{},source:"hyperliquid-info"}})(),[h,g,b,k,x]=await Promise.all([d,p,m,f,u]),w=x.ok?x.data:null,v=Object.freeze({1:"ethereum",10:"optimism",56:"bsc",137:"polygon",8453:"base",42161:"arbitrum",43114:"avax",81457:"blast",534352:"scroll",59144:"linea",324:"era"}),T=[];for(let C of h){if(C.family!=="evm"||C.fungibleTokens?.status!=="ok")continue;let $=v[C.chainId];if($)for(let F of C.fungibleTokens.assets||[])F.address&&T.push(`${$}:${String(F.address).toLowerCase()}`)}let I=null;if(o&&T.length){let C=[...new Set(T)],$=await ne(()=>Oe(C,mt(t,"prices")));$.ok&&(I=$.data)}let R=h.map(C=>{let $=C.native?{...C,native:lc(C.native,w)}:C;if($.fungibleTokens?.status==="ok"&&Array.isArray($.fungibleTokens.assets)){let F=v[$.chainId],X=$.fungibleTokens.assets.map(ie=>{let ye=String(ie.symbol||"").toUpperCase(),U=null;if(["USDC","USDT","USDT0","DAI","USDBC","USDE","USDCE"].includes(ye)&&(U=1),U==null&&F&&ie.address&&I?.coins){let ou=`${F}:${String(ie.address).toLowerCase()}`,Gn=I.coins[ou],Kn=Number(Gn?.price);Number.isFinite(Kn)&&Kn>0&&(U=Kn)}let ee=Pn(ie.amount),Ct=ee!=null&&U!=null?yi(ee*U):null;return{...ie,priceUsd:U,usdValue:Ct}});$={...$,fungibleTokens:{...$.fungibleTokens,assets:X}}}return $});g.native&&(g.native=lc(g.native,w)),b.native&&(b.native=lc(b.native,w));let _=0,E=0,q=0;for(let C of[...R,g,b]){C.native?.status==="ok"&&ft(C.native.amount)&&(C.native.usdValue!=null?(_+=C.native.usdValue,E+=1):q+=1);for(let $ of C.fungibleTokens?.assets||[])!ft($.amount)&&!ft($.amountRaw)||($.usdValue!=null?(_+=$.usdValue,E+=1):q+=1)}let ge=fh(w,"HYPE");for(let C of k.spot?.balances||[]){let $=String(C.coin||"").toUpperCase(),F=$==="USDC"||$==="USDT"||$==="USDT0"?1:$==="HYPE"?ge.priceUsd||Pn(k.mids?.HYPE):Pn(k.mids?.[C.coin]),X=Pn(C.total);C.priceUsd=F,C.usdValue=X!=null&&F!=null?yi(X*F):null,ft(C.total)&&(C.usdValue!=null?(_+=C.usdValue,E+=1):q+=1)}let Ce=Pn(k.perps?.accountValueUsd);Ce!=null&&Ce!==0&&(_+=Ce,E+=1);let jn=[...g.fungibleTokens?.assets||[],...g.collectibles?.assets||[]].filter(C=>ft(C.amount)).length,Xt=(b.fungibleTokens?.assets||[]).length+(b.collectibles?.assets||[]).length;q+=jn+Xt;let Vn=[...R,g,b,k],nt=C=>Vn.filter($=>$.status===C).length,rt=[],zn=R.filter(C=>C.fungibleTokens?.status==="unavailable"),Wn=R.filter(C=>C.fungibleTokens?.status==="ok");zn.length&&!Wn.length?rt.push("EVM token discovery is unavailable without a working address indexer; native balances are still live."):zn.length&&rt.push(`EVM token discovery partial: Blockscout covered ${Wn.length} chain(s); ${zn.length} chain(s) still native-only.`),(g.fungibleTokens?.assets?.length||g.collectibles?.assets?.length)&&rt.push("Solana token accounts are unverified and may include spam; collectible candidates are not confirmed NFTs."),b.collectibles?.unknownNotEmpty&&rt.push("Bitcoin inscription holdings are unknown, not zero, because no address indexer is configured."),x.ok||rt.push(`Price provider unavailable: ${x.error}`);let Qt=[cc("cosmos","requires a chain-specific bech32 address and LCD/RPC adapter"),cc("sui","Sui balance adapter is not installed"),cc("aptos","Aptos balance adapter is not installed")],gs=Vn.some(C=>["unavailable","partial","not-configured"].includes(C.fungibleTokens?.status)||["unavailable","partial","not-configured"].includes(C.collectibles?.status));return{provider:"portfolio",operation:"balances",readOnly:!0,queriedAt:n,addresses:r,coverage:{requestedSurfaces:Vn.length,ok:nt("ok"),unavailable:nt("unavailable"),notConfigured:nt("not-configured"),unsupported:nt("unsupported")+Qt.length,evmChainsRequested:c.length,evmChainsOk:R.filter(C=>C.status==="ok").length},valuation:{knownUsd:yi(_),label:"known priced value, not a complete portfolio total",pricedItems:E,unpricedNonzeroItems:q,complete:q===0&&!gs&&nt("unavailable")===0&&nt("not-configured")===0&&Qt.length===0,priceSource:o?"DefiLlama":null,priceStatus:x.ok?"ok":"unavailable",priceQueriedAt:n},chains:[...R,g,b,k],unsupportedFamilies:Qt,warnings:rt}}import{constants as xi}from"node:fs";import{chmod as uI,mkdir as dI,open as pI,readFile as mI}from"node:fs/promises";import{createHash as fI,randomUUID as hI}from"node:crypto";import gI from"node:os";import Tn from"node:path";N();N();var qA=Object.freeze(["i.seadn.io","openseauserdata.com","arweave.net","ipfs.io","nftstorage.link","dweb.link","cloudflare-ipfs.com","ordinals.com","ordinals.g.com","cdn.helius-rpc.com","shdw-drive.genesysgo.net"]),HA=new Set(["image/jpeg","image/png","image/webp"]);function jA(e){let t=String(e||"").toLowerCase();return qA.some(n=>t===n||t.endsWith(`.${n}`))}function VA(e){let t=String(e||"").trim();return t.startsWith("ipfs://")?`https://ipfs.io/ipfs/${t.slice(7).replace(/^ipfs\//,"")}`:t.startsWith("ar://")?`https://arweave.net/${t.slice(5)}`:t}function gh(e){let t=VA(e),n;try{n=new URL(t)}catch{return null}return n.protocol!=="https:"||n.username||n.password||!jA(n.hostname)?null:n}async function zA(e,t={}){let n=t.fetchImpl||globalThis.fetch;if(typeof n!="function")throw new Error("gallery fetch unavailable");let r=gh(e);if(!r)throw new Error("image host is not on the raster gallery allowlist");let o=Math.min(Math.max(Number(t.maxImageBytes??15e5),5e4),4e6);for(let i=0;i<=3;i+=1){let s=await ne(()=>n(r.toString(),{method:"GET",redirect:"manual",headers:{accept:"image/jpeg,image/png,image/webp"},signal:AbortSignal.timeout(t.timeoutMs??12e3)}));if(!s.ok)throw new Error(s.error);let a=s.data;if(a.status>=300&&a.status<400){let d=a.headers?.get?.("location");if(!d)throw new Error("image redirect missing location");let p=gh(new URL(d,r).toString());if(!p)throw new Error("image redirect left the host allowlist");r=p;continue}if(!a.ok)throw new Error(`image HTTP ${a.status}`);let c=String(a.headers?.get?.("content-type")||"").split(";",1)[0].toLowerCase();if(!HA.has(c))throw new Error(`unsafe or unsupported image type ${c||"unknown"}`);if(Number(a.headers?.get?.("content-length")||0)>o)throw new Error("image exceeds gallery byte cap");let u=Buffer.from(await a.arrayBuffer());if(!u.length||u.length>o)throw new Error("image exceeds gallery byte cap");return{mimeType:c,data:u.toString("base64"),sourceUrl:r.toString(),bytes:u.length}}throw new Error("too many image redirects")}function uc(e){return String(e??"").replaceAll("&","&").replaceAll("<","<").replaceAll(">",">").replaceAll('"',""").replaceAll("'","'")}function WA(e,t){return e.name||e.collection||e.tokenId||`NFT ${t+1}`}async function yh(e={},t={}){let n=Array.isArray(e.items)?e.items:[];if(!n.length)throw new Error("nft gallery requires inventory items");let r=Math.min(Math.max(Number(e.pageSize??12)||12,1),12),o=Math.max(Number(e.page??1)||1,1),i=Math.max(Math.ceil(n.length/r),1);if(o>i)throw new Error(`nft gallery page ${o} exceeds ${i}`);let s=n.slice((o-1)*r,o*r),a=[],c=0,l=Math.min(Math.max(Number(e.maxTotalBytes??8e6),25e4),12e6);for(let x of s){if(c>=l){a.push({item:x,image:null,error:"gallery page byte cap reached"});continue}try{let w=await zA(x.imageUrl||x.originalImageUrl,{...t,maxImageBytes:Math.min(Number(e.maxImageBytes??15e5),l-c)});c+=w.bytes,a.push({item:x,image:w,error:null})}catch(w){a.push({item:x,image:null,error:String(w?.message||w).slice(0,180)})}}let u=3,d=340,p=400,m=76,f=Math.ceil(s.length/u),h=u*d,g=m+f*p,b=a.map(({item:x,image:w,error:v},T)=>{let I=T%u,R=Math.floor(T/u),_=I*d,E=m+R*p,q=w?`<image x="${_+14}" y="${E+14}" width="312" height="312" preserveAspectRatio="xMidYMid slice" href="data:${w.mimeType};base64,${w.data}"/>`:`<rect x="${_+14}" y="${E+14}" width="312" height="312" rx="14" fill="#151820"/><text x="${_+170}" y="${E+165}" text-anchor="middle" fill="#76808f" font-size="16">image unavailable</text>`,ge=uc(WA(x,T).slice(0,34)),Ce=uc(x.chain||"unknown chain");return`${q}<text x="${_+16}" y="${E+350}" fill="#f3f5f7" font-size="17" font-weight="600">${ge}</text><text x="${_+16}" y="${E+376}" fill="#8d98a8" font-size="13">${Ce}${v?" \xB7 placeholder":""}</text>`}).join(""),k=`<svg xmlns="http://www.w3.org/2000/svg" width="${h}" height="${g}" viewBox="0 0 ${h} ${g}"><rect width="100%" height="100%" fill="#090b10"/><text x="24" y="34" fill="#ffffff" font-size="24" font-weight="700">NFT INVENTORY</text><text x="24" y="58" fill="#8d98a8" font-size="14">page ${o} of ${i} \xB7 ${n.length} assets \xB7 generated ${uc(new Date().toISOString())}</text>${b}</svg>`;return{provider:"nft-portfolio",operation:"gallery",mimeType:"image/svg+xml",dataBase64:Buffer.from(k).toString("base64"),page:o,pageSize:r,totalPages:i,totalItems:n.length,renderedItems:a.filter(x=>x.image).length,placeholders:a.filter(x=>!x.image).map(x=>({assetKey:x.item.assetKey||null,name:x.item.name||null,sourceUrl:x.item.imageUrl||null,error:x.error})),rasterOnly:!0,externalScripts:!1}}var GA=[/\bclaim\b/i,/\breward\b/i,/\bairdrop\b/i,/\bvoucher\b/i,/\bwinner\b/i,/\bfree\s*mint\b/i,/\bactivate\b/i,/\bunlock\b/i,/\bverify\b/i,/\bconnect\s+wallet\b/i],KA=/(https?:\/\/|www\.|[a-z0-9-]+\.(?:com|net|io|xyz|org|app|finance|gift|claims?|site|link|live|vip|top|cc))/i,YA=/(\$\s?\d|\d[\d,.]*\s*(?:usd|usdc|usdt|eth|weth|btc|sol)\b)/i;function XA(e={}){let t=[],n=String(e.name||""),r=String(e.description||""),o=`${n} ${r}`;KA.test(n)&&t.push("url-in-name");let i=GA.filter(l=>l.test(o)).length;i>0&&t.push(`lure-language:${i}`),YA.test(n)&&t.push("value-claim-in-name"),/[\u200B-\u200F\u202A-\u202E\uFEFF]/.test(n)&&t.push("invisible-characters"),e.disabled===!0&&t.push("marketplace-disabled");let s=e.estimatedValueUsd==null&&e.estimatedValueSats==null,a=!Array.isArray(e.traits)||e.traits.length===0;s&&a&&i>0&&t.push("valueless-airdrop-with-lure");let c=t.includes("url-in-name")||t.includes("invisible-characters")||t.includes("valueless-airdrop-with-lure")||t.length>=2;return{spam:c,risk:c?"high":t.length>0?"low":"none",reasons:t}}function bh(e={}){let t=XA(e);return{...e,spam:e.spam===!0||t.spam,riskLevel:t.risk,riskReasons:t.reasons.length?t.reasons:void 0}}W();var QA=Object.freeze([{chain:"ethereum",chainId:1,family:"evm"},{chain:"optimism",chainId:10,family:"evm"},{chain:"polygon",chainId:137,family:"evm"},{chain:"stablechain",chainId:988,family:"evm"},{chain:"hyperevm",chainId:999,family:"evm"},{chain:"abstract",chainId:2741,family:"evm"},{chain:"robinhood",chainId:4663,family:"evm"},{chain:"base",chainId:8453,family:"evm"},{chain:"arbitrum",chainId:42161,family:"evm"},{chain:"avalanche",chainId:43114,family:"evm"},{chain:"hyperliquid",chainId:null,family:"hyperliquid"}]),JA=Object.freeze([{family:"evm",chain:"bsc",chainId:56,reason:"OpenSea account inventory does not support BSC"},{family:"cosmos",reason:"requires a chain-specific bech32 address and NFT indexer"},{family:"sui",reason:"owner inventory adapter not installed"},{family:"aptos",reason:"owner inventory adapter not installed"}]);function Dt(e={},t){return{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs,env:e.env,allowDiskCredentials:e.allowDiskCredentials,allowAmbientCredentials:e.allowAmbientCredentials,...e[t]||{}}}async function Cr(e,t){let n=await ne(t);return n.ok?{ok:!0,data:n.data}:{ok:!1,error:`${e}: ${n.error}`.slice(0,300)}}function ZA(e){if(Array.isArray(e))return e;for(let t of["items","results","ordinals","inscriptions","data"])if(Array.isArray(e?.[t]))return e[t];return[]}function eI(e={},t){let n=e.inscription_id||e.inscriptionId||e.id||e.inscription||null;return{chain:"bitcoin",family:"bitcoin",owner:t,contract:null,tokenId:n==null?null:String(n),tokenStandard:"ordinal",collection:e.collection_slug||e.collectionSlug||e.collection?.slug||e.collection||null,name:e.name||e.meta?.name||(n?`Inscription ${n}`:"Bitcoin inscription"),description:e.description||e.meta?.description||null,imageUrl:e.image_url||e.imageUrl||e.content_url||e.contentUrl||e.thumbnail||null,originalImageUrl:e.content_url||e.contentUrl||e.image_url||e.imageUrl||null,animationUrl:null,metadataUrl:e.metadata_url||e.metadataUrl||null,marketplaceUrl:e.marketplace_url||e.marketplaceUrl||null,estimatedValueUsd:e.estimated_value_usd!=null&&Number.isFinite(Number(e.estimated_value_usd))?Number(e.estimated_value_usd):null,estimatedValueSats:(e.floor_price_sats??e.price_sats)!=null&&Number.isFinite(Number(e.floor_price_sats??e.price_sats))?Number(e.floor_price_sats??e.price_sats):null,spam:!1,disabled:!1,nsfw:!1,listed:e.listed===!0||e.is_listed===!0,listingId:e.listing_id||e.listingId||null,traits:Array.isArray(e.traits)?e.traits:[],updatedAt:e.updated_at||e.updatedAt||null,acquisitionCost:null,itemPnl:{status:"unavailable",reason:"Satflow wallet inventory does not expose trustworthy acquisition cost"},listingAdapter:"satflow",source:"satflow-wallet-contents"}}function tI(e,t){return{chain:"bitcoin",family:"bitcoin",owner:t,contract:null,tokenId:String(e),tokenStandard:"ordinal",collection:null,name:`Inscription ${e}`,description:null,imageUrl:null,originalImageUrl:null,animationUrl:null,metadataUrl:null,marketplaceUrl:null,estimatedValueUsd:null,spam:!1,disabled:!1,nsfw:!1,traits:[],updatedAt:null,acquisitionCost:null,itemPnl:{status:"unavailable",reason:"address indexer returned no acquisition or valuation data"},listingAdapter:"satflow",source:"bitcoin-meta-address-indexer"}}function Sh(e={}){return[e.chain||"unknown",e.contract||"native",e.tokenId||"unknown"].join(":").toLowerCase()}function nI(e){let t=new Map;if(Array.isArray(e)){for(let n of e)n?.assetKey&&t.set(String(n.assetKey).toLowerCase(),n);return t}if(e&&typeof e=="object")for(let[n,r]of Object.entries(e))t.set(n.toLowerCase(),r);return t}function rI(e,t){let n=Sh(e),r=t.get(n),o=e.estimatedValueUsd==null?null:Number(e.estimatedValueUsd);if(!r)return{...e,assetKey:n};let i=Number(r.costUsd),s=Number(r.feesUsd??0);if(!Number.isFinite(i)||i<0||!Number.isFinite(s)||s<0)return{...e,assetKey:n,acquisitionCost:null,itemPnl:{status:"unavailable",reason:"invalid user-supplied cost basis"}};let a=Math.round((i+s)*100)/100;return Number.isFinite(o)?{...e,assetKey:n,acquisitionCost:{costUsd:i,feesUsd:s,totalCostUsd:a,acquiredAt:r.acquiredAt||null,source:r.source||"user-supplied"},itemPnl:{status:"estimated",methodology:"provider estimated current value minus supplied USD acquisition cost and fees",unrealizedUsd:Math.round((o-a)*100)/100,currentValueUsd:o,totalCostUsd:a,realizedUsd:null}}:{...e,assetKey:n,acquisitionCost:{costUsd:i,feesUsd:s,totalCostUsd:a,acquiredAt:r.acquiredAt||null,source:r.source||"user-supplied"},itemPnl:{status:"unavailable",reason:"current NFT valuation is unavailable"}}}function oI(e){let t=new Map;for(let n of e){let r=Sh(n);t.has(r)||t.set(r,n)}return[...t.values()]}function iI(e,t){let n=e.filter(i=>i.itemPnl?.status==="estimated"),r=e.length-n.length,o=Math.round(n.reduce((i,s)=>i+Number(s.itemPnl.unrealizedUsd||0),0)*100)/100;return{nftItemPnl:{status:r===0&&e.length?"estimated-complete-for-held-items":n.length?"partial":"unavailable",methodology:"Only items with explicit acquisition cost and provider estimated current value are included",knownUnrealizedUsd:o,knownItems:n.length,unknownItems:r,realizedUsd:null,warning:"Transfers, gifts, airdrops, mints, bridges, gas, royalties, and off-market sales can make cost basis unavailable or incomplete."},providerAccountPnl:t}}async function kh(){return{ok:!0,provider:"nft-portfolio",readOnly:!0,marketplaces:["opensea","magiceden-sol","satflow"],listingExecution:"prepare-only"}}async function Cn(e={},t={}){let n=new Date().toISOString(),r=Bt(e,t.env||process.env),o=Array.isArray(e.chains)&&e.chains.length?new Set(e.chains.map(w=>String(w).toLowerCase())):null,i=QA.filter(w=>!o||o.has(w.chain)),s=[],a=[],c=Dt(t,"opensea"),l=r.evm?i.filter(w=>w.family!=="solana"):[],u=await Jt(l,4,async w=>({row:w,result:await Cr(`opensea-${w.chain}`,()=>gr({chain:w.chain,address:r.evm,pageSize:e.pageSize,maxPages:e.maxPages},c),t.timeoutMs??35e3)}));for(let{row:w,result:v}of u)if(v.ok){let T=v.data.nfts.map(I=>({...I,family:w.family,chainId:w.chainId,listingAdapter:"opensea",source:"opensea-account-inventory"}));a.push(...T),s.push({family:w.family,chain:w.chain,chainId:w.chainId,status:v.data.complete?"ok":"partial",count:T.length,complete:v.data.complete,next:v.data.next,source:"opensea"})}else s.push({family:w.family,chain:w.chain,chainId:w.chainId,status:"unavailable",error:v.error,source:"opensea"});if(!r.evm)for(let w of i.filter(v=>v.family!=="solana"))s.push({family:w.family,chain:w.chain,chainId:w.chainId,status:"not-configured",reason:"EVM address missing"});if(r.solana&&(!o||o.has("solana"))){let w=await Cr("opensea-solana",()=>gr({chain:"solana",address:r.solana,pageSize:e.pageSize,maxPages:e.maxPages},c),t.timeoutMs??35e3);if(w.ok){let v=w.data.nfts.map(T=>({...T,family:"solana",chainId:null,listingAdapter:null,source:"opensea-account-inventory"}));a.push(...v),s.push({family:"solana",chain:"solana",status:w.data.complete?"ok":"partial",count:v.length,complete:w.data.complete,next:w.data.next,source:"opensea"})}else s.push({family:"solana",chain:"solana",status:"unavailable",error:w.error,source:"opensea"})}else(!o||o.has("solana"))&&s.push({family:"solana",chain:"solana",status:"not-configured",reason:"Solana address missing"});if(r.bitcoin&&(!o||o.has("bitcoin"))){let w=await Cr("satflow-wallet-contents",()=>Ao({address:r.bitcoin,type:"ordinals",limit:e.bitcoinLimit??100,offset:0},Dt(t,"satflow")),t.timeoutMs??35e3);if(w.ok){let v=ZA(w.data.contents).map(I=>eI(I,r.bitcoin));a.push(...v);let T=v.length<Number(e.bitcoinLimit??100);s.push({family:"bitcoin",chain:"bitcoin",status:T?"ok":"partial",count:v.length,complete:T,source:"satflow"})}else{let v=await Cr("bitcoin-meta-inscriptions",()=>an({address:r.bitcoin},Dt(t,"bitcoinMeta")),t.timeoutMs??35e3),T=v.ok&&v.data?.ok&&Array.isArray(v.data.inscriptions)?v.data.inscriptions:[];a.push(...T.map(I=>tI(I,r.bitcoin))),s.push({family:"bitcoin",chain:"bitcoin",status:T.length?"partial":"unavailable",count:T.length,complete:!1,source:T.length?"bitcoin-meta":"satflow",error:T.length?"Satflow unavailable; fallback has IDs only":w.error})}}else(!o||o.has("bitcoin"))&&s.push({family:"bitcoin",chain:"bitcoin",status:"not-configured",reason:"Bitcoin address missing"});let d=[];if(e.includePnl!==!1)for(let w of[...new Set([r.evm,r.solana].filter(Boolean))]){let v=await Cr(`opensea-pnl-${w}`,()=>zo({address:w},c),t.timeoutMs??35e3);d.push(v.ok?{status:"ok",...v.data}:{status:"unavailable",address:w,source:"opensea-indexed-account-pnl",error:v.error})}let p=nI(e.costBasis),m=oI(a).map(w=>rI(w,p)).map(w=>bh(w)),f=m.filter(w=>!w.spam),h=m.filter(w=>w.spam),g=f.filter(w=>w.estimatedValueUsd!=null&&Number.isFinite(Number(w.estimatedValueUsd))),b=Math.round(g.reduce((w,v)=>w+Number(v.estimatedValueUsd),0)*100)/100,k=f.length-g.length,x=s.filter(w=>w.status!=="ok"||w.complete===!1);return{provider:"nft-portfolio",operation:"inventory",readOnly:!0,generatedAt:n,addresses:r,coverage:s,unsupported:JA,inventory:{count:m.length,visibleCount:f.length,flaggedCount:h.length,items:m,visibleItems:f,flaggedItems:h},valuation:{estimatedCurrentValueUsd:b,valuedItems:g.length,unvaluedItems:k,complete:k===0&&x.length===0,methodology:"Sum of provider estimated_value_usd for non-flagged items. It is not an executable bid."},pnl:iI(f,d),listingCoverage:{opensea:"EVM listing actions available with OPENSEA_API_KEY, explicit price/currency/expiry, and user confirmation",satflow:"Bitcoin unsigned listing PSBT available with SATFLOW_API_KEY, explicit price/expiry, and user confirmation",solana:"Magic Eden unsigned list transaction available with MAGICEDEN_API_KEY, explicit SOL price/expiry, and user confirmation",unsupported:"Sui, Aptos, Cosmos, BSC, and unknown marketplaces fail closed"},traitSniperCoverage:{opensea:"Evaluates reveal/trait-floor mispricing only with recent trait sales and volume evidence. Buy intents require local vault signing.",execution:"prepare-only on hosted surfaces; local vault required for purchase"},metadataSafety:{imagesAreUntrusted:!0,animationAndHtmlNotRendered:!0,galleryRasterOnly:!0,missingImagesUsePlaceholders:!0}}}function wh(e,t){let n=typeof e=="number"?e*1e3:Date.parse(String(e||""));if(!Number.isFinite(n))throw new Error(`${t} must be an ISO 8601 timestamp or Unix seconds`);let r=Math.floor(n/1e3);if(r<=Math.floor(Date.now()/1e3))throw new Error(`${t} must be in the future`);return r}function sI(e){let t=String(e??"").trim();if(!/^[1-9]\d*$/.test(t))throw new Error("Bitcoin NFT list priceSats must be a positive integer");return t}async function Eh(e={},t={}){if(e.userConfirmed!==!0)throw new Error("NFT listing preparation requires userConfirmed=true after reviewing asset, marketplace, price, currency, fees, royalties, and expiry");let n=String(e.marketplace||"").trim().toLowerCase();if(n==="opensea")return Wo(e,Dt(t,"opensea"));if(n==="magiceden"||n==="magiceden-sol"){let r=wh(e.expiry??e.endTime,"Solana NFT listing expiry");return Go({...e,expiry:r},Dt(t,"magiceden"))}if(n==="satflow"){let r=wh(e.expiry??e.endTime??e.expiresAt,"Bitcoin NFT listing expiry");return Io({inscription_id:e.inscriptionId||e.tokenId,runes_output:e.runesOutput,ord_address:e.ordAddress||e.seller,receive_address:e.receiveAddress,price:sI(e.priceSats??e.price),tap_key:e.tapKey,collection_slug:e.collectionSlug||e.collection,expires_at:r},Dt(t,"satflow"))}throw new Error(`unsupported NFT marketplace: ${n||"<missing>"}`)}function dc(e,t){let n=Number(e);if(!Number.isFinite(n)||n<0)throw new Error(`${t} must be a non-negative ETH number`);return n}function pc(e){if(e==null||e==="")return null;let t=Number(e);return Number.isFinite(t)&&t>0?t:null}function wi(e){return String(e??"").trim().toLowerCase()}function aI(e={},t,n){let r=Array.isArray(e.traits)?e.traits:[],o=wi(t),i=wi(n);return!o||!i?!1:r.some(s=>wi(s.trait_type??s.traitType??s.type)===o&&wi(s.value??s.trait_value??s.traitValue)===i)}function cI(e={},t){if(!t)return!0;let n=String(e.contract||e.tokenContract||e.assetContract||"").toLowerCase();return!n||n===String(t).toLowerCase()}function xh(e={},t=["timestamp","listedAt","createdAt"]){for(let n of t){let r=e[n]??e[n.replace(/[A-Z]/g,i=>`_${i.toLowerCase()}`)];if(r==null)continue;let o=typeof r=="number"?r:Date.parse(String(r));if(Number.isFinite(o))return o}return null}function mc(e){return Math.round(Number(e)*1e6)/1e6}function ht(e,t,n={}){return{provider:"nft-portfolio",operation:"traitSnipe",marketplace:String(e.marketplace||"").toLowerCase(),collectionSlug:e.collectionSlug||e.collection||null,contract:e.contract||null,decision:"PASS",reason:t,executionReady:!1,signingReady:!1,broadcastReady:!1,requiresLocalVault:!0,best:null,evidence:n,prepareIntent:null}}async function vh(e={},t={}){let n=String(e.marketplace||"").trim().toLowerCase();if(n!=="opensea")return ht(e,`unsupported NFT marketplace: ${n||"<missing>"}`);let o=["traitType","traitValue","maxPriceEth","minDiscountBps","minTraitSales","minTraitVolumeEth","traitFloorEth"].filter(I=>e[I]==null||e[I]==="");if(o.length)return ht(e,`trait-risk-params-required: ${o.join(",")}`);let i=Number.isFinite(Number(e.nowMs))?Number(e.nowMs):Date.now(),s=dc(e.maxPriceEth,"maxPriceEth"),a=Number(e.minDiscountBps),c=Number(e.minTraitSales),l=dc(e.minTraitVolumeEth,"minTraitVolumeEth"),u=dc(e.traitFloorEth,"traitFloorEth"),d=pc(e.collectionFloorEth),p=pc(e.maxListingAgeMs),m=pc(e.maxSaleAgeMs??e.salesWindowMs);if(!Number.isFinite(a)||a<0)return ht(e,"invalid-min-discount-bps");if(!Number.isFinite(c)||c<1)return ht(e,"invalid-min-trait-sales");if(u<=0)return ht(e,"trait-floor-unavailable");let f=I=>aI(I,e.traitType,e.traitValue)&&cI(I,e.contract),h=(Array.isArray(e.sales)?e.sales:[]).filter(f).filter(I=>{if(!m)return!0;let R=xh(I,["timestamp","soldAt","createdAt"]);return R!=null&&i-R<=m}),g=mc(h.reduce((I,R)=>I+Number(R.priceEth??R.price??0),0)),b={count:h.length,volumeEth:g,minSales:c,minVolumeEth:l};if(h.length<c||g<l)return ht(e,"trait-liquidity-insufficient",{traitSales:b});let k=(Array.isArray(e.listings)?e.listings:[]).filter(f).filter(I=>{let R=Number(I.priceEth??I.price);if(!Number.isFinite(R)||R<=0||R>s)return!1;if(!p)return!0;let _=xh(I,["listedAt","createdAt","timestamp"]);return _!=null&&i-_<=p}).map(I=>{let R=Number(I.priceEth??I.price),_=Math.round((u-R)/u*1e4);return{...I,priceEth:R,discountBps:_}}).filter(I=>I.discountBps>=a).sort((I,R)=>I.priceEth-R.priceEth||R.discountBps-I.discountBps),x={traitSales:b,collectionFloorEth:d,traitFloorEth:u,listingDepth:{count:k.length,minFreshListings:e.minTraitListings==null?null:Number(e.minTraitListings)},methodology:"Trait buy intent requires caller-supplied fresh listings, real trait sales, volume, max price, and min discount gates. Rarity metadata alone is ignored."},w=e.minTraitListings==null?1:Number(e.minTraitListings);if(!Number.isFinite(w)||w<1)return ht(e,"invalid-min-trait-listings",x);if(k.length<w)return ht(e,"trait-listing-depth-insufficient",x);let v=k[0],T=O({provider:"nft-portfolio",kind:"nft-trait-buy-intent",marketplace:n,chain:e.chain||null,collectionSlug:e.collectionSlug||e.collection||null,contract:e.contract||null,tokenId:v.tokenId==null?null:String(v.tokenId),listingId:v.listingId||null,orderHash:v.orderHash||null,priceEth:mc(v.priceEth),maxPriceEth:s,traitType:e.traitType,traitValue:e.traitValue,evidence:x,localOnly:!0,requiresLocalVault:!0},{provider:"nft-portfolio",kind:"nft-trait-buy-intent",env:t.env||process.env});return{provider:"nft-portfolio",operation:"traitSnipe",marketplace:n,collectionSlug:e.collectionSlug||e.collection||null,contract:e.contract||null,decision:"BUY",reason:"trait-mispricing-evidence-met",executionReady:!1,signingReady:!1,broadcastReady:!1,requiresLocalVault:!0,best:{tokenId:v.tokenId==null?null:String(v.tokenId),listingId:v.listingId||null,orderHash:v.orderHash||null,priceEth:mc(v.priceEth),discountBps:v.discountBps},evidence:x,prepareIntent:T}}async function Ah(e={},t={}){let n=await Cn({...e,includePnl:!0},t);return{provider:"nft-portfolio",operation:"pnl",readOnly:!0,generatedAt:n.generatedAt,addresses:n.addresses,coverage:n.coverage,unsupported:n.unsupported,valuation:n.valuation,pnl:n.pnl}}async function Ih(e={},t={}){let n=Array.isArray(e.items)?e.items:null,r=null;return n||(r=await Cn({...e,includePnl:!1},t),n=r.inventory.visibleItems),{...await yh({...e,items:n},Dt(t,"gallery")),inventorySummary:r?{visibleCount:r.inventory.visibleCount,flaggedCount:r.inventory.flaggedCount,coverage:r.coverage}:null}}var _h=10*1024*1024,Th=1e3;function gt(e){if(e==null||e==="")return null;let t=Number(e);return Number.isFinite(t)?t:null}function Nn(e){return Number.isFinite(e)?Number(e.toFixed(2)):null}function Ph(e,t){if(e==null||e==="")return null;let n=Date.parse(String(e));if(!Number.isFinite(n))throw new Error(`${t} must be an ISO 8601 timestamp`);return new Date(n).toISOString()}function Nh(e,t,n,r,o){if(e==null||e==="")return t;let i=Number(e);if(!Number.isInteger(i)||i<n||i>r)throw new Error(`${o} must be an integer from ${n} to ${r}`);return i}function yI(e={}){return["evm","solana","bitcoin","hyperliquid"].map(t=>`${t}:${String(e[t]||"").trim().toLowerCase()}`).join("|")}function Oh(e={}){return`portfolio_${fI("sha256").update(yI(e)).digest("hex").slice(0,20)}`}function Rh(e={}){if(e.historyFile)return Tn.resolve(String(e.historyFile));let t=e.env||process.env;if(t.ORACLE_PORTFOLIO_HISTORY_FILE)return Tn.resolve(String(t.ORACLE_PORTFOLIO_HISTORY_FILE));let n=String(t.HERMES_HOME||"").trim()||Tn.join(gI.homedir(),".hermes");return Tn.join(Tn.resolve(n),"state","oracle","portfolio-history.jsonl")}function bI(e){let t=gt(e?.valuation?.knownUsd);return t==null?null:Number(e?.valuation?.pricedItems||0)>0||e?.valuation?.complete===!0?Nn(t):null}function wI(e){if(!e||e.status==="unavailable"||e.status==="not-requested")return null;let t=gt(e?.valuation?.estimatedCurrentValueUsd);return t==null?null:Number(e?.valuation?.valuedItems||0)>0||e?.valuation?.complete===!0?Nn(t):null}function xI(e){let t=[];for(let n of e?.chains||[]){if(n.family==="hyperliquid"){let o=(n.spot?.balances||[]).reduce((a,c)=>{let l=gt(c.usdValue);return l==null?a:a+l},0),i=gt(n.perps?.accountValueUsd),s=Nn(o+(i??0));(s!==0||i!=null||(n.spot?.balances||[]).some(a=>gt(a.usdValue)!=null))&&t.push({family:"hyperliquid",chainId:null,name:n.name||"Hyperliquid",knownUsd:s});continue}let r=gt(n.native?.usdValue);r!=null&&t.push({family:n.family||"evm",chainId:n.chainId??null,name:n.name||n.native?.symbol||"Unknown",knownUsd:Nn(r)})}return t}function SI(e,t,n){let r=Array.isArray(t?.coverage)?t.coverage:[];return{balances:e?.coverage||null,nfts:{requested:n,ok:r.filter(o=>o.status==="ok").length,partial:r.filter(o=>o.status==="partial").length,unavailable:r.filter(o=>o.status==="unavailable").length,notConfigured:r.filter(o=>o.status==="not-configured").length,status:n?t?.status==="unavailable"?"unavailable":t?.valuation?.complete?"ok":"partial":"not-requested"}}}async function kI(e,t){let n=Rh(t),r=`${JSON.stringify(e)}
|
|
14
|
-
|
|
15
|
-
`))if(i.trim())try{let s=JSON.parse(i);s?.schemaVersion===1&&s?.portfolioId&&s?.recordedAt?r.push(s):o+=1}catch{o+=1}return{file:t,snapshots:r,corruptLines:o}}catch(n){if(n?.code==="ENOENT")return{file:t,snapshots:[],corruptLines:0};throw n}}function vI(e,t){if(e.allPortfolios===!0)return null;if(e.portfolioId)return String(e.portfolioId);let n=Bt(e,t.env||process.env);return Object.values(n).some(Boolean)?Oh(n):null}async function fc(e={},t={}){let n=Nh(e.limit,100,1,Th,"portfolio history limit"),r=String(e.order||"desc").toLowerCase();if(!new Set(["asc","desc"]).has(r))throw new Error("portfolio history order must be asc or desc");let o=Ph(e.since,"portfolio history since"),i=Ph(e.until,"portfolio history until"),s=vI(e,t),a=await EI(t),c=a.snapshots.filter(d=>!(s&&d.portfolioId!==s||o&&d.recordedAt<o||i&&d.recordedAt>i));c.sort((d,p)=>String(d.recordedAt).localeCompare(String(p.recordedAt)));let l=c.length;c=c.slice(-n),r==="desc"&&c.reverse();let u=c.filter(d=>gt(d?.valuation?.knownUsd)!=null);return{provider:"portfolio",operation:"history",readOnly:!0,historyFile:a.file,portfolioId:s,order:r,totalStored:a.snapshots.length,totalMatching:l,corruptLines:a.corruptLines,snapshots:c,stats:{returned:c.length,valuedSnapshots:u.length,unpricedSnapshots:c.length-u.length,firstRecordedAt:c.length?[...c].sort((d,p)=>String(d.recordedAt).localeCompare(String(p.recordedAt)))[0].recordedAt:null,lastRecordedAt:c.length?[...c].sort((d,p)=>String(d.recordedAt).localeCompare(String(p.recordedAt))).at(-1).recordedAt:null}}}function Ch(e){return`$${Number(e).toLocaleString("en-US",{minimumFractionDigits:2,maximumFractionDigits:2})}`}function Si(e){return String(e).replaceAll("&","&").replaceAll("<","<").replaceAll(">",">").replaceAll('"',""").replaceAll("'","'")}function AI(e,t){if(e.length<=t)return e;let n=[];for(let r=0;r<t;r+=1)n.push(e[Math.round(r*(e.length-1)/(t-1))]);return n}function II(e,t){let c=e.map(x=>x.value),l=Math.min(...c),u=Math.max(...c);if(l===u){let x=Math.max(1,Math.abs(l)*.05);l-=x,u+=x}else{let x=(u-l)*.1;l=Math.max(0,l-x),u+=x}let d=x=>e.length===1?1240/2:100+1040*x/(e.length-1),p=x=>570-(x-l)/(u-l)*470,m=e.map((x,w)=>`${w?"L":"M"}${d(w).toFixed(2)},${p(x.value).toFixed(2)}`).join(" "),f=Array.from({length:5},(x,w)=>{let v=w/4,T=100+v*470,I=u-v*(u-l);return`<line x1="100" y1="${T}" x2="1140" y2="${T}" stroke="#26313c" stroke-width="1"/><text x="86" y="${T+5}" text-anchor="end" fill="#8795a5" font-size="15">${Ch(I)}</text>`}).join(""),h=e.map((x,w)=>`<circle cx="${d(w)}" cy="${p(x.value)}" r="5" fill="#b8f0ff"><title>${Si(x.recordedAt)}: ${Ch(x.value)}</title></circle>`).join(""),g=Si(e[0].recordedAt.slice(0,10)),b=Si(e.at(-1).recordedAt.slice(0,10));return`<svg xmlns="http://www.w3.org/2000/svg" width="1200" height="675" viewBox="0 0 1200 675"><rect width="1200" height="675" fill="#0b1016"/><text x="60" y="50" fill="#f4f7fa" font-size="28" font-family="Inter,Arial,sans-serif" font-weight="700">Oracle Portfolio Value</text><text x="60" y="78" fill="#8795a5" font-size="15" font-family="Inter,Arial,sans-serif">Known priced value, not a complete total unless every snapshot says complete \xB7 ${Si(t||"configured portfolio")}</text>${f}<line x1="100" y1="570" x2="1140" y2="570" stroke="#526171" stroke-width="1"/><path d="${m}" fill="none" stroke="#b8f0ff" stroke-width="4" stroke-linecap="round" stroke-linejoin="round"/>${h}<text x="100" y="610" fill="#8795a5" font-size="15">${g}</text><text x="1140" y="610" text-anchor="end" fill="#8795a5" font-size="15">${b}</text><text x="60" y="650" fill="#526171" font-size="13">NFT values are provider estimates, not executable bids. Unavailable values are omitted, never plotted as zero.</text></svg>`}async function Lh(e={},t={}){if(e.allPortfolios===!0)throw new Error("portfolio value graph requires one portfolioId or configured public-address portfolio");let n=Nh(e.maxPoints,200,2,500,"portfolio graph maxPoints"),r=await fc({...e,order:"asc",limit:e.limit??Th},t);if(!r.portfolioId)throw new Error("portfolio value graph requires one portfolioId or configured public-address portfolio");let o=r.snapshots.map(d=>({recordedAt:d.recordedAt,value:gt(d?.valuation?.knownUsd),complete:d?.valuation?.complete===!0})).filter(d=>d.value!=null);if(!o.length)throw new Error("portfolio value graph requires at least one snapshot with known priced value");let i=AI(o,n),s=i[0].value,a=i.at(-1).value,c=Nn(a-s),l=s===0?null:Number(((a-s)/s*100).toFixed(2)),u=II(i,r.portfolioId);return{provider:"portfolio",operation:"valueGraph",readOnly:!0,portfolioId:r.portfolioId,mimeType:"image/svg+xml",dataBase64:Buffer.from(u).toString("base64"),byteLength:Buffer.byteLength(u),summary:{points:i.length,omittedUnavailablePoints:r.snapshots.length-o.length,startRecordedAt:i[0].recordedAt,endRecordedAt:i.at(-1).recordedAt,startKnownUsd:s,endKnownUsd:a,changeUsd:c,changePct:l,completeSnapshots:i.filter(d=>d.complete).length,label:"known priced value history; incomplete snapshots are not complete portfolio totals"}}}var PI=Object.freeze({"8da5cb5b":{name:"owner()",weight:"low",note:"contract has an owner"},f2fde38b:{name:"transferOwnership(address)",weight:"low",note:"ownership transferable"},"40c10f19":{name:"mint(address,uint256)",weight:"high",note:"owner can mint new supply"},a0712d68:{name:"mint(uint256)",weight:"high",note:"owner can mint new supply"},f9f92be4:{name:"blacklist(address)",weight:"high",note:"addresses can be blocked from selling"},e4997dc5:{name:"removeBlackList(address)",weight:"high",note:"blacklist machinery present"},"8456cb59":{name:"pause()",weight:"high",note:"transfers can be frozen"},"3f4ba83a":{name:"unpause()",weight:"high",note:"pausable transfers"},c0246668:{name:"setFee/excludeFromFee",weight:"high",note:"transfer fees can be changed"},"3659cfe6":{name:"upgradeTo(address)",weight:"high",note:"logic can be replaced entirely"},"4f1ef286":{name:"upgradeToAndCall(address,bytes)",weight:"high",note:"logic can be replaced entirely"}}),CI=Object.freeze([{label:"eip1967",slot:"0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc"},{label:"zeppelinos",slot:"0x7050c9e0f4ca769c69bd3a8ef740bc37934f8e2c036e5a723fd8ee048ed3f8c3"},{label:"eip1822",slot:"0xc5f16f0fcc639fa48a6947836d9850f504798523bf8c9a3a87d5876cf622bcf7"}]),TI=`0x${"0".repeat(64)}`;function NI(e){return!e||e==="0x"||e===TI}async function Ft(e={},t={}){let n=t.rpcCall||L,r=String(e.address||"").trim().toLowerCase(),o=Number(e.chainId);if(!/^0x[a-f0-9]{40}$/.test(r))return{status:"error",error:"address must be a 0x-prefixed EVM address",risk:"unknown-risk",findings:[],notes:[]};if(!Number.isInteger(o))return{status:"error",error:"chainId is required",risk:"unknown-risk",findings:[],notes:[]};let i;try{i=await n(o,"eth_getCode",[r,"latest"],t)}catch(f){return{address:r,chainId:o,status:"unavailable",error:f?.message||"eth_getCode failed",risk:"unknown-risk",findings:[],isProxy:!1,codeSize:0,notes:["could not read contract code; treat as unverified"]}}if(!i||i==="0x")return{address:r,chainId:o,status:"ok",risk:"high",findings:[{selector:"-",name:"no-code",weight:"high",note:"no contract deployed at this address"}],isProxy:!1,codeSize:0,notes:["nothing is deployed here \u2014 an approval or transfer to this address is unrecoverable"]};let s=[],a=[],c=i.slice(2).toLowerCase();for(let[f,h]of Object.entries(PI))c.includes(f)&&a.push({selector:`0x${f}`,...h});let l=!1,u=null,d=null;for(let{label:f,slot:h}of CI)try{let g=await n(o,"eth_getStorageAt",[r,h,"latest"],t);if(!NI(g)){l=!0,u=f,d=`0x${String(g).slice(-40)}`;break}}catch{s.push(`proxy slot (${f}) unreadable; proxy status uncertain`)}l&&(a.push({selector:u,name:"proxy",weight:"high",note:"implementation is upgradeable \u2014 current behaviour is not a guarantee"}),s.push(`bytecode scan covers the proxy (${u}), not the implementation ${d} it delegates to`));let m=a.filter(f=>f.weight==="high").length>0?"high":a.length>0?"elevated":"unknown-risk";return m==="unknown-risk"&&s.push("no owner-power selectors found; this is weak evidence, not a safety guarantee"),{address:r,chainId:o,status:"ok",risk:m,findings:a,isProxy:l,proxyStandard:u,implementation:d,codeSize:Math.floor(c.length/2),notes:s}}async function Mh(e={}){let t=Date.now();try{let n=await Ft({address:"0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2",chainId:1},e),r=n.status==="ok";return{provider:"contract-risk",status:r?"ok":"degraded",latencyMs:Date.now()-t,detail:r?"bytecode reads reachable":n.error||"probe returned no code"}}catch(n){return{provider:"contract-risk",status:"down",latencyMs:Date.now()-t,detail:n?.message||"probe failed"}}}var RI=/^0x[0-9a-fA-F]{40}$/,Uh=4663;function hc(e,t){let n=String(e||"").trim();if(!RI.test(n))throw new Error(`evm-token-sniper: ${t} must be a 0x EVM address`);return n}function $I(e,t){let n=String(e??"").trim();if(!/^\d+$/.test(n)||BigInt(n)<=0n)throw new Error(`evm-token-sniper: ${t} must be a positive raw integer amount`);return n}function LI(e,t){if(t){if(Number(t.chainId)!==e)throw new Error(`evm-token-sniper: supplied scanner chain ${t.chainId} does not match ${e}`);return t}rr();let n=$s(e);if(!n)throw new Error(`evm-token-sniper: unsupported EVM chainId ${e}`);return n}function MI({token:e,pools:t,structuralRisk:n,scannerRisk:r,sellability:o,quote:i,args:s,scanner:a}){let c=[];return e?.evidence!==B.LIVE&&c.push("token identity is not live-verified"),(!Array.isArray(t?.pools)||t.pools.length===0)&&c.push("no liquid pool was resolved"),n?.status!=="ok"&&c.push("structural contract risk is unavailable"),n?.risk==="high"&&c.push("structural contract risk is high"),r?.verdict!==M.PASS&&c.push(`scanner risk verdict is ${r?.verdict||"UNKNOWN"}`),a.supports?.("sellSimulation")?o?.verdict!==M.PASS&&c.push(`sellability verdict is ${o?.verdict||"UNKNOWN"}`):c.push("sell simulation is unavailable on this chain"),a.supports?.("quote")?i?.evidence!==B.LIVE&&c.push("no live quote was returned"):c.push("live quoting is unavailable on this chain"),a.supports?.("prepareUnsignedTx")||c.push("unsigned transaction preparation is unavailable on this chain"),s.tokenIn||c.push("tokenIn is required to prepare"),s.amountIn||c.push("amountIn is required to prepare"),s.recipient||c.push("recipient is required to prepare"),c}async function Bh(e={},t={}){let n=Number(e.chainId??Uh);if(!Number.isInteger(n)||n<=0)throw new Error("evm-token-sniper: chainId must be a positive integer");let r=hc(e.tokenAddress||e.address||e.token,"tokenAddress"),o=e.tokenIn?hc(e.tokenIn,"tokenIn"):null,i=e.recipient?hc(e.recipient,"recipient"):null,s=e.amountIn==null?null:$I(e.amountIn,"amountIn"),a=LI(n,t.scanner),c=t.scanContractRisk||Ft,[l,u,d]=await Promise.all([a.resolveToken(r),a.resolvePools(r),c({address:r,chainId:n},t.contractRiskOpts||t)]),p=await a.scoreRisk(r),m=null;a.supports?.("sellSimulation")&&s?m=await a.sellSimulation({token:r,amountIn:s,base:o||void 0}):a.supports?.("sellSimulation")&&(m=await a.sellSimulation({token:r,amountIn:"10000000000000000"}));let f=null;a.supports?.("quote")&&o&&s&&(f=await a.quote({tokenIn:o,tokenOut:r,amountIn:s}));let h={...e,tokenIn:o,amountIn:s,recipient:i},g=MI({token:l,pools:u,structuralRisk:d,scannerRisk:p,sellability:m,quote:f,args:h,scanner:a}),b=null;return e.prepare===!0&&g.length===0&&(b=await a.prepareUnsignedTx({tokenIn:o,tokenOut:r,amountIn:s,recipient:i,slippageBps:e.slippageBps??50,fee:f?.fee})),{provider:"evm-token-sniper",execution:"prepare-only",chainId:n,chain:{key:a.key,name:a.name,nativeCurrency:a.nativeCurrency},token:l,pools:u,topPool:u?.pools?.[0]||null,structuralRisk:d,scannerRisk:p,sellability:m,quote:f,blockedReasons:g,prepared:!!b,unsignedTx:b,signed:!1,broadcast:!1}}async function Dh(){rr();let e=Ls();return{ok:e.length>0,provider:"evm-token-sniper",defaultChainId:Uh,chainIds:e.map(t=>t.chainId),execution:"prepare-only",signed:!1,broadcast:!1}}var BI=/^(0|[1-9][0-9]*)$/,ki=class extends Error{constructor(t){super(`nft gas-war limit: ${t.reason}`),this.name="NftGasWarLimitError",this.verdict=t}};function qt(e,t,{required:n=!0,allowZero:r=!1}={}){if(e==null||e===""){if(n)throw new Error(`${t} required`);return null}let o;if(typeof e=="bigint")o=e;else if(typeof e=="number"){if(!Number.isSafeInteger(e))throw new Error(`${t} must be a safe integer`);o=BigInt(e)}else if(typeof e=="string"){let i=e.trim();if(i.startsWith("0x")||i.startsWith("0X"))o=BigInt(i);else{if(!BI.test(i))throw new Error(`${t} must be an integer wei string`);o=BigInt(i)}}else throw new Error(`${t} must be bigint, number, or integer string`);if(o<0n||!r&&o===0n)throw new Error(`${t} must be ${r?"non-negative":"positive"}`);return o}function DI(e){let t=Number(e);if(!Number.isSafeInteger(t)||t<=0)throw new Error("chainId must be a positive integer");return t}function FI(e={}){return e.maxFeePerGas!=null?qt(e.maxFeePerGas,"maxFeePerGas"):e.gasPrice!=null?qt(e.gasPrice,"gasPrice"):null}function Ei(e={}){try{let t=DI(e.chainId??e.tx?.chainId),n=e.tx||e,r=e.policy||e,o=r.grant?.maxGasWei??e.grant?.maxGasWei,i=qt(r.maxTotalGasWei??r.maxGasWei??o,"maxTotalGasWei"),s=qt(n.gasLimit??n.gas,"gasLimit"),a=FI(n);if(a==null)throw new Error("maxFeePerGas or gasPrice required");let c=qt(r.maxFeePerGasWei,"maxFeePerGasWei",{required:!1}),l=qt(r.maxPriorityFeePerGasWei,"maxPriorityFeePerGasWei",{required:!1}),u=n.maxPriorityFeePerGas==null?null:qt(n.maxPriorityFeePerGas,"maxPriorityFeePerGas"),d=s*a;return d>i?{ok:!1,status:"BLOCK",reason:`total gas ${d} exceeds cap ${i}`,chainId:t,totalGasWei:d.toString(),maxTotalGasWei:i.toString()}:c!=null&&a>c?{ok:!1,status:"BLOCK",reason:`unit fee ${a} exceeds cap ${c}`,chainId:t,unitFeeWei:a.toString(),maxFeePerGasWei:c.toString(),totalGasWei:d.toString(),maxTotalGasWei:i.toString()}:u!=null&&l!=null&&u>l?{ok:!1,status:"BLOCK",reason:`priority fee ${u} exceeds cap ${l}`,chainId:t,priorityFeeWei:u.toString(),maxPriorityFeePerGasWei:l.toString(),totalGasWei:d.toString(),maxTotalGasWei:i.toString()}:{ok:!0,status:"PASS",reason:"gas envelope within NFT mint gas-war caps",chainId:t,totalGasWei:d.toString(),maxTotalGasWei:i.toString(),unitFeeWei:a.toString(),maxFeePerGasWei:c?.toString()??null,priorityFeeWei:u?.toString()??null,maxPriorityFeePerGasWei:l?.toString()??null}}catch(t){return{ok:!1,status:"BLOCK",reason:String(t?.message||t)}}}function qI(e={}){let t=Ei(e);if(!t.ok)throw new ki(t);return t}var HI=5,gc=[50,75,90],Fh=Object.freeze({normal:{percentile:0,baseFeeMultiplier:2n,label:"normal"},fast:{percentile:1,baseFeeMultiplier:3n,label:"fast"},war:{percentile:2,baseFeeMultiplier:4n,label:"war"}});function Ht(e,t){if(e==null)return null;try{if(typeof e=="bigint")return e;if(typeof e=="number"){if(!Number.isFinite(e)||e<0)throw new Error("bad number");return BigInt(Math.floor(e))}let n=String(e).trim();return n.startsWith("0x"),BigInt(n)}catch{throw new Error(`${t} must be a non-negative integer (wei)`)}}function jI(e){let t=e.filter(n=>n!=null).sort((n,r)=>n<r?-1:n>r?1:0);return t.length?t[Math.floor(t.length/2)]:null}async function vi(e={},t={}){let n=t.rpcCall||L,r=Number(e.chainId);if(!Number.isInteger(r))return{status:"error",error:"chainId is required",viable:!1};let o=Fh[e.urgency||"fast"];if(!o)return{status:"error",viable:!1,error:`urgency must be one of: ${Object.keys(Fh).join(", ")}`};let i,s,a,c;try{i=Ht(e.maxFeePerGasWei,"maxFeePerGasWei"),s=Ht(e.maxPriorityFeePerGasWei,"maxPriorityFeePerGasWei"),a=Ht(e.gasLimit,"gasLimit"),c=Ht(e.maxTotalGasWei,"maxTotalGasWei")}catch(I){return{status:"error",viable:!1,error:I.message}}let l,u;try{[l,u]=await Promise.all([n(r,"eth_feeHistory",[`0x${HI.toString(16)}`,"pending",gc],t),n(r,"eth_getBlockByNumber",["pending",!1],t)])}catch(I){return{status:"unavailable",viable:!1,error:I?.message||"fee history unavailable",notes:["could not read live fee data; refusing to guess a competitive bid"]}}let d=Ht(u?.baseFeePerGas,"baseFeePerGas")??Ht(l?.baseFeePerGas?.[l.baseFeePerGas.length-1],"baseFeePerGas");if(d==null)return{status:"unavailable",viable:!1,error:"chain did not report a baseFeePerGas (pre-EIP-1559?)",notes:["this pricer is EIP-1559 only"]};let m=(Array.isArray(l?.reward)?l.reward:[]).map(I=>{try{return Ht(I?.[o.percentile],"reward")}catch{return null}}).filter(I=>I!=null&&I>0n),f=jI(m),h=[];f==null&&h.push("no non-zero tips observed in recent blocks; using a 1 gwei floor");let g=f??1000000000n,b=d*o.baseFeeMultiplier+g,k=[];s!=null&&g>s&&(k.push({field:"maxPriorityFeePerGas",wanted:g.toString(),capped:s.toString()}),g=s,b=d*o.baseFeeMultiplier+g),i!=null&&b>i&&(k.push({field:"maxFeePerGas",wanted:b.toString(),capped:i.toString()}),b=i,g>b&&(g=b));let x=a!=null?a*b:null;c!=null&&x!=null&&x>c&&k.push({field:"totalGas",wanted:x.toString(),capped:c.toString()});let w=f==null||g>=f,v=c==null||x==null||x<=c,T=w&&v;return w||h.push(`tip cap ${g} is below the observed ${gc[o.percentile]}th-percentile tip ${f}; this bid is unlikely to land`),v||h.push(`worst-case gas ${x} exceeds the ${c} total cap`),h.push("maxFeePerGas is a ceiling \u2014 unused headroom above basefee+tip is refunded, not spent"),{status:"ok",viable:T,chainId:r,urgency:o.label,baseFeePerGas:d.toString(),observedTip:f==null?null:f.toString(),percentile:gc[o.percentile],maxFeePerGas:b.toString(),maxPriorityFeePerGas:g.toString(),worstCaseGasWei:x==null?null:x.toString(),clamps:k,notes:h}}var zI="08c379a0",WI="4e487b71",GI=Object.freeze({1:"assertion failed",17:"arithmetic overflow or underflow",18:"division or modulo by zero",33:"invalid enum value",34:"invalid storage byte array encoding",49:"pop() on an empty array",50:"array index out of bounds",65:"out of memory",81:"call to an uninitialized function pointer"});function KI(e){if(!e||e==="0x")return{kind:"empty",reason:"reverted without a reason (often a require with no message, or out of gas)"};let t=String(e).slice(2),n=t.slice(0,8);if(n===zI)try{let r=parseInt(t.slice(72,136),16),o=t.slice(136,136+r*2);return{kind:"revert",reason:Buffer.from(o,"hex").toString("utf8"),selector:`0x${n}`}}catch{return{kind:"revert",reason:"Error(string) payload could not be decoded",selector:`0x${n}`}}if(n===WI){let r=parseInt(t.slice(8,72),16);return{kind:"panic",code:r,reason:GI[r]||`panic code 0x${r.toString(16)}`,selector:`0x${n}`}}return{kind:"custom",reason:`custom error ${`0x${n}`} (decoding needs the contract ABI)`,selector:`0x${n}`}}function YI(e){let t=[e?.data,e?.error?.data,e?.data?.data,e?.cause?.data,e?.body?.error?.data];for(let o of t){if(typeof o=="string"&&o.startsWith("0x")&&o.length>2)return o;if(typeof o?.data=="string"&&o.data.startsWith("0x")&&o.data.length>2)return o.data}let r=String(e?.message||"").match(/0x[0-9a-fA-F]{72,}/);return r?r[0]:null}function XI(e,t){if(t)return!0;let n=String(e?.message||"").toLowerCase();return!!/execution reverted|revert|invalid opcode|out of gas|stack underflow|insufficient funds for/.test(n)}function QI(e={}){let t={};return e.from&&(t.from=String(e.from).toLowerCase()),e.to&&(t.to=String(e.to).toLowerCase()),e.data&&e.data!=="0x"&&(t.data=e.data),e.value!=null&&String(e.value)!=="0"&&(t.value=`0x${BigInt(e.value).toString(16)}`),t}async function Tr(e={},t={}){let n=t.rpcCall||L,r=Number(e.chainId),o=e.tx||{};if(!Number.isInteger(r))return{status:"error",willRevert:null,error:"chainId is required"};if(!o.to||!/^0x[a-fA-F0-9]{40}$/.test(String(o.to)))return{status:"error",willRevert:null,error:"tx.to must be a valid address"};if(o.from&&!/^0x[a-fA-F0-9]{40}$/.test(String(o.from)))return{status:"error",willRevert:null,error:"tx.from must be a valid address"};let i=QI(o),s=[],a=null,c=!1,l=null;try{a=await n(r,"eth_call",[i,"pending"],t)}catch(f){let h=YI(f);if(!XI(f,!!h))return{status:"unavailable",willRevert:null,chainId:r,error:f?.message||"simulation unavailable",notes:["could not reach the node; this is NOT evidence the transaction would fail"]};c=!0,l=KI(h),h||(l.reason="execution reverted (node did not return a reason payload)",l.kind="revert-no-data")}if(c)return{status:"ok",willRevert:!0,chainId:r,revert:l,summary:`would REVERT: ${l.reason}`,notes:["simulated against current chain state; signing this now would burn gas and fail"]};let u=null,d=null;if(e.estimateGas!==!1)try{let f=await n(r,"eth_estimateGas",[i,"pending"],t);u=BigInt(f);let h=BigInt(Math.max(0,Math.floor(e.gasBufferPercent??20)));d=u+u*h/100n,s.push(`gasLimit includes a ${h}% buffer over the ${u} estimate`)}catch(f){s.push(`gas estimation failed: ${f?.message||"unknown"}`)}s.push("a pass reflects CURRENT chain state \u2014 it is not a guarantee the transaction lands, and in a contested mint the state changes between blocks");let p=`0x${"0".repeat(64)}`,m=a===p;return m&&s.push("call did not revert but returned boolean false \u2014 some ERC-20s (e.g. USDC) signal failure this way instead of reverting"),{status:"ok",willRevert:!1,returnsFalse:m,chainId:r,returnData:a,gasEstimate:u==null?null:u.toString(),gasLimit:d==null?null:d.toString(),summary:m?"executes but returns FALSE \u2014 the contract is rejecting this operation":u?`would succeed, ~${u} gas`:"would succeed",notes:s}}async function qh(e={}){let t=Date.now();try{let n=await Tr({chainId:1,tx:{to:"0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2",data:`0x70a08231${"0".repeat(64)}`},estimateGas:!1},e),r=n.status==="ok";return{provider:"evm-simulate",status:r?"ok":"degraded",latencyMs:Date.now()-t,detail:r?"eth_call reachable":n.error||"probe failed"}}catch(n){return{provider:"evm-simulate",status:"down",latencyMs:Date.now()-t,detail:n?.message||"probe failed"}}}var ZI=Object.freeze([{selector:"a0712d68",signature:"mint(uint256)",args:["quantity"]},{selector:"40c10f19",signature:"mint(address,uint256)",args:["to","quantity"]},{selector:"1249c58b",signature:"mint()",args:[]},{selector:"2db11544",signature:"publicMint(uint256)",args:["quantity"]},{selector:"efef39a1",signature:"purchase(uint256)",args:["quantity"]},{selector:"a6f2ae3a",signature:"buy()",args:[]}]);function e_(e){let t=BigInt(e).toString(16);if(t.length>64)throw new Error("value too large for a 32-byte word");return t.padStart(64,"0")}function t_(e){let t=String(e).toLowerCase().replace(/^0x/,"");if(!/^[a-f0-9]{40}$/.test(t))throw new Error(`invalid address: ${e}`);return t.padStart(64,"0")}function Hh(e,{minter:t,quantity:n}){let r=`0x${e.selector}`;for(let o of e.args)if(o==="to")r+=t_(t);else if(o==="quantity")r+=e_(n);else throw new Error(`unsupported mint argument: ${o}`);return r}async function Ai(e={},t={}){let n=t.rpcCall||L,r=String(e.address||"").trim().toLowerCase(),o=Number(e.chainId);if(!/^0x[a-f0-9]{40}$/.test(r))return{status:"error",error:"address must be a 0x-prefixed EVM address",found:[]};if(!Number.isInteger(o))return{status:"error",error:"chainId is required",found:[]};let i;try{i=await n(o,"eth_getCode",[r,"latest"],t)}catch(c){return{status:"unavailable",error:c?.message||"eth_getCode failed",found:[]}}if(!i||i==="0x")return{status:"ok",found:[],notes:["no contract deployed at this address"]};let s=i.slice(2).toLowerCase(),a=ZI.filter(c=>s.includes(c.selector));return{status:"ok",address:r,chainId:o,found:a,notes:a.length?[]:["no known public mint selector found; this contract may use a custom or allowlist-only entrypoint"]}}async function jh(e={}){let t=Date.now();try{let n=await Ai({address:"0x8a90cab2b38dba80c64b7734e58ee1db38b8992e",chainId:1},e),r=n.status==="ok";return{provider:"nft-mint",status:r?"ok":"degraded",latencyMs:Date.now()-t,detail:r?"bytecode reads reachable":n.error||"probe failed"}}catch(n){return{provider:"nft-mint",status:"down",latencyMs:Date.now()-t,detail:n?.message||"probe failed"}}}async function yc(e={},t={}){let n=String(e.contract||e.address||"").trim().toLowerCase(),r=Number(e.chainId),o=String(e.minter||e.from||"").trim().toLowerCase(),i=e.quantity==null?1:Number(e.quantity);if(!/^0x[a-f0-9]{40}$/.test(n))return{status:"error",error:"contract must be a 0x-prefixed EVM address"};if(!/^0x[a-f0-9]{40}$/.test(o))return{status:"error",error:"minter address is required"};if(!Number.isInteger(i)||i<1)return{status:"error",error:"quantity must be a positive integer"};if(!Number.isInteger(r))return{status:"error",error:"chainId is required"};let s=await Ai({address:n,chainId:r},t);if(s.status!=="ok")return{status:s.status,error:s.error};if(!s.found.length)return{status:"unsupported",error:"no known public mint function found in this contract's bytecode",notes:s.notes};let a=e.signature?s.found.find(b=>b.signature===e.signature):s.found[0];if(!a)return{status:"error",error:`requested signature ${e.signature} not present in this contract`,available:s.found.map(b=>b.signature)};let c=s.found.length>1&&!e.signature,l=await Ft({address:n,chainId:r},t),u=null;if(e.simulate!==!1&&(u=await Tr({chainId:r,tx:{from:o,to:n,data:Hh(a,{minter:o,quantity:i}),value:e.valueWei},gasBufferPercent:e.gasBufferPercent},t),u.willRevert===!0&&e.ignoreRevert!==!0))return{status:"would-revert",error:`mint would revert: ${u.revert.reason}`,simulation:u,mintFunction:a.signature,notes:["signing this now would burn gas and fail; pass ignoreRevert to prepare anyway (e.g. a mint that has not opened yet)"]};let d=e.gasLimit??(u?.gasLimit?Number(u.gasLimit):null),p=await vi({chainId:r,urgency:e.urgency||"war",gasLimit:d,maxFeePerGasWei:e.maxFeePerGasWei,maxPriorityFeePerGasWei:e.maxPriorityFeePerGasWei,maxTotalGasWei:e.maxTotalGasWei},t);if(p.status!=="ok")return{status:"unavailable",error:p.error,notes:p.notes};let m;try{m=Hh(a,{minter:o,quantity:i})}catch(b){return{status:"error",error:b.message}}let f={chainId:r,from:o,to:n,data:m,value:e.valueWei==null?"0":String(e.valueWei),gasLimit:d==null?null:String(d),maxFeePerGas:p.maxFeePerGas,maxPriorityFeePerGas:p.maxPriorityFeePerGas},h={ok:!0,skipped:!0,reason:"no gasLimit or cap supplied"};if(d!=null&&(e.maxTotalGasWei!=null||e.grant!=null)&&(h=Ei({chainId:r,tx:{gasLimit:d,maxFeePerGas:p.maxFeePerGas,maxPriorityFeePerGas:p.maxPriorityFeePerGas},policy:{maxTotalGasWei:e.maxTotalGasWei,maxFeePerGasWei:e.maxFeePerGasWei,maxPriorityFeePerGasWei:e.maxPriorityFeePerGasWei,grant:e.grant}}),!h.ok))return{status:"refused",error:`gas-war cap exceeded: ${h.reason||h.error}`,gas:p,capCheck:h};let g=[];return c&&g.push(`contract exposes ${s.found.length} mint entrypoints (${s.found.map(b=>b.signature).join(", ")}); defaulted to ${a.signature} \u2014 pass signature to choose`),l.risk==="high"&&g.push(`contract risk HIGH: ${l.findings.map(b=>b.name).join(", ")}`),p.viable||g.push(p.notes[0]),h.skipped&&g.push("gas-war caps NOT enforced: supply gasLimit plus maxTotalGasWei or a grant"),{status:"ok",execution:"prepare-only",signed:!1,tx:f,mintFunction:a.signature,alternatives:s.found.map(b=>b.signature),quantity:i,gas:p,simulation:u,contractRisk:{risk:l.risk,findings:l.findings,isProxy:l.isProxy},capCheck:h,warnings:g}}var r_=1440*60*1e3;function o_(e={},{nowMs:t=Date.now()}={}){let n=[];if(!e||typeof e!="object")return{ok:!1,problems:["grant is required for execute mode"]};let r=String(e.contract||"").toLowerCase();/^0x[a-f0-9]{40}$/.test(r)||n.push("grant.contract must be an exact address"),Number.isInteger(Number(e.chainId))||n.push("grant.chainId is required"),e.maxTotalGasWei==null&&n.push("grant.maxTotalGasWei is required"),e.maxValueWei==null&&n.push("grant.maxValueWei is required (mint price ceiling)");let o=Number(e.expiresAt);return Number.isFinite(o)?o<=t?n.push("grant has expired"):o-t>r_&&n.push("grant TTL exceeds 24h"):n.push("grant.expiresAt is required"),{ok:n.length===0,problems:n,contract:r,chainId:Number(e.chainId)}}function Vh(e={},t={}){let r=e.actionMode==="execute"?"execute":e.actionMode||"alert_only",o=String(e.contract||"").trim().toLowerCase(),i=Number(e.chainId),s=[];if(!/^0x[a-f0-9]{40}$/.test(o))return{status:"error",error:"contract must be a 0x-prefixed EVM address"};if(!Number.isInteger(i))return{status:"error",error:"chainId is required"};if(r!=="alert_only"&&r!=="execute")return{status:"ok",actionMode:"alert_only",requestedMode:r,downgraded:!0,contract:o,chainId:i,quantity:e.quantity==null?1:Number(e.quantity),urgency:e.urgency||"war",grant:null,notes:[`unrecognized actionMode ${JSON.stringify(r)} \u2014 defaulted to alert_only; only the exact string "execute" arms a trigger`]};let a=r;if(r==="execute")if(!cn(t.env||process.env))a="alert_only",s.push("DOWNGRADED to alert_only: autonomous trading is off \u2014 set ORACLE_AUTONOMOUS_TRADING=1 to let a trigger fire unattended");else{let c=o_(e.grant,{nowMs:t.nowMs});c.ok?(c.contract!==o||c.chainId!==i)&&(a="alert_only",s.push("DOWNGRADED to alert_only: grant does not match this contract/chain \u2014 a grant authorizes one exact target")):(a="alert_only",s.push(`DOWNGRADED to alert_only: ${c.problems.join("; ")}`))}return a==="alert_only"?s.push("alert_only: Oracle will notify and prepare an artifact; you sign it"):s.push("ARMED: this trigger will submit a prepared, capped mint automatically when the mint opens"),{status:"ok",actionMode:a,requestedMode:r,downgraded:a!==r,contract:o,chainId:i,quantity:e.quantity==null?1:Number(e.quantity),urgency:e.urgency||"war",grant:a==="execute"?e.grant:null,notes:s}}async function zh(e={},t={}){let n=t.rpcCall||L,r=String(e.contract||"").trim().toLowerCase(),o=Number(e.chainId);if(!/^0x[a-f0-9]{40}$/.test(r)||!Number.isInteger(o))return{status:"error",open:!1,error:"contract and chainId are required"};let i=[{selector:"0xeb8d2444",name:"saleIsActive()",openWhen:!0},{selector:"0x25fd90f3",name:"mintActive()",openWhen:!0},{selector:"0x68428a1b",name:"saleActive()",openWhen:!0},{selector:"0x22f3e2d4",name:"isActive()",openWhen:!0},{selector:"0x5c975abb",name:"paused()",openWhen:!1}];for(let s of i)try{let a=await n(o,"eth_call",[{to:r,data:s.selector},"latest"],t);if(a&&a!=="0x"){let c=BigInt(a)===1n;return{status:"ok",open:s.openWhen?c:!c,evidence:s.name,raw:a}}}catch{}return{status:"unknown",open:!1,notes:["no readable sale-state flag; cannot confirm the mint is open \u2014 will not fire on a guess"]}}N();me();W();var s_="https://api.paraswap.io",bc=(e={})=>(e.baseUrl||process.env.PARASWAP_API_URL||s_).replace(/\/$/,"");function On(e,t){let n=String(e||"");if(!/^0x[0-9a-fA-F]{40}$/.test(n))throw new Error(`${t} must be a 20-byte token address`);return n.toLowerCase()}async function wc(e={},t={}){let n=Number(e.chainId||1);return y(`${bc(t)}/tokens/${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function yt(e={},t={}){let n=Number(e.chainId||e.network||1);if(e.amount==null)throw new Error("amount required");let r=new URLSearchParams({srcToken:On(e.srcToken,"srcToken"),destToken:On(e.destToken,"destToken"),amount:String(e.amount),srcDecimals:String(Number(e.srcDecimals)),destDecimals:String(Number(e.destDecimals)),side:String(e.side||"SELL").toUpperCase(),network:String(n),version:String(e.version||"6.2")});e.includeDEXS&&r.set("includeDEXS",String(e.includeDEXS)),e.excludeDEXS&&r.set("excludeDEXS",String(e.excludeDEXS));let o=await Ro({wallet:e.userAddress||e.fromAddress,env:t.env,action:e.feeAction||"swap",holderCheck:t.holderCheck});for(let[a,c]of Object.entries(np(o)))r.set(a,c);let i=await y(`${bc(t)}/prices?${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4}),s=i?.priceRoute?.destAmount;return s?{...V(i,{chainId:n,venue:i?.priceRoute?.contractAddress||"paraswap-quote",amountOut:s,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,quoteAgeMs:0,requestedCapBps:e.maxSlippageBps??e.slippageBps}),executionReady:!1,executionBlocker:"call prepare to bind the price route to a validated transaction",oracleFee:o}:{...i,executionReady:!1,oracleFee:o}}async function Wh(e={},t={}){if(String(e.side||"SELL").toUpperCase()!=="SELL")throw new Error("paraswap: agentic prepare currently supports exact-input SELL only");let n=Number(e.chainId||e.network||1),r=On(e.userAddress,"userAddress"),o=await yt(e,t),i=o?.priceRoute,s=String(i?.contractAddress||"").toLowerCase();if(!s)throw new Error("paraswap: price route missing contractAddress");let a={srcToken:On(e.srcToken,"srcToken"),destToken:On(e.destToken,"destToken"),srcAmount:String(i.srcAmount||e.amount),destAmount:String(o.amountOutMinimum),priceRoute:i,userAddress:r,ignoreChecks:!1,ignoreGasEstimate:!1};e.receiver&&(a.receiver=On(e.receiver,"receiver"));let c=await y(`${bc(t)}/transactions/${n}`,{method:"POST",body:a,fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??25e3});if(Number(c.chainId??n)!==n)throw new Error("paraswap: transaction chain mismatch");if(String(c.to||"").toLowerCase()!==s)throw new Error("paraswap: transaction target mismatch");if(c.from&&String(c.from).toLowerCase()!==r)throw new Error("paraswap: transaction sender mismatch");return O({provider:"paraswap",calldataReady:!0,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:n,quote:o,autoSlippage:o.autoSlippage,requiresApproval:a.srcToken!=="0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee"?{token:a.srcToken,spender:i.tokenTransferProxy||s,amount:a.srcAmount}:null,transaction:{chainId:n,from:c.from||r,to:c.to,data:c.data,value:c.value??"0x0",...c.gas!=null?{gasLimit:c.gas}:{},slippageGuard:J(o.autoSlippage,{chainId:n,venue:c.to,data:c.data})}},{provider:"paraswap",kind:"paraswap-tx"})}async function Gh(e={}){let t=await wc({chainId:1},e),n=Array.isArray(t?.tokens)?t.tokens.length:Object.keys(t?.tokens||{}).length;return{ok:n>0,tokenSample:n}}import{createHash as c_}from"node:crypto";import{getAddress as Zh,isAddress as xc}from"ethers";var Kh="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",l_=Object.freeze(["lifi","paraswap","0x","cow","uniswap-v3"]),u_=Object.freeze(["lifi"]),Yh=/^0x[0-9a-fA-F]{64}$/,d_=/^\d+$/;function Q(e,t="invalid"){throw new Error(`rfq: ${e} ${t}`)}function Xh(e,t){let n=Number(e);return(!Number.isSafeInteger(n)||n<=0)&&Q(t,"must be a positive chainId"),n}function Ii(e,t){let n=String(e??"").trim();return(!d_.test(n)||BigInt(n)<=0n)&&Q(t,"must be a positive integer string"),n}function p_(e,t){return e==null||e===""?null:Ii(e,t)}function Qh(e,t){let n=String(e??"").trim();return n.toLowerCase()===Kh.toLowerCase()?Kh:(xc(n)||Q(t,"must be an EVM address or native token sentinel"),Zh(n))}function e0(e,t){let n=String(e??"").trim();return xc(n)||Q(t,"must be an EVM address"),Zh(n)}function m_(e,t){return e==null||e===""?null:e0(e,t)}function Jh(e,t,n){return e===void 0?[...n]:(Array.isArray(e)||Q(t,"must be an array"),e.map(r=>String(r).trim()).filter(Boolean))}function f_(e,{nowMs:t,maxDeadlineMs:n},r){let o=Number(e);return Number.isFinite(o)||Q(r,"must be a finite millisecond timestamp"),o<=t&&Q(r,"expired"),o>t+n&&Q(r,"exceeds maxDeadlineMs"),Math.floor(o)}function Rn(e){if(Array.isArray(e))return e.map(Rn);if(e&&typeof e=="object"){let t={};for(let n of Object.keys(e).sort())e[n]!==void 0&&(t[n]=Rn(e[n]));return t}return e}function h_(e){return JSON.stringify(Rn(e))}function _i(e){return`0x${c_("sha256").update(h_(e)).digest("hex")}`}function t0(e,t){let n={...e};for(let r of t)delete n[r];return n}function n0(e){return _i(t0(e,["intentHash"]))}function r0(e){return _i(t0(e,["firmQuoteHash"]))}function Pi(e={},t={}){let n=Number(t.nowMs??Date.now()),r=Number(t.maxDeadlineMs??1800*1e3);(!Number.isFinite(n)||!Number.isFinite(r)||r<=0)&&Q("time","is invalid");let o=Xh(e.fromChainId??e.fromChain,"fromChainId"),i=Xh(e.toChainId??e.toChain,"toChainId"),a=o===i?l_:u_,c={kind:"rfq-intent",version:1,fromChainId:o,toChainId:i,sellToken:Qh(e.sellToken??e.tokenIn??e.fromToken,"sellToken"),buyToken:Qh(e.buyToken??e.tokenOut??e.toToken,"buyToken"),sellAmount:Ii(e.sellAmount??e.amountIn??e.fromAmount,"sellAmount"),receiver:e0(e.receiver??e.recipient??e.to,"receiver"),deadlineMs:f_(e.deadlineMs??e.deadline??e.expiresAtMs,{nowMs:n,maxDeadlineMs:r},"deadline"),minBuyAmount:p_(e.minBuyAmount??e.minOut??e.amountOutMin,"minBuyAmount"),allowedSources:Jh(e.allowedSources,"allowedSources",a),allowedRouters:Jh(e.allowedRouters,"allowedRouters",[]),slippageBps:Number.isFinite(Number(e.slippageBps))?Number(e.slippageBps):null,partialFill:e.partialFill===!0,metadata:e.metadata&&typeof e.metadata=="object"&&!Array.isArray(e.metadata)?Rn(e.metadata):{}};return c.slippageBps!=null&&(!Number.isInteger(c.slippageBps)||c.slippageBps<0||c.slippageBps>1e4)&&Q("slippageBps","must be 0 to 10000"),c.intentId=e.intentId?String(e.intentId):_i({seed:"rfq-intent",intent:c}).slice(0,34),c.intentHash=n0(c),Object.freeze(c)}function g_(e){return(!e||typeof e!="object"||Array.isArray(e))&&Q("artifact","required"),e.typedDataHash!=null&&!Yh.test(String(e.typedDataHash))&&Q("artifact.typedDataHash","must be bytes32"),e.calldataHash!=null&&!Yh.test(String(e.calldataHash))&&Q("artifact.calldataHash","must be bytes32"),e.to!=null&&!xc(String(e.to))&&Q("artifact.to","must be an address"),e.data!=null&&!/^0x(?:[0-9a-fA-F]{2})*$/.test(String(e.data))&&Q("artifact.data","must be hex"),Rn(e)}function Sc(e,t={},n={}){(!e||e.kind!=="rfq-intent")&&Q("intent","required");let r=Number(n.nowMs??Date.now()),o=Number(t.expiryMs??t.expiresAtMs??t.validUntilMs);Number.isFinite(o)||Q("quote expiry","required"),o<=r&&Q("quote","expired"),o>e.deadlineMs&&Q("quote expiry","exceeds intent deadline");let i=String(t.source??t.provider??"").trim();i||Q("source","required"),e.allowedSources.includes(i)||Q("source","not allowed by intent");let s=Ii(t.amountOut??t.buyAmount,"amountOut"),a=Ii(t.minBuyAmount??t.minOut??s,"minBuyAmount");BigInt(a)>BigInt(s)&&Q("minBuyAmount","exceeds amountOut");let c=g_(t.artifact??t.executableArtifact??t.transaction??t.typedData),l=Number(t.quotedAtMs??t.timestampMs??n.nowMs??Date.now());Number.isFinite(l)||Q("quotedAtMs","must be finite");let u=m_(t.router??t.settlementRouter??c.to,"router"),d={kind:"rfq-firm-quote",provider:"rfq",surface:"rfq",version:1,quoteId:String(t.quoteId??t.id??"").trim(),source:i,intentHash:e.intentHash,fromChainId:e.fromChainId,toChainId:e.toChainId,sellToken:e.sellToken,buyToken:e.buyToken,sellAmount:e.sellAmount,receiver:e.receiver,router:u,amountOut:s,minBuyAmount:a,quotedAtMs:Math.floor(l),expiryMs:Math.floor(o),artifact:c,maker:t.maker?String(t.maker):null,metadata:t.metadata&&typeof t.metadata=="object"&&!Array.isArray(t.metadata)?Rn(t.metadata):{}};return d.quoteId||(d.quoteId=_i({seed:"rfq-quote",out:d}).slice(0,34)),d.firmQuoteHash=r0(d),Object.freeze(d)}function Nr(e,t){return Array.isArray(e?.allowedSources)&&e.allowedSources.includes(t)}function o0(e,t){return String(e?.[t]??"").trim()}function Or(e,t){return Object.freeze({source:e,run:t})}function i0(e,t={}){if(!e||e.kind!=="rfq-intent")throw new Error("rfq: intent required");let n=t.env??process.env,r=t.providers??{},o=t.supportedUniV3Chains??ce,i=Number(e.fromChainId)===Number(e.toChainId),s=[];return Nr(e,"lifi")&&s.push(Or("lifi",async()=>{let c=await(r.lifiQuote??lt)({fromChain:e.fromChainId,toChain:e.toChainId,fromToken:e.sellToken,toToken:e.buyToken,fromAmount:e.sellAmount,fromAddress:e.receiver},t),l=c?.estimate??c?.[0]?.estimate??c;return{quoteId:c?.id??c?.routeId??null,amountOut:l?.toAmount??c?.toAmount,minBuyAmount:l?.toAmountMin??c?.toAmountMin??l?.toAmount??c?.toAmount,expiryMs:Date.now()+Number(t.defaultQuoteTtlMs??2e4),artifact:{type:"lifi-route",calldataHash:c?.transactionRequest?.data?await y_(t,c.transactionRequest.data):void 0,route:c},metadata:{tool:c?.tool??c?.toolDetails?.name??null}}})),i&&(Nr(e,"paraswap")&&s.push(Or("paraswap",async()=>{let c=await(r.paraswapPrice??yt)({chainId:e.fromChainId,srcToken:e.sellToken,destToken:e.buyToken,amount:e.sellAmount,srcDecimals:t.decimalsIn,destDecimals:t.decimalsOut},t),l=c?.priceRoute??c;return{quoteId:l?.id??null,amountOut:l?.destAmount,minBuyAmount:c?.amountOutMinimum??l?.destAmount,expiryMs:Date.now()+Number(t.defaultQuoteTtlMs??2e4),artifact:{type:"paraswap-price-route",route:l},metadata:{contractAddress:l?.contractAddress??null}}})),Nr(e,"0x")&&(o0(n,"ZEROX_API_KEY")||o0(n,"0X_API_KEY")||r.zeroxQuote)&&s.push(Or("0x",async()=>{let c=await(r.zeroxQuote??Rt)({chainId:e.fromChainId,sellToken:e.sellToken,buyToken:e.buyToken,sellAmount:e.sellAmount,taker:e.receiver},t);return{quoteId:c?.id??null,amountOut:c?.buyAmount??c?.grossBuyAmount,minBuyAmount:c?.minBuyAmount??c?.buyAmount,expiryMs:Date.now()+Number(t.defaultQuoteTtlMs??2e4),artifact:{type:"0x-transaction",to:c?.transaction?.to,data:c?.transaction?.data,value:c?.transaction?.value??"0"},metadata:{route:c?.route??null}}})),Nr(e,"cow")&&s.push(Or("cow",async()=>{let c=await(r.cowQuote??dt)({chainId:e.fromChainId,sellToken:e.sellToken,buyToken:e.buyToken,sellAmountBeforeFee:e.sellAmount,from:e.receiver,signingScheme:"eip712"},t),l=c?.quote??c;return{quoteId:c?.id??null,amountOut:l?.buyAmount,minBuyAmount:l?.buyAmount,expiryMs:Math.min(Number(l?.validTo??0)*1e3||Date.now()+Number(t.defaultQuoteTtlMs??2e4),e.deadlineMs),artifact:{type:"cow-order",order:l},metadata:{solver:!0}}})),Nr(e,"uniswap-v3")&&o[Number(e.fromChainId)]&&s.push(Or("uniswap-v3",async()=>{let c=await(r.uniV3QuoteExactIn??it)({chainId:e.fromChainId,tokenIn:e.sellToken,tokenOut:e.buyToken,amountIn:e.sellAmount},t);return{quoteId:c?.id??null,amountOut:c?.amountOut,minBuyAmount:c?.minOut??c?.amountOutMinimum??c?.amountOut,expiryMs:Date.now()+Number(t.defaultQuoteTtlMs??2e4),artifact:{type:"uniswap-v3-quote",quoter:c?.quoter,fee:c?.fee},metadata:{onchain:!0}}}))),s}async function y_(e,t){return`0x${(await import("node:crypto")).createHash("sha256").update(String(t)).digest("hex")}`}async function b_(e,t){return Promise.race([Promise.resolve().then(e.run),new Promise((n,r)=>setTimeout(()=>r(new Error(`${e.source}: timeout`)),t))])}async function s0(e,t,n={}){let r=Number(n.timeoutMs??12e3),o=await Promise.allSettled(t.map(a=>b_(a,r))),i=[],s=[];for(let a=0;a<o.length;a++){let c=t[a],l=o[a];if(l.status==="rejected"){s.push({source:c.source,error:String(l.reason?.message||l.reason)});continue}try{i.push(Sc(e,{...l.value,source:c.source},n))}catch(u){s.push({source:c.source,error:String(u?.message||u)})}}return{quotes:i,failed:s}}function a0(e=[],t={}){let n=Number(t.nowMs??Date.now()),r=e.filter(s=>Number(s.expiryMs??0)>n);r.sort((s,a)=>{let c=BigInt(a.minBuyAmount??0)-BigInt(s.minBuyAmount??0);if(c!==0n)return c>0n?1:-1;let l=BigInt(a.amountOut??0)-BigInt(s.amountOut??0);return l>0n?1:l<0n?-1:0});let o=r.map(s=>({...s,scoreBasis:"minBuyAmount"})),i=[];return o.length||i.push("no RFQ source returned a usable firm quote"),e.length!==o.length&&i.push("expired RFQ quotes were excluded from ranking"),{best:o[0]??null,quotes:o,failed:[],warnings:i}}async function kc(e,t={}){let n=i0(e,t),{quotes:r,failed:o}=await s0(e,n,t),i=a0(r,t);return{kind:"rfq-result",intent:e,best:i.best,quotes:i.quotes,failed:o,warnings:[...i.warnings],sourcesTried:n.length,sourcesAnswered:r.length}}function c0(e={},t={}){return Pi(e,t)}async function l0(e={},t={}){let n=e.intent?.kind==="rfq-intent"?e.intent:Pi(e,t);return kc(n,t)}async function u0(){return{ok:!0,provider:"rfq",mode:"intent-rfq",execution:"prepare"}}N();var x_="https://app.across.to";function Ec(e={}){return(e.baseUrl||process.env.ACROSS_API_URL||x_).replace(/\/$/,"")}async function d0(e={}){try{let t=await y(`${Ec(e)}/api/pools?token=0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??1e4});return{ok:t&&typeof t.totalPoolSize=="string",provider:"across-bridge",l1Token:t.l1Token}}catch(t){return{ok:!1,provider:"across-bridge",error:String(t.message||t).slice(0,120)}}}async function p0(e={},t={}){let n=String(e.l1Token||"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2");return y(`${Ec(t)}/api/pools?token=${encodeURIComponent(n)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function m0(e={},t={}){let n=new URLSearchParams;return e.originChainId&&n.set("originChainId",String(e.originChainId)),e.destinationChainId&&n.set("destinationChainId",String(e.destinationChainId)),e.token&&n.set("token",String(e.token)),e.amount&&n.set("amount",String(e.amount)),y(`${Ec(t)}/api/suggested-fees?${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}N();var k_="https://api.beefy.finance";function vc(e={}){return(e.baseUrl||process.env.BEEFY_API_URL||k_).replace(/\/$/,"")}async function f0(e={}){try{let t=await y(`${vc(e)}/apy`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??15e3}),n=Object.keys(t||{});return{ok:n.length>0,provider:"beefy-yields",vaultCount:n.length}}catch(t){return{ok:!1,provider:"beefy-yields",error:String(t.message||t).slice(0,120)}}}async function h0(e={},t={}){let n=await y(`${vc(t)}/apy`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4});if(e.chain){let r=String(e.chain).toLowerCase(),o={};for(let[i,s]of Object.entries(n))String(i).toLowerCase().startsWith(r)&&(o[i]=s);return o}return n}async function g0(e={}){return y(`${vc(e)}/apy/breakdown`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??25e3})}N();var v_="https://public-api.birdeye.so";function y0(e={}){return(e.baseUrl||process.env.BIRDEYE_API_URL||v_).replace(/\/$/,"")}async function b0(e={}){try{let t=await y(`${y0(e)}/public/tokenlist?sort_by=v24hUSD&sort_type=desc&offset=0&limit=1`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??1e4});return{ok:Array.isArray(t?.data)&&t.data.length>0,provider:"birdeye-tokens"}}catch(t){return{ok:!1,provider:"birdeye-tokens",error:String(t.message||t).slice(0,120)}}}async function w0(e={},t={}){let n=String(e.sortBy||"v24hUSD"),r=String(e.sortType||"desc"),o=Math.max(0,Number(e.offset||0)),i=Math.min(50,Math.max(1,Number(e.limit||20)));return y(`${y0(t)}/public/tokenlist?sort_by=${encodeURIComponent(n)}&sort_type=${encodeURIComponent(r)}&offset=${o}&limit=${i}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}N();var I_="https://api.celenium.io";function Ac(e={}){return(e.baseUrl||process.env.CELENIUM_API_URL||I_).replace(/\/$/,"")}async function x0(e={}){try{let t=await y(`${Ac(e)}/v1/stats`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??1e4});return{ok:t&&t.blobs_count!=null,provider:"celestia-da"}}catch(t){return{ok:!1,provider:"celestia-da",error:String(t.message||t).slice(0,120)}}}async function S0(e={}){return y(`${Ac(e)}/v1/stats`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??15e3})}async function k0(e={},t={}){let n=Number(e.height);if(n&&(!Number.isFinite(n)||n<1))throw new Error("celestia-da: height must be positive");let r=n?`/v1/block/${n}`:"/v1/block";return y(`${Ac(t)}${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}N();var P_="https://api.mainnet-beta.solana.com";function C_(e={}){return(e.rpcUrl||process.env.SOLANA_RPC_URL||P_).replace(/\/$/,"")}async function Ci(e,t,n={}){let r=C_(n),o=JSON.stringify({jsonrpc:"2.0",id:1,method:e,params:t}),a=await(await(n.fetchImpl||fetch)(r,{method:"POST",headers:{"content-type":"application/json",accept:"application/json"},body:o,signal:AbortSignal.timeout(n.timeoutMs??2e4)})).json();if(a.error)throw new Error(`das-assets ${e}: ${a.error.message||JSON.stringify(a.error)}`);return a.result}async function E0(e={}){try{let t=await Ci("getAsset",{id:"12He3nqt2XLbpuWGdwsJBNcomm7r3M8Kh6Dj9w7ZAK9"},e);return{ok:t&&typeof t=="object",provider:"das-assets"}}catch(t){return{ok:!1,provider:"das-assets",error:String(t.message||t).slice(0,120)}}}async function v0(e={},t={}){let n=String(e.ownerAddress||"").trim();if(!n)throw new Error("das-assets: ownerAddress is required");let r=Math.max(1,Number(e.page||1)),o=Math.min(1e3,Math.max(1,Number(e.limit||50)));return Ci("getAssetsByOwner",{ownerAddress:n,page:r,limit:o,...e.sortBy?{sortBy:{sortBy:e.sortBy,sortDirection:e.sortDirection||"asc"}}:{}},t)}async function A0(e={},t={}){let n=Math.max(1,Number(e.page||1)),r=Math.min(100,Math.max(1,Number(e.limit||20))),o={page:n,limit:r};return e.ownerAddress&&(o.ownerAddress=String(e.ownerAddress)),e.collectionId&&(o.collectionId=String(e.collectionId)),e.creatorAddress&&(o.creatorAddress=String(e.creatorAddress)),e.delegate&&(o.delegate=String(e.delegate)),Ci("searchAssets",o,t)}async function I0(e={},t={}){let n=String(e.assetId||"").trim();if(!n)throw new Error("das-assets: assetId is required");return Ci("getAssetProof",{id:n},t)}N();var N_="https://api.l2beat.com";function Ic(e={}){return(e.baseUrl||process.env.L2BEAT_API_URL||N_).replace(/\/$/,"")}async function _0(e={}){try{let t=await y(`${Ic(e)}/api/scaling/tvl`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??15e3});return{ok:t&&typeof t.totalUsd=="string",provider:"l2beat-tvl"}}catch(t){return{ok:!1,provider:"l2beat-tvl",error:String(t.message||t).slice(0,120)}}}async function P0(e={},t={}){let n=await y(`${Ic(t)}/api/scaling/tvl`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4});if(e.project){let r=String(e.project).toLowerCase(),o=n?.projects||{},i=Object.entries(o).find(([s])=>String(s).toLowerCase()===r);return i?{[i[0]]:i[1]}:{}}return n}async function C0(e={},t={}){return y(`${Ic(t)}/api/scaling/activity`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}N();var R_="https://api.spark.fi";function _c(e={}){return(e.baseUrl||process.env.SPARK_API_URL||R_).replace(/\/$/,"")}async function T0(e={}){try{return{ok:(await y(`${_c(e)}/v1/savings/spark/mainnet/usdc`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??1e4}))?.data?.vault?.address!=null,provider:"spark-lend"}}catch(t){return{ok:!1,provider:"spark-lend",error:String(t.message||t).slice(0,120)}}}async function N0(e={},t={}){let n=String(e.protocol||"spark"),r=String(e.chain||"mainnet"),o=e.token?String(e.token).toLowerCase():null;return o?y(`${_c(t)}/v1/savings/${encodeURIComponent(n)}/${encodeURIComponent(r)}/${encodeURIComponent(o)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}):y(`${_c(t)}/v1/savings/${encodeURIComponent(n)}/${encodeURIComponent(r)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}N();var L_="https://api.symbiotic.fi";function Pc(e={}){return(e.baseUrl||process.env.SYMBIOTIC_API_URL||L_).replace(/\/$/,"")}async function O0(e={}){try{let t=await y(`${Pc(e)}/v1/vaults`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??15e3});return{ok:Array.isArray(t)&&t.length>0,provider:"symbiotic-restaking",count:t.length}}catch(t){return{ok:!1,provider:"symbiotic-restaking",error:String(t.message||t).slice(0,120)}}}async function R0(e={},t={}){let n=Math.min(200,Math.max(1,Number(e.limit||50))),r=await y(`${Pc(t)}/v1/vaults?limit=${n}&offset=${Math.max(0,Number(e.offset||0))}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4});return e.approvedOnly?r.filter(o=>o.approved===!0):r}async function $0(e={},t={}){let n=String(e.address||"").trim();if(!n)throw new Error("symbiotic-restaking: address is required");return y(`${Pc(t)}/v1/vaults/${encodeURIComponent(n)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}N();var U_="https://staking-api.polygon.technology/api/v2",B_=18,D_=200,F_=50,q_=new Set(["id","totalStaked","selfStake","delegatedStake","commissionPercent","uptimePercent","performanceIndex"]);function Tc(e={}){return String(e.baseUrl||process.env.POLYGON_STAKING_API_URL||U_).replace(/\/$/,"")}function H_(e,t="id"){let n=String(e??"").trim();if(!/^\d+$/.test(n))throw new Error(`polygon-staking: ${t} must be a positive integer validator id`);let r=Number(n);if(!Number.isSafeInteger(r)||r<1)throw new Error(`polygon-staking: ${t} must be a positive integer validator id`);return r}function j_(e,t=F_){let n=Number(e??t);return Number.isFinite(n)?Math.min(D_,Math.max(1,Math.trunc(n))):t}function Cc(e){let t=Number(e);return Number.isFinite(t)?t/10**B_:null}async function Nc(e,t={}){let n=await y(`${Tc(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3});if(typeof n=="string")throw new Error(`polygon-staking GET ${e}: non-JSON response`);if(n?.success===!1){let r=n?.message||n?.error||n?.status||"request rejected";throw new Error(`polygon-staking GET ${e}: ${r}`)}return n}function L0(e={}){return{id:e.id??null,name:typeof e.name=="string"?e.name.trim():null,status:e.status??null,currentState:e.currentState??null,owner:e.owner??null,signer:e.signer??null,contractAddress:e.contractAddress??null,commissionPercent:e.commissionPercent??null,uptimePercent:e.uptimePercent??null,performanceIndex:e.performanceIndex??null,delegationEnabled:e.delegationEnabled??null,activationEpoch:e.activationEpoch??null,deactivationEpoch:e.deactivationEpoch??null,jailEndEpoch:e.jailEndEpoch??null,missedLatestCheckpointCount:e.missedLatestCheckpointcount??null,totalStakedRaw:e.totalStaked??null,selfStakeRaw:e.selfStake??null,delegatedStakeRaw:e.delegatedStake??null,totalStakedPolApprox:Cc(e.totalStaked),selfStakePolApprox:Cc(e.selfStake),delegatedStakePolApprox:Cc(e.delegatedStake),stakePrecision:"approximate \u2014 upstream serves wei-scale as float64"}}async function M0(e={},t={}){let n=await Nc("/validators",t),r=Array.isArray(n?.result)?n.result:[],o=n?.summary?.total??r.length;if(e.status){let d=String(e.status).toLowerCase();r=r.filter(p=>String(p?.status||"").toLowerCase()===d)}if(e.currentState){let d=String(e.currentState).toUpperCase();r=r.filter(p=>String(p?.currentState||"").toUpperCase()===d)}if(e.delegationEnabled!=null){let d=!!e.delegationEnabled;r=r.filter(p=>!!p?.delegationEnabled===d)}let i=q_.has(String(e.sortBy))?String(e.sortBy):"id",s=String(e.direction||"").toUpperCase()==="DESC";r=[...r].sort((d,p)=>{let m=Number(d?.[i]??0),f=Number(p?.[i]??0),h=Number.isFinite(m)&&Number.isFinite(f)?m-f:0;return s?-h:h});let a=r.length,c=Math.max(0,Math.trunc(Number(e.offset||0))||0),l=j_(e.limit),u=r.slice(c,c+l);return{provider:"polygon-staking",chainId:137,count:u.length,matched:a,total:o,limit:l,offset:c,sortBy:i,direction:s?"DESC":"ASC",paginatedBy:"client \u2014 upstream /validators ignores limit/offset",validators:e.raw?u:u.map(L0)}}async function U0(e={},t={}){let n=H_(e.id??e.validatorId,"id"),o=(await Nc(`/validators/${n}`,t))?.result;if(!o||typeof o!="object")throw new Error(`polygon-staking: validator ${n} not found`);return{provider:"polygon-staking",chainId:137,id:n,validator:e.raw?o:{...L0(o),delegatorCount:o.delegatorCount??null,checkpointsSigned:o.checkpointsSigned??null,checkpointsMissed:o.checkpointsMissed??null,isInAuction:o.isInAuction??null,auctionAmount:o.auctionAmount??null,delegatorUnclaimedRewardsRaw:o.delegatorUnclaimedRewards??null,validatorUnclaimedRewardsRaw:o.validatorUnclaimedRewards??null,claimedRewardRaw:o.claimedReward??null,description:typeof o.description=="string"?o.description:null,logoUrl:o.logoUrl??null},raw:e.raw?void 0:o}}async function B0(e={}){try{let t=await Nc("/validators",{...e,timeoutMs:e.timeoutMs??1e4}),n=Array.isArray(t?.result)?t.result:[];return{ok:n.length>0,provider:"polygon-staking",chainId:137,baseUrl:Tc(e),validatorTotal:t?.summary?.total??n.length,exec:!1}}catch(t){return{ok:!1,provider:"polygon-staking",chainId:137,baseUrl:Tc(e),error:String(t?.message||t),exec:!1}}}N();var z_="https://api.v3.aave.com/graphql",BM=Object.freeze([1,10,56,100,137,146,232,324,1088,1868,5e3,42161,42220,43114,57073,59144,534352]),W_=(e={})=>e.baseUrl||process.env.AAVE_V3_API_URL||z_;async function Ti(e,t,n={}){let r=await y(W_(n),{method:"POST",body:{query:e,variables:t},fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs??2e4});if(r?.errors?.length)throw new Error(`aave-v3: ${r.errors.map(o=>o?.message||String(o)).join("; ")}`);return r}var G_=`query Markets($request: MarketsRequest!) {
|
|
12
|
+
${m.stderr}`.slice(0,2e3))}else if(!r)throw new Error("protocol-templates: slither required (allowSkipStatic=false) but not installed");let p=GE(o);return{ok:!0,templateId:e,metadata:n,path:o,forgeTests:{ok:!0,tool:"forge",summary:"forge test passed"},forgeBuild:{ok:!0,tool:"forge",summary:"forge build passed"},staticAnalysis:u,sourceHash:p,disclaimer:ui,firmAudit:!1}}function ff(e,t={}){let n=Ga(e,t),r=mf(),o=n.path,i=An(r,["build","-q"],o);if(!i.ok)throw new Error(`protocol-templates: forge build failed
|
|
13
|
+
${i.stderr}`.slice(0,1500));let s=n.metadata.contractName;if(t.contractName&&t.contractName!==s)throw new Error(`protocol-templates: fixed contract name is ${s}`);let a=We(o,"out",`${s}.sol`,`${s}.json`);if(!Bt(a))throw new Error(`protocol-templates: artifact missing at ${a}`);let c=JSON.parse(li(a,"utf8"));return{gate:n,metadata:n.metadata,contractName:s,abi:c.abi,bytecode:c.bytecode?.object||c.bytecode,deployedBytecode:c.deployedBytecode?.object||c.deployedBytecode,artifactPath:a}}var YE=new Set(["status","chainId","forkBlockNumber","gasUsed","transactionHash","contractAddress","revertReason"]);function XE(e,t){if(typeof e!="object"||e===null||Array.isArray(e))throw new Error("prepareTemplateDeploy: localForkSimulationReceipt must be an object");let n=$e(e);for(let o of Object.keys(n))if(!YE.has(o))throw new Error(`prepareTemplateDeploy: unsupported field "${o}" in localForkSimulationReceipt`);if(n.status!=="success"&&n.status!=="reverted")throw new Error('prepareTemplateDeploy: simulation status must be "success" or "reverted"');let r={status:n.status};if(n.chainId!==void 0){let o=Number(n.chainId);if(!Number.isSafeInteger(o)||o!==t)throw new Error("prepareTemplateDeploy: simulation chainId must match deployment chainId");r.chainId=o}if(n.forkBlockNumber!==void 0){let o=Number(n.forkBlockNumber);if(!Number.isSafeInteger(o)||o<0)throw new Error("prepareTemplateDeploy: simulation forkBlockNumber must be a nonnegative safe integer");r.forkBlockNumber=o}if(n.gasUsed!==void 0){let o=String(n.gasUsed);if(!/^(0|[1-9][0-9]*)$/.test(o))throw new Error("prepareTemplateDeploy: simulation gasUsed must be a nonnegative integer");r.gasUsed=o}if(n.transactionHash!==void 0){if(!/^0x[0-9a-fA-F]{64}$/.test(n.transactionHash))throw new Error("prepareTemplateDeploy: simulation transactionHash must be bytes32 hex");r.transactionHash=n.transactionHash}if(n.contractAddress!==void 0){if(!/^0x[0-9a-fA-F]{40}$/.test(n.contractAddress))throw new Error("prepareTemplateDeploy: simulation contractAddress must be an EVM address");r.contractAddress=n.contractAddress}if(n.revertReason!==void 0){if(typeof n.revertReason!="string"||n.revertReason.length>500)throw new Error("prepareTemplateDeploy: simulation revertReason must be at most 500 characters");r.revertReason=n.revertReason}return r}async function gf(e={},t={}){let n=String(e.templateId||"").trim();if(!n)throw new Error("prepareTemplateDeploy: templateId required");let r=Number(e.chainId);if(!Number.isInteger(r)||r<=0)throw new Error("prepareTemplateDeploy: chainId required");let o=e.args??e.constructorArgs??[],i=lf(n,o),s=ff(n,{contractName:e.contractName,allowSkipStatic:t.allowSkipStatic!==!1,allowStaticFail:t.allowStaticFail===!0});if(!s.bytecode||s.bytecode==="0x")throw new Error("prepareTemplateDeploy: empty bytecode");let a=s.bytecode.startsWith("0x")?s.bytecode:`0x${s.bytecode}`,u=(await new KE(s.abi,a).getDeployTransaction(...o)).data,d=t.localForkSimulationReceipt??e.localForkSimulationReceipt??null,p=d===null?{status:"not-run",injected:!1,trusted:!1,gateDecision:!1,networkSideEffects:!1}:{...XE(d,r),kind:"local-fork",injected:!0,trusted:!1,gateDecision:!1,networkSideEffects:!1},m={chainId:r,to:null,data:u,value:"0x0"};return O({provider:"protocol-templates",kind:"template-deploy",templateId:n,contractName:s.contractName,template:i,chainId:r,transaction:m,unsignedDeployEnvelope:{transaction:m,signed:!1,broadcast:!1},abi:s.abi,sourceHash:s.gate.sourceHash,bytecodeHash:hf(a),authorityReport:uf(i),simulationReceipt:p,verificationManifest:{contractName:s.contractName,source:i.source,compiler:"0.8.24",optimizer:{enabled:!0,runs:200},openZeppelin:i.dependency,sourceHash:s.gate.sourceHash,creationBytecodeHash:hf(a),constructorData:`0x${u.slice(a.length)}`},addressBookRecord:{status:"pending-deployment",address:null,chainId:r,label:`${n}:${s.contractName}`},monitoringPlan:{activation:"after user-signed deployment confirmation",enabled:!1,events:[...i.monitor],checks:["deployment bytecode matches verification manifest","authority changes","contract balance and release/withdraw events"]},gate:{forgeBuild:s.gate.forgeBuild,forgeTests:s.gate.forgeTests,staticAnalysis:{tool:s.gate.staticAnalysis.tool,ok:s.gate.staticAnalysis.ok,skipped:s.gate.staticAnalysis.skipped},firmAudit:!1,disclaimer:ui},requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,deploymentActivated:!1,note:"Unsigned deploy. User wallet signs. Template tests passed; not a firm audit."},{provider:"protocol-templates",kind:"template-deploy"})}W();import{createHash as Ka}from"node:crypto";import{secp256k1 as Pr}from"@noble/curves/secp256k1.js";import{bech32m as yf}from"@scure/base";var Xa="Reviewed scaffold and source checks only; NOT a paid security audit. Testnet simulation and independent review are required before mainnet use.",bf="123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz",mi=Object.freeze({"solana-safe-vault":Object.freeze({id:"solana-safe-vault",family:"solana",language:"Rust / Anchor",supportStatus:"GUIDED_BUILD",protocolModel:"Solana program with PDA-owned vault state",prepareOnly:!0,firmAudit:!1}),"bitcoin-tapscript-vault":Object.freeze({id:"bitcoin-tapscript-vault",family:"bitcoin",language:"Miniscript / Tapscript policy",supportStatus:"GUIDED_BUILD",protocolModel:"UTXO policy; not a general-purpose smart contract",prepareOnly:!0,firmAudit:!1})});function Ee(e,t){throw new Error(`${e}: ${t}`)}function kf(e){let t=String(e||"").trim();return/^[a-z][a-z0-9_]{1,47}$/.test(t)||Ee("native protocol","projectName must be 2-48 lowercase snake_case characters"),t}function Ya(e,t,{min:n=0n,max:r=18446744073709551615n}={}){try{let o=BigInt(e);if(o<n||o>r)throw new Error;return o}catch{Ee(t,`must be an integer from ${n} to ${r}`)}}function JE(e){let t=String(e||"");if(!t||[...t].some(o=>!bf.includes(o)))return null;let n=0n;for(let o of t)n=n*58n+BigInt(bf.indexOf(o));let r=[];for(;n>0n;)r.unshift(Number(n&255n)),n>>=8n;for(let o of t){if(o!=="1")break;r.unshift(0)}return Uint8Array.from(r)}function wf(e,t){let n=String(e||"").trim(),r=JE(n);return(!r||r.length!==32)&&Ee(t,"must be a 32-byte base58 Solana public key"),n}function xf(e,t){let n=String(e||"").trim().toLowerCase();/^(02|03)[0-9a-f]{64}$/.test(n)||Ee(t,"must be a compressed secp256k1 public key");try{Pr.Point.fromHex(n)}catch{Ee(t,"must encode a valid secp256k1 curve point")}return n}function ZE(e){if(e<253)return Buffer.from([e]);if(e<=65535){let t=Buffer.alloc(3);return t[0]=253,t.writeUInt16LE(e,1),t}Ee("bitcoin-tapscript-vault","script too large")}function Qa(e,t){let n=Ka("sha256").update(e).digest();return Ka("sha256").update(n).update(n).update(t).digest()}function Sf(e){return Qa("TapLeaf",Buffer.concat([Buffer.from([192]),ZE(e.length),e]))}function eA(e,t){let[n,r]=Buffer.compare(e,t)<=0?[e,t]:[t,e];return Qa("TapBranch",Buffer.concat([n,r]))}function pi(e){return Pr.Point.fromHex(e).x.toString(16).padStart(64,"0")}function vf(e){return Buffer.concat([Buffer.from([32]),Buffer.from(e,"hex")])}function tA(e,t){let n=[];return e.forEach((r,o)=>n.push(vf(pi(r)),Buffer.from([o===0?172:186]))),n.push(Buffer.from([80+t,156])),Buffer.concat(n)}function nA(e){let t=Number(e),n=[];for(;t>0;)n.push(t&255),t>>=8;return n[n.length-1]&128&&n.push(0),Buffer.from([n.length,...n])}function rA(e,t){return Buffer.concat([nA(t),Buffer.from([178,117]),vf(pi(e)),Buffer.from([172])])}function oA(e,t,n){let r=Pr.Point.fromHex(e),o=r.y&1n?r.negate():r,i=Buffer.from(o.x.toString(16).padStart(64,"0"),"hex"),s=BigInt(`0x${Qa("TapTweak",Buffer.concat([i,t])).toString("hex")}`)%Pr.Point.Fn.ORDER,a=o.add(Pr.Point.BASE.multiply(s)),c=Buffer.from(a.x.toString(16).padStart(64,"0"),"hex"),l=n==="mainnet"?"bc":n==="regtest"?"bcrt":"tb";return{address:yf.encode(l,[1,...yf.toWords(c)],90),scriptPubKey:`5120${c.toString("hex")}`,outputKey:c.toString("hex"),internalKey:i.toString("hex")}}function Le(e,t){return Object.freeze({path:e,content:t.endsWith(`
|
|
14
|
+
`)?t:`${t}
|
|
15
|
+
`})}function iA(e){let t=Ka("sha256");for(let n of[...e].sort((r,o)=>r.path.localeCompare(o.path)))t.update(n.path).update("\0").update(n.content).update("\0");return t.digest("hex")}function sA(e){let t=kf(e.projectName),n=wf(e.authority,"solana-safe-vault authority"),r=Ya(e.unlockDelaySlots,"solana-safe-vault unlockDelaySlots",{min:1n}),o=String(e.network||"devnet");["localnet","devnet","testnet","mainnet-beta"].includes(o)||Ee("solana-safe-vault network","must be localnet, devnet, testnet, or mainnet-beta");let i=wf(e.programId,"solana-safe-vault programId");i==="11111111111111111111111111111111"&&Ee("solana-safe-vault programId","must not be the System Program placeholder");let s=`use anchor_lang::prelude::*;
|
|
16
|
+
use anchor_lang::system_program::{transfer, Transfer};
|
|
17
|
+
|
|
18
|
+
declare_id!("${i}");
|
|
19
|
+
|
|
20
|
+
#[program]
|
|
21
|
+
pub mod ${t} {
|
|
22
|
+
use super::*;
|
|
23
|
+
|
|
24
|
+
pub fn initialize(ctx: Context<Initialize>, unlock_delay_slots: u64) -> Result<()> {
|
|
25
|
+
require!(unlock_delay_slots > 0, VaultError::InvalidDelay);
|
|
26
|
+
let vault = &mut ctx.accounts.vault;
|
|
27
|
+
vault.authority = ctx.accounts.authority.key();
|
|
28
|
+
vault.unlock_delay_slots = unlock_delay_slots;
|
|
29
|
+
vault.last_deposit_slot = Clock::get()?.slot;
|
|
30
|
+
vault.bump = ctx.bumps.vault;
|
|
31
|
+
Ok(())
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
pub fn deposit(ctx: Context<Deposit>, lamports: u64) -> Result<()> {
|
|
35
|
+
require!(lamports > 0, VaultError::InvalidAmount);
|
|
36
|
+
transfer(
|
|
37
|
+
CpiContext::new(ctx.accounts.system_program.to_account_info(), Transfer {
|
|
38
|
+
from: ctx.accounts.depositor.to_account_info(),
|
|
39
|
+
to: ctx.accounts.vault.to_account_info(),
|
|
40
|
+
}),
|
|
41
|
+
lamports,
|
|
42
|
+
)?;
|
|
43
|
+
ctx.accounts.vault.last_deposit_slot = Clock::get()?.slot;
|
|
44
|
+
Ok(())
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
pub fn withdraw(ctx: Context<Withdraw>, lamports: u64) -> Result<()> {
|
|
48
|
+
require!(lamports > 0, VaultError::InvalidAmount);
|
|
49
|
+
let vault = &ctx.accounts.vault;
|
|
50
|
+
let unlock_slot = vault.last_deposit_slot.checked_add(vault.unlock_delay_slots)
|
|
51
|
+
.ok_or(VaultError::ArithmeticOverflow)?;
|
|
52
|
+
require!(Clock::get()?.slot >= unlock_slot, VaultError::StillLocked);
|
|
53
|
+
require!(vault.to_account_info().lamports() > lamports, VaultError::InsufficientFunds);
|
|
54
|
+
**vault.to_account_info().try_borrow_mut_lamports()? -= lamports;
|
|
55
|
+
**ctx.accounts.authority.to_account_info().try_borrow_mut_lamports()? += lamports;
|
|
56
|
+
Ok(())
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
#[derive(Accounts)]
|
|
61
|
+
pub struct Initialize<'info> {
|
|
62
|
+
#[account(mut, address = pubkey!("${n}"))]
|
|
63
|
+
pub authority: Signer<'info>,
|
|
64
|
+
#[account(init, payer = authority, space = 8 + Vault::INIT_SPACE, seeds = [b"vault", authority.key().as_ref()], bump)]
|
|
65
|
+
pub vault: Account<'info, Vault>,
|
|
66
|
+
pub system_program: Program<'info, System>,
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
#[derive(Accounts)]
|
|
70
|
+
pub struct Deposit<'info> {
|
|
71
|
+
#[account(mut)]
|
|
72
|
+
pub depositor: Signer<'info>,
|
|
73
|
+
#[account(mut, seeds = [b"vault", vault.authority.as_ref()], bump = vault.bump)]
|
|
74
|
+
pub vault: Account<'info, Vault>,
|
|
75
|
+
pub system_program: Program<'info, System>,
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
#[derive(Accounts)]
|
|
79
|
+
pub struct Withdraw<'info> {
|
|
80
|
+
#[account(mut, address = vault.authority)]
|
|
81
|
+
pub authority: Signer<'info>,
|
|
82
|
+
#[account(mut, seeds = [b"vault", authority.key().as_ref()], bump = vault.bump)]
|
|
83
|
+
pub vault: Account<'info, Vault>,
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
#[account]
|
|
87
|
+
#[derive(InitSpace)]
|
|
88
|
+
pub struct Vault {
|
|
89
|
+
pub authority: Pubkey,
|
|
90
|
+
pub unlock_delay_slots: u64,
|
|
91
|
+
pub last_deposit_slot: u64,
|
|
92
|
+
pub bump: u8,
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
#[error_code]
|
|
96
|
+
pub enum VaultError {
|
|
97
|
+
#[msg("Unlock delay must be positive")] InvalidDelay,
|
|
98
|
+
#[msg("Amount must be positive")] InvalidAmount,
|
|
99
|
+
#[msg("Vault is still locked")] StillLocked,
|
|
100
|
+
#[msg("Vault has insufficient funds")] InsufficientFunds,
|
|
101
|
+
#[msg("Arithmetic overflow")] ArithmeticOverflow,
|
|
102
|
+
}
|
|
103
|
+
`,a=[Le("Anchor.toml",`[provider]
|
|
104
|
+
cluster = "${o}"
|
|
105
|
+
wallet = "~/.config/solana/id.json"
|
|
106
|
+
|
|
107
|
+
[programs.${o}]
|
|
108
|
+
${t} = "${i}"
|
|
109
|
+
`),Le("Cargo.toml",`[workspace]
|
|
110
|
+
members = ["programs/${t}"]
|
|
111
|
+
resolver = "2"
|
|
112
|
+
`),Le(`programs/${t}/Cargo.toml`,`[package]
|
|
113
|
+
name = "${t}"
|
|
114
|
+
version = "0.1.0"
|
|
115
|
+
edition = "2021"
|
|
116
|
+
|
|
117
|
+
[lib]
|
|
118
|
+
crate-type = ["cdylib", "lib"]
|
|
119
|
+
name = "${t}"
|
|
120
|
+
|
|
121
|
+
[features]
|
|
122
|
+
no-entrypoint = []
|
|
123
|
+
cpi = ["no-entrypoint"]
|
|
124
|
+
default = []
|
|
125
|
+
|
|
126
|
+
[dependencies]
|
|
127
|
+
anchor-lang = "0.31.1"
|
|
128
|
+
`),Le(`programs/${t}/src/lib.rs`,s),Le(`tests/${t}.ts`,`// Generated lifecycle test plan. Run with Anchor on ${o}.
|
|
129
|
+
// 1. initialize with ${r} slots; 2. deposit; 3. reject early withdrawal;
|
|
130
|
+
// 4. advance slots; 5. withdraw as authority; 6. reject non-authority.
|
|
131
|
+
`),Le("SECURITY.md",`# Security model
|
|
132
|
+
|
|
133
|
+
- Initial and permanent withdrawal authority: \`${n}\`
|
|
134
|
+
- Unlock delay: ${r} slots after the most recent deposit
|
|
135
|
+
- No upgrade authority is created by this source; deployment authority handling is external
|
|
136
|
+
- Run \`anchor build\`, \`anchor test\`, program simulation, and independent review before deployment
|
|
137
|
+
`)];return{family:"solana",network:o,projectName:t,protocolModel:mi["solana-safe-vault"].protocolModel,authorityReport:{initialAuthority:n,mutable:!1,unlockDelaySlots:r.toString()},programIdentity:{publicKey:i,callerSupplied:!0,secretKeyAccepted:!1},files:a,gate:{sourceChecks:{ok:s.includes("address = vault.authority")&&s.includes("checked_add")&&s.includes('seeds = [b"vault"')&&!s.includes("invoke_signed_unchecked"),checks:["authority constraint","checked slot arithmetic","PDA seed binding","no unchecked CPI"]},compiler:{tool:"anchor",requiredBeforeDeploy:!0,run:!1},tests:{tool:"anchor test",requiredBeforeDeploy:!0,run:!1},simulation:{cluster:o,requiredBeforeDeploy:!0,run:!1},firmAudit:!1,disclaimer:Xa},deploymentPrepared:!1}}function aA(e){let t=kf(e.projectName),n=String(e.network||"testnet");["regtest","signet","testnet","mainnet"].includes(n)||Ee("bitcoin-tapscript-vault network","must be regtest, signet, testnet, or mainnet");let r=Array.isArray(e.signerPubkeys)?e.signerPubkeys.map((b,k)=>xf(b,`signerPubkeys[${k}]`)):[];(r.length<2||r.length>15||new Set(r).size!==r.length)&&Ee("bitcoin-tapscript-vault signerPubkeys","must contain 2-15 unique compressed public keys");let o=Number(Ya(e.threshold,"bitcoin-tapscript-vault threshold",{min:1n,max:BigInt(r.length)})),i=xf(e.recoveryPubkey,"bitcoin-tapscript-vault recoveryPubkey");r.includes(i)&&Ee("bitcoin-tapscript-vault recoveryPubkey","must be distinct from signer keys");let s=Ya(e.recoveryDelayBlocks,"bitcoin-tapscript-vault recoveryDelayBlocks",{min:1n,max:65535n}),a=`multi_a(${o},${r.map(pi).join(",")})`,c=`and_v(v:older(${s}),pk(${pi(i)}))`,l=`taproot_tree(${a},${c})`,u=tA(r,o),d=rA(i,Number(s)),p=eA(Sf(u),Sf(d)),m=oA(r[0],p,n),f=`tr(${m.internalKey},{${a},${c}})`,h={version:1,name:t,network:n,descriptorType:"tr",threshold:o,signerPubkeys:r,recoveryPubkey:i,recoveryDelayBlocks:Number(s),miniscript:l,cooperativeMiniscript:a,recoveryMiniscript:c,descriptor:f,address:m.address,scriptPubKey:m.scriptPubKey},g=[Le("policy/miniscript.txt",l),Le("policy/descriptor.txt",f),Le("policy/manifest.json",JSON.stringify(h,null,2)),Le("tests/policy-vectors.json",JSON.stringify({cooperative:{requiredSignatures:o,csvBlocks:0,expected:"spendable"},insufficientCooperative:{requiredSignatures:Math.max(0,o-1),csvBlocks:0,expected:"rejected"},earlyRecovery:{recoverySignature:!0,csvBlocks:Math.max(0,Number(s)-1),expected:"rejected"},matureRecovery:{recoverySignature:!0,csvBlocks:Number(s),expected:"spendable"}},null,2)),Le("SECURITY.md",`# Security model
|
|
138
|
+
|
|
139
|
+
- Cooperative path: ${o}-of-${r.length}
|
|
140
|
+
- Recovery path: ${i} after ${s} blocks (BIP68 relative locktime)
|
|
141
|
+
- This is a policy scaffold, not a funded address, PSBT, signature, or broadcast
|
|
142
|
+
- Compile and satisfy on regtest/signet with a reviewed Miniscript implementation before mainnet
|
|
143
|
+
`)];return{family:"bitcoin",network:n,projectName:t,protocolModel:mi["bitcoin-tapscript-vault"].protocolModel,policy:{descriptorType:"tr",miniscript:l,cooperativeMiniscript:a,recoveryMiniscript:c,descriptor:f,address:m.address,scriptPubKey:m.scriptPubKey,threshold:o,signerCount:r.length,recoveryDelayBlocks:s.toString()},authorityReport:{cooperativeSigners:r,threshold:o,recoveryPubkey:i,recoveryDelayBlocks:s.toString()},files:g,gate:{sourceChecks:{ok:o<=r.length&&s>0n&&new Set([...r,i]).size===r.length+1,checks:["bounded threshold","unique keys","positive BIP68 delay","separate recovery key"]},compiler:{tool:"rust-miniscript or equivalent",requiredBeforeFunding:!0,run:!1},tests:{tool:"regtest/signet policy satisfaction",requiredBeforeFunding:!0,run:!1},simulation:{network:n==="mainnet"?"signet or regtest required first":n,requiredBeforeFunding:!0,run:!1},firmAudit:!1,disclaimer:Xa},psbtPrepared:!1,fundingPrepared:!1}}function Ja(){return Object.values(mi).map(e=>({...e,disclaimer:Xa}))}async function Ef(e={}){let t=String(e.templateId||"").trim(),n=mi[t];n||Ee("protocol-templates",`unknown native template "${t}"`);let r=t==="solana-safe-vault"?sA(e):aA(e),o=iA(r.files);return O({provider:"protocol-templates",kind:"native-protocol-build",templateId:t,supportStatus:n.supportStatus,prepareOnly:!0,firmAudit:!1,artifactHash:o,...r,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,note:"Deterministic native protocol source bundle only. Compile, test, simulate, and separately prepare deployment/funding before user signature."},{provider:"protocol-templates",kind:"native-protocol-build"})}T();var cA="https://api.geckoterminal.com/api/v2",fi=(e={})=>(e.baseUrl||process.env.GECKOTERMINAL_API_URL||cA).replace(/\/$/,""),In=e=>encodeURIComponent(String(e));async function Za(e={},t={}){let n=Math.max(1,Number(e.page||1));return y(`${fi(t)}/networks?page=${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function Af(e={},t={}){if(!e.network||!e.poolAddress)throw new Error("network and poolAddress required");return y(`${fi(t)}/networks/${In(e.network)}/pools/${In(e.poolAddress)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function If(e={},t={}){if(!e.network||!(e.address||e.tokenAddress))throw new Error("network and token address required");return y(`${fi(t)}/networks/${In(e.network)}/tokens/${In(e.address||e.tokenAddress)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function _f(e={},t={}){if(!e.network||!e.poolAddress)throw new Error("network and poolAddress required");let n=["minute","hour","day"].includes(e.timeframe)?e.timeframe:"hour",r=new URLSearchParams;return r.set("aggregate",String(Math.max(1,Number(e.aggregate||1)))),r.set("limit",String(Math.min(1e3,Math.max(1,Number(e.limit||168))))),e.beforeTimestamp!=null&&r.set("before_timestamp",String(e.beforeTimestamp)),e.currency&&r.set("currency",String(e.currency)),e.token&&r.set("token",String(e.token)),y(`${fi(t)}/networks/${In(e.network)}/pools/${In(e.poolAddress)}/ohlcv/${n}?${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function Pf(e={}){let t=await Za({page:1},e);return{ok:Array.isArray(t?.data)&&t.data.length>0,networkSample:t?.data?.length||0}}T();import{Interface as Of,getAddress as Rf,isAddress as uA}from"ethers";me();W();var dA="https://api.curve.finance/v1",$f=(e={})=>(e.baseUrl||process.env.CURVE_API_URL||dA).replace(/\/$/,""),pA=Object.freeze({1:"0x45312ea0eFf7E09C83CBE249fa1d7598c4C8cd4e",10:"0x0DCDED3545D565bA3B19E683431381007245d983",56:"0xA72C85C258A81761433B4e8da60505Fe3Dd551CC",137:"0x0DCDED3545D565bA3B19E683431381007245d983",988:"0xFF5Cb29241F002fFeD2eAa224e3e996D24A6E8d1",999:"0xd2002373543Ce3527023C75e7518C274A51ce712",4663:"0xFF5Cb29241F002fFeD2eAa224e3e996D24A6E8d1",8453:"0x4f37A9d177470499A2dD084621020b023fcffc1F",42161:"0x2191718CD32d02B8E60BAdFFeA33E4B5DD9A0A0D",43114:"0x0DCDED3545D565bA3B19E683431381007245d983"}),Lf="0x0000000000000000000000000000000000000000",ec=new Of(["function get_dy(address[11] route,uint256[5][5] swap_params,uint256 amount,address[5] pools) view returns (uint256)","function exchange(address[11] route,uint256[5][5] swap_params,uint256 amount,uint256 expected,address[5] pools,address receiver) payable returns (uint256)"]),Nf=new Of(["function coins(uint256) view returns (address)"]);function Mf(e){let t=pA[Number(e)];if(!t)throw new Error(`curve-router-ng: unsupported chainId ${e}`);return t}function Nr(e,t){if(!uA(e))throw new Error(`${t} must be a valid EVM address`);return Rf(e)}function mA(e,t){let n;try{n=BigInt(String(e))}catch{throw new Error(`${t} must be an integer string`)}if(n<=0n)throw new Error(`${t} must be positive`);return n}function Cf(e,t,n,r){let o=Number(e);if(!Number.isInteger(o)||o<n||o>r)throw new Error(`${t} must be an integer ${n}..${r}`);return o}function Uf(e,t,n){return[e,t,n,...Array(8).fill(Lf)]}function Bf(e,t,n,r){return[[BigInt(e),BigInt(t),1n,BigInt(n),BigInt(r)],...Array.from({length:4},()=>[0n,0n,0n,0n,0n])]}function Df(e){return[e,...Array(4).fill(Lf)]}async function fA({chainId:e,pool:t,nCoins:n,rpcCall:r,opts:o}){let i=[];for(let s=0;s<n;s++){let a=Nf.encodeFunctionData("coins",[s]),c=await r(e,"eth_call",[{to:t,data:a},o.blockTag||"latest"],o),l=Nf.decodeFunctionResult("coins",c);i.push(Rf(l[0]))}return i}function Tf(e,t,n){let r=t.toLowerCase(),o=e.findIndex(i=>i.toLowerCase()===r);if(o<0)throw new Error(`Curve pool does not contain ${n}`);return o}async function Ff(e={}){return y(`${$f(e)}/openapi.json`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs})}async function tc(e={},t={}){let n=String(e.chain||e.network||"ethereum").toLowerCase(),r=String(e.registry||"main").toLowerCase();if(!/^[a-z0-9-]+$/.test(n)||!/^[a-z0-9-]+$/.test(r))throw new Error("invalid Curve chain or registry");return y(`${$f(t)}/getPools/${n}/${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function qf(e={}){let t=await tc({chain:"ethereum",registry:"main"},e),n=t?.data?.poolData?.length||0;return{ok:t?.success===!0&&n>0,poolSample:n}}async function nc(e={},t={}){let n=Number(e.chainId??8453),r=Mf(n),o=Nr(e.pool,"curve pool"),i=Nr(e.tokenIn,"curve tokenIn"),s=Nr(e.tokenOut,"curve tokenOut"),a=mA(e.amountIn,"curve amountIn"),c=Cf(e.nCoins??2,"curve nCoins",2,8),l=Cf(e.poolType,"curve poolType",1,4),u=t.rpcCall||L,d=await fA({chainId:n,pool:o,nCoins:c,rpcCall:u,opts:t}),p=Tf(d,i,"tokenIn"),m=Tf(d,s,"tokenOut");if(p===m)throw new Error("Curve token indexes must differ");let f=Uf(i,o,s),h=Bf(p,m,l,c),g=Df(o),b=ec.encodeFunctionData("get_dy",[f,h,a,g]),k=await u(n,"eth_call",[{to:r,data:b},e.blockTag||"latest"],t),x=ec.decodeFunctionResult("get_dy",k),w=BigInt(x[0]);if(w<=0n)throw new Error("curve quote returned zero output");return V({venue:"curve",router:r,chainId:n,pool:o,tokenIn:i,tokenOut:s,amountIn:a.toString(),amountOut:w.toString(),nCoins:c,poolType:l,swapType:1,i:p,j:m,route:f,swapParams:h.map(E=>E.map(C=>C.toString())),pools:g},{chainId:n,venue:r,amountOut:w.toString(),liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps})}async function Hf(e={},t={}){let n=Number(e.chainId??8453),r=Mf(n),o=Nr(e.sender||e.from||e.fromAddress||e.receiver,"curve sender"),i=Nr(e.receiver||e.recipient||o,"curve receiver"),s=await nc({...e,sender:o},t),a=Uf(s.tokenIn,s.pool,s.tokenOut),c=Bf(s.i,s.j,s.poolType,s.nCoins),l=Df(s.pool),u=ec.encodeFunctionData("exchange",[a,c,BigInt(s.amountIn),BigInt(s.amountOutMinimum),l,i]);return O({provider:"curve",calldataReady:!0,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:n,quote:s,autoSlippage:s.autoSlippage,requiresApproval:{token:s.tokenIn,spender:r,amount:s.amountIn},transaction:{chainId:n,from:o,to:r,data:u,value:"0",slippageGuard:J(s.autoSlippage,{chainId:n,venue:r,data:u})}},{provider:"curve",kind:"curve-tx"})}T();import{Interface as rc,getAddress as Yf,isAddress as gA}from"ethers";W();var jf=Object.freeze({42161:"https://arbitrum-api.gmxinfra.io",43114:"https://avalanche-api.gmxinfra.io"}),Vf=Object.freeze({42161:{name:"arbitrum",api:jf[42161],exchangeRouter:"0x1C3fa76e6E1088bCE750f23a5BFcffa1efEF6A41",router:"0x7452c558d45f8afC8c83dAe62C3f8A5BE19c71f6",orderVault:"0x31eF83a530Fde1B38EE9A18093A333D8Bbbc40D5",dataStore:"0xFD70de6b91282D8017aA4E741e9Ae325CAb992d8",reader:"0x470fbC46bcC0f16532691Df360A07d8Bf5ee0789",eventEmitter:"0xC8ee91A54287DB53897056e12D9819156D3822Fb",wnt:"0x82aF49447D8a07e3bd95BD0d56f35241523fBab1",usdc:"0xaf88d065e77c8cC2239327C5EDb3A432268e5831"},43114:{name:"avalanche",api:jf[43114],exchangeRouter:"0x8f550E53DFe96C055D5Bdb267c21F268fCAF63B2",router:"0x820F5FfC5b525cD4d88Cd91aCf2c28F16530Cc68",orderVault:"0xD3D60D22d415aD43b7e64b510D86A30f19B1B12C",dataStore:"0x2F0b22339414ADeD7D5F06f9D604c7fF5b2fe3f6",reader:"0x62Cb8740E6986B29dC671B2EB596676f60590A5B",eventEmitter:"0xDb17B211c34240B014ab6d61d4A31FA0C0e20c26",wnt:"0xB31f66AA3C1e785363F0875A1B74E27b85FD66c7",usdc:"0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E"}}),zf="0x0000000000000000000000000000000000000000",yA=`0x${"0".repeat(64)}`,Wf=Object.freeze({marketSwap:0,limitSwap:1,marketIncrease:2,limitIncrease:3,marketDecrease:4,limitDecrease:5,stopLossDecrease:6,stopIncrease:8}),Gf=Object.freeze({noSwap:0,swapPnlTokenToCollateralToken:1,swapCollateralTokenToPnlToken:2}),hi=new rc(["function multicall(bytes[] data) payable returns (bytes[] results)","function sendTokens(address token,address receiver,uint256 amount) payable","function sendWnt(address receiver,uint256 amount) payable","function createOrder(((address receiver,address cancellationReceiver,address callbackContract,address uiFeeReceiver,address market,address initialCollateralToken,address[] swapPath) addresses,(uint256 sizeDeltaUsd,uint256 initialCollateralDeltaAmount,uint256 triggerPrice,uint256 acceptablePrice,uint256 executionFee,uint256 callbackGasLimit,uint256 minOutputAmount,uint256 validFromTime) numbers,uint8 orderType,uint8 decreasePositionSwapType,bool isLong,bool shouldUnwrapNativeToken,bool autoCancel,bytes32 referralCode,bytes32[] dataList) params) payable returns (bytes32)","function cancelOrder(bytes32 key) payable"]),Xf=new rc(["function getAccountPositions(address dataStore,address account,uint256 start,uint256 end) view returns (bytes)","function getAccountOrders(address dataStore,address account,uint256 start,uint256 end) view returns (bytes)","function getOrder(address dataStore,bytes32 key) view returns (bytes)"]),bA=new rc(["event EventLog1(address msgSender,string eventName,string indexed eventNameHash,bytes32 indexed topic1,((tuple(string key,address value)[] items,tuple(string key,address[] value)[] arrayItems),(tuple(string key,uint256 value)[] items,tuple(string key,uint256[] value)[] arrayItems),(tuple(string key,int256 value)[] items,tuple(string key,int256[] value)[] arrayItems),(tuple(string key,bool value)[] items,tuple(string key,bool[] value)[] arrayItems),(tuple(string key,bytes32 value)[] items,tuple(string key,bytes32[] value)[] arrayItems),(tuple(string key,bytes value)[] items,tuple(string key,bytes[] value)[] arrayItems),(tuple(string key,string value)[] items,tuple(string key,string[] value)[] arrayItems)) eventData)","event EventLog2(address msgSender,string eventName,string indexed eventNameHash,bytes32 indexed topic1,bytes32 indexed topic2,((tuple(string key,address value)[] items,tuple(string key,address[] value)[] arrayItems),(tuple(string key,uint256 value)[] items,tuple(string key,uint256[] value)[] arrayItems),(tuple(string key,int256 value)[] items,tuple(string key,int256[] value)[] arrayItems),(tuple(string key,bool value)[] items,tuple(string key,bool[] value)[] arrayItems),(tuple(string key,bytes32 value)[] items,tuple(string key,bytes32[] value)[] arrayItems),(tuple(string key,bytes value)[] items,tuple(string key,bytes[] value)[] arrayItems),(tuple(string key,string value)[] items,tuple(string key,string[] value)[] arrayItems)) eventData)"]),wA=Object.freeze({OrderCreated:"created",OrderUpdated:"updated",OrderExecuted:"executed",OrderCancelled:"cancelled",OrderFrozen:"frozen"});function Pn(e){let t=Number(e??42161),n=Vf[t];if(!n)throw new Error(`gmx: unsupported chainId ${e} (supported: ${Object.keys(Vf).join(", ")})`);return{chainId:t,...n}}function gi(e,t={}){let n=Pn(e);return(t.baseUrl||n.api).replace(/\/$/,"")}function Ae(e,t){if(!gA(e))throw new Error(`${t} must be a valid EVM address`);return Yf(e)}function H(e){return Yf(e).toLowerCase()}function _n(e,t){let n;try{n=BigInt(String(e))}catch{throw new Error(`${t} must be an integer string`)}if(n<=0n)throw new Error(`${t} must be positive`);return n}function Dt(e,t){let n;try{n=BigInt(String(e??"0"))}catch{throw new Error(`${t} must be an integer string`)}if(n<0n)throw new Error(`${t} must be non-negative`);return n}function xA(e,t=50){let n=Number(e??t);if(!Number.isFinite(n)||n<0||n>100)throw new Error("gmx maxSlippageBps must be 0..100");return Math.floor(n)}function SA(e){let t=String(e||"marketIncrease").trim();if(!(t in Wf))throw new Error(`gmx unsupported orderType ${t}`);if(!["marketIncrease","marketDecrease"].includes(t))throw new Error("gmx prepare currently supports marketIncrease and marketDecrease only");return{key:t,code:Wf[t]}}function kA(e){let t=String(e||"noSwap").trim();if(!(t in Gf))throw new Error(`gmx unsupported decreasePositionSwapType ${t}`);return{key:t,code:Gf[t]}}function vA(e,t){return Array.isArray(e)?e:Array.isArray(e?.[t])?e[t]:[]}function EA(e,t){let n=H(t);return e.find(r=>H(r.marketToken||r.market||r.address)===n)||null}function AA(e,t){let n=H(t);return e.find(r=>H(r.tokenAddress||r.address)===n)||null}function IA({ticker:e,isLong:t,typeKey:n,maxSlippageBps:r}){let o=_n(e?.minPrice,"gmx minPrice"),i=_n(e?.maxPrice,"gmx maxPrice"),s=BigInt(r),a=10000n;return n==="marketIncrease"?(t?i*(a+s)/a:o*(a-s)/a).toString():(t?o*(a-s)/a:i*(a+s)/a).toString()}function _A(e,t){let n=t?e.availableLiquidityLong:e.availableLiquidityShort;try{return BigInt(String(n??"0"))}catch{return 0n}}function PA(e){let t=String(e||"").toLowerCase();return/^0x[0-9a-f]{64}$/.test(t)?`0x${t.slice(-40)}`:null}function Ge(e,t,n=r=>r){let o=Array.from(e?.items||e?.[0]||[]).find(i=>String(i?.key??i?.[0]??"")===t);return o?n(o.value??o[1]):null}function NA(e={}){let t=e.addressItems||e[0],n=e.uintItems||e[1],r=e.boolItems||e[3],o=e.bytes32Items||e[4],i=e.stringItems||e[6];return{account:Ge(t,"account",s=>H(s)),market:Ge(t,"market",s=>H(s)),initialCollateralToken:Ge(t,"initialCollateralToken",s=>H(s)),key:Ge(o,"key",s=>String(s).toLowerCase()),reason:Ge(i,"reason",s=>String(s)),sizeDeltaUsd:Ge(n,"sizeDeltaUsd",s=>BigInt(s).toString()),initialCollateralDeltaAmount:Ge(n,"initialCollateralDeltaAmount",s=>BigInt(s).toString()),executionFee:Ge(n,"executionFee",s=>BigInt(s).toString()),acceptablePrice:Ge(n,"acceptablePrice",s=>BigInt(s).toString()),isLong:Ge(r,"isLong",s=>!!s)}}function CA(e={},t){if(H(e.address)!==H(t.eventEmitter))return null;let n;try{n=bA.parseLog({topics:e.topics,data:e.data})}catch{return null}let r=String(n?.args?.eventName||""),o=wA[r];if(!o)return null;let i=NA(n.args.eventData||{}),s=(i.key||String(n.args.topic1||"")).toLowerCase(),a=i.account||PA(n.args.topic2);return{eventName:r,status:o,orderKey:s,account:a?H(a):null,market:i.market,initialCollateralToken:i.initialCollateralToken,sizeDeltaUsd:i.sizeDeltaUsd,initialCollateralDeltaAmount:i.initialCollateralDeltaAmount,executionFee:i.executionFee,acceptablePrice:i.acceptablePrice,isLong:i.isLong,reason:i.reason,logIndex:e.logIndex==null?null:Number.parseInt(String(e.logIndex),16)}}function Kf(e){return{executed:5,cancelled:4,frozen:3,created:2,updated:1}[e]||0}function TA(e=[],{chainId:t}={}){let n=Pn(t);return(Array.isArray(e)?e:[]).map(r=>CA(r,n)).filter(Boolean).sort((r,o)=>(r.logIndex??0)-(o.logIndex??0))}async function Qf(e={},t={}){return y(`${gi(e.chainId??42161,t)}/markets`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function oc(e={},t={}){return y(`${gi(e.chainId??42161,t)}/markets/info`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function Jf(e={},t={}){return y(`${gi(e.chainId??42161,t)}/tokens`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function yi(e={},t={}){return y(`${gi(e.chainId??42161,t)}/prices/tickers`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function Zf(e={}){let t=await yi({chainId:42161},e);return{ok:Array.isArray(t)&&t.length>0,tickerSample:Array.isArray(t)?t.length:0}}async function eh(e={},t={}){let n=Pn(e.chainId??42161),r=Ae(e.account||e.owner||e.user,"gmx account"),o=Dt(e.start??0,"gmx start"),i=Dt(e.end??e.limit??20,"gmx end"),s=Xf.encodeFunctionData("getAccountPositions",[n.dataStore,r,o,i]),c=await(t.rpcCall||L)(n.chainId,"eth_call",[{to:n.reader,data:s},e.blockTag||"latest"],t);return{provider:"gmx",chainId:n.chainId,reader:H(n.reader),dataStore:H(n.dataStore),account:H(r),raw:c}}async function th(e={},t={}){let n=Pn(e.chainId??42161),r=String(e.key||e.orderKey||"").trim();if(!/^0x[0-9a-fA-F]{64}$/.test(r))throw new Error("gmx order key must be bytes32 hex");let o=Xf.encodeFunctionData("getOrder",[n.dataStore,r]),s=await(t.rpcCall||L)(n.chainId,"eth_call",[{to:n.reader,data:o},e.blockTag||"latest"],t);return{provider:"gmx",chainId:n.chainId,reader:H(n.reader),dataStore:H(n.dataStore),key:r,raw:s}}async function nh(e={},t={}){let n=Pn(e.chainId??42161),r=t.receipt||await so({chainId:n.chainId,txHash:e.txHash,expectedTo:e.expectedTo||n.exchangeRouter},t),o=String(e.txHash||r.txHash||"").toLowerCase();if(r.ok!==!0)return{ok:!1,provider:"gmx",chainId:n.chainId,txHash:o,status:r.status||"unknown",reason:r.reason||"receipt not successful",receipt:r};let i=TA(r.logs||[],{chainId:n.chainId}),s=e.expectedOrderKey||e.orderKey?String(e.expectedOrderKey||e.orderKey).toLowerCase():null,a=s?i.filter(u=>u.orderKey===s):i;if(a.length===0)return{ok:!1,provider:"gmx",chainId:n.chainId,txHash:o,status:"unknown",reason:s?"order key not found in GMX EventEmitter logs":"no GMX order lifecycle event found",events:i,receipt:r};let c=a.reduce((u,d)=>Kf(d.status)>=Kf(u.status)?d:u,a[0]),l=e.expectedAccount||e.account?H(e.expectedAccount||e.account):null;return l&&c.account!==l?{ok:!1,provider:"gmx",chainId:n.chainId,txHash:o,status:c.status,reason:`account mismatch: expected ${l}, got ${c.account||"null"}`,orderKey:c.orderKey,account:c.account,events:i,receipt:r}:{ok:!0,provider:"gmx",chainId:n.chainId,txHash:o,status:c.status,orderKey:c.orderKey,account:c.account,market:c.market,eventEmitter:H(n.eventEmitter),events:a,receipt:r}}async function rh(e={},t={}){let n=Pn(e.chainId??42161),r=SA(e.orderType||e.type),o=kA(e.decreasePositionSwapType),i=Ae(e.account||e.owner||e.from||e.sender||e.receiver,"gmx account"),s=Ae(e.receiver||i,"gmx receiver"),a=Ae(e.cancellationReceiver||s,"gmx cancellationReceiver"),c=e.callbackContract?Ae(e.callbackContract,"gmx callbackContract"):zf,l=e.uiFeeReceiver?Ae(e.uiFeeReceiver,"gmx uiFeeReceiver"):zf,u=Ae(e.market||e.marketToken,"gmx market"),d=Ae(e.initialCollateralToken||e.collateralToken||n.usdc,"gmx initialCollateralToken"),p=r.key==="marketIncrease"?_n(e.initialCollateralDeltaAmount??e.collateralAmount??e.amountIn,"gmx initialCollateralDeltaAmount"):Dt(e.initialCollateralDeltaAmount??e.collateralAmount??"0","gmx initialCollateralDeltaAmount"),m=_n(e.sizeDeltaUsd,"gmx sizeDeltaUsd"),f=_n(e.executionFee,"gmx executionFee"),h=BigInt(String(e.maxExecutionFeeWei??"10000000000000000"));if(f>h)throw new Error("gmx executionFee exceeds maxExecutionFeeWei");let g=BigInt(String(e.maxSizeDeltaUsd??"50000000000000000000000000000000000"));if(m>g)throw new Error("gmx sizeDeltaUsd exceeds maxSizeDeltaUsd");let b=xA(e.maxSlippageBps??e.slippageBps,50),k=e.isLong==null?!0:!!e.isLong,[x,w]=await Promise.all([oc({chainId:n.chainId},t),yi({chainId:n.chainId},t)]),E=EA(vA(x,"markets"),u);if(!E)throw new Error("gmx market not found in public registry");if(E.isListed===!1)throw new Error("gmx market is not listed");let C=Ae(E.indexToken,"gmx market indexToken"),I=Ae(E.longToken,"gmx market longToken"),R=Ae(E.shortToken,"gmx market shortToken"),_=H(d);if(![H(I),H(R)].includes(_))throw new Error("gmx collateral token must match market longToken or shortToken for this guarded slice");let v=_A(E,k);if(v>0n&&m>v)throw new Error("gmx sizeDeltaUsd exceeds available market liquidity");let q=AA(w,C);if(!q)throw new Error("gmx index ticker not found");let ge=e.acceptablePrice?_n(e.acceptablePrice,"gmx acceptablePrice").toString():IA({ticker:q,isLong:k,typeKey:r.key,maxSlippageBps:b}),Ce=(e.swapPath||[]).map(X=>Ae(X,"gmx swapPath market"));if(Ce.length>3)throw new Error("gmx swapPath too long for guarded slice");let Wn=Dt(e.triggerPrice??"0","gmx triggerPrice"),Jt=Dt(e.callbackGasLimit??"0","gmx callbackGasLimit"),Gn=Dt(e.minOutputAmount??"0","gmx minOutputAmount"),ot=Dt(e.validFromTime??"0","gmx validFromTime"),it=!!e.shouldUnwrapNativeToken,Kn=e.autoCancel==null?!0:!!e.autoCancel,Yn=String(e.referralCode||yA);if(!/^0x[0-9a-fA-F]{64}$/.test(Yn))throw new Error("gmx referralCode must be bytes32 hex");let Zt=Array.isArray(e.dataList)?e.dataList:[];for(let X of Zt)if(!/^0x[0-9a-fA-F]{64}$/.test(String(X)))throw new Error("gmx dataList entries must be bytes32 hex");let ks={addresses:{receiver:s,cancellationReceiver:a,callbackContract:c,uiFeeReceiver:l,market:u,initialCollateralToken:d,swapPath:Ce},numbers:{sizeDeltaUsd:m,initialCollateralDeltaAmount:p,triggerPrice:Wn,acceptablePrice:BigInt(ge),executionFee:f,callbackGasLimit:Jt,minOutputAmount:Gn,validFromTime:ot},orderType:r.code,decreasePositionSwapType:o.code,isLong:k,shouldUnwrapNativeToken:it,autoCancel:Kn,referralCode:Yn,dataList:Zt},N=[];r.key==="marketIncrease"&&p>0n&&N.push(hi.encodeFunctionData("sendTokens",[d,n.orderVault,p])),N.push(hi.encodeFunctionData("sendWnt",[n.orderVault,f])),N.push(hi.encodeFunctionData("createOrder",[ks]));let $=hi.encodeFunctionData("multicall",[N]),F={mode:"gmx-order",provider:"gmx",chainId:n.chainId,chain:n.name,orderType:r.key,orderTypeCode:r.code,decreasePositionSwapType:o.key,account:H(i),receiver:H(s),exchangeRouter:H(n.exchangeRouter),router:H(n.router),orderVault:H(n.orderVault),market:H(u),indexToken:H(C),initialCollateralToken:H(d),initialCollateralDeltaAmount:p.toString(),sizeDeltaUsd:m.toString(),executionFee:f.toString(),acceptablePrice:ge,maxSlippageBps:b,isLong:k,asyncExecution:!0,issuedAtMs:Number(t.nowMs??Date.now())};return O({provider:"gmx",chainId:n.chainId,chain:n.name,orderReady:!0,executionReady:!1,asyncExecution:!0,orderType:r.key,market:H(u),requiresApproval:r.key==="marketIncrease"&&p>0n?{token:H(d),spender:H(n.router),amount:p.toString()}:null,gmxGuard:F,transaction:{chainId:n.chainId,from:H(i),to:H(n.exchangeRouter),data:$,value:f.toString(),gmxGuard:F}},{provider:"gmx",kind:"gmx-order"})}T();import{Interface as RA,getAddress as $A,isAddress as LA,keccak256 as oh,toUtf8Bytes as ih}from"ethers";W();var MA="https://api.morpho.org/graphql",bi=new RA(["function asset() view returns (address)","function maxDeposit(address owner) view returns (uint256)","function previewDeposit(uint256 assets) view returns (uint256)","function deposit(uint256 assets,address receiver) returns (uint256)","function maxWithdraw(address owner) view returns (uint256)","function previewWithdraw(uint256 assets) view returns (uint256)","function withdraw(uint256 assets,address receiver,address owner) returns (uint256)"]),UA=(e={})=>e.baseUrl||process.env.MORPHO_API_URL||MA;async function sc(e,t,n={}){return y(UA(n),{method:"POST",body:{query:e,variables:t},fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs??2e4})}var BA="query Markets($first: Int, $where: MarketFilters) { markets(first: $first, where: $where) { items { marketId lltv listed loanAsset { address symbol decimals } collateralAsset { address symbol decimals } state { supplyAssetsUsd borrowAssetsUsd } } } }",DA="query Vaults($first: Int, $where: VaultFilters) { vaults(first: $first, where: $where) { items { address name symbol listed asset { address symbol decimals } state { totalAssets totalAssetsUsd apy } } } }";function Cr(e,t){let n=String(e||"").trim();if(!LA(n))throw new Error(`morpho: ${t} must be an address`);return $A(n).toLowerCase()}function FA(e,t="amount"){try{let n=BigInt(String(e));if(n<=0n)throw new Error("nonpositive");return n.toString()}catch{throw new Error(`morpho: ${t} must be a positive integer string`)}}function ic(e){return Array.isArray(e)?`[${e.map(ic).join(",")}]`:e&&typeof e=="object"?`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${ic(e[t])}`).join(",")}}`:JSON.stringify(e)}async function Tr(e,t,n,r,o={}){let i=bi.encodeFunctionData(n,r),a=await(o.rpcCall||L)(Number(e),"eth_call",[{to:t,data:i},"latest"],o);return bi.decodeFunctionResult(n,a)}function qA(e,t){let n=t.toLowerCase();return(e||[]).find(r=>String(r?.address||"").toLowerCase()===n)||null}async function sh(e={},t={}){let n=Math.min(100,Math.max(1,Number(e.first||20))),r=(e.chainIds||[e.chainId||1]).map(Number);return sc(BA,{first:n,chainIds:r,where:{chainId_in:r}},t)}async function ac(e={},t={}){let n=Math.min(100,Math.max(1,Number(e.first||20))),r=(e.chainIds||[e.chainId||1]).map(Number);return sc(DA,{first:n,chainIds:r,where:{chainId_in:r}},t)}async function ah(e={}){return{ok:(await sc("query { __typename }",{},e))?.data?.__typename==="Query"}}async function ch(e={},t={}){let n=Number(e.chainId??8453),r=String(e.action||"deposit").toLowerCase();if(!["deposit","withdraw"].includes(r))throw new Error("morpho: action must be deposit or withdraw");let o=Cr(e.vault||e.vaultAddress,"vault"),i=Cr(e.owner||e.from||e.sender,"owner"),s=Cr(e.receiver||i,"receiver"),a=FA(e.amount||e.assets,"amount"),c=Number(e.minTotalAssetsUsd??1e5),l=await ac({chainId:n,first:100},t),u=qA(l?.data?.vaults?.items,o);if(!u)throw new Error("morpho: vault not found in public Morpho vault registry");if(u.listed===!1)throw new Error("morpho: vault is not listed");let d=Number(u?.state?.totalAssetsUsd??0);if(Number.isFinite(c)&&d<c)throw new Error(`morpho: vault totalAssetsUsd ${d} below minimum ${c}`);let[p]=await Tr(n,o,"asset",[],t),m=Cr(p,"vault asset");if((u?.asset?.address?Cr(u.asset.address,"api vault asset"):m)!==m)throw new Error("morpho: API asset and on-chain asset mismatch");let h,g;if(r==="deposit"){let[k]=await Tr(n,o,"maxDeposit",[i],t);if(BigInt(a)>BigInt(k.toString()))throw new Error("morpho: amount exceeds maxDeposit");let[x]=await Tr(n,o,"previewDeposit",[a],t);if(BigInt(x.toString())<=0n)throw new Error("morpho: previewDeposit returned zero shares");g={minSharesOut:x.toString()},h=bi.encodeFunctionData("deposit",[a,s])}else{let[k]=await Tr(n,o,"maxWithdraw",[i],t);if(BigInt(a)>BigInt(k.toString()))throw new Error("morpho: amount exceeds maxWithdraw");let[x]=await Tr(n,o,"previewWithdraw",[a],t);if(BigInt(x.toString())<=0n)throw new Error("morpho: previewWithdraw returned zero shares");g={maxSharesIn:x.toString()},h=bi.encodeFunctionData("withdraw",[a,s,i])}let b={mode:"erc4626-vault",version:1,provider:"morpho",chainId:n,action:r,vault:o,asset:m,owner:i,receiver:s,amount:a,totalAssetsUsd:d,...g,calldataHash:oh(ih(h)),issuedAtMs:Date.now(),expiresAtMs:Date.now()+2e4};return b.guardHash=oh(ih(ic(b))),O({provider:"morpho",protocol:"erc4626-vault",vaultReady:!0,executionReady:!1,signingReady:!1,broadcastReady:!1,requiresUserSignature:!0,chainId:n,action:r,vault:o,asset:m,owner:i,receiver:s,amount:a,vaultInfo:u,vaultGuard:b,requiresApproval:r==="deposit"?{token:m,spender:o,amount:a}:null,transaction:{chainId:n,from:i,to:o,data:h,value:"0x0",madVault:b}},{provider:"morpho",kind:"erc4626-vault"})}T();import{Interface as jA,getAddress as cc,isAddress as VA}from"ethers";me();W();var zA="https://api-v3.balancer.fi/",WA=(e={})=>e.baseUrl||process.env.BALANCER_API_URL||zA;async function dh(e,t,n={}){return y(WA(n),{method:"POST",body:{query:e,variables:t},fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs??2e4})}var GA="query Pools($first: Int, $where: GqlPoolFilter) { poolGetPools(first: $first, where: $where) { id address chain type protocolVersion dynamicData { totalLiquidity volume24h fees24h } } }",lh=Object.freeze({1:{name:"ethereum",router:"0xAE563E3f8219521950555F5962419C8919758Ea2",weth:"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",usdc:"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48"},10:{name:"optimism",router:"0xe2fa4e1d17725e72dcdAfe943Ecf45dF4B9E285b",weth:"0x4200000000000000000000000000000000000006",usdc:"0x0b2c639c533813f4aa9d7837caf62653d097ff85"},8453:{name:"base",router:"0x3f170631ed9821Ca51A59D996aB095162438DC10",weth:"0x4200000000000000000000000000000000000006",usdc:"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"},42161:{name:"arbitrum",router:"0xEAedc32a51c510d35ebC11088fD5fF2b47aACF2E",weth:"0x82aF49447D8a07e3bd95BD0d56f35241523fBab1",usdc:"0xaf88d065e77c8cC2239327C5EDb3A432268e5831"},43114:{name:"avalanche",router:"0xF39CA6ede9BF7820a952b52f3c94af526bAB9015",weth:"0xB31f66AA3C1e785363F0875A1B74E27b85FD66c7",usdc:"0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E"}}),KA="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",YA="0x0000000000000000000000000000000000000000",lc=new jA(["function querySwapSingleTokenExactIn(address pool,address tokenIn,address tokenOut,uint256 exactAmountIn,address sender,bytes userData) returns (uint256 amountOut)","function swapSingleTokenExactIn(address pool,address tokenIn,address tokenOut,uint256 exactAmountIn,uint256 minAmountOut,uint256 deadline,bool wethIsEth,bytes userData) payable returns (uint256 amountOut)"]);function ph(e){let t=Number(e??8453),n=lh[t];if(!n)throw new Error(`balancer-v3: unsupported chainId ${e} (supported: ${Object.keys(lh).join(", ")})`);return{chainId:t,...n}}function mh(e){let t=String(e||"").toLowerCase();return!t||t==="eth"||t==="native"||t===YA||t===KA.toLowerCase()}function wi(e,t){if(!VA(e))throw new Error(`${t} must be a valid EVM address`);return cc(e)}function uh(e,t,n){let r=String(e||"");return mh(r)||/^weth$/i.test(r)?cc(t.weth):/^usdc$/i.test(r)?cc(t.usdc):wi(r,n)}function XA(e,t){let n;try{n=BigInt(String(e))}catch{throw new Error(`${t} must be an integer string`)}if(n<=0n)throw new Error(`${t} must be positive`);return n}function fh(e){if(e==null||e==="")return"0x";let t=String(e);if(!/^0x[0-9a-fA-F]*$/.test(t))throw new Error("balancer userData must be hex");return t}async function hh(e={},t={}){let n=Math.min(100,Math.max(1,Number(e.first||20))),r=(e.chains||[e.chain||"ETHEREUM"]).map(o=>String(o).toUpperCase());return dh(GA,{first:n,chains:r,where:{chainIn:r}},t)}async function gh(e={}){return{ok:(await dh("query { __typename }",{},e))?.data?.__typename==="Query"}}async function uc(e={},t={}){let n=ph(e.chainId),r=wi(e.pool,"balancer pool"),o=e.tokenIn||"WETH",i=uh(o,n,"balancer tokenIn"),s=uh(e.tokenOut||"USDC",n,"balancer tokenOut"),a=XA(e.amountIn,"balancer amountIn"),c=wi(e.sender||e.from||e.fromAddress||e.recipient,"balancer sender"),l=lc.encodeFunctionData("querySwapSingleTokenExactIn",[r,i,s,a,c,fh(e.userData)]),d=await(t.rpcCall||L)(n.chainId,"eth_call",[{to:n.router,data:l},e.blockTag||"latest"],t),p=lc.decodeFunctionResult("querySwapSingleTokenExactIn",d),m=BigInt(p[0]);if(m<=0n)throw new Error("balancer quote returned zero output");return V({venue:"balancer",protocolVersion:3,chainId:n.chainId,chain:n.name,router:n.router,pool:r,tokenIn:i,tokenOut:s,amountIn:a.toString(),amountOut:m.toString()},{chainId:n.chainId,venue:n.router,amountOut:m.toString(),liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps})}async function yh(e={},t={}){let n=ph(e.chainId),r=wi(e.sender||e.from||e.fromAddress||e.recipient,"balancer sender"),o=e.tokenIn||"WETH",i=mh(o),s=await uc({...e,sender:r},t),a=Math.min(600,Math.max(30,Number(e.deadlineSeconds??300))),c=Number(t.nowSeconds??Math.floor(Date.now()/1e3)),l=BigInt(c+a),u=e.wethIsEth!=null?!!e.wethIsEth:i,d=lc.encodeFunctionData("swapSingleTokenExactIn",[s.pool,s.tokenIn,s.tokenOut,BigInt(s.amountIn),BigInt(s.amountOutMinimum),l,u,fh(e.userData)]);return O({provider:"balancer",calldataReady:!0,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:n.chainId,deadline:l.toString(),quote:s,autoSlippage:s.autoSlippage,requiresApproval:i?null:{token:s.tokenIn,spender:n.router,amount:s.amountIn},transaction:{chainId:n.chainId,from:r,to:n.router,data:d,value:i?s.amountIn:"0",slippageGuard:J(s.autoSlippage,{chainId:n.chainId,venue:n.router,data:d})}},{provider:"balancer",kind:"balancer-tx"})}T();me();W();import{getAddress as JA}from"ethers";var ZA="https://api-v2.pendle.finance/core",eI=Object.freeze({42161:"0x888888888889758F76e7103c6CbF23ABbF58F946",8453:"0x888888888889758F76e7103c6CbF23ABbF58F946"}),tI="0x0000000000000000000000000000000000000000",nI="0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee",bh=(e={})=>(e.baseUrl||process.env.PENDLE_API_URL||ZA).replace(/\/$/,"");function xi(e,t){try{return JA(e)}catch{throw new Error(`${t} must be a valid EVM address`)}}function Nn(e,t){return xi(e,t).toLowerCase()}function rI(e){let t=String(e||"").toLowerCase();return t==="native"||t==="eth"||t===nI||t===tI}function dc(e,t){let n;try{n=BigInt(String(e))}catch{throw new Error(`${t} must be an integer string`)}if(n<=0n)throw new Error(`${t} must be positive`);return n.toString()}function oI(e){if(!Array.isArray(e)||e.length===0)throw new Error("pendle convert requires inputs[]");return e.map((t,n)=>({token:xi(t.token,`pendle input ${n} token`),amount:dc(t.amount,`pendle input ${n} amount`)}))}function iI(e){if(!Array.isArray(e)||e.length===0)throw new Error("pendle convert requires outputs[]");return e.map((t,n)=>xi(t,`pendle output ${n} token`))}function sI(e){let t=eI[Number(e)];if(!t)throw new Error(`Pendle prepare not enabled for chainId ${e}`);return t}function aI(e){let t=e?.routes?.[0]?.outputs?.[0]?.amount||e?.outputs?.[0]?.amount;if(!t)throw new Error("Pendle convert response missing output amount");return dc(t,"pendle output amount")}function cI(e,t){let n=(Array.isArray(e)?e:[]).filter(r=>r?.token&&r?.amount&&!rI(r.token)).map(r=>({token:Nn(r.token,"pendle approval token"),spender:Nn(t,"pendle approval spender"),amount:dc(r.amount,"pendle approval amount")}));return n.length?n.length===1?n[0]:n:null}async function pc(e={},t={}){let n=Number(e.chainId||42161),r=new URLSearchParams({limit:String(Math.min(100,Math.max(1,Number(e.limit||20)))),skip:String(Math.max(0,Number(e.skip||0)))});return e.isExpired!=null&&r.set("isExpired",String(!!e.isExpired)),y(`${bh(t)}/v1/${n}/markets?${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function wh(e={}){let t=await pc({chainId:42161,limit:1},e);return{ok:Array.isArray(t?.results),marketSample:t?.results?.length||0}}async function mc(e={},t={}){let n=Number(e.chainId??42161),r=sI(n),o=e.from||e.fromAddress||e.userAddress||e.taker||e.receiver;if(!o)throw new Error("pendlePrepare requires from/receiver");let i=xi(e.receiver||o,"pendle receiver"),s=oI(e.inputs),a=iI(e.outputs);if(e.enableAggregator===!0||Array.isArray(e.aggregators)&&e.aggregators.length)throw new Error("Pendle aggregator paths are disabled by policy; use direct convert only");let c=pe({liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps});if(!c.executable)throw new Error(`Pendle: route requires ${c.requiredBps} bps above cap ${c.capBps}`);let l={receiver:i,slippage:c.selectedBps/1e4,enableAggregator:!1,useLimitOrder:!1,inputs:s,outputs:a,...e.redeemRewards!=null?{redeemRewards:!!e.redeemRewards}:{},...e.needScale!=null?{needScale:!!e.needScale}:{},...e.additionalData?{additionalData:String(e.additionalData)}:{}},u=await y(`${bh(t)}/v3/sdk/${n}/convert`,{method:"POST",body:l,fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??25e3}),p=u?.routes?.[0]?.tx;if(!p?.to||!p?.data)throw new Error("Pendle convert returned no executable tx");if(Nn(p.to,"pendle tx target")!==Nn(r,"pendle router"))throw new Error("Pendle convert returned unexpected router target");if(p.from&&Nn(p.from,"pendle tx sender")!==Nn(o,"pendle sender"))throw new Error("Pendle convert transaction sender mismatch");let m=aI(u),f=V(u,{chainId:n,venue:p.to,amountOut:m,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps});return O({provider:"pendle",calldataReady:!0,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:n,action:u.action||null,quote:f,autoSlippage:f.autoSlippage,requiresApproval:cI(u.requiredApprovals,p.to),transaction:{chainId:n,from:p.from||o,to:p.to,data:p.data,value:p.value??"0x0",slippageGuard:J(f.autoSlippage,{chainId:n,venue:p.to,data:p.data})}},{provider:"pendle",kind:"pendle-swap"})}async function xh(e={},t={}){let n=await mc(e,t),{transaction:r,...o}=n;return o}T();me();W();import{isAddress as uI}from"ethers";var dI="https://api.odos.xyz",fc=(e={})=>(e.baseUrl||process.env.ODOS_API_URL||dI).replace(/\/$/,"");async function hc(e={}){return y(`${fc(e)}/info/chains`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs})}function pI(e={}){let t=Number(e.chainId);if(!Number.isInteger(t))throw new Error("odos: chainId required");if(!Array.isArray(e.inputTokens)||e.inputTokens.length<1)throw new Error("odos: inputTokens[] required");if(!Array.isArray(e.outputTokens)||e.outputTokens.length!==1)throw new Error("odos: agentic execution currently requires exactly one output token");if(!uI(String(e.userAddr||"")))throw new Error("odos: valid userAddr required");return t}async function Sh(e={},t={}){let n=pI(e),r=pe({liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps});if(!r.executable)throw new Error(`odos: route requires ${r.requiredBps} bps above cap ${r.capBps}`);let o={chainId:n,inputTokens:e.inputTokens,outputTokens:e.outputTokens,userAddr:e.userAddr,slippageLimitPercent:r.selectedBps/100,disableRFQs:e.disableRFQs??!0,compact:e.compact??!0,simple:e.simple??!1},i=await y(`${fc(t)}/sor/quote/v3`,{method:"POST",body:o,fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??25e3}),s=i?.outAmounts?.[0];if(!i?.pathId||!s)throw new Error("odos: quote missing pathId or outAmounts[0]");return{chainId:n,selected:r,quote:i,amountOut:s}}async function kh(e={},t={}){let{chainId:n,quote:r,amountOut:o}=await Sh(e,t);return{...V(r,{chainId:n,venue:"odos-quote",amountOut:o,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps}),executionReady:!1,executionBlocker:"call prepare to assemble and simulate the path"}}async function vh(e={},t={}){let{chainId:n,quote:r,amountOut:o}=await Sh(e,t),i=await y(`${fc(t)}/sor/assemble`,{method:"POST",body:{userAddr:e.userAddr,pathId:r.pathId,simulate:!0,...e.receiver?{receiver:e.receiver}:{}},fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??3e4}),s=i?.transaction;if(!s?.to||!s?.data)throw new Error("odos: assemble returned no executable transaction");if(Number(s.chainId??n)!==n)throw new Error("odos: transaction chain mismatch");if(s.from&&String(s.from).toLowerCase()!==String(e.userAddr).toLowerCase())throw new Error("odos: transaction sender mismatch");if(i?.simulation?.isSuccess!==!0)throw new Error(`odos: assembled transaction simulation failed: ${i?.simulation?.simulationError||"unknown"}`);let a=V(r,{chainId:n,venue:s.to,amountOut:o,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps}),c=i?.simulation?.amountsOut?.[0];if(c!=null&&BigInt(c)<BigInt(a.amountOutMinimum))throw new Error("odos: simulation output is below the bounded automatic floor");let l="0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee",u="0x0000000000000000000000000000000000000000",d=e.inputTokens.filter(p=>![l,u].includes(String(p.tokenAddress).toLowerCase())).map(p=>({token:p.tokenAddress,spender:s.to,amount:String(p.amount)}));return O({provider:"odos",calldataReady:!0,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:n,quote:a,simulation:i.simulation,requiresApproval:d,autoSlippage:a.autoSlippage,transaction:{chainId:n,from:s.from||e.userAddr,to:s.to,data:s.data,value:s.value??"0x0",...s.gas!=null?{gasLimit:s.gas}:{},...s.nonce!=null?{nonce:s.nonce}:{},slippageGuard:J(a.autoSlippage,{chainId:n,venue:s.to,data:s.data})}},{provider:"odos",kind:"odos-tx"})}async function Eh(e={}){let t=await hc(e);return{ok:Array.isArray(t?.chains)&&t.chains.length>0,chainCount:t?.chains?.length||0}}T();var Ah=/[\u200B-\u200F\u202A-\u202E\u2060-\u2064\uFEFF]/g,fI=/[<>&`*_~[\]()|\\]/g,hI=/[\u0000-\u001F\u007F]/g;function gc(e,{max:t=32,fallback:n=""}={}){return e==null?n:String(e).normalize("NFKC").replace(Ah,"").replace(hI,"").replace(fI,"").replace(/\s+/g," ").trim().slice(0,t).trim()||n}function yc(e){if(e==null)return!1;let t=String(e);return Ah.test(t)?!0:/[\u0400-\u04FF\u0370-\u03FF]/.test(t)&&/[A-Za-z]/.test(t)}var Ih=Object.freeze({1:"https://eth.blockscout.com",10:"https://explorer.optimism.io",137:"https://polygon.blockscout.com",324:"https://zksync.blockscout.com",8453:"https://base.blockscout.com",42161:"https://arbitrum.blockscout.com",534352:"https://scrollscan.com"});function Si(e,t={}){let n=Number(e),r=t.baseUrl||Ih[n];if(!r)throw new Error(`Blockscout not configured for chainId ${n}`);return r.replace(/\/$/,"")}function _h(e){return!!Ih[Number(e)]}async function bc(e={},t={}){return y(`${Si(e.chainId||1,t)}/api/v2/stats`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3})}async function Ph(e={},t={}){if(!e.address)throw new Error("address required");return y(`${Si(e.chainId||1,t)}/api/v2/addresses/${encodeURIComponent(e.address)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3})}async function Nh(e={},t={}){if(!e.address&&!e.tokenAddress)throw new Error("token address required");return y(`${Si(e.chainId||1,t)}/api/v2/tokens/${encodeURIComponent(e.address||e.tokenAddress)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3})}async function Ch(e={},t={}){if(!e.address)throw new Error("address required");let n=Number(e.chainId||1),r=`${Si(n,t)}/api/v2/addresses/${encodeURIComponent(e.address)}/token-balances`,o=await y(r,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??18e3,headers:{accept:"application/json","user-agent":"OraclePortfolio/1.0"}});return Array.isArray(o)?o:[]}function Th(e=[],{fungibleOnly:t=!0}={}){let n=[];for(let r of e){if(!r||typeof r!="object")continue;let o=r.token&&typeof r.token=="object"?r.token:{},i=String(o.type||r.token_type||"").toUpperCase();if(t&&i&&!i.includes("ERC-20")&&i!=="ERC20")continue;let s=o.address_hash||o.address||r.token_address||r.tokenAddress||null;if(!s||typeof s!="string")continue;let a=String(r.value??r.balance??"0").replace(/^0x/i,"");if(!/^\d+$/.test(a)||a==="0")continue;let c=o.decimals??r.decimals;typeof c=="string"&&/^\d+$/.test(c)&&(c=Number(c)),(typeof c!="number"||!Number.isInteger(c)||c<0||c>36)&&(c=18);let l=gc(o.symbol||o.name,{max:32,fallback:"TOKEN"}),u=gc(o.name,{max:80,fallback:""})||null;n.push({address:s.toLowerCase().startsWith("0x")?s:`0x${s}`,symbol:l,name:u,decimals:c,amountRaw:a,tokenType:i||"ERC-20",source:"blockscout",verification:"indexer-reported",displaySuspicious:yc(o.symbol)||yc(o.name)||void 0})}return n}async function Oh(e={}){let t=await bc({chainId:8453},e);return{ok:t?.total_blocks!=null||t?.total_transactions!=null,chainId:8453}}import{getAddress as yI}from"ethers";T();var bI="TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb",$h=Object.freeze({ETH:"coingecko:ethereum",POL:"coingecko:polygon-ecosystem-token",BNB:"coingecko:binancecoin",AVAX:"coingecko:avalanche-2",HYPE:"coingecko:hyperliquid",USDT0:"coingecko:tether",SOL:"coingecko:solana",BTC:"coingecko:bitcoin"});function ht(e={},t){return{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs,env:e.env,...e[t]||{}}}function ki(e,...t){for(let n of t){let r=String(e?.[n]||"").trim();if(r)return r}return null}function Rh(e){if(!e)return null;try{return yI(String(e).trim().toLowerCase())}catch{throw new Error("portfolio: EVM address must be a valid 20-byte address")}}function Ft(e={},t=process.env){let n=e.addresses||{},r=Rh(n.evm||e.evmAddress||ki(t,"ORACLE_EVM_ADDRESS","ORACLE_DEFAULT_ADDRESS","MAD_OPERATOR_ADDRESS")),o=n.solana||e.solanaAddress||ki(t,"ORACLE_SOLANA_ADDRESS"),i=n.bitcoin||e.bitcoinAddress||ki(t,"ORACLE_BITCOIN_ADDRESS"),s=Rh(n.hyperliquid||e.hyperliquidAddress||ki(t,"ORACLE_HYPERLIQUID_ADDRESS")||r);return{evm:r,solana:o?K(o,"portfolio Solana address"):null,bitcoin:i?Ze(i,"portfolio Bitcoin address"):null,hyperliquid:s}}function Or(e,t){let n=BigInt(String(e||"0")),r=Number(t);if(!Number.isInteger(r)||r<0||r>36)throw new Error("portfolio: decimals must be an integer from 0 to 36");if(r===0)return n.toString();let o=n<0n,i=o?-n:n,s=10n**BigInt(r),a=i/s,c=String(i%s).padStart(r,"0").replace(/0+$/,"");return`${o?"-":""}${a}${c?`.${c}`:""}`}function Cn(e){let t=Number(e);return Number.isFinite(t)?t:null}function vi(e){return Number.isFinite(e)?Number(e.toFixed(2)):null}function gt(e){let t=Number(e);return Number.isFinite(t)&&t!==0}function Lh(e,t){let n=$h[t],r=n?e?.coins?.[n]:null,o=Number(r?.price);return{key:n||null,priceUsd:Number.isFinite(o)?o:null,timestamp:r?.timestamp??null,confidence:r?.confidence??null}}function wI(e){let t=new Map;for(let n of e)if(n?.ok)for(let r of n.data?.accounts||[]){let o=BigInt(String(r.amount||"0"));if(o===0n||!r.mint)continue;let i=`${r.mint}:${r.decimals??"unknown"}`,s=t.get(i)||{mint:r.mint,amountRaw:0n,decimals:r.decimals??null,programs:new Set,accounts:0};s.amountRaw+=o,s.accounts+=1,n.program&&s.programs.add(n.program),t.set(i,s)}return[...t.values()].map(n=>{let r=n.amountRaw.toString(),o=n.decimals==null?null:Or(r,n.decimals),i=n.decimals===0&&n.amountRaw===1n;return{mint:n.mint,amountRaw:r,amount:o,decimals:n.decimals,tokenPrograms:[...n.programs],accountCount:n.accounts,verification:"unverified",classification:i?"collectible-candidate":"fungible-or-unclassified",priceUsd:null,usdValue:null}})}function wc(e,t){return{family:e,status:"unsupported",reason:t}}function xc(e,t){if(!e||e.status!=="ok")return e;let n=Lh(t,e.symbol),r=Cn(e.amount),o=r!=null&&n.priceUsd!=null?vi(r*n.priceUsd):null;return{...e,price:n,usdValue:o}}async function Mh(e={}){let t=Ft({},e.env||process.env);return{ok:!0,provider:"portfolio",readOnly:!0,configuredFamilies:Object.entries(t).filter(([,n])=>!!n).map(([n])=>n)}}async function Ei(e={},t={}){let n=new Date().toISOString(),r=Ft(e,t.env||process.env),o=e.includePrices!==!1,i=e.includeTokens!==!1,s=e.includeCollectibles!==!1,a=new Map(ct.map(N=>[N.chainId,N])),c=Array.isArray(e.evmChainIds)&&e.evmChainIds.length?[...new Set(e.evmChainIds.map(Number))]:[...a.keys()],l=[...new Set(Object.values($h))],u=o?ne(()=>Re(l,ht(t,"prices"))):Promise.resolve({ok:!1,ms:0,error:"price lookup disabled"}),d=en(c,e.concurrency||5,async N=>{let $=a.get(N);if(!$)return{family:"evm",chainId:N,name:null,address:r.evm,status:"unsupported",error:"chainId is not in Oracle's configured EVM registry"};if(!r.evm)return{family:"evm",chainId:N,name:$.name,address:null,status:"not-configured",error:"set ORACLE_EVM_ADDRESS or pass addresses.evm"};let F={...ht(t,"evm"),rpcUrl:e.rpcUrls?.[N]||t.evm?.rpcUrls?.[N]},X=await ne(()=>tn(N,r.evm,F));if(!X.ok)return{family:"evm",chainId:N,name:$.name,address:r.evm,status:"unavailable",latencyMs:X.ms,error:X.error};let ie=$.nativeCurrency?.decimals??18,ye=$.nativeCurrency?.symbol||"NATIVE",U=X.data.balanceWei,ee={status:i?"unavailable":"not-requested",assets:[],reason:i?"EVM JSON-RPC cannot enumerate wallet tokens without an address indexer":"token discovery disabled"};if(i&&_h(N)){let Tt=await ne(()=>Ch({chainId:N,address:r.evm},{...ht(t,"blockscout"),timeoutMs:t.timeoutMs??18e3}));Tt.ok?ee={status:"ok",assets:Th(Tt.data,{fungibleOnly:!0}).map(Xn=>{let Qn=Or(Xn.amountRaw,Xn.decimals);return{...Xn,amount:Qn,priceUsd:null,usdValue:null}}),reason:null,source:"blockscout",latencyMs:Tt.ms}:ee={status:"unavailable",assets:[],reason:Tt.error||"blockscout token-balances failed",source:"blockscout",latencyMs:Tt.ms}}return{family:"evm",chainId:N,name:$.name,address:r.evm,status:"ok",latencyMs:X.ms,native:{status:"ok",symbol:ye,amountRaw:U,decimals:ie,amount:Or(U,ie)},fungibleTokens:ee,collectibles:{status:s?"unavailable":"not-requested",assets:[],reason:s?"EVM JSON-RPC cannot enumerate wallet NFTs without an address indexer":"collectible discovery disabled"},source:ee.source==="blockscout"?"evm-rpc+blockscout":"evm-rpc"}}),p=(async()=>{if(!r.solana)return{family:"solana",name:"Solana Mainnet",address:null,status:"not-configured",error:"set ORACLE_SOLANA_ADDRESS or pass addresses.solana"};let N=ht(t,"solana"),$=await ne(()=>vo({address:r.solana},N)),F=i||s?await Promise.all([ne(()=>pr({owner:r.solana,programId:ta},N)).then(ee=>({...ee,program:"spl-token"})),ne(()=>pr({owner:r.solana,programId:bI},N)).then(ee=>({...ee,program:"token-2022"}))]):[],X=wI(F),ie=X.filter(ee=>ee.classification==="collectible-candidate"),ye=X.filter(ee=>ee.classification!=="collectible-candidate"),U=F.filter(ee=>!ee.ok).map(ee=>ee.error);return{family:"solana",name:"Solana Mainnet",address:r.solana,status:$.ok||F.some(ee=>ee.ok)?"ok":"unavailable",native:$.ok?{status:"ok",symbol:"SOL",amountRaw:$.data.lamports,decimals:9,amount:Or($.data.lamports,9),slot:$.data.slot}:{status:"unavailable",symbol:"SOL",error:$.error},fungibleTokens:{status:i?U.length===F.length?"unavailable":U.length?"partial":"ok":"not-requested",assets:i?ye:[],errors:U,note:"SPL accounts are unverified until a metadata/indexer source confirms symbol and spam status"},collectibles:{status:s?U.length===F.length?"unavailable":"partial":"not-requested",assets:s?ie:[],errors:U,note:"decimals=0 and amount=1 is only a collectible candidate, not verified NFT metadata"},source:"solana-rpc"}})(),m=(async()=>{if(!r.bitcoin)return{family:"bitcoin",name:"Bitcoin Mainnet",address:null,status:"not-configured",error:"set ORACLE_BITCOIN_ADDRESS or pass addresses.bitcoin"};let N=ht(t,"bitcoin"),$=ht(t,"bitcoinMeta"),[F,X,ie]=await Promise.all([ne(()=>Ao({address:r.bitcoin},N)),i?ne(()=>_o({address:r.bitcoin},$)):Promise.resolve({ok:!1,ms:0,error:"token discovery disabled"}),s?ne(()=>ln({address:r.bitcoin},$)):Promise.resolve({ok:!1,ms:0,error:"collectible discovery disabled"})]),ye=X.ok?X.data:null,U=ie.ok?ie.data:null;return{family:"bitcoin",name:"Bitcoin Mainnet",address:r.bitcoin,status:F.ok||ye?.ok||U?.ok?"ok":"unavailable",native:F.ok?{status:"ok",symbol:"BTC",amountRaw:F.data.balanceSats,decimals:8,amount:Or(F.data.balanceSats,8)}:{status:"unavailable",symbol:"BTC",error:F.error},fungibleTokens:{status:i?ye?.ok?"ok":"unavailable":"not-requested",assets:ye?.balances||[],error:ye?.ok?null:ye?.error||X.error,verification:"indexer-reported"},collectibles:{status:s?U?.ok?"ok":"unavailable":"not-requested",assets:U?.inscriptions||[],error:U?.ok?null:U?.error||ie.error,unknownNotEmpty:!!U?.unknownNotEmpty,verification:"indexer-reported"},source:"bitcoin-esplora+bitcoin-meta"}})(),f=(async()=>{if(!r.hyperliquid)return{family:"hyperliquid",name:"Hyperliquid HyperCore",address:null,status:"not-configured",error:"set ORACLE_HYPERLIQUID_ADDRESS or pass addresses.hyperliquid"};let N=ht(t,"hyperliquid"),[$,F,X]=await Promise.all([ne(()=>bo(r.hyperliquid,N)),ne(()=>xo(r.hyperliquid,N)),ne(()=>Je(N))]),ie=($.ok&&Array.isArray($.data?.balances)?$.data.balances:[]).filter(U=>gt(U.total)||gt(U.hold)).map(U=>({coin:U.coin||null,total:String(U.total??"0"),hold:String(U.hold??"0"),priceUsd:null,usdValue:null})),ye=(F.ok&&Array.isArray(F.data?.assetPositions)?F.data.assetPositions:[]).map(U=>U.position||U).filter(U=>gt(U.szi)).map(U=>({coin:U.coin||null,size:String(U.szi??"0"),entryPrice:U.entryPx??null,positionValueUsd:U.positionValue??null,unrealizedPnlUsd:U.unrealizedPnl??null,liquidationPrice:U.liquidationPx??null}));return{family:"hyperliquid",name:"Hyperliquid HyperCore",address:r.hyperliquid,status:$.ok||F.ok?"ok":"unavailable",spot:{status:$.ok?"ok":"unavailable",balances:ie,error:$.ok?null:$.error},perps:{status:F.ok?"ok":"unavailable",accountValueUsd:F.data?.marginSummary?.accountValue??null,withdrawableUsd:F.data?.withdrawable??null,positions:ye,error:F.ok?null:F.error},mids:X.ok?X.data:{},source:"hyperliquid-info"}})(),[h,g,b,k,x]=await Promise.all([d,p,m,f,u]),w=x.ok?x.data:null,E=Object.freeze({1:"ethereum",10:"optimism",56:"bsc",137:"polygon",8453:"base",42161:"arbitrum",43114:"avax",81457:"blast",534352:"scroll",59144:"linea",324:"era"}),C=[];for(let N of h){if(N.family!=="evm"||N.fungibleTokens?.status!=="ok")continue;let $=E[N.chainId];if($)for(let F of N.fungibleTokens.assets||[])F.address&&C.push(`${$}:${String(F.address).toLowerCase()}`)}let I=null;if(o&&C.length){let N=[...new Set(C)],$=await ne(()=>Re(N,ht(t,"prices")));$.ok&&(I=$.data)}let R=h.map(N=>{let $=N.native?{...N,native:xc(N.native,w)}:N;if($.fungibleTokens?.status==="ok"&&Array.isArray($.fungibleTokens.assets)){let F=E[$.chainId],X=$.fungibleTokens.assets.map(ie=>{let ye=String(ie.symbol||"").toUpperCase(),U=null;if(["USDC","USDT","USDT0","DAI","USDBC","USDE","USDCE"].includes(ye)&&(U=1),U==null&&F&&ie.address&&I?.coins){let gu=`${F}:${String(ie.address).toLowerCase()}`,Xn=I.coins[gu],Qn=Number(Xn?.price);Number.isFinite(Qn)&&Qn>0&&(U=Qn)}let ee=Cn(ie.amount),Tt=ee!=null&&U!=null?vi(ee*U):null;return{...ie,priceUsd:U,usdValue:Tt}});$={...$,fungibleTokens:{...$.fungibleTokens,assets:X}}}return $});g.native&&(g.native=xc(g.native,w)),b.native&&(b.native=xc(b.native,w));let _=0,v=0,q=0;for(let N of[...R,g,b]){N.native?.status==="ok"&>(N.native.amount)&&(N.native.usdValue!=null?(_+=N.native.usdValue,v+=1):q+=1);for(let $ of N.fungibleTokens?.assets||[])!gt($.amount)&&!gt($.amountRaw)||($.usdValue!=null?(_+=$.usdValue,v+=1):q+=1)}let ge=Lh(w,"HYPE");for(let N of k.spot?.balances||[]){let $=String(N.coin||"").toUpperCase(),F=$==="USDC"||$==="USDT"||$==="USDT0"?1:$==="HYPE"?ge.priceUsd||Cn(k.mids?.HYPE):Cn(k.mids?.[N.coin]),X=Cn(N.total);N.priceUsd=F,N.usdValue=X!=null&&F!=null?vi(X*F):null,gt(N.total)&&(N.usdValue!=null?(_+=N.usdValue,v+=1):q+=1)}let Ce=Cn(k.perps?.accountValueUsd);Ce!=null&&Ce!==0&&(_+=Ce,v+=1);let Wn=[...g.fungibleTokens?.assets||[],...g.collectibles?.assets||[]].filter(N=>gt(N.amount)).length,Jt=(b.fungibleTokens?.assets||[]).length+(b.collectibles?.assets||[]).length;q+=Wn+Jt;let Gn=[...R,g,b,k],ot=N=>Gn.filter($=>$.status===N).length,it=[],Kn=R.filter(N=>N.fungibleTokens?.status==="unavailable"),Yn=R.filter(N=>N.fungibleTokens?.status==="ok");Kn.length&&!Yn.length?it.push("EVM token discovery is unavailable without a working address indexer; native balances are still live."):Kn.length&&it.push(`EVM token discovery partial: Blockscout covered ${Yn.length} chain(s); ${Kn.length} chain(s) still native-only.`),(g.fungibleTokens?.assets?.length||g.collectibles?.assets?.length)&&it.push("Solana token accounts are unverified and may include spam; collectible candidates are not confirmed NFTs."),b.collectibles?.unknownNotEmpty&&it.push("Bitcoin inscription holdings are unknown, not zero, because no address indexer is configured."),x.ok||it.push(`Price provider unavailable: ${x.error}`);let Zt=[wc("cosmos","requires a chain-specific bech32 address and LCD/RPC adapter"),wc("sui","Sui balance adapter is not installed"),wc("aptos","Aptos balance adapter is not installed")],ks=Gn.some(N=>["unavailable","partial","not-configured"].includes(N.fungibleTokens?.status)||["unavailable","partial","not-configured"].includes(N.collectibles?.status));return{provider:"portfolio",operation:"balances",readOnly:!0,queriedAt:n,addresses:r,coverage:{requestedSurfaces:Gn.length,ok:ot("ok"),unavailable:ot("unavailable"),notConfigured:ot("not-configured"),unsupported:ot("unsupported")+Zt.length,evmChainsRequested:c.length,evmChainsOk:R.filter(N=>N.status==="ok").length},valuation:{knownUsd:vi(_),label:"known priced value, not a complete portfolio total",pricedItems:v,unpricedNonzeroItems:q,complete:q===0&&!ks&&ot("unavailable")===0&&ot("not-configured")===0&&Zt.length===0,priceSource:o?"DefiLlama":null,priceStatus:x.ok?"ok":"unavailable",priceQueriedAt:n},chains:[...R,g,b,k],unsupportedFamilies:Zt,warnings:it}}import{constants as Ii}from"node:fs";import{chmod as VI,mkdir as zI,open as WI,readFile as GI}from"node:fs/promises";import{createHash as KI,randomUUID as YI}from"node:crypto";import XI from"node:os";import On from"node:path";T();T();var SI=Object.freeze(["i.seadn.io","openseauserdata.com","arweave.net","ipfs.io","nftstorage.link","dweb.link","cloudflare-ipfs.com","ordinals.com","ordinals.g.com","cdn.helius-rpc.com","shdw-drive.genesysgo.net"]),kI=new Set(["image/jpeg","image/png","image/webp"]);function vI(e){let t=String(e||"").toLowerCase();return SI.some(n=>t===n||t.endsWith(`.${n}`))}function EI(e){let t=String(e||"").trim();return t.startsWith("ipfs://")?`https://ipfs.io/ipfs/${t.slice(7).replace(/^ipfs\//,"")}`:t.startsWith("ar://")?`https://arweave.net/${t.slice(5)}`:t}function Uh(e){let t=EI(e),n;try{n=new URL(t)}catch{return null}return n.protocol!=="https:"||n.username||n.password||!vI(n.hostname)?null:n}async function AI(e,t={}){let n=t.fetchImpl||globalThis.fetch;if(typeof n!="function")throw new Error("gallery fetch unavailable");let r=Uh(e);if(!r)throw new Error("image host is not on the raster gallery allowlist");let o=Math.min(Math.max(Number(t.maxImageBytes??15e5),5e4),4e6);for(let i=0;i<=3;i+=1){let s=await ne(()=>n(r.toString(),{method:"GET",redirect:"manual",headers:{accept:"image/jpeg,image/png,image/webp"},signal:AbortSignal.timeout(t.timeoutMs??12e3)}));if(!s.ok)throw new Error(s.error);let a=s.data;if(a.status>=300&&a.status<400){let d=a.headers?.get?.("location");if(!d)throw new Error("image redirect missing location");let p=Uh(new URL(d,r).toString());if(!p)throw new Error("image redirect left the host allowlist");r=p;continue}if(!a.ok)throw new Error(`image HTTP ${a.status}`);let c=String(a.headers?.get?.("content-type")||"").split(";",1)[0].toLowerCase();if(!kI.has(c))throw new Error(`unsafe or unsupported image type ${c||"unknown"}`);if(Number(a.headers?.get?.("content-length")||0)>o)throw new Error("image exceeds gallery byte cap");let u=Buffer.from(await a.arrayBuffer());if(!u.length||u.length>o)throw new Error("image exceeds gallery byte cap");return{mimeType:c,data:u.toString("base64"),sourceUrl:r.toString(),bytes:u.length}}throw new Error("too many image redirects")}function Sc(e){return String(e??"").replaceAll("&","&").replaceAll("<","<").replaceAll(">",">").replaceAll('"',""").replaceAll("'","'")}function II(e,t){return e.name||e.collection||e.tokenId||`NFT ${t+1}`}async function Bh(e={},t={}){let n=Array.isArray(e.items)?e.items:[];if(!n.length)throw new Error("nft gallery requires inventory items");let r=Math.min(Math.max(Number(e.pageSize??12)||12,1),12),o=Math.max(Number(e.page??1)||1,1),i=Math.max(Math.ceil(n.length/r),1);if(o>i)throw new Error(`nft gallery page ${o} exceeds ${i}`);let s=n.slice((o-1)*r,o*r),a=[],c=0,l=Math.min(Math.max(Number(e.maxTotalBytes??8e6),25e4),12e6);for(let x of s){if(c>=l){a.push({item:x,image:null,error:"gallery page byte cap reached"});continue}try{let w=await AI(x.imageUrl||x.originalImageUrl,{...t,maxImageBytes:Math.min(Number(e.maxImageBytes??15e5),l-c)});c+=w.bytes,a.push({item:x,image:w,error:null})}catch(w){a.push({item:x,image:null,error:String(w?.message||w).slice(0,180)})}}let u=3,d=340,p=400,m=76,f=Math.ceil(s.length/u),h=u*d,g=m+f*p,b=a.map(({item:x,image:w,error:E},C)=>{let I=C%u,R=Math.floor(C/u),_=I*d,v=m+R*p,q=w?`<image x="${_+14}" y="${v+14}" width="312" height="312" preserveAspectRatio="xMidYMid slice" href="data:${w.mimeType};base64,${w.data}"/>`:`<rect x="${_+14}" y="${v+14}" width="312" height="312" rx="14" fill="#151820"/><text x="${_+170}" y="${v+165}" text-anchor="middle" fill="#76808f" font-size="16">image unavailable</text>`,ge=Sc(II(x,C).slice(0,34)),Ce=Sc(x.chain||"unknown chain");return`${q}<text x="${_+16}" y="${v+350}" fill="#f3f5f7" font-size="17" font-weight="600">${ge}</text><text x="${_+16}" y="${v+376}" fill="#8d98a8" font-size="13">${Ce}${E?" \xB7 placeholder":""}</text>`}).join(""),k=`<svg xmlns="http://www.w3.org/2000/svg" width="${h}" height="${g}" viewBox="0 0 ${h} ${g}"><rect width="100%" height="100%" fill="#090b10"/><text x="24" y="34" fill="#ffffff" font-size="24" font-weight="700">NFT INVENTORY</text><text x="24" y="58" fill="#8d98a8" font-size="14">page ${o} of ${i} \xB7 ${n.length} assets \xB7 generated ${Sc(new Date().toISOString())}</text>${b}</svg>`;return{provider:"nft-portfolio",operation:"gallery",mimeType:"image/svg+xml",dataBase64:Buffer.from(k).toString("base64"),page:o,pageSize:r,totalPages:i,totalItems:n.length,renderedItems:a.filter(x=>x.image).length,placeholders:a.filter(x=>!x.image).map(x=>({assetKey:x.item.assetKey||null,name:x.item.name||null,sourceUrl:x.item.imageUrl||null,error:x.error})),rasterOnly:!0,externalScripts:!1}}var _I=[/\bclaim\b/i,/\breward\b/i,/\bairdrop\b/i,/\bvoucher\b/i,/\bwinner\b/i,/\bfree\s*mint\b/i,/\bactivate\b/i,/\bunlock\b/i,/\bverify\b/i,/\bconnect\s+wallet\b/i],PI=/(https?:\/\/|www\.|[a-z0-9-]+\.(?:com|net|io|xyz|org|app|finance|gift|claims?|site|link|live|vip|top|cc))/i,NI=/(\$\s?\d|\d[\d,.]*\s*(?:usd|usdc|usdt|eth|weth|btc|sol)\b)/i;function CI(e={}){let t=[],n=String(e.name||""),r=String(e.description||""),o=`${n} ${r}`;PI.test(n)&&t.push("url-in-name");let i=_I.filter(l=>l.test(o)).length;i>0&&t.push(`lure-language:${i}`),NI.test(n)&&t.push("value-claim-in-name"),/[\u200B-\u200F\u202A-\u202E\uFEFF]/.test(n)&&t.push("invisible-characters"),e.disabled===!0&&t.push("marketplace-disabled");let s=e.estimatedValueUsd==null&&e.estimatedValueSats==null,a=!Array.isArray(e.traits)||e.traits.length===0;s&&a&&i>0&&t.push("valueless-airdrop-with-lure");let c=t.includes("url-in-name")||t.includes("invisible-characters")||t.includes("valueless-airdrop-with-lure")||t.length>=2;return{spam:c,risk:c?"high":t.length>0?"low":"none",reasons:t}}function Dh(e={}){let t=CI(e);return{...e,spam:e.spam===!0||t.spam,riskLevel:t.risk,riskReasons:t.reasons.length?t.reasons:void 0}}W();var TI=Object.freeze([{chain:"ethereum",chainId:1,family:"evm"},{chain:"optimism",chainId:10,family:"evm"},{chain:"polygon",chainId:137,family:"evm"},{chain:"stablechain",chainId:988,family:"evm"},{chain:"hyperevm",chainId:999,family:"evm"},{chain:"abstract",chainId:2741,family:"evm"},{chain:"robinhood",chainId:4663,family:"evm"},{chain:"base",chainId:8453,family:"evm"},{chain:"arbitrum",chainId:42161,family:"evm"},{chain:"avalanche",chainId:43114,family:"evm"},{chain:"hyperliquid",chainId:null,family:"hyperliquid"}]),OI=Object.freeze([{family:"evm",chain:"bsc",chainId:56,reason:"OpenSea account inventory does not support BSC"},{family:"cosmos",reason:"requires a chain-specific bech32 address and NFT indexer"},{family:"sui",reason:"owner inventory adapter not installed"},{family:"aptos",reason:"owner inventory adapter not installed"}]);function qt(e={},t){return{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs,env:e.env,allowDiskCredentials:e.allowDiskCredentials,allowAmbientCredentials:e.allowAmbientCredentials,...e[t]||{}}}async function Rr(e,t){let n=await ne(t);return n.ok?{ok:!0,data:n.data}:{ok:!1,error:`${e}: ${n.error}`.slice(0,300)}}function RI(e){if(Array.isArray(e))return e;for(let t of["items","results","ordinals","inscriptions","data"])if(Array.isArray(e?.[t]))return e[t];return[]}function $I(e={},t){let n=e.inscription_id||e.inscriptionId||e.id||e.inscription||null;return{chain:"bitcoin",family:"bitcoin",owner:t,contract:null,tokenId:n==null?null:String(n),tokenStandard:"ordinal",collection:e.collection_slug||e.collectionSlug||e.collection?.slug||e.collection||null,name:e.name||e.meta?.name||(n?`Inscription ${n}`:"Bitcoin inscription"),description:e.description||e.meta?.description||null,imageUrl:e.image_url||e.imageUrl||e.content_url||e.contentUrl||e.thumbnail||null,originalImageUrl:e.content_url||e.contentUrl||e.image_url||e.imageUrl||null,animationUrl:null,metadataUrl:e.metadata_url||e.metadataUrl||null,marketplaceUrl:e.marketplace_url||e.marketplaceUrl||null,estimatedValueUsd:e.estimated_value_usd!=null&&Number.isFinite(Number(e.estimated_value_usd))?Number(e.estimated_value_usd):null,estimatedValueSats:(e.floor_price_sats??e.price_sats)!=null&&Number.isFinite(Number(e.floor_price_sats??e.price_sats))?Number(e.floor_price_sats??e.price_sats):null,spam:!1,disabled:!1,nsfw:!1,listed:e.listed===!0||e.is_listed===!0,listingId:e.listing_id||e.listingId||null,traits:Array.isArray(e.traits)?e.traits:[],updatedAt:e.updated_at||e.updatedAt||null,acquisitionCost:null,itemPnl:{status:"unavailable",reason:"Satflow wallet inventory does not expose trustworthy acquisition cost"},listingAdapter:"satflow",source:"satflow-wallet-contents"}}function LI(e,t){return{chain:"bitcoin",family:"bitcoin",owner:t,contract:null,tokenId:String(e),tokenStandard:"ordinal",collection:null,name:`Inscription ${e}`,description:null,imageUrl:null,originalImageUrl:null,animationUrl:null,metadataUrl:null,marketplaceUrl:null,estimatedValueUsd:null,spam:!1,disabled:!1,nsfw:!1,traits:[],updatedAt:null,acquisitionCost:null,itemPnl:{status:"unavailable",reason:"address indexer returned no acquisition or valuation data"},listingAdapter:"satflow",source:"bitcoin-meta-address-indexer"}}function Hh(e={}){return[e.chain||"unknown",e.contract||"native",e.tokenId||"unknown"].join(":").toLowerCase()}function MI(e){let t=new Map;if(Array.isArray(e)){for(let n of e)n?.assetKey&&t.set(String(n.assetKey).toLowerCase(),n);return t}if(e&&typeof e=="object")for(let[n,r]of Object.entries(e))t.set(n.toLowerCase(),r);return t}function UI(e,t){let n=Hh(e),r=t.get(n),o=e.estimatedValueUsd==null?null:Number(e.estimatedValueUsd);if(!r)return{...e,assetKey:n};let i=Number(r.costUsd),s=Number(r.feesUsd??0);if(!Number.isFinite(i)||i<0||!Number.isFinite(s)||s<0)return{...e,assetKey:n,acquisitionCost:null,itemPnl:{status:"unavailable",reason:"invalid user-supplied cost basis"}};let a=Math.round((i+s)*100)/100;return Number.isFinite(o)?{...e,assetKey:n,acquisitionCost:{costUsd:i,feesUsd:s,totalCostUsd:a,acquiredAt:r.acquiredAt||null,source:r.source||"user-supplied"},itemPnl:{status:"estimated",methodology:"provider estimated current value minus supplied USD acquisition cost and fees",unrealizedUsd:Math.round((o-a)*100)/100,currentValueUsd:o,totalCostUsd:a,realizedUsd:null}}:{...e,assetKey:n,acquisitionCost:{costUsd:i,feesUsd:s,totalCostUsd:a,acquiredAt:r.acquiredAt||null,source:r.source||"user-supplied"},itemPnl:{status:"unavailable",reason:"current NFT valuation is unavailable"}}}function BI(e){let t=new Map;for(let n of e){let r=Hh(n);t.has(r)||t.set(r,n)}return[...t.values()]}function DI(e,t){let n=e.filter(i=>i.itemPnl?.status==="estimated"),r=e.length-n.length,o=Math.round(n.reduce((i,s)=>i+Number(s.itemPnl.unrealizedUsd||0),0)*100)/100;return{nftItemPnl:{status:r===0&&e.length?"estimated-complete-for-held-items":n.length?"partial":"unavailable",methodology:"Only items with explicit acquisition cost and provider estimated current value are included",knownUnrealizedUsd:o,knownItems:n.length,unknownItems:r,realizedUsd:null,warning:"Transfers, gifts, airdrops, mints, bridges, gas, royalties, and off-market sales can make cost basis unavailable or incomplete."},providerAccountPnl:t}}async function jh(){return{ok:!0,provider:"nft-portfolio",readOnly:!0,marketplaces:["opensea","magiceden-sol","satflow"],listingExecution:"prepare-only"}}async function Tn(e={},t={}){let n=new Date().toISOString(),r=Ft(e,t.env||process.env),o=Array.isArray(e.chains)&&e.chains.length?new Set(e.chains.map(w=>String(w).toLowerCase())):null,i=TI.filter(w=>!o||o.has(w.chain)),s=[],a=[],c=qt(t,"opensea"),l=r.evm?i.filter(w=>w.family!=="solana"):[],u=await en(l,4,async w=>({row:w,result:await Rr(`opensea-${w.chain}`,()=>wr({chain:w.chain,address:r.evm,pageSize:e.pageSize,maxPages:e.maxPages},c),t.timeoutMs??35e3)}));for(let{row:w,result:E}of u)if(E.ok){let C=E.data.nfts.map(I=>({...I,family:w.family,chainId:w.chainId,listingAdapter:"opensea",source:"opensea-account-inventory"}));a.push(...C),s.push({family:w.family,chain:w.chain,chainId:w.chainId,status:E.data.complete?"ok":"partial",count:C.length,complete:E.data.complete,next:E.data.next,source:"opensea"})}else s.push({family:w.family,chain:w.chain,chainId:w.chainId,status:"unavailable",error:E.error,source:"opensea"});if(!r.evm)for(let w of i.filter(E=>E.family!=="solana"))s.push({family:w.family,chain:w.chain,chainId:w.chainId,status:"not-configured",reason:"EVM address missing"});if(r.solana&&(!o||o.has("solana"))){let w=await Rr("opensea-solana",()=>wr({chain:"solana",address:r.solana,pageSize:e.pageSize,maxPages:e.maxPages},c),t.timeoutMs??35e3);if(w.ok){let E=w.data.nfts.map(C=>({...C,family:"solana",chainId:null,listingAdapter:null,source:"opensea-account-inventory"}));a.push(...E),s.push({family:"solana",chain:"solana",status:w.data.complete?"ok":"partial",count:E.length,complete:w.data.complete,next:w.data.next,source:"opensea"})}else s.push({family:"solana",chain:"solana",status:"unavailable",error:w.error,source:"opensea"})}else(!o||o.has("solana"))&&s.push({family:"solana",chain:"solana",status:"not-configured",reason:"Solana address missing"});if(r.bitcoin&&(!o||o.has("bitcoin"))){let w=await Rr("satflow-wallet-contents",()=>No({address:r.bitcoin,type:"ordinals",limit:e.bitcoinLimit??100,offset:0},qt(t,"satflow")),t.timeoutMs??35e3);if(w.ok){let E=RI(w.data.contents).map(I=>$I(I,r.bitcoin));a.push(...E);let C=E.length<Number(e.bitcoinLimit??100);s.push({family:"bitcoin",chain:"bitcoin",status:C?"ok":"partial",count:E.length,complete:C,source:"satflow"})}else{let E=await Rr("bitcoin-meta-inscriptions",()=>ln({address:r.bitcoin},qt(t,"bitcoinMeta")),t.timeoutMs??35e3),C=E.ok&&E.data?.ok&&Array.isArray(E.data.inscriptions)?E.data.inscriptions:[];a.push(...C.map(I=>LI(I,r.bitcoin))),s.push({family:"bitcoin",chain:"bitcoin",status:C.length?"partial":"unavailable",count:C.length,complete:!1,source:C.length?"bitcoin-meta":"satflow",error:C.length?"Satflow unavailable; fallback has IDs only":w.error})}}else(!o||o.has("bitcoin"))&&s.push({family:"bitcoin",chain:"bitcoin",status:"not-configured",reason:"Bitcoin address missing"});let d=[];if(e.includePnl!==!1)for(let w of[...new Set([r.evm,r.solana].filter(Boolean))]){let E=await Rr(`opensea-pnl-${w}`,()=>Yo({address:w},c),t.timeoutMs??35e3);d.push(E.ok?{status:"ok",...E.data}:{status:"unavailable",address:w,source:"opensea-indexed-account-pnl",error:E.error})}let p=MI(e.costBasis),m=BI(a).map(w=>UI(w,p)).map(w=>Dh(w)),f=m.filter(w=>!w.spam),h=m.filter(w=>w.spam),g=f.filter(w=>w.estimatedValueUsd!=null&&Number.isFinite(Number(w.estimatedValueUsd))),b=Math.round(g.reduce((w,E)=>w+Number(E.estimatedValueUsd),0)*100)/100,k=f.length-g.length,x=s.filter(w=>w.status!=="ok"||w.complete===!1);return{provider:"nft-portfolio",operation:"inventory",readOnly:!0,generatedAt:n,addresses:r,coverage:s,unsupported:OI,inventory:{count:m.length,visibleCount:f.length,flaggedCount:h.length,items:m,visibleItems:f,flaggedItems:h},valuation:{estimatedCurrentValueUsd:b,valuedItems:g.length,unvaluedItems:k,complete:k===0&&x.length===0,methodology:"Sum of provider estimated_value_usd for non-flagged items. It is not an executable bid."},pnl:DI(f,d),listingCoverage:{opensea:"EVM listing actions available with OPENSEA_API_KEY, explicit price/currency/expiry, and user confirmation",satflow:"Bitcoin unsigned listing PSBT available with SATFLOW_API_KEY, explicit price/expiry, and user confirmation",solana:"Magic Eden unsigned list transaction available with MAGICEDEN_API_KEY, explicit SOL price/expiry, and user confirmation",unsupported:"Sui, Aptos, Cosmos, BSC, and unknown marketplaces fail closed"},traitSniperCoverage:{opensea:"Evaluates reveal/trait-floor mispricing only with recent trait sales and volume evidence. Buy intents require local vault signing.",execution:"prepare-only on hosted surfaces; local vault required for purchase"},metadataSafety:{imagesAreUntrusted:!0,animationAndHtmlNotRendered:!0,galleryRasterOnly:!0,missingImagesUsePlaceholders:!0}}}function Fh(e,t){let n=typeof e=="number"?e*1e3:Date.parse(String(e||""));if(!Number.isFinite(n))throw new Error(`${t} must be an ISO 8601 timestamp or Unix seconds`);let r=Math.floor(n/1e3);if(r<=Math.floor(Date.now()/1e3))throw new Error(`${t} must be in the future`);return r}function FI(e){let t=String(e??"").trim();if(!/^[1-9]\d*$/.test(t))throw new Error("Bitcoin NFT list priceSats must be a positive integer");return t}async function Vh(e={},t={}){if(e.userConfirmed!==!0)throw new Error("NFT listing preparation requires userConfirmed=true after reviewing asset, marketplace, price, currency, fees, royalties, and expiry");let n=String(e.marketplace||"").trim().toLowerCase();if(n==="opensea")return Xo(e,qt(t,"opensea"));if(n==="magiceden"||n==="magiceden-sol"){let r=Fh(e.expiry??e.endTime,"Solana NFT listing expiry");return Qo({...e,expiry:r},qt(t,"magiceden"))}if(n==="satflow"){let r=Fh(e.expiry??e.endTime??e.expiresAt,"Bitcoin NFT listing expiry");return Co({inscription_id:e.inscriptionId||e.tokenId,runes_output:e.runesOutput,ord_address:e.ordAddress||e.seller,receive_address:e.receiveAddress,price:FI(e.priceSats??e.price),tap_key:e.tapKey,collection_slug:e.collectionSlug||e.collection,expires_at:r},qt(t,"satflow"))}throw new Error(`unsupported NFT marketplace: ${n||"<missing>"}`)}function kc(e,t){let n=Number(e);if(!Number.isFinite(n)||n<0)throw new Error(`${t} must be a non-negative ETH number`);return n}function vc(e){if(e==null||e==="")return null;let t=Number(e);return Number.isFinite(t)&&t>0?t:null}function Ai(e){return String(e??"").trim().toLowerCase()}function qI(e={},t,n){let r=Array.isArray(e.traits)?e.traits:[],o=Ai(t),i=Ai(n);return!o||!i?!1:r.some(s=>Ai(s.trait_type??s.traitType??s.type)===o&&Ai(s.value??s.trait_value??s.traitValue)===i)}function HI(e={},t){if(!t)return!0;let n=String(e.contract||e.tokenContract||e.assetContract||"").toLowerCase();return!n||n===String(t).toLowerCase()}function qh(e={},t=["timestamp","listedAt","createdAt"]){for(let n of t){let r=e[n]??e[n.replace(/[A-Z]/g,i=>`_${i.toLowerCase()}`)];if(r==null)continue;let o=typeof r=="number"?r:Date.parse(String(r));if(Number.isFinite(o))return o}return null}function Ec(e){return Math.round(Number(e)*1e6)/1e6}function yt(e,t,n={}){return{provider:"nft-portfolio",operation:"traitSnipe",marketplace:String(e.marketplace||"").toLowerCase(),collectionSlug:e.collectionSlug||e.collection||null,contract:e.contract||null,decision:"PASS",reason:t,executionReady:!1,signingReady:!1,broadcastReady:!1,requiresLocalVault:!0,best:null,evidence:n,prepareIntent:null}}async function zh(e={},t={}){let n=String(e.marketplace||"").trim().toLowerCase();if(n!=="opensea")return yt(e,`unsupported NFT marketplace: ${n||"<missing>"}`);let o=["traitType","traitValue","maxPriceEth","minDiscountBps","minTraitSales","minTraitVolumeEth","traitFloorEth"].filter(I=>e[I]==null||e[I]==="");if(o.length)return yt(e,`trait-risk-params-required: ${o.join(",")}`);let i=Number.isFinite(Number(e.nowMs))?Number(e.nowMs):Date.now(),s=kc(e.maxPriceEth,"maxPriceEth"),a=Number(e.minDiscountBps),c=Number(e.minTraitSales),l=kc(e.minTraitVolumeEth,"minTraitVolumeEth"),u=kc(e.traitFloorEth,"traitFloorEth"),d=vc(e.collectionFloorEth),p=vc(e.maxListingAgeMs),m=vc(e.maxSaleAgeMs??e.salesWindowMs);if(!Number.isFinite(a)||a<0)return yt(e,"invalid-min-discount-bps");if(!Number.isFinite(c)||c<1)return yt(e,"invalid-min-trait-sales");if(u<=0)return yt(e,"trait-floor-unavailable");let f=I=>qI(I,e.traitType,e.traitValue)&&HI(I,e.contract),h=(Array.isArray(e.sales)?e.sales:[]).filter(f).filter(I=>{if(!m)return!0;let R=qh(I,["timestamp","soldAt","createdAt"]);return R!=null&&i-R<=m}),g=Ec(h.reduce((I,R)=>I+Number(R.priceEth??R.price??0),0)),b={count:h.length,volumeEth:g,minSales:c,minVolumeEth:l};if(h.length<c||g<l)return yt(e,"trait-liquidity-insufficient",{traitSales:b});let k=(Array.isArray(e.listings)?e.listings:[]).filter(f).filter(I=>{let R=Number(I.priceEth??I.price);if(!Number.isFinite(R)||R<=0||R>s)return!1;if(!p)return!0;let _=qh(I,["listedAt","createdAt","timestamp"]);return _!=null&&i-_<=p}).map(I=>{let R=Number(I.priceEth??I.price),_=Math.round((u-R)/u*1e4);return{...I,priceEth:R,discountBps:_}}).filter(I=>I.discountBps>=a).sort((I,R)=>I.priceEth-R.priceEth||R.discountBps-I.discountBps),x={traitSales:b,collectionFloorEth:d,traitFloorEth:u,listingDepth:{count:k.length,minFreshListings:e.minTraitListings==null?null:Number(e.minTraitListings)},methodology:"Trait buy intent requires caller-supplied fresh listings, real trait sales, volume, max price, and min discount gates. Rarity metadata alone is ignored."},w=e.minTraitListings==null?1:Number(e.minTraitListings);if(!Number.isFinite(w)||w<1)return yt(e,"invalid-min-trait-listings",x);if(k.length<w)return yt(e,"trait-listing-depth-insufficient",x);let E=k[0],C=O({provider:"nft-portfolio",kind:"nft-trait-buy-intent",marketplace:n,chain:e.chain||null,collectionSlug:e.collectionSlug||e.collection||null,contract:e.contract||null,tokenId:E.tokenId==null?null:String(E.tokenId),listingId:E.listingId||null,orderHash:E.orderHash||null,priceEth:Ec(E.priceEth),maxPriceEth:s,traitType:e.traitType,traitValue:e.traitValue,evidence:x,localOnly:!0,requiresLocalVault:!0},{provider:"nft-portfolio",kind:"nft-trait-buy-intent",env:t.env||process.env});return{provider:"nft-portfolio",operation:"traitSnipe",marketplace:n,collectionSlug:e.collectionSlug||e.collection||null,contract:e.contract||null,decision:"BUY",reason:"trait-mispricing-evidence-met",executionReady:!1,signingReady:!1,broadcastReady:!1,requiresLocalVault:!0,best:{tokenId:E.tokenId==null?null:String(E.tokenId),listingId:E.listingId||null,orderHash:E.orderHash||null,priceEth:Ec(E.priceEth),discountBps:E.discountBps},evidence:x,prepareIntent:C}}async function Wh(e={},t={}){let n=await Tn({...e,includePnl:!0},t);return{provider:"nft-portfolio",operation:"pnl",readOnly:!0,generatedAt:n.generatedAt,addresses:n.addresses,coverage:n.coverage,unsupported:n.unsupported,valuation:n.valuation,pnl:n.pnl}}async function Gh(e={},t={}){let n=Array.isArray(e.items)?e.items:null,r=null;return n||(r=await Tn({...e,includePnl:!1},t),n=r.inventory.visibleItems),{...await Bh({...e,items:n},qt(t,"gallery")),inventorySummary:r?{visibleCount:r.inventory.visibleCount,flaggedCount:r.inventory.flaggedCount,coverage:r.coverage}:null}}var Kh=10*1024*1024,Qh=1e3;function bt(e){if(e==null||e==="")return null;let t=Number(e);return Number.isFinite(t)?t:null}function Rn(e){return Number.isFinite(e)?Number(e.toFixed(2)):null}function Yh(e,t){if(e==null||e==="")return null;let n=Date.parse(String(e));if(!Number.isFinite(n))throw new Error(`${t} must be an ISO 8601 timestamp`);return new Date(n).toISOString()}function Jh(e,t,n,r,o){if(e==null||e==="")return t;let i=Number(e);if(!Number.isInteger(i)||i<n||i>r)throw new Error(`${o} must be an integer from ${n} to ${r}`);return i}function QI(e={}){return["evm","solana","bitcoin","hyperliquid"].map(t=>`${t}:${String(e[t]||"").trim().toLowerCase()}`).join("|")}function Zh(e={}){return`portfolio_${KI("sha256").update(QI(e)).digest("hex").slice(0,20)}`}function e0(e={}){if(e.historyFile)return On.resolve(String(e.historyFile));let t=e.env||process.env;if(t.ORACLE_PORTFOLIO_HISTORY_FILE)return On.resolve(String(t.ORACLE_PORTFOLIO_HISTORY_FILE));let n=String(t.HERMES_HOME||"").trim()||On.join(XI.homedir(),".hermes");return On.join(On.resolve(n),"state","oracle","portfolio-history.jsonl")}function JI(e){let t=bt(e?.valuation?.knownUsd);return t==null?null:Number(e?.valuation?.pricedItems||0)>0||e?.valuation?.complete===!0?Rn(t):null}function ZI(e){if(!e||e.status==="unavailable"||e.status==="not-requested")return null;let t=bt(e?.valuation?.estimatedCurrentValueUsd);return t==null?null:Number(e?.valuation?.valuedItems||0)>0||e?.valuation?.complete===!0?Rn(t):null}function e_(e){let t=[];for(let n of e?.chains||[]){if(n.family==="hyperliquid"){let o=(n.spot?.balances||[]).reduce((a,c)=>{let l=bt(c.usdValue);return l==null?a:a+l},0),i=bt(n.perps?.accountValueUsd),s=Rn(o+(i??0));(s!==0||i!=null||(n.spot?.balances||[]).some(a=>bt(a.usdValue)!=null))&&t.push({family:"hyperliquid",chainId:null,name:n.name||"Hyperliquid",knownUsd:s});continue}let r=bt(n.native?.usdValue);r!=null&&t.push({family:n.family||"evm",chainId:n.chainId??null,name:n.name||n.native?.symbol||"Unknown",knownUsd:Rn(r)})}return t}function t_(e,t,n){let r=Array.isArray(t?.coverage)?t.coverage:[];return{balances:e?.coverage||null,nfts:{requested:n,ok:r.filter(o=>o.status==="ok").length,partial:r.filter(o=>o.status==="partial").length,unavailable:r.filter(o=>o.status==="unavailable").length,notConfigured:r.filter(o=>o.status==="not-configured").length,status:n?t?.status==="unavailable"?"unavailable":t?.valuation?.complete?"ok":"partial":"not-requested"}}}async function n_(e,t){let n=e0(t),r=`${JSON.stringify(e)}
|
|
144
|
+
`;if(Buffer.byteLength(r)>32*1024)throw new Error("portfolio history snapshot exceeds 32 KiB");await zI(On.dirname(n),{recursive:!0,mode:448});let o=Ii.O_APPEND|Ii.O_CREAT|Ii.O_WRONLY|(Ii.O_NOFOLLOW||0),i=await WI(n,o,384);try{await i.writeFile(r,"utf8")}finally{await i.close()}return await VI(n,384),n}async function t0(e={},t={}){let n=e.includeNfts!==!1,r=t.portfolioBalanceImpl||Ei,o=t.nftInventoryImpl||Tn,i=r(e,t),s=n?o({...e,includePnl:!1},t).catch(E=>({status:"unavailable",error:String(E?.message||E).slice(0,300)})):Promise.resolve({status:"not-requested"}),[a,c]=await Promise.all([i,s]),l=JI(a),u=ZI(c),d=[l,u].filter(E=>E!=null),p=d.length?Rn(d.reduce((E,C)=>E+C,0)):null,m=!!(a?.valuation?.complete&&(!n||c?.valuation?.complete===!0)),f=typeof t.now=="function"?t.now():new Date,h=new Date(f).toISOString(),g=a?.addresses||Ft(e,t.env||process.env),b=Zh(g),k=[...a?.warnings||[]];n&&c?.status==="unavailable"&&k.push(`NFT inventory unavailable: ${c.error}`),n&&c?.valuation&&c.valuation.complete!==!0&&k.push("NFT estimated value is incomplete and is not an executable bid.");let x={schemaVersion:1,id:`snapshot_${YI()}`,portfolioId:b,recordedAt:h,sourceQueriedAt:{balances:a?.queriedAt||null,nfts:c?.generatedAt||null},configuredFamilies:Object.fromEntries(["evm","solana","bitcoin","hyperliquid"].map(E=>[E,!!g?.[E]])),valuation:{knownUsd:p,liquidKnownUsd:l,nftEstimatedValueUsd:u,complete:m,label:m?"complete known portfolio value":"known priced value, including provider-estimated NFTs when available, not a complete portfolio total",liquidPricedItems:Number(a?.valuation?.pricedItems||0),liquidUnpricedNonzeroItems:Number(a?.valuation?.unpricedNonzeroItems||0),nftValuedItems:Number(c?.valuation?.valuedItems||0),nftUnvaluedItems:Number(c?.valuation?.unvaluedItems||0)},breakdown:{liquid:e_(a),nfts:{knownUsd:u,visibleItems:Number(c?.inventory?.visibleCount||0),flaggedItems:Number(c?.inventory?.flaggedCount||0)}},coverage:t_(a,c,n),warnings:[...new Set(k)].slice(0,50)};return{provider:"portfolio",operation:"snapshot",readOnly:!0,localObservationRecorded:!0,historyFile:await n_(x,t),snapshot:x,balance:a,nfts:c}}async function r_(e){let t=e0(e);try{let n=await GI(t);if(n.byteLength>Kh)throw new Error(`portfolio history exceeds ${Kh} bytes`);let r=[],o=0;for(let i of n.toString("utf8").split(`
|
|
145
|
+
`))if(i.trim())try{let s=JSON.parse(i);s?.schemaVersion===1&&s?.portfolioId&&s?.recordedAt?r.push(s):o+=1}catch{o+=1}return{file:t,snapshots:r,corruptLines:o}}catch(n){if(n?.code==="ENOENT")return{file:t,snapshots:[],corruptLines:0};throw n}}function o_(e,t){if(e.allPortfolios===!0)return null;if(e.portfolioId)return String(e.portfolioId);let n=Ft(e,t.env||process.env);return Object.values(n).some(Boolean)?Zh(n):null}async function Ac(e={},t={}){let n=Jh(e.limit,100,1,Qh,"portfolio history limit"),r=String(e.order||"desc").toLowerCase();if(!new Set(["asc","desc"]).has(r))throw new Error("portfolio history order must be asc or desc");let o=Yh(e.since,"portfolio history since"),i=Yh(e.until,"portfolio history until"),s=o_(e,t),a=await r_(t),c=a.snapshots.filter(d=>!(s&&d.portfolioId!==s||o&&d.recordedAt<o||i&&d.recordedAt>i));c.sort((d,p)=>String(d.recordedAt).localeCompare(String(p.recordedAt)));let l=c.length;c=c.slice(-n),r==="desc"&&c.reverse();let u=c.filter(d=>bt(d?.valuation?.knownUsd)!=null);return{provider:"portfolio",operation:"history",readOnly:!0,historyFile:a.file,portfolioId:s,order:r,totalStored:a.snapshots.length,totalMatching:l,corruptLines:a.corruptLines,snapshots:c,stats:{returned:c.length,valuedSnapshots:u.length,unpricedSnapshots:c.length-u.length,firstRecordedAt:c.length?[...c].sort((d,p)=>String(d.recordedAt).localeCompare(String(p.recordedAt)))[0].recordedAt:null,lastRecordedAt:c.length?[...c].sort((d,p)=>String(d.recordedAt).localeCompare(String(p.recordedAt))).at(-1).recordedAt:null}}}function Xh(e){return`$${Number(e).toLocaleString("en-US",{minimumFractionDigits:2,maximumFractionDigits:2})}`}function _i(e){return String(e).replaceAll("&","&").replaceAll("<","<").replaceAll(">",">").replaceAll('"',""").replaceAll("'","'")}function i_(e,t){if(e.length<=t)return e;let n=[];for(let r=0;r<t;r+=1)n.push(e[Math.round(r*(e.length-1)/(t-1))]);return n}function s_(e,t){let c=e.map(x=>x.value),l=Math.min(...c),u=Math.max(...c);if(l===u){let x=Math.max(1,Math.abs(l)*.05);l-=x,u+=x}else{let x=(u-l)*.1;l=Math.max(0,l-x),u+=x}let d=x=>e.length===1?1240/2:100+1040*x/(e.length-1),p=x=>570-(x-l)/(u-l)*470,m=e.map((x,w)=>`${w?"L":"M"}${d(w).toFixed(2)},${p(x.value).toFixed(2)}`).join(" "),f=Array.from({length:5},(x,w)=>{let E=w/4,C=100+E*470,I=u-E*(u-l);return`<line x1="100" y1="${C}" x2="1140" y2="${C}" stroke="#26313c" stroke-width="1"/><text x="86" y="${C+5}" text-anchor="end" fill="#8795a5" font-size="15">${Xh(I)}</text>`}).join(""),h=e.map((x,w)=>`<circle cx="${d(w)}" cy="${p(x.value)}" r="5" fill="#b8f0ff"><title>${_i(x.recordedAt)}: ${Xh(x.value)}</title></circle>`).join(""),g=_i(e[0].recordedAt.slice(0,10)),b=_i(e.at(-1).recordedAt.slice(0,10));return`<svg xmlns="http://www.w3.org/2000/svg" width="1200" height="675" viewBox="0 0 1200 675"><rect width="1200" height="675" fill="#0b1016"/><text x="60" y="50" fill="#f4f7fa" font-size="28" font-family="Inter,Arial,sans-serif" font-weight="700">Oracle Portfolio Value</text><text x="60" y="78" fill="#8795a5" font-size="15" font-family="Inter,Arial,sans-serif">Known priced value, not a complete total unless every snapshot says complete \xB7 ${_i(t||"configured portfolio")}</text>${f}<line x1="100" y1="570" x2="1140" y2="570" stroke="#526171" stroke-width="1"/><path d="${m}" fill="none" stroke="#b8f0ff" stroke-width="4" stroke-linecap="round" stroke-linejoin="round"/>${h}<text x="100" y="610" fill="#8795a5" font-size="15">${g}</text><text x="1140" y="610" text-anchor="end" fill="#8795a5" font-size="15">${b}</text><text x="60" y="650" fill="#526171" font-size="13">NFT values are provider estimates, not executable bids. Unavailable values are omitted, never plotted as zero.</text></svg>`}async function n0(e={},t={}){if(e.allPortfolios===!0)throw new Error("portfolio value graph requires one portfolioId or configured public-address portfolio");let n=Jh(e.maxPoints,200,2,500,"portfolio graph maxPoints"),r=await Ac({...e,order:"asc",limit:e.limit??Qh},t);if(!r.portfolioId)throw new Error("portfolio value graph requires one portfolioId or configured public-address portfolio");let o=r.snapshots.map(d=>({recordedAt:d.recordedAt,value:bt(d?.valuation?.knownUsd),complete:d?.valuation?.complete===!0})).filter(d=>d.value!=null);if(!o.length)throw new Error("portfolio value graph requires at least one snapshot with known priced value");let i=i_(o,n),s=i[0].value,a=i.at(-1).value,c=Rn(a-s),l=s===0?null:Number(((a-s)/s*100).toFixed(2)),u=s_(i,r.portfolioId);return{provider:"portfolio",operation:"valueGraph",readOnly:!0,portfolioId:r.portfolioId,mimeType:"image/svg+xml",dataBase64:Buffer.from(u).toString("base64"),byteLength:Buffer.byteLength(u),summary:{points:i.length,omittedUnavailablePoints:r.snapshots.length-o.length,startRecordedAt:i[0].recordedAt,endRecordedAt:i.at(-1).recordedAt,startKnownUsd:s,endKnownUsd:a,changeUsd:c,changePct:l,completeSnapshots:i.filter(d=>d.complete).length,label:"known priced value history; incomplete snapshots are not complete portfolio totals"}}}var c_=Object.freeze({"8da5cb5b":{name:"owner()",weight:"low",note:"contract has an owner"},f2fde38b:{name:"transferOwnership(address)",weight:"low",note:"ownership transferable"},"40c10f19":{name:"mint(address,uint256)",weight:"high",note:"owner can mint new supply"},a0712d68:{name:"mint(uint256)",weight:"high",note:"owner can mint new supply"},f9f92be4:{name:"blacklist(address)",weight:"high",note:"addresses can be blocked from selling"},e4997dc5:{name:"removeBlackList(address)",weight:"high",note:"blacklist machinery present"},"8456cb59":{name:"pause()",weight:"high",note:"transfers can be frozen"},"3f4ba83a":{name:"unpause()",weight:"high",note:"pausable transfers"},c0246668:{name:"setFee/excludeFromFee",weight:"high",note:"transfer fees can be changed"},"3659cfe6":{name:"upgradeTo(address)",weight:"high",note:"logic can be replaced entirely"},"4f1ef286":{name:"upgradeToAndCall(address,bytes)",weight:"high",note:"logic can be replaced entirely"}}),l_=Object.freeze([{label:"eip1967",slot:"0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc"},{label:"zeppelinos",slot:"0x7050c9e0f4ca769c69bd3a8ef740bc37934f8e2c036e5a723fd8ee048ed3f8c3"},{label:"eip1822",slot:"0xc5f16f0fcc639fa48a6947836d9850f504798523bf8c9a3a87d5876cf622bcf7"}]),u_=`0x${"0".repeat(64)}`;function d_(e){return!e||e==="0x"||e===u_}async function Ht(e={},t={}){let n=t.rpcCall||L,r=String(e.address||"").trim().toLowerCase(),o=Number(e.chainId);if(!/^0x[a-f0-9]{40}$/.test(r))return{status:"error",error:"address must be a 0x-prefixed EVM address",risk:"unknown-risk",findings:[],notes:[]};if(!Number.isInteger(o))return{status:"error",error:"chainId is required",risk:"unknown-risk",findings:[],notes:[]};let i;try{i=await n(o,"eth_getCode",[r,"latest"],t)}catch(f){return{address:r,chainId:o,status:"unavailable",error:f?.message||"eth_getCode failed",risk:"unknown-risk",findings:[],isProxy:!1,codeSize:0,notes:["could not read contract code; treat as unverified"]}}if(!i||i==="0x")return{address:r,chainId:o,status:"ok",risk:"high",findings:[{selector:"-",name:"no-code",weight:"high",note:"no contract deployed at this address"}],isProxy:!1,codeSize:0,notes:["nothing is deployed here \u2014 an approval or transfer to this address is unrecoverable"]};let s=[],a=[],c=i.slice(2).toLowerCase();for(let[f,h]of Object.entries(c_))c.includes(f)&&a.push({selector:`0x${f}`,...h});let l=!1,u=null,d=null;for(let{label:f,slot:h}of l_)try{let g=await n(o,"eth_getStorageAt",[r,h,"latest"],t);if(!d_(g)){l=!0,u=f,d=`0x${String(g).slice(-40)}`;break}}catch{s.push(`proxy slot (${f}) unreadable; proxy status uncertain`)}l&&(a.push({selector:u,name:"proxy",weight:"high",note:"implementation is upgradeable \u2014 current behaviour is not a guarantee"}),s.push(`bytecode scan covers the proxy (${u}), not the implementation ${d} it delegates to`));let m=a.filter(f=>f.weight==="high").length>0?"high":a.length>0?"elevated":"unknown-risk";return m==="unknown-risk"&&s.push("no owner-power selectors found; this is weak evidence, not a safety guarantee"),{address:r,chainId:o,status:"ok",risk:m,findings:a,isProxy:l,proxyStandard:u,implementation:d,codeSize:Math.floor(c.length/2),notes:s}}async function r0(e={}){let t=Date.now();try{let n=await Ht({address:"0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2",chainId:1},e),r=n.status==="ok";return{provider:"contract-risk",status:r?"ok":"degraded",latencyMs:Date.now()-t,detail:r?"bytecode reads reachable":n.error||"probe returned no code"}}catch(n){return{provider:"contract-risk",status:"down",latencyMs:Date.now()-t,detail:n?.message||"probe failed"}}}var m_=/^0x[0-9a-fA-F]{40}$/,o0=4663;function Ic(e,t){let n=String(e||"").trim();if(!m_.test(n))throw new Error(`evm-token-sniper: ${t} must be a 0x EVM address`);return n}function f_(e,t){let n=String(e??"").trim();if(!/^\d+$/.test(n)||BigInt(n)<=0n)throw new Error(`evm-token-sniper: ${t} must be a positive raw integer amount`);return n}function h_(e,t){if(t){if(Number(t.chainId)!==e)throw new Error(`evm-token-sniper: supplied scanner chain ${t.chainId} does not match ${e}`);return t}sr();let n=Fs(e);if(!n)throw new Error(`evm-token-sniper: unsupported EVM chainId ${e}`);return n}function g_({token:e,pools:t,structuralRisk:n,scannerRisk:r,sellability:o,quote:i,args:s,scanner:a}){let c=[];return e?.evidence!==B.LIVE&&c.push("token identity is not live-verified"),(!Array.isArray(t?.pools)||t.pools.length===0)&&c.push("no liquid pool was resolved"),n?.status!=="ok"&&c.push("structural contract risk is unavailable"),n?.risk==="high"&&c.push("structural contract risk is high"),r?.verdict!==M.PASS&&c.push(`scanner risk verdict is ${r?.verdict||"UNKNOWN"}`),a.supports?.("sellSimulation")?o?.verdict!==M.PASS&&c.push(`sellability verdict is ${o?.verdict||"UNKNOWN"}`):c.push("sell simulation is unavailable on this chain"),a.supports?.("quote")?i?.evidence!==B.LIVE&&c.push("no live quote was returned"):c.push("live quoting is unavailable on this chain"),a.supports?.("prepareUnsignedTx")||c.push("unsigned transaction preparation is unavailable on this chain"),s.tokenIn||c.push("tokenIn is required to prepare"),s.amountIn||c.push("amountIn is required to prepare"),s.recipient||c.push("recipient is required to prepare"),c}async function i0(e={},t={}){let n=Number(e.chainId??o0);if(!Number.isInteger(n)||n<=0)throw new Error("evm-token-sniper: chainId must be a positive integer");let r=Ic(e.tokenAddress||e.address||e.token,"tokenAddress"),o=e.tokenIn?Ic(e.tokenIn,"tokenIn"):null,i=e.recipient?Ic(e.recipient,"recipient"):null,s=e.amountIn==null?null:f_(e.amountIn,"amountIn"),a=h_(n,t.scanner),c=t.scanContractRisk||Ht,[l,u,d]=await Promise.all([a.resolveToken(r),a.resolvePools(r),c({address:r,chainId:n},t.contractRiskOpts||t)]),p=await a.scoreRisk(r),m=null;a.supports?.("sellSimulation")&&s?m=await a.sellSimulation({token:r,amountIn:s,base:o||void 0}):a.supports?.("sellSimulation")&&(m=await a.sellSimulation({token:r,amountIn:"10000000000000000"}));let f=null;a.supports?.("quote")&&o&&s&&(f=await a.quote({tokenIn:o,tokenOut:r,amountIn:s}));let h={...e,tokenIn:o,amountIn:s,recipient:i},g=g_({token:l,pools:u,structuralRisk:d,scannerRisk:p,sellability:m,quote:f,args:h,scanner:a}),b=null;return e.prepare===!0&&g.length===0&&(b=await a.prepareUnsignedTx({tokenIn:o,tokenOut:r,amountIn:s,recipient:i,slippageBps:e.slippageBps??50,fee:f?.fee})),{provider:"evm-token-sniper",execution:"prepare-only",chainId:n,chain:{key:a.key,name:a.name,nativeCurrency:a.nativeCurrency},token:l,pools:u,topPool:u?.pools?.[0]||null,structuralRisk:d,scannerRisk:p,sellability:m,quote:f,blockedReasons:g,prepared:!!b,unsignedTx:b,signed:!1,broadcast:!1}}async function s0(){sr();let e=qs();return{ok:e.length>0,provider:"evm-token-sniper",defaultChainId:o0,chainIds:e.map(t=>t.chainId),execution:"prepare-only",signed:!1,broadcast:!1}}var b_=/^(0|[1-9][0-9]*)$/,Pi=class extends Error{constructor(t){super(`nft gas-war limit: ${t.reason}`),this.name="NftGasWarLimitError",this.verdict=t}};function jt(e,t,{required:n=!0,allowZero:r=!1}={}){if(e==null||e===""){if(n)throw new Error(`${t} required`);return null}let o;if(typeof e=="bigint")o=e;else if(typeof e=="number"){if(!Number.isSafeInteger(e))throw new Error(`${t} must be a safe integer`);o=BigInt(e)}else if(typeof e=="string"){let i=e.trim();if(i.startsWith("0x")||i.startsWith("0X"))o=BigInt(i);else{if(!b_.test(i))throw new Error(`${t} must be an integer wei string`);o=BigInt(i)}}else throw new Error(`${t} must be bigint, number, or integer string`);if(o<0n||!r&&o===0n)throw new Error(`${t} must be ${r?"non-negative":"positive"}`);return o}function w_(e){let t=Number(e);if(!Number.isSafeInteger(t)||t<=0)throw new Error("chainId must be a positive integer");return t}function x_(e={}){return e.maxFeePerGas!=null?jt(e.maxFeePerGas,"maxFeePerGas"):e.gasPrice!=null?jt(e.gasPrice,"gasPrice"):null}function Ni(e={}){try{let t=w_(e.chainId??e.tx?.chainId),n=e.tx||e,r=e.policy||e,o=r.grant?.maxGasWei??e.grant?.maxGasWei,i=jt(r.maxTotalGasWei??r.maxGasWei??o,"maxTotalGasWei"),s=jt(n.gasLimit??n.gas,"gasLimit"),a=x_(n);if(a==null)throw new Error("maxFeePerGas or gasPrice required");let c=jt(r.maxFeePerGasWei,"maxFeePerGasWei",{required:!1}),l=jt(r.maxPriorityFeePerGasWei,"maxPriorityFeePerGasWei",{required:!1}),u=n.maxPriorityFeePerGas==null?null:jt(n.maxPriorityFeePerGas,"maxPriorityFeePerGas"),d=s*a;return d>i?{ok:!1,status:"BLOCK",reason:`total gas ${d} exceeds cap ${i}`,chainId:t,totalGasWei:d.toString(),maxTotalGasWei:i.toString()}:c!=null&&a>c?{ok:!1,status:"BLOCK",reason:`unit fee ${a} exceeds cap ${c}`,chainId:t,unitFeeWei:a.toString(),maxFeePerGasWei:c.toString(),totalGasWei:d.toString(),maxTotalGasWei:i.toString()}:u!=null&&l!=null&&u>l?{ok:!1,status:"BLOCK",reason:`priority fee ${u} exceeds cap ${l}`,chainId:t,priorityFeeWei:u.toString(),maxPriorityFeePerGasWei:l.toString(),totalGasWei:d.toString(),maxTotalGasWei:i.toString()}:{ok:!0,status:"PASS",reason:"gas envelope within NFT mint gas-war caps",chainId:t,totalGasWei:d.toString(),maxTotalGasWei:i.toString(),unitFeeWei:a.toString(),maxFeePerGasWei:c?.toString()??null,priorityFeeWei:u?.toString()??null,maxPriorityFeePerGasWei:l?.toString()??null}}catch(t){return{ok:!1,status:"BLOCK",reason:String(t?.message||t)}}}function S_(e={}){let t=Ni(e);if(!t.ok)throw new Pi(t);return t}var k_=5,_c=[50,75,90],a0=Object.freeze({normal:{percentile:0,baseFeeMultiplier:2n,label:"normal"},fast:{percentile:1,baseFeeMultiplier:3n,label:"fast"},war:{percentile:2,baseFeeMultiplier:4n,label:"war"}});function Vt(e,t){if(e==null)return null;try{if(typeof e=="bigint")return e;if(typeof e=="number"){if(!Number.isFinite(e)||e<0)throw new Error("bad number");return BigInt(Math.floor(e))}let n=String(e).trim();return n.startsWith("0x"),BigInt(n)}catch{throw new Error(`${t} must be a non-negative integer (wei)`)}}function v_(e){let t=e.filter(n=>n!=null).sort((n,r)=>n<r?-1:n>r?1:0);return t.length?t[Math.floor(t.length/2)]:null}async function Ci(e={},t={}){let n=t.rpcCall||L,r=Number(e.chainId);if(!Number.isInteger(r))return{status:"error",error:"chainId is required",viable:!1};let o=a0[e.urgency||"fast"];if(!o)return{status:"error",viable:!1,error:`urgency must be one of: ${Object.keys(a0).join(", ")}`};let i,s,a,c;try{i=Vt(e.maxFeePerGasWei,"maxFeePerGasWei"),s=Vt(e.maxPriorityFeePerGasWei,"maxPriorityFeePerGasWei"),a=Vt(e.gasLimit,"gasLimit"),c=Vt(e.maxTotalGasWei,"maxTotalGasWei")}catch(I){return{status:"error",viable:!1,error:I.message}}let l,u;try{[l,u]=await Promise.all([n(r,"eth_feeHistory",[`0x${k_.toString(16)}`,"pending",_c],t),n(r,"eth_getBlockByNumber",["pending",!1],t)])}catch(I){return{status:"unavailable",viable:!1,error:I?.message||"fee history unavailable",notes:["could not read live fee data; refusing to guess a competitive bid"]}}let d=Vt(u?.baseFeePerGas,"baseFeePerGas")??Vt(l?.baseFeePerGas?.[l.baseFeePerGas.length-1],"baseFeePerGas");if(d==null)return{status:"unavailable",viable:!1,error:"chain did not report a baseFeePerGas (pre-EIP-1559?)",notes:["this pricer is EIP-1559 only"]};let m=(Array.isArray(l?.reward)?l.reward:[]).map(I=>{try{return Vt(I?.[o.percentile],"reward")}catch{return null}}).filter(I=>I!=null&&I>0n),f=v_(m),h=[];f==null&&h.push("no non-zero tips observed in recent blocks; using a 1 gwei floor");let g=f??1000000000n,b=d*o.baseFeeMultiplier+g,k=[];s!=null&&g>s&&(k.push({field:"maxPriorityFeePerGas",wanted:g.toString(),capped:s.toString()}),g=s,b=d*o.baseFeeMultiplier+g),i!=null&&b>i&&(k.push({field:"maxFeePerGas",wanted:b.toString(),capped:i.toString()}),b=i,g>b&&(g=b));let x=a!=null?a*b:null;c!=null&&x!=null&&x>c&&k.push({field:"totalGas",wanted:x.toString(),capped:c.toString()});let w=f==null||g>=f,E=c==null||x==null||x<=c,C=w&&E;return w||h.push(`tip cap ${g} is below the observed ${_c[o.percentile]}th-percentile tip ${f}; this bid is unlikely to land`),E||h.push(`worst-case gas ${x} exceeds the ${c} total cap`),h.push("maxFeePerGas is a ceiling \u2014 unused headroom above basefee+tip is refunded, not spent"),{status:"ok",viable:C,chainId:r,urgency:o.label,baseFeePerGas:d.toString(),observedTip:f==null?null:f.toString(),percentile:_c[o.percentile],maxFeePerGas:b.toString(),maxPriorityFeePerGas:g.toString(),worstCaseGasWei:x==null?null:x.toString(),clamps:k,notes:h}}var A_="08c379a0",I_="4e487b71",__=Object.freeze({1:"assertion failed",17:"arithmetic overflow or underflow",18:"division or modulo by zero",33:"invalid enum value",34:"invalid storage byte array encoding",49:"pop() on an empty array",50:"array index out of bounds",65:"out of memory",81:"call to an uninitialized function pointer"});function P_(e){if(!e||e==="0x")return{kind:"empty",reason:"reverted without a reason (often a require with no message, or out of gas)"};let t=String(e).slice(2),n=t.slice(0,8);if(n===A_)try{let r=parseInt(t.slice(72,136),16),o=t.slice(136,136+r*2);return{kind:"revert",reason:Buffer.from(o,"hex").toString("utf8"),selector:`0x${n}`}}catch{return{kind:"revert",reason:"Error(string) payload could not be decoded",selector:`0x${n}`}}if(n===I_){let r=parseInt(t.slice(8,72),16);return{kind:"panic",code:r,reason:__[r]||`panic code 0x${r.toString(16)}`,selector:`0x${n}`}}return{kind:"custom",reason:`custom error ${`0x${n}`} (decoding needs the contract ABI)`,selector:`0x${n}`}}function N_(e){let t=[e?.data,e?.error?.data,e?.data?.data,e?.cause?.data,e?.body?.error?.data];for(let o of t){if(typeof o=="string"&&o.startsWith("0x")&&o.length>2)return o;if(typeof o?.data=="string"&&o.data.startsWith("0x")&&o.data.length>2)return o.data}let r=String(e?.message||"").match(/0x[0-9a-fA-F]{72,}/);return r?r[0]:null}function C_(e,t){if(t)return!0;let n=String(e?.message||"").toLowerCase();return!!/execution reverted|revert|invalid opcode|out of gas|stack underflow|insufficient funds for/.test(n)}function T_(e={}){let t={};return e.from&&(t.from=String(e.from).toLowerCase()),e.to&&(t.to=String(e.to).toLowerCase()),e.data&&e.data!=="0x"&&(t.data=e.data),e.value!=null&&String(e.value)!=="0"&&(t.value=`0x${BigInt(e.value).toString(16)}`),t}async function $r(e={},t={}){let n=t.rpcCall||L,r=Number(e.chainId),o=e.tx||{};if(!Number.isInteger(r))return{status:"error",willRevert:null,error:"chainId is required"};if(!o.to||!/^0x[a-fA-F0-9]{40}$/.test(String(o.to)))return{status:"error",willRevert:null,error:"tx.to must be a valid address"};if(o.from&&!/^0x[a-fA-F0-9]{40}$/.test(String(o.from)))return{status:"error",willRevert:null,error:"tx.from must be a valid address"};let i=T_(o),s=[],a=null,c=!1,l=null;try{a=await n(r,"eth_call",[i,"pending"],t)}catch(f){let h=N_(f);if(!C_(f,!!h))return{status:"unavailable",willRevert:null,chainId:r,error:f?.message||"simulation unavailable",notes:["could not reach the node; this is NOT evidence the transaction would fail"]};c=!0,l=P_(h),h||(l.reason="execution reverted (node did not return a reason payload)",l.kind="revert-no-data")}if(c)return{status:"ok",willRevert:!0,chainId:r,revert:l,summary:`would REVERT: ${l.reason}`,notes:["simulated against current chain state; signing this now would burn gas and fail"]};let u=null,d=null;if(e.estimateGas!==!1)try{let f=await n(r,"eth_estimateGas",[i,"pending"],t);u=BigInt(f);let h=BigInt(Math.max(0,Math.floor(e.gasBufferPercent??20)));d=u+u*h/100n,s.push(`gasLimit includes a ${h}% buffer over the ${u} estimate`)}catch(f){s.push(`gas estimation failed: ${f?.message||"unknown"}`)}s.push("a pass reflects CURRENT chain state \u2014 it is not a guarantee the transaction lands, and in a contested mint the state changes between blocks");let p=`0x${"0".repeat(64)}`,m=a===p;return m&&s.push("call did not revert but returned boolean false \u2014 some ERC-20s (e.g. USDC) signal failure this way instead of reverting"),{status:"ok",willRevert:!1,returnsFalse:m,chainId:r,returnData:a,gasEstimate:u==null?null:u.toString(),gasLimit:d==null?null:d.toString(),summary:m?"executes but returns FALSE \u2014 the contract is rejecting this operation":u?`would succeed, ~${u} gas`:"would succeed",notes:s}}async function c0(e={}){let t=Date.now();try{let n=await $r({chainId:1,tx:{to:"0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2",data:`0x70a08231${"0".repeat(64)}`},estimateGas:!1},e),r=n.status==="ok";return{provider:"evm-simulate",status:r?"ok":"degraded",latencyMs:Date.now()-t,detail:r?"eth_call reachable":n.error||"probe failed"}}catch(n){return{provider:"evm-simulate",status:"down",latencyMs:Date.now()-t,detail:n?.message||"probe failed"}}}var R_=Object.freeze([{selector:"a0712d68",signature:"mint(uint256)",args:["quantity"]},{selector:"40c10f19",signature:"mint(address,uint256)",args:["to","quantity"]},{selector:"1249c58b",signature:"mint()",args:[]},{selector:"2db11544",signature:"publicMint(uint256)",args:["quantity"]},{selector:"efef39a1",signature:"purchase(uint256)",args:["quantity"]},{selector:"a6f2ae3a",signature:"buy()",args:[]}]);function $_(e){let t=BigInt(e).toString(16);if(t.length>64)throw new Error("value too large for a 32-byte word");return t.padStart(64,"0")}function L_(e){let t=String(e).toLowerCase().replace(/^0x/,"");if(!/^[a-f0-9]{40}$/.test(t))throw new Error(`invalid address: ${e}`);return t.padStart(64,"0")}function l0(e,{minter:t,quantity:n}){let r=`0x${e.selector}`;for(let o of e.args)if(o==="to")r+=L_(t);else if(o==="quantity")r+=$_(n);else throw new Error(`unsupported mint argument: ${o}`);return r}async function Ti(e={},t={}){let n=t.rpcCall||L,r=String(e.address||"").trim().toLowerCase(),o=Number(e.chainId);if(!/^0x[a-f0-9]{40}$/.test(r))return{status:"error",error:"address must be a 0x-prefixed EVM address",found:[]};if(!Number.isInteger(o))return{status:"error",error:"chainId is required",found:[]};let i;try{i=await n(o,"eth_getCode",[r,"latest"],t)}catch(c){return{status:"unavailable",error:c?.message||"eth_getCode failed",found:[]}}if(!i||i==="0x")return{status:"ok",found:[],notes:["no contract deployed at this address"]};let s=i.slice(2).toLowerCase(),a=R_.filter(c=>s.includes(c.selector));return{status:"ok",address:r,chainId:o,found:a,notes:a.length?[]:["no known public mint selector found; this contract may use a custom or allowlist-only entrypoint"]}}async function u0(e={}){let t=Date.now();try{let n=await Ti({address:"0x8a90cab2b38dba80c64b7734e58ee1db38b8992e",chainId:1},e),r=n.status==="ok";return{provider:"nft-mint",status:r?"ok":"degraded",latencyMs:Date.now()-t,detail:r?"bytecode reads reachable":n.error||"probe failed"}}catch(n){return{provider:"nft-mint",status:"down",latencyMs:Date.now()-t,detail:n?.message||"probe failed"}}}async function Pc(e={},t={}){let n=String(e.contract||e.address||"").trim().toLowerCase(),r=Number(e.chainId),o=String(e.minter||e.from||"").trim().toLowerCase(),i=e.quantity==null?1:Number(e.quantity);if(!/^0x[a-f0-9]{40}$/.test(n))return{status:"error",error:"contract must be a 0x-prefixed EVM address"};if(!/^0x[a-f0-9]{40}$/.test(o))return{status:"error",error:"minter address is required"};if(!Number.isInteger(i)||i<1)return{status:"error",error:"quantity must be a positive integer"};if(!Number.isInteger(r))return{status:"error",error:"chainId is required"};let s=await Ti({address:n,chainId:r},t);if(s.status!=="ok")return{status:s.status,error:s.error};if(!s.found.length)return{status:"unsupported",error:"no known public mint function found in this contract's bytecode",notes:s.notes};let a=e.signature?s.found.find(b=>b.signature===e.signature):s.found[0];if(!a)return{status:"error",error:`requested signature ${e.signature} not present in this contract`,available:s.found.map(b=>b.signature)};let c=s.found.length>1&&!e.signature,l=await Ht({address:n,chainId:r},t),u=null;if(e.simulate!==!1&&(u=await $r({chainId:r,tx:{from:o,to:n,data:l0(a,{minter:o,quantity:i}),value:e.valueWei},gasBufferPercent:e.gasBufferPercent},t),u.willRevert===!0&&e.ignoreRevert!==!0))return{status:"would-revert",error:`mint would revert: ${u.revert.reason}`,simulation:u,mintFunction:a.signature,notes:["signing this now would burn gas and fail; pass ignoreRevert to prepare anyway (e.g. a mint that has not opened yet)"]};let d=e.gasLimit??(u?.gasLimit?Number(u.gasLimit):null),p=await Ci({chainId:r,urgency:e.urgency||"war",gasLimit:d,maxFeePerGasWei:e.maxFeePerGasWei,maxPriorityFeePerGasWei:e.maxPriorityFeePerGasWei,maxTotalGasWei:e.maxTotalGasWei},t);if(p.status!=="ok")return{status:"unavailable",error:p.error,notes:p.notes};let m;try{m=l0(a,{minter:o,quantity:i})}catch(b){return{status:"error",error:b.message}}let f={chainId:r,from:o,to:n,data:m,value:e.valueWei==null?"0":String(e.valueWei),gasLimit:d==null?null:String(d),maxFeePerGas:p.maxFeePerGas,maxPriorityFeePerGas:p.maxPriorityFeePerGas},h={ok:!0,skipped:!0,reason:"no gasLimit or cap supplied"};if(d!=null&&(e.maxTotalGasWei!=null||e.grant!=null)&&(h=Ni({chainId:r,tx:{gasLimit:d,maxFeePerGas:p.maxFeePerGas,maxPriorityFeePerGas:p.maxPriorityFeePerGas},policy:{maxTotalGasWei:e.maxTotalGasWei,maxFeePerGasWei:e.maxFeePerGasWei,maxPriorityFeePerGasWei:e.maxPriorityFeePerGasWei,grant:e.grant}}),!h.ok))return{status:"refused",error:`gas-war cap exceeded: ${h.reason||h.error}`,gas:p,capCheck:h};let g=[];return c&&g.push(`contract exposes ${s.found.length} mint entrypoints (${s.found.map(b=>b.signature).join(", ")}); defaulted to ${a.signature} \u2014 pass signature to choose`),l.risk==="high"&&g.push(`contract risk HIGH: ${l.findings.map(b=>b.name).join(", ")}`),p.viable||g.push(p.notes[0]),h.skipped&&g.push("gas-war caps NOT enforced: supply gasLimit plus maxTotalGasWei or a grant"),{status:"ok",execution:"prepare-only",signed:!1,tx:f,mintFunction:a.signature,alternatives:s.found.map(b=>b.signature),quantity:i,gas:p,simulation:u,contractRisk:{risk:l.risk,findings:l.findings,isProxy:l.isProxy},capCheck:h,warnings:g}}var U_=1440*60*1e3;function B_(e={},{nowMs:t=Date.now()}={}){let n=[];if(!e||typeof e!="object")return{ok:!1,problems:["grant is required for execute mode"]};let r=String(e.contract||"").toLowerCase();/^0x[a-f0-9]{40}$/.test(r)||n.push("grant.contract must be an exact address"),Number.isInteger(Number(e.chainId))||n.push("grant.chainId is required"),e.maxTotalGasWei==null&&n.push("grant.maxTotalGasWei is required"),e.maxValueWei==null&&n.push("grant.maxValueWei is required (mint price ceiling)");let o=Number(e.expiresAt);return Number.isFinite(o)?o<=t?n.push("grant has expired"):o-t>U_&&n.push("grant TTL exceeds 24h"):n.push("grant.expiresAt is required"),{ok:n.length===0,problems:n,contract:r,chainId:Number(e.chainId)}}function d0(e={},t={}){let r=e.actionMode==="execute"?"execute":e.actionMode||"alert_only",o=String(e.contract||"").trim().toLowerCase(),i=Number(e.chainId),s=[];if(!/^0x[a-f0-9]{40}$/.test(o))return{status:"error",error:"contract must be a 0x-prefixed EVM address"};if(!Number.isInteger(i))return{status:"error",error:"chainId is required"};if(r!=="alert_only"&&r!=="execute")return{status:"ok",actionMode:"alert_only",requestedMode:r,downgraded:!0,contract:o,chainId:i,quantity:e.quantity==null?1:Number(e.quantity),urgency:e.urgency||"war",grant:null,notes:[`unrecognized actionMode ${JSON.stringify(r)} \u2014 defaulted to alert_only; only the exact string "execute" arms a trigger`]};let a=r;if(r==="execute")if(!un(t.env||process.env))a="alert_only",s.push("DOWNGRADED to alert_only: autonomous trading is off \u2014 set ORACLE_AUTONOMOUS_TRADING=1 to let a trigger fire unattended");else{let c=B_(e.grant,{nowMs:t.nowMs});c.ok?(c.contract!==o||c.chainId!==i)&&(a="alert_only",s.push("DOWNGRADED to alert_only: grant does not match this contract/chain \u2014 a grant authorizes one exact target")):(a="alert_only",s.push(`DOWNGRADED to alert_only: ${c.problems.join("; ")}`))}return a==="alert_only"?s.push("alert_only: Oracle will notify and prepare an artifact; you sign it"):s.push("ARMED: this trigger will submit a prepared, capped mint automatically when the mint opens"),{status:"ok",actionMode:a,requestedMode:r,downgraded:a!==r,contract:o,chainId:i,quantity:e.quantity==null?1:Number(e.quantity),urgency:e.urgency||"war",grant:a==="execute"?e.grant:null,notes:s}}async function p0(e={},t={}){let n=t.rpcCall||L,r=String(e.contract||"").trim().toLowerCase(),o=Number(e.chainId);if(!/^0x[a-f0-9]{40}$/.test(r)||!Number.isInteger(o))return{status:"error",open:!1,error:"contract and chainId are required"};let i=[{selector:"0xeb8d2444",name:"saleIsActive()",openWhen:!0},{selector:"0x25fd90f3",name:"mintActive()",openWhen:!0},{selector:"0x68428a1b",name:"saleActive()",openWhen:!0},{selector:"0x22f3e2d4",name:"isActive()",openWhen:!0},{selector:"0x5c975abb",name:"paused()",openWhen:!1}];for(let s of i)try{let a=await n(o,"eth_call",[{to:r,data:s.selector},"latest"],t);if(a&&a!=="0x"){let c=BigInt(a)===1n;return{status:"ok",open:s.openWhen?c:!c,evidence:s.name,raw:a}}}catch{}return{status:"unknown",open:!1,notes:["no readable sale-state flag; cannot confirm the mint is open \u2014 will not fire on a guess"]}}var F_=1440*60*1e3;function q_(e={},{nowMs:t=Date.now()}={}){let n=[];if(!e||typeof e!="object")return{ok:!1,problems:["grant is required for execute mode"]};let r=String(e.contract||"").toLowerCase();/^0x[a-f0-9]{40}$/.test(r)||n.push("grant.contract must be an exact address"),Number.isInteger(Number(e.chainId))||n.push("grant.chainId is required"),e.maxTotalGasWei==null&&n.push("grant.maxTotalGasWei is required"),e.maxValueWei==null&&n.push("grant.maxValueWei is required (mint price ceiling)"),String(e.maxValueWei)!=="0"&&n.push("grant.maxValueWei must be 0 for Mancers free mints");let o=Number(e.expiresAt);return Number.isFinite(o)?o<=t?n.push("grant has expired"):o-t>F_&&n.push("grant TTL exceeds 24h"):n.push("grant.expiresAt is required"),{ok:n.length===0,problems:n,contract:r,chainId:Number(e.chainId)}}var m0="0x797a2e030B7e49107C8F07bF0300Ea9caE88cA57",H_=4663,j_="0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef",f0="a22cb465",V_="a0712d68";function Nc(e){return String(e||"").trim().toLowerCase()}function $n(e){return String(e||"").toLowerCase().replace(/^0x/,"")}function z_(e){let t=$n(e);if(!/^[a-f0-9]{40}$/.test(t))throw new Error("revoke operator must be an address");return`0x${f0}${t.padStart(64,"0")}${"0".repeat(64)}`}function W_(e){return $n(e).includes($n(m0))}function G_(e={}){return(Array.isArray(e.calls)?e.calls:[]).some(n=>$n(n?.data).startsWith(f0))}function K_(e={},t){let n=$n(t).padStart(64,"0");return(Array.isArray(e.logs)?e.logs:[]).some(o=>{let i=o?.topics||[];return Nc(i[0])!==j_?!1:$n(i[2])===n})}function Y_(e=1){return`0x${V_}${BigInt(e).toString(16).padStart(64,"0")}`}function h0(e={},t={}){let n=Nc(e.contract),r=Nc(e.minter),o=Number(e.chainId),i=e.valueWei==null?"0":String(e.valueWei),s=[];/^0x[a-f0-9]{40}$/.test(n)||s.push("contract must be a 0x address"),/^0x[a-f0-9]{40}$/.test(r)||s.push("minter must be a 0x address"),o!==H_&&s.push("only Robinhood chain 4663"),i!=="0"&&s.push("value must be 0 \u2014 paid mints are skipped"),W_(e.bytecode||"")||s.push("bytecode does not reference Mancers 0x797a\u20268cA57 \u2014 no allowlist gate found");let a=e.simulation||{};a.willRevert===!0&&s.push("mint simulation reverts"),G_(a)&&s.push("simulation sets approval / setApprovalForAll"),K_(a,r)||s.push("simulation has no ERC721 Transfer to minter");let c=s.length===0,l={chainId:o,from:r,to:n,data:Y_(e.quantity??1),value:"0"},u={chainId:o,from:r,to:n,data:z_(n),value:"0"},d=!1;if(c&&e.actionMode==="execute")if(!Mp(t.env||process.env))s.push("DOWNGRADED: ORACLE_AUTONOMOUS_MINT=1 required to fire");else{let p=q_(e.grant,{nowMs:t.nowMs});p.ok?p.contract!==n||p.chainId!==o?s.push("DOWNGRADED: grant does not match this contract/chain"):d=!0:s.push(`DOWNGRADED: ${p.problems.join("; ")}`)}return{status:c?"ok":"fail",verdict:c?"unknown-risk":"fail",failClosedPass:c,executeFire:d,oneShot:d,execution:"prepare-only",signed:!1,chainId:o,contract:n,minter:r,gate:m0.toLowerCase(),reasons:s,mintTx:l,revokeTx:u,notes:["failClosedPass is not safe \u2014 owner can still change the contract after this block",d?"ARMED one-shot: fire mint then revoke; grant must not be reused":"prepare-only: unsigned mint + revoke; arm this exact contract to fire"]}}T();me();W();var Q_="https://api.paraswap.io",Cc=(e={})=>(e.baseUrl||process.env.PARASWAP_API_URL||Q_).replace(/\/$/,"");function Ln(e,t){let n=String(e||"");if(!/^0x[0-9a-fA-F]{40}$/.test(n))throw new Error(`${t} must be a 20-byte token address`);return n.toLowerCase()}async function Tc(e={},t={}){let n=Number(e.chainId||1);return y(`${Cc(t)}/tokens/${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function wt(e={},t={}){let n=Number(e.chainId||e.network||1);if(e.amount==null)throw new Error("amount required");let r=new URLSearchParams({srcToken:Ln(e.srcToken,"srcToken"),destToken:Ln(e.destToken,"destToken"),amount:String(e.amount),srcDecimals:String(Number(e.srcDecimals)),destDecimals:String(Number(e.destDecimals)),side:String(e.side||"SELL").toUpperCase(),network:String(n),version:String(e.version||"6.2")});e.includeDEXS&&r.set("includeDEXS",String(e.includeDEXS)),e.excludeDEXS&&r.set("excludeDEXS",String(e.excludeDEXS));let o=await Uo({wallet:e.userAddress||e.fromAddress,env:t.env,action:e.feeAction||"swap",holderCheck:t.holderCheck});for(let[a,c]of Object.entries(fp(o)))r.set(a,c);let i=await y(`${Cc(t)}/prices?${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4}),s=i?.priceRoute?.destAmount;return s?{...V(i,{chainId:n,venue:i?.priceRoute?.contractAddress||"paraswap-quote",amountOut:s,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,quoteAgeMs:0,requestedCapBps:e.maxSlippageBps??e.slippageBps}),executionReady:!1,executionBlocker:"call prepare to bind the price route to a validated transaction",oracleFee:o}:{...i,executionReady:!1,oracleFee:o}}async function g0(e={},t={}){if(String(e.side||"SELL").toUpperCase()!=="SELL")throw new Error("paraswap: agentic prepare currently supports exact-input SELL only");let n=Number(e.chainId||e.network||1),r=Ln(e.userAddress,"userAddress"),o=await wt(e,t),i=o?.priceRoute,s=String(i?.contractAddress||"").toLowerCase();if(!s)throw new Error("paraswap: price route missing contractAddress");let a={srcToken:Ln(e.srcToken,"srcToken"),destToken:Ln(e.destToken,"destToken"),srcAmount:String(i.srcAmount||e.amount),destAmount:String(o.amountOutMinimum),priceRoute:i,userAddress:r,ignoreChecks:!1,ignoreGasEstimate:!1};e.receiver&&(a.receiver=Ln(e.receiver,"receiver"));let c=await y(`${Cc(t)}/transactions/${n}`,{method:"POST",body:a,fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??25e3});if(Number(c.chainId??n)!==n)throw new Error("paraswap: transaction chain mismatch");if(String(c.to||"").toLowerCase()!==s)throw new Error("paraswap: transaction target mismatch");if(c.from&&String(c.from).toLowerCase()!==r)throw new Error("paraswap: transaction sender mismatch");return O({provider:"paraswap",calldataReady:!0,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:n,quote:o,autoSlippage:o.autoSlippage,requiresApproval:a.srcToken!=="0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee"?{token:a.srcToken,spender:i.tokenTransferProxy||s,amount:a.srcAmount}:null,transaction:{chainId:n,from:c.from||r,to:c.to,data:c.data,value:c.value??"0x0",...c.gas!=null?{gasLimit:c.gas}:{},slippageGuard:J(o.autoSlippage,{chainId:n,venue:c.to,data:c.data})}},{provider:"paraswap",kind:"paraswap-tx"})}async function y0(e={}){let t=await Tc({chainId:1},e),n=Array.isArray(t?.tokens)?t.tokens.length:Object.keys(t?.tokens||{}).length;return{ok:n>0,tokenSample:n}}import{createHash as Z_}from"node:crypto";import{getAddress as v0,isAddress as Oc}from"ethers";var b0="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",e1=Object.freeze(["lifi","paraswap","0x","cow","uniswap-v3"]),t1=Object.freeze(["lifi"]),w0=/^0x[0-9a-fA-F]{64}$/,n1=/^\d+$/;function Q(e,t="invalid"){throw new Error(`rfq: ${e} ${t}`)}function x0(e,t){let n=Number(e);return(!Number.isSafeInteger(n)||n<=0)&&Q(t,"must be a positive chainId"),n}function Oi(e,t){let n=String(e??"").trim();return(!n1.test(n)||BigInt(n)<=0n)&&Q(t,"must be a positive integer string"),n}function r1(e,t){return e==null||e===""?null:Oi(e,t)}function S0(e,t){let n=String(e??"").trim();return n.toLowerCase()===b0.toLowerCase()?b0:(Oc(n)||Q(t,"must be an EVM address or native token sentinel"),v0(n))}function E0(e,t){let n=String(e??"").trim();return Oc(n)||Q(t,"must be an EVM address"),v0(n)}function o1(e,t){return e==null||e===""?null:E0(e,t)}function k0(e,t,n){return e===void 0?[...n]:(Array.isArray(e)||Q(t,"must be an array"),e.map(r=>String(r).trim()).filter(Boolean))}function i1(e,{nowMs:t,maxDeadlineMs:n},r){let o=Number(e);return Number.isFinite(o)||Q(r,"must be a finite millisecond timestamp"),o<=t&&Q(r,"expired"),o>t+n&&Q(r,"exceeds maxDeadlineMs"),Math.floor(o)}function Mn(e){if(Array.isArray(e))return e.map(Mn);if(e&&typeof e=="object"){let t={};for(let n of Object.keys(e).sort())e[n]!==void 0&&(t[n]=Mn(e[n]));return t}return e}function s1(e){return JSON.stringify(Mn(e))}function Ri(e){return`0x${Z_("sha256").update(s1(e)).digest("hex")}`}function A0(e,t){let n={...e};for(let r of t)delete n[r];return n}function I0(e){return Ri(A0(e,["intentHash"]))}function _0(e){return Ri(A0(e,["firmQuoteHash"]))}function $i(e={},t={}){let n=Number(t.nowMs??Date.now()),r=Number(t.maxDeadlineMs??1800*1e3);(!Number.isFinite(n)||!Number.isFinite(r)||r<=0)&&Q("time","is invalid");let o=x0(e.fromChainId??e.fromChain,"fromChainId"),i=x0(e.toChainId??e.toChain,"toChainId"),a=o===i?e1:t1,c={kind:"rfq-intent",version:1,fromChainId:o,toChainId:i,sellToken:S0(e.sellToken??e.tokenIn??e.fromToken,"sellToken"),buyToken:S0(e.buyToken??e.tokenOut??e.toToken,"buyToken"),sellAmount:Oi(e.sellAmount??e.amountIn??e.fromAmount,"sellAmount"),receiver:E0(e.receiver??e.recipient??e.to,"receiver"),deadlineMs:i1(e.deadlineMs??e.deadline??e.expiresAtMs,{nowMs:n,maxDeadlineMs:r},"deadline"),minBuyAmount:r1(e.minBuyAmount??e.minOut??e.amountOutMin,"minBuyAmount"),allowedSources:k0(e.allowedSources,"allowedSources",a),allowedRouters:k0(e.allowedRouters,"allowedRouters",[]),slippageBps:Number.isFinite(Number(e.slippageBps))?Number(e.slippageBps):null,partialFill:e.partialFill===!0,metadata:e.metadata&&typeof e.metadata=="object"&&!Array.isArray(e.metadata)?Mn(e.metadata):{}};return c.slippageBps!=null&&(!Number.isInteger(c.slippageBps)||c.slippageBps<0||c.slippageBps>1e4)&&Q("slippageBps","must be 0 to 10000"),c.intentId=e.intentId?String(e.intentId):Ri({seed:"rfq-intent",intent:c}).slice(0,34),c.intentHash=I0(c),Object.freeze(c)}function a1(e){return(!e||typeof e!="object"||Array.isArray(e))&&Q("artifact","required"),e.typedDataHash!=null&&!w0.test(String(e.typedDataHash))&&Q("artifact.typedDataHash","must be bytes32"),e.calldataHash!=null&&!w0.test(String(e.calldataHash))&&Q("artifact.calldataHash","must be bytes32"),e.to!=null&&!Oc(String(e.to))&&Q("artifact.to","must be an address"),e.data!=null&&!/^0x(?:[0-9a-fA-F]{2})*$/.test(String(e.data))&&Q("artifact.data","must be hex"),Mn(e)}function Rc(e,t={},n={}){(!e||e.kind!=="rfq-intent")&&Q("intent","required");let r=Number(n.nowMs??Date.now()),o=Number(t.expiryMs??t.expiresAtMs??t.validUntilMs);Number.isFinite(o)||Q("quote expiry","required"),o<=r&&Q("quote","expired"),o>e.deadlineMs&&Q("quote expiry","exceeds intent deadline");let i=String(t.source??t.provider??"").trim();i||Q("source","required"),e.allowedSources.includes(i)||Q("source","not allowed by intent");let s=Oi(t.amountOut??t.buyAmount,"amountOut"),a=Oi(t.minBuyAmount??t.minOut??s,"minBuyAmount");BigInt(a)>BigInt(s)&&Q("minBuyAmount","exceeds amountOut");let c=a1(t.artifact??t.executableArtifact??t.transaction??t.typedData),l=Number(t.quotedAtMs??t.timestampMs??n.nowMs??Date.now());Number.isFinite(l)||Q("quotedAtMs","must be finite");let u=o1(t.router??t.settlementRouter??c.to,"router"),d={kind:"rfq-firm-quote",provider:"rfq",surface:"rfq",version:1,quoteId:String(t.quoteId??t.id??"").trim(),source:i,intentHash:e.intentHash,fromChainId:e.fromChainId,toChainId:e.toChainId,sellToken:e.sellToken,buyToken:e.buyToken,sellAmount:e.sellAmount,receiver:e.receiver,router:u,amountOut:s,minBuyAmount:a,quotedAtMs:Math.floor(l),expiryMs:Math.floor(o),artifact:c,maker:t.maker?String(t.maker):null,metadata:t.metadata&&typeof t.metadata=="object"&&!Array.isArray(t.metadata)?Mn(t.metadata):{}};return d.quoteId||(d.quoteId=Ri({seed:"rfq-quote",out:d}).slice(0,34)),d.firmQuoteHash=_0(d),Object.freeze(d)}function Lr(e,t){return Array.isArray(e?.allowedSources)&&e.allowedSources.includes(t)}function P0(e,t){return String(e?.[t]??"").trim()}function Mr(e,t){return Object.freeze({source:e,run:t})}function N0(e,t={}){if(!e||e.kind!=="rfq-intent")throw new Error("rfq: intent required");let n=t.env??process.env,r=t.providers??{},o=t.supportedUniV3Chains??ce,i=Number(e.fromChainId)===Number(e.toChainId),s=[];return Lr(e,"lifi")&&s.push(Mr("lifi",async()=>{let c=await(r.lifiQuote??dt)({fromChain:e.fromChainId,toChain:e.toChainId,fromToken:e.sellToken,toToken:e.buyToken,fromAmount:e.sellAmount,fromAddress:e.receiver},t),l=c?.estimate??c?.[0]?.estimate??c;return{quoteId:c?.id??c?.routeId??null,amountOut:l?.toAmount??c?.toAmount,minBuyAmount:l?.toAmountMin??c?.toAmountMin??l?.toAmount??c?.toAmount,expiryMs:Date.now()+Number(t.defaultQuoteTtlMs??2e4),artifact:{type:"lifi-route",calldataHash:c?.transactionRequest?.data?await c1(t,c.transactionRequest.data):void 0,route:c},metadata:{tool:c?.tool??c?.toolDetails?.name??null}}})),i&&(Lr(e,"paraswap")&&s.push(Mr("paraswap",async()=>{let c=await(r.paraswapPrice??wt)({chainId:e.fromChainId,srcToken:e.sellToken,destToken:e.buyToken,amount:e.sellAmount,srcDecimals:t.decimalsIn,destDecimals:t.decimalsOut},t),l=c?.priceRoute??c;return{quoteId:l?.id??null,amountOut:l?.destAmount,minBuyAmount:c?.amountOutMinimum??l?.destAmount,expiryMs:Date.now()+Number(t.defaultQuoteTtlMs??2e4),artifact:{type:"paraswap-price-route",route:l},metadata:{contractAddress:l?.contractAddress??null}}})),Lr(e,"0x")&&(P0(n,"ZEROX_API_KEY")||P0(n,"0X_API_KEY")||r.zeroxQuote)&&s.push(Mr("0x",async()=>{let c=await(r.zeroxQuote??Lt)({chainId:e.fromChainId,sellToken:e.sellToken,buyToken:e.buyToken,sellAmount:e.sellAmount,taker:e.receiver},t);return{quoteId:c?.id??null,amountOut:c?.buyAmount??c?.grossBuyAmount,minBuyAmount:c?.minBuyAmount??c?.buyAmount,expiryMs:Date.now()+Number(t.defaultQuoteTtlMs??2e4),artifact:{type:"0x-transaction",to:c?.transaction?.to,data:c?.transaction?.data,value:c?.transaction?.value??"0"},metadata:{route:c?.route??null}}})),Lr(e,"cow")&&s.push(Mr("cow",async()=>{let c=await(r.cowQuote??mt)({chainId:e.fromChainId,sellToken:e.sellToken,buyToken:e.buyToken,sellAmountBeforeFee:e.sellAmount,from:e.receiver,signingScheme:"eip712"},t),l=c?.quote??c;return{quoteId:c?.id??null,amountOut:l?.buyAmount,minBuyAmount:l?.buyAmount,expiryMs:Math.min(Number(l?.validTo??0)*1e3||Date.now()+Number(t.defaultQuoteTtlMs??2e4),e.deadlineMs),artifact:{type:"cow-order",order:l},metadata:{solver:!0}}})),Lr(e,"uniswap-v3")&&o[Number(e.fromChainId)]&&s.push(Mr("uniswap-v3",async()=>{let c=await(r.uniV3QuoteExactIn??at)({chainId:e.fromChainId,tokenIn:e.sellToken,tokenOut:e.buyToken,amountIn:e.sellAmount},t);return{quoteId:c?.id??null,amountOut:c?.amountOut,minBuyAmount:c?.minOut??c?.amountOutMinimum??c?.amountOut,expiryMs:Date.now()+Number(t.defaultQuoteTtlMs??2e4),artifact:{type:"uniswap-v3-quote",quoter:c?.quoter,fee:c?.fee},metadata:{onchain:!0}}}))),s}async function c1(e,t){return`0x${(await import("node:crypto")).createHash("sha256").update(String(t)).digest("hex")}`}async function l1(e,t){return Promise.race([Promise.resolve().then(e.run),new Promise((n,r)=>setTimeout(()=>r(new Error(`${e.source}: timeout`)),t))])}async function C0(e,t,n={}){let r=Number(n.timeoutMs??12e3),o=await Promise.allSettled(t.map(a=>l1(a,r))),i=[],s=[];for(let a=0;a<o.length;a++){let c=t[a],l=o[a];if(l.status==="rejected"){s.push({source:c.source,error:String(l.reason?.message||l.reason)});continue}try{i.push(Rc(e,{...l.value,source:c.source},n))}catch(u){s.push({source:c.source,error:String(u?.message||u)})}}return{quotes:i,failed:s}}function T0(e=[],t={}){let n=Number(t.nowMs??Date.now()),r=e.filter(s=>Number(s.expiryMs??0)>n);r.sort((s,a)=>{let c=BigInt(a.minBuyAmount??0)-BigInt(s.minBuyAmount??0);if(c!==0n)return c>0n?1:-1;let l=BigInt(a.amountOut??0)-BigInt(s.amountOut??0);return l>0n?1:l<0n?-1:0});let o=r.map(s=>({...s,scoreBasis:"minBuyAmount"})),i=[];return o.length||i.push("no RFQ source returned a usable firm quote"),e.length!==o.length&&i.push("expired RFQ quotes were excluded from ranking"),{best:o[0]??null,quotes:o,failed:[],warnings:i}}async function $c(e,t={}){let n=N0(e,t),{quotes:r,failed:o}=await C0(e,n,t),i=T0(r,t);return{kind:"rfq-result",intent:e,best:i.best,quotes:i.quotes,failed:o,warnings:[...i.warnings],sourcesTried:n.length,sourcesAnswered:r.length}}function O0(e={},t={}){return $i(e,t)}async function R0(e={},t={}){let n=e.intent?.kind==="rfq-intent"?e.intent:$i(e,t);return $c(n,t)}async function $0(){return{ok:!0,provider:"rfq",mode:"intent-rfq",execution:"prepare"}}T();var d1="https://app.across.to";function Lc(e={}){return(e.baseUrl||process.env.ACROSS_API_URL||d1).replace(/\/$/,"")}async function L0(e={}){try{let t=await y(`${Lc(e)}/api/pools?token=0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??1e4});return{ok:t&&typeof t.totalPoolSize=="string",provider:"across-bridge",l1Token:t.l1Token}}catch(t){return{ok:!1,provider:"across-bridge",error:String(t.message||t).slice(0,120)}}}async function M0(e={},t={}){let n=String(e.l1Token||"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2");return y(`${Lc(t)}/api/pools?token=${encodeURIComponent(n)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function U0(e={},t={}){let n=new URLSearchParams;return e.originChainId&&n.set("originChainId",String(e.originChainId)),e.destinationChainId&&n.set("destinationChainId",String(e.destinationChainId)),e.token&&n.set("token",String(e.token)),e.amount&&n.set("amount",String(e.amount)),y(`${Lc(t)}/api/suggested-fees?${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}T();var m1="https://api.beefy.finance";function Mc(e={}){return(e.baseUrl||process.env.BEEFY_API_URL||m1).replace(/\/$/,"")}async function B0(e={}){try{let t=await y(`${Mc(e)}/apy`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??15e3}),n=Object.keys(t||{});return{ok:n.length>0,provider:"beefy-yields",vaultCount:n.length}}catch(t){return{ok:!1,provider:"beefy-yields",error:String(t.message||t).slice(0,120)}}}async function D0(e={},t={}){let n=await y(`${Mc(t)}/apy`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4});if(e.chain){let r=String(e.chain).toLowerCase(),o={};for(let[i,s]of Object.entries(n))String(i).toLowerCase().startsWith(r)&&(o[i]=s);return o}return n}async function F0(e={}){return y(`${Mc(e)}/apy/breakdown`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??25e3})}T();var h1="https://public-api.birdeye.so";function q0(e={}){return(e.baseUrl||process.env.BIRDEYE_API_URL||h1).replace(/\/$/,"")}async function H0(e={}){try{let t=await y(`${q0(e)}/public/tokenlist?sort_by=v24hUSD&sort_type=desc&offset=0&limit=1`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??1e4});return{ok:Array.isArray(t?.data)&&t.data.length>0,provider:"birdeye-tokens"}}catch(t){return{ok:!1,provider:"birdeye-tokens",error:String(t.message||t).slice(0,120)}}}async function j0(e={},t={}){let n=String(e.sortBy||"v24hUSD"),r=String(e.sortType||"desc"),o=Math.max(0,Number(e.offset||0)),i=Math.min(50,Math.max(1,Number(e.limit||20)));return y(`${q0(t)}/public/tokenlist?sort_by=${encodeURIComponent(n)}&sort_type=${encodeURIComponent(r)}&offset=${o}&limit=${i}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}T();var y1="https://api.celenium.io";function Uc(e={}){return(e.baseUrl||process.env.CELENIUM_API_URL||y1).replace(/\/$/,"")}async function V0(e={}){try{let t=await y(`${Uc(e)}/v1/stats`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??1e4});return{ok:t&&t.blobs_count!=null,provider:"celestia-da"}}catch(t){return{ok:!1,provider:"celestia-da",error:String(t.message||t).slice(0,120)}}}async function z0(e={}){return y(`${Uc(e)}/v1/stats`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??15e3})}async function W0(e={},t={}){let n=Number(e.height);if(n&&(!Number.isFinite(n)||n<1))throw new Error("celestia-da: height must be positive");let r=n?`/v1/block/${n}`:"/v1/block";return y(`${Uc(t)}${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}T();var w1="https://api.mainnet-beta.solana.com";function x1(e={}){return(e.rpcUrl||process.env.SOLANA_RPC_URL||w1).replace(/\/$/,"")}async function Li(e,t,n={}){let r=x1(n),o=JSON.stringify({jsonrpc:"2.0",id:1,method:e,params:t}),a=await(await(n.fetchImpl||fetch)(r,{method:"POST",headers:{"content-type":"application/json",accept:"application/json"},body:o,signal:AbortSignal.timeout(n.timeoutMs??2e4)})).json();if(a.error)throw new Error(`das-assets ${e}: ${a.error.message||JSON.stringify(a.error)}`);return a.result}async function G0(e={}){try{let t=await Li("getAsset",{id:"12He3nqt2XLbpuWGdwsJBNcomm7r3M8Kh6Dj9w7ZAK9"},e);return{ok:t&&typeof t=="object",provider:"das-assets"}}catch(t){return{ok:!1,provider:"das-assets",error:String(t.message||t).slice(0,120)}}}async function K0(e={},t={}){let n=String(e.ownerAddress||"").trim();if(!n)throw new Error("das-assets: ownerAddress is required");let r=Math.max(1,Number(e.page||1)),o=Math.min(1e3,Math.max(1,Number(e.limit||50)));return Li("getAssetsByOwner",{ownerAddress:n,page:r,limit:o,...e.sortBy?{sortBy:{sortBy:e.sortBy,sortDirection:e.sortDirection||"asc"}}:{}},t)}async function Y0(e={},t={}){let n=Math.max(1,Number(e.page||1)),r=Math.min(100,Math.max(1,Number(e.limit||20))),o={page:n,limit:r};return e.ownerAddress&&(o.ownerAddress=String(e.ownerAddress)),e.collectionId&&(o.collectionId=String(e.collectionId)),e.creatorAddress&&(o.creatorAddress=String(e.creatorAddress)),e.delegate&&(o.delegate=String(e.delegate)),Li("searchAssets",o,t)}async function X0(e={},t={}){let n=String(e.assetId||"").trim();if(!n)throw new Error("das-assets: assetId is required");return Li("getAssetProof",{id:n},t)}T();var k1="https://api.l2beat.com";function Bc(e={}){return(e.baseUrl||process.env.L2BEAT_API_URL||k1).replace(/\/$/,"")}async function Q0(e={}){try{let t=await y(`${Bc(e)}/api/scaling/tvl`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??15e3});return{ok:t&&typeof t.totalUsd=="string",provider:"l2beat-tvl"}}catch(t){return{ok:!1,provider:"l2beat-tvl",error:String(t.message||t).slice(0,120)}}}async function J0(e={},t={}){let n=await y(`${Bc(t)}/api/scaling/tvl`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4});if(e.project){let r=String(e.project).toLowerCase(),o=n?.projects||{},i=Object.entries(o).find(([s])=>String(s).toLowerCase()===r);return i?{[i[0]]:i[1]}:{}}return n}async function Z0(e={},t={}){return y(`${Bc(t)}/api/scaling/activity`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}T();var E1="https://api.spark.fi";function Dc(e={}){return(e.baseUrl||process.env.SPARK_API_URL||E1).replace(/\/$/,"")}async function eg(e={}){try{return{ok:(await y(`${Dc(e)}/v1/savings/spark/mainnet/usdc`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??1e4}))?.data?.vault?.address!=null,provider:"spark-lend"}}catch(t){return{ok:!1,provider:"spark-lend",error:String(t.message||t).slice(0,120)}}}async function tg(e={},t={}){let n=String(e.protocol||"spark"),r=String(e.chain||"mainnet"),o=e.token?String(e.token).toLowerCase():null;return o?y(`${Dc(t)}/v1/savings/${encodeURIComponent(n)}/${encodeURIComponent(r)}/${encodeURIComponent(o)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}):y(`${Dc(t)}/v1/savings/${encodeURIComponent(n)}/${encodeURIComponent(r)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}T();var I1="https://api.symbiotic.fi";function Fc(e={}){return(e.baseUrl||process.env.SYMBIOTIC_API_URL||I1).replace(/\/$/,"")}async function ng(e={}){try{let t=await y(`${Fc(e)}/v1/vaults`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??15e3});return{ok:Array.isArray(t)&&t.length>0,provider:"symbiotic-restaking",count:t.length}}catch(t){return{ok:!1,provider:"symbiotic-restaking",error:String(t.message||t).slice(0,120)}}}async function rg(e={},t={}){let n=Math.min(200,Math.max(1,Number(e.limit||50))),r=await y(`${Fc(t)}/v1/vaults?limit=${n}&offset=${Math.max(0,Number(e.offset||0))}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4});return e.approvedOnly?r.filter(o=>o.approved===!0):r}async function og(e={},t={}){let n=String(e.address||"").trim();if(!n)throw new Error("symbiotic-restaking: address is required");return y(`${Fc(t)}/v1/vaults/${encodeURIComponent(n)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}T();var P1="https://staking-api.polygon.technology/api/v2",N1=18,C1=200,T1=50,O1=new Set(["id","totalStaked","selfStake","delegatedStake","commissionPercent","uptimePercent","performanceIndex"]);function Hc(e={}){return String(e.baseUrl||process.env.POLYGON_STAKING_API_URL||P1).replace(/\/$/,"")}function R1(e,t="id"){let n=String(e??"").trim();if(!/^\d+$/.test(n))throw new Error(`polygon-staking: ${t} must be a positive integer validator id`);let r=Number(n);if(!Number.isSafeInteger(r)||r<1)throw new Error(`polygon-staking: ${t} must be a positive integer validator id`);return r}function $1(e,t=T1){let n=Number(e??t);return Number.isFinite(n)?Math.min(C1,Math.max(1,Math.trunc(n))):t}function qc(e){let t=Number(e);return Number.isFinite(t)?t/10**N1:null}async function jc(e,t={}){let n=await y(`${Hc(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3});if(typeof n=="string")throw new Error(`polygon-staking GET ${e}: non-JSON response`);if(n?.success===!1){let r=n?.message||n?.error||n?.status||"request rejected";throw new Error(`polygon-staking GET ${e}: ${r}`)}return n}function ig(e={}){return{id:e.id??null,name:typeof e.name=="string"?e.name.trim():null,status:e.status??null,currentState:e.currentState??null,owner:e.owner??null,signer:e.signer??null,contractAddress:e.contractAddress??null,commissionPercent:e.commissionPercent??null,uptimePercent:e.uptimePercent??null,performanceIndex:e.performanceIndex??null,delegationEnabled:e.delegationEnabled??null,activationEpoch:e.activationEpoch??null,deactivationEpoch:e.deactivationEpoch??null,jailEndEpoch:e.jailEndEpoch??null,missedLatestCheckpointCount:e.missedLatestCheckpointcount??null,totalStakedRaw:e.totalStaked??null,selfStakeRaw:e.selfStake??null,delegatedStakeRaw:e.delegatedStake??null,totalStakedPolApprox:qc(e.totalStaked),selfStakePolApprox:qc(e.selfStake),delegatedStakePolApprox:qc(e.delegatedStake),stakePrecision:"approximate \u2014 upstream serves wei-scale as float64"}}async function sg(e={},t={}){let n=await jc("/validators",t),r=Array.isArray(n?.result)?n.result:[],o=n?.summary?.total??r.length;if(e.status){let d=String(e.status).toLowerCase();r=r.filter(p=>String(p?.status||"").toLowerCase()===d)}if(e.currentState){let d=String(e.currentState).toUpperCase();r=r.filter(p=>String(p?.currentState||"").toUpperCase()===d)}if(e.delegationEnabled!=null){let d=!!e.delegationEnabled;r=r.filter(p=>!!p?.delegationEnabled===d)}let i=O1.has(String(e.sortBy))?String(e.sortBy):"id",s=String(e.direction||"").toUpperCase()==="DESC";r=[...r].sort((d,p)=>{let m=Number(d?.[i]??0),f=Number(p?.[i]??0),h=Number.isFinite(m)&&Number.isFinite(f)?m-f:0;return s?-h:h});let a=r.length,c=Math.max(0,Math.trunc(Number(e.offset||0))||0),l=$1(e.limit),u=r.slice(c,c+l);return{provider:"polygon-staking",chainId:137,count:u.length,matched:a,total:o,limit:l,offset:c,sortBy:i,direction:s?"DESC":"ASC",paginatedBy:"client \u2014 upstream /validators ignores limit/offset",validators:e.raw?u:u.map(ig)}}async function ag(e={},t={}){let n=R1(e.id??e.validatorId,"id"),o=(await jc(`/validators/${n}`,t))?.result;if(!o||typeof o!="object")throw new Error(`polygon-staking: validator ${n} not found`);return{provider:"polygon-staking",chainId:137,id:n,validator:e.raw?o:{...ig(o),delegatorCount:o.delegatorCount??null,checkpointsSigned:o.checkpointsSigned??null,checkpointsMissed:o.checkpointsMissed??null,isInAuction:o.isInAuction??null,auctionAmount:o.auctionAmount??null,delegatorUnclaimedRewardsRaw:o.delegatorUnclaimedRewards??null,validatorUnclaimedRewardsRaw:o.validatorUnclaimedRewards??null,claimedRewardRaw:o.claimedReward??null,description:typeof o.description=="string"?o.description:null,logoUrl:o.logoUrl??null},raw:e.raw?void 0:o}}async function cg(e={}){try{let t=await jc("/validators",{...e,timeoutMs:e.timeoutMs??1e4}),n=Array.isArray(t?.result)?t.result:[];return{ok:n.length>0,provider:"polygon-staking",chainId:137,baseUrl:Hc(e),validatorTotal:t?.summary?.total??n.length,exec:!1}}catch(t){return{ok:!1,provider:"polygon-staking",chainId:137,baseUrl:Hc(e),error:String(t?.message||t),exec:!1}}}T();var M1="https://api.v3.aave.com/graphql",LU=Object.freeze([1,10,56,100,137,146,232,324,1088,1868,5e3,42161,42220,43114,57073,59144,534352]),U1=(e={})=>e.baseUrl||process.env.AAVE_V3_API_URL||M1;async function Mi(e,t,n={}){let r=await y(U1(n),{method:"POST",body:{query:e,variables:t},fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs??2e4});if(r?.errors?.length)throw new Error(`aave-v3: ${r.errors.map(o=>o?.message||String(o)).join("; ")}`);return r}var B1=`query Markets($request: MarketsRequest!) {
|
|
16
146
|
markets(request: $request) {
|
|
17
147
|
name
|
|
18
148
|
address
|
|
@@ -20,7 +150,7 @@ ${i.stderr}`.slice(0,1500));let s=n.metadata.contractName;if(t.contractName&&t.c
|
|
|
20
150
|
totalMarketSize
|
|
21
151
|
totalAvailableLiquidity
|
|
22
152
|
}
|
|
23
|
-
}`,
|
|
153
|
+
}`,D1=`query Market($request: MarketRequest!) {
|
|
24
154
|
market(request: $request) {
|
|
25
155
|
name
|
|
26
156
|
address
|
|
@@ -53,13 +183,13 @@ ${i.stderr}`.slice(0,1500));let s=n.metadata.contractName;if(t.contractName&&t.c
|
|
|
53
183
|
}
|
|
54
184
|
}
|
|
55
185
|
}
|
|
56
|
-
}`,
|
|
186
|
+
}`,F1=`query Chains($filter: ChainsFilter!) {
|
|
57
187
|
chains(filter: $filter) { chainId name isTestnet explorerUrl }
|
|
58
|
-
}`;function X_(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 D0(e={},t={}){let n={chainIds:X_(e)};return e.user&&(n.user=String(e.user)),{markets:(await Ti(G_,{request:n},t))?.data?.markets??[]}}async function F0(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 Ti(K_,{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 q0(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 Ti(Y_,{filter:r},t))?.data?.chains??[]}}async function H0(e={}){return{ok:(await Ti("query { health }",{},e))?.data?.health===!0,provider:"aave-v3"}}N();var J_="https://staking-api.babylonlabs.io";function Oc(e={}){return String(e.baseUrl||process.env.BABYLON_STAKING_API_URL||J_).replace(/\/$/,"")}function Ni(e,t={}){return y(`${Oc(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3,headers:{Accept:"application/json"}})}function j0(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 V0(e={}){try{let n=(await Ni("/v2/stats",e))?.data||{},r=Number(n.active_tvl??0);return{ok:Number.isFinite(r)&&r>0,provider:"babylon-staking",baseUrl:Oc(e),activeTvlSats:String(n.active_tvl??""),activeFinalityProviders:n.active_finality_providers??null,exec:!1}}catch(t){return{ok:!1,provider:"babylon-staking",baseUrl:Oc(e),error:String(t?.message||t),exec:!1}}}async function z0(e={},t={}){let r=(await Ni("/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 W0(e={},t={}){let n=await Ni("/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=j0(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 G0(e={},t={}){let n=j0(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 Ni(`/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 e1="https://markets.bisq.network";function Rc(e={}){return String(e.baseUrl||process.env.BISQ_MARKETS_URL||e1).replace(/\/$/,"")}function K0(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 Oi(e,t={}){return y(`${Rc(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function Y0(e={}){try{let t=await Oi("/api/markets",e),n=t&&typeof t=="object"?Object.keys(t).length:0;return{ok:n>0,provider:"bisq-markets",baseUrl:Rc(e),marketCount:n,exec:!1}}catch(t){return{ok:!1,provider:"bisq-markets",baseUrl:Rc(e),error:String(t?.message||t),exec:!1}}}async function X0(e={},t={}){let n=await Oi("/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 Q0(e={},t={}){let n=K0(e.market||e.pair||"btc_usd","market"),r=await Oi(`/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 J0(e={},t={}){let n=K0(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 Oi(`/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"}}),n1=new Map([["bob",60808],["rootstock",30],["rsk",30]]),r1=60808;function Rr(e){if(e==null||e==="")return r1;let t=n1.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 $c(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 Z0(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 Ri(e,t,n={}){return y(`${$c(e,n)}${t.startsWith("/")?t:`/${t}`}`,{fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs??15e3})}async function eg(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 Ri(n,"/api/v2/stats",e);return{ok:o?.total_blocks!=null||o?.total_transactions!=null,provider:"bob-rootstock",chainId:n,chain:r.name,baseUrl:$c(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:$c(n,e),error:String(o?.message||o),exec:!1}}}async function Lc(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 Lc({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 Ri(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 tg(e={},t={}){let n=Rr(e.chainId??e.chain),r=Z0(e.address||e.addr,"address"),o=et[n],i=await Ri(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 ng(e={},t={}){let n=Rr(e.chainId??e.chain),r=Z0(e.address||e.addr,"address"),o=await Ri(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 i1="https://insights.braiins.com/api/v1.0";function Mc(e={}){return String(e.baseUrl||process.env.BRAIINS_INSIGHTS_URL||i1).replace(/\/$/,"")}function Uc(e,t={}){return y(`${Mc(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3,headers:{Accept:"application/json"}})}async function rg(e={}){try{let t=await Uc("/price-stats",e),n=Number(t?.price??0);return{ok:Number.isFinite(n)&&n>0,provider:"braiins-insights",baseUrl:Mc(e),btcUsd:Number.isFinite(n)?n:null,timestamp:t?.timestamp??null,exec:!1}}catch(t){return{ok:!1,provider:"braiins-insights",baseUrl:Mc(e),error:String(t?.message||t),exec:!1}}}async function og(e={},t={}){let n=await Uc("/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 ig(e={},t={}){let n=await Uc("/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 a1="https://api.cow.fi",sg=Object.freeze({1:"mainnet",100:"xdai",42161:"arbitrum_one",8453:"base",11155111:"sepolia"});function ag(e={}){return(e.baseUrl||process.env.COW_API_URL||a1).replace(/\/$/,"")}function c1(e={}){if(e.network)return String(e.network);let t=Number(e.chainId??1),n=sg[t];if(!n)throw new Error(`cow-protocol: unsupported chainId ${t} (have: ${Object.keys(sg).join(", ")})`);return n}function Bc(e,t,n){return`${ag(n)}/${c1(e)}/api/v1${t}`}function cg(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 lg(e,t=10){return Math.min(1e3,Math.max(1,Number(e.limit??t)))}async function ug(e={},t={}){return y(Bc(e,"/auction",t),{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function dg(e={},t={}){let n=cg(e.owner||e.address||e.user,"owner"),r=new URLSearchParams({limit:String(lg(e))});e.offset!=null&&r.set("offset",String(Math.max(0,Number(e.offset))));let o=await y(`${Bc(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 pg(e={},t={}){let n=new URLSearchParams;e.orderUid?n.set("orderUid",String(e.orderUid)):n.set("owner",cg(e.owner||e.address||e.user,"owner"));let r=await y(`${Bc(e,"/trades",t)}?${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4}),o=Array.isArray(r)?r:[];return{count:o.length,trades:o.slice(0,lg(e))}}async function mg(e={}){let t=await y(`${ag(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 u1="https://api.hiro.so",d1=20;function Dc(e={}){return String(e.baseUrl||process.env.HIRO_API_URL||u1).replace(/\/$/,"")}function p1(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(`${Dc(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3,headers:p1(t)})}async function fg(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:Dc(e),burnBlockHeight:t?.burn_block_height??null,stacksTipHeight:t?.stacks_tip_height??null,serverVersion:t?.server_version??null,rateLimitRps:d1,keyed:!!(e.apiKey||process.env.HIRO_API_KEY),exec:!1}}catch(t){return{ok:!1,provider:"hiro-stacks",baseUrl:Dc(e),error:String(t?.message||t),exec:!1}}}async function hg(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 gg(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 yg(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 bg(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 f1="https://bundles.jito.wtf",xg=1e9;function Fc(e={}){return String(e.baseUrl||process.env.JITO_BUNDLES_URL||f1).replace(/\/$/,"")}function h1(e,t,n){let r=Number(e);return Number.isFinite(r)?Math.max(1,Math.min(Math.floor(r),n)):t}function wg(e){let t=Number(e);return Number.isFinite(t)?Math.round(t*xg):null}function g1(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/xg:null,raw:e}}async function Sg(e={}){try{let t=await y(`${Fc(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 kg(e={},t={}){let n=h1(e.limit,5,100),r=new URL(`${Fc(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(g1),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 Eg(e={}){let t=await y(`${Fc(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,wg(i)])),suggestedTipLamports:wg(r.p75||r.p50),raw:n}}N();var b1="https://api.kamino.finance";function w1(e={}){return String(e.baseUrl||process.env.KAMINO_API_URL||b1).replace(/\/$/,"")}function we(e){let t=Number(e);return Number.isFinite(t)?t:null}function vg(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 qc(e={},t={}){let n=new URL(`${w1(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 Ag(e={}){try{let t=await qc({},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 Ig(e={},t={}){let r=(await qc(e,t)).map(vg),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 _g(e={},t={}){let n=String(e.strategy||e.address||"").trim();if(!n)throw new Error("kamino-strategies: strategy address required");let o=(await qc({...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",...vg(o),raw:o}}N();var S1="https://blockstream.info/liquid/api",Pg="6f0279e9ed041c3d710a9f57d0c02928416460c4b722ae3457a11eec381c526d";function $i(e={}){return String(e.baseUrl||process.env.LIQUID_ESPLORA_URL||S1).replace(/\/$/,"")}function k1(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 E1(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 Cg(e,t={}){let n=`${$i(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 Tg(e,t={}){return y(`${$i(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3})}async function Ng(e={}){try{let t=await Cg("/blocks/tip/height",e),n=Number(t);return{ok:Number.isFinite(n)&&n>0,provider:"liquid-esplora",baseUrl:$i(e),tipHeight:n,exec:!1,signing:"user-wallet"}}catch(t){return{ok:!1,provider:"liquid-esplora",baseUrl:$i(e),error:String(t?.message||t),exec:!1}}}async function Og(e={},t={}){let n=await Cg("/blocks/tip/height",t);return{provider:"liquid-esplora",tipHeight:Number(n)}}async function Rg(e={},t={}){let n=k1(e.address||e.addr,"address"),r=await Tg(`/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 $g(e={},t={}){let n=E1(e.assetId||e.asset||Pg,"assetId"),r=await Tg(`/asset/${n}`,t),o=r.chain_stats||{};return{provider:"liquid-esplora",assetId:n,isPolicyAsset:n===Pg,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 A1="https://api-mainnet.magiceden.dev/v2/ord/btc",I1=600;function Hc(e={}){return String(e.baseUrl||process.env.MAGICEDEN_ORD_API_URL||A1).replace(/\/$/,"")}function _1(e={}){let t={Accept:"application/json"},n=e.apiKey||process.env.MAGICEDEN_API_KEY;return n&&(t.Authorization=`Bearer ${n}`),t}function Lg(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 Mg(e,t={}){return y(`${Hc(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3,headers:_1(t),retries:t.retries??1})}async function Ug(e={}){let t=Lg(e.probeCollection||process.env.MAGICEDEN_PROBE_COLLECTION||"nodemonkes");try{let n=await Mg(`/stat?collectionSymbol=${encodeURIComponent(t)}`,e);return{ok:n!=null&&typeof n=="object",provider:"magiceden-ordinals",baseUrl:Hc(e),probeCollection:t,rateLimitRpm:I1,exec:!1}}catch(n){let r=n?.status??null;return{ok:!1,provider:"magiceden-ordinals",baseUrl:Hc(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 Bg(e={},t={}){let n=Lg(e.collectionSymbol||e.symbol||e.collection,"collectionSymbol");try{let r=await Mg(`/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 C1="https://mempool.space/api",T1=7;function jc(e={}){return String(e.baseUrl||process.env.MEMPOOL_API_URL||C1).replace(/\/$/,"")}function Li(e,t={}){return y(`${jc(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}function Dg(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>T1}}async function Fg(e={}){try{let n=(await Li("/v1/lightning/statistics/latest",e))?.latest||{},{ageDays:r,stale:o}=Dg(n.added);return{ok:Number(n.node_count||0)>0,provider:"mempool-lightning",baseUrl:jc(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:jc(e),error:String(t?.message||t),exec:!1}}}async function qg(e={},t={}){let r=(await Li("/v1/lightning/statistics/latest",t))?.latest||{},{ageDays:o,stale:i}=Dg(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 Hg(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 Li(`/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 jg(e={},t={}){let n=await Li("/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 O1="https://mempool.space/api",Vg=new Set(["24h","3d","1w","1m","3m","6m","1y","2y","3y","all"]);function Vc(e={}){return String(e.baseUrl||process.env.MEMPOOL_API_URL||O1).replace(/\/$/,"")}function zg(e,t){let n=String(e||t).trim().toLowerCase();if(!Vg.has(n))throw new Error(`mempool-mining: window must be one of ${[...Vg].join(", ")}`);return n}function Lr(e,t={}){return y(`${Vc(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function Wg(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:Vc(e),nextRetargetHeight:t?.nextRetargetHeight??null,exec:!1}}catch(t){return{ok:!1,provider:"mempool-mining",baseUrl:Vc(e),error:String(t?.message||t),exec:!1}}}async function Gg(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 Kg(e={},t={}){let n=zg(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 Yg(e={},t={}){let n=zg(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 Xg(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 $1="https://amm-v2.meteora.ag",Qg=new Set(["tvl","volume","fee_tvl_ratio","l_m"]),Jg=new Set(["dynamic","multitoken","lst","farms"]),L1=/^[1-9A-HJ-NP-Za-km-z]{32,44}$/;function M1(e={}){return String(e.baseUrl||process.env.METEORA_API_URL||$1).replace(/\/$/,"")}function le(e){let t=Number(e);return Number.isFinite(t)?t:null}function U1(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 B1(e={},t={}){let n=new URL(`${M1(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(!Qg.has(a))throw new Error(`meteora-dlmm: sortKey must be one of ${[...Qg].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(!Jg.has(a))throw new Error(`meteora-dlmm: poolType must be one of ${[...Jg].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(!L1.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 zc(e={},t={}){let{url:n,page:r,size:o}=B1(e,t),i=await y(n.toString(),{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4});return{pools:(Array.isArray(i?.data)?i.data:[]).map(U1),totalCount:i?.total_count??null,page:r,size:o}}async function Zg(e={}){try{let{pools:t,totalCount:n}=await zc({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 ey(e={},t={}){let n=await zc({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 ty(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 zc({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 F1="https://ordinals.com";function Mi(e={}){return String(e.baseUrl||e.ordinalsBase||process.env.ORDINALS_BASE_URL||F1).replace(/\/$/,"")}function q1(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 ny(e,t={}){let n=`${Mi(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 Wc(e,t={}){return y(`${Mi(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3,headers:{Accept:"application/json"}})}async function ry(e={}){try{let t=await ny("/r/blockheight",e),n=Number(t);return{ok:Number.isFinite(n)&&n>0,provider:"ordinals-runes",baseUrl:Mi(e),blockHeight:n,exec:!1}}catch(t){return{ok:!1,provider:"ordinals-runes",baseUrl:Mi(e),error:String(t?.message||t),exec:!1}}}async function oy(e={},t={}){let n=await ny("/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 iy(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 Wc(`/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 sy(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 Wc(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 ay(e={},t={}){let n=q1(e.name||e.rune||e.runeName,"name"),r=await Wc(`/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 j1="https://hermes.pyth.network",Kc={"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"},V1=/^[0-9a-fA-F]{64}$/;function cy(e={}){return String(e.baseUrl||process.env.PYTH_HERMES_URL||j1).replace(/\/$/,"")}function ly(e,t="feedId"){let n=String(e??"").trim();if(!n)throw new Error(`pyth-price-feeds: ${t} required`);let r=Kc[n.toUpperCase()]||Kc[`${n.toUpperCase()}/USD`];if(r)return r;let o=n.startsWith("0x")||n.startsWith("0X")?n.slice(2):n;if(!V1.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 Gc(e={}){let t=Number(e.price),n=Number(e.expo);return!Number.isFinite(t)||!Number.isFinite(n)?null:t*10**n}function Yc(e={}){let t=Gc({price:Number(e.price?.conf),expo:e.price?.expo}),n=Gc(e.price);return{id:e.id||null,price:n,confidence:t,confidenceBps:n&&t!=null?Math.round(t/Math.abs(n)*1e4):null,emaPrice:Gc(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 Xc(e,t={}){let n=new URL(`${cy(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 uy(e={}){try{let t=await Xc([Kc["SOL/USD"]],e),r=(Array.isArray(t?.parsed)?t.parsed.map(Yc):[])[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 dy(e={},t={}){let n=ly(e.feedId||e.id||e.symbol,"feedId"),r=await Xc([n],t),o=Array.isArray(r?.parsed)?r.parsed.map(Yc):[],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 py(e={},t={}){let n=Array.isArray(e)?e:e.feedIds||e.ids||e.symbols||[],r=[...new Set(n.map(l=>ly(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 Xc(l,t));let a=s.flatMap(l=>Array.isArray(l?.parsed)?l.parsed.map(Yc):[]),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 my(e={},t={}){let n=new URL(`${cy(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 W1="https://relayscan.io",fy=new Set(["1h","12h","24h","7d"]);function Qc(e={}){return(e.baseUrl||process.env.RELAYSCAN_API_URL||W1).replace(/\/$/,"")}function hy(e={}){let t=String(e.timespan||e.t||"24h").toLowerCase();if(!fy.has(t))throw new Error(`relayscan-mev: timespan must be one of ${[...fy].join(", ")}`);return t}function G1(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 Jc(e={},t={}){return y(`${Qc(t)}/overview/json?t=${hy(e)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function gy(e={},t={}){return y(`${Qc(t)}/builder-profit/json?t=${hy(e)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function yy(e={},t={}){let n=G1(e);return y(`${Qc(t)}/stats/day/${n}/json`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??25e3})}async function by(e={}){let t=await Jc({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 Y1="https://extra-api.sanctum.so",X1=30,Q1=["jitoSOL","mSOL","bSOL","INF","hSOL","bonkSOL","jupSOL","dSOL"];function Zc(e={}){return String(e.baseUrl||process.env.SANCTUM_API_URL||Y1).replace(/\/$/,"")}function wy(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 J1(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 J1(t,X1)){let s=new URL(`${Zc(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 xy(e={}){try{let[t,n]=await Promise.all([y(`${Zc(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 el(e={},t={}){let n=await y(`${Zc(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 Sy(e={},t={}){let n=e.lsts||e.symbols||null;e.all===!0&&(n=(await el({},t)).lsts.map(c=>c.symbol).filter(Boolean)),(!Array.isArray(n)||!n.length)&&(n=Q1);let r=[...new Set(n.map(a=>wy(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 ky(e={},t={}){let n=wy(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 eP="https://api.save.finance",tP="4UpD2fh7xH3VP9QQaXtsS1YY3bxzWhtfpks7FatyKvdY",Ey="CCpirWrgNuBVLdkP2haxLTbD6XqEgaYuVXixbbpxUB6",nP=/^[1-9A-HJ-NP-Za-km-z]{32,44}$/;function tl(e={}){return String(e.baseUrl||process.env.SAVE_API_URL||process.env.SOLEND_API_URL||eP).replace(/\/$/,"")}function vy(e,t="address"){let n=String(e??"").trim();if(!nP.test(n))throw new Error(`solend-lending: ${t} must be a base58 public key`);return n}function Ay(e){let t=Number(e);return Number.isFinite(t)?t:null}function rP(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 oP(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:Ay(e.rates?.supplyInterest),borrowApyPct:Ay(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 Iy(e={}){try{let t=await y(`${tl(e)}/v1/reserves?ids=${Ey}`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??15e3}),n=Array.isArray(t?.results)?t.results:[];return{ok:n.length>0,provider:"solend-lending",probeReserve:Ey,reserves:n.length,exec:!1}}catch(t){return{ok:!1,provider:"solend-lending",error:String(t?.message||t),exec:!1}}}async function nl(e={},t={}){let n=new URL(`${tl(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(rP);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 _y(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=>vy(String(a).trim(),"reserve"));else{let s=vy(e.market||e.marketAddress||tP,"market"),c=(await nl({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(`${tl(t)}/v1/reserves?ids=${n.join(",")}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??25e3}),i=(Array.isArray(o?.results)?o.results:[]).map((s,a)=>({...oP(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 rl(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:rl(e.amount,"amount")}}function ol(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 il(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 sP(e={},t={}){let n=Mr(e),r=Vt(e.slices??10,"slices",2,100),o=Vt(e.durationSec??3600,"durationSec",r,604800),i=ol(n.total,Array(r).fill(1));return Ur(n,"TWAP",il(i,o,t.nowMs),{durationSec:o})}function aP(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=ol(n.total,r),s=r.reduce((c,l)=>c+l,0n),a=il(i,o,t.nowMs).map((c,l)=>({...c,volumeWeightBps:Number(r[l]*10000n/s)}));return Ur(n,"VWAP",a,{durationSec:o,requiresLiveVolumeValidation:!0})}function cP(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=rl(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 lP(e={}){let t=Mr(e),n=rl(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 uP(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=ol(n.total,s);return Ur(n,"IS",il(a,o,t.nowMs),{durationSec:o,urgencyBps:i})}function Py(e={},t={}){let n=String(e.strategy||"").trim().toUpperCase();if(n==="TWAP")return sP(e,t);if(n==="VWAP")return aP(e,t);if(n==="POV")return cP(e,t);if(n==="ICEBERG")return lP(e,t);if(n==="IS"||n==="IMPLEMENTATION SHORTFALL")return uP(e,t);throw new Error("strategy must be TWAP, VWAP, POV, ICEBERG, or IS")}function Cy(){return{ok:!0,provider:"execution-strategies",strategies:["TWAP","VWAP","POV","ICEBERG","IS"],execution:"plan-only",externalProtocol:!1}}var pP={"hl-info":{health:e=>Yu(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={})=>Xu(t.user,e),meta:e=>ho(e),metaAndAssetCtxs:e=>nn(e),candleSnapshot:(e,t={})=>rn(t,e),openOrders:(e,t={})=>Ju(t.user,e),frontendOpenOrders:(e,t={})=>Zu(t.user,e),userState:(e,t={})=>go(t.user,e),spotMeta:e=>yo(e)},"hl-vaults":{health:e=>rd(e),summaries:(e,t={})=>zs(t,e),details:(e,t={})=>bo(t,e),userEquities:(e,t={})=>Ws(t,e),tracker:(e,t={})=>Gs(t,e)},"poly-public":{health:e=>id(e),time:e=>Ks(e),markets:(e,t={})=>sd(t,e),book:(e,t={})=>ad(t.tokenId,e),midpoint:(e,t={})=>cd(t.tokenId,e),spread:(e,t={})=>ld(t.tokenId,e),price:(e,t={})=>ud(t.tokenId,{side:t.side},e),events:(e,t={})=>dd(t,e)},"evm-rpc":{health:(e,t={})=>Qn(t.chainId??1,e),healthAll:(e,t={})=>hu({...e,chainIds:t.chainIds}),blockNumber:(e,t={})=>eo(t.chainId??1,e),chainId:(e,t={})=>mu(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={})=>fu(t,e),erc20Balance:(e,t={})=>to(t,e),transactionReceipt:(e,t={})=>no(t,e)},portfolio:{health:e=>hh(e),balances:(e,t={})=>bi(t,e),snapshot:(e,t={})=>$h(t,e),history:(e,t={})=>fc(t,e),valueGraph:(e,t={})=>Lh(t,e)},"nft-portfolio":{health:e=>kh(e),inventory:(e,t={})=>Cn(t,e),gallery:(e,t={})=>Ih(t,e),pnl:(e,t={})=>Ah(t,e),prepareList:(e,t={})=>Eh(t,e),traitSnipe:(e,t={})=>vh(t,e)},"contract-risk":{health:e=>Mh(e),scan:(e,t={})=>Ft(t,e)},"evm-token-sniper":{health:e=>Dh(e),scan:(e,t={})=>Bh(t,e)},"evm-simulate":{health:e=>qh(e),simulate:(e,t={})=>Tr(t,e)},"nft-mint":{health:e=>jh(e),discover:(e,t={})=>Ai(t,e),prepare:(e,t={})=>yc(t,e),priceGas:(e,t={})=>vi(t,e),createTrigger:(e,t={})=>Vh(t,e),checkOpen:(e,t={})=>zh(t,e)},"solana-rpc":{health:e=>md(e),latestBlockhash:(e,t={})=>Xs(t,e),getBalance:(e,t={})=>wo(t,e),tokenAccounts:(e,t={})=>lr(t,e),simulate:(e,t={})=>fd(t,e)},"bitcoin-esplora":{health:e=>hd(e),tipHeight:e=>gd(e),fees:e=>yd(e),address:(e,t={})=>So(t,e),utxos:(e,t={})=>bd(t,e),tx:(e,t={})=>wd(t,e),decode:(e,t={})=>xd(t,e)},"bitcoin-meta":{health:e=>vd(e),runeBalances:(e,t={})=>Eo(t,e),inscriptions:(e,t={})=>an(t,e),inscriptionInfo:(e,t={})=>Ad(t,e),inscriptionChildren:(e,t={})=>Id(t,e),ordBlockInfo:(e,t={})=>_d(t,e)},satflow:{health:e=>Cd(e),collectionFloors:(e,t={})=>Td(t,e),collectionStats:(e,t={})=>Nd(t,e),item:(e,t={})=>Od(t,e),walletContents:(e,t={})=>Ao(t,e),floorListings:(e,t={})=>Rd(t,e),preparePurchase:(e,t={})=>Ld(t,e),prepareList:(e,t={})=>Io(t,e)},jupiter:{health:e=>jd(e),venues:(e,t={})=>Hd(t,e),quote:(e,t={})=>Co(t,e),prepare:(e,t={})=>Vd(t,e)},defillama:{health:e=>Wd(e),prices:(e,t={})=>Oe(t.coins||[],e),pricesBySymbol:(e,t={})=>Xd(t.symbols,e),protocols:e=>To(e),yields:(e,t={})=>Gd(t,e),stablecoins:(e,t={})=>Kd(t,e),dexVolumes:(e,t={})=>Yd(t,e)},lifi:{health:e=>op(e),quote:(e,t={})=>lt(t,e),prepare:(e,t={})=>ip(t,e),chains:e=>sp(e)},dexscreener:{health:e=>gu(e),token:(e,t={})=>Nt(t.address||t.tokenAddress,e),search:(e,t={})=>Jn(t.q||t.query,e),pair:(e,t={})=>yu(t.chainId,t.pairAddress,e)},"uniswap-v3":{health:(e,t={})=>Nu({...e,chainId:t.chainId??8453}),quote:(e,t={})=>it(t,e),prepare:(e,t={})=>Tu(t,e),quotePath:(e,t={})=>Cu(t,e),ethUsdc:(e,t={})=>Rs(t,e),chains:()=>Ou()},"uniswap-v4":{health:(e,t={})=>Bu({...e,chainId:t.chainId??8453}),quote:(e,t={})=>co(t,e),chains:()=>Uu()},aerodrome:{health:(e,t={})=>fp({...e,chainId:t.chainId??8453}),quote:(e,t={})=>$o(t,e),prepare:(e,t={})=>mp(t,e),chains:()=>hp()},zerox:{health:e=>wp(e),price:(e,t={})=>da(t,e),quote:(e,t={})=>Rt(t,e),prepare:(e,t={})=>xp(t,e)},across:{health:e=>pa(e),suggestedFees:(e,t={})=>Mo(t,e)},hop:{health:e=>ma(e),quote:(e,t={})=>Uo(t,e)},relay:{health:e=>fa(e),quote:(e,t={})=>dr(t,e),prepare:(e,t={})=>ha(t,e)},cowswap:{health:e=>Pp(e),quote:(e,t={})=>dt(t,e),prepareOrder:(e,t={})=>Cp(t,e),order:(e,t={})=>Np(t,e),status:(e,t={})=>Tp(t,e),chains:()=>Op()},oneinch:{health:e=>$p(e),quote:(e,t={})=>fr(t,e),prepare:(e,t={})=>Lp(t,e),approveSpender:(e,t={})=>Sa(t,e)},"hl-ws":{health:e=>Mp(e),allMids:e=>Up(e),l2Book:(e,t={})=>Bp(t.coin,e),snapshot:(e,t={})=>hr(t.subscription||t,e)},"poly-ws":{health:(e,t={})=>Dp({...e,assetId:t.assetId}),book:(e,t={})=>Fp(t.assetId||t.tokenId,e),snapshot:(e,t={})=>qo(t.assetIds||t.assets_ids||[t.assetId],e)},"opensea-nft":{health:e=>Wp(e),collection:(e,t={})=>Vo(t.slug,e),floor:(e,t={})=>Gp(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=>Cm(e),prepareOrder:(e,t={})=>Tm(t,e),prepareCancel:(e,t={})=>Nm(t,e)},"protocol-templates":{health:()=>({ok:!0,templates:ai().map(e=>e.id),firmAudit:!1}),list:()=>ai(),gate:(e,t={})=>qa(t.templateId||t.id,e),prepareDeploy:(e,t={})=>nf(t,e)},"poly-clob":{prepareOrder:(e,t={})=>Um(t||{})},"hl-perps":{health:e=>Na(e),assetInfo:(e,t={})=>Lt(t,e),prepareOrder:(e,t={})=>Sr(t,e),prepareCancel:(e,t={})=>ei(t,e),prepareLeverage:(e,t={})=>Im(t,e),prepareIsolatedMargin:(e,t={})=>_m(t,e),prepareBracket:(e,t={})=>Pm(t,e),prepareBuilderApproval:(e,t={})=>Am(t,e)},"hl-markets":{health:e=>Na(e),markets:(e,t={})=>Yo(t,e),leaderboards:(e,t={})=>mm(t,e),coin:(e,t={})=>fm(t,e),spot:(e,t={})=>hm(t,e)},"magiceden-sol":{health:e=>Zp(e),stats:(e,t={})=>Ea(t,e),listings:(e,t={})=>tm(t,e),tokenListings:(e,t={})=>nm(t,e),prepareBuy:(e,t={})=>rm(t,e),prepareList:(e,t={})=>Go(t,e),prepareMint:(e,t={})=>om(t,e)},"hl-staking":{health:e=>sm(e),validators:e=>Ia(e),delegatorSummary:(e,t={})=>_a(t,e),delegations:(e,t={})=>Pa(t,e),rewards:(e,t={})=>am(t,e),history:(e,t={})=>cm(t,e),preflight:(e,t={})=>pm(t,e),prepareStakeDeposit:(e,t={})=>lm(t,e),prepareStakeWithdraw:(e,t={})=>um(t,e),prepareDelegate:(e,t={})=>dm(t,e)},"hyperevm-dex":{health:e=>Yp(e),search:(e,t={})=>Xp(t.q||t.query||"HYPE",e),token:(e,t={})=>Qp(t.address||t.tokenAddress,e)},geckoterminal:{health:e=>af(e),networks:(e,t={})=>Ha(t,e),pool:(e,t={})=>rf(t,e),token:(e,t={})=>of(t,e),ohlcv:(e,t={})=>sf(t,e)},curve:{health:e=>xf(e),openapi:e=>wf(e),pools:(e,t={})=>Va(t,e),quote:(e,t={})=>za(t,e),prepare:(e,t={})=>Sf(t,e)},gmx:{health:e=>Of(e),tickers:(e,t={})=>di(t,e),markets:(e,t={})=>Tf(t,e),marketsInfo:(e,t={})=>Ga(t,e),tokens:(e,t={})=>Nf(t,e),prepareOrder:(e,t={})=>Mf(t,e),positions:(e,t={})=>Rf(t,e),orderStatus:(e,t={})=>$f(t,e),verifyOrder:(e,t={})=>Lf(t,e)},morpho:{health:e=>Ff(e),markets:(e,t={})=>Df(t,e),vaults:(e,t={})=>Xa(t,e),prepareVault:(e,t={})=>qf(t,e)},balancer:{health:e=>Yf(e),pools:(e,t={})=>Kf(t,e),quote:(e,t={})=>Za(t,e),prepare:(e,t={})=>Xf(t,e)},pendle:{health:e=>Jf(e),markets:(e,t={})=>tc(t,e),quote:(e,t={})=>Zf(t,e),prepare:(e,t={})=>nc(t,e)},odos:{health:e=>rh(e),chains:e=>oc(e),quote:(e,t={})=>th(t,e),prepare:(e,t={})=>nh(t,e)},blockscout:{health:e=>dh(e),stats:(e,t={})=>ac(t,e),address:(e,t={})=>ah(t,e),token:(e,t={})=>ch(t,e)},paraswap:{health:e=>Gh(e),tokens:(e,t={})=>wc(t,e),price:(e,t={})=>yt(t,e),quote:(e,t={})=>yt(t,e),prepare:(e,t={})=>Wh(t,e)},rfq:{health:e=>u0(e),intent:(e,t={})=>c0(t,e),quote:(e,t={})=>l0(t,e)},"polygon-staking":{health:e=>B0(e),validators:(e,t={})=>M0(t,e),validatorDetail:(e,t={})=>U0(t,e)},"aave-v3":{health:e=>H0(e),markets:(e,t={})=>D0(t,e),marketReserves:(e,t={})=>F0(t,e),chains:e=>q0(e)},"babylon-staking":{health:e=>V0(e),stats:e=>z0(e),finalityProviders:e=>W0(e),delegations:(e,t={})=>G0(t,e)},"bisq-markets":{health:e=>Y0(e),markets:e=>X0(e),ticker:(e,t={})=>Q0(t,e),trades:(e,t={})=>J0(t,e)},"bob-rootstock":{health:(e,t={})=>eg(t.chainId,e),stats:(e,t={})=>Lc(t,e),addressInfo:(e,t={})=>tg(t,e),tokenBalances:(e,t={})=>ng(t,e)},"braiins-insights":{health:e=>rg(e),priceStats:e=>og(e),poolStats:e=>ig(e)},"cow-protocol":{health:e=>mg(e),auction:e=>ug(e),openOrders:(e,t={})=>dg(t,e),recentTrades:(e,t={})=>pg(t,e)},"hiro-stacks":{health:e=>fg(e),networkInfo:e=>hg(e),stackingInfo:e=>gg(e),poxCycles:e=>yg(e),blocks:(e,t={})=>bg(t,e)},"jito-mev":{health:e=>Sg(e),recentBundles:(e,t={})=>kg(t,e),tipFloor:e=>Eg(e)},"kamino-strategies":{health:e=>Ag(e),strategies:(e,t={})=>Ig(t,e),strategyMetrics:(e,t={})=>_g(t,e)},"liquid-esplora":{health:e=>Ng(e),tipHeight:e=>Og(e),addressInfo:(e,t={})=>Rg(t,e),assetInfo:(e,t={})=>$g(t,e)},"magiceden-ordinals":{health:e=>Ug(e),collectionStat:(e,t={})=>Bg(t,e)},"mempool-lightning":{health:e=>Fg(e),statistics:e=>qg(e),nodeRankings:(e,t={})=>Hg(t,e),nodeCountries:e=>jg(e)},"mempool-mining":{health:e=>Wg(e),difficulty:e=>Gg(e),poolShare:(e,t={})=>Kg(t,e),hashrate:(e,t={})=>Yg(t,e),rewardStats:(e,t={})=>Xg(t,e)},"meteora-dlmm":{health:e=>Zg(e),pools:(e,t={})=>ey(t,e),poolSearch:(e,t={})=>ty(t,e)},"ordinals-runes":{health:e=>ry(e),blockHeight:e=>oy(e),blockInfo:(e,t={})=>iy(t,e),satInfo:(e,t={})=>sy(t,e),runeInfo:(e,t={})=>ay(t,e)},"pyth-price-feeds":{health:e=>uy(e),latestPrice:(e,t={})=>dy(t,e),latestPrices:(e,t={})=>py(t,e),feedDirectory:e=>my(e)},"relayscan-mev":{health:e=>by(e),overview:(e,t={})=>Jc(t,e),builderProfit:(e,t={})=>gy(t,e),dailyStats:(e,t={})=>yy(t,e)},"sanctum-lst":{health:e=>xy(e),lstList:e=>el(e),apyAll:e=>Sy(e),apyIndividual:(e,t={})=>ky(t,e)},"solend-lending":{health:e=>Iy(e),markets:e=>nl(e),reserves:(e,t={})=>_y(t,e)},"execution-strategies":{health:()=>Cy(),plan:(e,t={})=>Py(t)},"across-bridge":{health:e=>d0(e),pools:(e,t={})=>p0(t,e),suggestedFees:(e,t={})=>m0(t,e)},"beefy-yields":{health:e=>f0(e),apy:(e,t={})=>h0(t,e),apyBreakdown:e=>g0(e)},"birdeye-tokens":{health:e=>b0(e),tokenList:(e,t={})=>w0(t,e)},"celestia-da":{health:e=>x0(e),stats:e=>S0(e),blockStats:(e,t={})=>k0(t,e)},"das-assets":{health:e=>E0(e),assetsByOwner:(e,t={})=>v0(t,e),searchAssets:(e,t={})=>A0(t,e),assetProof:(e,t={})=>I0(t,e)},"l2beat-tvl":{health:e=>_0(e),tvl:(e,t={})=>P0(t,e),activity:(e,t={})=>C0(t,e)},"spark-lend":{health:e=>T0(e),markets:(e,t={})=>N0(t,e)},"symbiotic-restaking":{health:e=>O0(e),vaults:(e,t={})=>R0(t,e),vaultDetail:(e,t={})=>$0(t,e)}},Ty=new Set(["prepareBuilderApproval","prepareBracket","prepareIsolatedMargin","prepareLeverage","prepareCancel","prepareOrder","preparePurchase","prepareList","prepareSell","prepareBuy","prepareMint","prepare","prepareStakeDeposit","prepareStakeWithdraw","prepareDelegate","prepareSwap","prepareTransfer","createOrder","cancelOrder"]),Ny=new Set(["hl-exec"]);function mP(e){return Ny.has(String(e||""))}function fP(e,t,n={}){let r=String(t||""),o=`${e}.${r}`;if(Ny.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)&&!Ty.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(Ty.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(mP(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.`);fP(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=pP[e];if(!i||typeof i[t]!="function")throw new Error(`No client implementation for ${e}.${t}`);return i[t](r,n)}async function Oy({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 Ry(){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 hP={catalog:Ry,health:Oy,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 $e=Object.freeze({FULL:"FULL",NO_GAS:"NO_GAS",FAILED:"FAILED"}),Ly={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 $y(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:$e.FAILED,amountOut:null,error:l||"no amountOut returned"};let p=Br(n);if(p==null||p<=0n)return{source:t,quality:$e.FAILED,amountOut:null,error:"non-positive amountOut"};let m=Number(s);return{source:t,quality:o==null?$e.NO_GAS:$e.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 My(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 Uy(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 sl(e,{destPriceUsd:t=null,destDecimals:n=null,liquidityFirst:r=!0,liquidityBandBps:o=50}={}){let i=e.filter(b=>b.quality!==$e.FAILED),s=e.filter(b=>b.quality===$e.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 Ui(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"?$y({source:s,error:String(o.reason?.message||o.reason)}):$y({source:s,...o.value})})}var We=e=>{let t=Number(e);return Number.isFinite(t)?t:null};function Bi(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 Dy(e,t={}){let n=Ly[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,""),By=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 gP(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 yP(e,t={}){let n=bt(t.tool||t.provider||t.bridge||t.protocol),r=[];return e==="lifi"&&n&&n!=="lifi"&&r.push(...By[n]||[n]),r.push(...By[bt(e)]||[e]),r}function bP(e,t,n={}){let r=Array.isArray(e)?e:[],o=yP(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 al({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:Bi(m?.gasCosts),feeUsd:Bi(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}}}}),He[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 Fy({fromChainId:e,toChainId:t,tokenIn:n,tokenOut:r,amountIn:o,taker:i,opts:s={}}){let a=[],c=null,l=async(u,d={})=>(c||=gP(s),bP(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:Bi(d?.gasCosts),feeUsd:Bi(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 wP={1:"ethereum",10:"optimism",56:"bsc",137:"polygon",8453:"base",42161:"arbitrum",43114:"avax"};async function qy(e,t,n){let r=wP[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 xP(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=Dy(n,t),a=qy(n,o,t),c=al({...e,nativePriceUsd:s,decimalsOut:e.decimalsOut,destDecimalsPromise:a,opts:t}),[l,u]=await Promise.all([Ui(c,{timeoutMs:t.timeoutMs??12e3}),a]);s.catch(()=>{});let d=sl(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 My(async g=>{let b=al({...e,amountIn:g.toString(),nativePriceUsd:s,decimalsOut:e.decimalsOut,destDecimalsPromise:a,opts:t}).filter(x=>x.source===m);return b.length?(await Ui(b,{timeoutMs:t.timeoutMs??12e3}))?.[0]?.amountOut??null:null},i);if(h){let g=Uy(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!==$e.FAILED).length,note:cl(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!==$e.FAILED).length,note:cl(d,c.length)}}async function SP(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=qy(r,i,t),c=Fy({...e,opts:t}),[l,u]=await Promise.all([Ui(c,{timeoutMs:t.timeoutMs??15e3}),a]),d=sl(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!==$e.FAILED).length,note:cl(d,c.length)}}function kP(e){let t=e?.meta?.oracleFee;return t?.applies?` \xB7 ${ep(t)}`:""}function cl(e,t){if(!e.best)return"no source returned a usable route";let n=e.routes.length,r=kP(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 Di(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 Le(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*Di(t-e.scale),t):Ge(e.mantissa/Di(e.scale-t),t)}function ll(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]=ll(e,t);return Ge(n.mantissa+r.mantissa,o)}function Fr(e,t){let[n,r,o]=ll(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 Me(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*Di(t.scale+n),o=t.mantissa*Di(e.scale);return Ge(r/o,n)}function St(e,t){let[n,r]=ll(e,t);return n.mantissa<r.mantissa?-1:n.mantissa>r.mantissa?1:0}import{readFileSync as EP,existsSync as vP}from"node:fs";import{fileURLToPath as AP}from"node:url";import{dirname as IP,join as jy}from"node:path";var _P=jy(IP(AP(import.meta.url)),"fixtures");function PP(){try{let e=ri("equities-fixtures",import.meta.url);if(e&&vP(e))return e}catch{}return _P}var CP=PP();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 TP(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){TP(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 NP(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 OP(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 RP(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 $P(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 LP(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 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)){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 UP(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 BP(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 DP(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 FP(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 qP=Object.freeze({venues:NP,universe:OP,oracles:RP,nyseHolidays:$P,dstTransitions:LP,equityDexPools:MP,rhPoolState:UP,solanaXstocks:DP,tonXstocks:FP,hip3L2Books:BP});function HP(e,t){let n=Vy[t],r=jy(e,n),o;try{o=EP(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 qP[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=CP}={}){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]=HP(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 Fi(){return Et().rhPoolState}function Xy(){return Et().solanaXstocks}function Qy(){return Et().tonXstocks}function Jy(){return Et().hip3L2Books}var dl=1e3,tb=60*dl,pl=60*tb,Zy=24*pl,jP=-5*pl,VP=-4*pl,nb=240,rb=570,ob=960,ib=1200,MU=Object.freeze([nb,rb,ob,ib]),UU=Object.freeze(["core","extended","dark"]),eb,ul;function zP(){let e=Yy().dstTransitions.map(r=>({year:r.year,startMs:r.startUtc*dl,endMs:r.endUtc*dl}));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??=zP(),eb}function WP(){return ul===void 0&&(ul=new Set(Ky().holidayDayIndex)),ul}function ab(e,t){if(!Number.isSafeInteger(e))throw new TypeError(`${t}: epochMs must be a safe integer number of milliseconds`)}function GP(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 KP(e){for(let t of sb().rows)if(e>=t.startMs&&e<t.endMs)return!0;return!1}function YP(e){return KP(e)?VP:jP}function XP(e){let t=e+YP(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 QP({dayIndex:e,weekday:t}){return t===0||t===6?!1:!WP().has(e)}function JP(e){return e<nb?"dark":e<rb?"extended":e<ob?"core":e<ib?"extended":"dark"}function qr(e){ab(e,"sessionState"),GP(e,"sessionState");let t=XP(e);return QP(t)?JP(t.minuteOfDay):"dark"}function ml(e){return ab(e,"isDark"),qr(e)==="dark"}var qi=Object.freeze({DORMANT_VENUE:"dormant-venue",CROSSED_BOOK:"crossed-book",STALE_QUOTE:"stale-quote",STALE_ORACLE:"stale-oracle"}),ZP=12e4,eC=6e5;function Hi(e,t){e.push(Object.freeze({venue:t.venue,symbol:t.symbol??null,reason:t.reason,evidence:t.evidence??null}))}function tC(e){let t=e.raw?.vol24h;return!!(t===0||t===0||typeof t=="number"&&Number.isFinite(t)&&t<=0)}function nC(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 ji(e,t={}){if(!Array.isArray(e))throw new TypeError("quotes must be an array");let n=t.nowMs??Date.now(),r=t.quoteFreshnessMs??ZP,o=t.oracleFreshnessMs??eC,i=t.includeDormant===!0,s=[],a=[];for(let c of e){if(tC(c)){i?s.push(Object.freeze({...c,staleData:!0})):Hi(a,{venue:c.venue,symbol:c.symbolRaw??c.symbol,reason:qi.DORMANT_VENUE,evidence:{vol24h:c.raw?.vol24h??null}});continue}if(nC(c)){Hi(a,{venue:c.venue,symbol:c.symbolRaw??c.symbol,reason:qi.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)){Hi(a,{venue:c.venue,symbol:c.symbolRaw??c.symbol,reason:qi.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)){Hi(a,{venue:c.venue,symbol:c.symbolRaw??c.symbol,reason:qi.STALE_ORACLE,evidence:{capturedAt:c.capturedAt,nowMs:n,session:l}});continue}}s.push(c)}return{survivors:s,excluded:a}}function rC(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(rC(e))}function Ue(e,t){let n=oe(e);if(n===null)throw new TypeError(`${t} must be a finite source number`);return n}var oC=new Set(["spot","perp"]),iC=new Set(["read-only","quote-only","prepare","intent"]),sC=new Set(["buy","sell"]),aC=new Set(["net-of-cost","gross"]),cC=new Set(["homogeneous","heterogeneous"]),lC=["bid","ask","mid","mark"],lb=["fees","gasEstimate","priceImpact","fundingHourly"],uC=/^[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 hl(e,t){(!Number.isSafeInteger(e)||e<0)&&Y(t,"must be a nonnegative safe integer")}function fl(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 Vi(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`),uC.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,oC,"quote.instrument"),Hr(e.tier,iC,"quote.tier"),$n(e.symbolRaw,"quote.symbolRaw"),$n(e.symbol,"quote.symbol"),Hr(e.side,sC,"quote.side"),fl(e.requestedSize,"quote.requestedSize"),e.requestedSize.mantissa<0n&&Y("quote.requestedSize","must not be negative");let t=0;for(let n of lC)Object.hasOwn(e,n)&&(fl(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)fl(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"),hl(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 gl(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,aC,"rankResult.rankedOn"),Array.isArray(e.ranked)||Y("rankResult.ranked","must be an array"),e.ranked.forEach((t,n)=>Vi(t,`rankResult.ranked[${n}]`)),Vi(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)=>Vi(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"),hl(e.sourcesAnswered,"rankResult.sourcesAnswered"),hl(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,cC,"rankResult.instrumentMix"),Vi(e.bestPreparable,"rankResult.bestPreparable",!0),Object.hasOwn(e,"carry")&&e.carry!==null&&Wt(e.carry,"rankResult.carry"),e}var dC="arcus_perp",pC="robinhood-4663",mC="quote-only",zi="0.00000480324074074";function mb(){return Ae().venues.arcus}function fC(){return Object.keys(mb().markets).sort()}function hC({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=Ue(o.mark,`${r}.mark`),s=oe(o.oracle),a=oe(o.fundingHourly),c=n===null?D("0"):n,l={venue:dC,chain:pC,instrument:"perp",tier:mC,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:zi,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 Wi({side:e="buy",sizeUsd:t=null}={}){return fC().map(n=>hC({symbol:n,side:e,sizeUsd:t})).filter(n=>n!==null)}var fb=36e5,eB=24*365;function yl(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=gC(r,t),c=t-a,l=D(zi),u=yl(i,c),d=yl(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:Le(m),confidence:"estimate",darkHours:a,litHours:c,darkWindowRate:zi,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=yl(i,t);return{model:"current-funding-held-constant",horizonHours:t,carryBps:s,carryBpsDisplay:Le(s),confidence:"estimate",compounding:"ignored",compoundingErrorBoundNote:"simple sum; at 30d and 1e-5/h the ignored compound is under 0.5bp"}}function gC(e,t){if(t<=0)return 0;let n=0,r=Math.floor(t);for(let o=0;o<r;o+=1)ml(e+o*fb)&&(n+=1);return t>r&&ml(e+r*fb)&&(n+=t-r),n}function yC(e){return e.mid??e.mark??e.ask??e.bid??null}function bC(e){let t=yC(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 wC(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 xC(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 Me(xe(n,fe(10000n,0)),t.net,4)}function bl(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=ji(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=bC(I);if(R===null)continue;let _=null;if(l&&I.instrument==="perp"&&(_=hb(I,c,{nowMs:n}),_.carryBps!==null)){let E=xt(D("1"),Me(_.carryBps,fe(10000n,0),12));R.net=xe(R.net,E),R.costAccounted=!1}u.push(wC(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:xC(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=SC(u));let T={rankedOn:g,ranked:h,winner:m,runnersUp:f,improvementBps:b===null?null:Number(Le(b)),sourcesAnswered:s,sourcesTried:r,failed:a,excluded:i,darkWindow:w,instrumentMix:p,bestPreparable:k,carry:m?.carry??null,breakEvenHorizonHours:v};return gl(T)}function SC(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=Me(r,o,4),s=Number(Le(i));return!Number.isFinite(s)||s<0?null:s}catch{return null}}var kC="rh_uniswap",EC=4663,vC="prepare",AC=1n<<192n,Ln=18,IC=Object.freeze({v3:180000n,v4:240000n});function wl(){return Fi()}function _C(e){return{mantissa:e*e*10n**BigInt(Ln)/AC,scale:Ln}}function PC(e){let t=_C(BigInt(e.sqrtPriceX96)),n=e.quote==="USDG"?6:18,r=18;if(e.quoteIsToken0){let o=Me(xe(t,fe(10n**BigInt(n),0)),fe(10n**BigInt(r),0),Ln);return o.mantissa===0n?null:Me(D("1"),o,Ln)}return Me(xe(t,fe(10n**BigInt(r),0)),fe(10n**BigInt(n),0),Ln)}function CC(e){let t=Gy(),n=t.assets[e];return n?fe(n.rawPrice,t.oracleScaleExp):null}function TC(e,t){if(e===null||t===null||e.mantissa<=0n||t.mantissa<=0n)return null;let n={...e};return Me(t,NC(n,t),Ln)}function NC(e,t){let n=Math.max(e.scale,t.scale);return{mantissa:Dr(e,n).mantissa+Dr(t,n).mantissa,scale:n}}function OC(e){let t=wl(),n=IC[e];return n?{wei:BigInt(t.gasPriceWei)*n,units:n,native:"ETH"}:null}function xl(){return Object.keys(wl().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=wl(),o=r.pools[e];if(!o)return null;let i=PC(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:Me(fe(BigInt(o.feePpm),0),fe(1000000n,0),8),l=a.mantissa===0n?D("0"):TC(s,a),u=OC(o.version),m={venue:kC,chain:EC,instrument:"spot",tier:vC,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=CC(e);return f!==null&&(m.referencePrice=f,m.referenceBasisBps=Le(Me(xe(Fr(i,f),fe(10000n,0)),f,4))),Se(m)}function gb({side:e="buy",sizeUsd:t=null}={}){return xl().map(n=>Mn({symbol:n,side:e,sizeUsd:t})).filter(n=>n!==null)}var yb=12e4,RC="0x0000000000000000000000000000000000000000",$C="0x84b75b19A3cdf8E2F56d0507d22D442847B2053C";function Sl(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=Fi().pools[t],u=l.version==="v4"?$C:RC,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 LC="hyperliquid_hip3",MC="hyperliquid",UC="quote-only";function jr(){return Ae().venues.hyperliquid_hip3}function bb(){return Object.keys(jr().dexs).sort()}function BC(){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 DC(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 FC(e,t){try{return Jy().books[`${e}:${t}`]??null}catch{return null}}function qC(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(Le(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 HC(e,t,n,r){let o=qC(e,t,n);if(!o)return{impact:null,depth:null};let i=Number(Le(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=Ue(n.mark,`${e}:${t}.mark`),s=oe(n.fundingHourly),a=oe(n.vol24h),c=oe(n.oi),l=o===null?D("0"):o,u=FC(e,t),d=null,p=null,m="fees and gas not captured";if(l.mantissa>0n)if(u){let g=HC(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:LC,chain:MC,instrument:"perp",tier:UC,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=DC(e);return r.length===0||r.length>1?null:wb({...r[0],side:t,size:n})}function Gi({side:e="buy",sizeUsd:t=null,ticker:n=null}={}){let r=[];for(let o of BC()){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 jC="arcus_spot",VC="robinhood-4663",zC="quote-only";function Sb(){return Ae().venues.arcus_spot}function WC(){return Object.keys(Sb().pairs).sort()}function GC({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:Ue(r.bid,`${e}.bid`),i=r.ask===void 0||r.ask===null?null:Ue(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:jC,chain:VC,instrument:"spot",tier:zC,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 Ki({side:e="buy",sizeUsd:t=null}={}){return WC().map(n=>GC({symbol:n,side:e,sizeUsd:t})).filter(n=>n!==null)}var KC="solana_xstocks",YC="solana",XC="quote-only",kb=25e3;function Yi(){return Xy()}function kl(){return Object.keys(Yi().tokens).sort()}function QC(e){let t=Yi().pairs[e];return!t||t.length===0?null:[...t].sort((n,r)=>(r.liquidityUsd??0)-(n.liquidityUsd??0))[0]}function JC(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 El({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 return null;let s=i[r],a=QC(r);if(!s||!a)return null;let c=Ue(a.priceUsd,`${r}.priceUsd`),l=oe(a.liquidityUsd),u=n===null?D("0"):n,d=u.mantissa===0n?D("0"):JC(l,u),p=!1;u.mantissa===0n&&(a.liquidityUsd??0)>=kb&&(p=!1);let m={venue:KC,chain:YC,instrument:"spot",tier:XC,symbolRaw:o,symbol:r,side:t,requestedSize:u,mid:c,fees:null,gasEstimate:null,priceImpact:d,fundingHourly:null,costAccounted:p,capturedAt:Yi().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 kl().map(n=>El({symbol:n,side:e,sizeUsd:t})).filter(n=>n!==null)}var ZC="ton_stonfi",eT="ton",tT="quote-only",nT=25e3,rT=.01;function Xi(){return Qy()}function vl(){return Object.keys(Xi().tokens).sort()}function oT(e){let t=Xi().pairs[e];return!t||t.length===0?null:[...t].sort((n,r)=>(r.liquidityUsd??0)-(n.liquidityUsd??0))[0]}function iT(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 Al({symbol:e,side:t="buy",sizeUsd:n=null}={}){if(typeof e!="string"||e.length===0)return null;let r=e,o=e,i=Xi().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=oT(r);if(!s||!a)return null;let c=Ue(a.priceUsd,`${r}.priceUsd`),l=oe(a.liquidityUsd),u=n===null?D("0"):n,d=u.mantissa===0n?D("0"):iT(l,u),m={venue:ZC,chain:eT,instrument:"spot",tier:tT,symbolRaw:o,symbol:r,side:t,requestedSize:u,mid:c,fees:null,gasEstimate:null,priceImpact:d,fundingHourly:null,costAccounted:!1,capturedAt:Xi().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)<nT,impactSizeFractionHint:rT}};return Se(m)}function vb({side:e="buy",sizeUsd:t=null}={}){return vl().map(n=>Al({symbol:n,side:e,sizeUsd:t})).filter(n=>n!==null)}var Ab=3600*1e3;function Il(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=Il(t),o=[],i=xb({symbol:`xyz:${n}`,sizeUsd:r});if(i)o.push(i);else for(let l of Gi({ticker:n,sizeUsd:r}))o.push(l);for(let l of Wi({sizeUsd:r}))l.symbol===n&&o.push(l);for(let l of Ki({sizeUsd:r}))l.symbol===n&&o.push(l);let s=Mn({symbol:n,sizeUsd:r});s&&o.push(s);let a=El({symbol:n,sizeUsd:r});a&&o.push(a);let c=Al({symbol:n,sizeUsd:r});return c&&o.push(c),o}function sT(e={}){let t=String(e.ticker||e.symbol||"").trim().toUpperCase();if(!t)throw new Error("bestEquityRoute requires ticker");let n=Il(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=bl(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 aT(){let e=[{venue:"hyperliquid_hip3",tier:"quote-only",chain:"hyperliquid",n:Gi().length},{venue:"arcus_perp",tier:"quote-only",chain:"robinhood-4663",n:Wi().length},{venue:"arcus_spot",tier:"quote-only",chain:"robinhood-4663",n:Ki().length},{venue:"rh_uniswap",tier:"prepare",chain:4663,n:xl().length},{venue:"solana_xstocks",tier:"quote-only",chain:"solana",n:kl().length},{venue:"ton_stonfi",tier:"quote-only",chain:"ton",n:vl().length}],t=[...Gi(),...Wi(),...Ki(),...gb(),...Eb(),...vb()],n=(t[0]?.capturedAt??Date.now())+1e3,{survivors:r,excluded:o}=ji(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 cT(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=Il(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=Sl({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 lT(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"}),uT=5e3,dT=1500;function pT(e,t){return t===0n?null:Number((t-e)*10000n/t)}function mT(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=mT(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=pT(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>=uT?vt(ue.HONEYPOT,`round trip loses ${(u/100).toFixed(1)}% \u2014 a sell tax or rigged curve, not normal slippage`,d):u>=dT?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 fT(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"}),hT=new Set(["watch","watch this","ping","ping me","alert","notify"]),gT=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(hT.has(t))return At.ALERT_ONLY;if(t==="arm")return At.EXECUTE;throw new TypeError(`unsupported action verb: ${t}`)}function yT(e={}){let{verb:t,...n}=e;return{...n,active:!0,actionMode:Tb(t)}}function bT(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 wT(e){return e?.active===!0&&e?.actionMode===At.ALERT_ONLY}function xT(e){return e?.active===!0&&e?.actionMode===At.EXECUTE}function ST(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:gT.has(String(e.status||"").toLowerCase());return{...e,active:t,actionMode:At.ALERT_ONLY}}import{createHash as kT}from"node:crypto";var _l=1,Nb=Object.freeze(["chainId","agentAddress","accountAddress","actions","targets","maxValueWei","maxGasWei","maxSlippageBps","expiresAt","nonce","revocationKey"]),ET=Object.freeze(["read","simulate"]),Ob=1e4,Rb=1440*60,$b=128,Lb=256,Mb=64,Ub=256,Bb=/^0x[0-9a-fA-F]{40}$/,vT=/^[a-z][a-z0-9_-]*:[a-z0-9._-]+$/,AT=/^[a-z][a-z0-9_-]*:\*$/,IT=/^[A-Za-z0-9._:-]+$/,_T=/^[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 PT(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function CT(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 ET.includes(t)}function qb(e,t={}){let n=[],r=(d,p)=>n.push({field:d,message:p});if(!PT(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&&AT.test(m)?d.push(m):r("actions",`broad wildcard action "${m}" is rejected (fail closed)`);continue}if(!vT.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=CT(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||!IT.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||!_T.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 Pl(e,t={}){let{ok:n,errors:r,grant:o}=qb(e,t);if(!n)throw new Vr(r);return o}function Cl(e,t={}){let n=Pl(e,t),o=Object.keys(n).sort().map(i=>`${JSON.stringify(i)}:${JSON.stringify(n[i])}`);return`{"version":${_l},${o.join(",")}}`}function Hb(e,t={}){return kT("sha256").update(Cl(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"]),TT="agent:execute",NT="build:factory",Vb=["read:markets","read:nfts","read:positions","watch:contracts","prepare:trade","prepare:mint","prepare:build","agent:shadow"];function OT(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 RT="@oracle-agent/oracle",$T="npx",LT=["-y","--package",RT,"oracle-data-mcp"],Kb=/(?:^|_)(?:PRIVATE_KEY|SECRET|TOKEN|PASSWORD|PASSPHRASE|MNEMONIC|SEED)(?:_|$)/i;function Nl(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 MT(e){let t=Nl(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 UT(e){let t=Nl(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 BT(e){let t=Nl(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
|
-
`}function
|
|
60
|
-
`)}function
|
|
61
|
-
`)}function
|
|
62
|
-
`)}function Yb({url:e,key:t,label:n="oracle-data"}={}){let r=MT(e),o=UT(t),i=BT(n),s={command:$T,args:[...LT],env:{ORACLE_DATA_URL:r,ORACLE_AGENT_KEY:o}},a={mcpServers:{[i]:s}},c={hermes:Gb(i,s),claudeCode:Ie(a),codex:DT(i,s),cursor:Ie(a),genericMcp:Ie(a),oracleNative:FT(),chatgpt:Ie(a),claudeDesktop:Ie(a),windsurf:Ie(a),vscode:Ie(a),openclaw:Ie(a),perplexity:Ie(a),manus:Ie(a),prime:Gb(i,s),opencode:Ie(a)};for(let l of Wb()){if(l.kind==="oracle")continue;let u=l.configKey||l.id;c[u]||(c[u]=Ie(a))}return c}var qT=Yb;var Xb=Object.freeze({assetHighPct:50,assetMediumPct:25,chainHighPct:75,venueHighPct:60,stablecoinHighPct:70}),HT=new Set(["USDC","USDT","USDT0","DAI","FRAX","LUSD","TUSD","USDP","GUSD","PYUSD","USDE"]);function Qb(e){if(e===null||e===""||e===void 0)return null;let t=Number(e);return Number.isFinite(t)&&t>=0?t:null}function Wr(e){return Math.round((e+Number.EPSILON)*1e8)/1e8}function Rl(e,t){return t>0?Wr(e/t*100):null}function $l(e){return e.address||e.owner||e.walletAddress||e.wallet?.address||null}function jT(e){let t=Array.isArray(e)?e:Array.isArray(e?.entries)?e.entries:[],n=new Map;for(let r of t){if(!r?.address)continue;let o=String(r.address).toLowerCase();n.has(o)||n.set(o,r)}return n}function Gt(e,t,n={}){if(!t||typeof t!="object")return;let r=String(t.symbol??t.coin??t.name??t.collection??t.tokenId??"unknown"),o=Qb(t.usdValue??t.valueUsd??t.knownUsd??t.estimatedValueUsd??t.floorValueUsd),i=t.kind==="nft"||t.type==="nft"||t.collection||t.tokenId!=null?"nft":"fungible";e.push({symbol:r,usdValue:o,chain:String(t.chain??t.chainName??n.chain??"unknown"),venue:String(t.venue??t.protocol??t.platform??n.venue??"wallet"),address:t.address??n.address??null,kind:i,stablecoin:t.stablecoin===!0||HT.has(r.toUpperCase())})}function VT(e){let t=[],n=$l(e);for(let r of e.assets||e.holdings||[])Gt(t,r,{address:n,chain:e.chain,venue:e.venue});for(let r of e.chains||[]){let o=r.chain??r.name??r.slug??(r.chainId!=null?String(r.chainId):r.family)??"unknown",i={address:r.address??n,chain:o,venue:r.venue};r.native&&(r.native.amount==null||Number(r.native.amount)!==0)&&Gt(t,{...r.native,symbol:r.native.symbol??r.symbol??o},i);for(let a of r.assets||r.fungibleTokens?.assets||[])Gt(t,a,i);for(let a of r.collectibles?.assets||r.nfts||[])Gt(t,{...a,kind:"nft"},i);for(let a of r.spot?.balances||[])Gt(t,a,{...i,venue:"Hyperliquid spot"});let s=Qb(r.perps?.accountValueUsd);s!=null&&Gt(t,{symbol:"perps account",usdValue:s},{...i,venue:"Hyperliquid perps"})}for(let r of e.inventory?.items||e.nfts?.items||[])Gt(t,{...r,kind:"nft"},{address:n,chain:r.chain??e.chain,venue:r.marketplace??e.venue});return t}function zT(e,t){let n=$l(e),r=e.chain??e.chainId??e.family??"*";return n?`${String(n).toLowerCase()}|${String(r).toLowerCase()}`:`snapshot:${t}`}function Ol(e,t,n){let r=new Map;for(let o of e){if(o.usdValue==null)continue;let i=o[t];r.set(i,(r.get(i)||0)+o.usdValue)}return[...r].map(([o,i])=>({name:o,knownUsd:Wr(i),percentOfKnown:Rl(i,n)})).sort((o,i)=>i.knownUsd-o.knownUsd||o.name.localeCompare(i.name))}function Qi(e={},t={}){let n=Array.isArray(e)?e:Array.isArray(e.snapshots)?e.snapshots:e.snapshot?[e.snapshot]:[],r=jT(t.labels??t.addressBook??e.labels??e.addressBook),o={...Xb,...e.thresholds||{},...t.thresholds||{}},i=[],s=new Set,a=0;n.forEach((E,q)=>{if(!E||typeof E!="object")return;let ge=zT(E,q);s.has(ge)?a+=1:(s.add(ge),i.push(E))});let c=i.flatMap(VT),l=c.filter(E=>E.usdValue!=null),u=c.filter(E=>E.usdValue==null),d=i.reduce((E,q)=>E+Number(q.valuation?.unpricedNonzeroItems||q.unpricedNonzeroItems||0),0),p=Wr(l.reduce((E,q)=>E+q.usdValue,0)),m=u.length+d,f=Ol(l,"chain",p),h=Ol(l,"venue",p),g=Ol(l,"symbol",p);for(let E of f)E.chain=E.name;for(let E of h)E.venue=E.name;for(let E of g)E.asset=E.name,E.symbol=E.name;let b=Wr(l.filter(E=>E.stablecoin).reduce((E,q)=>E+q.usdValue,0)),k=c.filter(E=>E.kind==="nft"),x=i.reduce((E,q)=>E+Number(q.valuation?.nftUnvaluedItems||0),0),w=k.filter(E=>E.usdValue==null).length+x,v=k.filter(E=>E.usdValue!=null).length,T=g[0]||null,I=T?T.percentOfKnown>=o.assetHighPct?"high":T.percentOfKnown>=o.assetMediumPct?"medium":"low":"unknown",R=[];m&&R.push(`${m} nonzero holding(s) have unknown USD value; they are excluded from totals and percentages.`),w&&R.push("NFT valuation coverage is partial; estimates are not executable bids and unvalued NFTs are not treated as zero."),a&&R.push(`${a} duplicate address/chain snapshot(s) were ignored.`),T&&I!=="low"&&R.push(`Asset concentration is ${I}: ${T.name} is ${T.percentOfKnown}% of known value.`),f[0]?.percentOfKnown>=o.chainHighPct&&R.push(`Chain concentration is high: ${f[0].name} is ${f[0].percentOfKnown}% of known value.`),h[0]?.percentOfKnown>=o.venueHighPct&&R.push(`Venue concentration is high: ${h[0].name} is ${h[0].percentOfKnown}% of known value.`);let _=i.map($l).filter(Boolean).map(E=>{let q=r.get(String(E).toLowerCase());return{address:E,label:q?.label??null,who:q?.who??null,role:q?.role??null}});return{totalKnownUsd:p,coverage:{complete:i.length>0&&m===0&&i.every(E=>E.valuation?.complete!==!1&&E.coverage?.complete!==!1),label:m===0&&i.length&&i.every(E=>E.valuation?.complete!==!1&&E.coverage?.complete!==!1)?"complete for the supplied snapshots":"known priced value only; portfolio coverage is partial or unverified",unknownUsd:m?null:0,pricedItemCount:l.length,unknownItemCount:m,snapshotCount:i.length,duplicatesIgnored:a},chainExposures:f,venueExposures:h,topAssets:g.slice(0,Math.max(1,Number(t.topAssets??e.topAssets??10))),concentrationRisk:{level:I,topAsset:T?.name??null,topAssetPercent:T?.percentOfKnown??null,thresholds:{mediumPct:o.assetMediumPct,highPct:o.assetHighPct}},stablecoinExposure:{knownUsd:b,percentOfKnown:Rl(b,p),high:p>0&&Rl(b,p)>=o.stablecoinHighPct},nftCoverage:{status:k.length||x?w?"partial":"valued":"not-observed",valuedItems:v,unvaluedItems:w,knownUsd:Wr(k.filter(E=>E.usdValue!=null).reduce((E,q)=>E+q.usdValue,0))},addresses:_,warnings:[...new Set(R)]}}var WT=Qi;var de=(e,t=0)=>Number.isFinite(Number(e))?Number(e):t,Be=e=>Math.round((e+Number.EPSILON)*1e8)/1e8,re=(e,t="unknown")=>String(e??t).trim().toLowerCase(),Ye=e=>e.asset??e.symbol??e.coin,Zb=e=>e.address??e.owner??e.account,Zi=e=>[re(e.chain??e.chainId),re(Zb(e)),re(Ye(e)),re(e.source)].join("|");function Jb(e){return de(e.asOf??e.updatedAt??e.timestamp,0)}function GT(e){let t=e.fillId??e.tradeId??e.orderId??e.txHash??e.transactionHash??e.timestamp??e.asOf;return[Zi(e),re(t),re(e.side),de(e.quantity??e.amount??e.size),de(e.price??e.priceUsd)].join("|")}function Ji(e,t){let n=new Map,r=0;for(let o of e||[]){if(!o||typeof o!="object"||!Ye(o))continue;let i=t==="fill"?GT(o):Zi(o);n.has(i)?(r+=1,t!=="fill"&&Jb(o)>Jb(n.get(i))&&n.set(i,{...o,identity:i})):n.set(i,{...o,identity:i})}return{rows:[...n.values()].sort((o,i)=>o.identity.localeCompare(i.identity)),duplicatesIgnored:r}}function KT(e){let t=new Map;for(let n of e){let r=[Zi(n),`${re(n.chain??n.chainId)}|${re(Ye(n))}`,`*|${re(Ye(n))}`];for(let o of r)t.has(o)||t.set(o,n)}return t}function YT(e,t){return t.get(Zi(e))??t.get(`${re(e.chain??e.chainId)}|${re(Ye(e))}`)??t.get(`*|${re(Ye(e))}`)??null}function XT(e){let t=new Map,n=0;for(let r of e){let o=[re(r.chain??r.chainId),re(Zb(r)),re(Ye(r))].join("|"),i=t.get(o)??{quantity:0,cost:0},s=Math.abs(de(r.quantity??r.amount??r.size)),a=de(r.price??r.priceUsd),c=de(r.feeUsd);if(re(r.side)==="sell"){let l=Math.min(s,i.quantity),u=i.quantity?i.cost/i.quantity:de(r.costBasisUsd)/(s||1);n+=l*(a-u)-c,i.quantity-=l,i.cost-=l*u}else i.quantity+=s,i.cost+=s*a+c;t.set(o,i)}return{realizedPnlUsd:Be(n),lots:t}}function Ll(e={},t={}){let n=de(t.asOf??e.asOf,0),r=Math.max(0,de(t.priceTtlMs??e.priceTtlMs,6e4)),o=Ji(e.balances||[],"balance"),i=Ji(e.positions||[],"position"),s=Ji(e.fills||[],"fill"),a=Ji(e.prices||[],"price"),c=KT(a.rows),l=[],u=0,d=0;for(let _ of[...o.rows,...i.rows]){let E=YT(_,c),q=de(_.quantity??_.amount??_.size),ge=E?de(E.priceUsd??E.price,NaN):de(_.priceUsd,NaN);if(!Number.isFinite(ge)){d+=1;continue}let Ce=q*ge,jn=de(E?.asOf??_.priceAsOf,0),Xt=n-jn>r;Xt&&(u+=Math.abs(Ce)),l.push({..._,quantity:q,priceUsd:ge,valueUsd:Ce,stale:Xt,kind:i.rows.includes(_)?"position":"balance"})}let p=l.filter(_=>_.kind==="balance").reduce((_,E)=>_+E.valueUsd,0),m=l.filter(_=>_.kind==="position"),f=m.reduce((_,E)=>_+E.valueUsd,0),h=m.reduce((_,E)=>_+Math.abs(E.valueUsd),0),g=p+f,b=de(e.equityUsd,g),k=XT(s.rows).realizedPnlUsd,x=m.reduce((_,E)=>{let q=de(E.entryPriceUsd??E.averageEntryPrice??E.costBasisPrice,E.priceUsd);return _+E.quantity*(E.priceUsd-q)},0),w=new Map;for(let _ of l)w.set(re(Ye(_)),(w.get(re(Ye(_)))||0)+Math.abs(_.valueUsd));let v=[...w.values()].reduce((_,E)=>_+E,0),T=[...w].map(([_,E])=>({asset:_,exposureUsd:Be(E),percent:v?Be(E/v*100):null})).sort((_,E)=>E.exposureUsd-_.exposureUsd||_.asset.localeCompare(E.asset)),I=l.reduce((_,E)=>_+Math.abs(E.valueUsd),0),R=Qi({snapshots:[{assets:l.map(_=>({symbol:Ye(_),usdValue:Math.abs(_.valueUsd),chain:_.chain,venue:_.source}))}],thresholds:e.thresholds});return Object.freeze({asOf:n,balances:o.rows,positions:i.rows,fills:s.rows,prices:a.rows,duplicatesIgnored:o.duplicatesIgnored+i.duplicatesIgnored+s.duplicatesIgnored+a.duplicatesIgnored,pnl:{realizedUsd:k,unrealizedUsd:Be(x),totalUsd:Be(k+x)},exposure:{grossUsd:Be(h),netUsd:Be(g),leverage:b>0?Be(h/b):null,equityUsd:Be(b)},concentration:T,priceCoverage:{pricedItems:l.length,unpricedItems:d,staleItems:l.filter(_=>_.stale).length,staleValueUsd:Be(u),stalePercent:I?Be(u/I*100):null,ttlMs:r},risk:R})}var QT=Ll,JT=Ll;import{createHash as rN}from"node:crypto";var Gr=class extends Error{constructor(t,n){super(`secret material must never appear in a public API object (at ${t}, rule: ${n})`),this.name="SecretLeakError",this.path=t,this.rule=n}},ZT=/(private[_-]?key|secret|bearer|keystore|mnemonic|seed[_-]?phrase|passphrase|password|api[_-]?key|access[_-]?token|auth[_-]?token|session[_-]?token|signer[_-]?url|signature)/i,eN=Object.freeze(["privkey","wif","xprv","seed"]);function ew(e){let t=String(e),n=t.toLowerCase().replace(/[\s._-]+/g,"");return ZT.test(t)||eN.includes(n)}var tN=Object.freeze([{rule:"raw-32-byte-hex-key",re:/^0x[0-9a-fA-F]{64}$/},{rule:"raw-32-byte-hex-bare",re:/^[0-9a-fA-F]{64}$/},{rule:"extended-private-key",re:/\b(?:xprv|tprv|yprv|zprv)[1-9A-HJ-NP-Za-km-z]{107}\b/},{rule:"bitcoin-wif",re:/\b[59KLc][1-9A-HJ-NP-Za-km-z]{50,51}\b/},{rule:"bip39-mnemonic",re:/\b(?:[a-z]{3,8}\s+){11,23}[a-z]{3,8}\b/},{rule:"bearer-token",re:/bearer\s+[A-Za-z0-9._~+/=-]+/i},{rule:"pem-private-key",re:/-----BEGIN[A-Z ]*PRIVATE KEY-----/},{rule:"keystore-path",re:/keystore/i},{rule:"signer-url",re:/https?:\/\/\S*sign/i},{rule:"authorization-header",re:/authorization\s*:/i}]),nN=Object.freeze(["grantid","id","hash","sha256","sha256hex","checksum","txhash","transactionhash","blockhash","digest","userophash","commithash","prevhash","intenthash","canonicalhash","payloadhash","requestid"]);function Kt(e,t="$",n=new Set,r=""){if(e==null)return e;if(typeof e=="string"){let o=nN.includes(String(r).toLowerCase().replace(/[_-]/g,""));for(let{rule:i,re:s}of tN)if(!(o&&i.startsWith("raw-32-byte-hex"))&&s.test(e))throw new Gr(t,i);return e}if(typeof e!="object"||n.has(e)||(n.add(e),ArrayBuffer.isView(e)||e instanceof ArrayBuffer))return e;if(e instanceof Map){for(let[o,i]of e.entries()){if(typeof o=="string"&&ew(o))throw new Gr(`${t}[${JSON.stringify(o)}]`,"forbidden-key-name");Kt(o,`${t}[key]`,n),Kt(i,`${t}[${String(o)}]`,n)}return e}if(e instanceof Set){let o=0;for(let i of e.values())Kt(i,`${t}[${o++}]`,n);return e}if(Array.isArray(e))return e.forEach((o,i)=>Kt(o,`${t}[${i}]`,n)),e;for(let[o,i]of Object.entries(e)){if(ew(o))throw new Gr(`${t}.${o}`,"forbidden-key-name");Kt(i,`${t}.${o}`,n,o)}return e}var es=Object.freeze(["intent","quote_comparison","simulation","prepared","approval","signed","broadcast","settlement","balance_delta","position"]),Ul=Object.freeze(Object.fromEntries(es.map((e,t)=>[e,Object.freeze(t+1<es.length?[es[t+1]]:[])]))),tw=new Set(["signed","broadcast"]);function Ml(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(Ml).join(",")}]`:`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${Ml(e[t])}`).join(",")}}`}function oN(e){return e===void 0?null:JSON.parse(JSON.stringify(e))}function ts(e){if(e&&typeof e=="object"&&!Object.isFrozen(e)){Object.freeze(e);for(let t of Object.values(e))ts(t)}return e}function Bl(e,t="fact"){try{Kt(e,t)}catch{throw new Error(`${t} contains custody material and is forbidden`)}}function nw(e){return rN("sha256").update(Ml(e)).digest("hex")}function rw({tradeId:e,state:t,fact:n,asOf:r,previousHash:o,external:i}){let s={tradeId:e,state:t,asOf:r,previousHash:o??null,external:i===!0,fact:oN(n)};return ts({...s,hash:nw(s)})}function iN({tradeId:e,intent:t,asOf:n=0}={}){if(!e||typeof e!="string")throw new Error("tradeId is required");if(!t||typeof t!="object"||Array.isArray(t))throw new Error("intent fact is required");Bl(t,"intent");let r=rw({tradeId:e,state:"intent",fact:t,asOf:n,previousHash:null,external:!1});return ts({tradeId:e,state:"intent",events:[r],headHash:r.hash,custody:"none",execution:"prepare-only"})}function ow(e,t,n,r={}){if(Dl(e),!(Ul[e.state]||[]).includes(t))throw new Error(`invalid trade transition ${e.state} -> ${t}`);if(!n||typeof n!="object"||Array.isArray(n))throw new Error(`${t} fact is required`);Bl(n,t);let i=r.external===!0||r.externallySupplied===!0;if(tw.has(t)&&!i)throw new Error(`${t} must be an externally supplied fact; this module never signs or broadcasts`);let s=e.events.at(-1),a=r.asOf??s.asOf;if(!Number.isFinite(Number(a))||Number(a)<Number(s.asOf))throw new Error("asOf must be finite and monotonic");let c=rw({tradeId:e.tradeId,state:t,fact:n,asOf:a,previousHash:s.hash,external:i});return ts({...e,state:t,events:[...e.events,c],headHash:c.hash})}function Dl(e){if(!e||!Array.isArray(e.events)||e.events.length===0)throw new Error("invalid trade lifecycle");if(e.custody!=="none")throw new Error("trade lifecycle custody must be none");if(e.execution!=="prepare-only")throw new Error("trade lifecycle execution must be prepare-only");let t=null;for(let n=0;n<e.events.length;n+=1){let r=e.events[n],{hash:o,...i}=r;if(nw(i)!==o)throw new Error(`trade event ${n} hash mismatch`);if(Bl(r.fact,`trade event ${n} fact`),!Number.isFinite(Number(r.asOf))||t&&Number(r.asOf)<Number(t.asOf))throw new Error(`trade event ${n} asOf must be finite and monotonic`);if(r.tradeId!==e.tradeId||r.previousHash!==t?.hash&&n>0)throw new Error(`trade event ${n} chain mismatch`);if(n===0&&(r.state!=="intent"||r.previousHash!==null))throw new Error("trade lifecycle must start with intent");if(t&&!Ul[t.state]?.includes(r.state))throw new Error(`invalid recorded transition ${t.state} -> ${r.state}`);if(tw.has(r.state)&&r.external!==!0)throw new Error(`${r.state} is not externally supplied`);t=r}if(e.state!==t.state||e.headHash!==t.hash)throw new Error("trade lifecycle head mismatch");return!0}var sN=ow,aN=Dl;function cN(e){return Array.isArray(e)?e.map((t,n)=>typeof t=="function"?{id:t.name||`provider-${n}`,health:t}:t):Object.entries(e||{}).map(([t,n])=>({id:t,health:typeof n=="function"?n:n?.health}))}async function lN(e,t){let n;try{let r=new Promise((i,s)=>{n=setTimeout(()=>s(Object.assign(new Error(`health timeout after ${t}ms`),{code:"TIMEOUT"})),t)});return{detail:await Promise.race([Promise.resolve().then(()=>e.health()),r]),transportOk:!0}}catch(r){return{error:r?.message||String(r),timedOut:r?.code==="TIMEOUT",transportOk:!1}}finally{clearTimeout(n)}}function ns(e,t,n,r,o=!1){let i=Number(e??t);if(!Number.isFinite(i)||i<r||o&&!Number.isInteger(i)){let s=o?"a positive integer":r===Number.NEGATIVE_INFINITY?"finite":r===0?"a nonnegative finite number":"a positive finite number";throw new TypeError(`${n} must be ${s}`)}return i}async function Fl(e,t={}){let n=cN(e),r=ns(t.concurrency,4,"concurrency",1,!0),o=ns(t.timeoutMs,5e3,"timeoutMs",Number.EPSILON),i=ns(t.asOf,Date.now(),"asOf",Number.NEGATIVE_INFINITY),s=ns(t.ttlMs,6e4,"ttlMs",0),a=new Array(n.length),c=0;async function l(){for(;c<n.length;){let d=c++,p=n[d];if(!p?.id||typeof p.health!="function"){a[d]={id:p?.id??`provider-${d}`,ok:!1,state:"error",stale:!1,asOf:i,ttlMs:s,error:"health function is required"};continue}let m=await lN(p,o),f=Number(m.detail?.asOf??m.detail?.updatedAt??i),h=m.transportOk&&i-f>s,g=!(m.detail&&typeof m.detail=="object"&&m.detail.ok===!1),b=m.transportOk&&g&&!h;a[d]={id:String(p.id),ok:b,state:m.timedOut?"timeout":!m.transportOk||!g?"error":h?"stale":"fresh",stale:h,asOf:f,checkedAsOf:i,ttlMs:s,...m.detail===void 0?{}:{detail:m.detail},...m.error?{error:m.error}:{}}}}await Promise.all(Array.from({length:Math.min(r,Math.max(1,n.length))},l));let u={fresh:0,stale:0,error:0,timeout:0};for(let d of a)u[d.state]+=1;return{ok:a.every(d=>d.ok),asOf:i,ttlMs:s,timeoutMs:o,counts:u,providers:a}}var uN=Fl,dN=Fl;import{createHash as pN}from"node:crypto";var ql=1,fw=/^[a-z0-9][a-z0-9._-]{0,63}$/,hw=/^[A-Za-z0-9][A-Za-z0-9._-]{0,63}$/,mN=new Set(["open","high","low","close","volume","fundingRate","openInterest"]),fN=new Set(["sma","ema","rsi","macd","bollinger","atr"]),hN=new Set(["gt","gte","lt","lte","eq"]),gN=new Set(["and","or","not"]),yN=new Set(["above","below"]),bN=new Set(["line","signal","histogram"]),wN=new Set(["upper","middle","lower"]),Hl=new Set(["compare","logic","cross"]),iw=new Set(["version","id","name","venue","market","parameters","nodes","rules","risk"]),sw=new Set(["value","min","max","step"]),jl=new Set(["entryLong","entryShort","exitLong","exitShort"]),aw=new Set(["maxLeverage","maxNotionalUsd","positionSizePct","stopLossPct","takeProfitPct","cooldownBars","maxDailyLossPct","expiresAt"]),xN=new Set(["id","type"]),cw={input:new Set(["id","type","field"]),constant:new Set(["id","type","value"]),indicator:new Set(["id","type","indicator","input","period","fastPeriod","slowPeriod","signalPeriod","stdDev","output"]),compare:new Set(["id","type","op","left","right"]),logic:new Set(["id","type","op","inputs"]),cross:new Set(["id","type","direction","left","right"])},lw=16,uw=128,dw=100,Bn=class extends Error{constructor(t){let n=t.map(r=>`${r.path}: ${r.message}`);super(`invalid strategy (${t.length} error${t.length===1?"":"s"}): ${n.join("; ")}`),this.name="StrategyValidationError",this.errors=t}};function _e(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function Z(e){return typeof e=="number"&&Number.isFinite(e)}function pw(e){return Number.isInteger(e)&&e>0}function zl(e){if(e==null||typeof e!="object"||Object.isFrozen(e))return e;if(Array.isArray(e)){for(let t of e)zl(t);return Object.freeze(e)}for(let t of Object.keys(e))zl(e[t]);return Object.freeze(e)}function Wl(e){if(Array.isArray(e))return e.map(Wl);if(e!=null&&typeof e=="object"){let t={};for(let n of Object.keys(e).sort())t[n]=Wl(e[n]);return t}return e}function A(e,t,n){e.push({path:t,message:n})}function It(e,t,n,r){for(let o of Object.keys(e))t.has(o)||A(r,n?`${n}.${o}`:o,"unknown field is not allowed")}function gw(e,t,n,r){if(!Z(e)||!Z(t)||!Z(n)||!Z(r)||r<=0||e<t||e>n)return!1;let o=(e-t)/r;if(!Number.isFinite(o))return!1;let i=Math.round(o);return Math.abs(o-i)<=1e-9}function Vl(e,t,n,r){if(_e(e)){if(It(e,new Set(["param"]),t,r),typeof e.param!="string"||!e.param)return A(r,`${t}.param`,"must be a parameter name string"),null;if(!Object.prototype.hasOwnProperty.call(n,e.param))return A(r,`${t}.param`,`unknown parameter "${e.param}"`),null;let o=n[e.param];return!_e(o)||![o.value,o.min,o.max,o.step].every(pw)?(A(r,`${t}.param`,"referenced period parameter value min max and step must be positive integers"),null):{param:e.param}}return pw(e)?e:(A(r,t,"must be a positive integer or {param}"),null)}function mw(e,t,n,r){return _e(e)?(It(e,new Set(["param"]),t,r),typeof e.param!="string"||!e.param?(A(r,`${t}.param`,"must be a parameter name string"),null):Object.prototype.hasOwnProperty.call(n,e.param)?{param:e.param}:(A(r,`${t}.param`,`unknown parameter "${e.param}"`),null)):Z(e)?e:(A(r,t,"must be a finite number or {param}"),null)}function rs(e){switch(e.type){case"input":case"constant":return[];case"indicator":return e.input?[e.input]:[];case"compare":case"cross":return[e.left,e.right].filter(Boolean);case"logic":return Array.isArray(e.inputs)?[...e.inputs]:[];default:return[]}}function SN(e){let t=new Map,n=r=>{let o=t.get(r)||0;if(o===1)return!0;if(o===2)return!1;t.set(r,1);let i=e.get(r);if(i){for(let s of rs(i))if(e.has(s)&&n(s))return!0}return t.set(r,2),!1};for(let r of e.keys())if(n(r))return!0;return!1}function kN(e,t){if(!_e(e))return A(t,"parameters","must be a plain object"),null;let n=Object.keys(e);if(n.length>lw)return A(t,"parameters",`too many parameters (max ${lw})`),null;let r={};for(let o of n){if(!fw.test(o)){A(t,`parameters.${o}`,"parameter name is malformed");continue}let i=e[o],s=`parameters.${o}`;if(!_e(i)){A(t,s,"must be a plain object");continue}It(i,sw,s,t);for(let d of sw)d in i||A(t,`${s}.${d}`,"required field is missing");let{value:a,min:c,max:l,step:u}=i;Z(c)||A(t,`${s}.min`,"must be a finite number"),Z(l)||A(t,`${s}.max`,"must be a finite number"),(!Z(u)||u<=0)&&A(t,`${s}.step`,"must be a positive finite number"),Z(a)||A(t,`${s}.value`,"must be a finite number"),Z(c)&&Z(l)&&c>l&&A(t,`${s}.min`,"min must be <= max"),Z(a)&&Z(c)&&Z(l)&&Z(u)&&u>0&&(gw(a,c,l,u)||A(t,`${s}.value`,"value must lie on the declared min/max/step grid")),r[o]={value:a,min:c,max:l,step:u}}return r}function EN(e,t,n,r){let o=`nodes.${t}`;if(!_e(e))return A(r,o,"must be a plain object"),null;if(typeof e.type!="string"||!cw[e.type])return A(r,`${o}.type`,"unknown or missing node type"),It(e,xN,o,r),null;switch(It(e,cw[e.type],o,r),(typeof e.id!="string"||!hw.test(e.id))&&A(r,`${o}.id`,"must be a 1-64 char id starting with alphanumeric"),e.type){case"input":return(typeof e.field!="string"||!mN.has(e.field))&&A(r,`${o}.field`,"must be one of open|high|low|close|volume|fundingRate|openInterest"),{id:e.id,type:"input",field:e.field};case"constant":{let i=mw(e.value,`${o}.value`,n,r);return{id:e.id,type:"constant",value:i}}case"indicator":{(typeof e.indicator!="string"||!fN.has(e.indicator))&&A(r,`${o}.indicator`,"must be one of sma|ema|rsi|macd|bollinger|atr");let i=e.indicator,s={id:e.id,type:"indicator",indicator:i};if(i==="atr"){"input"in e&&(typeof e.input!="string"||!e.input?A(r,`${o}.input`,"must be a node id string when provided"):s.input=e.input);let a=Vl(e.period,`${o}.period`,n,r);a!=null&&(s.period=a)}else typeof e.input!="string"||!e.input?A(r,`${o}.input`,"must be a node id string"):s.input=e.input;if((i==="sma"||i==="ema"||i==="rsi"||i==="bollinger"||i==="atr")&&("period"in e,i!=="macd"))if(!("period"in e))A(r,`${o}.period`,"required field is missing");else{let a=Vl(e.period,`${o}.period`,n,r);a!=null&&(s.period=a)}if(i==="macd"){for(let a of["fastPeriod","slowPeriod","signalPeriod"])if(!(a in e))A(r,`${o}.${a}`,"required field is missing");else{let c=Vl(e[a],`${o}.${a}`,n,r);c!=null&&(s[a]=c)}"output"in e?bN.has(e.output)?s.output=e.output:A(r,`${o}.output`,"must be line|signal|histogram"):A(r,`${o}.output`,"required field is missing"),"period"in e&&A(r,`${o}.period`,"forbidden for macd"),"stdDev"in e&&A(r,`${o}.stdDev`,"forbidden for macd")}else if(i==="bollinger"){if(!("stdDev"in e))A(r,`${o}.stdDev`,"required field is missing");else{let a=mw(e.stdDev,`${o}.stdDev`,n,r);a!=null&&(typeof a=="number"&&a<=0?A(r,`${o}.stdDev`,"must be > 0"):s.stdDev=a)}"output"in e?wN.has(e.output)?s.output=e.output:A(r,`${o}.output`,"must be upper|middle|lower"):A(r,`${o}.output`,"required field is missing");for(let a of["fastPeriod","slowPeriod","signalPeriod"])a in e&&A(r,`${o}.${a}`,`forbidden for ${i}`)}else{"output"in e&&A(r,`${o}.output`,`forbidden for ${i}`),"stdDev"in e&&i!=="bollinger"&&A(r,`${o}.stdDev`,`forbidden for ${i}`);for(let a of["fastPeriod","slowPeriod","signalPeriod"])a in e&&A(r,`${o}.${a}`,`forbidden for ${i}`)}return s}case"compare":return(typeof e.op!="string"||!hN.has(e.op))&&A(r,`${o}.op`,"must be gt|gte|lt|lte|eq"),(typeof e.left!="string"||!e.left)&&A(r,`${o}.left`,"must be a node id"),(typeof e.right!="string"||!e.right)&&A(r,`${o}.right`,"must be a node id"),{id:e.id,type:"compare",op:e.op,left:e.left,right:e.right};case"logic":{if((typeof e.op!="string"||!gN.has(e.op))&&A(r,`${o}.op`,"must be and|or|not"),!Array.isArray(e.inputs))return A(r,`${o}.inputs`,"must be an array of node ids"),{id:e.id,type:"logic",op:e.op,inputs:[]};let i=[];for(let s=0;s<e.inputs.length;s++){let a=e.inputs[s];typeof a!="string"||!a?A(r,`${o}.inputs.${s}`,"must be a node id"):i.push(a)}return e.op==="not"?i.length!==1&&A(r,`${o}.inputs`,"not requires exactly one input"):(e.op==="and"||e.op==="or")&&i.length<2&&A(r,`${o}.inputs`,`${e.op} requires at least two inputs`),{id:e.id,type:"logic",op:e.op,inputs:i}}case"cross":return(typeof e.direction!="string"||!yN.has(e.direction))&&A(r,`${o}.direction`,"must be above|below"),(typeof e.left!="string"||!e.left)&&A(r,`${o}.left`,"must be a node id"),(typeof e.right!="string"||!e.right)&&A(r,`${o}.right`,"must be a node id"),{id:e.id,type:"cross",direction:e.direction,left:e.left,right:e.right};default:return null}}function vN(e,t,n){if(!_e(e))return A(t,"risk","must be a plain object"),null;It(e,aw,"risk",t);for(let p of aw)(!(p in e)||e[p]==null)&&A(t,`risk.${p}`,"required field is missing");let r={},o=e.maxLeverage;!Z(o)||o<=0||o>50?A(t,"risk.maxLeverage","must be a number > 0 and <= 50"):r.maxLeverage=o;let i=e.maxNotionalUsd;!Z(i)||i<=0?A(t,"risk.maxNotionalUsd","must be a number > 0"):r.maxNotionalUsd=i;let s=e.positionSizePct;!Z(s)||s<=0||s>100?A(t,"risk.positionSizePct","must be a number > 0 and <= 100"):r.positionSizePct=s;let a=e.stopLossPct;!Z(a)||a<=0||a>100?A(t,"risk.stopLossPct","must be a number > 0 and <= 100"):r.stopLossPct=a;let c=e.takeProfitPct;!Z(c)||c<=0||c>1e3?A(t,"risk.takeProfitPct","must be a number > 0 and <= 1000"):r.takeProfitPct=c;let l=e.cooldownBars;!Number.isInteger(l)||l<0||l>1e5?A(t,"risk.cooldownBars","must be an integer >= 0 and <= 100000"):r.cooldownBars=l;let u=e.maxDailyLossPct;!Z(u)||u<=0||u>100?A(t,"risk.maxDailyLossPct","must be a number > 0 and <= 100"):r.maxDailyLossPct=u;let d=e.expiresAt;return!Number.isInteger(d)||d<=0?A(t,"risk.expiresAt","must be an integer epoch milliseconds > 0"):(n.nowMs!==void 0&&(Number.isInteger(n.nowMs)?d<=n.nowMs&&A(t,"risk.expiresAt","must be strictly greater than nowMs"):A(t,"nowMs","must be an integer epoch milliseconds")),r.expiresAt=d),r}function AN(e,t={}){let n=[];if(!_e(e))return A(n,"","strategy must be a plain object"),{ok:!1,errors:n,strategy:null};It(e,iw,"",n);for(let d of iw)(!(d in e)||e[d]==null)&&A(n,d,"required field is missing");e.version!==ql&&A(n,"version",`must be ${ql}`),(typeof e.id!="string"||!fw.test(e.id))&&A(n,"id","must match /^[a-z0-9][a-z0-9._-]{0,63}$/"),(typeof e.name!="string"||e.name.length===0||e.name.length>dw)&&A(n,"name",`must be a non-empty string max ${dw}`);let r=os(e.venue);r||A(n,"venue",`unknown strategy venue "${String(e.venue)}"`);let o=null;if(!r)_e(e.market)||A(n,"market","must be a plain object");else{let d=r.validateMarket(e.market);if(!d||typeof d.ok!="boolean"||!Array.isArray(d.errors))A(n,"market",`venue ${r.id} returned an invalid market validation result`);else if(d.ok)o=d.market;else for(let p of d.errors)A(n,p.path,p.message)}let i=kN(e.parameters,n),s=null,a=new Map;if(!Array.isArray(e.nodes))A(n,"nodes","must be an array");else if(e.nodes.length>uw)A(n,"nodes",`too many nodes (max ${uw})`);else{s=[];for(let d=0;d<e.nodes.length;d++){let p=EN(e.nodes[d],d,i||{},n);p&&(typeof p.id=="string"&&hw.test(p.id)&&(a.has(p.id)?A(n,`nodes.${d}.id`,`duplicate node id "${p.id}"`):a.set(p.id,p)),s.push(p))}for(let d=0;d<s.length;d++){let p=s[d],m=`nodes.${d}`;for(let f of rs(p))a.has(f)||A(n,m,`unknown node ref "${f}"`);if(p.type==="indicator"||p.type==="compare"||p.type==="cross")for(let f of rs(p)){let h=a.get(f);h&&Hl.has(h.type)&&A(n,m,`node ref "${f}" must be numeric`)}if(p.type==="logic")for(let f of rs(p)){let h=a.get(f);h&&!Hl.has(h.type)&&A(n,m,`node ref "${f}" must be boolean`)}}SN(a)&&A(n,"nodes","graph contains a cycle")}let c=null;if(!_e(e.rules))A(n,"rules","must be a plain object");else{It(e.rules,jl,"rules",n);for(let d of jl)d in e.rules||A(n,`rules.${d}`,"required field is missing");c={};for(let d of jl){let p=e.rules[d];if(p===null){c[d]=null;continue}if(typeof p!="string"||!p){A(n,`rules.${d}`,"must be a node id or null"),c[d]=p;continue}if(!a.has(p)){A(n,`rules.${d}`,`unknown node ref "${p}"`),c[d]=p;continue}let m=a.get(p);Hl.has(m.type)||A(n,`rules.${d}`,`rule must reference a boolean node, not ${m.type}`),c[d]=p}}let l=vN(e.risk,n,t);if(n.length)return{ok:!1,errors:n,strategy:null};let u=zl({version:ql,id:e.id,name:e.name,venue:r.id,market:o,parameters:i,nodes:s,rules:c,risk:l});return{ok:!0,errors:[],strategy:u}}function tt(e,t={}){let n=AN(e,t);if(!n.ok)throw new Bn(n.errors);return n.strategy}function IN(e){let t=tt(e);return JSON.stringify(Wl(t))}function Gl(e){let t=IN(e);return pN("sha256").update(t,"utf8").digest("hex")}function yw(e,t){if(!_e(e))throw new Bn([{path:"",message:"strategy must be a plain object"}]);if(!_e(t))throw new Bn([{path:"overrides",message:"must be a plain object"}]);let n=tt(e),r={};for(let[i,s]of Object.entries(n.parameters))r[i]={value:s.value,min:s.min,max:s.max,step:s.step};let o=[];for(let[i,s]of Object.entries(t)){if(!Object.prototype.hasOwnProperty.call(r,i)){A(o,i,`unknown parameter "${i}"`);continue}let a=r[i];if(!Z(s)){A(o,i,"override must be a finite number");continue}if(!gw(s,a.min,a.max,a.step)){A(o,i,"override must lie on the declared min/max/step grid");continue}r[i]={...a,value:s}}if(o.length)throw new Bn(o);return tt({version:n.version,id:n.id,name:n.name,venue:n.venue,market:{coin:n.market.coin,interval:n.market.interval},parameters:r,nodes:n.nodes.map(i=>{let s={...i};return Array.isArray(i.inputs)&&(s.inputs=[...i.inputs]),s}),rules:{...n.rules},risk:{...n.risk}})}function Kr(e){if(!Array.isArray(e))throw new TypeError("values must be an array");for(let t=0;t<e.length;t++){let n=e[t];if(typeof n!="number"||!Number.isFinite(n))throw new TypeError(`values[${t}] must be a finite number`)}}function _t(e){if(!Number.isInteger(e)||e<=0)throw new TypeError("period must be a positive integer")}function _N(e){if(!Array.isArray(e))throw new TypeError("bars must be an array");for(let t=0;t<e.length;t++){let n=e[t];if(n==null||typeof n!="object")throw new TypeError(`bars[${t}] must be an object`);for(let r of["o","h","l","c"]){let o=n[r];if(typeof o!="number"||!Number.isFinite(o))throw new TypeError(`bars[${t}].${r} must be a finite number`)}if(n.h<n.l)throw new TypeError(`bars[${t}] high must be >= low`)}}function ww(e,t){Kr(e),_t(t);let n=new Array(e.length).fill(null);if(e.length<t)return n;let r=0;for(let o=0;o<e.length;o++)r+=e[o],o>=t&&(r-=e[o-t]),o>=t-1&&(n[o]=r/t);return n}function is(e,t){Kr(e),_t(t);let n=new Array(e.length).fill(null);if(e.length<t)return n;let r=0;for(let s=0;s<t;s++)r+=e[s];let o=r/t;n[t-1]=o;let i=2/(t+1);for(let s=t;s<e.length;s++)o=i*e[s]+(1-i)*o,n[s]=o;return n}function xw(e,t){Kr(e),_t(t);let n=new Array(e.length).fill(null);if(e.length<=t)return n;let r=0,o=0;for(let a=1;a<=t;a++){let c=e[a]-e[a-1];c>=0?r+=c:o-=c}let i=r/t,s=o/t;n[t]=bw(i,s);for(let a=t+1;a<e.length;a++){let c=e[a]-e[a-1],l=c>0?c:0,u=c<0?-c:0;i=(i*(t-1)+l)/t,s=(s*(t-1)+u)/t,n[a]=bw(i,s)}return n}function bw(e,t){return e===0&&t===0?50:t===0?100:e===0?0:100-100/(1+e/t)}function Sw(e,t={}){Kr(e);let n=t.fastPeriod,r=t.slowPeriod,o=t.signalPeriod;if(_t(n),_t(r),_t(o),n>=r)throw new TypeError("fastPeriod must be < slowPeriod");let i=is(e,n),s=is(e,r),a=new Array(e.length).fill(null);for(let d=0;d<e.length;d++)i[d]!=null&&s[d]!=null&&(a[d]=i[d]-s[d]);let c=new Array(e.length).fill(null),l=new Array(e.length).fill(null),u=[];for(let d=0;d<a.length;d++)a[d]!=null&&u.push(d);if(u.length>=o){let d=0;for(let h=0;h<o;h++)d+=a[u[h]];let p=d/o,m=u[o-1];c[m]=p,l[m]=a[m]-p;let f=2/(o+1);for(let h=o;h<u.length;h++){let g=u[h];p=f*a[g]+(1-f)*p,c[g]=p,l[g]=a[g]-p}}return{line:a,signal:c,histogram:l}}function kw(e,t={}){Kr(e);let n=t.period,r=t.stdDev;if(_t(n),typeof r!="number"||!Number.isFinite(r)||r<=0)throw new TypeError("stdDev must be a finite number > 0");let o=new Array(e.length).fill(null),i=new Array(e.length).fill(null),s=new Array(e.length).fill(null);if(e.length<n)return{upper:i,middle:o,lower:s};let a=0,c=0;for(let l=0;l<e.length;l++){let u=e[l];if(a+=u,c+=u*u,l>=n){let d=e[l-n];a-=d,c-=d*d}if(l>=n-1){let d=a/n,p=c/n-d*d;p<0&&p>-1e-12&&(p=0);let m=Math.sqrt(p);o[l]=d,i[l]=d+r*m,s[l]=d-r*m}}return{upper:i,middle:o,lower:s}}function Ew(e,t){_N(e),_t(t);let n=new Array(e.length).fill(null);if(e.length<t)return n;let r=new Array(e.length);for(let s=0;s<e.length;s++){let a=e[s];if(s===0)r[s]=a.h-a.l;else{let c=e[s-1].c;r[s]=Math.max(a.h-a.l,Math.abs(a.h-c),Math.abs(a.l-c))}}let o=0;for(let s=0;s<t;s++)o+=r[s];let i=o/t;n[t-1]=i;for(let s=t;s<e.length;s++)i=(i*(t-1)+r[s])/t,n[s]=i;return n}import{createHash as PN}from"node:crypto";var Kl=2,CN="93f9c998260e73756c13871dc1a84dd6cdb26ec6113bd1941f023519939db440",TN="68f5b412a9975f04024cf9b9b6209b4bccedd52f176e95f34f786b3f53479c6a",NN="f197a38ff1c0f4ebe13326db8cbb8167ea3dd5d62e6033fe97c2fee8d23d96b5",vw=PN("sha256").update(JSON.stringify({version:Kl,compilerSourceHash:CN,indicatorsSourceHash:TN,schemaSourceHash:NN})).digest("hex");var ss=Kl,Yl=vw,ON=Object.freeze({open:"o",high:"h",low:"l",close:"c",volume:"v",fundingRate:"fundingRate",openInterest:"openInterest"}),RN=Object.freeze({"1m":6e4,"3m":18e4,"5m":3e5,"15m":9e5,"30m":18e5,"1h":36e5,"2h":72e5,"4h":144e5,"8h":288e5,"12h":432e5,"1d":864e5});function De(e){return typeof e=="number"&&Number.isFinite(e)}function $N(e){let t=new Map(e.map(a=>[a.id,a])),n=a=>{switch(a.type){case"indicator":return a.input?[a.input]:[];case"compare":case"cross":return[a.left,a.right];case"logic":return[...a.inputs];default:return[]}},r=new Map,o=new Map;for(let a of e)r.set(a.id,0),o.set(a.id,[]);for(let a of e)for(let c of n(a))t.has(c)&&(o.get(c).push(a.id),r.set(a.id,r.get(a.id)+1));let i=[];for(let[a,c]of r)c===0&&i.push(a);let s=[];for(;i.length;){let a=i.shift();s.push(a);for(let c of o.get(a))r.set(c,r.get(c)-1),r.get(c)===0&&i.push(c)}if(s.length!==e.length)throw new Error("strategy graph is cyclic");return s}function Dn(e,t){return e!=null&&typeof e=="object"&&"param"in e?t[e.param].value:e}function LN(e,t,n){if(!Array.isArray(e)||e.length===0)throw new TypeError("bars must be a non-empty array");if(!Number.isInteger(t)||t<0||t>=e.length)throw new RangeError("index out of range");let r=null;for(let o=0;o<=t;o++){let i=e[o];if(i==null||typeof i!="object"||Array.isArray(i))throw new TypeError(`bars[${o}] must be an object`);let{t:s,o:a,h:c,l,c:u,v:d}=i;if(!De(s)&&(typeof s=="number"&&Number.isFinite(s)),!Number.isFinite(s))throw new TypeError(`bars[${o}].t must be finite`);for(let[p,m]of[["o",a],["h",c],["l",l],["c",u],["v",d]])if(!De(m))throw new TypeError(`bars[${o}].${p} must be a finite number`);for(let[p,m]of[["o",a],["h",c],["l",l],["c",u]])if(!(m>0))throw new TypeError(`bars[${o}].${p} price must be positive`);if(d<0)throw new TypeError(`bars[${o}].v volume must be non-negative`);if(c<Math.max(a,u,l))throw new TypeError(`bars[${o}] high must be >= max(open, close, low)`);if(l>Math.min(a,u,c))throw new TypeError(`bars[${o}] low must be <= min(open, close, high)`);if(r!=null){if(!(s>r))throw new TypeError("bars t must be strictly increasing");if(s-r!==RN[n])throw new TypeError(`bars t must match ${n} cadence`)}if(r=s,"fundingRate"in i&&i.fundingRate!=null&&!De(i.fundingRate))throw new TypeError(`bars[${o}].fundingRate must be finite when present`);if("openInterest"in i&&i.openInterest!=null){if(!De(i.openInterest))throw new TypeError(`bars[${o}].openInterest must be finite when present`);if(i.openInterest<0)throw new TypeError(`bars[${o}].openInterest must be non-negative`)}}}function Yt(e,t,n,r,o,i){if(i.has(e))return i.get(e);let s=t.get(e),a;switch(s.type){case"input":{let c=ON[s.field];a=new Array(o+1);for(let l=0;l<=o;l++){let u=r[l][c];a[l]=u===void 0?null:u}break}case"constant":{let c=Dn(s.value,n);a=new Array(o+1).fill(c);break}case"indicator":{let c=s.period!=null?Dn(s.period,n):void 0;if(s.indicator==="atr"){let d=[];for(let p=0;p<=o;p++){let m=r[p];d.push({o:m.o,h:m.h,l:m.l,c:m.c})}a=Ew(d,c);break}let u=Yt(s.input,t,n,r,o,i).map((d,p)=>{if(d==null||!De(d))throw new TypeError(`indicator input ${s.input} has non-finite value at ${p}`);return d});if(s.indicator==="sma")a=ww(u,c);else if(s.indicator==="ema")a=is(u,c);else if(s.indicator==="rsi")a=xw(u,c);else if(s.indicator==="macd")a=Sw(u,{fastPeriod:Dn(s.fastPeriod,n),slowPeriod:Dn(s.slowPeriod,n),signalPeriod:Dn(s.signalPeriod,n)})[s.output];else if(s.indicator==="bollinger")a=kw(u,{period:c,stdDev:Dn(s.stdDev,n)})[s.output];else throw new Error(`unsupported indicator ${s.indicator}`);break}case"compare":{let c=Yt(s.left,t,n,r,o,i),l=Yt(s.right,t,n,r,o,i);a=new Array(o+1);for(let u=0;u<=o;u++){let d=c[u],p=l[u];if(d==null||p==null||!De(d)||!De(p)){a[u]=!1;continue}switch(s.op){case"gt":a[u]=d>p;break;case"gte":a[u]=d>=p;break;case"lt":a[u]=d<p;break;case"lte":a[u]=d<=p;break;case"eq":a[u]=d===p;break;default:a[u]=!1}}break}case"logic":{let c=s.inputs.map(l=>Yt(l,t,n,r,o,i));a=new Array(o+1);for(let l=0;l<=o;l++)if(s.op==="not"){let u=c[0][l];a[l]=u===!0?!1:u===!1}else if(s.op==="and"){let u=!0;for(let d of c)if(d[l]!==!0){u=!1;break}a[l]=u}else if(s.op==="or"){let u=!1;for(let d of c)if(d[l]===!0){u=!0;break}a[l]=u}else a[l]=!1;break}case"cross":{let c=Yt(s.left,t,n,r,o,i),l=Yt(s.right,t,n,r,o,i);a=new Array(o+1),a[0]=!1;for(let u=1;u<=o;u++){let d=c[u-1],p=l[u-1],m=c[u],f=l[u];if(d==null||p==null||m==null||f==null||!De(d)||!De(p)||!De(m)||!De(f)){a[u]=!1;continue}s.direction==="above"?a[u]=d<=p&&m>f:a[u]=d>=p&&m<f}break}default:throw new Error(`unknown node type ${s.type}`)}return i.set(e,a),a}function Xl(e,t={}){let n=tt(e);t&&Object.keys(t).length&&(n=yw(n,t));let r=new Map(n.nodes.map(m=>[m.id,m])),o=Object.freeze($N(n.nodes)),i=n.parameters,s=new Set(n.nodes.filter(m=>m.type==="input").map(m=>m.field));if(n.nodes.some(m=>m.type==="indicator"&&m.indicator==="atr"))for(let m of["open","high","low","close"])s.add(m);let a=Object.freeze([...s].sort()),c=Gl(n);function l(m,f){let h={};for(let b of o){let k=m.get(b);h[b]=k[f]}let g=b=>b!=null&&h[b]===!0;return{values:h,signals:{entryLong:g(n.rules.entryLong),entryShort:g(n.rules.entryShort),exitLong:g(n.rules.exitLong),exitShort:g(n.rules.exitShort)}}}function u(m,f){LN(m,f,n.market.interval);let h=new Map;for(let g of o)Yt(g,r,i,m,f,h);return h}function d(m,f){return l(u(m,f),f)}function p(m){if(!Array.isArray(m)||m.length===0)throw new TypeError("bars must be a non-empty array");let f=m.length-1,h=u(m,f);return Object.freeze(m.map((g,b)=>Object.freeze(l(h,b))))}return Object.freeze({strategy:n,strategyHash:c,compilerVersion:ss,compilerHash:Yl,requiredSeries:a,nodeOrder:o,evaluate:d,evaluateAll:p})}import{createHash as MN}from"node:crypto";var R3=Object.freeze({initialEquityUsd:1e4,takerFeeBps:3.5,builderFeeBps:2,slippageBps:2,latencyBars:1,maxVolumeParticipationPct:100});var UN=Object.freeze(["fail","pass_paper_only","pass_live_eligible"]);function Pt(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function Yr(e){return typeof e=="number"&&Number.isFinite(e)}function Fn(e){if(Array.isArray(e))return e.map(Fn);if(e!=null&&typeof e=="object"){let t={};for(let n of Object.keys(e).sort())t[n]=Fn(e[n]);return t}return e}function Aw(e){if(!Pt(e))throw new TypeError("evidence artifact must be a plain object");if(!UN.includes(e.status))throw new TypeError("evidence artifact status is invalid");for(let t of["strategyHash","compilerHash","barsHash"])if(typeof e[t]!="string"||!/^[0-9a-f]{64}$/.test(e[t]))throw new TypeError(`evidence artifact ${t} must be a sha256 hash`);if(!Pt(e.split))throw new TypeError("evidence artifact split required");if(!Array.isArray(e.flags))throw new TypeError("evidence artifact flags must be an array");if(!Pt(e.walkForward)||!Array.isArray(e.walkForward.windows))throw new TypeError("evidence artifact walkForward windows required");if(e.status==="pass_live_eligible"&&(!Pt(e.train)||!Pt(e.holdout)))throw new TypeError("live-eligible evidence artifact requires train and holdout facts");return Fn({barsHash:e.barsHash,compilerHash:e.compilerHash,flags:e.flags.map(t=>Fn(t)),holdout:e.holdout??null,split:e.split,status:e.status,strategyHash:e.strategyHash,train:e.train??null,walkForward:{passRate:e.walkForward.passRate,windowsRun:e.walkForward.windowsRun??e.walkForward.windows.length,windows:e.walkForward.windows.map(t=>({index:t.index,trainStartIndex:t.trainStartIndex,trainEndIndex:t.trainEndIndex,passed:t.passed,reason:t.reason,evalStartIndex:t.evalStartIndex,evalEndIndex:t.evalEndIndex,metrics:t.metrics}))}})}function BN(e){return MN("sha256").update(JSON.stringify(Aw(e)),"utf8").digest("hex")}function Fe(e,t,n=0){if(!Number.isInteger(e)||e<n)throw new Error(`${t} must be an integer >= ${n}`);return e}function Ql(e,t){if(!Pt(e)||!Pt(e.metrics))throw new Error(`${t} metrics required`);let n=Fe(e.tradeCount,`${t}.tradeCount`);if(e.metrics.tradeCount!==n)throw new Error(`${t} tradeCount contradicts metrics.tradeCount`);for(let r of["netPnlUsd","profitFactor","maxDrawdownPct"])if(!Yr(e.metrics[r]))throw new Error(`${t}.metrics.${r} must be finite`);if(e.metrics.maxDrawdownPct<0)throw new Error(`${t}.metrics.maxDrawdownPct must be >= 0`);return e.metrics}function DN(e,{maxDailyLossPct:t}={}){let n=e.split,r=Fe(n.trainStartIndex,"split.trainStartIndex"),o=Fe(n.trainEndIndex,"split.trainEndIndex"),i=Fe(n.trainBarCount,"split.trainBarCount",1),s=Fe(n.holdoutStartIndex,"split.holdoutStartIndex"),a=Fe(n.holdoutEndIndex,"split.holdoutEndIndex"),c=Fe(n.holdoutBarCount,"split.holdoutBarCount",1);if(r!==0||o-r+1!==i||s!==o+1||a-s+1!==c)throw new Error("evidence split must be contiguous, chronological, and count-consistent");if(!Yr(n.trainFraction)||n.trainFraction<=0||n.trainFraction>=1)throw new Error("split.trainFraction must be in (0,1)");Ql(e.train,"train");let l=Ql(e.holdout,"holdout");if(l.tradeCount<1||l.netPnlUsd<=0||l.profitFactor<=1)throw new Error("live-eligible holdout metrics do not pass");if(Yr(t)&&l.maxDrawdownPct>t)throw new Error("live-eligible holdout drawdown exceeds strategy risk");if(e.flags.length>0)throw new Error("live-eligible evidence cannot contain failure flags");let u=e.walkForward,d=u.windows;if(d.length<1||u.windowsRun!==d.length)throw new Error("live-eligible walk-forward windowsRun must match nonempty windows");let p=0,m=-1;for(let h=0;h<d.length;h++){let g=d[h];if(!Pt(g)||g.index!==h||typeof g.passed!="boolean")throw new Error("walk-forward windows must be ordered and structurally valid");let b=Fe(g.trainStartIndex,`walkForward.windows[${h}].trainStartIndex`),k=Fe(g.trainEndIndex,`walkForward.windows[${h}].trainEndIndex`),x=Fe(g.evalStartIndex,`walkForward.windows[${h}].evalStartIndex`),w=Fe(g.evalEndIndex,`walkForward.windows[${h}].evalEndIndex`);if(b!==0||k>=x||x>w||x<=m)throw new Error("walk-forward windows must be chronological and disjoint");if(m=w,g.passed){if(p+=1,g.reason!=="pass")throw new Error("passed walk-forward window reason must be pass");let v=Ql({metrics:g.metrics,tradeCount:g.metrics?.tradeCount},`walkForward.windows[${h}]`);if(v.tradeCount<1||v.netPnlUsd<=0||v.profitFactor<=1)throw new Error("passed walk-forward window metrics do not pass");if(Yr(t)&&v.maxDrawdownPct>t)throw new Error("passed walk-forward drawdown exceeds strategy risk")}else if(g.reason==="pass")throw new Error("failed walk-forward window cannot have pass reason")}let f=p/d.length;if(!Yr(u.passRate)||Math.abs(u.passRate-f)>Number.EPSILON||f<.6)throw new Error("walk-forward passRate contradicts concrete windows or is below live threshold")}function Iw(e,t={}){if(typeof e?.id!="string"||!/^[0-9a-f]{64}$/.test(e.id))throw new Error("evidence.id must be a sha256 evidence artifact hash");let n=Aw(e),r=Fn({id:e.id,...n});if(JSON.stringify(Fn(e))!==JSON.stringify(r))throw new Error("evidence artifact contains fields unbound from its deterministic identity");let o=BN(e);if(e.id!==o)throw new Error("evidence.id does not match its deterministic artifact facts digest");return e.status==="pass_live_eligible"&&DN(e,t),e}W();var FN=["privatekey","secretkey","seed","mnemonic","passphrase","password","keystore","keymaterial","apikey","authtoken","accesstoken","refreshtoken","credential","bearer","signature","authorization","xprv","xpriv","wif"];function Xr(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function qN(e){return String(e).toLowerCase().replace(/[^a-z0-9]/g,"")}function Zl(e,t="value"){if(Array.isArray(e)){e.forEach((n,r)=>Zl(n,`${t}[${r}]`));return}if(Xr(e))for(let[n,r]of Object.entries(e)){let o=qN(n);if(FN.some(i=>o.includes(i)))throw new Error(`handoff: forbidden secret-like field at ${t}.${n}`);Zl(r,`${t}.${n}`)}}function Jl(e){return typeof e=="number"&&Number.isFinite(e)&&e>0}function _w({strategy:e,evidence:t,shadow:n,caps:r,nowMs:o=Date.now(),env:i=process.env}={}){if(Zl({strategy:e,evidence:t,shadow:n,caps:r},"handoff"),!Xr(e))throw new Error("handoff: strategy required");if(!Xr(t))throw new Error("handoff: evidence required");if(!Xr(n))throw new Error("handoff: shadow required");if(!Xr(r))throw new Error("handoff: caps required");if(typeof n.id!="string"||!n.id.trim())throw new Error("handoff: shadow.id required");if(typeof n.stateHash!="string"||!/^[0-9a-f]{64}$/.test(n.stateHash))throw new Error("handoff: shadow.stateHash must be a sha256 hash");if(n.status!=="running")throw new Error("handoff: shadow.status must be running");if(!Number.isInteger(n.cursor)||n.cursor<=0)throw new Error("handoff: shadow.cursor must be a positive integer");if(!Number.isInteger(n.updatedAt)||n.updatedAt<=0||n.updatedAt>o)throw new Error("handoff: shadow.updatedAt must be a positive integer <= nowMs");let s=tt(e,{nowMs:o}),a=Xl(s);if(Iw(t,{maxDailyLossPct:s.risk.maxDailyLossPct}),t.status!=="pass_live_eligible")throw new Error("handoff: evidence.status must be pass_live_eligible");if(t.strategyHash!==a.strategyHash)throw new Error("handoff: evidence.strategyHash mismatch");if(t.compilerHash!==a.compilerHash)throw new Error("handoff: evidence.compilerHash mismatch");let c=["perStrategyNotionalUsd","maxLeverage","dailyLossCapUsd","chainAllowlist","assetAllowlist","expiresAt","killSwitchRequired"];for(let p of c)if(!(p in r)||r[p]==null)throw new Error(`handoff: caps.${p} required`);if(!Jl(r.perStrategyNotionalUsd))throw new Error("handoff: caps.perStrategyNotionalUsd must be positive");if(r.perStrategyNotionalUsd>a.strategy.risk.maxNotionalUsd)throw new Error("handoff: caps.perStrategyNotionalUsd exceeds strategy.risk.maxNotionalUsd");if(!Jl(r.maxLeverage))throw new Error("handoff: caps.maxLeverage must be positive");if(r.maxLeverage>a.strategy.risk.maxLeverage)throw new Error("handoff: caps.maxLeverage exceeds strategy.risk.maxLeverage");if(!Jl(r.dailyLossCapUsd))throw new Error("handoff: caps.dailyLossCapUsd must be positive");let l=a.strategy.risk.maxNotionalUsd*(a.strategy.risk.maxDailyLossPct/100);if(r.dailyLossCapUsd>l)throw new Error("handoff: caps.dailyLossCapUsd exceeds strategy daily loss ceiling");if(!Array.isArray(r.chainAllowlist)||r.chainAllowlist.length===0)throw new Error("handoff: caps.chainAllowlist must be a non-empty array");if(!r.chainAllowlist.every(p=>p==="hyperliquid"))throw new Error("handoff: caps.chainAllowlist must include only hyperliquid");if(!r.chainAllowlist.includes("hyperliquid"))throw new Error("handoff: caps.chainAllowlist must include hyperliquid");if(!Array.isArray(r.assetAllowlist)||r.assetAllowlist.length===0)throw new Error("handoff: caps.assetAllowlist must be a non-empty array");if(r.assetAllowlist.length!==1||r.assetAllowlist[0]!==a.strategy.market.coin)throw new Error("handoff: caps.assetAllowlist must contain only the strategy market coin");if(!Number.isInteger(r.expiresAt)||!(r.expiresAt>o))throw new Error("handoff: caps.expiresAt must be an integer > nowMs");if(r.expiresAt>a.strategy.risk.expiresAt)throw new Error("handoff: caps.expiresAt exceeds strategy.risk.expiresAt");if(r.killSwitchRequired!==!0)throw new Error("handoff: caps.killSwitchRequired must be exactly true");let u={perStrategyNotionalUsd:r.perStrategyNotionalUsd,maxLeverage:r.maxLeverage,dailyLossCapUsd:r.dailyLossCapUsd,chainAllowlist:[...r.chainAllowlist],assetAllowlist:[...r.assetAllowlist],expiresAt:r.expiresAt,killSwitchRequired:!0},d={strategyHash:a.strategyHash,compilerHash:a.compilerHash,evidence:JSON.parse(JSON.stringify(t)),shadow:{id:n.id,stateHash:n.stateHash,status:n.status,cursor:n.cursor,updatedAt:n.updatedAt},compiled:{strategyHash:a.strategyHash,compilerHash:a.compilerHash,compilerVersion:ss,venue:"hyperliquid",market:{coin:a.strategy.market.coin,kind:"perp",interval:a.strategy.market.interval},risk:{...a.strategy.risk},strategy:JSON.parse(JSON.stringify(a.strategy))},arming:{liveBroadcast:!1,requiresExplicitUserArm:!0,caps:u},requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,executionReady:!1};return O(d,{provider:"hl-strategy",kind:"strategy-live-handoff",env:i})}var HN=Object.freeze({"1m":6e4,"3m":18e4,"5m":3e5,"15m":9e5,"30m":18e5,"1h":36e5,"2h":72e5,"4h":144e5,"8h":288e5,"12h":432e5,"1d":864e5});function qn(e,t){let n=Number(e);if(!Number.isFinite(n))throw new TypeError(`${t} must be finite`);return n}function Hn(e,t){if(!Number.isSafeInteger(e)||e<0)throw new TypeError(`${t} must be a non-negative safe integer`);return e}function Qr(e){if(Array.isArray(e))for(let t of e)Qr(t);else if(e&&typeof e=="object")for(let t of Object.values(e))Qr(t);return Object.freeze(e)}function jN(e){let t=HN[e];if(!t)throw new TypeError(`unsupported strategy interval: ${e}`);return t}function VN(e,{endTime:t=Number.MAX_SAFE_INTEGER}={}){if(!Array.isArray(e))throw new TypeError("Hyperliquid candles must be an array");Hn(t,"endTime");let n=new Map;for(let r=0;r<e.length;r++){let o=e[r];if(!o||typeof o!="object"||Array.isArray(o))throw new TypeError(`candles[${r}] must be an object`);let i=Hn(Number(o.t),`candles[${r}].t`);if(Hn(Number(o.T),`candles[${r}].T`)>t)continue;let a={t:i,o:qn(o.o,`candles[${r}].o`),h:qn(o.h,`candles[${r}].h`),l:qn(o.l,`candles[${r}].l`),c:qn(o.c,`candles[${r}].c`),v:qn(o.v,`candles[${r}].v`)};if(a.h<Math.max(a.o,a.c,a.l))throw new TypeError(`candles[${r}].h is below another price`);if(a.l>Math.min(a.o,a.c,a.h))throw new TypeError(`candles[${r}].l is above another price`);if(a.v<0)throw new TypeError(`candles[${r}].v must be non-negative`);let c=n.get(i);if(c&&JSON.stringify(c)!==JSON.stringify(a))throw new TypeError(`conflicting duplicate candle at timestamp ${i}`);c||n.set(i,a)}return Qr([...n.values()].sort((r,o)=>r.t-o.t))}function zN(e,t){if(!Array.isArray(e))throw new TypeError("Hyperliquid funding history must be an array");let n=new Map;for(let r=0;r<e.length;r++){let o=e[r];if(!o||typeof o!="object"||Array.isArray(o))throw new TypeError(`funding[${r}] must be an object`);let i=Hn(Number(o.time),`funding[${r}].time`);i>t||n.set(i,{time:i,fundingRate:qn(o.fundingRate,`funding[${r}].fundingRate`)})}return[...n.values()].sort((r,o)=>r.time-o.time)}async function WN({coin:e,startTime:t,endTime:n},r){let o=[],i=Math.max(0,t-288e5),s=!1;for(let a=0;a<16&&i<=n;a++){let c=await Qu({coin:e,startTime:i,endTime:n},r);if(!Array.isArray(c))throw new TypeError("Hyperliquid funding history must be an array");o.push(...c);let l=i;for(let u of c){let d=Number(u?.time);Number.isSafeInteger(d)&&d>l&&(l=d)}if(c.length<500||l>=n){s=!0;break}if(l<=i)throw new Error("Hyperliquid funding history pagination did not advance");i=l+1}if(!s)throw new Error("strategy history exceeds the bounded funding history limit");return zN(o,n)}function GN(e,t,n){let r=0,o=null;return e.map(i=>{let s=i.t+n,a=0;for(;r<t.length&&t[r].time<s;){let c=t[r];o=c.fundingRate,c.time>=i.t&&(a+=c.fundingRate),r+=1}return o==null?{...i,fundingPaymentRate:a}:{...i,fundingRate:o,fundingPaymentRate:a}})}async function Pw(e,t={}){if(!e||typeof e!="object"||Array.isArray(e))throw new TypeError("strategy history input must be an object");let n=String(e.coin||"").trim().toUpperCase();if(!/^[A-Z0-9][A-Z0-9._-]{0,11}$/.test(n))throw new TypeError("coin must be an uppercase Hyperliquid asset id");let r=String(e.interval||"15m"),o=jN(r);if(e.endTime==null)throw new TypeError("endTime is required for deterministic history");let i=Hn(e.endTime,"endTime"),s=e.count==null?1500:e.count;if(!Number.isInteger(s)||s<20||s>5e3)throw new TypeError("count must be an integer from 20 to 5000");let a=e.startTime==null?Math.max(0,i-s*o):Hn(e.startTime,"startTime");if(a>=i)throw new TypeError("startTime must be before endTime");let[c,l]=await Promise.all([rn({coin:n,interval:r,startTime:a,endTime:i},t),WN({coin:n,startTime:a,endTime:i},t)]),u=VN(c,{endTime:i}),d=Qr(GN(u,l,o));return Qr({coin:n,interval:r,range:{startTime:a,endTime:i},bars:d})}var KN=new Set(["1m","3m","5m","15m","30m","1h","2h","4h","8h","12h","1d"]),YN=new Set(["coin","interval"]);function XN(e){let t=[];if(!e||typeof e!="object"||Array.isArray(e))return{ok:!1,errors:[{path:"market",message:"must be a plain object"}],market:null};for(let n of Object.keys(e))YN.has(n)||t.push({path:`market.${n}`,message:"unknown field is not allowed"});return(typeof e.coin!="string"||e.coin.length===0||e.coin.length>32)&&t.push({path:"market.coin",message:"must be a non-empty string max 32"}),(typeof e.interval!="string"||!KN.has(e.interval))&&t.push({path:"market.interval",message:"must be a supported interval"}),t.length?{ok:!1,errors:t,market:null}:{ok:!0,errors:[],market:{coin:e.coin,interval:e.interval}}}async function QN(e={}){let t=await ho(e);if(!t||!Array.isArray(t.universe))throw new TypeError("Hyperliquid market metadata must contain universe");return Object.freeze(t.universe.map((n,r)=>{if(!n||typeof n.name!="string"||!n.name)throw new TypeError(`Hyperliquid market metadata universe[${r}].name is invalid`);return n.name}))}var Cw=Object.freeze({id:"hyperliquid",validateMarket:XN,fetchBars:Pw,listMarkets:QN,prepareIntent(e){return _w(e)}});var JN=Object.freeze(["id","validateMarket","prepareIntent"]);function ZN(e){if(!e||typeof e!="object"||Array.isArray(e))throw new TypeError("strategy venue adapter must be an object");if(typeof e.id!="string"||!/^[a-z0-9][a-z0-9._-]{0,63}$/.test(e.id))throw new TypeError("strategy venue adapter id is malformed");for(let t of JN.slice(1))if(typeof e[t]!="function")throw new TypeError(`strategy venue adapter ${e.id} requires ${t}()`);for(let t of["fetchBars","listMarkets"])if(e[t]!=null&&typeof e[t]!="function")throw new TypeError(`strategy venue adapter ${e.id} ${t} must be a function`);return e}var Tw=[Cw].map(ZN),eO=new Map(Tw.map(e=>[e.id,e])),tO=Object.freeze([...Tw]);function os(e){return typeof e!="string"?null:eO.get(e)??null}function nO(e){let t=os(e);if(!t)throw new Error(`unknown strategy venue: ${String(e)}`);return t}var Nw=Object.freeze(["price","wallet","risk","execution","security","nft","governance","system"]),rO=new Set(Nw);function as(e){if(!rO.has(e))throw new TypeError(`Unknown watch category: ${String(e)}`);return e}function eu(e={}){let t=e.subscribedCategories??[];if(!Array.isArray(t))throw new TypeError("subscribedCategories must be an array");return t}function Ow(){return{subscribedCategories:[]}}function oO(e,t){as(t);let n=eu(e);return n.includes(t)?{...e,subscribedCategories:[...n]}:{...e,subscribedCategories:[...n,t]}}function iO(e,t){as(t);let n=eu(e);return{...e,subscribedCategories:n.filter(r=>r!==t)}}function sO({category:e,notify:t=!1,...n}={}){if(as(e),typeof t!="boolean")throw new TypeError("watch notify must be a boolean");return{...n,category:e,notify:t}}function aO(e,t){return!(!t||t.notify!==!0||t.category!==e.category||e.watchId!==void 0&&t.id!==e.watchId)}function Rw(e,t=Ow(),n){if(!e||typeof e!="object")throw new TypeError("alert must be an object");return as(e.category),eu(t).includes(e.category)?{deliver:!0,reason:"category-subscribed"}:aO(e,n)?{deliver:!0,reason:"watch-opt-in"}:{deliver:!1,reason:"not-subscribed"}}function cO(e,t,n){return Rw(e,t,n).deliver}var $w=Object.freeze(["wallet","pool","nft_floor","hl_flow","prediction_market"]),lO=Object.freeze({wallets:"wallet",smart_wallet:"wallet",pools:"pool",new_pool:"pool",nft:"nft_floor",nft_floors:"nft_floor",hyperliquid:"hl_flow",prediction:"prediction_market",prediction_markets:"prediction_market"}),ae=(e,t=0,n=1)=>Math.min(n,Math.max(t,e)),he=e=>Number.isFinite(Number(e))?Number(e):null,cs=e=>Math.round(e*1e4)/1e4;function Lw(e){let t=String(e?.type??e?.surface??e?.kind??"").toLowerCase();return lO[t]??t}function uO(e,t){return String(e?.id??e?.signalId??e?.asset??e?.market??e?.pool??e?.collection??`${Lw(e)}:${t}`)}function Pe(e,t,n,r=!0){!r||n===null||!Number.isFinite(n)||e.push({feature:t,value:cs(n)})}function dO(e,t){let n=he(e.repeatBuys??e.repeat_buys??e.buyCount),r=he(e.walletWinRate??e.winRate);Pe(t,"repeat_buys",n===null?null:ae((n-1)/4)*.38),Pe(t,"wallet_win_rate",r===null?null:(ae(r)-.5)*.5)}function pO(e,t){let n=he(e.ageHours??e.poolAgeHours),r=he(e.liquidityUsd??e.liquidity),o=e.liquidityLocked??e.locked;Pe(t,"pool_age",n===null?null:n<24?-.42:ae(n/720)*.12),Pe(t,"liquidity",r===null?null:(ae(Math.log10(Math.max(1,r))/7)-.5)*.28),Pe(t,"liquidity_lock",o==null?null:o?.12:-.28)}function mO(e,t){let n=he(e.floorChange??e.floorChangePct),r=he(e.sales??e.saleCount);Pe(t,"floor_change",n===null?null:ae(n,-1,1)*.35),Pe(t,"sales_depth",r===null?null:ae(r/50)*.18)}function fO(e,t){let n=he(e.flowImbalance??e.imbalance),r=he(e.fundingRate??e.funding);Pe(t,"flow_imbalance",n===null?null:ae(n,-1,1)*.42),Pe(t,"funding",r===null?null:-ae(r*100,-1,1)*.12)}function hO(e,t){let n=he(e.marketProbability??e.marketPrice??e.probability),r=he(e.fairProbability??e.referenceProbability??e.fairValue);Pe(t,"probability_mispricing",n===null||r===null?null:ae(r-n,-1,1)*.65);let o=he(e.liquidityUsd??e.liquidity);Pe(t,"market_liquidity",o===null?null:ae(Math.log10(Math.max(1,o))/6)*.12)}var gO=Object.freeze({wallet:dO,pool:pO,nft_floor:mO,hl_flow:fO,prediction_market:hO});function yO(e,t,n){let r=n.filter(i=>{let s=i?.signalId??i?.eventId??i?.id??i?.asset??i?.market;return s!=null&&String(s)===t});if(r.length===0)return null;let o=r.map(i=>he(i.return??i.markout??i.pnl??i.value)).filter(i=>i!==null);return o.length===0?null:o.reduce((i,s)=>i+s,0)/o.length}function tu(e=[],t=[],n={}){if(!Array.isArray(e)||!Array.isArray(t))throw new TypeError("events and markouts must be arrays");let r=ae(he(n.minimumCoverage)??.5);return e.map((o,i)=>{let s=Lw(o),a=uO(o,i),c=gO[s],l=[];c&&c(o,l);let u=s==="wallet"?2:s==="pool"?3:2,d=cs(ae(l.length/u)),p=l.reduce((x,w)=>x+w.value,0),m=yO(o,a,t),f=m===null?0:ae(m,-1,1)*.35;m!==null&&Pe(l,"shadow_markout",f);let h=cs(ae(.5+p+f)),g=m===null?.8:ae(.85+m*.3,.35,1),b=cs(ae(d*g)),k=["COLD_INTELLIGENCE_ONLY","NO_HOT_EXECUTION"];return c||k.push("UNSUPPORTED_SIGNAL_TYPE"),d<r&&k.push("LOW_COVERAGE","NO_TRADE"),b<.5&&k.push("LOW_CONFIDENCE","NO_TRADE"),s==="pool"&&(he(o.ageHours??o.poolAgeHours)??1/0)<24&&k.push("NEW_POOL_RISK","NO_TRADE"),m!==null&&m<0&&k.push("NEGATIVE_MARKOUT"),{id:a,type:s,score:h,confidence:b,coverage:d,contributions:l,flags:[...new Set(k)],noTrade:k.includes("NO_TRADE"),executionAllowed:!1}}).sort((o,i)=>i.score-o.score||i.confidence-o.confidence||o.id.localeCompare(i.id))}function Mw(e={}){return Object.freeze({score(t,n=[],r={}){return tu(t,n,{...e,...r})}})}import{mkdir as bO,chmod as ls,readFile as wO,rename as xO,writeFile as SO}from"node:fs/promises";import{homedir as kO}from"node:os";import{dirname as Uw,join as nu}from"node:path";import EO from"sql.js";var ps=Object.freeze(["project","entity","source","thesis","strategy","simulation","prepared_action","receipt","position"]),vO=new Set(ps),AO=new Set(ps.slice(0,-1).map((e,t)=>`${e}:${ps[t+1]}`)),Dw=nu(process.env.ORACLE_CONFIG_DIR||nu(kO(),".config","oracle"),"workspace"),Fw=nu(Dw,"artifacts.sqlite");function ms(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(ms).join(",")}]`:`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${ms(e[t])}`).join(",")}}`}function Bw(e){if(!vO.has(e))throw new TypeError(`unknown artifact type: ${e}`);return e}function us(e){let t=[];for(;e.step();)t.push(e.getAsObject());return e.free(),t}function ds(e){return e?{id:e.id,type:e.type,createdAt:e.created_at,data:JSON.parse(e.data_json)}:null}async function qw(e={}){let t=e.path||Fw;await bO(Uw(t),{recursive:!0,mode:448}),await ls(Uw(t),448);let n;try{n=await wO(t)}catch(l){if(l.code!=="ENOENT")throw l}let r=await EO(e.sqlJs||{}),o=n?new r.Database(n):new r.Database;o.run(`
|
|
188
|
+
}`;function q1(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 lg(e={},t={}){let n={chainIds:q1(e)};return e.user&&(n.user=String(e.user)),{markets:(await Mi(B1,{request:n},t))?.data?.markets??[]}}async function ug(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 Mi(D1,{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 dg(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 Mi(F1,{filter:r},t))?.data?.chains??[]}}async function pg(e={}){return{ok:(await Mi("query { health }",{},e))?.data?.health===!0,provider:"aave-v3"}}T();var j1="https://staking-api.babylonlabs.io";function Vc(e={}){return String(e.baseUrl||process.env.BABYLON_STAKING_API_URL||j1).replace(/\/$/,"")}function Ui(e,t={}){return y(`${Vc(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3,headers:{Accept:"application/json"}})}function mg(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 fg(e={}){try{let n=(await Ui("/v2/stats",e))?.data||{},r=Number(n.active_tvl??0);return{ok:Number.isFinite(r)&&r>0,provider:"babylon-staking",baseUrl:Vc(e),activeTvlSats:String(n.active_tvl??""),activeFinalityProviders:n.active_finality_providers??null,exec:!1}}catch(t){return{ok:!1,provider:"babylon-staking",baseUrl:Vc(e),error:String(t?.message||t),exec:!1}}}async function hg(e={},t={}){let r=(await Ui("/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 gg(e={},t={}){let n=await Ui("/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=mg(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 yg(e={},t={}){let n=mg(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 Ui(`/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}}T();var z1="https://markets.bisq.network";function zc(e={}){return String(e.baseUrl||process.env.BISQ_MARKETS_URL||z1).replace(/\/$/,"")}function bg(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 Bi(e,t={}){return y(`${zc(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function wg(e={}){try{let t=await Bi("/api/markets",e),n=t&&typeof t=="object"?Object.keys(t).length:0;return{ok:n>0,provider:"bisq-markets",baseUrl:zc(e),marketCount:n,exec:!1}}catch(t){return{ok:!1,provider:"bisq-markets",baseUrl:zc(e),error:String(t?.message||t),exec:!1}}}async function xg(e={},t={}){let n=await Bi("/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 Sg(e={},t={}){let n=bg(e.market||e.pair||"btc_usd","market"),r=await Bi(`/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 kg(e={},t={}){let n=bg(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 Bi(`/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}))}}T();var nt=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"}}),G1=new Map([["bob",60808],["rootstock",30],["rsk",30]]),K1=60808;function Ur(e){if(e==null||e==="")return K1;let t=G1.get(String(e).trim().toLowerCase());if(t)return t;let n=Number(e);if(!nt[n])throw new Error(`bob-rootstock: unsupported chain ${e} (supported: ${Object.keys(nt).join(", ")} / bob, rootstock)`);return n}function Wc(e,t={}){if(t.baseUrl)return String(t.baseUrl).replace(/\/$/,"");let n=Ur(e),r=n===30?process.env.ROOTSTOCK_EXPLORER_URL:process.env.BOB_EXPLORER_URL;return String(r||nt[n].url).replace(/\/$/,"")}function vg(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 Di(e,t,n={}){return y(`${Wc(e,n)}${t.startsWith("/")?t:`/${t}`}`,{fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs??15e3})}async function Eg(e={},t={}){let n;try{n=Ur(t.chainId??t.chain??e.chainId)}catch(o){return{ok:!1,provider:"bob-rootstock",error:String(o?.message||o),exec:!1}}let r=nt[n];try{let o=await Di(n,"/api/v2/stats",e);return{ok:o?.total_blocks!=null||o?.total_transactions!=null,provider:"bob-rootstock",chainId:n,chain:r.name,baseUrl:Wc(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:Wc(n,e),error:String(o?.message||o),exec:!1}}}async function Gc(e={},t={}){let n=e.chainId??e.chain;if(String(n).trim().toLowerCase()==="all"){let s=Object.keys(nt).map(Number);return{provider:"bob-rootstock",chains:await Promise.all(s.map(async c=>{try{return await Gc({chainId:c},t)}catch(l){return{provider:"bob-rootstock",chainId:c,chain:nt[c].name,error:String(l?.message||l)}}}))}}let r=Ur(n),o=nt[r],i=await Di(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 Ag(e={},t={}){let n=Ur(e.chainId??e.chain),r=vg(e.address||e.addr,"address"),o=nt[n],i=await Di(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 Ig(e={},t={}){let n=Ur(e.chainId??e.chain),r=vg(e.address||e.addr,"address"),o=await Di(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:nt[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}))}}T();var X1="https://insights.braiins.com/api/v1.0";function Kc(e={}){return String(e.baseUrl||process.env.BRAIINS_INSIGHTS_URL||X1).replace(/\/$/,"")}function Yc(e,t={}){return y(`${Kc(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3,headers:{Accept:"application/json"}})}async function _g(e={}){try{let t=await Yc("/price-stats",e),n=Number(t?.price??0);return{ok:Number.isFinite(n)&&n>0,provider:"braiins-insights",baseUrl:Kc(e),btcUsd:Number.isFinite(n)?n:null,timestamp:t?.timestamp??null,exec:!1}}catch(t){return{ok:!1,provider:"braiins-insights",baseUrl:Kc(e),error:String(t?.message||t),exec:!1}}}async function Pg(e={},t={}){let n=await Yc("/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 Yc("/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)}}T();var J1="https://api.cow.fi",Cg=Object.freeze({1:"mainnet",100:"xdai",42161:"arbitrum_one",8453:"base",11155111:"sepolia"});function Tg(e={}){return(e.baseUrl||process.env.COW_API_URL||J1).replace(/\/$/,"")}function Z1(e={}){if(e.network)return String(e.network);let t=Number(e.chainId??1),n=Cg[t];if(!n)throw new Error(`cow-protocol: unsupported chainId ${t} (have: ${Object.keys(Cg).join(", ")})`);return n}function Xc(e,t,n){return`${Tg(n)}/${Z1(e)}/api/v1${t}`}function Og(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 Rg(e,t=10){return Math.min(1e3,Math.max(1,Number(e.limit??t)))}async function $g(e={},t={}){return y(Xc(e,"/auction",t),{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function Lg(e={},t={}){let n=Og(e.owner||e.address||e.user,"owner"),r=new URLSearchParams({limit:String(Rg(e))});e.offset!=null&&r.set("offset",String(Math.max(0,Number(e.offset))));let o=await y(`${Xc(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 Mg(e={},t={}){let n=new URLSearchParams;e.orderUid?n.set("orderUid",String(e.orderUid)):n.set("owner",Og(e.owner||e.address||e.user,"owner"));let r=await y(`${Xc(e,"/trades",t)}?${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4}),o=Array.isArray(r)?r:[];return{count:o.length,trades:o.slice(0,Rg(e))}}async function Ug(e={}){let t=await y(`${Tg(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}}T();var tP="https://api.hiro.so",nP=20;function Qc(e={}){return String(e.baseUrl||process.env.HIRO_API_URL||tP).replace(/\/$/,"")}function rP(e={}){let t={Accept:"application/json"},n=e.apiKey||process.env.HIRO_API_KEY;return n&&(t["x-api-key"]=String(n)),t}function Br(e,t={}){return y(`${Qc(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3,headers:rP(t)})}async function Bg(e={}){try{let t=await Br("/v2/info",e),n=Number(t?.burn_block_height??0);return{ok:Number.isFinite(n)&&n>0,provider:"hiro-stacks",baseUrl:Qc(e),burnBlockHeight:t?.burn_block_height??null,stacksTipHeight:t?.stacks_tip_height??null,serverVersion:t?.server_version??null,rateLimitRps:nP,keyed:!!(e.apiKey||process.env.HIRO_API_KEY),exec:!1}}catch(t){return{ok:!1,provider:"hiro-stacks",baseUrl:Qc(e),error:String(t?.message||t),exec:!1}}}async function Dg(e={},t={}){let n=await Br("/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 Fg(e={},t={}){let n=await Br("/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 qg(e={},t={}){let n=Math.min(60,Math.max(1,Number(e.limit||20))),r=Math.max(0,Number(e.offset||0)),o=await Br(`/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 Br(`/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}))}}T();var iP="https://bundles.jito.wtf",Vg=1e9;function Jc(e={}){return String(e.baseUrl||process.env.JITO_BUNDLES_URL||iP).replace(/\/$/,"")}function sP(e,t,n){let r=Number(e);return Number.isFinite(r)?Math.max(1,Math.min(Math.floor(r),n)):t}function jg(e){let t=Number(e);return Number.isFinite(t)?Math.round(t*Vg):null}function aP(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/Vg:null,raw:e}}async function zg(e={}){try{let t=await y(`${Jc(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=sP(e.limit,5,100),r=new URL(`${Jc(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(aP),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 Gg(e={}){let t=await y(`${Jc(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,jg(i)])),suggestedTipLamports:jg(r.p75||r.p50),raw:n}}T();var lP="https://api.kamino.finance";function uP(e={}){return String(e.baseUrl||process.env.KAMINO_API_URL||lP).replace(/\/$/,"")}function we(e){let t=Number(e);return Number.isFinite(t)?t:null}function Kg(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 Zc(e={},t={}){let n=new URL(`${uP(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 Yg(e={}){try{let t=await Zc({},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 Xg(e={},t={}){let r=(await Zc(e,t)).map(Kg),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 Qg(e={},t={}){let n=String(e.strategy||e.address||"").trim();if(!n)throw new Error("kamino-strategies: strategy address required");let o=(await Zc({...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",...Kg(o),raw:o}}T();var pP="https://blockstream.info/liquid/api",Jg="6f0279e9ed041c3d710a9f57d0c02928416460c4b722ae3457a11eec381c526d";function Fi(e={}){return String(e.baseUrl||process.env.LIQUID_ESPLORA_URL||pP).replace(/\/$/,"")}function mP(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 fP(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 Zg(e,t={}){let n=`${Fi(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 ey(e,t={}){return y(`${Fi(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3})}async function ty(e={}){try{let t=await Zg("/blocks/tip/height",e),n=Number(t);return{ok:Number.isFinite(n)&&n>0,provider:"liquid-esplora",baseUrl:Fi(e),tipHeight:n,exec:!1,signing:"user-wallet"}}catch(t){return{ok:!1,provider:"liquid-esplora",baseUrl:Fi(e),error:String(t?.message||t),exec:!1}}}async function ny(e={},t={}){let n=await Zg("/blocks/tip/height",t);return{provider:"liquid-esplora",tipHeight:Number(n)}}async function ry(e={},t={}){let n=mP(e.address||e.addr,"address"),r=await ey(`/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 oy(e={},t={}){let n=fP(e.assetId||e.asset||Jg,"assetId"),r=await ey(`/asset/${n}`,t),o=r.chain_stats||{};return{provider:"liquid-esplora",assetId:n,isPolicyAsset:n===Jg,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}}T();var gP="https://api-mainnet.magiceden.dev/v2/ord/btc",yP=600;function el(e={}){return String(e.baseUrl||process.env.MAGICEDEN_ORD_API_URL||gP).replace(/\/$/,"")}function bP(e={}){let t={Accept:"application/json"},n=e.apiKey||process.env.MAGICEDEN_API_KEY;return n&&(t.Authorization=`Bearer ${n}`),t}function iy(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 sy(e,t={}){return y(`${el(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3,headers:bP(t),retries:t.retries??1})}async function ay(e={}){let t=iy(e.probeCollection||process.env.MAGICEDEN_PROBE_COLLECTION||"nodemonkes");try{let n=await sy(`/stat?collectionSymbol=${encodeURIComponent(t)}`,e);return{ok:n!=null&&typeof n=="object",provider:"magiceden-ordinals",baseUrl:el(e),probeCollection:t,rateLimitRpm:yP,exec:!1}}catch(n){let r=n?.status??null;return{ok:!1,provider:"magiceden-ordinals",baseUrl:el(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 cy(e={},t={}){let n=iy(e.collectionSymbol||e.symbol||e.collection,"collectionSymbol");try{let r=await sy(`/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."}}}T();var xP="https://mempool.space/api",SP=7;function tl(e={}){return String(e.baseUrl||process.env.MEMPOOL_API_URL||xP).replace(/\/$/,"")}function qi(e,t={}){return y(`${tl(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}function ly(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>SP}}async function uy(e={}){try{let n=(await qi("/v1/lightning/statistics/latest",e))?.latest||{},{ageDays:r,stale:o}=ly(n.added);return{ok:Number(n.node_count||0)>0,provider:"mempool-lightning",baseUrl:tl(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:tl(e),error:String(t?.message||t),exec:!1}}}async function dy(e={},t={}){let r=(await qi("/v1/lightning/statistics/latest",t))?.latest||{},{ageDays:o,stale:i}=ly(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 py(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 qi(`/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 my(e={},t={}){let n=await qi("/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)}))}}T();var vP="https://mempool.space/api",fy=new Set(["24h","3d","1w","1m","3m","6m","1y","2y","3y","all"]);function nl(e={}){return String(e.baseUrl||process.env.MEMPOOL_API_URL||vP).replace(/\/$/,"")}function hy(e,t){let n=String(e||t).trim().toLowerCase();if(!fy.has(n))throw new Error(`mempool-mining: window must be one of ${[...fy].join(", ")}`);return n}function Dr(e,t={}){return y(`${nl(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function gy(e={}){try{let t=await Dr("/v1/difficulty-adjustment",e);return{ok:Number.isFinite(Number(t?.nextRetargetHeight))&&Number(t.nextRetargetHeight)>0,provider:"mempool-mining",baseUrl:nl(e),nextRetargetHeight:t?.nextRetargetHeight??null,exec:!1}}catch(t){return{ok:!1,provider:"mempool-mining",baseUrl:nl(e),error:String(t?.message||t),exec:!1}}}async function yy(e={},t={}){let n=await Dr("/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 by(e={},t={}){let n=hy(e.window||e.timeframe,"1w"),r=await Dr(`/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 wy(e={},t={}){let n=hy(e.window||e.timeframe,"3d"),r=await Dr(`/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 xy(e={},t={}){let n=Math.min(1e4,Math.max(1,Number(e.blockCount||e.blocks||144))),r=await Dr(`/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}}T();var AP="https://amm-v2.meteora.ag",Sy=new Set(["tvl","volume","fee_tvl_ratio","l_m"]),ky=new Set(["dynamic","multitoken","lst","farms"]),IP=/^[1-9A-HJ-NP-Za-km-z]{32,44}$/;function _P(e={}){return String(e.baseUrl||process.env.METEORA_API_URL||AP).replace(/\/$/,"")}function le(e){let t=Number(e);return Number.isFinite(t)?t:null}function PP(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 NP(e={},t={}){let n=new URL(`${_P(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(!Sy.has(a))throw new Error(`meteora-dlmm: sortKey must be one of ${[...Sy].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(!ky.has(a))throw new Error(`meteora-dlmm: poolType must be one of ${[...ky].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(!IP.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 rl(e={},t={}){let{url:n,page:r,size:o}=NP(e,t),i=await y(n.toString(),{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4});return{pools:(Array.isArray(i?.data)?i.data:[]).map(PP),totalCount:i?.total_count??null,page:r,size:o}}async function vy(e={}){try{let{pools:t,totalCount:n}=await rl({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 Ey(e={},t={}){let n=await rl({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 Ay(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 rl({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}}T();var TP="https://ordinals.com";function Hi(e={}){return String(e.baseUrl||e.ordinalsBase||process.env.ORDINALS_BASE_URL||TP).replace(/\/$/,"")}function OP(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 Iy(e,t={}){let n=`${Hi(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 ol(e,t={}){return y(`${Hi(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3,headers:{Accept:"application/json"}})}async function _y(e={}){try{let t=await Iy("/r/blockheight",e),n=Number(t);return{ok:Number.isFinite(n)&&n>0,provider:"ordinals-runes",baseUrl:Hi(e),blockHeight:n,exec:!1}}catch(t){return{ok:!1,provider:"ordinals-runes",baseUrl:Hi(e),error:String(t?.message||t),exec:!1}}}async function Py(e={},t={}){let n=await Iy("/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 ol(`/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 Cy(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 ol(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 Ty(e={},t={}){let n=OP(e.name||e.rune||e.runeName,"name"),r=await ol(`/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}}T();var $P="https://hermes.pyth.network",sl={"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"},LP=/^[0-9a-fA-F]{64}$/;function Oy(e={}){return String(e.baseUrl||process.env.PYTH_HERMES_URL||$P).replace(/\/$/,"")}function Ry(e,t="feedId"){let n=String(e??"").trim();if(!n)throw new Error(`pyth-price-feeds: ${t} required`);let r=sl[n.toUpperCase()]||sl[`${n.toUpperCase()}/USD`];if(r)return r;let o=n.startsWith("0x")||n.startsWith("0X")?n.slice(2):n;if(!LP.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 il(e={}){let t=Number(e.price),n=Number(e.expo);return!Number.isFinite(t)||!Number.isFinite(n)?null:t*10**n}function al(e={}){let t=il({price:Number(e.price?.conf),expo:e.price?.expo}),n=il(e.price);return{id:e.id||null,price:n,confidence:t,confidenceBps:n&&t!=null?Math.round(t/Math.abs(n)*1e4):null,emaPrice:il(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 cl(e,t={}){let n=new URL(`${Oy(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 $y(e={}){try{let t=await cl([sl["SOL/USD"]],e),r=(Array.isArray(t?.parsed)?t.parsed.map(al):[])[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 Ly(e={},t={}){let n=Ry(e.feedId||e.id||e.symbol,"feedId"),r=await cl([n],t),o=Array.isArray(r?.parsed)?r.parsed.map(al):[],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 My(e={},t={}){let n=Array.isArray(e)?e:e.feedIds||e.ids||e.symbols||[],r=[...new Set(n.map(l=>Ry(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 cl(l,t));let a=s.flatMap(l=>Array.isArray(l?.parsed)?l.parsed.map(al):[]),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(`${Oy(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}))}}T();var UP="https://relayscan.io",By=new Set(["1h","12h","24h","7d"]);function ll(e={}){return(e.baseUrl||process.env.RELAYSCAN_API_URL||UP).replace(/\/$/,"")}function Dy(e={}){let t=String(e.timespan||e.t||"24h").toLowerCase();if(!By.has(t))throw new Error(`relayscan-mev: timespan must be one of ${[...By].join(", ")}`);return t}function BP(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 ul(e={},t={}){return y(`${ll(t)}/overview/json?t=${Dy(e)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function Fy(e={},t={}){return y(`${ll(t)}/builder-profit/json?t=${Dy(e)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function qy(e={},t={}){let n=BP(e);return y(`${ll(t)}/stats/day/${n}/json`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??25e3})}async function Hy(e={}){let t=await ul({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}}T();var FP="https://extra-api.sanctum.so",qP=30,HP=["jitoSOL","mSOL","bSOL","INF","hSOL","bonkSOL","jupSOL","dSOL"];function dl(e={}){return String(e.baseUrl||process.env.SANCTUM_API_URL||FP).replace(/\/$/,"")}function jy(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 jP(e,t){let n=[];for(let r=0;r<e.length;r+=t)n.push(e.slice(r,r+t));return n}async function zt(e,t,n={}){let r={},o={};for(let i of jP(t,qP)){let s=new URL(`${dl(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 Vy(e={}){try{let[t,n]=await Promise.all([y(`${dl(e)}/v1/lsts`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??15e3}),zt("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 pl(e={},t={}){let n=await y(`${dl(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 zy(e={},t={}){let n=e.lsts||e.symbols||null;e.all===!0&&(n=(await pl({},t)).lsts.map(c=>c.symbol).filter(Boolean)),(!Array.isArray(n)||!n.length)&&(n=HP);let r=[...new Set(n.map(a=>jy(a,"lsts[]")))],[o,i]=await Promise.all([zt("apy/latest",r,t),zt("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=jy(e.lst||e.mint||e.symbol,"lst"),[r,o,i,s]=await Promise.all([zt("apy/latest",[n],t),zt("apy/inception",[n],t),zt("tvl/current",[n],t).catch(()=>({values:{},errs:{}})),zt("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}}T();var zP="https://api.save.finance",WP="4UpD2fh7xH3VP9QQaXtsS1YY3bxzWhtfpks7FatyKvdY",Gy="CCpirWrgNuBVLdkP2haxLTbD6XqEgaYuVXixbbpxUB6",GP=/^[1-9A-HJ-NP-Za-km-z]{32,44}$/;function ml(e={}){return String(e.baseUrl||process.env.SAVE_API_URL||process.env.SOLEND_API_URL||zP).replace(/\/$/,"")}function Ky(e,t="address"){let n=String(e??"").trim();if(!GP.test(n))throw new Error(`solend-lending: ${t} must be a base58 public key`);return n}function Yy(e){let t=Number(e);return Number.isFinite(t)?t:null}function KP(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 YP(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:Yy(e.rates?.supplyInterest),borrowApyPct:Yy(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 Xy(e={}){try{let t=await y(`${ml(e)}/v1/reserves?ids=${Gy}`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??15e3}),n=Array.isArray(t?.results)?t.results:[];return{ok:n.length>0,provider:"solend-lending",probeReserve:Gy,reserves:n.length,exec:!1}}catch(t){return{ok:!1,provider:"solend-lending",error:String(t?.message||t),exec:!1}}}async function fl(e={},t={}){let n=new URL(`${ml(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(KP);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 Qy(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=>Ky(String(a).trim(),"reserve"));else{let s=Ky(e.market||e.marketAddress||WP,"market"),c=(await fl({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(`${ml(t)}/v1/reserves?ids=${n.join(",")}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??25e3}),i=(Array.isArray(o?.results)?o.results:[]).map((s,a)=>({...YP(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 hl(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 Wt(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 Fr(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:hl(e.amount,"amount")}}function gl(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 qr(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 yl(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 QP(e={},t={}){let n=Fr(e),r=Wt(e.slices??10,"slices",2,100),o=Wt(e.durationSec??3600,"durationSec",r,604800),i=gl(n.total,Array(r).fill(1));return qr(n,"TWAP",yl(i,o,t.nowMs),{durationSec:o})}function JP(e={},t={}){let n=Fr(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=Wt(e.durationSec??3600,"durationSec",r.length,604800),i=gl(n.total,r),s=r.reduce((c,l)=>c+l,0n),a=yl(i,o,t.nowMs).map((c,l)=>({...c,volumeWeightBps:Number(r[l]*10000n/s)}));return qr(n,"VWAP",a,{durationSec:o,requiresLiveVolumeValidation:!0})}function ZP(e={}){let t=Fr(e),n=Wt(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=hl(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 qr(t,"POV",o,{participationBps:n,residualAmount:String(r),requiresLiveVolumeValidation:!0})}function eN(e={}){let t=Fr(e),n=hl(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 qr(t,"ICEBERG",r,{displayAmount:String(n),refillCount:r.length-1})}function tN(e={},t={}){let n=Fr(e),r=Wt(e.slices??10,"slices",2,100),o=Wt(e.durationSec??3600,"durationSec",r,604800),i=Wt(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=gl(n.total,s);return qr(n,"IS",yl(a,o,t.nowMs),{durationSec:o,urgencyBps:i})}function Jy(e={},t={}){let n=String(e.strategy||"").trim().toUpperCase();if(n==="TWAP")return QP(e,t);if(n==="VWAP")return JP(e,t);if(n==="POV")return ZP(e,t);if(n==="ICEBERG")return eN(e,t);if(n==="IS"||n==="IMPLEMENTATION SHORTFALL")return tN(e,t);throw new Error("strategy must be TWAP, VWAP, POV, ICEBERG, or IS")}function Zy(){return{ok:!0,provider:"execution-strategies",strategies:["TWAP","VWAP","POV","ICEBERG","IS"],execution:"plan-only",externalProtocol:!1}}var rN={"hl-info":{health:e=>ad(e),allMids:e=>Je(e),l2Book:(e,t={})=>yo(t.coin,e),outcomeMeta:e=>lr(e),clearinghouse:(e,t={})=>bo(t.user,e),userFills:(e,t={})=>cd(t.user,e),meta:e=>wo(e),metaAndAssetCtxs:e=>on(e),candleSnapshot:(e,t={})=>sn(t,e),openOrders:(e,t={})=>ud(t.user,e),frontendOpenOrders:(e,t={})=>dd(t.user,e),userState:(e,t={})=>xo(t.user,e),spotMeta:e=>So(e)},"hl-vaults":{health:e=>hd(e),summaries:(e,t={})=>Qs(t,e),details:(e,t={})=>ko(t,e),userEquities:(e,t={})=>Js(t,e),tracker:(e,t={})=>Zs(t,e)},"poly-public":{health:e=>yd(e),time:e=>ea(e),markets:(e,t={})=>bd(t,e),book:(e,t={})=>wd(t.tokenId,e),midpoint:(e,t={})=>xd(t.tokenId,e),spread:(e,t={})=>Sd(t.tokenId,e),price:(e,t={})=>kd(t.tokenId,{side:t.side},e),events:(e,t={})=>vd(t,e)},"evm-rpc":{health:(e,t={})=>er(t.chainId??1,e),healthAll:(e,t={})=>_u({...e,chainIds:t.chainIds}),blockNumber:(e,t={})=>oo(t.chainId??1,e),chainId:(e,t={})=>Au(t.chainId??1,e),getBalance:(e,t={})=>tn(t.chainId??1,t.address,e),call:(e,t={})=>L(t.chainId??1,t.method,t.params||[],e),erc20Allowance:(e,t={})=>Iu(t,e),erc20Balance:(e,t={})=>io(t,e),transactionReceipt:(e,t={})=>so(t,e)},portfolio:{health:e=>Mh(e),balances:(e,t={})=>Ei(t,e),snapshot:(e,t={})=>t0(t,e),history:(e,t={})=>Ac(t,e),valueGraph:(e,t={})=>n0(t,e)},"nft-portfolio":{health:e=>jh(e),inventory:(e,t={})=>Tn(t,e),gallery:(e,t={})=>Gh(t,e),pnl:(e,t={})=>Wh(t,e),prepareList:(e,t={})=>Vh(t,e),traitSnipe:(e,t={})=>zh(t,e)},"contract-risk":{health:e=>r0(e),scan:(e,t={})=>Ht(t,e)},"evm-token-sniper":{health:e=>s0(e),scan:(e,t={})=>i0(t,e)},"evm-simulate":{health:e=>c0(e),simulate:(e,t={})=>$r(t,e)},"nft-mint":{health:e=>u0(e),discover:(e,t={})=>Ti(t,e),prepare:(e,t={})=>Pc(t,e),priceGas:(e,t={})=>Ci(t,e),createTrigger:(e,t={})=>d0(t,e),checkOpen:(e,t={})=>p0(t,e),evaluateMancerOs:(e,t={})=>h0(t,e)},"solana-rpc":{health:e=>Ad(e),latestBlockhash:(e,t={})=>na(t,e),getBalance:(e,t={})=>vo(t,e),tokenAccounts:(e,t={})=>pr(t,e),simulate:(e,t={})=>Id(t,e)},"bitcoin-esplora":{health:e=>_d(e),tipHeight:e=>Pd(e),fees:e=>Nd(e),address:(e,t={})=>Ao(t,e),utxos:(e,t={})=>Cd(t,e),tx:(e,t={})=>Td(t,e),decode:(e,t={})=>Od(t,e)},"bitcoin-meta":{health:e=>Md(e),runeBalances:(e,t={})=>_o(t,e),inscriptions:(e,t={})=>ln(t,e),inscriptionInfo:(e,t={})=>Ud(t,e),inscriptionChildren:(e,t={})=>Bd(t,e),ordBlockInfo:(e,t={})=>Dd(t,e)},satflow:{health:e=>qd(e),collectionFloors:(e,t={})=>Hd(t,e),collectionStats:(e,t={})=>jd(t,e),item:(e,t={})=>Vd(t,e),walletContents:(e,t={})=>No(t,e),floorListings:(e,t={})=>zd(t,e),preparePurchase:(e,t={})=>Gd(t,e),prepareList:(e,t={})=>Co(t,e)},jupiter:{health:e=>tp(e),venues:(e,t={})=>ep(t,e),quote:(e,t={})=>Ro(t,e),prepare:(e,t={})=>np(t,e)},defillama:{health:e=>op(e),prices:(e,t={})=>Re(t.coins||[],e),pricesBySymbol:(e,t={})=>cp(t.symbols,e),protocols:e=>$o(e),yields:(e,t={})=>ip(t,e),stablecoins:(e,t={})=>sp(t,e),dexVolumes:(e,t={})=>ap(t,e)},lifi:{health:e=>gp(e),quote:(e,t={})=>dt(t,e),prepare:(e,t={})=>yp(t,e),chains:e=>bp(e)},dexscreener:{health:e=>Pu(e),token:(e,t={})=>Rt(t.address||t.tokenAddress,e),search:(e,t={})=>tr(t.q||t.query,e),pair:(e,t={})=>Nu(t.chainId,t.pairAddress,e)},"uniswap-v3":{health:(e,t={})=>ju({...e,chainId:t.chainId??8453}),quote:(e,t={})=>at(t,e),prepare:(e,t={})=>Hu(t,e),quotePath:(e,t={})=>qu(t,e),ethUsdc:(e,t={})=>Ds(t,e),chains:()=>Vu()},"uniswap-v4":{health:(e,t={})=>Xu({...e,chainId:t.chainId??8453}),quote:(e,t={})=>mo(t,e),chains:()=>Yu()},aerodrome:{health:(e,t={})=>Ip({...e,chainId:t.chainId??8453}),quote:(e,t={})=>Bo(t,e),prepare:(e,t={})=>Ap(t,e),chains:()=>_p()},zerox:{health:e=>Tp(e),price:(e,t={})=>ya(t,e),quote:(e,t={})=>Lt(t,e),prepare:(e,t={})=>Op(t,e)},across:{health:e=>ba(e),suggestedFees:(e,t={})=>Fo(t,e)},hop:{health:e=>wa(e),quote:(e,t={})=>qo(t,e)},relay:{health:e=>xa(e),quote:(e,t={})=>fr(t,e),prepare:(e,t={})=>Sa(t,e)},cowswap:{health:e=>qp(e),quote:(e,t={})=>mt(t,e),prepareOrder:(e,t={})=>Hp(t,e),order:(e,t={})=>Vp(t,e),status:(e,t={})=>jp(t,e),chains:()=>zp()},oneinch:{health:e=>Gp(e),quote:(e,t={})=>yr(t,e),prepare:(e,t={})=>Kp(t,e),approveSpender:(e,t={})=>_a(t,e)},"hl-ws":{health:e=>Yp(e),allMids:e=>Xp(e),l2Book:(e,t={})=>Qp(t.coin,e),snapshot:(e,t={})=>br(t.subscription||t,e)},"poly-ws":{health:(e,t={})=>Jp({...e,assetId:t.assetId}),book:(e,t={})=>Zp(t.assetId||t.tokenId,e),snapshot:(e,t={})=>zo(t.assetIds||t.assets_ids||[t.assetId],e)},"opensea-nft":{health:e=>im(e),collection:(e,t={})=>Ko(t.slug,e),floor:(e,t={})=>sm(t.slug,e),accountNfts:(e,t={})=>wr(t,e),accountPnl:(e,t={})=>Yo(t,e),prepareList:(e,t={})=>Xo(t,e)},"hl-outcome":{list:e=>Hm(e),prepareOrder:(e,t={})=>jm(t,e),prepareCancel:(e,t={})=>Vm(t,e)},"protocol-templates":{health:()=>({ok:!0,templates:di().map(e=>e.id),nativeTemplates:Ja().map(e=>e.id),families:["evm","solana","bitcoin"],firmAudit:!1}),list:()=>di(),listNative:()=>Ja(),gate:(e,t={})=>Ga(t.templateId||t.id,e),prepareDeploy:(e,t={})=>gf(t,e),buildNative:(e,t={})=>Ef(t)},"poly-clob":{prepareOrder:(e,t={})=>Xm(t||{})},"hl-perps":{health:e=>Ua(e),assetInfo:(e,t={})=>Ut(t,e),prepareOrder:(e,t={})=>Er(t,e),prepareCancel:(e,t={})=>oi(t,e),prepareLeverage:(e,t={})=>Dm(t,e),prepareIsolatedMargin:(e,t={})=>Fm(t,e),prepareBracket:(e,t={})=>qm(t,e),prepareBuilderApproval:(e,t={})=>Bm(t,e)},"hl-markets":{health:e=>Ua(e),markets:(e,t={})=>Zo(t,e),leaderboards:(e,t={})=>Im(t,e),coin:(e,t={})=>_m(t,e),spot:(e,t={})=>Pm(t,e)},"magiceden-sol":{health:e=>pm(e),stats:(e,t={})=>Na(t,e),listings:(e,t={})=>fm(t,e),tokenListings:(e,t={})=>hm(t,e),prepareBuy:(e,t={})=>gm(t,e),prepareList:(e,t={})=>Qo(t,e),prepareMint:(e,t={})=>ym(t,e)},"hl-staking":{health:e=>wm(e),validators:e=>Oa(e),delegatorSummary:(e,t={})=>Ra(t,e),delegations:(e,t={})=>$a(t,e),rewards:(e,t={})=>xm(t,e),history:(e,t={})=>Sm(t,e),preflight:(e,t={})=>Am(t,e),prepareStakeDeposit:(e,t={})=>km(t,e),prepareStakeWithdraw:(e,t={})=>vm(t,e),prepareDelegate:(e,t={})=>Em(t,e)},"hyperevm-dex":{health:e=>cm(e),search:(e,t={})=>lm(t.q||t.query||"HYPE",e),token:(e,t={})=>um(t.address||t.tokenAddress,e)},geckoterminal:{health:e=>Pf(e),networks:(e,t={})=>Za(t,e),pool:(e,t={})=>Af(t,e),token:(e,t={})=>If(t,e),ohlcv:(e,t={})=>_f(t,e)},curve:{health:e=>qf(e),openapi:e=>Ff(e),pools:(e,t={})=>tc(t,e),quote:(e,t={})=>nc(t,e),prepare:(e,t={})=>Hf(t,e)},gmx:{health:e=>Zf(e),tickers:(e,t={})=>yi(t,e),markets:(e,t={})=>Qf(t,e),marketsInfo:(e,t={})=>oc(t,e),tokens:(e,t={})=>Jf(t,e),prepareOrder:(e,t={})=>rh(t,e),positions:(e,t={})=>eh(t,e),orderStatus:(e,t={})=>th(t,e),verifyOrder:(e,t={})=>nh(t,e)},morpho:{health:e=>ah(e),markets:(e,t={})=>sh(t,e),vaults:(e,t={})=>ac(t,e),prepareVault:(e,t={})=>ch(t,e)},balancer:{health:e=>gh(e),pools:(e,t={})=>hh(t,e),quote:(e,t={})=>uc(t,e),prepare:(e,t={})=>yh(t,e)},pendle:{health:e=>wh(e),markets:(e,t={})=>pc(t,e),quote:(e,t={})=>xh(t,e),prepare:(e,t={})=>mc(t,e)},odos:{health:e=>Eh(e),chains:e=>hc(e),quote:(e,t={})=>kh(t,e),prepare:(e,t={})=>vh(t,e)},blockscout:{health:e=>Oh(e),stats:(e,t={})=>bc(t,e),address:(e,t={})=>Ph(t,e),token:(e,t={})=>Nh(t,e)},paraswap:{health:e=>y0(e),tokens:(e,t={})=>Tc(t,e),price:(e,t={})=>wt(t,e),quote:(e,t={})=>wt(t,e),prepare:(e,t={})=>g0(t,e)},rfq:{health:e=>$0(e),intent:(e,t={})=>O0(t,e),quote:(e,t={})=>R0(t,e)},"polygon-staking":{health:e=>cg(e),validators:(e,t={})=>sg(t,e),validatorDetail:(e,t={})=>ag(t,e)},"aave-v3":{health:e=>pg(e),markets:(e,t={})=>lg(t,e),marketReserves:(e,t={})=>ug(t,e),chains:e=>dg(e)},"babylon-staking":{health:e=>fg(e),stats:e=>hg(e),finalityProviders:e=>gg(e),delegations:(e,t={})=>yg(t,e)},"bisq-markets":{health:e=>wg(e),markets:e=>xg(e),ticker:(e,t={})=>Sg(t,e),trades:(e,t={})=>kg(t,e)},"bob-rootstock":{health:(e,t={})=>Eg(t.chainId,e),stats:(e,t={})=>Gc(t,e),addressInfo:(e,t={})=>Ag(t,e),tokenBalances:(e,t={})=>Ig(t,e)},"braiins-insights":{health:e=>_g(e),priceStats:e=>Pg(e),poolStats:e=>Ng(e)},"cow-protocol":{health:e=>Ug(e),auction:e=>$g(e),openOrders:(e,t={})=>Lg(t,e),recentTrades:(e,t={})=>Mg(t,e)},"hiro-stacks":{health:e=>Bg(e),networkInfo:e=>Dg(e),stackingInfo:e=>Fg(e),poxCycles:e=>qg(e),blocks:(e,t={})=>Hg(t,e)},"jito-mev":{health:e=>zg(e),recentBundles:(e,t={})=>Wg(t,e),tipFloor:e=>Gg(e)},"kamino-strategies":{health:e=>Yg(e),strategies:(e,t={})=>Xg(t,e),strategyMetrics:(e,t={})=>Qg(t,e)},"liquid-esplora":{health:e=>ty(e),tipHeight:e=>ny(e),addressInfo:(e,t={})=>ry(t,e),assetInfo:(e,t={})=>oy(t,e)},"magiceden-ordinals":{health:e=>ay(e),collectionStat:(e,t={})=>cy(t,e)},"mempool-lightning":{health:e=>uy(e),statistics:e=>dy(e),nodeRankings:(e,t={})=>py(t,e),nodeCountries:e=>my(e)},"mempool-mining":{health:e=>gy(e),difficulty:e=>yy(e),poolShare:(e,t={})=>by(t,e),hashrate:(e,t={})=>wy(t,e),rewardStats:(e,t={})=>xy(t,e)},"meteora-dlmm":{health:e=>vy(e),pools:(e,t={})=>Ey(t,e),poolSearch:(e,t={})=>Ay(t,e)},"ordinals-runes":{health:e=>_y(e),blockHeight:e=>Py(e),blockInfo:(e,t={})=>Ny(t,e),satInfo:(e,t={})=>Cy(t,e),runeInfo:(e,t={})=>Ty(t,e)},"pyth-price-feeds":{health:e=>$y(e),latestPrice:(e,t={})=>Ly(t,e),latestPrices:(e,t={})=>My(t,e),feedDirectory:e=>Uy(e)},"relayscan-mev":{health:e=>Hy(e),overview:(e,t={})=>ul(t,e),builderProfit:(e,t={})=>Fy(t,e),dailyStats:(e,t={})=>qy(t,e)},"sanctum-lst":{health:e=>Vy(e),lstList:e=>pl(e),apyAll:e=>zy(e),apyIndividual:(e,t={})=>Wy(t,e)},"solend-lending":{health:e=>Xy(e),markets:e=>fl(e),reserves:(e,t={})=>Qy(t,e)},"execution-strategies":{health:()=>Zy(),plan:(e,t={})=>Jy(t)},"across-bridge":{health:e=>L0(e),pools:(e,t={})=>M0(t,e),suggestedFees:(e,t={})=>U0(t,e)},"beefy-yields":{health:e=>B0(e),apy:(e,t={})=>D0(t,e),apyBreakdown:e=>F0(e)},"birdeye-tokens":{health:e=>H0(e),tokenList:(e,t={})=>j0(t,e)},"celestia-da":{health:e=>V0(e),stats:e=>z0(e),blockStats:(e,t={})=>W0(t,e)},"das-assets":{health:e=>G0(e),assetsByOwner:(e,t={})=>K0(t,e),searchAssets:(e,t={})=>Y0(t,e),assetProof:(e,t={})=>X0(t,e)},"l2beat-tvl":{health:e=>Q0(e),tvl:(e,t={})=>J0(t,e),activity:(e,t={})=>Z0(t,e)},"spark-lend":{health:e=>eg(e),markets:(e,t={})=>tg(t,e)},"symbiotic-restaking":{health:e=>ng(e),vaults:(e,t={})=>rg(t,e),vaultDetail:(e,t={})=>og(t,e)}},eb=new Set(["prepareBuilderApproval","prepareBracket","prepareIsolatedMargin","prepareLeverage","prepareCancel","prepareOrder","preparePurchase","prepareList","prepareSell","prepareBuy","prepareMint","prepare","prepareStakeDeposit","prepareStakeWithdraw","prepareDelegate","prepareSwap","prepareTransfer","createOrder","cancelOrder"]),tb=new Set(["hl-exec"]);function oN(e){return tb.has(String(e||""))}function iN(e,t,n={}){let r=String(t||""),o=`${e}.${r}`;if(tb.has(e))throw new Error(`data plane forbidden execution provider: ${e}`);let i=cr().find(s=>s.id===e);if(/sign|execute|broadcast|submit|send|write|place/i.test(r)&&!eb.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(eb.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(oN(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.`);iN(e,t,n);let o=go(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=rN[e];if(!i||typeof i[t]!="function")throw new Error(`No client implementation for ${e}.${t}`);return i[t](r,n)}async function nb({providers:e,fetchImpl:t,timeoutMs:n,includeRpc:r,includeWs:o,concurrency:i,healthCall:s}={}){let a=e||cr().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 en(a,i??8,async d=>{if(!go(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 rb(){return cr().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 sN={catalog:rb,health:nb,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 Me=Object.freeze({FULL:"FULL",NO_GAS:"NO_GAS",FAILED:"FAILED"}),ib={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"},Hr=e=>{try{return e==null||e===""?null:BigInt(String(e).split(".")[0])}catch{return null}};function ob(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:Me.FAILED,amountOut:null,error:l||"no amountOut returned"};let p=Hr(n);if(p==null||p<=0n)return{source:t,quality:Me.FAILED,amountOut:null,error:"non-positive amountOut"};let m=Number(s);return{source:t,quality:o==null?Me.NO_GAS:Me.FULL,amountOut:p.toString(),minOut:Hr(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 sb(e,t,{divisor:n=1000n}={}){let r=Hr(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=Hr(i),c=Hr(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 ab(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 bl(e,{destPriceUsd:t=null,destDecimals:n=null,liquidityFirst:r=!0,liquidityBandBps:o=50}={}){let i=e.filter(b=>b.quality!==Me.FAILED),s=e.filter(b=>b.quality===Me.FAILED),a=t!=null&&t>0&&n!=null&&n>=0,c=i.map(b=>{let k=BigInt(b.amountOut),x=0n,w=!1,E=BigInt(b.oracleFeeBps??0),C=E>0n?k*E/10000n:0n;if(a){let _=(b.gasUsd??0)+(b.feeUsd??0);if(_>0){let v=_/t*10**n;Number.isFinite(v)&&v>=0&&(x=BigInt(Math.floor(v)),w=!0)}else b.gasUsd===0&&(w=!0)}let I=x+C,R=k>I?k-I:0n;return{...b,grossOut:k.toString(),netOut:R.toString(),costInDest:x.toString(),oracleFeeInDest:C.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 E=b.liquidityUsd??-1,C=k.liquidityUsd??-1;if(E!==C)return C-E}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 ji(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"?ob({source:s,error:String(o.reason?.message||o.reason)}):ob({source:s,...o.value})})}var Ke=e=>{let t=Number(e);return Number.isFinite(t)?t:null};function Vi(e){if(!Array.isArray(e))return null;let t=0,n=!1;for(let r of e){let o=Ke(r?.amountUSD);o!=null&&(t+=o,n=!0)}return n?t:null}async function lb(e,t={}){let n=ib[Number(e)];if(!n)return null;try{let r=await Re([n],t);return Ke(r?.coins?.[n]?.price)}catch{return null}}var xt=e=>String(e??"").toLowerCase().replace(/[^a-z0-9]/g,""),cb=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 aN(e={}){try{let t=await $o({...e,baseUrl:e.defillamaApiBaseUrl,timeoutMs:e.defillamaTimeoutMs??Math.min(Number(e.timeoutMs??5e3),5e3)});return Array.isArray(t)?t:[]}catch{return[]}}function cN(e,t={}){let n=xt(t.tool||t.provider||t.bridge||t.protocol),r=[];return e==="lifi"&&n&&n!=="lifi"&&r.push(...cb[n]||[n]),r.push(...cb[xt(e)]||[e]),r}function lN(e,t,n={}){let r=Array.isArray(e)?e:[],o=cN(t,n).map(xt).filter(Boolean);for(let i of o){let s=r.find(c=>xt(c?.slug)===i||xt(c?.name)===i),a=Ke(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=xt(c?.category);return!l.includes("bridge")&&!l.includes("crosschain")?!1:xt(c?.slug).includes(i)||xt(c?.name).includes(i)}),a=Ke(s?.tvl);if(a!=null)return{liquidityUsd:a,protocol:s?.name??s?.slug??i}}return null}function wl({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 dt({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:Vi(m?.gasCosts),feeUsd:Vi(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 wt({chainId:e,srcToken:t,destToken:n,amount:r,srcDecimals:s,destDecimals:p},u),f=m?.priceRoute;return{amountOut:f?.destAmount,gasUsd:Ke(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 Lt({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 yr({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 mt({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 at({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}}}}),Ve[Number(e)]&&d.push({source:"uniswap-v4",run:async()=>{let p=await mo({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 ub({fromChainId:e,toChainId:t,tokenIn:n,tokenOut:r,amountIn:o,taker:i,opts:s={}}){let a=[],c=null,l=async(u,d={})=>(c||=aN(s),lN(await c,u,d));return a.push({source:"lifi",run:async()=>{let u=await dt({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:Ke(d?.executionDuration)},m=await l("lifi",p);return{amountOut:d?.toAmount,minOut:d?.toAmountMin,gasUsd:Vi(d?.gasCosts),feeUsd:Vi(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(()=>(jo(),Ho)),p=(await u({user:i,originChainId:e,destinationChainId:t,originCurrency:n,destinationCurrency:r,amount:String(o)},s))?.details,m={durationSeconds:Ke(p?.timeEstimate),rate:p?.rate},f=await l("relay",m);return{amountOut:p?.currencyOut?.amount,minOut:p?.currencyOut?.minimumAmount,gasUsd:Ke(p?.totalImpact?.usd)!=null?Math.abs(Ke(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(()=>(jo(),Ho)),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:Ke(d?.estimatedFillTimeSec),limits:d?.limits?{min:d.limits.minDeposit,max:d.limits.maxDeposit}:void 0,liquidityProtocol:f?.protocol}}}}),a}var uN={1:"ethereum",10:"optimism",56:"bsc",137:"polygon",8453:"base",42161:"arbitrum",43114:"avax"};async function db(e,t,n){let r=uN[Number(e)];if(!r)return{priceUsd:null,decimals:null};let o=`${r}:${t}`;try{let s=(await Re([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 dN(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=lb(n,t),a=db(n,o,t),c=wl({...e,nativePriceUsd:s,decimalsOut:e.decimalsOut,destDecimalsPromise:a,opts:t}),[l,u]=await Promise.all([ji(c,{timeoutMs:t.timeoutMs??12e3}),a]);s.catch(()=>{});let d=bl(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 sb(async g=>{let b=wl({...e,amountIn:g.toString(),nativePriceUsd:s,decimalsOut:e.decimalsOut,destDecimalsPromise:a,opts:t}).filter(x=>x.source===m);return b.length?(await ji(b,{timeoutMs:t.timeoutMs??12e3}))?.[0]?.amountOut??null:null},i);if(h){let g=ab(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!==Me.FAILED).length,note:xl(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!==Me.FAILED).length,note:xl(d,c.length)}}async function pN(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=db(r,i,t),c=ub({...e,opts:t}),[l,u]=await Promise.all([ji(c,{timeoutMs:t.timeoutMs??15e3}),a]),d=bl(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!==Me.FAILED).length,note:xl(d,c.length)}}function mN(e){let t=e?.meta?.oracleFee;return t?.applies?` \xB7 ${pp(t)}`:""}function xl(e,t){if(!e.best)return"no source returned a usable route";let n=e.routes.length,r=mN(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 IB=Object.freeze({mantissa:10000n,scale:0});function Gt(e){if(!Number.isSafeInteger(e)||e<0||e>1e3)throw new RangeError("scale must be a safe integer from 0 through 1000")}function Ye(e,t){if(typeof e!="bigint")throw new TypeError("mantissa must be a bigint");return Gt(t),Object.freeze({mantissa:e,scale:t})}function St(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`);Gt(e.scale)}function zi(e){return Gt(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 Ye(s,o.length)}function fe(e,t){if(Gt(t),typeof e=="bigint")return Ye(e,t);if(typeof e!="string"||!/^[+-]?\d+$/.test(e))throw new TypeError("value must be an integer string or bigint");return Ye(BigInt(e),t)}function Ue(e){St(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 jr(e,t){return St(e),Gt(t),t===e.scale?Ye(e.mantissa,e.scale):t>e.scale?Ye(e.mantissa*zi(t-e.scale),t):Ye(e.mantissa/zi(e.scale-t),t)}function Sl(e,t){St(e,"left"),St(t,"right");let n=Math.max(e.scale,t.scale);return[jr(e,n),jr(t,n),n]}function kt(e,t){let[n,r,o]=Sl(e,t);return Ye(n.mantissa+r.mantissa,o)}function Vr(e,t){let[n,r,o]=Sl(e,t);return Ye(n.mantissa-r.mantissa,o)}function xe(e,t){St(e,"left"),St(t,"right");let n=e.scale+t.scale;return Gt(n),Ye(e.mantissa*t.mantissa,n)}function Be(e,t,n=Math.max(e?.scale??0,t?.scale??0)){if(St(e,"left"),St(t,"right"),Gt(n),t.mantissa===0n)throw new RangeError("division by zero");let r=e.mantissa*zi(t.scale+n),o=t.mantissa*zi(e.scale);return Ye(r/o,n)}function vt(e,t){let[n,r]=Sl(e,t);return n.mantissa<r.mantissa?-1:n.mantissa>r.mantissa?1:0}import{readFileSync as fN,existsSync as hN}from"node:fs";import{fileURLToPath as gN}from"node:url";import{dirname as yN,join as mb}from"node:path";var bN=mb(yN(gN(import.meta.url)),"fixtures");function wN(){try{let e=ai("equities-fixtures",import.meta.url);if(e&&hN(e))return e}catch{}return bN}var xN=wN();var fb=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 SN(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){SN(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 Xe(e,t,n){Number.isSafeInteger(e)||j(t,`${n} must be a safe integer`)}function Et(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 kN(e,t){te(e,t,"root"),Xe(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`),Et(i[o],t,`venues.${r}.${o}`)}for(let[r,o]of Object.entries(e.venues.hyperliquid_hip3.dexs))Et(o,t,`venues.hyperliquid_hip3.dexs.${r}`)}function vN(e,t){Et(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 EN(e,t){te(e,t,"root");for(let n of["chainId","block","oracleScaleExp","usdgDecimals","equityDecimals"])Xe(e[n],t,n);z(e.usdg,t,"usdg"),Et(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 AN(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)=>Xe(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 IN(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"])Xe(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 _N(e,t){Et(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 PN(e,t){te(e,t,"root"),Xe(e.capturedAt,t,"capturedAt"),Xe(e.block,t,"block"),Xe(e.chainId,t,"chainId"),z(e.gasPriceWei,t,"gasPriceWei"),z(e.stateView,t,"stateView"),Et(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 NN(e,t){te(e,t,"root"),Xe(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 CN(e,t){te(e,t,"root"),Xe(e.capturedAt,t,"capturedAt"),z(e.source,t,"source"),z(e.chain,t,"chain"),Et(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 TN(e,t){te(e,t,"root"),Xe(e.capturedAt,t,"capturedAt"),z(e.source,t,"source"),z(e.chain,t,"chain"),e.chain!=="ton"&&j(t,'chain must be "ton"'),Et(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 ON=Object.freeze({venues:kN,universe:vN,oracles:EN,nyseHolidays:AN,dstTransitions:IN,equityDexPools:_N,rhPoolState:PN,solanaXstocks:CN,tonXstocks:TN,hip3L2Books:NN});function RN(e,t){let n=fb[t],r=mb(e,n),o;try{o=fN(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 ON[t](i,n),i}function hb(e){if(e!==null&&typeof e=="object"&&!Object.isFrozen(e)){Object.freeze(e);for(let t of Object.values(e))hb(t)}return e}function gb({fixtureDir:e=xN}={}){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(fb))t[n]=RN(e,n);return hb(t)}var pb;function At(){return pb??=gb(),pb}function Ie(){return At().venues}function yb(){return At().oracles}function bb(){return At().nyseHolidays}function wb(){return At().dstTransitions}function Wi(){return At().rhPoolState}function xb(){return At().solanaXstocks}function Sb(){return At().tonXstocks}function kb(){return At().hip3L2Books}var vl=1e3,Ab=60*vl,El=60*Ab,vb=24*El,$N=-5*El,LN=-4*El,Ib=240,_b=570,Pb=960,Nb=1200,$B=Object.freeze([Ib,_b,Pb,Nb]),LB=Object.freeze(["core","extended","dark"]),Eb,kl;function MN(){let e=wb().dstTransitions.map(r=>({year:r.year,startMs:r.startUtc*vl,endMs:r.endUtc*vl}));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 Cb(){return Eb??=MN(),Eb}function UN(){return kl===void 0&&(kl=new Set(bb().holidayDayIndex)),kl}function Tb(e,t){if(!Number.isSafeInteger(e))throw new TypeError(`${t}: epochMs must be a safe integer number of milliseconds`)}function BN(e,t){let{coverageStartMs:n,coverageEndMs:r,firstYear:o,lastYear:i}=Cb();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 DN(e){for(let t of Cb().rows)if(e>=t.startMs&&e<t.endMs)return!0;return!1}function FN(e){return DN(e)?LN:$N}function qN(e){let t=e+FN(e),n=Math.floor(t/vb),r=t-n*vb,o=new Date(t);return{dayIndex:n,minuteOfDay:Math.floor(r/Ab),msIntoDay:r,weekday:o.getUTCDay()}}function HN({dayIndex:e,weekday:t}){return t===0||t===6?!1:!UN().has(e)}function jN(e){return e<Ib?"dark":e<_b?"extended":e<Pb?"core":e<Nb?"extended":"dark"}function zr(e){Tb(e,"sessionState"),BN(e,"sessionState");let t=qN(e);return HN(t)?jN(t.minuteOfDay):"dark"}function Al(e){return Tb(e,"isDark"),zr(e)==="dark"}var Gi=Object.freeze({DORMANT_VENUE:"dormant-venue",CROSSED_BOOK:"crossed-book",STALE_QUOTE:"stale-quote",STALE_ORACLE:"stale-oracle"}),VN=12e4,zN=6e5;function Ki(e,t){e.push(Object.freeze({venue:t.venue,symbol:t.symbol??null,reason:t.reason,evidence:t.evidence??null}))}function WN(e){let t=e.raw?.vol24h;return!!(t===0||t===0||typeof t=="number"&&Number.isFinite(t)&&t<=0)}function GN(e){return!e.bid||!e.ask?!1:vt(e.bid,e.ask)>0}function Ob(e,t,n){return Number.isSafeInteger(e.capturedAt)?t-e.capturedAt>n:!1}function Yi(e,t={}){if(!Array.isArray(e))throw new TypeError("quotes must be an array");let n=t.nowMs??Date.now(),r=t.quoteFreshnessMs??VN,o=t.oracleFreshnessMs??zN,i=t.includeDormant===!0,s=[],a=[];for(let c of e){if(WN(c)){i?s.push(Object.freeze({...c,staleData:!0})):Ki(a,{venue:c.venue,symbol:c.symbolRaw??c.symbol,reason:Gi.DORMANT_VENUE,evidence:{vol24h:c.raw?.vol24h??null}});continue}if(GN(c)){Ki(a,{venue:c.venue,symbol:c.symbolRaw??c.symbol,reason:Gi.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(Ob(c,n,r)){Ki(a,{venue:c.venue,symbol:c.symbolRaw??c.symbol,reason:Gi.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=zr(n),u=l==="core"?o:o*2;if(Ob(c,n,u)){Ki(a,{venue:c.venue,symbol:c.symbolRaw??c.symbol,reason:Gi.STALE_ORACLE,evidence:{capturedAt:c.capturedAt,nowMs:n,session:l}});continue}}s.push(c)}return{survivors:s,excluded:a}}function KN(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(KN(e))}function De(e,t){let n=oe(e);if(n===null)throw new TypeError(`${t} must be a finite source number`);return n}var YN=new Set(["spot","perp"]),XN=new Set(["read-only","quote-only","prepare","intent"]),QN=new Set(["buy","sell"]),JN=new Set(["net-of-cost","gross"]),ZN=new Set(["homogeneous","heterogeneous"]),eC=["bid","ask","mid","mark"],Rb=["fees","gasEstimate","priceImpact","fundingHourly"],tC=/^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$/;function Y(e,t){throw new TypeError(`${e} ${t}`)}function Lb(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function Kt(e,t){Lb(e)||Y(t,"must be an object")}function Mb(e,t,n){Object.hasOwn(e,t)||Y(`${n}.${t}`,"is required")}function Un(e,t){(typeof e!="string"||e.length===0)&&Y(t,"must be a nonempty string")}function Wr(e,t,n){t.has(e)||Y(n,`must be one of ${[...t].join(", ")}`)}function _l(e,t){(!Number.isSafeInteger(e)||e<0)&&Y(t,"must be a nonnegative safe integer")}function Il(e,t,n=!1){e===null&&n||(Lb(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 Xi(e,t,n=!1){e===null&&n||Kt(e,t)}function $b(e,t){Kt(e,t),Un(e.venue,`${t}.venue`),Un(e.reason,`${t}.reason`),tC.test(e.reason)||Y(`${t}.reason`,"must be a machine readable lower case code"),Object.hasOwn(e,"symbol")&&e.symbol!==null&&Un(e.symbol,`${t}.symbol`)}function Se(e){Kt(e,"quote");for(let n of["venue","chain","instrument","tier","symbolRaw","symbol","side","requestedSize",...Rb,"costAccounted","capturedAt","blockOrSeq","raw"])Mb(e,n,"quote");Un(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"),Wr(e.instrument,YN,"quote.instrument"),Wr(e.tier,XN,"quote.tier"),Un(e.symbolRaw,"quote.symbolRaw"),Un(e.symbol,"quote.symbol"),Wr(e.side,QN,"quote.side"),Il(e.requestedSize,"quote.requestedSize"),e.requestedSize.mantissa<0n&&Y("quote.requestedSize","must not be negative");let t=0;for(let n of eC)Object.hasOwn(e,n)&&(Il(e[n],`quote.${n}`),t+=1);t===0&&Y("quote","must contain at least one of bid, ask, mid, mark");for(let n of Rb)Il(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"),_l(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"),Kt(e.raw,"quote.raw"),e}function Pl(e){Kt(e,"rankResult");for(let t of["rankedOn","ranked","winner","runnersUp","improvementBps","sourcesAnswered","sourcesTried","failed","excluded","darkWindow","instrumentMix","bestPreparable"])Mb(e,t,"rankResult");return Wr(e.rankedOn,JN,"rankResult.rankedOn"),Array.isArray(e.ranked)||Y("rankResult.ranked","must be an array"),e.ranked.forEach((t,n)=>Xi(t,`rankResult.ranked[${n}]`)),Xi(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)=>Xi(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"),_l(e.sourcesAnswered,"rankResult.sourcesAnswered"),_l(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)=>$b(t,`failed[${n}]`)),Array.isArray(e.excluded)||Y("rankResult.excluded","must be an array"),e.excluded.forEach((t,n)=>$b(t,`excluded[${n}]`)),e.darkWindow!==null&&Kt(e.darkWindow,"rankResult.darkWindow"),Wr(e.instrumentMix,ZN,"rankResult.instrumentMix"),Xi(e.bestPreparable,"rankResult.bestPreparable",!0),Object.hasOwn(e,"carry")&&e.carry!==null&&Kt(e.carry,"rankResult.carry"),e}var nC="arcus_perp",rC="robinhood-4663",oC="quote-only",Qi="0.00000480324074074";function Ub(){return Ie().venues.arcus}function iC(){return Object.keys(Ub().markets).sort()}function sC({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=Ub().markets[r];if(!o)return null;let i=De(o.mark,`${r}.mark`),s=oe(o.oracle),a=oe(o.fundingHourly),c=n===null?D("0"):n,l={venue:nC,chain:rC,instrument:"perp",tier:oC,symbolRaw:e,symbol:r,side:t,requestedSize:c,mark:i,fees:null,gasEstimate:null,priceImpact:null,fundingHourly:a,costAccounted:!1,capturedAt:Ie().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:Qi,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 Ji({side:e="buy",sizeUsd:t=null}={}){return iC().map(n=>sC({symbol:n,side:e,sizeUsd:t})).filter(n=>n!==null)}var Bb=36e5,JB=24*365;function Nl(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 Db(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=aC(r,t),c=t-a,l=D(Qi),u=Nl(i,c),d=Nl(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:Ue(m),confidence:"estimate",darkHours:a,litHours:c,darkWindowRate:Qi,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=Nl(i,t);return{model:"current-funding-held-constant",horizonHours:t,carryBps:s,carryBpsDisplay:Ue(s),confidence:"estimate",compounding:"ignored",compoundingErrorBoundNote:"simple sum; at 30d and 1e-5/h the ignored compound is under 0.5bp"}}function aC(e,t){if(t<=0)return 0;let n=0,r=Math.floor(t);for(let o=0;o<r;o+=1)Al(e+o*Bb)&&(n+=1);return t>r&&Al(e+r*Bb)&&(n+=t-r),n}function cC(e){return e.mid??e.mark??e.ask??e.bid??null}function lC(e){let t=cC(e);if(t===null)return null;let n=e.costAccounted===!0,r=D("0");e.fees!==null?r=kt(r,e.fees):n=!1,e.priceImpact!==null?r=kt(r,e.priceImpact):e.requestedSize&&e.requestedSize.mantissa>0n&&(n=!1),e.gasEstimate===null?n=!1:r=kt(r,e.gasEstimate);let o;if(e.fees!==null&&vt(e.fees,D("1"))<0&&vt(e.fees,D("0"))>=0){let i=kt(D("1"),e.fees);o=xe(t,i),e.priceImpact!==null&&(o=kt(o,xe(t,e.priceImpact)))}else o=kt(t,r);return{net:o,costAccounted:n,px:t}}function uC(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 dC(e,t){if(!e||!t||!e.costAccounted||!t.costAccounted||e.instrument!==t.instrument||e.net.mantissa===0n)return null;let n=Vr(t.net,e.net);return Be(xe(n,fe(10000n,0)),t.net,4)}function Cl(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=Yi(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=lC(I);if(R===null)continue;let _=null;if(l&&I.instrument==="perp"&&(_=Db(I,c,{nowMs:n}),_.carryBps!==null)){let v=kt(D("1"),Be(_.carryBps,fe(10000n,0),12));R.net=xe(R.net,v),R.costAccounted=!1}u.push(uC(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 _=vt(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:dC(m,f[0]),k=u.find(I=>I.tier==="prepare")??null,x=zr(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"},E=null;l&&(E=pC(u));let C={rankedOn:g,ranked:h,winner:m,runnersUp:f,improvementBps:b===null?null:Number(Ue(b)),sourcesAnswered:s,sourcesTried:r,failed:a,excluded:i,darkWindow:w,instrumentMix:p,bestPreparable:k,carry:m?.carry??null,breakEvenHorizonHours:E};return Pl(C)}function pC(e){let t=e.filter(i=>i.instrument==="spot").sort((i,s)=>vt(i.net,s.net))[0],n=e.filter(i=>i.instrument==="perp").sort((i,s)=>vt(i.net,s.net))[0];if(!t||!n||n.fundingHourly===null)return null;let r=Vr(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=Be(r,o,4),s=Number(Ue(i));return!Number.isFinite(s)||s<0?null:s}catch{return null}}var mC="rh_uniswap",fC=4663,hC="prepare",gC=1n<<192n,Bn=18,yC=Object.freeze({v3:180000n,v4:240000n});function Tl(){return Wi()}function bC(e){return{mantissa:e*e*10n**BigInt(Bn)/gC,scale:Bn}}function wC(e){let t=bC(BigInt(e.sqrtPriceX96)),n=e.quote==="USDG"?6:18,r=18;if(e.quoteIsToken0){let o=Be(xe(t,fe(10n**BigInt(n),0)),fe(10n**BigInt(r),0),Bn);return o.mantissa===0n?null:Be(D("1"),o,Bn)}return Be(xe(t,fe(10n**BigInt(r),0)),fe(10n**BigInt(n),0),Bn)}function xC(e){let t=yb(),n=t.assets[e];return n?fe(n.rawPrice,t.oracleScaleExp):null}function SC(e,t){if(e===null||t===null||e.mantissa<=0n||t.mantissa<=0n)return null;let n={...e};return Be(t,kC(n,t),Bn)}function kC(e,t){let n=Math.max(e.scale,t.scale);return{mantissa:jr(e,n).mantissa+jr(t,n).mantissa,scale:n}}function vC(e){let t=Tl(),n=yC[e];return n?{wei:BigInt(t.gasPriceWei)*n,units:n,native:"ETH"}:null}function Ol(){return Object.keys(Tl().pools).sort()}function Dn({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=Tl(),o=r.pools[e];if(!o)return null;let i=wC(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:Be(fe(BigInt(o.feePpm),0),fe(1000000n,0),8),l=a.mantissa===0n?D("0"):SC(s,a),u=vC(o.version),m={venue:mC,chain:fC,instrument:"spot",tier:hC,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=xC(e);return f!==null&&(m.referencePrice=f,m.referenceBasisBps=Ue(Be(xe(Vr(i,f),fe(10000n,0)),f,4))),Se(m)}function Fb({side:e="buy",sizeUsd:t=null}={}){return Ol().map(n=>Dn({symbol:n,side:e,sizeUsd:t})).filter(n=>n!==null)}var qb=12e4,EC="0x0000000000000000000000000000000000000000",AC="0x84b75b19A3cdf8E2F56d0507d22D442847B2053C";function Rl(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=Dn({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>qb)throw new Error(`quote is stale (${a}ms old, bound ${qb}ms); re-quote before preparing`);let l=Wi().pools[t],u=l.version==="v4"?AC:EC,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 IC="hyperliquid_hip3",_C="hyperliquid",PC="quote-only";function Gr(){return Ie().venues.hyperliquid_hip3}function Hb(){return Object.keys(Gr().dexs).sort()}function NC(){let e=[];for(let[t,n]of Object.entries(Gr().dexs))for(let r of Object.keys(n))e.push(`${t}:${r}`);return e.sort()}function CC(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=Gr().dexs[r]?.[o];return i?[{dex:r,ticker:o,market:i}]:[]}let n=[];for(let[r,o]of Object.entries(Gr().dexs))Object.hasOwn(o,e)&&n.push({dex:r,ticker:e,market:o[e]});return n}function TC(e,t){try{return kb().books[`${e}:${t}`]??null}catch{return null}}function OC(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(Ue(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 RC(e,t,n,r){let o=OC(e,t,n);if(!o)return{impact:null,depth:null};let i=Number(Ue(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 jb({dex:e,ticker:t,market:n,side:r,size:o}){let i=De(n.mark,`${e}:${t}.mark`),s=oe(n.fundingHourly),a=oe(n.vol24h),c=oe(n.oi),l=o===null?D("0"):o,u=TC(e,t),d=null,p=null,m="fees and gas not captured";if(l.mantissa>0n)if(u){let g=RC(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:IC,chain:_C,instrument:"perp",tier:PC,symbolRaw:`${e}:${t}`,symbol:t,side:r,requestedSize:l,mark:i,fees:null,gasEstimate:null,priceImpact:d,fundingHourly:s,costAccounted:!1,capturedAt:Ie().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 Vb({symbol:e,side:t="buy",sizeUsd:n=null}={}){let r=CC(e);return r.length===0||r.length>1?null:jb({...r[0],side:t,size:n})}function Zi({side:e="buy",sizeUsd:t=null,ticker:n=null}={}){let r=[];for(let o of NC()){let[i,s]=o.split(":");if(n!==null&&s!==n)continue;let a=Gr().dexs[i][s];r.push(jb({dex:i,ticker:s,market:a,side:e,size:t}))}return r}var $C="arcus_spot",LC="robinhood-4663",MC="quote-only";function zb(){return Ie().venues.arcus_spot}function UC(){return Object.keys(zb().pairs).sort()}function BC({symbol:e,side:t="buy",sizeUsd:n=null}={}){if(typeof e!="string"||e.length===0)return null;let r=zb().pairs[e];if(!r)return null;let o=r.bid===void 0||r.bid===null?null:De(r.bid,`${e}.bid`),i=r.ask===void 0||r.ask===null?null:De(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:$C,chain:LC,instrument:"spot",tier:MC,symbolRaw:e,symbol:e,side:t,requestedSize:c,fees:l,gasEstimate:null,priceImpact:null,fundingHourly:null,costAccounted:!1,capturedAt:Ie().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 es({side:e="buy",sizeUsd:t=null}={}){return UC().map(n=>BC({symbol:n,side:e,sizeUsd:t})).filter(n=>n!==null)}var DC="solana_xstocks",FC="solana",qC="quote-only",Wb=25e3;function ts(){return xb()}function $l(){return Object.keys(ts().tokens).sort()}function HC(e){let t=ts().pairs[e];return!t||t.length===0?null:[...t].sort((n,r)=>(r.liquidityUsd??0)-(n.liquidityUsd??0))[0]}function jC(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 Ll({symbol:e,side:t="buy",sizeUsd:n=null}={}){if(typeof e!="string"||e.length===0)return null;let r=e,o=e,i=ts().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=HC(r);if(!s||!a)return null;let c=De(a.priceUsd,`${r}.priceUsd`),l=oe(a.liquidityUsd),u=n===null?D("0"):n,d=u.mantissa===0n?D("0"):jC(l,u),p=!1;u.mantissa===0n&&(a.liquidityUsd??0)>=Wb&&(p=!1);let m={venue:DC,chain:FC,instrument:"spot",tier:qC,symbolRaw:o,symbol:r,side:t,requestedSize:u,mid:c,fees:null,gasEstimate:null,priceImpact:d,fundingHourly:null,costAccounted:p,capturedAt:ts().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)<Wb}};return Se(m)}function Gb({side:e="buy",sizeUsd:t=null}={}){return $l().map(n=>Ll({symbol:n,side:e,sizeUsd:t})).filter(n=>n!==null)}var VC="ton_stonfi",zC="ton",WC="quote-only",GC=25e3,KC=.01;function ns(){return Sb()}function Ml(){return Object.keys(ns().tokens).sort()}function YC(e){let t=ns().pairs[e];return!t||t.length===0?null:[...t].sort((n,r)=>(r.liquidityUsd??0)-(n.liquidityUsd??0))[0]}function XC(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 Ul({symbol:e,side:t="buy",sizeUsd:n=null}={}){if(typeof e!="string"||e.length===0)return null;let r=e,o=e,i=ns().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=YC(r);if(!s||!a)return null;let c=De(a.priceUsd,`${r}.priceUsd`),l=oe(a.liquidityUsd),u=n===null?D("0"):n,d=u.mantissa===0n?D("0"):XC(l,u),m={venue:VC,chain:zC,instrument:"spot",tier:WC,symbolRaw:o,symbol:r,side:t,requestedSize:u,mid:c,fees:null,gasEstimate:null,priceImpact:d,fundingHourly:null,costAccounted:!1,capturedAt:ns().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)<GC,impactSizeFractionHint:KC}};return Se(m)}function Kb({side:e="buy",sizeUsd:t=null}={}){return Ml().map(n=>Ul({symbol:n,side:e,sizeUsd:t})).filter(n=>n!==null)}var Yb=3600*1e3;function Bl(e){return e==null||e===""?null:typeof e=="object"&&e&&typeof e.mantissa=="bigint"?e:D(String(e))}function Xb(e,{sizeUsd:t=null}={}){if(typeof e!="string"||!e.trim())throw new TypeError("ticker is required");let n=e.trim().toUpperCase(),r=Bl(t),o=[],i=Vb({symbol:`xyz:${n}`,sizeUsd:r});if(i)o.push(i);else for(let l of Zi({ticker:n,sizeUsd:r}))o.push(l);for(let l of Ji({sizeUsd:r}))l.symbol===n&&o.push(l);for(let l of es({sizeUsd:r}))l.symbol===n&&o.push(l);let s=Dn({symbol:n,sizeUsd:r});s&&o.push(s);let a=Ll({symbol:n,sizeUsd:r});a&&o.push(a);let c=Ul({symbol:n,sizeUsd:r});return c&&o.push(c),o}function QC(e={}){let t=String(e.ticker||e.symbol||"").trim().toUpperCase();if(!t)throw new Error("bestEquityRoute requires ticker");let n=Bl(e.sizeUsd??e.size??null),r=Xb(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=Cl(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>Yb}}function JC(){let e=[{venue:"hyperliquid_hip3",tier:"quote-only",chain:"hyperliquid",n:Zi().length},{venue:"arcus_perp",tier:"quote-only",chain:"robinhood-4663",n:Ji().length},{venue:"arcus_spot",tier:"quote-only",chain:"robinhood-4663",n:es().length},{venue:"rh_uniswap",tier:"prepare",chain:4663,n:Ol().length},{venue:"solana_xstocks",tier:"quote-only",chain:"solana",n:$l().length},{venue:"ton_stonfi",tier:"quote-only",chain:"ton",n:Ml().length}],t=[...Zi(),...Ji(),...es(),...Fb(),...Gb(),...Kb()],n=(t[0]?.capturedAt??Date.now())+1e3,{survivors:r,excluded:o}=Yi(t,{nowMs:n});return{inventory:e,hip3Dexs:Hb(),liveness:{survivors:r.length,excluded:o.length,byReason:o.reduce((i,s)=>(i[s.reason]=(i[s.reason]??0)+1,i),{})},capturedAt:Ie().capturedAt,custody:"prepare-only",note:"quote-only venues are ranked for discovery; only rh_uniswap is preparable in v1"}}function ZC(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=Bl(e.sizeUsd??e.size??null),o=Dn({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=Rl({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>Yb}}catch(i){return{ok:!1,failureKind:"prepare-refused",ticker:t,error:String(i.message||i)}}}function eT(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"}),tT=5e3,nT=1500;function rT(e,t){return t===0n?null:Number((t-e)*10000n/t)}function oT(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 Zb(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=oT(e.amountIn,"amountIn"),s;try{s=await t.quote({chainId:o,inputMint:r,outputMint:n,amount:i.toString(),side:"buy"})}catch(p){return It(ue.UNKNOWN,`buy leg could not be quoted: ${Jb(p)}`,{chainId:o,token:n,base:r})}let a=Qb(s?.outAmount);if(a==null||a===0n)return It(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 It(ue.HONEYPOT,`buy routes but the SELL leg fails to quote (${Jb(p)}) \u2014 you would not be able to exit`,{chainId:o,token:n,base:r,tokensOut:a.toString()})}let l=Qb(c?.outAmount);if(l==null||l===0n)return It(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=rT(l,i),d={chainId:o,token:n,base:r,amountIn:i.toString(),tokensOut:a.toString(),roundTripOut:l.toString(),roundTripLossBps:u};return u==null?It(ue.UNKNOWN,"could not compute round-trip loss",d):u>=tT?It(ue.HONEYPOT,`round trip loses ${(u/100).toFixed(1)}% \u2014 a sell tax or rigged curve, not normal slippage`,d):u>=nT?It(ue.CAUTION,`round trip loses ${(u/100).toFixed(1)}% \u2014 high tax or thin liquidity`,d):It(ue.SAFE,`round trip loses ${(u/100).toFixed(1)}% \u2014 exit path looks normal`,d)}function It(e,t,n){return{status:e,safe:e===ue.SAFE,tradable:e===ue.SAFE||e===ue.CAUTION,reason:t,...n}}function Qb(e){if(e==null)return null;try{let t=String(e).trim();return/^\d+$/.test(t)?BigInt(t):null}catch{return null}}function Jb(e){return String(e?.message||e).slice(0,120)}async function iT(e={},t={}){let n=await Zb(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 _t=Object.freeze({ALERT_ONLY:"alert_only",EXECUTE:"execute"}),sT=new Set(["watch","watch this","ping","ping me","alert","notify"]),aT=new Set(["watching","armed"]);function ew(e){if(typeof e!="string"||!e.trim())throw new TypeError("explicit action verb required");let t=e.trim().toLowerCase().replace(/\s+/g," ");if(sT.has(t))return _t.ALERT_ONLY;if(t==="arm")return _t.EXECUTE;throw new TypeError(`unsupported action verb: ${t}`)}function cT(e={}){let{verb:t,...n}=e;return{...n,active:!0,actionMode:ew(t)}}function lT(e){if(!e||typeof e!="object"||typeof e.active!="boolean")throw new TypeError("active must be boolean");if(!Object.values(_t).includes(e.actionMode))throw new TypeError("actionMode must be alert_only or execute");return e}function uT(e){return e?.active===!0&&e?.actionMode===_t.ALERT_ONLY}function dT(e){return e?.active===!0&&e?.actionMode===_t.EXECUTE}function pT(e={}){if(e.actionMode!==void 0&&e.actionMode!==_t.ALERT_ONLY)throw new TypeError("non-alert record cannot enter alert-only watch migration");let t=typeof e.active=="boolean"?e.active:aT.has(String(e.status||"").toLowerCase());return{...e,active:t,actionMode:_t.ALERT_ONLY}}import{createHash as mT}from"node:crypto";var Dl=1,tw=Object.freeze(["chainId","agentAddress","accountAddress","actions","targets","maxValueWei","maxGasWei","maxSlippageBps","expiresAt","nonce","revocationKey"]),fT=Object.freeze(["read","simulate"]),nw=1e4,rw=1440*60,ow=128,iw=256,sw=64,aw=256,cw=/^0x[0-9a-fA-F]{40}$/,hT=/^[a-z][a-z0-9_-]*:[a-z0-9._-]+$/,gT=/^[a-z][a-z0-9_-]*:\*$/,yT=/^[A-Za-z0-9._:-]+$/,bT=/^[A-Za-z0-9._:-]+$/,lw=/^(0|[1-9][0-9]*)$/,Kr=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 wT(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function xT(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 lw.test(t)?t:null}return null}function Fn(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(!lw.test(t))return null;let n=Number(t);return Number.isSafeInteger(n)?n:null}return null}function uw(e){let t=String(e).split(":")[0];return fT.includes(t)}function dw(e,t={}){let n=[],r=(d,p)=>n.push({field:d,message:p});if(!wT(e))return r("grant","grant must be a plain object"),{ok:!1,errors:n,grant:null};for(let d of Object.keys(e))tw.includes(d)||r(d,"unknown field is not allowed");for(let d of tw)(!(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=Fn(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"||!cw.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>sw)r("actions",`too many actions (max ${sw})`);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&&gT.test(m)?d.push(m):r("actions",`broad wildcard action "${m}" is rejected (fail closed)`);continue}if(!hT.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>aw)r("targets",`too many targets (max ${aw})`);else{let d=[];for(let p of e.targets){let m=typeof p=="string"?p.trim():null;if(!m||!cw.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=>!uw(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=xT(e[d]);p==null?r(d,"must be a non-negative integer wei amount"):o[d]=p}let s=Fn(e.maxSlippageBps);s==null||s>nw?r("maxSlippageBps",`must be an integer between 0 and ${nw}`):o.maxSlippageBps=s;let a=864e10,c=Fn(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=Fn(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>rw&&r("expiresAt",`grant exceeds the hard 24-hour TTL (${rw} seconds)`)}let l=typeof e.nonce=="string"?e.nonce.trim():Fn(e.nonce)!=null?String(Fn(e.nonce)):null;!l||l.length>ow||!yT.test(l)?r("nonce",`must be a non-empty string (max ${ow} chars, [A-Za-z0-9._:-])`):o.nonce=l;let u=typeof e.revocationKey=="string"?e.revocationKey.trim():null;return!u||u.length>iw||!bT.test(u)?r("revocationKey",`must be a non-empty public identifier (max ${iw} chars, [A-Za-z0-9._:-])`):o.revocationKey=u,n.length?{ok:!1,errors:n,grant:null}:{ok:!0,errors:[],grant:o}}function Fl(e,t={}){let{ok:n,errors:r,grant:o}=dw(e,t);if(!n)throw new Kr(r);return o}function ql(e,t={}){let n=Fl(e,t),o=Object.keys(n).sort().map(i=>`${JSON.stringify(i)}:${JSON.stringify(n[i])}`);return`{"version":${Dl},${o.join(",")}}`}function pw(e,t={}){return mT("sha256").update(ql(e,t),"utf8").digest("hex")}var mw=new Set(["read:markets","read:nfts","read:positions","watch:contracts","prepare:trade","prepare:mint","prepare:build","build:factory","agent:shadow","agent:execute"]),ST="agent:execute",kT="build:factory",fw=["read:markets","read:nfts","read:positions","watch:contracts","prepare:trade","prepare:mint","prepare:build","agent:shadow"];function vT(e){let t=Array.isArray(e)&&e.length?e:fw,n=[...new Set(t.map(o=>String(o).trim()).filter(Boolean))],r=n.filter(o=>!mw.has(o));if(r.length)throw new Error(`Invalid scope: ${r.join(", ")}`);return n}var hw=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 gw(){return hw.filter(e=>e.website)}var ET="@oracle-agent/oracle",AT="npx",IT=["-y","--package",ET,"oracle-data-mcp"],bw=/(?:^|_)(?:PRIVATE_KEY|SECRET|TOKEN|PASSWORD|PASSPHRASE|MNEMONIC|SEED)(?:_|$)/i;function jl(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 _T(e){let t=jl(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(bw.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 PT(e){let t=jl(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 NT(e){let t=jl(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(bw.test(t))throw new TypeError("label must not be a secret-shaped environment name");return t}function _e(e){return`${JSON.stringify(e,null,2)}
|
|
189
|
+
`}function Hl(e){return JSON.stringify(e)}function Yr(e){return JSON.stringify(e)}function yw(e,t){return["mcp_servers:",` ${e}:`,` command: ${Hl(t.command)}`," args:",...t.args.map(n=>` - ${Hl(n)}`)," env:",...Object.entries(t.env).map(([n,r])=>` ${n}: ${Hl(r)}`),""].join(`
|
|
190
|
+
`)}function CT(e,t){return[`[mcp_servers.${Yr(e)}]`,`command = ${Yr(t.command)}`,`args = [${t.args.map(Yr).join(", ")}]`,"",`[mcp_servers.${Yr(e)}.env]`,...Object.entries(t.env).map(([n,r])=>`${n} = ${Yr(r)}`),""].join(`
|
|
191
|
+
`)}function TT(){return["# Oracle native harness (default)","npm i -g @oracle-agent/oracle","oracle setup model","oracle chat",""].join(`
|
|
192
|
+
`)}function ww({url:e,key:t,label:n="oracle-data"}={}){let r=_T(e),o=PT(t),i=NT(n),s={command:AT,args:[...IT],env:{ORACLE_DATA_URL:r,ORACLE_AGENT_KEY:o}},a={mcpServers:{[i]:s}},c={hermes:yw(i,s),claudeCode:_e(a),codex:CT(i,s),cursor:_e(a),genericMcp:_e(a),oracleNative:TT(),chatgpt:_e(a),claudeDesktop:_e(a),windsurf:_e(a),vscode:_e(a),openclaw:_e(a),perplexity:_e(a),manus:_e(a),prime:yw(i,s),opencode:_e(a)};for(let l of gw()){if(l.kind==="oracle")continue;let u=l.configKey||l.id;c[u]||(c[u]=_e(a))}return c}var OT=ww;var xw=Object.freeze({assetHighPct:50,assetMediumPct:25,chainHighPct:75,venueHighPct:60,stablecoinHighPct:70}),RT=new Set(["USDC","USDT","USDT0","DAI","FRAX","LUSD","TUSD","USDP","GUSD","PYUSD","USDE"]);function Sw(e){if(e===null||e===""||e===void 0)return null;let t=Number(e);return Number.isFinite(t)&&t>=0?t:null}function Xr(e){return Math.round((e+Number.EPSILON)*1e8)/1e8}function zl(e,t){return t>0?Xr(e/t*100):null}function Wl(e){return e.address||e.owner||e.walletAddress||e.wallet?.address||null}function $T(e){let t=Array.isArray(e)?e:Array.isArray(e?.entries)?e.entries:[],n=new Map;for(let r of t){if(!r?.address)continue;let o=String(r.address).toLowerCase();n.has(o)||n.set(o,r)}return n}function Yt(e,t,n={}){if(!t||typeof t!="object")return;let r=String(t.symbol??t.coin??t.name??t.collection??t.tokenId??"unknown"),o=Sw(t.usdValue??t.valueUsd??t.knownUsd??t.estimatedValueUsd??t.floorValueUsd),i=t.kind==="nft"||t.type==="nft"||t.collection||t.tokenId!=null?"nft":"fungible";e.push({symbol:r,usdValue:o,chain:String(t.chain??t.chainName??n.chain??"unknown"),venue:String(t.venue??t.protocol??t.platform??n.venue??"wallet"),address:t.address??n.address??null,kind:i,stablecoin:t.stablecoin===!0||RT.has(r.toUpperCase())})}function LT(e){let t=[],n=Wl(e);for(let r of e.assets||e.holdings||[])Yt(t,r,{address:n,chain:e.chain,venue:e.venue});for(let r of e.chains||[]){let o=r.chain??r.name??r.slug??(r.chainId!=null?String(r.chainId):r.family)??"unknown",i={address:r.address??n,chain:o,venue:r.venue};r.native&&(r.native.amount==null||Number(r.native.amount)!==0)&&Yt(t,{...r.native,symbol:r.native.symbol??r.symbol??o},i);for(let a of r.assets||r.fungibleTokens?.assets||[])Yt(t,a,i);for(let a of r.collectibles?.assets||r.nfts||[])Yt(t,{...a,kind:"nft"},i);for(let a of r.spot?.balances||[])Yt(t,a,{...i,venue:"Hyperliquid spot"});let s=Sw(r.perps?.accountValueUsd);s!=null&&Yt(t,{symbol:"perps account",usdValue:s},{...i,venue:"Hyperliquid perps"})}for(let r of e.inventory?.items||e.nfts?.items||[])Yt(t,{...r,kind:"nft"},{address:n,chain:r.chain??e.chain,venue:r.marketplace??e.venue});return t}function MT(e,t){let n=Wl(e),r=e.chain??e.chainId??e.family??"*";return n?`${String(n).toLowerCase()}|${String(r).toLowerCase()}`:`snapshot:${t}`}function Vl(e,t,n){let r=new Map;for(let o of e){if(o.usdValue==null)continue;let i=o[t];r.set(i,(r.get(i)||0)+o.usdValue)}return[...r].map(([o,i])=>({name:o,knownUsd:Xr(i),percentOfKnown:zl(i,n)})).sort((o,i)=>i.knownUsd-o.knownUsd||o.name.localeCompare(i.name))}function rs(e={},t={}){let n=Array.isArray(e)?e:Array.isArray(e.snapshots)?e.snapshots:e.snapshot?[e.snapshot]:[],r=$T(t.labels??t.addressBook??e.labels??e.addressBook),o={...xw,...e.thresholds||{},...t.thresholds||{}},i=[],s=new Set,a=0;n.forEach((v,q)=>{if(!v||typeof v!="object")return;let ge=MT(v,q);s.has(ge)?a+=1:(s.add(ge),i.push(v))});let c=i.flatMap(LT),l=c.filter(v=>v.usdValue!=null),u=c.filter(v=>v.usdValue==null),d=i.reduce((v,q)=>v+Number(q.valuation?.unpricedNonzeroItems||q.unpricedNonzeroItems||0),0),p=Xr(l.reduce((v,q)=>v+q.usdValue,0)),m=u.length+d,f=Vl(l,"chain",p),h=Vl(l,"venue",p),g=Vl(l,"symbol",p);for(let v of f)v.chain=v.name;for(let v of h)v.venue=v.name;for(let v of g)v.asset=v.name,v.symbol=v.name;let b=Xr(l.filter(v=>v.stablecoin).reduce((v,q)=>v+q.usdValue,0)),k=c.filter(v=>v.kind==="nft"),x=i.reduce((v,q)=>v+Number(q.valuation?.nftUnvaluedItems||0),0),w=k.filter(v=>v.usdValue==null).length+x,E=k.filter(v=>v.usdValue!=null).length,C=g[0]||null,I=C?C.percentOfKnown>=o.assetHighPct?"high":C.percentOfKnown>=o.assetMediumPct?"medium":"low":"unknown",R=[];m&&R.push(`${m} nonzero holding(s) have unknown USD value; they are excluded from totals and percentages.`),w&&R.push("NFT valuation coverage is partial; estimates are not executable bids and unvalued NFTs are not treated as zero."),a&&R.push(`${a} duplicate address/chain snapshot(s) were ignored.`),C&&I!=="low"&&R.push(`Asset concentration is ${I}: ${C.name} is ${C.percentOfKnown}% of known value.`),f[0]?.percentOfKnown>=o.chainHighPct&&R.push(`Chain concentration is high: ${f[0].name} is ${f[0].percentOfKnown}% of known value.`),h[0]?.percentOfKnown>=o.venueHighPct&&R.push(`Venue concentration is high: ${h[0].name} is ${h[0].percentOfKnown}% of known value.`);let _=i.map(Wl).filter(Boolean).map(v=>{let q=r.get(String(v).toLowerCase());return{address:v,label:q?.label??null,who:q?.who??null,role:q?.role??null}});return{totalKnownUsd:p,coverage:{complete:i.length>0&&m===0&&i.every(v=>v.valuation?.complete!==!1&&v.coverage?.complete!==!1),label:m===0&&i.length&&i.every(v=>v.valuation?.complete!==!1&&v.coverage?.complete!==!1)?"complete for the supplied snapshots":"known priced value only; portfolio coverage is partial or unverified",unknownUsd:m?null:0,pricedItemCount:l.length,unknownItemCount:m,snapshotCount:i.length,duplicatesIgnored:a},chainExposures:f,venueExposures:h,topAssets:g.slice(0,Math.max(1,Number(t.topAssets??e.topAssets??10))),concentrationRisk:{level:I,topAsset:C?.name??null,topAssetPercent:C?.percentOfKnown??null,thresholds:{mediumPct:o.assetMediumPct,highPct:o.assetHighPct}},stablecoinExposure:{knownUsd:b,percentOfKnown:zl(b,p),high:p>0&&zl(b,p)>=o.stablecoinHighPct},nftCoverage:{status:k.length||x?w?"partial":"valued":"not-observed",valuedItems:E,unvaluedItems:w,knownUsd:Xr(k.filter(v=>v.usdValue!=null).reduce((v,q)=>v+q.usdValue,0))},addresses:_,warnings:[...new Set(R)]}}var UT=rs;var de=(e,t=0)=>Number.isFinite(Number(e))?Number(e):t,Fe=e=>Math.round((e+Number.EPSILON)*1e8)/1e8,re=(e,t="unknown")=>String(e??t).trim().toLowerCase(),Qe=e=>e.asset??e.symbol??e.coin,vw=e=>e.address??e.owner??e.account,is=e=>[re(e.chain??e.chainId),re(vw(e)),re(Qe(e)),re(e.source)].join("|");function kw(e){return de(e.asOf??e.updatedAt??e.timestamp,0)}function BT(e){let t=e.fillId??e.tradeId??e.orderId??e.txHash??e.transactionHash??e.timestamp??e.asOf;return[is(e),re(t),re(e.side),de(e.quantity??e.amount??e.size),de(e.price??e.priceUsd)].join("|")}function os(e,t){let n=new Map,r=0;for(let o of e||[]){if(!o||typeof o!="object"||!Qe(o))continue;let i=t==="fill"?BT(o):is(o);n.has(i)?(r+=1,t!=="fill"&&kw(o)>kw(n.get(i))&&n.set(i,{...o,identity:i})):n.set(i,{...o,identity:i})}return{rows:[...n.values()].sort((o,i)=>o.identity.localeCompare(i.identity)),duplicatesIgnored:r}}function DT(e){let t=new Map;for(let n of e){let r=[is(n),`${re(n.chain??n.chainId)}|${re(Qe(n))}`,`*|${re(Qe(n))}`];for(let o of r)t.has(o)||t.set(o,n)}return t}function FT(e,t){return t.get(is(e))??t.get(`${re(e.chain??e.chainId)}|${re(Qe(e))}`)??t.get(`*|${re(Qe(e))}`)??null}function qT(e){let t=new Map,n=0;for(let r of e){let o=[re(r.chain??r.chainId),re(vw(r)),re(Qe(r))].join("|"),i=t.get(o)??{quantity:0,cost:0},s=Math.abs(de(r.quantity??r.amount??r.size)),a=de(r.price??r.priceUsd),c=de(r.feeUsd);if(re(r.side)==="sell"){let l=Math.min(s,i.quantity),u=i.quantity?i.cost/i.quantity:de(r.costBasisUsd)/(s||1);n+=l*(a-u)-c,i.quantity-=l,i.cost-=l*u}else i.quantity+=s,i.cost+=s*a+c;t.set(o,i)}return{realizedPnlUsd:Fe(n),lots:t}}function Gl(e={},t={}){let n=de(t.asOf??e.asOf,0),r=Math.max(0,de(t.priceTtlMs??e.priceTtlMs,6e4)),o=os(e.balances||[],"balance"),i=os(e.positions||[],"position"),s=os(e.fills||[],"fill"),a=os(e.prices||[],"price"),c=DT(a.rows),l=[],u=0,d=0;for(let _ of[...o.rows,...i.rows]){let v=FT(_,c),q=de(_.quantity??_.amount??_.size),ge=v?de(v.priceUsd??v.price,NaN):de(_.priceUsd,NaN);if(!Number.isFinite(ge)){d+=1;continue}let Ce=q*ge,Wn=de(v?.asOf??_.priceAsOf,0),Jt=n-Wn>r;Jt&&(u+=Math.abs(Ce)),l.push({..._,quantity:q,priceUsd:ge,valueUsd:Ce,stale:Jt,kind:i.rows.includes(_)?"position":"balance"})}let p=l.filter(_=>_.kind==="balance").reduce((_,v)=>_+v.valueUsd,0),m=l.filter(_=>_.kind==="position"),f=m.reduce((_,v)=>_+v.valueUsd,0),h=m.reduce((_,v)=>_+Math.abs(v.valueUsd),0),g=p+f,b=de(e.equityUsd,g),k=qT(s.rows).realizedPnlUsd,x=m.reduce((_,v)=>{let q=de(v.entryPriceUsd??v.averageEntryPrice??v.costBasisPrice,v.priceUsd);return _+v.quantity*(v.priceUsd-q)},0),w=new Map;for(let _ of l)w.set(re(Qe(_)),(w.get(re(Qe(_)))||0)+Math.abs(_.valueUsd));let E=[...w.values()].reduce((_,v)=>_+v,0),C=[...w].map(([_,v])=>({asset:_,exposureUsd:Fe(v),percent:E?Fe(v/E*100):null})).sort((_,v)=>v.exposureUsd-_.exposureUsd||_.asset.localeCompare(v.asset)),I=l.reduce((_,v)=>_+Math.abs(v.valueUsd),0),R=rs({snapshots:[{assets:l.map(_=>({symbol:Qe(_),usdValue:Math.abs(_.valueUsd),chain:_.chain,venue:_.source}))}],thresholds:e.thresholds});return Object.freeze({asOf:n,balances:o.rows,positions:i.rows,fills:s.rows,prices:a.rows,duplicatesIgnored:o.duplicatesIgnored+i.duplicatesIgnored+s.duplicatesIgnored+a.duplicatesIgnored,pnl:{realizedUsd:k,unrealizedUsd:Fe(x),totalUsd:Fe(k+x)},exposure:{grossUsd:Fe(h),netUsd:Fe(g),leverage:b>0?Fe(h/b):null,equityUsd:Fe(b)},concentration:C,priceCoverage:{pricedItems:l.length,unpricedItems:d,staleItems:l.filter(_=>_.stale).length,staleValueUsd:Fe(u),stalePercent:I?Fe(u/I*100):null,ttlMs:r},risk:R})}var HT=Gl,jT=Gl;import{createHash as KT}from"node:crypto";var Qr=class extends Error{constructor(t,n){super(`secret material must never appear in a public API object (at ${t}, rule: ${n})`),this.name="SecretLeakError",this.path=t,this.rule=n}},VT=/(private[_-]?key|secret|bearer|keystore|mnemonic|seed[_-]?phrase|passphrase|password|api[_-]?key|access[_-]?token|auth[_-]?token|session[_-]?token|signer[_-]?url|signature)/i,zT=Object.freeze(["privkey","wif","xprv","seed"]);function Ew(e){let t=String(e),n=t.toLowerCase().replace(/[\s._-]+/g,"");return VT.test(t)||zT.includes(n)}var WT=Object.freeze([{rule:"raw-32-byte-hex-key",re:/^0x[0-9a-fA-F]{64}$/},{rule:"raw-32-byte-hex-bare",re:/^[0-9a-fA-F]{64}$/},{rule:"extended-private-key",re:/\b(?:xprv|tprv|yprv|zprv)[1-9A-HJ-NP-Za-km-z]{107}\b/},{rule:"bitcoin-wif",re:/\b[59KLc][1-9A-HJ-NP-Za-km-z]{50,51}\b/},{rule:"bip39-mnemonic",re:/\b(?:[a-z]{3,8}\s+){11,23}[a-z]{3,8}\b/},{rule:"bearer-token",re:/bearer\s+[A-Za-z0-9._~+/=-]+/i},{rule:"pem-private-key",re:/-----BEGIN[A-Z ]*PRIVATE KEY-----/},{rule:"keystore-path",re:/keystore/i},{rule:"signer-url",re:/https?:\/\/\S*sign/i},{rule:"authorization-header",re:/authorization\s*:/i}]),GT=Object.freeze(["grantid","id","hash","sha256","sha256hex","checksum","txhash","transactionhash","blockhash","digest","userophash","commithash","prevhash","intenthash","canonicalhash","payloadhash","requestid"]);function Xt(e,t="$",n=new Set,r=""){if(e==null)return e;if(typeof e=="string"){let o=GT.includes(String(r).toLowerCase().replace(/[_-]/g,""));for(let{rule:i,re:s}of WT)if(!(o&&i.startsWith("raw-32-byte-hex"))&&s.test(e))throw new Qr(t,i);return e}if(typeof e!="object"||n.has(e)||(n.add(e),ArrayBuffer.isView(e)||e instanceof ArrayBuffer))return e;if(e instanceof Map){for(let[o,i]of e.entries()){if(typeof o=="string"&&Ew(o))throw new Qr(`${t}[${JSON.stringify(o)}]`,"forbidden-key-name");Xt(o,`${t}[key]`,n),Xt(i,`${t}[${String(o)}]`,n)}return e}if(e instanceof Set){let o=0;for(let i of e.values())Xt(i,`${t}[${o++}]`,n);return e}if(Array.isArray(e))return e.forEach((o,i)=>Xt(o,`${t}[${i}]`,n)),e;for(let[o,i]of Object.entries(e)){if(Ew(o))throw new Qr(`${t}.${o}`,"forbidden-key-name");Xt(i,`${t}.${o}`,n,o)}return e}var ss=Object.freeze(["intent","quote_comparison","simulation","prepared","approval","signed","broadcast","settlement","balance_delta","position"]),Yl=Object.freeze(Object.fromEntries(ss.map((e,t)=>[e,Object.freeze(t+1<ss.length?[ss[t+1]]:[])]))),Aw=new Set(["signed","broadcast"]);function Kl(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(Kl).join(",")}]`:`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${Kl(e[t])}`).join(",")}}`}function YT(e){return e===void 0?null:JSON.parse(JSON.stringify(e))}function as(e){if(e&&typeof e=="object"&&!Object.isFrozen(e)){Object.freeze(e);for(let t of Object.values(e))as(t)}return e}function Xl(e,t="fact"){try{Xt(e,t)}catch{throw new Error(`${t} contains custody material and is forbidden`)}}function Iw(e){return KT("sha256").update(Kl(e)).digest("hex")}function _w({tradeId:e,state:t,fact:n,asOf:r,previousHash:o,external:i}){let s={tradeId:e,state:t,asOf:r,previousHash:o??null,external:i===!0,fact:YT(n)};return as({...s,hash:Iw(s)})}function XT({tradeId:e,intent:t,asOf:n=0}={}){if(!e||typeof e!="string")throw new Error("tradeId is required");if(!t||typeof t!="object"||Array.isArray(t))throw new Error("intent fact is required");Xl(t,"intent");let r=_w({tradeId:e,state:"intent",fact:t,asOf:n,previousHash:null,external:!1});return as({tradeId:e,state:"intent",events:[r],headHash:r.hash,custody:"none",execution:"prepare-only"})}function Pw(e,t,n,r={}){if(Ql(e),!(Yl[e.state]||[]).includes(t))throw new Error(`invalid trade transition ${e.state} -> ${t}`);if(!n||typeof n!="object"||Array.isArray(n))throw new Error(`${t} fact is required`);Xl(n,t);let i=r.external===!0||r.externallySupplied===!0;if(Aw.has(t)&&!i)throw new Error(`${t} must be an externally supplied fact; this module never signs or broadcasts`);let s=e.events.at(-1),a=r.asOf??s.asOf;if(!Number.isFinite(Number(a))||Number(a)<Number(s.asOf))throw new Error("asOf must be finite and monotonic");let c=_w({tradeId:e.tradeId,state:t,fact:n,asOf:a,previousHash:s.hash,external:i});return as({...e,state:t,events:[...e.events,c],headHash:c.hash})}function Ql(e){if(!e||!Array.isArray(e.events)||e.events.length===0)throw new Error("invalid trade lifecycle");if(e.custody!=="none")throw new Error("trade lifecycle custody must be none");if(e.execution!=="prepare-only")throw new Error("trade lifecycle execution must be prepare-only");let t=null;for(let n=0;n<e.events.length;n+=1){let r=e.events[n],{hash:o,...i}=r;if(Iw(i)!==o)throw new Error(`trade event ${n} hash mismatch`);if(Xl(r.fact,`trade event ${n} fact`),!Number.isFinite(Number(r.asOf))||t&&Number(r.asOf)<Number(t.asOf))throw new Error(`trade event ${n} asOf must be finite and monotonic`);if(r.tradeId!==e.tradeId||r.previousHash!==t?.hash&&n>0)throw new Error(`trade event ${n} chain mismatch`);if(n===0&&(r.state!=="intent"||r.previousHash!==null))throw new Error("trade lifecycle must start with intent");if(t&&!Yl[t.state]?.includes(r.state))throw new Error(`invalid recorded transition ${t.state} -> ${r.state}`);if(Aw.has(r.state)&&r.external!==!0)throw new Error(`${r.state} is not externally supplied`);t=r}if(e.state!==t.state||e.headHash!==t.hash)throw new Error("trade lifecycle head mismatch");return!0}var QT=Pw,JT=Ql;function ZT(e){return Array.isArray(e)?e.map((t,n)=>typeof t=="function"?{id:t.name||`provider-${n}`,health:t}:t):Object.entries(e||{}).map(([t,n])=>({id:t,health:typeof n=="function"?n:n?.health}))}async function eO(e,t){let n;try{let r=new Promise((i,s)=>{n=setTimeout(()=>s(Object.assign(new Error(`health timeout after ${t}ms`),{code:"TIMEOUT"})),t)});return{detail:await Promise.race([Promise.resolve().then(()=>e.health()),r]),transportOk:!0}}catch(r){return{error:r?.message||String(r),timedOut:r?.code==="TIMEOUT",transportOk:!1}}finally{clearTimeout(n)}}function cs(e,t,n,r,o=!1){let i=Number(e??t);if(!Number.isFinite(i)||i<r||o&&!Number.isInteger(i)){let s=o?"a positive integer":r===Number.NEGATIVE_INFINITY?"finite":r===0?"a nonnegative finite number":"a positive finite number";throw new TypeError(`${n} must be ${s}`)}return i}async function Jl(e,t={}){let n=ZT(e),r=cs(t.concurrency,4,"concurrency",1,!0),o=cs(t.timeoutMs,5e3,"timeoutMs",Number.EPSILON),i=cs(t.asOf,Date.now(),"asOf",Number.NEGATIVE_INFINITY),s=cs(t.ttlMs,6e4,"ttlMs",0),a=new Array(n.length),c=0;async function l(){for(;c<n.length;){let d=c++,p=n[d];if(!p?.id||typeof p.health!="function"){a[d]={id:p?.id??`provider-${d}`,ok:!1,state:"error",stale:!1,asOf:i,ttlMs:s,error:"health function is required"};continue}let m=await eO(p,o),f=Number(m.detail?.asOf??m.detail?.updatedAt??i),h=m.transportOk&&i-f>s,g=!(m.detail&&typeof m.detail=="object"&&m.detail.ok===!1),b=m.transportOk&&g&&!h;a[d]={id:String(p.id),ok:b,state:m.timedOut?"timeout":!m.transportOk||!g?"error":h?"stale":"fresh",stale:h,asOf:f,checkedAsOf:i,ttlMs:s,...m.detail===void 0?{}:{detail:m.detail},...m.error?{error:m.error}:{}}}}await Promise.all(Array.from({length:Math.min(r,Math.max(1,n.length))},l));let u={fresh:0,stale:0,error:0,timeout:0};for(let d of a)u[d.state]+=1;return{ok:a.every(d=>d.ok),asOf:i,ttlMs:s,timeoutMs:o,counts:u,providers:a}}var tO=Jl,nO=Jl;import{createHash as rO}from"node:crypto";var Zl=1,Bw=/^[a-z0-9][a-z0-9._-]{0,63}$/,Dw=/^[A-Za-z0-9][A-Za-z0-9._-]{0,63}$/,oO=new Set(["open","high","low","close","volume","fundingRate","openInterest"]),iO=new Set(["sma","ema","rsi","macd","bollinger","atr"]),sO=new Set(["gt","gte","lt","lte","eq"]),aO=new Set(["and","or","not"]),cO=new Set(["above","below"]),lO=new Set(["line","signal","histogram"]),uO=new Set(["upper","middle","lower"]),eu=new Set(["compare","logic","cross"]),Nw=new Set(["version","id","name","venue","market","parameters","nodes","rules","risk"]),Cw=new Set(["value","min","max","step"]),tu=new Set(["entryLong","entryShort","exitLong","exitShort"]),Tw=new Set(["maxLeverage","maxNotionalUsd","positionSizePct","stopLossPct","takeProfitPct","cooldownBars","maxDailyLossPct","expiresAt"]),dO=new Set(["id","type"]),Ow={input:new Set(["id","type","field"]),constant:new Set(["id","type","value"]),indicator:new Set(["id","type","indicator","input","period","fastPeriod","slowPeriod","signalPeriod","stdDev","output"]),compare:new Set(["id","type","op","left","right"]),logic:new Set(["id","type","op","inputs"]),cross:new Set(["id","type","direction","left","right"])},Rw=16,$w=128,Lw=100,qn=class extends Error{constructor(t){let n=t.map(r=>`${r.path}: ${r.message}`);super(`invalid strategy (${t.length} error${t.length===1?"":"s"}): ${n.join("; ")}`),this.name="StrategyValidationError",this.errors=t}};function Pe(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function Z(e){return typeof e=="number"&&Number.isFinite(e)}function Mw(e){return Number.isInteger(e)&&e>0}function ru(e){if(e==null||typeof e!="object"||Object.isFrozen(e))return e;if(Array.isArray(e)){for(let t of e)ru(t);return Object.freeze(e)}for(let t of Object.keys(e))ru(e[t]);return Object.freeze(e)}function ou(e){if(Array.isArray(e))return e.map(ou);if(e!=null&&typeof e=="object"){let t={};for(let n of Object.keys(e).sort())t[n]=ou(e[n]);return t}return e}function A(e,t,n){e.push({path:t,message:n})}function Pt(e,t,n,r){for(let o of Object.keys(e))t.has(o)||A(r,n?`${n}.${o}`:o,"unknown field is not allowed")}function Fw(e,t,n,r){if(!Z(e)||!Z(t)||!Z(n)||!Z(r)||r<=0||e<t||e>n)return!1;let o=(e-t)/r;if(!Number.isFinite(o))return!1;let i=Math.round(o);return Math.abs(o-i)<=1e-9}function nu(e,t,n,r){if(Pe(e)){if(Pt(e,new Set(["param"]),t,r),typeof e.param!="string"||!e.param)return A(r,`${t}.param`,"must be a parameter name string"),null;if(!Object.prototype.hasOwnProperty.call(n,e.param))return A(r,`${t}.param`,`unknown parameter "${e.param}"`),null;let o=n[e.param];return!Pe(o)||![o.value,o.min,o.max,o.step].every(Mw)?(A(r,`${t}.param`,"referenced period parameter value min max and step must be positive integers"),null):{param:e.param}}return Mw(e)?e:(A(r,t,"must be a positive integer or {param}"),null)}function Uw(e,t,n,r){return Pe(e)?(Pt(e,new Set(["param"]),t,r),typeof e.param!="string"||!e.param?(A(r,`${t}.param`,"must be a parameter name string"),null):Object.prototype.hasOwnProperty.call(n,e.param)?{param:e.param}:(A(r,`${t}.param`,`unknown parameter "${e.param}"`),null)):Z(e)?e:(A(r,t,"must be a finite number or {param}"),null)}function ls(e){switch(e.type){case"input":case"constant":return[];case"indicator":return e.input?[e.input]:[];case"compare":case"cross":return[e.left,e.right].filter(Boolean);case"logic":return Array.isArray(e.inputs)?[...e.inputs]:[];default:return[]}}function pO(e){let t=new Map,n=r=>{let o=t.get(r)||0;if(o===1)return!0;if(o===2)return!1;t.set(r,1);let i=e.get(r);if(i){for(let s of ls(i))if(e.has(s)&&n(s))return!0}return t.set(r,2),!1};for(let r of e.keys())if(n(r))return!0;return!1}function mO(e,t){if(!Pe(e))return A(t,"parameters","must be a plain object"),null;let n=Object.keys(e);if(n.length>Rw)return A(t,"parameters",`too many parameters (max ${Rw})`),null;let r={};for(let o of n){if(!Bw.test(o)){A(t,`parameters.${o}`,"parameter name is malformed");continue}let i=e[o],s=`parameters.${o}`;if(!Pe(i)){A(t,s,"must be a plain object");continue}Pt(i,Cw,s,t);for(let d of Cw)d in i||A(t,`${s}.${d}`,"required field is missing");let{value:a,min:c,max:l,step:u}=i;Z(c)||A(t,`${s}.min`,"must be a finite number"),Z(l)||A(t,`${s}.max`,"must be a finite number"),(!Z(u)||u<=0)&&A(t,`${s}.step`,"must be a positive finite number"),Z(a)||A(t,`${s}.value`,"must be a finite number"),Z(c)&&Z(l)&&c>l&&A(t,`${s}.min`,"min must be <= max"),Z(a)&&Z(c)&&Z(l)&&Z(u)&&u>0&&(Fw(a,c,l,u)||A(t,`${s}.value`,"value must lie on the declared min/max/step grid")),r[o]={value:a,min:c,max:l,step:u}}return r}function fO(e,t,n,r){let o=`nodes.${t}`;if(!Pe(e))return A(r,o,"must be a plain object"),null;if(typeof e.type!="string"||!Ow[e.type])return A(r,`${o}.type`,"unknown or missing node type"),Pt(e,dO,o,r),null;switch(Pt(e,Ow[e.type],o,r),(typeof e.id!="string"||!Dw.test(e.id))&&A(r,`${o}.id`,"must be a 1-64 char id starting with alphanumeric"),e.type){case"input":return(typeof e.field!="string"||!oO.has(e.field))&&A(r,`${o}.field`,"must be one of open|high|low|close|volume|fundingRate|openInterest"),{id:e.id,type:"input",field:e.field};case"constant":{let i=Uw(e.value,`${o}.value`,n,r);return{id:e.id,type:"constant",value:i}}case"indicator":{(typeof e.indicator!="string"||!iO.has(e.indicator))&&A(r,`${o}.indicator`,"must be one of sma|ema|rsi|macd|bollinger|atr");let i=e.indicator,s={id:e.id,type:"indicator",indicator:i};if(i==="atr"){"input"in e&&(typeof e.input!="string"||!e.input?A(r,`${o}.input`,"must be a node id string when provided"):s.input=e.input);let a=nu(e.period,`${o}.period`,n,r);a!=null&&(s.period=a)}else typeof e.input!="string"||!e.input?A(r,`${o}.input`,"must be a node id string"):s.input=e.input;if((i==="sma"||i==="ema"||i==="rsi"||i==="bollinger"||i==="atr")&&("period"in e,i!=="macd"))if(!("period"in e))A(r,`${o}.period`,"required field is missing");else{let a=nu(e.period,`${o}.period`,n,r);a!=null&&(s.period=a)}if(i==="macd"){for(let a of["fastPeriod","slowPeriod","signalPeriod"])if(!(a in e))A(r,`${o}.${a}`,"required field is missing");else{let c=nu(e[a],`${o}.${a}`,n,r);c!=null&&(s[a]=c)}"output"in e?lO.has(e.output)?s.output=e.output:A(r,`${o}.output`,"must be line|signal|histogram"):A(r,`${o}.output`,"required field is missing"),"period"in e&&A(r,`${o}.period`,"forbidden for macd"),"stdDev"in e&&A(r,`${o}.stdDev`,"forbidden for macd")}else if(i==="bollinger"){if(!("stdDev"in e))A(r,`${o}.stdDev`,"required field is missing");else{let a=Uw(e.stdDev,`${o}.stdDev`,n,r);a!=null&&(typeof a=="number"&&a<=0?A(r,`${o}.stdDev`,"must be > 0"):s.stdDev=a)}"output"in e?uO.has(e.output)?s.output=e.output:A(r,`${o}.output`,"must be upper|middle|lower"):A(r,`${o}.output`,"required field is missing");for(let a of["fastPeriod","slowPeriod","signalPeriod"])a in e&&A(r,`${o}.${a}`,`forbidden for ${i}`)}else{"output"in e&&A(r,`${o}.output`,`forbidden for ${i}`),"stdDev"in e&&i!=="bollinger"&&A(r,`${o}.stdDev`,`forbidden for ${i}`);for(let a of["fastPeriod","slowPeriod","signalPeriod"])a in e&&A(r,`${o}.${a}`,`forbidden for ${i}`)}return s}case"compare":return(typeof e.op!="string"||!sO.has(e.op))&&A(r,`${o}.op`,"must be gt|gte|lt|lte|eq"),(typeof e.left!="string"||!e.left)&&A(r,`${o}.left`,"must be a node id"),(typeof e.right!="string"||!e.right)&&A(r,`${o}.right`,"must be a node id"),{id:e.id,type:"compare",op:e.op,left:e.left,right:e.right};case"logic":{if((typeof e.op!="string"||!aO.has(e.op))&&A(r,`${o}.op`,"must be and|or|not"),!Array.isArray(e.inputs))return A(r,`${o}.inputs`,"must be an array of node ids"),{id:e.id,type:"logic",op:e.op,inputs:[]};let i=[];for(let s=0;s<e.inputs.length;s++){let a=e.inputs[s];typeof a!="string"||!a?A(r,`${o}.inputs.${s}`,"must be a node id"):i.push(a)}return e.op==="not"?i.length!==1&&A(r,`${o}.inputs`,"not requires exactly one input"):(e.op==="and"||e.op==="or")&&i.length<2&&A(r,`${o}.inputs`,`${e.op} requires at least two inputs`),{id:e.id,type:"logic",op:e.op,inputs:i}}case"cross":return(typeof e.direction!="string"||!cO.has(e.direction))&&A(r,`${o}.direction`,"must be above|below"),(typeof e.left!="string"||!e.left)&&A(r,`${o}.left`,"must be a node id"),(typeof e.right!="string"||!e.right)&&A(r,`${o}.right`,"must be a node id"),{id:e.id,type:"cross",direction:e.direction,left:e.left,right:e.right};default:return null}}function hO(e,t,n){if(!Pe(e))return A(t,"risk","must be a plain object"),null;Pt(e,Tw,"risk",t);for(let p of Tw)(!(p in e)||e[p]==null)&&A(t,`risk.${p}`,"required field is missing");let r={},o=e.maxLeverage;!Z(o)||o<=0||o>50?A(t,"risk.maxLeverage","must be a number > 0 and <= 50"):r.maxLeverage=o;let i=e.maxNotionalUsd;!Z(i)||i<=0?A(t,"risk.maxNotionalUsd","must be a number > 0"):r.maxNotionalUsd=i;let s=e.positionSizePct;!Z(s)||s<=0||s>100?A(t,"risk.positionSizePct","must be a number > 0 and <= 100"):r.positionSizePct=s;let a=e.stopLossPct;!Z(a)||a<=0||a>100?A(t,"risk.stopLossPct","must be a number > 0 and <= 100"):r.stopLossPct=a;let c=e.takeProfitPct;!Z(c)||c<=0||c>1e3?A(t,"risk.takeProfitPct","must be a number > 0 and <= 1000"):r.takeProfitPct=c;let l=e.cooldownBars;!Number.isInteger(l)||l<0||l>1e5?A(t,"risk.cooldownBars","must be an integer >= 0 and <= 100000"):r.cooldownBars=l;let u=e.maxDailyLossPct;!Z(u)||u<=0||u>100?A(t,"risk.maxDailyLossPct","must be a number > 0 and <= 100"):r.maxDailyLossPct=u;let d=e.expiresAt;return!Number.isInteger(d)||d<=0?A(t,"risk.expiresAt","must be an integer epoch milliseconds > 0"):(n.nowMs!==void 0&&(Number.isInteger(n.nowMs)?d<=n.nowMs&&A(t,"risk.expiresAt","must be strictly greater than nowMs"):A(t,"nowMs","must be an integer epoch milliseconds")),r.expiresAt=d),r}function gO(e,t={}){let n=[];if(!Pe(e))return A(n,"","strategy must be a plain object"),{ok:!1,errors:n,strategy:null};Pt(e,Nw,"",n);for(let d of Nw)(!(d in e)||e[d]==null)&&A(n,d,"required field is missing");e.version!==Zl&&A(n,"version",`must be ${Zl}`),(typeof e.id!="string"||!Bw.test(e.id))&&A(n,"id","must match /^[a-z0-9][a-z0-9._-]{0,63}$/"),(typeof e.name!="string"||e.name.length===0||e.name.length>Lw)&&A(n,"name",`must be a non-empty string max ${Lw}`);let r=us(e.venue);r||A(n,"venue",`unknown strategy venue "${String(e.venue)}"`);let o=null;if(!r)Pe(e.market)||A(n,"market","must be a plain object");else{let d=r.validateMarket(e.market);if(!d||typeof d.ok!="boolean"||!Array.isArray(d.errors))A(n,"market",`venue ${r.id} returned an invalid market validation result`);else if(d.ok)o=d.market;else for(let p of d.errors)A(n,p.path,p.message)}let i=mO(e.parameters,n),s=null,a=new Map;if(!Array.isArray(e.nodes))A(n,"nodes","must be an array");else if(e.nodes.length>$w)A(n,"nodes",`too many nodes (max ${$w})`);else{s=[];for(let d=0;d<e.nodes.length;d++){let p=fO(e.nodes[d],d,i||{},n);p&&(typeof p.id=="string"&&Dw.test(p.id)&&(a.has(p.id)?A(n,`nodes.${d}.id`,`duplicate node id "${p.id}"`):a.set(p.id,p)),s.push(p))}for(let d=0;d<s.length;d++){let p=s[d],m=`nodes.${d}`;for(let f of ls(p))a.has(f)||A(n,m,`unknown node ref "${f}"`);if(p.type==="indicator"||p.type==="compare"||p.type==="cross")for(let f of ls(p)){let h=a.get(f);h&&eu.has(h.type)&&A(n,m,`node ref "${f}" must be numeric`)}if(p.type==="logic")for(let f of ls(p)){let h=a.get(f);h&&!eu.has(h.type)&&A(n,m,`node ref "${f}" must be boolean`)}}pO(a)&&A(n,"nodes","graph contains a cycle")}let c=null;if(!Pe(e.rules))A(n,"rules","must be a plain object");else{Pt(e.rules,tu,"rules",n);for(let d of tu)d in e.rules||A(n,`rules.${d}`,"required field is missing");c={};for(let d of tu){let p=e.rules[d];if(p===null){c[d]=null;continue}if(typeof p!="string"||!p){A(n,`rules.${d}`,"must be a node id or null"),c[d]=p;continue}if(!a.has(p)){A(n,`rules.${d}`,`unknown node ref "${p}"`),c[d]=p;continue}let m=a.get(p);eu.has(m.type)||A(n,`rules.${d}`,`rule must reference a boolean node, not ${m.type}`),c[d]=p}}let l=hO(e.risk,n,t);if(n.length)return{ok:!1,errors:n,strategy:null};let u=ru({version:Zl,id:e.id,name:e.name,venue:r.id,market:o,parameters:i,nodes:s,rules:c,risk:l});return{ok:!0,errors:[],strategy:u}}function rt(e,t={}){let n=gO(e,t);if(!n.ok)throw new qn(n.errors);return n.strategy}function yO(e){let t=rt(e);return JSON.stringify(ou(t))}function iu(e){let t=yO(e);return rO("sha256").update(t,"utf8").digest("hex")}function qw(e,t){if(!Pe(e))throw new qn([{path:"",message:"strategy must be a plain object"}]);if(!Pe(t))throw new qn([{path:"overrides",message:"must be a plain object"}]);let n=rt(e),r={};for(let[i,s]of Object.entries(n.parameters))r[i]={value:s.value,min:s.min,max:s.max,step:s.step};let o=[];for(let[i,s]of Object.entries(t)){if(!Object.prototype.hasOwnProperty.call(r,i)){A(o,i,`unknown parameter "${i}"`);continue}let a=r[i];if(!Z(s)){A(o,i,"override must be a finite number");continue}if(!Fw(s,a.min,a.max,a.step)){A(o,i,"override must lie on the declared min/max/step grid");continue}r[i]={...a,value:s}}if(o.length)throw new qn(o);return rt({version:n.version,id:n.id,name:n.name,venue:n.venue,market:{coin:n.market.coin,interval:n.market.interval},parameters:r,nodes:n.nodes.map(i=>{let s={...i};return Array.isArray(i.inputs)&&(s.inputs=[...i.inputs]),s}),rules:{...n.rules},risk:{...n.risk}})}function Jr(e){if(!Array.isArray(e))throw new TypeError("values must be an array");for(let t=0;t<e.length;t++){let n=e[t];if(typeof n!="number"||!Number.isFinite(n))throw new TypeError(`values[${t}] must be a finite number`)}}function Nt(e){if(!Number.isInteger(e)||e<=0)throw new TypeError("period must be a positive integer")}function bO(e){if(!Array.isArray(e))throw new TypeError("bars must be an array");for(let t=0;t<e.length;t++){let n=e[t];if(n==null||typeof n!="object")throw new TypeError(`bars[${t}] must be an object`);for(let r of["o","h","l","c"]){let o=n[r];if(typeof o!="number"||!Number.isFinite(o))throw new TypeError(`bars[${t}].${r} must be a finite number`)}if(n.h<n.l)throw new TypeError(`bars[${t}] high must be >= low`)}}function jw(e,t){Jr(e),Nt(t);let n=new Array(e.length).fill(null);if(e.length<t)return n;let r=0;for(let o=0;o<e.length;o++)r+=e[o],o>=t&&(r-=e[o-t]),o>=t-1&&(n[o]=r/t);return n}function ds(e,t){Jr(e),Nt(t);let n=new Array(e.length).fill(null);if(e.length<t)return n;let r=0;for(let s=0;s<t;s++)r+=e[s];let o=r/t;n[t-1]=o;let i=2/(t+1);for(let s=t;s<e.length;s++)o=i*e[s]+(1-i)*o,n[s]=o;return n}function Vw(e,t){Jr(e),Nt(t);let n=new Array(e.length).fill(null);if(e.length<=t)return n;let r=0,o=0;for(let a=1;a<=t;a++){let c=e[a]-e[a-1];c>=0?r+=c:o-=c}let i=r/t,s=o/t;n[t]=Hw(i,s);for(let a=t+1;a<e.length;a++){let c=e[a]-e[a-1],l=c>0?c:0,u=c<0?-c:0;i=(i*(t-1)+l)/t,s=(s*(t-1)+u)/t,n[a]=Hw(i,s)}return n}function Hw(e,t){return e===0&&t===0?50:t===0?100:e===0?0:100-100/(1+e/t)}function zw(e,t={}){Jr(e);let n=t.fastPeriod,r=t.slowPeriod,o=t.signalPeriod;if(Nt(n),Nt(r),Nt(o),n>=r)throw new TypeError("fastPeriod must be < slowPeriod");let i=ds(e,n),s=ds(e,r),a=new Array(e.length).fill(null);for(let d=0;d<e.length;d++)i[d]!=null&&s[d]!=null&&(a[d]=i[d]-s[d]);let c=new Array(e.length).fill(null),l=new Array(e.length).fill(null),u=[];for(let d=0;d<a.length;d++)a[d]!=null&&u.push(d);if(u.length>=o){let d=0;for(let h=0;h<o;h++)d+=a[u[h]];let p=d/o,m=u[o-1];c[m]=p,l[m]=a[m]-p;let f=2/(o+1);for(let h=o;h<u.length;h++){let g=u[h];p=f*a[g]+(1-f)*p,c[g]=p,l[g]=a[g]-p}}return{line:a,signal:c,histogram:l}}function Ww(e,t={}){Jr(e);let n=t.period,r=t.stdDev;if(Nt(n),typeof r!="number"||!Number.isFinite(r)||r<=0)throw new TypeError("stdDev must be a finite number > 0");let o=new Array(e.length).fill(null),i=new Array(e.length).fill(null),s=new Array(e.length).fill(null);if(e.length<n)return{upper:i,middle:o,lower:s};let a=0,c=0;for(let l=0;l<e.length;l++){let u=e[l];if(a+=u,c+=u*u,l>=n){let d=e[l-n];a-=d,c-=d*d}if(l>=n-1){let d=a/n,p=c/n-d*d;p<0&&p>-1e-12&&(p=0);let m=Math.sqrt(p);o[l]=d,i[l]=d+r*m,s[l]=d-r*m}}return{upper:i,middle:o,lower:s}}function Gw(e,t){bO(e),Nt(t);let n=new Array(e.length).fill(null);if(e.length<t)return n;let r=new Array(e.length);for(let s=0;s<e.length;s++){let a=e[s];if(s===0)r[s]=a.h-a.l;else{let c=e[s-1].c;r[s]=Math.max(a.h-a.l,Math.abs(a.h-c),Math.abs(a.l-c))}}let o=0;for(let s=0;s<t;s++)o+=r[s];let i=o/t;n[t-1]=i;for(let s=t;s<e.length;s++)i=(i*(t-1)+r[s])/t,n[s]=i;return n}import{createHash as wO}from"node:crypto";var su=2,xO="93f9c998260e73756c13871dc1a84dd6cdb26ec6113bd1941f023519939db440",SO="68f5b412a9975f04024cf9b9b6209b4bccedd52f176e95f34f786b3f53479c6a",kO="f197a38ff1c0f4ebe13326db8cbb8167ea3dd5d62e6033fe97c2fee8d23d96b5",Kw=wO("sha256").update(JSON.stringify({version:su,compilerSourceHash:xO,indicatorsSourceHash:SO,schemaSourceHash:kO})).digest("hex");var ps=su,au=Kw,vO=Object.freeze({open:"o",high:"h",low:"l",close:"c",volume:"v",fundingRate:"fundingRate",openInterest:"openInterest"}),EO=Object.freeze({"1m":6e4,"3m":18e4,"5m":3e5,"15m":9e5,"30m":18e5,"1h":36e5,"2h":72e5,"4h":144e5,"8h":288e5,"12h":432e5,"1d":864e5});function qe(e){return typeof e=="number"&&Number.isFinite(e)}function AO(e){let t=new Map(e.map(a=>[a.id,a])),n=a=>{switch(a.type){case"indicator":return a.input?[a.input]:[];case"compare":case"cross":return[a.left,a.right];case"logic":return[...a.inputs];default:return[]}},r=new Map,o=new Map;for(let a of e)r.set(a.id,0),o.set(a.id,[]);for(let a of e)for(let c of n(a))t.has(c)&&(o.get(c).push(a.id),r.set(a.id,r.get(a.id)+1));let i=[];for(let[a,c]of r)c===0&&i.push(a);let s=[];for(;i.length;){let a=i.shift();s.push(a);for(let c of o.get(a))r.set(c,r.get(c)-1),r.get(c)===0&&i.push(c)}if(s.length!==e.length)throw new Error("strategy graph is cyclic");return s}function Hn(e,t){return e!=null&&typeof e=="object"&&"param"in e?t[e.param].value:e}function IO(e,t,n){if(!Array.isArray(e)||e.length===0)throw new TypeError("bars must be a non-empty array");if(!Number.isInteger(t)||t<0||t>=e.length)throw new RangeError("index out of range");let r=null;for(let o=0;o<=t;o++){let i=e[o];if(i==null||typeof i!="object"||Array.isArray(i))throw new TypeError(`bars[${o}] must be an object`);let{t:s,o:a,h:c,l,c:u,v:d}=i;if(!qe(s)&&(typeof s=="number"&&Number.isFinite(s)),!Number.isFinite(s))throw new TypeError(`bars[${o}].t must be finite`);for(let[p,m]of[["o",a],["h",c],["l",l],["c",u],["v",d]])if(!qe(m))throw new TypeError(`bars[${o}].${p} must be a finite number`);for(let[p,m]of[["o",a],["h",c],["l",l],["c",u]])if(!(m>0))throw new TypeError(`bars[${o}].${p} price must be positive`);if(d<0)throw new TypeError(`bars[${o}].v volume must be non-negative`);if(c<Math.max(a,u,l))throw new TypeError(`bars[${o}] high must be >= max(open, close, low)`);if(l>Math.min(a,u,c))throw new TypeError(`bars[${o}] low must be <= min(open, close, high)`);if(r!=null){if(!(s>r))throw new TypeError("bars t must be strictly increasing");if(s-r!==EO[n])throw new TypeError(`bars t must match ${n} cadence`)}if(r=s,"fundingRate"in i&&i.fundingRate!=null&&!qe(i.fundingRate))throw new TypeError(`bars[${o}].fundingRate must be finite when present`);if("openInterest"in i&&i.openInterest!=null){if(!qe(i.openInterest))throw new TypeError(`bars[${o}].openInterest must be finite when present`);if(i.openInterest<0)throw new TypeError(`bars[${o}].openInterest must be non-negative`)}}}function Qt(e,t,n,r,o,i){if(i.has(e))return i.get(e);let s=t.get(e),a;switch(s.type){case"input":{let c=vO[s.field];a=new Array(o+1);for(let l=0;l<=o;l++){let u=r[l][c];a[l]=u===void 0?null:u}break}case"constant":{let c=Hn(s.value,n);a=new Array(o+1).fill(c);break}case"indicator":{let c=s.period!=null?Hn(s.period,n):void 0;if(s.indicator==="atr"){let d=[];for(let p=0;p<=o;p++){let m=r[p];d.push({o:m.o,h:m.h,l:m.l,c:m.c})}a=Gw(d,c);break}let u=Qt(s.input,t,n,r,o,i).map((d,p)=>{if(d==null||!qe(d))throw new TypeError(`indicator input ${s.input} has non-finite value at ${p}`);return d});if(s.indicator==="sma")a=jw(u,c);else if(s.indicator==="ema")a=ds(u,c);else if(s.indicator==="rsi")a=Vw(u,c);else if(s.indicator==="macd")a=zw(u,{fastPeriod:Hn(s.fastPeriod,n),slowPeriod:Hn(s.slowPeriod,n),signalPeriod:Hn(s.signalPeriod,n)})[s.output];else if(s.indicator==="bollinger")a=Ww(u,{period:c,stdDev:Hn(s.stdDev,n)})[s.output];else throw new Error(`unsupported indicator ${s.indicator}`);break}case"compare":{let c=Qt(s.left,t,n,r,o,i),l=Qt(s.right,t,n,r,o,i);a=new Array(o+1);for(let u=0;u<=o;u++){let d=c[u],p=l[u];if(d==null||p==null||!qe(d)||!qe(p)){a[u]=!1;continue}switch(s.op){case"gt":a[u]=d>p;break;case"gte":a[u]=d>=p;break;case"lt":a[u]=d<p;break;case"lte":a[u]=d<=p;break;case"eq":a[u]=d===p;break;default:a[u]=!1}}break}case"logic":{let c=s.inputs.map(l=>Qt(l,t,n,r,o,i));a=new Array(o+1);for(let l=0;l<=o;l++)if(s.op==="not"){let u=c[0][l];a[l]=u===!0?!1:u===!1}else if(s.op==="and"){let u=!0;for(let d of c)if(d[l]!==!0){u=!1;break}a[l]=u}else if(s.op==="or"){let u=!1;for(let d of c)if(d[l]===!0){u=!0;break}a[l]=u}else a[l]=!1;break}case"cross":{let c=Qt(s.left,t,n,r,o,i),l=Qt(s.right,t,n,r,o,i);a=new Array(o+1),a[0]=!1;for(let u=1;u<=o;u++){let d=c[u-1],p=l[u-1],m=c[u],f=l[u];if(d==null||p==null||m==null||f==null||!qe(d)||!qe(p)||!qe(m)||!qe(f)){a[u]=!1;continue}s.direction==="above"?a[u]=d<=p&&m>f:a[u]=d>=p&&m<f}break}default:throw new Error(`unknown node type ${s.type}`)}return i.set(e,a),a}function cu(e,t={}){let n=rt(e);t&&Object.keys(t).length&&(n=qw(n,t));let r=new Map(n.nodes.map(m=>[m.id,m])),o=Object.freeze(AO(n.nodes)),i=n.parameters,s=new Set(n.nodes.filter(m=>m.type==="input").map(m=>m.field));if(n.nodes.some(m=>m.type==="indicator"&&m.indicator==="atr"))for(let m of["open","high","low","close"])s.add(m);let a=Object.freeze([...s].sort()),c=iu(n);function l(m,f){let h={};for(let b of o){let k=m.get(b);h[b]=k[f]}let g=b=>b!=null&&h[b]===!0;return{values:h,signals:{entryLong:g(n.rules.entryLong),entryShort:g(n.rules.entryShort),exitLong:g(n.rules.exitLong),exitShort:g(n.rules.exitShort)}}}function u(m,f){IO(m,f,n.market.interval);let h=new Map;for(let g of o)Qt(g,r,i,m,f,h);return h}function d(m,f){return l(u(m,f),f)}function p(m){if(!Array.isArray(m)||m.length===0)throw new TypeError("bars must be a non-empty array");let f=m.length-1,h=u(m,f);return Object.freeze(m.map((g,b)=>Object.freeze(l(h,b))))}return Object.freeze({strategy:n,strategyHash:c,compilerVersion:ps,compilerHash:au,requiredSeries:a,nodeOrder:o,evaluate:d,evaluateAll:p})}import{createHash as _O}from"node:crypto";var TD=Object.freeze({initialEquityUsd:1e4,takerFeeBps:3.5,builderFeeBps:2,slippageBps:2,latencyBars:1,maxVolumeParticipationPct:100});var PO=Object.freeze(["fail","pass_paper_only","pass_live_eligible"]);function Ct(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function Zr(e){return typeof e=="number"&&Number.isFinite(e)}function jn(e){if(Array.isArray(e))return e.map(jn);if(e!=null&&typeof e=="object"){let t={};for(let n of Object.keys(e).sort())t[n]=jn(e[n]);return t}return e}function Yw(e){if(!Ct(e))throw new TypeError("evidence artifact must be a plain object");if(!PO.includes(e.status))throw new TypeError("evidence artifact status is invalid");for(let t of["strategyHash","compilerHash","barsHash"])if(typeof e[t]!="string"||!/^[0-9a-f]{64}$/.test(e[t]))throw new TypeError(`evidence artifact ${t} must be a sha256 hash`);if(!Ct(e.split))throw new TypeError("evidence artifact split required");if(!Array.isArray(e.flags))throw new TypeError("evidence artifact flags must be an array");if(!Ct(e.walkForward)||!Array.isArray(e.walkForward.windows))throw new TypeError("evidence artifact walkForward windows required");if(e.status==="pass_live_eligible"&&(!Ct(e.train)||!Ct(e.holdout)))throw new TypeError("live-eligible evidence artifact requires train and holdout facts");return jn({barsHash:e.barsHash,compilerHash:e.compilerHash,flags:e.flags.map(t=>jn(t)),holdout:e.holdout??null,split:e.split,status:e.status,strategyHash:e.strategyHash,train:e.train??null,walkForward:{passRate:e.walkForward.passRate,windowsRun:e.walkForward.windowsRun??e.walkForward.windows.length,windows:e.walkForward.windows.map(t=>({index:t.index,trainStartIndex:t.trainStartIndex,trainEndIndex:t.trainEndIndex,passed:t.passed,reason:t.reason,evalStartIndex:t.evalStartIndex,evalEndIndex:t.evalEndIndex,metrics:t.metrics}))}})}function NO(e){return _O("sha256").update(JSON.stringify(Yw(e)),"utf8").digest("hex")}function He(e,t,n=0){if(!Number.isInteger(e)||e<n)throw new Error(`${t} must be an integer >= ${n}`);return e}function lu(e,t){if(!Ct(e)||!Ct(e.metrics))throw new Error(`${t} metrics required`);let n=He(e.tradeCount,`${t}.tradeCount`);if(e.metrics.tradeCount!==n)throw new Error(`${t} tradeCount contradicts metrics.tradeCount`);for(let r of["netPnlUsd","profitFactor","maxDrawdownPct"])if(!Zr(e.metrics[r]))throw new Error(`${t}.metrics.${r} must be finite`);if(e.metrics.maxDrawdownPct<0)throw new Error(`${t}.metrics.maxDrawdownPct must be >= 0`);return e.metrics}function CO(e,{maxDailyLossPct:t}={}){let n=e.split,r=He(n.trainStartIndex,"split.trainStartIndex"),o=He(n.trainEndIndex,"split.trainEndIndex"),i=He(n.trainBarCount,"split.trainBarCount",1),s=He(n.holdoutStartIndex,"split.holdoutStartIndex"),a=He(n.holdoutEndIndex,"split.holdoutEndIndex"),c=He(n.holdoutBarCount,"split.holdoutBarCount",1);if(r!==0||o-r+1!==i||s!==o+1||a-s+1!==c)throw new Error("evidence split must be contiguous, chronological, and count-consistent");if(!Zr(n.trainFraction)||n.trainFraction<=0||n.trainFraction>=1)throw new Error("split.trainFraction must be in (0,1)");lu(e.train,"train");let l=lu(e.holdout,"holdout");if(l.tradeCount<1||l.netPnlUsd<=0||l.profitFactor<=1)throw new Error("live-eligible holdout metrics do not pass");if(Zr(t)&&l.maxDrawdownPct>t)throw new Error("live-eligible holdout drawdown exceeds strategy risk");if(e.flags.length>0)throw new Error("live-eligible evidence cannot contain failure flags");let u=e.walkForward,d=u.windows;if(d.length<1||u.windowsRun!==d.length)throw new Error("live-eligible walk-forward windowsRun must match nonempty windows");let p=0,m=-1;for(let h=0;h<d.length;h++){let g=d[h];if(!Ct(g)||g.index!==h||typeof g.passed!="boolean")throw new Error("walk-forward windows must be ordered and structurally valid");let b=He(g.trainStartIndex,`walkForward.windows[${h}].trainStartIndex`),k=He(g.trainEndIndex,`walkForward.windows[${h}].trainEndIndex`),x=He(g.evalStartIndex,`walkForward.windows[${h}].evalStartIndex`),w=He(g.evalEndIndex,`walkForward.windows[${h}].evalEndIndex`);if(b!==0||k>=x||x>w||x<=m)throw new Error("walk-forward windows must be chronological and disjoint");if(m=w,g.passed){if(p+=1,g.reason!=="pass")throw new Error("passed walk-forward window reason must be pass");let E=lu({metrics:g.metrics,tradeCount:g.metrics?.tradeCount},`walkForward.windows[${h}]`);if(E.tradeCount<1||E.netPnlUsd<=0||E.profitFactor<=1)throw new Error("passed walk-forward window metrics do not pass");if(Zr(t)&&E.maxDrawdownPct>t)throw new Error("passed walk-forward drawdown exceeds strategy risk")}else if(g.reason==="pass")throw new Error("failed walk-forward window cannot have pass reason")}let f=p/d.length;if(!Zr(u.passRate)||Math.abs(u.passRate-f)>Number.EPSILON||f<.6)throw new Error("walk-forward passRate contradicts concrete windows or is below live threshold")}function Xw(e,t={}){if(typeof e?.id!="string"||!/^[0-9a-f]{64}$/.test(e.id))throw new Error("evidence.id must be a sha256 evidence artifact hash");let n=Yw(e),r=jn({id:e.id,...n});if(JSON.stringify(jn(e))!==JSON.stringify(r))throw new Error("evidence artifact contains fields unbound from its deterministic identity");let o=NO(e);if(e.id!==o)throw new Error("evidence.id does not match its deterministic artifact facts digest");return e.status==="pass_live_eligible"&&CO(e,t),e}W();var TO=["privatekey","secretkey","seed","mnemonic","passphrase","password","keystore","keymaterial","apikey","authtoken","accesstoken","refreshtoken","credential","bearer","signature","authorization","xprv","xpriv","wif"];function eo(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function OO(e){return String(e).toLowerCase().replace(/[^a-z0-9]/g,"")}function du(e,t="value"){if(Array.isArray(e)){e.forEach((n,r)=>du(n,`${t}[${r}]`));return}if(eo(e))for(let[n,r]of Object.entries(e)){let o=OO(n);if(TO.some(i=>o.includes(i)))throw new Error(`handoff: forbidden secret-like field at ${t}.${n}`);du(r,`${t}.${n}`)}}function uu(e){return typeof e=="number"&&Number.isFinite(e)&&e>0}function Qw({strategy:e,evidence:t,shadow:n,caps:r,nowMs:o=Date.now(),env:i=process.env}={}){if(du({strategy:e,evidence:t,shadow:n,caps:r},"handoff"),!eo(e))throw new Error("handoff: strategy required");if(!eo(t))throw new Error("handoff: evidence required");if(!eo(n))throw new Error("handoff: shadow required");if(!eo(r))throw new Error("handoff: caps required");if(typeof n.id!="string"||!n.id.trim())throw new Error("handoff: shadow.id required");if(typeof n.stateHash!="string"||!/^[0-9a-f]{64}$/.test(n.stateHash))throw new Error("handoff: shadow.stateHash must be a sha256 hash");if(n.status!=="running")throw new Error("handoff: shadow.status must be running");if(!Number.isInteger(n.cursor)||n.cursor<=0)throw new Error("handoff: shadow.cursor must be a positive integer");if(!Number.isInteger(n.updatedAt)||n.updatedAt<=0||n.updatedAt>o)throw new Error("handoff: shadow.updatedAt must be a positive integer <= nowMs");let s=rt(e,{nowMs:o}),a=cu(s);if(Xw(t,{maxDailyLossPct:s.risk.maxDailyLossPct}),t.status!=="pass_live_eligible")throw new Error("handoff: evidence.status must be pass_live_eligible");if(t.strategyHash!==a.strategyHash)throw new Error("handoff: evidence.strategyHash mismatch");if(t.compilerHash!==a.compilerHash)throw new Error("handoff: evidence.compilerHash mismatch");let c=["perStrategyNotionalUsd","maxLeverage","dailyLossCapUsd","chainAllowlist","assetAllowlist","expiresAt","killSwitchRequired"];for(let p of c)if(!(p in r)||r[p]==null)throw new Error(`handoff: caps.${p} required`);if(!uu(r.perStrategyNotionalUsd))throw new Error("handoff: caps.perStrategyNotionalUsd must be positive");if(r.perStrategyNotionalUsd>a.strategy.risk.maxNotionalUsd)throw new Error("handoff: caps.perStrategyNotionalUsd exceeds strategy.risk.maxNotionalUsd");if(!uu(r.maxLeverage))throw new Error("handoff: caps.maxLeverage must be positive");if(r.maxLeverage>a.strategy.risk.maxLeverage)throw new Error("handoff: caps.maxLeverage exceeds strategy.risk.maxLeverage");if(!uu(r.dailyLossCapUsd))throw new Error("handoff: caps.dailyLossCapUsd must be positive");let l=a.strategy.risk.maxNotionalUsd*(a.strategy.risk.maxDailyLossPct/100);if(r.dailyLossCapUsd>l)throw new Error("handoff: caps.dailyLossCapUsd exceeds strategy daily loss ceiling");if(!Array.isArray(r.chainAllowlist)||r.chainAllowlist.length===0)throw new Error("handoff: caps.chainAllowlist must be a non-empty array");if(!r.chainAllowlist.every(p=>p==="hyperliquid"))throw new Error("handoff: caps.chainAllowlist must include only hyperliquid");if(!r.chainAllowlist.includes("hyperliquid"))throw new Error("handoff: caps.chainAllowlist must include hyperliquid");if(!Array.isArray(r.assetAllowlist)||r.assetAllowlist.length===0)throw new Error("handoff: caps.assetAllowlist must be a non-empty array");if(r.assetAllowlist.length!==1||r.assetAllowlist[0]!==a.strategy.market.coin)throw new Error("handoff: caps.assetAllowlist must contain only the strategy market coin");if(!Number.isInteger(r.expiresAt)||!(r.expiresAt>o))throw new Error("handoff: caps.expiresAt must be an integer > nowMs");if(r.expiresAt>a.strategy.risk.expiresAt)throw new Error("handoff: caps.expiresAt exceeds strategy.risk.expiresAt");if(r.killSwitchRequired!==!0)throw new Error("handoff: caps.killSwitchRequired must be exactly true");let u={perStrategyNotionalUsd:r.perStrategyNotionalUsd,maxLeverage:r.maxLeverage,dailyLossCapUsd:r.dailyLossCapUsd,chainAllowlist:[...r.chainAllowlist],assetAllowlist:[...r.assetAllowlist],expiresAt:r.expiresAt,killSwitchRequired:!0},d={strategyHash:a.strategyHash,compilerHash:a.compilerHash,evidence:JSON.parse(JSON.stringify(t)),shadow:{id:n.id,stateHash:n.stateHash,status:n.status,cursor:n.cursor,updatedAt:n.updatedAt},compiled:{strategyHash:a.strategyHash,compilerHash:a.compilerHash,compilerVersion:ps,venue:"hyperliquid",market:{coin:a.strategy.market.coin,kind:"perp",interval:a.strategy.market.interval},risk:{...a.strategy.risk},strategy:JSON.parse(JSON.stringify(a.strategy))},arming:{liveBroadcast:!1,requiresExplicitUserArm:!0,caps:u},requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,executionReady:!1};return O(d,{provider:"hl-strategy",kind:"strategy-live-handoff",env:i})}var RO=Object.freeze({"1m":6e4,"3m":18e4,"5m":3e5,"15m":9e5,"30m":18e5,"1h":36e5,"2h":72e5,"4h":144e5,"8h":288e5,"12h":432e5,"1d":864e5});function Vn(e,t){let n=Number(e);if(!Number.isFinite(n))throw new TypeError(`${t} must be finite`);return n}function zn(e,t){if(!Number.isSafeInteger(e)||e<0)throw new TypeError(`${t} must be a non-negative safe integer`);return e}function to(e){if(Array.isArray(e))for(let t of e)to(t);else if(e&&typeof e=="object")for(let t of Object.values(e))to(t);return Object.freeze(e)}function $O(e){let t=RO[e];if(!t)throw new TypeError(`unsupported strategy interval: ${e}`);return t}function LO(e,{endTime:t=Number.MAX_SAFE_INTEGER}={}){if(!Array.isArray(e))throw new TypeError("Hyperliquid candles must be an array");zn(t,"endTime");let n=new Map;for(let r=0;r<e.length;r++){let o=e[r];if(!o||typeof o!="object"||Array.isArray(o))throw new TypeError(`candles[${r}] must be an object`);let i=zn(Number(o.t),`candles[${r}].t`);if(zn(Number(o.T),`candles[${r}].T`)>t)continue;let a={t:i,o:Vn(o.o,`candles[${r}].o`),h:Vn(o.h,`candles[${r}].h`),l:Vn(o.l,`candles[${r}].l`),c:Vn(o.c,`candles[${r}].c`),v:Vn(o.v,`candles[${r}].v`)};if(a.h<Math.max(a.o,a.c,a.l))throw new TypeError(`candles[${r}].h is below another price`);if(a.l>Math.min(a.o,a.c,a.h))throw new TypeError(`candles[${r}].l is above another price`);if(a.v<0)throw new TypeError(`candles[${r}].v must be non-negative`);let c=n.get(i);if(c&&JSON.stringify(c)!==JSON.stringify(a))throw new TypeError(`conflicting duplicate candle at timestamp ${i}`);c||n.set(i,a)}return to([...n.values()].sort((r,o)=>r.t-o.t))}function MO(e,t){if(!Array.isArray(e))throw new TypeError("Hyperliquid funding history must be an array");let n=new Map;for(let r=0;r<e.length;r++){let o=e[r];if(!o||typeof o!="object"||Array.isArray(o))throw new TypeError(`funding[${r}] must be an object`);let i=zn(Number(o.time),`funding[${r}].time`);i>t||n.set(i,{time:i,fundingRate:Vn(o.fundingRate,`funding[${r}].fundingRate`)})}return[...n.values()].sort((r,o)=>r.time-o.time)}async function UO({coin:e,startTime:t,endTime:n},r){let o=[],i=Math.max(0,t-288e5),s=!1;for(let a=0;a<16&&i<=n;a++){let c=await ld({coin:e,startTime:i,endTime:n},r);if(!Array.isArray(c))throw new TypeError("Hyperliquid funding history must be an array");o.push(...c);let l=i;for(let u of c){let d=Number(u?.time);Number.isSafeInteger(d)&&d>l&&(l=d)}if(c.length<500||l>=n){s=!0;break}if(l<=i)throw new Error("Hyperliquid funding history pagination did not advance");i=l+1}if(!s)throw new Error("strategy history exceeds the bounded funding history limit");return MO(o,n)}function BO(e,t,n){let r=0,o=null;return e.map(i=>{let s=i.t+n,a=0;for(;r<t.length&&t[r].time<s;){let c=t[r];o=c.fundingRate,c.time>=i.t&&(a+=c.fundingRate),r+=1}return o==null?{...i,fundingPaymentRate:a}:{...i,fundingRate:o,fundingPaymentRate:a}})}async function Jw(e,t={}){if(!e||typeof e!="object"||Array.isArray(e))throw new TypeError("strategy history input must be an object");let n=String(e.coin||"").trim().toUpperCase();if(!/^[A-Z0-9][A-Z0-9._-]{0,11}$/.test(n))throw new TypeError("coin must be an uppercase Hyperliquid asset id");let r=String(e.interval||"15m"),o=$O(r);if(e.endTime==null)throw new TypeError("endTime is required for deterministic history");let i=zn(e.endTime,"endTime"),s=e.count==null?1500:e.count;if(!Number.isInteger(s)||s<20||s>5e3)throw new TypeError("count must be an integer from 20 to 5000");let a=e.startTime==null?Math.max(0,i-s*o):zn(e.startTime,"startTime");if(a>=i)throw new TypeError("startTime must be before endTime");let[c,l]=await Promise.all([sn({coin:n,interval:r,startTime:a,endTime:i},t),UO({coin:n,startTime:a,endTime:i},t)]),u=LO(c,{endTime:i}),d=to(BO(u,l,o));return to({coin:n,interval:r,range:{startTime:a,endTime:i},bars:d})}var DO=new Set(["1m","3m","5m","15m","30m","1h","2h","4h","8h","12h","1d"]),FO=new Set(["coin","interval"]);function qO(e){let t=[];if(!e||typeof e!="object"||Array.isArray(e))return{ok:!1,errors:[{path:"market",message:"must be a plain object"}],market:null};for(let n of Object.keys(e))FO.has(n)||t.push({path:`market.${n}`,message:"unknown field is not allowed"});return(typeof e.coin!="string"||e.coin.length===0||e.coin.length>32)&&t.push({path:"market.coin",message:"must be a non-empty string max 32"}),(typeof e.interval!="string"||!DO.has(e.interval))&&t.push({path:"market.interval",message:"must be a supported interval"}),t.length?{ok:!1,errors:t,market:null}:{ok:!0,errors:[],market:{coin:e.coin,interval:e.interval}}}async function HO(e={}){let t=await wo(e);if(!t||!Array.isArray(t.universe))throw new TypeError("Hyperliquid market metadata must contain universe");return Object.freeze(t.universe.map((n,r)=>{if(!n||typeof n.name!="string"||!n.name)throw new TypeError(`Hyperliquid market metadata universe[${r}].name is invalid`);return n.name}))}var Zw=Object.freeze({id:"hyperliquid",validateMarket:qO,fetchBars:Jw,listMarkets:HO,prepareIntent(e){return Qw(e)}});var jO=Object.freeze(["id","validateMarket","prepareIntent"]);function VO(e){if(!e||typeof e!="object"||Array.isArray(e))throw new TypeError("strategy venue adapter must be an object");if(typeof e.id!="string"||!/^[a-z0-9][a-z0-9._-]{0,63}$/.test(e.id))throw new TypeError("strategy venue adapter id is malformed");for(let t of jO.slice(1))if(typeof e[t]!="function")throw new TypeError(`strategy venue adapter ${e.id} requires ${t}()`);for(let t of["fetchBars","listMarkets"])if(e[t]!=null&&typeof e[t]!="function")throw new TypeError(`strategy venue adapter ${e.id} ${t} must be a function`);return e}var ex=[Zw].map(VO),zO=new Map(ex.map(e=>[e.id,e])),WO=Object.freeze([...ex]);function us(e){return typeof e!="string"?null:zO.get(e)??null}function GO(e){let t=us(e);if(!t)throw new Error(`unknown strategy venue: ${String(e)}`);return t}var tx=Object.freeze(["price","wallet","risk","execution","security","nft","governance","system"]),KO=new Set(tx);function ms(e){if(!KO.has(e))throw new TypeError(`Unknown watch category: ${String(e)}`);return e}function pu(e={}){let t=e.subscribedCategories??[];if(!Array.isArray(t))throw new TypeError("subscribedCategories must be an array");return t}function nx(){return{subscribedCategories:[]}}function YO(e,t){ms(t);let n=pu(e);return n.includes(t)?{...e,subscribedCategories:[...n]}:{...e,subscribedCategories:[...n,t]}}function XO(e,t){ms(t);let n=pu(e);return{...e,subscribedCategories:n.filter(r=>r!==t)}}function QO({category:e,notify:t=!1,...n}={}){if(ms(e),typeof t!="boolean")throw new TypeError("watch notify must be a boolean");return{...n,category:e,notify:t}}function JO(e,t){return!(!t||t.notify!==!0||t.category!==e.category||e.watchId!==void 0&&t.id!==e.watchId)}function rx(e,t=nx(),n){if(!e||typeof e!="object")throw new TypeError("alert must be an object");return ms(e.category),pu(t).includes(e.category)?{deliver:!0,reason:"category-subscribed"}:JO(e,n)?{deliver:!0,reason:"watch-opt-in"}:{deliver:!1,reason:"not-subscribed"}}function ZO(e,t,n){return rx(e,t,n).deliver}var ox=Object.freeze(["wallet","pool","nft_floor","hl_flow","prediction_market"]),eR=Object.freeze({wallets:"wallet",smart_wallet:"wallet",pools:"pool",new_pool:"pool",nft:"nft_floor",nft_floors:"nft_floor",hyperliquid:"hl_flow",prediction:"prediction_market",prediction_markets:"prediction_market"}),ae=(e,t=0,n=1)=>Math.min(n,Math.max(t,e)),he=e=>Number.isFinite(Number(e))?Number(e):null,fs=e=>Math.round(e*1e4)/1e4;function ix(e){let t=String(e?.type??e?.surface??e?.kind??"").toLowerCase();return eR[t]??t}function tR(e,t){return String(e?.id??e?.signalId??e?.asset??e?.market??e?.pool??e?.collection??`${ix(e)}:${t}`)}function Ne(e,t,n,r=!0){!r||n===null||!Number.isFinite(n)||e.push({feature:t,value:fs(n)})}function nR(e,t){let n=he(e.repeatBuys??e.repeat_buys??e.buyCount),r=he(e.walletWinRate??e.winRate);Ne(t,"repeat_buys",n===null?null:ae((n-1)/4)*.38),Ne(t,"wallet_win_rate",r===null?null:(ae(r)-.5)*.5)}function rR(e,t){let n=he(e.ageHours??e.poolAgeHours),r=he(e.liquidityUsd??e.liquidity),o=e.liquidityLocked??e.locked;Ne(t,"pool_age",n===null?null:n<24?-.42:ae(n/720)*.12),Ne(t,"liquidity",r===null?null:(ae(Math.log10(Math.max(1,r))/7)-.5)*.28),Ne(t,"liquidity_lock",o==null?null:o?.12:-.28)}function oR(e,t){let n=he(e.floorChange??e.floorChangePct),r=he(e.sales??e.saleCount);Ne(t,"floor_change",n===null?null:ae(n,-1,1)*.35),Ne(t,"sales_depth",r===null?null:ae(r/50)*.18)}function iR(e,t){let n=he(e.flowImbalance??e.imbalance),r=he(e.fundingRate??e.funding);Ne(t,"flow_imbalance",n===null?null:ae(n,-1,1)*.42),Ne(t,"funding",r===null?null:-ae(r*100,-1,1)*.12)}function sR(e,t){let n=he(e.marketProbability??e.marketPrice??e.probability),r=he(e.fairProbability??e.referenceProbability??e.fairValue);Ne(t,"probability_mispricing",n===null||r===null?null:ae(r-n,-1,1)*.65);let o=he(e.liquidityUsd??e.liquidity);Ne(t,"market_liquidity",o===null?null:ae(Math.log10(Math.max(1,o))/6)*.12)}var aR=Object.freeze({wallet:nR,pool:rR,nft_floor:oR,hl_flow:iR,prediction_market:sR});function cR(e,t,n){let r=n.filter(i=>{let s=i?.signalId??i?.eventId??i?.id??i?.asset??i?.market;return s!=null&&String(s)===t});if(r.length===0)return null;let o=r.map(i=>he(i.return??i.markout??i.pnl??i.value)).filter(i=>i!==null);return o.length===0?null:o.reduce((i,s)=>i+s,0)/o.length}function mu(e=[],t=[],n={}){if(!Array.isArray(e)||!Array.isArray(t))throw new TypeError("events and markouts must be arrays");let r=ae(he(n.minimumCoverage)??.5);return e.map((o,i)=>{let s=ix(o),a=tR(o,i),c=aR[s],l=[];c&&c(o,l);let u=s==="wallet"?2:s==="pool"?3:2,d=fs(ae(l.length/u)),p=l.reduce((x,w)=>x+w.value,0),m=cR(o,a,t),f=m===null?0:ae(m,-1,1)*.35;m!==null&&Ne(l,"shadow_markout",f);let h=fs(ae(.5+p+f)),g=m===null?.8:ae(.85+m*.3,.35,1),b=fs(ae(d*g)),k=["COLD_INTELLIGENCE_ONLY","NO_HOT_EXECUTION"];return c||k.push("UNSUPPORTED_SIGNAL_TYPE"),d<r&&k.push("LOW_COVERAGE","NO_TRADE"),b<.5&&k.push("LOW_CONFIDENCE","NO_TRADE"),s==="pool"&&(he(o.ageHours??o.poolAgeHours)??1/0)<24&&k.push("NEW_POOL_RISK","NO_TRADE"),m!==null&&m<0&&k.push("NEGATIVE_MARKOUT"),{id:a,type:s,score:h,confidence:b,coverage:d,contributions:l,flags:[...new Set(k)],noTrade:k.includes("NO_TRADE"),executionAllowed:!1}}).sort((o,i)=>i.score-o.score||i.confidence-o.confidence||o.id.localeCompare(i.id))}function sx(e={}){return Object.freeze({score(t,n=[],r={}){return mu(t,n,{...e,...r})}})}import{mkdir as lR,chmod as hs,readFile as uR,rename as dR,writeFile as pR}from"node:fs/promises";import{homedir as mR}from"node:os";import{dirname as ax,join as fu}from"node:path";import fR from"sql.js";var bs=Object.freeze(["project","entity","source","thesis","strategy","simulation","prepared_action","receipt","position"]),hR=new Set(bs),gR=new Set(bs.slice(0,-1).map((e,t)=>`${e}:${bs[t+1]}`)),lx=fu(process.env.ORACLE_CONFIG_DIR||fu(mR(),".config","oracle"),"workspace"),ux=fu(lx,"artifacts.sqlite");function ws(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(ws).join(",")}]`:`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${ws(e[t])}`).join(",")}}`}function cx(e){if(!hR.has(e))throw new TypeError(`unknown artifact type: ${e}`);return e}function gs(e){let t=[];for(;e.step();)t.push(e.getAsObject());return e.free(),t}function ys(e){return e?{id:e.id,type:e.type,createdAt:e.created_at,data:JSON.parse(e.data_json)}:null}async function dx(e={}){let t=e.path||ux;await lR(ax(t),{recursive:!0,mode:448}),await hs(ax(t),448);let n;try{n=await uR(t)}catch(l){if(l.code!=="ENOENT")throw l}let r=await fR(e.sqlJs||{}),o=n?new r.Database(n):new r.Database;o.run(`
|
|
63
193
|
PRAGMA foreign_keys=ON;
|
|
64
194
|
CREATE TABLE IF NOT EXISTS artifacts (
|
|
65
195
|
id TEXT PRIMARY KEY, type TEXT NOT NULL, created_at TEXT NOT NULL, data_json TEXT NOT NULL
|
|
@@ -71,4 +201,4 @@ ${i.stderr}`.slice(0,1500));let s=n.metadata.contractName;if(t.contractName&&t.c
|
|
|
71
201
|
CREATE TABLE IF NOT EXISTS action_receipts (
|
|
72
202
|
artifact_id TEXT PRIMARY KEY REFERENCES artifacts(id), receipt_json TEXT NOT NULL
|
|
73
203
|
);
|
|
74
|
-
`);let i=!1,s=Promise.resolve();function a(){let l=async()=>{let u=`${t}.tmp-${process.pid}`;await
|
|
204
|
+
`);let i=!1,s=Promise.resolve();function a(){let l=async()=>{let u=`${t}.tmp-${process.pid}`;await pR(u,Buffer.from(o.export()),{mode:384}),await hs(u,384),await dR(u,t),await hs(t,384)};return s=s.then(l,l),s}n?await hs(t,384):await a();function c(){if(i)throw new Error("artifact store is closed")}return{path:t,async putArtifact(l){if(c(),!l||typeof l!="object")throw new TypeError("artifact object required");let u=cx(String(l.type)),d=String(l.id||"").trim();if(!d)throw new TypeError("artifact id required");let p=$e(l.data??{}),m=String(l.createdAt||new Date().toISOString());return o.run("INSERT INTO artifacts(id,type,created_at,data_json) VALUES(?,?,?,?)",[d,u,m,ws(p)]),await a(),{id:d,type:u,createdAt:m,data:p}},getArtifact(l){c();let u=o.prepare("SELECT * FROM artifacts WHERE id=?");u.bind([String(l)]);let d=u.step()?ys(u.getAsObject()):null;return u.free(),d},listArtifacts(l){c();let u=l===void 0?o.prepare("SELECT * FROM artifacts ORDER BY created_at,id"):(cx(String(l)),o.prepare("SELECT * FROM artifacts WHERE type=? ORDER BY created_at,id"));return l!==void 0&&u.bind([String(l)]),gs(u).map(ys)},async link(l,u){c();let d=o.prepare("SELECT id,type FROM artifacts WHERE id IN (?,?)");d.bind([String(l),String(u)]);let p=gs(d),m=p.find(h=>h.id===String(l)),f=p.find(h=>h.id===String(u));if(!m||!f)throw new TypeError("edge endpoints must exist");if(!gR.has(`${m.type}:${f.type}`))throw new TypeError(`invalid artifact edge: ${m.type} -> ${f.type}`);return o.run("INSERT INTO artifact_edges(parent_id,child_id) VALUES(?,?)",[m.id,f.id]),await a(),{parentId:m.id,childId:f.id}},children(l){c();let u=o.prepare("SELECT a.* FROM artifacts a JOIN artifact_edges e ON e.child_id=a.id WHERE e.parent_id=? ORDER BY a.created_at,a.id");return u.bind([String(l)]),gs(u).map(ys)},parents(l){c();let u=o.prepare("SELECT a.* FROM artifacts a JOIN artifact_edges e ON e.parent_id=a.id WHERE e.child_id=? ORDER BY a.created_at,a.id");return u.bind([String(l)]),gs(u).map(ys)},async putReceipt(l,u){c();let d=this.getArtifact(l);if(!d||d.type!=="receipt")throw new TypeError("receipt boundary requires a receipt artifact");let p=$e(u);return o.run("INSERT INTO action_receipts(artifact_id,receipt_json) VALUES(?,?)",[String(l),ws(p)]),await a(),p},getReceipt(l){c();let u=o.prepare("SELECT receipt_json FROM action_receipts WHERE artifact_id=?");u.bind([String(l)]);let d=u.step()?JSON.parse(u.getAsObject().receipt_json):null;return u.free(),d},async close(){i||(await a(),o.close(),i=!0)}}}var yR=dx;import{createHash as px}from"node:crypto";var bR=new Set(["accesstoken","refreshtoken","idtoken","token","apikey","clientsecret","password","auth","jwt","session","secret","key","code","signature","xamzsignature","privatekey","authorization","bearer","credential"]);function wR(e){return bR.has(String(e).replace(/[^a-z0-9]/gi,"").toLowerCase())}function xs(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(xs).join(",")}]`:`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${xs(e[t])}`).join(",")}}`}function mx(e){return px("sha256").update(String(e)).digest("hex")}function fx(e){let t;try{t=new URL(String(e))}catch{throw new TypeError("research source URL must be valid")}if(!/^https?:$/.test(t.protocol))throw new TypeError("research source URL must be http(s)");if(t.username||t.password)throw new TypeError("research source URL must not contain credentials");for(let n of t.searchParams.keys())if(wR(n))throw new TypeError("research source URL must not contain sensitive query parameters");return t.toString()}function hx(e){if(e==null||e==="")throw new TypeError("research fetchedAt required");let t=new Date(e);if(!Number.isFinite(t.getTime()))throw new TypeError("research fetchedAt must be a valid timestamp");return t.toISOString()}function Ss(e={}){let t=fx(e.url??e.sourceUrl),n=hx(e.fetchedAt),r=String(e.contentHash||"").toLowerCase();if(!/^[0-9a-f]{64}$/.test(r))throw new TypeError("research citation contentHash must be 64 lowercase hex characters");return Object.freeze($e({url:t,fetchedAt:n,contentHash:r}))}function xR(e={}){let t=fx(e.sourceUrl??e.url),n=String(e.snapshot??e.content??"");if(!n)throw new TypeError("research snapshot required");let r=String(e.claim||"").trim();if(!r)throw new TypeError("research claim required");let o=Number(e.confidence);if(!Number.isFinite(o)||o<0||o>1)throw new TypeError("research confidence must be between 0 and 1");let i=hx(e.fetchedAt),s=mx(n);if(!Array.isArray(e.contradictions??[]))throw new TypeError("research contradictions must be an array");let a=(e.citations||[{url:t,fetchedAt:i,contentHash:s}]).map(Ss),c=$e({sourceUrl:t,fetchedAt:i,contentHash:s,snapshot:n,claim:r,confidence:o,contradictions:(e.contradictions||[]).map(String),citations:a});return Object.freeze({id:`research:${px("sha256").update(xs(c)).digest("hex")}`,...c})}var SR=xs;function hu(e={}){let t=String(e.origin||e.kind||"");if(t!=="agent_recommendation"&&t!=="direct_user")throw new TypeError("prepared action origin must be agent_recommendation or direct_user");let n=Array.isArray(e.citations)?e.citations.map(Ss):[];if(t==="agent_recommendation"&&n.length===0)throw new TypeError("agent_recommendation prepared actions require evidence citations");return Object.freeze($e({...e,origin:t,citations:Object.freeze(n)}))}var kR=hu,vR=hu;export{_t as ACTION_MODES,Zm as ACTION_RECEIPT_VERSION,mw as ALLOWED_SCOPES,bs as ARTIFACT_TYPES,vn as ActionReceiptSecretError,kT as BUILD_SCOPE,Zn as CHAINS,ct as CHAIN_CONFIGS,xw as DEFAULT_RISK_THRESHOLDS,fw as DEFAULT_SCOPES,lx as DEFAULT_WORKSPACE_DIR,ux as DEFAULT_WORKSPACE_PATH,B as EVIDENCE,ST as EXECUTE_SCOPE,Dl as GRANT_VERSION,Kr as GrantValidationError,Pi as NftGasWarLimitError,As as PREPARE_HARD_MAX_AGE_MS,Jn as PREPARE_MAX_AGE_MS,Es as PREPARE_VERSION,Me as QUALITY,M as RISK,rn as SCANNER_CAPABILITIES,ue as SELL_SIM,ox as SIGNAL_TYPES,ss as TRADE_STATES,Yl as TRADE_TRANSITIONS,tx as WATCH_CATEGORIES,ew as actionModeForVerb,Pw as advanceTradeLifecycle,lT as assertActionRecord,uv as assertCapability,S_ as assertNftMintGasWar,$e as assertNoReceiptSecrets,Ex as assertPreparedEnvelope,vR as assertRecommendationEvidence,iT as assertSellable,Ql as assertTradeLifecycle,un as autonomousTradingEnabled,pN as bestBridgeRoute,QC as bestEquityRoute,dN as bestSwapRoute,tf as canonicalReceiptJson,SR as canonicalResearchJson,ql as canonicalizeGrant,Up as capabilityStatus,no as chainById,Xb as collectEquityQuotes,_s as computePrepareHash,Ps as computePrepareMac,nf as computeReceiptId,mx as contentHash,UE as createActionReceipt,cT as createActionRecord,yR as createArtifactStore,OT as createHarnessConfigs,HT as createPortfolioLedger,kR as createPreparedAction,xR as createResearchArtifact,Ju as createScanner,sx as createSignalsEngine,XT as createTradeLifecycle,QO as createWatch,sN as data,S as dataCall,rb as dataCatalog,nb as dataHealth,nx as defaultPreferences,ww as emitHarnessConfigs,eT as equityToJsonSafe,JC as equityVenues,rx as evaluateAlert,C0 as executeRfqCandidates,BE as formatActionReceipt,go as getProvider,Fs as getScanner,pw as grantId,_0 as hashFirmQuote,I0 as hashRfqIntent,nO as healthRollup,uT as isActiveAlert,dT as isActiveExecution,Os as isSupportedChain,cr as listProviders,qs as listScanners,pT as migrateLegacyWatchRecord,rf as normalizeActionReceipt,Ss as normalizeCitation,Rc as normalizeFirmQuote,Fl as normalizeGrant,$i as normalizeRfqIntent,vT as normalizeScopes,dx as openArtifactStore,jT as portfolioLedger,UT as portfolioRiskSummary,dv as posture,hu as prepareAction,ZC as prepareEquityRoute,tO as providerHealthRollup,T0 as rankRfqQuotes,sr as registerBuiltinScanners,Ux as registerChain,id as registerCustomChain,P as registerProvider,fo as registerScanner,$c as requestRfqQuotes,GO as requireStrategyVenue,bu as resolvePrepareMaxAgeMs,us as resolveStrategyVenue,Jl as rollupProviderHealth,Ts as rpcUrlFor,SS as scannerCoverage,mu as scoreSignals,ZO as shouldDeliverAlert,Zb as simulateSell,N0 as sourceCandidates,O as stampPrepared,WO as strategyVenues,YO as subscribe,of as summarizeActionReceipt,Gl as summarizePortfolioLedger,rs as summarizePortfolioRisk,QT as transitionTradeLifecycle,XO as unsubscribe,dw as validateGrant,Ni as validateNftMintGasWar,Qu as validateScanner,JT as verifyTradeLifecycle};
|