@oracle-agent/oracle 0.24.0 → 0.24.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.mjs CHANGED
@@ -1,18 +1,18 @@
1
- var Tw=Object.defineProperty;var Ct=(e,t,n)=>()=>{if(n)throw n[0];try{return e&&(t=e(e=0)),t}catch(r){throw n=[r],r}};var Nw=(e,t)=>{for(var n in t)Tw(e,n,{get:t[n],enumerable:!0})};import{createHash as Ow,createHmac as Rw,timingSafeEqual as $w}from"node:crypto";function Yl(e){let t=e==null||e===""?Gn:Number(e);return!Number.isFinite(t)||t<0?Gn:Math.min(t,gs)}function fs(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(fs).join(",")}]`:`{${Object.keys(e).sort().map(n=>`${JSON.stringify(n)}:${fs(e[n])}`).join(",")}}`}function Kl(e){let t=String(e?.ORACLE_STAMP_HMAC_SECRET||"").trim();return t.length>=16?t:""}function ys(e=process.env){return Kl(process.env)||Kl(e)}function Lw(e=process.env){return String(process.env.ORACLE_STAMP_REQUIRE_MAC||"").trim()==="1"||String(e?.ORACLE_STAMP_REQUIRE_MAC||"").trim()==="1"}function Mw(e){let{oraclePrepared:t,prepareHash:n,prepareMac:r,note:o,...i}=e||{};return i}function bs(e){let t=Mw(e);return Ow("sha256").update(fs(t)).digest("hex")}function ws(e,t=ys()){return t?Rw("sha256",t).update(String(e)).digest("hex"):""}function Uw(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:$w(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+Gn,c={...o,preparedAt:i,expiresAt:s,prepareVersion:hs},l=bs(c),u=ys(r),d=u?ws(l,u):void 0,p={...c,oraclePrepared:!0,prepareHash:l};return d&&(p.prepareMac=d),p}function Bw(e,{maxAgeMs:t=Gn,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)!==hs)throw new Error(`${i}: unsupported prepareVersion ${e.prepareVersion}`);let a=bs(e);if(String(e.prepareHash||"")!==a)throw new Error(`${i}: prepareHash mismatch \u2014 payload was altered after prepare`);let c=ys(s),l=String(e.prepareMac||"");if(Lw(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=ws(a,c);if(!l||!Uw(l,h))throw new Error(`${i}: prepareMac mismatch \u2014 stamp not from trusted preparer`)}let u=Number(e.preparedAt),d=Number(e.expiresAt),p=Yl(t),m=n-u,f=d-u;if(!Number.isFinite(m)||!Number.isFinite(d)||!Number.isFinite(f)||m<0||f<=0||f>gs||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 hs,Gn,gs,W=Ct(()=>{hs=2,Gn=300*1e3,gs=(()=>{let e=Number(process.env.ORACLE_PREPARE_HARD_MAX_AGE_MS);return Number.isFinite(e)&&e>0?e:1800*1e3})()});import{createHash as Dw}from"node:crypto";function jw(e){let t=String(e||"").toLowerCase();return Zl.includes(t)||/(^|-)(api[-_]?key|key|token|secret|auth|authorization|session|cookie|signature|access)(-|$)/.test(t)}function Vw(e){let t={};for(let[n,r]of Object.entries(e||{}))jw(n)||(t[n]=r);return t}function zw(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 Ww(e,t){return new URL(String(e)).origin===new URL(String(t)).origin}function Gw(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([...Zl,...o])].sort().map(c=>`${c}=${r[c]??""}`).join(`
2
- `),a=Dw("sha256").update(s).digest("hex").slice(0,32);return`${e} ${t} ${a}`}function Kw(e,t){let n=Number(t);return Number.isFinite(n)&&n>0?Math.min(n*1e3,Ql):Math.min(250*2**e,Ql)+Math.floor(Math.random()*100)}async function Xw(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<=Jl;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(Hw.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===Jl)throw new Error(`HTTP redirect loop for ${e}`);let f=zw(d.headers?.get?.("location"),c);Ww(f,c)||(l=Vw(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):qw,c=async()=>{let m;for(let f=0;f<=a;f++)try{return await Xw(e,{fetchImpl:n,method:o,headers:i,body:s,timeoutMs:r})}catch(h){m=h;let g=h?.status,b=h?.name==="AbortError",S=new Set([408,425,429]),x=g!=null?S.has(g)||Fw.has(g)&&Xl.has(o):!b&&Xl.has(o);if(f===a||!x)throw h;await Yw(Kw(f,h?.retryAfter))}throw m};if(!(t.dedupe!==!1&&o==="GET"&&s==null))return c();let u=Gw(o,e,i),d=xs.get(u);if(d)return d;let p=c().finally(()=>xs.delete(u));return xs.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 Xt(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 Fw,Xl,qw,Ql,Zl,Hw,Jl,xs,Yw,N=Ct(()=>{Fw=new Set([408,425,429,500,502,503,504]),Xl=new Set(["GET","HEAD","OPTIONS","PUT","DELETE"]),qw=2,Ql=4e3,Zl=["authorization","x-api-key","x-tensor-api-key","0x-api-key","api-key","cookie","proxy-authorization"],Hw=new Set([301,302,303,307,308]),Jl=3;xs=new Map;Yw=e=>new Promise(t=>setTimeout(t,e))});import{readFileSync as ux}from"node:fs";import{homedir as dx}from"node:os";import{join as oo}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=dx();if(process.env.ORACLE_PUBLIC_DESKTOP==="1"){let n=(process.env.ORACLE_CONFIG_DIR||oo(t,".config","oracle")).trim();return[e,oo(n,"exec.env")].filter(Boolean)}return[e,oo(t,".config","oracle","exec.env"),oo(t,".config","mad-desk","exec.env")].filter(Boolean)}function au(e,t,n){let r=e??process.env[t]??process.env[n];if(!String(r||"").trim())for(let o of px())try{let i=ux(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 cu=Ct(()=>{});var lu=Ct(()=>{});import{createHash as mx,createHmac as fx,timingSafeEqual as NO}from"node:crypto";function Is(e){return Array.isArray(e)?`[${e.map(Is).join(",")}]`:e&&typeof e=="object"?`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${Is(e[t])}`).join(",")}}`:JSON.stringify(e??null)}function hx(e,{required:t=!1}={}){try{return au(e,"ORACLE_ROUTE_ATTESTATION_SECRET","MAD_ROUTE_ATTESTATION_SECRET")}catch(n){if(t)throw n;return null}}function pu(e){let{signature:t,...n}=e;return n}function mu(e,{secret:t}={}){let n=hx(t);return n?{...e,signature:fx("sha256",n).update(Is(pu(e))).digest("hex")}:e}function gx(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 mx("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({...pu(e),calldataHash:gx(r)},{secret:o})}function As(e,t=0){let n=Number(e);return Number.isFinite(n)?n:t}function yx(e){let t=e==null?uu: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,uu)}function pe({liquidityUsd:e,priceChange5m:t=0,quoteAgeMs:n=0,crossChain:r=!1,requestedCapBps:o}={}){let i=As(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(As(t,0))*2),c=Math.min(40,Math.floor(Math.max(0,As(n,0))/5e3)*5),l=Math.max(25,Math.ceil(20+s+a+c)),u=yx(o);return{mode:"auto",requiredBps:l,selectedBps:Math.min(l,u),capBps:u,executable:l<=u}}function bx({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=du,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)||du)),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=bx({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 uu,du,me=Ct(()=>{cu();lu();uu=100,du=2e4});function zs(e){let t=String(e||"").trim();return/^0x[0-9a-fA-F]{40}$/.test(t)?t:at}var at,_o=Ct(()=>{at="0x000000000000000000000000000000000000dEaD"});var $o={};Nw($o,{ACROSS_API:()=>Qd,HOP_API:()=>Jd,RELAY_API:()=>Zd,acrossHealth:()=>Xs,acrossSuggestedFees:()=>Oo,hopHealth:()=>Qs,hopQuote:()=>Ro,relayHealth:()=>Js,relayPrepare:()=>Zs,relayQuote:()=>ir});async function Xs(e={}){try{return{ok:!0,estimatedFillTimeSec:(await Oo({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 Oo(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||Qd).replace(/\/$/,"");return y(`${c}/suggested-fees?${a}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function Qs(e={}){try{let t=await Ro({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 Ro(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||Jd).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||cE[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 Js(e={}){try{let t=await ir({user:at,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 ir(e={},t={}){let{user:n=at,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||Zd).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 Zs(e={},t={}){let n=await ir(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 Qd,Jd,Zd,cE,Lo=Ct(()=>{N();me();_o();W();Qd="https://across.to/api",Jd="https://api.hop.exchange/v1",Zd="https://api.relay.link",cE={ethereum:1,optimism:10,bsc:56,polygon:137,arbitrum:42161,avalanche:43114,base:8453}});W();import{Interface as hu,getAddress as Qn,isAddress as wx}from"ethers";N();var Kn={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}},Ss=new Map(Object.values(Kn).map(e=>[e.chainId,e]));function Qr(e){return Ss.get(Number(e))||null}function Qw({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 Kn[e]=o,Ss.set(o.chainId,o),o}function Es(e,t=process.env){let n=Qr(e);if(!n)return null;for(let r of n.rpcEnv){let o=(t[r]||"").trim();if(o)return o}return null}function ks(e){return Ss.has(Number(e))}import{Interface as Jw,getAddress as Zw}from"ethers";var Jr=new Jw(["function allowance(address owner,address spender) view returns (uint256)","function balanceOf(address account) view returns (uint256)"]);function ot(e,t){try{return Zw(e).toLowerCase()}catch{throw new Error(`${t} must be a valid EVM address`)}}function ex(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 vs(e){return e==null?null:Number.parseInt(String(e),16)}var eu={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 tu(e,{rpcUrl:t,env:n=process.env}={}){if(t)return t;let r=Es(e,n);return r||eu[Number(e)]||null}var tx=/^(?:eth_(?:call|blocknumber|chainid|get[a-z0-9]+|feehistory|gasprice|maxpriorityfeepergas|syncing|protocolversion|estimategas|createaccesslist)|net_(?:version|listening|peercount)|web3_(?:clientversion|sha3))$/;function nx(e){let t=String(e||""),n=t.toLowerCase();if(t!==t.trim()||!/^[a-zA-Z0-9_]+$/.test(t)||!tx.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||"");nx(o);let i=tu(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 Yn(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:Qr(e)?.name||null}}async function Zr(e,t={}){let n=await L(e,"eth_blockNumber",[],t);return parseInt(n,16)}async function nu(e,t={}){let n=await L(e,"eth_chainId",[],t);return parseInt(n,16)}async function Qt(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 ru(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=Jr.encodeFunctionData("allowance",[o,i]),a=await L(n,"eth_call",[{to:r,data:s},e.blockTag||"latest"],t),c=Jr.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 eo(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=Jr.encodeFunctionData("balanceOf",[o]),s=await L(n,"eth_call",[{to:r,data:i},e.blockTag||"latest"],t),a=Jr.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 to(e={},t={}){let n=Number(e.chainId??t.chainId??1),r=ex(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=vs(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:vs(o.blockNumber),transactionIndex:vs(o.transactionIndex),logs:Array.isArray(o.logs)?o.logs:[],receipt:o}}async function ou(e={}){let t=e.chainIds||Object.values(Kn).map(r=>r.chainId),n={};return await Promise.all(t.map(async r=>{if(!ks(r)&&!eu[r]&&!tu(r,e)){n[r]={ok:!1,error:"no rpc configured",chainId:r};return}try{n[r]=await Yn(r,e)}catch(o){n[r]={ok:!1,chainId:r,error:String(o.message||o)}}})),n}N();var ox="https://api.dexscreener.com",ix=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(),sx=e=>Array.isArray(e)?e:e==null?[]:[e];function ax(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 cx(e){let t=Number(e?.liquidity?.usd);return Number.isFinite(t)&&t>=0?t:null}function no(e={}){return(e.baseUrl||process.env.DEXSCREENER_API_URL||ox).replace(/\/$/,"")}async function iu(e={}){let n=(await y(`${no(e)}/latest/dex/search?q=USDC`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??12e3}))?.pairs?.length||0;return{ok:n>0,pairSample:n}}async function Tt(e,t={}){if(!e)throw new Error("tokenAddress required");return y(`${no(t)}/latest/dex/tokens/${e}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3})}async function Xn(e,t={}){if(!e)throw new Error("query required");return y(`${no(t)}/latest/dex/search?q=${encodeURIComponent(e)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3})}async function su(e,t,n={}){if(!e||!t)throw new Error("chainId and pairAddress required");return y(`${no(n)}/latest/dex/pairs/${e}/${t}`,{fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs??12e3})}async function ro({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(ix[Number(e)]||e),s=new Set(sx(r).filter(Boolean).map(Te)),a=[...new Set([t,n].map(p=>String(p)).filter(Boolean))],c=await Promise.allSettled(a.map(p=>Tt(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=>ax(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:cx(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"}},xx=[100,500,3e3,1e4],io=new hu(["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)"]),fu=new hu(["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)"]),gu="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",yu="0x0000000000000000000000000000000000000000",_s=[100,500,2500,1e4],Sx={56:{pancakeswap:{name:"pancakeswap",quoter:"0xB048Bbc1Ee6b733FFfCFb9e9CeF7375518e25997",router:"0x13f4EA83D0bd40E75C8222255bc855a974568Dd4",feeTiers:_s}},8453:{pancakeswap:{name:"pancakeswap",quoter:"0xB048Bbc1Ee6b733FFfCFb9e9CeF7375518e25997",router:"0x13f4EA83D0bd40E75C8222255bc855a974568Dd4",feeTiers:_s}},42161:{pancakeswap:{name:"pancakeswap",quoter:"0xB048Bbc1Ee6b733FFfCFb9e9CeF7375518e25997",router:"0x13f4EA83D0bd40E75C8222255bc855a974568Dd4",feeTiers:_s}},999:{hyperswap:{name:"hyperswap",quoter:"0x03A918028f22D9E1473B7959C927AD7425A45C7C",router:"0x4E2960a8cd19B467b82d26D83fAcb0fAE26b094D"}}};function Cs(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=Sx[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 Ps(e,t){let n=ce[Number(t)];if(!e||e===gu||e===yu||/^eth$/i.test(String(e)))return Qn(n.weth);let r=String(e);if(/^weth$/i.test(r))return Qn(n.weth);if(/^usdc$/i.test(r))return Qn(n.usdc);if(!wx(r))throw new Error(`invalid token address: ${e}`);return Qn(r)}function Ex(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 kx(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}=Cs(e.chainId??8453,e.venue),s=Ps(e.tokenIn||"WETH",n),a=Ps(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:xx,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=io.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 S=io.decodeFunctionResult("quoteExactInputSingle",b),x={fee:h,ok:!0,amountOut:S[0].toString(),sqrtPriceX96After:S[1].toString(),initializedTicksCrossed:Number(S[2]),gasEstimate:S[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 ro({chainId:n,tokenA:s,tokenB:a,dexIds:Ex(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 bu(e={},t={}){let{chainId:n,quoter:r,router:o}=Cs(e.chainId??8453),i=(e.tokens||[]).map(p=>Ps(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=kx(i,s),l=io.encodeFunctionData("quoteExactInput",[c,a]),u=await L(n,"eth_call",[{to:r,data:l},"latest"],t),d=io.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 Ts(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 wu(e={},t={}){let n=Number(e.chainId??8453),r=Cs(n,e.venue),o=Qn(e.recipient),i=String(e.tokenIn||"WETH"),s=!e.tokenIn||i===gu||i===yu||/^eth$/i.test(i),a=await it(e,t),c=fu.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=fu.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 xu(e={}){let t=Number(e.chainId??8453);try{let n=await Ts({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 Su(){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 Ax,Interface as vu,getAddress as He,isAddress as so,keccak256 as Ix}from"ethers";me();W();var _x=Ax.defaultAbiCoder(),Jt="0x0000000000000000000000000000000000000000",je={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"}},Px=[{fee:100,tickSpacing:1},{fee:500,tickSpacing:10},{fee:3e3,tickSpacing:60},{fee:1e4,tickSpacing:200},{fee:25e3,tickSpacing:8}],Eu=new vu(["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)"]),zO=new vu(["function execute(bytes commands,bytes[] inputs,uint256 deadline) payable"]);var Cx="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE";function Au(e){let t=Number(e),n=je[t];if(!n)throw new Error(`uniswap-v4: unsupported chainId ${e} (supported: ${Object.keys(je).join(", ")})`);return{chainId:t,...n}}function ku(e,t){let n=je[Number(t)];if(!e||e===Cx||e===Jt||/^eth$/i.test(String(e)))return He(n.weth);let r=String(e);if(/^weth$/i.test(r))return He(n.weth);if(/^usdc$/i.test(r)||/^usdg$/i.test(r))return He(n.usdc);if(!so(r))throw new Error(`invalid token address: ${e}`);return He(r)}function Tx({currency0:e,currency1:t,fee:n,tickSpacing:r,hooks:o=Jt}){let i=He(e),s=He(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&&so(o)?He(o):Jt;return Ix(_x.encode(["address","address","uint24","int24","address"],[a,c,Number(n),Number(r),l]))}function Nx({tokenIn:e,tokenOut:t,fee:n,tickSpacing:r,hooks:o=Jt}){let i=He(e),s=He(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&&so(o)?He(o):Jt},zeroForOne:l}}var Ox=["uniswap-v4","uniswapv4"];async function ao(e={},t={}){let{chainId:n,quoter:r,poolManager:o,universalRouter:i}=Au(e.chainId??8453),s=ku(e.tokenIn||"WETH",n),a=ku(e.tokenOut||je[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}]:[...Px],u=e.hooks||Jt,d=[],p=null;for(let h of l){let{poolKey:g,zeroForOne:b}=Nx({tokenIn:s,tokenOut:a,fee:h.fee,tickSpacing:h.tickSpacing,hooks:u}),S=Eu.encodeFunctionData("quoteExactInputSingle",[{poolKey:g,zeroForOne:b,exactAmount:c,hookData:"0x"}]);try{let x=await L(n,"eth_call",[{to:r,data:S},"latest"],t);if(!x||x==="0x"){d.push({...h,ok:!1,error:"empty result"});continue}let w=Eu.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:Tx({...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 ro({chainId:n,tokenA:s,tokenB:a,dexIds:Ox},t).catch(()=>null):null,f=e.liquidityUsd??m?.liquidityUsd??null;return V({venue:"uniswap-v4",chainId:n,chain:je[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"&&so(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 Iu(){return Object.entries(je).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 _u(e={}){let t=Au(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 Jn=new Map,$x=Object.keys(ce).map(Number),Lx=Object.keys(je).map(Number),Ns=new Set,Pu=!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(Pu&&Ns.has(t))throw new Error(`registerProvider refuses to overwrite built-in provider: ${t}`);return Jn.set(t,{chainIds:e.chainIds||[],auth:e.auth||"none",description:e.description||"",baseEnv:e.baseEnv||[],...e,id:t}),Jn.get(t)}function co(e){return Jn.get(e)||null}function Zn({venue:e,op:t}={}){let n=[...Jn.values()];return e&&(n=n.filter(r=>r.venue===e)),t&&(n=n.filter(r=>r.ops.includes(t))),n}function Mx(){Ns.clear();for(let e of Jn.keys())Ns.add(e);Pu=!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:"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-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:$x,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:Lx,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."});Mx();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 Ux="https://api.hyperliquid.xyz/info",Bx="https://api.hyperliquid-testnet.xyz/info";function Dx({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"?Bx:Ux}async function G(e,t={}){if(!e||!e.type)throw new Error("hlInfo requires body.type");let n=Dx(t);return y(n,{method:"POST",body:e,fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function Cu(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 lo(e,t={}){if(!e)throw new Error("hlL2Book requires coin");return G({type:"l2Book",coin:String(e)},t)}async function er(e={}){return G({type:"outcomeMeta"},e)}async function uo(e,t={}){if(!e)throw new Error("hlClearinghouse requires user address");return G({type:"spotClearinghouseState",user:e},t)}async function Tu(e,t={}){if(!e)throw new Error("hlUserFills requires user address");return G({type:"userFills",user:e},t)}async function po(e={}){return G({type:"meta"},e)}async function Zt(e={}){let t={type:"metaAndAssetCtxs"};return e.dex&&(t.dex=e.dex),G(t,e)}async function en({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 Nu({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 Ou(e,t={}){if(!e)throw new Error("hlOpenOrders requires user");return G({type:"openOrders",user:e},t)}async function Ru(e,t={}){if(!e)throw new Error("hlFrontendOpenOrders requires user");return G({type:"frontendOpenOrders",user:e},t)}async function mo(e,t={}){if(!e)throw new Error("hlUserState requires user");return G({type:"clearinghouseState",user:e},t)}async function fo(e={}){return G({type:"spotMeta"},e)}N();var qx="https://clob.polymarket.com",Hx="https://gamma-api.polymarket.com";function tr(e={}){return(e.clobUrl||process.env.POLY_CLOB_URL||qx).replace(/\/$/,"")}function $u(e={}){return(e.gammaUrl||process.env.POLY_GAMMA_URL||Hx).replace(/\/$/,"")}async function Os(e={}){return y(`${tr(e)}/time`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs})}async function Lu(e={}){let t=await Os(e);return{ok:t!=null&&t!=="",time:t}}async function Mu({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(`${$u(r)}/markets?${o}`,{fetchImpl:r.fetchImpl,timeoutMs:r.timeoutMs})}async function Uu(e,t={}){if(!e)throw new Error("polyBook requires tokenId");let n=new URLSearchParams({token_id:String(e)});return y(`${tr(t)}/book?${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function Bu(e,t={}){if(!e)throw new Error("polyMidpoint requires tokenId");let n=new URLSearchParams({token_id:String(e)});return y(`${tr(t)}/midpoint?${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function Du(e,t={}){if(!e)throw new Error("polySpread requires tokenId");let n=new URLSearchParams({token_id:String(e)});return y(`${tr(t)}/spread?${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function Fu(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(`${tr(n)}/price?${r}`,{fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs})}async function qu({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(`${$u(r)}/events?${o}`,{fetchImpl:r.fetchImpl,timeoutMs:r.timeoutMs})}N();import{createHash as Hu}from"node:crypto";var tn="mainnet-beta",Vx="https://api.mainnet-beta.solana.com",Rs="TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA";function zx(e={}){return String(e.rpcUrl||process.env.SOLANA_RPC_URL||Vx).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 Wx(e,t){return t?[...e,{commitment:t}]:e}async function nr(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(zx(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 $s(e={},t={}){let n=e.commitment?[{commitment:e.commitment}]:[],r=await nr("getLatestBlockhash",n,t);return{provider:"solana-rpc",cluster:tn,blockhash:r?.value?.blockhash||null,lastValidBlockHeight:r?.value?.lastValidBlockHeight??null,slot:r?.context?.slot??null,raw:r}}async function ju(e={}){try{let[t,n]=await Promise.all([nr("getHealth",[],e),$s({},e)]);return{ok:t==="ok",provider:"solana-rpc",cluster:tn,health:t,latestBlockhash:n,exec:!1}}catch(t){return{ok:!1,provider:"solana-rpc",cluster:tn,error:String(t?.message||t),exec:!1}}}async function ho(e={},t={}){let n=K(e.address||e.owner,"address"),r=await nr("getBalance",Wx([n],e.commitment),t);return{provider:"solana-rpc",cluster:tn,address:n,lamports:String(r?.value??0),slot:r?.context?.slot??null,raw:r}}function Gx(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 rr(e={},t={}){let n=K(e.owner||e.address,"owner"),r=e.mint?{mint:K(e.mint,"mint")}:{programId:K(e.programId||Rs,"token program")},o={encoding:"jsonParsed"};e.commitment&&(o.commitment=e.commitment);let i=await nr("getTokenAccountsByOwner",[n,r,o],t),s=Array.isArray(i?.value)?i.value.map(Gx):[];return{provider:"solana-rpc",cluster:tn,owner:n,filter:r,slot:i?.context?.slot??null,accounts:s,raw:i}}function Kx(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 Yx(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 Xx(e){let t=Buffer.from(e,"base64");try{let n=Yx(t,0),r=n.offset+n.value*64;if(r>=t.length)throw new Error("missing message");return Hu("sha256").update(t.subarray(r)).digest("hex")}catch{return Hu("sha256").update(t).digest("hex")}}async function Vu(e={},t={}){let n=Kx(e.transaction||e.swapTransaction),r={encoding:"base64",sigVerify:!!e.sigVerify,replaceRecentBlockhash:e.replaceRecentBlockhash!==!1};e.commitment&&(r.commitment=e.commitment);let o=await nr("simulateTransaction",[n,r],t),i=o?.value||{};return{provider:"solana-rpc",cluster:tn,ok:i.err==null,transactionHash:Xx(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 Jx="mainnet",Zx="https://mempool.space/api",eS="https://mempool.space/testnet/api";function Ve(e={}){return String(e.network||process.env.BTC_NETWORK||Jx).trim().toLowerCase()==="testnet"?"testnet":"mainnet"}function Ms(e={}){return e.baseUrl?String(e.baseUrl).replace(/\/$/,""):process.env.BTC_ESPLORA_URL?String(process.env.BTC_ESPLORA_URL).replace(/\/$/,""):Ve(e)==="testnet"?eS:Zx}function Ls(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 tS(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 Us(e,t={}){let n=`${Ms(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 go(e,t={}){let n=await Us(e,t);try{return JSON.parse(n)}catch{return n}}async function zu(e={}){try{let t=await Us("/blocks/tip/height",e),n=Number(t);return{ok:Number.isFinite(n)&&n>0,provider:"bitcoin-esplora",network:Ve(e),baseUrl:Ls(Ms(e)),tipHeight:n,exec:!1,signing:"user-wallet"}}catch(t){return{ok:!1,provider:"bitcoin-esplora",network:Ve(e),baseUrl:Ls(Ms(e)),error:Ls(t?.message||t),exec:!1}}}async function Wu(e={}){let t=await Us("/blocks/tip/height",e);return{provider:"bitcoin-esplora",network:Ve(e),tipHeight:Number(t)}}async function Gu(e={}){try{let t=await go("/v1/fees/recommended",e);return{provider:"bitcoin-esplora",network:Ve(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:Ve(e),fastestFee:null,halfHourFee:null,hourFee:null,note:"fee endpoint unavailable on this Esplora host"}}}async function yo(e={},t={}){let n=Qe(e.address||e.addr,"address"),r=await go(`/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:Ve(t),address:n,balanceSats:String(s-a),chainStats:o,mempoolStats:i,raw:r}}async function Ku(e={},t={}){let n=Qe(e.address||e.addr,"address"),r=await go(`/address/${n}/utxo`,t),o=Array.isArray(r)?r:[];return{provider:"bitcoin-esplora",network:Ve(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 Yu(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 go(`/tx/${n}`,t);return{provider:"bitcoin-esplora",network:Ve(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 Xu(e={},t={}){let n=tS(e.txHex||e.hex||e.transaction,"txHex");return{provider:"bitcoin-esplora",network:Ve(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 Qu="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:Ju(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([Ju(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[Qu]||"")==="1")return{baseUrl:s,trusted:!1,host:c};if(o)throw new Error(`${e}: refusing to call non-allowlisted host ${c} (set ${Qu}=1 to permit it)`);return{baseUrl:s,trusted:!1,host:c}}function Ju(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 Bs="https://ordinals.com";function bo(e={}){return String(e.baseUrl||process.env.BTC_META_API_URL||process.env.UNISAT_API_URL||"").trim().replace(/\/$/,"")}var rS=["open-api.unisat.io","open-api-testnet.unisat.io","api.bestinslot.xyz","api.hiro.so"];function Zu(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=bo(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=rS.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 nn(e,t={}){let r=await(t.fetchImpl||fetch)(e,{method:"GET",headers:Zu(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 ed(e={}){let t=bo(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:Zu(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 wo(e={},t={}){let n=Qe(e.address||e.addr,"address"),r=bo(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 nn(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 rn(e={},t={}){let n=Qe(e.address||e.addr,"address"),r=bo(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 nn(a,t),l=iS(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 td(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||Bs,o=await nn(`${r}/r/inscription/${n}`,t);return{provider:"bitcoin-meta",source:"ordinals.com/r",keyless:!0,inscriptionId:n,info:o}}async function nd(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||Bs,o=Number(e.page||0),i=await nn(`${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 rd(e={},t={}){let n=t.ordinalsBase||Bs,r=e.height??await nn(`${n}/r/blockheight`,t),o=await nn(`${n}/r/blockinfo/${Number(r)}`,t);return{provider:"bitcoin-meta",source:"ordinals.com/r",keyless:!0,height:Number(r),info:o}}function iS(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 aS=["unsigned","notsigned","tosign","signable"],cS=new Set(["requiresusersignature","requiressignature","needssignature","signaturerequired","signaturesrequired","signingready","signaturecount","signaturethreshold","requiredsignatures","signatureneeded","hassignature","allowsignatures","requestsignature","multisig","cosig","msig"]),lS=new Set(["sig","sigs","scriptsig","witness","psbt","finalizedpsbt","completepsbt","finalpsbt","psbtfinalized","serializedtransaction"]);function Ds(e){return String(e).toLowerCase().replace(/[^a-z0-9]/g,"")}function uS(e){return aS.some(t=>e.startsWith(t))||cS.has(e)}function dS(e){let t=String(e);if(!/^[\x20-\x7e]+$/.test(t))return!0;let n=Ds(t);return uS(n)?!1:lS.has(n)?!0:n.includes("signed")||n.includes("signature")||n.endsWith("sig")||n.endsWith("sigs")}function pS(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 Fs(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=>Fs(c,t+1,n,r));let o=[];for(let[c,l]of Object.entries(e)){if(dS(c)){o.push(c);continue}o.push(...Fs(l,t+1,n,r))}let s=Object.keys(e).map(Ds).some(c=>c.endsWith("psbt")||c.endsWith("psbtbase64")),a=Object.entries(e).some(([c,l])=>/complete|finalized|isfinal/.test(Ds(c))&&l===!0);return s&&a&&o.push("psbt(complete)"),pS(e)&&o.push("v/r/s"),o}function Je(e,t){let n=Fs(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 mS="https://api.satflow.com/v1";function od(e={}){return Ne({provider:"satflow",defaultUrl:mS,hosts:["api.satflow.com"],url:e.baseUrl||process.env.SATFLOW_API_URL})}function xo(e={}){return od(e).baseUrl}function Hs(e={}){return String(e.apiKey||process.env.SATFLOW_API_KEY||process.env.BTC_SATFLOW_API_KEY||"").trim()}function fS(e={}){return Ee({accept:"application/json","content-type":"application/json","user-agent":"oracle-btc-satflow/0.1"},{"x-api-key":Hs(e)},od(e).trusted)}async function st(e,{method:t="GET",body:n,opts:r={}}={}){if(!Hs(r))throw new Error("satflow: SATFLOW_API_KEY not set (request key via Satflow docs form)");let i=`${xo(r)}${e.startsWith("/")?e:`/${e}`}`,a=await(r.fetchImpl||fetch)(i,{method:t,headers:fS(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 id(e={}){if(!!!Hs(e))return{ok:!1,provider:"satflow",baseUrl:xo(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 st("/collection/stats/floors?type=ordinals",{opts:e}),{ok:!0,provider:"satflow",baseUrl:xo(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:xo(e),apiKeyPresent:!0,error:String(n?.message||n).slice(0,200),magicEdenOrdinals:"deprecated-dead"}}}async function sd(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 st(`/collection/stats/floors?${r}`,{opts:t});return{provider:"satflow",type:n,floors:o,magicEdenOrdinals:"deprecated-dead"}}async function ad(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 st(`/collection/stats?${r}`,{opts:t});return{provider:"satflow",collectionId:n,stats:o}}async function cd(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 st(`/item?${r}`,{opts:t})}}async function So(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 st(`/address/wallet-contents?${r}`,{opts:t});return{provider:"satflow",address:n,contents:o}}async function ld(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 st(`/orders/floor?${r}`,{opts:t})}}var hS=new Set(["body","execute","fetchImpl","opts","apiKey","baseUrl","timeoutMs","maxSats","operator"]);function ud(e={},t=null){let n=e.body&&typeof e.body=="object"?e.body:e,r={};for(let[o,i]of Object.entries(n))hS.has(o)||t&&!t.has(o)||i!==void 0&&(r[o]=i);return r}var gS=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"]),yS=new Set(["inscription_id","inscriptionId","runes_output","runesOutput","ord_address","receive_address","price","tap_key","collection_slug","expires_at"]);function qs(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 dd(e={},t={}){let n=ud(e,gS);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=qs(n);if(i!=null&&i>o)throw new Error(`satflow: requested price ${i} sats exceeds maxSats cap ${o}`);let s=await st("/intent/satflow-purchase",{method:"POST",body:n,opts:t}),a=qs(s)??qs(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 Eo(e={},t={}){let n=ud(e,yS);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 st("/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 ko="https://lite-api.jup.ag/swap/v1",fd="So11111111111111111111111111111111111111112",hd="EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",wS=100,pd=2e4;function gd(e={}){return String(e.baseUrl||process.env.JUPITER_SWAP_API_URL||ko).replace(/\/$/,"")}function vo(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 yd(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>wS)throw new Error("jupiter: slippage exceeds hard 100 bps cap");return t}function js(e,t){return e==null?t:!!e}function xS(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 Vs(e={},{quotedAtMs:t=Date.now(),ttlMs:n=pd}={}){let r=K(e.inputMint,"inputMint"),o=K(e.outputMint,"outputMint"),i=vo(e.inAmount,"inAmount"),s=vo(e.outAmount,"outAmount"),a=vo(e.otherAmountThreshold??e.outAmount,"otherAmountThreshold"),c=yd(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)||pd,1e3),3e4)}}var SS=new Set(["BPFLoaderUpgradeab1e11111111111111111111111","BPFLoader2111111111111111111111111111111111","BPFLoader1111111111111111111111111111111111"]),ES="123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz";function md(e){if(typeof e!="string"||!e.length)return!1;let t=0n;for(let o of e){let i=ES.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 bd(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(`${ko}/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])=>md(p)),c=[],l=s.filter(([p])=>!md(p)).map(([p,m])=>({programId:p,label:m,reason:"malformed program id"}));if(e.verify===!1)return{source:`${ko}/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,S]=m[g];h&&h.executable===!0&&SS.has(h.owner)?c.push({programId:b,label:S,owner:h.owner}):l.push({programId:b,label:S,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:`${ko}/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 wd(e={}){try{return{ok:!0,provider:"jupiter",outAmount:(await Ao({inputMint:fd,outputMint:hd,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 Ao(e={},t={}){let n=K(e.inputMint||e.fromMint||fd,"inputMint"),r=K(e.outputMint||e.toMint||hd,"outputMint"),o=vo(e.amount||e.inAmount,"amount"),i=yd(e.slippageBps??e.maxSlippageBps??50),s=new URL(`${gd(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=Vs({...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 kS(e){return Object.fromEntries(Object.entries(e).filter(([,t])=>t!==void 0))}async function xd(e={},t={}){let n=K(e.userPublicKey||e.owner||e.wallet,"userPublicKey"),r=e.quoteResponse?{quote:e.quoteResponse,solanaGuard:Vs(e.quoteResponse,t)}:await Ao(e,t),o=r.quote,i=r.solanaGuard||Vs(o,t);if(js(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(`${gd(t)}/swap`,{method:"POST",body:kS({quoteResponse:o,userPublicKey:n,wrapAndUnwrapSol:js(e.wrapAndUnwrapSol,!0),dynamicComputeUnitLimit:js(e.dynamicComputeUnitLimit,!0),dynamicSlippage:!1,prioritizationFeeLamports:e.prioritizationFeeLamports}),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),a=xS(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 AS="https://coins.llama.fi",IS="https://api.llama.fi",_S="https://yields.llama.fi",PS="https://stablecoins.llama.fi";function CS(e={}){return(e.baseUrl||process.env.DEFILLAMA_COINS_URL||AS).replace(/\/$/,"")}function Sd(e={}){return(e.baseUrl||process.env.DEFILLAMA_API_URL||IS).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(`${CS(t)}/prices/current/${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function Ed(e={}){let n=(await Oe(["coingecko:ethereum"],e))?.coins?.["coingecko:ethereum"];return{ok:!!n?.price,ethUsd:n?.price??null}}async function Io(e={}){return y(`${Sd(e)}/protocols`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??2e4})}async function kd(e={},t={}){let n=(t.yieldsBaseUrl||process.env.DEFILLAMA_YIELDS_URL||_S).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 vd(e={},t={}){let n=(t.stablecoinsBaseUrl||process.env.DEFILLAMA_STABLECOINS_URL||PS).replace(/\/$/,""),r=e.includePrices!==!1;return y(`${n}/stablecoins?includePrices=${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??3e4})}async function Ad(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(`${Sd(t)}/overview/dexs/${n}?${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??3e4})}async function Id(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();_o();W();import{existsSync as DS,readFileSync as FS}from"node:fs";import{homedir as qS}from"node:os";import{join as _d}from"node:path";import{Contract as NS,JsonRpcProvider as OS}from"ethers";var RS="0x62FCFAf7573AD8B41a0FBF347AfEb85e06599A75",$S=999,LS="https://rpc.hyperliquid.xyz/evm",MS=["function balanceOf(address owner) view returns (uint256)"],US=/^0x[a-fA-F0-9]{40}$/;function BS(e){return US.test(String(e||""))}async function Po(e,{contract:t=RS,rpc:n=LS,chainId:r=$S,balanceOf:o}={}){if(!BS(e))throw new Error("invalid-address");if(o)return BigInt(await o(e));let i=new OS(n,r,{staticNetwork:!0}),s=new NS(t,MS,i);return BigInt(await s.balanceOf(e))}var HS=100,jS=5,Pd=Object.freeze({swap:5,bridge:5,perps:0,nft:0});function VS(e){let t=String(e||"swap").toLowerCase();return Object.prototype.hasOwnProperty.call(Pd,t)?Pd[t]:jS}var zS="ORACLE_INTEGRATOR_FEE_BPS",WS="ORACLE_INTEGRATOR_FEE_RECIPIENT",GS="ORACLE_INTEGRATOR_ID",Cd="ORACLE_INTEGRATOR_FEE_RECIPIENT_PIN",KS="oracle";function YS(e=process.env){if(e[Cd])return String(e[Cd]);let t=e.ORACLE_CONFIG_DIR||_d(qS(),".config","oracle");return _d(t,"fee-recipient")}function Ws(e=process.env){try{let t=YS(e);if(!DS(t))return"";let n=FS(t,"utf8").trim().toLowerCase();return/^0x[a-f0-9]{40}$/.test(n)?n:""}catch{return""}}function XS(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),HS)}function QS({env:e=process.env,action:t="swap",admin:n=!1}={}){let r=String(e[WS]||"").trim(),o=String(e[GS]||KS).trim();if(n===!0)return{bps:0,recipient:"",integrator:o,action:t,applies:!1,reason:"admin-oracle"};let i=VS(t),s=XS(e[zS],{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=Ws(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 Co({wallet:e,env:t=process.env,action:n="swap",holderCheck:r={},admin:o=!1}={}){let i=QS({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 Po(s,r))>0n?{...i,bps:0,applies:!1,reason:"locals-only-holder",holderVerificationStatus:"holder"}:{...i,holderVerificationStatus:"non-holder"}}catch{return{...i,holderVerificationStatus:"unavailable"}}}function Td(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 Nd(e){return e?.applies?{integrator:e.integrator,fee:String(e.bps/1e4)}:{}}function Od(e){return e?.applies?{partner:e.integrator,partnerFeeBps:String(e.bps),partnerAddress:e.recipient}:{}}var JS="https://li.quest/v1";function Ks(e={}){return(e.baseUrl||process.env.LIFI_API_URL||JS).replace(/\/$/,"")}var Gs="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",ZS="0x0000000000000000000000000000000000000000";function eE(e){let t=String(e||Gs).toLowerCase();return t===Gs.toLowerCase()||t===ZS}function Rd(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 $d(e={}){let t=await y(`${Ks(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 ct(e={},t={}){let{fromChain:n,toChain:r=n,fromToken:o=Gs,toToken:i,fromAmount:s,fromAddress:a=at}=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 Co({wallet:e.fromAddress,env:t.env,action:e.feeAction||"swap",holderCheck:t.holderCheck});for(let[g,b]of Object.entries(Nd(u)))c.set(g,b);let d=await y(`${Ks(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 Ld(e={},t={}){let n=await ct(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(!eE(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:Rd(a,"approval token"),spender:Rd(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 Md(e={}){return y(`${Ks(e)}/chains`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??12e3})}import{Interface as Dd,getAddress as or,isAddress as nE}from"ethers";me();W();var lt={8453:{name:"base",quoter:"0x254cF9E1E6e233aa1AC962CB9B05b2cfeAaE15b0",router:"0xBE6D8f0d05cC4be24d5167a3eF062215bE6D18a5",factory:"0x5e7BB104d84c7CB9B682AaC2F3d509f5F406809A",weth:"0x4200000000000000000000000000000000000006",usdc:"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"}},rE=[1,50,100,200,2e3],Ud=new Dd(["function quoteExactInputSingle((address tokenIn, address tokenOut, uint256 amountIn, int24 tickSpacing, uint160 sqrtPriceLimitX96) params) returns (uint256 amountOut, uint160 sqrtPriceX96After, uint32 initializedTicksCrossed, uint256 gasEstimate)"]),oE=new Dd(["function exactInputSingle((address tokenIn, address tokenOut, int24 tickSpacing, address recipient, uint256 deadline, uint256 amountIn, uint256 amountOutMinimum, uint160 sqrtPriceLimitX96) params) payable returns (uint256 amountOut)"]),Fd="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",qd="0x0000000000000000000000000000000000000000";function Hd(e){let t=Number(e),n=lt[t];if(!n)throw new Error(`aerodrome: unsupported chainId ${e} (supported: ${Object.keys(lt).join(", ")})`);return{chainId:t,...n}}function Bd(e,t){let n=lt[Number(t)];if(!e||e===Fd||e===qd||/^eth$/i.test(String(e)))return or(n.weth);let r=String(e);if(/^weth$/i.test(r))return or(n.weth);if(/^usdc$/i.test(r))return or(n.usdc);if(!nE(r))throw new Error(`invalid token address: ${e}`);return or(r)}async function To(e={},t={}){let{chainId:n,quoter:r,router:o}=Hd(e.chainId??8453),i=Bd(e.tokenIn||"WETH",n),s=Bd(e.tokenOut||lt[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]:[...rE],l=[],u=null;for(let d of c){let p=Ud.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=Ud.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:lt[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 jd(e={},t={}){let n=Number(e.chainId??8453),r=Hd(n),o=or(e.recipient||e.from||e.userAddress),i=String(e.tokenIn||"WETH"),s=!e.tokenIn||i===Fd||i===qd||/^eth$/i.test(i),a=await To(e,t),c=Math.min(600,Math.max(30,Number(e.deadlineSeconds??300))),u=Number(t.nowSeconds??Math.floor(Date.now()/1e3))+c,d=oE.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 Vd(e={}){let t=Number(e.chainId??8453);try{let n=await To({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:lt[t]?.router,quoter:lt[t]?.quoter}}catch(n){return{ok:!1,chainId:t,error:String(n.message||n).slice(0,200)}}}async function zd(){return Object.entries(lt).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 sE="https://api.0x.org";function Wd(e={}){return Ne({provider:"zerox",defaultUrl:sE,hosts:["api.0x.org"],url:e.baseUrl||process.env.ZEROX_API_URL})}function Gd(e={}){return Wd(e).baseUrl}function No(e={}){return e.apiKey||process.env.ZEROX_API_KEY||process.env.OX_API_KEY||process.env["0X_API_KEY"]||""}function Kd(e={}){return Ee({"0x-version":"v2",accept:"application/json"},{"0x-api-key":No(e)},Wd(e).trusted)}async function Yd(e={}){if(!No(e))return{ok:!1,configured:!1,error:"ZEROX_API_KEY not set"};try{let t=await Ys({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 Ys(e={},t={}){if(!No(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(`${Gd(t)}/swap/allowance-holder/price?${a}`,{headers:Kd(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function Nt(e={},t={}){if(!No(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(`${Gd(t)}/swap/allowance-holder/quote?${c}`,{headers:Kd(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 Xd(e={},t={}){if(!e.taker)throw new Error("0x: taker required for executable prepare");let n=await Nt(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"})}Lo();N();me();import{TypedDataEncoder as fE,getAddress as sr,isAddress as hE}from"ethers";var FR=Object.freeze({READ:"read",PREPARE:"prepare",EXECUTE:"execute",AUTONOMOUS:"autonomous"}),lE=new Set(["evm:execute","btc:execute","solana:execute","nft:buy","nft:mint","cow:submit"]),uE=new Set(["evm:prepare"]),dE="public package is prepare-only; the user wallet or private operator must sign and submit";function on(e=process.env){return String(e.ORACLE_AUTONOMOUS_TRADING??"").trim()==="1"}function ep(e,{env:t=process.env,userInitiated:n=!1,autonomous:r=!1}={}){return lE.has(e)?{capability:e,armed:!1,allowed:!1,reason:dE}:uE.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&&!on(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 pE(e,t={}){let n=ep(e,t);if(!n.allowed){let r=new Error(`oracle: ${e} not permitted: ${n.reason}`);throw r.status=n,r}return n}function mE(e=process.env){return{model:"public prepare-only; execution is unavailable",armed:[],autonomousTrading:"off",autonomousPreparation:on(e)?"ENABLED":"off",note:"Oracle prepares unsigned actions. The user wallet or private operator signs and submits."}}_o();W();var np={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"},gE=Object.freeze({1:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41",100:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41",42161:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41",8453:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41"}),yE=Object.freeze({1:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110",100:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110",42161:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110",8453:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110"}),ta={1:"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",8453:"0x4200000000000000000000000000000000000006",42161:"0x82aF49447D8a07e3bd95BD0d56f35241523fBab1"},rp={1:"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",8453:"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",42161:"0xaf88d065e77c8cC2239327C5EDb3A432268e5831"},tp=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"}]}),YR=Object.freeze({OrderCancellations:[{name:"orderUids",type:"bytes[]"}]});function na(e,t={}){if(t.baseUrl)return t.baseUrl.replace(/\/$/,"");let n=np[Number(e)];if(!n)throw new Error(`cowswap: unsupported chainId ${e}`);return n}function Mo(e,t){let n=String(e||"").trim();if(!hE(n))throw new Error(`cowswap: ${t} must be an address`);return sr(n).toLowerCase()}function ea(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 bE(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 wE(e){let t=gE[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:sr(t)}}function xE(e={},t,n){let r=Mo(e.sellToken,"sellToken"),o=Mo(e.buyToken,"buyToken"),i=Mo(e.receiver||n,"receiver"),s=Number(e.validTo);if(!Number.isInteger(s)||s<=0)throw new Error("cowswap: quote.validTo required");let a=bE(e.appData||e.appDataHash||`0x${"0".repeat(64)}`,"appData");return{sellToken:r,buyToken:o,receiver:i,sellAmount:ea(e.sellAmount,"sellAmount"),buyAmount:ea(e.buyAmount,"buyAmount"),validTo:s,appData:a,feeAmount:ea(e.feeAmount??"0","feeAmount"),kind:String(e.kind||"sell"),partiallyFillable:!!e.partiallyFillable,sellTokenBalance:String(e.sellTokenBalance||"erc20"),buyTokenBalance:String(e.buyTokenBalance||"erc20")}}async function op(e={}){try{let t=await ut({chainId:1,sellToken:ta[1],buyToken:rp[1],sellAmountBeforeFee:"1000000000000000",from:at},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 ut(e={},t={}){let n=Number(e.chainId??1),r=zs(e.from||e.owner),o=e.sellToken||ta[n],i=e.buyToken||rp[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=ta[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(`${na(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 ip(e={},t={}){let n=Number(e.chainId??1),r=Mo(zs(e.from||e.owner||e.signer),"owner"),o=await ut({...e,chainId:n,from:r,signingScheme:e.signingScheme||"eip712"},t),i=xE(o?.quote||o,n,r),s=wE(n),a={domain:s,types:tp,primaryType:"Order",message:i},c=fE.hash(s,tp,i),l=yE[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:sr(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:sr(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:sr(l).toLowerCase(),amount:i.sellAmount}},{provider:"cowswap",kind:"cow-order"})}async function sp(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(`${na(n,t)}/orders/${encodeURIComponent(r)}/status`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function ap(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(`${na(n,t)}/orders/${encodeURIComponent(r)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}function cp(){return Object.keys(np).map(Number)}N();me();W();var EE="https://api.1inch.dev/swap/v6.0";function lp(e={}){return Ne({provider:"oneinch",defaultUrl:EE,hosts:["api.1inch.dev"],url:e.baseUrl||process.env.ONEINCH_API_URL})}function ra(e={}){return lp(e).baseUrl}function ar(e={}){return e.apiKey||process.env.ONEINCH_API_KEY||process.env.ONE_INCH_API_KEY||""}function oa(e={}){let t=ar(e);return Ee({accept:"application/json"},{Authorization:t?`Bearer ${t}`:""},lp(e).trusted)}async function up(e={}){if(!ar(e))return{ok:!1,configured:!1,error:"ONEINCH_API_KEY not set"};try{return{ok:!0,configured:!0,dstAmount:(await cr({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 cr(e={},t={}){if(!ar(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(`${ra(t)}/${n}/quote?${s}`,{headers:oa(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 kE(e){return/^(eth|native|0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee)$/i.test(String(e||""))}async function ia(e={},t={}){if(!ar(t))throw new Error("ONEINCH_API_KEY required for 1inch");let n=Number(e.chainId??1);return y(`${ra(t)}/${n}/approve/spender`,{headers:oa(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function dp(e={},t={}){if(!ar(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(`${ra(t)}/${n}/swap?${c}`,{headers:oa(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(!kE(r)){let f=l?.spender||l?.approvalAddress||(await ia({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 AE=process.env.HL_WS_URL||"wss://api.hyperliquid.xyz/ws";async function lr(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||AE,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 pp(e={}){try{let t=await lr({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 mp(e={}){let t=await lr({type:"allMids"},e),n=t.last||{};return{ms:t.ms,mids:n.data?.mids||n.data||{},channel:n.channel}}async function fp(e,t={}){if(!e)throw new Error("coin required");let n=await lr({type:"l2Book",coin:String(e)},t);return{ms:n.ms,book:n.last?.data||n.last,channel:n.last?.channel}}var _E=process.env.POLY_WS_URL||"wss://ws-subscriptions-clob.polymarket.com/ws/market";async function Uo(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||_E,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 hp(e={}){let t=e.assetId||"98022490269692409998126496127597032490334070080325855126491859374983463996227";try{let n=await Uo([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 gp(e,t={}){if(!e)throw new Error("assetId required");let n=await Uo([e],t);return{ms:n.ms,assetId:String(e),data:n.last,messages:n.messages}}N();import{readFileSync as CE,existsSync as TE}from"node:fs";import{getAddress as NE}from"ethers";W();var OE="https://api.opensea.io/api/v2",RE=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"]),$E=new Set(RE),bp=new Set(["solana","flow"]),LE="0x0000000000000000000000000000000000000000";function ME(){let e=process.env.OPENSEA_ENV_FILE||`${process.env.HOME||""}/.config/locals-only/opensea.env`;if(!TE(e))return"";try{for(let t of CE(e,"utf8").split(`
3
- `)){let n=t.match(/^\s*OPENSEA_API_KEY\s*=\s*(.+)\s*$/);if(n)return n[1].replace(/^["']|["']$/g,"").trim()}}catch{}return""}function an(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||ME()}function wp(e={}){return Ne({provider:"opensea",defaultUrl:OE,hosts:["api.opensea.io","testnets-api.opensea.io"],url:e.baseUrl||process.env.OPENSEA_API_URL})}function Bo(e={}){return wp(e).baseUrl}function Do(e={}){return Ee({accept:"application/json"},{"x-api-key":an(e)},wp(e).trusted)}function xp(e){let t=String(e||"ethereum").trim().toLowerCase();if(!$E.has(t))throw new Error(`opensea: unsupported account chain ${t}`);return t}function sn(e,t="address"){try{return NE(String(e||"").trim().toLowerCase())}catch{throw new Error(`opensea: invalid ${t}`)}}function Sp(e,t=null){let n=String(e||"").trim();if(!n)throw new Error("opensea: account address required");if(t&&!bp.has(t)||!t&&/^0x[0-9a-fA-F]{40}$/.test(n))return sn(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 UE(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 BE(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 yp(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 DE(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 Ep(e={}){if(!an(e))return{ok:!1,configured:!1,error:"OPENSEA_API_KEY not set"};try{let t=await Fo("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 Fo(e,t={}){if(!e)throw new Error("collection slug required");if(!an(t))throw new Error("OPENSEA_API_KEY required");return y(`${Bo(t)}/collections/${encodeURIComponent(e)}`,{headers:Do(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function kp(e,t={}){let n=await Fo(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 ur(e={},t={}){if(!an(t))throw new Error("OPENSEA_API_KEY required");let n=xp(e.chain),r=Sp(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(`${Bo(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:Do(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4});for(let d of Array.isArray(u?.nfts)?u.nfts:[])s.push(DE(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 qo(e={},t={}){if(!an(t))throw new Error("OPENSEA_API_KEY required");let n=Sp(e.address||e.owner),r=await y(`${Bo(t)}/account/${encodeURIComponent(n)}/pnl`,{headers:Do(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=xp(e.chain);if(bp.has(t))throw new Error("opensea: listing actions currently require an EVM NFT chain");let n=e.startTime||e.start_time?yp(e.startTime||e.start_time,"startTime"):{text:new Date().toISOString(),ms:Date.now()},r=yp(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:sn(e.contract,"NFT contract"),token_id:o,quantity:BE(e.quantity??1,"quantity"),price:{amount:UE(e.price?.amount??e.amount??e.priceAmount,"price amount"),currency:sn(e.price?.currency??e.currency??LE,"price currency")},start_time:n.text,end_time:r.text}}function qE(e=[]){return e.some(t=>/approv|setapprovalforall/i.test(JSON.stringify(t)))}async function Ho(e={},t={}){if(!an(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=sn(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=sn(e.taker,"taker"));let c=await y(`${Bo(t)}/listings/actions`,{method:"POST",headers:Do(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:qE(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 vp=999;async function Ap(e={}){let t={chainId:vp,rpc:null,dex:null};try{t.rpc=await Yn(vp,e)}catch(n){t.rpc={ok:!1,error:String(n.message||n).slice(0,120)}}try{let n=await Xn("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 Ip(e="HYPE",t={}){let r=(await Xn(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 _p(e,t={}){return Tt(e,t)}N();W();var VE="https://api-mainnet.magiceden.dev/v2",dr=1e9;function Pp(e={}){return Ne({provider:"magiceden",defaultUrl:VE,hosts:["api-mainnet.magiceden.dev","api-devnet.magiceden.dev"],url:e.baseUrl||process.env.MAGICEDEN_API_URL})}function ln(e={}){return Pp(e).baseUrl}function Ot(e={}){return e.apiKey||process.env.MAGICEDEN_API_KEY||""}function un(e={}){let t=Ot(e);return Ee({accept:"application/json"},{Authorization:t?`Bearer ${t}`:""},Pp(e).trusted)}function sa(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 cn(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 zE(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 WE(e){return Math.round(cn(e,"priceSol")*dr)}function GE(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 YE(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 Cp(e={}){try{let t=await aa({symbol:"mad_lads"},e);return{ok:!0,provider:"magiceden-sol",keyed:!!Ot(e),readTier:"keyless",prepareTier:Ot(e)?"keyed":"requires MAGICEDEN_API_KEY",floorPriceSol:t.floorPriceSol,exec:!1}}catch(t){return{ok:!1,provider:"magiceden-sol",keyed:!!Ot(e),error:String(t?.message||t).slice(0,160),exec:!1}}}async function aa(e={},t={}){let n=sa(e.symbol||e.collection),r=await y(`${ln(t)}/collections/${encodeURIComponent(n)}/stats`,{headers:un(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/dr:null,listedCount:r?.listedCount??null,volume24hrSol:r?.volume24hr!=null?Number(r.volume24hr)/dr:null,avgPrice24hrSol:r?.avgPrice24hr!=null?Number(r.avgPrice24hr)/dr:null,exec:!1,raw:r}}function Tp(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*dr):null,tokenSize:e.tokenSize??1}}async function Np(e={},t={}){let n=sa(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(`${ln(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:un(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),a=(Array.isArray(s)?s:[]).map(Tp);return{provider:"magiceden-sol",chain:"solana-mainnet-beta",symbol:n,count:a.length,listings:a,exec:!1}}async function Op(e={},t={}){let n=K(e.tokenMint||e.mint,"tokenMint"),r=await y(`${ln(t)}/tokens/${encodeURIComponent(n)}/listings`,{headers:un(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),o=(Array.isArray(r)?r:[]).map(Tp);return{provider:"magiceden-sol",chain:"solana-mainnet-beta",tokenMint:n,listings:o,exec:!1}}async function Rp(e={},t={}){if(!Ot(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=cn(e.priceSol??e.price,"priceSol"),c=e.maxPriceSol==null?a:cn(e.maxPriceSol,"maxPriceSol");if(a>c)throw new Error(`magiceden: listing price ${a} SOL exceeds maxPriceSol cap ${c} SOL`);let l=new URL(`${ln(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:un(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:WE(a),transaction:p,transactionEncoding:"base64",raw:u})}async function jo(e={},t={}){if(!Ot(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=cn(e.priceSol??e.price,"priceSol"),a=GE(e.expiry),c=YE(e,{tokenMint:r,priceSol:s,expiry:a}),l=new URL(`${ln(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:un(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 $p(e={},t={}){if(!Ot(t))throw new Error("magiceden: MAGICEDEN_API_KEY required to build a mint instruction");let n=K(e.buyer||e.userPublicKey,"buyer"),r=sa(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=cn(e.maxPriceSol,"maxPriceSol"),i=e.nftAmount==null?1:cn(e.nftAmount,"nftAmount");if(!Number.isInteger(i))throw new Error("magiceden: nftAmount must be a whole number");let s=new URL(`${ln(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:un(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),c=zE(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 dn=8,ca=10n**BigInt(dn),QE="0xa4b1",Lp=7,la=1,JE=2n**64n-1n;function ZE(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 mr(e={}){return e.testnet||process.env.HL_TESTNET==="1"?"Testnet":"Mainnet"}function mn(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 pr(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>dn)throw new Error(`hl-staking: ${t} has more than ${dn} decimals`);let i=BigInt(r)*ca+BigInt((o+"0".repeat(dn)).slice(0,dn)||"0");if(i<=0n)throw new Error(`hl-staking: ${t} must be greater than zero`);if(i>JE)throw new Error(`hl-staking: ${t} exceeds the uint64 range the signed action encodes`);return i.toString()}function pn(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/ca,r=(t%ca).toString().padStart(dn,"0").replace(/0+$/,"");return r?`${n}.${r}`:String(n)}async function Mp(e={}){try{let t=await ua(e);return{ok:t.count>0,provider:"hl-staking",chain:mr(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 ua(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 da(e={},t={}){let n=mn(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=mn(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 Up(e={},t={}){let n=mn(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 Bp(e={},t={}){let n=mn(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 ma(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 Vo(e={}){return String(e.signatureChainId||process.env.HL_SIGNATURE_CHAIN_ID||QE)}function ek(e={}){return{name:"HyperliquidSignTransaction",version:"1",chainId:Number(BigInt(Vo(e))),verifyingContract:"0x0000000000000000000000000000000000000000"}}function fa({kind:e,action:t,types:n,primaryType:r,message:o,opts:i,notes:s,caps:a}){return O({provider:"hl-staking",venue:"hypercore",chain:mr(i),kind:e,prepareReady:!0,executionReady:!1,signingReady:!1,broadcastReady:!1,requiresUserSignature:!0,signWith:"user wallet (EIP-712 typed data)",submitTo:ZE(i),submitShape:{action:t,nonce:t.nonce,signature:"<user 65-byte signature>"},action:t,typedData:{domain:ek(i),types:n,primaryType:r,message:o},caps:a||null,notes:s,exec:!1},{provider:"hl-staking",kind:e})}function Dp(e={},t={}){let n=pr(e.amountHype??e.amount,"amountHype"),r=e.maxHype==null?null:pr(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=ma(e),i=mr(t),s={type:"cDeposit",hyperliquidChain:i,signatureChainId:Vo(t),wei:pn(n),nonce:o};return fa({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:pn(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 Fp(e={},t={}){let n=pr(e.amountHype??e.amount,"amountHype"),r=ma(e),o=mr(t),i={type:"cWithdraw",hyperliquidChain:o,signatureChainId:Vo(t),wei:pn(n),nonce:r};return fa({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:pn(n),nonce:r},opts:t,caps:{amountHype:Ze(n)},notes:[`Starts the ${Lp} 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 qp(e={},t={}){let n=mn(e.validator,"validator"),r=pr(e.amountHype??e.amount,"amountHype"),o=!!(e.isUndelegate??e.undelegate??!1),i=e.maxHype==null?null:pr(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=ma(e),a=mr(t),c={type:"tokenDelegate",hyperliquidChain:a,signatureChainId:Vo(t),validator:n,wei:pn(r),isUndelegate:o,nonce:s};return fa({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:pn(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 ${la} 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 ${la} day.`,"Check the validator's commission and jail status before delegating.","Oracle prepared this. Your wallet signs it. Nothing was submitted."]})}async function Hp(e={},t={}){let n=mn(e.user||e.address,"user"),r=await da({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:Lp,validatorLockupDays:la,exec:!1}}async function ha(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 nk=24*365,rk=8;function se(e){if(e==null)return null;let t=Number(e);return Number.isFinite(t)?t:null}function ok(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([Zt(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:ok(d,p),dayNtlVolumeUsd:se(u.dayNtlVlm),premium:se(u.premium),fundingRate:f,fundingRateAprPct:f==null?null:f*(nk/rk)*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 jp(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 Vp(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),en({coin:n,interval:r,startTime:s,endTime:i},t).catch(()=>[]),lo(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 zp(e={},t={}){let n=await fo(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 Yp=1e8,sk=1e5,fr={at:0,dexs:null},Wp=new Map;async function Gp(e={}){let t=Date.now();if(fr.dexs&&t-fr.at<6e4&&!e.fetchImpl)return fr.dexs;let n=await G({type:"perpDexs"},e);return fr={at:t,dexs:Array.isArray(n)?n:[]},fr.dexs}async function Kp(e="",t={}){let n=e||"",r=Date.now(),o=Wp.get(n);if(o&&r-o.at<3e4&&!t.fetchImpl)return o;let i=e?await G({type:"metaAndAssetCtxs",dex:e},t):await Zt(t),s=i?.[0]?.universe??i?.universe??[],a=Array.isArray(i?.[1])?i[1]:[],c={at:r,universe:s,ctxs:a};return Wp.set(n,c),c}function ak(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:Yp+n}}function Wo(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:Yp+o}}async function ga(e={},t={}){if(e.outcome!=null||e.coin&&String(e.coin).startsWith("#")){let l=e.outcome!=null?Wo(e.outcome,e.side??e.outcomeSide??0):ak(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 Gp(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 Kp(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 S=sk+m*1e4+g,x=h[g]||{};return{kind:"hip3",coin:b.name||n,assetId:S,szDecimals:b.szDecimals??0,maxLeverage:b.maxLeverage??null,dex:l,dexIndex:m,indexInMeta:g,markPx:x.markPx??null}}let{universe:r,ctxs:o}=await Kp("",t),i=n.toUpperCase(),s=r.findIndex(l=>l.name===i);if(s<0){if(t.allowBareBuilderLeaf===!0)try{let l=await Gp(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 ga({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 Xp(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 ck=5,lk=6,Zp="0x66eee";var Qp=10,ya="ORACLE_HL_BUILDER_ADDRESS",Jp="ORACLE_HL_BUILDER_FEE_BPS",Go=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"}),Yo=Object.freeze({GTC:"Gtc",IOC:"Ioc",ALO:"Alo"}),Ko=Object.freeze({CROSS:"cross",ISOLATED:"isolated"});function uk(e="perp"){if(e==="perp"||e==="main")return Go.perp;if(e==="spot")return Go.spot;if(e==="hip3")return Go.hip3;if(e==="outcome"||e==="hip4")return Go.hip4;throw new Error(`hl-perps: unknown builder fee kind ${e}`)}function em({env:e=process.env,isHolder:t=!1,kind:n="perp"}={}){if(t)return null;let r=String(e?.[ya]||"").trim().toLowerCase();if(!r)return null;if(!/^0x[a-f0-9]{40}$/.test(r))throw new Error(`hl-perps: ${ya} must be an EVM address`);let o=Ws(e);if(!o||o!==r)return null;let i=e?.[Jp],s=uk(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: ${Jp} must be a positive number in 0.1 bps increments`);if(a>Qp)throw new Error(`hl-perps: builder fee ${a} bps exceeds the ${Qp} 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 dk(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 pk(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||Po;return BigInt(await o(r))>0n?{exempt:!0,status:"holder"}:{exempt:!1,status:"non-holder"}}catch{return{exempt:!1,status:"unavailable"}}}function wa(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 mk(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 wa(r,s,n)}function dt(e,t,n={}){let r=lk-Number(t??0);if(r<0)throw new Error("hl-perps: szDecimals out of range");return wa(mk(e,ck,n),r,n)}function fk(e,t){let n=wa(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 Rt(e={},t={}){let n=await ga(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 ba(e,{tif:t=Yo.GTC,triggerPx:n,isMarket:r,szDecimals:o}={}){switch(e){case be.LIMIT:return{limit:{tif:t}};case be.MARKET:return{limit:{tif:Yo.IOC}};case be.STOP_MARKET:case be.TAKE_PROFIT_MARKET:return{trigger:{isMarket:!0,triggerPx:dt(n,o),tpsl:e===be.STOP_MARKET?"sl":"tp"}};case be.STOP_LIMIT:case be.TAKE_PROFIT_LIMIT:return{trigger:{isMarket:!1,triggerPx:dt(n,o),tpsl:e===be.STOP_LIMIT?"sl":"tp"}};default:throw new Error(`hl-perps: unknown order type ${e}`)}}function fn(e,t){return{action:e,nonce:t,signatureChainId:Zp,submitTo:"https://api.hyperliquid.xyz/exchange",note:"Sign locally via @oracle-agent/operator or a wallet. Oracle does not submit."}}function hn(e){return O(e,{provider:e.provider||"hl-perps",kind:e.kind})}function tm(e={},t={}){let n=em({env:t.env});if(!n)throw new Error(`hl-perps: ${ya} 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:Zp,maxFeeRate:n.disclosure.percent,builder:n.disclosure.address,nonce:r};return hn({provider:"hl-perps",venue:"hyperliquid",kind:"builder-fee-approval",builderFee:n.disclosure,...fn(o,r)})}async function hr(e={},t={}){let n=await Rt(e,t),r=String(e.type||be.LIMIT),o=e.side?String(e.side).toLowerCase()==="buy":!!e.isBuy,i=!!e.reduceOnly,s=fk(e.size??e.sz,n.szDecimals),a;if(r===be.MARKET){let S=Number(n.markPx);if(!Number.isFinite(S)){let T=await Xe(t);S=Number(T?.[n.coin]??T?.[String(n.assetId)]??NaN)}if(!Number.isFinite(S))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?S*(1+x/1e4):S*(1-x/1e4);a=dt(w,n.szDecimals,{roundDown:o});let v=Math.abs(Number(a)/S-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=dt(e.price??e.limitPx,n.szDecimals)}let c=ba(r,{tif:e.tif??(r===be.MARKET?Yo.IOC:Yo.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=em({env:t.env,kind:n.kind}),p=await pk(d,e,t),m=p.exempt?null:d,f=await dk(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 hn({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,...fn(u,g)})}async function Xo(e={},t={}){let n=await Rt(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 hn({provider:"hl-perps",venue:"hyperliquid",kind:"perp-cancel",coin:n.coin,orderId:Number(r),...fn(o,Number(e.nonce??Date.now()))})}async function nm(e={},t={}){let n=await Rt(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||Ko.CROSS).toLowerCase();if(o!==Ko.CROSS&&o!==Ko.ISOLATED)throw new Error('hl-perps: marginMode must be "cross" or "isolated"');let i={type:"updateLeverage",asset:n.assetId,isCross:o===Ko.CROSS,leverage:r};return hn({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,...fn(i,Number(e.nonce??Date.now()))})}async function rm(e={},t={}){let n=await Rt(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=Xp(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 hn({provider:"hl-perps",venue:"hyperliquid",kind:"perp-isolated-margin",coin:n.coin,usd:o,...fn(s,Number(e.nonce??Date.now()))})}async function om(e={},t={}){let n=await hr(e,t),r=await Rt(e,t),o=n.side==="buy",i=[n.action.orders[0]];if(e.takeProfitPx!=null&&i.push({a:r.assetId,b:!o,p:dt(e.takeProfitPx,r.szDecimals),s:n.size,r:!0,t:ba(be.TAKE_PROFIT_MARKET,{triggerPx:e.takeProfitPx,szDecimals:r.szDecimals})}),e.stopLossPx!=null&&i.push({a:r.assetId,b:!o,p:dt(e.stopLossPx,r.szDecimals),s:n.size,r:!0,t:ba(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 hn({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:dt(e.takeProfitPx,r.szDecimals),stopLossPx:e.stopLossPx==null?null:dt(e.stopLossPx,r.szDecimals),builderFee:n.builderFee,...fn(s,Number(e.nonce??Date.now()))})}async function im(e={}){let t=await er(e);return{provider:"hl-outcome",kind:"outcome-meta",outcomes:t?.outcomes||[],questions:t?.questions||[]}}async function sm(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 er(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=Wo(r,o).coin}let i=await hr({...e,coin:n},t);return O({...i,kind:"hip4-order",provider:"hl-perps"},{provider:"hl-perps",kind:"hip4-order"})}async function am(e={},t={}){let n=e.coin;if(!n&&e.outcome!=null){let r=e.side??0;n=Wo(e.outcome,r).coin}return Xo({...e,coin:n},t)}W();import{createHmac as $$,randomInt as yk}from"node:crypto";import{keccak256 as M$,concat as U$,zeroPadValue as B$,getCreate2Address as D$,AbiCoder as F$}from"ethers";var pm=137;var bk="0xE111180000d2663C0091e4f400237545B87B996B",wk="0xe2222d279d744050d28e00520010520000310F59",cm="0x0000000000000000000000000000000000000000000000000000000000000000",xa=6;var xk={name:"Polymarket CTF Exchange",version:"2",chainId:pm},Sk={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"}]},lm={"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 Qo(e){let t=String(e);return t.includes(".")?t.split(".")[1].replace(/0+$/,"").length:0}function Jo(e,t){let n=10**t;return Math.floor(e*n+1e-12)/n}function um(e,t){let n=10**t;return Math.ceil(e*n-1e-12)/n}function Ek(e,t){let n=10**t;return Math.round(e*n+Number.EPSILON)/n}function kk(e,t,n,r){let o=Ek(Number(n),r.price);if(e==="BUY"){let c=Jo(Number(t),r.size),l=c*o;return Qo(l)>r.amount&&(l=um(l,r.amount+4),Qo(l)>r.amount&&(l=Jo(l,r.amount))),{rawMakerAmt:l,rawTakerAmt:c}}let s=Jo(Number(t),r.size),a=s*o;return Qo(a)>r.amount&&(a=um(a,r.amount+4),Qo(a)>r.amount&&(a=Jo(a,r.amount))),{rawMakerAmt:s,rawTakerAmt:a}}function dm(e){let t=Number(e).toFixed(xa),[n,r=""]=t.split(".");return(n+r.padEnd(xa,"0").slice(0,xa)).replace(/^0+/,"")||"0"}function vk(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=cm,builder:p=cm}=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=lm[String(c)]||lm["0.01"],{rawMakerAmt:g,rawTakerAmt:b}=kk(n,f,m,h),S=dm(g),x=dm(b),w=String(yk(1,2**31-1)),v=Date.now().toString(),T=n==="BUY"?0:1,I=a?wk:bk,R={salt:w,maker:i,signer:s,tokenId:String(t),makerAmount:S,takerAmount:x,side:T,signatureType:Number(u),timestamp:v,metadata:d,builder:p};return{domain:{...xk,verifyingContract:I},types:Sk,value:R,orderType:l,side:n,notionalUsdc:n==="BUY"?g:b,exchange:I}}function mm(e={}){let t=vk(e);return O({provider:"poly-clob",kind:"poly-order",chainId:pm,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 Qk,keccak256 as Cm}from"ethers";import{createHash as Ik}from"node:crypto";import{wordlists as _k}from"ethers";var gm=1,Pk=new Set(["privatekey","privkey","secretkey","seedphrase","seed","mnemonic","passphrase","password","keystore","keymaterial","wif","xprv","xpriv","bearer","authorization","signature","apikey","credential"]),Ck=[/\b[5KL][1-9A-HJ-NP-Za-km-z]{50,51}\b/,/\bxprv[0-9A-Za-z]{50,}\b/],Tk=new Set([12,15,18,21,24]);function Nk(e){let t=String(e).trim().toLowerCase().split(/\s+/).filter(Boolean);return Tk.has(t.length)&&t.every(n=>_k.en.getWordIndex(n)>=0)}var Ok=/^\s*(?:0x)?[0-9a-fA-F]{64}\s*$/,Rk=/(hash|digest|root|salt|nonce|proof|commitment|sig|id)(?:e?s)?$/i,$k=new Set(["calldata","data","publickey","pubkey","message","payload","input","extradata"]);function Lk(e){let t=ym(e);return $k.has(t)||Rk.test(t)}var bn=class extends Error{constructor(t){super(`action receipt refused: secret-bearing field at ${t}`),this.name="ActionReceiptSecretError",this.code="ACTION_RECEIPT_SECRET"}};function ym(e){return String(e).replace(/[^a-z0-9]/gi,"").toLowerCase()}function Mk(e){let t=ym(e);return[...Pk].some(n=>t.includes(n))}function Uk(e,t,n){if(typeof t=="string"){if(Ck.some(r=>r.test(t))||Nk(t))throw new bn(n);if(Ok.test(t)&&!Lk(e))throw new bn(n)}}function wn(e,t="$",n=""){if(e==null||typeof e=="boolean")return e;if(typeof e=="string")return Uk(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)=>wn(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(Mk(o))throw new bn(i);e[o]!==void 0&&(r[o]=wn(e[o],i,o))}return r}function Re(e){return wn(e)}function Sa(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(Sa).join(",")}]`:`{${Object.keys(e).map(t=>`${JSON.stringify(t)}:${Sa(e[t])}`).join(",")}}`}function bm(e){return Sa(wn(e))}function wm(e){if(!e||typeof e!="object"||Array.isArray(e))throw new TypeError("action receipt: object required");let{receiptId:t,summary:n,...r}=e;return Ik("sha256").update(bm(r)).digest("hex")}function yn(e,...t){for(let n of t)if(e[n]!==void 0)return e[n]}function gn(e,t,n){let r=yn(e,...t);if(r==null)throw new TypeError(`action receipt: ${n} required`);return r}function Bk(e){let t=yn(e,"balances","balanceChanges"),n=yn(e,"beforeBalances","balancesBefore","before"),r=yn(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 xm(e={}){if(!e||typeof e!="object"||Array.isArray(e))throw new TypeError("action receipt: input object required");wn(e);let t=yn(e,"txHash","transactionHash"),n=yn(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:gm,phase:n,intent:gn(e,["intent"],"intent"),route:gn(e,["route"],"route"),decodedAction:gn(e,["decodedAction","action"],"decodedAction"),policyChecks:gn(e,["policyChecks","checks"],"policyChecks"),allowlistHits:gn(e,["allowlistHits","allowlistMatches"],"allowlistHits"),prepareHash:gn(e,["prepareHash"],"prepareHash"),...t==null?{}:{txHash:t},...Bk(e)},o=wn(r);return Object.freeze({...o,receiptId:wm(o)})}var Dk=xm;function fm(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 hm(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 Sm(e){if(!e||typeof e!="object")throw new TypeError("action receipt: object required");let t=fm(e.decodedAction,["type","action","method","name"]),n=fm(e.route,["name","provider","venue","id"]),r=Array.isArray(e.policyChecks)?e.policyChecks:Object.values(e.policyChecks||{}),o=r.filter(l=>hm(l)===!0).length,i=r.filter(l=>hm(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 Fk=Sm;W();import{spawnSync as ka}from"node:child_process";import{existsSync as $t,readFileSync as ei,readdirSync as Am,statSync as Im}from"node:fs";import{join as $e,resolve as Vk}from"node:path";import{fileURLToPath as zk}from"node:url";import{createHash as Wk}from"node:crypto";import{isAddress as qk}from"ethers";var Em="5.0.2",Hk={"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 jk(e,t){return Object.freeze({id:e,contractName:t.contractName,source:t.source,dependency:Object.freeze({name:"OpenZeppelin Contracts",version:Em,tag:`v${Em}`}),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 Ea=Object.freeze(Object.fromEntries(Object.entries(Hk).map(([e,t])=>[e,jk(e,t)])));function Zo(e){let t=Ea[String(e||"")];if(!t)throw new Error(`protocol-templates: unknown template "${e}"`);return t}function gr(e,t){try{if(BigInt(e)<=0n)throw new Error}catch{throw new Error(`${t} must be > 0`)}}function yr(e,t){let n=String(e||"");if(!qk(n)||/^0x0{40}$/i.test(n))throw new Error(`${t} must be nonzero address`)}function km(e,t){let n=Zo(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");gr(i,"safe-erc20: supply"),yr(s,"safe-erc20: initialHolder"),yr(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(gr(i,"safe-erc721-drop: cap"),yr(s,"safe-erc721-drop: treasury"),gr(a,"safe-erc721-drop: mintPrice"),gr(c,"safe-erc721-drop: perWalletCap"),BigInt(c)>BigInt(i))throw new Error("safe-erc721-drop: perWalletCap exceeds cap");yr(l,"safe-erc721-drop: initialOwner")}else if(e==="safe-vesting"){let[r,o,i]=t;yr(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`)}gr(i,"safe-vesting: durationSeconds")}return n}function vm(e){return{authorities:[...e.authority],proxy:!1,upgradeable:!1,arbitraryDelegatecall:!1}}var Gk=zk(new URL(".",import.meta.url)),Kk=Vk(Gk,"../.."),br=$e(Kk,"protocols","templates"),ti="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 ni(){return $t(br)?Am(br).filter(e=>Ea[e]&&Im($e(br,e)).isDirectory()).map(e=>{let t=$e(br,e),n=$e(t,"SECURITY.md");return{id:e,path:t,metadata:Zo(e),securityNotice:$t(n)?ei(n,"utf8").slice(0,500):null,disclaimer:ti}}):[]}function _m(){if(process.env.FORGE_BIN)return process.env.FORGE_BIN;let e=process.env.HOME||"",t=["forge",$e(e,".foundry/bin/forge")];for(let n of t)if(ka(n,["--version"],{encoding:"utf8"}).status===0)return n;return null}function Yk(){return process.env.SLITHER_BIN?process.env.SLITHER_BIN:ka("slither",["--version"],{encoding:"utf8"}).status===0?"slither":null}function xn(e,t,n){let r=ka(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 Xk(e){let t=Wk("sha256");function n(r){let o=Im(r);if(o.isDirectory()){if(["lib","out","cache",".git"].includes(r.split("/").pop()))return;for(let i of Am(r).sort())n($e(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(ei(r)))}return n(e),t.digest("hex")}function va(e,t={}){let n=Zo(e),r=t.allowSkipStatic!==!1,o=$e(br,e);if(!$t(o))throw new Error(`protocol-templates: unknown template "${e}"`);let i=_m();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(!$t($e(o,"lib","forge-std"))){let m=xn(i,["install","foundry-rs/forge-std","--no-git"],o);if(!m.ok)throw new Error(`protocol-templates: forge install forge-std failed
4
- ${m.stderr}`)}if(!$t($e(o,"lib","openzeppelin-contracts"))){let m=xn(i,["install","OpenZeppelin/openzeppelin-contracts@v5.0.2","--no-git"],o);if(!m.ok)throw new Error(`protocol-templates: forge install openzeppelin failed
5
- ${m.stderr}`)}let s=$e(o,"lib","openzeppelin-contracts","package.json"),a=$t(s)?JSON.parse(ei(s,"utf8")).version:null;if(a!==n.dependency.version)throw new Error(`protocol-templates: OpenZeppelin ${n.dependency.version} required, found ${a||"unknown"}`);let c=xn(i,["build","-q"],o);if(!c.ok)throw new Error(`protocol-templates: forge build FAILED for ${e}
6
- ${c.stderr}`.slice(0,2e3));let l=xn(i,["test","-q"],o);if(!l.ok)throw new Error(`protocol-templates: forge test FAILED for ${e}
1
+ var Ww=Object.defineProperty;var Tt=(e,t,n)=>()=>{if(n)throw n[0];try{return e&&(t=e(e=0)),t}catch(r){throw n=[r],r}};var Gw=(e,t)=>{for(var n in t)Ww(e,n,{get:t[n],enumerable:!0})};import{createHash as Kw,createHmac as Yw,timingSafeEqual as Xw}from"node:crypto";function iu(e){let t=e==null||e===""?Yn:Number(e);return!Number.isFinite(t)||t<0?Yn:Math.min(t,bs)}function gs(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(gs).join(",")}]`:`{${Object.keys(e).sort().map(n=>`${JSON.stringify(n)}:${gs(e[n])}`).join(",")}}`}function ou(e){let t=String(e?.ORACLE_STAMP_HMAC_SECRET||"").trim();return t.length>=16?t:""}function ws(e=process.env){return ou(process.env)||ou(e)}function Qw(e=process.env){return String(process.env.ORACLE_STAMP_REQUIRE_MAC||"").trim()==="1"||String(e?.ORACLE_STAMP_REQUIRE_MAC||"").trim()==="1"}function Jw(e){let{oraclePrepared:t,prepareHash:n,prepareMac:r,note:o,...i}=e||{};return i}function xs(e){let t=Jw(e);return Kw("sha256").update(gs(t)).digest("hex")}function Ss(e,t=ws()){return t?Yw("sha256",t).update(String(e)).digest("hex"):""}function Zw(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:Xw(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+Yn,c={...o,preparedAt:i,expiresAt:s,prepareVersion:ys},l=xs(c),u=ws(r),d=u?Ss(l,u):void 0,p={...c,oraclePrepared:!0,prepareHash:l};return d&&(p.prepareMac=d),p}function ex(e,{maxAgeMs:t=Yn,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)!==ys)throw new Error(`${i}: unsupported prepareVersion ${e.prepareVersion}`);let a=xs(e);if(String(e.prepareHash||"")!==a)throw new Error(`${i}: prepareHash mismatch \u2014 payload was altered after prepare`);let c=ws(s),l=String(e.prepareMac||"");if(Qw(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=Ss(a,c);if(!l||!Zw(l,h))throw new Error(`${i}: prepareMac mismatch \u2014 stamp not from trusted preparer`)}let u=Number(e.preparedAt),d=Number(e.expiresAt),p=iu(t),m=n-u,f=d-u;if(!Number.isFinite(m)||!Number.isFinite(d)||!Number.isFinite(f)||m<0||f<=0||f>bs||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 ys,Yn,bs,W=Tt(()=>{ys=2,Yn=300*1e3,bs=(()=>{let e=Number(process.env.ORACLE_PREPARE_HARD_MAX_AGE_MS);return Number.isFinite(e)&&e>0?e:1800*1e3})()});import{createHash as tx}from"node:crypto";function ix(e){let t=String(e||"").toLowerCase();return lu.includes(t)||/(^|-)(api[-_]?key|key|token|secret|auth|authorization|session|cookie|signature|access)(-|$)/.test(t)}function sx(e){let t={};for(let[n,r]of Object.entries(e||{}))ix(n)||(t[n]=r);return t}function ax(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 cx(e,t){return new URL(String(e)).origin===new URL(String(t)).origin}function lx(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([...lu,...o])].sort().map(c=>`${c}=${r[c]??""}`).join(`
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,au):Math.min(250*2**e,au)+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<=cu;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===cu)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)&&su.has(o):!b&&su.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=ks.get(u);if(d)return d;let p=c().finally(()=>ks.delete(u));return ks.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,su,rx,au,lu,ox,cu,ks,dx,N=Tt(()=>{nx=new Set([408,425,429,500,502,503,504]),su=new Set(["GET","HEAD","OPTIONS","PUT","DELETE"]),rx=2,au=4e3,lu=["authorization","x-api-key","x-tensor-api-key","0x-api-key","api-key","cookie","proxy-authorization"],ox=new Set([301,302,303,307,308]),cu=3;ks=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 yu(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 bu=Tt(()=>{});var wu=Tt(()=>{});import{createHash as Cx,createHmac as Tx,timingSafeEqual as eR}from"node:crypto";function Ps(e){return Array.isArray(e)?`[${e.map(Ps).join(",")}]`:e&&typeof e=="object"?`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${Ps(e[t])}`).join(",")}}`:JSON.stringify(e??null)}function Nx(e,{required:t=!1}={}){try{return yu(e,"ORACLE_ROUTE_ATTESTATION_SECRET","MAD_ROUTE_ATTESTATION_SECRET")}catch(n){if(t)throw n;return null}}function ku(e){let{signature:t,...n}=e;return n}function Eu(e,{secret:t}={}){let n=Nx(t);return n?{...e,signature:Tx("sha256",n).update(Ps(ku(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 Eu({...ku(e),calldataHash:Ox(r)},{secret:o})}function _s(e,t=0){let n=Number(e);return Number.isFinite(n)?n:t}function Rx(e){let t=e==null?xu: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,xu)}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=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=Su,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)||Su)),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 Eu({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 xu,Su,me=Tt(()=>{bu();wu();xu=100,Su=2e4});function sa(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:()=>xp,HOP_API:()=>Sp,RELAY_API:()=>kp,acrossHealth:()=>da,acrossSuggestedFees:()=>Mo,hopHealth:()=>pa,hopQuote:()=>Uo,relayHealth:()=>ma,relayPrepare:()=>fa,relayQuote:()=>dr});async function da(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||xp).replace(/\/$/,"");return y(`${c}/suggested-fees?${a}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function pa(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||Sp).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 ma(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||kp).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 fa(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 xp,Sp,kp,Mk,Do=Tt(()=>{N();me();No();W();xp="https://across.to/api",Sp="https://api.hop.exchange/v1",kp="https://api.relay.link",Mk={ethereum:1,optimism:10,bsc:56,polygon:137,arbitrum:42161,avalanche:43114,base:8453}});W();import{Interface as Au,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}},Es=new Map(Object.values(Xn).map(e=>[e.chainId,e]));function Jr(e){return Es.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,Es.set(o.chainId,o),o}function vs(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 As(e){return Es.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 Is(e){return e==null?null:Number.parseInt(String(e),16)}var uu={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 du(e,{rpcUrl:t,env:n=process.env}={}){if(t)return t;let r=vs(e,n);return r||uu[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=du(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 pu(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 mu(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=Is(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:Is(o.blockNumber),transactionIndex:Is(o.transactionIndex),logs:Array.isArray(o.logs)?o.logs:[],receipt:o}}async function fu(e={}){let t=e.chainIds||Object.values(Xn).map(r=>r.chainId),n={};return await Promise.all(t.map(async r=>{if(!As(r)&&!uu[r]&&!du(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 hu(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 gu(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 Au(["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)"]),vu=new Au(["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)"]),Iu="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",_u="0x0000000000000000000000000000000000000000",Cs=[100,500,2500,1e4],Ux={56:{pancakeswap:{name:"pancakeswap",quoter:"0xB048Bbc1Ee6b733FFfCFb9e9CeF7375518e25997",router:"0x13f4EA83D0bd40E75C8222255bc855a974568Dd4",feeTiers:Cs}},8453:{pancakeswap:{name:"pancakeswap",quoter:"0xB048Bbc1Ee6b733FFfCFb9e9CeF7375518e25997",router:"0x13f4EA83D0bd40E75C8222255bc855a974568Dd4",feeTiers:Cs}},42161:{pancakeswap:{name:"pancakeswap",quoter:"0xB048Bbc1Ee6b733FFfCFb9e9CeF7375518e25997",router:"0x13f4EA83D0bd40E75C8222255bc855a974568Dd4",feeTiers:Cs}},999:{hyperswap:{name:"hyperswap",quoter:"0x03A918028f22D9E1473B7959C927AD7425A45C7C",router:"0x4E2960a8cd19B467b82d26D83fAcb0fAE26b094D"}}};function Ns(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 Ts(e,t){let n=ce[Number(t)];if(!e||e===Iu||e===_u||/^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}=Ns(e.chainId??8453,e.venue),s=Ts(e.tokenIn||"WETH",n),a=Ts(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 Pu(e={},t={}){let{chainId:n,quoter:r,router:o}=Ns(e.chainId??8453),i=(e.tokens||[]).map(p=>Ts(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 Os(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 Cu(e={},t={}){let n=Number(e.chainId??8453),r=Ns(n,e.venue),o=Zn(e.recipient),i=String(e.tokenIn||"WETH"),s=!e.tokenIn||i===Iu||i===_u||/^eth$/i.test(i),a=await it(e,t),c=vu.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=vu.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 Tu(e={}){let t=Number(e.chainId??8453);try{let n=await Os({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 Nu(){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 $u,getAddress as He,isAddress as ao,keccak256 as Hx}from"ethers";me();W();var jx=qx.defaultAbiCoder(),en="0x0000000000000000000000000000000000000000",je={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}],Ou=new $u(["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)"]),fR=new $u(["function execute(bytes commands,bytes[] inputs,uint256 deadline) payable"]);var zx="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE";function Lu(e){let t=Number(e),n=je[t];if(!n)throw new Error(`uniswap-v4: unsupported chainId ${e} (supported: ${Object.keys(je).join(", ")})`);return{chainId:t,...n}}function Ru(e,t){let n=je[Number(t)];if(!e||e===zx||e===en||/^eth$/i.test(String(e)))return He(n.weth);let r=String(e);if(/^weth$/i.test(r))return He(n.weth);if(/^usdc$/i.test(r)||/^usdg$/i.test(r))return He(n.usdc);if(!ao(r))throw new Error(`invalid token address: ${e}`);return He(r)}function Wx({currency0:e,currency1:t,fee:n,tickSpacing:r,hooks:o=en}){let i=He(e),s=He(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)?He(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=He(e),s=He(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)?He(o):en},zeroForOne:l}}var Kx=["uniswap-v4","uniswapv4"];async function co(e={},t={}){let{chainId:n,quoter:r,poolManager:o,universalRouter:i}=Lu(e.chainId??8453),s=Ru(e.tokenIn||"WETH",n),a=Ru(e.tokenOut||je[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=Ou.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=Ou.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:je[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 Mu(){return Object.entries(je).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 Uu(e={}){let t=Lu(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 Bu(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 Du(e){let{ok:t,errors:n,warnings:r}=Bu(e);if(!t)throw new Error(`invalid scanner for ${e?.key??"<unknown>"}:
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=Du(e);return er.set(t.chainId,t),t}function Rs(e){return er.get(Number(e))||null}function $s(){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 Ms={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${Ms.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 Ls(e,t="router"){return(e?.venues||[]).find(r=>r.kind===t)?.address??null}var Us=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>Us)throw new Error(`slippageBps ${n} exceeds the ${Us} 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 Fu(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=Ls(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=Ls(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=Ls(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${Ms.swapExactETHForTokens}`+ke(g)+ke(128)+tr(a)+ke(b)+ke(f.length)+f.map(tr).join(""):`0x${Ms.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:Us,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],qu={quoteExactInputSingle:"c6a5026a",exactInputSingle:"04e45aaf"},Ot=e=>BigInt(e).toString(16).padStart(64,"0"),nr=e=>e.slice(2).toLowerCase().padStart(64,"0"),Hu=/^0x[0-9a-fA-F]{40}$/,Ds=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>Ds)throw new Error(`slippageBps ${n} exceeds the ${Ds} 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 Bs(e,t){return(e?.venues||[]).find(n=>n.kind===t)?.address??null}function ju(e){let{chainId:t,wrappedNative:n}=e;async function r({quoter:i,tokenIn:s,tokenOut:a,amountIn:c,fee:l},u){let d=`0x${qu.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=Bs(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(!Hu.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=Bs(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=Bs(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(!Hu.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${qu.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:Ds,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 Vu(e){if(!e||e==="0x")return null;try{return BigInt(e)}catch{return null}}function zu(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=Vu(i?.result??i),u=l!==null||s?.result||a?.result;return{chainId:t,address:r,decimals:l===null?null:Number(l),symbol:zu(s?.result??s),name:zu(a?.result??a),totalSupply:(Vu(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 Fs(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,ju({chainId:e.chainId,wrappedNative:e.wrappedNative})):e.venueKind==="uniswap-v2"&&r.has("router")&&Object.assign(n,Fu({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(Fs(e)))}function Wu(e){return lo(Fs(e))}var or=new Map,oS=Object.keys(ce).map(Number),iS=Object.keys(je).map(Number),sS=st.map(e=>e.chainId),qs=new Set,Gu=!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(Gu&&qs.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(){qs.clear();for(let e of or.keys())qs.add(e);Gu=!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 Ku(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 Yu(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 Xu({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 Qu(e,t={}){if(!e)throw new Error("hlOpenOrders requires user");return G({type:"openOrders",user:e},t)}async function Ju(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}$/,ed="0xdfc24b077bc1425ad1dea75bcb6f8158e10df303";function Hs(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 Zu(e){if(e==null||e==="")return null;let t=Number(e);return Number.isFinite(t)?t:null}function td(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)=>(Zu(n.tvl)??-1)-(Zu(t.tvl)??-1))}function js(e){return e.hlInfo||G}async function Vs(e={},t={}){let n=await js(t)({type:"vaultSummaries"},t),r=mS((Array.isArray(n)?n:[]).map(td));return{provider:"hl-vaults",count:r.length,vaults:r,exec:!1,raw:n}}async function bo(e={},t={}){let r={type:"vaultDetails",vaultAddress:Hs(e.vaultAddress||e.address,"vaultAddress")};e.user&&(r.user=Hs(e.user,"user"));let o=await js(t)(r,t);return{provider:"hl-vaults",vault:td(o||{}),exec:!1,raw:o}}async function zs(e={},t={}){let n=Hs(e.user||e.address,"user"),r=await js(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 Ws(e={},t={}){let n=String(e.mode||"hlp").toLowerCase();if(n==="hlp")return bo({...e,vaultAddress:ed},t);if(n==="summaries")return Vs(e,t);if(n==="details")return bo(e,t);if(n==="mine")return zs(e,t);throw new Error("hl-vaults: mode must be hlp, summaries, details, or mine")}async function nd(e={}){try{let t=await Ws({mode:"hlp"},e);return{ok:t.vault.vaultAddress===ed&&!!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 rd(e={}){return(e.gammaUrl||process.env.POLY_GAMMA_URL||gS).replace(/\/$/,"")}async function Gs(e={}){return y(`${ar(e)}/time`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs})}async function od(e={}){let t=await Gs(e);return{ok:t!=null&&t!=="",time:t}}async function id({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(`${rd(r)}/markets?${o}`,{fetchImpl:r.fetchImpl,timeoutMs:r.timeoutMs})}async function sd(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 ad(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 cd(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 ld(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 ud({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(`${rd(r)}/events?${o}`,{fetchImpl:r.fetchImpl,timeoutMs:r.timeoutMs})}N();import{createHash as dd}from"node:crypto";var on="mainnet-beta",bS="https://api.mainnet-beta.solana.com",Ks="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 Ys(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 pd(e={}){try{let[t,n]=await Promise.all([cr("getHealth",[],e),Ys({},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||Ks,"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 dd("sha256").update(t.subarray(r)).digest("hex")}catch{return dd("sha256").update(t).digest("hex")}}async function md(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 Ve(e={}){return String(e.network||process.env.BTC_NETWORK||IS).trim().toLowerCase()==="testnet"?"testnet":"mainnet"}function Qs(e={}){return e.baseUrl?String(e.baseUrl).replace(/\/$/,""):process.env.BTC_ESPLORA_URL?String(process.env.BTC_ESPLORA_URL).replace(/\/$/,""):Ve(e)==="testnet"?PS:_S}function Xs(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 Js(e,t={}){let n=`${Qs(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 Js(e,t);try{return JSON.parse(n)}catch{return n}}async function fd(e={}){try{let t=await Js("/blocks/tip/height",e),n=Number(t);return{ok:Number.isFinite(n)&&n>0,provider:"bitcoin-esplora",network:Ve(e),baseUrl:Xs(Qs(e)),tipHeight:n,exec:!1,signing:"user-wallet"}}catch(t){return{ok:!1,provider:"bitcoin-esplora",network:Ve(e),baseUrl:Xs(Qs(e)),error:Xs(t?.message||t),exec:!1}}}async function hd(e={}){let t=await Js("/blocks/tip/height",e);return{provider:"bitcoin-esplora",network:Ve(e),tipHeight:Number(t)}}async function gd(e={}){try{let t=await xo("/v1/fees/recommended",e);return{provider:"bitcoin-esplora",network:Ve(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:Ve(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:Ve(t),address:n,balanceSats:String(s-a),chainStats:o,mempoolStats:i,raw:r}}async function yd(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:Ve(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 bd(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:Ve(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 wd(e={},t={}){let n=CS(e.txHex||e.hex||e.transaction,"txHex");return{provider:"bitcoin-esplora",network:Ve(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 xd="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:Sd(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([Sd(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[xd]||"")==="1")return{baseUrl:s,trusted:!1,host:c};if(o)throw new Error(`${e}: refusing to call non-allowlisted host ${c} (set ${xd}=1 to permit it)`);return{baseUrl:s,trusted:!1,host:c}}function Sd(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 Zs="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 kd(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:kd(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 Ed(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:kd(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 vd(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||Zs,o=await sn(`${r}/r/inscription/${n}`,t);return{provider:"bitcoin-meta",source:"ordinals.com/r",keyless:!0,inscriptionId:n,info:o}}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||Zs,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 Id(e={},t={}){let n=t.ordinalsBase||Zs,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 ea(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=ea(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 ta(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=>ta(c,t+1,n,r));let o=[];for(let[c,l]of Object.entries(e)){if(DS(c)){o.push(c);continue}o.push(...ta(l,t+1,n,r))}let s=Object.keys(e).map(ea).some(c=>c.endsWith("psbt")||c.endsWith("psbtbase64")),a=Object.entries(e).some(([c,l])=>/complete|finalized|isfinal/.test(ea(c))&&l===!0);return s&&a&&o.push("psbt(complete)"),FS(e)&&o.push("v/r/s"),o}function Je(e,t){let n=ta(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 _d(e={}){return Ne({provider:"satflow",defaultUrl:qS,hosts:["api.satflow.com"],url:e.baseUrl||process.env.SATFLOW_API_URL})}function vo(e={}){return _d(e).baseUrl}function ra(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":ra(e)},_d(e).trusted)}async function at(e,{method:t="GET",body:n,opts:r={}}={}){if(!ra(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 Pd(e={}){if(!!!ra(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 Cd(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 Td(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 Nd(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 Od(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 Rd(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 na(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 $d(e={},t={}){let n=Rd(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=na(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=na(s)??na(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=Rd(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",Ud="So11111111111111111111111111111111111111112",Bd="EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",GS=100,Ld=2e4;function Dd(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 Fd(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 oa(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 ia(e={},{quotedAtMs:t=Date.now(),ttlMs:n=Ld}={}){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=Fd(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)||Ld,1e3),3e4)}}var YS=new Set(["BPFLoaderUpgradeab1e11111111111111111111111","BPFLoader2111111111111111111111111111111111","BPFLoader1111111111111111111111111111111111"]),XS="123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz";function Md(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 qd(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])=>Md(p)),c=[],l=s.filter(([p])=>!Md(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 Hd(e={}){try{return{ok:!0,provider:"jupiter",outAmount:(await Co({inputMint:Ud,outputMint:Bd,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||Ud,"inputMint"),r=K(e.outputMint||e.toMint||Bd,"outputMint"),o=Po(e.amount||e.inAmount,"amount"),i=Fd(e.slippageBps??e.maxSlippageBps??50),s=new URL(`${Dd(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=ia({...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 jd(e={},t={}){let n=K(e.userPublicKey||e.owner||e.wallet,"userPublicKey"),r=e.quoteResponse?{quote:e.quoteResponse,solanaGuard:ia(e.quoteResponse,t)}:await Co(e,t),o=r.quote,i=r.solanaGuard||ia(o,t);if(oa(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(`${Dd(t)}/swap`,{method:"POST",body:QS({quoteResponse:o,userPublicKey:n,wrapAndUnwrapSol:oa(e.wrapAndUnwrapSol,!0),dynamicComputeUnitLimit:oa(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 Vd(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 zd(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(`${Vd(e)}/protocols`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??2e4})}async function Wd(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 Gd(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 Kd(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(`${Vd(t)}/overview/dexs/${n}?${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??3e4})}async function Yd(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 Xd}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,Qd=Object.freeze({swap:5,bridge:5,perps:0,nft:0});function bk(e){let t=String(e||"swap").toLowerCase();return Object.prototype.hasOwnProperty.call(Qd,t)?Qd[t]:yk}var wk="ORACLE_INTEGRATOR_FEE_BPS",xk="ORACLE_INTEGRATOR_FEE_RECIPIENT",Sk="ORACLE_INTEGRATOR_ID",Jd="ORACLE_INTEGRATOR_FEE_RECIPIENT_PIN",kk="oracle";function Ek(e=process.env){if(e[Jd])return String(e[Jd]);let t=e.ORACLE_CONFIG_DIR||Xd(hk(),".config","oracle");return Xd(t,"fee-recipient")}function aa(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=aa(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 Zd(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 ep(e){return e?.applies?{integrator:e.integrator,fee:String(e.bps/1e4)}:{}}function tp(e){return e?.applies?{partner:e.integrator,partnerFeeBps:String(e.bps),partnerAddress:e.recipient}:{}}var Ik="https://li.quest/v1";function la(e={}){return(e.baseUrl||process.env.LIFI_API_URL||Ik).replace(/\/$/,"")}var ca="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",_k="0x0000000000000000000000000000000000000000";function Pk(e){let t=String(e||ca).toLowerCase();return t===ca.toLowerCase()||t===_k}function np(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 rp(e={}){let t=await y(`${la(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=ca,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(ep(u)))c.set(g,b);let d=await y(`${la(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 op(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:np(a,"approval token"),spender:np(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 ip(e={}){return y(`${la(e)}/chains`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??12e3})}import{Interface as cp,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],sp=new cp(["function quoteExactInputSingle((address tokenIn, address tokenOut, uint256 amountIn, int24 tickSpacing, uint160 sqrtPriceLimitX96) params) returns (uint256 amountOut, uint160 sqrtPriceX96After, uint32 initializedTicksCrossed, uint256 gasEstimate)"]),Ok=new cp(["function exactInputSingle((address tokenIn, address tokenOut, int24 tickSpacing, address recipient, uint256 deadline, uint256 amountIn, uint256 amountOutMinimum, uint160 sqrtPriceLimitX96) params) payable returns (uint256 amountOut)"]),lp="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",up="0x0000000000000000000000000000000000000000";function dp(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 ap(e,t){let n=ut[Number(t)];if(!e||e===lp||e===up||/^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}=dp(e.chainId??8453),i=ap(e.tokenIn||"WETH",n),s=ap(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=sp.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=sp.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 pp(e={},t={}){let n=Number(e.chainId??8453),r=dp(n),o=ur(e.recipient||e.from||e.userAddress),i=String(e.tokenIn||"WETH"),s=!e.tokenIn||i===lp||i===up||/^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 mp(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 fp(){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 hp(e={}){return Ne({provider:"zerox",defaultUrl:$k,hosts:["api.0x.org"],url:e.baseUrl||process.env.ZEROX_API_URL})}function gp(e={}){return hp(e).baseUrl}function Lo(e={}){return e.apiKey||process.env.ZEROX_API_KEY||process.env.OX_API_KEY||process.env["0X_API_KEY"]||""}function yp(e={}){return Ee({"0x-version":"v2",accept:"application/json"},{"0x-api-key":Lo(e)},hp(e).trusted)}async function bp(e={}){if(!Lo(e))return{ok:!1,configured:!1,error:"ZEROX_API_KEY not set"};try{let t=await ua({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 ua(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(`${gp(t)}/swap/allowance-holder/price?${a}`,{headers:yp(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(`${gp(t)}/swap/allowance-holder/quote?${c}`,{headers:yp(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 wp(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 _$=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 Ep(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=Ep(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 Ap={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"}),ga={1:"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",8453:"0x4200000000000000000000000000000000000006",42161:"0x82aF49447D8a07e3bd95BD0d56f35241523fBab1"},Ip={1:"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",8453:"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",42161:"0xaf88d065e77c8cC2239327C5EDb3A432268e5831"},vp=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"}]}),M$=Object.freeze({OrderCancellations:[{name:"orderUids",type:"bytes[]"}]});function ya(e,t={}){if(t.baseUrl)return t.baseUrl.replace(/\/$/,"");let n=Ap[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 ha(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:ha(e.sellAmount,"sellAmount"),buyAmount:ha(e.buyAmount,"buyAmount"),validTo:s,appData:a,feeAmount:ha(e.feeAmount??"0","feeAmount"),kind:String(e.kind||"sell"),partiallyFillable:!!e.partiallyFillable,sellTokenBalance:String(e.sellTokenBalance||"erc20"),buyTokenBalance:String(e.buyTokenBalance||"erc20")}}async function _p(e={}){try{let t=await dt({chainId:1,sellToken:ga[1],buyToken:Ip[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=sa(e.from||e.owner),o=e.sellToken||ga[n],i=e.buyToken||Ip[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=ga[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(`${ya(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 Pp(e={},t={}){let n=Number(e.chainId??1),r=Fo(sa(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:vp,primaryType:"Order",message:i},c=Hk.hash(s,vp,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 Cp(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(`${ya(n,t)}/orders/${encodeURIComponent(r)}/status`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function Tp(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(`${ya(n,t)}/orders/${encodeURIComponent(r)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}function Np(){return Object.keys(Ap).map(Number)}N();me();W();var Xk="https://api.1inch.dev/swap/v6.0";function Op(e={}){return Ne({provider:"oneinch",defaultUrl:Xk,hosts:["api.1inch.dev"],url:e.baseUrl||process.env.ONEINCH_API_URL})}function ba(e={}){return Op(e).baseUrl}function mr(e={}){return e.apiKey||process.env.ONEINCH_API_KEY||process.env.ONE_INCH_API_KEY||""}function wa(e={}){let t=mr(e);return Ee({accept:"application/json"},{Authorization:t?`Bearer ${t}`:""},Op(e).trusted)}async function Rp(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(`${ba(t)}/${n}/quote?${s}`,{headers:wa(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 xa(e={},t={}){if(!mr(t))throw new Error("ONEINCH_API_KEY required for 1inch");let n=Number(e.chainId??1);return y(`${ba(t)}/${n}/approve/spender`,{headers:wa(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function $p(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(`${ba(t)}/${n}/swap?${c}`,{headers:wa(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 xa({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 Lp(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 Mp(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 Up(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 Bp(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 Dp(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),qp=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 Hp(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 Hp(e).baseUrl}function jo(e={}){return Ee({accept:"application/json"},{"x-api-key":un(e)},Hp(e).trusted)}function jp(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 Vp(e,t=null){let n=String(e||"").trim();if(!n)throw new Error("opensea: account address required");if(t&&!qp.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 Fp(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 zp(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 Wp(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=jp(e.chain),r=Vp(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=Vp(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=jp(e.chain);if(qp.has(t))throw new Error("opensea: listing actions currently require an EVM NFT chain");let n=e.startTime||e.start_time?Fp(e.startTime||e.start_time,"startTime"):{text:new Date().toISOString(),ms:Date.now()},r=Fp(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 Gp=999;async function Kp(e={}){let t={chainId:Gp,rpc:null,dex:null};try{t.rpc=await Qn(Gp,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 Yp(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 Xp(e,t={}){return Nt(e,t)}N();W();var bE="https://api-mainnet.magiceden.dev/v2",yr=1e9;function Qp(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 Qp(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}`:""},Qp(e).trusted)}function Sa(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 Jp(e={}){try{let t=await ka({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 ka(e={},t={}){let n=Sa(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 Zp(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 em(e={},t={}){let n=Sa(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(Zp);return{provider:"magiceden-sol",chain:"solana-mainnet-beta",symbol:n,count:a.length,listings:a,exec:!1}}async function tm(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(Zp);return{provider:"magiceden-sol",chain:"solana-mainnet-beta",tokenMint:n,listings:o,exec:!1}}async function nm(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 rm(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=Sa(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,Ea=10n**BigInt(fn),AE="0xa4b1",om=7,va=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)*Ea+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/Ea,r=(t%Ea).toString().padStart(fn,"0").replace(/0+$/,"");return r?`${n}.${r}`:String(n)}async function im(e={}){try{let t=await Aa(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 Aa(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 Ia(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 _a(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 sm(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 am(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 Pa(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 Ca({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 cm(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=Pa(e),i=wr(t),s={type:"cDeposit",hyperliquidChain:i,signatureChainId:Ko(t),wei:hn(n),nonce:o};return Ca({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 lm(e={},t={}){let n=br(e.amountHype??e.amount,"amountHype"),r=Pa(e),o=wr(t),i={type:"cWithdraw",hyperliquidChain:o,signatureChainId:Ko(t),wei:hn(n),nonce:r};return Ca({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 ${om} 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 um(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=Pa(e),a=wr(t),c={type:"tokenDelegate",hyperliquidChain:a,signatureChainId:Ko(t),validator:n,wei:hn(r),isUndelegate:o,nonce:s};return Ca({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 ${va} 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 ${va} day.`,"Check the validator's commission and jail status before delegating.","Oracle prepared this. Your wallet signs it. Nothing was submitted."]})}async function dm(e={},t={}){let n=gn(e.user||e.address,"user"),r=await Ia({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:om,validatorLockupDays:va,exec:!1}}async function Ta(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 pm(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 mm(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 fm(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 bm=1e8,$E=1e5,xr={at:0,dexs:null},hm=new Map;async function gm(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 ym(e="",t={}){let n=e||"",r=Date.now(),o=hm.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 hm.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:bm+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:bm+o}}async function Na(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 gm(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 ym(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 ym("",t),i=n.toUpperCase(),s=r.findIndex(l=>l.name===i);if(s<0){if(t.allowBareBuilderLeaf===!0)try{let l=await gm(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 Na({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 wm(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,km="0x66eee";var xm=10,Oa="ORACLE_HL_BUILDER_ADDRESS",Sm="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 Em({env:e=process.env,isHolder:t=!1,kind:n="perp"}={}){if(t)return null;let r=String(e?.[Oa]||"").trim().toLowerCase();if(!r)return null;if(!/^0x[a-f0-9]{40}$/.test(r))throw new Error(`hl-perps: ${Oa} must be an EVM address`);let o=aa(e);if(!o||o!==r)return null;let i=e?.[Sm],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: ${Sm} must be a positive number in 0.1 bps increments`);if(a>xm)throw new Error(`hl-perps: builder fee ${a} bps exceeds the ${xm} 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 $a(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 $a(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 $a(qE(e,ME,n),r,n)}function HE(e,t){let n=$a(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 Na(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 Ra(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:km,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 vm(e={},t={}){let n=Em({env:t.env});if(!n)throw new Error(`hl-perps: ${Oa} 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:km,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=Ra(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=Em({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 Am(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 Im(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=wm(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 _m(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:Ra(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:Ra(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 Pm(e={}){let t=await sr(e);return{provider:"hl-outcome",kind:"outcome-meta",outcomes:t?.outcomes||[],questions:t?.questions||[]}}async function Cm(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 Tm(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 S2,randomInt as zE}from"node:crypto";import{keccak256 as E2,concat as v2,zeroPadValue as A2,getCreate2Address as I2,AbiCoder as _2}from"ethers";var Lm=137;var WE="0xE111180000d2663C0091e4f400237545B87B996B",GE="0xe2222d279d744050d28e00520010520000310F59",Nm="0x0000000000000000000000000000000000000000000000000000000000000000",La=6;var KE={name:"Polymarket CTF Exchange",version:"2",chainId:Lm},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"}]},Om={"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 Rm(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=Rm(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=Rm(a,r.amount+4),ti(a)>r.amount&&(a=ni(a,r.amount))),{rawMakerAmt:s,rawTakerAmt:a}}function $m(e){let t=Number(e).toFixed(La),[n,r=""]=t.split(".");return(n+r.padEnd(La,"0").slice(0,La)).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=Nm,builder:p=Nm}=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=Om[String(c)]||Om["0.01"],{rawMakerAmt:g,rawTakerAmt:b}=QE(n,f,m,h),k=$m(g),x=$m(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 Mm(e={}){let t=JE(e);return O({provider:"poly-clob",kind:"poly-order",chainId:Lm,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 Av,keccak256 as Jm}from"ethers";import{createHash as ev}from"node:crypto";import{wordlists as tv}from"ethers";var Dm=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=Fm(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 Fm(e){return String(e).replace(/[^a-z0-9]/gi,"").toLowerCase()}function uv(e){let t=Fm(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 Ma(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(Ma).join(",")}]`:`{${Object.keys(e).map(t=>`${JSON.stringify(t)}:${Ma(e[t])}`).join(",")}}`}function qm(e){return Ma(kn(e))}function Hm(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(qm(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 jm(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:Dm,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:Hm(o)})}var mv=jm;function Um(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 Bm(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 Vm(e){if(!e||typeof e!="object")throw new TypeError("action receipt: object required");let t=Um(e.decodedAction,["type","action","method","name"]),n=Um(e.route,["name","provider","venue","id"]),r=Array.isArray(e.policyChecks)?e.policyChecks:Object.values(e.policyChecks||{}),o=r.filter(l=>Bm(l)===!0).length,i=r.filter(l=>Bm(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=Vm;W();import{spawnSync as Ba}from"node:child_process";import{existsSync as Mt,readFileSync as oi,readdirSync as Km,statSync as Ym}from"node:fs";import{join as $e,resolve as bv}from"node:path";import{fileURLToPath as wv}from"node:url";import{createHash as xv}from"node:crypto";import{isAddress as hv}from"ethers";var zm="5.0.2",gv={"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 yv(e,t){return Object.freeze({id:e,contractName:t.contractName,source:t.source,dependency:Object.freeze({name:"OpenZeppelin Contracts",version:zm,tag:`v${zm}`}),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 Ua=Object.freeze(Object.fromEntries(Object.entries(gv).map(([e,t])=>[e,yv(e,t)])));function ri(e){let t=Ua[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(!hv(n)||/^0x0{40}$/i.test(n))throw new Error(`${t} must be nonzero address`)}function Wm(e,t){let n=ri(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 Gm(e){return{authorities:[...e.authority],proxy:!1,upgradeable:!1,arbitraryDelegatecall:!1}}var Sv=wv(new URL(".",import.meta.url)),kv=bv(Sv,"../.."),vr=$e(kv,"protocols","templates"),ii="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 si(){return Mt(vr)?Km(vr).filter(e=>Ua[e]&&Ym($e(vr,e)).isDirectory()).map(e=>{let t=$e(vr,e),n=$e(t,"SECURITY.md");return{id:e,path:t,metadata:ri(e),securityNotice:Mt(n)?oi(n,"utf8").slice(0,500):null,disclaimer:ii}}):[]}function Xm(){if(process.env.FORGE_BIN)return process.env.FORGE_BIN;let e=process.env.HOME||"",t=["forge",$e(e,".foundry/bin/forge")];for(let n of t)if(Ba(n,["--version"],{encoding:"utf8"}).status===0)return n;return null}function Ev(){return process.env.SLITHER_BIN?process.env.SLITHER_BIN:Ba("slither",["--version"],{encoding:"utf8"}).status===0?"slither":null}function En(e,t,n){let r=Ba(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 vv(e){let t=xv("sha256");function n(r){let o=Ym(r);if(o.isDirectory()){if(["lib","out","cache",".git"].includes(r.split("/").pop()))return;for(let i of Km(r).sort())n($e(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(oi(r)))}return n(e),t.digest("hex")}function Da(e,t={}){let n=ri(e),r=t.allowSkipStatic!==!1,o=$e(vr,e);if(!Mt(o))throw new Error(`protocol-templates: unknown template "${e}"`);let i=Xm();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($e(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(!Mt($e(o,"lib","openzeppelin-contracts"))){let m=En(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=$e(o,"lib","openzeppelin-contracts","package.json"),a=Mt(s)?JSON.parse(oi(s,"utf8")).version:null;if(a!==n.dependency.version)throw new Error(`protocol-templates: OpenZeppelin ${n.dependency.version} required, found ${a||"unknown"}`);let c=En(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=En(i,["test","-q"],o);if(!l.ok)throw new Error(`protocol-templates: forge test FAILED for ${e}
7
9
  ${l.stdout}
8
- ${l.stderr}`.slice(0,2e3));let u={tool:null,ok:!0,skipped:!0,reason:"slither not installed"},d=Yk();if(d){let m=xn(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}
10
+ ${l.stderr}`.slice(0,2e3));let u={tool:null,ok:!0,skipped:!0,reason:"slither not installed"},d=Ev();if(d){let m=En(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}
9
11
  ${m.stdout}
10
- ${m.stderr}`.slice(0,2e3))}else if(!r)throw new Error("protocol-templates: slither required (allowSkipStatic=false) but not installed");let p=Xk(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:ti,firmAudit:!1}}function Pm(e,t={}){let n=va(e,t),r=_m(),o=n.path,i=xn(r,["build","-q"],o);if(!i.ok)throw new Error(`protocol-templates: forge build failed
11
- ${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=$e(o,"out",`${s}.sol`,`${s}.json`);if(!$t(a))throw new Error(`protocol-templates: artifact missing at ${a}`);let c=JSON.parse(ei(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 Jk=new Set(["status","chainId","forkBlockNumber","gasUsed","transactionHash","contractAddress","revertReason"]);function Zk(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(!Jk.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 Tm(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=km(n,o),s=Pm(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 Qk(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}:{...Zk(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:Cm(a),authorityReport:vm(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:Cm(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:ti},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 tv="https://api.geckoterminal.com/api/v2",ri=(e={})=>(e.baseUrl||process.env.GECKOTERMINAL_API_URL||tv).replace(/\/$/,""),Sn=e=>encodeURIComponent(String(e));async function Aa(e={},t={}){let n=Math.max(1,Number(e.page||1));return y(`${ri(t)}/networks?page=${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function Nm(e={},t={}){if(!e.network||!e.poolAddress)throw new Error("network and poolAddress required");return y(`${ri(t)}/networks/${Sn(e.network)}/pools/${Sn(e.poolAddress)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function Om(e={},t={}){if(!e.network||!(e.address||e.tokenAddress))throw new Error("network and token address required");return y(`${ri(t)}/networks/${Sn(e.network)}/tokens/${Sn(e.address||e.tokenAddress)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function Rm(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(`${ri(t)}/networks/${Sn(e.network)}/pools/${Sn(e.poolAddress)}/ohlcv/${n}?${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function $m(e={}){let t=await Aa({page:1},e);return{ok:Array.isArray(t?.data)&&t.data.length>0,networkSample:t?.data?.length||0}}N();import{Interface as Bm,getAddress as Dm,isAddress as rv}from"ethers";me();W();var ov="https://api.curve.finance/v1",Fm=(e={})=>(e.baseUrl||process.env.CURVE_API_URL||ov).replace(/\/$/,""),iv=Object.freeze({1:"0x45312ea0eFf7E09C83CBE249fa1d7598c4C8cd4e",10:"0x0DCDED3545D565bA3B19E683431381007245d983",56:"0xA72C85C258A81761433B4e8da60505Fe3Dd551CC",137:"0x0DCDED3545D565bA3B19E683431381007245d983",988:"0xFF5Cb29241F002fFeD2eAa224e3e996D24A6E8d1",999:"0xd2002373543Ce3527023C75e7518C274A51ce712",4663:"0xFF5Cb29241F002fFeD2eAa224e3e996D24A6E8d1",8453:"0x4f37A9d177470499A2dD084621020b023fcffc1F",42161:"0x2191718CD32d02B8E60BAdFFeA33E4B5DD9A0A0D",43114:"0x0DCDED3545D565bA3B19E683431381007245d983"}),qm="0x0000000000000000000000000000000000000000",Ia=new Bm(["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)"]),Lm=new Bm(["function coins(uint256) view returns (address)"]);function Hm(e){let t=iv[Number(e)];if(!t)throw new Error(`curve-router-ng: unsupported chainId ${e}`);return t}function wr(e,t){if(!rv(e))throw new Error(`${t} must be a valid EVM address`);return Dm(e)}function sv(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 Mm(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 jm(e,t,n){return[e,t,n,...Array(8).fill(qm)]}function Vm(e,t,n,r){return[[BigInt(e),BigInt(t),1n,BigInt(n),BigInt(r)],...Array.from({length:4},()=>[0n,0n,0n,0n,0n])]}function zm(e){return[e,...Array(4).fill(qm)]}async function av({chainId:e,pool:t,nCoins:n,rpcCall:r,opts:o}){let i=[];for(let s=0;s<n;s++){let a=Lm.encodeFunctionData("coins",[s]),c=await r(e,"eth_call",[{to:t,data:a},o.blockTag||"latest"],o),l=Lm.decodeFunctionResult("coins",c);i.push(Dm(l[0]))}return i}function Um(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 Wm(e={}){return y(`${Fm(e)}/openapi.json`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs})}async function _a(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(`${Fm(t)}/getPools/${n}/${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function Gm(e={}){let t=await _a({chain:"ethereum",registry:"main"},e),n=t?.data?.poolData?.length||0;return{ok:t?.success===!0&&n>0,poolSample:n}}async function Pa(e={},t={}){let n=Number(e.chainId??8453),r=Hm(n),o=wr(e.pool,"curve pool"),i=wr(e.tokenIn,"curve tokenIn"),s=wr(e.tokenOut,"curve tokenOut"),a=sv(e.amountIn,"curve amountIn"),c=Mm(e.nCoins??2,"curve nCoins",2,8),l=Mm(e.poolType,"curve poolType",1,4),u=t.rpcCall||L,d=await av({chainId:n,pool:o,nCoins:c,rpcCall:u,opts:t}),p=Um(d,i,"tokenIn"),m=Um(d,s,"tokenOut");if(p===m)throw new Error("Curve token indexes must differ");let f=jm(i,o,s),h=Vm(p,m,l,c),g=zm(o),b=Ia.encodeFunctionData("get_dy",[f,h,a,g]),S=await u(n,"eth_call",[{to:r,data:b},e.blockTag||"latest"],t),x=Ia.decodeFunctionResult("get_dy",S),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 Km(e={},t={}){let n=Number(e.chainId??8453),r=Hm(n),o=wr(e.sender||e.from||e.fromAddress||e.receiver,"curve sender"),i=wr(e.receiver||e.recipient||o,"curve receiver"),s=await Pa({...e,sender:o},t),a=jm(s.tokenIn,s.pool,s.tokenOut),c=Vm(s.i,s.j,s.poolType,s.nCoins),l=zm(s.pool),u=Ia.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 Ca,getAddress as tf,isAddress as lv}from"ethers";W();var Ym=Object.freeze({42161:"https://arbitrum-api.gmxinfra.io",43114:"https://avalanche-api.gmxinfra.io"}),Xm=Object.freeze({42161:{name:"arbitrum",api:Ym[42161],exchangeRouter:"0x1C3fa76e6E1088bCE750f23a5BFcffa1efEF6A41",router:"0x7452c558d45f8afC8c83dAe62C3f8A5BE19c71f6",orderVault:"0x31eF83a530Fde1B38EE9A18093A333D8Bbbc40D5",dataStore:"0xFD70de6b91282D8017aA4E741e9Ae325CAb992d8",reader:"0x470fbC46bcC0f16532691Df360A07d8Bf5ee0789",eventEmitter:"0xC8ee91A54287DB53897056e12D9819156D3822Fb",wnt:"0x82aF49447D8a07e3bd95BD0d56f35241523fBab1",usdc:"0xaf88d065e77c8cC2239327C5EDb3A432268e5831"},43114:{name:"avalanche",api:Ym[43114],exchangeRouter:"0x8f550E53DFe96C055D5Bdb267c21F268fCAF63B2",router:"0x820F5FfC5b525cD4d88Cd91aCf2c28F16530Cc68",orderVault:"0xD3D60D22d415aD43b7e64b510D86A30f19B1B12C",dataStore:"0x2F0b22339414ADeD7D5F06f9D604c7fF5b2fe3f6",reader:"0x62Cb8740E6986B29dC671B2EB596676f60590A5B",eventEmitter:"0xDb17B211c34240B014ab6d61d4A31FA0C0e20c26",wnt:"0xB31f66AA3C1e785363F0875A1B74E27b85FD66c7",usdc:"0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E"}}),Qm="0x0000000000000000000000000000000000000000",uv=`0x${"0".repeat(64)}`,Jm=Object.freeze({marketSwap:0,limitSwap:1,marketIncrease:2,limitIncrease:3,marketDecrease:4,limitDecrease:5,stopLossDecrease:6,stopIncrease:8}),Zm=Object.freeze({noSwap:0,swapPnlTokenToCollateralToken:1,swapCollateralTokenToPnlToken:2}),oi=new Ca(["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"]),nf=new Ca(["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)"]),dv=new Ca(["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)"]),pv=Object.freeze({OrderCreated:"created",OrderUpdated:"updated",OrderExecuted:"executed",OrderCancelled:"cancelled",OrderFrozen:"frozen"});function kn(e){let t=Number(e??42161),n=Xm[t];if(!n)throw new Error(`gmx: unsupported chainId ${e} (supported: ${Object.keys(Xm).join(", ")})`);return{chainId:t,...n}}function ii(e,t={}){let n=kn(e);return(t.baseUrl||n.api).replace(/\/$/,"")}function ke(e,t){if(!lv(e))throw new Error(`${t} must be a valid EVM address`);return tf(e)}function H(e){return tf(e).toLowerCase()}function En(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 Lt(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 mv(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 fv(e){let t=String(e||"marketIncrease").trim();if(!(t in Jm))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:Jm[t]}}function hv(e){let t=String(e||"noSwap").trim();if(!(t in Zm))throw new Error(`gmx unsupported decreasePositionSwapType ${t}`);return{key:t,code:Zm[t]}}function gv(e,t){return Array.isArray(e)?e:Array.isArray(e?.[t])?e[t]:[]}function yv(e,t){let n=H(t);return e.find(r=>H(r.marketToken||r.market||r.address)===n)||null}function bv(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=En(e?.minPrice,"gmx minPrice"),i=En(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 xv(e,t){let n=t?e.availableLiquidityLong:e.availableLiquidityShort;try{return BigInt(String(n??"0"))}catch{return 0n}}function Sv(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 Ev(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 kv(e={},t){if(H(e.address)!==H(t.eventEmitter))return null;let n;try{n=dv.parseLog({topics:e.topics,data:e.data})}catch{return null}let r=String(n?.args?.eventName||""),o=pv[r];if(!o)return null;let i=Ev(n.args.eventData||{}),s=(i.key||String(n.args.topic1||"")).toLowerCase(),a=i.account||Sv(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 ef(e){return{executed:5,cancelled:4,frozen:3,created:2,updated:1}[e]||0}function vv(e=[],{chainId:t}={}){let n=kn(t);return(Array.isArray(e)?e:[]).map(r=>kv(r,n)).filter(Boolean).sort((r,o)=>(r.logIndex??0)-(o.logIndex??0))}async function rf(e={},t={}){return y(`${ii(e.chainId??42161,t)}/markets`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function Ta(e={},t={}){return y(`${ii(e.chainId??42161,t)}/markets/info`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function of(e={},t={}){return y(`${ii(e.chainId??42161,t)}/tokens`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function si(e={},t={}){return y(`${ii(e.chainId??42161,t)}/prices/tickers`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function sf(e={}){let t=await si({chainId:42161},e);return{ok:Array.isArray(t)&&t.length>0,tickerSample:Array.isArray(t)?t.length:0}}async function af(e={},t={}){let n=kn(e.chainId??42161),r=ke(e.account||e.owner||e.user,"gmx account"),o=Lt(e.start??0,"gmx start"),i=Lt(e.end??e.limit??20,"gmx end"),s=nf.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 cf(e={},t={}){let n=kn(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=nf.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=kn(e.chainId??42161),r=t.receipt||await to({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=vv(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)=>ef(d.status)>=ef(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 uf(e={},t={}){let n=kn(e.chainId??42161),r=fv(e.orderType||e.type),o=hv(e.decreasePositionSwapType),i=ke(e.account||e.owner||e.from||e.sender||e.receiver,"gmx account"),s=ke(e.receiver||i,"gmx receiver"),a=ke(e.cancellationReceiver||s,"gmx cancellationReceiver"),c=e.callbackContract?ke(e.callbackContract,"gmx callbackContract"):Qm,l=e.uiFeeReceiver?ke(e.uiFeeReceiver,"gmx uiFeeReceiver"):Qm,u=ke(e.market||e.marketToken,"gmx market"),d=ke(e.initialCollateralToken||e.collateralToken||n.usdc,"gmx initialCollateralToken"),p=r.key==="marketIncrease"?En(e.initialCollateralDeltaAmount??e.collateralAmount??e.amountIn,"gmx initialCollateralDeltaAmount"):Lt(e.initialCollateralDeltaAmount??e.collateralAmount??"0","gmx initialCollateralDeltaAmount"),m=En(e.sizeDeltaUsd,"gmx sizeDeltaUsd"),f=En(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=mv(e.maxSlippageBps??e.slippageBps,50),S=e.isLong==null?!0:!!e.isLong,[x,w]=await Promise.all([Ta({chainId:n.chainId},t),si({chainId:n.chainId},t)]),v=yv(gv(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=ke(v.indexToken,"gmx market indexToken"),I=ke(v.longToken,"gmx market longToken"),R=ke(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 k=xv(v,S);if(k>0n&&m>k)throw new Error("gmx sizeDeltaUsd exceeds available market liquidity");let q=bv(w,T);if(!q)throw new Error("gmx index ticker not found");let ge=e.acceptablePrice?En(e.acceptablePrice,"gmx acceptablePrice").toString():wv({ticker:q,isLong:S,typeKey:r.key,maxSlippageBps:b}),Ce=(e.swapPath||[]).map(X=>ke(X,"gmx swapPath market"));if(Ce.length>3)throw new Error("gmx swapPath too long for guarded slice");let qn=Lt(e.triggerPrice??"0","gmx triggerPrice"),Kt=Lt(e.callbackGasLimit??"0","gmx callbackGasLimit"),Hn=Lt(e.minOutputAmount??"0","gmx minOutputAmount"),nt=Lt(e.validFromTime??"0","gmx validFromTime"),rt=!!e.shouldUnwrapNativeToken,jn=e.autoCancel==null?!0:!!e.autoCancel,Vn=String(e.referralCode||uv);if(!/^0x[0-9a-fA-F]{64}$/.test(Vn))throw new Error("gmx referralCode must be bytes32 hex");let Yt=Array.isArray(e.dataList)?e.dataList:[];for(let X of Yt)if(!/^0x[0-9a-fA-F]{64}$/.test(String(X)))throw new Error("gmx dataList entries must be bytes32 hex");let ms={addresses:{receiver:s,cancellationReceiver:a,callbackContract:c,uiFeeReceiver:l,market:u,initialCollateralToken:d,swapPath:Ce},numbers:{sizeDeltaUsd:m,initialCollateralDeltaAmount:p,triggerPrice:qn,acceptablePrice:BigInt(ge),executionFee:f,callbackGasLimit:Kt,minOutputAmount:Hn,validFromTime:nt},orderType:r.code,decreasePositionSwapType:o.code,isLong:S,shouldUnwrapNativeToken:rt,autoCancel:jn,referralCode:Vn,dataList:Yt},C=[];r.key==="marketIncrease"&&p>0n&&C.push(oi.encodeFunctionData("sendTokens",[d,n.orderVault,p])),C.push(oi.encodeFunctionData("sendWnt",[n.orderVault,f])),C.push(oi.encodeFunctionData("createOrder",[ms]));let $=oi.encodeFunctionData("multicall",[C]),D={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:S,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:D,transaction:{chainId:n.chainId,from:H(i),to:H(n.exchangeRouter),data:$,value:f.toString(),gmxGuard:D}},{provider:"gmx",kind:"gmx-order"})}N();import{Interface as Iv,getAddress as _v,isAddress as Pv,keccak256 as df,toUtf8Bytes as pf}from"ethers";W();var Cv="https://api.morpho.org/graphql",ai=new Iv(["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)"]),Tv=(e={})=>e.baseUrl||process.env.MORPHO_API_URL||Cv;async function Oa(e,t,n={}){return y(Tv(n),{method:"POST",body:{query:e,variables:t},fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs??2e4})}var Nv="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 } } } }",Ov="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 xr(e,t){let n=String(e||"").trim();if(!Pv(n))throw new Error(`morpho: ${t} must be an address`);return _v(n).toLowerCase()}function Rv(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 Na(e){return Array.isArray(e)?`[${e.map(Na).join(",")}]`:e&&typeof e=="object"?`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${Na(e[t])}`).join(",")}}`:JSON.stringify(e)}async function Sr(e,t,n,r,o={}){let i=ai.encodeFunctionData(n,r),a=await(o.rpcCall||L)(Number(e),"eth_call",[{to:t,data:i},"latest"],o);return ai.decodeFunctionResult(n,a)}function $v(e,t){let n=t.toLowerCase();return(e||[]).find(r=>String(r?.address||"").toLowerCase()===n)||null}async function mf(e={},t={}){let n=Math.min(100,Math.max(1,Number(e.first||20))),r=(e.chainIds||[e.chainId||1]).map(Number);return Oa(Nv,{first:n,chainIds:r,where:{chainId_in:r}},t)}async function Ra(e={},t={}){let n=Math.min(100,Math.max(1,Number(e.first||20))),r=(e.chainIds||[e.chainId||1]).map(Number);return Oa(Ov,{first:n,chainIds:r,where:{chainId_in:r}},t)}async function ff(e={}){return{ok:(await Oa("query { __typename }",{},e))?.data?.__typename==="Query"}}async function hf(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=xr(e.vault||e.vaultAddress,"vault"),i=xr(e.owner||e.from||e.sender,"owner"),s=xr(e.receiver||i,"receiver"),a=Rv(e.amount||e.assets,"amount"),c=Number(e.minTotalAssetsUsd??1e5),l=await Ra({chainId:n,first:100},t),u=$v(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 Sr(n,o,"asset",[],t),m=xr(p,"vault asset");if((u?.asset?.address?xr(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[S]=await Sr(n,o,"maxDeposit",[i],t);if(BigInt(a)>BigInt(S.toString()))throw new Error("morpho: amount exceeds maxDeposit");let[x]=await Sr(n,o,"previewDeposit",[a],t);if(BigInt(x.toString())<=0n)throw new Error("morpho: previewDeposit returned zero shares");g={minSharesOut:x.toString()},h=ai.encodeFunctionData("deposit",[a,s])}else{let[S]=await Sr(n,o,"maxWithdraw",[i],t);if(BigInt(a)>BigInt(S.toString()))throw new Error("morpho: amount exceeds maxWithdraw");let[x]=await Sr(n,o,"previewWithdraw",[a],t);if(BigInt(x.toString())<=0n)throw new Error("morpho: previewWithdraw returned zero shares");g={maxSharesIn:x.toString()},h=ai.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:df(pf(h)),issuedAtMs:Date.now(),expiresAtMs:Date.now()+2e4};return b.guardHash=df(pf(Na(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 Mv,getAddress as $a,isAddress as Uv}from"ethers";me();W();var Bv="https://api-v3.balancer.fi/",Dv=(e={})=>e.baseUrl||process.env.BALANCER_API_URL||Bv;async function bf(e,t,n={}){return y(Dv(n),{method:"POST",body:{query:e,variables:t},fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs??2e4})}var Fv="query Pools($first: Int, $where: GqlPoolFilter) { poolGetPools(first: $first, where: $where) { id address chain type protocolVersion dynamicData { totalLiquidity volume24h fees24h } } }",gf=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"}}),qv="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",Hv="0x0000000000000000000000000000000000000000",La=new Mv(["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 wf(e){let t=Number(e??8453),n=gf[t];if(!n)throw new Error(`balancer-v3: unsupported chainId ${e} (supported: ${Object.keys(gf).join(", ")})`);return{chainId:t,...n}}function xf(e){let t=String(e||"").toLowerCase();return!t||t==="eth"||t==="native"||t===Hv||t===qv.toLowerCase()}function ci(e,t){if(!Uv(e))throw new Error(`${t} must be a valid EVM address`);return $a(e)}function yf(e,t,n){let r=String(e||"");return xf(r)||/^weth$/i.test(r)?$a(t.weth):/^usdc$/i.test(r)?$a(t.usdc):ci(r,n)}function jv(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 Sf(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 Ef(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 bf(Fv,{first:n,chains:r,where:{chainIn:r}},t)}async function kf(e={}){return{ok:(await bf("query { __typename }",{},e))?.data?.__typename==="Query"}}async function Ma(e={},t={}){let n=wf(e.chainId),r=ci(e.pool,"balancer pool"),o=e.tokenIn||"WETH",i=yf(o,n,"balancer tokenIn"),s=yf(e.tokenOut||"USDC",n,"balancer tokenOut"),a=jv(e.amountIn,"balancer amountIn"),c=ci(e.sender||e.from||e.fromAddress||e.recipient,"balancer sender"),l=La.encodeFunctionData("querySwapSingleTokenExactIn",[r,i,s,a,c,Sf(e.userData)]),d=await(t.rpcCall||L)(n.chainId,"eth_call",[{to:n.router,data:l},e.blockTag||"latest"],t),p=La.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 vf(e={},t={}){let n=wf(e.chainId),r=ci(e.sender||e.from||e.fromAddress||e.recipient,"balancer sender"),o=e.tokenIn||"WETH",i=xf(o),s=await Ma({...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=La.encodeFunctionData("swapSingleTokenExactIn",[s.pool,s.tokenIn,s.tokenOut,BigInt(s.amountIn),BigInt(s.amountOutMinimum),l,u,Sf(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 zv}from"ethers";var Wv="https://api-v2.pendle.finance/core",Gv=Object.freeze({42161:"0x888888888889758F76e7103c6CbF23ABbF58F946",8453:"0x888888888889758F76e7103c6CbF23ABbF58F946"}),Kv="0x0000000000000000000000000000000000000000",Yv="0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee",Af=(e={})=>(e.baseUrl||process.env.PENDLE_API_URL||Wv).replace(/\/$/,"");function li(e,t){try{return zv(e)}catch{throw new Error(`${t} must be a valid EVM address`)}}function vn(e,t){return li(e,t).toLowerCase()}function Xv(e){let t=String(e||"").toLowerCase();return t==="native"||t==="eth"||t===Yv||t===Kv}function Ua(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 Qv(e){if(!Array.isArray(e)||e.length===0)throw new Error("pendle convert requires inputs[]");return e.map((t,n)=>({token:li(t.token,`pendle input ${n} token`),amount:Ua(t.amount,`pendle input ${n} amount`)}))}function Jv(e){if(!Array.isArray(e)||e.length===0)throw new Error("pendle convert requires outputs[]");return e.map((t,n)=>li(t,`pendle output ${n} token`))}function Zv(e){let t=Gv[Number(e)];if(!t)throw new Error(`Pendle prepare not enabled for chainId ${e}`);return t}function eA(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 Ua(t,"pendle output amount")}function tA(e,t){let n=(Array.isArray(e)?e:[]).filter(r=>r?.token&&r?.amount&&!Xv(r.token)).map(r=>({token:vn(r.token,"pendle approval token"),spender:vn(t,"pendle approval spender"),amount:Ua(r.amount,"pendle approval amount")}));return n.length?n.length===1?n[0]:n:null}async function Ba(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(`${Af(t)}/v1/${n}/markets?${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function If(e={}){let t=await Ba({chainId:42161,limit:1},e);return{ok:Array.isArray(t?.results),marketSample:t?.results?.length||0}}async function Da(e={},t={}){let n=Number(e.chainId??42161),r=Zv(n),o=e.from||e.fromAddress||e.userAddress||e.taker||e.receiver;if(!o)throw new Error("pendlePrepare requires from/receiver");let i=li(e.receiver||o,"pendle receiver"),s=Qv(e.inputs),a=Jv(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(`${Af(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(vn(p.to,"pendle tx target")!==vn(r,"pendle router"))throw new Error("Pendle convert returned unexpected router target");if(p.from&&vn(p.from,"pendle tx sender")!==vn(o,"pendle sender"))throw new Error("Pendle convert transaction sender mismatch");let m=eA(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:tA(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 _f(e={},t={}){let n=await Da(e,t),{transaction:r,...o}=n;return o}N();me();W();import{isAddress as rA}from"ethers";var oA="https://api.odos.xyz",Fa=(e={})=>(e.baseUrl||process.env.ODOS_API_URL||oA).replace(/\/$/,"");async function qa(e={}){return y(`${Fa(e)}/info/chains`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs})}function iA(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(!rA(String(e.userAddr||"")))throw new Error("odos: valid userAddr required");return t}async function Pf(e={},t={}){let n=iA(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(`${Fa(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 Cf(e={},t={}){let{chainId:n,quote:r,amountOut:o}=await Pf(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 Tf(e={},t={}){let{chainId:n,quote:r,amountOut:o}=await Pf(e,t),i=await y(`${Fa(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 Nf(e={}){let t=await qa(e);return{ok:Array.isArray(t?.chains)&&t.chains.length>0,chainCount:t?.chains?.length||0}}N();var Of=/[\u200B-\u200F\u202A-\u202E\u2060-\u2064\uFEFF]/g,aA=/[<>&`*_~[\]()|\\]/g,cA=/[\u0000-\u001F\u007F]/g;function Ha(e,{max:t=32,fallback:n=""}={}){return e==null?n:String(e).normalize("NFKC").replace(Of,"").replace(cA,"").replace(aA,"").replace(/\s+/g," ").trim().slice(0,t).trim()||n}function ja(e){if(e==null)return!1;let t=String(e);return Of.test(t)?!0:/[\u0400-\u04FF\u0370-\u03FF]/.test(t)&&/[A-Za-z]/.test(t)}var Rf=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 ui(e,t={}){let n=Number(e),r=t.baseUrl||Rf[n];if(!r)throw new Error(`Blockscout not configured for chainId ${n}`);return r.replace(/\/$/,"")}function $f(e){return!!Rf[Number(e)]}async function Va(e={},t={}){return y(`${ui(e.chainId||1,t)}/api/v2/stats`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3})}async function Lf(e={},t={}){if(!e.address)throw new Error("address required");return y(`${ui(e.chainId||1,t)}/api/v2/addresses/${encodeURIComponent(e.address)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3})}async function Mf(e={},t={}){if(!e.address&&!e.tokenAddress)throw new Error("token address required");return y(`${ui(e.chainId||1,t)}/api/v2/tokens/${encodeURIComponent(e.address||e.tokenAddress)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3})}async function Uf(e={},t={}){if(!e.address)throw new Error("address required");let n=Number(e.chainId||1),r=`${ui(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 Bf(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=Ha(o.symbol||o.name,{max:32,fallback:"TOKEN"}),u=Ha(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:ja(o.symbol)||ja(o.name)||void 0})}return n}async function Df(e={}){let t=await Va({chainId:8453},e);return{ok:t?.total_blocks!=null||t?.total_transactions!=null,chainId:8453}}import{getAddress as xA}from"ethers";var An=Object.freeze(["blockNumber","nativeBalance","tokenBalance","resolveToken","resolvePools","scanBlocks","scoreRisk","quote","sellSimulation","prepareUnsignedTx"]),F=Object.freeze({LIVE:"LIVE",CACHED:"CACHED",STALE:"STALE",UNKNOWN:"UNKNOWN",UNAVAILABLE:"UNAVAILABLE"}),U=Object.freeze({PASS:"PASS",CAUTION:"CAUTION",FAIL:"FAIL",UNKNOWN:"UNKNOWN"}),uA=/^0x[0-9a-fA-F]{40}$/;function Ff(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}uA.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))An.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 qf(e){let{ok:t,errors:n,warnings:r}=Ff(e);if(!t)throw new Error(`invalid scanner for ${e?.key??"<unknown>"}:
12
- - ${n.join(`
13
- - `)}`);let o=e.capabilities||{},i=An.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:An.filter(a=>!i.includes(a))}},supports(a){return i.includes(a)}};for(let a of An)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 di(e){let t=qf(e);return Er.set(t.chainId,t),t}function dA(e){return Er.get(Number(e))||null}function pA(){return[...Er.values()]}function mA(){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:[...An],chains:e}}var Wa={getAmountsOut:"d06ca61f",swapExactTokensForTokens:"38ed1739",swapExactETHForTokens:"7ff36ab5"},ve=e=>BigInt(e).toString(16).padStart(64,"0"),kr=e=>e.slice(2).toLowerCase().padStart(64,"0");function fA(e,t){return`0x${Wa.getAmountsOut}`+ve(e)+ve(64)+ve(t.length)+t.map(kr).join("")}function hA(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 za(e,t="router"){return(e?.venues||[]).find(r=>r.kind===t)?.address??null}var Ga=100;function gA(e,t){let n=Number(t);if(!Number.isFinite(n)||n<0)throw new Error("slippageBps must be a non-negative number");if(n>Ga)throw new Error(`slippageBps ${n} exceeds the ${Ga} 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 Hf(e){let{chainId:t,wrappedNative:n}=e;async function r(o,i,s,a){let c=await L(t,"eth_call",[{to:o,data:fA(i,s)},"latest"],a);return hA(c?.result??c)}return{async quote({tokenIn:o,tokenOut:i,amountIn:s,path:a},c={}){let l=za(c.scanner);if(!l)return{chainId:t,evidence:F.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:F.LIVE,note:"exact-input quote at current reserves; not a guaranteed fill"}:{chainId:t,router:l,path:u,evidence:F.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=za(a.scanner),l=s||n;if(l&&String(o).toLowerCase()===String(l).toLowerCase())return{chainId:t,token:o,verdict:U.UNKNOWN,evidence:F.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:U.UNKNOWN,evidence:F.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:U.FAIL,evidence:F.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:U.FAIL,evidence:F.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:U.FAIL,evidence:F.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=U.PASS,g="round trip completes with expected fee/impact loss";return f<5e3?(h=U.FAIL,g=`round trip returns only ${(f/100).toFixed(2)}% -- punitive tax or no real liquidity`):f<9e3&&(h=U.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:F.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=za(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!==F.LIVE)throw new Error(`cannot prepare without a live quote (${h.evidence}: ${h.reason??"no reason given"})`);let g=gA(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)),S=n&&f[0].toLowerCase()===n.toLowerCase()&&d.useNative,x=S?`0x${Wa.swapExactETHForTokens}`+ve(g)+ve(128)+kr(a)+ve(b)+ve(f.length)+f.map(kr).join(""):`0x${Wa.swapExactTokensForTokens}`+ve(s)+ve(g)+ve(160)+kr(a)+ve(b)+ve(f.length)+f.map(kr).join("");return{unsigned:!0,signedBy:"user-wallet",chainId:t,tx:{to:m,data:x,value:S?`0x${BigInt(s).toString(16)}`:"0x0"},guard:{quotedOut:h.amountOut,minOut:g.toString(),slippageBps:c,maxSlippageBps:Ga,deadline:b.toString()},requires:S?[]:[{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 yA=[100,500,3e3,1e4],jf={quoteExactInputSingle:"c6a5026a",exactInputSingle:"04e45aaf"},Mt=e=>BigInt(e).toString(16).padStart(64,"0"),vr=e=>e.slice(2).toLowerCase().padStart(64,"0"),Vf=/^0x[0-9a-fA-F]{40}$/,Ya=100;function bA(e,t){let n=Number(t);if(!Number.isFinite(n)||n<0)throw new Error("slippageBps must be a non-negative number");if(n>Ya)throw new Error(`slippageBps ${n} exceeds the ${Ya} 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 Ka(e,t){return(e?.venues||[]).find(n=>n.kind===t)?.address??null}function zf(e){let{chainId:t,wrappedNative:n}=e;async function r({quoter:i,tokenIn:s,tokenOut:a,amountIn:c,fee:l},u){let d=`0x${jf.quoteExactInputSingle}`+vr(s)+vr(a)+Mt(c)+Mt(l)+Mt(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 yA){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=Ka(c.scanner,"quoter");if(!l)return{chainId:t,evidence:F.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(!Vf.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:F.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:F.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=Ka(c.scanner,"quoter"),u=a||n;if(u&&String(i).toLowerCase()===String(u).toLowerCase())return{chainId:t,token:i,verdict:U.UNKNOWN,evidence:F.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:U.UNKNOWN,evidence:F.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:U.FAIL,evidence:F.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:U.FAIL,evidence:F.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=U.PASS,g="round trip completes with expected fee/impact loss";return f<5e3?(h=U.FAIL,g=`round trip returns only ${(f/100).toFixed(2)}% -- punitive tax or no real liquidity`):f<9e3&&(h=U.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:F.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=Ka(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(!Vf.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!==F.LIVE)throw new Error(`cannot prepare without a live quote (${m.evidence}: ${m.reason??"no reason given"})`);let f=u??m.fee,h=bA(m.amountOut,l);if(h<=0n)throw new Error("computed minOut is zero -- refusing to prepare");let g=`0x${jf.exactInputSingle}`+vr(i)+vr(s)+Mt(f)+vr(c)+Mt(a)+Mt(h)+Mt(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:Ya,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 pi={decimals:"0x313ce567",symbol:"0x95d89b41",name:"0x06fdde03",totalSupply:"0x18160ddd",owner:"0x8da5cb5b"};function Wf(e){if(!e||e==="0x")return null;try{return BigInt(e)}catch{return null}}function Gf(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 wA(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 Zr(t,r);return{chainId:t,blockNumber:o?.blockNumber??o,evidence:F.LIVE}},async nativeBalance(r,o={}){let i=await Qt(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:F.LIVE}},async tokenBalance({token:r,owner:o},i={}){let s=await eo({chainId:t,token:r,owner:o},i);return{chainId:t,token:r,owner:o,raw:s?.balance??s,evidence:F.LIVE}},async resolveToken(r,o={}){if(!/^0x[0-9a-fA-F]{40}$/.test(r||""))return{chainId:t,token:r,evidence:F.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,pi.decimals,o).catch(()=>null),n(r,pi.symbol,o).catch(()=>null),n(r,pi.name,o).catch(()=>null),n(r,pi.totalSupply,o).catch(()=>null)]),l=Wf(i?.result??i),u=l!==null||s?.result||a?.result;return{chainId:t,address:r,decimals:l===null?null:Number(l),symbol:Gf(s?.result??s),name:Gf(a?.result??a),totalSupply:(Wf(c?.result??c)??null)?.toString()??null,evidence:u?F.LIVE:F.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:F.UNAVAILABLE,reason:"no dexscreenerSlug configured for this chain; pool discovery is unavailable rather than guessed"};let s=await Tt(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?F.LIVE:F.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:F.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:F.LIVE}},async scoreRisk(r,o={}){let i=[],s=U.PASS,a=u=>{let d={[U.PASS]:0,[U.CAUTION]:1,[U.UNKNOWN]:2,[U.FAIL]:3};d[u]>d[s]&&(s=u)},c=await this.resolveToken(r,o);c.evidence!==F.LIVE?(i.push({check:"erc20-metadata",result:U.UNKNOWN,detail:c.warning}),a(U.UNKNOWN)):i.push({check:"erc20-metadata",result:U.PASS,detail:`${c.symbol} / ${c.decimals}d`});let l=await this.resolvePools(r,o);if(l.evidence===F.UNAVAILABLE)i.push({check:"liquidity",result:U.UNKNOWN,detail:l.reason}),a(U.UNKNOWN);else if(!l.pools.length)i.push({check:"liquidity",result:U.FAIL,detail:"no pool with liquidity found"}),a(U.FAIL);else{let u=l.pools[0],d=u.liquidityUsd??0;d<5e3?(i.push({check:"liquidity",result:U.CAUTION,detail:`top pool only $${d}`}),a(U.CAUTION)):i.push({check:"liquidity",result:U.PASS,detail:`$${d} on ${u.dex}`}),u.createdAt&&Date.now()-u.createdAt<24*3600*1e3&&(i.push({check:"age",result:U.CAUTION,detail:"pool under 24h old"}),a(U.CAUTION))}if(typeof this.sellSimulation=="function"){let u=await this.sellSimulation({token:r,amountIn:(10n**16n).toString()},o).catch(d=>({verdict:U.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:U.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(U.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 Xa(e){let n={...wA(e)},r=new Set((e.venues||[]).map(i=>i.kind));e.venueKind==="uniswap-v3"&&r.has("quoter")&&r.has("router")?Object.assign(n,zf({chainId:e.chainId,wrappedNative:e.wrappedNative})):e.venueKind==="uniswap-v2"&&r.has("router")&&Object.assign(n,Hf({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 Ar=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 Kf(){return Ar.map(e=>di(Xa(e)))}function Yf(e){return di(Xa(e))}N();var SA="TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb",Qf=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 pt(e={},t){return{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs,env:e.env,...e[t]||{}}}function mi(e,...t){for(let n of t){let r=String(e?.[n]||"").trim();if(r)return r}return null}function Xf(e){if(!e)return null;try{return xA(String(e).trim().toLowerCase())}catch{throw new Error("portfolio: EVM address must be a valid 20-byte address")}}function Ut(e={},t=process.env){let n=e.addresses||{},r=Xf(n.evm||e.evmAddress||mi(t,"ORACLE_EVM_ADDRESS","ORACLE_DEFAULT_ADDRESS","MAD_OPERATOR_ADDRESS")),o=n.solana||e.solanaAddress||mi(t,"ORACLE_SOLANA_ADDRESS"),i=n.bitcoin||e.bitcoinAddress||mi(t,"ORACLE_BITCOIN_ADDRESS"),s=Xf(n.hyperliquid||e.hyperliquidAddress||mi(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 Ir(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 In(e){let t=Number(e);return Number.isFinite(t)?t:null}function fi(e){return Number.isFinite(e)?Number(e.toFixed(2)):null}function mt(e){let t=Number(e);return Number.isFinite(t)&&t!==0}function Jf(e,t){let n=Qf[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 EA(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:Ir(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 Qa(e,t){return{family:e,status:"unsupported",reason:t}}function Ja(e,t){if(!e||e.status!=="ok")return e;let n=Jf(t,e.symbol),r=In(e.amount),o=r!=null&&n.priceUsd!=null?fi(r*n.priceUsd):null;return{...e,price:n,usdValue:o}}async function Zf(e={}){let t=Ut({},e.env||process.env);return{ok:!0,provider:"portfolio",readOnly:!0,configuredFamilies:Object.entries(t).filter(([,n])=>!!n).map(([n])=>n)}}async function hi(e={},t={}){let n=new Date().toISOString(),r=Ut(e,t.env||process.env),o=e.includePrices!==!1,i=e.includeTokens!==!1,s=e.includeCollectibles!==!1,a=new Map(Ar.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(Qf))],u=o?ne(()=>Oe(l,pt(t,"prices"))):Promise.resolve({ok:!1,ms:0,error:"price lookup disabled"}),d=Xt(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 D={...pt(t,"evm"),rpcUrl:e.rpcUrls?.[C]||t.evm?.rpcUrls?.[C]},X=await ne(()=>Qt(C,r.evm,D));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",M=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&&$f(C)){let Pt=await ne(()=>Uf({chainId:C,address:r.evm},{...pt(t,"blockscout"),timeoutMs:t.timeoutMs??18e3}));Pt.ok?ee={status:"ok",assets:Bf(Pt.data,{fungibleOnly:!0}).map(zn=>{let Wn=Ir(zn.amountRaw,zn.decimals);return{...zn,amount:Wn,priceUsd:null,usdValue:null}}),reason:null,source:"blockscout",latencyMs:Pt.ms}:ee={status:"unavailable",assets:[],reason:Pt.error||"blockscout token-balances failed",source:"blockscout",latencyMs:Pt.ms}}return{family:"evm",chainId:C,name:$.name,address:r.evm,status:"ok",latencyMs:X.ms,native:{status:"ok",symbol:ye,amountRaw:M,decimals:ie,amount:Ir(M,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=pt(t,"solana"),$=await ne(()=>ho({address:r.solana},C)),D=i||s?await Promise.all([ne(()=>rr({owner:r.solana,programId:Rs},C)).then(ee=>({...ee,program:"spl-token"})),ne(()=>rr({owner:r.solana,programId:SA},C)).then(ee=>({...ee,program:"token-2022"}))]):[],X=EA(D),ie=X.filter(ee=>ee.classification==="collectible-candidate"),ye=X.filter(ee=>ee.classification!=="collectible-candidate"),M=D.filter(ee=>!ee.ok).map(ee=>ee.error);return{family:"solana",name:"Solana Mainnet",address:r.solana,status:$.ok||D.some(ee=>ee.ok)?"ok":"unavailable",native:$.ok?{status:"ok",symbol:"SOL",amountRaw:$.data.lamports,decimals:9,amount:Ir($.data.lamports,9),slot:$.data.slot}:{status:"unavailable",symbol:"SOL",error:$.error},fungibleTokens:{status:i?M.length===D.length?"unavailable":M.length?"partial":"ok":"not-requested",assets:i?ye:[],errors:M,note:"SPL accounts are unverified until a metadata/indexer source confirms symbol and spam status"},collectibles:{status:s?M.length===D.length?"unavailable":"partial":"not-requested",assets:s?ie:[],errors:M,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=pt(t,"bitcoin"),$=pt(t,"bitcoinMeta"),[D,X,ie]=await Promise.all([ne(()=>yo({address:r.bitcoin},C)),i?ne(()=>wo({address:r.bitcoin},$)):Promise.resolve({ok:!1,ms:0,error:"token discovery disabled"}),s?ne(()=>rn({address:r.bitcoin},$)):Promise.resolve({ok:!1,ms:0,error:"collectible discovery disabled"})]),ye=X.ok?X.data:null,M=ie.ok?ie.data:null;return{family:"bitcoin",name:"Bitcoin Mainnet",address:r.bitcoin,status:D.ok||ye?.ok||M?.ok?"ok":"unavailable",native:D.ok?{status:"ok",symbol:"BTC",amountRaw:D.data.balanceSats,decimals:8,amount:Ir(D.data.balanceSats,8)}:{status:"unavailable",symbol:"BTC",error:D.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?M?.ok?"ok":"unavailable":"not-requested",assets:M?.inscriptions||[],error:M?.ok?null:M?.error||ie.error,unknownNotEmpty:!!M?.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=pt(t,"hyperliquid"),[$,D,X]=await Promise.all([ne(()=>uo(r.hyperliquid,C)),ne(()=>mo(r.hyperliquid,C)),ne(()=>Xe(C))]),ie=($.ok&&Array.isArray($.data?.balances)?$.data.balances:[]).filter(M=>mt(M.total)||mt(M.hold)).map(M=>({coin:M.coin||null,total:String(M.total??"0"),hold:String(M.hold??"0"),priceUsd:null,usdValue:null})),ye=(D.ok&&Array.isArray(D.data?.assetPositions)?D.data.assetPositions:[]).map(M=>M.position||M).filter(M=>mt(M.szi)).map(M=>({coin:M.coin||null,size:String(M.szi??"0"),entryPrice:M.entryPx??null,positionValueUsd:M.positionValue??null,unrealizedPnlUsd:M.unrealizedPnl??null,liquidationPrice:M.liquidationPx??null}));return{family:"hyperliquid",name:"Hyperliquid HyperCore",address:r.hyperliquid,status:$.ok||D.ok?"ok":"unavailable",spot:{status:$.ok?"ok":"unavailable",balances:ie,error:$.ok?null:$.error},perps:{status:D.ok?"ok":"unavailable",accountValueUsd:D.data?.marginSummary?.accountValue??null,withdrawableUsd:D.data?.withdrawable??null,positions:ye,error:D.ok?null:D.error},mids:X.ok?X.data:{},source:"hyperliquid-info"}})(),[h,g,b,S,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 D of C.fungibleTokens.assets||[])D.address&&T.push(`${$}:${String(D.address).toLowerCase()}`)}let I=null;if(o&&T.length){let C=[...new Set(T)],$=await ne(()=>Oe(C,pt(t,"prices")));$.ok&&(I=$.data)}let R=h.map(C=>{let $=C.native?{...C,native:Ja(C.native,w)}:C;if($.fungibleTokens?.status==="ok"&&Array.isArray($.fungibleTokens.assets)){let D=v[$.chainId],X=$.fungibleTokens.assets.map(ie=>{let ye=String(ie.symbol||"").toUpperCase(),M=null;if(["USDC","USDT","USDT0","DAI","USDBC","USDE","USDCE"].includes(ye)&&(M=1),M==null&&D&&ie.address&&I?.coins){let Gl=`${D}:${String(ie.address).toLowerCase()}`,zn=I.coins[Gl],Wn=Number(zn?.price);Number.isFinite(Wn)&&Wn>0&&(M=Wn)}let ee=In(ie.amount),Pt=ee!=null&&M!=null?fi(ee*M):null;return{...ie,priceUsd:M,usdValue:Pt}});$={...$,fungibleTokens:{...$.fungibleTokens,assets:X}}}return $});g.native&&(g.native=Ja(g.native,w)),b.native&&(b.native=Ja(b.native,w));let _=0,k=0,q=0;for(let C of[...R,g,b]){C.native?.status==="ok"&&mt(C.native.amount)&&(C.native.usdValue!=null?(_+=C.native.usdValue,k+=1):q+=1);for(let $ of C.fungibleTokens?.assets||[])!mt($.amount)&&!mt($.amountRaw)||($.usdValue!=null?(_+=$.usdValue,k+=1):q+=1)}let ge=Jf(w,"HYPE");for(let C of S.spot?.balances||[]){let $=String(C.coin||"").toUpperCase(),D=$==="USDC"||$==="USDT"||$==="USDT0"?1:$==="HYPE"?ge.priceUsd||In(S.mids?.HYPE):In(S.mids?.[C.coin]),X=In(C.total);C.priceUsd=D,C.usdValue=X!=null&&D!=null?fi(X*D):null,mt(C.total)&&(C.usdValue!=null?(_+=C.usdValue,k+=1):q+=1)}let Ce=In(S.perps?.accountValueUsd);Ce!=null&&Ce!==0&&(_+=Ce,k+=1);let qn=[...g.fungibleTokens?.assets||[],...g.collectibles?.assets||[]].filter(C=>mt(C.amount)).length,Kt=(b.fungibleTokens?.assets||[]).length+(b.collectibles?.assets||[]).length;q+=qn+Kt;let Hn=[...R,g,b,S],nt=C=>Hn.filter($=>$.status===C).length,rt=[],jn=R.filter(C=>C.fungibleTokens?.status==="unavailable"),Vn=R.filter(C=>C.fungibleTokens?.status==="ok");jn.length&&!Vn.length?rt.push("EVM token discovery is unavailable without a working address indexer; native balances are still live."):jn.length&&rt.push(`EVM token discovery partial: Blockscout covered ${Vn.length} chain(s); ${jn.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 Yt=[Qa("cosmos","requires a chain-specific bech32 address and LCD/RPC adapter"),Qa("sui","Sui balance adapter is not installed"),Qa("aptos","Aptos balance adapter is not installed")],ms=Hn.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:Hn.length,ok:nt("ok"),unavailable:nt("unavailable"),notConfigured:nt("not-configured"),unsupported:nt("unsupported")+Yt.length,evmChainsRequested:c.length,evmChainsOk:R.filter(C=>C.status==="ok").length},valuation:{knownUsd:fi(_),label:"known priced value, not a complete portfolio total",pricedItems:k,unpricedNonzeroItems:q,complete:q===0&&!ms&&nt("unavailable")===0&&nt("not-configured")===0&&Yt.length===0,priceSource:o?"DefiLlama":null,priceStatus:x.ok?"ok":"unavailable",priceQueriedAt:n},chains:[...R,g,b,S],unsupportedFamilies:Yt,warnings:rt}}import{constants as yi}from"node:fs";import{chmod as GA,mkdir as KA,open as YA,readFile as XA}from"node:fs/promises";import{createHash as QA,randomUUID as JA}from"node:crypto";import ZA from"node:os";import Pn from"node:path";N();N();var vA=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"]),AA=new Set(["image/jpeg","image/png","image/webp"]);function IA(e){let t=String(e||"").toLowerCase();return vA.some(n=>t===n||t.endsWith(`.${n}`))}function _A(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 eh(e){let t=_A(e),n;try{n=new URL(t)}catch{return null}return n.protocol!=="https:"||n.username||n.password||!IA(n.hostname)?null:n}async function PA(e,t={}){let n=t.fetchImpl||globalThis.fetch;if(typeof n!="function")throw new Error("gallery fetch unavailable");let r=eh(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=eh(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(!AA.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 Za(e){return String(e??"").replaceAll("&","&amp;").replaceAll("<","&lt;").replaceAll(">","&gt;").replaceAll('"',"&quot;").replaceAll("'","&apos;")}function CA(e,t){return e.name||e.collection||e.tokenId||`NFT ${t+1}`}async function th(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 PA(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,k=m+R*p,q=w?`<image x="${_+14}" y="${k+14}" width="312" height="312" preserveAspectRatio="xMidYMid slice" href="data:${w.mimeType};base64,${w.data}"/>`:`<rect x="${_+14}" y="${k+14}" width="312" height="312" rx="14" fill="#151820"/><text x="${_+170}" y="${k+165}" text-anchor="middle" fill="#76808f" font-size="16">image unavailable</text>`,ge=Za(CA(x,T).slice(0,34)),Ce=Za(x.chain||"unknown chain");return`${q}<text x="${_+16}" y="${k+350}" fill="#f3f5f7" font-size="17" font-weight="600">${ge}</text><text x="${_+16}" y="${k+376}" fill="#8d98a8" font-size="13">${Ce}${v?" \xB7 placeholder":""}</text>`}).join(""),S=`<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 ${Za(new Date().toISOString())}</text>${b}</svg>`;return{provider:"nft-portfolio",operation:"gallery",mimeType:"image/svg+xml",dataBase64:Buffer.from(S).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 TA=[/\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],NA=/(https?:\/\/|www\.|[a-z0-9-]+\.(?:com|net|io|xyz|org|app|finance|gift|claims?|site|link|live|vip|top|cc))/i,OA=/(\$\s?\d|\d[\d,.]*\s*(?:usd|usdc|usdt|eth|weth|btc|sol)\b)/i;function RA(e={}){let t=[],n=String(e.name||""),r=String(e.description||""),o=`${n} ${r}`;NA.test(n)&&t.push("url-in-name");let i=TA.filter(l=>l.test(o)).length;i>0&&t.push(`lure-language:${i}`),OA.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 nh(e={}){let t=RA(e);return{...e,spam:e.spam===!0||t.spam,riskLevel:t.risk,riskReasons:t.reasons.length?t.reasons:void 0}}W();var $A=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"}]),LA=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 Bt(e={},t){return{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs,env:e.env,allowDiskCredentials:e.allowDiskCredentials,allowAmbientCredentials:e.allowAmbientCredentials,...e[t]||{}}}async function _r(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 MA(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 UA(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 BA(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 ih(e={}){return[e.chain||"unknown",e.contract||"native",e.tokenId||"unknown"].join(":").toLowerCase()}function DA(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 FA(e,t){let n=ih(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 qA(e){let t=new Map;for(let n of e){let r=ih(n);t.has(r)||t.set(r,n)}return[...t.values()]}function HA(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 sh(){return{ok:!0,provider:"nft-portfolio",readOnly:!0,marketplaces:["opensea","magiceden-sol","satflow"],listingExecution:"prepare-only"}}async function _n(e={},t={}){let n=new Date().toISOString(),r=Ut(e,t.env||process.env),o=Array.isArray(e.chains)&&e.chains.length?new Set(e.chains.map(w=>String(w).toLowerCase())):null,i=$A.filter(w=>!o||o.has(w.chain)),s=[],a=[],c=Bt(t,"opensea"),l=r.evm?i.filter(w=>w.family!=="solana"):[],u=await Xt(l,4,async w=>({row:w,result:await _r(`opensea-${w.chain}`,()=>ur({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 _r("opensea-solana",()=>ur({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 _r("satflow-wallet-contents",()=>So({address:r.bitcoin,type:"ordinals",limit:e.bitcoinLimit??100,offset:0},Bt(t,"satflow")),t.timeoutMs??35e3);if(w.ok){let v=MA(w.data.contents).map(I=>UA(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 _r("bitcoin-meta-inscriptions",()=>rn({address:r.bitcoin},Bt(t,"bitcoinMeta")),t.timeoutMs??35e3),T=v.ok&&v.data?.ok&&Array.isArray(v.data.inscriptions)?v.data.inscriptions:[];a.push(...T.map(I=>BA(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 _r(`opensea-pnl-${w}`,()=>qo({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=DA(e.costBasis),m=qA(a).map(w=>FA(w,p)).map(w=>nh(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,S=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:LA,inventory:{count:m.length,visibleCount:f.length,flaggedCount:h.length,items:m,visibleItems:f,flaggedItems:h},valuation:{estimatedCurrentValueUsd:b,valuedItems:g.length,unvaluedItems:S,complete:S===0&&x.length===0,methodology:"Sum of provider estimated_value_usd for non-flagged items. It is not an executable bid."},pnl:HA(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 rh(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 jA(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 ah(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 Ho(e,Bt(t,"opensea"));if(n==="magiceden"||n==="magiceden-sol"){let r=rh(e.expiry??e.endTime,"Solana NFT listing expiry");return jo({...e,expiry:r},Bt(t,"magiceden"))}if(n==="satflow"){let r=rh(e.expiry??e.endTime??e.expiresAt,"Bitcoin NFT listing expiry");return Eo({inscription_id:e.inscriptionId||e.tokenId,runes_output:e.runesOutput,ord_address:e.ordAddress||e.seller,receive_address:e.receiveAddress,price:jA(e.priceSats??e.price),tap_key:e.tapKey,collection_slug:e.collectionSlug||e.collection,expires_at:r},Bt(t,"satflow"))}throw new Error(`unsupported NFT marketplace: ${n||"<missing>"}`)}function ec(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 tc(e){if(e==null||e==="")return null;let t=Number(e);return Number.isFinite(t)&&t>0?t:null}function gi(e){return String(e??"").trim().toLowerCase()}function VA(e={},t,n){let r=Array.isArray(e.traits)?e.traits:[],o=gi(t),i=gi(n);return!o||!i?!1:r.some(s=>gi(s.trait_type??s.traitType??s.type)===o&&gi(s.value??s.trait_value??s.traitValue)===i)}function zA(e={},t){if(!t)return!0;let n=String(e.contract||e.tokenContract||e.assetContract||"").toLowerCase();return!n||n===String(t).toLowerCase()}function oh(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 nc(e){return Math.round(Number(e)*1e6)/1e6}function ft(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 ch(e={},t={}){let n=String(e.marketplace||"").trim().toLowerCase();if(n!=="opensea")return ft(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 ft(e,`trait-risk-params-required: ${o.join(",")}`);let i=Number.isFinite(Number(e.nowMs))?Number(e.nowMs):Date.now(),s=ec(e.maxPriceEth,"maxPriceEth"),a=Number(e.minDiscountBps),c=Number(e.minTraitSales),l=ec(e.minTraitVolumeEth,"minTraitVolumeEth"),u=ec(e.traitFloorEth,"traitFloorEth"),d=tc(e.collectionFloorEth),p=tc(e.maxListingAgeMs),m=tc(e.maxSaleAgeMs??e.salesWindowMs);if(!Number.isFinite(a)||a<0)return ft(e,"invalid-min-discount-bps");if(!Number.isFinite(c)||c<1)return ft(e,"invalid-min-trait-sales");if(u<=0)return ft(e,"trait-floor-unavailable");let f=I=>VA(I,e.traitType,e.traitValue)&&zA(I,e.contract),h=(Array.isArray(e.sales)?e.sales:[]).filter(f).filter(I=>{if(!m)return!0;let R=oh(I,["timestamp","soldAt","createdAt"]);return R!=null&&i-R<=m}),g=nc(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 ft(e,"trait-liquidity-insufficient",{traitSales:b});let S=(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 _=oh(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:S.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 ft(e,"invalid-min-trait-listings",x);if(S.length<w)return ft(e,"trait-listing-depth-insufficient",x);let v=S[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:nc(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:nc(v.priceEth),discountBps:v.discountBps},evidence:x,prepareIntent:T}}async function lh(e={},t={}){let n=await _n({...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 uh(e={},t={}){let n=Array.isArray(e.items)?e.items:null,r=null;return n||(r=await _n({...e,includePnl:!1},t),n=r.inventory.visibleItems),{...await th({...e,items:n},Bt(t,"gallery")),inventorySummary:r?{visibleCount:r.inventory.visibleCount,flaggedCount:r.inventory.flaggedCount,coverage:r.coverage}:null}}var dh=10*1024*1024,fh=1e3;function ht(e){if(e==null||e==="")return null;let t=Number(e);return Number.isFinite(t)?t:null}function Cn(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 hh(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 eI(e={}){return["evm","solana","bitcoin","hyperliquid"].map(t=>`${t}:${String(e[t]||"").trim().toLowerCase()}`).join("|")}function gh(e={}){return`portfolio_${QA("sha256").update(eI(e)).digest("hex").slice(0,20)}`}function yh(e={}){if(e.historyFile)return Pn.resolve(String(e.historyFile));let t=e.env||process.env;if(t.ORACLE_PORTFOLIO_HISTORY_FILE)return Pn.resolve(String(t.ORACLE_PORTFOLIO_HISTORY_FILE));let n=String(t.HERMES_HOME||"").trim()||Pn.join(ZA.homedir(),".hermes");return Pn.join(Pn.resolve(n),"state","oracle","portfolio-history.jsonl")}function tI(e){let t=ht(e?.valuation?.knownUsd);return t==null?null:Number(e?.valuation?.pricedItems||0)>0||e?.valuation?.complete===!0?Cn(t):null}function nI(e){if(!e||e.status==="unavailable"||e.status==="not-requested")return null;let t=ht(e?.valuation?.estimatedCurrentValueUsd);return t==null?null:Number(e?.valuation?.valuedItems||0)>0||e?.valuation?.complete===!0?Cn(t):null}function rI(e){let t=[];for(let n of e?.chains||[]){if(n.family==="hyperliquid"){let o=(n.spot?.balances||[]).reduce((a,c)=>{let l=ht(c.usdValue);return l==null?a:a+l},0),i=ht(n.perps?.accountValueUsd),s=Cn(o+(i??0));(s!==0||i!=null||(n.spot?.balances||[]).some(a=>ht(a.usdValue)!=null))&&t.push({family:"hyperliquid",chainId:null,name:n.name||"Hyperliquid",knownUsd:s});continue}let r=ht(n.native?.usdValue);r!=null&&t.push({family:n.family||"evm",chainId:n.chainId??null,name:n.name||n.native?.symbol||"Unknown",knownUsd:Cn(r)})}return t}function oI(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 iI(e,t){let n=yh(t),r=`${JSON.stringify(e)}
14
- `;if(Buffer.byteLength(r)>32*1024)throw new Error("portfolio history snapshot exceeds 32 KiB");await KA(Pn.dirname(n),{recursive:!0,mode:448});let o=yi.O_APPEND|yi.O_CREAT|yi.O_WRONLY|(yi.O_NOFOLLOW||0),i=await YA(n,o,384);try{await i.writeFile(r,"utf8")}finally{await i.close()}return await GA(n,384),n}async function bh(e={},t={}){let n=e.includeNfts!==!1,r=t.portfolioBalanceImpl||hi,o=t.nftInventoryImpl||_n,i=r(e,t),s=n?o({...e,includePnl:!1},t).catch(v=>({status:"unavailable",error:String(v?.message||v).slice(0,300)})):Promise.resolve({status:"not-requested"}),[a,c]=await Promise.all([i,s]),l=tI(a),u=nI(c),d=[l,u].filter(v=>v!=null),p=d.length?Cn(d.reduce((v,T)=>v+T,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||Ut(e,t.env||process.env),b=gh(g),S=[...a?.warnings||[]];n&&c?.status==="unavailable"&&S.push(`NFT inventory unavailable: ${c.error}`),n&&c?.valuation&&c.valuation.complete!==!0&&S.push("NFT estimated value is incomplete and is not an executable bid.");let x={schemaVersion:1,id:`snapshot_${JA()}`,portfolioId:b,recordedAt:h,sourceQueriedAt:{balances:a?.queriedAt||null,nfts:c?.generatedAt||null},configuredFamilies:Object.fromEntries(["evm","solana","bitcoin","hyperliquid"].map(v=>[v,!!g?.[v]])),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:rI(a),nfts:{knownUsd:u,visibleItems:Number(c?.inventory?.visibleCount||0),flaggedItems:Number(c?.inventory?.flaggedCount||0)}},coverage:oI(a,c,n),warnings:[...new Set(S)].slice(0,50)};return{provider:"portfolio",operation:"snapshot",readOnly:!0,localObservationRecorded:!0,historyFile:await iI(x,t),snapshot:x,balance:a,nfts:c}}async function sI(e){let t=yh(e);try{let n=await XA(t);if(n.byteLength>dh)throw new Error(`portfolio history exceeds ${dh} bytes`);let r=[],o=0;for(let i of n.toString("utf8").split(`
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 aI(e,t){if(e.allPortfolios===!0)return null;if(e.portfolioId)return String(e.portfolioId);let n=Ut(e,t.env||process.env);return Object.values(n).some(Boolean)?gh(n):null}async function rc(e={},t={}){let n=hh(e.limit,100,1,fh,"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=aI(e,t),a=await sI(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=>ht(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 mh(e){return`$${Number(e).toLocaleString("en-US",{minimumFractionDigits:2,maximumFractionDigits:2})}`}function bi(e){return String(e).replaceAll("&","&amp;").replaceAll("<","&lt;").replaceAll(">","&gt;").replaceAll('"',"&quot;").replaceAll("'","&apos;")}function cI(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 lI(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">${mh(I)}</text>`}).join(""),h=e.map((x,w)=>`<circle cx="${d(w)}" cy="${p(x.value)}" r="5" fill="#b8f0ff"><title>${bi(x.recordedAt)}: ${mh(x.value)}</title></circle>`).join(""),g=bi(e[0].recordedAt.slice(0,10)),b=bi(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 ${bi(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 wh(e={},t={}){if(e.allPortfolios===!0)throw new Error("portfolio value graph requires one portfolioId or configured public-address portfolio");let n=hh(e.maxPoints,200,2,500,"portfolio graph maxPoints"),r=await rc({...e,order:"asc",limit:e.limit??fh},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:ht(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=cI(o,n),s=i[0].value,a=i.at(-1).value,c=Cn(a-s),l=s===0?null:Number(((a-s)/s*100).toFixed(2)),u=lI(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 dI=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"}}),pI=Object.freeze([{label:"eip1967",slot:"0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc"},{label:"zeppelinos",slot:"0x7050c9e0f4ca769c69bd3a8ef740bc37934f8e2c036e5a723fd8ee048ed3f8c3"},{label:"eip1822",slot:"0xc5f16f0fcc639fa48a6947836d9850f504798523bf8c9a3a87d5876cf622bcf7"}]),mI=`0x${"0".repeat(64)}`;function fI(e){return!e||e==="0x"||e===mI}async function Pr(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(dI))c.includes(f)&&a.push({selector:`0x${f}`,...h});let l=!1,u=null,d=null;for(let{label:f,slot:h}of pI)try{let g=await n(o,"eth_getStorageAt",[r,h,"latest"],t);if(!fI(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 xh(e={}){let t=Date.now();try{let n=await Pr({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 gI=/^(0|[1-9][0-9]*)$/,wi=class extends Error{constructor(t){super(`nft gas-war limit: ${t.reason}`),this.name="NftGasWarLimitError",this.verdict=t}};function Dt(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(!gI.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 yI(e){let t=Number(e);if(!Number.isSafeInteger(t)||t<=0)throw new Error("chainId must be a positive integer");return t}function bI(e={}){return e.maxFeePerGas!=null?Dt(e.maxFeePerGas,"maxFeePerGas"):e.gasPrice!=null?Dt(e.gasPrice,"gasPrice"):null}function xi(e={}){try{let t=yI(e.chainId??e.tx?.chainId),n=e.tx||e,r=e.policy||e,o=r.grant?.maxGasWei??e.grant?.maxGasWei,i=Dt(r.maxTotalGasWei??r.maxGasWei??o,"maxTotalGasWei"),s=Dt(n.gasLimit??n.gas,"gasLimit"),a=bI(n);if(a==null)throw new Error("maxFeePerGas or gasPrice required");let c=Dt(r.maxFeePerGasWei,"maxFeePerGasWei",{required:!1}),l=Dt(r.maxPriorityFeePerGasWei,"maxPriorityFeePerGasWei",{required:!1}),u=n.maxPriorityFeePerGas==null?null:Dt(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 wI(e={}){let t=xi(e);if(!t.ok)throw new wi(t);return t}var xI=5,oc=[50,75,90],Sh=Object.freeze({normal:{percentile:0,baseFeeMultiplier:2n,label:"normal"},fast:{percentile:1,baseFeeMultiplier:3n,label:"fast"},war:{percentile:2,baseFeeMultiplier:4n,label:"war"}});function Ft(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 SI(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 Si(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=Sh[e.urgency||"fast"];if(!o)return{status:"error",viable:!1,error:`urgency must be one of: ${Object.keys(Sh).join(", ")}`};let i,s,a,c;try{i=Ft(e.maxFeePerGasWei,"maxFeePerGasWei"),s=Ft(e.maxPriorityFeePerGasWei,"maxPriorityFeePerGasWei"),a=Ft(e.gasLimit,"gasLimit"),c=Ft(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${xI.toString(16)}`,"pending",oc],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=Ft(u?.baseFeePerGas,"baseFeePerGas")??Ft(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 Ft(I?.[o.percentile],"reward")}catch{return null}}).filter(I=>I!=null&&I>0n),f=SI(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,S=[];s!=null&&g>s&&(S.push({field:"maxPriorityFeePerGas",wanted:g.toString(),capped:s.toString()}),g=s,b=d*o.baseFeeMultiplier+g),i!=null&&b>i&&(S.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&&S.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 ${oc[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:oc[o.percentile],maxFeePerGas:b.toString(),maxPriorityFeePerGas:g.toString(),worstCaseGasWei:x==null?null:x.toString(),clamps:S,notes:h}}var kI="08c379a0",vI="4e487b71",AI=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 II(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===kI)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===vI){let r=parseInt(t.slice(8,72),16);return{kind:"panic",code:r,reason:AI[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 _I(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 PI(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 CI(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 Cr(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=CI(o),s=[],a=null,c=!1,l=null;try{a=await n(r,"eth_call",[i,"pending"],t)}catch(f){let h=_I(f);if(!PI(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=II(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 Eh(e={}){let t=Date.now();try{let n=await Cr({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 NI=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 OI(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 RI(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 kh(e,{minter:t,quantity:n}){let r=`0x${e.selector}`;for(let o of e.args)if(o==="to")r+=RI(t);else if(o==="quantity")r+=OI(n);else throw new Error(`unsupported mint argument: ${o}`);return r}async function Ei(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=NI.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 vh(e={}){let t=Date.now();try{let n=await Ei({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 ic(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 Ei({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 Pr({address:n,chainId:r},t),u=null;if(e.simulate!==!1&&(u=await Cr({chainId:r,tx:{from:o,to:n,data:kh(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 Si({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=kh(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=xi({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 LI=1440*60*1e3;function MI(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>LI&&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 Ah(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(!on(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=MI(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 Ih(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 BI="https://api.paraswap.io",sc=(e={})=>(e.baseUrl||process.env.PARASWAP_API_URL||BI).replace(/\/$/,"");function Tn(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 ac(e={},t={}){let n=Number(e.chainId||1);return y(`${sc(t)}/tokens/${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function gt(e={},t={}){let n=Number(e.chainId||e.network||1);if(e.amount==null)throw new Error("amount required");let r=new URLSearchParams({srcToken:Tn(e.srcToken,"srcToken"),destToken:Tn(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 Co({wallet:e.userAddress||e.fromAddress,env:t.env,action:e.feeAction||"swap",holderCheck:t.holderCheck});for(let[a,c]of Object.entries(Od(o)))r.set(a,c);let i=await y(`${sc(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 _h(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=Tn(e.userAddress,"userAddress"),o=await gt(e,t),i=o?.priceRoute,s=String(i?.contractAddress||"").toLowerCase();if(!s)throw new Error("paraswap: price route missing contractAddress");let a={srcToken:Tn(e.srcToken,"srcToken"),destToken:Tn(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=Tn(e.receiver,"receiver"));let c=await y(`${sc(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 Ph(e={}){let t=await ac({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 FI}from"node:crypto";import{getAddress as $h,isAddress as cc}from"ethers";var Ch="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",qI=Object.freeze(["lifi","paraswap","0x","cow","uniswap-v3"]),HI=Object.freeze(["lifi"]),Th=/^0x[0-9a-fA-F]{64}$/,jI=/^\d+$/;function Q(e,t="invalid"){throw new Error(`rfq: ${e} ${t}`)}function Nh(e,t){let n=Number(e);return(!Number.isSafeInteger(n)||n<=0)&&Q(t,"must be a positive chainId"),n}function ki(e,t){let n=String(e??"").trim();return(!jI.test(n)||BigInt(n)<=0n)&&Q(t,"must be a positive integer string"),n}function VI(e,t){return e==null||e===""?null:ki(e,t)}function Oh(e,t){let n=String(e??"").trim();return n.toLowerCase()===Ch.toLowerCase()?Ch:(cc(n)||Q(t,"must be an EVM address or native token sentinel"),$h(n))}function Lh(e,t){let n=String(e??"").trim();return cc(n)||Q(t,"must be an EVM address"),$h(n)}function zI(e,t){return e==null||e===""?null:Lh(e,t)}function Rh(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 WI(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 Nn(e){if(Array.isArray(e))return e.map(Nn);if(e&&typeof e=="object"){let t={};for(let n of Object.keys(e).sort())e[n]!==void 0&&(t[n]=Nn(e[n]));return t}return e}function GI(e){return JSON.stringify(Nn(e))}function vi(e){return`0x${FI("sha256").update(GI(e)).digest("hex")}`}function Mh(e,t){let n={...e};for(let r of t)delete n[r];return n}function Uh(e){return vi(Mh(e,["intentHash"]))}function Bh(e){return vi(Mh(e,["firmQuoteHash"]))}function Ai(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=Nh(e.fromChainId??e.fromChain,"fromChainId"),i=Nh(e.toChainId??e.toChain,"toChainId"),a=o===i?qI:HI,c={kind:"rfq-intent",version:1,fromChainId:o,toChainId:i,sellToken:Oh(e.sellToken??e.tokenIn??e.fromToken,"sellToken"),buyToken:Oh(e.buyToken??e.tokenOut??e.toToken,"buyToken"),sellAmount:ki(e.sellAmount??e.amountIn??e.fromAmount,"sellAmount"),receiver:Lh(e.receiver??e.recipient??e.to,"receiver"),deadlineMs:WI(e.deadlineMs??e.deadline??e.expiresAtMs,{nowMs:n,maxDeadlineMs:r},"deadline"),minBuyAmount:VI(e.minBuyAmount??e.minOut??e.amountOutMin,"minBuyAmount"),allowedSources:Rh(e.allowedSources,"allowedSources",a),allowedRouters:Rh(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)?Nn(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):vi({seed:"rfq-intent",intent:c}).slice(0,34),c.intentHash=Uh(c),Object.freeze(c)}function KI(e){return(!e||typeof e!="object"||Array.isArray(e))&&Q("artifact","required"),e.typedDataHash!=null&&!Th.test(String(e.typedDataHash))&&Q("artifact.typedDataHash","must be bytes32"),e.calldataHash!=null&&!Th.test(String(e.calldataHash))&&Q("artifact.calldataHash","must be bytes32"),e.to!=null&&!cc(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"),Nn(e)}function lc(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=ki(t.amountOut??t.buyAmount,"amountOut"),a=ki(t.minBuyAmount??t.minOut??s,"minBuyAmount");BigInt(a)>BigInt(s)&&Q("minBuyAmount","exceeds amountOut");let c=KI(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=zI(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)?Nn(t.metadata):{}};return d.quoteId||(d.quoteId=vi({seed:"rfq-quote",out:d}).slice(0,34)),d.firmQuoteHash=Bh(d),Object.freeze(d)}function Tr(e,t){return Array.isArray(e?.allowedSources)&&e.allowedSources.includes(t)}function Dh(e,t){return String(e?.[t]??"").trim()}function Nr(e,t){return Object.freeze({source:e,run:t})}function Fh(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 Tr(e,"lifi")&&s.push(Nr("lifi",async()=>{let c=await(r.lifiQuote??ct)({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 YI(t,c.transactionRequest.data):void 0,route:c},metadata:{tool:c?.tool??c?.toolDetails?.name??null}}})),i&&(Tr(e,"paraswap")&&s.push(Nr("paraswap",async()=>{let c=await(r.paraswapPrice??gt)({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}}})),Tr(e,"0x")&&(Dh(n,"ZEROX_API_KEY")||Dh(n,"0X_API_KEY")||r.zeroxQuote)&&s.push(Nr("0x",async()=>{let c=await(r.zeroxQuote??Nt)({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}}})),Tr(e,"cow")&&s.push(Nr("cow",async()=>{let c=await(r.cowQuote??ut)({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}}})),Tr(e,"uniswap-v3")&&o[Number(e.fromChainId)]&&s.push(Nr("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 YI(e,t){return`0x${(await import("node:crypto")).createHash("sha256").update(String(t)).digest("hex")}`}async function XI(e,t){return Promise.race([Promise.resolve().then(e.run),new Promise((n,r)=>setTimeout(()=>r(new Error(`${e.source}: timeout`)),t))])}async function qh(e,t,n={}){let r=Number(n.timeoutMs??12e3),o=await Promise.allSettled(t.map(a=>XI(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(lc(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 Hh(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 uc(e,t={}){let n=Fh(e,t),{quotes:r,failed:o}=await qh(e,n,t),i=Hh(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 jh(e={},t={}){return Ai(e,t)}async function Vh(e={},t={}){let n=e.intent?.kind==="rfq-intent"?e.intent:Ai(e,t);return uc(n,t)}async function zh(){return{ok:!0,provider:"rfq",mode:"intent-rfq",execution:"prepare"}}N();var JI="https://app.across.to";function dc(e={}){return(e.baseUrl||process.env.ACROSS_API_URL||JI).replace(/\/$/,"")}async function Wh(e={}){try{let t=await y(`${dc(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 Gh(e={},t={}){let n=String(e.l1Token||"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2");return y(`${dc(t)}/api/pools?token=${encodeURIComponent(n)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function Kh(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(`${dc(t)}/api/suggested-fees?${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}N();var e_="https://api.beefy.finance";function pc(e={}){return(e.baseUrl||process.env.BEEFY_API_URL||e_).replace(/\/$/,"")}async function Yh(e={}){try{let t=await y(`${pc(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 Xh(e={},t={}){let n=await y(`${pc(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 Qh(e={}){return y(`${pc(e)}/apy/breakdown`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??25e3})}N();var n_="https://public-api.birdeye.so";function Jh(e={}){return(e.baseUrl||process.env.BIRDEYE_API_URL||n_).replace(/\/$/,"")}async function Zh(e={}){try{let t=await y(`${Jh(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 e0(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(`${Jh(t)}/public/tokenlist?sort_by=${encodeURIComponent(n)}&sort_type=${encodeURIComponent(r)}&offset=${o}&limit=${i}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}N();var o_="https://api.celenium.io";function mc(e={}){return(e.baseUrl||process.env.CELENIUM_API_URL||o_).replace(/\/$/,"")}async function t0(e={}){try{let t=await y(`${mc(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 n0(e={}){return y(`${mc(e)}/v1/stats`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??15e3})}async function r0(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(`${mc(t)}${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}N();var s_="https://api.mainnet-beta.solana.com";function a_(e={}){return(e.rpcUrl||process.env.SOLANA_RPC_URL||s_).replace(/\/$/,"")}async function Ii(e,t,n={}){let r=a_(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 o0(e={}){try{let t=await Ii("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 i0(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 Ii("getAssetsByOwner",{ownerAddress:n,page:r,limit:o,...e.sortBy?{sortBy:{sortBy:e.sortBy,sortDirection:e.sortDirection||"asc"}}:{}},t)}async function s0(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)),Ii("searchAssets",o,t)}async function a0(e={},t={}){let n=String(e.assetId||"").trim();if(!n)throw new Error("das-assets: assetId is required");return Ii("getAssetProof",{id:n},t)}N();var l_="https://api.l2beat.com";function fc(e={}){return(e.baseUrl||process.env.L2BEAT_API_URL||l_).replace(/\/$/,"")}async function c0(e={}){try{let t=await y(`${fc(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 l0(e={},t={}){let n=await y(`${fc(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 u0(e={},t={}){return y(`${fc(t)}/api/scaling/activity`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}N();var d_="https://api.spark.fi";function hc(e={}){return(e.baseUrl||process.env.SPARK_API_URL||d_).replace(/\/$/,"")}async function d0(e={}){try{return{ok:(await y(`${hc(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 p0(e={},t={}){let n=String(e.protocol||"spark"),r=String(e.chain||"mainnet"),o=e.token?String(e.token).toLowerCase():null;return o?y(`${hc(t)}/v1/savings/${encodeURIComponent(n)}/${encodeURIComponent(r)}/${encodeURIComponent(o)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}):y(`${hc(t)}/v1/savings/${encodeURIComponent(n)}/${encodeURIComponent(r)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}N();var m_="https://api.symbiotic.fi";function gc(e={}){return(e.baseUrl||process.env.SYMBIOTIC_API_URL||m_).replace(/\/$/,"")}async function m0(e={}){try{let t=await y(`${gc(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 f0(e={},t={}){let n=Math.min(200,Math.max(1,Number(e.limit||50))),r=await y(`${gc(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 h0(e={},t={}){let n=String(e.address||"").trim();if(!n)throw new Error("symbiotic-restaking: address is required");return y(`${gc(t)}/v1/vaults/${encodeURIComponent(n)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}N();var h_="https://staking-api.polygon.technology/api/v2",g_=18,y_=200,b_=50,w_=new Set(["id","totalStaked","selfStake","delegatedStake","commissionPercent","uptimePercent","performanceIndex"]);function bc(e={}){return String(e.baseUrl||process.env.POLYGON_STAKING_API_URL||h_).replace(/\/$/,"")}function x_(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 S_(e,t=b_){let n=Number(e??t);return Number.isFinite(n)?Math.min(y_,Math.max(1,Math.trunc(n))):t}function yc(e){let t=Number(e);return Number.isFinite(t)?t/10**g_:null}async function wc(e,t={}){let n=await y(`${bc(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 g0(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:yc(e.totalStaked),selfStakePolApprox:yc(e.selfStake),delegatedStakePolApprox:yc(e.delegatedStake),stakePrecision:"approximate \u2014 upstream serves wei-scale as float64"}}async function y0(e={},t={}){let n=await wc("/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=w_.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=S_(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(g0)}}async function b0(e={},t={}){let n=x_(e.id??e.validatorId,"id"),o=(await wc(`/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:{...g0(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 w0(e={}){try{let t=await wc("/validators",{...e,timeoutMs:e.timeoutMs??1e4}),n=Array.isArray(t?.result)?t.result:[];return{ok:n.length>0,provider:"polygon-staking",chainId:137,baseUrl:bc(e),validatorTotal:t?.summary?.total??n.length,exec:!1}}catch(t){return{ok:!1,provider:"polygon-staking",chainId:137,baseUrl:bc(e),error:String(t?.message||t),exec:!1}}}N();var k_="https://api.v3.aave.com/graphql",uM=Object.freeze([1,10,56,100,137,146,232,324,1088,1868,5e3,42161,42220,43114,57073,59144,534352]),v_=(e={})=>e.baseUrl||process.env.AAVE_V3_API_URL||k_;async function _i(e,t,n={}){let r=await y(v_(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 A_=`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=vv(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:ii,firmAudit:!1}}function Qm(e,t={}){let n=Da(e,t),r=Xm(),o=n.path,i=En(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=$e(o,"out",`${s}.sol`,`${s}.json`);if(!Mt(a))throw new Error(`protocol-templates: artifact missing at ${a}`);let c=JSON.parse(oi(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 Iv=new Set(["status","chainId","forkBlockNumber","gasUsed","transactionHash","contractAddress","revertReason"]);function _v(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(!Iv.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 Zm(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=Wm(n,o),s=Qm(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 Av(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}:{..._v(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:Jm(a),authorityReport:Gm(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:Jm(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:ii},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 Cv="https://api.geckoterminal.com/api/v2",ai=(e={})=>(e.baseUrl||process.env.GECKOTERMINAL_API_URL||Cv).replace(/\/$/,""),vn=e=>encodeURIComponent(String(e));async function Fa(e={},t={}){let n=Math.max(1,Number(e.page||1));return y(`${ai(t)}/networks?page=${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function ef(e={},t={}){if(!e.network||!e.poolAddress)throw new Error("network and poolAddress required");return y(`${ai(t)}/networks/${vn(e.network)}/pools/${vn(e.poolAddress)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function tf(e={},t={}){if(!e.network||!(e.address||e.tokenAddress))throw new Error("network and token address required");return y(`${ai(t)}/networks/${vn(e.network)}/tokens/${vn(e.address||e.tokenAddress)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function nf(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(`${ai(t)}/networks/${vn(e.network)}/pools/${vn(e.poolAddress)}/ohlcv/${n}?${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function rf(e={}){let t=await Fa({page:1},e);return{ok:Array.isArray(t?.data)&&t.data.length>0,networkSample:t?.data?.length||0}}N();import{Interface as cf,getAddress as lf,isAddress as Nv}from"ethers";me();W();var Ov="https://api.curve.finance/v1",uf=(e={})=>(e.baseUrl||process.env.CURVE_API_URL||Ov).replace(/\/$/,""),Rv=Object.freeze({1:"0x45312ea0eFf7E09C83CBE249fa1d7598c4C8cd4e",10:"0x0DCDED3545D565bA3B19E683431381007245d983",56:"0xA72C85C258A81761433B4e8da60505Fe3Dd551CC",137:"0x0DCDED3545D565bA3B19E683431381007245d983",988:"0xFF5Cb29241F002fFeD2eAa224e3e996D24A6E8d1",999:"0xd2002373543Ce3527023C75e7518C274A51ce712",4663:"0xFF5Cb29241F002fFeD2eAa224e3e996D24A6E8d1",8453:"0x4f37A9d177470499A2dD084621020b023fcffc1F",42161:"0x2191718CD32d02B8E60BAdFFeA33E4B5DD9A0A0D",43114:"0x0DCDED3545D565bA3B19E683431381007245d983"}),df="0x0000000000000000000000000000000000000000",qa=new cf(["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)"]),of=new cf(["function coins(uint256) view returns (address)"]);function pf(e){let t=Rv[Number(e)];if(!t)throw new Error(`curve-router-ng: unsupported chainId ${e}`);return t}function Ar(e,t){if(!Nv(e))throw new Error(`${t} must be a valid EVM address`);return lf(e)}function $v(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 sf(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 mf(e,t,n){return[e,t,n,...Array(8).fill(df)]}function ff(e,t,n,r){return[[BigInt(e),BigInt(t),1n,BigInt(n),BigInt(r)],...Array.from({length:4},()=>[0n,0n,0n,0n,0n])]}function hf(e){return[e,...Array(4).fill(df)]}async function Lv({chainId:e,pool:t,nCoins:n,rpcCall:r,opts:o}){let i=[];for(let s=0;s<n;s++){let a=of.encodeFunctionData("coins",[s]),c=await r(e,"eth_call",[{to:t,data:a},o.blockTag||"latest"],o),l=of.decodeFunctionResult("coins",c);i.push(lf(l[0]))}return i}function af(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 gf(e={}){return y(`${uf(e)}/openapi.json`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs})}async function Ha(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(`${uf(t)}/getPools/${n}/${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function yf(e={}){let t=await Ha({chain:"ethereum",registry:"main"},e),n=t?.data?.poolData?.length||0;return{ok:t?.success===!0&&n>0,poolSample:n}}async function ja(e={},t={}){let n=Number(e.chainId??8453),r=pf(n),o=Ar(e.pool,"curve pool"),i=Ar(e.tokenIn,"curve tokenIn"),s=Ar(e.tokenOut,"curve tokenOut"),a=$v(e.amountIn,"curve amountIn"),c=sf(e.nCoins??2,"curve nCoins",2,8),l=sf(e.poolType,"curve poolType",1,4),u=t.rpcCall||L,d=await Lv({chainId:n,pool:o,nCoins:c,rpcCall:u,opts:t}),p=af(d,i,"tokenIn"),m=af(d,s,"tokenOut");if(p===m)throw new Error("Curve token indexes must differ");let f=mf(i,o,s),h=ff(p,m,l,c),g=hf(o),b=qa.encodeFunctionData("get_dy",[f,h,a,g]),k=await u(n,"eth_call",[{to:r,data:b},e.blockTag||"latest"],t),x=qa.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 bf(e={},t={}){let n=Number(e.chainId??8453),r=pf(n),o=Ar(e.sender||e.from||e.fromAddress||e.receiver,"curve sender"),i=Ar(e.receiver||e.recipient||o,"curve receiver"),s=await ja({...e,sender:o},t),a=mf(s.tokenIn,s.pool,s.tokenOut),c=ff(s.i,s.j,s.poolType,s.nCoins),l=hf(s.pool),u=qa.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 Va,getAddress as Af,isAddress as Uv}from"ethers";W();var wf=Object.freeze({42161:"https://arbitrum-api.gmxinfra.io",43114:"https://avalanche-api.gmxinfra.io"}),xf=Object.freeze({42161:{name:"arbitrum",api:wf[42161],exchangeRouter:"0x1C3fa76e6E1088bCE750f23a5BFcffa1efEF6A41",router:"0x7452c558d45f8afC8c83dAe62C3f8A5BE19c71f6",orderVault:"0x31eF83a530Fde1B38EE9A18093A333D8Bbbc40D5",dataStore:"0xFD70de6b91282D8017aA4E741e9Ae325CAb992d8",reader:"0x470fbC46bcC0f16532691Df360A07d8Bf5ee0789",eventEmitter:"0xC8ee91A54287DB53897056e12D9819156D3822Fb",wnt:"0x82aF49447D8a07e3bd95BD0d56f35241523fBab1",usdc:"0xaf88d065e77c8cC2239327C5EDb3A432268e5831"},43114:{name:"avalanche",api:wf[43114],exchangeRouter:"0x8f550E53DFe96C055D5Bdb267c21F268fCAF63B2",router:"0x820F5FfC5b525cD4d88Cd91aCf2c28F16530Cc68",orderVault:"0xD3D60D22d415aD43b7e64b510D86A30f19B1B12C",dataStore:"0x2F0b22339414ADeD7D5F06f9D604c7fF5b2fe3f6",reader:"0x62Cb8740E6986B29dC671B2EB596676f60590A5B",eventEmitter:"0xDb17B211c34240B014ab6d61d4A31FA0C0e20c26",wnt:"0xB31f66AA3C1e785363F0875A1B74E27b85FD66c7",usdc:"0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E"}}),Sf="0x0000000000000000000000000000000000000000",Bv=`0x${"0".repeat(64)}`,kf=Object.freeze({marketSwap:0,limitSwap:1,marketIncrease:2,limitIncrease:3,marketDecrease:4,limitDecrease:5,stopLossDecrease:6,stopIncrease:8}),Ef=Object.freeze({noSwap:0,swapPnlTokenToCollateralToken:1,swapCollateralTokenToPnlToken:2}),ci=new Va(["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"]),If=new Va(["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)"]),Dv=new Va(["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)"]),Fv=Object.freeze({OrderCreated:"created",OrderUpdated:"updated",OrderExecuted:"executed",OrderCancelled:"cancelled",OrderFrozen:"frozen"});function In(e){let t=Number(e??42161),n=xf[t];if(!n)throw new Error(`gmx: unsupported chainId ${e} (supported: ${Object.keys(xf).join(", ")})`);return{chainId:t,...n}}function li(e,t={}){let n=In(e);return(t.baseUrl||n.api).replace(/\/$/,"")}function ve(e,t){if(!Uv(e))throw new Error(`${t} must be a valid EVM address`);return Af(e)}function H(e){return Af(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 qv(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 Hv(e){let t=String(e||"marketIncrease").trim();if(!(t in kf))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:kf[t]}}function jv(e){let t=String(e||"noSwap").trim();if(!(t in Ef))throw new Error(`gmx unsupported decreasePositionSwapType ${t}`);return{key:t,code:Ef[t]}}function Vv(e,t){return Array.isArray(e)?e:Array.isArray(e?.[t])?e[t]:[]}function zv(e,t){let n=H(t);return e.find(r=>H(r.marketToken||r.market||r.address)===n)||null}function Wv(e,t){let n=H(t);return e.find(r=>H(r.tokenAddress||r.address)===n)||null}function Gv({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 Kv(e,t){let n=t?e.availableLiquidityLong:e.availableLiquidityShort;try{return BigInt(String(n??"0"))}catch{return 0n}}function Yv(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 Xv(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 Qv(e={},t){if(H(e.address)!==H(t.eventEmitter))return null;let n;try{n=Dv.parseLog({topics:e.topics,data:e.data})}catch{return null}let r=String(n?.args?.eventName||""),o=Fv[r];if(!o)return null;let i=Xv(n.args.eventData||{}),s=(i.key||String(n.args.topic1||"")).toLowerCase(),a=i.account||Yv(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 vf(e){return{executed:5,cancelled:4,frozen:3,created:2,updated:1}[e]||0}function Jv(e=[],{chainId:t}={}){let n=In(t);return(Array.isArray(e)?e:[]).map(r=>Qv(r,n)).filter(Boolean).sort((r,o)=>(r.logIndex??0)-(o.logIndex??0))}async function _f(e={},t={}){return y(`${li(e.chainId??42161,t)}/markets`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function za(e={},t={}){return y(`${li(e.chainId??42161,t)}/markets/info`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function Pf(e={},t={}){return y(`${li(e.chainId??42161,t)}/tokens`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function ui(e={},t={}){return y(`${li(e.chainId??42161,t)}/prices/tickers`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function Cf(e={}){let t=await ui({chainId:42161},e);return{ok:Array.isArray(t)&&t.length>0,tickerSample:Array.isArray(t)?t.length:0}}async function Tf(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=If.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 Nf(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=If.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 Of(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=Jv(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)=>vf(d.status)>=vf(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 Rf(e={},t={}){let n=In(e.chainId??42161),r=Hv(e.orderType||e.type),o=jv(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"):Sf,l=e.uiFeeReceiver?ve(e.uiFeeReceiver,"gmx uiFeeReceiver"):Sf,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=qv(e.maxSlippageBps??e.slippageBps,50),k=e.isLong==null?!0:!!e.isLong,[x,w]=await Promise.all([za({chainId:n.chainId},t),ui({chainId:n.chainId},t)]),v=zv(Vv(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=Kv(v,k);if(E>0n&&m>E)throw new Error("gmx sizeDeltaUsd exceeds available market liquidity");let q=Wv(w,T);if(!q)throw new Error("gmx index ticker not found");let ge=e.acceptablePrice?An(e.acceptablePrice,"gmx acceptablePrice").toString():Gv({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||Bv);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 hs={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(ci.encodeFunctionData("sendTokens",[d,n.orderVault,p])),C.push(ci.encodeFunctionData("sendWnt",[n.orderVault,f])),C.push(ci.encodeFunctionData("createOrder",[hs]));let $=ci.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 eA,getAddress as tA,isAddress as nA,keccak256 as $f,toUtf8Bytes as Lf}from"ethers";W();var rA="https://api.morpho.org/graphql",di=new eA(["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)"]),oA=(e={})=>e.baseUrl||process.env.MORPHO_API_URL||rA;async function Ga(e,t,n={}){return y(oA(n),{method:"POST",body:{query:e,variables:t},fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs??2e4})}var iA="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 } } } }",sA="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(!nA(n))throw new Error(`morpho: ${t} must be an address`);return tA(n).toLowerCase()}function aA(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 Wa(e){return Array.isArray(e)?`[${e.map(Wa).join(",")}]`:e&&typeof e=="object"?`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${Wa(e[t])}`).join(",")}}`:JSON.stringify(e)}async function _r(e,t,n,r,o={}){let i=di.encodeFunctionData(n,r),a=await(o.rpcCall||L)(Number(e),"eth_call",[{to:t,data:i},"latest"],o);return di.decodeFunctionResult(n,a)}function cA(e,t){let n=t.toLowerCase();return(e||[]).find(r=>String(r?.address||"").toLowerCase()===n)||null}async function Mf(e={},t={}){let n=Math.min(100,Math.max(1,Number(e.first||20))),r=(e.chainIds||[e.chainId||1]).map(Number);return Ga(iA,{first:n,chainIds:r,where:{chainId_in:r}},t)}async function Ka(e={},t={}){let n=Math.min(100,Math.max(1,Number(e.first||20))),r=(e.chainIds||[e.chainId||1]).map(Number);return Ga(sA,{first:n,chainIds:r,where:{chainId_in:r}},t)}async function Uf(e={}){return{ok:(await Ga("query { __typename }",{},e))?.data?.__typename==="Query"}}async function Bf(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=aA(e.amount||e.assets,"amount"),c=Number(e.minTotalAssetsUsd??1e5),l=await Ka({chainId:n,first:100},t),u=cA(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=di.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=di.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:$f(Lf(h)),issuedAtMs:Date.now(),expiresAtMs:Date.now()+2e4};return b.guardHash=$f(Lf(Wa(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 uA,getAddress as Ya,isAddress as dA}from"ethers";me();W();var pA="https://api-v3.balancer.fi/",mA=(e={})=>e.baseUrl||process.env.BALANCER_API_URL||pA;async function qf(e,t,n={}){return y(mA(n),{method:"POST",body:{query:e,variables:t},fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs??2e4})}var fA="query Pools($first: Int, $where: GqlPoolFilter) { poolGetPools(first: $first, where: $where) { id address chain type protocolVersion dynamicData { totalLiquidity volume24h fees24h } } }",Df=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"}}),hA="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",gA="0x0000000000000000000000000000000000000000",Xa=new uA(["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 Hf(e){let t=Number(e??8453),n=Df[t];if(!n)throw new Error(`balancer-v3: unsupported chainId ${e} (supported: ${Object.keys(Df).join(", ")})`);return{chainId:t,...n}}function jf(e){let t=String(e||"").toLowerCase();return!t||t==="eth"||t==="native"||t===gA||t===hA.toLowerCase()}function pi(e,t){if(!dA(e))throw new Error(`${t} must be a valid EVM address`);return Ya(e)}function Ff(e,t,n){let r=String(e||"");return jf(r)||/^weth$/i.test(r)?Ya(t.weth):/^usdc$/i.test(r)?Ya(t.usdc):pi(r,n)}function yA(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 Vf(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 zf(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 qf(fA,{first:n,chains:r,where:{chainIn:r}},t)}async function Wf(e={}){return{ok:(await qf("query { __typename }",{},e))?.data?.__typename==="Query"}}async function Qa(e={},t={}){let n=Hf(e.chainId),r=pi(e.pool,"balancer pool"),o=e.tokenIn||"WETH",i=Ff(o,n,"balancer tokenIn"),s=Ff(e.tokenOut||"USDC",n,"balancer tokenOut"),a=yA(e.amountIn,"balancer amountIn"),c=pi(e.sender||e.from||e.fromAddress||e.recipient,"balancer sender"),l=Xa.encodeFunctionData("querySwapSingleTokenExactIn",[r,i,s,a,c,Vf(e.userData)]),d=await(t.rpcCall||L)(n.chainId,"eth_call",[{to:n.router,data:l},e.blockTag||"latest"],t),p=Xa.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 Gf(e={},t={}){let n=Hf(e.chainId),r=pi(e.sender||e.from||e.fromAddress||e.recipient,"balancer sender"),o=e.tokenIn||"WETH",i=jf(o),s=await Qa({...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=Xa.encodeFunctionData("swapSingleTokenExactIn",[s.pool,s.tokenIn,s.tokenOut,BigInt(s.amountIn),BigInt(s.amountOutMinimum),l,u,Vf(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 wA}from"ethers";var xA="https://api-v2.pendle.finance/core",SA=Object.freeze({42161:"0x888888888889758F76e7103c6CbF23ABbF58F946",8453:"0x888888888889758F76e7103c6CbF23ABbF58F946"}),kA="0x0000000000000000000000000000000000000000",EA="0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee",Kf=(e={})=>(e.baseUrl||process.env.PENDLE_API_URL||xA).replace(/\/$/,"");function mi(e,t){try{return wA(e)}catch{throw new Error(`${t} must be a valid EVM address`)}}function _n(e,t){return mi(e,t).toLowerCase()}function vA(e){let t=String(e||"").toLowerCase();return t==="native"||t==="eth"||t===EA||t===kA}function Ja(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 AA(e){if(!Array.isArray(e)||e.length===0)throw new Error("pendle convert requires inputs[]");return e.map((t,n)=>({token:mi(t.token,`pendle input ${n} token`),amount:Ja(t.amount,`pendle input ${n} amount`)}))}function IA(e){if(!Array.isArray(e)||e.length===0)throw new Error("pendle convert requires outputs[]");return e.map((t,n)=>mi(t,`pendle output ${n} token`))}function _A(e){let t=SA[Number(e)];if(!t)throw new Error(`Pendle prepare not enabled for chainId ${e}`);return t}function PA(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 Ja(t,"pendle output amount")}function CA(e,t){let n=(Array.isArray(e)?e:[]).filter(r=>r?.token&&r?.amount&&!vA(r.token)).map(r=>({token:_n(r.token,"pendle approval token"),spender:_n(t,"pendle approval spender"),amount:Ja(r.amount,"pendle approval amount")}));return n.length?n.length===1?n[0]:n:null}async function Za(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(`${Kf(t)}/v1/${n}/markets?${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function Yf(e={}){let t=await Za({chainId:42161,limit:1},e);return{ok:Array.isArray(t?.results),marketSample:t?.results?.length||0}}async function ec(e={},t={}){let n=Number(e.chainId??42161),r=_A(n),o=e.from||e.fromAddress||e.userAddress||e.taker||e.receiver;if(!o)throw new Error("pendlePrepare requires from/receiver");let i=mi(e.receiver||o,"pendle receiver"),s=AA(e.inputs),a=IA(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(`${Kf(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=PA(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:CA(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 Xf(e={},t={}){let n=await ec(e,t),{transaction:r,...o}=n;return o}N();me();W();import{isAddress as NA}from"ethers";var OA="https://api.odos.xyz",tc=(e={})=>(e.baseUrl||process.env.ODOS_API_URL||OA).replace(/\/$/,"");async function nc(e={}){return y(`${tc(e)}/info/chains`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs})}function RA(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(!NA(String(e.userAddr||"")))throw new Error("odos: valid userAddr required");return t}async function Qf(e={},t={}){let n=RA(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(`${tc(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 Jf(e={},t={}){let{chainId:n,quote:r,amountOut:o}=await Qf(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 Zf(e={},t={}){let{chainId:n,quote:r,amountOut:o}=await Qf(e,t),i=await y(`${tc(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 nc(e);return{ok:Array.isArray(t?.chains)&&t.chains.length>0,chainCount:t?.chains?.length||0}}N();var th=/[\u200B-\u200F\u202A-\u202E\u2060-\u2064\uFEFF]/g,LA=/[<>&`*_~[\]()|\\]/g,MA=/[\u0000-\u001F\u007F]/g;function rc(e,{max:t=32,fallback:n=""}={}){return e==null?n:String(e).normalize("NFKC").replace(th,"").replace(MA,"").replace(LA,"").replace(/\s+/g," ").trim().slice(0,t).trim()||n}function oc(e){if(e==null)return!1;let t=String(e);return th.test(t)?!0:/[\u0400-\u04FF\u0370-\u03FF]/.test(t)&&/[A-Za-z]/.test(t)}var nh=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 fi(e,t={}){let n=Number(e),r=t.baseUrl||nh[n];if(!r)throw new Error(`Blockscout not configured for chainId ${n}`);return r.replace(/\/$/,"")}function rh(e){return!!nh[Number(e)]}async function ic(e={},t={}){return y(`${fi(e.chainId||1,t)}/api/v2/stats`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3})}async function oh(e={},t={}){if(!e.address)throw new Error("address required");return y(`${fi(e.chainId||1,t)}/api/v2/addresses/${encodeURIComponent(e.address)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3})}async function ih(e={},t={}){if(!e.address&&!e.tokenAddress)throw new Error("token address required");return y(`${fi(e.chainId||1,t)}/api/v2/tokens/${encodeURIComponent(e.address||e.tokenAddress)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3})}async function sh(e={},t={}){if(!e.address)throw new Error("address required");let n=Number(e.chainId||1),r=`${fi(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 ah(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=rc(o.symbol||o.name,{max:32,fallback:"TOKEN"}),u=rc(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:oc(o.symbol)||oc(o.name)||void 0})}return n}async function ch(e={}){let t=await ic({chainId:8453},e);return{ok:t?.total_blocks!=null||t?.total_transactions!=null,chainId:8453}}import{getAddress as BA}from"ethers";N();var DA="TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb",uh=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 hi(e,...t){for(let n of t){let r=String(e?.[n]||"").trim();if(r)return r}return null}function lh(e){if(!e)return null;try{return BA(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=lh(n.evm||e.evmAddress||hi(t,"ORACLE_EVM_ADDRESS","ORACLE_DEFAULT_ADDRESS","MAD_OPERATOR_ADDRESS")),o=n.solana||e.solanaAddress||hi(t,"ORACLE_SOLANA_ADDRESS"),i=n.bitcoin||e.bitcoinAddress||hi(t,"ORACLE_BITCOIN_ADDRESS"),s=lh(n.hyperliquid||e.hyperliquidAddress||hi(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 gi(e){return Number.isFinite(e)?Number(e.toFixed(2)):null}function ft(e){let t=Number(e);return Number.isFinite(t)&&t!==0}function dh(e,t){let n=uh[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 FA(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 sc(e,t){return{family:e,status:"unsupported",reason:t}}function ac(e,t){if(!e||e.status!=="ok")return e;let n=dh(t,e.symbol),r=Pn(e.amount),o=r!=null&&n.priceUsd!=null?gi(r*n.priceUsd):null;return{...e,price:n,usdValue:o}}async function ph(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 yi(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(uh))],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&&rh(C)){let Ct=await ne(()=>sh({chainId:C,address:r.evm},{...mt(t,"blockscout"),timeoutMs:t.timeoutMs??18e3}));Ct.ok?ee={status:"ok",assets:ah(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:Ks},C)).then(ee=>({...ee,program:"spl-token"})),ne(()=>lr({owner:r.solana,programId:DA},C)).then(ee=>({...ee,program:"token-2022"}))]):[],X=FA(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:ac(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 ru=`${F}:${String(ie.address).toLowerCase()}`,Gn=I.coins[ru],Kn=Number(Gn?.price);Number.isFinite(Kn)&&Kn>0&&(U=Kn)}let ee=Pn(ie.amount),Ct=ee!=null&&U!=null?gi(ee*U):null;return{...ie,priceUsd:U,usdValue:Ct}});$={...$,fungibleTokens:{...$.fungibleTokens,assets:X}}}return $});g.native&&(g.native=ac(g.native,w)),b.native&&(b.native=ac(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=dh(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?gi(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=[sc("cosmos","requires a chain-specific bech32 address and LCD/RPC adapter"),sc("sui","Sui balance adapter is not installed"),sc("aptos","Aptos balance adapter is not installed")],hs=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:gi(_),label:"known priced value, not a complete portfolio total",pricedItems:E,unpricedNonzeroItems:q,complete:q===0&&!hs&&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 wi}from"node:fs";import{chmod as dI,mkdir as pI,open as mI,readFile as fI}from"node:fs/promises";import{createHash as hI,randomUUID as gI}from"node:crypto";import yI from"node:os";import Tn from"node:path";N();N();var HA=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"]),jA=new Set(["image/jpeg","image/png","image/webp"]);function VA(e){let t=String(e||"").toLowerCase();return HA.some(n=>t===n||t.endsWith(`.${n}`))}function zA(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 mh(e){let t=zA(e),n;try{n=new URL(t)}catch{return null}return n.protocol!=="https:"||n.username||n.password||!VA(n.hostname)?null:n}async function WA(e,t={}){let n=t.fetchImpl||globalThis.fetch;if(typeof n!="function")throw new Error("gallery fetch unavailable");let r=mh(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=mh(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(!jA.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 cc(e){return String(e??"").replaceAll("&","&amp;").replaceAll("<","&lt;").replaceAll(">","&gt;").replaceAll('"',"&quot;").replaceAll("'","&apos;")}function GA(e,t){return e.name||e.collection||e.tokenId||`NFT ${t+1}`}async function fh(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 WA(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=cc(GA(x,T).slice(0,34)),Ce=cc(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 ${cc(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 KA=[/\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],YA=/(https?:\/\/|www\.|[a-z0-9-]+\.(?:com|net|io|xyz|org|app|finance|gift|claims?|site|link|live|vip|top|cc))/i,XA=/(\$\s?\d|\d[\d,.]*\s*(?:usd|usdc|usdt|eth|weth|btc|sol)\b)/i;function QA(e={}){let t=[],n=String(e.name||""),r=String(e.description||""),o=`${n} ${r}`;YA.test(n)&&t.push("url-in-name");let i=KA.filter(l=>l.test(o)).length;i>0&&t.push(`lure-language:${i}`),XA.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 hh(e={}){let t=QA(e);return{...e,spam:e.spam===!0||t.spam,riskLevel:t.risk,riskReasons:t.reasons.length?t.reasons:void 0}}W();var JA=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"}]),ZA=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 eI(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 tI(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 nI(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 bh(e={}){return[e.chain||"unknown",e.contract||"native",e.tokenId||"unknown"].join(":").toLowerCase()}function rI(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 oI(e,t){let n=bh(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 iI(e){let t=new Map;for(let n of e){let r=bh(n);t.has(r)||t.set(r,n)}return[...t.values()]}function sI(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 wh(){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=JA.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=eI(w.data.contents).map(I=>tI(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=>nI(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=rI(e.costBasis),m=iI(a).map(w=>oI(w,p)).map(w=>hh(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:ZA,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:sI(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 gh(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 aI(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 xh(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=gh(e.expiry??e.endTime,"Solana NFT listing expiry");return Go({...e,expiry:r},Dt(t,"magiceden"))}if(n==="satflow"){let r=gh(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:aI(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 lc(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 uc(e){if(e==null||e==="")return null;let t=Number(e);return Number.isFinite(t)&&t>0?t:null}function bi(e){return String(e??"").trim().toLowerCase()}function cI(e={},t,n){let r=Array.isArray(e.traits)?e.traits:[],o=bi(t),i=bi(n);return!o||!i?!1:r.some(s=>bi(s.trait_type??s.traitType??s.type)===o&&bi(s.value??s.trait_value??s.traitValue)===i)}function lI(e={},t){if(!t)return!0;let n=String(e.contract||e.tokenContract||e.assetContract||"").toLowerCase();return!n||n===String(t).toLowerCase()}function yh(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 dc(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 Sh(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=lc(e.maxPriceEth,"maxPriceEth"),a=Number(e.minDiscountBps),c=Number(e.minTraitSales),l=lc(e.minTraitVolumeEth,"minTraitVolumeEth"),u=lc(e.traitFloorEth,"traitFloorEth"),d=uc(e.collectionFloorEth),p=uc(e.maxListingAgeMs),m=uc(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=>cI(I,e.traitType,e.traitValue)&&lI(I,e.contract),h=(Array.isArray(e.sales)?e.sales:[]).filter(f).filter(I=>{if(!m)return!0;let R=yh(I,["timestamp","soldAt","createdAt"]);return R!=null&&i-R<=m}),g=dc(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 _=yh(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:dc(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:dc(v.priceEth),discountBps:v.discountBps},evidence:x,prepareIntent:T}}async function kh(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 Eh(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 fh({...e,items:n},Dt(t,"gallery")),inventorySummary:r?{visibleCount:r.inventory.visibleCount,flaggedCount:r.inventory.flaggedCount,coverage:r.coverage}:null}}var vh=10*1024*1024,_h=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 Ah(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 Ph(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 bI(e={}){return["evm","solana","bitcoin","hyperliquid"].map(t=>`${t}:${String(e[t]||"").trim().toLowerCase()}`).join("|")}function Ch(e={}){return`portfolio_${hI("sha256").update(bI(e)).digest("hex").slice(0,20)}`}function Th(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(yI.homedir(),".hermes");return Tn.join(Tn.resolve(n),"state","oracle","portfolio-history.jsonl")}function wI(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 xI(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 SI(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 kI(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 EI(e,t){let n=Th(t),r=`${JSON.stringify(e)}
14
+ `;if(Buffer.byteLength(r)>32*1024)throw new Error("portfolio history snapshot exceeds 32 KiB");await pI(Tn.dirname(n),{recursive:!0,mode:448});let o=wi.O_APPEND|wi.O_CREAT|wi.O_WRONLY|(wi.O_NOFOLLOW||0),i=await mI(n,o,384);try{await i.writeFile(r,"utf8")}finally{await i.close()}return await dI(n,384),n}async function Nh(e={},t={}){let n=e.includeNfts!==!1,r=t.portfolioBalanceImpl||yi,o=t.nftInventoryImpl||Cn,i=r(e,t),s=n?o({...e,includePnl:!1},t).catch(v=>({status:"unavailable",error:String(v?.message||v).slice(0,300)})):Promise.resolve({status:"not-requested"}),[a,c]=await Promise.all([i,s]),l=wI(a),u=xI(c),d=[l,u].filter(v=>v!=null),p=d.length?Nn(d.reduce((v,T)=>v+T,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||Bt(e,t.env||process.env),b=Ch(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_${gI()}`,portfolioId:b,recordedAt:h,sourceQueriedAt:{balances:a?.queriedAt||null,nfts:c?.generatedAt||null},configuredFamilies:Object.fromEntries(["evm","solana","bitcoin","hyperliquid"].map(v=>[v,!!g?.[v]])),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:SI(a),nfts:{knownUsd:u,visibleItems:Number(c?.inventory?.visibleCount||0),flaggedItems:Number(c?.inventory?.flaggedCount||0)}},coverage:kI(a,c,n),warnings:[...new Set(k)].slice(0,50)};return{provider:"portfolio",operation:"snapshot",readOnly:!0,localObservationRecorded:!0,historyFile:await EI(x,t),snapshot:x,balance:a,nfts:c}}async function vI(e){let t=Th(e);try{let n=await fI(t);if(n.byteLength>vh)throw new Error(`portfolio history exceeds ${vh} bytes`);let r=[],o=0;for(let i of n.toString("utf8").split(`
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 AI(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)?Ch(n):null}async function pc(e={},t={}){let n=Ph(e.limit,100,1,_h,"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=Ah(e.since,"portfolio history since"),i=Ah(e.until,"portfolio history until"),s=AI(e,t),a=await vI(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 Ih(e){return`$${Number(e).toLocaleString("en-US",{minimumFractionDigits:2,maximumFractionDigits:2})}`}function xi(e){return String(e).replaceAll("&","&amp;").replaceAll("<","&lt;").replaceAll(">","&gt;").replaceAll('"',"&quot;").replaceAll("'","&apos;")}function II(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 _I(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">${Ih(I)}</text>`}).join(""),h=e.map((x,w)=>`<circle cx="${d(w)}" cy="${p(x.value)}" r="5" fill="#b8f0ff"><title>${xi(x.recordedAt)}: ${Ih(x.value)}</title></circle>`).join(""),g=xi(e[0].recordedAt.slice(0,10)),b=xi(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 ${xi(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 Oh(e={},t={}){if(e.allPortfolios===!0)throw new Error("portfolio value graph requires one portfolioId or configured public-address portfolio");let n=Ph(e.maxPoints,200,2,500,"portfolio graph maxPoints"),r=await pc({...e,order:"asc",limit:e.limit??_h},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=II(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=_I(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 CI=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"}}),TI=Object.freeze([{label:"eip1967",slot:"0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc"},{label:"zeppelinos",slot:"0x7050c9e0f4ca769c69bd3a8ef740bc37934f8e2c036e5a723fd8ee048ed3f8c3"},{label:"eip1822",slot:"0xc5f16f0fcc639fa48a6947836d9850f504798523bf8c9a3a87d5876cf622bcf7"}]),NI=`0x${"0".repeat(64)}`;function OI(e){return!e||e==="0x"||e===NI}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(CI))c.includes(f)&&a.push({selector:`0x${f}`,...h});let l=!1,u=null,d=null;for(let{label:f,slot:h}of TI)try{let g=await n(o,"eth_getStorageAt",[r,h,"latest"],t);if(!OI(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 Rh(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 $I=/^0x[0-9a-fA-F]{40}$/,$h=4663;function mc(e,t){let n=String(e||"").trim();if(!$I.test(n))throw new Error(`evm-token-sniper: ${t} must be a 0x EVM address`);return n}function LI(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 MI(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=Rs(e);if(!n)throw new Error(`evm-token-sniper: unsupported EVM chainId ${e}`);return n}function UI({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 Lh(e={},t={}){let n=Number(e.chainId??$h);if(!Number.isInteger(n)||n<=0)throw new Error("evm-token-sniper: chainId must be a positive integer");let r=mc(e.tokenAddress||e.address||e.token,"tokenAddress"),o=e.tokenIn?mc(e.tokenIn,"tokenIn"):null,i=e.recipient?mc(e.recipient,"recipient"):null,s=e.amountIn==null?null:LI(e.amountIn,"amountIn"),a=MI(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=UI({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 Mh(){rr();let e=$s();return{ok:e.length>0,provider:"evm-token-sniper",defaultChainId:$h,chainIds:e.map(t=>t.chainId),execution:"prepare-only",signed:!1,broadcast:!1}}var DI=/^(0|[1-9][0-9]*)$/,Si=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(!DI.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 FI(e){let t=Number(e);if(!Number.isSafeInteger(t)||t<=0)throw new Error("chainId must be a positive integer");return t}function qI(e={}){return e.maxFeePerGas!=null?qt(e.maxFeePerGas,"maxFeePerGas"):e.gasPrice!=null?qt(e.gasPrice,"gasPrice"):null}function ki(e={}){try{let t=FI(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=qI(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 HI(e={}){let t=ki(e);if(!t.ok)throw new Si(t);return t}var jI=5,fc=[50,75,90],Uh=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 VI(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 Ei(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=Uh[e.urgency||"fast"];if(!o)return{status:"error",viable:!1,error:`urgency must be one of: ${Object.keys(Uh).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${jI.toString(16)}`,"pending",fc],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=VI(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 ${fc[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:fc[o.percentile],maxFeePerGas:b.toString(),maxPriorityFeePerGas:g.toString(),worstCaseGasWei:x==null?null:x.toString(),clamps:k,notes:h}}var WI="08c379a0",GI="4e487b71",KI=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 YI(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===WI)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===GI){let r=parseInt(t.slice(8,72),16);return{kind:"panic",code:r,reason:KI[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 XI(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 QI(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 JI(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=JI(o),s=[],a=null,c=!1,l=null;try{a=await n(r,"eth_call",[i,"pending"],t)}catch(f){let h=XI(f);if(!QI(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=YI(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 Bh(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 e_=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 t_(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 n_(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 Dh(e,{minter:t,quantity:n}){let r=`0x${e.selector}`;for(let o of e.args)if(o==="to")r+=n_(t);else if(o==="quantity")r+=t_(n);else throw new Error(`unsupported mint argument: ${o}`);return r}async function vi(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=e_.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 Fh(e={}){let t=Date.now();try{let n=await vi({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 hc(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 vi({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:Dh(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 Ei({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=Dh(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=ki({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 o_=1440*60*1e3;function i_(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>o_&&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 qh(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=i_(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 Hh(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 a_="https://api.paraswap.io",gc=(e={})=>(e.baseUrl||process.env.PARASWAP_API_URL||a_).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 yc(e={},t={}){let n=Number(e.chainId||1);return y(`${gc(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(tp(o)))r.set(a,c);let i=await y(`${gc(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 jh(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(`${gc(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 Vh(e={}){let t=await yc({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 l_}from"node:crypto";import{getAddress as Xh,isAddress as bc}from"ethers";var zh="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",u_=Object.freeze(["lifi","paraswap","0x","cow","uniswap-v3"]),d_=Object.freeze(["lifi"]),Wh=/^0x[0-9a-fA-F]{64}$/,p_=/^\d+$/;function Q(e,t="invalid"){throw new Error(`rfq: ${e} ${t}`)}function Gh(e,t){let n=Number(e);return(!Number.isSafeInteger(n)||n<=0)&&Q(t,"must be a positive chainId"),n}function Ai(e,t){let n=String(e??"").trim();return(!p_.test(n)||BigInt(n)<=0n)&&Q(t,"must be a positive integer string"),n}function m_(e,t){return e==null||e===""?null:Ai(e,t)}function Kh(e,t){let n=String(e??"").trim();return n.toLowerCase()===zh.toLowerCase()?zh:(bc(n)||Q(t,"must be an EVM address or native token sentinel"),Xh(n))}function Qh(e,t){let n=String(e??"").trim();return bc(n)||Q(t,"must be an EVM address"),Xh(n)}function f_(e,t){return e==null||e===""?null:Qh(e,t)}function Yh(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 h_(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 g_(e){return JSON.stringify(Rn(e))}function Ii(e){return`0x${l_("sha256").update(g_(e)).digest("hex")}`}function Jh(e,t){let n={...e};for(let r of t)delete n[r];return n}function Zh(e){return Ii(Jh(e,["intentHash"]))}function e0(e){return Ii(Jh(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=Gh(e.fromChainId??e.fromChain,"fromChainId"),i=Gh(e.toChainId??e.toChain,"toChainId"),a=o===i?u_:d_,c={kind:"rfq-intent",version:1,fromChainId:o,toChainId:i,sellToken:Kh(e.sellToken??e.tokenIn??e.fromToken,"sellToken"),buyToken:Kh(e.buyToken??e.tokenOut??e.toToken,"buyToken"),sellAmount:Ai(e.sellAmount??e.amountIn??e.fromAmount,"sellAmount"),receiver:Qh(e.receiver??e.recipient??e.to,"receiver"),deadlineMs:h_(e.deadlineMs??e.deadline??e.expiresAtMs,{nowMs:n,maxDeadlineMs:r},"deadline"),minBuyAmount:m_(e.minBuyAmount??e.minOut??e.amountOutMin,"minBuyAmount"),allowedSources:Yh(e.allowedSources,"allowedSources",a),allowedRouters:Yh(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):Ii({seed:"rfq-intent",intent:c}).slice(0,34),c.intentHash=Zh(c),Object.freeze(c)}function y_(e){return(!e||typeof e!="object"||Array.isArray(e))&&Q("artifact","required"),e.typedDataHash!=null&&!Wh.test(String(e.typedDataHash))&&Q("artifact.typedDataHash","must be bytes32"),e.calldataHash!=null&&!Wh.test(String(e.calldataHash))&&Q("artifact.calldataHash","must be bytes32"),e.to!=null&&!bc(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 wc(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=Ai(t.amountOut??t.buyAmount,"amountOut"),a=Ai(t.minBuyAmount??t.minOut??s,"minBuyAmount");BigInt(a)>BigInt(s)&&Q("minBuyAmount","exceeds amountOut");let c=y_(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=f_(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=Ii({seed:"rfq-quote",out:d}).slice(0,34)),d.firmQuoteHash=e0(d),Object.freeze(d)}function Nr(e,t){return Array.isArray(e?.allowedSources)&&e.allowedSources.includes(t)}function t0(e,t){return String(e?.[t]??"").trim()}function Or(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 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 b_(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")&&(t0(n,"ZEROX_API_KEY")||t0(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 b_(e,t){return`0x${(await import("node:crypto")).createHash("sha256").update(String(t)).digest("hex")}`}async function w_(e,t){return Promise.race([Promise.resolve().then(e.run),new Promise((n,r)=>setTimeout(()=>r(new Error(`${e.source}: timeout`)),t))])}async function r0(e,t,n={}){let r=Number(n.timeoutMs??12e3),o=await Promise.allSettled(t.map(a=>w_(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(wc(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 o0(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 xc(e,t={}){let n=n0(e,t),{quotes:r,failed:o}=await r0(e,n,t),i=o0(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 i0(e={},t={}){return _i(e,t)}async function s0(e={},t={}){let n=e.intent?.kind==="rfq-intent"?e.intent:_i(e,t);return xc(n,t)}async function a0(){return{ok:!0,provider:"rfq",mode:"intent-rfq",execution:"prepare"}}N();var S_="https://app.across.to";function Sc(e={}){return(e.baseUrl||process.env.ACROSS_API_URL||S_).replace(/\/$/,"")}async function c0(e={}){try{let t=await y(`${Sc(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 l0(e={},t={}){let n=String(e.l1Token||"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2");return y(`${Sc(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(`${Sc(t)}/api/suggested-fees?${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}N();var E_="https://api.beefy.finance";function kc(e={}){return(e.baseUrl||process.env.BEEFY_API_URL||E_).replace(/\/$/,"")}async function d0(e={}){try{let t=await y(`${kc(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 p0(e={},t={}){let n=await y(`${kc(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 m0(e={}){return y(`${kc(e)}/apy/breakdown`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??25e3})}N();var A_="https://public-api.birdeye.so";function f0(e={}){return(e.baseUrl||process.env.BIRDEYE_API_URL||A_).replace(/\/$/,"")}async function h0(e={}){try{let t=await y(`${f0(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 g0(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(`${f0(t)}/public/tokenlist?sort_by=${encodeURIComponent(n)}&sort_type=${encodeURIComponent(r)}&offset=${o}&limit=${i}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}N();var __="https://api.celenium.io";function Ec(e={}){return(e.baseUrl||process.env.CELENIUM_API_URL||__).replace(/\/$/,"")}async function y0(e={}){try{let t=await y(`${Ec(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 b0(e={}){return y(`${Ec(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(`${Ec(t)}${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}N();var C_="https://api.mainnet-beta.solana.com";function T_(e={}){return(e.rpcUrl||process.env.SOLANA_RPC_URL||C_).replace(/\/$/,"")}async function Pi(e,t,n={}){let r=T_(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 x0(e={}){try{let t=await Pi("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 S0(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 Pi("getAssetsByOwner",{ownerAddress:n,page:r,limit:o,...e.sortBy?{sortBy:{sortBy:e.sortBy,sortDirection:e.sortDirection||"asc"}}:{}},t)}async function k0(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)),Pi("searchAssets",o,t)}async function E0(e={},t={}){let n=String(e.assetId||"").trim();if(!n)throw new Error("das-assets: assetId is required");return Pi("getAssetProof",{id:n},t)}N();var O_="https://api.l2beat.com";function vc(e={}){return(e.baseUrl||process.env.L2BEAT_API_URL||O_).replace(/\/$/,"")}async function v0(e={}){try{let t=await y(`${vc(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 A0(e={},t={}){let n=await y(`${vc(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 I0(e={},t={}){return y(`${vc(t)}/api/scaling/activity`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}N();var $_="https://api.spark.fi";function Ac(e={}){return(e.baseUrl||process.env.SPARK_API_URL||$_).replace(/\/$/,"")}async function _0(e={}){try{return{ok:(await y(`${Ac(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 P0(e={},t={}){let n=String(e.protocol||"spark"),r=String(e.chain||"mainnet"),o=e.token?String(e.token).toLowerCase():null;return o?y(`${Ac(t)}/v1/savings/${encodeURIComponent(n)}/${encodeURIComponent(r)}/${encodeURIComponent(o)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}):y(`${Ac(t)}/v1/savings/${encodeURIComponent(n)}/${encodeURIComponent(r)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}N();var M_="https://api.symbiotic.fi";function Ic(e={}){return(e.baseUrl||process.env.SYMBIOTIC_API_URL||M_).replace(/\/$/,"")}async function C0(e={}){try{let t=await y(`${Ic(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 T0(e={},t={}){let n=Math.min(200,Math.max(1,Number(e.limit||50))),r=await y(`${Ic(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 N0(e={},t={}){let n=String(e.address||"").trim();if(!n)throw new Error("symbiotic-restaking: address is required");return y(`${Ic(t)}/v1/vaults/${encodeURIComponent(n)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}N();var B_="https://staking-api.polygon.technology/api/v2",D_=18,F_=200,q_=50,H_=new Set(["id","totalStaked","selfStake","delegatedStake","commissionPercent","uptimePercent","performanceIndex"]);function Pc(e={}){return String(e.baseUrl||process.env.POLYGON_STAKING_API_URL||B_).replace(/\/$/,"")}function j_(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 V_(e,t=q_){let n=Number(e??t);return Number.isFinite(n)?Math.min(F_,Math.max(1,Math.trunc(n))):t}function _c(e){let t=Number(e);return Number.isFinite(t)?t/10**D_:null}async function Cc(e,t={}){let n=await y(`${Pc(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 O0(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:_c(e.totalStaked),selfStakePolApprox:_c(e.selfStake),delegatedStakePolApprox:_c(e.delegatedStake),stakePrecision:"approximate \u2014 upstream serves wei-scale as float64"}}async function R0(e={},t={}){let n=await Cc("/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=H_.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=V_(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(O0)}}async function $0(e={},t={}){let n=j_(e.id??e.validatorId,"id"),o=(await Cc(`/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:{...O0(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 L0(e={}){try{let t=await Cc("/validators",{...e,timeoutMs:e.timeoutMs??1e4}),n=Array.isArray(t?.result)?t.result:[];return{ok:n.length>0,provider:"polygon-staking",chainId:137,baseUrl:Pc(e),validatorTotal:t?.summary?.total??n.length,exec:!1}}catch(t){return{ok:!1,provider:"polygon-staking",chainId:137,baseUrl:Pc(e),error:String(t?.message||t),exec:!1}}}N();var W_="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]),G_=(e={})=>e.baseUrl||process.env.AAVE_V3_API_URL||W_;async function Ci(e,t,n={}){let r=await y(G_(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 K_=`query Markets($request: MarketsRequest!) {
16
16
  markets(request: $request) {
17
17
  name
18
18
  address
@@ -20,7 +20,7 @@ ${i.stderr}`.slice(0,1500));let s=n.metadata.contractName;if(t.contractName&&t.c
20
20
  totalMarketSize
21
21
  totalAvailableLiquidity
22
22
  }
23
- }`,I_=`query Market($request: MarketRequest!) {
23
+ }`,Y_=`query Market($request: MarketRequest!) {
24
24
  market(request: $request) {
25
25
  name
26
26
  address
@@ -53,13 +53,13 @@ ${i.stderr}`.slice(0,1500));let s=n.metadata.contractName;if(t.contractName&&t.c
53
53
  }
54
54
  }
55
55
  }
56
- }`,__=`query Chains($filter: ChainsFilter!) {
56
+ }`,X_=`query Chains($filter: ChainsFilter!) {
57
57
  chains(filter: $filter) { chainId name isTestnet explorerUrl }
58
- }`;function P_(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 x0(e={},t={}){let n={chainIds:P_(e)};return e.user&&(n.user=String(e.user)),{markets:(await _i(A_,{request:n},t))?.data?.markets??[]}}async function S0(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 _i(I_,{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 E0(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 _i(__,{filter:r},t))?.data?.chains??[]}}async function k0(e={}){return{ok:(await _i("query { health }",{},e))?.data?.health===!0,provider:"aave-v3"}}N();var T_="https://staking-api.babylonlabs.io";function xc(e={}){return String(e.baseUrl||process.env.BABYLON_STAKING_API_URL||T_).replace(/\/$/,"")}function Pi(e,t={}){return y(`${xc(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3,headers:{Accept:"application/json"}})}function v0(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 A0(e={}){try{let n=(await Pi("/v2/stats",e))?.data||{},r=Number(n.active_tvl??0);return{ok:Number.isFinite(r)&&r>0,provider:"babylon-staking",baseUrl:xc(e),activeTvlSats:String(n.active_tvl??""),activeFinalityProviders:n.active_finality_providers??null,exec:!1}}catch(t){return{ok:!1,provider:"babylon-staking",baseUrl:xc(e),error:String(t?.message||t),exec:!1}}}async function I0(e={},t={}){let r=(await Pi("/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 _0(e={},t={}){let n=await Pi("/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=v0(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 P0(e={},t={}){let n=v0(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 Pi(`/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 O_="https://markets.bisq.network";function Sc(e={}){return String(e.baseUrl||process.env.BISQ_MARKETS_URL||O_).replace(/\/$/,"")}function C0(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 Ci(e,t={}){return y(`${Sc(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function T0(e={}){try{let t=await Ci("/api/markets",e),n=t&&typeof t=="object"?Object.keys(t).length:0;return{ok:n>0,provider:"bisq-markets",baseUrl:Sc(e),marketCount:n,exec:!1}}catch(t){return{ok:!1,provider:"bisq-markets",baseUrl:Sc(e),error:String(t?.message||t),exec:!1}}}async function N0(e={},t={}){let n=await Ci("/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 O0(e={},t={}){let n=C0(e.market||e.pair||"btc_usd","market"),r=await Ci(`/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 R0(e={},t={}){let n=C0(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 Ci(`/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"}}),$_=new Map([["bob",60808],["rootstock",30],["rsk",30]]),L_=60808;function Or(e){if(e==null||e==="")return L_;let t=$_.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 Ec(e,t={}){if(t.baseUrl)return String(t.baseUrl).replace(/\/$/,"");let n=Or(e),r=n===30?process.env.ROOTSTOCK_EXPLORER_URL:process.env.BOB_EXPLORER_URL;return String(r||et[n].url).replace(/\/$/,"")}function $0(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 Ti(e,t,n={}){return y(`${Ec(e,n)}${t.startsWith("/")?t:`/${t}`}`,{fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs??15e3})}async function L0(e={},t={}){let n;try{n=Or(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 Ti(n,"/api/v2/stats",e);return{ok:o?.total_blocks!=null||o?.total_transactions!=null,provider:"bob-rootstock",chainId:n,chain:r.name,baseUrl:Ec(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:Ec(n,e),error:String(o?.message||o),exec:!1}}}async function kc(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 kc({chainId:c},t)}catch(l){return{provider:"bob-rootstock",chainId:c,chain:et[c].name,error:String(l?.message||l)}}}))}}let r=Or(n),o=et[r],i=await Ti(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 M0(e={},t={}){let n=Or(e.chainId??e.chain),r=$0(e.address||e.addr,"address"),o=et[n],i=await Ti(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 U0(e={},t={}){let n=Or(e.chainId??e.chain),r=$0(e.address||e.addr,"address"),o=await Ti(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 U_="https://insights.braiins.com/api/v1.0";function vc(e={}){return String(e.baseUrl||process.env.BRAIINS_INSIGHTS_URL||U_).replace(/\/$/,"")}function Ac(e,t={}){return y(`${vc(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3,headers:{Accept:"application/json"}})}async function B0(e={}){try{let t=await Ac("/price-stats",e),n=Number(t?.price??0);return{ok:Number.isFinite(n)&&n>0,provider:"braiins-insights",baseUrl:vc(e),btcUsd:Number.isFinite(n)?n:null,timestamp:t?.timestamp??null,exec:!1}}catch(t){return{ok:!1,provider:"braiins-insights",baseUrl:vc(e),error:String(t?.message||t),exec:!1}}}async function D0(e={},t={}){let n=await Ac("/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 F0(e={},t={}){let n=await Ac("/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 D_="https://api.cow.fi",q0=Object.freeze({1:"mainnet",100:"xdai",42161:"arbitrum_one",8453:"base",11155111:"sepolia"});function H0(e={}){return(e.baseUrl||process.env.COW_API_URL||D_).replace(/\/$/,"")}function F_(e={}){if(e.network)return String(e.network);let t=Number(e.chainId??1),n=q0[t];if(!n)throw new Error(`cow-protocol: unsupported chainId ${t} (have: ${Object.keys(q0).join(", ")})`);return n}function Ic(e,t,n){return`${H0(n)}/${F_(e)}/api/v1${t}`}function j0(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 V0(e,t=10){return Math.min(1e3,Math.max(1,Number(e.limit??t)))}async function z0(e={},t={}){return y(Ic(e,"/auction",t),{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function W0(e={},t={}){let n=j0(e.owner||e.address||e.user,"owner"),r=new URLSearchParams({limit:String(V0(e))});e.offset!=null&&r.set("offset",String(Math.max(0,Number(e.offset))));let o=await y(`${Ic(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 G0(e={},t={}){let n=new URLSearchParams;e.orderUid?n.set("orderUid",String(e.orderUid)):n.set("owner",j0(e.owner||e.address||e.user,"owner"));let r=await y(`${Ic(e,"/trades",t)}?${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4}),o=Array.isArray(r)?r:[];return{count:o.length,trades:o.slice(0,V0(e))}}async function K0(e={}){let t=await y(`${H0(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 H_="https://api.hiro.so",j_=20;function _c(e={}){return String(e.baseUrl||process.env.HIRO_API_URL||H_).replace(/\/$/,"")}function V_(e={}){let t={Accept:"application/json"},n=e.apiKey||process.env.HIRO_API_KEY;return n&&(t["x-api-key"]=String(n)),t}function Rr(e,t={}){return y(`${_c(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3,headers:V_(t)})}async function Y0(e={}){try{let t=await Rr("/v2/info",e),n=Number(t?.burn_block_height??0);return{ok:Number.isFinite(n)&&n>0,provider:"hiro-stacks",baseUrl:_c(e),burnBlockHeight:t?.burn_block_height??null,stacksTipHeight:t?.stacks_tip_height??null,serverVersion:t?.server_version??null,rateLimitRps:j_,keyed:!!(e.apiKey||process.env.HIRO_API_KEY),exec:!1}}catch(t){return{ok:!1,provider:"hiro-stacks",baseUrl:_c(e),error:String(t?.message||t),exec:!1}}}async function X0(e={},t={}){let n=await Rr("/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 Q0(e={},t={}){let n=await Rr("/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 J0(e={},t={}){let n=Math.min(60,Math.max(1,Number(e.limit||20))),r=Math.max(0,Number(e.offset||0)),o=await Rr(`/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 Z0(e={},t={}){let n=Math.min(30,Math.max(1,Number(e.limit||1))),r=await Rr(`/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 W_="https://bundles.jito.wtf",tg=1e9;function Pc(e={}){return String(e.baseUrl||process.env.JITO_BUNDLES_URL||W_).replace(/\/$/,"")}function G_(e,t,n){let r=Number(e);return Number.isFinite(r)?Math.max(1,Math.min(Math.floor(r),n)):t}function eg(e){let t=Number(e);return Number.isFinite(t)?Math.round(t*tg):null}function K_(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/tg:null,raw:e}}async function ng(e={}){try{let t=await y(`${Pc(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 rg(e={},t={}){let n=G_(e.limit,5,100),r=new URL(`${Pc(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(K_),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 og(e={}){let t=await y(`${Pc(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,eg(i)])),suggestedTipLamports:eg(r.p75||r.p50),raw:n}}N();var X_="https://api.kamino.finance";function Q_(e={}){return String(e.baseUrl||process.env.KAMINO_API_URL||X_).replace(/\/$/,"")}function we(e){let t=Number(e);return Number.isFinite(t)?t:null}function ig(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 Cc(e={},t={}){let n=new URL(`${Q_(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 sg(e={}){try{let t=await Cc({},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 ag(e={},t={}){let r=(await Cc(e,t)).map(ig),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 cg(e={},t={}){let n=String(e.strategy||e.address||"").trim();if(!n)throw new Error("kamino-strategies: strategy address required");let o=(await Cc({...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",...ig(o),raw:o}}N();var Z_="https://blockstream.info/liquid/api",lg="6f0279e9ed041c3d710a9f57d0c02928416460c4b722ae3457a11eec381c526d";function Ni(e={}){return String(e.baseUrl||process.env.LIQUID_ESPLORA_URL||Z_).replace(/\/$/,"")}function e1(e,t="address"){let n=String(e||"").trim(),r=/^(ex1|lq1|el1|tex1|tlq1)[a-z0-9]{20,200}$/i.test(n),o=/^[QVGH][a-km-zA-HJ-NP-Z1-9]{25,110}$/.test(n);if(!r&&!o)throw new Error(`liquid-esplora: ${t} must look like a Liquid address (Q\u2026, VJL\u2026, ex1\u2026, lq1\u2026)`);return n}function t1(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 ug(e,t={}){let n=`${Ni(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 dg(e,t={}){return y(`${Ni(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3})}async function pg(e={}){try{let t=await ug("/blocks/tip/height",e),n=Number(t);return{ok:Number.isFinite(n)&&n>0,provider:"liquid-esplora",baseUrl:Ni(e),tipHeight:n,exec:!1,signing:"user-wallet"}}catch(t){return{ok:!1,provider:"liquid-esplora",baseUrl:Ni(e),error:String(t?.message||t),exec:!1}}}async function mg(e={},t={}){let n=await ug("/blocks/tip/height",t);return{provider:"liquid-esplora",tipHeight:Number(n)}}async function fg(e={},t={}){let n=e1(e.address||e.addr,"address"),r=await dg(`/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 hg(e={},t={}){let n=t1(e.assetId||e.asset||lg,"assetId"),r=await dg(`/asset/${n}`,t),o=r.chain_stats||{};return{provider:"liquid-esplora",assetId:n,isPolicyAsset:n===lg,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 r1="https://api-mainnet.magiceden.dev/v2/ord/btc",o1=600;function Tc(e={}){return String(e.baseUrl||process.env.MAGICEDEN_ORD_API_URL||r1).replace(/\/$/,"")}function i1(e={}){let t={Accept:"application/json"},n=e.apiKey||process.env.MAGICEDEN_API_KEY;return n&&(t.Authorization=`Bearer ${n}`),t}function gg(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 yg(e,t={}){return y(`${Tc(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3,headers:i1(t),retries:t.retries??1})}async function bg(e={}){let t=gg(e.probeCollection||process.env.MAGICEDEN_PROBE_COLLECTION||"nodemonkes");try{let n=await yg(`/stat?collectionSymbol=${encodeURIComponent(t)}`,e);return{ok:n!=null&&typeof n=="object",provider:"magiceden-ordinals",baseUrl:Tc(e),probeCollection:t,rateLimitRpm:o1,exec:!1}}catch(n){let r=n?.status??null;return{ok:!1,provider:"magiceden-ordinals",baseUrl:Tc(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 wg(e={},t={}){let n=gg(e.collectionSymbol||e.symbol||e.collection,"collectionSymbol");try{let r=await yg(`/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 a1="https://mempool.space/api",c1=7;function Nc(e={}){return String(e.baseUrl||process.env.MEMPOOL_API_URL||a1).replace(/\/$/,"")}function Oi(e,t={}){return y(`${Nc(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}function xg(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>c1}}async function Sg(e={}){try{let n=(await Oi("/v1/lightning/statistics/latest",e))?.latest||{},{ageDays:r,stale:o}=xg(n.added);return{ok:Number(n.node_count||0)>0,provider:"mempool-lightning",baseUrl:Nc(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:Nc(e),error:String(t?.message||t),exec:!1}}}async function Eg(e={},t={}){let r=(await Oi("/v1/lightning/statistics/latest",t))?.latest||{},{ageDays:o,stale:i}=xg(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 kg(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 Oi(`/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 vg(e={},t={}){let n=await Oi("/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 u1="https://mempool.space/api",Ag=new Set(["24h","3d","1w","1m","3m","6m","1y","2y","3y","all"]);function Oc(e={}){return String(e.baseUrl||process.env.MEMPOOL_API_URL||u1).replace(/\/$/,"")}function Ig(e,t){let n=String(e||t).trim().toLowerCase();if(!Ag.has(n))throw new Error(`mempool-mining: window must be one of ${[...Ag].join(", ")}`);return n}function $r(e,t={}){return y(`${Oc(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function _g(e={}){try{let t=await $r("/v1/difficulty-adjustment",e);return{ok:Number.isFinite(Number(t?.nextRetargetHeight))&&Number(t.nextRetargetHeight)>0,provider:"mempool-mining",baseUrl:Oc(e),nextRetargetHeight:t?.nextRetargetHeight??null,exec:!1}}catch(t){return{ok:!1,provider:"mempool-mining",baseUrl:Oc(e),error:String(t?.message||t),exec:!1}}}async function Pg(e={},t={}){let n=await $r("/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 Cg(e={},t={}){let n=Ig(e.window||e.timeframe,"1w"),r=await $r(`/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 Tg(e={},t={}){let n=Ig(e.window||e.timeframe,"3d"),r=await $r(`/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 Ng(e={},t={}){let n=Math.min(1e4,Math.max(1,Number(e.blockCount||e.blocks||144))),r=await $r(`/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 p1="https://amm-v2.meteora.ag",Og=new Set(["tvl","volume","fee_tvl_ratio","l_m"]),Rg=new Set(["dynamic","multitoken","lst","farms"]),m1=/^[1-9A-HJ-NP-Za-km-z]{32,44}$/;function f1(e={}){return String(e.baseUrl||process.env.METEORA_API_URL||p1).replace(/\/$/,"")}function le(e){let t=Number(e);return Number.isFinite(t)?t:null}function h1(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 g1(e={},t={}){let n=new URL(`${f1(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(!Og.has(a))throw new Error(`meteora-dlmm: sortKey must be one of ${[...Og].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(!Rg.has(a))throw new Error(`meteora-dlmm: poolType must be one of ${[...Rg].join(", ")}`);n.searchParams.set("pool_type",a)}let i=e.filter??e.query??e.search;i!=null&&String(i).trim()&&n.searchParams.set("filter",String(i).trim());let s=e.mints||e.includeTokenMints;if(s){let a=(Array.isArray(s)?s:[s]).map(c=>String(c).trim());for(let c of a)if(!m1.test(c))throw new Error(`meteora-dlmm: mint ${c} is not a base58 public key`);n.searchParams.set("include_token_mints",a.join(","))}return{url:n,page:r,size:o}}async function Rc(e={},t={}){let{url:n,page:r,size:o}=g1(e,t),i=await y(n.toString(),{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4});return{pools:(Array.isArray(i?.data)?i.data:[]).map(h1),totalCount:i?.total_count??null,page:r,size:o}}async function $g(e={}){try{let{pools:t,totalCount:n}=await Rc({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 Lg(e={},t={}){let n=await Rc({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 Mg(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 Rc({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 b1="https://ordinals.com";function Ri(e={}){return String(e.baseUrl||e.ordinalsBase||process.env.ORDINALS_BASE_URL||b1).replace(/\/$/,"")}function w1(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 Ug(e,t={}){let n=`${Ri(t)}${e.startsWith("/")?e:`/${e}`}`,o=await(t.fetchImpl||fetch)(n,{method:"GET",headers:{accept:"application/json,text/plain;q=0.9,*/*;q=0.8"},signal:AbortSignal.timeout(t.timeoutMs??12e3)}),i=await o.text();if(!o.ok)throw new Error(`ordinals-runes GET ${e}: HTTP ${o.status} ${i.slice(0,160)}`);return i.trim()}function $c(e,t={}){return y(`${Ri(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3,headers:{Accept:"application/json"}})}async function Bg(e={}){try{let t=await Ug("/r/blockheight",e),n=Number(t);return{ok:Number.isFinite(n)&&n>0,provider:"ordinals-runes",baseUrl:Ri(e),blockHeight:n,exec:!1}}catch(t){return{ok:!1,provider:"ordinals-runes",baseUrl:Ri(e),error:String(t?.message||t),exec:!1}}}async function Dg(e={},t={}){let n=await Ug("/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 Fg(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 $c(`/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 qg(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 $c(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 Hg(e={},t={}){let n=w1(e.name||e.rune||e.runeName,"name"),r=await $c(`/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 S1="https://hermes.pyth.network",Mc={"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"},E1=/^[0-9a-fA-F]{64}$/;function jg(e={}){return String(e.baseUrl||process.env.PYTH_HERMES_URL||S1).replace(/\/$/,"")}function Vg(e,t="feedId"){let n=String(e??"").trim();if(!n)throw new Error(`pyth-price-feeds: ${t} required`);let r=Mc[n.toUpperCase()]||Mc[`${n.toUpperCase()}/USD`];if(r)return r;let o=n.startsWith("0x")||n.startsWith("0X")?n.slice(2):n;if(!E1.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 Lc(e={}){let t=Number(e.price),n=Number(e.expo);return!Number.isFinite(t)||!Number.isFinite(n)?null:t*10**n}function Uc(e={}){let t=Lc({price:Number(e.price?.conf),expo:e.price?.expo}),n=Lc(e.price);return{id:e.id||null,price:n,confidence:t,confidenceBps:n&&t!=null?Math.round(t/Math.abs(n)*1e4):null,emaPrice:Lc(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 Bc(e,t={}){let n=new URL(`${jg(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 zg(e={}){try{let t=await Bc([Mc["SOL/USD"]],e),r=(Array.isArray(t?.parsed)?t.parsed.map(Uc):[])[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 Wg(e={},t={}){let n=Vg(e.feedId||e.id||e.symbol,"feedId"),r=await Bc([n],t),o=Array.isArray(r?.parsed)?r.parsed.map(Uc):[],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 Gg(e={},t={}){let n=Array.isArray(e)?e:e.feedIds||e.ids||e.symbols||[],r=[...new Set(n.map(l=>Vg(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 Bc(l,t));let a=s.flatMap(l=>Array.isArray(l?.parsed)?l.parsed.map(Uc):[]),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 Kg(e={},t={}){let n=new URL(`${jg(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 v1="https://relayscan.io",Yg=new Set(["1h","12h","24h","7d"]);function Dc(e={}){return(e.baseUrl||process.env.RELAYSCAN_API_URL||v1).replace(/\/$/,"")}function Xg(e={}){let t=String(e.timespan||e.t||"24h").toLowerCase();if(!Yg.has(t))throw new Error(`relayscan-mev: timespan must be one of ${[...Yg].join(", ")}`);return t}function A1(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 Fc(e={},t={}){return y(`${Dc(t)}/overview/json?t=${Xg(e)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function Qg(e={},t={}){return y(`${Dc(t)}/builder-profit/json?t=${Xg(e)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function Jg(e={},t={}){let n=A1(e);return y(`${Dc(t)}/stats/day/${n}/json`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??25e3})}async function Zg(e={}){let t=await Fc({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 _1="https://extra-api.sanctum.so",P1=30,C1=["jitoSOL","mSOL","bSOL","INF","hSOL","bonkSOL","jupSOL","dSOL"];function qc(e={}){return String(e.baseUrl||process.env.SANCTUM_API_URL||_1).replace(/\/$/,"")}function ey(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 T1(e,t){let n=[];for(let r=0;r<e.length;r+=t)n.push(e.slice(r,r+t));return n}async function qt(e,t,n={}){let r={},o={};for(let i of T1(t,P1)){let s=new URL(`${qc(n)}/v1/${e}`);for(let l of i)s.searchParams.append("lst",l);let a=await y(s.toString(),{fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs??2e4}),c=a?.apys||a?.tvls||a?.solValues||{};Object.assign(r,c),Object.assign(o,a?.errs||{})}return{values:r,errs:o}}async function ty(e={}){try{let[t,n]=await Promise.all([y(`${qc(e)}/v1/lsts`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??15e3}),qt("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 Hc(e={},t={}){let n=await y(`${qc(t)}/v1/lsts`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4}),r=(Array.isArray(n?.lsts)?n.lsts:[]).map(i=>({symbol:i.symbol||null,name:i.name||null,mint:i.mint||null,decimals:i.decimals??null,pool:i.pool?.pool||null,poolProgram:i.pool?.program||null,voteAccount:i.pool?.vote_account||null,logoUri:i.logo_uri||null}));if(e.symbol){let i=String(e.symbol).toLowerCase();r=r.filter(s=>String(s.symbol||"").toLowerCase()===i||s.mint===e.symbol)}let o=Number(e.limit);return Number.isFinite(o)&&o>0&&(r=r.slice(0,o)),{provider:"sanctum-lst",chain:"solana-mainnet-beta",count:r.length,lsts:r}}async function ny(e={},t={}){let n=e.lsts||e.symbols||null;e.all===!0&&(n=(await Hc({},t)).lsts.map(c=>c.symbol).filter(Boolean)),(!Array.isArray(n)||!n.length)&&(n=C1);let r=[...new Set(n.map(a=>ey(a,"lsts[]")))],[o,i]=await Promise.all([qt("apy/latest",r,t),qt("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 ry(e={},t={}){let n=ey(e.lst||e.mint||e.symbol,"lst"),[r,o,i,s]=await Promise.all([qt("apy/latest",[n],t),qt("apy/inception",[n],t),qt("tvl/current",[n],t).catch(()=>({values:{},errs:{}})),qt("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 O1="https://api.save.finance",R1="4UpD2fh7xH3VP9QQaXtsS1YY3bxzWhtfpks7FatyKvdY",oy="CCpirWrgNuBVLdkP2haxLTbD6XqEgaYuVXixbbpxUB6",$1=/^[1-9A-HJ-NP-Za-km-z]{32,44}$/;function jc(e={}){return String(e.baseUrl||process.env.SAVE_API_URL||process.env.SOLEND_API_URL||O1).replace(/\/$/,"")}function iy(e,t="address"){let n=String(e??"").trim();if(!$1.test(n))throw new Error(`solend-lending: ${t} must be a base58 public key`);return n}function sy(e){let t=Number(e);return Number.isFinite(t)?t:null}function L1(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 M1(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:sy(e.rates?.supplyInterest),borrowApyPct:sy(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 ay(e={}){try{let t=await y(`${jc(e)}/v1/reserves?ids=${oy}`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??15e3}),n=Array.isArray(t?.results)?t.results:[];return{ok:n.length>0,provider:"solend-lending",probeReserve:oy,reserves:n.length,exec:!1}}catch(t){return{ok:!1,provider:"solend-lending",error:String(t?.message||t),exec:!1}}}async function Vc(e={},t={}){let n=new URL(`${jc(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(L1);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 cy(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=>iy(String(a).trim(),"reserve"));else{let s=iy(e.market||e.marketAddress||R1,"market"),c=(await Vc({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(`${jc(t)}/v1/reserves?ids=${n.join(",")}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??25e3}),i=(Array.isArray(o?.results)?o.results:[]).map((s,a)=>({...M1(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 zc(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 Ht(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 Lr(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:zc(e.amount,"amount")}}function Wc(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 Mr(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 Gc(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 B1(e={},t={}){let n=Lr(e),r=Ht(e.slices??10,"slices",2,100),o=Ht(e.durationSec??3600,"durationSec",r,604800),i=Wc(n.total,Array(r).fill(1));return Mr(n,"TWAP",Gc(i,o,t.nowMs),{durationSec:o})}function D1(e={},t={}){let n=Lr(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=Ht(e.durationSec??3600,"durationSec",r.length,604800),i=Wc(n.total,r),s=r.reduce((c,l)=>c+l,0n),a=Gc(i,o,t.nowMs).map((c,l)=>({...c,volumeWeightBps:Number(r[l]*10000n/s)}));return Mr(n,"VWAP",a,{durationSec:o,requiresLiveVolumeValidation:!0})}function F1(e={}){let t=Lr(e),n=Ht(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=zc(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 Mr(t,"POV",o,{participationBps:n,residualAmount:String(r),requiresLiveVolumeValidation:!0})}function q1(e={}){let t=Lr(e),n=zc(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 Mr(t,"ICEBERG",r,{displayAmount:String(n),refillCount:r.length-1})}function H1(e={},t={}){let n=Lr(e),r=Ht(e.slices??10,"slices",2,100),o=Ht(e.durationSec??3600,"durationSec",r,604800),i=Ht(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=Wc(n.total,s);return Mr(n,"IS",Gc(a,o,t.nowMs),{durationSec:o,urgencyBps:i})}function ly(e={},t={}){let n=String(e.strategy||"").trim().toUpperCase();if(n==="TWAP")return B1(e,t);if(n==="VWAP")return D1(e,t);if(n==="POV")return F1(e,t);if(n==="ICEBERG")return q1(e,t);if(n==="IS"||n==="IMPLEMENTATION SHORTFALL")return H1(e,t);throw new Error("strategy must be TWAP, VWAP, POV, ICEBERG, or IS")}function uy(){return{ok:!0,provider:"execution-strategies",strategies:["TWAP","VWAP","POV","ICEBERG","IS"],execution:"plan-only",externalProtocol:!1}}var V1={"hl-info":{health:e=>Cu(e),allMids:e=>Xe(e),l2Book:(e,t={})=>lo(t.coin,e),outcomeMeta:e=>er(e),clearinghouse:(e,t={})=>uo(t.user,e),userFills:(e,t={})=>Tu(t.user,e),meta:e=>po(e),metaAndAssetCtxs:e=>Zt(e),candleSnapshot:(e,t={})=>en(t,e),openOrders:(e,t={})=>Ou(t.user,e),frontendOpenOrders:(e,t={})=>Ru(t.user,e),userState:(e,t={})=>mo(t.user,e),spotMeta:e=>fo(e)},"poly-public":{health:e=>Lu(e),time:e=>Os(e),markets:(e,t={})=>Mu(t,e),book:(e,t={})=>Uu(t.tokenId,e),midpoint:(e,t={})=>Bu(t.tokenId,e),spread:(e,t={})=>Du(t.tokenId,e),price:(e,t={})=>Fu(t.tokenId,{side:t.side},e),events:(e,t={})=>qu(t,e)},"evm-rpc":{health:(e,t={})=>Yn(t.chainId??1,e),healthAll:(e,t={})=>ou({...e,chainIds:t.chainIds}),blockNumber:(e,t={})=>Zr(t.chainId??1,e),chainId:(e,t={})=>nu(t.chainId??1,e),getBalance:(e,t={})=>Qt(t.chainId??1,t.address,e),call:(e,t={})=>L(t.chainId??1,t.method,t.params||[],e),erc20Allowance:(e,t={})=>ru(t,e),erc20Balance:(e,t={})=>eo(t,e),transactionReceipt:(e,t={})=>to(t,e)},portfolio:{health:e=>Zf(e),balances:(e,t={})=>hi(t,e),snapshot:(e,t={})=>bh(t,e),history:(e,t={})=>rc(t,e),valueGraph:(e,t={})=>wh(t,e)},"nft-portfolio":{health:e=>sh(e),inventory:(e,t={})=>_n(t,e),gallery:(e,t={})=>uh(t,e),pnl:(e,t={})=>lh(t,e),prepareList:(e,t={})=>ah(t,e),traitSnipe:(e,t={})=>ch(t,e)},"contract-risk":{health:e=>xh(e),scan:(e,t={})=>Pr(t,e)},"evm-simulate":{health:e=>Eh(e),simulate:(e,t={})=>Cr(t,e)},"nft-mint":{health:e=>vh(e),discover:(e,t={})=>Ei(t,e),prepare:(e,t={})=>ic(t,e),priceGas:(e,t={})=>Si(t,e),createTrigger:(e,t={})=>Ah(t,e),checkOpen:(e,t={})=>Ih(t,e)},"solana-rpc":{health:e=>ju(e),latestBlockhash:(e,t={})=>$s(t,e),getBalance:(e,t={})=>ho(t,e),tokenAccounts:(e,t={})=>rr(t,e),simulate:(e,t={})=>Vu(t,e)},"bitcoin-esplora":{health:e=>zu(e),tipHeight:e=>Wu(e),fees:e=>Gu(e),address:(e,t={})=>yo(t,e),utxos:(e,t={})=>Ku(t,e),tx:(e,t={})=>Yu(t,e),decode:(e,t={})=>Xu(t,e)},"bitcoin-meta":{health:e=>ed(e),runeBalances:(e,t={})=>wo(t,e),inscriptions:(e,t={})=>rn(t,e),inscriptionInfo:(e,t={})=>td(t,e),inscriptionChildren:(e,t={})=>nd(t,e),ordBlockInfo:(e,t={})=>rd(t,e)},satflow:{health:e=>id(e),collectionFloors:(e,t={})=>sd(t,e),collectionStats:(e,t={})=>ad(t,e),item:(e,t={})=>cd(t,e),walletContents:(e,t={})=>So(t,e),floorListings:(e,t={})=>ld(t,e),preparePurchase:(e,t={})=>dd(t,e),prepareList:(e,t={})=>Eo(t,e)},jupiter:{health:e=>wd(e),venues:(e,t={})=>bd(t,e),quote:(e,t={})=>Ao(t,e),prepare:(e,t={})=>xd(t,e)},defillama:{health:e=>Ed(e),prices:(e,t={})=>Oe(t.coins||[],e),pricesBySymbol:(e,t={})=>Id(t.symbols,e),protocols:e=>Io(e),yields:(e,t={})=>kd(t,e),stablecoins:(e,t={})=>vd(t,e),dexVolumes:(e,t={})=>Ad(t,e)},lifi:{health:e=>$d(e),quote:(e,t={})=>ct(t,e),prepare:(e,t={})=>Ld(t,e),chains:e=>Md(e)},dexscreener:{health:e=>iu(e),token:(e,t={})=>Tt(t.address||t.tokenAddress,e),search:(e,t={})=>Xn(t.q||t.query,e),pair:(e,t={})=>su(t.chainId,t.pairAddress,e)},"uniswap-v3":{health:(e,t={})=>xu({...e,chainId:t.chainId??8453}),quote:(e,t={})=>it(t,e),prepare:(e,t={})=>wu(t,e),quotePath:(e,t={})=>bu(t,e),ethUsdc:(e,t={})=>Ts(t,e),chains:()=>Su()},"uniswap-v4":{health:(e,t={})=>_u({...e,chainId:t.chainId??8453}),quote:(e,t={})=>ao(t,e),chains:()=>Iu()},aerodrome:{health:(e,t={})=>Vd({...e,chainId:t.chainId??8453}),quote:(e,t={})=>To(t,e),prepare:(e,t={})=>jd(t,e),chains:()=>zd()},zerox:{health:e=>Yd(e),price:(e,t={})=>Ys(t,e),quote:(e,t={})=>Nt(t,e),prepare:(e,t={})=>Xd(t,e)},across:{health:e=>Xs(e),suggestedFees:(e,t={})=>Oo(t,e)},hop:{health:e=>Qs(e),quote:(e,t={})=>Ro(t,e)},relay:{health:e=>Js(e),quote:(e,t={})=>ir(t,e),prepare:(e,t={})=>Zs(t,e)},cowswap:{health:e=>op(e),quote:(e,t={})=>ut(t,e),prepareOrder:(e,t={})=>ip(t,e),order:(e,t={})=>ap(t,e),status:(e,t={})=>sp(t,e),chains:()=>cp()},oneinch:{health:e=>up(e),quote:(e,t={})=>cr(t,e),prepare:(e,t={})=>dp(t,e),approveSpender:(e,t={})=>ia(t,e)},"hl-ws":{health:e=>pp(e),allMids:e=>mp(e),l2Book:(e,t={})=>fp(t.coin,e),snapshot:(e,t={})=>lr(t.subscription||t,e)},"poly-ws":{health:(e,t={})=>hp({...e,assetId:t.assetId}),book:(e,t={})=>gp(t.assetId||t.tokenId,e),snapshot:(e,t={})=>Uo(t.assetIds||t.assets_ids||[t.assetId],e)},"opensea-nft":{health:e=>Ep(e),collection:(e,t={})=>Fo(t.slug,e),floor:(e,t={})=>kp(t.slug,e),accountNfts:(e,t={})=>ur(t,e),accountPnl:(e,t={})=>qo(t,e),prepareList:(e,t={})=>Ho(t,e)},"hl-outcome":{list:e=>im(e),prepareOrder:(e,t={})=>sm(t,e),prepareCancel:(e,t={})=>am(t,e)},"protocol-templates":{health:()=>({ok:!0,templates:ni().map(e=>e.id),firmAudit:!1}),list:()=>ni(),gate:(e,t={})=>va(t.templateId||t.id,e),prepareDeploy:(e,t={})=>Tm(t,e)},"poly-clob":{prepareOrder:(e,t={})=>mm(t||{})},"hl-perps":{health:e=>ha(e),assetInfo:(e,t={})=>Rt(t,e),prepareOrder:(e,t={})=>hr(t,e),prepareCancel:(e,t={})=>Xo(t,e),prepareLeverage:(e,t={})=>nm(t,e),prepareIsolatedMargin:(e,t={})=>rm(t,e),prepareBracket:(e,t={})=>om(t,e),prepareBuilderApproval:(e,t={})=>tm(t,e)},"hl-markets":{health:e=>ha(e),markets:(e,t={})=>zo(t,e),leaderboards:(e,t={})=>jp(t,e),coin:(e,t={})=>Vp(t,e),spot:(e,t={})=>zp(t,e)},"magiceden-sol":{health:e=>Cp(e),stats:(e,t={})=>aa(t,e),listings:(e,t={})=>Np(t,e),tokenListings:(e,t={})=>Op(t,e),prepareBuy:(e,t={})=>Rp(t,e),prepareList:(e,t={})=>jo(t,e),prepareMint:(e,t={})=>$p(t,e)},"hl-staking":{health:e=>Mp(e),validators:e=>ua(e),delegatorSummary:(e,t={})=>da(t,e),delegations:(e,t={})=>pa(t,e),rewards:(e,t={})=>Up(t,e),history:(e,t={})=>Bp(t,e),preflight:(e,t={})=>Hp(t,e),prepareStakeDeposit:(e,t={})=>Dp(t,e),prepareStakeWithdraw:(e,t={})=>Fp(t,e),prepareDelegate:(e,t={})=>qp(t,e)},"hyperevm-dex":{health:e=>Ap(e),search:(e,t={})=>Ip(t.q||t.query||"HYPE",e),token:(e,t={})=>_p(t.address||t.tokenAddress,e)},geckoterminal:{health:e=>$m(e),networks:(e,t={})=>Aa(t,e),pool:(e,t={})=>Nm(t,e),token:(e,t={})=>Om(t,e),ohlcv:(e,t={})=>Rm(t,e)},curve:{health:e=>Gm(e),openapi:e=>Wm(e),pools:(e,t={})=>_a(t,e),quote:(e,t={})=>Pa(t,e),prepare:(e,t={})=>Km(t,e)},gmx:{health:e=>sf(e),tickers:(e,t={})=>si(t,e),markets:(e,t={})=>rf(t,e),marketsInfo:(e,t={})=>Ta(t,e),tokens:(e,t={})=>of(t,e),prepareOrder:(e,t={})=>uf(t,e),positions:(e,t={})=>af(t,e),orderStatus:(e,t={})=>cf(t,e),verifyOrder:(e,t={})=>lf(t,e)},morpho:{health:e=>ff(e),markets:(e,t={})=>mf(t,e),vaults:(e,t={})=>Ra(t,e),prepareVault:(e,t={})=>hf(t,e)},balancer:{health:e=>kf(e),pools:(e,t={})=>Ef(t,e),quote:(e,t={})=>Ma(t,e),prepare:(e,t={})=>vf(t,e)},pendle:{health:e=>If(e),markets:(e,t={})=>Ba(t,e),quote:(e,t={})=>_f(t,e),prepare:(e,t={})=>Da(t,e)},odos:{health:e=>Nf(e),chains:e=>qa(e),quote:(e,t={})=>Cf(t,e),prepare:(e,t={})=>Tf(t,e)},blockscout:{health:e=>Df(e),stats:(e,t={})=>Va(t,e),address:(e,t={})=>Lf(t,e),token:(e,t={})=>Mf(t,e)},paraswap:{health:e=>Ph(e),tokens:(e,t={})=>ac(t,e),price:(e,t={})=>gt(t,e),quote:(e,t={})=>gt(t,e),prepare:(e,t={})=>_h(t,e)},rfq:{health:e=>zh(e),intent:(e,t={})=>jh(t,e),quote:(e,t={})=>Vh(t,e)},"polygon-staking":{health:e=>w0(e),validators:(e,t={})=>y0(t,e),validatorDetail:(e,t={})=>b0(t,e)},"aave-v3":{health:e=>k0(e),markets:(e,t={})=>x0(t,e),marketReserves:(e,t={})=>S0(t,e),chains:e=>E0(e)},"babylon-staking":{health:e=>A0(e),stats:e=>I0(e),finalityProviders:e=>_0(e),delegations:(e,t={})=>P0(t,e)},"bisq-markets":{health:e=>T0(e),markets:e=>N0(e),ticker:(e,t={})=>O0(t,e),trades:(e,t={})=>R0(t,e)},"bob-rootstock":{health:(e,t={})=>L0(t.chainId,e),stats:(e,t={})=>kc(t,e),addressInfo:(e,t={})=>M0(t,e),tokenBalances:(e,t={})=>U0(t,e)},"braiins-insights":{health:e=>B0(e),priceStats:e=>D0(e),poolStats:e=>F0(e)},"cow-protocol":{health:e=>K0(e),auction:e=>z0(e),openOrders:(e,t={})=>W0(t,e),recentTrades:(e,t={})=>G0(t,e)},"hiro-stacks":{health:e=>Y0(e),networkInfo:e=>X0(e),stackingInfo:e=>Q0(e),poxCycles:e=>J0(e),blocks:(e,t={})=>Z0(t,e)},"jito-mev":{health:e=>ng(e),recentBundles:(e,t={})=>rg(t,e),tipFloor:e=>og(e)},"kamino-strategies":{health:e=>sg(e),strategies:(e,t={})=>ag(t,e),strategyMetrics:(e,t={})=>cg(t,e)},"liquid-esplora":{health:e=>pg(e),tipHeight:e=>mg(e),addressInfo:(e,t={})=>fg(t,e),assetInfo:(e,t={})=>hg(t,e)},"magiceden-ordinals":{health:e=>bg(e),collectionStat:(e,t={})=>wg(t,e)},"mempool-lightning":{health:e=>Sg(e),statistics:e=>Eg(e),nodeRankings:(e,t={})=>kg(t,e),nodeCountries:e=>vg(e)},"mempool-mining":{health:e=>_g(e),difficulty:e=>Pg(e),poolShare:(e,t={})=>Cg(t,e),hashrate:(e,t={})=>Tg(t,e),rewardStats:(e,t={})=>Ng(t,e)},"meteora-dlmm":{health:e=>$g(e),pools:(e,t={})=>Lg(t,e),poolSearch:(e,t={})=>Mg(t,e)},"ordinals-runes":{health:e=>Bg(e),blockHeight:e=>Dg(e),blockInfo:(e,t={})=>Fg(t,e),satInfo:(e,t={})=>qg(t,e),runeInfo:(e,t={})=>Hg(t,e)},"pyth-price-feeds":{health:e=>zg(e),latestPrice:(e,t={})=>Wg(t,e),latestPrices:(e,t={})=>Gg(t,e),feedDirectory:e=>Kg(e)},"relayscan-mev":{health:e=>Zg(e),overview:(e,t={})=>Fc(t,e),builderProfit:(e,t={})=>Qg(t,e),dailyStats:(e,t={})=>Jg(t,e)},"sanctum-lst":{health:e=>ty(e),lstList:e=>Hc(e),apyAll:e=>ny(e),apyIndividual:(e,t={})=>ry(t,e)},"solend-lending":{health:e=>ay(e),markets:e=>Vc(e),reserves:(e,t={})=>cy(t,e)},"execution-strategies":{health:()=>uy(),plan:(e,t={})=>ly(t)},"across-bridge":{health:e=>Wh(e),pools:(e,t={})=>Gh(t,e),suggestedFees:(e,t={})=>Kh(t,e)},"beefy-yields":{health:e=>Yh(e),apy:(e,t={})=>Xh(t,e),apyBreakdown:e=>Qh(e)},"birdeye-tokens":{health:e=>Zh(e),tokenList:(e,t={})=>e0(t,e)},"celestia-da":{health:e=>t0(e),stats:e=>n0(e),blockStats:(e,t={})=>r0(t,e)},"das-assets":{health:e=>o0(e),assetsByOwner:(e,t={})=>i0(t,e),searchAssets:(e,t={})=>s0(t,e),assetProof:(e,t={})=>a0(t,e)},"l2beat-tvl":{health:e=>c0(e),tvl:(e,t={})=>l0(t,e),activity:(e,t={})=>u0(t,e)},"spark-lend":{health:e=>d0(e),markets:(e,t={})=>p0(t,e)},"symbiotic-restaking":{health:e=>m0(e),vaults:(e,t={})=>f0(t,e),vaultDetail:(e,t={})=>h0(t,e)}},dy=new Set(["prepareBuilderApproval","prepareBracket","prepareIsolatedMargin","prepareLeverage","prepareCancel","prepareOrder","preparePurchase","prepareList","prepareSell","prepareBuy","prepareMint","prepare","prepareStakeDeposit","prepareStakeWithdraw","prepareDelegate","prepareSwap","prepareTransfer","createOrder","cancelOrder"]),py=new Set(["hl-exec"]);function z1(e){return py.has(String(e||""))}function W1(e,t,n={}){let r=String(t||""),o=`${e}.${r}`;if(py.has(e))throw new Error(`data plane forbidden execution provider: ${e}`);let i=Zn().find(s=>s.id===e);if(/sign|execute|broadcast|submit|send|write|place/i.test(r)&&!dy.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(dy.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 E(e,t,n={},r={}){if(z1(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.`);W1(e,t,n);let o=co(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=V1[e];if(!i||typeof i[t]!="function")throw new Error(`No client implementation for ${e}.${t}`);return i[t](r,n)}async function my({providers:e,fetchImpl:t,timeoutMs:n,includeRpc:r,includeWs:o,concurrency:i,healthCall:s}={}){let a=e||Zn().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)=>E(d,"health",p,m),u={};return await Xt(a,i??8,async d=>{if(!co(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 fy(){return Zn().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 G1={catalog:fy,health:my,call:E,hl:{health:e=>E("hl-info","health",{},e),allMids:e=>E("hl-info","allMids",{},e),l2Book:(e,t)=>E("hl-info","l2Book",{coin:e},t),outcomeMeta:e=>E("hl-info","outcomeMeta",{},e),clearinghouse:(e,t)=>E("hl-info","clearinghouse",{user:e},t),userFills:(e,t)=>E("hl-info","userFills",{user:e},t),meta:e=>E("hl-info","meta",{},e),metaAndAssetCtxs:e=>E("hl-info","metaAndAssetCtxs",{},e),candleSnapshot:(e,t)=>E("hl-info","candleSnapshot",e||{},t),openOrders:(e,t)=>E("hl-info","openOrders",{user:e},t),userState:(e,t)=>E("hl-info","userState",{user:e},t),spotMeta:e=>E("hl-info","spotMeta",{},e),staking:{health:e=>E("hl-staking","health",{},e),validators:e=>E("hl-staking","validators",{},e),summary:(e,t)=>E("hl-staking","delegatorSummary",{user:e},t),delegations:(e,t)=>E("hl-staking","delegations",{user:e},t),rewards:(e,t)=>E("hl-staking","rewards",{user:e},t),history:(e,t)=>E("hl-staking","history",{user:e},t),preflight:(e,t)=>E("hl-staking","preflight",{user:e},t),prepareStake:(e,t)=>E("hl-staking","prepareStakeDeposit",e||{},t),prepareUnstake:(e,t)=>E("hl-staking","prepareStakeWithdraw",e||{},t),prepareDelegate:(e,t)=>E("hl-staking","prepareDelegate",e||{},t)}},poly:{health:e=>E("poly-public","health",{},e),time:e=>E("poly-public","time",{},e),markets:(e,t)=>E("poly-public","markets",e||{},t),book:(e,t)=>E("poly-public","book",{tokenId:e},t),midpoint:(e,t)=>E("poly-public","midpoint",{tokenId:e},t),spread:(e,t)=>E("poly-public","spread",{tokenId:e},t),price:(e,t,n)=>E("poly-public","price",{tokenId:e,side:t},n),events:(e,t)=>E("poly-public","events",e||{},t)},polyClob:{prepareOrder:(e,t)=>E("poly-clob","prepareOrder",e||{},t)},rpc:{health:(e,t)=>E("evm-rpc","health",{chainId:e},t),healthAll:(e,t)=>E("evm-rpc","healthAll",e||{},t),blockNumber:(e,t)=>E("evm-rpc","blockNumber",{chainId:e},t),getBalance:(e,t,n)=>E("evm-rpc","getBalance",{chainId:e,address:t},n),call:(e,t,n,r)=>E("evm-rpc","call",{chainId:e,method:t,params:n},r)},portfolio:{balance:(e,t)=>E("portfolio","balances",e||{},t),snapshot:(e,t)=>E("portfolio","snapshot",e||{},t),history:(e,t)=>E("portfolio","history",e||{},t),valueGraph:(e,t)=>E("portfolio","valueGraph",e||{},t)},nft:{inventory:(e,t)=>E("nft-portfolio","inventory",e||{},t),gallery:(e,t)=>E("nft-portfolio","gallery",e||{},t),pnl:(e,t)=>E("nft-portfolio","pnl",e||{},t),prepareList:(e,t)=>E("nft-portfolio","prepareList",e||{},t),traitSnipe:(e,t)=>E("nft-portfolio","traitSnipe",e||{},t),floor:(e,t)=>E("opensea-nft","floor",{slug:e},t),collection:(e,t)=>E("opensea-nft","collection",{slug:e},t)},solana:{health:e=>E("solana-rpc","health",{},e),latestBlockhash:(e,t)=>E("solana-rpc","latestBlockhash",e||{},t),balance:(e,t)=>E("solana-rpc","getBalance",{address:e},t),tokenAccounts:(e,t)=>E("solana-rpc","tokenAccounts",e||{},t),simulate:(e,t)=>E("solana-rpc","simulate",e||{},t),jupiterQuote:(e,t)=>E("jupiter","quote",e||{},t),jupiterPrepare:(e,t)=>E("jupiter","prepare",e||{},t),nftStats:(e,t)=>E("magiceden-sol","stats",e||{},t),nftListings:(e,t)=>E("magiceden-sol","listings",e||{},t),nftTokenListings:(e,t)=>E("magiceden-sol","tokenListings",e||{},t),nftPrepareBuy:(e,t)=>E("magiceden-sol","prepareBuy",e||{},t),nftPrepareList:(e,t)=>E("magiceden-sol","prepareList",e||{},t),nftPrepareMint:(e,t)=>E("magiceden-sol","prepareMint",e||{},t)},bitcoin:{health:e=>E("bitcoin-esplora","health",{},e),tipHeight:e=>E("bitcoin-esplora","tipHeight",{},e),fees:e=>E("bitcoin-esplora","fees",{},e),address:(e,t)=>E("bitcoin-esplora","address",{address:e},t),utxos:(e,t)=>E("bitcoin-esplora","utxos",{address:e},t),tx:(e,t)=>E("bitcoin-esplora","tx",{txid:e},t),decode:(e,t)=>E("bitcoin-esplora","decode",e||{},t),metaHealth:e=>E("bitcoin-meta","health",{},e),runeBalances:(e,t)=>E("bitcoin-meta","runeBalances",{address:e},t),inscriptions:(e,t)=>E("bitcoin-meta","inscriptions",{address:e},t),satflowHealth:e=>E("satflow","health",{},e),satflowFloors:(e,t)=>E("satflow","collectionFloors",e||{},t),satflowWallet:(e,t)=>E("satflow","walletContents",{address:e},t)},prices:{health:e=>E("defillama","health",{},e),current:(e,t)=>E("defillama","prices",{coins:e},t),bySymbol:(e,t)=>E("defillama","pricesBySymbol",{symbols:e},t),protocols:e=>E("defillama","protocols",{},e)},lifi:{health:e=>E("lifi","health",{},e),quote:(e,t)=>E("lifi","quote",e||{},t),chains:e=>E("lifi","chains",{},e)},dex:{health:e=>E("dexscreener","health",{},e),token:(e,t)=>E("dexscreener","token",{address:e},t),search:(e,t)=>E("dexscreener","search",{q:e},t),pair:(e,t,n)=>E("dexscreener","pair",{chainId:e,pairAddress:t},n)},uni:{health:(e,t)=>E("uniswap-v3","health",e||{},t),quote:(e,t)=>E("uniswap-v3","quote",e||{},t),quotePath:(e,t)=>E("uniswap-v3","quotePath",e||{},t),ethUsdc:(e,t)=>E("uniswap-v3","ethUsdc",e||{},t),chains:e=>E("uniswap-v3","chains",{},e)},univ4:{health:(e,t)=>E("uniswap-v4","health",e||{},t),quote:(e,t)=>E("uniswap-v4","quote",e||{},t),chains:e=>E("uniswap-v4","chains",{},e)},bridges:{across:(e,t)=>E("across","suggestedFees",e||{},t),hop:(e,t)=>E("hop","quote",e||{},t),relay:(e,t)=>E("relay","quote",e||{},t)},cow:{quote:(e,t)=>E("cowswap","quote",e||{},t)},hlWs:{allMids:e=>E("hl-ws","allMids",{},e),l2Book:(e,t)=>E("hl-ws","l2Book",{coin:e},t)},polyWs:{book:(e,t)=>E("poly-ws","book",{assetId:e},t)}};var Le=Object.freeze({FULL:"FULL",NO_GAS:"NO_GAS",FAILED:"FAILED"}),gy={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"},Ur=e=>{try{return e==null||e===""?null:BigInt(String(e).split(".")[0])}catch{return null}};function hy(e){let{source:t,amountOut:n,minOut:r=null,gasUsd:o=null,feeUsd:i=null,oracleFeeBps:s=0,estimatedGas:a=null,liquidityUsd:c=null,error:l=null,executionReady:u=!1,meta:d={}}=e||{};if(l||n==null)return{source:t,quality:Le.FAILED,amountOut:null,error:l||"no amountOut returned"};let p=Ur(n);if(p==null||p<=0n)return{source:t,quality:Le.FAILED,amountOut:null,error:"non-positive amountOut"};let m=Number(s);return{source:t,quality:o==null?Le.NO_GAS:Le.FULL,amountOut:p.toString(),minOut:Ur(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 yy(e,t,{divisor:n=1000n}={}){let r=Ur(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=Ur(i),c=Ur(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 by(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 Kc(e,{destPriceUsd:t=null,destDecimals:n=null,liquidityFirst:r=!0,liquidityBandBps:o=50}={}){let i=e.filter(b=>b.quality!==Le.FAILED),s=e.filter(b=>b.quality===Le.FAILED),a=t!=null&&t>0&&n!=null&&n>=0,c=i.map(b=>{let S=BigInt(b.amountOut),x=0n,w=!1,v=BigInt(b.oracleFeeBps??0),T=v>0n?S*v/10000n:0n;if(a){let _=(b.gasUsd??0)+(b.feeUsd??0);if(_>0){let k=_/t*10**n;Number.isFinite(k)&&k>=0&&(x=BigInt(Math.floor(k)),w=!0)}else b.gasUsd===0&&(w=!0)}let I=x+T,R=S>I?S-I:0n;return{...b,grossOut:S.toString(),netOut:R.toString(),costInDest:x.toString(),oracleFeeInDest:T.toString(),costAccounted:w}}),l=Number(o)>0?Number(o):0,u=c.reduce((b,S)=>BigInt(S.netOut)>b?BigInt(S.netOut):b,0n),d=b=>u>0n?Number((u-BigInt(b))*10000n/u):0,p=[],m=c.slice().sort((b,S)=>BigInt(S.netOut)>BigInt(b.netOut)?1:-1)[0]??null;c.sort((b,S)=>{let x=d(b.netOut)<=l?0:1,w=d(S.netOut)<=l?0:1;if(r&&l>0&&x!==w)return x-w;if(r&&l>0){let v=b.liquidityUsd??-1,T=S.liquidityUsd??-1;if(v!==T)return T-v}return BigInt(S.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),S=BigInt(c[1].netOut);S>0n&&(h=Number((b-S)*10000n/S),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 $i(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"?hy({source:s,error:String(o.reason?.message||o.reason)}):hy({source:s,...o.value})})}var We=e=>{let t=Number(e);return Number.isFinite(t)?t:null};function Li(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 xy(e,t={}){let n=gy[Number(e)];if(!n)return null;try{let r=await Oe([n],t);return We(r?.coins?.[n]?.price)}catch{return null}}var yt=e=>String(e??"").toLowerCase().replace(/[^a-z0-9]/g,""),wy=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 K1(e={}){try{let t=await Io({...e,baseUrl:e.defillamaApiBaseUrl,timeoutMs:e.defillamaTimeoutMs??Math.min(Number(e.timeoutMs??5e3),5e3)});return Array.isArray(t)?t:[]}catch{return[]}}function Y1(e,t={}){let n=yt(t.tool||t.provider||t.bridge||t.protocol),r=[];return e==="lifi"&&n&&n!=="lifi"&&r.push(...wy[n]||[n]),r.push(...wy[yt(e)]||[e]),r}function X1(e,t,n={}){let r=Array.isArray(e)?e:[],o=Y1(t,n).map(yt).filter(Boolean);for(let i of o){let s=r.find(c=>yt(c?.slug)===i||yt(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=yt(c?.category);return!l.includes("bridge")&&!l.includes("crosschain")?!1:yt(c?.slug).includes(i)||yt(c?.name).includes(i)}),a=We(s?.tvl);if(a!=null)return{liquidityUsd:a,protocol:s?.name??s?.slug??i}}return null}function Yc({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 ct({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:Li(m?.gasCosts),feeUsd:Li(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 gt({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 Nt({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 cr({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 ut({chainId:e,sellToken:t,buyToken:n,sellAmountBeforeFee:String(r),from:o},u),m=p?.quote??p,f=m?.feeAmount;return{amountOut:m?.buyAmount,gasUsd:0,meta:{intent:!0,feeAmountInSellToken:f,settlement:"solver-executed"}}}}),ce[Number(e)]&&d.push({source:"uniswap-v3",run:async()=>{let p=await it({chainId:e,tokenIn:t,tokenOut:n,amountIn:r},u);return{amountOut:p?.amountOut,minOut:p?.minOut??p?.amountOutMinimum??null,gasUsd:null,liquidityUsd:p?.liquidityUsd??null,meta:{onchain:!0,fee:p?.fee,gasUnits:p?.gasEstimate,quoter:p?.quoter}}}}),je[Number(e)]&&d.push({source:"uniswap-v4",run:async()=>{let p=await ao({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 Sy({fromChainId:e,toChainId:t,tokenIn:n,tokenOut:r,amountIn:o,taker:i,opts:s={}}){let a=[],c=null,l=async(u,d={})=>(c||=K1(s),X1(await c,u,d));return a.push({source:"lifi",run:async()=>{let u=await ct({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:Li(d?.gasCosts),feeUsd:Li(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(()=>(Lo(),$o)),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(()=>(Lo(),$o)),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 Q1={1:"ethereum",10:"optimism",56:"bsc",137:"polygon",8453:"base",42161:"arbitrum",43114:"avax"};async function Ey(e,t,n){let r=Q1[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 J1(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=xy(n,t),a=Ey(n,o,t),c=Yc({...e,nativePriceUsd:s,decimalsOut:e.decimalsOut,destDecimalsPromise:a,opts:t}),[l,u]=await Promise.all([$i(c,{timeoutMs:t.timeoutMs??12e3}),a]);s.catch(()=>{});let d=Kc(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 yy(async g=>{let b=Yc({...e,amountIn:g.toString(),nativePriceUsd:s,decimalsOut:e.decimalsOut,destDecimalsPromise:a,opts:t}).filter(x=>x.source===m);return b.length?(await $i(b,{timeoutMs:t.timeoutMs??12e3}))?.[0]?.amountOut??null:null},i);if(h){let g=by(d,{[m]:h},{maxImpactPct:p});return{kind:"swap",chainId:n,tokenIn:r,tokenOut:o,amountIn:String(i),...g,sourcesTried:c.length,sourcesAnswered:l.filter(b=>b.quality!==Le.FAILED).length,note:Xc(g,c.length),priceImpact:{[m]:Number(h.impactPct.toFixed(2))}}}}return{kind:"swap",chainId:n,tokenIn:r,tokenOut:o,amountIn:String(i),...d,sourcesTried:c.length,sourcesAnswered:l.filter(m=>m.quality!==Le.FAILED).length,note:Xc(d,c.length)}}async function Z1(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=Ey(r,i,t),c=Sy({...e,opts:t}),[l,u]=await Promise.all([$i(c,{timeoutMs:t.timeoutMs??15e3}),a]),d=Kc(l,{destPriceUsd:u.priceUsd,destDecimals:e.decimalsOut??u.decimals,liquidityBandBps:t.liquidityBandBps??50}),p=d.routes.map(m=>({source:m.source,seconds:m.meta?.durationSeconds??null})).filter(m=>m.seconds!=null);return{kind:"bridge",fromChainId:n,toChainId:r,tokenIn:o,tokenOut:i,amountIn:String(s),...d,durations:p,sourcesTried:c.length,sourcesAnswered:l.filter(m=>m.quality!==Le.FAILED).length,note:Xc(d,c.length)}}function eP(e){let t=e?.meta?.oracleFee;return t?.applies?` \xB7 ${Td(t)}`:""}function Xc(e,t){if(!e.best)return"no source returned a usable route";let n=e.routes.length,r=eP(e.best);if(n===1)return`only 1 of ${t} sources answered, so this is the ONLY route, not a proven best one. Treat it as unbenchmarked.`+r;if(e.improvementBps!=null){let o=e.improvementBps,i=o/100;if(o<.01)return`best of ${n} routes, ranked on ${e.rankedOn}: effectively tied with the runner-up (${e.spreadBasis}), inside quote noise. Re-quote before you size up.`+r;let s=i>=.01?`${i.toFixed(2)}%`:`${o.toFixed(2)}bps`;return`best of ${n} routes, ranked on ${e.rankedOn}: ${s} better than the runner-up (${e.spreadBasis})`+r}return`best of ${n} routes, ranked on ${e.rankedOn}. No spread quoted: the top routes report cost differently, so the margin is not comparable.`+r}var eU=Object.freeze({mantissa:10000n,scale:0});function jt(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 jt(t),Object.freeze({mantissa:e,scale:t})}function bt(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`);jt(e.scale)}function Mi(e){return jt(e),10n**BigInt(e)}function B(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(jt(t),typeof e=="bigint")return Ge(e,t);if(typeof e!="string"||!/^[+-]?\d+$/.test(e))throw new TypeError("value must be an integer string or bigint");return Ge(BigInt(e),t)}function Me(e){bt(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 Br(e,t){return bt(e),jt(t),t===e.scale?Ge(e.mantissa,e.scale):t>e.scale?Ge(e.mantissa*Mi(t-e.scale),t):Ge(e.mantissa/Mi(e.scale-t),t)}function Qc(e,t){bt(e,"left"),bt(t,"right");let n=Math.max(e.scale,t.scale);return[Br(e,n),Br(t,n),n]}function wt(e,t){let[n,r,o]=Qc(e,t);return Ge(n.mantissa+r.mantissa,o)}function Dr(e,t){let[n,r,o]=Qc(e,t);return Ge(n.mantissa-r.mantissa,o)}function xe(e,t){bt(e,"left"),bt(t,"right");let n=e.scale+t.scale;return jt(n),Ge(e.mantissa*t.mantissa,n)}function Ue(e,t,n=Math.max(e?.scale??0,t?.scale??0)){if(bt(e,"left"),bt(t,"right"),jt(n),t.mantissa===0n)throw new RangeError("division by zero");let r=e.mantissa*Mi(t.scale+n),o=t.mantissa*Mi(e.scale);return Ge(r/o,n)}function xt(e,t){let[n,r]=Qc(e,t);return n.mantissa<r.mantissa?-1:n.mantissa>r.mantissa?1:0}import{readFileSync as oP,existsSync as iP}from"node:fs";import{fileURLToPath as sP}from"node:url";import{dirname as aP,join as _y}from"node:path";import{existsSync as vy,readFileSync as tP}from"node:fs";import{dirname as ky,join as Jc}from"node:path";import{fileURLToPath as nP}from"node:url";function rP(e){let t=ky(nP(e));for(let n=0;n<8;n+=1){let r=Jc(t,"package.json");if(vy(r))try{let i=JSON.parse(tP(r,"utf8"));if(i&&typeof i.version=="string")return t}catch{}let o=ky(t);if(o===t)break;t=o}throw new Error(`oracle: could not resolve package root from ${e}`)}function Ay(e,t){let n=rP(t),r=Jc(n,"dist","assets",e);return vy(r)?r:Jc(n,e)}var cP=_y(aP(sP(import.meta.url)),"fixtures");function lP(){try{let e=Ay("equities-fixtures",import.meta.url);if(e&&iP(e))return e}catch{}return cP}var uP=lP();var Py=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 dP(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){dP(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 St(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 pP(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`),St(i[o],t,`venues.${r}.${o}`)}for(let[r,o]of Object.entries(e.venues.hyperliquid_hip3.dexs))St(o,t,`venues.hyperliquid_hip3.dexs.${r}`)}function mP(e,t){St(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 fP(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"),St(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 hP(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 gP(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 yP(e,t){St(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 bP(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"),St(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 wP(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 xP(e,t){te(e,t,"root"),Ke(e.capturedAt,t,"capturedAt"),z(e.source,t,"source"),z(e.chain,t,"chain"),St(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 SP(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"'),St(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 EP=Object.freeze({venues:pP,universe:mP,oracles:fP,nyseHolidays:hP,dstTransitions:gP,equityDexPools:yP,rhPoolState:bP,solanaXstocks:xP,tonXstocks:SP,hip3L2Books:wP});function kP(e,t){let n=Py[t],r=_y(e,n),o;try{o=oP(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 EP[t](i,n),i}function Cy(e){if(e!==null&&typeof e=="object"&&!Object.isFrozen(e)){Object.freeze(e);for(let t of Object.values(e))Cy(t)}return e}function Ty({fixtureDir:e=uP}={}){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(Py))t[n]=kP(e,n);return Cy(t)}var Iy;function Et(){return Iy??=Ty(),Iy}function Ae(){return Et().venues}function Ny(){return Et().oracles}function Oy(){return Et().nyseHolidays}function Ry(){return Et().dstTransitions}function Ui(){return Et().rhPoolState}function $y(){return Et().solanaXstocks}function Ly(){return Et().tonXstocks}function My(){return Et().hip3L2Books}var el=1e3,Dy=60*el,tl=60*Dy,Uy=24*tl,vP=-5*tl,AP=-4*tl,Fy=240,qy=570,Hy=960,jy=1200,pU=Object.freeze([Fy,qy,Hy,jy]),mU=Object.freeze(["core","extended","dark"]),By,Zc;function IP(){let e=Ry().dstTransitions.map(r=>({year:r.year,startMs:r.startUtc*el,endMs:r.endUtc*el}));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 Vy(){return By??=IP(),By}function _P(){return Zc===void 0&&(Zc=new Set(Oy().holidayDayIndex)),Zc}function zy(e,t){if(!Number.isSafeInteger(e))throw new TypeError(`${t}: epochMs must be a safe integer number of milliseconds`)}function PP(e,t){let{coverageStartMs:n,coverageEndMs:r,firstYear:o,lastYear:i}=Vy();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 CP(e){for(let t of Vy().rows)if(e>=t.startMs&&e<t.endMs)return!0;return!1}function TP(e){return CP(e)?AP:vP}function NP(e){let t=e+TP(e),n=Math.floor(t/Uy),r=t-n*Uy,o=new Date(t);return{dayIndex:n,minuteOfDay:Math.floor(r/Dy),msIntoDay:r,weekday:o.getUTCDay()}}function OP({dayIndex:e,weekday:t}){return t===0||t===6?!1:!_P().has(e)}function RP(e){return e<Fy?"dark":e<qy?"extended":e<Hy?"core":e<jy?"extended":"dark"}function Fr(e){zy(e,"sessionState"),PP(e,"sessionState");let t=NP(e);return OP(t)?RP(t.minuteOfDay):"dark"}function nl(e){return zy(e,"isDark"),Fr(e)==="dark"}var Bi=Object.freeze({DORMANT_VENUE:"dormant-venue",CROSSED_BOOK:"crossed-book",STALE_QUOTE:"stale-quote",STALE_ORACLE:"stale-oracle"}),$P=12e4,LP=6e5;function Di(e,t){e.push(Object.freeze({venue:t.venue,symbol:t.symbol??null,reason:t.reason,evidence:t.evidence??null}))}function MP(e){let t=e.raw?.vol24h;return!!(t===0||t===0||typeof t=="number"&&Number.isFinite(t)&&t<=0)}function UP(e){return!e.bid||!e.ask?!1:xt(e.bid,e.ask)>0}function Wy(e,t,n){return Number.isSafeInteger(e.capturedAt)?t-e.capturedAt>n:!1}function Fi(e,t={}){if(!Array.isArray(e))throw new TypeError("quotes must be an array");let n=t.nowMs??Date.now(),r=t.quoteFreshnessMs??$P,o=t.oracleFreshnessMs??LP,i=t.includeDormant===!0,s=[],a=[];for(let c of e){if(MP(c)){i?s.push(Object.freeze({...c,staleData:!0})):Di(a,{venue:c.venue,symbol:c.symbolRaw??c.symbol,reason:Bi.DORMANT_VENUE,evidence:{vol24h:c.raw?.vol24h??null}});continue}if(UP(c)){Di(a,{venue:c.venue,symbol:c.symbolRaw??c.symbol,reason:Bi.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(Wy(c,n,r)){Di(a,{venue:c.venue,symbol:c.symbolRaw??c.symbol,reason:Bi.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=Fr(n),u=l==="core"?o:o*2;if(Wy(c,n,u)){Di(a,{venue:c.venue,symbol:c.symbolRaw??c.symbol,reason:Bi.STALE_ORACLE,evidence:{capturedAt:c.capturedAt,nowMs:n,session:l}});continue}}s.push(c)}return{survivors:s,excluded:a}}function BP(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"?B(e):typeof e!="number"||!Number.isFinite(e)?null:B(BP(e))}function Be(e,t){let n=oe(e);if(n===null)throw new TypeError(`${t} must be a finite source number`);return n}var DP=new Set(["spot","perp"]),FP=new Set(["read-only","quote-only","prepare","intent"]),qP=new Set(["buy","sell"]),HP=new Set(["net-of-cost","gross"]),jP=new Set(["homogeneous","heterogeneous"]),VP=["bid","ask","mid","mark"],Gy=["fees","gasEstimate","priceImpact","fundingHourly"],zP=/^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$/;function Y(e,t){throw new TypeError(`${e} ${t}`)}function Yy(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function Vt(e,t){Yy(e)||Y(t,"must be an object")}function Xy(e,t,n){Object.hasOwn(e,t)||Y(`${n}.${t}`,"is required")}function On(e,t){(typeof e!="string"||e.length===0)&&Y(t,"must be a nonempty string")}function qr(e,t,n){t.has(e)||Y(n,`must be one of ${[...t].join(", ")}`)}function ol(e,t){(!Number.isSafeInteger(e)||e<0)&&Y(t,"must be a nonnegative safe integer")}function rl(e,t,n=!1){e===null&&n||(Yy(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 qi(e,t,n=!1){e===null&&n||Vt(e,t)}function Ky(e,t){Vt(e,t),On(e.venue,`${t}.venue`),On(e.reason,`${t}.reason`),zP.test(e.reason)||Y(`${t}.reason`,"must be a machine readable lower case code"),Object.hasOwn(e,"symbol")&&e.symbol!==null&&On(e.symbol,`${t}.symbol`)}function Se(e){Vt(e,"quote");for(let n of["venue","chain","instrument","tier","symbolRaw","symbol","side","requestedSize",...Gy,"costAccounted","capturedAt","blockOrSeq","raw"])Xy(e,n,"quote");On(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"),qr(e.instrument,DP,"quote.instrument"),qr(e.tier,FP,"quote.tier"),On(e.symbolRaw,"quote.symbolRaw"),On(e.symbol,"quote.symbol"),qr(e.side,qP,"quote.side"),rl(e.requestedSize,"quote.requestedSize"),e.requestedSize.mantissa<0n&&Y("quote.requestedSize","must not be negative");let t=0;for(let n of VP)Object.hasOwn(e,n)&&(rl(e[n],`quote.${n}`),t+=1);t===0&&Y("quote","must contain at least one of bid, ask, mid, mark");for(let n of Gy)rl(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"),ol(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"),Vt(e.raw,"quote.raw"),e}function il(e){Vt(e,"rankResult");for(let t of["rankedOn","ranked","winner","runnersUp","improvementBps","sourcesAnswered","sourcesTried","failed","excluded","darkWindow","instrumentMix","bestPreparable"])Xy(e,t,"rankResult");return qr(e.rankedOn,HP,"rankResult.rankedOn"),Array.isArray(e.ranked)||Y("rankResult.ranked","must be an array"),e.ranked.forEach((t,n)=>qi(t,`rankResult.ranked[${n}]`)),qi(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)=>qi(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"),ol(e.sourcesAnswered,"rankResult.sourcesAnswered"),ol(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)=>Ky(t,`failed[${n}]`)),Array.isArray(e.excluded)||Y("rankResult.excluded","must be an array"),e.excluded.forEach((t,n)=>Ky(t,`excluded[${n}]`)),e.darkWindow!==null&&Vt(e.darkWindow,"rankResult.darkWindow"),qr(e.instrumentMix,jP,"rankResult.instrumentMix"),qi(e.bestPreparable,"rankResult.bestPreparable",!0),Object.hasOwn(e,"carry")&&e.carry!==null&&Vt(e.carry,"rankResult.carry"),e}var WP="arcus_perp",GP="robinhood-4663",KP="quote-only",Hi="0.00000480324074074";function Qy(){return Ae().venues.arcus}function YP(){return Object.keys(Qy().markets).sort()}function XP({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=Qy().markets[r];if(!o)return null;let i=Be(o.mark,`${r}.mark`),s=oe(o.oracle),a=oe(o.fundingHourly),c=n===null?B("0"):n,l={venue:WP,chain:GP,instrument:"perp",tier:KP,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:Hi,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 YP().map(n=>XP({symbol:n,side:e,sizeUsd:t})).filter(n=>n!==null)}var Jy=36e5,TU=24*365;function sl(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 B("0");let r=B(String(t)),o=fe(10000n,0);return xe(xe(e,r),o)}function Zy(e,t,n={}){if(e.instrument!=="perp")return{model:"current-funding-held-constant",horizonHours:t,carryBps:B("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=QP(r,t),c=t-a,l=B(Hi),u=sl(i,c),d=sl(l,a),p=Math.max(u.scale,d.scale),m={mantissa:u.mantissa*10n**BigInt(p-u.scale)+d.mantissa*10n**BigInt(p-d.scale),scale:p};return{model:"current-funding-held-constant",horizonHours:t,carryBps:m,carryBpsDisplay:Me(m),confidence:"estimate",darkHours:a,litHours:c,darkWindowRate:Hi,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=sl(i,t);return{model:"current-funding-held-constant",horizonHours:t,carryBps:s,carryBpsDisplay:Me(s),confidence:"estimate",compounding:"ignored",compoundingErrorBoundNote:"simple sum; at 30d and 1e-5/h the ignored compound is under 0.5bp"}}function QP(e,t){if(t<=0)return 0;let n=0,r=Math.floor(t);for(let o=0;o<r;o+=1)nl(e+o*Jy)&&(n+=1);return t>r&&nl(e+r*Jy)&&(n+=t-r),n}function JP(e){return e.mid??e.mark??e.ask??e.bid??null}function ZP(e){let t=JP(e);if(t===null)return null;let n=e.costAccounted===!0,r=B("0");e.fees!==null?r=wt(r,e.fees):n=!1,e.priceImpact!==null?r=wt(r,e.priceImpact):e.requestedSize&&e.requestedSize.mantissa>0n&&(n=!1),e.gasEstimate===null?n=!1:r=wt(r,e.gasEstimate);let o;if(e.fees!==null&&xt(e.fees,B("1"))<0&&xt(e.fees,B("0"))>=0){let i=wt(B("1"),e.fees);o=xe(t,i),e.priceImpact!==null&&(o=wt(o,xe(t,e.priceImpact)))}else o=wt(t,r);return{net:o,costAccounted:n,px:t}}function eC(e,t,n=null){return{venue:e.venue,chain:e.chain,instrument:e.instrument,tier:e.tier,symbol:e.symbol,symbolRaw:e.symbolRaw,side:e.side,price:t.px,net:t.net,costAccounted:t.costAccounted,fundingHourly:e.fundingHourly,carry:n,quote:e}}function tC(e,t){if(!e||!t||!e.costAccounted||!t.costAccounted||e.instrument!==t.instrument||e.net.mantissa===0n)return null;let n=Dr(t.net,e.net);return Ue(xe(n,fe(10000n,0)),t.net,4)}function al(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=Fi(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=ZP(I);if(R===null)continue;let _=null;if(l&&I.instrument==="perp"&&(_=Zy(I,c,{nowMs:n}),_.carryBps!==null)){let k=wt(B("1"),Ue(_.carryBps,fe(10000n,0),12));R.net=xe(R.net,k),R.costAccounted=!1}u.push(eC(I,R,_))}let d=u,p="homogeneous";if(l)p="heterogeneous",d=u;else{let I=u.filter(_=>_.instrument==="spot"),R=u.filter(_=>_.instrument==="perp");I.length>0&&R.length>0?(d=I.length>=R.length?I:R,p="homogeneous"):(d=u,p="homogeneous")}d.sort((I,R)=>{let _=xt(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:tC(m,f[0]),S=u.find(I=>I.tier==="prepare")??null,x=Fr(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=nC(u));let T={rankedOn:g,ranked:h,winner:m,runnersUp:f,improvementBps:b===null?null:Number(Me(b)),sourcesAnswered:s,sourcesTried:r,failed:a,excluded:i,darkWindow:w,instrumentMix:p,bestPreparable:S,carry:m?.carry??null,breakEvenHorizonHours:v};return il(T)}function nC(e){let t=e.filter(i=>i.instrument==="spot").sort((i,s)=>xt(i.net,s.net))[0],n=e.filter(i=>i.instrument==="perp").sort((i,s)=>xt(i.net,s.net))[0];if(!t||!n||n.fundingHourly===null)return null;let r=Dr(t.net,n.net);if(r.mantissa===0n)return 0;let o=xe(n.fundingHourly,n.price);if(o.mantissa===0n)return null;try{let i=Ue(r,o,4),s=Number(Me(i));return!Number.isFinite(s)||s<0?null:s}catch{return null}}var rC="rh_uniswap",oC=4663,iC="prepare",sC=1n<<192n,Rn=18,aC=Object.freeze({v3:180000n,v4:240000n});function cl(){return Ui()}function cC(e){return{mantissa:e*e*10n**BigInt(Rn)/sC,scale:Rn}}function lC(e){let t=cC(BigInt(e.sqrtPriceX96)),n=e.quote==="USDG"?6:18,r=18;if(e.quoteIsToken0){let o=Ue(xe(t,fe(10n**BigInt(n),0)),fe(10n**BigInt(r),0),Rn);return o.mantissa===0n?null:Ue(B("1"),o,Rn)}return Ue(xe(t,fe(10n**BigInt(r),0)),fe(10n**BigInt(n),0),Rn)}function uC(e){let t=Ny(),n=t.assets[e];return n?fe(n.rawPrice,t.oracleScaleExp):null}function dC(e,t){if(e===null||t===null||e.mantissa<=0n||t.mantissa<=0n)return null;let n={...e};return Ue(t,pC(n,t),Rn)}function pC(e,t){let n=Math.max(e.scale,t.scale);return{mantissa:Br(e,n).mantissa+Br(t,n).mantissa,scale:n}}function mC(e){let t=cl(),n=aC[e];return n?{wei:BigInt(t.gasPriceWei)*n,units:n,native:"ETH"}:null}function ll(){return Object.keys(cl().pools).sort()}function $n({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=cl(),o=r.pools[e];if(!o)return null;let i=lC(o);if(i===null)return null;let s=oe(o.liqUsd),a=n===null?B("0"):n,c=o.feePpm===null||o.feePpm===void 0?null:Ue(fe(BigInt(o.feePpm),0),fe(1000000n,0),8),l=a.mantissa===0n?B("0"):dC(s,a),u=mC(o.version),m={venue:rC,chain:oC,instrument:"spot",tier:iC,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=uC(e);return f!==null&&(m.referencePrice=f,m.referenceBasisBps=Me(Ue(xe(Dr(i,f),fe(10000n,0)),f,4))),Se(m)}function eb({side:e="buy",sizeUsd:t=null}={}){return ll().map(n=>$n({symbol:n,side:e,sizeUsd:t})).filter(n=>n!==null)}var tb=12e4,fC="0x0000000000000000000000000000000000000000",hC="0x84b75b19A3cdf8E2F56d0507d22D442847B2053C";function ul(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=$n({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>tb)throw new Error(`quote is stale (${a}ms old, bound ${tb}ms); re-quote before preparing`);let l=Ui().pools[t],u=l.version==="v4"?hC:fC,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 gC="hyperliquid_hip3",yC="hyperliquid",bC="quote-only";function Hr(){return Ae().venues.hyperliquid_hip3}function nb(){return Object.keys(Hr().dexs).sort()}function wC(){let e=[];for(let[t,n]of Object.entries(Hr().dexs))for(let r of Object.keys(n))e.push(`${t}:${r}`);return e.sort()}function xC(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=Hr().dexs[r]?.[o];return i?[{dex:r,ticker:o,market:i}]:[]}let n=[];for(let[r,o]of Object.entries(Hr().dexs))Object.hasOwn(o,e)&&n.push({dex:r,ticker:e,market:o[e]});return n}function SC(e,t){try{return My().books[`${e}:${t}`]??null}catch{return null}}function EC(e,t,n){if(!e||n===null||n.mantissa<=0n)return null;let r=t==="buy"?e.asks:e.bids;if(!r||r.length===0)return null;let o=Number(Me(n));if(!Number.isFinite(o)||o<=0)return null;let i=0,s=0,a=0;for(let c of r){let l=Number(c.px),u=Number(c.sz);if(!(l>0)||!(u>0))continue;let d=l*u,p=Math.min(o,d),m=p/l;if(i+=p,s+=m,o-=p,a+=1,o<=1e-9)break}return s<=0?null:{vwap:i/s,filledUsd:i,unfilledUsd:Math.max(0,o),levelsUsed:a}}function kC(e,t,n,r){let o=EC(e,t,n);if(!o)return{impact:null,depth:null};let i=Number(Me(r));if(!(i>0))return{impact:null,depth:o};let s=t==="buy"?(o.vwap-i)/i:(i-o.vwap)/i,a=Math.max(0,s);return{impact:oe(Number(a.toPrecision(12))),depth:{...o,impactFraction:a,fullyFilled:o.unfilledUsd<=1e-6}}}function rb({dex:e,ticker:t,market:n,side:r,size:o}){let i=Be(n.mark,`${e}:${t}.mark`),s=oe(n.fundingHourly),a=oe(n.vol24h),c=oe(n.oi),l=o===null?B("0"):o,u=SC(e,t),d=null,p=null,m="fees and gas not captured";if(l.mantissa>0n)if(u){let g=kC(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:gC,chain:yC,instrument:"perp",tier:bC,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=B(String(u.bids[0].px)),h.ask=B(String(u.asks[0].px))),Se(h)}function ob({symbol:e,side:t="buy",sizeUsd:n=null}={}){let r=xC(e);return r.length===0||r.length>1?null:rb({...r[0],side:t,size:n})}function Vi({side:e="buy",sizeUsd:t=null,ticker:n=null}={}){let r=[];for(let o of wC()){let[i,s]=o.split(":");if(n!==null&&s!==n)continue;let a=Hr().dexs[i][s];r.push(rb({dex:i,ticker:s,market:a,side:e,size:t}))}return r}var vC="arcus_spot",AC="robinhood-4663",IC="quote-only";function ib(){return Ae().venues.arcus_spot}function _C(){return Object.keys(ib().pairs).sort()}function PC({symbol:e,side:t="buy",sizeUsd:n=null}={}){if(typeof e!="string"||e.length===0)return null;let r=ib().pairs[e];if(!r)return null;let o=r.bid===void 0||r.bid===null?null:Be(r.bid,`${e}.bid`),i=r.ask===void 0||r.ask===null?null:Be(r.ask,`${e}.ask`),s=oe(r.last),a=null;if(o!==null&&i!==null){a={mantissa:o.mantissa+i.mantissa,scale:o.scale===i.scale?o.scale+1:Math.max(o.scale,i.scale)+1};let d=Math.max(o.scale,i.scale),p=o.scale===d?o.mantissa:o.mantissa*10n**BigInt(d-o.scale),m=i.scale===d?i.mantissa:i.mantissa*10n**BigInt(d-i.scale);a={mantissa:p+m,scale:d+1},a={mantissa:(p+m)/2n,scale:d}}else s!==null&&(a=s);if(o===null&&i===null&&a===null)return null;let c=n===null?B("0"):n,l=B("0"),u={venue:vC,chain:AC,instrument:"spot",tier:IC,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 zi({side:e="buy",sizeUsd:t=null}={}){return _C().map(n=>PC({symbol:n,side:e,sizeUsd:t})).filter(n=>n!==null)}var CC="solana_xstocks",TC="solana",NC="quote-only",sb=25e3;function Wi(){return $y()}function dl(){return Object.keys(Wi().tokens).sort()}function OC(e){let t=Wi().pairs[e];return!t||t.length===0?null:[...t].sort((n,r)=>(r.liquidityUsd??0)-(n.liquidityUsd??0))[0]}function RC(e,t){if(e===null||t===null)return null;if(e.mantissa<=0n||t.mantissa<=0n)return B("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 pl({symbol:e,side:t="buy",sizeUsd:n=null}={}){if(typeof e!="string"||e.length===0)return null;let r=e,o=e,i=Wi().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=OC(r);if(!s||!a)return null;let c=Be(a.priceUsd,`${r}.priceUsd`),l=oe(a.liquidityUsd),u=n===null?B("0"):n,d=u.mantissa===0n?B("0"):RC(l,u),p=!1;u.mantissa===0n&&(a.liquidityUsd??0)>=sb&&(p=!1);let m={venue:CC,chain:TC,instrument:"spot",tier:NC,symbolRaw:o,symbol:r,side:t,requestedSize:u,mid:c,fees:null,gasEstimate:null,priceImpact:d,fundingHourly:null,costAccounted:p,capturedAt:Wi().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)<sb}};return Se(m)}function ab({side:e="buy",sizeUsd:t=null}={}){return dl().map(n=>pl({symbol:n,side:e,sizeUsd:t})).filter(n=>n!==null)}var $C="ton_stonfi",LC="ton",MC="quote-only",UC=25e3,BC=.01;function Gi(){return Ly()}function ml(){return Object.keys(Gi().tokens).sort()}function DC(e){let t=Gi().pairs[e];return!t||t.length===0?null:[...t].sort((n,r)=>(r.liquidityUsd??0)-(n.liquidityUsd??0))[0]}function FC(e,t){if(e===null||t===null)return null;if(e.mantissa<=0n||t.mantissa<=0n)return B("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 fl({symbol:e,side:t="buy",sizeUsd:n=null}={}){if(typeof e!="string"||e.length===0)return null;let r=e,o=e,i=Gi().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=DC(r);if(!s||!a)return null;let c=Be(a.priceUsd,`${r}.priceUsd`),l=oe(a.liquidityUsd),u=n===null?B("0"):n,d=u.mantissa===0n?B("0"):FC(l,u),m={venue:$C,chain:LC,instrument:"spot",tier:MC,symbolRaw:o,symbol:r,side:t,requestedSize:u,mid:c,fees:null,gasEstimate:null,priceImpact:d,fundingHourly:null,costAccounted:!1,capturedAt:Gi().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)<UC,impactSizeFractionHint:BC}};return Se(m)}function cb({side:e="buy",sizeUsd:t=null}={}){return ml().map(n=>fl({symbol:n,side:e,sizeUsd:t})).filter(n=>n!==null)}var lb=3600*1e3;function hl(e){return e==null||e===""?null:typeof e=="object"&&e&&typeof e.mantissa=="bigint"?e:B(String(e))}function ub(e,{sizeUsd:t=null}={}){if(typeof e!="string"||!e.trim())throw new TypeError("ticker is required");let n=e.trim().toUpperCase(),r=hl(t),o=[],i=ob({symbol:`xyz:${n}`,sizeUsd:r});if(i)o.push(i);else for(let l of Vi({ticker:n,sizeUsd:r}))o.push(l);for(let l of ji({sizeUsd:r}))l.symbol===n&&o.push(l);for(let l of zi({sizeUsd:r}))l.symbol===n&&o.push(l);let s=$n({symbol:n,sizeUsd:r});s&&o.push(s);let a=pl({symbol:n,sizeUsd:r});a&&o.push(a);let c=fl({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=hl(e.sizeUsd??e.size??null),r=ub(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=al(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>lb}}function HC(){let e=[{venue:"hyperliquid_hip3",tier:"quote-only",chain:"hyperliquid",n:Vi().length},{venue:"arcus_perp",tier:"quote-only",chain:"robinhood-4663",n:ji().length},{venue:"arcus_spot",tier:"quote-only",chain:"robinhood-4663",n:zi().length},{venue:"rh_uniswap",tier:"prepare",chain:4663,n:ll().length},{venue:"solana_xstocks",tier:"quote-only",chain:"solana",n:dl().length},{venue:"ton_stonfi",tier:"quote-only",chain:"ton",n:ml().length}],t=[...Vi(),...ji(),...zi(),...eb(),...ab(),...cb()],n=(t[0]?.capturedAt??Date.now())+1e3,{survivors:r,excluded:o}=Fi(t,{nowMs:n});return{inventory:e,hip3Dexs:nb(),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 jC(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=hl(e.sizeUsd??e.size??null),o=$n({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=ul({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>lb}}catch(i){return{ok:!1,failureKind:"prepare-refused",ticker:t,error:String(i.message||i)}}}function VC(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"}),zC=5e3,WC=1500;function GC(e,t){return t===0n?null:Number((t-e)*10000n/t)}function KC(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 mb(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=KC(e.amountIn,"amountIn"),s;try{s=await t.quote({chainId:o,inputMint:r,outputMint:n,amount:i.toString(),side:"buy"})}catch(p){return kt(ue.UNKNOWN,`buy leg could not be quoted: ${pb(p)}`,{chainId:o,token:n,base:r})}let a=db(s?.outAmount);if(a==null||a===0n)return kt(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 kt(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=db(c?.outAmount);if(l==null||l===0n)return kt(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=GC(l,i),d={chainId:o,token:n,base:r,amountIn:i.toString(),tokensOut:a.toString(),roundTripOut:l.toString(),roundTripLossBps:u};return u==null?kt(ue.UNKNOWN,"could not compute round-trip loss",d):u>=zC?kt(ue.HONEYPOT,`round trip loses ${(u/100).toFixed(1)}% \u2014 a sell tax or rigged curve, not normal slippage`,d):u>=WC?kt(ue.CAUTION,`round trip loses ${(u/100).toFixed(1)}% \u2014 high tax or thin liquidity`,d):kt(ue.SAFE,`round trip loses ${(u/100).toFixed(1)}% \u2014 exit path looks normal`,d)}function kt(e,t,n){return{status:e,safe:e===ue.SAFE,tradable:e===ue.SAFE||e===ue.CAUTION,reason:t,...n}}function db(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 YC(e={},t={}){let n=await mb(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 vt=Object.freeze({ALERT_ONLY:"alert_only",EXECUTE:"execute"}),XC=new Set(["watch","watch this","ping","ping me","alert","notify"]),QC=new Set(["watching","armed"]);function fb(e){if(typeof e!="string"||!e.trim())throw new TypeError("explicit action verb required");let t=e.trim().toLowerCase().replace(/\s+/g," ");if(XC.has(t))return vt.ALERT_ONLY;if(t==="arm")return vt.EXECUTE;throw new TypeError(`unsupported action verb: ${t}`)}function JC(e={}){let{verb:t,...n}=e;return{...n,active:!0,actionMode:fb(t)}}function ZC(e){if(!e||typeof e!="object"||typeof e.active!="boolean")throw new TypeError("active must be boolean");if(!Object.values(vt).includes(e.actionMode))throw new TypeError("actionMode must be alert_only or execute");return e}function eT(e){return e?.active===!0&&e?.actionMode===vt.ALERT_ONLY}function tT(e){return e?.active===!0&&e?.actionMode===vt.EXECUTE}function nT(e={}){if(e.actionMode!==void 0&&e.actionMode!==vt.ALERT_ONLY)throw new TypeError("non-alert record cannot enter alert-only watch migration");let t=typeof e.active=="boolean"?e.active:QC.has(String(e.status||"").toLowerCase());return{...e,active:t,actionMode:vt.ALERT_ONLY}}import{createHash as rT}from"node:crypto";var gl=1,hb=Object.freeze(["chainId","agentAddress","accountAddress","actions","targets","maxValueWei","maxGasWei","maxSlippageBps","expiresAt","nonce","revocationKey"]),oT=Object.freeze(["read","simulate"]),gb=1e4,yb=1440*60,bb=128,wb=256,xb=64,Sb=256,Eb=/^0x[0-9a-fA-F]{40}$/,iT=/^[a-z][a-z0-9_-]*:[a-z0-9._-]+$/,sT=/^[a-z][a-z0-9_-]*:\*$/,aT=/^[A-Za-z0-9._:-]+$/,cT=/^[A-Za-z0-9._:-]+$/,kb=/^(0|[1-9][0-9]*)$/,jr=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 lT(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function uT(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 kb.test(t)?t:null}return null}function Ln(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(!kb.test(t))return null;let n=Number(t);return Number.isSafeInteger(n)?n:null}return null}function vb(e){let t=String(e).split(":")[0];return oT.includes(t)}function Ab(e,t={}){let n=[],r=(d,p)=>n.push({field:d,message:p});if(!lT(e))return r("grant","grant must be a plain object"),{ok:!1,errors:n,grant:null};for(let d of Object.keys(e))hb.includes(d)||r(d,"unknown field is not allowed");for(let d of hb)(!(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=Ln(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"||!Eb.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>xb)r("actions",`too many actions (max ${xb})`);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&&sT.test(m)?d.push(m):r("actions",`broad wildcard action "${m}" is rejected (fail closed)`);continue}if(!iT.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>Sb)r("targets",`too many targets (max ${Sb})`);else{let d=[];for(let p of e.targets){let m=typeof p=="string"?p.trim():null;if(!m||!Eb.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=>!vb(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=uT(e[d]);p==null?r(d,"must be a non-negative integer wei amount"):o[d]=p}let s=Ln(e.maxSlippageBps);s==null||s>gb?r("maxSlippageBps",`must be an integer between 0 and ${gb}`):o.maxSlippageBps=s;let a=864e10,c=Ln(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=Ln(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>yb&&r("expiresAt",`grant exceeds the hard 24-hour TTL (${yb} seconds)`)}let l=typeof e.nonce=="string"?e.nonce.trim():Ln(e.nonce)!=null?String(Ln(e.nonce)):null;!l||l.length>bb||!aT.test(l)?r("nonce",`must be a non-empty string (max ${bb} chars, [A-Za-z0-9._:-])`):o.nonce=l;let u=typeof e.revocationKey=="string"?e.revocationKey.trim():null;return!u||u.length>wb||!cT.test(u)?r("revocationKey",`must be a non-empty public identifier (max ${wb} chars, [A-Za-z0-9._:-])`):o.revocationKey=u,n.length?{ok:!1,errors:n,grant:null}:{ok:!0,errors:[],grant:o}}function yl(e,t={}){let{ok:n,errors:r,grant:o}=Ab(e,t);if(!n)throw new jr(r);return o}function bl(e,t={}){let n=yl(e,t),o=Object.keys(n).sort().map(i=>`${JSON.stringify(i)}:${JSON.stringify(n[i])}`);return`{"version":${gl},${o.join(",")}}`}function Ib(e,t={}){return rT("sha256").update(bl(e,t),"utf8").digest("hex")}var _b=new Set(["read:markets","read:nfts","read:positions","watch:contracts","prepare:trade","prepare:mint","prepare:build","build:factory","agent:shadow","agent:execute"]),dT="agent:execute",pT="build:factory",Pb=["read:markets","read:nfts","read:positions","watch:contracts","prepare:trade","prepare:mint","prepare:build","agent:shadow"];function mT(e){let t=Array.isArray(e)&&e.length?e:Pb,n=[...new Set(t.map(o=>String(o).trim()).filter(Boolean))],r=n.filter(o=>!_b.has(o));if(r.length)throw new Error(`Invalid scope: ${r.join(", ")}`);return n}var Cb=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 Tb(){return Cb.filter(e=>e.website)}var fT="@oracle-agent/oracle",hT="npx",gT=["-y","--package",fT,"oracle-data-mcp"],Ob=/(?:^|_)(?:PRIVATE_KEY|SECRET|TOKEN|PASSWORD|PASSPHRASE|MNEMONIC|SEED)(?:_|$)/i;function xl(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 yT(e){let t=xl(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(Ob.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 bT(e){let t=xl(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 wT(e){let t=xl(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(Ob.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 wl(e){return JSON.stringify(e)}function Vr(e){return JSON.stringify(e)}function Nb(e,t){return["mcp_servers:",` ${e}:`,` command: ${wl(t.command)}`," args:",...t.args.map(n=>` - ${wl(n)}`)," env:",...Object.entries(t.env).map(([n,r])=>` ${n}: ${wl(r)}`),""].join(`
60
- `)}function xT(e,t){return[`[mcp_servers.${Vr(e)}]`,`command = ${Vr(t.command)}`,`args = [${t.args.map(Vr).join(", ")}]`,"",`[mcp_servers.${Vr(e)}.env]`,...Object.entries(t.env).map(([n,r])=>`${n} = ${Vr(r)}`),""].join(`
61
- `)}function ST(){return["# Oracle native harness (default)","npm i -g @oracle-agent/oracle","oracle setup model","oracle chat",""].join(`
62
- `)}function Rb({url:e,key:t,label:n="oracle-data"}={}){let r=yT(e),o=bT(t),i=wT(n),s={command:hT,args:[...gT],env:{ORACLE_DATA_URL:r,ORACLE_AGENT_KEY:o}},a={mcpServers:{[i]:s}},c={hermes:Nb(i,s),claudeCode:Ie(a),codex:xT(i,s),cursor:Ie(a),genericMcp:Ie(a),oracleNative:ST(),chatgpt:Ie(a),claudeDesktop:Ie(a),windsurf:Ie(a),vscode:Ie(a),openclaw:Ie(a),perplexity:Ie(a),manus:Ie(a),prime:Nb(i,s),opencode:Ie(a)};for(let l of Tb()){if(l.kind==="oracle")continue;let u=l.configKey||l.id;c[u]||(c[u]=Ie(a))}return c}var ET=Rb;var $b=Object.freeze({assetHighPct:50,assetMediumPct:25,chainHighPct:75,venueHighPct:60,stablecoinHighPct:70}),kT=new Set(["USDC","USDT","USDT0","DAI","FRAX","LUSD","TUSD","USDP","GUSD","PYUSD","USDE"]);function Lb(e){if(e===null||e===""||e===void 0)return null;let t=Number(e);return Number.isFinite(t)&&t>=0?t:null}function zr(e){return Math.round((e+Number.EPSILON)*1e8)/1e8}function El(e,t){return t>0?zr(e/t*100):null}function kl(e){return e.address||e.owner||e.walletAddress||e.wallet?.address||null}function vT(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 zt(e,t,n={}){if(!t||typeof t!="object")return;let r=String(t.symbol??t.coin??t.name??t.collection??t.tokenId??"unknown"),o=Lb(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||kT.has(r.toUpperCase())})}function AT(e){let t=[],n=kl(e);for(let r of e.assets||e.holdings||[])zt(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)&&zt(t,{...r.native,symbol:r.native.symbol??r.symbol??o},i);for(let a of r.assets||r.fungibleTokens?.assets||[])zt(t,a,i);for(let a of r.collectibles?.assets||r.nfts||[])zt(t,{...a,kind:"nft"},i);for(let a of r.spot?.balances||[])zt(t,a,{...i,venue:"Hyperliquid spot"});let s=Lb(r.perps?.accountValueUsd);s!=null&&zt(t,{symbol:"perps account",usdValue:s},{...i,venue:"Hyperliquid perps"})}for(let r of e.inventory?.items||e.nfts?.items||[])zt(t,{...r,kind:"nft"},{address:n,chain:r.chain??e.chain,venue:r.marketplace??e.venue});return t}function IT(e,t){let n=kl(e),r=e.chain??e.chainId??e.family??"*";return n?`${String(n).toLowerCase()}|${String(r).toLowerCase()}`:`snapshot:${t}`}function Sl(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:zr(i),percentOfKnown:El(i,n)})).sort((o,i)=>i.knownUsd-o.knownUsd||o.name.localeCompare(i.name))}function Ki(e={},t={}){let n=Array.isArray(e)?e:Array.isArray(e.snapshots)?e.snapshots:e.snapshot?[e.snapshot]:[],r=vT(t.labels??t.addressBook??e.labels??e.addressBook),o={...$b,...e.thresholds||{},...t.thresholds||{}},i=[],s=new Set,a=0;n.forEach((k,q)=>{if(!k||typeof k!="object")return;let ge=IT(k,q);s.has(ge)?a+=1:(s.add(ge),i.push(k))});let c=i.flatMap(AT),l=c.filter(k=>k.usdValue!=null),u=c.filter(k=>k.usdValue==null),d=i.reduce((k,q)=>k+Number(q.valuation?.unpricedNonzeroItems||q.unpricedNonzeroItems||0),0),p=zr(l.reduce((k,q)=>k+q.usdValue,0)),m=u.length+d,f=Sl(l,"chain",p),h=Sl(l,"venue",p),g=Sl(l,"symbol",p);for(let k of f)k.chain=k.name;for(let k of h)k.venue=k.name;for(let k of g)k.asset=k.name,k.symbol=k.name;let b=zr(l.filter(k=>k.stablecoin).reduce((k,q)=>k+q.usdValue,0)),S=c.filter(k=>k.kind==="nft"),x=i.reduce((k,q)=>k+Number(q.valuation?.nftUnvaluedItems||0),0),w=S.filter(k=>k.usdValue==null).length+x,v=S.filter(k=>k.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(kl).filter(Boolean).map(k=>{let q=r.get(String(k).toLowerCase());return{address:k,label:q?.label??null,who:q?.who??null,role:q?.role??null}});return{totalKnownUsd:p,coverage:{complete:i.length>0&&m===0&&i.every(k=>k.valuation?.complete!==!1&&k.coverage?.complete!==!1),label:m===0&&i.length&&i.every(k=>k.valuation?.complete!==!1&&k.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:El(b,p),high:p>0&&El(b,p)>=o.stablecoinHighPct},nftCoverage:{status:S.length||x?w?"partial":"valued":"not-observed",valuedItems:v,unvaluedItems:w,knownUsd:zr(S.filter(k=>k.usdValue!=null).reduce((k,q)=>k+q.usdValue,0))},addresses:_,warnings:[...new Set(R)]}}var _T=Ki;var de=(e,t=0)=>Number.isFinite(Number(e))?Number(e):t,De=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,Ub=e=>e.address??e.owner??e.account,Xi=e=>[re(e.chain??e.chainId),re(Ub(e)),re(Ye(e)),re(e.source)].join("|");function Mb(e){return de(e.asOf??e.updatedAt??e.timestamp,0)}function PT(e){let t=e.fillId??e.tradeId??e.orderId??e.txHash??e.transactionHash??e.timestamp??e.asOf;return[Xi(e),re(t),re(e.side),de(e.quantity??e.amount??e.size),de(e.price??e.priceUsd)].join("|")}function Yi(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"?PT(o):Xi(o);n.has(i)?(r+=1,t!=="fill"&&Mb(o)>Mb(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 CT(e){let t=new Map;for(let n of e){let r=[Xi(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 TT(e,t){return t.get(Xi(e))??t.get(`${re(e.chain??e.chainId)}|${re(Ye(e))}`)??t.get(`*|${re(Ye(e))}`)??null}function NT(e){let t=new Map,n=0;for(let r of e){let o=[re(r.chain??r.chainId),re(Ub(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:De(n),lots:t}}function vl(e={},t={}){let n=de(t.asOf??e.asOf,0),r=Math.max(0,de(t.priceTtlMs??e.priceTtlMs,6e4)),o=Yi(e.balances||[],"balance"),i=Yi(e.positions||[],"position"),s=Yi(e.fills||[],"fill"),a=Yi(e.prices||[],"price"),c=CT(a.rows),l=[],u=0,d=0;for(let _ of[...o.rows,...i.rows]){let k=TT(_,c),q=de(_.quantity??_.amount??_.size),ge=k?de(k.priceUsd??k.price,NaN):de(_.priceUsd,NaN);if(!Number.isFinite(ge)){d+=1;continue}let Ce=q*ge,qn=de(k?.asOf??_.priceAsOf,0),Kt=n-qn>r;Kt&&(u+=Math.abs(Ce)),l.push({..._,quantity:q,priceUsd:ge,valueUsd:Ce,stale:Kt,kind:i.rows.includes(_)?"position":"balance"})}let p=l.filter(_=>_.kind==="balance").reduce((_,k)=>_+k.valueUsd,0),m=l.filter(_=>_.kind==="position"),f=m.reduce((_,k)=>_+k.valueUsd,0),h=m.reduce((_,k)=>_+Math.abs(k.valueUsd),0),g=p+f,b=de(e.equityUsd,g),S=NT(s.rows).realizedPnlUsd,x=m.reduce((_,k)=>{let q=de(k.entryPriceUsd??k.averageEntryPrice??k.costBasisPrice,k.priceUsd);return _+k.quantity*(k.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((_,k)=>_+k,0),T=[...w].map(([_,k])=>({asset:_,exposureUsd:De(k),percent:v?De(k/v*100):null})).sort((_,k)=>k.exposureUsd-_.exposureUsd||_.asset.localeCompare(k.asset)),I=l.reduce((_,k)=>_+Math.abs(k.valueUsd),0),R=Ki({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:S,unrealizedUsd:De(x),totalUsd:De(S+x)},exposure:{grossUsd:De(h),netUsd:De(g),leverage:b>0?De(h/b):null,equityUsd:De(b)},concentration:T,priceCoverage:{pricedItems:l.length,unpricedItems:d,staleItems:l.filter(_=>_.stale).length,staleValueUsd:De(u),stalePercent:I?De(u/I*100):null,ttlMs:r},risk:R})}var OT=vl,RT=vl;import{createHash as BT}from"node:crypto";var Wr=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}},$T=/(private[_-]?key|secret|bearer|keystore|mnemonic|seed[_-]?phrase|passphrase|password|api[_-]?key|access[_-]?token|auth[_-]?token|session[_-]?token|signer[_-]?url|signature)/i,LT=Object.freeze(["privkey","wif","xprv","seed"]);function Bb(e){let t=String(e),n=t.toLowerCase().replace(/[\s._-]+/g,"");return $T.test(t)||LT.includes(n)}var MT=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}]),UT=Object.freeze(["grantid","id","hash","sha256","sha256hex","checksum","txhash","transactionhash","blockhash","digest","userophash","commithash","prevhash","intenthash","canonicalhash","payloadhash","requestid"]);function Wt(e,t="$",n=new Set,r=""){if(e==null)return e;if(typeof e=="string"){let o=UT.includes(String(r).toLowerCase().replace(/[_-]/g,""));for(let{rule:i,re:s}of MT)if(!(o&&i.startsWith("raw-32-byte-hex"))&&s.test(e))throw new Wr(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"&&Bb(o))throw new Wr(`${t}[${JSON.stringify(o)}]`,"forbidden-key-name");Wt(o,`${t}[key]`,n),Wt(i,`${t}[${String(o)}]`,n)}return e}if(e instanceof Set){let o=0;for(let i of e.values())Wt(i,`${t}[${o++}]`,n);return e}if(Array.isArray(e))return e.forEach((o,i)=>Wt(o,`${t}[${i}]`,n)),e;for(let[o,i]of Object.entries(e)){if(Bb(o))throw new Wr(`${t}.${o}`,"forbidden-key-name");Wt(i,`${t}.${o}`,n,o)}return e}var Qi=Object.freeze(["intent","quote_comparison","simulation","prepared","approval","signed","broadcast","settlement","balance_delta","position"]),Il=Object.freeze(Object.fromEntries(Qi.map((e,t)=>[e,Object.freeze(t+1<Qi.length?[Qi[t+1]]:[])]))),Db=new Set(["signed","broadcast"]);function Al(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(Al).join(",")}]`:`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${Al(e[t])}`).join(",")}}`}function DT(e){return e===void 0?null:JSON.parse(JSON.stringify(e))}function Ji(e){if(e&&typeof e=="object"&&!Object.isFrozen(e)){Object.freeze(e);for(let t of Object.values(e))Ji(t)}return e}function _l(e,t="fact"){try{Wt(e,t)}catch{throw new Error(`${t} contains custody material and is forbidden`)}}function Fb(e){return BT("sha256").update(Al(e)).digest("hex")}function qb({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:DT(n)};return Ji({...s,hash:Fb(s)})}function FT({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");_l(t,"intent");let r=qb({tradeId:e,state:"intent",fact:t,asOf:n,previousHash:null,external:!1});return Ji({tradeId:e,state:"intent",events:[r],headHash:r.hash,custody:"none",execution:"prepare-only"})}function Hb(e,t,n,r={}){if(Pl(e),!(Il[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`);_l(n,t);let i=r.external===!0||r.externallySupplied===!0;if(Db.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=qb({tradeId:e.tradeId,state:t,fact:n,asOf:a,previousHash:s.hash,external:i});return Ji({...e,state:t,events:[...e.events,c],headHash:c.hash})}function Pl(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(Fb(i)!==o)throw new Error(`trade event ${n} hash mismatch`);if(_l(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&&!Il[t.state]?.includes(r.state))throw new Error(`invalid recorded transition ${t.state} -> ${r.state}`);if(Db.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=Hb,HT=Pl;function jT(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 VT(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 Zi(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 Cl(e,t={}){let n=jT(e),r=Zi(t.concurrency,4,"concurrency",1,!0),o=Zi(t.timeoutMs,5e3,"timeoutMs",Number.EPSILON),i=Zi(t.asOf,Date.now(),"asOf",Number.NEGATIVE_INFINITY),s=Zi(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 VT(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 zT=Cl,WT=Cl;import{createHash as GT}from"node:crypto";var Tl=1,Jb=/^[a-z0-9][a-z0-9._-]{0,63}$/,Zb=/^[A-Za-z0-9][A-Za-z0-9._-]{0,63}$/,KT=new Set(["open","high","low","close","volume","fundingRate","openInterest"]),YT=new Set(["sma","ema","rsi","macd","bollinger","atr"]),XT=new Set(["gt","gte","lt","lte","eq"]),QT=new Set(["and","or","not"]),JT=new Set(["above","below"]),ZT=new Set(["line","signal","histogram"]),eN=new Set(["upper","middle","lower"]),Nl=new Set(["compare","logic","cross"]),jb=new Set(["version","id","name","venue","market","parameters","nodes","rules","risk"]),Vb=new Set(["value","min","max","step"]),Ol=new Set(["entryLong","entryShort","exitLong","exitShort"]),zb=new Set(["maxLeverage","maxNotionalUsd","positionSizePct","stopLossPct","takeProfitPct","cooldownBars","maxDailyLossPct","expiresAt"]),tN=new Set(["id","type"]),Wb={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"])},Gb=16,Kb=128,Yb=100,Mn=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 Xb(e){return Number.isInteger(e)&&e>0}function $l(e){if(e==null||typeof e!="object"||Object.isFrozen(e))return e;if(Array.isArray(e)){for(let t of e)$l(t);return Object.freeze(e)}for(let t of Object.keys(e))$l(e[t]);return Object.freeze(e)}function Ll(e){if(Array.isArray(e))return e.map(Ll);if(e!=null&&typeof e=="object"){let t={};for(let n of Object.keys(e).sort())t[n]=Ll(e[n]);return t}return e}function A(e,t,n){e.push({path:t,message:n})}function At(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 ew(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 Rl(e,t,n,r){if(_e(e)){if(At(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(Xb)?(A(r,`${t}.param`,"referenced period parameter value min max and step must be positive integers"),null):{param:e.param}}return Xb(e)?e:(A(r,t,"must be a positive integer or {param}"),null)}function Qb(e,t,n,r){return _e(e)?(At(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 es(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 nN(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 es(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 rN(e,t){if(!_e(e))return A(t,"parameters","must be a plain object"),null;let n=Object.keys(e);if(n.length>Gb)return A(t,"parameters",`too many parameters (max ${Gb})`),null;let r={};for(let o of n){if(!Jb.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}At(i,Vb,s,t);for(let d of Vb)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&&(ew(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 oN(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"||!Wb[e.type])return A(r,`${o}.type`,"unknown or missing node type"),At(e,tN,o,r),null;switch(At(e,Wb[e.type],o,r),(typeof e.id!="string"||!Zb.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"||!KT.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=Qb(e.value,`${o}.value`,n,r);return{id:e.id,type:"constant",value:i}}case"indicator":{(typeof e.indicator!="string"||!YT.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=Rl(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=Rl(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=Rl(e[a],`${o}.${a}`,n,r);c!=null&&(s[a]=c)}"output"in e?ZT.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=Qb(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?eN.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"||!XT.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"||!QT.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"||!JT.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 iN(e,t,n){if(!_e(e))return A(t,"risk","must be a plain object"),null;At(e,zb,"risk",t);for(let p of zb)(!(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 sN(e,t={}){let n=[];if(!_e(e))return A(n,"","strategy must be a plain object"),{ok:!1,errors:n,strategy:null};At(e,jb,"",n);for(let d of jb)(!(d in e)||e[d]==null)&&A(n,d,"required field is missing");e.version!==Tl&&A(n,"version",`must be ${Tl}`),(typeof e.id!="string"||!Jb.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>Yb)&&A(n,"name",`must be a non-empty string max ${Yb}`);let r=ts(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=rN(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>Kb)A(n,"nodes",`too many nodes (max ${Kb})`);else{s=[];for(let d=0;d<e.nodes.length;d++){let p=oN(e.nodes[d],d,i||{},n);p&&(typeof p.id=="string"&&Zb.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 es(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 es(p)){let h=a.get(f);h&&Nl.has(h.type)&&A(n,m,`node ref "${f}" must be numeric`)}if(p.type==="logic")for(let f of es(p)){let h=a.get(f);h&&!Nl.has(h.type)&&A(n,m,`node ref "${f}" must be boolean`)}}nN(a)&&A(n,"nodes","graph contains a cycle")}let c=null;if(!_e(e.rules))A(n,"rules","must be a plain object");else{At(e.rules,Ol,"rules",n);for(let d of Ol)d in e.rules||A(n,`rules.${d}`,"required field is missing");c={};for(let d of Ol){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);Nl.has(m.type)||A(n,`rules.${d}`,`rule must reference a boolean node, not ${m.type}`),c[d]=p}}let l=iN(e.risk,n,t);if(n.length)return{ok:!1,errors:n,strategy:null};let u=$l({version:Tl,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=sN(e,t);if(!n.ok)throw new Mn(n.errors);return n.strategy}function aN(e){let t=tt(e);return JSON.stringify(Ll(t))}function Ml(e){let t=aN(e);return GT("sha256").update(t,"utf8").digest("hex")}function tw(e,t){if(!_e(e))throw new Mn([{path:"",message:"strategy must be a plain object"}]);if(!_e(t))throw new Mn([{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(!ew(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 Mn(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 Gr(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 It(e){if(!Number.isInteger(e)||e<=0)throw new TypeError("period must be a positive integer")}function cN(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 rw(e,t){Gr(e),It(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 ns(e,t){Gr(e),It(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 ow(e,t){Gr(e),It(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]=nw(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]=nw(i,s)}return n}function nw(e,t){return e===0&&t===0?50:t===0?100:e===0?0:100-100/(1+e/t)}function iw(e,t={}){Gr(e);let n=t.fastPeriod,r=t.slowPeriod,o=t.signalPeriod;if(It(n),It(r),It(o),n>=r)throw new TypeError("fastPeriod must be < slowPeriod");let i=ns(e,n),s=ns(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 sw(e,t={}){Gr(e);let n=t.period,r=t.stdDev;if(It(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 aw(e,t){cN(e),It(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 lN}from"node:crypto";var Ul=2,uN="93f9c998260e73756c13871dc1a84dd6cdb26ec6113bd1941f023519939db440",dN="68f5b412a9975f04024cf9b9b6209b4bccedd52f176e95f34f786b3f53479c6a",pN="f197a38ff1c0f4ebe13326db8cbb8167ea3dd5d62e6033fe97c2fee8d23d96b5",cw=lN("sha256").update(JSON.stringify({version:Ul,compilerSourceHash:uN,indicatorsSourceHash:dN,schemaSourceHash:pN})).digest("hex");var rs=Ul,Bl=cw,mN=Object.freeze({open:"o",high:"h",low:"l",close:"c",volume:"v",fundingRate:"fundingRate",openInterest:"openInterest"}),fN=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 Fe(e){return typeof e=="number"&&Number.isFinite(e)}function hN(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 Un(e,t){return e!=null&&typeof e=="object"&&"param"in e?t[e.param].value:e}function gN(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(!Fe(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(!Fe(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!==fN[n])throw new TypeError(`bars t must match ${n} cadence`)}if(r=s,"fundingRate"in i&&i.fundingRate!=null&&!Fe(i.fundingRate))throw new TypeError(`bars[${o}].fundingRate must be finite when present`);if("openInterest"in i&&i.openInterest!=null){if(!Fe(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 Gt(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=mN[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=Un(s.value,n);a=new Array(o+1).fill(c);break}case"indicator":{let c=s.period!=null?Un(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=aw(d,c);break}let u=Gt(s.input,t,n,r,o,i).map((d,p)=>{if(d==null||!Fe(d))throw new TypeError(`indicator input ${s.input} has non-finite value at ${p}`);return d});if(s.indicator==="sma")a=rw(u,c);else if(s.indicator==="ema")a=ns(u,c);else if(s.indicator==="rsi")a=ow(u,c);else if(s.indicator==="macd")a=iw(u,{fastPeriod:Un(s.fastPeriod,n),slowPeriod:Un(s.slowPeriod,n),signalPeriod:Un(s.signalPeriod,n)})[s.output];else if(s.indicator==="bollinger")a=sw(u,{period:c,stdDev:Un(s.stdDev,n)})[s.output];else throw new Error(`unsupported indicator ${s.indicator}`);break}case"compare":{let c=Gt(s.left,t,n,r,o,i),l=Gt(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||!Fe(d)||!Fe(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=>Gt(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=Gt(s.left,t,n,r,o,i),l=Gt(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||!Fe(d)||!Fe(p)||!Fe(m)||!Fe(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 Dl(e,t={}){let n=tt(e);t&&Object.keys(t).length&&(n=tw(n,t));let r=new Map(n.nodes.map(m=>[m.id,m])),o=Object.freeze(hN(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=Ml(n);function l(m,f){let h={};for(let b of o){let S=m.get(b);h[b]=S[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){gN(m,f,n.market.interval);let h=new Map;for(let g of o)Gt(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:rs,compilerHash:Bl,requiredSeries:a,nodeOrder:o,evaluate:d,evaluateAll:p})}import{createHash as yN}from"node:crypto";var l3=Object.freeze({initialEquityUsd:1e4,takerFeeBps:3.5,builderFeeBps:2,slippageBps:2,latencyBars:1,maxVolumeParticipationPct:100});var bN=Object.freeze(["fail","pass_paper_only","pass_live_eligible"]);function _t(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function Kr(e){return typeof e=="number"&&Number.isFinite(e)}function Bn(e){if(Array.isArray(e))return e.map(Bn);if(e!=null&&typeof e=="object"){let t={};for(let n of Object.keys(e).sort())t[n]=Bn(e[n]);return t}return e}function lw(e){if(!_t(e))throw new TypeError("evidence artifact must be a plain object");if(!bN.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(!_t(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(!_t(e.walkForward)||!Array.isArray(e.walkForward.windows))throw new TypeError("evidence artifact walkForward windows required");if(e.status==="pass_live_eligible"&&(!_t(e.train)||!_t(e.holdout)))throw new TypeError("live-eligible evidence artifact requires train and holdout facts");return Bn({barsHash:e.barsHash,compilerHash:e.compilerHash,flags:e.flags.map(t=>Bn(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 wN(e){return yN("sha256").update(JSON.stringify(lw(e)),"utf8").digest("hex")}function qe(e,t,n=0){if(!Number.isInteger(e)||e<n)throw new Error(`${t} must be an integer >= ${n}`);return e}function Fl(e,t){if(!_t(e)||!_t(e.metrics))throw new Error(`${t} metrics required`);let n=qe(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(!Kr(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 xN(e,{maxDailyLossPct:t}={}){let n=e.split,r=qe(n.trainStartIndex,"split.trainStartIndex"),o=qe(n.trainEndIndex,"split.trainEndIndex"),i=qe(n.trainBarCount,"split.trainBarCount",1),s=qe(n.holdoutStartIndex,"split.holdoutStartIndex"),a=qe(n.holdoutEndIndex,"split.holdoutEndIndex"),c=qe(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(!Kr(n.trainFraction)||n.trainFraction<=0||n.trainFraction>=1)throw new Error("split.trainFraction must be in (0,1)");Fl(e.train,"train");let l=Fl(e.holdout,"holdout");if(l.tradeCount<1||l.netPnlUsd<=0||l.profitFactor<=1)throw new Error("live-eligible holdout metrics do not pass");if(Kr(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(!_t(g)||g.index!==h||typeof g.passed!="boolean")throw new Error("walk-forward windows must be ordered and structurally valid");let b=qe(g.trainStartIndex,`walkForward.windows[${h}].trainStartIndex`),S=qe(g.trainEndIndex,`walkForward.windows[${h}].trainEndIndex`),x=qe(g.evalStartIndex,`walkForward.windows[${h}].evalStartIndex`),w=qe(g.evalEndIndex,`walkForward.windows[${h}].evalEndIndex`);if(b!==0||S>=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=Fl({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(Kr(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(!Kr(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 uw(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=lw(e),r=Bn({id:e.id,...n});if(JSON.stringify(Bn(e))!==JSON.stringify(r))throw new Error("evidence artifact contains fields unbound from its deterministic identity");let o=wN(e);if(e.id!==o)throw new Error("evidence.id does not match its deterministic artifact facts digest");return e.status==="pass_live_eligible"&&xN(e,t),e}W();var SN=["privatekey","secretkey","seed","mnemonic","passphrase","password","keystore","keymaterial","apikey","authtoken","accesstoken","refreshtoken","credential","bearer","signature","authorization","xprv","xpriv","wif"];function Yr(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function EN(e){return String(e).toLowerCase().replace(/[^a-z0-9]/g,"")}function Hl(e,t="value"){if(Array.isArray(e)){e.forEach((n,r)=>Hl(n,`${t}[${r}]`));return}if(Yr(e))for(let[n,r]of Object.entries(e)){let o=EN(n);if(SN.some(i=>o.includes(i)))throw new Error(`handoff: forbidden secret-like field at ${t}.${n}`);Hl(r,`${t}.${n}`)}}function ql(e){return typeof e=="number"&&Number.isFinite(e)&&e>0}function dw({strategy:e,evidence:t,shadow:n,caps:r,nowMs:o=Date.now(),env:i=process.env}={}){if(Hl({strategy:e,evidence:t,shadow:n,caps:r},"handoff"),!Yr(e))throw new Error("handoff: strategy required");if(!Yr(t))throw new Error("handoff: evidence required");if(!Yr(n))throw new Error("handoff: shadow required");if(!Yr(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=Dl(s);if(uw(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(!ql(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(!ql(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(!ql(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:rs,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 kN=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 Dn(e,t){let n=Number(e);if(!Number.isFinite(n))throw new TypeError(`${t} must be finite`);return n}function Fn(e,t){if(!Number.isSafeInteger(e)||e<0)throw new TypeError(`${t} must be a non-negative safe integer`);return e}function Xr(e){if(Array.isArray(e))for(let t of e)Xr(t);else if(e&&typeof e=="object")for(let t of Object.values(e))Xr(t);return Object.freeze(e)}function vN(e){let t=kN[e];if(!t)throw new TypeError(`unsupported strategy interval: ${e}`);return t}function AN(e,{endTime:t=Number.MAX_SAFE_INTEGER}={}){if(!Array.isArray(e))throw new TypeError("Hyperliquid candles must be an array");Fn(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=Fn(Number(o.t),`candles[${r}].t`);if(Fn(Number(o.T),`candles[${r}].T`)>t)continue;let a={t:i,o:Dn(o.o,`candles[${r}].o`),h:Dn(o.h,`candles[${r}].h`),l:Dn(o.l,`candles[${r}].l`),c:Dn(o.c,`candles[${r}].c`),v:Dn(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 Xr([...n.values()].sort((r,o)=>r.t-o.t))}function IN(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=Fn(Number(o.time),`funding[${r}].time`);i>t||n.set(i,{time:i,fundingRate:Dn(o.fundingRate,`funding[${r}].fundingRate`)})}return[...n.values()].sort((r,o)=>r.time-o.time)}async function _N({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 Nu({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 IN(o,n)}function PN(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=vN(r);if(e.endTime==null)throw new TypeError("endTime is required for deterministic history");let i=Fn(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):Fn(e.startTime,"startTime");if(a>=i)throw new TypeError("startTime must be before endTime");let[c,l]=await Promise.all([en({coin:n,interval:r,startTime:a,endTime:i},t),_N({coin:n,startTime:a,endTime:i},t)]),u=AN(c,{endTime:i}),d=Xr(PN(u,l,o));return Xr({coin:n,interval:r,range:{startTime:a,endTime:i},bars:d})}var CN=new Set(["1m","3m","5m","15m","30m","1h","2h","4h","8h","12h","1d"]),TN=new Set(["coin","interval"]);function NN(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))TN.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"||!CN.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 ON(e={}){let t=await po(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 mw=Object.freeze({id:"hyperliquid",validateMarket:NN,fetchBars:pw,listMarkets:ON,prepareIntent(e){return dw(e)}});var RN=Object.freeze(["id","validateMarket","prepareIntent"]);function $N(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 RN.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 fw=[mw].map($N),LN=new Map(fw.map(e=>[e.id,e])),MN=Object.freeze([...fw]);function ts(e){return typeof e!="string"?null:LN.get(e)??null}function UN(e){let t=ts(e);if(!t)throw new Error(`unknown strategy venue: ${String(e)}`);return t}var hw=Object.freeze(["price","wallet","risk","execution","security","nft","governance","system"]),BN=new Set(hw);function os(e){if(!BN.has(e))throw new TypeError(`Unknown watch category: ${String(e)}`);return e}function jl(e={}){let t=e.subscribedCategories??[];if(!Array.isArray(t))throw new TypeError("subscribedCategories must be an array");return t}function gw(){return{subscribedCategories:[]}}function DN(e,t){os(t);let n=jl(e);return n.includes(t)?{...e,subscribedCategories:[...n]}:{...e,subscribedCategories:[...n,t]}}function FN(e,t){os(t);let n=jl(e);return{...e,subscribedCategories:n.filter(r=>r!==t)}}function qN({category:e,notify:t=!1,...n}={}){if(os(e),typeof t!="boolean")throw new TypeError("watch notify must be a boolean");return{...n,category:e,notify:t}}function HN(e,t){return!(!t||t.notify!==!0||t.category!==e.category||e.watchId!==void 0&&t.id!==e.watchId)}function yw(e,t=gw(),n){if(!e||typeof e!="object")throw new TypeError("alert must be an object");return os(e.category),jl(t).includes(e.category)?{deliver:!0,reason:"category-subscribed"}:HN(e,n)?{deliver:!0,reason:"watch-opt-in"}:{deliver:!1,reason:"not-subscribed"}}function jN(e,t,n){return yw(e,t,n).deliver}var bw=Object.freeze(["wallet","pool","nft_floor","hl_flow","prediction_market"]),VN=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,is=e=>Math.round(e*1e4)/1e4;function ww(e){let t=String(e?.type??e?.surface??e?.kind??"").toLowerCase();return VN[t]??t}function zN(e,t){return String(e?.id??e?.signalId??e?.asset??e?.market??e?.pool??e?.collection??`${ww(e)}:${t}`)}function Pe(e,t,n,r=!0){!r||n===null||!Number.isFinite(n)||e.push({feature:t,value:is(n)})}function WN(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 GN(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 KN(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 YN(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 XN(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 QN=Object.freeze({wallet:WN,pool:GN,nft_floor:KN,hl_flow:YN,prediction_market:XN});function JN(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 Vl(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=ww(o),a=zN(o,i),c=QN[s],l=[];c&&c(o,l);let u=s==="wallet"?2:s==="pool"?3:2,d=is(ae(l.length/u)),p=l.reduce((x,w)=>x+w.value,0),m=JN(o,a,t),f=m===null?0:ae(m,-1,1)*.35;m!==null&&Pe(l,"shadow_markout",f);let h=is(ae(.5+p+f)),g=m===null?.8:ae(.85+m*.3,.35,1),b=is(ae(d*g)),S=["COLD_INTELLIGENCE_ONLY","NO_HOT_EXECUTION"];return c||S.push("UNSUPPORTED_SIGNAL_TYPE"),d<r&&S.push("LOW_COVERAGE","NO_TRADE"),b<.5&&S.push("LOW_CONFIDENCE","NO_TRADE"),s==="pool"&&(he(o.ageHours??o.poolAgeHours)??1/0)<24&&S.push("NEW_POOL_RISK","NO_TRADE"),m!==null&&m<0&&S.push("NEGATIVE_MARKOUT"),{id:a,type:s,score:h,confidence:b,coverage:d,contributions:l,flags:[...new Set(S)],noTrade:S.includes("NO_TRADE"),executionAllowed:!1}}).sort((o,i)=>i.score-o.score||i.confidence-o.confidence||o.id.localeCompare(i.id))}function xw(e={}){return Object.freeze({score(t,n=[],r={}){return Vl(t,n,{...e,...r})}})}import{mkdir as ZN,chmod as ss,readFile as eO,rename as tO,writeFile as nO}from"node:fs/promises";import{homedir as rO}from"node:os";import{dirname as Sw,join as zl}from"node:path";import oO from"sql.js";var ls=Object.freeze(["project","entity","source","thesis","strategy","simulation","prepared_action","receipt","position"]),iO=new Set(ls),sO=new Set(ls.slice(0,-1).map((e,t)=>`${e}:${ls[t+1]}`)),kw=zl(process.env.ORACLE_CONFIG_DIR||zl(rO(),".config","oracle"),"workspace"),vw=zl(kw,"artifacts.sqlite");function us(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(us).join(",")}]`:`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${us(e[t])}`).join(",")}}`}function Ew(e){if(!iO.has(e))throw new TypeError(`unknown artifact type: ${e}`);return e}function as(e){let t=[];for(;e.step();)t.push(e.getAsObject());return e.free(),t}function cs(e){return e?{id:e.id,type:e.type,createdAt:e.created_at,data:JSON.parse(e.data_json)}:null}async function Aw(e={}){let t=e.path||vw;await ZN(Sw(t),{recursive:!0,mode:448}),await ss(Sw(t),448);let n;try{n=await eO(t)}catch(l){if(l.code!=="ENOENT")throw l}let r=await oO(e.sqlJs||{}),o=n?new r.Database(n):new r.Database;o.run(`
58
+ }`;function Q_(e={}){let t=e.chainIds??(e.chainId!=null?[e.chainId]:null),n=(Array.isArray(t)?t:[t??1]).map(Number).filter(r=>Number.isInteger(r)&&r>0);if(!n.length)throw new Error("aave-v3: chainIds must contain at least one chain id");return[...new Set(n)]}async function M0(e={},t={}){let n={chainIds:Q_(e)};return e.user&&(n.user=String(e.user)),{markets:(await Ci(K_,{request:n},t))?.data?.markets??[]}}async function U0(e={},t={}){let n=String(e.address||e.market||e.marketAddress||"").trim();if(!/^0x[0-9a-fA-F]{40}$/.test(n))throw new Error("aave-v3: marketReserves requires an EVM market (pool) address");let r=Number(e.chainId??1);if(!Number.isInteger(r)||r<=0)throw new Error("aave-v3: chainId must be a positive integer");let o={address:n,chainId:r};e.user&&(o.user=String(e.user));let s=(await Ci(Y_,{request:o},t))?.data?.market??null;if(!s)throw new Error(`aave-v3: no market at ${n} on chain ${r}`);return{market:s}}async function B0(e={},t={}){let n=new Set(["MAINNET_ONLY","TESTNET_ONLY","ALL"]),r=String(e.filter||"MAINNET_ONLY").toUpperCase();if(!n.has(r))throw new Error(`aave-v3: filter must be one of ${[...n].join(", ")}`);return{chains:(await Ci(X_,{filter:r},t))?.data?.chains??[]}}async function D0(e={}){return{ok:(await Ci("query { health }",{},e))?.data?.health===!0,provider:"aave-v3"}}N();var Z_="https://staking-api.babylonlabs.io";function Tc(e={}){return String(e.baseUrl||process.env.BABYLON_STAKING_API_URL||Z_).replace(/\/$/,"")}function Ti(e,t={}){return y(`${Tc(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3,headers:{Accept:"application/json"}})}function F0(e,t="pkHex"){let n=String(e||"").trim().toLowerCase().replace(/^0x/,"");if(!/^[0-9a-f]+$/.test(n))throw new Error(`babylon-staking: ${t} must be hex`);if(n.length===66&&(n.startsWith("02")||n.startsWith("03")))return n.slice(2);if(n.length!==64)throw new Error(`babylon-staking: ${t} must be a 64-char x-only (or 66-char compressed) BTC public key`);return n}async function q0(e={}){try{let n=(await Ti("/v2/stats",e))?.data||{},r=Number(n.active_tvl??0);return{ok:Number.isFinite(r)&&r>0,provider:"babylon-staking",baseUrl:Tc(e),activeTvlSats:String(n.active_tvl??""),activeFinalityProviders:n.active_finality_providers??null,exec:!1}}catch(t){return{ok:!1,provider:"babylon-staking",baseUrl:Tc(e),error:String(t?.message||t),exec:!1}}}async function H0(e={},t={}){let r=(await Ti("/v2/stats",t))?.data||{};return{provider:"babylon-staking",activeTvlSats:String(r.active_tvl??""),totalActiveTvlSats:String(r.total_active_tvl??""),activeDelegations:r.active_delegations??null,totalActiveDelegations:r.total_active_delegations??null,activeFinalityProviders:r.active_finality_providers??null,totalFinalityProviders:r.total_finality_providers??null,btcStakingApr:r.btc_staking_apr??null,btcStakingAprPct:r.btc_staking_apr==null?null:Number(r.btc_staking_apr)*100,maxStakingApr:r.max_staking_apr??null,maxStakingAprPct:r.max_staking_apr==null?null:Number(r.max_staking_apr)*100,raw:r}}async function j0(e={},t={}){let n=await Ti("/v2/finality-providers",t),r=Array.isArray(n?.data)?n.data:[];if(e.state){let i=String(e.state).trim().toUpperCase();r=r.filter(s=>String(s.state||"").toUpperCase().includes(i))}if(e.btcPk){let i=F0(e.btcPk,"btcPk");r=r.filter(s=>String(s.btc_pk||"").toLowerCase()===i)}let o=Math.min(500,Math.max(1,Number(e.limit||r.length||1)));return{provider:"babylon-staking",count:r.length,finalityProviders:r.slice(0,o).map(i=>({btcPk:i.btc_pk??null,moniker:i.description?.moniker??null,website:i.description?.website??null,state:i.state??null,commission:i.commission??null,activeTvlSats:i.active_tvl==null?null:String(i.active_tvl),activeDelegations:i.active_delegations??null}))}}async function V0(e={},t={}){let n=F0(e.stakerPkHex||e.stakerPk||e.pkHex||e.pk,"stakerPkHex"),r=new URLSearchParams({staker_pk_hex:n});e.paginationKey&&r.set("pagination_key",String(e.paginationKey));let o=await Ti(`/v2/delegations?${r}`,t),i=Array.isArray(o?.data)?o.data:[],s=i.reduce((a,c)=>a+Number(c.delegation_staking?.staking_amount??c.staking_amount??0),0);return{provider:"babylon-staking",stakerPkHex:n,count:i.length,totalStakedSats:String(s),nextKey:o?.pagination?.next_key||null,delegations:i.map(a=>({stakingTxHashHex:a.delegation_staking?.staking_tx_hash_hex??a.staking_tx_hash_hex??null,state:a.state??null,stakingAmountSats:a.delegation_staking?.staking_amount==null&&a.staking_amount==null?null:String(a.delegation_staking?.staking_amount??a.staking_amount),stakingTimelock:a.delegation_staking?.staking_timelock??null,startHeight:a.delegation_staking?.start_height??null,finalityProviderBtcPks:a.finality_provider_btc_pks_hex??null})),raw:i}}N();var t1="https://markets.bisq.network";function Nc(e={}){return String(e.baseUrl||process.env.BISQ_MARKETS_URL||t1).replace(/\/$/,"")}function z0(e,t="market"){let n=String(e||"").trim().toLowerCase().replace(/[/\-\s]/g,"_");if(!/^[a-z0-9]{2,12}_[a-z0-9]{2,12}$/.test(n))throw new Error(`bisq-markets: ${t} must look like btc_usd (got "${e}")`);return n}function Ni(e,t={}){return y(`${Nc(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function W0(e={}){try{let t=await Ni("/api/markets",e),n=t&&typeof t=="object"?Object.keys(t).length:0;return{ok:n>0,provider:"bisq-markets",baseUrl:Nc(e),marketCount:n,exec:!1}}catch(t){return{ok:!1,provider:"bisq-markets",baseUrl:Nc(e),error:String(t?.message||t),exec:!1}}}async function G0(e={},t={}){let n=await Ni("/api/markets",t),r=Object.values(n&&typeof n=="object"?n:{});if(e.base){let o=String(e.base).trim().toLowerCase();r=r.filter(i=>String(i.lsymbol||"").toLowerCase()===o)}if(e.quote){let o=String(e.quote).trim().toLowerCase();r=r.filter(i=>String(i.rsymbol||"").toLowerCase()===o)}return{provider:"bisq-markets",count:r.length,markets:r.map(o=>({pair:o.pair??null,name:o.name??null,base:o.lsymbol??null,baseName:o.lname??null,quote:o.rsymbol??null,quoteName:o.rname??null,baseType:o.ltype??null,quoteType:o.rtype??null}))}}async function K0(e={},t={}){let n=z0(e.market||e.pair||"btc_usd","market"),r=await Ni(`/api/ticker?market=${encodeURIComponent(n)}`,t),o=Array.isArray(r)?r[0]||{}:r||{};return{provider:"bisq-markets",market:n,last:o.last==null?null:Number(o.last),high:o.high==null?null:Number(o.high),low:o.low==null?null:Number(o.low),bid:o.buy==null?null:Number(o.buy),ask:o.sell==null?null:Number(o.sell),volumeBase:o.volume_left==null?null:Number(o.volume_left),volumeQuote:o.volume_right==null?null:Number(o.volume_right),note:"Bisq is thin, non-KYC P2P \u2014 treat as a basis signal against centralized spot, not a reference rate",raw:o}}async function Y0(e={},t={}){let n=z0(e.market||e.pair||"btc_usd","market"),r=Math.min(2e3,Math.max(1,Number(e.limit||50))),o=new URLSearchParams({market:n,limit:String(r)});e.timestampFrom&&o.set("timestamp_from",String(e.timestampFrom)),e.timestampTo&&o.set("timestamp_to",String(e.timestampTo));let i=await Ni(`/api/trades?${o}`,t),s=Array.isArray(i)?i:[],a=s.length?Number(s[0].trade_date||0):null,c=s.reduce((l,u)=>l+Number(u.amount||0),0);return{provider:"bisq-markets",market:n,count:s.length,latestTradeAt:a?new Date(a).toISOString():null,latestTradeAgeHours:a?Math.round((Date.now()-a)/36e5*10)/10:null,volumeBase:c,trades:s.slice(0,r).map(l=>({price:l.price==null?null:Number(l.price),amount:l.amount==null?null:Number(l.amount),volume:l.volume==null?null:Number(l.volume),paymentMethod:l.payment_method??null,tradeDate:l.trade_date??null,tradeAt:l.trade_date?new Date(Number(l.trade_date)).toISOString():null}))}}N();var et=Object.freeze({60808:{name:"bob",label:"BOB (Build on Bitcoin)",url:"https://explorer.gobob.xyz",nativeSymbol:"ETH"},30:{name:"rootstock",label:"Rootstock (RSK)",url:"https://rootstock.blockscout.com",nativeSymbol:"RBTC"}}),r1=new Map([["bob",60808],["rootstock",30],["rsk",30]]),o1=60808;function Rr(e){if(e==null||e==="")return o1;let t=r1.get(String(e).trim().toLowerCase());if(t)return t;let n=Number(e);if(!et[n])throw new Error(`bob-rootstock: unsupported chain ${e} (supported: ${Object.keys(et).join(", ")} / bob, rootstock)`);return n}function Oc(e,t={}){if(t.baseUrl)return String(t.baseUrl).replace(/\/$/,"");let n=Rr(e),r=n===30?process.env.ROOTSTOCK_EXPLORER_URL:process.env.BOB_EXPLORER_URL;return String(r||et[n].url).replace(/\/$/,"")}function X0(e,t="address"){let n=String(e||"").trim();if(!/^0x[0-9a-fA-F]{40}$/.test(n))throw new Error(`bob-rootstock: ${t} must be a 0x EVM address`);return n}function Oi(e,t,n={}){return y(`${Oc(e,n)}${t.startsWith("/")?t:`/${t}`}`,{fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs??15e3})}async function Q0(e={},t={}){let n;try{n=Rr(t.chainId??t.chain??e.chainId)}catch(o){return{ok:!1,provider:"bob-rootstock",error:String(o?.message||o),exec:!1}}let r=et[n];try{let o=await Oi(n,"/api/v2/stats",e);return{ok:o?.total_blocks!=null||o?.total_transactions!=null,provider:"bob-rootstock",chainId:n,chain:r.name,baseUrl:Oc(n,e),totalBlocks:o?.total_blocks??null,averageBlockTimeMs:o?.average_block_time??null,exec:!1}}catch(o){return{ok:!1,provider:"bob-rootstock",chainId:n,chain:r.name,baseUrl:Oc(n,e),error:String(o?.message||o),exec:!1}}}async function Rc(e={},t={}){let n=e.chainId??e.chain;if(String(n).trim().toLowerCase()==="all"){let s=Object.keys(et).map(Number);return{provider:"bob-rootstock",chains:await Promise.all(s.map(async c=>{try{return await Rc({chainId:c},t)}catch(l){return{provider:"bob-rootstock",chainId:c,chain:et[c].name,error:String(l?.message||l)}}}))}}let r=Rr(n),o=et[r],i=await Oi(r,"/api/v2/stats",t);return{provider:"bob-rootstock",chainId:r,chain:o.name,label:o.label,nativeSymbol:o.nativeSymbol,averageBlockTimeMs:i.average_block_time??null,averageBlockTimeSec:i.average_block_time==null?null:Number(i.average_block_time)/1e3,gasPrices:i.gas_prices??null,gasPriceUpdatedAt:i.gas_price_updated_at??null,gasUsedToday:i.gas_used_today??null,coinPrice:i.coin_price??null,coinPriceChangePct:i.coin_price_change_percentage??null,marketCap:i.market_cap??null,tvl:i.tvl??null,totalBlocks:i.total_blocks??null,totalAddresses:i.total_addresses??null,totalTransactions:i.total_transactions??null,transactionsToday:i.transactions_today??null,networkUtilizationPct:i.network_utilization_percentage??null,raw:i}}async function J0(e={},t={}){let n=Rr(e.chainId??e.chain),r=X0(e.address||e.addr,"address"),o=et[n],i=await Oi(n,`/api/v2/addresses/${encodeURIComponent(r)}`,t);return{provider:"bob-rootstock",chainId:n,chain:o.name,address:r,nativeSymbol:o.nativeSymbol,coinBalanceWei:i.coin_balance==null?null:String(i.coin_balance),coinBalance:i.coin_balance==null?null:Number(i.coin_balance)/1e18,isContract:i.is_contract??null,isVerified:i.is_verified??null,name:i.name??null,blockNumberBalanceUpdatedAt:i.block_number_balance_updated_at??null,raw:i}}async function Z0(e={},t={}){let n=Rr(e.chainId??e.chain),r=X0(e.address||e.addr,"address"),o=await Oi(n,`/api/v2/addresses/${encodeURIComponent(r)}/token-balances`,t),i=Array.isArray(o)?o:[],s=Math.min(500,Math.max(1,Number(e.limit||i.length||1)));return{provider:"bob-rootstock",chainId:n,chain:et[n].name,address:r,count:i.length,tokens:i.slice(0,s).map(a=>({symbol:a.token?.symbol??null,name:a.token?.name??null,address:a.token?.address??a.token?.address_hash??null,type:a.token?.type??null,decimals:a.token?.decimals??null,rawBalance:a.value==null?null:String(a.value),balance:a.value==null||a.token?.decimals==null?null:Number(a.value)/10**Number(a.token.decimals),exchangeRate:a.token?.exchange_rate??null}))}}N();var s1="https://insights.braiins.com/api/v1.0";function $c(e={}){return String(e.baseUrl||process.env.BRAIINS_INSIGHTS_URL||s1).replace(/\/$/,"")}function Lc(e,t={}){return y(`${$c(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3,headers:{Accept:"application/json"}})}async function eg(e={}){try{let t=await Lc("/price-stats",e),n=Number(t?.price??0);return{ok:Number.isFinite(n)&&n>0,provider:"braiins-insights",baseUrl:$c(e),btcUsd:Number.isFinite(n)?n:null,timestamp:t?.timestamp??null,exec:!1}}catch(t){return{ok:!1,provider:"braiins-insights",baseUrl:$c(e),error:String(t?.message||t),exec:!1}}}async function tg(e={},t={}){let n=await Lc("/price-stats",t);return{provider:"braiins-insights",btcUsd:n?.price==null?null:Number(n.price),percentChange24h:n?.percent_change_24h??null,timestamp:n?.timestamp??null,raw:n}}async function ng(e={},t={}){let n=await Lc("/pool-stats",t),r=Array.isArray(n)?n:Array.isArray(n?.pools)?n.pools:[],o=String(e.window||"1w").trim().toLowerCase(),i=l=>l?.blocks_mined?.[o]||null,s=[...r].sort((l,u)=>Number(i(u)?.absolute||0)-Number(i(l)?.absolute||0)),a=Math.min(200,Math.max(1,Number(e.limit||s.length||1))),c=r.length?Object.keys(r[0]?.blocks_mined||{}):[];if(c.length&&!c.includes(o))throw new Error(`braiins-insights: window must be one of ${c.join(", ")}`);return{provider:"braiins-insights",window:o,availableWindows:c,count:s.length,pools:s.slice(0,a).map(l=>({name:l.pool_name??l.name??null,blocksMined:i(l)?.absolute??null,sharePct:i(l)?.relative_pct??null,blockValueAvg:l.block_value_avg??null,hashrate:l.hashrate??null,luck:l.luck??null,blocksMinedAllWindows:l.blocks_mined??null})),raw:s.slice(0,a)}}N();var c1="https://api.cow.fi",rg=Object.freeze({1:"mainnet",100:"xdai",42161:"arbitrum_one",8453:"base",11155111:"sepolia"});function og(e={}){return(e.baseUrl||process.env.COW_API_URL||c1).replace(/\/$/,"")}function l1(e={}){if(e.network)return String(e.network);let t=Number(e.chainId??1),n=rg[t];if(!n)throw new Error(`cow-protocol: unsupported chainId ${t} (have: ${Object.keys(rg).join(", ")})`);return n}function Mc(e,t,n){return`${og(n)}/${l1(e)}/api/v1${t}`}function ig(e,t){let n=String(e||"").trim();if(!/^0x[0-9a-fA-F]{40}$/.test(n))throw new Error(`cow-protocol: ${t} must be an EVM address`);return n}function sg(e,t=10){return Math.min(1e3,Math.max(1,Number(e.limit??t)))}async function ag(e={},t={}){return y(Mc(e,"/auction",t),{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function cg(e={},t={}){let n=ig(e.owner||e.address||e.user,"owner"),r=new URLSearchParams({limit:String(sg(e))});e.offset!=null&&r.set("offset",String(Math.max(0,Number(e.offset))));let o=await y(`${Mc(e,`/account/${n}/orders`,t)}?${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4}),i=Array.isArray(o)?o:[],s=e.openOnly===!1?i:i.filter(a=>String(a?.status||"").toLowerCase()==="open");return{owner:n,count:s.length,total:i.length,orders:s}}async function lg(e={},t={}){let n=new URLSearchParams;e.orderUid?n.set("orderUid",String(e.orderUid)):n.set("owner",ig(e.owner||e.address||e.user,"owner"));let r=await y(`${Mc(e,"/trades",t)}?${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4}),o=Array.isArray(r)?r:[];return{count:o.length,trades:o.slice(0,sg(e))}}async function ug(e={}){let t=await y(`${og(e)}/mainnet/api/v1/version`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??12e3}),n=typeof t=="string"?t:JSON.stringify(t??"");return{ok:n.trim().length>0,provider:"cow-protocol",version:n.trim()||null}}N();var d1="https://api.hiro.so",p1=20;function Uc(e={}){return String(e.baseUrl||process.env.HIRO_API_URL||d1).replace(/\/$/,"")}function m1(e={}){let t={Accept:"application/json"},n=e.apiKey||process.env.HIRO_API_KEY;return n&&(t["x-api-key"]=String(n)),t}function $r(e,t={}){return y(`${Uc(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3,headers:m1(t)})}async function dg(e={}){try{let t=await $r("/v2/info",e),n=Number(t?.burn_block_height??0);return{ok:Number.isFinite(n)&&n>0,provider:"hiro-stacks",baseUrl:Uc(e),burnBlockHeight:t?.burn_block_height??null,stacksTipHeight:t?.stacks_tip_height??null,serverVersion:t?.server_version??null,rateLimitRps:p1,keyed:!!(e.apiKey||process.env.HIRO_API_KEY),exec:!1}}catch(t){return{ok:!1,provider:"hiro-stacks",baseUrl:Uc(e),error:String(t?.message||t),exec:!1}}}async function pg(e={},t={}){let n=await $r("/v2/info",t);return{provider:"hiro-stacks",peerVersion:n.peer_version??null,serverVersion:n.server_version??null,networkId:n.network_id??null,burnBlockHeight:n.burn_block_height??null,stableBurnBlockHeight:n.stable_burn_block_height??null,stacksTipHeight:n.stacks_tip_height??null,stacksTip:n.stacks_tip??null,poxConsensus:n.pox_consensus??null,raw:n}}async function mg(e={},t={}){let n=await $r("/v2/pox",t),r=Number(n.total_liquid_supply_ustx||0),o=Number(n.current_cycle?.stacked_ustx||0);return{provider:"hiro-stacks",contractId:n.contract_id??null,currentCycleId:n.current_cycle?.id??null,currentCycleStackedUstx:n.current_cycle?.stacked_ustx==null?null:String(n.current_cycle.stacked_ustx),currentCycleIsPoX:n.current_cycle?.is_pox_active??null,nextCycleId:n.next_cycle?.id??null,nextCycleStackedUstx:n.next_cycle?.stacked_ustx==null?null:String(n.next_cycle.stacked_ustx),nextCycleMinThresholdUstx:n.next_cycle?.min_threshold_ustx==null?null:String(n.next_cycle.min_threshold_ustx),blocksUntilNextCycle:n.next_cycle?.blocks_until_prepare_phase??null,minAmountUstx:n.min_amount_ustx==null?null:String(n.min_amount_ustx),totalLiquidSupplyUstx:n.total_liquid_supply_ustx==null?null:String(n.total_liquid_supply_ustx),participationPct:r>0?o/r*100:null,rewardCycleLength:n.reward_cycle_length??null,rewardSlots:n.reward_slots??null,currentBurnchainBlockHeight:n.current_burnchain_block_height??null,raw:n}}async function fg(e={},t={}){let n=Math.min(60,Math.max(1,Number(e.limit||20))),r=Math.max(0,Number(e.offset||0)),o=await $r(`/extended/v2/pox/cycles?limit=${n}&offset=${r}`,t),i=Array.isArray(o?.results)?o.results:[];return{provider:"hiro-stacks",total:o?.total??null,limit:n,offset:r,cycles:i.map(s=>({cycleNumber:s.cycle_number??null,blockHeight:s.block_height??null,totalStackedAmount:s.total_stacked_amount==null?null:String(s.total_stacked_amount),totalWeight:s.total_weight??null,totalSigners:s.total_signers??null}))}}async function hg(e={},t={}){let n=Math.min(30,Math.max(1,Number(e.limit||1))),r=await $r(`/extended/v2/blocks?limit=${n}`,t),o=Array.isArray(r?.results)?r.results:[];return{provider:"hiro-stacks",total:r?.total??null,limit:n,blocks:o.map(i=>({height:i.height??null,hash:i.hash??null,burnBlockHeight:i.burn_block_height??null,burnBlockTime:i.burn_block_time??null,txCount:i.tx_count??null,canonical:i.canonical??null}))}}N();var h1="https://bundles.jito.wtf",yg=1e9;function Bc(e={}){return String(e.baseUrl||process.env.JITO_BUNDLES_URL||h1).replace(/\/$/,"")}function g1(e,t,n){let r=Number(e);return Number.isFinite(r)?Math.max(1,Math.min(Math.floor(r),n)):t}function gg(e){let t=Number(e);return Number.isFinite(t)?Math.round(t*yg):null}function y1(e={}){let t=Number(e.landedTipLamports);return{bundleId:e.bundleId||null,timestamp:e.timestamp||null,validator:e.validator||null,tippers:e.tippers||[],transactions:e.transactions||[],transactionCount:Array.isArray(e.transactions)?e.transactions.length:0,landedTipLamports:Number.isFinite(t)?t:null,landedTipSol:Number.isFinite(t)?t/yg:null,raw:e}}async function bg(e={}){try{let t=await y(`${Bc(e)}/api/v1/bundles/tip_floor`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??12e3}),n=Array.isArray(t)?t[0]:t,r=Number(n?.landed_tips_50th_percentile);return{ok:Number.isFinite(r),provider:"jito-mev",tipFloorP50Sol:Number.isFinite(r)?r:null,asOf:n?.time||null,exec:!1}}catch(t){return{ok:!1,provider:"jito-mev",error:String(t?.message||t),exec:!1}}}async function wg(e={},t={}){let n=g1(e.limit,5,100),r=new URL(`${Bc(t)}/api/v1/bundles/recent`);r.searchParams.set("limit",String(n)),r.searchParams.set("sort",String(e.sort||"Time")),r.searchParams.set("asc",String(!!e.asc));let o=await y(r.toString(),{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),s=(Array.isArray(o)?o:Array.isArray(o?.bundles)?o.bundles:[]).map(y1),a=s.map(c=>c.landedTipLamports).filter(c=>Number.isFinite(c));return{provider:"jito-mev",chain:"solana-mainnet-beta",count:s.length,totalTipLamports:a.reduce((c,l)=>c+l,0),maxTipLamports:a.length?Math.max(...a):null,bundles:s}}async function xg(e={}){let t=await y(`${Bc(e)}/api/v1/bundles/tip_floor`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??12e3}),n=(Array.isArray(t)?t[0]:t)||{},r={p25:Number(n.landed_tips_25th_percentile)||0,p50:Number(n.landed_tips_50th_percentile)||0,p75:Number(n.landed_tips_75th_percentile)||0,p95:Number(n.landed_tips_95th_percentile)||0,p99:Number(n.landed_tips_99th_percentile)||0,ema50:Number(n.ema_landed_tips_50th_percentile)||0};return{provider:"jito-mev",chain:"solana-mainnet-beta",asOf:n.time||null,tipFloorSol:r,tipFloorLamports:Object.fromEntries(Object.entries(r).map(([o,i])=>[o,gg(i)])),suggestedTipLamports:gg(r.p75||r.p50),raw:n}}N();var w1="https://api.kamino.finance";function x1(e={}){return String(e.baseUrl||process.env.KAMINO_API_URL||w1).replace(/\/$/,"")}function we(e){let t=Number(e);return Number.isFinite(t)?t:null}function Sg(e={}){let t=we(e.totalValueLocked)??0,n=we(e.apy?.totalApy)??0,r=we(e.kaminoApy?.totalApy)??0;return{strategy:e.strategy||null,pair:e.tokenA&&e.tokenB?`${e.tokenA}-${e.tokenB}`:null,tokenA:e.tokenA||null,tokenB:e.tokenB||null,tokenAMint:e.tokenAMint||null,tokenBMint:e.tokenBMint||null,tvlUsd:t,sharePrice:we(e.sharePrice),sharesIssued:we(e.sharesIssued),profitAndLoss:we(e.profitAndLoss),feeApy:n,feeApyPct:n*100,rewardApy:r,rewardApyPct:r*100,totalApy:n+r,totalApyPct:(n+r)*100,apr24h:we(e.apy?.vault?.totalApr),apy24h:we(e.kaminoApy?.vault?.apy24h),apy7d:we(e.kaminoApy?.vault?.apy7d),apy30d:we(e.kaminoApy?.vault?.apy30d),poolPrice:we(e.apy?.vault?.poolPrice),priceLower:we(e.apy?.vault?.priceLower),priceUpper:we(e.apy?.vault?.priceUpper),outOfRange:!!e.apy?.vault?.strategyOutOfRange,rewardMints:e.rewardMints||[],balances:e.vaultBalances||null,lastCalculated:e.kaminoApy?.vault?.lastCalculated||null}}async function Dc(e={},t={}){let n=new URL(`${x1(t)}/strategies/metrics`);n.searchParams.set("env",String(e.env||"mainnet-beta")),n.searchParams.set("status",String(e.status||"LIVE"));let r=await y(n.toString(),{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??45e3});return Array.isArray(r)?r:[]}async function kg(e={}){try{let t=await Dc({},e),n=t.filter(r=>(Number(r.totalValueLocked)||0)>0).length;return{ok:t.length>0,provider:"kamino-strategies",strategies:t.length,funded:n,exec:!1}}catch(t){return{ok:!1,provider:"kamino-strategies",error:String(t?.message||t),exec:!1}}}async function Eg(e={},t={}){let r=(await Dc(e,t)).map(Sg),o=r.length,i=Number.isFinite(Number(e.minTvlUsd))?Number(e.minTvlUsd):1e4;if(r=r.filter(l=>l.tvlUsd>=i),e.token){let l=String(e.token).toLowerCase();r=r.filter(u=>String(u.tokenA||"").toLowerCase()===l||String(u.tokenB||"").toLowerCase()===l||u.tokenAMint===e.token||u.tokenBMint===e.token)}if(e.pair){let l=String(e.pair).toLowerCase().replace(/[/_]/g,"-");r=r.filter(u=>String(u.pair||"").toLowerCase()===l)}e.inRangeOnly===!0&&(r=r.filter(l=>!l.outOfRange));let s=String(e.sortBy||"apy");r.sort((l,u)=>s==="tvl"?u.tvlUsd-l.tvlUsd:u.totalApy-l.totalApy);let a=Number.isFinite(Number(e.limit))&&Number(e.limit)>0?Number(e.limit):25,c=r.slice(0,a);return{provider:"kamino-strategies",chain:"solana-mainnet-beta",env:e.env||"mainnet-beta",status:e.status||"LIVE",totalStrategies:o,matched:r.length,count:c.length,minTvlUsd:i,tvlUsdMatched:r.reduce((l,u)=>l+u.tvlUsd,0),strategies:c}}async function vg(e={},t={}){let n=String(e.strategy||e.address||"").trim();if(!n)throw new Error("kamino-strategies: strategy address required");let o=(await Dc({...e,status:e.status||"ALL"},t)).find(i=>i.strategy===n);if(!o)throw new Error(`kamino-strategies: strategy ${n} not found`);return{provider:"kamino-strategies",chain:"solana-mainnet-beta",...Sg(o),raw:o}}N();var k1="https://blockstream.info/liquid/api",Ag="6f0279e9ed041c3d710a9f57d0c02928416460c4b722ae3457a11eec381c526d";function Ri(e={}){return String(e.baseUrl||process.env.LIQUID_ESPLORA_URL||k1).replace(/\/$/,"")}function E1(e,t="address"){let n=String(e||"").trim(),r=/^(ex1|lq1|el1|tex1|tlq1)[a-z0-9]{20,200}$/i.test(n),o=/^[QVGH][a-km-zA-HJ-NP-Z1-9]{25,110}$/.test(n);if(!r&&!o)throw new Error(`liquid-esplora: ${t} must look like a Liquid address (Q\u2026, VJL\u2026, ex1\u2026, lq1\u2026)`);return n}function v1(e,t="assetId"){let n=String(e||"").trim().toLowerCase().replace(/^0x/,"");if(!/^[0-9a-f]{64}$/.test(n))throw new Error(`liquid-esplora: ${t} must be 64-char hex`);return n}async function Ig(e,t={}){let n=`${Ri(t)}${e.startsWith("/")?e:`/${e}`}`,o=await(t.fetchImpl||fetch)(n,{method:"GET",headers:{accept:"application/json,text/plain;q=0.9,*/*;q=0.8"},signal:AbortSignal.timeout(t.timeoutMs??12e3)}),i=await o.text();if(!o.ok)throw new Error(`liquid-esplora GET ${e}: HTTP ${o.status} ${i.slice(0,160)}`);return i}function _g(e,t={}){return y(`${Ri(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3})}async function Pg(e={}){try{let t=await Ig("/blocks/tip/height",e),n=Number(t);return{ok:Number.isFinite(n)&&n>0,provider:"liquid-esplora",baseUrl:Ri(e),tipHeight:n,exec:!1,signing:"user-wallet"}}catch(t){return{ok:!1,provider:"liquid-esplora",baseUrl:Ri(e),error:String(t?.message||t),exec:!1}}}async function Cg(e={},t={}){let n=await Ig("/blocks/tip/height",t);return{provider:"liquid-esplora",tipHeight:Number(n)}}async function Tg(e={},t={}){let n=E1(e.address||e.addr,"address"),r=await _g(`/address/${n}`,t),o=r.chain_stats||{},i=r.mempool_stats||{},s=o.funded_txo_sum!=null,a=Number(o.funded_txo_sum||0)+Number(i.funded_txo_sum||0),c=Number(o.spent_txo_sum||0)+Number(i.spent_txo_sum||0);return{provider:"liquid-esplora",address:n,txCount:Number(o.tx_count||0)+Number(i.tx_count||0),balanceSats:s?String(a-c):null,confidential:!s,note:s?void 0:"Liquid amounts are blinded \u2014 Esplora returns TXO counts only for confidential outputs. Unblind with the wallet's blinding key for values.",chainStats:o,mempoolStats:i,raw:r}}async function Ng(e={},t={}){let n=v1(e.assetId||e.asset||Ag,"assetId"),r=await _g(`/asset/${n}`,t),o=r.chain_stats||{};return{provider:"liquid-esplora",assetId:n,isPolicyAsset:n===Ag,name:r.name??r.entity?.domain??null,ticker:r.ticker??null,precision:r.precision??null,issuanceTxid:r.issuance_txin?.txid??null,txCount:o.tx_count??null,pegInAmount:o.peg_in_amount==null?null:String(o.peg_in_amount),pegOutAmount:o.peg_out_amount==null?null:String(o.peg_out_amount),issuedAmount:o.issued_amount==null?null:String(o.issued_amount),burnedAmount:o.burned_amount==null?null:String(o.burned_amount),circulatingAmount:o.peg_in_amount!=null?String(Number(o.peg_in_amount)-Number(o.peg_out_amount||0)-Number(o.burned_amount||0)):o.issued_amount!=null?String(Number(o.issued_amount)-Number(o.burned_amount||0)):null,raw:r}}N();var I1="https://api-mainnet.magiceden.dev/v2/ord/btc",_1=600;function Fc(e={}){return String(e.baseUrl||process.env.MAGICEDEN_ORD_API_URL||I1).replace(/\/$/,"")}function P1(e={}){let t={Accept:"application/json"},n=e.apiKey||process.env.MAGICEDEN_API_KEY;return n&&(t.Authorization=`Bearer ${n}`),t}function Og(e,t="collectionSymbol"){let n=String(e||"").trim().toLowerCase();if(!/^[a-z0-9][a-z0-9_-]{0,63}$/.test(n))throw new Error(`magiceden-ordinals: ${t} must be a slug like "nodemonkes"`);return n}function Rg(e,t={}){return y(`${Fc(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3,headers:P1(t),retries:t.retries??1})}async function $g(e={}){let t=Og(e.probeCollection||process.env.MAGICEDEN_PROBE_COLLECTION||"nodemonkes");try{let n=await Rg(`/stat?collectionSymbol=${encodeURIComponent(t)}`,e);return{ok:n!=null&&typeof n=="object",provider:"magiceden-ordinals",baseUrl:Fc(e),probeCollection:t,rateLimitRpm:_1,exec:!1}}catch(n){let r=n?.status??null;return{ok:!1,provider:"magiceden-ordinals",baseUrl:Fc(e),probeCollection:t,status:r,upstreamDown:r===503||r===502||r===504,error:String(n?.message||n),fallback:"satflow",note:r===503?"Magic Eden ordinals API returned 503 'no healthy upstream'. Use the satflow provider for BTC NFT market data.":void 0,exec:!1}}}async function Lg(e={},t={}){let n=Og(e.collectionSymbol||e.symbol||e.collection,"collectionSymbol");try{let r=await Rg(`/stat?collectionSymbol=${encodeURIComponent(n)}`,t),o=r?.floorPrice==null?null:Number(r.floorPrice);return{ok:!0,provider:"magiceden-ordinals",collectionSymbol:n,floorPriceSats:o==null?null:String(r.floorPrice),floorPriceBtc:o==null?null:o/1e8,totalVolumeSats:r?.totalVolume==null?null:String(r.totalVolume),totalVolumeBtc:r?.totalVolume==null?null:Number(r.totalVolume)/1e8,totalListed:r?.totalListed??null,owners:r?.owners??null,supply:r?.supply??null,pendingTransactions:r?.pendingTransactions??null,inscriptionNumberMin:r?.inscriptionNumberMin??null,inscriptionNumberMax:r?.inscriptionNumberMax??null,raw:r}}catch(r){let o=r?.status??null;if(!(o===502||o===503||o===504))throw r;return{ok:!1,provider:"magiceden-ordinals",collectionSymbol:n,status:o,upstreamDown:!0,error:String(r?.message||r),fallback:"satflow",note:"Magic Eden ordinals API is returning 5xx ('no healthy upstream'). Query the satflow provider for floors and listings."}}}N();var T1="https://mempool.space/api",N1=7;function qc(e={}){return String(e.baseUrl||process.env.MEMPOOL_API_URL||T1).replace(/\/$/,"")}function $i(e,t={}){return y(`${qc(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}function Mg(e){if(!e)return{ageDays:null,stale:null};let t=new Date(e).getTime();if(!Number.isFinite(t))return{ageDays:null,stale:null};let n=(Date.now()-t)/864e5;return{ageDays:Math.round(n*10)/10,stale:n>N1}}async function Ug(e={}){try{let n=(await $i("/v1/lightning/statistics/latest",e))?.latest||{},{ageDays:r,stale:o}=Mg(n.added);return{ok:Number(n.node_count||0)>0,provider:"mempool-lightning",baseUrl:qc(e),snapshotAt:n.added??null,ageDays:r,stale:o,nodeCount:n.node_count??null,exec:!1}}catch(t){return{ok:!1,provider:"mempool-lightning",baseUrl:qc(e),error:String(t?.message||t),exec:!1}}}async function Bg(e={},t={}){let r=(await $i("/v1/lightning/statistics/latest",t))?.latest||{},{ageDays:o,stale:i}=Mg(r.added);return{provider:"mempool-lightning",snapshotAt:r.added??null,ageDays:o,stale:i,staleNote:i?`mempool.space Lightning snapshot is ${o} days old \u2014 trend only, not live state`:void 0,nodeCount:r.node_count??null,channelCount:r.channel_count??null,totalCapacitySats:r.total_capacity==null?null:String(r.total_capacity),totalCapacityBtc:r.total_capacity==null?null:Number(r.total_capacity)/1e8,avgCapacitySats:r.avg_capacity==null?null:String(r.avg_capacity),avgFeeRatePpm:r.avg_fee_rate??null,avgBaseFeeMsat:r.avg_base_fee_mtokens??null,torNodes:r.tor_nodes??null,clearnetNodes:r.clearnet_nodes??null,unannouncedNodes:r.unannounced_nodes??null,raw:r}}async function Dg(e={},t={}){let n=String(e.metric||e.ranking||"connectivity").trim().toLowerCase(),r=new Set(["connectivity","liquidity","channels"]);if(!r.has(n))throw new Error(`mempool-lightning: metric must be one of ${[...r].join(", ")}`);let o=await $i(`/v1/lightning/nodes/rankings/${n}`,t),i=Array.isArray(o)?o:[],s=Math.min(100,Math.max(1,Number(e.limit||i.length||1)));return{provider:"mempool-lightning",metric:n,count:i.length,nodes:i.slice(0,s).map(a=>({publicKey:a.publicKey??null,alias:a.alias??null,channels:a.channels??null,capacitySats:a.capacity==null?null:String(a.capacity),firstSeen:a.firstSeen??null,updatedAt:a.updatedAt??null,city:a.city?.en??a.city??null,country:a.country?.en??a.country??null,iso:a.iso_code??null}))}}async function Fg(e={},t={}){let n=await $i("/v1/lightning/nodes/countries",t),r=Array.isArray(n)?n:[],o=Math.min(250,Math.max(1,Number(e.limit||r.length||1))),i=r.reduce((s,a)=>s+Number(a.count||0),0);return{provider:"mempool-lightning",countryCount:r.length,totalNodes:i,topCountrySharePct:r[0]?.share??null,countries:r.slice(0,o).map(s=>({name:s.name?.en??s.name??null,iso:s.iso??null,count:s.count??null,sharePct:s.share??null,capacitySats:s.capacity==null?null:String(s.capacity)}))}}N();var R1="https://mempool.space/api",qg=new Set(["24h","3d","1w","1m","3m","6m","1y","2y","3y","all"]);function Hc(e={}){return String(e.baseUrl||process.env.MEMPOOL_API_URL||R1).replace(/\/$/,"")}function Hg(e,t){let n=String(e||t).trim().toLowerCase();if(!qg.has(n))throw new Error(`mempool-mining: window must be one of ${[...qg].join(", ")}`);return n}function Lr(e,t={}){return y(`${Hc(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function jg(e={}){try{let t=await Lr("/v1/difficulty-adjustment",e);return{ok:Number.isFinite(Number(t?.nextRetargetHeight))&&Number(t.nextRetargetHeight)>0,provider:"mempool-mining",baseUrl:Hc(e),nextRetargetHeight:t?.nextRetargetHeight??null,exec:!1}}catch(t){return{ok:!1,provider:"mempool-mining",baseUrl:Hc(e),error:String(t?.message||t),exec:!1}}}async function Vg(e={},t={}){let n=await Lr("/v1/difficulty-adjustment",t);return{provider:"mempool-mining",progressPercent:n.progressPercent??null,difficultyChangePct:n.difficultyChange??null,estimatedRetargetDate:n.estimatedRetargetDate??null,remainingBlocks:n.remainingBlocks??null,remainingTimeMs:n.remainingTime??null,previousRetargetPct:n.previousRetarget??null,nextRetargetHeight:n.nextRetargetHeight??null,timeAvgMs:n.timeAvg??null,raw:n}}async function zg(e={},t={}){let n=Hg(e.window||e.timeframe,"1w"),r=await Lr(`/v1/mining/pools/${n}`,t),o=Array.isArray(r?.pools)?r.pools:[],i=o.reduce((l,u)=>l+Number(u.blockCount||0),0),s=l=>i>0?Number(l.blockCount||0)/i*100:null,a=[...o].sort((l,u)=>Number(u.blockCount||0)-Number(l.blockCount||0)),c=Math.min(200,Math.max(1,Number(e.limit||a.length||1)));return{provider:"mempool-mining",window:n,totalBlocks:i,blockCount:r?.blockCount??null,lastEstimatedHashrate:r?.lastEstimatedHashrate??null,topPoolSharePct:a[0]?s(a[0]):null,top3SharePct:a.slice(0,3).reduce((l,u)=>l+(s(u)||0),0)||null,pools:a.slice(0,c).map(l=>({name:l.name??null,slug:l.slug??null,blockCount:l.blockCount??null,rank:l.rank??null,sharePct:s(l),emptyBlocks:l.emptyBlocks??null,avgMatchRate:l.avgMatchRate??null}))}}async function Wg(e={},t={}){let n=Hg(e.window||e.timeframe,"3d"),r=await Lr(`/v1/mining/hashrate/${n}`,t),o=Array.isArray(r?.hashrates)?r.hashrates:[];return{provider:"mempool-mining",window:n,currentHashrate:r?.currentHashrate??null,currentHashrateEhs:r?.currentHashrate==null?null:Number(r.currentHashrate)/1e18,currentDifficulty:r?.currentDifficulty??null,points:o.length,hashrates:o,difficulty:Array.isArray(r?.difficulty)?r.difficulty:[]}}async function Gg(e={},t={}){let n=Math.min(1e4,Math.max(1,Number(e.blockCount||e.blocks||144))),r=await Lr(`/v1/mining/reward-stats/${n}`,t),o=Number(r.totalReward||0),i=Number(r.totalFee||0);return{provider:"mempool-mining",blockCount:n,startBlock:r.startBlock??null,endBlock:r.endBlock??null,totalRewardSats:String(r.totalReward??""),totalFeeSats:String(r.totalFee??""),totalSubsidySats:String(o-i),feeSharePct:o>0?i/o*100:null,totalTx:r.totalTx??null,raw:r}}N();var L1="https://amm-v2.meteora.ag",Kg=new Set(["tvl","volume","fee_tvl_ratio","l_m"]),Yg=new Set(["dynamic","multitoken","lst","farms"]),M1=/^[1-9A-HJ-NP-Za-km-z]{32,44}$/;function U1(e={}){return String(e.baseUrl||process.env.METEORA_API_URL||L1).replace(/\/$/,"")}function le(e){let t=Number(e);return Number.isFinite(t)?t:null}function B1(e={}){return{address:e.pool_address||null,name:e.pool_name||null,type:e.pool_type||null,version:e.pool_version??null,mints:e.pool_token_mints||[],tokenAmounts:e.pool_token_amounts||[],tokenUsdAmounts:e.pool_token_usd_amounts||[],lpMint:e.lp_mint||null,lpDecimals:e.lp_decimal??null,lpPriceUsd:le(e.pool_lp_price_in_usd),tvlUsd:le(e.pool_tvl),farmTvlUsd:le(e.farm_tvl),volume24hUsd:le(e.trading_volume),volume7dUsd:le(e.weekly_trading_volume),fee24hUsd:le(e.fee_volume),fee7dUsd:le(e.weekly_fee_volume),tradeApyPct:le(e.trade_apy),weeklyTradeApyPct:le(e.weekly_trade_apy),baseApyPct:le(e.daily_base_apy),farmingApyPct:le(e.farming_apy),totalApyPct:(le(e.trade_apy)??0)+(le(e.farming_apy)??0),aprPct:le(e.apr),feePct:le(e.total_fee_pct),farmingPool:e.farming_pool||null,isLst:!!e.is_lst,isMeme:!!e.is_meme,permissioned:!!e.permissioned,unknownTokens:!!e.unknown,createdAt:e.created_at??null}}function D1(e={},t={}){let n=new URL(`${U1(t)}/pools/search`),r=Math.max(0,Number(e.page)||0),o=Math.max(1,Math.min(Number(e.size??e.limit)||20,100));if(n.searchParams.set("page",String(r)),n.searchParams.set("size",String(o)),e.sortKey!=null){let a=String(e.sortKey);if(!Kg.has(a))throw new Error(`meteora-dlmm: sortKey must be one of ${[...Kg].join(", ")}`);n.searchParams.set("sort_key",a),n.searchParams.set("order_by",e.orderBy==="asc"?"asc":"desc")}if(e.poolType!=null){let a=String(e.poolType);if(!Yg.has(a))throw new Error(`meteora-dlmm: poolType must be one of ${[...Yg].join(", ")}`);n.searchParams.set("pool_type",a)}let i=e.filter??e.query??e.search;i!=null&&String(i).trim()&&n.searchParams.set("filter",String(i).trim());let s=e.mints||e.includeTokenMints;if(s){let a=(Array.isArray(s)?s:[s]).map(c=>String(c).trim());for(let c of a)if(!M1.test(c))throw new Error(`meteora-dlmm: mint ${c} is not a base58 public key`);n.searchParams.set("include_token_mints",a.join(","))}return{url:n,page:r,size:o}}async function jc(e={},t={}){let{url:n,page:r,size:o}=D1(e,t),i=await y(n.toString(),{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4});return{pools:(Array.isArray(i?.data)?i.data:[]).map(B1),totalCount:i?.total_count??null,page:r,size:o}}async function Xg(e={}){try{let{pools:t,totalCount:n}=await jc({size:3},e);return{ok:t.length>0,provider:"meteora-dlmm",poolsIndexed:n,sample:t.length,exec:!1}}catch(t){return{ok:!1,provider:"meteora-dlmm",error:String(t?.message||t),exec:!1}}}async function Qg(e={},t={}){let n=await jc({sortKey:e.sortKey||"tvl",orderBy:e.orderBy||"desc",...e},t),r=n.pools,o=Number(e.minTvlUsd);return Number.isFinite(o)&&(r=r.filter(i=>(i.tvlUsd??0)>=o)),e.excludeUnknown===!0&&(r=r.filter(i=>!i.unknownTokens)),{provider:"meteora-dlmm",chain:"solana-mainnet-beta",page:n.page,size:n.size,totalCount:n.totalCount,count:r.length,tvlUsd:r.reduce((i,s)=>i+(s.tvlUsd??0),0),pools:r}}async function Jg(e={},t={}){let n=e.filter??e.query??e.search,r=e.mints||e.includeTokenMints;if((n==null||!String(n).trim())&&!r)throw new Error("meteora-dlmm: poolSearch requires filter text or mints[]");let o=await jc({sortKey:e.sortKey||"tvl",orderBy:"desc",...e},t);return{provider:"meteora-dlmm",chain:"solana-mainnet-beta",filter:n??null,mints:r?Array.isArray(r)?r:[r]:[],page:o.page,size:o.size,totalCount:o.totalCount,count:o.pools.length,pools:o.pools}}N();var q1="https://ordinals.com";function Li(e={}){return String(e.baseUrl||e.ordinalsBase||process.env.ORDINALS_BASE_URL||q1).replace(/\/$/,"")}function H1(e,t="name"){let n=String(e||"").trim().toUpperCase().replace(/[•.\s_-]/g,"");if(!/^[A-Z]{1,28}$/.test(n))throw new Error(`ordinals-runes: ${t} must be 1-28 letters (spacers are stripped automatically)`);return n}async function Zg(e,t={}){let n=`${Li(t)}${e.startsWith("/")?e:`/${e}`}`,o=await(t.fetchImpl||fetch)(n,{method:"GET",headers:{accept:"application/json,text/plain;q=0.9,*/*;q=0.8"},signal:AbortSignal.timeout(t.timeoutMs??12e3)}),i=await o.text();if(!o.ok)throw new Error(`ordinals-runes GET ${e}: HTTP ${o.status} ${i.slice(0,160)}`);return i.trim()}function Vc(e,t={}){return y(`${Li(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3,headers:{Accept:"application/json"}})}async function ey(e={}){try{let t=await Zg("/r/blockheight",e),n=Number(t);return{ok:Number.isFinite(n)&&n>0,provider:"ordinals-runes",baseUrl:Li(e),blockHeight:n,exec:!1}}catch(t){return{ok:!1,provider:"ordinals-runes",baseUrl:Li(e),error:String(t?.message||t),exec:!1}}}async function ty(e={},t={}){let n=await Zg("/r/blockheight",t),r=Number(n);if(!Number.isFinite(r))throw new Error(`ordinals-runes: unexpected blockheight response ${n.slice(0,60)}`);return{provider:"ordinals-runes",blockHeight:r}}async function ny(e={},t={}){let n=e.height??e.block??e.hash;if(n==null||n==="")throw new Error("ordinals-runes: blockInfo requires height or hash");let r;if(/^[0-9a-f]{64}$/i.test(String(n)))r=String(n).toLowerCase();else{let i=Number(n);if(!Number.isInteger(i)||i<0)throw new Error("ordinals-runes: height must be a non-negative integer or a 64-hex block hash");r=String(i)}let o=await Vc(`/r/blockinfo/${r}`,t);return{provider:"ordinals-runes",height:o.height??null,hash:o.hash??null,timestamp:o.timestamp??null,difficulty:o.difficulty??null,transactionCount:o.transaction_count??null,averageFee:o.average_fee??null,averageFeeRate:o.average_fee_rate??null,feerangeSats:o.feerange??null,totalFee:o.total_fee??null,totalSize:o.total_size??null,confirmations:o.confirmations??null,raw:o}}async function ry(e={},t={}){let n=e.sat??e.ordinal,r=Number(n);if(!Number.isInteger(r)||r<0||r>209999999769e4)throw new Error("ordinals-runes: sat must be an integer in [0, 2099999997690000]");let o=Math.max(0,Number(e.page||0)),i=o>0?`/r/sat/${r}/${o}`:`/r/sat/${r}`,s=await Vc(i,t),a=Array.isArray(s?.ids)?s.ids:[];return{provider:"ordinals-runes",sat:r,page:o,inscriptionCount:a.length,inscriptionIds:a,more:!!s?.more,raw:s}}async function oy(e={},t={}){let n=H1(e.name||e.rune||e.runeName,"name"),r=await Vc(`/rune/${n}`,t),o=r?.entry||{},i=o.terms||{},s=i.cap==null?null:Number(i.cap),a=o.mints==null?null:Number(o.mints);return{provider:"ordinals-runes",name:n,spacedRune:o.spaced_rune??null,number:o.number??null,symbol:o.symbol??null,divisibility:o.divisibility??null,etchingBlock:o.block??null,etchingTxid:o.etching??null,premine:o.premine==null?null:String(o.premine),mints:a==null?null:String(a),burned:o.burned==null?null:String(o.burned),mintCap:s==null?null:String(s),mintProgressPct:s&&s>0&&a!=null?a/s*100:null,mintable:r?.mintable??null,amountPerMint:i.amount==null?null:String(i.amount),turbo:o.turbo??null,parent:r?.parent??null,raw:r}}N();var V1="https://hermes.pyth.network",Wc={"SOL/USD":"ef0d8b6fda2ceba41da15d4095d1da392a0d2f8ed0c6c7bc0f4cfac8c280b56d","BTC/USD":"e62df6c8b4a85fe1a67db44dc12de5db330f7ac66b72dc658afedf0f4a415b43","ETH/USD":"ff61491a931112ddf1bd8147cd1b641375f79f5825126d665480874634fd0ace","USDC/USD":"eaa020c61cc479712813461ce153894a96a6c00b21ed0cfc2798d1f9a9e9c94a","USDT/USD":"2b89b9dc8fdf9f34709a5b106b472f0f39bb6ca9ce04b0fd7f2e971688e2e53b","JUP/USD":"0a0408d619e9380abad35060f9192039ed5042fa6f82301d0e48bb52be830996","JTO/USD":"b43660a5f790c69354b0729a5ef9d50d68f1df92107540210b9cccba1f947cc2","BONK/USD":"72b021217ca3fe68922a19aaf990109cb9d84e9ad004b4d2025ad6f529314419","PYTH/USD":"0bbf28e9a841a1cc788f6a361b17ca072d0ea3098a1e5df1c3922d06719579ff","HYPE/USD":"4279e31cc369bbcc2faf022b382b080e32a8e689ff20fbc530d2a603eb6cd98b"},z1=/^[0-9a-fA-F]{64}$/;function iy(e={}){return String(e.baseUrl||process.env.PYTH_HERMES_URL||V1).replace(/\/$/,"")}function sy(e,t="feedId"){let n=String(e??"").trim();if(!n)throw new Error(`pyth-price-feeds: ${t} required`);let r=Wc[n.toUpperCase()]||Wc[`${n.toUpperCase()}/USD`];if(r)return r;let o=n.startsWith("0x")||n.startsWith("0X")?n.slice(2):n;if(!z1.test(o))throw new Error(`pyth-price-feeds: ${t} must be a 32-byte hex feed id or a known symbol`);return o.toLowerCase()}function zc(e={}){let t=Number(e.price),n=Number(e.expo);return!Number.isFinite(t)||!Number.isFinite(n)?null:t*10**n}function Gc(e={}){let t=zc({price:Number(e.price?.conf),expo:e.price?.expo}),n=zc(e.price);return{id:e.id||null,price:n,confidence:t,confidenceBps:n&&t!=null?Math.round(t/Math.abs(n)*1e4):null,emaPrice:zc(e.ema_price),publishTime:e.price?.publish_time??null,publishTimeIso:e.price?.publish_time?new Date(e.price.publish_time*1e3).toISOString():null,ageSeconds:e.price?.publish_time?Math.max(0,Math.round(Date.now()/1e3-e.price.publish_time)):null,expo:e.price?.expo??null,raw:{price:e.price??null,emaPrice:e.ema_price??null,metadata:e.metadata??null}}}async function Kc(e,t={}){let n=new URL(`${iy(t)}/v2/updates/price/latest`);for(let r of e)n.searchParams.append("ids[]",r);return n.searchParams.set("encoding","hex"),n.searchParams.set("parsed","true"),n.searchParams.set("ignore_invalid_price_ids","true"),y(n.toString(),{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3})}async function ay(e={}){try{let t=await Kc([Wc["SOL/USD"]],e),r=(Array.isArray(t?.parsed)?t.parsed.map(Gc):[])[0]||null;return{ok:!!(r&&Number.isFinite(r.price)&&r.price>0),provider:"pyth-price-feeds",solUsd:r?.price??null,ageSeconds:r?.ageSeconds??null,exec:!1}}catch(t){return{ok:!1,provider:"pyth-price-feeds",error:String(t?.message||t),exec:!1}}}async function cy(e={},t={}){let n=sy(e.feedId||e.id||e.symbol,"feedId"),r=await Kc([n],t),o=Array.isArray(r?.parsed)?r.parsed.map(Gc):[],i=o.find(s=>String(s.id).toLowerCase()===n)||o[0]||null;if(!i)throw new Error(`pyth-price-feeds: no price returned for feed ${n}`);return{provider:"pyth-price-feeds",chain:"solana-mainnet-beta",feedId:n,...i,binaryUpdate:r?.binary?.data?.[0]||null,binaryEncoding:r?.binary?.encoding||null}}async function ly(e={},t={}){let n=Array.isArray(e)?e:e.feedIds||e.ids||e.symbols||[],r=[...new Set(n.map(l=>sy(l,"feedIds[]")))];if(!r.length)throw new Error("pyth-price-feeds: feedIds[] required");let o=40,i=[];for(let l=0;l<r.length;l+=o)i.push(r.slice(l,l+o));let s=[];for(let l of i)s.push(await Kc(l,t));let a=s.flatMap(l=>Array.isArray(l?.parsed)?l.parsed.map(Gc):[]),c=Object.fromEntries(a.map(l=>[String(l.id).toLowerCase(),l]));return{provider:"pyth-price-feeds",chain:"solana-mainnet-beta",requested:r.length,returned:a.length,missing:r.filter(l=>!c[l]),prices:a,byId:c}}async function uy(e={},t={}){let n=new URL(`${iy(t)}/v2/price_feeds`);e.query&&n.searchParams.set("query",String(e.query)),n.searchParams.set("asset_type",String(e.assetType||"crypto"));let r=await y(n.toString(),{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),o=Array.isArray(r)?r:[];return{provider:"pyth-price-feeds",count:o.length,feeds:o.map(i=>({id:i.id,symbol:i.attributes?.symbol||null,displaySymbol:i.attributes?.display_symbol||null,base:i.attributes?.base||null,quote:i.attributes?.quote_currency||null,assetType:i.attributes?.asset_type||null}))}}N();var G1="https://relayscan.io",dy=new Set(["1h","12h","24h","7d"]);function Yc(e={}){return(e.baseUrl||process.env.RELAYSCAN_API_URL||G1).replace(/\/$/,"")}function py(e={}){let t=String(e.timespan||e.t||"24h").toLowerCase();if(!dy.has(t))throw new Error(`relayscan-mev: timespan must be one of ${[...dy].join(", ")}`);return t}function K1(e={}){let t=e.date||e.day;if(t==null)return new Date(Date.now()-864e5).toISOString().slice(0,10);let n=String(t).trim();if(!/^\d{4}-\d{2}-\d{2}$/.test(n))throw new Error("relayscan-mev: date must be YYYY-MM-DD");return n}async function Xc(e={},t={}){return y(`${Yc(t)}/overview/json?t=${py(e)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function my(e={},t={}){return y(`${Yc(t)}/builder-profit/json?t=${py(e)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function fy(e={},t={}){let n=K1(e);return y(`${Yc(t)}/stats/day/${n}/json`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??25e3})}async function hy(e={}){let t=await Xc({timespan:"1h"},e);return{ok:Array.isArray(t?.relays)&&t.relays.length>0,provider:"relayscan-mev",relays:Array.isArray(t?.relays)?t.relays.length:0}}N();var X1="https://extra-api.sanctum.so",Q1=30,J1=["jitoSOL","mSOL","bSOL","INF","hSOL","bonkSOL","jupSOL","dSOL"];function Qc(e={}){return String(e.baseUrl||process.env.SANCTUM_API_URL||X1).replace(/\/$/,"")}function gy(e,t="lst"){let n=String(e??"").trim();if(!n||/[?&=\s]/.test(n))throw new Error(`sanctum-lst: ${t} must be an LST symbol or mint`);return n}function Z1(e,t){let n=[];for(let r=0;r<e.length;r+=t)n.push(e.slice(r,r+t));return n}async function jt(e,t,n={}){let r={},o={};for(let i of Z1(t,Q1)){let s=new URL(`${Qc(n)}/v1/${e}`);for(let l of i)s.searchParams.append("lst",l);let a=await y(s.toString(),{fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs??2e4}),c=a?.apys||a?.tvls||a?.solValues||{};Object.assign(r,c),Object.assign(o,a?.errs||{})}return{values:r,errs:o}}async function yy(e={}){try{let[t,n]=await Promise.all([y(`${Qc(e)}/v1/lsts`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??15e3}),jt("apy/inception",["jitoSOL"],e)]),r=Array.isArray(t?.lsts)?t.lsts:[];return{ok:r.length>0&&Number.isFinite(Number(n.values.jitoSOL)),provider:"sanctum-lst",lstCount:r.length,jitoSolApyInception:Number(n.values.jitoSOL)??null,exec:!1}}catch(t){return{ok:!1,provider:"sanctum-lst",error:String(t?.message||t),exec:!1}}}async function Jc(e={},t={}){let n=await y(`${Qc(t)}/v1/lsts`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4}),r=(Array.isArray(n?.lsts)?n.lsts:[]).map(i=>({symbol:i.symbol||null,name:i.name||null,mint:i.mint||null,decimals:i.decimals??null,pool:i.pool?.pool||null,poolProgram:i.pool?.program||null,voteAccount:i.pool?.vote_account||null,logoUri:i.logo_uri||null}));if(e.symbol){let i=String(e.symbol).toLowerCase();r=r.filter(s=>String(s.symbol||"").toLowerCase()===i||s.mint===e.symbol)}let o=Number(e.limit);return Number.isFinite(o)&&o>0&&(r=r.slice(0,o)),{provider:"sanctum-lst",chain:"solana-mainnet-beta",count:r.length,lsts:r}}async function by(e={},t={}){let n=e.lsts||e.symbols||null;e.all===!0&&(n=(await Jc({},t)).lsts.map(c=>c.symbol).filter(Boolean)),(!Array.isArray(n)||!n.length)&&(n=J1);let r=[...new Set(n.map(a=>gy(a,"lsts[]")))],[o,i]=await Promise.all([jt("apy/latest",r,t),jt("apy/inception",r,t)]),s=r.map(a=>{let c=Number(o.values[a]),l=Number(i.values[a]);return{lst:a,apyLatest:Number.isFinite(c)?c:null,apyLatestPct:Number.isFinite(c)?c*100:null,apyInception:Number.isFinite(l)?l:null,apyInceptionPct:Number.isFinite(l)?l*100:null,error:o.errs[a]||i.errs[a]||null}});return s.sort((a,c)=>(c.apyInception??-1)-(a.apyInception??-1)),{provider:"sanctum-lst",chain:"solana-mainnet-beta",count:s.length,apys:s,byLst:Object.fromEntries(s.map(a=>[a.lst,a]))}}async function wy(e={},t={}){let n=gy(e.lst||e.mint||e.symbol,"lst"),[r,o,i,s]=await Promise.all([jt("apy/latest",[n],t),jt("apy/inception",[n],t),jt("tvl/current",[n],t).catch(()=>({values:{},errs:{}})),jt("sol-value/current",[n],t).catch(()=>({values:{},errs:{}}))]),a=Number(r.values[n]),c=Number(o.values[n]),l=r.errs[n]||o.errs[n]||null;if(!Number.isFinite(a)&&!Number.isFinite(c))throw new Error(`sanctum-lst: no APY for ${n}${l?` (${JSON.stringify(l)})`:""}`);let u=s.values[n];return{provider:"sanctum-lst",chain:"solana-mainnet-beta",lst:n,apyLatest:Number.isFinite(a)?a:null,apyLatestPct:Number.isFinite(a)?a*100:null,apyInception:Number.isFinite(c)?c:null,apyInceptionPct:Number.isFinite(c)?c*100:null,tvlLamports:i.values[n]??null,tvlSol:i.values[n]!=null?Number(i.values[n])/1e9:null,solValueLamports:u??null,solPerToken:u!=null?Number(u)/1e9:null,error:l}}N();var tP="https://api.save.finance",nP="4UpD2fh7xH3VP9QQaXtsS1YY3bxzWhtfpks7FatyKvdY",xy="CCpirWrgNuBVLdkP2haxLTbD6XqEgaYuVXixbbpxUB6",rP=/^[1-9A-HJ-NP-Za-km-z]{32,44}$/;function Zc(e={}){return String(e.baseUrl||process.env.SAVE_API_URL||process.env.SOLEND_API_URL||tP).replace(/\/$/,"")}function Sy(e,t="address"){let n=String(e??"").trim();if(!rP.test(n))throw new Error(`solend-lending: ${t} must be a base58 public key`);return n}function ky(e){let t=Number(e);return Number.isFinite(t)?t:null}function oP(e={}){return{address:e.address||null,name:e.name||null,description:e.description||"",isPrimary:!!e.isPrimary,isPermissionless:!!e.isPermissionless,hidden:!!e.hidden,owner:e.owner||null,authorityAddress:e.authorityAddress||null,lookupTableAddress:e.lookupTableAddress||null,reserveCount:Array.isArray(e.reserves)?e.reserves.length:0,reserves:(e.reserves||[]).map(t=>({address:t.address||null,symbol:t.liquidityToken?.symbol||null,name:t.liquidityToken?.name||null,mint:t.liquidityToken?.mint||null,decimals:t.liquidityToken?.decimals??null,collateralMint:t.collateralMintAddress||null,pythOracle:t.pythOracle||null,switchboardOracle:t.switchboardOracle||null,volume24h:t.liquidityToken?.volume24h??null}))}}function iP(e={}){let t=e.reserve||{},n=t.liquidity||{},r=t.collateral||{};return{address:e.address||t.address||null,lendingMarket:t.lendingMarket||null,mint:n.mintPubkey||null,mintDecimals:n.mintDecimals??null,supplyApyPct:ky(e.rates?.supplyInterest),borrowApyPct:ky(e.rates?.borrowInterest),cTokenExchangeRate:e.cTokenExchangeRate??null,availableAmount:n.availableAmount??null,borrowedAmountWads:n.borrowedAmountWads??null,marketPrice:n.marketPrice??null,collateralMint:r.mintPubkey||null,collateralTotalSupply:r.mintTotalSupply??null,rewards:e.rewards||[],lastUpdateSlot:t.lastUpdate?.slot??null,stale:t.lastUpdate?.stale===1,raw:e}}async function Ey(e={}){try{let t=await y(`${Zc(e)}/v1/reserves?ids=${xy}`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??15e3}),n=Array.isArray(t?.results)?t.results:[];return{ok:n.length>0,provider:"solend-lending",probeReserve:xy,reserves:n.length,exec:!1}}catch(t){return{ok:!1,provider:"solend-lending",error:String(t?.message||t),exec:!1}}}async function el(e={},t={}){let n=new URL(`${Zc(t)}/v1/markets/configs`);e.scope&&n.searchParams.set("scope",String(e.scope)),e.deployment&&n.searchParams.set("deployment",String(e.deployment));let r=await y(n.toString(),{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??(e.scope==="all"?45e3:2e4)}),o=(Array.isArray(r)?r:[]).map(oP);if(e.includeHidden!==!0&&(o=o.filter(s=>!s.hidden)),e.name){let s=String(e.name).toLowerCase();o=o.filter(a=>String(a.name||"").toLowerCase()===s)}let i=Number(e.limit);return Number.isFinite(i)&&i>0&&(o=o.slice(0,i)),{provider:"solend-lending",chain:"solana-mainnet-beta",scope:e.scope||"default",count:o.length,markets:o}}async function vy(e={},t={}){let n=[];if(e.ids||e.reserves)n=(Array.isArray(e.ids||e.reserves)?e.ids||e.reserves:String(e.ids||e.reserves).split(",")).map(a=>Sy(String(a).trim(),"reserve"));else{let s=Sy(e.market||e.marketAddress||nP,"market"),c=(await el({scope:"all",includeHidden:!0},t)).markets.find(l=>l.address===s);if(!c)throw new Error(`solend-lending: market ${s} not found`);n=c.reserves.map(l=>l.address).filter(Boolean)}if(!n.length)throw new Error("solend-lending: no reserves to query");let r=Number.isFinite(Number(e.limit))&&Number(e.limit)>0?Number(e.limit):50;n=n.slice(0,r);let o=await y(`${Zc(t)}/v1/reserves?ids=${n.join(",")}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??25e3}),i=(Array.isArray(o?.results)?o.results:[]).map((s,a)=>({...iP(s),address:s.address||s.reserve?.address||n[a]||null}));return{provider:"solend-lending",chain:"solana-mainnet-beta",requested:n.length,count:i.length,reserves:i}}function tl(e,t){let n;try{n=BigInt(e)}catch{throw new Error(`${t} must be a positive integer amount`)}if(n<=0n)throw new Error(`${t} must be a positive integer amount`);return n}function Vt(e,t,n,r){let o=Number(e);if(!Number.isInteger(o)||o<n||o>r)throw new Error(`${t} must be an integer between ${n} and ${r}`);return o}function Mr(e={}){if(!Number.isInteger(Number(e.chainId))||Number(e.chainId)<=0)throw new Error("strategy requires chainId");if(!String(e.tokenIn||"").trim()||!String(e.tokenOut||"").trim())throw new Error("strategy requires tokenIn and tokenOut");if(!String(e.taker||"").trim())throw new Error("strategy requires taker");return{chainId:Number(e.chainId),tokenIn:String(e.tokenIn),tokenOut:String(e.tokenOut),taker:String(e.taker),total:tl(e.amount,"amount")}}function nl(e,t){let n=t.map(s=>BigInt(s)),r=n.reduce((s,a)=>s+a,0n);if(r<=0n)throw new Error("weights must total above zero");let o=n.map(s=>e*s/r),i=e-o.reduce((s,a)=>s+a,0n);for(let s=0;i>0n;s=(s+1)%o.length)o[s]+=1n,i-=1n;return o}function Ur(e,t,n,r={}){return{kind:"execution-strategy-plan",strategy:t,chainId:e.chainId,tokenIn:e.tokenIn,tokenOut:e.tokenOut,taker:e.taker,totalAmount:String(e.total),slices:n,executable:!1,signs:!1,broadcasts:!1,requiresFreshQuotePerSlice:!0,requiresPolicyCheckPerSlice:!0,requiresSimulationPerSlice:!0,requiresUserConfirmationPerSlice:!0,receiptRequiredPerSlice:!0,...r}}function rl(e,t,n=Date.now()){let r=Math.floor(t/e.length);return e.map((o,i)=>({index:i+1,amount:String(o),offsetSec:i*r,executeAfter:new Date(n+i*r*1e3).toISOString()}))}function aP(e={},t={}){let n=Mr(e),r=Vt(e.slices??10,"slices",2,100),o=Vt(e.durationSec??3600,"durationSec",r,604800),i=nl(n.total,Array(r).fill(1));return Ur(n,"TWAP",rl(i,o,t.nowMs),{durationSec:o})}function cP(e={},t={}){let n=Mr(e);if(!Array.isArray(e.volumeProfile)||e.volumeProfile.length<2||e.volumeProfile.length>100)throw new Error("volumeProfile must contain 2-100 positive weights");let r=e.volumeProfile.map(c=>{let l=Number(c);if(!Number.isFinite(l)||l<=0)throw new Error("volumeProfile must contain positive weights");return BigInt(Math.round(l*1e6))}),o=Vt(e.durationSec??3600,"durationSec",r.length,604800),i=nl(n.total,r),s=r.reduce((c,l)=>c+l,0n),a=rl(i,o,t.nowMs).map((c,l)=>({...c,volumeWeightBps:Number(r[l]*10000n/s)}));return Ur(n,"VWAP",a,{durationSec:o,requiresLiveVolumeValidation:!0})}function lP(e={}){let t=Mr(e),n=Vt(e.participationBps,"participationBps",1,1e4);if(!Array.isArray(e.observedMarketVolumes)||e.observedMarketVolumes.length===0||e.observedMarketVolumes.length>100)throw new Error("observedMarketVolumes must contain 1-100 positive integer amounts");let r=t.total,o=[];for(let[i,s]of e.observedMarketVolumes.entries()){let a=tl(s,"observedMarketVolumes"),c=a*BigInt(n)/10000n,l=c>r?r:c;if(l>0n&&o.push({index:i+1,amount:String(l),observedMarketVolume:String(a)}),r-=l,r===0n)break}return Ur(t,"POV",o,{participationBps:n,residualAmount:String(r),requiresLiveVolumeValidation:!0})}function uP(e={}){let t=Mr(e),n=tl(e.displayAmount,"displayAmount");if(n>t.total)throw new Error("displayAmount cannot exceed total amount");let r=[],o=t.total;for(;o>0n;){if(r.length>=100)throw new Error("iceberg requires more than 100 refills");let i=o>n?n:o;r.push({index:r.length+1,amount:String(i),displayAmount:String(n)}),o-=i}return Ur(t,"ICEBERG",r,{displayAmount:String(n),refillCount:r.length-1})}function dP(e={},t={}){let n=Mr(e),r=Vt(e.slices??10,"slices",2,100),o=Vt(e.durationSec??3600,"durationSec",r,604800),i=Vt(e.urgencyBps??5e3,"urgencyBps",1,1e4),s=Array.from({length:r},(c,l)=>{let u=Math.floor(i*l/Math.max(1,r-1));return BigInt(Math.max(1,1e4-u))}),a=nl(n.total,s);return Ur(n,"IS",rl(a,o,t.nowMs),{durationSec:o,urgencyBps:i})}function Ay(e={},t={}){let n=String(e.strategy||"").trim().toUpperCase();if(n==="TWAP")return aP(e,t);if(n==="VWAP")return cP(e,t);if(n==="POV")return lP(e,t);if(n==="ICEBERG")return uP(e,t);if(n==="IS"||n==="IMPLEMENTATION SHORTFALL")return dP(e,t);throw new Error("strategy must be TWAP, VWAP, POV, ICEBERG, or IS")}function Iy(){return{ok:!0,provider:"execution-strategies",strategies:["TWAP","VWAP","POV","ICEBERG","IS"],execution:"plan-only",externalProtocol:!1}}var mP={"hl-info":{health:e=>Ku(e),allMids:e=>Xe(e),l2Book:(e,t={})=>mo(t.coin,e),outcomeMeta:e=>sr(e),clearinghouse:(e,t={})=>fo(t.user,e),userFills:(e,t={})=>Yu(t.user,e),meta:e=>ho(e),metaAndAssetCtxs:e=>nn(e),candleSnapshot:(e,t={})=>rn(t,e),openOrders:(e,t={})=>Qu(t.user,e),frontendOpenOrders:(e,t={})=>Ju(t.user,e),userState:(e,t={})=>go(t.user,e),spotMeta:e=>yo(e)},"hl-vaults":{health:e=>nd(e),summaries:(e,t={})=>Vs(t,e),details:(e,t={})=>bo(t,e),userEquities:(e,t={})=>zs(t,e),tracker:(e,t={})=>Ws(t,e)},"poly-public":{health:e=>od(e),time:e=>Gs(e),markets:(e,t={})=>id(t,e),book:(e,t={})=>sd(t.tokenId,e),midpoint:(e,t={})=>ad(t.tokenId,e),spread:(e,t={})=>cd(t.tokenId,e),price:(e,t={})=>ld(t.tokenId,{side:t.side},e),events:(e,t={})=>ud(t,e)},"evm-rpc":{health:(e,t={})=>Qn(t.chainId??1,e),healthAll:(e,t={})=>fu({...e,chainIds:t.chainIds}),blockNumber:(e,t={})=>eo(t.chainId??1,e),chainId:(e,t={})=>pu(t.chainId??1,e),getBalance:(e,t={})=>Zt(t.chainId??1,t.address,e),call:(e,t={})=>L(t.chainId??1,t.method,t.params||[],e),erc20Allowance:(e,t={})=>mu(t,e),erc20Balance:(e,t={})=>to(t,e),transactionReceipt:(e,t={})=>no(t,e)},portfolio:{health:e=>ph(e),balances:(e,t={})=>yi(t,e),snapshot:(e,t={})=>Nh(t,e),history:(e,t={})=>pc(t,e),valueGraph:(e,t={})=>Oh(t,e)},"nft-portfolio":{health:e=>wh(e),inventory:(e,t={})=>Cn(t,e),gallery:(e,t={})=>Eh(t,e),pnl:(e,t={})=>kh(t,e),prepareList:(e,t={})=>xh(t,e),traitSnipe:(e,t={})=>Sh(t,e)},"contract-risk":{health:e=>Rh(e),scan:(e,t={})=>Ft(t,e)},"evm-token-sniper":{health:e=>Mh(e),scan:(e,t={})=>Lh(t,e)},"evm-simulate":{health:e=>Bh(e),simulate:(e,t={})=>Tr(t,e)},"nft-mint":{health:e=>Fh(e),discover:(e,t={})=>vi(t,e),prepare:(e,t={})=>hc(t,e),priceGas:(e,t={})=>Ei(t,e),createTrigger:(e,t={})=>qh(t,e),checkOpen:(e,t={})=>Hh(t,e)},"solana-rpc":{health:e=>pd(e),latestBlockhash:(e,t={})=>Ys(t,e),getBalance:(e,t={})=>wo(t,e),tokenAccounts:(e,t={})=>lr(t,e),simulate:(e,t={})=>md(t,e)},"bitcoin-esplora":{health:e=>fd(e),tipHeight:e=>hd(e),fees:e=>gd(e),address:(e,t={})=>So(t,e),utxos:(e,t={})=>yd(t,e),tx:(e,t={})=>bd(t,e),decode:(e,t={})=>wd(t,e)},"bitcoin-meta":{health:e=>Ed(e),runeBalances:(e,t={})=>Eo(t,e),inscriptions:(e,t={})=>an(t,e),inscriptionInfo:(e,t={})=>vd(t,e),inscriptionChildren:(e,t={})=>Ad(t,e),ordBlockInfo:(e,t={})=>Id(t,e)},satflow:{health:e=>Pd(e),collectionFloors:(e,t={})=>Cd(t,e),collectionStats:(e,t={})=>Td(t,e),item:(e,t={})=>Nd(t,e),walletContents:(e,t={})=>Ao(t,e),floorListings:(e,t={})=>Od(t,e),preparePurchase:(e,t={})=>$d(t,e),prepareList:(e,t={})=>Io(t,e)},jupiter:{health:e=>Hd(e),venues:(e,t={})=>qd(t,e),quote:(e,t={})=>Co(t,e),prepare:(e,t={})=>jd(t,e)},defillama:{health:e=>zd(e),prices:(e,t={})=>Oe(t.coins||[],e),pricesBySymbol:(e,t={})=>Yd(t.symbols,e),protocols:e=>To(e),yields:(e,t={})=>Wd(t,e),stablecoins:(e,t={})=>Gd(t,e),dexVolumes:(e,t={})=>Kd(t,e)},lifi:{health:e=>rp(e),quote:(e,t={})=>lt(t,e),prepare:(e,t={})=>op(t,e),chains:e=>ip(e)},dexscreener:{health:e=>hu(e),token:(e,t={})=>Nt(t.address||t.tokenAddress,e),search:(e,t={})=>Jn(t.q||t.query,e),pair:(e,t={})=>gu(t.chainId,t.pairAddress,e)},"uniswap-v3":{health:(e,t={})=>Tu({...e,chainId:t.chainId??8453}),quote:(e,t={})=>it(t,e),prepare:(e,t={})=>Cu(t,e),quotePath:(e,t={})=>Pu(t,e),ethUsdc:(e,t={})=>Os(t,e),chains:()=>Nu()},"uniswap-v4":{health:(e,t={})=>Uu({...e,chainId:t.chainId??8453}),quote:(e,t={})=>co(t,e),chains:()=>Mu()},aerodrome:{health:(e,t={})=>mp({...e,chainId:t.chainId??8453}),quote:(e,t={})=>$o(t,e),prepare:(e,t={})=>pp(t,e),chains:()=>fp()},zerox:{health:e=>bp(e),price:(e,t={})=>ua(t,e),quote:(e,t={})=>Rt(t,e),prepare:(e,t={})=>wp(t,e)},across:{health:e=>da(e),suggestedFees:(e,t={})=>Mo(t,e)},hop:{health:e=>pa(e),quote:(e,t={})=>Uo(t,e)},relay:{health:e=>ma(e),quote:(e,t={})=>dr(t,e),prepare:(e,t={})=>fa(t,e)},cowswap:{health:e=>_p(e),quote:(e,t={})=>dt(t,e),prepareOrder:(e,t={})=>Pp(t,e),order:(e,t={})=>Tp(t,e),status:(e,t={})=>Cp(t,e),chains:()=>Np()},oneinch:{health:e=>Rp(e),quote:(e,t={})=>fr(t,e),prepare:(e,t={})=>$p(t,e),approveSpender:(e,t={})=>xa(t,e)},"hl-ws":{health:e=>Lp(e),allMids:e=>Mp(e),l2Book:(e,t={})=>Up(t.coin,e),snapshot:(e,t={})=>hr(t.subscription||t,e)},"poly-ws":{health:(e,t={})=>Bp({...e,assetId:t.assetId}),book:(e,t={})=>Dp(t.assetId||t.tokenId,e),snapshot:(e,t={})=>qo(t.assetIds||t.assets_ids||[t.assetId],e)},"opensea-nft":{health:e=>zp(e),collection:(e,t={})=>Vo(t.slug,e),floor:(e,t={})=>Wp(t.slug,e),accountNfts:(e,t={})=>gr(t,e),accountPnl:(e,t={})=>zo(t,e),prepareList:(e,t={})=>Wo(t,e)},"hl-outcome":{list:e=>Pm(e),prepareOrder:(e,t={})=>Cm(t,e),prepareCancel:(e,t={})=>Tm(t,e)},"protocol-templates":{health:()=>({ok:!0,templates:si().map(e=>e.id),firmAudit:!1}),list:()=>si(),gate:(e,t={})=>Da(t.templateId||t.id,e),prepareDeploy:(e,t={})=>Zm(t,e)},"poly-clob":{prepareOrder:(e,t={})=>Mm(t||{})},"hl-perps":{health:e=>Ta(e),assetInfo:(e,t={})=>Lt(t,e),prepareOrder:(e,t={})=>Sr(t,e),prepareCancel:(e,t={})=>ei(t,e),prepareLeverage:(e,t={})=>Am(t,e),prepareIsolatedMargin:(e,t={})=>Im(t,e),prepareBracket:(e,t={})=>_m(t,e),prepareBuilderApproval:(e,t={})=>vm(t,e)},"hl-markets":{health:e=>Ta(e),markets:(e,t={})=>Yo(t,e),leaderboards:(e,t={})=>pm(t,e),coin:(e,t={})=>mm(t,e),spot:(e,t={})=>fm(t,e)},"magiceden-sol":{health:e=>Jp(e),stats:(e,t={})=>ka(t,e),listings:(e,t={})=>em(t,e),tokenListings:(e,t={})=>tm(t,e),prepareBuy:(e,t={})=>nm(t,e),prepareList:(e,t={})=>Go(t,e),prepareMint:(e,t={})=>rm(t,e)},"hl-staking":{health:e=>im(e),validators:e=>Aa(e),delegatorSummary:(e,t={})=>Ia(t,e),delegations:(e,t={})=>_a(t,e),rewards:(e,t={})=>sm(t,e),history:(e,t={})=>am(t,e),preflight:(e,t={})=>dm(t,e),prepareStakeDeposit:(e,t={})=>cm(t,e),prepareStakeWithdraw:(e,t={})=>lm(t,e),prepareDelegate:(e,t={})=>um(t,e)},"hyperevm-dex":{health:e=>Kp(e),search:(e,t={})=>Yp(t.q||t.query||"HYPE",e),token:(e,t={})=>Xp(t.address||t.tokenAddress,e)},geckoterminal:{health:e=>rf(e),networks:(e,t={})=>Fa(t,e),pool:(e,t={})=>ef(t,e),token:(e,t={})=>tf(t,e),ohlcv:(e,t={})=>nf(t,e)},curve:{health:e=>yf(e),openapi:e=>gf(e),pools:(e,t={})=>Ha(t,e),quote:(e,t={})=>ja(t,e),prepare:(e,t={})=>bf(t,e)},gmx:{health:e=>Cf(e),tickers:(e,t={})=>ui(t,e),markets:(e,t={})=>_f(t,e),marketsInfo:(e,t={})=>za(t,e),tokens:(e,t={})=>Pf(t,e),prepareOrder:(e,t={})=>Rf(t,e),positions:(e,t={})=>Tf(t,e),orderStatus:(e,t={})=>Nf(t,e),verifyOrder:(e,t={})=>Of(t,e)},morpho:{health:e=>Uf(e),markets:(e,t={})=>Mf(t,e),vaults:(e,t={})=>Ka(t,e),prepareVault:(e,t={})=>Bf(t,e)},balancer:{health:e=>Wf(e),pools:(e,t={})=>zf(t,e),quote:(e,t={})=>Qa(t,e),prepare:(e,t={})=>Gf(t,e)},pendle:{health:e=>Yf(e),markets:(e,t={})=>Za(t,e),quote:(e,t={})=>Xf(t,e),prepare:(e,t={})=>ec(t,e)},odos:{health:e=>eh(e),chains:e=>nc(e),quote:(e,t={})=>Jf(t,e),prepare:(e,t={})=>Zf(t,e)},blockscout:{health:e=>ch(e),stats:(e,t={})=>ic(t,e),address:(e,t={})=>oh(t,e),token:(e,t={})=>ih(t,e)},paraswap:{health:e=>Vh(e),tokens:(e,t={})=>yc(t,e),price:(e,t={})=>yt(t,e),quote:(e,t={})=>yt(t,e),prepare:(e,t={})=>jh(t,e)},rfq:{health:e=>a0(e),intent:(e,t={})=>i0(t,e),quote:(e,t={})=>s0(t,e)},"polygon-staking":{health:e=>L0(e),validators:(e,t={})=>R0(t,e),validatorDetail:(e,t={})=>$0(t,e)},"aave-v3":{health:e=>D0(e),markets:(e,t={})=>M0(t,e),marketReserves:(e,t={})=>U0(t,e),chains:e=>B0(e)},"babylon-staking":{health:e=>q0(e),stats:e=>H0(e),finalityProviders:e=>j0(e),delegations:(e,t={})=>V0(t,e)},"bisq-markets":{health:e=>W0(e),markets:e=>G0(e),ticker:(e,t={})=>K0(t,e),trades:(e,t={})=>Y0(t,e)},"bob-rootstock":{health:(e,t={})=>Q0(t.chainId,e),stats:(e,t={})=>Rc(t,e),addressInfo:(e,t={})=>J0(t,e),tokenBalances:(e,t={})=>Z0(t,e)},"braiins-insights":{health:e=>eg(e),priceStats:e=>tg(e),poolStats:e=>ng(e)},"cow-protocol":{health:e=>ug(e),auction:e=>ag(e),openOrders:(e,t={})=>cg(t,e),recentTrades:(e,t={})=>lg(t,e)},"hiro-stacks":{health:e=>dg(e),networkInfo:e=>pg(e),stackingInfo:e=>mg(e),poxCycles:e=>fg(e),blocks:(e,t={})=>hg(t,e)},"jito-mev":{health:e=>bg(e),recentBundles:(e,t={})=>wg(t,e),tipFloor:e=>xg(e)},"kamino-strategies":{health:e=>kg(e),strategies:(e,t={})=>Eg(t,e),strategyMetrics:(e,t={})=>vg(t,e)},"liquid-esplora":{health:e=>Pg(e),tipHeight:e=>Cg(e),addressInfo:(e,t={})=>Tg(t,e),assetInfo:(e,t={})=>Ng(t,e)},"magiceden-ordinals":{health:e=>$g(e),collectionStat:(e,t={})=>Lg(t,e)},"mempool-lightning":{health:e=>Ug(e),statistics:e=>Bg(e),nodeRankings:(e,t={})=>Dg(t,e),nodeCountries:e=>Fg(e)},"mempool-mining":{health:e=>jg(e),difficulty:e=>Vg(e),poolShare:(e,t={})=>zg(t,e),hashrate:(e,t={})=>Wg(t,e),rewardStats:(e,t={})=>Gg(t,e)},"meteora-dlmm":{health:e=>Xg(e),pools:(e,t={})=>Qg(t,e),poolSearch:(e,t={})=>Jg(t,e)},"ordinals-runes":{health:e=>ey(e),blockHeight:e=>ty(e),blockInfo:(e,t={})=>ny(t,e),satInfo:(e,t={})=>ry(t,e),runeInfo:(e,t={})=>oy(t,e)},"pyth-price-feeds":{health:e=>ay(e),latestPrice:(e,t={})=>cy(t,e),latestPrices:(e,t={})=>ly(t,e),feedDirectory:e=>uy(e)},"relayscan-mev":{health:e=>hy(e),overview:(e,t={})=>Xc(t,e),builderProfit:(e,t={})=>my(t,e),dailyStats:(e,t={})=>fy(t,e)},"sanctum-lst":{health:e=>yy(e),lstList:e=>Jc(e),apyAll:e=>by(e),apyIndividual:(e,t={})=>wy(t,e)},"solend-lending":{health:e=>Ey(e),markets:e=>el(e),reserves:(e,t={})=>vy(t,e)},"execution-strategies":{health:()=>Iy(),plan:(e,t={})=>Ay(t)},"across-bridge":{health:e=>c0(e),pools:(e,t={})=>l0(t,e),suggestedFees:(e,t={})=>u0(t,e)},"beefy-yields":{health:e=>d0(e),apy:(e,t={})=>p0(t,e),apyBreakdown:e=>m0(e)},"birdeye-tokens":{health:e=>h0(e),tokenList:(e,t={})=>g0(t,e)},"celestia-da":{health:e=>y0(e),stats:e=>b0(e),blockStats:(e,t={})=>w0(t,e)},"das-assets":{health:e=>x0(e),assetsByOwner:(e,t={})=>S0(t,e),searchAssets:(e,t={})=>k0(t,e),assetProof:(e,t={})=>E0(t,e)},"l2beat-tvl":{health:e=>v0(e),tvl:(e,t={})=>A0(t,e),activity:(e,t={})=>I0(t,e)},"spark-lend":{health:e=>_0(e),markets:(e,t={})=>P0(t,e)},"symbiotic-restaking":{health:e=>C0(e),vaults:(e,t={})=>T0(t,e),vaultDetail:(e,t={})=>N0(t,e)}},_y=new Set(["prepareBuilderApproval","prepareBracket","prepareIsolatedMargin","prepareLeverage","prepareCancel","prepareOrder","preparePurchase","prepareList","prepareSell","prepareBuy","prepareMint","prepare","prepareStakeDeposit","prepareStakeWithdraw","prepareDelegate","prepareSwap","prepareTransfer","createOrder","cancelOrder"]),Py=new Set(["hl-exec"]);function fP(e){return Py.has(String(e||""))}function hP(e,t,n={}){let r=String(t||""),o=`${e}.${r}`;if(Py.has(e))throw new Error(`data plane forbidden execution provider: ${e}`);let i=ir().find(s=>s.id===e);if(/sign|execute|broadcast|submit|send|write|place/i.test(r)&&!_y.has(r))throw new Error(`data plane forbidden op: ${o}`);if(i&&Array.isArray(i.ops)&&i.ops.length>0&&!i.ops.includes(r))throw new Error(`data plane: provider ${e} does not support op ${r}`);if(_y.has(r)&&n&&typeof n=="object"&&Object.defineProperty(n,"__oracleStateCreating",{value:!0,enumerable:!1,configurable:!0}),e==="evm-rpc"&&r==="call"){let s=String(n?.method||"").trim();if(!new Set(["eth_call","eth_getBalance","eth_blockNumber","eth_chainId","eth_getCode","eth_getLogs","eth_getTransactionByHash","eth_getTransactionReceipt","eth_getBlockByNumber","eth_getBlockByHash","eth_feeHistory","eth_gasPrice","eth_maxPriorityFeePerGas","net_version","web3_clientVersion"]).has(s))throw new Error(`data plane allows only read-only JSON-RPC methods through evm-rpc.call: ${s||"<missing>"}`)}}async function S(e,t,n={},r={}){if(fP(e))throw new Error(`${e} is an execution provider: it signs and submits with a real key. dataCall() is the public read plane and will not route to it.`);hP(e,t,n);let o=po(e);if(!o)throw new Error(`Unknown data provider: ${e}`);if(!o.ops.includes(t))throw new Error(`Provider ${e} does not support op '${t}' (has: ${o.ops.join(", ")})`);let i=mP[e];if(!i||typeof i[t]!="function")throw new Error(`No client implementation for ${e}.${t}`);return i[t](r,n)}async function Cy({providers:e,fetchImpl:t,timeoutMs:n,includeRpc:r,includeWs:o,concurrency:i,healthCall:s}={}){let a=e||ir().map(d=>d.id);!o&&!e&&(a=a.filter(d=>d!=="hl-ws"&&d!=="poly-ws"));let c={fetchImpl:t,timeoutMs:n??8e3},l=typeof s=="function"?s:(d,p,m)=>S(d,"health",p,m),u={};return await Jt(a,i??8,async d=>{if(!po(d)){u[d]={ok:!1,ms:0,reason:"transport",error:"unknown provider"};return}let p=d==="evm-rpc"?{chainId:1}:{},m=await ne(()=>l(d,p,c));if(!m.ok){u[d]={ok:!1,ms:m.ms,reason:"transport",error:m.error};return}let f=m.data;if(f&&typeof f=="object"&&f.ok===!1){u[d]={ok:!1,ms:m.ms,reason:"provider",error:f.error||f.message||"provider reported unhealthy",detail:f};return}u[d]={ok:!0,ms:m.ms,detail:f}}),{when:new Date().toISOString(),plane:"data",exec:!1,providers:u}}function Ty(){return ir().map(e=>({id:e.id,venue:e.venue,chainIds:e.chainIds,auth:e.auth,ops:e.ops,execution:e.execution||"read-only",description:e.description}))}var gP={catalog:Ty,health:Cy,call:S,hl:{health:e=>S("hl-info","health",{},e),allMids:e=>S("hl-info","allMids",{},e),l2Book:(e,t)=>S("hl-info","l2Book",{coin:e},t),outcomeMeta:e=>S("hl-info","outcomeMeta",{},e),clearinghouse:(e,t)=>S("hl-info","clearinghouse",{user:e},t),userFills:(e,t)=>S("hl-info","userFills",{user:e},t),meta:e=>S("hl-info","meta",{},e),metaAndAssetCtxs:e=>S("hl-info","metaAndAssetCtxs",{},e),candleSnapshot:(e,t)=>S("hl-info","candleSnapshot",e||{},t),openOrders:(e,t)=>S("hl-info","openOrders",{user:e},t),userState:(e,t)=>S("hl-info","userState",{user:e},t),spotMeta:e=>S("hl-info","spotMeta",{},e),vaults:{health:e=>S("hl-vaults","health",{},e),summaries:(e,t)=>S("hl-vaults","summaries",e||{},t),details:(e,t)=>S("hl-vaults","details",e||{},t),mine:(e,t)=>S("hl-vaults","userEquities",{user:e},t),track:(e,t)=>S("hl-vaults","tracker",e||{},t)},staking:{health:e=>S("hl-staking","health",{},e),validators:e=>S("hl-staking","validators",{},e),summary:(e,t)=>S("hl-staking","delegatorSummary",{user:e},t),delegations:(e,t)=>S("hl-staking","delegations",{user:e},t),rewards:(e,t)=>S("hl-staking","rewards",{user:e},t),history:(e,t)=>S("hl-staking","history",{user:e},t),preflight:(e,t)=>S("hl-staking","preflight",{user:e},t),prepareStake:(e,t)=>S("hl-staking","prepareStakeDeposit",e||{},t),prepareUnstake:(e,t)=>S("hl-staking","prepareStakeWithdraw",e||{},t),prepareDelegate:(e,t)=>S("hl-staking","prepareDelegate",e||{},t)}},poly:{health:e=>S("poly-public","health",{},e),time:e=>S("poly-public","time",{},e),markets:(e,t)=>S("poly-public","markets",e||{},t),book:(e,t)=>S("poly-public","book",{tokenId:e},t),midpoint:(e,t)=>S("poly-public","midpoint",{tokenId:e},t),spread:(e,t)=>S("poly-public","spread",{tokenId:e},t),price:(e,t,n)=>S("poly-public","price",{tokenId:e,side:t},n),events:(e,t)=>S("poly-public","events",e||{},t)},polyClob:{prepareOrder:(e,t)=>S("poly-clob","prepareOrder",e||{},t)},rpc:{health:(e,t)=>S("evm-rpc","health",{chainId:e},t),healthAll:(e,t)=>S("evm-rpc","healthAll",e||{},t),blockNumber:(e,t)=>S("evm-rpc","blockNumber",{chainId:e},t),getBalance:(e,t,n)=>S("evm-rpc","getBalance",{chainId:e,address:t},n),call:(e,t,n,r)=>S("evm-rpc","call",{chainId:e,method:t,params:n},r)},evmSniper:{health:e=>S("evm-token-sniper","health",{},e),scan:(e,t)=>S("evm-token-sniper","scan",e||{},t)},portfolio:{balance:(e,t)=>S("portfolio","balances",e||{},t),snapshot:(e,t)=>S("portfolio","snapshot",e||{},t),history:(e,t)=>S("portfolio","history",e||{},t),valueGraph:(e,t)=>S("portfolio","valueGraph",e||{},t)},nft:{inventory:(e,t)=>S("nft-portfolio","inventory",e||{},t),gallery:(e,t)=>S("nft-portfolio","gallery",e||{},t),pnl:(e,t)=>S("nft-portfolio","pnl",e||{},t),prepareList:(e,t)=>S("nft-portfolio","prepareList",e||{},t),traitSnipe:(e,t)=>S("nft-portfolio","traitSnipe",e||{},t),floor:(e,t)=>S("opensea-nft","floor",{slug:e},t),collection:(e,t)=>S("opensea-nft","collection",{slug:e},t)},solana:{health:e=>S("solana-rpc","health",{},e),latestBlockhash:(e,t)=>S("solana-rpc","latestBlockhash",e||{},t),balance:(e,t)=>S("solana-rpc","getBalance",{address:e},t),tokenAccounts:(e,t)=>S("solana-rpc","tokenAccounts",e||{},t),simulate:(e,t)=>S("solana-rpc","simulate",e||{},t),jupiterQuote:(e,t)=>S("jupiter","quote",e||{},t),jupiterPrepare:(e,t)=>S("jupiter","prepare",e||{},t),nftStats:(e,t)=>S("magiceden-sol","stats",e||{},t),nftListings:(e,t)=>S("magiceden-sol","listings",e||{},t),nftTokenListings:(e,t)=>S("magiceden-sol","tokenListings",e||{},t),nftPrepareBuy:(e,t)=>S("magiceden-sol","prepareBuy",e||{},t),nftPrepareList:(e,t)=>S("magiceden-sol","prepareList",e||{},t),nftPrepareMint:(e,t)=>S("magiceden-sol","prepareMint",e||{},t)},bitcoin:{health:e=>S("bitcoin-esplora","health",{},e),tipHeight:e=>S("bitcoin-esplora","tipHeight",{},e),fees:e=>S("bitcoin-esplora","fees",{},e),address:(e,t)=>S("bitcoin-esplora","address",{address:e},t),utxos:(e,t)=>S("bitcoin-esplora","utxos",{address:e},t),tx:(e,t)=>S("bitcoin-esplora","tx",{txid:e},t),decode:(e,t)=>S("bitcoin-esplora","decode",e||{},t),metaHealth:e=>S("bitcoin-meta","health",{},e),runeBalances:(e,t)=>S("bitcoin-meta","runeBalances",{address:e},t),inscriptions:(e,t)=>S("bitcoin-meta","inscriptions",{address:e},t),satflowHealth:e=>S("satflow","health",{},e),satflowFloors:(e,t)=>S("satflow","collectionFloors",e||{},t),satflowWallet:(e,t)=>S("satflow","walletContents",{address:e},t)},prices:{health:e=>S("defillama","health",{},e),current:(e,t)=>S("defillama","prices",{coins:e},t),bySymbol:(e,t)=>S("defillama","pricesBySymbol",{symbols:e},t),protocols:e=>S("defillama","protocols",{},e)},lifi:{health:e=>S("lifi","health",{},e),quote:(e,t)=>S("lifi","quote",e||{},t),chains:e=>S("lifi","chains",{},e)},dex:{health:e=>S("dexscreener","health",{},e),token:(e,t)=>S("dexscreener","token",{address:e},t),search:(e,t)=>S("dexscreener","search",{q:e},t),pair:(e,t,n)=>S("dexscreener","pair",{chainId:e,pairAddress:t},n)},uni:{health:(e,t)=>S("uniswap-v3","health",e||{},t),quote:(e,t)=>S("uniswap-v3","quote",e||{},t),quotePath:(e,t)=>S("uniswap-v3","quotePath",e||{},t),ethUsdc:(e,t)=>S("uniswap-v3","ethUsdc",e||{},t),chains:e=>S("uniswap-v3","chains",{},e)},univ4:{health:(e,t)=>S("uniswap-v4","health",e||{},t),quote:(e,t)=>S("uniswap-v4","quote",e||{},t),chains:e=>S("uniswap-v4","chains",{},e)},bridges:{across:(e,t)=>S("across","suggestedFees",e||{},t),hop:(e,t)=>S("hop","quote",e||{},t),relay:(e,t)=>S("relay","quote",e||{},t)},cow:{quote:(e,t)=>S("cowswap","quote",e||{},t)},hlWs:{allMids:e=>S("hl-ws","allMids",{},e),l2Book:(e,t)=>S("hl-ws","l2Book",{coin:e},t)},polyWs:{book:(e,t)=>S("poly-ws","book",{assetId:e},t)}};var Le=Object.freeze({FULL:"FULL",NO_GAS:"NO_GAS",FAILED:"FAILED"}),Oy={1:"coingecko:ethereum",10:"coingecko:ethereum",56:"coingecko:binancecoin",137:"coingecko:matic-network",8453:"coingecko:ethereum",42161:"coingecko:ethereum",43114:"coingecko:avalanche-2",999:"coingecko:ethereum"},Br=e=>{try{return e==null||e===""?null:BigInt(String(e).split(".")[0])}catch{return null}};function Ny(e){let{source:t,amountOut:n,minOut:r=null,gasUsd:o=null,feeUsd:i=null,oracleFeeBps:s=0,estimatedGas:a=null,liquidityUsd:c=null,error:l=null,executionReady:u=!1,meta:d={}}=e||{};if(l||n==null)return{source:t,quality:Le.FAILED,amountOut:null,error:l||"no amountOut returned"};let p=Br(n);if(p==null||p<=0n)return{source:t,quality:Le.FAILED,amountOut:null,error:"non-positive amountOut"};let m=Number(s);return{source:t,quality:o==null?Le.NO_GAS:Le.FULL,amountOut:p.toString(),minOut:Br(r)?.toString()??null,gasUsd:o,feeUsd:i,oracleFeeBps:Number.isFinite(m)&&m>0?Math.floor(m):0,estimatedGas:a==null?null:String(a),liquidityUsd:c==null?null:Number(c),executionReady:u,meta:d}}async function Ry(e,t,{divisor:n=1000n}={}){let r=Br(t);if(r==null||r<=0n)return null;let o=r/n>0n?r/n:1n;if(o>=r)return null;let i,s;try{[i,s]=await Promise.all([e(o),e(r)])}catch{return null}let a=Br(i),c=Br(s);if(a==null||c==null||a<=0n)return null;let l=Number(a)/Number(o),u=Number(c)/Number(r);return!Number.isFinite(l)||!Number.isFinite(u)||l<=0?null:{impactPct:(1-u/l)*100,probeAmountIn:o.toString(),probeAmountOut:a.toString(),fullAmountOut:c.toString()}}function $y(e,t,{maxImpactPct:n=25}={}){let r=[],o=[],i=(e.routes??[]).filter(a=>{let c=t?.[a.source];return c?c.impactPct>n?(r.push({source:a.source,impactPct:Number(c.impactPct.toFixed(2)),reason:`price impact ${c.impactPct.toFixed(1)}% exceeds ${n}% ceiling -- the venue cannot absorb this size near the quoted price`}),!1):!0:(o.push(a.source),!0)}),s=[...e.warnings??[]];return r.length&&s.push(`dropped ${r.length} route(s) on price impact: `+r.map(a=>`${a.source} (${a.impactPct}%)`).join(", ")),o.length&&s.push(`price impact NOT measured for: ${o.join(", ")}. These are unproven against thin liquidity, not proven safe.`),{...e,routes:i,best:i[0]??null,impactRejected:r,impactUnmeasured:o,warnings:s}}function ol(e,{destPriceUsd:t=null,destDecimals:n=null,liquidityFirst:r=!0,liquidityBandBps:o=50}={}){let i=e.filter(b=>b.quality!==Le.FAILED),s=e.filter(b=>b.quality===Le.FAILED),a=t!=null&&t>0&&n!=null&&n>=0,c=i.map(b=>{let k=BigInt(b.amountOut),x=0n,w=!1,v=BigInt(b.oracleFeeBps??0),T=v>0n?k*v/10000n:0n;if(a){let _=(b.gasUsd??0)+(b.feeUsd??0);if(_>0){let E=_/t*10**n;Number.isFinite(E)&&E>=0&&(x=BigInt(Math.floor(E)),w=!0)}else b.gasUsd===0&&(w=!0)}let I=x+T,R=k>I?k-I:0n;return{...b,grossOut:k.toString(),netOut:R.toString(),costInDest:x.toString(),oracleFeeInDest:T.toString(),costAccounted:w}}),l=Number(o)>0?Number(o):0,u=c.reduce((b,k)=>BigInt(k.netOut)>b?BigInt(k.netOut):b,0n),d=b=>u>0n?Number((u-BigInt(b))*10000n/u):0,p=[],m=c.slice().sort((b,k)=>BigInt(k.netOut)>BigInt(b.netOut)?1:-1)[0]??null;c.sort((b,k)=>{let x=d(b.netOut)<=l?0:1,w=d(k.netOut)<=l?0:1;if(r&&l>0&&x!==w)return x-w;if(r&&l>0){let v=b.liquidityUsd??-1,T=k.liquidityUsd??-1;if(v!==T)return T-v}return BigInt(k.netOut)>BigInt(b.netOut)?1:-1}),r&&l>0&&m&&c[0]&&c[0].source!==m.source&&p.push(`liquidity-first: chose ${c[0].source} (liquidity $${c[0].liquidityUsd??"unknown"}) over best-price ${m.source} within ${l} bps`);let f=c.filter(b=>!b.costAccounted).map(b=>b.source);a?f.length&&p.push(`gas not reported by: ${f.join(", ")}. These are ranked on gross output and may be overstated relative to gas-measured routes.`):p.push("destination price/decimals unavailable: ranked on GROSS output. Gas is not included, so a cheap-looking route may cost more to execute.");let h=null,g=null;if(c.length>=2&&c[0].costAccounted&&c[1].costAccounted){let b=BigInt(c[0].netOut),k=BigInt(c[1].netOut);k>0n&&(h=Number((b-k)*10000n/k),g=`${c[0].source} vs ${c[1].source}`)}return{best:c[0]??null,routes:c,failed:s,improvementBps:h,spreadBasis:g,rankedOn:a?"net-of-cost":"gross",warnings:p}}async function Mi(e,{timeoutMs:t=12e3}={}){let n=(o,i)=>Promise.race([o,new Promise((s,a)=>setTimeout(()=>a(new Error(`${i}: timeout`)),t))]);return(await Promise.allSettled(e.map(o=>n(Promise.resolve().then(o.run),o.source)))).map((o,i)=>{let s=e[i].source;return o.status==="rejected"?Ny({source:s,error:String(o.reason?.message||o.reason)}):Ny({source:s,...o.value})})}var We=e=>{let t=Number(e);return Number.isFinite(t)?t:null};function Ui(e){if(!Array.isArray(e))return null;let t=0,n=!1;for(let r of e){let o=We(r?.amountUSD);o!=null&&(t+=o,n=!0)}return n?t:null}async function My(e,t={}){let n=Oy[Number(e)];if(!n)return null;try{let r=await Oe([n],t);return We(r?.coins?.[n]?.price)}catch{return null}}var bt=e=>String(e??"").toLowerCase().replace(/[^a-z0-9]/g,""),Ly=Object.freeze({across:["across"],relay:["relaychain","relay"],lifi:["jumper-(li.fi-powered)","lifi"],stargate:["stargate-v2","stargate-v1","stargate"],hop:["hop-protocol","hop"],debridge:["debridge"],synapse:["synapse"],connext:["connext"],cbridge:["celer-bridge","celer-cbridge","cbridge"],celer:["celer-bridge","celer-cbridge","cbridge"],squid:["squid"],symbiosis:["symbiosis"],wormhole:["wormhole"],mayan:["mayan"],allbridge:["allbridge"],thorchain:["thorchain"]});async function yP(e={}){try{let t=await To({...e,baseUrl:e.defillamaApiBaseUrl,timeoutMs:e.defillamaTimeoutMs??Math.min(Number(e.timeoutMs??5e3),5e3)});return Array.isArray(t)?t:[]}catch{return[]}}function bP(e,t={}){let n=bt(t.tool||t.provider||t.bridge||t.protocol),r=[];return e==="lifi"&&n&&n!=="lifi"&&r.push(...Ly[n]||[n]),r.push(...Ly[bt(e)]||[e]),r}function wP(e,t,n={}){let r=Array.isArray(e)?e:[],o=bP(t,n).map(bt).filter(Boolean);for(let i of o){let s=r.find(c=>bt(c?.slug)===i||bt(c?.name)===i),a=We(s?.tvl);if(a!=null)return{liquidityUsd:a,protocol:s?.name??s?.slug??i}}for(let i of o){let s=r.find(c=>{let l=bt(c?.category);return!l.includes("bridge")&&!l.includes("crosschain")?!1:bt(c?.slug).includes(i)||bt(c?.name).includes(i)}),a=We(s?.tvl);if(a!=null)return{liquidityUsd:a,protocol:s?.name??s?.slug??i}}return null}function il({chainId:e,tokenIn:t,tokenOut:n,amountIn:r,taker:o,slippageBps:i,decimalsIn:s,decimalsOut:a,nativePriceUsd:c=null,destDecimalsPromise:l=null,opts:u={}}){let d=[];return d.push({source:"lifi",run:async()=>{let p=await lt({fromChain:e,toChain:e,fromToken:t,toToken:n,fromAmount:r},u),m=p?.estimate??p?.[0]?.estimate;return{amountOut:m?.toAmount,minOut:m?.toAmountMin,gasUsd:Ui(m?.gasCosts),feeUsd:Ui(m?.feeCosts),oracleFeeBps:p?.oracleFee?.applies?p.oracleFee.bps:0,meta:{tool:p?.tool??p?.toolDetails?.name,oracleFee:p?.oracleFee??null}}}}),s!=null&&d.push({source:"paraswap",run:async()=>{let p=a??(await Promise.resolve(l))?.decimals;if(p==null)throw new Error("paraswap needs destination decimals; none supplied or resolvable");let m=await yt({chainId:e,srcToken:t,destToken:n,amount:r,srcDecimals:s,destDecimals:p},u),f=m?.priceRoute;return{amountOut:f?.destAmount,gasUsd:We(f?.gasCostUSD),oracleFeeBps:m?.oracleFee?.applies?m.oracleFee.bps:0,meta:{bestRoute:f?.bestRoute?.[0]?.swaps?.[0]?.swapExchanges?.[0]?.exchange,oracleFee:m?.oracleFee??null}}}}),process.env.ZEROX_API_KEY&&d.push({source:"0x",run:async()=>{let p=await Rt({chainId:e,sellToken:t,buyToken:n,sellAmount:r,taker:o},u),m=null,f=p?.totalNetworkFee,h=await Promise.resolve(c);return f!=null&&h&&(m=Number(f)/1e18*h),{amountOut:p?.buyAmount,minOut:p?.minBuyAmount,gasUsd:m,meta:{source:p?.route?.fills?.[0]?.source}}}}),process.env.ONEINCH_API_KEY&&d.push({source:"1inch",run:async()=>{let p=await fr({chainId:e,src:t,dst:n,amount:r},u),m=null;return p?.gas!=null&&c&&(m=null),{amountOut:p?.dstAmount,gasUsd:m,meta:{gasUnits:p?.gas}}}}),d.push({source:"cow",run:async()=>{let p=await dt({chainId:e,sellToken:t,buyToken:n,sellAmountBeforeFee:String(r),from:o},u),m=p?.quote??p,f=m?.feeAmount;return{amountOut:m?.buyAmount,gasUsd:0,meta:{intent:!0,feeAmountInSellToken:f,settlement:"solver-executed"}}}}),ce[Number(e)]&&d.push({source:"uniswap-v3",run:async()=>{let p=await it({chainId:e,tokenIn:t,tokenOut:n,amountIn:r},u);return{amountOut:p?.amountOut,minOut:p?.minOut??p?.amountOutMinimum??null,gasUsd:null,liquidityUsd:p?.liquidityUsd??null,meta:{onchain:!0,fee:p?.fee,gasUnits:p?.gasEstimate,quoter:p?.quoter}}}}),je[Number(e)]&&d.push({source:"uniswap-v4",run:async()=>{let p=await co({chainId:e,tokenIn:t,tokenOut:n,amountIn:r,recipient:o,slippageBps:i},u);return{amountOut:p?.amountOut,minOut:p?.minOut??p?.amountOutMinimum??null,gasUsd:null,liquidityUsd:p?.liquidityUsd??null,meta:{onchain:!0,venue:"uniswap-v4",fee:p?.fee,tickSpacing:p?.tickSpacing,poolId:p?.poolId,hooks:p?.hooks,gasUnits:p?.gasEstimate,quoter:p?.quoter,poolManager:p?.poolManager,prepareReady:p?.prepareReady===!0,executionReady:!1}}}}),d}function Uy({fromChainId:e,toChainId:t,tokenIn:n,tokenOut:r,amountIn:o,taker:i,opts:s={}}){let a=[],c=null,l=async(u,d={})=>(c||=yP(s),wP(await c,u,d));return a.push({source:"lifi",run:async()=>{let u=await lt({fromChain:e,toChain:t,fromToken:n,toToken:r,fromAmount:o},s),d=u?.estimate??u?.[0]?.estimate,p={tool:u?.tool??u?.toolDetails?.name,durationSeconds:We(d?.executionDuration)},m=await l("lifi",p);return{amountOut:d?.toAmount,minOut:d?.toAmountMin,gasUsd:Ui(d?.gasCosts),feeUsd:Ui(d?.feeCosts),oracleFeeBps:u?.oracleFee?.applies?u.oracleFee.bps:0,liquidityUsd:m?.liquidityUsd??null,meta:{...p,liquidityProtocol:m?.protocol,oracleFee:u?.oracleFee??null}}}}),a.push({source:"relay",run:async()=>{let{relayQuote:u}=await Promise.resolve().then(()=>(Do(),Bo)),p=(await u({user:i,originChainId:e,destinationChainId:t,originCurrency:n,destinationCurrency:r,amount:String(o)},s))?.details,m={durationSeconds:We(p?.timeEstimate),rate:p?.rate},f=await l("relay",m);return{amountOut:p?.currencyOut?.amount,minOut:p?.currencyOut?.minimumAmount,gasUsd:We(p?.totalImpact?.usd)!=null?Math.abs(We(p.totalImpact.usd)):null,liquidityUsd:f?.liquidityUsd??null,meta:{...m,liquidityProtocol:f?.protocol}}}}),a.push({source:"across",run:async()=>{let{acrossSuggestedFees:u}=await Promise.resolve().then(()=>(Do(),Bo)),d=await u({token:n,destinationToken:r,originChainId:e,destinationChainId:t,amount:String(o)},s),p=d?.totalRelayFee?.total,m=null;if(p!=null)try{let h=BigInt(String(o))-BigInt(String(p));h>0n&&(m=h.toString())}catch{}let f=await l("across");return{amountOut:m,gasUsd:null,liquidityUsd:f?.liquidityUsd??null,meta:{derivedFromFees:!0,durationSeconds:We(d?.estimatedFillTimeSec),limits:d?.limits?{min:d.limits.minDeposit,max:d.limits.maxDeposit}:void 0,liquidityProtocol:f?.protocol}}}}),a}var xP={1:"ethereum",10:"optimism",56:"bsc",137:"polygon",8453:"base",42161:"arbitrum",43114:"avax"};async function By(e,t,n){let r=xP[Number(e)];if(!r)return{priceUsd:null,decimals:null};let o=`${r}:${t}`;try{let s=(await Oe([o],n))?.coins?.[o],a=Number(s?.price),c=Number(s?.decimals);return{priceUsd:Number.isFinite(a)?a:null,decimals:Number.isFinite(c)?c:null}}catch{return{priceUsd:null,decimals:null}}}async function SP(e,t={}){let{chainId:n,tokenIn:r,tokenOut:o,amountIn:i}=e;if(n==null||!r||!o||i==null)throw new Error("bestSwapRoute requires chainId, tokenIn, tokenOut, amountIn");let s=My(n,t),a=By(n,o,t),c=il({...e,nativePriceUsd:s,decimalsOut:e.decimalsOut,destDecimalsPromise:a,opts:t}),[l,u]=await Promise.all([Mi(c,{timeoutMs:t.timeoutMs??12e3}),a]);s.catch(()=>{});let d=ol(l,{destPriceUsd:u.priceUsd,destDecimals:e.decimalsOut??u.decimals,liquidityBandBps:t.liquidityBandBps??50}),p=t.maxImpactPct===void 0?25:t.maxImpactPct;if(p!=null&&d.best){let m=d.best.source,h=await Ry(async g=>{let b=il({...e,amountIn:g.toString(),nativePriceUsd:s,decimalsOut:e.decimalsOut,destDecimalsPromise:a,opts:t}).filter(x=>x.source===m);return b.length?(await Mi(b,{timeoutMs:t.timeoutMs??12e3}))?.[0]?.amountOut??null:null},i);if(h){let g=$y(d,{[m]:h},{maxImpactPct:p});return{kind:"swap",chainId:n,tokenIn:r,tokenOut:o,amountIn:String(i),...g,sourcesTried:c.length,sourcesAnswered:l.filter(b=>b.quality!==Le.FAILED).length,note:sl(g,c.length),priceImpact:{[m]:Number(h.impactPct.toFixed(2))}}}}return{kind:"swap",chainId:n,tokenIn:r,tokenOut:o,amountIn:String(i),...d,sourcesTried:c.length,sourcesAnswered:l.filter(m=>m.quality!==Le.FAILED).length,note:sl(d,c.length)}}async function kP(e,t={}){let{fromChainId:n,toChainId:r,tokenIn:o,tokenOut:i,amountIn:s}=e;if(n==null||r==null||!o||!i||s==null)throw new Error("bestBridgeRoute requires fromChainId, toChainId, tokenIn, tokenOut, amountIn");if(Number(n)===Number(r))throw new Error("bestBridgeRoute is for cross-chain; use bestSwapRoute for same-chain");let a=By(r,i,t),c=Uy({...e,opts:t}),[l,u]=await Promise.all([Mi(c,{timeoutMs:t.timeoutMs??15e3}),a]),d=ol(l,{destPriceUsd:u.priceUsd,destDecimals:e.decimalsOut??u.decimals,liquidityBandBps:t.liquidityBandBps??50}),p=d.routes.map(m=>({source:m.source,seconds:m.meta?.durationSeconds??null})).filter(m=>m.seconds!=null);return{kind:"bridge",fromChainId:n,toChainId:r,tokenIn:o,tokenOut:i,amountIn:String(s),...d,durations:p,sourcesTried:c.length,sourcesAnswered:l.filter(m=>m.quality!==Le.FAILED).length,note:sl(d,c.length)}}function EP(e){let t=e?.meta?.oracleFee;return t?.applies?` \xB7 ${Zd(t)}`:""}function sl(e,t){if(!e.best)return"no source returned a usable route";let n=e.routes.length,r=EP(e.best);if(n===1)return`only 1 of ${t} sources answered, so this is the ONLY route, not a proven best one. Treat it as unbenchmarked.`+r;if(e.improvementBps!=null){let o=e.improvementBps,i=o/100;if(o<.01)return`best of ${n} routes, ranked on ${e.rankedOn}: effectively tied with the runner-up (${e.spreadBasis}), inside quote noise. Re-quote before you size up.`+r;let s=i>=.01?`${i.toFixed(2)}%`:`${o.toFixed(2)}bps`;return`best of ${n} routes, ranked on ${e.rankedOn}: ${s} better than the runner-up (${e.spreadBasis})`+r}return`best of ${n} routes, ranked on ${e.rankedOn}. No spread quoted: the top routes report cost differently, so the margin is not comparable.`+r}var PU=Object.freeze({mantissa:10000n,scale:0});function zt(e){if(!Number.isSafeInteger(e)||e<0||e>1e3)throw new RangeError("scale must be a safe integer from 0 through 1000")}function Ge(e,t){if(typeof e!="bigint")throw new TypeError("mantissa must be a bigint");return zt(t),Object.freeze({mantissa:e,scale:t})}function wt(e,t="value"){if(e===null||typeof e!="object")throw new TypeError(`${t} must be a fixed point value`);if(typeof e.mantissa!="bigint")throw new TypeError(`${t}.mantissa must be a bigint`);zt(e.scale)}function Bi(e){return zt(e),10n**BigInt(e)}function D(e){if(typeof e!="string"||!/^[+-]?\d+(?:\.\d+)?$/.test(e))throw new TypeError("value must be a plain decimal string");let t=e.startsWith("-"),n=e[0]==="-"||e[0]==="+"?e.slice(1):e,[r,o=""]=n.split("."),i=`${r}${o}`,s=BigInt(i)*(t?-1n:1n);return Ge(s,o.length)}function fe(e,t){if(zt(t),typeof e=="bigint")return Ge(e,t);if(typeof e!="string"||!/^[+-]?\d+$/.test(e))throw new TypeError("value must be an integer string or bigint");return Ge(BigInt(e),t)}function Me(e){wt(e);let t=e.mantissa<0n,n=(t?-e.mantissa:e.mantissa).toString();if(e.scale===0)return`${t?"-":""}${n}`;let r=n.padStart(e.scale+1,"0"),o=r.length-e.scale;return`${t?"-":""}${r.slice(0,o)}.${r.slice(o)}`}function Dr(e,t){return wt(e),zt(t),t===e.scale?Ge(e.mantissa,e.scale):t>e.scale?Ge(e.mantissa*Bi(t-e.scale),t):Ge(e.mantissa/Bi(e.scale-t),t)}function al(e,t){wt(e,"left"),wt(t,"right");let n=Math.max(e.scale,t.scale);return[Dr(e,n),Dr(t,n),n]}function xt(e,t){let[n,r,o]=al(e,t);return Ge(n.mantissa+r.mantissa,o)}function Fr(e,t){let[n,r,o]=al(e,t);return Ge(n.mantissa-r.mantissa,o)}function xe(e,t){wt(e,"left"),wt(t,"right");let n=e.scale+t.scale;return zt(n),Ge(e.mantissa*t.mantissa,n)}function Ue(e,t,n=Math.max(e?.scale??0,t?.scale??0)){if(wt(e,"left"),wt(t,"right"),zt(n),t.mantissa===0n)throw new RangeError("division by zero");let r=e.mantissa*Bi(t.scale+n),o=t.mantissa*Bi(e.scale);return Ge(r/o,n)}function St(e,t){let[n,r]=al(e,t);return n.mantissa<r.mantissa?-1:n.mantissa>r.mantissa?1:0}import{readFileSync as _P,existsSync as PP}from"node:fs";import{fileURLToPath as CP}from"node:url";import{dirname as TP,join as jy}from"node:path";import{existsSync as Fy,readFileSync as vP}from"node:fs";import{dirname as Dy,join as cl}from"node:path";import{fileURLToPath as AP}from"node:url";function IP(e){let t=Dy(AP(e));for(let n=0;n<8;n+=1){let r=cl(t,"package.json");if(Fy(r))try{let i=JSON.parse(vP(r,"utf8"));if(i&&typeof i.version=="string")return t}catch{}let o=Dy(t);if(o===t)break;t=o}throw new Error(`oracle: could not resolve package root from ${e}`)}function qy(e,t){let n=IP(t),r=cl(n,"dist","assets",e);return Fy(r)?r:cl(n,e)}var NP=jy(TP(CP(import.meta.url)),"fixtures");function OP(){try{let e=qy("equities-fixtures",import.meta.url);if(e&&PP(e))return e}catch{}return NP}var RP=OP();var Vy=Object.freeze({venues:"venues.json",universe:"universe.json",oracles:"oracles.json",nyseHolidays:"nyse_holidays.json",dstTransitions:"dst_transitions.json",equityDexPools:"equity_dex_pools.json",rhPoolState:"rh_pool_state.json",solanaXstocks:"solana_xstocks.json",tonXstocks:"ton_xstocks.json",hip3L2Books:"hip3_l2books.json"});function $P(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function j(e,t){throw new TypeError(`Fixture fixtures/${e}: ${t}`)}function te(e,t,n){$P(e)||j(t,`${n} must be an object`)}function z(e,t,n){(typeof e!="string"||e.length===0)&&j(t,`${n} must be a nonempty string`)}function Ke(e,t,n){Number.isSafeInteger(e)||j(t,`${n} must be a safe integer`)}function kt(e,t,n){te(e,t,n);for(let[r,o]of Object.entries(e))z(r,t,`${n} key`),te(o,t,`${n}.${r}`)}function LP(e,t){te(e,t,"root"),Ke(e.capturedAt,t,"capturedAt"),te(e.venues,t,"venues");let n=[["hyperliquid_hip3","dexs"],["arcus","markets"],["arcus_spot","pairs"],["rh_uniswap","pools"],["rh_chainlink_oracles","assets"]];for(let[r,o]of n){let i=e.venues[r];te(i,t,`venues.${r}`),z(i.type,t,`venues.${r}.type`),z(i.chain,t,`venues.${r}.chain`),z(i.tier,t,`venues.${r}.tier`),kt(i[o],t,`venues.${r}.${o}`)}for(let[r,o]of Object.entries(e.venues.hyperliquid_hip3.dexs))kt(o,t,`venues.hyperliquid_hip3.dexs.${r}`)}function MP(e,t){kt(e,t,"root"),Object.keys(e).length===0&&j(t,"root must not be empty");for(let[n,r]of Object.entries(e))Array.isArray(r.venues)||j(t,`${n}.venues must be an array`),r.venues.forEach((o,i)=>z(o,t,`${n}.venues[${i}]`))}function UP(e,t){te(e,t,"root");for(let n of["chainId","block","oracleScaleExp","usdgDecimals","equityDecimals"])Ke(e[n],t,n);z(e.usdg,t,"usdg"),kt(e.assets,t,"assets");for(let[n,r]of Object.entries(e.assets))z(r.oracle,t,`assets.${n}.oracle`),z(r.token,t,`assets.${n}.token`),(typeof r.rawPrice!="string"||!/^\d+$/.test(r.rawPrice))&&j(t,`assets.${n}.rawPrice must be an integer string`),(typeof r.usd!="number"||!Number.isFinite(r.usd)||r.usd<0)&&j(t,`assets.${n}.usd must be a nonnegative finite source number`)}function BP(e,t){te(e,t,"root");for(let r of["holidayDayIndex","names","dates"])Array.isArray(e[r])||j(t,`${r} must be an array`);let n=e.holidayDayIndex.length;(e.names.length!==n||e.dates.length!==n)&&j(t,"holidayDayIndex, names, and dates must have equal lengths"),e.holidayDayIndex.forEach((r,o)=>Ke(r,t,`holidayDayIndex[${o}]`)),e.names.forEach((r,o)=>z(r,t,`names[${o}]`)),e.dates.forEach((r,o)=>{(typeof r!="string"||!/^\d{4}-\d{2}-\d{2}$/.test(r))&&j(t,`dates[${o}] must use YYYY-MM-DD`)})}function DP(e,t){te(e,t,"root"),(!Array.isArray(e.dstTransitions)||e.dstTransitions.length===0)&&j(t,"dstTransitions must be a nonempty array");let n=new Set;e.dstTransitions.forEach((r,o)=>{te(r,t,`dstTransitions[${o}]`);for(let i of["year","startUtc","endUtc"])Ke(r[i],t,`dstTransitions[${o}].${i}`);r.startUtc>=r.endUtc&&j(t,`dstTransitions[${o}] startUtc must be before endUtc`),n.has(r.year)&&j(t,`dstTransitions contains duplicate year ${r.year}`),n.add(r.year)})}function FP(e,t){kt(e,t,"root"),Object.keys(e).length===0&&j(t,"root must not be empty");for(let[n,r]of Object.entries(e)){for(let o of["addr","quote","quoteAddr","dex","pair"])z(r[o],t,`${n}.${o}`);(typeof r.liq!="number"||!Number.isFinite(r.liq)||r.liq<0)&&j(t,`${n}.liq must be a nonnegative finite source number`)}}function qP(e,t){te(e,t,"root"),Ke(e.capturedAt,t,"capturedAt"),Ke(e.block,t,"block"),Ke(e.chainId,t,"chainId"),z(e.gasPriceWei,t,"gasPriceWei"),z(e.stateView,t,"stateView"),kt(e.pools,t,"pools"),Object.keys(e.pools).length===0&&j(t,"pools must not be empty");for(let[n,r]of Object.entries(e.pools)){for(let o of["pair","version","quote","token","sqrtPriceX96"])z(r[o],t,`pools.${n}.${o}`);r.version!=="v3"&&r.version!=="v4"&&j(t,`pools.${n}.version must be v3 or v4`),typeof r.quoteIsToken0!="boolean"&&j(t,`pools.${n}.quoteIsToken0 must be a boolean`),(!/^[0-9]+$/.test(r.sqrtPriceX96)||BigInt(r.sqrtPriceX96)<=0n)&&j(t,`pools.${n}.sqrtPriceX96 must be a positive integer string`)}}function HP(e,t){te(e,t,"root"),Ke(e.capturedAt,t,"capturedAt"),z(e.source,t,"source"),te(e.books,t,"books"),Object.keys(e.books).length===0&&j(t,"books must not be empty");for(let[n,r]of Object.entries(e.books)){te(r,t,`books.${n}`),(!Array.isArray(r.bids)||!Array.isArray(r.asks))&&j(t,`books.${n} must have bids and asks arrays`);for(let[o,i]of r.bids.entries())te(i,t,`books.${n}.bids[${o}]`),z(i.px,t,`books.${n}.bids[${o}].px`),z(i.sz,t,`books.${n}.bids[${o}].sz`);for(let[o,i]of r.asks.entries())te(i,t,`books.${n}.asks[${o}]`),z(i.px,t,`books.${n}.asks[${o}].px`),z(i.sz,t,`books.${n}.asks[${o}].sz`)}}function jP(e,t){te(e,t,"root"),Ke(e.capturedAt,t,"capturedAt"),z(e.source,t,"source"),z(e.chain,t,"chain"),kt(e.tokens,t,"tokens"),te(e.pairs,t,"pairs"),Object.keys(e.tokens).length===0&&j(t,"tokens must not be empty");for(let[n,r]of Object.entries(e.tokens)){z(r.symbolRaw,t,`tokens.${n}.symbolRaw`),z(r.mint,t,`tokens.${n}.mint`),Object.hasOwn(e.pairs,n)||j(t,`pairs.${n} is required for token ${n}`),(!Array.isArray(e.pairs[n])||e.pairs[n].length===0)&&j(t,`pairs.${n} must be a nonempty array`);for(let[o,i]of e.pairs[n].entries())te(i,t,`pairs.${n}[${o}]`),z(i.pairAddress,t,`pairs.${n}[${o}].pairAddress`),z(i.dexId,t,`pairs.${n}[${o}].dexId`),(typeof i.priceUsd!="number"||!Number.isFinite(i.priceUsd)||i.priceUsd<=0)&&j(t,`pairs.${n}[${o}].priceUsd must be a positive finite number`),(typeof i.liquidityUsd!="number"||!Number.isFinite(i.liquidityUsd)||i.liquidityUsd<0)&&j(t,`pairs.${n}[${o}].liquidityUsd must be a nonnegative finite number`)}}function VP(e,t){te(e,t,"root"),Ke(e.capturedAt,t,"capturedAt"),z(e.source,t,"source"),z(e.chain,t,"chain"),e.chain!=="ton"&&j(t,'chain must be "ton"'),kt(e.tokens,t,"tokens"),te(e.pairs,t,"pairs"),Object.keys(e.tokens).length===0&&j(t,"tokens must not be empty");for(let[n,r]of Object.entries(e.tokens)){z(r.symbolRaw,t,`tokens.${n}.symbolRaw`),z(r.mint,t,`tokens.${n}.mint`),Object.hasOwn(e.pairs,n)||j(t,`pairs.${n} is required for token ${n}`),(!Array.isArray(e.pairs[n])||e.pairs[n].length===0)&&j(t,`pairs.${n} must be a nonempty array`);for(let[o,i]of e.pairs[n].entries())te(i,t,`pairs.${n}[${o}]`),z(i.pairAddress,t,`pairs.${n}[${o}].pairAddress`),z(i.dexId,t,`pairs.${n}[${o}].dexId`),(typeof i.priceUsd!="number"||!Number.isFinite(i.priceUsd)||i.priceUsd<=0)&&j(t,`pairs.${n}[${o}].priceUsd must be a positive finite number`),(typeof i.liquidityUsd!="number"||!Number.isFinite(i.liquidityUsd)||i.liquidityUsd<0)&&j(t,`pairs.${n}[${o}].liquidityUsd must be a nonnegative finite number`)}}var zP=Object.freeze({venues:LP,universe:MP,oracles:UP,nyseHolidays:BP,dstTransitions:DP,equityDexPools:FP,rhPoolState:qP,solanaXstocks:jP,tonXstocks:VP,hip3L2Books:HP});function WP(e,t){let n=Vy[t],r=jy(e,n),o;try{o=_P(r,"utf8")}catch(s){throw s?.code==="ENOENT"?new Error(`Fixture fixtures/${n} is missing at ${r}`):new Error(`Fixture fixtures/${n} could not be read: ${s.message}`)}let i;try{i=JSON.parse(o)}catch(s){throw new SyntaxError(`Fixture fixtures/${n} contains invalid JSON: ${s.message}`)}return zP[t](i,n),i}function zy(e){if(e!==null&&typeof e=="object"&&!Object.isFrozen(e)){Object.freeze(e);for(let t of Object.values(e))zy(t)}return e}function Wy({fixtureDir:e=RP}={}){if(typeof e!="string"||e.length===0)throw new TypeError("fixtureDir must be a nonempty path string");let t={};for(let n of Object.keys(Vy))t[n]=WP(e,n);return zy(t)}var Hy;function Et(){return Hy??=Wy(),Hy}function Ae(){return Et().venues}function Gy(){return Et().oracles}function Ky(){return Et().nyseHolidays}function Yy(){return Et().dstTransitions}function Di(){return Et().rhPoolState}function Xy(){return Et().solanaXstocks}function Qy(){return Et().tonXstocks}function Jy(){return Et().hip3L2Books}var ul=1e3,tb=60*ul,dl=60*tb,Zy=24*dl,GP=-5*dl,KP=-4*dl,nb=240,rb=570,ob=960,ib=1200,FU=Object.freeze([nb,rb,ob,ib]),qU=Object.freeze(["core","extended","dark"]),eb,ll;function YP(){let e=Yy().dstTransitions.map(r=>({year:r.year,startMs:r.startUtc*ul,endMs:r.endUtc*ul}));e.sort((r,o)=>r.startMs-o.startMs);let t=e[0].year,n=e[e.length-1].year;return Object.freeze({rows:Object.freeze(e),firstYear:t,lastYear:n,coverageStartMs:Date.UTC(t,0,1),coverageEndMs:Date.UTC(n+1,0,1)})}function sb(){return eb??=YP(),eb}function XP(){return ll===void 0&&(ll=new Set(Ky().holidayDayIndex)),ll}function ab(e,t){if(!Number.isSafeInteger(e))throw new TypeError(`${t}: epochMs must be a safe integer number of milliseconds`)}function QP(e,t){let{coverageStartMs:n,coverageEndMs:r,firstYear:o,lastYear:i}=sb();if(e<n||e>=r)throw new RangeError(`${t}: ${new Date(e).toISOString()} is outside DST fixture coverage (${o} through ${i}). Refusing to assume a UTC offset.`)}function JP(e){for(let t of sb().rows)if(e>=t.startMs&&e<t.endMs)return!0;return!1}function ZP(e){return JP(e)?KP:GP}function eC(e){let t=e+ZP(e),n=Math.floor(t/Zy),r=t-n*Zy,o=new Date(t);return{dayIndex:n,minuteOfDay:Math.floor(r/tb),msIntoDay:r,weekday:o.getUTCDay()}}function tC({dayIndex:e,weekday:t}){return t===0||t===6?!1:!XP().has(e)}function nC(e){return e<nb?"dark":e<rb?"extended":e<ob?"core":e<ib?"extended":"dark"}function qr(e){ab(e,"sessionState"),QP(e,"sessionState");let t=eC(e);return tC(t)?nC(t.minuteOfDay):"dark"}function pl(e){return ab(e,"isDark"),qr(e)==="dark"}var Fi=Object.freeze({DORMANT_VENUE:"dormant-venue",CROSSED_BOOK:"crossed-book",STALE_QUOTE:"stale-quote",STALE_ORACLE:"stale-oracle"}),rC=12e4,oC=6e5;function qi(e,t){e.push(Object.freeze({venue:t.venue,symbol:t.symbol??null,reason:t.reason,evidence:t.evidence??null}))}function iC(e){let t=e.raw?.vol24h;return!!(t===0||t===0||typeof t=="number"&&Number.isFinite(t)&&t<=0)}function sC(e){return!e.bid||!e.ask?!1:St(e.bid,e.ask)>0}function cb(e,t,n){return Number.isSafeInteger(e.capturedAt)?t-e.capturedAt>n:!1}function Hi(e,t={}){if(!Array.isArray(e))throw new TypeError("quotes must be an array");let n=t.nowMs??Date.now(),r=t.quoteFreshnessMs??rC,o=t.oracleFreshnessMs??oC,i=t.includeDormant===!0,s=[],a=[];for(let c of e){if(iC(c)){i?s.push(Object.freeze({...c,staleData:!0})):qi(a,{venue:c.venue,symbol:c.symbolRaw??c.symbol,reason:Fi.DORMANT_VENUE,evidence:{vol24h:c.raw?.vol24h??null}});continue}if(sC(c)){qi(a,{venue:c.venue,symbol:c.symbolRaw??c.symbol,reason:Fi.CROSSED_BOOK,evidence:{bid:c.bid?String(c.bid.mantissa)+"e-"+c.bid.scale:null,ask:c.ask?String(c.ask.mantissa)+"e-"+c.ask.scale:null}});continue}if(cb(c,n,r)){qi(a,{venue:c.venue,symbol:c.symbolRaw??c.symbol,reason:Fi.STALE_QUOTE,evidence:{capturedAt:c.capturedAt,nowMs:n,ageMs:n-c.capturedAt,freshnessMs:r}});continue}if(c.tier==="read-only"&&c.raw?.oracleRaw!==void 0){let l=qr(n),u=l==="core"?o:o*2;if(cb(c,n,u)){qi(a,{venue:c.venue,symbol:c.symbolRaw??c.symbol,reason:Fi.STALE_ORACLE,evidence:{capturedAt:c.capturedAt,nowMs:n,session:l}});continue}}s.push(c)}return{survivors:s,excluded:a}}function aC(e){if(typeof e!="number"||!Number.isFinite(e))throw new TypeError("value must be a finite number");let t=String(e);if(!t.includes("e")&&!t.includes("E"))return t;let[n,r]=t.split(/[eE]/),o=Number(r),i=n.startsWith("-"),s=i?n.slice(1):n,[a,c=""]=s.split("."),l=`${a}${c}`,u=a.length+o,d;return u<=0?d=`0.${"0".repeat(-u)}${l}`:u>=l.length?d=`${l}${"0".repeat(u-l.length)}`:d=`${l.slice(0,u)}.${l.slice(u)}`,`${i?"-":""}${d}`}function oe(e){return e==null?null:typeof e=="string"?D(e):typeof e!="number"||!Number.isFinite(e)?null:D(aC(e))}function Be(e,t){let n=oe(e);if(n===null)throw new TypeError(`${t} must be a finite source number`);return n}var cC=new Set(["spot","perp"]),lC=new Set(["read-only","quote-only","prepare","intent"]),uC=new Set(["buy","sell"]),dC=new Set(["net-of-cost","gross"]),pC=new Set(["homogeneous","heterogeneous"]),mC=["bid","ask","mid","mark"],lb=["fees","gasEstimate","priceImpact","fundingHourly"],fC=/^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$/;function Y(e,t){throw new TypeError(`${e} ${t}`)}function db(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function Wt(e,t){db(e)||Y(t,"must be an object")}function pb(e,t,n){Object.hasOwn(e,t)||Y(`${n}.${t}`,"is required")}function $n(e,t){(typeof e!="string"||e.length===0)&&Y(t,"must be a nonempty string")}function Hr(e,t,n){t.has(e)||Y(n,`must be one of ${[...t].join(", ")}`)}function fl(e,t){(!Number.isSafeInteger(e)||e<0)&&Y(t,"must be a nonnegative safe integer")}function ml(e,t,n=!1){e===null&&n||(db(e)||Y(t,"must be a fixed point value"),typeof e.mantissa!="bigint"&&Y(`${t}.mantissa`,"must be a bigint"),(!Number.isSafeInteger(e.scale)||e.scale<0)&&Y(`${t}.scale`,"must be a nonnegative safe integer"))}function ji(e,t,n=!1){e===null&&n||Wt(e,t)}function ub(e,t){Wt(e,t),$n(e.venue,`${t}.venue`),$n(e.reason,`${t}.reason`),fC.test(e.reason)||Y(`${t}.reason`,"must be a machine readable lower case code"),Object.hasOwn(e,"symbol")&&e.symbol!==null&&$n(e.symbol,`${t}.symbol`)}function Se(e){Wt(e,"quote");for(let n of["venue","chain","instrument","tier","symbolRaw","symbol","side","requestedSize",...lb,"costAccounted","capturedAt","blockOrSeq","raw"])pb(e,n,"quote");$n(e.venue,"quote.venue"),!(typeof e.chain=="string"&&e.chain.length>0)&&!(Number.isSafeInteger(e.chain)&&e.chain>=0)&&Y("quote.chain","must be a nonempty string or nonnegative chain id"),Hr(e.instrument,cC,"quote.instrument"),Hr(e.tier,lC,"quote.tier"),$n(e.symbolRaw,"quote.symbolRaw"),$n(e.symbol,"quote.symbol"),Hr(e.side,uC,"quote.side"),ml(e.requestedSize,"quote.requestedSize"),e.requestedSize.mantissa<0n&&Y("quote.requestedSize","must not be negative");let t=0;for(let n of mC)Object.hasOwn(e,n)&&(ml(e[n],`quote.${n}`),t+=1);t===0&&Y("quote","must contain at least one of bid, ask, mid, mark");for(let n of lb)ml(e[n],`quote.${n}`,!0);if(typeof e.costAccounted!="boolean"&&Y("quote.costAccounted","must be a boolean"),e.costAccounted){for(let n of["fees","gasEstimate","priceImpact"])e[n]===null&&Y(`quote.${n}`,"cannot be unknown when costAccounted is true");e.instrument==="perp"&&e.fundingHourly===null&&Y("quote.fundingHourly","cannot be unknown when costAccounted is true for a perp")}return e.instrument==="spot"&&e.fundingHourly!==null&&Y("quote.fundingHourly","must be null for a spot quote"),fl(e.capturedAt,"quote.capturedAt"),e.blockOrSeq!==null&&!(typeof e.blockOrSeq=="string"&&e.blockOrSeq.length>0)&&!(Number.isSafeInteger(e.blockOrSeq)&&e.blockOrSeq>=0)&&Y("quote.blockOrSeq","must be null, a nonempty string, or a nonnegative safe integer"),Wt(e.raw,"quote.raw"),e}function hl(e){Wt(e,"rankResult");for(let t of["rankedOn","ranked","winner","runnersUp","improvementBps","sourcesAnswered","sourcesTried","failed","excluded","darkWindow","instrumentMix","bestPreparable"])pb(e,t,"rankResult");return Hr(e.rankedOn,dC,"rankResult.rankedOn"),Array.isArray(e.ranked)||Y("rankResult.ranked","must be an array"),e.ranked.forEach((t,n)=>ji(t,`rankResult.ranked[${n}]`)),ji(e.winner,"rankResult.winner",!0),e.ranked.length===0&&e.winner!==null&&Y("rankResult.winner","must be null when ranked is empty"),e.ranked.length>0&&e.winner===null&&Y("rankResult.winner","must be present when ranked is not empty"),Array.isArray(e.runnersUp)||Y("rankResult.runnersUp","must be an array"),e.runnersUp.forEach((t,n)=>ji(t,`rankResult.runnersUp[${n}]`)),e.improvementBps!==null&&!(typeof e.improvementBps=="number"&&Number.isFinite(e.improvementBps))&&Y("rankResult.improvementBps","must be a finite number or null"),fl(e.sourcesAnswered,"rankResult.sourcesAnswered"),fl(e.sourcesTried,"rankResult.sourcesTried"),e.sourcesAnswered>e.sourcesTried&&Y("rankResult.sourcesAnswered","must not exceed sourcesTried"),Array.isArray(e.failed)||Y("rankResult.failed","must be an array"),e.failed.forEach((t,n)=>ub(t,`failed[${n}]`)),Array.isArray(e.excluded)||Y("rankResult.excluded","must be an array"),e.excluded.forEach((t,n)=>ub(t,`excluded[${n}]`)),e.darkWindow!==null&&Wt(e.darkWindow,"rankResult.darkWindow"),Hr(e.instrumentMix,pC,"rankResult.instrumentMix"),ji(e.bestPreparable,"rankResult.bestPreparable",!0),Object.hasOwn(e,"carry")&&e.carry!==null&&Wt(e.carry,"rankResult.carry"),e}var hC="arcus_perp",gC="robinhood-4663",yC="quote-only",Vi="0.00000480324074074";function mb(){return Ae().venues.arcus}function bC(){return Object.keys(mb().markets).sort()}function wC({symbol:e,side:t="buy",sizeUsd:n=null}={}){if(typeof e!="string"||e.length===0)return null;let r=e.endsWith("-USD")?e.slice(0,-4):e,o=mb().markets[r];if(!o)return null;let i=Be(o.mark,`${r}.mark`),s=oe(o.oracle),a=oe(o.fundingHourly),c=n===null?D("0"):n,l={venue:hC,chain:gC,instrument:"perp",tier:yC,symbolRaw:e,symbol:r,side:t,requestedSize:c,mark:i,fees:null,gasEstimate:null,priceImpact:null,fundingHourly:a,costAccounted:!1,capturedAt:Ae().capturedAt*1e3,blockOrSeq:null,raw:{fixture:"fixtures/venues.json#venues.arcus",oraclePrice:o.oracle,vol24h:o.vol24h,oi:o.oi,fundingAnnPct:o.fundingAnnPct,category:o.category,isOutsideRth:o.isOutsideRth===!0,rth:o.rth,darkWindowFundingHourly:Vi,initialMarginFraction:o.initialMarginFraction??null,offHoursInitialMarginFraction:o.offHoursInitialMarginFraction??null,reasonCostUnknown:"fees, gas, and impact at size not captured for Arcus perps"}};return s!==null&&(l.raw.oracleFixed=s),Se(l)}function zi({side:e="buy",sizeUsd:t=null}={}){return bC().map(n=>wC({symbol:n,side:e,sizeUsd:t})).filter(n=>n!==null)}var fb=36e5,oB=24*365;function gl(e,t,n=8){if(e==null)throw new TypeError("hourlyFundingRate is required");if(!Number.isFinite(t)||t<0)throw new RangeError("horizonHours must be a nonnegative finite number");if(t===0)return D("0");let r=D(String(t)),o=fe(10000n,0);return xe(xe(e,r),o)}function hb(e,t,n={}){if(e.instrument!=="perp")return{model:"current-funding-held-constant",horizonHours:t,carryBps:D("0"),carryBpsDisplay:"0",confidence:"estimate",note:"spot has no funding carry"};let r=n.nowMs??Date.now(),o=n.applyDarkWindowLock===!0,i=e.fundingHourly;if(o&&i!==null){let a=xC(r,t),c=t-a,l=D(Vi),u=gl(i,c),d=gl(l,a),p=Math.max(u.scale,d.scale),m={mantissa:u.mantissa*10n**BigInt(p-u.scale)+d.mantissa*10n**BigInt(p-d.scale),scale:p};return{model:"current-funding-held-constant",horizonHours:t,carryBps:m,carryBpsDisplay:Me(m),confidence:"estimate",darkHours:a,litHours:c,darkWindowRate:Vi,compounding:"ignored",compoundingErrorBoundNote:"simple sum; at 30d and 1e-5/h the ignored compound is under 0.5bp"}}if(i===null)return{model:"current-funding-held-constant",horizonHours:t,carryBps:null,carryBpsDisplay:null,confidence:"estimate",note:"funding rate unknown"};let s=gl(i,t);return{model:"current-funding-held-constant",horizonHours:t,carryBps:s,carryBpsDisplay:Me(s),confidence:"estimate",compounding:"ignored",compoundingErrorBoundNote:"simple sum; at 30d and 1e-5/h the ignored compound is under 0.5bp"}}function xC(e,t){if(t<=0)return 0;let n=0,r=Math.floor(t);for(let o=0;o<r;o+=1)pl(e+o*fb)&&(n+=1);return t>r&&pl(e+r*fb)&&(n+=t-r),n}function SC(e){return e.mid??e.mark??e.ask??e.bid??null}function kC(e){let t=SC(e);if(t===null)return null;let n=e.costAccounted===!0,r=D("0");e.fees!==null?r=xt(r,e.fees):n=!1,e.priceImpact!==null?r=xt(r,e.priceImpact):e.requestedSize&&e.requestedSize.mantissa>0n&&(n=!1),e.gasEstimate===null?n=!1:r=xt(r,e.gasEstimate);let o;if(e.fees!==null&&St(e.fees,D("1"))<0&&St(e.fees,D("0"))>=0){let i=xt(D("1"),e.fees);o=xe(t,i),e.priceImpact!==null&&(o=xt(o,xe(t,e.priceImpact)))}else o=xt(t,r);return{net:o,costAccounted:n,px:t}}function EC(e,t,n=null){return{venue:e.venue,chain:e.chain,instrument:e.instrument,tier:e.tier,symbol:e.symbol,symbolRaw:e.symbolRaw,side:e.side,price:t.px,net:t.net,costAccounted:t.costAccounted,fundingHourly:e.fundingHourly,carry:n,quote:e}}function vC(e,t){if(!e||!t||!e.costAccounted||!t.costAccounted||e.instrument!==t.instrument||e.net.mantissa===0n)return null;let n=Fr(t.net,e.net);return Ue(xe(n,fe(10000n,0)),t.net,4)}function yl(e,t={}){if(!Array.isArray(e))throw new TypeError("quotes must be an array");let n=t.nowMs??e[0]?.capturedAt??Date.now(),r=e.length,o=e,i=[];if(!t.skipLiveness){let I=Hi(e,{nowMs:n});o=I.survivors,i=I.excluded}let s=e.length,a=[],c=t.horizonHours,l=Number.isFinite(c)&&c>0,u=[];for(let I of o){let R=kC(I);if(R===null)continue;let _=null;if(l&&I.instrument==="perp"&&(_=hb(I,c,{nowMs:n}),_.carryBps!==null)){let E=xt(D("1"),Ue(_.carryBps,fe(10000n,0),12));R.net=xe(R.net,E),R.costAccounted=!1}u.push(EC(I,R,_))}let d=u,p="homogeneous";if(l)p="heterogeneous",d=u;else{let I=u.filter(_=>_.instrument==="spot"),R=u.filter(_=>_.instrument==="perp");I.length>0&&R.length>0?(d=I.length>=R.length?I:R,p="homogeneous"):(d=u,p="homogeneous")}d.sort((I,R)=>{let _=St(I.net,R.net);return _!==0?_:I.venue<R.venue?-1:I.venue>R.venue?1:0});let m=d[0]??null,f=d.slice(1),h=d,g="gross";m&&m.costAccounted&&(f.length===0||f[0].costAccounted)&&(g="net-of-cost");let b=f.length===0?null:vC(m,f[0]),k=u.find(I=>I.tier==="prepare")??null,x=qr(n),w=x==="core"?null:{session:x,warning:x==="dark"?"market is dark; marks are not real price discovery":"extended session; thinner books and higher staleness risk"},v=null;l&&(v=AC(u));let T={rankedOn:g,ranked:h,winner:m,runnersUp:f,improvementBps:b===null?null:Number(Me(b)),sourcesAnswered:s,sourcesTried:r,failed:a,excluded:i,darkWindow:w,instrumentMix:p,bestPreparable:k,carry:m?.carry??null,breakEvenHorizonHours:v};return hl(T)}function AC(e){let t=e.filter(i=>i.instrument==="spot").sort((i,s)=>St(i.net,s.net))[0],n=e.filter(i=>i.instrument==="perp").sort((i,s)=>St(i.net,s.net))[0];if(!t||!n||n.fundingHourly===null)return null;let r=Fr(t.net,n.net);if(r.mantissa===0n)return 0;let o=xe(n.fundingHourly,n.price);if(o.mantissa===0n)return null;try{let i=Ue(r,o,4),s=Number(Me(i));return!Number.isFinite(s)||s<0?null:s}catch{return null}}var IC="rh_uniswap",_C=4663,PC="prepare",CC=1n<<192n,Ln=18,TC=Object.freeze({v3:180000n,v4:240000n});function bl(){return Di()}function NC(e){return{mantissa:e*e*10n**BigInt(Ln)/CC,scale:Ln}}function OC(e){let t=NC(BigInt(e.sqrtPriceX96)),n=e.quote==="USDG"?6:18,r=18;if(e.quoteIsToken0){let o=Ue(xe(t,fe(10n**BigInt(n),0)),fe(10n**BigInt(r),0),Ln);return o.mantissa===0n?null:Ue(D("1"),o,Ln)}return Ue(xe(t,fe(10n**BigInt(r),0)),fe(10n**BigInt(n),0),Ln)}function RC(e){let t=Gy(),n=t.assets[e];return n?fe(n.rawPrice,t.oracleScaleExp):null}function $C(e,t){if(e===null||t===null||e.mantissa<=0n||t.mantissa<=0n)return null;let n={...e};return Ue(t,LC(n,t),Ln)}function LC(e,t){let n=Math.max(e.scale,t.scale);return{mantissa:Dr(e,n).mantissa+Dr(t,n).mantissa,scale:n}}function MC(e){let t=bl(),n=TC[e];return n?{wei:BigInt(t.gasPriceWei)*n,units:n,native:"ETH"}:null}function wl(){return Object.keys(bl().pools).sort()}function Mn({symbol:e,side:t="buy",sizeUsd:n=null}={}){if(typeof e!="string"||e.length===0)throw new TypeError("symbol must be a nonempty string");let r=bl(),o=r.pools[e];if(!o)return null;let i=OC(o);if(i===null)return null;let s=oe(o.liqUsd),a=n===null?D("0"):n,c=o.feePpm===null||o.feePpm===void 0?null:Ue(fe(BigInt(o.feePpm),0),fe(1000000n,0),8),l=a.mantissa===0n?D("0"):$C(s,a),u=MC(o.version),m={venue:IC,chain:_C,instrument:"spot",tier:PC,symbolRaw:e,symbol:e,side:t,requestedSize:a,mid:i,fees:c,gasEstimate:null,priceImpact:l,fundingHourly:null,costAccounted:!1,capturedAt:r.capturedAt*1e3,blockOrSeq:r.block,raw:{fixture:"fixtures/rh_pool_state.json",pair:o.pair,version:o.version,sqrtPriceX96:o.sqrtPriceX96,quote:o.quote,quoteIsToken0:o.quoteIsToken0,liqUsd:o.liqUsd,gasNativeWei:u===null?null:u.wei.toString(),gasUnits:u===null?null:u.units.toString(),impactModel:"constant-product-estimate",notes:["price read live from chain 4663",o.version==="v4"?"v4 fee may be dynamic via hook and was not captured":"v3 fee tier is the pool static fee","gas known in native wei only, no ETH price captured to denominate it"]}},f=RC(e);return f!==null&&(m.referencePrice=f,m.referenceBasisBps=Me(Ue(xe(Fr(i,f),fe(10000n,0)),f,4))),Se(m)}function gb({side:e="buy",sizeUsd:t=null}={}){return wl().map(n=>Mn({symbol:n,side:e,sizeUsd:t})).filter(n=>n!==null)}var yb=12e4,UC="0x0000000000000000000000000000000000000000",BC="0x84b75b19A3cdf8E2F56d0507d22D442847B2053C";function xl(e={}){let{symbol:t,side:n="buy",sizeUsd:r=null,recipient:o,nowMs:i=Date.now()}=e;if(typeof t!="string"||!t)throw new TypeError("symbol is required");if(typeof o!="string"||!/^0x[0-9a-fA-F]{40}$/.test(o))throw new TypeError("recipient must be a 0x-prefixed 20 byte address");let s=Mn({symbol:t,side:n,sizeUsd:r});if(s===null)throw new Error(`no RH Uniswap pool for ${t}`);if(s.tier!=="prepare")throw new Error(`route tier is ${s.tier}, only prepare tier can be prepared`);let a=i-s.capturedAt;if(a>yb)throw new Error(`quote is stale (${a}ms old, bound ${yb}ms); re-quote before preparing`);let l=Di().pools[t],u=l.version==="v4"?BC:UC,d=u,p=n==="buy"?l.quoteAddr:l.token;return Object.freeze({artifactKind:"unsigned-tx",chainId:4663,to:u,data:"0x",value:"0",requiresApproval:{spender:d,token:p,amount:null},requiresWalletSignature:!0,backendSigner:!1,unsigned:!0,houseSigned:!1,quoteRef:{venue:s.venue,symbol:s.symbol,symbolRaw:s.symbolRaw,capturedAt:s.capturedAt,blockOrSeq:s.blockOrSeq,mid:s.mid,version:l.version,pair:l.pair},quoteAgeMs:a,recipient:o,side:n,notes:["prepare-only: user wallet must sign","calldata encoding is deferred; this artifact is the bound intent",l.version==="v4"?"V4 route via PoolManager":"V3 route via SwapRouter (address not yet pinned)"]})}var DC="hyperliquid_hip3",FC="hyperliquid",qC="quote-only";function jr(){return Ae().venues.hyperliquid_hip3}function bb(){return Object.keys(jr().dexs).sort()}function HC(){let e=[];for(let[t,n]of Object.entries(jr().dexs))for(let r of Object.keys(n))e.push(`${t}:${r}`);return e.sort()}function jC(e){if(typeof e!="string"||e.length===0)return[];let t=e.indexOf(":");if(t>0){let r=e.slice(0,t),o=e.slice(t+1),i=jr().dexs[r]?.[o];return i?[{dex:r,ticker:o,market:i}]:[]}let n=[];for(let[r,o]of Object.entries(jr().dexs))Object.hasOwn(o,e)&&n.push({dex:r,ticker:e,market:o[e]});return n}function VC(e,t){try{return Jy().books[`${e}:${t}`]??null}catch{return null}}function zC(e,t,n){if(!e||n===null||n.mantissa<=0n)return null;let r=t==="buy"?e.asks:e.bids;if(!r||r.length===0)return null;let o=Number(Me(n));if(!Number.isFinite(o)||o<=0)return null;let i=0,s=0,a=0;for(let c of r){let l=Number(c.px),u=Number(c.sz);if(!(l>0)||!(u>0))continue;let d=l*u,p=Math.min(o,d),m=p/l;if(i+=p,s+=m,o-=p,a+=1,o<=1e-9)break}return s<=0?null:{vwap:i/s,filledUsd:i,unfilledUsd:Math.max(0,o),levelsUsed:a}}function WC(e,t,n,r){let o=zC(e,t,n);if(!o)return{impact:null,depth:null};let i=Number(Me(r));if(!(i>0))return{impact:null,depth:o};let s=t==="buy"?(o.vwap-i)/i:(i-o.vwap)/i,a=Math.max(0,s);return{impact:oe(Number(a.toPrecision(12))),depth:{...o,impactFraction:a,fullyFilled:o.unfilledUsd<=1e-6}}}function wb({dex:e,ticker:t,market:n,side:r,size:o}){let i=Be(n.mark,`${e}:${t}.mark`),s=oe(n.fundingHourly),a=oe(n.vol24h),c=oe(n.oi),l=o===null?D("0"):o,u=VC(e,t),d=null,p=null,m="fees and gas not captured";if(l.mantissa>0n)if(u){let g=WC(u,r,l,i);d=g.impact,p=g.depth,p?.fullyFilled?m="impact measured from l2Book; fees and gas still not captured":m="book walked but size exceeds visible depth; fees and gas not captured"}else m="no order book depth wired for this coin; fees and gas not captured";else u?m="zero size; fees and gas not captured":m="no order book depth wired for this coin; fees and gas not captured";let h={venue:DC,chain:FC,instrument:"perp",tier:qC,symbolRaw:`${e}:${t}`,symbol:t,side:r,requestedSize:l,mark:i,fees:null,gasEstimate:null,priceImpact:d,fundingHourly:s,costAccounted:!1,capturedAt:Ae().capturedAt*1e3,blockOrSeq:null,raw:{fixture:"fixtures/venues.json#venues.hyperliquid_hip3",dex:e,ticker:t,vol24h:n.vol24h,oi:n.oi,fundingAnnPct:n.fundingAnnPct,maxLev:n.maxLev,reasonCostUnknown:m,hasL2Book:u!==null,l2BookFixture:u?"fixtures/hip3_l2books.json":null,depth:p}};return a!==null&&(h.raw.vol24hFixed=a),c!==null&&(h.raw.oiFixed=c),u?.bids?.[0]&&u?.asks?.[0]&&(h.bid=D(String(u.bids[0].px)),h.ask=D(String(u.asks[0].px))),Se(h)}function xb({symbol:e,side:t="buy",sizeUsd:n=null}={}){let r=jC(e);return r.length===0||r.length>1?null:wb({...r[0],side:t,size:n})}function Wi({side:e="buy",sizeUsd:t=null,ticker:n=null}={}){let r=[];for(let o of HC()){let[i,s]=o.split(":");if(n!==null&&s!==n)continue;let a=jr().dexs[i][s];r.push(wb({dex:i,ticker:s,market:a,side:e,size:t}))}return r}var GC="arcus_spot",KC="robinhood-4663",YC="quote-only";function Sb(){return Ae().venues.arcus_spot}function XC(){return Object.keys(Sb().pairs).sort()}function QC({symbol:e,side:t="buy",sizeUsd:n=null}={}){if(typeof e!="string"||e.length===0)return null;let r=Sb().pairs[e];if(!r)return null;let o=r.bid===void 0||r.bid===null?null:Be(r.bid,`${e}.bid`),i=r.ask===void 0||r.ask===null?null:Be(r.ask,`${e}.ask`),s=oe(r.last),a=null;if(o!==null&&i!==null){a={mantissa:o.mantissa+i.mantissa,scale:o.scale===i.scale?o.scale+1:Math.max(o.scale,i.scale)+1};let d=Math.max(o.scale,i.scale),p=o.scale===d?o.mantissa:o.mantissa*10n**BigInt(d-o.scale),m=i.scale===d?i.mantissa:i.mantissa*10n**BigInt(d-i.scale);a={mantissa:p+m,scale:d+1},a={mantissa:(p+m)/2n,scale:d}}else s!==null&&(a=s);if(o===null&&i===null&&a===null)return null;let c=n===null?D("0"):n,l=D("0"),u={venue:GC,chain:KC,instrument:"spot",tier:YC,symbolRaw:e,symbol:e,side:t,requestedSize:c,fees:l,gasEstimate:null,priceImpact:null,fundingHourly:null,costAccounted:!1,capturedAt:Ae().capturedAt*1e3,blockOrSeq:null,raw:{fixture:"fixtures/venues.json#venues.arcus_spot",last:r.last,bid:r.bid,ask:r.ask,vol24h:r.vol24h,feeKnownZero:!0,reasonCostUnknown:"gas and impact at size not captured; fee is a known zero"}};return o!==null&&(u.bid=o),i!==null&&(u.ask=i),a!==null&&(u.mid=a),Se(u)}function Gi({side:e="buy",sizeUsd:t=null}={}){return XC().map(n=>QC({symbol:n,side:e,sizeUsd:t})).filter(n=>n!==null)}var JC="solana_xstocks",ZC="solana",eT="quote-only",kb=25e3;function Ki(){return Xy()}function Sl(){return Object.keys(Ki().tokens).sort()}function tT(e){let t=Ki().pairs[e];return!t||t.length===0?null:[...t].sort((n,r)=>(r.liquidityUsd??0)-(n.liquidityUsd??0))[0]}function nT(e,t){if(e===null||t===null)return null;if(e.mantissa<=0n||t.mantissa<=0n)return D("0");let n=Math.max(e.scale,t.scale),r=e.scale===n?e.mantissa:e.mantissa*10n**BigInt(n-e.scale),o=t.scale===n?t.mantissa:t.mantissa*10n**BigInt(n-t.scale),i=o*10n**6n,s=r+o;return{mantissa:i/s,scale:6}}function kl({symbol:e,side:t="buy",sizeUsd:n=null}={}){if(typeof e!="string"||e.length===0)return null;let r=e,o=e,i=Ki().tokens;if(Object.hasOwn(i,e))r=e,o=i[e].symbolRaw;else if(e.endsWith("x")||e.endsWith("X")){let f=e.slice(0,-1).toUpperCase();if(Object.hasOwn(i,f))r=f,o=i[f].symbolRaw;else return null}else return null;let s=i[r],a=tT(r);if(!s||!a)return null;let c=Be(a.priceUsd,`${r}.priceUsd`),l=oe(a.liquidityUsd),u=n===null?D("0"):n,d=u.mantissa===0n?D("0"):nT(l,u),p=!1;u.mantissa===0n&&(a.liquidityUsd??0)>=kb&&(p=!1);let m={venue:JC,chain:ZC,instrument:"spot",tier:eT,symbolRaw:o,symbol:r,side:t,requestedSize:u,mid:c,fees:null,gasEstimate:null,priceImpact:d,fundingHourly:null,costAccounted:p,capturedAt:Ki().capturedAt*1e3,blockOrSeq:null,raw:{fixture:"fixtures/solana_xstocks.json",mint:s.mint,pairAddress:a.pairAddress,dexId:a.dexId,quote:a.quote,liquidityUsd:a.liquidityUsd,volume24h:a.volume24h,priceUsd:a.priceUsd,source:"dexscreener",approximate:!0,reasonCostUnknown:"DexScreener liquidity.usd is a third-party float; fees and SOL gas not captured; impact is modeled",thin:(a.liquidityUsd??0)<kb}};return Se(m)}function Eb({side:e="buy",sizeUsd:t=null}={}){return Sl().map(n=>kl({symbol:n,side:e,sizeUsd:t})).filter(n=>n!==null)}var rT="ton_stonfi",oT="ton",iT="quote-only",sT=25e3,aT=.01;function Yi(){return Qy()}function El(){return Object.keys(Yi().tokens).sort()}function cT(e){let t=Yi().pairs[e];return!t||t.length===0?null:[...t].sort((n,r)=>(r.liquidityUsd??0)-(n.liquidityUsd??0))[0]}function lT(e,t){if(e===null||t===null)return null;if(e.mantissa<=0n||t.mantissa<=0n)return D("0");let n=Math.max(e.scale,t.scale),r=e.scale===n?e.mantissa:e.mantissa*10n**BigInt(n-e.scale),o=t.scale===n?t.mantissa:t.mantissa*10n**BigInt(n-t.scale),i=o*10n**6n,s=r+o;return{mantissa:i/s,scale:6}}function vl({symbol:e,side:t="buy",sizeUsd:n=null}={}){if(typeof e!="string"||e.length===0)return null;let r=e,o=e,i=Yi().tokens;if(Object.hasOwn(i,e))r=e,o=i[e].symbolRaw;else if(e.endsWith("x")||e.endsWith("X")){let f=e.slice(0,-1).toUpperCase();if(Object.hasOwn(i,f))r=f,o=i[f].symbolRaw;else return null}else{let f=e.toUpperCase();if(Object.hasOwn(i,f))r=f,o=i[f].symbolRaw;else return null}let s=i[r],a=cT(r);if(!s||!a)return null;let c=Be(a.priceUsd,`${r}.priceUsd`),l=oe(a.liquidityUsd),u=n===null?D("0"):n,d=u.mantissa===0n?D("0"):lT(l,u),m={venue:rT,chain:oT,instrument:"spot",tier:iT,symbolRaw:o,symbol:r,side:t,requestedSize:u,mid:c,fees:null,gasEstimate:null,priceImpact:d,fundingHourly:null,costAccounted:!1,capturedAt:Yi().capturedAt*1e3,blockOrSeq:null,raw:{fixture:"fixtures/ton_xstocks.json",mint:s.mint,pairAddress:a.pairAddress,dexId:a.dexId,quote:a.quote,liquidityUsd:a.liquidityUsd,volume24h:a.volume24h,priceUsd:a.priceUsd,source:"dexscreener",approximate:!0,reasonCostUnknown:"DexScreener liquidity.usd is a third-party float; fees and TON gas not captured; impact is modeled; TON books are thin",thin:(a.liquidityUsd??0)<sT,impactSizeFractionHint:aT}};return Se(m)}function vb({side:e="buy",sizeUsd:t=null}={}){return El().map(n=>vl({symbol:n,side:e,sizeUsd:t})).filter(n=>n!==null)}var Ab=3600*1e3;function Al(e){return e==null||e===""?null:typeof e=="object"&&e&&typeof e.mantissa=="bigint"?e:D(String(e))}function Ib(e,{sizeUsd:t=null}={}){if(typeof e!="string"||!e.trim())throw new TypeError("ticker is required");let n=e.trim().toUpperCase(),r=Al(t),o=[],i=xb({symbol:`xyz:${n}`,sizeUsd:r});if(i)o.push(i);else for(let l of Wi({ticker:n,sizeUsd:r}))o.push(l);for(let l of zi({sizeUsd:r}))l.symbol===n&&o.push(l);for(let l of Gi({sizeUsd:r}))l.symbol===n&&o.push(l);let s=Mn({symbol:n,sizeUsd:r});s&&o.push(s);let a=kl({symbol:n,sizeUsd:r});a&&o.push(a);let c=vl({symbol:n,sizeUsd:r});return c&&o.push(c),o}function uT(e={}){let t=String(e.ticker||e.symbol||"").trim().toUpperCase();if(!t)throw new Error("bestEquityRoute requires ticker");let n=Al(e.sizeUsd??e.size??null),r=Ib(t,{sizeUsd:n});if(r.length===0)return{ticker:t,rankedOn:"gross",ranked:[],winner:null,runnersUp:[],improvementBps:null,sourcesAnswered:0,sourcesTried:0,failed:[],excluded:[],bestPreparable:null,instrumentMix:"homogeneous",note:"no venue answered for this ticker in the pinned fixture capture"};let o=r[0].capturedAt,i=String(o).length<=10?o*1e3:o,s=e.nowMs==null,a=e.nowMs??o+1e3,c=Math.max(0,Date.now()-i),l=yl(r,{nowMs:a,horizonHours:e.horizonHours!=null?Number(e.horizonHours):void 0,skipLiveness:e.skipLiveness===!0});return{ticker:t,...l,dataSource:s?"fixture":"caller-clock",capturedAt:i,ageMs:c,stale:c>Ab}}function dT(){let e=[{venue:"hyperliquid_hip3",tier:"quote-only",chain:"hyperliquid",n:Wi().length},{venue:"arcus_perp",tier:"quote-only",chain:"robinhood-4663",n:zi().length},{venue:"arcus_spot",tier:"quote-only",chain:"robinhood-4663",n:Gi().length},{venue:"rh_uniswap",tier:"prepare",chain:4663,n:wl().length},{venue:"solana_xstocks",tier:"quote-only",chain:"solana",n:Sl().length},{venue:"ton_stonfi",tier:"quote-only",chain:"ton",n:El().length}],t=[...Wi(),...zi(),...Gi(),...gb(),...Eb(),...vb()],n=(t[0]?.capturedAt??Date.now())+1e3,{survivors:r,excluded:o}=Hi(t,{nowMs:n});return{inventory:e,hip3Dexs:bb(),liveness:{survivors:r.length,excluded:o.length,byReason:o.reduce((i,s)=>(i[s.reason]=(i[s.reason]??0)+1,i),{})},capturedAt:Ae().capturedAt,custody:"prepare-only",note:"quote-only venues are ranked for discovery; only rh_uniswap is preparable in v1"}}function pT(e={}){let t=String(e.ticker||e.symbol||"").trim().toUpperCase(),n=e.recipient||e.taker;if(!t)throw new Error("prepareEquityRoute requires ticker");if(!n)throw new Error("prepareEquityRoute requires recipient (signing wallet)");let r=Al(e.sizeUsd??e.size??null),o=Mn({symbol:t,sizeUsd:r});if(!o)return{ok:!1,failureKind:"no-prepare-path",ticker:t,note:"no RH Uniswap prepare-tier route for this ticker in fixtures"};try{let i=String(o.capturedAt).length<=10?o.capturedAt*1e3:o.capturedAt,s=e.nowMs!=null,a=s?Number(e.nowMs):Date.now(),c=Math.max(0,Date.now()-i),l=xl({symbol:t,sizeUsd:r,recipient:n,nowMs:a});return{ok:!0,ticker:t,artifact:l,bestPreparableVenue:"rh_uniswap",dataSource:s?"caller-clock":"live-clock",capturedAt:i,ageMs:c,stale:c>Ab}}catch(i){return{ok:!1,failureKind:"prepare-refused",ticker:t,error:String(i.message||i)}}}function mT(e){return JSON.parse(JSON.stringify(e,(t,n)=>typeof n=="bigint"?n.toString():n))}var ue=Object.freeze({SAFE:"SAFE",CAUTION:"CAUTION",HONEYPOT:"HONEYPOT",UNKNOWN:"UNKNOWN"}),fT=5e3,hT=1500;function gT(e,t){return t===0n?null:Number((t-e)*10000n/t)}function yT(e,t){if(e==null||e==="")throw new Error(`sell-sim: ${t} required`);if(typeof e=="bigint")return e;let n=String(e).trim();if(!/^\d+$/.test(n))throw new Error(`sell-sim: ${t} must be an integer base-unit amount`);return BigInt(n)}async function Cb(e={},t={}){let{token:n,base:r,chainId:o=null}=e;if(!n)throw new Error("sell-sim: token required");if(!r)throw new Error("sell-sim: base asset required");if(typeof t.quote!="function")throw new Error("sell-sim: opts.quote function required");let i=yT(e.amountIn,"amountIn"),s;try{s=await t.quote({chainId:o,inputMint:r,outputMint:n,amount:i.toString(),side:"buy"})}catch(p){return vt(ue.UNKNOWN,`buy leg could not be quoted: ${Pb(p)}`,{chainId:o,token:n,base:r})}let a=_b(s?.outAmount);if(a==null||a===0n)return vt(ue.UNKNOWN,"buy leg returned no output \u2014 no route or no liquidity",{chainId:o,token:n,base:r});let c;try{c=await t.quote({chainId:o,inputMint:n,outputMint:r,amount:a.toString(),side:"sell"})}catch(p){return vt(ue.HONEYPOT,`buy routes but the SELL leg fails to quote (${Pb(p)}) \u2014 you would not be able to exit`,{chainId:o,token:n,base:r,tokensOut:a.toString()})}let l=_b(c?.outAmount);if(l==null||l===0n)return vt(ue.HONEYPOT,"sell leg returns zero \u2014 the position cannot be exited for value",{chainId:o,token:n,base:r,tokensOut:a.toString()});let u=gT(l,i),d={chainId:o,token:n,base:r,amountIn:i.toString(),tokensOut:a.toString(),roundTripOut:l.toString(),roundTripLossBps:u};return u==null?vt(ue.UNKNOWN,"could not compute round-trip loss",d):u>=fT?vt(ue.HONEYPOT,`round trip loses ${(u/100).toFixed(1)}% \u2014 a sell tax or rigged curve, not normal slippage`,d):u>=hT?vt(ue.CAUTION,`round trip loses ${(u/100).toFixed(1)}% \u2014 high tax or thin liquidity`,d):vt(ue.SAFE,`round trip loses ${(u/100).toFixed(1)}% \u2014 exit path looks normal`,d)}function vt(e,t,n){return{status:e,safe:e===ue.SAFE,tradable:e===ue.SAFE||e===ue.CAUTION,reason:t,...n}}function _b(e){if(e==null)return null;try{let t=String(e).trim();return/^\d+$/.test(t)?BigInt(t):null}catch{return null}}function Pb(e){return String(e?.message||e).slice(0,120)}async function bT(e={},t={}){let n=await Cb(e,t);if(!(n.status===ue.SAFE||n.status===ue.CAUTION&&t.allowCaution!==!1||n.status===ue.UNKNOWN&&t.allowUnknown===!0)){let o=new Error(`sell-sim ${n.status}: ${n.reason}`);throw o.sellSim=n,o}return n}var At=Object.freeze({ALERT_ONLY:"alert_only",EXECUTE:"execute"}),wT=new Set(["watch","watch this","ping","ping me","alert","notify"]),xT=new Set(["watching","armed"]);function Tb(e){if(typeof e!="string"||!e.trim())throw new TypeError("explicit action verb required");let t=e.trim().toLowerCase().replace(/\s+/g," ");if(wT.has(t))return At.ALERT_ONLY;if(t==="arm")return At.EXECUTE;throw new TypeError(`unsupported action verb: ${t}`)}function ST(e={}){let{verb:t,...n}=e;return{...n,active:!0,actionMode:Tb(t)}}function kT(e){if(!e||typeof e!="object"||typeof e.active!="boolean")throw new TypeError("active must be boolean");if(!Object.values(At).includes(e.actionMode))throw new TypeError("actionMode must be alert_only or execute");return e}function ET(e){return e?.active===!0&&e?.actionMode===At.ALERT_ONLY}function vT(e){return e?.active===!0&&e?.actionMode===At.EXECUTE}function AT(e={}){if(e.actionMode!==void 0&&e.actionMode!==At.ALERT_ONLY)throw new TypeError("non-alert record cannot enter alert-only watch migration");let t=typeof e.active=="boolean"?e.active:xT.has(String(e.status||"").toLowerCase());return{...e,active:t,actionMode:At.ALERT_ONLY}}import{createHash as IT}from"node:crypto";var Il=1,Nb=Object.freeze(["chainId","agentAddress","accountAddress","actions","targets","maxValueWei","maxGasWei","maxSlippageBps","expiresAt","nonce","revocationKey"]),_T=Object.freeze(["read","simulate"]),Ob=1e4,Rb=1440*60,$b=128,Lb=256,Mb=64,Ub=256,Bb=/^0x[0-9a-fA-F]{40}$/,PT=/^[a-z][a-z0-9_-]*:[a-z0-9._-]+$/,CT=/^[a-z][a-z0-9_-]*:\*$/,TT=/^[A-Za-z0-9._:-]+$/,NT=/^[A-Za-z0-9._:-]+$/,Db=/^(0|[1-9][0-9]*)$/,Vr=class extends Error{constructor(t){let n=t.map(r=>`${r.field}: ${r.message}`);super(`invalid grant (${t.length} error${t.length===1?"":"s"}): ${n.join("; ")}`),this.name="GrantValidationError",this.errors=t}};function OT(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function RT(e){if(typeof e=="bigint")return e>=0n?e.toString(10):null;if(typeof e=="number")return!Number.isSafeInteger(e)||e<0?null:String(e);if(typeof e=="string"){let t=e.trim();return Db.test(t)?t:null}return null}function Un(e){if(typeof e=="bigint")return e<0n||e>BigInt(Number.MAX_SAFE_INTEGER)?null:Number(e);if(typeof e=="number")return!Number.isSafeInteger(e)||e<0?null:e;if(typeof e=="string"){let t=e.trim();if(!Db.test(t))return null;let n=Number(t);return Number.isSafeInteger(n)?n:null}return null}function Fb(e){let t=String(e).split(":")[0];return _T.includes(t)}function qb(e,t={}){let n=[],r=(d,p)=>n.push({field:d,message:p});if(!OT(e))return r("grant","grant must be a plain object"),{ok:!1,errors:n,grant:null};for(let d of Object.keys(e))Nb.includes(d)||r(d,"unknown field is not allowed");for(let d of Nb)(!(d in e)||e[d]==null)&&r(d,"required field is missing");if(n.length)return{ok:!1,errors:n,grant:null};let o={},i=Un(e.chainId);i==null||i<=0?r("chainId","must be a positive integer chain id"):o.chainId=i;for(let d of["agentAddress","accountAddress"]){let p=e[d];typeof p!="string"||!Bb.test(p.trim())?r(d,"must be a 0x-prefixed 20-byte hex address"):o[d]=p.trim().toLowerCase()}if(!Array.isArray(e.actions)||e.actions.length===0)r("actions","must be a non-empty array of action scopes");else if(e.actions.length>Mb)r("actions",`too many actions (max ${Mb})`);else{let d=[];for(let p of e.actions){let m=typeof p=="string"?p.trim():null;if(!m){r("actions","action entries must be non-empty strings");continue}if(m.includes("*")){t.allowWildcardActions===!0&&CT.test(m)?d.push(m):r("actions",`broad wildcard action "${m}" is rejected (fail closed)`);continue}if(!PT.test(m)){r("actions",`malformed action "${m}" (expected verb:resource)`);continue}d.push(m)}o.actions=[...new Set(d)].sort()}if(!Array.isArray(e.targets))r("targets","must be an array of contract addresses");else if(e.targets.length>Ub)r("targets",`too many targets (max ${Ub})`);else{let d=[];for(let p of e.targets){let m=typeof p=="string"?p.trim():null;if(!m||!Bb.test(m)){r("targets",`target "${p}" must be a 0x-prefixed 20-byte hex address (wildcards not allowed)`);continue}d.push(m.toLowerCase())}if(o.targets=[...new Set(d)].sort(),o.targets.length===0&&Array.isArray(o.actions)){let p=o.actions.filter(m=>!Fb(m));(p.length>0||o.actions.length===0)&&r("targets",`empty targets are only allowed for read/simulate scopes (blocked by: ${p.join(", ")||"no valid actions"})`)}}for(let d of["maxValueWei","maxGasWei"]){let p=RT(e[d]);p==null?r(d,"must be a non-negative integer wei amount"):o[d]=p}let s=Un(e.maxSlippageBps);s==null||s>Ob?r("maxSlippageBps",`must be an integer between 0 and ${Ob}`):o.maxSlippageBps=s;let a=864e10,c=Un(e.expiresAt);if(c==null||c<=0)r("expiresAt","must be a positive unix-seconds timestamp");else if(c>a)r("expiresAt","exceeds the max unix-seconds timestamp (pass seconds, not milliseconds)");else if(o.expiresAt=c,t.now!=null){let d=Un(t.now);d==null?r("expiresAt","opts.now must be a unix-seconds integer"):c<=d?r("expiresAt",`grant is expired (expiresAt ${c} <= now ${d})`):c-d>Rb&&r("expiresAt",`grant exceeds the hard 24-hour TTL (${Rb} seconds)`)}let l=typeof e.nonce=="string"?e.nonce.trim():Un(e.nonce)!=null?String(Un(e.nonce)):null;!l||l.length>$b||!TT.test(l)?r("nonce",`must be a non-empty string (max ${$b} chars, [A-Za-z0-9._:-])`):o.nonce=l;let u=typeof e.revocationKey=="string"?e.revocationKey.trim():null;return!u||u.length>Lb||!NT.test(u)?r("revocationKey",`must be a non-empty public identifier (max ${Lb} chars, [A-Za-z0-9._:-])`):o.revocationKey=u,n.length?{ok:!1,errors:n,grant:null}:{ok:!0,errors:[],grant:o}}function _l(e,t={}){let{ok:n,errors:r,grant:o}=qb(e,t);if(!n)throw new Vr(r);return o}function Pl(e,t={}){let n=_l(e,t),o=Object.keys(n).sort().map(i=>`${JSON.stringify(i)}:${JSON.stringify(n[i])}`);return`{"version":${Il},${o.join(",")}}`}function Hb(e,t={}){return IT("sha256").update(Pl(e,t),"utf8").digest("hex")}var jb=new Set(["read:markets","read:nfts","read:positions","watch:contracts","prepare:trade","prepare:mint","prepare:build","build:factory","agent:shadow","agent:execute"]),$T="agent:execute",LT="build:factory",Vb=["read:markets","read:nfts","read:positions","watch:contracts","prepare:trade","prepare:mint","prepare:build","agent:shadow"];function MT(e){let t=Array.isArray(e)&&e.length?e:Vb,n=[...new Set(t.map(o=>String(o).trim()).filter(Boolean))],r=n.filter(o=>!jb.has(o));if(r.length)throw new Error(`Invalid scope: ${r.join(", ")}`);return n}var zb=Object.freeze([{id:"oracle",label:"Oracle Native",kind:"oracle",bins:["oracle"],website:!0,detect:!0},{id:"hermes",label:"Hermes Agent",kind:"mcp",bins:["hermes"],mcpTarget:"generic",configKey:"hermes",website:!0,detect:!0},{id:"claude",label:"Claude Code",kind:"mcp",bins:["claude"],mcpTarget:"claude-code",configKey:"claudeCode",website:!0,detect:!0},{id:"claude-desktop",label:"Claude Desktop",kind:"mcp",bins:[],mcpTarget:"claude-desktop",configKey:"claudeDesktop",website:!0,detect:!1},{id:"chatgpt",label:"ChatGPT",kind:"mcp",bins:[],mcpTarget:"chatgpt",configKey:"chatgpt",website:!0,detect:!1},{id:"codex",label:"OpenAI Codex",kind:"mcp",bins:["codex"],mcpTarget:"codex",configKey:"codex",website:!0,detect:!0},{id:"cursor",label:"Cursor",kind:"mcp",bins:["cursor","cursor-agent"],mcpTarget:"cursor",configKey:"cursor",website:!0,detect:!0},{id:"windsurf",label:"Windsurf",kind:"mcp",bins:["windsurf"],mcpTarget:"vscode",configKey:"windsurf",website:!0,detect:!0},{id:"vscode",label:"VS Code / Copilot",kind:"mcp",bins:["code","code-insiders"],mcpTarget:"vscode",configKey:"vscode",website:!0,detect:!0},{id:"openclaw",label:"OpenClaw",kind:"mcp",bins:["openclaw","claw"],mcpTarget:"generic",configKey:"openclaw",website:!0,detect:!0},{id:"perplexity",label:"Perplexity",kind:"mcp",bins:["perplexity","pplx"],mcpTarget:"generic",configKey:"perplexity",website:!0,detect:!0},{id:"manus",label:"Manus",kind:"mcp",bins:["manus"],mcpTarget:"generic",configKey:"manus",website:!0,detect:!0},{id:"prime",label:"Prime Intellect Agent",kind:"mcp",bins:["prime-agent","prime"],mcpTarget:"generic",configKey:"prime",website:!1,detect:!0},{id:"opencode",label:"OpenCode",kind:"mcp",bins:["opencode"],mcpTarget:"generic",configKey:"opencode",website:!1,detect:!0},{id:"aider",label:"Aider",kind:"mcp",bins:["aider"],mcpTarget:"generic",configKey:"aider",website:!1,detect:!0},{id:"continue",label:"Continue",kind:"mcp",bins:["continue"],mcpTarget:"vscode",configKey:"continue",website:!1,detect:!0},{id:"goose",label:"Goose",kind:"mcp",bins:["goose"],mcpTarget:"generic",configKey:"goose",website:!1,detect:!0},{id:"amp",label:"Amp",kind:"mcp",bins:["amp"],mcpTarget:"generic",configKey:"amp",website:!1,detect:!0},{id:"generic",label:"Generic MCP",kind:"mcp",bins:[],mcpTarget:"generic",configKey:"genericMcp",website:!0,detect:!1}]);function Wb(){return zb.filter(e=>e.website)}var UT="@oracle-agent/oracle",BT="npx",DT=["-y","--package",UT,"oracle-data-mcp"],Kb=/(?:^|_)(?:PRIVATE_KEY|SECRET|TOKEN|PASSWORD|PASSPHRASE|MNEMONIC|SEED)(?:_|$)/i;function Tl(e,t){if(typeof e!="string"||!e.trim())throw new TypeError(`${t} must be a non-empty string`);if(/\r|\n|\0/.test(e))throw new TypeError(`${t} must be a single-line string`);return e.trim()}function FT(e){let t=Tl(e,"url"),n;try{n=new URL(t)}catch{throw new TypeError("url must be a valid http(s) URL")}if(!/^https?:$/.test(n.protocol)||n.username||n.password)throw new TypeError("url must be a credential-free http(s) URL");for(let r of n.searchParams.keys())if(Kb.test(r)||/^(?:key|api[_-]?key|auth)$/i.test(r))throw new TypeError(`url must not contain secret-shaped query parameter: ${r}`);return n.href}function qT(e){let t=Tl(e,"key");if(/^[A-Z][A-Z0-9_]*\s*=/.test(t)||/-----BEGIN [A-Z ]*PRIVATE KEY-----/.test(t))throw new TypeError("key must be an Oracle agent key, not an environment assignment or private key");if(/^(?:0x)?[0-9a-f]{64}$/i.test(t)||t.trim().split(/\s+/).length>=12)throw new TypeError("key looks like private signing material");return t}function HT(e){let t=Tl(e,"label");if(!/^[a-z0-9][a-z0-9_-]{0,62}$/i.test(t))throw new TypeError("label must contain only letters, digits, underscores, and hyphens");if(Kb.test(t))throw new TypeError("label must not be a secret-shaped environment name");return t}function Ie(e){return`${JSON.stringify(e,null,2)}
59
+ `}function Cl(e){return JSON.stringify(e)}function zr(e){return JSON.stringify(e)}function Gb(e,t){return["mcp_servers:",` ${e}:`,` command: ${Cl(t.command)}`," args:",...t.args.map(n=>` - ${Cl(n)}`)," env:",...Object.entries(t.env).map(([n,r])=>` ${n}: ${Cl(r)}`),""].join(`
60
+ `)}function jT(e,t){return[`[mcp_servers.${zr(e)}]`,`command = ${zr(t.command)}`,`args = [${t.args.map(zr).join(", ")}]`,"",`[mcp_servers.${zr(e)}.env]`,...Object.entries(t.env).map(([n,r])=>`${n} = ${zr(r)}`),""].join(`
61
+ `)}function VT(){return["# Oracle native harness (default)","npm i -g @oracle-agent/oracle","oracle setup model","oracle chat",""].join(`
62
+ `)}function Yb({url:e,key:t,label:n="oracle-data"}={}){let r=FT(e),o=qT(t),i=HT(n),s={command:BT,args:[...DT],env:{ORACLE_DATA_URL:r,ORACLE_AGENT_KEY:o}},a={mcpServers:{[i]:s}},c={hermes:Gb(i,s),claudeCode:Ie(a),codex:jT(i,s),cursor:Ie(a),genericMcp:Ie(a),oracleNative:VT(),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 zT=Yb;var Xb=Object.freeze({assetHighPct:50,assetMediumPct:25,chainHighPct:75,venueHighPct:60,stablecoinHighPct:70}),WT=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 Ol(e,t){return t>0?Wr(e/t*100):null}function Rl(e){return e.address||e.owner||e.walletAddress||e.wallet?.address||null}function GT(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||WT.has(r.toUpperCase())})}function KT(e){let t=[],n=Rl(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 YT(e,t){let n=Rl(e),r=e.chain??e.chainId??e.family??"*";return n?`${String(n).toLowerCase()}|${String(r).toLowerCase()}`:`snapshot:${t}`}function Nl(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:Ol(i,n)})).sort((o,i)=>i.knownUsd-o.knownUsd||o.name.localeCompare(i.name))}function Xi(e={},t={}){let n=Array.isArray(e)?e:Array.isArray(e.snapshots)?e.snapshots:e.snapshot?[e.snapshot]:[],r=GT(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=YT(E,q);s.has(ge)?a+=1:(s.add(ge),i.push(E))});let c=i.flatMap(KT),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=Nl(l,"chain",p),h=Nl(l,"venue",p),g=Nl(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(Rl).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:Ol(b,p),high:p>0&&Ol(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 XT=Xi;var de=(e,t=0)=>Number.isFinite(Number(e))?Number(e):t,De=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,Ji=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 QT(e){let t=e.fillId??e.tradeId??e.orderId??e.txHash??e.transactionHash??e.timestamp??e.asOf;return[Ji(e),re(t),re(e.side),de(e.quantity??e.amount??e.size),de(e.price??e.priceUsd)].join("|")}function Qi(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"?QT(o):Ji(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 JT(e){let t=new Map;for(let n of e){let r=[Ji(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 ZT(e,t){return t.get(Ji(e))??t.get(`${re(e.chain??e.chainId)}|${re(Ye(e))}`)??t.get(`*|${re(Ye(e))}`)??null}function eN(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:De(n),lots:t}}function $l(e={},t={}){let n=de(t.asOf??e.asOf,0),r=Math.max(0,de(t.priceTtlMs??e.priceTtlMs,6e4)),o=Qi(e.balances||[],"balance"),i=Qi(e.positions||[],"position"),s=Qi(e.fills||[],"fill"),a=Qi(e.prices||[],"price"),c=JT(a.rows),l=[],u=0,d=0;for(let _ of[...o.rows,...i.rows]){let E=ZT(_,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=eN(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:De(E),percent:v?De(E/v*100):null})).sort((_,E)=>E.exposureUsd-_.exposureUsd||_.asset.localeCompare(E.asset)),I=l.reduce((_,E)=>_+Math.abs(E.valueUsd),0),R=Xi({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:De(x),totalUsd:De(k+x)},exposure:{grossUsd:De(h),netUsd:De(g),leverage:b>0?De(h/b):null,equityUsd:De(b)},concentration:T,priceCoverage:{pricedItems:l.length,unpricedItems:d,staleItems:l.filter(_=>_.stale).length,staleValueUsd:De(u),stalePercent:I?De(u/I*100):null,ttlMs:r},risk:R})}var tN=$l,nN=$l;import{createHash as aN}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}},rN=/(private[_-]?key|secret|bearer|keystore|mnemonic|seed[_-]?phrase|passphrase|password|api[_-]?key|access[_-]?token|auth[_-]?token|session[_-]?token|signer[_-]?url|signature)/i,oN=Object.freeze(["privkey","wif","xprv","seed"]);function ew(e){let t=String(e),n=t.toLowerCase().replace(/[\s._-]+/g,"");return rN.test(t)||oN.includes(n)}var iN=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}]),sN=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=sN.includes(String(r).toLowerCase().replace(/[_-]/g,""));for(let{rule:i,re:s}of iN)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 Zi=Object.freeze(["intent","quote_comparison","simulation","prepared","approval","signed","broadcast","settlement","balance_delta","position"]),Ml=Object.freeze(Object.fromEntries(Zi.map((e,t)=>[e,Object.freeze(t+1<Zi.length?[Zi[t+1]]:[])]))),tw=new Set(["signed","broadcast"]);function Ll(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(Ll).join(",")}]`:`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${Ll(e[t])}`).join(",")}}`}function cN(e){return e===void 0?null:JSON.parse(JSON.stringify(e))}function es(e){if(e&&typeof e=="object"&&!Object.isFrozen(e)){Object.freeze(e);for(let t of Object.values(e))es(t)}return e}function Ul(e,t="fact"){try{Kt(e,t)}catch{throw new Error(`${t} contains custody material and is forbidden`)}}function nw(e){return aN("sha256").update(Ll(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:cN(n)};return es({...s,hash:nw(s)})}function lN({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");Ul(t,"intent");let r=rw({tradeId:e,state:"intent",fact:t,asOf:n,previousHash:null,external:!1});return es({tradeId:e,state:"intent",events:[r],headHash:r.hash,custody:"none",execution:"prepare-only"})}function ow(e,t,n,r={}){if(Bl(e),!(Ml[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`);Ul(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 es({...e,state:t,events:[...e.events,c],headHash:c.hash})}function Bl(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(Ul(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&&!Ml[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 uN=ow,dN=Bl;function pN(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 mN(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 ts(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 Dl(e,t={}){let n=pN(e),r=ts(t.concurrency,4,"concurrency",1,!0),o=ts(t.timeoutMs,5e3,"timeoutMs",Number.EPSILON),i=ts(t.asOf,Date.now(),"asOf",Number.NEGATIVE_INFINITY),s=ts(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 mN(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 fN=Dl,hN=Dl;import{createHash as gN}from"node:crypto";var Fl=1,fw=/^[a-z0-9][a-z0-9._-]{0,63}$/,hw=/^[A-Za-z0-9][A-Za-z0-9._-]{0,63}$/,yN=new Set(["open","high","low","close","volume","fundingRate","openInterest"]),bN=new Set(["sma","ema","rsi","macd","bollinger","atr"]),wN=new Set(["gt","gte","lt","lte","eq"]),xN=new Set(["and","or","not"]),SN=new Set(["above","below"]),kN=new Set(["line","signal","histogram"]),EN=new Set(["upper","middle","lower"]),ql=new Set(["compare","logic","cross"]),iw=new Set(["version","id","name","venue","market","parameters","nodes","rules","risk"]),sw=new Set(["value","min","max","step"]),Hl=new Set(["entryLong","entryShort","exitLong","exitShort"]),aw=new Set(["maxLeverage","maxNotionalUsd","positionSizePct","stopLossPct","takeProfitPct","cooldownBars","maxDailyLossPct","expiresAt"]),vN=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 Vl(e){if(e==null||typeof e!="object"||Object.isFrozen(e))return e;if(Array.isArray(e)){for(let t of e)Vl(t);return Object.freeze(e)}for(let t of Object.keys(e))Vl(e[t]);return Object.freeze(e)}function zl(e){if(Array.isArray(e))return e.map(zl);if(e!=null&&typeof e=="object"){let t={};for(let n of Object.keys(e).sort())t[n]=zl(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 jl(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 ns(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 AN(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 ns(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 IN(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 _N(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,vN,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"||!yN.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"||!bN.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=jl(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=jl(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=jl(e[a],`${o}.${a}`,n,r);c!=null&&(s[a]=c)}"output"in e?kN.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?EN.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"||!wN.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"||!xN.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"||!SN.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 PN(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 CN(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!==Fl&&A(n,"version",`must be ${Fl}`),(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=rs(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=IN(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=_N(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 ns(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 ns(p)){let h=a.get(f);h&&ql.has(h.type)&&A(n,m,`node ref "${f}" must be numeric`)}if(p.type==="logic")for(let f of ns(p)){let h=a.get(f);h&&!ql.has(h.type)&&A(n,m,`node ref "${f}" must be boolean`)}}AN(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,Hl,"rules",n);for(let d of Hl)d in e.rules||A(n,`rules.${d}`,"required field is missing");c={};for(let d of Hl){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);ql.has(m.type)||A(n,`rules.${d}`,`rule must reference a boolean node, not ${m.type}`),c[d]=p}}let l=PN(e.risk,n,t);if(n.length)return{ok:!1,errors:n,strategy:null};let u=Vl({version:Fl,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=CN(e,t);if(!n.ok)throw new Bn(n.errors);return n.strategy}function TN(e){let t=tt(e);return JSON.stringify(zl(t))}function Wl(e){let t=TN(e);return gN("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 NN(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 os(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=os(e,n),s=os(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){NN(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 ON}from"node:crypto";var Gl=2,RN="93f9c998260e73756c13871dc1a84dd6cdb26ec6113bd1941f023519939db440",$N="68f5b412a9975f04024cf9b9b6209b4bccedd52f176e95f34f786b3f53479c6a",LN="f197a38ff1c0f4ebe13326db8cbb8167ea3dd5d62e6033fe97c2fee8d23d96b5",vw=ON("sha256").update(JSON.stringify({version:Gl,compilerSourceHash:RN,indicatorsSourceHash:$N,schemaSourceHash:LN})).digest("hex");var is=Gl,Kl=vw,MN=Object.freeze({open:"o",high:"h",low:"l",close:"c",volume:"v",fundingRate:"fundingRate",openInterest:"openInterest"}),UN=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 Fe(e){return typeof e=="number"&&Number.isFinite(e)}function BN(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 DN(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(!Fe(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(!Fe(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!==UN[n])throw new TypeError(`bars t must match ${n} cadence`)}if(r=s,"fundingRate"in i&&i.fundingRate!=null&&!Fe(i.fundingRate))throw new TypeError(`bars[${o}].fundingRate must be finite when present`);if("openInterest"in i&&i.openInterest!=null){if(!Fe(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=MN[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||!Fe(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=os(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||!Fe(d)||!Fe(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||!Fe(d)||!Fe(p)||!Fe(m)||!Fe(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 Yl(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(BN(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=Wl(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){DN(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:is,compilerHash:Kl,requiredSeries:a,nodeOrder:o,evaluate:d,evaluateAll:p})}import{createHash as FN}from"node:crypto";var U3=Object.freeze({initialEquityUsd:1e4,takerFeeBps:3.5,builderFeeBps:2,slippageBps:2,latencyBars:1,maxVolumeParticipationPct:100});var qN=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(!qN.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 HN(e){return FN("sha256").update(JSON.stringify(Aw(e)),"utf8").digest("hex")}function qe(e,t,n=0){if(!Number.isInteger(e)||e<n)throw new Error(`${t} must be an integer >= ${n}`);return e}function Xl(e,t){if(!Pt(e)||!Pt(e.metrics))throw new Error(`${t} metrics required`);let n=qe(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 jN(e,{maxDailyLossPct:t}={}){let n=e.split,r=qe(n.trainStartIndex,"split.trainStartIndex"),o=qe(n.trainEndIndex,"split.trainEndIndex"),i=qe(n.trainBarCount,"split.trainBarCount",1),s=qe(n.holdoutStartIndex,"split.holdoutStartIndex"),a=qe(n.holdoutEndIndex,"split.holdoutEndIndex"),c=qe(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)");Xl(e.train,"train");let l=Xl(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=qe(g.trainStartIndex,`walkForward.windows[${h}].trainStartIndex`),k=qe(g.trainEndIndex,`walkForward.windows[${h}].trainEndIndex`),x=qe(g.evalStartIndex,`walkForward.windows[${h}].evalStartIndex`),w=qe(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=Xl({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=HN(e);if(e.id!==o)throw new Error("evidence.id does not match its deterministic artifact facts digest");return e.status==="pass_live_eligible"&&jN(e,t),e}W();var VN=["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 zN(e){return String(e).toLowerCase().replace(/[^a-z0-9]/g,"")}function Jl(e,t="value"){if(Array.isArray(e)){e.forEach((n,r)=>Jl(n,`${t}[${r}]`));return}if(Xr(e))for(let[n,r]of Object.entries(e)){let o=zN(n);if(VN.some(i=>o.includes(i)))throw new Error(`handoff: forbidden secret-like field at ${t}.${n}`);Jl(r,`${t}.${n}`)}}function Ql(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(Jl({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=Yl(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(!Ql(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(!Ql(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(!Ql(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:is,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 WN=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 GN(e){let t=WN[e];if(!t)throw new TypeError(`unsupported strategy interval: ${e}`);return t}function KN(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 YN(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 XN({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 Xu({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 YN(o,n)}function QN(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=GN(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),XN({coin:n,startTime:a,endTime:i},t)]),u=KN(c,{endTime:i}),d=Qr(QN(u,l,o));return Qr({coin:n,interval:r,range:{startTime:a,endTime:i},bars:d})}var JN=new Set(["1m","3m","5m","15m","30m","1h","2h","4h","8h","12h","1d"]),ZN=new Set(["coin","interval"]);function eO(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))ZN.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"||!JN.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 tO(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:eO,fetchBars:Pw,listMarkets:tO,prepareIntent(e){return _w(e)}});var nO=Object.freeze(["id","validateMarket","prepareIntent"]);function rO(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 nO.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(rO),oO=new Map(Tw.map(e=>[e.id,e])),iO=Object.freeze([...Tw]);function rs(e){return typeof e!="string"?null:oO.get(e)??null}function sO(e){let t=rs(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"]),aO=new Set(Nw);function ss(e){if(!aO.has(e))throw new TypeError(`Unknown watch category: ${String(e)}`);return e}function Zl(e={}){let t=e.subscribedCategories??[];if(!Array.isArray(t))throw new TypeError("subscribedCategories must be an array");return t}function Ow(){return{subscribedCategories:[]}}function cO(e,t){ss(t);let n=Zl(e);return n.includes(t)?{...e,subscribedCategories:[...n]}:{...e,subscribedCategories:[...n,t]}}function lO(e,t){ss(t);let n=Zl(e);return{...e,subscribedCategories:n.filter(r=>r!==t)}}function uO({category:e,notify:t=!1,...n}={}){if(ss(e),typeof t!="boolean")throw new TypeError("watch notify must be a boolean");return{...n,category:e,notify:t}}function dO(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 ss(e.category),Zl(t).includes(e.category)?{deliver:!0,reason:"category-subscribed"}:dO(e,n)?{deliver:!0,reason:"watch-opt-in"}:{deliver:!1,reason:"not-subscribed"}}function pO(e,t,n){return Rw(e,t,n).deliver}var $w=Object.freeze(["wallet","pool","nft_floor","hl_flow","prediction_market"]),mO=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,as=e=>Math.round(e*1e4)/1e4;function Lw(e){let t=String(e?.type??e?.surface??e?.kind??"").toLowerCase();return mO[t]??t}function fO(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:as(n)})}function hO(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 gO(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 yO(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 bO(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 wO(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 xO=Object.freeze({wallet:hO,pool:gO,nft_floor:yO,hl_flow:bO,prediction_market:wO});function SO(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 eu(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=fO(o,i),c=xO[s],l=[];c&&c(o,l);let u=s==="wallet"?2:s==="pool"?3:2,d=as(ae(l.length/u)),p=l.reduce((x,w)=>x+w.value,0),m=SO(o,a,t),f=m===null?0:ae(m,-1,1)*.35;m!==null&&Pe(l,"shadow_markout",f);let h=as(ae(.5+p+f)),g=m===null?.8:ae(.85+m*.3,.35,1),b=as(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 eu(t,n,{...e,...r})}})}import{mkdir as kO,chmod as cs,readFile as EO,rename as vO,writeFile as AO}from"node:fs/promises";import{homedir as IO}from"node:os";import{dirname as Uw,join as tu}from"node:path";import _O from"sql.js";var ds=Object.freeze(["project","entity","source","thesis","strategy","simulation","prepared_action","receipt","position"]),PO=new Set(ds),CO=new Set(ds.slice(0,-1).map((e,t)=>`${e}:${ds[t+1]}`)),Dw=tu(process.env.ORACLE_CONFIG_DIR||tu(IO(),".config","oracle"),"workspace"),Fw=tu(Dw,"artifacts.sqlite");function ps(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(ps).join(",")}]`:`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${ps(e[t])}`).join(",")}}`}function Bw(e){if(!PO.has(e))throw new TypeError(`unknown artifact type: ${e}`);return e}function ls(e){let t=[];for(;e.step();)t.push(e.getAsObject());return e.free(),t}function us(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 kO(Uw(t),{recursive:!0,mode:448}),await cs(Uw(t),448);let n;try{n=await EO(t)}catch(l){if(l.code!=="ENOENT")throw l}let r=await _O(e.sqlJs||{}),o=n?new r.Database(n):new r.Database;o.run(`
63
63
  PRAGMA foreign_keys=ON;
64
64
  CREATE TABLE IF NOT EXISTS artifacts (
65
65
  id TEXT PRIMARY KEY, type TEXT NOT NULL, created_at TEXT NOT NULL, data_json TEXT NOT NULL
@@ -71,4 +71,4 @@ ${i.stderr}`.slice(0,1500));let s=n.metadata.contractName;if(t.contractName&&t.c
71
71
  CREATE TABLE IF NOT EXISTS action_receipts (
72
72
  artifact_id TEXT PRIMARY KEY REFERENCES artifacts(id), receipt_json TEXT NOT NULL
73
73
  );
74
- `);let i=!1,s=Promise.resolve();function a(){let l=async()=>{let u=`${t}.tmp-${process.pid}`;await nO(u,Buffer.from(o.export()),{mode:384}),await ss(u,384),await tO(u,t),await ss(t,384)};return s=s.then(l,l),s}n?await ss(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=Ew(String(l.type)),d=String(l.id||"").trim();if(!d)throw new TypeError("artifact id required");let p=Re(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,us(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()?cs(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"):(Ew(String(l)),o.prepare("SELECT * FROM artifacts WHERE type=? ORDER BY created_at,id"));return l!==void 0&&u.bind([String(l)]),as(u).map(cs)},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=as(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(!sO.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)]),as(u).map(cs)},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)]),as(u).map(cs)},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=Re(u);return o.run("INSERT INTO action_receipts(artifact_id,receipt_json) VALUES(?,?)",[String(l),us(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 aO=Aw;import{createHash as Iw}from"node:crypto";var cO=new Set(["accesstoken","refreshtoken","idtoken","token","apikey","clientsecret","password","auth","jwt","session","secret","key","code","signature","xamzsignature","privatekey","authorization","bearer","credential"]);function lO(e){return cO.has(String(e).replace(/[^a-z0-9]/gi,"").toLowerCase())}function ds(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(ds).join(",")}]`:`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${ds(e[t])}`).join(",")}}`}function _w(e){return Iw("sha256").update(String(e)).digest("hex")}function Pw(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(lO(n))throw new TypeError("research source URL must not contain sensitive query parameters");return t.toString()}function Cw(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 ps(e={}){let t=Pw(e.url??e.sourceUrl),n=Cw(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(Re({url:t,fetchedAt:n,contentHash:r}))}function uO(e={}){let t=Pw(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=Cw(e.fetchedAt),s=_w(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(ps),c=Re({sourceUrl:t,fetchedAt:i,contentHash:s,snapshot:n,claim:r,confidence:o,contradictions:(e.contradictions||[]).map(String),citations:a});return Object.freeze({id:`research:${Iw("sha256").update(ds(c)).digest("hex")}`,...c})}var dO=ds;function Wl(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(ps):[];if(t==="agent_recommendation"&&n.length===0)throw new TypeError("agent_recommendation prepared actions require evidence citations");return Object.freeze(Re({...e,origin:t,citations:Object.freeze(n)}))}var pO=Wl,mO=Wl;export{vt as ACTION_MODES,gm as ACTION_RECEIPT_VERSION,_b as ALLOWED_SCOPES,ls as ARTIFACT_TYPES,bn as ActionReceiptSecretError,pT as BUILD_SCOPE,Kn as CHAINS,Ar as CHAIN_CONFIGS,$b as DEFAULT_RISK_THRESHOLDS,Pb as DEFAULT_SCOPES,kw as DEFAULT_WORKSPACE_DIR,vw as DEFAULT_WORKSPACE_PATH,F as EVIDENCE,dT as EXECUTE_SCOPE,gl as GRANT_VERSION,jr as GrantValidationError,wi as NftGasWarLimitError,gs as PREPARE_HARD_MAX_AGE_MS,Gn as PREPARE_MAX_AGE_MS,hs as PREPARE_VERSION,Le as QUALITY,U as RISK,An as SCANNER_CAPABILITIES,ue as SELL_SIM,bw as SIGNAL_TYPES,Qi as TRADE_STATES,Il as TRADE_TRANSITIONS,hw as WATCH_CATEGORIES,fb as actionModeForVerb,Hb as advanceTradeLifecycle,ZC as assertActionRecord,pE as assertCapability,wI as assertNftMintGasWar,Re as assertNoReceiptSecrets,Bw as assertPreparedEnvelope,mO as assertRecommendationEvidence,YC as assertSellable,Pl as assertTradeLifecycle,on as autonomousTradingEnabled,Z1 as bestBridgeRoute,qC as bestEquityRoute,J1 as bestSwapRoute,bm as canonicalReceiptJson,dO as canonicalResearchJson,bl as canonicalizeGrant,ep as capabilityStatus,Qr as chainById,ub as collectEquityQuotes,bs as computePrepareHash,ws as computePrepareMac,wm as computeReceiptId,_w as contentHash,Dk as createActionReceipt,JC as createActionRecord,aO as createArtifactStore,ET as createHarnessConfigs,OT as createPortfolioLedger,pO as createPreparedAction,uO as createResearchArtifact,qf as createScanner,xw as createSignalsEngine,FT as createTradeLifecycle,qN as createWatch,G1 as data,E as dataCall,fy as dataCatalog,my as dataHealth,gw as defaultPreferences,Rb as emitHarnessConfigs,VC as equityToJsonSafe,HC as equityVenues,yw as evaluateAlert,qh as executeRfqCandidates,Fk as formatActionReceipt,co as getProvider,dA as getScanner,Ib as grantId,Bh as hashFirmQuote,Uh as hashRfqIntent,WT as healthRollup,eT as isActiveAlert,tT as isActiveExecution,ks as isSupportedChain,Zn as listProviders,pA as listScanners,nT as migrateLegacyWatchRecord,xm as normalizeActionReceipt,ps as normalizeCitation,lc as normalizeFirmQuote,yl as normalizeGrant,Ai as normalizeRfqIntent,mT as normalizeScopes,Aw as openArtifactStore,RT as portfolioLedger,_T as portfolioRiskSummary,mE as posture,Wl as prepareAction,jC as prepareEquityRoute,zT as providerHealthRollup,Hh as rankRfqQuotes,Kf as registerBuiltinScanners,Qw as registerChain,Yf as registerCustomChain,P as registerProvider,di as registerScanner,uc as requestRfqQuotes,UN as requireStrategyVenue,Yl as resolvePrepareMaxAgeMs,ts as resolveStrategyVenue,Cl as rollupProviderHealth,Es as rpcUrlFor,mA as scannerCoverage,Vl as scoreSignals,jN as shouldDeliverAlert,mb as simulateSell,Fh as sourceCandidates,O as stampPrepared,MN as strategyVenues,DN as subscribe,Sm as summarizeActionReceipt,vl as summarizePortfolioLedger,Ki as summarizePortfolioRisk,qT as transitionTradeLifecycle,FN as unsubscribe,Ab as validateGrant,xi as validateNftMintGasWar,Ff as validateScanner,HT as verifyTradeLifecycle};
74
+ `);let i=!1,s=Promise.resolve();function a(){let l=async()=>{let u=`${t}.tmp-${process.pid}`;await AO(u,Buffer.from(o.export()),{mode:384}),await cs(u,384),await vO(u,t),await cs(t,384)};return s=s.then(l,l),s}n?await cs(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=Bw(String(l.type)),d=String(l.id||"").trim();if(!d)throw new TypeError("artifact id required");let p=Re(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,ps(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()?us(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"):(Bw(String(l)),o.prepare("SELECT * FROM artifacts WHERE type=? ORDER BY created_at,id"));return l!==void 0&&u.bind([String(l)]),ls(u).map(us)},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=ls(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(!CO.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)]),ls(u).map(us)},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)]),ls(u).map(us)},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=Re(u);return o.run("INSERT INTO action_receipts(artifact_id,receipt_json) VALUES(?,?)",[String(l),ps(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 TO=qw;import{createHash as Hw}from"node:crypto";var NO=new Set(["accesstoken","refreshtoken","idtoken","token","apikey","clientsecret","password","auth","jwt","session","secret","key","code","signature","xamzsignature","privatekey","authorization","bearer","credential"]);function OO(e){return NO.has(String(e).replace(/[^a-z0-9]/gi,"").toLowerCase())}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 jw(e){return Hw("sha256").update(String(e)).digest("hex")}function Vw(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(OO(n))throw new TypeError("research source URL must not contain sensitive query parameters");return t.toString()}function zw(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 fs(e={}){let t=Vw(e.url??e.sourceUrl),n=zw(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(Re({url:t,fetchedAt:n,contentHash:r}))}function RO(e={}){let t=Vw(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=zw(e.fetchedAt),s=jw(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(fs),c=Re({sourceUrl:t,fetchedAt:i,contentHash:s,snapshot:n,claim:r,confidence:o,contradictions:(e.contradictions||[]).map(String),citations:a});return Object.freeze({id:`research:${Hw("sha256").update(ms(c)).digest("hex")}`,...c})}var $O=ms;function nu(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(fs):[];if(t==="agent_recommendation"&&n.length===0)throw new TypeError("agent_recommendation prepared actions require evidence citations");return Object.freeze(Re({...e,origin:t,citations:Object.freeze(n)}))}var LO=nu,MO=nu;export{At as ACTION_MODES,Dm as ACTION_RECEIPT_VERSION,jb as ALLOWED_SCOPES,ds as ARTIFACT_TYPES,Sn as ActionReceiptSecretError,LT as BUILD_SCOPE,Xn as CHAINS,st as CHAIN_CONFIGS,Xb as DEFAULT_RISK_THRESHOLDS,Vb as DEFAULT_SCOPES,Dw as DEFAULT_WORKSPACE_DIR,Fw as DEFAULT_WORKSPACE_PATH,B as EVIDENCE,$T as EXECUTE_SCOPE,Il as GRANT_VERSION,Vr as GrantValidationError,Si as NftGasWarLimitError,bs as PREPARE_HARD_MAX_AGE_MS,Yn as PREPARE_MAX_AGE_MS,ys as PREPARE_VERSION,Le as QUALITY,M as RISK,tn as SCANNER_CAPABILITIES,ue as SELL_SIM,$w as SIGNAL_TYPES,Zi as TRADE_STATES,Ml as TRADE_TRANSITIONS,Nw as WATCH_CATEGORIES,Tb as actionModeForVerb,ow as advanceTradeLifecycle,kT as assertActionRecord,Fk as assertCapability,HI as assertNftMintGasWar,Re as assertNoReceiptSecrets,ex as assertPreparedEnvelope,MO as assertRecommendationEvidence,bT as assertSellable,Bl as assertTradeLifecycle,cn as autonomousTradingEnabled,kP as bestBridgeRoute,uT as bestEquityRoute,SP as bestSwapRoute,qm as canonicalReceiptJson,$O as canonicalResearchJson,Pl as canonicalizeGrant,Ep as capabilityStatus,Jr as chainById,Ib as collectEquityQuotes,xs as computePrepareHash,Ss as computePrepareMac,Hm as computeReceiptId,jw as contentHash,mv as createActionReceipt,ST as createActionRecord,TO as createArtifactStore,zT as createHarnessConfigs,tN as createPortfolioLedger,LO as createPreparedAction,RO as createResearchArtifact,Du as createScanner,Mw as createSignalsEngine,lN as createTradeLifecycle,uO as createWatch,gP as data,S as dataCall,Ty as dataCatalog,Cy as dataHealth,Ow as defaultPreferences,Yb as emitHarnessConfigs,mT as equityToJsonSafe,dT as equityVenues,Rw as evaluateAlert,r0 as executeRfqCandidates,fv as formatActionReceipt,po as getProvider,Rs as getScanner,Hb as grantId,e0 as hashFirmQuote,Zh as hashRfqIntent,hN as healthRollup,ET as isActiveAlert,vT as isActiveExecution,As as isSupportedChain,ir as listProviders,$s as listScanners,AT as migrateLegacyWatchRecord,jm as normalizeActionReceipt,fs as normalizeCitation,wc as normalizeFirmQuote,_l as normalizeGrant,_i as normalizeRfqIntent,MT as normalizeScopes,qw as openArtifactStore,nN as portfolioLedger,XT as portfolioRiskSummary,qk as posture,nu as prepareAction,pT as prepareEquityRoute,fN as providerHealthRollup,o0 as rankRfqQuotes,rr as registerBuiltinScanners,mx as registerChain,Wu as registerCustomChain,P as registerProvider,lo as registerScanner,xc as requestRfqQuotes,sO as requireStrategyVenue,iu as resolvePrepareMaxAgeMs,rs as resolveStrategyVenue,Dl as rollupProviderHealth,vs as rpcUrlFor,Qx as scannerCoverage,eu as scoreSignals,pO as shouldDeliverAlert,Cb as simulateSell,n0 as sourceCandidates,O as stampPrepared,iO as strategyVenues,cO as subscribe,Vm as summarizeActionReceipt,$l as summarizePortfolioLedger,Xi as summarizePortfolioRisk,uN as transitionTradeLifecycle,lO as unsubscribe,qb as validateGrant,ki as validateNftMintGasWar,Bu as validateScanner,dN as verifyTradeLifecycle};