@oracle-agent/oracle 0.35.31 → 0.35.32

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.
Files changed (53) hide show
  1. package/README.md +19 -1
  2. package/dist/agent-lifecycle.mjs +3 -3
  3. package/dist/agent-sessions.mjs +7 -7
  4. package/dist/assets/skills/oracle-desk-product/SKILL.md +1 -1
  5. package/dist/bin/desk-server.mjs +37 -37
  6. package/dist/bin/oracle-data-mcp.mjs +17 -17
  7. package/dist/bin/oracle-gateway.mjs +16 -16
  8. package/dist/bin/oracle-investigate.mjs +11 -0
  9. package/dist/bin/oracle-launch-radar-shadow.mjs +6 -6
  10. package/dist/bin/oracle-mev-arb-shadow.mjs +6 -6
  11. package/dist/bin/oracle-mev-shadow.mjs +6 -6
  12. package/dist/bin/oracle-public-server.mjs +5 -5
  13. package/dist/bin/oracle-route.mjs +22 -22
  14. package/dist/bin/oracle-scan.mjs +15 -15
  15. package/dist/cli/commands/agent-session.mjs +7 -7
  16. package/dist/cli/commands/chat.mjs +197 -197
  17. package/dist/cli/commands/context.mjs +6 -6
  18. package/dist/cli/commands/doctor.mjs +9 -9
  19. package/dist/cli/commands/eval.mjs +50 -50
  20. package/dist/cli/commands/farm.mjs +22 -22
  21. package/dist/cli/commands/follow.mjs +16 -16
  22. package/dist/cli/commands/lifecycle.mjs +6 -6
  23. package/dist/cli/commands/model.mjs +201 -201
  24. package/dist/cli/commands/quickstart.mjs +7 -7
  25. package/dist/cli/commands/receipt.mjs +12 -12
  26. package/dist/cli/commands/resolve.mjs +12 -12
  27. package/dist/cli/commands/sign.mjs +15 -13
  28. package/dist/cli/commands/signer.mjs +19 -19
  29. package/dist/cli/commands/snipe.mjs +11 -11
  30. package/dist/cli/commands/strategy.mjs +5 -5
  31. package/dist/cli/commands/swap.mjs +31 -31
  32. package/dist/cli/commands/venues.mjs +2 -2
  33. package/dist/context-graph.mjs +3 -3
  34. package/dist/data/desk-data.mjs +35 -35
  35. package/dist/data/names.mjs +3 -3
  36. package/dist/data/providers/farming.mjs +2 -2
  37. package/dist/data/providers/lp-destination-discovery.mjs +4 -4
  38. package/dist/index.mjs +49 -49
  39. package/dist/investigator/index.mjs +2 -0
  40. package/dist/launch-radar/index.mjs +5 -5
  41. package/dist/local-signer/anvil-attestation-worker.mjs +1 -1
  42. package/dist/local-signer/index.mjs +3 -3
  43. package/dist/local-signer/runtime.mjs +19 -19
  44. package/dist/nft/universal-mint-router.mjs +4 -4
  45. package/dist/router/index.mjs +3 -3
  46. package/dist/router/prepare-bridge.mjs +2 -2
  47. package/dist/scanner/index.mjs +4 -4
  48. package/dist/strategy/index.mjs +3 -3
  49. package/dist/tui/standalone-client.mjs +33 -33
  50. package/package.json +3 -1
  51. package/public/eval-report.json +2 -2
  52. package/public/oracle-splash/index.html +2 -2
  53. package/server.json +2 -2
@@ -1,14 +1,14 @@
1
1
  #!/usr/bin/env node
2
- var ub=Object.defineProperty;var _=(e,t,n)=>()=>{if(n)throw n[0];try{return e&&(t=e(e=0)),t}catch(r){throw n=[r],r}};var z=(e,t)=>{for(var n in t)ub(e,n,{get:t[n],enumerable:!0})};import{homedir as Ds}from"node:os";import{join as Fs}from"node:path";function js(e,t,n=""){let r=process.env[e];if(r!=null&&String(r).trim()!=="")return r;let o=t?process.env[t]:void 0;return o!=null&&String(o).trim()!==""?o:n}function qo(e,t,n=!1){return String(js(e,t,n?"1":"")).trim()==="1"}var dl,lb,oR,Bo=_(()=>{dl=process.env.ORACLE_PUBLIC_DESKTOP==="1",lb=dl?process.env.ORACLE_CONFIG_DIR||Fs(Ds(),".config","oracle"):Fs(Ds(),".config","oracle"),oR=dl?lb:Fs(Ds(),".config","mad-desk")});function Fb(e){let t=String(e??"");return t.length<18?"[REDACTED]":`${t.slice(0,6)}\u2026${t.slice(-4)}`}function jb(e){return`\xABredacted:${String(e??"").slice(0,4)}\u2026\xBB`}function mn(e,t={}){if(e==null)return e;let n=typeof e=="string"?e:String(e);if(!n||!(t.force||Nb))return n;let r=t.fileRead?jb:Fb;n=n.replace(Lb,"[REDACTED_PRIVATE_KEY]"),n=n.replace(Pb,"[REDACTED_EVM_KEY]"),n=n.replace($b,o=>r(o));for(let o of Rb)o.lastIndex=0,n=n.replace(o,i=>r(i));return n=n.replace(qb,(o,i,s,a)=>/^(?:os\.(?:getenv|environ)|process\.env|\$ENV\{)/.test(a)?`${i}=${s||""}${a}${s||""}`:`${i}=${s||""}${r(a)}${s||""}`),n=n.replace(Bb,(o,i,s,a)=>o.replace(a,r(a))),n=n.replace(Ub,(o,i,s,a)=>`${i}${r(s)}${a}`),n}function Sl(e){let t;try{t=new URL(String(e))}catch{return{ok:!1,error:`not a valid URL: ${String(e).slice(0,120)}`}}(t.username||t.password)&&(t.username="",t.password="");let n=[...t.searchParams.keys()];for(let r of n){let o=String(r).replace(/[^a-z0-9]/gi,"").toLowerCase();Db.has(o)&&t.searchParams.set(r,"[REDACTED]")}return{ok:!0,url:t,href:t.toString()}}var Cb,Nb,Rb,Pb,Lb,$b,qb,Bb,Ub,Mb,Db,Vs=_(()=>{Cb=(process.env.ORACLE_REDACT_SECRETS??"true").toLowerCase(),Nb=["1","true","yes","on"].includes(Cb),Rb=[/sk-[A-Za-z0-9_-]{10,}/g,/sk_live_[A-Za-z0-9]{10,}/g,/sk_test_[A-Za-z0-9]{10,}/g,/ghp_[A-Za-z0-9]{10,}/g,/github_pat_[A-Za-z0-9_]{10,}/g,/gho_[A-Za-z0-9]{10,}/g,/ghs_[A-Za-z0-9]{10,}/g,/xox[baprs]-[A-Za-z0-9-]{10,}/g,/AIza[A-Za-z0-9_-]{30,}/g,/AKIA[A-Z0-9]{16}/g,/pplx-[A-Za-z0-9]{10,}/g,/hf_[A-Za-z0-9]{10,}/g,/xai-[A-Za-z0-9]{30,}/g,/gsk_[A-Za-z0-9]{10,}/g,/npm_[A-Za-z0-9]{10,}/g,/tvly-[A-Za-z0-9]{10,}/g,/Bearer\s+[A-Za-z0-9\-._~+/]+=*/gi],Pb=/\b0x[a-fA-F0-9]{64}\b/g,Lb=/-----BEGIN (?:RSA |EC |OPENSSH |ENCRYPTED )?PRIVATE KEY-----[\s\S]*?-----END (?:RSA |EC |OPENSSH |ENCRYPTED )?PRIVATE KEY-----/g,$b=/\beyJ[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\b/g,qb=/\b([A-Z][A-Z0-9_]{0,40}(?:API_?KEY|TOKEN|SECRET|PASSWORD|PASSWD|PRIVATE_?KEY|MNEMONIC|SEED|AUTH)[A-Z0-9_]{0,20})\s*=\s*(['"]?)(\S+)\2/g,Bb=/^(?:export\s+)?((?:api[_-]?key|token|secret|password|private[_-]?key|mnemonic|seed[_-]?phrase|authorization))\s*[:=]\s*(['"]?)([^\s&]+)\2/gim,Ub=/("(?:api[_-]?key|apiKey|access[_-]?token|refresh[_-]?token|client[_-]?secret|private[_-]?key|privateKey|secret|password|authorization|bearer|mnemonic|seedPhrase)"\s*:\s*")([^"]{6,})(")/gi,Mb=new Set(["access_token","refresh_token","id_token","token","api_key","apikey","client_secret","password","auth","jwt","session","secret","key","code","signature","x-amz-signature","private_key","authorization"]),Db=new Set([...Mb].map(e=>e.replace(/[^a-z0-9]/gi,"").toLowerCase()))});import hn from"node:net";import Vb from"node:dns";function Fo(e){let t=String(e).toLowerCase().split("%")[0];if((t.match(/::/g)||[]).length>1)return null;let n=l=>{if(!l)return[];let d=l.split(":"),f=d.at(-1);if(f?.includes(".")){let p=f.split(".").map(Number);if(p.length!==4||p.some(m=>!Number.isInteger(m)||m<0||m>255))return null;d.splice(d.length-1,1,(p[0]<<8|p[1]).toString(16),(p[2]<<8|p[3]).toString(16))}return d.some(p=>!/^[0-9a-f]{1,4}$/.test(p))?null:d.map(p=>Number.parseInt(p,16))},[r,o]=t.split("::"),i=n(r),s=n(o);if(!i||!s)return null;let a=t.includes("::"),c=8-i.length-s.length;if(!a&&c!==0||a&&c<1)return null;let u=[...i,...Array(Math.max(0,c)).fill(0),...s];return u.length!==8?null:Uint8Array.from(u.flatMap(l=>[l>>8,l&255]))}function Ws(e,t,n){let r=Math.floor(n/8),o=n%8;for(let s=0;s<r;s+=1)if(e[s]!==t[s])return!1;if(!o)return!0;let i=255<<8-o;return(e[r]&i)===(t[r]&i)}function Gs(e){if(hn.isIPv4(e)){let t=e.split(".").map(Number);return!(t[0]===0||t[0]===10||t[0]===127||t[0]>=224||t[0]===100&&t[1]>=64&&t[1]<=127||t[0]===169&&t[1]===254||t[0]===172&&t[1]>=16&&t[1]<=31||t[0]===192&&(t[1]===0||t[1]===2||t[1]===168)||t[0]===192&&t[1]===88&&t[2]===99||t[0]===198&&(t[1]===18||t[1]===19||t[1]===51)||t[0]===203&&t[1]===0&&t[2]===113)}if(hn.isIPv6(e)){let t=Fo(e);if(!t)return!1;let n=Fo("::ffff:0:0");return Ws(t,n,96)?Gs([...t.slice(12)].join(".")):Ws(t,Fo("2000::"),3)?![["2001::",23],["2001:db8::",32],["2001:10::",28],["2001:2::",48],["2002::",16],["3fff::",20]].some(([o,i])=>Ws(t,Fo(o),i)):!1}return!1}function Gb(e){let t;try{t=new URL(String(e))}catch{return{ok:!1,error:`not a valid URL: ${String(e).slice(0,120)}`}}if(t.protocol!=="http:"&&t.protocol!=="https:")return{ok:!1,error:`refused protocol ${t.protocol} (only http/https)`};let n=t.hostname.toLowerCase().replace(/^\[|\]$/g,"").replace(/\.+$/,"");if(Wb.has(n)||n.endsWith(".localhost")||n.endsWith(".internal"))return{ok:!1,error:`refused internal host ${n}`};let r=hn.isIP(n);return r!==0&&!Gs(n)?{ok:!1,error:`refused private address ${n}`}:{ok:!0,url:t,host:n,isLiteralIp:r!==0}}async function Ks(e,{lookupFn:t=Vb.promises.lookup}={}){let n=Gb(e);if(!n.ok)return n;if(n.isLiteralIp)return{ok:!0,url:n.url,addresses:[{address:n.host,family:hn.isIPv6(n.host)?6:4}]};let r;try{r=await t(n.host,{all:!0,verbatim:!0})}catch{return{ok:!1,error:`refused: ${n.host} did not resolve`}}return!Array.isArray(r)||r.length===0||r.some(o=>!Gs(o.address))?{ok:!1,error:`refused: ${n.host} resolves to a non-public address`}:{ok:!0,url:n.url,addresses:r}}async function Ys({requireUndici:e=!1,importUndici:t=()=>import("undici")}={}){let n,r;try{let d=await t();n=d.Agent,r=d.fetch}catch(d){if(e)throw new Error(`egress-guard: untrustedUrl pinning requires the undici package, which failed to load: ${d?.message||d}`);return null}if(typeof n!="function"||typeof r!="function"){if(e)throw new Error("egress-guard: untrustedUrl pinning requires undici's Agent and fetch exports, which were not found on the imported module");return null}let o=d=>String(d).toLowerCase().replace(/^\[|\]$/g,"").replace(/\.+$/,""),i=new Map,s=d=>(Array.isArray(d)?d:[d]).map(f=>typeof f=="string"?{address:f}:f).filter(f=>f&&f.address).map(f=>({address:f.address,family:f.family||(hn.isIPv6(f.address)?6:4)})),a=(d,f,p)=>{i.set(o(d),s(typeof f=="string"?[{address:f,family:p}]:f))},c=d=>{let f=o(d);if(hn.isIP(f))return[{address:f,family:hn.isIPv6(f)?6:4}];let p=i.get(f);if(!p||!p.length)throw new Error(`refused: unpinned host ${d} during pinned fetch`);return p},u=new n({connect:{lookup(d,f,p){let m;try{m=c(d)}catch(y){return p(y)}return f?.all?p(null,m):p(null,m[0].address,m[0].family)}}}),l=Kb((d,f={})=>r(d,{...f,dispatcher:u}),a);return{dispatcher:u,fetch:l,pin:a,resolve:c,async close(){try{await u.destroy()}catch{}}}}function Kb(e,t){if(typeof e!="function")throw new Error("markPinCapableFetch: fetchImpl must be a function");if(typeof t!="function")throw new Error("markPinCapableFetch: pin must be a function");return e[Xs]=Object.freeze({pin:t}),e}function Js(e){return typeof e=="function"&&typeof e[Xs]?.pin=="function"}function vl(e,t,n){if(!Js(e))throw new Error("pinFetchToAddresses: fetchImpl is not pin-capable");e[Xs].pin(t,n)}var Wb,Xs,xl=_(()=>{Wb=new Set(["localhost","metadata.google.internal","metadata.goog"]);Xs=Symbol.for("oracle.egressGuard.pinCapableFetch")});import{createHash as kl}from"node:crypto";function Zb(e){let t=String(e||"").toLowerCase();return Rl.includes(t)||/(^|-)(api[-_]?key|key|token|secret|auth|authorization|session|cookie|signature|access)(-|$)/.test(t)}function ew(e){let t={};for(let[n,r]of Object.entries(e||{}))Zb(n)||(t[n]=r);return t}function tw(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 nw(e,t){return new URL(String(e)).origin===new URL(String(t)).origin}function Tl(e){let t=String(e?.method||"");return t?!rw.test(t):!1}function iw(e,t){if(e==="GET"&&t==null)return!0;if(e!=="POST"||t==null)return!1;let n=t;if(typeof t=="string")try{n=JSON.parse(t)}catch{return!1}return Array.isArray(n)?n.length>0&&n.every(Tl):!n||typeof n!="object"?!1:n.jsonrpc&&n.method?Tl(n):typeof n.type=="string"&&ow.has(n.type)&&n.action==null&&n.signature==null&&n.nonce==null}function sw(e,t,n,r={},o=null){let i={};for(let[f,p]of Object.entries(n||{}))i[f.toLowerCase()]=p;let s=Object.keys(i).filter(f=>/(^|-)(api[-_]?key|key|token|secret|auth|authorization|session|cookie|signature|access)(-|$)/.test(f)),c=[...new Set([...Rl,...s])].sort().map(f=>`${f}=${i[f]??""}`).join(`
3
- `),u=kl("sha256").update(c).digest("hex").slice(0,32),l=`${r.untrustedUrl?"untrusted":"trusted"}:${r.maxResponseBytes??"unbounded"}`,d=o==null?"-":kl("sha256").update(String(o)).digest("hex").slice(0,32);return`${e} ${t} ${l} ${u} ${d}`}function aw(e,t){let n=Number(t);return Number.isFinite(n)&&n>0?Math.min(n*1e3,_l):Math.min(250*2**e,_l)+Math.floor(Math.random()*100)}function Tr(e,t={}){let n=new Error(e);return n.retryable=!1,Object.assign(n,t),n}function Zs(e,t,n){return Tr(`HTTP response from ${e} exceeded maxResponseBytes ${n} (${t})`,{oversize:!0})}function Cr(e){try{let t=e?.body?.cancel?.();t&&typeof t.then=="function"&&t.catch(()=>{})}catch{}}function uw(e){return e?e.byteLength??e.length??0:0}async function Cl(e,t,{url:n,truncate:r=!1,onOversize:o}={}){if(t==null)return await e.text();let i=Number(e.headers?.get?.("content-length"));if(Number.isFinite(i)&&i>t&&(Cr(e),!r))throw Zs(n,`content-length ${i}`,t);let s=e.body?.getReader?.();if(!s){let d=await e.text(),f=Buffer.byteLength(d,"utf8");if(f>t){if(!r)throw Zs(n,`body ${f} bytes`,t);return Buffer.from(d,"utf8").subarray(0,t).toString("utf8")}return d}let a=[],c=0,u=!1;try{for(;;){let{value:d,done:f}=await s.read();if(f)break;if(d&&(a.push(Buffer.from(d)),c+=uw(d),c>t)){u=!0;break}}}finally{if(u)try{await s.cancel()}catch{}try{s.releaseLock?.()}catch{}}if(u&&(typeof o=="function"&&o(),!r))throw Zs(n,`streamed ${c} bytes`,t);let l=Buffer.concat(a);return(u?l.subarray(0,t):l).toString("utf8")}function Nl(e){if(!e)return null;try{return JSON.parse(e)}catch{return null}}async function lw(e,{fetchImpl:t,method:n,headers:r,body:o,timeoutMs:i,lookupFn:s,realFetch:a,untrustedUrl:c=!1,maxResponseBytes:u=null,importUndici:l,validateResponse:d,signal:f}){let p=new AbortController,m=setTimeout(()=>p.abort(),i),y=f?typeof AbortSignal.any=="function"?AbortSignal.any([f,p.signal]):f:p.signal,h=null,w=t,v=s?{lookupFn:s}:{};if(c&&!a&&!Js(w))throw Tr(`HTTP refused ${e}: untrustedUrl requires a pin-capable fetchImpl (see markPinCapableFetch in egress-guard.mjs) or no fetchImpl override so Oracle can pin the connection itself`);let T=async(S,{status:k=null}={})=>{let x=await Ks(S,v);if(!x.ok)throw Tr(k==null?`HTTP refused ${S}: ${x.error}`:`HTTP redirect to ${S} ${x.error}`,k==null?{}:{status:k});let E=new URL(S).hostname;if(a){if(h&&(await h.close(),h=null),!h)try{h=await Ys({requireUndici:!0,...l?{importUndici:l}:{}})}catch(b){throw Tr(k==null?`HTTP refused ${S}: ${b?.message||b}`:`HTTP redirect to ${S} refused: ${b?.message||b}`,k==null?{}:{status:k})}h.pin(E,x.addresses),w=h.fetch}else vl(w,E,x.addresses);return x};try{let S=String(e),k={...r||{}};c&&await T(S);for(let x=0;x<=Ol;x+=1){let E=await w(S,{method:n,headers:k,body:o,signal:y,redirect:"manual"});if(Jb.has(E.status)){if(n!=="GET"&&n!=="HEAD"){let L=await Cl(E,u??Qb,{url:S,truncate:!0}),q=new Error(`HTTP ${E.status} ${n} ${S} redirected non-idempotent request`);throw q.status=E.status,q.body=Nl(L)??L.slice(0,300),q}if(x===Ol)throw Cr(E),new Error(`HTTP redirect loop for ${e}`);let A=E.headers?.get?.("location"),P;try{P=tw(A,S)}catch(L){throw Cr(E),L}let I=!nw(P,S);if(Cr(E),I&&(k=ew(k)),c)await T(P,{status:E.status});else if(I){let L=await Ks(P,v);if(!L.ok){let q=new Error(`HTTP redirect from ${S} ${L.error}`);throw q.status=E.status,q.retryable=!1,q}a&&L.addresses?.length&&(h||(h=await Ys(l?{importUndici:l}:{})),h&&(h.pin(new URL(P).hostname,L.addresses),w=h.fetch))}S=P;continue}if(typeof d=="function")try{await d(E,{url:S})}catch(A){throw Cr(E),Tr(A?.message||String(A))}let b=await Cl(E,u,{url:S,onOversize:()=>p.abort()}),g=Nl(b);if(!E.ok){let A=new Error(`HTTP ${E.status} ${n} ${S}`);throw A.status=E.status,A.retryAfter=E.headers?.get?.("retry-after")??null,A.body=g??b.slice(0,300),A}return g??b}throw new Error(`HTTP redirect loop for ${e}`)}finally{clearTimeout(m),h&&await h.close()}}async function C(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):Xb,c=t.lookupFn,u=!t.fetchImpl,l=t.untrustedUrl===!0,d=t.importUndici,f=t.validateResponse,p=t.signal,m=Number(t.maxResponseBytes),y=Number.isFinite(m)&&m>0?Math.floor(m):null,h=async()=>{let k;for(let x=0;x<=a;x++){p?.throwIfAborted?.();try{return await lw(e,{fetchImpl:n,method:o,headers:i,body:s,timeoutMs:r,lookupFn:c,realFetch:u,untrustedUrl:l,maxResponseBytes:y,importUndici:d,validateResponse:f,signal:p})}catch(E){k=E;let b=E?.status,g=E?.name==="AbortError"||E?.name==="TimeoutError"||p?.aborted,A=new Set([408,425,429]),P=E?.retryable===!1?!1:b!=null?A.has(b)||Yb.has(b)&&Il.has(o):!g&&Il.has(o);if(x===a||!P)throw E;let I=aw(x,E?.retryAfter);p?await new Promise((L,q)=>{let j=setTimeout(L,I);p.addEventListener("abort",()=>{clearTimeout(j),q(p.reason||new DOMException("Aborted","AbortError"))},{once:!0})}):await cw(I)}}throw k};if(!(t.dedupe!==!1&&!p&&iw(o,s)))return h();let v=sw(o,e,i,{untrustedUrl:l,maxResponseBytes:y},s),T=Qs.get(v);if(T)return T;let S=h().finally(()=>Qs.delete(v));return Qs.set(v,S),S}async function yn(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 Yb,Il,Xb,_l,Rl,Jb,Ol,Qb,Qs,rw,ow,cw,G=_(()=>{xl();Yb=new Set([408,425,429,500,502,503,504]),Il=new Set(["GET","HEAD","OPTIONS","PUT","DELETE"]),Xb=2,_l=4e3,Rl=["authorization","x-api-key","x-tensor-api-key","0x-api-key","api-key","cookie","proxy-authorization"],Jb=new Set([301,302,303,307,308]),Ol=3,Qb=64*1024;Qs=new Map,rw=/(?:^|_)(send|submit|broadcast|sign|requestAirdrop)(?=[A-Z_]|$)/i,ow=new Set(["allMids","l2Book","outcomeMeta","spotClearinghouseState","userFills","meta","metaAndAssetCtxs","perpDexs","candleSnapshot","fundingHistory","openOrders","frontendOpenOrders","clearinghouseState","spotMeta","validatorSummaries","delegatorSummary","delegations","delegatorRewards","delegatorHistory","maxBuilderFee"]);cw=e=>new Promise(t=>setTimeout(t,e))});var Ll={};z(Ll,{CHAINS:()=>jo,chainById:()=>ta,isSupportedChain:()=>Pl,registerChain:()=>dw,rpcUrlFor:()=>na});function ta(e){return ea.get(Number(e))||null}function dw({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 jo[e]=o,ea.set(o.chainId,o),o}function na(e,t=process.env){let n=ta(e);if(!n)return null;for(let r of n.rpcEnv){let o=(t[r]||"").trim();if(o)return o}return null}function Pl(e){return ea.has(Number(e))}var jo,ea,ra=_(()=>{jo={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}},ea=new Map(Object.values(jo).map(e=>[e.chainId,e]))});import{Interface as pw,getAddress as fw}from"ethers";function Rr(e,t){try{return fw(e).toLowerCase()}catch{throw new Error(`${t} must be a valid EVM address`)}}function hw(e,{rpcUrl:t,env:n=process.env}={}){if(t)return t;let r=na(e,n);return r||mw[Number(e)]||null}function gw(e){let t=String(e||""),n=t.toLowerCase();if(t!==t.trim()||!/^[a-zA-Z0-9_]+$/.test(t)||!yw.test(n))throw new Error(`evm-rpc: ${t} refused \u2014 @oracle-agent/oracle is prepare-only (read RPC only; no broadcast/sign)`);return n}function bw(e){let t=new Error(e?.message||JSON.stringify(e));return t.code=e?.code,t}function ww(e){if(e?.error)throw bw(e.error);return e?.result}function Ew(e,t,n){return`${e}
2
+ var Lv=Object.defineProperty;var T=(e,t,n)=>()=>{if(n)throw n[0];try{return e&&(t=e(e=0)),t}catch(r){throw n=[r],r}};var Q=(e,t)=>{for(var n in t)Lv(e,n,{get:t[n],enumerable:!0})};import{homedir as bl}from"node:os";import{join as wl}from"node:path";function El(e,t,n=""){let r=process.env[e];if(r!=null&&String(r).trim()!=="")return r;let o=t?process.env[t]:void 0;return o!=null&&String(o).trim()!==""?o:n}function js(e,t,n=!1){return String(El(e,t,n?"1":"")).trim()==="1"}var zf,$v,qM,Hs=T(()=>{zf=process.env.ORACLE_PUBLIC_DESKTOP==="1",$v=zf?process.env.ORACLE_CONFIG_DIR||wl(bl(),".config","oracle"):wl(bl(),".config","oracle"),qM=zf?$v:wl(bl(),".config","mad-desk")});function px(e){let t=String(e??"");return t.length<18?"[REDACTED]":`${t.slice(0,6)}\u2026${t.slice(-4)}`}function fx(e){return`\xABredacted:${String(e??"").slice(0,4)}\u2026\xBB`}function Hr(e,t={}){if(e==null)return e;let n=typeof e=="string"?e:String(e);if(!n||!(t.force||nx))return n;let r=t.fileRead?fx:px;n=n.replace(ix,"[REDACTED_PRIVATE_KEY]"),n=n.replace(ox,"[REDACTED_EVM_KEY]"),n=n.replace(sx,o=>r(o));for(let o of rx)o.lastIndex=0,n=n.replace(o,i=>r(i));return n=n.replace(ax,(o,i,s,a)=>/^(?:os\.(?:getenv|environ)|process\.env|\$ENV\{)/.test(a)?`${i}=${s||""}${a}${s||""}`:`${i}=${s||""}${r(a)}${s||""}`),n=n.replace(cx,(o,i,s,a)=>o.replace(a,r(a))),n=n.replace(lx,(o,i,s,a)=>`${i}${r(s)}${a}`),n}function em(e){let t;try{t=new URL(String(e))}catch{return{ok:!1,error:`not a valid URL: ${String(e).slice(0,120)}`}}(t.username||t.password)&&(t.username="",t.password="");let n=[...t.searchParams.keys()];for(let r of n){let o=String(r).replace(/[^a-z0-9]/gi,"").toLowerCase();dx.has(o)&&t.searchParams.set(r,"[REDACTED]")}return{ok:!0,url:t,href:t.toString()}}var tx,nx,rx,ox,ix,sx,ax,cx,lx,ux,dx,vl=T(()=>{tx=(process.env.ORACLE_REDACT_SECRETS??"true").toLowerCase(),nx=["1","true","yes","on"].includes(tx),rx=[/sk-[A-Za-z0-9_-]{10,}/g,/sk_live_[A-Za-z0-9]{10,}/g,/sk_test_[A-Za-z0-9]{10,}/g,/ghp_[A-Za-z0-9]{10,}/g,/github_pat_[A-Za-z0-9_]{10,}/g,/gho_[A-Za-z0-9]{10,}/g,/ghs_[A-Za-z0-9]{10,}/g,/xox[baprs]-[A-Za-z0-9-]{10,}/g,/AIza[A-Za-z0-9_-]{30,}/g,/AKIA[A-Z0-9]{16}/g,/pplx-[A-Za-z0-9]{10,}/g,/hf_[A-Za-z0-9]{10,}/g,/xai-[A-Za-z0-9]{30,}/g,/gsk_[A-Za-z0-9]{10,}/g,/npm_[A-Za-z0-9]{10,}/g,/tvly-[A-Za-z0-9]{10,}/g,/Bearer\s+[A-Za-z0-9\-._~+/]+=*/gi],ox=/\b0x[a-fA-F0-9]{64}\b/g,ix=/-----BEGIN (?:RSA |EC |OPENSSH |ENCRYPTED )?PRIVATE KEY-----[\s\S]*?-----END (?:RSA |EC |OPENSSH |ENCRYPTED )?PRIVATE KEY-----/g,sx=/\beyJ[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\b/g,ax=/\b([A-Z][A-Z0-9_]{0,40}(?:API_?KEY|TOKEN|SECRET|PASSWORD|PASSWD|PRIVATE_?KEY|MNEMONIC|SEED|AUTH)[A-Z0-9_]{0,20})\s*=\s*(['"]?)(\S+)\2/g,cx=/^(?:export\s+)?((?:api[_-]?key|token|secret|password|private[_-]?key|mnemonic|seed[_-]?phrase|authorization))\s*[:=]\s*(['"]?)([^\s&]+)\2/gim,lx=/("(?:api[_-]?key|apiKey|access[_-]?token|refresh[_-]?token|client[_-]?secret|private[_-]?key|privateKey|secret|password|authorization|bearer|mnemonic|seedPhrase)"\s*:\s*")([^"]{6,})(")/gi,ux=new Set(["access_token","refresh_token","id_token","token","api_key","apikey","client_secret","password","auth","jwt","session","secret","key","code","signature","x-amz-signature","private_key","authorization"]),dx=new Set([...ux].map(e=>e.replace(/[^a-z0-9]/gi,"").toLowerCase()))});import zr from"node:net";import yx from"node:dns";function Gs(e){let t=String(e).toLowerCase().split("%")[0];if((t.match(/::/g)||[]).length>1)return null;let n=u=>{if(!u)return[];let d=u.split(":"),p=d.at(-1);if(p?.includes(".")){let f=p.split(".").map(Number);if(f.length!==4||f.some(m=>!Number.isInteger(m)||m<0||m>255))return null;d.splice(d.length-1,1,(f[0]<<8|f[1]).toString(16),(f[2]<<8|f[3]).toString(16))}return d.some(f=>!/^[0-9a-f]{1,4}$/.test(f))?null:d.map(f=>Number.parseInt(f,16))},[r,o]=t.split("::"),i=n(r),s=n(o);if(!i||!s)return null;let a=t.includes("::"),c=8-i.length-s.length;if(!a&&c!==0||a&&c<1)return null;let l=[...i,...Array(Math.max(0,c)).fill(0),...s];return l.length!==8?null:Uint8Array.from(l.flatMap(u=>[u>>8,u&255]))}function xl(e,t,n){let r=Math.floor(n/8),o=n%8;for(let s=0;s<r;s+=1)if(e[s]!==t[s])return!1;if(!o)return!0;let i=255<<8-o;return(e[r]&i)===(t[r]&i)}function Il(e){if(zr.isIPv4(e)){let t=e.split(".").map(Number);return!(t[0]===0||t[0]===10||t[0]===127||t[0]>=224||t[0]===100&&t[1]>=64&&t[1]<=127||t[0]===169&&t[1]===254||t[0]===172&&t[1]>=16&&t[1]<=31||t[0]===192&&(t[1]===0||t[1]===2||t[1]===168)||t[0]===192&&t[1]===88&&t[2]===99||t[0]===198&&(t[1]===18||t[1]===19||t[1]===51)||t[0]===203&&t[1]===0&&t[2]===113)}if(zr.isIPv6(e)){let t=Gs(e);if(!t)return!1;let n=Gs("::ffff:0:0");return xl(t,n,96)?Il([...t.slice(12)].join(".")):xl(t,Gs("2000::"),3)?![["2001::",23],["2001:db8::",32],["2001:10::",28],["2001:2::",48],["2002::",16],["3fff::",20]].some(([o,i])=>xl(t,Gs(o),i)):!1}return!1}function bx(e){let t;try{t=new URL(String(e))}catch{return{ok:!1,error:`not a valid URL: ${String(e).slice(0,120)}`}}if(t.protocol!=="http:"&&t.protocol!=="https:")return{ok:!1,error:`refused protocol ${t.protocol} (only http/https)`};let n=t.hostname.toLowerCase().replace(/^\[|\]$/g,"").replace(/\.+$/,"");if(gx.has(n)||n.endsWith(".localhost")||n.endsWith(".internal"))return{ok:!1,error:`refused internal host ${n}`};let r=zr.isIP(n);return r!==0&&!Il(n)?{ok:!1,error:`refused private address ${n}`}:{ok:!0,url:t,host:n,isLiteralIp:r!==0}}async function kl(e,{lookupFn:t=yx.promises.lookup}={}){let n=bx(e);if(!n.ok)return n;if(n.isLiteralIp)return{ok:!0,url:n.url,addresses:[{address:n.host,family:zr.isIPv6(n.host)?6:4}]};let r;try{r=await t(n.host,{all:!0,verbatim:!0})}catch{return{ok:!1,error:`refused: ${n.host} did not resolve`}}return!Array.isArray(r)||r.length===0||r.some(o=>!Il(o.address))?{ok:!1,error:`refused: ${n.host} resolves to a non-public address`}:{ok:!0,url:n.url,addresses:r}}async function Ol({requireUndici:e=!1,importUndici:t=()=>import("undici")}={}){let n,r;try{let d=await t();n=d.Agent,r=d.fetch}catch(d){if(e)throw new Error(`egress-guard: untrustedUrl pinning requires the undici package, which failed to load: ${d?.message||d}`);return null}if(typeof n!="function"||typeof r!="function"){if(e)throw new Error("egress-guard: untrustedUrl pinning requires undici's Agent and fetch exports, which were not found on the imported module");return null}let o=d=>String(d).toLowerCase().replace(/^\[|\]$/g,"").replace(/\.+$/,""),i=new Map,s=d=>(Array.isArray(d)?d:[d]).map(p=>typeof p=="string"?{address:p}:p).filter(p=>p&&p.address).map(p=>({address:p.address,family:p.family||(zr.isIPv6(p.address)?6:4)})),a=(d,p,f)=>{i.set(o(d),s(typeof p=="string"?[{address:p,family:f}]:p))},c=d=>{let p=o(d);if(zr.isIP(p))return[{address:p,family:zr.isIPv6(p)?6:4}];let f=i.get(p);if(!f||!f.length)throw new Error(`refused: unpinned host ${d} during pinned fetch`);return f},l=new n({connect:{lookup(d,p,f){let m;try{m=c(d)}catch(h){return f(h)}return p?.all?f(null,m):f(null,m[0].address,m[0].family)}}}),u=wx((d,p={})=>r(d,{...p,dispatcher:l}),a);return{dispatcher:l,fetch:u,pin:a,resolve:c,async close(){try{await l.destroy()}catch{}}}}function wx(e,t){if(typeof e!="function")throw new Error("markPinCapableFetch: fetchImpl must be a function");if(typeof t!="function")throw new Error("markPinCapableFetch: pin must be a function");return e[_l]=Object.freeze({pin:t}),e}function Tl(e){return typeof e=="function"&&typeof e[_l]?.pin=="function"}function nm(e,t,n){if(!Tl(e))throw new Error("pinFetchToAddresses: fetchImpl is not pin-capable");e[_l].pin(t,n)}var gx,_l,rm=T(()=>{gx=new Set(["localhost","metadata.google.internal","metadata.goog"]);_l=Symbol.for("oracle.egressGuard.pinCapableFetch")});import{createHash as Ex}from"node:crypto";import{types as Fn}from"node:util";function Oe(e){return fr(`HTTP JSON body refused: ${e}`)}function Tx(e){return["isArgumentsObject","isArrayBuffer","isAnyArrayBuffer","isArrayBufferView","isBoxedPrimitive","isDataView","isDate","isExternal","isGeneratorObject","isKeyObject","isCryptoKey","isMap","isMapIterator","isModuleNamespaceObject","isNativeError","isPromise","isRegExp","isSet","isSetIterator","isTypedArray","isWeakMap","isWeakSet"].some(t=>typeof Fn[t]=="function"&&Fn[t](e))}function Nx(e){let t=[],n=0,r=0,o=0,i=0,s=new WeakSet,a=u=>{if(n+=Buffer.byteLength(u,"utf8"),n>Mn.bytes)throw Oe("serialized byte limit exceeded");t.push(u)},c=u=>{if(Buffer.byteLength(u,"utf8")>Mn.bytes)throw Oe("serialized byte limit exceeded");return JSON.stringify(u)},l=(u,d)=>{if(r+=1,r>Mn.nodes)throw Oe("node limit exceeded");if(d>Mn.depth)throw Oe("depth limit exceeded");if(u===null){a("null");return}if(typeof u=="string"){a(c(u));return}if(typeof u=="boolean"){a(u?"true":"false");return}if(typeof u=="number"){if(!Number.isFinite(u))throw Oe("non-finite number");a(Object.is(u,-0)?"0":String(u));return}if(typeof u!="object")throw Oe("unsupported non-JSON value");if(Fn.isProxy(u))throw Oe("proxy value");if(Tx(u))throw Oe("unsupported exotic object");if(s.has(u))throw Oe("cyclic value");s.add(u);try{if(Object.getOwnPropertySymbols(u).length>0)throw Oe("symbol-keyed fields are unsupported");if(Array.isArray(u)){let m=Object.getPrototypeOf(u),h=0;for(;m!==null;){if(Fn.isProxy(m))throw Oe("proxy array prototype");if(h+=1,h>Mn.depth)throw Oe("array prototype depth limit exceeded");m=Object.getPrototypeOf(m)}if(u.length>Mn.arrayLength)throw Oe("array length limit exceeded");for(let g=0;g<u.length;g+=1){let E=Object.getOwnPropertyDescriptor(u,String(g));if(!E||!Object.hasOwn(E,"value")||E.enumerable!==!0)throw Oe("array entries must be dense enumerable own data")}let y=0;for(let g in u){if(i+=1,i>Mn.fields)throw Oe("enumeration limit exceeded");if(Object.hasOwn(u,g)&&(y+=1,y>u.length))throw Oe("named array fields are unsupported")}if(y!==u.length)throw Oe("array entries must be dense enumerable own data");a("[");for(let g=0;g<u.length;g+=1)g&&a(","),l(Object.getOwnPropertyDescriptor(u,String(g)).value,d+1);a("]");return}let p=Object.getPrototypeOf(u);if(p!==Object.prototype&&p!==null)throw Oe("non-plain object");let f=[];for(let m in u){if(i+=1,i>Mn.fields)throw Oe("enumeration limit exceeded");if(!Object.hasOwn(u,m))continue;if(o+=1,o>Mn.fields)throw Oe("field limit exceeded");let h=Object.getOwnPropertyDescriptor(u,m);if(!h||!Object.hasOwn(h,"value")||h.enumerable!==!0)throw Oe("object fields must be enumerable own data");f.push([m,h.value])}a("{");for(let m=0;m<f.length;m+=1)m&&a(","),a(c(f[m][0])),a(":"),l(f[m][1],d+1);a("}")}finally{s.delete(u)}};return l(e,0),t.join("")}function Cx(e){let t=Object.create(null);if(e==null)return t;if(typeof e!="object"&&typeof e!="function")throw new TypeError("HTTP headers must be an object");if(Fn.isProxy(e))throw new TypeError("HTTP headers must not be a proxy");if(Object.getOwnPropertySymbols(e).length>0)throw new TypeError("HTTP headers must not contain symbol fields");let n=new Set;for(let r of Object.keys(e)){if(!/^[!#$%&'*+.^_`|~0-9A-Za-z-]+$/u.test(r))throw new TypeError("HTTP header names must be valid tokens");let o=r.toLowerCase();if(n.has(o))throw new TypeError("HTTP headers contain a duplicate canonical name");n.add(o);let i=Object.getOwnPropertyDescriptor(e,r);if(!i||!Object.hasOwn(i,"value"))throw new TypeError("HTTP headers must contain own data properties");let s=i.value;if(s==null||["object","function","symbol"].includes(typeof s))throw new TypeError("HTTP header values must be scalar");t[r]=String(s)}return t}function Rx(){return Object.assign(Object.create(null),{Accept:"application/json"})}function Px(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 Lx(e,t){return new URL(String(e)).origin===new URL(String(t)).origin}function Ks(e){if((typeof e!="object"||e===null)&&typeof e!="function")return`${typeof e}:${String(e)}`;let t=am.get(e);return t||(t=cm,cm+=1,am.set(e,t)),`reference:${t}`}function lm(e){if(!e||typeof e!="object"||Array.isArray(e)||!Object.hasOwn(e,"jsonrpc")||!Object.hasOwn(e,"method")||e.jsonrpc!=="2.0")return!1;let t=typeof e.method=="string"?e.method:"";return t?$x.has(t)||/^get[A-Z0-9_]/u.test(t)||/^is[A-Z0-9_]/u.test(t)||/^eth_get[A-Z0-9_]/u.test(t):!1}function um(e,t){if(e==="GET"&&t==null)return!0;if(e!=="POST"||t==null)return!1;let n=t;if(typeof t=="string")try{n=JSON.parse(t)}catch{return!1}if(Array.isArray(n))return n.length>0&&n.every(lm);if(!n||typeof n!="object")return!1;if(Object.hasOwn(n,"jsonrpc")||Object.hasOwn(n,"method"))return lm(n);let r=Object.hasOwn(n,"type")?n.type:null;return typeof r=="string"&&Dx.has(r)&&(!Object.hasOwn(n,"action")||n.action==null)&&(!Object.hasOwn(n,"signature")||n.signature==null)&&(!Object.hasOwn(n,"nonce")||n.nonce==null)}function Ux(e,t,n,r={},o=null){let i=Ex("sha256"),s=(c,l)=>{let u=String(l);i.update(String(Buffer.byteLength(c,"utf8"))).update(":").update(c),i.update("=").update(String(Buffer.byteLength(u,"utf8"))).update(":").update(u).update(`
3
+ `)};s("method",e),s("url",t),Object.keys(n||{}).map((c,l)=>({name:c.toLowerCase(),order:l,value:String(n[c])})).sort((c,l)=>c.name.localeCompare(l.name)||c.order-l.order).forEach((c,l)=>{s(`header-name-${l}`,c.name),s(`header-value-${l}`,c.value)}),s("body",o??"-");for(let c of["untrustedUrl","maxResponseBytes","sameOriginRedirectsOnly","redirectPolicy","maxRedirects","timeoutMs","retries","fetchImpl","realFetch","lookupFn","importUndici","validateResponse"])s(`context-${c}`,r[c]??"-");return i.digest("hex")}function Bx(e,t){let n=Number(t);return Number.isFinite(n)&&n>0?Math.min(n*1e3,im):Math.min(250*2**e,im)+Math.floor(Math.random()*100)}function fr(e,t={}){let n=new Error(e);return n.retryable=!1,Object.assign(n,t),n}function Cl(e,t,n){return fr(`HTTP response from ${e} exceeded maxResponseBytes ${n} (${t})`,{oversize:!0})}function Vr(e){try{let t=e?.body?.cancel?.();t&&typeof t.then=="function"&&t.catch(()=>{})}catch{}}function Mx(e){return e?e.byteLength??e.length??0:0}async function Fx(e,t,{url:n,truncate:r=!1,onOversize:o}={}){if(t==null)return await e.text();let i=Number(e.headers?.get?.("content-length"));if(Number.isFinite(i)&&i>t&&(Vr(e),!r))throw Cl(n,`content-length ${i}`,t);let s=e.body?.getReader?.();if(!s){let d=await e.text(),p=Buffer.byteLength(d,"utf8");if(p>t){if(!r)throw Cl(n,`body ${p} bytes`,t);return Buffer.from(d,"utf8").subarray(0,t).toString("utf8")}return d}let a=[],c=0,l=!1;try{for(;;){let{value:d,done:p}=await s.read();if(p)break;if(d&&(a.push(Buffer.from(d)),c+=Mx(d),c>t)){l=!0;break}}}finally{if(l)try{await s.cancel()}catch{}try{s.releaseLock?.()}catch{}}if(l&&(typeof o=="function"&&o(),!r))throw Cl(n,`streamed ${c} bytes`,t);let u=Buffer.concat(a);return(l?u.subarray(0,t):u).toString("utf8")}function jx(e){if(!e)return null;try{return JSON.parse(e)}catch{return null}}async function Hx(e,{fetchImpl:t,method:n,headers:r,body:o,timeoutMs:i,lookupFn:s,realFetch:a,untrustedUrl:c=!1,maxResponseBytes:l=null,sameOriginRedirectsOnly:u=!1,importUndici:d,validateResponse:p,signal:f,redirectPolicy:m="follow",maxRedirects:h=Ys}){let y=new AbortController,g=setTimeout(()=>y.abort(),i),E=f?sm?sm([f,y.signal]):f:y.signal,v=null,S=t,I=s?{lookupFn:s}:{};if(c&&!a&&!Tl(S))throw fr(`HTTP refused ${e}: untrustedUrl requires a pin-capable fetchImpl (see markPinCapableFetch in egress-guard.mjs) or no fetchImpl override so Oracle can pin the connection itself`);let k=async(A,{status:w=null}={})=>{let b=await kl(A,I);if(!b.ok)throw fr(w==null?`HTTP refused ${A}: ${b.error}`:`HTTP redirect to ${A} ${b.error}`,w==null?{}:{status:w});let x=new URL(A).hostname;if(a){if(v&&(await v.close(),v=null),!v)try{v=await Ol({requireUndici:!0,...d?{importUndici:d}:{}})}catch(C){throw fr(w==null?`HTTP refused ${A}: ${C?.message||C}`:`HTTP redirect to ${A} refused: ${C?.message||C}`,w==null?{}:{status:w})}v.pin(x,b.addresses),S=v.fetch}else nm(S,x,b.addresses);return b};try{let A=String(e),w=Object.assign(Object.create(null),r||{});c&&await k(A);for(let b=0;b<=h;b+=1){let x=Object.assign(Object.create(null),{method:n,headers:w,body:o,signal:E,redirect:"manual",dispatcher:void 0}),C=await S(A,x);if((m==="error"||h===0)&&C.status>=300&&C.status<400)throw Vr(C),fr(`HTTP ${C.status} ${n} redirect refused`,{status:C.status,redirectRefused:!0});if(_x.has(C.status)){let H=u===!0&&n==="POST"&&[307,308].includes(C.status)&&um(n,o);if(n!=="GET"&&n!=="HEAD"&&!H){Vr(C);let $=new Error(`HTTP ${C.status} ${n} ${A} redirected non-idempotent request`);throw $.status=C.status,$}if(b===h)throw Vr(C),fr(`HTTP ${C.status} ${n} redirect budget exhausted`,{status:C.status,redirectRefused:!0});let V=C.headers?.get?.("location"),D;try{D=Px(V,A)}catch($){throw Vr(C),$}let _=!Lx(D,A);if(Vr(C),_&&n==="POST"){let $=new Error(`HTTP ${C.status} ${n} cross-origin redirect refused`);throw $.status=C.status,$}if(_&&u){let $=new Error(`HTTP ${C.status} ${n} cross-origin redirect refused`);throw $.status=C.status,$.retryable=!1,$}if(_&&(w=Rx(w)),c)await k(D,{status:C.status});else if(_){let $=await kl(D,I);if(!$.ok){let q=new Error(`HTTP redirect from ${A} ${$.error}`);throw q.status=C.status,q.retryable=!1,q}a&&$.addresses?.length&&(v||(v=await Ol(d?{importUndici:d}:{})),v&&(v.pin(new URL(D).hostname,$.addresses),S=v.fetch))}A=D;continue}if(typeof p=="function")try{await p(C,{url:A})}catch(H){throw Vr(C),fr(H?.message||String(H))}let O=await Fx(C,l,{url:A,onOversize:()=>y.abort()}),F=jx(O);if(!C.ok){let H=new Error(`HTTP ${C.status} ${n} ${A}`);throw H.status=C.status,H.retryAfter=C.headers?.get?.("retry-after")??null,H.body=F??O.slice(0,300),H}return F??O}throw new Error(`HTTP redirect loop for ${e}`)}catch(A){if(y.signal.aborted&&!Rl(f)){let w=A&&(typeof A=="object"||typeof A=="function")&&!Fn.isProxy(A)?A:null,b=w?Object.getOwnPropertyDescriptor(w,"oversize"):null;if(!(b&&Object.hasOwn(b,"value")&&b.value===!0))try{if(!w)throw new TypeError("unsafe rejection");Object.defineProperties(w,{oracleTimeout:{value:!0,enumerable:!1},retryable:{value:!1,enumerable:!1}})}catch{let C=new Error("HTTP request timed out");throw Object.defineProperties(C,{oracleTimeout:{value:!0,enumerable:!1},retryable:{value:!1,enumerable:!1}}),C}}throw A}finally{clearTimeout(g),v&&await v.close()}}async function R(e,t={}){if(t!=null&&typeof t!="object"&&typeof t!="function")throw new TypeError("HTTP options must be an object");if(t!=null&&Fn.isProxy(t))throw new TypeError("HTTP options must not be a proxy");let n=new Set(["body","dedupe","fetchImpl","headers","importUndici","lookupFn","maxRedirects","maxResponseBytes","method","redirectPolicy","retries","sameOriginRedirectsOnly","signal","timeoutMs","untrustedUrl","validateResponse"]);if(t!=null){if(Object.getOwnPropertySymbols(t).length>0)throw new TypeError("HTTP options contain unknown fields");for(let q of Object.getOwnPropertyNames(t)){let M=Object.getOwnPropertyDescriptor(t,q);if(!(q==="toJSON"&&M&&Object.hasOwn(M,"value")&&M.value===void 0)){if(!n.has(q))throw new TypeError("HTTP options contain unknown fields");if(!M||!M.enumerable||!Object.hasOwn(M,"value"))throw new TypeError("HTTP options must contain enumerable own data properties")}}}let r=q=>{if(t==null||!Object.hasOwn(t,q))return;let M=Object.getOwnPropertyDescriptor(t,q);if(!M||!Object.hasOwn(M,"value"))throw new TypeError("HTTP options must contain own data properties");return M.value};if(typeof e!="string"||e.length===0||e.length>8192)throw new TypeError("HTTP URL must be a bounded string");let o=r("method");if(o!==void 0&&(typeof o!="string"||!/^[A-Za-z]+$/u.test(o)))throw new TypeError("HTTP method must be a string token");let i=r("timeoutMs");if(i!==void 0&&(!Number.isInteger(i)||i<1||i>12e4))throw new TypeError("HTTP timeoutMs must be a bounded integer");let s=r("retries");if(s!==void 0&&(!Number.isInteger(s)||s<0||s>10))throw new TypeError("HTTP retries must be a bounded integer");let a=r("redirectPolicy");if(a!==void 0&&a!=="follow"&&a!=="error")throw new TypeError('HTTP redirectPolicy must be "follow" or "error"');let c=r("maxRedirects");if(c!==void 0&&(!Number.isInteger(c)||c<0||c>Ys))throw new TypeError(`HTTP maxRedirects must be an integer from 0 through ${Ys}`);if(a==="error"&&c!==void 0&&c!==0)throw new TypeError('HTTP redirectPolicy "error" requires maxRedirects 0 when supplied');let l=a??"follow",u=l==="error"?0:c??Ys;for(let q of["dedupe","untrustedUrl","sameOriginRedirectsOnly"]){let M=r(q);if(M!==void 0&&typeof M!="boolean")throw new TypeError(`HTTP ${q} must be boolean`)}let d=r("maxResponseBytes");if(d!==void 0&&(!Number.isInteger(d)||d<1||d>64*1024*1024))throw new TypeError("HTTP maxResponseBytes must be a bounded integer");let p=r("signal");if(p!==void 0){if(Fn.isProxy(p)||!(p instanceof AbortSignal))throw new TypeError("HTTP signal must be a native AbortSignal");try{Rl(p)}catch{throw new TypeError("HTTP signal must be a native AbortSignal")}}for(let q of["importUndici","lookupFn","validateResponse"]){let M=r(q);if(M!==void 0&&typeof M!="function")throw new TypeError(`HTTP ${q} must be a function`)}let f=r("fetchImpl"),m=f||globalThis.fetch;if(typeof m!="function")throw new Error("fetch unavailable \u2014 pass opts.fetchImpl");let h=i??12e3,y=(o||"GET").toUpperCase(),g=r("headers"),E=Cx(g),v=Object.assign(Object.create(null),E);Object.keys(v).some(q=>q.toLowerCase()==="accept")||(v.Accept="application/json");let S=r("body");S!=null&&typeof S!="string"&&(Object.keys(v).find(M=>M.toLowerCase()==="content-type")||(v["Content-Type"]="application/json"),S=Nx(S));let I=s??Sx,k=r("lookupFn"),A=!f,w=r("untrustedUrl")===!0,b=r("sameOriginRedirectsOnly")===!0,x=r("importUndici"),C=r("validateResponse"),O=p,F=d??null,H=async()=>{let q;for(let M=0;M<=I;M++){O&&Ix.call(O);try{return await Hx(e,{fetchImpl:m,method:y,headers:v,body:S,timeoutMs:h,lookupFn:k,realFetch:A,untrustedUrl:w,maxResponseBytes:F,sameOriginRedirectsOnly:b,importUndici:x,validateResponse:C,signal:O,redirectPolicy:l,maxRedirects:u})}catch(ue){q=ue;let ne=K=>{if(!ue||typeof ue!="object"&&typeof ue!="function"||Fn.isProxy(ue))return;let ye=Object.getOwnPropertyDescriptor(ue,K);return ye&&Object.hasOwn(ye,"value")?ye.value:void 0},Pe=ne("status"),ze=ne("oracleTimeout")===!0||ne("name")==="AbortError"||ne("name")==="TimeoutError"||Rl(O),Fr=new Set([408,425,429]),Un=ne("retryable")===!1?!1:Pe!=null?Fr.has(Pe)||Ax.has(Pe)&&om.has(y):!ze&&om.has(y);if(M===I||!Un)throw ue;let j=Bx(M,ne("retryAfter"));O?await new Promise((K,ye)=>{let fe=setTimeout(K,j);kx.call(O,"abort",()=>{clearTimeout(fe),ye(Ox(O)||new DOMException("Aborted","AbortError"))},{once:!0})}):await qx(j)}}throw q};if(!(r("dedupe")!==!1&&!O&&um(y,S)))return H();let D=Ux(y,e,v,{untrustedUrl:w,maxResponseBytes:F,sameOriginRedirectsOnly:b,redirectPolicy:l,maxRedirects:u,timeoutMs:h,retries:I,fetchImpl:Ks(m),realFetch:A,lookupFn:Ks(k),importUndici:Ks(x),validateResponse:Ks(C)},S),_=Nl.get(D);if(_)return _;let $=H().finally(()=>Nl.delete(D));return Nl.set(D,$),$}async function Wr(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 Ax,om,Sx,im,vx,xx,Ix,kx,sm,Rl,Ox,_x,Ys,oF,Mn,Nl,am,cm,$x,Dx,qx,Y=T(()=>{rm();Ax=new Set([408,425,429,500,502,503,504]),om=new Set(["GET","HEAD","OPTIONS","PUT","DELETE"]),Sx=2,im=4e3,vx=Object.getOwnPropertyDescriptor(AbortSignal.prototype,"aborted")?.get,xx=Object.getOwnPropertyDescriptor(AbortSignal.prototype,"reason")?.get,Ix=AbortSignal.prototype.throwIfAborted,kx=EventTarget.prototype.addEventListener,sm=typeof AbortSignal.any=="function"?AbortSignal.any.bind(AbortSignal):null,Rl=e=>e?vx.call(e):!1,Ox=e=>e?xx.call(e):void 0,_x=new Set([301,302,303,307,308]),Ys=3,oF=64*1024,Mn=Object.freeze({depth:32,nodes:1e4,fields:1e4,arrayLength:1e4,bytes:1024*1024});Nl=new Map,am=new WeakMap,cm=1;$x=new Set(["eth_blockNumber","eth_call","eth_chainId","eth_estimateGas","getHealth","minimumLedgerSlot","net_version","simulateTransaction","web3_clientVersion"]),Dx=new Set(["allMids","l2Book","outcomeMeta","spotClearinghouseState","userFills","meta","metaAndAssetCtxs","perpDexs","candleSnapshot","fundingHistory","openOrders","frontendOpenOrders","clearinghouseState","spotMeta","validatorSummaries","delegatorSummary","delegations","delegatorRewards","delegatorHistory","maxBuilderFee"]);qx=e=>new Promise(t=>setTimeout(t,e))});var pm={};Q(pm,{CHAINS:()=>Js,chainById:()=>Ll,isSupportedChain:()=>dm,registerChain:()=>zx,rpcUrlFor:()=>$l});function Ll(e){return Pl.get(Number(e))||null}function zx({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 Js[e]=o,Pl.set(o.chainId,o),o}function $l(e,t=process.env){let n=Ll(e);if(!n)return null;for(let r of n.rpcEnv){let o=(t[r]||"").trim();if(o)return o}return null}function dm(e){return Pl.has(Number(e))}var Js,Pl,Dl=T(()=>{Js={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}},Pl=new Map(Object.values(Js).map(e=>[e.chainId,e]))});import{Interface as Vx,getAddress as Wx}from"ethers";function _i(e,t){try{return Wx(e).toLowerCase()}catch{throw new Error(`${t} must be a valid EVM address`)}}function Kx(e,{rpcUrl:t,env:n=process.env}={}){if(t)return t;let r=$l(e,n);return r||Gx[Number(e)]||null}function Jx(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}function Xx(e){let t=new Error(e?.message||JSON.stringify(e));return t.code=e?.code,t}function Qx(e){if(e?.error)throw Xx(e.error);return e?.result}function Zx(e,t,n){return`${e}
4
4
  ${t}
5
- ${JSON.stringify(n??[])}`}async function Sw(e,t,n){return C(e,{method:"POST",body:t,fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs??12e3,signal:n.signal})}async function te(e,t,n=[],r={}){let o=String(t||""),i=gw(o),s=hw(e,r);if(!s)throw new Error(`No RPC URL for chainId ${e} (set env from chain registry rpcEnv or pass rpcUrl)`);if(i==="eth_chainid"&&r.cacheChainId!==!1){let l=$l.get(s);if(l!=null)return l}let c=r.dedupe!==!1&&!r.signal?Ew(s,o,n):null;if(c&&Nr.has(c))return Nr.get(c);let u=(async()=>{let l=await Sw(s,{jsonrpc:"2.0",id:1,method:t,params:n},r),d=ww(l);return i==="eth_chainid"&&typeof d=="string"&&$l.set(s,d),d})();return c&&(Nr.set(c,u),u.finally(()=>{Nr.get(c)===u&&Nr.delete(c)}).catch(()=>{})),u}async function zo(e,t={}){let n=await te(e,"eth_blockNumber",[],t);return parseInt(n,16)}async function ql(e,t={}){let n=await te(e,"eth_gasPrice",[],t);if(n==null)return null;try{return BigInt(n)}catch{return null}}async function Bl(e,t,n={}){if(!t)throw new Error("rpcGetBalance requires address");let r=await te(e,"eth_getBalance",[t,"latest"],n);return{chainId:Number(e),address:t,balanceWei:BigInt(r).toString(),balanceHex:r}}async function Ul(e={},t={}){let n=Number(e.chainId??t.chainId??1),r=Rr(e.token||e.tokenAddress,"token"),o=Rr(e.owner,"owner"),i=Rr(e.spender,"spender"),s=Ho.encodeFunctionData("allowance",[o,i]),a=await te(n,"eth_call",[{to:r,data:s},e.blockTag||"latest"],t),c=Ho.decodeFunctionResult("allowance",a),u=BigInt(c[0]);return{chainId:n,token:r,owner:o,spender:i,allowance:u.toString(),allowanceHex:`0x${u.toString(16)}`,blockTag:e.blockTag||"latest"}}async function Ml(e={},t={}){let n=Number(e.chainId??t.chainId??1),r=Rr(e.token||e.tokenAddress,"token"),o=Rr(e.account||e.owner||e.address,"account"),i=Ho.encodeFunctionData("balanceOf",[o]),s=await te(n,"eth_call",[{to:r,data:i},e.blockTag||"latest"],t),a=Ho.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"}}var Ho,mw,yw,Nr,$l,it=_(()=>{G();ra();Ho=new pw(["function allowance(address owner,address spender) view returns (uint256)","function balanceOf(address account) view returns (uint256)"]);mw={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"};yw=/^(?:eth_(?:call|blocknumber|chainid|get[a-z0-9]+|feehistory|gasprice|maxpriorityfeepergas|syncing|protocolversion|estimategas|createaccesslist)|net_(?:version|listening|peercount)|web3_(?:clientversion|sha3))$/;Nr=new Map,$l=new Map});function Dl(e,t){let n=String(e||"").toLowerCase(),r=String(t?.quote||t?.quoteToken?.address||"").toLowerCase(),o=String(t?.base||t?.baseToken?.address||"").toLowerCase();return r===n?{address:t.base||t.baseToken?.address,symbol:t.baseToken?.symbol}:o===n?{address:t.quote||t.quoteToken?.address,symbol:t.quoteToken?.symbol}:{address:t.quote||t.quoteToken?.address,symbol:t.quoteToken?.symbol}}function Vo(e,t=[],{stables:n=[],wrappedNative:r=null}={}){let o=String(e||"").toLowerCase(),i=new Set((n||[]).map(c=>String(c).toLowerCase())),s=String(r||"").toLowerCase(),a=(t||[]).map((c,u)=>{let l=Dl(o,c),d=String(l.address||"").toLowerCase(),f=String(l.symbol||"").toLowerCase(),p=Number(c.liquidityUsd??c.liquidity?.usd),m=Number.isFinite(p)?p:0,y=String(c.dex||c.dexId||"").toLowerCase(),h=0;return i.has(d)||Aw.has(f)?h=300:s&&d===s&&(h=100),y.includes("v4")?h+=20:y.includes("v3")?h+=10:(y.includes("v2")||y.includes("raydium")||y.includes("orca")||y.includes("meteora"))&&(h+=8),{pool:c,score:h*1e12+m,index:u,otherAddr:d,liquidityUsd:m}});return a.sort((c,u)=>u.score-c.score||c.index-u.index),a.map(c=>c.pool)}function Fl(e,t=[]){let n=Array.isArray(t)?t:[];return n.length&&Dl(e,n[0]).address||null}var Aw,oa=_(()=>{Aw=new Set(["usdc","usdt","usdg","dai","usd1","usde","pyusd"])});function Iw(e,t,n){let r=st(t),o=st(n),i=st(e?.baseToken?.address),s=st(e?.quoteToken?.address);return i===r&&s===o||i===o&&s===r}function _w(e){let t=Number(e?.liquidity?.usd);return Number.isFinite(t)&&t>=0?t:null}function Ow(e={}){return(e.baseUrl||process.env.DEXSCREENER_API_URL||vw).replace(/\/$/,"")}async function Wo(e,t={}){if(!e)throw new Error("tokenAddress required");return C(`${Ow(t)}/latest/dex/tokens/${e}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3})}async function jl({chainId:e,tokenA:t,tokenB:n,dexIds:r=[]}={},o={}){return(await Pr({chainId:e,tokenA:t,tokenB:n,dexIds:r},o))[0]??null}async function Pr({chainId:e,tokenA:t,tokenB:n,dexIds:r=[]}={},o={}){if(e==null||!t||!n)throw new Error("chainId, tokenA, and tokenB required");let i=st(xw[Number(e)]||e),s=new Set(kw(r).filter(Boolean).map(st)),a=[...new Set([t,n].map(f=>String(f)).filter(Boolean))],c=await Promise.allSettled(a.map(f=>Wo(f,{...o,baseUrl:o.dexscreenerBaseUrl,timeoutMs:o.dexscreenerTimeoutMs??Math.min(Number(o.timeoutMs??4e3),4e3)}))),u=new Set,l=[];for(let f of c)if(f.status==="fulfilled")for(let p of f.value?.pairs||f.value?.data?.pairs||[]){let m=`${st(p?.chainId)}:${st(p?.dexId)}:${st(p?.pairAddress)}`;u.has(m)||(u.add(m),l.push(p))}return l.filter(f=>st(f?.chainId)===i).filter(f=>Iw(f,t,n)).filter(f=>!s.size||s.has(st(f?.dexId))).map(f=>({pairAddress:f.pairAddress??null,dexId:f.dexId??null,chainId:f.chainId??null,liquidityUsd:_w(f),pairCreatedAt:f.pairCreatedAt??null})).filter(f=>f.liquidityUsd!=null).sort((f,p)=>p.liquidityUsd-f.liquidityUsd)}async function Hl(e,{chainSlug:t="solana",stables:n=Tw}={},r={}){let o=await Wo(e,r),s=(o?.pairs||o?.data?.pairs||[]).filter(c=>String(c.chainId).toLowerCase()===String(t).toLowerCase()).map(c=>({pair:c.pairAddress,dex:c.dexId,dexId:c.dexId,base:c.baseToken?.address,quote:c.quoteToken?.address,baseToken:c.baseToken,quoteToken:c.quoteToken,liquidityUsd:c.liquidity?.usd??null,priceUsd:c.priceUsd??null,volume24hUsd:c.volume?.h24??null,createdAt:c.pairCreatedAt??null})),a=Vo(e,s,{stables:n});return{chain:t,token:e,pools:a,topPool:a[0]||null}}var vw,xw,st,kw,Tw,Lr=_(()=>{G();oa();vw="https://api.dexscreener.com",xw=Object.freeze({1:"ethereum",10:"optimism",56:"bsc",137:"polygon",8453:"base",42161:"arbitrum",43114:"avalanche",999:"hyperevm",4663:"robinhood"}),st=e=>String(e??"").toLowerCase(),kw=e=>Array.isArray(e)?e:e==null?[]:[e];Tw=["EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v","Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB"]});import{readFileSync as Cw}from"node:fs";import{homedir as Nw}from"node:os";import{join as Go}from"node:path";function Rw(){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=Nw();if(process.env.ORACLE_PUBLIC_DESKTOP==="1"){let n=(process.env.ORACLE_CONFIG_DIR||Go(t,".config","oracle")).trim();return[e,Go(n,"exec.env")].filter(Boolean)}return[e,Go(t,".config","oracle","exec.env"),Go(t,".config","mad-desk","exec.env")].filter(Boolean)}function zl(e,t,n){let r=e??process.env[t]??process.env[n];if(!String(r||"").trim())for(let o of Rw())try{let i=Cw(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 Vl=_(()=>{});var Wl=_(()=>{});import{createHash as Pw,createHmac as Kl,timingSafeEqual as Lw}from"node:crypto";function Ko(e){return Array.isArray(e)?`[${e.map(Ko).join(",")}]`:e&&typeof e=="object"?`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${Ko(e[t])}`).join(",")}}`:JSON.stringify(e??null)}function Yl(e,{required:t=!1}={}){try{return zl(e,"ORACLE_ROUTE_ATTESTATION_SECRET","MAD_ROUTE_ATTESTATION_SECRET")}catch(n){if(t)throw n;return null}}function sa(e){let{signature:t,...n}=e;return n}function Xl(e,{secret:t}={}){let n=Yl(t);return n?{...e,signature:Kl("sha256",n).update(Ko(sa(e))).digest("hex")}:e}function $w(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 Pw("sha256").update(Buffer.from(t.slice(2),"hex")).digest("hex")}function We(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");let i=Yl(o);if(i){let p=Kl("sha256",i).update(Ko(sa(e))).digest("hex");if(!qw(e.signature,p))throw new Error("auto-slippage guard signature mismatch \u2014 refusing to bind a guard this Oracle did not issue")}let s=Number(e.selectedBps),a=Number(e.capBps);if(!Number.isInteger(s)||s<0||s>Lt||!Number.isInteger(a)||a<0||a>Lt||s>a)throw new Error("auto-slippage guard bounds are invalid");let c=BigInt(e.quoteAmountOut??0),u=BigInt(e.minAmountOut??0);if(c<=0n||u<=0n)throw new Error("auto-slippage guard amounts must be positive");let l=c*BigInt(1e4-s),d=l/10000n;if(l%10000n!==0n&&(d+=1n),u<d)throw new Error("auto-slippage guard is under-protected relative to its quote");let f=Uw(r);if(f!=null&&f!==u)throw new Error(`auto-slippage: calldata encodes floor ${f}, not the guard floor ${u} \u2014 refusing to bind`);return Xl({...sa(e),calldataHash:$w(r)},{secret:o})}function qw(e,t){let n=Buffer.from(String(e??""),"utf8"),r=Buffer.from(String(t??""),"utf8");return n.length!==r.length||n.length===0?!1:Lw(n,r)}function ia(e,t=0){let n=Number(e);return Number.isFinite(n)?n:t}function Bw(e){let t=e==null?Lt: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,Lt)}function $t({liquidityUsd:e,priceChange5m:t=0,quoteAgeMs:n=0,crossChain:r=!1,requestedCapBps:o}={}){let i=ia(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(ia(t,0))*2),c=Math.min(40,Math.floor(Math.max(0,ia(n,0))/5e3)*5),u=Math.max(25,Math.ceil(20+s+a+c)),l=Bw(o);return{mode:"auto",requiredBps:u,selectedBps:Math.min(u,l),capBps:l,executable:u<=l}}function aa({chainId:e,venue:t,quoteAmountOut:n,liquidityUsd:r,priceChange5m:o=0,quoteAgeMs:i=0,crossChain:s=!1,requestedCapBps:a,quotedAtMs:c=Date.now(),ttlMs:u=Gl,secret:l}={}){let d=BigInt(n??0);if(d<=0n)throw new Error("auto-slippage guard requires positive quoteAmountOut");let f=$t({liquidityUsd:r,priceChange5m:o,quoteAgeMs:i,crossChain:s,requestedCapBps:a});if(!f.executable)throw new Error(`auto-slippage requires ${f.requiredBps} bps above hard/requested cap ${f.capBps}; route blocked`);let p=Number(c);if(!Number.isFinite(p))throw new Error("auto-slippage: quotedAtMs must be a finite number");let m=Math.min(3e4,Math.max(1e3,Number(u)||Gl)),y=d*BigInt(1e4-f.selectedBps),h=y/10000n;if(y%10000n!==0n&&(h+=1n),h>d&&(h=d),d>0n&&h<=0n)throw new Error(`auto-slippage: quote ${d} is too small to express a ${f.selectedBps} bps floor without rounding to zero`);let w=Number((d-h)*10000n/(d===0n?1n:d));if(w>f.capBps)throw new Error(`auto-slippage: realised floor implies ${w} bps, above cap ${f.capBps} \u2014 refusing to issue a guard weaker than advertised`);return Xl({mode:"auto",chainId:Number(e),venue:String(t||"unknown"),quoteAmountOut:d.toString(),minAmountOut:h.toString(),requiredBps:f.requiredBps,selectedBps:f.selectedBps,capBps:f.capBps,quotedAtMs:p,expiresAtMs:p+m},{secret:l})}function Uw(e){let t=String(e||"");if(!/^0x[0-9a-fA-F]+$/.test(t)||t.length<10||t.length%2!==0)return null;let n=t.slice(0,10).toLowerCase(),r=[];for(let i=10;i+64<=t.length;i+=64)r.push(t.slice(i,i+64));let o=i=>r[i]==null?null:BigInt("0x"+r[i]);switch(n){case"0x414bf389":return o(6);case"0x04e45aaf":return o(5);case"0xc04b8d59":{let i=o(0);if(i==null)return null;let s=Number(i)/32;return!Number.isInteger(s)||s<0?null:o(s+4)}case"0xb858183f":{let i=o(0);if(i==null)return null;let s=Number(i)/32;return!Number.isInteger(s)||s<0?null:o(s+3)}case"0xa026383e":return o(6);case"0x38ed1739":case"0x5c11d795":return o(1);case"0x7ff36ab5":case"0xb6f9de95":return o(0);case"0x18cbafe5":case"0x791ac947":return o(1);default:return null}}function ge(e,{chainId:t,venue:n,amountOut:r,liquidityUsd:o,priceChange5m:i,crossChain:s,requestedCapBps:a,quotedAtMs:c=Date.now(),ttlMs:u}={}){let l=aa({chainId:t,venue:n,quoteAmountOut:r,liquidityUsd:o,priceChange5m:i,crossChain:s,requestedCapBps:a,quotedAtMs:c,ttlMs:u});return{...e,autoSlippage:l,amountOutMinimum:l.minAmountOut}}var Lt,Gl,at=_(()=>{Vl();Wl();Lt=100,Gl=2e4});import{createHash as Mw,createHmac as Dw,timingSafeEqual as jR}from"node:crypto";function ca(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(ca).join(",")}]`:`{${Object.keys(e).sort().map(n=>`${JSON.stringify(n)}:${ca(e[n])}`).join(",")}}`}function Jl(e){let t=String(e?.ORACLE_STAMP_HMAC_SECRET||"").trim();return t.length>=16?t:""}function Zl(e=process.env){return Jl(process.env)||Jl(e)}function Hw(e){let{prepareHash:t,prepareMac:n,note:r,...o}=e||{};return o}function zw(e){let t=Hw(e);return Mw("sha256").update(ca(t)).digest("hex")}function Vw(e,t=Zl()){return t?Dw("sha256",t).update(String(e)).digest("hex"):""}function ne(e,{provider:t,kind:n,env:r=process.env,nowMs:o=Date.now(),expiresAtMs:i}={}){if(!e||typeof e!="object")throw new Error("stampPrepared: payload object required");let s=Object.prototype.hasOwnProperty.call(e,"oraclePrepared");if(s&&typeof e.oraclePrepared!="boolean")throw new Error("stampPrepared: oraclePrepared must be boolean");let a={...e,provider:e.provider||t,kind:e.kind||n,requiresUserSignature:e.requiresUserSignature!==!1,signingReady:!1,broadcastReady:!1,executionReady:!1,oraclePrepared:s?e.oraclePrepared:!0};if(!a.provider)throw new Error("stampPrepared: provider required");if(!a.kind)throw new Error("stampPrepared: kind required");let c=Number(o),u=i==null?c+Ql:Number(i),l=u-c;if(!Number.isSafeInteger(c)||!Number.isSafeInteger(u)||l<=0||l>jw)throw new Error("stampPrepared: bounded preparedAt/expiresAt required");let f={...a,preparedAt:c,expiresAt:u,prepareVersion:Fw},p=zw(f),m=Zl(r),y=m?Vw(p,m):void 0,h={...f,prepareHash:p};return y&&(h.prepareMac=y),h}var Fw,Ql,jw,xe=_(()=>{Fw=2,Ql=300*1e3,jw=(()=>{let e=Number(process.env.ORACLE_PREPARE_HARD_MAX_AGE_MS);return Number.isFinite(e)&&e>0?e:1800*1e3})()});var cd={};z(cd,{PANCAKE_FEE_TIERS:()=>Yo,UNI_V3_CHAINS:()=>ke,UNI_V3_FEE_TIERS:()=>rd,UNI_V3_VENUES:()=>sd,uniV3Chains:()=>Qw,uniV3EthUsdc:()=>ad,uniV3Health:()=>Jw,uniV3PrepareExactIn:()=>Xw,uniV3QuoteExactIn:()=>gn,uniV3QuoteExactInPath:()=>Yw});import{Interface as td,getAddress as $r,isAddress as nd}from"ethers";function la(e,t){let n=Number(e),r=ke[n];if(!r)throw new Error(`uniswap-v3: unsupported chainId ${e} (supported: ${Object.keys(ke).join(", ")})`);let o=sd[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 ua(e,t){let n=ke[Number(t)];if(!e||e===od||e===id||/^eth$/i.test(String(e)))return $r(n.weth);let r=String(e);if(/^weth$/i.test(r))return $r(n.weth);if(/^usdc$/i.test(r))return $r(n.usdc);if(!nd(r))throw new Error(`invalid token address: ${e}`);return $r(r)}function Gw(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 Kw(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 gn(e={},t={}){let{chainId:n,quoter:r,router:o,feeTiers:i}=la(e.chainId??8453,e.venue),s=ua(e.tokenIn||"WETH",n),a=ua(e.tokenOut||ke[n].usdc,n),c=BigInt(e.amountIn??0);if(c<=0n)throw new Error("amountIn required (raw base units)");let u=i&&i.length?i:rd,l=e.fee!=null?[Number(e.fee)]:e.tryFees===!1?[u[Math.min(2,u.length-1)]]:[...u],f=await Promise.all(l.map(async E=>{let b=Xo.encodeFunctionData("quoteExactInputSingle",[{tokenIn:s,tokenOut:a,amountIn:c,fee:E,sqrtPriceLimitX96:0n}]);try{let g=await te(n,"eth_call",[{to:r,data:b},"latest"],t);if(!g||g==="0x")return{fee:E,ok:!1,error:"empty result"};let A=Xo.decodeFunctionResult("quoteExactInputSingle",g);return{fee:E,ok:!0,amountOut:A[0].toString(),sqrtPriceX96After:A[1].toString(),initializedTicksCrossed:Number(A[2]),gasEstimate:A[3].toString()}}catch(g){return{fee:E,ok:!1,error:String(g.message||g).slice(0,160)}}})),p=null;for(let E of f)E.ok&&(!p||BigInt(E.amountOut)>BigInt(p.amountOut))&&(p=E);if(!p){let E=f.map(b=>`${b.fee}:${b.error||"fail"}`).join("; ");throw new Error(`uniswap-v3 quote failed chain=${n}: ${E}`)}let m=e.liquidityUsd==null?await Pr({chainId:n,tokenA:s,tokenB:a,dexIds:Gw(e.venue)},t).catch(()=>[]):[],y={};await Promise.all(m.slice(0,8).map(async E=>{if(!(!E.pairAddress||!nd(E.pairAddress)))try{let b=await te(n,"eth_call",[{to:E.pairAddress,data:Ww},"latest"],t),g=b&&b!=="0x"&&b.length<=66?Number.parseInt(b,16):NaN;if(!Number.isFinite(g)||g<=0||g>1e6)return;let A=y[g];(A==null||E.liquidityUsd>A.liquidityUsd)&&(y[g]=E)}catch{}}));let h=e.liquidityBandBps==null?50:Number(e.liquidityBandBps),w=null;if(e.fee==null&&h>0&&BigInt(p.amountOut)>0n){let E=BigInt(p.amountOut),g=f.filter(A=>A.ok&&Number((E-BigInt(A.amountOut))*10000n/E)<=h).filter(A=>y[A.fee]?.liquidityUsd!=null).sort((A,P)=>y[P.fee].liquidityUsd-y[A.fee].liquidityUsd)[0];g&&g.fee!==p.fee&&(w={priceBestFee:p.fee,chosenFee:g.fee,chosenPoolUsd:y[g.fee].liquidityUsd,bandBps:h},p=g)}let v=y[p.fee]??null,T=m[0]??null,S=v??T,k=e.liquidityUsd??v?.liquidityUsd??T?.liquidityUsd??null,x=e.liquidityUsd!=null?"caller":v?"pool":T?"pair":null;return ge({venue:"uniswap-v3",chainId:n,chain:ke[n].name,quoter:r,tokenIn:s,tokenOut:a,amountIn:c.toString(),fee:p.fee,amountOut:p.amountOut,gasEstimate:p.gasEstimate,liquidityUsd:k,liquiditySource:S,liquidityAttribution:x,liquidityPick:w,sqrtPriceX96After:p.sqrtPriceX96After,initializedTicksCrossed:p.initializedTicksCrossed,triedFees:f,best:!0},{chainId:n,venue:o,amountOut:p.amountOut,liquidityUsd:k,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps})}async function Yw(e={},t={}){let{chainId:n,quoter:r,router:o}=la(e.chainId??8453),i=(e.tokens||[]).map(f=>ua(f,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=Kw(i,s),u=Xo.encodeFunctionData("quoteExactInput",[c,a]),l=await te(n,"eth_call",[{to:r,data:u},"latest"],t),d=Xo.decodeFunctionResult("quoteExactInput",l);return ge({venue:"uniswap-v3",chainId:n,chain:ke[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 ad(e={},t={}){let n=Number(e.chainId??8453),r=e.amountIn??"1000000000000000",o=await gn({chainId:n,tokenIn:ke[n].weth,tokenOut:ke[n].usdc,amountIn:r,fee:e.fee},t),i=Number(o.amountOut)/1e6;return{...o,amountOutUsdc:i,pair:"WETH/USDC"}}async function Xw(e={},t={}){let n=Number(e.chainId??8453),r=la(n,e.venue),o=$r(e.recipient),i=String(e.tokenIn||"WETH"),s=!e.tokenIn||i===od||i===id||/^eth$/i.test(i),a=await gn(e,t),c=ed.encodeFunctionData("exactInputSingle",[{tokenIn:a.tokenIn,tokenOut:a.tokenOut,fee:a.fee,recipient:o,amountIn:BigInt(a.amountIn),amountOutMinimum:BigInt(a.amountOutMinimum),sqrtPriceLimitX96:0n}]),u=Math.min(600,Math.max(30,Number(e.deadlineSeconds??300))),d=Number(t.nowSeconds??Math.floor(Date.now()/1e3))+u,f=ed.encodeFunctionData("multicall",[d,[c]]);return ne({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:f,value:s?a.amountIn:"0",slippageGuard:We(a.autoSlippage,{chainId:n,venue:r.router,data:f})}},{provider:"uniswap-v3",kind:"univ3-swap-tx"})}async function Jw(e={}){let t=Number(e.chainId??8453);try{let n=await ad({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 Qw(){return Object.entries(ke).map(([e,t])=>({chainId:Number(e),name:t.name,quoter:t.quoter,weth:t.weth,usdc:t.usdc}))}var ke,rd,Ww,Xo,ed,od,id,Yo,sd,qr=_(()=>{it();Lr();at();xe();ke={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"}},rd=[100,500,3e3,1e4],Ww="0xddca3f43",Xo=new td(["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)"]),ed=new td(["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)"]),od="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",id="0x0000000000000000000000000000000000000000",Yo=[100,500,2500,1e4],sd={56:{pancakeswap:{name:"pancakeswap",quoter:"0xB048Bbc1Ee6b733FFfCFb9e9CeF7375518e25997",router:"0x13f4EA83D0bd40E75C8222255bc855a974568Dd4",feeTiers:Yo}},8453:{pancakeswap:{name:"pancakeswap",quoter:"0xB048Bbc1Ee6b733FFfCFb9e9CeF7375518e25997",router:"0x13f4EA83D0bd40E75C8222255bc855a974568Dd4",feeTiers:Yo}},42161:{pancakeswap:{name:"pancakeswap",quoter:"0xB048Bbc1Ee6b733FFfCFb9e9CeF7375518e25997",router:"0x13f4EA83D0bd40E75C8222255bc855a974568Dd4",feeTiers:Yo}},999:{hyperswap:{name:"hyperswap",quoter:"0x03A918028f22D9E1473B7959C927AD7425A45C7C",router:"0x4E2960a8cd19B467b82d26D83fAcb0fAE26b094D"}}}});var pd={};z(pd,{UNI_V4_CHAINS:()=>Ge,UNI_V4_FEE_TIERS:()=>fa,computeV4PoolId:()=>Zo,decodeV4HookPermissions:()=>ha,uniV4Chains:()=>dE,uniV4Health:()=>pE,uniV4InspectHook:()=>cE,uniV4PrepareExactIn:()=>lE,uniV4QuoteExactIn:()=>ei,uniV4QuoteExactOut:()=>uE});import{AbiCoder as Zw,Interface as da,getAddress as Me,isAddress as pa,keccak256 as ld}from"ethers";function ha(e){let t=bn(e),n=Number(BigInt(t)&tE),r=Object.fromEntries(ud.map(([s,a])=>[a,!!(n&1<<s)])),i=[["beforeSwapReturnsDelta","beforeSwap"],["afterSwapReturnsDelta","afterSwap"],["afterAddLiquidityReturnsDelta","afterAddLiquidity"],["afterRemoveLiquidityReturnsDelta","afterRemoveLiquidity"]].filter(([s,a])=>r[s]&&!r[a]).map(([s,a])=>`${s} requires ${a}`);return Object.freeze({address:t,mask:n,maskHex:`0x${n.toString(16).padStart(4,"0")}`,flags:Object.freeze(r),enabled:Object.freeze(ud.filter(([,s])=>r[s]).map(([,s])=>s)),valid:i.length===0,violations:Object.freeze(i)})}function Br(e){let t=Number(e),n=Ge[t];if(!n)throw new Error(`uniswap-v4: unsupported chainId ${e} (supported: ${Object.keys(Ge).join(", ")})`);return{chainId:t,...n}}function bn(e){if(e==null||e==="")return Ie;let t=String(e);if(!pa(t))throw new Error(`invalid Uniswap V4 hook address: ${e}`);return Me(t)}function Mn(e,t){let n=Ge[Number(t)];if(Un(e))return Me(Ie);let r=String(e);if(/^weth$/i.test(r))return Me(n.weth);if(/^usdc$/i.test(r)||/^usdg$/i.test(r))return Me(n.usdc);if(!pa(r))throw new Error(`invalid token address: ${e}`);return Me(r)}function Un(e){let t=String(e||"").trim().toLowerCase();return!t||t===iE.toLowerCase()||t===Ie.toLowerCase()||t==="eth"}function Zo({currency0:e,currency1:t,fee:n,tickSpacing:r,hooks:o=Ie}){let i=Me(e),s=Me(t);if(i.toLowerCase()===s.toLowerCase())throw new Error("poolKey currencies must differ");let[a,c]=i.toLowerCase()<s.toLowerCase()?[i,s]:[s,i],u=bn(o);return ld(Bn.encode(["address","address","uint24","int24","address"],[a,c,Number(n),Number(r),u]))}function ya({tokenIn:e,tokenOut:t,fee:n,tickSpacing:r,hooks:o=Ie}){let i=Me(e),s=Me(t),[a,c]=i.toLowerCase()<s.toLowerCase()?[i,s]:[s,i],u=i.toLowerCase()===a.toLowerCase();return{poolKey:{currency0:a,currency1:c,fee:Number(n),tickSpacing:Number(r),hooks:bn(o)},zeroForOne:u}}function sE({poolKey:e,poolId:t,tokenIn:n,tokenOut:r,fee:o,tickSpacing:i,hooks:s}){if(!e||typeof e!="object"||Array.isArray(e))throw new Error("uniswap-v4 exact poolKey must be an object");let a=Me(e.currency0),c=Me(e.currency1);if(a.toLowerCase()>=c.toLowerCase())throw new Error("uniswap-v4 exact poolKey requires canonical currency ordering");let u=Number(e.fee),l=Number(e.tickSpacing);if(!Number.isInteger(u)||u<0||u>16777215)throw new Error("uniswap-v4 exact poolKey requires uint24 fee");if(!Number.isInteger(l)||l<-8388608||l>8388607)throw new Error("uniswap-v4 exact poolKey requires int24 tickSpacing");let d=bn(e.hooks),f={currency0:a,currency1:c,fee:u,tickSpacing:l,hooks:d},p=Me(n),m=Me(r);if(p.toLowerCase()===m.toLowerCase())throw new Error("tokenIn and tokenOut must differ");let y=new Set([a.toLowerCase(),c.toLowerCase()]);if(!y.has(p.toLowerCase())||!y.has(m.toLowerCase()))throw new Error("uniswap-v4 exact poolKey currencies do not match tokenIn/tokenOut");if(o!=null&&Number(o)!==u)throw new Error("uniswap-v4 exact poolKey fee conflicts with top-level fee");if(i!=null&&Number(i)!==l)throw new Error("uniswap-v4 exact poolKey tickSpacing conflicts with top-level tickSpacing");if(s!=null&&bn(s).toLowerCase()!==d.toLowerCase())throw new Error("uniswap-v4 exact poolKey hooks conflict with top-level hooks");let h=ld(Bn.encode(["address","address","uint24","int24","address"],[a,c,u,l,d]));if(t!=null){if(!/^0x[0-9a-f]{64}$/i.test(String(t)))throw new Error("uniswap-v4 exact poolId must be bytes32");if(String(t).toLowerCase()!==h.toLowerCase())throw new Error(`uniswap-v4 exact poolId mismatch: expected ${h}`)}return{poolKey:f,poolId:h,zeroForOne:p.toLowerCase()===a.toLowerCase()}}function aE({hook:e,codePresent:t,initialized:n,dynamicFee:r}){let o=ha(e),i=o.enabled.some(u=>u.endsWith("ReturnsDelta")),s=o.flags.beforeSwap||o.flags.afterSwap||o.flags.beforeDonate||o.flags.afterDonate,a=[],c="none";return e!==Ie&&(c="low",a.push("nonzero hook requires independent contract review")),r&&(c="medium",a.push("pool uses a dynamic LP fee")),s&&(c="medium",a.push("hook runs during swap or donate flow")),i&&(c="high",a.push("hook can return custom accounting deltas")),o.valid||(c="critical",a.push(...o.violations)),r&&e===Ie&&(c="critical",a.push("dynamic-fee pool has no hook authority")),e!==Ie&&o.enabled.length===0&&(c="critical",a.push("nonzero hook declares no permissions")),n||(c="critical",a.push("pool is not initialized")),e!==Ie&&!t&&(c="critical",a.push("hook address has no deployed bytecode")),Object.freeze({tier:c,audited:!1,requiresReview:e!==Ie,returnsDelta:i,reasons:Object.freeze(a)})}async function cE(e={},t={}){let n=Br(e.chainId??8453);if(!n.stateView)throw new Error(`uniswap-v4: no StateView on chain ${n.chainId}`);let r=Mn(e.tokenIn||"WETH",n.chainId),o=Mn(e.tokenOut||n.usdc,n.chainId),i=Number(e.fee),s=Number(e.tickSpacing);if(!Number.isInteger(i)||i<0||i>16777215)throw new Error("uniswap-v4 inspectHook requires uint24 fee");if(!Number.isInteger(s)||s<-8388608||s>8388607)throw new Error("uniswap-v4 inspectHook requires int24 tickSpacing");let a=bn(e.hooks),{poolKey:c}=ya({tokenIn:r,tokenOut:o,fee:i,tickSpacing:s,hooks:a}),u=Zo(c),l=t.rpcCall||te,d=Jo.encodeFunctionData("getSlot0",[u]),f=Jo.encodeFunctionData("getLiquidity",[u]),[p,m,y]=await Promise.all([l(n.chainId,"eth_call",[{to:n.stateView,data:d},"latest"],t),l(n.chainId,"eth_call",[{to:n.stateView,data:f},"latest"],t),a===Ie?Promise.resolve(null):l(n.chainId,"eth_getCode",[a,"latest"],t)]),h=Jo.decodeFunctionResult("getSlot0",p),w=Jo.decodeFunctionResult("getLiquidity",m)[0],v=h[0],T=v>0n,S=a===Ie?null:typeof y=="string"&&y!=="0x"&&y.length>4,k=!!(i&ma),x=aE({hook:a,codePresent:S,initialized:T,dynamicFee:k});return Object.freeze({venue:"uniswap-v4",chainId:n.chainId,stateView:n.stateView,poolId:u,poolKey:Object.freeze(c),pool:Object.freeze({initialized:T,sqrtPriceX96:v.toString(),tick:Number(h[1]),protocolFee:Number(h[2]),lpFee:Number(h[3]),liquidity:w.toString(),dynamicFee:k}),hook:Object.freeze({address:a,codePresent:S,codeBytes:S?(y.length-2)/2:0,permissions:ha(a)}),risk:x})}async function ei(e={},t={}){let{chainId:n,quoter:r,poolManager:o,universalRouter:i}=Br(e.chainId??8453),s=Mn(e.tokenIn||"WETH",n),a=Mn(e.tokenOut||Ge[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 u=e.poolKey==null?null:sE({poolKey:e.poolKey,poolId:e.poolId,tokenIn:s,tokenOut:a,fee:e.fee,tickSpacing:e.tickSpacing,hooks:e.hooks}),l=u?[{fee:u.poolKey.fee,tickSpacing:u.poolKey.tickSpacing}]:e.fee!=null&&e.tickSpacing!=null?[{fee:Number(e.fee),tickSpacing:Number(e.tickSpacing)}]:e.tryTiers===!1?[{fee:500,tickSpacing:10}]:[...fa],d=u?u.poolKey.hooks:e.hooks||Ie,p=await Promise.all(l.map(async g=>{let A=u||ya({tokenIn:s,tokenOut:a,fee:g.fee,tickSpacing:g.tickSpacing,hooks:d}),{poolKey:P,zeroForOne:I}=A,L=Qo.encodeFunctionData("quoteExactInputSingle",[{poolKey:P,zeroForOne:I,exactAmount:c,hookData:"0x"}]);try{let q=await(t.rpcCall||te)(n,"eth_call",[{to:r,data:L},"latest"],t);if(!q||q==="0x")return{...g,ok:!1,error:"empty result"};let j=Qo.decodeFunctionResult("quoteExactInputSingle",q);return{fee:g.fee,tickSpacing:g.tickSpacing,ok:!0,amountOut:j[0].toString(),gasEstimate:j[1].toString(),poolKey:P,zeroForOne:I,poolId:A.poolId||Zo({...P})}}catch(q){return{...g,ok:!1,error:String(q.message||q).slice(0,160)}}})),m=null;for(let g of p)g.ok&&(!m||BigInt(g.amountOut)>BigInt(m.amountOut))&&(m=g);if(!m){let g=p.map(A=>`${A.fee}/${A.tickSpacing}:${A.error||"fail"}`).join("; ");throw new Error(`uniswap-v4 quote failed chain=${n}: ${g}`)}let y=e.liquidityUsd==null?await Pr({chainId:n,tokenA:s,tokenB:a,dexIds:dd},t).catch(()=>[]):[],h=new Map;for(let g of y){let A=String(g.pairAddress||"").toLowerCase();A&&h.set(A,g)}let w=g=>h.get(String(g.poolId||"").toLowerCase())??null,v=e.liquidityBandBps==null?50:Number(e.liquidityBandBps),T=null;if(!u&&!(e.fee!=null&&e.tickSpacing!=null)&&v>0&&BigInt(m.amountOut)>0n){let g=BigInt(m.amountOut),P=p.filter(I=>I.ok&&Number((g-BigInt(I.amountOut))*10000n/g)<=v).filter(I=>w(I)?.liquidityUsd!=null).sort((I,L)=>w(L).liquidityUsd-w(I).liquidityUsd)[0];P&&P.poolId!==m.poolId&&(T={priceBestFee:m.fee,chosenFee:P.fee,chosenPoolUsd:w(P).liquidityUsd,bandBps:v},m=P)}let S=w(m),k=y[0]??null,x=S??k,E=e.liquidityUsd??S?.liquidityUsd??k?.liquidityUsd??null,b=e.liquidityUsd!=null?"caller":S?"pool":k?"pair":null;return ge({venue:"uniswap-v4",chainId:n,chain:Ge[n].name,poolManager:o,quoter:r,universalRouter:i||null,tokenIn:s,tokenOut:a,amountIn:c.toString(),fee:m.fee,tickSpacing:m.tickSpacing,hooks:m.poolKey.hooks,poolId:m.poolId,poolKey:Object.freeze({...m.poolKey}),zeroForOne:m.zeroForOne,amountOut:m.amountOut,gasEstimate:m.gasEstimate,liquidityUsd:E,liquiditySource:x,liquidityAttribution:b,liquidityPick:T,triedTiers:p,best:!0,executionReady:!1,prepareReady:typeof e.recipient=="string"&&pa(e.recipient)&&Number.isInteger(Number(e.slippageBps))&&Number(e.slippageBps)>=0&&Number(e.slippageBps)<=100&&Number.isInteger(Number(e.deadlineSeconds))&&Number(e.deadlineSeconds)>=30&&Number(e.deadlineSeconds)<=600&&!Un(e.tokenIn)&&!Un(e.tokenOut)&&(e.hookData==null||String(e.hookData).toLowerCase()==="0x")&&m.poolKey.hooks===Ie&&!(m.fee&ma)},{chainId:n,venue:i||r,amountOut:m.amountOut,liquidityUsd:E,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps})}async function uE(e={},t={}){let{chainId:n,quoter:r,poolManager:o,universalRouter:i}=Br(e.chainId??8453),s=Mn(e.tokenIn||"WETH",n),a=Mn(e.tokenOut||Ge[n].usdc,n),c=BigInt(e.amountOut??0);if(c<=0n)throw new Error("amountOut required (raw base units)");if(c>0xffffffffffffffffffffffffffffffffn)throw new Error("amountOut exceeds uint128");let u=e.fee!=null&&e.tickSpacing!=null?[{fee:Number(e.fee),tickSpacing:Number(e.tickSpacing)}]:e.tryTiers===!1?[{fee:500,tickSpacing:10}]:[...fa],l=e.hooks||Ie,f=await Promise.all(u.map(async y=>{let{poolKey:h,zeroForOne:w}=ya({tokenIn:s,tokenOut:a,fee:y.fee,tickSpacing:y.tickSpacing,hooks:l}),v=Qo.encodeFunctionData("quoteExactOutputSingle",[{poolKey:h,zeroForOne:w,exactAmount:c,hookData:"0x"}]);try{let T=await(t.rpcCall||te)(n,"eth_call",[{to:r,data:v},"latest"],t);if(!T||T==="0x")return{...y,ok:!1,error:"empty result"};let S=Qo.decodeFunctionResult("quoteExactOutputSingle",T);return{fee:y.fee,tickSpacing:y.tickSpacing,ok:!0,amountIn:S[0].toString(),gasEstimate:S[1].toString(),poolKey:h,zeroForOne:w,poolId:Zo({...h})}}catch(T){return{...y,ok:!1,error:String(T.message||T).slice(0,160)}}})),p=null;for(let y of f)y.ok&&(!p||BigInt(y.amountIn)<BigInt(p.amountIn))&&(p=y);if(!p){let y=f.map(h=>`${h.fee}/${h.tickSpacing}:${h.error||"fail"}`).join("; ");throw new Error(`uniswap-v4 exact-output quote failed chain=${n}: ${y}`)}let m=e.liquidityUsd==null?await jl({chainId:n,tokenA:s,tokenB:a,dexIds:dd},t).catch(()=>null):null;return{venue:"uniswap-v4",chainId:n,chain:Ge[n].name,poolManager:o,quoter:r,universalRouter:i||null,tokenIn:s,tokenOut:a,amountIn:p.amountIn,amountOut:c.toString(),gasEstimate:p.gasEstimate,fee:p.fee,tickSpacing:p.tickSpacing,hooks:p.poolKey.hooks,poolId:p.poolId,zeroForOne:p.zeroForOne,liquidityUsd:e.liquidityUsd??m?.liquidityUsd??null,liquiditySource:m,triedTiers:f,best:!0,executionReady:!1,prepareReady:!1}}async function lE(e={},t={}){if(["operation","exactOutput","amountOut","multihop","path","positionManager","modifyLiquidities","commands","actions"].some(x=>Object.hasOwn(e,x)))throw new Error("uniswap-v4 unsupported operation shape is inspect/quote-only");let r=Number(e.chainId??8453),o=Br(r);if(bn(e.poolKey?.hooks??e.hooks)!==Ie)throw new Error("uniswap-v4 nonzero hooks are inspect/quote-only until a code-hash-specific adapter exists");if(Number(e.poolKey?.fee??e.fee)&ma)throw new Error("uniswap-v4 dynamic-fee pools are inspect/quote-only until a code-hash-specific adapter exists");if(e.hookData!=null&&String(e.hookData).toLowerCase()!=="0x")throw new Error("uniswap-v4 opaque hookData is inspect/quote-only until a code-hash-specific adapter exists");if(!e.recipient)throw new Error("uniswap-v4 prepare requires recipient");let a=Me(e.recipient);if(e.slippageBps==null)throw new Error("uniswap-v4 prepare requires explicit slippageBps");let c=Number(e.slippageBps);if(!Number.isInteger(c)||c<0||c>100)throw new Error("slippageBps must be an integer from 0 through 100");if(e.deadlineSeconds==null)throw new Error("uniswap-v4 prepare requires explicit deadlineSeconds");let u=Number(e.deadlineSeconds);if(!Number.isInteger(u)||u<30||u>600)throw new Error("deadlineSeconds must be an integer from 30 through 600");let l=e.poolKey&&typeof e.poolKey=="object"?[e.poolKey.currency0,e.poolKey.currency1]:[];if(Un(e.tokenIn)||Un(e.tokenOut)||l.some(Un))throw new Error("uniswap-v4 prepare currently requires ERC-20 tokenIn and tokenOut; native routes are not inferred");let d=await ei(e,t);if(!o.universalRouter)throw new Error(`uniswap-v4: no Universal Router on chain ${r}`);let f=BigInt(d.amountOut)*BigInt(1e4-c)/10000n,p={currency0:d.zeroForOne?d.tokenIn:d.tokenOut,currency1:d.zeroForOne?d.tokenOut:d.tokenIn,fee:d.fee,tickSpacing:d.tickSpacing,hooks:d.hooks},y=Bn.encode(["tuple(tuple(address currency0,address currency1,uint24 fee,int24 tickSpacing,address hooks) poolKey,bool zeroForOne,uint128 amountIn,uint128 amountOutMinimum,uint256 minHopPriceX36,bytes hookData)"],[[p,d.zeroForOne,BigInt(d.amountIn),f,0n,"0x"]]),h=Bn.encode(["address","uint256"],[d.tokenIn,BigInt(d.amountIn)]),w=Bn.encode(["address","uint256"],[d.tokenOut,f]),v=Bn.encode(["bytes","bytes[]"],[rE,[y,h,w]]),S=Number(t.nowSeconds??Math.floor(Date.now()/1e3))+u,k=eE.encodeFunctionData("execute",[nE,[v],S]);return ne({provider:"uniswap-v4",prepareReady:!0,calldataReady:!0,executionReady:!1,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:r,deadline:S,quote:{...d,amountOutMinimum:f.toString(),slippageBps:c},hookInspection:null,requiresApproval:{token:d.tokenIn,spender:oE,amount:d.amountIn,note:"Universal Router V4 settlement uses Permit2; Permit2 authorization for the Universal Router is also required"},transaction:{chainId:r,from:a,to:o.universalRouter,data:k,value:"0"}},{provider:"uniswap-v4",kind:"univ4-swap-tx"})}async function dE(){return Object.entries(Ge).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 pE(e={}){let t=Br(e.chainId??8453),n=await te(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 Bn,Ie,Ge,fa,Qo,eE,Jo,ud,tE,ma,nE,rE,oE,iE,dd,ti=_(()=>{it();Lr();at();xe();Bn=Zw.defaultAbiCoder(),Ie="0x0000000000000000000000000000000000000000",Ge={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"}},fa=[{fee:100,tickSpacing:1},{fee:500,tickSpacing:10},{fee:3e3,tickSpacing:60},{fee:1e4,tickSpacing:200},{fee:25e3,tickSpacing:8}],Qo=new da(["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)","function quoteExactOutputSingle(((address currency0,address currency1,uint24 fee,int24 tickSpacing,address hooks) poolKey,bool zeroForOne,uint128 exactAmount,bytes hookData) params) returns (uint256 amountIn, uint256 gasEstimate)"]),eE=new da(["function execute(bytes commands,bytes[] inputs,uint256 deadline) payable"]),Jo=new da(["function getSlot0(bytes32 poolId) view returns (uint160 sqrtPriceX96,int24 tick,uint24 protocolFee,uint24 lpFee)","function getLiquidity(bytes32 poolId) view returns (uint128 liquidity)"]),ud=Object.freeze([[13,"beforeInitialize"],[12,"afterInitialize"],[11,"beforeAddLiquidity"],[10,"afterAddLiquidity"],[9,"beforeRemoveLiquidity"],[8,"afterRemoveLiquidity"],[7,"beforeSwap"],[6,"afterSwap"],[5,"beforeDonate"],[4,"afterDonate"],[3,"beforeSwapReturnsDelta"],[2,"afterSwapReturnsDelta"],[1,"afterAddLiquidityReturnsDelta"],[0,"afterRemoveLiquidityReturnsDelta"]]),tE=(1n<<14n)-1n,ma=8388608;nE="0x10",rE="0x060c0f",oE="0x000000000022D473030F116dDEE9F6B43aC78BA3",iE="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE";dd=["uniswap-v4","uniswapv4"]});function fd(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}fE.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))Dn.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 md(e){let{ok:t,errors:n,warnings:r}=fd(e);if(!t)throw new Error(`invalid scanner for ${e?.key??"<unknown>"}:
5
+ ${JSON.stringify(n??[])}`}async function eI(e,t,n){return R(e,{method:"POST",body:t,fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs??12e3,signal:n.signal})}async function de(e,t,n=[],r={}){let o=String(t||""),i=Jx(o),s=Kx(e,r);if(!s)throw new Error(`No RPC URL for chainId ${e} (set env from chain registry rpcEnv or pass rpcUrl)`);if(i==="eth_chainid"&&r.cacheChainId!==!1){let u=fm.get(s);if(u!=null)return u}let c=r.dedupe!==!1&&!r.signal?Zx(s,o,n):null;if(c&&Oi.has(c))return Oi.get(c);let l=(async()=>{let u=await eI(s,{jsonrpc:"2.0",id:1,method:t,params:n},r),d=Qx(u);return i==="eth_chainid"&&typeof d=="string"&&fm.set(s,d),d})();return c&&(Oi.set(c,l),l.finally(()=>{Oi.get(c)===l&&Oi.delete(c)}).catch(()=>{})),l}async function Qs(e,t={}){let n=await de(e,"eth_blockNumber",[],t);return parseInt(n,16)}async function mm(e,t={}){let n=await de(e,"eth_gasPrice",[],t);if(n==null)return null;try{return BigInt(n)}catch{return null}}async function hm(e,t,n={}){if(!t)throw new Error("rpcGetBalance requires address");let r=await de(e,"eth_getBalance",[t,"latest"],n);return{chainId:Number(e),address:t,balanceWei:BigInt(r).toString(),balanceHex:r}}async function ym(e={},t={}){let n=Number(e.chainId??t.chainId??1),r=_i(e.token||e.tokenAddress,"token"),o=_i(e.owner,"owner"),i=_i(e.spender,"spender"),s=Xs.encodeFunctionData("allowance",[o,i]),a=await de(n,"eth_call",[{to:r,data:s},e.blockTag||"latest"],t),c=Xs.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 gm(e={},t={}){let n=Number(e.chainId??t.chainId??1),r=_i(e.token||e.tokenAddress,"token"),o=_i(e.account||e.owner||e.address,"account"),i=Xs.encodeFunctionData("balanceOf",[o]),s=await de(n,"eth_call",[{to:r,data:i},e.blockTag||"latest"],t),a=Xs.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"}}var Xs,Gx,Yx,Oi,fm,Qt=T(()=>{Y();Dl();Xs=new Vx(["function allowance(address owner,address spender) view returns (uint256)","function balanceOf(address account) view returns (uint256)"]);Gx={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"};Yx=/^(?:eth_(?:call|blocknumber|chainid|get[a-z0-9]+|feehistory|gasprice|maxpriorityfeepergas|syncing|protocolversion|estimategas|createaccesslist)|net_(?:version|listening|peercount)|web3_(?:clientversion|sha3))$/;Oi=new Map,fm=new Map});function bm(e,t){let n=String(e||"").toLowerCase(),r=String(t?.quote||t?.quoteToken?.address||"").toLowerCase(),o=String(t?.base||t?.baseToken?.address||"").toLowerCase();return r===n?{address:t.base||t.baseToken?.address,symbol:t.baseToken?.symbol}:o===n?{address:t.quote||t.quoteToken?.address,symbol:t.quoteToken?.symbol}:{address:t.quote||t.quoteToken?.address,symbol:t.quoteToken?.symbol}}function Zs(e,t=[],{stables:n=[],wrappedNative:r=null}={}){let o=String(e||"").toLowerCase(),i=new Set((n||[]).map(c=>String(c).toLowerCase())),s=String(r||"").toLowerCase(),a=(t||[]).map((c,l)=>{let u=bm(o,c),d=String(u.address||"").toLowerCase(),p=String(u.symbol||"").toLowerCase(),f=Number(c.liquidityUsd??c.liquidity?.usd),m=Number.isFinite(f)?f:0,h=String(c.dex||c.dexId||"").toLowerCase(),y=0;return i.has(d)||tI.has(p)?y=300:s&&d===s&&(y=100),h.includes("v4")?y+=20:h.includes("v3")?y+=10:(h.includes("v2")||h.includes("raydium")||h.includes("orca")||h.includes("meteora"))&&(y+=8),{pool:c,score:y*1e12+m,index:l,otherAddr:d,liquidityUsd:m}});return a.sort((c,l)=>l.score-c.score||c.index-l.index),a.map(c=>c.pool)}function wm(e,t=[]){let n=Array.isArray(t)?t:[];return n.length&&bm(e,n[0]).address||null}var tI,Ul=T(()=>{tI=new Set(["usdc","usdt","usdg","dai","usd1","usde","pyusd"])});function iI(e,t,n){let r=Zt(t),o=Zt(n),i=Zt(e?.baseToken?.address),s=Zt(e?.quoteToken?.address);return i===r&&s===o||i===o&&s===r}function sI(e){let t=Number(e?.liquidity?.usd);return Number.isFinite(t)&&t>=0?t:null}function aI(e={}){return(e.baseUrl||process.env.DEXSCREENER_API_URL||nI).replace(/\/$/,"")}async function ea(e,t={}){if(!e)throw new Error("tokenAddress required");return R(`${aI(t)}/latest/dex/tokens/${e}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3})}async function Em({chainId:e,tokenA:t,tokenB:n,dexIds:r=[]}={},o={}){return(await Ti({chainId:e,tokenA:t,tokenB:n,dexIds:r},o))[0]??null}async function Ti({chainId:e,tokenA:t,tokenB:n,dexIds:r=[]}={},o={}){if(e==null||!t||!n)throw new Error("chainId, tokenA, and tokenB required");let i=Zt(rI[Number(e)]||e),s=new Set(oI(r).filter(Boolean).map(Zt)),a=[...new Set([t,n].map(p=>String(p)).filter(Boolean))],c=await Promise.allSettled(a.map(p=>ea(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 f of p.value?.pairs||p.value?.data?.pairs||[]){let m=`${Zt(f?.chainId)}:${Zt(f?.dexId)}:${Zt(f?.pairAddress)}`;l.has(m)||(l.add(m),u.push(f))}return u.filter(p=>Zt(p?.chainId)===i).filter(p=>iI(p,t,n)).filter(p=>!s.size||s.has(Zt(p?.dexId))).map(p=>({pairAddress:p.pairAddress??null,dexId:p.dexId??null,chainId:p.chainId??null,liquidityUsd:sI(p),pairCreatedAt:p.pairCreatedAt??null})).filter(p=>p.liquidityUsd!=null).sort((p,f)=>f.liquidityUsd-p.liquidityUsd)}async function Am(e,{chainSlug:t="solana",stables:n=cI}={},r={}){let o=await ea(e,r),s=(o?.pairs||o?.data?.pairs||[]).filter(c=>String(c.chainId).toLowerCase()===String(t).toLowerCase()).map(c=>({pair:c.pairAddress,dex:c.dexId,dexId:c.dexId,base:c.baseToken?.address,quote:c.quoteToken?.address,baseToken:c.baseToken,quoteToken:c.quoteToken,liquidityUsd:c.liquidity?.usd??null,priceUsd:c.priceUsd??null,volume24hUsd:c.volume?.h24??null,createdAt:c.pairCreatedAt??null})),a=Zs(e,s,{stables:n});return{chain:t,token:e,pools:a,topPool:a[0]||null}}var nI,rI,Zt,oI,cI,Ni=T(()=>{Y();Ul();nI="https://api.dexscreener.com",rI=Object.freeze({1:"ethereum",10:"optimism",56:"bsc",137:"polygon",8453:"base",42161:"arbitrum",43114:"avalanche",999:"hyperevm",4663:"robinhood"}),Zt=e=>String(e??"").toLowerCase(),oI=e=>Array.isArray(e)?e:e==null?[]:[e];cI=["EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v","Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB"]});import{readFileSync as lI}from"node:fs";import{homedir as uI}from"node:os";import{join as ta}from"node:path";function dI(){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=uI();if(process.env.ORACLE_PUBLIC_DESKTOP==="1"){let n=(process.env.ORACLE_CONFIG_DIR||ta(t,".config","oracle")).trim();return[e,ta(n,"exec.env")].filter(Boolean)}return[e,ta(t,".config","oracle","exec.env"),ta(t,".config","mad-desk","exec.env")].filter(Boolean)}function Sm(e,t,n){let r=e??process.env[t]??process.env[n];if(!String(r||"").trim())for(let o of dI())try{let i=lI(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 vm=T(()=>{});var xm=T(()=>{});import{createHash as pI,createHmac as km,timingSafeEqual as fI}from"node:crypto";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??null)}function Om(e,{required:t=!1}={}){try{return Sm(e,"ORACLE_ROUTE_ATTESTATION_SECRET","MAD_ROUTE_ATTESTATION_SECRET")}catch(n){if(t)throw n;return null}}function ql(e){let{signature:t,...n}=e;return n}function _m(e,{secret:t}={}){let n=Om(t);return n?{...e,signature:km("sha256",n).update(na(ql(e))).digest("hex")}:e}function mI(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 pI("sha256").update(Buffer.from(t.slice(2),"hex")).digest("hex")}function Nt(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");let i=Om(o);if(i){let f=km("sha256",i).update(na(ql(e))).digest("hex");if(!hI(e.signature,f))throw new Error("auto-slippage guard signature mismatch \u2014 refusing to bind a guard this Oracle did not issue")}let s=Number(e.selectedBps),a=Number(e.capBps);if(!Number.isInteger(s)||s<0||s>jn||!Number.isInteger(a)||a<0||a>jn||s>a)throw new Error("auto-slippage guard bounds are invalid");let c=BigInt(e.quoteAmountOut??0),l=BigInt(e.minAmountOut??0);if(c<=0n||l<=0n)throw new Error("auto-slippage guard amounts must be positive");let u=c*BigInt(1e4-s),d=u/10000n;if(u%10000n!==0n&&(d+=1n),l<d)throw new Error("auto-slippage guard is under-protected relative to its quote");let p=gI(r);if(p!=null&&p!==l)throw new Error(`auto-slippage: calldata encodes floor ${p}, not the guard floor ${l} \u2014 refusing to bind`);return _m({...ql(e),calldataHash:mI(r)},{secret:o})}function hI(e,t){let n=Buffer.from(String(e??""),"utf8"),r=Buffer.from(String(t??""),"utf8");return n.length!==r.length||n.length===0?!1:fI(n,r)}function Bl(e,t=0){let n=Number(e);return Number.isFinite(n)?n:t}function yI(e){let t=e==null?jn: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,jn)}function Hn({liquidityUsd:e,priceChange5m:t=0,quoteAgeMs:n=0,crossChain:r=!1,requestedCapBps:o}={}){let i=Bl(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(Bl(t,0))*2),c=Math.min(40,Math.floor(Math.max(0,Bl(n,0))/5e3)*5),l=Math.max(25,Math.ceil(20+s+a+c)),u=yI(o);return{mode:"auto",requiredBps:l,selectedBps:Math.min(l,u),capBps:u,executable:l<=u}}function Ml({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=Im,secret:u}={}){let d=BigInt(n??0);if(d<=0n)throw new Error("auto-slippage guard requires positive quoteAmountOut");let p=Hn({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 f=Number(c);if(!Number.isFinite(f))throw new Error("auto-slippage: quotedAtMs must be a finite number");let m=Math.min(3e4,Math.max(1e3,Number(l)||Im)),h=d*BigInt(1e4-p.selectedBps),y=h/10000n;if(h%10000n!==0n&&(y+=1n),y>d&&(y=d),d>0n&&y<=0n)throw new Error(`auto-slippage: quote ${d} is too small to express a ${p.selectedBps} bps floor without rounding to zero`);let g=Number((d-y)*10000n/(d===0n?1n:d));if(g>p.capBps)throw new Error(`auto-slippage: realised floor implies ${g} bps, above cap ${p.capBps} \u2014 refusing to issue a guard weaker than advertised`);return _m({mode:"auto",chainId:Number(e),venue:String(t||"unknown"),quoteAmountOut:d.toString(),minAmountOut:y.toString(),requiredBps:p.requiredBps,selectedBps:p.selectedBps,capBps:p.capBps,quotedAtMs:f,expiresAtMs:f+m},{secret:u})}function gI(e){let t=String(e||"");if(!/^0x[0-9a-fA-F]+$/.test(t)||t.length<10||t.length%2!==0)return null;let n=t.slice(0,10).toLowerCase(),r=[];for(let i=10;i+64<=t.length;i+=64)r.push(t.slice(i,i+64));let o=i=>r[i]==null?null:BigInt("0x"+r[i]);switch(n){case"0x414bf389":return o(6);case"0x04e45aaf":return o(5);case"0xc04b8d59":{let i=o(0);if(i==null)return null;let s=Number(i)/32;return!Number.isInteger(s)||s<0?null:o(s+4)}case"0xb858183f":{let i=o(0);if(i==null)return null;let s=Number(i)/32;return!Number.isInteger(s)||s<0?null:o(s+3)}case"0xa026383e":return o(6);case"0x38ed1739":case"0x5c11d795":return o(1);case"0x7ff36ab5":case"0xb6f9de95":return o(0);case"0x18cbafe5":case"0x791ac947":return o(1);default:return null}}function We(e,{chainId:t,venue:n,amountOut:r,liquidityUsd:o,priceChange5m:i,crossChain:s,requestedCapBps:a,quotedAtMs:c=Date.now(),ttlMs:l}={}){let u=Ml({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 jn,Im,en=T(()=>{vm();xm();jn=100,Im=2e4});import{createHash as bI,createHmac as wI,timingSafeEqual as IF}from"node:crypto";function Fl(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(Fl).join(",")}]`:`{${Object.keys(e).sort().map(n=>`${JSON.stringify(n)}:${Fl(e[n])}`).join(",")}}`}function Tm(e){let t=String(e?.ORACLE_STAMP_HMAC_SECRET||"").trim();return t.length>=16?t:""}function Cm(e=process.env){return Tm(process.env)||Tm(e)}function SI(e){let{prepareHash:t,prepareMac:n,note:r,...o}=e||{};return o}function vI(e){let t=SI(e);return bI("sha256").update(Fl(t)).digest("hex")}function xI(e,t=Cm()){return t?wI("sha256",t).update(String(e)).digest("hex"):""}function me(e,{provider:t,kind:n,env:r=process.env,nowMs:o=Date.now(),expiresAtMs:i}={}){if(!e||typeof e!="object")throw new Error("stampPrepared: payload object required");let s=Object.prototype.hasOwnProperty.call(e,"oraclePrepared");if(s&&typeof e.oraclePrepared!="boolean")throw new Error("stampPrepared: oraclePrepared must be boolean");let a={...e,provider:e.provider||t,kind:e.kind||n,requiresUserSignature:e.requiresUserSignature!==!1,signingReady:!1,broadcastReady:!1,executionReady:!1,oraclePrepared:s?e.oraclePrepared:!0};if(!a.provider)throw new Error("stampPrepared: provider required");if(!a.kind)throw new Error("stampPrepared: kind required");let c=Number(o),l=i==null?c+Nm:Number(i),u=l-c;if(!Number.isSafeInteger(c)||!Number.isSafeInteger(l)||u<=0||u>AI)throw new Error("stampPrepared: bounded preparedAt/expiresAt required");let p={...a,preparedAt:c,expiresAt:l,prepareVersion:EI},f=vI(p),m=Cm(r),h=m?xI(f,m):void 0,y={...p,prepareHash:f};return h&&(y.prepareMac=h),y}var EI,Nm,AI,rt=T(()=>{EI=2,Nm=300*1e3,AI=(()=>{let e=Number(process.env.ORACLE_PREPARE_HARD_MAX_AGE_MS);return Number.isFinite(e)&&e>0?e:1800*1e3})()});var Mm={};Q(Mm,{PANCAKE_FEE_TIERS:()=>ra,UNI_V3_CHAINS:()=>ot,UNI_V3_FEE_TIERS:()=>$m,UNI_V3_VENUES:()=>Bm,uniV3Chains:()=>CI,uniV3EthUsdc:()=>qm,uniV3Health:()=>NI,uniV3PrepareExactIn:()=>TI,uniV3QuoteExactIn:()=>Gr,uniV3QuoteExactInPath:()=>_I});import{Interface as Pm,getAddress as Ci,isAddress as Lm}from"ethers";function Hl(e,t){let n=Number(e),r=ot[n];if(!r)throw new Error(`uniswap-v3: unsupported chainId ${e} (supported: ${Object.keys(ot).join(", ")})`);let o=Bm[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 jl(e,t){let n=ot[Number(t)];if(!e||e===Dm||e===Um||/^eth$/i.test(String(e)))return Ci(n.weth);let r=String(e);if(/^weth$/i.test(r))return Ci(n.weth);if(/^usdc$/i.test(r))return Ci(n.usdc);if(!Lm(r))throw new Error(`invalid token address: ${e}`);return Ci(r)}function kI(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 OI(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 Gr(e={},t={}){let{chainId:n,quoter:r,router:o,feeTiers:i}=Hl(e.chainId??8453,e.venue),s=jl(e.tokenIn||"WETH",n),a=jl(e.tokenOut||ot[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:$m,u=e.fee!=null?[Number(e.fee)]:e.tryFees===!1?[l[Math.min(2,l.length-1)]]:[...l],p=await Promise.all(u.map(async A=>{let w=oa.encodeFunctionData("quoteExactInputSingle",[{tokenIn:s,tokenOut:a,amountIn:c,fee:A,sqrtPriceLimitX96:0n}]);try{let b=await de(n,"eth_call",[{to:r,data:w},"latest"],t);if(!b||b==="0x")return{fee:A,ok:!1,error:"empty result"};let x=oa.decodeFunctionResult("quoteExactInputSingle",b);return{fee:A,ok:!0,amountOut:x[0].toString(),sqrtPriceX96After:x[1].toString(),initializedTicksCrossed:Number(x[2]),gasEstimate:x[3].toString()}}catch(b){return{fee:A,ok:!1,error:String(b.message||b).slice(0,160)}}})),f=null;for(let A of p)A.ok&&(!f||BigInt(A.amountOut)>BigInt(f.amountOut))&&(f=A);if(!f){let A=p.map(w=>`${w.fee}:${w.error||"fail"}`).join("; ");throw new Error(`uniswap-v3 quote failed chain=${n}: ${A}`)}let m=e.liquidityUsd==null?await Ti({chainId:n,tokenA:s,tokenB:a,dexIds:kI(e.venue)},t).catch(()=>[]):[],h={};await Promise.all(m.slice(0,8).map(async A=>{if(!(!A.pairAddress||!Lm(A.pairAddress)))try{let w=await de(n,"eth_call",[{to:A.pairAddress,data:II},"latest"],t),b=w&&w!=="0x"&&w.length<=66?Number.parseInt(w,16):NaN;if(!Number.isFinite(b)||b<=0||b>1e6)return;let x=h[b];(x==null||A.liquidityUsd>x.liquidityUsd)&&(h[b]=A)}catch{}}));let y=e.liquidityBandBps==null?50:Number(e.liquidityBandBps),g=null;if(e.fee==null&&y>0&&BigInt(f.amountOut)>0n){let A=BigInt(f.amountOut),b=p.filter(x=>x.ok&&Number((A-BigInt(x.amountOut))*10000n/A)<=y).filter(x=>h[x.fee]?.liquidityUsd!=null).sort((x,C)=>h[C.fee].liquidityUsd-h[x.fee].liquidityUsd)[0];b&&b.fee!==f.fee&&(g={priceBestFee:f.fee,chosenFee:b.fee,chosenPoolUsd:h[b.fee].liquidityUsd,bandBps:y},f=b)}let E=h[f.fee]??null,v=m[0]??null,S=E??v,I=e.liquidityUsd??E?.liquidityUsd??v?.liquidityUsd??null,k=e.liquidityUsd!=null?"caller":E?"pool":v?"pair":null;return We({venue:"uniswap-v3",chainId:n,chain:ot[n].name,quoter:r,tokenIn:s,tokenOut:a,amountIn:c.toString(),fee:f.fee,amountOut:f.amountOut,gasEstimate:f.gasEstimate,liquidityUsd:I,liquiditySource:S,liquidityAttribution:k,liquidityPick:g,sqrtPriceX96After:f.sqrtPriceX96After,initializedTicksCrossed:f.initializedTicksCrossed,triedFees:p,best:!0},{chainId:n,venue:o,amountOut:f.amountOut,liquidityUsd:I,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps})}async function _I(e={},t={}){let{chainId:n,quoter:r,router:o}=Hl(e.chainId??8453),i=(e.tokens||[]).map(p=>jl(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=OI(i,s),l=oa.encodeFunctionData("quoteExactInput",[c,a]),u=await de(n,"eth_call",[{to:r,data:l},"latest"],t),d=oa.decodeFunctionResult("quoteExactInput",u);return We({venue:"uniswap-v3",chainId:n,chain:ot[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 qm(e={},t={}){let n=Number(e.chainId??8453),r=e.amountIn??"1000000000000000",o=await Gr({chainId:n,tokenIn:ot[n].weth,tokenOut:ot[n].usdc,amountIn:r,fee:e.fee},t),i=Number(o.amountOut)/1e6;return{...o,amountOutUsdc:i,pair:"WETH/USDC"}}async function TI(e={},t={}){let n=Number(e.chainId??8453),r=Hl(n,e.venue),o=Ci(e.recipient),i=String(e.tokenIn||"WETH"),s=!e.tokenIn||i===Dm||i===Um||/^eth$/i.test(i),a=await Gr(e,t),c=Rm.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=Rm.encodeFunctionData("multicall",[d,[c]]);return me({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:Nt(a.autoSlippage,{chainId:n,venue:r.router,data:p})}},{provider:"uniswap-v3",kind:"univ3-swap-tx"})}async function NI(e={}){let t=Number(e.chainId??8453);try{let n=await qm({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 CI(){return Object.entries(ot).map(([e,t])=>({chainId:Number(e),name:t.name,quoter:t.quoter,weth:t.weth,usdc:t.usdc}))}var ot,$m,II,oa,Rm,Dm,Um,ra,Bm,Ri=T(()=>{Qt();Ni();en();rt();ot={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"}},$m=[100,500,3e3,1e4],II="0xddca3f43",oa=new Pm(["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)"]),Rm=new Pm(["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)"]),Dm="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",Um="0x0000000000000000000000000000000000000000",ra=[100,500,2500,1e4],Bm={56:{pancakeswap:{name:"pancakeswap",quoter:"0xB048Bbc1Ee6b733FFfCFb9e9CeF7375518e25997",router:"0x13f4EA83D0bd40E75C8222255bc855a974568Dd4",feeTiers:ra}},8453:{pancakeswap:{name:"pancakeswap",quoter:"0xB048Bbc1Ee6b733FFfCFb9e9CeF7375518e25997",router:"0x13f4EA83D0bd40E75C8222255bc855a974568Dd4",feeTiers:ra}},42161:{pancakeswap:{name:"pancakeswap",quoter:"0xB048Bbc1Ee6b733FFfCFb9e9CeF7375518e25997",router:"0x13f4EA83D0bd40E75C8222255bc855a974568Dd4",feeTiers:ra}},999:{hyperswap:{name:"hyperswap",quoter:"0x03A918028f22D9E1473B7959C927AD7425A45C7C",router:"0x4E2960a8cd19B467b82d26D83fAcb0fAE26b094D"}}}});var zm={};Q(zm,{UNI_V4_CHAINS:()=>Ct,UNI_V4_FEE_TIERS:()=>Wl,computeV4PoolId:()=>aa,decodeV4HookPermissions:()=>Kl,uniV4Chains:()=>zI,uniV4Health:()=>VI,uniV4InspectHook:()=>FI,uniV4PrepareExactIn:()=>HI,uniV4QuoteExactIn:()=>ca,uniV4QuoteExactOut:()=>jI});import{AbiCoder as RI,Interface as zl,getAddress as At,isAddress as Vl,keccak256 as jm}from"ethers";function Kl(e){let t=Kr(e),n=Number(BigInt(t)&LI),r=Object.fromEntries(Fm.map(([s,a])=>[a,!!(n&1<<s)])),i=[["beforeSwapReturnsDelta","beforeSwap"],["afterSwapReturnsDelta","afterSwap"],["afterAddLiquidityReturnsDelta","afterAddLiquidity"],["afterRemoveLiquidityReturnsDelta","afterRemoveLiquidity"]].filter(([s,a])=>r[s]&&!r[a]).map(([s,a])=>`${s} requires ${a}`);return Object.freeze({address:t,mask:n,maskHex:`0x${n.toString(16).padStart(4,"0")}`,flags:Object.freeze(r),enabled:Object.freeze(Fm.filter(([,s])=>r[s]).map(([,s])=>s)),valid:i.length===0,violations:Object.freeze(i)})}function Pi(e){let t=Number(e),n=Ct[t];if(!n)throw new Error(`uniswap-v4: unsupported chainId ${e} (supported: ${Object.keys(Ct).join(", ")})`);return{chainId:t,...n}}function Kr(e){if(e==null||e==="")return it;let t=String(e);if(!Vl(t))throw new Error(`invalid Uniswap V4 hook address: ${e}`);return At(t)}function vo(e,t){let n=Ct[Number(t)];if(So(e))return At(it);let r=String(e);if(/^weth$/i.test(r))return At(n.weth);if(/^usdc$/i.test(r)||/^usdg$/i.test(r))return At(n.usdc);if(!Vl(r))throw new Error(`invalid token address: ${e}`);return At(r)}function So(e){let t=String(e||"").trim().toLowerCase();return!t||t===BI.toLowerCase()||t===it.toLowerCase()||t==="eth"}function aa({currency0:e,currency1:t,fee:n,tickSpacing:r,hooks:o=it}){let i=At(e),s=At(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=Kr(o);return jm(Ao.encode(["address","address","uint24","int24","address"],[a,c,Number(n),Number(r),l]))}function Yl({tokenIn:e,tokenOut:t,fee:n,tickSpacing:r,hooks:o=it}){let i=At(e),s=At(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:Kr(o)},zeroForOne:l}}function qI({poolKey:e,poolId:t,tokenIn:n,tokenOut:r,fee:o,tickSpacing:i,hooks:s}){if(!e||typeof e!="object"||Array.isArray(e))throw new Error("uniswap-v4 exact poolKey must be an object");let a=At(e.currency0),c=At(e.currency1);if(a.toLowerCase()>=c.toLowerCase())throw new Error("uniswap-v4 exact poolKey requires canonical currency ordering");let l=Number(e.fee),u=Number(e.tickSpacing);if(!Number.isInteger(l)||l<0||l>16777215)throw new Error("uniswap-v4 exact poolKey requires uint24 fee");if(!Number.isInteger(u)||u<-8388608||u>8388607)throw new Error("uniswap-v4 exact poolKey requires int24 tickSpacing");let d=Kr(e.hooks),p={currency0:a,currency1:c,fee:l,tickSpacing:u,hooks:d},f=At(n),m=At(r);if(f.toLowerCase()===m.toLowerCase())throw new Error("tokenIn and tokenOut must differ");let h=new Set([a.toLowerCase(),c.toLowerCase()]);if(!h.has(f.toLowerCase())||!h.has(m.toLowerCase()))throw new Error("uniswap-v4 exact poolKey currencies do not match tokenIn/tokenOut");if(o!=null&&Number(o)!==l)throw new Error("uniswap-v4 exact poolKey fee conflicts with top-level fee");if(i!=null&&Number(i)!==u)throw new Error("uniswap-v4 exact poolKey tickSpacing conflicts with top-level tickSpacing");if(s!=null&&Kr(s).toLowerCase()!==d.toLowerCase())throw new Error("uniswap-v4 exact poolKey hooks conflict with top-level hooks");let y=jm(Ao.encode(["address","address","uint24","int24","address"],[a,c,l,u,d]));if(t!=null){if(!/^0x[0-9a-f]{64}$/i.test(String(t)))throw new Error("uniswap-v4 exact poolId must be bytes32");if(String(t).toLowerCase()!==y.toLowerCase())throw new Error(`uniswap-v4 exact poolId mismatch: expected ${y}`)}return{poolKey:p,poolId:y,zeroForOne:f.toLowerCase()===a.toLowerCase()}}function MI({hook:e,codePresent:t,initialized:n,dynamicFee:r}){let o=Kl(e),i=o.enabled.some(l=>l.endsWith("ReturnsDelta")),s=o.flags.beforeSwap||o.flags.afterSwap||o.flags.beforeDonate||o.flags.afterDonate,a=[],c="none";return e!==it&&(c="low",a.push("nonzero hook requires independent contract review")),r&&(c="medium",a.push("pool uses a dynamic LP fee")),s&&(c="medium",a.push("hook runs during swap or donate flow")),i&&(c="high",a.push("hook can return custom accounting deltas")),o.valid||(c="critical",a.push(...o.violations)),r&&e===it&&(c="critical",a.push("dynamic-fee pool has no hook authority")),e!==it&&o.enabled.length===0&&(c="critical",a.push("nonzero hook declares no permissions")),n||(c="critical",a.push("pool is not initialized")),e!==it&&!t&&(c="critical",a.push("hook address has no deployed bytecode")),Object.freeze({tier:c,audited:!1,requiresReview:e!==it,returnsDelta:i,reasons:Object.freeze(a)})}async function FI(e={},t={}){let n=Pi(e.chainId??8453);if(!n.stateView)throw new Error(`uniswap-v4: no StateView on chain ${n.chainId}`);let r=vo(e.tokenIn||"WETH",n.chainId),o=vo(e.tokenOut||n.usdc,n.chainId),i=Number(e.fee),s=Number(e.tickSpacing);if(!Number.isInteger(i)||i<0||i>16777215)throw new Error("uniswap-v4 inspectHook requires uint24 fee");if(!Number.isInteger(s)||s<-8388608||s>8388607)throw new Error("uniswap-v4 inspectHook requires int24 tickSpacing");let a=Kr(e.hooks),{poolKey:c}=Yl({tokenIn:r,tokenOut:o,fee:i,tickSpacing:s,hooks:a}),l=aa(c),u=t.rpcCall||de,d=ia.encodeFunctionData("getSlot0",[l]),p=ia.encodeFunctionData("getLiquidity",[l]),[f,m,h]=await Promise.all([u(n.chainId,"eth_call",[{to:n.stateView,data:d},"latest"],t),u(n.chainId,"eth_call",[{to:n.stateView,data:p},"latest"],t),a===it?Promise.resolve(null):u(n.chainId,"eth_getCode",[a,"latest"],t)]),y=ia.decodeFunctionResult("getSlot0",f),g=ia.decodeFunctionResult("getLiquidity",m)[0],E=y[0],v=E>0n,S=a===it?null:typeof h=="string"&&h!=="0x"&&h.length>4,I=!!(i&Gl),k=MI({hook:a,codePresent:S,initialized:v,dynamicFee:I});return Object.freeze({venue:"uniswap-v4",chainId:n.chainId,stateView:n.stateView,poolId:l,poolKey:Object.freeze(c),pool:Object.freeze({initialized:v,sqrtPriceX96:E.toString(),tick:Number(y[1]),protocolFee:Number(y[2]),lpFee:Number(y[3]),liquidity:g.toString(),dynamicFee:I}),hook:Object.freeze({address:a,codePresent:S,codeBytes:S?(h.length-2)/2:0,permissions:Kl(a)}),risk:k})}async function ca(e={},t={}){let{chainId:n,quoter:r,poolManager:o,universalRouter:i}=Pi(e.chainId??8453),s=vo(e.tokenIn||"WETH",n),a=vo(e.tokenOut||Ct[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.poolKey==null?null:qI({poolKey:e.poolKey,poolId:e.poolId,tokenIn:s,tokenOut:a,fee:e.fee,tickSpacing:e.tickSpacing,hooks:e.hooks}),u=l?[{fee:l.poolKey.fee,tickSpacing:l.poolKey.tickSpacing}]:e.fee!=null&&e.tickSpacing!=null?[{fee:Number(e.fee),tickSpacing:Number(e.tickSpacing)}]:e.tryTiers===!1?[{fee:500,tickSpacing:10}]:[...Wl],d=l?l.poolKey.hooks:e.hooks||it,f=await Promise.all(u.map(async b=>{let x=l||Yl({tokenIn:s,tokenOut:a,fee:b.fee,tickSpacing:b.tickSpacing,hooks:d}),{poolKey:C,zeroForOne:O}=x,F=sa.encodeFunctionData("quoteExactInputSingle",[{poolKey:C,zeroForOne:O,exactAmount:c,hookData:"0x"}]);try{let H=await(t.rpcCall||de)(n,"eth_call",[{to:r,data:F},"latest"],t);if(!H||H==="0x")return{...b,ok:!1,error:"empty result"};let V=sa.decodeFunctionResult("quoteExactInputSingle",H);return{fee:b.fee,tickSpacing:b.tickSpacing,ok:!0,amountOut:V[0].toString(),gasEstimate:V[1].toString(),poolKey:C,zeroForOne:O,poolId:x.poolId||aa({...C})}}catch(H){return{...b,ok:!1,error:String(H.message||H).slice(0,160)}}})),m=null;for(let b of f)b.ok&&(!m||BigInt(b.amountOut)>BigInt(m.amountOut))&&(m=b);if(!m){let b=f.map(x=>`${x.fee}/${x.tickSpacing}:${x.error||"fail"}`).join("; ");throw new Error(`uniswap-v4 quote failed chain=${n}: ${b}`)}let h=e.liquidityUsd==null?await Ti({chainId:n,tokenA:s,tokenB:a,dexIds:Hm},t).catch(()=>[]):[],y=new Map;for(let b of h){let x=String(b.pairAddress||"").toLowerCase();x&&y.set(x,b)}let g=b=>y.get(String(b.poolId||"").toLowerCase())??null,E=e.liquidityBandBps==null?50:Number(e.liquidityBandBps),v=null;if(!l&&!(e.fee!=null&&e.tickSpacing!=null)&&E>0&&BigInt(m.amountOut)>0n){let b=BigInt(m.amountOut),C=f.filter(O=>O.ok&&Number((b-BigInt(O.amountOut))*10000n/b)<=E).filter(O=>g(O)?.liquidityUsd!=null).sort((O,F)=>g(F).liquidityUsd-g(O).liquidityUsd)[0];C&&C.poolId!==m.poolId&&(v={priceBestFee:m.fee,chosenFee:C.fee,chosenPoolUsd:g(C).liquidityUsd,bandBps:E},m=C)}let S=g(m),I=h[0]??null,k=S??I,A=e.liquidityUsd??S?.liquidityUsd??I?.liquidityUsd??null,w=e.liquidityUsd!=null?"caller":S?"pool":I?"pair":null;return We({venue:"uniswap-v4",chainId:n,chain:Ct[n].name,poolManager:o,quoter:r,universalRouter:i||null,tokenIn:s,tokenOut:a,amountIn:c.toString(),fee:m.fee,tickSpacing:m.tickSpacing,hooks:m.poolKey.hooks,poolId:m.poolId,poolKey:Object.freeze({...m.poolKey}),zeroForOne:m.zeroForOne,amountOut:m.amountOut,gasEstimate:m.gasEstimate,liquidityUsd:A,liquiditySource:k,liquidityAttribution:w,liquidityPick:v,triedTiers:f,best:!0,executionReady:!1,prepareReady:typeof e.recipient=="string"&&Vl(e.recipient)&&Number.isInteger(Number(e.slippageBps))&&Number(e.slippageBps)>=0&&Number(e.slippageBps)<=100&&Number.isInteger(Number(e.deadlineSeconds))&&Number(e.deadlineSeconds)>=30&&Number(e.deadlineSeconds)<=600&&!So(e.tokenIn)&&!So(e.tokenOut)&&(e.hookData==null||String(e.hookData).toLowerCase()==="0x")&&m.poolKey.hooks===it&&!(m.fee&Gl)},{chainId:n,venue:i||r,amountOut:m.amountOut,liquidityUsd:A,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps})}async function jI(e={},t={}){let{chainId:n,quoter:r,poolManager:o,universalRouter:i}=Pi(e.chainId??8453),s=vo(e.tokenIn||"WETH",n),a=vo(e.tokenOut||Ct[n].usdc,n),c=BigInt(e.amountOut??0);if(c<=0n)throw new Error("amountOut required (raw base units)");if(c>0xffffffffffffffffffffffffffffffffn)throw new Error("amountOut 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}]:[...Wl],u=e.hooks||it,p=await Promise.all(l.map(async h=>{let{poolKey:y,zeroForOne:g}=Yl({tokenIn:s,tokenOut:a,fee:h.fee,tickSpacing:h.tickSpacing,hooks:u}),E=sa.encodeFunctionData("quoteExactOutputSingle",[{poolKey:y,zeroForOne:g,exactAmount:c,hookData:"0x"}]);try{let v=await(t.rpcCall||de)(n,"eth_call",[{to:r,data:E},"latest"],t);if(!v||v==="0x")return{...h,ok:!1,error:"empty result"};let S=sa.decodeFunctionResult("quoteExactOutputSingle",v);return{fee:h.fee,tickSpacing:h.tickSpacing,ok:!0,amountIn:S[0].toString(),gasEstimate:S[1].toString(),poolKey:y,zeroForOne:g,poolId:aa({...y})}}catch(v){return{...h,ok:!1,error:String(v.message||v).slice(0,160)}}})),f=null;for(let h of p)h.ok&&(!f||BigInt(h.amountIn)<BigInt(f.amountIn))&&(f=h);if(!f){let h=p.map(y=>`${y.fee}/${y.tickSpacing}:${y.error||"fail"}`).join("; ");throw new Error(`uniswap-v4 exact-output quote failed chain=${n}: ${h}`)}let m=e.liquidityUsd==null?await Em({chainId:n,tokenA:s,tokenB:a,dexIds:Hm},t).catch(()=>null):null;return{venue:"uniswap-v4",chainId:n,chain:Ct[n].name,poolManager:o,quoter:r,universalRouter:i||null,tokenIn:s,tokenOut:a,amountIn:f.amountIn,amountOut:c.toString(),gasEstimate:f.gasEstimate,fee:f.fee,tickSpacing:f.tickSpacing,hooks:f.poolKey.hooks,poolId:f.poolId,zeroForOne:f.zeroForOne,liquidityUsd:e.liquidityUsd??m?.liquidityUsd??null,liquiditySource:m,triedTiers:p,best:!0,executionReady:!1,prepareReady:!1}}async function HI(e={},t={}){if(["operation","exactOutput","amountOut","multihop","path","positionManager","modifyLiquidities","commands","actions"].some(k=>Object.hasOwn(e,k)))throw new Error("uniswap-v4 unsupported operation shape is inspect/quote-only");let r=Number(e.chainId??8453),o=Pi(r);if(Kr(e.poolKey?.hooks??e.hooks)!==it)throw new Error("uniswap-v4 nonzero hooks are inspect/quote-only until a code-hash-specific adapter exists");if(Number(e.poolKey?.fee??e.fee)&Gl)throw new Error("uniswap-v4 dynamic-fee pools are inspect/quote-only until a code-hash-specific adapter exists");if(e.hookData!=null&&String(e.hookData).toLowerCase()!=="0x")throw new Error("uniswap-v4 opaque hookData is inspect/quote-only until a code-hash-specific adapter exists");if(!e.recipient)throw new Error("uniswap-v4 prepare requires recipient");let a=At(e.recipient);if(e.slippageBps==null)throw new Error("uniswap-v4 prepare requires explicit slippageBps");let c=Number(e.slippageBps);if(!Number.isInteger(c)||c<0||c>100)throw new Error("slippageBps must be an integer from 0 through 100");if(e.deadlineSeconds==null)throw new Error("uniswap-v4 prepare requires explicit deadlineSeconds");let l=Number(e.deadlineSeconds);if(!Number.isInteger(l)||l<30||l>600)throw new Error("deadlineSeconds must be an integer from 30 through 600");let u=e.poolKey&&typeof e.poolKey=="object"?[e.poolKey.currency0,e.poolKey.currency1]:[];if(So(e.tokenIn)||So(e.tokenOut)||u.some(So))throw new Error("uniswap-v4 prepare currently requires ERC-20 tokenIn and tokenOut; native routes are not inferred");let d=await ca(e,t);if(!o.universalRouter)throw new Error(`uniswap-v4: no Universal Router on chain ${r}`);let p=BigInt(d.amountOut)*BigInt(1e4-c)/10000n,f={currency0:d.zeroForOne?d.tokenIn:d.tokenOut,currency1:d.zeroForOne?d.tokenOut:d.tokenIn,fee:d.fee,tickSpacing:d.tickSpacing,hooks:d.hooks},h=Ao.encode(["tuple(tuple(address currency0,address currency1,uint24 fee,int24 tickSpacing,address hooks) poolKey,bool zeroForOne,uint128 amountIn,uint128 amountOutMinimum,uint256 minHopPriceX36,bytes hookData)"],[[f,d.zeroForOne,BigInt(d.amountIn),p,0n,"0x"]]),y=Ao.encode(["address","uint256"],[d.tokenIn,BigInt(d.amountIn)]),g=Ao.encode(["address","uint256"],[d.tokenOut,p]),E=Ao.encode(["bytes","bytes[]"],[DI,[h,y,g]]),S=Number(t.nowSeconds??Math.floor(Date.now()/1e3))+l,I=PI.encodeFunctionData("execute",[$I,[E],S]);return me({provider:"uniswap-v4",prepareReady:!0,calldataReady:!0,executionReady:!1,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:r,deadline:S,quote:{...d,amountOutMinimum:p.toString(),slippageBps:c},hookInspection:null,requiresApproval:{token:d.tokenIn,spender:UI,amount:d.amountIn,note:"Universal Router V4 settlement uses Permit2; Permit2 authorization for the Universal Router is also required"},transaction:{chainId:r,from:a,to:o.universalRouter,data:I,value:"0"}},{provider:"uniswap-v4",kind:"univ4-swap-tx"})}async function zI(){return Object.entries(Ct).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 VI(e={}){let t=Pi(e.chainId??8453),n=await de(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 Ao,it,Ct,Wl,sa,PI,ia,Fm,LI,Gl,$I,DI,UI,BI,Hm,la=T(()=>{Qt();Ni();en();rt();Ao=RI.defaultAbiCoder(),it="0x0000000000000000000000000000000000000000",Ct={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"}},Wl=[{fee:100,tickSpacing:1},{fee:500,tickSpacing:10},{fee:3e3,tickSpacing:60},{fee:1e4,tickSpacing:200},{fee:25e3,tickSpacing:8}],sa=new zl(["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)","function quoteExactOutputSingle(((address currency0,address currency1,uint24 fee,int24 tickSpacing,address hooks) poolKey,bool zeroForOne,uint128 exactAmount,bytes hookData) params) returns (uint256 amountIn, uint256 gasEstimate)"]),PI=new zl(["function execute(bytes commands,bytes[] inputs,uint256 deadline) payable"]),ia=new zl(["function getSlot0(bytes32 poolId) view returns (uint160 sqrtPriceX96,int24 tick,uint24 protocolFee,uint24 lpFee)","function getLiquidity(bytes32 poolId) view returns (uint128 liquidity)"]),Fm=Object.freeze([[13,"beforeInitialize"],[12,"afterInitialize"],[11,"beforeAddLiquidity"],[10,"afterAddLiquidity"],[9,"beforeRemoveLiquidity"],[8,"afterRemoveLiquidity"],[7,"beforeSwap"],[6,"afterSwap"],[5,"beforeDonate"],[4,"afterDonate"],[3,"beforeSwapReturnsDelta"],[2,"afterSwapReturnsDelta"],[1,"afterAddLiquidityReturnsDelta"],[0,"afterRemoveLiquidityReturnsDelta"]]),LI=(1n<<14n)-1n,Gl=8388608;$I="0x10",DI="0x060c0f",UI="0x000000000022D473030F116dDEE9F6B43aC78BA3",BI="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE";Hm=["uniswap-v4","uniswapv4"]});function Vm(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}WI.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))xo.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 Wm(e){let{ok:t,errors:n,warnings:r}=Vm(e);if(!t)throw new Error(`invalid scanner for ${e?.key??"<unknown>"}:
6
6
  - ${n.join(`
7
- - `)}`);let o=e.capabilities||{},i=Dn.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,wrappedNative:e.wrappedNative||null,explorer:e.explorer||null,venues:(e.venues||[]).map(a=>({...a})),warnings:r,capabilities(){return{chainId:e.chainId,key:e.key,supported:[...i],unsupported:Dn.filter(a=>!i.includes(a))}},supports(a){return i.includes(a)}};for(let a of Dn)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)}function ni(e){let t=md(e);return Fn.set(t.chainId,t),t}function ga(e){return Fn.get(Number(e))||null}function hd(){return[...Fn.values()]}function mE(){Fn.clear()}function hE(){let e={};for(let t of Fn.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:Fn.size,capabilities:[...Dn],chains:e}}var Dn,F,U,fE,Fn,Xt=_(()=>{Dn=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"}),fE=/^0x[0-9a-fA-F]{40}$/;Fn=new Map});function yd(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:u=null,executionReady:l=!1,meta:d={}}=e||{};if(u||n==null)return{source:t,quality:ct.FAILED,amountOut:null,error:u||"no amountOut returned"};let f=Ur(n);if(f==null||f<=0n)return{source:t,quality:ct.FAILED,amountOut:null,error:"non-positive amountOut"};let p=Number(s);return{source:t,quality:o==null?ct.NO_GAS:ct.FULL,amountOut:f.toString(),minOut:Ur(r)?.toString()??null,gasUsd:o,feeUsd:i,oracleFeeBps:Number.isFinite(p)&&p>0?Math.floor(p):0,estimatedGas:a==null?null:String(a),liquidityUsd:c==null?null:Number(c),executionReady:l,meta:d}}async function bd(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 u=Number(a)/Number(o),l=Number(c)/Number(r);return!Number.isFinite(u)||!Number.isFinite(l)||u<=0?null:{impactPct:(1-l/u)*100,probeAmountIn:o.toString(),probeAmountOut:a.toString(),fullAmountOut:c.toString()}}function wd(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 ba(e,{destPriceUsd:t=null,destDecimals:n=null,liquidityFirst:r=!0,liquidityBandBps:o=50,gasPriceWei:i=null,nativePriceUsd:s=null}={}){let a=e.filter(b=>b.quality!==ct.FAILED),c=e.filter(b=>b.quality===ct.FAILED),u=t!=null&&t>0&&n!=null&&n>=0,l=Number(i),d=Number(s),f=Number.isFinite(l)&&l>0&&Number.isFinite(d)&&d>0,p=a.map(b=>{let g=BigInt(b.amountOut),A=0n,P=!1,I=!1,L=BigInt(b.oracleFeeBps??0),q=L>0n?g*L/10000n:0n;if(u){let D=b.gasUsd,M=Number(b.meta?.gasUnits??b.estimatedGas);if(D==null&&f&&Number.isFinite(M)&&M>0){let Y=M*l/1e18*d;Number.isFinite(Y)&&Y>=0&&(D=Y,I=!0)}let Q=(D??0)+(b.feeUsd??0);if(Q>0){let Y=Q/t*10**n;Number.isFinite(Y)&&Y>=0&&(A=BigInt(Math.floor(Y)),P=!0)}else D===0&&(P=!0)}let j=A+q,$=g>j?g-j:0n;return{...b,grossOut:g.toString(),netOut:$.toString(),costInDest:A.toString(),oracleFeeInDest:q.toString(),costAccounted:P,gasEstimated:I}}),m=Number(o)>0?Number(o):0,y=p.reduce((b,g)=>BigInt(g.netOut)>b?BigInt(g.netOut):b,0n),h=b=>y>0n?Number((y-BigInt(b))*10000n/y):0,w=[],v=p.slice().sort((b,g)=>BigInt(g.netOut)>BigInt(b.netOut)?1:-1)[0]??null;p.sort((b,g)=>{let A=h(b.netOut)<=m?0:1,P=h(g.netOut)<=m?0:1;if(r&&m>0&&A!==P)return A-P;if(r&&m>0){let I=b.liquidityUsd??-1,L=g.liquidityUsd??-1;if(I!==L)return L-I}return BigInt(g.netOut)>BigInt(b.netOut)?1:-1}),r&&m>0&&v&&p[0]&&p[0].source!==v.source&&w.push(`liquidity-first: chose ${p[0].source} (liquidity $${p[0].liquidityUsd??"unknown"}) over best-price ${v.source} within ${m} bps`);let T=p.filter(b=>!b.costAccounted).map(b=>b.source);u?T.length&&w.push(`gas not reported by: ${T.join(", ")}. These are ranked on gross output and may be overstated relative to gas-measured routes.`):w.push("destination price/decimals unavailable: ranked on GROSS output. Gas is not included, so a cheap-looking route may cost more to execute.");let S=p[0];if(u&&S&&S.costAccounted===!1){let b=p.find(g=>g.costAccounted&&h(g.netOut)<=m);b&&w.push(`winner ${S.source} has UNMEASURED gas; gas-measured ${b.source} is within ${m} bps and may net more once ${S.source}'s real gas is paid \u2014 prefer it if unsure.`)}let k=p.filter(b=>b.gasEstimated).map(b=>b.source);k.length&&w.push(`gas ESTIMATED (from gas units x current gas price, not measured) for: ${k.join(", ")}. Net includes this estimate so the ranking is gas-inclusive, but the on-chain gas may differ.`);let x=null,E=null;if(p.length>=2&&p[0].costAccounted&&p[1].costAccounted){let b=BigInt(p[0].netOut),g=BigInt(p[1].netOut);g>0n&&(x=Number((b-g)*10000n/g),E=`${p[0].source} vs ${p[1].source}`)}return{best:p[0]??null,routes:p,failed:c,improvementBps:x,spreadBasis:E,rankedOn:u?"net-of-cost":"gross",warnings:w}}async function ri(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"?yd({source:s,error:String(o.reason?.message||o.reason)}):yd({source:s,...o.value})})}var ct,gd,Ur,wa=_(()=>{Xt();ct=Object.freeze({FULL:"FULL",NO_GAS:"NO_GAS",FAILED:"FAILED"}),gd={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 Ea(e){let t=String(e||"").trim();return/^0x[0-9a-fA-F]{40}$/.test(t)?t:Jt}var Jt,oi=_(()=>{Jt="0x000000000000000000000000000000000000dEaD"});import{Contract as yE,JsonRpcProvider as gE}from"ethers";function vE(e){return AE.test(String(e||""))}async function Ed(e,{contract:t=bE,rpc:n=EE,chainId:r=wE,balanceOf:o}={}){if(!vE(e))throw new Error("invalid-address");if(o)return BigInt(await o(e));let i=new gE(n,r,{staticNetwork:!0}),s=new yE(t,SE,i);return BigInt(await s.balanceOf(e))}var bE,wE,EE,SE,AE,Sd=_(()=>{bE="0x62FCFAf7573AD8B41a0FBF347AfEb85e06599A75",wE=999,EE="https://rpc.hyperliquid.xyz/evm",SE=["function balanceOf(address owner) view returns (uint256)"],AE=/^0x[a-fA-F0-9]{40}$/});import{existsSync as xE,readFileSync as kE,lstatSync as IE}from"node:fs";import{homedir as Ad}from"node:os";import{join as Sa}from"node:path";function TE(e){let t=String(e||"swap").toLowerCase();return Object.prototype.hasOwnProperty.call(vd,t)?vd[t]:OE}function LE(e=process.env){if(process.env.ORACLE_TEST_ISOLATE_SECRETS==="1"){if(e[xd])return String(e[xd]);let t=e.ORACLE_CONFIG_DIR||Sa(Ad(),".config","oracle");return Sa(t,"fee-recipient")}return Sa(Ad(),".config","oracle","fee-recipient")}function $E(e=process.env){try{let t=LE(e);if(!xE(t)||IE(t).isSymbolicLink())return"";let n=kE(t,"utf8").trim().toLowerCase();return/^0x[a-f0-9]{40}$/.test(n)?n:""}catch{return""}}function qE(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),_E)}function BE({env:e=process.env,action:t="swap",admin:n=!1}={}){let r=String(e[NE]||"").trim(),o=String(e[RE]||PE).trim();if(n===!0)return{bps:0,recipient:"",integrator:o,action:t,applies:!1,reason:"admin-oracle"};let i=TE(t),s=qE(e[CE],{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=$E(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 ii({wallet:e,env:t=process.env,action:n="swap",holderCheck:r={},admin:o=!1}={}){let i=BE({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 Ed(s,r))>0n?{...i,bps:0,applies:!1,reason:"locals-only-holder",holderVerificationStatus:"holder"}:{...i,holderVerificationStatus:"non-holder"}}catch{return{...i,holderVerificationStatus:"unavailable"}}}function kd(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 Id(e){return e?.applies?{integrator:e.integrator,fee:String(e.bps/1e4)}:{}}function _d(e){return e?.applies?{partner:e.integrator,partnerFeeBps:String(e.bps),partnerAddress:e.recipient}:{}}var _E,OE,vd,CE,NE,RE,xd,PE,si=_(()=>{Sd();_E=100,OE=5,vd=Object.freeze({swap:5,bridge:5,perps:0,nft:0});CE="ORACLE_INTEGRATOR_FEE_BPS",NE="ORACLE_INTEGRATOR_FEE_RECIPIENT",RE="ORACLE_INTEGRATOR_ID",xd="ORACLE_INTEGRATOR_FEE_RECIPIENT_PIN",PE="oracle"});var xa={};z(xa,{LIFI_API:()=>Td,lifiChains:()=>jE,lifiHealth:()=>DE,lifiPrepare:()=>FE,lifiQuote:()=>wn});function va(e={}){return(e.baseUrl||process.env.LIFI_API_URL||Td).replace(/\/$/,"")}function ME(e){let t=String(e||Aa).toLowerCase();return t===Aa.toLowerCase()||t===UE}function Od(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 DE(e={}){let t=await C(`${va(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 wn(e={},t={}){let{fromChain:n,toChain:r=n,fromToken:o=Aa,toToken:i,fromAmount:s,fromAddress:a=Jt}=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}),u=$t({liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,crossChain:Number(r)!==Number(n),requestedCapBps:e.maxSlippageBps??e.slippageBps});if(!u.executable)throw new Error(`lifi: route requires ${u.requiredBps} bps above cap ${u.capBps}`);c.set("slippage",String(u.selectedBps/1e4));let l=await ii({wallet:e.fromAddress,env:t.env,action:e.feeAction||"swap",holderCheck:t.holderCheck});for(let[h,w]of Object.entries(Id(l)))c.set(h,w);let d=await C(`${va(t)}/quote?${c}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4}),f=d?.estimate?.toAmount||d?.toAmount;if(!f)return{...d,autoSlippagePolicy:u,oracleFee:l};let p=d?.transactionRequest?.to||d?.estimate?.approvalAddress||"lifi",m=ge(d,{chainId:Number(n),venue:p,amountOut:f,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,crossChain:Number(r)!==Number(n),requestedCapBps:e.maxSlippageBps??e.slippageBps}),y=d?.estimate?.toAmountMin||d?.toAmountMin;if(y!=null&&BigInt(y)<BigInt(m.amountOutMinimum))throw new Error("lifi: provider transaction is under-protected versus bounded auto-slippage floor");return{...m,oracleFee:l}}async function FE(e={},t={}){let n=await wn(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(!ME(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:Od(a,"approval token"),spender:Od(s,"approval spender"),amount:String(e.fromAmount)}}return ne({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:We(n.autoSlippage,{chainId:o,venue:r.to,data:r.data})}},{provider:"lifi",kind:"lifi-tx"})}async function jE(e={}){return C(`${va(e)}/chains`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??12e3})}var Td,Aa,UE,Mr=_(()=>{G();at();oi();xe();si();Td="https://li.quest/v1";Aa="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",UE="0x0000000000000000000000000000000000000000"});var Rd={};z(Rd,{PARASWAP_API:()=>Cd,paraswapHealth:()=>zE,paraswapPrepare:()=>HE,paraswapPrice:()=>Hn,paraswapTokens:()=>Nd});function jn(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 Nd(e={},t={}){let n=Number(e.chainId||1);return C(`${ka(t)}/tokens/${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function Hn(e={},t={}){let n=Number(e.chainId||e.network||1);if(e.amount==null)throw new Error("amount required");let r=new URLSearchParams({srcToken:jn(e.srcToken,"srcToken"),destToken:jn(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 ii({wallet:e.userAddress||e.fromAddress,env:t.env,action:e.feeAction||"swap",holderCheck:t.holderCheck});for(let[a,c]of Object.entries(_d(o)))r.set(a,c);let i=await C(`${ka(t)}/prices?${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4}),s=i?.priceRoute?.destAmount;return s?{...ge(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 HE(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=jn(e.userAddress,"userAddress"),o=await Hn(e,t),i=o?.priceRoute,s=String(i?.contractAddress||"").toLowerCase();if(!s)throw new Error("paraswap: price route missing contractAddress");let a={srcToken:jn(e.srcToken,"srcToken"),destToken:jn(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=jn(e.receiver,"receiver"));let c=await C(`${ka(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 ne({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:We(o.autoSlippage,{chainId:n,venue:c.to,data:c.data})}},{provider:"paraswap",kind:"paraswap-tx"})}async function zE(e={}){let t=await Nd({chainId:1},e),n=Array.isArray(t?.tokens)?t.tokens.length:Object.keys(t?.tokens||{}).length;return{ok:n>0,tokenSample:n}}var Cd,ka,ai=_(()=>{G();at();xe();si();Cd="https://api.paraswap.io",ka=(e={})=>(e.baseUrl||process.env.PARASWAP_API_URL||Cd).replace(/\/$/,"")});function Dr({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:Ld(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([Ld(t),...n]).has(c)){let l=/^(127\.0\.0\.1|localhost|\[::1\])(:\d+)?$/i.test(c);return a.protocol==="http:"&&!l?{baseUrl:s,trusted:!1,host:c,reason:"plaintext http downgrade"}:{baseUrl:s,trusted:!0,host:c}}if(String(process.env[Pd]||"")==="1")return{baseUrl:s,trusted:!1,host:c};if(o)throw new Error(`${e}: refusing to call non-allowlisted host ${c} (set ${Pd}=1 to permit it)`);return{baseUrl:s,trusted:!1,host:c}}function Ld(e){let t=new URL(String(e));if(t.protocol!=="http:"&&t.protocol!=="https:")throw new Error("unsupported protocol");return t.host}function Fr(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 Pd,ci=_(()=>{Pd="ORACLE_ALLOW_CUSTOM_PROVIDER_URL"});var Dd={};z(Dd,{ZEROX_API:()=>$d,zeroxHealth:()=>VE,zeroxPrepare:()=>WE,zeroxPrice:()=>Md,zeroxQuote:()=>zn});function qd(e={}){return Dr({provider:"zerox",defaultUrl:$d,hosts:["api.0x.org"],url:e.baseUrl||process.env.ZEROX_API_URL})}function Bd(e={}){return qd(e).baseUrl}function ui(e={}){return e.apiKey||process.env.ZEROX_API_KEY||process.env.OX_API_KEY||process.env["0X_API_KEY"]||""}function Ud(e={}){return Fr({"0x-version":"v2",accept:"application/json"},{"0x-api-key":ui(e)},qd(e).trusted)}async function VE(e={}){if(!ui(e))return{ok:!1,configured:!1,error:"ZEROX_API_KEY not set"};try{let t=await Md({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 Md(e={},t={}){if(!ui(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),C(`${Bd(t)}/swap/allowance-holder/price?${a}`,{headers:Ud(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function zn(e={},t={}){if(!ui(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=$t({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 u=await C(`${Bd(t)}/swap/allowance-holder/quote?${c}`,{headers:Ud(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),l=u?.buyAmount||u?.grossBuyAmount;return l?ge(u,{chainId:n,venue:u?.transaction?.to||u?.to||"0x",amountOut:l,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps}):{...u,autoSlippagePolicy:a}}async function WE(e={},t={}){if(!e.taker)throw new Error("0x: taker required for executable prepare");let n=await zn(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 ne({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:We(n.autoSlippage,{chainId:o,venue:r.to,data:r.data})}},{provider:"zerox",kind:"zerox-tx"})}var $d,li=_(()=>{G();at();ci();xe();$d="https://api.0x.org"});function Fd(e={}){return Dr({provider:"oneinch",defaultUrl:GE,hosts:["api.1inch.dev"],url:e.baseUrl||process.env.ONEINCH_API_URL})}function KE(e={}){return Fd(e).baseUrl}function jd(e={}){return e.apiKey||process.env.ONEINCH_API_KEY||process.env.ONE_INCH_API_KEY||""}function YE(e={}){let t=jd(e);return Fr({accept:"application/json"},{Authorization:t?`Bearer ${t}`:""},Fd(e).trusted)}async function Hd(e={},t={}){if(!jd(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 C(`${KE(t)}/${n}/quote?${s}`,{headers:YE(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3});return a?.dstAmount?ge(a,{chainId:n,venue:"1inch-quote",amountOut:a.dstAmount,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps}):a}var GE,zd=_(()=>{G();at();ci();xe();GE="https://api.1inch.dev/swap/v6.0"});var $P,Vd=_(()=>{$P=Object.freeze({READ:"read",PREPARE:"prepare",EXECUTE:"execute",AUTONOMOUS:"autonomous"})});import di from"node:fs";import XE from"node:os";import Wn from"node:path";import{fileURLToPath as JE}from"node:url";function Wd(){return process.env.ORACLE_FAKE_HOME||XE.homedir()}function ZE(){return process.env.ORACLE_PUBLIC_DESKTOP==="1"}function pi(){return ZE()?process.env.ORACLE_CONFIG_DIR||Wn.join(Wd(),".config","oracle"):Wn.join(Wd(),".config","oracle")}function eS(){return Wn.join(pi(),"desk.json")}function tS(){return Wn.join(pi(),"env")}function Vn({force:e=!1}={}){if(Vn._done&&!e)return Vn._result||null;Vn._done=!0;let t={},n=(o,i)=>{if(i==null)return;let s=String(i).trim();s&&(process.env[o]!=null&&String(process.env[o]).trim()!==""||(process.env[o]=s,t[o]=s))};try{let o=tS();if(di.existsSync(o))for(let i of di.readFileSync(o,"utf8").split(/\r?\n/)){let s=i.match(/^\s*([A-Z0-9_]+)\s*=\s*(.*?)\s*$/);if(!s||s[2].startsWith("#"))continue;let a=s[2];(a.startsWith('"')&&a.endsWith('"')||a.startsWith("'")&&a.endsWith("'"))&&(a=a.slice(1,-1)),n(s[1],a)}}catch{}try{let o=eS();if(di.existsSync(o)){let i=JSON.parse(di.readFileSync(o,"utf8"));i&&typeof i=="object"&&(n("ORACLE_DESK_URL",i.deskUrl||i.dataUrl||i.url),n("ORACLE_DATA_URL",i.dataUrl||i.deskUrl||i.url),n("ORACLE_API_URL",i.apiUrl||i.dataUrl||i.deskUrl),n("ORACLE_PUBLIC_URL",i.publicUrl||i.deskUrl||i.dataUrl),n("ORACLE_EXEC_URL",i.execUrl),n("MAD_DESK_URL",i.deskUrl||i.dataUrl))}}catch{}let r=process.env.ORACLE_DESK_URL||process.env.ORACLE_DATA_URL||"";return r&&(n("ORACLE_DESK_URL",r),n("ORACLE_DATA_URL",r),n("ORACLE_API_URL",r),n("ORACLE_PUBLIC_URL",r),n("MAD_DESK_URL",r)),Vn._result=Object.keys(t).length?t:null,Vn._result}var QE,FP,Gd=_(()=>{QE=Wn.dirname(JE(import.meta.url)),FP=Wn.resolve(QE,"../..");try{Vn()}catch{}});var Xd={};z(Xd,{armPreparedAction:()=>uS,callSigner:()=>Kd,queueOwnerAction:()=>Yd});import{existsSync as nS,readFileSync as rS}from"node:fs";import{request as oS}from"node:http";import iS from"node:path";function aS(e=process.env){let t=String(e.ORACLE_SIGNER_URL||sS).replace(/\/$/,""),n;try{n=new URL(t)}catch{return null}return n.hostname!=="127.0.0.1"&&n.hostname!=="localhost"&&n.hostname!=="::1"?null:n.origin}function cS(e=process.env){if(e.ORACLE_SIGNER_TOKEN)return String(e.ORACLE_SIGNER_TOKEN);let t=iS.join(pi(),"signer","signer-token");return nS(t)?rS(t,"utf8").trim():null}function Kd(e,{method:t="GET",body:n=null,env:r=process.env,timeoutMs:o=4e3}={}){let i=aS(r),s=cS(r);return!i||!s?Promise.resolve({ok:!1,error:"local signer is not running"}):new Promise(a=>{let c=new URL(e,i),u=n?Buffer.from(JSON.stringify(n)):null,l=oS({hostname:c.hostname,port:c.port||80,path:c.pathname,method:t,timeout:o,headers:{authorization:`Bearer ${s}`,origin:i,...u?{"content-type":"application/json","content-length":u.length}:{}}},d=>{let f=[];d.on("data",p=>f.push(p)),d.on("end",()=>{let p=Buffer.concat(f).toString("utf8"),m={};try{m=p?JSON.parse(p):{}}catch{m={error:"signer refused"}}a({httpStatus:d.statusCode,...m})})});l.on("timeout",()=>{l.destroy(),a({ok:!1,error:"local signer timed out"})}),l.on("error",()=>a({ok:!1,error:"local signer is not running"})),u&&l.write(u),l.end()})}async function Yd(e,t=process.env){if(!e||e.version!==1||!e.surface)throw new Error("queueOwnerAction: version-1 surface envelope required");return Kd("/pending",{method:"POST",body:{artifact:e},env:t,timeoutMs:8e3})}async function uS(e,t=process.env){let n=e?.localSignerEnvelope||e?.envelope;if(!n||n.version!==1||!n.surface)throw new Error("armPreparedAction: prepared.localSignerEnvelope v1 required");return Yd(n,t)}var sS,Jd=_(()=>{Gd();sS="http://127.0.0.1:9462"});var sp={};z(sp,{COW_CANCEL_TYPES:()=>tp,COW_HOSTS:()=>mi,COW_ORDER_TYPES:()=>fi,COW_SETTLEMENT:()=>Qd,COW_VAULT_RELAYER:()=>Zd,armCowOrder:()=>yS,buildArmedCowOrder:()=>Ta,cowCancelOrders:()=>AS,cowChains:()=>kS,cowHealth:()=>mS,cowOrder:()=>ip,cowOrderStatus:()=>op,cowOrderUid:()=>gS,cowPrepareCancel:()=>ES,cowPrepareOrder:()=>hS,cowQuote:()=>En,cowSignCancel:()=>SS,cowSignOrder:()=>bS,cowSubmitSignedOrder:()=>wS,cowVerifyOrderFill:()=>xS});import{TypedDataEncoder as _a,getAddress as jr,isAddress as lS}from"ethers";function hi(e,t={}){if(t.baseUrl)return t.baseUrl.replace(/\/$/,"");let n=mi[Number(e)];if(!n)throw new Error(`cowswap: unsupported chainId ${e}`);return n}function dS(e,t="v1",n={}){let r=hi(e,n);return t==="v1"?r:r.replace(/\/api\/v1$/,`/api/${t}`)}function qt(e,t){let n=String(e||"").trim();if(!lS(n))throw new Error(`cowswap: ${t} must be an address`);return jr(n).toLowerCase()}function Gn(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 np(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 rp(e,t="uid"){let n=String(e||"").trim();if(!/^0x[0-9a-fA-F]{112}$/.test(n))throw new Error(`cowswap: ${t} must be 56-byte order UID hex`);return n.toLowerCase()}function pS({digest:e,owner:t,validTo:n}={}){let r=np(e,"order digest").slice(2),o=qt(t,"owner").slice(2).toLowerCase(),i=Number(n);if(!Number.isInteger(i)||i<0||i>4294967295)throw new Error("cowswap: validTo must fit uint32");return`0x${r}${o}${i.toString(16).padStart(8,"0")}`.toLowerCase()}function Oa(e){let t=Qd[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:jr(t)}}function fS(e={},t,n){let r=qt(e.sellToken,"sellToken"),o=qt(e.buyToken,"buyToken"),i=qt(e.receiver||n,"receiver"),s=Number(e.validTo);if(!Number.isInteger(s)||s<=0)throw new Error("cowswap: quote.validTo required");let a=np(e.appData||e.appDataHash||`0x${"0".repeat(64)}`,"appData");return{sellToken:r,buyToken:o,receiver:i,sellAmount:Gn(e.sellAmount,"sellAmount"),buyAmount:Gn(e.buyAmount,"buyAmount"),validTo:s,appData:a,feeAmount:Gn(e.feeAmount??"0","feeAmount"),kind:String(e.kind||"sell"),partiallyFillable:!!e.partiallyFillable,sellTokenBalance:String(e.sellTokenBalance||"erc20"),buyTokenBalance:String(e.buyTokenBalance||"erc20")}}async function mS(e={}){try{let t=await En({chainId:1,sellToken:Ia[1],buyToken:ep[1],sellAmountBeforeFee:"1000000000000000",from:Jt},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 En(e={},t={}){let n=Number(e.chainId??1),r=Ea(e.from||e.owner),o=e.sellToken||Ia[n],i=e.buyToken||ep[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=Ia[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 C(`${hi(n,t)}/quote`,{method:"POST",body:a,fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),u=c?.quote?.buyAmount||c?.buyAmount;return u?ge(c,{chainId:n,venue:"cowswap-order",amountOut:u,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps}):c}async function hS(e={},t={}){let n=Number(e.chainId??1),r=qt(Ea(e.from||e.owner||e.signer),"owner"),o=await En({...e,chainId:n,from:r,signingScheme:e.signingScheme||"eip712"},t),i=fS(o?.quote||o,n,r),s=Oa(n),a={domain:s,types:fi,primaryType:"Order",message:i},c=_a.hash(s,fi,i),u=Zd[n];if(!u)throw new Error(`cowswap: vault relayer not registered for chain ${n}`);return ne({provider:"cowswap",orderReady:!0,executionReady:!1,chainId:n,owner:r,signingScheme:"eip712",settlement:s.verifyingContract.toLowerCase(),vaultRelayer:jr(u).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:jr(u).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:jr(u).toLowerCase(),amount:i.sellAmount},localSignerEnvelope:Ta({chainId:n,owner:r,typedData:a,quoteId:o?.id??e.quoteId??null,cowGuard:{expiresAtMs:Math.min(i.validTo*1e3,Date.now()+2e4)}})},{provider:"cowswap",kind:"cow-order"})}function Ta(e={},t={}){let n=e.typedData;if(!n?.domain||!n?.types||!n?.message)throw new Error("cowswap: typedData required to arm");let r=Number(e.chainId??n.domain.chainId),o=mi[r];if(!o)throw new Error(`cowswap: unsupported chainId ${r}`);let i=qt(e.owner,"owner"),s=Number(t.nowMs??Date.now()),a=_a.hash(n.domain,n.types,n.message);return Object.freeze({tradeId:`cow:${r}:${a.slice(2)}`,version:1,surface:"evm-order",action:"order",owner:i,destination:"cowswap",chainId:r,expiresAtMs:Number(e.cowGuard?.expiresAtMs??s+2e4),slippageBps:0,fee:{oracleFeeBps:0},artifact:Object.freeze({kind:"cow",chainId:r,submitTo:`${o}/orders`,quoteId:e.quoteId??null,domain:n.domain,types:n.types,message:n.message,typedData:n})})}async function yS(e={},t={}){let{queueOwnerAction:n}=await Promise.resolve().then(()=>(Jd(),Xd)),r=e.localSignerEnvelope||Ta(e,t);return{...await n(r,t.env),envelope:r,execution:"armed-local",exec:!1}}async function op(e={},t={}){let n=Number(e.chainId??1),r=String(e.uid||e.orderUid||"").trim();if(!r)throw new Error("cowOrderStatus requires uid");return C(`${hi(n,t)}/orders/${encodeURIComponent(r)}/status`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function ip(e={},t={}){let n=Number(e.chainId??1),r=String(e.uid||e.orderUid||"").trim();if(!r)throw new Error("cowOrder requires uid");return C(`${hi(n,t)}/orders/${encodeURIComponent(r)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}function gS(e={}){let t=e.typedData||e,n=Number(e.chainId??t?.domain?.chainId),r=t?.message||e.order||e.message;if(!r)throw new Error("cowswap: typed order message required");let o=e.cowGuard?.typedDataHash||_a.hash(Oa(n),fi,r),i=e.owner||e.from||e.signer||r.receiver;return pS({digest:o,owner:i,validTo:r.validTo})}async function bS(e={},t={}){throw new Error("cowswap.cowSignOrder refused: @oracle-agent/oracle is prepare-only. Sign with the user wallet; do not pass private keys here.")}async function wS(e={},t={}){throw new Error("cowswap.cowSubmitSignedOrder refused: @oracle-agent/oracle is prepare-only. Submit signed orders from the user wallet or local operator.")}function ES(e={}){let t=Number(e.chainId??1),n=qt(e.owner||e.from||e.signer,"owner"),r=(e.orderUids||e.uids||[e.uid]).filter(Boolean).map((s,a)=>rp(s,`orderUids[${a}]`));if(!r.length)throw new Error("cowswap: orderUids required");let o=Oa(t);return ne({provider:"cowswap",chainId:t,owner:n,orderUids:r,signingScheme:"eip712",typedData:{domain:o,types:tp,primaryType:"OrderCancellations",message:{orderUids:r}},cancelReady:!0,executableArtifact:!0},{provider:"cowswap",kind:"cow-cancel"})}async function SS(e={},t={}){throw new Error("cowswap.cowSignCancel refused: @oracle-agent/oracle is prepare-only. Cancel-sign with the user wallet.")}async function AS(e={},t={}){throw new Error("cowswap.cowCancelOrders refused: @oracle-agent/oracle is prepare-only. Cancel from the user wallet or local operator.")}function vS(e={}){return Gn(e.buyAmount??e.executedBuyAmount??"0","trade.buyAmount")}async function xS(e={},t={}){let n=Number(e.chainId??1),r=rp(e.uid||e.orderUid),o=t.order||await ip({chainId:n,uid:r},t),i=t.status||o.status||await op({chainId:n,uid:r},t).catch(()=>null),s=t.trades||await C(`${dS(n,"v2",t)}/trades?orderUid=${encodeURIComponent(r)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),a=Array.isArray(s)?s:[],c=e.expectedOwner?qt(e.expectedOwner,"expectedOwner"):null;if(c&&qt(o.owner||a[0]?.owner||c,"owner")!==c)return{ok:!1,provider:"cowswap",chainId:n,uid:r,reason:"owner mismatch",order:o,status:i,trades:a};let u=0n;for(let f of a.filter(p=>String(p.orderUid||"").toLowerCase()===r))u+=BigInt(vS(f));u===0n&&o.executedBuyAmount!=null&&(u=BigInt(Gn(o.executedBuyAmount,"executedBuyAmount")));let l=e.minBuyAmount!=null?BigInt(Gn(e.minBuyAmount,"minBuyAmount")):0n,d=u>=l&&String(o.status||i?.status||"").toLowerCase()!=="expired";return{ok:d,provider:"cowswap",chainId:n,uid:r,status:o.status||i?.status||null,executedBuyAmount:u.toString(),minBuyAmount:e.minBuyAmount??null,trades:a,settlementTxs:[...new Set(a.map(f=>f.txHash).filter(Boolean))],order:o,orderStatus:i,reason:d?null:"insufficient fill or expired order"}}function kS(){return Object.keys(mi).map(Number)}var mi,Qd,Zd,Ia,ep,fi,tp,yi=_(()=>{G();at();Vd();oi();xe();mi={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"},Qd=Object.freeze({1:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41",100:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41",42161:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41",8453:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41"}),Zd=Object.freeze({1:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110",100:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110",42161:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110",8453:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110"}),Ia={1:"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",8453:"0x4200000000000000000000000000000000000006",42161:"0x82aF49447D8a07e3bd95BD0d56f35241523fBab1"},ep={1:"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",8453:"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",42161:"0xaf88d065e77c8cC2239327C5EDb3A432268e5831"},fi=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"}]}),tp=Object.freeze({OrderCancellations:[{name:"orderUids",type:"bytes[]"}]})});function OS(e={}){return(e.baseUrl||process.env.DEFILLAMA_COINS_URL||IS).replace(/\/$/,"")}function TS(e={}){return(e.baseUrl||process.env.DEFILLAMA_API_URL||_S).replace(/\/$/,"")}async function gi(e,t={}){if(!Array.isArray(e)||!e.length)throw new Error("llamaPrices requires coins[]");let n=e.map(encodeURIComponent).join(",");return C(`${OS(t)}/prices/current/${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function ap(e={}){return C(`${TS(e)}/protocols`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??2e4})}var IS,_S,Ca=_(()=>{G();IS="https://coins.llama.fi",_S="https://api.llama.fi"});var bi={};z(bi,{ACROSS_API:()=>cp,HOP_API:()=>up,RELAY_API:()=>lp,acrossHealth:()=>NS,acrossSuggestedFees:()=>dp,hopHealth:()=>RS,hopQuote:()=>pp,relayHealth:()=>PS,relayPrepare:()=>LS,relayQuote:()=>Na});async function NS(e={}){try{return{ok:!0,estimatedFillTimeSec:(await dp({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 dp(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||cp).replace(/\/$/,"");return C(`${c}/suggested-fees?${a}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function RS(e={}){try{let t=await pp({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 pp(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=$t({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)}),u=(t.baseUrl||process.env.HOP_API_URL||up).replace(/\/$/,""),l=await C(`${u}/quote?${c}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),d=l?.estimatedRecieved||l?.estimatedReceived;return d?ge(l,{chainId:Number(e.originChainId||e.chainId||CS[o]||0),venue:l?.tx?.to||"hop",amountOut:d,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,crossChain:o!==i,requestedCapBps:e.maxSlippageBps??e.slippageBps??s}):{...l,autoSlippagePolicy:a}}async function PS(e={}){try{let t=await Na({user:Jt,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 Na(e={},t={}){let{user:n=Jt,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 u=$t({liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,crossChain:Number(r)!==Number(o),requestedCapBps:e.maxSlippageBps??e.slippageBps});if(!u.executable)throw new Error(`relay: route requires ${u.requiredBps} bps above cap ${u.capBps}`);let l=(t.baseUrl||process.env.RELAY_API_URL||lp).replace(/\/$/,""),d=await C(`${l}/quote`,{method:"POST",body:{user:n,originChainId:Number(r),destinationChainId:Number(o),originCurrency:i,destinationCurrency:s,amount:String(a),tradeType:c,slippageTolerance:String(u.selectedBps)},fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4}),f=d?.details?.currencyOut?.amount;return!f||!/^\d+$/.test(String(f))?{...d,autoSlippagePolicy:u}:ge(d,{chainId:Number(r),venue:d?.steps?.[0]?.items?.[0]?.data?.to||"relay",amountOut:f,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,crossChain:Number(r)!==Number(o),requestedCapBps:e.maxSlippageBps??e.slippageBps})}async function LS(e={},t={}){let n=await Na(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:We(n.autoSlippage,{chainId:r,venue:a.to,data:a.data})}));return ne({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 cp,up,lp,CS,wi=_(()=>{G();at();oi();xe();cp="https://across.to/api",up="https://api.hop.exchange/v1",lp="https://api.relay.link",CS={ethereum:1,optimism:10,bsc:56,polygon:137,arbitrum:42161,avalanche:43114,base:8453}});function Ei(e){if(!Array.isArray(e))return null;let t=0,n=!1;for(let r of e){let o=wt(r?.amountUSD);o!=null&&(t+=o,n=!0)}return n?t:null}async function mp(e,t={}){let n=gd[Number(e)];if(!n)return null;try{let r=await gi([n],t);return wt(r?.coins?.[n]?.price)}catch{return null}}async function $S(e={}){try{let t=await ap({...e,baseUrl:e.defillamaApiBaseUrl,timeoutMs:e.defillamaTimeoutMs??Math.min(Number(e.timeoutMs??5e3),5e3)});return Array.isArray(t)?t:[]}catch{return[]}}function qS(e,t={}){let n=Qt(t.tool||t.provider||t.bridge||t.protocol),r=[];return e==="lifi"&&n&&n!=="lifi"&&r.push(...fp[n]||[n]),r.push(...fp[Qt(e)]||[e]),r}function BS(e,t,n={}){let r=Array.isArray(e)?e:[],o=qS(t,n).map(Qt).filter(Boolean);for(let i of o){let s=r.find(c=>Qt(c?.slug)===i||Qt(c?.name)===i),a=wt(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 u=Qt(c?.category);return!u.includes("bridge")&&!u.includes("crosschain")?!1:Qt(c?.slug).includes(i)||Qt(c?.name).includes(i)}),a=wt(s?.tvl);if(a!=null)return{liquidityUsd:a,protocol:s?.name??s?.slug??i}}return null}function Ra({chainId:e,tokenIn:t,tokenOut:n,amountIn:r,taker:o,slippageBps:i,decimalsIn:s,decimalsOut:a,nativePriceUsd:c=null,destDecimalsPromise:u=null,v4PoolKey:l=null,v4PoolId:d=null,v4LiquidityUsd:f=null,opts:p={}}){let m=[];return m.push({source:"lifi",run:async()=>{let y=await wn({fromChain:e,toChain:e,fromToken:t,toToken:n,fromAmount:r},p),h=y?.estimate??y?.[0]?.estimate;return{amountOut:h?.toAmount,minOut:h?.toAmountMin,gasUsd:Ei(h?.gasCosts),feeUsd:Ei(h?.feeCosts),oracleFeeBps:y?.oracleFee?.applies?y.oracleFee.bps:0,meta:{tool:y?.tool??y?.toolDetails?.name,oracleFee:y?.oracleFee??null}}}}),s!=null&&m.push({source:"paraswap",run:async()=>{let y=a??(await Promise.resolve(u))?.decimals;if(y==null)throw new Error("paraswap needs destination decimals; none supplied or resolvable");let h=await Hn({chainId:e,srcToken:t,destToken:n,amount:r,srcDecimals:s,destDecimals:y},p),w=h?.priceRoute;return{amountOut:w?.destAmount,gasUsd:wt(w?.gasCostUSD),oracleFeeBps:h?.oracleFee?.applies?h.oracleFee.bps:0,meta:{bestRoute:w?.bestRoute?.[0]?.swaps?.[0]?.swapExchanges?.[0]?.exchange,oracleFee:h?.oracleFee??null}}}}),process.env.ZEROX_API_KEY&&m.push({source:"0x",run:async()=>{let y=await zn({chainId:e,sellToken:t,buyToken:n,sellAmount:r,taker:o},p),h=null,w=y?.totalNetworkFee,v=await Promise.resolve(c);return w!=null&&v&&(h=Number(w)/1e18*v),{amountOut:y?.buyAmount,minOut:y?.minBuyAmount,gasUsd:h,meta:{source:y?.route?.fills?.[0]?.source}}}}),process.env.ONEINCH_API_KEY&&m.push({source:"1inch",run:async()=>{let y=await Hd({chainId:e,src:t,dst:n,amount:r},p),h=null;return y?.gas!=null&&c&&(h=null),{amountOut:y?.dstAmount,gasUsd:h,meta:{gasUnits:y?.gas}}}}),m.push({source:"cow",run:async()=>{let y=await En({chainId:e,sellToken:t,buyToken:n,sellAmountBeforeFee:String(r),from:o},p),h=y?.quote??y,w=h?.feeAmount;return{amountOut:h?.buyAmount,gasUsd:0,meta:{intent:!0,feeAmountInSellToken:w,settlement:"solver-executed"}}}}),Ge[Number(e)]&&m.push({source:"uniswap-v4",run:async()=>{let y=l&&typeof l=="object"?{fee:l.fee,tickSpacing:l.tickSpacing,hooks:l.hooks,poolKey:l,poolId:d,liquidityUsd:f}:{},h=await ei({chainId:e,tokenIn:t,tokenOut:n,amountIn:r,...y},p);return{amountOut:h?.amountOut,minOut:h?.minOut??h?.amountOutMinimum??null,gasUsd:null,liquidityUsd:h?.liquidityUsd??null,meta:{onchain:!0,venue:"uniswap-v4",fee:h?.fee,tickSpacing:h?.tickSpacing,poolId:h?.poolId,hooks:h?.hooks,gasUnits:h?.gasEstimate,quoter:h?.quoter,poolManager:h?.poolManager,prepareReady:h?.prepareReady===!0,executionReady:!1}}}}),ke[Number(e)]&&m.push({source:"uniswap-v3",run:async()=>{let y=await gn({chainId:e,tokenIn:t,tokenOut:n,amountIn:r},p);return{amountOut:y?.amountOut,minOut:y?.minOut??y?.amountOutMinimum??null,gasUsd:null,liquidityUsd:y?.liquidityUsd??null,meta:{onchain:!0,fee:y?.fee,gasUnits:y?.gasEstimate,quoter:y?.quoter}}}}),m}function hp({fromChainId:e,toChainId:t,tokenIn:n,tokenOut:r,amountIn:o,taker:i,opts:s={}}){let a=[],c=null,u=async(l,d={})=>(c||=$S(s),BS(await c,l,d));return a.push({source:"lifi",run:async()=>{let l=await wn({fromChain:e,toChain:t,fromToken:n,toToken:r,fromAmount:o},s),d=l?.estimate??l?.[0]?.estimate,f={tool:l?.tool??l?.toolDetails?.name,durationSeconds:wt(d?.executionDuration)},p=await u("lifi",f);return{amountOut:d?.toAmount,minOut:d?.toAmountMin,gasUsd:Ei(d?.gasCosts),feeUsd:Ei(d?.feeCosts),oracleFeeBps:l?.oracleFee?.applies?l.oracleFee.bps:0,liquidityUsd:p?.liquidityUsd??null,meta:{...f,liquidityProtocol:p?.protocol,oracleFee:l?.oracleFee??null}}}}),a.push({source:"relay",run:async()=>{let{relayQuote:l}=await Promise.resolve().then(()=>(wi(),bi)),f=(await l({user:i,originChainId:e,destinationChainId:t,originCurrency:n,destinationCurrency:r,amount:String(o)},s))?.details,p={durationSeconds:wt(f?.timeEstimate),rate:f?.rate},m=await u("relay",p);return{amountOut:f?.currencyOut?.amount,minOut:f?.currencyOut?.minimumAmount,gasUsd:wt(f?.totalImpact?.usd)!=null?Math.abs(wt(f.totalImpact.usd)):null,liquidityUsd:m?.liquidityUsd??null,meta:{...p,liquidityProtocol:m?.protocol}}}}),a.push({source:"across",run:async()=>{let{acrossSuggestedFees:l}=await Promise.resolve().then(()=>(wi(),bi)),d=await l({token:n,destinationToken:r,originChainId:e,destinationChainId:t,amount:String(o)},s),f=d?.totalRelayFee?.total,p=null;if(f!=null)try{let y=BigInt(String(o))-BigInt(String(f));y>0n&&(p=y.toString())}catch{}let m=await u("across");return{amountOut:p,gasUsd:null,liquidityUsd:m?.liquidityUsd??null,meta:{derivedFromFees:!0,durationSeconds:wt(d?.estimatedFillTimeSec),limits:d?.limits?{min:d.limits.minDeposit,max:d.limits.maxDeposit}:void 0,liquidityProtocol:m?.protocol}}}}),a}var wt,Qt,fp,yp=_(()=>{Mr();ai();li();zd();yi();qr();ti();Ca();wa();wt=e=>{let t=Number(e);return Number.isFinite(t)?t:null};Qt=e=>String(e??"").toLowerCase().replace(/[^a-z0-9]/g,""),fp=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"]})});var bp={};z(bp,{QUALITY:()=>ct,bestBridgeRoute:()=>Hr,bestSwapRoute:()=>Kn,formatComparisonNote:()=>Si});async function gp(e,t,n){let r=US[Number(e)];if(!r)return{priceUsd:null,decimals:null};let o=`${r}:${t}`;try{let s=(await gi([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 Kn(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=mp(n,t),a=gp(n,o,t),c=ql(n,t).catch(()=>null),u=Ra({...e,nativePriceUsd:s,decimalsOut:e.decimalsOut,destDecimalsPromise:a,opts:t}),[l,d,f]=await Promise.all([ri(u,{timeoutMs:t.timeoutMs??12e3}),a,c]);s.catch(()=>{});let p=await s.then(h=>h,()=>null),m=ba(l,{destPriceUsd:d.priceUsd,destDecimals:e.decimalsOut??d.decimals,liquidityBandBps:t.liquidityBandBps??50,gasPriceWei:f,nativePriceUsd:p}),y=t.maxImpactPct===void 0?25:t.maxImpactPct;if(y!=null&&m.best){let h=m.best.source,v=await bd(async T=>{let S=Ra({...e,amountIn:T.toString(),nativePriceUsd:s,decimalsOut:e.decimalsOut,destDecimalsPromise:a,opts:t}).filter(x=>x.source===h);return S.length?(await ri(S,{timeoutMs:t.timeoutMs??12e3}))?.[0]?.amountOut??null:null},i);if(v){let T=wd(m,{[h]:v},{maxImpactPct:y});return{kind:"swap",chainId:n,tokenIn:r,tokenOut:o,amountIn:String(i),...T,sourcesTried:u.length,sourcesAnswered:l.filter(S=>S.quality!==ct.FAILED).length,note:Si(T,u.length),priceImpact:{[h]:Number(v.impactPct.toFixed(2))}}}}return{kind:"swap",chainId:n,tokenIn:r,tokenOut:o,amountIn:String(i),...m,sourcesTried:u.length,sourcesAnswered:l.filter(h=>h.quality!==ct.FAILED).length,note:Si(m,u.length)}}async function Hr(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=gp(r,i,t),c=hp({...e,opts:t}),[u,l]=await Promise.all([ri(c,{timeoutMs:t.timeoutMs??15e3}),a]),d=ba(u,{destPriceUsd:l.priceUsd,destDecimals:e.decimalsOut??l.decimals,liquidityBandBps:t.liquidityBandBps??50}),f=d.routes.map(p=>({source:p.source,seconds:p.meta?.durationSeconds??null})).filter(p=>p.seconds!=null);return{kind:"bridge",fromChainId:n,toChainId:r,tokenIn:o,tokenOut:i,amountIn:String(s),...d,durations:f,sourcesTried:c.length,sourcesAnswered:u.filter(p=>p.quality!==ct.FAILED).length,note:Si(d,c.length)}}function MS(e){let t=e?.meta?.oracleFee;return t?.applies?` \xB7 ${kd(t)}`:""}function Si(e,t){if(!e.best)return"no source returned a usable route";let n=e.routes.length,r=MS(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 US,Yn=_(()=>{wa();yp();si();Ca();it();US={1:"ethereum",10:"optimism",56:"bsc",137:"polygon",8453:"base",42161:"arbitrum",43114:"avax"}});var Ep={};z(Ep,{ARTIFACT:()=>Bt,prepareBestRoute:()=>wp,supportedPreparers:()=>FS});function FS(){return Object.keys(Ai)}async function wp(e,t={}){if(zS.some(h=>Object.hasOwn(e,h)))throw new Error("unsupported operation shape is inspect/quote-only");if(e.hookData!=null&&String(e.hookData).toLowerCase()!=="0x")throw new Error("opaque hookData is inspect/quote-only");let{taker:n}=e;if(!n)throw new Error("prepareBestRoute requires taker: a prepared transaction is built FOR an address, and the quote-only placeholder must never end up in one");if(!HS.test(n))throw new Error(`taker must be a valid 20-byte address, got "${n}"`);if(jS.has(n.toLowerCase()))throw new Error(`taker "${n}" is a placeholder/burn address. It is valid for quoting but not for preparing -- that would build a transaction for an address nobody controls. Pass the real wallet that will sign.`);let r=await Kn(e,t);if(!r.best){let h=r.impactRejected??[];return{ok:!1,reason:h.length?h[0].reason:"no source returned a usable route",priceImpactBlocked:h.length>0,impactRejected:h,comparison:r}}let o=e.source||r.best.source,i=r.routes.find(h=>h.source===o);if(!i)return{ok:!1,reason:`source "${o}" did not return a usable route`,comparison:r};let s=Ai[o];if(!s){let h=r.routes.find(w=>Ai[w.source]&&w.source!==o);return{ok:!1,reason:`${o} won the comparison but has no prepare path in this build. `+(h?`Next preparable route is ${h.source}; pass source:"${h.source}" to use it.`:"No route in this comparison can be prepared."),comparison:r,winner:o}}let a;try{a=await s(e,t)}catch(h){let w=typeof h?.body=="string"?h.body:h?.body?JSON.stringify(h.body):"",v=[String(h?.message||h),w].filter(Boolean).join(" :: "),T=/allowance/i.test(v),S=!T&&/not enough|insufficient|balance/i.test(v),k,x;T?(x="approval-required-first",k=`${o} will not build swap calldata until the token approval exists on-chain. Approve the spender first, then prepare again. Underlying: ${v}`):S?(x="taker-not-funded",k=`${o} refused to build the transaction: ${v}. This venue verifies the taker holds the input token. Quoting works for any address; preparing needs the real funded wallet.`):(x="provider-error",k=`${o} prepare failed: ${v}`);let E=r.routes.find(b=>Ai[b.source]&&b.source!==o);return{ok:!1,reason:k,failureKind:x,...E?{alternative:E.source}:{},comparison:r}}let c=e.driftToleranceBps??DS,u=null,l=null;if(a.amountOut!=null&&i.grossOut!=null)try{let h=BigInt(i.grossOut),w=BigInt(a.amountOut);h>0n&&(u=Number((w-h)*10000n/h),u<-c&&(l=`route moved ${(u/100).toFixed(2)}% against you between the comparison and this prepare (tolerance ${(c/100).toFixed(2)}%). The ranking may no longer hold -- re-run the comparison before signing.`))}catch{}let d=r.routes.filter(h=>h.source!==o).map(h=>({source:h.source,netOut:h.netOut,gasUsd:h.gasUsd})),p=r.routes.map(h=>({source:h.source,liquidityUsd:h.liquidityUsd??null})).reduce((h,w)=>Math.max(h,w.liquidityUsd??0),0)||null,m=i.liquidityUsd??null,y=m!=null&&p>0?Math.round(m/p*100):null;return ne({ok:!0,chosen:{source:o,wasWinner:o===r.best.source,netOut:i.netOut,grossOut:i.grossOut,gasUsd:i.gasUsd,liquidityUsd:i.liquidityUsd??null},liquidity:{chosenUsd:m,maxUsd:p,sharePct:y},priceImpact:r.priceImpact??null,impactUnmeasured:r.impactUnmeasured??[],...a,unsigned:!0,signedBy:"user-wallet",destination:a.artifactKind===Bt.TRANSACTION?a.transaction?.to??null:a.settlement??null,driftBps:u,warnings:[...l?[l]:[],...r.warnings||[],...a.artifactKind===Bt.TYPED_DATA_ORDER?["This is an ORDER to sign, not a transaction to broadcast. Signing it authorizes a solver to settle on your behalf."]:[]],runnersUp:d,comparison:{rankedOn:r.rankedOn,sourcesAnswered:r.sourcesAnswered,sourcesTried:r.sourcesTried,improvementBps:r.improvementBps},note:"UNSIGNED. Verify the destination address and minOut against a fresh quote immediately before signing -- a quote-time minimum is not a minimum at broadcast time."},{provider:"router",kind:"best-route"})}var Bt,DS,Ai,jS,HS,zS,Pa=_(()=>{Yn();xe();Bt=Object.freeze({TRANSACTION:"unsigned-transaction",TYPED_DATA_ORDER:"typed-data-order"}),DS=100,Ai={"uniswap-v3":async({chainId:e,tokenIn:t,tokenOut:n,amountIn:r,taker:o},i)=>{let{uniV3PrepareExactIn:s}=await Promise.resolve().then(()=>(qr(),cd)),a=await s({chainId:e,tokenIn:t,tokenOut:n,amountIn:r,recipient:o},i);return{artifactKind:Bt.TRANSACTION,transaction:a.transaction,requiresApproval:a.requiresApproval??null,amountOut:a.quote?.amountOut??null,minOut:a.quote?.amountOutMinimum??null}},"uniswap-v4":async({chainId:e,tokenIn:t,tokenOut:n,amountIn:r,taker:o,slippageBps:i,deadlineSeconds:s,fee:a,tickSpacing:c,hooks:u},l)=>{let{uniV4PrepareExactIn:d}=await Promise.resolve().then(()=>(ti(),pd)),f=await d({chainId:e,tokenIn:t,tokenOut:n,amountIn:r,recipient:o,slippageBps:i,deadlineSeconds:s,fee:a,tickSpacing:c,hooks:u},l);return{artifactKind:Bt.TRANSACTION,transaction:f.transaction,requiresApproval:f.requiresApproval,amountOut:f.quote?.amountOut??null,minOut:f.quote?.amountOutMinimum??null,prepareReady:!0,executionReady:!1}},lifi:async({chainId:e,tokenIn:t,tokenOut:n,amountIn:r,taker:o},i)=>{let{lifiPrepare:s}=await Promise.resolve().then(()=>(Mr(),xa)),a=await s({fromChain:e,toChain:e,fromToken:t,toToken:n,fromAmount:r,fromAddress:o},i);return{artifactKind:Bt.TRANSACTION,transaction:a.transaction,requiresApproval:a.requiresApproval??null,amountOut:a.quote?.estimate?.toAmount??null,minOut:a.quote?.estimate?.toAmountMin??null}},paraswap:async({chainId:e,tokenIn:t,tokenOut:n,amountIn:r,taker:o,decimalsIn:i,decimalsOut:s},a)=>{let{paraswapPrepare:c}=await Promise.resolve().then(()=>(ai(),Rd)),u=await c({chainId:e,srcToken:t,destToken:n,amount:r,srcDecimals:i,destDecimals:s,userAddress:o,side:"SELL"},a);return{artifactKind:Bt.TRANSACTION,transaction:u.transaction,requiresApproval:u.requiresApproval??null,amountOut:u.quote?.priceRoute?.destAmount??null,minOut:u.quote?.amountOutMinimum??null}},"0x":async({chainId:e,tokenIn:t,tokenOut:n,amountIn:r,taker:o},i)=>{let{zeroxPrepare:s}=await Promise.resolve().then(()=>(li(),Dd)),a=await s({chainId:e,sellToken:t,buyToken:n,sellAmount:r,taker:o},i);return{artifactKind:Bt.TRANSACTION,transaction:a.transaction,requiresApproval:a.requiresApproval??null,amountOut:a.quote?.buyAmount??null,minOut:a.quote?.minBuyAmount??null}},cow:async({chainId:e,tokenIn:t,tokenOut:n,amountIn:r,taker:o},i)=>{let{cowPrepareOrder:s}=await Promise.resolve().then(()=>(yi(),sp)),a=await s({chainId:e,sellToken:t,buyToken:n,sellAmountBeforeFee:String(r),from:o},i);return{artifactKind:Bt.TYPED_DATA_ORDER,typedData:a.typedData,requiresApproval:{token:t,spender:a.vaultRelayer,amount:String(r),note:"CoW pulls funds via the vault relayer, not the settlement contract"},settlement:a.settlement,amountOut:a.quote?.quote?.buyAmount??null,minOut:null,submission:"sign the typed data, then submit the order to the CoW API"}}};jS=new Set(["0x0000000000000000000000000000000000000000","0x000000000000000000000000000000000000dead","0x0000000000000000000000000000000000000001","0x00000000000000000000000000000000000a1ce5"].map(e=>e.toLowerCase())),HS=/^0x[0-9a-fA-F]{40}$/,zS=Object.freeze(["operation","exactOutput","amountOut","multihop","path","positionManager","modifyLiquidities","commands","actions"])});function KS(e,t){return`0x${$a.getAmountsOut}`+tt(e)+tt(64)+tt(t.length)+t.map(zr).join("")}function YS(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 La(e,t="router"){return(e?.venues||[]).find(r=>r.kind===t)?.address??null}function XS(e,t){let n=Number(t);if(!Number.isFinite(n)||n<0)throw new Error("slippageBps must be a non-negative number");if(n>qa)throw new Error(`slippageBps ${n} exceeds the ${qa} 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 xp(e){let{chainId:t,wrappedNative:n}=e;async function r(o,i,s,a){let c=await te(t,"eth_call",[{to:o,data:KS(i,s)},"latest"],a);return YS(c?.result??c)}return{async quote({tokenIn:o,tokenOut:i,amountIn:s,path:a},c={}){let u=La(c.scanner);if(!u)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 l=a||[o,i];if(l.some(f=>!/^0x[0-9a-fA-F]{40}$/.test(f||"")))throw new Error("quote requires valid 20-byte addresses");let d=await r(u,s,l,c);return d?{chainId:t,router:u,path:l,amountIn:String(s),amountOut:d[d.length-1].toString(),hops:l.length-1,evidence:F.LIVE,note:"exact-input quote at current reserves; not a guaranteed fill"}:{chainId:t,router:u,path:l,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=La(a.scanner),u=s||n;if(u&&String(o).toLowerCase()===String(u).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||!u)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 l=await r(c,i,[u,o],a);if(!l)return{chainId:t,token:o,verdict:U.FAIL,evidence:F.LIVE,leg:"buy",reason:"buy leg returned no amounts -- no route in"};let d=l[l.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 f=await r(c,d,[o,u],a);if(!f)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 p=f[f.length-1],m=Number(p*10000n/BigInt(i)),y=U.PASS,h="round trip completes with expected fee/impact loss";return m<5e3?(y=U.FAIL,h=`round trip returns only ${(m/100).toFixed(2)}% -- punitive tax or no real liquidity`):m<9e3&&(y=U.CAUTION,h=`round trip returns ${(m/100).toFixed(2)}% -- transfer tax or thin liquidity at this size`),{chainId:t,token:o,base:u,router:c,verdict:y,reason:h,amountIn:String(i),bought:d.toString(),returned:p.toString(),retentionBps:m,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:u=900,path:l},d={}){let f=d.scanner,p=La(f);if(!p)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 m=l||[o,i],y=await this.quote({tokenIn:o,tokenOut:i,amountIn:s,path:m},d);if(y.evidence!==F.LIVE)throw new Error(`cannot prepare without a live quote (${y.evidence}: ${y.reason??"no reason given"})`);let h=XS(y.amountOut,c);if(h<=0n)throw new Error("computed minOut is zero -- refusing to prepare");let w=BigInt(Math.floor(Date.now()/1e3)+Number(u)),v=n&&m[0].toLowerCase()===n.toLowerCase()&&d.useNative,T=v?`0x${$a.swapExactETHForTokens}`+tt(h)+tt(128)+zr(a)+tt(w)+tt(m.length)+m.map(zr).join(""):`0x${$a.swapExactTokensForTokens}`+tt(s)+tt(h)+tt(160)+zr(a)+tt(w)+tt(m.length)+m.map(zr).join("");return{unsigned:!0,signedBy:"user-wallet",chainId:t,tx:{to:p,data:T,value:v?`0x${BigInt(s).toString(16)}`:"0x0"},guard:{quotedOut:y.amountOut,minOut:h.toString(),slippageBps:c,maxSlippageBps:qa,deadline:w.toString()},requires:v?[]:[{step:"approve",token:m[0],spender:p,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 $a,tt,zr,qa,kp=_(()=>{it();Xt();$a={getAmountsOut:"d06ca61f",swapExactTokensForTokens:"38ed1739",swapExactETHForTokens:"7ff36ab5"},tt=e=>BigInt(e).toString(16).padStart(64,"0"),zr=e=>e.slice(2).toLowerCase().padStart(64,"0");qa=100});function QS(e,t){let n=Number(t);if(!Number.isFinite(n)||n<0)throw new Error("slippageBps must be a non-negative number");if(n>Ua)throw new Error(`slippageBps ${n} exceeds the ${Ua} 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 Ba(e,t){return(e?.venues||[]).find(n=>n.kind===t)?.address??null}function Op(e){let{chainId:t,wrappedNative:n}=e;async function r({quoter:i,tokenIn:s,tokenOut:a,amountIn:c,fee:u},l){let d=`0x${Ip.quoteExactInputSingle}`+Vr(s)+Vr(a)+Sn(c)+Sn(u)+Sn(0),f=await te(t,"eth_call",[{to:i,data:d},"latest"],l).catch(()=>null),p=f?.result??f;if(!p||p==="0x"||p.length<66)return null;let m=BigInt(`0x${p.slice(2,66)}`);return m>0n?m:null}async function o({quoter:i,tokenIn:s,tokenOut:a,amountIn:c},u){let l=await Promise.all(JS.map(async f=>{let p=await r({quoter:i,tokenIn:s,tokenOut:a,amountIn:c,fee:f},u);return{fee:f,amountOut:p?p.toString():null,out:p}})),d=null;for(let f of l)f.out&&(!d||f.out>d.amountOut)&&(d={fee:f.fee,amountOut:f.out});return{best:d,tried:l.map(({fee:f,amountOut:p})=>({fee:f,amountOut:p}))}}return{async quote({tokenIn:i,tokenOut:s,amountIn:a},c={}){let u=Ba(c.scanner,"quoter");if(!u)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 f of[i,s])if(!_p.test(f||""))throw new Error("quote requires valid 20-byte addresses");let{best:l,tried:d}=await o({quoter:u,tokenIn:i,tokenOut:s,amountIn:a},c);return l?{chainId:t,venue:"uniswap-v3",quoter:u,tokenIn:i,tokenOut:s,amountIn:String(a),amountOut:l.amountOut.toString(),fee:l.fee,useNative:!!n&&String(i).toLowerCase()===String(n).toLowerCase(),triedFeeTiers:d,evidence:F.LIVE,note:"exact-input single-hop quote at current tick; not a guaranteed fill"}:{chainId:t,quoter:u,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 u=Ba(c.scanner,"quoter"),l=(e.stableQuoteAssets||[]).map(k=>String(k).toLowerCase()),d=null;!a&&typeof e.resolveQuoteAsset=="function"&&(d=await e.resolveQuoteAsset(i,c).catch(()=>null));let f=String(i).toLowerCase(),p=String(n||"").toLowerCase();if(p&&f===p)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."};let m=a||d||(l[0]&&f!==l[0]?l[0]:null)||n;if(m&&f===String(m).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(!u||!m)return{chainId:t,token:i,verdict:U.UNKNOWN,evidence:F.UNAVAILABLE,reason:u?"no wrappedNative configured, so there is no base asset to round-trip against":"no verified quoter configured for this chain"};let y=await o({quoter:u,tokenIn:m,tokenOut:i,amountIn:s},c);if(!y.best){let k=l.find(x=>x&&x!==String(m).toLowerCase()&&x!==String(i).toLowerCase());if(k){let x=await o({quoter:u,tokenIn:k,tokenOut:i,amountIn:s},c);if(x.best){let E=await o({quoter:u,tokenIn:i,tokenOut:k,amountIn:x.best.amountOut},c);if(E.best){let b=E.best.amountOut,g=Number(b*10000n/BigInt(s)),A=U.PASS,P="round trip vs dollar book completes with expected fee/impact loss";return g<5e3?(A=U.FAIL,P=`round trip vs dollar book returns only ${(g/100).toFixed(2)}% -- punitive tax or no real liquidity`):g<9e3&&(A=U.CAUTION,P=`round trip vs dollar book returns ${(g/100).toFixed(2)}% -- transfer tax or thin liquidity at this size`),{chainId:t,venue:"uniswap-v3",token:i,base:k,quoteAsset:k,verdict:A,reason:P,amountIn:String(s),bought:x.best.amountOut.toString(),returned:b.toString(),retentionBps:g,buyFee:x.best.fee,sellFee:E.best.fee,evidence:F.LIVE,note:"Quoted against the dollar book, not wrapped native. A missing WETH pool is not a honeypot."}}}}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 against wrapped native or the dollar book"}}let h=await o({quoter:u,tokenIn:i,tokenOut:m,amountIn:y.best.amountOut},c);if(!h.best){let k=l.find(x=>x&&x!==String(m).toLowerCase()&&x!==String(i).toLowerCase());if(k){let x=await o({quoter:u,tokenIn:k,tokenOut:i,amountIn:s},c),E=x.best?await o({quoter:u,tokenIn:i,tokenOut:k,amountIn:x.best.amountOut},c):{best:null};if(x.best&&E.best){let b=E.best.amountOut,g=Number(b*10000n/BigInt(s)),A=U.PASS,P="round trip vs dollar book completes; missing WETH sell pool is not a honeypot";return g<5e3?(A=U.FAIL,P=`dollar-book round trip returns only ${(g/100).toFixed(2)}%`):g<9e3&&(A=U.CAUTION,P=`dollar-book round trip returns ${(g/100).toFixed(2)}%`),{chainId:t,venue:"uniswap-v3",token:i,base:k,quoteAsset:k,verdict:A,reason:P,amountIn:String(s),bought:x.best.amountOut.toString(),returned:b.toString(),retentionBps:g,buyFee:x.best.fee,sellFee:E.best.fee,evidence:F.LIVE,note:"Sell vs wrapped native failed; dollar book succeeded. Not labelled honeypot."}}}return{chainId:t,token:i,verdict:U.FAIL,evidence:F.LIVE,leg:"sell",bought:y.best.amountOut.toString(),reason:"SELL LEG FAILED against wrapped native and the dollar book. This is the honeypot signature: do not trade."}}let w=h.best.amountOut,v=Number(w*10000n/BigInt(s)),T=U.PASS,S="round trip completes with expected fee/impact loss";return v<5e3?(T=U.FAIL,S=`round trip returns only ${(v/100).toFixed(2)}% -- punitive tax or no real liquidity`):v<9e3&&(T=U.CAUTION,S=`round trip returns ${(v/100).toFixed(2)}% -- transfer tax or thin liquidity at this size`),{chainId:t,venue:"uniswap-v3",token:i,base:m,verdict:T,reason:S,amountIn:String(s),bought:y.best.amountOut.toString(),returned:w.toString(),retentionBps:v,buyFee:y.best.fee,sellFee:h.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:u=50,fee:l},d={}){let f=Ba(d.scanner,"router");if(!f)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(!_p.test(c||""))throw new Error("prepareUnsignedTx requires a valid recipient address");let p=await this.quote({tokenIn:i,tokenOut:s,amountIn:a},d);if(p.evidence!==F.LIVE)throw new Error(`cannot prepare without a live quote (${p.evidence}: ${p.reason??"no reason given"})`);let m=l??p.fee,y=QS(p.amountOut,u);if(y<=0n)throw new Error("computed minOut is zero -- refusing to prepare");let h=!!(d.useNative||p.useNative)&&n&&String(i).toLowerCase()===String(n).toLowerCase(),w=`0x${Ip.exactInputSingle}`+Vr(i)+Vr(s)+Sn(m)+Vr(c)+Sn(a)+Sn(y)+Sn(0);return{unsigned:!0,signedBy:"user-wallet",chainId:t,venue:"uniswap-v3",tx:{to:f,data:w,value:h?String(a):"0x0"},guard:{quotedOut:p.amountOut,minOut:y.toString(),slippageBps:u,maxSlippageBps:Ua,fee:m},requires:h?[]:[{step:"approve",token:i,spender:f,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 JS,Ip,Sn,Vr,_p,Ua,Tp=_(()=>{it();Xt();JS=[100,500,3e3,1e4],Ip={quoteExactInputSingle:"c6a5026a",exactInputSingle:"04e45aaf"},Sn=e=>BigInt(e).toString(16).padStart(64,"0"),Vr=e=>e.slice(2).toLowerCase().padStart(64,"0"),_p=/^0x[0-9a-fA-F]{40}$/,Ua=100});function Cp(e){if(!e||e==="0x")return null;try{return BigInt(e)}catch{return null}}function Np(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 ZS(e){let{chainId:t}=e;async function n(r,o,i){return te(t,"eth_call",[{to:r,data:o},"latest"],i)}return{async blockNumber(r={}){let o=await zo(t,r);return{chainId:t,blockNumber:o?.blockNumber??o,evidence:F.LIVE}},async nativeBalance(r,o={}){let i=await Bl(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 Ml({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,xi.decimals,o).catch(()=>null),n(r,xi.symbol,o).catch(()=>null),n(r,xi.name,o).catch(()=>null),n(r,xi.totalSupply,o).catch(()=>null)]),u=Cp(i?.result??i),l=u!==null||s?.result||a?.result,d={chainId:t,address:r,decimals:u===null?null:Number(u),symbol:Np(s?.result??s),name:Np(a?.result??a),totalSupply:(Cp(c?.result??c)??null)?.toString()??null,evidence:l?F.LIVE:F.UNKNOWN};return l||(d.warning="no ERC-20 metadata returned -- may not be a token contract"),d},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 Wo(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,d)=>(d.liquidityUsd??0)-(l.liquidityUsd??0)),u=Vo(r,c,{stables:e.stableQuoteAssets||[],wrappedNative:e.wrappedNative});return{chainId:t,token:r,pools:u,topPool:u[0]||null,quoteAsset:Fl(r,u),evidence:u.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 u=[],l=[];for(let f=r;f<=o;f+=a){let p=Math.min(f+a-1,o);l.push([f,p])}let d=await yn(l,4,async([f,p])=>{let m={fromBlock:`0x${f.toString(16)}`,toBlock:`0x${p.toString(16)}`};i&&(m.address=i),s&&(m.topics=s);let y=await te(t,"eth_getLogs",[m],c).catch(h=>({error:String(h?.message||h)}));return{start:f,end:p,res:y}});for(let{start:f,end:p,res:m}of d){if(m?.error)return{chainId:t,fromBlock:r,toBlock:o,logs:u,complete:!1,failedAt:[f,p],error:m.error,evidence:F.UNKNOWN};for(let y of m?.result??m??[])u.push(y)}return{chainId:t,fromBlock:r,toBlock:o,logs:u,complete:!0,chunks:l.length,evidence:F.LIVE}},async scoreRisk(r,o={}){let i=[],s=U.PASS,a=l=>{let d={[U.PASS]:0,[U.CAUTION]:1,[U.UNKNOWN]:2,[U.FAIL]:3};d[l]>d[s]&&(s=l)},[c,u]=await Promise.all([this.resolveToken(r,o),this.resolvePools(r,o)]);if(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`}),u.evidence===F.UNAVAILABLE)i.push({check:"liquidity",result:U.UNKNOWN,detail:u.reason}),a(U.UNKNOWN);else if(!u.pools.length)i.push({check:"liquidity",result:U.FAIL,detail:"no pool with liquidity found"}),a(U.FAIL);else{let l=u.pools[0],d=l.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 ${l.dex}`}),l.createdAt&&Date.now()-l.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 l=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:l.verdict,detail:l.retentionBps!=null?`round trip returns ${(l.retentionBps/100).toFixed(2)}% -- ${l.reason}`:l.reason}),a(l.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 Ma(e){let n={...ZS(e)},r=new Set((e.venues||[]).map(i=>i.kind));e.venueKind==="uniswap-v3"&&r.has("quoter")&&r.has("router")?Object.assign(n,Op({chainId:e.chainId,wrappedNative:e.wrappedNative,stableQuoteAssets:e.stableQuoteAssets||[],resolveQuoteAsset:async(i,s)=>(await n.resolvePools(i,s)).quoteAsset||null})):e.venueKind==="uniswap-v2"&&r.has("router")&&Object.assign(n,xp({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 xi,Rp=_(()=>{it();Lr();G();Xt();kp();Tp();oa();xi={decimals:"0x313ce567",symbol:"0x95d89b41",name:"0x06fdde03",totalSupply:"0x18160ddd",owner:"0x8da5cb5b"}});function ki(){return Zt.map(e=>ni(Ma(e)))}function Pp(e){return ni(Ma(e))}var Zt,Wr=_(()=>{Rp();Xt();Zt=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",stableQuoteAssets:["0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48","0xdAC17F958D2ee523a2206206994597C13D831ec7"],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",stableQuoteAssets:["0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85","0x94b008aA00579c1307B0EF2c499aD98a8ce58e58"],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",stableQuoteAssets:["0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d","0x55d398326f99059fF775485246999027B3197955"],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",stableQuoteAssets:["0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359","0xc2132D05D31c914a87C6611C10748AEb04B58e8F"],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",stableQuoteAssets:["0x5fc5360d0400a0fd4f2af552add042d716f1d168"],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",stableQuoteAssets:["0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"],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",stableQuoteAssets:["0xaf88d065e77c8cC2239327C5EDb3A432268e5831","0xFd086bC7CD5C481DCC9C85ebE478A1C0b69FCbb9"],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",stableQuoteAssets:["0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E"],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 nv({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"?tv:ev}async function Xr(e,t={}){if(!e||!e.type)throw new Error("hlInfo requires body.type");let n=nv(t);return C(n,{method:"POST",body:e,fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function pf(e={}){return Xr({type:"allMids"},e)}async function ff(e={}){return Xr({type:"meta"},e)}async function mf(e={}){let t={type:"metaAndAssetCtxs"};return e.dex&&(t.dex=e.dex),Xr(t,e)}async function hf({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 Xr(i,o)}async function yf({coin:e,startTime:t,endTime:n},r={}){if(!e)throw new Error("hlFundingHistory requires coin");return Xr({type:"fundingHistory",coin:String(e),startTime:t??Date.now()-24*3600*1e3,endTime:n??Date.now()},r)}var ev,tv,Ni=_(()=>{G();ev="https://api.hyperliquid.xyz/info",tv="https://api.hyperliquid-testnet.xyz/info"});import{createHash as rv}from"node:crypto";function St(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function Zn(e){return typeof e=="number"&&Number.isFinite(e)}function Za(e){if(e==null||typeof e!="object"||Object.isFrozen(e))return e;if(Array.isArray(e)){for(let t of e)Za(t);return Object.freeze(e)}for(let t of Object.keys(e))Za(e[t]);return Object.freeze(e)}function vn(e){if(Array.isArray(e))return e.map(vn);if(e!=null&&typeof e=="object"){let t={};for(let n of Object.keys(e).sort())t[n]=vn(e[n]);return t}return e}function Ja(e){return{netPnlUsd:e.metrics.netPnlUsd,netPnlPct:e.metrics.netPnlPct,maxDrawdownPct:e.metrics.maxDrawdownPct,winRate:e.metrics.winRate,profitFactor:e.metrics.profitFactor,tradeCount:e.metrics.tradeCount,sharpe:e.metrics.sharpe,turnoverUsd:e.metrics.turnoverUsd,exposurePct:e.metrics.exposurePct}}function gf(e){return{feesUsd:e.costs.feesUsd,builderFeesUsd:e.costs.builderFeesUsd,fundingUsd:e.costs.fundingUsd,slippageUsd:e.costs.slippageUsd}}function iv(e){return(e.feesUsd||0)+(e.builderFeesUsd||0)+Math.max(0,e.fundingUsd||0)+(e.slippageUsd||0)}function sv(e){let t=0;for(let n of e.trades)n.grossPnlUsd>0&&(t+=n.grossPnlUsd);return t}function av(e,t,n){return!(!e||e.tradeCount<Math.max(1,Math.min(n,3))||!(e.netPnlUsd>0)||!(e.profitFactor>1)||!(e.maxDrawdownPct<=t.maxDailyLossPct))}function wf(e){if(!St(e))throw new TypeError("evidence artifact must be a plain object");if(!ov.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(!St(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(!St(e.walkForward)||!Array.isArray(e.walkForward.windows))throw new TypeError("evidence artifact walkForward windows required");if(e.status==="pass_live_eligible"&&(!St(e.train)||!St(e.holdout)))throw new TypeError("live-eligible evidence artifact requires train and holdout facts");return vn({barsHash:e.barsHash,compilerHash:e.compilerHash,flags:e.flags.map(t=>vn(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 Ef(e){return rv("sha256").update(JSON.stringify(wf(e)),"utf8").digest("hex")}function lt(e,t,n=0){if(!Number.isInteger(e)||e<n)throw new Error(`${t} must be an integer >= ${n}`);return e}function Qa(e,t){if(!St(e)||!St(e.metrics))throw new Error(`${t} metrics required`);let n=lt(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(!Zn(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 cv(e,{maxDailyLossPct:t}={}){let n=e.split,r=lt(n.trainStartIndex,"split.trainStartIndex"),o=lt(n.trainEndIndex,"split.trainEndIndex"),i=lt(n.trainBarCount,"split.trainBarCount",1),s=lt(n.holdoutStartIndex,"split.holdoutStartIndex"),a=lt(n.holdoutEndIndex,"split.holdoutEndIndex"),c=lt(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(!Zn(n.trainFraction)||n.trainFraction<=0||n.trainFraction>=1)throw new Error("split.trainFraction must be in (0,1)");Qa(e.train,"train");let u=Qa(e.holdout,"holdout");if(u.tradeCount<1||u.netPnlUsd<=0||u.profitFactor<=1)throw new Error("live-eligible holdout metrics do not pass");if(Zn(t)&&u.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 l=e.walkForward,d=l.windows;if(d.length<1||l.windowsRun!==d.length)throw new Error("live-eligible walk-forward windowsRun must match nonempty windows");let f=0,p=-1;for(let y=0;y<d.length;y++){let h=d[y];if(!St(h)||h.index!==y||typeof h.passed!="boolean")throw new Error("walk-forward windows must be ordered and structurally valid");let w=lt(h.trainStartIndex,`walkForward.windows[${y}].trainStartIndex`),v=lt(h.trainEndIndex,`walkForward.windows[${y}].trainEndIndex`),T=lt(h.evalStartIndex,`walkForward.windows[${y}].evalStartIndex`),S=lt(h.evalEndIndex,`walkForward.windows[${y}].evalEndIndex`);if(w!==0||v>=T||T>S||T<=p)throw new Error("walk-forward windows must be chronological and disjoint");if(p=S,h.passed){if(f+=1,h.reason!=="pass")throw new Error("passed walk-forward window reason must be pass");let k=Qa({metrics:h.metrics,tradeCount:h.metrics?.tradeCount},`walkForward.windows[${y}]`);if(k.tradeCount<1||k.netPnlUsd<=0||k.profitFactor<=1)throw new Error("passed walk-forward window metrics do not pass");if(Zn(t)&&k.maxDrawdownPct>t)throw new Error("passed walk-forward drawdown exceeds strategy risk")}else if(h.reason==="pass")throw new Error("failed walk-forward window cannot have pass reason")}let m=f/d.length;if(!Zn(l.passRate)||Math.abs(l.passRate-m)>Number.EPSILON||m<.6)throw new Error("walk-forward passRate contradicts concrete windows or is below live threshold")}function Sf(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=wf(e),r=vn({id:e.id,...n});if(JSON.stringify(vn(e))!==JSON.stringify(r))throw new Error("evidence artifact contains fields unbound from its deterministic identity");let o=Ef(e);if(e.id!==o)throw new Error("evidence.id does not match its deterministic artifact facts digest");return e.status==="pass_live_eligible"&&cv(e,t),e}function ec({strategy:e,bars:t,backtestOptions:n={},trainFraction:r=.7,walkForwardWindows:o=3,minTrades:i=10}={}){let s=[];if(!St(e))throw new TypeError("strategy must be a plain object");if(!Array.isArray(t))throw new TypeError("bars must be an array");if(!St(n))throw new TypeError("backtestOptions must be a plain object");if(!Zn(r)||r<=0||r>=1)throw new TypeError("trainFraction must be in (0,1)");if(!Number.isInteger(o)||o<1)throw new TypeError("walkForwardWindows must be a positive integer");if(!Number.isInteger(i)||i<0)throw new TypeError("minTrades must be an integer >= 0");let a=Ne(e),c=er(a),u=Jr(t),l=t.length,d=(D=[],M={})=>bf({status:"fail",strategy:a,sHash:c,barsHash:u,split:M.split||{trainStartIndex:0,trainEndIndex:-1,trainBarCount:0,holdoutStartIndex:0,holdoutEndIndex:-1,holdoutBarCount:0,trainFraction:r},train:M.train||null,holdout:M.holdout||null,walkForward:M.walkForward||{windows:[],passRate:0},flags:[...s,...D]});if(l<10)return d([{type:"insufficient_bars",message:"need at least 10 bars for evidence"}]);let f=Math.floor(l*r),p=f,m=l-p;if(f<5||m<3)return d([{type:"invalid_windowing",message:"train/holdout split too small",trainCount:f,holdoutCount:m}]);let y=t.slice(0,f),h=t.slice(p),w,v;try{w=nn(a,y,n),v=nn(a,h,n)}catch(D){return d([{type:"backtest_error",message:String(D.message||D)}])}let T={metrics:Ja(w),costs:gf(w),tradeCount:w.metrics.tradeCount},S={metrics:Ja(v),costs:gf(v),tradeCount:v.metrics.tradeCount},k={trainStartIndex:0,trainEndIndex:f-1,trainBarCount:f,holdoutStartIndex:p,holdoutEndIndex:l-1,holdoutBarCount:m,trainFraction:r},x=[],E=Math.floor(l/(o+1));if(E<3)s.push({type:"invalid_windowing",message:"walk-forward window size too small",wfSize:E});else for(let D=0;D<o;D++){let M=E*(D+1),Q=M,Y=Math.min(l,Q+E);if(Y-Q<3||M<3){x.push({index:D,trainStartIndex:0,trainEndIndex:M-1,evalStartIndex:Q,evalEndIndex:Y-1,passed:!1,reason:"window_too_small",metrics:null});continue}let Ue=t.slice(Q,Y),le;try{le=nn(a,Ue,n)}catch{x.push({index:D,trainStartIndex:0,trainEndIndex:M-1,evalStartIndex:Q,evalEndIndex:Y-1,passed:!1,reason:"backtest_error",metrics:null});continue}let Wt=Ja(le),Gt=av(Wt,a.risk,i);x.push({index:D,trainStartIndex:0,trainEndIndex:M-1,evalStartIndex:Q,evalEndIndex:Y-1,passed:Gt,reason:Gt?"pass":"fail_metrics",metrics:Wt})}let b=x.filter(D=>D.passed).length,g=x.length===0?0:b/x.length,A={windows:x,passRate:g,windowsRun:x.length};S.metrics.tradeCount===0&&T.metrics.tradeCount===0&&s.push({type:"no_trades",message:"no trades in train or holdout"}),S.metrics.tradeCount===0&&s.push({type:"absent_oos_trades",message:"holdout produced no trades"}),S.metrics.netPnlUsd<0&&s.push({type:"holdout_loss",message:"holdout netPnlUsd is negative"}),T.metrics.netPnlUsd>0&&S.metrics.netPnlUsd<0&&T.metrics.netPnlUsd>Math.abs(S.metrics.netPnlUsd)*.25?s.push({type:"overfit",message:"profitable train with losing holdout (OOS collapse)"}):T.metrics.netPnlUsd>0&&S.metrics.netPnlUsd>0&&S.metrics.netPnlUsd<T.metrics.netPnlUsd*.1&&T.metrics.tradeCount>=i&&s.push({type:"severe_oos_collapse",message:"holdout pnl collapsed vs train"});let P=iv(S.costs),I=sv(v);I>0&&P>I&&s.push({type:"costs_exceed_gross",message:"holdout costs exceed gross gains"});let L=s.some(D=>["insufficient_bars","invalid_windowing","absent_oos_trades","holdout_loss","no_trades","severe_oos_collapse","backtest_error"].includes(D.type)),q=s.some(D=>D.type==="overfit"),j="fail";return S.metrics.tradeCount>=i&&S.metrics.netPnlUsd>0&&S.metrics.profitFactor>1&&S.metrics.maxDrawdownPct<=a.risk.maxDailyLossPct&&g>=.6&&!(I>0&&P>I)&&!q&&!s.some(D=>D.type==="severe_oos_collapse"||D.type==="invalid_windowing")?j="pass_live_eligible":!L&&S.metrics.tradeCount>0&&T.metrics.tradeCount>0&&Number.isFinite(S.metrics.netPnlUsd)?(j="pass_paper_only",S.metrics.tradeCount<i&&s.push({type:"undersampled",message:"holdout trades below minTrades"})):q&&S.metrics.tradeCount>0&&T.metrics.netPnlUsd>0?j="fail":S.metrics.tradeCount>0&&T.metrics.tradeCount>0&&!L?j="pass_paper_only":j="fail",S.metrics.netPnlUsd<0&&(j=j==="pass_live_eligible"?"fail":j==="pass_paper_only"?"pass_paper_only":"fail",j="fail"),bf({status:j,strategy:a,sHash:c,barsHash:u,split:k,train:T,holdout:S,walkForward:A,flags:s})}function bf({status:e,strategy:t,sHash:n,barsHash:r,split:o,train:i,holdout:s,walkForward:a,flags:c}){let u={status:e,strategyHash:n,compilerHash:kn,barsHash:r,split:o,train:i,holdout:s,walkForward:a,flags:c};return u.id=Ef(u),Za(vn(JSON.parse(JSON.stringify(u))))}var ov,tc=_(()=>{In();xn();Ri();ov=Object.freeze(["fail","pass_paper_only","pass_live_eligible"])});function Qr(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function lv(e){return String(e).toLowerCase().replace(/[^a-z0-9]/g,"")}function rc(e,t="value"){if(Array.isArray(e)){e.forEach((n,r)=>rc(n,`${t}[${r}]`));return}if(Qr(e))for(let[n,r]of Object.entries(e)){let o=lv(n);if(uv.some(i=>o.includes(i)))throw new Error(`handoff: forbidden secret-like field at ${t}.${n}`);rc(r,`${t}.${n}`)}}function nc(e){return typeof e=="number"&&Number.isFinite(e)&&e>0}function Af({strategy:e,evidence:t,shadow:n,caps:r,nowMs:o=Date.now(),env:i=process.env}={}){if(rc({strategy:e,evidence:t,shadow:n,caps:r},"handoff"),!Qr(e))throw new Error("handoff: strategy required");if(!Qr(t))throw new Error("handoff: evidence required");if(!Qr(n))throw new Error("handoff: shadow required");if(!Qr(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=Ne(e,{nowMs:o}),a=Re(s);if(Sf(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 f of c)if(!(f in r)||r[f]==null)throw new Error(`handoff: caps.${f} required`);if(!nc(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(!nc(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(!nc(r.dailyLossCapUsd))throw new Error("handoff: caps.dailyLossCapUsd must be positive");let u=a.strategy.risk.maxNotionalUsd*(a.strategy.risk.maxDailyLossPct/100);if(r.dailyLossCapUsd>u)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(f=>f==="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 l={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:Zr,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:l},requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,executionReady:!1};return ne(d,{provider:"hl-strategy",kind:"strategy-live-handoff",env:i})}var uv,vf=_(()=>{In();tc();xn();xe();uv=["privatekey","secretkey","seed","mnemonic","passphrase","password","keystore","keymaterial","apikey","authtoken","accesstoken","refreshtoken","credential","bearer","signature","authorization","xprv","xpriv","wif"]});function tr(e,t){let n=Number(e);if(!Number.isFinite(n))throw new TypeError(`${t} must be finite`);return n}function nr(e,t){if(!Number.isSafeInteger(e)||e<0)throw new TypeError(`${t} must be a non-negative safe integer`);return e}function eo(e){if(Array.isArray(e))for(let t of e)eo(t);else if(e&&typeof e=="object")for(let t of Object.values(e))eo(t);return Object.freeze(e)}function pv(e){let t=dv[e];if(!t)throw new TypeError(`unsupported strategy interval: ${e}`);return t}function fv(e,{endTime:t=Number.MAX_SAFE_INTEGER}={}){if(!Array.isArray(e))throw new TypeError("Hyperliquid candles must be an array");nr(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=nr(Number(o.t),`candles[${r}].t`);if(nr(Number(o.T),`candles[${r}].T`)>t)continue;let a={t:i,o:tr(o.o,`candles[${r}].o`),h:tr(o.h,`candles[${r}].h`),l:tr(o.l,`candles[${r}].l`),c:tr(o.c,`candles[${r}].c`),v:tr(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 eo([...n.values()].sort((r,o)=>r.t-o.t))}function mv(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=nr(Number(o.time),`funding[${r}].time`);i>t||n.set(i,{time:i,fundingRate:tr(o.fundingRate,`funding[${r}].fundingRate`)})}return[...n.values()].sort((r,o)=>r.time-o.time)}async function hv({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 yf({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 u=i;for(let l of c){let d=Number(l?.time);Number.isSafeInteger(d)&&d>u&&(u=d)}if(c.length<500||u>=n){s=!0;break}if(u<=i)throw new Error("Hyperliquid funding history pagination did not advance");i=u+1}if(!s)throw new Error("strategy history exceeds the bounded funding history limit");return mv(o,n)}function yv(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 xf(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=pv(r);if(e.endTime==null)throw new TypeError("endTime is required for deterministic history");let i=nr(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):nr(e.startTime,"startTime");if(a>=i)throw new TypeError("startTime must be before endTime");let[c,u]=await Promise.all([hf({coin:n,interval:r,startTime:a,endTime:i},t),hv({coin:n,startTime:a,endTime:i},t)]),l=fv(c,{endTime:i}),d=eo(yv(l,u,o));return eo({coin:n,interval:r,range:{startTime:a,endTime:i},bars:d})}var dv,kf=_(()=>{Ni();dv=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 wv(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))bv.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"||!gv.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 Ev(e={}){let t=await ff(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 gv,bv,If,_f=_(()=>{Ni();vf();kf();gv=new Set(["1m","3m","5m","15m","30m","1h","2h","4h","8h","12h","1d"]),bv=new Set(["coin","interval"]);If=Object.freeze({id:"hyperliquid",validateMarket:wv,fetchBars:xf,listMarkets:Ev,prepareIntent(e){return Af(e)}})});function Av(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 Sv.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}function oc(e){return typeof e!="string"?null:vv.get(e)??null}function ic(e){let t=oc(e);if(!t)throw new Error(`unknown strategy venue: ${String(e)}`);return t}var Sv,Of,vv,g$,sc=_(()=>{_f();Sv=Object.freeze(["id","validateMarket","prepareIntent"]);Of=[If].map(Av),vv=new Map(Of.map(e=>[e.id,e])),g$=Object.freeze([...Of])});import{createHash as xv}from"node:crypto";function nt(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function ce(e){return typeof e=="number"&&Number.isFinite(e)}function qf(e){return Number.isInteger(e)&&e>0}function dc(e){if(e==null||typeof e!="object"||Object.isFrozen(e))return e;if(Array.isArray(e)){for(let t of e)dc(t);return Object.freeze(e)}for(let t of Object.keys(e))dc(e[t]);return Object.freeze(e)}function pc(e){if(Array.isArray(e))return e.map(pc);if(e!=null&&typeof e=="object"){let t={};for(let n of Object.keys(e).sort())t[n]=pc(e[n]);return t}return e}function N(e,t,n){e.push({path:t,message:n})}function rn(e,t,n,r){for(let o of Object.keys(e))t.has(o)||N(r,n?`${n}.${o}`:o,"unknown field is not allowed")}function Df(e,t,n,r){if(!ce(e)||!ce(t)||!ce(n)||!ce(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 lc(e,t,n,r){if(nt(e)){if(rn(e,new Set(["param"]),t,r),typeof e.param!="string"||!e.param)return N(r,`${t}.param`,"must be a parameter name string"),null;if(!Object.prototype.hasOwnProperty.call(n,e.param))return N(r,`${t}.param`,`unknown parameter "${e.param}"`),null;let o=n[e.param];return!nt(o)||![o.value,o.min,o.max,o.step].every(qf)?(N(r,`${t}.param`,"referenced period parameter value min max and step must be positive integers"),null):{param:e.param}}return qf(e)?e:(N(r,t,"must be a positive integer or {param}"),null)}function Bf(e,t,n,r){return nt(e)?(rn(e,new Set(["param"]),t,r),typeof e.param!="string"||!e.param?(N(r,`${t}.param`,"must be a parameter name string"),null):Object.prototype.hasOwnProperty.call(n,e.param)?{param:e.param}:(N(r,`${t}.param`,`unknown parameter "${e.param}"`),null)):ce(e)?e:(N(r,t,"must be a finite number or {param}"),null)}function Pi(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 Pv(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 Pi(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 Lv(e,t){if(!nt(e))return N(t,"parameters","must be a plain object"),null;let n=Object.keys(e);if(n.length>Pf)return N(t,"parameters",`too many parameters (max ${Pf})`),null;let r={};for(let o of n){if(!Uf.test(o)){N(t,`parameters.${o}`,"parameter name is malformed");continue}let i=e[o],s=`parameters.${o}`;if(!nt(i)){N(t,s,"must be a plain object");continue}rn(i,Cf,s,t);for(let d of Cf)d in i||N(t,`${s}.${d}`,"required field is missing");let{value:a,min:c,max:u,step:l}=i;ce(c)||N(t,`${s}.min`,"must be a finite number"),ce(u)||N(t,`${s}.max`,"must be a finite number"),(!ce(l)||l<=0)&&N(t,`${s}.step`,"must be a positive finite number"),ce(a)||N(t,`${s}.value`,"must be a finite number"),ce(c)&&ce(u)&&c>u&&N(t,`${s}.min`,"min must be <= max"),ce(a)&&ce(c)&&ce(u)&&ce(l)&&l>0&&(Df(a,c,u,l)||N(t,`${s}.value`,"value must lie on the declared min/max/step grid")),r[o]={value:a,min:c,max:u,step:l}}return r}function $v(e,t,n,r){let o=`nodes.${t}`;if(!nt(e))return N(r,o,"must be a plain object"),null;if(typeof e.type!="string"||!Rf[e.type])return N(r,`${o}.type`,"unknown or missing node type"),rn(e,Rv,o,r),null;switch(rn(e,Rf[e.type],o,r),(typeof e.id!="string"||!Mf.test(e.id))&&N(r,`${o}.id`,"must be a 1-64 char id starting with alphanumeric"),e.type){case"input":return(typeof e.field!="string"||!kv.has(e.field))&&N(r,`${o}.field`,"must be one of open|high|low|close|volume|fundingRate|openInterest|premium|oiDelta|bookImbalance"),{id:e.id,type:"input",field:e.field};case"constant":{let i=Bf(e.value,`${o}.value`,n,r);return{id:e.id,type:"constant",value:i}}case"indicator":{(typeof e.indicator!="string"||!Iv.has(e.indicator))&&N(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?N(r,`${o}.input`,"must be a node id string when provided"):s.input=e.input);let a=lc(e.period,`${o}.period`,n,r);a!=null&&(s.period=a)}else typeof e.input!="string"||!e.input?N(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))N(r,`${o}.period`,"required field is missing");else{let a=lc(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))N(r,`${o}.${a}`,"required field is missing");else{let c=lc(e[a],`${o}.${a}`,n,r);c!=null&&(s[a]=c)}"output"in e?Cv.has(e.output)?s.output=e.output:N(r,`${o}.output`,"must be line|signal|histogram"):N(r,`${o}.output`,"required field is missing"),"period"in e&&N(r,`${o}.period`,"forbidden for macd"),"stdDev"in e&&N(r,`${o}.stdDev`,"forbidden for macd")}else if(i==="bollinger"){if(!("stdDev"in e))N(r,`${o}.stdDev`,"required field is missing");else{let a=Bf(e.stdDev,`${o}.stdDev`,n,r);a!=null&&(typeof a=="number"&&a<=0?N(r,`${o}.stdDev`,"must be > 0"):s.stdDev=a)}"output"in e?Nv.has(e.output)?s.output=e.output:N(r,`${o}.output`,"must be upper|middle|lower"):N(r,`${o}.output`,"required field is missing");for(let a of["fastPeriod","slowPeriod","signalPeriod"])a in e&&N(r,`${o}.${a}`,`forbidden for ${i}`)}else{"output"in e&&N(r,`${o}.output`,`forbidden for ${i}`),"stdDev"in e&&i!=="bollinger"&&N(r,`${o}.stdDev`,`forbidden for ${i}`);for(let a of["fastPeriod","slowPeriod","signalPeriod"])a in e&&N(r,`${o}.${a}`,`forbidden for ${i}`)}return s}case"compare":return(typeof e.op!="string"||!_v.has(e.op))&&N(r,`${o}.op`,"must be gt|gte|lt|lte|eq"),(typeof e.left!="string"||!e.left)&&N(r,`${o}.left`,"must be a node id"),(typeof e.right!="string"||!e.right)&&N(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"||!Ov.has(e.op))&&N(r,`${o}.op`,"must be and|or|not"),!Array.isArray(e.inputs))return N(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?N(r,`${o}.inputs.${s}`,"must be a node id"):i.push(a)}return e.op==="not"?i.length!==1&&N(r,`${o}.inputs`,"not requires exactly one input"):(e.op==="and"||e.op==="or")&&i.length<2&&N(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"||!Tv.has(e.direction))&&N(r,`${o}.direction`,"must be above|below"),(typeof e.left!="string"||!e.left)&&N(r,`${o}.left`,"must be a node id"),(typeof e.right!="string"||!e.right)&&N(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 qv(e,t,n){if(!nt(e))return N(t,"risk","must be a plain object"),null;rn(e,Nf,"risk",t);for(let f of Nf)(!(f in e)||e[f]==null)&&N(t,`risk.${f}`,"required field is missing");let r={},o=e.maxLeverage;!ce(o)||o<=0||o>50?N(t,"risk.maxLeverage","must be a number > 0 and <= 50"):r.maxLeverage=o;let i=e.maxNotionalUsd;!ce(i)||i<=0?N(t,"risk.maxNotionalUsd","must be a number > 0"):r.maxNotionalUsd=i;let s=e.positionSizePct;!ce(s)||s<=0||s>100?N(t,"risk.positionSizePct","must be a number > 0 and <= 100"):r.positionSizePct=s;let a=e.stopLossPct;!ce(a)||a<=0||a>100?N(t,"risk.stopLossPct","must be a number > 0 and <= 100"):r.stopLossPct=a;let c=e.takeProfitPct;!ce(c)||c<=0||c>1e3?N(t,"risk.takeProfitPct","must be a number > 0 and <= 1000"):r.takeProfitPct=c;let u=e.cooldownBars;!Number.isInteger(u)||u<0||u>1e5?N(t,"risk.cooldownBars","must be an integer >= 0 and <= 100000"):r.cooldownBars=u;let l=e.maxDailyLossPct;!ce(l)||l<=0||l>100?N(t,"risk.maxDailyLossPct","must be a number > 0 and <= 100"):r.maxDailyLossPct=l;let d=e.expiresAt;return!Number.isInteger(d)||d<=0?N(t,"risk.expiresAt","must be an integer epoch milliseconds > 0"):(n.nowMs!==void 0&&(Number.isInteger(n.nowMs)?d<=n.nowMs&&N(t,"risk.expiresAt","must be strictly greater than nowMs"):N(t,"nowMs","must be an integer epoch milliseconds")),r.expiresAt=d),r}function fc(e,t={}){let n=[];if(!nt(e))return N(n,"","strategy must be a plain object"),{ok:!1,errors:n,strategy:null};rn(e,Tf,"",n);for(let d of Tf)(!(d in e)||e[d]==null)&&N(n,d,"required field is missing");e.version!==ac&&N(n,"version",`must be ${ac}`),(typeof e.id!="string"||!Uf.test(e.id))&&N(n,"id","must match /^[a-z0-9][a-z0-9._-]{0,63}$/"),(typeof e.name!="string"||e.name.length===0||e.name.length>$f)&&N(n,"name",`must be a non-empty string max ${$f}`);let r=oc(e.venue);r||N(n,"venue",`unknown strategy venue "${String(e.venue)}"`);let o=null;if(!r)nt(e.market)||N(n,"market","must be a plain object");else{let d=r.validateMarket(e.market);if(!d||typeof d.ok!="boolean"||!Array.isArray(d.errors))N(n,"market",`venue ${r.id} returned an invalid market validation result`);else if(d.ok)o=d.market;else for(let f of d.errors)N(n,f.path,f.message)}let i=Lv(e.parameters,n),s=null,a=new Map;if(!Array.isArray(e.nodes))N(n,"nodes","must be an array");else if(e.nodes.length>Lf)N(n,"nodes",`too many nodes (max ${Lf})`);else{s=[];for(let d=0;d<e.nodes.length;d++){let f=$v(e.nodes[d],d,i||{},n);f&&(typeof f.id=="string"&&Mf.test(f.id)&&(a.has(f.id)?N(n,`nodes.${d}.id`,`duplicate node id "${f.id}"`):a.set(f.id,f)),s.push(f))}for(let d=0;d<s.length;d++){let f=s[d],p=`nodes.${d}`;for(let m of Pi(f))a.has(m)||N(n,p,`unknown node ref "${m}"`);if(f.type==="indicator"||f.type==="compare"||f.type==="cross")for(let m of Pi(f)){let y=a.get(m);y&&cc.has(y.type)&&N(n,p,`node ref "${m}" must be numeric`)}if(f.type==="logic")for(let m of Pi(f)){let y=a.get(m);y&&!cc.has(y.type)&&N(n,p,`node ref "${m}" must be boolean`)}}Pv(a)&&N(n,"nodes","graph contains a cycle")}let c=null;if(!nt(e.rules))N(n,"rules","must be a plain object");else{rn(e.rules,uc,"rules",n);for(let d of uc)d in e.rules||N(n,`rules.${d}`,"required field is missing");c={};for(let d of uc){let f=e.rules[d];if(f===null){c[d]=null;continue}if(typeof f!="string"||!f){N(n,`rules.${d}`,"must be a node id or null"),c[d]=f;continue}if(!a.has(f)){N(n,`rules.${d}`,`unknown node ref "${f}"`),c[d]=f;continue}let p=a.get(f);cc.has(p.type)||N(n,`rules.${d}`,`rule must reference a boolean node, not ${p.type}`),c[d]=f}}let u=qv(e.risk,n,t);if(n.length)return{ok:!1,errors:n,strategy:null};let l=dc({version:ac,id:e.id,name:e.name,venue:r.id,market:o,parameters:i,nodes:s,rules:c,risk:u});return{ok:!0,errors:[],strategy:l}}function Ne(e,t={}){let n=fc(e,t);if(!n.ok)throw new rr(n.errors);return n.strategy}function Bv(e){let t=Ne(e);return JSON.stringify(pc(t))}function er(e){let t=Bv(e);return xv("sha256").update(t,"utf8").digest("hex")}function to(e,t){if(!nt(e))throw new rr([{path:"",message:"strategy must be a plain object"}]);if(!nt(t))throw new rr([{path:"overrides",message:"must be a plain object"}]);let n=Ne(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)){N(o,i,`unknown parameter "${i}"`);continue}let a=r[i];if(!ce(s)){N(o,i,"override must be a finite number");continue}if(!Df(s,a.min,a.max,a.step)){N(o,i,"override must lie on the declared min/max/step grid");continue}r[i]={...a,value:s}}if(o.length)throw new rr(o);return Ne({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}})}var ac,Uf,Mf,kv,Iv,_v,Ov,Tv,Cv,Nv,cc,Tf,Cf,uc,Nf,Rv,Rf,Pf,Lf,$f,rr,xn=_(()=>{sc();ac=1,Uf=/^[a-z0-9][a-z0-9._-]{0,63}$/,Mf=/^[A-Za-z0-9][A-Za-z0-9._-]{0,63}$/,kv=new Set(["open","high","low","close","volume","fundingRate","openInterest","premium","oiDelta","bookImbalance"]),Iv=new Set(["sma","ema","rsi","macd","bollinger","atr"]),_v=new Set(["gt","gte","lt","lte","eq"]),Ov=new Set(["and","or","not"]),Tv=new Set(["above","below"]),Cv=new Set(["line","signal","histogram"]),Nv=new Set(["upper","middle","lower"]),cc=new Set(["compare","logic","cross"]),Tf=new Set(["version","id","name","venue","market","parameters","nodes","rules","risk"]),Cf=new Set(["value","min","max","step"]),uc=new Set(["entryLong","entryShort","exitLong","exitShort"]),Nf=new Set(["maxLeverage","maxNotionalUsd","positionSizePct","stopLossPct","takeProfitPct","cooldownBars","maxDailyLossPct","expiresAt"]),Rv=new Set(["id","type"]),Rf={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"])},Pf=16,Lf=128,$f=100,rr=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 no(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 on(e){if(!Number.isInteger(e)||e<=0)throw new TypeError("period must be a positive integer")}function Uv(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 jf(e,t){no(e),on(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 Li(e,t){no(e),on(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 Hf(e,t){no(e),on(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]=Ff(i,s);for(let a=t+1;a<e.length;a++){let c=e[a]-e[a-1],u=c>0?c:0,l=c<0?-c:0;i=(i*(t-1)+u)/t,s=(s*(t-1)+l)/t,n[a]=Ff(i,s)}return n}function Ff(e,t){return e===0&&t===0?50:t===0?100:e===0?0:100-100/(1+e/t)}function zf(e,t={}){no(e);let n=t.fastPeriod,r=t.slowPeriod,o=t.signalPeriod;if(on(n),on(r),on(o),n>=r)throw new TypeError("fastPeriod must be < slowPeriod");let i=Li(e,n),s=Li(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),u=new Array(e.length).fill(null),l=[];for(let d=0;d<a.length;d++)a[d]!=null&&l.push(d);if(l.length>=o){let d=0;for(let y=0;y<o;y++)d+=a[l[y]];let f=d/o,p=l[o-1];c[p]=f,u[p]=a[p]-f;let m=2/(o+1);for(let y=o;y<l.length;y++){let h=l[y];f=m*a[h]+(1-m)*f,c[h]=f,u[h]=a[h]-f}}return{line:a,signal:c,histogram:u}}function Vf(e,t={}){no(e);let n=t.period,r=t.stdDev;if(on(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 u=0;u<e.length;u++){let l=e[u];if(a+=l,c+=l*l,u>=n){let d=e[u-n];a-=d,c-=d*d}if(u>=n-1){let d=a/n,f=c/n-d*d;f<0&&f>-1e-12&&(f=0);let p=Math.sqrt(f);o[u]=d,i[u]=d+r*p,s[u]=d-r*p}}return{upper:i,middle:o,lower:s}}function Wf(e,t){Uv(e),on(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}var Gf=_(()=>{});import{createHash as Mv}from"node:crypto";var mc,Dv,Fv,jv,Kf,Yf=_(()=>{mc=3,Dv="7477966facc4ef928a94e6221c8fd238eef4fcbeec46b96ae1b89178e13c2d5f",Fv="68f5b412a9975f04024cf9b9b6209b4bccedd52f176e95f34f786b3f53479c6a",jv="967fd45ecddd0d59ac0f662fe92ea813c32620ba751f249b4ace6cb6b809fb5e",Kf=Mv("sha256").update(JSON.stringify({version:mc,compilerSourceHash:Dv,indicatorsSourceHash:Fv,schemaSourceHash:jv})).digest("hex")});function Ke(e){return typeof e=="number"&&Number.isFinite(e)}function Vv(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 or(e,t){return e!=null&&typeof e=="object"&&"param"in e?t[e.param].value:e}function Wv(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:u,c:l,v:d}=i;if(!Ke(s)&&(typeof s=="number"&&Number.isFinite(s)),!Number.isFinite(s))throw new TypeError(`bars[${o}].t must be finite`);for(let[f,p]of[["o",a],["h",c],["l",u],["c",l],["v",d]])if(!Ke(p))throw new TypeError(`bars[${o}].${f} must be a finite number`);for(let[f,p]of[["o",a],["h",c],["l",u],["c",l]])if(!(p>0))throw new TypeError(`bars[${o}].${f} price must be positive`);if(d<0)throw new TypeError(`bars[${o}].v volume must be non-negative`);if(c<Math.max(a,l,u))throw new TypeError(`bars[${o}] high must be >= max(open, close, low)`);if(u>Math.min(a,l,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!==zv[n])throw new TypeError(`bars t must match ${n} cadence`)}if(r=s,"fundingRate"in i&&i.fundingRate!=null&&!Ke(i.fundingRate))throw new TypeError(`bars[${o}].fundingRate must be finite when present`);if("openInterest"in i&&i.openInterest!=null){if(!Ke(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`)}for(let f of["premium","oiDelta"])if(f in i&&i[f]!=null&&!Ke(i[f]))throw new TypeError(`bars[${o}].${f} must be finite when present`);if("bookImbalance"in i&&i.bookImbalance!=null){if(!Ke(i.bookImbalance))throw new TypeError(`bars[${o}].bookImbalance must be finite when present`);if(i.bookImbalance<-1||i.bookImbalance>1)throw new TypeError(`bars[${o}].bookImbalance must be within [-1, 1]`)}}}function _n(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=Hv[s.field];a=new Array(o+1);for(let u=0;u<=o;u++){let l=r[u][c];a[u]=l===void 0?null:l}break}case"constant":{let c=or(s.value,n);a=new Array(o+1).fill(c);break}case"indicator":{let c=s.period!=null?or(s.period,n):void 0;if(s.indicator==="atr"){let d=[];for(let f=0;f<=o;f++){let p=r[f];d.push({o:p.o,h:p.h,l:p.l,c:p.c})}a=Wf(d,c);break}let l=_n(s.input,t,n,r,o,i).map((d,f)=>{if(d==null||!Ke(d))throw new TypeError(`indicator input ${s.input} has non-finite value at ${f}`);return d});if(s.indicator==="sma")a=jf(l,c);else if(s.indicator==="ema")a=Li(l,c);else if(s.indicator==="rsi")a=Hf(l,c);else if(s.indicator==="macd")a=zf(l,{fastPeriod:or(s.fastPeriod,n),slowPeriod:or(s.slowPeriod,n),signalPeriod:or(s.signalPeriod,n)})[s.output];else if(s.indicator==="bollinger")a=Vf(l,{period:c,stdDev:or(s.stdDev,n)})[s.output];else throw new Error(`unsupported indicator ${s.indicator}`);break}case"compare":{let c=_n(s.left,t,n,r,o,i),u=_n(s.right,t,n,r,o,i);a=new Array(o+1);for(let l=0;l<=o;l++){let d=c[l],f=u[l];if(d==null||f==null||!Ke(d)||!Ke(f)){a[l]=!1;continue}switch(s.op){case"gt":a[l]=d>f;break;case"gte":a[l]=d>=f;break;case"lt":a[l]=d<f;break;case"lte":a[l]=d<=f;break;case"eq":a[l]=d===f;break;default:a[l]=!1}}break}case"logic":{let c=s.inputs.map(u=>_n(u,t,n,r,o,i));a=new Array(o+1);for(let u=0;u<=o;u++)if(s.op==="not"){let l=c[0][u];a[u]=l===!0?!1:l===!1}else if(s.op==="and"){let l=!0;for(let d of c)if(d[u]!==!0){l=!1;break}a[u]=l}else if(s.op==="or"){let l=!1;for(let d of c)if(d[u]===!0){l=!0;break}a[u]=l}else a[u]=!1;break}case"cross":{let c=_n(s.left,t,n,r,o,i),u=_n(s.right,t,n,r,o,i);a=new Array(o+1),a[0]=!1;for(let l=1;l<=o;l++){let d=c[l-1],f=u[l-1],p=c[l],m=u[l];if(d==null||f==null||p==null||m==null||!Ke(d)||!Ke(f)||!Ke(p)||!Ke(m)){a[l]=!1;continue}s.direction==="above"?a[l]=d<=f&&p>m:a[l]=d>=f&&p<m}break}default:throw new Error(`unknown node type ${s.type}`)}return i.set(e,a),a}function Re(e,t={}){let n=Ne(e);t&&Object.keys(t).length&&(n=to(n,t));let r=new Map(n.nodes.map(p=>[p.id,p])),o=Object.freeze(Vv(n.nodes)),i=n.parameters,s=new Set(n.nodes.filter(p=>p.type==="input").map(p=>p.field));if(n.nodes.some(p=>p.type==="indicator"&&p.indicator==="atr"))for(let p of["open","high","low","close"])s.add(p);let a=Object.freeze([...s].sort()),c=er(n);function u(p,m){let y={};for(let w of o){let v=p.get(w);y[w]=v[m]}let h=w=>w!=null&&y[w]===!0;return{values:y,signals:{entryLong:h(n.rules.entryLong),entryShort:h(n.rules.entryShort),exitLong:h(n.rules.exitLong),exitShort:h(n.rules.exitShort)}}}function l(p,m){Wv(p,m,n.market.interval);let y=new Map;for(let h of o)_n(h,r,i,p,m,y);return y}function d(p,m){return u(l(p,m),m)}function f(p){if(!Array.isArray(p)||p.length===0)throw new TypeError("bars must be a non-empty array");let m=p.length-1,y=l(p,m);return Object.freeze(p.map((h,w)=>Object.freeze(u(y,w))))}return Object.freeze({strategy:n,strategyHash:c,compilerVersion:Zr,compilerHash:kn,requiredSeries:a,nodeOrder:o,evaluate:d,evaluateAll:f})}var Zr,kn,Hv,zv,In=_(()=>{xn();Gf();Yf();Zr=mc,kn=Kf,Hv=Object.freeze({open:"o",high:"h",low:"l",close:"c",volume:"v",fundingRate:"fundingRate",openInterest:"openInterest",premium:"premium",oiDelta:"oiDelta",bookImbalance:"bookImbalance"}),zv=Object.freeze({"1m":6e4,"3m":18e4,"5m":3e5,"15m":9e5,"30m":18e5,"1h":36e5,"2h":72e5,"4h":144e5,"8h":288e5,"12h":432e5,"1d":864e5})});import{createHash as Gv}from"node:crypto";function Yv(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function At(e){return typeof e=="number"&&Number.isFinite(e)}function hc(e){if(e==null||typeof e!="object"||Object.isFrozen(e))return e;if(Array.isArray(e)){for(let t of e)hc(t);return Object.freeze(e)}for(let t of Object.keys(e))hc(e[t]);return Object.freeze(e)}function $i(e){if(Array.isArray(e))return e.map($i);if(e!=null&&typeof e=="object"){let t={};for(let n of Object.keys(e).sort())t[n]=$i(e[n]);return t}return e}function yc(e,t="result"){if(typeof e=="number"){if(!Number.isFinite(e))throw new Error(`non-finite backtest result at ${t}`);return}if(!(e==null||typeof e!="object")){if(Array.isArray(e)){e.forEach((n,r)=>yc(n,`${t}[${r}]`));return}for(let[n,r]of Object.entries(e))yc(r,`${t}.${n}`)}}function Jf(e){if(!Array.isArray(e)||e.length===0)throw new TypeError("bars must be a non-empty array");let t=null;for(let n=0;n<e.length;n++){let r=e[n];if(r==null||typeof r!="object"||Array.isArray(r))throw new TypeError(`bars[${n}] must be an object`);let{t:o,o:i,h:s,l:a,c,v:u}=r;if(!At(o))throw new TypeError(`bars[${n}].t must be finite`);for(let[l,d]of[["o",i],["h",s],["l",a],["c",c],["v",u]])if(!At(d))throw new TypeError(`bars[${n}].${l} must be a finite number`);for(let[l,d]of[["o",i],["h",s],["l",a],["c",c]])if(!(d>0))throw new TypeError(`bars[${n}].${l} price must be positive`);if(u<0)throw new TypeError(`bars[${n}].v volume must be non-negative`);if(s<Math.max(i,c,a))throw new TypeError(`bars[${n}] high must be >= max(open, close, low)`);if(a>Math.min(i,c,s))throw new TypeError(`bars[${n}] low must be <= min(open, close, high)`);if(t!=null&&!(o>t))throw new TypeError("bars t must be strictly increasing");if(t=o,"fundingRate"in r&&r.fundingRate!=null&&!At(r.fundingRate))throw new TypeError(`bars[${n}].fundingRate must be finite when present`);if("fundingPaymentRate"in r&&r.fundingPaymentRate!=null&&!At(r.fundingPaymentRate))throw new TypeError(`bars[${n}].fundingPaymentRate must be finite when present`);if("openInterest"in r&&r.openInterest!=null&&!At(r.openInterest))throw new TypeError(`bars[${n}].openInterest must be finite when present`)}}function Jr(e){if(!Array.isArray(e))throw new TypeError("bars must be an array");return e.length>0&&Jf(e),Gv("sha256").update(JSON.stringify($i(e)),"utf8").digest("hex")}function Xv(e){if(e==null&&(e={}),!Yv(e))throw new TypeError("options must be a plain object");let t={...Kv},n=new Set(["initialEquityUsd","takerFeeBps","builderFeeBps","slippageBps","latencyBars","maxVolumeParticipationPct","nowMs"]);for(let r of Object.keys(e))if(!n.has(r))throw new TypeError(`unknown option "${r}"`);if("initialEquityUsd"in e){if(!At(e.initialEquityUsd)||e.initialEquityUsd<=0)throw new TypeError("initialEquityUsd must be a positive finite number");t.initialEquityUsd=e.initialEquityUsd}for(let r of["takerFeeBps","builderFeeBps","slippageBps"])if(r in e){let o=e[r];if(!At(o)||o<0)throw new TypeError(`${r} must be a finite number >= 0`);if(r==="slippageBps"?o>=1e4:o>1e4)throw new TypeError(`${r} exceeds its safe basis-point bound`);t[r]=o}if("latencyBars"in e){let r=e.latencyBars;if(!Number.isInteger(r)||r<1)throw new TypeError("latencyBars must be an integer >= 1");t.latencyBars=r}if("maxVolumeParticipationPct"in e){let r=e.maxVolumeParticipationPct;if(!At(r)||r<=0||r>100)throw new TypeError("maxVolumeParticipationPct must be in (0,100]");t.maxVolumeParticipationPct=r}if("nowMs"in e){if(!Number.isInteger(e.nowMs))throw new TypeError("nowMs must be an integer epoch milliseconds");t.nowMs=e.nowMs}return t}function qi(e){return e/1e4}function Jv(e,t,n){let r=qi(n);return t==="long"?e*(1+r):e*(1-r)}function Qv(e,t,n){let r=qi(n);return t==="long"?e*(1-r):e*(1+r)}function Xf(e,t,n){let r=Math.abs(e)*qi(t),o=Math.abs(e)*qi(n);return{taker:r,builder:o,total:r+o}}function Zv(e,t){let n=e*(t.positionSizePct/100)*t.maxLeverage;return Math.min(n,t.maxNotionalUsd)}function ex(e,t,n){let r=n/100;return t==="long"?e*(1-r):e*(1+r)}function tx(e,t,n){let r=n/100;return t==="long"?e*(1+r):e*(1-r)}function nx(e,t,n,r){if(!(n>0))return t==="long"?0:Number.POSITIVE_INFINITY;let o=Math.min(.99,1/(2*n)+r/1e4);return t==="long"?e*(1-1/n)/(1-o):e*(1+1/n)/(1+o)}function rx(e,t,n){return t==="long"?e.l<=n:e.h>=n}function ox(e,t,n){return t==="long"?e.h>=n:e.l<=n}function ix(e,t,n){return t==="long"?e.l<=n:e.h>=n}function ro(e,t){for(let n of e.requiredSeries)if(sx.includes(n)&&!t.every(r=>At(r?.[n])))throw new Error(`strategy required series is absent: ${n}`)}function ax(e){if(e.length<3)return 0;let t=[];for(let s=1;s<e.length;s++){let a=e[s-1].equity,c=e[s].equity;a>0&&t.push((c-a)/a)}if(t.length<2)return 0;let n=0;for(let s of t)n+=s;let r=n/t.length,o=0;for(let s of t)o+=(s-r)**2;let i=Math.sqrt(o/(t.length-1));return i>0?r/i:0}function cx(e){let t=-1/0,n=0;for(let r of e){let o=r.equity;if(o>t&&(t=o),t>0){let i=(t-o)/t*100;i>n&&(n=i)}}return n}function nn(e,t,n={}){let r=Xv(n);Jf(t);let o=Jr(t);r.nowMs!==void 0&&Ne(e,{nowMs:r.nowMs});let i=Re(e);if(ro(i,t),r.nowMs!==void 0&&i.strategy.risk.expiresAt<=r.nowMs)throw new Error("strategy is expired: risk.expiresAt must be strictly greater than nowMs");let s=i.strategy.risk,a=i.evaluateAll(t),c=r.latencyBars,u=r.slippageBps,l=r.takerFeeBps,d=r.builderFeeBps,f=r.initialEquityUsd,p=0,m=0,y=0,h=0,w=0,v=[],T=[],S=[],k=[],x=[],E=null,b=0,g=null,A=f,P=!1,I=0,L=0,q=[],j=new Array(t.length).fill(0);function $(R){q.push(R)}function D(R){let W=t[R].v*(r.maxVolumeParticipationPct/100);return Math.max(0,W-j[R])}function M(R){if(!E)return f;let W=E.side==="long"?(R-E.entryPrice)*E.qty:(E.entryPrice-R)*E.qty;return f+W}function Q(R,W,B){let ie=B.o,X=Zv(f,s);if(!(X>0)||!(ie>0))return;let se=Jv(ie,W,u),re=X/se,me=D(R),xr=se*me;if(re>me){S.push({kind:"entry",barIndex:R,time:B.t,side:W,requestedNotionalUsd:X,maxFillNotionalUsd:xr,reason:"volume_participation"});return}j[R]+=re;let gt=Math.abs(se-ie)*re,Pt=Xf(X,l,d);f-=Pt.total,p+=Pt.taker,m+=Pt.builder,h+=gt,w+=X,E={lifecycleEpoch:++L,side:W,entryBarIndex:R,entryReferencePrice:ie,entryPrice:se,qty:re,notionalUsd:X,stop:ex(se,W,s.stopLossPct),take:tx(se,W,s.takeProfitPct),liq:nx(se,W,s.maxLeverage,l+d),entryFees:Pt.taker,entryBuilderFees:Pt.builder,entrySlippageUsd:gt,fundingAccrued:0}}function Y(R,W,B,ie){if(!E)return!1;let X=E.side,se=W,re=se;B!=="liquidation"&&ie&&(re=Qv(se,X,u));let me=E.qty,xr=me*re;if(B!=="liquidation"){let ll=D(R),cb=re*ll;if(me>ll)return S.push({kind:"exit",barIndex:R,time:t[R].t,side:X,requestedNotionalUsd:xr,maxFillNotionalUsd:cb,reason:"volume_participation",triggerReason:B}),!1;j[R]+=me}let gt=Xf(xr,l,d),Pt=B==="liquidation"?0:Math.abs(re-se)*me,kr,Ms;X==="long"?(kr=(se-E.entryReferencePrice)*me,Ms=(re-E.entryPrice)*me):(kr=(E.entryReferencePrice-se)*me,Ms=(E.entryPrice-re)*me),f+=Ms,f-=gt.total,p+=gt.taker,m+=gt.builder,h+=Pt,w+=xr;let ab={side:X,entryBarIndex:E.entryBarIndex,entryTime:t[E.entryBarIndex].t,entryPrice:E.entryPrice,exitBarIndex:R,exitTime:t[R].t,exitPrice:re,exitReason:B,qty:me,notionalUsd:E.notionalUsd,grossPnlUsd:kr,feesUsd:E.entryFees+gt.taker,builderFeesUsd:E.entryBuilderFees+gt.builder,fundingUsd:E.fundingAccrued,slippageUsd:E.entrySlippageUsd+Pt,netPnlUsd:kr-(E.entryFees+gt.taker+E.entryBuilderFees+gt.builder)-E.fundingAccrued-(E.entrySlippageUsd+Pt)};return v.push(ab),B==="liquidation"&&T.push({barIndex:R,time:t[R].t,side:X,price:re,tradeIndex:v.length-1}),E=null,L+=1,I=R+1+(s.cooldownBars||0),!0}function Ue(R,W,B,ie){let X=R+1;if(X>=t.length)return;q.some(re=>re.kind==="exit"&&re.side===W&&re.fillBar===X&&re.epoch===ie)||$({kind:"exit",side:W,signalBar:R,fillBar:X,reason:B,epoch:ie})}function le(R){let W=q.filter(B=>B.fillBar===R);for(let B=q.length-1;B>=0;B--)q[B].fillBar===R&&q.splice(B,1);W.sort((B,ie)=>{let X=se=>se.kind==="exit"?0:1;return X(B)-X(ie)});for(let B of W)if(B.kind==="exit"){if(!E||E.side!==B.side||E.lifecycleEpoch!==B.epoch)continue;let ie=B.reason||"rule";Y(R,t[R].o,ie,!0)||Ue(R,B.side,ie,B.epoch)}else if(B.kind==="entry"){if(E||B.epoch!==L||R<I)continue;Q(R,B.side,t[R])}}function Wt(R){if(!E)return;let W=t[R],B=W.fundingPaymentRate;if(B==null||!At(B)||B===0)return;let ie=Math.abs(E.qty*W.c),X=B*ie;E.side==="long"?(f-=X,E.fundingAccrued+=X,y+=X):(f+=X,E.fundingAccrued-=X,y-=X)}function Gt(R){if(!E)return;let W=t[R].o;(E.side==="long"?W<=E.liq:W>=E.liq)&&Y(R,W,"liquidation",!1)}function il(R){if(!E)return;let W=t[R],B=E.side,ie=ix(W,B,E.liq),X=rx(W,B,E.stop),se=ox(W,B,E.take),re=me=>B==="long"?Math.min(me,W.o):Math.max(me,W.o);if(ie){Y(R,re(E.liq),"liquidation",!1);return}if(X&&se){Y(R,re(E.stop),"stop_loss",!0)||Ue(R,B,"stop_loss",E.lifecycleEpoch);return}if(X){Y(R,re(E.stop),"stop_loss",!0)||Ue(R,B,"stop_loss",E.lifecycleEpoch);return}se&&(Y(R,E.take,"take_profit",!0)||Ue(R,B,"take_profit",E.lifecycleEpoch))}for(let R=0;R<t.length;R++){let W=Math.floor(t[R].t/864e5);W!==g&&(g=W,A=M(t[R].o),P=!1),Gt(R),le(R),il(R),Wt(R),!P&&M(t[R].c)<=A*(1-s.maxDailyLossPct/100)&&(P=!0,k.push({type:"daily_loss_limit",barIndex:R,time:t[R].t,message:"daily loss limit reached; new entries blocked for UTC day"}));let B=a[R].signals,ie=R+c;if(E)(E.side==="long"&&B.exitLong===!0||E.side==="short"&&B.exitShort===!0)&&ie<t.length&&(q.some(me=>me.kind==="exit"&&me.side===E.side&&me.fillBar===ie&&me.epoch===E.lifecycleEpoch)||$({kind:"exit",side:E.side,signalBar:R,fillBar:ie,reason:"rule",epoch:E.lifecycleEpoch}));else{let se=B.entryLong===!0,re=B.entryShort===!0;se&&re?k.push({type:"conflicting_entry_signals",barIndex:R,time:t[R].t,message:"conflicting entry signals; no position opened"}):!P&&(se||re)&&ie<t.length&&R>=I&&$({kind:"entry",side:se?"long":"short",signalBar:R,fillBar:ie,epoch:L})}let X=f;E&&(b+=1,X=M(t[R].c)),x.push({barIndex:R,time:t[R].t,equity:X,positionSide:E?E.side:null})}let sl=null;if(E){let R=t.length-1;if(Y(R,t[R].c,"end_of_data",!0))x[R]={barIndex:R,time:t[R].t,equity:f,positionSide:null};else{let B=M(t[R].c);sl={side:E.side,entryBarIndex:E.entryBarIndex,entryTime:t[E.entryBarIndex].t,entryPrice:E.entryPrice,qty:E.qty,notionalUsd:E.notionalUsd,markPrice:t[R].c,markedEquityUsd:B},k.push({type:"open_position_at_end",barIndex:R,time:t[R].t,message:"end-of-data exit missed; position remains open and marked"})}}let al=(E?M(t[t.length-1].c):f)-r.initialEquityUsd,rb=al/r.initialEquityUsd*100,cl=0,$s=0,qs=0;for(let R of v)R.netPnlUsd>0?(cl+=1,$s+=R.netPnlUsd):R.netPnlUsd<0&&(qs+=-R.netPnlUsd);let Bs=v.length,ob=Bs===0?0:cl/Bs,Us=0;qs>0?Us=$s/qs:$s>0&&(Us=1e12);let ib={netPnlUsd:al,netPnlPct:rb,maxDrawdownPct:cx(x),winRate:ob,profitFactor:Us,tradeCount:Bs,sharpe:ax(x),turnoverUsd:w,exposurePct:b/t.length*100},sb={initialEquityUsd:r.initialEquityUsd,takerFeeBps:r.takerFeeBps,builderFeeBps:r.builderFeeBps,slippageBps:r.slippageBps,latencyBars:r.latencyBars,maxVolumeParticipationPct:r.maxVolumeParticipationPct},ul={barsHash:o,strategyHash:i.strategyHash,compilerHash:kn,compilerVersion:Zr,config:sb,trades:v,equityCurve:x,metrics:ib,costs:{feesUsd:p,builderFeesUsd:m,fundingUsd:y,slippageUsd:h},liquidations:T,missedFills:S,openPositionAtEnd:sl,flags:k};return yc(ul),hc($i(ul))}var Kv,sx,Ri=_(()=>{In();xn();Kv=Object.freeze({initialEquityUsd:1e4,takerFeeBps:3.5,builderFeeBps:2,slippageBps:2,latencyBars:1,maxVolumeParticipationPct:100});sx=Object.freeze(["fundingRate","openInterest","premium","oiDelta","bookImbalance"])});import{createHash as ux}from"node:crypto";function gx(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function gc(e){if(e==null||typeof e!="object"||Object.isFrozen(e))return e;if(Array.isArray(e)){for(let t of e)gc(t);return Object.freeze(e)}for(let t of Object.keys(e))gc(e[t]);return Object.freeze(e)}function bx(e){return String(e).trim().replace(/\s+/g," ")}function wx(e){let t=e.match(/\b(long|short)\b/i);return t?t[1].toLowerCase():null}function Ex(e){for(let n of dx)if(new RegExp(`\\b${n}\\b`,"i").test(e))return n;let t=e.match(/\b([A-Z][A-Z0-9]{1,11})\b/);return t?t[1]:null}function Sx(e){let t=e.match(/\bon\s+(1m|3m|5m|15m|30m|1h|2h|4h|8h|12h|1d)\b/i);if(!t)return"15m";let n=t[1].toLowerCase();return lx.has(n)?n:null}function Ax(e){let t={...fx},n=e.match(/stop\s*loss\s*(\d+(?:\.\d+)?)\s*%?/i);n&&(t.stopLossPct=Number(n[1]));let r=e.match(/take\s*profit\s*(\d+(?:\.\d+)?)\s*%?/i);r&&(t.takeProfitPct=Number(r[1]));let o=e.match(/leverage\s*(\d+(?:\.\d+)?)/i);o&&(t.maxLeverage=Number(o[1]));let i=e.match(/position\s*size\s*(\d+(?:\.\d+)?)\s*%?/i);i&&(t.positionSizePct=Number(i[1]));let s=e.match(/max\s*notional\s*(?:usd\s*)?\$?\s*(\d+(?:\.\d+)?)/i);return s&&(t.maxNotionalUsd=Number(s[1])),t}function vx(e){return[/\bon\s+(?:1m|3m|5m|15m|30m|1h|2h|4h|8h|12h|1d)\b/gi,/\bstop\s*loss\s*\d+(?:\.\d+)?\s*%?/gi,/\btake\s*profit\s*\d+(?:\.\d+)?\s*%?/gi,/\bleverage\s*\d+(?:\.\d+)?/gi,/\bposition\s*size\s*\d+(?:\.\d+)?\s*%?/gi,/\bmax\s*notional\s*(?:usd\s*)?\$?\s*\d+(?:\.\d+)?/gi].some(n=>(e.match(n)??[]).length>1)}function xx(e){let t=ux("sha256").update(e,"utf8").digest("hex").slice(0,10),n=e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").slice(0,40),o=`${n.length?n:"draft"}-${t}`.replace(/[^a-z0-9._-]/g,"").slice(0,64);return/^[a-z0-9]/.test(o)?o:`d${o}`.slice(0,64)}function kx(e){let t=e.match(/\bema\s*(\d+)\s*cross(?:es)?\s*(above|below)\s*ema\s*(\d+)\b/i);if(!t)return null;let n=Number(t[1]),r=t[2].toLowerCase(),o=Number(t[3]);if(!(n>0)||!(o>0)||n===o)return null;let i=/\b(exit\s+on\s+reverse|reverse\s+exit)\b/i.test(e);return{kind:"ema_cross",fast:n,slow:o,direction:r,reverse:i}}function Ix(e){let t=e.match(/\brsi\s*(\d+)\s*(above|below)\s*(-?\d+(?:\.\d+)?)/i);if(!t)return null;let n=Number(t[3]);return!Number.isFinite(n)||n<=0||n>=100?null:{kind:"rsi",period:Number(t[1]),op:t[2].toLowerCase(),threshold:n}}function _x(e){let t=e.match(/\bfunding\s*rate\s*(above|below)\s*(-?\d+(?:\.\d+)?)(%?)(?=\s|,|$)/i);if(!t)return null;let n=Number(t[2]);return t[3]==="%"&&(n=n/100),{kind:"funding",op:t[1].toLowerCase(),threshold:n}}function Ox(e){let t=e.match(/\bopen\s*interest\s*(above|below)\s*(-?\d+(?:\.\d+)?)(?=\s|,|$)/i);if(!t)return null;let n=Number(t[2]);return!Number.isFinite(n)||n<0?null:{kind:"open_interest",op:t[1].toLowerCase(),threshold:n}}function Tx(e){let t=e.match(/\bpremium\s*(above|below)\s*(-?\d+(?:\.\d+)?)(%?)(?=\s|,|$)/i);if(!t)return null;let n=Number(t[2]);return Number.isFinite(n)?(t[3]==="%"&&(n=n/100),{kind:"premium",op:t[1].toLowerCase(),threshold:n}):null}function Cx(e){let t=e.match(/\boi\s*delta\s*(above|below)\s*(-?\d+(?:\.\d+)?)(?=\s|,|$)/i);if(!t)return null;let n=Number(t[2]);return Number.isFinite(n)?{kind:"oi_delta",op:t[1].toLowerCase(),threshold:n}:null}function Nx(e){let t=e.match(/\bbook\s*imbalance\s*(above|below)\s*(-?\d+(?:\.\d+)?)(?=\s|,|$)/i);if(!t)return null;let n=Number(t[2]);return!Number.isFinite(n)||n<-1||n>1?null:{kind:"book_imbalance",op:t[1].toLowerCase(),threshold:n}}function Rx(e,t){let n=e.replace(/^(long|short)\s+[A-Z][A-Z0-9]{1,11}\s+when\s+/i,"");if(n===e)return!1;t.kind==="ema_cross"?n=n.replace(/^ema\s*\d+\s*cross(?:es)?\s*(?:above|below)\s*ema\s*\d+\b/i,""):t.kind==="rsi"?n=n.replace(/^rsi\s*\d+\s*(?:above|below)\s*\d+(?:\.\d+)?\b/i,""):t.kind==="open_interest"?n=n.replace(/^open\s*interest\s*(?:above|below)\s*-?\d+(?:\.\d+)?(?=\s|,|$)/i,""):t.kind==="premium"?n=n.replace(/^premium\s*(?:above|below)\s*-?\d+(?:\.\d+)?%?(?=\s|,|$)/i,""):t.kind==="oi_delta"?n=n.replace(/^oi\s*delta\s*(?:above|below)\s*-?\d+(?:\.\d+)?(?=\s|,|$)/i,""):t.kind==="book_imbalance"?n=n.replace(/^book\s*imbalance\s*(?:above|below)\s*-?\d+(?:\.\d+)?(?=\s|,|$)/i,""):n=n.replace(/^funding\s*rate\s*(?:above|below)\s*-?\d+(?:\.\d+)?%?(?=\s|,|$)/i,"");let r=[/(?:,\s*)?\bon\s+(?:1m|3m|5m|15m|30m|1h|2h|4h|8h|12h|1d)\b/gi,/(?:,\s*)?\bstop\s*loss\s*\d+(?:\.\d+)?\s*%?/gi,/(?:,\s*)?\btake\s*profit\s*\d+(?:\.\d+)?\s*%?/gi,/(?:,\s*)?\bleverage\s*\d+(?:\.\d+)?/gi,/(?:,\s*)?\bposition\s*size\s*\d+(?:\.\d+)?\s*%?/gi,/(?:,\s*)?\bmax\s*notional\s*(?:usd\s*)?\$?\s*\d+(?:\.\d+)?/gi];t.kind==="ema_cross"&&r.push(/(?:,\s*)?\b(?:exit\s+on\s+reverse|reverse\s+exit)\b/gi);for(let o of r)n=n.replace(o,"");return n.replace(/[\s,;]+/g,"")===""}function Qf(e){let t=Math.max(2,Math.floor(e/2));return{value:e,min:Math.max(2,e-t),max:Math.min(500,e+t),step:1}}function Px({side:e,coin:t,interval:n,risk:r,expiresAt:o,id:i,name:s,spec:a}){let c=[{id:"c",type:"input",field:"close"},{id:"emaLeft",type:"indicator",indicator:"ema",input:"c",period:{param:"ema_left_period"}},{id:"emaRight",type:"indicator",indicator:"ema",input:"c",period:{param:"ema_right_period"}},{id:"cross",type:"cross",direction:a.direction,left:"emaLeft",right:"emaRight"}],u={entryLong:null,entryShort:null,exitLong:null,exitShort:null};if(e==="long"?u.entryLong="cross":u.entryShort="cross",a.reverse){let l=a.direction==="above"?"below":"above";c.push({id:"crossRev",type:"cross",direction:l,left:"emaLeft",right:"emaRight"}),e==="long"?u.exitLong="crossRev":u.exitShort="crossRev"}return{version:1,id:i,name:s,venue:"hyperliquid",market:{coin:t,interval:n},parameters:{ema_left_period:Qf(a.fast),ema_right_period:Qf(a.slow)},nodes:c,rules:u,risk:{...r,expiresAt:o}}}function Lx({side:e,coin:t,interval:n,risk:r,expiresAt:o,id:i,name:s,spec:a}){let c=[{id:"c",type:"input",field:"close"},{id:"rsi",type:"indicator",indicator:"rsi",input:"c",period:a.period},{id:"thr",type:"constant",value:a.threshold},{id:"sig",type:"compare",op:a.op==="above"?"gt":"lt",left:"rsi",right:"thr"}];return{version:1,id:i,name:s,venue:"hyperliquid",market:{coin:t,interval:n},parameters:{},nodes:c,rules:{entryLong:e==="long"?"sig":null,entryShort:e==="short"?"sig":null,exitLong:null,exitShort:null},risk:{...r,expiresAt:o}}}function $x({side:e,coin:t,interval:n,risk:r,expiresAt:o,id:i,name:s,spec:a}){let c=[{id:"fr",type:"input",field:"fundingRate"},{id:"thr",type:"constant",value:a.threshold},{id:"sig",type:"compare",op:a.op==="above"?"gt":"lt",left:"fr",right:"thr"}];return{version:1,id:i,name:s,venue:"hyperliquid",market:{coin:t,interval:n},parameters:{},nodes:c,rules:{entryLong:e==="long"?"sig":null,entryShort:e==="short"?"sig":null,exitLong:null,exitShort:null},risk:{...r,expiresAt:o}}}function qx({side:e,coin:t,interval:n,risk:r,expiresAt:o,id:i,name:s,spec:a}){let c=[{id:"oi",type:"input",field:"openInterest"},{id:"thr",type:"constant",value:a.threshold},{id:"sig",type:"compare",op:a.op==="above"?"gt":"lt",left:"oi",right:"thr"}];return{version:1,id:i,name:s,venue:"hyperliquid",market:{coin:t,interval:n},parameters:{},nodes:c,rules:{entryLong:e==="long"?"sig":null,entryShort:e==="short"?"sig":null,exitLong:null,exitShort:null},risk:{...r,expiresAt:o}}}function Ux({side:e,coin:t,interval:n,risk:r,expiresAt:o,id:i,name:s,spec:a}){let u=[{id:"sig_input",type:"input",field:Bx[a.kind]},{id:"thr",type:"constant",value:a.threshold},{id:"sig",type:"compare",op:a.op==="above"?"gt":"lt",left:"sig_input",right:"thr"}];return{version:1,id:i,name:s,venue:"hyperliquid",market:{coin:t,interval:n},parameters:{},nodes:u,rules:{entryLong:e==="long"?"sig":null,entryShort:e==="short"?"sig":null,exitLong:null,exitShort:null},risk:{...r,expiresAt:o}}}function Zf(e,t={}){if(typeof e!="string")throw new Se("prompt must be a string");if(e.length>1e3)throw new Se("prompt length must be <= 1000");if(!gx(t))throw new Se("options must be a plain object");if(!Number.isInteger(t.nowMs))throw new Se("options.nowMs is required integer epoch ms");let n=t.nowMs,r=yx;if("expiresInMs"in t){if(!Number.isInteger(t.expiresInMs))throw new Se("expiresInMs must be an integer");if(r=t.expiresInMs,r<mx||r>hx)throw new Se("expiresInMs must be between 1h and 30d")}if(px.test(e))throw new Se(`prompt appears to contain secrets and is rejected. ${ir}`);let o=bx(e);if(!o)throw new Se(`empty prompt. ${ir}`);if(vx(o))throw new Se(`duplicate interval or risk clause. ${ir}`);let i=wx(o),s=Ex(o),a=Sx(o);if(!i||!s||!a)throw new Se(`could not parse side/coin/interval. ${ir}`);let c=Ax(o);if(!(c.maxLeverage>0)||c.maxLeverage>50)throw new Se("leverage out of range");if(!(c.positionSizePct>0)||c.positionSizePct>100)throw new Se("position size out of range");let u=n+r,l=xx(o),d=`Draft ${s} ${i}`.slice(0,100),f=kx(o),p=Ix(o),m=_x(o),y=Ox(o),h=Tx(o),w=Cx(o),v=Nx(o),T=[f,p,m,y,h,w,v].filter(Boolean);if(T.length!==1)throw new Se(`unsupported or ambiguous prompt. ${ir}`);if(!Rx(o,T[0]))throw new Se(`unsupported or ambiguous prompt. ${ir}`);let S,k=T[0],x={side:i,coin:s,interval:a,risk:c,expiresAt:u,id:l,name:d,spec:k};k.kind==="ema_cross"?S=Px(x):k.kind==="rsi"?S=Lx(x):k.kind==="open_interest"?S=qx(x):k.kind==="funding"?S=$x(x):S=Ux(x);let E=fc(S,{nowMs:n});if(!E.ok)throw new Se(`draft failed validation: ${E.errors.map(b=>b.message).join("; ")}`);return gc(Ne(S,{nowMs:n}))}var Se,lx,dx,px,ir,fx,mx,hx,yx,Bx,em=_(()=>{xn();Se=class extends Error{constructor(t){super(t),this.name="StrategyDraftError"}},lx=new Set(["1m","3m","5m","15m","30m","1h","2h","4h","8h","12h","1d"]),dx=new Set(["BTC","ETH","SOL","HYPE"]),px=/\b(mnemonic|private\s*key|privkey|seed\s*phrase|seed\b|api[_-]?key|secret\s*key|wallet\s*key|passphrase)\b/i,ir="Supported grammar: (1) EMA cross: <long|short> <COIN> when EMA <n> crosses <above|below> EMA <m> [on <interval>] [, exit on reverse] [, risk knobs]; (2) RSI: <long|short> <COIN> when RSI <n> <above|below> <threshold> [on <interval>] [, risk knobs]; (3) funding: <long|short> <COIN> when funding rate <above|below> <decimal|percent%> [on <interval>] [, risk knobs]; (4) open interest: <long|short> <COIN> when open interest <above|below> <non-negative number> [on <interval>] [, risk knobs]; (5) premium: <long|short> <COIN> when premium <above|below> <decimal|percent%> [on <interval>] [, risk knobs]; (6) oi delta: <long|short> <COIN> when oi delta <above|below> <number> [on <interval>] [, risk knobs]; (7) book imbalance: <long|short> <COIN> when book imbalance <above|below> <-1..1> [on <interval>] [, risk knobs]. Risk knobs: stop loss %, take profit %, leverage, position size %, max notional USD. Coins: BTC ETH SOL HYPE or uppercase token <=12 chars. Intervals: 1m 3m 5m 15m 30m 1h 2h 4h 8h 12h 1d.",fx=Object.freeze({maxLeverage:1,maxNotionalUsd:100,positionSizePct:5,stopLossPct:2,takeProfitPct:4,cooldownBars:1,maxDailyLossPct:3}),mx=36e5,hx=30*864e5,yx=864e5;Bx=Object.freeze({funding:"fundingRate",open_interest:"openInterest",premium:"premium",oi_delta:"oiDelta",book_imbalance:"bookImbalance"})});import{createHash as Mx}from"node:crypto";function rm(e){let t=String(e).toLowerCase();return t==="holdout"||t==="test"||t==="oos"||t.includes("holdout")||t.includes("oos")?!0:t==="testbars"||t.endsWith("testbars")||t.startsWith("test")||t.endsWith("test")?!t.includes("backtest"):!1}function om(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function wc(e){if(e==null||typeof e!="object"||Object.isFrozen(e))return e;if(Array.isArray(e)){for(let t of e)wc(t);return Object.freeze(e)}for(let t of Object.keys(e))wc(e[t]);return Object.freeze(e)}function oo(e){if(Array.isArray(e))return e.map(oo);if(e!=null&&typeof e=="object"){let t={};for(let n of Object.keys(e).sort())t[n]=oo(e[n]);return t}return e}function Bi(e){return JSON.stringify(oo(e))}function Dx(e){let{min:t,max:n,step:r}=e;if(!(r>0)||t>n)return[];let o=[],i=Math.floor((n-t)/r+1e-9);for(let a=0;a<=i;a++){let c=t+a*r;if(c>n+1e-9)break;let u=Math.abs(c-Math.round(c))<1e-9?Math.round(c):Number(c.toPrecision(12));u<t-1e-9||u>n+1e-9||o.push(u)}if(o.length===0)return[];let s=o[o.length-1];if(Math.abs(s-n)>1e-9){let a=(n-t)/r;Math.abs(a-Math.round(a))<=1e-9&&o.push(n)}return o}function Fx(e,t){if(e.length===0)return[];let n=[{}];for(let r of e){let o=t[r],i=[];for(let s of n)for(let a of o)i.push({...s,[r]:a});n=i}return n.sort((r,o)=>{let i=Bi(r),s=Bi(o);return i<s?-1:i>s?1:0}),n}function bc(e,t,n,r,o){let i=0;if(e==="maxDrawdownPct"){if(i=t.maxDrawdownPct-r.maxDrawdownPct,i!==0)return i<0}else if(i=t[e]-r[e],i!==0)return i>0;let s=Bi(n),a=Bi(o);return s<a}function im(e,t,n={}){if(!om(n))throw new TypeError("options must be a plain object");for(let S of Object.keys(n))if(rm(S))throw new TypeError(`options must not include holdout/test/oos key "${S}"`);let r=new Set(["maxTrials","objective","backtestOptions"]);for(let S of Object.keys(n))if(!r.has(S))throw new TypeError(`unknown option "${S}"`);let o=64;if("maxTrials"in n){let S=n.maxTrials;if(!Number.isInteger(S)||S<1||S>tm)throw new TypeError(`maxTrials must be an integer 1..${tm}`);o=S}let i=n.objective??"netPnlUsd";if(!nm.has(i))throw new TypeError(`objective must be one of ${[...nm].join("|")}`);let s=n.backtestOptions??{};if(!om(s))throw new TypeError("backtestOptions must be a plain object");for(let S of Object.keys(s))if(rm(S))throw new TypeError(`backtestOptions must not include holdout/test/oos key "${S}"`);let a=Ne(e),c=Object.keys(a.parameters).sort();if(c.length===0)throw new Error("optimizeStrategy requires at least one declared parameter");let u={},l=1;for(let S of c){let k=Dx(a.parameters[S]);if(k.length===0)throw new Error(`parameter "${S}" produces an empty grid`);u[S]=k,l*=k.length}let d=Fx(c,u);if(d.length===0)throw new Error("parameter grid is empty");let f=d.slice(0,o),p=[],m=null,y=null;for(let S of f){let k=to(a,S),x=nn(k,t,s);y==null&&(y=x.config);let E={netPnlUsd:x.metrics.netPnlUsd,netPnlPct:x.metrics.netPnlPct,maxDrawdownPct:x.metrics.maxDrawdownPct,winRate:x.metrics.winRate,profitFactor:x.metrics.profitFactor,tradeCount:x.metrics.tradeCount,sharpe:x.metrics.sharpe,turnoverUsd:x.metrics.turnoverUsd},b={parameters:{...S},metrics:E};p.push(b),(!m||bc(i,E,S,m.metrics,m.parameters))&&(m=b)}p.sort((S,k)=>bc(i,S.metrics,S.parameters,k.metrics,k.parameters)?-1:bc(i,k.metrics,k.parameters,S.metrics,S.parameters)?1:0);let h={...m.parameters},w=to(a,h),v={strategyHash:er(a),compilerHash:kn,trainBarsHash:Jr(t),backtestConfig:y,objective:i,maxTrials:o,trialsRun:p.length,candidates:p,bestParameters:h,bestStrategy:w},T={id:Mx("sha256").update(JSON.stringify(oo(v)),"utf8").digest("hex"),...v};return wc(oo(JSON.parse(JSON.stringify(T))))}var tm,nm,sm=_(()=>{In();xn();Ri();tm=256,nm=new Set(["netPnlUsd","profitFactor","sharpe","maxDrawdownPct"])});import Ut from"node:fs";import Ui from"node:path";function Mi(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function vt(e){return e==null?e:JSON.parse(JSON.stringify(e))}function Hx(e){return String(e).toLowerCase().replace(/[^a-z0-9]/g,"")}function sr(e,t="record"){if(Array.isArray(e)){e.forEach((n,r)=>sr(n,`${t}[${r}]`));return}if(Mi(e))for(let[n,r]of Object.entries(e)){let o=Hx(n);if(jx.some(i=>o.includes(i)))throw new Error(`shadow-store: forbidden secret-like field at ${t}.${n}`);sr(r,`${t}.${n}`)}}function zx(e){if(typeof e!="string"||!e||!Ui.isAbsolute(e))throw new Error("shadow-store: path must be an absolute path")}function am(e){let t;try{t=Ut.lstatSync(e)}catch(r){if(r&&r.code==="ENOENT")return;throw r}if(t.isSymbolicLink())throw new Error("shadow-store: store path must not be a symlink");if(!t.isFile())throw new Error("shadow-store: store path must be a regular file");if(t.mode&511&18)throw new Error("shadow-store: store file must not be group or world writable")}function Vx(){return{version:Sc,runners:[]}}function cm(e,t){let n;try{n=JSON.parse(e)}catch{throw new Error("shadow-store: malformed JSON")}if(!Mi(n))throw new Error("shadow-store: malformed JSON root");if(n.version!==Sc)throw new Error(`shadow-store: unsupported version ${n.version}`);if(!Array.isArray(n.runners))throw new Error("shadow-store: runners must be an array");return sr(n,Ui.basename(t)),{version:Sc,runners:n.runners.map(r=>vt(r))}}function um(e,t){sr(t,"store");let n=Ui.dirname(e);Ut.mkdirSync(n,{recursive:!0,mode:448});let r=Ui.join(n,`.shadow-store.${process.pid}.${Date.now()}.tmp`),o=`${JSON.stringify(t)}
8
- `;try{Ut.writeFileSync(r,o,{mode:384,flag:"wx"}),Ut.renameSync(r,e);try{Ut.chmodSync(e,384)}catch{}}catch(i){try{Ut.unlinkSync(r)}catch{}throw i}}function lm(e={}){let t=e.path;if(zx(t),am(t),Ut.existsSync(t)?cm(Ut.readFileSync(t,"utf8"),t):um(t,Vx()),Ec.has(t))return Ec.get(t);let n=!1,r=[];function o(){if(n)return;let m=r.shift();if(m){n=!0;try{let y=m.fn();n=!1,m.resolve(y),o()}catch(y){n=!1,m.reject(y),o()}}}function i(m){if(!n&&r.length===0){n=!0;try{return m()}finally{n=!1,queueMicrotask(o)}}return new Promise((y,h)=>{r.push({fn:m,resolve:y,reject:h}),queueMicrotask(o)})}function s(){return am(t),cm(Ut.readFileSync(t,"utf8"),t)}function a(m){um(t,m)}function c(m){if(!Mi(m)||typeof m.id!="string"||!m.id)throw new Error("shadow-store: create requires record with string id");sr(m,"record");let y=s();if(y.runners.some(w=>w.id===m.id))throw new Error(`shadow-store: runner id already exists: ${m.id}`);let h=vt(m);return y.runners.push(h),a(y),vt(h)}function u(m){let y=s().runners.find(h=>h.id===m);return y?vt(y):null}function l(){return s().runners.map(m=>vt(m))}function d(m,y){if(typeof y!="function")throw new Error("shadow-store: updater must be a function");let h=s(),w=h.runners.findIndex(S=>S.id===m);if(w<0)throw new Error(`shadow-store: runner not found: ${m}`);let v=vt(h.runners[w]),T=y(v);if(!Mi(T)||T.id!==m)throw new Error("shadow-store: updater must return record with same id");return sr(T,"record"),h.runners[w]=vt(T),a(h),vt(h.runners[w])}function f(m){let y=s(),h=y.runners.findIndex(v=>v.id===m);if(h<0)throw new Error(`shadow-store: runner not found: ${m}`);let w=vt(y.runners[h]);return w.status!=="stopped"&&(w.status="stopped",y.runners[h]=w,a(y)),vt(y.runners[h])}let p={create(m){return i(()=>c(m))},get(m){return u(m)},list(){return l()},update(m,y){return i(()=>d(m,y))},stop(m){return i(()=>f(m))}};return Ec.set(t,p),p}var Sc,jx,Ec,dm=_(()=>{Sc=1,jx=["privatekey","secretkey","seed","mnemonic","passphrase","password","keystore","keymaterial","apikey","authtoken","accesstoken","refreshtoken","credential","bearer","signature","authorization","xprv","xpriv","wif"];Ec=new Map});import{createHash as xc}from"node:crypto";function Ac(e){return e==null?e:JSON.parse(JSON.stringify(e))}function vc(e){return Array.isArray(e)?e.map(vc):e&&typeof e=="object"?Object.fromEntries(Object.keys(e).sort().map(t=>[t,vc(e[t])])):e}function fm(e){if(!e||typeof e!="object"||Array.isArray(e))throw new TypeError("shadow-runner: record must be an object");return xc("sha256").update(JSON.stringify(vc(e))).digest("hex")}function Wx(e,t,n,r,o){return xc("sha256").update(`${e}|${t}|${n}|${r}|${o}`).digest("hex")}function Gx(e,t,n,r){return xc("sha256").update(`shadow|${e}|${t}|${n}|${r??""}`).digest("hex")}function Kx(e){return e==="entryLong"||e==="exitShort"?"buy":e==="entryShort"||e==="exitLong"?"sell":e}function pm(e){return e==="entryLong"||e==="entryShort"}function kc({storePath:e,clock:t=Date.now}={}){if(typeof e!="string"||!e)throw new Error("shadow-runner: storePath required");let n=lm({path:e});function r({strategy:c,evidenceId:u=null}={}){let l=Re(c),d=u==null?null:String(u),f=n.list().filter(w=>w.status==="running"&&w.strategyHash===l.strategyHash&&w.compilerHash===l.compilerHash&&w.evidenceId===d).sort((w,v)=>w.createdAt-v.createdAt||w.id.localeCompare(v.id))[0];if(f)return Ac(f);let p=t(),m=Gx(p,l.strategyHash,l.compilerHash,d),y=n.get(m);if(y)return Ac(y);let h={id:m,strategy:Ac(l.strategy),strategyHash:l.strategyHash,compilerHash:l.compilerHash,evidenceId:d,status:"running",cursor:null,intendedOrders:[],fills:[],missedFills:[],markouts:[],createdAt:p,updatedAt:p,position:null,cooldownBarsRemaining:0,cooldownStartT:null,lastProcessedBarIndex:-1};return n.create(h)}function o(c){return n.get(c)}function i(){return n.list()}function s(c){return n.stop(c)}function a(c,u,{markoutHorizons:l=[1,4,12]}={}){if(!Array.isArray(u))throw new TypeError("shadow-runner: bars must be an array");return n.update(c,d=>{if(d.status!=="running")throw new Error("shadow-runner: runner is stopped");if(u.length===0)return d;let p=Re(d.strategy).evaluateAll(u),m=new Map;for(let I=0;I<u.length;I++)m.set(u[I].t,I);let y=d.cursor,h=[];for(let I=0;I<u.length;I++){let L=u[I].t;(y==null||L>y)&&h.push(I)}if(h.length===0)return d;let w=new Map(d.intendedOrders.map(I=>[I.id,I])),v=new Set(d.fills.map(I=>I.orderId)),T=new Map(d.missedFills.map(I=>[I.orderId,I])),S=(I,L)=>`${I}|${L}`,k=new Map(d.markouts.map(I=>[S(I.orderId,I.horizon),I])),x=d.position?{...d.position}:null,E=Number.isInteger(d.cooldownBarsRemaining)?Math.max(0,d.cooldownBarsRemaining):0,b=Number.isFinite(d.cooldownStartT)?d.cooldownStartT:null;function g({action:I,signalBarT:L,signalIndex:q}){let j=Kx(I),$=Wx(d.id,d.strategyHash,L,j,I);if(w.has($))return w.get($);let D=q+1,M=D<u.length,Q={id:$,action:I,type:I,side:j,signalBarT:L,fillBarT:M?u[D].t:null,status:M?"open":"missed"};return w.set($,Q),d.intendedOrders.push(Q),Q}function A(I,L,q){if(v.has(I.id))return;let j={orderId:I.id,action:pm(I.action)?"entry":"exit",side:I.side,price:L.o,barT:L.t,signalBarT:I.signalBarT,barIndex:q};if(d.fills.push(j),v.add(I.id),I.status="filled",I.fillBarT=L.t,T.has(I.id)&&(T.delete(I.id),d.missedFills=d.missedFills.filter($=>$.orderId!==I.id)),pm(I.action)){x={side:I.action==="entryLong"?"long":"short",entryOrderId:I.id,entryBarT:L.t,entryPrice:L.o,entryBarIndex:q};for(let $ of l){let D=S(I.id,$);if(k.has(D))continue;let M={orderId:I.id,horizon:$,entryBarT:L.t,entryPrice:L.o,side:x.side,status:"pending",close:null,barT:null};k.set(D,M),d.markouts.push(M)}}else x=null,E=Number(d.strategy?.risk?.cooldownBars)||0,b=L.t}function P(I){if(v.has(I.id)||T.has(I.id))return;let L={orderId:I.id,action:I.action,side:I.side,signalBarT:I.signalBarT,status:"missed"};T.set(I.id,L),d.missedFills.push(L),I.status="missed"}for(let I of d.intendedOrders){if(I.status==="filled"||v.has(I.id))continue;let L=m.get(I.signalBarT);if(L==null)continue;let q=L+1;q<u.length&&(y==null||u[q].t>y)&&A(I,u[q],q)}for(let I of h){let L=u[I],q=p[I].signals,j=x,$=M=>{if(x||E>0&&(b==null||L.t>=b))return;let Y=g({action:M,signalBarT:L.t,signalIndex:I}),Ue=I+1;Ue<u.length?A(Y,u[Ue],Ue):P(Y)},D=M=>{if(!x||x.side==="long"&&M!=="exitLong"||x.side==="short"&&M!=="exitShort")return;let Q=g({action:M,signalBarT:L.t,signalIndex:I}),Y=I+1;Y<u.length?A(Q,u[Y],Y):P(Q)};j?(q.exitLong&&D("exitLong"),q.exitShort&&D("exitShort")):q.entryLong&&q.entryShort||(q.entryLong&&$("entryLong"),q.entryShort&&$("entryShort")),E>0&&b!=null&&L.t>=b&&(E-=1,E===0&&(b=null)),d.cursor=L.t,d.lastProcessedBarIndex=I}for(let I of d.markouts){if(I.status!=="pending")continue;let L=d.fills.find($=>$.orderId===I.orderId&&$.action==="entry");if(!L)continue;let q=m.get(L.barT);if(q==null)continue;let j=q+I.horizon;if(j<u.length){I.close=u[j].c,I.barT=u[j].t,I.status="filled";let $=I.entryPrice;I.markout=I.side==="long"?(I.close-$)/$:($-I.close)/$}}return d.position=x,d.cooldownBarsRemaining=E,d.cooldownStartT=b,d.updatedAt=t(),d})}return{start:r,step:a,list:i,get:o,stop:s}}var mm=_(()=>{In();dm()});var gm={};z(gm,{runStrategyOperation:()=>nk});import Yx from"node:os";import Xx from"node:path";function io(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function Qx(e){return String(e).toLowerCase().replace(/[^a-z0-9]/g,"")}function _c(e){if(Array.isArray(e)){for(let t of e)_c(t);return}if(io(e))for(let[t,n]of Object.entries(e)){if(Jx.some(r=>Qx(t).includes(r)))throw new Error(`strategy service: secret-like field "${t}" is forbidden`);_c(n)}}function Zx(e){if(!io(e))throw new TypeError("strategy input must be a plain object");return _c(e),e}function ek(e,t={}){if(t.nowMs!==void 0){if(!Number.isInteger(t.nowMs))throw new TypeError("nowMs must be an integer epoch milliseconds");return t.nowMs}let n=Date.now();if(e.nowMs===void 0||e.nowMs===null)return n;if(!Number.isInteger(e.nowMs))throw new TypeError("nowMs must be an integer epoch milliseconds");if(Math.abs(e.nowMs-n)>12e4)throw new Error("nowMs outside allowed wall-clock skew (120s); omit nowMs to use server time");return e.nowMs}async function Ic(e,t,n,r){if(Array.isArray(t.bars))return t.bars;let o=ic(e.venue),i=n.fetchBars??o.fetchBars;if(typeof i!="function")throw new Error(`strategy venue ${o.id} does not support history`);n.signal?.throwIfAborted?.();let s=await i({coin:e.market.coin,interval:e.market.interval,count:t.count??1500,endTime:t.endTime??r},{signal:n.signal});n.signal?.throwIfAborted?.();let a=Array.isArray(s)?s:s?.bars;if(!Array.isArray(a))throw new Error("strategy history provider returned no bars");return a}function Oc(e,t){let n=e.backtestOptions??{};if(!io(n))throw new TypeError("backtestOptions must be a plain object");return{...n,nowMs:t}}function hm(e,t,n,r,o={}){let i=e.evidenceOptions??{};if(!io(i))throw new TypeError("evidenceOptions must be a plain object");return{...i,...o,strategy:t,bars:n,backtestOptions:Oc(e,r)}}function ym(){return Xx.join(Yx.homedir(),".oracle","strategy-shadow.json")}function tk(e,t){return{perStrategyNotionalUsd:e.risk.maxNotionalUsd,maxLeverage:e.risk.maxLeverage,dailyLossCapUsd:e.risk.maxNotionalUsd*(e.risk.maxDailyLossPct/100),chainAllowlist:[e.venue],assetAllowlist:[e.market.coin],expiresAt:Math.min(e.risk.expiresAt,t+864e5),killSwitchRequired:!0}}async function nk(e,t={},n={}){n.signal?.throwIfAborted?.();let r=Zx(t),o=ek(r,n);if(e==="draft")return{strategy:Zf(r.prompt,{nowMs:o})};if(e==="validate"){let i=Re(r.strategy);if(i.strategy.risk.expiresAt<=o)throw new Error("strategy is expired");return{valid:!0,strategy:i.strategy,strategyHash:i.strategyHash,compilerHash:i.compilerHash,compilerVersion:i.compilerVersion,requiredSeries:i.requiredSeries}}if(e==="backtest"||e==="evidence"){let i=Re(r.strategy),s=await Ic(i.strategy,r,n,o);ro(i,s);let a=ec(hm(r,i.strategy,s,o));return e==="evidence"?a:{backtest:nn(i.strategy,s,Oc(r,o)),evidence:a}}if(e==="optimize"){let i=Re(r.strategy),s=await Ic(i.strategy,r,n,o);ro(i,s);let a=r.trainFraction,c=r.evidenceOptions?.trainFraction;if(a!=null&&c!=null&&a!==c)throw new TypeError("conflicting trainFraction controls are forbidden");let u=a??c??.7;if(typeof u!="number"||u<=0||u>=1)throw new TypeError("trainFraction must be in (0,1)");let l=s.slice(0,Math.floor(s.length*u)),d=r.options??{};if(!io(d))throw new TypeError("options must be a plain object");let f=im(i.strategy,l,{...d,...r.maxTrials==null?{}:{maxTrials:r.maxTrials},backtestOptions:Oc(r,o)}),p=f.bestStrategy;return{strategy:p,optimization:f,evidence:ec(hm(r,p,s,o,{trainFraction:u}))}}if(e==="shadow"){let i=kc({storePath:n.storePath??ym(),clock:()=>o}),s=r.action;if(s==="start")return await i.start({strategy:r.strategy,evidenceId:r.evidenceId??r.evidence?.id??null});if(s==="list")return await i.list();if(s==="get")return await i.get(r.id);if(s==="stop")return await i.stop(r.id);if(s==="step"){let a=await i.get(r.id);if(!a)throw new Error(`shadow runner not found: ${r.id}`);let c=await Ic(a.strategy,r,n,o);return ro(Re(a.strategy),c),await i.step(r.id,c,r.stepOptions??{})}throw new Error(`unknown shadow action: ${s}`)}if(e==="prepare"){let i=Re(r.strategy),s=ic(i.strategy.venue);if(typeof r.shadowId!="string"||!r.shadowId)throw new Error("strategy prepare requires a matching shadow runner id");let c=await kc({storePath:n.storePath??ym(),clock:()=>o}).get(r.shadowId);if(!c)throw new Error("strategy prepare shadow runner not found");if(c.status!=="running")throw new Error("strategy prepare requires an active shadow runner");if(!Number.isFinite(c.cursor))throw new Error("strategy prepare requires a stepped shadow runner");if(c.strategyHash!==i.strategyHash||c.compilerHash!==i.compilerHash)throw new Error("strategy prepare shadow runner does not match strategy artifacts");if(c.evidenceId!==r.evidence?.id)throw new Error("strategy prepare shadow runner does not match evidence artifact");let u=r.caps??tk(i.strategy,o);return s.prepareIntent({strategy:i.strategy,evidence:r.evidence,shadow:{id:c.id,stateHash:fm(c),status:c.status,cursor:c.cursor,updatedAt:c.updatedAt},caps:u,nowMs:o,env:n.env??process.env})}throw new Error(`unknown strategy operation: ${e}`)}var Jx,bm=_(()=>{Ri();In();tc();em();sm();mm();sc();Jx=["privatekey","secretkey","seed","mnemonic","passphrase","password","keystore","keymaterial","apikey","authtoken","accesstoken","refreshtoken","credential","bearer","signature","authorization","xprv","xpriv","wif"]});var Nm={};z(Nm,{DEFAULT_CROSS_CHAIN_SOURCES:()=>km,DEFAULT_SAME_CHAIN_SOURCES:()=>xm,NATIVE_TOKEN:()=>Tc,canonicalJson:()=>_m,hashFirmQuote:()=>Cm,hashRfqIntent:()=>Tm,normalizeFirmQuote:()=>Nc,normalizeRfqIntent:()=>ck,sha256Hex:()=>so});import{createHash as rk}from"node:crypto";import{getAddress as vm,isAddress as Cc}from"ethers";function ae(e,t="invalid"){throw new Error(`rfq: ${e} ${t}`)}function Em(e,t){let n=Number(e);return(!Number.isSafeInteger(n)||n<=0)&&ae(t,"must be a positive chainId"),n}function Di(e,t){let n=String(e??"").trim();return(!ok.test(n)||BigInt(n)<=0n)&&ae(t,"must be a positive integer string"),n}function ik(e,t){return e==null||e===""?null:Di(e,t)}function Sm(e,t){let n=String(e??"").trim();return n.toLowerCase()===Tc.toLowerCase()?Tc:(Cc(n)||ae(t,"must be an EVM address or native token sentinel"),vm(n))}function Im(e,t){let n=String(e??"").trim();return Cc(n)||ae(t,"must be an EVM address"),vm(n)}function sk(e,t){return e==null||e===""?null:Im(e,t)}function Am(e,t,n){return e===void 0?[...n]:(Array.isArray(e)||ae(t,"must be an array"),e.map(r=>String(r).trim()).filter(Boolean))}function ak(e,{nowMs:t,maxDeadlineMs:n},r){let o=Number(e);return Number.isFinite(o)||ae(r,"must be a finite millisecond timestamp"),o<=t&&ae(r,"expired"),o>t+n&&ae(r,"exceeds maxDeadlineMs"),Math.floor(o)}function ar(e){if(Array.isArray(e))return e.map(ar);if(e&&typeof e=="object"){let t={};for(let n of Object.keys(e).sort())e[n]!==void 0&&(t[n]=ar(e[n]));return t}return e}function _m(e){return JSON.stringify(ar(e))}function so(e){return`0x${rk("sha256").update(_m(e)).digest("hex")}`}function Om(e,t){let n={...e};for(let r of t)delete n[r];return n}function Tm(e){return so(Om(e,["intentHash"]))}function Cm(e){return so(Om(e,["firmQuoteHash"]))}function ck(e={},t={}){let n=Number(t.nowMs??Date.now()),r=Number(t.maxDeadlineMs??1800*1e3);(!Number.isFinite(n)||!Number.isFinite(r)||r<=0)&&ae("time","is invalid");let o=Em(e.fromChainId??e.fromChain,"fromChainId"),i=Em(e.toChainId??e.toChain,"toChainId"),a=o===i?xm:km,c={kind:"rfq-intent",version:1,fromChainId:o,toChainId:i,sellToken:Sm(e.sellToken??e.tokenIn??e.fromToken,"sellToken"),buyToken:Sm(e.buyToken??e.tokenOut??e.toToken,"buyToken"),sellAmount:Di(e.sellAmount??e.amountIn??e.fromAmount,"sellAmount"),receiver:Im(e.receiver??e.recipient??e.to,"receiver"),deadlineMs:ak(e.deadlineMs??e.deadline??e.expiresAtMs,{nowMs:n,maxDeadlineMs:r},"deadline"),minBuyAmount:ik(e.minBuyAmount??e.minOut??e.amountOutMin,"minBuyAmount"),allowedSources:Am(e.allowedSources,"allowedSources",a),allowedRouters:Am(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)?ar(e.metadata):{}};return c.slippageBps!=null&&(!Number.isInteger(c.slippageBps)||c.slippageBps<0||c.slippageBps>1e4)&&ae("slippageBps","must be 0 to 10000"),c.intentId=e.intentId?String(e.intentId):so({seed:"rfq-intent",intent:c}).slice(0,34),c.intentHash=Tm(c),Object.freeze(c)}function uk(e){return(!e||typeof e!="object"||Array.isArray(e))&&ae("artifact","required"),e.typedDataHash!=null&&!wm.test(String(e.typedDataHash))&&ae("artifact.typedDataHash","must be bytes32"),e.calldataHash!=null&&!wm.test(String(e.calldataHash))&&ae("artifact.calldataHash","must be bytes32"),e.to!=null&&!Cc(String(e.to))&&ae("artifact.to","must be an address"),e.data!=null&&!/^0x(?:[0-9a-fA-F]{2})*$/.test(String(e.data))&&ae("artifact.data","must be hex"),ar(e)}function Nc(e,t={},n={}){(!e||e.kind!=="rfq-intent")&&ae("intent","required");let r=Number(n.nowMs??Date.now()),o=Number(t.expiryMs??t.expiresAtMs??t.validUntilMs);Number.isFinite(o)||ae("quote expiry","required"),o<=r&&ae("quote","expired"),o>e.deadlineMs&&ae("quote expiry","exceeds intent deadline");let i=String(t.source??t.provider??"").trim();i||ae("source","required"),e.allowedSources.includes(i)||ae("source","not allowed by intent");let s=Di(t.amountOut??t.buyAmount,"amountOut"),a=Di(t.minBuyAmount??t.minOut??s,"minBuyAmount");BigInt(a)>BigInt(s)&&ae("minBuyAmount","exceeds amountOut");let c=uk(t.artifact??t.executableArtifact??t.transaction??t.typedData),u=Number(t.quotedAtMs??t.timestampMs??n.nowMs??Date.now());Number.isFinite(u)||ae("quotedAtMs","must be finite");let l=sk(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:l,amountOut:s,minBuyAmount:a,quotedAtMs:Math.floor(u),expiryMs:Math.floor(o),artifact:c,maker:t.maker?String(t.maker):null,metadata:t.metadata&&typeof t.metadata=="object"&&!Array.isArray(t.metadata)?ar(t.metadata):{}};return d.quoteId||(d.quoteId=so({seed:"rfq-quote",out:d}).slice(0,34)),d.firmQuoteHash=Cm(d),Object.freeze(d)}var Tc,xm,km,wm,ok,Rc=_(()=>{Tc="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",xm=Object.freeze(["lifi","paraswap","0x","cow","uniswap-v3"]),km=Object.freeze(["lifi"]),wm=/^0x[0-9a-fA-F]{64}$/,ok=/^\d+$/});var qm={};z(qm,{executeRfqCandidates:()=>Lm,rankRfqQuotes:()=>$m,requestRfqQuotes:()=>pk,sourceCandidates:()=>Pm});function ao(e,t){return Array.isArray(e?.allowedSources)&&e.allowedSources.includes(t)}function Rm(e,t){return String(e?.[t]??"").trim()}function co(e,t){return Object.freeze({source:e,run:t})}function Pm(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??ke,i=Number(e.fromChainId)===Number(e.toChainId),s=[];return ao(e,"lifi")&&s.push(co("lifi",async()=>{let c=await(r.lifiQuote??wn)({fromChain:e.fromChainId,toChain:e.toChainId,fromToken:e.sellToken,toToken:e.buyToken,fromAmount:e.sellAmount,fromAddress:e.receiver},t),u=c?.estimate??c?.[0]?.estimate??c;return{quoteId:c?.id??c?.routeId??null,amountOut:u?.toAmount??c?.toAmount,minBuyAmount:u?.toAmountMin??c?.toAmountMin??u?.toAmount??c?.toAmount,expiryMs:Date.now()+Number(t.defaultQuoteTtlMs??2e4),artifact:{type:"lifi-route",calldataHash:c?.transactionRequest?.data?await lk(t,c.transactionRequest.data):void 0,route:c},metadata:{tool:c?.tool??c?.toolDetails?.name??null}}})),i&&(ao(e,"paraswap")&&s.push(co("paraswap",async()=>{let c=await(r.paraswapPrice??Hn)({chainId:e.fromChainId,srcToken:e.sellToken,destToken:e.buyToken,amount:e.sellAmount,srcDecimals:t.decimalsIn,destDecimals:t.decimalsOut},t),u=c?.priceRoute??c;return{quoteId:u?.id??null,amountOut:u?.destAmount,minBuyAmount:c?.amountOutMinimum??u?.destAmount,expiryMs:Date.now()+Number(t.defaultQuoteTtlMs??2e4),artifact:{type:"paraswap-price-route",route:u},metadata:{contractAddress:u?.contractAddress??null}}})),ao(e,"0x")&&(Rm(n,"ZEROX_API_KEY")||Rm(n,"0X_API_KEY")||r.zeroxQuote)&&s.push(co("0x",async()=>{let c=await(r.zeroxQuote??zn)({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}}})),ao(e,"cow")&&s.push(co("cow",async()=>{let c=await(r.cowQuote??En)({chainId:e.fromChainId,sellToken:e.sellToken,buyToken:e.buyToken,sellAmountBeforeFee:e.sellAmount,from:e.receiver,signingScheme:"eip712"},t),u=c?.quote??c;return{quoteId:c?.id??null,amountOut:u?.buyAmount,minBuyAmount:u?.buyAmount,expiryMs:Math.min(Number(u?.validTo??0)*1e3||Date.now()+Number(t.defaultQuoteTtlMs??2e4),e.deadlineMs),artifact:{type:"cow-order",order:u},metadata:{solver:!0}}})),ao(e,"uniswap-v3")&&o[Number(e.fromChainId)]&&s.push(co("uniswap-v3",async()=>{let c=await(r.uniV3QuoteExactIn??gn)({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 lk(e,t){return`0x${(await import("node:crypto")).createHash("sha256").update(String(t)).digest("hex")}`}async function dk(e,t){return Promise.race([Promise.resolve().then(e.run),new Promise((n,r)=>setTimeout(()=>r(new Error(`${e.source}: timeout`)),t))])}async function Lm(e,t,n={}){let r=Number(n.timeoutMs??12e3),o=await Promise.allSettled(t.map(a=>dk(a,r))),i=[],s=[];for(let a=0;a<o.length;a++){let c=t[a],u=o[a];if(u.status==="rejected"){s.push({source:c.source,error:String(u.reason?.message||u.reason)});continue}try{i.push(Nc(e,{...u.value,source:c.source},n))}catch(l){s.push({source:c.source,error:String(l?.message||l)})}}return{quotes:i,failed:s}}function $m(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 u=BigInt(a.amountOut??0)-BigInt(s.amountOut??0);return u>0n?1:u<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 pk(e,t={}){let n=Pm(e,t),{quotes:r,failed:o}=await Lm(e,n,t),i=$m(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}}var Bm=_(()=>{Mr();ai();li();yi();qr();Rc()});var Um={};z(Um,{prepareBestBridgeRoute:()=>gk,supportedBridgePreparers:()=>yk});function yk(){return Object.keys(Fi)}async function gk(e,t={}){let{taker:n,fromChainId:r,toChainId:o}=e;if(!n)throw new Error("prepareBestBridgeRoute requires taker: bridge transactions are built FOR an address, and the quote-only placeholder must never end up in one");if(!fk.test(n))throw new Error(`taker must be a valid 20-byte address, got "${n}"`);if(mk.has(n.toLowerCase()))throw new Error(`taker "${n}" is a placeholder/burn address. Bridging to it would send funds to an address nobody controls, on a chain where you cannot undo it.`);let i=await Hr(e,t);if(!i.best)return{ok:!1,reason:"no source returned a usable bridge route",comparison:i};let s=e.source||i.best.source,a=i.routes.find(h=>h.source===s);if(!a)return{ok:!1,reason:`source "${s}" returned no usable route`,comparison:i};let c=Fi[s];if(!c){let h=i.routes.find(w=>Fi[w.source]&&w.source!==s);return{ok:!1,reason:`${s} won the comparison but has no bridge prepare path in this build. `+(h?`Next preparable route is ${h.source}; pass source:"${h.source}".`:"No route in this comparison can be prepared."),failureKind:"no-prepare-path",...h?{alternative:h.source}:{},winner:s,comparison:i}}let u;try{u=await c(e,t)}catch(h){let w=typeof h?.body=="string"?h.body:h?.body?JSON.stringify(h.body):"",v=[String(h?.message||h),w].filter(Boolean).join(" :: "),T=/allowance/i.test(v),S=!T&&/not enough|insufficient|balance/i.test(v),k=i.routes.find(x=>Fi[x.source]&&x.source!==s);return{ok:!1,reason:T?`${s} will not build calldata until the token approval exists on-chain. Approve first, then prepare again. Underlying: ${v}`:S?`${s} refused to build: ${v}. Quoting works for any address; preparing needs the real funded wallet on chain ${r}.`:`${s} bridge prepare failed: ${v}`,failureKind:T?"approval-required-first":S?"taker-not-funded":"provider-error",...k?{alternative:k.source}:{},comparison:i}}let l=u.transactions||[];if(!l.length)return{ok:!1,reason:`${s} returned no executable transaction for this route`,failureKind:"provider-error",comparison:i};let d=l.filter(h=>h.chainId!=null&&Number(h.chainId)!==Number(r));if(d.length)return{ok:!1,reason:`${s} returned a transaction for chain ${d[0].chainId} but the origin chain is ${r}. Refusing to hand over a mismatched artifact.`,failureKind:"chain-mismatch",comparison:i};let f=e.driftToleranceBps??hk,p=null,m=null;if(u.amountOut!=null&&a.grossOut!=null)try{let h=BigInt(a.grossOut),w=BigInt(u.amountOut);h>0n&&(p=Number((w-h)*10000n/h),p<-f&&(m=`route moved ${(p/100).toFixed(2)}% against you since the comparison (tolerance ${(f/100).toFixed(2)}%). Re-compare before signing.`))}catch{}let y=[...m?[m]:[],...i.warnings||[],`Bridging is NOT atomic: the origin transaction succeeding does not mean funds arrived on chain ${o}. Expect ~${u.durationSeconds!=null?`${u.durationSeconds}s`:"minutes"} before the destination credits, and do not re-send if it is pending.`];return l.length>1&&y.push(`This route needs ${l.length} transactions signed IN ORDER. Signing only the first leaves funds approved but not bridged.`),ne({ok:!0,chosen:{source:s,wasWinner:s===i.best.source,netOut:a.netOut,grossOut:a.grossOut,gasUsd:a.gasUsd},artifactKind:"unsigned-transaction-sequence",fromChainId:Number(r),toChainId:Number(o),transactionCount:l.length,transactions:l,requiresApproval:u.requiresApproval??null,minOut:u.minOut??null,durationSeconds:u.durationSeconds??null,destination:l[0]?.to??null,unsigned:!0,signedBy:"user-wallet",driftBps:p,warnings:y,runnersUp:i.routes.filter(h=>h.source!==s).map(h=>({source:h.source,netOut:h.netOut,gasUsd:h.gasUsd})),comparison:{rankedOn:i.rankedOn,sourcesAnswered:i.sourcesAnswered,sourcesTried:i.sourcesTried,improvementBps:i.improvementBps},note:`UNSIGNED. ${l.length} transaction(s) on chain ${r}, crediting chain ${o}. Verify every destination address before signing.`},{provider:"router",kind:"best-bridge"})}var fk,mk,hk,Fi,Mm=_(()=>{Yn();xe();fk=/^0x[0-9a-fA-F]{40}$/,mk=new Set(["0x0000000000000000000000000000000000000000","0x000000000000000000000000000000000000dead","0x0000000000000000000000000000000000000001","0x00000000000000000000000000000000000a1ce5"].map(e=>e.toLowerCase())),hk=100,Fi={relay:async({fromChainId:e,toChainId:t,tokenIn:n,tokenOut:r,amountIn:o,taker:i},s)=>{let{relayPrepare:a}=await Promise.resolve().then(()=>(wi(),bi)),c=await a({user:i,originChainId:e,destinationChainId:t,originCurrency:n,destinationCurrency:r,amount:String(o)},s);return{transactions:c.transactions||[],amountOut:c.quote?.details?.currencyOut?.amount??null,minOut:c.quote?.details?.currencyOut?.minimumAmount??null,durationSeconds:c.quote?.details?.timeEstimate??null}},lifi:async({fromChainId:e,toChainId:t,tokenIn:n,tokenOut:r,amountIn:o,taker:i,isHolder:s},a)=>{let{lifiPrepare:c}=await Promise.resolve().then(()=>(Mr(),xa)),u=await c({fromChain:e,toChain:t,fromToken:n,toToken:r,fromAmount:o,fromAddress:i,isHolder:s,feeAction:"bridge"},a);return{transactions:u.transaction?[u.transaction]:[],requiresApproval:u.requiresApproval??null,amountOut:u.quote?.estimate?.toAmount??null,minOut:u.quote?.estimate?.toAmountMin??null,durationSeconds:u.quote?.estimate?.executionDuration??null}}}});var jm={};z(jm,{buildTwapSchedule:()=>Fm,normalizeTwapParams:()=>Dm,prepareTwapChunk:()=>vk,simulateTwap:()=>xk});function Dm(e={}){let t=Math.max(bk,Math.min(wk,Number(e.splits)||Sk)),n=Math.max(.1,Number(e.windowHours)||Ak),r=Math.max(Ek,n*3600),o=BigInt(e.amount)/BigInt(t),i=Math.floor(r/t),s=Number(e.slippageBps)||100;if(!e.chainId)throw new Error("twap requires chainId");if(!e.tokenIn||!e.tokenOut)throw new Error("twap requires tokenIn and tokenOut");if(!e.taker)throw new Error("twap requires taker address");if(BigInt(e.amount)<=0n)throw new Error("twap amount must be positive");return{chainId:Number(e.chainId),tokenIn:String(e.tokenIn),tokenOut:String(e.tokenOut),amount:String(e.amount),splits:t,chunkSize:String(o),windowHours:n,windowSec:r,intervalSec:i,taker:String(e.taker),slippageBps:s,status:"planned",createdAt:new Date().toISOString()}}function Fm(e){let t=Dm(e),n=Math.floor(Date.now()/1e3),r=[];for(let o=0;o<t.splits;o++)r.push({splitIndex:o+1,executeAfter:new Date((n+o*t.intervalSec)*1e3).toISOString(),chunkSize:t.chunkSize});return{params:t,schedule:r}}async function vk(e,t,{chainId:n,tokenIn:r,tokenOut:o,chunkSize:i,taker:s,slippageBps:a}=e.params){if(t<1||t>e.params.splits)throw new Error(`splitIndex ${t} out of range 1-${e.params.splits}`);let c=await Kn({chainId:n,tokenIn:r,tokenOut:o,amountIn:i,taker:s}),u=ne(c.transaction??c.tx,{chainId:n,taker:s,tokenIn:r,tokenOut:o,amountIn:i,slippageBps:a,kind:"twap",splitIndex:t,totalSplits:e.params.splits});return{splitIndex:t,chunkSize:i,quote:{amountOut:c.amountOut??c.quote?.amountOut,source:c.source??c.venue,priceImpact:c.priceImpact},...u}}async function xk(e,{quoteFn:t=Kn,...n}={}){let r=Fm(e),o=[],i=0n,s="unknown";for(let c=0;c<r.params.splits;c++)try{let u=await t({chainId:r.params.chainId,tokenIn:r.params.tokenIn,tokenOut:r.params.tokenOut,amountIn:r.params.chunkSize,taker:r.params.taker},n),l=BigInt(u.amountOut??u.quote?.amountOut??"0");i+=l,s=u.source??u.venue??s,o.push({splitIndex:c+1,amountOut:String(l),source:u.source??u.venue})}catch(u){if(n.signal?.aborted)throw n.signal.reason||u;o.push({splitIndex:c+1,error:String(u.message||u).slice(0,200)})}let a=i>0n?(Number(i)/Number(BigInt(r.params.amount))).toFixed(6):null;return{params:r.params,schedule:r.schedule,totalOut:String(i),averagePrice:a,bestSource:s,chunks:o,simulatedAt:new Date().toISOString()}}var bk,wk,Ek,Sk,Ak,Hm=_(()=>{Yn();xe();bk=2,wk=100,Ek=60,Sk=10,Ak=6});async function Wm({srcChainId:e,srcChainTokenIn:t,srcChainTokenInAmount:n,dstChainId:r,dstChainTokenOut:o,slippage:i=100,affiliateFeePercent:s="0"}={},a={}){if(!e||!r||!t||!o||!n)return{error:"debridge quote requires srcChainId, dstChainId, srcChainTokenIn, dstChainTokenOut, srcChainTokenInAmount"};if(!zm.has(Number(e))||!zm.has(Number(r)))return{error:`debridge: unsupported chain pair ${e} -> ${r}`};try{let c={srcChainId:String(e),srcChainTokenIn:t,srcChainTokenInAmount:String(n),dstChainId:String(r),dstChainTokenOut:o,slippage:i,affiliateFeePercent:s},u=await C(`${Vm}/dln/order/quote`,{...a,method:"POST",body:JSON.stringify(c),headers:{"content-type":"application/json",...a.headers||{}}});return u.error?{error:String(u.error)}:{estimation:u.estimation??{},order:u.order??{},fixFee:u.fixFee??"0"}}catch(c){return{error:String(c.message||c).slice(0,200)}}}async function Gm(){try{return{ok:!0,chainCount:(await C(`${Vm}/supported-chains-info`))?.chains?.length??0}}catch(e){return{ok:!1,error:String(e.message||e).slice(0,160)}}}var Vm,zm,Km=_(()=>{G();xe();Vm="https://dln.debridge.finance/v1.0",zm=new Set([1,10,56,137,8453,42161,43114,59144,534352,7777777,324,5e3,1101,81457])});async function Xm({active:e=!0}={},t={}){let n=Date.now();if(cr.size&&n-Ym<kk)return[...cr.values()];try{let r=await C(`${Pc}/exchange/currencies?active=${e?"true":"false"}`,t);cr.clear();for(let o of r??[])cr.set(String(o.ticker).toLowerCase(),o);return Ym=n,r??[]}catch(r){return cr.size?[...cr.values()]:{error:String(r.message||r).slice(0,200)}}}async function Ik(e,t,n={}){if(!e||!t)return{error:"changenow minAmount requires fromTicker and toTicker"};try{return{minAmount:(await C(`${Pc}/exchange/min-amount/${encodeURIComponent(e)}_${encodeURIComponent(t)}`,n))?.minAmount??"0"}}catch(r){return{error:String(r.message||r).slice(0,200)}}}async function _k(e,t,n,{flow:r="standard"}={},o={}){if(!e||!t||!n)return{error:"changenow estimate requires fromTicker, toTicker, fromAmount"};try{let i=new URLSearchParams({fromCurrency:String(e).toLowerCase(),toCurrency:String(t).toLowerCase(),fromAmount:String(n),flow:r}),s=await C(`${Pc}/exchange/estimated-amount?${i}`,o);return{fromAmount:s?.fromAmount,toAmount:s?.toAmount,rate:s?.rate,flow:s?.flow??r}}catch(i){return{error:String(i.message||i).slice(0,200)}}}async function Jm({fromTicker:e,toTicker:t,fromAmount:n,flow:r}={},o={}){if(!e||!t)return{error:"changenow quote requires fromTicker and toTicker"};let i=await Ik(e,t,o);if(i.error)return i;let s=n??i.minAmount,a=await _k(e,t,s,{flow:r},o);if(a.error)return a;let c=await Xm({},o),u=c.find(d=>String(d?.ticker).toLowerCase()===String(e).toLowerCase()),l=c.find(d=>String(d?.ticker).toLowerCase()===String(t).toLowerCase());return{provider:"changenow",fromTicker:e,toTicker:t,fromAmount:s,toAmount:a.toAmount,estimatedRate:a.rate,minAmount:i.minAmount,flow:a.flow,networkFee:u?.networkFee??null,kycRequired:u?.kycRequired??l?.kycRequired??!1,riskDisclosure:"ChangeNOW is a centralized swap service. Funds are sent to a ChangeNOW deposit address. Not self-custodial during the swap window."}}async function Qm(){try{let e=await Xm();return e?.error?{ok:!1,error:e.error}:{ok:!0,currencyCount:Array.isArray(e)?e.length:0}}catch(e){return{ok:!1,error:String(e.message||e).slice(0,160)}}}var Pc,cr,Ym,kk,Zm=_(()=>{G();Pc="https://api.changenow.io/v2",cr=new Map,Ym=0,kk=6e5});async function eh({fromChain:e,toChain:t,fromToken:n,toToken:r,fromAmount:o,fromAddress:i,slippage:s=1}={},a={}){if(!e||!t||!n||!r||!o||!i)return{error:"squid quote requires fromChain, toChain, fromToken, toToken, fromAmount, fromAddress"};try{let c={fromChain:e,toChain:t,fromToken:n,toToken:r,fromAmount:String(o),fromAddress:i,slippage:s},u=await C(`${Ok}/route`,{...a,method:"POST",body:JSON.stringify(c),headers:{"content-type":"application/json",...a.headers||{}}});return{route:u?.route??{},toAmount:u?.route?.estimate?.toAmount,fee:u?.route?.estimate?.feeCosts}}catch(c){return{error:String(c.message||c).slice(0,200)}}}var Ok,th=_(()=>{G();Ok="https://api.squidrouter.com/v1"});async function nh({srcChainId:e,dstChainId:t,token:n,amount:r,dstGasForCall:o=0,minAmountOut:i="0"}={},s={}){if(!e||!t||!n||!r)return{error:"stargate quote requires srcChainId, dstChainId, token, amount"};try{let a=new URLSearchParams({srcChainId:String(e),dstChainId:String(t),token:n,amount:String(r),dstGasForCall:String(o),minAmountOut:String(i)}),c=await C(`${Tk}/quote?${a}`,s);return{amountOut:c?.amountOut,fee:c?.fee,estimatedTime:c?.estimatedTime}}catch(a){return{error:String(a.message||a).slice(0,200)}}}var Tk,rh=_(()=>{G();Tk="https://api.stargate.finance"});async function oh({fromAsset:e,toAsset:t,amount:n,destination:r}={},o={}){if(!e||!t||!n)return{error:"thorchain quote requires fromAsset, toAsset, amount"};try{let i=new URLSearchParams({from_asset:e,to_asset:t,amount:String(n),destination:r||""}),s=await C(`${Ck}/quote/swap?${i}`,o);return{expectedAmountOut:s?.expected_amount_out,fees:s?.fees,slippageBps:s?.slippage_bps,inboundAddress:s?.inbound_address,memo:s?.memo,estimatedTime:s?.total_swap_seconds?`${Math.round(s.total_swap_seconds/60)} min`:"unknown"}}catch(i){return{error:String(i.message||i).slice(0,200)}}}var Ck,ih=_(()=>{G();Ck="https://midgard.ninerealms.com/v2"});async function sh({fromChainId:e,toChainId:t,fromToken:n,toToken:r,fromAmount:o,userAddress:i}={},s={}){if(!e||!t||!n||!r||!o||!i)return{error:"bungee quote requires fromChainId, toChainId, fromToken, toToken, fromAmount, userAddress"};try{let a=new URLSearchParams({fromChainId:String(e),toChainId:String(t),fromTokenAddress:n,toTokenAddress:r,fromAmount:String(o),userAddress:i,sort:"output",singleTxOnly:"false"}),c=await C(`${Nk}/quote?${a}`,s);return{amountOut:c?.result?.toAmount,feeUsd:c?.result?.totalGasFeesInUsd,route:c?.result?.route,estimatedTime:c?.result?.serviceTime?`${c.result.serviceTime}s`:"unknown"}}catch(a){return{error:String(a.message||a).slice(0,200)}}}var Nk,ah=_(()=>{G();Nk="https://api.socket.tech/v2"});async function ch({originDomain:e,destinationDomain:t,originToken:n,destinationToken:r,amount:o}={},i={}){if(!e||!t||!n||!r||!o)return{error:"connext quote requires originDomain, destinationDomain, originToken, destinationToken, amount"};try{let s={originDomain:String(e),destinationDomain:String(t),originToken:n,destinationToken:r,amount:String(o)},a=await C(`${Rk}/estimate`,{...i,method:"POST",body:JSON.stringify(s),headers:{"content-type":"application/json",...i.headers||{}}});return{amountOut:a?.amountOut,fee:a?.fee,estimatedTime:a?.estimatedTransferTime}}catch(s){return{error:String(s.message||s).slice(0,200)}}}var Rk,uh=_(()=>{G();Rk="https://api.connext.network"});async function lh({fromChain:e,toChain:t,token:n,amount:r}={},o={}){if(!e||!t||!n||!r)return{error:"wormhole quote requires fromChain, toChain, token, amount"};try{let i=new URLSearchParams({fromChain:String(e),toChain:String(t),token:n,amount:String(r)}),s=await C(`${Pk}/quote?${i}`,o);return{amountOut:s?.amountOut,fee:s?.fee,estimatedTime:s?.estimatedTime}}catch(i){return{error:String(i.message||i).slice(0,200)}}}var Pk,dh=_(()=>{G();Pk="https://api.portalbridge.com/v1"});import{Interface as gh,getAddress as Lk,id as bh}from"ethers";function ur(e){return e?.cache===!1?!1:!e?.fetchImpl||e.cache===!0}function qc(e,t,n){let r=e.get(t);return r?Date.now()-r.at>n?(e.delete(t),null):r:null}function ji(e,t,n,r){for(e.delete(t),e.set(t,{at:Date.now(),value:n});e.size>r;){let o=e.keys().next();if(o.done)break;e.delete(o.value)}}function Jk(e,t){try{return Lk(e).toLowerCase()}catch{throw new Error(`${t} must be a valid EVM address`)}}function Qk(e){return`0x${e.slice(2).toLowerCase().padStart(64,"0")}`}function yh(e){return`0x${String(e).slice(-40).toLowerCase()}`}function Zk({unlimited:e,spenderLabel:t,lastActivityAt:n}){if(e)return"unlimited";if(!t)return"unknown-spender";if(n){let r=Date.parse(n);if(Number.isFinite(r)&&Date.now()-r>Vk)return"stale"}return"scoped"}function eI(e,t,n){if(n)return"UNLIMITED";if(t==null)return e.toString();let r=10n**BigInt(t),o=e/r,i=e%r;if(i===0n)return o.toLocaleString("en-US");let s=i.toString().padStart(t,"0").replace(/0+$/,"").slice(0,6);return`${o.toLocaleString("en-US")}${s?`.${s}`:""}`}async function tI(e,t,n,r){let o=`${e}:${t}`,i=r?.get(o);if(i)return i;if(ur(n)){let a=qc(mh,o,Wk);if(a)return a.value}let s=(async()=>{let a=async d=>{try{let f=ph.encodeFunctionData(d,[]),p=await te(e,"eth_call",[{to:t,data:f},"latest"],n);return!p||p==="0x"?null:ph.decodeFunctionResult(d,p)[0]}catch{return null}},[c,u]=await Promise.all([a("decimals"),a("symbol")]),l={decimals:c==null?null:Number(c),symbol:u==null?null:String(u).slice(0,24)};return ur(n)&&ji(mh,o,l,Yk),l})();return r?.set(o,s),s}async function nI(e,t,n){let r=Math.min(Math.max(Number(n.lookbackBlocks)||qk,1),Bk),o=await zo(e,n);if(!Number.isFinite(o))throw new Error("chain head unavailable");let i=Math.max(0,o-r),s=await te(e,"eth_getLogs",[{fromBlock:`0x${i.toString(16)}`,toBlock:"latest",topics:[$k,Qk(t)]}],n);if(!Array.isArray(s))throw new Error("log scan returned no array");let a=new Map;for(let c of s){let u=String(c?.address||"").toLowerCase(),l=c?.topics?.[2];!u||!l||a.set(`${u}:${yh(l)}`,{token:u,spender:yh(l)})}return{pairs:[...a.values()],fromBlock:i,toBlock:o}}function rI(e){return(jk[e]||[]).flatMap(n=>Mk.map(r=>({token:n.address,spender:r.address,symbol:n.symbol,decimals:n.decimals})))}async function oI(e,t,n={}){let r=[],o="direct-probe",i=null,s=rI(e),a=$c(e),c=ur(n)&&qc(Lc,e,Gk)?.value===!1;if(s.length===0&&a.length===0&&c)return{scan:{chainId:e,status:"unconfigured",method:o,error:"no Approval log access and no candidate token or collection set for this chain"},approvals:[]};try{let u=await nI(e,t,n);r=u.pairs,o="log-scan",i={fromBlock:u.fromBlock,toBlock:u.toBlock},ur(n)&&ji(Lc,e,!0,64)}catch{if(ur(n)&&ji(Lc,e,!1,64),r=s,r.length===0&&a.length===0)return{scan:{chainId:e,status:"unconfigured",method:o,error:"no Approval log access and no candidate token or collection set for this chain"},approvals:[]}}try{let u=new Map,d=(await yn(r,n.concurrency||4,async p=>{try{let m=await Ul({chainId:e,token:p.token,owner:t,spender:p.spender},n),y=BigInt(m.allowance);if(y<=0n)return null;let h=p.symbol?{symbol:p.symbol,decimals:p.decimals??null}:await tI(e,p.token,n,u),w=y>=zk,v=Uk[p.spender]||null;return{id:`${e}:${p.token}:${p.spender}`,chainId:e,standard:"erc20",token:p.token,tokenSymbol:h.symbol,decimals:h.decimals,spender:p.spender,spenderLabel:v,allowance:y.toString(),allowanceDisplay:eI(y,h.decimals,w),unlimited:w,lastActivityAt:null,risk:Zk({unlimited:w,spenderLabel:v,lastActivityAt:null})}}catch{return null}})).filter(Boolean),f=await sI(e,t,n);return{scan:{chainId:e,status:"ok",method:o,pairsProbed:r.length,collectionsProbed:$c(e).length,...i||{}},approvals:[...d,...f]}}catch(u){return{scan:{chainId:e,status:"unavailable",method:o,error:String(u?.message||u).slice(0,200)},approvals:[]}}}async function iI(e,t,n,r,o){try{let i=fh.encodeFunctionData("isApprovedForAll",[n,r]),s=await te(e,"eth_call",[{to:t,data:i},"latest"],o);return!s||s==="0x"?null:!!fh.decodeFunctionResult("isApprovedForAll",s)[0]}catch{return null}}function $c(e){return(Fk[e]||[]).flatMap(n=>Dk.map(r=>({collection:n.address,collectionName:n.name,operator:r.address,operatorLabel:r.label})))}async function sI(e,t,n){let r=$c(e);return r.length===0?[]:(await yn(r,n.concurrency||4,async i=>await iI(e,i.collection,t,i.operator,n)!==!0?null:{id:`${e}:${i.collection}:${i.operator}:all`,chainId:e,standard:"erc721",token:i.collection,tokenSymbol:i.collectionName,decimals:null,spender:i.operator,spenderLabel:i.operatorLabel,allowance:null,allowanceDisplay:"ALL ITEMS",unlimited:!0,lastActivityAt:null,risk:"operator-all"})).filter(Boolean)}async function wh(e={},t={}){let n=Jk(e.owner||e.address,"owner"),r=new Map(Zt.map(p=>[p.chainId,p])),o=Array.isArray(e.chainIds)&&e.chainIds.length?[...new Set(e.chainIds.map(Number))].filter(p=>r.has(p)):[...r.keys()],i=`${n}:${[...o].sort((p,m)=>p-m).join(",")}:${e.lookbackBlocks??""}`,s=ur(t)&&!e.refresh;if(s){let p=qc(hh,i,Kk);if(p)return{...p.value,cached:!0,cachedAgeMs:Date.now()-p.at}}let a=await yn(o,e.concurrency||3,p=>oI(p,n,{...t,lookbackBlocks:e.lookbackBlocks})),c=a.flatMap(p=>p.approvals),u=a.map(p=>p.scan),l=u.find(p=>p.method==="log-scan"&&p.toBlock),d=u.some(p=>p.method==="direct-probe"&&p.status==="ok"),f={provider:"approvals",operation:"scan",readOnly:!0,queriedAt:new Date().toISOString(),owner:n,scannedRange:l?`last ${l.toBlock-l.fromBlock} blocks`:d?"known routers, live allowance probe":null,approvals:c,scans:u,warnings:["Approval discovery is scoped. Log scanning is used where the endpoint permits it; otherwise a curated router set is probed directly. An empty result means nothing was found in that scope, not that the wallet is safe.","NFT operator approval (setApprovalForAll) is checked against a curated collection and marketplace set on supported chains only. A collection outside that set is not checked."]};return s&&ji(hh,i,f,Xk),{...f,cached:!1,cachedAgeMs:0}}var ph,fh,$k,qq,qk,Bk,Uk,Mk,Dk,Fk,jk,Hk,zk,Vk,Wk,Gk,Kk,Yk,Xk,mh,Lc,hh,Eh=_(()=>{Wr();G();it();ph=new gh(["function decimals() view returns (uint8)","function symbol() view returns (string)"]),fh=new gh(["function isApprovedForAll(address owner, address operator) view returns (bool)","function name() view returns (string)"]),$k=bh("Approval(address,address,uint256)"),qq=bh("ApprovalForAll(address,address,bool)"),qk=1e4,Bk=2e5,Uk=Object.freeze({"0x1111111254eeb25477b68fb85ed929f73a960582":"1inch v5 Router","0x111111125421ca6dc452d289314280a0f8842a65":"1inch v6 Router","0x68b3465833fb72a70ecdf485e0e4c7bd8665fc45":"Uniswap Universal Router","0x3fc91a3afd70395cd496c647d5a6cc9d4b2b7fad":"Uniswap Universal Router","0x000000000022d473030f116ddee9f6b43ac78ba3":"Permit2","0xe592427a0aece92de3edee1f18e0157c05861564":"Uniswap v3 Router","0x7a250d5630b4cf539739df2c5dacb4c659f2488d":"Uniswap v2 Router","0xdef1c0ded9bec7f1a1670819833240f027b25eff":"0x Exchange Proxy","0x2626664c2603336e57b271c5c0b26f421741e481":"Uniswap SwapRouter02 (Base)","0x6131b5fae19ea4f9d964eac0408e4408b66337b5":"KyberSwap Meta Aggregator","0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48":"USDC (token contract)"}),Mk=Object.freeze([{address:"0x000000000022d473030f116ddee9f6b43ac78ba3",label:"Permit2"},{address:"0x1111111254eeb25477b68fb85ed929f73a960582",label:"1inch v5 Router"},{address:"0x111111125421ca6dc452d289314280a0f8842a65",label:"1inch v6 Router"},{address:"0x68b3465833fb72a70ecdf485e0e4c7bd8665fc45",label:"Uniswap Universal Router"},{address:"0xe592427a0aece92de3edee1f18e0157c05861564",label:"Uniswap v3 Router"},{address:"0x7a250d5630b4cf539739df2c5dacb4c659f2488d",label:"Uniswap v2 Router"},{address:"0xdef1c0ded9bec7f1a1670819833240f027b25eff",label:"0x Exchange Proxy"},{address:"0x2626664c2603336e57b271c5c0b26f421741e481",label:"Uniswap SwapRouter02"}]),Dk=Object.freeze([{address:"0x1e0049783f008a0085193e00003d00cd54003c71",label:"OpenSea Seaport Conduit"},{address:"0x00000000000000adc04c56bf30ac9d3c0aaf14dc",label:"Seaport 1.5"},{address:"0x0000000000000068f116a894984e2db1123eb395",label:"Seaport 1.6"},{address:"0x00000000000001ad428e4906ae43d8f9852d0dd6",label:"Seaport 1.4"},{address:"0x000000000000ad05ccc4f10045630fb830b95127",label:"Blur Marketplace"},{address:"0x00000000000000000000000000000000000000a5",label:"Blur Execution Delegate"},{address:"0xf42aa99f011a1fa7cda90e5e98b277e306bca83e",label:"Rarible Transfer Proxy"},{address:"0x000000000022d473030f116ddee9f6b43ac78ba3",label:"Permit2"}]),Fk=Object.freeze({1:[{address:"0xbc4ca0eda7647a8ab7c2061c2e118a18a936f13d",name:"Bored Ape Yacht Club"},{address:"0x60e4d786628fea6478f785a6d7e704777c86a7c6",name:"Mutant Ape Yacht Club"},{address:"0xed5af388653567af2f388e6224dc7c4b3241c544",name:"Azuki"},{address:"0x8a90cab2b38dba80c64b7734e58ee1db38b8992e",name:"Doodles"},{address:"0x49cf6f5d44e70224e2e23fdcdd2c053f30ada28b",name:"CloneX"},{address:"0x23581767a106ae21c074b2276d25e5c3e136a68b",name:"Moonbirds"}]}),jk=Object.freeze({1:[{address:"0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48",symbol:"USDC",decimals:6},{address:"0xdac17f958d2ee523a2206206994597c13d831ec7",symbol:"USDT",decimals:6},{address:"0x6b175474e89094c44da98b954eedeac495271d0f",symbol:"DAI",decimals:18},{address:"0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2",symbol:"WETH",decimals:18},{address:"0x2260fac5e5542a773aa44fbcfedf7c193bc2c599",symbol:"WBTC",decimals:8}],8453:[{address:"0x833589fcd6edb6e08f4c7c32d4f71b54bda02913",symbol:"USDC",decimals:6},{address:"0x4200000000000000000000000000000000000006",symbol:"WETH",decimals:18}],42161:[{address:"0xaf88d065e77c8cc2239327c5edb3a432268e5831",symbol:"USDC",decimals:6},{address:"0xfd086bc7cd5c481dcc9c85ebe478a1c0b69fcbb9",symbol:"USDT",decimals:6},{address:"0x82af49447d8a07e3bd95bd0d56f35241523fbab1",symbol:"WETH",decimals:18}],10:[{address:"0x0b2c639c533813f4aa9d7837caf62653d097ff85",symbol:"USDC",decimals:6},{address:"0x4200000000000000000000000000000000000006",symbol:"WETH",decimals:18}],137:[{address:"0x3c499c542cef5e3811e1192ce70d8cc03d5c3359",symbol:"USDC",decimals:6},{address:"0xc2132d05d31c914a87c6611c10748aeb04b58e8f",symbol:"USDT",decimals:6}]}),Hk=(1n<<256n)-1n,zk=Hk/2n,Vk=4320*60*60*1e3,Wk=360*60*1e3,Gk=600*1e3,Kk=45*1e3,Yk=512,Xk=128,mh=new Map,Lc=new Map,hh=new Map});var vh={};z(vh,{aggregateBridgeQuotes:()=>Sh,bridgeAggregatorHealth:()=>cI,checkRevokeNeeded:()=>Ah,scanBridgeRoutes:()=>aI});async function Sh(e={},t={}){let{fromChainId:n,toChainId:r,tokenIn:o,tokenOut:i,amount:s,taker:a,fromSymbol:c="?",toSymbol:u="?",fromDecimals:l=18,toDecimals:d=18}=e,f=[],p=[],m=Wm({srcChainId:n,srcChainTokenIn:o,srcChainTokenInAmount:s,dstChainId:r,dstChainTokenOut:i},t).then(b=>b.error?(p.push(`debridge: ${b.error}`),null):{provider:"debridge",amountOut:b.estimation?.dstChainTokenOut?.amount??b.estimation?.toAmount,feeUsd:b.estimation?.fixFee??b.fixFee,estimatedTime:b.estimation?.execution?.estimatedTransferTime?`${b.estimation.execution.estimatedTransferTime}s`:"unknown",preparable:!0,raw:b}).catch(b=>(p.push(`debridge: ${b.message}`),null)),y=Hr({fromChainId:n,toChainId:r,tokenIn:o,tokenOut:i,amountIn:s,taker:a},t).then(b=>!b||b.error?(p.push(`lifi: ${b?.error??"no route"}`),null):{provider:"lifi-relay",amountOut:b.amountOut??b.quote?.amountOut,feeUsd:b.feeUsd??b.totalFee,estimatedTime:b.estimatedTime??b.duration??"unknown",preparable:!!b.transaction,raw:b}).catch(b=>(p.push(`lifi: ${b.message}`),null)),h=eh({fromChain:n,toChain:r,fromToken:o,toToken:i,fromAmount:s,fromAddress:a},t).then(b=>b.error?(p.push(`squid: ${b.error}`),null):{provider:"squid",amountOut:b.toAmount,feeUsd:Array.isArray(b.fee)?b.fee.reduce((g,A)=>g+(Number(A.amountUsd)||0),0):null,estimatedTime:"30s - 3min",preparable:!1,raw:b}).catch(b=>(p.push(`squid: ${b.message}`),null)),w=nh({srcChainId:n,dstChainId:r,token:o,amount:s},t).then(b=>b.error?(p.push(`stargate: ${b.error}`),null):{provider:"stargate",amountOut:b.amountOut,feeUsd:b.fee,estimatedTime:b.estimatedTime||"1-5 min",preparable:!1,raw:b}).catch(b=>(p.push(`stargate: ${b.message}`),null)),v=oh({fromAsset:c,toAsset:u,amount:s,destination:a},t).then(b=>b.error?(p.push(`thorchain: ${b.error}`),null):{provider:"thorchain",amountOut:b.expectedAmountOut,feeUsd:b.fees?.total,estimatedTime:b.estimatedTime||"10-30 min",preparable:!1,raw:b}).catch(b=>(p.push(`thorchain: ${b.message}`),null)),T=(async()=>{if(!c||!u||c==="?"||u==="?")return p.push("changenow: ticker symbols required, skipping"),null;try{let b=await Jm({fromTicker:c,toTicker:u,fromAmount:s},t);return b.error?(p.push(`changenow: ${b.error}`),null):{provider:"changenow",amountOut:b.toAmount,feeUsd:b.networkFee,estimatedTime:b.flow==="standard"?"5-30 min":"instant",preparable:!1,kycRequired:b.kycRequired,raw:b}}catch(b){return p.push(`changenow: ${b.message}`),null}})(),S=sh({fromChainId:n,toChainId:r,fromToken:o,toToken:i,fromAmount:s,userAddress:a},t).then(b=>b.error?(p.push(`bungee: ${b.error}`),null):{provider:"bungee",amountOut:b.amountOut,feeUsd:b.feeUsd,estimatedTime:b.estimatedTime,preparable:!1,raw:b}).catch(b=>(p.push(`bungee: ${b.message}`),null)),k=ch({originDomain:n,destinationDomain:r,originToken:o,destinationToken:i,amount:s},t).then(b=>b.error?(p.push(`connext: ${b.error}`),null):{provider:"connext",amountOut:b.amountOut,feeUsd:b.fee,estimatedTime:b.estimatedTime||"5-20 min",preparable:!1,raw:b}).catch(b=>(p.push(`connext: ${b.message}`),null)),x=lh({fromChain:n,toChain:r,token:o,amount:s},t).then(b=>b.error?(p.push(`wormhole: ${b.error}`),null):{provider:"wormhole",amountOut:b.amountOut,feeUsd:b.fee,estimatedTime:b.estimatedTime||"5-15 min",preparable:!1,raw:b}).catch(b=>(p.push(`wormhole: ${b.message}`),null)),E=await Promise.allSettled([m,y,h,w,v,S,k,x,T]);for(let b of E)b.status==="fulfilled"&&b.value&&f.push(b.value);return f.sort((b,g)=>{let A=Number(b.amountOut??0),P=Number(g.amountOut??0);return A!==P?P-A:b.preparable&&!g.preparable?-1:!b.preparable&&g.preparable?1:0}),{providers:f.map(b=>b.provider),bestRoute:f[0]?.provider??"none",winner:f[0]??null,runnersUp:f.slice(1),errors:p.length?p:null}}async function Ah({chainId:e,taker:t,tokenIn:n}={},r={}){if(!e||!t)return{needsRevoke:!1,note:"no wallet to check"};try{let i=(await wh({chainIds:[e],address:t},r)).approvals;if(!i?.length)return{needsRevoke:!1,note:"no active approvals found"};let s=n?i.find(a=>String(a.token).toLowerCase()===String(n).toLowerCase()):null;return s&&BigInt(s.allowance??"0")>0n?{needsRevoke:!0,spender:s.spender,amount:s.allowance,symbol:s.symbol??"?",decimals:s.decimals??18,note:`approval found for ${s.spender}, revoke before bridging`}:{needsRevoke:!1,note:`no active approval for this token (${i.length} total approvals on chain)`}}catch(o){return{needsRevoke:!1,note:`revoke check unavailable: ${String(o.message||o).slice(0,100)}`}}}async function aI(e={},t={}){let[n,r]=await Promise.all([Sh(e,t),Ah({chainId:e.fromChainId,taker:e.taker,tokenIn:e.tokenIn},t)]),o=n.winner??{};return{kind:"bridge",fromChainId:e.fromChainId,toChainId:e.toChainId,fromSymbol:e.fromSymbol,toSymbol:e.toSymbol,amount:e.amount,fromDecimals:e.fromDecimals??18,toDecimals:e.toDecimals??18,bestRoute:o.provider??"none",amountOut:o.amountOut,feeUsd:o.feeUsd,estimatedTime:o.estimatedTime,preparable:o.preparable?"yes":"no (manual send)",providers:n.providers,runnersUp:n.runnersUp,revokeCheck:r,errors:n.errors,confidence:n.providers.length>=2?.85:n.providers.length===1?.6:.1}}async function cI(){let[e,t]=await Promise.all([Gm().catch(n=>({ok:!1,error:n.message})),Qm().catch(n=>({ok:!1,error:n.message}))]);return{debridge:e,changenow:t,lifi:{ok:!0,note:"integrated via router"}}}var cB,xh=_(()=>{Yn();Km();Zm();th();rh();ih();ah();uh();dh();Eh();cB=Object.freeze(["debridge","lifi-relay","squid","stargate","thorchain","bungee","connext","wormhole","changenow"])});var kh={};z(kh,{DYDX_API:()=>Hi,dydxHealth:()=>pI,dydxMarkets:()=>lI,dydxOrderbook:()=>dI});function uo(e){if(e==null||e==="")return null;let t=Number(e);return Number.isFinite(t)?t:null}function uI(e){let t=e?.markets;return Array.isArray(t)?t:t&&typeof t=="object"?Object.values(t):[]}async function lI(e=50,t={}){try{let n=await C(`${Hi}/v4/perpetualMarkets?limit=${e}`,t);return uI(n).map(o=>{let i=uo(o?.nextFundingRate),s=uo(o?.oraclePrice),a=uo(o?.openInterest),c=uo(o?.volume24H),u=uo(o?.priceChange24H);return{ticker:o?.ticker,coin:String(o?.ticker||"").replace(/-USD$/,""),markPx:s,oraclePx:s,fundingRate:i,fundingRateAprPct:i==null?null:i*24*365*100,openInterest:a,dayNtlVolumeUsd:c,change24hPct:s&&u!=null?u/s*100:null,oraclePrice:o?.oraclePrice,indexPrice:o?.indexPrice,nextFundingRate:i==null?null:`${(i*100).toFixed(4)}%`,volume24h:o?.volume24H,venue:"dydx",quality:"LIVE"}}).filter(o=>o.ticker)}catch(n){return{error:String(n.message||n).slice(0,200),venue:"dydx",quality:"FAILED"}}}async function dI(e){try{let t=await C(`${Hi}/v4/orderbooks/perpetualMarket/${e}`);return{bids:t?.bids?.slice(0,5),asks:t?.asks?.slice(0,5)}}catch(t){return{error:String(t.message||t).slice(0,200)}}}async function pI(){try{return{ok:!0,serverTime:(await C(`${Hi}/v4/time`))?.iso}}catch(e){return{ok:!1,error:String(e.message||e).slice(0,160)}}}var Hi,Ih=_(()=>{G();Hi="https://indexer.dydx.trade"});var Ch={};z(Ch,{DRIFT_API:()=>Oh,driftHealth:()=>fI,driftMarkets:()=>Th});async function Th(e={}){try{let n=(await C(`${Oh}/v2/markets`,e))?.markets;return!Array.isArray(n)||n.length===0?{error:_h,venue:"drift",quality:"FAILED"}:n.map(r=>({symbol:r?.symbol||r?.marketIndex,coin:r?.symbol,oraclePrice:r?.amm?.oraclePrice,markPrice:r?.amm?.markPrice,fundingRate:r?.amm?.lastFundingRate?`${(Number(r.amm.lastFundingRate)*100).toFixed(4)}%`:null,openInterest:{long:r?.amm?.longFunding,short:r?.amm?.shortFunding},volume24h:r?.amm?.quoteAssetVolume,venue:"drift",quality:"LIVE"}))}catch(t){return{error:`${_h} (${String(t.message||t).slice(0,120)})`,venue:"drift",quality:"FAILED"}}}async function fI(){let e=await Th();return e?.error?{ok:!1,error:e.error,quality:"FAILED"}:{ok:!0,note:"Drift v2 perps on Solana",quality:"LIVE"}}var Oh,_h,Nh=_(()=>{G();Oh="https://dlob.drift.trade",_h="Drift public market API unavailable upstream (dlob /v2/markets dead; data.api.drift.trade/contracts 403). Read-only surface stays FAILED until a live endpoint is verified."});var Lh={};z(Lh,{VERTEX_API:()=>Bc,vertexHealth:()=>hI,vertexMarkets:()=>Ph,vertexOrderbook:()=>mI});async function Ph(e={}){try{let n=(await C(`${Bc}/query`,{...e,method:"POST",body:JSON.stringify({all_markets:{}}),headers:{"content-type":"application/json",...e.headers||{}}}))?.data?.all_markets;return!Array.isArray(n)||n.length===0?{error:Rh,venue:"vertex",quality:"FAILED"}:n.map(r=>({market:r?.market,type:r?.type,oraclePrice:r?.oracle_price_x18?(Number(BigInt(r.oracle_price_x18))/1e18).toFixed(4):null,minSize:r?.min_size,productId:r?.product_id,venue:"vertex",quality:"LIVE"}))}catch(t){return{error:`${Rh} (${String(t.message||t).slice(0,120)})`,venue:"vertex",quality:"FAILED"}}}async function mI(e){try{let n=(await C(`${Bc}/query`,{method:"POST",body:JSON.stringify({market_liquidity:{product_id:Number(e),depth:5}}),headers:{"content-type":"application/json"}}))?.data?.market_liquidity;return{bids:n?.bids||[],asks:n?.asks||[]}}catch(t){return{error:String(t.message||t).slice(0,200),quality:"FAILED"}}}async function hI(){let e=await Ph();return e?.error?{ok:!1,error:e.error,quality:"FAILED"}:{ok:!0,status:"ok",quality:"LIVE"}}var Bc,Rh,$h=_(()=>{G();Bc="https://gateway.prod.vertexprotocol.com/v2",Rh="Vertex public market API unavailable upstream (gateway TLS eof; /v2/query all_markets not a valid op). Read-only surface stays FAILED until a live endpoint is verified."});var qh={};z(qh,{pancakeHealth:()=>bI,pancakeQuote:()=>gI});async function gI({chainId:e=56,tokenIn:t,tokenOut:n,amountIn:r,fee:o=500}={},i={}){if(!t||!n||!r)return{error:"pancake quote requires tokenIn, tokenOut, amountIn"};try{let s={tokenIn:String(t).toLowerCase(),tokenOut:String(n).toLowerCase(),amountIn:String(r),fee:String(o)},a=await C(`${yI}/quote`,{...i,method:"POST",body:JSON.stringify(s),headers:{"content-type":"application/json",...i.headers||{}}});return{amountOut:a?.amountOut,route:a?.route}}catch(s){return{error:String(s.message||s).slice(0,200)}}}async function bI(){try{return{ok:!0,chains:["bsc (56)","ethereum (1)","arbitrum (42161)","base (8453)","opbnb (204)","zksync (324)","linea (59144)"]}}catch(e){return{ok:!1,error:String(e.message||e).slice(0,160)}}}var yI,Bh=_(()=>{G();yI="https://api.thegraph.com/subgraphs/name/pancakeswap/exchange-v3-bsc"});var Mh={};z(Mh,{sushiHealth:()=>SI,sushiQuote:()=>EI});async function EI({chainId:e=1,tokenIn:t,tokenOut:n,amountIn:r,fee:o=500}={},i={}){if(!t||!n||!r)return{error:"sushi quote requires tokenIn, tokenOut, amountIn"};try{let s=`{ quote(tokenIn:"${t}",tokenOut:"${n}",amountIn:"${r}",fee:${o}) { amountOut route } }`,a=await C(`${wI(e)}/quote?query=${encodeURIComponent(s)}`,i);return{amountOut:a?.data?.quote?.amountOut,route:a?.data?.quote?.route}}catch(s){return{error:String(s.message||s).slice(0,200)}}}async function SI(){try{return{ok:!0,chains:Object.keys(Uh).length+" chains"}}catch(e){return{ok:!1,error:String(e.message||e).slice(0,160)}}}var wI,Uh,Dh=_(()=>{G();wI=e=>`https://api.thegraph.com/subgraphs/name/sushi-v3/v3-${Uh[e]||"ethereum"}`,Uh={1:"ethereum",10:"optimism",56:"bsc",137:"polygon",8453:"base",42161:"arbitrum",43114:"avalanche",59144:"linea",534352:"scroll",324:"zksync-era",250:"fantom",2222:"kava",1088:"metis",1284:"moonbeam",1285:"moonriver",288:"boba",1101:"polygon-zkevm",5e3:"mantle",81457:"blast"}});var Fh={};z(Fh,{raydiumHealth:()=>xI,raydiumQuote:()=>vI});async function vI({inputMint:e,outputMint:t,amount:n,slippageBps:r=50}={},o={}){if(!e||!t||!n)return{error:"raydium quote requires inputMint, outputMint, amount"};try{let i=new URLSearchParams({inputMint:e,outputMint:t,amount:String(n),slippageBps:String(r),onlyDirectRoutes:"true"}),s=await C(`${AI}/quote?${i}`,o),a=(s?.routePlan||[]).filter(c=>c?.swapInfo?.label?.toLowerCase().includes("raydium"));return{amountOut:s?.outAmount,priceImpactPct:s?.priceImpactPct,raydiumRoutes:a.length,allRoutes:s?.routePlan?.length||0}}catch(i){return{error:String(i.message||i).slice(0,200)}}}async function xI(){try{return{ok:!0,note:"Raydium routes through Jupiter aggregator on Solana"}}catch(e){return{ok:!1,error:String(e.message||e).slice(0,160)}}}var AI,jh=_(()=>{G();AI="https://quote-api.jup.ag/v6"});var Hh={};z(Hh,{AEVO_API:()=>Uc,aevoHealth:()=>II,aevoMarkets:()=>kI});async function kI(e={}){try{return(await C(`${Uc}/markets`,e)||[]).map(n=>({instrument:n?.instrument_name,type:n?.instrument_type,markPrice:n?.mark_price,indexPrice:n?.index_price,fundingRate:n?.funding_rate?`${(Number(n.funding_rate)*100).toFixed(4)}%`:null,openInterest:n?.open_interest,volume24h:n?.volume_24h}))}catch(t){return{error:String(t.message||t).slice(0,200)}}}async function II(){try{return{ok:(await C(`${Uc}/ping`))?.status==="ok"}}catch(e){return{ok:!1,error:String(e.message||e).slice(0,160)}}}var Uc,zh=_(()=>{G();Uc="https://api.aevo.xyz"});var jc={};z(jc,{BINANCE_DEFAULT_FUNDING_INTERVAL_HOURS:()=>Gh,BINANCE_FUTURES_API:()=>Wh,BINANCE_SPOT_API:()=>Vh,binanceFunding:()=>Vi,binanceFundingHistory:()=>CI,binanceHealth:()=>Dc,binanceMarkPrice:()=>OI,binanceOpenInterest:()=>TI,binanceOrderbook:()=>_I,binanceSymbol:()=>lr,binanceTicker:()=>Fc,normalizeBook:()=>dr});function Mc(e={}){return(e.spotBaseUrl||e.baseUrl||process.env.BINANCE_API_URL||Vh).replace(/\/$/,"")}function zi(e={}){return(e.futuresBaseUrl||process.env.BINANCE_FAPI_URL||Wh).replace(/\/$/,"")}function lo(e){return{error:String(e.message||e).slice(0,200)}}function Ye(e){let t=Number(e);return Number.isFinite(t)?t:null}function lr(e,t="USDT"){let n=String(e||"").trim().toUpperCase().replace(/[-_/]/g,"");return n?n.endsWith(t)?n:`${n}${t}`:""}async function Dc(e={}){try{let t=await C(`${Mc(e)}/api/v3/ping`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??1e4});return{ok:t&&typeof t=="object",provider:"binance-public",execution:"read-only",exec:!1}}catch(t){return{ok:!1,provider:"binance-public",error:String(t.message||t).slice(0,160)}}}async function Fc(e={},t={}){let n=lr(e.symbol||e.coin,e.quote||"USDT");if(!n)return{error:"binanceTicker requires symbol or coin"};try{let r=e.full?"/api/v3/ticker/24hr":"/api/v3/ticker/price",o=await C(`${Mc(t)}${r}?symbol=${encodeURIComponent(n)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3});return{venue:"binance",market:"spot",symbol:n,price:Ye(o?.price??o?.lastPrice),volume24h:Ye(o?.volume),quoteVolume24h:Ye(o?.quoteVolume),raw:o}}catch(r){return lo(r)}}async function _I(e={},t={}){let n=lr(e.symbol||e.coin,e.quote||"USDT");if(!n)return{error:"binanceOrderbook requires symbol or coin"};let r=Math.min(Math.max(Number(e.limit)||20,1),1e3),o=String(e.market||"spot").toLowerCase()==="perp";try{let i=o?`${zi(t)}/fapi/v1/depth?symbol=${encodeURIComponent(n)}&limit=${r}`:`${Mc(t)}/api/v3/depth?symbol=${encodeURIComponent(n)}&limit=${r}`,s=await C(i,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3});return dr({venue:"binance",market:o?"perp":"spot",symbol:n,bids:s?.bids,asks:s?.asks,raw:s})}catch(i){return lo(i)}}async function Vi(e={},t={}){let n=lr(e.symbol||e.coin,e.quote||"USDT");if(!n)return{error:"binanceFunding requires symbol or coin"};try{let r=await C(`${zi(t)}/fapi/v1/premiumIndex?symbol=${encodeURIComponent(n)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),o=Array.isArray(r)?r[0]:r,i=Number(e.fundingIntervalHours)||Gh,s=Ye(o?.lastFundingRate);return{venue:"binance",market:"perp",symbol:n,markPrice:Ye(o?.markPrice),indexPrice:Ye(o?.indexPrice),fundingRate:s,fundingIntervalHours:i,fundingAprPct:s==null?null:s*(8760/i)*100,nextFundingTime:Ye(o?.nextFundingTime),raw:o??null}}catch(r){return lo(r)}}async function OI(e={},t={}){let n=await Vi(e,t);return n?.error?n:{venue:"binance",market:"perp",symbol:n.symbol,markPrice:n.markPrice,indexPrice:n.indexPrice}}async function TI(e={},t={}){let n=lr(e.symbol||e.coin,e.quote||"USDT");if(!n)return{error:"binanceOpenInterest requires symbol or coin"};try{let r=await C(`${zi(t)}/fapi/v1/openInterest?symbol=${encodeURIComponent(n)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3});return{venue:"binance",market:"perp",symbol:n,openInterest:Ye(r?.openInterest),time:Ye(r?.time),raw:r??null}}catch(r){return lo(r)}}async function CI(e={},t={}){let n=lr(e.symbol||e.coin,e.quote||"USDT");if(!n)return{error:"binanceFundingHistory requires symbol or coin"};let r=Math.min(Math.max(Number(e.limit)||10,1),1e3);try{let o=await C(`${zi(t)}/fapi/v1/fundingRate?symbol=${encodeURIComponent(n)}&limit=${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),i=Array.isArray(o)?o:[];return{venue:"binance",symbol:n,count:i.length,history:i.map(s=>({fundingTime:Ye(s?.fundingTime),fundingRate:Ye(s?.fundingRate)}))}}catch(o){return lo(o)}}function dr({venue:e,market:t,symbol:n,bids:r,asks:o,raw:i}){let s=p=>(Array.isArray(p)?p:[]).map(m=>{let y=Ye(Array.isArray(m)?m[0]:m?.price),h=Ye(Array.isArray(m)?m[1]:m?.size);return y==null||h==null?null:{price:y,size:h}}).filter(Boolean),a=s(r),c=s(o),u=a[0]?.price??null,l=c[0]?.price??null,d=u!=null&&l!=null?(u+l)/2:null,f=d?(l-u)/d*1e4:null;return{venue:e,market:t,symbol:n,bids:a,asks:c,bestBid:u,bestAsk:l,mid:d,spreadBps:f,raw:i??null}}var Vh,Wh,Gh,po=_(()=>{G();Vh="https://api.binance.com",Wh="https://fapi.binance.com",Gh=8});var Gc={};z(Gc,{OKX_API:()=>Kh,OKX_DEFAULT_FUNDING_INTERVAL_HOURS:()=>Yh,okxFunding:()=>Vc,okxHealth:()=>Hc,okxInstId:()=>fr,okxMarkPrice:()=>Wc,okxOpenInterest:()=>RI,okxOrderbook:()=>NI,okxTicker:()=>zc});function pr(e={}){return(e.baseUrl||process.env.OKX_API_URL||Kh).replace(/\/$/,"")}function fo(e){return{error:String(e.message||e).slice(0,200)}}function De(e){if(e===""||e==null)return null;let t=Number(e);return Number.isFinite(t)?t:null}function fr(e,{market:t="spot",quote:n="USDT"}={}){let r=String(e||"").trim().toUpperCase();if(!r)return"";if(r.includes("-"))return r;let o=`${r}-${n}`;return t==="perp"?`${o}-SWAP`:o}function mr(e){if(e&&String(e.code)!=="0"&&e.code!==void 0)throw new Error(`okx error ${e.code}: ${e.msg||"unknown"}`);let t=e?.data;return Array.isArray(t)?t:[]}async function Hc(e={}){try{let t=await C(`${pr(e)}/api/v5/public/time`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??1e4});return{ok:mr(t).length>0,provider:"okx-public",execution:"read-only",exec:!1}}catch(t){return{ok:!1,provider:"okx-public",error:String(t.message||t).slice(0,160)}}}async function zc(e={},t={}){let n=String(e.market||"spot").toLowerCase(),r=fr(e.instId||e.symbol||e.coin,{market:n,quote:e.quote||"USDT"});if(!r)return{error:"okxTicker requires instId, symbol or coin"};try{let o=await C(`${pr(t)}/api/v5/market/ticker?instId=${encodeURIComponent(r)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),i=mr(o)[0];return i?{venue:"okx",market:r.endsWith("-SWAP")?"perp":"spot",symbol:r,price:De(i.last),bestBid:De(i.bidPx),bestAsk:De(i.askPx),volume24h:De(i.vol24h),quoteVolume24h:De(i.volCcy24h),raw:i}:{error:`okx ticker empty for ${r}`}}catch(o){return fo(o)}}async function NI(e={},t={}){let n=String(e.market||"spot").toLowerCase(),r=fr(e.instId||e.symbol||e.coin,{market:n,quote:e.quote||"USDT"});if(!r)return{error:"okxOrderbook requires instId, symbol or coin"};let o=Math.min(Math.max(Number(e.limit)||20,1),400);try{let i=await C(`${pr(t)}/api/v5/market/books?instId=${encodeURIComponent(r)}&sz=${o}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),s=mr(i)[0];return s?dr({venue:"okx",market:r.endsWith("-SWAP")?"perp":"spot",symbol:r,bids:s.bids,asks:s.asks,raw:s}):{error:`okx books empty for ${r}`}}catch(i){return fo(i)}}async function Vc(e={},t={}){let n=fr(e.instId||e.symbol||e.coin,{market:"perp",quote:e.quote||"USDT"});if(!n)return{error:"okxFunding requires instId, symbol or coin"};try{let r=await C(`${pr(t)}/api/v5/public/funding-rate?instId=${encodeURIComponent(n)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),o=mr(r)[0];if(!o)return{error:`okx funding-rate empty for ${n}`};let i=Number(e.fundingIntervalHours)||Yh,s=De(o.fundingRate);return{venue:"okx",market:"perp",symbol:n,fundingRate:s,nextFundingRate:De(o.nextFundingRate),fundingIntervalHours:i,fundingAprPct:s==null?null:s*(8760/i)*100,nextFundingTime:De(o.nextFundingTime??o.fundingTime),raw:o}}catch(r){return fo(r)}}async function Wc(e={},t={}){let n=fr(e.instId||e.symbol||e.coin,{market:"perp",quote:e.quote||"USDT"});if(!n)return{error:"okxMarkPrice requires instId, symbol or coin"};let r=String(e.instType||"SWAP").toUpperCase();try{let o=await C(`${pr(t)}/api/v5/public/mark-price?instType=${encodeURIComponent(r)}&instId=${encodeURIComponent(n)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),i=mr(o)[0];return i?{venue:"okx",market:"perp",symbol:n,markPrice:De(i.markPx),time:De(i.ts),raw:i}:{error:`okx mark-price empty for ${n}`}}catch(o){return fo(o)}}async function RI(e={},t={}){let n=fr(e.instId||e.symbol||e.coin,{market:"perp",quote:e.quote||"USDT"});if(!n)return{error:"okxOpenInterest requires instId, symbol or coin"};let r=String(e.instType||"SWAP").toUpperCase();try{let o=await C(`${pr(t)}/api/v5/public/open-interest?instType=${encodeURIComponent(r)}&instId=${encodeURIComponent(n)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),i=mr(o)[0];return i?{venue:"okx",market:"perp",symbol:n,openInterest:De(i.oiCcy??i.oi),openInterestContracts:De(i.oi),openInterestUsd:De(i.oiUsd),time:De(i.ts),raw:i}:{error:`okx open-interest empty for ${n}`}}catch(o){return fo(o)}}var Kh,Yh,Kc=_(()=>{G();po();Kh="https://www.okx.com",Yh=8});var Jc={};z(Jc,{BYBIT_API:()=>Xh,BYBIT_DEFAULT_FUNDING_INTERVAL_HOURS:()=>Jh,bybitCategory:()=>Wi,bybitFunding:()=>Gi,bybitFundingHistory:()=>qI,bybitHealth:()=>Yc,bybitMarkPrice:()=>LI,bybitOpenInterest:()=>$I,bybitOrderbook:()=>PI,bybitSymbol:()=>yo,bybitTicker:()=>Xc});function mo(e={}){return(e.baseUrl||process.env.BYBIT_API_URL||Xh).replace(/\/$/,"")}function ho(e){return{error:String(e.message||e).slice(0,200)}}function be(e){if(e===""||e==null)return null;let t=Number(e);return Number.isFinite(t)?t:null}function yo(e,t="USDT"){let n=String(e||"").trim().toUpperCase().replace(/[-_/]/g,"");return n?n.endsWith(t)?n:`${n}${t}`:""}function Wi(e){let t=String(e||"spot").toLowerCase();return t==="perp"||t==="linear"||t==="swap"?"linear":t==="inverse"?"inverse":"spot"}function go(e){if(e&&e.retCode!==void 0&&Number(e.retCode)!==0)throw new Error(`bybit error ${e.retCode}: ${e.retMsg||"unknown"}`);return e?.result??null}async function Yc(e={}){try{let t=await C(`${mo(e)}/v5/market/time`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??1e4});return{ok:!!go(t),provider:"bybit-public",execution:"read-only",exec:!1}}catch(t){return{ok:!1,provider:"bybit-public",error:String(t.message||t).slice(0,160)}}}async function Qh(e,t){let n=Wi(e.market),r=yo(e.symbol||e.coin,e.quote||"USDT");if(!r)return{error:"bybit requires symbol or coin"};let o=await C(`${mo(t)}/v5/market/tickers?category=${encodeURIComponent(n)}&symbol=${encodeURIComponent(r)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),i=go(o)?.list?.[0];return i?{row:i,symbol:r,category:n}:{error:`bybit tickers empty for ${r}`}}async function Xc(e={},t={}){try{let n=await Qh(e,t);if(n.error)return n;let{row:r,symbol:o,category:i}=n;return{venue:"bybit",market:i==="spot"?"spot":"perp",symbol:o,price:be(r.lastPrice),bestBid:be(r.bid1Price),bestAsk:be(r.ask1Price),markPrice:be(r.markPrice),indexPrice:be(r.indexPrice),volume24h:be(r.volume24h),quoteVolume24h:be(r.turnover24h),raw:r}}catch(n){return ho(n)}}async function PI(e={},t={}){let n=Wi(e.market),r=yo(e.symbol||e.coin,e.quote||"USDT");if(!r)return{error:"bybitOrderbook requires symbol or coin"};let o=Math.min(Math.max(Number(e.limit)||25,1),200);try{let i=await C(`${mo(t)}/v5/market/orderbook?category=${encodeURIComponent(n)}&symbol=${encodeURIComponent(r)}&limit=${o}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),s=go(i);return s?dr({venue:"bybit",market:n==="spot"?"spot":"perp",symbol:r,bids:s.b,asks:s.a,raw:s}):{error:`bybit orderbook empty for ${r}`}}catch(i){return ho(i)}}async function Gi(e={},t={}){try{let n=await Qh({...e,market:e.market||"perp"},t);if(n.error)return n;let{row:r,symbol:o}=n,i=Number(e.fundingIntervalHours)||Jh,s=be(r.fundingRate);return{venue:"bybit",market:"perp",symbol:o,markPrice:be(r.markPrice),indexPrice:be(r.indexPrice),fundingRate:s,fundingIntervalHours:i,fundingAprPct:s==null?null:s*(8760/i)*100,nextFundingTime:be(r.nextFundingTime),openInterest:be(r.openInterest),raw:r}}catch(n){return ho(n)}}async function LI(e={},t={}){let n=await Gi(e,t);return n?.error?n:{venue:"bybit",market:"perp",symbol:n.symbol,markPrice:n.markPrice,indexPrice:n.indexPrice}}async function $I(e={},t={}){let n=yo(e.symbol||e.coin,e.quote||"USDT");if(!n)return{error:"bybitOpenInterest requires symbol or coin"};let r=Wi(e.market||"perp"),o=String(e.intervalTime||"1h"),i=Math.min(Math.max(Number(e.limit)||1,1),200);try{let s=await C(`${mo(t)}/v5/market/open-interest?category=${encodeURIComponent(r)}&symbol=${encodeURIComponent(n)}&intervalTime=${encodeURIComponent(o)}&limit=${i}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),a=go(s)?.list,c=Array.isArray(a)?a[0]:null;return c?{venue:"bybit",market:"perp",symbol:n,openInterest:be(c.openInterest),time:be(c.timestamp),history:(Array.isArray(a)?a:[]).map(u=>({openInterest:be(u?.openInterest),timestamp:be(u?.timestamp)}))}:{error:`bybit open-interest empty for ${n}`}}catch(s){return ho(s)}}async function qI(e={},t={}){let n=yo(e.symbol||e.coin,e.quote||"USDT");if(!n)return{error:"bybitFundingHistory requires symbol or coin"};let r=Math.min(Math.max(Number(e.limit)||10,1),200);try{let o=await C(`${mo(t)}/v5/market/funding/history?category=linear&symbol=${encodeURIComponent(n)}&limit=${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),i=go(o)?.list,s=Array.isArray(i)?i:[];return{venue:"bybit",symbol:n,count:s.length,history:s.map(a=>({fundingRate:be(a?.fundingRate),fundingTime:be(a?.fundingRateTimestamp)}))}}catch(o){return ho(o)}}var Xh,Jh,Qc=_(()=>{G();po();Xh="https://api.bybit.com",Jh=8});var sy={};z(sy,{CEX_BASIS_VENUES:()=>Ki,HL_FUNDING_INTERVAL_HOURS:()=>Zc,cexBasis:()=>oy,cexBasisHealth:()=>FI,cexFundingSpread:()=>DI,cexVenueLegs:()=>ry,hyperliquidPerpLeg:()=>ey,hyperliquidSpotLeg:()=>ty,okxPerpLeg:()=>ny,pairwiseFundingSpreads:()=>iy});function bo(e){return{error:String(e.message||e).slice(0,200)}}function _e(e){if(e===""||e==null)return null;let t=Number(e);return Number.isFinite(t)?t:null}function BI(e,t){return e==null||!t?null:e*(8760/t)*100}function eu(e={}){return String(e.coin||e.symbol||"").trim().toUpperCase().replace(/[-_/]/g,"").replace(/USDT?$/,"")||""}function UI(e={}){let t=e.venues,n=Array.isArray(t)?t:typeof t=="string"&&t.trim()&&t.trim().toLowerCase()!=="all"?t.split(","):Ki,r=new Set(n.map(i=>String(i).trim().toLowerCase()).filter(Boolean)),o=Ki.filter(i=>r.has(i));return o.length?o:Ki}async function ey(e={},t={}){let n=eu(e);if(!n)return{error:"hyperliquidPerpLeg requires coin"};try{let r=await mf(t),o=r?.[0]?.universe,i=r?.[1];if(!Array.isArray(o)||!Array.isArray(i))return{error:"hyperliquid metaAndAssetCtxs returned an unexpected shape"};let s=o.findIndex(u=>String(u?.name||"").toUpperCase()===n);if(s<0)return{error:`hyperliquid has no perp for ${n}`};let a=i[s]||{},c=_e(a.funding);return{venue:"hyperliquid",market:"perp",symbol:n,markPrice:_e(a.markPx),indexPrice:_e(a.oraclePx),midPrice:_e(a.midPx),fundingRate:c,fundingIntervalHours:Zc,fundingAprPct:BI(c,Zc),openInterest:_e(a.openInterest)}}catch(r){return bo(r)}}async function ty(e={},t={}){let n=eu(e);if(!n)return{error:"hyperliquidSpotLeg requires coin"};try{let r=await pf(t),o=_e(r?.[n]);return o==null?{error:`hyperliquid allMids has no entry for ${n}`}:{venue:"hyperliquid",market:"spot",symbol:n,price:o}}catch(r){return bo(r)}}async function ny(e={},t={}){let[n,r]=await Promise.all([Vc(e,t).catch(bo),Wc(e,t).catch(bo)]);return n?.error&&r?.error?n:{...n?.error?{venue:"okx",market:"perp",fundingError:n.error}:n,markPrice:r?.error?null:_e(r.markPrice),...r?.error?{markError:r.error}:{}}}async function sn(e,t){try{let n=await t;return[e,n&&typeof n=="object"?n:{error:"empty response"}]}catch(n){return[e,bo(n)]}}async function ry(e={},t={}){let n=eu(e);if(!n)return{error:"cexVenueLegs requires coin"};let r=e.quote||"USDT",o=UI(e),i=[];o.includes("binance")&&(i.push(sn("binance:perp",Vi({coin:n,quote:r},t))),i.push(sn("binance:spot",Fc({coin:n,quote:r},t)))),o.includes("okx")&&(i.push(sn("okx:perp",ny({coin:n,quote:r},t))),i.push(sn("okx:spot",zc({coin:n,quote:r,market:"spot"},t)))),o.includes("bybit")&&(i.push(sn("bybit:perp",Gi({coin:n,quote:r},t))),i.push(sn("bybit:spot",Xc({coin:n,quote:r,market:"spot"},t)))),o.includes("hyperliquid")&&(i.push(sn("hyperliquid:perp",ey({coin:n},t))),i.push(sn("hyperliquid:spot",ty({coin:n},t))));let s=await Promise.all(i),a={};for(let[c,u]of s){let[l,d]=c.split(":");a[l]=a[l]||{},a[l][d]=u}return{coin:n,quote:r,venues:o,legs:a}}function Zh(e){return!e||e.error?null:_e(e.price)??_e(e.mid)??null}function MI(e){return!e||e.error?null:_e(e.markPrice)??_e(e.midPrice)??null}async function oy(e={},t={}){let n=await ry(e,t);if(n.error)return n;let{coin:r,quote:o,venues:i,legs:s}=n,a=[];for(let m of i){let y=Zh(s[m]?.spot);y!=null&&y>0&&a.push(y)}let c=[...a].sort((m,y)=>m-y),u=c.length?c.length%2?c[(c.length-1)/2]:(c[c.length/2-1]+c[c.length/2])/2:null,l=[];for(let m of i){let y=s[m]?.perp,h=s[m]?.spot,w=MI(y),v=Zh(h),T=v??u,S=w!=null&&T?(w-T)/T*1e4:null;l.push({venue:m,symbol:y?.symbol??h?.symbol??r,markPrice:w,spotPrice:v,spotSource:v!=null?m:u!=null?"cross-venue-median":null,basisBps:S,fundingRate:y&&!y.error?_e(y.fundingRate):null,fundingIntervalHours:y&&!y.error?_e(y.fundingIntervalHours):null,fundingAprPct:y&&!y.error?_e(y.fundingAprPct):null,openInterest:y&&!y.error?_e(y.openInterest):null,errors:[y?.error,h?.error].filter(Boolean)})}let d=iy(l),f=l.filter(m=>m.markPrice!=null),p=l.filter(m=>m.basisBps!=null);return{coin:r,quote:o,referenceSpot:u,asOf:new Date().toISOString(),venues:l,fundingSpreads:d,widestFundingSpread:d[0]??null,richestBasis:p.length?p.reduce((m,y)=>y.basisBps>m.basisBps?y:m):null,cheapestBasis:p.length?p.reduce((m,y)=>y.basisBps<m.basisBps?y:m):null,venuesPriced:f.length,venuesRequested:i.length,execution:"read-only",exec:!1,note:"Public market data only. Funding compared on an annualized basis (HL settles hourly, CEXes 8h). Not advice."}}function iy(e=[]){let t=e.filter(r=>_e(r?.fundingAprPct)!=null),n=[];for(let r=0;r<t.length;r++)for(let o=r+1;o<t.length;o++){let i=t[r],s=t[o],a=i.fundingAprPct-s.fundingAprPct,c=a>0?s.venue:i.venue,u=a>0?i.venue:s.venue;n.push({pair:`${i.venue}/${s.venue}`,aprSpreadPct:Math.abs(a),signedAprSpreadPct:a,longVenue:c,shortVenue:u})}return n.sort((r,o)=>o.aprSpreadPct-r.aprSpreadPct)}async function DI(e={},t={}){let n=await oy(e,t);return n.error?n:{coin:n.coin,asOf:n.asOf,venues:n.venues.map(r=>({venue:r.venue,symbol:r.symbol,fundingRate:r.fundingRate,fundingIntervalHours:r.fundingIntervalHours,fundingAprPct:r.fundingAprPct,errors:r.errors})),fundingSpreads:n.fundingSpreads,widestFundingSpread:n.widestFundingSpread,execution:"read-only",exec:!1}}async function FI(e={}){try{let t=await Promise.all([Dc(e).catch(()=>({ok:!1})),Hc(e).catch(()=>({ok:!1})),Yc(e).catch(()=>({ok:!1}))]),n={binance:!!t[0]?.ok,okx:!!t[1]?.ok,bybit:!!t[2]?.ok};return{ok:Object.values(n).some(Boolean),provider:"cex-basis",upstream:n,execution:"read-only",exec:!1}}catch(t){return{ok:!1,provider:"cex-basis",error:String(t.message||t).slice(0,160)}}}var Ki,Zc,ay=_(()=>{po();Kc();Qc();Ni();Ki=["binance","okx","bybit","hyperliquid"],Zc=1});var cy={};z(cy,{compoundHealth:()=>zI,compoundMarkets:()=>HI});async function HI(e={}){try{return((await C(`${jI}/ctoken`,e))?.cToken||[]).map(n=>({symbol:n?.symbol,underlying:n?.underlying_symbol,supplyApy:n?.supply_rate?.value?`${(Number(n.supply_rate.value)*100).toFixed(2)}%`:null,borrowApy:n?.borrow_rate?.value?`${(Number(n.borrow_rate.value)*100).toFixed(2)}%`:null,totalSupply:n?.total_supply?.value,totalBorrow:n?.total_borrows?.value,collateralFactor:n?.collateral_factor?.value?`${(Number(n.collateral_factor.value)*100).toFixed(0)}%`:null}))}catch(t){return{error:String(t.message||t).slice(0,200)}}}async function zI(){try{return{ok:!0,note:"Compound v2 \u2014 Ethereum mainnet lending"}}catch(e){return{ok:!1,error:String(e.message||e).slice(0,160)}}}var jI,uy=_(()=>{G();jI="https://api.compound.finance/api/v2"});var ly={};z(ly,{yearnHealth:()=>GI,yearnVaults:()=>WI});async function WI(e={}){try{return(await C(`${VI}/vaults/all`,e)||[]).map(n=>({name:n?.name,symbol:n?.symbol,apy:n?.apy?.net_apy?`${(Number(n.apy.net_apy)*100).toFixed(2)}%`:null,tvl:n?.tvl?.tvl_deposited,chain:n?.chainId,type:n?.type||"v2"}))}catch(t){return{error:String(t.message||t).slice(0,200)}}}async function GI(){try{return{ok:!0,note:"Yearn \u2014 yield aggregator across Ethereum, Arbitrum, Optimism, Fantom"}}catch(e){return{ok:!1,error:String(e.message||e).slice(0,160)}}}var VI,dy=_(()=>{G();VI="https://api.yearn.fi/v1"});var py={};z(py,{convexHealth:()=>XI,convexPools:()=>YI});async function YI(e={}){try{return(await C(`${KI}/pools`,e)||[]).map(n=>({name:n?.curvePool?.name||n?.name,curveApy:n?.curvePool?.apy?`${(Number(n.curvePool.apy)*100).toFixed(2)}%`:null,convexApy:n?.apy?`${(Number(n.apy)*100).toFixed(2)}%`:null,tvl:n?.tvl,boosted:n?.boosted||!1}))}catch(t){return{error:String(t.message||t).slice(0,200)}}}async function XI(){try{return{ok:!0,note:"Convex \u2014 CRV/CVX yield optimizer on Ethereum"}}catch(e){return{ok:!1,error:String(e.message||e).slice(0,160)}}}var KI,fy=_(()=>{G();KI="https://api.convexfinance.com/api"});function On(e){if(!Number.isSafeInteger(e)||e<0||e>1e3)throw new RangeError("scale must be a safe integer from 0 through 1000")}function xt(e,t){if(typeof e!="bigint")throw new TypeError("mantissa must be a bigint");return On(t),Object.freeze({mantissa:e,scale:t})}function an(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`);On(e.scale)}function Yi(e){return On(e),10n**BigInt(e)}function V(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 xt(s,o.length)}function Fe(e,t){if(On(t),typeof e=="bigint")return xt(e,t);if(typeof e!="string"||!/^[+-]?\d+$/.test(e))throw new TypeError("value must be an integer string or bigint");return xt(BigInt(e),t)}function dt(e){an(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 wo(e,t){return an(e),On(t),t===e.scale?xt(e.mantissa,e.scale):t>e.scale?xt(e.mantissa*Yi(t-e.scale),t):xt(e.mantissa/Yi(e.scale-t),t)}function tu(e,t){an(e,"left"),an(t,"right");let n=Math.max(e.scale,t.scale);return[wo(e,n),wo(t,n),n]}function cn(e,t){let[n,r,o]=tu(e,t);return xt(n.mantissa+r.mantissa,o)}function Eo(e,t){let[n,r,o]=tu(e,t);return xt(n.mantissa-r.mantissa,o)}function Xe(e,t){an(e,"left"),an(t,"right");let n=e.scale+t.scale;return On(n),xt(e.mantissa*t.mantissa,n)}function pt(e,t,n=Math.max(e?.scale??0,t?.scale??0)){if(an(e,"left"),an(t,"right"),On(n),t.mantissa===0n)throw new RangeError("division by zero");let r=e.mantissa*Yi(t.scale+n),o=t.mantissa*Yi(e.scale);return xt(r/o,n)}function un(e,t){let[n,r]=tu(e,t);return n.mantissa<r.mantissa?-1:n.mantissa>r.mantissa?1:0}var kB,rt=_(()=>{kB=Object.freeze({mantissa:10000n,scale:0})});import{existsSync as hy,readFileSync as JI}from"node:fs";import{dirname as my,join as nu}from"node:path";import{fileURLToPath as QI}from"node:url";function ZI(e){let t=my(QI(e));for(let n=0;n<8;n+=1){let r=nu(t,"package.json");if(hy(r))try{let i=JSON.parse(JI(r,"utf8"));if(i&&typeof i.version=="string")return t}catch{}let o=my(t);if(o===t)break;t=o}throw new Error(`oracle: could not resolve package root from ${e}`)}function yy(e,t){let n=ZI(t),r=nu(n,e);return hy(r)?r:nu(n,"dist","assets",e)}var gy=_(()=>{});import{readFileSync as e_,existsSync as t_}from"node:fs";import{fileURLToPath as n_}from"node:url";import{dirname as r_,join as wy}from"node:path";function i_(){try{let e=yy("equities-fixtures",import.meta.url);if(e&&t_(e))return e}catch{}return o_}function a_(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function J(e,t){throw new TypeError(`Fixture fixtures/${e}: ${t}`)}function de(e,t,n){a_(e)||J(t,`${n} must be an object`)}function ee(e,t,n){(typeof e!="string"||e.length===0)&&J(t,`${n} must be a nonempty string`)}function kt(e,t,n){Number.isSafeInteger(e)||J(t,`${n} must be a safe integer`)}function ln(e,t,n){de(e,t,n);for(let[r,o]of Object.entries(e))ee(r,t,`${n} key`),de(o,t,`${n}.${r}`)}function c_(e,t){de(e,t,"root"),kt(e.capturedAt,t,"capturedAt"),de(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];de(i,t,`venues.${r}`),ee(i.type,t,`venues.${r}.type`),ee(i.chain,t,`venues.${r}.chain`),ee(i.tier,t,`venues.${r}.tier`),ln(i[o],t,`venues.${r}.${o}`)}for(let[r,o]of Object.entries(e.venues.hyperliquid_hip3.dexs))ln(o,t,`venues.hyperliquid_hip3.dexs.${r}`)}function u_(e,t){ln(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)=>ee(o,t,`${n}.venues[${i}]`))}function l_(e,t){de(e,t,"root");for(let n of["chainId","block","oracleScaleExp","usdgDecimals","equityDecimals"])kt(e[n],t,n);ee(e.usdg,t,"usdg"),ln(e.assets,t,"assets");for(let[n,r]of Object.entries(e.assets))ee(r.oracle,t,`assets.${n}.oracle`),ee(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 d_(e,t){de(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)=>kt(r,t,`holidayDayIndex[${o}]`)),e.names.forEach((r,o)=>ee(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 p_(e,t){de(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)=>{de(r,t,`dstTransitions[${o}]`);for(let i of["year","startUtc","endUtc"])kt(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 f_(e,t){ln(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"])ee(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 m_(e,t){de(e,t,"root"),kt(e.capturedAt,t,"capturedAt"),kt(e.block,t,"block"),kt(e.chainId,t,"chainId"),ee(e.gasPriceWei,t,"gasPriceWei"),ee(e.stateView,t,"stateView"),ln(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"])ee(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 h_(e,t){de(e,t,"root"),kt(e.capturedAt,t,"capturedAt"),ee(e.source,t,"source"),de(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)){de(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())de(i,t,`books.${n}.bids[${o}]`),ee(i.px,t,`books.${n}.bids[${o}].px`),ee(i.sz,t,`books.${n}.bids[${o}].sz`);for(let[o,i]of r.asks.entries())de(i,t,`books.${n}.asks[${o}]`),ee(i.px,t,`books.${n}.asks[${o}].px`),ee(i.sz,t,`books.${n}.asks[${o}].sz`)}}function y_(e,t){de(e,t,"root"),kt(e.capturedAt,t,"capturedAt"),ee(e.source,t,"source"),ee(e.chain,t,"chain"),ln(e.tokens,t,"tokens"),de(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)){ee(r.symbolRaw,t,`tokens.${n}.symbolRaw`),ee(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())de(i,t,`pairs.${n}[${o}]`),ee(i.pairAddress,t,`pairs.${n}[${o}].pairAddress`),ee(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 g_(e,t){de(e,t,"root"),kt(e.capturedAt,t,"capturedAt"),ee(e.source,t,"source"),ee(e.chain,t,"chain"),e.chain!=="ton"&&J(t,'chain must be "ton"'),ln(e.tokens,t,"tokens"),de(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)){ee(r.symbolRaw,t,`tokens.${n}.symbolRaw`),ee(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())de(i,t,`pairs.${n}[${o}]`),ee(i.pairAddress,t,`pairs.${n}[${o}].pairAddress`),ee(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 w_(e,t){let n=Ey[t],r=wy(e,n),o;try{o=e_(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 b_[t](i,n),i}function Sy(e){if(e!==null&&typeof e=="object"&&!Object.isFrozen(e)){Object.freeze(e);for(let t of Object.values(e))Sy(t)}return e}function ru({fixtureDir:e=s_}={}){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(Ey))t[n]=w_(e,n);return Sy(t)}function Mt(){return by??=ru(),by}function Je(){return Mt().venues}function Ay(){return Mt().universe}function vy(){return Mt().oracles}function xy(){return Mt().nyseHolidays}function ky(){return Mt().dstTransitions}function Xi(){return Mt().rhPoolState}function Iy(){return Mt().solanaXstocks}function _y(){return Mt().tonXstocks}function Oy(){return Mt().hip3L2Books}var o_,s_,Ey,b_,by,ft=_(()=>{gy();o_=wy(r_(n_(import.meta.url)),"fixtures");s_=i_(),Ey=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"});b_=Object.freeze({venues:c_,universe:u_,oracles:l_,nyseHolidays:d_,dstTransitions:p_,equityDexPools:f_,rhPoolState:m_,solanaXstocks:y_,tonXstocks:g_,hip3L2Books:h_})});function A_(){let e=ky().dstTransitions.map(r=>({year:r.year,startMs:r.startUtc*iu,endMs:r.endUtc*iu}));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 qy(){return Cy??=A_(),Cy}function v_(){return ou===void 0&&(ou=new Set(xy().holidayDayIndex)),ou}function By(e,t){if(!Number.isSafeInteger(e))throw new TypeError(`${t}: epochMs must be a safe integer number of milliseconds`)}function x_(e,t){let{coverageStartMs:n,coverageEndMs:r,firstYear:o,lastYear:i}=qy();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 k_(e){for(let t of qy().rows)if(e>=t.startMs&&e<t.endMs)return!0;return!1}function I_(e){return k_(e)?S_:E_}function __(e){let t=e+I_(e),n=Math.floor(t/Ty),r=t-n*Ty,o=new Date(t);return{dayIndex:n,minuteOfDay:Math.floor(r/Ny),msIntoDay:r,weekday:o.getUTCDay()}}function O_({dayIndex:e,weekday:t}){return t===0||t===6?!1:!v_().has(e)}function T_(e){return e<Ry?"dark":e<Py?"extended":e<Ly?"core":e<$y?"extended":"dark"}function So(e){By(e,"sessionState"),x_(e,"sessionState");let t=__(e);return O_(t)?T_(t.minuteOfDay):"dark"}function au(e){return By(e,"isDark"),So(e)==="dark"}var iu,Ny,su,Ty,E_,S_,Ry,Py,Ly,$y,BB,UB,Cy,ou,Ji=_(()=>{ft();iu=1e3,Ny=60*iu,su=60*Ny,Ty=24*su,E_=-5*su,S_=-4*su,Ry=240,Py=570,Ly=960,$y=1200,BB=Object.freeze([Ry,Py,Ly,$y]),UB=Object.freeze(["core","extended","dark"])});function Zi(e,t){e.push(Object.freeze({venue:t.venue,symbol:t.symbol??null,reason:t.reason,evidence:t.evidence??null}))}function R_(e){let t=e.raw?.vol24h;return!!(t===0||t===0||typeof t=="number"&&Number.isFinite(t)&&t<=0)}function P_(e){return!e.bid||!e.ask?!1:un(e.bid,e.ask)>0}function Uy(e,t,n){return Number.isSafeInteger(e.capturedAt)?t-e.capturedAt>n:!1}function es(e,t={}){if(!Array.isArray(e))throw new TypeError("quotes must be an array");let n=t.nowMs??Date.now(),r=t.quoteFreshnessMs??C_,o=t.oracleFreshnessMs??N_,i=t.includeDormant===!0,s=[],a=[];for(let c of e){if(R_(c)){i?s.push(Object.freeze({...c,staleData:!0})):Zi(a,{venue:c.venue,symbol:c.symbolRaw??c.symbol,reason:Qi.DORMANT_VENUE,evidence:{vol24h:c.raw?.vol24h??null}});continue}if(P_(c)){Zi(a,{venue:c.venue,symbol:c.symbolRaw??c.symbol,reason:Qi.CROSSED_BOOK,evidence:{bid:c.bid?String(c.bid.mantissa)+"e-"+c.bid.scale:null,ask:c.ask?String(c.ask.mantissa)+"e-"+c.ask.scale:null}});continue}if(Uy(c,n,r)){Zi(a,{venue:c.venue,symbol:c.symbolRaw??c.symbol,reason:Qi.STALE_QUOTE,evidence:{capturedAt:c.capturedAt,nowMs:n,ageMs:n-c.capturedAt,freshnessMs:r}});continue}if(c.tier==="read-only"&&c.raw?.oracleRaw!==void 0){let u=So(n),l=u==="core"?o:o*2;if(Uy(c,n,l)){Zi(a,{venue:c.venue,symbol:c.symbolRaw??c.symbol,reason:Qi.STALE_ORACLE,evidence:{capturedAt:c.capturedAt,nowMs:n,session:u}});continue}}s.push(c)}return{survivors:s,excluded:a}}var Qi,C_,N_,cu=_(()=>{rt();Ji();Qi=Object.freeze({DORMANT_VENUE:"dormant-venue",CROSSED_BOOK:"crossed-book",STALE_QUOTE:"stale-quote",STALE_ORACLE:"stale-oracle"}),C_=12e4,N_=6e5});function L_(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("."),u=`${a}${c}`,l=a.length+o,d;return l<=0?d=`0.${"0".repeat(-l)}${u}`:l>=u.length?d=`${u}${"0".repeat(l-u.length)}`:d=`${u.slice(0,l)}.${u.slice(l)}`,`${i?"-":""}${d}`}function Ae(e){return e==null?null:typeof e=="string"?V(e):typeof e!="number"||!Number.isFinite(e)?null:V(L_(e))}function mt(e,t){let n=Ae(e);if(n===null)throw new TypeError(`${t} must be a finite source number`);return n}var Tn=_(()=>{rt()});function oe(e,t){throw new TypeError(`${e} ${t}`)}function Fy(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function Cn(e,t){Fy(e)||oe(t,"must be an object")}function jy(e,t,n){Object.hasOwn(e,t)||oe(`${n}.${t}`,"is required")}function hr(e,t){(typeof e!="string"||e.length===0)&&oe(t,"must be a nonempty string")}function Ao(e,t,n){t.has(e)||oe(n,`must be one of ${[...t].join(", ")}`)}function lu(e,t){(!Number.isSafeInteger(e)||e<0)&&oe(t,"must be a nonnegative safe integer")}function uu(e,t,n=!1){e===null&&n||(Fy(e)||oe(t,"must be a fixed point value"),typeof e.mantissa!="bigint"&&oe(`${t}.mantissa`,"must be a bigint"),(!Number.isSafeInteger(e.scale)||e.scale<0)&&oe(`${t}.scale`,"must be a nonnegative safe integer"))}function ts(e,t,n=!1){e===null&&n||Cn(e,t)}function Dy(e,t){Cn(e,t),hr(e.venue,`${t}.venue`),hr(e.reason,`${t}.reason`),F_.test(e.reason)||oe(`${t}.reason`,"must be a machine readable lower case code"),Object.hasOwn(e,"symbol")&&e.symbol!==null&&hr(e.symbol,`${t}.symbol`)}function je(e){Cn(e,"quote");for(let n of["venue","chain","instrument","tier","symbolRaw","symbol","side","requestedSize",...My,"costAccounted","capturedAt","blockOrSeq","raw"])jy(e,n,"quote");hr(e.venue,"quote.venue"),!(typeof e.chain=="string"&&e.chain.length>0)&&!(Number.isSafeInteger(e.chain)&&e.chain>=0)&&oe("quote.chain","must be a nonempty string or nonnegative chain id"),Ao(e.instrument,$_,"quote.instrument"),Ao(e.tier,q_,"quote.tier"),hr(e.symbolRaw,"quote.symbolRaw"),hr(e.symbol,"quote.symbol"),Ao(e.side,B_,"quote.side"),uu(e.requestedSize,"quote.requestedSize"),e.requestedSize.mantissa<0n&&oe("quote.requestedSize","must not be negative");let t=0;for(let n of D_)Object.hasOwn(e,n)&&(uu(e[n],`quote.${n}`),t+=1);t===0&&oe("quote","must contain at least one of bid, ask, mid, mark");for(let n of My)uu(e[n],`quote.${n}`,!0);if(typeof e.costAccounted!="boolean"&&oe("quote.costAccounted","must be a boolean"),e.costAccounted){for(let n of["fees","gasEstimate","priceImpact"])e[n]===null&&oe(`quote.${n}`,"cannot be unknown when costAccounted is true");e.instrument==="perp"&&e.fundingHourly===null&&oe("quote.fundingHourly","cannot be unknown when costAccounted is true for a perp")}return e.instrument==="spot"&&e.fundingHourly!==null&&oe("quote.fundingHourly","must be null for a spot quote"),lu(e.capturedAt,"quote.capturedAt"),e.blockOrSeq!==null&&!(typeof e.blockOrSeq=="string"&&e.blockOrSeq.length>0)&&!(Number.isSafeInteger(e.blockOrSeq)&&e.blockOrSeq>=0)&&oe("quote.blockOrSeq","must be null, a nonempty string, or a nonnegative safe integer"),Cn(e.raw,"quote.raw"),e}function ns(e){Cn(e,"rankResult");for(let t of["rankedOn","ranked","winner","runnersUp","improvementBps","sourcesAnswered","sourcesTried","failed","excluded","darkWindow","instrumentMix","bestPreparable"])jy(e,t,"rankResult");return Ao(e.rankedOn,U_,"rankResult.rankedOn"),Array.isArray(e.ranked)||oe("rankResult.ranked","must be an array"),e.ranked.forEach((t,n)=>ts(t,`rankResult.ranked[${n}]`)),ts(e.winner,"rankResult.winner",!0),e.ranked.length===0&&e.winner!==null&&oe("rankResult.winner","must be null when ranked is empty"),e.ranked.length>0&&e.winner===null&&oe("rankResult.winner","must be present when ranked is not empty"),Array.isArray(e.runnersUp)||oe("rankResult.runnersUp","must be an array"),e.runnersUp.forEach((t,n)=>ts(t,`rankResult.runnersUp[${n}]`)),e.improvementBps!==null&&!(typeof e.improvementBps=="number"&&Number.isFinite(e.improvementBps))&&oe("rankResult.improvementBps","must be a finite number or null"),lu(e.sourcesAnswered,"rankResult.sourcesAnswered"),lu(e.sourcesTried,"rankResult.sourcesTried"),e.sourcesAnswered>e.sourcesTried&&oe("rankResult.sourcesAnswered","must not exceed sourcesTried"),Array.isArray(e.failed)||oe("rankResult.failed","must be an array"),e.failed.forEach((t,n)=>Dy(t,`failed[${n}]`)),Array.isArray(e.excluded)||oe("rankResult.excluded","must be an array"),e.excluded.forEach((t,n)=>Dy(t,`excluded[${n}]`)),e.darkWindow!==null&&Cn(e.darkWindow,"rankResult.darkWindow"),Ao(e.instrumentMix,M_,"rankResult.instrumentMix"),ts(e.bestPreparable,"rankResult.bestPreparable",!0),Object.hasOwn(e,"carry")&&e.carry!==null&&Cn(e.carry,"rankResult.carry"),e}var $_,q_,B_,U_,M_,D_,My,F_,Dt=_(()=>{$_=new Set(["spot","perp"]),q_=new Set(["read-only","quote-only","prepare","intent"]),B_=new Set(["buy","sell"]),U_=new Set(["net-of-cost","gross"]),M_=new Set(["homogeneous","heterogeneous"]),D_=["bid","ask","mid","mark"],My=["fees","gasEstimate","priceImpact","fundingHourly"],F_=/^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$/});function Hy(){return Je().venues.arcus}function V_(){return Object.keys(Hy().markets).sort()}function W_({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=Hy().markets[r];if(!o)return null;let i=mt(o.mark,`${r}.mark`),s=Ae(o.oracle),a=Ae(o.fundingHourly),c=n===null?V("0"):n,u={venue:j_,chain:H_,instrument:"perp",tier:z_,symbolRaw:e,symbol:r,side:t,requestedSize:c,mark:i,fees:null,gasEstimate:null,priceImpact:null,fundingHourly:a,costAccounted:!1,capturedAt:Je().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:rs,initialMarginFraction:o.initialMarginFraction??null,offHoursInitialMarginFraction:o.offHoursInitialMarginFraction??null,reasonCostUnknown:"fees, gas, and impact at size not captured for Arcus perps"}};return s!==null&&(u.raw.oracleFixed=s),je(u)}function os({side:e="buy",sizeUsd:t=null}={}){return V_().map(n=>W_({symbol:n,side:e,sizeUsd:t})).filter(n=>n!==null)}var j_,H_,z_,rs,du=_(()=>{ft();Tn();rt();Dt();j_="arcus_perp",H_="robinhood-4663",z_="quote-only",rs="0.00000480324074074"});function pu(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 V("0");let r=V(String(t)),o=Fe(10000n,0);return Xe(Xe(e,r),o)}function Vy(e,t,n={}){if(e.instrument!=="perp")return{model:"current-funding-held-constant",horizonHours:t,carryBps:V("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=G_(r,t),c=t-a,u=V(rs),l=pu(i,c),d=pu(u,a),f=Math.max(l.scale,d.scale),p={mantissa:l.mantissa*10n**BigInt(f-l.scale)+d.mantissa*10n**BigInt(f-d.scale),scale:f};return{model:"current-funding-held-constant",horizonHours:t,carryBps:p,carryBpsDisplay:dt(p),confidence:"estimate",darkHours:a,litHours:c,darkWindowRate:rs,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=pu(i,t);return{model:"current-funding-held-constant",horizonHours:t,carryBps:s,carryBpsDisplay:dt(s),confidence:"estimate",compounding:"ignored",compoundingErrorBoundNote:"simple sum; at 30d and 1e-5/h the ignored compound is under 0.5bp"}}function G_(e,t){if(t<=0)return 0;let n=0,r=Math.floor(t);for(let o=0;o<r;o+=1)au(e+o*zy)&&(n+=1);return t>r&&au(e+r*zy)&&(n+=t-r),n}var zy,tU,Wy=_(()=>{rt();du();Ji();zy=36e5,tU=24*365});function K_(e){return e.mid??e.mark??e.ask??e.bid??null}function Y_(e){let t=K_(e);if(t===null)return null;let n=e.costAccounted===!0,r=V("0");e.fees!==null?r=cn(r,e.fees):n=!1,e.priceImpact!==null?r=cn(r,e.priceImpact):e.requestedSize&&e.requestedSize.mantissa>0n&&(n=!1),e.gasEstimate===null?n=!1:r=cn(r,e.gasEstimate);let o;if(e.fees!==null&&un(e.fees,V("1"))<0&&un(e.fees,V("0"))>=0){let i=cn(V("1"),e.fees);o=Xe(t,i),e.priceImpact!==null&&(o=cn(o,Xe(t,e.priceImpact)))}else o=cn(t,r);return{net:o,costAccounted:n,px:t}}function X_(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 J_(e,t){if(!e||!t||!e.costAccounted||!t.costAccounted||e.instrument!==t.instrument||e.net.mantissa===0n)return null;let n=Eo(t.net,e.net);return pt(Xe(n,Fe(10000n,0)),t.net,4)}function is(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 E=es(e,{nowMs:n});o=E.survivors,i=E.excluded}let s=e.length,a=[],c=t.horizonHours,u=Number.isFinite(c)&&c>0,l=[];for(let E of o){let b=Y_(E);if(b===null)continue;let g=null;if(u&&E.instrument==="perp"&&(g=Vy(E,c,{nowMs:n}),g.carryBps!==null)){let A=cn(V("1"),pt(g.carryBps,Fe(10000n,0),12));b.net=Xe(b.net,A),b.costAccounted=!1}l.push(X_(E,b,g))}let d=l,f="homogeneous";if(u)f="heterogeneous",d=l;else{let E=l.filter(g=>g.instrument==="spot"),b=l.filter(g=>g.instrument==="perp");E.length>0&&b.length>0?(d=E.length>=b.length?E:b,f="homogeneous"):(d=l,f="homogeneous")}d.sort((E,b)=>{let g=un(E.net,b.net);return g!==0?g:E.venue<b.venue?-1:E.venue>b.venue?1:0});let p=d[0]??null,m=d.slice(1),y=d,h="gross";p&&p.costAccounted&&(m.length===0||m[0].costAccounted)&&(h="net-of-cost");let w=m.length===0?null:J_(p,m[0]),v=l.find(E=>E.tier==="prepare")??null,T=So(n),S=T==="core"?null:{session:T,warning:T==="dark"?"market is dark; marks are not real price discovery":"extended session; thinner books and higher staleness risk"},k=null;u&&(k=Q_(l));let x={rankedOn:h,ranked:y,winner:p,runnersUp:m,improvementBps:w===null?null:Number(dt(w)),sourcesAnswered:s,sourcesTried:r,failed:a,excluded:i,darkWindow:S,instrumentMix:f,bestPreparable:v,carry:p?.carry??null,breakEvenHorizonHours:k};return ns(x)}function Q_(e){let t=e.filter(i=>i.instrument==="spot").sort((i,s)=>un(i.net,s.net))[0],n=e.filter(i=>i.instrument==="perp").sort((i,s)=>un(i.net,s.net))[0];if(!t||!n||n.fundingHourly===null)return null;let r=Eo(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=pt(r,o,4),s=Number(dt(i));return!Number.isFinite(s)||s<0?null:s}catch{return null}}var fu=_(()=>{cu();Wy();Ji();rt();Dt()});function mu(){return Xi()}function o1(e){return{mantissa:e*e*10n**BigInt(yr)/n1,scale:yr}}function i1(e){let t=o1(BigInt(e.sqrtPriceX96)),n=e.quote==="USDG"?6:18,r=18;if(e.quoteIsToken0){let o=pt(Xe(t,Fe(10n**BigInt(n),0)),Fe(10n**BigInt(r),0),yr);return o.mantissa===0n?null:pt(V("1"),o,yr)}return pt(Xe(t,Fe(10n**BigInt(r),0)),Fe(10n**BigInt(n),0),yr)}function s1(e){let t=vy(),n=t.assets[e];return n?Fe(n.rawPrice,t.oracleScaleExp):null}function a1(e,t){if(e===null||t===null||e.mantissa<=0n||t.mantissa<=0n)return null;let n={...e};return pt(t,c1(n,t),yr)}function c1(e,t){let n=Math.max(e.scale,t.scale);return{mantissa:wo(e,n).mantissa+wo(t,n).mantissa,scale:n}}function u1(e){let t=mu(),n=r1[e];return n?{wei:BigInt(t.gasPriceWei)*n,units:n,native:"ETH"}:null}function hu(){return Object.keys(mu().pools).sort()}function gr({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=mu(),o=r.pools[e];if(!o)return null;let i=i1(o);if(i===null)return null;let s=Ae(o.liqUsd),a=n===null?V("0"):n,c=o.feePpm===null||o.feePpm===void 0?null:pt(Fe(BigInt(o.feePpm),0),Fe(1000000n,0),8),u=a.mantissa===0n?V("0"):a1(s,a),l=u1(o.version),p={venue:Z_,chain:e1,instrument:"spot",tier:t1,symbolRaw:e,symbol:e,side:t,requestedSize:a,mid:i,fees:c,gasEstimate:null,priceImpact:u,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:l===null?null:l.wei.toString(),gasUnits:l===null?null:l.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"]}},m=s1(e);return m!==null&&(p.referencePrice=m,p.referenceBasisBps=dt(pt(Xe(Eo(i,m),Fe(10000n,0)),m,4))),je(p)}function Gy({side:e="buy",sizeUsd:t=null}={}){return hu().map(n=>gr({symbol:n,side:e,sizeUsd:t})).filter(n=>n!==null)}var Z_,e1,t1,n1,yr,r1,yu=_(()=>{ft();Tn();rt();Dt();Z_="rh_uniswap",e1=4663,t1="prepare",n1=1n<<192n,yr=18,r1=Object.freeze({v3:180000n,v4:240000n})});function ss(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=gr({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>Ky)throw new Error(`quote is stale (${a}ms old, bound ${Ky}ms); re-quote before preparing`);let u=Xi().pools[t],l=u.version==="v4"?d1:l1,d=l,f=n==="buy"?u.quoteAddr:u.token;return Object.freeze({artifactKind:"unsigned-tx",chainId:4663,to:l,data:"0x",value:"0",requiresApproval:{spender:d,token:f,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:u.version,pair:u.pair},quoteAgeMs:a,recipient:o,side:n,notes:["prepare-only: user wallet must sign","calldata encoding is deferred; this artifact is the bound intent",u.version==="v4"?"V4 route via PoolManager":"V3 route via SwapRouter (address not yet pinned)"]})}var Ky,l1,d1,gu=_(()=>{yu();ft();Ky=12e4,l1="0x0000000000000000000000000000000000000000",d1="0x84b75b19A3cdf8E2F56d0507d22D442847B2053C"});function vo(){return Je().venues.hyperliquid_hip3}function Yy(){return Object.keys(vo().dexs).sort()}function h1(){let e=[];for(let[t,n]of Object.entries(vo().dexs))for(let r of Object.keys(n))e.push(`${t}:${r}`);return e.sort()}function y1(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=vo().dexs[r]?.[o];return i?[{dex:r,ticker:o,market:i}]:[]}let n=[];for(let[r,o]of Object.entries(vo().dexs))Object.hasOwn(o,e)&&n.push({dex:r,ticker:e,market:o[e]});return n}function g1(e,t){try{return Oy().books[`${e}:${t}`]??null}catch{return null}}function b1(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(dt(n));if(!Number.isFinite(o)||o<=0)return null;let i=0,s=0,a=0;for(let c of r){let u=Number(c.px),l=Number(c.sz);if(!(u>0)||!(l>0))continue;let d=u*l,f=Math.min(o,d),p=f/u;if(i+=f,s+=p,o-=f,a+=1,o<=1e-9)break}return s<=0?null:{vwap:i/s,filledUsd:i,unfilledUsd:Math.max(0,o),levelsUsed:a}}function w1(e,t,n,r){let o=b1(e,t,n);if(!o)return{impact:null,depth:null};let i=Number(dt(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:Ae(Number(a.toPrecision(12))),depth:{...o,impactFraction:a,fullyFilled:o.unfilledUsd<=1e-6}}}function Xy({dex:e,ticker:t,market:n,side:r,size:o}){let i=mt(n.mark,`${e}:${t}.mark`),s=Ae(n.fundingHourly),a=Ae(n.vol24h),c=Ae(n.oi),u=o===null?V("0"):o,l=g1(e,t),d=null,f=null,p="fees and gas not captured";if(u.mantissa>0n)if(l){let h=w1(l,r,u,i);d=h.impact,f=h.depth,f?.fullyFilled?p="impact measured from l2Book; fees and gas still not captured":p="book walked but size exceeds visible depth; fees and gas not captured"}else p="no order book depth wired for this coin; fees and gas not captured";else l?p="zero size; fees and gas not captured":p="no order book depth wired for this coin; fees and gas not captured";let y={venue:p1,chain:f1,instrument:"perp",tier:m1,symbolRaw:`${e}:${t}`,symbol:t,side:r,requestedSize:u,mark:i,fees:null,gasEstimate:null,priceImpact:d,fundingHourly:s,costAccounted:!1,capturedAt:Je().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:p,hasL2Book:l!==null,l2BookFixture:l?"fixtures/hip3_l2books.json":null,depth:f}};return a!==null&&(y.raw.vol24hFixed=a),c!==null&&(y.raw.oiFixed=c),l?.bids?.[0]&&l?.asks?.[0]&&(y.bid=V(String(l.bids[0].px)),y.ask=V(String(l.asks[0].px))),je(y)}function Jy({symbol:e,side:t="buy",sizeUsd:n=null}={}){let r=y1(e);return r.length===0||r.length>1?null:Xy({...r[0],side:t,size:n})}function as({side:e="buy",sizeUsd:t=null,ticker:n=null}={}){let r=[];for(let o of h1()){let[i,s]=o.split(":");if(n!==null&&s!==n)continue;let a=vo().dexs[i][s];r.push(Xy({dex:i,ticker:s,market:a,side:e,size:t}))}return r}var p1,f1,m1,Qy=_(()=>{ft();Tn();rt();Dt();p1="hyperliquid_hip3",f1="hyperliquid",m1="quote-only"});function Zy(){return Je().venues.arcus_spot}function v1(){return Object.keys(Zy().pairs).sort()}function x1({symbol:e,side:t="buy",sizeUsd:n=null}={}){if(typeof e!="string"||e.length===0)return null;let r=Zy().pairs[e];if(!r)return null;let o=r.bid===void 0||r.bid===null?null:mt(r.bid,`${e}.bid`),i=r.ask===void 0||r.ask===null?null:mt(r.ask,`${e}.ask`),s=Ae(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),f=o.scale===d?o.mantissa:o.mantissa*10n**BigInt(d-o.scale),p=i.scale===d?i.mantissa:i.mantissa*10n**BigInt(d-i.scale);a={mantissa:f+p,scale:d+1},a={mantissa:(f+p)/2n,scale:d}}else s!==null&&(a=s);if(o===null&&i===null&&a===null)return null;let c=n===null?V("0"):n,u=V("0"),l={venue:E1,chain:S1,instrument:"spot",tier:A1,symbolRaw:e,symbol:e,side:t,requestedSize:c,fees:u,gasEstimate:null,priceImpact:null,fundingHourly:null,costAccounted:!1,capturedAt:Je().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&&(l.bid=o),i!==null&&(l.ask=i),a!==null&&(l.mid=a),je(l)}function cs({side:e="buy",sizeUsd:t=null}={}){return v1().map(n=>x1({symbol:n,side:e,sizeUsd:t})).filter(n=>n!==null)}var E1,S1,A1,eg=_(()=>{ft();Tn();rt();Dt();E1="arcus_spot",S1="robinhood-4663",A1="quote-only"});function us(){return Iy()}function bu(){return Object.keys(us().tokens).sort()}function O1(e){let t=us().pairs[e];return!t||t.length===0?null:[...t].sort((n,r)=>(r.liquidityUsd??0)-(n.liquidityUsd??0))[0]}function T1(e,t){if(e===null||t===null)return null;if(e.mantissa<=0n||t.mantissa<=0n)return V("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 wu({symbol:e,side:t="buy",sizeUsd:n=null}={}){if(typeof e!="string"||e.length===0)return null;let r=e,o=e,i=us().tokens;if(Object.hasOwn(i,e))r=e,o=i[e].symbolRaw;else if(e.endsWith("x")||e.endsWith("X")){let m=e.slice(0,-1).toUpperCase();if(Object.hasOwn(i,m))r=m,o=i[m].symbolRaw;else return null}else return null;let s=i[r],a=O1(r);if(!s||!a)return null;let c=mt(a.priceUsd,`${r}.priceUsd`),u=Ae(a.liquidityUsd),l=n===null?V("0"):n,d=l.mantissa===0n?V("0"):T1(u,l),f=!1;l.mantissa===0n&&(a.liquidityUsd??0)>=tg&&(f=!1);let p={venue:k1,chain:I1,instrument:"spot",tier:_1,symbolRaw:o,symbol:r,side:t,requestedSize:l,mid:c,fees:null,gasEstimate:null,priceImpact:d,fundingHourly:null,costAccounted:f,capturedAt:us().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)<tg}};return je(p)}function ng({side:e="buy",sizeUsd:t=null}={}){return bu().map(n=>wu({symbol:n,side:e,sizeUsd:t})).filter(n=>n!==null)}var k1,I1,_1,tg,rg=_(()=>{ft();Tn();rt();Dt();k1="solana_xstocks",I1="solana",_1="quote-only",tg=25e3});function ls(){return _y()}function Eu(){return Object.keys(ls().tokens).sort()}function $1(e){let t=ls().pairs[e];return!t||t.length===0?null:[...t].sort((n,r)=>(r.liquidityUsd??0)-(n.liquidityUsd??0))[0]}function q1(e,t){if(e===null||t===null)return null;if(e.mantissa<=0n||t.mantissa<=0n)return V("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 Su({symbol:e,side:t="buy",sizeUsd:n=null}={}){if(typeof e!="string"||e.length===0)return null;let r=e,o=e,i=ls().tokens;if(Object.hasOwn(i,e))r=e,o=i[e].symbolRaw;else if(e.endsWith("x")||e.endsWith("X")){let m=e.slice(0,-1).toUpperCase();if(Object.hasOwn(i,m))r=m,o=i[m].symbolRaw;else return null}else{let m=e.toUpperCase();if(Object.hasOwn(i,m))r=m,o=i[m].symbolRaw;else return null}let s=i[r],a=$1(r);if(!s||!a)return null;let c=mt(a.priceUsd,`${r}.priceUsd`),u=Ae(a.liquidityUsd),l=n===null?V("0"):n,d=l.mantissa===0n?V("0"):q1(u,l),p={venue:C1,chain:N1,instrument:"spot",tier:R1,symbolRaw:o,symbol:r,side:t,requestedSize:l,mid:c,fees:null,gasEstimate:null,priceImpact:d,fundingHourly:null,costAccounted:!1,capturedAt:ls().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)<P1,impactSizeFractionHint:L1}};return je(p)}function og({side:e="buy",sizeUsd:t=null}={}){return Eu().map(n=>Su({symbol:n,side:e,sizeUsd:t})).filter(n=>n!==null)}var C1,N1,R1,P1,L1,ig=_(()=>{ft();Tn();rt();Dt();C1="ton_stonfi",N1="ton",R1="quote-only",P1=25e3,L1=.01});var ds={};z(ds,{bestEquityRoute:()=>B1,collectEquityQuotes:()=>ag,equityVenues:()=>U1,getUniverse:()=>Ay,getVenues:()=>Je,loadFixtures:()=>ru,prepareEquity:()=>ss,prepareEquityRoute:()=>M1,rankEquityQuotes:()=>is,toJsonSafe:()=>D1,validateQuote:()=>je,validateRankResult:()=>ns});function Au(e){return e==null||e===""?null:typeof e=="object"&&e&&typeof e.mantissa=="bigint"?e:V(String(e))}function ag(e,{sizeUsd:t=null}={}){if(typeof e!="string"||!e.trim())throw new TypeError("ticker is required");let n=e.trim().toUpperCase(),r=Au(t),o=[],i=Jy({symbol:`xyz:${n}`,sizeUsd:r});if(i)o.push(i);else for(let u of as({ticker:n,sizeUsd:r}))o.push(u);for(let u of os({sizeUsd:r}))u.symbol===n&&o.push(u);for(let u of cs({sizeUsd:r}))u.symbol===n&&o.push(u);let s=gr({symbol:n,sizeUsd:r});s&&o.push(s);let a=wu({symbol:n,sizeUsd:r});a&&o.push(a);let c=Su({symbol:n,sizeUsd:r});return c&&o.push(c),o}function B1(e={}){let t=String(e.ticker||e.symbol||"").trim().toUpperCase();if(!t)throw new Error("bestEquityRoute requires ticker");let n=Au(e.sizeUsd??e.size??null),r=ag(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),u=is(r,{nowMs:a,horizonHours:e.horizonHours!=null?Number(e.horizonHours):void 0,skipLiveness:e.skipLiveness===!0});return{ticker:t,...u,dataSource:s?"fixture":"caller-clock",capturedAt:i,ageMs:c,stale:c>sg}}function U1(){let e=[{venue:"hyperliquid_hip3",tier:"quote-only",chain:"hyperliquid",n:as().length},{venue:"arcus_perp",tier:"quote-only",chain:"robinhood-4663",n:os().length},{venue:"arcus_spot",tier:"quote-only",chain:"robinhood-4663",n:cs().length},{venue:"rh_uniswap",tier:"prepare",chain:4663,n:hu().length},{venue:"solana_xstocks",tier:"quote-only",chain:"solana",n:bu().length},{venue:"ton_stonfi",tier:"quote-only",chain:"ton",n:Eu().length}],t=[...as(),...os(),...cs(),...Gy(),...ng(),...og()],n=(t[0]?.capturedAt??Date.now())+1e3,{survivors:r,excluded:o}=es(t,{nowMs:n});return{inventory:e,hip3Dexs:Yy(),liveness:{survivors:r.length,excluded:o.length,byReason:o.reduce((i,s)=>(i[s.reason]=(i[s.reason]??0)+1,i),{})},capturedAt:Je().capturedAt,custody:"prepare-only",note:"quote-only venues are ranked for discovery; only rh_uniswap is preparable in v1"}}function M1(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=Au(e.sizeUsd??e.size??null),o=gr({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),u=ss({symbol:t,sizeUsd:r,recipient:n,nowMs:a});return{ok:!0,ticker:t,artifact:u,bestPreparableVenue:"rh_uniswap",dataSource:s?"caller-clock":"live-clock",capturedAt:i,ageMs:c,stale:c>sg}}catch(i){return{ok:!1,failureKind:"prepare-refused",ticker:t,error:String(i.message||i)}}}function D1(e){return JSON.parse(JSON.stringify(e,(t,n)=>typeof n=="bigint"?n.toString():n))}var sg,ps=_(()=>{rt();fu();gu();cu();Qy();eg();du();yu();rg();ig();ft();fu();gu();Dt();ft();sg=3600*1e3});var fs={};z(fs,{CHAIN_CONFIGS:()=>Zt,EVIDENCE:()=>F,RISK:()=>U,SCANNER_CAPABILITIES:()=>Dn,__clearScanners:()=>mE,createScanner:()=>md,getScanner:()=>ga,listScanners:()=>hd,registerBuiltinScanners:()=>ki,registerCustomChain:()=>Pp,registerScanner:()=>ni,scannerCoverage:()=>hE,validateScanner:()=>fd});var ms=_(()=>{Xt();Wr()});var ku={};z(ku,{createWatch:()=>V1,listWatches:()=>z1,removeWatch:()=>W1});import xo from"node:fs";import vu from"node:path";import{randomUUID as F1}from"node:crypto";import{homedir as j1}from"node:os";function H1(e=process.env){return e.ORACLE_CONFIG_DIR||vu.join(j1(),".config","oracle")}function cg(e=process.env){return vu.join(H1(e),"watches.json")}function xu(e=process.env){let t=cg(e);if(!xo.existsSync(t))return{watches:[]};try{let n=JSON.parse(xo.readFileSync(t,"utf8"));return{watches:Array.isArray(n.watches)?n.watches:[]}}catch{return{watches:[]}}}function ug(e,t=process.env){let n=cg(t);xo.mkdirSync(vu.dirname(n),{recursive:!0,mode:448});let r=`${n}.${process.pid}.tmp`;xo.writeFileSync(r,`${JSON.stringify(e,null,2)}
9
- `,{mode:384}),xo.renameSync(r,n)}function z1(e=process.env){return xu(e).watches}function V1({chain:e,token:t,condition:n,note:r}={},o=process.env){if(!e||!t||!n)throw new Error("watch requires chain, token, condition");let i={id:F1(),chain:String(e),token:String(t),condition:String(n),note:r?String(r):null,actionMode:"alert_only",createdAt:new Date().toISOString()},s=xu(o);return s.watches.push(i),ug(s,o),i}function W1(e,t=process.env){let n=xu(t),r=n.watches.filter(o=>o.id!==e);return r.length===n.watches.length?!1:(ug({watches:r},t),!0)}var Iu=_(()=>{});var lg={};z(lg,{classifyReceipt:()=>G1});function G1(e){let t=e?.transactionHash||e?.hash||e?.txid||null;return t?{happened:!0,hash:String(t),note:null}:{happened:!1,hash:null,note:"no transaction hash \u2014 the action did not succeed"}}var dg=_(()=>{});function Q1(e){return!(J1.has(e)||/^0x/i.test(e)||!/\d/.test(e)&&e===e.toLowerCase()||!/\d/.test(e)&&e===e.toUpperCase())}function pg(e,{extras:t=[]}={}){let n=[e,...t].map(i=>String(i||"")).join(`
10
- `),r=[...new Set((n.match(K1)||[]).map(i=>i.toLowerCase()))].filter(i=>!X1.has(i)),o=[...new Set(n.match(Y1)||[])].filter(Q1);return{evm:r,solana:o,all:[...r.map(i=>({chainFamily:"evm",address:i})),...o.map(i=>({chainFamily:"solana",address:i}))]}}function fg(e){let t=String(e||"").trim();if(!t)return[];let n=[],r=o=>{if(!o||typeof o!="object")return;let i=String(o.id||o.id_str||o.tweetId||o.statusId||""),s=o.text||o.full_text||o.fullText||o.body||o.note_tweet?.text||"",a=[],c=o.entities?.urls||o.entities?.Urls||[];for(let u of c)u?.expanded_url&&a.push(u.expanded_url),u?.url&&a.push(u.url);(i||s)&&n.push({id:i,text:String(s),urls:a,raw:o})};try{let o=JSON.parse(t),i=Array.isArray(o)?o:o.data?Array.isArray(o.data)?o.data:[o.data]:o.tweets||o.statuses||o.results||[];Array.isArray(i)?i.forEach(r):r(o)}catch{for(let o of t.split(`
11
- `)){let i=o.trim();if(i.startsWith("{"))try{r(JSON.parse(i))}catch{}}n.length||n.push({id:"",text:t,urls:[]})}return n}var K1,Y1,X1,J1,mg=_(()=>{K1=/\b0x[a-fA-F0-9]{40}\b/g,Y1=/\b[1-9A-HJ-NP-Za-km-z]{32,44}\b/g,X1=new Set(["0x0000000000000000000000000000000000000000","0x000000000000000000000000000000000000dead","0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee"].map(e=>e.toLowerCase())),J1=new Set(["So11111111111111111111111111111111111111112","EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v","Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB","11111111111111111111111111111111"])});import{spawnSync as Z1}from"node:child_process";import hg from"node:fs";import _u from"node:path";function rO(e=process.env){let t=String(e.ORACLE_XURL_ENABLED||"").trim().toLowerCase();return t==="1"||t==="true"||t==="yes"||t==="on"}function bg(e=process.env){let t=String(e.ORACLE_XURL_ALLOW_WRITE||"").trim().toLowerCase();return t==="1"||t==="true"||t==="yes"||t==="on"}function oO(e=process.env){let t=String(e.ORACLE_XURL_BIN||"").trim();if(t)return _u.isAbsolute(t)?hg.existsSync(t)?{ok:!0,bin:t}:{ok:!1,error:`ORACLE_XURL_BIN not found: ${t}`}:{ok:!1,error:"ORACLE_XURL_BIN must be absolute"};let n=String(e.PATH||process.env.PATH||"");for(let r of n.split(_u.delimiter)){if(!r)continue;let o=_u.join(r,"xurl");try{if(hg.existsSync(o))return{ok:!0,bin:o}}catch{}}return{ok:!1,error:"xurl binary not found on PATH. Install: curl -fsSL https://raw.githubusercontent.com/xdevplatform/xurl/main/install.sh | bash"}}function iO(e=process.env){let t=e.HOME||process.env.HOME||"";return{PATH:e.PATH||process.env.PATH||"/usr/bin:/bin",HOME:t,USER:e.USER||process.env.USER||"",LANG:e.LANG||process.env.LANG||"C.UTF-8",LC_ALL:e.LC_ALL||process.env.LC_ALL||"C.UTF-8",XDG_CONFIG_HOME:e.XDG_CONFIG_HOME||process.env.XDG_CONFIG_HOME||"",XDG_DATA_HOME:e.XDG_DATA_HOME||process.env.XDG_DATA_HOME||"",NO_COLOR:"1"}}function sO(e){for(let t of e){let n=String(t);if(gg.includes(n))return n;if(gg.some(r=>r.startsWith("--")&&n.startsWith(`${r}=`)))return n.split("=")[0]}return null}function aO(e={},t=process.env){let n;if(Array.isArray(e.argv))n=e.argv.map(c=>String(c));else{let c=String(e.command||e.cmd||"").trim();if(!c)return{ok:!1,error:"command is required (e.g. whoami, search, read, post)"};let u=Array.isArray(e.args)?e.args.map(l=>String(l)):typeof e.query=="string"?[e.query]:typeof e.text=="string"?[e.text]:typeof e.id=="string"?[e.id]:typeof e.handle=="string"?[e.handle]:[];c==="search"&&e.limit!=null&&u.push("-n",String(Math.min(50,Math.max(1,Number(e.limit)||10)))),(c==="timeline"||c==="mentions")&&e.limit!=null&&u.push("-n",String(Math.min(50,Math.max(1,Number(e.limit)||10)))),n=[c,...u]}if(n.length===0)return{ok:!1,error:"empty argv"};if(n.length>24)return{ok:!1,error:"too many arguments"};for(let c of n)if(String(c).length>4e3)return{ok:!1,error:"argument too long"};let r=sO(n);if(r)return{ok:!1,error:`forbidden flag: ${r}`};if(n.some(c=>String(c).includes("\0")))return{ok:!1,error:"nul byte in argv"};let o=String(n[0]||"").replace(/^\//,"");if(o.startsWith("2/")||n[0].startsWith("/2/")||n[0].startsWith("https://api.x.com/")){if(!bg(t)&&n.some(c=>/^-X$/.test(c)||/^--request$/.test(c))){let c=n.findIndex(l=>l==="-X"||l==="--request"),u=String(n[c+1]||"GET").toUpperCase();if(u!=="GET"&&u!=="HEAD")return{ok:!1,error:"raw non-GET requires ORACLE_XURL_ALLOW_WRITE=true"}}}else if(o==="auth"){if(String(n[1]||"")!=="status")return{ok:!1,error:"only `auth status` is allowed (no apps add / oauth2 from the agent)"}}else if(!tO.includes(o))if(nO.includes(o)){if(!bg(t))return{ok:!1,error:`write command '${o}' requires ORACLE_XURL_ALLOW_WRITE=true`}}else return o==="media"?{ok:!1,error:"media upload is disabled in the agent tool (run xurl media outside the agent)"}:{ok:!1,error:`command not allowlisted: ${o}`};let i=[...n],s=String(t.ORACLE_XURL_APP||"").trim(),a=String(t.ORACLE_XURL_USER||"").trim();if(s&&!i.includes("--app")&&i.unshift("--app",s),a&&!i.includes("--username")&&!i.includes("-u")){let c=0;i[0]==="--app"&&(c=2),c<i.length&&i.splice(c+1,0,"-u",a)}return{ok:!0,argv:i,command:o}}async function wg(e,t={},n={}){if(e!=="xurl")return{ok:!1,error:`unknown tool: ${e}`};let r=n.env||process.env;if(!rO(r))return{ok:!1,error:"xurl is disabled. Set ORACLE_XURL_ENABLED=true after `xurl auth status` succeeds. Writes stay off until ORACLE_XURL_ALLOW_WRITE=true."};let o=aO(t,r);if(!o.ok)return o;let i=oO(r);if(!i.ok)return i;let a=(n.spawnFn||Z1)(i.bin,o.argv,{encoding:"utf8",timeout:n.timeoutMs||yg,maxBuffer:1024*1024,env:iO(r)});if(a.error){let d=a.error.code==="ETIMEDOUT"?`xurl timed out after ${n.timeoutMs||yg}ms`:String(a.error.message||a.error);return{ok:!1,error:mn(d,{force:!0})}}let c=mn(String(a.stdout||"").slice(0,eO),{force:!0}),u=mn(String(a.stderr||"").slice(0,2e3),{force:!0}),l=typeof a.status=="number"?a.status:1;return{ok:l===0,status:l,command:o.command,argv:o.argv.map(d=>/=/.test(d)&&/token|secret|key|bearer/i.test(d)?"[redacted-arg]":d),stdout:c,stderr:u||void 0}}var yg,eO,tO,nO,gg,m6,Eg=_(()=>{Vs();yg=45e3,eO=4e4,tO=Object.freeze(["whoami","user","read","search","timeline","mentions","bookmarks","likes","following","followers","dms","auth"]),nO=Object.freeze(["post","reply","quote","delete","like","unlike","repost","unrepost","bookmark","unbookmark","follow","unfollow","block","unblock","mute","unmute","dm"]),gg=Object.freeze(["--verbose","-v","--trace","-t","--bearer-token","--consumer-key","--consumer-secret","--access-token","--token-secret","--client-id","--client-secret"]);m6=Object.freeze([{type:"function",function:{name:"xurl",description:"Call the official xurl CLI against the X API with an allowlisted command. Reads (whoami/user/read/search/timeline/mentions/...) work when ORACLE_XURL_ENABLED=true. Writes (post/reply/like/follow/dm/...) also need ORACLE_XURL_ALLOW_WRITE=true. Never pass secrets or --verbose. Auth is whatever the operator configured in ~/.xurl.",parameters:{type:"object",properties:{command:{type:"string",description:"xurl subcommand: whoami, user, read, search, timeline, mentions, post, reply, ..."},args:{type:"array",items:{type:"string"},description:"Positional args after the command (query, id, handle, text)."},query:{type:"string",description:"Convenience for search query."},text:{type:"string",description:"Convenience for post/reply/dm text."},id:{type:"string",description:"Convenience for read/like/reply target id or URL."},handle:{type:"string",description:"Convenience for user/follow/dm handle."},limit:{type:"integer",description:"Result limit for search/timeline/mentions (1-50)."},argv:{type:"array",items:{type:"string"},description:"Raw argv alternative (still allowlisted + flag-filtered)."}},additionalProperties:!1}}}])});function dO(e){return!e||e==="0x"||e===lO}async function Sg(e={},t={}){let n=t.rpcCall||te,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(y){return{address:r,chainId:o,status:"unavailable",error:y?.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[y,h]of Object.entries(cO))c.includes(y)&&a.push({selector:`0x${y}`,...h});let u=!1,l=null,d=null,f=await Promise.all(uO.map(async({label:y,slot:h})=>{try{let w=await n(o,"eth_getStorageAt",[r,h,"latest"],t);return{label:y,word:w,error:null}}catch{return{label:y,word:null,error:`proxy slot (${y}) unreadable; proxy status uncertain`}}}));for(let y of f)y.error&&s.push(y.error),!u&&y.word&&!dO(y.word)&&(u=!0,l=y.label,d=`0x${String(y.word).slice(-40)}`);u&&(a.push({selector:l,name:"proxy",weight:"high",note:"implementation is upgradeable \u2014 current behaviour is not a guarantee"}),s.push(`bytecode scan covers the proxy (${l}), not the implementation ${d} it delegates to`));let m=a.filter(y=>y.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:u,proxyStandard:l,implementation:d,codeSize:Math.floor(c.length/2),notes:s}}var cO,uO,lO,Ag=_(()=>{it();cO=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"}}),uO=Object.freeze([{label:"eip1967",slot:"0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc"},{label:"zeppelinos",slot:"0x7050c9e0f4ca769c69bd3a8ef740bc37934f8e2c036e5a723fd8ee048ed3f8c3"},{label:"eip1822",slot:"0xc5f16f0fcc639fa48a6947836d9850f504798523bf8c9a3a87d5876cf622bcf7"}]),lO=`0x${"0".repeat(64)}`});function hs(e,t){let n=String(e||"").trim();if(!pO.test(n))throw new Error(`evm-token-sniper: ${t} must be a 0x EVM address`);return n}function Ou(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 ko(e,t){return e==null||e===""?null:Ou(e,t)}function mO({chainId:e,tokenAddress:t,tokenIn:n,amountIn:r,recipient:o,quote:i,topPool:s,unsignedTx:a,args:c,opts:u}){let l=a?.tx;if(!l||typeof l!="object")throw new Error("local-signer envelope requires unsigned tx object");let d=hs(l.to,"prepared destination"),f=String(l.data||"").toLowerCase();if(!/^0x[0-9a-f]+$/.test(f))throw new Error("local-signer envelope requires hex calldata");let p=Ou(l.value??r,"prepared native value");if(BigInt(p)!==BigInt(r))throw new Error("local-signer envelope requires native value equal amountIn");let m=ko(l.gasLimit??c.gasLimit,"gasLimit"),y=ko(l.maxFeePerGas??c.maxFeePerGas,"maxFeePerGas");if(!m||!y)throw new Error("local-signer envelope requires explicit gasLimit and maxFeePerGas caps");let h=Number(u.nowMs??Date.now()),w=Math.min(6e4,Math.max(1e3,Number(c.ttlMs??c.expiresInMs??3e4)||3e4)),v=aa({chainId:e,venue:"uniswap-v3",quoteAmountOut:i?.amountOut,liquidityUsd:s?.liquidityUsd,requestedCapBps:c.slippageBps??50,quotedAtMs:h,ttlMs:w,secret:u.routeAttestationSecret}),T=We(v,{chainId:e,venue:"uniswap-v3",data:f,secret:u.routeAttestationSecret}),S={chainId:e,from:o,to:d,data:f,value:p,gasLimit:m,maxFeePerGas:y,slippageBps:T.selectedBps,expiresAtMs:h+w},k=ko(l.maxPriorityFeePerGas??c.maxPriorityFeePerGas,"maxPriorityFeePerGas");return k&&(S.maxPriorityFeePerGas=k),c.nonce!==void 0&&(S.nonce=Number(c.nonce)),(c.txType!==void 0||k)&&(S.type=Number(c.txType??2)),c.l1FeeWei!==void 0&&(S.l1FeeWei=ko(c.l1FeeWei,"l1FeeWei")??"0"),c.operatorFeeWei!==void 0&&(S.operatorFeeWei=ko(c.operatorFeeWei,"operatorFeeWei")??"0"),{version:1,surface:"evm-swap",action:"swap",provider:"uniswap-v3",owner:o,destination:d,tradeId:c.tradeId||`evm-token-sniper-${e}-${t.toLowerCase()}`,slippageBps:T.selectedBps,expiresAtMs:h+w,fee:{oracleFeeBps:5},autoSlippage:T,artifact:{chainId:e,owner:o,transactions:[S]},meta:{source:"evm-token-sniper",tokenIn:n,tokenOut:t}}}function hO(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}ki();let n=ga(e);if(!n)throw new Error(`evm-token-sniper: unsupported EVM chainId ${e}`);return n}function yO({token:e,pools:t,structuralRisk:n,scannerRisk:r,sellability:o,quote:i,args:s,scanner:a}){let c=[];return e?.evidence!==F.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!==U.PASS&&c.push(`scanner risk verdict is ${r?.verdict||"UNKNOWN"}`),a.supports?.("sellSimulation")?o?.verdict!==U.PASS&&c.push(`sellability verdict is ${o?.verdict||"UNKNOWN"}`):c.push("sell simulation is unavailable on this chain"),a.supports?.("quote")?i?.evidence!==F.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 vg(e={},t={}){let n=Number(e.chainId??fO);if(!Number.isInteger(n)||n<=0)throw new Error("evm-token-sniper: chainId must be a positive integer");let r=hs(e.tokenAddress||e.address||e.token,"tokenAddress"),o=e.tokenIn?hs(e.tokenIn,"tokenIn"):null,i=e.recipient?hs(e.recipient,"recipient"):null,s=e.amountIn==null?null:Ou(e.amountIn,"amountIn"),a=hO(n,t.scanner),c=t.scanContractRisk||Sg,[u,l,d]=await Promise.all([a.resolveToken(r),a.resolvePools(r),c({address:r,chainId:n},t.contractRiskOpts||t)]),f=await a.scoreRisk(r),p=null;a.supports?.("sellSimulation")&&s?p=await a.sellSimulation({token:r,amountIn:s,base:o||void 0}):a.supports?.("sellSimulation")&&(p=await a.sellSimulation({token:r,amountIn:"10000000000000000"}));let m=null;a.supports?.("quote")&&o&&s&&(m=await a.quote({tokenIn:o,tokenOut:r,amountIn:s}));let y={...e,tokenIn:o,amountIn:s,recipient:i},h=yO({token:u,pools:l,structuralRisk:d,scannerRisk:f,sellability:p,quote:m,args:y,scanner:a}),w=null,v=null,T=null;if(e.prepare===!0&&h.length===0){w=await a.prepareUnsignedTx({tokenIn:o,tokenOut:r,amountIn:s,recipient:i,slippageBps:e.slippageBps??50,fee:m?.fee});try{v=mO({chainId:n,tokenAddress:r,tokenIn:o,amountIn:s,recipient:i,quote:m,topPool:l?.pools?.[0]||null,unsignedTx:w,args:e,opts:t})}catch(S){T=String(S?.message||S).slice(0,200)}}return{provider:"evm-token-sniper",execution:"armed-local",armed:!!v,signing:"local-signer",broadcasting:"local-signer",chainId:n,chain:{key:a.key,name:a.name,nativeCurrency:a.nativeCurrency},token:u,pools:l,topPool:l?.pools?.[0]||null,structuralRisk:d,scannerRisk:f,sellability:p,quote:m,blockedReasons:h,prepared:!!w,unsignedTx:w,localSignerEnvelope:v,localSignerBlockedReason:T,signed:v?"pending-local-signer":!1,broadcast:v?"pending-local-signer":!1}}var pO,fO,xg=_(()=>{Wr();Xt();at();Ag();pO=/^0x[0-9a-fA-F]{40}$/,fO=4663});var Tg={};z(Tg,{evaluateContracts:()=>Og,fetchAccountTweets:()=>_g,snipeExecuteEnabled:()=>kg,tickTwitterCaWatch:()=>AO,twitterSnipeEmitsCard:()=>vO});function kg(e=process.env){return String((e||process.env).ORACLE_SNIPE_EXECUTE||"").trim()==="1"}function Ig(e){return String(e||"").trim().replace(/^@/,"")}async function _g({handle:e,limit:t=5,xurlFn:n=wg}={},r={}){let o=Ig(e);if(!o)throw new Error("twitter-ca-watch: handle required");let i=await n("xurl",{command:"search",query:`from:${o}`,limit:Math.min(20,Math.max(1,Number(t)||5))},r);return i?.ok?{ok:!0,tweets:fg(i.stdout),raw:i}:{ok:!1,error:i?.error||"xurl search failed",tweets:[]}}async function EO(e,{chainId:t,amountIn:n,tokenIn:r,recipient:o,prepare:i},s){let a=await vg({chainId:t,tokenAddress:e,amountIn:n,tokenIn:r,recipient:o,prepare:i===!0},s),c=a.topPool||a.pools?.pools?.[0]||null;return{chainFamily:"evm",chainId:t,address:e,topPool:c,quoteAsset:a.pools?.quoteAsset||null,sellability:a.sellability||null,blockedReasons:a.blockedReasons||[],prepared:!!a.prepared,unsignedTx:a.unsignedTx||null,localSignerEnvelope:a.localSignerEnvelope||null,execution:!1,broadcast:!1}}async function SO(e,t){let n=await Hl(e,{chainSlug:"solana",stables:[bO,wO]},t);return{chainFamily:"solana",chainId:"solana",address:e,topPool:n.topPool,pools:n.pools,prepared:!1,execution:!1,broadcast:!1,note:"Solana CA ranked on USD book. Prepare stays Jupiter/local-signer; this tick does not broadcast."}}async function Og(e,t={},n={}){let r=Number(t.chainId??gO),o=[];for(let i of e.evm||[])o.push(await EO(i,{...t,chainId:r},n));for(let i of e.solana||[])o.push(await SO(i,n));return o}async function AO(e={},t={}){let n=Ig(e.handle),r=e.seen instanceof Set?e.seen:new Set(e.seen||[]),o=await _g({handle:n,limit:e.limit,xurlFn:t.xurlFn},t);if(!o.ok)return{ok:!1,handle:n,error:o.error,hits:[],seen:[...r]};let i=[];for(let a of o.tweets){let c=a.id||`${n}:${a.text.slice(0,80)}`;if(r.has(c))continue;let u=pg(a.text,{extras:a.urls||[]});if(!u.all.length){r.add(c);continue}let d=await(t.evaluateFn||Og)(u,e,t);r.add(c),i.push({tweetId:a.id||null,handle:n,text:a.text,contracts:u,evaluations:d})}let s=e.automated!==!1;return{ok:!0,handle:n,source:"twitter-ca-watch",automated:s,card:!1,notify:!1,telegram:!1,execution:!1,broadcast:!1,snipeExecuteEnabled:kg(t.env||process.env),hits:i,seen:[...r]}}function vO(e={}){return!e||typeof e!="object"||e.source==="twitter-ca-watch"||e.automated===!0||e.card===!1||e.notify===!1,!1}var gO,bO,wO,Cg=_(()=>{mg();Eg();xg();Lr();Bo();gO=4663,bO="EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",wO="Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB"});import{wordlists as xO}from"ethers";function OO(e){let t=String(e).trim().toLowerCase().split(/\s+/).filter(Boolean);return _O.has(t.length)&&t.every(n=>xO.en.getWordIndex(n)>=0)}function RO(e){let t=Ng(e);return NO.has(t)||CO.test(t)}function Ng(e){return String(e).replace(/[^a-z0-9]/gi,"").toLowerCase()}function PO(e){let t=Ng(e);return[...kO].some(n=>t.includes(n))}function LO(e,t,n){if(typeof t=="string"){if(IO.some(r=>r.test(t))||OO(t))throw new Io(n);if(TO.test(t)&&!RO(e))throw new Io(n)}}function ys(e,t="$",n=""){if(e==null||typeof e=="boolean")return e;if(typeof e=="string")return LO(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)=>ys(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(PO(o))throw new Io(i);e[o]!==void 0&&(r[o]=ys(e[o],i,o))}return r}function K(e){return ys(e)}function Tu(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(Tu).join(",")}]`:`{${Object.keys(e).map(t=>`${JSON.stringify(t)}:${Tu(e[t])}`).join(",")}}`}function _o(e){return Tu(ys(e))}var kO,IO,_O,TO,CO,NO,Io,br=_(()=>{kO=new Set(["privatekey","privkey","secretkey","seedphrase","seed","mnemonic","passphrase","password","keystore","keymaterial","wif","xprv","xpriv","bearer","authorization","signature","apikey","credential"]),IO=[/\b[5KL][1-9A-HJ-NP-Za-km-z]{50,51}\b/,/\bxprv[0-9A-Za-z]{50,}\b/],_O=new Set([12,15,18,21,24]);TO=/^\s*(?:0x)?[0-9a-fA-F]{64}\s*$/,CO=/(hash|digest|root|salt|nonce|proof|commitment|sig|id)(?:e?s)?$/i,NO=new Set(["calldata","data","publickey","pubkey","message","payload","input","extradata"]);Io=class extends Error{constructor(t){super(`action receipt refused: secret-bearing field at ${t}`),this.name="ActionReceiptSecretError",this.code="ACTION_RECEIPT_SECRET"}}});import{mkdir as $O,chmod as gs,readFile as qO,rename as BO,writeFile as UO}from"node:fs/promises";import{homedir as MO}from"node:os";import{dirname as Rg,join as Cu}from"node:path";import DO from"sql.js";function Es(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(Es).join(",")}]`:`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${Es(e[t])}`).join(",")}}`}function Pg(e){if(!FO.has(e))throw new TypeError(`unknown artifact type: ${e}`);return e}function bs(e){let t=[];for(;e.step();)t.push(e.getAsObject());return e.free(),t}function ws(e){return e?{id:e.id,type:e.type,createdAt:e.created_at,data:JSON.parse(e.data_json)}:null}async function Lg(e={}){let t=e.path||zO;await $O(Rg(t),{recursive:!0,mode:448}),await gs(Rg(t),448);let n;try{n=await qO(t)}catch(u){if(u.code!=="ENOENT")throw u}let r=await DO(e.sqlJs||{}),o=n?new r.Database(n):new r.Database;o.run(`
7
+ - `)}`);let o=e.capabilities||{},i=xo.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,wrappedNative:e.wrappedNative||null,explorer:e.explorer||null,venues:(e.venues||[]).map(a=>({...a})),warnings:r,capabilities(){return{chainId:e.chainId,key:e.key,supported:[...i],unsupported:xo.filter(a=>!i.includes(a))}},supports(a){return i.includes(a)}};for(let a of xo)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)}function ua(e){let t=Wm(e);return Io.set(t.chainId,t),t}function Jl(e){return Io.get(Number(e))||null}function Gm(){return[...Io.values()]}function GI(){Io.clear()}function KI(){let e={};for(let t of Io.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:Io.size,capabilities:[...xo],chains:e}}var xo,J,G,WI,Io,mr=T(()=>{xo=Object.freeze(["blockNumber","nativeBalance","tokenBalance","resolveToken","resolvePools","scanBlocks","scoreRisk","quote","sellSimulation","prepareUnsignedTx"]),J=Object.freeze({LIVE:"LIVE",CACHED:"CACHED",STALE:"STALE",UNKNOWN:"UNKNOWN",UNAVAILABLE:"UNAVAILABLE"}),G=Object.freeze({PASS:"PASS",CAUTION:"CAUTION",FAIL:"FAIL",UNKNOWN:"UNKNOWN"}),WI=/^0x[0-9a-fA-F]{40}$/;Io=new Map});function Km(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:tn.FAILED,amountOut:null,error:l||"no amountOut returned"};let p=Li(n);if(p==null||p<=0n)return{source:t,quality:tn.FAILED,amountOut:null,error:"non-positive amountOut"};let f=Number(s);return{source:t,quality:o==null?tn.NO_GAS:tn.FULL,amountOut:p.toString(),minOut:Li(r)?.toString()??null,gasUsd:o,feeUsd:i,oracleFeeBps:Number.isFinite(f)&&f>0?Math.floor(f):0,estimatedGas:a==null?null:String(a),liquidityUsd:c==null?null:Number(c),executionReady:u,meta:d}}async function Jm(e,t,{divisor:n=1000n}={}){let r=Li(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=Li(i),c=Li(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 Xm(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 Xl(e,{destPriceUsd:t=null,destDecimals:n=null,liquidityFirst:r=!0,liquidityBandBps:o=50,gasPriceWei:i=null,nativePriceUsd:s=null}={}){let a=e.filter(w=>w.quality!==tn.FAILED),c=e.filter(w=>w.quality===tn.FAILED),l=t!=null&&t>0&&n!=null&&n>=0,u=Number(i),d=Number(s),p=Number.isFinite(u)&&u>0&&Number.isFinite(d)&&d>0,f=a.map(w=>{let b=BigInt(w.amountOut),x=0n,C=!1,O=!1,F=BigInt(w.oracleFeeBps??0),H=F>0n?b*F/10000n:0n;if(l){let _=w.gasUsd,$=Number(w.meta?.gasUnits??w.estimatedGas);if(_==null&&p&&Number.isFinite($)&&$>0){let M=$*u/1e18*d;Number.isFinite(M)&&M>=0&&(_=M,O=!0)}let q=(_??0)+(w.feeUsd??0);if(q>0){let M=q/t*10**n;Number.isFinite(M)&&M>=0&&(x=BigInt(Math.floor(M)),C=!0)}else _===0&&(C=!0)}let V=x+H,D=b>V?b-V:0n;return{...w,grossOut:b.toString(),netOut:D.toString(),costInDest:x.toString(),oracleFeeInDest:H.toString(),costAccounted:C,gasEstimated:O}}),m=Number(o)>0?Number(o):0,h=f.reduce((w,b)=>BigInt(b.netOut)>w?BigInt(b.netOut):w,0n),y=w=>h>0n?Number((h-BigInt(w))*10000n/h):0,g=[],E=f.slice().sort((w,b)=>BigInt(b.netOut)>BigInt(w.netOut)?1:-1)[0]??null;f.sort((w,b)=>{let x=y(w.netOut)<=m?0:1,C=y(b.netOut)<=m?0:1;if(r&&m>0&&x!==C)return x-C;if(r&&m>0){let O=w.liquidityUsd??-1,F=b.liquidityUsd??-1;if(O!==F)return F-O}return BigInt(b.netOut)>BigInt(w.netOut)?1:-1}),r&&m>0&&E&&f[0]&&f[0].source!==E.source&&g.push(`liquidity-first: chose ${f[0].source} (liquidity $${f[0].liquidityUsd??"unknown"}) over best-price ${E.source} within ${m} bps`);let v=f.filter(w=>!w.costAccounted).map(w=>w.source);l?v.length&&g.push(`gas not reported by: ${v.join(", ")}. These are ranked on gross output and may be overstated relative to gas-measured routes.`):g.push("destination price/decimals unavailable: ranked on GROSS output. Gas is not included, so a cheap-looking route may cost more to execute.");let S=f[0];if(l&&S&&S.costAccounted===!1){let w=f.find(b=>b.costAccounted&&y(b.netOut)<=m);w&&g.push(`winner ${S.source} has UNMEASURED gas; gas-measured ${w.source} is within ${m} bps and may net more once ${S.source}'s real gas is paid \u2014 prefer it if unsure.`)}let I=f.filter(w=>w.gasEstimated).map(w=>w.source);I.length&&g.push(`gas ESTIMATED (from gas units x current gas price, not measured) for: ${I.join(", ")}. Net includes this estimate so the ranking is gas-inclusive, but the on-chain gas may differ.`);let k=null,A=null;if(f.length>=2&&f[0].costAccounted&&f[1].costAccounted){let w=BigInt(f[0].netOut),b=BigInt(f[1].netOut);b>0n&&(k=Number((w-b)*10000n/b),A=`${f[0].source} vs ${f[1].source}`)}return{best:f[0]??null,routes:f,failed:c,improvementBps:k,spreadBasis:A,rankedOn:l?"net-of-cost":"gross",warnings:g}}async function da(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"?Km({source:s,error:String(o.reason?.message||o.reason)}):Km({source:s,...o.value})})}var tn,Ym,Li,Ql=T(()=>{mr();tn=Object.freeze({FULL:"FULL",NO_GAS:"NO_GAS",FAILED:"FAILED"}),Ym={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"},Li=e=>{try{return e==null||e===""?null:BigInt(String(e).split(".")[0])}catch{return null}}});function Zl(e){let t=String(e||"").trim();return/^0x[0-9a-fA-F]{40}$/.test(t)?t:hr}var hr,pa=T(()=>{hr="0x000000000000000000000000000000000000dEaD"});import{Contract as YI,JsonRpcProvider as JI}from"ethers";function nk(e){return tk.test(String(e||""))}async function Qm(e,{contract:t=XI,rpc:n=ZI,chainId:r=QI,balanceOf:o}={}){if(!nk(e))throw new Error("invalid-address");if(o)return BigInt(await o(e));let i=new JI(n,r,{staticNetwork:!0}),s=new YI(t,ek,i);return BigInt(await s.balanceOf(e))}var XI,QI,ZI,ek,tk,Zm=T(()=>{XI="0x62FCFAf7573AD8B41a0FBF347AfEb85e06599A75",QI=999,ZI="https://rpc.hyperliquid.xyz/evm",ek=["function balanceOf(address owner) view returns (uint256)"],tk=/^0x[a-fA-F0-9]{40}$/});import{existsSync as rk,readFileSync as ok,lstatSync as ik}from"node:fs";import{homedir as eh}from"node:os";import{join as eu}from"node:path";function ck(e){let t=String(e||"swap").toLowerCase();return Object.prototype.hasOwnProperty.call(th,t)?th[t]:ak}function fk(e=process.env){if(process.env.ORACLE_TEST_ISOLATE_SECRETS==="1"){if(e[nh])return String(e[nh]);let t=e.ORACLE_CONFIG_DIR||eu(eh(),".config","oracle");return eu(t,"fee-recipient")}return eu(eh(),".config","oracle","fee-recipient")}function mk(e=process.env){try{let t=fk(e);if(!rk(t)||ik(t).isSymbolicLink())return"";let n=ok(t,"utf8").trim().toLowerCase();return/^0x[a-f0-9]{40}$/.test(n)?n:""}catch{return""}}function hk(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),sk)}function yk({env:e=process.env,action:t="swap",admin:n=!1}={}){let r=String(e[uk]||"").trim(),o=String(e[dk]||pk).trim();if(n===!0)return{bps:0,recipient:"",integrator:o,action:t,applies:!1,reason:"admin-oracle"};let i=ck(t),s=hk(e[lk],{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=mk(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 fa({wallet:e,env:t=process.env,action:n="swap",holderCheck:r={},admin:o=!1}={}){let i=yk({env:t,action:n,admin:o});if(o===!0)return{...i,holderVerificationStatus:"admin-oracle"};let s=String(e||"").trim().toLowerCase();if(!/^0x[a-f0-9]{40}$/.test(s))return{...i,holderVerificationStatus:"wallet-required"};try{return BigInt(await Qm(s,r))>0n?{...i,bps:0,applies:!1,reason:"locals-only-holder",holderVerificationStatus:"holder"}:{...i,holderVerificationStatus:"non-holder"}}catch{return{...i,holderVerificationStatus:"unavailable"}}}function rh(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 oh(e){return e?.applies?{integrator:e.integrator,fee:String(e.bps/1e4)}:{}}function ih(e){return e?.applies?{partner:e.integrator,partnerFeeBps:String(e.bps),partnerAddress:e.recipient}:{}}var sk,ak,th,lk,uk,dk,nh,pk,ma=T(()=>{Zm();sk=100,ak=5,th=Object.freeze({swap:5,bridge:5,perps:0,nft:0});lk="ORACLE_INTEGRATOR_FEE_BPS",uk="ORACLE_INTEGRATOR_FEE_RECIPIENT",dk="ORACLE_INTEGRATOR_ID",nh="ORACLE_INTEGRATOR_FEE_RECIPIENT_PIN",pk="oracle"});var ru={};Q(ru,{LIFI_API:()=>ah,lifiChains:()=>Ak,lifiHealth:()=>wk,lifiPrepare:()=>Ek,lifiQuote:()=>Yr});function nu(e={}){return(e.baseUrl||process.env.LIFI_API_URL||ah).replace(/\/$/,"")}function bk(e){let t=String(e||tu).toLowerCase();return t===tu.toLowerCase()||t===gk}function sh(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 wk(e={}){let t=await R(`${nu(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 Yr(e={},t={}){let{fromChain:n,toChain:r=n,fromToken:o=tu,toToken:i,fromAmount:s,fromAddress:a=hr}=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=Hn({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 fa({wallet:e.fromAddress,env:t.env,action:e.feeAction||"swap",holderCheck:t.holderCheck});for(let[y,g]of Object.entries(oh(u)))c.set(y,g);let d=await R(`${nu(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 f=d?.transactionRequest?.to||d?.estimate?.approvalAddress||"lifi",m=We(d,{chainId:Number(n),venue:f,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(m.amountOutMinimum))throw new Error("lifi: provider transaction is under-protected versus bounded auto-slippage floor");return{...m,oracleFee:u}}async function Ek(e={},t={}){let n=await Yr(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(!bk(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:sh(a,"approval token"),spender:sh(s,"approval spender"),amount:String(e.fromAmount)}}return me({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:Nt(n.autoSlippage,{chainId:o,venue:r.to,data:r.data})}},{provider:"lifi",kind:"lifi-tx"})}async function Ak(e={}){return R(`${nu(e)}/chains`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??12e3})}var ah,tu,gk,$i=T(()=>{Y();en();pa();rt();ma();ah="https://li.quest/v1";tu="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",gk="0x0000000000000000000000000000000000000000"});var uh={};Q(uh,{PARASWAP_API:()=>ch,paraswapHealth:()=>vk,paraswapPrepare:()=>Sk,paraswapPrice:()=>Oo,paraswapTokens:()=>lh});function ko(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 lh(e={},t={}){let n=Number(e.chainId||1);return R(`${ou(t)}/tokens/${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function Oo(e={},t={}){let n=Number(e.chainId||e.network||1);if(e.amount==null)throw new Error("amount required");let r=new URLSearchParams({srcToken:ko(e.srcToken,"srcToken"),destToken:ko(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 fa({wallet:e.userAddress||e.fromAddress,env:t.env,action:e.feeAction||"swap",holderCheck:t.holderCheck});for(let[a,c]of Object.entries(ih(o)))r.set(a,c);let i=await R(`${ou(t)}/prices?${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4}),s=i?.priceRoute?.destAmount;return s?{...We(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 Sk(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=ko(e.userAddress,"userAddress"),o=await Oo(e,t),i=o?.priceRoute,s=String(i?.contractAddress||"").toLowerCase();if(!s)throw new Error("paraswap: price route missing contractAddress");let a={srcToken:ko(e.srcToken,"srcToken"),destToken:ko(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=ko(e.receiver,"receiver"));let c=await R(`${ou(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 me({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:Nt(o.autoSlippage,{chainId:n,venue:c.to,data:c.data})}},{provider:"paraswap",kind:"paraswap-tx"})}async function vk(e={}){let t=await lh({chainId:1},e),n=Array.isArray(t?.tokens)?t.tokens.length:Object.keys(t?.tokens||{}).length;return{ok:n>0,tokenSample:n}}var ch,ou,ha=T(()=>{Y();en();rt();ma();ch="https://api.paraswap.io",ou=(e={})=>(e.baseUrl||process.env.PARASWAP_API_URL||ch).replace(/\/$/,"")});function nn({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:ph(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([ph(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[dh]||"")==="1")return{baseUrl:s,trusted:!1,host:c};if(o)throw new Error(`${e}: refusing to call non-allowlisted host ${c} (set ${dh}=1 to permit it)`);return{baseUrl:s,trusted:!1,host:c}}function ph(e){let t=new URL(String(e));if(t.protocol!=="http:"&&t.protocol!=="https:")throw new Error("unsupported protocol");return t.host}function En(e){return typeof e=="string"&&e.length>0&&e.length<=4096&&!/[\s"\\[\]{},:]/u.test(e)?e:""}function rn(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 dh,zn=T(()=>{dh="ORACLE_ALLOW_CUSTOM_PROVIDER_URL"});var bh={};Q(bh,{ZEROX_API:()=>fh,zeroxHealth:()=>xk,zeroxPrepare:()=>Ik,zeroxPrice:()=>gh,zeroxQuote:()=>_o});function mh(e={}){return nn({provider:"zerox",defaultUrl:fh,hosts:["api.0x.org"],url:e.baseUrl||process.env.ZEROX_API_URL})}function hh(e={}){return mh(e).baseUrl}function ya(e={}){return e.apiKey||process.env.ZEROX_API_KEY||process.env.OX_API_KEY||process.env["0X_API_KEY"]||""}function yh(e={}){return rn({"0x-version":"v2",accept:"application/json"},{"0x-api-key":ya(e)},mh(e).trusted)}async function xk(e={}){if(!ya(e))return{ok:!1,configured:!1,error:"ZEROX_API_KEY not set"};try{let t=await gh({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 gh(e={},t={}){if(!ya(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),R(`${hh(t)}/swap/allowance-holder/price?${a}`,{headers:yh(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function _o(e={},t={}){if(!ya(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=Hn({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 R(`${hh(t)}/swap/allowance-holder/quote?${c}`,{headers:yh(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),u=l?.buyAmount||l?.grossBuyAmount;return u?We(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 Ik(e={},t={}){if(!e.taker)throw new Error("0x: taker required for executable prepare");let n=await _o(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 me({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:Nt(n.autoSlippage,{chainId:o,venue:r.to,data:r.data})}},{provider:"zerox",kind:"zerox-tx"})}var fh,ga=T(()=>{Y();en();zn();rt();fh="https://api.0x.org"});function wh(e={}){return nn({provider:"oneinch",defaultUrl:kk,hosts:["api.1inch.dev"],url:e.baseUrl||process.env.ONEINCH_API_URL})}function Ok(e={}){return wh(e).baseUrl}function Eh(e={}){return e.apiKey||process.env.ONEINCH_API_KEY||process.env.ONE_INCH_API_KEY||""}function _k(e={}){let t=Eh(e);return rn({accept:"application/json"},{Authorization:t?`Bearer ${t}`:""},wh(e).trusted)}async function Ah(e={},t={}){if(!Eh(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 R(`${Ok(t)}/${n}/quote?${s}`,{headers:_k(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3});return a?.dstAmount?We(a,{chainId:n,venue:"1inch-quote",amountOut:a.dstAmount,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps}):a}var kk,Sh=T(()=>{Y();en();zn();rt();kk="https://api.1inch.dev/swap/v6.0"});var b6,vh=T(()=>{b6=Object.freeze({READ:"read",PREPARE:"prepare",EXECUTE:"execute",AUTONOMOUS:"autonomous"})});import ba from"node:fs";import Tk from"node:os";import No from"node:path";import{fileURLToPath as Nk}from"node:url";function xh(){return process.env.ORACLE_FAKE_HOME||Tk.homedir()}function Rk(){return process.env.ORACLE_PUBLIC_DESKTOP==="1"}function wa(){return Rk()?process.env.ORACLE_CONFIG_DIR||No.join(xh(),".config","oracle"):No.join(xh(),".config","oracle")}function Pk(){return No.join(wa(),"desk.json")}function Lk(){return No.join(wa(),"env")}function To({force:e=!1}={}){if(To._done&&!e)return To._result||null;To._done=!0;let t={},n=(o,i)=>{if(i==null)return;let s=String(i).trim();s&&(process.env[o]!=null&&String(process.env[o]).trim()!==""||(process.env[o]=s,t[o]=s))};try{let o=Lk();if(ba.existsSync(o))for(let i of ba.readFileSync(o,"utf8").split(/\r?\n/)){let s=i.match(/^\s*([A-Z0-9_]+)\s*=\s*(.*?)\s*$/);if(!s||s[2].startsWith("#"))continue;let a=s[2];(a.startsWith('"')&&a.endsWith('"')||a.startsWith("'")&&a.endsWith("'"))&&(a=a.slice(1,-1)),n(s[1],a)}}catch{}try{let o=Pk();if(ba.existsSync(o)){let i=JSON.parse(ba.readFileSync(o,"utf8"));i&&typeof i=="object"&&(n("ORACLE_DESK_URL",i.deskUrl||i.dataUrl||i.url),n("ORACLE_DATA_URL",i.dataUrl||i.deskUrl||i.url),n("ORACLE_API_URL",i.apiUrl||i.dataUrl||i.deskUrl),n("ORACLE_PUBLIC_URL",i.publicUrl||i.deskUrl||i.dataUrl),n("ORACLE_EXEC_URL",i.execUrl),n("MAD_DESK_URL",i.deskUrl||i.dataUrl))}}catch{}let r=process.env.ORACLE_DESK_URL||process.env.ORACLE_DATA_URL||"";return r&&(n("ORACLE_DESK_URL",r),n("ORACLE_DATA_URL",r),n("ORACLE_API_URL",r),n("ORACLE_PUBLIC_URL",r),n("MAD_DESK_URL",r)),To._result=Object.keys(t).length?t:null,To._result}var Ck,x6,Ih=T(()=>{Ck=No.dirname(Nk(import.meta.url)),x6=No.resolve(Ck,"../..");try{To()}catch{}});var _h={};Q(_h,{armPreparedAction:()=>jk,callSigner:()=>kh,queueOwnerAction:()=>Oh});import{existsSync as $k,readFileSync as Dk}from"node:fs";import{request as Uk}from"node:http";import Bk from"node:path";function Mk(e=process.env){let t=String(e.ORACLE_SIGNER_URL||qk).replace(/\/$/,""),n;try{n=new URL(t)}catch{return null}return n.hostname!=="127.0.0.1"&&n.hostname!=="localhost"&&n.hostname!=="::1"?null:n.origin}function Fk(e=process.env){if(e.ORACLE_SIGNER_TOKEN)return String(e.ORACLE_SIGNER_TOKEN);let t=Bk.join(wa(),"signer","signer-token");return $k(t)?Dk(t,"utf8").trim():null}function kh(e,{method:t="GET",body:n=null,env:r=process.env,timeoutMs:o=4e3}={}){let i=Mk(r),s=Fk(r);return!i||!s?Promise.resolve({ok:!1,error:"local signer is not running"}):new Promise(a=>{let c=new URL(e,i),l=n?Buffer.from(JSON.stringify(n)):null,u=Uk({hostname:c.hostname,port:c.port||80,path:c.pathname,method:t,timeout:o,headers:{authorization:`Bearer ${s}`,origin:i,...l?{"content-type":"application/json","content-length":l.length}:{}}},d=>{let p=[];d.on("data",f=>p.push(f)),d.on("end",()=>{let f=Buffer.concat(p).toString("utf8"),m={};try{m=f?JSON.parse(f):{}}catch{m={error:"signer refused"}}a({httpStatus:d.statusCode,...m})})});u.on("timeout",()=>{u.destroy(),a({ok:!1,error:"local signer timed out"})}),u.on("error",()=>a({ok:!1,error:"local signer is not running"})),l&&u.write(l),u.end()})}async function Oh(e,t=process.env){if(!e||e.version!==1||!e.surface)throw new Error("queueOwnerAction: version-1 surface envelope required");return kh("/pending",{method:"POST",body:{artifact:e},env:t,timeoutMs:8e3})}async function jk(e,t=process.env){let n=e?.localSignerEnvelope||e?.envelope;if(!n||n.version!==1||!n.surface)throw new Error("armPreparedAction: prepared.localSignerEnvelope v1 required");return Oh(n,t)}var qk,Th=T(()=>{Ih();qk="http://127.0.0.1:9462"});var Bh={};Q(Bh,{COW_CANCEL_TYPES:()=>Ph,COW_HOSTS:()=>Aa,COW_ORDER_TYPES:()=>Ea,COW_SETTLEMENT:()=>Nh,COW_VAULT_RELAYER:()=>Ch,armCowOrder:()=>Yk,buildArmedCowOrder:()=>cu,cowCancelOrders:()=>tO,cowChains:()=>oO,cowHealth:()=>Gk,cowOrder:()=>Uh,cowOrderStatus:()=>Dh,cowOrderUid:()=>Jk,cowPrepareCancel:()=>Zk,cowPrepareOrder:()=>Kk,cowQuote:()=>Jr,cowSignCancel:()=>eO,cowSignOrder:()=>Xk,cowSubmitSignedOrder:()=>Qk,cowVerifyOrderFill:()=>rO});import{TypedDataEncoder as su,getAddress as Di,isAddress as Hk}from"ethers";function Sa(e,t={}){if(t.baseUrl)return t.baseUrl.replace(/\/$/,"");let n=Aa[Number(e)];if(!n)throw new Error(`cowswap: unsupported chainId ${e}`);return n}function zk(e,t="v1",n={}){let r=Sa(e,n);return t==="v1"?r:r.replace(/\/api\/v1$/,`/api/${t}`)}function Vn(e,t){let n=String(e||"").trim();if(!Hk(n))throw new Error(`cowswap: ${t} must be an address`);return Di(n).toLowerCase()}function Co(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 Lh(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 $h(e,t="uid"){let n=String(e||"").trim();if(!/^0x[0-9a-fA-F]{112}$/.test(n))throw new Error(`cowswap: ${t} must be 56-byte order UID hex`);return n.toLowerCase()}function Vk({digest:e,owner:t,validTo:n}={}){let r=Lh(e,"order digest").slice(2),o=Vn(t,"owner").slice(2).toLowerCase(),i=Number(n);if(!Number.isInteger(i)||i<0||i>4294967295)throw new Error("cowswap: validTo must fit uint32");return`0x${r}${o}${i.toString(16).padStart(8,"0")}`.toLowerCase()}function au(e){let t=Nh[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:Di(t)}}function Wk(e={},t,n){let r=Vn(e.sellToken,"sellToken"),o=Vn(e.buyToken,"buyToken"),i=Vn(e.receiver||n,"receiver"),s=Number(e.validTo);if(!Number.isInteger(s)||s<=0)throw new Error("cowswap: quote.validTo required");let a=Lh(e.appData||e.appDataHash||`0x${"0".repeat(64)}`,"appData");return{sellToken:r,buyToken:o,receiver:i,sellAmount:Co(e.sellAmount,"sellAmount"),buyAmount:Co(e.buyAmount,"buyAmount"),validTo:s,appData:a,feeAmount:Co(e.feeAmount??"0","feeAmount"),kind:String(e.kind||"sell"),partiallyFillable:!!e.partiallyFillable,sellTokenBalance:String(e.sellTokenBalance||"erc20"),buyTokenBalance:String(e.buyTokenBalance||"erc20")}}async function Gk(e={}){try{let t=await Jr({chainId:1,sellToken:iu[1],buyToken:Rh[1],sellAmountBeforeFee:"1000000000000000",from:hr},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 Jr(e={},t={}){let n=Number(e.chainId??1),r=Zl(e.from||e.owner),o=e.sellToken||iu[n],i=e.buyToken||Rh[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=iu[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 R(`${Sa(n,t)}/quote`,{method:"POST",body:a,fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),l=c?.quote?.buyAmount||c?.buyAmount;return l?We(c,{chainId:n,venue:"cowswap-order",amountOut:l,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps}):c}async function Kk(e={},t={}){let n=Number(e.chainId??1),r=Vn(Zl(e.from||e.owner||e.signer),"owner"),o=await Jr({...e,chainId:n,from:r,signingScheme:e.signingScheme||"eip712"},t),i=Wk(o?.quote||o,n,r),s=au(n),a={domain:s,types:Ea,primaryType:"Order",message:i},c=su.hash(s,Ea,i),l=Ch[n];if(!l)throw new Error(`cowswap: vault relayer not registered for chain ${n}`);return me({provider:"cowswap",orderReady:!0,executionReady:!1,chainId:n,owner:r,signingScheme:"eip712",settlement:s.verifyingContract.toLowerCase(),vaultRelayer:Di(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:Di(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:Di(l).toLowerCase(),amount:i.sellAmount},localSignerEnvelope:cu({chainId:n,owner:r,typedData:a,quoteId:o?.id??e.quoteId??null,cowGuard:{expiresAtMs:Math.min(i.validTo*1e3,Date.now()+2e4)}})},{provider:"cowswap",kind:"cow-order"})}function cu(e={},t={}){let n=e.typedData;if(!n?.domain||!n?.types||!n?.message)throw new Error("cowswap: typedData required to arm");let r=Number(e.chainId??n.domain.chainId),o=Aa[r];if(!o)throw new Error(`cowswap: unsupported chainId ${r}`);let i=Vn(e.owner,"owner"),s=Number(t.nowMs??Date.now()),a=su.hash(n.domain,n.types,n.message);return Object.freeze({tradeId:`cow:${r}:${a.slice(2)}`,version:1,surface:"evm-order",action:"order",owner:i,destination:"cowswap",chainId:r,expiresAtMs:Number(e.cowGuard?.expiresAtMs??s+2e4),slippageBps:0,fee:{oracleFeeBps:0},artifact:Object.freeze({kind:"cow",chainId:r,submitTo:`${o}/orders`,quoteId:e.quoteId??null,domain:n.domain,types:n.types,message:n.message,typedData:n})})}async function Yk(e={},t={}){let{queueOwnerAction:n}=await Promise.resolve().then(()=>(Th(),_h)),r=e.localSignerEnvelope||cu(e,t);return{...await n(r,t.env),envelope:r,execution:"armed-local",exec:!1}}async function Dh(e={},t={}){let n=Number(e.chainId??1),r=String(e.uid||e.orderUid||"").trim();if(!r)throw new Error("cowOrderStatus requires uid");return R(`${Sa(n,t)}/orders/${encodeURIComponent(r)}/status`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function Uh(e={},t={}){let n=Number(e.chainId??1),r=String(e.uid||e.orderUid||"").trim();if(!r)throw new Error("cowOrder requires uid");return R(`${Sa(n,t)}/orders/${encodeURIComponent(r)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}function Jk(e={}){let t=e.typedData||e,n=Number(e.chainId??t?.domain?.chainId),r=t?.message||e.order||e.message;if(!r)throw new Error("cowswap: typed order message required");let o=e.cowGuard?.typedDataHash||su.hash(au(n),Ea,r),i=e.owner||e.from||e.signer||r.receiver;return Vk({digest:o,owner:i,validTo:r.validTo})}async function Xk(e={},t={}){throw new Error("cowswap.cowSignOrder refused: @oracle-agent/oracle is prepare-only. Sign with the user wallet; do not pass private keys here.")}async function Qk(e={},t={}){throw new Error("cowswap.cowSubmitSignedOrder refused: @oracle-agent/oracle is prepare-only. Submit signed orders from the user wallet or local operator.")}function Zk(e={}){let t=Number(e.chainId??1),n=Vn(e.owner||e.from||e.signer,"owner"),r=(e.orderUids||e.uids||[e.uid]).filter(Boolean).map((s,a)=>$h(s,`orderUids[${a}]`));if(!r.length)throw new Error("cowswap: orderUids required");let o=au(t);return me({provider:"cowswap",chainId:t,owner:n,orderUids:r,signingScheme:"eip712",typedData:{domain:o,types:Ph,primaryType:"OrderCancellations",message:{orderUids:r}},cancelReady:!0,executableArtifact:!0},{provider:"cowswap",kind:"cow-cancel"})}async function eO(e={},t={}){throw new Error("cowswap.cowSignCancel refused: @oracle-agent/oracle is prepare-only. Cancel-sign with the user wallet.")}async function tO(e={},t={}){throw new Error("cowswap.cowCancelOrders refused: @oracle-agent/oracle is prepare-only. Cancel from the user wallet or local operator.")}function nO(e={}){return Co(e.buyAmount??e.executedBuyAmount??"0","trade.buyAmount")}async function rO(e={},t={}){let n=Number(e.chainId??1),r=$h(e.uid||e.orderUid),o=t.order||await Uh({chainId:n,uid:r},t),i=t.status||o.status||await Dh({chainId:n,uid:r},t).catch(()=>null),s=t.trades||await R(`${zk(n,"v2",t)}/trades?orderUid=${encodeURIComponent(r)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),a=Array.isArray(s)?s:[],c=e.expectedOwner?Vn(e.expectedOwner,"expectedOwner"):null;if(c&&Vn(o.owner||a[0]?.owner||c,"owner")!==c)return{ok:!1,provider:"cowswap",chainId:n,uid:r,reason:"owner mismatch",order:o,status:i,trades:a};let l=0n;for(let p of a.filter(f=>String(f.orderUid||"").toLowerCase()===r))l+=BigInt(nO(p));l===0n&&o.executedBuyAmount!=null&&(l=BigInt(Co(o.executedBuyAmount,"executedBuyAmount")));let u=e.minBuyAmount!=null?BigInt(Co(e.minBuyAmount,"minBuyAmount")):0n,d=l>=u&&String(o.status||i?.status||"").toLowerCase()!=="expired";return{ok:d,provider:"cowswap",chainId:n,uid:r,status:o.status||i?.status||null,executedBuyAmount:l.toString(),minBuyAmount:e.minBuyAmount??null,trades:a,settlementTxs:[...new Set(a.map(p=>p.txHash).filter(Boolean))],order:o,orderStatus:i,reason:d?null:"insufficient fill or expired order"}}function oO(){return Object.keys(Aa).map(Number)}var Aa,Nh,Ch,iu,Rh,Ea,Ph,va=T(()=>{Y();en();vh();pa();rt();Aa={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"},Nh=Object.freeze({1:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41",100:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41",42161:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41",8453:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41"}),Ch=Object.freeze({1:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110",100:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110",42161:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110",8453:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110"}),iu={1:"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",8453:"0x4200000000000000000000000000000000000006",42161:"0x82aF49447D8a07e3bd95BD0d56f35241523fBab1"},Rh={1:"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",8453:"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",42161:"0xaf88d065e77c8cC2239327C5EDb3A432268e5831"},Ea=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"}]}),Ph=Object.freeze({OrderCancellations:[{name:"orderUids",type:"bytes[]"}]})});function aO(e={}){return(e.baseUrl||process.env.DEFILLAMA_COINS_URL||iO).replace(/\/$/,"")}function cO(e={}){return(e.baseUrl||process.env.DEFILLAMA_API_URL||sO).replace(/\/$/,"")}async function xa(e,t={}){if(!Array.isArray(e)||!e.length)throw new Error("llamaPrices requires coins[]");let n=e.map(encodeURIComponent).join(",");return R(`${aO(t)}/prices/current/${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function qh(e={}){return R(`${cO(e)}/protocols`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??2e4})}var iO,sO,lu=T(()=>{Y();iO="https://coins.llama.fi",sO="https://api.llama.fi"});var Ia={};Q(Ia,{ACROSS_API:()=>Mh,HOP_API:()=>Fh,RELAY_API:()=>jh,acrossHealth:()=>uO,acrossSuggestedFees:()=>Hh,hopHealth:()=>dO,hopQuote:()=>zh,relayHealth:()=>pO,relayPrepare:()=>fO,relayQuote:()=>uu});async function uO(e={}){try{return{ok:!0,estimatedFillTimeSec:(await Hh({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 Hh(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||Mh).replace(/\/$/,"");return R(`${c}/suggested-fees?${a}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function dO(e={}){try{let t=await zh({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 zh(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=Hn({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||Fh).replace(/\/$/,""),u=await R(`${l}/quote?${c}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),d=u?.estimatedRecieved||u?.estimatedReceived;return d?We(u,{chainId:Number(e.originChainId||e.chainId||lO[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 pO(e={}){try{let t=await uu({user:hr,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 uu(e={},t={}){let{user:n=hr,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=Hn({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||jh).replace(/\/$/,""),d=await R(`${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}:We(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 fO(e={},t={}){let n=await uu(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:Nt(n.autoSlippage,{chainId:r,venue:a.to,data:a.data})}));return me({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 Mh,Fh,jh,lO,ka=T(()=>{Y();en();pa();rt();Mh="https://across.to/api",Fh="https://api.hop.exchange/v1",jh="https://api.relay.link",lO={ethereum:1,optimism:10,bsc:56,polygon:137,arbitrum:42161,avalanche:43114,base:8453}});function Oa(e){if(!Array.isArray(e))return null;let t=0,n=!1;for(let r of e){let o=An(r?.amountUSD);o!=null&&(t+=o,n=!0)}return n?t:null}async function Wh(e,t={}){let n=Ym[Number(e)];if(!n)return null;try{let r=await xa([n],t);return An(r?.coins?.[n]?.price)}catch{return null}}async function mO(e={}){try{let t=await qh({...e,baseUrl:e.defillamaApiBaseUrl,timeoutMs:e.defillamaTimeoutMs??Math.min(Number(e.timeoutMs??5e3),5e3)});return Array.isArray(t)?t:[]}catch{return[]}}function hO(e,t={}){let n=yr(t.tool||t.provider||t.bridge||t.protocol),r=[];return e==="lifi"&&n&&n!=="lifi"&&r.push(...Vh[n]||[n]),r.push(...Vh[yr(e)]||[e]),r}function yO(e,t,n={}){let r=Array.isArray(e)?e:[],o=hO(t,n).map(yr).filter(Boolean);for(let i of o){let s=r.find(c=>yr(c?.slug)===i||yr(c?.name)===i),a=An(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=yr(c?.category);return!l.includes("bridge")&&!l.includes("crosschain")?!1:yr(c?.slug).includes(i)||yr(c?.name).includes(i)}),a=An(s?.tvl);if(a!=null)return{liquidityUsd:a,protocol:s?.name??s?.slug??i}}return null}function du({chainId:e,tokenIn:t,tokenOut:n,amountIn:r,taker:o,slippageBps:i,decimalsIn:s,decimalsOut:a,nativePriceUsd:c=null,destDecimalsPromise:l=null,v4PoolKey:u=null,v4PoolId:d=null,v4LiquidityUsd:p=null,opts:f={}}){let m=[];return m.push({source:"lifi",run:async()=>{let h=await Yr({fromChain:e,toChain:e,fromToken:t,toToken:n,fromAmount:r},f),y=h?.estimate??h?.[0]?.estimate;return{amountOut:y?.toAmount,minOut:y?.toAmountMin,gasUsd:Oa(y?.gasCosts),feeUsd:Oa(y?.feeCosts),oracleFeeBps:h?.oracleFee?.applies?h.oracleFee.bps:0,meta:{tool:h?.tool??h?.toolDetails?.name,oracleFee:h?.oracleFee??null}}}}),s!=null&&m.push({source:"paraswap",run:async()=>{let h=a??(await Promise.resolve(l))?.decimals;if(h==null)throw new Error("paraswap needs destination decimals; none supplied or resolvable");let y=await Oo({chainId:e,srcToken:t,destToken:n,amount:r,srcDecimals:s,destDecimals:h},f),g=y?.priceRoute;return{amountOut:g?.destAmount,gasUsd:An(g?.gasCostUSD),oracleFeeBps:y?.oracleFee?.applies?y.oracleFee.bps:0,meta:{bestRoute:g?.bestRoute?.[0]?.swaps?.[0]?.swapExchanges?.[0]?.exchange,oracleFee:y?.oracleFee??null}}}}),process.env.ZEROX_API_KEY&&m.push({source:"0x",run:async()=>{let h=await _o({chainId:e,sellToken:t,buyToken:n,sellAmount:r,taker:o},f),y=null,g=h?.totalNetworkFee,E=await Promise.resolve(c);return g!=null&&E&&(y=Number(g)/1e18*E),{amountOut:h?.buyAmount,minOut:h?.minBuyAmount,gasUsd:y,meta:{source:h?.route?.fills?.[0]?.source}}}}),process.env.ONEINCH_API_KEY&&m.push({source:"1inch",run:async()=>{let h=await Ah({chainId:e,src:t,dst:n,amount:r},f),y=null;return h?.gas!=null&&c&&(y=null),{amountOut:h?.dstAmount,gasUsd:y,meta:{gasUnits:h?.gas}}}}),m.push({source:"cow",run:async()=>{let h=await Jr({chainId:e,sellToken:t,buyToken:n,sellAmountBeforeFee:String(r),from:o},f),y=h?.quote??h,g=y?.feeAmount;return{amountOut:y?.buyAmount,gasUsd:0,meta:{intent:!0,feeAmountInSellToken:g,settlement:"solver-executed"}}}}),Ct[Number(e)]&&m.push({source:"uniswap-v4",run:async()=>{let h=u&&typeof u=="object"?{fee:u.fee,tickSpacing:u.tickSpacing,hooks:u.hooks,poolKey:u,poolId:d,liquidityUsd:p}:{},y=await ca({chainId:e,tokenIn:t,tokenOut:n,amountIn:r,...h},f);return{amountOut:y?.amountOut,minOut:y?.minOut??y?.amountOutMinimum??null,gasUsd:null,liquidityUsd:y?.liquidityUsd??null,meta:{onchain:!0,venue:"uniswap-v4",fee:y?.fee,tickSpacing:y?.tickSpacing,poolId:y?.poolId,hooks:y?.hooks,gasUnits:y?.gasEstimate,quoter:y?.quoter,poolManager:y?.poolManager,prepareReady:y?.prepareReady===!0,executionReady:!1}}}}),ot[Number(e)]&&m.push({source:"uniswap-v3",run:async()=>{let h=await Gr({chainId:e,tokenIn:t,tokenOut:n,amountIn:r},f);return{amountOut:h?.amountOut,minOut:h?.minOut??h?.amountOutMinimum??null,gasUsd:null,liquidityUsd:h?.liquidityUsd??null,meta:{onchain:!0,fee:h?.fee,gasUnits:h?.gasEstimate,quoter:h?.quoter}}}}),m}function Gh({fromChainId:e,toChainId:t,tokenIn:n,tokenOut:r,amountIn:o,taker:i,opts:s={}}){let a=[],c=null,l=async(u,d={})=>(c||=mO(s),yO(await c,u,d));return a.push({source:"lifi",run:async()=>{let u=await Yr({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:An(d?.executionDuration)},f=await l("lifi",p);return{amountOut:d?.toAmount,minOut:d?.toAmountMin,gasUsd:Oa(d?.gasCosts),feeUsd:Oa(d?.feeCosts),oracleFeeBps:u?.oracleFee?.applies?u.oracleFee.bps:0,liquidityUsd:f?.liquidityUsd??null,meta:{...p,liquidityProtocol:f?.protocol,oracleFee:u?.oracleFee??null}}}}),a.push({source:"relay",run:async()=>{let{relayQuote:u}=await Promise.resolve().then(()=>(ka(),Ia)),p=(await u({user:i,originChainId:e,destinationChainId:t,originCurrency:n,destinationCurrency:r,amount:String(o)},s))?.details,f={durationSeconds:An(p?.timeEstimate),rate:p?.rate},m=await l("relay",f);return{amountOut:p?.currencyOut?.amount,minOut:p?.currencyOut?.minimumAmount,gasUsd:An(p?.totalImpact?.usd)!=null?Math.abs(An(p.totalImpact.usd)):null,liquidityUsd:m?.liquidityUsd??null,meta:{...f,liquidityProtocol:m?.protocol}}}}),a.push({source:"across",run:async()=>{let{acrossSuggestedFees:u}=await Promise.resolve().then(()=>(ka(),Ia)),d=await u({token:n,destinationToken:r,originChainId:e,destinationChainId:t,amount:String(o)},s),p=d?.totalRelayFee?.total,f=null;if(p!=null)try{let h=BigInt(String(o))-BigInt(String(p));h>0n&&(f=h.toString())}catch{}let m=await l("across");return{amountOut:f,gasUsd:null,liquidityUsd:m?.liquidityUsd??null,meta:{derivedFromFees:!0,durationSeconds:An(d?.estimatedFillTimeSec),limits:d?.limits?{min:d.limits.minDeposit,max:d.limits.maxDeposit}:void 0,liquidityProtocol:m?.protocol}}}}),a}var An,yr,Vh,Kh=T(()=>{$i();ha();ga();Sh();va();Ri();la();lu();Ql();An=e=>{let t=Number(e);return Number.isFinite(t)?t:null};yr=e=>String(e??"").toLowerCase().replace(/[^a-z0-9]/g,""),Vh=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"]})});var Jh={};Q(Jh,{QUALITY:()=>tn,bestBridgeRoute:()=>Ui,bestSwapRoute:()=>Ro,formatComparisonNote:()=>_a});async function Yh(e,t,n){let r=gO[Number(e)];if(!r)return{priceUsd:null,decimals:null};let o=`${r}:${t}`;try{let s=(await xa([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 Ro(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=Wh(n,t),a=Yh(n,o,t),c=mm(n,t).catch(()=>null),l=du({...e,nativePriceUsd:s,decimalsOut:e.decimalsOut,destDecimalsPromise:a,opts:t}),[u,d,p]=await Promise.all([da(l,{timeoutMs:t.timeoutMs??12e3}),a,c]);s.catch(()=>{});let f=await s.then(y=>y,()=>null),m=Xl(u,{destPriceUsd:d.priceUsd,destDecimals:e.decimalsOut??d.decimals,liquidityBandBps:t.liquidityBandBps??50,gasPriceWei:p,nativePriceUsd:f}),h=t.maxImpactPct===void 0?25:t.maxImpactPct;if(h!=null&&m.best){let y=m.best.source,E=await Jm(async v=>{let S=du({...e,amountIn:v.toString(),nativePriceUsd:s,decimalsOut:e.decimalsOut,destDecimalsPromise:a,opts:t}).filter(k=>k.source===y);return S.length?(await da(S,{timeoutMs:t.timeoutMs??12e3}))?.[0]?.amountOut??null:null},i);if(E){let v=Xm(m,{[y]:E},{maxImpactPct:h});return{kind:"swap",chainId:n,tokenIn:r,tokenOut:o,amountIn:String(i),...v,sourcesTried:l.length,sourcesAnswered:u.filter(S=>S.quality!==tn.FAILED).length,note:_a(v,l.length),priceImpact:{[y]:Number(E.impactPct.toFixed(2))}}}}return{kind:"swap",chainId:n,tokenIn:r,tokenOut:o,amountIn:String(i),...m,sourcesTried:l.length,sourcesAnswered:u.filter(y=>y.quality!==tn.FAILED).length,note:_a(m,l.length)}}async function Ui(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=Yh(r,i,t),c=Gh({...e,opts:t}),[l,u]=await Promise.all([da(c,{timeoutMs:t.timeoutMs??15e3}),a]),d=Xl(l,{destPriceUsd:u.priceUsd,destDecimals:e.decimalsOut??u.decimals,liquidityBandBps:t.liquidityBandBps??50}),p=d.routes.map(f=>({source:f.source,seconds:f.meta?.durationSeconds??null})).filter(f=>f.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(f=>f.quality!==tn.FAILED).length,note:_a(d,c.length)}}function bO(e){let t=e?.meta?.oracleFee;return t?.applies?` \xB7 ${rh(t)}`:""}function _a(e,t){if(!e.best)return"no source returned a usable route";let n=e.routes.length,r=bO(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 gO,Po=T(()=>{Ql();Kh();ma();lu();Qt();gO={1:"ethereum",10:"optimism",56:"bsc",137:"polygon",8453:"base",42161:"arbitrum",43114:"avax"}});var Qh={};Q(Qh,{ARTIFACT:()=>Wn,prepareBestRoute:()=>Xh,supportedPreparers:()=>EO});function EO(){return Object.keys(Ta)}async function Xh(e,t={}){if(vO.some(y=>Object.hasOwn(e,y)))throw new Error("unsupported operation shape is inspect/quote-only");if(e.hookData!=null&&String(e.hookData).toLowerCase()!=="0x")throw new Error("opaque hookData is inspect/quote-only");let{taker:n}=e;if(!n)throw new Error("prepareBestRoute requires taker: a prepared transaction is built FOR an address, and the quote-only placeholder must never end up in one");if(!SO.test(n))throw new Error(`taker must be a valid 20-byte address, got "${n}"`);if(AO.has(n.toLowerCase()))throw new Error(`taker "${n}" is a placeholder/burn address. It is valid for quoting but not for preparing -- that would build a transaction for an address nobody controls. Pass the real wallet that will sign.`);let r=await Ro(e,t);if(!r.best){let y=r.impactRejected??[];return{ok:!1,reason:y.length?y[0].reason:"no source returned a usable route",priceImpactBlocked:y.length>0,impactRejected:y,comparison:r}}let o=e.source||r.best.source,i=r.routes.find(y=>y.source===o);if(!i)return{ok:!1,reason:`source "${o}" did not return a usable route`,comparison:r};let s=Ta[o];if(!s){let y=r.routes.find(g=>Ta[g.source]&&g.source!==o);return{ok:!1,reason:`${o} won the comparison but has no prepare path in this build. `+(y?`Next preparable route is ${y.source}; pass source:"${y.source}" to use it.`:"No route in this comparison can be prepared."),comparison:r,winner:o}}let a;try{a=await s(e,t)}catch(y){let g=typeof y?.body=="string"?y.body:y?.body?JSON.stringify(y.body):"",E=[String(y?.message||y),g].filter(Boolean).join(" :: "),v=/allowance/i.test(E),S=!v&&/not enough|insufficient|balance/i.test(E),I,k;v?(k="approval-required-first",I=`${o} will not build swap calldata until the token approval exists on-chain. Approve the spender first, then prepare again. Underlying: ${E}`):S?(k="taker-not-funded",I=`${o} refused to build the transaction: ${E}. This venue verifies the taker holds the input token. Quoting works for any address; preparing needs the real funded wallet.`):(k="provider-error",I=`${o} prepare failed: ${E}`);let A=r.routes.find(w=>Ta[w.source]&&w.source!==o);return{ok:!1,reason:I,failureKind:k,...A?{alternative:A.source}:{},comparison:r}}let c=e.driftToleranceBps??wO,l=null,u=null;if(a.amountOut!=null&&i.grossOut!=null)try{let y=BigInt(i.grossOut),g=BigInt(a.amountOut);y>0n&&(l=Number((g-y)*10000n/y),l<-c&&(u=`route moved ${(l/100).toFixed(2)}% against you between the comparison and this prepare (tolerance ${(c/100).toFixed(2)}%). The ranking may no longer hold -- re-run the comparison before signing.`))}catch{}let d=r.routes.filter(y=>y.source!==o).map(y=>({source:y.source,netOut:y.netOut,gasUsd:y.gasUsd})),f=r.routes.map(y=>({source:y.source,liquidityUsd:y.liquidityUsd??null})).reduce((y,g)=>Math.max(y,g.liquidityUsd??0),0)||null,m=i.liquidityUsd??null,h=m!=null&&f>0?Math.round(m/f*100):null;return me({ok:!0,chosen:{source:o,wasWinner:o===r.best.source,netOut:i.netOut,grossOut:i.grossOut,gasUsd:i.gasUsd,liquidityUsd:i.liquidityUsd??null},liquidity:{chosenUsd:m,maxUsd:f,sharePct:h},priceImpact:r.priceImpact??null,impactUnmeasured:r.impactUnmeasured??[],...a,unsigned:!0,signedBy:"user-wallet",destination:a.artifactKind===Wn.TRANSACTION?a.transaction?.to??null:a.settlement??null,driftBps:l,warnings:[...u?[u]:[],...r.warnings||[],...a.artifactKind===Wn.TYPED_DATA_ORDER?["This is an ORDER to sign, not a transaction to broadcast. Signing it authorizes a solver to settle on your behalf."]:[]],runnersUp:d,comparison:{rankedOn:r.rankedOn,sourcesAnswered:r.sourcesAnswered,sourcesTried:r.sourcesTried,improvementBps:r.improvementBps},note:"UNSIGNED. Verify the destination address and minOut against a fresh quote immediately before signing -- a quote-time minimum is not a minimum at broadcast time."},{provider:"router",kind:"best-route"})}var Wn,wO,Ta,AO,SO,vO,pu=T(()=>{Po();rt();Wn=Object.freeze({TRANSACTION:"unsigned-transaction",TYPED_DATA_ORDER:"typed-data-order"}),wO=100,Ta={"uniswap-v3":async({chainId:e,tokenIn:t,tokenOut:n,amountIn:r,taker:o},i)=>{let{uniV3PrepareExactIn:s}=await Promise.resolve().then(()=>(Ri(),Mm)),a=await s({chainId:e,tokenIn:t,tokenOut:n,amountIn:r,recipient:o},i);return{artifactKind:Wn.TRANSACTION,transaction:a.transaction,requiresApproval:a.requiresApproval??null,amountOut:a.quote?.amountOut??null,minOut:a.quote?.amountOutMinimum??null}},"uniswap-v4":async({chainId:e,tokenIn:t,tokenOut:n,amountIn:r,taker:o,slippageBps:i,deadlineSeconds:s,fee:a,tickSpacing:c,hooks:l},u)=>{let{uniV4PrepareExactIn:d}=await Promise.resolve().then(()=>(la(),zm)),p=await d({chainId:e,tokenIn:t,tokenOut:n,amountIn:r,recipient:o,slippageBps:i,deadlineSeconds:s,fee:a,tickSpacing:c,hooks:l},u);return{artifactKind:Wn.TRANSACTION,transaction:p.transaction,requiresApproval:p.requiresApproval,amountOut:p.quote?.amountOut??null,minOut:p.quote?.amountOutMinimum??null,prepareReady:!0,executionReady:!1}},lifi:async({chainId:e,tokenIn:t,tokenOut:n,amountIn:r,taker:o},i)=>{let{lifiPrepare:s}=await Promise.resolve().then(()=>($i(),ru)),a=await s({fromChain:e,toChain:e,fromToken:t,toToken:n,fromAmount:r,fromAddress:o},i);return{artifactKind:Wn.TRANSACTION,transaction:a.transaction,requiresApproval:a.requiresApproval??null,amountOut:a.quote?.estimate?.toAmount??null,minOut:a.quote?.estimate?.toAmountMin??null}},paraswap:async({chainId:e,tokenIn:t,tokenOut:n,amountIn:r,taker:o,decimalsIn:i,decimalsOut:s},a)=>{let{paraswapPrepare:c}=await Promise.resolve().then(()=>(ha(),uh)),l=await c({chainId:e,srcToken:t,destToken:n,amount:r,srcDecimals:i,destDecimals:s,userAddress:o,side:"SELL"},a);return{artifactKind:Wn.TRANSACTION,transaction:l.transaction,requiresApproval:l.requiresApproval??null,amountOut:l.quote?.priceRoute?.destAmount??null,minOut:l.quote?.amountOutMinimum??null}},"0x":async({chainId:e,tokenIn:t,tokenOut:n,amountIn:r,taker:o},i)=>{let{zeroxPrepare:s}=await Promise.resolve().then(()=>(ga(),bh)),a=await s({chainId:e,sellToken:t,buyToken:n,sellAmount:r,taker:o},i);return{artifactKind:Wn.TRANSACTION,transaction:a.transaction,requiresApproval:a.requiresApproval??null,amountOut:a.quote?.buyAmount??null,minOut:a.quote?.minBuyAmount??null}},cow:async({chainId:e,tokenIn:t,tokenOut:n,amountIn:r,taker:o},i)=>{let{cowPrepareOrder:s}=await Promise.resolve().then(()=>(va(),Bh)),a=await s({chainId:e,sellToken:t,buyToken:n,sellAmountBeforeFee:String(r),from:o},i);return{artifactKind:Wn.TYPED_DATA_ORDER,typedData:a.typedData,requiresApproval:{token:t,spender:a.vaultRelayer,amount:String(r),note:"CoW pulls funds via the vault relayer, not the settlement contract"},settlement:a.settlement,amountOut:a.quote?.quote?.buyAmount??null,minOut:null,submission:"sign the typed data, then submit the order to the CoW API"}}};AO=new Set(["0x0000000000000000000000000000000000000000","0x000000000000000000000000000000000000dead","0x0000000000000000000000000000000000000001","0x00000000000000000000000000000000000a1ce5"].map(e=>e.toLowerCase())),SO=/^0x[0-9a-fA-F]{40}$/,vO=Object.freeze(["operation","exactOutput","amountOut","multihop","path","positionManager","modifyLiquidities","commands","actions"])});function OO(e,t){return`0x${mu.getAmountsOut}`+Vt(e)+Vt(64)+Vt(t.length)+t.map(Bi).join("")}function _O(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 fu(e,t="router"){return(e?.venues||[]).find(r=>r.kind===t)?.address??null}function TO(e,t){let n=Number(t);if(!Number.isFinite(n)||n<0)throw new Error("slippageBps must be a non-negative number");if(n>hu)throw new Error(`slippageBps ${n} exceeds the ${hu} 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 ny(e){let{chainId:t,wrappedNative:n}=e;async function r(o,i,s,a){let c=await de(t,"eth_call",[{to:o,data:OO(i,s)},"latest"],a);return _O(c?.result??c)}return{async quote({tokenIn:o,tokenOut:i,amountIn:s,path:a},c={}){let l=fu(c.scanner);if(!l)return{chainId:t,evidence:J.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:J.LIVE,note:"exact-input quote at current reserves; not a guaranteed fill"}:{chainId:t,router:l,path:u,evidence:J.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=fu(a.scanner),l=s||n;if(l&&String(o).toLowerCase()===String(l).toLowerCase())return{chainId:t,token:o,verdict:G.UNKNOWN,evidence:J.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:G.UNKNOWN,evidence:J.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:G.FAIL,evidence:J.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:G.FAIL,evidence:J.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:G.FAIL,evidence:J.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 f=p[p.length-1],m=Number(f*10000n/BigInt(i)),h=G.PASS,y="round trip completes with expected fee/impact loss";return m<5e3?(h=G.FAIL,y=`round trip returns only ${(m/100).toFixed(2)}% -- punitive tax or no real liquidity`):m<9e3&&(h=G.CAUTION,y=`round trip returns ${(m/100).toFixed(2)}% -- transfer tax or thin liquidity at this size`),{chainId:t,token:o,base:l,router:c,verdict:h,reason:y,amountIn:String(i),bought:d.toString(),returned:f.toString(),retentionBps:m,evidence:J.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,f=fu(p);if(!f)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 m=u||[o,i],h=await this.quote({tokenIn:o,tokenOut:i,amountIn:s,path:m},d);if(h.evidence!==J.LIVE)throw new Error(`cannot prepare without a live quote (${h.evidence}: ${h.reason??"no reason given"})`);let y=TO(h.amountOut,c);if(y<=0n)throw new Error("computed minOut is zero -- refusing to prepare");let g=BigInt(Math.floor(Date.now()/1e3)+Number(l)),E=n&&m[0].toLowerCase()===n.toLowerCase()&&d.useNative,v=E?`0x${mu.swapExactETHForTokens}`+Vt(y)+Vt(128)+Bi(a)+Vt(g)+Vt(m.length)+m.map(Bi).join(""):`0x${mu.swapExactTokensForTokens}`+Vt(s)+Vt(y)+Vt(160)+Bi(a)+Vt(g)+Vt(m.length)+m.map(Bi).join("");return{unsigned:!0,signedBy:"user-wallet",chainId:t,tx:{to:f,data:v,value:E?`0x${BigInt(s).toString(16)}`:"0x0"},guard:{quotedOut:h.amountOut,minOut:y.toString(),slippageBps:c,maxSlippageBps:hu,deadline:g.toString()},requires:E?[]:[{step:"approve",token:m[0],spender:f,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 mu,Vt,Bi,hu,ry=T(()=>{Qt();mr();mu={getAmountsOut:"d06ca61f",swapExactTokensForTokens:"38ed1739",swapExactETHForTokens:"7ff36ab5"},Vt=e=>BigInt(e).toString(16).padStart(64,"0"),Bi=e=>e.slice(2).toLowerCase().padStart(64,"0");hu=100});function CO(e,t){let n=Number(t);if(!Number.isFinite(n)||n<0)throw new Error("slippageBps must be a non-negative number");if(n>gu)throw new Error(`slippageBps ${n} exceeds the ${gu} 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 yu(e,t){return(e?.venues||[]).find(n=>n.kind===t)?.address??null}function sy(e){let{chainId:t,wrappedNative:n}=e;async function r({quoter:i,tokenIn:s,tokenOut:a,amountIn:c,fee:l},u){let d=`0x${oy.quoteExactInputSingle}`+qi(s)+qi(a)+Xr(c)+Xr(l)+Xr(0),p=await de(t,"eth_call",[{to:i,data:d},"latest"],u).catch(()=>null),f=p?.result??p;if(!f||f==="0x"||f.length<66)return null;let m=BigInt(`0x${f.slice(2,66)}`);return m>0n?m:null}async function o({quoter:i,tokenIn:s,tokenOut:a,amountIn:c},l){let u=await Promise.all(NO.map(async p=>{let f=await r({quoter:i,tokenIn:s,tokenOut:a,amountIn:c,fee:p},l);return{fee:p,amountOut:f?f.toString():null,out:f}})),d=null;for(let p of u)p.out&&(!d||p.out>d.amountOut)&&(d={fee:p.fee,amountOut:p.out});return{best:d,tried:u.map(({fee:p,amountOut:f})=>({fee:p,amountOut:f}))}}return{async quote({tokenIn:i,tokenOut:s,amountIn:a},c={}){let l=yu(c.scanner,"quoter");if(!l)return{chainId:t,evidence:J.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(!iy.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,useNative:!!n&&String(i).toLowerCase()===String(n).toLowerCase(),triedFeeTiers:d,evidence:J.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:J.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=yu(c.scanner,"quoter"),u=(e.stableQuoteAssets||[]).map(I=>String(I).toLowerCase()),d=null;!a&&typeof e.resolveQuoteAsset=="function"&&(d=await e.resolveQuoteAsset(i,c).catch(()=>null));let p=String(i).toLowerCase(),f=String(n||"").toLowerCase();if(f&&p===f)return{chainId:t,token:i,verdict:G.UNKNOWN,evidence:J.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."};let m=a||d||(u[0]&&p!==u[0]?u[0]:null)||n;if(m&&p===String(m).toLowerCase())return{chainId:t,token:i,verdict:G.UNKNOWN,evidence:J.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||!m)return{chainId:t,token:i,verdict:G.UNKNOWN,evidence:J.UNAVAILABLE,reason:l?"no wrappedNative configured, so there is no base asset to round-trip against":"no verified quoter configured for this chain"};let h=await o({quoter:l,tokenIn:m,tokenOut:i,amountIn:s},c);if(!h.best){let I=u.find(k=>k&&k!==String(m).toLowerCase()&&k!==String(i).toLowerCase());if(I){let k=await o({quoter:l,tokenIn:I,tokenOut:i,amountIn:s},c);if(k.best){let A=await o({quoter:l,tokenIn:i,tokenOut:I,amountIn:k.best.amountOut},c);if(A.best){let w=A.best.amountOut,b=Number(w*10000n/BigInt(s)),x=G.PASS,C="round trip vs dollar book completes with expected fee/impact loss";return b<5e3?(x=G.FAIL,C=`round trip vs dollar book returns only ${(b/100).toFixed(2)}% -- punitive tax or no real liquidity`):b<9e3&&(x=G.CAUTION,C=`round trip vs dollar book returns ${(b/100).toFixed(2)}% -- transfer tax or thin liquidity at this size`),{chainId:t,venue:"uniswap-v3",token:i,base:I,quoteAsset:I,verdict:x,reason:C,amountIn:String(s),bought:k.best.amountOut.toString(),returned:w.toString(),retentionBps:b,buyFee:k.best.fee,sellFee:A.best.fee,evidence:J.LIVE,note:"Quoted against the dollar book, not wrapped native. A missing WETH pool is not a honeypot."}}}}return{chainId:t,token:i,verdict:G.FAIL,evidence:J.LIVE,leg:"buy",reason:"no V3 pool priced the buy leg on any fee tier against wrapped native or the dollar book"}}let y=await o({quoter:l,tokenIn:i,tokenOut:m,amountIn:h.best.amountOut},c);if(!y.best){let I=u.find(k=>k&&k!==String(m).toLowerCase()&&k!==String(i).toLowerCase());if(I){let k=await o({quoter:l,tokenIn:I,tokenOut:i,amountIn:s},c),A=k.best?await o({quoter:l,tokenIn:i,tokenOut:I,amountIn:k.best.amountOut},c):{best:null};if(k.best&&A.best){let w=A.best.amountOut,b=Number(w*10000n/BigInt(s)),x=G.PASS,C="round trip vs dollar book completes; missing WETH sell pool is not a honeypot";return b<5e3?(x=G.FAIL,C=`dollar-book round trip returns only ${(b/100).toFixed(2)}%`):b<9e3&&(x=G.CAUTION,C=`dollar-book round trip returns ${(b/100).toFixed(2)}%`),{chainId:t,venue:"uniswap-v3",token:i,base:I,quoteAsset:I,verdict:x,reason:C,amountIn:String(s),bought:k.best.amountOut.toString(),returned:w.toString(),retentionBps:b,buyFee:k.best.fee,sellFee:A.best.fee,evidence:J.LIVE,note:"Sell vs wrapped native failed; dollar book succeeded. Not labelled honeypot."}}}return{chainId:t,token:i,verdict:G.FAIL,evidence:J.LIVE,leg:"sell",bought:h.best.amountOut.toString(),reason:"SELL LEG FAILED against wrapped native and the dollar book. This is the honeypot signature: do not trade."}}let g=y.best.amountOut,E=Number(g*10000n/BigInt(s)),v=G.PASS,S="round trip completes with expected fee/impact loss";return E<5e3?(v=G.FAIL,S=`round trip returns only ${(E/100).toFixed(2)}% -- punitive tax or no real liquidity`):E<9e3&&(v=G.CAUTION,S=`round trip returns ${(E/100).toFixed(2)}% -- transfer tax or thin liquidity at this size`),{chainId:t,venue:"uniswap-v3",token:i,base:m,verdict:v,reason:S,amountIn:String(s),bought:h.best.amountOut.toString(),returned:g.toString(),retentionBps:E,buyFee:h.best.fee,sellFee:y.best.fee,evidence:J.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=yu(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(!iy.test(c||""))throw new Error("prepareUnsignedTx requires a valid recipient address");let f=await this.quote({tokenIn:i,tokenOut:s,amountIn:a},d);if(f.evidence!==J.LIVE)throw new Error(`cannot prepare without a live quote (${f.evidence}: ${f.reason??"no reason given"})`);let m=u??f.fee,h=CO(f.amountOut,l);if(h<=0n)throw new Error("computed minOut is zero -- refusing to prepare");let y=!!(d.useNative||f.useNative)&&n&&String(i).toLowerCase()===String(n).toLowerCase(),g=`0x${oy.exactInputSingle}`+qi(i)+qi(s)+Xr(m)+qi(c)+Xr(a)+Xr(h)+Xr(0);return{unsigned:!0,signedBy:"user-wallet",chainId:t,venue:"uniswap-v3",tx:{to:p,data:g,value:y?String(a):"0x0"},guard:{quotedOut:f.amountOut,minOut:h.toString(),slippageBps:l,maxSlippageBps:gu,fee:m},requires:y?[]:[{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 NO,oy,Xr,qi,iy,gu,ay=T(()=>{Qt();mr();NO=[100,500,3e3,1e4],oy={quoteExactInputSingle:"c6a5026a",exactInputSingle:"04e45aaf"},Xr=e=>BigInt(e).toString(16).padStart(64,"0"),qi=e=>e.slice(2).toLowerCase().padStart(64,"0"),iy=/^0x[0-9a-fA-F]{40}$/,gu=100});function cy(e){if(!e||e==="0x")return null;try{return BigInt(e)}catch{return null}}function ly(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 RO(e){let{chainId:t}=e;async function n(r,o,i){return de(t,"eth_call",[{to:r,data:o},"latest"],i)}return{async blockNumber(r={}){let o=await Qs(t,r);return{chainId:t,blockNumber:o?.blockNumber??o,evidence:J.LIVE}},async nativeBalance(r,o={}){let i=await hm(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:J.LIVE}},async tokenBalance({token:r,owner:o},i={}){let s=await gm({chainId:t,token:r,owner:o},i);return{chainId:t,token:r,owner:o,raw:s?.balance??s,evidence:J.LIVE}},async resolveToken(r,o={}){if(!/^0x[0-9a-fA-F]{40}$/.test(r||""))return{chainId:t,token:r,evidence:J.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,Ca.decimals,o).catch(()=>null),n(r,Ca.symbol,o).catch(()=>null),n(r,Ca.name,o).catch(()=>null),n(r,Ca.totalSupply,o).catch(()=>null)]),l=cy(i?.result??i),u=l!==null||s?.result||a?.result,d={chainId:t,address:r,decimals:l===null?null:Number(l),symbol:ly(s?.result??s),name:ly(a?.result??a),totalSupply:(cy(c?.result??c)??null)?.toString()??null,evidence:u?J.LIVE:J.UNKNOWN};return u||(d.warning="no ERC-20 metadata returned -- may not be a token contract"),d},async resolvePools(r,o={}){let i=e.dexscreenerSlug;if(!i)return{chainId:t,token:r,pools:[],evidence:J.UNAVAILABLE,reason:"no dexscreenerSlug configured for this chain; pool discovery is unavailable rather than guessed"};let s=await ea(r,o).catch(()=>null),c=(s?.pairs||s?.data?.pairs||[]).filter(u=>String(u.chainId).toLowerCase()===String(i).toLowerCase()).map(u=>({pair:u.pairAddress,dex:u.dexId,base:u.baseToken?.address,quote:u.quoteToken?.address,liquidityUsd:u.liquidity?.usd??null,priceUsd:u.priceUsd??null,volume24hUsd:u.volume?.h24??null,createdAt:u.pairCreatedAt??null})).sort((u,d)=>(d.liquidityUsd??0)-(u.liquidityUsd??0)),l=Zs(r,c,{stables:e.stableQuoteAssets||[],wrappedNative:e.wrappedNative});return{chainId:t,token:r,pools:l,topPool:l[0]||null,quoteAsset:wm(r,l),evidence:l.length?J.LIVE:J.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 p=r;p<=o;p+=a){let f=Math.min(p+a-1,o);u.push([p,f])}let d=await Wr(u,4,async([p,f])=>{let m={fromBlock:`0x${p.toString(16)}`,toBlock:`0x${f.toString(16)}`};i&&(m.address=i),s&&(m.topics=s);let h=await de(t,"eth_getLogs",[m],c).catch(y=>({error:String(y?.message||y)}));return{start:p,end:f,res:h}});for(let{start:p,end:f,res:m}of d){if(m?.error)return{chainId:t,fromBlock:r,toBlock:o,logs:l,complete:!1,failedAt:[p,f],error:m.error,evidence:J.UNKNOWN};for(let h of m?.result??m??[])l.push(h)}return{chainId:t,fromBlock:r,toBlock:o,logs:l,complete:!0,chunks:u.length,evidence:J.LIVE}},async scoreRisk(r,o={}){let i=[],s=G.PASS,a=u=>{let d={[G.PASS]:0,[G.CAUTION]:1,[G.UNKNOWN]:2,[G.FAIL]:3};d[u]>d[s]&&(s=u)},[c,l]=await Promise.all([this.resolveToken(r,o),this.resolvePools(r,o)]);if(c.evidence!==J.LIVE?(i.push({check:"erc20-metadata",result:G.UNKNOWN,detail:c.warning}),a(G.UNKNOWN)):i.push({check:"erc20-metadata",result:G.PASS,detail:`${c.symbol} / ${c.decimals}d`}),l.evidence===J.UNAVAILABLE)i.push({check:"liquidity",result:G.UNKNOWN,detail:l.reason}),a(G.UNKNOWN);else if(!l.pools.length)i.push({check:"liquidity",result:G.FAIL,detail:"no pool with liquidity found"}),a(G.FAIL);else{let u=l.pools[0],d=u.liquidityUsd??0;d<5e3?(i.push({check:"liquidity",result:G.CAUTION,detail:`top pool only $${d}`}),a(G.CAUTION)):i.push({check:"liquidity",result:G.PASS,detail:`$${d} on ${u.dex}`}),u.createdAt&&Date.now()-u.createdAt<24*3600*1e3&&(i.push({check:"age",result:G.CAUTION,detail:"pool under 24h old"}),a(G.CAUTION))}if(typeof this.sellSimulation=="function"){let u=await this.sellSimulation({token:r,amountIn:(10n**16n).toString()},o).catch(d=>({verdict:G.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:G.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(G.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 bu(e){let n={...RO(e)},r=new Set((e.venues||[]).map(i=>i.kind));e.venueKind==="uniswap-v3"&&r.has("quoter")&&r.has("router")?Object.assign(n,sy({chainId:e.chainId,wrappedNative:e.wrappedNative,stableQuoteAssets:e.stableQuoteAssets||[],resolveQuoteAsset:async(i,s)=>(await n.resolvePools(i,s)).quoteAsset||null})):e.venueKind==="uniswap-v2"&&r.has("router")&&Object.assign(n,ny({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 Ca,uy=T(()=>{Qt();Ni();Y();mr();ry();ay();Ul();Ca={decimals:"0x313ce567",symbol:"0x95d89b41",name:"0x06fdde03",totalSupply:"0x18160ddd",owner:"0x8da5cb5b"}});function Ra(){return gr.map(e=>ua(bu(e)))}function dy(e){return ua(bu(e))}var gr,Mi=T(()=>{uy();mr();gr=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",stableQuoteAssets:["0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48","0xdAC17F958D2ee523a2206206994597C13D831ec7"],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",stableQuoteAssets:["0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85","0x94b008aA00579c1307B0EF2c499aD98a8ce58e58"],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",stableQuoteAssets:["0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d","0x55d398326f99059fF775485246999027B3197955"],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",stableQuoteAssets:["0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359","0xc2132D05D31c914a87C6611C10748AEb04B58e8F"],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",stableQuoteAssets:["0x5fc5360d0400a0fd4f2af552add042d716f1d168"],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",stableQuoteAssets:["0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"],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",stableQuoteAssets:["0xaf88d065e77c8cC2239327C5EDb3A432268e5831","0xFd086bC7CD5C481DCC9C85ebE478A1C0b69FCbb9"],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",stableQuoteAssets:["0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E"],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}}]}])});import{types as Uo}from"node:util";function St(e){if(!e||typeof e!="object"||Uo.isProxy(e)||Array.isArray(e))return!1;let t=Object.getPrototypeOf(e);return t===Object.prototype||t===null}function ft(e,t){if(e==null||(typeof e=="object"||typeof e=="function")&&Uo.isProxy(e)||!Object.hasOwn(Object(e),t))return;let n=Object.getOwnPropertyDescriptor(Object(e),t);return n&&Object.hasOwn(n,"value")?n.value:void 0}function Gn(e,t,n="provider response",r=null,o=0){if(typeof t!="string"||t.length===0)return e;if(o>64)throw new Error(`${n} exceeds the credential guard nesting bound`);let i=r??{nodes:0,active:new Set};if(i.nodes+=1,i.nodes>2e5)throw new Error(`${n} exceeds the credential guard node bound`);if(e==null)return e;if(["string","number","boolean"].includes(typeof e)){if(String(e).includes(t))throw new Error(`${n} reflected an attached credential`);return e}if(!e||typeof e!="object"||Uo.isProxy(e)||i.active.has(e))throw new Error(`${n} is not credential-guardable own-data JSON`);i.active.add(e);try{if(Array.isArray(e)){for(let s=0;s<e.length;s+=1){let a=Object.getOwnPropertyDescriptor(e,String(s));if(!a||!Object.hasOwn(a,"value"))throw new Error(`${n} is not credential-guardable own-data JSON`);Gn(a.value,t,n,i,o+1)}return e}if(!St(e))throw new Error(`${n} is not credential-guardable own-data JSON`);for(let s of Object.keys(e)){if(s.includes(t))throw new Error(`${n} reflected an attached credential`);let a=Object.getOwnPropertyDescriptor(e,s);if(!a||!Object.hasOwn(a,"value"))throw new Error(`${n} is not credential-guardable own-data JSON`);Gn(a.value,t,n,i,o+1)}return e}finally{i.active.delete(e)}}function Te(e,t="provider response",n=0){if(n>64)throw new Error(`${t} exceeds the JSON nesting bound`);if(e===null||typeof e=="string"||typeof e=="boolean"||typeof e=="number"&&Number.isFinite(e))return e;if(Array.isArray(e)){if(Uo.isProxy(e)||e.length>1e5)throw new Error(`${t} contains an invalid array`);let o=new Array(e.length);for(let i=0;i<e.length;i+=1){let s=Object.getOwnPropertyDescriptor(e,String(i));if(!s||!Object.hasOwn(s,"value"))throw new Error(`${t} arrays must contain dense own data`);o[i]=Te(s.value,t,n+1)}return o}if(!St(e))throw new Error(`${t} contains a non-JSON value`);let r=Object.create(null);for(let o of Object.keys(e)){let i=Object.getOwnPropertyDescriptor(e,o);if(!i||!Object.hasOwn(i,"value"))throw new Error(`${t} objects must contain own data`);r[o]=Te(i.value,t,n+1)}return r}function Bo(e,t){let n=t&&typeof t=="object"&&!Uo.isProxy(t)?t:null,r=n?Object.getOwnPropertyDescriptor(n,"status"):null,o=r&&Object.hasOwn(r,"value")&&Number.isInteger(r.value)&&r.value>=400&&r.value<=599?r.value:null,i=a=>{if(!n)return;let c=Object.getOwnPropertyDescriptor(n,a);return c&&Object.hasOwn(c,"value")?c.value:void 0},s=i("oversize")===!0?"provider-response-too-large":i("oracleTimeout")===!0||i("name")==="AbortError"||i("name")==="TimeoutError"?"provider-timeout":null;return(o!==null||s!==null)&&Object.defineProperty(e,My,{value:Object.freeze({status:o,code:s}),enumerable:!1,configurable:!1,writable:!1}),e}function Fy(e){if(!e||typeof e!="object"||Uo.isProxy(e))return null;let t=Object.getOwnPropertyDescriptor(e,My);if(!t||!Object.hasOwn(t,"value")||!t.value||typeof t.value!="object")return null;let n=Number.isInteger(t.value.status)&&t.value.status>=400&&t.value.status<=599?t.value.status:null,r=D_.has(t.value.code)?t.value.code:null;return n===null&&r===null?null:Object.freeze({status:n,code:r})}var My,D_,sn=T(()=>{My=Symbol("oracle.provider-failure-metadata"),D_=new Set(["provider-response-too-large","provider-timeout"])});function FT({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"?Ku:Gu}async function Mo(e,t={}){if(!e||!e.type)throw new Error("hlInfo requires body.type");let n=FT(t);return Te(await R(n,{method:"POST",body:e,fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs,maxResponseBytes:t.maxResponseBytes,sameOriginRedirectsOnly:t.sameOriginRedirectsOnly}),"hyperliquid info response")}async function fg(e={}){return Mo({type:"allMids"},e)}async function mg(e,t={}){if(!e)throw new Error("hlUserFills requires user address");return Mo({type:"userFills",user:e},t)}async function hg(e={}){return Mo({type:"meta"},e)}async function yg(e={}){let t={type:"metaAndAssetCtxs"};return e.dex&&(t.dex=e.dex),Mo(t,e)}async function gg({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 Mo(i,o)}async function bg({coin:e,startTime:t,endTime:n},r={}){if(!e)throw new Error("hlFundingHistory requires coin");return Mo({type:"fundingHistory",coin:String(e),startTime:t??Date.now()-24*3600*1e3,endTime:n??Date.now()},r)}var Gu,Ku,Yi=T(()=>{Y();sn();Gu="https://api.hyperliquid.xyz/info",Ku="https://api.hyperliquid-testnet.xyz/info"});import{createHash as qC}from"node:crypto";function In(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function Xo(e){return typeof e=="number"&&Number.isFinite(e)}function $d(e){if(e==null||typeof e!="object"||Object.isFrozen(e))return e;if(Array.isArray(e)){for(let t of e)$d(t);return Object.freeze(e)}for(let t of Object.keys(e))$d(e[t]);return Object.freeze(e)}function io(e){if(Array.isArray(e))return e.map(io);if(e!=null&&typeof e=="object"){let t={};for(let n of Object.keys(e).sort())t[n]=io(e[n]);return t}return e}function Pd(e){return{netPnlUsd:e.metrics.netPnlUsd,netPnlPct:e.metrics.netPnlPct,maxDrawdownPct:e.metrics.maxDrawdownPct,winRate:e.metrics.winRate,profitFactor:e.metrics.profitFactor,tradeCount:e.metrics.tradeCount,sharpe:e.metrics.sharpe,turnoverUsd:e.metrics.turnoverUsd,exposurePct:e.metrics.exposurePct}}function Vb(e){return{feesUsd:e.costs.feesUsd,builderFeesUsd:e.costs.builderFeesUsd,fundingUsd:e.costs.fundingUsd,slippageUsd:e.costs.slippageUsd}}function FC(e){return(e.feesUsd||0)+(e.builderFeesUsd||0)+Math.max(0,e.fundingUsd||0)+(e.slippageUsd||0)}function jC(e){let t=0;for(let n of e.trades)n.grossPnlUsd>0&&(t+=n.grossPnlUsd);return t}function HC(e,t,n){return!(!e||e.tradeCount<Math.max(1,Math.min(n,3))||!(e.netPnlUsd>0)||!(e.profitFactor>1)||!(e.maxDrawdownPct<=t.maxDailyLossPct))}function Gb(e){if(!In(e))throw new TypeError("evidence artifact must be a plain object");if(!MC.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(!In(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(!In(e.walkForward)||!Array.isArray(e.walkForward.windows))throw new TypeError("evidence artifact walkForward windows required");if(e.status==="pass_live_eligible"&&(!In(e.train)||!In(e.holdout)))throw new TypeError("live-eligible evidence artifact requires train and holdout facts");return io({barsHash:e.barsHash,compilerHash:e.compilerHash,flags:e.flags.map(t=>io(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 Kb(e){return qC("sha256").update(JSON.stringify(Gb(e)),"utf8").digest("hex")}function un(e,t,n=0){if(!Number.isInteger(e)||e<n)throw new Error(`${t} must be an integer >= ${n}`);return e}function Ld(e,t){if(!In(e)||!In(e.metrics))throw new Error(`${t} metrics required`);let n=un(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(!Xo(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 zC(e,{maxDailyLossPct:t}={}){let n=e.split,r=un(n.trainStartIndex,"split.trainStartIndex"),o=un(n.trainEndIndex,"split.trainEndIndex"),i=un(n.trainBarCount,"split.trainBarCount",1),s=un(n.holdoutStartIndex,"split.holdoutStartIndex"),a=un(n.holdoutEndIndex,"split.holdoutEndIndex"),c=un(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(!Xo(n.trainFraction)||n.trainFraction<=0||n.trainFraction>=1)throw new Error("split.trainFraction must be in (0,1)");Ld(e.train,"train");let l=Ld(e.holdout,"holdout");if(l.tradeCount<1||l.netPnlUsd<=0||l.profitFactor<=1)throw new Error("live-eligible holdout metrics do not pass");if(Xo(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,f=-1;for(let h=0;h<d.length;h++){let y=d[h];if(!In(y)||y.index!==h||typeof y.passed!="boolean")throw new Error("walk-forward windows must be ordered and structurally valid");let g=un(y.trainStartIndex,`walkForward.windows[${h}].trainStartIndex`),E=un(y.trainEndIndex,`walkForward.windows[${h}].trainEndIndex`),v=un(y.evalStartIndex,`walkForward.windows[${h}].evalStartIndex`),S=un(y.evalEndIndex,`walkForward.windows[${h}].evalEndIndex`);if(g!==0||E>=v||v>S||v<=f)throw new Error("walk-forward windows must be chronological and disjoint");if(f=S,y.passed){if(p+=1,y.reason!=="pass")throw new Error("passed walk-forward window reason must be pass");let I=Ld({metrics:y.metrics,tradeCount:y.metrics?.tradeCount},`walkForward.windows[${h}]`);if(I.tradeCount<1||I.netPnlUsd<=0||I.profitFactor<=1)throw new Error("passed walk-forward window metrics do not pass");if(Xo(t)&&I.maxDrawdownPct>t)throw new Error("passed walk-forward drawdown exceeds strategy risk")}else if(y.reason==="pass")throw new Error("failed walk-forward window cannot have pass reason")}let m=p/d.length;if(!Xo(u.passRate)||Math.abs(u.passRate-m)>Number.EPSILON||m<.6)throw new Error("walk-forward passRate contradicts concrete windows or is below live threshold")}function Yb(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=Gb(e),r=io({id:e.id,...n});if(JSON.stringify(io(e))!==JSON.stringify(r))throw new Error("evidence artifact contains fields unbound from its deterministic identity");let o=Kb(e);if(e.id!==o)throw new Error("evidence.id does not match its deterministic artifact facts digest");return e.status==="pass_live_eligible"&&zC(e,t),e}function Dd({strategy:e,bars:t,backtestOptions:n={},trainFraction:r=.7,walkForwardWindows:o=3,minTrades:i=10}={}){let s=[];if(!In(e))throw new TypeError("strategy must be a plain object");if(!Array.isArray(t))throw new TypeError("bars must be an array");if(!In(n))throw new TypeError("backtestOptions must be a plain object");if(!Xo(r)||r<=0||r>=1)throw new TypeError("trainFraction must be in (0,1)");if(!Number.isInteger(o)||o<1)throw new TypeError("walkForwardWindows must be a positive integer");if(!Number.isInteger(i)||i<0)throw new TypeError("minTrades must be an integer >= 0");let a=mt(e),c=Qo(a),l=os(t),u=t.length,d=(_=[],$={})=>Wb({status:"fail",strategy:a,sHash:c,barsHash:l,split:$.split||{trainStartIndex:0,trainEndIndex:-1,trainBarCount:0,holdoutStartIndex:0,holdoutEndIndex:-1,holdoutBarCount:0,trainFraction:r},train:$.train||null,holdout:$.holdout||null,walkForward:$.walkForward||{windows:[],passRate:0},flags:[...s,..._]});if(u<10)return d([{type:"insufficient_bars",message:"need at least 10 bars for evidence"}]);let p=Math.floor(u*r),f=p,m=u-f;if(p<5||m<3)return d([{type:"invalid_windowing",message:"train/holdout split too small",trainCount:p,holdoutCount:m}]);let h=t.slice(0,p),y=t.slice(f),g,E;try{g=Nr(a,h,n),E=Nr(a,y,n)}catch(_){return d([{type:"backtest_error",message:String(_.message||_)}])}let v={metrics:Pd(g),costs:Vb(g),tradeCount:g.metrics.tradeCount},S={metrics:Pd(E),costs:Vb(E),tradeCount:E.metrics.tradeCount},I={trainStartIndex:0,trainEndIndex:p-1,trainBarCount:p,holdoutStartIndex:f,holdoutEndIndex:u-1,holdoutBarCount:m,trainFraction:r},k=[],A=Math.floor(u/(o+1));if(A<3)s.push({type:"invalid_windowing",message:"walk-forward window size too small",wfSize:A});else for(let _=0;_<o;_++){let $=A*(_+1),q=$,M=Math.min(u,q+A);if(M-q<3||$<3){k.push({index:_,trainStartIndex:0,trainEndIndex:$-1,evalStartIndex:q,evalEndIndex:M-1,passed:!1,reason:"window_too_small",metrics:null});continue}let ue=t.slice(q,M),ne;try{ne=Nr(a,ue,n)}catch{k.push({index:_,trainStartIndex:0,trainEndIndex:$-1,evalStartIndex:q,evalEndIndex:M-1,passed:!1,reason:"backtest_error",metrics:null});continue}let Pe=Pd(ne),ze=HC(Pe,a.risk,i);k.push({index:_,trainStartIndex:0,trainEndIndex:$-1,evalStartIndex:q,evalEndIndex:M-1,passed:ze,reason:ze?"pass":"fail_metrics",metrics:Pe})}let w=k.filter(_=>_.passed).length,b=k.length===0?0:w/k.length,x={windows:k,passRate:b,windowsRun:k.length};S.metrics.tradeCount===0&&v.metrics.tradeCount===0&&s.push({type:"no_trades",message:"no trades in train or holdout"}),S.metrics.tradeCount===0&&s.push({type:"absent_oos_trades",message:"holdout produced no trades"}),S.metrics.netPnlUsd<0&&s.push({type:"holdout_loss",message:"holdout netPnlUsd is negative"}),v.metrics.netPnlUsd>0&&S.metrics.netPnlUsd<0&&v.metrics.netPnlUsd>Math.abs(S.metrics.netPnlUsd)*.25?s.push({type:"overfit",message:"profitable train with losing holdout (OOS collapse)"}):v.metrics.netPnlUsd>0&&S.metrics.netPnlUsd>0&&S.metrics.netPnlUsd<v.metrics.netPnlUsd*.1&&v.metrics.tradeCount>=i&&s.push({type:"severe_oos_collapse",message:"holdout pnl collapsed vs train"});let C=FC(S.costs),O=jC(E);O>0&&C>O&&s.push({type:"costs_exceed_gross",message:"holdout costs exceed gross gains"});let F=s.some(_=>["insufficient_bars","invalid_windowing","absent_oos_trades","holdout_loss","no_trades","severe_oos_collapse","backtest_error"].includes(_.type)),H=s.some(_=>_.type==="overfit"),V="fail";return S.metrics.tradeCount>=i&&S.metrics.netPnlUsd>0&&S.metrics.profitFactor>1&&S.metrics.maxDrawdownPct<=a.risk.maxDailyLossPct&&b>=.6&&!(O>0&&C>O)&&!H&&!s.some(_=>_.type==="severe_oos_collapse"||_.type==="invalid_windowing")?V="pass_live_eligible":!F&&S.metrics.tradeCount>0&&v.metrics.tradeCount>0&&Number.isFinite(S.metrics.netPnlUsd)?(V="pass_paper_only",S.metrics.tradeCount<i&&s.push({type:"undersampled",message:"holdout trades below minTrades"})):H&&S.metrics.tradeCount>0&&v.metrics.netPnlUsd>0?V="fail":S.metrics.tradeCount>0&&v.metrics.tradeCount>0&&!F?V="pass_paper_only":V="fail",S.metrics.netPnlUsd<0&&(V=V==="pass_live_eligible"?"fail":V==="pass_paper_only"?"pass_paper_only":"fail",V="fail"),Wb({status:V,strategy:a,sHash:c,barsHash:l,split:I,train:v,holdout:S,walkForward:x,flags:s})}function Wb({status:e,strategy:t,sHash:n,barsHash:r,split:o,train:i,holdout:s,walkForward:a,flags:c}){let l={status:e,strategyHash:n,compilerHash:ao,barsHash:r,split:o,train:i,holdout:s,walkForward:a,flags:c};return l.id=Kb(l),$d(io(JSON.parse(JSON.stringify(l))))}var MC,Ud=T(()=>{co();so();mc();MC=Object.freeze(["fail","pass_paper_only","pass_live_eligible"])});function is(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function WC(e){return String(e).toLowerCase().replace(/[^a-z0-9]/g,"")}function qd(e,t="value"){if(Array.isArray(e)){e.forEach((n,r)=>qd(n,`${t}[${r}]`));return}if(is(e))for(let[n,r]of Object.entries(e)){let o=WC(n);if(VC.some(i=>o.includes(i)))throw new Error(`handoff: forbidden secret-like field at ${t}.${n}`);qd(r,`${t}.${n}`)}}function Bd(e){return typeof e=="number"&&Number.isFinite(e)&&e>0}function Jb({strategy:e,evidence:t,shadow:n,caps:r,nowMs:o=Date.now(),env:i=process.env}={}){if(qd({strategy:e,evidence:t,shadow:n,caps:r},"handoff"),!is(e))throw new Error("handoff: strategy required");if(!is(t))throw new Error("handoff: evidence required");if(!is(n))throw new Error("handoff: shadow required");if(!is(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=mt(e,{nowMs:o}),a=ht(s);if(Yb(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(!Bd(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(!Bd(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(!Bd(r.dailyLossCapUsd))throw new Error("handoff: caps.dailyLossCapUsd must be positive");let l=a.strategy.risk.maxNotionalUsd*(a.strategy.risk.maxDailyLossPct/100);if(r.dailyLossCapUsd>l)throw new Error("handoff: caps.dailyLossCapUsd exceeds strategy daily loss ceiling");if(!Array.isArray(r.chainAllowlist)||r.chainAllowlist.length===0)throw new Error("handoff: caps.chainAllowlist must be a non-empty array");if(!r.chainAllowlist.every(p=>p==="hyperliquid"))throw new Error("handoff: caps.chainAllowlist must include only hyperliquid");if(!r.chainAllowlist.includes("hyperliquid"))throw new Error("handoff: caps.chainAllowlist must include hyperliquid");if(!Array.isArray(r.assetAllowlist)||r.assetAllowlist.length===0)throw new Error("handoff: caps.assetAllowlist must be a non-empty array");if(r.assetAllowlist.length!==1||r.assetAllowlist[0]!==a.strategy.market.coin)throw new Error("handoff: caps.assetAllowlist must contain only the strategy market coin");if(!Number.isInteger(r.expiresAt)||!(r.expiresAt>o))throw new Error("handoff: caps.expiresAt must be an integer > nowMs");if(r.expiresAt>a.strategy.risk.expiresAt)throw new Error("handoff: caps.expiresAt exceeds strategy.risk.expiresAt");if(r.killSwitchRequired!==!0)throw new Error("handoff: caps.killSwitchRequired must be exactly true");let u={perStrategyNotionalUsd:r.perStrategyNotionalUsd,maxLeverage:r.maxLeverage,dailyLossCapUsd:r.dailyLossCapUsd,chainAllowlist:[...r.chainAllowlist],assetAllowlist:[...r.assetAllowlist],expiresAt:r.expiresAt,killSwitchRequired:!0},d={strategyHash:a.strategyHash,compilerHash:a.compilerHash,evidence:JSON.parse(JSON.stringify(t)),shadow:{id:n.id,stateHash:n.stateHash,status:n.status,cursor:n.cursor,updatedAt:n.updatedAt},compiled:{strategyHash:a.strategyHash,compilerHash:a.compilerHash,compilerVersion:ss,venue:"hyperliquid",market:{coin:a.strategy.market.coin,kind:"perp",interval:a.strategy.market.interval},risk:{...a.strategy.risk},strategy:JSON.parse(JSON.stringify(a.strategy))},arming:{liveBroadcast:!1,requiresExplicitUserArm:!0,caps:u},requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,executionReady:!1};return me(d,{provider:"hl-strategy",kind:"strategy-live-handoff",env:i})}var VC,Xb=T(()=>{co();Ud();so();rt();VC=["privatekey","secretkey","seed","mnemonic","passphrase","password","keystore","keymaterial","apikey","authtoken","accesstoken","refreshtoken","credential","bearer","signature","authorization","xprv","xpriv","wif"]});function Zo(e,t){let n=Number(e);if(!Number.isFinite(n))throw new TypeError(`${t} must be finite`);return n}function ei(e,t){if(!Number.isSafeInteger(e)||e<0)throw new TypeError(`${t} must be a non-negative safe integer`);return e}function as(e){if(Array.isArray(e))for(let t of e)as(t);else if(e&&typeof e=="object")for(let t of Object.values(e))as(t);return Object.freeze(e)}function KC(e){let t=GC[e];if(!t)throw new TypeError(`unsupported strategy interval: ${e}`);return t}function YC(e,{endTime:t=Number.MAX_SAFE_INTEGER}={}){if(!Array.isArray(e))throw new TypeError("Hyperliquid candles must be an array");ei(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=ei(Number(o.t),`candles[${r}].t`);if(ei(Number(o.T),`candles[${r}].T`)>t)continue;let a={t:i,o:Zo(o.o,`candles[${r}].o`),h:Zo(o.h,`candles[${r}].h`),l:Zo(o.l,`candles[${r}].l`),c:Zo(o.c,`candles[${r}].c`),v:Zo(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 as([...n.values()].sort((r,o)=>r.t-o.t))}function JC(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=ei(Number(o.time),`funding[${r}].time`);i>t||n.set(i,{time:i,fundingRate:Zo(o.fundingRate,`funding[${r}].fundingRate`)})}return[...n.values()].sort((r,o)=>r.time-o.time)}async function XC({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 bg({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 JC(o,n)}function QC(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 Qb(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=KC(r);if(e.endTime==null)throw new TypeError("endTime is required for deterministic history");let i=ei(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):ei(e.startTime,"startTime");if(a>=i)throw new TypeError("startTime must be before endTime");let[c,l]=await Promise.all([gg({coin:n,interval:r,startTime:a,endTime:i},t),XC({coin:n,startTime:a,endTime:i},t)]),u=YC(c,{endTime:i}),d=as(QC(u,l,o));return as({coin:n,interval:r,range:{startTime:a,endTime:i},bars:d})}var GC,Zb=T(()=>{Yi();GC=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 tR(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))eR.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"||!ZC.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 nR(e={}){let t=await hg(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 ZC,eR,e0,t0=T(()=>{Yi();Xb();Zb();ZC=new Set(["1m","3m","5m","15m","30m","1h","2h","4h","8h","12h","1d"]),eR=new Set(["coin","interval"]);e0=Object.freeze({id:"hyperliquid",validateMarket:tR,fetchBars:Qb,listMarkets:nR,prepareIntent(e){return Jb(e)}})});function oR(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 rR.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}function Md(e){return typeof e!="string"?null:iR.get(e)??null}function Fd(e){let t=Md(e);if(!t)throw new Error(`unknown strategy venue: ${String(e)}`);return t}var rR,n0,iR,Y5,jd=T(()=>{t0();rR=Object.freeze(["id","validateMarket","prepareIntent"]);n0=[e0].map(oR),iR=new Map(n0.map(e=>[e.id,e])),Y5=Object.freeze([...n0])});import{createHash as sR}from"node:crypto";function Yt(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function Ie(e){return typeof e=="number"&&Number.isFinite(e)}function u0(e){return Number.isInteger(e)&&e>0}function Gd(e){if(e==null||typeof e!="object"||Object.isFrozen(e))return e;if(Array.isArray(e)){for(let t of e)Gd(t);return Object.freeze(e)}for(let t of Object.keys(e))Gd(e[t]);return Object.freeze(e)}function Kd(e){if(Array.isArray(e))return e.map(Kd);if(e!=null&&typeof e=="object"){let t={};for(let n of Object.keys(e).sort())t[n]=Kd(e[n]);return t}return e}function U(e,t,n){e.push({path:t,message:n})}function Cr(e,t,n,r){for(let o of Object.keys(e))t.has(o)||U(r,n?`${n}.${o}`:o,"unknown field is not allowed")}function m0(e,t,n,r){if(!Ie(e)||!Ie(t)||!Ie(n)||!Ie(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 Wd(e,t,n,r){if(Yt(e)){if(Cr(e,new Set(["param"]),t,r),typeof e.param!="string"||!e.param)return U(r,`${t}.param`,"must be a parameter name string"),null;if(!Object.prototype.hasOwnProperty.call(n,e.param))return U(r,`${t}.param`,`unknown parameter "${e.param}"`),null;let o=n[e.param];return!Yt(o)||![o.value,o.min,o.max,o.step].every(u0)?(U(r,`${t}.param`,"referenced period parameter value min max and step must be positive integers"),null):{param:e.param}}return u0(e)?e:(U(r,t,"must be a positive integer or {param}"),null)}function d0(e,t,n,r){return Yt(e)?(Cr(e,new Set(["param"]),t,r),typeof e.param!="string"||!e.param?(U(r,`${t}.param`,"must be a parameter name string"),null):Object.prototype.hasOwnProperty.call(n,e.param)?{param:e.param}:(U(r,`${t}.param`,`unknown parameter "${e.param}"`),null)):Ie(e)?e:(U(r,t,"must be a finite number or {param}"),null)}function hc(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 hR(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 hc(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 yR(e,t){if(!Yt(e))return U(t,"parameters","must be a plain object"),null;let n=Object.keys(e);if(n.length>a0)return U(t,"parameters",`too many parameters (max ${a0})`),null;let r={};for(let o of n){if(!p0.test(o)){U(t,`parameters.${o}`,"parameter name is malformed");continue}let i=e[o],s=`parameters.${o}`;if(!Yt(i)){U(t,s,"must be a plain object");continue}Cr(i,o0,s,t);for(let d of o0)d in i||U(t,`${s}.${d}`,"required field is missing");let{value:a,min:c,max:l,step:u}=i;Ie(c)||U(t,`${s}.min`,"must be a finite number"),Ie(l)||U(t,`${s}.max`,"must be a finite number"),(!Ie(u)||u<=0)&&U(t,`${s}.step`,"must be a positive finite number"),Ie(a)||U(t,`${s}.value`,"must be a finite number"),Ie(c)&&Ie(l)&&c>l&&U(t,`${s}.min`,"min must be <= max"),Ie(a)&&Ie(c)&&Ie(l)&&Ie(u)&&u>0&&(m0(a,c,l,u)||U(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 gR(e,t,n,r){let o=`nodes.${t}`;if(!Yt(e))return U(r,o,"must be a plain object"),null;if(typeof e.type!="string"||!s0[e.type])return U(r,`${o}.type`,"unknown or missing node type"),Cr(e,mR,o,r),null;switch(Cr(e,s0[e.type],o,r),(typeof e.id!="string"||!f0.test(e.id))&&U(r,`${o}.id`,"must be a 1-64 char id starting with alphanumeric"),e.type){case"input":return(typeof e.field!="string"||!aR.has(e.field))&&U(r,`${o}.field`,"must be one of open|high|low|close|volume|fundingRate|openInterest|premium|oiDelta|bookImbalance"),{id:e.id,type:"input",field:e.field};case"constant":{let i=d0(e.value,`${o}.value`,n,r);return{id:e.id,type:"constant",value:i}}case"indicator":{(typeof e.indicator!="string"||!cR.has(e.indicator))&&U(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?U(r,`${o}.input`,"must be a node id string when provided"):s.input=e.input);let a=Wd(e.period,`${o}.period`,n,r);a!=null&&(s.period=a)}else typeof e.input!="string"||!e.input?U(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))U(r,`${o}.period`,"required field is missing");else{let a=Wd(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))U(r,`${o}.${a}`,"required field is missing");else{let c=Wd(e[a],`${o}.${a}`,n,r);c!=null&&(s[a]=c)}"output"in e?pR.has(e.output)?s.output=e.output:U(r,`${o}.output`,"must be line|signal|histogram"):U(r,`${o}.output`,"required field is missing"),"period"in e&&U(r,`${o}.period`,"forbidden for macd"),"stdDev"in e&&U(r,`${o}.stdDev`,"forbidden for macd")}else if(i==="bollinger"){if(!("stdDev"in e))U(r,`${o}.stdDev`,"required field is missing");else{let a=d0(e.stdDev,`${o}.stdDev`,n,r);a!=null&&(typeof a=="number"&&a<=0?U(r,`${o}.stdDev`,"must be > 0"):s.stdDev=a)}"output"in e?fR.has(e.output)?s.output=e.output:U(r,`${o}.output`,"must be upper|middle|lower"):U(r,`${o}.output`,"required field is missing");for(let a of["fastPeriod","slowPeriod","signalPeriod"])a in e&&U(r,`${o}.${a}`,`forbidden for ${i}`)}else{"output"in e&&U(r,`${o}.output`,`forbidden for ${i}`),"stdDev"in e&&i!=="bollinger"&&U(r,`${o}.stdDev`,`forbidden for ${i}`);for(let a of["fastPeriod","slowPeriod","signalPeriod"])a in e&&U(r,`${o}.${a}`,`forbidden for ${i}`)}return s}case"compare":return(typeof e.op!="string"||!lR.has(e.op))&&U(r,`${o}.op`,"must be gt|gte|lt|lte|eq"),(typeof e.left!="string"||!e.left)&&U(r,`${o}.left`,"must be a node id"),(typeof e.right!="string"||!e.right)&&U(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"||!uR.has(e.op))&&U(r,`${o}.op`,"must be and|or|not"),!Array.isArray(e.inputs))return U(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?U(r,`${o}.inputs.${s}`,"must be a node id"):i.push(a)}return e.op==="not"?i.length!==1&&U(r,`${o}.inputs`,"not requires exactly one input"):(e.op==="and"||e.op==="or")&&i.length<2&&U(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"||!dR.has(e.direction))&&U(r,`${o}.direction`,"must be above|below"),(typeof e.left!="string"||!e.left)&&U(r,`${o}.left`,"must be a node id"),(typeof e.right!="string"||!e.right)&&U(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 bR(e,t,n){if(!Yt(e))return U(t,"risk","must be a plain object"),null;Cr(e,i0,"risk",t);for(let p of i0)(!(p in e)||e[p]==null)&&U(t,`risk.${p}`,"required field is missing");let r={},o=e.maxLeverage;!Ie(o)||o<=0||o>50?U(t,"risk.maxLeverage","must be a number > 0 and <= 50"):r.maxLeverage=o;let i=e.maxNotionalUsd;!Ie(i)||i<=0?U(t,"risk.maxNotionalUsd","must be a number > 0"):r.maxNotionalUsd=i;let s=e.positionSizePct;!Ie(s)||s<=0||s>100?U(t,"risk.positionSizePct","must be a number > 0 and <= 100"):r.positionSizePct=s;let a=e.stopLossPct;!Ie(a)||a<=0||a>100?U(t,"risk.stopLossPct","must be a number > 0 and <= 100"):r.stopLossPct=a;let c=e.takeProfitPct;!Ie(c)||c<=0||c>1e3?U(t,"risk.takeProfitPct","must be a number > 0 and <= 1000"):r.takeProfitPct=c;let l=e.cooldownBars;!Number.isInteger(l)||l<0||l>1e5?U(t,"risk.cooldownBars","must be an integer >= 0 and <= 100000"):r.cooldownBars=l;let u=e.maxDailyLossPct;!Ie(u)||u<=0||u>100?U(t,"risk.maxDailyLossPct","must be a number > 0 and <= 100"):r.maxDailyLossPct=u;let d=e.expiresAt;return!Number.isInteger(d)||d<=0?U(t,"risk.expiresAt","must be an integer epoch milliseconds > 0"):(n.nowMs!==void 0&&(Number.isInteger(n.nowMs)?d<=n.nowMs&&U(t,"risk.expiresAt","must be strictly greater than nowMs"):U(t,"nowMs","must be an integer epoch milliseconds")),r.expiresAt=d),r}function Yd(e,t={}){let n=[];if(!Yt(e))return U(n,"","strategy must be a plain object"),{ok:!1,errors:n,strategy:null};Cr(e,r0,"",n);for(let d of r0)(!(d in e)||e[d]==null)&&U(n,d,"required field is missing");e.version!==Hd&&U(n,"version",`must be ${Hd}`),(typeof e.id!="string"||!p0.test(e.id))&&U(n,"id","must match /^[a-z0-9][a-z0-9._-]{0,63}$/"),(typeof e.name!="string"||e.name.length===0||e.name.length>l0)&&U(n,"name",`must be a non-empty string max ${l0}`);let r=Md(e.venue);r||U(n,"venue",`unknown strategy venue "${String(e.venue)}"`);let o=null;if(!r)Yt(e.market)||U(n,"market","must be a plain object");else{let d=r.validateMarket(e.market);if(!d||typeof d.ok!="boolean"||!Array.isArray(d.errors))U(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)U(n,p.path,p.message)}let i=yR(e.parameters,n),s=null,a=new Map;if(!Array.isArray(e.nodes))U(n,"nodes","must be an array");else if(e.nodes.length>c0)U(n,"nodes",`too many nodes (max ${c0})`);else{s=[];for(let d=0;d<e.nodes.length;d++){let p=gR(e.nodes[d],d,i||{},n);p&&(typeof p.id=="string"&&f0.test(p.id)&&(a.has(p.id)?U(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],f=`nodes.${d}`;for(let m of hc(p))a.has(m)||U(n,f,`unknown node ref "${m}"`);if(p.type==="indicator"||p.type==="compare"||p.type==="cross")for(let m of hc(p)){let h=a.get(m);h&&zd.has(h.type)&&U(n,f,`node ref "${m}" must be numeric`)}if(p.type==="logic")for(let m of hc(p)){let h=a.get(m);h&&!zd.has(h.type)&&U(n,f,`node ref "${m}" must be boolean`)}}hR(a)&&U(n,"nodes","graph contains a cycle")}let c=null;if(!Yt(e.rules))U(n,"rules","must be a plain object");else{Cr(e.rules,Vd,"rules",n);for(let d of Vd)d in e.rules||U(n,`rules.${d}`,"required field is missing");c={};for(let d of Vd){let p=e.rules[d];if(p===null){c[d]=null;continue}if(typeof p!="string"||!p){U(n,`rules.${d}`,"must be a node id or null"),c[d]=p;continue}if(!a.has(p)){U(n,`rules.${d}`,`unknown node ref "${p}"`),c[d]=p;continue}let f=a.get(p);zd.has(f.type)||U(n,`rules.${d}`,`rule must reference a boolean node, not ${f.type}`),c[d]=p}}let l=bR(e.risk,n,t);if(n.length)return{ok:!1,errors:n,strategy:null};let u=Gd({version:Hd,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 mt(e,t={}){let n=Yd(e,t);if(!n.ok)throw new ti(n.errors);return n.strategy}function wR(e){let t=mt(e);return JSON.stringify(Kd(t))}function Qo(e){let t=wR(e);return sR("sha256").update(t,"utf8").digest("hex")}function cs(e,t){if(!Yt(e))throw new ti([{path:"",message:"strategy must be a plain object"}]);if(!Yt(t))throw new ti([{path:"overrides",message:"must be a plain object"}]);let n=mt(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)){U(o,i,`unknown parameter "${i}"`);continue}let a=r[i];if(!Ie(s)){U(o,i,"override must be a finite number");continue}if(!m0(s,a.min,a.max,a.step)){U(o,i,"override must lie on the declared min/max/step grid");continue}r[i]={...a,value:s}}if(o.length)throw new ti(o);return mt({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}})}var Hd,p0,f0,aR,cR,lR,uR,dR,pR,fR,zd,r0,o0,Vd,i0,mR,s0,a0,c0,l0,ti,so=T(()=>{jd();Hd=1,p0=/^[a-z0-9][a-z0-9._-]{0,63}$/,f0=/^[A-Za-z0-9][A-Za-z0-9._-]{0,63}$/,aR=new Set(["open","high","low","close","volume","fundingRate","openInterest","premium","oiDelta","bookImbalance"]),cR=new Set(["sma","ema","rsi","macd","bollinger","atr"]),lR=new Set(["gt","gte","lt","lte","eq"]),uR=new Set(["and","or","not"]),dR=new Set(["above","below"]),pR=new Set(["line","signal","histogram"]),fR=new Set(["upper","middle","lower"]),zd=new Set(["compare","logic","cross"]),r0=new Set(["version","id","name","venue","market","parameters","nodes","rules","risk"]),o0=new Set(["value","min","max","step"]),Vd=new Set(["entryLong","entryShort","exitLong","exitShort"]),i0=new Set(["maxLeverage","maxNotionalUsd","positionSizePct","stopLossPct","takeProfitPct","cooldownBars","maxDailyLossPct","expiresAt"]),mR=new Set(["id","type"]),s0={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"])},a0=16,c0=128,l0=100,ti=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 ls(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 Rr(e){if(!Number.isInteger(e)||e<=0)throw new TypeError("period must be a positive integer")}function ER(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 y0(e,t){ls(e),Rr(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 yc(e,t){ls(e),Rr(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 g0(e,t){ls(e),Rr(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]=h0(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]=h0(i,s)}return n}function h0(e,t){return e===0&&t===0?50:t===0?100:e===0?0:100-100/(1+e/t)}function b0(e,t={}){ls(e);let n=t.fastPeriod,r=t.slowPeriod,o=t.signalPeriod;if(Rr(n),Rr(r),Rr(o),n>=r)throw new TypeError("fastPeriod must be < slowPeriod");let i=yc(e,n),s=yc(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,f=u[o-1];c[f]=p,l[f]=a[f]-p;let m=2/(o+1);for(let h=o;h<u.length;h++){let y=u[h];p=m*a[y]+(1-m)*p,c[y]=p,l[y]=a[y]-p}}return{line:a,signal:c,histogram:l}}function w0(e,t={}){ls(e);let n=t.period,r=t.stdDev;if(Rr(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 f=Math.sqrt(p);o[l]=d,i[l]=d+r*f,s[l]=d-r*f}}return{upper:i,middle:o,lower:s}}function E0(e,t){ER(e),Rr(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}var A0=T(()=>{});import{createHash as AR}from"node:crypto";var Jd,SR,vR,xR,S0,v0=T(()=>{Jd=3,SR="7477966facc4ef928a94e6221c8fd238eef4fcbeec46b96ae1b89178e13c2d5f",vR="68f5b412a9975f04024cf9b9b6209b4bccedd52f176e95f34f786b3f53479c6a",xR="967fd45ecddd0d59ac0f662fe92ea813c32620ba751f249b4ace6cb6b809fb5e",S0=AR("sha256").update(JSON.stringify({version:Jd,compilerSourceHash:SR,indicatorsSourceHash:vR,schemaSourceHash:xR})).digest("hex")});function Ut(e){return typeof e=="number"&&Number.isFinite(e)}function OR(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 ni(e,t){return e!=null&&typeof e=="object"&&"param"in e?t[e.param].value:e}function _R(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(!Ut(s)&&(typeof s=="number"&&Number.isFinite(s)),!Number.isFinite(s))throw new TypeError(`bars[${o}].t must be finite`);for(let[p,f]of[["o",a],["h",c],["l",l],["c",u],["v",d]])if(!Ut(f))throw new TypeError(`bars[${o}].${p} must be a finite number`);for(let[p,f]of[["o",a],["h",c],["l",l],["c",u]])if(!(f>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!==kR[n])throw new TypeError(`bars t must match ${n} cadence`)}if(r=s,"fundingRate"in i&&i.fundingRate!=null&&!Ut(i.fundingRate))throw new TypeError(`bars[${o}].fundingRate must be finite when present`);if("openInterest"in i&&i.openInterest!=null){if(!Ut(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`)}for(let p of["premium","oiDelta"])if(p in i&&i[p]!=null&&!Ut(i[p]))throw new TypeError(`bars[${o}].${p} must be finite when present`);if("bookImbalance"in i&&i.bookImbalance!=null){if(!Ut(i.bookImbalance))throw new TypeError(`bars[${o}].bookImbalance must be finite when present`);if(i.bookImbalance<-1||i.bookImbalance>1)throw new TypeError(`bars[${o}].bookImbalance must be within [-1, 1]`)}}}function lo(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=IR[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=ni(s.value,n);a=new Array(o+1).fill(c);break}case"indicator":{let c=s.period!=null?ni(s.period,n):void 0;if(s.indicator==="atr"){let d=[];for(let p=0;p<=o;p++){let f=r[p];d.push({o:f.o,h:f.h,l:f.l,c:f.c})}a=E0(d,c);break}let u=lo(s.input,t,n,r,o,i).map((d,p)=>{if(d==null||!Ut(d))throw new TypeError(`indicator input ${s.input} has non-finite value at ${p}`);return d});if(s.indicator==="sma")a=y0(u,c);else if(s.indicator==="ema")a=yc(u,c);else if(s.indicator==="rsi")a=g0(u,c);else if(s.indicator==="macd")a=b0(u,{fastPeriod:ni(s.fastPeriod,n),slowPeriod:ni(s.slowPeriod,n),signalPeriod:ni(s.signalPeriod,n)})[s.output];else if(s.indicator==="bollinger")a=w0(u,{period:c,stdDev:ni(s.stdDev,n)})[s.output];else throw new Error(`unsupported indicator ${s.indicator}`);break}case"compare":{let c=lo(s.left,t,n,r,o,i),l=lo(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||!Ut(d)||!Ut(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=>lo(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=lo(s.left,t,n,r,o,i),l=lo(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],f=c[u],m=l[u];if(d==null||p==null||f==null||m==null||!Ut(d)||!Ut(p)||!Ut(f)||!Ut(m)){a[u]=!1;continue}s.direction==="above"?a[u]=d<=p&&f>m:a[u]=d>=p&&f<m}break}default:throw new Error(`unknown node type ${s.type}`)}return i.set(e,a),a}function ht(e,t={}){let n=mt(e);t&&Object.keys(t).length&&(n=cs(n,t));let r=new Map(n.nodes.map(f=>[f.id,f])),o=Object.freeze(OR(n.nodes)),i=n.parameters,s=new Set(n.nodes.filter(f=>f.type==="input").map(f=>f.field));if(n.nodes.some(f=>f.type==="indicator"&&f.indicator==="atr"))for(let f of["open","high","low","close"])s.add(f);let a=Object.freeze([...s].sort()),c=Qo(n);function l(f,m){let h={};for(let g of o){let E=f.get(g);h[g]=E[m]}let y=g=>g!=null&&h[g]===!0;return{values:h,signals:{entryLong:y(n.rules.entryLong),entryShort:y(n.rules.entryShort),exitLong:y(n.rules.exitLong),exitShort:y(n.rules.exitShort)}}}function u(f,m){_R(f,m,n.market.interval);let h=new Map;for(let y of o)lo(y,r,i,f,m,h);return h}function d(f,m){return l(u(f,m),m)}function p(f){if(!Array.isArray(f)||f.length===0)throw new TypeError("bars must be a non-empty array");let m=f.length-1,h=u(f,m);return Object.freeze(f.map((y,g)=>Object.freeze(l(h,g))))}return Object.freeze({strategy:n,strategyHash:c,compilerVersion:ss,compilerHash:ao,requiredSeries:a,nodeOrder:o,evaluate:d,evaluateAll:p})}var ss,ao,IR,kR,co=T(()=>{so();A0();v0();ss=Jd,ao=S0,IR=Object.freeze({open:"o",high:"h",low:"l",close:"c",volume:"v",fundingRate:"fundingRate",openInterest:"openInterest",premium:"premium",oiDelta:"oiDelta",bookImbalance:"bookImbalance"}),kR=Object.freeze({"1m":6e4,"3m":18e4,"5m":3e5,"15m":9e5,"30m":18e5,"1h":36e5,"2h":72e5,"4h":144e5,"8h":288e5,"12h":432e5,"1d":864e5})});import{createHash as TR}from"node:crypto";function CR(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function kn(e){return typeof e=="number"&&Number.isFinite(e)}function Xd(e){if(e==null||typeof e!="object"||Object.isFrozen(e))return e;if(Array.isArray(e)){for(let t of e)Xd(t);return Object.freeze(e)}for(let t of Object.keys(e))Xd(e[t]);return Object.freeze(e)}function gc(e){if(Array.isArray(e))return e.map(gc);if(e!=null&&typeof e=="object"){let t={};for(let n of Object.keys(e).sort())t[n]=gc(e[n]);return t}return e}function Qd(e,t="result"){if(typeof e=="number"){if(!Number.isFinite(e))throw new Error(`non-finite backtest result at ${t}`);return}if(!(e==null||typeof e!="object")){if(Array.isArray(e)){e.forEach((n,r)=>Qd(n,`${t}[${r}]`));return}for(let[n,r]of Object.entries(e))Qd(r,`${t}.${n}`)}}function I0(e){if(!Array.isArray(e)||e.length===0)throw new TypeError("bars must be a non-empty array");let t=null;for(let n=0;n<e.length;n++){let r=e[n];if(r==null||typeof r!="object"||Array.isArray(r))throw new TypeError(`bars[${n}] must be an object`);let{t:o,o:i,h:s,l:a,c,v:l}=r;if(!kn(o))throw new TypeError(`bars[${n}].t must be finite`);for(let[u,d]of[["o",i],["h",s],["l",a],["c",c],["v",l]])if(!kn(d))throw new TypeError(`bars[${n}].${u} must be a finite number`);for(let[u,d]of[["o",i],["h",s],["l",a],["c",c]])if(!(d>0))throw new TypeError(`bars[${n}].${u} price must be positive`);if(l<0)throw new TypeError(`bars[${n}].v volume must be non-negative`);if(s<Math.max(i,c,a))throw new TypeError(`bars[${n}] high must be >= max(open, close, low)`);if(a>Math.min(i,c,s))throw new TypeError(`bars[${n}] low must be <= min(open, close, high)`);if(t!=null&&!(o>t))throw new TypeError("bars t must be strictly increasing");if(t=o,"fundingRate"in r&&r.fundingRate!=null&&!kn(r.fundingRate))throw new TypeError(`bars[${n}].fundingRate must be finite when present`);if("fundingPaymentRate"in r&&r.fundingPaymentRate!=null&&!kn(r.fundingPaymentRate))throw new TypeError(`bars[${n}].fundingPaymentRate must be finite when present`);if("openInterest"in r&&r.openInterest!=null&&!kn(r.openInterest))throw new TypeError(`bars[${n}].openInterest must be finite when present`)}}function os(e){if(!Array.isArray(e))throw new TypeError("bars must be an array");return e.length>0&&I0(e),TR("sha256").update(JSON.stringify(gc(e)),"utf8").digest("hex")}function RR(e){if(e==null&&(e={}),!CR(e))throw new TypeError("options must be a plain object");let t={...NR},n=new Set(["initialEquityUsd","takerFeeBps","builderFeeBps","slippageBps","latencyBars","maxVolumeParticipationPct","nowMs"]);for(let r of Object.keys(e))if(!n.has(r))throw new TypeError(`unknown option "${r}"`);if("initialEquityUsd"in e){if(!kn(e.initialEquityUsd)||e.initialEquityUsd<=0)throw new TypeError("initialEquityUsd must be a positive finite number");t.initialEquityUsd=e.initialEquityUsd}for(let r of["takerFeeBps","builderFeeBps","slippageBps"])if(r in e){let o=e[r];if(!kn(o)||o<0)throw new TypeError(`${r} must be a finite number >= 0`);if(r==="slippageBps"?o>=1e4:o>1e4)throw new TypeError(`${r} exceeds its safe basis-point bound`);t[r]=o}if("latencyBars"in e){let r=e.latencyBars;if(!Number.isInteger(r)||r<1)throw new TypeError("latencyBars must be an integer >= 1");t.latencyBars=r}if("maxVolumeParticipationPct"in e){let r=e.maxVolumeParticipationPct;if(!kn(r)||r<=0||r>100)throw new TypeError("maxVolumeParticipationPct must be in (0,100]");t.maxVolumeParticipationPct=r}if("nowMs"in e){if(!Number.isInteger(e.nowMs))throw new TypeError("nowMs must be an integer epoch milliseconds");t.nowMs=e.nowMs}return t}function bc(e){return e/1e4}function PR(e,t,n){let r=bc(n);return t==="long"?e*(1+r):e*(1-r)}function LR(e,t,n){let r=bc(n);return t==="long"?e*(1-r):e*(1+r)}function x0(e,t,n){let r=Math.abs(e)*bc(t),o=Math.abs(e)*bc(n);return{taker:r,builder:o,total:r+o}}function $R(e,t){let n=e*(t.positionSizePct/100)*t.maxLeverage;return Math.min(n,t.maxNotionalUsd)}function DR(e,t,n){let r=n/100;return t==="long"?e*(1-r):e*(1+r)}function UR(e,t,n){let r=n/100;return t==="long"?e*(1+r):e*(1-r)}function BR(e,t,n,r){if(!(n>0))return t==="long"?0:Number.POSITIVE_INFINITY;let o=Math.min(.99,1/(2*n)+r/1e4);return t==="long"?e*(1-1/n)/(1-o):e*(1+1/n)/(1+o)}function qR(e,t,n){return t==="long"?e.l<=n:e.h>=n}function MR(e,t,n){return t==="long"?e.h>=n:e.l<=n}function FR(e,t,n){return t==="long"?e.l<=n:e.h>=n}function us(e,t){for(let n of e.requiredSeries)if(jR.includes(n)&&!t.every(r=>kn(r?.[n])))throw new Error(`strategy required series is absent: ${n}`)}function HR(e){if(e.length<3)return 0;let t=[];for(let s=1;s<e.length;s++){let a=e[s-1].equity,c=e[s].equity;a>0&&t.push((c-a)/a)}if(t.length<2)return 0;let n=0;for(let s of t)n+=s;let r=n/t.length,o=0;for(let s of t)o+=(s-r)**2;let i=Math.sqrt(o/(t.length-1));return i>0?r/i:0}function zR(e){let t=-1/0,n=0;for(let r of e){let o=r.equity;if(o>t&&(t=o),t>0){let i=(t-o)/t*100;i>n&&(n=i)}}return n}function Nr(e,t,n={}){let r=RR(n);I0(t);let o=os(t);r.nowMs!==void 0&&mt(e,{nowMs:r.nowMs});let i=ht(e);if(us(i,t),r.nowMs!==void 0&&i.strategy.risk.expiresAt<=r.nowMs)throw new Error("strategy is expired: risk.expiresAt must be strictly greater than nowMs");let s=i.strategy.risk,a=i.evaluateAll(t),c=r.latencyBars,l=r.slippageBps,u=r.takerFeeBps,d=r.builderFeeBps,p=r.initialEquityUsd,f=0,m=0,h=0,y=0,g=0,E=[],v=[],S=[],I=[],k=[],A=null,w=0,b=null,x=p,C=!1,O=0,F=0,H=[],V=new Array(t.length).fill(0);function D(B){H.push(B)}function _(B){let ee=t[B].v*(r.maxVolumeParticipationPct/100);return Math.max(0,ee-V[B])}function $(B){if(!A)return p;let ee=A.side==="long"?(B-A.entryPrice)*A.qty:(A.entryPrice-B)*A.qty;return p+ee}function q(B,ee,W){let Ee=W.o,oe=$R(p,s);if(!(oe>0)||!(Ee>0))return;let Ae=PR(Ee,ee,l),he=oe/Ae,Le=_(B),Si=Ae*Le;if(he>Le){S.push({kind:"entry",barIndex:B,time:W.t,side:ee,requestedNotionalUsd:oe,maxFillNotionalUsd:Si,reason:"volume_participation"});return}V[B]+=he;let bn=Math.abs(Ae-Ee)*he,qn=x0(oe,u,d);p-=qn.total,f+=qn.taker,m+=qn.builder,y+=bn,g+=oe,A={lifecycleEpoch:++F,side:ee,entryBarIndex:B,entryReferencePrice:Ee,entryPrice:Ae,qty:he,notionalUsd:oe,stop:DR(Ae,ee,s.stopLossPct),take:UR(Ae,ee,s.takeProfitPct),liq:BR(Ae,ee,s.maxLeverage,u+d),entryFees:qn.taker,entryBuilderFees:qn.builder,entrySlippageUsd:bn,fundingAccrued:0}}function M(B,ee,W,Ee){if(!A)return!1;let oe=A.side,Ae=ee,he=Ae;W!=="liquidation"&&Ee&&(he=LR(Ae,oe,l));let Le=A.qty,Si=Le*he;if(W!=="liquidation"){let Hf=_(B),Pv=he*Hf;if(Le>Hf)return S.push({kind:"exit",barIndex:B,time:t[B].t,side:oe,requestedNotionalUsd:Si,maxFillNotionalUsd:Pv,reason:"volume_participation",triggerReason:W}),!1;V[B]+=Le}let bn=x0(Si,u,d),qn=W==="liquidation"?0:Math.abs(he-Ae)*Le,vi,gl;oe==="long"?(vi=(Ae-A.entryReferencePrice)*Le,gl=(he-A.entryPrice)*Le):(vi=(A.entryReferencePrice-Ae)*Le,gl=(A.entryPrice-he)*Le),p+=gl,p-=bn.total,f+=bn.taker,m+=bn.builder,y+=qn,g+=Si;let Rv={side:oe,entryBarIndex:A.entryBarIndex,entryTime:t[A.entryBarIndex].t,entryPrice:A.entryPrice,exitBarIndex:B,exitTime:t[B].t,exitPrice:he,exitReason:W,qty:Le,notionalUsd:A.notionalUsd,grossPnlUsd:vi,feesUsd:A.entryFees+bn.taker,builderFeesUsd:A.entryBuilderFees+bn.builder,fundingUsd:A.fundingAccrued,slippageUsd:A.entrySlippageUsd+qn,netPnlUsd:vi-(A.entryFees+bn.taker+A.entryBuilderFees+bn.builder)-A.fundingAccrued-(A.entrySlippageUsd+qn)};return E.push(Rv),W==="liquidation"&&v.push({barIndex:B,time:t[B].t,side:oe,price:he,tradeIndex:E.length-1}),A=null,F+=1,O=B+1+(s.cooldownBars||0),!0}function ue(B,ee,W,Ee){let oe=B+1;if(oe>=t.length)return;H.some(he=>he.kind==="exit"&&he.side===ee&&he.fillBar===oe&&he.epoch===Ee)||D({kind:"exit",side:ee,signalBar:B,fillBar:oe,reason:W,epoch:Ee})}function ne(B){let ee=H.filter(W=>W.fillBar===B);for(let W=H.length-1;W>=0;W--)H[W].fillBar===B&&H.splice(W,1);ee.sort((W,Ee)=>{let oe=Ae=>Ae.kind==="exit"?0:1;return oe(W)-oe(Ee)});for(let W of ee)if(W.kind==="exit"){if(!A||A.side!==W.side||A.lifecycleEpoch!==W.epoch)continue;let Ee=W.reason||"rule";M(B,t[B].o,Ee,!0)||ue(B,W.side,Ee,W.epoch)}else if(W.kind==="entry"){if(A||W.epoch!==F||B<O)continue;q(B,W.side,t[B])}}function Pe(B){if(!A)return;let ee=t[B],W=ee.fundingPaymentRate;if(W==null||!kn(W)||W===0)return;let Ee=Math.abs(A.qty*ee.c),oe=W*Ee;A.side==="long"?(p-=oe,A.fundingAccrued+=oe,h+=oe):(p+=oe,A.fundingAccrued-=oe,h-=oe)}function ze(B){if(!A)return;let ee=t[B].o;(A.side==="long"?ee<=A.liq:ee>=A.liq)&&M(B,ee,"liquidation",!1)}function Fr(B){if(!A)return;let ee=t[B],W=A.side,Ee=FR(ee,W,A.liq),oe=qR(ee,W,A.stop),Ae=MR(ee,W,A.take),he=Le=>W==="long"?Math.min(Le,ee.o):Math.max(Le,ee.o);if(Ee){M(B,he(A.liq),"liquidation",!1);return}if(oe&&Ae){M(B,he(A.stop),"stop_loss",!0)||ue(B,W,"stop_loss",A.lifecycleEpoch);return}if(oe){M(B,he(A.stop),"stop_loss",!0)||ue(B,W,"stop_loss",A.lifecycleEpoch);return}Ae&&(M(B,A.take,"take_profit",!0)||ue(B,W,"take_profit",A.lifecycleEpoch))}for(let B=0;B<t.length;B++){let ee=Math.floor(t[B].t/864e5);ee!==b&&(b=ee,x=$(t[B].o),C=!1),ze(B),ne(B),Fr(B),Pe(B),!C&&$(t[B].c)<=x*(1-s.maxDailyLossPct/100)&&(C=!0,I.push({type:"daily_loss_limit",barIndex:B,time:t[B].t,message:"daily loss limit reached; new entries blocked for UTC day"}));let W=a[B].signals,Ee=B+c;if(A)(A.side==="long"&&W.exitLong===!0||A.side==="short"&&W.exitShort===!0)&&Ee<t.length&&(H.some(Le=>Le.kind==="exit"&&Le.side===A.side&&Le.fillBar===Ee&&Le.epoch===A.lifecycleEpoch)||D({kind:"exit",side:A.side,signalBar:B,fillBar:Ee,reason:"rule",epoch:A.lifecycleEpoch}));else{let Ae=W.entryLong===!0,he=W.entryShort===!0;Ae&&he?I.push({type:"conflicting_entry_signals",barIndex:B,time:t[B].t,message:"conflicting entry signals; no position opened"}):!C&&(Ae||he)&&Ee<t.length&&B>=O&&D({kind:"entry",side:Ae?"long":"short",signalBar:B,fillBar:Ee,epoch:F})}let oe=p;A&&(w+=1,oe=$(t[B].c)),k.push({barIndex:B,time:t[B].t,equity:oe,positionSide:A?A.side:null})}let Un=null;if(A){let B=t.length-1;if(M(B,t[B].c,"end_of_data",!0))k[B]={barIndex:B,time:t[B].t,equity:p,positionSide:null};else{let W=$(t[B].c);Un={side:A.side,entryBarIndex:A.entryBarIndex,entryTime:t[A.entryBarIndex].t,entryPrice:A.entryPrice,qty:A.qty,notionalUsd:A.notionalUsd,markPrice:t[B].c,markedEquityUsd:W},I.push({type:"open_position_at_end",barIndex:B,time:t[B].t,message:"end-of-data exit missed; position remains open and marked"})}}let K=(A?$(t[t.length-1].c):p)-r.initialEquityUsd,ye=K/r.initialEquityUsd*100,fe=0,zt=0,Bn=0;for(let B of E)B.netPnlUsd>0?(fe+=1,zt+=B.netPnlUsd):B.netPnlUsd<0&&(Bn+=-B.netPnlUsd);let gn=E.length,bo=gn===0?0:fe/gn,Ve=0;Bn>0?Ve=zt/Bn:zt>0&&(Ve=1e12);let jr={netPnlUsd:K,netPnlPct:ye,maxDrawdownPct:zR(k),winRate:bo,profitFactor:Ve,tradeCount:gn,sharpe:HR(k),turnoverUsd:g,exposurePct:w/t.length*100},Cv={initialEquityUsd:r.initialEquityUsd,takerFeeBps:r.takerFeeBps,builderFeeBps:r.builderFeeBps,slippageBps:r.slippageBps,latencyBars:r.latencyBars,maxVolumeParticipationPct:r.maxVolumeParticipationPct},jf={barsHash:o,strategyHash:i.strategyHash,compilerHash:ao,compilerVersion:ss,config:Cv,trades:E,equityCurve:k,metrics:jr,costs:{feesUsd:f,builderFeesUsd:m,fundingUsd:h,slippageUsd:y},liquidations:v,missedFills:S,openPositionAtEnd:Un,flags:I};return Qd(jf),Xd(gc(jf))}var NR,jR,mc=T(()=>{co();so();NR=Object.freeze({initialEquityUsd:1e4,takerFeeBps:3.5,builderFeeBps:2,slippageBps:2,latencyBars:1,maxVolumeParticipationPct:100});jR=Object.freeze(["fundingRate","openInterest","premium","oiDelta","bookImbalance"])});import{createHash as VR}from"node:crypto";function ZR(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function Zd(e){if(e==null||typeof e!="object"||Object.isFrozen(e))return e;if(Array.isArray(e)){for(let t of e)Zd(t);return Object.freeze(e)}for(let t of Object.keys(e))Zd(e[t]);return Object.freeze(e)}function eP(e){return String(e).trim().replace(/\s+/g," ")}function tP(e){let t=e.match(/\b(long|short)\b/i);return t?t[1].toLowerCase():null}function nP(e){for(let n of GR)if(new RegExp(`\\b${n}\\b`,"i").test(e))return n;let t=e.match(/\b([A-Z][A-Z0-9]{1,11})\b/);return t?t[1]:null}function rP(e){let t=e.match(/\bon\s+(1m|3m|5m|15m|30m|1h|2h|4h|8h|12h|1d)\b/i);if(!t)return"15m";let n=t[1].toLowerCase();return WR.has(n)?n:null}function oP(e){let t={...YR},n=e.match(/stop\s*loss\s*(\d+(?:\.\d+)?)\s*%?/i);n&&(t.stopLossPct=Number(n[1]));let r=e.match(/take\s*profit\s*(\d+(?:\.\d+)?)\s*%?/i);r&&(t.takeProfitPct=Number(r[1]));let o=e.match(/leverage\s*(\d+(?:\.\d+)?)/i);o&&(t.maxLeverage=Number(o[1]));let i=e.match(/position\s*size\s*(\d+(?:\.\d+)?)\s*%?/i);i&&(t.positionSizePct=Number(i[1]));let s=e.match(/max\s*notional\s*(?:usd\s*)?\$?\s*(\d+(?:\.\d+)?)/i);return s&&(t.maxNotionalUsd=Number(s[1])),t}function iP(e){return[/\bon\s+(?:1m|3m|5m|15m|30m|1h|2h|4h|8h|12h|1d)\b/gi,/\bstop\s*loss\s*\d+(?:\.\d+)?\s*%?/gi,/\btake\s*profit\s*\d+(?:\.\d+)?\s*%?/gi,/\bleverage\s*\d+(?:\.\d+)?/gi,/\bposition\s*size\s*\d+(?:\.\d+)?\s*%?/gi,/\bmax\s*notional\s*(?:usd\s*)?\$?\s*\d+(?:\.\d+)?/gi].some(n=>(e.match(n)??[]).length>1)}function sP(e){let t=VR("sha256").update(e,"utf8").digest("hex").slice(0,10),n=e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").slice(0,40),o=`${n.length?n:"draft"}-${t}`.replace(/[^a-z0-9._-]/g,"").slice(0,64);return/^[a-z0-9]/.test(o)?o:`d${o}`.slice(0,64)}function aP(e){let t=e.match(/\bema\s*(\d+)\s*cross(?:es)?\s*(above|below)\s*ema\s*(\d+)\b/i);if(!t)return null;let n=Number(t[1]),r=t[2].toLowerCase(),o=Number(t[3]);if(!(n>0)||!(o>0)||n===o)return null;let i=/\b(exit\s+on\s+reverse|reverse\s+exit)\b/i.test(e);return{kind:"ema_cross",fast:n,slow:o,direction:r,reverse:i}}function cP(e){let t=e.match(/\brsi\s*(\d+)\s*(above|below)\s*(-?\d+(?:\.\d+)?)/i);if(!t)return null;let n=Number(t[3]);return!Number.isFinite(n)||n<=0||n>=100?null:{kind:"rsi",period:Number(t[1]),op:t[2].toLowerCase(),threshold:n}}function lP(e){let t=e.match(/\bfunding\s*rate\s*(above|below)\s*(-?\d+(?:\.\d+)?)(%?)(?=\s|,|$)/i);if(!t)return null;let n=Number(t[2]);return t[3]==="%"&&(n=n/100),{kind:"funding",op:t[1].toLowerCase(),threshold:n}}function uP(e){let t=e.match(/\bopen\s*interest\s*(above|below)\s*(-?\d+(?:\.\d+)?)(?=\s|,|$)/i);if(!t)return null;let n=Number(t[2]);return!Number.isFinite(n)||n<0?null:{kind:"open_interest",op:t[1].toLowerCase(),threshold:n}}function dP(e){let t=e.match(/\bpremium\s*(above|below)\s*(-?\d+(?:\.\d+)?)(%?)(?=\s|,|$)/i);if(!t)return null;let n=Number(t[2]);return Number.isFinite(n)?(t[3]==="%"&&(n=n/100),{kind:"premium",op:t[1].toLowerCase(),threshold:n}):null}function pP(e){let t=e.match(/\boi\s*delta\s*(above|below)\s*(-?\d+(?:\.\d+)?)(?=\s|,|$)/i);if(!t)return null;let n=Number(t[2]);return Number.isFinite(n)?{kind:"oi_delta",op:t[1].toLowerCase(),threshold:n}:null}function fP(e){let t=e.match(/\bbook\s*imbalance\s*(above|below)\s*(-?\d+(?:\.\d+)?)(?=\s|,|$)/i);if(!t)return null;let n=Number(t[2]);return!Number.isFinite(n)||n<-1||n>1?null:{kind:"book_imbalance",op:t[1].toLowerCase(),threshold:n}}function mP(e,t){let n=e.replace(/^(long|short)\s+[A-Z][A-Z0-9]{1,11}\s+when\s+/i,"");if(n===e)return!1;t.kind==="ema_cross"?n=n.replace(/^ema\s*\d+\s*cross(?:es)?\s*(?:above|below)\s*ema\s*\d+\b/i,""):t.kind==="rsi"?n=n.replace(/^rsi\s*\d+\s*(?:above|below)\s*\d+(?:\.\d+)?\b/i,""):t.kind==="open_interest"?n=n.replace(/^open\s*interest\s*(?:above|below)\s*-?\d+(?:\.\d+)?(?=\s|,|$)/i,""):t.kind==="premium"?n=n.replace(/^premium\s*(?:above|below)\s*-?\d+(?:\.\d+)?%?(?=\s|,|$)/i,""):t.kind==="oi_delta"?n=n.replace(/^oi\s*delta\s*(?:above|below)\s*-?\d+(?:\.\d+)?(?=\s|,|$)/i,""):t.kind==="book_imbalance"?n=n.replace(/^book\s*imbalance\s*(?:above|below)\s*-?\d+(?:\.\d+)?(?=\s|,|$)/i,""):n=n.replace(/^funding\s*rate\s*(?:above|below)\s*-?\d+(?:\.\d+)?%?(?=\s|,|$)/i,"");let r=[/(?:,\s*)?\bon\s+(?:1m|3m|5m|15m|30m|1h|2h|4h|8h|12h|1d)\b/gi,/(?:,\s*)?\bstop\s*loss\s*\d+(?:\.\d+)?\s*%?/gi,/(?:,\s*)?\btake\s*profit\s*\d+(?:\.\d+)?\s*%?/gi,/(?:,\s*)?\bleverage\s*\d+(?:\.\d+)?/gi,/(?:,\s*)?\bposition\s*size\s*\d+(?:\.\d+)?\s*%?/gi,/(?:,\s*)?\bmax\s*notional\s*(?:usd\s*)?\$?\s*\d+(?:\.\d+)?/gi];t.kind==="ema_cross"&&r.push(/(?:,\s*)?\b(?:exit\s+on\s+reverse|reverse\s+exit)\b/gi);for(let o of r)n=n.replace(o,"");return n.replace(/[\s,;]+/g,"")===""}function k0(e){let t=Math.max(2,Math.floor(e/2));return{value:e,min:Math.max(2,e-t),max:Math.min(500,e+t),step:1}}function hP({side:e,coin:t,interval:n,risk:r,expiresAt:o,id:i,name:s,spec:a}){let c=[{id:"c",type:"input",field:"close"},{id:"emaLeft",type:"indicator",indicator:"ema",input:"c",period:{param:"ema_left_period"}},{id:"emaRight",type:"indicator",indicator:"ema",input:"c",period:{param:"ema_right_period"}},{id:"cross",type:"cross",direction:a.direction,left:"emaLeft",right:"emaRight"}],l={entryLong:null,entryShort:null,exitLong:null,exitShort:null};if(e==="long"?l.entryLong="cross":l.entryShort="cross",a.reverse){let u=a.direction==="above"?"below":"above";c.push({id:"crossRev",type:"cross",direction:u,left:"emaLeft",right:"emaRight"}),e==="long"?l.exitLong="crossRev":l.exitShort="crossRev"}return{version:1,id:i,name:s,venue:"hyperliquid",market:{coin:t,interval:n},parameters:{ema_left_period:k0(a.fast),ema_right_period:k0(a.slow)},nodes:c,rules:l,risk:{...r,expiresAt:o}}}function yP({side:e,coin:t,interval:n,risk:r,expiresAt:o,id:i,name:s,spec:a}){let c=[{id:"c",type:"input",field:"close"},{id:"rsi",type:"indicator",indicator:"rsi",input:"c",period:a.period},{id:"thr",type:"constant",value:a.threshold},{id:"sig",type:"compare",op:a.op==="above"?"gt":"lt",left:"rsi",right:"thr"}];return{version:1,id:i,name:s,venue:"hyperliquid",market:{coin:t,interval:n},parameters:{},nodes:c,rules:{entryLong:e==="long"?"sig":null,entryShort:e==="short"?"sig":null,exitLong:null,exitShort:null},risk:{...r,expiresAt:o}}}function gP({side:e,coin:t,interval:n,risk:r,expiresAt:o,id:i,name:s,spec:a}){let c=[{id:"fr",type:"input",field:"fundingRate"},{id:"thr",type:"constant",value:a.threshold},{id:"sig",type:"compare",op:a.op==="above"?"gt":"lt",left:"fr",right:"thr"}];return{version:1,id:i,name:s,venue:"hyperliquid",market:{coin:t,interval:n},parameters:{},nodes:c,rules:{entryLong:e==="long"?"sig":null,entryShort:e==="short"?"sig":null,exitLong:null,exitShort:null},risk:{...r,expiresAt:o}}}function bP({side:e,coin:t,interval:n,risk:r,expiresAt:o,id:i,name:s,spec:a}){let c=[{id:"oi",type:"input",field:"openInterest"},{id:"thr",type:"constant",value:a.threshold},{id:"sig",type:"compare",op:a.op==="above"?"gt":"lt",left:"oi",right:"thr"}];return{version:1,id:i,name:s,venue:"hyperliquid",market:{coin:t,interval:n},parameters:{},nodes:c,rules:{entryLong:e==="long"?"sig":null,entryShort:e==="short"?"sig":null,exitLong:null,exitShort:null},risk:{...r,expiresAt:o}}}function EP({side:e,coin:t,interval:n,risk:r,expiresAt:o,id:i,name:s,spec:a}){let l=[{id:"sig_input",type:"input",field:wP[a.kind]},{id:"thr",type:"constant",value:a.threshold},{id:"sig",type:"compare",op:a.op==="above"?"gt":"lt",left:"sig_input",right:"thr"}];return{version:1,id:i,name:s,venue:"hyperliquid",market:{coin:t,interval:n},parameters:{},nodes:l,rules:{entryLong:e==="long"?"sig":null,entryShort:e==="short"?"sig":null,exitLong:null,exitShort:null},risk:{...r,expiresAt:o}}}function O0(e,t={}){if(typeof e!="string")throw new et("prompt must be a string");if(e.length>1e3)throw new et("prompt length must be <= 1000");if(!ZR(t))throw new et("options must be a plain object");if(!Number.isInteger(t.nowMs))throw new et("options.nowMs is required integer epoch ms");let n=t.nowMs,r=QR;if("expiresInMs"in t){if(!Number.isInteger(t.expiresInMs))throw new et("expiresInMs must be an integer");if(r=t.expiresInMs,r<JR||r>XR)throw new et("expiresInMs must be between 1h and 30d")}if(KR.test(e))throw new et(`prompt appears to contain secrets and is rejected. ${ri}`);let o=eP(e);if(!o)throw new et(`empty prompt. ${ri}`);if(iP(o))throw new et(`duplicate interval or risk clause. ${ri}`);let i=tP(o),s=nP(o),a=rP(o);if(!i||!s||!a)throw new et(`could not parse side/coin/interval. ${ri}`);let c=oP(o);if(!(c.maxLeverage>0)||c.maxLeverage>50)throw new et("leverage out of range");if(!(c.positionSizePct>0)||c.positionSizePct>100)throw new et("position size out of range");let l=n+r,u=sP(o),d=`Draft ${s} ${i}`.slice(0,100),p=aP(o),f=cP(o),m=lP(o),h=uP(o),y=dP(o),g=pP(o),E=fP(o),v=[p,f,m,h,y,g,E].filter(Boolean);if(v.length!==1)throw new et(`unsupported or ambiguous prompt. ${ri}`);if(!mP(o,v[0]))throw new et(`unsupported or ambiguous prompt. ${ri}`);let S,I=v[0],k={side:i,coin:s,interval:a,risk:c,expiresAt:l,id:u,name:d,spec:I};I.kind==="ema_cross"?S=hP(k):I.kind==="rsi"?S=yP(k):I.kind==="open_interest"?S=bP(k):I.kind==="funding"?S=gP(k):S=EP(k);let A=Yd(S,{nowMs:n});if(!A.ok)throw new et(`draft failed validation: ${A.errors.map(w=>w.message).join("; ")}`);return Zd(mt(S,{nowMs:n}))}var et,WR,GR,KR,ri,YR,JR,XR,QR,wP,_0=T(()=>{so();et=class extends Error{constructor(t){super(t),this.name="StrategyDraftError"}},WR=new Set(["1m","3m","5m","15m","30m","1h","2h","4h","8h","12h","1d"]),GR=new Set(["BTC","ETH","SOL","HYPE"]),KR=/\b(mnemonic|private\s*key|privkey|seed\s*phrase|seed\b|api[_-]?key|secret\s*key|wallet\s*key|passphrase)\b/i,ri="Supported grammar: (1) EMA cross: <long|short> <COIN> when EMA <n> crosses <above|below> EMA <m> [on <interval>] [, exit on reverse] [, risk knobs]; (2) RSI: <long|short> <COIN> when RSI <n> <above|below> <threshold> [on <interval>] [, risk knobs]; (3) funding: <long|short> <COIN> when funding rate <above|below> <decimal|percent%> [on <interval>] [, risk knobs]; (4) open interest: <long|short> <COIN> when open interest <above|below> <non-negative number> [on <interval>] [, risk knobs]; (5) premium: <long|short> <COIN> when premium <above|below> <decimal|percent%> [on <interval>] [, risk knobs]; (6) oi delta: <long|short> <COIN> when oi delta <above|below> <number> [on <interval>] [, risk knobs]; (7) book imbalance: <long|short> <COIN> when book imbalance <above|below> <-1..1> [on <interval>] [, risk knobs]. Risk knobs: stop loss %, take profit %, leverage, position size %, max notional USD. Coins: BTC ETH SOL HYPE or uppercase token <=12 chars. Intervals: 1m 3m 5m 15m 30m 1h 2h 4h 8h 12h 1d.",YR=Object.freeze({maxLeverage:1,maxNotionalUsd:100,positionSizePct:5,stopLossPct:2,takeProfitPct:4,cooldownBars:1,maxDailyLossPct:3}),JR=36e5,XR=30*864e5,QR=864e5;wP=Object.freeze({funding:"fundingRate",open_interest:"openInterest",premium:"premium",oi_delta:"oiDelta",book_imbalance:"bookImbalance"})});import{createHash as AP}from"node:crypto";function C0(e){let t=String(e).toLowerCase();return t==="holdout"||t==="test"||t==="oos"||t.includes("holdout")||t.includes("oos")?!0:t==="testbars"||t.endsWith("testbars")||t.startsWith("test")||t.endsWith("test")?!t.includes("backtest"):!1}function R0(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function tp(e){if(e==null||typeof e!="object"||Object.isFrozen(e))return e;if(Array.isArray(e)){for(let t of e)tp(t);return Object.freeze(e)}for(let t of Object.keys(e))tp(e[t]);return Object.freeze(e)}function ds(e){if(Array.isArray(e))return e.map(ds);if(e!=null&&typeof e=="object"){let t={};for(let n of Object.keys(e).sort())t[n]=ds(e[n]);return t}return e}function wc(e){return JSON.stringify(ds(e))}function SP(e){let{min:t,max:n,step:r}=e;if(!(r>0)||t>n)return[];let o=[],i=Math.floor((n-t)/r+1e-9);for(let a=0;a<=i;a++){let c=t+a*r;if(c>n+1e-9)break;let l=Math.abs(c-Math.round(c))<1e-9?Math.round(c):Number(c.toPrecision(12));l<t-1e-9||l>n+1e-9||o.push(l)}if(o.length===0)return[];let s=o[o.length-1];if(Math.abs(s-n)>1e-9){let a=(n-t)/r;Math.abs(a-Math.round(a))<=1e-9&&o.push(n)}return o}function vP(e,t){if(e.length===0)return[];let n=[{}];for(let r of e){let o=t[r],i=[];for(let s of n)for(let a of o)i.push({...s,[r]:a});n=i}return n.sort((r,o)=>{let i=wc(r),s=wc(o);return i<s?-1:i>s?1:0}),n}function ep(e,t,n,r,o){let i=0;if(e==="maxDrawdownPct"){if(i=t.maxDrawdownPct-r.maxDrawdownPct,i!==0)return i<0}else if(i=t[e]-r[e],i!==0)return i>0;let s=wc(n),a=wc(o);return s<a}function P0(e,t,n={}){if(!R0(n))throw new TypeError("options must be a plain object");for(let S of Object.keys(n))if(C0(S))throw new TypeError(`options must not include holdout/test/oos key "${S}"`);let r=new Set(["maxTrials","objective","backtestOptions"]);for(let S of Object.keys(n))if(!r.has(S))throw new TypeError(`unknown option "${S}"`);let o=64;if("maxTrials"in n){let S=n.maxTrials;if(!Number.isInteger(S)||S<1||S>T0)throw new TypeError(`maxTrials must be an integer 1..${T0}`);o=S}let i=n.objective??"netPnlUsd";if(!N0.has(i))throw new TypeError(`objective must be one of ${[...N0].join("|")}`);let s=n.backtestOptions??{};if(!R0(s))throw new TypeError("backtestOptions must be a plain object");for(let S of Object.keys(s))if(C0(S))throw new TypeError(`backtestOptions must not include holdout/test/oos key "${S}"`);let a=mt(e),c=Object.keys(a.parameters).sort();if(c.length===0)throw new Error("optimizeStrategy requires at least one declared parameter");let l={},u=1;for(let S of c){let I=SP(a.parameters[S]);if(I.length===0)throw new Error(`parameter "${S}" produces an empty grid`);l[S]=I,u*=I.length}let d=vP(c,l);if(d.length===0)throw new Error("parameter grid is empty");let p=d.slice(0,o),f=[],m=null,h=null;for(let S of p){let I=cs(a,S),k=Nr(I,t,s);h==null&&(h=k.config);let A={netPnlUsd:k.metrics.netPnlUsd,netPnlPct:k.metrics.netPnlPct,maxDrawdownPct:k.metrics.maxDrawdownPct,winRate:k.metrics.winRate,profitFactor:k.metrics.profitFactor,tradeCount:k.metrics.tradeCount,sharpe:k.metrics.sharpe,turnoverUsd:k.metrics.turnoverUsd},w={parameters:{...S},metrics:A};f.push(w),(!m||ep(i,A,S,m.metrics,m.parameters))&&(m=w)}f.sort((S,I)=>ep(i,S.metrics,S.parameters,I.metrics,I.parameters)?-1:ep(i,I.metrics,I.parameters,S.metrics,S.parameters)?1:0);let y={...m.parameters},g=cs(a,y),E={strategyHash:Qo(a),compilerHash:ao,trainBarsHash:os(t),backtestConfig:h,objective:i,maxTrials:o,trialsRun:f.length,candidates:f,bestParameters:y,bestStrategy:g},v={id:AP("sha256").update(JSON.stringify(ds(E)),"utf8").digest("hex"),...E};return tp(ds(JSON.parse(JSON.stringify(v))))}var T0,N0,L0=T(()=>{co();so();mc();T0=256,N0=new Set(["netPnlUsd","profitFactor","sharpe","maxDrawdownPct"])});import rr from"node:fs";import Ec from"node:path";function Ac(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function On(e){return e==null?e:JSON.parse(JSON.stringify(e))}function IP(e){return String(e).toLowerCase().replace(/[^a-z0-9]/g,"")}function oi(e,t="record"){if(Array.isArray(e)){e.forEach((n,r)=>oi(n,`${t}[${r}]`));return}if(Ac(e))for(let[n,r]of Object.entries(e)){let o=IP(n);if(xP.some(i=>o.includes(i)))throw new Error(`shadow-store: forbidden secret-like field at ${t}.${n}`);oi(r,`${t}.${n}`)}}function kP(e){if(typeof e!="string"||!e||!Ec.isAbsolute(e))throw new Error("shadow-store: path must be an absolute path")}function $0(e){let t;try{t=rr.lstatSync(e)}catch(r){if(r&&r.code==="ENOENT")return;throw r}if(t.isSymbolicLink())throw new Error("shadow-store: store path must not be a symlink");if(!t.isFile())throw new Error("shadow-store: store path must be a regular file");if(t.mode&511&18)throw new Error("shadow-store: store file must not be group or world writable")}function OP(){return{version:rp,runners:[]}}function D0(e,t){let n;try{n=JSON.parse(e)}catch{throw new Error("shadow-store: malformed JSON")}if(!Ac(n))throw new Error("shadow-store: malformed JSON root");if(n.version!==rp)throw new Error(`shadow-store: unsupported version ${n.version}`);if(!Array.isArray(n.runners))throw new Error("shadow-store: runners must be an array");return oi(n,Ec.basename(t)),{version:rp,runners:n.runners.map(r=>On(r))}}function U0(e,t){oi(t,"store");let n=Ec.dirname(e);rr.mkdirSync(n,{recursive:!0,mode:448});let r=Ec.join(n,`.shadow-store.${process.pid}.${Date.now()}.tmp`),o=`${JSON.stringify(t)}
8
+ `;try{rr.writeFileSync(r,o,{mode:384,flag:"wx"}),rr.renameSync(r,e);try{rr.chmodSync(e,384)}catch{}}catch(i){try{rr.unlinkSync(r)}catch{}throw i}}function B0(e={}){let t=e.path;if(kP(t),$0(t),rr.existsSync(t)?D0(rr.readFileSync(t,"utf8"),t):U0(t,OP()),np.has(t))return np.get(t);let n=!1,r=[];function o(){if(n)return;let m=r.shift();if(m){n=!0;try{let h=m.fn();n=!1,m.resolve(h),o()}catch(h){n=!1,m.reject(h),o()}}}function i(m){if(!n&&r.length===0){n=!0;try{return m()}finally{n=!1,queueMicrotask(o)}}return new Promise((h,y)=>{r.push({fn:m,resolve:h,reject:y}),queueMicrotask(o)})}function s(){return $0(t),D0(rr.readFileSync(t,"utf8"),t)}function a(m){U0(t,m)}function c(m){if(!Ac(m)||typeof m.id!="string"||!m.id)throw new Error("shadow-store: create requires record with string id");oi(m,"record");let h=s();if(h.runners.some(g=>g.id===m.id))throw new Error(`shadow-store: runner id already exists: ${m.id}`);let y=On(m);return h.runners.push(y),a(h),On(y)}function l(m){let h=s().runners.find(y=>y.id===m);return h?On(h):null}function u(){return s().runners.map(m=>On(m))}function d(m,h){if(typeof h!="function")throw new Error("shadow-store: updater must be a function");let y=s(),g=y.runners.findIndex(S=>S.id===m);if(g<0)throw new Error(`shadow-store: runner not found: ${m}`);let E=On(y.runners[g]),v=h(E);if(!Ac(v)||v.id!==m)throw new Error("shadow-store: updater must return record with same id");return oi(v,"record"),y.runners[g]=On(v),a(y),On(y.runners[g])}function p(m){let h=s(),y=h.runners.findIndex(E=>E.id===m);if(y<0)throw new Error(`shadow-store: runner not found: ${m}`);let g=On(h.runners[y]);return g.status!=="stopped"&&(g.status="stopped",h.runners[y]=g,a(h)),On(h.runners[y])}let f={create(m){return i(()=>c(m))},get(m){return l(m)},list(){return u()},update(m,h){return i(()=>d(m,h))},stop(m){return i(()=>p(m))}};return np.set(t,f),f}var rp,xP,np,q0=T(()=>{rp=1,xP=["privatekey","secretkey","seed","mnemonic","passphrase","password","keystore","keymaterial","apikey","authtoken","accesstoken","refreshtoken","credential","bearer","signature","authorization","xprv","xpriv","wif"];np=new Map});import{createHash as sp}from"node:crypto";function op(e){return e==null?e:JSON.parse(JSON.stringify(e))}function ip(e){return Array.isArray(e)?e.map(ip):e&&typeof e=="object"?Object.fromEntries(Object.keys(e).sort().map(t=>[t,ip(e[t])])):e}function F0(e){if(!e||typeof e!="object"||Array.isArray(e))throw new TypeError("shadow-runner: record must be an object");return sp("sha256").update(JSON.stringify(ip(e))).digest("hex")}function _P(e,t,n,r,o){return sp("sha256").update(`${e}|${t}|${n}|${r}|${o}`).digest("hex")}function TP(e,t,n,r){return sp("sha256").update(`shadow|${e}|${t}|${n}|${r??""}`).digest("hex")}function NP(e){return e==="entryLong"||e==="exitShort"?"buy":e==="entryShort"||e==="exitLong"?"sell":e}function M0(e){return e==="entryLong"||e==="entryShort"}function ap({storePath:e,clock:t=Date.now}={}){if(typeof e!="string"||!e)throw new Error("shadow-runner: storePath required");let n=B0({path:e});function r({strategy:c,evidenceId:l=null}={}){let u=ht(c),d=l==null?null:String(l),p=n.list().filter(g=>g.status==="running"&&g.strategyHash===u.strategyHash&&g.compilerHash===u.compilerHash&&g.evidenceId===d).sort((g,E)=>g.createdAt-E.createdAt||g.id.localeCompare(E.id))[0];if(p)return op(p);let f=t(),m=TP(f,u.strategyHash,u.compilerHash,d),h=n.get(m);if(h)return op(h);let y={id:m,strategy:op(u.strategy),strategyHash:u.strategyHash,compilerHash:u.compilerHash,evidenceId:d,status:"running",cursor:null,intendedOrders:[],fills:[],missedFills:[],markouts:[],createdAt:f,updatedAt:f,position:null,cooldownBarsRemaining:0,cooldownStartT:null,lastProcessedBarIndex:-1};return n.create(y)}function o(c){return n.get(c)}function i(){return n.list()}function s(c){return n.stop(c)}function a(c,l,{markoutHorizons:u=[1,4,12]}={}){if(!Array.isArray(l))throw new TypeError("shadow-runner: bars must be an array");return n.update(c,d=>{if(d.status!=="running")throw new Error("shadow-runner: runner is stopped");if(l.length===0)return d;let f=ht(d.strategy).evaluateAll(l),m=new Map;for(let O=0;O<l.length;O++)m.set(l[O].t,O);let h=d.cursor,y=[];for(let O=0;O<l.length;O++){let F=l[O].t;(h==null||F>h)&&y.push(O)}if(y.length===0)return d;let g=new Map(d.intendedOrders.map(O=>[O.id,O])),E=new Set(d.fills.map(O=>O.orderId)),v=new Map(d.missedFills.map(O=>[O.orderId,O])),S=(O,F)=>`${O}|${F}`,I=new Map(d.markouts.map(O=>[S(O.orderId,O.horizon),O])),k=d.position?{...d.position}:null,A=Number.isInteger(d.cooldownBarsRemaining)?Math.max(0,d.cooldownBarsRemaining):0,w=Number.isFinite(d.cooldownStartT)?d.cooldownStartT:null;function b({action:O,signalBarT:F,signalIndex:H}){let V=NP(O),D=_P(d.id,d.strategyHash,F,V,O);if(g.has(D))return g.get(D);let _=H+1,$=_<l.length,q={id:D,action:O,type:O,side:V,signalBarT:F,fillBarT:$?l[_].t:null,status:$?"open":"missed"};return g.set(D,q),d.intendedOrders.push(q),q}function x(O,F,H){if(E.has(O.id))return;let V={orderId:O.id,action:M0(O.action)?"entry":"exit",side:O.side,price:F.o,barT:F.t,signalBarT:O.signalBarT,barIndex:H};if(d.fills.push(V),E.add(O.id),O.status="filled",O.fillBarT=F.t,v.has(O.id)&&(v.delete(O.id),d.missedFills=d.missedFills.filter(D=>D.orderId!==O.id)),M0(O.action)){k={side:O.action==="entryLong"?"long":"short",entryOrderId:O.id,entryBarT:F.t,entryPrice:F.o,entryBarIndex:H};for(let D of u){let _=S(O.id,D);if(I.has(_))continue;let $={orderId:O.id,horizon:D,entryBarT:F.t,entryPrice:F.o,side:k.side,status:"pending",close:null,barT:null};I.set(_,$),d.markouts.push($)}}else k=null,A=Number(d.strategy?.risk?.cooldownBars)||0,w=F.t}function C(O){if(E.has(O.id)||v.has(O.id))return;let F={orderId:O.id,action:O.action,side:O.side,signalBarT:O.signalBarT,status:"missed"};v.set(O.id,F),d.missedFills.push(F),O.status="missed"}for(let O of d.intendedOrders){if(O.status==="filled"||E.has(O.id))continue;let F=m.get(O.signalBarT);if(F==null)continue;let H=F+1;H<l.length&&(h==null||l[H].t>h)&&x(O,l[H],H)}for(let O of y){let F=l[O],H=f[O].signals,V=k,D=$=>{if(k||A>0&&(w==null||F.t>=w))return;let M=b({action:$,signalBarT:F.t,signalIndex:O}),ue=O+1;ue<l.length?x(M,l[ue],ue):C(M)},_=$=>{if(!k||k.side==="long"&&$!=="exitLong"||k.side==="short"&&$!=="exitShort")return;let q=b({action:$,signalBarT:F.t,signalIndex:O}),M=O+1;M<l.length?x(q,l[M],M):C(q)};V?(H.exitLong&&_("exitLong"),H.exitShort&&_("exitShort")):H.entryLong&&H.entryShort||(H.entryLong&&D("entryLong"),H.entryShort&&D("entryShort")),A>0&&w!=null&&F.t>=w&&(A-=1,A===0&&(w=null)),d.cursor=F.t,d.lastProcessedBarIndex=O}for(let O of d.markouts){if(O.status!=="pending")continue;let F=d.fills.find(D=>D.orderId===O.orderId&&D.action==="entry");if(!F)continue;let H=m.get(F.barT);if(H==null)continue;let V=H+O.horizon;if(V<l.length){O.close=l[V].c,O.barT=l[V].t,O.status="filled";let D=O.entryPrice;O.markout=O.side==="long"?(O.close-D)/D:(D-O.close)/D}}return d.position=k,d.cooldownBarsRemaining=A,d.cooldownStartT=w,d.updatedAt=t(),d})}return{start:r,step:a,list:i,get:o,stop:s}}var j0=T(()=>{co();q0()});var V0={};Q(V0,{runStrategyOperation:()=>BP});import CP from"node:os";import RP from"node:path";function ps(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function LP(e){return String(e).toLowerCase().replace(/[^a-z0-9]/g,"")}function lp(e){if(Array.isArray(e)){for(let t of e)lp(t);return}if(ps(e))for(let[t,n]of Object.entries(e)){if(PP.some(r=>LP(t).includes(r)))throw new Error(`strategy service: secret-like field "${t}" is forbidden`);lp(n)}}function $P(e){if(!ps(e))throw new TypeError("strategy input must be a plain object");return lp(e),e}function DP(e,t={}){if(t.nowMs!==void 0){if(!Number.isInteger(t.nowMs))throw new TypeError("nowMs must be an integer epoch milliseconds");return t.nowMs}let n=Date.now();if(e.nowMs===void 0||e.nowMs===null)return n;if(!Number.isInteger(e.nowMs))throw new TypeError("nowMs must be an integer epoch milliseconds");if(Math.abs(e.nowMs-n)>12e4)throw new Error("nowMs outside allowed wall-clock skew (120s); omit nowMs to use server time");return e.nowMs}async function cp(e,t,n,r){if(Array.isArray(t.bars))return t.bars;let o=Fd(e.venue),i=n.fetchBars??o.fetchBars;if(typeof i!="function")throw new Error(`strategy venue ${o.id} does not support history`);n.signal?.throwIfAborted?.();let s=await i({coin:e.market.coin,interval:e.market.interval,count:t.count??1500,endTime:t.endTime??r},{signal:n.signal});n.signal?.throwIfAborted?.();let a=Array.isArray(s)?s:s?.bars;if(!Array.isArray(a))throw new Error("strategy history provider returned no bars");return a}function up(e,t){let n=e.backtestOptions??{};if(!ps(n))throw new TypeError("backtestOptions must be a plain object");return{...n,nowMs:t}}function H0(e,t,n,r,o={}){let i=e.evidenceOptions??{};if(!ps(i))throw new TypeError("evidenceOptions must be a plain object");return{...i,...o,strategy:t,bars:n,backtestOptions:up(e,r)}}function z0(){return RP.join(CP.homedir(),".oracle","strategy-shadow.json")}function UP(e,t){return{perStrategyNotionalUsd:e.risk.maxNotionalUsd,maxLeverage:e.risk.maxLeverage,dailyLossCapUsd:e.risk.maxNotionalUsd*(e.risk.maxDailyLossPct/100),chainAllowlist:[e.venue],assetAllowlist:[e.market.coin],expiresAt:Math.min(e.risk.expiresAt,t+864e5),killSwitchRequired:!0}}async function BP(e,t={},n={}){n.signal?.throwIfAborted?.();let r=$P(t),o=DP(r,n);if(e==="draft")return{strategy:O0(r.prompt,{nowMs:o})};if(e==="validate"){let i=ht(r.strategy);if(i.strategy.risk.expiresAt<=o)throw new Error("strategy is expired");return{valid:!0,strategy:i.strategy,strategyHash:i.strategyHash,compilerHash:i.compilerHash,compilerVersion:i.compilerVersion,requiredSeries:i.requiredSeries}}if(e==="backtest"||e==="evidence"){let i=ht(r.strategy),s=await cp(i.strategy,r,n,o);us(i,s);let a=Dd(H0(r,i.strategy,s,o));return e==="evidence"?a:{backtest:Nr(i.strategy,s,up(r,o)),evidence:a}}if(e==="optimize"){let i=ht(r.strategy),s=await cp(i.strategy,r,n,o);us(i,s);let a=r.trainFraction,c=r.evidenceOptions?.trainFraction;if(a!=null&&c!=null&&a!==c)throw new TypeError("conflicting trainFraction controls are forbidden");let l=a??c??.7;if(typeof l!="number"||l<=0||l>=1)throw new TypeError("trainFraction must be in (0,1)");let u=s.slice(0,Math.floor(s.length*l)),d=r.options??{};if(!ps(d))throw new TypeError("options must be a plain object");let p=P0(i.strategy,u,{...d,...r.maxTrials==null?{}:{maxTrials:r.maxTrials},backtestOptions:up(r,o)}),f=p.bestStrategy;return{strategy:f,optimization:p,evidence:Dd(H0(r,f,s,o,{trainFraction:l}))}}if(e==="shadow"){let i=ap({storePath:n.storePath??z0(),clock:()=>o}),s=r.action;if(s==="start")return await i.start({strategy:r.strategy,evidenceId:r.evidenceId??r.evidence?.id??null});if(s==="list")return await i.list();if(s==="get")return await i.get(r.id);if(s==="stop")return await i.stop(r.id);if(s==="step"){let a=await i.get(r.id);if(!a)throw new Error(`shadow runner not found: ${r.id}`);let c=await cp(a.strategy,r,n,o);return us(ht(a.strategy),c),await i.step(r.id,c,r.stepOptions??{})}throw new Error(`unknown shadow action: ${s}`)}if(e==="prepare"){let i=ht(r.strategy),s=Fd(i.strategy.venue);if(typeof r.shadowId!="string"||!r.shadowId)throw new Error("strategy prepare requires a matching shadow runner id");let c=await ap({storePath:n.storePath??z0(),clock:()=>o}).get(r.shadowId);if(!c)throw new Error("strategy prepare shadow runner not found");if(c.status!=="running")throw new Error("strategy prepare requires an active shadow runner");if(!Number.isFinite(c.cursor))throw new Error("strategy prepare requires a stepped shadow runner");if(c.strategyHash!==i.strategyHash||c.compilerHash!==i.compilerHash)throw new Error("strategy prepare shadow runner does not match strategy artifacts");if(c.evidenceId!==r.evidence?.id)throw new Error("strategy prepare shadow runner does not match evidence artifact");let l=r.caps??UP(i.strategy,o);return s.prepareIntent({strategy:i.strategy,evidence:r.evidence,shadow:{id:c.id,stateHash:F0(c),status:c.status,cursor:c.cursor,updatedAt:c.updatedAt},caps:l,nowMs:o,env:n.env??process.env})}throw new Error(`unknown strategy operation: ${e}`)}var PP,W0=T(()=>{mc();co();Ud();_0();L0();j0();jd();PP=["privatekey","secretkey","seed","mnemonic","passphrase","password","keystore","keymaterial","apikey","authtoken","accesstoken","refreshtoken","credential","bearer","signature","authorization","xprv","xpriv","wif"]});var iw={};Q(iw,{DEFAULT_CROSS_CHAIN_SOURCES:()=>Z0,DEFAULT_SAME_CHAIN_SOURCES:()=>Q0,NATIVE_TOKEN:()=>dp,canonicalJson:()=>tw,hashFirmQuote:()=>ow,hashRfqIntent:()=>rw,normalizeFirmQuote:()=>fp,normalizeRfqIntent:()=>zP,sha256Hex:()=>fs});import{createHash as qP}from"node:crypto";import{getAddress as X0,isAddress as pp}from"ethers";function xe(e,t="invalid"){throw new Error(`rfq: ${e} ${t}`)}function K0(e,t){let n=Number(e);return(!Number.isSafeInteger(n)||n<=0)&&xe(t,"must be a positive chainId"),n}function Sc(e,t){let n=String(e??"").trim();return(!MP.test(n)||BigInt(n)<=0n)&&xe(t,"must be a positive integer string"),n}function FP(e,t){return e==null||e===""?null:Sc(e,t)}function Y0(e,t){let n=String(e??"").trim();return n.toLowerCase()===dp.toLowerCase()?dp:(pp(n)||xe(t,"must be an EVM address or native token sentinel"),X0(n))}function ew(e,t){let n=String(e??"").trim();return pp(n)||xe(t,"must be an EVM address"),X0(n)}function jP(e,t){return e==null||e===""?null:ew(e,t)}function J0(e,t,n){return e===void 0?[...n]:(Array.isArray(e)||xe(t,"must be an array"),e.map(r=>String(r).trim()).filter(Boolean))}function HP(e,{nowMs:t,maxDeadlineMs:n},r){let o=Number(e);return Number.isFinite(o)||xe(r,"must be a finite millisecond timestamp"),o<=t&&xe(r,"expired"),o>t+n&&xe(r,"exceeds maxDeadlineMs"),Math.floor(o)}function ii(e){if(Array.isArray(e))return e.map(ii);if(e&&typeof e=="object"){let t={};for(let n of Object.keys(e).sort())e[n]!==void 0&&(t[n]=ii(e[n]));return t}return e}function tw(e){return JSON.stringify(ii(e))}function fs(e){return`0x${qP("sha256").update(tw(e)).digest("hex")}`}function nw(e,t){let n={...e};for(let r of t)delete n[r];return n}function rw(e){return fs(nw(e,["intentHash"]))}function ow(e){return fs(nw(e,["firmQuoteHash"]))}function zP(e={},t={}){let n=Number(t.nowMs??Date.now()),r=Number(t.maxDeadlineMs??1800*1e3);(!Number.isFinite(n)||!Number.isFinite(r)||r<=0)&&xe("time","is invalid");let o=K0(e.fromChainId??e.fromChain,"fromChainId"),i=K0(e.toChainId??e.toChain,"toChainId"),a=o===i?Q0:Z0,c={kind:"rfq-intent",version:1,fromChainId:o,toChainId:i,sellToken:Y0(e.sellToken??e.tokenIn??e.fromToken,"sellToken"),buyToken:Y0(e.buyToken??e.tokenOut??e.toToken,"buyToken"),sellAmount:Sc(e.sellAmount??e.amountIn??e.fromAmount,"sellAmount"),receiver:ew(e.receiver??e.recipient??e.to,"receiver"),deadlineMs:HP(e.deadlineMs??e.deadline??e.expiresAtMs,{nowMs:n,maxDeadlineMs:r},"deadline"),minBuyAmount:FP(e.minBuyAmount??e.minOut??e.amountOutMin,"minBuyAmount"),allowedSources:J0(e.allowedSources,"allowedSources",a),allowedRouters:J0(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)?ii(e.metadata):{}};return c.slippageBps!=null&&(!Number.isInteger(c.slippageBps)||c.slippageBps<0||c.slippageBps>1e4)&&xe("slippageBps","must be 0 to 10000"),c.intentId=e.intentId?String(e.intentId):fs({seed:"rfq-intent",intent:c}).slice(0,34),c.intentHash=rw(c),Object.freeze(c)}function VP(e){return(!e||typeof e!="object"||Array.isArray(e))&&xe("artifact","required"),e.typedDataHash!=null&&!G0.test(String(e.typedDataHash))&&xe("artifact.typedDataHash","must be bytes32"),e.calldataHash!=null&&!G0.test(String(e.calldataHash))&&xe("artifact.calldataHash","must be bytes32"),e.to!=null&&!pp(String(e.to))&&xe("artifact.to","must be an address"),e.data!=null&&!/^0x(?:[0-9a-fA-F]{2})*$/.test(String(e.data))&&xe("artifact.data","must be hex"),ii(e)}function fp(e,t={},n={}){(!e||e.kind!=="rfq-intent")&&xe("intent","required");let r=Number(n.nowMs??Date.now()),o=Number(t.expiryMs??t.expiresAtMs??t.validUntilMs);Number.isFinite(o)||xe("quote expiry","required"),o<=r&&xe("quote","expired"),o>e.deadlineMs&&xe("quote expiry","exceeds intent deadline");let i=String(t.source??t.provider??"").trim();i||xe("source","required"),e.allowedSources.includes(i)||xe("source","not allowed by intent");let s=Sc(t.amountOut??t.buyAmount,"amountOut"),a=Sc(t.minBuyAmount??t.minOut??s,"minBuyAmount");BigInt(a)>BigInt(s)&&xe("minBuyAmount","exceeds amountOut");let c=VP(t.artifact??t.executableArtifact??t.transaction??t.typedData),l=Number(t.quotedAtMs??t.timestampMs??n.nowMs??Date.now());Number.isFinite(l)||xe("quotedAtMs","must be finite");let u=jP(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)?ii(t.metadata):{}};return d.quoteId||(d.quoteId=fs({seed:"rfq-quote",out:d}).slice(0,34)),d.firmQuoteHash=ow(d),Object.freeze(d)}var dp,Q0,Z0,G0,MP,mp=T(()=>{dp="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",Q0=Object.freeze(["lifi","paraswap","0x","cow","uniswap-v3"]),Z0=Object.freeze(["lifi"]),G0=/^0x[0-9a-fA-F]{64}$/,MP=/^\d+$/});var uw={};Q(uw,{executeRfqCandidates:()=>cw,rankRfqQuotes:()=>lw,requestRfqQuotes:()=>KP,sourceCandidates:()=>aw});function ms(e,t){return Array.isArray(e?.allowedSources)&&e.allowedSources.includes(t)}function sw(e,t){return String(e?.[t]??"").trim()}function hs(e,t){return Object.freeze({source:e,run:t})}function aw(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??ot,i=Number(e.fromChainId)===Number(e.toChainId),s=[];return ms(e,"lifi")&&s.push(hs("lifi",async()=>{let c=await(r.lifiQuote??Yr)({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 WP(t,c.transactionRequest.data):void 0,route:c},metadata:{tool:c?.tool??c?.toolDetails?.name??null}}})),i&&(ms(e,"paraswap")&&s.push(hs("paraswap",async()=>{let c=await(r.paraswapPrice??Oo)({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}}})),ms(e,"0x")&&(sw(n,"ZEROX_API_KEY")||sw(n,"0X_API_KEY")||r.zeroxQuote)&&s.push(hs("0x",async()=>{let c=await(r.zeroxQuote??_o)({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}}})),ms(e,"cow")&&s.push(hs("cow",async()=>{let c=await(r.cowQuote??Jr)({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}}})),ms(e,"uniswap-v3")&&o[Number(e.fromChainId)]&&s.push(hs("uniswap-v3",async()=>{let c=await(r.uniV3QuoteExactIn??Gr)({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 WP(e,t){return`0x${(await import("node:crypto")).createHash("sha256").update(String(t)).digest("hex")}`}async function GP(e,t){return Promise.race([Promise.resolve().then(e.run),new Promise((n,r)=>setTimeout(()=>r(new Error(`${e.source}: timeout`)),t))])}async function cw(e,t,n={}){let r=Number(n.timeoutMs??12e3),o=await Promise.allSettled(t.map(a=>GP(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(fp(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 lw(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 KP(e,t={}){let n=aw(e,t),{quotes:r,failed:o}=await cw(e,n,t),i=lw(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}}var dw=T(()=>{$i();ha();ga();va();Ri();mp()});var pw={};Q(pw,{prepareBestBridgeRoute:()=>ZP,supportedBridgePreparers:()=>QP});function QP(){return Object.keys(vc)}async function ZP(e,t={}){let{taker:n,fromChainId:r,toChainId:o}=e;if(!n)throw new Error("prepareBestBridgeRoute requires taker: bridge transactions are built FOR an address, and the quote-only placeholder must never end up in one");if(!YP.test(n))throw new Error(`taker must be a valid 20-byte address, got "${n}"`);if(JP.has(n.toLowerCase()))throw new Error(`taker "${n}" is a placeholder/burn address. Bridging to it would send funds to an address nobody controls, on a chain where you cannot undo it.`);let i=await Ui(e,t);if(!i.best)return{ok:!1,reason:"no source returned a usable bridge route",comparison:i};let s=e.source||i.best.source,a=i.routes.find(y=>y.source===s);if(!a)return{ok:!1,reason:`source "${s}" returned no usable route`,comparison:i};let c=vc[s];if(!c){let y=i.routes.find(g=>vc[g.source]&&g.source!==s);return{ok:!1,reason:`${s} won the comparison but has no bridge prepare path in this build. `+(y?`Next preparable route is ${y.source}; pass source:"${y.source}".`:"No route in this comparison can be prepared."),failureKind:"no-prepare-path",...y?{alternative:y.source}:{},winner:s,comparison:i}}let l;try{l=await c(e,t)}catch(y){let g=typeof y?.body=="string"?y.body:y?.body?JSON.stringify(y.body):"",E=[String(y?.message||y),g].filter(Boolean).join(" :: "),v=/allowance/i.test(E),S=!v&&/not enough|insufficient|balance/i.test(E),I=i.routes.find(k=>vc[k.source]&&k.source!==s);return{ok:!1,reason:v?`${s} will not build calldata until the token approval exists on-chain. Approve first, then prepare again. Underlying: ${E}`:S?`${s} refused to build: ${E}. Quoting works for any address; preparing needs the real funded wallet on chain ${r}.`:`${s} bridge prepare failed: ${E}`,failureKind:v?"approval-required-first":S?"taker-not-funded":"provider-error",...I?{alternative:I.source}:{},comparison:i}}let u=l.transactions||[];if(!u.length)return{ok:!1,reason:`${s} returned no executable transaction for this route`,failureKind:"provider-error",comparison:i};let d=u.filter(y=>y.chainId!=null&&Number(y.chainId)!==Number(r));if(d.length)return{ok:!1,reason:`${s} returned a transaction for chain ${d[0].chainId} but the origin chain is ${r}. Refusing to hand over a mismatched artifact.`,failureKind:"chain-mismatch",comparison:i};let p=e.driftToleranceBps??XP,f=null,m=null;if(l.amountOut!=null&&a.grossOut!=null)try{let y=BigInt(a.grossOut),g=BigInt(l.amountOut);y>0n&&(f=Number((g-y)*10000n/y),f<-p&&(m=`route moved ${(f/100).toFixed(2)}% against you since the comparison (tolerance ${(p/100).toFixed(2)}%). Re-compare before signing.`))}catch{}let h=[...m?[m]:[],...i.warnings||[],`Bridging is NOT atomic: the origin transaction succeeding does not mean funds arrived on chain ${o}. Expect ~${l.durationSeconds!=null?`${l.durationSeconds}s`:"minutes"} before the destination credits, and do not re-send if it is pending.`];return u.length>1&&h.push(`This route needs ${u.length} transactions signed IN ORDER. Signing only the first leaves funds approved but not bridged.`),me({ok:!0,chosen:{source:s,wasWinner:s===i.best.source,netOut:a.netOut,grossOut:a.grossOut,gasUsd:a.gasUsd},artifactKind:"unsigned-transaction-sequence",fromChainId:Number(r),toChainId:Number(o),transactionCount:u.length,transactions:u,requiresApproval:l.requiresApproval??null,minOut:l.minOut??null,durationSeconds:l.durationSeconds??null,destination:u[0]?.to??null,unsigned:!0,signedBy:"user-wallet",driftBps:f,warnings:h,runnersUp:i.routes.filter(y=>y.source!==s).map(y=>({source:y.source,netOut:y.netOut,gasUsd:y.gasUsd})),comparison:{rankedOn:i.rankedOn,sourcesAnswered:i.sourcesAnswered,sourcesTried:i.sourcesTried,improvementBps:i.improvementBps},note:`UNSIGNED. ${u.length} transaction(s) on chain ${r}, crediting chain ${o}. Verify every destination address before signing.`},{provider:"router",kind:"best-bridge"})}var YP,JP,XP,vc,fw=T(()=>{Po();rt();YP=/^0x[0-9a-fA-F]{40}$/,JP=new Set(["0x0000000000000000000000000000000000000000","0x000000000000000000000000000000000000dead","0x0000000000000000000000000000000000000001","0x00000000000000000000000000000000000a1ce5"].map(e=>e.toLowerCase())),XP=100,vc={relay:async({fromChainId:e,toChainId:t,tokenIn:n,tokenOut:r,amountIn:o,taker:i},s)=>{let{relayPrepare:a}=await Promise.resolve().then(()=>(ka(),Ia)),c=await a({user:i,originChainId:e,destinationChainId:t,originCurrency:n,destinationCurrency:r,amount:String(o)},s);return{transactions:c.transactions||[],amountOut:c.quote?.details?.currencyOut?.amount??null,minOut:c.quote?.details?.currencyOut?.minimumAmount??null,durationSeconds:c.quote?.details?.timeEstimate??null}},lifi:async({fromChainId:e,toChainId:t,tokenIn:n,tokenOut:r,amountIn:o,taker:i,isHolder:s},a)=>{let{lifiPrepare:c}=await Promise.resolve().then(()=>($i(),ru)),l=await c({fromChain:e,toChain:t,fromToken:n,toToken:r,fromAmount:o,fromAddress:i,isHolder:s,feeAction:"bridge"},a);return{transactions:l.transaction?[l.transaction]:[],requiresApproval:l.requiresApproval??null,amountOut:l.quote?.estimate?.toAmount??null,minOut:l.quote?.estimate?.toAmountMin??null,durationSeconds:l.quote?.estimate?.executionDuration??null}}}});var yw={};Q(yw,{buildTwapSchedule:()=>hw,normalizeTwapParams:()=>mw,prepareTwapChunk:()=>iL,simulateTwap:()=>sL});function mw(e={}){let t=Math.max(eL,Math.min(tL,Number(e.splits)||rL)),n=Math.max(.1,Number(e.windowHours)||oL),r=Math.max(nL,n*3600),o=BigInt(e.amount)/BigInt(t),i=Math.floor(r/t),s=Number(e.slippageBps)||100;if(!e.chainId)throw new Error("twap requires chainId");if(!e.tokenIn||!e.tokenOut)throw new Error("twap requires tokenIn and tokenOut");if(!e.taker)throw new Error("twap requires taker address");if(BigInt(e.amount)<=0n)throw new Error("twap amount must be positive");return{chainId:Number(e.chainId),tokenIn:String(e.tokenIn),tokenOut:String(e.tokenOut),amount:String(e.amount),splits:t,chunkSize:String(o),windowHours:n,windowSec:r,intervalSec:i,taker:String(e.taker),slippageBps:s,status:"planned",createdAt:new Date().toISOString()}}function hw(e){let t=mw(e),n=Math.floor(Date.now()/1e3),r=[];for(let o=0;o<t.splits;o++)r.push({splitIndex:o+1,executeAfter:new Date((n+o*t.intervalSec)*1e3).toISOString(),chunkSize:t.chunkSize});return{params:t,schedule:r}}async function iL(e,t,{chainId:n,tokenIn:r,tokenOut:o,chunkSize:i,taker:s,slippageBps:a}=e.params){if(t<1||t>e.params.splits)throw new Error(`splitIndex ${t} out of range 1-${e.params.splits}`);let c=await Ro({chainId:n,tokenIn:r,tokenOut:o,amountIn:i,taker:s}),l=me(c.transaction??c.tx,{chainId:n,taker:s,tokenIn:r,tokenOut:o,amountIn:i,slippageBps:a,kind:"twap",splitIndex:t,totalSplits:e.params.splits});return{splitIndex:t,chunkSize:i,quote:{amountOut:c.amountOut??c.quote?.amountOut,source:c.source??c.venue,priceImpact:c.priceImpact},...l}}async function sL(e,{quoteFn:t=Ro,...n}={}){let r=hw(e),o=[],i=0n,s="unknown";for(let c=0;c<r.params.splits;c++)try{let l=await t({chainId:r.params.chainId,tokenIn:r.params.tokenIn,tokenOut:r.params.tokenOut,amountIn:r.params.chunkSize,taker:r.params.taker},n),u=BigInt(l.amountOut??l.quote?.amountOut??"0");i+=u,s=l.source??l.venue??s,o.push({splitIndex:c+1,amountOut:String(u),source:l.source??l.venue})}catch(l){if(n.signal?.aborted)throw n.signal.reason||l;o.push({splitIndex:c+1,error:String(l.message||l).slice(0,200)})}let a=i>0n?(Number(i)/Number(BigInt(r.params.amount))).toFixed(6):null;return{params:r.params,schedule:r.schedule,totalOut:String(i),averagePrice:a,bestSource:s,chunks:o,simulatedAt:new Date().toISOString()}}var eL,tL,nL,rL,oL,gw=T(()=>{Po();rt();eL=2,tL=100,nL=60,rL=10,oL=6});async function Ew({srcChainId:e,srcChainTokenIn:t,srcChainTokenInAmount:n,dstChainId:r,dstChainTokenOut:o,slippage:i=100,affiliateFeePercent:s="0"}={},a={}){if(!e||!r||!t||!o||!n)return{error:"debridge quote requires srcChainId, dstChainId, srcChainTokenIn, dstChainTokenOut, srcChainTokenInAmount"};if(!bw.has(Number(e))||!bw.has(Number(r)))return{error:`debridge: unsupported chain pair ${e} -> ${r}`};try{let c={srcChainId:String(e),srcChainTokenIn:t,srcChainTokenInAmount:String(n),dstChainId:String(r),dstChainTokenOut:o,slippage:i,affiliateFeePercent:s},l=await R(`${ww}/dln/order/quote`,{...a,method:"POST",body:JSON.stringify(c),headers:{"content-type":"application/json",...a.headers||{}}});return l.error?{error:String(l.error)}:{estimation:l.estimation??{},order:l.order??{},fixFee:l.fixFee??"0"}}catch(c){return{error:String(c.message||c).slice(0,200)}}}async function Aw(){try{return{ok:!0,chainCount:(await R(`${ww}/supported-chains-info`))?.chains?.length??0}}catch(e){return{ok:!1,error:String(e.message||e).slice(0,160)}}}var ww,bw,Sw=T(()=>{Y();rt();ww="https://dln.debridge.finance/v1.0",bw=new Set([1,10,56,137,8453,42161,43114,59144,534352,7777777,324,5e3,1101,81457])});async function xw({active:e=!0}={},t={}){let n=Date.now();if(si.size&&n-vw<aL)return[...si.values()];try{let r=await R(`${hp}/exchange/currencies?active=${e?"true":"false"}`,t);si.clear();for(let o of r??[])si.set(String(o.ticker).toLowerCase(),o);return vw=n,r??[]}catch(r){return si.size?[...si.values()]:{error:String(r.message||r).slice(0,200)}}}async function cL(e,t,n={}){if(!e||!t)return{error:"changenow minAmount requires fromTicker and toTicker"};try{return{minAmount:(await R(`${hp}/exchange/min-amount/${encodeURIComponent(e)}_${encodeURIComponent(t)}`,n))?.minAmount??"0"}}catch(r){return{error:String(r.message||r).slice(0,200)}}}async function lL(e,t,n,{flow:r="standard"}={},o={}){if(!e||!t||!n)return{error:"changenow estimate requires fromTicker, toTicker, fromAmount"};try{let i=new URLSearchParams({fromCurrency:String(e).toLowerCase(),toCurrency:String(t).toLowerCase(),fromAmount:String(n),flow:r}),s=await R(`${hp}/exchange/estimated-amount?${i}`,o);return{fromAmount:s?.fromAmount,toAmount:s?.toAmount,rate:s?.rate,flow:s?.flow??r}}catch(i){return{error:String(i.message||i).slice(0,200)}}}async function Iw({fromTicker:e,toTicker:t,fromAmount:n,flow:r}={},o={}){if(!e||!t)return{error:"changenow quote requires fromTicker and toTicker"};let i=await cL(e,t,o);if(i.error)return i;let s=n??i.minAmount,a=await lL(e,t,s,{flow:r},o);if(a.error)return a;let c=await xw({},o),l=c.find(d=>String(d?.ticker).toLowerCase()===String(e).toLowerCase()),u=c.find(d=>String(d?.ticker).toLowerCase()===String(t).toLowerCase());return{provider:"changenow",fromTicker:e,toTicker:t,fromAmount:s,toAmount:a.toAmount,estimatedRate:a.rate,minAmount:i.minAmount,flow:a.flow,networkFee:l?.networkFee??null,kycRequired:l?.kycRequired??u?.kycRequired??!1,riskDisclosure:"ChangeNOW is a centralized swap service. Funds are sent to a ChangeNOW deposit address. Not self-custodial during the swap window."}}async function kw(){try{let e=await xw();return e?.error?{ok:!1,error:e.error}:{ok:!0,currencyCount:Array.isArray(e)?e.length:0}}catch(e){return{ok:!1,error:String(e.message||e).slice(0,160)}}}var hp,si,vw,aL,Ow=T(()=>{Y();hp="https://api.changenow.io/v2",si=new Map,vw=0,aL=6e5});async function _w({fromChain:e,toChain:t,fromToken:n,toToken:r,fromAmount:o,fromAddress:i,slippage:s=1}={},a={}){if(!e||!t||!n||!r||!o||!i)return{error:"squid quote requires fromChain, toChain, fromToken, toToken, fromAmount, fromAddress"};try{let c={fromChain:e,toChain:t,fromToken:n,toToken:r,fromAmount:String(o),fromAddress:i,slippage:s},l=await R(`${uL}/route`,{...a,method:"POST",body:JSON.stringify(c),headers:{"content-type":"application/json",...a.headers||{}}});return{route:l?.route??{},toAmount:l?.route?.estimate?.toAmount,fee:l?.route?.estimate?.feeCosts}}catch(c){return{error:String(c.message||c).slice(0,200)}}}var uL,Tw=T(()=>{Y();uL="https://api.squidrouter.com/v1"});async function Nw({srcChainId:e,dstChainId:t,token:n,amount:r,dstGasForCall:o=0,minAmountOut:i="0"}={},s={}){if(!e||!t||!n||!r)return{error:"stargate quote requires srcChainId, dstChainId, token, amount"};try{let a=new URLSearchParams({srcChainId:String(e),dstChainId:String(t),token:n,amount:String(r),dstGasForCall:String(o),minAmountOut:String(i)}),c=await R(`${dL}/quote?${a}`,s);return{amountOut:c?.amountOut,fee:c?.fee,estimatedTime:c?.estimatedTime}}catch(a){return{error:String(a.message||a).slice(0,200)}}}var dL,Cw=T(()=>{Y();dL="https://api.stargate.finance"});async function Rw({fromAsset:e,toAsset:t,amount:n,destination:r}={},o={}){if(!e||!t||!n)return{error:"thorchain quote requires fromAsset, toAsset, amount"};try{let i=new URLSearchParams({from_asset:e,to_asset:t,amount:String(n),destination:r||""}),s=await R(`${pL}/quote/swap?${i}`,o);return{expectedAmountOut:s?.expected_amount_out,fees:s?.fees,slippageBps:s?.slippage_bps,inboundAddress:s?.inbound_address,memo:s?.memo,estimatedTime:s?.total_swap_seconds?`${Math.round(s.total_swap_seconds/60)} min`:"unknown"}}catch(i){return{error:String(i.message||i).slice(0,200)}}}var pL,Pw=T(()=>{Y();pL="https://midgard.ninerealms.com/v2"});async function Lw({fromChainId:e,toChainId:t,fromToken:n,toToken:r,fromAmount:o,userAddress:i}={},s={}){if(!e||!t||!n||!r||!o||!i)return{error:"bungee quote requires fromChainId, toChainId, fromToken, toToken, fromAmount, userAddress"};try{let a=new URLSearchParams({fromChainId:String(e),toChainId:String(t),fromTokenAddress:n,toTokenAddress:r,fromAmount:String(o),userAddress:i,sort:"output",singleTxOnly:"false"}),c=await R(`${fL}/quote?${a}`,s);return{amountOut:c?.result?.toAmount,feeUsd:c?.result?.totalGasFeesInUsd,route:c?.result?.route,estimatedTime:c?.result?.serviceTime?`${c.result.serviceTime}s`:"unknown"}}catch(a){return{error:String(a.message||a).slice(0,200)}}}var fL,$w=T(()=>{Y();fL="https://api.socket.tech/v2"});async function Dw({originDomain:e,destinationDomain:t,originToken:n,destinationToken:r,amount:o}={},i={}){if(!e||!t||!n||!r||!o)return{error:"connext quote requires originDomain, destinationDomain, originToken, destinationToken, amount"};try{let s={originDomain:String(e),destinationDomain:String(t),originToken:n,destinationToken:r,amount:String(o)},a=await R(`${mL}/estimate`,{...i,method:"POST",body:JSON.stringify(s),headers:{"content-type":"application/json",...i.headers||{}}});return{amountOut:a?.amountOut,fee:a?.fee,estimatedTime:a?.estimatedTransferTime}}catch(s){return{error:String(s.message||s).slice(0,200)}}}var mL,Uw=T(()=>{Y();mL="https://api.connext.network"});async function Bw({fromChain:e,toChain:t,token:n,amount:r}={},o={}){if(!e||!t||!n||!r)return{error:"wormhole quote requires fromChain, toChain, token, amount"};try{let i=new URLSearchParams({fromChain:String(e),toChain:String(t),token:n,amount:String(r)}),s=await R(`${hL}/quote?${i}`,o);return{amountOut:s?.amountOut,fee:s?.fee,estimatedTime:s?.estimatedTime}}catch(i){return{error:String(i.message||i).slice(0,200)}}}var hL,qw=T(()=>{Y();hL="https://api.portalbridge.com/v1"});import{Interface as Vw,getAddress as yL,id as Ww}from"ethers";function ai(e){return e?.cache===!1?!1:!e?.fetchImpl||e.cache===!0}function bp(e,t,n){let r=e.get(t);return r?Date.now()-r.at>n?(e.delete(t),null):r:null}function xc(e,t,n,r){for(e.delete(t),e.set(t,{at:Date.now(),value:n});e.size>r;){let o=e.keys().next();if(o.done)break;e.delete(o.value)}}function PL(e,t){try{return yL(e).toLowerCase()}catch{throw new Error(`${t} must be a valid EVM address`)}}function LL(e){return`0x${e.slice(2).toLowerCase().padStart(64,"0")}`}function zw(e){return`0x${String(e).slice(-40).toLowerCase()}`}function $L({unlimited:e,spenderLabel:t,lastActivityAt:n}){if(e)return"unlimited";if(!t)return"unknown-spender";if(n){let r=Date.parse(n);if(Number.isFinite(r)&&Date.now()-r>OL)return"stale"}return"scoped"}function DL(e,t,n){if(n)return"UNLIMITED";if(t==null)return e.toString();let r=10n**BigInt(t),o=e/r,i=e%r;if(i===0n)return o.toLocaleString("en-US");let s=i.toString().padStart(t,"0").replace(/0+$/,"").slice(0,6);return`${o.toLocaleString("en-US")}${s?`.${s}`:""}`}async function UL(e,t,n,r){let o=`${e}:${t}`,i=r?.get(o);if(i)return i;if(ai(n)){let a=bp(jw,o,_L);if(a)return a.value}let s=(async()=>{let a=async d=>{try{let p=Mw.encodeFunctionData(d,[]),f=await de(e,"eth_call",[{to:t,data:p},"latest"],n);return!f||f==="0x"?null:Mw.decodeFunctionResult(d,f)[0]}catch{return null}},[c,l]=await Promise.all([a("decimals"),a("symbol")]),u={decimals:c==null?null:Number(c),symbol:l==null?null:String(l).slice(0,24)};return ai(n)&&xc(jw,o,u,CL),u})();return r?.set(o,s),s}async function BL(e,t,n){let r=Math.min(Math.max(Number(n.lookbackBlocks)||bL,1),wL),o=await Qs(e,n);if(!Number.isFinite(o))throw new Error("chain head unavailable");let i=Math.max(0,o-r),s=await de(e,"eth_getLogs",[{fromBlock:`0x${i.toString(16)}`,toBlock:"latest",topics:[gL,LL(t)]}],n);if(!Array.isArray(s))throw new Error("log scan returned no array");let a=new Map;for(let c of s){let l=String(c?.address||"").toLowerCase(),u=c?.topics?.[2];!l||!u||a.set(`${l}:${zw(u)}`,{token:l,spender:zw(u)})}return{pairs:[...a.values()],fromBlock:i,toBlock:o}}function qL(e){return(xL[e]||[]).flatMap(n=>AL.map(r=>({token:n.address,spender:r.address,symbol:n.symbol,decimals:n.decimals})))}async function ML(e,t,n={}){let r=[],o="direct-probe",i=null,s=qL(e),a=gp(e),c=ai(n)&&bp(yp,e,TL)?.value===!1;if(s.length===0&&a.length===0&&c)return{scan:{chainId:e,status:"unconfigured",method:o,error:"no Approval log access and no candidate token or collection set for this chain"},approvals:[]};try{let l=await BL(e,t,n);r=l.pairs,o="log-scan",i={fromBlock:l.fromBlock,toBlock:l.toBlock},ai(n)&&xc(yp,e,!0,64)}catch{if(ai(n)&&xc(yp,e,!1,64),r=s,r.length===0&&a.length===0)return{scan:{chainId:e,status:"unconfigured",method:o,error:"no Approval log access and no candidate token or collection set for this chain"},approvals:[]}}try{let l=new Map,d=(await Wr(r,n.concurrency||4,async f=>{try{let m=await ym({chainId:e,token:f.token,owner:t,spender:f.spender},n),h=BigInt(m.allowance);if(h<=0n)return null;let y=f.symbol?{symbol:f.symbol,decimals:f.decimals??null}:await UL(e,f.token,n,l),g=h>=kL,E=EL[f.spender]||null;return{id:`${e}:${f.token}:${f.spender}`,chainId:e,standard:"erc20",token:f.token,tokenSymbol:y.symbol,decimals:y.decimals,spender:f.spender,spenderLabel:E,allowance:h.toString(),allowanceDisplay:DL(h,y.decimals,g),unlimited:g,lastActivityAt:null,risk:$L({unlimited:g,spenderLabel:E,lastActivityAt:null})}}catch{return null}})).filter(Boolean),p=await jL(e,t,n);return{scan:{chainId:e,status:"ok",method:o,pairsProbed:r.length,collectionsProbed:gp(e).length,...i||{}},approvals:[...d,...p]}}catch(l){return{scan:{chainId:e,status:"unavailable",method:o,error:String(l?.message||l).slice(0,200)},approvals:[]}}}async function FL(e,t,n,r,o){try{let i=Fw.encodeFunctionData("isApprovedForAll",[n,r]),s=await de(e,"eth_call",[{to:t,data:i},"latest"],o);return!s||s==="0x"?null:!!Fw.decodeFunctionResult("isApprovedForAll",s)[0]}catch{return null}}function gp(e){return(vL[e]||[]).flatMap(n=>SL.map(r=>({collection:n.address,collectionName:n.name,operator:r.address,operatorLabel:r.label})))}async function jL(e,t,n){let r=gp(e);return r.length===0?[]:(await Wr(r,n.concurrency||4,async i=>await FL(e,i.collection,t,i.operator,n)!==!0?null:{id:`${e}:${i.collection}:${i.operator}:all`,chainId:e,standard:"erc721",token:i.collection,tokenSymbol:i.collectionName,decimals:null,spender:i.operator,spenderLabel:i.operatorLabel,allowance:null,allowanceDisplay:"ALL ITEMS",unlimited:!0,lastActivityAt:null,risk:"operator-all"})).filter(Boolean)}async function Gw(e={},t={}){let n=PL(e.owner||e.address,"owner"),r=new Map(gr.map(f=>[f.chainId,f])),o=Array.isArray(e.chainIds)&&e.chainIds.length?[...new Set(e.chainIds.map(Number))].filter(f=>r.has(f)):[...r.keys()],i=`${n}:${[...o].sort((f,m)=>f-m).join(",")}:${e.lookbackBlocks??""}`,s=ai(t)&&!e.refresh;if(s){let f=bp(Hw,i,NL);if(f)return{...f.value,cached:!0,cachedAgeMs:Date.now()-f.at}}let a=await Wr(o,e.concurrency||3,f=>ML(f,n,{...t,lookbackBlocks:e.lookbackBlocks})),c=a.flatMap(f=>f.approvals),l=a.map(f=>f.scan),u=l.find(f=>f.method==="log-scan"&&f.toBlock),d=l.some(f=>f.method==="direct-probe"&&f.status==="ok"),p={provider:"approvals",operation:"scan",readOnly:!0,queriedAt:new Date().toISOString(),owner:n,scannedRange:u?`last ${u.toBlock-u.fromBlock} blocks`:d?"known routers, live allowance probe":null,approvals:c,scans:l,warnings:["Approval discovery is scoped. Log scanning is used where the endpoint permits it; otherwise a curated router set is probed directly. An empty result means nothing was found in that scope, not that the wallet is safe.","NFT operator approval (setApprovalForAll) is checked against a curated collection and marketplace set on supported chains only. A collection outside that set is not checked."]};return s&&xc(Hw,i,p,RL),{...p,cached:!1,cachedAgeMs:0}}var Mw,Fw,gL,m9,bL,wL,EL,AL,SL,vL,xL,IL,kL,OL,_L,TL,NL,CL,RL,jw,yp,Hw,Kw=T(()=>{Mi();Y();Qt();Mw=new Vw(["function decimals() view returns (uint8)","function symbol() view returns (string)"]),Fw=new Vw(["function isApprovedForAll(address owner, address operator) view returns (bool)","function name() view returns (string)"]),gL=Ww("Approval(address,address,uint256)"),m9=Ww("ApprovalForAll(address,address,bool)"),bL=1e4,wL=2e5,EL=Object.freeze({"0x1111111254eeb25477b68fb85ed929f73a960582":"1inch v5 Router","0x111111125421ca6dc452d289314280a0f8842a65":"1inch v6 Router","0x68b3465833fb72a70ecdf485e0e4c7bd8665fc45":"Uniswap Universal Router","0x3fc91a3afd70395cd496c647d5a6cc9d4b2b7fad":"Uniswap Universal Router","0x000000000022d473030f116ddee9f6b43ac78ba3":"Permit2","0xe592427a0aece92de3edee1f18e0157c05861564":"Uniswap v3 Router","0x7a250d5630b4cf539739df2c5dacb4c659f2488d":"Uniswap v2 Router","0xdef1c0ded9bec7f1a1670819833240f027b25eff":"0x Exchange Proxy","0x2626664c2603336e57b271c5c0b26f421741e481":"Uniswap SwapRouter02 (Base)","0x6131b5fae19ea4f9d964eac0408e4408b66337b5":"KyberSwap Meta Aggregator","0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48":"USDC (token contract)"}),AL=Object.freeze([{address:"0x000000000022d473030f116ddee9f6b43ac78ba3",label:"Permit2"},{address:"0x1111111254eeb25477b68fb85ed929f73a960582",label:"1inch v5 Router"},{address:"0x111111125421ca6dc452d289314280a0f8842a65",label:"1inch v6 Router"},{address:"0x68b3465833fb72a70ecdf485e0e4c7bd8665fc45",label:"Uniswap Universal Router"},{address:"0xe592427a0aece92de3edee1f18e0157c05861564",label:"Uniswap v3 Router"},{address:"0x7a250d5630b4cf539739df2c5dacb4c659f2488d",label:"Uniswap v2 Router"},{address:"0xdef1c0ded9bec7f1a1670819833240f027b25eff",label:"0x Exchange Proxy"},{address:"0x2626664c2603336e57b271c5c0b26f421741e481",label:"Uniswap SwapRouter02"}]),SL=Object.freeze([{address:"0x1e0049783f008a0085193e00003d00cd54003c71",label:"OpenSea Seaport Conduit"},{address:"0x00000000000000adc04c56bf30ac9d3c0aaf14dc",label:"Seaport 1.5"},{address:"0x0000000000000068f116a894984e2db1123eb395",label:"Seaport 1.6"},{address:"0x00000000000001ad428e4906ae43d8f9852d0dd6",label:"Seaport 1.4"},{address:"0x000000000000ad05ccc4f10045630fb830b95127",label:"Blur Marketplace"},{address:"0x00000000000000000000000000000000000000a5",label:"Blur Execution Delegate"},{address:"0xf42aa99f011a1fa7cda90e5e98b277e306bca83e",label:"Rarible Transfer Proxy"},{address:"0x000000000022d473030f116ddee9f6b43ac78ba3",label:"Permit2"}]),vL=Object.freeze({1:[{address:"0xbc4ca0eda7647a8ab7c2061c2e118a18a936f13d",name:"Bored Ape Yacht Club"},{address:"0x60e4d786628fea6478f785a6d7e704777c86a7c6",name:"Mutant Ape Yacht Club"},{address:"0xed5af388653567af2f388e6224dc7c4b3241c544",name:"Azuki"},{address:"0x8a90cab2b38dba80c64b7734e58ee1db38b8992e",name:"Doodles"},{address:"0x49cf6f5d44e70224e2e23fdcdd2c053f30ada28b",name:"CloneX"},{address:"0x23581767a106ae21c074b2276d25e5c3e136a68b",name:"Moonbirds"}]}),xL=Object.freeze({1:[{address:"0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48",symbol:"USDC",decimals:6},{address:"0xdac17f958d2ee523a2206206994597c13d831ec7",symbol:"USDT",decimals:6},{address:"0x6b175474e89094c44da98b954eedeac495271d0f",symbol:"DAI",decimals:18},{address:"0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2",symbol:"WETH",decimals:18},{address:"0x2260fac5e5542a773aa44fbcfedf7c193bc2c599",symbol:"WBTC",decimals:8}],8453:[{address:"0x833589fcd6edb6e08f4c7c32d4f71b54bda02913",symbol:"USDC",decimals:6},{address:"0x4200000000000000000000000000000000000006",symbol:"WETH",decimals:18}],42161:[{address:"0xaf88d065e77c8cc2239327c5edb3a432268e5831",symbol:"USDC",decimals:6},{address:"0xfd086bc7cd5c481dcc9c85ebe478a1c0b69fcbb9",symbol:"USDT",decimals:6},{address:"0x82af49447d8a07e3bd95bd0d56f35241523fbab1",symbol:"WETH",decimals:18}],10:[{address:"0x0b2c639c533813f4aa9d7837caf62653d097ff85",symbol:"USDC",decimals:6},{address:"0x4200000000000000000000000000000000000006",symbol:"WETH",decimals:18}],137:[{address:"0x3c499c542cef5e3811e1192ce70d8cc03d5c3359",symbol:"USDC",decimals:6},{address:"0xc2132d05d31c914a87c6611c10748aeb04b58e8f",symbol:"USDT",decimals:6}]}),IL=(1n<<256n)-1n,kL=IL/2n,OL=4320*60*60*1e3,_L=360*60*1e3,TL=600*1e3,NL=45*1e3,CL=512,RL=128,jw=new Map,yp=new Map,Hw=new Map});var Xw={};Q(Xw,{aggregateBridgeQuotes:()=>Yw,bridgeAggregatorHealth:()=>zL,checkRevokeNeeded:()=>Jw,scanBridgeRoutes:()=>HL});async function Yw(e={},t={}){let{fromChainId:n,toChainId:r,tokenIn:o,tokenOut:i,amount:s,taker:a,fromSymbol:c="?",toSymbol:l="?",fromDecimals:u=18,toDecimals:d=18}=e,p=[],f=[],m=Ew({srcChainId:n,srcChainTokenIn:o,srcChainTokenInAmount:s,dstChainId:r,dstChainTokenOut:i},t).then(w=>w.error?(f.push(`debridge: ${w.error}`),null):{provider:"debridge",amountOut:w.estimation?.dstChainTokenOut?.amount??w.estimation?.toAmount,feeUsd:w.estimation?.fixFee??w.fixFee,estimatedTime:w.estimation?.execution?.estimatedTransferTime?`${w.estimation.execution.estimatedTransferTime}s`:"unknown",preparable:!0,raw:w}).catch(w=>(f.push(`debridge: ${w.message}`),null)),h=Ui({fromChainId:n,toChainId:r,tokenIn:o,tokenOut:i,amountIn:s,taker:a},t).then(w=>!w||w.error?(f.push(`lifi: ${w?.error??"no route"}`),null):{provider:"lifi-relay",amountOut:w.amountOut??w.quote?.amountOut,feeUsd:w.feeUsd??w.totalFee,estimatedTime:w.estimatedTime??w.duration??"unknown",preparable:!!w.transaction,raw:w}).catch(w=>(f.push(`lifi: ${w.message}`),null)),y=_w({fromChain:n,toChain:r,fromToken:o,toToken:i,fromAmount:s,fromAddress:a},t).then(w=>w.error?(f.push(`squid: ${w.error}`),null):{provider:"squid",amountOut:w.toAmount,feeUsd:Array.isArray(w.fee)?w.fee.reduce((b,x)=>b+(Number(x.amountUsd)||0),0):null,estimatedTime:"30s - 3min",preparable:!1,raw:w}).catch(w=>(f.push(`squid: ${w.message}`),null)),g=Nw({srcChainId:n,dstChainId:r,token:o,amount:s},t).then(w=>w.error?(f.push(`stargate: ${w.error}`),null):{provider:"stargate",amountOut:w.amountOut,feeUsd:w.fee,estimatedTime:w.estimatedTime||"1-5 min",preparable:!1,raw:w}).catch(w=>(f.push(`stargate: ${w.message}`),null)),E=Rw({fromAsset:c,toAsset:l,amount:s,destination:a},t).then(w=>w.error?(f.push(`thorchain: ${w.error}`),null):{provider:"thorchain",amountOut:w.expectedAmountOut,feeUsd:w.fees?.total,estimatedTime:w.estimatedTime||"10-30 min",preparable:!1,raw:w}).catch(w=>(f.push(`thorchain: ${w.message}`),null)),v=(async()=>{if(!c||!l||c==="?"||l==="?")return f.push("changenow: ticker symbols required, skipping"),null;try{let w=await Iw({fromTicker:c,toTicker:l,fromAmount:s},t);return w.error?(f.push(`changenow: ${w.error}`),null):{provider:"changenow",amountOut:w.toAmount,feeUsd:w.networkFee,estimatedTime:w.flow==="standard"?"5-30 min":"instant",preparable:!1,kycRequired:w.kycRequired,raw:w}}catch(w){return f.push(`changenow: ${w.message}`),null}})(),S=Lw({fromChainId:n,toChainId:r,fromToken:o,toToken:i,fromAmount:s,userAddress:a},t).then(w=>w.error?(f.push(`bungee: ${w.error}`),null):{provider:"bungee",amountOut:w.amountOut,feeUsd:w.feeUsd,estimatedTime:w.estimatedTime,preparable:!1,raw:w}).catch(w=>(f.push(`bungee: ${w.message}`),null)),I=Dw({originDomain:n,destinationDomain:r,originToken:o,destinationToken:i,amount:s},t).then(w=>w.error?(f.push(`connext: ${w.error}`),null):{provider:"connext",amountOut:w.amountOut,feeUsd:w.fee,estimatedTime:w.estimatedTime||"5-20 min",preparable:!1,raw:w}).catch(w=>(f.push(`connext: ${w.message}`),null)),k=Bw({fromChain:n,toChain:r,token:o,amount:s},t).then(w=>w.error?(f.push(`wormhole: ${w.error}`),null):{provider:"wormhole",amountOut:w.amountOut,feeUsd:w.fee,estimatedTime:w.estimatedTime||"5-15 min",preparable:!1,raw:w}).catch(w=>(f.push(`wormhole: ${w.message}`),null)),A=await Promise.allSettled([m,h,y,g,E,S,I,k,v]);for(let w of A)w.status==="fulfilled"&&w.value&&p.push(w.value);return p.sort((w,b)=>{let x=Number(w.amountOut??0),C=Number(b.amountOut??0);return x!==C?C-x:w.preparable&&!b.preparable?-1:!w.preparable&&b.preparable?1:0}),{providers:p.map(w=>w.provider),bestRoute:p[0]?.provider??"none",winner:p[0]??null,runnersUp:p.slice(1),errors:f.length?f:null}}async function Jw({chainId:e,taker:t,tokenIn:n}={},r={}){if(!e||!t)return{needsRevoke:!1,note:"no wallet to check"};try{let i=(await Gw({chainIds:[e],address:t},r)).approvals;if(!i?.length)return{needsRevoke:!1,note:"no active approvals found"};let s=n?i.find(a=>String(a.token).toLowerCase()===String(n).toLowerCase()):null;return s&&BigInt(s.allowance??"0")>0n?{needsRevoke:!0,spender:s.spender,amount:s.allowance,symbol:s.symbol??"?",decimals:s.decimals??18,note:`approval found for ${s.spender}, revoke before bridging`}:{needsRevoke:!1,note:`no active approval for this token (${i.length} total approvals on chain)`}}catch(o){return{needsRevoke:!1,note:`revoke check unavailable: ${String(o.message||o).slice(0,100)}`}}}async function HL(e={},t={}){let[n,r]=await Promise.all([Yw(e,t),Jw({chainId:e.fromChainId,taker:e.taker,tokenIn:e.tokenIn},t)]),o=n.winner??{};return{kind:"bridge",fromChainId:e.fromChainId,toChainId:e.toChainId,fromSymbol:e.fromSymbol,toSymbol:e.toSymbol,amount:e.amount,fromDecimals:e.fromDecimals??18,toDecimals:e.toDecimals??18,bestRoute:o.provider??"none",amountOut:o.amountOut,feeUsd:o.feeUsd,estimatedTime:o.estimatedTime,preparable:o.preparable?"yes":"no (manual send)",providers:n.providers,runnersUp:n.runnersUp,revokeCheck:r,errors:n.errors,confidence:n.providers.length>=2?.85:n.providers.length===1?.6:.1}}async function zL(){let[e,t]=await Promise.all([Aw().catch(n=>({ok:!1,error:n.message})),kw().catch(n=>({ok:!1,error:n.message}))]);return{debridge:e,changenow:t,lifi:{ok:!0,note:"integrated via router"}}}var M9,Qw=T(()=>{Po();Sw();Ow();Tw();Cw();Pw();$w();Uw();qw();Kw();M9=Object.freeze(["debridge","lifi-relay","squid","stargate","thorchain","bungee","connext","wormhole","changenow"])});var Zw={};Q(Zw,{DYDX_API:()=>Ic,dydxHealth:()=>KL,dydxMarkets:()=>WL,dydxOrderbook:()=>GL});function ys(e){if(e==null||e==="")return null;let t=Number(e);return Number.isFinite(t)?t:null}function VL(e){let t=e?.markets;return Array.isArray(t)?t:t&&typeof t=="object"?Object.values(t):[]}async function WL(e=50,t={}){try{let n=await R(`${Ic}/v4/perpetualMarkets?limit=${e}`,t);return VL(n).map(o=>{let i=ys(o?.nextFundingRate),s=ys(o?.oraclePrice),a=ys(o?.openInterest),c=ys(o?.volume24H),l=ys(o?.priceChange24H);return{ticker:o?.ticker,coin:String(o?.ticker||"").replace(/-USD$/,""),markPx:s,oraclePx:s,fundingRate:i,fundingRateAprPct:i==null?null:i*24*365*100,openInterest:a,dayNtlVolumeUsd:c,change24hPct:s&&l!=null?l/s*100:null,oraclePrice:o?.oraclePrice,indexPrice:o?.indexPrice,nextFundingRate:i==null?null:`${(i*100).toFixed(4)}%`,volume24h:o?.volume24H,venue:"dydx",quality:"LIVE"}}).filter(o=>o.ticker)}catch(n){return{error:String(n.message||n).slice(0,200),venue:"dydx",quality:"FAILED"}}}async function GL(e){try{let t=await R(`${Ic}/v4/orderbooks/perpetualMarket/${e}`);return{bids:t?.bids?.slice(0,5),asks:t?.asks?.slice(0,5)}}catch(t){return{error:String(t.message||t).slice(0,200)}}}async function KL(){try{return{ok:!0,serverTime:(await R(`${Ic}/v4/time`))?.iso}}catch(e){return{ok:!1,error:String(e.message||e).slice(0,160)}}}var Ic,eE=T(()=>{Y();Ic="https://indexer.dydx.trade"});var oE={};Q(oE,{DRIFT_API:()=>nE,driftHealth:()=>YL,driftMarkets:()=>rE});async function rE(e={}){try{let n=(await R(`${nE}/v2/markets`,e))?.markets;return!Array.isArray(n)||n.length===0?{error:tE,venue:"drift",quality:"FAILED"}:n.map(r=>({symbol:r?.symbol||r?.marketIndex,coin:r?.symbol,oraclePrice:r?.amm?.oraclePrice,markPrice:r?.amm?.markPrice,fundingRate:r?.amm?.lastFundingRate?`${(Number(r.amm.lastFundingRate)*100).toFixed(4)}%`:null,openInterest:{long:r?.amm?.longFunding,short:r?.amm?.shortFunding},volume24h:r?.amm?.quoteAssetVolume,venue:"drift",quality:"LIVE"}))}catch(t){return{error:`${tE} (${String(t.message||t).slice(0,120)})`,venue:"drift",quality:"FAILED"}}}async function YL(){let e=await rE();return e?.error?{ok:!1,error:e.error,quality:"FAILED"}:{ok:!0,note:"Drift v2 perps on Solana",quality:"LIVE"}}var nE,tE,iE=T(()=>{Y();nE="https://dlob.drift.trade",tE="Drift public market API unavailable upstream (dlob /v2/markets dead; data.api.drift.trade/contracts 403). Read-only surface stays FAILED until a live endpoint is verified."});var cE={};Q(cE,{VERTEX_API:()=>wp,vertexHealth:()=>XL,vertexMarkets:()=>aE,vertexOrderbook:()=>JL});async function aE(e={}){try{let n=(await R(`${wp}/query`,{...e,method:"POST",body:JSON.stringify({all_markets:{}}),headers:{"content-type":"application/json",...e.headers||{}}}))?.data?.all_markets;return!Array.isArray(n)||n.length===0?{error:sE,venue:"vertex",quality:"FAILED"}:n.map(r=>({market:r?.market,type:r?.type,oraclePrice:r?.oracle_price_x18?(Number(BigInt(r.oracle_price_x18))/1e18).toFixed(4):null,minSize:r?.min_size,productId:r?.product_id,venue:"vertex",quality:"LIVE"}))}catch(t){return{error:`${sE} (${String(t.message||t).slice(0,120)})`,venue:"vertex",quality:"FAILED"}}}async function JL(e){try{let n=(await R(`${wp}/query`,{method:"POST",body:JSON.stringify({market_liquidity:{product_id:Number(e),depth:5}}),headers:{"content-type":"application/json"}}))?.data?.market_liquidity;return{bids:n?.bids||[],asks:n?.asks||[]}}catch(t){return{error:String(t.message||t).slice(0,200),quality:"FAILED"}}}async function XL(){let e=await aE();return e?.error?{ok:!1,error:e.error,quality:"FAILED"}:{ok:!0,status:"ok",quality:"LIVE"}}var wp,sE,lE=T(()=>{Y();wp="https://gateway.prod.vertexprotocol.com/v2",sE="Vertex public market API unavailable upstream (gateway TLS eof; /v2/query all_markets not a valid op). Read-only surface stays FAILED until a live endpoint is verified."});var uE={};Q(uE,{pancakeHealth:()=>e$,pancakeQuote:()=>ZL});async function ZL({chainId:e=56,tokenIn:t,tokenOut:n,amountIn:r,fee:o=500}={},i={}){if(!t||!n||!r)return{error:"pancake quote requires tokenIn, tokenOut, amountIn"};try{let s={tokenIn:String(t).toLowerCase(),tokenOut:String(n).toLowerCase(),amountIn:String(r),fee:String(o)},a=await R(`${QL}/quote`,{...i,method:"POST",body:JSON.stringify(s),headers:{"content-type":"application/json",...i.headers||{}}});return{amountOut:a?.amountOut,route:a?.route}}catch(s){return{error:String(s.message||s).slice(0,200)}}}async function e$(){try{return{ok:!0,chains:["bsc (56)","ethereum (1)","arbitrum (42161)","base (8453)","opbnb (204)","zksync (324)","linea (59144)"]}}catch(e){return{ok:!1,error:String(e.message||e).slice(0,160)}}}var QL,dE=T(()=>{Y();QL="https://api.thegraph.com/subgraphs/name/pancakeswap/exchange-v3-bsc"});var fE={};Q(fE,{sushiHealth:()=>r$,sushiQuote:()=>n$});async function n$({chainId:e=1,tokenIn:t,tokenOut:n,amountIn:r,fee:o=500}={},i={}){if(!t||!n||!r)return{error:"sushi quote requires tokenIn, tokenOut, amountIn"};try{let s=`{ quote(tokenIn:"${t}",tokenOut:"${n}",amountIn:"${r}",fee:${o}) { amountOut route } }`,a=await R(`${t$(e)}/quote?query=${encodeURIComponent(s)}`,i);return{amountOut:a?.data?.quote?.amountOut,route:a?.data?.quote?.route}}catch(s){return{error:String(s.message||s).slice(0,200)}}}async function r$(){try{return{ok:!0,chains:Object.keys(pE).length+" chains"}}catch(e){return{ok:!1,error:String(e.message||e).slice(0,160)}}}var t$,pE,mE=T(()=>{Y();t$=e=>`https://api.thegraph.com/subgraphs/name/sushi-v3/v3-${pE[e]||"ethereum"}`,pE={1:"ethereum",10:"optimism",56:"bsc",137:"polygon",8453:"base",42161:"arbitrum",43114:"avalanche",59144:"linea",534352:"scroll",324:"zksync-era",250:"fantom",2222:"kava",1088:"metis",1284:"moonbeam",1285:"moonriver",288:"boba",1101:"polygon-zkevm",5e3:"mantle",81457:"blast"}});var hE={};Q(hE,{raydiumHealth:()=>s$,raydiumQuote:()=>i$});async function i$({inputMint:e,outputMint:t,amount:n,slippageBps:r=50}={},o={}){if(!e||!t||!n)return{error:"raydium quote requires inputMint, outputMint, amount"};try{let i=new URLSearchParams({inputMint:e,outputMint:t,amount:String(n),slippageBps:String(r),onlyDirectRoutes:"true"}),s=await R(`${o$}/quote?${i}`,o),a=(s?.routePlan||[]).filter(c=>c?.swapInfo?.label?.toLowerCase().includes("raydium"));return{amountOut:s?.outAmount,priceImpactPct:s?.priceImpactPct,raydiumRoutes:a.length,allRoutes:s?.routePlan?.length||0}}catch(i){return{error:String(i.message||i).slice(0,200)}}}async function s$(){try{return{ok:!0,note:"Raydium routes through Jupiter aggregator on Solana"}}catch(e){return{ok:!1,error:String(e.message||e).slice(0,160)}}}var o$,yE=T(()=>{Y();o$="https://quote-api.jup.ag/v6"});var gE={};Q(gE,{AEVO_API:()=>Ep,aevoHealth:()=>c$,aevoMarkets:()=>a$});async function a$(e={}){try{return(await R(`${Ep}/markets`,e)||[]).map(n=>({instrument:n?.instrument_name,type:n?.instrument_type,markPrice:n?.mark_price,indexPrice:n?.index_price,fundingRate:n?.funding_rate?`${(Number(n.funding_rate)*100).toFixed(4)}%`:null,openInterest:n?.open_interest,volume24h:n?.volume_24h}))}catch(t){return{error:String(t.message||t).slice(0,200)}}}async function c$(){try{return{ok:(await R(`${Ep}/ping`))?.status==="ok"}}catch(e){return{ok:!1,error:String(e.message||e).slice(0,160)}}}var Ep,bE=T(()=>{Y();Ep="https://api.aevo.xyz"});var xp={};Q(xp,{BINANCE_DEFAULT_FUNDING_INTERVAL_HOURS:()=>AE,BINANCE_FUTURES_API:()=>EE,BINANCE_SPOT_API:()=>wE,binanceFunding:()=>Oc,binanceFundingHistory:()=>p$,binanceHealth:()=>Sp,binanceMarkPrice:()=>u$,binanceOpenInterest:()=>d$,binanceOrderbook:()=>l$,binanceSymbol:()=>ci,binanceTicker:()=>vp,normalizeBook:()=>li});function Ap(e={}){return(e.spotBaseUrl||e.baseUrl||process.env.BINANCE_API_URL||wE).replace(/\/$/,"")}function kc(e={}){return(e.futuresBaseUrl||process.env.BINANCE_FAPI_URL||EE).replace(/\/$/,"")}function gs(e){return{error:String(e.message||e).slice(0,200)}}function Bt(e){let t=Number(e);return Number.isFinite(t)?t:null}function ci(e,t="USDT"){let n=String(e||"").trim().toUpperCase().replace(/[-_/]/g,"");return n?n.endsWith(t)?n:`${n}${t}`:""}async function Sp(e={}){try{let t=await R(`${Ap(e)}/api/v3/ping`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??1e4});return{ok:t&&typeof t=="object",provider:"binance-public",execution:"read-only",exec:!1}}catch(t){return{ok:!1,provider:"binance-public",error:String(t.message||t).slice(0,160)}}}async function vp(e={},t={}){let n=ci(e.symbol||e.coin,e.quote||"USDT");if(!n)return{error:"binanceTicker requires symbol or coin"};try{let r=e.full?"/api/v3/ticker/24hr":"/api/v3/ticker/price",o=await R(`${Ap(t)}${r}?symbol=${encodeURIComponent(n)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3});return{venue:"binance",market:"spot",symbol:n,price:Bt(o?.price??o?.lastPrice),volume24h:Bt(o?.volume),quoteVolume24h:Bt(o?.quoteVolume),raw:o}}catch(r){return gs(r)}}async function l$(e={},t={}){let n=ci(e.symbol||e.coin,e.quote||"USDT");if(!n)return{error:"binanceOrderbook requires symbol or coin"};let r=Math.min(Math.max(Number(e.limit)||20,1),1e3),o=String(e.market||"spot").toLowerCase()==="perp";try{let i=o?`${kc(t)}/fapi/v1/depth?symbol=${encodeURIComponent(n)}&limit=${r}`:`${Ap(t)}/api/v3/depth?symbol=${encodeURIComponent(n)}&limit=${r}`,s=await R(i,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3});return li({venue:"binance",market:o?"perp":"spot",symbol:n,bids:s?.bids,asks:s?.asks,raw:s})}catch(i){return gs(i)}}async function Oc(e={},t={}){let n=ci(e.symbol||e.coin,e.quote||"USDT");if(!n)return{error:"binanceFunding requires symbol or coin"};try{let r=await R(`${kc(t)}/fapi/v1/premiumIndex?symbol=${encodeURIComponent(n)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),o=Array.isArray(r)?r[0]:r,i=Number(e.fundingIntervalHours)||AE,s=Bt(o?.lastFundingRate);return{venue:"binance",market:"perp",symbol:n,markPrice:Bt(o?.markPrice),indexPrice:Bt(o?.indexPrice),fundingRate:s,fundingIntervalHours:i,fundingAprPct:s==null?null:s*(8760/i)*100,nextFundingTime:Bt(o?.nextFundingTime),raw:o??null}}catch(r){return gs(r)}}async function u$(e={},t={}){let n=await Oc(e,t);return n?.error?n:{venue:"binance",market:"perp",symbol:n.symbol,markPrice:n.markPrice,indexPrice:n.indexPrice}}async function d$(e={},t={}){let n=ci(e.symbol||e.coin,e.quote||"USDT");if(!n)return{error:"binanceOpenInterest requires symbol or coin"};try{let r=await R(`${kc(t)}/fapi/v1/openInterest?symbol=${encodeURIComponent(n)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3});return{venue:"binance",market:"perp",symbol:n,openInterest:Bt(r?.openInterest),time:Bt(r?.time),raw:r??null}}catch(r){return gs(r)}}async function p$(e={},t={}){let n=ci(e.symbol||e.coin,e.quote||"USDT");if(!n)return{error:"binanceFundingHistory requires symbol or coin"};let r=Math.min(Math.max(Number(e.limit)||10,1),1e3);try{let o=await R(`${kc(t)}/fapi/v1/fundingRate?symbol=${encodeURIComponent(n)}&limit=${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),i=Array.isArray(o)?o:[];return{venue:"binance",symbol:n,count:i.length,history:i.map(s=>({fundingTime:Bt(s?.fundingTime),fundingRate:Bt(s?.fundingRate)}))}}catch(o){return gs(o)}}function li({venue:e,market:t,symbol:n,bids:r,asks:o,raw:i}){let s=f=>(Array.isArray(f)?f:[]).map(m=>{let h=Bt(Array.isArray(m)?m[0]:m?.price),y=Bt(Array.isArray(m)?m[1]:m?.size);return h==null||y==null?null:{price:h,size:y}}).filter(Boolean),a=s(r),c=s(o),l=a[0]?.price??null,u=c[0]?.price??null,d=l!=null&&u!=null?(l+u)/2:null,p=d?(u-l)/d*1e4:null;return{venue:e,market:t,symbol:n,bids:a,asks:c,bestBid:l,bestAsk:u,mid:d,spreadBps:p,raw:i??null}}var wE,EE,AE,bs=T(()=>{Y();wE="https://api.binance.com",EE="https://fapi.binance.com",AE=8});var Tp={};Q(Tp,{OKX_API:()=>SE,OKX_DEFAULT_FUNDING_INTERVAL_HOURS:()=>vE,okxFunding:()=>Op,okxHealth:()=>Ip,okxInstId:()=>di,okxMarkPrice:()=>_p,okxOpenInterest:()=>m$,okxOrderbook:()=>f$,okxTicker:()=>kp});function ui(e={}){return(e.baseUrl||process.env.OKX_API_URL||SE).replace(/\/$/,"")}function ws(e){return{error:String(e.message||e).slice(0,200)}}function xt(e){if(e===""||e==null)return null;let t=Number(e);return Number.isFinite(t)?t:null}function di(e,{market:t="spot",quote:n="USDT"}={}){let r=String(e||"").trim().toUpperCase();if(!r)return"";if(r.includes("-"))return r;let o=`${r}-${n}`;return t==="perp"?`${o}-SWAP`:o}function pi(e){if(e&&String(e.code)!=="0"&&e.code!==void 0)throw new Error(`okx error ${e.code}: ${e.msg||"unknown"}`);let t=e?.data;return Array.isArray(t)?t:[]}async function Ip(e={}){try{let t=await R(`${ui(e)}/api/v5/public/time`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??1e4});return{ok:pi(t).length>0,provider:"okx-public",execution:"read-only",exec:!1}}catch(t){return{ok:!1,provider:"okx-public",error:String(t.message||t).slice(0,160)}}}async function kp(e={},t={}){let n=String(e.market||"spot").toLowerCase(),r=di(e.instId||e.symbol||e.coin,{market:n,quote:e.quote||"USDT"});if(!r)return{error:"okxTicker requires instId, symbol or coin"};try{let o=await R(`${ui(t)}/api/v5/market/ticker?instId=${encodeURIComponent(r)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),i=pi(o)[0];return i?{venue:"okx",market:r.endsWith("-SWAP")?"perp":"spot",symbol:r,price:xt(i.last),bestBid:xt(i.bidPx),bestAsk:xt(i.askPx),volume24h:xt(i.vol24h),quoteVolume24h:xt(i.volCcy24h),raw:i}:{error:`okx ticker empty for ${r}`}}catch(o){return ws(o)}}async function f$(e={},t={}){let n=String(e.market||"spot").toLowerCase(),r=di(e.instId||e.symbol||e.coin,{market:n,quote:e.quote||"USDT"});if(!r)return{error:"okxOrderbook requires instId, symbol or coin"};let o=Math.min(Math.max(Number(e.limit)||20,1),400);try{let i=await R(`${ui(t)}/api/v5/market/books?instId=${encodeURIComponent(r)}&sz=${o}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),s=pi(i)[0];return s?li({venue:"okx",market:r.endsWith("-SWAP")?"perp":"spot",symbol:r,bids:s.bids,asks:s.asks,raw:s}):{error:`okx books empty for ${r}`}}catch(i){return ws(i)}}async function Op(e={},t={}){let n=di(e.instId||e.symbol||e.coin,{market:"perp",quote:e.quote||"USDT"});if(!n)return{error:"okxFunding requires instId, symbol or coin"};try{let r=await R(`${ui(t)}/api/v5/public/funding-rate?instId=${encodeURIComponent(n)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),o=pi(r)[0];if(!o)return{error:`okx funding-rate empty for ${n}`};let i=Number(e.fundingIntervalHours)||vE,s=xt(o.fundingRate);return{venue:"okx",market:"perp",symbol:n,fundingRate:s,nextFundingRate:xt(o.nextFundingRate),fundingIntervalHours:i,fundingAprPct:s==null?null:s*(8760/i)*100,nextFundingTime:xt(o.nextFundingTime??o.fundingTime),raw:o}}catch(r){return ws(r)}}async function _p(e={},t={}){let n=di(e.instId||e.symbol||e.coin,{market:"perp",quote:e.quote||"USDT"});if(!n)return{error:"okxMarkPrice requires instId, symbol or coin"};let r=String(e.instType||"SWAP").toUpperCase();try{let o=await R(`${ui(t)}/api/v5/public/mark-price?instType=${encodeURIComponent(r)}&instId=${encodeURIComponent(n)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),i=pi(o)[0];return i?{venue:"okx",market:"perp",symbol:n,markPrice:xt(i.markPx),time:xt(i.ts),raw:i}:{error:`okx mark-price empty for ${n}`}}catch(o){return ws(o)}}async function m$(e={},t={}){let n=di(e.instId||e.symbol||e.coin,{market:"perp",quote:e.quote||"USDT"});if(!n)return{error:"okxOpenInterest requires instId, symbol or coin"};let r=String(e.instType||"SWAP").toUpperCase();try{let o=await R(`${ui(t)}/api/v5/public/open-interest?instType=${encodeURIComponent(r)}&instId=${encodeURIComponent(n)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),i=pi(o)[0];return i?{venue:"okx",market:"perp",symbol:n,openInterest:xt(i.oiCcy??i.oi),openInterestContracts:xt(i.oi),openInterestUsd:xt(i.oiUsd),time:xt(i.ts),raw:i}:{error:`okx open-interest empty for ${n}`}}catch(o){return ws(o)}}var SE,vE,Np=T(()=>{Y();bs();SE="https://www.okx.com",vE=8});var Pp={};Q(Pp,{BYBIT_API:()=>xE,BYBIT_DEFAULT_FUNDING_INTERVAL_HOURS:()=>IE,bybitCategory:()=>_c,bybitFunding:()=>Tc,bybitFundingHistory:()=>b$,bybitHealth:()=>Cp,bybitMarkPrice:()=>y$,bybitOpenInterest:()=>g$,bybitOrderbook:()=>h$,bybitSymbol:()=>Ss,bybitTicker:()=>Rp});function Es(e={}){return(e.baseUrl||process.env.BYBIT_API_URL||xE).replace(/\/$/,"")}function As(e){return{error:String(e.message||e).slice(0,200)}}function Je(e){if(e===""||e==null)return null;let t=Number(e);return Number.isFinite(t)?t:null}function Ss(e,t="USDT"){let n=String(e||"").trim().toUpperCase().replace(/[-_/]/g,"");return n?n.endsWith(t)?n:`${n}${t}`:""}function _c(e){let t=String(e||"spot").toLowerCase();return t==="perp"||t==="linear"||t==="swap"?"linear":t==="inverse"?"inverse":"spot"}function vs(e){if(e&&e.retCode!==void 0&&Number(e.retCode)!==0)throw new Error(`bybit error ${e.retCode}: ${e.retMsg||"unknown"}`);return e?.result??null}async function Cp(e={}){try{let t=await R(`${Es(e)}/v5/market/time`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??1e4});return{ok:!!vs(t),provider:"bybit-public",execution:"read-only",exec:!1}}catch(t){return{ok:!1,provider:"bybit-public",error:String(t.message||t).slice(0,160)}}}async function kE(e,t){let n=_c(e.market),r=Ss(e.symbol||e.coin,e.quote||"USDT");if(!r)return{error:"bybit requires symbol or coin"};let o=await R(`${Es(t)}/v5/market/tickers?category=${encodeURIComponent(n)}&symbol=${encodeURIComponent(r)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),i=vs(o)?.list?.[0];return i?{row:i,symbol:r,category:n}:{error:`bybit tickers empty for ${r}`}}async function Rp(e={},t={}){try{let n=await kE(e,t);if(n.error)return n;let{row:r,symbol:o,category:i}=n;return{venue:"bybit",market:i==="spot"?"spot":"perp",symbol:o,price:Je(r.lastPrice),bestBid:Je(r.bid1Price),bestAsk:Je(r.ask1Price),markPrice:Je(r.markPrice),indexPrice:Je(r.indexPrice),volume24h:Je(r.volume24h),quoteVolume24h:Je(r.turnover24h),raw:r}}catch(n){return As(n)}}async function h$(e={},t={}){let n=_c(e.market),r=Ss(e.symbol||e.coin,e.quote||"USDT");if(!r)return{error:"bybitOrderbook requires symbol or coin"};let o=Math.min(Math.max(Number(e.limit)||25,1),200);try{let i=await R(`${Es(t)}/v5/market/orderbook?category=${encodeURIComponent(n)}&symbol=${encodeURIComponent(r)}&limit=${o}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),s=vs(i);return s?li({venue:"bybit",market:n==="spot"?"spot":"perp",symbol:r,bids:s.b,asks:s.a,raw:s}):{error:`bybit orderbook empty for ${r}`}}catch(i){return As(i)}}async function Tc(e={},t={}){try{let n=await kE({...e,market:e.market||"perp"},t);if(n.error)return n;let{row:r,symbol:o}=n,i=Number(e.fundingIntervalHours)||IE,s=Je(r.fundingRate);return{venue:"bybit",market:"perp",symbol:o,markPrice:Je(r.markPrice),indexPrice:Je(r.indexPrice),fundingRate:s,fundingIntervalHours:i,fundingAprPct:s==null?null:s*(8760/i)*100,nextFundingTime:Je(r.nextFundingTime),openInterest:Je(r.openInterest),raw:r}}catch(n){return As(n)}}async function y$(e={},t={}){let n=await Tc(e,t);return n?.error?n:{venue:"bybit",market:"perp",symbol:n.symbol,markPrice:n.markPrice,indexPrice:n.indexPrice}}async function g$(e={},t={}){let n=Ss(e.symbol||e.coin,e.quote||"USDT");if(!n)return{error:"bybitOpenInterest requires symbol or coin"};let r=_c(e.market||"perp"),o=String(e.intervalTime||"1h"),i=Math.min(Math.max(Number(e.limit)||1,1),200);try{let s=await R(`${Es(t)}/v5/market/open-interest?category=${encodeURIComponent(r)}&symbol=${encodeURIComponent(n)}&intervalTime=${encodeURIComponent(o)}&limit=${i}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),a=vs(s)?.list,c=Array.isArray(a)?a[0]:null;return c?{venue:"bybit",market:"perp",symbol:n,openInterest:Je(c.openInterest),time:Je(c.timestamp),history:(Array.isArray(a)?a:[]).map(l=>({openInterest:Je(l?.openInterest),timestamp:Je(l?.timestamp)}))}:{error:`bybit open-interest empty for ${n}`}}catch(s){return As(s)}}async function b$(e={},t={}){let n=Ss(e.symbol||e.coin,e.quote||"USDT");if(!n)return{error:"bybitFundingHistory requires symbol or coin"};let r=Math.min(Math.max(Number(e.limit)||10,1),200);try{let o=await R(`${Es(t)}/v5/market/funding/history?category=linear&symbol=${encodeURIComponent(n)}&limit=${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),i=vs(o)?.list,s=Array.isArray(i)?i:[];return{venue:"bybit",symbol:n,count:s.length,history:s.map(a=>({fundingRate:Je(a?.fundingRate),fundingTime:Je(a?.fundingRateTimestamp)}))}}catch(o){return As(o)}}var xE,IE,Lp=T(()=>{Y();bs();xE="https://api.bybit.com",IE=8});var LE={};Q(LE,{CEX_BASIS_VENUES:()=>Nc,HL_FUNDING_INTERVAL_HOURS:()=>$p,cexBasis:()=>RE,cexBasisHealth:()=>v$,cexFundingSpread:()=>S$,cexVenueLegs:()=>CE,hyperliquidPerpLeg:()=>_E,hyperliquidSpotLeg:()=>TE,okxPerpLeg:()=>NE,pairwiseFundingSpreads:()=>PE});function xs(e){return{error:String(e.message||e).slice(0,200)}}function lt(e){if(e===""||e==null)return null;let t=Number(e);return Number.isFinite(t)?t:null}function w$(e,t){return e==null||!t?null:e*(8760/t)*100}function Dp(e={}){return String(e.coin||e.symbol||"").trim().toUpperCase().replace(/[-_/]/g,"").replace(/USDT?$/,"")||""}function E$(e={}){let t=e.venues,n=Array.isArray(t)?t:typeof t=="string"&&t.trim()&&t.trim().toLowerCase()!=="all"?t.split(","):Nc,r=new Set(n.map(i=>String(i).trim().toLowerCase()).filter(Boolean)),o=Nc.filter(i=>r.has(i));return o.length?o:Nc}async function _E(e={},t={}){let n=Dp(e);if(!n)return{error:"hyperliquidPerpLeg requires coin"};try{let r=await yg(t),o=r?.[0]?.universe,i=r?.[1];if(!Array.isArray(o)||!Array.isArray(i))return{error:"hyperliquid metaAndAssetCtxs returned an unexpected shape"};let s=o.findIndex(l=>String(l?.name||"").toUpperCase()===n);if(s<0)return{error:`hyperliquid has no perp for ${n}`};let a=i[s]||{},c=lt(a.funding);return{venue:"hyperliquid",market:"perp",symbol:n,markPrice:lt(a.markPx),indexPrice:lt(a.oraclePx),midPrice:lt(a.midPx),fundingRate:c,fundingIntervalHours:$p,fundingAprPct:w$(c,$p),openInterest:lt(a.openInterest)}}catch(r){return xs(r)}}async function TE(e={},t={}){let n=Dp(e);if(!n)return{error:"hyperliquidSpotLeg requires coin"};try{let r=await fg(t),o=lt(r?.[n]);return o==null?{error:`hyperliquid allMids has no entry for ${n}`}:{venue:"hyperliquid",market:"spot",symbol:n,price:o}}catch(r){return xs(r)}}async function NE(e={},t={}){let[n,r]=await Promise.all([Op(e,t).catch(xs),_p(e,t).catch(xs)]);return n?.error&&r?.error?n:{...n?.error?{venue:"okx",market:"perp",fundingError:n.error}:n,markPrice:r?.error?null:lt(r.markPrice),...r?.error?{markError:r.error}:{}}}async function Pr(e,t){try{let n=await t;return[e,n&&typeof n=="object"?n:{error:"empty response"}]}catch(n){return[e,xs(n)]}}async function CE(e={},t={}){let n=Dp(e);if(!n)return{error:"cexVenueLegs requires coin"};let r=e.quote||"USDT",o=E$(e),i=[];o.includes("binance")&&(i.push(Pr("binance:perp",Oc({coin:n,quote:r},t))),i.push(Pr("binance:spot",vp({coin:n,quote:r},t)))),o.includes("okx")&&(i.push(Pr("okx:perp",NE({coin:n,quote:r},t))),i.push(Pr("okx:spot",kp({coin:n,quote:r,market:"spot"},t)))),o.includes("bybit")&&(i.push(Pr("bybit:perp",Tc({coin:n,quote:r},t))),i.push(Pr("bybit:spot",Rp({coin:n,quote:r,market:"spot"},t)))),o.includes("hyperliquid")&&(i.push(Pr("hyperliquid:perp",_E({coin:n},t))),i.push(Pr("hyperliquid:spot",TE({coin:n},t))));let s=await Promise.all(i),a={};for(let[c,l]of s){let[u,d]=c.split(":");a[u]=a[u]||{},a[u][d]=l}return{coin:n,quote:r,venues:o,legs:a}}function OE(e){return!e||e.error?null:lt(e.price)??lt(e.mid)??null}function A$(e){return!e||e.error?null:lt(e.markPrice)??lt(e.midPrice)??null}async function RE(e={},t={}){let n=await CE(e,t);if(n.error)return n;let{coin:r,quote:o,venues:i,legs:s}=n,a=[];for(let m of i){let h=OE(s[m]?.spot);h!=null&&h>0&&a.push(h)}let c=[...a].sort((m,h)=>m-h),l=c.length?c.length%2?c[(c.length-1)/2]:(c[c.length/2-1]+c[c.length/2])/2:null,u=[];for(let m of i){let h=s[m]?.perp,y=s[m]?.spot,g=A$(h),E=OE(y),v=E??l,S=g!=null&&v?(g-v)/v*1e4:null;u.push({venue:m,symbol:h?.symbol??y?.symbol??r,markPrice:g,spotPrice:E,spotSource:E!=null?m:l!=null?"cross-venue-median":null,basisBps:S,fundingRate:h&&!h.error?lt(h.fundingRate):null,fundingIntervalHours:h&&!h.error?lt(h.fundingIntervalHours):null,fundingAprPct:h&&!h.error?lt(h.fundingAprPct):null,openInterest:h&&!h.error?lt(h.openInterest):null,errors:[h?.error,y?.error].filter(Boolean)})}let d=PE(u),p=u.filter(m=>m.markPrice!=null),f=u.filter(m=>m.basisBps!=null);return{coin:r,quote:o,referenceSpot:l,asOf:new Date().toISOString(),venues:u,fundingSpreads:d,widestFundingSpread:d[0]??null,richestBasis:f.length?f.reduce((m,h)=>h.basisBps>m.basisBps?h:m):null,cheapestBasis:f.length?f.reduce((m,h)=>h.basisBps<m.basisBps?h:m):null,venuesPriced:p.length,venuesRequested:i.length,execution:"read-only",exec:!1,note:"Public market data only. Funding compared on an annualized basis (HL settles hourly, CEXes 8h). Not advice."}}function PE(e=[]){let t=e.filter(r=>lt(r?.fundingAprPct)!=null),n=[];for(let r=0;r<t.length;r++)for(let o=r+1;o<t.length;o++){let i=t[r],s=t[o],a=i.fundingAprPct-s.fundingAprPct,c=a>0?s.venue:i.venue,l=a>0?i.venue:s.venue;n.push({pair:`${i.venue}/${s.venue}`,aprSpreadPct:Math.abs(a),signedAprSpreadPct:a,longVenue:c,shortVenue:l})}return n.sort((r,o)=>o.aprSpreadPct-r.aprSpreadPct)}async function S$(e={},t={}){let n=await RE(e,t);return n.error?n:{coin:n.coin,asOf:n.asOf,venues:n.venues.map(r=>({venue:r.venue,symbol:r.symbol,fundingRate:r.fundingRate,fundingIntervalHours:r.fundingIntervalHours,fundingAprPct:r.fundingAprPct,errors:r.errors})),fundingSpreads:n.fundingSpreads,widestFundingSpread:n.widestFundingSpread,execution:"read-only",exec:!1}}async function v$(e={}){try{let t=await Promise.all([Sp(e).catch(()=>({ok:!1})),Ip(e).catch(()=>({ok:!1})),Cp(e).catch(()=>({ok:!1}))]),n={binance:!!t[0]?.ok,okx:!!t[1]?.ok,bybit:!!t[2]?.ok};return{ok:Object.values(n).some(Boolean),provider:"cex-basis",upstream:n,execution:"read-only",exec:!1}}catch(t){return{ok:!1,provider:"cex-basis",error:String(t.message||t).slice(0,160)}}}var Nc,$p,$E=T(()=>{bs();Np();Lp();Yi();Nc=["binance","okx","bybit","hyperliquid"],$p=1});var DE={};Q(DE,{compoundHealth:()=>k$,compoundMarkets:()=>I$});async function I$(e={}){try{return((await R(`${x$}/ctoken`,e))?.cToken||[]).map(n=>({symbol:n?.symbol,underlying:n?.underlying_symbol,supplyApy:n?.supply_rate?.value?`${(Number(n.supply_rate.value)*100).toFixed(2)}%`:null,borrowApy:n?.borrow_rate?.value?`${(Number(n.borrow_rate.value)*100).toFixed(2)}%`:null,totalSupply:n?.total_supply?.value,totalBorrow:n?.total_borrows?.value,collateralFactor:n?.collateral_factor?.value?`${(Number(n.collateral_factor.value)*100).toFixed(0)}%`:null}))}catch(t){return{error:String(t.message||t).slice(0,200)}}}async function k$(){try{return{ok:!0,note:"Compound v2 \u2014 Ethereum mainnet lending"}}catch(e){return{ok:!1,error:String(e.message||e).slice(0,160)}}}var x$,UE=T(()=>{Y();x$="https://api.compound.finance/api/v2"});var BE={};Q(BE,{yearnHealth:()=>T$,yearnVaults:()=>_$});async function _$(e={}){try{return(await R(`${O$}/vaults/all`,e)||[]).map(n=>({name:n?.name,symbol:n?.symbol,apy:n?.apy?.net_apy?`${(Number(n.apy.net_apy)*100).toFixed(2)}%`:null,tvl:n?.tvl?.tvl_deposited,chain:n?.chainId,type:n?.type||"v2"}))}catch(t){return{error:String(t.message||t).slice(0,200)}}}async function T$(){try{return{ok:!0,note:"Yearn \u2014 yield aggregator across Ethereum, Arbitrum, Optimism, Fantom"}}catch(e){return{ok:!1,error:String(e.message||e).slice(0,160)}}}var O$,qE=T(()=>{Y();O$="https://api.yearn.fi/v1"});var ME={};Q(ME,{convexHealth:()=>R$,convexPools:()=>C$});async function C$(e={}){try{return(await R(`${N$}/pools`,e)||[]).map(n=>({name:n?.curvePool?.name||n?.name,curveApy:n?.curvePool?.apy?`${(Number(n.curvePool.apy)*100).toFixed(2)}%`:null,convexApy:n?.apy?`${(Number(n.apy)*100).toFixed(2)}%`:null,tvl:n?.tvl,boosted:n?.boosted||!1}))}catch(t){return{error:String(t.message||t).slice(0,200)}}}async function R$(){try{return{ok:!0,note:"Convex \u2014 CRV/CVX yield optimizer on Ethereum"}}catch(e){return{ok:!1,error:String(e.message||e).slice(0,160)}}}var N$,FE=T(()=>{Y();N$="https://api.convexfinance.com/api"});function uo(e){if(!Number.isSafeInteger(e)||e<0||e>1e3)throw new RangeError("scale must be a safe integer from 0 through 1000")}function _n(e,t){if(typeof e!="bigint")throw new TypeError("mantissa must be a bigint");return uo(t),Object.freeze({mantissa:e,scale:t})}function Lr(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`);uo(e.scale)}function Cc(e){return uo(e),10n**BigInt(e)}function Z(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 _n(s,o.length)}function It(e,t){if(uo(t),typeof e=="bigint")return _n(e,t);if(typeof e!="string"||!/^[+-]?\d+$/.test(e))throw new TypeError("value must be an integer string or bigint");return _n(BigInt(e),t)}function dn(e){Lr(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 Is(e,t){return Lr(e),uo(t),t===e.scale?_n(e.mantissa,e.scale):t>e.scale?_n(e.mantissa*Cc(t-e.scale),t):_n(e.mantissa/Cc(e.scale-t),t)}function Up(e,t){Lr(e,"left"),Lr(t,"right");let n=Math.max(e.scale,t.scale);return[Is(e,n),Is(t,n),n]}function $r(e,t){let[n,r,o]=Up(e,t);return _n(n.mantissa+r.mantissa,o)}function ks(e,t){let[n,r,o]=Up(e,t);return _n(n.mantissa-r.mantissa,o)}function qt(e,t){Lr(e,"left"),Lr(t,"right");let n=e.scale+t.scale;return uo(n),_n(e.mantissa*t.mantissa,n)}function pn(e,t,n=Math.max(e?.scale??0,t?.scale??0)){if(Lr(e,"left"),Lr(t,"right"),uo(n),t.mantissa===0n)throw new RangeError("division by zero");let r=e.mantissa*Cc(t.scale+n),o=t.mantissa*Cc(e.scale);return _n(r/o,n)}function Dr(e,t){let[n,r]=Up(e,t);return n.mantissa<r.mantissa?-1:n.mantissa>r.mantissa?1:0}var rH,Jt=T(()=>{rH=Object.freeze({mantissa:10000n,scale:0})});import{existsSync as HE,readFileSync as P$}from"node:fs";import{dirname as jE,join as Bp}from"node:path";import{fileURLToPath as L$}from"node:url";function $$(e){let t=jE(L$(e));for(let n=0;n<8;n+=1){let r=Bp(t,"package.json");if(HE(r))try{let i=JSON.parse(P$(r,"utf8"));if(i&&typeof i.version=="string")return t}catch{}let o=jE(t);if(o===t)break;t=o}throw new Error(`oracle: could not resolve package root from ${e}`)}function zE(e,t){let n=$$(t),r=Bp(n,e);return HE(r)?r:Bp(n,"dist","assets",e)}var VE=T(()=>{});import{readFileSync as D$,existsSync as U$}from"node:fs";import{fileURLToPath as B$}from"node:url";import{dirname as q$,join as GE}from"node:path";function F$(){try{let e=zE("equities-fixtures",import.meta.url);if(e&&U$(e))return e}catch{}return M$}function H$(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function ie(e,t){throw new TypeError(`Fixture fixtures/${e}: ${t}`)}function Ne(e,t,n){H$(e)||ie(t,`${n} must be an object`)}function le(e,t,n){(typeof e!="string"||e.length===0)&&ie(t,`${n} must be a nonempty string`)}function Tn(e,t,n){Number.isSafeInteger(e)||ie(t,`${n} must be a safe integer`)}function Ur(e,t,n){Ne(e,t,n);for(let[r,o]of Object.entries(e))le(r,t,`${n} key`),Ne(o,t,`${n}.${r}`)}function z$(e,t){Ne(e,t,"root"),Tn(e.capturedAt,t,"capturedAt"),Ne(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];Ne(i,t,`venues.${r}`),le(i.type,t,`venues.${r}.type`),le(i.chain,t,`venues.${r}.chain`),le(i.tier,t,`venues.${r}.tier`),Ur(i[o],t,`venues.${r}.${o}`)}for(let[r,o]of Object.entries(e.venues.hyperliquid_hip3.dexs))Ur(o,t,`venues.hyperliquid_hip3.dexs.${r}`)}function V$(e,t){Ur(e,t,"root"),Object.keys(e).length===0&&ie(t,"root must not be empty");for(let[n,r]of Object.entries(e))Array.isArray(r.venues)||ie(t,`${n}.venues must be an array`),r.venues.forEach((o,i)=>le(o,t,`${n}.venues[${i}]`))}function W$(e,t){Ne(e,t,"root");for(let n of["chainId","block","oracleScaleExp","usdgDecimals","equityDecimals"])Tn(e[n],t,n);le(e.usdg,t,"usdg"),Ur(e.assets,t,"assets");for(let[n,r]of Object.entries(e.assets))le(r.oracle,t,`assets.${n}.oracle`),le(r.token,t,`assets.${n}.token`),(typeof r.rawPrice!="string"||!/^\d+$/.test(r.rawPrice))&&ie(t,`assets.${n}.rawPrice must be an integer string`),(typeof r.usd!="number"||!Number.isFinite(r.usd)||r.usd<0)&&ie(t,`assets.${n}.usd must be a nonnegative finite source number`)}function G$(e,t){Ne(e,t,"root");for(let r of["holidayDayIndex","names","dates"])Array.isArray(e[r])||ie(t,`${r} must be an array`);let n=e.holidayDayIndex.length;(e.names.length!==n||e.dates.length!==n)&&ie(t,"holidayDayIndex, names, and dates must have equal lengths"),e.holidayDayIndex.forEach((r,o)=>Tn(r,t,`holidayDayIndex[${o}]`)),e.names.forEach((r,o)=>le(r,t,`names[${o}]`)),e.dates.forEach((r,o)=>{(typeof r!="string"||!/^\d{4}-\d{2}-\d{2}$/.test(r))&&ie(t,`dates[${o}] must use YYYY-MM-DD`)})}function K$(e,t){Ne(e,t,"root"),(!Array.isArray(e.dstTransitions)||e.dstTransitions.length===0)&&ie(t,"dstTransitions must be a nonempty array");let n=new Set;e.dstTransitions.forEach((r,o)=>{Ne(r,t,`dstTransitions[${o}]`);for(let i of["year","startUtc","endUtc"])Tn(r[i],t,`dstTransitions[${o}].${i}`);r.startUtc>=r.endUtc&&ie(t,`dstTransitions[${o}] startUtc must be before endUtc`),n.has(r.year)&&ie(t,`dstTransitions contains duplicate year ${r.year}`),n.add(r.year)})}function Y$(e,t){Ur(e,t,"root"),Object.keys(e).length===0&&ie(t,"root must not be empty");for(let[n,r]of Object.entries(e)){for(let o of["addr","quote","quoteAddr","dex","pair"])le(r[o],t,`${n}.${o}`);(typeof r.liq!="number"||!Number.isFinite(r.liq)||r.liq<0)&&ie(t,`${n}.liq must be a nonnegative finite source number`)}}function J$(e,t){Ne(e,t,"root"),Tn(e.capturedAt,t,"capturedAt"),Tn(e.block,t,"block"),Tn(e.chainId,t,"chainId"),le(e.gasPriceWei,t,"gasPriceWei"),le(e.stateView,t,"stateView"),Ur(e.pools,t,"pools"),Object.keys(e.pools).length===0&&ie(t,"pools must not be empty");for(let[n,r]of Object.entries(e.pools)){for(let o of["pair","version","quote","token","sqrtPriceX96"])le(r[o],t,`pools.${n}.${o}`);r.version!=="v3"&&r.version!=="v4"&&ie(t,`pools.${n}.version must be v3 or v4`),typeof r.quoteIsToken0!="boolean"&&ie(t,`pools.${n}.quoteIsToken0 must be a boolean`),(!/^[0-9]+$/.test(r.sqrtPriceX96)||BigInt(r.sqrtPriceX96)<=0n)&&ie(t,`pools.${n}.sqrtPriceX96 must be a positive integer string`)}}function X$(e,t){Ne(e,t,"root"),Tn(e.capturedAt,t,"capturedAt"),le(e.source,t,"source"),Ne(e.books,t,"books"),Object.keys(e.books).length===0&&ie(t,"books must not be empty");for(let[n,r]of Object.entries(e.books)){Ne(r,t,`books.${n}`),(!Array.isArray(r.bids)||!Array.isArray(r.asks))&&ie(t,`books.${n} must have bids and asks arrays`);for(let[o,i]of r.bids.entries())Ne(i,t,`books.${n}.bids[${o}]`),le(i.px,t,`books.${n}.bids[${o}].px`),le(i.sz,t,`books.${n}.bids[${o}].sz`);for(let[o,i]of r.asks.entries())Ne(i,t,`books.${n}.asks[${o}]`),le(i.px,t,`books.${n}.asks[${o}].px`),le(i.sz,t,`books.${n}.asks[${o}].sz`)}}function Q$(e,t){Ne(e,t,"root"),Tn(e.capturedAt,t,"capturedAt"),le(e.source,t,"source"),le(e.chain,t,"chain"),Ur(e.tokens,t,"tokens"),Ne(e.pairs,t,"pairs"),Object.keys(e.tokens).length===0&&ie(t,"tokens must not be empty");for(let[n,r]of Object.entries(e.tokens)){le(r.symbolRaw,t,`tokens.${n}.symbolRaw`),le(r.mint,t,`tokens.${n}.mint`),Object.hasOwn(e.pairs,n)||ie(t,`pairs.${n} is required for token ${n}`),(!Array.isArray(e.pairs[n])||e.pairs[n].length===0)&&ie(t,`pairs.${n} must be a nonempty array`);for(let[o,i]of e.pairs[n].entries())Ne(i,t,`pairs.${n}[${o}]`),le(i.pairAddress,t,`pairs.${n}[${o}].pairAddress`),le(i.dexId,t,`pairs.${n}[${o}].dexId`),(typeof i.priceUsd!="number"||!Number.isFinite(i.priceUsd)||i.priceUsd<=0)&&ie(t,`pairs.${n}[${o}].priceUsd must be a positive finite number`),(typeof i.liquidityUsd!="number"||!Number.isFinite(i.liquidityUsd)||i.liquidityUsd<0)&&ie(t,`pairs.${n}[${o}].liquidityUsd must be a nonnegative finite number`)}}function Z$(e,t){Ne(e,t,"root"),Tn(e.capturedAt,t,"capturedAt"),le(e.source,t,"source"),le(e.chain,t,"chain"),e.chain!=="ton"&&ie(t,'chain must be "ton"'),Ur(e.tokens,t,"tokens"),Ne(e.pairs,t,"pairs"),Object.keys(e.tokens).length===0&&ie(t,"tokens must not be empty");for(let[n,r]of Object.entries(e.tokens)){le(r.symbolRaw,t,`tokens.${n}.symbolRaw`),le(r.mint,t,`tokens.${n}.mint`),Object.hasOwn(e.pairs,n)||ie(t,`pairs.${n} is required for token ${n}`),(!Array.isArray(e.pairs[n])||e.pairs[n].length===0)&&ie(t,`pairs.${n} must be a nonempty array`);for(let[o,i]of e.pairs[n].entries())Ne(i,t,`pairs.${n}[${o}]`),le(i.pairAddress,t,`pairs.${n}[${o}].pairAddress`),le(i.dexId,t,`pairs.${n}[${o}].dexId`),(typeof i.priceUsd!="number"||!Number.isFinite(i.priceUsd)||i.priceUsd<=0)&&ie(t,`pairs.${n}[${o}].priceUsd must be a positive finite number`),(typeof i.liquidityUsd!="number"||!Number.isFinite(i.liquidityUsd)||i.liquidityUsd<0)&&ie(t,`pairs.${n}[${o}].liquidityUsd must be a nonnegative finite number`)}}function t2(e,t){let n=KE[t],r=GE(e,n),o;try{o=D$(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 e2[t](i,n),i}function YE(e){if(e!==null&&typeof e=="object"&&!Object.isFrozen(e)){Object.freeze(e);for(let t of Object.values(e))YE(t)}return e}function qp({fixtureDir:e=j$}={}){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(KE))t[n]=t2(e,n);return YE(t)}function or(){return WE??=qp(),WE}function Mt(){return or().venues}function JE(){return or().universe}function XE(){return or().oracles}function QE(){return or().nyseHolidays}function ZE(){return or().dstTransitions}function Rc(){return or().rhPoolState}function eA(){return or().solanaXstocks}function tA(){return or().tonXstocks}function nA(){return or().hip3L2Books}var M$,j$,KE,e2,WE,fn=T(()=>{VE();M$=GE(q$(B$(import.meta.url)),"fixtures");j$=F$(),KE=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"});e2=Object.freeze({venues:z$,universe:V$,oracles:W$,nyseHolidays:G$,dstTransitions:K$,equityDexPools:Y$,rhPoolState:J$,solanaXstocks:Q$,tonXstocks:Z$,hip3L2Books:X$})});function o2(){let e=ZE().dstTransitions.map(r=>({year:r.year,startMs:r.startUtc*Fp,endMs:r.endUtc*Fp}));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 uA(){return oA??=o2(),oA}function i2(){return Mp===void 0&&(Mp=new Set(QE().holidayDayIndex)),Mp}function dA(e,t){if(!Number.isSafeInteger(e))throw new TypeError(`${t}: epochMs must be a safe integer number of milliseconds`)}function s2(e,t){let{coverageStartMs:n,coverageEndMs:r,firstYear:o,lastYear:i}=uA();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 a2(e){for(let t of uA().rows)if(e>=t.startMs&&e<t.endMs)return!0;return!1}function c2(e){return a2(e)?r2:n2}function l2(e){let t=e+c2(e),n=Math.floor(t/rA),r=t-n*rA,o=new Date(t);return{dayIndex:n,minuteOfDay:Math.floor(r/iA),msIntoDay:r,weekday:o.getUTCDay()}}function u2({dayIndex:e,weekday:t}){return t===0||t===6?!1:!i2().has(e)}function d2(e){return e<sA?"dark":e<aA?"extended":e<cA?"core":e<lA?"extended":"dark"}function Os(e){dA(e,"sessionState"),s2(e,"sessionState");let t=l2(e);return u2(t)?d2(t.minuteOfDay):"dark"}function Hp(e){return dA(e,"isDark"),Os(e)==="dark"}var Fp,iA,jp,rA,n2,r2,sA,aA,cA,lA,hH,yH,oA,Mp,Pc=T(()=>{fn();Fp=1e3,iA=60*Fp,jp=60*iA,rA=24*jp,n2=-5*jp,r2=-4*jp,sA=240,aA=570,cA=960,lA=1200,hH=Object.freeze([sA,aA,cA,lA]),yH=Object.freeze(["core","extended","dark"])});function $c(e,t){e.push(Object.freeze({venue:t.venue,symbol:t.symbol??null,reason:t.reason,evidence:t.evidence??null}))}function m2(e){let t=e.raw?.vol24h;return!!(t===0||t===0||typeof t=="number"&&Number.isFinite(t)&&t<=0)}function h2(e){return!e.bid||!e.ask?!1:Dr(e.bid,e.ask)>0}function pA(e,t,n){return Number.isSafeInteger(e.capturedAt)?t-e.capturedAt>n:!1}function Dc(e,t={}){if(!Array.isArray(e))throw new TypeError("quotes must be an array");let n=t.nowMs??Date.now(),r=t.quoteFreshnessMs??p2,o=t.oracleFreshnessMs??f2,i=t.includeDormant===!0,s=[],a=[];for(let c of e){if(m2(c)){i?s.push(Object.freeze({...c,staleData:!0})):$c(a,{venue:c.venue,symbol:c.symbolRaw??c.symbol,reason:Lc.DORMANT_VENUE,evidence:{vol24h:c.raw?.vol24h??null}});continue}if(h2(c)){$c(a,{venue:c.venue,symbol:c.symbolRaw??c.symbol,reason:Lc.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(pA(c,n,r)){$c(a,{venue:c.venue,symbol:c.symbolRaw??c.symbol,reason:Lc.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=Os(n),u=l==="core"?o:o*2;if(pA(c,n,u)){$c(a,{venue:c.venue,symbol:c.symbolRaw??c.symbol,reason:Lc.STALE_ORACLE,evidence:{capturedAt:c.capturedAt,nowMs:n,session:l}});continue}}s.push(c)}return{survivors:s,excluded:a}}var Lc,p2,f2,zp=T(()=>{Jt();Pc();Lc=Object.freeze({DORMANT_VENUE:"dormant-venue",CROSSED_BOOK:"crossed-book",STALE_QUOTE:"stale-quote",STALE_ORACLE:"stale-oracle"}),p2=12e4,f2=6e5});function y2(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 tt(e){return e==null?null:typeof e=="string"?Z(e):typeof e!="number"||!Number.isFinite(e)?null:Z(y2(e))}function mn(e,t){let n=tt(e);if(n===null)throw new TypeError(`${t} must be a finite source number`);return n}var po=T(()=>{Jt()});function we(e,t){throw new TypeError(`${e} ${t}`)}function hA(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function fo(e,t){hA(e)||we(t,"must be an object")}function yA(e,t,n){Object.hasOwn(e,t)||we(`${n}.${t}`,"is required")}function fi(e,t){(typeof e!="string"||e.length===0)&&we(t,"must be a nonempty string")}function _s(e,t,n){t.has(e)||we(n,`must be one of ${[...t].join(", ")}`)}function Wp(e,t){(!Number.isSafeInteger(e)||e<0)&&we(t,"must be a nonnegative safe integer")}function Vp(e,t,n=!1){e===null&&n||(hA(e)||we(t,"must be a fixed point value"),typeof e.mantissa!="bigint"&&we(`${t}.mantissa`,"must be a bigint"),(!Number.isSafeInteger(e.scale)||e.scale<0)&&we(`${t}.scale`,"must be a nonnegative safe integer"))}function Uc(e,t,n=!1){e===null&&n||fo(e,t)}function mA(e,t){fo(e,t),fi(e.venue,`${t}.venue`),fi(e.reason,`${t}.reason`),v2.test(e.reason)||we(`${t}.reason`,"must be a machine readable lower case code"),Object.hasOwn(e,"symbol")&&e.symbol!==null&&fi(e.symbol,`${t}.symbol`)}function kt(e){fo(e,"quote");for(let n of["venue","chain","instrument","tier","symbolRaw","symbol","side","requestedSize",...fA,"costAccounted","capturedAt","blockOrSeq","raw"])yA(e,n,"quote");fi(e.venue,"quote.venue"),!(typeof e.chain=="string"&&e.chain.length>0)&&!(Number.isSafeInteger(e.chain)&&e.chain>=0)&&we("quote.chain","must be a nonempty string or nonnegative chain id"),_s(e.instrument,g2,"quote.instrument"),_s(e.tier,b2,"quote.tier"),fi(e.symbolRaw,"quote.symbolRaw"),fi(e.symbol,"quote.symbol"),_s(e.side,w2,"quote.side"),Vp(e.requestedSize,"quote.requestedSize"),e.requestedSize.mantissa<0n&&we("quote.requestedSize","must not be negative");let t=0;for(let n of S2)Object.hasOwn(e,n)&&(Vp(e[n],`quote.${n}`),t+=1);t===0&&we("quote","must contain at least one of bid, ask, mid, mark");for(let n of fA)Vp(e[n],`quote.${n}`,!0);if(typeof e.costAccounted!="boolean"&&we("quote.costAccounted","must be a boolean"),e.costAccounted){for(let n of["fees","gasEstimate","priceImpact"])e[n]===null&&we(`quote.${n}`,"cannot be unknown when costAccounted is true");e.instrument==="perp"&&e.fundingHourly===null&&we("quote.fundingHourly","cannot be unknown when costAccounted is true for a perp")}return e.instrument==="spot"&&e.fundingHourly!==null&&we("quote.fundingHourly","must be null for a spot quote"),Wp(e.capturedAt,"quote.capturedAt"),e.blockOrSeq!==null&&!(typeof e.blockOrSeq=="string"&&e.blockOrSeq.length>0)&&!(Number.isSafeInteger(e.blockOrSeq)&&e.blockOrSeq>=0)&&we("quote.blockOrSeq","must be null, a nonempty string, or a nonnegative safe integer"),fo(e.raw,"quote.raw"),e}function Bc(e){fo(e,"rankResult");for(let t of["rankedOn","ranked","winner","runnersUp","improvementBps","sourcesAnswered","sourcesTried","failed","excluded","darkWindow","instrumentMix","bestPreparable"])yA(e,t,"rankResult");return _s(e.rankedOn,E2,"rankResult.rankedOn"),Array.isArray(e.ranked)||we("rankResult.ranked","must be an array"),e.ranked.forEach((t,n)=>Uc(t,`rankResult.ranked[${n}]`)),Uc(e.winner,"rankResult.winner",!0),e.ranked.length===0&&e.winner!==null&&we("rankResult.winner","must be null when ranked is empty"),e.ranked.length>0&&e.winner===null&&we("rankResult.winner","must be present when ranked is not empty"),Array.isArray(e.runnersUp)||we("rankResult.runnersUp","must be an array"),e.runnersUp.forEach((t,n)=>Uc(t,`rankResult.runnersUp[${n}]`)),e.improvementBps!==null&&!(typeof e.improvementBps=="number"&&Number.isFinite(e.improvementBps))&&we("rankResult.improvementBps","must be a finite number or null"),Wp(e.sourcesAnswered,"rankResult.sourcesAnswered"),Wp(e.sourcesTried,"rankResult.sourcesTried"),e.sourcesAnswered>e.sourcesTried&&we("rankResult.sourcesAnswered","must not exceed sourcesTried"),Array.isArray(e.failed)||we("rankResult.failed","must be an array"),e.failed.forEach((t,n)=>mA(t,`failed[${n}]`)),Array.isArray(e.excluded)||we("rankResult.excluded","must be an array"),e.excluded.forEach((t,n)=>mA(t,`excluded[${n}]`)),e.darkWindow!==null&&fo(e.darkWindow,"rankResult.darkWindow"),_s(e.instrumentMix,A2,"rankResult.instrumentMix"),Uc(e.bestPreparable,"rankResult.bestPreparable",!0),Object.hasOwn(e,"carry")&&e.carry!==null&&fo(e.carry,"rankResult.carry"),e}var g2,b2,w2,E2,A2,S2,fA,v2,ir=T(()=>{g2=new Set(["spot","perp"]),b2=new Set(["read-only","quote-only","prepare","intent"]),w2=new Set(["buy","sell"]),E2=new Set(["net-of-cost","gross"]),A2=new Set(["homogeneous","heterogeneous"]),S2=["bid","ask","mid","mark"],fA=["fees","gasEstimate","priceImpact","fundingHourly"],v2=/^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$/});function gA(){return Mt().venues.arcus}function O2(){return Object.keys(gA().markets).sort()}function _2({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=gA().markets[r];if(!o)return null;let i=mn(o.mark,`${r}.mark`),s=tt(o.oracle),a=tt(o.fundingHourly),c=n===null?Z("0"):n,l={venue:x2,chain:I2,instrument:"perp",tier:k2,symbolRaw:e,symbol:r,side:t,requestedSize:c,mark:i,fees:null,gasEstimate:null,priceImpact:null,fundingHourly:a,costAccounted:!1,capturedAt:Mt().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:qc,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),kt(l)}function Mc({side:e="buy",sizeUsd:t=null}={}){return O2().map(n=>_2({symbol:n,side:e,sizeUsd:t})).filter(n=>n!==null)}var x2,I2,k2,qc,Gp=T(()=>{fn();po();Jt();ir();x2="arcus_perp",I2="robinhood-4663",k2="quote-only",qc="0.00000480324074074"});function Kp(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 Z("0");let r=Z(String(t)),o=It(10000n,0);return qt(qt(e,r),o)}function wA(e,t,n={}){if(e.instrument!=="perp")return{model:"current-funding-held-constant",horizonHours:t,carryBps:Z("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=T2(r,t),c=t-a,l=Z(qc),u=Kp(i,c),d=Kp(l,a),p=Math.max(u.scale,d.scale),f={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:f,carryBpsDisplay:dn(f),confidence:"estimate",darkHours:a,litHours:c,darkWindowRate:qc,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=Kp(i,t);return{model:"current-funding-held-constant",horizonHours:t,carryBps:s,carryBpsDisplay:dn(s),confidence:"estimate",compounding:"ignored",compoundingErrorBoundNote:"simple sum; at 30d and 1e-5/h the ignored compound is under 0.5bp"}}function T2(e,t){if(t<=0)return 0;let n=0,r=Math.floor(t);for(let o=0;o<r;o+=1)Hp(e+o*bA)&&(n+=1);return t>r&&Hp(e+r*bA)&&(n+=t-r),n}var bA,PH,EA=T(()=>{Jt();Gp();Pc();bA=36e5,PH=24*365});function N2(e){return e.mid??e.mark??e.ask??e.bid??null}function C2(e){let t=N2(e);if(t===null)return null;let n=e.costAccounted===!0,r=Z("0");e.fees!==null?r=$r(r,e.fees):n=!1,e.priceImpact!==null?r=$r(r,e.priceImpact):e.requestedSize&&e.requestedSize.mantissa>0n&&(n=!1),e.gasEstimate===null?n=!1:r=$r(r,e.gasEstimate);let o;if(e.fees!==null&&Dr(e.fees,Z("1"))<0&&Dr(e.fees,Z("0"))>=0){let i=$r(Z("1"),e.fees);o=qt(t,i),e.priceImpact!==null&&(o=$r(o,qt(t,e.priceImpact)))}else o=$r(t,r);return{net:o,costAccounted:n,px:t}}function R2(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 P2(e,t){if(!e||!t||!e.costAccounted||!t.costAccounted||e.instrument!==t.instrument||e.net.mantissa===0n)return null;let n=ks(t.net,e.net);return pn(qt(n,It(10000n,0)),t.net,4)}function Fc(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 A=Dc(e,{nowMs:n});o=A.survivors,i=A.excluded}let s=e.length,a=[],c=t.horizonHours,l=Number.isFinite(c)&&c>0,u=[];for(let A of o){let w=C2(A);if(w===null)continue;let b=null;if(l&&A.instrument==="perp"&&(b=wA(A,c,{nowMs:n}),b.carryBps!==null)){let x=$r(Z("1"),pn(b.carryBps,It(10000n,0),12));w.net=qt(w.net,x),w.costAccounted=!1}u.push(R2(A,w,b))}let d=u,p="homogeneous";if(l)p="heterogeneous",d=u;else{let A=u.filter(b=>b.instrument==="spot"),w=u.filter(b=>b.instrument==="perp");A.length>0&&w.length>0?(d=A.length>=w.length?A:w,p="homogeneous"):(d=u,p="homogeneous")}d.sort((A,w)=>{let b=Dr(A.net,w.net);return b!==0?b:A.venue<w.venue?-1:A.venue>w.venue?1:0});let f=d[0]??null,m=d.slice(1),h=d,y="gross";f&&f.costAccounted&&(m.length===0||m[0].costAccounted)&&(y="net-of-cost");let g=m.length===0?null:P2(f,m[0]),E=u.find(A=>A.tier==="prepare")??null,v=Os(n),S=v==="core"?null:{session:v,warning:v==="dark"?"market is dark; marks are not real price discovery":"extended session; thinner books and higher staleness risk"},I=null;l&&(I=L2(u));let k={rankedOn:y,ranked:h,winner:f,runnersUp:m,improvementBps:g===null?null:Number(dn(g)),sourcesAnswered:s,sourcesTried:r,failed:a,excluded:i,darkWindow:S,instrumentMix:p,bestPreparable:E,carry:f?.carry??null,breakEvenHorizonHours:I};return Bc(k)}function L2(e){let t=e.filter(i=>i.instrument==="spot").sort((i,s)=>Dr(i.net,s.net))[0],n=e.filter(i=>i.instrument==="perp").sort((i,s)=>Dr(i.net,s.net))[0];if(!t||!n||n.fundingHourly===null)return null;let r=ks(t.net,n.net);if(r.mantissa===0n)return 0;let o=qt(n.fundingHourly,n.price);if(o.mantissa===0n)return null;try{let i=pn(r,o,4),s=Number(dn(i));return!Number.isFinite(s)||s<0?null:s}catch{return null}}var Yp=T(()=>{zp();EA();Pc();Jt();ir()});function Jp(){return Rc()}function M2(e){return{mantissa:e*e*10n**BigInt(mi)/B2,scale:mi}}function F2(e){let t=M2(BigInt(e.sqrtPriceX96)),n=e.quote==="USDG"?6:18,r=18;if(e.quoteIsToken0){let o=pn(qt(t,It(10n**BigInt(n),0)),It(10n**BigInt(r),0),mi);return o.mantissa===0n?null:pn(Z("1"),o,mi)}return pn(qt(t,It(10n**BigInt(r),0)),It(10n**BigInt(n),0),mi)}function j2(e){let t=XE(),n=t.assets[e];return n?It(n.rawPrice,t.oracleScaleExp):null}function H2(e,t){if(e===null||t===null||e.mantissa<=0n||t.mantissa<=0n)return null;let n={...e};return pn(t,z2(n,t),mi)}function z2(e,t){let n=Math.max(e.scale,t.scale);return{mantissa:Is(e,n).mantissa+Is(t,n).mantissa,scale:n}}function V2(e){let t=Jp(),n=q2[e];return n?{wei:BigInt(t.gasPriceWei)*n,units:n,native:"ETH"}:null}function Xp(){return Object.keys(Jp().pools).sort()}function hi({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=Jp(),o=r.pools[e];if(!o)return null;let i=F2(o);if(i===null)return null;let s=tt(o.liqUsd),a=n===null?Z("0"):n,c=o.feePpm===null||o.feePpm===void 0?null:pn(It(BigInt(o.feePpm),0),It(1000000n,0),8),l=a.mantissa===0n?Z("0"):H2(s,a),u=V2(o.version),f={venue:$2,chain:D2,instrument:"spot",tier:U2,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"]}},m=j2(e);return m!==null&&(f.referencePrice=m,f.referenceBasisBps=dn(pn(qt(ks(i,m),It(10000n,0)),m,4))),kt(f)}function AA({side:e="buy",sizeUsd:t=null}={}){return Xp().map(n=>hi({symbol:n,side:e,sizeUsd:t})).filter(n=>n!==null)}var $2,D2,U2,B2,mi,q2,Qp=T(()=>{fn();po();Jt();ir();$2="rh_uniswap",D2=4663,U2="prepare",B2=1n<<192n,mi=18,q2=Object.freeze({v3:180000n,v4:240000n})});function jc(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=hi({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>SA)throw new Error(`quote is stale (${a}ms old, bound ${SA}ms); re-quote before preparing`);let l=Rc().pools[t],u=l.version==="v4"?G2:W2,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 SA,W2,G2,Zp=T(()=>{Qp();fn();SA=12e4,W2="0x0000000000000000000000000000000000000000",G2="0x84b75b19A3cdf8E2F56d0507d22D442847B2053C"});function Ts(){return Mt().venues.hyperliquid_hip3}function vA(){return Object.keys(Ts().dexs).sort()}function X2(){let e=[];for(let[t,n]of Object.entries(Ts().dexs))for(let r of Object.keys(n))e.push(`${t}:${r}`);return e.sort()}function Q2(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=Ts().dexs[r]?.[o];return i?[{dex:r,ticker:o,market:i}]:[]}let n=[];for(let[r,o]of Object.entries(Ts().dexs))Object.hasOwn(o,e)&&n.push({dex:r,ticker:e,market:o[e]});return n}function Z2(e,t){try{return nA().books[`${e}:${t}`]??null}catch{return null}}function eD(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(dn(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),f=p/l;if(i+=p,s+=f,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 tD(e,t,n,r){let o=eD(e,t,n);if(!o)return{impact:null,depth:null};let i=Number(dn(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:tt(Number(a.toPrecision(12))),depth:{...o,impactFraction:a,fullyFilled:o.unfilledUsd<=1e-6}}}function xA({dex:e,ticker:t,market:n,side:r,size:o}){let i=mn(n.mark,`${e}:${t}.mark`),s=tt(n.fundingHourly),a=tt(n.vol24h),c=tt(n.oi),l=o===null?Z("0"):o,u=Z2(e,t),d=null,p=null,f="fees and gas not captured";if(l.mantissa>0n)if(u){let y=tD(u,r,l,i);d=y.impact,p=y.depth,p?.fullyFilled?f="impact measured from l2Book; fees and gas still not captured":f="book walked but size exceeds visible depth; fees and gas not captured"}else f="no order book depth wired for this coin; fees and gas not captured";else u?f="zero size; fees and gas not captured":f="no order book depth wired for this coin; fees and gas not captured";let h={venue:K2,chain:Y2,instrument:"perp",tier:J2,symbolRaw:`${e}:${t}`,symbol:t,side:r,requestedSize:l,mark:i,fees:null,gasEstimate:null,priceImpact:d,fundingHourly:s,costAccounted:!1,capturedAt:Mt().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:f,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=Z(String(u.bids[0].px)),h.ask=Z(String(u.asks[0].px))),kt(h)}function IA({symbol:e,side:t="buy",sizeUsd:n=null}={}){let r=Q2(e);return r.length===0||r.length>1?null:xA({...r[0],side:t,size:n})}function Hc({side:e="buy",sizeUsd:t=null,ticker:n=null}={}){let r=[];for(let o of X2()){let[i,s]=o.split(":");if(n!==null&&s!==n)continue;let a=Ts().dexs[i][s];r.push(xA({dex:i,ticker:s,market:a,side:e,size:t}))}return r}var K2,Y2,J2,kA=T(()=>{fn();po();Jt();ir();K2="hyperliquid_hip3",Y2="hyperliquid",J2="quote-only"});function OA(){return Mt().venues.arcus_spot}function iD(){return Object.keys(OA().pairs).sort()}function sD({symbol:e,side:t="buy",sizeUsd:n=null}={}){if(typeof e!="string"||e.length===0)return null;let r=OA().pairs[e];if(!r)return null;let o=r.bid===void 0||r.bid===null?null:mn(r.bid,`${e}.bid`),i=r.ask===void 0||r.ask===null?null:mn(r.ask,`${e}.ask`),s=tt(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),f=i.scale===d?i.mantissa:i.mantissa*10n**BigInt(d-i.scale);a={mantissa:p+f,scale:d+1},a={mantissa:(p+f)/2n,scale:d}}else s!==null&&(a=s);if(o===null&&i===null&&a===null)return null;let c=n===null?Z("0"):n,l=Z("0"),u={venue:nD,chain:rD,instrument:"spot",tier:oD,symbolRaw:e,symbol:e,side:t,requestedSize:c,fees:l,gasEstimate:null,priceImpact:null,fundingHourly:null,costAccounted:!1,capturedAt:Mt().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),kt(u)}function zc({side:e="buy",sizeUsd:t=null}={}){return iD().map(n=>sD({symbol:n,side:e,sizeUsd:t})).filter(n=>n!==null)}var nD,rD,oD,_A=T(()=>{fn();po();Jt();ir();nD="arcus_spot",rD="robinhood-4663",oD="quote-only"});function Vc(){return eA()}function ef(){return Object.keys(Vc().tokens).sort()}function uD(e){let t=Vc().pairs[e];return!t||t.length===0?null:[...t].sort((n,r)=>(r.liquidityUsd??0)-(n.liquidityUsd??0))[0]}function dD(e,t){if(e===null||t===null)return null;if(e.mantissa<=0n||t.mantissa<=0n)return Z("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 tf({symbol:e,side:t="buy",sizeUsd:n=null}={}){if(typeof e!="string"||e.length===0)return null;let r=e,o=e,i=Vc().tokens;if(Object.hasOwn(i,e))r=e,o=i[e].symbolRaw;else if(e.endsWith("x")||e.endsWith("X")){let m=e.slice(0,-1).toUpperCase();if(Object.hasOwn(i,m))r=m,o=i[m].symbolRaw;else return null}else return null;let s=i[r],a=uD(r);if(!s||!a)return null;let c=mn(a.priceUsd,`${r}.priceUsd`),l=tt(a.liquidityUsd),u=n===null?Z("0"):n,d=u.mantissa===0n?Z("0"):dD(l,u),p=!1;u.mantissa===0n&&(a.liquidityUsd??0)>=TA&&(p=!1);let f={venue:aD,chain:cD,instrument:"spot",tier:lD,symbolRaw:o,symbol:r,side:t,requestedSize:u,mid:c,fees:null,gasEstimate:null,priceImpact:d,fundingHourly:null,costAccounted:p,capturedAt:Vc().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)<TA}};return kt(f)}function NA({side:e="buy",sizeUsd:t=null}={}){return ef().map(n=>tf({symbol:n,side:e,sizeUsd:t})).filter(n=>n!==null)}var aD,cD,lD,TA,CA=T(()=>{fn();po();Jt();ir();aD="solana_xstocks",cD="solana",lD="quote-only",TA=25e3});function Wc(){return tA()}function nf(){return Object.keys(Wc().tokens).sort()}function gD(e){let t=Wc().pairs[e];return!t||t.length===0?null:[...t].sort((n,r)=>(r.liquidityUsd??0)-(n.liquidityUsd??0))[0]}function bD(e,t){if(e===null||t===null)return null;if(e.mantissa<=0n||t.mantissa<=0n)return Z("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 rf({symbol:e,side:t="buy",sizeUsd:n=null}={}){if(typeof e!="string"||e.length===0)return null;let r=e,o=e,i=Wc().tokens;if(Object.hasOwn(i,e))r=e,o=i[e].symbolRaw;else if(e.endsWith("x")||e.endsWith("X")){let m=e.slice(0,-1).toUpperCase();if(Object.hasOwn(i,m))r=m,o=i[m].symbolRaw;else return null}else{let m=e.toUpperCase();if(Object.hasOwn(i,m))r=m,o=i[m].symbolRaw;else return null}let s=i[r],a=gD(r);if(!s||!a)return null;let c=mn(a.priceUsd,`${r}.priceUsd`),l=tt(a.liquidityUsd),u=n===null?Z("0"):n,d=u.mantissa===0n?Z("0"):bD(l,u),f={venue:pD,chain:fD,instrument:"spot",tier:mD,symbolRaw:o,symbol:r,side:t,requestedSize:u,mid:c,fees:null,gasEstimate:null,priceImpact:d,fundingHourly:null,costAccounted:!1,capturedAt:Wc().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)<hD,impactSizeFractionHint:yD}};return kt(f)}function RA({side:e="buy",sizeUsd:t=null}={}){return nf().map(n=>rf({symbol:n,side:e,sizeUsd:t})).filter(n=>n!==null)}var pD,fD,mD,hD,yD,PA=T(()=>{fn();po();Jt();ir();pD="ton_stonfi",fD="ton",mD="quote-only",hD=25e3,yD=.01});var Gc={};Q(Gc,{bestEquityRoute:()=>wD,collectEquityQuotes:()=>$A,equityVenues:()=>ED,getUniverse:()=>JE,getVenues:()=>Mt,loadFixtures:()=>qp,prepareEquity:()=>jc,prepareEquityRoute:()=>AD,rankEquityQuotes:()=>Fc,toJsonSafe:()=>SD,validateQuote:()=>kt,validateRankResult:()=>Bc});function of(e){return e==null||e===""?null:typeof e=="object"&&e&&typeof e.mantissa=="bigint"?e:Z(String(e))}function $A(e,{sizeUsd:t=null}={}){if(typeof e!="string"||!e.trim())throw new TypeError("ticker is required");let n=e.trim().toUpperCase(),r=of(t),o=[],i=IA({symbol:`xyz:${n}`,sizeUsd:r});if(i)o.push(i);else for(let l of Hc({ticker:n,sizeUsd:r}))o.push(l);for(let l of Mc({sizeUsd:r}))l.symbol===n&&o.push(l);for(let l of zc({sizeUsd:r}))l.symbol===n&&o.push(l);let s=hi({symbol:n,sizeUsd:r});s&&o.push(s);let a=tf({symbol:n,sizeUsd:r});a&&o.push(a);let c=rf({symbol:n,sizeUsd:r});return c&&o.push(c),o}function wD(e={}){let t=String(e.ticker||e.symbol||"").trim().toUpperCase();if(!t)throw new Error("bestEquityRoute requires ticker");let n=of(e.sizeUsd??e.size??null),r=$A(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=Fc(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>LA}}function ED(){let e=[{venue:"hyperliquid_hip3",tier:"quote-only",chain:"hyperliquid",n:Hc().length},{venue:"arcus_perp",tier:"quote-only",chain:"robinhood-4663",n:Mc().length},{venue:"arcus_spot",tier:"quote-only",chain:"robinhood-4663",n:zc().length},{venue:"rh_uniswap",tier:"prepare",chain:4663,n:Xp().length},{venue:"solana_xstocks",tier:"quote-only",chain:"solana",n:ef().length},{venue:"ton_stonfi",tier:"quote-only",chain:"ton",n:nf().length}],t=[...Hc(),...Mc(),...zc(),...AA(),...NA(),...RA()],n=(t[0]?.capturedAt??Date.now())+1e3,{survivors:r,excluded:o}=Dc(t,{nowMs:n});return{inventory:e,hip3Dexs:vA(),liveness:{survivors:r.length,excluded:o.length,byReason:o.reduce((i,s)=>(i[s.reason]=(i[s.reason]??0)+1,i),{})},capturedAt:Mt().capturedAt,custody:"prepare-only",note:"quote-only venues are ranked for discovery; only rh_uniswap is preparable in v1"}}function AD(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=of(e.sizeUsd??e.size??null),o=hi({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=jc({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>LA}}catch(i){return{ok:!1,failureKind:"prepare-refused",ticker:t,error:String(i.message||i)}}}function SD(e){return JSON.parse(JSON.stringify(e,(t,n)=>typeof n=="bigint"?n.toString():n))}var LA,Kc=T(()=>{Jt();Yp();Zp();zp();kA();_A();Gp();Qp();CA();PA();fn();Yp();Zp();ir();fn();LA=3600*1e3});var Yc={};Q(Yc,{CHAIN_CONFIGS:()=>gr,EVIDENCE:()=>J,RISK:()=>G,SCANNER_CAPABILITIES:()=>xo,__clearScanners:()=>GI,createScanner:()=>Wm,getScanner:()=>Jl,listScanners:()=>Gm,registerBuiltinScanners:()=>Ra,registerCustomChain:()=>dy,registerScanner:()=>ua,scannerCoverage:()=>KI,validateScanner:()=>Vm});var Jc=T(()=>{mr();Mi()});var cf={};Q(cf,{createWatch:()=>OD,listWatches:()=>kD,removeWatch:()=>_D});import Ns from"node:fs";import sf from"node:path";import{randomUUID as vD}from"node:crypto";import{homedir as xD}from"node:os";function ID(e=process.env){return e.ORACLE_CONFIG_DIR||sf.join(xD(),".config","oracle")}function DA(e=process.env){return sf.join(ID(e),"watches.json")}function af(e=process.env){let t=DA(e);if(!Ns.existsSync(t))return{watches:[]};try{let n=JSON.parse(Ns.readFileSync(t,"utf8"));return{watches:Array.isArray(n.watches)?n.watches:[]}}catch{return{watches:[]}}}function UA(e,t=process.env){let n=DA(t);Ns.mkdirSync(sf.dirname(n),{recursive:!0,mode:448});let r=`${n}.${process.pid}.tmp`;Ns.writeFileSync(r,`${JSON.stringify(e,null,2)}
9
+ `,{mode:384}),Ns.renameSync(r,n)}function kD(e=process.env){return af(e).watches}function OD({chain:e,token:t,condition:n,note:r}={},o=process.env){if(!e||!t||!n)throw new Error("watch requires chain, token, condition");let i={id:vD(),chain:String(e),token:String(t),condition:String(n),note:r?String(r):null,actionMode:"alert_only",createdAt:new Date().toISOString()},s=af(o);return s.watches.push(i),UA(s,o),i}function _D(e,t=process.env){let n=af(t),r=n.watches.filter(o=>o.id!==e);return r.length===n.watches.length?!1:(UA({watches:r},t),!0)}var lf=T(()=>{});var BA={};Q(BA,{classifyReceipt:()=>TD});function TD(e){let t=e?.transactionHash||e?.hash||e?.txid||null;return t?{happened:!0,hash:String(t),note:null}:{happened:!1,hash:null,note:"no transaction hash \u2014 the action did not succeed"}}var qA=T(()=>{});function LD(e){return!(PD.has(e)||/^0x/i.test(e)||!/\d/.test(e)&&e===e.toLowerCase()||!/\d/.test(e)&&e===e.toUpperCase())}function MA(e,{extras:t=[]}={}){let n=[e,...t].map(i=>String(i||"")).join(`
10
+ `),r=[...new Set((n.match(ND)||[]).map(i=>i.toLowerCase()))].filter(i=>!RD.has(i)),o=[...new Set(n.match(CD)||[])].filter(LD);return{evm:r,solana:o,all:[...r.map(i=>({chainFamily:"evm",address:i})),...o.map(i=>({chainFamily:"solana",address:i}))]}}function FA(e){let t=String(e||"").trim();if(!t)return[];let n=[],r=o=>{if(!o||typeof o!="object")return;let i=String(o.id||o.id_str||o.tweetId||o.statusId||""),s=o.text||o.full_text||o.fullText||o.body||o.note_tweet?.text||"",a=[],c=o.entities?.urls||o.entities?.Urls||[];for(let l of c)l?.expanded_url&&a.push(l.expanded_url),l?.url&&a.push(l.url);(i||s)&&n.push({id:i,text:String(s),urls:a,raw:o})};try{let o=JSON.parse(t),i=Array.isArray(o)?o:o.data?Array.isArray(o.data)?o.data:[o.data]:o.tweets||o.statuses||o.results||[];Array.isArray(i)?i.forEach(r):r(o)}catch{for(let o of t.split(`
11
+ `)){let i=o.trim();if(i.startsWith("{"))try{r(JSON.parse(i))}catch{}}n.length||n.push({id:"",text:t,urls:[]})}return n}var ND,CD,RD,PD,jA=T(()=>{ND=/\b0x[a-fA-F0-9]{40}\b/g,CD=/\b[1-9A-HJ-NP-Za-km-z]{32,44}\b/g,RD=new Set(["0x0000000000000000000000000000000000000000","0x000000000000000000000000000000000000dead","0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee"].map(e=>e.toLowerCase())),PD=new Set(["So11111111111111111111111111111111111111112","EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v","Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB","11111111111111111111111111111111"])});import{spawnSync as $D}from"node:child_process";import HA from"node:fs";import uf from"node:path";function qD(e=process.env){let t=String(e.ORACLE_XURL_ENABLED||"").trim().toLowerCase();return t==="1"||t==="true"||t==="yes"||t==="on"}function WA(e=process.env){let t=String(e.ORACLE_XURL_ALLOW_WRITE||"").trim().toLowerCase();return t==="1"||t==="true"||t==="yes"||t==="on"}function MD(e=process.env){let t=String(e.ORACLE_XURL_BIN||"").trim();if(t)return uf.isAbsolute(t)?HA.existsSync(t)?{ok:!0,bin:t}:{ok:!1,error:`ORACLE_XURL_BIN not found: ${t}`}:{ok:!1,error:"ORACLE_XURL_BIN must be absolute"};let n=String(e.PATH||process.env.PATH||"");for(let r of n.split(uf.delimiter)){if(!r)continue;let o=uf.join(r,"xurl");try{if(HA.existsSync(o))return{ok:!0,bin:o}}catch{}}return{ok:!1,error:"xurl binary not found on PATH. Install: curl -fsSL https://raw.githubusercontent.com/xdevplatform/xurl/main/install.sh | bash"}}function FD(e=process.env){let t=e.HOME||process.env.HOME||"";return{PATH:e.PATH||process.env.PATH||"/usr/bin:/bin",HOME:t,USER:e.USER||process.env.USER||"",LANG:e.LANG||process.env.LANG||"C.UTF-8",LC_ALL:e.LC_ALL||process.env.LC_ALL||"C.UTF-8",XDG_CONFIG_HOME:e.XDG_CONFIG_HOME||process.env.XDG_CONFIG_HOME||"",XDG_DATA_HOME:e.XDG_DATA_HOME||process.env.XDG_DATA_HOME||"",NO_COLOR:"1"}}function jD(e){for(let t of e){let n=String(t);if(VA.includes(n))return n;if(VA.some(r=>r.startsWith("--")&&n.startsWith(`${r}=`)))return n.split("=")[0]}return null}function HD(e={},t=process.env){let n;if(Array.isArray(e.argv))n=e.argv.map(c=>String(c));else{let c=String(e.command||e.cmd||"").trim();if(!c)return{ok:!1,error:"command is required (e.g. whoami, search, read, post)"};let l=Array.isArray(e.args)?e.args.map(u=>String(u)):typeof e.query=="string"?[e.query]:typeof e.text=="string"?[e.text]:typeof e.id=="string"?[e.id]:typeof e.handle=="string"?[e.handle]:[];c==="search"&&e.limit!=null&&l.push("-n",String(Math.min(50,Math.max(1,Number(e.limit)||10)))),(c==="timeline"||c==="mentions")&&e.limit!=null&&l.push("-n",String(Math.min(50,Math.max(1,Number(e.limit)||10)))),n=[c,...l]}if(n.length===0)return{ok:!1,error:"empty argv"};if(n.length>24)return{ok:!1,error:"too many arguments"};for(let c of n)if(String(c).length>4e3)return{ok:!1,error:"argument too long"};let r=jD(n);if(r)return{ok:!1,error:`forbidden flag: ${r}`};if(n.some(c=>String(c).includes("\0")))return{ok:!1,error:"nul byte in argv"};let o=String(n[0]||"").replace(/^\//,"");if(o.startsWith("2/")||n[0].startsWith("/2/")||n[0].startsWith("https://api.x.com/")){if(!WA(t)&&n.some(c=>/^-X$/.test(c)||/^--request$/.test(c))){let c=n.findIndex(u=>u==="-X"||u==="--request"),l=String(n[c+1]||"GET").toUpperCase();if(l!=="GET"&&l!=="HEAD")return{ok:!1,error:"raw non-GET requires ORACLE_XURL_ALLOW_WRITE=true"}}}else if(o==="auth"){if(String(n[1]||"")!=="status")return{ok:!1,error:"only `auth status` is allowed (no apps add / oauth2 from the agent)"}}else if(!UD.includes(o))if(BD.includes(o)){if(!WA(t))return{ok:!1,error:`write command '${o}' requires ORACLE_XURL_ALLOW_WRITE=true`}}else return o==="media"?{ok:!1,error:"media upload is disabled in the agent tool (run xurl media outside the agent)"}:{ok:!1,error:`command not allowlisted: ${o}`};let i=[...n],s=String(t.ORACLE_XURL_APP||"").trim(),a=String(t.ORACLE_XURL_USER||"").trim();if(s&&!i.includes("--app")&&i.unshift("--app",s),a&&!i.includes("--username")&&!i.includes("-u")){let c=0;i[0]==="--app"&&(c=2),c<i.length&&i.splice(c+1,0,"-u",a)}return{ok:!0,argv:i,command:o}}async function GA(e,t={},n={}){if(e!=="xurl")return{ok:!1,error:`unknown tool: ${e}`};let r=n.env||process.env;if(!qD(r))return{ok:!1,error:"xurl is disabled. Set ORACLE_XURL_ENABLED=true after `xurl auth status` succeeds. Writes stay off until ORACLE_XURL_ALLOW_WRITE=true."};let o=HD(t,r);if(!o.ok)return o;let i=MD(r);if(!i.ok)return i;let a=(n.spawnFn||$D)(i.bin,o.argv,{encoding:"utf8",timeout:n.timeoutMs||zA,maxBuffer:1024*1024,env:FD(r)});if(a.error){let d=a.error.code==="ETIMEDOUT"?`xurl timed out after ${n.timeoutMs||zA}ms`:String(a.error.message||a.error);return{ok:!1,error:Hr(d,{force:!0})}}let c=Hr(String(a.stdout||"").slice(0,DD),{force:!0}),l=Hr(String(a.stderr||"").slice(0,2e3),{force:!0}),u=typeof a.status=="number"?a.status:1;return{ok:u===0,status:u,command:o.command,argv:o.argv.map(d=>/=/.test(d)&&/token|secret|key|bearer/i.test(d)?"[redacted-arg]":d),stdout:c,stderr:l||void 0}}var zA,DD,UD,BD,VA,Wz,KA=T(()=>{vl();zA=45e3,DD=4e4,UD=Object.freeze(["whoami","user","read","search","timeline","mentions","bookmarks","likes","following","followers","dms","auth"]),BD=Object.freeze(["post","reply","quote","delete","like","unlike","repost","unrepost","bookmark","unbookmark","follow","unfollow","block","unblock","mute","unmute","dm"]),VA=Object.freeze(["--verbose","-v","--trace","-t","--bearer-token","--consumer-key","--consumer-secret","--access-token","--token-secret","--client-id","--client-secret"]);Wz=Object.freeze([{type:"function",function:{name:"xurl",description:"Call the official xurl CLI against the X API with an allowlisted command. Reads (whoami/user/read/search/timeline/mentions/...) work when ORACLE_XURL_ENABLED=true. Writes (post/reply/like/follow/dm/...) also need ORACLE_XURL_ALLOW_WRITE=true. Never pass secrets or --verbose. Auth is whatever the operator configured in ~/.xurl.",parameters:{type:"object",properties:{command:{type:"string",description:"xurl subcommand: whoami, user, read, search, timeline, mentions, post, reply, ..."},args:{type:"array",items:{type:"string"},description:"Positional args after the command (query, id, handle, text)."},query:{type:"string",description:"Convenience for search query."},text:{type:"string",description:"Convenience for post/reply/dm text."},id:{type:"string",description:"Convenience for read/like/reply target id or URL."},handle:{type:"string",description:"Convenience for user/follow/dm handle."},limit:{type:"integer",description:"Result limit for search/timeline/mentions (1-50)."},argv:{type:"array",items:{type:"string"},description:"Raw argv alternative (still allowlisted + flag-filtered)."}},additionalProperties:!1}}}])});function GD(e){return!e||e==="0x"||e===WD}async function YA(e={},t={}){let n=t.rpcCall||de,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(h){return{address:r,chainId:o,status:"unavailable",error:h?.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[h,y]of Object.entries(zD))c.includes(h)&&a.push({selector:`0x${h}`,...y});let l=!1,u=null,d=null,p=await Promise.all(VD.map(async({label:h,slot:y})=>{try{let g=await n(o,"eth_getStorageAt",[r,y,"latest"],t);return{label:h,word:g,error:null}}catch{return{label:h,word:null,error:`proxy slot (${h}) unreadable; proxy status uncertain`}}}));for(let h of p)h.error&&s.push(h.error),!l&&h.word&&!GD(h.word)&&(l=!0,u=h.label,d=`0x${String(h.word).slice(-40)}`);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(h=>h.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}}var zD,VD,WD,JA=T(()=>{Qt();zD=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"}}),VD=Object.freeze([{label:"eip1967",slot:"0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc"},{label:"zeppelinos",slot:"0x7050c9e0f4ca769c69bd3a8ef740bc37934f8e2c036e5a723fd8ee048ed3f8c3"},{label:"eip1822",slot:"0xc5f16f0fcc639fa48a6947836d9850f504798523bf8c9a3a87d5876cf622bcf7"}]),WD=`0x${"0".repeat(64)}`});function Xc(e,t){let n=String(e||"").trim();if(!KD.test(n))throw new Error(`evm-token-sniper: ${t} must be a 0x EVM address`);return n}function df(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 Cs(e,t){return e==null||e===""?null:df(e,t)}function JD({chainId:e,tokenAddress:t,tokenIn:n,amountIn:r,recipient:o,quote:i,topPool:s,unsignedTx:a,args:c,opts:l}){let u=a?.tx;if(!u||typeof u!="object")throw new Error("local-signer envelope requires unsigned tx object");let d=Xc(u.to,"prepared destination"),p=String(u.data||"").toLowerCase();if(!/^0x[0-9a-f]+$/.test(p))throw new Error("local-signer envelope requires hex calldata");let f=df(u.value??r,"prepared native value");if(BigInt(f)!==BigInt(r))throw new Error("local-signer envelope requires native value equal amountIn");let m=Cs(u.gasLimit??c.gasLimit,"gasLimit"),h=Cs(u.maxFeePerGas??c.maxFeePerGas,"maxFeePerGas");if(!m||!h)throw new Error("local-signer envelope requires explicit gasLimit and maxFeePerGas caps");let y=Number(l.nowMs??Date.now()),g=Math.min(6e4,Math.max(1e3,Number(c.ttlMs??c.expiresInMs??3e4)||3e4)),E=Ml({chainId:e,venue:"uniswap-v3",quoteAmountOut:i?.amountOut,liquidityUsd:s?.liquidityUsd,requestedCapBps:c.slippageBps??50,quotedAtMs:y,ttlMs:g,secret:l.routeAttestationSecret}),v=Nt(E,{chainId:e,venue:"uniswap-v3",data:p,secret:l.routeAttestationSecret}),S={chainId:e,from:o,to:d,data:p,value:f,gasLimit:m,maxFeePerGas:h,slippageBps:v.selectedBps,expiresAtMs:y+g},I=Cs(u.maxPriorityFeePerGas??c.maxPriorityFeePerGas,"maxPriorityFeePerGas");return I&&(S.maxPriorityFeePerGas=I),c.nonce!==void 0&&(S.nonce=Number(c.nonce)),(c.txType!==void 0||I)&&(S.type=Number(c.txType??2)),c.l1FeeWei!==void 0&&(S.l1FeeWei=Cs(c.l1FeeWei,"l1FeeWei")??"0"),c.operatorFeeWei!==void 0&&(S.operatorFeeWei=Cs(c.operatorFeeWei,"operatorFeeWei")??"0"),{version:1,surface:"evm-swap",action:"swap",provider:"uniswap-v3",owner:o,destination:d,tradeId:c.tradeId||`evm-token-sniper-${e}-${t.toLowerCase()}`,slippageBps:v.selectedBps,expiresAtMs:y+g,fee:{oracleFeeBps:5},autoSlippage:v,artifact:{chainId:e,owner:o,transactions:[S]},meta:{source:"evm-token-sniper",tokenIn:n,tokenOut:t}}}function XD(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}Ra();let n=Jl(e);if(!n)throw new Error(`evm-token-sniper: unsupported EVM chainId ${e}`);return n}function QD({token:e,pools:t,structuralRisk:n,scannerRisk:r,sellability:o,quote:i,args:s,scanner:a}){let c=[];return e?.evidence!==J.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!==G.PASS&&c.push(`scanner risk verdict is ${r?.verdict||"UNKNOWN"}`),a.supports?.("sellSimulation")?o?.verdict!==G.PASS&&c.push(`sellability verdict is ${o?.verdict||"UNKNOWN"}`):c.push("sell simulation is unavailable on this chain"),a.supports?.("quote")?i?.evidence!==J.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 XA(e={},t={}){let n=Number(e.chainId??YD);if(!Number.isInteger(n)||n<=0)throw new Error("evm-token-sniper: chainId must be a positive integer");let r=Xc(e.tokenAddress||e.address||e.token,"tokenAddress"),o=e.tokenIn?Xc(e.tokenIn,"tokenIn"):null,i=e.recipient?Xc(e.recipient,"recipient"):null,s=e.amountIn==null?null:df(e.amountIn,"amountIn"),a=XD(n,t.scanner),c=t.scanContractRisk||YA,[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),f=null;a.supports?.("sellSimulation")&&s?f=await a.sellSimulation({token:r,amountIn:s,base:o||void 0}):a.supports?.("sellSimulation")&&(f=await a.sellSimulation({token:r,amountIn:"10000000000000000"}));let m=null;a.supports?.("quote")&&o&&s&&(m=await a.quote({tokenIn:o,tokenOut:r,amountIn:s}));let h={...e,tokenIn:o,amountIn:s,recipient:i},y=QD({token:l,pools:u,structuralRisk:d,scannerRisk:p,sellability:f,quote:m,args:h,scanner:a}),g=null,E=null,v=null;if(e.prepare===!0&&y.length===0){g=await a.prepareUnsignedTx({tokenIn:o,tokenOut:r,amountIn:s,recipient:i,slippageBps:e.slippageBps??50,fee:m?.fee});try{E=JD({chainId:n,tokenAddress:r,tokenIn:o,amountIn:s,recipient:i,quote:m,topPool:u?.pools?.[0]||null,unsignedTx:g,args:e,opts:t})}catch(S){v=String(S?.message||S).slice(0,200)}}return{provider:"evm-token-sniper",execution:"armed-local",armed:!!E,signing:"local-signer",broadcasting:"local-signer",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:f,quote:m,blockedReasons:y,prepared:!!g,unsignedTx:g,localSignerEnvelope:E,localSignerBlockedReason:v,signed:E?"pending-local-signer":!1,broadcast:E?"pending-local-signer":!1}}var KD,YD,QA=T(()=>{Mi();mr();en();JA();KD=/^0x[0-9a-fA-F]{40}$/,YD=4663});var rS={};Q(rS,{evaluateContracts:()=>nS,fetchAccountTweets:()=>tS,snipeExecuteEnabled:()=>ZA,tickTwitterCaWatch:()=>oU,twitterSnipeEmitsCard:()=>iU});function ZA(e=process.env){return String((e||process.env).ORACLE_SNIPE_EXECUTE||"").trim()==="1"}function eS(e){return String(e||"").trim().replace(/^@/,"")}async function tS({handle:e,limit:t=5,xurlFn:n=GA}={},r={}){let o=eS(e);if(!o)throw new Error("twitter-ca-watch: handle required");let i=await n("xurl",{command:"search",query:`from:${o}`,limit:Math.min(20,Math.max(1,Number(t)||5))},r);return i?.ok?{ok:!0,tweets:FA(i.stdout),raw:i}:{ok:!1,error:i?.error||"xurl search failed",tweets:[]}}async function nU(e,{chainId:t,amountIn:n,tokenIn:r,recipient:o,prepare:i},s){let a=await XA({chainId:t,tokenAddress:e,amountIn:n,tokenIn:r,recipient:o,prepare:i===!0},s),c=a.topPool||a.pools?.pools?.[0]||null;return{chainFamily:"evm",chainId:t,address:e,topPool:c,quoteAsset:a.pools?.quoteAsset||null,sellability:a.sellability||null,blockedReasons:a.blockedReasons||[],prepared:!!a.prepared,unsignedTx:a.unsignedTx||null,localSignerEnvelope:a.localSignerEnvelope||null,execution:!1,broadcast:!1}}async function rU(e,t){let n=await Am(e,{chainSlug:"solana",stables:[eU,tU]},t);return{chainFamily:"solana",chainId:"solana",address:e,topPool:n.topPool,pools:n.pools,prepared:!1,execution:!1,broadcast:!1,note:"Solana CA ranked on USD book. Prepare stays Jupiter/local-signer; this tick does not broadcast."}}async function nS(e,t={},n={}){let r=Number(t.chainId??ZD),o=[];for(let i of e.evm||[])o.push(await nU(i,{...t,chainId:r},n));for(let i of e.solana||[])o.push(await rU(i,n));return o}async function oU(e={},t={}){let n=eS(e.handle),r=e.seen instanceof Set?e.seen:new Set(e.seen||[]),o=await tS({handle:n,limit:e.limit,xurlFn:t.xurlFn},t);if(!o.ok)return{ok:!1,handle:n,error:o.error,hits:[],seen:[...r]};let i=[];for(let a of o.tweets){let c=a.id||`${n}:${a.text.slice(0,80)}`;if(r.has(c))continue;let l=MA(a.text,{extras:a.urls||[]});if(!l.all.length){r.add(c);continue}let d=await(t.evaluateFn||nS)(l,e,t);r.add(c),i.push({tweetId:a.id||null,handle:n,text:a.text,contracts:l,evaluations:d})}let s=e.automated!==!1;return{ok:!0,handle:n,source:"twitter-ca-watch",automated:s,card:!1,notify:!1,telegram:!1,execution:!1,broadcast:!1,snipeExecuteEnabled:ZA(t.env||process.env),hits:i,seen:[...r]}}function iU(e={}){return!e||typeof e!="object"||e.source==="twitter-ca-watch"||e.automated===!0||e.card===!1||e.notify===!1,!1}var ZD,eU,tU,oS=T(()=>{jA();KA();QA();Ni();Hs();ZD=4663,eU="EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",tU="Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB"});import{wordlists as sU}from"ethers";function uU(e){let t=String(e).trim().toLowerCase().split(/\s+/).filter(Boolean);return lU.has(t.length)&&t.every(n=>sU.en.getWordIndex(n)>=0)}function mU(e){let t=iS(e);return fU.has(t)||pU.test(t)}function iS(e){return String(e).replace(/[^a-z0-9]/gi,"").toLowerCase()}function hU(e){let t=iS(e);return[...aU].some(n=>t.includes(n))}function yU(e,t,n){if(typeof t=="string"){if(cU.some(r=>r.test(t))||uU(t))throw new Rs(n);if(dU.test(t)&&!mU(e))throw new Rs(n)}}function Qc(e,t="$",n=""){if(e==null||typeof e=="boolean")return e;if(typeof e=="string")return yU(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)=>Qc(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(hU(o))throw new Rs(i);e[o]!==void 0&&(r[o]=Qc(e[o],i,o))}return r}function te(e){return Qc(e)}function pf(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(pf).join(",")}]`:`{${Object.keys(e).map(t=>`${JSON.stringify(t)}:${pf(e[t])}`).join(",")}}`}function Ps(e){return pf(Qc(e))}var aU,cU,lU,dU,pU,fU,Rs,yi=T(()=>{aU=new Set(["privatekey","privkey","secretkey","seedphrase","seed","mnemonic","passphrase","password","keystore","keymaterial","wif","xprv","xpriv","bearer","authorization","signature","apikey","credential"]),cU=[/\b[5KL][1-9A-HJ-NP-Za-km-z]{50,51}\b/,/\bxprv[0-9A-Za-z]{50,}\b/],lU=new Set([12,15,18,21,24]);dU=/^\s*(?:0x)?[0-9a-fA-F]{64}\s*$/,pU=/(hash|digest|root|salt|nonce|proof|commitment|sig|id)(?:e?s)?$/i,fU=new Set(["calldata","data","publickey","pubkey","message","payload","input","extradata"]);Rs=class extends Error{constructor(t){super(`action receipt refused: secret-bearing field at ${t}`),this.name="ActionReceiptSecretError",this.code="ACTION_RECEIPT_SECRET"}}});import{mkdir as gU,chmod as Zc,readFile as bU,rename as wU,writeFile as EU}from"node:fs/promises";import{homedir as AU}from"node:os";import{dirname as sS,join as ff}from"node:path";import SU from"sql.js";function nl(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(nl).join(",")}]`:`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${nl(e[t])}`).join(",")}}`}function aS(e){if(!vU.has(e))throw new TypeError(`unknown artifact type: ${e}`);return e}function el(e){let t=[];for(;e.step();)t.push(e.getAsObject());return e.free(),t}function tl(e){return e?{id:e.id,type:e.type,createdAt:e.created_at,data:JSON.parse(e.data_json)}:null}async function cS(e={}){let t=e.path||kU;await gU(sS(t),{recursive:!0,mode:448}),await Zc(sS(t),448);let n;try{n=await bU(t)}catch(l){if(l.code!=="ENOENT")throw l}let r=await SU(e.sqlJs||{}),o=n?new r.Database(n):new r.Database;o.run(`
12
12
  PRAGMA foreign_keys=ON;
13
13
  CREATE TABLE IF NOT EXISTS artifacts (
14
14
  id TEXT PRIMARY KEY, type TEXT NOT NULL, created_at TEXT NOT NULL, data_json TEXT NOT NULL
@@ -20,9 +20,9 @@ ${JSON.stringify(n??[])}`}async function Sw(e,t,n){return C(e,{method:"POST",bod
20
20
  CREATE TABLE IF NOT EXISTS action_receipts (
21
21
  artifact_id TEXT PRIMARY KEY REFERENCES artifacts(id), receipt_json TEXT NOT NULL
22
22
  );
23
- `);let i=!1,s=Promise.resolve();function a(){let u=async()=>{let l=`${t}.tmp-${process.pid}`;await UO(l,Buffer.from(o.export()),{mode:384}),await gs(l,384),await BO(l,t),await gs(t,384)};return s=s.then(u,u),s}n?await gs(t,384):await a();function c(){if(i)throw new Error("artifact store is closed")}return{path:t,async putArtifact(u){if(c(),!u||typeof u!="object")throw new TypeError("artifact object required");let l=Pg(String(u.type)),d=String(u.id||"").trim();if(!d)throw new TypeError("artifact id required");let f=K(u.data??{}),p=String(u.createdAt||new Date().toISOString());return o.run("INSERT INTO artifacts(id,type,created_at,data_json) VALUES(?,?,?,?)",[d,l,p,Es(f)]),await a(),{id:d,type:l,createdAt:p,data:f}},getArtifact(u){c();let l=o.prepare("SELECT * FROM artifacts WHERE id=?");l.bind([String(u)]);let d=l.step()?ws(l.getAsObject()):null;return l.free(),d},listArtifacts(u){c();let l=u===void 0?o.prepare("SELECT * FROM artifacts ORDER BY created_at,id"):(Pg(String(u)),o.prepare("SELECT * FROM artifacts WHERE type=? ORDER BY created_at,id"));return u!==void 0&&l.bind([String(u)]),bs(l).map(ws)},async link(u,l){c();let d=o.prepare("SELECT id,type FROM artifacts WHERE id IN (?,?)");d.bind([String(u),String(l)]);let f=bs(d),p=f.find(y=>y.id===String(u)),m=f.find(y=>y.id===String(l));if(!p||!m)throw new TypeError("edge endpoints must exist");if(!jO.has(`${p.type}:${m.type}`))throw new TypeError(`invalid artifact edge: ${p.type} -> ${m.type}`);return o.run("INSERT INTO artifact_edges(parent_id,child_id) VALUES(?,?)",[p.id,m.id]),await a(),{parentId:p.id,childId:m.id}},children(u){c();let l=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 l.bind([String(u)]),bs(l).map(ws)},parents(u){c();let l=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 l.bind([String(u)]),bs(l).map(ws)},async putReceipt(u,l){c();let d=this.getArtifact(u);if(!d||d.type!=="receipt")throw new TypeError("receipt boundary requires a receipt artifact");let f=K(l);return o.run("INSERT INTO action_receipts(artifact_id,receipt_json) VALUES(?,?)",[String(u),Es(f)]),await a(),f},getReceipt(u){c();let l=o.prepare("SELECT receipt_json FROM action_receipts WHERE artifact_id=?");l.bind([String(u)]);let d=l.step()?JSON.parse(l.getAsObject().receipt_json):null;return l.free(),d},async close(){i||(await a(),o.close(),i=!0)}}}var Nu,FO,jO,HO,zO,$g=_(()=>{br();Nu=Object.freeze(["project","entity","source","thesis","strategy","simulation","prepared_action","receipt","position"]),FO=new Set(Nu),jO=new Set(Nu.slice(0,-1).map((e,t)=>`${e}:${Nu[t+1]}`)),HO=Cu(process.env.ORACLE_CONFIG_DIR||Cu(MO(),".config","oracle"),"workspace"),zO=Cu(HO,"artifacts.sqlite")});import{createHash as qg}from"node:crypto";function WO(e){return VO.has(String(e).replace(/[^a-z0-9]/gi,"").toLowerCase())}function Ru(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(Ru).join(",")}]`:`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${Ru(e[t])}`).join(",")}}`}function GO(e){return qg("sha256").update(String(e)).digest("hex")}function Bg(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(WO(n))throw new TypeError("research source URL must not contain sensitive query parameters");return t.toString()}function Ug(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 KO(e={}){let t=Bg(e.url??e.sourceUrl),n=Ug(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(K({url:t,fetchedAt:n,contentHash:r}))}function Mg(e={}){let t=Bg(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=Ug(e.fetchedAt),s=GO(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(KO),c=K({sourceUrl:t,fetchedAt:i,contentHash:s,snapshot:n,claim:r,confidence:o,contradictions:(e.contradictions||[]).map(String),citations:a});return Object.freeze({id:`research:${qg("sha256").update(Ru(c)).digest("hex")}`,...c})}var VO,Dg=_(()=>{br();VO=new Set(["accesstoken","refreshtoken","idtoken","token","apikey","clientsecret","password","auth","jwt","session","secret","key","code","signature","xamzsignature","privatekey","authorization","bearer","credential"])});function Fg(e){if(e===null||e===""||e===void 0)return null;let t=Number(e);return Number.isFinite(t)&&t>=0?t:null}function Oo(e){return Math.round((e+Number.EPSILON)*1e8)/1e8}function Lu(e,t){return t>0?Oo(e/t*100):null}function $u(e){return e.address||e.owner||e.walletAddress||e.wallet?.address||null}function JO(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 Nn(e,t,n={}){if(!t||typeof t!="object")return;let r=String(t.symbol??t.coin??t.name??t.collection??t.tokenId??"unknown"),o=Fg(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||XO.has(r.toUpperCase())})}function QO(e){let t=[],n=$u(e);for(let r of e.assets||e.holdings||[])Nn(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)&&Nn(t,{...r.native,symbol:r.native.symbol??r.symbol??o},i);for(let a of r.assets||r.fungibleTokens?.assets||[])Nn(t,a,i);for(let a of r.collectibles?.assets||r.nfts||[])Nn(t,{...a,kind:"nft"},i);for(let a of r.spot?.balances||[])Nn(t,a,{...i,venue:"Hyperliquid spot"});let s=Fg(r.perps?.accountValueUsd);s!=null&&Nn(t,{symbol:"perps account",usdValue:s},{...i,venue:"Hyperliquid perps"})}for(let r of e.inventory?.items||e.nfts?.items||[])Nn(t,{...r,kind:"nft"},{address:n,chain:r.chain??e.chain,venue:r.marketplace??e.venue});return t}function ZO(e,t){let n=$u(e),r=e.chain??e.chainId??e.family??"*";return n?`${String(n).toLowerCase()}|${String(r).toLowerCase()}`:`snapshot:${t}`}function Pu(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:Oo(i),percentOfKnown:Lu(i,n)})).sort((o,i)=>i.knownUsd-o.knownUsd||o.name.localeCompare(i.name))}function Ss(e={},t={}){let n=Array.isArray(e)?e:Array.isArray(e.snapshots)?e.snapshots:e.snapshot?[e.snapshot]:[],r=JO(t.labels??t.addressBook??e.labels??e.addressBook),o={...YO,...e.thresholds||{},...t.thresholds||{}},i=[],s=new Set,a=0;n.forEach((A,P)=>{if(!A||typeof A!="object")return;let I=ZO(A,P);s.has(I)?a+=1:(s.add(I),i.push(A))});let c=i.flatMap(QO),u=c.filter(A=>A.usdValue!=null),l=c.filter(A=>A.usdValue==null),d=i.reduce((A,P)=>A+Number(P.valuation?.unpricedNonzeroItems||P.unpricedNonzeroItems||0),0),f=Oo(u.reduce((A,P)=>A+P.usdValue,0)),p=l.length+d,m=Pu(u,"chain",f),y=Pu(u,"venue",f),h=Pu(u,"symbol",f);for(let A of m)A.chain=A.name;for(let A of y)A.venue=A.name;for(let A of h)A.asset=A.name,A.symbol=A.name;let w=Oo(u.filter(A=>A.stablecoin).reduce((A,P)=>A+P.usdValue,0)),v=c.filter(A=>A.kind==="nft"),T=i.reduce((A,P)=>A+Number(P.valuation?.nftUnvaluedItems||0),0),S=v.filter(A=>A.usdValue==null).length+T,k=v.filter(A=>A.usdValue!=null).length,x=h[0]||null,E=x?x.percentOfKnown>=o.assetHighPct?"high":x.percentOfKnown>=o.assetMediumPct?"medium":"low":"unknown",b=[];p&&b.push(`${p} nonzero holding(s) have unknown USD value; they are excluded from totals and percentages.`),S&&b.push("NFT valuation coverage is partial; estimates are not executable bids and unvalued NFTs are not treated as zero."),a&&b.push(`${a} duplicate address/chain snapshot(s) were ignored.`),x&&E!=="low"&&b.push(`Asset concentration is ${E}: ${x.name} is ${x.percentOfKnown}% of known value.`),m[0]?.percentOfKnown>=o.chainHighPct&&b.push(`Chain concentration is high: ${m[0].name} is ${m[0].percentOfKnown}% of known value.`),y[0]?.percentOfKnown>=o.venueHighPct&&b.push(`Venue concentration is high: ${y[0].name} is ${y[0].percentOfKnown}% of known value.`);let g=i.map($u).filter(Boolean).map(A=>{let P=r.get(String(A).toLowerCase());return{address:A,label:P?.label??null,who:P?.who??null,role:P?.role??null}});return{totalKnownUsd:f,coverage:{complete:i.length>0&&p===0&&i.every(A=>A.valuation?.complete!==!1&&A.coverage?.complete!==!1),label:p===0&&i.length&&i.every(A=>A.valuation?.complete!==!1&&A.coverage?.complete!==!1)?"complete for the supplied snapshots":"known priced value only; portfolio coverage is partial or unverified",unknownUsd:p?null:0,pricedItemCount:u.length,unknownItemCount:p,snapshotCount:i.length,duplicatesIgnored:a},chainExposures:m,venueExposures:y,topAssets:h.slice(0,Math.max(1,Number(t.topAssets??e.topAssets??10))),concentrationRisk:{level:E,topAsset:x?.name??null,topAssetPercent:x?.percentOfKnown??null,thresholds:{mediumPct:o.assetMediumPct,highPct:o.assetHighPct}},stablecoinExposure:{knownUsd:w,percentOfKnown:Lu(w,f),high:f>0&&Lu(w,f)>=o.stablecoinHighPct},nftCoverage:{status:v.length||T?S?"partial":"valued":"not-observed",valuedItems:k,unvaluedItems:S,knownUsd:Oo(v.filter(A=>A.usdValue!=null).reduce((A,P)=>A+P.usdValue,0))},addresses:g,warnings:[...new Set(b)]}}var YO,XO,qu=_(()=>{YO=Object.freeze({assetHighPct:50,assetMediumPct:25,chainHighPct:75,venueHighPct:60,stablecoinHighPct:70}),XO=new Set(["USDC","USDT","USDT0","DAI","FRAX","LUSD","TUSD","USDP","GUSD","PYUSD","USDE"])});function jg(e){return Oe(e.asOf??e.updatedAt??e.timestamp,0)}function Vg(e){return e.filledAt??e.executedAt??e.time??e.timestamp??e.asOf??e.updatedAt??e.createdAt}function eT(e){return Number.isFinite(Number(Vg(e)))}function Hg(e){return Oe(Vg(e),0)}function tT(e){let t=new Set,n=[];return(e||[]).forEach((o,i)=>{if(!o||typeof o!="object"||!yt(o))return;let s=Wg(o);t.has(s)||(t.add(s),n.push({row:o,seq:i}))}),n.every(({row:o})=>eT(o))?n.sort((o,i)=>Hg(o.row)-Hg(i.row)||o.seq-i.seq).map(({row:o})=>o):n.map(({row:o})=>o)}function Wg(e){let t=e.fillId??e.tradeId??e.orderId??e.txHash??e.transactionHash??e.timestamp??e.asOf;return[vs(e),we(t),we(e.side),Oe(e.quantity??e.amount??e.size),Oe(e.price??e.priceUsd)].join("|")}function As(e,t){let n=new Map,r=0;for(let o of e||[]){if(!o||typeof o!="object"||!yt(o))continue;let i=t==="fill"?Wg(o):vs(o);n.has(i)?(r+=1,t!=="fill"&&jg(o)>jg(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 nT(e){let t=new Map;for(let n of e){let r=[vs(n),`${we(n.chain??n.chainId)}|${we(yt(n))}`,`*|${we(yt(n))}`];for(let o of r)t.has(o)||t.set(o,n)}return t}function rT(e,t){return t.get(vs(e))??t.get(`${we(e.chain??e.chainId)}|${we(yt(e))}`)??t.get(`*|${we(yt(e))}`)??null}function oT(e){let t=new Map,n=0;for(let r of e){let o=[we(r.chain??r.chainId),we(zg(r)),we(yt(r))].join("|"),i=t.get(o)??{quantity:0,cost:0},s=Math.abs(Oe(r.quantity??r.amount??r.size)),a=Oe(r.price??r.priceUsd),c=Oe(r.feeUsd);if(we(r.side)==="sell"){let u=Math.min(s,i.quantity),l=i.quantity?i.cost/i.quantity:Oe(r.costBasisUsd)/(s||1);n+=u*(a-l)-c,i.quantity-=u,i.cost-=u*l}else i.quantity+=s,i.cost+=s*a+c;t.set(o,i)}return{realizedPnlUsd:ht(n),lots:t}}function Gg(e={},t={}){let n=Oe(t.asOf??e.asOf,0),r=Math.max(0,Oe(t.priceTtlMs??e.priceTtlMs,6e4)),o=As(e.balances||[],"balance"),i=As(e.positions||[],"position"),s=As(e.fills||[],"fill"),a=As(e.prices||[],"price"),c=nT(a.rows),u=[],l=0,d=0;for(let g of[...o.rows,...i.rows]){let A=rT(g,c),P=Oe(g.quantity??g.amount??g.size),I=A?Oe(A.priceUsd??A.price,NaN):Oe(g.priceUsd,NaN);if(!Number.isFinite(I)){d+=1;continue}let L=P*I,q=Oe(A?.asOf??g.priceAsOf,0),j=n-q>r;j&&(l+=Math.abs(L)),u.push({...g,quantity:P,priceUsd:I,valueUsd:L,stale:j,kind:i.rows.includes(g)?"position":"balance"})}let f=u.filter(g=>g.kind==="balance").reduce((g,A)=>g+A.valueUsd,0),p=u.filter(g=>g.kind==="position"),m=p.reduce((g,A)=>g+A.valueUsd,0),y=p.reduce((g,A)=>g+Math.abs(A.valueUsd),0),h=f+m,w=Oe(e.equityUsd,h),v=oT(tT(e.fills||[])).realizedPnlUsd,T=p.reduce((g,A)=>{let P=Oe(A.entryPriceUsd??A.averageEntryPrice??A.costBasisPrice,A.priceUsd);return g+A.quantity*(A.priceUsd-P)},0),S=new Map;for(let g of u)S.set(we(yt(g)),(S.get(we(yt(g)))||0)+Math.abs(g.valueUsd));let k=[...S.values()].reduce((g,A)=>g+A,0),x=[...S].map(([g,A])=>({asset:g,exposureUsd:ht(A),percent:k?ht(A/k*100):null})).sort((g,A)=>A.exposureUsd-g.exposureUsd||g.asset.localeCompare(A.asset)),E=u.reduce((g,A)=>g+Math.abs(A.valueUsd),0),b=Ss({snapshots:[{assets:u.map(g=>({symbol:yt(g),usdValue:Math.abs(g.valueUsd),chain:g.chain,venue:g.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:v,unrealizedUsd:ht(T),totalUsd:ht(v+T)},exposure:{grossUsd:ht(y),netUsd:ht(h),leverage:w>0?ht(y/w):null,equityUsd:ht(w)},concentration:x,priceCoverage:{pricedItems:u.length,unpricedItems:d,staleItems:u.filter(g=>g.stale).length,staleValueUsd:ht(l),stalePercent:E?ht(l/E*100):null,ttlMs:r},risk:b})}var Oe,ht,we,yt,zg,vs,Kg=_(()=>{qu();Oe=(e,t=0)=>Number.isFinite(Number(e))?Number(e):t,ht=e=>Math.round((e+Number.EPSILON)*1e8)/1e8,we=(e,t="unknown")=>String(e??t).trim().toLowerCase(),yt=e=>e.asset??e.symbol??e.coin,zg=e=>e.address??e.owner??e.account,vs=e=>[we(e.chain??e.chainId),we(zg(e)),we(yt(e)),we(e.source)].join("|")});function pe(e,t){throw new Uu(e,t)}function Ft(e,t){return e<t?-1:e>t?1:0}function Ee(e){if(e&&typeof e=="object"&&!Object.isFrozen(e)){for(let t of Object.values(e))Ee(t);Object.freeze(e)}return e}function jt(e,t){return(!e||typeof e!="object"||Array.isArray(e)||Object.getPrototypeOf(e)!==Object.prototype)&&pe(`${t} must be a plain object`),e}function Le(e,t,{optional:n=!1,lower:r=!1}={}){if(e==null&&n)return null;typeof e!="string"&&pe(`${t} must be a string`);let o=e.trim();return o||pe(`${t} is required`),lT.test(o)&&pe(`${t} contains control characters`),o.length>512&&pe(`${t} is too long`),r?o.toLowerCase():o}function It(e,t,{optional:n=!1,positive:r=!1}={}){if(e==null&&n)return null;typeof e=="number"&&pe(`${t} must be an exact decimal string or BigInt; Number coercion is refused`,"COST_BASIS_UNSAFE_NUMBER");let o;typeof e=="bigint"?o=e.toString():typeof e=="string"?o=e:pe(`${t} must be an exact decimal string or BigInt`),/^\d+$/.test(o)||pe(`${t} must be a non-negative base-10 integer string`);let i=BigInt(o);return r&&i===0n&&pe(`${t} must be positive`),i.toString()}function wr(e){return e==null?null:e.toString()}function To(e,t){let n=jt(e,t);return Ee({chain:Le(n.chain??n.chainId,`${t}.chain`,{lower:!0}),account:Le(n.account??n.address??n.owner,`${t}.account`)})}function dn(e,t){return`${e.length}:${e}|${t.chain.length}:${t.chain}|${t.account.length}:${t.account}`}function Qg(e,t="evidence"){if(e==null)return Ee({status:"unknown",references:[]});let n=jt(e,t),r=Le(n.status??"unknown",`${t}.status`,{lower:!0});uT.has(r)||pe(`${t}.status must be complete, incomplete, or unknown`),n.references!=null&&!Array.isArray(n.references)&&pe(`${t}.references must be an array`);let o=(n.references||[]).map((s,a)=>{let c=jt(s,`${t}.references[${a}]`);return{kind:Le(c.kind??c.type,`${t}.references[${a}].kind`,{lower:!0}),id:Le(c.id??c.receiptId??c.txHash,`${t}.references[${a}].id`)}}).sort((s,a)=>Ft(s.kind,a.kind)||Ft(s.id,a.id)),i=[];for(let s of o)i.some(a=>a.kind===s.kind&&a.id===s.id)||i.push(s);return Ee({status:r,references:i})}function Yg(e,t){if(e==null)return[];(!Array.isArray(e)||e.length===0)&&pe(`${t} must be a non-empty array`);let n=new Set;return e.map((r,o)=>{let i=jt(r,`${t}[${o}]`),s=Le(i.lotId,`${t}[${o}].lotId`);return n.has(s)&&pe(`${t} repeats lotId ${JSON.stringify(s)}`),n.add(s),Ee({lotId:s,quantity:It(i.quantity,`${t}[${o}].quantity`,{positive:!0})})})}function dT(e){K(e);let t=jt(e,"event"),n=Le(t.type,"event.type",{lower:!0});cT.has(n)||pe("event.type must be acquisition, disposal, or transfer");let r=Le(t.id??t.eventId,"event.id"),o=It(t.occurredAt??t.timestamp,"event.occurredAt"),i=Le(t.asset??t.symbol??t.coin,"event.asset"),s=It(t.quantity??t.amount??t.size,"event.quantity",{positive:!0}),a=It(t.feeMinor??t.feeUsdMinor??"0","event.feeMinor"),c=Qg(t.evidence),u=t.source==null?null:Le(t.source,"event.source"),l={id:r,type:n,occurredAt:o,asset:i,quantity:s,feeMinor:a,source:u,evidence:c};if(n==="acquisition"){let d={...l,location:To(t.location??{chain:t.chain??t.chainId,account:t.account??t.address??t.owner},"event.location"),grossAmountMinor:It(t.grossAmountMinor??t.costMinor??t.basisBeforeFeesMinor,"event.grossAmountMinor",{optional:!0}),lotId:Le(t.lotId??r,"event.lotId"),specificLots:[]};return Ee(d)}return Ee(n==="disposal"?{...l,location:To(t.location??{chain:t.chain??t.chainId,account:t.account??t.address??t.owner},"event.location"),grossAmountMinor:It(t.grossAmountMinor??t.proceedsMinor??t.proceedsBeforeFeesMinor,"event.grossAmountMinor",{optional:!0}),specificLots:Yg(t.specificLots??t.lotSelections,"event.specificLots")}:{...l,from:To(t.from,"event.from"),to:To(t.to,"event.to"),grossAmountMinor:null,specificLots:Yg(t.specificLots??t.lotSelections,"event.specificLots")})}function pT(e,t){let n=BigInt(e.occurredAt)-BigInt(t.occurredAt);return n<0n?-1:n>0n?1:Ft(e.id,t.id)}function fT(e=[]){Array.isArray(e)||pe("events must be an array");let t=new Map,n=0;for(let r of e){let o=dT(r),i=_o(o),s=t.get(o.id);if(s){s.canonical!==i&&pe(`conflicting duplicate event id ${JSON.stringify(o.id)}`,"COST_BASIS_DUPLICATE_CONFLICT"),n+=1;continue}t.set(o.id,{event:o,canonical:i})}return Ee({events:[...t.values()].map(({event:r})=>r).sort(pT),duplicatesIgnored:n})}function mT(e){let t=Le(e??"fifo","method",{lower:!0});return sT.includes(t)||pe("method must be fifo, lifo, hifo, or specific"),t}function hT(e){e!=null&&jt(e,"treatment");let t=e||{},n={};for(let r of Object.keys(Xg))n[r]=Le(t[r]??"unresolved",`treatment.${r}`,{lower:!0}),Xg[r].has(n[r])||pe(`treatment.${r} has an unsupported value`);return Ee(n)}function yT(e,t){K(e);let n=jt(e,`marketValues[${t}]`);return Ee({id:Le(n.id??n.valuationId,`marketValues[${t}].id`),asset:Le(n.asset??n.symbol??n.coin,`marketValues[${t}].asset`),location:To(n.location??{chain:n.chain??n.chainId,account:n.account??n.address??n.owner},`marketValues[${t}].location`),quantity:It(n.quantity,`marketValues[${t}].quantity`),valueMinor:It(n.valueMinor??n.marketValueMinor,`marketValues[${t}].valueMinor`),asOf:It(n.asOf,`marketValues[${t}].asOf`),evidence:Qg(n.evidence,`marketValues[${t}].evidence`)})}function Zg(e,t){return t==null||BigInt(e)<=BigInt(t)}function gT(e=[],t=null){Array.isArray(e)||pe("marketValues must be an array");let n=new Map,r=0;e.forEach((s,a)=>{let c=yT(s,a),u=_o(c),l=n.get(c.id);l?(l.canonical!==u&&pe(`conflicting duplicate market value id ${JSON.stringify(c.id)}`,"COST_BASIS_DUPLICATE_CONFLICT"),r+=1):n.set(c.id,{row:c,canonical:u})});let o=[...n.values()].map(({row:s})=>s).filter(s=>Zg(s.asOf,t)),i=new Map;for(let s of o){let a=dn(s.asset,s.location),c=i.get(a);(!c||BigInt(s.asOf)>BigInt(c.asOf)||s.asOf===c.asOf&&Ft(s.id,c.id)<0)&&i.set(a,s)}return{values:o.sort((s,a)=>Ft(s.id,a.id)),byHolding:i,duplicatesIgnored:r}}function Pe(e,t,n,r){e.push(Ee({code:t,eventId:n??null,detail:r}))}function bT(e,t,n){if(e.grossAmountMinor==null)return Pe(n,"missing-acquisition-basis",e.id,"gross acquisition amount is unknown; lot basis remains unknown"),null;let r=BigInt(e.grossAmountMinor),o=BigInt(e.feeMinor);return o===0n?r:t.acquisitionFees==="include-in-basis"?r+o:t.acquisitionFees==="exclude"?r:(Pe(n,"unresolved-acquisition-fee-treatment",e.id,"fee treatment was not supplied; lot basis remains unknown"),null)}function wT(e,t,n){if(e.grossAmountMinor==null)return Pe(n,"missing-disposal-proceeds",e.id,"gross disposal proceeds are unknown"),null;let r=BigInt(e.grossAmountMinor),o=BigInt(e.feeMinor);return o===0n?r:t.disposalFees==="reduce-proceeds"?r-o:t.disposalFees==="exclude"?r:(Pe(n,"unresolved-disposal-fee-treatment",e.id,"fee treatment was not supplied; recognized proceeds remain unknown"),null)}function ET(e,t){let n=(r,o)=>{let i=BigInt(r.acquiredAt)-BigInt(o.acquiredAt);return i<0n?-1:i>0n?1:Ft(r.lotId,o.lotId)};return e==="fifo"?[...t].sort(n):e==="lifo"?[...t].sort((r,o)=>-n(r,o)):e==="hifo"?[...t].sort((r,o)=>{let i=r.basisRemaining*o.quantityRemaining,s=o.basisRemaining*r.quantityRemaining;return i>s?-1:i<s?1:n(r,o)}):[...t]}function Jg(e,t){let n=e.quantityRemaining,r=e.basisRemaining,o=null;return r!=null&&(o=t===n?r:r*t/n,e.basisRemaining-=o),e.quantityRemaining-=t,{lot:e,quantity:t,basis:o}}function ST(e,t,n){let r=dn(t,n);return e.filter(o=>o.key===r&&o.quantityRemaining>0n)}function AT({event:e,lots:t,method:n,issues:r,tainted:o}){let i=e.type==="transfer"?e.from:e.location,s=dn(e.asset,i),a=BigInt(e.quantity);if(o.has(s))return Pe(r,"inventory-state-incomplete",e.id,"an earlier unmatched record makes this holding indeterminate"),{matches:[],missing:a,key:s,indeterminate:!0};let c=ST(t,e.asset,i);if(n==="hifo"&&c.some(d=>d.basisRemaining==null))return Pe(r,"hifo-basis-unknown",e.id,"HIFO cannot rank a lot whose basis is unknown"),o.add(s),{matches:[],missing:a,key:s,indeterminate:!0};let u=[],l=a;if(n==="specific"){if(e.specificLots.length===0)return Pe(r,"specific-lots-required",e.id,"specific-lot method requires explicit lot selections"),o.add(s),{matches:u,missing:l,key:s,indeterminate:!0};if(e.specificLots.reduce((f,p)=>f+BigInt(p.quantity),0n)!==a)return Pe(r,"specific-lot-quantity-mismatch",e.id,"specific-lot quantities do not equal the event quantity"),o.add(s),{matches:u,missing:l,key:s,indeterminate:!0};for(let f of e.specificLots){let p=c.find(y=>y.lotId===f.lotId),m=BigInt(f.quantity);if(!p||p.quantityRemaining<m){Pe(r,"specific-lot-unavailable",e.id,`requested lot ${JSON.stringify(f.lotId)} is absent or too small`);continue}u.push(Jg(p,m)),l-=m}}else{e.specificLots.length&&pe(`event ${JSON.stringify(e.id)} supplies specificLots but method is ${n}`);for(let d of ET(n,c)){if(l===0n)break;let f=l<d.quantityRemaining?l:d.quantityRemaining;u.push(Jg(d,f)),l-=f}}return l>0n&&(Pe(r,"insufficient-inventory",e.id,"recorded lots do not cover the event quantity; no replacement basis was invented"),o.add(s)),{matches:u,missing:l,key:s,indeterminate:l>0n}}function Bu(e,t,n){if(e==null)return t.map(()=>null);let r=e,o=n;return t.map(i=>{if(o===0n)return 0n;let s=i===o?r:r*i/o;return r-=s,o-=i,s})}function vT(e,t){let n=[...e.map(r=>r.evidence.status),...t.map(r=>r.evidence.status)];return n.length===0||n.every(r=>r==="complete")?"complete":n.some(r=>r==="incomplete")?"incomplete":"unknown"}function Er(e,t){let n=e.map(o=>o[t]),r=n.filter(o=>o!=null).reduce((o,i)=>o+BigInt(i),0n);return{value:n.every(o=>o!=null)?r.toString():null,known:r.toString()}}function xT(e,t){return{lotId:e.lotId,originLotId:e.lotId,acquisitionEventId:e.id,asset:e.asset,location:e.location,key:dn(e.asset,e.location),acquiredAt:e.occurredAt,quantityRemaining:BigInt(e.quantity),basisRemaining:t,evidenceStatus:e.evidence.status}}function e0(e={},t={}){K(e),K(t),jt(e,"input"),jt(t,"options");let n=It(t.asOf??e.asOf,"asOf",{optional:!0}),r=fT(e.events||[]),o=n==null?r.events:r.events.filter(g=>Zg(g.occurredAt,n)),i=mT(t.method??e.method),s=hT(t.treatment??e.treatment),a=gT(e.marketValues||[],n),c=[],u=[],l=new Set,d=[],f=[],p=new Set;for(let g of o){if(g.type==="acquisition"){if(l.has(g.lotId)){Pe(c,"duplicate-lot-id",g.id,`lotId ${JSON.stringify(g.lotId)} is already in use`),p.add(dn(g.asset,g.location));continue}l.add(g.lotId),u.push(xT(g,bT(g,s,c)));continue}let A=AT({event:g,lots:u,method:i,issues:c,tainted:p});if(g.type==="disposal"){let $=wT(g,s,c),D=Bu($,A.matches.map(le=>le.quantity),BigInt(g.quantity)),M=A.matches.map((le,Wt)=>{let Gt=D[Wt];return Ee({lotId:le.lot.lotId,originLotId:le.lot.originLotId,quantity:le.quantity.toString(),basisMinor:wr(le.basis),proceedsMinor:wr(Gt),gainMinor:le.basis==null||Gt==null?null:(Gt-le.basis).toString(),acquiredAt:le.lot.acquiredAt,evidenceStatus:le.lot.evidenceStatus})}),Q=M.filter(le=>le.basisMinor!=null).reduce((le,Wt)=>le+BigInt(Wt.basisMinor),0n),Y=A.missing===0n&&M.every(le=>le.basisMinor!=null),Ue=A.missing===0n&&$!=null;d.push(Ee({eventId:g.id,asset:g.asset,location:g.location,occurredAt:g.occurredAt,quantity:g.quantity,grossProceedsMinor:g.grossAmountMinor,feeMinor:g.feeMinor,recognizedProceedsMinor:Ue?$.toString():null,basisMinor:Y?Q.toString():null,gainMinor:Y&&Ue?($-Q).toString():null,unknownQuantity:A.missing.toString(),status:Y&&Ue?"complete":"incomplete",evidenceStatus:g.evidence.status,matches:M}));continue}let P=BigInt(g.feeMinor),I=P>0n&&s.transferFees==="include-in-basis",L=P>0n&&s.transferFees==="unresolved";L&&Pe(c,"unresolved-transfer-fee-treatment",g.id,"fee treatment was not supplied; transferred lot basis remains unknown");let q=Bu(I?P:0n,A.matches.map($=>$.quantity),BigInt(g.quantity)),j=A.matches.map(($,D)=>{let M=$.basis;L?M=null:M!=null&&I&&(M+=q[D]);let Q=`${g.id}:${D+1}`;return l.has(Q)?(Pe(c,"duplicate-lot-id",g.id,`derived transfer lotId ${JSON.stringify(Q)} is already in use`),p.add(dn(g.asset,g.to)),null):(l.add(Q),u.push({lotId:Q,originLotId:$.lot.originLotId,acquisitionEventId:$.lot.acquisitionEventId,asset:g.asset,location:g.to,key:dn(g.asset,g.to),acquiredAt:$.lot.acquiredAt,quantityRemaining:$.quantity,basisRemaining:M,evidenceStatus:g.evidence.status==="complete"&&$.lot.evidenceStatus==="complete"?"complete":"unknown"}),Ee({fromLotId:$.lot.lotId,toLotId:Q,originLotId:$.lot.originLotId,quantity:$.quantity.toString(),basisMinor:wr(M)}))}).filter(Boolean);A.indeterminate&&p.add(dn(g.asset,g.to)),f.push(Ee({eventId:g.id,asset:g.asset,from:g.from,to:g.to,occurredAt:g.occurredAt,quantity:g.quantity,feeMinor:g.feeMinor,unknownQuantity:A.missing.toString(),status:A.indeterminate||j.some($=>$.basisMinor==null)?"incomplete":"complete",moved:j}))}let m=u.filter(g=>g.quantityRemaining>0n).sort((g,A)=>Ft(g.key,A.key)||Ft(g.lotId,A.lotId)),y=new Map;for(let g of m)y.has(g.key)||y.set(g.key,[]),y.get(g.key).push(g);let h=[];for(let[g,A]of[...y].sort(([P],[I])=>Ft(P,I))){let P=A.reduce(($,D)=>$+D.quantityRemaining,0n),I=a.byHolding.get(g)||null,L=p.has(g),q=I;I?BigInt(I.quantity)!==P&&(Pe(c,"market-value-quantity-mismatch",null,`market value ${JSON.stringify(I.id)} does not cover the recorded holding quantity`),q=null):Pe(c,"missing-market-value",null,`no market value was supplied for holding ${g}`),L&&(q=null);let j=Bu(q?BigInt(q.valueMinor):null,A.map($=>$.quantityRemaining),P);A.forEach(($,D)=>{let M=j[D],Q=M==null||$.basisRemaining==null?null:M-$.basisRemaining;h.push(Ee({lotId:$.lotId,originLotId:$.originLotId,acquisitionEventId:$.acquisitionEventId,asset:$.asset,location:$.location,acquiredAt:$.acquiredAt,quantity:$.quantityRemaining.toString(),basisMinor:L?null:wr($.basisRemaining),marketValueMinor:wr(M),unrealizedGainMinor:L?null:wr(Q),valuationId:q?.id??null,status:L||$.basisRemaining==null||M==null?"incomplete":"complete",evidenceStatus:$.evidenceStatus}))})}let w=Er(d,"basisMinor"),v=Er(d,"recognizedProceedsMinor"),T=Er(d,"gainMinor"),S=Er(h,"basisMinor"),k=Er(h,"marketValueMinor"),x=Er(h,"unrealizedGainMinor"),E=o.every(g=>BigInt(g.feeMinor)>0n?g.type==="acquisition"?s.acquisitionFees!=="unresolved":g.type==="disposal"?s.disposalFees!=="unresolved":s.transferFees!=="unresolved":!0),b={recordVersion:iT,recordType:"cost-basis-records",label:aT,asOf:n,method:i,units:{quantity:"exact asset minor units as base-10 integer strings",usd:"USD minor units as base-10 integer strings"},accountingFacts:{events:o,marketValues:a.values,duplicatesIgnored:r.duplicatesIgnored+a.duplicatesIgnored},jurisdictionalTreatment:{suppliedByCaller:s,status:E?"specified":"unresolved",note:"Fee and lot-selection treatment can vary by jurisdiction. These caller-selected recordkeeping rules are not tax advice."},realized:{disposals:d,totals:{proceedsMinor:v.value,basisMinor:w.value,gainMinor:T.value,knownProceedsSubtotalMinor:v.known,knownBasisSubtotalMinor:w.known,knownGainSubtotalMinor:T.known}},transfers:f,holdings:h,unrealized:{totals:{marketValueMinor:k.value,basisMinor:S.value,gainMinor:x.value,knownMarketValueSubtotalMinor:k.known,knownBasisSubtotalMinor:S.known,knownGainSubtotalMinor:x.known}},completeness:{accounting:c.some(g=>g.code!=="missing-market-value")?"incomplete":"complete",valuation:h.every(g=>g.marketValueMinor!=null)?"complete":"incomplete",evidence:vT(o,a.values),treatment:E?"specified":"unresolved"},issues:c};return Ee(b)}var iT,sT,aT,cT,uT,lT,Uu,Xg,t0=_(()=>{br();iT=1,sT=Object.freeze(["fifo","lifo","hifo","specific"]),aT="Accounting records only; not tax advice.",cT=new Set(["acquisition","disposal","transfer"]),uT=new Set(["complete","incomplete","unknown"]),lT=/[\u0000-\u001f\u007f]/,Uu=class extends Error{constructor(t,n="COST_BASIS_INVALID"){super(`cost basis: ${t}`),this.name="CostBasisValidationError",this.code=n}};Xg=Object.freeze({acquisitionFees:new Set(["include-in-basis","exclude","unresolved"]),disposalFees:new Set(["reduce-proceeds","exclude","unresolved"]),transferFees:new Set(["include-in-basis","exclude","unresolved"])})});function Z(e,t){throw new Du(e,t)}function Rn(e,t){return e<t?-1:e>t?1:0}function Ze(e){if(e&&typeof e=="object"&&!Object.isFrozen(e)){for(let t of Object.values(e))Ze(t);Object.freeze(e)}return e}function ue(e,t){return(!e||typeof e!="object"||Array.isArray(e)||Object.getPrototypeOf(e)!==Object.prototype)&&Z(`${t} must be a plain object`),e}function _t(e,t,{optional:n=!1,lower:r=!1}={}){if(e==null&&n)return null;typeof e!="string"&&Z(`${t} must be a string`);let o=e.trim();return o||Z(`${t} is required`),TT.test(o)&&Z(`${t} contains control characters`),o.length>512&&Z(`${t} is too long`),r?o.toLowerCase():o}function Qe(e,t,{optional:n=!1,positive:r=!1}={}){if(e==null&&n)return null;typeof e=="number"&&Z(`${t} must be an exact decimal string or BigInt; Number coercion is refused`,"POSITION_HEALTH_UNSAFE_NUMBER");let o;typeof e=="bigint"?o=e.toString():typeof e=="string"?o=e.trim():Z(`${t} must be an exact decimal string or BigInt`),/^\d+$/.test(o)||Z(`${t} must be a non-negative base-10 integer string`);let i=BigInt(o);return r&&i===0n&&Z(`${t} must be positive`),i.toString()}function s0(e,t){e==null&&Z(`${t} is required`,"POSITION_HEALTH_MISSING_DECIMALS"),typeof e=="number"&&Z(`${t} must be an exact decimal string or BigInt; Number coercion is refused`,"POSITION_HEALTH_UNSAFE_NUMBER");let n=Qe(e,t),r=BigInt(n);return r>BigInt(r0)&&Z(`${t} exceeds ${r0}`),Number(r)}function No(e,t){return e==null?null:_t(e,t)}function CT(e,t){return e==null&&Z(`${t} is required`),typeof e=="bigint"?e.toString():typeof e=="number"?((!Number.isInteger(e)||!Number.isSafeInteger(e)||e<0)&&Z(`${t} must be a safe non-negative integer, decimal string, or slug`),String(e)):_t(String(e),t,{lower:!0})}function H(e,t){for(let n of t)if(e[n]!==void 0)return e[n]}function NT(e,t="protocol"){if(e==null)return"generic";let n=_t(e,t,{lower:!0}),r=_T[n]||n;return IT.has(r)||Z(`${t} must be a supported lending or yield protocol`),r}function p0(e){return e.protocol!=null?NT(e.protocol):e.marketId!=null||e.lltv!=null||e.loanAsset&&e.collateralAsset?"morpho":e.cToken!=null||e.underlying_symbol!=null||e.collateralFactor!=null?"compound":e.borrowedAmountWads!=null||e.lendingMarket!=null||e.mintDecimals!=null?"solend":e.recipe!=null||e.farmingMethod!=null||e.methodId!=null?"farming":e.spark!=null||e.savingsVault!=null?"spark":e.userReserves!=null||e.reserves!=null||e.liquidationThreshold!=null?"aave-v3":"generic"}function RT(e,t="evidence"){if(e==null)return Ze({status:"unknown",references:[]});let n=ue(e,t),r=_t(n.status??"unknown",`${t}.status`,{lower:!0});OT.has(r)||Z(`${t}.status must be complete, incomplete, unknown, or stale`),n.references!=null&&!Array.isArray(n.references)&&Z(`${t}.references must be an array`);let o=(n.references||[]).map((s,a)=>{let c=ue(s,`${t}.references[${a}]`);return{kind:_t(c.kind??c.type,`${t}.references[${a}].kind`,{lower:!0}),id:_t(c.id??c.receiptId??c.txHash,`${t}.references[${a}].id`)}}).sort((s,a)=>Rn(s.kind,a.kind)||Rn(s.id,a.id)),i=[];for(let s of o)i.some(a=>a.kind===s.kind&&a.id===s.id)||i.push(s);return Ze({status:r,references:i})}function f0(e,t){if(e==null)return null;if(typeof e=="number"&&Z(`${t} must be an exact integer string or BigInt; Number coercion is refused`,"POSITION_HEALTH_UNSAFE_NUMBER"),typeof e=="object"){let o=ue(e,t);if(o.bps!=null)return f0(o.bps,`${t}.bps`);if(o.ray!=null)return Mu(o.ray,`${t}.ray`);if(o.wad!=null)return a0(o.wad,`${t}.wad`);if(o.raw!=null)return Mu(o.raw,`${t}.raw`);o.value!=null&&Z(`${t}.value is not an exact integer threshold; supply bps, wad, or ray`,"POSITION_HEALTH_UNSAFE_NUMBER"),Z(`${t} must include bps, wad, or ray`)}let n=typeof e=="bigint"?e.toString():String(e).trim();/^\d+$/.test(n)||Z(`${t} must be a non-negative base-10 integer string`);let r=BigInt(n);return r<=10000n?r.toString():r<=Sr?a0(r,t):Mu(r,t)}function a0(e,t){let r=BigInt(Qe(e,t))*10000n/Sr;return r>10000n&&Z(`${t} exceeds 100%`),r.toString()}function Mu(e,t){let n=BigInt(Qe(e,t)),r=10n**27n,o=n*10000n/r;return o>10000n&&Z(`${t} exceeds 100%`),o.toString()}function c0(e,t,n){let r=`${n}[${t}]`,o=ue(e,r),i=_t(H(o,["asset","symbol","coin","underlying","underlyingToken","name"])??o.underlyingToken?.symbol??o.liquidityToken?.symbol,`${r}.asset`),s=No(H(o,["address","token","mint","underlyingAddress"])??o.underlyingToken?.address??o.liquidityToken?.mint,`${r}.address`),a=Qe(H(o,["amount","balance","aTokenBalance","supplyBalance","supplyAssets","collateral","deposited","shares"]),`${r}.amount`),c=s0(H(o,["decimals","tokenDecimals","mintDecimals"])??o.underlyingToken?.decimals??o.liquidityToken?.decimals,`${r}.decimals`),u=Qe(H(o,["price","priceQuoteMinor","oraclePrice","marketPrice"]),`${r}.price`),l=s0(H(o,["priceDecimals","oraclePriceDecimals","quoteDecimals"]),`${r}.priceDecimals`),d=null;if(n==="collateral"){let f=H(o,["liquidationThresholdBps","liquidationThreshold","lltv","ltvBps","collateralFactor","collateralFactorBps"])??o.supplyInfo?.liquidationThreshold;f==null&&Z(`${r}.liquidationThresholdBps is required`,"POSITION_HEALTH_MISSING_THRESHOLD"),d=f0(f,`${r}.liquidationThreshold`)}return Ze({asset:i,address:s,amount:a,decimals:String(c),price:u,priceDecimals:String(l),liquidationThresholdBps:d})}function xs(e,t){return e==null?[]:(Array.isArray(e)||Z(`${t} must be an array`),e.length>o0&&Z(`${t} exceeds ${o0} assets`),e)}function PT(e){let t=H(e,["chain","chainId","network"]),n=e.market&&typeof e.market=="object"?e.market.chain?.chainId??(typeof e.market.chain=="string"||typeof e.market.chain=="bigint"?e.market.chain:null):null,r=CT(t??n,"chain"),o=_t(H(e,["account","address","owner","user","wallet"]),"account"),i=H(e,["marketId","pool","vault"]);return typeof e.market=="string"||typeof e.market=="bigint"?i=i??e.market:e.market&&typeof e.market=="object"&&(i=i??e.market.address??e.market.name??e.market.marketId??null),{chain:r,account:o,market:i==null?null:_t(String(i),"market")}}function LT(e,t){let n=Qe(t.asOf??e.asOf,"asOf"),r=Qe(H(e,["observedAt","fetchedAt","updatedAt","lastUpdate","asOfObserved"]),"observedAt"),o=Qe(H(e,["expiresAt","validUntil","staleAfter"]),"expiresAt");return{asOf:n,observedAt:r,expiresAt:o}}function $T(e,t,n,r){return BigInt(r)<BigInt(t)?{status:"unknown",reason:"FUTURE_EVIDENCE"}:BigInt(r)>=BigInt(n)?{status:"stale",reason:"STALE_EVIDENCE"}:e.status==="stale"?{status:"stale",reason:"STALE_EVIDENCE"}:e.status==="unknown"?{status:"unknown",reason:"UNKNOWN_EVIDENCE"}:e.status==="incomplete"?{status:"incomplete",reason:"INCOMPLETE_EVIDENCE"}:{status:"complete",reason:null}}function Co(e,t,n,r={}){return Ze({code:e,severity:t,message:n,...r})}function m0(e){let t={critical:0,warning:1,info:2};return[...e].sort((n,r)=>{let o=(t[n.severity]??9)-(t[r.severity]??9);return o||Rn(n.code,r.code)||Rn(n.message,r.message)})}function u0(e,t,n,r,o,i){return BigInt(e)*BigInt(n)*10n**BigInt(o-t)*10n**BigInt(i-r)}function qT(e,t){let n=[...e,...t],r=n.reduce((w,v)=>Math.max(w,Number(v.decimals)),0),o=n.reduce((w,v)=>Math.max(w,Number(v.priceDecimals)),0),i=0n,s=0n,a=0n;for(let w of e){let v=u0(w.amount,Number(w.decimals),w.price,Number(w.priceDecimals),r,o);s+=v,i+=v*BigInt(w.liquidationThresholdBps)}for(let w of t)a+=u0(w.amount,Number(w.decimals),w.price,Number(w.priceDecimals),r,o);let c=10n**BigInt(r),u={tokenDecimals:String(r),priceDecimals:String(o),unit:"quote-minor = floor(scaledValue / 10^tokenDecimals) at priceDecimals"},l=(s/c).toString(),d=(a/c).toString(),f=(i/10000n/c).toString();if(a===0n)return Ze({healthFactorWad:null,healthFactorStatus:s===0n?"empty":"no-debt",totalCollateralQuoteMinor:l,totalDebtQuoteMinor:"0",weightedCollateralQuoteMinor:f,liquidationBufferQuoteMinor:f,quote:u});let p=(i*Sr/(a*10000n)).toString(),m=i/10000n-a,y=m<0n?"-":"",h=m<0n?-m:m;return Ze({healthFactorWad:p,healthFactorStatus:BigInt(p)<Sr?"liquidatable":"priced",totalCollateralQuoteMinor:l,totalDebtQuoteMinor:d,weightedCollateralQuoteMinor:f,liquidationBufferQuoteMinor:`${y}${(h/c).toString()}`,quote:u})}function $e(e,t={}){K(e),K(t);let n=ue(e,"snapshot");ue(t,"options");let r=p0(n),{chain:o,account:i,market:s}=PT(n),a=RT(n.evidence),{asOf:c,observedAt:u,expiresAt:l}=LT(n,t),d=_t(n.id??n.positionId??`${r}:${o}:${i}:${s??"default"}`,"id"),f=No(n.tenantId,"tenantId"),p=xs(n.collateral??n.supplies??n.deposits,"collateral").map((h,w)=>c0(h,w,"collateral")),m=xs(n.debt??n.borrows??n.liabilities,"debt").map((h,w)=>c0(h,w,"debt")),y={id:d,protocol:r,chain:o,account:i,market:s,observedAt:u,expiresAt:l,asOf:c,evidence:a,collateral:p,debt:m};return f&&(y.tenantId=f),Ze(y)}function BT(e){return H(e,["liquidationThresholdBps","liquidationThreshold","lltv"])??e.market?.lltv??e.state?.lltv}function UT(e,t={}){return H(t,["collateralFactorBps","collateralFactor","liquidationThresholdBps","liquidationThreshold"])??H(e,["collateralFactorBps","collateralFactor","liquidationThresholdBps"])}function MT(e){return H(e,["price","priceQuoteMinor","oraclePrice","marketPrice"])}function DT(e,t={}){K(e);let n=ue(e,"snapshot");if(Array.isArray(n.collateral)||Array.isArray(n.debt))return $e({...n,protocol:"aave-v3"},t);let r=n.userReserves??n.reserves??n.market?.reserves;if(!Array.isArray(r))return $e({...n,protocol:"aave-v3"},t);let o=[],i=[];for(let s of r){let a=ue(s,"reserve"),c=ue(a.underlyingToken??a.token??a,"reserve.token"),u={asset:c.symbol??a.symbol,address:c.address??a.address,decimals:c.decimals??a.decimals,price:H(a,["price","priceQuoteMinor","oraclePrice"])??a.size?.usd,priceDecimals:H(a,["priceDecimals","oraclePriceDecimals"]),liquidationThreshold:a.liquidationThresholdBps??a.liquidationThreshold??a.supplyInfo?.liquidationThreshold},l=H(a,["aTokenBalance","supplyBalance","collateral","amount","supplied"]),d=H(a,["variableDebtTokenBalance","stableDebtTokenBalance","borrowBalance","debt","borrowed"]);l!=null&&l!=="0"&&o.push({...u,amount:l}),d!=null&&d!=="0"&&i.push({...u,amount:d})}return $e({...n,protocol:"aave-v3",collateral:n.collateral??o,debt:n.debt??i},t)}function FT(e,t={}){K(e);let n=ue(e,"snapshot");if(Array.isArray(n.collateral)||Array.isArray(n.debt))return $e({...n,protocol:"morpho"},t);let r=BT(n),o=n.collateralAsset??n.market?.collateralAsset??{},i=n.loanAsset??n.market?.loanAsset??{},s=n.position??n.state??{},a=[{asset:o.symbol??n.collateralSymbol,address:o.address,decimals:o.decimals??n.collateralDecimals,amount:H(n,["collateral","collateralAmount","supplyAssets"])??s.collateral??s.supplyAssets,price:H(n,["collateralPrice","price","priceQuoteMinor"])??o.price,priceDecimals:H(n,["collateralPriceDecimals","priceDecimals"])??o.priceDecimals,liquidationThreshold:r}],c=n.debt??[{asset:i.symbol??n.loanSymbol,address:i.address,decimals:i.decimals??n.loanDecimals,amount:H(n,["borrowAssets","debt","borrowAmount"])??s.borrowAssets,price:H(n,["loanPrice","debtPrice"])??i.price,priceDecimals:H(n,["loanPriceDecimals","debtPriceDecimals"])??i.priceDecimals}],u=(Array.isArray(c)?c:[c]).filter(l=>l&&l.amount!=null&&l.amount!=="0"&&l.amount!==0n);return $e({...n,protocol:"morpho",market:n.marketId??n.market?.marketId??n.market,collateral:Array.isArray(a)?a:[a],debt:u},t)}function jT(e,t={}){K(e);let n=ue(e,"snapshot"),r=n.markets??n.cTokens??(n.cToken||n.underlying?[n]:null);if(n.collateral||n.debt)return $e({...n,protocol:"compound"},t);let o=[],i=[];for(let s of xs(r??[],"markets")){let a=ue(s,"market"),c={asset:a.underlying??a.underlying_symbol??a.symbol??a.asset,address:a.address??a.cToken,decimals:a.decimals??a.underlyingDecimals,price:a.price??a.priceQuoteMinor??a.oraclePrice,priceDecimals:a.priceDecimals,liquidationThreshold:UT(n,a)},u=H(a,["supplyBalance","balance","amount","totalSupply"]),l=H(a,["borrowBalance","borrow","debt","totalBorrow"]);u!=null&&u!=="0"&&o.push({...c,amount:u}),l!=null&&l!=="0"&&i.push({...c,amount:l})}return $e({...n,protocol:"compound",collateral:o,debt:i},t)}function HT(e,t={}){K(e);let n=ue(e,"snapshot");if(n.stale===!0||n.reserve?.lastUpdate?.stale===1)return $e({...n,protocol:"solend",evidence:{...n.evidence||{},status:"stale"}},t);if(n.collateral||n.debt)return $e({...n,protocol:"solend"},t);let r=n.reserves??n.obligation?.deposits??(n.mint||n.mintDecimals!=null?[n]:[]),o=[],i=[];for(let s of xs(r,"reserves")){let a=ue(s,"reserve"),c={asset:a.symbol??a.asset??a.liquidityToken?.symbol,address:a.mint??a.address??a.liquidityToken?.mint,decimals:a.mintDecimals??a.decimals??a.liquidityToken?.decimals,price:MT(a),priceDecimals:a.priceDecimals??a.oraclePriceDecimals,liquidationThreshold:a.liquidationThresholdBps??a.liquidationThreshold??a.loanToValueRatio??n.liquidationThresholdBps},u=H(a,["depositedAmount","collateral","amount","availableAmount"]),l=H(a,["borrowedAmount","borrowBalance","debt"]);if(l==null&&a.borrowedAmountWads!=null){let d=Qe(a.borrowedAmountWads,"borrowedAmountWads");l=(BigInt(d)/10n**18n).toString()}u!=null&&u!=="0"&&o.push({...c,amount:u}),l!=null&&l!=="0"&&i.push({...c,amount:l})}return $e({...n,protocol:"solend",collateral:o,debt:i},t)}function zT(e,t={}){K(e);let n=ue(e,"snapshot");if(n.collateral||n.debt)return $e({...n,protocol:"spark"},t);let r=n.vault??n.savingsVault??n.data?.vault??n,o=ue(r,"vault"),i=[{asset:o.symbol??o.asset??n.token??"savings",address:o.address??n.address,decimals:o.decimals??n.decimals,amount:H(n,["amount","shares","balance"])??o.amount??o.shares,price:H(n,["price","priceQuoteMinor"])??o.price,priceDecimals:H(n,["priceDecimals"])??o.priceDecimals,liquidationThreshold:H(n,["liquidationThresholdBps","liquidationThreshold"])??"10000"}],s=H(n,["debt","borrowed","borrowAmount"]),a=s==null||s==="0"?[]:[{asset:n.debtAsset??n.borrowSymbol??"debt",address:n.debtAddress,decimals:n.debtDecimals??o.decimals??n.decimals,amount:s,price:n.debtPrice??n.price,priceDecimals:n.debtPriceDecimals??n.priceDecimals??o.priceDecimals}];return $e({...n,protocol:"spark",collateral:i,debt:a},t)}function VT(e,t={}){K(e);let n=ue(e,"snapshot");if(n.tvlUsd!=null&&typeof n.tvlUsd=="number"&&Z("farming tvlUsd Number is refused; supply exact collateral and debt amounts","POSITION_HEALTH_UNSAFE_NUMBER"),Array.isArray(n.collateral)||Array.isArray(n.debt)){let c=$e({...n,protocol:"farming"},t),u=No(n.recipe??n.farmingMethod??n.methodId,"recipe");return Ze(u?{...c,recipe:u}:c)}let r=No(n.recipe??n.farmingMethod??n.methodId,"recipe"),o=[{asset:n.symbol??n.asset??n.project??"farm",address:n.pool??n.address,decimals:n.decimals,amount:H(n,["amount","deposited","shares","collateral"]),price:H(n,["price","priceQuoteMinor"]),priceDecimals:n.priceDecimals,liquidationThreshold:H(n,["liquidationThresholdBps","liquidationThreshold","lltv"])??"10000"}],i=H(n,["debt","borrowed","borrowAmount"]),s=i==null||i==="0"?[]:[{asset:n.debtAsset??n.borrowSymbol??"debt",decimals:n.debtDecimals??n.decimals,amount:i,price:n.debtPrice??n.price,priceDecimals:n.debtPriceDecimals??n.priceDecimals}],a=$e({...n,protocol:"farming",collateral:o,debt:s},t);return Ze(r?{...a,recipe:r}:a)}function GT(e,t={}){K(e);let n=ue(e,"snapshot"),r=p0(n);return WT[r]({...n,protocol:r},t)}function KT(e){let t=e==null?{}:ue(e,"thresholds"),n=Qe(t.criticalHealthFactorWad??n0.criticalHealthFactorWad,"thresholds.criticalHealthFactorWad",{positive:!0}),r=Qe(t.warningHealthFactorWad??n0.warningHealthFactorWad,"thresholds.warningHealthFactorWad",{positive:!0});BigInt(r)<BigInt(n)&&Z("thresholds.warningHealthFactorWad must be >= criticalHealthFactorWad");let o=Qe(t.minLiquidationBufferQuoteMinor,"thresholds.minLiquidationBufferQuoteMinor",{optional:!0});return Ze({criticalHealthFactorWad:n,warningHealthFactorWad:r,minLiquidationBufferQuoteMinor:o})}function YT(e,t,n){let r=[];if(n.status!=="complete"){let a=n.reason||"UNKNOWN_EVIDENCE";return r.push(Co(a,"critical","Position evidence is not current and complete; health fails closed.")),{healthStatus:n.status==="stale"?"stale":"unknown",findings:r,metrics:{healthFactorWad:null,totalCollateralQuoteMinor:null,totalDebtQuoteMinor:null,weightedCollateralQuoteMinor:null,liquidationBufferQuoteMinor:null,quote:null}}}let o=e;if(e.healthFactorStatus==="empty")return{healthStatus:"empty",findings:r,metrics:o};if(e.healthFactorStatus==="no-debt")return{healthStatus:"no-debt",findings:r,metrics:o};let i=BigInt(e.healthFactorWad);i<Sr?r.push(Co("LIQUIDATABLE","critical","Health factor is below 1.0 wad; the position is at or past liquidation.")):i<BigInt(t.criticalHealthFactorWad)?r.push(Co("HEALTH_FACTOR_CRITICAL","critical","Health factor is below the configured critical threshold.")):i<BigInt(t.warningHealthFactorWad)&&r.push(Co("HEALTH_FACTOR_WARNING","warning","Health factor is below the configured warning threshold.")),t.minLiquidationBufferQuoteMinor!=null&&BigInt(e.liquidationBufferQuoteMinor)<BigInt(t.minLiquidationBufferQuoteMinor)&&r.push(Co("LIQUIDATION_BUFFER_LOW",i<Sr?"critical":"warning","Liquidation buffer is below the configured quote-minor minimum."));let s="healthy";return r.some(a=>a.code==="LIQUIDATABLE")?s="liquidatable":r.some(a=>a.severity==="critical")?s="critical":r.length&&(s="warning"),{healthStatus:s,findings:r,metrics:o}}function Fu(e={},t={}){K(e),K(t),ue(e,"input"),ue(t,"options"),t.asOf==null&&e.asOf==null&&Z("explicit asOf required","POSITION_HEALTH_MISSING_ASOF");let n=GT(e,t),r=KT(t.thresholds??e.thresholds),o=$T(n.evidence,n.observedAt,n.expiresAt,n.asOf),i=YT(o.status==="complete"?qT(n.collateral,n.debt):{healthFactorStatus:"unknown"},r,o),s={recordVersion:l0,recordType:"position-health",label:d0,posture:"alert-only",executionReady:!1,signingReady:!1,broadcastReady:!1,id:n.id,protocol:n.protocol,chain:n.chain,account:n.account,market:n.market,observedAt:n.observedAt,expiresAt:n.expiresAt,asOf:n.asOf,evidence:n.evidence,collateral:n.collateral,debt:n.debt,thresholds:r,healthStatus:i.healthStatus,healthFactorWad:i.metrics.healthFactorWad,totalCollateralQuoteMinor:i.metrics.totalCollateralQuoteMinor,totalDebtQuoteMinor:i.metrics.totalDebtQuoteMinor,weightedCollateralQuoteMinor:i.metrics.weightedCollateralQuoteMinor,liquidationBufferQuoteMinor:i.metrics.liquidationBufferQuoteMinor,quote:i.metrics.quote,findings:m0(i.findings)};return n.tenantId&&(s.tenantId=n.tenantId),n.recipe&&(s.recipe=n.recipe),Ze(s)}function h0(e={},t={}){K(e),K(t);let n=Array.isArray(e)?{snapshots:e}:ue(e,"input"),r=n.snapshots??n.positions;Array.isArray(r)||Z("snapshots must be an array"),r.length>i0&&Z(`snapshots exceed ${i0}`);let o=Qe(t.asOf??n.asOf,"asOf"),i=t.thresholds??n.thresholds,s=No(n.tenantId,"tenantId"),a=r.map((f,p)=>Fu(s&&f?.tenantId==null?{...f,tenantId:s}:f,{...t,asOf:o,thresholds:i,index:p})).sort((f,p)=>Rn(f.chain,p.chain)||Rn(f.account,p.account)||Rn(f.id,p.id)),c=m0(a.flatMap(f=>f.findings.map(p=>({...p,positionId:f.id})))),u=a.filter(f=>f.healthStatus==="unknown"||f.healthStatus==="stale").length,l=a.filter(f=>f.findings.length>0).length,d={recordVersion:l0,recordType:"position-health-book",label:d0,posture:"alert-only",asOf:o,positionCount:String(a.length),alertCount:String(l),failClosedCount:String(u),positions:a,findings:c};return s&&(d.tenantId=s),Ze(d)}var l0,d0,kT,n0,IT,_T,OT,TT,Sr,r0,o0,i0,Du,WT,y0=_(()=>{br();l0=1,d0="Alert findings only; not an execution signal and not a live oracle.",kT=Object.freeze(["aave-v3","morpho","compound","solend","spark","farming","generic"]),n0=Object.freeze({criticalHealthFactorWad:"1050000000000000000",warningHealthFactorWad:"1250000000000000000"}),IT=new Set(kT),_T=Object.freeze({aave:"aave-v3",aavev3:"aave-v3","aave-v3":"aave-v3",morpho:"morpho",compound:"compound","compound-v2":"compound","compound-v3":"compound",solend:"solend",save:"solend",spark:"spark","spark-lend":"spark",farming:"farming",farm:"farming",yield:"farming",generic:"generic",lending:"generic"}),OT=new Set(["complete","incomplete","unknown","stale"]),TT=/[\u0000-\u001f\u007f]/,Sr=10n**18n,r0=36,o0=64,i0=128,Du=class extends Error{constructor(t,n="POSITION_HEALTH_INVALID"){super(`position health: ${t}`),this.name="PositionHealthValidationError",this.code=n}};WT=Object.freeze({"aave-v3":DT,morpho:FT,compound:jT,solend:HT,spark:zT,farming:VT,generic:$e})});function fe(e,t){throw new ju(e,t)}function Pn(e){if(e&&typeof e=="object"&&!Object.isFrozen(e)){for(let t of Object.values(e))Pn(t);Object.freeze(e)}return e}function Ht(e,t){return(!e||typeof e!="object"||Array.isArray(e)||Object.getPrototypeOf(e)!==Object.prototype)&&fe(`${t} must be a plain object`),e}function He(e,t,{optional:n=!1,lower:r=!1}={}){if(e==null&&n)return null;typeof e!="string"&&fe(`${t} must be a string`);let o=e.trim();return o||fe(`${t} is required`),oC.test(o)&&fe(`${t} contains control characters`),o.length>2048&&fe(`${t} is too long`),r?o.toLowerCase():o}function Ot(e,t,{optional:n=!1,positive:r=!1}={}){if(e==null&&n)return null;typeof e=="number"&&fe(`${t} must be an exact decimal string or BigInt; Number coercion is refused`,"GOVERNANCE_UNSAFE_NUMBER");let o;typeof e=="bigint"?o=e.toString():typeof e=="string"?o=e.trim():fe(`${t} must be an exact decimal string or BigInt`),/^\d+$/.test(o)||fe(`${t} must be a non-negative base-10 integer string`);let i=BigInt(o);return r&&i===0n&&fe(`${t} must be positive`),i.toString()}function Ar(e,t){return e==null?null:He(e,t)}function fn(e,t){for(let n of t)if(e[n]!==void 0)return e[n]}function aC(e,t="action"){let n=He(e,t,{lower:!0});return eC.has(n)||fe(`${t} must be proposal, delegation, or vote`),n}function cC(e,t="proposal.state"){e==null&&fe(`${t} is required`,"GOVERNANCE_MISSING_PROPOSAL_STATE");let n=He(e,t,{lower:!0});return tC.has(n)||fe(`${t} is not a recognized proposal state`),n==="unknown"&&fe(`${t} is unknown; voting and execution fail closed`,"GOVERNANCE_UNKNOWN_PROPOSAL_STATE"),n}function uC(e){let t=He(e,"support",{lower:!0});return nC.has(t)||fe("support must be for, against, or abstain"),t}function ks(e,{accountRequired:t=!0}={}){return Pn({chain:He(fn(e,["chain","chainId","network"]),"chain",{lower:!0}),governor:He(fn(e,["governor","governorAddress","governance","contract"]),"governor"),account:He(fn(e,["account","address","owner","voter","from","proposer"]),"account",{optional:!t})})}function Po(e,t){let n=Ar(t.tenantId??e.tenantId,"tenantId");return n?{tenantId:n}:{}}function Is(e,t,n="asOf"){return Ot(t.asOf??e.asOf,n)}function lC(e,t={}){K(e),K(t);let n=Ht(e,"proposal");Ht(t,"options");let r=Is(n,t),o=ks(n,{accountRequired:!1}),i=He(fn(n,["proposalId","id"]),"proposalId"),s=cC(fn(n,["state","status","proposalState"])),a=Ar(n.title??n.name,"title"),c=Ar(n.description??n.body??n.summary,"description"),u=Ar(n.proposer,"proposer"),l=Ot(n.startBlock??n.start,"startBlock",{optional:!0}),d=Ot(n.endBlock??n.end,"endBlock",{optional:!0}),f=Ot(n.forVotes??n.votesFor,"forVotes",{optional:!0}),p=Ot(n.againstVotes??n.votesAgainst,"againstVotes",{optional:!0}),m=Ot(n.abstainVotes??n.votesAbstain,"abstainVotes",{optional:!0}),y={recordVersion:Ro,recordType:"governance-proposal",label:pn,asOf:r,chain:o.chain,governor:o.governor,proposalId:i,state:s,votable:iC.has(s),terminal:sC.has(s),title:a,description:c,proposer:u,startBlock:l,endBlock:d,tallies:{forVotes:f,againstVotes:p,abstainVotes:m},occurred:!1,...Po(n,t)};return Pn(y)}function dC(e,t={}){K(e),K(t);let n=Ht(e,"intent");Ht(t,"options");let r=Is(n,t),o=ks(n),i=n.mode??(n.action==="undelegate"?"undelegate":"delegate"),s=He(i,"mode",{lower:!0});rC.has(s)||fe("mode must be delegate or undelegate");let a=s==="undelegate"?Ar(n.delegatee??n.to,"delegatee"):He(n.delegatee??n.to,"delegatee"),c=Ot(fn(n,["votingPower","votes","power","balance"]),"votingPower",{positive:!0}),u={recordVersion:Ro,recordType:"governance-delegation-intent",label:pn,action:"delegation",mode:s,asOf:r,chain:o.chain,governor:o.governor,account:o.account,delegatee:s==="undelegate"?a??o.account:a,votingPower:c,occurred:!1,...Po(n,t)};return Pn(u)}function pC(e,t={}){K(e),K(t);let n=Ht(e,"intent");Ht(t,"options");let r=Is(n,t),o=lC(n.proposal??n,t);o.votable||fe(`proposal ${o.proposalId} is ${o.state} and is not votable`,"GOVERNANCE_PROPOSAL_NOT_VOTABLE");let i=ks({...n,chain:n.chain??o.chain,governor:n.governor??o.governor}),s=uC(n.support??n.choice??n.vote),a=Ot(fn(n,["votingPower","votes","power","weight"]),"votingPower",{positive:!0}),c=Ar(n.reason??n.comment,"reason"),u={recordVersion:Ro,recordType:"governance-vote-intent",label:pn,action:"vote",asOf:r,chain:i.chain,governor:i.governor,account:i.account,proposalId:o.proposalId,proposalState:o.state,support:s,votingPower:a,reason:c,occurred:!1,voted:!1,signed:!1,broadcast:!1,proposal:o,...Po(n,t)};return Pn(u)}function fC(e,t={}){K(e);let n=Ht(e,"intent"),r=Is(n,t),o=ks(n),i=He(n.title??n.name,"title"),s=He(n.description??n.body,"description"),a=n.targets;(!Array.isArray(a)||a.length===0)&&fe("targets must be a non-empty array");let c=(n.values??a.map(()=>"0")).map((d,f)=>Ot(d,`values[${f}]`));c.length!==a.length&&fe("values length must match targets");let u=(n.calldatas??n.data??[]).map((d,f)=>He(String(d),`calldatas[${f}]`));u.length!==a.length&&fe("calldatas length must match targets");let l=Ot(fn(n,["votingPower","proposalThreshold","threshold"]),"votingPower",{positive:!0});return Pn({recordVersion:Ro,recordType:"governance-proposal-intent",label:pn,action:"proposal",asOf:r,chain:o.chain,governor:o.governor,account:o.account,title:i,description:s,targets:a.map((d,f)=>He(d,`targets[${f}]`)),values:c,calldatas:u,votingPower:l,occurred:!1,...Po(n,t)})}function mC(e,t,n){return e==="vote"?pC(t,n):e==="delegation"?dC(t,n):fC(t,n)}function hC(e){return e.action==="vote"?[`Unsigned vote preview for proposal ${e.proposalId} on ${e.governor}.`,`Support: ${e.support}. Voting power: ${e.votingPower} (exact base units).`,`Proposal state is ${e.proposalState}. No ballot is submitted.`,pn]:e.action==="delegation"?[`Unsigned ${e.mode} preview on ${e.governor}.`,`Account ${e.account} \u2192 ${e.delegatee}. Voting power: ${e.votingPower}.`,"No delegation transaction is signed or broadcast.",pn]:[`Unsigned proposal preview on ${e.governor}: ${e.title}.`,`${e.targets.length} target(s). Voting power: ${e.votingPower}.`,"No proposal is submitted.",pn]}function g0(e={},t={}){K(e),K(t);let n=Ht(e,"intent");Ht(t,"options"),t.asOf==null&&n.asOf==null&&fe("explicit asOf required","GOVERNANCE_MISSING_ASOF");let r=aC(n.action??n.type??t.action??yC(n)),o=mC(r,{...n,action:r},t);return Pn({recordVersion:Ro,recordType:"governance-preview",label:pn,action:r,asOf:o.asOf,occurred:!1,voted:!1,signed:!1,broadcast:!1,executionReady:!1,signingReady:!1,broadcastReady:!1,lines:hC(o),intent:o,...Po(n,t)})}function yC(e){if(e.support!=null||e.choice!=null||e.proposalId!=null)return"vote";if(e.delegatee!=null||e.mode==="delegate"||e.mode==="undelegate")return"delegation";if(e.targets!=null||e.title!=null)return"proposal";fe("action is required")}var Ro,pn,XT,JT,QT,ZT,eC,tC,nC,rC,oC,iC,sC,ju,b0=_(()=>{br();Ro=1,pn="Unsigned prepare material only; no vote, signature, or broadcast occurred.",XT=Object.freeze(["proposal","delegation","vote"]),JT=Object.freeze(["pending","active","succeeded","queued","executed","defeated","canceled","expired","unknown"]),QT=Object.freeze(["for","against","abstain"]),ZT=Object.freeze(["delegate","undelegate"]),eC=new Set(XT),tC=new Set(JT),nC=new Set(QT),rC=new Set(ZT),oC=/[\u0000-\u001f\u007f]/,iC=new Set(["active"]),sC=new Set(["executed","defeated","canceled","expired"]),ju=class extends Error{constructor(t,n="GOVERNANCE_PREPARE_INVALID"){super(`governance prepare: ${t}`),this.name="GovernancePrepareError",this.code=n}}});import{createHash as gC}from"node:crypto";import{getAddress as bC,wordlists as wC}from"ethers";import{address as EC}from"@solana/addresses";import{base58check as SC,bech32 as w0,bech32m as AC}from"@scure/base";import{sha256 as vC}from"@noble/hashes/sha2.js";function k0(e){return String(e).replace(/[^a-z0-9]/gi,"").toLowerCase()}function zC(e){let t=k0(e);return LC.some(n=>t.includes(n))}function VC(e){return jC.has(k0(e))}function WC(e){let t=String(e).trim().toLowerCase().split(/\s+/).filter(Boolean);return UC.has(t.length)&&t.every(n=>wC.en.getWordIndex(n)>=0)}function Nt(e){let t=new WeakSet,n=0;function r(o,i,s,a=""){if(n+=1,n>TC)throw new RangeError("safety-intelligence: input is too large");if(s>CC)throw new RangeError("safety-intelligence: input is too deep");if(o==null||typeof o=="boolean")return;if(typeof o=="string"){if(o.length>NC)throw new RangeError(`safety-intelligence: string too long at ${i}`);if($C.test(o)||qC.test(o)||WC(o))throw new TypeError(`safety-intelligence: key material refused at ${i}`);if(BC.test(o)&&!VC(a))throw new TypeError(`safety-intelligence: key material refused at ${i}`);return}if(typeof o=="number"){if(!Number.isFinite(o))throw new TypeError(`safety-intelligence: finite number required at ${i}`);return}if(typeof o=="bigint")return;if(typeof o!="object")throw new TypeError(`safety-intelligence: JSON-like input required at ${i}`);if(ArrayBuffer.isView(o)||o instanceof ArrayBuffer)throw new TypeError(`safety-intelligence: binary key material refused at ${i}`);if(t.has(o))throw new TypeError(`safety-intelligence: cyclic input refused at ${i}`);if(t.add(o),Array.isArray(o)){if(o.length>Lo)throw new RangeError(`safety-intelligence: array too large at ${i}`);if(o.length===64&&o.every(u=>Number.isInteger(u)&&u>=0&&u<=255))throw new TypeError(`safety-intelligence: key material refused at ${i}`);o.forEach((u,l)=>r(u,`${i}[${l}]`,s+1,a)),t.delete(o);return}if(Object.getPrototypeOf(o)!==Object.prototype)throw new TypeError(`safety-intelligence: plain object required at ${i}`);let c=Reflect.ownKeys(o).filter(u=>typeof u=="string");if(c.length>64)throw new RangeError(`safety-intelligence: too many fields at ${i}`);for(let u of c){if(zC(u))throw new TypeError(`safety-intelligence: secret-bearing field refused at ${i}.${u}`);let l=Object.getOwnPropertyDescriptor(o,u),d=l&&"get"in l&&typeof l.get=="function"?l.get.call(o):o[u];d!==void 0&&r(d,`${i}.${u}`,s+1,u)}t.delete(o)}return r(e,"$",0),e}function qe(e,t,n){for(let r of Object.keys(e||{}))if(!t.has(r))throw new TypeError(`safety-intelligence: unknown ${n} field ${r}`)}function zt(e,t,n,{required:r=!1}={}){if(e==null||e===""){if(r)throw new TypeError(`safety-intelligence: ${t} required`);return null}let o=String(e).trim();if(!o&&r)throw new TypeError(`safety-intelligence: ${t} required`);if(o.length>n)throw new RangeError(`safety-intelligence: ${t} exceeds ${n} characters`);if(/[\u0000-\u001f\u007f\u200b-\u200f\u202a-\u202e\u2060-\u2064\ufeff]/i.test(o))throw new TypeError(`safety-intelligence: control or invisible characters refused in ${t}`);return o||null}function _s(e,t){if(e==null||e==="")throw new TypeError(`safety-intelligence: ${t} required`);let n;if(typeof e=="number"){if(!Number.isSafeInteger(e)||e<0)throw new TypeError(`safety-intelligence: ${t} must be a safe integer millisecond timestamp`);n=e}else if(typeof e=="string"){let r=e.trim();if(DC.test(r)&&r.length<=FC){if(n=Number(r),!Number.isSafeInteger(n))throw new TypeError(`safety-intelligence: ${t} must be a safe integer millisecond timestamp`)}else if(MC.test(r)){if(n=Date.parse(r),!Number.isFinite(n)||new Date(n).toISOString().replace(/\.000Z$/,"Z")!==r&&new Date(n).toISOString()!==r)throw new TypeError(`safety-intelligence: ${t} must be a canonical ISO timestamp`)}else throw new TypeError(`safety-intelligence: ${t} must be a canonical ISO timestamp or integer milliseconds`)}else throw new TypeError(`safety-intelligence: ${t} must be a timestamp`);if(!Number.isFinite(n))throw new TypeError(`safety-intelligence: ${t} must be a valid timestamp`);return{ms:n,iso:new Date(n).toISOString()}}function I0(e,t){return e==null||e===""?null:_s(e,t)}function v0(e){let t=String(e||"").trim().toLowerCase();if(t==="evm"||t==="eip155")return"evm";if(t==="solana")return"solana";if(t==="bitcoin"||t==="bip122"||t==="btc")return"bitcoin";throw new TypeError("safety-intelligence: chain family must be evm, solana, or bitcoin")}function _0(e){Nt(e);let t,n;if(Number.isInteger(e))t="evm",n=e;else if(typeof e=="string"){let i=e.trim();if(/^\d+$/.test(i))t="evm",n=Number(i);else{let s=/^(eip155|evm|solana|bitcoin|bip122|btc):([^:]+)$/i.exec(i);if(!s)throw new TypeError("safety-intelligence: chain must include a supported family");t=v0(s[1]),n=s[2]}}else if(e&&typeof e=="object"&&!Array.isArray(e))qe(e,new Set(["family","namespace","chainId","reference","network","key"]),"chain"),t=v0(e.family??e.namespace??(e.chainId!=null?"evm":"")),n=t==="evm"?e.chainId??e.reference:e.network??e.reference;else throw new TypeError("safety-intelligence: chain required");if(t==="evm"){let i=typeof n=="string"&&/^\d+$/.test(n)?Number(n):n;if(!Number.isSafeInteger(i)||i<=0)throw new TypeError("safety-intelligence: EVM chainId must be a positive safe integer");return ye({family:t,namespace:"eip155",reference:String(i),chainId:i,key:`eip155:${i}`})}let r=zt(n,`${t} network`,80,{required:!0}).toLowerCase();if(!/^[a-z0-9][a-z0-9._-]*$/.test(r))throw new TypeError(`safety-intelligence: invalid ${t} network`);let o=t==="bitcoin"?"bip122":"solana";return ye({family:t,namespace:o,reference:r,network:r,key:`${o}:${r}`})}function GC(e){let t=String(e).toLowerCase();return["mainnet","main","bitcoin"].includes(t)?"mainnet":["testnet","testnet3","test","signet"].includes(t)?"testnet":t==="regtest"?"regtest":"unknown"}function KC(e,t){let n=zt(e,"bitcoin address",100,{required:!0}),r=GC(t.reference);if(/^(bc1|tb1|bcrt1)/i.test(n)){if(n!==n.toLowerCase()&&n!==n.toUpperCase())throw new TypeError("safety-intelligence: mixed-case Bitcoin bech32 address refused");let s=n.toLowerCase(),a,c;try{a=w0.decode(s,100),c="bech32"}catch{try{a=AC.decode(s,100),c="bech32m"}catch{throw new TypeError("safety-intelligence: invalid Bitcoin bech32 checksum")}}let u=a.words[0],l;try{l=w0.fromWords(a.words.slice(1))}catch{throw new TypeError("safety-intelligence: invalid Bitcoin witness program")}if(!Number.isInteger(u)||u<0||u>16||l.length<2||l.length>40)throw new TypeError("safety-intelligence: invalid Bitcoin witness program");if(u===0&&(c!=="bech32"||![20,32].includes(l.length)))throw new TypeError("safety-intelligence: invalid v0 Bitcoin witness address");if(u>0&&c!=="bech32m")throw new TypeError("safety-intelligence: v1+ Bitcoin witness address must use bech32m");let d=r==="mainnet"?"bc":r==="testnet"?"tb":r==="regtest"?"bcrt":null;if(d&&a.prefix!==d)throw new TypeError(`safety-intelligence: Bitcoin address does not match ${t.reference}`);return{canonical:s,display:s}}let o;try{o=PC.decode(n)}catch{throw new TypeError("safety-intelligence: invalid Bitcoin base58check address")}if(o.length!==21)throw new TypeError("safety-intelligence: invalid Bitcoin address payload");let i=o[0];if(r==="mainnet"&&![0,5].includes(i))throw new TypeError("safety-intelligence: Bitcoin address does not match mainnet");if((r==="testnet"||r==="regtest")&&![111,196].includes(i))throw new TypeError(`safety-intelligence: Bitcoin address does not match ${t.reference}`);return{canonical:n,display:n}}function YC(e,t){let n=_0(t);Nt(e);let r=zt(e,`${n.family} address`,128,{required:!0});if(n.family==="evm"){let o=r.startsWith("0X")?`0x${r.slice(2)}`:r,i;try{i=bC(o)}catch{throw new TypeError("safety-intelligence: invalid EVM address or mixed-case checksum")}return ye({canonical:i.toLowerCase(),display:i})}if(n.family==="solana"){let o;try{o=String(EC(r))}catch{throw new TypeError("safety-intelligence: invalid Solana address")}return ye({canonical:o,display:o})}return ye(KC(r,n))}function Vt(e={}){if(Nt(e),!e||typeof e!="object"||Array.isArray(e))throw new TypeError("safety-intelligence: target object required");qe(e,new Set(["chain","chainId","family","network","address","displayAddress","key"]),"target");let t=e.chain??(e.chainId!=null?{family:e.family??"evm",chainId:e.chainId}:{family:e.family,network:e.network}),n=_0(t),r=YC(e.address,n);return ye({chain:n,address:r.canonical,displayAddress:r.display,key:`${n.key}:${r.canonical}`})}function Ct(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(Ct).join(",")}]`:`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${Ct(e[t])}`).join(",")}}`}function Vu(e){return gC("sha256").update(e).digest("hex")}function ye(e){if(!e||typeof e!="object"||Object.isFrozen(e))return e;for(let t of Object.values(e))ye(t);return Object.freeze(e)}function Hu(e){let t=String(e||"").trim().toLowerCase().replace(/_/g,"-"),r={sanction:"sanctions",sanctions:"sanctions",phishing:"phishing",scam:"scam",fraud:"scam",poisoning:"address-poisoning","address-poisoning":"address-poisoning"}[t];if(!r||!IC.has(r))throw new TypeError(`safety-intelligence: unsupported evidence kind ${String(e||"<missing>")}`);return r}function XC(e){let t=e.verdict??e.disposition??e.result??e.status;if(t==null){for(let o of["match","listed","malicious"])if(typeof e[o]=="boolean"){t=e[o]?"MATCH":"NO_MATCH";break}}let n=String(t||"").trim().toUpperCase().replace(/[ -]+/g,"_"),r=HC[n];if(!r)throw new TypeError(`safety-intelligence: unsupported evidence verdict ${String(t||"<missing>")}`);return r}function JC(e,t){let n=e.target??(e.address!=null?{address:e.address,chain:e.chain,chainId:e.chainId,family:e.family,network:e.network}:null);if(!n){if(!t)throw new TypeError("safety-intelligence: evidence target required");return t}return Vt(n)}function QC(e={},t={}){if(Nt({input:e,options:t}),!e||typeof e!="object"||Array.isArray(e))throw new TypeError("safety-intelligence: evidence object required");qe(e,new Set(["kind","type","category","source","sourceRecordId","recordId","reference","verdict","disposition","result","status","match","listed","malicious","confidence","fetchedAt","expiresAt","expiry","ttlMs","summary","target","address","chain","chainId","family","network"]),"evidence"),qe(t,new Set(["target","asOf"]),"evidence option");let n=JC(e,t.target?Vt(t.target):null),r=Hu(e.kind??e.type??e.category),o=XC(e),i=e.source&&typeof e.source=="object"?e.source.name??e.source.id:e.source,s=zt(i,"evidence source",120,{required:!0}),a=Number(e.confidence);if(!Number.isFinite(a)||a<0||a>1)throw new TypeError("safety-intelligence: evidence confidence must be between 0 and 1");let c=_s(e.fetchedAt,"evidence fetchedAt"),u=I0(e.expiresAt??e.expiry,"evidence expiresAt");if(!u&&e.ttlMs!=null){let h=Number(e.ttlMs);if(!Number.isSafeInteger(h)||h<=0||h>S0)throw new RangeError(`safety-intelligence: evidence ttlMs must be 1..${S0}`);u={ms:c.ms+h,iso:new Date(c.ms+h).toISOString()}}if(!u)throw new TypeError("safety-intelligence: evidence expiresAt or ttlMs required");if(u.ms<=c.ms)throw new TypeError("safety-intelligence: evidence expiry must be after fetchedAt");if(t.asOf==null)throw new TypeError("safety-intelligence: explicit asOf required for deterministic freshness");let l=_s(t.asOf,"asOf").ms,d=c.ms>l+RC?"FUTURE":u.ms<=l?"STALE":"CURRENT",f=zt(e.sourceRecordId??e.recordId??e.reference,"source record id",160),p=zt(e.summary,"evidence summary",500),m={kind:r,verdict:o,source:s,...f?{sourceRecordId:f}:{},fetchedAt:c.iso,expiresAt:u.iso,confidence:a,freshness:d,target:n.key,...p?{summary:p}:{}},y=`safety-evidence:${Vu(Ct(m))}`;return ye({id:y,...m})}function ZC(e=[],t={}){if(Nt({records:e,options:t}),!Array.isArray(e))throw new TypeError("safety-intelligence: evidence must be an array");let n=t.maxEvidence??_C;if(!Number.isSafeInteger(n)||n<=0||n>Lo)throw new RangeError("safety-intelligence: invalid maxEvidence");if(e.length>n)throw new RangeError(`safety-intelligence: evidence exceeds ${n} records`);qe(t,new Set(["target","asOf","maxEvidence"]),"evidence-set option");let r={target:t.target,asOf:t.asOf},o=new Map(e.map(i=>{let s=QC(i,r);return[s.id,s]}));return ye([...o.values()].sort((i,s)=>i.id.localeCompare(s.id)))}function eN(e,t,n){if(!e||typeof e!="object"||Array.isArray(e))throw new TypeError(`safety-intelligence: knownContacts[${n}] must be an object`);qe(e,new Set(["id","label","address","chain","chainId","family","network"]),"contact");let r=Vt({address:e.address,chain:e.chain??(e.chainId!=null?{family:e.family??"evm",chainId:e.chainId}:e.family||e.network?{family:e.family,network:e.network}:t)}),o=zt(e.id,"contact id",120),i=zt(e.label,"contact label",120);return ye({...o?{id:o}:{},...i?{label:i}:{},target:r})}function Os(e,t){if(typeof e=="number"&&(!Number.isSafeInteger(e)||e<0))throw new TypeError(`safety-intelligence: ${t} must be an exact non-negative integer`);let n=typeof e=="bigint"?e.toString():String(e??"").trim();if(!/^\d+$/.test(n)||n.length>100)throw new TypeError(`safety-intelligence: ${t} must be a bounded base-unit integer`);return BigInt(n).toString()}function tN(e,t,n){if(!e||typeof e!="object"||Array.isArray(e))throw new TypeError(`safety-intelligence: observations[${n}] must be an object`);qe(e,new Set(["address","counterparty","from","direction","amountBaseUnits","chain","chainId","family","network","observedAt"]),"observation");let r=e.counterparty??e.address??e.from,o=Vt({address:r,chain:e.chain??(e.chainId!=null?{family:e.family??"evm",chainId:e.chainId}:e.family||e.network?{family:e.family,network:e.network}:t)}),i=String(e.direction??(e.from!=null?"inbound":"unknown")).toLowerCase(),s=["inbound","received","receive"].includes(i)?"inbound":["outbound","sent","send"].includes(i)?"outbound":"unknown",a=Os(e.amountBaseUnits,`observations[${n}].amountBaseUnits`),c=I0(e.observedAt,`observations[${n}].observedAt`)?.iso??null;return ye({target:o,direction:s,amountBaseUnits:a,...c?{observedAt:c}:{}})}function nN(e,t){let n=0;for(;n<e.length&&n<t.length&&e[n]===t[n];)n+=1;return n}function rN(e,t){let n=0;for(;n<e.length&&n<t.length&&e[e.length-1-n]===t[t.length-1-n];)n+=1;return n}function x0(e){return e.chain.family==="evm"?e.address.slice(2):e.address}function Tt(e){return ye({code:e.code,severity:e.severity,category:e.category,basis:e.basis,message:e.message,...e.evidenceIds?.length?{evidenceIds:[...e.evidenceIds].sort()}:{},...e.relatedTargets?.length?{relatedTargets:[...e.relatedTargets].sort()}:{}})}function zu(e){let t=new Map;for(let n of e){let r=Ct(n);t.set(r,n)}return[...t.values()].sort((n,r)=>(A0[n.severity]??9)-(A0[r.severity]??9)||n.category.localeCompare(r.category)||n.code.localeCompare(r.code)||Ct(n).localeCompare(Ct(r)))}function oN(e={},t={}){if(Nt({input:e,options:t}),!e||typeof e!="object"||Array.isArray(e))throw new TypeError("safety-intelligence: poisoning input object required");qe(e,new Set(["target","address","chain","chainId","family","network","knownContacts","expectedContact","observations","dustThresholdBaseUnits","lookalikeEdgeChars"]),"poisoning input"),qe(t,new Set(["maxContacts","maxObservations"]),"poisoning option");let n=Vt(e.target??{address:e.address,chain:e.chain,chainId:e.chainId,family:e.family,network:e.network}),r=e.knownContacts??[],o=e.observations??[];if(!Array.isArray(r))throw new TypeError("safety-intelligence: knownContacts must be an array");if(!Array.isArray(o))throw new TypeError("safety-intelligence: observations must be an array");let i=t.maxContacts??OC,s=t.maxObservations??Lo;if(!Number.isSafeInteger(i)||i<=0||i>Lo)throw new RangeError("safety-intelligence: invalid maxContacts");if(!Number.isSafeInteger(s)||s<=0||s>Lo)throw new RangeError("safety-intelligence: invalid maxObservations");if(r.length>i)throw new RangeError(`safety-intelligence: knownContacts exceeds ${i}`);if(o.length>s)throw new RangeError(`safety-intelligence: observations exceeds ${s}`);let a=r.map((p,m)=>eN(p,n.chain,m)).sort((p,m)=>p.target.key.localeCompare(m.target.key)||String(p.id||p.label||"").localeCompare(String(m.id||m.label||""))),c=o.map((p,m)=>tN(p,n.chain,m)).sort((p,m)=>Ct(p).localeCompare(Ct(m))),u=a.filter(p=>p.target.chain.key===n.chain.key),l=u.filter(p=>p.target.address===n.address),d=[],f=null;if(e.expectedContact!=null){if(typeof e.expectedContact=="string")f=Vt({chain:n.chain,address:e.expectedContact});else if(typeof e.expectedContact=="object"&&!Array.isArray(e.expectedContact))qe(e.expectedContact,new Set(["address","chain","chainId","family","network"]),"expectedContact"),f=Vt({address:e.expectedContact.address,chain:e.expectedContact.chain??(e.expectedContact.chainId!=null?{family:e.expectedContact.family??"evm",chainId:e.expectedContact.chainId}:e.expectedContact.family||e.expectedContact.network?{family:e.expectedContact.family,network:e.expectedContact.network}:n.chain)});else throw new TypeError("safety-intelligence: expectedContact must be an address or target object");f.key!==n.key&&d.push(Tt({code:"EXPECTED_CONTACT_MISMATCH",severity:"REVIEW",category:"address-poisoning",basis:"contact-match",message:"Destination does not exactly match the caller-supplied expected contact.",relatedTargets:[f.key,n.key]}))}if(l.length===0){let p=Number(e.lookalikeEdgeChars??4);if(!Number.isSafeInteger(p)||p<3||p>12)throw new RangeError("safety-intelligence: lookalikeEdgeChars must be 3..12");let m=x0(n);for(let y of u){let h=x0(y.target),w=nN(m,h),v=rN(m,h);w>=p&&v>=p&&m!==h&&d.push(Tt({code:"ADDRESS_LOOKALIKE",severity:"REVIEW",category:"address-poisoning",basis:"heuristic",message:`Destination shares at least ${p} leading and trailing characters with a different known contact.`,relatedTargets:[y.target.key,n.key]}))}if(e.dustThresholdBaseUnits!=null){let y=BigInt(Os(e.dustThresholdBaseUnits,"dustThresholdBaseUnits"));c.filter(w=>w.target.key===n.key&&w.direction==="inbound"&&BigInt(w.amountBaseUnits)<=y).length>0&&d.push(Tt({code:"PRIOR_DUST_CONTACT",severity:"REVIEW",category:"address-poisoning",basis:"heuristic",message:"Destination appeared as an inbound counterparty at or below the caller-supplied base-unit dust threshold.",relatedTargets:[n.key]}))}}return ye({target:n,exactKnownContact:l.length>0,exactContacts:l,findings:zu(d),dustThresholdBaseUnits:e.dustThresholdBaseUnits==null?null:Os(e.dustThresholdBaseUnits,"dustThresholdBaseUnits")})}function iN(e){let t=e??kC;if(!Array.isArray(t)||t.length===0||t.length>32)throw new TypeError("safety-intelligence: requiredChecks must be a non-empty bounded array");let n=t.map((o,i)=>{if(typeof o=="string")return{kind:Hu(o),source:null};if(!o||typeof o!="object"||Array.isArray(o))throw new TypeError(`safety-intelligence: requiredChecks[${i}] must be a kind or object`);return qe(o,new Set(["kind","source"]),"required check"),{kind:Hu(o.kind),source:zt(o.source,"required check source",120,{required:!0})}}),r=new Map(n.map(o=>[`${o.kind}:${o.source||"*"}`,o]));return ye([...r.values()].sort((o,i)=>`${o.kind}:${o.source||"*"}`.localeCompare(`${i.kind}:${i.source||"*"}`)))}function sN(e,t){return e.filter(n=>n.kind===t.kind&&(!t.source||n.source===t.source))}function aN(e){return e.some(t=>t.severity==="BLOCK")?"BLOCK":e.some(t=>t.severity==="REVIEW")?"REVIEW":e.some(t=>t.severity==="UNKNOWN")?"UNKNOWN":"CLEAR"}function O0(e){return Nt(e),`sha256:${Vu(Ct(e))}`}function Wu(e={},t={}){if(Nt({input:e,options:t}),!e||typeof e!="object"||Array.isArray(e))throw new TypeError("safety-intelligence: evaluation input object required");if(qe(e,new Set(["target","address","chain","chainId","family","network","evidence","requiredChecks","knownContacts","expectedContact","observations","dustThresholdBaseUnits","lookalikeEdgeChars"]),"evaluation input"),qe(t,new Set(["asOf","minClearConfidence","minBlockConfidence","maxEvidence","maxContacts","maxObservations"]),"evaluation option"),t.asOf==null)throw new TypeError("safety-intelligence: explicit asOf required for deterministic evaluation");let n=_s(t.asOf,"asOf").iso,r=e.target??{address:e.address,chain:e.chain,chainId:e.chainId,family:e.family,network:e.network},o=Vt(r),i=Number(t.minClearConfidence??.8),s=Number(t.minBlockConfidence??.8);for(let[h,w]of[["minClearConfidence",i],["minBlockConfidence",s]])if(!Number.isFinite(w)||w<0||w>1)throw new TypeError(`safety-intelligence: ${h} must be between 0 and 1`);let a=ZC(e.evidence??[],{target:o,asOf:n,maxEvidence:t.maxEvidence}),c=a.filter(h=>h.target===o.key),u=iN(e.requiredChecks),l=[];for(let h of c)h.freshness==="CURRENT"&&h.verdict==="BLOCK"?l.push(Tt({code:h.confidence>=s?"CURRENT_EXPLICIT_BLOCK":"LOW_CONFIDENCE_BLOCK_SIGNAL",severity:h.confidence>=s?"BLOCK":"REVIEW",category:h.kind,basis:"explicit-evidence",message:h.confidence>=s?"A current injected source returned an explicit BLOCK disposition.":"A current injected source returned BLOCK below the configured block-confidence threshold.",evidenceIds:[h.id]})):h.freshness==="CURRENT"&&h.verdict==="REVIEW"?l.push(Tt({code:"CURRENT_EXPLICIT_REVIEW",severity:"REVIEW",category:h.kind,basis:"explicit-evidence",message:"A current injected source returned an explicit REVIEW disposition.",evidenceIds:[h.id]})):h.freshness!=="CURRENT"&&["BLOCK","REVIEW"].includes(h.verdict)?l.push(Tt({code:h.freshness==="FUTURE"?"FUTURE_POSITIVE_EVIDENCE":"STALE_POSITIVE_EVIDENCE",severity:"REVIEW",category:h.kind,basis:"explicit-evidence",message:"Non-current injected adverse evidence requires human review; it is not treated as a current fact.",evidenceIds:[h.id]})):h.freshness==="CURRENT"&&h.verdict==="UNKNOWN"&&l.push(Tt({code:"SOURCE_UNKNOWN",severity:"UNKNOWN",category:h.kind,basis:"explicit-evidence",message:"A current injected source could not determine a disposition.",evidenceIds:[h.id]}));for(let h of u){let w=sN(c,h),v=w.filter(k=>k.freshness==="CURRENT"),T=v.filter(k=>k.verdict==="CLEAR"&&k.confidence>=i),S=v.filter(k=>k.verdict==="BLOCK");if(T.length>0&&S.length>0&&l.push(Tt({code:"CONTRADICTORY_EVIDENCE",severity:"REVIEW",category:h.kind,basis:"explicit-evidence",message:"Current injected sources conflict for a required check.",evidenceIds:[...T,...S].map(k=>k.id)})),T.length===0){let k=v.filter(b=>b.verdict==="CLEAR"),x=w.filter(b=>b.verdict==="CLEAR"&&b.freshness!=="CURRENT"),E=h.source?`${h.kind} from ${h.source}`:h.kind;l.push(Tt({code:k.length>0?"CLEAR_CONFIDENCE_TOO_LOW":x.length>0?"STALE_CLEAR_EVIDENCE":"MISSING_CURRENT_EVIDENCE",severity:"UNKNOWN",category:h.kind,basis:"coverage",message:`Required check ${E} lacks current explicit CLEAR evidence at the configured confidence threshold.`,evidenceIds:[...k,...x].map(b=>b.id)}))}}let d=oN({target:o,knownContacts:e.knownContacts??[],expectedContact:e.expectedContact,observations:e.observations??[],dustThresholdBaseUnits:e.dustThresholdBaseUnits,lookalikeEdgeChars:e.lookalikeEdgeChars},{maxContacts:t.maxContacts,maxObservations:t.maxObservations});l.push(...d.findings);let f=zu(l),p=aN(f);p==="CLEAR"&&(f=zu([Tt({code:"REQUIRED_EVIDENCE_CURRENT_CLEAR",severity:"INFO",category:"coverage",basis:"explicit-evidence",message:"Every required injected check supplied current explicit CLEAR evidence; this is source-scoped and not a safety guarantee.",evidenceIds:c.filter(h=>h.freshness==="CURRENT"&&h.verdict==="CLEAR").map(h=>h.id)})]),p="CLEAR");let m={version:E0,target:o.key,evaluatedAt:n,decision:p,gate:p==="CLEAR"?"CONTINUE":p==="BLOCK"?"BLOCK":"HOLD",requiredChecks:u,evidenceIds:c.map(h=>h.id).sort(),findings:f},y=ye({...m,hash:O0(m)});return ye({version:E0,target:o,evaluatedAt:n,status:p,evidence:a,requiredChecks:u,poisoning:d,policy:y})}function cN(e={}){if(Nt(e),!e||typeof e!="object"||Array.isArray(e))throw new TypeError("safety-intelligence: transaction object required");qe(e,new Set(["target","to","destination","address","chain","chainId","family","network","amountBaseUnits","valueBaseUnits"]),"transaction");let t=Vt(e.target??{address:e.to??e.destination??e.address,chain:e.chain,chainId:e.chainId,family:e.family,network:e.network}),n=e.amountBaseUnits??e.valueBaseUnits,r=n==null?null:Os(n,"transaction amountBaseUnits"),o={target:t,amountBaseUnits:r};return ye({id:`safety-transaction:${Vu(Ct(o))}`,...o})}function T0(e={},t={}){if(Nt({input:e,options:t}),!e||typeof e!="object"||Array.isArray(e))throw new TypeError("safety-intelligence: transaction evaluation input object required");qe(e,new Set(["transaction","evidence","requiredChecks","knownContacts","expectedContact","observations","dustThresholdBaseUnits","lookalikeEdgeChars"]),"transaction evaluation input");let n=cN(e.transaction),r=Wu({target:n.target,evidence:e.evidence??[],requiredChecks:e.requiredChecks,knownContacts:e.knownContacts??[],expectedContact:e.expectedContact,observations:e.observations??[],dustThresholdBaseUnits:e.dustThresholdBaseUnits,lookalikeEdgeChars:e.lookalikeEdgeChars},t),{hash:o,...i}=r.policy,s={...i,transactionId:n.id},a=ye({...s,hash:O0(s)});return ye({...r,transaction:n,policy:a})}var E0,tM,xC,kC,IC,_C,OC,Lo,TC,CC,NC,S0,RC,PC,LC,$C,qC,BC,UC,MC,DC,FC,jC,HC,A0,C0=_(()=>{E0=1,tM=Object.freeze({CLEAR:"CLEAR",UNKNOWN:"UNKNOWN",REVIEW:"REVIEW",BLOCK:"BLOCK"}),xC=Object.freeze(["sanctions","phishing","scam","address-poisoning"]),kC=Object.freeze(["sanctions","phishing","scam"]),IC=new Set(xC),_C=128,OC=256,Lo=512,TC=4096,CC=8,NC=2048,S0=366*24*60*60*1e3,RC=6e4,PC=SC(vC),LC=["privatekey","privkey","secretkey","secret","seedphrase","seed","mnemonic","passphrase","password","keystore","keymaterial","wif","xprv","xpriv","apikey","bearer","authorization","credential"],$C=/\b[5KL][1-9A-HJ-NP-Za-km-z]{50,51}\b/,qC=/\bxprv[0-9A-Za-z]{50,}\b/,BC=/^\s*(?:0x)?[0-9a-fA-F]{64}\s*$/,UC=new Set([12,15,18,21,24]),MC=/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d{3})?Z$/,DC=/^\d+$/,FC=String(Number.MAX_SAFE_INTEGER).length,jC=new Set(["txhash","transactionhash","recordid","hash","digest","evidenceid","sourcerecordid","blockhash","receipthash","commithash","payloadhash","sha256","sha256hex","id"]),HC=Object.freeze({CLEAR:"CLEAR",NO_MATCH:"CLEAR",NOT_LISTED:"CLEAR",ABSENT:"CLEAR",REVIEW:"REVIEW",SUSPECTED:"REVIEW",POSSIBLE_MATCH:"REVIEW",INCONCLUSIVE:"REVIEW",BLOCK:"BLOCK",MATCH:"BLOCK",LISTED:"BLOCK",MALICIOUS:"BLOCK",PHISHING:"BLOCK",SCAM:"BLOCK",UNKNOWN:"UNKNOWN",UNAVAILABLE:"UNKNOWN",ERROR:"UNKNOWN"}),A0=Object.freeze({BLOCK:0,REVIEW:1,UNKNOWN:2,INFO:3})});var rM,oM,iM,N0=_(()=>{rM=Object.freeze(["chainId","agentAddress","accountAddress","actions","targets","maxValueWei","maxGasWei","maxSlippageBps","expiresAt","nonce","revocationKey"]),oM=Object.freeze(["read","simulate"]),iM=1440*60});function R0(e){let t=String(e),n=t.toLowerCase().replace(/[\s._-]+/g,"");return uN.test(t)||lN.includes(n)}function Ln(e,t="$",n=new Set,r=""){if(e==null)return e;if(typeof e=="string"){let o=pN.includes(String(r).toLowerCase().replace(/[_-]/g,""));for(let{rule:i,re:s}of dN)if(!(o&&i.startsWith("raw-32-byte-hex"))&&s.test(e))throw new $o(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"&&R0(o))throw new $o(`${t}[${JSON.stringify(o)}]`,"forbidden-key-name");Ln(o,`${t}[key]`,n),Ln(i,`${t}[${String(o)}]`,n)}return e}if(e instanceof Set){let o=0;for(let i of e.values())Ln(i,`${t}[${o++}]`,n);return e}if(Array.isArray(e))return e.forEach((o,i)=>Ln(o,`${t}[${i}]`,n)),e;for(let[o,i]of Object.entries(e)){if(R0(o))throw new $o(`${t}.${o}`,"forbidden-key-name");Ln(i,`${t}.${o}`,n,o)}return e}var $o,uN,lN,dN,pN,P0=_(()=>{N0();$o=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}},uN=/(private[_-]?key|secret|bearer|keystore|mnemonic|seed[_-]?phrase|passphrase|password|api[_-]?key|access[_-]?token|auth[_-]?token|session[_-]?token|signer[_-]?url|signature)/i,lN=Object.freeze(["privkey","wif","xprv","seed"]);dN=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}]),pN=Object.freeze(["grantid","id","hash","sha256","sha256hex","checksum","txhash","transactionhash","blockhash","digest","userophash","commithash","prevhash","intenthash","canonicalhash","payloadhash","requestid"])});import{createHash as fN}from"node:crypto";function Ku(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(Ku).join(",")}]`:`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${Ku(e[t])}`).join(",")}}`}function mN(e){return e===void 0?null:JSON.parse(JSON.stringify(e))}function Ts(e){if(e&&typeof e=="object"&&!Object.isFrozen(e)){Object.freeze(e);for(let t of Object.values(e))Ts(t)}return e}function Yu(e,t="fact"){try{Ln(e,t)}catch{throw new Error(`${t} contains custody material and is forbidden`)}}function q0(e){return fN("sha256").update(Ku(e)).digest("hex")}function B0({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:mN(n)};return Ts({...s,hash:q0(s)})}function Cs({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");Yu(t,"intent");let r=B0({tradeId:e,state:"intent",fact:t,asOf:n,previousHash:null,external:!1});return Ts({tradeId:e,state:"intent",events:[r],headHash:r.hash,custody:"none",execution:"prepare-only"})}function U0(e,t,n,r={}){if(Xu(e),!(L0[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`);Yu(n,t);let i=r.external===!0||r.externallySupplied===!0;if($0.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=B0({tradeId:e.tradeId,state:t,fact:n,asOf:a,previousHash:s.hash,external:i});return Ts({...e,state:t,events:[...e.events,c],headHash:c.hash})}function Xu(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(q0(i)!==o)throw new Error(`trade event ${n} hash mismatch`);if(Yu(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&&!L0[t.state]?.includes(r.state))throw new Error(`invalid recorded transition ${t.state} -> ${r.state}`);if($0.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 Gu,L0,$0,Ju=_(()=>{P0();Gu=Object.freeze(["intent","quote_comparison","simulation","prepared","approval","signed","broadcast","settlement","balance_delta","position"]),L0=Object.freeze(Object.fromEntries(Gu.map((e,t)=>[e,Object.freeze(t+1<Gu.length?[Gu[t+1]]:[])]))),$0=new Set(["signed","broadcast"])});function M0(e){let t=String(e?.type??e?.surface??e?.kind??"").toLowerCase();return hN[t]??t}function yN(e,t){return String(e?.id??e?.signalId??e?.asset??e?.market??e?.pool??e?.collection??`${M0(e)}:${t}`)}function ot(e,t,n,r=!0){!r||n===null||!Number.isFinite(n)||e.push({feature:t,value:Ns(n)})}function gN(e,t){let n=ze(e.repeatBuys??e.repeat_buys??e.buyCount),r=ze(e.walletWinRate??e.winRate);ot(t,"repeat_buys",n===null?null:Te((n-1)/4)*.38),ot(t,"wallet_win_rate",r===null?null:(Te(r)-.5)*.5)}function bN(e,t){let n=ze(e.ageHours??e.poolAgeHours),r=ze(e.liquidityUsd??e.liquidity),o=e.liquidityLocked??e.locked;ot(t,"pool_age",n===null?null:n<24?-.42:Te(n/720)*.12),ot(t,"liquidity",r===null?null:(Te(Math.log10(Math.max(1,r))/7)-.5)*.28),ot(t,"liquidity_lock",o==null?null:o?.12:-.28)}function wN(e,t){let n=ze(e.floorChange??e.floorChangePct),r=ze(e.sales??e.saleCount);ot(t,"floor_change",n===null?null:Te(n,-1,1)*.35),ot(t,"sales_depth",r===null?null:Te(r/50)*.18)}function EN(e,t){let n=ze(e.flowImbalance??e.imbalance),r=ze(e.fundingRate??e.funding);ot(t,"flow_imbalance",n===null?null:Te(n,-1,1)*.42),ot(t,"funding",r===null?null:-Te(r*100,-1,1)*.12)}function SN(e,t){let n=ze(e.marketProbability??e.marketPrice??e.probability),r=ze(e.fairProbability??e.referenceProbability??e.fairValue);ot(t,"probability_mispricing",n===null||r===null?null:Te(r-n,-1,1)*.65);let o=ze(e.liquidityUsd??e.liquidity);ot(t,"market_liquidity",o===null?null:Te(Math.log10(Math.max(1,o))/6)*.12)}function vN(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=>ze(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 Rs(e=[],t=[],n={}){if(!Array.isArray(e)||!Array.isArray(t))throw new TypeError("events and markouts must be arrays");let r=Te(ze(n.minimumCoverage)??.5);return e.map((o,i)=>{let s=M0(o),a=yN(o,i),c=AN[s],u=[];c&&c(o,u);let l=s==="wallet"?2:s==="pool"?3:2,d=Ns(Te(u.length/l)),f=u.reduce((T,S)=>T+S.value,0),p=vN(o,a,t),m=p===null?0:Te(p,-1,1)*.35;p!==null&&ot(u,"shadow_markout",m);let y=Ns(Te(.5+f+m)),h=p===null?.8:Te(.85+p*.3,.35,1),w=Ns(Te(d*h)),v=["COLD_INTELLIGENCE_ONLY","NO_HOT_EXECUTION"];return c||v.push("UNSUPPORTED_SIGNAL_TYPE"),d<r&&v.push("LOW_COVERAGE","NO_TRADE"),w<.5&&v.push("LOW_CONFIDENCE","NO_TRADE"),s==="pool"&&(ze(o.ageHours??o.poolAgeHours)??1/0)<24&&v.push("NEW_POOL_RISK","NO_TRADE"),p!==null&&p<0&&v.push("NEGATIVE_MARKOUT"),{id:a,type:s,score:y,confidence:w,coverage:d,contributions:u,flags:[...new Set(v)],noTrade:v.includes("NO_TRADE"),executionAllowed:!1}}).sort((o,i)=>i.score-o.score||i.confidence-o.confidence||o.id.localeCompare(i.id))}var bM,hN,Te,ze,Ns,AN,Qu=_(()=>{bM=Object.freeze(["wallet","pool","nft_floor","hl_flow","prediction_market"]),hN=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"}),Te=(e,t=0,n=1)=>Math.min(n,Math.max(t,e)),ze=e=>Number.isFinite(Number(e))?Number(e):null,Ns=e=>Math.round(e*1e4)/1e4;AN=Object.freeze({wallet:gN,pool:bN,nft_floor:wN,hl_flow:EN,prediction_market:SN})});function xN(e=[],t=[],n={}){let r=Rs(e,t,n),o=r.filter(a=>a&&a.noTrade!==!0&&a.executionAllowed===!1),i=r.filter(a=>a?.noTrade===!0),s=o.filter(a=>(a.confidence??0)>=(n.promoteMinConfidence??.55)&&(a.score??0)>=(n.promoteMinScore??.55));return{scored:r,candidates:s,blocked:i}}function kN(e,t={}){if(!e||typeof e!="object")throw new TypeError("signal required");if(e.noTrade===!0)throw new Error("NO_TRADE signal cannot open a trade lifecycle");if(e.executionAllowed===!0)throw new Error("executionAllowed must be false on public plane");let n=String(t.tradeId||`sig-${e.id||"unknown"}`).slice(0,128),r={source:"signal_score",signalId:e.id,signalType:e.type,score:e.score,confidence:e.confidence,flags:e.flags||[],promote:"research_only",execution:"prepare-only",custody:"none",note:"Cold signal \u2192 prepare intent only. Owner wallet must sign any later tx.",...t.intentExtra&&typeof t.intentExtra=="object"?t.intentExtra:{}},o=Cs({tradeId:n,intent:r,asOf:t.asOf??Date.now()});return{tradeId:n,intent:r,lifecycle:o,recommendation:"PREPARE_RESEARCH_ONLY"}}function D0(e=[],t=[],n={}){let{scored:r,candidates:o,blocked:i}=xN(e,t,n),s=Math.min(Math.max(Number(n.limit)||3,0),20),a=[];for(let c of o.slice(0,s))try{a.push(kN(c,{asOf:n.asOf,tradeId:n.tradeIdPrefix?`${n.tradeIdPrefix}-${c.id}`:void 0,intentExtra:n.intentExtra}))}catch{}return{ok:!0,cold:!0,executionAllowed:!1,scoredCount:r.length,blockedCount:i.length,intentCount:a.length,intents:a,blocked:i.slice(0,20)}}var F0=_(()=>{Qu();Ju()});function j0(e){let t=_N[Number(e)]||[];return new Set([...t,...IN].map(n=>String(n).trim().toLowerCase()).filter(Boolean))}var IN,_N,H0=_(()=>{IN=["0x000000000022d473030f116ddee9f6b43ac78ba3"],_N={4663:["0xcaf681a66d020601342297493863e78c959e5cb2","0x33e885ed0ec9bf04ecfb19341582aadcb4c8a9e7","0x1f7d7550b1b028f7571e69a784071f0205fd2efa","0x0bd7d308f8e1639fab988df18a8011f41eacad73","0x5fc5360d0400a0fd4f2af552add042d716f1d168","0xb477751b76cf82d00a686a1232f5fcd772414af3","0xff5cb29241f002ffed2eaa224e3e996d24a6e8d1"],8453:["0x2626664c2603336e57b271c5c0b26f421741e481","0x6ff5693b99212da76ad316178a184ab56d299b43","0x3d4e44eb1374240ce5f1b871ab261cd16335b76a","0x33128a8fc17869897dce68ed026d694621f6fdfd","0x4200000000000000000000000000000000000006","0x833589fcd6edb6e08f4c7c32d4f71b54bda02913","0xbe6d8f0d05cc4be24d5167a3ef062215be6d18a5","0x254cf9e1e6e233aa1ac962cb9b05b2cfeaae15b0","0x5e7bb104d84c7cb9b682aac2f3d509f5f406809a","0x1231deb6f5749ef6ce6943a275a1d3e7486f4eae","0x888888888889758f76e7103c6cbf23abbf58f946","0x3f170631ed9821ca51a59d996ab095162438dc10","0x4f37a9d177470499a2dd084621020b023fcffc1f","0xc92e8bdf79f0507f65a392b0ab4667716bfe0110"],42161:["0x68b3465833fb72a70ecdf485e0e4c7bd8665fc45","0x61ffe014ba17989e743c5f6cb21bf9697530b21e","0x82af49447d8a07e3bd95bd0d56f35241523fbab1","0xaf88d065e77c8cc2239327c5edb3a432268e5831","0x1231deb6f5749ef6ce6943a275a1d3e7486f4eae","0xfd086bc7cd5c481dcc9c85ebe478a1c0b69fcbb9","0x888888888889758f76e7103c6cbf23abbf58f946","0xeaedc32a51c510d35ebc11088fd5ff2b47aacf2e","0x2191718cd32d02b8e60badffea33e4b5dd9a0a0d","0xc92e8bdf79f0507f65a392b0ab4667716bfe0110","0x1c3fa76e6e1088bce750f23a5bfcffa1efef6a41","0x7452c558d45f8afc8c83dae62c3f8a5be19c71f6"],1:["0x68b3465833fb72a70ecdf485e0e4c7bd8665fc45","0x1231deb6f5749ef6ce6943a275a1d3e7486f4eae","0x4cd00e387622c35bddb9b4c962c136462338bc31","0x6a000f20005980200259b80c5102003040001068","0xae563e3f8219521950555f5962419c8919758ea2","0x45312ea0eff7e09c83cbe249fa1d7598c4c8cd4e","0xc92e8bdf79f0507f65a392b0ab4667716bfe0110"],137:["0x1231deb6f5749ef6ce6943a275a1d3e7486f4eae","0x0dcded3545d565ba3b19e683431381007245d983"],10:["0x1231deb6f5749ef6ce6943a275a1d3e7486f4eae","0xe2fa4e1d17725e72dcdafe943ecf45df4b9e285b","0x0dcded3545d565ba3b19e683431381007245d983"],56:["0x1231deb6f5749ef6ce6943a275a1d3e7486f4eae","0xa72c85c258a81761433b4e8da60505fe3dd551cc"],43114:["0x1231deb6f5749ef6ce6943a275a1d3e7486f4eae","0xf39ca6ede9bf7820a952b52f3c94af526bab9015","0x0dcded3545d565ba3b19e683431381007245d983","0x8f550e53dfe96c055d5bdb267c21f268fcaf63b2","0x820f5ffc5b525cd4d88cd91acf2c28f16530cc68"],999:["0x0a0758d937d1059c356d4714e57f5df0239bce1a","0xd2002373543ce3527023c75e7518c274a51ce712"],2741:["0x4f8c9056bb8a3616693a76922fa35d53c056e5b3"],988:["0x026f252016a7c47cdef1f05a3fc9e20c92a49c37","0xff5cb29241f002ffed2eaa224e3e996d24a6e8d1","0x817997ca8394e26cce3de3a076a4889b27dbf9de","0x3dea4be5615974f31624404ef288ba3b36dfeb83","0xeaf7ac0fdf150cdd89340fb762d83848de6a7b83","0x779ded0c9e1022225f8e0630b35a9b54be713736","0xbc6f7725f08232c151b528bdfcaaf89993ca86ee"]}});function Ps(e,t={}){e&&e.passes.push({ok:!0,kind:t.kind||"gather",name:t.name||null})}function Zu(e){e&&(e.prepareAttempted=!0)}function el(e,t={}){e&&(e.prepareAttempted=!0,e.prepareFailed=!0,e.passes.push({ok:!1,kind:"prepare",name:t.name||null,error:t.error||"prepare hard-safety failed"}))}function NN(e,t=process.env){let n=t&&typeof t=="object"?t:process.env,r=String(n.ORACLE_DEST_ALLOWLIST||n.MAD_DEST_ALLOWLIST||"").split(",").map(s=>s.trim().toLowerCase()).filter(Boolean),o=Number(e),i=Number.isInteger(o)&&o>0?[...j0(o)]:[];return new Set([...r,...i])}function RN(e){return!e||typeof e!="object"?!1:!!(e.slippageGuard||e.slippageBps!=null||e.slippage!=null||e.tokenIn||e.tokenOut||e.amountIn!=null||e.amountOut!=null)}function PN(e){return!e||typeof e!="object"?!1:!!(e.transaction||e.tx||e.to||e.destination||e.settlement||e.data||e.value!=null)}function LN(e={}){let t=e.transaction&&typeof e.transaction=="object"?e.transaction:e.tx&&typeof e.tx=="object"?e.tx:e;return{to:t.to||e.to||e.destination||e.settlement||null,chainId:t.chainId??e.chainId??e.chain??null,data:t.data||e.data||null,value:t.value??e.value??null}}function $N(e){let t=e.slippageGuard||e.madSlippage;return t&&t.selectedBps!=null?Number(t.selectedBps):t&&t.capBps!=null&&e.slippageBps==null?Number(t.capBps):e.slippageBps!=null?Number(e.slippageBps):e.slippage&&typeof e.slippage=="object"&&e.slippage.bps!=null?Number(e.slippage.bps):null}function qN(e,t={}){let n=[],r={unsigned:!1,destination:"n/a",slippage:"n/a"};if(!e||typeof e!="object"||Array.isArray(e))return{ok:!1,checks:r,errors:["prepared fact must be an object"]};e.signed===!0&&n.push("prepared fact is signed"),e.broadcast===!0&&n.push("prepared fact claims broadcast");for(let o of ON)e[o]&&n.push(`prepared fact carries ${o}`);for(let o of TN)e[o]&&n.push(`prepared fact claims executed ${o}`);if(r.unsigned=n.length===0,PN(e)){let o=LN(e),i=o.to==null?"":String(o.to).trim();if(!i)n.push("prepared transaction is missing destination"),r.destination="missing";else{let s=CN.test(i);if(i.startsWith("0x")&&!s)n.push("prepared destination is not a 20-byte address"),r.destination="malformed";else{let a=NN(o.chainId,t.env),c=i.toLowerCase(),u=!!(e.routeAttestation||e.madRoute||e.vaultGuard||e.madVault);a.size>0&&s&&!a.has(c)&&!u?(n.push(`destination ${c} not allowlisted`),r.destination="blocked"):r.destination=a.size===0?"unset":"allowlisted"}}}if(RN(e)){let o=$N(e),i=e.slippageGuard?.capBps!=null?Number(e.slippageGuard.capBps):Lt;!Number.isInteger(o)||o<0?(n.push("swap prepare is missing integer slippage bps"),r.slippage="missing"):o>Lt||Number.isInteger(i)&&o>i||Number.isInteger(i)&&i>Lt?(n.push(`slippage ${o} exceeds cap ${Math.min(i,Lt)}`),r.slippage="blocked"):r.slippage="ok"}return{ok:n.length===0,checks:r,errors:n}}function tl(e,t){let n=[];e?.execution!=="prepare-only"&&n.push("lifecycle execution must be prepare-only"),e?.custody!=="none"&&n.push("lifecycle custody must be none");let r=qN(t);return{ok:n.length===0&&r.ok,checks:r.checks,errors:[...n,...r.errors]}}var ON,TN,CN,z0=_(()=>{H0();at();ON=Object.freeze(["signature","signedTx","signedTransaction","rawTransaction","signedPayload","signedRaw"]),TN=Object.freeze(["txid","txHash","transactionHash","broadcastHash"]),CN=/^0x[a-fA-F0-9]{40}$/});var W0={};z(W0,{DESK_TOOLS:()=>UN,runDeskTool:()=>DN});function MN(e){if(!e||typeof e!="object"||Array.isArray(e))throw new TypeError("tool arguments must be an object");if(Buffer.byteLength(JSON.stringify(e),"utf8")>BN)throw new TypeError("tool arguments exceed size limit")}function Be(e,t,n=[]){for(let o of t)if(!(o in e))throw new TypeError(`${o} is required`);let r=new Set([...t,...n]);for(let o of Object.keys(e))if(!r.has(o))throw new TypeError(`unexpected argument: ${o}`)}async function DN(e,t,n={}){if(MN(t),e==="research_artifact"){if(Be(t,["sourceUrl","fetchedAt","snapshot","claim","confidence"],["contradictions"]),String(t.snapshot).length>V0)throw new TypeError("snapshot exceeds size limit");return{ok:!0,artifact:(n.createResearchArtifact||Mg)(t)}}if(e==="portfolio_analyze")return Be(t,["ledger","asOf"],["priceTtlMs"]),{ok:!0,analysis:(n.summarizePortfolioLedger||Gg)(t.ledger,{asOf:t.asOf,priceTtlMs:t.priceTtlMs})};if(e==="tax_lots")return Be(t,["input"],["method","asOf"]),{ok:!0,records:(n.createCostBasisRecords||e0)(t.input,{method:t.method,asOf:t.asOf})};if(e==="position_health"){Be(t,["action","input","asOf"],["thresholds"]);let r={asOf:t.asOf,thresholds:t.thresholds};if(t.action==="evaluate")return{ok:!0,analysis:(n.evaluatePositionHealth||Fu)(t.input,r)};if(t.action==="book")return{ok:!0,analysis:(n.evaluatePositionBook||h0)(t.input,r)};throw new TypeError("unknown position health action")}if(e==="governance_prepare")return Be(t,["input","asOf"]),{ok:!0,preview:(n.previewGovernanceAction||g0)(t.input,{asOf:t.asOf}),prepared:!1};if(e==="safety_intelligence"){Be(t,["action","input","asOf"],["minClearConfidence","minBlockConfidence"]);let r={asOf:t.asOf,minClearConfidence:t.minClearConfidence,minBlockConfidence:t.minBlockConfidence};if(t.action==="address")return{ok:!0,analysis:(n.evaluateAddressSafety||Wu)(t.input,r)};if(t.action==="transaction")return{ok:!0,analysis:(n.evaluateTransactionSafety||T0)(t.input,r)};throw new TypeError("unknown safety intelligence action")}if(e==="portfolio_risk")return Be(t,["input"]),{ok:!0,analysis:(n.summarizePortfolioRisk||Ss)(t.input)};if(e==="trade_lifecycle"){let r=n.createTradeLifecycle||Cs,o=n.advanceTradeLifecycle||U0,i=n.assertTradeLifecycle||Xu;if(t.action==="create")return Be(t,["action","tradeId","intent"],["asOf"]),{ok:!0,lifecycle:r({tradeId:t.tradeId,intent:t.intent,asOf:t.asOf})};if(t.action==="verify"){if(Be(t,["action","lifecycle"]),i(t.lifecycle),t.lifecycle.state==="prepared"){Zu(n.loopVerifier);let s=t.lifecycle.events?.findLast?.(c=>c.state==="prepared")||t.lifecycle.events?.filter(c=>c.state==="prepared").at(-1),a=tl(t.lifecycle,s?.fact||{});if(!a.ok)return el(n.loopVerifier,{name:"trade_lifecycle",error:a.errors[0]}),{ok:!1,error:`prepare verifier failed: ${a.errors[0]}`,checks:a.checks};Ps(n.loopVerifier,{kind:"prepare",name:"trade_lifecycle"})}else Ps(n.loopVerifier,{kind:"lifecycle",name:"trade_lifecycle"});return{ok:!0,valid:!0,lifecycle:t.lifecycle}}if(t.action==="advance"){if(Be(t,["action","lifecycle","state","fact"],["asOf"]),t.state==="signed"||t.state==="broadcast")throw new TypeError(`${t.state} facts are not accepted by the agent tool`);if(t.state==="prepared"){Zu(n.loopVerifier);let a=tl(t.lifecycle,t.fact);if(!a.ok)return el(n.loopVerifier,{name:"trade_lifecycle",error:a.errors[0]}),{ok:!1,error:`prepare verifier failed: ${a.errors[0]}`,checks:a.checks}}let s=o(t.lifecycle,t.state,t.fact,{asOf:t.asOf});return t.state==="prepared"&&Ps(n.loopVerifier,{kind:"prepare",name:"trade_lifecycle"}),{ok:!0,lifecycle:s}}throw new TypeError("unknown trade lifecycle action")}if(e==="signal_score"){if(Be(t,["events"],["markouts","openIntents","limit"]),!Array.isArray(t.events))throw new TypeError("events must be an array");let r=Array.isArray(t.markouts)?t.markouts:[];if(t.openIntents===!0)return(n.signalsToPrepareIntents||D0)(t.events,r,{limit:t.limit});let i=(n.scoreSignals||Rs)(t.events,r);return{ok:!0,cold:!0,executionAllowed:!1,scored:i,noTradeCount:i.filter(s=>s.noTrade).length}}if(e==="workspace_artifact"){let r=n.openArtifactStore||Lg,o=!n.artifactStore,i=n.artifactStore||await r(n.artifactStoreOptions||{});try{if(t.action==="get")return Be(t,["action","id"]),{ok:!0,artifact:await i.getArtifact(t.id)};if(t.action==="list")return Be(t,["action"],["type"]),{ok:!0,artifacts:await i.listArtifacts(t.type)};if(t.action==="put")return Be(t,["action","id","type","data","createdAt"]),{ok:!0,artifact:await i.putArtifact(t)};if(t.action==="link")return Be(t,["action","parentId","childId"]),{ok:!0,link:await i.link(t.parentId,t.childId)};throw new TypeError("unknown workspace artifact action")}finally{o&&typeof i?.close=="function"&&await i.close()}}return{ok:!1,error:`unknown desk tool: ${e}`}}var BN,V0,Ls,et,Rt,UN,G0=_(()=>{$g();Dg();Kg();qu();t0();y0();b0();C0();Ju();Qu();F0();z0();BN=128*1024,V0=5e4,Ls={type:"string",minLength:1,maxLength:256},et={type:"object",additionalProperties:!0},Rt=(e,t,n)=>Object.freeze({type:"function",function:Object.freeze({name:e,description:t,strict:!0,parameters:n})}),UN=Object.freeze([Rt("workspace_artifact","Get, list, put, or link deterministic workspace artifacts. No arbitrary paths or SQL.",{type:"object",properties:{action:{type:"string",enum:["get","list","put","link"]},id:Ls,type:{type:"string",enum:["project","entity","source","thesis","strategy","simulation","prepared_action","receipt","position"]},createdAt:{type:"string",minLength:1,maxLength:64},data:et,parentId:Ls,childId:Ls},required:["action"],additionalProperties:!1}),Rt("research_artifact","Create a deterministic, citation-bearing research artifact. fetchedAt must be supplied by the caller.",{type:"object",properties:{sourceUrl:{type:"string",minLength:1,maxLength:4096},fetchedAt:{type:"string",minLength:1,maxLength:64},snapshot:{type:"string",minLength:1,maxLength:V0},claim:{type:"string",minLength:1,maxLength:1e4},confidence:{type:"number",minimum:0,maximum:1},contradictions:{type:"array",maxItems:50,items:{type:"string",maxLength:2e3}}},required:["sourceUrl","fetchedAt","snapshot","claim","confidence"],additionalProperties:!1}),Rt("portfolio_analyze","Deterministically summarize a caller-supplied portfolio ledger; performs no network or account access.",{type:"object",properties:{ledger:et,asOf:{type:"number"},priceTtlMs:{type:"number",minimum:0}},required:["ledger","asOf"],additionalProperties:!1}),Rt("tax_lots","Build exact-integer cost-basis records from caller-supplied events. Accounting records only, not tax advice.",{type:"object",properties:{input:et,method:{type:"string",enum:["fifo","lifo","hifo","specific"]},asOf:{type:"string",minLength:1}},required:["input"],additionalProperties:!1}),Rt("position_health","Evaluate caller-supplied lending or farming snapshots. Alert-only, with no network access or execution signal.",{type:"object",properties:{action:{type:"string",enum:["evaluate","book"]},input:et,asOf:{type:"string",minLength:1},thresholds:et},required:["action","input","asOf"],additionalProperties:!1}),Rt("governance_prepare","Create a deterministic semantic preview of a caller-supplied governance intent. No adapter, calldata, vote, signature, or broadcast.",{type:"object",properties:{input:et,asOf:{type:"string",minLength:1}},required:["input","asOf"],additionalProperties:!1}),Rt("safety_intelligence","Evaluate caller-supplied address or transaction safety evidence. No source is contacted and unknown evidence fails closed.",{type:"object",properties:{action:{type:"string",enum:["address","transaction"]},input:et,asOf:{type:"string",minLength:1},minClearConfidence:{type:"number",minimum:0,maximum:1},minBlockConfidence:{type:"number",minimum:0,maximum:1}},required:["action","input","asOf"],additionalProperties:!1}),Rt("portfolio_risk","Summarize concentration and coverage from caller-supplied portfolio snapshots. No network or account access.",{type:"object",properties:{input:et},required:["input"],additionalProperties:!1}),Rt("trade_lifecycle","Create, verify, or advance a prepare-only trade fact chain. A request is not a record: observed status is NONE until create returns an explicit INTENT event. Proposed next work never advances current state. Signing and broadcasting are never performed.",{type:"object",properties:{action:{type:"string",enum:["create","verify","advance"]},tradeId:Ls,intent:et,lifecycle:et,state:{type:"string",enum:["quote_comparison","simulation","prepared","approval","settlement","balance_delta","position"]},fact:et,asOf:{type:"number"}},required:["action"],additionalProperties:!1}),Rt("signal_score","Cold-score onchain signal events (wallet/pool/nft/hl/prediction). Never fetches or executes. NO_TRADE flags block promotion.",{type:"object",properties:{events:{type:"array",maxItems:100,items:et},markouts:{type:"array",maxItems:100,items:et},openIntents:{type:"boolean",description:"If true, open prepare-only trade lifecycles for top promotable signals"},limit:{type:"number",minimum:0,maximum:20}},required:["events"],additionalProperties:!1})])});var K0={};z(K0,{deployGloballyEnabled:()=>jN,executeGloballyEnabled:()=>FN,mevExecuteEnabled:()=>HN});function FN(){return qo("ORACLE_EXECUTE_ENABLED","MAD_EXECUTE_ENABLED",!1)}function jN(){return qo("ORACLE_DEPLOY_ENABLED","MAD_DEPLOY_ENABLED",!1)}function HN(){return qo("ORACLE_MEV_EXECUTE_ENABLED",null,!1)}var Y0=_(()=>{Bo()});Bo();import X0 from"node:fs";import nl from"node:process";import{fileURLToPath as zN}from"node:url";import{createInterface as db}from"node:readline";var bt=Object.freeze({maxRequestBytes:256*1024,maxResponseBytes:2*1024*1024,maxTools:256,maxToolNameLength:64,maxArgumentBytes:128*1024,defaultCallTimeoutMs:3e4,maxCallTimeoutMs:6e4,maxConcurrentCalls:32}),pb=/^[A-Za-z0-9_-]{1,64}$/;function Uo(e,t){return{jsonrpc:"2.0",id:e??null,result:t}}function ve(e,t,n){return{jsonrpc:"2.0",id:e??null,error:{code:t,message:n}}}function fb(e){return!!(e&&typeof e=="object"&&!Array.isArray(e)&&e.jsonrpc==="2.0"&&typeof e.method=="string"&&e.method.length>0)}function mb(e){if(!Array.isArray(e))return[];let t=[],n=new Set;for(let r of e){if(t.length>=bt.maxTools)break;if(!r||typeof r!="object"||Array.isArray(r))continue;let o=typeof r.name=="string"?r.name.trim():"";if(!pb.test(o)||n.has(o))continue;n.add(o);let i=r.inputSchema&&typeof r.inputSchema=="object"&&!Array.isArray(r.inputSchema)?{...r.inputSchema}:{type:"object",properties:{},additionalProperties:!1};i.type==="object"&&i.additionalProperties===void 0&&(i.additionalProperties=!1),t.push({...r,name:o,inputSchema:i})}return t}function hb(e){let t=Number(e)||bt.defaultCallTimeoutMs;return Math.min(Math.max(t,1),bt.maxCallTimeoutMs)}async function yb(e,t,n){let r;try{return await Promise.race([e,new Promise((o,i)=>{r=setTimeout(()=>{let s=new Error("tool call timed out");s.code="ORACLE_MCP_TIMEOUT",i(s);try{n?.()}catch{}},t)})])}finally{clearTimeout(r)}}function gb(e){return e===null?"null":Array.isArray(e)?"array":Number.isInteger(e)?"integer":typeof e}function Ir(e,t,n="arguments",r=0){if(!t||typeof t!="object"||Array.isArray(t))return null;if(r>12)return`${n} exceeded the nesting limit`;if(Array.isArray(t.oneOf)&&t.oneOf.length&&!t.oneOf.some(i=>Ir(e,i,n,r+1)===null))return`${n} did not match an allowed shape`;if(Array.isArray(t.anyOf)&&t.anyOf.length&&!t.anyOf.some(i=>Ir(e,i,n,r+1)===null))return`${n} did not match a required alternative`;if(Array.isArray(t.enum)&&!t.enum.some(o=>Object.is(o,e)))return`${n} must be one of the allowed values`;if(Object.hasOwn(t,"const")&&!Object.is(t.const,e))return`${n} must equal the required constant`;if(t.type){let o=gb(e);if(!(t.type==="number"?typeof e=="number"&&Number.isFinite(e):t.type==="integer"?Number.isSafeInteger(e):o===t.type))return`${n} must be ${t.type}`}if(typeof e=="string"){let o=Math.min(Number.isSafeInteger(t.maxLength)?t.maxLength:16384,16384);if(e.length>o)return`${n} exceeded the string limit`;if(Number.isSafeInteger(t.minLength)&&e.length<t.minLength)return`${n} is too short`}if(Array.isArray(e)){let o=Math.min(Number.isSafeInteger(t.maxItems)?t.maxItems:1e3,1e3);if(e.length>o)return`${n} exceeded the array limit`;if(Number.isSafeInteger(t.minItems)&&e.length<t.minItems)return`${n} has too few items`;if(t.items)for(let i=0;i<e.length;i+=1){let s=Ir(e[i],t.items,`${n}[${i}]`,r+1);if(s)return s}}if(e&&typeof e=="object"&&!Array.isArray(e)){let o=Object.keys(e);if(o.length>256)return`${n} exceeded the property limit`;let i=t.properties&&typeof t.properties=="object"?t.properties:{};for(let s of Array.isArray(t.required)?t.required:[])if(!Object.hasOwn(e,s))return`${n}.${s} is required`;if(t.additionalProperties===!1){let s=o.find(a=>!Object.hasOwn(i,a));if(s)return`${n}.${s} is not allowed`}for(let s of o){if(!Object.hasOwn(i,s))continue;let a=Ir(e[s],i[s],`${n}.${s}`,r+1);if(a)return a}}return null}function Mo(e,t={}){let n=mb(e?.tools),r=new Set(n.map(u=>u.name)),o=new Map(n.map(u=>[u.name,u])),i=typeof e?.name=="string"&&e.name?e.name.slice(0,80):"oracle-mcp",s=typeof e?.version=="string"&&e.version?e.version.slice(0,40):"1",a=hb(t.callTimeoutMs),c=!1;return async function(l){let d=l?.id??null;if(!fb(l))return ve(d,-32600,"invalid request");if(l.method==="initialize")return c=!0,Uo(d,{protocolVersion:l.params?.protocolVersion??"2025-03-26",capabilities:{tools:{}},serverInfo:{name:i,version:s}});if(l.method==="notifications/initialized")return null;if(l.method==="ping")return Uo(d,{});if(!c)return ve(d,-32002,"server not initialized");if(l.method==="tools/list")return Uo(d,{tools:n});if(l.method==="tools/call"){let f=l.params?.name,p=l.params?.arguments??{};if(typeof f!="string"||!r.has(f))return ve(d,-32602,"unknown tool");if(!p||typeof p!="object"||Array.isArray(p))return ve(d,-32602,"tool arguments must be an object");let m;try{m=JSON.stringify(p)}catch{return ve(d,-32602,"tool arguments are not serializable")}if(Buffer.byteLength(m)>bt.maxArgumentBytes)return ve(d,-32602,"tool arguments exceeded the size limit");let y=Ir(p,o.get(f)?.inputSchema);if(y)return ve(d,-32602,y);try{let h=new AbortController,w=await yb(Promise.resolve(e.call(f,p,{signal:h.signal})),a,()=>h.abort(new Error("tool call timed out")));return Uo(d,w)}catch(h){if(h?.code==="ORACLE_MCP_TIMEOUT")return ve(d,-32001,"tool call timed out");let w=typeof h?.message=="string"?h.message.replace(/\s+/g," ").trim():"",v=/\b(requires?|must be|missing|unknown|invalid|expected|unsupported|out of range|too (?:large|small|long|many)|not a|cannot convert)\b/i.test(w),T=/https?:\/\/|[/~][\w.-]+\/|0x[0-9a-fA-F]{8,}|[A-Za-z0-9+/_-]{24,}={0,2}|\b(?:secret|apikey|api[-_ ]key|private[-_ ]?key|token|password|credential|seed|mnemonic)s?\b/i.test(w.replace(/\btoken(?:In|Out|s\b)/g,"asset"));return v&&!T&&w.length<=200?ve(d,-32e3,`tool call failed: ${w}`):ve(d,-32e3,"tool call failed")}}return ve(d,-32601,"method not found")}}function Hs(e,t={}){let n=t.input||process.stdin,r=t.output||process.stdout,o=Math.min(Math.max(Number(t.maxRequestBytes)||bt.maxRequestBytes,64),bt.maxRequestBytes),i=Math.min(Math.max(Number(t.maxResponseBytes)||bt.maxResponseBytes,256),bt.maxResponseBytes),s=Math.min(Math.max(Number(t.maxConcurrentCalls)||bt.maxConcurrentCalls,1),bt.maxConcurrentCalls),a=s*8,c=Mo(e,t),u={closed:!1,inflight:0},l=db({input:n,terminal:!1,crlfDelay:1/0}),d=0,f=[],p=!1,m=!1;function y(){if(u.closed||u.readerClosed)return;let S=u.inflight>=s||f.length>0||m;S&&!p?(p=!0,l.pause(),typeof n.pause=="function"&&n.pause()):!S&&p&&(p=!1,typeof n.resume=="function"&&n.resume(),l.resume())}function h(S){if(!S||u.closed)return;let k=JSON.stringify(S);Buffer.byteLength(k)>i&&(k=JSON.stringify(ve(S.id,-32003,"response exceeded the size limit"))),r.write(`${k}
24
- `)===!1&&!m&&(m=!0,y(),r.once("drain",()=>{m=!1,v()}))}function w(S){u.inflight+=1,y(),Promise.resolve(c(S)).then(h).catch(()=>h(ve(S?.id,-32603,"internal error"))).finally(()=>{u.inflight-=1,v()})}function v(){for(;!u.closed&&!m&&u.inflight<s&&f.length>0;)w(f.shift());y()}function T(){u.closed||(h(ve(null,-32700,"request exceeded the size limit")),u.closed=!0,l.close(),typeof n.destroy=="function"&&n.destroy())}return n.on("data",S=>{if(u.closed)return;let k=String(S).split(`
25
- `);for(let x=0;x<k.length;x+=1){if(d+=Buffer.byteLength(k[x]),d>o){T();return}x<k.length-1&&(d=0)}}),l.on("line",S=>{if(u.closed)return;if(Buffer.byteLength(S)>o){T();return}let k;try{k=JSON.parse(S)}catch{h(ve(null,-32700,"parse error"));return}if(f.length>=a){h(ve(k?.id,-32e3,"server busy"));return}f.push(k),v()}),l.on("close",()=>{u.readerClosed=!0,t.exitOnClose!==!1&&(process.exitCode=0)}),u}var pl=Object.freeze({swap:{title:"SWAP",accent:"#7CC4FF"},bridge:{title:"BRIDGE",accent:"#7CC4FF"},quote:{title:"QUOTE",accent:"#7CC4FF"},portfolio:{title:"PORTFOLIO",accent:"#7CC4FF"},nft:{title:"NFT",accent:"#7CC4FF"},generic:{title:"ORACLE",accent:"#7CC4FF"}}),bb=Object.freeze({best_swap_route:"swap",prepare_best_route:"swap",dex_quote:"swap",jupiter_quote:"swap",lifi_quote:"bridge",best_bridge_route:"bridge",bridge_aggregator_scan:"bridge",prepare_best_bridge_route:"bridge",rfq_quote:"quote",equity_quote:"quote",twap_simulate:"quote",portfolio_balance:"portfolio",portfolio_snapshot:"portfolio",wallet_balances:"portfolio",nft_pnl:"nft",nft_trait_snipe:"nft",satflow_floors:"nft"});function Kt(e){return String(e??"").replaceAll("&","&amp;").replaceAll("<","&lt;").replaceAll(">","&gt;").replaceAll('"',"&quot;")}function Ve(e){let t=Number(e);return Number.isFinite(t)?Math.abs(t)>=1e9?`${(t/1e9).toFixed(2)}B`:Math.abs(t)>=1e6?`${(t/1e6).toFixed(2)}M`:Math.abs(t)>=1e3?`${(t/1e3).toFixed(2)}K`:Math.abs(t)>=1?t.toLocaleString("en-US",{maximumFractionDigits:4}):t.toPrecision(4):null}function _r(e,t){if(e==null)return null;let n=String(e);if(/^\d{7,}$/.test(n)){let r=Number(t);if(Number.isFinite(r)&&r>0&&r<=36){let o=Number(n)/10**r;if(Number.isFinite(o))return Ve(o)}return`${n} raw`}return Ve(e)}var wb=Object.freeze({USDC:6,USDT:6,"USDC.E":6,USDBC:6,WBTC:8,CBBTC:8,ETH:18,WETH:18,DAI:18,WSTETH:18,ARB:18,OP:18,POL:18,BNB:18,AVAX:18,HYPE:18,SOL:9});function Eb(e,t){let n=Number(t);return t!=null&&Number.isFinite(n)?n:wb[String(e||"").toUpperCase()]}function fl(e,t){let n=t&&typeof t=="object"?t:{},r=n.result&&typeof n.result=="object"?n.result:n,o=r;if(r.estimate&&typeof r.estimate=="object"){let c=r.estimate,u=(c.gasCosts||[]).reduce((d,f)=>d+(Number(f.amountUSD)||0),0)||null,l=(c.feeCosts||[]).reduce((d,f)=>d+(Number(f.amountUSD)||0),0)||null;o={best:{provider:r.tool||r.toolDetails?.name||"lifi",amountOut:c.toAmount,minOut:c.toAmountMin,gasUsd:u,feeUsd:l,decimalsOut:r.action?.toToken?.decimals},tokenIn:r.action?.fromToken?.symbol,tokenOut:r.action?.toToken?.symbol}}let i=[],s=(c,u,l={})=>{u==null||u===""||i.push({label:c,value:String(u),...l})},a=o.best||o.winner||o.topRoute||null;if(e==="swap"||e==="bridge"||e==="quote"){let c=a||o,u=Eb(o.tokenOut??o.buyToken,o.tokenOutDecimals??o.decimalsOut??c.tokenOutDecimals??c.decimalsOut);s("ROUTE",c.provider||c.venue||c.source||c.aggregator),o.tokenIn&&o.tokenOut&&s("PAIR",`${o.tokenIn} \u2192 ${o.tokenOut}`);let l=c.netOut??c.netOutput??c.amountOutNet??c.toAmountNet,d=c.amountOut??c.outAmount??c.toAmount??c.expectedOut,f=_r(l,u);s(f!=null?"NET OUT":"EST OUT (GROSS)",f??_r(d,u),{hero:!0}),s("GROSS OUT",l!==void 0&&d!==void 0&&String(l)!==String(d)?_r(d,u):null),c.gasUsd!==void 0&&c.gasUsd!==null?s("GAS",`$${Ve(c.gasUsd)}`):c.feeUsd!==void 0&&c.feeUsd!==null?s("GAS+FEES",`$${Ve(c.feeUsd)}`):s("GAS","NOT PRICED IN",{warn:!0});let m=c.minOut??c.minAmountOut??c.minReceived;if(s("MIN RECEIVED",_r(m,u)),c.slippageBps!==void 0&&c.slippageBps!==null)s("SLIPPAGE",`${c.slippageBps} bps`);else if(m!==void 0&&d!==void 0){let w=Number(d),v=Number(m);Number.isFinite(w)&&Number.isFinite(v)&&w>0&&v>0&&v<=w&&s("SLIPPAGE",`${((1-v/w)*1e4).toFixed(0)} bps max`)}let y=c.meta?.fee??c.poolFee;y!=null&&s("POOL FEE",`${Number(y)/100} bps`),c.liquidityUsd!==void 0&&c.liquidityUsd!==null&&s("LIQUIDITY",`$${Ve(c.liquidityUsd)}`),o.rankedOn&&s("RANKED ON",String(o.rankedOn).toUpperCase(),{warn:String(o.rankedOn)==="gross"});let h=Array.isArray(o.ranked)?o.ranked.slice(1,4):Array.isArray(o.routes)?o.routes.filter(w=>w!==a).slice(0,3):[];for(let w of h){let v=w?.provider||w?.venue||w?.source,T=_r(w?.netOut??w?.amountOut??w?.toAmount,u);v&&T&&s(`vs ${v}`,T,{dim:!0})}}else if(e==="portfolio"){let u=(o.valuation&&typeof o.valuation=="object"?o.valuation:o).knownUsd??o.knownUsd;s("KNOWN USD",u!=null?`$${Ve(u)}`:null,{hero:!0});let l=Array.isArray(o.chains)?o.chains:null;if(s("CHAINS",l?l.length:o.chainCount),s("TOKENS",Array.isArray(o.tokens)?o.tokens.length:o.tokenCount),s("NFTS",Array.isArray(o.nfts)?o.nfts.length:o.nftCount),l){let p=l.filter(m=>Number.isFinite(Number(m?.knownUsd))&&Number(m.knownUsd)>0).sort((m,y)=>Number(y.knownUsd)-Number(m.knownUsd)).slice(0,3);for(let m of p)s(String(m.name||m.family||m.chainId),`$${Ve(m.knownUsd)}`,{dim:!0})}let d=o.avgEntryUsd??o.avgCostUsd;if(d!==void 0)s("AVG ENTRY",`$${Ve(d)}`);else if(Array.isArray(o.tokens)){let p=o.tokens.map(m=>Number(m?.avgEntryUsd??m?.avgCostUsd??m?.costBasisUsd)).filter(m=>Number.isFinite(m)&&m>0);if(p.length>0){let m=p.reduce((y,h)=>y+h,0)/p.length;s("AVG ENTRY",`$${Ve(m)} \xB7 ${p.length} coins`)}}let f=o.coverage;f&&typeof f=="object"?(Number(f.unavailable)||0)+(Number(f.notConfigured)||0)>0&&s("COVERAGE",`${f.ok??0}/${f.requestedSurfaces??"?"} SURFACES`,{warn:!0}):(o.incomplete||o.partial)&&s("COVERAGE","INCOMPLETE",{warn:!0})}else if(e==="nft"){s("COLLECTION",o.collection||o.slug||o.name),s("FLOOR",o.floor??o.floorEth??o.floorPrice,{hero:!0}),s("PNL",o.pnlUsd!==void 0?`$${Ve(o.pnlUsd)}`:null);let c=o.avgBuy??o.avgBuyEth??o.avgCostEth??o.avgPurchase;if(c!==void 0)s("AVG BUY",Ve(c));else if(Array.isArray(o.buys)||Array.isArray(o.purchases)){let u=(o.buys||o.purchases).map(l=>Number(l?.priceEth??l?.price??l?.costEth)).filter(l=>Number.isFinite(l)&&l>0);u.length>0&&s("AVG BUY",`${Ve(u.reduce((l,d)=>l+d,0)/u.length)} \xB7 ${u.length} buys`)}s("OWNERS",Ve(o.owners??o.numOwners))}return i}function Sb(e,t,n){let r=pl[e]||pl.generic,o=fl(e,n),i=o.find(u=>u.hero),s=o.filter(u=>!u.hero),a=Kt(JSON.stringify(n,null,2)).slice(0,2e4),c=s.map(u=>`<div class="row${u.dim?" dim":""}${u.warn?" warn":""}"><span>${Kt(u.label)}</span><b>${Kt(u.value)}</b></div>`).join("");return`<!doctype html><html><head><meta charset="utf-8"><style>
23
+ `);let i=!1,s=Promise.resolve();function a(){let l=async()=>{let u=`${t}.tmp-${process.pid}`;await EU(u,Buffer.from(o.export()),{mode:384}),await Zc(u,384),await wU(u,t),await Zc(t,384)};return s=s.then(l,l),s}n?await Zc(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=aS(String(l.type)),d=String(l.id||"").trim();if(!d)throw new TypeError("artifact id required");let p=te(l.data??{}),f=String(l.createdAt||new Date().toISOString());return o.run("INSERT INTO artifacts(id,type,created_at,data_json) VALUES(?,?,?,?)",[d,u,f,nl(p)]),await a(),{id:d,type:u,createdAt:f,data:p}},getArtifact(l){c();let u=o.prepare("SELECT * FROM artifacts WHERE id=?");u.bind([String(l)]);let d=u.step()?tl(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"):(aS(String(l)),o.prepare("SELECT * FROM artifacts WHERE type=? ORDER BY created_at,id"));return l!==void 0&&u.bind([String(l)]),el(u).map(tl)},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=el(d),f=p.find(h=>h.id===String(l)),m=p.find(h=>h.id===String(u));if(!f||!m)throw new TypeError("edge endpoints must exist");if(!xU.has(`${f.type}:${m.type}`))throw new TypeError(`invalid artifact edge: ${f.type} -> ${m.type}`);return o.run("INSERT INTO artifact_edges(parent_id,child_id) VALUES(?,?)",[f.id,m.id]),await a(),{parentId:f.id,childId:m.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)]),el(u).map(tl)},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)]),el(u).map(tl)},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=te(u);return o.run("INSERT INTO action_receipts(artifact_id,receipt_json) VALUES(?,?)",[String(l),nl(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 mf,vU,xU,IU,kU,lS=T(()=>{yi();mf=Object.freeze(["project","entity","source","thesis","strategy","simulation","prepared_action","receipt","position"]),vU=new Set(mf),xU=new Set(mf.slice(0,-1).map((e,t)=>`${e}:${mf[t+1]}`)),IU=ff(process.env.ORACLE_CONFIG_DIR||ff(AU(),".config","oracle"),"workspace"),kU=ff(IU,"artifacts.sqlite")});import{createHash as uS}from"node:crypto";function _U(e){return OU.has(String(e).replace(/[^a-z0-9]/gi,"").toLowerCase())}function hf(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(hf).join(",")}]`:`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${hf(e[t])}`).join(",")}}`}function TU(e){return uS("sha256").update(String(e)).digest("hex")}function dS(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(_U(n))throw new TypeError("research source URL must not contain sensitive query parameters");return t.toString()}function pS(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 NU(e={}){let t=dS(e.url??e.sourceUrl),n=pS(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(te({url:t,fetchedAt:n,contentHash:r}))}function fS(e={}){let t=dS(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=pS(e.fetchedAt),s=TU(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(NU),c=te({sourceUrl:t,fetchedAt:i,contentHash:s,snapshot:n,claim:r,confidence:o,contradictions:(e.contradictions||[]).map(String),citations:a});return Object.freeze({id:`research:${uS("sha256").update(hf(c)).digest("hex")}`,...c})}var OU,mS=T(()=>{yi();OU=new Set(["accesstoken","refreshtoken","idtoken","token","apikey","clientsecret","password","auth","jwt","session","secret","key","code","signature","xamzsignature","privatekey","authorization","bearer","credential"])});function hS(e){if(e===null||e===""||e===void 0)return null;let t=Number(e);return Number.isFinite(t)&&t>=0?t:null}function Ls(e){return Math.round((e+Number.EPSILON)*1e8)/1e8}function gf(e,t){return t>0?Ls(e/t*100):null}function bf(e){return e.address||e.owner||e.walletAddress||e.wallet?.address||null}function PU(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 mo(e,t,n={}){if(!t||typeof t!="object")return;let r=String(t.symbol??t.coin??t.name??t.collection??t.tokenId??"unknown"),o=hS(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||RU.has(r.toUpperCase())})}function LU(e){let t=[],n=bf(e);for(let r of e.assets||e.holdings||[])mo(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)&&mo(t,{...r.native,symbol:r.native.symbol??r.symbol??o},i);for(let a of r.assets||r.fungibleTokens?.assets||[])mo(t,a,i);for(let a of r.collectibles?.assets||r.nfts||[])mo(t,{...a,kind:"nft"},i);for(let a of r.spot?.balances||[])mo(t,a,{...i,venue:"Hyperliquid spot"});let s=hS(r.perps?.accountValueUsd);s!=null&&mo(t,{symbol:"perps account",usdValue:s},{...i,venue:"Hyperliquid perps"})}for(let r of e.inventory?.items||e.nfts?.items||[])mo(t,{...r,kind:"nft"},{address:n,chain:r.chain??e.chain,venue:r.marketplace??e.venue});return t}function $U(e,t){let n=bf(e),r=e.chain??e.chainId??e.family??"*";return n?`${String(n).toLowerCase()}|${String(r).toLowerCase()}`:`snapshot:${t}`}function yf(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:Ls(i),percentOfKnown:gf(i,n)})).sort((o,i)=>i.knownUsd-o.knownUsd||o.name.localeCompare(i.name))}function rl(e={},t={}){let n=Array.isArray(e)?e:Array.isArray(e.snapshots)?e.snapshots:e.snapshot?[e.snapshot]:[],r=PU(t.labels??t.addressBook??e.labels??e.addressBook),o={...CU,...e.thresholds||{},...t.thresholds||{}},i=[],s=new Set,a=0;n.forEach((x,C)=>{if(!x||typeof x!="object")return;let O=$U(x,C);s.has(O)?a+=1:(s.add(O),i.push(x))});let c=i.flatMap(LU),l=c.filter(x=>x.usdValue!=null),u=c.filter(x=>x.usdValue==null),d=i.reduce((x,C)=>x+Number(C.valuation?.unpricedNonzeroItems||C.unpricedNonzeroItems||0),0),p=Ls(l.reduce((x,C)=>x+C.usdValue,0)),f=u.length+d,m=yf(l,"chain",p),h=yf(l,"venue",p),y=yf(l,"symbol",p);for(let x of m)x.chain=x.name;for(let x of h)x.venue=x.name;for(let x of y)x.asset=x.name,x.symbol=x.name;let g=Ls(l.filter(x=>x.stablecoin).reduce((x,C)=>x+C.usdValue,0)),E=c.filter(x=>x.kind==="nft"),v=i.reduce((x,C)=>x+Number(C.valuation?.nftUnvaluedItems||0),0),S=E.filter(x=>x.usdValue==null).length+v,I=E.filter(x=>x.usdValue!=null).length,k=y[0]||null,A=k?k.percentOfKnown>=o.assetHighPct?"high":k.percentOfKnown>=o.assetMediumPct?"medium":"low":"unknown",w=[];f&&w.push(`${f} nonzero holding(s) have unknown USD value; they are excluded from totals and percentages.`),S&&w.push("NFT valuation coverage is partial; estimates are not executable bids and unvalued NFTs are not treated as zero."),a&&w.push(`${a} duplicate address/chain snapshot(s) were ignored.`),k&&A!=="low"&&w.push(`Asset concentration is ${A}: ${k.name} is ${k.percentOfKnown}% of known value.`),m[0]?.percentOfKnown>=o.chainHighPct&&w.push(`Chain concentration is high: ${m[0].name} is ${m[0].percentOfKnown}% of known value.`),h[0]?.percentOfKnown>=o.venueHighPct&&w.push(`Venue concentration is high: ${h[0].name} is ${h[0].percentOfKnown}% of known value.`);let b=i.map(bf).filter(Boolean).map(x=>{let C=r.get(String(x).toLowerCase());return{address:x,label:C?.label??null,who:C?.who??null,role:C?.role??null}});return{totalKnownUsd:p,coverage:{complete:i.length>0&&f===0&&i.every(x=>x.valuation?.complete!==!1&&x.coverage?.complete!==!1),label:f===0&&i.length&&i.every(x=>x.valuation?.complete!==!1&&x.coverage?.complete!==!1)?"complete for the supplied snapshots":"known priced value only; portfolio coverage is partial or unverified",unknownUsd:f?null:0,pricedItemCount:l.length,unknownItemCount:f,snapshotCount:i.length,duplicatesIgnored:a},chainExposures:m,venueExposures:h,topAssets:y.slice(0,Math.max(1,Number(t.topAssets??e.topAssets??10))),concentrationRisk:{level:A,topAsset:k?.name??null,topAssetPercent:k?.percentOfKnown??null,thresholds:{mediumPct:o.assetMediumPct,highPct:o.assetHighPct}},stablecoinExposure:{knownUsd:g,percentOfKnown:gf(g,p),high:p>0&&gf(g,p)>=o.stablecoinHighPct},nftCoverage:{status:E.length||v?S?"partial":"valued":"not-observed",valuedItems:I,unvaluedItems:S,knownUsd:Ls(E.filter(x=>x.usdValue!=null).reduce((x,C)=>x+C.usdValue,0))},addresses:b,warnings:[...new Set(w)]}}var CU,RU,wf=T(()=>{CU=Object.freeze({assetHighPct:50,assetMediumPct:25,chainHighPct:75,venueHighPct:60,stablecoinHighPct:70}),RU=new Set(["USDC","USDT","USDT0","DAI","FRAX","LUSD","TUSD","USDP","GUSD","PYUSD","USDE"])});function yS(e){return ut(e.asOf??e.updatedAt??e.timestamp,0)}function wS(e){return e.filledAt??e.executedAt??e.time??e.timestamp??e.asOf??e.updatedAt??e.createdAt}function DU(e){return Number.isFinite(Number(wS(e)))}function gS(e){return ut(wS(e),0)}function UU(e){let t=new Set,n=[];return(e||[]).forEach((o,i)=>{if(!o||typeof o!="object"||!yn(o))return;let s=ES(o);t.has(s)||(t.add(s),n.push({row:o,seq:i}))}),n.every(({row:o})=>DU(o))?n.sort((o,i)=>gS(o.row)-gS(i.row)||o.seq-i.seq).map(({row:o})=>o):n.map(({row:o})=>o)}function ES(e){let t=e.fillId??e.tradeId??e.orderId??e.txHash??e.transactionHash??e.timestamp??e.asOf;return[il(e),Xe(t),Xe(e.side),ut(e.quantity??e.amount??e.size),ut(e.price??e.priceUsd)].join("|")}function ol(e,t){let n=new Map,r=0;for(let o of e||[]){if(!o||typeof o!="object"||!yn(o))continue;let i=t==="fill"?ES(o):il(o);n.has(i)?(r+=1,t!=="fill"&&yS(o)>yS(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 BU(e){let t=new Map;for(let n of e){let r=[il(n),`${Xe(n.chain??n.chainId)}|${Xe(yn(n))}`,`*|${Xe(yn(n))}`];for(let o of r)t.has(o)||t.set(o,n)}return t}function qU(e,t){return t.get(il(e))??t.get(`${Xe(e.chain??e.chainId)}|${Xe(yn(e))}`)??t.get(`*|${Xe(yn(e))}`)??null}function MU(e){let t=new Map,n=0;for(let r of e){let o=[Xe(r.chain??r.chainId),Xe(bS(r)),Xe(yn(r))].join("|"),i=t.get(o)??{quantity:0,cost:0},s=Math.abs(ut(r.quantity??r.amount??r.size)),a=ut(r.price??r.priceUsd),c=ut(r.feeUsd);if(Xe(r.side)==="sell"){let l=Math.min(s,i.quantity),u=i.quantity?i.cost/i.quantity:ut(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:hn(n),lots:t}}function AS(e={},t={}){let n=ut(t.asOf??e.asOf,0),r=Math.max(0,ut(t.priceTtlMs??e.priceTtlMs,6e4)),o=ol(e.balances||[],"balance"),i=ol(e.positions||[],"position"),s=ol(e.fills||[],"fill"),a=ol(e.prices||[],"price"),c=BU(a.rows),l=[],u=0,d=0;for(let b of[...o.rows,...i.rows]){let x=qU(b,c),C=ut(b.quantity??b.amount??b.size),O=x?ut(x.priceUsd??x.price,NaN):ut(b.priceUsd,NaN);if(!Number.isFinite(O)){d+=1;continue}let F=C*O,H=ut(x?.asOf??b.priceAsOf,0),V=n-H>r;V&&(u+=Math.abs(F)),l.push({...b,quantity:C,priceUsd:O,valueUsd:F,stale:V,kind:i.rows.includes(b)?"position":"balance"})}let p=l.filter(b=>b.kind==="balance").reduce((b,x)=>b+x.valueUsd,0),f=l.filter(b=>b.kind==="position"),m=f.reduce((b,x)=>b+x.valueUsd,0),h=f.reduce((b,x)=>b+Math.abs(x.valueUsd),0),y=p+m,g=ut(e.equityUsd,y),E=MU(UU(e.fills||[])).realizedPnlUsd,v=f.reduce((b,x)=>{let C=ut(x.entryPriceUsd??x.averageEntryPrice??x.costBasisPrice,x.priceUsd);return b+x.quantity*(x.priceUsd-C)},0),S=new Map;for(let b of l)S.set(Xe(yn(b)),(S.get(Xe(yn(b)))||0)+Math.abs(b.valueUsd));let I=[...S.values()].reduce((b,x)=>b+x,0),k=[...S].map(([b,x])=>({asset:b,exposureUsd:hn(x),percent:I?hn(x/I*100):null})).sort((b,x)=>x.exposureUsd-b.exposureUsd||b.asset.localeCompare(x.asset)),A=l.reduce((b,x)=>b+Math.abs(x.valueUsd),0),w=rl({snapshots:[{assets:l.map(b=>({symbol:yn(b),usdValue:Math.abs(b.valueUsd),chain:b.chain,venue:b.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:E,unrealizedUsd:hn(v),totalUsd:hn(E+v)},exposure:{grossUsd:hn(h),netUsd:hn(y),leverage:g>0?hn(h/g):null,equityUsd:hn(g)},concentration:k,priceCoverage:{pricedItems:l.length,unpricedItems:d,staleItems:l.filter(b=>b.stale).length,staleValueUsd:hn(u),stalePercent:A?hn(u/A*100):null,ttlMs:r},risk:w})}var ut,hn,Xe,yn,bS,il,SS=T(()=>{wf();ut=(e,t=0)=>Number.isFinite(Number(e))?Number(e):t,hn=e=>Math.round((e+Number.EPSILON)*1e8)/1e8,Xe=(e,t="unknown")=>String(e??t).trim().toLowerCase(),yn=e=>e.asset??e.symbol??e.coin,bS=e=>e.address??e.owner??e.account,il=e=>[Xe(e.chain??e.chainId),Xe(bS(e)),Xe(yn(e)),Xe(e.source)].join("|")});function Ce(e,t){throw new Af(e,t)}function sr(e,t){return e<t?-1:e>t?1:0}function Qe(e){if(e&&typeof e=="object"&&!Object.isFrozen(e)){for(let t of Object.values(e))Qe(t);Object.freeze(e)}return e}function ar(e,t){return(!e||typeof e!="object"||Array.isArray(e)||Object.getPrototypeOf(e)!==Object.prototype)&&Ce(`${t} must be a plain object`),e}function gt(e,t,{optional:n=!1,lower:r=!1}={}){if(e==null&&n)return null;typeof e!="string"&&Ce(`${t} must be a string`);let o=e.trim();return o||Ce(`${t} is required`),WU.test(o)&&Ce(`${t} contains control characters`),o.length>512&&Ce(`${t} is too long`),r?o.toLowerCase():o}function Nn(e,t,{optional:n=!1,positive:r=!1}={}){if(e==null&&n)return null;typeof e=="number"&&Ce(`${t} must be an exact decimal string or BigInt; Number coercion is refused`,"COST_BASIS_UNSAFE_NUMBER");let o;typeof e=="bigint"?o=e.toString():typeof e=="string"?o=e:Ce(`${t} must be an exact decimal string or BigInt`),/^\d+$/.test(o)||Ce(`${t} must be a non-negative base-10 integer string`);let i=BigInt(o);return r&&i===0n&&Ce(`${t} must be positive`),i.toString()}function gi(e){return e==null?null:e.toString()}function $s(e,t){let n=ar(e,t);return Qe({chain:gt(n.chain??n.chainId,`${t}.chain`,{lower:!0}),account:gt(n.account??n.address??n.owner,`${t}.account`)})}function Br(e,t){return`${e.length}:${e}|${t.chain.length}:${t.chain}|${t.account.length}:${t.account}`}function kS(e,t="evidence"){if(e==null)return Qe({status:"unknown",references:[]});let n=ar(e,t),r=gt(n.status??"unknown",`${t}.status`,{lower:!0});VU.has(r)||Ce(`${t}.status must be complete, incomplete, or unknown`),n.references!=null&&!Array.isArray(n.references)&&Ce(`${t}.references must be an array`);let o=(n.references||[]).map((s,a)=>{let c=ar(s,`${t}.references[${a}]`);return{kind:gt(c.kind??c.type,`${t}.references[${a}].kind`,{lower:!0}),id:gt(c.id??c.receiptId??c.txHash,`${t}.references[${a}].id`)}}).sort((s,a)=>sr(s.kind,a.kind)||sr(s.id,a.id)),i=[];for(let s of o)i.some(a=>a.kind===s.kind&&a.id===s.id)||i.push(s);return Qe({status:r,references:i})}function vS(e,t){if(e==null)return[];(!Array.isArray(e)||e.length===0)&&Ce(`${t} must be a non-empty array`);let n=new Set;return e.map((r,o)=>{let i=ar(r,`${t}[${o}]`),s=gt(i.lotId,`${t}[${o}].lotId`);return n.has(s)&&Ce(`${t} repeats lotId ${JSON.stringify(s)}`),n.add(s),Qe({lotId:s,quantity:Nn(i.quantity,`${t}[${o}].quantity`,{positive:!0})})})}function GU(e){te(e);let t=ar(e,"event"),n=gt(t.type,"event.type",{lower:!0});zU.has(n)||Ce("event.type must be acquisition, disposal, or transfer");let r=gt(t.id??t.eventId,"event.id"),o=Nn(t.occurredAt??t.timestamp,"event.occurredAt"),i=gt(t.asset??t.symbol??t.coin,"event.asset"),s=Nn(t.quantity??t.amount??t.size,"event.quantity",{positive:!0}),a=Nn(t.feeMinor??t.feeUsdMinor??"0","event.feeMinor"),c=kS(t.evidence),l=t.source==null?null:gt(t.source,"event.source"),u={id:r,type:n,occurredAt:o,asset:i,quantity:s,feeMinor:a,source:l,evidence:c};if(n==="acquisition"){let d={...u,location:$s(t.location??{chain:t.chain??t.chainId,account:t.account??t.address??t.owner},"event.location"),grossAmountMinor:Nn(t.grossAmountMinor??t.costMinor??t.basisBeforeFeesMinor,"event.grossAmountMinor",{optional:!0}),lotId:gt(t.lotId??r,"event.lotId"),specificLots:[]};return Qe(d)}return Qe(n==="disposal"?{...u,location:$s(t.location??{chain:t.chain??t.chainId,account:t.account??t.address??t.owner},"event.location"),grossAmountMinor:Nn(t.grossAmountMinor??t.proceedsMinor??t.proceedsBeforeFeesMinor,"event.grossAmountMinor",{optional:!0}),specificLots:vS(t.specificLots??t.lotSelections,"event.specificLots")}:{...u,from:$s(t.from,"event.from"),to:$s(t.to,"event.to"),grossAmountMinor:null,specificLots:vS(t.specificLots??t.lotSelections,"event.specificLots")})}function KU(e,t){let n=BigInt(e.occurredAt)-BigInt(t.occurredAt);return n<0n?-1:n>0n?1:sr(e.id,t.id)}function YU(e=[]){Array.isArray(e)||Ce("events must be an array");let t=new Map,n=0;for(let r of e){let o=GU(r),i=Ps(o),s=t.get(o.id);if(s){s.canonical!==i&&Ce(`conflicting duplicate event id ${JSON.stringify(o.id)}`,"COST_BASIS_DUPLICATE_CONFLICT"),n+=1;continue}t.set(o.id,{event:o,canonical:i})}return Qe({events:[...t.values()].map(({event:r})=>r).sort(KU),duplicatesIgnored:n})}function JU(e){let t=gt(e??"fifo","method",{lower:!0});return jU.includes(t)||Ce("method must be fifo, lifo, hifo, or specific"),t}function XU(e){e!=null&&ar(e,"treatment");let t=e||{},n={};for(let r of Object.keys(xS))n[r]=gt(t[r]??"unresolved",`treatment.${r}`,{lower:!0}),xS[r].has(n[r])||Ce(`treatment.${r} has an unsupported value`);return Qe(n)}function QU(e,t){te(e);let n=ar(e,`marketValues[${t}]`);return Qe({id:gt(n.id??n.valuationId,`marketValues[${t}].id`),asset:gt(n.asset??n.symbol??n.coin,`marketValues[${t}].asset`),location:$s(n.location??{chain:n.chain??n.chainId,account:n.account??n.address??n.owner},`marketValues[${t}].location`),quantity:Nn(n.quantity,`marketValues[${t}].quantity`),valueMinor:Nn(n.valueMinor??n.marketValueMinor,`marketValues[${t}].valueMinor`),asOf:Nn(n.asOf,`marketValues[${t}].asOf`),evidence:kS(n.evidence,`marketValues[${t}].evidence`)})}function OS(e,t){return t==null||BigInt(e)<=BigInt(t)}function ZU(e=[],t=null){Array.isArray(e)||Ce("marketValues must be an array");let n=new Map,r=0;e.forEach((s,a)=>{let c=QU(s,a),l=Ps(c),u=n.get(c.id);u?(u.canonical!==l&&Ce(`conflicting duplicate market value id ${JSON.stringify(c.id)}`,"COST_BASIS_DUPLICATE_CONFLICT"),r+=1):n.set(c.id,{row:c,canonical:l})});let o=[...n.values()].map(({row:s})=>s).filter(s=>OS(s.asOf,t)),i=new Map;for(let s of o){let a=Br(s.asset,s.location),c=i.get(a);(!c||BigInt(s.asOf)>BigInt(c.asOf)||s.asOf===c.asOf&&sr(s.id,c.id)<0)&&i.set(a,s)}return{values:o.sort((s,a)=>sr(s.id,a.id)),byHolding:i,duplicatesIgnored:r}}function yt(e,t,n,r){e.push(Qe({code:t,eventId:n??null,detail:r}))}function eB(e,t,n){if(e.grossAmountMinor==null)return yt(n,"missing-acquisition-basis",e.id,"gross acquisition amount is unknown; lot basis remains unknown"),null;let r=BigInt(e.grossAmountMinor),o=BigInt(e.feeMinor);return o===0n?r:t.acquisitionFees==="include-in-basis"?r+o:t.acquisitionFees==="exclude"?r:(yt(n,"unresolved-acquisition-fee-treatment",e.id,"fee treatment was not supplied; lot basis remains unknown"),null)}function tB(e,t,n){if(e.grossAmountMinor==null)return yt(n,"missing-disposal-proceeds",e.id,"gross disposal proceeds are unknown"),null;let r=BigInt(e.grossAmountMinor),o=BigInt(e.feeMinor);return o===0n?r:t.disposalFees==="reduce-proceeds"?r-o:t.disposalFees==="exclude"?r:(yt(n,"unresolved-disposal-fee-treatment",e.id,"fee treatment was not supplied; recognized proceeds remain unknown"),null)}function nB(e,t){let n=(r,o)=>{let i=BigInt(r.acquiredAt)-BigInt(o.acquiredAt);return i<0n?-1:i>0n?1:sr(r.lotId,o.lotId)};return e==="fifo"?[...t].sort(n):e==="lifo"?[...t].sort((r,o)=>-n(r,o)):e==="hifo"?[...t].sort((r,o)=>{let i=r.basisRemaining*o.quantityRemaining,s=o.basisRemaining*r.quantityRemaining;return i>s?-1:i<s?1:n(r,o)}):[...t]}function IS(e,t){let n=e.quantityRemaining,r=e.basisRemaining,o=null;return r!=null&&(o=t===n?r:r*t/n,e.basisRemaining-=o),e.quantityRemaining-=t,{lot:e,quantity:t,basis:o}}function rB(e,t,n){let r=Br(t,n);return e.filter(o=>o.key===r&&o.quantityRemaining>0n)}function oB({event:e,lots:t,method:n,issues:r,tainted:o}){let i=e.type==="transfer"?e.from:e.location,s=Br(e.asset,i),a=BigInt(e.quantity);if(o.has(s))return yt(r,"inventory-state-incomplete",e.id,"an earlier unmatched record makes this holding indeterminate"),{matches:[],missing:a,key:s,indeterminate:!0};let c=rB(t,e.asset,i);if(n==="hifo"&&c.some(d=>d.basisRemaining==null))return yt(r,"hifo-basis-unknown",e.id,"HIFO cannot rank a lot whose basis is unknown"),o.add(s),{matches:[],missing:a,key:s,indeterminate:!0};let l=[],u=a;if(n==="specific"){if(e.specificLots.length===0)return yt(r,"specific-lots-required",e.id,"specific-lot method requires explicit lot selections"),o.add(s),{matches:l,missing:u,key:s,indeterminate:!0};if(e.specificLots.reduce((p,f)=>p+BigInt(f.quantity),0n)!==a)return yt(r,"specific-lot-quantity-mismatch",e.id,"specific-lot quantities do not equal the event quantity"),o.add(s),{matches:l,missing:u,key:s,indeterminate:!0};for(let p of e.specificLots){let f=c.find(h=>h.lotId===p.lotId),m=BigInt(p.quantity);if(!f||f.quantityRemaining<m){yt(r,"specific-lot-unavailable",e.id,`requested lot ${JSON.stringify(p.lotId)} is absent or too small`);continue}l.push(IS(f,m)),u-=m}}else{e.specificLots.length&&Ce(`event ${JSON.stringify(e.id)} supplies specificLots but method is ${n}`);for(let d of nB(n,c)){if(u===0n)break;let p=u<d.quantityRemaining?u:d.quantityRemaining;l.push(IS(d,p)),u-=p}}return u>0n&&(yt(r,"insufficient-inventory",e.id,"recorded lots do not cover the event quantity; no replacement basis was invented"),o.add(s)),{matches:l,missing:u,key:s,indeterminate:u>0n}}function Ef(e,t,n){if(e==null)return t.map(()=>null);let r=e,o=n;return t.map(i=>{if(o===0n)return 0n;let s=i===o?r:r*i/o;return r-=s,o-=i,s})}function iB(e,t){let n=[...e.map(r=>r.evidence.status),...t.map(r=>r.evidence.status)];return n.length===0||n.every(r=>r==="complete")?"complete":n.some(r=>r==="incomplete")?"incomplete":"unknown"}function bi(e,t){let n=e.map(o=>o[t]),r=n.filter(o=>o!=null).reduce((o,i)=>o+BigInt(i),0n);return{value:n.every(o=>o!=null)?r.toString():null,known:r.toString()}}function sB(e,t){return{lotId:e.lotId,originLotId:e.lotId,acquisitionEventId:e.id,asset:e.asset,location:e.location,key:Br(e.asset,e.location),acquiredAt:e.occurredAt,quantityRemaining:BigInt(e.quantity),basisRemaining:t,evidenceStatus:e.evidence.status}}function _S(e={},t={}){te(e),te(t),ar(e,"input"),ar(t,"options");let n=Nn(t.asOf??e.asOf,"asOf",{optional:!0}),r=YU(e.events||[]),o=n==null?r.events:r.events.filter(b=>OS(b.occurredAt,n)),i=JU(t.method??e.method),s=XU(t.treatment??e.treatment),a=ZU(e.marketValues||[],n),c=[],l=[],u=new Set,d=[],p=[],f=new Set;for(let b of o){if(b.type==="acquisition"){if(u.has(b.lotId)){yt(c,"duplicate-lot-id",b.id,`lotId ${JSON.stringify(b.lotId)} is already in use`),f.add(Br(b.asset,b.location));continue}u.add(b.lotId),l.push(sB(b,eB(b,s,c)));continue}let x=oB({event:b,lots:l,method:i,issues:c,tainted:f});if(b.type==="disposal"){let D=tB(b,s,c),_=Ef(D,x.matches.map(ne=>ne.quantity),BigInt(b.quantity)),$=x.matches.map((ne,Pe)=>{let ze=_[Pe];return Qe({lotId:ne.lot.lotId,originLotId:ne.lot.originLotId,quantity:ne.quantity.toString(),basisMinor:gi(ne.basis),proceedsMinor:gi(ze),gainMinor:ne.basis==null||ze==null?null:(ze-ne.basis).toString(),acquiredAt:ne.lot.acquiredAt,evidenceStatus:ne.lot.evidenceStatus})}),q=$.filter(ne=>ne.basisMinor!=null).reduce((ne,Pe)=>ne+BigInt(Pe.basisMinor),0n),M=x.missing===0n&&$.every(ne=>ne.basisMinor!=null),ue=x.missing===0n&&D!=null;d.push(Qe({eventId:b.id,asset:b.asset,location:b.location,occurredAt:b.occurredAt,quantity:b.quantity,grossProceedsMinor:b.grossAmountMinor,feeMinor:b.feeMinor,recognizedProceedsMinor:ue?D.toString():null,basisMinor:M?q.toString():null,gainMinor:M&&ue?(D-q).toString():null,unknownQuantity:x.missing.toString(),status:M&&ue?"complete":"incomplete",evidenceStatus:b.evidence.status,matches:$}));continue}let C=BigInt(b.feeMinor),O=C>0n&&s.transferFees==="include-in-basis",F=C>0n&&s.transferFees==="unresolved";F&&yt(c,"unresolved-transfer-fee-treatment",b.id,"fee treatment was not supplied; transferred lot basis remains unknown");let H=Ef(O?C:0n,x.matches.map(D=>D.quantity),BigInt(b.quantity)),V=x.matches.map((D,_)=>{let $=D.basis;F?$=null:$!=null&&O&&($+=H[_]);let q=`${b.id}:${_+1}`;return u.has(q)?(yt(c,"duplicate-lot-id",b.id,`derived transfer lotId ${JSON.stringify(q)} is already in use`),f.add(Br(b.asset,b.to)),null):(u.add(q),l.push({lotId:q,originLotId:D.lot.originLotId,acquisitionEventId:D.lot.acquisitionEventId,asset:b.asset,location:b.to,key:Br(b.asset,b.to),acquiredAt:D.lot.acquiredAt,quantityRemaining:D.quantity,basisRemaining:$,evidenceStatus:b.evidence.status==="complete"&&D.lot.evidenceStatus==="complete"?"complete":"unknown"}),Qe({fromLotId:D.lot.lotId,toLotId:q,originLotId:D.lot.originLotId,quantity:D.quantity.toString(),basisMinor:gi($)}))}).filter(Boolean);x.indeterminate&&f.add(Br(b.asset,b.to)),p.push(Qe({eventId:b.id,asset:b.asset,from:b.from,to:b.to,occurredAt:b.occurredAt,quantity:b.quantity,feeMinor:b.feeMinor,unknownQuantity:x.missing.toString(),status:x.indeterminate||V.some(D=>D.basisMinor==null)?"incomplete":"complete",moved:V}))}let m=l.filter(b=>b.quantityRemaining>0n).sort((b,x)=>sr(b.key,x.key)||sr(b.lotId,x.lotId)),h=new Map;for(let b of m)h.has(b.key)||h.set(b.key,[]),h.get(b.key).push(b);let y=[];for(let[b,x]of[...h].sort(([C],[O])=>sr(C,O))){let C=x.reduce((D,_)=>D+_.quantityRemaining,0n),O=a.byHolding.get(b)||null,F=f.has(b),H=O;O?BigInt(O.quantity)!==C&&(yt(c,"market-value-quantity-mismatch",null,`market value ${JSON.stringify(O.id)} does not cover the recorded holding quantity`),H=null):yt(c,"missing-market-value",null,`no market value was supplied for holding ${b}`),F&&(H=null);let V=Ef(H?BigInt(H.valueMinor):null,x.map(D=>D.quantityRemaining),C);x.forEach((D,_)=>{let $=V[_],q=$==null||D.basisRemaining==null?null:$-D.basisRemaining;y.push(Qe({lotId:D.lotId,originLotId:D.originLotId,acquisitionEventId:D.acquisitionEventId,asset:D.asset,location:D.location,acquiredAt:D.acquiredAt,quantity:D.quantityRemaining.toString(),basisMinor:F?null:gi(D.basisRemaining),marketValueMinor:gi($),unrealizedGainMinor:F?null:gi(q),valuationId:H?.id??null,status:F||D.basisRemaining==null||$==null?"incomplete":"complete",evidenceStatus:D.evidenceStatus}))})}let g=bi(d,"basisMinor"),E=bi(d,"recognizedProceedsMinor"),v=bi(d,"gainMinor"),S=bi(y,"basisMinor"),I=bi(y,"marketValueMinor"),k=bi(y,"unrealizedGainMinor"),A=o.every(b=>BigInt(b.feeMinor)>0n?b.type==="acquisition"?s.acquisitionFees!=="unresolved":b.type==="disposal"?s.disposalFees!=="unresolved":s.transferFees!=="unresolved":!0),w={recordVersion:FU,recordType:"cost-basis-records",label:HU,asOf:n,method:i,units:{quantity:"exact asset minor units as base-10 integer strings",usd:"USD minor units as base-10 integer strings"},accountingFacts:{events:o,marketValues:a.values,duplicatesIgnored:r.duplicatesIgnored+a.duplicatesIgnored},jurisdictionalTreatment:{suppliedByCaller:s,status:A?"specified":"unresolved",note:"Fee and lot-selection treatment can vary by jurisdiction. These caller-selected recordkeeping rules are not tax advice."},realized:{disposals:d,totals:{proceedsMinor:E.value,basisMinor:g.value,gainMinor:v.value,knownProceedsSubtotalMinor:E.known,knownBasisSubtotalMinor:g.known,knownGainSubtotalMinor:v.known}},transfers:p,holdings:y,unrealized:{totals:{marketValueMinor:I.value,basisMinor:S.value,gainMinor:k.value,knownMarketValueSubtotalMinor:I.known,knownBasisSubtotalMinor:S.known,knownGainSubtotalMinor:k.known}},completeness:{accounting:c.some(b=>b.code!=="missing-market-value")?"incomplete":"complete",valuation:y.every(b=>b.marketValueMinor!=null)?"complete":"incomplete",evidence:iB(o,a.values),treatment:A?"specified":"unresolved"},issues:c};return Qe(w)}var FU,jU,HU,zU,VU,WU,Af,xS,TS=T(()=>{yi();FU=1,jU=Object.freeze(["fifo","lifo","hifo","specific"]),HU="Accounting records only; not tax advice.",zU=new Set(["acquisition","disposal","transfer"]),VU=new Set(["complete","incomplete","unknown"]),WU=/[\u0000-\u001f\u007f]/,Af=class extends Error{constructor(t,n="COST_BASIS_INVALID"){super(`cost basis: ${t}`),this.name="CostBasisValidationError",this.code=n}};xS=Object.freeze({acquisitionFees:new Set(["include-in-basis","exclude","unresolved"]),disposalFees:new Set(["reduce-proceeds","exclude","unresolved"]),transferFees:new Set(["include-in-basis","exclude","unresolved"])})});function ae(e,t){throw new vf(e,t)}function ho(e,t){return e<t?-1:e>t?1:0}function jt(e){if(e&&typeof e=="object"&&!Object.isFrozen(e)){for(let t of Object.values(e))jt(t);Object.freeze(e)}return e}function ke(e,t){return(!e||typeof e!="object"||Array.isArray(e)||Object.getPrototypeOf(e)!==Object.prototype)&&ae(`${t} must be a plain object`),e}function Cn(e,t,{optional:n=!1,lower:r=!1}={}){if(e==null&&n)return null;typeof e!="string"&&ae(`${t} must be a string`);let o=e.trim();return o||ae(`${t} is required`),dB.test(o)&&ae(`${t} contains control characters`),o.length>512&&ae(`${t} is too long`),r?o.toLowerCase():o}function Ft(e,t,{optional:n=!1,positive:r=!1}={}){if(e==null&&n)return null;typeof e=="number"&&ae(`${t} must be an exact decimal string or BigInt; Number coercion is refused`,"POSITION_HEALTH_UNSAFE_NUMBER");let o;typeof e=="bigint"?o=e.toString():typeof e=="string"?o=e.trim():ae(`${t} must be an exact decimal string or BigInt`),/^\d+$/.test(o)||ae(`${t} must be a non-negative base-10 integer string`);let i=BigInt(o);return r&&i===0n&&ae(`${t} must be positive`),i.toString()}function LS(e,t){e==null&&ae(`${t} is required`,"POSITION_HEALTH_MISSING_DECIMALS"),typeof e=="number"&&ae(`${t} must be an exact decimal string or BigInt; Number coercion is refused`,"POSITION_HEALTH_UNSAFE_NUMBER");let n=Ft(e,t),r=BigInt(n);return r>BigInt(CS)&&ae(`${t} exceeds ${CS}`),Number(r)}function Us(e,t){return e==null?null:Cn(e,t)}function pB(e,t){return e==null&&ae(`${t} is required`),typeof e=="bigint"?e.toString():typeof e=="number"?((!Number.isInteger(e)||!Number.isSafeInteger(e)||e<0)&&ae(`${t} must be a safe non-negative integer, decimal string, or slug`),String(e)):Cn(String(e),t,{lower:!0})}function X(e,t){for(let n of t)if(e[n]!==void 0)return e[n]}function fB(e,t="protocol"){if(e==null)return"generic";let n=Cn(e,t,{lower:!0}),r=lB[n]||n;return cB.has(r)||ae(`${t} must be a supported lending or yield protocol`),r}function MS(e){return e.protocol!=null?fB(e.protocol):e.marketId!=null||e.lltv!=null||e.loanAsset&&e.collateralAsset?"morpho":e.cToken!=null||e.underlying_symbol!=null||e.collateralFactor!=null?"compound":e.borrowedAmountWads!=null||e.lendingMarket!=null||e.mintDecimals!=null?"solend":e.recipe!=null||e.farmingMethod!=null||e.methodId!=null?"farming":e.spark!=null||e.savingsVault!=null?"spark":e.userReserves!=null||e.reserves!=null||e.liquidationThreshold!=null?"aave-v3":"generic"}function mB(e,t="evidence"){if(e==null)return jt({status:"unknown",references:[]});let n=ke(e,t),r=Cn(n.status??"unknown",`${t}.status`,{lower:!0});uB.has(r)||ae(`${t}.status must be complete, incomplete, unknown, or stale`),n.references!=null&&!Array.isArray(n.references)&&ae(`${t}.references must be an array`);let o=(n.references||[]).map((s,a)=>{let c=ke(s,`${t}.references[${a}]`);return{kind:Cn(c.kind??c.type,`${t}.references[${a}].kind`,{lower:!0}),id:Cn(c.id??c.receiptId??c.txHash,`${t}.references[${a}].id`)}}).sort((s,a)=>ho(s.kind,a.kind)||ho(s.id,a.id)),i=[];for(let s of o)i.some(a=>a.kind===s.kind&&a.id===s.id)||i.push(s);return jt({status:r,references:i})}function FS(e,t){if(e==null)return null;if(typeof e=="number"&&ae(`${t} must be an exact integer string or BigInt; Number coercion is refused`,"POSITION_HEALTH_UNSAFE_NUMBER"),typeof e=="object"){let o=ke(e,t);if(o.bps!=null)return FS(o.bps,`${t}.bps`);if(o.ray!=null)return Sf(o.ray,`${t}.ray`);if(o.wad!=null)return $S(o.wad,`${t}.wad`);if(o.raw!=null)return Sf(o.raw,`${t}.raw`);o.value!=null&&ae(`${t}.value is not an exact integer threshold; supply bps, wad, or ray`,"POSITION_HEALTH_UNSAFE_NUMBER"),ae(`${t} must include bps, wad, or ray`)}let n=typeof e=="bigint"?e.toString():String(e).trim();/^\d+$/.test(n)||ae(`${t} must be a non-negative base-10 integer string`);let r=BigInt(n);return r<=10000n?r.toString():r<=wi?$S(r,t):Sf(r,t)}function $S(e,t){let r=BigInt(Ft(e,t))*10000n/wi;return r>10000n&&ae(`${t} exceeds 100%`),r.toString()}function Sf(e,t){let n=BigInt(Ft(e,t)),r=10n**27n,o=n*10000n/r;return o>10000n&&ae(`${t} exceeds 100%`),o.toString()}function DS(e,t,n){let r=`${n}[${t}]`,o=ke(e,r),i=Cn(X(o,["asset","symbol","coin","underlying","underlyingToken","name"])??o.underlyingToken?.symbol??o.liquidityToken?.symbol,`${r}.asset`),s=Us(X(o,["address","token","mint","underlyingAddress"])??o.underlyingToken?.address??o.liquidityToken?.mint,`${r}.address`),a=Ft(X(o,["amount","balance","aTokenBalance","supplyBalance","supplyAssets","collateral","deposited","shares"]),`${r}.amount`),c=LS(X(o,["decimals","tokenDecimals","mintDecimals"])??o.underlyingToken?.decimals??o.liquidityToken?.decimals,`${r}.decimals`),l=Ft(X(o,["price","priceQuoteMinor","oraclePrice","marketPrice"]),`${r}.price`),u=LS(X(o,["priceDecimals","oraclePriceDecimals","quoteDecimals"]),`${r}.priceDecimals`),d=null;if(n==="collateral"){let p=X(o,["liquidationThresholdBps","liquidationThreshold","lltv","ltvBps","collateralFactor","collateralFactorBps"])??o.supplyInfo?.liquidationThreshold;p==null&&ae(`${r}.liquidationThresholdBps is required`,"POSITION_HEALTH_MISSING_THRESHOLD"),d=FS(p,`${r}.liquidationThreshold`)}return jt({asset:i,address:s,amount:a,decimals:String(c),price:l,priceDecimals:String(u),liquidationThresholdBps:d})}function sl(e,t){return e==null?[]:(Array.isArray(e)||ae(`${t} must be an array`),e.length>RS&&ae(`${t} exceeds ${RS} assets`),e)}function hB(e){let t=X(e,["chain","chainId","network"]),n=e.market&&typeof e.market=="object"?e.market.chain?.chainId??(typeof e.market.chain=="string"||typeof e.market.chain=="bigint"?e.market.chain:null):null,r=pB(t??n,"chain"),o=Cn(X(e,["account","address","owner","user","wallet"]),"account"),i=X(e,["marketId","pool","vault"]);return typeof e.market=="string"||typeof e.market=="bigint"?i=i??e.market:e.market&&typeof e.market=="object"&&(i=i??e.market.address??e.market.name??e.market.marketId??null),{chain:r,account:o,market:i==null?null:Cn(String(i),"market")}}function yB(e,t){let n=Ft(t.asOf??e.asOf,"asOf"),r=Ft(X(e,["observedAt","fetchedAt","updatedAt","lastUpdate","asOfObserved"]),"observedAt"),o=Ft(X(e,["expiresAt","validUntil","staleAfter"]),"expiresAt");return{asOf:n,observedAt:r,expiresAt:o}}function gB(e,t,n,r){return BigInt(r)<BigInt(t)?{status:"unknown",reason:"FUTURE_EVIDENCE"}:BigInt(r)>=BigInt(n)?{status:"stale",reason:"STALE_EVIDENCE"}:e.status==="stale"?{status:"stale",reason:"STALE_EVIDENCE"}:e.status==="unknown"?{status:"unknown",reason:"UNKNOWN_EVIDENCE"}:e.status==="incomplete"?{status:"incomplete",reason:"INCOMPLETE_EVIDENCE"}:{status:"complete",reason:null}}function Ds(e,t,n,r={}){return jt({code:e,severity:t,message:n,...r})}function jS(e){let t={critical:0,warning:1,info:2};return[...e].sort((n,r)=>{let o=(t[n.severity]??9)-(t[r.severity]??9);return o||ho(n.code,r.code)||ho(n.message,r.message)})}function US(e,t,n,r,o,i){return BigInt(e)*BigInt(n)*10n**BigInt(o-t)*10n**BigInt(i-r)}function bB(e,t){let n=[...e,...t],r=n.reduce((g,E)=>Math.max(g,Number(E.decimals)),0),o=n.reduce((g,E)=>Math.max(g,Number(E.priceDecimals)),0),i=0n,s=0n,a=0n;for(let g of e){let E=US(g.amount,Number(g.decimals),g.price,Number(g.priceDecimals),r,o);s+=E,i+=E*BigInt(g.liquidationThresholdBps)}for(let g of t)a+=US(g.amount,Number(g.decimals),g.price,Number(g.priceDecimals),r,o);let c=10n**BigInt(r),l={tokenDecimals:String(r),priceDecimals:String(o),unit:"quote-minor = floor(scaledValue / 10^tokenDecimals) at priceDecimals"},u=(s/c).toString(),d=(a/c).toString(),p=(i/10000n/c).toString();if(a===0n)return jt({healthFactorWad:null,healthFactorStatus:s===0n?"empty":"no-debt",totalCollateralQuoteMinor:u,totalDebtQuoteMinor:"0",weightedCollateralQuoteMinor:p,liquidationBufferQuoteMinor:p,quote:l});let f=(i*wi/(a*10000n)).toString(),m=i/10000n-a,h=m<0n?"-":"",y=m<0n?-m:m;return jt({healthFactorWad:f,healthFactorStatus:BigInt(f)<wi?"liquidatable":"priced",totalCollateralQuoteMinor:u,totalDebtQuoteMinor:d,weightedCollateralQuoteMinor:p,liquidationBufferQuoteMinor:`${h}${(y/c).toString()}`,quote:l})}function bt(e,t={}){te(e),te(t);let n=ke(e,"snapshot");ke(t,"options");let r=MS(n),{chain:o,account:i,market:s}=hB(n),a=mB(n.evidence),{asOf:c,observedAt:l,expiresAt:u}=yB(n,t),d=Cn(n.id??n.positionId??`${r}:${o}:${i}:${s??"default"}`,"id"),p=Us(n.tenantId,"tenantId"),f=sl(n.collateral??n.supplies??n.deposits,"collateral").map((y,g)=>DS(y,g,"collateral")),m=sl(n.debt??n.borrows??n.liabilities,"debt").map((y,g)=>DS(y,g,"debt")),h={id:d,protocol:r,chain:o,account:i,market:s,observedAt:l,expiresAt:u,asOf:c,evidence:a,collateral:f,debt:m};return p&&(h.tenantId=p),jt(h)}function wB(e){return X(e,["liquidationThresholdBps","liquidationThreshold","lltv"])??e.market?.lltv??e.state?.lltv}function EB(e,t={}){return X(t,["collateralFactorBps","collateralFactor","liquidationThresholdBps","liquidationThreshold"])??X(e,["collateralFactorBps","collateralFactor","liquidationThresholdBps"])}function AB(e){return X(e,["price","priceQuoteMinor","oraclePrice","marketPrice"])}function SB(e,t={}){te(e);let n=ke(e,"snapshot");if(Array.isArray(n.collateral)||Array.isArray(n.debt))return bt({...n,protocol:"aave-v3"},t);let r=n.userReserves??n.reserves??n.market?.reserves;if(!Array.isArray(r))return bt({...n,protocol:"aave-v3"},t);let o=[],i=[];for(let s of r){let a=ke(s,"reserve"),c=ke(a.underlyingToken??a.token??a,"reserve.token"),l={asset:c.symbol??a.symbol,address:c.address??a.address,decimals:c.decimals??a.decimals,price:X(a,["price","priceQuoteMinor","oraclePrice"])??a.size?.usd,priceDecimals:X(a,["priceDecimals","oraclePriceDecimals"]),liquidationThreshold:a.liquidationThresholdBps??a.liquidationThreshold??a.supplyInfo?.liquidationThreshold},u=X(a,["aTokenBalance","supplyBalance","collateral","amount","supplied"]),d=X(a,["variableDebtTokenBalance","stableDebtTokenBalance","borrowBalance","debt","borrowed"]);u!=null&&u!=="0"&&o.push({...l,amount:u}),d!=null&&d!=="0"&&i.push({...l,amount:d})}return bt({...n,protocol:"aave-v3",collateral:n.collateral??o,debt:n.debt??i},t)}function vB(e,t={}){te(e);let n=ke(e,"snapshot");if(Array.isArray(n.collateral)||Array.isArray(n.debt))return bt({...n,protocol:"morpho"},t);let r=wB(n),o=n.collateralAsset??n.market?.collateralAsset??{},i=n.loanAsset??n.market?.loanAsset??{},s=n.position??n.state??{},a=[{asset:o.symbol??n.collateralSymbol,address:o.address,decimals:o.decimals??n.collateralDecimals,amount:X(n,["collateral","collateralAmount","supplyAssets"])??s.collateral??s.supplyAssets,price:X(n,["collateralPrice","price","priceQuoteMinor"])??o.price,priceDecimals:X(n,["collateralPriceDecimals","priceDecimals"])??o.priceDecimals,liquidationThreshold:r}],c=n.debt??[{asset:i.symbol??n.loanSymbol,address:i.address,decimals:i.decimals??n.loanDecimals,amount:X(n,["borrowAssets","debt","borrowAmount"])??s.borrowAssets,price:X(n,["loanPrice","debtPrice"])??i.price,priceDecimals:X(n,["loanPriceDecimals","debtPriceDecimals"])??i.priceDecimals}],l=(Array.isArray(c)?c:[c]).filter(u=>u&&u.amount!=null&&u.amount!=="0"&&u.amount!==0n);return bt({...n,protocol:"morpho",market:n.marketId??n.market?.marketId??n.market,collateral:Array.isArray(a)?a:[a],debt:l},t)}function xB(e,t={}){te(e);let n=ke(e,"snapshot"),r=n.markets??n.cTokens??(n.cToken||n.underlying?[n]:null);if(n.collateral||n.debt)return bt({...n,protocol:"compound"},t);let o=[],i=[];for(let s of sl(r??[],"markets")){let a=ke(s,"market"),c={asset:a.underlying??a.underlying_symbol??a.symbol??a.asset,address:a.address??a.cToken,decimals:a.decimals??a.underlyingDecimals,price:a.price??a.priceQuoteMinor??a.oraclePrice,priceDecimals:a.priceDecimals,liquidationThreshold:EB(n,a)},l=X(a,["supplyBalance","balance","amount","totalSupply"]),u=X(a,["borrowBalance","borrow","debt","totalBorrow"]);l!=null&&l!=="0"&&o.push({...c,amount:l}),u!=null&&u!=="0"&&i.push({...c,amount:u})}return bt({...n,protocol:"compound",collateral:o,debt:i},t)}function IB(e,t={}){te(e);let n=ke(e,"snapshot");if(n.stale===!0||n.reserve?.lastUpdate?.stale===1)return bt({...n,protocol:"solend",evidence:{...n.evidence||{},status:"stale"}},t);if(n.collateral||n.debt)return bt({...n,protocol:"solend"},t);let r=n.reserves??n.obligation?.deposits??(n.mint||n.mintDecimals!=null?[n]:[]),o=[],i=[];for(let s of sl(r,"reserves")){let a=ke(s,"reserve"),c={asset:a.symbol??a.asset??a.liquidityToken?.symbol,address:a.mint??a.address??a.liquidityToken?.mint,decimals:a.mintDecimals??a.decimals??a.liquidityToken?.decimals,price:AB(a),priceDecimals:a.priceDecimals??a.oraclePriceDecimals,liquidationThreshold:a.liquidationThresholdBps??a.liquidationThreshold??a.loanToValueRatio??n.liquidationThresholdBps},l=X(a,["depositedAmount","collateral","amount","availableAmount"]),u=X(a,["borrowedAmount","borrowBalance","debt"]);if(u==null&&a.borrowedAmountWads!=null){let d=Ft(a.borrowedAmountWads,"borrowedAmountWads");u=(BigInt(d)/10n**18n).toString()}l!=null&&l!=="0"&&o.push({...c,amount:l}),u!=null&&u!=="0"&&i.push({...c,amount:u})}return bt({...n,protocol:"solend",collateral:o,debt:i},t)}function kB(e,t={}){te(e);let n=ke(e,"snapshot");if(n.collateral||n.debt)return bt({...n,protocol:"spark"},t);let r=n.vault??n.savingsVault??n.data?.vault??n,o=ke(r,"vault"),i=[{asset:o.symbol??o.asset??n.token??"savings",address:o.address??n.address,decimals:o.decimals??n.decimals,amount:X(n,["amount","shares","balance"])??o.amount??o.shares,price:X(n,["price","priceQuoteMinor"])??o.price,priceDecimals:X(n,["priceDecimals"])??o.priceDecimals,liquidationThreshold:X(n,["liquidationThresholdBps","liquidationThreshold"])??"10000"}],s=X(n,["debt","borrowed","borrowAmount"]),a=s==null||s==="0"?[]:[{asset:n.debtAsset??n.borrowSymbol??"debt",address:n.debtAddress,decimals:n.debtDecimals??o.decimals??n.decimals,amount:s,price:n.debtPrice??n.price,priceDecimals:n.debtPriceDecimals??n.priceDecimals??o.priceDecimals}];return bt({...n,protocol:"spark",collateral:i,debt:a},t)}function OB(e,t={}){te(e);let n=ke(e,"snapshot");if(n.tvlUsd!=null&&typeof n.tvlUsd=="number"&&ae("farming tvlUsd Number is refused; supply exact collateral and debt amounts","POSITION_HEALTH_UNSAFE_NUMBER"),Array.isArray(n.collateral)||Array.isArray(n.debt)){let c=bt({...n,protocol:"farming"},t),l=Us(n.recipe??n.farmingMethod??n.methodId,"recipe");return jt(l?{...c,recipe:l}:c)}let r=Us(n.recipe??n.farmingMethod??n.methodId,"recipe"),o=[{asset:n.symbol??n.asset??n.project??"farm",address:n.pool??n.address,decimals:n.decimals,amount:X(n,["amount","deposited","shares","collateral"]),price:X(n,["price","priceQuoteMinor"]),priceDecimals:n.priceDecimals,liquidationThreshold:X(n,["liquidationThresholdBps","liquidationThreshold","lltv"])??"10000"}],i=X(n,["debt","borrowed","borrowAmount"]),s=i==null||i==="0"?[]:[{asset:n.debtAsset??n.borrowSymbol??"debt",decimals:n.debtDecimals??n.decimals,amount:i,price:n.debtPrice??n.price,priceDecimals:n.debtPriceDecimals??n.priceDecimals}],a=bt({...n,protocol:"farming",collateral:o,debt:s},t);return jt(r?{...a,recipe:r}:a)}function TB(e,t={}){te(e);let n=ke(e,"snapshot"),r=MS(n);return _B[r]({...n,protocol:r},t)}function NB(e){let t=e==null?{}:ke(e,"thresholds"),n=Ft(t.criticalHealthFactorWad??NS.criticalHealthFactorWad,"thresholds.criticalHealthFactorWad",{positive:!0}),r=Ft(t.warningHealthFactorWad??NS.warningHealthFactorWad,"thresholds.warningHealthFactorWad",{positive:!0});BigInt(r)<BigInt(n)&&ae("thresholds.warningHealthFactorWad must be >= criticalHealthFactorWad");let o=Ft(t.minLiquidationBufferQuoteMinor,"thresholds.minLiquidationBufferQuoteMinor",{optional:!0});return jt({criticalHealthFactorWad:n,warningHealthFactorWad:r,minLiquidationBufferQuoteMinor:o})}function CB(e,t,n){let r=[];if(n.status!=="complete"){let a=n.reason||"UNKNOWN_EVIDENCE";return r.push(Ds(a,"critical","Position evidence is not current and complete; health fails closed.")),{healthStatus:n.status==="stale"?"stale":"unknown",findings:r,metrics:{healthFactorWad:null,totalCollateralQuoteMinor:null,totalDebtQuoteMinor:null,weightedCollateralQuoteMinor:null,liquidationBufferQuoteMinor:null,quote:null}}}let o=e;if(e.healthFactorStatus==="empty")return{healthStatus:"empty",findings:r,metrics:o};if(e.healthFactorStatus==="no-debt")return{healthStatus:"no-debt",findings:r,metrics:o};let i=BigInt(e.healthFactorWad);i<wi?r.push(Ds("LIQUIDATABLE","critical","Health factor is below 1.0 wad; the position is at or past liquidation.")):i<BigInt(t.criticalHealthFactorWad)?r.push(Ds("HEALTH_FACTOR_CRITICAL","critical","Health factor is below the configured critical threshold.")):i<BigInt(t.warningHealthFactorWad)&&r.push(Ds("HEALTH_FACTOR_WARNING","warning","Health factor is below the configured warning threshold.")),t.minLiquidationBufferQuoteMinor!=null&&BigInt(e.liquidationBufferQuoteMinor)<BigInt(t.minLiquidationBufferQuoteMinor)&&r.push(Ds("LIQUIDATION_BUFFER_LOW",i<wi?"critical":"warning","Liquidation buffer is below the configured quote-minor minimum."));let s="healthy";return r.some(a=>a.code==="LIQUIDATABLE")?s="liquidatable":r.some(a=>a.severity==="critical")?s="critical":r.length&&(s="warning"),{healthStatus:s,findings:r,metrics:o}}function xf(e={},t={}){te(e),te(t),ke(e,"input"),ke(t,"options"),t.asOf==null&&e.asOf==null&&ae("explicit asOf required","POSITION_HEALTH_MISSING_ASOF");let n=TB(e,t),r=NB(t.thresholds??e.thresholds),o=gB(n.evidence,n.observedAt,n.expiresAt,n.asOf),i=CB(o.status==="complete"?bB(n.collateral,n.debt):{healthFactorStatus:"unknown"},r,o),s={recordVersion:BS,recordType:"position-health",label:qS,posture:"alert-only",executionReady:!1,signingReady:!1,broadcastReady:!1,id:n.id,protocol:n.protocol,chain:n.chain,account:n.account,market:n.market,observedAt:n.observedAt,expiresAt:n.expiresAt,asOf:n.asOf,evidence:n.evidence,collateral:n.collateral,debt:n.debt,thresholds:r,healthStatus:i.healthStatus,healthFactorWad:i.metrics.healthFactorWad,totalCollateralQuoteMinor:i.metrics.totalCollateralQuoteMinor,totalDebtQuoteMinor:i.metrics.totalDebtQuoteMinor,weightedCollateralQuoteMinor:i.metrics.weightedCollateralQuoteMinor,liquidationBufferQuoteMinor:i.metrics.liquidationBufferQuoteMinor,quote:i.metrics.quote,findings:jS(i.findings)};return n.tenantId&&(s.tenantId=n.tenantId),n.recipe&&(s.recipe=n.recipe),jt(s)}function HS(e={},t={}){te(e),te(t);let n=Array.isArray(e)?{snapshots:e}:ke(e,"input"),r=n.snapshots??n.positions;Array.isArray(r)||ae("snapshots must be an array"),r.length>PS&&ae(`snapshots exceed ${PS}`);let o=Ft(t.asOf??n.asOf,"asOf"),i=t.thresholds??n.thresholds,s=Us(n.tenantId,"tenantId"),a=r.map((p,f)=>xf(s&&p?.tenantId==null?{...p,tenantId:s}:p,{...t,asOf:o,thresholds:i,index:f})).sort((p,f)=>ho(p.chain,f.chain)||ho(p.account,f.account)||ho(p.id,f.id)),c=jS(a.flatMap(p=>p.findings.map(f=>({...f,positionId:p.id})))),l=a.filter(p=>p.healthStatus==="unknown"||p.healthStatus==="stale").length,u=a.filter(p=>p.findings.length>0).length,d={recordVersion:BS,recordType:"position-health-book",label:qS,posture:"alert-only",asOf:o,positionCount:String(a.length),alertCount:String(u),failClosedCount:String(l),positions:a,findings:c};return s&&(d.tenantId=s),jt(d)}var BS,qS,aB,NS,cB,lB,uB,dB,wi,CS,RS,PS,vf,_B,zS=T(()=>{yi();BS=1,qS="Alert findings only; not an execution signal and not a live oracle.",aB=Object.freeze(["aave-v3","morpho","compound","solend","spark","farming","generic"]),NS=Object.freeze({criticalHealthFactorWad:"1050000000000000000",warningHealthFactorWad:"1250000000000000000"}),cB=new Set(aB),lB=Object.freeze({aave:"aave-v3",aavev3:"aave-v3","aave-v3":"aave-v3",morpho:"morpho",compound:"compound","compound-v2":"compound","compound-v3":"compound",solend:"solend",save:"solend",spark:"spark","spark-lend":"spark",farming:"farming",farm:"farming",yield:"farming",generic:"generic",lending:"generic"}),uB=new Set(["complete","incomplete","unknown","stale"]),dB=/[\u0000-\u001f\u007f]/,wi=10n**18n,CS=36,RS=64,PS=128,vf=class extends Error{constructor(t,n="POSITION_HEALTH_INVALID"){super(`position health: ${t}`),this.name="PositionHealthValidationError",this.code=n}};_B=Object.freeze({"aave-v3":SB,morpho:vB,compound:xB,solend:IB,spark:kB,farming:OB,generic:bt})});function Re(e,t){throw new If(e,t)}function yo(e){if(e&&typeof e=="object"&&!Object.isFrozen(e)){for(let t of Object.values(e))yo(t);Object.freeze(e)}return e}function cr(e,t){return(!e||typeof e!="object"||Array.isArray(e)||Object.getPrototypeOf(e)!==Object.prototype)&&Re(`${t} must be a plain object`),e}function Ot(e,t,{optional:n=!1,lower:r=!1}={}){if(e==null&&n)return null;typeof e!="string"&&Re(`${t} must be a string`);let o=e.trim();return o||Re(`${t} is required`),MB.test(o)&&Re(`${t} contains control characters`),o.length>2048&&Re(`${t} is too long`),r?o.toLowerCase():o}function Rn(e,t,{optional:n=!1,positive:r=!1}={}){if(e==null&&n)return null;typeof e=="number"&&Re(`${t} must be an exact decimal string or BigInt; Number coercion is refused`,"GOVERNANCE_UNSAFE_NUMBER");let o;typeof e=="bigint"?o=e.toString():typeof e=="string"?o=e.trim():Re(`${t} must be an exact decimal string or BigInt`),/^\d+$/.test(o)||Re(`${t} must be a non-negative base-10 integer string`);let i=BigInt(o);return r&&i===0n&&Re(`${t} must be positive`),i.toString()}function Ei(e,t){return e==null?null:Ot(e,t)}function Mr(e,t){for(let n of t)if(e[n]!==void 0)return e[n]}function HB(e,t="action"){let n=Ot(e,t,{lower:!0});return DB.has(n)||Re(`${t} must be proposal, delegation, or vote`),n}function zB(e,t="proposal.state"){e==null&&Re(`${t} is required`,"GOVERNANCE_MISSING_PROPOSAL_STATE");let n=Ot(e,t,{lower:!0});return UB.has(n)||Re(`${t} is not a recognized proposal state`),n==="unknown"&&Re(`${t} is unknown; voting and execution fail closed`,"GOVERNANCE_UNKNOWN_PROPOSAL_STATE"),n}function VB(e){let t=Ot(e,"support",{lower:!0});return BB.has(t)||Re("support must be for, against, or abstain"),t}function al(e,{accountRequired:t=!0}={}){return yo({chain:Ot(Mr(e,["chain","chainId","network"]),"chain",{lower:!0}),governor:Ot(Mr(e,["governor","governorAddress","governance","contract"]),"governor"),account:Ot(Mr(e,["account","address","owner","voter","from","proposer"]),"account",{optional:!t})})}function qs(e,t){let n=Ei(t.tenantId??e.tenantId,"tenantId");return n?{tenantId:n}:{}}function cl(e,t,n="asOf"){return Rn(t.asOf??e.asOf,n)}function WB(e,t={}){te(e),te(t);let n=cr(e,"proposal");cr(t,"options");let r=cl(n,t),o=al(n,{accountRequired:!1}),i=Ot(Mr(n,["proposalId","id"]),"proposalId"),s=zB(Mr(n,["state","status","proposalState"])),a=Ei(n.title??n.name,"title"),c=Ei(n.description??n.body??n.summary,"description"),l=Ei(n.proposer,"proposer"),u=Rn(n.startBlock??n.start,"startBlock",{optional:!0}),d=Rn(n.endBlock??n.end,"endBlock",{optional:!0}),p=Rn(n.forVotes??n.votesFor,"forVotes",{optional:!0}),f=Rn(n.againstVotes??n.votesAgainst,"againstVotes",{optional:!0}),m=Rn(n.abstainVotes??n.votesAbstain,"abstainVotes",{optional:!0}),h={recordVersion:Bs,recordType:"governance-proposal",label:qr,asOf:r,chain:o.chain,governor:o.governor,proposalId:i,state:s,votable:FB.has(s),terminal:jB.has(s),title:a,description:c,proposer:l,startBlock:u,endBlock:d,tallies:{forVotes:p,againstVotes:f,abstainVotes:m},occurred:!1,...qs(n,t)};return yo(h)}function GB(e,t={}){te(e),te(t);let n=cr(e,"intent");cr(t,"options");let r=cl(n,t),o=al(n),i=n.mode??(n.action==="undelegate"?"undelegate":"delegate"),s=Ot(i,"mode",{lower:!0});qB.has(s)||Re("mode must be delegate or undelegate");let a=s==="undelegate"?Ei(n.delegatee??n.to,"delegatee"):Ot(n.delegatee??n.to,"delegatee"),c=Rn(Mr(n,["votingPower","votes","power","balance"]),"votingPower",{positive:!0}),l={recordVersion:Bs,recordType:"governance-delegation-intent",label:qr,action:"delegation",mode:s,asOf:r,chain:o.chain,governor:o.governor,account:o.account,delegatee:s==="undelegate"?a??o.account:a,votingPower:c,occurred:!1,...qs(n,t)};return yo(l)}function KB(e,t={}){te(e),te(t);let n=cr(e,"intent");cr(t,"options");let r=cl(n,t),o=WB(n.proposal??n,t);o.votable||Re(`proposal ${o.proposalId} is ${o.state} and is not votable`,"GOVERNANCE_PROPOSAL_NOT_VOTABLE");let i=al({...n,chain:n.chain??o.chain,governor:n.governor??o.governor}),s=VB(n.support??n.choice??n.vote),a=Rn(Mr(n,["votingPower","votes","power","weight"]),"votingPower",{positive:!0}),c=Ei(n.reason??n.comment,"reason"),l={recordVersion:Bs,recordType:"governance-vote-intent",label:qr,action:"vote",asOf:r,chain:i.chain,governor:i.governor,account:i.account,proposalId:o.proposalId,proposalState:o.state,support:s,votingPower:a,reason:c,occurred:!1,voted:!1,signed:!1,broadcast:!1,proposal:o,...qs(n,t)};return yo(l)}function YB(e,t={}){te(e);let n=cr(e,"intent"),r=cl(n,t),o=al(n),i=Ot(n.title??n.name,"title"),s=Ot(n.description??n.body,"description"),a=n.targets;(!Array.isArray(a)||a.length===0)&&Re("targets must be a non-empty array");let c=(n.values??a.map(()=>"0")).map((d,p)=>Rn(d,`values[${p}]`));c.length!==a.length&&Re("values length must match targets");let l=(n.calldatas??n.data??[]).map((d,p)=>Ot(String(d),`calldatas[${p}]`));l.length!==a.length&&Re("calldatas length must match targets");let u=Rn(Mr(n,["votingPower","proposalThreshold","threshold"]),"votingPower",{positive:!0});return yo({recordVersion:Bs,recordType:"governance-proposal-intent",label:qr,action:"proposal",asOf:r,chain:o.chain,governor:o.governor,account:o.account,title:i,description:s,targets:a.map((d,p)=>Ot(d,`targets[${p}]`)),values:c,calldatas:l,votingPower:u,occurred:!1,...qs(n,t)})}function JB(e,t,n){return e==="vote"?KB(t,n):e==="delegation"?GB(t,n):YB(t,n)}function XB(e){return e.action==="vote"?[`Unsigned vote preview for proposal ${e.proposalId} on ${e.governor}.`,`Support: ${e.support}. Voting power: ${e.votingPower} (exact base units).`,`Proposal state is ${e.proposalState}. No ballot is submitted.`,qr]:e.action==="delegation"?[`Unsigned ${e.mode} preview on ${e.governor}.`,`Account ${e.account} \u2192 ${e.delegatee}. Voting power: ${e.votingPower}.`,"No delegation transaction is signed or broadcast.",qr]:[`Unsigned proposal preview on ${e.governor}: ${e.title}.`,`${e.targets.length} target(s). Voting power: ${e.votingPower}.`,"No proposal is submitted.",qr]}function VS(e={},t={}){te(e),te(t);let n=cr(e,"intent");cr(t,"options"),t.asOf==null&&n.asOf==null&&Re("explicit asOf required","GOVERNANCE_MISSING_ASOF");let r=HB(n.action??n.type??t.action??QB(n)),o=JB(r,{...n,action:r},t);return yo({recordVersion:Bs,recordType:"governance-preview",label:qr,action:r,asOf:o.asOf,occurred:!1,voted:!1,signed:!1,broadcast:!1,executionReady:!1,signingReady:!1,broadcastReady:!1,lines:XB(o),intent:o,...qs(n,t)})}function QB(e){if(e.support!=null||e.choice!=null||e.proposalId!=null)return"vote";if(e.delegatee!=null||e.mode==="delegate"||e.mode==="undelegate")return"delegation";if(e.targets!=null||e.title!=null)return"proposal";Re("action is required")}var Bs,qr,RB,PB,LB,$B,DB,UB,BB,qB,MB,FB,jB,If,WS=T(()=>{yi();Bs=1,qr="Unsigned prepare material only; no vote, signature, or broadcast occurred.",RB=Object.freeze(["proposal","delegation","vote"]),PB=Object.freeze(["pending","active","succeeded","queued","executed","defeated","canceled","expired","unknown"]),LB=Object.freeze(["for","against","abstain"]),$B=Object.freeze(["delegate","undelegate"]),DB=new Set(RB),UB=new Set(PB),BB=new Set(LB),qB=new Set($B),MB=/[\u0000-\u001f\u007f]/,FB=new Set(["active"]),jB=new Set(["executed","defeated","canceled","expired"]),If=class extends Error{constructor(t,n="GOVERNANCE_PREPARE_INVALID"){super(`governance prepare: ${t}`),this.name="GovernancePrepareError",this.code=n}}});import{createHash as ZB}from"node:crypto";import{getAddress as eq,wordlists as tq}from"ethers";import{address as nq}from"@solana/addresses";import{base58check as rq,bech32 as GS,bech32m as oq}from"@scure/base";import{sha256 as iq}from"@noble/hashes/sha2.js";function ZS(e){return String(e).replace(/[^a-z0-9]/gi,"").toLowerCase()}function kq(e){let t=ZS(e);return yq.some(n=>t.includes(n))}function Oq(e){return xq.has(ZS(e))}function _q(e){let t=String(e).trim().toLowerCase().split(/\s+/).filter(Boolean);return Eq.has(t.length)&&t.every(n=>tq.en.getWordIndex(n)>=0)}function $n(e){let t=new WeakSet,n=0;function r(o,i,s,a=""){if(n+=1,n>dq)throw new RangeError("safety-intelligence: input is too large");if(s>pq)throw new RangeError("safety-intelligence: input is too deep");if(o==null||typeof o=="boolean")return;if(typeof o=="string"){if(o.length>fq)throw new RangeError(`safety-intelligence: string too long at ${i}`);if(gq.test(o)||bq.test(o)||_q(o))throw new TypeError(`safety-intelligence: key material refused at ${i}`);if(wq.test(o)&&!Oq(a))throw new TypeError(`safety-intelligence: key material refused at ${i}`);return}if(typeof o=="number"){if(!Number.isFinite(o))throw new TypeError(`safety-intelligence: finite number required at ${i}`);return}if(typeof o=="bigint")return;if(typeof o!="object")throw new TypeError(`safety-intelligence: JSON-like input required at ${i}`);if(ArrayBuffer.isView(o)||o instanceof ArrayBuffer)throw new TypeError(`safety-intelligence: binary key material refused at ${i}`);if(t.has(o))throw new TypeError(`safety-intelligence: cyclic input refused at ${i}`);if(t.add(o),Array.isArray(o)){if(o.length>Ms)throw new RangeError(`safety-intelligence: array too large at ${i}`);if(o.length===64&&o.every(l=>Number.isInteger(l)&&l>=0&&l<=255))throw new TypeError(`safety-intelligence: key material refused at ${i}`);o.forEach((l,u)=>r(l,`${i}[${u}]`,s+1,a)),t.delete(o);return}if(Object.getPrototypeOf(o)!==Object.prototype)throw new TypeError(`safety-intelligence: plain object required at ${i}`);let c=Reflect.ownKeys(o).filter(l=>typeof l=="string");if(c.length>64)throw new RangeError(`safety-intelligence: too many fields at ${i}`);for(let l of c){if(kq(l))throw new TypeError(`safety-intelligence: secret-bearing field refused at ${i}.${l}`);let u=Object.getOwnPropertyDescriptor(o,l),d=u&&"get"in u&&typeof u.get=="function"?u.get.call(o):o[l];d!==void 0&&r(d,`${i}.${l}`,s+1,l)}t.delete(o)}return r(e,"$",0),e}function wt(e,t,n){for(let r of Object.keys(e||{}))if(!t.has(r))throw new TypeError(`safety-intelligence: unknown ${n} field ${r}`)}function lr(e,t,n,{required:r=!1}={}){if(e==null||e===""){if(r)throw new TypeError(`safety-intelligence: ${t} required`);return null}let o=String(e).trim();if(!o&&r)throw new TypeError(`safety-intelligence: ${t} required`);if(o.length>n)throw new RangeError(`safety-intelligence: ${t} exceeds ${n} characters`);if(/[\u0000-\u001f\u007f\u200b-\u200f\u202a-\u202e\u2060-\u2064\ufeff]/i.test(o))throw new TypeError(`safety-intelligence: control or invisible characters refused in ${t}`);return o||null}function ll(e,t){if(e==null||e==="")throw new TypeError(`safety-intelligence: ${t} required`);let n;if(typeof e=="number"){if(!Number.isSafeInteger(e)||e<0)throw new TypeError(`safety-intelligence: ${t} must be a safe integer millisecond timestamp`);n=e}else if(typeof e=="string"){let r=e.trim();if(Sq.test(r)&&r.length<=vq){if(n=Number(r),!Number.isSafeInteger(n))throw new TypeError(`safety-intelligence: ${t} must be a safe integer millisecond timestamp`)}else if(Aq.test(r)){if(n=Date.parse(r),!Number.isFinite(n)||new Date(n).toISOString().replace(/\.000Z$/,"Z")!==r&&new Date(n).toISOString()!==r)throw new TypeError(`safety-intelligence: ${t} must be a canonical ISO timestamp`)}else throw new TypeError(`safety-intelligence: ${t} must be a canonical ISO timestamp or integer milliseconds`)}else throw new TypeError(`safety-intelligence: ${t} must be a timestamp`);if(!Number.isFinite(n))throw new TypeError(`safety-intelligence: ${t} must be a valid timestamp`);return{ms:n,iso:new Date(n).toISOString()}}function ev(e,t){return e==null||e===""?null:ll(e,t)}function XS(e){let t=String(e||"").trim().toLowerCase();if(t==="evm"||t==="eip155")return"evm";if(t==="solana")return"solana";if(t==="bitcoin"||t==="bip122"||t==="btc")return"bitcoin";throw new TypeError("safety-intelligence: chain family must be evm, solana, or bitcoin")}function tv(e){$n(e);let t,n;if(Number.isInteger(e))t="evm",n=e;else if(typeof e=="string"){let i=e.trim();if(/^\d+$/.test(i))t="evm",n=Number(i);else{let s=/^(eip155|evm|solana|bitcoin|bip122|btc):([^:]+)$/i.exec(i);if(!s)throw new TypeError("safety-intelligence: chain must include a supported family");t=XS(s[1]),n=s[2]}}else if(e&&typeof e=="object"&&!Array.isArray(e))wt(e,new Set(["family","namespace","chainId","reference","network","key"]),"chain"),t=XS(e.family??e.namespace??(e.chainId!=null?"evm":"")),n=t==="evm"?e.chainId??e.reference:e.network??e.reference;else throw new TypeError("safety-intelligence: chain required");if(t==="evm"){let i=typeof n=="string"&&/^\d+$/.test(n)?Number(n):n;if(!Number.isSafeInteger(i)||i<=0)throw new TypeError("safety-intelligence: EVM chainId must be a positive safe integer");return He({family:t,namespace:"eip155",reference:String(i),chainId:i,key:`eip155:${i}`})}let r=lr(n,`${t} network`,80,{required:!0}).toLowerCase();if(!/^[a-z0-9][a-z0-9._-]*$/.test(r))throw new TypeError(`safety-intelligence: invalid ${t} network`);let o=t==="bitcoin"?"bip122":"solana";return He({family:t,namespace:o,reference:r,network:r,key:`${o}:${r}`})}function Tq(e){let t=String(e).toLowerCase();return["mainnet","main","bitcoin"].includes(t)?"mainnet":["testnet","testnet3","test","signet"].includes(t)?"testnet":t==="regtest"?"regtest":"unknown"}function Nq(e,t){let n=lr(e,"bitcoin address",100,{required:!0}),r=Tq(t.reference);if(/^(bc1|tb1|bcrt1)/i.test(n)){if(n!==n.toLowerCase()&&n!==n.toUpperCase())throw new TypeError("safety-intelligence: mixed-case Bitcoin bech32 address refused");let s=n.toLowerCase(),a,c;try{a=GS.decode(s,100),c="bech32"}catch{try{a=oq.decode(s,100),c="bech32m"}catch{throw new TypeError("safety-intelligence: invalid Bitcoin bech32 checksum")}}let l=a.words[0],u;try{u=GS.fromWords(a.words.slice(1))}catch{throw new TypeError("safety-intelligence: invalid Bitcoin witness program")}if(!Number.isInteger(l)||l<0||l>16||u.length<2||u.length>40)throw new TypeError("safety-intelligence: invalid Bitcoin witness program");if(l===0&&(c!=="bech32"||![20,32].includes(u.length)))throw new TypeError("safety-intelligence: invalid v0 Bitcoin witness address");if(l>0&&c!=="bech32m")throw new TypeError("safety-intelligence: v1+ Bitcoin witness address must use bech32m");let d=r==="mainnet"?"bc":r==="testnet"?"tb":r==="regtest"?"bcrt":null;if(d&&a.prefix!==d)throw new TypeError(`safety-intelligence: Bitcoin address does not match ${t.reference}`);return{canonical:s,display:s}}let o;try{o=hq.decode(n)}catch{throw new TypeError("safety-intelligence: invalid Bitcoin base58check address")}if(o.length!==21)throw new TypeError("safety-intelligence: invalid Bitcoin address payload");let i=o[0];if(r==="mainnet"&&![0,5].includes(i))throw new TypeError("safety-intelligence: Bitcoin address does not match mainnet");if((r==="testnet"||r==="regtest")&&![111,196].includes(i))throw new TypeError(`safety-intelligence: Bitcoin address does not match ${t.reference}`);return{canonical:n,display:n}}function Cq(e,t){let n=tv(t);$n(e);let r=lr(e,`${n.family} address`,128,{required:!0});if(n.family==="evm"){let o=r.startsWith("0X")?`0x${r.slice(2)}`:r,i;try{i=eq(o)}catch{throw new TypeError("safety-intelligence: invalid EVM address or mixed-case checksum")}return He({canonical:i.toLowerCase(),display:i})}if(n.family==="solana"){let o;try{o=String(nq(r))}catch{throw new TypeError("safety-intelligence: invalid Solana address")}return He({canonical:o,display:o})}return He(Nq(r,n))}function ur(e={}){if($n(e),!e||typeof e!="object"||Array.isArray(e))throw new TypeError("safety-intelligence: target object required");wt(e,new Set(["chain","chainId","family","network","address","displayAddress","key"]),"target");let t=e.chain??(e.chainId!=null?{family:e.family??"evm",chainId:e.chainId}:{family:e.family,network:e.network}),n=tv(t),r=Cq(e.address,n);return He({chain:n,address:r.canonical,displayAddress:r.display,key:`${n.key}:${r.canonical}`})}function Ln(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(Ln).join(",")}]`:`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${Ln(e[t])}`).join(",")}}`}function _f(e){return ZB("sha256").update(e).digest("hex")}function He(e){if(!e||typeof e!="object"||Object.isFrozen(e))return e;for(let t of Object.values(e))He(t);return Object.freeze(e)}function kf(e){let t=String(e||"").trim().toLowerCase().replace(/_/g,"-"),r={sanction:"sanctions",sanctions:"sanctions",phishing:"phishing",scam:"scam",fraud:"scam",poisoning:"address-poisoning","address-poisoning":"address-poisoning"}[t];if(!r||!cq.has(r))throw new TypeError(`safety-intelligence: unsupported evidence kind ${String(e||"<missing>")}`);return r}function Rq(e){let t=e.verdict??e.disposition??e.result??e.status;if(t==null){for(let o of["match","listed","malicious"])if(typeof e[o]=="boolean"){t=e[o]?"MATCH":"NO_MATCH";break}}let n=String(t||"").trim().toUpperCase().replace(/[ -]+/g,"_"),r=Iq[n];if(!r)throw new TypeError(`safety-intelligence: unsupported evidence verdict ${String(t||"<missing>")}`);return r}function Pq(e,t){let n=e.target??(e.address!=null?{address:e.address,chain:e.chain,chainId:e.chainId,family:e.family,network:e.network}:null);if(!n){if(!t)throw new TypeError("safety-intelligence: evidence target required");return t}return ur(n)}function Lq(e={},t={}){if($n({input:e,options:t}),!e||typeof e!="object"||Array.isArray(e))throw new TypeError("safety-intelligence: evidence object required");wt(e,new Set(["kind","type","category","source","sourceRecordId","recordId","reference","verdict","disposition","result","status","match","listed","malicious","confidence","fetchedAt","expiresAt","expiry","ttlMs","summary","target","address","chain","chainId","family","network"]),"evidence"),wt(t,new Set(["target","asOf"]),"evidence option");let n=Pq(e,t.target?ur(t.target):null),r=kf(e.kind??e.type??e.category),o=Rq(e),i=e.source&&typeof e.source=="object"?e.source.name??e.source.id:e.source,s=lr(i,"evidence source",120,{required:!0}),a=Number(e.confidence);if(!Number.isFinite(a)||a<0||a>1)throw new TypeError("safety-intelligence: evidence confidence must be between 0 and 1");let c=ll(e.fetchedAt,"evidence fetchedAt"),l=ev(e.expiresAt??e.expiry,"evidence expiresAt");if(!l&&e.ttlMs!=null){let y=Number(e.ttlMs);if(!Number.isSafeInteger(y)||y<=0||y>YS)throw new RangeError(`safety-intelligence: evidence ttlMs must be 1..${YS}`);l={ms:c.ms+y,iso:new Date(c.ms+y).toISOString()}}if(!l)throw new TypeError("safety-intelligence: evidence expiresAt or ttlMs required");if(l.ms<=c.ms)throw new TypeError("safety-intelligence: evidence expiry must be after fetchedAt");if(t.asOf==null)throw new TypeError("safety-intelligence: explicit asOf required for deterministic freshness");let u=ll(t.asOf,"asOf").ms,d=c.ms>u+mq?"FUTURE":l.ms<=u?"STALE":"CURRENT",p=lr(e.sourceRecordId??e.recordId??e.reference,"source record id",160),f=lr(e.summary,"evidence summary",500),m={kind:r,verdict:o,source:s,...p?{sourceRecordId:p}:{},fetchedAt:c.iso,expiresAt:l.iso,confidence:a,freshness:d,target:n.key,...f?{summary:f}:{}},h=`safety-evidence:${_f(Ln(m))}`;return He({id:h,...m})}function $q(e=[],t={}){if($n({records:e,options:t}),!Array.isArray(e))throw new TypeError("safety-intelligence: evidence must be an array");let n=t.maxEvidence??lq;if(!Number.isSafeInteger(n)||n<=0||n>Ms)throw new RangeError("safety-intelligence: invalid maxEvidence");if(e.length>n)throw new RangeError(`safety-intelligence: evidence exceeds ${n} records`);wt(t,new Set(["target","asOf","maxEvidence"]),"evidence-set option");let r={target:t.target,asOf:t.asOf},o=new Map(e.map(i=>{let s=Lq(i,r);return[s.id,s]}));return He([...o.values()].sort((i,s)=>i.id.localeCompare(s.id)))}function Dq(e,t,n){if(!e||typeof e!="object"||Array.isArray(e))throw new TypeError(`safety-intelligence: knownContacts[${n}] must be an object`);wt(e,new Set(["id","label","address","chain","chainId","family","network"]),"contact");let r=ur({address:e.address,chain:e.chain??(e.chainId!=null?{family:e.family??"evm",chainId:e.chainId}:e.family||e.network?{family:e.family,network:e.network}:t)}),o=lr(e.id,"contact id",120),i=lr(e.label,"contact label",120);return He({...o?{id:o}:{},...i?{label:i}:{},target:r})}function ul(e,t){if(typeof e=="number"&&(!Number.isSafeInteger(e)||e<0))throw new TypeError(`safety-intelligence: ${t} must be an exact non-negative integer`);let n=typeof e=="bigint"?e.toString():String(e??"").trim();if(!/^\d+$/.test(n)||n.length>100)throw new TypeError(`safety-intelligence: ${t} must be a bounded base-unit integer`);return BigInt(n).toString()}function Uq(e,t,n){if(!e||typeof e!="object"||Array.isArray(e))throw new TypeError(`safety-intelligence: observations[${n}] must be an object`);wt(e,new Set(["address","counterparty","from","direction","amountBaseUnits","chain","chainId","family","network","observedAt"]),"observation");let r=e.counterparty??e.address??e.from,o=ur({address:r,chain:e.chain??(e.chainId!=null?{family:e.family??"evm",chainId:e.chainId}:e.family||e.network?{family:e.family,network:e.network}:t)}),i=String(e.direction??(e.from!=null?"inbound":"unknown")).toLowerCase(),s=["inbound","received","receive"].includes(i)?"inbound":["outbound","sent","send"].includes(i)?"outbound":"unknown",a=ul(e.amountBaseUnits,`observations[${n}].amountBaseUnits`),c=ev(e.observedAt,`observations[${n}].observedAt`)?.iso??null;return He({target:o,direction:s,amountBaseUnits:a,...c?{observedAt:c}:{}})}function Bq(e,t){let n=0;for(;n<e.length&&n<t.length&&e[n]===t[n];)n+=1;return n}function qq(e,t){let n=0;for(;n<e.length&&n<t.length&&e[e.length-1-n]===t[t.length-1-n];)n+=1;return n}function QS(e){return e.chain.family==="evm"?e.address.slice(2):e.address}function Pn(e){return He({code:e.code,severity:e.severity,category:e.category,basis:e.basis,message:e.message,...e.evidenceIds?.length?{evidenceIds:[...e.evidenceIds].sort()}:{},...e.relatedTargets?.length?{relatedTargets:[...e.relatedTargets].sort()}:{}})}function Of(e){let t=new Map;for(let n of e){let r=Ln(n);t.set(r,n)}return[...t.values()].sort((n,r)=>(JS[n.severity]??9)-(JS[r.severity]??9)||n.category.localeCompare(r.category)||n.code.localeCompare(r.code)||Ln(n).localeCompare(Ln(r)))}function Mq(e={},t={}){if($n({input:e,options:t}),!e||typeof e!="object"||Array.isArray(e))throw new TypeError("safety-intelligence: poisoning input object required");wt(e,new Set(["target","address","chain","chainId","family","network","knownContacts","expectedContact","observations","dustThresholdBaseUnits","lookalikeEdgeChars"]),"poisoning input"),wt(t,new Set(["maxContacts","maxObservations"]),"poisoning option");let n=ur(e.target??{address:e.address,chain:e.chain,chainId:e.chainId,family:e.family,network:e.network}),r=e.knownContacts??[],o=e.observations??[];if(!Array.isArray(r))throw new TypeError("safety-intelligence: knownContacts must be an array");if(!Array.isArray(o))throw new TypeError("safety-intelligence: observations must be an array");let i=t.maxContacts??uq,s=t.maxObservations??Ms;if(!Number.isSafeInteger(i)||i<=0||i>Ms)throw new RangeError("safety-intelligence: invalid maxContacts");if(!Number.isSafeInteger(s)||s<=0||s>Ms)throw new RangeError("safety-intelligence: invalid maxObservations");if(r.length>i)throw new RangeError(`safety-intelligence: knownContacts exceeds ${i}`);if(o.length>s)throw new RangeError(`safety-intelligence: observations exceeds ${s}`);let a=r.map((f,m)=>Dq(f,n.chain,m)).sort((f,m)=>f.target.key.localeCompare(m.target.key)||String(f.id||f.label||"").localeCompare(String(m.id||m.label||""))),c=o.map((f,m)=>Uq(f,n.chain,m)).sort((f,m)=>Ln(f).localeCompare(Ln(m))),l=a.filter(f=>f.target.chain.key===n.chain.key),u=l.filter(f=>f.target.address===n.address),d=[],p=null;if(e.expectedContact!=null){if(typeof e.expectedContact=="string")p=ur({chain:n.chain,address:e.expectedContact});else if(typeof e.expectedContact=="object"&&!Array.isArray(e.expectedContact))wt(e.expectedContact,new Set(["address","chain","chainId","family","network"]),"expectedContact"),p=ur({address:e.expectedContact.address,chain:e.expectedContact.chain??(e.expectedContact.chainId!=null?{family:e.expectedContact.family??"evm",chainId:e.expectedContact.chainId}:e.expectedContact.family||e.expectedContact.network?{family:e.expectedContact.family,network:e.expectedContact.network}:n.chain)});else throw new TypeError("safety-intelligence: expectedContact must be an address or target object");p.key!==n.key&&d.push(Pn({code:"EXPECTED_CONTACT_MISMATCH",severity:"REVIEW",category:"address-poisoning",basis:"contact-match",message:"Destination does not exactly match the caller-supplied expected contact.",relatedTargets:[p.key,n.key]}))}if(u.length===0){let f=Number(e.lookalikeEdgeChars??4);if(!Number.isSafeInteger(f)||f<3||f>12)throw new RangeError("safety-intelligence: lookalikeEdgeChars must be 3..12");let m=QS(n);for(let h of l){let y=QS(h.target),g=Bq(m,y),E=qq(m,y);g>=f&&E>=f&&m!==y&&d.push(Pn({code:"ADDRESS_LOOKALIKE",severity:"REVIEW",category:"address-poisoning",basis:"heuristic",message:`Destination shares at least ${f} leading and trailing characters with a different known contact.`,relatedTargets:[h.target.key,n.key]}))}if(e.dustThresholdBaseUnits!=null){let h=BigInt(ul(e.dustThresholdBaseUnits,"dustThresholdBaseUnits"));c.filter(g=>g.target.key===n.key&&g.direction==="inbound"&&BigInt(g.amountBaseUnits)<=h).length>0&&d.push(Pn({code:"PRIOR_DUST_CONTACT",severity:"REVIEW",category:"address-poisoning",basis:"heuristic",message:"Destination appeared as an inbound counterparty at or below the caller-supplied base-unit dust threshold.",relatedTargets:[n.key]}))}}return He({target:n,exactKnownContact:u.length>0,exactContacts:u,findings:Of(d),dustThresholdBaseUnits:e.dustThresholdBaseUnits==null?null:ul(e.dustThresholdBaseUnits,"dustThresholdBaseUnits")})}function Fq(e){let t=e??aq;if(!Array.isArray(t)||t.length===0||t.length>32)throw new TypeError("safety-intelligence: requiredChecks must be a non-empty bounded array");let n=t.map((o,i)=>{if(typeof o=="string")return{kind:kf(o),source:null};if(!o||typeof o!="object"||Array.isArray(o))throw new TypeError(`safety-intelligence: requiredChecks[${i}] must be a kind or object`);return wt(o,new Set(["kind","source"]),"required check"),{kind:kf(o.kind),source:lr(o.source,"required check source",120,{required:!0})}}),r=new Map(n.map(o=>[`${o.kind}:${o.source||"*"}`,o]));return He([...r.values()].sort((o,i)=>`${o.kind}:${o.source||"*"}`.localeCompare(`${i.kind}:${i.source||"*"}`)))}function jq(e,t){return e.filter(n=>n.kind===t.kind&&(!t.source||n.source===t.source))}function Hq(e){return e.some(t=>t.severity==="BLOCK")?"BLOCK":e.some(t=>t.severity==="REVIEW")?"REVIEW":e.some(t=>t.severity==="UNKNOWN")?"UNKNOWN":"CLEAR"}function nv(e){return $n(e),`sha256:${_f(Ln(e))}`}function Tf(e={},t={}){if($n({input:e,options:t}),!e||typeof e!="object"||Array.isArray(e))throw new TypeError("safety-intelligence: evaluation input object required");if(wt(e,new Set(["target","address","chain","chainId","family","network","evidence","requiredChecks","knownContacts","expectedContact","observations","dustThresholdBaseUnits","lookalikeEdgeChars"]),"evaluation input"),wt(t,new Set(["asOf","minClearConfidence","minBlockConfidence","maxEvidence","maxContacts","maxObservations"]),"evaluation option"),t.asOf==null)throw new TypeError("safety-intelligence: explicit asOf required for deterministic evaluation");let n=ll(t.asOf,"asOf").iso,r=e.target??{address:e.address,chain:e.chain,chainId:e.chainId,family:e.family,network:e.network},o=ur(r),i=Number(t.minClearConfidence??.8),s=Number(t.minBlockConfidence??.8);for(let[y,g]of[["minClearConfidence",i],["minBlockConfidence",s]])if(!Number.isFinite(g)||g<0||g>1)throw new TypeError(`safety-intelligence: ${y} must be between 0 and 1`);let a=$q(e.evidence??[],{target:o,asOf:n,maxEvidence:t.maxEvidence}),c=a.filter(y=>y.target===o.key),l=Fq(e.requiredChecks),u=[];for(let y of c)y.freshness==="CURRENT"&&y.verdict==="BLOCK"?u.push(Pn({code:y.confidence>=s?"CURRENT_EXPLICIT_BLOCK":"LOW_CONFIDENCE_BLOCK_SIGNAL",severity:y.confidence>=s?"BLOCK":"REVIEW",category:y.kind,basis:"explicit-evidence",message:y.confidence>=s?"A current injected source returned an explicit BLOCK disposition.":"A current injected source returned BLOCK below the configured block-confidence threshold.",evidenceIds:[y.id]})):y.freshness==="CURRENT"&&y.verdict==="REVIEW"?u.push(Pn({code:"CURRENT_EXPLICIT_REVIEW",severity:"REVIEW",category:y.kind,basis:"explicit-evidence",message:"A current injected source returned an explicit REVIEW disposition.",evidenceIds:[y.id]})):y.freshness!=="CURRENT"&&["BLOCK","REVIEW"].includes(y.verdict)?u.push(Pn({code:y.freshness==="FUTURE"?"FUTURE_POSITIVE_EVIDENCE":"STALE_POSITIVE_EVIDENCE",severity:"REVIEW",category:y.kind,basis:"explicit-evidence",message:"Non-current injected adverse evidence requires human review; it is not treated as a current fact.",evidenceIds:[y.id]})):y.freshness==="CURRENT"&&y.verdict==="UNKNOWN"&&u.push(Pn({code:"SOURCE_UNKNOWN",severity:"UNKNOWN",category:y.kind,basis:"explicit-evidence",message:"A current injected source could not determine a disposition.",evidenceIds:[y.id]}));for(let y of l){let g=jq(c,y),E=g.filter(I=>I.freshness==="CURRENT"),v=E.filter(I=>I.verdict==="CLEAR"&&I.confidence>=i),S=E.filter(I=>I.verdict==="BLOCK");if(v.length>0&&S.length>0&&u.push(Pn({code:"CONTRADICTORY_EVIDENCE",severity:"REVIEW",category:y.kind,basis:"explicit-evidence",message:"Current injected sources conflict for a required check.",evidenceIds:[...v,...S].map(I=>I.id)})),v.length===0){let I=E.filter(w=>w.verdict==="CLEAR"),k=g.filter(w=>w.verdict==="CLEAR"&&w.freshness!=="CURRENT"),A=y.source?`${y.kind} from ${y.source}`:y.kind;u.push(Pn({code:I.length>0?"CLEAR_CONFIDENCE_TOO_LOW":k.length>0?"STALE_CLEAR_EVIDENCE":"MISSING_CURRENT_EVIDENCE",severity:"UNKNOWN",category:y.kind,basis:"coverage",message:`Required check ${A} lacks current explicit CLEAR evidence at the configured confidence threshold.`,evidenceIds:[...I,...k].map(w=>w.id)}))}}let d=Mq({target:o,knownContacts:e.knownContacts??[],expectedContact:e.expectedContact,observations:e.observations??[],dustThresholdBaseUnits:e.dustThresholdBaseUnits,lookalikeEdgeChars:e.lookalikeEdgeChars},{maxContacts:t.maxContacts,maxObservations:t.maxObservations});u.push(...d.findings);let p=Of(u),f=Hq(p);f==="CLEAR"&&(p=Of([Pn({code:"REQUIRED_EVIDENCE_CURRENT_CLEAR",severity:"INFO",category:"coverage",basis:"explicit-evidence",message:"Every required injected check supplied current explicit CLEAR evidence; this is source-scoped and not a safety guarantee.",evidenceIds:c.filter(y=>y.freshness==="CURRENT"&&y.verdict==="CLEAR").map(y=>y.id)})]),f="CLEAR");let m={version:KS,target:o.key,evaluatedAt:n,decision:f,gate:f==="CLEAR"?"CONTINUE":f==="BLOCK"?"BLOCK":"HOLD",requiredChecks:l,evidenceIds:c.map(y=>y.id).sort(),findings:p},h=He({...m,hash:nv(m)});return He({version:KS,target:o,evaluatedAt:n,status:f,evidence:a,requiredChecks:l,poisoning:d,policy:h})}function zq(e={}){if($n(e),!e||typeof e!="object"||Array.isArray(e))throw new TypeError("safety-intelligence: transaction object required");wt(e,new Set(["target","to","destination","address","chain","chainId","family","network","amountBaseUnits","valueBaseUnits"]),"transaction");let t=ur(e.target??{address:e.to??e.destination??e.address,chain:e.chain,chainId:e.chainId,family:e.family,network:e.network}),n=e.amountBaseUnits??e.valueBaseUnits,r=n==null?null:ul(n,"transaction amountBaseUnits"),o={target:t,amountBaseUnits:r};return He({id:`safety-transaction:${_f(Ln(o))}`,...o})}function rv(e={},t={}){if($n({input:e,options:t}),!e||typeof e!="object"||Array.isArray(e))throw new TypeError("safety-intelligence: transaction evaluation input object required");wt(e,new Set(["transaction","evidence","requiredChecks","knownContacts","expectedContact","observations","dustThresholdBaseUnits","lookalikeEdgeChars"]),"transaction evaluation input");let n=zq(e.transaction),r=Tf({target:n.target,evidence:e.evidence??[],requiredChecks:e.requiredChecks,knownContacts:e.knownContacts??[],expectedContact:e.expectedContact,observations:e.observations??[],dustThresholdBaseUnits:e.dustThresholdBaseUnits,lookalikeEdgeChars:e.lookalikeEdgeChars},t),{hash:o,...i}=r.policy,s={...i,transactionId:n.id},a=He({...s,hash:nv(s)});return He({...r,transaction:n,policy:a})}var KS,PV,sq,aq,cq,lq,uq,Ms,dq,pq,fq,YS,mq,hq,yq,gq,bq,wq,Eq,Aq,Sq,vq,xq,Iq,JS,ov=T(()=>{KS=1,PV=Object.freeze({CLEAR:"CLEAR",UNKNOWN:"UNKNOWN",REVIEW:"REVIEW",BLOCK:"BLOCK"}),sq=Object.freeze(["sanctions","phishing","scam","address-poisoning"]),aq=Object.freeze(["sanctions","phishing","scam"]),cq=new Set(sq),lq=128,uq=256,Ms=512,dq=4096,pq=8,fq=2048,YS=366*24*60*60*1e3,mq=6e4,hq=rq(iq),yq=["privatekey","privkey","secretkey","secret","seedphrase","seed","mnemonic","passphrase","password","keystore","keymaterial","wif","xprv","xpriv","apikey","bearer","authorization","credential"],gq=/\b[5KL][1-9A-HJ-NP-Za-km-z]{50,51}\b/,bq=/\bxprv[0-9A-Za-z]{50,}\b/,wq=/^\s*(?:0x)?[0-9a-fA-F]{64}\s*$/,Eq=new Set([12,15,18,21,24]),Aq=/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d{3})?Z$/,Sq=/^\d+$/,vq=String(Number.MAX_SAFE_INTEGER).length,xq=new Set(["txhash","transactionhash","recordid","hash","digest","evidenceid","sourcerecordid","blockhash","receipthash","commithash","payloadhash","sha256","sha256hex","id"]),Iq=Object.freeze({CLEAR:"CLEAR",NO_MATCH:"CLEAR",NOT_LISTED:"CLEAR",ABSENT:"CLEAR",REVIEW:"REVIEW",SUSPECTED:"REVIEW",POSSIBLE_MATCH:"REVIEW",INCONCLUSIVE:"REVIEW",BLOCK:"BLOCK",MATCH:"BLOCK",LISTED:"BLOCK",MALICIOUS:"BLOCK",PHISHING:"BLOCK",SCAM:"BLOCK",UNKNOWN:"UNKNOWN",UNAVAILABLE:"UNKNOWN",ERROR:"UNKNOWN"}),JS=Object.freeze({BLOCK:0,REVIEW:1,UNKNOWN:2,INFO:3})});var $V,DV,UV,iv=T(()=>{$V=Object.freeze(["chainId","agentAddress","accountAddress","actions","targets","maxValueWei","maxGasWei","maxSlippageBps","expiresAt","nonce","revocationKey"]),DV=Object.freeze(["read","simulate"]),UV=1440*60});function sv(e){let t=String(e),n=t.toLowerCase().replace(/[\s._-]+/g,"");return Vq.test(t)||Wq.includes(n)}function go(e,t="$",n=new Set,r=""){if(e==null)return e;if(typeof e=="string"){let o=Kq.includes(String(r).toLowerCase().replace(/[_-]/g,""));for(let{rule:i,re:s}of Gq)if(!(o&&i.startsWith("raw-32-byte-hex"))&&s.test(e))throw new Fs(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"&&sv(o))throw new Fs(`${t}[${JSON.stringify(o)}]`,"forbidden-key-name");go(o,`${t}[key]`,n),go(i,`${t}[${String(o)}]`,n)}return e}if(e instanceof Set){let o=0;for(let i of e.values())go(i,`${t}[${o++}]`,n);return e}if(Array.isArray(e))return e.forEach((o,i)=>go(o,`${t}[${i}]`,n)),e;for(let[o,i]of Object.entries(e)){if(sv(o))throw new Fs(`${t}.${o}`,"forbidden-key-name");go(i,`${t}.${o}`,n,o)}return e}var Fs,Vq,Wq,Gq,Kq,av=T(()=>{iv();Fs=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}},Vq=/(private[_-]?key|secret|bearer|keystore|mnemonic|seed[_-]?phrase|passphrase|password|api[_-]?key|access[_-]?token|auth[_-]?token|session[_-]?token|signer[_-]?url|signature)/i,Wq=Object.freeze(["privkey","wif","xprv","seed"]);Gq=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}]),Kq=Object.freeze(["grantid","id","hash","sha256","sha256hex","checksum","txhash","transactionhash","blockhash","digest","userophash","commithash","prevhash","intenthash","canonicalhash","payloadhash","requestid"])});import{createHash as Yq}from"node:crypto";function Cf(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(Cf).join(",")}]`:`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${Cf(e[t])}`).join(",")}}`}function Jq(e){return e===void 0?null:JSON.parse(JSON.stringify(e))}function dl(e){if(e&&typeof e=="object"&&!Object.isFrozen(e)){Object.freeze(e);for(let t of Object.values(e))dl(t)}return e}function Rf(e,t="fact"){try{go(e,t)}catch{throw new Error(`${t} contains custody material and is forbidden`)}}function uv(e){return Yq("sha256").update(Cf(e)).digest("hex")}function dv({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:Jq(n)};return dl({...s,hash:uv(s)})}function pl({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");Rf(t,"intent");let r=dv({tradeId:e,state:"intent",fact:t,asOf:n,previousHash:null,external:!1});return dl({tradeId:e,state:"intent",events:[r],headHash:r.hash,custody:"none",execution:"prepare-only"})}function pv(e,t,n,r={}){if(Pf(e),!(cv[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`);Rf(n,t);let i=r.external===!0||r.externallySupplied===!0;if(lv.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=dv({tradeId:e.tradeId,state:t,fact:n,asOf:a,previousHash:s.hash,external:i});return dl({...e,state:t,events:[...e.events,c],headHash:c.hash})}function Pf(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(uv(i)!==o)throw new Error(`trade event ${n} hash mismatch`);if(Rf(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&&!cv[t.state]?.includes(r.state))throw new Error(`invalid recorded transition ${t.state} -> ${r.state}`);if(lv.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 Nf,cv,lv,Lf=T(()=>{av();Nf=Object.freeze(["intent","quote_comparison","simulation","prepared","approval","signed","broadcast","settlement","balance_delta","position"]),cv=Object.freeze(Object.fromEntries(Nf.map((e,t)=>[e,Object.freeze(t+1<Nf.length?[Nf[t+1]]:[])]))),lv=new Set(["signed","broadcast"])});function fv(e){let t=String(e?.type??e?.surface??e?.kind??"").toLowerCase();return Xq[t]??t}function Qq(e,t){return String(e?.id??e?.signalId??e?.asset??e?.market??e?.pool??e?.collection??`${fv(e)}:${t}`)}function Xt(e,t,n,r=!0){!r||n===null||!Number.isFinite(n)||e.push({feature:t,value:fl(n)})}function Zq(e,t){let n=_t(e.repeatBuys??e.repeat_buys??e.buyCount),r=_t(e.walletWinRate??e.winRate);Xt(t,"repeat_buys",n===null?null:dt((n-1)/4)*.38),Xt(t,"wallet_win_rate",r===null?null:(dt(r)-.5)*.5)}function eM(e,t){let n=_t(e.ageHours??e.poolAgeHours),r=_t(e.liquidityUsd??e.liquidity),o=e.liquidityLocked??e.locked;Xt(t,"pool_age",n===null?null:n<24?-.42:dt(n/720)*.12),Xt(t,"liquidity",r===null?null:(dt(Math.log10(Math.max(1,r))/7)-.5)*.28),Xt(t,"liquidity_lock",o==null?null:o?.12:-.28)}function tM(e,t){let n=_t(e.floorChange??e.floorChangePct),r=_t(e.sales??e.saleCount);Xt(t,"floor_change",n===null?null:dt(n,-1,1)*.35),Xt(t,"sales_depth",r===null?null:dt(r/50)*.18)}function nM(e,t){let n=_t(e.flowImbalance??e.imbalance),r=_t(e.fundingRate??e.funding);Xt(t,"flow_imbalance",n===null?null:dt(n,-1,1)*.42),Xt(t,"funding",r===null?null:-dt(r*100,-1,1)*.12)}function rM(e,t){let n=_t(e.marketProbability??e.marketPrice??e.probability),r=_t(e.fairProbability??e.referenceProbability??e.fairValue);Xt(t,"probability_mispricing",n===null||r===null?null:dt(r-n,-1,1)*.65);let o=_t(e.liquidityUsd??e.liquidity);Xt(t,"market_liquidity",o===null?null:dt(Math.log10(Math.max(1,o))/6)*.12)}function iM(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=>_t(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 ml(e=[],t=[],n={}){if(!Array.isArray(e)||!Array.isArray(t))throw new TypeError("events and markouts must be arrays");let r=dt(_t(n.minimumCoverage)??.5);return e.map((o,i)=>{let s=fv(o),a=Qq(o,i),c=oM[s],l=[];c&&c(o,l);let u=s==="wallet"?2:s==="pool"?3:2,d=fl(dt(l.length/u)),p=l.reduce((v,S)=>v+S.value,0),f=iM(o,a,t),m=f===null?0:dt(f,-1,1)*.35;f!==null&&Xt(l,"shadow_markout",m);let h=fl(dt(.5+p+m)),y=f===null?.8:dt(.85+f*.3,.35,1),g=fl(dt(d*y)),E=["COLD_INTELLIGENCE_ONLY","NO_HOT_EXECUTION"];return c||E.push("UNSUPPORTED_SIGNAL_TYPE"),d<r&&E.push("LOW_COVERAGE","NO_TRADE"),g<.5&&E.push("LOW_CONFIDENCE","NO_TRADE"),s==="pool"&&(_t(o.ageHours??o.poolAgeHours)??1/0)<24&&E.push("NEW_POOL_RISK","NO_TRADE"),f!==null&&f<0&&E.push("NEGATIVE_MARKOUT"),{id:a,type:s,score:h,confidence:g,coverage:d,contributions:l,flags:[...new Set(E)],noTrade:E.includes("NO_TRADE"),executionAllowed:!1}}).sort((o,i)=>i.score-o.score||i.confidence-o.confidence||o.id.localeCompare(i.id))}var JV,Xq,dt,_t,fl,oM,$f=T(()=>{JV=Object.freeze(["wallet","pool","nft_floor","hl_flow","prediction_market"]),Xq=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"}),dt=(e,t=0,n=1)=>Math.min(n,Math.max(t,e)),_t=e=>Number.isFinite(Number(e))?Number(e):null,fl=e=>Math.round(e*1e4)/1e4;oM=Object.freeze({wallet:Zq,pool:eM,nft_floor:tM,hl_flow:nM,prediction_market:rM})});function sM(e=[],t=[],n={}){let r=ml(e,t,n),o=r.filter(a=>a&&a.noTrade!==!0&&a.executionAllowed===!1),i=r.filter(a=>a?.noTrade===!0),s=o.filter(a=>(a.confidence??0)>=(n.promoteMinConfidence??.55)&&(a.score??0)>=(n.promoteMinScore??.55));return{scored:r,candidates:s,blocked:i}}function aM(e,t={}){if(!e||typeof e!="object")throw new TypeError("signal required");if(e.noTrade===!0)throw new Error("NO_TRADE signal cannot open a trade lifecycle");if(e.executionAllowed===!0)throw new Error("executionAllowed must be false on public plane");let n=String(t.tradeId||`sig-${e.id||"unknown"}`).slice(0,128),r={source:"signal_score",signalId:e.id,signalType:e.type,score:e.score,confidence:e.confidence,flags:e.flags||[],promote:"research_only",execution:"prepare-only",custody:"none",note:"Cold signal \u2192 prepare intent only. Owner wallet must sign any later tx.",...t.intentExtra&&typeof t.intentExtra=="object"?t.intentExtra:{}},o=pl({tradeId:n,intent:r,asOf:t.asOf??Date.now()});return{tradeId:n,intent:r,lifecycle:o,recommendation:"PREPARE_RESEARCH_ONLY"}}function mv(e=[],t=[],n={}){let{scored:r,candidates:o,blocked:i}=sM(e,t,n),s=Math.min(Math.max(Number(n.limit)||3,0),20),a=[];for(let c of o.slice(0,s))try{a.push(aM(c,{asOf:n.asOf,tradeId:n.tradeIdPrefix?`${n.tradeIdPrefix}-${c.id}`:void 0,intentExtra:n.intentExtra}))}catch{}return{ok:!0,cold:!0,executionAllowed:!1,scoredCount:r.length,blockedCount:i.length,intentCount:a.length,intents:a,blocked:i.slice(0,20)}}var hv=T(()=>{$f();Lf()});function yv(e){let t=lM[Number(e)]||[];return new Set([...t,...cM].map(n=>String(n).trim().toLowerCase()).filter(Boolean))}var cM,lM,gv=T(()=>{cM=["0x000000000022d473030f116ddee9f6b43ac78ba3"],lM={4663:["0xcaf681a66d020601342297493863e78c959e5cb2","0x33e885ed0ec9bf04ecfb19341582aadcb4c8a9e7","0x1f7d7550b1b028f7571e69a784071f0205fd2efa","0x0bd7d308f8e1639fab988df18a8011f41eacad73","0x5fc5360d0400a0fd4f2af552add042d716f1d168","0xb477751b76cf82d00a686a1232f5fcd772414af3","0xff5cb29241f002ffed2eaa224e3e996d24a6e8d1"],8453:["0x2626664c2603336e57b271c5c0b26f421741e481","0x6ff5693b99212da76ad316178a184ab56d299b43","0x3d4e44eb1374240ce5f1b871ab261cd16335b76a","0x33128a8fc17869897dce68ed026d694621f6fdfd","0x4200000000000000000000000000000000000006","0x833589fcd6edb6e08f4c7c32d4f71b54bda02913","0xbe6d8f0d05cc4be24d5167a3ef062215be6d18a5","0x254cf9e1e6e233aa1ac962cb9b05b2cfeaae15b0","0x5e7bb104d84c7cb9b682aac2f3d509f5f406809a","0x1231deb6f5749ef6ce6943a275a1d3e7486f4eae","0x888888888889758f76e7103c6cbf23abbf58f946","0x3f170631ed9821ca51a59d996ab095162438dc10","0x4f37a9d177470499a2dd084621020b023fcffc1f","0xc92e8bdf79f0507f65a392b0ab4667716bfe0110"],42161:["0x68b3465833fb72a70ecdf485e0e4c7bd8665fc45","0x61ffe014ba17989e743c5f6cb21bf9697530b21e","0x82af49447d8a07e3bd95bd0d56f35241523fbab1","0xaf88d065e77c8cc2239327c5edb3a432268e5831","0x1231deb6f5749ef6ce6943a275a1d3e7486f4eae","0xfd086bc7cd5c481dcc9c85ebe478a1c0b69fcbb9","0x888888888889758f76e7103c6cbf23abbf58f946","0xeaedc32a51c510d35ebc11088fd5ff2b47aacf2e","0x2191718cd32d02b8e60badffea33e4b5dd9a0a0d","0xc92e8bdf79f0507f65a392b0ab4667716bfe0110","0x1c3fa76e6e1088bce750f23a5bfcffa1efef6a41","0x7452c558d45f8afc8c83dae62c3f8a5be19c71f6"],1:["0x68b3465833fb72a70ecdf485e0e4c7bd8665fc45","0x1231deb6f5749ef6ce6943a275a1d3e7486f4eae","0x4cd00e387622c35bddb9b4c962c136462338bc31","0x6a000f20005980200259b80c5102003040001068","0xae563e3f8219521950555f5962419c8919758ea2","0x45312ea0eff7e09c83cbe249fa1d7598c4c8cd4e","0xc92e8bdf79f0507f65a392b0ab4667716bfe0110"],137:["0x1231deb6f5749ef6ce6943a275a1d3e7486f4eae","0x0dcded3545d565ba3b19e683431381007245d983"],10:["0x1231deb6f5749ef6ce6943a275a1d3e7486f4eae","0xe2fa4e1d17725e72dcdafe943ecf45df4b9e285b","0x0dcded3545d565ba3b19e683431381007245d983"],56:["0x1231deb6f5749ef6ce6943a275a1d3e7486f4eae","0xa72c85c258a81761433b4e8da60505fe3dd551cc"],43114:["0x1231deb6f5749ef6ce6943a275a1d3e7486f4eae","0xf39ca6ede9bf7820a952b52f3c94af526bab9015","0x0dcded3545d565ba3b19e683431381007245d983","0x8f550e53dfe96c055d5bdb267c21f268fcaf63b2","0x820f5ffc5b525cd4d88cd91acf2c28f16530cc68"],999:["0x0a0758d937d1059c356d4714e57f5df0239bce1a","0xd2002373543ce3527023c75e7518c274a51ce712"],2741:["0x4f8c9056bb8a3616693a76922fa35d53c056e5b3"],988:["0x026f252016a7c47cdef1f05a3fc9e20c92a49c37","0xff5cb29241f002ffed2eaa224e3e996d24a6e8d1","0x817997ca8394e26cce3de3a076a4889b27dbf9de","0x3dea4be5615974f31624404ef288ba3b36dfeb83","0xeaf7ac0fdf150cdd89340fb762d83848de6a7b83","0x779ded0c9e1022225f8e0630b35a9b54be713736","0xbc6f7725f08232c151b528bdfcaaf89993ca86ee"]}});function hl(e,t={}){e&&e.passes.push({ok:!0,kind:t.kind||"gather",name:t.name||null})}function Df(e){e&&(e.prepareAttempted=!0)}function Uf(e,t={}){e&&(e.prepareAttempted=!0,e.prepareFailed=!0,e.passes.push({ok:!1,kind:"prepare",name:t.name||null,error:t.error||"prepare hard-safety failed"}))}function fM(e,t=process.env){let n=t&&typeof t=="object"?t:process.env,r=String(n.ORACLE_DEST_ALLOWLIST||n.MAD_DEST_ALLOWLIST||"").split(",").map(s=>s.trim().toLowerCase()).filter(Boolean),o=Number(e),i=Number.isInteger(o)&&o>0?[...yv(o)]:[];return new Set([...r,...i])}function mM(e){return!e||typeof e!="object"?!1:!!(e.slippageGuard||e.slippageBps!=null||e.slippage!=null||e.tokenIn||e.tokenOut||e.amountIn!=null||e.amountOut!=null)}function hM(e){return!e||typeof e!="object"?!1:!!(e.transaction||e.tx||e.to||e.destination||e.settlement||e.data||e.value!=null)}function yM(e={}){let t=e.transaction&&typeof e.transaction=="object"?e.transaction:e.tx&&typeof e.tx=="object"?e.tx:e;return{to:t.to||e.to||e.destination||e.settlement||null,chainId:t.chainId??e.chainId??e.chain??null,data:t.data||e.data||null,value:t.value??e.value??null}}function gM(e){let t=e.slippageGuard||e.madSlippage;return t&&t.selectedBps!=null?Number(t.selectedBps):t&&t.capBps!=null&&e.slippageBps==null?Number(t.capBps):e.slippageBps!=null?Number(e.slippageBps):e.slippage&&typeof e.slippage=="object"&&e.slippage.bps!=null?Number(e.slippage.bps):null}function bM(e,t={}){let n=[],r={unsigned:!1,destination:"n/a",slippage:"n/a"};if(!e||typeof e!="object"||Array.isArray(e))return{ok:!1,checks:r,errors:["prepared fact must be an object"]};e.signed===!0&&n.push("prepared fact is signed"),e.broadcast===!0&&n.push("prepared fact claims broadcast");for(let o of uM)e[o]&&n.push(`prepared fact carries ${o}`);for(let o of dM)e[o]&&n.push(`prepared fact claims executed ${o}`);if(r.unsigned=n.length===0,hM(e)){let o=yM(e),i=o.to==null?"":String(o.to).trim();if(!i)n.push("prepared transaction is missing destination"),r.destination="missing";else{let s=pM.test(i);if(i.startsWith("0x")&&!s)n.push("prepared destination is not a 20-byte address"),r.destination="malformed";else{let a=fM(o.chainId,t.env),c=i.toLowerCase(),l=!!(e.routeAttestation||e.madRoute||e.vaultGuard||e.madVault);a.size>0&&s&&!a.has(c)&&!l?(n.push(`destination ${c} not allowlisted`),r.destination="blocked"):r.destination=a.size===0?"unset":"allowlisted"}}}if(mM(e)){let o=gM(e),i=e.slippageGuard?.capBps!=null?Number(e.slippageGuard.capBps):jn;!Number.isInteger(o)||o<0?(n.push("swap prepare is missing integer slippage bps"),r.slippage="missing"):o>jn||Number.isInteger(i)&&o>i||Number.isInteger(i)&&i>jn?(n.push(`slippage ${o} exceeds cap ${Math.min(i,jn)}`),r.slippage="blocked"):r.slippage="ok"}return{ok:n.length===0,checks:r,errors:n}}function Bf(e,t){let n=[];e?.execution!=="prepare-only"&&n.push("lifecycle execution must be prepare-only"),e?.custody!=="none"&&n.push("lifecycle custody must be none");let r=bM(t);return{ok:n.length===0&&r.ok,checks:r.checks,errors:[...n,...r.errors]}}var uM,dM,pM,bv=T(()=>{gv();en();uM=Object.freeze(["signature","signedTx","signedTransaction","rawTransaction","signedPayload","signedRaw"]),dM=Object.freeze(["txid","txHash","transactionHash","broadcastHash"]),pM=/^0x[a-fA-F0-9]{40}$/});var Ev={};Q(Ev,{DESK_TOOLS:()=>EM,runDeskTool:()=>SM});function AM(e){if(!e||typeof e!="object"||Array.isArray(e))throw new TypeError("tool arguments must be an object");if(Buffer.byteLength(JSON.stringify(e),"utf8")>wM)throw new TypeError("tool arguments exceed size limit")}function Et(e,t,n=[]){for(let o of t)if(!(o in e))throw new TypeError(`${o} is required`);let r=new Set([...t,...n]);for(let o of Object.keys(e))if(!r.has(o))throw new TypeError(`unexpected argument: ${o}`)}async function SM(e,t,n={}){if(AM(t),e==="research_artifact"){if(Et(t,["sourceUrl","fetchedAt","snapshot","claim","confidence"],["contradictions"]),String(t.snapshot).length>wv)throw new TypeError("snapshot exceeds size limit");return{ok:!0,artifact:(n.createResearchArtifact||fS)(t)}}if(e==="portfolio_analyze")return Et(t,["ledger","asOf"],["priceTtlMs"]),{ok:!0,analysis:(n.summarizePortfolioLedger||AS)(t.ledger,{asOf:t.asOf,priceTtlMs:t.priceTtlMs})};if(e==="tax_lots")return Et(t,["input"],["method","asOf"]),{ok:!0,records:(n.createCostBasisRecords||_S)(t.input,{method:t.method,asOf:t.asOf})};if(e==="position_health"){Et(t,["action","input","asOf"],["thresholds"]);let r={asOf:t.asOf,thresholds:t.thresholds};if(t.action==="evaluate")return{ok:!0,analysis:(n.evaluatePositionHealth||xf)(t.input,r)};if(t.action==="book")return{ok:!0,analysis:(n.evaluatePositionBook||HS)(t.input,r)};throw new TypeError("unknown position health action")}if(e==="governance_prepare")return Et(t,["input","asOf"]),{ok:!0,preview:(n.previewGovernanceAction||VS)(t.input,{asOf:t.asOf}),prepared:!1};if(e==="safety_intelligence"){Et(t,["action","input","asOf"],["minClearConfidence","minBlockConfidence"]);let r={asOf:t.asOf,minClearConfidence:t.minClearConfidence,minBlockConfidence:t.minBlockConfidence};if(t.action==="address")return{ok:!0,analysis:(n.evaluateAddressSafety||Tf)(t.input,r)};if(t.action==="transaction")return{ok:!0,analysis:(n.evaluateTransactionSafety||rv)(t.input,r)};throw new TypeError("unknown safety intelligence action")}if(e==="portfolio_risk")return Et(t,["input"]),{ok:!0,analysis:(n.summarizePortfolioRisk||rl)(t.input)};if(e==="trade_lifecycle"){let r=n.createTradeLifecycle||pl,o=n.advanceTradeLifecycle||pv,i=n.assertTradeLifecycle||Pf;if(t.action==="create")return Et(t,["action","tradeId","intent"],["asOf"]),{ok:!0,lifecycle:r({tradeId:t.tradeId,intent:t.intent,asOf:t.asOf})};if(t.action==="verify"){if(Et(t,["action","lifecycle"]),i(t.lifecycle),t.lifecycle.state==="prepared"){Df(n.loopVerifier);let s=t.lifecycle.events?.findLast?.(c=>c.state==="prepared")||t.lifecycle.events?.filter(c=>c.state==="prepared").at(-1),a=Bf(t.lifecycle,s?.fact||{});if(!a.ok)return Uf(n.loopVerifier,{name:"trade_lifecycle",error:a.errors[0]}),{ok:!1,error:`prepare verifier failed: ${a.errors[0]}`,checks:a.checks};hl(n.loopVerifier,{kind:"prepare",name:"trade_lifecycle"})}else hl(n.loopVerifier,{kind:"lifecycle",name:"trade_lifecycle"});return{ok:!0,valid:!0,lifecycle:t.lifecycle}}if(t.action==="advance"){if(Et(t,["action","lifecycle","state","fact"],["asOf"]),t.state==="signed"||t.state==="broadcast")throw new TypeError(`${t.state} facts are not accepted by the agent tool`);if(t.state==="prepared"){Df(n.loopVerifier);let a=Bf(t.lifecycle,t.fact);if(!a.ok)return Uf(n.loopVerifier,{name:"trade_lifecycle",error:a.errors[0]}),{ok:!1,error:`prepare verifier failed: ${a.errors[0]}`,checks:a.checks}}let s=o(t.lifecycle,t.state,t.fact,{asOf:t.asOf});return t.state==="prepared"&&hl(n.loopVerifier,{kind:"prepare",name:"trade_lifecycle"}),{ok:!0,lifecycle:s}}throw new TypeError("unknown trade lifecycle action")}if(e==="signal_score"){if(Et(t,["events"],["markouts","openIntents","limit"]),!Array.isArray(t.events))throw new TypeError("events must be an array");let r=Array.isArray(t.markouts)?t.markouts:[];if(t.openIntents===!0)return(n.signalsToPrepareIntents||mv)(t.events,r,{limit:t.limit});let i=(n.scoreSignals||ml)(t.events,r);return{ok:!0,cold:!0,executionAllowed:!1,scored:i,noTradeCount:i.filter(s=>s.noTrade).length}}if(e==="workspace_artifact"){let r=n.openArtifactStore||cS,o=!n.artifactStore,i=n.artifactStore||await r(n.artifactStoreOptions||{});try{if(t.action==="get")return Et(t,["action","id"]),{ok:!0,artifact:await i.getArtifact(t.id)};if(t.action==="list")return Et(t,["action"],["type"]),{ok:!0,artifacts:await i.listArtifacts(t.type)};if(t.action==="put")return Et(t,["action","id","type","data","createdAt"]),{ok:!0,artifact:await i.putArtifact(t)};if(t.action==="link")return Et(t,["action","parentId","childId"]),{ok:!0,link:await i.link(t.parentId,t.childId)};throw new TypeError("unknown workspace artifact action")}finally{o&&typeof i?.close=="function"&&await i.close()}}return{ok:!1,error:`unknown desk tool: ${e}`}}var wM,wv,yl,Ht,Dn,EM,Av=T(()=>{lS();mS();SS();wf();TS();zS();WS();ov();Lf();$f();hv();bv();wM=128*1024,wv=5e4,yl={type:"string",minLength:1,maxLength:256},Ht={type:"object",additionalProperties:!0},Dn=(e,t,n)=>Object.freeze({type:"function",function:Object.freeze({name:e,description:t,strict:!0,parameters:n})}),EM=Object.freeze([Dn("workspace_artifact","Get, list, put, or link deterministic workspace artifacts. No arbitrary paths or SQL.",{type:"object",properties:{action:{type:"string",enum:["get","list","put","link"]},id:yl,type:{type:"string",enum:["project","entity","source","thesis","strategy","simulation","prepared_action","receipt","position"]},createdAt:{type:"string",minLength:1,maxLength:64},data:Ht,parentId:yl,childId:yl},required:["action"],additionalProperties:!1}),Dn("research_artifact","Create a deterministic, citation-bearing research artifact. fetchedAt must be supplied by the caller.",{type:"object",properties:{sourceUrl:{type:"string",minLength:1,maxLength:4096},fetchedAt:{type:"string",minLength:1,maxLength:64},snapshot:{type:"string",minLength:1,maxLength:wv},claim:{type:"string",minLength:1,maxLength:1e4},confidence:{type:"number",minimum:0,maximum:1},contradictions:{type:"array",maxItems:50,items:{type:"string",maxLength:2e3}}},required:["sourceUrl","fetchedAt","snapshot","claim","confidence"],additionalProperties:!1}),Dn("portfolio_analyze","Deterministically summarize a caller-supplied portfolio ledger; performs no network or account access.",{type:"object",properties:{ledger:Ht,asOf:{type:"number"},priceTtlMs:{type:"number",minimum:0}},required:["ledger","asOf"],additionalProperties:!1}),Dn("tax_lots","Build exact-integer cost-basis records from caller-supplied events. Accounting records only, not tax advice.",{type:"object",properties:{input:Ht,method:{type:"string",enum:["fifo","lifo","hifo","specific"]},asOf:{type:"string",minLength:1}},required:["input"],additionalProperties:!1}),Dn("position_health","Evaluate caller-supplied lending or farming snapshots. Alert-only, with no network access or execution signal.",{type:"object",properties:{action:{type:"string",enum:["evaluate","book"]},input:Ht,asOf:{type:"string",minLength:1},thresholds:Ht},required:["action","input","asOf"],additionalProperties:!1}),Dn("governance_prepare","Create a deterministic semantic preview of a caller-supplied governance intent. No adapter, calldata, vote, signature, or broadcast.",{type:"object",properties:{input:Ht,asOf:{type:"string",minLength:1}},required:["input","asOf"],additionalProperties:!1}),Dn("safety_intelligence","Evaluate caller-supplied address or transaction safety evidence. No source is contacted and unknown evidence fails closed.",{type:"object",properties:{action:{type:"string",enum:["address","transaction"]},input:Ht,asOf:{type:"string",minLength:1},minClearConfidence:{type:"number",minimum:0,maximum:1},minBlockConfidence:{type:"number",minimum:0,maximum:1}},required:["action","input","asOf"],additionalProperties:!1}),Dn("portfolio_risk","Summarize concentration and coverage from caller-supplied portfolio snapshots. No network or account access.",{type:"object",properties:{input:Ht},required:["input"],additionalProperties:!1}),Dn("trade_lifecycle","Create, verify, or advance a prepare-only trade fact chain. A request is not a record: observed status is NONE until create returns an explicit INTENT event. Proposed next work never advances current state. Signing and broadcasting are never performed.",{type:"object",properties:{action:{type:"string",enum:["create","verify","advance"]},tradeId:yl,intent:Ht,lifecycle:Ht,state:{type:"string",enum:["quote_comparison","simulation","prepared","approval","settlement","balance_delta","position"]},fact:Ht,asOf:{type:"number"}},required:["action"],additionalProperties:!1}),Dn("signal_score","Cold-score onchain signal events (wallet/pool/nft/hl/prediction). Never fetches or executes. NO_TRADE flags block promotion.",{type:"object",properties:{events:{type:"array",maxItems:100,items:Ht},markouts:{type:"array",maxItems:100,items:Ht},openIntents:{type:"boolean",description:"If true, open prepare-only trade lifecycles for top promotable signals"},limit:{type:"number",minimum:0,maximum:20}},required:["events"],additionalProperties:!1})])});var Sv={};Q(Sv,{deployGloballyEnabled:()=>xM,executeGloballyEnabled:()=>vM,mevExecuteEnabled:()=>IM});function vM(){return js("ORACLE_EXECUTE_ENABLED","MAD_EXECUTE_ENABLED",!1)}function xM(){return js("ORACLE_DEPLOY_ENABLED","MAD_DEPLOY_ENABLED",!1)}function IM(){return js("ORACLE_MEV_EXECUTE_ENABLED",null,!1)}var vv=T(()=>{Hs()});Hs();import xv from"node:fs";import qf from"node:process";import{fileURLToPath as kM}from"node:url";import{createInterface as Dv}from"node:readline";var wn=Object.freeze({maxRequestBytes:256*1024,maxResponseBytes:2*1024*1024,maxTools:256,maxToolNameLength:64,maxArgumentBytes:128*1024,defaultCallTimeoutMs:3e4,maxCallTimeoutMs:6e4,maxConcurrentCalls:32}),Uv=/^[A-Za-z0-9_-]{1,64}$/;function zs(e,t){return{jsonrpc:"2.0",id:e??null,result:t}}function nt(e,t,n){return{jsonrpc:"2.0",id:e??null,error:{code:t,message:n}}}function Bv(e){return!!(e&&typeof e=="object"&&!Array.isArray(e)&&e.jsonrpc==="2.0"&&typeof e.method=="string"&&e.method.length>0)}function qv(e){if(!Array.isArray(e))return[];let t=[],n=new Set;for(let r of e){if(t.length>=wn.maxTools)break;if(!r||typeof r!="object"||Array.isArray(r))continue;let o=typeof r.name=="string"?r.name.trim():"";if(!Uv.test(o)||n.has(o))continue;n.add(o);let i=r.inputSchema&&typeof r.inputSchema=="object"&&!Array.isArray(r.inputSchema)?{...r.inputSchema}:{type:"object",properties:{},additionalProperties:!1};i.type==="object"&&i.additionalProperties===void 0&&(i.additionalProperties=!1),t.push({...r,name:o,inputSchema:i})}return t}function Mv(e){let t=Number(e)||wn.defaultCallTimeoutMs;return Math.min(Math.max(t,1),wn.maxCallTimeoutMs)}async function Fv(e,t,n){let r;try{return await Promise.race([e,new Promise((o,i)=>{r=setTimeout(()=>{let s=new Error("tool call timed out");s.code="ORACLE_MCP_TIMEOUT",i(s);try{n?.()}catch{}},t)})])}finally{clearTimeout(r)}}function jv(e){return e===null?"null":Array.isArray(e)?"array":Number.isInteger(e)?"integer":typeof e}function xi(e,t,n="arguments",r=0){if(!t||typeof t!="object"||Array.isArray(t))return null;if(r>12)return`${n} exceeded the nesting limit`;if(Array.isArray(t.oneOf)&&t.oneOf.length&&!t.oneOf.some(i=>xi(e,i,n,r+1)===null))return`${n} did not match an allowed shape`;if(Array.isArray(t.anyOf)&&t.anyOf.length&&!t.anyOf.some(i=>xi(e,i,n,r+1)===null))return`${n} did not match a required alternative`;if(Array.isArray(t.enum)&&!t.enum.some(o=>Object.is(o,e)))return`${n} must be one of the allowed values`;if(Object.hasOwn(t,"const")&&!Object.is(t.const,e))return`${n} must equal the required constant`;if(t.type){let o=jv(e);if(!(t.type==="number"?typeof e=="number"&&Number.isFinite(e):t.type==="integer"?Number.isSafeInteger(e):o===t.type))return`${n} must be ${t.type}`}if(typeof e=="string"){let o=Math.min(Number.isSafeInteger(t.maxLength)?t.maxLength:16384,16384);if(e.length>o)return`${n} exceeded the string limit`;if(Number.isSafeInteger(t.minLength)&&e.length<t.minLength)return`${n} is too short`}if(Array.isArray(e)){let o=Math.min(Number.isSafeInteger(t.maxItems)?t.maxItems:1e3,1e3);if(e.length>o)return`${n} exceeded the array limit`;if(Number.isSafeInteger(t.minItems)&&e.length<t.minItems)return`${n} has too few items`;if(t.items)for(let i=0;i<e.length;i+=1){let s=xi(e[i],t.items,`${n}[${i}]`,r+1);if(s)return s}}if(e&&typeof e=="object"&&!Array.isArray(e)){let o=Object.keys(e);if(o.length>256)return`${n} exceeded the property limit`;let i=t.properties&&typeof t.properties=="object"?t.properties:{};for(let s of Array.isArray(t.required)?t.required:[])if(!Object.hasOwn(e,s))return`${n}.${s} is required`;if(t.additionalProperties===!1){let s=o.find(a=>!Object.hasOwn(i,a));if(s)return`${n}.${s} is not allowed`}for(let s of o){if(!Object.hasOwn(i,s))continue;let a=xi(e[s],i[s],`${n}.${s}`,r+1);if(a)return a}}return null}function Vs(e,t={}){let n=qv(e?.tools),r=new Set(n.map(l=>l.name)),o=new Map(n.map(l=>[l.name,l])),i=typeof e?.name=="string"&&e.name?e.name.slice(0,80):"oracle-mcp",s=typeof e?.version=="string"&&e.version?e.version.slice(0,40):"1",a=Mv(t.callTimeoutMs),c=!1;return async function(u){let d=u?.id??null;if(!Bv(u))return nt(d,-32600,"invalid request");if(u.method==="initialize")return c=!0,zs(d,{protocolVersion:u.params?.protocolVersion??"2025-03-26",capabilities:{tools:{}},serverInfo:{name:i,version:s}});if(u.method==="notifications/initialized")return null;if(u.method==="ping")return zs(d,{});if(!c)return nt(d,-32002,"server not initialized");if(u.method==="tools/list")return zs(d,{tools:n});if(u.method==="tools/call"){let p=u.params?.name,f=u.params?.arguments??{};if(typeof p!="string"||!r.has(p))return nt(d,-32602,"unknown tool");if(!f||typeof f!="object"||Array.isArray(f))return nt(d,-32602,"tool arguments must be an object");let m;try{m=JSON.stringify(f)}catch{return nt(d,-32602,"tool arguments are not serializable")}if(Buffer.byteLength(m)>wn.maxArgumentBytes)return nt(d,-32602,"tool arguments exceeded the size limit");let h=xi(f,o.get(p)?.inputSchema);if(h)return nt(d,-32602,h);try{let y=new AbortController,g=await Fv(Promise.resolve(e.call(p,f,{signal:y.signal})),a,()=>y.abort(new Error("tool call timed out")));return zs(d,g)}catch(y){if(y?.code==="ORACLE_MCP_TIMEOUT")return nt(d,-32001,"tool call timed out");let g=typeof y?.message=="string"?y.message.replace(/\s+/g," ").trim():"",E=/\b(requires?|must be|missing|unknown|invalid|expected|unsupported|out of range|too (?:large|small|long|many)|not a|cannot convert)\b/i.test(g),v=/https?:\/\/|[/~][\w.-]+\/|0x[0-9a-fA-F]{8,}|[A-Za-z0-9+/_-]{24,}={0,2}|\b(?:secret|apikey|api[-_ ]key|private[-_ ]?key|token|password|credential|seed|mnemonic)s?\b/i.test(g.replace(/\btoken(?:In|Out|s\b)/g,"asset"));return E&&!v&&g.length<=200?nt(d,-32e3,`tool call failed: ${g}`):nt(d,-32e3,"tool call failed")}}return nt(d,-32601,"method not found")}}function Al(e,t={}){let n=t.input||process.stdin,r=t.output||process.stdout,o=Math.min(Math.max(Number(t.maxRequestBytes)||wn.maxRequestBytes,64),wn.maxRequestBytes),i=Math.min(Math.max(Number(t.maxResponseBytes)||wn.maxResponseBytes,256),wn.maxResponseBytes),s=Math.min(Math.max(Number(t.maxConcurrentCalls)||wn.maxConcurrentCalls,1),wn.maxConcurrentCalls),a=s*8,c=Vs(e,t),l={closed:!1,inflight:0},u=Dv({input:n,terminal:!1,crlfDelay:1/0}),d=0,p=[],f=!1,m=!1;function h(){if(l.closed||l.readerClosed)return;let S=l.inflight>=s||p.length>0||m;S&&!f?(f=!0,u.pause(),typeof n.pause=="function"&&n.pause()):!S&&f&&(f=!1,typeof n.resume=="function"&&n.resume(),u.resume())}function y(S){if(!S||l.closed)return;let I=JSON.stringify(S);Buffer.byteLength(I)>i&&(I=JSON.stringify(nt(S.id,-32003,"response exceeded the size limit"))),r.write(`${I}
24
+ `)===!1&&!m&&(m=!0,h(),r.once("drain",()=>{m=!1,E()}))}function g(S){l.inflight+=1,h(),Promise.resolve(c(S)).then(y).catch(()=>y(nt(S?.id,-32603,"internal error"))).finally(()=>{l.inflight-=1,E()})}function E(){for(;!l.closed&&!m&&l.inflight<s&&p.length>0;)g(p.shift());h()}function v(){l.closed||(y(nt(null,-32700,"request exceeded the size limit")),l.closed=!0,u.close(),typeof n.destroy=="function"&&n.destroy())}return n.on("data",S=>{if(l.closed)return;let I=String(S).split(`
25
+ `);for(let k=0;k<I.length;k+=1){if(d+=Buffer.byteLength(I[k]),d>o){v();return}k<I.length-1&&(d=0)}}),u.on("line",S=>{if(l.closed)return;if(Buffer.byteLength(S)>o){v();return}let I;try{I=JSON.parse(S)}catch{y(nt(null,-32700,"parse error"));return}if(p.length>=a){y(nt(I?.id,-32e3,"server busy"));return}p.push(I),E()}),u.on("close",()=>{l.readerClosed=!0,t.exitOnClose!==!1&&(process.exitCode=0)}),l}var Vf=Object.freeze({swap:{title:"SWAP",accent:"#7CC4FF"},bridge:{title:"BRIDGE",accent:"#7CC4FF"},quote:{title:"QUOTE",accent:"#7CC4FF"},portfolio:{title:"PORTFOLIO",accent:"#7CC4FF"},nft:{title:"NFT",accent:"#7CC4FF"},generic:{title:"ORACLE",accent:"#7CC4FF"}}),Hv=Object.freeze({best_swap_route:"swap",prepare_best_route:"swap",dex_quote:"swap",jupiter_quote:"swap",lifi_quote:"bridge",best_bridge_route:"bridge",bridge_aggregator_scan:"bridge",prepare_best_bridge_route:"bridge",rfq_quote:"quote",equity_quote:"quote",twap_simulate:"quote",portfolio_balance:"portfolio",portfolio_snapshot:"portfolio",wallet_balances:"portfolio",nft_pnl:"nft",nft_trait_snipe:"nft",satflow_floors:"nft"});function dr(e){return String(e??"").replaceAll("&","&amp;").replaceAll("<","&lt;").replaceAll(">","&gt;").replaceAll('"',"&quot;")}function Tt(e){let t=Number(e);return Number.isFinite(t)?Math.abs(t)>=1e9?`${(t/1e9).toFixed(2)}B`:Math.abs(t)>=1e6?`${(t/1e6).toFixed(2)}M`:Math.abs(t)>=1e3?`${(t/1e3).toFixed(2)}K`:Math.abs(t)>=1?t.toLocaleString("en-US",{maximumFractionDigits:4}):t.toPrecision(4):null}function Ii(e,t){if(e==null)return null;let n=String(e);if(/^\d{7,}$/.test(n)){let r=Number(t);if(Number.isFinite(r)&&r>0&&r<=36){let o=Number(n)/10**r;if(Number.isFinite(o))return Tt(o)}return`${n} raw`}return Tt(e)}var zv=Object.freeze({USDC:6,USDT:6,"USDC.E":6,USDBC:6,WBTC:8,CBBTC:8,ETH:18,WETH:18,DAI:18,WSTETH:18,ARB:18,OP:18,POL:18,BNB:18,AVAX:18,HYPE:18,SOL:9});function Vv(e,t){let n=Number(t);return t!=null&&Number.isFinite(n)?n:zv[String(e||"").toUpperCase()]}function Wf(e,t){let n=t&&typeof t=="object"?t:{},r=n.result&&typeof n.result=="object"?n.result:n,o=r;if(r.estimate&&typeof r.estimate=="object"){let c=r.estimate,l=(c.gasCosts||[]).reduce((d,p)=>d+(Number(p.amountUSD)||0),0)||null,u=(c.feeCosts||[]).reduce((d,p)=>d+(Number(p.amountUSD)||0),0)||null;o={best:{provider:r.tool||r.toolDetails?.name||"lifi",amountOut:c.toAmount,minOut:c.toAmountMin,gasUsd:l,feeUsd:u,decimalsOut:r.action?.toToken?.decimals},tokenIn:r.action?.fromToken?.symbol,tokenOut:r.action?.toToken?.symbol}}let i=[],s=(c,l,u={})=>{l==null||l===""||i.push({label:c,value:String(l),...u})},a=o.best||o.winner||o.topRoute||null;if(e==="swap"||e==="bridge"||e==="quote"){let c=a||o,l=Vv(o.tokenOut??o.buyToken,o.tokenOutDecimals??o.decimalsOut??c.tokenOutDecimals??c.decimalsOut);s("ROUTE",c.provider||c.venue||c.source||c.aggregator),o.tokenIn&&o.tokenOut&&s("PAIR",`${o.tokenIn} \u2192 ${o.tokenOut}`);let u=c.netOut??c.netOutput??c.amountOutNet??c.toAmountNet,d=c.amountOut??c.outAmount??c.toAmount??c.expectedOut,p=Ii(u,l);s(p!=null?"NET OUT":"EST OUT (GROSS)",p??Ii(d,l),{hero:!0}),s("GROSS OUT",u!==void 0&&d!==void 0&&String(u)!==String(d)?Ii(d,l):null),c.gasUsd!==void 0&&c.gasUsd!==null?s("GAS",`$${Tt(c.gasUsd)}`):c.feeUsd!==void 0&&c.feeUsd!==null?s("GAS+FEES",`$${Tt(c.feeUsd)}`):s("GAS","NOT PRICED IN",{warn:!0});let m=c.minOut??c.minAmountOut??c.minReceived;if(s("MIN RECEIVED",Ii(m,l)),c.slippageBps!==void 0&&c.slippageBps!==null)s("SLIPPAGE",`${c.slippageBps} bps`);else if(m!==void 0&&d!==void 0){let g=Number(d),E=Number(m);Number.isFinite(g)&&Number.isFinite(E)&&g>0&&E>0&&E<=g&&s("SLIPPAGE",`${((1-E/g)*1e4).toFixed(0)} bps max`)}let h=c.meta?.fee??c.poolFee;h!=null&&s("POOL FEE",`${Number(h)/100} bps`),c.liquidityUsd!==void 0&&c.liquidityUsd!==null&&s("LIQUIDITY",`$${Tt(c.liquidityUsd)}`),o.rankedOn&&s("RANKED ON",String(o.rankedOn).toUpperCase(),{warn:String(o.rankedOn)==="gross"});let y=Array.isArray(o.ranked)?o.ranked.slice(1,4):Array.isArray(o.routes)?o.routes.filter(g=>g!==a).slice(0,3):[];for(let g of y){let E=g?.provider||g?.venue||g?.source,v=Ii(g?.netOut??g?.amountOut??g?.toAmount,l);E&&v&&s(`vs ${E}`,v,{dim:!0})}}else if(e==="portfolio"){let l=(o.valuation&&typeof o.valuation=="object"?o.valuation:o).knownUsd??o.knownUsd;s("KNOWN USD",l!=null?`$${Tt(l)}`:null,{hero:!0});let u=Array.isArray(o.chains)?o.chains:null;if(s("CHAINS",u?u.length:o.chainCount),s("TOKENS",Array.isArray(o.tokens)?o.tokens.length:o.tokenCount),s("NFTS",Array.isArray(o.nfts)?o.nfts.length:o.nftCount),u){let f=u.filter(m=>Number.isFinite(Number(m?.knownUsd))&&Number(m.knownUsd)>0).sort((m,h)=>Number(h.knownUsd)-Number(m.knownUsd)).slice(0,3);for(let m of f)s(String(m.name||m.family||m.chainId),`$${Tt(m.knownUsd)}`,{dim:!0})}let d=o.avgEntryUsd??o.avgCostUsd;if(d!==void 0)s("AVG ENTRY",`$${Tt(d)}`);else if(Array.isArray(o.tokens)){let f=o.tokens.map(m=>Number(m?.avgEntryUsd??m?.avgCostUsd??m?.costBasisUsd)).filter(m=>Number.isFinite(m)&&m>0);if(f.length>0){let m=f.reduce((h,y)=>h+y,0)/f.length;s("AVG ENTRY",`$${Tt(m)} \xB7 ${f.length} coins`)}}let p=o.coverage;p&&typeof p=="object"?(Number(p.unavailable)||0)+(Number(p.notConfigured)||0)>0&&s("COVERAGE",`${p.ok??0}/${p.requestedSurfaces??"?"} SURFACES`,{warn:!0}):(o.incomplete||o.partial)&&s("COVERAGE","INCOMPLETE",{warn:!0})}else if(e==="nft"){s("COLLECTION",o.collection||o.slug||o.name),s("FLOOR",o.floor??o.floorEth??o.floorPrice,{hero:!0}),s("PNL",o.pnlUsd!==void 0?`$${Tt(o.pnlUsd)}`:null);let c=o.avgBuy??o.avgBuyEth??o.avgCostEth??o.avgPurchase;if(c!==void 0)s("AVG BUY",Tt(c));else if(Array.isArray(o.buys)||Array.isArray(o.purchases)){let l=(o.buys||o.purchases).map(u=>Number(u?.priceEth??u?.price??u?.costEth)).filter(u=>Number.isFinite(u)&&u>0);l.length>0&&s("AVG BUY",`${Tt(l.reduce((u,d)=>u+d,0)/l.length)} \xB7 ${l.length} buys`)}s("OWNERS",Tt(o.owners??o.numOwners))}return i}function Wv(e,t,n){let r=Vf[e]||Vf.generic,o=Wf(e,n),i=o.find(l=>l.hero),s=o.filter(l=>!l.hero),a=dr(JSON.stringify(n,null,2)).slice(0,2e4),c=s.map(l=>`<div class="row${l.dim?" dim":""}${l.warn?" warn":""}"><span>${dr(l.label)}</span><b>${dr(l.value)}</b></div>`).join("");return`<!doctype html><html><head><meta charset="utf-8"><style>
26
26
  :root{color-scheme:dark}
27
27
  *{margin:0;padding:0;box-sizing:border-box}
28
28
  body{background:transparent;font-family:ui-monospace,SFMono-Regular,Menlo,monospace}
@@ -58,10 +58,10 @@ summary::before{content:"\u25B8 "}details[open] summary::before{content:"\u25BE
58
58
  pre{margin-top:8px;font-size:10px;color:#9FB8D2;max-height:260px;overflow:auto;white-space:pre-wrap;word-break:break-all}
59
59
  .card:active{transform:scale(.985);transition:transform .1s}
60
60
  </style></head><body><div class="card">
61
- <div class="head"><div class="globe"></div><span class="brand">ORACLE</span><span class="kind">${Kt(r.title)}</span></div>
62
- ${i?`<div class="hero">${Kt(i.value)}</div><div class="herolabel">${Kt(i.label)}</div>`:""}
61
+ <div class="head"><div class="globe"></div><span class="brand">ORACLE</span><span class="kind">${dr(r.title)}</span></div>
62
+ ${i?`<div class="hero">${dr(i.value)}</div><div class="herolabel">${dr(i.label)}</div>`:""}
63
63
  ${c}
64
- <details><summary>details \xB7 ${Kt(t)}</summary><pre>${a}</pre></details>
65
- <div class="foot"><span>${Kt(t)}</span><span class="tag">THE FUTURE IS AGENTIC</span></div>
66
- </div><script>document.documentElement.classList.add("live")</script></body></html>`}function ml(e,t){let n=bb[e];if(!n||!t||typeof t!="object"||t.error||t.ok===!1||!fl(n,t).some(i=>i.hero))return null;let o=Sb(n,e,t);return{type:"resource",resource:{uri:`ui://oracle/card/${e}/${Date.now().toString(36)}`,mimeType:"text/html",text:o}}}import Yt from"node:fs";import Ab from"node:os";import qn from"node:path";import vb from"node:crypto";var xb=48e3,hl=4e3,kb=1440*60*1e3,Ib=8e3,_b=1e6;function Ob(e=process.env.ORACLE_MCP_SPILL_BYTES){let t=Number(e);return!Number.isFinite(t)||t<=0?xb:Math.min(Math.max(Math.floor(t),Ib),_b)}function zs(e=process.env.ORACLE_MCP_SPILL_DIR){if(typeof e=="string"&&e.trim())return qn.resolve(e.trim());let t=process.env.XDG_STATE_HOME&&process.env.XDG_STATE_HOME.trim()?process.env.XDG_STATE_HOME.trim():qn.join(Ab.homedir(),".local","state");return qn.join(t,"oracle","mcp-spill")}function yl(e,{maxDepth:t=4,maxKeys:n=24}={}){let r={entries:400};function o(i,s){if(r.entries<=0)return"\u2026";if(r.entries-=1,i===null)return"null";if(Array.isArray(i))return i.length===0?"[]":s>=t?`array(${i.length})`:{[`array(${i.length})`]:o(i[0],s+1)};if(typeof i=="object"){if(s>=t)return"object";let a={},c=Object.keys(i);for(let u of c.slice(0,n))a[u]=o(i[u],s+1);return c.length>n&&(a[`\u2026+${c.length-n} keys`]="\u2026"),a}return typeof i=="string"?i.length>40?`string(${i.length})`:"string":typeof i}return o(e,0)}function Tb(e){try{let t=Date.now();for(let n of Yt.readdirSync(e)){if(!n.endsWith(".json"))continue;let r=qn.join(e,n);try{t-Yt.statSync(r).mtimeMs>kb&&Yt.unlinkSync(r)}catch{}}}catch{}}function gl(e,t,n,r={}){let o=r.thresholdBytes??Ob(),i=Buffer.byteLength(t,"utf8");if(i<=o)return null;try{let s=r.dir??zs();Yt.mkdirSync(s,{recursive:!0,mode:448}),Tb(s);let a=new Date().toISOString().replace(/[:.]/g,"-"),c=vb.randomBytes(4).toString("hex"),u=String(e).replace(/[^A-Za-z0-9_-]/g,"_").slice(0,64)||"tool",l=qn.join(s,`${a}_${u}_${c}.json`);Yt.writeFileSync(l,t,{mode:384});let d=t.slice(0,hl),f=yl(n),p=[`[oracle-mcp spill] ${e} returned ${i} bytes \u2014 full redacted result saved to:`,l,"","Key-shape outline (know the keys before parsing \u2014 read the file for full data):",JSON.stringify(f,null,2),"",`Preview (first ${Math.min(hl,i)} bytes):`,d,d.length<t.length?"\u2026 [truncated \u2014 read the file above for the rest]":""].join(`
67
- `);return{file:l,bytes:i,text:p}}catch{return null}}var $n=new Map;function bl(e){return qn.join(e??zs(),"observed-shapes.json")}function wl(e,t,n={}){try{let r=yl(t);if($n.set(String(e),{shape:r,observedAtMs:Date.now()}),$n.size>512){let i=[...$n.entries()].sort((s,a)=>s[1].observedAtMs-a[1].observedAtMs)[0];i&&$n.delete(i[0])}let o=n.dir??zs();Yt.mkdirSync(o,{recursive:!0,mode:448}),Yt.writeFileSync(bl(o),JSON.stringify(Object.fromEntries($n),null,1),{mode:384})}catch{}}function El(e,t={}){let n=$n.get(String(e));if(n)return n;try{let o=JSON.parse(Yt.readFileSync(bl(t.dir),"utf8"))?.[String(e)];if(o&&typeof o=="object")return o}catch{}return null}Vs();function Al(e){let t=String(e||"").replace(/[^a-z0-9]/gi,"").toLowerCase();return/authorization|cookie|password|credential|privatekey|mnemonic|seedphrase|apikey|accesstoken|refreshtoken|clientsecret|signertoken|bearer/.test(t)||t.endsWith("secret")?!0:t.endsWith("token")&&!new Set(["tokenin","tokenout","tokenid","tokens"]).has(t)}var Hb=[/\bsk-[A-Za-z0-9_-]{10,}\b/g,/\bsk_(?:live|test)_[A-Za-z0-9_-]{10,}\b/g,/\b(?:ghp_|github_pat_|gho_|ghs_|xox[baprs]-|AIza|AKIA|pplx-|hf_|xai-|gsk_|npm_|tvly-)[A-Za-z0-9_-]{10,}\b/g,/\beyJ[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\b/g,/\bBearer\s+[^\s,"'}]+/gi,/\bBasic\s+[A-Za-z0-9+/=]{8,}/gi];function Do(e){let t=String(e??"");for(let n of Hb)n.lastIndex=0,t=t.replace(n,"[REDACTED]");return t=t.replace(/\b([A-Za-z][A-Za-z0-9_-]{0,80})\s*([:=])\s*("[^"]*"|'[^']*'|[^\s,;}\]]+)/g,(n,r,o)=>Al(r)?`${r}${o}[REDACTED]`:n),zb(mn(t,{force:!0}))}function zb(e){return String(e).replace(/https?:\/\/[^\s"'<>]+/gi,t=>{let n=Sl(t);return n.ok?n.href:t})}function Or(e,{depth:t=0,seen:n=new WeakSet,key:r=""}={}){if(Al(r))return"[REDACTED]";if(typeof e=="string"){let i=Do(e);return i.length<=2e4?i:`${i.slice(0,2e4)}\u2026[truncated]`}if(e==null||typeof e=="boolean"||typeof e=="number")return e;if(t>=12)return"[max-depth]";if(typeof e!="object")return mn(String(e),{force:!0}).slice(0,240);if(n.has(e))return"[circular]";if(n.add(e),Array.isArray(e))return e.slice(0,1e3).map(i=>Or(i,{depth:t+1,seen:n,key:r}));let o={};for(let[i,s]of Object.entries(e))o[i]=Or(s,{depth:t+1,seen:n,key:i});return o}qr();ti();it();import{Interface as Sp,getAddress as O2,id as VS,isAddress as T2}from"ethers";it();var tP=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"});Pa();xe();var Ap=Object.freeze({1:Object.freeze({name:"ethereum",positionManager:"0xC36442b4a4522E871399CD717aBDD847Ab11FE88",wrappedNative:"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",venue:"uniswap-v3",source:"https://docs.uniswap.org/contracts/v3/reference/deployments/ethereum-deployments"}),8453:Object.freeze({name:"base",positionManager:"0x03a520b32C04BF3bEEf7BEb72E919cf822Ed34f1",wrappedNative:"0x4200000000000000000000000000000000000006",venue:"uniswap-v3",source:"https://docs.uniswap.org/contracts/v3/reference/deployments/base-deployments"})}),L2=new Sp(["function ownerOf(uint256 tokenId) view returns (address)","function positions(uint256 tokenId) view returns (uint96 nonce,address operator,address token0,address token1,uint24 fee,int24 tickLower,int24 tickUpper,uint128 liquidity,uint256 feeGrowthInside0LastX128,uint256 feeGrowthInside1LastX128,uint128 tokensOwed0,uint128 tokensOwed1)","function decreaseLiquidity((uint256 tokenId,uint128 liquidity,uint256 amount0Min,uint256 amount1Min,uint256 deadline) params) payable returns (uint256 amount0,uint256 amount1)","function collect((uint256 tokenId,address recipient,uint128 amount0Max,uint128 amount1Max) params) payable returns (uint256 amount0,uint256 amount1)","function multicall(bytes[] data) payable returns (bytes[] results)"]),$2=new Sp(["function withdraw(uint256 wad)"]),q2=(1n<<128n)-1n;var B2=VS("Transfer(address,address,uint256)").toLowerCase();G();ci();xe();import{getAddress as j2,Interface as vi,TypedDataEncoder as H2,parseUnits as z2}from"ethers";var WS="fulfillAdvancedOrder(((address offerer,address zone,(uint8 itemType,address token,uint256 identifierOrCriteria,uint256 startAmount,uint256 endAmount)[] offer,(uint8 itemType,address token,uint256 identifierOrCriteria,uint256 startAmount,uint256 endAmount,address recipient)[] consideration,uint8 orderType,uint256 startTime,uint256 endTime,bytes32 zoneHash,uint256 salt,bytes32 conduitKey,uint256 totalOriginalConsiderationItems) parameters,uint120 numerator,uint120 denominator,bytes signature,bytes extraData) advancedOrder,(uint256 orderIndex,uint8 side,uint256 index,uint256 identifier,bytes32[] criteriaProof)[] criteriaResolvers,bytes32 fulfillerConduitKey,address recipient)",Y2=new vi([`function ${WS}`]),X2=new vi(["function mintPublic(address nftContract,address feeRecipient,address minterIfNotPayer,uint256 quantity) payable","function mintAllowList(address nftContract,address feeRecipient,address minterIfNotPayer,uint256 quantity,(uint80 mintPrice,uint48 maxTotalMintableByWallet,uint48 startTime,uint48 endTime,uint48 dropStageIndex,uint32 maxTokenSupplyForStage,uint16 feeBps,bool restrictFeeRecipients) mintParams,bytes32[] proof) payable"]),GS=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"]),J2=new Set(GS);var vp=Object.freeze({robinhood:4663,ethereum:1,base:8453,arbitrum:42161,optimism:10,polygon:137,avalanche:43114,zora:7777777,blast:81457,sei:1329,ape_chain:33139,b3:8333,soneium:1868,ronin:2020,bera_chain:80094,shape:360,unichain:130,gunzilla:43419,abstract:2741,animechain:69e3,hyperevm:999,somnia:5031,monad:143,megaeth:4326,ink:57073,stablechain:988});var Q2=Object.freeze({OrderComponents:[{name:"offerer",type:"address"},{name:"zone",type:"address"},{name:"offer",type:"OfferItem[]"},{name:"consideration",type:"ConsiderationItem[]"},{name:"orderType",type:"uint8"},{name:"startTime",type:"uint256"},{name:"endTime",type:"uint256"},{name:"zoneHash",type:"bytes32"},{name:"salt",type:"uint256"},{name:"conduitKey",type:"bytes32"},{name:"counter",type:"uint256"}],OfferItem:[{name:"itemType",type:"uint8"},{name:"token",type:"address"},{name:"identifierOrCriteria",type:"uint256"},{name:"startAmount",type:"uint256"},{name:"endAmount",type:"uint256"}],ConsiderationItem:[{name:"itemType",type:"uint8"},{name:"token",type:"address"},{name:"identifierOrCriteria",type:"uint256"},{name:"startAmount",type:"uint256"},{name:"endAmount",type:"uint256"},{name:"recipient",type:"address"}]});var Z2=new vi(["function setApprovalForAll(address operator,bool approved)"]),eL=new vi(["function cancel((address offerer,address zone,(uint8 itemType,address token,uint256 identifierOrCriteria,uint256 startAmount,uint256 endAmount)[] offer,(uint8 itemType,address token,uint256 identifierOrCriteria,uint256 startAmount,uint256 endAmount,address recipient)[] consideration,uint8 orderType,uint256 startTime,uint256 endTime,bytes32 zoneHash,uint256 salt,bytes32 conduitKey,uint256 counter)[] orders) returns (bool cancelled)"]);Wr();var Ii=new Map,eA=Object.keys(ke).map(Number),tA=Object.keys(Ge).map(Number),nA=Object.keys(Ap).map(Number),Fa=Zt.map(e=>e.chainId),rA=[...new Set(Object.values(vp))],Da=new Set,Lp=!1;function $p(e){if(!e||typeof e!="object"||Object.isFrozen(e))return e;for(let t of Object.values(e))$p(t);return Object.freeze(e)}function O(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(Lp&&Da.has(t))throw new Error(`registerProvider refuses to overwrite built-in provider: ${t}`);return Ii.set(t,{chainIds:e.chainIds||[],auth:e.auth||"none",description:e.description||"",baseEnv:e.baseEnv||[],...e,id:t}),Ii.get(t)}function qp(e){return Ii.get(e)||null}function oA(){Da.clear();for(let[e,t]of Ii)Da.add(e),$p(t);Lp=!0}O({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"});O({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, user vault equities, and HLP tracking."});O({id:"hl-precompiles",venue:"hyperliquid",chainIds:[999],auth:"none",ops:["health","read","l1BlockNumber","markPx","oraclePx","spotPx","position","spotBalance","vaultEquity","withdrawable"],execution:"read-only",baseEnv:["HYPEREVM_RPC_URL","HYPER_EVM_RPC"],description:"HyperEVM L1Read precompiles (0x800-0x809). eth_call only. Includes HLP vault equity. No CoreWriter."});O({id:"protocol-templates",venue:"protocol-builder",chainIds:[],auth:"none",ops:["health","list","listNative","gate","prepareDeploy","buildNative","eval"],description:"Gated EVM templates plus deterministic Solana program and Bitcoin policy scaffolds. Native bundles require chain-specific compile, tests, and simulation before any unsigned deploy/funding prepare. NOT a firm audit."});O({id:"poly-public",venue:"poly",chainIds:[137],auth:"none",ops:["health","time","markets","book","midpoint","spread","price","events"],execution:"read-only",baseEnv:["POLY_CLOB_URL","POLY_GAMMA_URL"],description:"Polymarket CLOB + Gamma public REST"});O({id:"poly-clob",venue:"poly",chainIds:[137],auth:"none",ops:["health","prepareOrder"],execution:"prepare",localSignerSurfaces:["poly"],description:"Polymarket CLOB unsigned EIP-712 order prepare plus owner-operated local-signer submit. Hosted/keyless remains prepare-only."});O({id:"hl-delta-neutral",venue:"hyperliquid",chainIds:[],auth:"none",ops:["health","scan","quote","prepare","loop"],execution:"prepare",localSignerSurfaces:["hl"],description:"Hyperliquid funding carry. Armed through the existing hl signer. Hosted/keyless remains prepare-only. Not automated."});O({id:"lighter-delta-neutral",venue:"lighter",chainIds:[],auth:"none",ops:["health","scan","quote","prepare","loop"],execution:"prepare",localSignerSurfaces:["lighter"],description:"Lighter.xyz funding carry. Armed through the official sendTx local-signer. Hosted/keyless remains prepare-only. Not automated."});O({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."});O({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."});O({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."});O({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",localSignerSurfaces:["evm-nft"],baseEnv:[],description:"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, surface contract risk, and hand execution to the local signer after explicit arming and bounded grant."});O({id:"universal-mint-router",venue:"universal-nft-mint",chainIds:[],auth:"optionalApiKey",ops:["health","capabilities","prepare"],execution:"prepare",baseEnv:["OPENSEA_API_KEY"],description:"Prepare-only exact universal mint routing across reviewed EVM and Ordinals adapters. Universal Solana mint is RESEARCH_ONLY and disabled until canonical serialized-message decoding ships; the separate Magic Eden marketplace provider is unchanged. It never signs or broadcasts."});O({id:"universal-nft-lifecycle",venue:"universal-nft-lifecycle",chainIds:[],auth:"optionalApiKey",ops:["health","capabilities","route"],execution:"read",baseEnv:["OPENSEA_API_KEY","MAGICEDEN_API_KEY","SATFLOW_API_KEY"],description:"Read-only NFT lifecycle route discovery. It does not prepare, sign, or broadcast artifacts; callers must invoke and review the selected provider operation separately."});for(let[e,t,n]of[["universal-evm-nft-transfer","evm-nft-transfer","Exact unsigned ERC-721/ERC-1155 safeTransferFrom preparation."],["universal-solana-nft-transfer","solana-nft-transfer","Exact unsigned verified Metaplex NFT/Core transfer preparation."],["universal-ordinals-transfer","bitcoin-nft-transfer","Exact unsigned Ordinals PSBT transfer-plan preparation."]])O({id:e,venue:t,chainIds:[],auth:"none",ops:["health","prepare"],execution:"prepare",description:n});O({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."});O({id:"evm-token-sniper",venue:"evm-token-launches",chainIds:Fa,auth:"none",ops:["health","scan"],execution:"prepare",localSignerSurfaces:["evm-swap"],baseEnv:Zt.flatMap(e=>e.rpcEnv),description:"One generic EVM token-sniping path across every configured EVM chain: live identity, pools, structural risk, sell simulation, quote, guarded transaction preparation, and local-signer execution handoff. Robinhood Chain is the default, not a special implementation."});O({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)"});O({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)"});O({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"});O({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."});O({id:"satflow",venue:"bitcoin-marketplace",chainIds:[],auth:"apiKey",ops:["health","collectionFloors","collectionStats","item","walletContents","floorListings","preparePurchase","prepareList"],execution:"prepare",localSignerSurfaces:["btc"],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."});O({id:"jupiter",venue:"solana-dex",chainIds:[],auth:"none",ops:["health","venues","quote","prepare"],execution:"prepare",localSignerSurfaces:["sol"],baseEnv:["JUPITER_SWAP_API_URL","SOLANA_RPC_URL"],description:"Jupiter Swap API v1 quote + local-signer Solana swap handoff"});O({id:"hl-perps",venue:"hyperliquid",chainIds:[],auth:"none",ops:["health","assetInfo","prepareOrder","prepareCancel","prepareLeverage","prepareIsolatedMargin","prepareBracket","prepareBuilderApproval"],execution:"prepare",localSignerSurfaces:["hl"],notes:"Hyperliquid perp, HIP-3, and HIP-4 outcome orders through local-signer L1 action handoff."});O({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."});O({id:"hl-entry-state",venue:"hyperliquid",chainIds:[],auth:"none",ops:["health","see","qualify","lock","list","watch"],execution:"read-only",description:"SEE/ENTER/MANAGE for discretionary HL perps: compose sourced /info fields, qualify a side, lock the state only after a fill receipt, and alert_only-diff live vs that lock. Never signs."});O({id:"hl-staking",venue:"hypercore-staking",chainIds:[],auth:"none",ops:["health","validators","delegatorSummary","delegations","rewards","history","preflight","prepareStakeDeposit","prepareStakeWithdraw","prepareDelegate"],execution:"prepare",localSignerSurfaces:["hl"],baseEnv:["HL_INFO_URL","HL_EXCHANGE_URL","HL_TESTNET"],description:"Hyperliquid HyperCore HYPE staking. Public reads plus local-signer EIP-712 execution for cDeposit / cWithdraw / tokenDelegate after arming. Hosted/keyless remains prepare-only."});O({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."});O({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"});O({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)"});O({id:"dexscreener",venue:"dex",chainIds:[],auth:"none",ops:["health","token","search","pair"],baseEnv:["DEXSCREENER_API_URL"],description:"DexScreener public token/pair discovery"});O({id:"uniswap-v3",venue:"dex",chainIds:eA,auth:"none",ops:["health","quote","prepare","quotePath","ethUsdc","chains"],execution:"prepare",localSignerSurfaces:["evm-swap"],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"});O({id:"lp-exit",venue:"dex",chainIds:nA,auth:"none",ops:["health","inspect","prepareRemove","prepareSettlement","prepareUnwrap","chains"],execution:"prepare",baseEnv:["ETH_RPC_URL","BASE_RPC_URL"],description:"Receipt-gated Uniswap V3 LP exit into native asset: remove/collect, net-route token legs, then unwrap. Unsigned only."});O({id:"lp-liquidity-ranker",venue:"dex",chainIds:Fa,auth:"none",ops:["health","rank"],execution:"read-only",description:"Cross-chain LP destination analysis: deepest liquidity and net-best migration are separate, exact canonical mappings required."});O({id:"lp-destination-discovery",venue:"dex",chainIds:Fa,auth:"none",ops:["health","discover"],execution:"read-only",description:"Live exact-address LP pool discovery across configured chains; reports deepest liquidity separately from cost-qualified migration evidence."});O({id:"uniswap-v4",venue:"dex",chainIds:tA,auth:"none",ops:["health","quote","inspectHook","prepare","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 V4 quotes, hook permission/code/pool-state inspection, and guarded unsigned Universal Router preparation across official deployments plus Robinhood Chain."});O({id:"x402",venue:"payments",chainIds:[],auth:"none",ops:["health","inspect","prepare"],execution:"prepare",description:"x402 v2 PAYMENT-REQUIRED inspection and explicit-cap exact-payment templates. Never signs, calls a facilitator, or retries a paid request."});O({id:"bankr",venue:"wallet-data",chainIds:[],auth:"apiKey",ops:["health","wallet","portfolio","swapQuote"],execution:"read-only",baseEnv:["BANKR_API_KEY","BANKR_API_URL"],description:"Bankr Wallet API read-only identity, portfolio, and swap quotes. Oracle excludes Bankr swap, transfer, sign, submit, agent, and LLM endpoints."});O({id:"aerodrome",venue:"dex",chainIds:[8453],auth:"none",ops:["health","quote","prepare","chains"],execution:"prepare",localSignerSurfaces:["evm-swap"],baseEnv:["BASE_RPC_URL"],description:"Aerodrome Slipstream CL on Base \u2014 QuoterV2 + SwapRouter exact-input via eth_call (tickSpacing, no key)"});O({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)"});O({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)"});O({id:"hop",venue:"bridge",chainIds:[1,10,137,42161],auth:"none",ops:["health","quote"],baseEnv:["HOP_API_URL"],description:"Hop Protocol bridge quotes (public)"});O({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)"});O({id:"cowswap",venue:"dex",chainIds:[1,100,42161,8453],auth:"none",ops:["health","quote","prepareOrder","order","status","chains","arm"],execution:"armed-local",localSignerSurfaces:["evm-order"],baseEnv:[],description:"CowSwap batch auction. Quote is public; Allow posts official api.cow.fi orders."});O({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)"});O({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)"});O({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"});O({id:"anvil-nft",venue:"robinhood-nft",chainIds:[4663],auth:"optionalApiKey",ops:["health","markets","quoteSpecificBuy","quoteSell","scanCollection","scanAllMarkets","scanCrossVenueArb","scanAllMarketsArb","prepareSpecificBuy","prepareSell"],execution:"prepare",localSignerSurfaces:["evm-nft"],baseEnv:["RH_CHAIN_RPC","OPENSEA_API_KEY","OPENSEA_ENV_FILE"],description:"All-market Anvil discovery and exact-token arbitrage, with exact buy and sell execution through the armed owner-local signer after human confirmation"});O({id:"stonkbrokers",venue:"robinhood-nft",chainIds:[4663],auth:"optionalApiKey",ops:["health","quoteBrokerBuy","scanBrokerLoot","prepareBrokerBuy","brokerDesk","clockInStatus","prepareClockIn"],execution:"prepare",baseEnv:["RH_CHAIN_RPC"],description:"Unsigned StonkBrokers Broker Desk discovery, nested-loot verification, and bounded local-only preparations"});O({id:"opensea-nft",venue:"nft",chainIds:rA,auth:"apiKey",ops:["health","collection","floor","bestListings","bestListing","bestOffer","accountNfts","accountPnl","prepareMint","prepareList","prepareCancel"],execution:"prepare",baseEnv:["OPENSEA_API_KEY","OPENSEA_ENV_FILE"],description:"OpenSea multichain NFT inventory, floors, and unsigned bounded mint, listing, and listing-cancellation preparations; opaque buy/sweep fulfillment is disabled"});O({id:"local-marketplace",venue:"local-p2",chainIds:[],auth:"none",ops:["health","createListing","listListings","cancelListing","createOffer","armFill"],execution:"prepare",localSignerSurfaces:["evm-nft"],description:"Owner-local P2 catalog stored under ~/.config/oracle. Additive and isolated from OpenSea, Magic Eden, Satflow, Bisq, Anvil, and Polymarket. Listings are armed for the owner-local signer; sign-and-broadcast is an explicit createLocalMarketplace().instructFill instruction. Generic signHash is refused."});O({id:"local-x402",venue:"local-x402",chainIds:[],auth:"none",ops:["health","createIntent","listIntents","cancelIntent","armPayment"],execution:"prepare",localSignerSurfaces:["evm-swap"],description:"Owner-local x402 payment budgets under ~/.config/oracle. Additive and isolated from OpenSea and Telegram. Intents are armed; sign-and-broadcast is an explicit createLocalX402().instructPay instruction. Generic signHash is refused."});O({id:"local-pack-registry",venue:"local-packs",chainIds:[],auth:"none",ops:["health","registerPack","listPacks","revokePack"],execution:"read-only",description:"Owner-local third-party pack REGISTRY under ~/.config/oracle. Catalog only: packs are never loaded or executed. Isolated from OpenSea and Telegram."});O({id:"erc8004-identity",venue:"agent-identity",chainIds:[],auth:"none",ops:["health","prepareIdentityRegistration","prepareAgentURIUpdate","inspectIdentity","arm"],execution:"armed-local",localSignerSurfaces:["evm"],baseEnv:["ORACLE_ERC8004_CHAIN_ID","ORACLE_ERC8004_IDENTITY_REGISTRY"],description:"Draft ERC-8004 identity. Public prepare is keyless; Allow broadcasts type-2 register/setAgentURI."});O({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"});O({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"});O({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"});O({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"});O({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"});O({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)"});O({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"});O({id:"odos",venue:"dex",chainIds:[1,10,56,137,8453,42161,43114,4663],auth:"none",ops:["health"],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)"});O({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"});O({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"});O({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."});O({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."});O({id:"polygon-staking",venue:"polygon-staking",chainIds:[137],auth:"none",ops:["health","validators","validatorDetail"],baseEnv:["POLYGON_STAKING_API_URL"],description:"Polygon POS staking validators"});O({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."});O({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."});O({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."});O({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."});O({id:"tron-public",venue:"tron",chainIds:[],auth:"none",ops:["health","account","trc20Balances","trc20Transfers","chainParameters"],execution:"read-only",localSignerSurfaces:[],baseEnv:["TRON_API_URL","TRONGRID_API_KEY"],description:"Tron mainnet via public TronGrid. TRX balance, TRC20 token balances, USDT-TRC20 transfer history, chain parameters. Tron carries the largest USDT float of any chain. Keyless; TRONGRID_API_KEY only raises the rate ceiling and never travels to a non-TronGrid host."});O({id:"ton-public",venue:"ton",chainIds:[],auth:"none",ops:["health","accountState","jettonBalances","transactions"],execution:"read-only",localSignerSurfaces:[],baseEnv:["TON_API_URL","TONCENTER_API_KEY"],description:"TON via public toncenter. Account state + nanoton balance, jetton (TON's ERC20) balances, transaction history. The settlement layer for Telegram-native assets. Keyless; TONCENTER_API_KEY only raises the rate ceiling."});O({id:"cosmos-lcd",venue:"cosmos",chainIds:[],auth:"none",ops:["health","chains","balances","delegations","denomTrace"],execution:"read-only",localSignerSurfaces:[],baseEnv:["COSMOS_LCD_URL","COSMOS_CHAIN"],description:"Cosmos SDK chains via keyless LCD/REST \u2014 one provider, many chains (cosmoshub default, plus osmosis/celestia/injective/neutron/dydx/noble/kava, or any LCD via COSMOS_LCD_URL_<CHAIN>). Bank balances, staking delegations + unbondings + rewards, and IBC denom-trace resolution for ibc/<hash> denoms."});O({id:"sui-public",venue:"sui",chainIds:[],auth:"none",ops:["health"],execution:"unavailable",deprecated:{since:"2026-08-25",reason:"Sui public fullnodes return JSON-RPC -32601 because the JSON-RPC surface is deprecated",evidence:"Migrate the provider to Sui GraphQL or gRPC before restoring it to the live roster"},localSignerSurfaces:[],baseEnv:["SUI_RPC_URL"],description:"QUARANTINED: Sui public JSON-RPC is deprecated. A GraphQL or gRPC replacement has not shipped."});O({id:"aptos-public",venue:"aptos",chainIds:[],auth:"none",ops:["health","account","resources","coinBalances"],execution:"read-only",localSignerSurfaces:[],baseEnv:["APTOS_FULLNODE_URL","APTOS_API_KEY"],description:"Aptos mainnet via the public fullnode REST API. Ledger info, account sequence/auth key, Move resources, and coin balances (0x1::coin::balance view with a CoinStore resource fallback). Read-only; the transaction submit door is never called."});O({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)."});O({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."});O({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."});O({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."});O({id:"social-intel",venue:"oracle-social",chainIds:[],auth:"none",ops:["health","trendingTokens","trendingCas","keywordMentions","smartAccounts","narratives"],execution:"read-only",localSignerSurfaces:[],baseEnv:["ORACLE_SOCIAL_INTEL_STORE","ORACLE_SOCIAL_INTEL_STALE_MIN"],description:"Local curated-account crypto social intelligence. Sample = graded caller list, NOT a firehose; every response reports sample size and snapshot age."});O({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."});O({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."});O({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"});O({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)"});O({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)"});O({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)"});O({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)"});O({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)"});O({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)"});O({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)"});O({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)"});O({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)"});O({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."});O({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)"});O({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)"});O({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)"});O({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)"});O({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)"});O({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)"});O({id:"limit-order",venue:"1inch-lop",chainIds:[1,10,56,137,8453,42161],auth:"none",ops:["health","prepare","arm"],execution:"armed-local",localSignerSurfaces:["evm-order"],description:"1inch Limit Order Protocol v4. Queues on the local signer; Allow posts the order."});O({id:"jupiter-dca",venue:"jupiter",chainIds:[],auth:"none",ops:["health","prepare","arm"],execution:"armed-local",localSignerSurfaces:["sol"],description:"Jupiter limit/DCA. Unsigned tx queues on the sol signer; Allow submits."});O({id:"protective-monitors",venue:"oracle-intel",chainIds:[],auth:"none",ops:["health","depeg","oracleDeviation","exploitFeed","goplus","liquidationLadder"],execution:"read-only",description:"Alert-only depeg, oracle deviation, exploit feed, GoPlus second opinion, liquidation ladder."});O({id:"funding-scanner",venue:"perps",chainIds:[],auth:"none",ops:["health","scan"],execution:"read-only",description:"Cross-venue funding carry ranked net of fee drag. Failed venues stay FAILED."});O({id:"perp-universal",venue:"perps",chainIds:[],auth:"none",ops:["health","fundingAll","prepareOrder"],execution:"prepare-only",description:"Live fundingAll across HL/GMX/dYdX + honest FAILED Drift/Vertex. prepareOrder unsigned."});O({id:"onchain-options",venue:"options",chainIds:[],auth:"none",ops:["health","rank"],execution:"read-only",description:"Local Black-Scholes ranking. No arm until official Derive/Lyra domain is pinned."});O({id:"holder-clusters",venue:"oracle-intel",chainIds:[],auth:"none",ops:["health","score"],execution:"read-only",description:"Heuristic holder HHI + common-funding clusters. Not identity."});O({id:"kalshi",venue:"prediction",chainIds:[],auth:"none",ops:["health","markets"],execution:"read-only",description:"Kalshi market catalog read-only. Trading may be US-restricted. Prepare refused."});O({id:"derive-options",venue:"options",chainIds:[],auth:"none",ops:["health"],execution:"unavailable",deprecated:{since:"2026-08-25",reason:"No official Derive EIP-712 domain or contract is pinned, so prepare remains unavailable",evidence:"prepareOption() in onchain-options.mjs refuses unconditionally"},description:"UNAVAILABLE: Derive execution has no pinned official domain. Use onchain-options for local ranking."});O({id:"limitless",venue:"prediction",chainIds:[],auth:"none",ops:["health","markets"],execution:"read-only",description:"Limitless market catalog. Prepare refused \u2014 no grant-bound decoder."});O({id:"dov-vaults",venue:"options",chainIds:[],auth:"none",ops:["health"],execution:"unavailable",deprecated:{since:"2026-08-25",reason:"The reviewed DOV vault registry is empty, so every vault read refuses",evidence:"REVIEWED_DOV_VAULTS.length is zero and no reviewed code hash is pinned"},description:"UNAVAILABLE: the reviewed DOV vault registry is empty and every read fails closed."});O({id:"prediction-match",venue:"prediction",chainIds:[],auth:"none",ops:["health","match"],execution:"read-only",description:"Cross-venue event match. Same title is not a match."});O({id:"tee-attestation",venue:"identity",chainIds:[],auth:"none",ops:["health","verify"],execution:"read-only",description:"TEE schema stub. Hardware unavailable. Unknown root unverified."});O({id:"keeper-mirror",venue:"oracle-intel",chainIds:[],auth:"none",ops:["health"],execution:"read-only",description:"Keeper alert-mirror. Off by default. No execute path."});O({id:"erc7715-permissions",venue:"aa",chainIds:[],auth:"none",ops:["health","normalize"],execution:"read-only",description:"ERC-7715 permission normalize. Wildcards refused. aa allowlist empty."});O({id:"erc7710-delegation",venue:"aa",chainIds:[],auth:"none",ops:["health","inspect"],execution:"read-only",description:"ERC-7710 delegation inspect. Missing revocation/expiry fails closed."});O({id:"binance-public",venue:"cex",chainIds:[],auth:"none",ops:["health","ticker","orderbook","funding","markPrice","openInterest","fundingHistory"],execution:"read-only",localSignerSurfaces:[],baseEnv:["BINANCE_API_URL","BINANCE_FAPI_URL"],description:"Binance public spot + USD-M perp market data (ticker, depth, premiumIndex funding, open interest). Keyless reads only; no trading endpoints."});O({id:"okx-public",venue:"cex",chainIds:[],auth:"none",ops:["health","ticker","orderbook","funding","markPrice","openInterest"],execution:"read-only",localSignerSurfaces:[],baseEnv:["OKX_API_URL"],description:"OKX public v5 market data (ticker, books, swap funding-rate, mark-price, open-interest). Keyless reads only; no trading endpoints."});O({id:"bybit-public",venue:"cex",chainIds:[],auth:"none",ops:["health","ticker","orderbook","funding","markPrice","openInterest","fundingHistory"],execution:"read-only",localSignerSurfaces:[],baseEnv:["BYBIT_API_URL"],description:"Bybit public v5 market data (spot/linear tickers, orderbook, funding, open interest). Keyless reads only; no trading endpoints."});O({id:"cex-basis",venue:"cex",chainIds:[],auth:"none",ops:["health","basis","fundingSpread","legs"],execution:"read-only",localSignerSurfaces:[],baseEnv:["BINANCE_API_URL","OKX_API_URL","BYBIT_API_URL","HL_INFO_URL"],description:"Cross-venue perp basis and annualized funding spreads across Binance, OKX, Bybit and Hyperliquid public data. Analysis only, no sizing and no prepare."});O({id:"snapshot-governance",venue:"governance",chainIds:[],auth:"none",ops:["health","spaces","proposals","activeProposals","proposal","votes","votingPower"],execution:"read-only",localSignerSurfaces:[],baseEnv:["SNAPSHOT_API_URL"],description:"Snapshot.org off-chain governance reads: spaces, proposals, proposal detail, an address's votes and voting power. Never signs a vote."});O({id:"tally-governance",venue:"governance",chainIds:[1,10,42161],auth:"none",ops:["health","governors","info","proposals","proposal","voterStatus","tallyProposals"],execution:"read-only",localSignerSurfaces:[],baseEnv:["TALLY_API_URL","TALLY_API_KEY"],description:"Governor Bravo / OZ Governor on-chain proposal state and vote tallies for major DAOs, plus optional keyed Tally metadata. Read-only ABI has no vote/queue/execute selector."});O({id:"launch-radar",venue:"launch-radar",chainIds:[],auth:"none",ops:["health","status","snapshot","candidates","rpcHealth","evaluateStrategy"],execution:"read-only",localSignerSurfaces:[],baseEnv:["ORACLE_CONFIG_DIR","LAUNCH_RADAR_STORE_PATH"],description:"Read-only Launch Radar data plane: durable shadow-cycle status/snapshot from local disk, plus pure candidate normalization, RPC-sample ranking, and strategy-policy evaluation over caller-supplied inputs. Shadow-only, unfunded, no signer, no broadcast."});O({id:"stablecoin-peg",venue:"oracle-intel",chainIds:[],auth:"none",ops:["health","scan"],execution:"read-only",localSignerSurfaces:[],baseEnv:[],description:"Peg-deviation scan across major and Hyperliquid-native stables. Ranks by absolute bps from $1 and classifies normal/watch/warn/depeg. Unpriced is unknown, never on-peg. Read-only composition of DefiLlama/Pyth/DexScreener."});oA();import DA from"node:os";import Zp from"node:path";import Mp from"node:fs";import uA from"node:path";import{createHash as iA}from"node:crypto";var sA="sha256:"+"0".repeat(64);function Bp(e){if(e&&typeof e=="object"&&!Object.isFrozen(e)){for(let t of Object.values(e))Bp(t);Object.freeze(e)}return e}function ja(e){return Array.isArray(e)?`[${e.map(ja).join(",")}]`:e&&typeof e=="object"?`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${ja(e[t])}`).join(",")}}`:JSON.stringify(e)}function aA(e){return`sha256:${iA("sha256").update(ja(e)).digest("hex")}`}function cA(e,t,n){if(!e||typeof e!="object"||Array.isArray(e))throw new TypeError("evidence event must be an object");if(typeof e.id!="string"||e.id.length===0)throw new TypeError("evidence event id must be non-empty");if(typeof e.type!="string"||e.type.length===0)throw new TypeError("evidence event type must be non-empty");if(typeof e.at!="string"||!Number.isFinite(Date.parse(e.at))||new Date(e.at).toISOString()!==e.at)throw new TypeError("evidence event at must be an exact ISO instant");if(!e.data||typeof e.data!="object"||Array.isArray(e.data))throw new TypeError("evidence event data must be an object");return{sequence:t,id:e.id,type:e.type,at:e.at,data:structuredClone(e.data),previousDigest:n}}function Up(e=[]){if(!Array.isArray(e))throw new TypeError("evidence records must be an array");let t=new Set,n=sA,r=e.map((o,i)=>{if(t.has(o?.id))throw new Error(`duplicate evidence event id: ${o.id}`);t.add(o?.id);let s=cA(o,i+1,n),a=aA(s);if(o.sequence!==i+1||o.previousDigest!==n||o.digest!==a)throw new Error(`evidence digest chain mismatch at sequence ${i+1}`);return n=a,{...s,digest:a}});return Bp(r)}var lA=1;function _i(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)&&Object.getPrototypeOf(e)===Object.prototype}function dA(e){return structuredClone(e)}function Ha(e,t="state"){if(!(e===null||typeof e=="string"||typeof e=="boolean")&&!(typeof e=="number"&&Number.isFinite(e))){if(Array.isArray(e))return e.forEach((n,r)=>Ha(n,`${t}[${r}]`));if(_i(e)){for(let[n,r]of Object.entries(e)){if(r===void 0)throw new Error(`launch-radar store: non-JSON value at ${t}.${n}`);Ha(r,`${t}.${n}`)}return}throw new Error(`launch-radar store: non-JSON value at ${t}`)}}function pA(e){if(!_i(e)||!["shadow","armed","autonomous"].includes(e.mode)||typeof e.status!="string"||typeof e.ambiguous!="boolean")throw new Error("launch-radar store: corrupt strategy status shape")}function fA(e){if(!_i(e)||e.version!==lA)throw new Error("launch-radar store: corrupt or unsupported version");if(!Array.isArray(e.candidates)||!(e.cursor===null||_i(e.cursor))||!Array.isArray(e.evidence))throw new Error("launch-radar store: corrupt state shape");pA(e.strategyStatus),Ha(e);try{Up(e.evidence)}catch(t){throw new Error(`launch-radar store: corrupt evidence: ${t.message}`)}return dA(e)}function mA(e,t=!1){let n;try{n=Mp.lstatSync(e)}catch(r){if(t&&r?.code==="ENOENT")return!1;throw r}if(n.isSymbolicLink())throw new Error("launch-radar store: path must not be a symlink");if(!n.isFile())throw new Error("launch-radar store: path must be a regular file");if((n.mode&511)!==384)throw new Error("launch-radar store: existing file permissions must be 0600");return!0}function hA(e){mA(e);let t;try{t=JSON.parse(Mp.readFileSync(e,"utf8"))}catch{throw new Error("launch-radar store: corrupt JSON")}return fA(t)}function Dp(e={}){let t=e.path;if(typeof t!="string"||!uA.isAbsolute(t))throw new Error("launch-radar store: path must be absolute");return hA(t)}var Gr=Object.freeze({PASS:"PASS",WARN:"WARN",BLOCK:"BLOCK",UNKNOWN:"UNKNOWN"}),yA=new Set(["LIVE","CACHED","STALE","UNKNOWN","UNAVAILABLE"]),Fp=/^0x[0-9a-fA-F]{40}$/,gA=/^0x[0-9a-fA-F]{64}$/;function Xn(e){if(e&&typeof e=="object"&&!Object.isFrozen(e)){for(let t of Object.values(e))Xn(t);Object.freeze(e)}return e}function ut(e,t=null){return e&&typeof e=="object"?structuredClone(e):t}function Hp(e){return typeof e!="string"||!Number.isFinite(Date.parse(e))?null:new Date(e).toISOString()===e?e:null}function jp(e){return!!(e&&yA.has(e.evidence)&&Hp(e.observedAt))}function zp(e){return!e||e.status!=="KNOWN"||e.amount===null||e.amount===void 0||e.amount===""?{status:"UNKNOWN",amount:null,unit:e?.unit??null}:{status:"KNOWN",amount:String(e.amount),unit:e.unit??null}}function Oi(e){return[...new Set(e.filter(Boolean))]}function bA(e={}){let t=[],n=[],r=[];(e.venue?.supported!==!0||e.venue?.verified!==!0)&&t.push("unsupported venue"),e.signal?.unsolicitedAirdrop===!0&&t.push("unsolicited airdrop is not a held or eligible candidate"),e.risk?.verdict==="FAIL"&&t.push("risk verdict is FAIL"),e.sellability?.verdict==="FAIL"&&t.push("sellability verdict is FAIL"),e.route?.status==="BLOCK"&&t.push("route is blocked");for(let[i,s]of[["token",e.token],["venue",e.venue],["signal",e.signal],["risk",e.risk],["sellability",e.sellability],["route",e.route]])!jp(s)||s.evidence==="UNKNOWN"||s.evidence==="UNAVAILABLE"?n.push(`${i} evidence is missing or unavailable`):(s.evidence==="CACHED"||s.evidence==="STALE")&&r.push(`${i} evidence is ${s.evidence}`);(!e.pool||!jp(e.pool))&&n.push("pool evidence is missing or unavailable"),(!e.risk||!["PASS","CAUTION","FAIL"].includes(e.risk.verdict))&&n.push("risk verdict is UNKNOWN"),(!e.sellability||!["PASS","CAUTION","FAIL"].includes(e.sellability.verdict))&&n.push("sellability verdict is UNKNOWN"),(!e.route||!["PASS","WARN","BLOCK"].includes(e.route.status))&&n.push("route status is UNKNOWN"),zp(e.route?.cost).status==="UNKNOWN"&&n.push("route cost is UNKNOWN"),e.risk?.verdict==="CAUTION"&&r.push("risk verdict is CAUTION"),e.sellability?.verdict==="CAUTION"&&r.push("sellability verdict is CAUTION"),e.route?.status==="WARN"&&r.push("route status is WARN");let o=Oi(t);return o.length?Xn({status:Gr.BLOCK,whyBlocked:o}):n.length?Xn({status:Gr.UNKNOWN,whyBlocked:Oi(n)}):r.length?Xn({status:Gr.WARN,whyBlocked:[],warnings:Oi(r)}):Xn({status:Gr.PASS,whyBlocked:[]})}function wA(e={}){let t=ut(e,{}),n=Object.fromEntries(Object.entries(t).map(([o,i])=>[o,Hp(i)])),r=(o,i)=>n[o]&&n[i]?Math.max(0,Date.parse(n[i])-Date.parse(n[o])):null;return t.stagesMs={discoveryToRisk:r("discoveredAt","riskCompletedAt"),riskToSellability:r("riskCompletedAt","sellabilityCompletedAt"),sellabilityToRoute:r("sellabilityCompletedAt","routeCompletedAt"),routeToNormalized:r("routeCompletedAt","normalizedAt"),total:r("discoveredAt","normalizedAt")},t}function Vp(e={}){if(!e||typeof e!="object"||Array.isArray(e))throw new TypeError("candidate must be an object");let t=ut(e.chain,{}),n=ut(e.token,{}),r=ut(e.pool),o=ut(e.venue,{}),i=ut(e.signal,{}),s=ut(e.route,{});s.cost=zp(s.cost);let a=bA({...e,chain:t,token:n,pool:r,venue:o,signal:i,route:s}),c=i.unsolicitedAirdrop===!0,u=Fp.test(n.address||"")?n.address.toLowerCase():"unknown-token",l=Fp.test(r?.address||"")?r.address.toLowerCase():gA.test(r?.poolId||"")?r.poolId.toLowerCase():"unknown-pool",d=`${Number.isInteger(t.id)?t.id:"unknown-chain"}:${u}:${l}:${o.key||"unknown-venue"}`;return Xn({id:d,status:a.status,chain:t,token:n,pool:r,venue:o,signal:i,risk:ut(e.risk,{verdict:"UNKNOWN",evidence:"UNKNOWN",observedAt:null}),sellability:ut(e.sellability,{verdict:"UNKNOWN",evidence:"UNKNOWN",observedAt:null}),sellSimulation:ut(e.sellSimulation,{verdict:"UNKNOWN",evidence:"UNAVAILABLE",observedAt:null}),quoteAsset:e.quoteAsset??r?.quoteAsset??null,roundTripLossBps:e.roundTripLossBps??null,quoteAmountIn:e.quoteAmountIn??null,quoteSlippageBps:e.quoteSlippageBps??null,quoteAssetDecimals:e.quoteAssetDecimals??null,route:s,prepared:ut(e.prepared,{status:"NOT_PREPARED",unsigned:!0}),whyBlocked:Oi([...e.whyBlocked||[],...a.whyBlocked]),latency:wA(e.latency),held:c?!1:e.held===!0,eligible:c?!1:a.status===Gr.PASS&&e.eligible!==!1})}function Wp(e=[]){if(!Array.isArray(e))throw new TypeError("candidates must be an array");return Object.freeze(e.map(Vp).sort((t,n)=>t.id.localeCompare(n.id)))}function Gp(e){return[...new Set(e.filter(Boolean).map(String))]}function An(e){return Array.isArray(e)?e.map(An):e&&typeof e=="object"?Object.fromEntries(Object.entries(e).filter(([,t])=>t!==void 0).map(([t,n])=>[t,An(n)])):e}function en(e,t,n="UNKNOWN"){return!e||typeof e!="object"?{evidence:n,observedAt:t}:An({...structuredClone(e),evidence:e.evidence||n,observedAt:e.observedAt||t})}function EA(e,t){let n=String(t||"").toLowerCase();return!!(n&&[e?.address,e?.pair,e?.poolId].some(r=>String(r||"").toLowerCase()===n))}function SA(e,t){let n=e.poolId||e.poolAddress||null,r=[t.topPool,...t.pools?.pools||[]].filter(Boolean),o=n?r.find(s=>EA(s,n)):t.topPool,i={address:e.poolAddress??null,poolId:e.poolId,poolKey:e.poolKey,quoteAsset:e.quoteAsset};return An({...o||{},...i})}function AA(e,t,n,r){let o=e.observedAt||r,i=SA(e,t),s=en(t.scannerRisk||t.risk,o),a=en(t.sellability,o,"UNAVAILABLE"),c=en(t.quote,o,"UNAVAILABLE"),u=c.evidence==="LIVE"?"PASS":"UNKNOWN";return An({chain:{id:e.chainId,...t.chain||{}},token:en({address:e.tokenAddress,...t.token||{}},o,"LIVE"),pool:en(i,o,"LIVE"),venue:en({...e.venue,supported:e.venue?.supported===!0,verified:e.venue?.verified===!0},o,"LIVE"),signal:en({kind:e.kind,source:"verified-factory",unsolicitedAirdrop:!1},o,"LIVE"),risk:s,sellability:a,sellSimulation:en(t.sellSimulation,o,"UNAVAILABLE"),quoteAsset:e.quoteAsset||i.quoteAsset||null,roundTripLossBps:t.roundTripLossBps??null,quoteAmountIn:c.amountIn??null,quoteSlippageBps:t.quoteSlippageBps??null,quoteAssetDecimals:t.quoteAssetDecimals??null,route:An({status:u,amountOut:c.amountOut??null,cost:c.fee==null?{status:"UNKNOWN",amount:null,unit:null}:{status:"KNOWN",amount:String(c.fee),unit:c.feeUnit||"wei"},routeEvidence:c.routeEvidence,evidence:c.evidence,observedAt:c.observedAt}),prepared:{status:"NOT_PREPARED",unsigned:!0},whyBlocked:Gp([...n||[],...t.blockedReasons||[],t.error]),latency:{discoveredAt:o,riskCompletedAt:s.observedAt,sellabilityCompletedAt:a.observedAt,routeCompletedAt:c.observedAt,normalizedAt:r}})}async function Kp(e={}){let t=e.discover||e.discoveryFn,n=e.evaluator||e.evaluate;if(typeof t!="function")throw new TypeError("service requires an injected discovery function");if(typeof n!="function")throw new TypeError("service requires an injected evaluator function");let r=await t(e.discovery||e.discoveryOptions||{}),o=Array.isArray(r?.discoveries)?r.discoveries:[],i=e.observedAt||o[0]?.observedAt||new Date(0).toISOString(),s=[];for(let a of o){if(a?.signal?.unsolicitedAirdrop===!0||a?.unsolicitedAirdrop===!0||a?.kind==="wallet-transfer")continue;let c;try{c=await n({chainId:a.chainId,tokenAddress:a.tokenAddress,discovery:An(structuredClone(a)),prepare:e.prepare===!0})}catch(u){c={error:`evaluation unavailable: ${String(u?.message||u).slice(0,300)}`}}s.push(AA(a,c||{},r?.status==="LIVE"?[]:r?.whyBlocked,i))}return Object.freeze({status:r?.status||"UNKNOWN",cursor:r?.cursor||null,unavailable:Object.freeze([...r?.unavailable||[]]),whyBlocked:Object.freeze(Gp(r?.whyBlocked||[])),candidates:Wp(s)})}var Jn=Object.freeze({OK:"ok",DEGRADED:"degraded",UNKNOWN:"unknown"}),Yp=Object.freeze({fresh:0,stale:1,down:2});function vA(e,t,n=.5){return Number.isFinite(t)?e==null||!Number.isFinite(e)?t:n*t+(1-n)*e:e??null}function xA(e,t=Math.random){let n=Math.min(1e3,50*2**Math.max(0,e-1)),r=t()*n*.5;return Math.round(n+r)}function kA(e){if(!e||typeof e!="object")return{ok:!1,reason:"malformed probe response: not an object"};let{blockNumber:t,chainId:n,timestampMs:r}=e;return!Number.isInteger(t)||t<0?{ok:!1,reason:"malformed probe response: blockNumber must be a non-negative integer"}:n!=null&&(!Number.isFinite(n)||n<=0)?{ok:!1,reason:"malformed probe response: chainId must be a positive number"}:r!=null&&(!Number.isFinite(r)||r<0)?{ok:!1,reason:"malformed probe response: timestampMs must be a non-negative number"}:{ok:!0}}function IA(e,t,n){let r=n(t).then(()=>{throw new Error(`rpc-health: probe timeout after ${t}ms`)});return r.catch(()=>{}),Promise.race([e,r])}async function _A(e,t){let{probe:n,clock:r,sleep:o,rng:i,timeoutMs:s,maxRetries:a,backoff:c,latencyAlpha:u,previousLatencyEwmaMs:l,previousErrorRate:d,previousSamples:f}=t,p=1+a,m=0,y=0,h=l??null,w=null,v=null;for(let x=1;x<=p;x++){m=x;let E=r.now();try{let b=await IA(n(e,{attempt:x,timeoutMs:s}),s,o),g=r.now()-E,A=kA(b);if(!A.ok)y+=1,w=A.reason;else{h=vA(h,g,u),v={blockNumber:b.blockNumber,chainId:b.chainId??null,timestampMs:b.timestampMs??null,latencyMs:g};break}}catch(b){y+=1,w=b?.message||String(b)}if(x<p){let b=c(x,i);await o(b)}}let T=(f??0)+m,S=d!=null&&f?d*f:0,k=T>0?(S+y)/T:0;return{id:e.id,endpoint:e,ok:v!=null,attempts:m,failures:y,errorRate:k,latencyEwmaMs:v?h:l??null,latencyMs:v?v.latencyMs:null,blockNumber:v?v.blockNumber:null,chainId:v?v.chainId:null,timestampMs:v?v.timestampMs:null,lastError:v?null:w,sampleCount:T}}async function OA(e,t,n){let r=new Array(e.length),o=0;async function i(){for(;o<e.length;){let a=o++;r[a]=await n(e[a],a)}}let s=Math.max(1,Math.min(t,e.length));return await Promise.all(Array.from({length:s},()=>i())),r}function TA(e,{networkHeadBlock:t,maxHeadLagBlocks:n,maxHeadAgeMs:r,now:o}){if(!e.ok)return"down";let i=t!=null&&e.blockNumber!=null?t-e.blockNumber:null,s=i!=null&&i>n,a=e.timestampMs!=null&&o-e.timestampMs>r;return s||a?"stale":"fresh"}function CA(e,t){let n=Yp[e.tier]-Yp[t.tier];if(n!==0)return n;let r=e.errorRate-t.errorRate;if(r!==0)return r;let o=e.headLagBlocks??1/0,i=t.headLagBlocks??1/0;if(o!==i)return o-i;let s=e.latencyEwmaMs??1/0,a=t.latencyEwmaMs??1/0;return s!==a?s-a:e.id<t.id?-1:e.id>t.id?1:0}async function Xp(e,t={}){if(!Array.isArray(e)||e.length===0)throw new Error("rankRpcEndpoints requires a non-empty array of endpoints");let{probe:n,clock:r={now:()=>Date.now()},sleep:o=g=>new Promise(A=>setTimeout(A,g)),rng:i=Math.random,timeoutMs:s=2e3,retries:a=3,concurrency:c=4,backoff:u=xA,maxHeadLagBlocks:l=3,maxHeadAgeMs:d=6e4,latencyAlpha:f=.5,previousStats:p={}}=t;if(typeof n!="function")throw new Error("rankRpcEndpoints requires an injected probe(endpoint, ctx) function");let m=new Set;for(let g of e){if(!g||typeof g.id!="string"||!g.id)throw new Error("each RPC endpoint requires a stable string id");if(m.has(g.id))throw new Error(`duplicate RPC endpoint id: ${g.id}`);m.add(g.id)}let y=Math.min(Math.max(0,a),3),h=await OA(e,c,g=>_A(g,{probe:n,clock:r,sleep:o,rng:i,timeoutMs:s,maxRetries:y,backoff:u,latencyAlpha:f,previousLatencyEwmaMs:p[g.id]?.latencyEwmaMs??null,previousErrorRate:p[g.id]?.errorRate??null,previousSamples:p[g.id]?.sampleCount??0})),w=h.reduce((g,A)=>A.ok&&A.blockNumber!=null&&(g==null||A.blockNumber>g)?A.blockNumber:g,null),v=r.now(),S=[...h.map(g=>{let A=TA(g,{networkHeadBlock:w,maxHeadLagBlocks:l,maxHeadAgeMs:d,now:v}),P=g.ok&&w!=null&&g.blockNumber!=null?w-g.blockNumber:null;return{...g,tier:A,headLagBlocks:P,costUnknown:!g.ok}})].sort(CA),k=S.every(g=>g.tier==="down"),x=k?null:S[0],E=k?null:S[1]??null;return{status:k?Jn.UNKNOWN:S.some(g=>g.tier!=="fresh")?Jn.DEGRADED:Jn.OK,networkHeadBlock:w,results:S,primary:x,backup:E,allDown:k}}import{createHash as NA}from"node:crypto";var tn=Object.freeze({SHADOW:"shadow",ARMED:"armed",AUTONOMOUS:"autonomous"}),RA=3,PA=new Set(Object.values(tn));function Ga(e){if(e&&typeof e=="object"&&!Object.isFrozen(e)){for(let t of Object.values(e))Ga(t);Object.freeze(e)}return e}function Wa(e){return Array.isArray(e)?`[${e.map(Wa).join(",")}]`:e&&typeof e=="object"?`{${Object.keys(e).filter(t=>e[t]!==void 0).sort().map(t=>`${JSON.stringify(t)}:${Wa(e[t])}`).join(",")}}`:JSON.stringify(e)}function LA(e){return`sha256:${NA("sha256").update(Wa(e)).digest("hex")}`}function za(e,t,n){if(!Array.isArray(e)||e.length===0)throw new TypeError(`${t} must be a non-empty exact allowlist`);let r=e.map(o=>n(o,t));if(new Set(r).size!==r.length)throw new TypeError(`${t} contains a duplicate entry`);return r.sort((o,i)=>typeof o=="number"?o-i:o.localeCompare(i))}function $A(e,t){if(!Number.isSafeInteger(e)||e<=0)throw new TypeError(`${t} entries must be positive safe integers`);return e}function Va(e,t){if(typeof e!="string"||e.trim()!==e||e.length===0)throw new TypeError(`${t} entries must be non-empty exact strings`);return e}function Qn(e,t,{positive:n=!1}={}){let r=typeof e=="number"?String(e):e;if(typeof r!="string"||!/^(?:0|[1-9]\d*)(?:\.\d+)?$/.test(r))throw new TypeError(`${t} must be a finite non-negative decimal`);if(n&&/^0(?:\.0+)?$/.test(r))throw new TypeError(`${t} must be greater than zero`);return r}function Kr(e,t,{min:n=0,max:r=Number.MAX_SAFE_INTEGER}={}){if(!Number.isSafeInteger(e)||e<n||e>r)throw new TypeError(`${t} must be an integer from ${n} through ${r}`);return e}function Ci(e,t){let n=Qn(e,t),[r,o=""]=n.split(".");return{digits:BigInt(r+o),scale:o.length}}function Ti(e,t,n="value"){let r=Ci(e,n),o=Ci(t,"strategy cap"),i=Math.max(r.scale,o.scale),s=r.digits*10n**BigInt(i-r.scale),a=o.digits*10n**BigInt(i-o.scale);return s<a?-1:s>a?1:0}function Jp(e){let t=structuredClone(e);return delete t.digest,t}function qA(e){if(!e||typeof e!="object"||Array.isArray(e))throw new TypeError("strategy must be an object");return LA(Jp(e))}function BA(e={}){if(!e||typeof e!="object"||Array.isArray(e))throw new TypeError("strategy must be an object");let t=e.mode??tn.SHADOW;if(!PA.has(t))throw new TypeError("mode must be shadow, armed, or autonomous");let n={version:1,mode:t,chains:za(e.chains,"chains",$A),venues:za(e.venues,"venues",Va),quoteAssets:za(e.quoteAssets,"quoteAssets",Va),maxSpendPerTrade:Qn(e.maxSpendPerTrade,"maxSpendPerTrade",{positive:!0}),maxSpendPerDay:Qn(e.maxSpendPerDay,"maxSpendPerDay",{positive:!0}),minLiquidityUsd:Qn(e.minLiquidityUsd,"minLiquidityUsd",{positive:!0}),maxSlippageBps:Kr(e.maxSlippageBps,"maxSlippageBps",{max:1e4}),maxGas:Qn(e.maxGas,"maxGas",{positive:!0}),maxPriorityFee:Qn(e.maxPriorityFee,"maxPriorityFee"),maxBuysPerHour:Kr(e.maxBuysPerHour,"maxBuysPerHour",{min:1}),retryCeiling:Kr(e.retryCeiling,"retryCeiling",{max:RA}),ttlMs:Kr(e.ttlMs,"ttlMs",{min:1}),requireSellSimulation:e.requireSellSimulation,requireRiskPass:e.requireRiskPass??!0,maxRoundTripLossBps:Kr(e.maxRoundTripLossBps??1500,"maxRoundTripLossBps",{max:1e4}),killSwitch:e.killSwitch,recipient:e.recipient==null||e.recipient===""?null:Va(e.recipient,"recipient")};if(n.requireSellSimulation!==!0)throw new TypeError("requireSellSimulation must be true");if(n.requireRiskPass!==!0)throw new TypeError("requireRiskPass must be true");if(typeof n.killSwitch!="boolean")throw new TypeError("killSwitch must be boolean");if(n.mode!==tn.SHADOW&&!n.recipient)throw new TypeError("recipient is required when mode is armed or autonomous");if(Ti(n.maxSpendPerTrade,n.maxSpendPerDay)>0)throw new TypeError("maxSpendPerTrade cannot exceed maxSpendPerDay");return n.digest=qA(n),Ga(n)}var UA=Object.freeze([["localSignerReady","local signer is not ready"],["dedicatedWallet","dedicated non-main wallet evidence is missing"],["exactStrategyBinding","exact strategy digest/grant binding is missing"],["trustedOneUseTrigger","fresh trusted one-use trigger attestation is missing"],["durableReceipts","durable receipts evidence is missing"],["balanceReconciliation","balance reconciliation evidence is missing"]]);function he(e,t,n){t&&e.push(n)}function Qp(e,t={},n={}){let r=BA(Jp(e)),o=[];he(o,r.killSwitch,"kill switch is engaged"),he(o,!r.chains.includes(t.chain),"chain is not on the exact allowlist"),he(o,!r.venues.includes(t.venue),"venue is not on the exact allowlist"),he(o,!r.quoteAssets.includes(t.quoteAsset),"quote asset is not on the exact allowlist");let i=(a,c,u)=>{try{he(o,Ti(a,c,u)>0,`${u} exceeds cap`)}catch{o.push(`${u} evidence is missing or unknown`)}};i(t.spend,r.maxSpendPerTrade,"per-trade spend");try{let a=Ci(t.spentToday,"daily spend"),c=Ci(t.spend,"per-trade spend"),u=Math.max(a.scale,c.scale),l=a.digits*10n**BigInt(u-a.scale)+c.digits*10n**BigInt(u-c.scale),d=u===0?String(l):`${String(l).padStart(u+1,"0").slice(0,-u)}.${String(l).padStart(u+1,"0").slice(-u)}`;he(o,Ti(d,r.maxSpendPerDay,"daily spend")>0,"daily spend cap would be exceeded")}catch{o.push("daily spend evidence is missing or unknown")}try{he(o,Ti(t.liquidityUsd,r.minLiquidityUsd,"liquidity")<0,"minimum real liquidity is not met")}catch{o.push("liquidity evidence is missing or unknown")}i(t.slippageBps,String(r.maxSlippageBps),"slippage"),i(t.gas,r.maxGas,"gas"),i(t.priorityFee,r.maxPriorityFee,"priority fee"),he(o,!Number.isSafeInteger(t.buysLastHour),"buys per hour evidence is missing or unknown"),he(o,Number.isSafeInteger(t.buysLastHour)&&t.buysLastHour>=r.maxBuysPerHour,"buys per hour cap is reached"),he(o,!Number.isSafeInteger(t.retries)||t.retries<0,"retry evidence is missing or unknown"),he(o,Number.isSafeInteger(t.retries)&&t.retries>r.retryCeiling,"retry ceiling is exceeded"),he(o,!Number.isFinite(t.ageMs)||t.ageMs<0,"TTL evidence is missing or unknown"),he(o,Number.isFinite(t.ageMs)&&t.ageMs>=r.ttlMs,"TTL has expired"),he(o,t.sellSimulation?.verdict!=="PASS"||t.sellSimulation?.evidence!=="LIVE","mandatory sell simulation has no LIVE PASS evidence"),he(o,typeof t.fireId!="string"||t.fireId.length===0,"fire id evidence is missing or unknown"),he(o,!Array.isArray(t.firedIds),"duplicate-fire history is missing or unknown"),he(o,Array.isArray(t.firedIds)&&t.firedIds.includes(t.fireId),"duplicate fire is blocked");let s=[...o];he(s,n?.ORACLE_AUTONOMOUS_TRADING!=="1","ORACLE_AUTONOMOUS_TRADING=1 is required literally");for(let[a,c]of UA)he(s,t.autonomousGates?.[a]!==!0,c);return he(s,r.mode!==tn.AUTONOMOUS,"strategy mode is not autonomous"),Ga({strategyDigest:r.digest,mode:r.mode,policyEligible:o.length===0,blockers:o,autonomousEligible:s.length===0,autonomousBlockers:s,reportOnly:!0})}var Et="oracle.launch-radar.data-plane.v1",FA=200,jA=500,HA=100,zA=500;function Yr(e){return String(e?.message||e||"unknown error").slice(0,300)}function VA(e={}){return e.configDir||process.env.ORACLE_CONFIG_DIR||Zp.join(DA.homedir(),".config","oracle")}function WA(e={}){return e.storePath||process.env.LAUNCH_RADAR_STORE_PATH||Zp.join(VA(e),"launch-radar","state.json")}function Ka(e,t,n){return Number.isSafeInteger(e)&&e>0?Math.min(e,n):t}function ef(e={}){let t=WA(e);try{return{ok:!0,path:t,state:Dp({path:t})}}catch(n){return{ok:!1,path:t,error:Yr(n)}}}function tf(){return process.env.ORACLE_AUTONOMOUS_TRADING==="1"}function nf(){return Object.freeze({schema:Et,evidence:"LIVE",mode:tn.SHADOW,executionReady:!1,signingReady:!1,broadcastReady:!1,funded:!1,autonomousTradingEnvSet:tf()})}function rf(e={},t={}){let n=ef(t),r={schema:Et,storePath:n.path,executionReady:!1,signingReady:!1,broadcastReady:!1,requiresUserSignature:!0,autonomousTradingEnvSet:tf()};if(!n.ok)return Object.freeze({...r,evidence:"UNAVAILABLE",reason:n.error,mode:tn.SHADOW,status:"unavailable",ambiguous:null,candidateCount:null,cursor:null,evidenceCount:null,lastEvidenceAt:null});let{state:o}=n,i=o.evidence.at(-1)||null;return Object.freeze({...r,evidence:"LIVE",reason:o.strategyStatus.reason??null,mode:o.strategyStatus.mode,status:o.strategyStatus.status,ambiguous:o.strategyStatus.ambiguous,candidateCount:o.candidates.length,cursor:o.cursor,evidenceCount:o.evidence.length,lastEvidenceAt:i?i.at:null})}function of(e={},t={}){let n=ef(t);if(!n.ok)return Object.freeze({schema:Et,evidence:"UNAVAILABLE",reason:n.error,storePath:n.path,strategyStatus:null,cursor:null,candidates:[],evidenceRecords:[]});let{state:r}=n,o=Ka(e.limit,FA,jA),i=Ka(e.evidenceLimit,HA,zA);return Object.freeze({schema:Et,evidence:"LIVE",storePath:n.path,strategyStatus:structuredClone(r.strategyStatus),cursor:structuredClone(r.cursor),candidateCount:r.candidates.length,candidates:structuredClone(r.candidates.slice(0,o)),evidenceCount:r.evidence.length,evidenceRecords:structuredClone(r.evidence.slice(-i))})}async function sf(e={}){let t=Array.isArray(e.discoveries)?e.discoveries:[],n=Array.isArray(e.evaluations)?e.evaluations:[],r=Array.isArray(e.whyBlocked)?e.whyBlocked:[],o=typeof e.status=="string"&&e.status?e.status:t.length?"LIVE":"UNKNOWN",i=async()=>({status:o,cursor:e.cursor??null,discoveries:t,whyBlocked:r,unavailable:[]}),s=async({chainId:a,tokenAddress:c})=>{let u=n.find(l=>l?.chainId===a&&String(l?.tokenAddress||"").toLowerCase()===String(c||"").toLowerCase());return u?u.evaluation&&typeof u.evaluation=="object"?u.evaluation:u:{}};try{let a=await Kp({discover:i,evaluator:s,observedAt:e.observedAt}),c=a.status==="LIVE"?"LIVE":a.status==="UNAVAILABLE"?"UNAVAILABLE":"UNKNOWN";return{schema:Et,evidence:c,...a}}catch(a){return{schema:Et,evidence:"UNAVAILABLE",reason:Yr(a),status:"UNKNOWN",cursor:null,unavailable:[],whyBlocked:[Yr(a)],candidates:[]}}}async function af(e={}){let t=Array.isArray(e.endpoints)?e.endpoints:[],n={schema:Et,evidence:"UNAVAILABLE",status:Jn.UNKNOWN,networkHeadBlock:null,results:[],primary:null,backup:null,allDown:!0};if(t.length===0)return{...n,reason:"no endpoints supplied"};let r=e.samples&&typeof e.samples=="object"&&!Array.isArray(e.samples)?e.samples:{},o=async s=>{let a=r[s.id];if(!a||a.ok===!1)throw new Error(a?.error||`no probe sample supplied for endpoint "${s.id}"`);return a},i=Ka(e.retries,0,3);try{let s=await Xp(t,{probe:o,retries:i,concurrency:e.concurrency,maxHeadLagBlocks:e.maxHeadLagBlocks,maxHeadAgeMs:e.maxHeadAgeMs}),a=s.allDown?"UNAVAILABLE":s.status===Jn.OK?"LIVE":"STALE";return{schema:Et,evidence:a,...s}}catch(s){return{...n,reason:Yr(s)}}}function cf(e={}){try{let t=Qp(e.strategy,e.observation,{});return{schema:Et,evidence:"LIVE",...t,autonomousEligible:!1,autonomousBlockers:[...new Set([...t.autonomousBlockers||[],"Launch Radar autonomous execution is not released"])],reportOnly:!0}}catch(t){let n=Yr(t);return{schema:Et,evidence:"UNAVAILABLE",reason:n,mode:tn.SHADOW,policyEligible:!1,blockers:[n],autonomousEligible:!1,autonomousBlockers:[n],reportOnly:!0}}}var KA=/^arm|sign|execute|broadcast|submit|send|write|place/i,uf=Object.freeze({"launch-radar":Object.freeze({health:(e,t)=>nf(e,t),status:(e,t)=>rf(e,t),snapshot:(e,t)=>of(e,t),candidates:(e,t)=>sf(e,t),rpcHealth:(e,t)=>af(e,t),evaluateStrategy:(e,t)=>cf(e,t)})});function YA(e,t){let n=String(t||"");if(KA.test(n))throw new Error(`data facade forbidden op: ${e}.${n}`);let r=qp(e);if(!r)throw new Error(`unknown data provider: ${e}`);if(!Array.isArray(r.ops)||!r.ops.includes(n))throw new Error(`data facade: provider ${e} does not support op ${n}`);let o=uf[e];if(!o||typeof o[n]!="function")throw new Error(`data facade: no handler wired for ${e}.${n}`)}async function lf(e,t,n={},r={}){return YA(e,t),uf[e][t](n,r)}var XA="oracle-launch-radar-mcp",JA="1",df=Object.freeze({type:"object",properties:{},additionalProperties:!1}),Ya=Object.freeze([{name:"launch_radar_health",description:"Launch Radar data-plane health: static capability flags only (mode, executionReady, signingReady, broadcastReady, funded). Always shadow-only and unfunded. Read-only, no arguments.",inputSchema:df},{name:"launch_radar_status",description:"Current durable shadow-cycle status read from local disk: mode, status, ambiguous, candidate/evidence counts, and the honest autonomous-trading env-gate state. Reports evidence: UNAVAILABLE with a reason if the store cannot be read. Never signs or broadcasts. Read-only, no arguments (store path is server-configured, never caller-supplied).",inputSchema:df},{name:"launch_radar_snapshot",description:"Full durable snapshot: strategyStatus, cursor, normalized candidates, and the evidence event log, straight off local disk. Read-only, no arguments beyond optional result-size limits.",inputSchema:{type:"object",properties:{limit:{type:"integer",minimum:1,maximum:500,description:"Max candidates to return (default 200)."},evidenceLimit:{type:"integer",minimum:1,maximum:500,description:"Max most-recent evidence records to return (default 100)."}},additionalProperties:!1}},{name:"launch_radar_candidates",description:"Recompute normalized PASS/WARN/BLOCK/UNKNOWN candidates from caller-supplied discovery + evaluation data through the exact launch-radar service/domain normalization. Missing evaluations come back UNKNOWN, never a fabricated PASS. Makes no network call itself \u2014 all inputs are supplied by the caller.",inputSchema:{type:"object",properties:{discoveries:{type:"array",items:{type:"object"},maxItems:200},evaluations:{type:"array",items:{type:"object"},maxItems:200},status:{type:"string",enum:["LIVE","UNKNOWN","UNAVAILABLE"]},cursor:{},whyBlocked:{type:"array",items:{type:"string"},maxItems:50},observedAt:{type:"string"}},additionalProperties:!1}},{name:"launch_radar_rpc_health",description:"Rank caller-supplied RPC probe samples (freshness/error-rate/latency) through the exact deterministic rpc-health module. This tool performs no probe itself \u2014 supply already-collected samples keyed by endpoint id. An endpoint with no sample counts as down; all-down reports evidence: UNAVAILABLE rather than a fabricated best endpoint.",inputSchema:{type:"object",required:["endpoints"],properties:{endpoints:{type:"array",items:{type:"object",required:["id"],properties:{id:{type:"string"}}},minItems:1,maxItems:64},samples:{type:"object",description:"Map of endpoint id -> { blockNumber, chainId, timestampMs } or { ok: false, error }."},retries:{type:"integer",minimum:0,maximum:3},concurrency:{type:"integer",minimum:1,maximum:32},maxHeadLagBlocks:{type:"number"},maxHeadAgeMs:{type:"number"}},additionalProperties:!1}},{name:"launch_radar_evaluate_strategy",description:"Pure, report-only strategy-policy evaluation over an exact caller-supplied strategy + observation (spend/liquidity/slippage/TTL/retry/kill-switch gates, plus the six-gate autonomous checklist). Reads the live ORACLE_AUTONOMOUS_TRADING env var for an honest autonomous-gate readout. Never signs, arms, or executes \u2014 reportOnly is always true.",inputSchema:{type:"object",required:["strategy","observation"],properties:{strategy:{type:"object"},observation:{type:"object"}},additionalProperties:!1}}]),QA=Object.freeze({launch_radar_health:"health",launch_radar_status:"status",launch_radar_snapshot:"snapshot",launch_radar_candidates:"candidates",launch_radar_rpc_health:"rpcHealth",launch_radar_evaluate_strategy:"evaluateStrategy"});async function Xa(e,t={}){let n=QA[e];if(!n)throw new Error(`unknown tool: ${e}`);return lf("launch-radar",n,t,{})}function ZA(e){return{content:[{type:"text",text:JSON.stringify(e)}]}}var XL=Object.freeze({name:XA,version:JA,tools:Ya,async call(e,t){return ZA(await Xa(e,t))}});function VN(e){let t;try{t=new URL(String(e||""))}catch{throw new Error("ORACLE_DATA_URL must be a loopback HTTP URL")}let n=t.hostname==="127.0.0.1"||t.hostname==="localhost"||t.hostname==="[::1]";if(t.protocol!=="http:"||!n||t.pathname!=="/"||t.username||t.password||t.search||t.hash)throw new Error("ORACLE_DATA_URL must be an uncredentialed loopback HTTP URL");return t.href.replace(/\/$/,"")}var rl=VN(js("ORACLE_DATA_URL","MAD_DESK_URL","http://127.0.0.1:8787")),WN=2*1024*1024;async function GN(e,t=WN){let n=Number(e.headers?.get?.("content-length")||0);if(Number.isFinite(n)&&n>t)throw new Error("data response exceeded the size limit");if(!e.body?.getReader){let s=await e.text();if(Buffer.byteLength(s)>t)throw new Error("data response exceeded the size limit");try{return JSON.parse(s)}catch{return{}}}let r=e.body.getReader(),o=[],i=0;try{for(;;){let{done:s,value:a}=await r.read();if(s)break;let c=Buffer.from(a);if(i+=c.length,i>t)throw await r.cancel("response too large").catch(()=>{}),new Error("data response exceeded the size limit");o.push(c)}}finally{r.releaseLock?.()}try{return JSON.parse(Buffer.concat(o).toString("utf8"))}catch{return{}}}var J0={type:"object",required:["chainId","route","leg","target","calldataHash","blockNumber","blockHash","sender","owner","valueWei","success","reverted","result","source","quotedAtMs","expiresAtMs"],properties:{chainId:{type:"number",const:4663},route:{type:"string"},leg:{type:"string"},target:{type:"string",description:"Exact eth_call target for this executable leg."},calldataHash:{type:"string"},blockNumber:{type:"string"},blockHash:{type:"string"},orderHash:{type:"string"},protocolAddress:{type:"string"},sender:{type:"string"},owner:{type:"string"},valueWei:{type:"string"},success:{type:"boolean",const:!0},reverted:{type:"boolean",const:!1},result:{type:"string",description:"Successful eth_call return bytes as 0x-prefixed even-length hex."},source:{type:"string"},quotedAtMs:{type:"number"},expiresAtMs:{type:"number"}}},vr={oneOf:[{type:"object",required:["chainId","route","leg","amountWei","source","calldataHash","blockNumber","blockHash","gasLimit","gasPriceWei","quotedAtMs","expiresAtMs","simulation","mac"],properties:{chainId:{type:"number",const:4663},route:{type:"string"},leg:{type:"string",description:"Exact executable leg: Anvil, conversion, Seaport, approval, or wrap/unwrap prerequisite."},approvalChecked:{type:"boolean",description:"Required true on Seaport fulfillment/acceptance evidence after an exact fresh approval-state read."},approvalRequired:{type:"boolean"},amountWei:{type:"string"},source:{type:"string"},calldataHash:{type:"string"},blockNumber:{type:"string"},blockHash:{type:"string"},gasLimit:{type:"string"},gasPriceWei:{type:"string"},orderHash:{type:"string"},protocolAddress:{type:"string"},simulation:J0,mac:{type:"string"},quotedAtMs:{type:"number"},expiresAtMs:{type:"number"}}},{type:"array",items:{type:"object",required:["chainId","route","leg","amountWei","source","calldataHash","blockNumber","blockHash","gasLimit","gasPriceWei","quotedAtMs","expiresAtMs","simulation","mac"],properties:{chainId:{type:"number",const:4663},route:{type:"string"},leg:{type:"string"},approvalChecked:{type:"boolean"},approvalRequired:{type:"boolean"},amountWei:{type:"string"},source:{type:"string"},calldataHash:{type:"string"},blockNumber:{type:"string"},blockHash:{type:"string"},gasLimit:{type:"string"},gasPriceWei:{type:"string"},orderHash:{type:"string"},protocolAddress:{type:"string"},simulation:J0,mac:{type:"string"},quotedAtMs:{type:"number"},expiresAtMs:{type:"number"}}}}]},Z0=[...Ya,{name:"data_catalog",description:"List every read-plane provider the desk exposes (id, venue, chainIds, ops). Discovery only; generic provider dispatch is not exposed by this public MCP.",inputSchema:{type:"object",properties:{}}},{name:"data_health",description:"Health of every read-plane provider (which public APIs are up / configured). Read-only.",inputSchema:{type:"object",properties:{}}},{name:"tool_output_shape",description:"Key-shape outline of a tool's most recent observed result (key names + value types only, learned from live calls). Read this before writing a code-mode script that parses another tool's output, so joins are written against real keys instead of guessed ones. Returns null when the tool has not been called yet this deployment.",inputSchema:{type:"object",required:["tool"],properties:{tool:{type:"string",description:"Tool name whose last observed output shape to return."}},additionalProperties:!1}},{name:"evm_token_sniper_scan",description:"Scan and optionally prepare a guarded token buy through the same armed local-signer path on every supported EVM chain. Robinhood Chain 4663 is the default. Resolves identity and pools, checks structural risk, proves the sell route, quotes, then hands execution to the loopback signer under owner policy.",inputSchema:{type:"object",required:["tokenAddress"],properties:{chainId:{type:"number",default:4663},tokenAddress:{type:"string"},tokenIn:{type:"string",description:"Base/quote token address required for quote and prepare."},amountIn:{type:"string",description:"Raw integer input amount."},recipient:{type:"string",description:"User wallet that receives tokens. Required for prepare."},slippageBps:{type:"number",default:50},prepare:{type:"boolean",default:!1}}}},{name:"hlp_vault_tracker",description:"Read-only Hyperliquid vault tracker, including HLP. List summaries, inspect one vault, or read a user's vault equities. Never deposits, withdraws, signs, or submits.",inputSchema:{type:"object",properties:{mode:{type:"string",enum:["hlp","summaries","details","mine"],default:"hlp"},vaultAddress:{type:"string"},user:{type:"string"}}}},{name:"hl_precompile_read",description:"Read HyperCore through HyperEVM L1Read precompiles (0x800-0x809). Positions, oracle/mark, spot, HLP vault equity, withdrawable. eth_call only. Never writes, never CoreWriter.",inputSchema:{type:"object",properties:{op:{type:"string",enum:["l1BlockNumber","markPx","oraclePx","spotPx","position","spotBalance","vaultEquity","hlp","withdrawable"],default:"l1BlockNumber"},user:{type:"string"},vaultAddress:{type:"string"},index:{type:"number"},perp:{type:"number"},token:{type:"number"}}}},{name:"protocol_eval",description:"Run protocol-builder language evals: Solidity templates, Rust/Anchor vault, Bitcoin Miniscript. Read-only. Not a firm audit. Never deploys or signs.",inputSchema:{type:"object",properties:{}}},{name:"hl_delta_neutral",description:"Hyperliquid delta-neutral funding carry. Scan, quote, or run one loop tick. Owner-operated. Not automated.",inputSchema:{type:"object",properties:{op:{type:"string",enum:["scan","quote","loop"],default:"scan"},coin:{type:"string"},notionalUsd:{type:"number"},mode:{type:"string",enum:["shadow","live"],default:"shadow"},limit:{type:"number"}}}},{name:"lighter_delta_neutral",description:"Lighter.xyz delta-neutral funding carry. Scan, quote, or run one loop tick. Owner-operated official sendTx signer. Not automated.",inputSchema:{type:"object",properties:{op:{type:"string",enum:["scan","quote","loop"],default:"scan"},coin:{type:"string"},notionalUsd:{type:"number"},mode:{type:"string",enum:["shadow","live"],default:"shadow"},limit:{type:"number"}}}},{name:"llama_protocols",description:"DeFiLlama: full protocol list with TVL, chain(s), category, 1d/7d change. The primary cross-chain protocol scanner. Read-only. Large payload \u2014 filter client-side.",inputSchema:{type:"object",properties:{}}},{name:"llama_prices",description:"DeFiLlama current prices for coins keyed 'chain:address' or 'coingecko:id' (comma-joined or array). Read-only.",inputSchema:{type:"object",required:["coins"],properties:{coins:{type:"string",description:"comma-joined coin keys, e.g. 'ethereum:0x...,coingecko:bitcoin'"}}}},{name:"dex_search",description:"DexScreener search across all chains by symbol/name/address. Returns matching pairs with price, liquidity, volume, chain. Read-only.",inputSchema:{type:"object",required:["q"],properties:{q:{type:"string",description:"query: symbol, name, or token address"}}}},{name:"dex_token",description:"DexScreener pairs for a specific token address (any chain). Price, liquidity, volume, pair addresses. Read-only.",inputSchema:{type:"object",required:["address"],properties:{address:{type:"string"}}}},{name:"lifi_quote",description:"LI.FI cross-chain / DEX aggregator quote (no key). Best route + expected out for a swap or bridge. Read-only.",inputSchema:{type:"object",required:["fromChain","toChain","fromToken","toToken","fromAmount"],properties:{fromChain:{type:"number"},toChain:{type:"number"},fromToken:{type:"string"},toToken:{type:"string"},fromAmount:{type:"string",description:"raw integer amount (wei-scale)"},fromAddress:{type:"string",description:"optional; defaults to operator wallet"}}}},{name:"portfolio_balance",description:"Read-only balance aggregation across every configured EVM chain plus Solana, Bitcoin, and Hyperliquid. Reports native assets, supported token/collectible reads, failed or missing providers, unverified assets, timestamps, and known priced value without pretending it is a complete total. Public addresses only; never signs or broadcasts.",inputSchema:{type:"object",properties:{addresses:{type:"object",description:"Optional public wallet addresses by family. Omit configured families to use ORACLE_*_ADDRESS defaults.",properties:{evm:{type:"string"},solana:{type:"string"},bitcoin:{type:"string"},hyperliquid:{type:"string"}}},evmChainIds:{type:"array",items:{type:"number"},description:"Optional EVM chain subset. Default is every configured EVM chain."},includeTokens:{type:"boolean",description:"Include supported token reads. Default true."},includeCollectibles:{type:"boolean",description:"Include supported collectible reads. Default true."},includePrices:{type:"boolean",description:"Fetch current DeFiLlama native prices. Default true."}}}},{name:"portfolio_snapshot",description:"Query the current multichain balance and NFT inventory, then append one compact profile-local observation for historical tracking. Stores public-address fingerprint, coverage, breakdown, and known priced value only; no keys, signatures, executable payloads, or raw NFT metadata. Returns the live balance, NFT result, and recorded snapshot.",inputSchema:{type:"object",properties:{addresses:{type:"object",properties:{evm:{type:"string"},solana:{type:"string"},bitcoin:{type:"string"},hyperliquid:{type:"string"}}},evmChainIds:{type:"array",items:{type:"number"}},includeTokens:{type:"boolean"},includeCollectibles:{type:"boolean"},includePrices:{type:"boolean"},includeNfts:{type:"boolean",description:"Include provider-estimated NFT value. Default true."}}}},{name:"portfolio_history",description:"Read profile-local portfolio observations in a time range. Unknown or unavailable values remain null and are never converted to zero. Defaults to the configured public-address portfolio fingerprint.",inputSchema:{type:"object",properties:{addresses:{type:"object",properties:{evm:{type:"string"},solana:{type:"string"},bitcoin:{type:"string"},hyperliquid:{type:"string"}}},portfolioId:{type:"string"},allPortfolios:{type:"boolean",description:"Return observations for every public-address fingerprint in this profile."},since:{type:"string",description:"Inclusive ISO 8601 lower bound."},until:{type:"string",description:"Inclusive ISO 8601 upper bound."},limit:{type:"number",description:"1-1000, default 100."},order:{type:"string",enum:["asc","desc"]}}}},{name:"portfolio_value_graph",description:"Render a static SVG line graph from profile-local portfolio snapshots. Plots known priced value only, labels incomplete coverage, includes provider-estimated NFT values when recorded, and omits unavailable observations instead of plotting fake zeroes.",inputSchema:{type:"object",properties:{addresses:{type:"object",properties:{evm:{type:"string"},solana:{type:"string"},bitcoin:{type:"string"},hyperliquid:{type:"string"}}},portfolioId:{type:"string"},allPortfolios:{type:"boolean"},since:{type:"string"},until:{type:"string"},limit:{type:"number",description:"Historical observations to consider, max 1000."},maxPoints:{type:"number",description:"Rendered point cap, 2-500, default 200."}}}},{name:"evm_simulate_transaction",description:"Simulate an EVM transaction BEFORE signing: catches reverts via eth_call at pending state, decodes the reason (Error(string), Panic codes, or the raw selector for custom errors), and returns a buffered gas estimate usable as gasLimit. Also flags calls that return boolean false without reverting (some ERC-20s signal failure that way). An unreachable node returns 'unavailable', never 'would fail'. A pass reflects current chain state and is not a guarantee the transaction lands.",inputSchema:{type:"object",properties:{chainId:{type:"number"},tx:{type:"object",description:"{ from, to, data, value } \u2014 value in wei.",properties:{from:{type:"string"},to:{type:"string"},data:{type:"string"},value:{type:"string"}},required:["to"]},estimateGas:{type:"boolean",description:"Default true."},gasBufferPercent:{type:"number",description:"Headroom over the estimate. Default 20."}},required:["chainId","tx"]}},{name:"nft_mint_prepare",description:"Prepare an UNSIGNED EVM NFT mint. Discovers the collection's mint entrypoint from deployed bytecode (ERC-721 does not standardize minting), encodes calldata, prices a competitive EIP-1559 bid from fee-history percentiles, enforces gas-war caps, and reports contract risk. Returns wallet-signable calldata \u2014 never signs or broadcasts. Supply gasLimit plus maxTotalGasWei to enforce the caps; without them the artifact is returned with a loud warning.",inputSchema:{type:"object",properties:{contract:{type:"string",description:"NFT contract address."},chainId:{type:"number"},minter:{type:"string",description:"Address that will sign and receive."},quantity:{type:"number",description:"How many to mint. Default 1."},urgency:{type:"string",enum:["normal","fast","war"],description:"Bid aggressiveness. Default war."},signature:{type:"string",description:"Force a specific mint signature when several exist."},gasLimit:{type:"number"},valueWei:{type:"string",description:"Mint price in wei."},maxTotalGasWei:{type:"string",description:"Hard total gas cap."},maxFeePerGasWei:{type:"string"},maxPriorityFeePerGasWei:{type:"string"}},required:["contract","chainId","minter"]}},{name:"nft_mint_gas_price",description:"Price a competitive EIP-1559 bid for a contested transaction using eth_feeHistory reward percentiles (p50 normal / p75 fast / p90 war). maxFeePerGas is a refundable ceiling; the tip is the real spend. Reports viable:false when a cap would put the bid below the observed market rather than silently clamping to a losing number.",inputSchema:{type:"object",properties:{chainId:{type:"number"},urgency:{type:"string",enum:["normal","fast","war"]},gasLimit:{type:"number"},maxFeePerGasWei:{type:"string"},maxPriorityFeePerGasWei:{type:"string"},maxTotalGasWei:{type:"string"}},required:["chainId"]}},{name:"nft_mint_trigger",description:"Create a mint-open trigger. DEFAULTS TO alert_only: Oracle watches, notifies, and prepares a signable artifact. Firing unattended requires ALL of: actionMode set to the exact string 'execute', ORACLE_AUTONOMOUS_TRADING=1, and a bounded grant naming this exact contract/chain with maxTotalGasWei, maxValueWei, and an expiry under 24h. Any missing or mismatched bound silently downgrades to alert_only and says so. Even an armed trigger produces an unsigned artifact.",inputSchema:{type:"object",properties:{contract:{type:"string"},chainId:{type:"number"},minter:{type:"string"},quantity:{type:"number"},urgency:{type:"string",enum:["normal","fast","war"]},actionMode:{type:"string",enum:["alert_only","execute"],description:"Default alert_only. Only the exact string 'execute' can arm, and only with a grant."},grant:{type:"object",description:"Required for execute: { contract, chainId, maxTotalGasWei, maxValueWei, expiresAt }."}},required:["contract","chainId"]}},{name:"nft_mancer_os_scan",description:"Fail-closed scan for a Mancers-gated Robinhood (4663) NFT mint. Requires bytecode that references Mancers 0x797a\u2026, value=0, a sim with Transfer to the minter and no setApprovalForAll. Never returns safe. executeFire needs actionMode=execute, ORACLE_AUTONOMOUS_MINT=1, and a grant naming this exact contract with maxValueWei=0. Trading flag does not unlock mint. Returns unsigned mint + revoke calldata \u2014 never signs.",inputSchema:{type:"object",properties:{contract:{type:"string"},chainId:{type:"number"},minter:{type:"string"},bytecode:{type:"string"},valueWei:{type:"string"},simulation:{type:"object"},actionMode:{type:"string",enum:["alert_only","execute"]},grant:{type:"object"}},required:["contract","chainId","minter","bytecode"]}},{name:"contract_risk_scan",description:"Check what powers a contract's deployer still holds before you interact with it: mint, blacklist, pause, fee changes, and upgradeability (EIP-1967, legacy zeppelinos, EIP-1822 proxies). Complements a sell simulation \u2014 that proves a token is sellable NOW, this asks whether someone can change that afterwards. Read-only eth_getCode/eth_getStorageAt; never returns 'safe', only 'unknown-risk', 'elevated', or 'high', because absence of a selector is not proof of safety.",inputSchema:{type:"object",properties:{address:{type:"string",description:"Contract address (0x, 40 hex)."},chainId:{type:"number",description:"EVM chain id."}},required:["address","chainId"]}},{name:"nft_inventory",description:"Read all discoverable NFTs for configured EVM, Solana, and Bitcoin addresses. Returns normalized assets, image URLs, estimated values, per-chain partial failures, flagged/NSFW items separated from visible items, listing coverage, and explicit unsupported chains. Read-only.",inputSchema:{type:"object",properties:{addresses:{type:"object",properties:{evm:{type:"string"},solana:{type:"string"},bitcoin:{type:"string"}}},chains:{type:"array",items:{type:"string"},description:"Optional chain slug subset."},pageSize:{type:"number",description:"OpenSea items per page, max 200."},maxPages:{type:"number",description:"Maximum pages per chain, max 25."},bitcoinLimit:{type:"number"},includePnl:{type:"boolean",description:"Include OpenSea-indexed account PnL when available. Default true."},costBasis:{type:"object",description:"Optional user-supplied assetKey -> {costUsd,feesUsd,acquiredAt,source}. Missing basis stays unavailable, never zero."}}}},{name:"nft_gallery",description:"Generate one static NFT contact-sheet image page from wallet inventory or supplied normalized items. External metadata is never rendered as HTML; only allowlisted JPEG/PNG/WebP bytes are embedded and unsafe or missing media becomes a placeholder.",inputSchema:{type:"object",properties:{addresses:{type:"object",properties:{evm:{type:"string"},solana:{type:"string"},bitcoin:{type:"string"}}},chains:{type:"array",items:{type:"string"}},items:{type:"array",items:{type:"object"},description:"Optional normalized inventory items. Omit to scan configured wallets."},page:{type:"number",description:"1-based gallery page."},pageSize:{type:"number",description:"1-12 items per page."}}}},{name:"nft_pnl",description:"NFT PnL with explicit methodology. Returns OpenSea-indexed account-level PnL where available plus per-item unrealized estimates only when both user-supplied acquisition cost and provider estimated current value exist. Missing history is unavailable, never zero.",inputSchema:{type:"object",properties:{addresses:{type:"object",properties:{evm:{type:"string"},solana:{type:"string"},bitcoin:{type:"string"}}},chains:{type:"array",items:{type:"string"}},costBasis:{type:"object"}}}},{name:"nft_prepare_list",description:"Prepare an NFT listing for OpenSea EVM, Magic Eden Solana, or Satflow Bitcoin after explicit user review. Requires userConfirmed=true plus asset, marketplace, price, currency where applicable, and future expiry. Magic Eden Solana also requires confirmation exactly: list <tokenMint> on magiceden-sol for <priceSol> SOL until <expiry>. Returns approval/signing actions, an unsigned Solana transaction, or an unsigned Bitcoin PSBT. Never signs, submits, or broadcasts.",inputSchema:{type:"object",required:["marketplace","userConfirmed"],properties:{marketplace:{type:"string",enum:["opensea","magiceden","magiceden-sol","satflow"]},userConfirmed:{type:"boolean"},chain:{type:"string"},seller:{type:"string"},contract:{type:"string"},tokenId:{type:"string"},quantity:{type:"number"},priceAmount:{type:"string"},currency:{type:"string"},endTime:{type:"string"},useCreatorFee:{type:"boolean"},taker:{type:"string"},tokenMint:{type:"string"},tokenATA:{type:"string"},auctionHouse:{type:"string"},priceSol:{type:"string"},expiry:{description:"Future ISO 8601 timestamp or Unix seconds. Magic Eden Solana listings require finite future expiry; no-expiry is refused."},confirmation:{type:"string",description:"Required for Magic Eden Solana listings. Exact phrase: list <tokenMint> on magiceden-sol for <priceSol> SOL until <expiry>."},inscriptionId:{type:"string"},runesOutput:{type:"string"},ordAddress:{type:"string"},receiveAddress:{type:"string"},priceSats:{type:"string"},tapKey:{type:"string"},collectionSlug:{type:"string"}}}},{name:"nft_trait_snipe",description:"Evaluate an OpenSea EVM NFT trait-snipe candidate using caller-supplied fresh listings, trait floor, max price, minimum discount, recent real trait sales, and trait volume gates. Returns BUY/PASS plus an unsigned local-only buy intent. Never signs, submits, broadcasts, or treats rarity metadata alone as evidence.",inputSchema:{type:"object",required:["marketplace","chain","collectionSlug","contract","traitType","traitValue","maxPriceEth","minDiscountBps","minTraitSales","minTraitVolumeEth","traitFloorEth","listings","sales"],properties:{marketplace:{type:"string",enum:["opensea"]},chain:{type:"string"},collectionSlug:{type:"string"},contract:{type:"string"},traitType:{type:"string"},traitValue:{type:"string"},maxPriceEth:{type:"string"},minDiscountBps:{type:"number"},minTraitSales:{type:"number"},minTraitVolumeEth:{type:"string"},minTraitListings:{type:"number"},maxListingAgeMs:{type:"number"},maxSaleAgeMs:{type:"number"},collectionFloorEth:{type:"string"},traitFloorEth:{type:"string"},listings:{type:"array",items:{type:"object"}},sales:{type:"array",items:{type:"object"}}}}},{name:"anvil_nft_scan",description:"Scan exact Anvil inventory IDs on Robinhood Chain for current NFT traits and fee-inclusive buy quotes. Read-only.",inputSchema:{type:"object",required:["market","collection"],properties:{market:{type:"string"},collection:{type:"string"},tokenIds:{type:"array",items:{type:"string"}},inventoryCompletenessEvidence:{type:"object"},traitType:{type:"string"},traitFilters:{type:"array",items:{type:"object"}},includeAll:{type:"boolean"},minStars:{type:"number"},maxItems:{type:"number"}}}},{name:"anvil_opensea_arb",description:"Compare exact Anvil inventory and fee quotes against exact OpenSea listings and offers. ARB requires validated complete inventory plus fresh authenticated exact-leg gas and successful simulation evidence for every executable leg. Read-only.",inputSchema:{type:"object",required:["market","collection","slug","owner","gasEvidence","minNetWei"],anyOf:[{required:["conversionGasEvidence"]},{required:["gasPriceEvidence"]}],properties:{market:{type:"string"},collection:{type:"string"},slug:{type:"string"},owner:{type:"string",description:"Execution owner/sender bound into every simulated leg."},tokenIds:{type:"array",items:{type:"string"}},inventoryCompletenessEvidence:{type:"object"},traitType:{type:"string"},traitFilters:{type:"array",items:{type:"object"}},includeAll:{type:"boolean"},minStars:{type:"number"},maxItems:{type:"number"},gasEvidence:vr,conversionGasEvidence:vr,gasPriceEvidence:vr,minNetWei:{type:"string"}}}},{name:"anvil_marketplace_scan",description:"Scan every live Anvil market and its full inventory by default with collection-specific metadata traits and exact quote checks. Explicit bounds return complete=false plus continuation evidence. Read-only.",inputSchema:{type:"object",properties:{maxMarkets:{type:"number"},maxItemsPerMarket:{type:"number"},marketConcurrency:{type:"number"},includeEmpty:{type:"boolean"},collectionProfiles:{type:"object",additionalProperties:{type:"object"}},snapshotCompletenessEvidence:{type:"object"}}}},{name:"anvil_marketplace_opensea_arb",description:"Scan every live Anvil market and full inventory by default where exact OpenSea slug mappings exist. ARB requires validated complete discovery plus fresh authenticated exact-leg gas and successful simulation evidence; incomplete scans return WATCH with deterministic continuation. Read-only.",inputSchema:{type:"object",required:["openseaSlugs","owner","gasEvidence","minNetWei"],anyOf:[{required:["conversionGasEvidence"]},{required:["gasPriceEvidence"]}],properties:{openseaSlugs:{type:"object",additionalProperties:{type:"string"}},owner:{type:"string",description:"Execution owner/sender bound into every simulated leg."},collectionProfiles:{type:"object",additionalProperties:{type:"object"}},snapshotCompletenessEvidence:{type:"object"},maxMarkets:{type:"number"},maxItemsPerMarket:{type:"number"},marketConcurrency:{type:"number"},includeEmpty:{type:"boolean"},gasEvidence:vr,conversionGasEvidence:vr,gasPriceEvidence:vr,minNetWei:{type:"string"}}}},{name:"anvil_prepare_buy",description:"Build one exact-token Anvil buy action for Oracle's armed owner-local signer. The caller cap may reject but never widen the exact fresh quote encoded and confirmed. Requires sufficient allowance, exact human confirmation, simulation, and arm.",inputSchema:{type:"object",required:["market","collection","tokenId","buyer","maxTotalCostRaw","confirmedTotalCostRaw","maxNativeSwapFeeWei","actionGasLimit","maxFeePerGasWei","actionNonce","tradeId","userConfirmed"],properties:{market:{type:"string"},collection:{type:"string"},tokenId:{type:"string"},buyer:{type:"string"},maxTotalCostRaw:{type:"string"},confirmedTotalCostRaw:{type:"string",description:"Exact freshly quoted total cost reviewed by the user; must equal the re-read quote."},maxNativeSwapFeeWei:{type:"string"},actionGasLimit:{type:"string"},maxFeePerGasWei:{type:"string"},maxPriorityFeePerGasWei:{type:"string"},actionNonce:{type:"number"},ttlMs:{type:"number"},tradeId:{type:"string"},userConfirmed:{type:"boolean",const:!0}}}},{name:"anvil_prepare_sell",description:"Build one exact-token Anvil sale action for Oracle's armed owner-local signer. The caller floor may reject but never widen the exact fresh net payout encoded and confirmed. Requires pre-existing ERC721 approval, exact human confirmation, simulation, and arm.",inputSchema:{type:"object",required:["market","collection","tokenId","seller","minPayoutRaw","confirmedNetPayoutRaw","maxNativeSwapFeeWei","actionGasLimit","maxFeePerGasWei","actionNonce","tradeId","userConfirmed"],properties:{market:{type:"string"},collection:{type:"string"},tokenId:{type:"string"},seller:{type:"string"},minPayoutRaw:{type:"string"},confirmedNetPayoutRaw:{type:"string",description:"Exact freshly quoted net payout reviewed by the user; must equal the re-read quote."},maxNativeSwapFeeWei:{type:"string"},actionGasLimit:{type:"string"},maxFeePerGasWei:{type:"string"},maxPriorityFeePerGasWei:{type:"string"},actionNonce:{type:"number"},ttlMs:{type:"number"},tradeId:{type:"string"},userConfirmed:{type:"boolean",const:!0}}}},{name:"stonkbrokers_scan_loot",description:"Verify StonkBroker parent availability and nested ERC-6551 loot custody, then rank matching traits without treating rarity as buy evidence. Read-only.",inputSchema:{type:"object",required:["candidates"],properties:{candidates:{type:"array",items:{type:"object"}},traitType:{type:"string"},minStars:{type:"number"}}}},{name:"stonkbrokers_broker_desk",description:"Read StonkBroker owner/TBA identities and Clock In state, or prepare an unsigned permissionless Clock In call. No signing or broadcast.",inputSchema:{type:"object",properties:{owner:{type:"string"},brokerTokenIds:{type:"array",items:{type:"string"}},which:{type:"string"},mode:{type:"string"},batchSize:{type:"number"},minOutBps:{type:"number"}}}},{name:"rpc_balance",description:"Native token balance of an address on a chain via public RPC. Read-only. Omit address to read the operator wallet.",inputSchema:{type:"object",required:["chainId"],properties:{chainId:{type:"number"},address:{type:"string"}}}},{name:"rpc_block",description:"Latest block number on a chain via public RPC. Read-only.",inputSchema:{type:"object",required:["chainId"],properties:{chainId:{type:"number"}}}},{name:"solana_balance",description:"Solana mainnet SOL balance for a base58 public key. Read-only; no signing or broadcast.",inputSchema:{type:"object",required:["address"],properties:{address:{type:"string"},commitment:{type:"string"}}}},{name:"solana_token_accounts",description:"Solana SPL token accounts for an owner, optionally filtered by mint. Read-only.",inputSchema:{type:"object",required:["owner"],properties:{owner:{type:"string"},mint:{type:"string"},commitment:{type:"string"}}}},{name:"solana_simulate",description:"Simulate a base64 Solana transaction through RPC. Read-only; never signs or broadcasts.",inputSchema:{type:"object",required:["transaction"],properties:{transaction:{type:"string"},sigVerify:{type:"boolean"},replaceRecentBlockhash:{type:"boolean"}}}},{name:"jupiter_venues",description:"Jupiter Solana venue map, optionally verified on-chain against executable BPF loader ownership. Read-only.",inputSchema:{type:"object",properties:{verify:{type:"boolean"},rpc:{type:"string"}}}},{name:"jupiter_quote",description:"Jupiter Solana Swap API quote with a hard <=100 bps slippage cap. Read-only.",inputSchema:{type:"object",required:["inputMint","outputMint","amount"],properties:{inputMint:{type:"string"},outputMint:{type:"string"},amount:{type:"string"},slippageBps:{type:"number"}}}},{name:"jupiter_prepare",description:"Prepare an unsigned Jupiter swap transaction for the user's Solana wallet to sign. No local signer, no broadcast.",inputSchema:{type:"object",required:["userPublicKey"],properties:{userPublicKey:{type:"string"},quoteResponse:{type:"object"},inputMint:{type:"string"},outputMint:{type:"string"},amount:{type:"string"},slippageBps:{type:"number"}}}},{name:"btc_health",description:"Bitcoin L1 Esplora health + tip height (mempool.space by default). No Core RPC, no keys. Read-only.",inputSchema:{type:"object",properties:{}}},{name:"btc_fees",description:"Recommended Bitcoin fee rates (sats/vB). Read-only.",inputSchema:{type:"object",properties:{}}},{name:"btc_balance",description:"Bitcoin address balance in sats via Esplora. Read-only.",inputSchema:{type:"object",required:["address"],properties:{address:{type:"string",description:"bc1\u2026/1\u2026/3\u2026 address"}}}},{name:"btc_utxos",description:"UTXOs for a Bitcoin address via Esplora. Read-only.",inputSchema:{type:"object",required:["address"],properties:{address:{type:"string"}}}},{name:"btc_tx",description:"Lookup a Bitcoin transaction by txid via Esplora. Read-only.",inputSchema:{type:"object",required:["txid"],properties:{txid:{type:"string"}}}},{name:"btc_meta_health",description:"Ordinals/runes indexer health. Reports whether BTC_META_API_URL / vendor API keys are configured. Read-only.",inputSchema:{type:"object",properties:{}}},{name:"btc_rune_balance",description:"Rune balances for a Bitcoin address (requires configured indexer + optional API key). Read-only.",inputSchema:{type:"object",required:["address"],properties:{address:{type:"string"}}}},{name:"btc_inscriptions",description:"Inscriptions controlled by an address. REQUIRES a keyed indexer (ordinals.com has no address index). Returns unknownNotEmpty:true when unconfigured \u2014 that means UNKNOWN, never 'wallet holds none'. Protect these UTXOs from fee spends.",inputSchema:{type:"object",required:["address"],properties:{address:{type:"string"},limit:{type:"number"}}}},{name:"btc_inscription_info",description:"Inscription metadata by inscription id (content type/length, height, sat, fee). KEYLESS via ordinals.com recursive. Read-only.",inputSchema:{type:"object",required:["inscriptionId"],properties:{inscriptionId:{type:"string",description:"<64-hex-txid>i<index>"}}}},{name:"btc_inscription_children",description:"Child inscriptions of a parent (collections). KEYLESS via ordinals.com recursive. Read-only.",inputSchema:{type:"object",required:["inscriptionId"],properties:{inscriptionId:{type:"string",description:"<64-hex-txid>i<index>"},page:{type:"number"}}}},{name:"btc_ord_block_info",description:"Ord node block info / indexer tip. KEYLESS. Use to confirm the ordinals indexer is at the same tip as Esplora before trusting metaprotocol reads.",inputSchema:{type:"object",properties:{height:{type:"number",description:"omit for current tip"}}}},{name:"satflow_health",description:"Satflow marketplace health (primary BTC ordinals/runes market after Magic Eden BTC sunset). Needs SATFLOW_API_KEY. Read-only.",inputSchema:{type:"object",properties:{}}},{name:"satflow_floors",description:"Satflow collection floor prices. type=ordinals|runes. Read-only.",inputSchema:{type:"object",properties:{type:{type:"string",description:"ordinals or runes"},ids:{type:"string",description:"optional comma-separated collection ids"}}}},{name:"satflow_wallet",description:"Satflow wallet contents (ordinals/runes) for an address. Read-only.",inputSchema:{type:"object",required:["address"],properties:{address:{type:"string"},type:{type:"string"},limit:{type:"number"}}}},{name:"satflow_item",description:"Satflow item detail for an inscription id (listing + bids + meta). Read-only.",inputSchema:{type:"object",oneOf:[{required:["inscriptionId"]},{required:["id"]}],properties:{inscriptionId:{type:"string"},id:{type:"string",description:"alias for inscriptionId"}}}},{name:"satflow_floor_listings",description:"Satflow floor listings for collection id(s). Read-only.",inputSchema:{type:"object",oneOf:[{required:["collectionIds"]},{required:["ids"]}],properties:{collectionIds:{type:"string"},ids:{type:"string",description:"alias for collectionIds"},limit:{type:"number"}}}},{name:"scanner_coverage",description:"Which chains the on-chain scanner supports and which capabilities each one has (blockNumber, nativeBalance, tokenBalance, resolveToken, resolvePools, scanBlocks, scoreRisk, quote, sellSimulation, prepareUnsignedTx). Read-only.",inputSchema:{type:"object",properties:{}}},{name:"scan_token",description:"Resolve a token on an EVM chain: metadata, its pools, and a risk score. Works on chains no indexer covers because it reads the chain directly. Read-only.",inputSchema:{type:"object",properties:{chainId:{type:"number",description:"EVM chain id, e.g. 4663 for Robinhood Chain"},token:{type:"string",description:"token contract address"}},required:["chainId","token"]}},{name:"wallet_balances",description:"Native balance for an address on an EVM chain, plus one token balance when a token address is supplied. Read-only; never signs.",inputSchema:{type:"object",properties:{chainId:{type:"number"},address:{type:"string",description:"wallet address to inspect"},token:{type:"string",description:"optional token contract for a token balance"}},required:["chainId","address"]}},{name:"rfq_quote",description:"Create a cross-chain RFQ intent and fan it out to reviewed solver or venue sources. Returns firm quote objects with intentHash, firmQuoteHash, expiry, min receive, and unsigned executable artifacts. Never signs or broadcasts.",inputSchema:{type:"object",required:["fromChainId","toChainId","sellToken","buyToken","sellAmount","receiver","deadlineMs"],properties:{fromChainId:{type:"number"},toChainId:{type:"number"},sellToken:{type:"string"},buyToken:{type:"string"},sellAmount:{type:"string"},receiver:{type:"string"},deadlineMs:{type:"number"},minBuyAmount:{type:"string"},allowedSources:{type:"array",items:{type:"string"}},sources:{type:"array",items:{type:"string"},description:"alias for allowedSources"},allowedRouters:{type:"array",items:{type:"string"}},slippageBps:{type:"number"},decimalsIn:{type:"number"},decimalsOut:{type:"number"}}}},{name:"best_swap_route",description:"Compare swap routes across every available aggregator and rank by NET output (after gas and fees), not headline quote. Returns the winner plus all runners-up so the ranking can be checked rather than trusted.",inputSchema:{type:"object",properties:{chainId:{type:"number",description:"EVM chain id, e.g. 8453 for Base"},tokenIn:{type:"string",description:"sell token address"},tokenOut:{type:"string",description:"buy token address"},amountIn:{type:"string",description:"raw units of tokenIn (wei-scale)"},taker:{type:"string",description:"address used for quoting only; nothing is signed"},decimalsIn:{type:"number"},decimalsOut:{type:"number"}},required:["chainId","tokenIn","tokenOut","amountIn"]}},{name:"best_bridge_route",description:"Compare cross-chain bridge routes and rank by NET output. Also reports each route's expected duration, which is NOT folded into the score -- a route that saves $2 but takes 30 minutes is a trade-off for the caller to make.",inputSchema:{type:"object",properties:{fromChainId:{type:"number"},toChainId:{type:"number"},tokenIn:{type:"string",description:"token on the origin chain"},tokenOut:{type:"string",description:"token on the destination chain"},amountIn:{type:"string",description:"raw units of tokenIn"},taker:{type:"string",description:"address used for quoting only"},decimalsOut:{type:"number"}},required:["fromChainId","toChainId","tokenIn","tokenOut","amountIn"]}},{name:"prepare_best_route",description:"Compare routes, then build the SIGNABLE artifact for the winner. Returns an unsigned transaction (LI.FI/ParaSwap/0x) or EIP-712 typed data for an off-chain order (CoW) -- the artifactKind field says which, and they require different wallet actions. Re-quotes before preparing and reports drift against the comparison. Never signs or broadcasts.",inputSchema:{type:"object",properties:{chainId:{type:"number"},tokenIn:{type:"string"},tokenOut:{type:"string"},amountIn:{type:"string",description:"raw units of tokenIn"},taker:{type:"string",description:"the REAL wallet that will sign. Placeholder/burn addresses are rejected: quoting is anonymous, preparing is not."},decimalsIn:{type:"number"},decimalsOut:{type:"number"},source:{type:"string",description:"force a specific source instead of the winner (flagged in the result)"},driftToleranceBps:{type:"number",description:"default 100"}},required:["chainId","tokenIn","tokenOut","amountIn","taker"]}},{name:"prepare_best_bridge_route",description:"Compare cross-chain bridge routes, then build the signable transaction sequence for the winner. Returns a LIST of unsigned transactions -- some routes need an approval and a deposit signed in order, and signing only the first leaves funds approved but not bridged. Reports the destination chain and expected credit time. Bridging is not atomic. Never signs or broadcasts.",inputSchema:{type:"object",properties:{fromChainId:{type:"number"},toChainId:{type:"number"},tokenIn:{type:"string",description:"token on the origin chain"},tokenOut:{type:"string",description:"token on the destination chain"},amountIn:{type:"string",description:"raw units of tokenIn"},taker:{type:"string",description:"the REAL wallet that will sign; placeholders rejected"},source:{type:"string",description:"force a source instead of the winner"},driftToleranceBps:{type:"number",description:"default 100"}},required:["fromChainId","toChainId","tokenIn","tokenOut","amountIn","taker"]}},{name:"equity_venues",description:"Inventory of on-chain equities venues (HIP-3 builder DEXes, Arcus perps/spot on Robinhood 4663, RH Uniswap prepare tier, Solana xStocks, TON ston.fi) with tiers and a liveness snapshot. Offline fixtures by default. Read-only / prepare-only.",inputSchema:{type:"object",properties:{}}},{name:"equity_quote",description:"Cross-chain best-execution comparison for a tokenized equity ticker (NVDA, SPY, TSLA, ...). Ranks HIP-3, Arcus, RH Uniswap, Solana xStocks, and TON. Returns winner + runners-up + bestPreparable (only rh_uniswap is preparable in v1). rankedOn is usually gross because fees/gas are unmeasured - say so. Never signs.",inputSchema:{type:"object",required:["ticker"],properties:{ticker:{type:"string",description:"equity ticker, e.g. NVDA, SPY, TSLA"},sizeUsd:{type:"string",description:"optional notional USD size for impact model"},horizonHours:{type:"number",description:"optional holding horizon; enables funding-adjusted spot-vs-perp ranking"}}}},{name:"equity_prepare",description:"Prepare an UNSIGNED Robinhood-chain Uniswap artifact for a tokenized equity. Only the prepare-tier venue (rh_uniswap / chain 4663). Requires the real wallet as recipient. requiresWalletSignature=true, backendSigner=false. Never signs or broadcasts.",inputSchema:{type:"object",required:["ticker"],oneOf:[{required:["recipient"]},{required:["taker"]}],properties:{ticker:{type:"string"},recipient:{type:"string",description:"the REAL 0x wallet that will sign; placeholders rejected"},taker:{type:"string",description:"alias for recipient"},sizeUsd:{type:"string",description:"optional notional USD size"}}}},{name:"strategy_draft",description:"Draft a deterministic Hyperliquid strategy DSL from supported plain-English EMA, RSI, or funding rules. Fails closed on unsupported ambiguity. Never signs or broadcasts.",inputSchema:{type:"object",required:["prompt"],properties:{prompt:{type:"string"},nowMs:{type:"number"}}}},{name:"strategy_validate",description:"Strictly compile and hash a Hyperliquid strategy DSL. No network or execution.",inputSchema:{type:"object",required:["strategy"],properties:{strategy:{type:"object"},nowMs:{type:"number"}}}},{name:"strategy_backtest",description:"Backtest a deterministic strategy with fees, builder fees, slippage, funding, latency, stops, take profit, and liquidation. Uses supplied bars or keyless Hyperliquid history.",inputSchema:{type:"object",required:["strategy"],properties:{strategy:{type:"object"},bars:{type:"array",items:{type:"object"}},count:{type:"number"},backtestOptions:{type:"object"}}}},{name:"strategy_optimize",description:"Run bounded deterministic parameter search on training bars, then separately evaluate out-of-sample evidence. Never uses holdout data during optimization.",inputSchema:{type:"object",required:["strategy"],properties:{strategy:{type:"object"},bars:{type:"array",items:{type:"object"}},count:{type:"number"},maxTrials:{type:"number"}}}},{name:"strategy_evidence",description:"Produce separate train, holdout, and walk-forward evidence with overfitting flags and a fail, paper-only, or live-eligible status. Live eligibility never arms execution.",inputSchema:{type:"object",required:["strategy"],properties:{strategy:{type:"object"},bars:{type:"array",items:{type:"object"}},count:{type:"number"}}}},{name:"strategy_shadow_start",description:"Start a durable local shadow runner that records intended orders and theoretical fills only. Never signs or broadcasts.",inputSchema:{type:"object",required:["strategy"],properties:{strategy:{type:"object"},evidenceId:{type:"string"}}}},{name:"strategy_shadow_list",description:"List durable local shadow runners. Read-only and secret-free.",inputSchema:{type:"object",properties:{}}},{name:"strategy_shadow_status",description:"Inspect one durable local shadow runner. Read-only and secret-free.",inputSchema:{type:"object",required:["id"],properties:{id:{type:"string"}}}},{name:"strategy_shadow_step",description:"Advance one durable shadow runner over supplied or keyless historical bars. Never signs or broadcasts.",inputSchema:{type:"object",required:["id"],properties:{id:{type:"string"},bars:{type:"array",items:{type:"object"}},count:{type:"number"}}}},{name:"strategy_shadow_stop",description:"Stop one durable local shadow runner. Does not submit or cancel exchange orders.",inputSchema:{type:"object",required:["id"],properties:{id:{type:"string"}}}},{name:"strategy_prepare_live",description:"Create an integrity-bound prepare-only handoff after live-eligible evidence, HMAC-authenticated when local attestation is configured. All execution flags stay false. A separate local operator must revalidate, arm, sign, and broadcast.",inputSchema:{type:"object",required:["strategy","evidence","shadowId"],properties:{strategy:{type:"object"},evidence:{type:"object"},shadowId:{type:"string"},caps:{type:"object"},nowMs:{type:"number"}}}},{name:"twap_simulate",description:"Simulate a TWAP (time-weighted average price) DCA order. Splits a large order into equal-sized chunks over a configurable window, quotes every chunk at current prices, and returns the schedule + estimated average price. Read-only. Never signs or broadcasts. Use before committing to a TWAP.",inputSchema:{type:"object",required:["chainId","tokenIn","tokenOut","taker"],oneOf:[{required:["amount"]},{required:["amountIn"]}],properties:{chainId:{type:"number"},tokenIn:{type:"string"},tokenOut:{type:"string"},amount:{type:"string",description:"raw base units of tokenIn"},amountIn:{type:"string",description:"read-only alias for amount"},taker:{type:"string",description:"the REAL wallet that will sign"},splits:{type:"number",description:"number of chunks (default 10, max 100)"},windowHours:{type:"number",description:"total window in hours (default 6)"},slippageBps:{type:"number",description:"slippage cap in bps (default 100)"}}}},{name:"bridge_aggregator_scan",description:"Scan ALL cross-chain bridge routes: deBridge DLN + LI.FI/Relay + ChangeNOW. Ranks every route by net output, checks for existing token approvals that should be revoked before bridging, and returns the winner + runners-up. Read-only. Never signs or broadcasts. ChangeNOW requires ticker symbols.",inputSchema:{type:"object",required:["fromChainId","toChainId","tokenIn","tokenOut","amount","taker"],properties:{fromChainId:{type:"number"},toChainId:{type:"number"},tokenIn:{type:"string"},tokenOut:{type:"string"},amount:{type:"string",description:"raw base units of tokenIn"},taker:{type:"string"},fromSymbol:{type:"string",description:"ticker for ChangeNOW (e.g. ETH, USDC)"},toSymbol:{type:"string",description:"ticker for ChangeNOW"},fromDecimals:{type:"number",description:"default 18"},toDecimals:{type:"number",description:"default 18"}}}},{name:"perps_markets",description:"Scan perps markets across dYdX (standalone chain), Drift (Solana), and Vertex (Arbitrum). Returns ticker, oracle price, funding rate, open interest, and 24h volume. Read-only. Never signs.",inputSchema:{type:"object",properties:{venue:{type:"string",description:"dydx, drift, or vertex (default: all)"}}}},{name:"dex_quote",description:"Quote a swap across PancakeSwap (BSC+), SushiSwap (30+ chains), or Raydium (Solana via Jupiter). Specify the DEX and chain. Read-only.",inputSchema:{type:"object",required:["dex","chainId","tokenIn","tokenOut","amountIn"],properties:{dex:{type:"string",description:"pancakeswap, sushiswap, or raydium"},chainId:{type:"number"},tokenIn:{type:"string"},tokenOut:{type:"string"},amountIn:{type:"string",description:"raw base units"}}}},{name:"options_markets",description:"Scan on-chain options markets (calls/puts). Currently Aevo. Returns instruments, mark prices, funding, open interest. Read-only.",inputSchema:{type:"object",properties:{}}},{name:"cex_market_data",description:"Read PUBLIC centralized-exchange market data from Binance, OKX or Bybit: spot/perp ticker, orderbook depth, perp funding rate, mark price, and open interest. Keyless public endpoints only \u2014 no account, no trading, never signs.",inputSchema:{type:"object",required:["coin"],properties:{venue:{type:"string",description:"binance, okx, bybit, or all (default: all)"},op:{type:"string",description:"ticker, orderbook, funding, markPrice, or openInterest (default: ticker)"},coin:{type:"string",description:"Base asset, e.g. BTC. Full exchange symbols also accepted."},quote:{type:"string",description:"Quote asset (default: USDT)"},market:{type:"string",description:"spot or perp (default: spot; funding/openInterest force perp)"},limit:{type:"number",description:"Orderbook depth levels"}}}},{name:"cex_basis_scan",description:"Cross-venue perp basis and funding-spread scan across Binance, OKX, Bybit and Hyperliquid public data. Returns per-venue perp mark vs spot basis in bps plus pairwise ANNUALIZED funding deltas (Hyperliquid settles hourly, CEXes 8h, so raw rates are not comparable). Analysis over public reads \u2014 no sizing, no order, never signs.",inputSchema:{type:"object",required:["coin"],properties:{coin:{type:"string",description:"Base asset, e.g. BTC or ETH"},quote:{type:"string",description:"Quote asset for the CEX legs (default: USDT)"},venues:{type:"string",description:"Comma-separated subset of binance,okx,bybit,hyperliquid (default: all)"},fundingOnly:{type:"boolean",description:"Return only the funding-spread view"}}}},{name:"snapshot_governance",description:"Read-only Snapshot.org hub: spaces, proposals, proposal detail, an address's votes and voting power. Never signs a vote.",inputSchema:{type:"object",properties:{op:{type:"string",description:"spaces, proposals, activeProposals, proposal, votes, votingPower, or health (default: spaces)"},space:{type:"string"},spaces:{type:"array",items:{type:"string"}},id:{type:"string",description:"proposal id"},voter:{type:"string"},state:{type:"string"},first:{type:"number"}}}},{name:"tally_governance",description:"Read-only Governor Bravo / OZ Governor proposal state and vote tallies for major DAOs. Never casts, queues, or executes a vote.",inputSchema:{type:"object",properties:{op:{type:"string",description:"governors, info, proposals, proposal, voterStatus, or health (default: governors)"},dao:{type:"string",description:"compound, uniswap, ens, aave, gitcoin, arbitrum, optimism"},proposalId:{type:"string"},account:{type:"string"}}}},{name:"stablecoin_peg_scan",description:"Rank major and Hyperliquid-native stables by absolute bps from $1. Unpriced is unknown, never on-peg. Read-only.",inputSchema:{type:"object",properties:{symbols:{type:"array",items:{type:"string"}},usePyth:{type:"boolean"},useDex:{type:"boolean"}}}},{name:"lending_markets",description:"Scan lending protocol markets across Compound ($2B+ TVL). Returns supply/borrow APYs, total supply, collateral factors. Read-only.",inputSchema:{type:"object",properties:{}}},{name:"yield_vaults",description:"Scan yield aggregator vaults across Yearn + Convex. Returns vault APYs, TVLs, boosted status. Read-only.",inputSchema:{type:"object",properties:{}}},{name:"watch_list",description:"List alert-only price/token watches. Never execute.",inputSchema:{type:"object",properties:{}}},{name:"watch_create",description:"Create an alert-only watch. actionMode is always alert_only. Never execute.",inputSchema:{type:"object",required:["chain","token","condition"],properties:{chain:{type:"string"},token:{type:"string"},condition:{type:"string"},note:{type:"string"}}}},{name:"receipt_report",description:"Classify a caller-supplied receipt. Reports whether a tx hash exists. Does not verify chain success.",inputSchema:{type:"object",properties:{hash:{type:"string"},transactionHash:{type:"string"},txid:{type:"string"},receipt:{type:"object"}}}},{name:"twitter_ca_watch",description:"One Twitter CA watch tick: read an account, extract EVM/Solana CAs, rank the USD book, PREPARE only. Automated ticks never emit a card and never broadcast. Needs ORACLE_XURL_ENABLED=true.",inputSchema:{type:"object",required:["handle"],properties:{handle:{type:"string"},chainId:{type:"number",description:"default 4663 Robinhood"},limit:{type:"number"}}}},{name:"trade_lifecycle",description:"Create, verify, or advance a prepare-only trade fact chain. Signing and broadcasting are never performed here.",inputSchema:{type:"object",required:["action"],properties:{action:{type:"string",enum:["create","verify","advance"]},tradeId:{type:"string"},intent:{type:"object"},lifecycle:{type:"object"},state:{type:"string"},fact:{type:"object"},asOf:{type:"number"}}}},{name:"signal_score",description:"Cold-score onchain signal events. Never fetches or executes.",inputSchema:{type:"object",required:["events"],properties:{events:{type:"array",items:{type:"object"}},markouts:{type:"array",items:{type:"object"}},openIntents:{type:"boolean"},limit:{type:"number"}}}},{name:"workspace_artifact",description:"Get, list, put, or link deterministic workspace artifacts. No arbitrary paths.",inputSchema:{type:"object",required:["action"],properties:{action:{type:"string",enum:["get","list","put","link"]},id:{type:"string"},type:{type:"string"},createdAt:{type:"string"},data:{type:"object"},parentId:{type:"string"},childId:{type:"string"}}}},{name:"research_artifact",description:"Create a citation-bearing research artifact. fetchedAt must be supplied by the caller.",inputSchema:{type:"object",required:["sourceUrl","fetchedAt","snapshot","claim","confidence"],properties:{sourceUrl:{type:"string"},fetchedAt:{type:"string"},snapshot:{type:"string"},claim:{type:"string"},confidence:{type:"number"},contradictions:{type:"array",items:{type:"string"}}}}},{name:"portfolio_analyze",description:"Summarize a caller-supplied portfolio ledger. Read-only.",inputSchema:{type:"object",required:["ledger","asOf"],properties:{ledger:{type:"object"},asOf:{type:"number"},priceTtlMs:{type:"number"}}}},{name:"tax_lots",description:"Build exact-integer cost-basis records from caller-supplied events. Accounting records only, not tax advice.",inputSchema:{type:"object",required:["input"],properties:{input:{type:"object",additionalProperties:!0},method:{type:"string",enum:["fifo","lifo","hifo","specific"]},asOf:{type:"string",minLength:1}},additionalProperties:!1}},{name:"position_health",description:"Evaluate caller-supplied lending or farming snapshots. Alert-only, with no network access or execution signal.",inputSchema:{type:"object",required:["action","input","asOf"],properties:{action:{type:"string",enum:["evaluate","book"]},input:{type:"object",additionalProperties:!0},asOf:{type:"string",minLength:1},thresholds:{type:"object",additionalProperties:!0}},additionalProperties:!1}},{name:"governance_prepare",description:"Create a deterministic semantic preview of a caller-supplied governance intent. No adapter, calldata, vote, signature, or broadcast.",inputSchema:{type:"object",required:["input","asOf"],properties:{input:{type:"object",additionalProperties:!0},asOf:{type:"string",minLength:1}},additionalProperties:!1}},{name:"safety_intelligence",description:"Evaluate caller-supplied address or transaction safety evidence. No source is contacted and unknown evidence fails closed.",inputSchema:{type:"object",required:["action","input","asOf"],properties:{action:{type:"string",enum:["address","transaction"]},input:{type:"object",additionalProperties:!0},asOf:{type:"string",minLength:1},minClearConfidence:{type:"number",minimum:0,maximum:1},minBlockConfidence:{type:"number",minimum:0,maximum:1}},additionalProperties:!1}},{name:"portfolio_risk",description:"Summarize concentration and coverage from caller-supplied portfolio snapshots. No network or account access.",inputSchema:{type:"object",required:["input"],properties:{input:{type:"object",additionalProperties:!0}},additionalProperties:!1}},{name:"mev_status",description:"MEV observer/operator flag posture. Read-only. Never implies a live trade. Flash-loan execute still needs ORACLE_MEV_EXECUTE_ENABLED=1 and literal --execute on oracle mev.",inputSchema:{type:"object",properties:{}}},{name:"chain_list",description:"List Oracle's EVM chain registry (chainId, name, rpc env names). Read-only.",inputSchema:{type:"object",properties:{}}},{name:"tron_account",description:"Tron account: TRX balance (sun + display) and resource state via public TronGrid. Read-only; no keys, no broadcast.",inputSchema:{type:"object",required:["address"],properties:{address:{type:"string",description:"Base58 Tron address (T\u2026)"}}}},{name:"tron_trc20_balances",description:"TRC20 token balances for a Tron address. USDT-TRC20 is decorated with symbol/decimals. Read-only.",inputSchema:{type:"object",required:["address"],properties:{address:{type:"string"},contract:{type:"string",description:"Optional TRC20 contract to filter to."}}}},{name:"tron_trc20_transfers",description:"TRC20 transfer history for a Tron address. Defaults to the USDT contract (the dominant stablecoin rail); pass contract:'all' to drop the filter. Read-only.",inputSchema:{type:"object",required:["address"],properties:{address:{type:"string"},contract:{type:"string",description:"TRC20 contract, or 'all'. Defaults to USDT-TRC20."},limit:{type:"number"}}}},{name:"tron_chain_parameters",description:"Tron network chain parameters (energy fee, bandwidth price, account create fee). Read-only.",inputSchema:{type:"object",properties:{key:{type:"string"}}}},{name:"ton_account",description:"TON account state and nanoton/TON balance via public toncenter. Accepts raw (0:hex) or base64url addresses. Read-only.",inputSchema:{type:"object",required:["address"],properties:{address:{type:"string"}}}},{name:"ton_jetton_balances",description:"Jetton (TON fungible token) balances for an owner, with symbol/decimals where published. Read-only.",inputSchema:{type:"object",required:["owner"],properties:{owner:{type:"string"},jettonMaster:{type:"string"},limit:{type:"number"}}}},{name:"ton_transactions",description:"Recent TON transactions for an address (newest first). Read-only.",inputSchema:{type:"object",required:["address"],properties:{address:{type:"string"},limit:{type:"number"}}}},{name:"cosmos_chains",description:"List the Cosmos SDK chains Oracle can reach keylessly (cosmoshub, osmosis, celestia, injective, neutron, dydx, noble, kava) plus their LCD env overrides. Read-only.",inputSchema:{type:"object",properties:{}}},{name:"cosmos_balances",description:"Bank balances for a bech32 Cosmos address on any Cosmos SDK chain. IBC denoms are flagged with their hash for denom-trace resolution. Read-only.",inputSchema:{type:"object",required:["address"],properties:{address:{type:"string"},chain:{type:"string",description:"Chain key (default cosmoshub)."},lcdUrl:{type:"string",description:"Explicit LCD/REST base URL override."},limit:{type:"number"}}}},{name:"cosmos_delegations",description:"Staking delegations, unbonding entries, and pending rewards for a Cosmos delegator. Read-only.",inputSchema:{type:"object",required:["address"],properties:{address:{type:"string"},chain:{type:"string"},lcdUrl:{type:"string"},includeRewards:{type:"boolean"}}}},{name:"cosmos_denom_trace",description:"Resolve an ibc/<64-hex> denom back to its (path, base_denom) origin, or list a chain's trace table. Read-only.",inputSchema:{type:"object",properties:{hash:{type:"string",description:"ibc/<hash> denom or bare 64-hex hash. Omit to list traces."},chain:{type:"string"},lcdUrl:{type:"string"},limit:{type:"number"}}}},{name:"aptos_account",description:"Aptos account sequence number and authentication key via the public fullnode. Read-only.",inputSchema:{type:"object",required:["address"],properties:{address:{type:"string"}}}},{name:"aptos_resources",description:"Move resources held by an Aptos account, or one resource via resourceType. Read-only.",inputSchema:{type:"object",required:["address"],properties:{address:{type:"string"},resourceType:{type:"string"},limit:{type:"number"}}}},{name:"aptos_coin_balances",description:"Aptos coin balances: every 0x1::coin::CoinStore held, or one coinType through the 0x1::coin::balance view function. Read-only.",inputSchema:{type:"object",required:["address"],properties:{address:{type:"string"},coinType:{type:"string"}}}}],Q0=String(nl.env.ORACLE_DEFAULT_ADDRESS||nl.env.MAD_OPERATOR_ADDRESS||"").trim(),KN=Object.freeze(["data_call","address_book_remember","address_book_list","address_book_lookup","address_book_forget","vault_status","signer_status","signer_pending","signer_queue","signer_ack","signer_deny","skill_list","skill_load"]),YN=new Set(Z0.map(e=>e.name));for(let e of KN)if(YN.has(e))throw new Error(`public MCP custody boundary violated: ${e}`);var XN={evm_token_sniper_scan:e=>({provider:"evm-token-sniper",op:"scan",args:e}),hlp_vault_tracker:e=>({provider:"hl-vaults",op:"tracker",args:e}),hl_precompile_read:e=>({provider:"hl-precompiles",op:"read",args:e}),protocol_eval:()=>({provider:"protocol-templates",op:"eval",args:{}}),hl_delta_neutral:e=>({provider:"hl-delta-neutral",op:e.op==="quote"?"quote":e.op==="loop"?"loop":"scan",args:e}),lighter_delta_neutral:e=>({provider:"lighter-delta-neutral",op:e.op==="quote"?"quote":e.op==="loop"?"loop":"scan",args:e}),llama_protocols:()=>({provider:"defillama",op:"protocols",args:{}}),llama_prices:e=>({provider:"defillama",op:"prices",args:{coins:e.coins}}),dex_search:e=>({provider:"dexscreener",op:"search",args:{q:e.q}}),dex_token:e=>({provider:"dexscreener",op:"token",args:{address:e.address}}),lifi_quote:e=>({provider:"lifi",op:"quote",args:{fromChain:e.fromChain,toChain:e.toChain,fromToken:e.fromToken,toToken:e.toToken,fromAmount:e.fromAmount,fromAddress:e.fromAddress||Q0||void 0}}),portfolio_balance:e=>({provider:"portfolio",op:"balances",args:{addresses:e.addresses,evmChainIds:e.evmChainIds,includeTokens:e.includeTokens,includeCollectibles:e.includeCollectibles,includePrices:e.includePrices}}),portfolio_snapshot:e=>({provider:"portfolio",op:"snapshot",args:e}),portfolio_history:e=>({provider:"portfolio",op:"history",args:e}),portfolio_value_graph:e=>({provider:"portfolio",op:"valueGraph",args:e}),nft_inventory:e=>({provider:"nft-portfolio",op:"inventory",args:e}),nft_gallery:e=>({provider:"nft-portfolio",op:"gallery",args:e}),nft_pnl:e=>({provider:"nft-portfolio",op:"pnl",args:e}),nft_prepare_list:e=>({provider:"nft-portfolio",op:"prepareList",args:e}),nft_trait_snipe:e=>({provider:"nft-portfolio",op:"traitSnipe",args:e}),anvil_nft_scan:e=>({provider:"anvil-nft",op:"scanCollection",args:e}),anvil_opensea_arb:e=>({provider:"anvil-nft",op:"scanCrossVenueArb",args:e}),anvil_marketplace_scan:e=>({provider:"anvil-nft",op:"scanAllMarkets",args:e}),anvil_marketplace_opensea_arb:e=>({provider:"anvil-nft",op:"scanAllMarketsArb",args:e}),anvil_prepare_buy:e=>({provider:"anvil-nft",op:"prepareSpecificBuy",args:e}),anvil_prepare_sell:e=>({provider:"anvil-nft",op:"prepareSell",args:e}),stonkbrokers_scan_loot:e=>({provider:"stonkbrokers",op:"scanBrokerLoot",args:e}),stonkbrokers_broker_desk:e=>({provider:"stonkbrokers",op:e.mode?"prepareClockIn":"brokerDesk",args:e}),contract_risk_scan:e=>({provider:"contract-risk",op:"scan",args:e}),nft_mint_prepare:e=>({provider:"nft-mint",op:"prepare",args:e}),nft_mint_gas_price:e=>({provider:"nft-mint",op:"priceGas",args:e}),nft_mint_trigger:e=>({provider:"nft-mint",op:"createTrigger",args:e}),nft_mancer_os_scan:e=>({provider:"nft-mint",op:"evaluateMancerOs",args:e}),evm_simulate_transaction:e=>({provider:"evm-simulate",op:"simulate",args:e}),rpc_balance:e=>{let t=e.address||Q0;if(!t)throw new Error("address required (set ORACLE_DEFAULT_ADDRESS to supply a default)");return{provider:"evm-rpc",op:"getBalance",args:{chainId:e.chainId,address:t}}},rpc_block:e=>({provider:"evm-rpc",op:"blockNumber",args:{chainId:e.chainId}}),solana_balance:e=>({provider:"solana-rpc",op:"getBalance",args:{address:e.address,commitment:e.commitment}}),solana_token_accounts:e=>({provider:"solana-rpc",op:"tokenAccounts",args:{owner:e.owner,mint:e.mint,commitment:e.commitment}}),solana_simulate:e=>({provider:"solana-rpc",op:"simulate",args:{transaction:e.transaction,sigVerify:e.sigVerify,replaceRecentBlockhash:e.replaceRecentBlockhash}}),jupiter_venues:e=>({provider:"jupiter",op:"venues",args:{verify:e.verify,rpc:e.rpc}}),jupiter_quote:e=>({provider:"jupiter",op:"quote",args:{inputMint:e.inputMint,outputMint:e.outputMint,amount:e.amount,slippageBps:e.slippageBps}}),jupiter_prepare:e=>({provider:"jupiter",op:"prepare",args:{userPublicKey:e.userPublicKey,quoteResponse:e.quoteResponse,inputMint:e.inputMint,outputMint:e.outputMint,amount:e.amount,slippageBps:e.slippageBps}}),btc_health:()=>({provider:"bitcoin-esplora",op:"health",args:{}}),tron_account:e=>({provider:"tron-public",op:"account",args:{address:e.address}}),tron_trc20_balances:e=>({provider:"tron-public",op:"trc20Balances",args:{address:e.address,contract:e.contract}}),tron_trc20_transfers:e=>({provider:"tron-public",op:"trc20Transfers",args:{address:e.address,contract:e.contract,limit:e.limit}}),tron_chain_parameters:e=>({provider:"tron-public",op:"chainParameters",args:{key:e.key}}),ton_account:e=>({provider:"ton-public",op:"accountState",args:{address:e.address}}),ton_jetton_balances:e=>({provider:"ton-public",op:"jettonBalances",args:{owner:e.owner,jettonMaster:e.jettonMaster,limit:e.limit}}),ton_transactions:e=>({provider:"ton-public",op:"transactions",args:{address:e.address,limit:e.limit}}),cosmos_chains:()=>({provider:"cosmos-lcd",op:"chains",args:{}}),cosmos_balances:e=>({provider:"cosmos-lcd",op:"balances",args:{address:e.address,chain:e.chain,lcdUrl:e.lcdUrl,limit:e.limit}}),cosmos_delegations:e=>({provider:"cosmos-lcd",op:"delegations",args:{address:e.address,chain:e.chain,lcdUrl:e.lcdUrl,includeRewards:e.includeRewards}}),cosmos_denom_trace:e=>({provider:"cosmos-lcd",op:"denomTrace",args:{hash:e.hash,chain:e.chain,lcdUrl:e.lcdUrl,limit:e.limit}}),aptos_account:e=>({provider:"aptos-public",op:"account",args:{address:e.address}}),aptos_resources:e=>({provider:"aptos-public",op:"resources",args:{address:e.address,resourceType:e.resourceType,limit:e.limit}}),aptos_coin_balances:e=>({provider:"aptos-public",op:"coinBalances",args:{address:e.address,coinType:e.coinType}}),btc_fees:()=>({provider:"bitcoin-esplora",op:"fees",args:{}}),btc_balance:e=>({provider:"bitcoin-esplora",op:"address",args:{address:e.address}}),btc_utxos:e=>({provider:"bitcoin-esplora",op:"utxos",args:{address:e.address}}),btc_tx:e=>({provider:"bitcoin-esplora",op:"tx",args:{txid:e.txid}}),btc_meta_health:()=>({provider:"bitcoin-meta",op:"health",args:{}}),btc_rune_balance:e=>({provider:"bitcoin-meta",op:"runeBalances",args:{address:e.address}}),btc_inscriptions:e=>({provider:"bitcoin-meta",op:"inscriptions",args:{address:e.address,limit:e.limit}}),btc_inscription_info:e=>({provider:"bitcoin-meta",op:"inscriptionInfo",args:{inscriptionId:e.inscriptionId}}),btc_inscription_children:e=>({provider:"bitcoin-meta",op:"inscriptionChildren",args:{inscriptionId:e.inscriptionId,page:e.page}}),btc_ord_block_info:e=>({provider:"bitcoin-meta",op:"ordBlockInfo",args:{height:e.height}}),satflow_health:()=>({provider:"satflow",op:"health",args:{}}),satflow_floors:e=>({provider:"satflow",op:"collectionFloors",args:{type:e.type,ids:e.ids}}),satflow_wallet:e=>({provider:"satflow",op:"walletContents",args:{address:e.address,type:e.type,limit:e.limit}}),satflow_item:e=>({provider:"satflow",op:"item",args:{inscriptionId:e.inscriptionId||e.id}}),satflow_floor_listings:e=>({provider:"satflow",op:"floorListings",args:{collectionIds:e.collectionIds||e.ids,limit:e.limit}})};async function ol(e,{method:t="GET",body:n,signal:r}={}){let o=await fetch(e,{method:t,headers:{"content-type":"application/json"},body:n?JSON.stringify(n):void 0,signal:r}),i=await GN(o);if(!o.ok)throw new Error(i.error||`HTTP ${o.status}`);return i}async function Ce(e,t,n={},r={}){try{return await ol(`${rl}/data/call`,{method:"POST",body:{provider:e,op:t,args:n},signal:r.signal})}catch(o){let i=typeof o?.message=="string"?o.message:"";if(i&&!/^HTTP \d+$/.test(i))return{error:i,provider:e,op:t};throw o}}async function eb(e,t={},n={}){if(e.startsWith("launch_radar_"))return Xa(e,t);let r={strategy_draft:{operation:"draft"},strategy_validate:{operation:"validate"},strategy_backtest:{operation:"backtest"},strategy_optimize:{operation:"optimize"},strategy_evidence:{operation:"evidence"},strategy_shadow_start:{operation:"shadow",action:"start"},strategy_shadow_list:{operation:"shadow",action:"list"},strategy_shadow_status:{operation:"shadow",action:"get"},strategy_shadow_step:{operation:"shadow",action:"step"},strategy_shadow_stop:{operation:"shadow",action:"stop"},strategy_prepare_live:{operation:"prepare"}}[e];if(r){let{runStrategyOperation:i}=await Promise.resolve().then(()=>(bm(),gm));return i(r.operation,{...t,...r.action?{action:r.action}:{},nowMs:t.nowMs??Date.now()},{signal:n.signal})}if(e==="rfq_quote"){let{normalizeRfqIntent:i}=await Promise.resolve().then(()=>(Rc(),Nm)),{requestRfqQuotes:s}=await Promise.resolve().then(()=>(Bm(),qm)),a=i({...t,sources:t.sources??t.allowedSources});return s(a,{decimalsIn:t.decimalsIn,decimalsOut:t.decimalsOut,signal:n.signal})}if(e==="best_swap_route"||e==="best_bridge_route"){let{bestSwapRoute:i,bestBridgeRoute:s}=await Promise.resolve().then(()=>(Yn(),bp));return e==="best_swap_route"?i(t,n):s(t,n)}if(e==="prepare_best_route"){let{prepareBestRoute:i}=await Promise.resolve().then(()=>(Pa(),Ep));return i(t,n)}if(e==="prepare_best_bridge_route"){let{prepareBestBridgeRoute:i}=await Promise.resolve().then(()=>(Mm(),Um));return i(t,n)}if(e==="twap_simulate"){let{simulateTwap:i}=await Promise.resolve().then(()=>(Hm(),jm));return i({...t,amount:t.amount??t.amountIn},{signal:n.signal,...n.quoteFn?{quoteFn:n.quoteFn}:{}})}if(e==="bridge_aggregator_scan"){let{scanBridgeRoutes:i}=await Promise.resolve().then(()=>(xh(),vh));return i(t,n)}if(e==="perps_markets"){let i=String(t.venue||"all").toLowerCase(),s={};if(i==="all"||i==="dydx"){let{dydxMarkets:a}=await Promise.resolve().then(()=>(Ih(),kh));s.dydx=await a(void 0,n)}if(i==="all"||i==="drift"){let{driftMarkets:a}=await Promise.resolve().then(()=>(Nh(),Ch));s.drift=await a(n)}if(i==="all"||i==="vertex"){let{vertexMarkets:a}=await Promise.resolve().then(()=>($h(),Lh));s.vertex=await a(n)}return s}if(e==="dex_quote"){let i=String(t.dex||"").toLowerCase();if(i==="pancakeswap"){let{pancakeQuote:s}=await Promise.resolve().then(()=>(Bh(),qh));return s(t,n)}if(i==="sushiswap"){let{sushiQuote:s}=await Promise.resolve().then(()=>(Dh(),Mh));return s(t,n)}if(i==="raydium"){let{raydiumQuote:s}=await Promise.resolve().then(()=>(jh(),Fh));return s(t,n)}return{error:`unknown dex: ${i} \u2014 use pancakeswap, sushiswap, or raydium`}}if(e==="options_markets"){let{aevoMarkets:i}=await Promise.resolve().then(()=>(zh(),Hh));return{aevo:await i(n)}}if(e==="cex_market_data"){let i=String(t.venue||"all").toLowerCase(),s=String(t.op||"ticker"),a=new Set(["ticker","orderbook","funding","markPrice","openInterest"]);if(!a.has(s))return{error:`unknown op: ${s} \u2014 use ${[...a].join(", ")}`};if(!t.coin&&!t.symbol)return{error:"cex_market_data requires coin"};let c={coin:t.coin??t.symbol,quote:t.quote,market:t.market,limit:t.limit},[u,l,d]=await Promise.all([Promise.resolve().then(()=>(po(),jc)),Promise.resolve().then(()=>(Kc(),Gc)),Promise.resolve().then(()=>(Qc(),Jc))]),f={binance:{ticker:u.binanceTicker,orderbook:u.binanceOrderbook,funding:u.binanceFunding,markPrice:u.binanceMarkPrice,openInterest:u.binanceOpenInterest},okx:{ticker:l.okxTicker,orderbook:l.okxOrderbook,funding:l.okxFunding,markPrice:l.okxMarkPrice,openInterest:l.okxOpenInterest},bybit:{ticker:d.bybitTicker,orderbook:d.bybitOrderbook,funding:d.bybitFunding,markPrice:d.bybitMarkPrice,openInterest:d.bybitOpenInterest}};if(i!=="all"&&!f[i])return{error:`unknown venue: ${i} \u2014 use binance, okx, bybit, or all`};let p=i==="all"?Object.keys(f):[i],m=await Promise.all(p.map(async y=>{try{return[y,await f[y][s](c,n)]}catch(h){return[y,{error:String(h.message||h).slice(0,200)}]}}));return{op:s,...Object.fromEntries(m)}}if(e==="cex_basis_scan"){if(!t.coin)return{error:"cex_basis_scan requires coin"};let{cexBasis:i,cexFundingSpread:s}=await Promise.resolve().then(()=>(ay(),sy)),a={coin:t.coin,quote:t.quote,venues:t.venues};return t.fundingOnly===!0?s(a,n):i(a,n)}if(e==="snapshot_governance"){let i=String(t.op||"spaces"),s={health:()=>Ce("snapshot-governance","health",{},n),spaces:()=>Ce("snapshot-governance","spaces",t,n),proposals:()=>Ce("snapshot-governance","proposals",t,n),activeProposals:()=>Ce("snapshot-governance","activeProposals",t,n),proposal:()=>Ce("snapshot-governance","proposal",t,n),votes:()=>Ce("snapshot-governance","votes",t,n),votingPower:()=>Ce("snapshot-governance","votingPower",t,n)};return s[i]?s[i]():{error:`unknown op: ${i}`}}if(e==="tally_governance"){let i=String(t.op||"governors"),s={health:()=>Ce("tally-governance","health",{},n),governors:()=>Ce("tally-governance","governors",{},n),info:()=>Ce("tally-governance","info",t,n),proposals:()=>Ce("tally-governance","proposals",t,n),proposal:()=>Ce("tally-governance","proposal",t,n),voterStatus:()=>Ce("tally-governance","voterStatus",t,n),tallyProposals:()=>Ce("tally-governance","tallyProposals",t,n)};return s[i]?s[i]():{error:`unknown op: ${i}`}}if(e==="stablecoin_peg_scan")return Ce("stablecoin-peg","scan",t,n);if(e==="lending_markets"){let{compoundMarkets:i}=await Promise.resolve().then(()=>(uy(),cy));return{compound:await i(n)}}if(e==="yield_vaults"){let[{yearnVaults:i},{convexPools:s}]=await Promise.all([Promise.resolve().then(()=>(dy(),ly)),Promise.resolve().then(()=>(fy(),py))]);return{yearn:await i(n),convex:await s(n)}}if(e==="equity_venues"){let{equityVenues:i,toJsonSafe:s}=await Promise.resolve().then(()=>(ps(),ds));return s(i())}if(e==="equity_quote"){let{bestEquityRoute:i,toJsonSafe:s}=await Promise.resolve().then(()=>(ps(),ds));return s(i({ticker:t.ticker,sizeUsd:t.sizeUsd,horizonHours:t.horizonHours}))}if(e==="equity_prepare"){let{prepareEquityRoute:i,toJsonSafe:s}=await Promise.resolve().then(()=>(ps(),ds));return s(i({ticker:t.ticker,recipient:t.recipient||t.taker,sizeUsd:t.sizeUsd}))}if(e==="scanner_coverage"){let i=await Promise.resolve().then(()=>(ms(),fs));return i.registerBuiltinScanners?.(),i.scannerCoverage()}if(e==="scan_token"){let i=await Promise.resolve().then(()=>(ms(),fs));i.registerBuiltinScanners?.();let s=i.getScanner(Number(t.chainId));if(!s)throw new Error(`no scanner registered for chainId ${t.chainId}`);let a=await s.resolveToken(t.token,n),c=s.supports?.("resolvePools")?await s.resolvePools(t.token,n).catch(()=>null):null,u=s.supports?.("scoreRisk")?await s.scoreRisk(t.token,n).catch(()=>null):null;return{chainId:Number(t.chainId),token:a,pools:c,risk:u}}if(e==="wallet_balances"){let i=await Promise.resolve().then(()=>(ms(),fs));i.registerBuiltinScanners?.();let s=i.getScanner(Number(t.chainId));if(!s)throw new Error(`no scanner registered for chainId ${t.chainId}`);let a=await s.nativeBalance(t.address,n),c=t.token?await s.tokenBalance({owner:t.address,token:t.token},n).catch(()=>null):null;return{chainId:Number(t.chainId),address:t.address,native:a,token:c}}if(e==="watch_list"){let{listWatches:i}=await Promise.resolve().then(()=>(Iu(),ku));return{ok:!0,watches:i(),actionMode:"alert_only",execution:!1}}if(e==="watch_create"){let{createWatch:i}=await Promise.resolve().then(()=>(Iu(),ku));return{ok:!0,watch:i(t),execution:!1}}if(e==="receipt_report"){let{classifyReceipt:i}=await Promise.resolve().then(()=>(dg(),lg));return{ok:!0,...i(t.receipt||t),execution:!1}}if(e==="twitter_ca_watch"){let{tickTwitterCaWatch:i}=await Promise.resolve().then(()=>(Cg(),Tg));return i({handle:t.handle,chainId:t.chainId,limit:t.limit,automated:!0},n)}if(["trade_lifecycle","signal_score","workspace_artifact","research_artifact","portfolio_analyze","tax_lots","position_health","governance_prepare","safety_intelligence","portfolio_risk"].includes(e)){let{runDeskTool:i}=await Promise.resolve().then(()=>(G0(),W0));return i(e,t,{signal:n.signal})}if(e==="mev_status"){let{executeGloballyEnabled:i,mevExecuteEnabled:s}=await Promise.resolve().then(()=>(Y0(),K0));return{ok:!0,observer:!0,executeGloballyEnabled:i()===!0,mevExecuteEnabled:s()===!0,autonomous:!1,note:"Observer may run. Execute still needs the local signer plus literal --execute on oracle mev."}}if(e==="chain_list"){let{CHAINS:i}=await Promise.resolve().then(()=>(ra(),Ll));return{ok:!0,chains:Object.entries(i).map(([s,a])=>({id:s,chainId:a.chainId,name:a.name,evm:a.evm===!0}))}}if(e==="data_catalog")return ol(`${rl}/data/catalog`,{signal:n.signal});if(e==="data_health")return ol(`${rl}/data/health`,{signal:n.signal});if(e==="tool_output_shape"){let i=String(t?.tool||""),s=El(i);return s?{ok:!0,tool:i,shape:s.shape,observedAtMs:s.observedAtMs}:{ok:!0,tool:i,shape:null,note:"no observed output yet \u2014 call the tool once, then re-ask"}}let o=XN[e];if(o){let{provider:i,op:s,args:a}=o(t);return Ce(i,s,a,n)}throw new Error(`Unknown tool: ${e}`)}function tb(e,t){if(e?.dataBase64&&/^image\/(?:svg\+xml|png|jpeg|webp)$/.test(String(e.mimeType||""))){let{dataBase64:c,...u}=e,l=Do(JSON.stringify(Or(u),null,2));return{content:[{type:"image",data:c,mimeType:e.mimeType},{type:"text",text:l}]}}let n=JSON.stringify(e,null,2),r=Or(e),o=Do(JSON.stringify(r,null,2)),s=/"(?:mac|calldata|calldataHash|unsignedTransaction|typedData)"\s*:/.test(o)?null:gl(t,o,r);t!=="tool_output_shape"&&wl(t,r);let a=[{type:"text",text:s?s.text:o}];try{let c=o===n?ml(t,e):null;c&&a.push(c)}catch{}return{content:a}}var nb=Object.freeze({name:"oracle-data-mcp",version:"1",tools:Z0,async call(e,t,n={}){return tb(await eb(e,t,n),e)}});function JN(){return Hs(nb)}function QN(){let e=nl.argv[1];if(!e)return!1;try{return X0.realpathSync(e)===X0.realpathSync(zN(import.meta.url))}catch{return!1}}QN()&&JN();function ZN({timeoutMs:e,callToolOptions:t={}}={}){return Mo({...nb,async call(n,r,o={}){return tb(await eb(n,r,{...t,...o}),n)}},{...e==null?{}:{callTimeoutMs:e}})}var YM=ZN();export{KN as PUBLIC_MCP_FORBIDDEN_TOOLS,XN as ROUTES,Z0 as TOOLS,eb as callTool,ZN as createPublicMcpHandler,tb as formatMcpResult,YM as handle,ol as httpJson,GN as readBoundedJsonResponse,VN as resolveDataUrl,JN as startStdioLoop,Z0 as tools};
64
+ <details><summary>details \xB7 ${dr(t)}</summary><pre>${a}</pre></details>
65
+ <div class="foot"><span>${dr(t)}</span><span class="tag">THE FUTURE IS AGENTIC</span></div>
66
+ </div><script>document.documentElement.classList.add("live")</script></body></html>`}function Gf(e,t){let n=Hv[e];if(!n||!t||typeof t!="object"||t.error||t.ok===!1||!Wf(n,t).some(i=>i.hero))return null;let o=Wv(n,e,t);return{type:"resource",resource:{uri:`ui://oracle/card/${e}/${Date.now().toString(36)}`,mimeType:"text/html",text:o}}}import pr from"node:fs";import Gv from"node:os";import Eo from"node:path";import Kv from"node:crypto";var Yv=48e3,Kf=4e3,Jv=1440*60*1e3,Xv=8e3,Qv=1e6;function Zv(e=process.env.ORACLE_MCP_SPILL_BYTES){let t=Number(e);return!Number.isFinite(t)||t<=0?Yv:Math.min(Math.max(Math.floor(t),Xv),Qv)}function Sl(e=process.env.ORACLE_MCP_SPILL_DIR){if(typeof e=="string"&&e.trim())return Eo.resolve(e.trim());let t=process.env.XDG_STATE_HOME&&process.env.XDG_STATE_HOME.trim()?process.env.XDG_STATE_HOME.trim():Eo.join(Gv.homedir(),".local","state");return Eo.join(t,"oracle","mcp-spill")}function Yf(e,{maxDepth:t=4,maxKeys:n=24}={}){let r={entries:400};function o(i,s){if(r.entries<=0)return"\u2026";if(r.entries-=1,i===null)return"null";if(Array.isArray(i))return i.length===0?"[]":s>=t?`array(${i.length})`:{[`array(${i.length})`]:o(i[0],s+1)};if(typeof i=="object"){if(s>=t)return"object";let a={},c=Object.keys(i);for(let l of c.slice(0,n))a[l]=o(i[l],s+1);return c.length>n&&(a[`\u2026+${c.length-n} keys`]="\u2026"),a}return typeof i=="string"?i.length>40?`string(${i.length})`:"string":typeof i}return o(e,0)}function ex(e){try{let t=Date.now();for(let n of pr.readdirSync(e)){if(!n.endsWith(".json"))continue;let r=Eo.join(e,n);try{t-pr.statSync(r).mtimeMs>Jv&&pr.unlinkSync(r)}catch{}}}catch{}}function Jf(e,t,n,r={}){let o=r.thresholdBytes??Zv(),i=Buffer.byteLength(t,"utf8");if(i<=o)return null;try{let s=r.dir??Sl();pr.mkdirSync(s,{recursive:!0,mode:448}),ex(s);let a=new Date().toISOString().replace(/[:.]/g,"-"),c=Kv.randomBytes(4).toString("hex"),l=String(e).replace(/[^A-Za-z0-9_-]/g,"_").slice(0,64)||"tool",u=Eo.join(s,`${a}_${l}_${c}.json`);pr.writeFileSync(u,t,{mode:384});let d=t.slice(0,Kf),p=Yf(n),f=[`[oracle-mcp spill] ${e} returned ${i} bytes \u2014 full redacted result saved to:`,u,"","Key-shape outline (know the keys before parsing \u2014 read the file for full data):",JSON.stringify(p,null,2),"",`Preview (first ${Math.min(Kf,i)} bytes):`,d,d.length<t.length?"\u2026 [truncated \u2014 read the file above for the rest]":""].join(`
67
+ `);return{file:u,bytes:i,text:f}}catch{return null}}var wo=new Map;function Xf(e){return Eo.join(e??Sl(),"observed-shapes.json")}function Qf(e,t,n={}){try{let r=Yf(t);if(wo.set(String(e),{shape:r,observedAtMs:Date.now()}),wo.size>512){let i=[...wo.entries()].sort((s,a)=>s[1].observedAtMs-a[1].observedAtMs)[0];i&&wo.delete(i[0])}let o=n.dir??Sl();pr.mkdirSync(o,{recursive:!0,mode:448}),pr.writeFileSync(Xf(o),JSON.stringify(Object.fromEntries(wo),null,1),{mode:384})}catch{}}function Zf(e,t={}){let n=wo.get(String(e));if(n)return n;try{let o=JSON.parse(pr.readFileSync(Xf(t.dir),"utf8"))?.[String(e)];if(o&&typeof o=="object")return o}catch{}return null}vl();function tm(e){let t=String(e||"").replace(/[^a-z0-9]/gi,"").toLowerCase();return/authorization|cookie|password|credential|privatekey|mnemonic|seedphrase|apikey|accesstoken|refreshtoken|clientsecret|signertoken|bearer/.test(t)||t.endsWith("secret")?!0:t.endsWith("token")&&!new Set(["tokenin","tokenout","tokenid","tokens"]).has(t)}var mx=[/\bsk-[A-Za-z0-9_-]{10,}\b/g,/\bsk_(?:live|test)_[A-Za-z0-9_-]{10,}\b/g,/\b(?:ghp_|github_pat_|gho_|ghs_|xox[baprs]-|AIza|AKIA|pplx-|hf_|xai-|gsk_|npm_|tvly-)[A-Za-z0-9_-]{10,}\b/g,/\beyJ[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\b/g,/\bBearer\s+[^\s,"'}]+/gi,/\bBasic\s+[A-Za-z0-9+/=]{8,}/gi];function Ws(e){let t=String(e??"");for(let n of mx)n.lastIndex=0,t=t.replace(n,"[REDACTED]");return t=t.replace(/\b([A-Za-z][A-Za-z0-9_-]{0,80})\s*([:=])\s*("[^"]*"|'[^']*'|[^\s,;}\]]+)/g,(n,r,o)=>tm(r)?`${r}${o}[REDACTED]`:n),hx(Hr(t,{force:!0}))}function hx(e){return String(e).replace(/https?:\/\/[^\s"'<>]+/gi,t=>{let n=em(t);return n.ok?n.href:t})}function ki(e,{depth:t=0,seen:n=new WeakSet,key:r=""}={}){if(tm(r))return"[REDACTED]";if(typeof e=="string"){let i=Ws(e);return i.length<=2e4?i:`${i.slice(0,2e4)}\u2026[truncated]`}if(e==null||typeof e=="boolean"||typeof e=="number")return e;if(t>=12)return"[max-depth]";if(typeof e!="object")return Hr(String(e),{force:!0}).slice(0,240);if(n.has(e))return"[circular]";if(n.add(e),Array.isArray(e))return e.slice(0,1e3).map(i=>ki(i,{depth:t+1,seen:n,key:r}));let o={};for(let[i,s]of Object.entries(e))o[i]=ki(s,{depth:t+1,seen:n,key:i});return o}import{types as NC}from"node:util";Ri();la();Qt();import{Interface as Zh,getAddress as dj,id as xO,isAddress as pj}from"ethers";Qt();var BF=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"});pu();rt();var ey=Object.freeze({1:Object.freeze({name:"ethereum",positionManager:"0xC36442b4a4522E871399CD717aBDD847Ab11FE88",wrappedNative:"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",venue:"uniswap-v3",source:"https://docs.uniswap.org/contracts/v3/reference/deployments/ethereum-deployments"}),8453:Object.freeze({name:"base",positionManager:"0x03a520b32C04BF3bEEf7BEb72E919cf822Ed34f1",wrappedNative:"0x4200000000000000000000000000000000000006",venue:"uniswap-v3",source:"https://docs.uniswap.org/contracts/v3/reference/deployments/base-deployments"})}),gj=new Zh(["function ownerOf(uint256 tokenId) view returns (address)","function positions(uint256 tokenId) view returns (uint96 nonce,address operator,address token0,address token1,uint24 fee,int24 tickLower,int24 tickUpper,uint128 liquidity,uint256 feeGrowthInside0LastX128,uint256 feeGrowthInside1LastX128,uint128 tokensOwed0,uint128 tokensOwed1)","function decreaseLiquidity((uint256 tokenId,uint128 liquidity,uint256 amount0Min,uint256 amount1Min,uint256 deadline) params) payable returns (uint256 amount0,uint256 amount1)","function collect((uint256 tokenId,address recipient,uint128 amount0Max,uint128 amount1Max) params) payable returns (uint256 amount0,uint256 amount1)","function multicall(bytes[] data) payable returns (bytes[] results)"]),bj=new Zh(["function withdraw(uint256 wad)"]),wj=(1n<<128n)-1n;var Ej=xO("Transfer(address,address,uint256)").toLowerCase();Y();zn();rt();import{getAddress as Ij,Interface as Na,TypedDataEncoder as kj,parseUnits as Oj}from"ethers";var IO="fulfillAdvancedOrder(((address offerer,address zone,(uint8 itemType,address token,uint256 identifierOrCriteria,uint256 startAmount,uint256 endAmount)[] offer,(uint8 itemType,address token,uint256 identifierOrCriteria,uint256 startAmount,uint256 endAmount,address recipient)[] consideration,uint8 orderType,uint256 startTime,uint256 endTime,bytes32 zoneHash,uint256 salt,bytes32 conduitKey,uint256 totalOriginalConsiderationItems) parameters,uint120 numerator,uint120 denominator,bytes signature,bytes extraData) advancedOrder,(uint256 orderIndex,uint8 side,uint256 index,uint256 identifier,bytes32[] criteriaProof)[] criteriaResolvers,bytes32 fulfillerConduitKey,address recipient)",Rj=new Na([`function ${IO}`]),Pj=new Na(["function mintPublic(address nftContract,address feeRecipient,address minterIfNotPayer,uint256 quantity) payable","function mintAllowList(address nftContract,address feeRecipient,address minterIfNotPayer,uint256 quantity,(uint80 mintPrice,uint48 maxTotalMintableByWallet,uint48 startTime,uint48 endTime,uint48 dropStageIndex,uint32 maxTokenSupplyForStage,uint16 feeBps,bool restrictFeeRecipients) mintParams,bytes32[] proof) payable"]),kO=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"]),Lj=new Set(kO);var ty=Object.freeze({robinhood:4663,ethereum:1,base:8453,arbitrum:42161,optimism:10,polygon:137,avalanche:43114,zora:7777777,blast:81457,sei:1329,ape_chain:33139,b3:8333,soneium:1868,ronin:2020,bera_chain:80094,shape:360,unichain:130,gunzilla:43419,abstract:2741,animechain:69e3,hyperevm:999,somnia:5031,monad:143,megaeth:4326,ink:57073,stablechain:988});var $j=Object.freeze({OrderComponents:[{name:"offerer",type:"address"},{name:"zone",type:"address"},{name:"offer",type:"OfferItem[]"},{name:"consideration",type:"ConsiderationItem[]"},{name:"orderType",type:"uint8"},{name:"startTime",type:"uint256"},{name:"endTime",type:"uint256"},{name:"zoneHash",type:"bytes32"},{name:"salt",type:"uint256"},{name:"conduitKey",type:"bytes32"},{name:"counter",type:"uint256"}],OfferItem:[{name:"itemType",type:"uint8"},{name:"token",type:"address"},{name:"identifierOrCriteria",type:"uint256"},{name:"startAmount",type:"uint256"},{name:"endAmount",type:"uint256"}],ConsiderationItem:[{name:"itemType",type:"uint8"},{name:"token",type:"address"},{name:"identifierOrCriteria",type:"uint256"},{name:"startAmount",type:"uint256"},{name:"endAmount",type:"uint256"},{name:"recipient",type:"address"}]});var Dj=new Na(["function setApprovalForAll(address operator,bool approved)"]),Uj=new Na(["function cancel((address offerer,address zone,(uint8 itemType,address token,uint256 identifierOrCriteria,uint256 startAmount,uint256 endAmount)[] offer,(uint8 itemType,address token,uint256 identifierOrCriteria,uint256 startAmount,uint256 endAmount,address recipient)[] consideration,uint8 orderType,uint256 startTime,uint256 endTime,bytes32 zoneHash,uint256 salt,bytes32 conduitKey,uint256 counter)[] orders) returns (bool cancelled)"]);Mi();var Pa=new Map,PO=Object.keys(ot).map(Number),LO=Object.keys(Ct).map(Number),$O=Object.keys(ey).map(Number),Eu=gr.map(e=>e.chainId),DO=[...new Set(Object.values(ty))],wu=new Set,py=!1;function fy(e){if(!e||typeof e!="object"||Object.isFrozen(e))return e;for(let t of Object.values(e))fy(t);return Object.freeze(e)}function N(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(py&&wu.has(t))throw new Error(`registerProvider refuses to overwrite built-in provider: ${t}`);return Pa.set(t,{chainIds:e.chainIds||[],auth:e.auth||"none",description:e.description||"",baseEnv:e.baseEnv||[],...e,id:t}),Pa.get(t)}function Au(e){return Pa.get(e)||null}function UO(){wu.clear();for(let[e,t]of Pa)wu.add(e),fy(t);py=!0}N({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"});N({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, user vault equities, and HLP tracking."});N({id:"hl-precompiles",venue:"hyperliquid",chainIds:[999],auth:"none",ops:["health","read","l1BlockNumber","markPx","oraclePx","spotPx","position","spotBalance","vaultEquity","withdrawable"],execution:"read-only",baseEnv:["HYPEREVM_RPC_URL","HYPER_EVM_RPC"],description:"HyperEVM L1Read precompiles (0x800-0x809). eth_call only. Includes HLP vault equity. No CoreWriter."});N({id:"protocol-templates",venue:"protocol-builder",chainIds:[],auth:"none",ops:["health","list","listNative","gate","prepareDeploy","buildNative","eval"],description:"Gated EVM templates plus deterministic Solana program and Bitcoin policy scaffolds. Native bundles require chain-specific compile, tests, and simulation before any unsigned deploy/funding prepare. NOT a firm audit."});N({id:"poly-public",venue:"poly",chainIds:[137],auth:"none",ops:["health","time","markets","book","midpoint","spread","price","events"],execution:"read-only",baseEnv:["POLY_CLOB_URL","POLY_GAMMA_URL"],description:"Polymarket CLOB + Gamma public REST"});N({id:"poly-clob",venue:"poly",chainIds:[137],auth:"none",ops:["health","prepareOrder"],execution:"prepare",localSignerSurfaces:["poly"],description:"Polymarket CLOB unsigned EIP-712 order prepare plus owner-operated local-signer submit. Hosted/keyless remains prepare-only."});N({id:"hl-delta-neutral",venue:"hyperliquid",chainIds:[],auth:"none",ops:["health","scan","quote","prepare","loop"],execution:"prepare",localSignerSurfaces:["hl"],description:"Hyperliquid funding carry. Armed through the existing hl signer. Hosted/keyless remains prepare-only. Not automated."});N({id:"lighter-delta-neutral",venue:"lighter",chainIds:[],auth:"none",ops:["health","scan","quote","prepare","loop"],execution:"prepare",localSignerSurfaces:["lighter"],description:"Lighter.xyz funding carry. Armed through the official sendTx local-signer. Hosted/keyless remains prepare-only. Not automated."});N({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."});N({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."});N({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."});N({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",localSignerSurfaces:["evm-nft"],baseEnv:[],description:"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, surface contract risk, and hand execution to the local signer after explicit arming and bounded grant."});N({id:"universal-mint-router",venue:"universal-nft-mint",chainIds:[],auth:"optionalApiKey",ops:["health","capabilities","prepare"],execution:"prepare",baseEnv:["OPENSEA_API_KEY"],description:"Prepare-only exact universal mint routing across reviewed EVM and Ordinals adapters. Universal Solana mint is RESEARCH_ONLY and disabled until canonical serialized-message decoding ships; the separate Magic Eden marketplace provider is unchanged. It never signs or broadcasts."});N({id:"universal-nft-lifecycle",venue:"universal-nft-lifecycle",chainIds:[],auth:"optionalApiKey",ops:["health","capabilities","route"],execution:"read",baseEnv:["OPENSEA_API_KEY","MAGICEDEN_API_KEY","SATFLOW_API_KEY"],description:"Read-only NFT lifecycle route discovery. It does not prepare, sign, or broadcast artifacts; callers must invoke and review the selected provider operation separately."});for(let[e,t,n]of[["universal-evm-nft-transfer","evm-nft-transfer","Exact unsigned ERC-721/ERC-1155 safeTransferFrom preparation."],["universal-solana-nft-transfer","solana-nft-transfer","Exact unsigned verified Metaplex NFT/Core transfer preparation."],["universal-ordinals-transfer","bitcoin-nft-transfer","Exact unsigned Ordinals PSBT transfer-plan preparation."]])N({id:e,venue:t,chainIds:[],auth:"none",ops:["health","prepare"],execution:"prepare",description:n});N({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."});N({id:"evm-token-sniper",venue:"evm-token-launches",chainIds:Eu,auth:"none",ops:["health","scan"],execution:"prepare",localSignerSurfaces:["evm-swap"],baseEnv:gr.flatMap(e=>e.rpcEnv),description:"One generic EVM token-sniping path across every configured EVM chain: live identity, pools, structural risk, sell simulation, quote, guarded transaction preparation, and local-signer execution handoff. Robinhood Chain is the default, not a special implementation."});N({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)"});N({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)"});N({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"});N({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."});N({id:"satflow",venue:"bitcoin-marketplace",chainIds:[],auth:"apiKey",ops:["health","collectionFloors","collectionStats","item","walletContents","floorListings","preparePurchase","prepareList"],execution:"prepare",localSignerSurfaces:["btc"],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."});N({id:"jupiter",venue:"solana-dex",chainIds:[],auth:"none",ops:["health","venues","quote","prepare"],execution:"prepare",localSignerSurfaces:["sol"],baseEnv:["JUPITER_SWAP_API_URL","SOLANA_RPC_URL"],description:"Jupiter Swap API v1 quote + local-signer Solana swap handoff"});N({id:"hl-perps",venue:"hyperliquid",chainIds:[],auth:"none",ops:["health","assetInfo","prepareOrder","prepareCancel","prepareLeverage","prepareIsolatedMargin","prepareBracket","prepareBuilderApproval"],execution:"prepare",localSignerSurfaces:["hl"],notes:"Hyperliquid perp, HIP-3, and HIP-4 outcome orders through local-signer L1 action handoff."});N({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."});N({id:"hl-entry-state",venue:"hyperliquid",chainIds:[],auth:"none",ops:["health","see","qualify","lock","list","watch"],execution:"read-only",description:"SEE/ENTER/MANAGE for discretionary HL perps: compose sourced /info fields, qualify a side, lock the state only after a fill receipt, and alert_only-diff live vs that lock. Never signs."});N({id:"hl-staking",venue:"hypercore-staking",chainIds:[],auth:"none",ops:["health","validators","delegatorSummary","delegations","rewards","history","preflight","prepareStakeDeposit","prepareStakeWithdraw","prepareDelegate"],execution:"prepare",localSignerSurfaces:["hl"],baseEnv:["HL_INFO_URL","HL_EXCHANGE_URL","HL_TESTNET"],description:"Hyperliquid HyperCore HYPE staking. Public reads plus local-signer EIP-712 execution for cDeposit / cWithdraw / tokenDelegate after arming. Hosted/keyless remains prepare-only."});N({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."});N({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"});N({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)"});N({id:"dexscreener",venue:"dex",chainIds:[],auth:"none",ops:["health","token","search","pair"],baseEnv:["DEXSCREENER_API_URL"],description:"DexScreener public token/pair discovery"});N({id:"uniswap-v3",venue:"dex",chainIds:PO,auth:"none",ops:["health","quote","prepare","quotePath","ethUsdc","chains"],execution:"prepare",localSignerSurfaces:["evm-swap"],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"});N({id:"lp-exit",venue:"dex",chainIds:$O,auth:"none",ops:["health","inspect","prepareRemove","prepareSettlement","prepareUnwrap","chains"],execution:"prepare",baseEnv:["ETH_RPC_URL","BASE_RPC_URL"],description:"Receipt-gated Uniswap V3 LP exit into native asset: remove/collect, net-route token legs, then unwrap. Unsigned only."});N({id:"lp-liquidity-ranker",venue:"dex",chainIds:Eu,auth:"none",ops:["health","rank"],execution:"read-only",description:"Cross-chain LP destination analysis: deepest liquidity and net-best migration are separate, exact canonical mappings required."});N({id:"lp-destination-discovery",venue:"dex",chainIds:Eu,auth:"none",ops:["health","discover"],execution:"read-only",description:"Live exact-address LP pool discovery across configured chains; reports deepest liquidity separately from cost-qualified migration evidence."});N({id:"uniswap-v4",venue:"dex",chainIds:LO,auth:"none",ops:["health","quote","inspectHook","prepare","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 V4 quotes, hook permission/code/pool-state inspection, and guarded unsigned Universal Router preparation across official deployments plus Robinhood Chain."});N({id:"x402",venue:"payments",chainIds:[],auth:"none",ops:["health","inspect","prepare"],execution:"prepare",description:"x402 v2 PAYMENT-REQUIRED inspection and explicit-cap exact-payment templates. Never signs, calls a facilitator, or retries a paid request."});N({id:"bankr",venue:"wallet-data",chainIds:[],auth:"apiKey",ops:["health","wallet","portfolio","swapQuote"],execution:"read-only",baseEnv:["BANKR_API_KEY","BANKR_API_URL"],description:"Bankr Wallet API read-only identity, portfolio, and swap quotes. Oracle excludes Bankr swap, transfer, sign, submit, agent, and LLM endpoints."});N({id:"aerodrome",venue:"dex",chainIds:[8453],auth:"none",ops:["health","quote","prepare","chains"],execution:"prepare",localSignerSurfaces:["evm-swap"],baseEnv:["BASE_RPC_URL"],description:"Aerodrome Slipstream CL on Base \u2014 QuoterV2 + SwapRouter exact-input via eth_call (tickSpacing, no key)"});N({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)"});N({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)"});N({id:"hop",venue:"bridge",chainIds:[1,10,137,42161],auth:"none",ops:["health","quote"],baseEnv:["HOP_API_URL"],description:"Hop Protocol bridge quotes (public)"});N({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)"});N({id:"cowswap",venue:"dex",chainIds:[1,100,42161,8453],auth:"none",ops:["health","quote","prepareOrder","order","status","chains","arm"],execution:"armed-local",localSignerSurfaces:["evm-order"],baseEnv:[],description:"CowSwap batch auction. Quote is public; Allow posts official api.cow.fi orders."});N({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)"});N({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)"});N({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"});N({id:"anvil-nft",venue:"robinhood-nft",chainIds:[4663],auth:"optionalApiKey",ops:["health","markets","quoteSpecificBuy","quoteSell","scanCollection","scanAllMarkets","scanCrossVenueArb","scanAllMarketsArb","prepareSpecificBuy","prepareSell"],execution:"prepare",localSignerSurfaces:["evm-nft"],baseEnv:["RH_CHAIN_RPC","OPENSEA_API_KEY","OPENSEA_ENV_FILE"],description:"All-market Anvil discovery and exact-token arbitrage, with exact buy and sell execution through the armed owner-local signer after human confirmation"});N({id:"stonkbrokers",venue:"robinhood-nft",chainIds:[4663],auth:"optionalApiKey",ops:["health","quoteBrokerBuy","scanBrokerLoot","prepareBrokerBuy","brokerDesk","clockInStatus","prepareClockIn"],execution:"prepare",baseEnv:["RH_CHAIN_RPC"],description:"Unsigned StonkBrokers Broker Desk discovery, nested-loot verification, and bounded local-only preparations"});N({id:"opensea-nft",venue:"nft",chainIds:DO,auth:"apiKey",ops:["health","collection","floor","bestListings","bestListing","bestOffer","accountNfts","accountPnl","prepareMint","prepareList","prepareCancel"],execution:"prepare",baseEnv:["OPENSEA_API_KEY","OPENSEA_ENV_FILE"],description:"OpenSea multichain NFT inventory, floors, and unsigned bounded mint, listing, and listing-cancellation preparations; opaque buy/sweep fulfillment is disabled"});N({id:"local-marketplace",venue:"local-p2",chainIds:[],auth:"none",ops:["health","createListing","listListings","cancelListing","createOffer","armFill"],execution:"prepare",localSignerSurfaces:["evm-nft"],description:"Owner-local P2 catalog stored under ~/.config/oracle. Additive and isolated from OpenSea, Magic Eden, Satflow, Bisq, Anvil, and Polymarket. Listings are armed for the owner-local signer; sign-and-broadcast is an explicit createLocalMarketplace().instructFill instruction. Generic signHash is refused."});N({id:"local-x402",venue:"local-x402",chainIds:[],auth:"none",ops:["health","createIntent","listIntents","cancelIntent","armPayment"],execution:"prepare",localSignerSurfaces:["evm-swap"],description:"Owner-local x402 payment budgets under ~/.config/oracle. Additive and isolated from OpenSea and Telegram. Intents are armed; sign-and-broadcast is an explicit createLocalX402().instructPay instruction. Generic signHash is refused."});N({id:"local-pack-registry",venue:"local-packs",chainIds:[],auth:"none",ops:["health","registerPack","listPacks","revokePack"],execution:"read-only",description:"Owner-local third-party pack REGISTRY under ~/.config/oracle. Catalog only: packs are never loaded or executed. Isolated from OpenSea and Telegram."});N({id:"erc8004-identity",venue:"agent-identity",chainIds:[],auth:"none",ops:["health","prepareIdentityRegistration","prepareAgentURIUpdate","inspectIdentity","arm"],execution:"armed-local",localSignerSurfaces:["evm"],baseEnv:["ORACLE_ERC8004_CHAIN_ID","ORACLE_ERC8004_IDENTITY_REGISTRY"],description:"Draft ERC-8004 identity. Public prepare is keyless; Allow broadcasts type-2 register/setAgentURI."});N({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"});N({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"});N({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"});N({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"});N({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"});N({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)"});N({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"});N({id:"odos",venue:"dex",chainIds:[1,10,56,137,8453,42161,43114,4663],auth:"none",ops:["health"],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)"});N({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"});N({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"});N({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."});N({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."});N({id:"polygon-staking",venue:"polygon-staking",chainIds:[137],auth:"none",ops:["health","validators","validatorDetail"],baseEnv:["POLYGON_STAKING_API_URL"],description:"Polygon POS staking validators"});N({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."});N({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."});N({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. Address state exposes transaction counts; per-asset sums can be absent for unconfidential multi-asset addresses and are blinded for confidential addresses."});N({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."});N({id:"tron-public",venue:"tron",chainIds:[],auth:"none",ops:["health","account","trc20Balances","trc20Transfers","chainParameters"],execution:"read-only",localSignerSurfaces:[],baseEnv:["TRON_API_URL","TRONGRID_API_KEY"],description:"Tron mainnet via public TronGrid. TRX balance, TRC20 token balances, USDT-TRC20 transfer history, chain parameters. Tron carries the largest USDT float of any chain. Keyless; TRONGRID_API_KEY only raises the rate ceiling and never travels to a non-TronGrid host."});N({id:"ton-public",venue:"ton",chainIds:[],auth:"none",ops:["health","accountState","jettonBalances","transactions"],execution:"read-only",localSignerSurfaces:[],baseEnv:["TON_API_URL","TONCENTER_API_KEY"],description:"TON via public toncenter. Account state + nanoton balance, jetton (TON's ERC20) balances, transaction history. The settlement layer for Telegram-native assets. Keyless; TONCENTER_API_KEY only raises the rate ceiling."});N({id:"cosmos-lcd",venue:"cosmos",chainIds:[],auth:"none",ops:["health","chains","balances","delegations","denomTrace"],execution:"read-only",localSignerSurfaces:[],baseEnv:["COSMOS_LCD_URL","COSMOS_CHAIN"],description:"Cosmos SDK chains via keyless LCD/REST \u2014 one provider, many chains (cosmoshub default, plus osmosis/celestia/injective/neutron/dydx/noble/kava, or any LCD via COSMOS_LCD_URL_<CHAIN>). Bank balances, staking delegations + unbondings + rewards, and IBC denom-trace resolution for ibc/<hash> denoms."});N({id:"sui-public",venue:"sui",chainIds:[],auth:"none",ops:["health"],execution:"unavailable",deprecated:{since:"2026-08-25",reason:"Sui public fullnodes return JSON-RPC -32601 because the JSON-RPC surface is deprecated",evidence:"Migrate the provider to Sui GraphQL or gRPC before restoring it to the live roster"},localSignerSurfaces:[],baseEnv:["SUI_RPC_URL"],description:"QUARANTINED: Sui public JSON-RPC is deprecated. A GraphQL or gRPC replacement has not shipped."});N({id:"aptos-public",venue:"aptos",chainIds:[],auth:"none",ops:["health","account","resources","coinBalances"],execution:"read-only",localSignerSurfaces:[],baseEnv:["APTOS_FULLNODE_URL","APTOS_API_KEY"],description:"Aptos mainnet via the public fullnode REST API. Ledger info, account sequence/auth key, Move resources, type-specific 0x1::coin::balance views, and legacy CoinStore enumeration. Generic enumeration does not cover newer Fungible Asset stores. Read-only; the transaction submit door is never called."});N({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)."});N({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."});N({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."});N({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."});N({id:"social-intel",venue:"oracle-social",chainIds:[],auth:"none",ops:["health","trendingTokens","trendingCas","keywordMentions","smartAccounts","narratives"],execution:"read-only",localSignerSurfaces:[],baseEnv:["ORACLE_SOCIAL_INTEL_STORE","ORACLE_SOCIAL_INTEL_STALE_MIN"],description:"Local curated-account crypto social intelligence. Sample = graded caller list, NOT a firehose; every response reports sample size and snapshot age."});N({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."});N({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."});N({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"});N({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)"});N({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)"});N({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)"});N({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)"});N({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)"});N({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)"});N({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)"});N({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)"});N({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)"});N({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."});N({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)"});N({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)"});N({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)"});N({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)"});N({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)"});N({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({id:"limit-order",venue:"1inch-lop",chainIds:[1,10,56,137,8453,42161],auth:"none",ops:["health","prepare","arm"],execution:"armed-local",localSignerSurfaces:["evm-order"],description:"1inch Limit Order Protocol v4. Queues on the local signer; Allow posts the order."});N({id:"jupiter-dca",venue:"jupiter",chainIds:[],auth:"none",ops:["health","prepare","arm"],execution:"armed-local",localSignerSurfaces:["sol"],description:"Jupiter limit/DCA. Unsigned tx queues on the sol signer; Allow submits."});N({id:"protective-monitors",venue:"oracle-intel",chainIds:[],auth:"none",ops:["health","depeg","oracleDeviation","exploitFeed","goplus","liquidationLadder"],execution:"read-only",description:"Alert-only depeg, oracle deviation, exploit feed, GoPlus second opinion, liquidation ladder."});N({id:"funding-scanner",venue:"perps",chainIds:[],auth:"none",ops:["health","scan"],execution:"read-only",description:"Cross-venue funding carry ranked net of fee drag. Failed venues stay FAILED."});N({id:"perp-universal",venue:"perps",chainIds:[],auth:"none",ops:["health","fundingAll","prepareOrder"],execution:"prepare-only",description:"Live fundingAll across HL/GMX/dYdX + honest FAILED Drift/Vertex. prepareOrder unsigned."});N({id:"onchain-options",venue:"options",chainIds:[],auth:"none",ops:["health","rank"],execution:"read-only",description:"Local Black-Scholes ranking. No arm until official Derive/Lyra domain is pinned."});N({id:"holder-clusters",venue:"oracle-intel",chainIds:[],auth:"none",ops:["health","score"],execution:"read-only",description:"Heuristic holder HHI + common-funding clusters. Not identity."});N({id:"kalshi",venue:"prediction",chainIds:[],auth:"none",ops:["health","markets"],execution:"read-only",description:"Kalshi market catalog read-only. Trading may be US-restricted. Prepare refused."});N({id:"derive-options",venue:"options",chainIds:[],auth:"none",ops:["health"],execution:"unavailable",deprecated:{since:"2026-08-25",reason:"No official Derive EIP-712 domain or contract is pinned, so prepare remains unavailable",evidence:"prepareOption() in onchain-options.mjs refuses unconditionally"},description:"UNAVAILABLE: Derive execution has no pinned official domain. Use onchain-options for local ranking."});N({id:"limitless",venue:"prediction",chainIds:[],auth:"none",ops:["health","markets"],execution:"read-only",description:"Limitless market catalog. Prepare refused \u2014 no grant-bound decoder."});N({id:"dov-vaults",venue:"options",chainIds:[],auth:"none",ops:["health"],execution:"unavailable",deprecated:{since:"2026-08-25",reason:"The reviewed DOV vault registry is empty, so every vault read refuses",evidence:"REVIEWED_DOV_VAULTS.length is zero and no reviewed code hash is pinned"},description:"UNAVAILABLE: the reviewed DOV vault registry is empty and every read fails closed."});N({id:"prediction-match",venue:"prediction",chainIds:[],auth:"none",ops:["health","match"],execution:"read-only",description:"Cross-venue event match. Same title is not a match."});N({id:"tee-attestation",venue:"identity",chainIds:[],auth:"none",ops:["health","verify"],execution:"read-only",description:"TEE schema stub. Hardware unavailable. Unknown root unverified."});N({id:"keeper-mirror",venue:"oracle-intel",chainIds:[],auth:"none",ops:["health"],execution:"read-only",description:"Keeper alert-mirror. Off by default. No execute path."});N({id:"erc7715-permissions",venue:"aa",chainIds:[],auth:"none",ops:["health","normalize"],execution:"read-only",description:"ERC-7715 permission normalize. Wildcards refused. aa allowlist empty."});N({id:"erc7710-delegation",venue:"aa",chainIds:[],auth:"none",ops:["health","inspect"],execution:"read-only",description:"ERC-7710 delegation inspect. Missing revocation/expiry fails closed."});N({id:"binance-public",venue:"cex",chainIds:[],auth:"none",ops:["health","ticker","orderbook","funding","markPrice","openInterest","fundingHistory"],execution:"read-only",localSignerSurfaces:[],baseEnv:["BINANCE_API_URL","BINANCE_FAPI_URL"],description:"Binance public spot + USD-M perp market data (ticker, depth, premiumIndex funding, open interest). Keyless reads only; no trading endpoints."});N({id:"okx-public",venue:"cex",chainIds:[],auth:"none",ops:["health","ticker","orderbook","funding","markPrice","openInterest"],execution:"read-only",localSignerSurfaces:[],baseEnv:["OKX_API_URL"],description:"OKX public v5 market data (ticker, books, swap funding-rate, mark-price, open-interest). Keyless reads only; no trading endpoints."});N({id:"bybit-public",venue:"cex",chainIds:[],auth:"none",ops:["health","ticker","orderbook","funding","markPrice","openInterest","fundingHistory"],execution:"read-only",localSignerSurfaces:[],baseEnv:["BYBIT_API_URL"],description:"Bybit public v5 market data (spot/linear tickers, orderbook, funding, open interest). Keyless reads only; no trading endpoints."});N({id:"cex-basis",venue:"cex",chainIds:[],auth:"none",ops:["health","basis","fundingSpread","legs"],execution:"read-only",localSignerSurfaces:[],baseEnv:["BINANCE_API_URL","OKX_API_URL","BYBIT_API_URL","HL_INFO_URL"],description:"Cross-venue perp basis and annualized funding spreads across Binance, OKX, Bybit and Hyperliquid public data. Analysis only, no sizing and no prepare."});N({id:"snapshot-governance",venue:"governance",chainIds:[],auth:"none",ops:["health","spaces","proposals","activeProposals","proposal","votes","votingPower"],execution:"read-only",localSignerSurfaces:[],baseEnv:["SNAPSHOT_API_URL"],description:"Snapshot.org off-chain governance reads: spaces, proposals, proposal detail, an address's votes and voting power. Never signs a vote."});N({id:"tally-governance",venue:"governance",chainIds:[1,10,42161],auth:"none",ops:["health","governors","info","proposals","proposal","voterStatus","tallyProposals"],execution:"read-only",localSignerSurfaces:[],baseEnv:["TALLY_API_URL","TALLY_API_KEY"],description:"Governor Bravo / OZ Governor on-chain proposal state and vote tallies for major DAOs, plus optional keyed Tally metadata. Read-only ABI has no vote/queue/execute selector."});N({id:"launch-radar",venue:"launch-radar",chainIds:[],auth:"none",ops:["health","status","snapshot","candidates","rpcHealth","evaluateStrategy"],execution:"read-only",localSignerSurfaces:[],baseEnv:["ORACLE_CONFIG_DIR","LAUNCH_RADAR_STORE_PATH"],description:"Read-only Launch Radar data plane: durable shadow-cycle status/snapshot from local disk, plus pure candidate normalization, RPC-sample ranking, and strategy-policy evaluation over caller-supplied inputs. Shadow-only, unfunded, no signer, no broadcast."});N({id:"stablecoin-peg",venue:"oracle-intel",chainIds:[],auth:"none",ops:["health","scan"],execution:"read-only",localSignerSurfaces:[],baseEnv:[],description:"Peg-deviation scan across major and Hyperliquid-native stables. Ranks by absolute bps from $1 and classifies normal/watch/warn/depeg. Unpriced is unknown, never on-peg. Read-only composition of DefiLlama/Pyth/DexScreener."});N({id:"onchain-investigator",venue:"oracle-intel",chainIds:[],auth:"optionalApiKey",optionalAuth:{operation:"wallet",optInField:"includeOpenSea",type:"apiKey",env:"OPENSEA_API_KEY"},ops:["health","capabilities","wallet","analyze","nftOverlap"],execution:"read-only",localSignerSurfaces:[],baseEnv:["TRONGRID_API_KEY","TRON_PRO_API_KEY","TONCENTER_API_KEY","TON_API_KEY","APTOS_API_KEY","OPENSEA_API_KEY"],allowCallerOptions:!1,opPolicies:{health:{argsSensitivity:"none",resultSensitivity:"public",cache:!0},capabilities:{argsSensitivity:"none",resultSensitivity:"public",cache:!0},wallet:{argsSensitivity:"sensitive",resultSensitivity:"sensitive",cache:!1},analyze:{argsSensitivity:"sensitive",resultSensitivity:"sensitive",cache:!1},nftOverlap:{argsSensitivity:"sensitive",resultSensitivity:"sensitive",cache:!1}},description:"Bounded, report-only on-chain evidence collection through fixed family/network endpoints, literal-opt-in one-page OpenSea v2 enrichment, and deterministic offline coordination/NFT-overlap analysis. Optional ambient keys only raise trusted-provider rate limits. Wallet addresses, snapshots, and evidence reports are sensitive and never cacheable. OpenSea reads only OPENSEA_API_KEY after opt-in and has no inventory cursor. No caller URL, RPC, transport, signer, prepare, broadcast, scam claim, or identity claim surface."});UO();import w_ from"node:os";import Ny from"node:path";import yy from"node:fs";import jO from"node:path";import{createHash as BO}from"node:crypto";var qO="sha256:"+"0".repeat(64);function my(e){if(e&&typeof e=="object"&&!Object.isFrozen(e)){for(let t of Object.values(e))my(t);Object.freeze(e)}return e}function Su(e){return Array.isArray(e)?`[${e.map(Su).join(",")}]`:e&&typeof e=="object"?`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${Su(e[t])}`).join(",")}}`:JSON.stringify(e)}function MO(e){return`sha256:${BO("sha256").update(Su(e)).digest("hex")}`}function FO(e,t,n){if(!e||typeof e!="object"||Array.isArray(e))throw new TypeError("evidence event must be an object");if(typeof e.id!="string"||e.id.length===0)throw new TypeError("evidence event id must be non-empty");if(typeof e.type!="string"||e.type.length===0)throw new TypeError("evidence event type must be non-empty");if(typeof e.at!="string"||!Number.isFinite(Date.parse(e.at))||new Date(e.at).toISOString()!==e.at)throw new TypeError("evidence event at must be an exact ISO instant");if(!e.data||typeof e.data!="object"||Array.isArray(e.data))throw new TypeError("evidence event data must be an object");return{sequence:t,id:e.id,type:e.type,at:e.at,data:structuredClone(e.data),previousDigest:n}}function hy(e=[]){if(!Array.isArray(e))throw new TypeError("evidence records must be an array");let t=new Set,n=qO,r=e.map((o,i)=>{if(t.has(o?.id))throw new Error(`duplicate evidence event id: ${o.id}`);t.add(o?.id);let s=FO(o,i+1,n),a=MO(s);if(o.sequence!==i+1||o.previousDigest!==n||o.digest!==a)throw new Error(`evidence digest chain mismatch at sequence ${i+1}`);return n=a,{...s,digest:a}});return my(r)}var HO=1;function La(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)&&Object.getPrototypeOf(e)===Object.prototype}function zO(e){return structuredClone(e)}function vu(e,t="state"){if(!(e===null||typeof e=="string"||typeof e=="boolean")&&!(typeof e=="number"&&Number.isFinite(e))){if(Array.isArray(e))return e.forEach((n,r)=>vu(n,`${t}[${r}]`));if(La(e)){for(let[n,r]of Object.entries(e)){if(r===void 0)throw new Error(`launch-radar store: non-JSON value at ${t}.${n}`);vu(r,`${t}.${n}`)}return}throw new Error(`launch-radar store: non-JSON value at ${t}`)}}function VO(e){if(!La(e)||!["shadow","armed","autonomous"].includes(e.mode)||typeof e.status!="string"||typeof e.ambiguous!="boolean")throw new Error("launch-radar store: corrupt strategy status shape")}function WO(e){if(!La(e)||e.version!==HO)throw new Error("launch-radar store: corrupt or unsupported version");if(!Array.isArray(e.candidates)||!(e.cursor===null||La(e.cursor))||!Array.isArray(e.evidence))throw new Error("launch-radar store: corrupt state shape");VO(e.strategyStatus),vu(e);try{hy(e.evidence)}catch(t){throw new Error(`launch-radar store: corrupt evidence: ${t.message}`)}return zO(e)}function GO(e,t=!1){let n;try{n=yy.lstatSync(e)}catch(r){if(t&&r?.code==="ENOENT")return!1;throw r}if(n.isSymbolicLink())throw new Error("launch-radar store: path must not be a symlink");if(!n.isFile())throw new Error("launch-radar store: path must be a regular file");if((n.mode&511)!==384)throw new Error("launch-radar store: existing file permissions must be 0600");return!0}function KO(e){GO(e);let t;try{t=JSON.parse(yy.readFileSync(e,"utf8"))}catch{throw new Error("launch-radar store: corrupt JSON")}return WO(t)}function gy(e={}){let t=e.path;if(typeof t!="string"||!jO.isAbsolute(t))throw new Error("launch-radar store: path must be absolute");return KO(t)}var Fi=Object.freeze({PASS:"PASS",WARN:"WARN",BLOCK:"BLOCK",UNKNOWN:"UNKNOWN"}),YO=new Set(["LIVE","CACHED","STALE","UNKNOWN","UNAVAILABLE"]),by=/^0x[0-9a-fA-F]{40}$/,JO=/^0x[0-9a-fA-F]{64}$/;function Lo(e){if(e&&typeof e=="object"&&!Object.isFrozen(e)){for(let t of Object.values(e))Lo(t);Object.freeze(e)}return e}function on(e,t=null){return e&&typeof e=="object"?structuredClone(e):t}function Ey(e){return typeof e!="string"||!Number.isFinite(Date.parse(e))?null:new Date(e).toISOString()===e?e:null}function wy(e){return!!(e&&YO.has(e.evidence)&&Ey(e.observedAt))}function Ay(e){return!e||e.status!=="KNOWN"||e.amount===null||e.amount===void 0||e.amount===""?{status:"UNKNOWN",amount:null,unit:e?.unit??null}:{status:"KNOWN",amount:String(e.amount),unit:e.unit??null}}function $a(e){return[...new Set(e.filter(Boolean))]}function XO(e={}){let t=[],n=[],r=[];(e.venue?.supported!==!0||e.venue?.verified!==!0)&&t.push("unsupported venue"),e.signal?.unsolicitedAirdrop===!0&&t.push("unsolicited airdrop is not a held or eligible candidate"),e.risk?.verdict==="FAIL"&&t.push("risk verdict is FAIL"),e.sellability?.verdict==="FAIL"&&t.push("sellability verdict is FAIL"),e.route?.status==="BLOCK"&&t.push("route is blocked");for(let[i,s]of[["token",e.token],["venue",e.venue],["signal",e.signal],["risk",e.risk],["sellability",e.sellability],["route",e.route]])!wy(s)||s.evidence==="UNKNOWN"||s.evidence==="UNAVAILABLE"?n.push(`${i} evidence is missing or unavailable`):(s.evidence==="CACHED"||s.evidence==="STALE")&&r.push(`${i} evidence is ${s.evidence}`);(!e.pool||!wy(e.pool))&&n.push("pool evidence is missing or unavailable"),(!e.risk||!["PASS","CAUTION","FAIL"].includes(e.risk.verdict))&&n.push("risk verdict is UNKNOWN"),(!e.sellability||!["PASS","CAUTION","FAIL"].includes(e.sellability.verdict))&&n.push("sellability verdict is UNKNOWN"),(!e.route||!["PASS","WARN","BLOCK"].includes(e.route.status))&&n.push("route status is UNKNOWN"),Ay(e.route?.cost).status==="UNKNOWN"&&n.push("route cost is UNKNOWN"),e.risk?.verdict==="CAUTION"&&r.push("risk verdict is CAUTION"),e.sellability?.verdict==="CAUTION"&&r.push("sellability verdict is CAUTION"),e.route?.status==="WARN"&&r.push("route status is WARN");let o=$a(t);return o.length?Lo({status:Fi.BLOCK,whyBlocked:o}):n.length?Lo({status:Fi.UNKNOWN,whyBlocked:$a(n)}):r.length?Lo({status:Fi.WARN,whyBlocked:[],warnings:$a(r)}):Lo({status:Fi.PASS,whyBlocked:[]})}function QO(e={}){let t=on(e,{}),n=Object.fromEntries(Object.entries(t).map(([o,i])=>[o,Ey(i)])),r=(o,i)=>n[o]&&n[i]?Math.max(0,Date.parse(n[i])-Date.parse(n[o])):null;return t.stagesMs={discoveryToRisk:r("discoveredAt","riskCompletedAt"),riskToSellability:r("riskCompletedAt","sellabilityCompletedAt"),sellabilityToRoute:r("sellabilityCompletedAt","routeCompletedAt"),routeToNormalized:r("routeCompletedAt","normalizedAt"),total:r("discoveredAt","normalizedAt")},t}function Sy(e={}){if(!e||typeof e!="object"||Array.isArray(e))throw new TypeError("candidate must be an object");let t=on(e.chain,{}),n=on(e.token,{}),r=on(e.pool),o=on(e.venue,{}),i=on(e.signal,{}),s=on(e.route,{});s.cost=Ay(s.cost);let a=XO({...e,chain:t,token:n,pool:r,venue:o,signal:i,route:s}),c=i.unsolicitedAirdrop===!0,l=by.test(n.address||"")?n.address.toLowerCase():"unknown-token",u=by.test(r?.address||"")?r.address.toLowerCase():JO.test(r?.poolId||"")?r.poolId.toLowerCase():"unknown-pool",d=`${Number.isInteger(t.id)?t.id:"unknown-chain"}:${l}:${u}:${o.key||"unknown-venue"}`;return Lo({id:d,status:a.status,chain:t,token:n,pool:r,venue:o,signal:i,risk:on(e.risk,{verdict:"UNKNOWN",evidence:"UNKNOWN",observedAt:null}),sellability:on(e.sellability,{verdict:"UNKNOWN",evidence:"UNKNOWN",observedAt:null}),sellSimulation:on(e.sellSimulation,{verdict:"UNKNOWN",evidence:"UNAVAILABLE",observedAt:null}),quoteAsset:e.quoteAsset??r?.quoteAsset??null,roundTripLossBps:e.roundTripLossBps??null,quoteAmountIn:e.quoteAmountIn??null,quoteSlippageBps:e.quoteSlippageBps??null,quoteAssetDecimals:e.quoteAssetDecimals??null,route:s,prepared:on(e.prepared,{status:"NOT_PREPARED",unsigned:!0}),whyBlocked:$a([...e.whyBlocked||[],...a.whyBlocked]),latency:QO(e.latency),held:c?!1:e.held===!0,eligible:c?!1:a.status===Fi.PASS&&e.eligible!==!1})}function vy(e=[]){if(!Array.isArray(e))throw new TypeError("candidates must be an array");return Object.freeze(e.map(Sy).sort((t,n)=>t.id.localeCompare(n.id)))}function xy(e){return[...new Set(e.filter(Boolean).map(String))]}function Qr(e){return Array.isArray(e)?e.map(Qr):e&&typeof e=="object"?Object.fromEntries(Object.entries(e).filter(([,t])=>t!==void 0).map(([t,n])=>[t,Qr(n)])):e}function br(e,t,n="UNKNOWN"){return!e||typeof e!="object"?{evidence:n,observedAt:t}:Qr({...structuredClone(e),evidence:e.evidence||n,observedAt:e.observedAt||t})}function ZO(e,t){let n=String(t||"").toLowerCase();return!!(n&&[e?.address,e?.pair,e?.poolId].some(r=>String(r||"").toLowerCase()===n))}function e_(e,t){let n=e.poolId||e.poolAddress||null,r=[t.topPool,...t.pools?.pools||[]].filter(Boolean),o=n?r.find(s=>ZO(s,n)):t.topPool,i={address:e.poolAddress??null,poolId:e.poolId,poolKey:e.poolKey,quoteAsset:e.quoteAsset};return Qr({...o||{},...i})}function t_(e,t,n,r){let o=e.observedAt||r,i=e_(e,t),s=br(t.scannerRisk||t.risk,o),a=br(t.sellability,o,"UNAVAILABLE"),c=br(t.quote,o,"UNAVAILABLE"),l=c.evidence==="LIVE"?"PASS":"UNKNOWN";return Qr({chain:{id:e.chainId,...t.chain||{}},token:br({address:e.tokenAddress,...t.token||{}},o,"LIVE"),pool:br(i,o,"LIVE"),venue:br({...e.venue,supported:e.venue?.supported===!0,verified:e.venue?.verified===!0},o,"LIVE"),signal:br({kind:e.kind,source:"verified-factory",unsolicitedAirdrop:!1},o,"LIVE"),risk:s,sellability:a,sellSimulation:br(t.sellSimulation,o,"UNAVAILABLE"),quoteAsset:e.quoteAsset||i.quoteAsset||null,roundTripLossBps:t.roundTripLossBps??null,quoteAmountIn:c.amountIn??null,quoteSlippageBps:t.quoteSlippageBps??null,quoteAssetDecimals:t.quoteAssetDecimals??null,route:Qr({status:l,amountOut:c.amountOut??null,cost:c.fee==null?{status:"UNKNOWN",amount:null,unit:null}:{status:"KNOWN",amount:String(c.fee),unit:c.feeUnit||"wei"},routeEvidence:c.routeEvidence,evidence:c.evidence,observedAt:c.observedAt}),prepared:{status:"NOT_PREPARED",unsigned:!0},whyBlocked:xy([...n||[],...t.blockedReasons||[],t.error]),latency:{discoveredAt:o,riskCompletedAt:s.observedAt,sellabilityCompletedAt:a.observedAt,routeCompletedAt:c.observedAt,normalizedAt:r}})}async function Iy(e={}){let t=e.discover||e.discoveryFn,n=e.evaluator||e.evaluate;if(typeof t!="function")throw new TypeError("service requires an injected discovery function");if(typeof n!="function")throw new TypeError("service requires an injected evaluator function");let r=await t(e.discovery||e.discoveryOptions||{}),o=Array.isArray(r?.discoveries)?r.discoveries:[],i=e.observedAt||o[0]?.observedAt||new Date(0).toISOString(),s=[];for(let a of o){if(a?.signal?.unsolicitedAirdrop===!0||a?.unsolicitedAirdrop===!0||a?.kind==="wallet-transfer")continue;let c;try{c=await n({chainId:a.chainId,tokenAddress:a.tokenAddress,discovery:Qr(structuredClone(a)),prepare:e.prepare===!0})}catch(l){c={error:`evaluation unavailable: ${String(l?.message||l).slice(0,300)}`}}s.push(t_(a,c||{},r?.status==="LIVE"?[]:r?.whyBlocked,i))}return Object.freeze({status:r?.status||"UNKNOWN",cursor:r?.cursor||null,unavailable:Object.freeze([...r?.unavailable||[]]),whyBlocked:Object.freeze(xy(r?.whyBlocked||[])),candidates:vy(s)})}var $o=Object.freeze({OK:"ok",DEGRADED:"degraded",UNKNOWN:"unknown"}),ky=Object.freeze({fresh:0,stale:1,down:2});function n_(e,t,n=.5){return Number.isFinite(t)?e==null||!Number.isFinite(e)?t:n*t+(1-n)*e:e??null}function r_(e,t=Math.random){let n=Math.min(1e3,50*2**Math.max(0,e-1)),r=t()*n*.5;return Math.round(n+r)}function o_(e){if(!e||typeof e!="object")return{ok:!1,reason:"malformed probe response: not an object"};let{blockNumber:t,chainId:n,timestampMs:r}=e;return!Number.isInteger(t)||t<0?{ok:!1,reason:"malformed probe response: blockNumber must be a non-negative integer"}:n!=null&&(!Number.isFinite(n)||n<=0)?{ok:!1,reason:"malformed probe response: chainId must be a positive number"}:r!=null&&(!Number.isFinite(r)||r<0)?{ok:!1,reason:"malformed probe response: timestampMs must be a non-negative number"}:{ok:!0}}function i_(e,t,n){let r=n(t).then(()=>{throw new Error(`rpc-health: probe timeout after ${t}ms`)});return r.catch(()=>{}),Promise.race([e,r])}async function s_(e,t){let{probe:n,clock:r,sleep:o,rng:i,timeoutMs:s,maxRetries:a,backoff:c,latencyAlpha:l,previousLatencyEwmaMs:u,previousErrorRate:d,previousSamples:p}=t,f=1+a,m=0,h=0,y=u??null,g=null,E=null;for(let k=1;k<=f;k++){m=k;let A=r.now();try{let w=await i_(n(e,{attempt:k,timeoutMs:s}),s,o),b=r.now()-A,x=o_(w);if(!x.ok)h+=1,g=x.reason;else{y=n_(y,b,l),E={blockNumber:w.blockNumber,chainId:w.chainId??null,timestampMs:w.timestampMs??null,latencyMs:b};break}}catch(w){h+=1,g=w?.message||String(w)}if(k<f){let w=c(k,i);await o(w)}}let v=(p??0)+m,S=d!=null&&p?d*p:0,I=v>0?(S+h)/v:0;return{id:e.id,endpoint:e,ok:E!=null,attempts:m,failures:h,errorRate:I,latencyEwmaMs:E?y:u??null,latencyMs:E?E.latencyMs:null,blockNumber:E?E.blockNumber:null,chainId:E?E.chainId:null,timestampMs:E?E.timestampMs:null,lastError:E?null:g,sampleCount:v}}async function a_(e,t,n){let r=new Array(e.length),o=0;async function i(){for(;o<e.length;){let a=o++;r[a]=await n(e[a],a)}}let s=Math.max(1,Math.min(t,e.length));return await Promise.all(Array.from({length:s},()=>i())),r}function c_(e,{networkHeadBlock:t,maxHeadLagBlocks:n,maxHeadAgeMs:r,now:o}){if(!e.ok)return"down";let i=t!=null&&e.blockNumber!=null?t-e.blockNumber:null,s=i!=null&&i>n,a=e.timestampMs!=null&&o-e.timestampMs>r;return s||a?"stale":"fresh"}function l_(e,t){let n=ky[e.tier]-ky[t.tier];if(n!==0)return n;let r=e.errorRate-t.errorRate;if(r!==0)return r;let o=e.headLagBlocks??1/0,i=t.headLagBlocks??1/0;if(o!==i)return o-i;let s=e.latencyEwmaMs??1/0,a=t.latencyEwmaMs??1/0;return s!==a?s-a:e.id<t.id?-1:e.id>t.id?1:0}async function Oy(e,t={}){if(!Array.isArray(e)||e.length===0)throw new Error("rankRpcEndpoints requires a non-empty array of endpoints");let{probe:n,clock:r={now:()=>Date.now()},sleep:o=b=>new Promise(x=>setTimeout(x,b)),rng:i=Math.random,timeoutMs:s=2e3,retries:a=3,concurrency:c=4,backoff:l=r_,maxHeadLagBlocks:u=3,maxHeadAgeMs:d=6e4,latencyAlpha:p=.5,previousStats:f={}}=t;if(typeof n!="function")throw new Error("rankRpcEndpoints requires an injected probe(endpoint, ctx) function");let m=new Set;for(let b of e){if(!b||typeof b.id!="string"||!b.id)throw new Error("each RPC endpoint requires a stable string id");if(m.has(b.id))throw new Error(`duplicate RPC endpoint id: ${b.id}`);m.add(b.id)}let h=Math.min(Math.max(0,a),3),y=await a_(e,c,b=>s_(b,{probe:n,clock:r,sleep:o,rng:i,timeoutMs:s,maxRetries:h,backoff:l,latencyAlpha:p,previousLatencyEwmaMs:f[b.id]?.latencyEwmaMs??null,previousErrorRate:f[b.id]?.errorRate??null,previousSamples:f[b.id]?.sampleCount??0})),g=y.reduce((b,x)=>x.ok&&x.blockNumber!=null&&(b==null||x.blockNumber>b)?x.blockNumber:b,null),E=r.now(),S=[...y.map(b=>{let x=c_(b,{networkHeadBlock:g,maxHeadLagBlocks:u,maxHeadAgeMs:d,now:E}),C=b.ok&&g!=null&&b.blockNumber!=null?g-b.blockNumber:null;return{...b,tier:x,headLagBlocks:C,costUnknown:!b.ok}})].sort(l_),I=S.every(b=>b.tier==="down"),k=I?null:S[0],A=I?null:S[1]??null;return{status:I?$o.UNKNOWN:S.some(b=>b.tier!=="fresh")?$o.DEGRADED:$o.OK,networkHeadBlock:g,results:S,primary:k,backup:A,allDown:I}}import{createHash as u_}from"node:crypto";var wr=Object.freeze({SHADOW:"shadow",ARMED:"armed",AUTONOMOUS:"autonomous"}),d_=3,p_=new Set(Object.values(wr));function Ou(e){if(e&&typeof e=="object"&&!Object.isFrozen(e)){for(let t of Object.values(e))Ou(t);Object.freeze(e)}return e}function ku(e){return Array.isArray(e)?`[${e.map(ku).join(",")}]`:e&&typeof e=="object"?`{${Object.keys(e).filter(t=>e[t]!==void 0).sort().map(t=>`${JSON.stringify(t)}:${ku(e[t])}`).join(",")}}`:JSON.stringify(e)}function f_(e){return`sha256:${u_("sha256").update(ku(e)).digest("hex")}`}function xu(e,t,n){if(!Array.isArray(e)||e.length===0)throw new TypeError(`${t} must be a non-empty exact allowlist`);let r=e.map(o=>n(o,t));if(new Set(r).size!==r.length)throw new TypeError(`${t} contains a duplicate entry`);return r.sort((o,i)=>typeof o=="number"?o-i:o.localeCompare(i))}function m_(e,t){if(!Number.isSafeInteger(e)||e<=0)throw new TypeError(`${t} entries must be positive safe integers`);return e}function Iu(e,t){if(typeof e!="string"||e.trim()!==e||e.length===0)throw new TypeError(`${t} entries must be non-empty exact strings`);return e}function Do(e,t,{positive:n=!1}={}){let r=typeof e=="number"?String(e):e;if(typeof r!="string"||!/^(?:0|[1-9]\d*)(?:\.\d+)?$/.test(r))throw new TypeError(`${t} must be a finite non-negative decimal`);if(n&&/^0(?:\.0+)?$/.test(r))throw new TypeError(`${t} must be greater than zero`);return r}function ji(e,t,{min:n=0,max:r=Number.MAX_SAFE_INTEGER}={}){if(!Number.isSafeInteger(e)||e<n||e>r)throw new TypeError(`${t} must be an integer from ${n} through ${r}`);return e}function Ua(e,t){let n=Do(e,t),[r,o=""]=n.split(".");return{digits:BigInt(r+o),scale:o.length}}function Da(e,t,n="value"){let r=Ua(e,n),o=Ua(t,"strategy cap"),i=Math.max(r.scale,o.scale),s=r.digits*10n**BigInt(i-r.scale),a=o.digits*10n**BigInt(i-o.scale);return s<a?-1:s>a?1:0}function _y(e){let t=structuredClone(e);return delete t.digest,t}function h_(e){if(!e||typeof e!="object"||Array.isArray(e))throw new TypeError("strategy must be an object");return f_(_y(e))}function y_(e={}){if(!e||typeof e!="object"||Array.isArray(e))throw new TypeError("strategy must be an object");let t=e.mode??wr.SHADOW;if(!p_.has(t))throw new TypeError("mode must be shadow, armed, or autonomous");let n={version:1,mode:t,chains:xu(e.chains,"chains",m_),venues:xu(e.venues,"venues",Iu),quoteAssets:xu(e.quoteAssets,"quoteAssets",Iu),maxSpendPerTrade:Do(e.maxSpendPerTrade,"maxSpendPerTrade",{positive:!0}),maxSpendPerDay:Do(e.maxSpendPerDay,"maxSpendPerDay",{positive:!0}),minLiquidityUsd:Do(e.minLiquidityUsd,"minLiquidityUsd",{positive:!0}),maxSlippageBps:ji(e.maxSlippageBps,"maxSlippageBps",{max:1e4}),maxGas:Do(e.maxGas,"maxGas",{positive:!0}),maxPriorityFee:Do(e.maxPriorityFee,"maxPriorityFee"),maxBuysPerHour:ji(e.maxBuysPerHour,"maxBuysPerHour",{min:1}),retryCeiling:ji(e.retryCeiling,"retryCeiling",{max:d_}),ttlMs:ji(e.ttlMs,"ttlMs",{min:1}),requireSellSimulation:e.requireSellSimulation,requireRiskPass:e.requireRiskPass??!0,maxRoundTripLossBps:ji(e.maxRoundTripLossBps??1500,"maxRoundTripLossBps",{max:1e4}),killSwitch:e.killSwitch,recipient:e.recipient==null||e.recipient===""?null:Iu(e.recipient,"recipient")};if(n.requireSellSimulation!==!0)throw new TypeError("requireSellSimulation must be true");if(n.requireRiskPass!==!0)throw new TypeError("requireRiskPass must be true");if(typeof n.killSwitch!="boolean")throw new TypeError("killSwitch must be boolean");if(n.mode!==wr.SHADOW&&!n.recipient)throw new TypeError("recipient is required when mode is armed or autonomous");if(Da(n.maxSpendPerTrade,n.maxSpendPerDay)>0)throw new TypeError("maxSpendPerTrade cannot exceed maxSpendPerDay");return n.digest=h_(n),Ou(n)}var g_=Object.freeze([["localSignerReady","local signer is not ready"],["dedicatedWallet","dedicated non-main wallet evidence is missing"],["exactStrategyBinding","exact strategy digest/grant binding is missing"],["trustedOneUseTrigger","fresh trusted one-use trigger attestation is missing"],["durableReceipts","durable receipts evidence is missing"],["balanceReconciliation","balance reconciliation evidence is missing"]]);function $e(e,t,n){t&&e.push(n)}function Ty(e,t={},n={}){let r=y_(_y(e)),o=[];$e(o,r.killSwitch,"kill switch is engaged"),$e(o,!r.chains.includes(t.chain),"chain is not on the exact allowlist"),$e(o,!r.venues.includes(t.venue),"venue is not on the exact allowlist"),$e(o,!r.quoteAssets.includes(t.quoteAsset),"quote asset is not on the exact allowlist");let i=(a,c,l)=>{try{$e(o,Da(a,c,l)>0,`${l} exceeds cap`)}catch{o.push(`${l} evidence is missing or unknown`)}};i(t.spend,r.maxSpendPerTrade,"per-trade spend");try{let a=Ua(t.spentToday,"daily spend"),c=Ua(t.spend,"per-trade spend"),l=Math.max(a.scale,c.scale),u=a.digits*10n**BigInt(l-a.scale)+c.digits*10n**BigInt(l-c.scale),d=l===0?String(u):`${String(u).padStart(l+1,"0").slice(0,-l)}.${String(u).padStart(l+1,"0").slice(-l)}`;$e(o,Da(d,r.maxSpendPerDay,"daily spend")>0,"daily spend cap would be exceeded")}catch{o.push("daily spend evidence is missing or unknown")}try{$e(o,Da(t.liquidityUsd,r.minLiquidityUsd,"liquidity")<0,"minimum real liquidity is not met")}catch{o.push("liquidity evidence is missing or unknown")}i(t.slippageBps,String(r.maxSlippageBps),"slippage"),i(t.gas,r.maxGas,"gas"),i(t.priorityFee,r.maxPriorityFee,"priority fee"),$e(o,!Number.isSafeInteger(t.buysLastHour),"buys per hour evidence is missing or unknown"),$e(o,Number.isSafeInteger(t.buysLastHour)&&t.buysLastHour>=r.maxBuysPerHour,"buys per hour cap is reached"),$e(o,!Number.isSafeInteger(t.retries)||t.retries<0,"retry evidence is missing or unknown"),$e(o,Number.isSafeInteger(t.retries)&&t.retries>r.retryCeiling,"retry ceiling is exceeded"),$e(o,!Number.isFinite(t.ageMs)||t.ageMs<0,"TTL evidence is missing or unknown"),$e(o,Number.isFinite(t.ageMs)&&t.ageMs>=r.ttlMs,"TTL has expired"),$e(o,t.sellSimulation?.verdict!=="PASS"||t.sellSimulation?.evidence!=="LIVE","mandatory sell simulation has no LIVE PASS evidence"),$e(o,typeof t.fireId!="string"||t.fireId.length===0,"fire id evidence is missing or unknown"),$e(o,!Array.isArray(t.firedIds),"duplicate-fire history is missing or unknown"),$e(o,Array.isArray(t.firedIds)&&t.firedIds.includes(t.fireId),"duplicate fire is blocked");let s=[...o];$e(s,n?.ORACLE_AUTONOMOUS_TRADING!=="1","ORACLE_AUTONOMOUS_TRADING=1 is required literally");for(let[a,c]of g_)$e(s,t.autonomousGates?.[a]!==!0,c);return $e(s,r.mode!==wr.AUTONOMOUS,"strategy mode is not autonomous"),Ou({strategyDigest:r.digest,mode:r.mode,policyEligible:o.length===0,blockers:o,autonomousEligible:s.length===0,autonomousBlockers:s,reportOnly:!0})}var Sn="oracle.launch-radar.data-plane.v1",E_=200,A_=500,S_=100,v_=500;function Hi(e){return String(e?.message||e||"unknown error").slice(0,300)}function x_(e={}){return e.configDir||process.env.ORACLE_CONFIG_DIR||Ny.join(w_.homedir(),".config","oracle")}function I_(e={}){return e.storePath||process.env.LAUNCH_RADAR_STORE_PATH||Ny.join(x_(e),"launch-radar","state.json")}function _u(e,t,n){return Number.isSafeInteger(e)&&e>0?Math.min(e,n):t}function Cy(e={}){let t=I_(e);try{return{ok:!0,path:t,state:gy({path:t})}}catch(n){return{ok:!1,path:t,error:Hi(n)}}}function Ry(){return process.env.ORACLE_AUTONOMOUS_TRADING==="1"}function Py(){return Object.freeze({schema:Sn,evidence:"LIVE",mode:wr.SHADOW,executionReady:!1,signingReady:!1,broadcastReady:!1,funded:!1,autonomousTradingEnvSet:Ry()})}function Ly(e={},t={}){let n=Cy(t),r={schema:Sn,storePath:n.path,executionReady:!1,signingReady:!1,broadcastReady:!1,requiresUserSignature:!0,autonomousTradingEnvSet:Ry()};if(!n.ok)return Object.freeze({...r,evidence:"UNAVAILABLE",reason:n.error,mode:wr.SHADOW,status:"unavailable",ambiguous:null,candidateCount:null,cursor:null,evidenceCount:null,lastEvidenceAt:null});let{state:o}=n,i=o.evidence.at(-1)||null;return Object.freeze({...r,evidence:"LIVE",reason:o.strategyStatus.reason??null,mode:o.strategyStatus.mode,status:o.strategyStatus.status,ambiguous:o.strategyStatus.ambiguous,candidateCount:o.candidates.length,cursor:o.cursor,evidenceCount:o.evidence.length,lastEvidenceAt:i?i.at:null})}function $y(e={},t={}){let n=Cy(t);if(!n.ok)return Object.freeze({schema:Sn,evidence:"UNAVAILABLE",reason:n.error,storePath:n.path,strategyStatus:null,cursor:null,candidates:[],evidenceRecords:[]});let{state:r}=n,o=_u(e.limit,E_,A_),i=_u(e.evidenceLimit,S_,v_);return Object.freeze({schema:Sn,evidence:"LIVE",storePath:n.path,strategyStatus:structuredClone(r.strategyStatus),cursor:structuredClone(r.cursor),candidateCount:r.candidates.length,candidates:structuredClone(r.candidates.slice(0,o)),evidenceCount:r.evidence.length,evidenceRecords:structuredClone(r.evidence.slice(-i))})}async function Dy(e={}){let t=Array.isArray(e.discoveries)?e.discoveries:[],n=Array.isArray(e.evaluations)?e.evaluations:[],r=Array.isArray(e.whyBlocked)?e.whyBlocked:[],o=typeof e.status=="string"&&e.status?e.status:t.length?"LIVE":"UNKNOWN",i=async()=>({status:o,cursor:e.cursor??null,discoveries:t,whyBlocked:r,unavailable:[]}),s=async({chainId:a,tokenAddress:c})=>{let l=n.find(u=>u?.chainId===a&&String(u?.tokenAddress||"").toLowerCase()===String(c||"").toLowerCase());return l?l.evaluation&&typeof l.evaluation=="object"?l.evaluation:l:{}};try{let a=await Iy({discover:i,evaluator:s,observedAt:e.observedAt}),c=a.status==="LIVE"?"LIVE":a.status==="UNAVAILABLE"?"UNAVAILABLE":"UNKNOWN";return{schema:Sn,evidence:c,...a}}catch(a){return{schema:Sn,evidence:"UNAVAILABLE",reason:Hi(a),status:"UNKNOWN",cursor:null,unavailable:[],whyBlocked:[Hi(a)],candidates:[]}}}async function Uy(e={}){let t=Array.isArray(e.endpoints)?e.endpoints:[],n={schema:Sn,evidence:"UNAVAILABLE",status:$o.UNKNOWN,networkHeadBlock:null,results:[],primary:null,backup:null,allDown:!0};if(t.length===0)return{...n,reason:"no endpoints supplied"};let r=e.samples&&typeof e.samples=="object"&&!Array.isArray(e.samples)?e.samples:{},o=async s=>{let a=r[s.id];if(!a||a.ok===!1)throw new Error(a?.error||`no probe sample supplied for endpoint "${s.id}"`);return a},i=_u(e.retries,0,3);try{let s=await Oy(t,{probe:o,retries:i,concurrency:e.concurrency,maxHeadLagBlocks:e.maxHeadLagBlocks,maxHeadAgeMs:e.maxHeadAgeMs}),a=s.allDown?"UNAVAILABLE":s.status===$o.OK?"LIVE":"STALE";return{schema:Sn,evidence:a,...s}}catch(s){return{...n,reason:Hi(s)}}}function By(e={}){try{let t=Ty(e.strategy,e.observation,{});return{schema:Sn,evidence:"LIVE",...t,autonomousEligible:!1,autonomousBlockers:[...new Set([...t.autonomousBlockers||[],"Launch Radar autonomous execution is not released"])],reportOnly:!0}}catch(t){let n=Hi(t);return{schema:Sn,evidence:"UNAVAILABLE",reason:n,mode:wr.SHADOW,policyEligible:!1,blockers:[n],autonomousEligible:!1,autonomousBlockers:[n],reportOnly:!0}}}import{types as Pb}from"node:util";import{createHash as Pu}from"node:crypto";import{types as Wi}from"node:util";var O_=Object.freeze([/(?:^|\s)Bearer\s+\S+/i,/-----BEGIN [A-Z ]*PRIVATE KEY-----/i,/\b(?:sk-|xprv|gh[pousr]_|github_pat_|AKIA|ASIA)[A-Za-z0-9_/-]{12,}\b/i,/\beyJ[A-Za-z0-9_-]{8,}\.[A-Za-z0-9_-]{8,}\.[A-Za-z0-9_-]{8,}\b/,/\b(?:0x)?[0-9a-f]{64}\b/i,/(?<![1-9A-HJ-NP-Za-km-z])[59KLc][1-9A-HJ-NP-Za-km-z]{50,51}(?![1-9A-HJ-NP-Za-km-z])/,/(?<![1-9A-HJ-NP-Za-km-z])[1-9A-HJ-NP-Za-km-z]{64,88}(?![1-9A-HJ-NP-Za-km-z])/]),__=new Set(["apikey","key","token","accesstoken","secret","password","passwd","auth","authorization","bearer","signertoken","credential","credentials","clientsecret","privatekey","xapikey","accesskey","refreshtoken"]),T_=Object.freeze(["apikey","accesskey","privatekey","clientsecret","accesstoken","refreshtoken","signertoken","credential","password","passwd","authorization","bearer","secret","token"]);function N_(e){return String(e??"").replace(/[^a-z0-9]/gi,"").toLowerCase()}function C_(e){let t;try{t=new URL(e)}catch{return!1}if(t.username||t.password)return!0;for(let n of t.searchParams.keys()){let r=N_(n);if(__.has(r)||T_.some(o=>r.includes(o)))return!0}return!1}function qy(e){try{let t=decodeURIComponent(e);return t===e?null:t}catch{return null}}var R_=/[a-z][a-z0-9+.-]{1,15}(?::\/\/|%3a%2f%2f)\S+/gi;function P_(e){return e.replace(/[),.;:!?'"\]}]+$/,"")}function L_(e){let t=e.match(R_)||[];for(let n of t){let r=P_(n),o=qy(r),i=o?qy(o):null;for(let s of[r,o,i])if(s&&C_(s))return!0}return!1}var $_=Object.freeze([Object.freeze([120,112,114,118]),Object.freeze([115,107,45]),Object.freeze([103,104,112,95]),Object.freeze([103,104,111,95]),Object.freeze([103,104,117,95]),Object.freeze([103,104,115,95]),Object.freeze([103,104,114,95]),Object.freeze([103,105,116,104,117,98,95,112,97,116,95]),Object.freeze([97,107,105,97]),Object.freeze([97,115,105,97])]);function Er(e){return typeof e=="string"&&/^(?:xprv|sk[-+]|gh[pousr][_/]|github[_/]pat[_/]|AKIA|ASIA)/iu.test(e)}function Ar(e){if(!ArrayBuffer.isView(e)||e.BYTES_PER_ELEMENT!==1)return!1;for(let t of $_){if(e.byteLength<t.length)continue;let n=!0;for(let r=0;r<t.length;r+=1){let o=e[r];if((o>=65&&o<=90?o+32:o)!==t[r]){n=!1;break}}if(n)return!0}return!1}function _e(e){return typeof e!="string"||e.length===0?!1:O_.some(t=>t.test(e))?!0:L_(e)}Y();sn();import{createHash as jy}from"node:crypto";var Tu="https://blockstream.info/liquid/api";function U_(e={}){return String(e.baseUrl||process.env.LIQUID_ESPLORA_URL||Tu).replace(/\/$/,"")}var B_="123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz";function q_(e){let t=0n;for(let i of e){let s=B_.indexOf(i);if(s<0)return null;t=t*58n+BigInt(s)}let n=t.toString(16);n.length%2&&(n=`0${n}`);let r=t===0n?Buffer.alloc(0):Buffer.from(n,"hex"),o=e.length-e.replace(/^1+/u,"").length;return Buffer.concat([Buffer.alloc(o),r])}function M_(e){if(!e||e.length<5)return!1;let t=e.subarray(0,-4);return jy("sha256").update(jy("sha256").update(t).digest()).digest().subarray(0,4).equals(e.subarray(-4))}var F_="qpzry9x8gf2tvdw0s3jn54khce6mua7l",Hy=[0x7d52fba40bd886n,0x5e8dbf1a03950cn,0x1c3a3c74072a18n,0x385d72fa0e5139n,0x7093e5a608865bn];function j_(e){let t=1n;for(let n of e){let r=t>>55n;t=(t&0x7fffffffffffffn)<<5n^BigInt(n);for(let o=0;o<Hy.length;o+=1)r>>BigInt(o)&1n&&(t^=Hy[o])}return t}function H_(e){let t=0,n=0,r=[];for(let o of e)for(t=t<<5|o,n+=5;n>=8;)n-=8,r.push(t>>n&255);return n>=5||(t<<8-n&255)!==0?null:r}function Ba(e){let t=String(e??"").trim();if(t!==t.toLowerCase()&&t!==t.toUpperCase())return!1;let n=t.toLowerCase(),r=n.lastIndexOf("1");if(r<1||r+13>=n.length)return!1;let o=n.slice(0,r);if(!["lq","tlq","el"].includes(o))return!1;let i=[];for(let d of n.slice(r+1)){let p=F_.indexOf(d);if(p<0)return!1;i.push(p)}let s=[...o].map(d=>d.charCodeAt(0)>>5).concat([0],[...o].map(d=>d.charCodeAt(0)&31),i),a=i[0],c=a===0?1n:0x455972a3350f7a1n;if(a>16||j_(s)!==c)return!1;let l=H_(i.slice(1,-12));if(!l||l.length<35||l.length>73||![2,3].includes(l[0]))return!1;let u=l.length-33;return u>=2&&u<=40&&(a!==0||[20,32].includes(u))}function zi(e){let t=String(e??"").trim();if(Ba(t))return!0;if(!/^V[a-km-zA-HJ-NP-Z1-9]{70,90}$/u.test(t))return!1;let n=q_(t);return!!(n&&n.length===59&&M_(n)&&n[0]===12&&[39,57].includes(n[1])&&[2,3].includes(n[2]))}function z_(e,t="address"){let n=String(e||"").trim(),o=(n===n.toLowerCase()||n===n.toUpperCase())&&/^(?:ex1|tex1)[a-z0-9]{20,200}$/i.test(n)||Ba(n),i=/^[PQGH][a-km-zA-HJ-NP-Z1-9]{25,40}$/.test(n)||zi(n);if(!o&&!i)throw new Error(`liquid-esplora: ${t} must look like a Liquid address (P/Q P2PKH, G/H P2SH, ex1\u2026, lq1\u2026)`);return o?n.toLowerCase():n}async function V_(e,t={}){return Te(await R(`${U_(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3,maxResponseBytes:t.maxResponseBytes,sameOriginRedirectsOnly:t.sameOriginRedirectsOnly}),"liquid-esplora response")}async function zy(e={},t={}){let n=z_(e.address||e.addr,"address"),r=await V_(`/address/${n}`,t);if(!r||typeof r!="object"||Array.isArray(r)||!r.chain_stats||typeof r.chain_stats!="object"||Array.isArray(r.chain_stats)||!r.mempool_stats||typeof r.mempool_stats!="object"||Array.isArray(r.mempool_stats)||!Number.isFinite(Number(r.chain_stats.tx_count))||!Number.isFinite(Number(r.mempool_stats.tx_count)))throw new Error("liquid-esplora: address info returned an invalid response");let o=r.chain_stats,i=r.mempool_stats,s=h=>{if(Number.isSafeInteger(h)&&h>=0)return h;if(typeof h!="string"||!/^\d+$/u.test(h))return null;let y=Number(h);return Number.isSafeInteger(y)&&y>=0?y:null},a=s(o.tx_count),c=s(i.tx_count);if(a==null||c==null)throw new Error("liquid-esplora: address info returned invalid transaction counts");let l=a+c;if(!Number.isSafeInteger(l))throw new Error("liquid-esplora: address info returned invalid transaction counts");let u=[o.funded_txo_sum,o.spent_txo_sum,i.funded_txo_sum,i.spent_txo_sum],d=u.some(h=>h!=null),p=d?u.map(s):[];if(d&&p.some(h=>h==null))throw new Error("liquid-esplora: address info returned invalid amount sums");let f=d?p[0]+p[2]:null,m=d?p[1]+p[3]:null;if(d&&(!Number.isSafeInteger(f)||!Number.isSafeInteger(m)||m>f))throw new Error("liquid-esplora: address info returned invalid amount sums");return{provider:"liquid-esplora",address:n,txCount:l,balanceSats:d?String(f-m):null,confidential:zi(n),note:d?void 0:zi(n)?"Liquid amounts are blinded; unblind locally with the wallet's blinding key.":"Liquid balance sums were unavailable from Esplora.",chainStats:o,mempoolStats:i,raw:r}}import{types as Jy}from"node:util";import{base58 as Vy}from"@scure/base";function Wy(e,t,n,r,o=!1){if(typeof e!="string"||e.length<t||e.length>n||!/^[1-9A-HJ-NP-Za-km-z]+$/u.test(e)||Er(e))return!1;try{let i=Vy.decode(e);return i.length===r&&(!o||!Ar(i))&&Vy.encode(i)===e}catch{return!1}}function qa(e){return Wy(e,32,44,32)}function Ma(e){return Wy(e,64,88,64,!0)}var Nu="oracle.investigator-cursor/1",W_=2*1024,G_=Object.freeze(["schemaVersion","family","chain","address","provider","payload"]),Gy=Object.freeze({evm:"blockscout",solana:"solana-rpc",bitcoin:"bitcoin-esplora",ton:"ton-public"}),K_=Object.freeze(["block_number","index"]),Cu=class extends Error{constructor(t){super(`onchain-investigator cursor: ${t}`),this.name="InvestigatorCursorError",this.code="invalid-cursor"}};function Y_(e){return e&&Object.hasOwn(e,"value")&&e.value===void 0&&e.enumerable===!1}function Xy(e,t=new Set){if(!e||typeof e!="object"||Object.isFrozen(e)||t.has(e))return e;t.add(e);for(let n of Reflect.ownKeys(e)){let r=Object.getOwnPropertyDescriptor(e,n);r&&Object.hasOwn(r,"value")&&Xy(r.value,t)}return Object.hasOwn(e,"toJSON")||Object.defineProperty(e,"toJSON",{value:void 0,enumerable:!1}),Object.freeze(e),e}function ce(e){throw new Cu(e)}function Qy(e,t){return(!e||typeof e!="object"||Jy.isProxy(e)||Array.isArray(e)||Object.getPrototypeOf(e)!==Object.prototype)&&ce(`${t} must be a plain object`),e}function Fa(e,t,n){Qy(e,n);let r=new Set(t);Object.getOwnPropertySymbols(e).length>0&&ce(`${n} fields are invalid`);let o=Object.getOwnPropertyNames(e).filter(s=>{if(s!=="toJSON")return!0;let a=Object.getOwnPropertyDescriptor(e,s);return Y_(a)||ce(`${n}.toJSON is invalid`),!1}),i=t.filter(s=>!Object.hasOwn(e,s));(o.length!==t.length||o.some(s=>!r.has(s))||i.length)&&ce(`${n} fields are invalid`);for(let s of o){let a=Object.getOwnPropertyDescriptor(e,s);(!a||!a.enumerable||!Object.hasOwn(a,"value"))&&ce(`${n} fields must be enumerable own data`)}}function st(e,t,n){let r=e&&typeof e=="object"?Object.getOwnPropertyDescriptor(e,t):null;return(!r||!Object.hasOwn(r,"value"))&&ce(`${n} fields must be own data`),r.value}function Kn(e,t,n){return(typeof e!="string"||e.length===0||e.length>n||/[\u0000-\u001f\u007f]/u.test(e))&&ce(`${t} is invalid`),e}function Ky(e){if(Number.isSafeInteger(e)&&e>0)return e;let t=Kn(e,"chain",96);return(/:\/\//u.test(t)||/^[0-9a-f]{64}$/iu.test(t)||_e(t))&&ce("chain is invalid"),t}function J_(e){return e===e.toLowerCase()||e===e.toUpperCase()}function X_(e){let t=0;for(let n of e){t^=n<<8;for(let r=0;r<8;r+=1)t=t&32768?(t<<1^4129)&65535:t<<1&65535}return t}function Q_(e){if(/^(?:-1|0):[0-9a-fA-F]{64}$/u.test(e)){let[r,o]=e.split(":");return`${r}:${o.toLowerCase()}`}if(!/^[A-Za-z0-9_-]{48}$/u.test(e))return null;let t;try{t=Buffer.from(e.replace(/-/gu,"+").replace(/_/gu,"/"),"base64")}catch{return null}if(t.length!==36||(t[0]&128)!==0||![17,81].includes(t[0]))return null;let n=t[1]===0?"0":t[1]===255?"-1":null;return n===null||X_(t.subarray(0,34))!==(t[34]<<8|t[35])?null:`${n}:${Buffer.from(t.subarray(2,34)).toString("hex")}`}function Yy(e,t,n){let r=Kn(n,"address",256);if(e==="evm")return(!Number.isSafeInteger(t)||!/^0x[0-9a-f]{40}$/iu.test(r))&&ce("address is invalid for the cursor family"),r.toLowerCase();if(e==="solana")return(t!=="mainnet-beta"||!qa(r))&&ce("address is invalid for the cursor family"),r;if(e==="bitcoin"){let o=/^(?:bc1|tb1)[a-z0-9]{20,90}$/iu.test(r)&&J_(r),i=/^[13mn2][a-km-zA-HJ-NP-Z1-9]{25,34}$/u.test(r),s=t==="mainnet"?/^bc1/iu.test(r)||/^[13]/u.test(r):t==="testnet"&&(/^tb1/iu.test(r)||/^[mn2]/u.test(r));return(!o&&!i||!s)&&ce("address is invalid for the cursor family"),o?r.toLowerCase():r}if(e==="ton"){let o=t==="ton-mainnet"?Q_(r):null;return o||ce("address is invalid for the cursor family"),o}ce("family does not support cursors")}function Z_(e){Fa(e,K_,"EVM payload");let t=st(e,"block_number","cursor"),n=st(e,"index","cursor");return(!Number.isSafeInteger(t)||t<0||!Number.isSafeInteger(n)||n<0)&&ce("EVM payload values are invalid"),{block_number:t,index:n}}function eT(e){Fa(e,["lt","hash"],"TON payload");let t=Kn(st(e,"lt","cursor"),"TON payload.lt",40),n=Kn(st(e,"hash","cursor"),"TON payload.hash",128);(!/^\d+$/u.test(t)||!/^[A-Za-z0-9+/_-]{43}=?$/u.test(n)||Er(n))&&ce("TON payload is invalid");let r=Buffer.from(n.replace(/-/g,"+").replace(/_/g,"/"),"base64");(r.length!==32||Ar(r))&&ce("TON payload is invalid");let o=r.toString("base64");return{lt:t,hash:o}}function tT(e,t){if(e==="evm")return Z_(t);if(e==="ton")return eT(t);let n=Kn(t,"payload",256);return e==="bitcoin"&&!/^[0-9a-f]{64}$/iu.test(n)&&ce("Bitcoin payload must be a transaction id"),e==="solana"&&!Ma(n)&&ce("Solana payload must be a signature"),["bitcoin","solana"].includes(e)||ce(`${e} does not support cursors`),n}function nT(e){let t=r=>{if(r===null||typeof r=="boolean")return String(r);if(typeof r=="string")return JSON.stringify(r);if(typeof r=="number"&&Number.isFinite(r))return String(r);if((!r||typeof r!="object"||Jy.isProxy(r))&&ce("envelope is not own-data JSON"),Array.isArray(r)){let i=[];for(let s=0;s<r.length;s+=1){let a=Object.getOwnPropertyDescriptor(r,String(s));(!a||!Object.hasOwn(a,"value"))&&ce("envelope is not own-data JSON"),i.push(t(a.value))}return`[${i.join(",")}]`}let o=[];for(let i of Object.keys(r))o.push(`${JSON.stringify(i)}:${t(st(r,i,"envelope"))}`);return`{${o.join(",")}}`},n=t(e);Buffer.byteLength(n,"utf8")>W_&&ce("envelope exceeds the byte limit")}function qo(e,t={}){if(e==null)return null;Fa(e,G_,"envelope"),st(e,"schemaVersion","cursor")!==Nu&&ce("schemaVersion is unsupported");let n=Kn(st(e,"family","cursor"),"family",64).toLowerCase();(!/^[a-z][a-z0-9-]*$/u.test(n)||!Object.hasOwn(Gy,n)||/^[0-9a-f]{64}$/iu.test(n)||_e(n))&&ce("family is invalid");let r=Ky(st(e,"chain","cursor"));(n==="evm"&&!Number.isSafeInteger(r)||n==="solana"&&r!=="mainnet-beta"||n==="bitcoin"&&!["mainnet","testnet"].includes(r)||n==="ton"&&r!=="ton-mainnet")&&ce("chain is invalid for the cursor family");let o=Yy(n,r,st(e,"address","cursor")),i=Kn(st(e,"provider","cursor"),"provider",64);(!/^[a-z][a-z0-9-]*$/u.test(i)||i!==Gy[n]||_e(i))&&ce("provider is invalid"),Qy(t,"expected binding");let s=f=>Object.hasOwn(t,f)?st(t,f,"expected binding"):void 0,a=s("family")===void 0?void 0:Kn(s("family"),"expected family",64).toLowerCase(),c=s("chain")===void 0?void 0:Ky(s("chain")),l=s("address")===void 0?void 0:Yy(n,r,s("address")),u=s("provider")===void 0?void 0:Kn(s("provider"),"expected provider",64);a!==void 0&&n!==a&&ce("family binding does not match the request"),c!==void 0&&r!==c&&ce("chain binding does not match the request"),l!==void 0&&o!==l&&ce("address binding does not match the request"),u!==void 0&&i!==u&&ce("provider binding does not match the request");let d=tT(n,st(e,"payload","cursor")),p={schemaVersion:Nu,family:n,chain:r,address:o,provider:i,payload:d};return nT(p),Xy(p)}function Zy(e,t){return Fa(e,["family","chain","address","provider"],"binding"),qo({schemaVersion:Nu,family:st(e,"family","binding"),chain:st(e,"chain","binding"),address:st(e,"address","binding"),provider:st(e,"provider","binding"),payload:t},e)}function eo(e){if(!e||typeof e!="object"||Object.isFrozen(e))return e;for(let t of Object.values(e))eo(t);return Object.defineProperty(e,"toJSON",{value:void 0,enumerable:!1}),Object.freeze(e)}var Va="oracle.investigator-collection/1",rT=eo(["wallet","token","tx","launch"]),Gi=eo(["LIVE","INDEXED","DERIVED","UNKNOWN","UNAVAILABLE"]),oT=eo(["COMPLETE","PARTIAL","UNKNOWN"]),Wt=eo({maxDepth:3,maxNodes:250,maxEdges:1e3}),K4=eo({depth:2,nodes:100,edges:400});var De=eo({evidence:2e3,findings:250,gaps:250,dataArray:64,dataFields:32,dataDepth:5,dataNodes:262144,dataTotalFields:262144,string:512}),Y4=new Set(rT),J4=new Set(Gi),X4=new Set(oT);var iT=/^[A-Za-z][A-Za-z0-9_.-]{0,63}$/,rg=/^(?:ibc\/[0-9a-fA-F]{64}|(?:-1|0):[0-9a-fA-F]{64}|(?:0x)?[0-9a-fA-F]{64}|[1-9A-HJ-NP-Za-km-z]{64,128}|[A-Za-z0-9+/_=-]{43,128})$/,sT=new Set(["address","assetId","blockHash","blockId","coinType","denom","digest","evidenceHash","hash","ibcHash","inMessageDestinationAddress","inMessageSourceAddress","locator","signature","transactionHash","transactionId","txId","txid"]),aT=/^(?:xprv|sk-|gh[pousr]_|github_pat_|AKIA|ASIA)/i,cT=/^(?:request|evidence|entity|event|finding|gap)_[0-9a-f]{64}$/u,lT=new Set(["id","requestId","entityId","nodeId","fromEntityId","toEntityId"]),uT=new Set(["evidenceRefs","evidenceIds","nodeIds","edgeIds"]),dT=new Set(["auth","key","token","xapikey"]),pT=new Set(["feetoken","tokenaddress","tokenid","tokensymboluntrusted","tokentype"]),fT=Object.freeze(["authorization","apikey","accesskey","accesstoken","cookie","credential","password","passphrase","secret","privatekey","seed","mnemonic","keystore","bearer","refreshtoken","signer"]),Wa=32,eg=64,mT=5,hT=512,yT=262144,Lu=262144,og=524288,Ha=524288,Zr=class extends Error{constructor(t,n="invalid-investigation"){super(`onchain-investigator: ${t}`),this.name="InvestigatorError",this.code=n}};function z(e,t){throw new Zr(e,t)}function za(e,t){return(!e||typeof e!="object"||Wi.isProxy(e)||Array.isArray(e)||Object.getPrototypeOf(e)!==Object.prototype)&&z(`${t} must be a plain object`,"invalid-object"),e}function qu(e,t,n){za(e,n);let r=new Set(t);Object.getOwnPropertySymbols(e).length>0&&z(`${n} has unknown field(s)`,"unknown-field");let o=Object.getOwnPropertyNames(e).filter(i=>{let s=Object.getOwnPropertyDescriptor(e,i);return!(i==="toJSON"&&s&&Object.hasOwn(s,"value")&&s.value===void 0)});(o.length>r.size||o.some(i=>!r.has(i)))&&z(`${n} has unknown field(s)`,"unknown-field");for(let i of o){let s=Object.getOwnPropertyDescriptor(e,i);(!s||!s.enumerable||!Object.hasOwn(s,"value"))&&z(`${n}.${i} must be enumerable own data`,"invalid-component")}return e}function ig(e){if(!/^0x[0-9a-fA-F]{1,64}::[A-Za-z_][A-Za-z0-9_]*::[A-Za-z_][A-Za-z0-9_]*(?:<[^\u0000-\u001f\u007f]{1,160}>)?$/u.test(e))return!1;let t=e.replace(/0x[0-9a-fA-F]{1,64}/gu,"0x1");return!_e(t)}function gT(e){let t=0;for(let n of e){t^=n<<8;for(let r=0;r<8;r+=1)t=t&32768?(t<<1^4129)&65535:t<<1&65535}return t}function Mu(e){if(typeof e!="string")return null;if(/^(?:-1|0):[0-9a-fA-F]{64}$/u.test(e)){let[r,o]=e.split(":");return`${r}:${o.toLowerCase()}`}if(!/^[A-Za-z0-9_-]{48}$/u.test(e))return null;let t;try{t=Buffer.from(e.replace(/-/gu,"+").replace(/_/gu,"/"),"base64")}catch{return null}return t.length!==36||(t[0]&128)!==0||![17,81].includes(t[0])||![0,255].includes(t[1])||gT(t.subarray(0,34))!==(t[34]<<8|t[35])?null:`${t[1]===0?"0":"-1"}:${Buffer.from(t.subarray(2,34)).toString("hex")}`}function bT(e){return Mu(e)!==null}var wT="123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz";function ET(e){let t=0n;for(let o of e){let i=wT.indexOf(o);if(i<0)return null;t=t*58n+BigInt(i)}let n=t.toString(16);n.length%2&&(n=`0${n}`);let r=t===0n?Buffer.alloc(0):Buffer.from(n,"hex");return Buffer.concat([Buffer.alloc(e.length-e.replace(/^1+/u,"").length),r])}function AT(e){if(!/^V[a-km-zA-HJ-NP-Z1-9]{70,90}$/u.test(e))return!1;let t=ET(e);if(!t||t.length!==59||t[0]!==12||![39,57].includes(t[1])||![2,3].includes(t[2]))return!1;let n=t.subarray(0,-4);return Pu("sha256").update(Pu("sha256").update(n).digest()).digest().subarray(0,4).equals(t.subarray(-4))}function ST(e){return/^0x[0-9a-fA-F]{1,64}$/u.test(e)||/^(?:-1|0):[0-9a-fA-F]{64}$/u.test(e)||Ba(e)||/^[13mn2PQGH][a-km-zA-HJ-NP-Z1-9]{25,44}$/u.test(e)||AT(e)||/^T[1-9A-HJ-NP-Za-km-z]{33}$/u.test(e)||/^[1-9A-HJ-NP-Za-km-z]{32,44}$/u.test(e)||bT(e)}function vT(e,t){return["address","inMessageDestinationAddress","inMessageSourceAddress"].includes(t)?ST(e):t==="coinType"?ig(e):t==="denom"?/^ibc\/[0-9a-fA-F]{64}$/u.test(e):t==="ibcHash"||t==="assetId"?/^[0-9a-fA-F]{64}$/u.test(e):t==="digest"?/^sha256:[0-9a-f]{64}$/u.test(e):rg.test(e)}function $u(e,t,n){if(n>12&&z("value exceeds the freeze depth limit","data-limit"),t.nodes+=1,t.nodes>og&&z("value exceeds the freeze node limit","data-limit"),e===null||["string","number","boolean","undefined"].includes(typeof e))return e;(typeof e!="object"||Wi.isProxy(e))&&z("value is not freezeable own-data JSON","invalid-component"),t.active.has(e)&&z("value is cyclic","invalid-component"),Object.getOwnPropertySymbols(e).length>0&&z("value contains symbol fields","invalid-component"),t.active.add(e);try{if(Array.isArray(e)){for(let c of Object.getOwnPropertyNames(e))c!=="length"&&(c==="toJSON"&&Object.getOwnPropertyDescriptor(e,c)?.value===void 0||/^(?:0|[1-9]\d*)$/u.test(c)||z("array contains named or hidden fields","invalid-component"));t.fields+=e.length,t.fields>Ha&&z("value exceeds the freeze field limit","data-limit");let a=new Array(e.length);for(let c=0;c<e.length;c+=1){let l=Object.getOwnPropertyDescriptor(e,String(c));(!l||!Object.hasOwn(l,"value"))&&z("array must contain dense own data","invalid-component"),Object.defineProperty(a,String(c),{value:$u(l.value,t,n+1),enumerable:!0,configurable:!0,writable:!0})}return Object.defineProperty(a,"toJSON",{value:void 0,enumerable:!1}),Object.freeze(a)}let r=Object.getPrototypeOf(e);r!==Object.prototype&&r!==null&&z("value must be a plain object","invalid-component");let o=Object.getOwnPropertyNames(e);for(let a of o){let c=Object.getOwnPropertyDescriptor(e,a);a==="toJSON"&&c&&Object.hasOwn(c,"value")&&c.value===void 0||(!c||!c.enumerable||!Object.hasOwn(c,"value"))&&z(`${a} must be enumerable own data`,"invalid-component")}let i=Object.keys(e);t.fields+=i.length,t.fields>Ha&&z("value exceeds the freeze field limit","data-limit");let s=r===null?Object.create(null):{};for(let a of i){let c=Object.getOwnPropertyDescriptor(e,a);(!c||!Object.hasOwn(c,"value"))&&z(`${a} must be an own data field`,"invalid-component"),Object.defineProperty(s,a,{value:$u(c.value,t,n+1),enumerable:!0,configurable:!0,writable:!0})}return Object.defineProperty(s,"toJSON",{value:void 0,enumerable:!1}),Object.freeze(s)}finally{t.active.delete(e)}}function Rt(e){return $u(e,{nodes:0,fields:0,active:new Set},0)}function ge(e,t){if(!e||!Object.hasOwn(e,t))return;let n=Object.getOwnPropertyDescriptor(e,t);return(!n||!Object.hasOwn(n,"value"))&&z(`${t} must be an own data field`,"invalid-component"),n.value}function Du(e,t,n){let r=t.filter(o=>!Object.hasOwn(e,o));r.length>0&&z(`${n} is missing required field(s): ${r.join(", ")}`,"unknown-field")}function sg(e,t,{max:n=hT,allowPublicIdentifier:r=!1,publicIdentifierField:o=null,allowDeterministicRecordId:i=!1}={}){(typeof e!="string"||e.length===0||e.length>n||/[\x00-\x1f\x7f]/.test(e))&&z(`${t} must be a non-empty string no longer than ${n}`,"invalid-string");let s=(i&&cT.test(e)||r&&(rg.test(e)||ig(e))||o&&vT(e,o))&&!aT.test(e);return _e(e)&&!s&&z(`${t} contains secret-shaped material`,"secret-material"),e}function xT(e,t){(!iT.test(e)||/^[0-9a-f]{64}$/iu.test(e)||_e(e))&&z(`${t} key is invalid`,"invalid-key");let n=e.replace(/[^a-z0-9]/gi,"").toLowerCase(),r=["auth","session","token"].some(o=>n.includes(o))&&!pT.has(n);return(dT.has(n)||r||fT.some(o=>n.includes(o)))&&z(`${t} key is forbidden because it may carry a secret`,"secret-material"),e}function Ga(e,t,n,r="data-limit"){Wi.isProxy(e)&&z(`${t} must not be a proxy`,"invalid-component"),Array.isArray(e)||z(`${t} must be an array`,"invalid-component"),e.length>n&&z(`${t} exceeds the array limit`,r);let o=new Array(e.length);for(let i=0;i<e.length;i+=1){Object.hasOwn(e,i)||z(`${t} must contain dense own entries`,"invalid-component");let s=Object.getOwnPropertyDescriptor(e,String(i));(!s||!Object.hasOwn(s,"value"))&&z(`${t} entries must be own data`,"invalid-component"),o[i]=s.value}return o}function Uu(e,t){if(!Number.isInteger(t)||t<1||e.length<t)return;let n=Object.getOwnPropertyDescriptor(e,String(e.length-t));return n&&Object.hasOwn(n,"value")?n.value:void 0}function IT(e){let t=Uu(e,1);return typeof t=="string"&&sT.has(t)?t:e.length===2&&e[0]==="subject"&&e[1]==="identifier"?"identifier":e.length===2&&e[0]==="node"&&e[1]==="reference"?"reference":e.length===2&&e[0]==="evidence"&&e[1]==="subject"||e.length===3&&e[0]==="evidence"&&Number.isInteger(e[1])&&e[2]==="subject"?"subject":null}function kT(e){let t=Uu(e,1);return typeof t=="string"&&lT.has(t)?!0:Number.isInteger(t)&&uT.has(Uu(e,2))}function Vi(e,t,n,r,o){if(n>mT&&z(`${t} exceeds the nesting limit`,"data-limit"),r.nodes+=1,r.nodes>yT&&z(`${t} exceeds the cumulative node limit`,"data-limit"),typeof e=="string")return sg(e,t,{publicIdentifierField:IT(o),allowDeterministicRecordId:kT(o)});if(e===null||typeof e=="boolean"||typeof e=="number"&&Number.isFinite(e))return e;(!e||typeof e!="object"||Wi.isProxy(e))&&z(`${t} must be own-data JSON`,"invalid-component"),Object.getOwnPropertySymbols(e).length>0&&z(`${t} contains symbol fields`,"invalid-component"),r.active.has(e)&&z(`${t} must not be cyclic`,"invalid-component"),r.active.add(e);try{if(Array.isArray(e))return e.length>eg&&z(`${t} exceeds the array limit`,"data-limit"),r.fields+=e.length,r.fields>Lu&&z(`${t} exceeds the cumulative field limit`,"data-limit"),Ga(e,t,eg).map((a,c)=>Vi(a,`${t}[${c}]`,n+1,r,[...o,c]));za(e,t);let i=Object.keys(e);i.length>Wa&&z(`${t} exceeds the field limit`,"data-limit"),r.fields+=i.length,r.fields>Lu&&z(`${t} exceeds the cumulative field limit`,"data-limit"),i.sort();let s=[];for(let a of i){xT(a,t);let c=Object.getOwnPropertyDescriptor(e,a);(!c||!Object.hasOwn(c,"value"))&&z(`${t}.${a} must be an own data field`,"invalid-component"),s.push([a,Vi(c.value,`${t}.${a}`,n+1,r,[...o,a])])}return Object.fromEntries(s)}finally{r.active.delete(e)}}function Bu(e,t=null,n=0){let r=t??{nodes:0,fields:0,active:new Set};if(n>8&&z("value exceeds canonical JSON depth","invalid-json"),r.nodes+=1,r.nodes>og&&z("value exceeds canonical JSON node limit","invalid-json"),e&&(typeof e=="object"||typeof e=="function")&&Wi.isProxy(e)&&z("value is not canonical JSON","invalid-json"),e&&typeof e=="object"&&Object.getOwnPropertySymbols(e).length>0&&z("value contains symbol fields","invalid-json"),e&&typeof e=="object"){r.active.has(e)&&z("value is cyclic canonical JSON","invalid-json"),r.active.add(e);try{if(Array.isArray(e)){let c=Ga(e,"canonical value",De.evidence,"invalid-json");return r.fields+=c.length,r.fields>Ha&&z("value exceeds canonical JSON field limit","invalid-json"),`[${c.map(l=>Bu(l,r,n+1)).join(",")}]`}let i=Object.getPrototypeOf(e);i!==Object.prototype&&i!==null&&z("value is not canonical JSON","invalid-json");let s=Object.keys(e);return s.length>Wa&&z("value exceeds canonical JSON object field limit","invalid-json"),r.fields+=s.length,r.fields>Ha&&z("value exceeds canonical JSON field limit","invalid-json"),s.sort(),`{${s.map(c=>{let l=Object.getOwnPropertyDescriptor(e,c);return(!l||!Object.hasOwn(l,"value"))&&z("value is not canonical own-data JSON","invalid-json"),`${JSON.stringify(c)}:${Bu(l.value,r,n+1)}`}).join(",")}}`}finally{r.active.delete(e)}}(e===void 0||typeof e=="bigint"||typeof e=="function"||typeof e=="symbol"||typeof e=="number"&&!Number.isFinite(e))&&z("value is not canonical JSON","invalid-json");let o=JSON.stringify(e);return o===void 0&&z("value is not canonical JSON","invalid-json"),o}function Sr(e){return`sha256:${Pu("sha256").update(Bu(e)).digest("hex")}`}function vr(e,t){let n=sg(e,"id kind",{max:24});return/^[a-z][a-z0-9-]*$/.test(n)||z("id kind must be a lowercase slug","invalid-id"),`${n}_${Sr(t).slice(7)}`}function ja(e,t,n,r){let o=Ga(e,t,n,"component-limit");return r.fields+=o.length,r.fields>Lu&&z(`${t} exceeds the cumulative field limit`,"data-limit"),o.map((i,s)=>Vi(i,`${t}[${s}]`,0,r,[t,s]))}function Fu(e){let t=["subject","entities","events","evidence","coverage","gaps"];qu(e,t,"components"),Du(e,t,"components");let n={nodes:0,fields:0,active:new Set},r=Vi(ge(e,"subject"),"subject",0,n,["subject"]),o=ja(ge(e,"entities"),"entities",Wt.maxNodes,n),i=ja(ge(e,"events"),"events",Wt.maxEdges,n),s=ja(ge(e,"evidence"),"evidence",De.evidence,n),a=Vi(ge(e,"coverage"),"coverage",0,n,["coverage"]),c=ja(ge(e,"gaps"),"gaps",Wt.maxNodes,n);return Rt({subject:r,entities:o,events:i,evidence:s,coverage:a,gaps:c})}var tg=Object.freeze({OBSERVED:"INDEXED",ERROR:"UNKNOWN",UNAVAILABLE:"UNAVAILABLE",LIVE:"LIVE",INDEXED:"INDEXED",DERIVED:"DERIVED",UNKNOWN:"UNKNOWN"}),OT=new Set(["COMPLETE","PARTIAL","UNKNOWN","UNAVAILABLE"]);function _T(e,t,n){if(e===null)return null;if(qu(e,["requested","next"],"collector output.cursor"),(!Object.hasOwn(e,"requested")||!Object.hasOwn(e,"next"))&&z("collector output.cursor fields are invalid","invalid-cursor"),ge(e,"requested")===null&&ge(e,"next")===null)return{requested:null,next:null};(typeof n!="string"||n.length===0)&&z("collector cursor requires a source binding","invalid-cursor");let r={family:t.family,chain:t.chain,address:t.address,provider:n};try{return{requested:qo(ge(e,"requested"),r),next:qo(ge(e,"next"),r)}}catch{z("collector cursor binding or payload is invalid","invalid-cursor")}}function Ru(e,t){let n=new Set;for(let r of e)(!r||typeof r!="object"||!Object.hasOwn(r,"id")||typeof r.id!="string"||r.id.length===0)&&z(`collector ${t} record is missing an id`,"invalid-reference"),n.has(r.id)&&z(`collector ${t} ids must be unique`,"invalid-reference"),n.add(r.id);return n}function TT(e){let t=e.subject,n=typeof t.chain=="string"&&t.chain.length>0||Number.isSafeInteger(t.chain)&&t.chain>=0;(!Object.hasOwn(t,"family")||typeof t.family!="string"||t.family.length===0||!Object.hasOwn(t,"chain")||!n||!Object.hasOwn(t,"address")||typeof t.address!="string"||t.address.length===0)&&z("collector subject identity is invalid","invalid-reference");let r=e.coverage.source;(!Object.hasOwn(e.coverage,"source")||r!==null&&(typeof r!="string"||r.length===0)||e.coverage.collectorStatus!=="UNAVAILABLE"&&r===null)&&z("collector coverage source is invalid","invalid-reference");let o=Ru(e.entities,"entity");e.entities.some(s=>Object.hasOwn(s,"family")&&s.family===t.family&&Object.hasOwn(s,"chain")&&s.chain===t.chain&&Object.hasOwn(s,"address")&&s.address===t.address)||z("collector subject entity reference is missing","invalid-reference"),Ru(e.events,"event");let i=Ru(e.evidence,"evidence");for(let s of e.events){for(let a of["from","to"])(!Object.hasOwn(s,a)||s[a]!=null&&(typeof s[a]!="string"||!o.has(s[a])))&&z(`collector event ${a} reference is invalid`,"invalid-reference");(!Object.hasOwn(s,"evidenceRefs")||!Array.isArray(s.evidenceRefs)||s.evidenceRefs.some(a=>typeof a!="string"||!i.has(a))||new Set(s.evidenceRefs).size!==s.evidenceRefs.length)&&z("collector event evidence references are invalid","invalid-reference")}}function ng(e,t,n=Wa){let r=Object.keys(e);r.length>n&&z(`${t} exceeds the field limit`,"data-limit");let o=[];for(let i of r){let s=Object.getOwnPropertyDescriptor(e,i);(!s||!Object.hasOwn(s,"value"))&&z(`${t}.${i} must be an own data field`,"invalid-component"),o.push([i,s.value])}return Object.fromEntries(o)}function ju(e){let t=["schemaVersion","execution","status","subject","entities","events","evidence","coverage","gaps","cursor"];qu(e,t,"collector output"),Du(e,t,"collector output"),ge(e,"schemaVersion")!==Va&&z("collector output.schemaVersion is unsupported","invalid-schema-version"),ge(e,"execution")!=="read-only"&&ge(e,"execution")!=="READ_ONLY"&&z("collector output must be read-only","invalid-posture"),OT.has(ge(e,"status"))||z("collector output.status is invalid","invalid-status"),Array.isArray(ge(e,"evidence"))||z("collector output.evidence must be an array","invalid-component"),za(ge(e,"coverage"),"collector output.coverage");let n=Fu({subject:ge(e,"subject"),entities:ge(e,"entities"),events:ge(e,"events"),evidence:Ga(ge(e,"evidence"),"collector output.evidence",Wt.maxEdges,"component-limit").map(o=>{za(o,"collector evidence"),Du(o,["status"],"collector evidence");let i=ge(o,"status"),s=typeof i=="string"&&Object.hasOwn(tg,i)?tg[i]:null;return s||z("collector evidence status is invalid","invalid-status"),{...ng(o,"collector evidence"),status:s}}),coverage:{...ng(ge(e,"coverage"),"collector coverage",Wa-1),collectorStatus:ge(e,"status")},gaps:ge(e,"gaps")});TT(n);let r=_T(ge(e,"cursor"),n.subject,n.coverage.source);return Rt({...n,cursor:r})}import{types as rd}from"node:util";Y();sn();var Ka=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"}),Hu=Object.freeze(["block_number","index"]),ag=new Set([...Hu,"items_count","value","hash","inserted_at","fee"]);function Ki(e){return Number.isSafeInteger(e)&&e>=0}function xr(e,t,n,r=!1){let o=Object.getOwnPropertyDescriptor(e,t);if(!o){if(r)throw new Error(`${n} is missing a cursor field`);return}if(!o.enumerable||!Object.hasOwn(o,"value"))throw new Error(`${n} cursor fields must be enumerable own data`);return o.value}function NT(e){if(!St(e))throw new Error("blockscout transaction cursor must be a plain object");let t=Object.getOwnPropertyNames(e);if(t.length!==Hu.length||t.some(o=>!Hu.includes(o)))throw new Error("blockscout transaction cursor fields are invalid");let n=xr(e,"block_number","blockscout transaction",!0),r=xr(e,"index","blockscout transaction",!0);if(!Ki(n)||!Ki(r))throw new Error("blockscout transaction cursor values are invalid");return{block_number:n,index:r}}function CT(e){if(!St(e))throw new Error("blockscout transactions returned an invalid next cursor");let t=Object.getOwnPropertyNames(e);if(t.length===0||t.length>ag.size||t.some(a=>!ag.has(a)))throw new Error("blockscout transactions returned an invalid next cursor");let n=xr(e,"block_number","blockscout provider",!0),r=xr(e,"index","blockscout provider",!0);if(!Ki(n)||!Ki(r))throw new Error("blockscout transactions returned an invalid next cursor");let o=xr(e,"items_count","blockscout provider");if(o!==void 0&&!Ki(o))throw new Error("blockscout transactions returned an invalid next cursor");for(let a of["value","fee"]){let c=xr(e,a,"blockscout provider");if(c!==void 0&&(typeof c!="string"||c.length===0||c.length>100||!/^\d+$/u.test(c)))throw new Error("blockscout transactions returned an invalid next cursor")}let i=xr(e,"hash","blockscout provider");if(i!==void 0&&(typeof i!="string"||!/^0x[0-9a-f]{64}$/iu.test(i)))throw new Error("blockscout transactions returned an invalid next cursor");let s=xr(e,"inserted_at","blockscout provider");if(s!==void 0&&(typeof s!="string"||s.length>64||!Number.isFinite(Date.parse(s))))throw new Error("blockscout transactions returned an invalid next cursor");return{block_number:n,index:r}}function RT(e,t={}){let n=Number(e),r=t.baseUrl||Ka[n];if(!r)throw new Error(`Blockscout not configured for chainId ${n}`);return r.replace(/\/$/,"")}function cg(e){return!!Ka[Number(e)]}async function lg(e={},t={}){if(!e.address)throw new Error("address required");let n=Number(e.chainId||1),r=Math.min(50,Math.max(1,Math.trunc(Number(e.limit)||20))),o=new URLSearchParams,i=e.cursor;if(i!=null){let f=NT(i);for(let[m,h]of Object.entries(f))h!=null&&o.set(m,String(h))}let s=`${RT(n,t)}/api/v2/addresses/${encodeURIComponent(e.address)}/transactions?${o}`,a=Te(await R(s,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??18e3,maxResponseBytes:t.maxResponseBytes,sameOriginRedirectsOnly:t.sameOriginRedirectsOnly,headers:{accept:"application/json","user-agent":"OracleInvestigator/1.0"}}),"blockscout transactions response"),c=ft(a,"items");if(!St(a)||!Array.isArray(c))throw new Error("blockscout transactions returned an invalid response");let l=c.slice(0,r),u=null,d=ft(a,"next_page_params");if(d!=null){if(!St(d))throw new Error("blockscout transactions returned an invalid next cursor");u=CT(d)}let p=c.length>l.length?null:u;return{provider:"blockscout",chainId:n,address:String(e.address),limit:r,cursor:i??null,nextCursor:p,pageComplete:c.length<=l.length&&u==null,count:l.length,truncated:c.length>l.length,transactions:l,raw:{items:l,next_page_params:p}}}Y();sn();var PT="mainnet-beta",zu="https://api.mainnet-beta.solana.com";function LT(e={}){return String(e.rpcUrl||process.env.SOLANA_RPC_URL||zu).trim()}function $T(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}async function DT(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=Te(await R(LT(n),{method:"POST",body:{jsonrpc:"2.0",id:n.id||1,method:e,params:t},fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs??12e3,maxResponseBytes:n.maxResponseBytes,sameOriginRedirectsOnly:n.sameOriginRedirectsOnly}),"solana-rpc response");if(!St(o))throw new Error(`solana-rpc ${e}: invalid response envelope`);let i=ft(o,"error");if(i)throw new Error(`solana-rpc ${e}: ${ft(i,"message")||JSON.stringify(i)}`);if(!Object.hasOwn(o,"result"))throw new Error(`solana-rpc ${e}: missing result`);return ft(o,"result")}async function ug(e={},t={}){let n=$T(e.address||e.account,"address"),r=Math.min(1e3,Math.max(1,Math.trunc(Number(e.limit)||20))),o={limit:r};e.before&&(o.before=String(e.before)),e.until&&(o.until=String(e.until)),e.commitment&&(o.commitment=String(e.commitment)),e.minContextSlot!=null&&(o.minContextSlot=Number(e.minContextSlot));let i=await DT("getSignaturesForAddress",[n,o],t);if(!Array.isArray(i))throw new Error("solana-rpc getSignaturesForAddress returned an invalid response");let s=i.slice(0,r);return{provider:"solana-rpc",cluster:PT,address:n,limit:r,cursor:e.before?String(e.before):null,nextCursor:s.length===r?s[s.length-1]?.signature??null:null,pageComplete:i.length<r,count:s.length,truncated:i.length>s.length,signatures:s,raw:s}}Y();sn();var UT="mainnet",Vu="https://mempool.space/api",Wu="https://mempool.space/testnet/api";function dg(e={}){return String(e.network||process.env.BTC_NETWORK||UT).trim().toLowerCase()==="testnet"?"testnet":"mainnet"}function BT(e={}){return e.baseUrl?String(e.baseUrl).replace(/\/$/,""):process.env.BTC_ESPLORA_URL?String(process.env.BTC_ESPLORA_URL).replace(/\/$/,""):dg(e)==="testnet"?Wu:Vu}function qT(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}async function MT(e,t={}){let n=`${BT(t)}${e.startsWith("/")?e:`/${e}`}`;return Te(await R(n,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3,maxResponseBytes:t.maxResponseBytes,sameOriginRedirectsOnly:t.sameOriginRedirectsOnly}),"bitcoin-esplora response")}async function pg(e={},t={}){let n=qT(e.address||e.addr,"address"),r=Math.min(25,Math.max(1,Math.trunc(Number(e.limit)||20))),o=e.cursor||e.lastSeenTxid||null;if(o!=null&&!/^[0-9a-f]{64}$/i.test(String(o)))throw new Error("bitcoin-esplora: transaction cursor must be a 64-char txid");let i=o?`/address/${n}/txs/chain/${String(o).toLowerCase()}`:`/address/${n}/txs`,s=await MT(i,t);if(!Array.isArray(s))throw new Error("bitcoin-esplora address history returned an invalid response");let a=s.slice(0,r),c=s.length>a.length,l=!c&&s.length===25?a[a.length-1]?.txid??null:null;return{provider:"bitcoin-esplora",network:dg(t),address:n,limit:r,cursor:o==null?null:String(o).toLowerCase(),nextCursor:l,pageComplete:!c&&s.length<25,count:a.length,truncated:c,transactions:a,raw:a}}Yi();Y();sn();zn();var Yu="https://api.trongrid.io",jT=["api.trongrid.io","api.shasta.trongrid.io","nile.trongrid.io"],HT="TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t";function zT(e={}){return nn({provider:"tron-public",defaultUrl:Yu,hosts:jT,url:e.baseUrl||process.env.TRON_API_URL||""})}function VT(e={}){let t=e.apiKey||process.env.TRONGRID_API_KEY||process.env.TRON_PRO_API_KEY||"";return En(t)}function WT(e,t){return rn({Accept:"application/json"},{"TRON-PRO-API-KEY":t},e)}async function GT(e,t={}){let n=zT(t),r=VT(t),o=Te(await R(`${n.baseUrl}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3,maxResponseBytes:t.maxResponseBytes,sameOriginRedirectsOnly:!0,headers:WT(n.trusted,r)}),"tron-public response");return Gn(o,n.trusted?r:"","tron-public response")}function wg(e,t="address"){let n=String(e??"").trim();if(!/^T[1-9A-HJ-NP-Za-km-z]{33}$/.test(n))throw new Error(`tron-public: ${t} must be a base58 Tron address (T\u2026)`);return n}function KT(e){return Bo({error:"tron-public request failed"},e)}function YT(e,t){let n=Number(t);if(!Number.isFinite(n)||n<0||n>30)return null;let r=String(e??"0");if(!/^\d+$/.test(r))return null;let o=r.padStart(n+1,"0"),i=o.slice(0,o.length-n),s=n===0?"":o.slice(o.length-n).replace(/0+$/,"");return s?`${i}.${s}`:i}async function Eg(e={},t={}){try{let n=wg(e.address||e.account,"address"),r=Math.min(200,Math.max(1,Math.trunc(Number(e.limit||20)))),o=Math.min(200,r+1),i=new URLSearchParams({limit:String(o)}),s=e.contract===void 0?HT:e.contract;s&&String(s).toLowerCase()!=="all"&&i.set("contract_address",wg(s,"contract")),e.onlyConfirmed!==!1&&i.set("only_confirmed","true"),e.minTimestamp&&i.set("min_timestamp",String(Number(e.minTimestamp))),e.maxTimestamp&&i.set("max_timestamp",String(Number(e.maxTimestamp)));let a=await GT(`/v1/accounts/${n}/transactions/trc20?${i.toString()}`,t);if(!a||typeof a!="object"||Array.isArray(a)||!Array.isArray(a.data))throw new Error("tron-public: TRC20 transfers returned an invalid response");let c=a.data.slice(0,r+1),l=c.slice(0,r);return{provider:"tron-public",address:n,contract:s&&String(s).toLowerCase()!=="all"?String(s):null,limit:r,count:l.length,truncated:c.length>r||!!a.meta?.links?.next,pageComplete:c.length<o&&!a.meta?.links?.next,transfers:l.map(u=>({txId:u.transaction_id??null,from:u.from??null,to:u.to??null,direction:u.from===n?"out":u.to===n?"in":null,raw:u.value==null?null:String(u.value),amount:u.value==null?null:YT(u.value,u.token_info?.decimals),symbol:u.token_info?.symbol??null,decimals:u.token_info?.decimals??null,tokenAddress:u.token_info?.address??null,blockTimestamp:u.block_timestamp??null,type:u.type??null}))}}catch(n){return KT(n)}}Y();sn();zn();var Qu="https://toncenter.com/api",JT=["toncenter.com","testnet.toncenter.com"];function XT(e={}){return nn({provider:"ton-public",defaultUrl:Qu,hosts:JT,url:e.baseUrl||process.env.TON_API_URL||""})}function QT(e={}){let t=e.apiKey||process.env.TONCENTER_API_KEY||process.env.TON_API_KEY||"";return En(t)}function ZT(e,t){return rn({Accept:"application/json"},{"X-API-Key":t},e)}async function eN(e,t={}){let n=XT(t),r=QT(t),o=Te(await R(`${n.baseUrl}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3,maxResponseBytes:t.maxResponseBytes,sameOriginRedirectsOnly:!0,headers:ZT(n.trusted,r)}),"ton-public response");return Gn(o,n.trusted?r:"","ton-public response")}function tN(e,t="address"){let n=String(e??"").trim();if(/^-?\d+:[0-9a-fA-F]{64}$/.test(n)||/^[A-Za-z0-9_-]{48}$/.test(n))return n;throw new Error(`ton-public: ${t} must be a raw (0:hex) or base64url TON address`)}function nN(e){return Bo({error:"ton-public request failed"},e)}function rN(e,t){if(!St(e))throw new Error(`ton-public: ${t} returned an invalid response envelope`);if(ft(e,"ok")===!1)throw new Error(`ton-public: ${t} was rejected`);if(!Object.hasOwn(e,"result"))throw new Error(`ton-public: ${t} response is missing result`);return ft(e,"result")}function Ju(e){let t=String(e??"").trim();if(Er(t)||!/^[A-Za-z0-9+/_-]{43}=?$/u.test(t))throw new Error("ton-public: transaction hash is invalid");let n=Buffer.from(t.replace(/-/g,"+").replace(/_/g,"/"),"base64");if(n.length!==32||Ar(n))throw new Error("ton-public: transaction hash is invalid");return n.toString("base64")}function Xu(e,t,{nullable:n=!0}={}){if(e==null&&n)return null;let r=typeof e=="number"&&Number.isSafeInteger(e)&&e>=0?String(e):e;if(typeof r!="string"||r.length===0||r.length>100||!/^\d+$/u.test(r))throw new Error(`ton-public: ${t} is not a bounded unsigned amount`);return r}async function Ag(e={},t={}){try{let n=tN(e.address||e.account,"address"),r=Math.min(100,Math.max(1,Math.trunc(Number(e.limit||10)))),o=e.lt!==void 0||e.hash!==void 0;if(o&&(e.lt===void 0||e.hash===void 0))throw new Error("ton-public: transaction cursor requires both lt and hash");let i=o?{lt:String(e.lt),hash:Ju(e.hash)}:null;if(i&&!/^\d+$/u.test(i.lt))throw new Error("ton-public: transaction cursor lt is invalid");let s=i?Math.min(100,r+1):r,a=new URLSearchParams({address:n,limit:String(s)});i&&(a.set("lt",i.lt),a.set("hash",i.hash));let c=rN(await eN(`/v2/getTransactions?${a.toString()}`,t),"getTransactions");if(!Array.isArray(c))throw new Error("ton-public: getTransactions returned an invalid response");let l=c.slice(0,s);if(i){let h=l[0]?.transaction_id,y=h?.hash==null?null:Ju(h.hash);if(String(h?.lt??"")!==i.lt||y!==i.hash)throw new Error("ton-public: cursor boundary was not returned exactly");l.shift()}let d=l.slice(0,r).map(h=>{if(!h||typeof h!="object"||!h.transaction_id||typeof h.transaction_id!="object")throw new Error("ton-public: malformed transaction row");let y=Ju(h.transaction_id.hash),g=String(h.transaction_id.lt??"");if(g.length>100||!/^\d+$/u.test(g))throw new Error("ton-public: malformed transaction logical time");if(h.in_msg!=null&&(typeof h.in_msg!="object"||Array.isArray(h.in_msg)))throw new Error("ton-public: malformed inbound message");if(h.out_msgs!=null&&!Array.isArray(h.out_msgs))throw new Error("ton-public: malformed outbound messages");let E=Array.isArray(h.out_msgs),v=h.out_msgs??[];if(v.length>256)throw new Error("ton-public: outbound message count exceeds the bound");let S=0n;for(let k of v){if(!k||typeof k!="object"||Array.isArray(k))throw new Error("ton-public: malformed outbound message");S+=BigInt(Xu(k.value??"0","outbound message value",{nullable:!1}))}let I=E?String(S):null;if(I!=null&&I.length>100)throw new Error("ton-public: outbound amount exceeds the bound");return{hash:y,lt:g,utime:h.utime??null,feeNano:Xu(h.fee,"transaction fee"),inMessageValueNano:Xu(h.in_msg?.value,"inbound message value"),inMessageSource:h.in_msg?.source||null,inMessageDestination:h.in_msg?.destination||null,outMessageCount:v.length,outMessageValueNano:I}}),p=c.length>=s,f=d.length>0?d[d.length-1]:null,m=p&&f?{lt:f.lt,hash:f.hash}:null;return{provider:"ton-public",address:n,limit:r,count:d.length,cursor:i,nextCursor:m,pageComplete:!p,continuationUnknown:p&&!m,transactions:d}}catch(n){return nN(n)}}Y();sn();var Yn=Object.freeze({cosmoshub:Object.freeze({lcd:"https://cosmos-rest.publicnode.com",denom:"uatom",symbol:"ATOM",decimals:6,prefix:"cosmos"}),osmosis:Object.freeze({lcd:"https://osmosis-rest.publicnode.com",denom:"uosmo",symbol:"OSMO",decimals:6,prefix:"osmo"}),celestia:Object.freeze({lcd:"https://celestia-rest.publicnode.com",denom:"utia",symbol:"TIA",decimals:6,prefix:"celestia"}),injective:Object.freeze({lcd:"https://injective-rest.publicnode.com",denom:"inj",symbol:"INJ",decimals:18,prefix:"inj"}),neutron:Object.freeze({lcd:"https://rest.cosmos.directory/neutron",denom:"untrn",symbol:"NTRN",decimals:6,prefix:"neutron"}),dydx:Object.freeze({lcd:"https://dydx-rest.publicnode.com",denom:"adydx",symbol:"DYDX",decimals:18,prefix:"dydx"}),noble:Object.freeze({lcd:"https://rest.cosmos.directory/noble",denom:"uusdc",symbol:"USDC",decimals:6,prefix:"noble"}),kava:Object.freeze({lcd:"https://kava-rest.publicnode.com",denom:"ukava",symbol:"KAVA",decimals:6,prefix:"kava"})}),Sg="cosmoshub";function oN(e){let t=String(e||"").toUpperCase().replace(/[^A-Z0-9]/g,"_");return process.env[`COSMOS_LCD_URL_${t}`]||""}function iN(e={},t={}){let n=(c,l)=>c!=null&&Object.hasOwn(Object(c),l)?c[l]:void 0,r=String(n(e,"chain")||n(t,"chain")||process.env.COSMOS_CHAIN||Sg).trim().toLowerCase(),o=Object.hasOwn(Yn,r)?Yn[r]:null,i=String(n(t,"baseUrl")||n(e,"lcdUrl")||n(t,"lcdUrl")||"").trim(),s=oN(r)||r===Sg&&process.env.COSMOS_LCD_URL||"",a=(i||s||o?.lcd||"").replace(/\/$/,"");if(!a)throw new Error(`cosmos-lcd: unknown chain '${r}' \u2014 pass lcdUrl or set COSMOS_LCD_URL_${r.toUpperCase()} (known: ${Object.keys(Yn).join(", ")})`);return{chain:r,lcd:a,nativeDenom:o?.denom??null,symbol:o?.symbol??null,decimals:o?.decimals??null,prefix:o?.prefix??null,known:!!o}}async function sN(e,t,n={}){return Te(await R(`${e.lcd}${t.startsWith("/")?t:`/${t}`}`,{fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs??15e3,maxResponseBytes:n.maxResponseBytes,sameOriginRedirectsOnly:n.sameOriginRedirectsOnly,headers:{Accept:"application/json"}}),"cosmos-lcd response")}function aN(e,t="address"){let n=String(e??"").trim();if(n!==n.toLowerCase()&&n!==n.toUpperCase())throw new Error(`cosmos-lcd: ${t} must be a uniformly-cased bech32 Cosmos address`);let r=n.toLowerCase();if(!/^[a-z][a-z0-9]{1,15}1[02-9ac-hj-np-z]{6,90}$/.test(r))throw new Error(`cosmos-lcd: ${t} must be a bech32 Cosmos address`);return r}function cN(e){return{error:String(e?.message||e).slice(0,200)}}function lN(e,t){let n=Number(t);if(!Number.isFinite(n)||n<0||n>30)return null;let r=String(e??"0");if(!/^\d+$/.test(r))return null;let o=r.padStart(n+1,"0"),i=o.slice(0,o.length-n),s=n===0?"":o.slice(o.length-n).replace(/0+$/,"");return s?`${i}.${s}`:i}function uN(e){let t=/^ibc\/([0-9A-Fa-f]{64})$/.exec(String(e||""));return t?t[1].toUpperCase():null}function dN(e,t){let n=e?.denom??null,r=e?.amount==null?null:String(e.amount),o=n!=null&&n===t.nativeDenom;return{denom:n,amount:r,ibcHash:uN(n),native:o,symbol:o?t.symbol:null,decimals:o?t.decimals:null,display:o&&r!=null?lN(r,t.decimals):null}}async function vg(e={},t={}){try{let n=iN(e,t),r=aN(e.address||e.account,"address"),o=Math.min(500,Math.max(1,Math.trunc(Number(e.limit||100)))),i=Math.min(501,o+1),s=await sN(n,`/cosmos/bank/v1beta1/balances/${r}?pagination.limit=${i}`,t);if(!s||typeof s!="object"||Array.isArray(s)||!Array.isArray(s.balances))throw new Error("cosmos-lcd: balances returned an invalid response");let a=s.balances.slice(0,o+1),l=a.slice(0,o).map(d=>dN(d,n)),u=l.find(d=>d.native)||null;return{provider:"cosmos-lcd",chain:n.chain,lcd:n.lcd,address:r,count:l.length,truncated:a.length>o||!!s.pagination?.next_key,nativeDenom:n.nativeDenom,nativeAmount:u?.amount??"0",native:u?.display??null,ibcDenomCount:l.filter(d=>d.ibcHash).length,balances:l,nextKey:s?.pagination?.next_key??null}}catch(n){return cN(n)}}Y();sn();zn();var ed="https://fullnode.mainnet.aptoslabs.com",Zu="0x1::aptos_coin::AptosCoin",Ya=8;function kg(e={}){return nn({provider:"aptos-public",defaultUrl:ed,hosts:["fullnode.mainnet.aptoslabs.com"],url:e.baseUrl||process.env.APTOS_FULLNODE_URL||process.env.APTOS_API_URL||""})}function Og(e={}){let t=e.apiKey||process.env.APTOS_API_KEY||"";return En(t)}function _g(e,t){return rn({Accept:"application/json"},{Authorization:t?`Bearer ${t}`:""},e)}async function xg(e,t={}){let n=kg(t),r=Og(t),o=Te(await R(`${n.baseUrl}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3,maxResponseBytes:t.maxResponseBytes,sameOriginRedirectsOnly:!0,headers:_g(n.trusted,r)}),"aptos-public response");return Gn(o,n.trusted?r:"","aptos-public response")}function pN(e,t="address"){let n=String(e??"").trim().toLowerCase();if(!/^0x[0-9a-f]{1,64}$/.test(n))throw new Error(`aptos-public: ${t} must be a 0x-prefixed Aptos address`);return`0x${n.slice(2).padStart(64,"0")}`}function fN(e){return Bo({error:"aptos-public request failed"},e)}function Ig(e,t){let n=Number(t);if(!Number.isFinite(n)||n<0||n>30)return null;let r=String(e??"0");if(!/^\d+$/.test(r))return null;let o=r.padStart(n+1,"0"),i=o.slice(0,o.length-n),s=n===0?"":o.slice(o.length-n).replace(/0+$/,"");return s?`${i}.${s}`:i}function mN(e){let t=/^0x1::coin::CoinStore<(.+)>$/.exec(String(e||""));return t?t[1]:null}async function Tg(e={},t={}){try{let n=pN(e.address||e.owner,"address"),r=e.coinType?String(e.coinType).trim():"",o=Math.min(200,Math.max(1,Math.trunc(Number(e.limit||200))));if(r){let d=null,p="view";try{let m=kg(t),h=Og(t),y=Gn(Te(await R(`${m.baseUrl}/v1/view`,{method:"POST",body:{function:"0x1::coin::balance",type_arguments:[r],arguments:[n]},fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3,maxResponseBytes:t.maxResponseBytes,sameOriginRedirectsOnly:!0,headers:_g(m.trusted,h)}),"aptos-public view response"),m.trusted?h:"","aptos-public view response");if(!Array.isArray(y)||y.length===0||!/^\d+$/u.test(String(y[0])))throw new Error("aptos-public: coin balance view returned an invalid response");d=String(y[0])}catch{p="coinstore";let m=await xg(`/v1/accounts/${n}/resource/${encodeURIComponent(`0x1::coin::CoinStore<${r}>`)}`,t);if(!/^\d+$/u.test(String(m?.data?.coin?.value??"")))throw new Error("aptos-public: coin store returned an invalid response");d=String(m.data.coin.value)}let f=r===Zu;return{provider:"aptos-public",address:n,source:p,count:1,balances:[{coinType:r,raw:d??"0",decimals:f?Ya:null,symbol:f?"APT":null,amount:f?Ig(d??"0",Ya):null}]}}let i=Math.min(201,o+1),s=await xg(`/v1/accounts/${n}/resources?limit=${i}`,t);if(!Array.isArray(s))throw new Error("aptos-public: account resources returned an invalid response");let a=s.slice(0,i),c=[];for(let d of a){if(!d||typeof d!="object"||Array.isArray(d)||typeof d.type!="string"||d.type.length===0||d.type.length>512||!d.data||typeof d.data!="object"||Array.isArray(d.data))throw new Error("aptos-public: account resources contained a malformed row");let p=mN(d.type);if(!p)continue;let f=String(d.data?.coin?.value??"");if(!/^\d+$/u.test(f))throw new Error("aptos-public: coin store contained an invalid balance");let m=p===Zu;c.push({coinType:p,raw:f,decimals:m?Ya:null,symbol:m?"APT":null,amount:m?Ig(f,Ya):null,frozen:d?.data?.frozen??null})}let l=c.slice(0,o),u=l.find(d=>d.coinType===Zu)||null;return{provider:"aptos-public",address:n,source:"coinstore",count:l.length,truncated:s.length>o||c.length>o,aptRaw:u?.raw??"0",apt:u?.amount??"0",balances:l}}catch(n){return fN(n)}}sn();zn();var od="oracle.investigator-fact-projection/1",Dg=4*1024*1024;function Pt(e){return Rt(e)}var Qn=Rt({evm:Pt({status:"AVAILABLE",mode:"transaction-history",source:"blockscout",chainIds:Object.freeze([1,10,137,324,8453,42161,534352]),chainStatus:Object.freeze({1:"AVAILABLE",10:"AVAILABLE",137:"AVAILABLE",324:"AVAILABLE",8453:"AVAILABLE",42161:"AVAILABLE",534352:"AVAILABLE",56:"UNAVAILABLE",130:"UNAVAILABLE",143:"UNAVAILABLE",360:"UNAVAILABLE",988:"UNAVAILABLE",999:"UNAVAILABLE",1329:"UNAVAILABLE",1868:"UNAVAILABLE",2020:"UNAVAILABLE",2741:"UNAVAILABLE",4326:"UNAVAILABLE",4663:"UNAVAILABLE",5031:"UNAVAILABLE",8333:"UNAVAILABLE",33139:"UNAVAILABLE",43114:"UNAVAILABLE",43419:"UNAVAILABLE",57073:"UNAVAILABLE",69e3:"UNAVAILABLE",80094:"UNAVAILABLE",81457:"UNAVAILABLE",7777777:"UNAVAILABLE"}),maxLimit:50,cursor:"CONDITIONAL",cursorMode:"conditional",cursorReason:"A continuation is exposed only when Blockscout does not over-return and force client truncation",facts:"Bounded Blockscout transaction fact projections"}),solana:Pt({status:"AVAILABLE",mode:"signature-history",source:"solana-rpc",chainIds:Object.freeze(["mainnet-beta"]),maxLimit:1e3,cursor:!0,facts:"Bounded getSignaturesForAddress fact projections"}),bitcoin:Pt({status:"AVAILABLE",mode:"transaction-history",source:"bitcoin-esplora",chainIds:Object.freeze(["mainnet","testnet"]),maxLimit:25,cursor:!0,facts:"Bounded Esplora transaction facts with input/output summaries"}),hyperliquid:Pt({status:"AVAILABLE",mode:"fill-history",source:"hyperliquid-info",chainIds:Object.freeze(["hyperliquid-mainnet","hyperliquid-testnet"]),maxLimit:1e3,cursor:!1,facts:"Bounded public userFills fact projections"}),tron:Pt({status:"AVAILABLE",mode:"trc20-transfer-history",source:"tron-public",chainIds:Object.freeze(["tron-mainnet"]),maxLimit:200,cursor:!1,facts:"Bounded confirmed TRC20 transfer facts, not native TRX history"}),ton:Pt({status:"AVAILABLE",mode:"transaction-history",source:"ton-public",chainIds:Object.freeze(["ton-mainnet"]),maxLimit:100,cursor:!0,facts:"Bounded toncenter transaction fact projections"}),cosmos:Pt({status:"EVIDENCE_ONLY",mode:"holdings",source:"cosmos-lcd",chainIds:Object.freeze(Object.keys(Yn)),maxLimit:500,cursor:!1,facts:"Bounded bank-balance facts only; transaction history is not collected"}),aptos:Pt({status:"EVIDENCE_ONLY",mode:"holdings",source:"aptos-public",chainIds:Object.freeze(["aptos-mainnet"]),maxLimit:200,cursor:!1,facts:"Bounded legacy CoinStore holding facts only; Fungible Asset enumeration and transaction history are not collected"}),liquid:Pt({status:"EVIDENCE_ONLY",mode:"address-state",source:"liquid-esplora",chainIds:Object.freeze(["liquid-mainnet"]),maxLimit:1,cursor:!1,facts:"Bounded address transaction-count and confidentiality-form facts only; per-asset balances and transaction timeline are unavailable"}),sui:Pt({status:"UNAVAILABLE",mode:"none",source:null,chainIds:Object.freeze(["sui-mainnet"]),maxLimit:0,cursor:!1,reason:"wallet history collector is quarantined and unavailable"}),stacks:Pt({status:"UNAVAILABLE",mode:"none",source:null,chainIds:Object.freeze(["stacks-mainnet"]),maxLimit:0,cursor:!1,reason:"address history collector is not implemented"}),"celestia-da":Pt({status:"UNAVAILABLE",mode:"none",source:null,chainIds:Object.freeze(["celestia-mainnet"]),maxLimit:0,cursor:!1,reason:"DA address history is unavailable; Cosmos account state uses family cosmos and chainId celestia"}),unsupported:Pt({status:"UNAVAILABLE",mode:"none",source:null,chainIds:Object.freeze([]),maxLimit:0,cursor:!1,reason:"chain family is not supported"})});var Ng=Object.freeze({eth:"evm",ethereum:"evm",base:"evm",arbitrum:"evm",optimism:"evm",polygon:"evm",polymarket:"evm",bsc:"evm",avalanche:"evm",abstract:"evm",stable:"evm",robinhood:"evm",hyperevm:"evm",sol:"solana",btc:"bitcoin",hl:"hyperliquid","the-open-network":"ton","liquid-bitcoin":"liquid",celestia:"cosmos"}),Cg=Object.freeze({eth:1,ethereum:1,base:8453,arbitrum:42161,optimism:10,polygon:137,polymarket:137,bsc:56,avalanche:43114,abstract:2741,stable:988,robinhood:4663,hyperevm:999,celestia:"celestia"}),Rg=Object.freeze({evm:1,solana:"mainnet-beta",bitcoin:"mainnet",hyperliquid:"hyperliquid-mainnet",tron:"tron-mainnet",ton:"ton-mainnet",cosmos:"cosmoshub",aptos:"aptos-mainnet",liquid:"liquid-mainnet",sui:"sui-mainnet",stacks:"stacks-mainnet","celestia-da":"celestia-mainnet"}),hN=new Set(["address","assetId","blockHash","coinType","denom","hash","ibcHash","signature","transactionHash","transactionId","txid"]),ec=Symbol("missing-public-fact"),Ja=8;function yN(e){let t=typeof e=="string"||typeof e=="number"?String(e).trim().toLowerCase():"";return(Object.hasOwn(Ng,t)?Ng[t]:t)||"unsupported"}function rc(e){return St(e)&&Object.getPrototypeOf(e)===Object.prototype}function pe(e,t){return ft(e,t)}function Zn(e){return St(e)}function nd(e,t=0){if(t>8)throw new Error("investigator collector: provider row exceeds the nesting bound");if(e===null||typeof e=="string"||typeof e=="boolean"||typeof e=="number"&&Number.isFinite(e))return e;if(Array.isArray(e)){if(rd.isProxy(e)||e.length>1e4)throw new Error("investigator collector: provider array exceeds the length bound");let o=new Array(e.length);for(let i=0;i<e.length;i+=1){if(!Object.hasOwn(e,i))throw new Error("investigator collector: provider array must contain dense own entries");let s=Object.getOwnPropertyDescriptor(e,String(i));if(!s||!Object.hasOwn(s,"value"))throw new Error("investigator collector: provider array entries must be own data");o[i]=nd(s.value,t+1)}return o}if(!Zn(e))throw new Error("investigator collector: provider row contains a non-JSON value");let n=Object.keys(e);if(n.length>256)throw new Error("investigator collector: provider row exceeds the field bound");let r=Object.create(null);for(let o of n){let i=Object.getOwnPropertyDescriptor(e,o);if(!i||!Object.hasOwn(i,"value"))throw new Error("investigator collector: provider row fields must be own data");r[o]=nd(i.value,t+1)}return r}function gN(e){if(!rc(e))throw new Error("investigator collector: wallet request must be a plain object");let t=new Set(["family","chainId","address","limit","cursor"]);if(Object.getOwnPropertySymbols(e).length>0)throw new Error("investigator collector: wallet request has unknown fields");let n=Object.getOwnPropertyNames(e);if(n.length>t.size||n.some(r=>!t.has(r)))throw new Error("investigator collector: wallet request has unknown fields");for(let r of n){let o=Object.getOwnPropertyDescriptor(e,r);if(!o||!o.enumerable||!Object.hasOwn(o,"value"))throw new Error("investigator collector: wallet request fields must be enumerable own data")}}function bN(e){if(!Zn(e))throw new Error("investigator collector: internal options must be a plain object");let t=new Set(["now","transports","fetchImpl","timeoutMs"]);if(Object.keys(e).filter(i=>!t.has(i)).length)throw new Error("investigator collector: internal options have unknown fields");let r=pe(e,"fetchImpl"),o=pe(e,"transports");if(r!==void 0&&typeof r!="function")throw new Error("investigator collector: fetchImpl must be a function");if(o!==void 0){if(!rc(o))throw new Error("investigator collector: transports must be a plain object");for(let i of Object.keys(o)){let s=Object.getOwnPropertyDescriptor(o,i);if(!s||!Object.hasOwn(s,"value")||typeof s.value!="function")throw new Error("investigator collector: transports must contain own data functions")}}}function wN(e){let t=pe(e,"now"),n=typeof t=="function"?t():t??new Date,r=n instanceof Date?n:new Date(n);if(!Number.isFinite(r.getTime()))throw new Error("investigator collector: now must be a valid date");return r.toISOString()}function EN(e,t,n){let r=Object.hasOwn(Cg,t)?Cg[t]:void 0,o=Object.hasOwn(Rg,e)?Rg[e]:void 0,i=n??r??o??"unspecified";if(e==="evm"){if(!Number.isSafeInteger(i)||i<1)throw new Error("investigator collector: EVM chainId must be a positive integer");return i}if(typeof i!="string"||i.length===0||i.length>96||/[\u0000-\u001f\u007f]/u.test(i)||/:\/\//u.test(i)||/^[0-9a-f]{64}$/iu.test(i)||_e(i))throw new Error("investigator collector: chainId is invalid");return i}function Xa(e){return e===e.toLowerCase()||e===e.toUpperCase()}function AN(e){let t=0;for(let n of e){t^=n<<8;for(let r=0;r<8;r+=1)t=t&32768?(t<<1^4129)&65535:t<<1&65535}return t}function Ug(e){if(/^(?:-1|0):[0-9a-fA-F]{64}$/u.test(e)){let[o,i]=e.split(":");return`${o}:${i.toLowerCase()}`}if(!/^[A-Za-z0-9_-]{48}$/u.test(e))return null;let t;try{t=Buffer.from(e.replace(/-/gu,"+").replace(/_/gu,"/"),"base64")}catch{return null}if(t.length!==36||(t[0]&128)!==0||![17,81].includes(t[0]))return null;let n=t[1]===0?"0":t[1]===255?"-1":null;if(n===null)return null;let r=t[34]<<8|t[35];return AN(t.subarray(0,34))!==r?null:`${n}:${Buffer.from(t.subarray(2,34)).toString("hex")}`}function id(e){return(/^lq1/iu.test(e)||/^V/u.test(e))&&zi(e)}function Lt(e,t,n){if(e==="evm"||e==="hyperliquid")return/^0x[0-9a-fA-F]{40}$/u.test(n);if(e==="solana")return qa(n);if(e==="bitcoin"){let r=/^bc1[a-z0-9]{20,90}$/iu.test(n)&&Xa(n),o=/^tb1[a-z0-9]{20,90}$/iu.test(n)&&Xa(n),i=r||/^[13][a-km-zA-HJ-NP-Z1-9]{25,34}$/u.test(n),s=o||/^[mn2][a-km-zA-HJ-NP-Z1-9]{25,34}$/u.test(n);return t==="mainnet"?i:t==="testnet"?s:!1}if(e==="tron")return/^T[1-9A-HJ-NP-Za-km-z]{33}$/u.test(n);if(e==="ton")return Ug(n)!==null;if(e==="cosmos"){if(!Xa(n))return!1;let r=Object.hasOwn(Yn,t)?Yn[t]?.prefix:void 0,o=/^([a-z][a-z0-9]{1,15})1[02-9ac-hj-np-z]{6,90}$/u.exec(n.toLowerCase());return!!(o&&(!r||o[1]===r))}return e==="aptos"||e==="sui"?/^0x[0-9a-fA-F]{1,64}$/u.test(n):e==="liquid"?/^ex1[a-z0-9]{20,200}$/iu.test(n)&&Xa(n)||/^[PQGH][a-km-zA-HJ-NP-Z1-9]{25,40}$/u.test(n)||id(n):e==="stacks"?/^(?:SP|SM|ST|SN)[A-Z0-9]{20,50}$/u.test(n):e==="celestia-da"?/^celestia1[02-9ac-hj-np-z]{6,90}$/u.test(n):/^[A-Za-z0-9][A-Za-z0-9:._-]{0,255}$/u.test(n)}function an(e,t){return["evm","hyperliquid","cosmos"].includes(e)?t.toLowerCase():["aptos","sui"].includes(e)?`0x${t.slice(2).toLowerCase().padStart(64,"0")}`:e==="bitcoin"&&/^(?:bc1|tb1)/iu.test(t)||e==="liquid"&&/^(?:ex1|lq1)/iu.test(t)?t.toLowerCase():e==="ton"?Ug(t)??t:t}function SN(e,t,n){if(typeof n!="string"||n.length===0||n.length>256||/[\u0000-\u001f\u007f]/u.test(n))throw new Error("investigator collector: address is invalid");let r=n.trim();if(!r||/:\/\//u.test(r)||!Lt(e,t,r))throw new Error(`investigator collector: address does not match ${e} on ${String(t)}`);let o=["aptos","sui","ton"].includes(e)&&Lt(e,t,r)||e==="liquid"&&id(r);if(_e(r)&&!o)throw new Error("investigator collector: address contains secret-shaped material");return an(e,r)}function vN(e,t){if(t.maxLimit===0){if(e!==void 0)throw new Error("investigator collector: limit is not accepted for an unavailable family");return{requested:null,applied:0}}let n=e??Math.min(20,t.maxLimit);if(!Number.isInteger(n)||n<1||n>t.maxLimit)throw new Error(`investigator collector: limit must be an integer from 1 through ${t.maxLimit}`);return{requested:n,applied:n}}function xN(e,t,n){if(t===Qn.unsupported)return;if(![...Array.isArray(t.chainIds)?t.chainIds:[],...Object.keys(t.chainStatus||{}).map(o=>e==="evm"?Number(o):o)].some(o=>String(o)===String(n)))throw new Error(`investigator collector: chainId is not declared for ${e}`)}function Bg(e={}){gN(e);let t=pe(e,"family"),n=typeof t=="string"?t.trim().toLowerCase():"";if(n.length>63||!/^[a-z][a-z0-9-]*$/u.test(n)||/^[0-9a-f]{64}$/iu.test(n)||_e(n))throw new Error("investigator collector: family is invalid");let r=yN(n),o=Object.hasOwn(Qn,r)?Qn[r]:Qn.unsupported,i=EN(r,n,pe(e,"chainId"));xN(r,o,i);let s=SN(r,i,pe(e,"address")),a=vN(pe(e,"limit"),o),c=pe(e,"cursor"),l=c===void 0?null:qo(c,{family:r,chain:i,address:s,provider:o.source});if(l&&!o.cursor)throw new Error(`investigator collector: ${r} does not support cursors`);return{requestedFamily:n,family:r,chain:i,address:s,limits:a,cursor:l,capability:o}}function Ji(e,t){return`${e}_${Sr(t).slice(7,55)}`}function qg(e,t,n){return Ji("entity",{family:e,chain:t,address:n,kind:"address"})}function IN(e){return{id:qg(e.family,e.chain,e.address),family:e.family,chain:e.chain,address:e.address,kind:"address"}}function oc(e,t,n,r=[]){return{schemaVersion:Va,execution:"read-only",status:t,subject:e,entities:[IN(e)],events:[],evidence:[],coverage:n,gaps:r,cursor:null}}function Xn(e,t){return{code:e,message:t}}var tc=Object.freeze({"provider-auth":"The upstream provider rejected its credential.","provider-rate-limited":"The upstream provider rate-limited the request.","provider-timeout":"The upstream provider request timed out.","provider-response-too-large":"The upstream response exceeded the allowed byte limit.","provider-invalid-response":"The upstream provider returned an invalid response.","provider-rejected":"The upstream provider rejected the request.","provider-unavailable":"The upstream provider is unavailable."});function Za(e,t="provider-unavailable"){let n=s=>ft(e,s),r=n("status"),o=Number.isInteger(r)&&r>=400&&r<=599?r:null,i=t;return n("oversize")===!0?i="provider-response-too-large":o===401||o===403?i="provider-auth":o===408||n("oracleTimeout")===!0||n("name")==="AbortError"||n("name")==="TimeoutError"?i="provider-timeout":o===429?i="provider-rate-limited":o!==null&&o<500?i="provider-rejected":Object.hasOwn(tc,i)||(i="provider-unavailable"),Object.freeze({code:i,httpStatus:o,message:tc[i]})}function Mg(e,t,n,r,o,i=!1){return{id:Ji("evidence",{family:r.family,chain:r.chain,address:r.address,source:t,status:e,facts:o}),status:e,source:t,observedAt:n,publicFacts:o,projection:{schemaVersion:od,kind:"bounded-public-facts",family:r.family,projected:!0,upstreamRowPreserved:!1,sourceLocatorPreserved:!1,truncated:i,selectedFieldCount:Object.keys(o).length,omittedTopLevelFieldCount:0}}}function td(e,t,n,r,o,i){let s=t?.source||null,a=ft(r,"code"),c=a&&Object.hasOwn(tc,a)?Object.freeze({code:a,httpStatus:ft(r,"httpStatus")??null,message:tc[a]}):Za(r),l={source:s,failureCode:c.code,httpStatus:c.httpStatus},u=oc(e,"UNKNOWN",{mode:t?.mode||"none",source:s,requestedLimit:n?.requested??null,appliedLimit:n?.applied??null,returned:0,historyAvailable:t?.mode!=="holdings"&&t?.status==="AVAILABLE",cursorSupported:t?.cursor||!1,failureCode:c.code,httpStatus:c.httpStatus},[{code:c.code,source:s,status:"UNKNOWN",httpStatus:c.httpStatus,message:c.message}]);return u.evidence.push(Mg("ERROR",s,o,e,l,!0)),u.cursor=t?.cursor?{requested:i,next:null}:null,u}function Qa(e,t,n){let r=String(t?.reason||"wallet evidence collection is unavailable").slice(0,240),o=oc(e,"UNAVAILABLE",{mode:"none",source:t?.source||null,requestedLimit:null,appliedLimit:0,returned:0,historyAvailable:!1,cursorSupported:!1},[Xn("unavailable",r)]);return o.evidence.push(Mg("UNAVAILABLE",t?.source||null,n,e,{reason:r})),o}function kN(e){let t=e==="tron"?["TRONGRID_API_KEY","TRON_PRO_API_KEY"]:e==="ton"?["TONCENTER_API_KEY","TON_API_KEY"]:e==="aptos"?["APTOS_API_KEY"]:[];for(let n of t){let r=En(process.env[n]);if(r)return r}return null}function Jn(e,t,n,r){let o=Object.assign(Object.create(null),{fetchImpl:typeof pe(n,"fetchImpl")=="function"?pe(n,"fetchImpl"):void 0,timeoutMs:pe(n,"timeoutMs"),apiKey:r??void 0,maxResponseBytes:Dg,sameOriginRedirectsOnly:!0}),i=(s={})=>Object.assign(Object.create(null),o,s);return e==="evm"?i({baseUrl:Ka[Number(t.chainId)]}):e==="solana"?i({rpcUrl:zu}):e==="bitcoin"?i({network:t.chainId,baseUrl:t.chainId==="testnet"?Wu:Vu}):e==="hyperliquid"?i({testnet:t.chainId==="hyperliquid-testnet",baseUrl:t.chainId==="hyperliquid-testnet"?Ku:Gu}):e==="tron"?i({baseUrl:Yu}):e==="ton"?i({baseUrl:Qu}):e==="cosmos"?i({chain:t.chainId,baseUrl:Object.hasOwn(Yn,t.chainId)?Yn[t.chainId]?.lcd:void 0}):e==="aptos"?i({baseUrl:ed}):e==="liquid"?i({baseUrl:Tu}):o}var Pg=Object.freeze({evm:(e,t,n)=>lg(e,Jn("evm",e,t,n)),solana:(e,t,n)=>ug(e,Jn("solana",e,t,n)),bitcoin:(e,t,n)=>pg(e,Jn("bitcoin",e,t,n)),hyperliquid:(e,t,n)=>mg(e.address,Jn("hyperliquid",e,t,n)),tron:(e,t,n)=>Eg(e,Jn("tron",e,t,n)),ton:(e,t,n)=>Ag(e,Jn("ton",e,t,n)),cosmos:(e,t,n)=>vg(Object.assign(Object.create(null),e,{chain:e.chainId}),Jn("cosmos",e,t,n)),aptos:(e,t,n)=>Tg(e,Jn("aptos",e,t,n)),liquid:(e,t,n)=>zy(e,Jn("liquid",e,t,n))});function ON(e,t,n,r){let o=pe(n,"transports"),i=o&&Object.hasOwn(o,e)?o[e]:null,s=o&&t?.source&&Object.hasOwn(o,t.source)?o[t.source]:null,a=i||s;if(a)return l=>a(l,n);let c=Object.hasOwn(Pg,e)?Pg[e]:null;return c?l=>c(l,n,r):void 0}function Ge(e){return typeof e=="string"?e||null:pe(e,"hash")||pe(e,"address")||null}function Fg(e,t,n=256){if(e===null||typeof e=="boolean"||typeof e=="number"&&Number.isFinite(e))return e;if(typeof e!="string"||e.length===0||e.length>n||/[\u0000-\u001f\u007f]/u.test(e))return ec;let r=hN.has(t)||/Address$/u.test(t),o=t==="coinType"?e.replace(/0x[0-9a-fA-F]{1,64}/gu,"0x1"):e,i=t==="denom"&&/^ibc\/[0-9a-fA-F]{64}$/u.test(e),s=t==="coinType"&&/^0x[0-9a-fA-F]{1,64}::[A-Za-z_][A-Za-z0-9_]*::[A-Za-z_][A-Za-z0-9_]*(?:<[^\u0000-\u001f\u007f]{1,160}>)?$/u.test(e)&&!_e(o),a=r&&(/^(?:(?:-1|0):[0-9a-fA-F]{64}|(?:0x)?[0-9a-fA-F]{64}|[1-9A-HJ-NP-Za-km-z]{64,128}|[A-Za-z0-9+/_=-]{43,128})$/u.test(e)||i||s);return _e(e)&&!a?ec:e}function re(e,t,n,r,o){let i=Fg(r,n,o);return i===ec||r===void 0?!1:(e[n]=i,t.push(n),!0)}function sd(e,t,n,r={}){let{sourceFields:o=[],...i}=r,s=Zn(t)?Object.keys(t):[],a=new Set(o.filter(u=>Object.hasOwn(t,u))),c=Math.max(0,s.length-a.size),l=!!(i.inputsTruncated||i.outputsTruncated);return{schemaVersion:od,kind:"bounded-public-facts",family:e,projected:!0,upstreamRowPreserved:!1,sourceLocatorPreserved:!0,truncated:c>0||l,selectedFieldCount:n.length,omittedTopLevelFieldCount:c,...i}}function _N(e,t){let n={},r=[];re(n,r,"transactionHash",e.hash),re(n,r,"blockNumber",e.block_number),re(n,r,"timestamp",e.timestamp),re(n,r,"fromAddress",Ge(e.from)),re(n,r,"toAddress",Ge(e.to)),re(n,r,"createdContractAddress",jo("evm",t,Ge(e.created_contract))?Ge(e.created_contract):void 0),re(n,r,"value",e.value),re(n,r,"status",e.status),re(n,r,"fee",Zn(e.fee)?e.fee.value:e.fee),re(n,r,"gasUsed",e.gas_used),re(n,r,"gasLimit",e.gas_limit),re(n,r,"nonce",e.nonce);let o=Ge(e.token);return re(n,r,"tokenAddress",typeof o=="string"&&Lt("evm",t,o)?o:void 0),re(n,r,"tokenSymbolUntrusted",e.token?.symbol,64),{facts:n,projection:sd("evm",e,r,{sourceFields:["hash","block_number","timestamp","from","to","created_contract","value","status","fee","gas_used","gas_limit","nonce","token"]})}}function TN(e,t){if(!Zn(e))return null;let n={},r=[];return re(n,r,"transactionId",/^[0-9a-f]{64}$/iu.test(String(e.txid??""))?e.txid:void 0),re(n,r,"outputIndex",e.vout),re(n,r,"coinbase",e.is_coinbase),re(n,r,"sequence",e.sequence),re(n,r,"address",typeof e.prevout?.scriptpubkey_address=="string"&&Lt("bitcoin",t,e.prevout.scriptpubkey_address)?e.prevout.scriptpubkey_address:void 0),re(n,r,"value",e.prevout?.value),Object.keys(n).length?n:null}function NN(e,t,n){if(!Zn(e))return null;let r={index:t},o=[];return re(r,o,"address",typeof e.scriptpubkey_address=="string"&&Lt("bitcoin",n,e.scriptpubkey_address)?e.scriptpubkey_address:void 0),re(r,o,"value",e.value),re(r,o,"scriptType",e.scriptpubkey_type,64),r}function CN(e,t){let n={},r=[];re(n,r,"transactionId",e.txid),re(n,r,"version",e.version),re(n,r,"locktime",e.locktime),re(n,r,"size",e.size),re(n,r,"weight",e.weight),re(n,r,"fee",e.fee);let o={},i=[];re(o,i,"confirmed",e.status?.confirmed),re(o,i,"blockHeight",e.status?.block_height),re(o,i,"blockHash",/^[0-9a-f]{64}$/iu.test(String(e.status?.block_hash??""))?e.status.block_hash:void 0),re(o,i,"blockTime",e.status?.block_time),Object.keys(o).length&&(n.status=o,r.push("status"));let s=Array.isArray(e.vin)?e.vin:[],a=Array.isArray(e.vout)?e.vout:[],c=s.slice(0,Ja).map(u=>TN(u,t)).filter(Boolean),l=a.slice(0,Ja).map((u,d)=>NN(u,d,t)).filter(Boolean);return c.length&&(n.inputs=c,r.push("inputs")),l.length&&(n.outputs=l,r.push("outputs")),{facts:n,projection:sd("bitcoin",e,r,{sourceFields:["txid","version","locktime","size","weight","fee","status","vin","vout"],inputCount:s.length,inputSelected:c.length,inputsTruncated:s.length>Ja,outputCount:a.length,outputSelected:l.length,outputsTruncated:a.length>Ja})}}function to(e,t,n){let r={},o=[],i=[];for(let[s,a,c,l]of n){let u=typeof a=="function"?a(t):pe(t,a);re(r,o,s,u,c),typeof a=="string"?i.push(a):typeof l=="string"&&i.push(l)}return{facts:r,projection:sd(e,t,o,{sourceFields:i})}}function nc(e,t,n){return e==="evm"?_N(n,t):e==="bitcoin"?CN(n,t):e==="solana"?to(e,n,[["signature","signature"],["slot","slot"],["blockTime","blockTime"],["confirmationStatus","confirmationStatus",64],["errorPresent",r=>pe(r,"err")!==null&&pe(r,"err")!==void 0,void 0,"err"]]):e==="hyperliquid"?to(e,n,[["coin","coin",64],["price","px"],["size","sz"],["side","side",16],["time","time"],["startPosition","startPosition"],["direction","dir",64],["closedPnl","closedPnl"],["transactionHash","hash"],["orderId","oid"],["crossed","crossed"],["fee","fee"],["tradeId","tid"],["feeToken","feeToken",64],["builderFee","builderFee"],["twapId","twapId"]]):e==="tron"?to(e,n,[["transactionId","txId"],["fromAddress","from"],["toAddress","to"],["direction","direction",16],["rawAmount","raw"],["amount","amount"],["tokenSymbolUntrusted","symbol",64],["decimals","decimals"],["tokenAddress","tokenAddress"],["blockTimestamp","blockTimestamp"],["type","type",64]]):e==="ton"?to(e,n,[["transactionHash","hash"],["logicalTime","lt"],["unixTime","utime"],["feeNano","feeNano"],["inMessageValueNano","inMessageValueNano"],["inMessageSourceAddress","inMessageSource"],["inMessageDestinationAddress","inMessageDestination"],["outMessageCount","outMessageCount"],["outMessageValueNano","outMessageValueNano"]]):e==="cosmos"?to(e,n,[["denom","denom"],["amount","amount"],["ibcHash","ibcHash"],["native","native"],["symbol","symbol",64],["decimals","decimals"],["display","display"]]):e==="aptos"?to(e,n,[["coinType","coinType"],["rawAmount","raw"],["decimals","decimals"],["symbol","symbol",64],["amount","amount"],["frozen","frozen"]]):to(e,n,[["provider","provider",64],["address","address"],["transactionCount","txCount"],["balanceSats","balanceSats"],["confidential","confidential"]])}function Ho(e,t,n=null,r=0){if(!t)return;let o=n??{nodes:0,active:new Set};if(o.nodes+=1,o.nodes>1e5||r>12)throw new Error("investigator collector: projected provider response exceeded the credential guard bound");if(e!=null){if(["string","number","boolean"].includes(typeof e)){if(String(e).includes(t))throw new Error("investigator collector: provider response reflected its attached credential");return}if(!e||typeof e!="object"||rd.isProxy(e)||o.active.has(e))throw new Error("investigator collector: projected provider response is not own-data JSON");o.active.add(e);try{if(Array.isArray(e)){for(let i=0;i<e.length;i+=1){let s=Object.getOwnPropertyDescriptor(e,String(i));if(!s||!Object.hasOwn(s,"value"))throw new Error("investigator collector: projected provider response is not own-data JSON");Ho(s.value,t,o,r+1)}return}for(let i of Object.keys(e)){if(i.includes(t))throw new Error("investigator collector: provider response reflected its attached credential");let s=Object.getOwnPropertyDescriptor(e,i);if(!s||!Object.hasOwn(s,"value"))throw new Error("investigator collector: projected provider response is not own-data JSON");Ho(s.value,t,o,r+1)}}finally{o.active.delete(e)}}}function jg(e,t=256){return typeof e=="string"&&e.length>0&&e.length<=t&&!/[\u0000-\u001f\u007f]/u.test(e)&&!_e(e)}function vn(e,t=100,{nullable:n=!0}={}){return e==null?n:Number.isSafeInteger(e)&&e>=0?!0:typeof e=="string"&&e.length>0&&e.length<=t&&/^\d+$/u.test(e)&&!_e(e)}function RN(e,t=100,{nullable:n=!0}={}){return e==null?n:typeof e=="number"?Number.isFinite(e):typeof e=="string"&&e.length>0&&e.length<=t&&/^-?\d+(?:\.\d+)?$/u.test(e)&&!_e(e)}function Fo(e,{nullable:t=!0,iso:n=!1}={}){return e==null?t:Number.isSafeInteger(e)&&e>=0?!0:jg(e,64)?/^\d{1,20}$/u.test(e)?!0:n&&Number.isFinite(Date.parse(e)):!1}function PN(e){if(typeof e!="string"||Er(e)||!/^[A-Za-z0-9+/_-]{43}=?$/u.test(e))return!1;try{let t=Buffer.from(e.replace(/-/gu,"+").replace(/_/gu,"/"),"base64");return t.length===32&&!Ar(t)}catch{return!1}}function jo(e,t,n){return n==null||typeof n=="string"&&Lt(e,t,n)}function Hg(e,t,n){return`${e}:${String(t)}:${n}`}function Lg(e,t,n){let r=Ge(n);return typeof r=="string"&&Lt(e,t,r)?Hg(e,t,an(e,r)):null}function zo(e,t,n){return typeof t=="string"&&typeof n=="string"&&an(e,t)===an(e,n)}function LN(e,t,n){let r=Array.isArray(e.vin)?e.vin:[],o=Array.isArray(e.vout)?e.vout:[];return r.some(i=>{let s=i?.prevout?.scriptpubkey_address;return typeof s=="string"&&Lt("bitcoin",t,s)&&zo("bitcoin",s,n)})||o.some(i=>{let s=i?.scriptpubkey_address;return typeof s=="string"&&Lt("bitcoin",t,s)&&zo("bitcoin",s,n)})}function $N(e,t,n,r){if(!Zn(r))return!1;if(e==="evm")return/^0x[0-9a-fA-F]{64}$/u.test(String(r.hash||""))&&jo("evm",t,Ge(r.from))&&jo("evm",t,Ge(r.to))&&jo("evm",t,Ge(r.created_contract))&&[Ge(r.from),Ge(r.to),Ge(r.created_contract)].some(o=>zo("evm",o,n))&&vn(r.block_number,32)&&vn(r.value,100)&&Fo(r.timestamp,{iso:!0});if(e==="solana")return Ma(r.signature)&&Number.isSafeInteger(r.slot)&&r.slot>=0&&Fo(r.blockTime);if(e==="bitcoin")return/^[0-9a-f]{64}$/iu.test(String(r.txid||""))&&Zn(r.status)&&LN(r,t,n)&&(r.status.confirmed==null||typeof r.status.confirmed=="boolean")&&vn(r.status.block_height,32)&&(r.status.block_hash==null||/^[0-9a-f]{64}$/iu.test(String(r.status.block_hash)))&&Fo(r.status.block_time);if(e==="hyperliquid"){let o=jg(r.coin,64)&&/^[A-Za-z0-9@._:/-]+$/u.test(r.coin),i=r.hash==null||/^0x[0-9a-f]{64}$/iu.test(String(r.hash)),s=r.tid==null||vn(r.tid,32,{nullable:!1});return o&&i&&s&&(r.hash!=null||r.tid!=null)&&RN(r.sz,100,{nullable:!1})&&!String(r.sz).startsWith("-")&&Fo(r.time)}return e==="tron"?/^[0-9a-f]{64}$/iu.test(String(r.txId||""))&&typeof r.from=="string"&&Lt("tron",t,r.from)&&typeof r.to=="string"&&Lt("tron",t,r.to)&&[r.from,r.to].some(o=>zo("tron",o,n))&&typeof r.tokenAddress=="string"&&Lt("tron",t,r.tokenAddress)&&vn(r.raw,100,{nullable:!1})&&Fo(r.blockTimestamp):e==="ton"?PN(r.hash)&&vn(r.lt,40,{nullable:!1})&&jo("ton",t,r.inMessageSource)&&jo("ton",t,r.inMessageDestination)&&[r.inMessageSource,r.inMessageDestination].some(o=>zo("ton",o,n))&&vn(r.inMessageValueNano,100)&&Fo(r.utime):!1}function DN(e,t){return e==="hyperliquid"?Array.isArray(t)?t:null:rc(t)?e==="evm"||e==="bitcoin"||e==="ton"?pe(t,"transactions")??null:e==="solana"?pe(t,"signatures")??null:e==="tron"?pe(t,"transfers")??null:null:null}function $g(e,t,n){if(e==="evm")return{type:"transaction",from:Ge(n.from)?an("evm",Ge(n.from)):null,to:Ge(n.to)??Ge(n.created_contract)?an("evm",Ge(n.to)??Ge(n.created_contract)):null,asset:Lg("evm",t,n.token),amount:n.value==null?null:String(n.value),transactionId:n.hash,blockHeight:n.block_number==null?null:String(n.block_number),timestamp:n.timestamp??null,locator:{transactionId:n.hash,blockHeight:n.block_number??null}};if(e==="solana")return{type:"signature",from:null,to:null,asset:null,amount:null,transactionId:n.signature,blockHeight:null,timestamp:n.blockTime??null,locator:{signature:n.signature,slot:n.slot}};if(e==="bitcoin")return{type:"transaction",from:null,to:null,asset:null,amount:null,transactionId:n.txid,blockHeight:n.status.block_height==null?null:String(n.status.block_height),timestamp:n.status.block_time??null,locator:{transactionId:n.txid,height:n.status.block_height??null}};if(e==="hyperliquid"){let r=Fg(n.coin,"coin",64);return{type:"fill",from:null,to:null,asset:r===ec?null:Hg("hyperliquid",t,r),amount:n.sz==null?null:String(n.sz),transactionId:n.hash??String(n.tid),blockHeight:null,timestamp:n.time??null,locator:{transactionId:n.hash??null,tradeId:n.tid??null}}}return e==="tron"?{type:"token-transfer",from:n.from?an("tron",n.from):null,to:n.to?an("tron",n.to):null,asset:Lg("tron",t,n.tokenAddress),amount:n.raw==null?null:String(n.raw),transactionId:n.txId,blockHeight:null,timestamp:n.blockTimestamp??null,locator:{transactionId:n.txId,fromAddress:n.from??null,toAddress:n.to??null,tokenAddress:n.tokenAddress??null,rawAmount:n.raw==null?null:String(n.raw),blockTimestamp:n.blockTimestamp??null}}:{type:"transaction",from:n.inMessageSource?an("ton",n.inMessageSource):null,to:n.inMessageDestination?an("ton",n.inMessageDestination):null,asset:null,amount:n.inMessageValueNano==null?null:String(n.inMessageValueNano),transactionId:n.hash,blockHeight:null,timestamp:n.utime??null,locator:{transactionId:n.hash,logicalTime:n.lt}}}function UN(e){let t=e.entities[0].id,n=new Map([[e.subject.address,t]]);for(let r of e.events)for(let o of["from","to"]){let i=r[o];if(!i)continue;let s=an(e.subject.family,i),a=n.get(s);a||(a=qg(e.subject.family,e.subject.chain,s),n.set(s,a),e.entities.push({id:a,family:e.subject.family,chain:e.subject.chain,address:s,kind:"address"})),r[o]=a}}function zg(e,t){if(rd.isProxy(e)||!Array.isArray(e))throw new Error("investigator collector: provider rows must be an array");if(e.length>1e4)throw new Error("investigator collector: provider row count exceeds the bound");let n=Math.min(e.length,t),r=new Array(n);for(let o=0;o<n;o+=1){let i=Object.getOwnPropertyDescriptor(e,String(o));if(!i||!Object.hasOwn(i,"value"))throw new Error("investigator collector: provider rows must contain dense own data");r[o]=nd(i.value)}return r}function BN(e,t,n,r,o,i,s,a){let c=zg(o,n.applied+1);if(c.some(A=>!$N(e.family,e.chain,e.address,A)))throw new Error(`${t.source} returned a malformed history row`);let l=c.length>n.applied,u=c.slice(0,n.applied),d=!!(!Array.isArray(r)&&pe(r,"truncated")),p=Array.isArray(r)?null:pe(r,"nextCursor")??null;for(let A of u)Ho(nc(e.family,e.chain,A).facts,a),Ho($g(e.family,e.chain,A),a);Ho(p,a);let f=!!(!Array.isArray(r)&&pe(r,"continuationUnknown")),m=!Array.isArray(r)&&pe(r,"pageComplete")===!0,h=p!=null&&!t.cursor,y=u.length===n.applied&&p==null&&!m,g=[];(d||l)&&g.push(Xn("response-truncated","provider facts exceeded the safe record bound; omitted facts are not represented as complete")),(f||y||h)&&g.push(Xn("continuation-unknown","the page reached its bound without a usable continuation")),e.family==="tron"&&g.push(Xn("native-history-not-covered","this source covers TRC20 transfers, not native TRX transactions"));let E=d||l||f||h||y||e.family==="tron",v=null;if(t.cursor&&p!=null&&!l)try{v=Zy({family:e.family,chain:e.chain,address:e.address,provider:t.source},p)}catch{g.push(Xn("invalid-provider-cursor","the provider returned an invalid next cursor; collected facts were retained without continuation")),E=!0}let S=oc(e,E?"PARTIAL":"COMPLETE",{mode:t.mode,source:t.source,requestedLimit:n.requested,appliedLimit:n.applied,returned:u.length,historyAvailable:!0,cursorSupported:t.cursor},g),I=new Set,k=new Set;return u.forEach(A=>{let w=$g(e.family,e.chain,A),b=nc(e.family,e.chain,A),x=Ji("evidence",{family:e.family,chain:e.chain,address:e.address,source:t.source,locator:w.locator,publicFacts:b.facts}),C=Ji("event",{family:e.family,chain:e.chain,address:e.address,source:t.source,type:w.type,locator:w.locator,from:w.from,to:w.to,asset:w.asset,amount:w.amount,transactionId:w.transactionId,blockHeight:w.blockHeight,timestamp:w.timestamp});if(I.has(C))throw new Error(`${t.source} returned duplicate event identity`);if(k.has(x))throw new Error(`${t.source} returned duplicate evidence identity`);I.add(C),k.add(x),S.evidence.push({id:x,status:"OBSERVED",source:t.source,observedAt:i,locator:w.locator,publicFacts:b.facts,projection:b.projection}),S.events.push({id:C,type:w.type,from:w.from,to:w.to,asset:w.asset,amount:w.amount,transactionId:w.transactionId,blockHeight:w.blockHeight,timestamp:w.timestamp,evidenceRefs:[x]})}),UN(S),t.cursor&&(S.cursor={requested:s,next:v}),S}function qN(e,t){return rc(t)?e==="liquid"?pe(t,"provider")==="liquid-esplora"&&Number.isFinite(pe(t,"txCount"))?[t]:null:pe(t,"balances")??null:null}function MN(e,t,n,r){if(!Zn(r))return!1;if(e==="cosmos"){let o=/^ibc\/[0-9a-f]{64}$/iu.test(String(r.denom??""));return typeof r.denom=="string"&&r.denom.length>0&&r.denom.length<=256&&!/[\u0000-\u001f\u007f]/u.test(r.denom)&&(!_e(r.denom)||o)&&vn(r.amount,100,{nullable:!1})}if(e==="aptos"){let o=String(r.coinType??""),i=/^0x[0-9a-f]{1,64}::[A-Za-z_][A-Za-z0-9_]*::[A-Za-z_][A-Za-z0-9_]*(?:<[^\u0000-\u001f\u007f]{1,160}>)?$/u.test(o),s=o.replace(/0x[0-9a-f]{1,64}/gu,"0x1");return i&&!_e(s)&&vn(r.raw,100,{nullable:!1})}return e==="liquid"?r.provider==="liquid-esplora"&&Number.isSafeInteger(r.txCount)&&r.txCount>=0&&typeof r.address=="string"&&Lt("liquid",t,r.address)&&zo("liquid",r.address,n)&&r.confidential===id(r.address)&&(r.balanceSats===null||vn(r.balanceSats,100,{nullable:!1})):!1}function FN(e,t,n,r,o,i,s){let a=zg(o,n.applied+1);if(a.some(f=>!MN(e.family,e.chain,e.address,f)))throw new Error(`${t.source} returned a malformed evidence row`);let c=a.slice(0,n.applied);for(let f of c)Ho(nc(e.family,e.chain,f).facts,s);let l=!!pe(r,"truncated")||a.length>n.applied,u=[Xn("history-unavailable",`${e.family} collection is evidence-only; no transaction events were collected`)];if(e.family==="aptos"&&u.push(Xn("fungible-assets-unavailable","Aptos collection enumerates legacy CoinStore resources only; Fungible Asset balances were not checked")),e.family==="liquid"&&c.some(f=>f.balanceSats===null)){let f=c.some(m=>m.confidential===!0);u.push(Xn("asset-balances-unavailable",f?"Liquid balance values are blinded for this confidential address":"Liquid Esplora did not expose per-asset sums for this unconfidential multi-asset address"))}l&&u.push(Xn("response-truncated","provider evidence exceeded the safe record bound"));let d=oc(e,"PARTIAL",{mode:t.mode,source:t.source,requestedLimit:n.requested,appliedLimit:n.applied,returned:c.length,historyAvailable:!1,cursorSupported:!1,...e.family==="aptos"?{holdingCoverage:"legacy-coinstore-only"}:{},...e.family==="liquid"?{balanceCoverage:c.some(f=>f.balanceSats===null)?"unavailable":"provider-supplied"}:{}},u),p=new Set;return c.forEach(f=>{let m=nc(e.family,e.chain,f),h=Ji("evidence",{family:e.family,chain:e.chain,address:e.address,source:t.source,locator:{address:e.address},publicFacts:m.facts});if(p.has(h))throw new Error(`${t.source} returned duplicate evidence identity`);p.add(h),d.evidence.push({id:h,status:"OBSERVED",source:t.source,observedAt:i,locator:{address:e.address},publicFacts:m.facts,projection:m.projection})}),d}async function Vg(e={},t={}){bN(t);let n=Bg(e),{family:r,chain:o,address:i,limits:s,cursor:a,capability:c}=n,l={family:r,chain:o,address:i},u=wN(t);if(c.status==="UNAVAILABLE"||c===Qn.unsupported)return Qa(l,c,u);if(!c.chainIds.some(y=>String(y)===String(o)))return Qa(l,{...c,reason:`${r} wallet evidence is not available for chainId ${String(o)}`},u);if(r==="evm"&&!cg(o))return Qa(l,{...c,reason:`Blockscout transaction history is not configured for EVM chainId ${o}`},u);let d=kN(r),p=ON(r,c,t,d);if(typeof p!="function")return Qa(l,{...c,reason:"collector transport is unavailable"},u);let f=a?.payload??null,m=Object.assign(Object.create(null),{address:i,chainId:o,limit:s.applied,cursor:f});r==="solana"&&(m.before=f),r==="tron"&&(m.contract="all",m.onlyConfirmed=!0),r==="ton"&&f&&(m.lt=f.lt,m.hash=f.hash);let h;try{h=await p(m)}catch(y){return td(l,c,s,Za(y),u,a)}if(pe(h,"error")){let y=Fy(h),g=y?Object.assign(Object.create(null),{...y.status===null?{}:{status:y.status},...y.code==="provider-response-too-large"?{oversize:!0}:y.code==="provider-timeout"?{oracleTimeout:!0}:{}}):null,E=y?.status!==null&&y?.status!==void 0?"provider-unavailable":"provider-rejected";return td(l,c,s,Za(g,E),u,a)}try{if(["cosmos","aptos","liquid"].includes(r)){let g=qN(r,h);if(!Array.isArray(g))throw new Error("invalid evidence-only response");return FN(l,c,s,h,g,u,d)}let y=DN(r,h);if(!Array.isArray(y))throw new Error("invalid history response");return BN(l,c,s,h,y,u,a,d)}catch{return td(l,c,s,Za(null,"provider-invalid-response"),u,a)}}var jN=Object.freeze(Object.create(null));async function Wg(e={},...t){if(t.length!==0)throw new Error("onchain-investigator: collector options are not accepted on the public surface");return Vg(e,jN)}import{createHash as HN}from"node:crypto";import{types as vt}from"node:util";var zN="oracle.coordination/1",r5=Rt({UNKNOWN:"UNKNOWN",LOW:"LOW",MEDIUM:"MEDIUM",HIGH:"HIGH"}),o5=Rt({UNKNOWN:"UNKNOWN",LOW:"LOW",MEDIUM:"MEDIUM",HIGH:"HIGH"}),VN=Object.freeze({COMMON_NON_SERVICE_FUNDER:18,DEPLOYER_LINKED_BUYERS:22,EXPLICIT_BRIDGE_LINK:5,FRESH_WALLET_CLUSTER:18,LP_REMOVAL:20,PEEL_CHAIN:18,SUPPLY_CONCENTRATION:18,SYNCHRONIZED_ACTIVITY:18}),cn=Object.freeze({maxEntities:Wt.maxNodes,maxEvents:Wt.maxEdges,maxEvidence:De.evidence,minClusterSize:3,minCommonRecipients:2,syncWindowSeconds:60,freshWalletSeconds:86400,peelWindowSeconds:86400,maxPeelDepth:6,concentrationThresholdBps:5e3}),Qi=new Set(["BUY","SELL","SWAP","MINT","ORDER"]),Zi=new Set(["FUND","FUNDING"]),tb=new Set([...Qi,...Zi,"BRIDGE","DEPLOY","LIQUIDITY_REMOVE","LP_REMOVE","SUPPLY_SNAPSHOT","TRANSFER"]),WN=new Set(["BRIDGE","BURN","CEX","EXCHANGE","LP","POOL","ROUTER","SERVICE"]),GN=new Set(["CREATOR","DEPLOYER"]),Gg=new Set(Gi),Kg=new Set(["LIVE","INDEXED"]);var Yg=250,KN=32,YN=32,Me=(e,t)=>e<t?-1:e>t?1:0,Fe=e=>{if(typeof e!="string")return null;let t=e.trim();return t&&t.length<=512&&!/[\u0000-\u001f\u007f]/u.test(t)?t:null},$t=e=>(Fe(e)??"UNKNOWN").toUpperCase().replace(/[^A-Z0-9]+/gu,"_").replace(/^_+|_+$/gu,"")||"UNKNOWN",at=e=>Fe(typeof e=="object"&&e!==null?L(e,"id"):e),Ke=e=>[...new Set(e.filter(Boolean))].sort(Me),JN=(e,t)=>Me(e.id,t.id),xn=(e,t,n,r)=>{let o=typeof e=="number"&&Number.isFinite(e)?Math.trunc(e):t;return Math.max(n,Math.min(r,o))},XN=/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})(?:\.(\d{1,3}))?(Z|[+-]\d{2}:\d{2})$/u,fd=e=>{if(typeof e=="number"&&Number.isFinite(e))return Math.trunc(e);let t=Fe(e);if(!t)return null;let n=XN.exec(t);if(!n)return null;let[,r,o,i,s,a,c,l="",u]=n,[d,p,f,m,h,y]=[r,o,i,s,a,c].map(Number);if(p<1||p>12||f<1||m>23||h>59||y>59)return null;if(u!=="Z"){let[S,I]=u.slice(1).split(":").map(Number);if(S>23||I>59)return null}let g=Number(l.padEnd(3,"0")),E=new Date(0);if(E.setUTCFullYear(d,p-1,f),E.setUTCHours(m,h,y,g),E.getUTCFullYear()!==d||E.getUTCMonth()!==p-1||E.getUTCDate()!==f||E.getUTCHours()!==m||E.getUTCMinutes()!==h||E.getUTCSeconds()!==y)return null;let v=Date.parse(t);return Number.isFinite(v)?v:null},nb=e=>Array.isArray(e)?e:[],L=(e,t)=>{if(e==null||(typeof e=="object"||typeof e=="function")&&vt.isProxy(e)||!Object.hasOwn(Object(e),t))return;let n=Object.getOwnPropertyDescriptor(Object(e),t);return n&&Object.hasOwn(n,"value")?n.value:void 0},Se=(e,t=64)=>{if(Ir(e,t))return[];if(!Array.isArray(e))return[];let n=[],r=Math.min(e.length,t);for(let o=0;o<r;o+=1){let i=Object.getOwnPropertyDescriptor(e,String(o));i&&Object.hasOwn(i,"value")&&n.push(i.value)}return n},Ir=(e,t=64)=>{if(e==null)return!1;if(vt.isProxy(e)||!Array.isArray(e)||Object.getPrototypeOf(e)!==Array.prototype||e.length>t||Object.getOwnPropertySymbols(e).length>0)return!0;let n=new Set(["length"]);for(let r=0;r<e.length;r+=1)n.add(String(r));for(let r of Object.getOwnPropertyNames(e)){let o=Object.getOwnPropertyDescriptor(e,r);if(!(r==="toJSON"&&o&&Object.hasOwn(o,"value")&&o.value===void 0&&o.enumerable===!1)&&!n.has(r))return!0}for(let r=0;r<e.length;r+=1){let o=Object.getOwnPropertyDescriptor(e,String(r));if(!o||!o.enumerable||!Object.hasOwn(o,"value"))return!0}return!1},er=(e,t={})=>Object.assign(Object.create(null),e,t),sc=(e,t)=>{let n=Object.create(null);for(let r of t){let o=Object.getOwnPropertyDescriptor(e,r);o&&Object.hasOwn(o,"value")&&(n[r]=o.value)}return n},ad=Object.freeze(["id","family","chain","address","kind","roles","tags","isService","fresh","txCount","firstSeenAt","createdAt","supplyShare","evidenceRefs","data"]),QN=Object.freeze(["id","status"]),cd=Object.freeze(["id","type","from","fromEntityId","funderId","to","toEntityId","recipientId","actor","actorEntityId","buyerId","asset","assetId","tokenId","timestamp","amount","value","quantity","totalSupply","supply","holders","pool","poolId","sourceChain","fromChain","destinationChain","toChain","bridgeTransferId","transactionId","transactionHash","txId","txid","hash","blockHeight","blockNumber","transactionIndex","logIndex","eventIndex","index","evidenceRefs","data"]),ZN=Object.freeze(["entityId","entity","holder","balance","amount","evidenceRefs"]),e1=Object.freeze(["numerator","denominator","bps"]),t1=Object.freeze(["id","kind","status","source","observedAt","subject","locator","data","raw","digest","publicFacts","projection"]),n1=Object.freeze(["id","code","message","reason","status","evidenceIds","evidenceRefs","nodeId","depth","data"]);function rb(e){return Ke([$t(L(e,"kind")),...Se(L(e,"roles")).map($t),...Se(L(e,"tags")).map(t=>$t(!t||typeof t!="object"?t:L(t,"name")??L(t,"value")))])}function md(e){return e?L(e,"isService")===!0?!0:rb(e).some(t=>WN.has(t)||t.endsWith("_SERVICE")||t.endsWith("_EXCHANGE")):!1}function ob(e){return GN.has(e)||e.endsWith("_DEPLOYER")||e.endsWith("_CREATOR")}function ic(e){return rb(e).some(ob)}function r1(e){if(!ic(e)||md(e))return!1;for(let r of["isService","fresh","txCount","firstSeenAt","createdAt","supplyShare"])if(L(e,r)!==void 0)return!1;let t=Se(L(e,"roles")).map($t),n=Se(L(e,"tags")).map(r=>$t(r&&typeof r=="object"?L(r,"name")??L(r,"value"):r));return[...t,...n].every(ob)}function Dt(e){if(typeof e=="string"&&e.length<=512&&/^\d+(?:\.\d+)?$/u.test(e)){let[i,s=""]=e.split(".");return{raw:`${i}${s}`.replace(/^0+(?=\d)/u,""),decimals:s.length}}if(!e||typeof e!="object"||vt.isProxy(e)||Array.isArray(e))return null;let t=i=>{if(!Object.hasOwn(e,i))return{present:!1,value:void 0};let s=Object.getOwnPropertyDescriptor(e,i);return!s||!Object.hasOwn(s,"value")?{present:!0,invalid:!0}:{present:!0,value:s.value}},n=t("decimals");if(n.invalid||n.present&&n.value!=null&&(!Number.isInteger(n.value)||n.value<0||n.value>255))return null;let r=n.value==null?0:n.value,o=[];for(let i of["raw","atoms","baseUnits"]){let s=t(i);if(s.invalid)return null;if(!(!s.present||s.value==null)){if(typeof s.value!="string"||!/^\d+$/u.test(s.value)||s.value.length>512)return null;o.push(s.value.replace(/^0+(?=\d)/u,""))}}for(let i of["value","decimal","amount"]){let s=t(i);if(s.invalid)return null;if(!s.present||s.value==null)continue;if(typeof s.value!="string"||!/^\d+(?:\.\d+)?$/u.test(s.value)||s.value.length>512)return null;let[a,c=""]=s.value.split(".");if(c.length>r)return null;o.push(`${a}${c.padEnd(r,"0")}`.replace(/^0+(?=\d)/u,""))}return o.length===0||new Set(o).size!==1?null:{raw:o[0],decimals:r}}function Wo(e,t){return!e||e.decimals>t?null:BigInt(e.raw)*10n**BigInt(t-e.decimals)}function ib(e,t){if(!e||!t)return null;let n=Math.max(e.decimals,t.decimals),r=Wo(e,n),o=Wo(t,n);return r===null||o===null||o<=0n||r<0n||r>o?null:{numerator:r,denominator:o}}function o1(e,t){let n=ib(e,t);return n?Number(n.numerator*10000n/n.denominator):null}function i1(e,t){if(!e||t.length===0)return!1;let n=Math.max(e.decimals,...t.map(i=>i.balance.decimals)),r=Wo(e,n);if(r===null||r<=0n)return!1;let o=0n;for(let i of t){let s=Wo(i.balance,n);if(s===null||s<0n||s>r||(o+=s,o>r))return!1}return!0}function sb(e){if(e&&typeof e=="object"){if(vt.isProxy(e)||Array.isArray(e)||!Ko(e,e1)||Object.keys(e).some(f=>!["numerator","denominator","bps"].includes(f)))return null;let a=L(e,"numerator"),c=L(e,"denominator"),l=L(e,"bps"),u=a!=null||c!=null,d=null;if(u&&(a==null||c==null||(d=ib(Dt(a),Dt(c)),!d)))return null;let p=null;if(l!=null){if(!Number.isInteger(l)||l<0||l>1e4)return null;p={numerator:BigInt(l),denominator:10000n}}return!d&&!p||d&&p&&Number(d.numerator*10000n/d.denominator)!==l?null:d??p}let t=Fe(e);if(!t||!/^\d+(?:\.\d+)?$/u.test(t))return null;let[n,r=""]=t.split("."),o=10n**BigInt(r.length),i=BigInt(`${n}${r}`),s=i<=o?o:o*100n;return i<=s?{numerator:i,denominator:s}:null}function s1(e){if(!Array.isArray(e)||e.length>Wt.maxNodes)return!1;let t=[];for(let n of e){if(!n||typeof n.numerator!="bigint"||typeof n.denominator!="bigint"||n.numerator<0n||n.denominator<=0n||n.numerator>n.denominator)return!1;t.push(n)}for(;t.length>1;){let n=[];for(let r=0;r<t.length;r+=2){if(r+1>=t.length){n.push(t[r]);continue}let o=t[r],i=t[r+1],s=o.numerator*i.denominator+i.numerator*o.denominator,a=o.denominator*i.denominator;if(s>a)return!1;n.push({numerator:s,denominator:a})}t=n}return t.length===0||t[0].numerator<=t[0].denominator}function a1(e){let t=sb(e);return t?Number(t.numerator*10000n/t.denominator):null}var Vo=Symbol("alias-conflict");function Gt(e,t,n){let r=null,o=null;for(let i of t){if(!Object.hasOwn(e,i))continue;let s=Object.getOwnPropertyDescriptor(e,i);if(!s||!Object.hasOwn(s,"value"))return Vo;let a=s.value;if(a==null)continue;let c=n(a);if(c==null)return Vo;let l=typeof c=="object"?c.identity:c,u=typeof c=="object"&&Object.hasOwn(c,"value")?c.value:c;if(o!==null&&l!==o)return Vo;r=u,o=l}return r}function hd(e,t=64){if(e===void 0)return[];if(Ir(e,t))return null;let n=Se(e,t).map(at);return n.some(r=>!r)||new Set(n).size!==n.length?null:n.sort(Me)}function ab(e){let t=e.raw,n=e.decimals;for(;n>0&&t.endsWith("0");)t=t.slice(0,-1),n-=1;return`${t||"0"}:${n}`}function pd(e,t){return Gt(e,t,n=>{let r=Dt(n);return r?{identity:ab(r),value:n}:null})}function ld(e,t){return Gt(e,t,n=>{let r;if(Number.isSafeInteger(n)&&n>=0)r=String(n);else if(typeof n=="string"&&/^\d{1,40}$/u.test(n.trim()))r=n.trim().replace(/^0+(?=\d)/u,"");else return null;return{identity:r,value:r}})}function Ko(e,t){let n=Object.getPrototypeOf(e);if(n!==Object.prototype&&n!==null||Object.getOwnPropertySymbols(e).length>0)return!1;let r=Object.getOwnPropertyNames(e).filter(s=>{let a=Object.getOwnPropertyDescriptor(e,s);return!(s==="toJSON"&&a&&Object.hasOwn(a,"value")&&a.value===void 0)});if(r.length>t.length)return!1;let o=new Set(t),i={nodes:0,fields:0,active:new Set([e])};for(let s of r){if(!o.has(s))return!1;let a=Object.getOwnPropertyDescriptor(e,s);if(!a||!a.enumerable||!Object.hasOwn(a,"value")||!Go(a.value,i,0))return!1}return!0}function Go(e,t=null,n=0){let r=t??{nodes:0,fields:0,active:new Set};if(r.nodes+=1,r.nodes>De.dataNodes||n>De.dataDepth)return!1;if(e==null||typeof e=="boolean")return!0;if(typeof e=="number")return Number.isFinite(e);if(typeof e=="string")return e.length<=De.string;if(!e||typeof e!="object"||vt.isProxy(e)||r.active.has(e))return!1;r.active.add(e);try{if(Array.isArray(e)){if(Object.getPrototypeOf(e)!==Array.prototype||e.length>De.dataArray)return!1;let a=Reflect.ownKeys(e),c=new Set(["length"]);for(let l=0;l<e.length;l+=1)c.add(String(l));for(let l of a){let u=Object.getOwnPropertyDescriptor(e,l);if(!(l==="toJSON"&&u&&Object.hasOwn(u,"value")&&u.value===void 0&&u.enumerable===!1)&&(typeof l!="string"||!c.has(l)))return!1}if(r.fields+=e.length,r.fields>De.dataTotalFields)return!1;for(let l=0;l<e.length;l+=1){let u=Object.getOwnPropertyDescriptor(e,String(l));if(!u||!u.enumerable||!Object.hasOwn(u,"value")||!Go(u.value,r,n+1))return!1}return!0}let o=Object.getPrototypeOf(e);if(o!==Object.prototype&&o!==null)return!1;let i=Reflect.ownKeys(e),s=[];for(let a of i){let c=Object.getOwnPropertyDescriptor(e,a);if(!(a==="toJSON"&&c&&Object.hasOwn(c,"value")&&c.value===void 0&&c.enumerable===!1)){if(typeof a!="string"||!c||!c.enumerable||!Object.hasOwn(c,"value"))return!1;s.push([a,c.value])}}return s.length>De.dataFields||(r.fields+=s.length,r.fields>De.dataTotalFields)?!1:s.every(([,a])=>Go(a,r,n+1))}finally{r.active.delete(e)}}function cb(e,t){let n=L(e,"data");if(n===void 0)return e;if(!n||typeof n!="object"||vt.isProxy(n)||Array.isArray(n)||!Go(n)||Object.getOwnPropertySymbols(n).length>0)return null;let r=Object.keys(n);if(r.length>De.dataFields)return null;let o=sc(e,t);for(let i of r){let s=Object.getOwnPropertyDescriptor(n,i);if(!s||!Object.hasOwn(s,"value"))return null;if(!(!t.includes(i)||i==="data")){if(Object.hasOwn(o,i))return null;o[i]=s.value}}return o}function c1(e){if(!e||typeof e!="object"||vt.isProxy(e)||Array.isArray(e)||!Ko(e,ZN))return null;let t=Gt(e,["entityId","entity","holder"],at),n=pd(e,["balance","amount"]),r=hd(L(e,"evidenceRefs"));return!t||t===Vo||n===Vo||n===null||r===null?null:er({},{entityId:t,balance:n,evidenceRefs:r})}function l1(e){if(!e||typeof e!="object"||vt.isProxy(e)||Array.isArray(e)||!Ko(e,ad))return null;let t=cb(e,ad);if(!t||Object.hasOwn(t,"isService")&&typeof L(t,"isService")!="boolean")return null;let n=at(L(t,"id"));if(!n)return null;for(let l of["firstSeenAt","createdAt"]){let u=L(t,l);if(u!=null&&fd(u)===null)return null}let r=L(t,"roles"),o=L(t,"tags"),i=L(t,"evidenceRefs");if([r,o,i].some(l=>Ir(l)))return null;let s=L(t,"supplyShare");if(s!==void 0&&a1(s)===null)return null;let a=sc(t,ad);a.roles=Se(r),a.tags=Se(o);let c=hd(i);return c===null?null:(a.evidenceRefs=c,er(a,{id:n}))}function u1(e){if(!e||typeof e!="object"||vt.isProxy(e)||Array.isArray(e)||!Ko(e,t1))return null;let t=at(L(e,"id"));if(!t)return null;let n=L(e,"status"),r=typeof n=="string"?n:"MISSING";return er(sc(e,QN),{id:t,status:r})}function d1(e){if(!e||typeof e!="object"||vt.isProxy(e)||Array.isArray(e)||!Ko(e,cd))return null;let t=cb(e,cd);if(!t)return null;let n=at(L(t,"id"));if(!n||Ir(L(t,"holders"))||Ir(L(t,"evidenceRefs")))return null;let r=Gt(t,["from","fromEntityId","funderId"],at),o=Gt(t,["to","toEntityId","recipientId"],at),i=Gt(t,["actor","actorEntityId","buyerId"],at),s=Gt(t,["asset","assetId","tokenId"],at),a=Gt(t,["pool","poolId"],at),c=Gt(t,["sourceChain","fromChain"],Fe),l=Gt(t,["destinationChain","toChain"],Fe),u=Gt(t,["transactionId","transactionHash","txId","txid","hash"],at),d=Gt(t,["bridgeTransferId"],at),p=ld(t,["blockHeight","blockNumber"]),f=ld(t,["transactionIndex"]),m=ld(t,["eventIndex","logIndex","index"]),h=pd(t,["amount","value","quantity"]),y=pd(t,["totalSupply","supply"]);if([r,o,i,s,a,c,l,u,d,p,f,m,h,y].includes(Vo))return null;let g=hd(L(t,"evidenceRefs"));if(g===null)return null;let E=L(t,"timestamp"),v=fd(E);if(E!=null&&v===null)return null;let I=Se(L(t,"holders")).map(c1);if(I.some(w=>w===null))return null;let k=I.map(w=>w.entityId);if(new Set(k).size!==k.length)return null;let A=sc(t,cd);return A.holders=I,er(A,{id:n,type:$t(L(t,"type")),from:r,to:o,actor:i,asset:s,pool:a,sourceChain:c,destinationChain:l,bridgeTransferId:d,transactionId:u,blockPosition:p,transactionPosition:f,eventPosition:m,amount:h,totalSupply:y,timestampMs:v,evidenceRefs:g})}function ud(e,t,n,r,o,i){if(vt.isProxy(e))return i(r,"A proxy record array was refused."),{records:[],overflow:!1,malformed:!0};if(!Array.isArray(e))return{records:[],overflow:!1,malformed:!1};if(e.length>n)return i(o,`Input exceeded the deterministic limit of ${n} record(s).`),{records:[],overflow:!0,malformed:!1};if(Ir(e,n))return i(r,"The record array must be an ordinary dense own-data array."),{records:[],overflow:!1,malformed:!0};let s=[],a=0;for(let c=0;c<e.length;c+=1){let l=Object.getOwnPropertyDescriptor(e,String(c));if(!l||!Object.hasOwn(l,"value")){a+=1;continue}let u=t(l.value);u?s.push(u):a+=1}return s.sort(JN),a>0&&i(r,`${a} malformed record(s) were ignored.`),{records:s,overflow:!1,malformed:a>0}}function Xi(e){for(let t=1;t<e.length;t+=1)if(e[t-1].id===e[t].id)return!0;return!1}function p1(e){let t=Fe(L(e,"family")),n=Fe(L(e,"address")),r=L(e,"chain"),o=Number.isSafeInteger(r)&&r>=0?String(r):Fe(r);if(!t||!o||!n)return null;let i=t.toLowerCase(),s=["evm","ethereum","eth","eip155"].includes(i)?"eip155":i,a=n;["eip155","hyperliquid"].includes(s)&&/^0x[0-9a-f]{1,40}$/iu.test(a)?a=`0x${a.slice(2).toLowerCase().padStart(40,"0")}`:(s==="cosmos"||/^0x[0-9a-f]+$/iu.test(a))&&(a=a.toLowerCase()),["aptos","sui"].includes(s)&&/^0x[0-9a-f]{1,64}$/iu.test(a)&&(a=`0x${a.slice(2).toLowerCase().padStart(64,"0")}`),s==="ton"&&(a=Mu(a)??a);let c=o.toLowerCase();if(s==="eip155"){let l=c.match(/^(?:eip155:)?(\d+)$/u)?.[1];l&&(c=BigInt(l).toString())}return`${s.length}:${s}|${c.length}:${c}|${a.length}:${a}`}function f1(e){let t=new Map;for(let n of e){let r=p1(n);if(!r)continue;let o=t.get(r);if(o&&o!==n.id)return!0;t.set(r,n.id)}return!1}function Jg(e){let t=e==null?"-":String(e);return`${t.length}:${t}`}function dd(e){let t=Dt(e);return t?ab(t):"-"}function m1(e){let t=Se(L(e,"holders")).map(n=>`${Jg(L(n,"entityId"))}:${dd(L(n,"balance"))}`).sort().join(";");return[e.type,e.from,e.to,e.actor,e.asset,e.pool,e.sourceChain,e.destinationChain,e.bridgeTransferId,e.timestampMs,dd(L(e,"amount")),dd(L(e,"totalSupply")),e.transactionId,e.blockPosition,e.transactionPosition,e.eventPosition,t].map(Jg).join("|")}function h1(e){let t=new Set;for(let n of e){let r=m1(n);if(t.has(r))return!0;t.add(r)}return!1}function tr(e,t,n,r,o,i,s=[]){let a=HN("sha256").update(String(t)).digest("hex");return{id:`coordination:${e.toLowerCase()}:${a}`,kind:e,factConfidence:i.fact,coordinationConfidence:i.coordination,entities:Ke(n),reasons:o,caveats:Ke(s),evidenceRefs:Ke(r),score:VN[e]}}function y1(e,t,n){let r=[...e].sort((u,d)=>u.timestampMs-d.timestampMs||Me(u.id,d.id)),o=[],i=new Map,s=0,a=0,c=u=>{let d=u.actor??u.from;d&&i.set(d,(i.get(d)??0)+1)},l=u=>{let d=u.actor??u.from;if(!d)return;let p=(i.get(d)??0)-1;p<=0?i.delete(d):i.set(d,p)};for(;s<r.length;){for(;a<r.length&&r[a].timestampMs-r[s].timestampMs<=t;)c(r[a]),a+=1;i.size>=n?(o.push(r.slice(s,a)),s=a,i.clear()):(l(r[s]),s+=1,a<s&&(a=s))}return o}function be(e,t){let n=Se(L(e,"evidenceRefs"));return n.length===0||n.some(r=>!t.has(r))?[]:n}function Xg(e,t){let n=Se(L(e,"evidenceRefs"));return n.length>0&&n.every(r=>t.has(r))}function qe(e,t){return typeof e=="string"&&t.has(e)}function Qg(e){let t=L(e,"type");if(!tb.has(t))return!1;let n=L(e,"from"),r=L(e,"to"),o=L(e,"actor")??n,i=L(e,"asset"),s=L(e,"timestampMs");if(Zi.has(t))return!!(n&&r);if(Qi.has(t))return!!(o&&i&&(t==="BUY"||s!==null));if(t==="BRIDGE")return!!(Fe(L(e,"sourceChain"))&&Fe(L(e,"destinationChain")));if(t==="DEPLOY")return!!o;if(t==="SUPPLY_SNAPSHOT"){let a=Se(L(e,"holders")).some(c=>at(L(c,"entityId"))&&Dt(L(c,"balance")));return!!(i&&Dt(L(e,"totalSupply"))&&a)}return t==="TRANSFER"?!!(n&&r&&i&&s!==null&&Dt(L(e,"amount"))):t==="LIQUIDITY_REMOVE"||t==="LP_REMOVE"}function es(e,t){let n=new Map;for(let r of e){let o=t(r);o&&(n.has(o)||n.set(o,[]),n.get(o).push(r))}return n}function g1(e,t,n,r,o){let i=e.filter(l=>Zi.has(l.type)&&qe(l.from,t)&&qe(l.to,t)&&be(l,n).length),s=es(i,l=>l.from),a=[],c=new Set;for(let[l,u]of[...s].sort(([d],[p])=>Me(d,p))){let d=t.get(l);if(md(d))continue;let p=Ke(u.map(y=>y.to).filter(y=>y!==l));if(p.length<r.minCommonRecipients)continue;let f=be(d,n);if(f.length===0){c.add(l);continue}let m=new Set(p),h=u.filter(y=>m.has(y.to));a.push(tr("COMMON_NON_SERVICE_FUNDER",l,[l,...p],[...f,...h.flatMap(y=>be(y,n))],[{funder:l,funderEvidenceRefs:f,recipientCount:p.length,eventIds:Ke(h.map(y=>y.id))}],{fact:"HIGH",coordination:p.length>=4?"HIGH":"MEDIUM"},["A common funding source is a coordination signal, not an identity conclusion."]))}return c.size>0&&o("FUNDER_CLASSIFICATION_EVIDENCE_UNRESOLVED",`${c.size} non-service funder premise(s) lacked usable entity evidence and were excluded.`),a}function b1(e,t,n,r){let o=e.filter(a=>Qi.has(a.type)&&qe(a.actor??a.from,t)&&a.asset&&a.timestampMs!==null&&be(a,n).length).map(a=>er(a,{actor:a.actor??a.from})),i=es(o,a=>`${a.type}\0${a.asset}`),s=[];for(let[a,c]of[...i].sort(([l],[u])=>Me(l,u)))for(let l of y1(c,r.syncWindowSeconds*1e3,r.minClusterSize)){let u=Ke(l.map(f=>f.actor)),[d,p]=a.split("\0");s.push(tr("SYNCHRONIZED_ACTIVITY",`${d.toLowerCase()}:${p}:${l[0].id}`,u,l.flatMap(f=>be(f,n)),[{activityType:d,asset:p,actorCount:u.length,windowSeconds:Math.floor((l[l.length-1].timestampMs-l[0].timestampMs)/1e3),eventIds:l.map(f=>f.id)}],{fact:"HIGH",coordination:u.length>=4?"HIGH":"MEDIUM"},["Timing proximity alone does not establish common control."]))}return s}function w1(e,t,n){if(!e)return null;if(L(e,"fresh")===!0)return"fresh";let r=L(e,"txCount");if(Number.isInteger(r)&&r>=0&&r<=2)return"txCount";let o=L(e,"firstSeenAt"),i=L(e,"createdAt"),s=o!=null?"firstSeenAt":"createdAt",a=fd(s==="firstSeenAt"?o:i);return a!==null&&t!==null&&t>=a&&t-a<=n.freshWalletSeconds*1e3?s:null}function E1(e,t,n,r,o){let i=e.filter(u=>Qi.has(u.type)&&qe(u.actor??u.from,t)&&u.asset&&u.timestampMs!==null&&be(u,n).length).map(u=>er(u,{actor:u.actor??u.from})),s=[],a=new Set;for(let u of i){let d=t.get(u.actor),p=w1(d,u.timestampMs,r);if(!p)continue;let f=be(d,n);if(f.length===0){a.add(u.actor);continue}s.push(er(u,{freshnessBasis:p,freshnessEvidenceRefs:f}))}a.size>0&&o("FRESHNESS_EVIDENCE_UNRESOLVED",`${a.size} wallet freshness premise(s) lacked fully usable evidence and were excluded where necessary.`);let c=es(s,u=>u.asset),l=[];for(let[u,d]of[...c].sort(([p],[f])=>Me(p,f))){let p=Ke(d.map(m=>m.actor));if(p.length<r.minClusterSize)continue;let f=p.map(m=>{let h=d.filter(y=>y.actor===m);return{entityId:m,bases:Ke(h.map(y=>y.freshnessBasis)),evidenceRefs:Ke(h.flatMap(y=>y.freshnessEvidenceRefs))}});l.push(tr("FRESH_WALLET_CLUSTER",u,p,[...d.flatMap(m=>be(m,n)),...f.flatMap(m=>m.evidenceRefs)],[{asset:u,walletCount:p.length,eventIds:Ke(d.map(m=>m.id)),freshnessWindowSeconds:r.freshWalletSeconds,freshness:f}],{fact:"HIGH",coordination:p.length>=4?"HIGH":"MEDIUM"},["Wallet freshness does not establish ownership or identity."]))}return l}function A1(e,t,n,r,o){let i=new Map,s=new Set,a=(m,h)=>{if(!(!qe(m,t)||h.length===0)){i.has(m)||i.set(m,new Set);for(let y of h)i.get(m).add(y)}};for(let m of t.values()){if(!ic(m))continue;let h=be(m,n);h.length===0?s.add(m.id):a(m.id,h)}for(let m of e)m.type==="DEPLOY"&&a(m.from??m.actor,be(m,n));let c=[...s].filter(m=>!i.has(m));c.length>0&&o("DEPLOYER_EVIDENCE_UNRESOLVED",`${c.length} deployer role premise(s) lacked usable entity or DEPLOY-event evidence and were excluded.`);let l=e.filter(m=>Zi.has(m.type)&&i.has(m.from)&&qe(m.to,t)&&be(m,n).length),u=es(l,m=>m.to),d=e.filter(m=>m.type==="BUY"&&qe(m.actor??m.from,t)&&m.asset&&be(m,n).length).map(m=>er(m,{actor:m.actor??m.from})),p=new Map;for(let m of d){let h=Ke(nb(u.get(m.actor)).map(y=>y.from));if(h.length>YN)return o("DEPLOYER_RELATION_LIMIT_REACHED","Deployer-to-buyer branching exceeded the deterministic analysis bound.",{fatal:!0}),[];for(let y of h){let g=`${y}\0${m.asset}`;p.has(g)||p.set(g,[]),p.get(g).push(m)}}let f=[];for(let[m,h]of[...p].sort(([y],[g])=>Me(y,g))){let y=Ke(h.map(k=>k.actor));if(y.length<Math.min(2,r.minClusterSize))continue;let[g,E]=m.split("\0"),v=new Set(y),S=l.filter(k=>k.from===g&&v.has(k.to)),I=Ke([...i.get(g)??[]]);f.push(tr("DEPLOYER_LINKED_BUYERS",`${g}:${E}`,[g,...y],[...I,...S.flatMap(k=>be(k,n)),...h.flatMap(k=>be(k,n))],[{deployer:g,asset:E,buyerCount:y.length,deployerEvidenceRefs:I,fundingEventIds:Ke(S.map(k=>k.id)),buyEventIds:Ke(h.map(k=>k.id))}],{fact:"HIGH",coordination:"HIGH"},["The link is transactional and does not establish real-world identity."]))}return f}function S1(e,t,n,r,o,i){let s=[],a=e.filter(d=>d.type==="SUPPLY_SNAPSHOT"&&d.asset&&be(d,r).length),c=0;for(let d of a){let p=Dt(L(d,"totalSupply")??L(d,"supply")),f=Se(L(d,"holders")),m=f.map(g=>{if(!g||typeof g!="object"||Array.isArray(g)||Ir(L(g,"evidenceRefs")))return null;let E=Se(L(g,"evidenceRefs")).map(at);return E.length===0||E.some(v=>!r.has(v))?null:{entityId:at(L(g,"entityId")),balance:Dt(L(g,"balance")),evidenceRefs:Ke(E)}}).filter(g=>g?.entityId&&n.has(g.entityId)&&g.balance);if(m.length!==f.length||!i1(p,m)){c+=1;continue}let y=m.map(g=>({...g,shareBps:o1(g.balance,p)})).filter(g=>g.shareBps!==null).sort((g,E)=>E.shareBps-g.shareBps||Me(g.entityId,E.entityId))[0];!y||y.shareBps<o.concentrationThresholdBps||s.push(tr("SUPPLY_CONCENTRATION",`${d.asset}:${d.id}`,[y.entityId],[...be(d,r),...y.evidenceRefs],[{asset:d.asset,topHolder:y.entityId,topHolderShareBps:y.shareBps,balance:y.balance,totalSupply:p,snapshotEventId:d.id}],{fact:"HIGH",coordination:"LOW"},["Supply concentration is a structural fact and is not proof of coordinated control."]))}if(c>0&&i("SUPPLY_SEMANTICS_UNRESOLVED",`${c} supply snapshot(s) had impossible or incomplete total/holder arithmetic and were excluded.`),a.length)return s;let l=t.map(d=>{let p=sb(d.supplyShare);return p?{entity:d,fraction:p,shareBps:Number(p.numerator*10000n/p.denominator)}:null}).filter(Boolean).sort((d,p)=>p.shareBps-d.shareBps||Me(d.entity.id,p.entity.id));if(!s1(l.map(d=>d.fraction)))return i("SUPPLY_SEMANTICS_UNRESOLVED","Entity supply shares exceeded the total and were excluded."),s;let u=l[0];if(u&&u.shareBps>=o.concentrationThresholdBps){let d=Se(L(u.entity,"evidenceRefs")).map(at),p=d.length>0&&d.every(f=>r.has(f))?Ke(d):[];p.length&&s.push(tr("SUPPLY_CONCENTRATION",u.entity.id,[u.entity.id],p,[{topHolder:u.entity.id,topHolderShareBps:u.shareBps}],{fact:"MEDIUM",coordination:"LOW"},["No total-supply snapshot was supplied; the exact caller-provided share was used."]))}return s}function v1(e,t,n){return e.filter(r=>["LP_REMOVE","LIQUIDITY_REMOVE"].includes(r.type)&&be(r,n).length).filter(r=>qe(r.actor??r.from??r.to,t)).map(r=>tr("LP_REMOVAL",r.id,[r.actor??r.from??r.to],be(r,n),[{eventId:r.id,pool:r.pool,asset:r.asset,amount:Dt(r.amount)}],{fact:"HIGH",coordination:"LOW"},["LP removal can be routine treasury or liquidity management."]))}function x1(e,t){let n=0,r=e.length;for(;n<r;){let o=Math.floor((n+r)/2);e[o].timestampMs<t?n=o+1:r=o}return n}function I1(e,t,n,r,o){let i=e.filter(p=>p.type==="TRANSFER"&&qe(p.from,t)&&qe(p.to,t)&&p.from!==p.to&&Fe(p.asset)&&p.timestampMs!==null&&Dt(p.amount)&&be(p,n).length).map(p=>er(p,{parsedAmount:Dt(p.amount)})).sort((p,f)=>p.timestampMs-f.timestampMs||Me(p.id,f.id)),s=es(i,p=>`${p.from}\0${p.asset}`),a=[],c=new Set,l=!1;function u(p,f,m,h){let y=nb(s.get(`${p.to}\0${p.asset}`)),g=x1(y,p.timestampMs),E=[],v=0,S=g;for(;S<y.length&&v<KN;S+=1){let I=y[S];if(I.timestampMs-f.timestampMs>r.peelWindowSeconds*1e3)break;if(v+=1,c.has(I.id)||m.has(I.id)||h.has(I.to)||I.from!==p.to||I.asset!==p.asset)continue;let k=Math.max(p.parsedAmount.decimals,I.parsedAmount.decimals),A=Wo(p.parsedAmount,k),w=Wo(I.parsedAmount,k);A!==null&&w!==null&&w>0n&&w<A&&E.push(I)}return S<y.length&&y[S].timestampMs-f.timestampMs<=r.peelWindowSeconds*1e3&&(l=!0),E}function d(p){if(p.length>=3)return p;let f=new Set(p.map(h=>h.id)),m=new Set([p[0].from,...p.map(h=>h.to)]);for(let h of u(p[p.length-1],p[0],f,m)){let y=d([...p,h]);if(y)return y}return null}for(let p of i){if(c.has(p.id))continue;let f=d([p]);if(!f)continue;let m=[...f];for(;m.length<r.maxPeelDepth;){let h=new Set(m.map(E=>E.id)),y=new Set([m[0].from,...m.map(E=>E.to)]),[g]=u(m[m.length-1],m[0],h,y);if(!g)break;m.push(g)}m.forEach(h=>c.add(h.id)),a.push(m)}return l&&o("PEEL_CANDIDATE_LIMIT_REACHED","Peel candidate branching exceeded the deterministic traversal bound.",{fatal:!0}),a.map(p=>tr("PEEL_CHAIN",p[0].id,[p[0].from,...p.map(f=>f.to)],p.flatMap(f=>be(f,n)),[{hopCount:p.length,asset:p[0].asset,eventIds:p.map(f=>f.id),amounts:p.map(f=>f.parsedAmount)}],{fact:"HIGH",coordination:"MEDIUM"},["A peel pattern is transactional behavior and does not establish common ownership."]))}function k1(e,t,n){return e.filter(r=>r.type==="BRIDGE"&&Fe(r.sourceChain)&&Fe(r.destinationChain)&&be(r,n).length).filter(r=>qe(r.actor??r.from??r.to,t)).map(r=>tr("EXPLICIT_BRIDGE_LINK",r.id,[r.actor??r.from??r.to],be(r,n),[{eventId:r.id,sourceChain:Fe(r.sourceChain),destinationChain:Fe(r.destinationChain),bridgeTransferId:r.bridgeTransferId,asset:r.asset,amount:Dt(r.amount)}],{fact:"HIGH",coordination:"LOW"},["Only the explicit bridge record is reported; no link was inferred from timing or amount similarity."]))}function O1(e){let t=Object.create(null);for(let n of e)t[n.kind]=(t[n.kind]??0)+1;return Object.fromEntries(Object.entries(t).sort(([n],[r])=>Me(n,r)))}function Zg(e,t){return Se(L(e,"holders")).some(n=>!qe(L(n,"entityId"),t))?!1:Zi.has(e.type)||e.type==="TRANSFER"?qe(e.from,t)&&qe(e.to,t):Qi.has(e.type)?qe(e.actor??e.from,t):e.type==="DEPLOY"?qe(e.from,t):["LP_REMOVE","LIQUIDITY_REMOVE","BRIDGE"].includes(e.type)?qe(e.actor??e.from??e.to,t):e.type==="SUPPLY_SNAPSHOT"?Se(L(e,"holders")).every(n=>qe(L(n,"entityId"),t)):!0}function _1(e,t){if(e==null){t("COVERAGE_UNKNOWN","Coverage was not supplied.");return}if(typeof e!="object"||Array.isArray(e)||vt.isProxy(e)){t("MALFORMED_COVERAGE","Coverage must contain own data fields.",{fatal:!0});return}let n=[],r=Object.getPrototypeOf(e);if(r!==Object.prototype&&r!==null||Object.getOwnPropertySymbols(e).length>0){t("MALFORMED_COVERAGE","Coverage must contain ordinary own data without symbol fields.",{fatal:!0});return}let o=Object.getOwnPropertyNames(e).filter(i=>{let s=Object.getOwnPropertyDescriptor(e,i);return!(i==="toJSON"&&s&&Object.hasOwn(s,"value")&&s.value===void 0&&s.enumerable===!1)});if(o.length>64){t("COVERAGE_FIELD_LIMIT_REACHED","Coverage input exceeded the deterministic field limit.",{fatal:!0});return}for(let i of o){let s=Object.getOwnPropertyDescriptor(e,i);if(!s||!s.enumerable||!Object.hasOwn(s,"value")){t("MALFORMED_COVERAGE","Coverage must contain enumerable own data fields.",{fatal:!0});return}n.push([i,s.value])}for(let[i,s]of n.sort(([a],[c])=>Me(a,c))){let a=s;if(s&&typeof s=="object"&&!Go(s)){t("MALFORMED_COVERAGE","Coverage status objects must contain bounded ordinary acyclic own data.",{fatal:!0});return}if(s&&typeof s=="object"&&!Array.isArray(s)){let u=Object.getOwnPropertyDescriptor(s,"status");if(u&&!Object.hasOwn(u,"value")){t("MALFORMED_COVERAGE","Coverage status objects must contain own data.",{fatal:!0});return}a=u?u.value:void 0}if(typeof a!="string")continue;let c=$t(a),l=$t(i);c==="UNKNOWN"||c==="UNAVAILABLE"?t(`${l}_COVERAGE_${c}`,`${i} coverage is ${c}.`):c==="PARTIAL"&&t(`${l}_COVERAGE_PARTIAL`,`${i} coverage is PARTIAL.`)}}var T1=Object.freeze(Object.keys(cn)),N1=Object.freeze(["subject","chain","entities","events","evidence","coverage","gaps"]);function eb(e,t,{numeric:n=!1}={}){if(!e||typeof e!="object"||vt.isProxy(e)||Array.isArray(e))return!1;let r=Object.getPrototypeOf(e);if(r!==Object.prototype&&r!==null||Object.getOwnPropertySymbols(e).length>0)return!1;let o=Object.getOwnPropertyNames(e).filter(i=>{let s=Object.getOwnPropertyDescriptor(e,i);return!(i==="toJSON"&&s&&Object.hasOwn(s,"value")&&s.value===void 0)});if(o.length>t.length||o.some(i=>!t.includes(i)))return!1;for(let i of o){let s=Object.getOwnPropertyDescriptor(e,i);if(!s||!s.enumerable||!Object.hasOwn(s,"value")||n&&(typeof s.value!="number"||!Number.isFinite(s.value)))return!1}return!0}function yd(e,t={}){let n=eb(t,T1,{numeric:!0}),r=n?t:{},o={maxEntities:xn(L(r,"maxEntities"),cn.maxEntities,1,Wt.maxNodes),maxEvents:xn(L(r,"maxEvents"),cn.maxEvents,1,Wt.maxEdges),maxEvidence:xn(L(r,"maxEvidence"),cn.maxEvidence,1,De.evidence),minClusterSize:xn(L(r,"minClusterSize"),cn.minClusterSize,2,10),minCommonRecipients:xn(L(r,"minCommonRecipients"),cn.minCommonRecipients,2,10),syncWindowSeconds:xn(L(r,"syncWindowSeconds"),cn.syncWindowSeconds,1,3600),freshWalletSeconds:xn(L(r,"freshWalletSeconds"),cn.freshWalletSeconds,60,2592e3),peelWindowSeconds:xn(L(r,"peelWindowSeconds"),cn.peelWindowSeconds,60,604800),maxPeelDepth:xn(L(r,"maxPeelDepth"),cn.maxPeelDepth,3,8),concentrationThresholdBps:xn(L(r,"concentrationThresholdBps"),cn.concentrationThresholdBps,1,1e4)},i=new Map,s=!1,a=(_,$,{fatal:q=!1}={})=>{q&&(s=!0);let M=$t(_||"UNSPECIFIED_GAP"),ue=Fe($)??"Input is incomplete.",ne=i.get(M);if(ne){Me(ue,ne.message)<0&&i.set(M,{code:M,status:"UNKNOWN",message:ue});return}if(i.size>=Yg-1){s=!0,i.has("GAP_LIMIT_REACHED")||i.set("GAP_LIMIT_REACHED",{code:"GAP_LIMIT_REACHED",status:"UNKNOWN",message:`Gap output exceeded the deterministic limit of ${Yg}.`});return}i.set(M,{code:M,status:"UNKNOWN",message:ue})},c=({entities:_=[],events:$=[],evidenceById:q=new Map,eventWithEvidence:M=[],analyzableEvents:ue=[],findings:ne=[]}={})=>{let Pe=s?[]:ne;Pe.length>De.findings&&(a("FINDING_LIMIT_REACHED",`Findings exceeded the deterministic limit of ${De.findings}.`,{fatal:!0}),Pe=[]);let ze=[...i.values()].sort((ye,fe)=>Me(ye.code,fe.code)),Un=s||ze.some(ye=>ye.code.includes("COVERAGE_UNKNOWN")||["COVERAGE_FIELD_LIMIT_REACHED","INVALID_INPUT","EVIDENCE_UNAVAILABLE","EVENTS_UNAVAILABLE","ENTITIES_UNAVAILABLE","NO_ANALYZABLE_EVENTS"].includes(ye.code))?"UNKNOWN":ze.length?"PARTIAL":"OK",j=Math.min(100,Pe.reduce((ye,fe)=>ye+fe.score,0)),K=j>=60?"HIGH":j>=25?"MEDIUM":Un==="OK"?"LOW":"UNKNOWN";return Rt({schemaVersion:zN,execution:"read-only",reportOnly:!0,status:Un,risk:{score:j,level:K},metrics:{entityCount:_.length,eventCount:$.length,evidenceCount:q.size,evidencedEventCount:M.length,eligibleEventCount:ue.length,findingCounts:O1(Pe),bounds:o},findings:Pe,gaps:ze})};if(!n)return a("INVALID_OPTIONS","Coordination options must contain only reviewed numeric own data fields.",{fatal:!0}),c();if(!eb(e,N1))return a("INVALID_INPUT","Expected a bounded own-data coordination envelope.",{fatal:!0}),c();if(!e||typeof e!="object"||Array.isArray(e))return a("INVALID_INPUT","Expected an object containing normalized entities, events, and evidence.",{fatal:!0}),c();for(let _ of["subject","chain"]){let $=L(e,_);if($!==void 0&&!Go($))return a("INVALID_INPUT",`${_} must contain bounded ordinary acyclic own data.`,{fatal:!0}),c()}let l=ud(L(e,"entities"),l1,o.maxEntities,"MALFORMED_ENTITIES","ENTITY_LIMIT_REACHED",a),u=ud(L(e,"events"),d1,o.maxEvents,"MALFORMED_EVENTS","EVENT_LIMIT_REACHED",a),d=ud(L(e,"evidence"),u1,o.maxEvidence,"MALFORMED_EVIDENCE","EVIDENCE_LIMIT_REACHED",a),p=l.records,f=u.records,m=d.records;(l.overflow||u.overflow||d.overflow||l.malformed||u.malformed||d.malformed)&&(s=!0),Array.isArray(L(e,"entities"))||a("ENTITIES_UNAVAILABLE","entities must be an array.",{fatal:!0}),Array.isArray(L(e,"events"))||a("EVENTS_UNAVAILABLE","events must be an array.",{fatal:!0}),Array.isArray(L(e,"evidence"))||a("EVIDENCE_UNAVAILABLE","evidence must be an array.",{fatal:!0}),Xi(p)&&a("DUPLICATE_ENTITY_IDS","Entity ids must be unique.",{fatal:!0}),Xi(f)&&a("DUPLICATE_EVENT_IDS","Event ids must be unique.",{fatal:!0}),Xi(m)&&a("DUPLICATE_EVIDENCE_IDS","Evidence ids must be unique.",{fatal:!0}),h1(f)&&a("DUPLICATE_EVENT_FACTS","Duplicate event facts are ambiguous.",{fatal:!0}),f1(p)&&a("AMBIGUOUS_ENTITY_IDENTITY","Multiple entity ids name one canonical chain address.",{fatal:!0});let h=Xi(p)?new Map:new Map(p.map(_=>[_.id,_])),y=m.filter(_=>!Gg.has(_.status)),g=m.filter(_=>Gg.has(_.status)&&!Kg.has(_.status));y.length>0&&a("EVIDENCE_STATUS_INVALID",`${y.length} evidence record(s) had a missing or invalid status and were excluded.`),g.length>0&&a("EVIDENCE_STATUS_UNUSABLE",`${g.length} evidence record(s) did not have LIVE or INDEXED status and were excluded.`);let E=Xi(m)?new Map:new Map(m.filter(_=>Kg.has(_.status)).map(_=>[_.id,_]));E.size===0&&a("EVIDENCE_UNAVAILABLE","No exact LIVE or INDEXED evidence records were supplied.");let v=p.filter(_=>{let $=Se(L(_,"evidenceRefs"));return $.length>0&&$.some(q=>!E.has(q))});v.length&&a("ENTITY_EVIDENCE_UNRESOLVED",`${v.length} entity record(s) cited unsupported or missing evidence.`,{fatal:!0});let S=new Set(f.filter(_=>_.type==="DEPLOY"&&qe(_.from??_.actor,h)&&be(_,E).length>0).map(_=>_.from??_.actor)),I=p.filter(_=>{let $=Se(L(_,"roles")).length>0||Se(L(_,"tags")).length>0||md(_)||ic(_)||L(_,"isService")!==void 0||L(_,"fresh")!==void 0||L(_,"txCount")!==void 0||L(_,"firstSeenAt")!==void 0||L(_,"createdAt")!==void 0||L(_,"supplyShare")!==void 0,q=Xg(_,E)||r1(_)&&S.has(_.id);return $&&!q}),k=I.filter(_=>L(_,"fresh")!==void 0||L(_,"txCount")!==void 0||L(_,"firstSeenAt")!==void 0||L(_,"createdAt")!==void 0);k.length>0&&a("FRESHNESS_EVIDENCE_UNRESOLVED",`${k.length} wallet freshness premise(s) lacked fully usable evidence and were excluded where necessary.`);let A=p.filter(_=>ic(_)&&!Xg(_,E)&&!S.has(_.id));A.length>0&&a("DEPLOYER_EVIDENCE_UNRESOLVED",`${A.length} deployer role premise(s) lacked usable entity or DEPLOY-event evidence and were excluded.`),I.length&&a("ENTITY_SEMANTIC_EVIDENCE_UNRESOLVED",`${I.length} entity semantic record(s) lacked exact evidence.`,{fatal:!0});let w=f.filter(_=>Se(L(_,"holders")).some($=>{let q=Se(L($,"evidenceRefs"));return q.length===0||q.some(M=>!E.has(M))}));w.length&&a("HOLDER_EVIDENCE_UNRESOLVED",`${w.length} event(s) contained holder facts without fully resolved exact evidence.`,{fatal:!0}),_1(L(e,"coverage"),a);let b=L(e,"gaps");if(Ir(b,De.gaps))a("UPSTREAM_GAP_LIMIT_REACHED",`Upstream gaps must be a dense array of at most ${De.gaps}.`,{fatal:!0});else{let _=[];for(let $ of Se(b,De.gaps)){if(!$||typeof $!="object"||vt.isProxy($)||Array.isArray($)||!Ko($,n1)){a("MALFORMED_UPSTREAM_GAP","An upstream gap record was malformed.",{fatal:!0});continue}let q=L($,"code"),M=L($,"message");if(q!==void 0&&Fe(q)===null||M!==void 0&&Fe(M)===null){a("MALFORMED_UPSTREAM_GAP","An upstream gap record contained a malformed scalar.",{fatal:!0});continue}_.push({code:q??"UPSTREAM_GAP",message:M??"An upstream normalization gap was reported."})}_.sort(($,q)=>Me($t($.code),$t(q.code))||Me($.message,q.message));for(let $ of _)a($.code,$.message)}let x=f.filter(_=>be(_,E).length>0),C=f.filter(_=>be(_,E).length===0);C.length&&a("EVENT_EVIDENCE_UNRESOLVED",`${C.length} event(s) lacked fully resolved exact LIVE or INDEXED evidence references.`,{fatal:!0});let O=x.filter(_=>!tb.has(_.type)||!Qg(_));O.length>0&&a("EVENT_SEMANTICS_UNRESOLVED",`${O.length} evidence-backed event(s) lacked complete analyzable semantics.`);let F=x.filter(Qg),H=F.filter(_=>!Zg(_,h));H.length&&a("EVENT_ENTITY_UNRESOLVED",`${H.length} event(s) contained unresolved entity references.`,{fatal:!0});let V=F.filter(_=>Zg(_,h));V.length===0&&a("NO_ANALYZABLE_EVENTS","No fully referenced evidence-backed event had semantics supported by coordination analysis; no low-risk conclusion was produced.");let D=[];return s||(D=[...g1(V,h,E,o,a),...A1(V,h,E,o,a),...E1(V,h,E,o,a),...S1(V,p,h,E,o,a),...b1(V,h,E,o),...v1(V,h,E),...I1(V,h,E,o,a),...k1(V,h,E)].filter(_=>_.evidenceRefs.length>0).sort((_,$)=>Me(_.kind,$.kind)||Me(_.id,$.id)),new Set(D.map(_=>_.id)).size!==D.length&&(a("DUPLICATE_FINDING_IDS","Finding ids must be unique.",{fatal:!0}),D=[])),c({entities:p,events:f,evidenceById:E,eventWithEvidence:x,analyzableEvents:V,findings:D})}Y();zn();import{types as oo}from"node:util";import{types as mb}from"node:util";var lc="oracle.opensea-wallet-enrichment/1",C1="oracle.nft-overlap-input/1",R1="oracle.nft-overlap/1",nr="REQUEST_PATH_PLUS_MATCHED_PROFILE",P1=Ze(["NOT_REQUESTED","UNAVAILABLE","UNKNOWN","PARTIAL","COMPLETE"]),l5=Ze(["COMPLETE","PARTIAL","UNKNOWN"]),bd="OBSERVED",lb="NOT_OBSERVED_IN_COMPLETE_INDEXED_INVENTORIES",ac="UNKNOWN",Ue=Ze({snapshots:32,holdingsPerSnapshot:20,totalHoldings:640,evidencePerSnapshot:64,findings:250,citationsPerFinding:64}),Jo=Ze({1:"ethereum",10:"optimism",130:"unichain",137:"polygon",143:"monad",360:"shape",988:"stablechain",999:"hyperevm",1329:"sei",1868:"soneium",2020:"ronin",2741:"abstract",4326:"megaeth",4663:"robinhood",5031:"somnia",8333:"b3",8453:"base",33139:"ape_chain",42161:"arbitrum",43114:"avalanche",43419:"gunzilla",57073:"ink",69e3:"animechain",80094:"bera_chain",81457:"blast",7777777:"zora"}),Yo=Ze(["OpenSea profile and inventory records are marketplace-indexed observations, not on-chain ownership proof.","No identity, common-control, intent, or wallet-owner inference is made.","Inventory is limited to one unpaginated page of at most 20 holdings."]),L1=Ze(["Overlap is limited to exact canonical NFT identities and exact chain-bound OpenSea collection slugs in the supplied snapshots.","An exact OpenSea collection slug overlap is a marketplace-index observation, not an on-chain or common-control claim.","No identity, ownership, common-control, intent, risk, or wrongdoing conclusion is made."]),kr=Ze({NOT_REQUESTED:"OpenSea enrichment was not requested.",UNSUPPORTED_CHAIN_FAMILY:"OpenSea enrichment is unavailable for this chain family.",UNSUPPORTED_CHAIN:"OpenSea enrichment is unavailable for this fixed chain mapping.",INVALID_EVM_ADDRESS:"OpenSea enrichment requires a canonical EVM address.",API_KEY_UNAVAILABLE:"OpenSea enrichment is unavailable because its production API key is not configured.",PROFILE_AUTHENTICATION_FAILED:"The OpenSea profile request was not authenticated.",PROFILE_ACCESS_FORBIDDEN:"The OpenSea profile request was forbidden.",PROFILE_RATE_LIMITED:"The OpenSea profile request was rate limited.",PROFILE_UPSTREAM_UNAVAILABLE:"The OpenSea profile service was unavailable.",PROFILE_TIMEOUT:"The OpenSea profile request timed out.",PROFILE_REDIRECT_REFUSED:"The OpenSea profile response attempted a redirect and was refused.",PROFILE_RESPONSE_TOO_LARGE:"The OpenSea profile response exceeded the fixed byte limit.",PROFILE_NOT_FOUND:"The OpenSea profile was not found.",PROFILE_MALFORMED:"The OpenSea profile response did not satisfy the bounded contract.",PROFILE_ADDRESS_MISMATCH:"The OpenSea profile did not match the requested canonical wallet.",PROFILE_TRANSPORT_FAILED:"The OpenSea profile request failed.",PROFILE_USERNAME_REJECTED:"Optional OpenSea username metadata was omitted because it did not satisfy the safe display contract.",INVENTORY_AUTHENTICATION_FAILED:"The OpenSea inventory request was not authenticated.",INVENTORY_ACCESS_FORBIDDEN:"The OpenSea inventory request was forbidden.",INVENTORY_RATE_LIMITED:"The OpenSea inventory request was rate limited.",INVENTORY_UPSTREAM_UNAVAILABLE:"The OpenSea inventory service was unavailable.",INVENTORY_TIMEOUT:"The OpenSea inventory request timed out.",INVENTORY_REDIRECT_REFUSED:"The OpenSea inventory response attempted a redirect and was refused.",INVENTORY_RESPONSE_TOO_LARGE:"The OpenSea inventory response exceeded the fixed byte limit.",INVENTORY_NOT_FOUND:"The OpenSea inventory was not found.",INVENTORY_MALFORMED:"The OpenSea inventory response did not satisfy the bounded contract.",INVENTORY_TRANSPORT_FAILED:"The OpenSea inventory request failed.",INVENTORY_CURSOR_PRESENT:"OpenSea reported another inventory page; no cursor was retained or followed.",INVENTORY_ROW_LIMIT:"OpenSea returned more than the fixed 20-row inventory bound.",INVENTORY_ROW_REJECTED:"At least one OpenSea inventory row did not satisfy the canonical holding contract.",INVENTORY_COLLECTION_REJECTED:"At least one canonical OpenSea holding lacked a valid bounded collection slug; exact NFT evidence was retained.",INVENTORY_DUPLICATE_HOLDING:"At least one duplicate OpenSea holding was collapsed.",INVENTORY_CONFLICTING_HOLDING:"At least one conflicting OpenSea collection association was excluded while exact-NFT evidence was retained."}),$1=Ze({CONFLICTING_DUPLICATE_SNAPSHOT:"Conflicting snapshots for the same chain and canonical wallet were excluded.",INPUT_COVERAGE_INCOMPLETE:"At least one included snapshot had incomplete relevant inventory coverage.",EXACT_NFT_COVERAGE_INCOMPLETE:"At least one included exact-NFT inventory was incomplete.",COLLECTION_COVERAGE_INCOMPLETE:"At least one included collection-slug inventory was incomplete.",PROFILE_METADATA_INCOMPLETE:"At least one matched profile omitted unsafe optional username metadata.",INELIGIBLE_HOLDING_EVIDENCE:"At least one holding lacked separate wallet-bound LIVE or INDEXED profile and holding evidence.",INSUFFICIENT_DISTINCT_WALLETS:"Fewer than two distinct canonical wallet IDs qualified for a negative overlap statement.",FINDINGS_TRUNCATED:"Deterministic finding limits omitted additional qualifying overlaps."}),hb=new Set(P1),D1=new Set(Gi),wd=new Set(["LIVE","INDEXED"]),je=(e,t)=>e<t?-1:e>t?1:0,U1=/^0x[0-9a-fA-F]{40}$/u,B1=/^(?:0|[1-9][0-9]*|0[0-9]+)$/u,q1=/^[a-z0-9](?:[a-z0-9._-]{0,62}[a-z0-9])?$/u,M1=/^[A-Za-z0-9](?:[A-Za-z0-9._-]{0,63})$/u,yb=/[\u061c\u200e\u200f\u202a-\u202e\u2066-\u2069]/u,gb=/[\u0000-\u001f\u007f-\u009f]/u,F1=(1n<<256n)-1n;function P(e,t="invalid-nft-overlap"){throw new Zr(`nft-overlap: ${e}`,t)}function bb(e){return!!(e&&"value"in e&&e.value===void 0&&e.enumerable===!1)}function wb(e){return!e||typeof e!="object"||Object.hasOwn(e,"toJSON")||Object.defineProperty(e,"toJSON",{value:void 0,writable:!1,enumerable:!1,configurable:!1}),e}function ve(){return wb([])}function se(e,t){return Object.defineProperty(e,String(e.length),{value:t,writable:!0,enumerable:!0,configurable:!0}),e}function Ze(e,t=new Set){if(!e||typeof e!="object"||t.has(e))return e;t.add(e),!Object.hasOwn(e,"toJSON")&&Object.isExtensible(e)&&wb(e);let n;try{n=Reflect.ownKeys(e)}catch{P("normalized output could not be frozen safely","invalid-object")}for(let r of n){if(r==="toJSON")continue;let o;try{o=Object.getOwnPropertyDescriptor(e,r)}catch{P("normalized output could not be frozen safely","invalid-object")}o&&"value"in o&&Ze(o.value,t)}return Object.freeze(e),e}function Be(e,t,n){(!e||typeof e!="object"||Array.isArray(e)||mb.isProxy(e))&&P(`${n} must be a non-Proxy object`,"invalid-object");let r,o;try{r=Object.getPrototypeOf(e),o=Reflect.ownKeys(e)}catch{P(`${n} could not be inspected safely`,"invalid-object")}r!==Object.prototype&&r!==null&&P(`${n} must be a plain object`,"invalid-object");let i=new Set(t),s=new Map;for(let a of o){let c;try{c=Object.getOwnPropertyDescriptor(e,a)}catch{P(`${n}.${String(a)} could not be inspected safely`,"invalid-object")}a==="toJSON"&&bb(c)||((typeof a!="string"||!i.has(a))&&P(`${n} has an unknown field`,"unknown-field"),(!c||!("value"in c))&&P(`${n}.${a} must be an own data field`,"invalid-object"),s.set(a,c.value))}return Object.freeze({has:a=>s.has(a),get:a=>s.get(a)})}function Kt(e,t,n,r=0){(!Array.isArray(e)||mb.isProxy(e))&&P(`${t} must be a non-Proxy array`,"invalid-array");let o;try{o=Object.getOwnPropertyDescriptor(e,"length")}catch{P(`${t} could not be inspected safely`,"invalid-array")}let i=o?.value;(!Number.isInteger(i)||i<r||i>n)&&P(`${t} must contain from ${r} through ${n} items`,"array-limit");let s;try{s=Reflect.ownKeys(e)}catch{P(`${t} could not be inspected safely`,"invalid-array")}let a=new Set(["length"]);for(let l=0;l<i;l+=1)a.add(String(l));let c=ve();for(let l of s){let u;try{u=Object.getOwnPropertyDescriptor(e,l)}catch{P(`${t} could not be inspected safely`,"invalid-array")}l==="toJSON"&&bb(u)||(typeof l!="string"||!a.has(l))&&P(`${t} must be dense and own-indexed without extra fields`,"invalid-array")}for(let l=0;l<i;l+=1){let u;try{u=Object.getOwnPropertyDescriptor(e,String(l))}catch{P(`${t}[${l}] could not be inspected safely`,"invalid-array")}(!u||!("value"in u))&&P(`${t} must be dense and contain only own data items`,"invalid-array"),se(c,u.value)}return c}function j1(e,t,n=256,{allowEmpty:r=!1}={}){return(typeof e!="string"||!r&&e.length===0||e.length>n||gb.test(e)||yb.test(e))&&P(`${t} is not safe bounded text`,"invalid-string"),e}function no(e,t,n){return(typeof e!="string"||!new RegExp(`^${t}_[0-9a-f]{64}$`,"u").test(e))&&P(`${n} is not a deterministic ID`,"invalid-id"),e}function Eb(e,t){return(typeof e!="string"||!/^sha256:[0-9a-f]{64}$/u.test(e))&&P(`${t} is not a canonical digest`,"invalid-digest"),e}function Ed(e,t="chainId"){return(!Number.isSafeInteger(e)||e<=0)&&P(`${t} must be a positive safe integer`,"invalid-chain"),e}function ro(e){return(typeof e!="string"||!U1.test(e))&&P("address must be a 20-byte EVM address","invalid-address"),e.toLowerCase()}function H1(e){(typeof e!="string"||e.length===0||e.length>78||!B1.test(e))&&P("tokenId must be a bounded unsigned decimal string","invalid-token-id");let t;try{t=BigInt(e)}catch{P("tokenId must be uint256","invalid-token-id")}return(t<0n||t>F1)&&P("tokenId must be uint256","invalid-token-id"),t.toString(10)}function z1(e){return(typeof e!="string"||!q1.test(e))&&P("OpenSea collection slug must already be strictly normalized","invalid-collection-slug"),e}function Ad(e={}){let t=Be(e,["chainId","contract","tokenId"],"canonical NFT input");["chainId","contract","tokenId"].every(r=>t.has(r))||P("canonical NFT input is missing a field","missing-field");let n={chainId:Ed(t.get("chainId"),"nft.chainId"),contract:ro(t.get("contract")),tokenId:H1(t.get("tokenId"))};return Ze({id:vr("nft",n),...n})}function Sd(e={}){let t=Be(e,["chainId","slug"],"canonical collection input");["chainId","slug"].every(r=>t.has(r))||P("canonical collection input is missing a field","missing-field");let n={chainId:Ed(t.get("chainId"),"collection.chainId"),slug:z1(t.get("slug"))};return Ze({id:vr("collection",n),...n})}function uc(e={}){let t=Be(e,["family","chainId","address"],"canonical wallet input"),n=t.has("family")?t.get("family"):"evm",r=t.has("chainId")?t.get("chainId"):null,o=t.has("address")?t.get("address"):null,i=j1(n,"wallet.family",64).toLowerCase();/^[a-z][a-z0-9-]{0,63}$/u.test(i)||P("wallet.family is invalid","invalid-family");let s=r===null?null:Ed(r,"wallet.chainId");if(o===null)return Ze({id:null,family:i,chainId:s,address:null});i!=="evm"&&P("only EVM OpenSea wallets can be canonical","invalid-wallet");let a=ro(o);return Ze({id:vr("wallet",{family:"evm",address:a}),family:"evm",chainId:s,address:a})}function vd(e){return e==null||typeof e!="string"||e.length===0||e.length>64||!M1.test(e)||gb.test(e)||yb.test(e)||_e(e)?null:e}function V1(e,t="snapshot.wallet"){let n=Be(e,["id","family","chainId","address"],t);["id","family","chainId","address"].every(o=>n.has(o))||P(`${t} is missing a required field`,"missing-field");let r=uc({family:n.get("family"),chainId:n.get("chainId"),address:n.get("address")});return n.get("id")!==r.id&&P(`${t}.id does not match its canonical wallet`,"id-mismatch"),r}function ub(e,t){let n=Be(e,["status","calls"],t);(!n.has("status")||!n.has("calls"))&&P(`${t} is missing a required field`,"missing-field");let r=n.get("status"),o=n.get("calls");return hb.has(r)||P(`${t}.status is invalid`,"invalid-status"),(!Number.isInteger(o)||o<0||o>1)&&P(`${t}.calls must be 0 or 1`,"invalid-count"),{status:r,calls:o}}function W1(e){let t=Be(e,["status","profile","inventory"],"snapshot.coverage");["status","profile","inventory"].every(a=>t.has(a))||P("snapshot.coverage is missing a required field","missing-field");let n=t.get("status");hb.has(n)||P("snapshot.coverage.status is invalid","invalid-status");let r=ub(t.get("profile"),"snapshot.coverage.profile"),o=ub(t.get("inventory"),"snapshot.coverage.inventory");o.calls>r.calls&&P("inventory cannot be called before profile","invalid-count");let i=(a,c,l,u,d)=>n===a&&r.status===c&&r.calls===l&&o.status===u&&o.calls===d;return i("NOT_REQUESTED","NOT_REQUESTED",0,"NOT_REQUESTED",0)||i("UNAVAILABLE","UNAVAILABLE",0,"UNAVAILABLE",0)||i("UNKNOWN","UNKNOWN",1,"UNAVAILABLE",0)||n==="PARTIAL"&&["COMPLETE","PARTIAL"].includes(r.status)&&["COMPLETE","PARTIAL","UNKNOWN"].includes(o.status)&&r.calls===1&&o.calls===1&&(r.status!=="COMPLETE"||o.status!=="COMPLETE")||i("COMPLETE","COMPLETE",1,"COMPLETE",1)||P("snapshot coverage phase statuses or call counts are inconsistent","invalid-coverage"),{status:n,profile:r,inventory:o}}function G1(e){let t=Kt(e,"snapshot.gaps",Object.keys(kr).length),n=ve();for(let i=0;i<t.length;i+=1){let s=Be(t[i],["code","message"],`snapshot.gaps[${i}]`);(!s.has("code")||!s.has("message"))&&P("snapshot gap is missing a field","missing-field");let a=s.get("code");(!Object.hasOwn(kr,a)||s.get("message")!==kr[a])&&P("snapshot gap is not a fixed allowlisted gap","invalid-gap"),se(n,a)}let r=ve(),o=new Set;for(let i of n)o.has(i)||(o.add(i),se(r,i));return r.sort(je),r}function K1(e){return Object.hasOwn(kr,e)||P("OpenSea gap code is invalid","invalid-gap"),Ze({code:e,message:kr[e]})}function Y1(e){let t=Be(e,["status","source","kind","walletId","address","assetId","collectionId","ownerBinding"],"OpenSea evidence input");for(let s of["status","source","kind","walletId"])t.has(s)||P("OpenSea evidence input is missing a required field","missing-field");let n=t.get("status"),r=t.get("source"),o=t.get("kind"),i=t.get("walletId");if(D1.has(n)||P("OpenSea evidence status is invalid","invalid-status"),no(i,"wallet","evidence.walletId"),o==="PROFILE")return t.has("address")||P("profile evidence address is required","missing-field"),["assetId","collectionId","ownerBinding"].some(s=>t.has(s))&&P("profile evidence has holding-only fields","unknown-field"),r!=="opensea-v2-profile"&&P("profile evidence source is invalid","invalid-source"),{status:n,source:r,kind:"PROFILE",walletId:i,address:ro(t.get("address"))};if(o==="HOLDING"){t.has("address")&&P("holding evidence has a profile-only field","unknown-field"),["assetId","collectionId","ownerBinding"].every(c=>t.has(c))||P("holding evidence is missing a required field","missing-field"),r!=="opensea-v2-account-nfts"&&P("holding evidence source is invalid","invalid-source");let s=no(t.get("assetId"),"nft","evidence.assetId"),a=t.get("collectionId")===null?null:no(t.get("collectionId"),"collection","evidence.collectionId");return t.get("ownerBinding")!==nr&&P("holding owner binding is invalid","invalid-owner-binding"),{status:n,source:r,kind:"HOLDING",walletId:i,assetId:s,collectionId:a,ownerBinding:nr}}P("OpenSea evidence kind is invalid","invalid-kind")}function ts(e={}){let t=Y1(e);return Ze({id:vr("evidence",t),digest:Sr(t),...t})}function J1(e,t){let n=Be(e,["id","digest","status","source","kind","walletId","address","assetId","collectionId","ownerBinding"],`snapshot.evidence[${t}]`);["id","digest","status","source","kind","walletId"].every(s=>n.has(s))||P("OpenSea evidence is missing a required field","missing-field");let o=Object.fromEntries(["status","source","kind","walletId","address","assetId","collectionId","ownerBinding"].filter(s=>n.has(s)).map(s=>[s,n.get(s)])),i=ts(o);return no(n.get("id"),"evidence","evidence.id"),Eb(n.get("digest"),"evidence.digest"),(n.get("id")!==i.id||n.get("digest")!==i.digest)&&P("OpenSea evidence ID or digest does not match its content","digest-mismatch"),i}function X1(e,t){if(e===null)return null;let n=Be(e,["address","evidenceRef","username"],"snapshot.profile");(!n.has("address")||!n.has("evidenceRef"))&&P("snapshot.profile is missing a required field","missing-field");let r=ro(n.get("address"));(!t.address||r!==t.address)&&P("profile address does not match snapshot wallet","profile-mismatch");let o=no(n.get("evidenceRef"),"evidence","profile.evidenceRef");if(n.has("username")){let i=vd(n.get("username"));return(i===null||i!==n.get("username"))&&P("profile username is not safely sanitized","invalid-username"),{address:r,evidenceRef:o,username:i}}return{address:r,evidenceRef:o}}function Q1(e,t,n){let r=Be(e,["id","chainId","contract","tokenId","collection","ownerBinding","evidenceRefs"],`snapshot.holdings[${t}]`);["id","chainId","contract","tokenId","collection","ownerBinding","evidenceRefs"].every(l=>r.has(l))||P("snapshot holding is missing a required field","missing-field");let i=Ad({chainId:r.get("chainId"),contract:r.get("contract"),tokenId:r.get("tokenId")});r.get("id")!==i.id&&P("holding ID does not match canonical NFT","id-mismatch"),n.chainId!==i.chainId&&P("holding chain does not match snapshot wallet","chain-mismatch");let s=null;if(r.get("collection")!==null){let l=Be(r.get("collection"),["id","chainId","slug"],`snapshot.holdings[${t}].collection`);["id","chainId","slug"].every(u=>l.has(u))||P("holding collection is missing a required field","missing-field"),s=Sd({chainId:l.get("chainId"),slug:l.get("slug")}),(l.get("id")!==s.id||s.chainId!==i.chainId)&&P("holding collection does not match its canonical chain-bound identity","id-mismatch")}r.get("ownerBinding")!==nr&&P("holding owner binding is invalid","invalid-owner-binding");let a=Kt(r.get("evidenceRefs"),`snapshot.holdings[${t}].evidenceRefs`,Ue.citationsPerFinding,1).map(l=>no(l,"evidence","holding.evidenceRef")),c=[...new Set(a)].sort(je);return c.length!==a.length&&P("holding evidence references must be unique","duplicate-reference"),{...i,collection:s,ownerBinding:nr,evidenceRefs:c}}function Z1(e){return{schemaVersion:e.schemaVersion,wallet:e.wallet,requested:e.requested,coverage:e.coverage,profile:e.profile?{address:e.profile.address,evidenceRef:e.profile.evidenceRef}:null,holdings:e.holdings.map(t=>({id:t.id,chainId:t.chainId,contract:t.contract,tokenId:t.tokenId,collection:t.collection,ownerBinding:t.ownerBinding,evidenceRefs:t.evidenceRefs})),evidence:e.evidence.map(t=>({id:t.id,digest:t.digest})),gapCodes:e.gaps.map(t=>t.code)}}function eC(e){let{requested:t,wallet:n,coverage:r,profile:o,holdings:i,evidence:s,gaps:a}=e;!t&&r.status!=="NOT_REQUESTED"&&P("unrequested snapshot coverage must be NOT_REQUESTED","invalid-coverage"),t&&r.status==="NOT_REQUESTED"&&P("requested snapshot coverage cannot be NOT_REQUESTED","invalid-coverage"),n.address===null&&(o!==null||i.length>0||s.length>0)&&P("noncanonical wallet snapshot cannot contain OpenSea facts","invalid-wallet"),(r.profile.calls>0||r.inventory.calls>0||o!==null||i.length>0||s.length>0)&&(!n.chainId||!Object.hasOwn(Jo,n.chainId))&&P("OpenSea attempts and facts require a reviewed chain mapping","invalid-chain"),["NOT_REQUESTED","UNAVAILABLE"].includes(r.status)&&(o!==null||i.length>0||s.length>0)&&P(`${r.status} snapshot cannot contain OpenSea facts`,"invalid-coverage"),["PARTIAL","COMPLETE"].includes(r.status)&&o===null&&P(`${r.status} snapshot requires a matched profile`,"invalid-profile"),o!==null&&r.profile.calls!==1&&P("matched profile requires one profile call","invalid-count"),r.inventory.calls===1&&o===null&&P("inventory call requires a matched profile","invalid-profile"),i.length>0&&(o===null||r.inventory.calls!==1)&&P("holdings require a matched profile and inventory call","invalid-profile");let l=new Map;for(let g of s)l.has(g.id)&&P("snapshot evidence IDs must be unique","duplicate-evidence"),l.set(g.id,g),n.id&&g.walletId!==n.id&&P("evidence is not bound to snapshot wallet","wallet-mismatch");if(o){let g=l.get(o.evidenceRef);(!g||g.kind!=="PROFILE"||g.address!==o.address)&&P("profile citation does not reference its matched profile evidence","invalid-reference")}let u=new Set,d=0;for(let g of i){u.has(g.id)&&P("snapshot holdings must be unique","duplicate-holding"),u.add(g.id),g.collection===null&&(d+=1);for(let E of g.evidenceRefs)l.has(E)||P("holding cites unknown evidence","invalid-reference")}let p=new Set,f=ve(),m=ve();for(let g of a)p.add(g.code),g.code.startsWith("PROFILE_")&&se(f,g.code),g.code.startsWith("INVENTORY_")&&se(m,g.code);let h=new Set(["UNSUPPORTED_CHAIN_FAMILY","UNSUPPORTED_CHAIN","INVALID_EVM_ADDRESS","API_KEY_UNAVAILABLE"]);r.status==="NOT_REQUESTED"&&(t||a.length!==1||!p.has("NOT_REQUESTED"))&&P("NOT_REQUESTED coverage requires its exact reason","invalid-coverage"),r.status==="UNAVAILABLE"&&(!t||a.length!==1||!h.has(a[0].code))&&P("UNAVAILABLE coverage requires one exact availability reason","invalid-coverage"),!["NOT_REQUESTED","UNAVAILABLE"].includes(r.status)&&(p.has("NOT_REQUESTED")||[...h].some(g=>p.has(g)))&&P("attempted coverage cannot contain an availability reason","invalid-coverage"),d>0&&!p.has("INVENTORY_COLLECTION_REJECTED")&&!p.has("INVENTORY_CONFLICTING_HOLDING")&&P("holding without a collection requires incomplete collection coverage","invalid-coverage"),["COMPLETE","PARTIAL"].includes(r.profile.status)&&o===null&&P("completed profile phase requires a matched profile","invalid-profile"),["NOT_REQUESTED","UNAVAILABLE","UNKNOWN"].includes(r.profile.status)&&o!==null&&P("unmatched profile phase cannot contain a profile","invalid-profile"),r.profile.status==="COMPLETE"&&f.length>0&&P("complete profile coverage cannot contain a profile gap","invalid-coverage"),r.profile.status==="PARTIAL"&&(f.length!==1||f[0]!=="PROFILE_USERNAME_REJECTED")&&P("partial profile coverage requires only its fixed username gap","invalid-coverage"),r.profile.status==="UNKNOWN"&&(f.length===0||f.some(g=>g==="PROFILE_USERNAME_REJECTED"))&&P("unknown profile coverage requires a fixed profile failure gap","invalid-coverage"),["NOT_REQUESTED","UNAVAILABLE"].includes(r.profile.status)&&f.length>0&&P("uncalled profile coverage cannot contain a profile response gap","invalid-coverage");let y=new Set(["INVENTORY_CURSOR_PRESENT","INVENTORY_ROW_LIMIT","INVENTORY_ROW_REJECTED","INVENTORY_COLLECTION_REJECTED","INVENTORY_DUPLICATE_HOLDING","INVENTORY_CONFLICTING_HOLDING"]);r.inventory.status==="COMPLETE"&&m.length>0&&P("complete inventory coverage cannot contain an inventory gap","invalid-coverage"),r.inventory.status==="PARTIAL"&&(m.length===0||m.some(g=>!y.has(g)))&&P("partial inventory coverage requires only fixed inventory quality gaps","invalid-coverage"),r.inventory.status==="UNKNOWN"&&(m.length===0||m.some(g=>y.has(g)))&&P("unknown inventory coverage requires a fixed inventory failure gap","invalid-coverage"),["NOT_REQUESTED","UNAVAILABLE"].includes(r.inventory.status)&&m.length>0&&P("uncalled inventory coverage cannot contain an inventory response gap","invalid-coverage"),["NOT_REQUESTED","UNAVAILABLE","UNKNOWN"].includes(r.inventory.status)&&i.length>0&&P("incomplete inventory attempt cannot contain holdings","invalid-coverage"),r.status==="COMPLETE"&&a.length>0&&P("COMPLETE snapshot cannot contain gaps","invalid-coverage"),r.status!=="COMPLETE"&&a.length===0&&P("incomplete snapshot must contain a fixed gap","invalid-coverage")}function xd(e={}){let t=Be(e,["requested","wallet","coverage","profile","holdings","evidence","gapCodes"],"OpenSea snapshot input");["requested","wallet","coverage","profile","holdings","evidence","gapCodes"].every(E=>t.has(E))||P("OpenSea snapshot input is missing a required field","missing-field"),typeof t.get("requested")!="boolean"&&P("snapshot.requested must be boolean","invalid-boolean");let r=t.get("wallet"),o=Be(r,["id","family","chainId","address"],"snapshot.wallet"),i=o.has("id")?V1(r,"snapshot.wallet"):uc(Object.fromEntries(["family","chainId","address"].filter(E=>o.has(E)).map(E=>[E,o.get(E)]))),s=W1(t.get("coverage")),c=Kt(t.get("evidence"),"snapshot.evidence",Ue.evidencePerSnapshot).map((E,v)=>{try{let S=Be(E,["id","digest","status","source","kind","walletId","address","assetId","collectionId","ownerBinding"],`snapshot.evidence[${v}]`);return S.has("id")||S.has("digest")?J1(E,v):ts(Object.fromEntries(["status","source","kind","walletId","address","assetId","collectionId","ownerBinding"].filter(I=>S.has(I)).map(I=>[I,S.get(I)])))}catch(S){throw S}}).sort((E,v)=>je(E.id,v.id)),l=t.get("profile"),u=null;if(l!==null){let E=Be(l,["address","evidenceRef","username"],"snapshot.profile");u=X1(Object.fromEntries(["address","evidenceRef","username"].filter(v=>E.has(v)).map(v=>[v,E.get(v)])),i)}let p=Kt(t.get("holdings"),"snapshot.holdings",Ue.holdingsPerSnapshot).map((E,v)=>Q1(E,v,i)).sort((E,v)=>je(E.id,v.id)),f=Kt(t.get("gapCodes"),"snapshot.gapCodes",Object.keys(kr).length).map(E=>(Object.hasOwn(kr,E)||P("snapshot gap code is invalid","invalid-gap"),E)),m=[...new Set(f)].sort(je).map(K1),h={schemaVersion:lc,execution:"read-only",reportOnly:!0,identityInference:!1,requested:t.get("requested"),wallet:i,coverage:s,profile:u,holdings:p,evidence:c,gaps:m,caveats:[...Yo]};eC(h);let y=vr("opensea-snapshot",Z1(h)),g=Sr(h);return Ze({...h,snapshotId:y,digest:g})}function tC(e){let t=Be(e,["schemaVersion","snapshotId","digest","execution","reportOnly","identityInference","requested","wallet","coverage","profile","holdings","evidence","gaps","caveats"],"OpenSea snapshot");["schemaVersion","snapshotId","digest","execution","reportOnly","identityInference","requested","wallet","coverage","profile","holdings","evidence","gaps","caveats"].every(s=>t.has(s))||P("OpenSea snapshot is missing a required field","missing-field"),(t.get("schemaVersion")!==lc||t.get("execution")!=="read-only"||t.get("reportOnly")!==!0||t.get("identityInference")!==!1)&&P("OpenSea snapshot envelope is invalid","invalid-envelope"),Kt(t.get("caveats"),"snapshot.caveats",Yo.length,Yo.length).some((s,a)=>s!==Yo[a])&&P("snapshot caveats are invalid","invalid-caveat");let o=G1(t.get("gaps")),i=xd({requested:t.get("requested"),wallet:t.get("wallet"),coverage:t.get("coverage"),profile:t.get("profile"),holdings:t.get("holdings"),evidence:t.get("evidence"),gapCodes:o});return no(t.get("snapshotId"),"opensea-snapshot","snapshot.snapshotId"),Eb(t.get("digest"),"snapshot.digest"),(t.get("snapshotId")!==i.snapshotId||t.get("digest")!==i.digest)&&P("snapshot ID or digest does not match normalized content","digest-mismatch"),i}function nC(e){return{code:e,message:$1[e]}}function rC(e,t,n,r){let o=e.profile;if(!o||!e.wallet.id)return null;let i=!1;for(let c of t.evidenceRefs)c===o.evidenceRef&&(i=!0);if(!i)return null;let s=n.get(o.evidenceRef);if(!s||s.kind!=="PROFILE"||!wd.has(s.status)||s.walletId!==e.wallet.id||s.address!==e.wallet.address||r.has(s.id))return null;let a=null;for(let c of t.evidenceRefs){let l=n.get(c);!l||l.id===s.id||l.kind!=="HOLDING"||!wd.has(l.status)||l.walletId!==e.wallet.id||l.assetId!==t.id||l.collectionId!==(t.collection?.id??null)||l.ownerBinding!==nr||r.has(l.id)||(!a||je(l.id,a.id)<0)&&(a=l)}return a?{walletId:e.wallet.id,chainId:e.wallet.chainId,address:e.wallet.address,snapshotId:e.snapshotId,ownerBinding:nr,profileEvidence:{id:s.id,status:s.status},holdingEvidence:{id:a.id,status:a.status}}:null}function db(e,t,n,r){let o=e.get(t);o||(o={canonical:n,byWallet:new Map},e.set(t,o));let i=o.byWallet.get(r.walletId);(!i||je(`${r.snapshotId}:${r.holdingEvidence.id}`,`${i.snapshotId}:${i.holdingEvidence.id}`)<0)&&o.byWallet.set(r.walletId,r)}function oC(e,t,n){(!Array.isArray(n)||n.length<2||n.length>Ue.snapshots||n.length*2>Ue.citationsPerFinding)&&P("finding citations exceeded the fixed limit","citation-limit");let r=ve();for(let u=0;u<n.length;u+=1)se(r,n[u]);r.sort((u,d)=>je(u.walletId,d.walletId)||je(u.snapshotId,d.snapshotId)||je(u.holdingEvidence.id,d.holdingEvidence.id));let o=ve(),i=ve(),s=new Set;for(let u of r)se(o,u.walletId),s.add(u.profileEvidence.id),s.add(u.holdingEvidence.id),s.size>Ue.citationsPerFinding&&P("finding citations exceeded the fixed limit","citation-limit"),se(i,{walletId:u.walletId,chainId:u.chainId,address:u.address,snapshotId:u.snapshotId,ownerBinding:u.ownerBinding,profileEvidence:u.profileEvidence,holdingEvidence:u.holdingEvidence});let a=ve();for(let u of s)se(a,u);a.sort(je);let c={kind:e,status:bd,...e==="EXACT_NFT_OVERLAP"?{asset:t}:{collection:t},walletIds:o,citations:i,evidenceRefs:a};return{id:vr(e==="EXACT_NFT_OVERLAP"?"nft-overlap":"collection-overlap",c),digest:Sr(c),...c}}function gd(e,t){return`${e}:${t.canonical.id}`}function pb(e){let t=null;for(let n of e.values())n.byWallet.size<2||(!t||je(n.canonical.id,t.canonical.id)<0)&&(t=n);return t}function iC(e,t,n){if(n<=0)return;if(e.length<n){se(e,t);return}let r=0;for(let o=1;o<e.length;o+=1)je(e[o].key,e[r].key)>0&&(r=o);je(t.key,e[r].key)<0&&Object.defineProperty(e,String(r),{value:t,writable:!0,enumerable:!0,configurable:!0})}function sC(e,t){let n=0,r=0;for(let h of e.values())h.byWallet.size>=2&&(n+=1);for(let h of t.values())h.byWallet.size>=2&&(r+=1);let o=n+r,i=ve(),s=new Set,a=pb(e),c=pb(t);if(a){let h={section:"exact",group:a,key:gd("exact",a)};se(i,h),s.add(h.key)}if(c){let h={section:"collection",group:c,key:gd("collection",c)};se(i,h),s.add(h.key)}let l=ve(),u=Ue.findings-i.length,d=(h,y)=>{for(let g of y.values()){if(g.byWallet.size<2)continue;let E=gd(h,g);s.has(E)||iC(l,{section:h,group:g,key:E},u)}};d("exact",e),d("collection",t);let p=ve();for(let h of i)se(p,h);for(let h of l)se(p,h);p.length>Ue.findings&&P("finding selection exceeded the fixed limit","finding-limit"),p.sort((h,y)=>je(h.key,y.key));let f=ve(),m=ve();for(let h of p)se(h.section==="exact"?f:m,h.group);return{exact:f,collections:m,exactCount:n,collectionCount:r,truncated:o>Ue.findings}}function cc(e){return e.coverage.inventory.status==="COMPLETE"}function aC(e){e.byWallet.size>Ue.snapshots&&P("finding wallet citations exceeded the snapshot limit","citation-limit");let t=ve();for(let n of e.byWallet.values())se(t,n);return t.length*2>Ue.citationsPerFinding&&P("finding citations exceeded the fixed limit","citation-limit"),t}function fb(e,t){let n=ve();for(let r of t)se(n,oC(e,r.canonical,aC(r)));return n.sort((r,o)=>je(r.id,o.id)),n}function Ab(e){arguments.length!==1&&P("analyzeNftOverlap requires exactly one input object","second-options-forbidden");let t=Be(e,["schemaVersion","snapshots"],"NFT overlap input");(!t.has("schemaVersion")||!t.has("snapshots"))&&P("NFT overlap input is missing a required field","missing-field"),t.get("schemaVersion")!==C1&&P("NFT overlap input schema is invalid","invalid-schema");let n=Kt(t.get("snapshots"),"NFT overlap snapshots",Ue.snapshots,2),r=0;for(let j=0;j<n.length;j+=1){let K=Be(n[j],["schemaVersion","snapshotId","digest","execution","reportOnly","identityInference","requested","wallet","coverage","profile","holdings","evidence","gaps","caveats"],`NFT overlap snapshots[${j}]`);for(let fe of["holdings","evidence","gaps","caveats"])K.has(fe)||P(`snapshot ${fe} is required`,"missing-field");let ye=Kt(K.get("holdings"),`NFT overlap snapshots[${j}].holdings`,Ue.holdingsPerSnapshot);Kt(K.get("evidence"),`NFT overlap snapshots[${j}].evidence`,Ue.evidencePerSnapshot),Kt(K.get("gaps"),`NFT overlap snapshots[${j}].gaps`,Object.keys(kr).length),Kt(K.get("caveats"),`NFT overlap snapshots[${j}].caveats`,Yo.length,Yo.length),r+=ye.length,r>Ue.totalHoldings&&P("total holdings exceed the fixed limit","holding-limit");for(let fe=0;fe<ye.length;fe+=1){let zt=Be(ye[fe],["id","chainId","contract","tokenId","collection","ownerBinding","evidenceRefs"],`NFT overlap snapshots[${j}].holdings[${fe}]`);zt.has("evidenceRefs")||P("holding evidenceRefs are required","missing-field"),Kt(zt.get("evidenceRefs"),`NFT overlap snapshots[${j}].holdings[${fe}].evidenceRefs`,Ue.citationsPerFinding,1)}}let o=ve();for(let j of n)se(o,tC(j));let i=new Map;for(let j of o){let K=j.wallet.id&&j.wallet.chainId?`${j.wallet.id}:${j.wallet.chainId}`:`noncanonical:${j.snapshotId}`;i.has(K)||i.set(K,ve()),se(i.get(K),j)}let s=ve(),a=0,c=0,l=ve();for(let j of i.keys())se(l,j);l.sort(je);for(let j of l){let K=i.get(j),ye=new Set;for(let fe of K)ye.add(fe.digest);if(ye.size>1&&!j.startsWith("noncanonical:")){c+=1;continue}K.sort((fe,zt)=>je(fe.snapshotId,zt.snapshotId)),se(s,K[0]),a+=K.length-1}let u=new Map;for(let j of s)for(let K of j.evidence)u.has(K.id)||u.set(K.id,new Set),j.wallet.id&&u.get(K.id).add(j.wallet.id);let d=new Set;for(let[j,K]of u)K.size>1&&d.add(j);let p=new Map,f=new Map,m=new Set,h=new Map,y=new Map,g=0,E=0,v=!1,S=c>0,I=c>0;for(let j of s){let K=j.wallet.id;K&&m.add(K),j.coverage.profile.status==="PARTIAL"&&(v=!0);let ye=new Map;for(let Ve of j.evidence)ye.set(Ve.id,Ve);let fe=j.profile?ye.get(j.profile.evidenceRef):null,zt=!!(j.profile&&K&&fe&&fe.kind==="PROFILE"&&wd.has(fe.status)&&fe.walletId===K&&fe.address===j.wallet.address&&!d.has(fe.id)),Bn=zt&&cc(j),gn=zt&&cc(j);(cc(j)||cc(j))&&!zt&&(g+=1);let bo=new Set;j.profile&&bo.add(j.profile.evidenceRef);for(let Ve of j.holdings){let jr=rC(j,Ve,ye,d);if(!jr){E+=1,Bn=!1,gn=!1;continue}bo.add(jr.profileEvidence.id),bo.add(jr.holdingEvidence.id),db(p,Ve.id,{id:Ve.id,chainId:Ve.chainId,contract:Ve.contract,tokenId:Ve.tokenId},jr),Ve.collection?db(f,Ve.collection.id,Ve.collection,jr):gn=!1}for(let Ve of j.evidence)bo.has(Ve.id)||(E+=1,Bn=!1,gn=!1);K?(h.set(K,(h.has(K)?h.get(K):!0)&&Bn),y.set(K,(y.has(K)?y.get(K):!0)&&gn)):(Bn=!1,gn=!1),Bn||(S=!0),gn||(I=!0)}let k=new Set,A=new Set;for(let[j,K]of h)K&&k.add(j);for(let[j,K]of y)K&&A.add(j);let w=new Set;for(let j of k)A.has(j)&&w.add(j);let b=sC(p,f),x=fb("EXACT_NFT_OVERLAP",b.exact),C=fb("EXACT_OPENSEA_COLLECTION_SLUG_OVERLAP",b.collections),O=!S&&m.size>=2&&k.size>=2,F=!I&&m.size>=2&&A.size>=2,H=b.exactCount>0?bd:O?lb:ac,V=b.collectionCount>0?bd:F?lb:ac,D=ve();c>0&&se(D,"CONFLICTING_DUPLICATE_SNAPSHOT"),(S||I)&&se(D,"INPUT_COVERAGE_INCOMPLETE"),S&&se(D,"EXACT_NFT_COVERAGE_INCOMPLETE"),I&&se(D,"COLLECTION_COVERAGE_INCOMPLETE"),v&&se(D,"PROFILE_METADATA_INCOMPLETE"),(g>0||E>0||d.size>0)&&se(D,"INELIGIBLE_HOLDING_EVIDENCE"),m.size<2&&b.exactCount===0&&b.collectionCount===0&&se(D,"INSUFFICIENT_DISTINCT_WALLETS"),b.truncated&&se(D,"FINDINGS_TRUNCATED");let _=ve(),$=new Set;for(let j of D)$.has(j)||($.add(j),se(_,j));_.sort(je);let q=ve();for(let j of _)se(q,nC(j));let M=0;for(let j of p.values())M+=j.byWallet.size;let Pe=!S&&!I&&!v&&!b.truncated&&m.size>=2?"COMPLETE":H!==ac||V!==ac?"PARTIAL":"UNKNOWN",ze={schemaVersion:R1,operation:"nftOverlap",execution:"read-only",networkAccess:!1,reportOnly:!0,identityInference:!1,status:Pe,input:{suppliedSnapshots:n.length,includedSnapshots:s.length,collapsedDuplicateSnapshots:a,excludedConflictingSnapshotGroups:c,distinctWallets:m.size,completeDistinctWallets:w.size,completeExactNftWallets:k.size,completeCollectionWallets:A.size,qualifyingHoldings:M},exactNft:{state:H,findings:x},collection:{state:V,findings:C},gaps:q,caveats:[...L1],limits:Ue},Fr=vr("nft-overlap-report",ze),Un=Sr(ze);return Ze({...ze,reportId:Fr,digest:Un})}var Ib=128*1024,kb=1024*1024,Ob=8e3,cC=20,lC=512,uC=1024,_b=new Set(["evm","eth","ethereum","base","arbitrum","optimism","polygon","polymarket","bsc","avalanche","abstract","stable","robinhood","hyperevm"]),Sb=Object.freeze({evm:1,eth:1,ethereum:1,base:8453,arbitrum:42161,optimism:10,polygon:137,polymarket:137,bsc:56,avalanche:43114,abstract:2741,stable:988,robinhood:4663,hyperevm:999}),dc=/[\u0000-\u001f\u007f-\u009f]/u,dC=/[\u061c\u200e\u200f\u202a-\u202e\u2066-\u2069]/u,pC=Object.freeze(["family","chainId","address","includeOpenSea"]),fC=Object.freeze(["key","env","header","url","base","endpoint","fetch","transport","clock","now","option","rpc","signer","privatekey","secret","prepare","broadcast"]),pc=(e,t)=>e<t?-1:e>t?1:0;function Id(){let e=[];return Object.defineProperty(e,"toJSON",{value:void 0,writable:!1,enumerable:!1,configurable:!1}),e}function ln(e,t){return Object.defineProperty(e,String(e.length),{value:t,writable:!0,enumerable:!0,configurable:!0}),e}function ct(e,t="invalid-opensea-request"){let n=new TypeError(`opensea enrichment: ${e}`);throw n.code=t,n}function mC(e){(!e||typeof e!="object"||Array.isArray(e)||oo.isProxy(e))&&ct("one non-Proxy args object is required","invalid-object");let t,n;try{t=Object.getPrototypeOf(e),n=Reflect.ownKeys(e)}catch{ct("args could not be inspected safely","invalid-object")}t!==Object.prototype&&t!==null&&ct("args must be a plain object","invalid-object");let r=new Set(pC),o=new Map;for(let i of n){if(typeof i!="string"||!r.has(i)){let a=typeof i=="string"?i.replace(/[^a-z0-9]/giu,"").toLowerCase():"symbol";fC.some(c=>a.includes(c))&&ct("args expose a forbidden key, environment, header, URL, transport, or clock seam","forbidden-surface"),ct("args have an unknown own field","unknown-field")}let s;try{s=Object.getOwnPropertyDescriptor(e,i)}catch{ct(`args.${i} could not be inspected safely`,"invalid-object")}(!s||!("value"in s))&&ct(`args.${i} must be an own data field`,"invalid-object"),o.set(i,s.value)}return o}function hC(e){let t=mC(e);for(let l of["family","address"])t.has(l)||ct(`args.${l} is required`,"missing-field");let n=t.get("family");(typeof n!="string"||n.length===0||n.length>64||dc.test(n))&&ct("args.family is invalid","invalid-family");let r=n.trim().toLowerCase();/^[a-z][a-z0-9-]{0,63}$/u.test(r)||ct("args.family is invalid","invalid-family");let o=t.get("address");(typeof o!="string"||o.length===0||o.length>256||dc.test(o))&&ct("args.address is invalid","invalid-address");let i=o.trim();(!i||/:\/\//u.test(i))&&ct("args.address must not be a URL","invalid-address");let s=_b.has(r),a=t.has("chainId")?t.get("chainId"):Object.hasOwn(Sb,r)?Sb[r]:null;s?a!==null&&(!Number.isSafeInteger(a)||a<=0)&&ct("args.chainId must be a positive safe integer","invalid-chain"):(a!=null&&!(typeof a=="string"&&a.length>0&&a.length<=96&&!dc.test(a)||Number.isSafeInteger(a)&&a>0)&&ct("args.chainId is invalid","invalid-chain"),a=null);let c=t.has("includeOpenSea")?t.get("includeOpenSea"):!1;return typeof c!="boolean"&&ct("args.includeOpenSea must be a literal boolean","invalid-boolean"),{family:r,chainId:a,address:i,includeOpenSea:c}}function yC(e){let t=_b.has(e.family),n=t?"evm":e.family,r=null;if(t)try{r=ro(e.address)}catch{r=null}return{family:n,chainId:e.chainId,address:r,wallet:uc({family:n,chainId:e.chainId,address:r}),evm:t}}function Or({requested:e,target:t,status:n,profileStatus:r,inventoryStatus:o,profileCalls:i=0,inventoryCalls:s=0,profile:a=null,holdings:c=[],evidence:l=[],gaps:u=[]}){return xd({requested:e,wallet:t.wallet,coverage:{status:n,profile:{status:r,calls:i},inventory:{status:o,calls:s}},profile:a,holdings:c,evidence:l,gapCodes:u})}function gC(){let e=process.env,t;try{t=Object.getOwnPropertyDescriptor(e,"OPENSEA_API_KEY")}catch{return}return t&&"value"in t?t.value:void 0}function Tb(e){let t=En(e);return t&&t.length<=uC?t:null}function kd(e,t){if(!e||typeof e!="object"||Array.isArray(e)||oo.isProxy(e))throw new Error("malformed-response");let n;try{n=Object.getPrototypeOf(e)}catch{throw new Error("malformed-response")}if(n!==Object.prototype&&n!==null)throw new Error("malformed-response");let r=new Map;for(let o of t){let i;try{i=Object.getOwnPropertyDescriptor(e,o)}catch{throw new Error("malformed-response")}if(i){if(!("value"in i))throw new Error("malformed-response");r.set(o,i.value)}}return r}function bC(e,t){if(!Array.isArray(e)||oo.isProxy(e))throw new Error("malformed-response");let n;try{n=Object.getOwnPropertyDescriptor(e,"length")}catch{throw new Error("malformed-response")}let r=n?.value;if(!Number.isInteger(r)||r<0)throw new Error("malformed-response");let o=Math.min(r,t),i=Id();for(let s=0;s<o;s+=1){let a;try{a=Object.getOwnPropertyDescriptor(e,String(s))}catch{throw new Error("malformed-response")}ln(i,a&&"value"in a?a.value:Symbol.for("opensea.invalid-row"))}return{rows:i,overflow:r>t}}function ns(e,t){return typeof e=="string"&&typeof t=="string"&&t.length>0&&e.includes(t)}function wC(e,t,n){let r=kd(e,["address","username"]);if(!r.has("address")||typeof r.get("address")!="string")throw new Error("malformed-response");let o;try{o=ro(r.get("address"))}catch{throw new Error("malformed-response")}if(o!==t){let a=new Error("profile-mismatch");throw a.profileMismatch=!0,a}let i,s=!1;if(r.has("username")&&r.get("username")!==null&&r.get("username")!==void 0){let a=r.get("username");i=ns(a,n)?null:vd(a),(i===null||i!==a)&&(i=void 0,s=!0)}return{address:o,...i!==void 0?{username:i}:{},usernameRejected:s}}function EC(e,t,n,r){let o=kd(e,["nfts","next"]);if(!o.has("nfts"))throw new Error("malformed-response");let i=o.has("next")?o.get("next"):null;if(i!==null&&(typeof i!="string"||i.length===0||i.length>lC||dc.test(i)||dC.test(i)||ns(i,r)))throw new Error("malformed-response");let{rows:s,overflow:a}=bC(o.get("nfts"),cC),c=Id();a&&ln(c,"INVENTORY_ROW_LIMIT"),typeof i=="string"&&ln(c,"INVENTORY_CURSOR_PRESENT");let l=new Map,u=new Set;for(let f of s){let m,h;try{if(typeof f=="symbol")throw new Error("invalid-row");if(m=kd(f,["identifier","contract","collection"]),!["identifier","contract"].every(E=>m.has(E)))throw new Error("invalid-row");if(![m.get("identifier"),m.get("contract")].every(E=>typeof E=="string"))throw new Error("invalid-row");if(ns(m.get("identifier"),r)||ns(m.get("contract"),r))throw new Error("invalid-row");h=Ad({chainId:t.chainId,contract:m.get("contract"),tokenId:m.get("identifier")})}catch{ln(c,"INVENTORY_ROW_REJECTED");continue}let y=null;if(m.has("collection")&&typeof m.get("collection")=="string"&&!ns(m.get("collection"),r))try{y=Sd({chainId:t.chainId,slug:m.get("collection")})}catch{y=null}if(y===null&&ln(c,"INVENTORY_COLLECTION_REJECTED"),u.has(h.id)){ln(c,"INVENTORY_CONFLICTING_HOLDING");continue}let g=l.get(h.id);if(g){let E=g.collection?.id??null,v=y?.id??null;E===null&&v!==null?(l.set(h.id,{nft:h,collection:y}),ln(c,"INVENTORY_DUPLICATE_HOLDING")):v===null||E===v?ln(c,"INVENTORY_DUPLICATE_HOLDING"):(l.set(h.id,{nft:h,collection:null}),u.add(h.id),ln(c,"INVENTORY_CONFLICTING_HOLDING"));continue}l.set(h.id,{nft:h,collection:y})}let d=Id(),p=[n];for(let{nft:f,collection:m}of[...l.values()].sort((h,y)=>pc(h.nft.id,y.nft.id))){let h=ts({status:"INDEXED",source:"opensea-v2-account-nfts",kind:"HOLDING",walletId:t.wallet.id,assetId:f.id,collectionId:m?.id??null,ownerBinding:nr});ln(p,h),ln(d,{...f,collection:m,ownerBinding:nr,evidenceRefs:[n.id,h.id].sort(pc)})}return{holdings:d,evidence:p,gaps:[...new Set(c)].sort(pc)}}function _r(e,t){if(typeof e!="object"&&typeof e!="function"||e===null||oo.isProxy(e))return;let n;try{n=Object.getOwnPropertyDescriptor(e,t)}catch{return}return n&&"value"in n?n.value:void 0}function vb(e,t){let n=t==="profile"?"PROFILE":"INVENTORY",r=_r(e,"status"),o=_r(e,"name"),i=_r(e,"message");return _r(e,"profileMismatch")===!0?"PROFILE_ADDRESS_MISMATCH":_r(e,"redirectRefused")===!0||Number.isInteger(r)&&r>=300&&r<400?`${n}_REDIRECT_REFUSED`:_r(e,"oversize")===!0?`${n}_RESPONSE_TOO_LARGE`:_r(e,"oracleTimeout")===!0||_r(e,"timeout")===!0||o==="AbortError"||o==="TimeoutError"||r===408?`${n}_TIMEOUT`:r===401?`${n}_AUTHENTICATION_FAILED`:r===403?`${n}_ACCESS_FORBIDDEN`:r===404?`${n}_NOT_FOUND`:r===429?`${n}_RATE_LIMITED`:Number.isInteger(r)&&r>=500&&r<=599?`${n}_UPSTREAM_UNAVAILABLE`:i==="malformed-response"?`${n}_MALFORMED`:`${n}_TRANSPORT_FAILED`}function Od(e){let t=Object.create(null);for(let[n,r]of e)Object.defineProperty(t,n,{value:r,writable:!1,enumerable:!0,configurable:!1});return t}function AC(e){if(!e||typeof e!="object"||Array.isArray(e)||oo.isProxy(e))throw new TypeError("OpenSea transport requires safe headers");let t;try{t=Reflect.ownKeys(e)}catch{throw new TypeError("OpenSea transport could not inspect headers")}let n=new Set(["Accept","x-api-key"]);if(t.length!==n.size||t.some(o=>typeof o!="string"||!n.has(o)))throw new TypeError("OpenSea transport requires only its fixed headers");let r=new Map;for(let o of n){let i;try{i=Object.getOwnPropertyDescriptor(e,o)}catch{throw new TypeError("OpenSea transport could not inspect headers")}if(!i||!("value"in i))throw new TypeError("OpenSea transport requires own-data headers");r.set(o,i.value)}if(r.get("Accept")!=="application/json"||Tb(r.get("x-api-key"))!==r.get("x-api-key"))throw new TypeError("OpenSea transport fixed headers are invalid");return Od([["Accept","application/json"],["x-api-key",r.get("x-api-key")]])}async function SC(e,t){if(typeof e!="string"||!e.startsWith("https://api.opensea.io/api/v2/"))throw new TypeError("OpenSea transport refused a non-fixed URL");if(!t||typeof t!="object"||oo.isProxy(t))throw new TypeError("OpenSea transport requires safe RequestInit");let n=Object.create(null);for(let r of["method","headers","body","signal","redirect"]){let o;try{o=Object.getOwnPropertyDescriptor(t,r)}catch{throw new TypeError("OpenSea transport could not inspect RequestInit")}if(o){if(!("value"in o))throw new TypeError("OpenSea transport requires own-data RequestInit");Object.defineProperty(n,r,{value:r==="headers"?AC(o.value):o.value,writable:!0,enumerable:!0,configurable:!0})}}return Object.defineProperty(n,"dispatcher",{value:void 0,writable:!0,enumerable:!0,configurable:!0}),globalThis.fetch(e,n)}function xb(e,t){let n=Od([["x-api-key",e]]);return Od([["method","GET"],["headers",n],["fetchImpl",SC],["timeoutMs",Ob],["retries",0],["dedupe",!1],["maxResponseBytes",t],["redirectPolicy","error"],["maxRedirects",0]])}function vC(e){if(e===void 0)return new Map;if(!e||typeof e!="object"||Array.isArray(e)||oo.isProxy(e))throw new TypeError("OpenSea internal client dependencies must be one non-Proxy object");let t,n;try{t=Object.getPrototypeOf(e),n=Reflect.ownKeys(e)}catch{throw new TypeError("OpenSea internal client dependencies could not be inspected safely")}if(t!==Object.prototype&&t!==null)throw new TypeError("OpenSea internal client dependencies must be a plain object");let r=new Set(["requestJson","readApiKey"]),o=new Map;for(let i of n){if(typeof i!="string"||!r.has(i))throw new TypeError("OpenSea internal client dependencies have an unknown field");let s;try{s=Object.getOwnPropertyDescriptor(e,i)}catch{throw new TypeError("OpenSea internal client dependencies could not be inspected safely")}if(!s||!("value"in s))throw new TypeError(`OpenSea internal client dependency ${i} must be an own data field`);o.set(i,s.value)}return o}function Nb(e){if(arguments.length>1)throw new TypeError("OpenSea internal client accepts at most one dependency object");let t=vC(e),n=t.has("requestJson")?t.get("requestJson"):R,r=t.has("readApiKey")?t.get("readApiKey"):gC;if(typeof n!="function"||typeof r!="function")throw new TypeError("OpenSea internal client dependencies must be functions");async function o(i){arguments.length!==1&&ct("exactly one args object is required","second-options-forbidden");let s=hC(i),a=yC(s);if(!s.includeOpenSea)return Or({requested:!1,target:a,status:"NOT_REQUESTED",profileStatus:"NOT_REQUESTED",inventoryStatus:"NOT_REQUESTED",gaps:["NOT_REQUESTED"]});if(!a.evm)return Or({requested:!0,target:a,status:"UNAVAILABLE",profileStatus:"UNAVAILABLE",inventoryStatus:"UNAVAILABLE",gaps:["UNSUPPORTED_CHAIN_FAMILY"]});if(a.chainId===null||!Object.hasOwn(Jo,a.chainId))return Or({requested:!0,target:a,status:"UNAVAILABLE",profileStatus:"UNAVAILABLE",inventoryStatus:"UNAVAILABLE",gaps:["UNSUPPORTED_CHAIN"]});if(!a.address||!a.wallet.id)return Or({requested:!0,target:a,status:"UNAVAILABLE",profileStatus:"UNAVAILABLE",inventoryStatus:"UNAVAILABLE",gaps:["INVALID_EVM_ADDRESS"]});let c;try{c=Tb(r())}catch{c=null}if(!c)return Or({requested:!0,target:a,status:"UNAVAILABLE",profileStatus:"UNAVAILABLE",inventoryStatus:"UNAVAILABLE",gaps:["API_KEY_UNAVAILABLE"]});let l=`https://api.opensea.io/api/v2/accounts/${a.address}`,u;try{let E=await n(l,xb(c,Ib));u=wC(E,a.address,c)}catch(E){return Or({requested:!0,target:a,status:"UNKNOWN",profileStatus:"UNKNOWN",inventoryStatus:"UNAVAILABLE",profileCalls:1,inventoryCalls:0,gaps:[vb(E,"profile")]})}let d=ts({status:"INDEXED",source:"opensea-v2-profile",kind:"PROFILE",walletId:a.wallet.id,address:a.address}),p={address:a.address,evidenceRef:d.id,...u.username!==void 0?{username:u.username}:{}},f=u.usernameRejected?["PROFILE_USERNAME_REJECTED"]:[],h=`https://api.opensea.io/api/v2/chain/${Jo[a.chainId]}/account/${a.address}/nfts?limit=20`,y;try{let E=await n(h,xb(c,kb));y=EC(E,a,d,c)}catch(E){return Or({requested:!0,target:a,status:"PARTIAL",profileStatus:f.length===0?"COMPLETE":"PARTIAL",inventoryStatus:"UNKNOWN",profileCalls:1,inventoryCalls:1,profile:p,evidence:[d],gaps:[...f,vb(E,"inventory")]})}let g=[...new Set([...f,...y.gaps])].sort(pc);return Or({requested:!0,target:a,status:g.length===0?"COMPLETE":"PARTIAL",profileStatus:f.length===0?"COMPLETE":"PARTIAL",inventoryStatus:y.gaps.length===0?"COMPLETE":"PARTIAL",profileCalls:1,inventoryCalls:1,profile:p,holdings:y.holdings,evidence:y.evidence,gaps:g})}return Object.freeze({enrich:o})}var h5=Object.freeze({profileMaxBytes:Ib,inventoryMaxBytes:kb,timeoutMs:Ob,retries:0,redirects:0,dedupe:!1});var xC=Nb();async function Cb(e){if(arguments.length!==1){let t=new TypeError("opensea enrichment: exactly one args object is required");throw t.code="second-options-forbidden",t}return xC.enrich(e)}var _d="onchain-investigator",Lb="oracle.onchain-investigator-provider/2",Rb=Object.freeze(["family","chainId","address","limit","cursor","includeOpenSea"]),IC=Object.freeze(["collection","components"]),kC=Object.freeze(["url","rpc","lcd","endpoint","fetch","transport","signer","privatekey","secret","prepare","broadcast","key","env","header","base","option","clock","now","access","jwt","code"]);function Tr(e,t="invalid-provider-request"){throw new Zr(`provider: ${e}`,t)}function OC(e,t){return(!e||typeof e!="object"||Pb.isProxy(e)||Array.isArray(e)||Object.getPrototypeOf(e)!==Object.prototype)&&Tr(`${t} must be a plain object`,"invalid-object"),e}function fc(e,t,n){OC(e,n);let r=new Set(t);Object.getOwnPropertySymbols(e).length>0&&Tr(`${n} has unknown field(s)`,"unknown-field");let o=Object.getOwnPropertyNames(e).filter(s=>{let a=Object.getOwnPropertyDescriptor(e,s);return!(s==="toJSON"&&a&&Object.hasOwn(a,"value")&&a.value===void 0)});for(let s of o){let a=Object.getOwnPropertyDescriptor(e,s);(!a||!a.enumerable||!Object.hasOwn(a,"value"))&&Tr(`${n}.${s} must be enumerable own data`,"invalid-object")}let i=o.filter(s=>!r.has(s));i.length&&(i.some(s=>{let a=s.replace(/[^a-z0-9]/giu,"").toLowerCase();return kC.some(c=>a.includes(c))})&&Tr(`${n} exposes a forbidden URL, transport, signer, or transaction field`,"forbidden-surface"),Tr(`${n} has unknown field(s)`,"unknown-field"))}function Ye(e,t){let n=e&&typeof e=="object"&&!Pb.isProxy(e)?Object.getOwnPropertyDescriptor(e,t):null;return n&&Object.hasOwn(n,"value")?n.value:void 0}function rs(e,t){e.length!==0&&Tr(`${t} does not accept caller options`,"forbidden-surface")}function _C(e){fc(e,Rb,"wallet");let t=Object.fromEntries(Rb.map(o=>[o,Ye(e,o)]).filter(([,o])=>o!==void 0)),n=Ye(e,"includeOpenSea"),r=n===void 0?!1:n;return typeof r!="boolean"&&Tr("wallet.includeOpenSea must be a literal boolean","invalid-boolean"),{...t,includeOpenSea:r}}function Td(e){let t=Ye(e,"coverage"),n=Ye(t,"collectorStatus"),r=Ye(t,"status"),o=n??r;return["COMPLETE","PARTIAL","UNAVAILABLE","UNKNOWN"].includes(o)?o:"UNKNOWN"}function $b(e){let t=Td(e);return{subject:Ye(e,"subject"),entities:Ye(e,"entities"),events:Ye(e,"events"),evidence:Ye(e,"evidence"),coverage:{history:{status:["COMPLETE","PARTIAL"].includes(t)?t:"UNKNOWN"}},gaps:Ye(e,"gaps")}}function Db(e,t,n,r,o){return Rt({schemaVersion:Lb,provider:_d,operation:e,execution:"read-only",reportOnly:!0,status:t,components:n,coordination:r,...o!==void 0?{openSea:o}:{},caveats:["Patterns are limited to supplied or collected public evidence.","Coordination signals do not establish identity, common control, fraud, or unlawful conduct."]})}function Ub(e={},...t){return rs(t,"health"),fc(e,[],"health"),Rt({ok:!0,provider:_d,execution:"read-only",reportOnly:!0,networkProbed:!1,status:"READY"})}function Bb(e={},...t){rs(t,"capabilities"),fc(e,[],"capabilities");let n=Object.fromEntries(Object.entries(Qn).filter(([r])=>r!=="unsupported").map(([r,o])=>[r,o.maxLimit]));return Rt({schemaVersion:Lb,provider:_d,operation:"capabilities",execution:"read-only",reportOnly:!0,networkProbed:!1,walletNetworkAccess:!0,status:"COMPLETE",walletEvidence:Qn,limits:{traversal:Wt,records:De,walletRequestLimit:1e3,walletRequestLimits:n,openSeaHoldings:Ue.holdingsPerSnapshot,nftOverlap:Ue},openSea:{schemaVersion:lc,optIn:!0,apiKeyEnvironment:"OPENSEA_API_KEY",chainSlugs:Jo,pagination:!1,identityInference:!1,launchRadar:{status:"UNAVAILABLE",reason:"OpenSea enrichment is investigator-only and is not a Launch Radar evidence source."}},surfaces:{signer:!1,prepare:!1,broadcast:!1,arbitraryUrl:!1,arbitraryRpc:!1,callerTransport:!1,callerCredential:!1}})}async function qb(e,...t){rs(t,"wallet");let n=_C(e),r=Object.fromEntries(["family","chainId","address","limit","cursor"].map(c=>[c,Ye(n,c)]).filter(([,c])=>c!==void 0)),o=await Wg(r),i=ju(o),s=yd($b(i)),a=await Cb({family:Ye(n,"family"),...Ye(n,"chainId")!==void 0?{chainId:Ye(n,"chainId")}:{},address:Ye(n,"address"),includeOpenSea:Ye(n,"includeOpenSea")});return Db("wallet",Td(i),i,s,a)}function Mb(e={},...t){rs(t,"analyze"),fc(e,IC,"analyze");let n=Ye(e,"collection"),r=Ye(e,"components"),o=n!==void 0,i=r!==void 0;Number(o)+Number(i)!==1&&Tr("analyze requires exactly one of collection or components","invalid-analysis-input");let a=o?ju(n):Fu(r),c=yd($b(a));return Db("analyze",Td(a),a,c)}function Fb(e,...t){return rs(t,"nftOverlap"),Ab(e)}var CC=/^arm|sign|execute|broadcast|submit|send|write|place/i,RC=/^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$/u;function jb(e,t){if(typeof e!="string"||!RC.test(e))throw new TypeError(`data facade ${t} must be a bounded string`);return e}var Nd=Object.freeze({"launch-radar":Object.freeze({health:(e,t)=>Py(e,t),status:(e,t)=>Ly(e,t),snapshot:(e,t)=>$y(e,t),candidates:(e,t)=>Dy(e,t),rpcHealth:(e,t)=>Uy(e,t),evaluateStrategy:(e,t)=>By(e,t)}),"onchain-investigator":Object.freeze({health:e=>Ub(e),capabilities:e=>Bb(e),wallet:e=>qb(e),analyze:e=>Mb(e),nftOverlap:e=>Fb(e)})});function PC(e,t){let n=jb(e,"providerId"),r=jb(t,"op");if(CC.test(r))throw new Error(`data facade forbidden op: ${n}.${r}`);let o=Au(n);if(!o)throw new Error(`unknown data provider: ${n}`);if(!Array.isArray(o.ops)||!o.ops.includes(r))throw new Error(`data facade: provider ${n} does not support op ${r}`);let i=Nd[n];if(!i||typeof i[r]!="function")throw new Error(`data facade: no handler wired for ${n}.${r}`)}function LC(e,t,n){if(e?.allowCallerOptions!==!1)return;if(!t||typeof t!="object"||Array.isArray(t)||NC.isProxy(t))throw new Error(`${n} rejects caller options`);let r,o;try{r=Object.getPrototypeOf(t),o=Reflect.ownKeys(t)}catch{throw new Error(`${n} rejects caller options`)}if(r!==Object.prototype&&r!==null)throw new Error(`${n} rejects caller options`);if(o.length>0)throw new Error(`${n} rejects nonempty caller options`)}async function Hb(e,t,n={},r={}){PC(e,t);let o=Au(e);return LC(o,r,`data facade: ${e}.${t}`),o?.allowCallerOptions===!1?Nd[e][t](n):Nd[e][t](n,r)}var $C="oracle-launch-radar-mcp",DC="1",zb=Object.freeze({type:"object",properties:{},additionalProperties:!1}),Cd=Object.freeze([{name:"launch_radar_health",description:"Launch Radar data-plane health: static capability flags only (mode, executionReady, signingReady, broadcastReady, funded). Always shadow-only and unfunded. Read-only, no arguments.",inputSchema:zb},{name:"launch_radar_status",description:"Current durable shadow-cycle status read from local disk: mode, status, ambiguous, candidate/evidence counts, and the honest autonomous-trading env-gate state. Reports evidence: UNAVAILABLE with a reason if the store cannot be read. Never signs or broadcasts. Read-only, no arguments (store path is server-configured, never caller-supplied).",inputSchema:zb},{name:"launch_radar_snapshot",description:"Full durable snapshot: strategyStatus, cursor, normalized candidates, and the evidence event log, straight off local disk. Read-only, no arguments beyond optional result-size limits.",inputSchema:{type:"object",properties:{limit:{type:"integer",minimum:1,maximum:500,description:"Max candidates to return (default 200)."},evidenceLimit:{type:"integer",minimum:1,maximum:500,description:"Max most-recent evidence records to return (default 100)."}},additionalProperties:!1}},{name:"launch_radar_candidates",description:"Recompute normalized PASS/WARN/BLOCK/UNKNOWN candidates from caller-supplied discovery + evaluation data through the exact launch-radar service/domain normalization. Missing evaluations come back UNKNOWN, never a fabricated PASS. Makes no network call itself \u2014 all inputs are supplied by the caller.",inputSchema:{type:"object",properties:{discoveries:{type:"array",items:{type:"object"},maxItems:200},evaluations:{type:"array",items:{type:"object"},maxItems:200},status:{type:"string",enum:["LIVE","UNKNOWN","UNAVAILABLE"]},cursor:{},whyBlocked:{type:"array",items:{type:"string"},maxItems:50},observedAt:{type:"string"}},additionalProperties:!1}},{name:"launch_radar_rpc_health",description:"Rank caller-supplied RPC probe samples (freshness/error-rate/latency) through the exact deterministic rpc-health module. This tool performs no probe itself \u2014 supply already-collected samples keyed by endpoint id. An endpoint with no sample counts as down; all-down reports evidence: UNAVAILABLE rather than a fabricated best endpoint.",inputSchema:{type:"object",required:["endpoints"],properties:{endpoints:{type:"array",items:{type:"object",required:["id"],properties:{id:{type:"string"}}},minItems:1,maxItems:64},samples:{type:"object",description:"Map of endpoint id -> { blockNumber, chainId, timestampMs } or { ok: false, error }."},retries:{type:"integer",minimum:0,maximum:3},concurrency:{type:"integer",minimum:1,maximum:32},maxHeadLagBlocks:{type:"number"},maxHeadAgeMs:{type:"number"}},additionalProperties:!1}},{name:"launch_radar_evaluate_strategy",description:"Pure, report-only strategy-policy evaluation over an exact caller-supplied strategy + observation (spend/liquidity/slippage/TTL/retry/kill-switch gates, plus the six-gate autonomous checklist). Reads the live ORACLE_AUTONOMOUS_TRADING env var for an honest autonomous-gate readout. Never signs, arms, or executes \u2014 reportOnly is always true.",inputSchema:{type:"object",required:["strategy","observation"],properties:{strategy:{type:"object"},observation:{type:"object"}},additionalProperties:!1}}]),UC=Object.freeze({launch_radar_health:"health",launch_radar_status:"status",launch_radar_snapshot:"snapshot",launch_radar_candidates:"candidates",launch_radar_rpc_health:"rpcHealth",launch_radar_evaluate_strategy:"evaluateStrategy"});async function Rd(e,t={}){let n=UC[e];if(!n)throw new Error(`unknown tool: ${e}`);return Hb("launch-radar",n,t,{})}function BC(e){return{content:[{type:"text",text:JSON.stringify(e)}]}}var N5=Object.freeze({name:$C,version:DC,tools:Cd,async call(e,t){return BC(await Rd(e,t))}});function OM(e){let t;try{t=new URL(String(e||""))}catch{throw new Error("ORACLE_DATA_URL must be a loopback HTTP URL")}let n=t.hostname==="127.0.0.1"||t.hostname==="localhost"||t.hostname==="[::1]";if(t.protocol!=="http:"||!n||t.pathname!=="/"||t.username||t.password||t.search||t.hash)throw new Error("ORACLE_DATA_URL must be an uncredentialed loopback HTTP URL");return t.href.replace(/\/$/,"")}var Mf=OM(El("ORACLE_DATA_URL","MAD_DESK_URL","http://127.0.0.1:8787")),_M=2*1024*1024;async function TM(e,t=_M){let n=Number(e.headers?.get?.("content-length")||0);if(Number.isFinite(n)&&n>t)throw new Error("data response exceeded the size limit");if(!e.body?.getReader){let s=await e.text();if(Buffer.byteLength(s)>t)throw new Error("data response exceeded the size limit");try{return JSON.parse(s)}catch{return{}}}let r=e.body.getReader(),o=[],i=0;try{for(;;){let{done:s,value:a}=await r.read();if(s)break;let c=Buffer.from(a);if(i+=c.length,i>t)throw await r.cancel("response too large").catch(()=>{}),new Error("data response exceeded the size limit");o.push(c)}}finally{r.releaseLock?.()}try{return JSON.parse(Buffer.concat(o).toString("utf8"))}catch{return{}}}var Iv={type:"object",required:["chainId","route","leg","target","calldataHash","blockNumber","blockHash","sender","owner","valueWei","success","reverted","result","source","quotedAtMs","expiresAtMs"],properties:{chainId:{type:"number",const:4663},route:{type:"string"},leg:{type:"string"},target:{type:"string",description:"Exact eth_call target for this executable leg."},calldataHash:{type:"string"},blockNumber:{type:"string"},blockHash:{type:"string"},orderHash:{type:"string"},protocolAddress:{type:"string"},sender:{type:"string"},owner:{type:"string"},valueWei:{type:"string"},success:{type:"boolean",const:!0},reverted:{type:"boolean",const:!1},result:{type:"string",description:"Successful eth_call return bytes as 0x-prefixed even-length hex."},source:{type:"string"},quotedAtMs:{type:"number"},expiresAtMs:{type:"number"}}},Ai={oneOf:[{type:"object",required:["chainId","route","leg","amountWei","source","calldataHash","blockNumber","blockHash","gasLimit","gasPriceWei","quotedAtMs","expiresAtMs","simulation","mac"],properties:{chainId:{type:"number",const:4663},route:{type:"string"},leg:{type:"string",description:"Exact executable leg: Anvil, conversion, Seaport, approval, or wrap/unwrap prerequisite."},approvalChecked:{type:"boolean",description:"Required true on Seaport fulfillment/acceptance evidence after an exact fresh approval-state read."},approvalRequired:{type:"boolean"},amountWei:{type:"string"},source:{type:"string"},calldataHash:{type:"string"},blockNumber:{type:"string"},blockHash:{type:"string"},gasLimit:{type:"string"},gasPriceWei:{type:"string"},orderHash:{type:"string"},protocolAddress:{type:"string"},simulation:Iv,mac:{type:"string"},quotedAtMs:{type:"number"},expiresAtMs:{type:"number"}}},{type:"array",items:{type:"object",required:["chainId","route","leg","amountWei","source","calldataHash","blockNumber","blockHash","gasLimit","gasPriceWei","quotedAtMs","expiresAtMs","simulation","mac"],properties:{chainId:{type:"number",const:4663},route:{type:"string"},leg:{type:"string"},approvalChecked:{type:"boolean"},approvalRequired:{type:"boolean"},amountWei:{type:"string"},source:{type:"string"},calldataHash:{type:"string"},blockNumber:{type:"string"},blockHash:{type:"string"},gasLimit:{type:"string"},gasPriceWei:{type:"string"},orderHash:{type:"string"},protocolAddress:{type:"string"},simulation:Iv,mac:{type:"string"},quotedAtMs:{type:"number"},expiresAtMs:{type:"number"}}}}]},Ov=[...Cd,{name:"data_catalog",description:"List every read-plane provider the desk exposes (id, venue, chainIds, ops). Discovery only; generic provider dispatch is not exposed by this public MCP.",inputSchema:{type:"object",properties:{}}},{name:"data_health",description:"Health of every read-plane provider (which public APIs are up / configured). Read-only.",inputSchema:{type:"object",properties:{}}},{name:"tool_output_shape",description:"Key-shape outline of a tool's most recent observed result (key names + value types only, learned from live calls). Read this before writing a code-mode script that parses another tool's output, so joins are written against real keys instead of guessed ones. Returns null when the tool has not been called yet this deployment.",inputSchema:{type:"object",required:["tool"],properties:{tool:{type:"string",description:"Tool name whose last observed output shape to return."}},additionalProperties:!1}},{name:"evm_token_sniper_scan",description:"Scan and optionally prepare a guarded token buy through the same armed local-signer path on every supported EVM chain. Robinhood Chain 4663 is the default. Resolves identity and pools, checks structural risk, proves the sell route, quotes, then hands execution to the loopback signer under owner policy.",inputSchema:{type:"object",required:["tokenAddress"],properties:{chainId:{type:"number",default:4663},tokenAddress:{type:"string"},tokenIn:{type:"string",description:"Base/quote token address required for quote and prepare."},amountIn:{type:"string",description:"Raw integer input amount."},recipient:{type:"string",description:"User wallet that receives tokens. Required for prepare."},slippageBps:{type:"number",default:50},prepare:{type:"boolean",default:!1}}}},{name:"hlp_vault_tracker",description:"Read-only Hyperliquid vault tracker, including HLP. List summaries, inspect one vault, or read a user's vault equities. Never deposits, withdraws, signs, or submits.",inputSchema:{type:"object",properties:{mode:{type:"string",enum:["hlp","summaries","details","mine"],default:"hlp"},vaultAddress:{type:"string"},user:{type:"string"}}}},{name:"hl_precompile_read",description:"Read HyperCore through HyperEVM L1Read precompiles (0x800-0x809). Positions, oracle/mark, spot, HLP vault equity, withdrawable. eth_call only. Never writes, never CoreWriter.",inputSchema:{type:"object",properties:{op:{type:"string",enum:["l1BlockNumber","markPx","oraclePx","spotPx","position","spotBalance","vaultEquity","hlp","withdrawable"],default:"l1BlockNumber"},user:{type:"string"},vaultAddress:{type:"string"},index:{type:"number"},perp:{type:"number"},token:{type:"number"}}}},{name:"protocol_eval",description:"Run protocol-builder language evals: Solidity templates, Rust/Anchor vault, Bitcoin Miniscript. Read-only. Not a firm audit. Never deploys or signs.",inputSchema:{type:"object",properties:{}}},{name:"hl_delta_neutral",description:"Hyperliquid delta-neutral funding carry. Scan, quote, or run one loop tick. Owner-operated. Not automated.",inputSchema:{type:"object",properties:{op:{type:"string",enum:["scan","quote","loop"],default:"scan"},coin:{type:"string"},notionalUsd:{type:"number"},mode:{type:"string",enum:["shadow","live"],default:"shadow"},limit:{type:"number"}}}},{name:"lighter_delta_neutral",description:"Lighter.xyz delta-neutral funding carry. Scan, quote, or run one loop tick. Owner-operated official sendTx signer. Not automated.",inputSchema:{type:"object",properties:{op:{type:"string",enum:["scan","quote","loop"],default:"scan"},coin:{type:"string"},notionalUsd:{type:"number"},mode:{type:"string",enum:["shadow","live"],default:"shadow"},limit:{type:"number"}}}},{name:"llama_protocols",description:"DeFiLlama: full protocol list with TVL, chain(s), category, 1d/7d change. The primary cross-chain protocol scanner. Read-only. Large payload \u2014 filter client-side.",inputSchema:{type:"object",properties:{}}},{name:"llama_prices",description:"DeFiLlama current prices for coins keyed 'chain:address' or 'coingecko:id' (comma-joined or array). Read-only.",inputSchema:{type:"object",required:["coins"],properties:{coins:{type:"string",description:"comma-joined coin keys, e.g. 'ethereum:0x...,coingecko:bitcoin'"}}}},{name:"dex_search",description:"DexScreener search across all chains by symbol/name/address. Returns matching pairs with price, liquidity, volume, chain. Read-only.",inputSchema:{type:"object",required:["q"],properties:{q:{type:"string",description:"query: symbol, name, or token address"}}}},{name:"dex_token",description:"DexScreener pairs for a specific token address (any chain). Price, liquidity, volume, pair addresses. Read-only.",inputSchema:{type:"object",required:["address"],properties:{address:{type:"string"}}}},{name:"lifi_quote",description:"LI.FI cross-chain / DEX aggregator quote (no key). Best route + expected out for a swap or bridge. Read-only.",inputSchema:{type:"object",required:["fromChain","toChain","fromToken","toToken","fromAmount"],properties:{fromChain:{type:"number"},toChain:{type:"number"},fromToken:{type:"string"},toToken:{type:"string"},fromAmount:{type:"string",description:"raw integer amount (wei-scale)"},fromAddress:{type:"string",description:"optional; defaults to operator wallet"}}}},{name:"portfolio_balance",description:"Read-only balance aggregation across every configured EVM chain plus Solana, Bitcoin, and Hyperliquid. Reports native assets, supported token/collectible reads, failed or missing providers, unverified assets, timestamps, and known priced value without pretending it is a complete total. Public addresses only; never signs or broadcasts.",inputSchema:{type:"object",properties:{addresses:{type:"object",description:"Optional public wallet addresses by family. Omit configured families to use ORACLE_*_ADDRESS defaults.",properties:{evm:{type:"string"},solana:{type:"string"},bitcoin:{type:"string"},hyperliquid:{type:"string"}}},evmChainIds:{type:"array",items:{type:"number"},description:"Optional EVM chain subset. Default is every configured EVM chain."},includeTokens:{type:"boolean",description:"Include supported token reads. Default true."},includeCollectibles:{type:"boolean",description:"Include supported collectible reads. Default true."},includePrices:{type:"boolean",description:"Fetch current DeFiLlama native prices. Default true."}}}},{name:"portfolio_snapshot",description:"Query the current multichain balance and NFT inventory, then append one compact profile-local observation for historical tracking. Stores public-address fingerprint, coverage, breakdown, and known priced value only; no keys, signatures, executable payloads, or raw NFT metadata. Returns the live balance, NFT result, and recorded snapshot.",inputSchema:{type:"object",properties:{addresses:{type:"object",properties:{evm:{type:"string"},solana:{type:"string"},bitcoin:{type:"string"},hyperliquid:{type:"string"}}},evmChainIds:{type:"array",items:{type:"number"}},includeTokens:{type:"boolean"},includeCollectibles:{type:"boolean"},includePrices:{type:"boolean"},includeNfts:{type:"boolean",description:"Include provider-estimated NFT value. Default true."}}}},{name:"portfolio_history",description:"Read profile-local portfolio observations in a time range. Unknown or unavailable values remain null and are never converted to zero. Defaults to the configured public-address portfolio fingerprint.",inputSchema:{type:"object",properties:{addresses:{type:"object",properties:{evm:{type:"string"},solana:{type:"string"},bitcoin:{type:"string"},hyperliquid:{type:"string"}}},portfolioId:{type:"string"},allPortfolios:{type:"boolean",description:"Return observations for every public-address fingerprint in this profile."},since:{type:"string",description:"Inclusive ISO 8601 lower bound."},until:{type:"string",description:"Inclusive ISO 8601 upper bound."},limit:{type:"number",description:"1-1000, default 100."},order:{type:"string",enum:["asc","desc"]}}}},{name:"portfolio_value_graph",description:"Render a static SVG line graph from profile-local portfolio snapshots. Plots known priced value only, labels incomplete coverage, includes provider-estimated NFT values when recorded, and omits unavailable observations instead of plotting fake zeroes.",inputSchema:{type:"object",properties:{addresses:{type:"object",properties:{evm:{type:"string"},solana:{type:"string"},bitcoin:{type:"string"},hyperliquid:{type:"string"}}},portfolioId:{type:"string"},allPortfolios:{type:"boolean"},since:{type:"string"},until:{type:"string"},limit:{type:"number",description:"Historical observations to consider, max 1000."},maxPoints:{type:"number",description:"Rendered point cap, 2-500, default 200."}}}},{name:"evm_simulate_transaction",description:"Simulate an EVM transaction BEFORE signing: catches reverts via eth_call at pending state, decodes the reason (Error(string), Panic codes, or the raw selector for custom errors), and returns a buffered gas estimate usable as gasLimit. Also flags calls that return boolean false without reverting (some ERC-20s signal failure that way). An unreachable node returns 'unavailable', never 'would fail'. A pass reflects current chain state and is not a guarantee the transaction lands.",inputSchema:{type:"object",properties:{chainId:{type:"number"},tx:{type:"object",description:"{ from, to, data, value } \u2014 value in wei.",properties:{from:{type:"string"},to:{type:"string"},data:{type:"string"},value:{type:"string"}},required:["to"]},estimateGas:{type:"boolean",description:"Default true."},gasBufferPercent:{type:"number",description:"Headroom over the estimate. Default 20."}},required:["chainId","tx"]}},{name:"nft_mint_prepare",description:"Prepare an UNSIGNED EVM NFT mint. Discovers the collection's mint entrypoint from deployed bytecode (ERC-721 does not standardize minting), encodes calldata, prices a competitive EIP-1559 bid from fee-history percentiles, enforces gas-war caps, and reports contract risk. Returns wallet-signable calldata \u2014 never signs or broadcasts. Supply gasLimit plus maxTotalGasWei to enforce the caps; without them the artifact is returned with a loud warning.",inputSchema:{type:"object",properties:{contract:{type:"string",description:"NFT contract address."},chainId:{type:"number"},minter:{type:"string",description:"Address that will sign and receive."},quantity:{type:"number",description:"How many to mint. Default 1."},urgency:{type:"string",enum:["normal","fast","war"],description:"Bid aggressiveness. Default war."},signature:{type:"string",description:"Force a specific mint signature when several exist."},gasLimit:{type:"number"},valueWei:{type:"string",description:"Mint price in wei."},maxTotalGasWei:{type:"string",description:"Hard total gas cap."},maxFeePerGasWei:{type:"string"},maxPriorityFeePerGasWei:{type:"string"}},required:["contract","chainId","minter"]}},{name:"nft_mint_gas_price",description:"Price a competitive EIP-1559 bid for a contested transaction using eth_feeHistory reward percentiles (p50 normal / p75 fast / p90 war). maxFeePerGas is a refundable ceiling; the tip is the real spend. Reports viable:false when a cap would put the bid below the observed market rather than silently clamping to a losing number.",inputSchema:{type:"object",properties:{chainId:{type:"number"},urgency:{type:"string",enum:["normal","fast","war"]},gasLimit:{type:"number"},maxFeePerGasWei:{type:"string"},maxPriorityFeePerGasWei:{type:"string"},maxTotalGasWei:{type:"string"}},required:["chainId"]}},{name:"nft_mint_trigger",description:"Create a mint-open trigger. DEFAULTS TO alert_only: Oracle watches, notifies, and prepares a signable artifact. Firing unattended requires ALL of: actionMode set to the exact string 'execute', ORACLE_AUTONOMOUS_TRADING=1, and a bounded grant naming this exact contract/chain with maxTotalGasWei, maxValueWei, and an expiry under 24h. Any missing or mismatched bound silently downgrades to alert_only and says so. Even an armed trigger produces an unsigned artifact.",inputSchema:{type:"object",properties:{contract:{type:"string"},chainId:{type:"number"},minter:{type:"string"},quantity:{type:"number"},urgency:{type:"string",enum:["normal","fast","war"]},actionMode:{type:"string",enum:["alert_only","execute"],description:"Default alert_only. Only the exact string 'execute' can arm, and only with a grant."},grant:{type:"object",description:"Required for execute: { contract, chainId, maxTotalGasWei, maxValueWei, expiresAt }."}},required:["contract","chainId"]}},{name:"nft_mancer_os_scan",description:"Fail-closed scan for a Mancers-gated Robinhood (4663) NFT mint. Requires bytecode that references Mancers 0x797a\u2026, value=0, a sim with Transfer to the minter and no setApprovalForAll. Never returns safe. executeFire needs actionMode=execute, ORACLE_AUTONOMOUS_MINT=1, and a grant naming this exact contract with maxValueWei=0. Trading flag does not unlock mint. Returns unsigned mint + revoke calldata \u2014 never signs.",inputSchema:{type:"object",properties:{contract:{type:"string"},chainId:{type:"number"},minter:{type:"string"},bytecode:{type:"string"},valueWei:{type:"string"},simulation:{type:"object"},actionMode:{type:"string",enum:["alert_only","execute"]},grant:{type:"object"}},required:["contract","chainId","minter","bytecode"]}},{name:"contract_risk_scan",description:"Check what powers a contract's deployer still holds before you interact with it: mint, blacklist, pause, fee changes, and upgradeability (EIP-1967, legacy zeppelinos, EIP-1822 proxies). Complements a sell simulation \u2014 that proves a token is sellable NOW, this asks whether someone can change that afterwards. Read-only eth_getCode/eth_getStorageAt; never returns 'safe', only 'unknown-risk', 'elevated', or 'high', because absence of a selector is not proof of safety.",inputSchema:{type:"object",properties:{address:{type:"string",description:"Contract address (0x, 40 hex)."},chainId:{type:"number",description:"EVM chain id."}},required:["address","chainId"]}},{name:"nft_inventory",description:"Read all discoverable NFTs for configured EVM, Solana, and Bitcoin addresses. Returns normalized assets, image URLs, estimated values, per-chain partial failures, flagged/NSFW items separated from visible items, listing coverage, and explicit unsupported chains. Read-only.",inputSchema:{type:"object",properties:{addresses:{type:"object",properties:{evm:{type:"string"},solana:{type:"string"},bitcoin:{type:"string"}}},chains:{type:"array",items:{type:"string"},description:"Optional chain slug subset."},pageSize:{type:"number",description:"OpenSea items per page, max 200."},maxPages:{type:"number",description:"Maximum pages per chain, max 25."},bitcoinLimit:{type:"number"},includePnl:{type:"boolean",description:"Include OpenSea-indexed account PnL when available. Default true."},costBasis:{type:"object",description:"Optional user-supplied assetKey -> {costUsd,feesUsd,acquiredAt,source}. Missing basis stays unavailable, never zero."}}}},{name:"nft_gallery",description:"Generate one static NFT contact-sheet image page from wallet inventory or supplied normalized items. External metadata is never rendered as HTML; only allowlisted JPEG/PNG/WebP bytes are embedded and unsafe or missing media becomes a placeholder.",inputSchema:{type:"object",properties:{addresses:{type:"object",properties:{evm:{type:"string"},solana:{type:"string"},bitcoin:{type:"string"}}},chains:{type:"array",items:{type:"string"}},items:{type:"array",items:{type:"object"},description:"Optional normalized inventory items. Omit to scan configured wallets."},page:{type:"number",description:"1-based gallery page."},pageSize:{type:"number",description:"1-12 items per page."}}}},{name:"nft_pnl",description:"NFT PnL with explicit methodology. Returns OpenSea-indexed account-level PnL where available plus per-item unrealized estimates only when both user-supplied acquisition cost and provider estimated current value exist. Missing history is unavailable, never zero.",inputSchema:{type:"object",properties:{addresses:{type:"object",properties:{evm:{type:"string"},solana:{type:"string"},bitcoin:{type:"string"}}},chains:{type:"array",items:{type:"string"}},costBasis:{type:"object"}}}},{name:"nft_prepare_list",description:"Prepare an NFT listing for OpenSea EVM, Magic Eden Solana, or Satflow Bitcoin after explicit user review. Requires userConfirmed=true plus asset, marketplace, price, currency where applicable, and future expiry. Magic Eden Solana also requires confirmation exactly: list <tokenMint> on magiceden-sol for <priceSol> SOL until <expiry>. Returns approval/signing actions, an unsigned Solana transaction, or an unsigned Bitcoin PSBT. Never signs, submits, or broadcasts.",inputSchema:{type:"object",required:["marketplace","userConfirmed"],properties:{marketplace:{type:"string",enum:["opensea","magiceden","magiceden-sol","satflow"]},userConfirmed:{type:"boolean"},chain:{type:"string"},seller:{type:"string"},contract:{type:"string"},tokenId:{type:"string"},quantity:{type:"number"},priceAmount:{type:"string"},currency:{type:"string"},endTime:{type:"string"},useCreatorFee:{type:"boolean"},taker:{type:"string"},tokenMint:{type:"string"},tokenATA:{type:"string"},auctionHouse:{type:"string"},priceSol:{type:"string"},expiry:{description:"Future ISO 8601 timestamp or Unix seconds. Magic Eden Solana listings require finite future expiry; no-expiry is refused."},confirmation:{type:"string",description:"Required for Magic Eden Solana listings. Exact phrase: list <tokenMint> on magiceden-sol for <priceSol> SOL until <expiry>."},inscriptionId:{type:"string"},runesOutput:{type:"string"},ordAddress:{type:"string"},receiveAddress:{type:"string"},priceSats:{type:"string"},tapKey:{type:"string"},collectionSlug:{type:"string"}}}},{name:"nft_trait_snipe",description:"Evaluate an OpenSea EVM NFT trait-snipe candidate using caller-supplied fresh listings, trait floor, max price, minimum discount, recent real trait sales, and trait volume gates. Returns BUY/PASS plus an unsigned local-only buy intent. Never signs, submits, broadcasts, or treats rarity metadata alone as evidence.",inputSchema:{type:"object",required:["marketplace","chain","collectionSlug","contract","traitType","traitValue","maxPriceEth","minDiscountBps","minTraitSales","minTraitVolumeEth","traitFloorEth","listings","sales"],properties:{marketplace:{type:"string",enum:["opensea"]},chain:{type:"string"},collectionSlug:{type:"string"},contract:{type:"string"},traitType:{type:"string"},traitValue:{type:"string"},maxPriceEth:{type:"string"},minDiscountBps:{type:"number"},minTraitSales:{type:"number"},minTraitVolumeEth:{type:"string"},minTraitListings:{type:"number"},maxListingAgeMs:{type:"number"},maxSaleAgeMs:{type:"number"},collectionFloorEth:{type:"string"},traitFloorEth:{type:"string"},listings:{type:"array",items:{type:"object"}},sales:{type:"array",items:{type:"object"}}}}},{name:"anvil_nft_scan",description:"Scan exact Anvil inventory IDs on Robinhood Chain for current NFT traits and fee-inclusive buy quotes. Read-only.",inputSchema:{type:"object",required:["market","collection"],properties:{market:{type:"string"},collection:{type:"string"},tokenIds:{type:"array",items:{type:"string"}},inventoryCompletenessEvidence:{type:"object"},traitType:{type:"string"},traitFilters:{type:"array",items:{type:"object"}},includeAll:{type:"boolean"},minStars:{type:"number"},maxItems:{type:"number"}}}},{name:"anvil_opensea_arb",description:"Compare exact Anvil inventory and fee quotes against exact OpenSea listings and offers. ARB requires validated complete inventory plus fresh authenticated exact-leg gas and successful simulation evidence for every executable leg. Read-only.",inputSchema:{type:"object",required:["market","collection","slug","owner","gasEvidence","minNetWei"],anyOf:[{required:["conversionGasEvidence"]},{required:["gasPriceEvidence"]}],properties:{market:{type:"string"},collection:{type:"string"},slug:{type:"string"},owner:{type:"string",description:"Execution owner/sender bound into every simulated leg."},tokenIds:{type:"array",items:{type:"string"}},inventoryCompletenessEvidence:{type:"object"},traitType:{type:"string"},traitFilters:{type:"array",items:{type:"object"}},includeAll:{type:"boolean"},minStars:{type:"number"},maxItems:{type:"number"},gasEvidence:Ai,conversionGasEvidence:Ai,gasPriceEvidence:Ai,minNetWei:{type:"string"}}}},{name:"anvil_marketplace_scan",description:"Scan every live Anvil market and its full inventory by default with collection-specific metadata traits and exact quote checks. Explicit bounds return complete=false plus continuation evidence. Read-only.",inputSchema:{type:"object",properties:{maxMarkets:{type:"number"},maxItemsPerMarket:{type:"number"},marketConcurrency:{type:"number"},includeEmpty:{type:"boolean"},collectionProfiles:{type:"object",additionalProperties:{type:"object"}},snapshotCompletenessEvidence:{type:"object"}}}},{name:"anvil_marketplace_opensea_arb",description:"Scan every live Anvil market and full inventory by default where exact OpenSea slug mappings exist. ARB requires validated complete discovery plus fresh authenticated exact-leg gas and successful simulation evidence; incomplete scans return WATCH with deterministic continuation. Read-only.",inputSchema:{type:"object",required:["openseaSlugs","owner","gasEvidence","minNetWei"],anyOf:[{required:["conversionGasEvidence"]},{required:["gasPriceEvidence"]}],properties:{openseaSlugs:{type:"object",additionalProperties:{type:"string"}},owner:{type:"string",description:"Execution owner/sender bound into every simulated leg."},collectionProfiles:{type:"object",additionalProperties:{type:"object"}},snapshotCompletenessEvidence:{type:"object"},maxMarkets:{type:"number"},maxItemsPerMarket:{type:"number"},marketConcurrency:{type:"number"},includeEmpty:{type:"boolean"},gasEvidence:Ai,conversionGasEvidence:Ai,gasPriceEvidence:Ai,minNetWei:{type:"string"}}}},{name:"anvil_prepare_buy",description:"Build one exact-token Anvil buy action for Oracle's armed owner-local signer. The caller cap may reject but never widen the exact fresh quote encoded and confirmed. Requires sufficient allowance, exact human confirmation, simulation, and arm.",inputSchema:{type:"object",required:["market","collection","tokenId","buyer","maxTotalCostRaw","confirmedTotalCostRaw","maxNativeSwapFeeWei","actionGasLimit","maxFeePerGasWei","actionNonce","tradeId","userConfirmed"],properties:{market:{type:"string"},collection:{type:"string"},tokenId:{type:"string"},buyer:{type:"string"},maxTotalCostRaw:{type:"string"},confirmedTotalCostRaw:{type:"string",description:"Exact freshly quoted total cost reviewed by the user; must equal the re-read quote."},maxNativeSwapFeeWei:{type:"string"},actionGasLimit:{type:"string"},maxFeePerGasWei:{type:"string"},maxPriorityFeePerGasWei:{type:"string"},actionNonce:{type:"number"},ttlMs:{type:"number"},tradeId:{type:"string"},userConfirmed:{type:"boolean",const:!0}}}},{name:"anvil_prepare_sell",description:"Build one exact-token Anvil sale action for Oracle's armed owner-local signer. The caller floor may reject but never widen the exact fresh net payout encoded and confirmed. Requires pre-existing ERC721 approval, exact human confirmation, simulation, and arm.",inputSchema:{type:"object",required:["market","collection","tokenId","seller","minPayoutRaw","confirmedNetPayoutRaw","maxNativeSwapFeeWei","actionGasLimit","maxFeePerGasWei","actionNonce","tradeId","userConfirmed"],properties:{market:{type:"string"},collection:{type:"string"},tokenId:{type:"string"},seller:{type:"string"},minPayoutRaw:{type:"string"},confirmedNetPayoutRaw:{type:"string",description:"Exact freshly quoted net payout reviewed by the user; must equal the re-read quote."},maxNativeSwapFeeWei:{type:"string"},actionGasLimit:{type:"string"},maxFeePerGasWei:{type:"string"},maxPriorityFeePerGasWei:{type:"string"},actionNonce:{type:"number"},ttlMs:{type:"number"},tradeId:{type:"string"},userConfirmed:{type:"boolean",const:!0}}}},{name:"stonkbrokers_scan_loot",description:"Verify StonkBroker parent availability and nested ERC-6551 loot custody, then rank matching traits without treating rarity as buy evidence. Read-only.",inputSchema:{type:"object",required:["candidates"],properties:{candidates:{type:"array",items:{type:"object"}},traitType:{type:"string"},minStars:{type:"number"}}}},{name:"stonkbrokers_broker_desk",description:"Read StonkBroker owner/TBA identities and Clock In state, or prepare an unsigned permissionless Clock In call. No signing or broadcast.",inputSchema:{type:"object",properties:{owner:{type:"string"},brokerTokenIds:{type:"array",items:{type:"string"}},which:{type:"string"},mode:{type:"string"},batchSize:{type:"number"},minOutBps:{type:"number"}}}},{name:"rpc_balance",description:"Native token balance of an address on a chain via public RPC. Read-only. Omit address to read the operator wallet.",inputSchema:{type:"object",required:["chainId"],properties:{chainId:{type:"number"},address:{type:"string"}}}},{name:"rpc_block",description:"Latest block number on a chain via public RPC. Read-only.",inputSchema:{type:"object",required:["chainId"],properties:{chainId:{type:"number"}}}},{name:"solana_balance",description:"Solana mainnet SOL balance for a base58 public key. Read-only; no signing or broadcast.",inputSchema:{type:"object",required:["address"],properties:{address:{type:"string"},commitment:{type:"string"}}}},{name:"solana_token_accounts",description:"Solana SPL token accounts for an owner, optionally filtered by mint. Read-only.",inputSchema:{type:"object",required:["owner"],properties:{owner:{type:"string"},mint:{type:"string"},commitment:{type:"string"}}}},{name:"solana_simulate",description:"Simulate a base64 Solana transaction through RPC. Read-only; never signs or broadcasts.",inputSchema:{type:"object",required:["transaction"],properties:{transaction:{type:"string"},sigVerify:{type:"boolean"},replaceRecentBlockhash:{type:"boolean"}}}},{name:"jupiter_venues",description:"Jupiter Solana venue map, optionally verified on-chain against executable BPF loader ownership. Read-only.",inputSchema:{type:"object",properties:{verify:{type:"boolean"},rpc:{type:"string"}}}},{name:"jupiter_quote",description:"Jupiter Solana Swap API quote with a hard <=100 bps slippage cap. Read-only.",inputSchema:{type:"object",required:["inputMint","outputMint","amount"],properties:{inputMint:{type:"string"},outputMint:{type:"string"},amount:{type:"string"},slippageBps:{type:"number"}}}},{name:"jupiter_prepare",description:"Prepare an unsigned Jupiter swap transaction for the user's Solana wallet to sign. No local signer, no broadcast.",inputSchema:{type:"object",required:["userPublicKey"],properties:{userPublicKey:{type:"string"},quoteResponse:{type:"object"},inputMint:{type:"string"},outputMint:{type:"string"},amount:{type:"string"},slippageBps:{type:"number"}}}},{name:"btc_health",description:"Bitcoin L1 Esplora health + tip height (mempool.space by default). No Core RPC, no keys. Read-only.",inputSchema:{type:"object",properties:{}}},{name:"btc_fees",description:"Recommended Bitcoin fee rates (sats/vB). Read-only.",inputSchema:{type:"object",properties:{}}},{name:"btc_balance",description:"Bitcoin address balance in sats via Esplora. Read-only.",inputSchema:{type:"object",required:["address"],properties:{address:{type:"string",description:"bc1\u2026/1\u2026/3\u2026 address"}}}},{name:"btc_utxos",description:"UTXOs for a Bitcoin address via Esplora. Read-only.",inputSchema:{type:"object",required:["address"],properties:{address:{type:"string"}}}},{name:"btc_tx",description:"Lookup a Bitcoin transaction by txid via Esplora. Read-only.",inputSchema:{type:"object",required:["txid"],properties:{txid:{type:"string"}}}},{name:"btc_meta_health",description:"Ordinals/runes indexer health. Reports whether BTC_META_API_URL / vendor API keys are configured. Read-only.",inputSchema:{type:"object",properties:{}}},{name:"btc_rune_balance",description:"Rune balances for a Bitcoin address (requires configured indexer + optional API key). Read-only.",inputSchema:{type:"object",required:["address"],properties:{address:{type:"string"}}}},{name:"btc_inscriptions",description:"Inscriptions controlled by an address. REQUIRES a keyed indexer (ordinals.com has no address index). Returns unknownNotEmpty:true when unconfigured \u2014 that means UNKNOWN, never 'wallet holds none'. Protect these UTXOs from fee spends.",inputSchema:{type:"object",required:["address"],properties:{address:{type:"string"},limit:{type:"number"}}}},{name:"btc_inscription_info",description:"Inscription metadata by inscription id (content type/length, height, sat, fee). KEYLESS via ordinals.com recursive. Read-only.",inputSchema:{type:"object",required:["inscriptionId"],properties:{inscriptionId:{type:"string",description:"<64-hex-txid>i<index>"}}}},{name:"btc_inscription_children",description:"Child inscriptions of a parent (collections). KEYLESS via ordinals.com recursive. Read-only.",inputSchema:{type:"object",required:["inscriptionId"],properties:{inscriptionId:{type:"string",description:"<64-hex-txid>i<index>"},page:{type:"number"}}}},{name:"btc_ord_block_info",description:"Ord node block info / indexer tip. KEYLESS. Use to confirm the ordinals indexer is at the same tip as Esplora before trusting metaprotocol reads.",inputSchema:{type:"object",properties:{height:{type:"number",description:"omit for current tip"}}}},{name:"satflow_health",description:"Satflow marketplace health (primary BTC ordinals/runes market after Magic Eden BTC sunset). Needs SATFLOW_API_KEY. Read-only.",inputSchema:{type:"object",properties:{}}},{name:"satflow_floors",description:"Satflow collection floor prices. type=ordinals|runes. Read-only.",inputSchema:{type:"object",properties:{type:{type:"string",description:"ordinals or runes"},ids:{type:"string",description:"optional comma-separated collection ids"}}}},{name:"satflow_wallet",description:"Satflow wallet contents (ordinals/runes) for an address. Read-only.",inputSchema:{type:"object",required:["address"],properties:{address:{type:"string"},type:{type:"string"},limit:{type:"number"}}}},{name:"satflow_item",description:"Satflow item detail for an inscription id (listing + bids + meta). Read-only.",inputSchema:{type:"object",oneOf:[{required:["inscriptionId"]},{required:["id"]}],properties:{inscriptionId:{type:"string"},id:{type:"string",description:"alias for inscriptionId"}}}},{name:"satflow_floor_listings",description:"Satflow floor listings for collection id(s). Read-only.",inputSchema:{type:"object",oneOf:[{required:["collectionIds"]},{required:["ids"]}],properties:{collectionIds:{type:"string"},ids:{type:"string",description:"alias for collectionIds"},limit:{type:"number"}}}},{name:"scanner_coverage",description:"Which chains the on-chain scanner supports and which capabilities each one has (blockNumber, nativeBalance, tokenBalance, resolveToken, resolvePools, scanBlocks, scoreRisk, quote, sellSimulation, prepareUnsignedTx). Read-only.",inputSchema:{type:"object",properties:{}}},{name:"scan_token",description:"Resolve a token on an EVM chain: metadata, its pools, and a risk score. Works on chains no indexer covers because it reads the chain directly. Read-only.",inputSchema:{type:"object",properties:{chainId:{type:"number",description:"EVM chain id, e.g. 4663 for Robinhood Chain"},token:{type:"string",description:"token contract address"}},required:["chainId","token"]}},{name:"wallet_balances",description:"Native balance for an address on an EVM chain, plus one token balance when a token address is supplied. Read-only; never signs.",inputSchema:{type:"object",properties:{chainId:{type:"number"},address:{type:"string",description:"wallet address to inspect"},token:{type:"string",description:"optional token contract for a token balance"}},required:["chainId","address"]}},{name:"rfq_quote",description:"Create a cross-chain RFQ intent and fan it out to reviewed solver or venue sources. Returns firm quote objects with intentHash, firmQuoteHash, expiry, min receive, and unsigned executable artifacts. Never signs or broadcasts.",inputSchema:{type:"object",required:["fromChainId","toChainId","sellToken","buyToken","sellAmount","receiver","deadlineMs"],properties:{fromChainId:{type:"number"},toChainId:{type:"number"},sellToken:{type:"string"},buyToken:{type:"string"},sellAmount:{type:"string"},receiver:{type:"string"},deadlineMs:{type:"number"},minBuyAmount:{type:"string"},allowedSources:{type:"array",items:{type:"string"}},sources:{type:"array",items:{type:"string"},description:"alias for allowedSources"},allowedRouters:{type:"array",items:{type:"string"}},slippageBps:{type:"number"},decimalsIn:{type:"number"},decimalsOut:{type:"number"}}}},{name:"best_swap_route",description:"Compare swap routes across every available aggregator and rank by NET output (after gas and fees), not headline quote. Returns the winner plus all runners-up so the ranking can be checked rather than trusted.",inputSchema:{type:"object",properties:{chainId:{type:"number",description:"EVM chain id, e.g. 8453 for Base"},tokenIn:{type:"string",description:"sell token address"},tokenOut:{type:"string",description:"buy token address"},amountIn:{type:"string",description:"raw units of tokenIn (wei-scale)"},taker:{type:"string",description:"address used for quoting only; nothing is signed"},decimalsIn:{type:"number"},decimalsOut:{type:"number"}},required:["chainId","tokenIn","tokenOut","amountIn"]}},{name:"best_bridge_route",description:"Compare cross-chain bridge routes and rank by NET output. Also reports each route's expected duration, which is NOT folded into the score -- a route that saves $2 but takes 30 minutes is a trade-off for the caller to make.",inputSchema:{type:"object",properties:{fromChainId:{type:"number"},toChainId:{type:"number"},tokenIn:{type:"string",description:"token on the origin chain"},tokenOut:{type:"string",description:"token on the destination chain"},amountIn:{type:"string",description:"raw units of tokenIn"},taker:{type:"string",description:"address used for quoting only"},decimalsOut:{type:"number"}},required:["fromChainId","toChainId","tokenIn","tokenOut","amountIn"]}},{name:"prepare_best_route",description:"Compare routes, then build the SIGNABLE artifact for the winner. Returns an unsigned transaction (LI.FI/ParaSwap/0x) or EIP-712 typed data for an off-chain order (CoW) -- the artifactKind field says which, and they require different wallet actions. Re-quotes before preparing and reports drift against the comparison. Never signs or broadcasts.",inputSchema:{type:"object",properties:{chainId:{type:"number"},tokenIn:{type:"string"},tokenOut:{type:"string"},amountIn:{type:"string",description:"raw units of tokenIn"},taker:{type:"string",description:"the REAL wallet that will sign. Placeholder/burn addresses are rejected: quoting is anonymous, preparing is not."},decimalsIn:{type:"number"},decimalsOut:{type:"number"},source:{type:"string",description:"force a specific source instead of the winner (flagged in the result)"},driftToleranceBps:{type:"number",description:"default 100"}},required:["chainId","tokenIn","tokenOut","amountIn","taker"]}},{name:"prepare_best_bridge_route",description:"Compare cross-chain bridge routes, then build the signable transaction sequence for the winner. Returns a LIST of unsigned transactions -- some routes need an approval and a deposit signed in order, and signing only the first leaves funds approved but not bridged. Reports the destination chain and expected credit time. Bridging is not atomic. Never signs or broadcasts.",inputSchema:{type:"object",properties:{fromChainId:{type:"number"},toChainId:{type:"number"},tokenIn:{type:"string",description:"token on the origin chain"},tokenOut:{type:"string",description:"token on the destination chain"},amountIn:{type:"string",description:"raw units of tokenIn"},taker:{type:"string",description:"the REAL wallet that will sign; placeholders rejected"},source:{type:"string",description:"force a source instead of the winner"},driftToleranceBps:{type:"number",description:"default 100"}},required:["fromChainId","toChainId","tokenIn","tokenOut","amountIn","taker"]}},{name:"equity_venues",description:"Inventory of on-chain equities venues (HIP-3 builder DEXes, Arcus perps/spot on Robinhood 4663, RH Uniswap prepare tier, Solana xStocks, TON ston.fi) with tiers and a liveness snapshot. Offline fixtures by default. Read-only / prepare-only.",inputSchema:{type:"object",properties:{}}},{name:"equity_quote",description:"Cross-chain best-execution comparison for a tokenized equity ticker (NVDA, SPY, TSLA, ...). Ranks HIP-3, Arcus, RH Uniswap, Solana xStocks, and TON. Returns winner + runners-up + bestPreparable (only rh_uniswap is preparable in v1). rankedOn is usually gross because fees/gas are unmeasured - say so. Never signs.",inputSchema:{type:"object",required:["ticker"],properties:{ticker:{type:"string",description:"equity ticker, e.g. NVDA, SPY, TSLA"},sizeUsd:{type:"string",description:"optional notional USD size for impact model"},horizonHours:{type:"number",description:"optional holding horizon; enables funding-adjusted spot-vs-perp ranking"}}}},{name:"equity_prepare",description:"Prepare an UNSIGNED Robinhood-chain Uniswap artifact for a tokenized equity. Only the prepare-tier venue (rh_uniswap / chain 4663). Requires the real wallet as recipient. requiresWalletSignature=true, backendSigner=false. Never signs or broadcasts.",inputSchema:{type:"object",required:["ticker"],oneOf:[{required:["recipient"]},{required:["taker"]}],properties:{ticker:{type:"string"},recipient:{type:"string",description:"the REAL 0x wallet that will sign; placeholders rejected"},taker:{type:"string",description:"alias for recipient"},sizeUsd:{type:"string",description:"optional notional USD size"}}}},{name:"strategy_draft",description:"Draft a deterministic Hyperliquid strategy DSL from supported plain-English EMA, RSI, or funding rules. Fails closed on unsupported ambiguity. Never signs or broadcasts.",inputSchema:{type:"object",required:["prompt"],properties:{prompt:{type:"string"},nowMs:{type:"number"}}}},{name:"strategy_validate",description:"Strictly compile and hash a Hyperliquid strategy DSL. No network or execution.",inputSchema:{type:"object",required:["strategy"],properties:{strategy:{type:"object"},nowMs:{type:"number"}}}},{name:"strategy_backtest",description:"Backtest a deterministic strategy with fees, builder fees, slippage, funding, latency, stops, take profit, and liquidation. Uses supplied bars or keyless Hyperliquid history.",inputSchema:{type:"object",required:["strategy"],properties:{strategy:{type:"object"},bars:{type:"array",items:{type:"object"}},count:{type:"number"},backtestOptions:{type:"object"}}}},{name:"strategy_optimize",description:"Run bounded deterministic parameter search on training bars, then separately evaluate out-of-sample evidence. Never uses holdout data during optimization.",inputSchema:{type:"object",required:["strategy"],properties:{strategy:{type:"object"},bars:{type:"array",items:{type:"object"}},count:{type:"number"},maxTrials:{type:"number"}}}},{name:"strategy_evidence",description:"Produce separate train, holdout, and walk-forward evidence with overfitting flags and a fail, paper-only, or live-eligible status. Live eligibility never arms execution.",inputSchema:{type:"object",required:["strategy"],properties:{strategy:{type:"object"},bars:{type:"array",items:{type:"object"}},count:{type:"number"}}}},{name:"strategy_shadow_start",description:"Start a durable local shadow runner that records intended orders and theoretical fills only. Never signs or broadcasts.",inputSchema:{type:"object",required:["strategy"],properties:{strategy:{type:"object"},evidenceId:{type:"string"}}}},{name:"strategy_shadow_list",description:"List durable local shadow runners. Read-only and secret-free.",inputSchema:{type:"object",properties:{}}},{name:"strategy_shadow_status",description:"Inspect one durable local shadow runner. Read-only and secret-free.",inputSchema:{type:"object",required:["id"],properties:{id:{type:"string"}}}},{name:"strategy_shadow_step",description:"Advance one durable shadow runner over supplied or keyless historical bars. Never signs or broadcasts.",inputSchema:{type:"object",required:["id"],properties:{id:{type:"string"},bars:{type:"array",items:{type:"object"}},count:{type:"number"}}}},{name:"strategy_shadow_stop",description:"Stop one durable local shadow runner. Does not submit or cancel exchange orders.",inputSchema:{type:"object",required:["id"],properties:{id:{type:"string"}}}},{name:"strategy_prepare_live",description:"Create an integrity-bound prepare-only handoff after live-eligible evidence, HMAC-authenticated when local attestation is configured. All execution flags stay false. A separate local operator must revalidate, arm, sign, and broadcast.",inputSchema:{type:"object",required:["strategy","evidence","shadowId"],properties:{strategy:{type:"object"},evidence:{type:"object"},shadowId:{type:"string"},caps:{type:"object"},nowMs:{type:"number"}}}},{name:"twap_simulate",description:"Simulate a TWAP (time-weighted average price) DCA order. Splits a large order into equal-sized chunks over a configurable window, quotes every chunk at current prices, and returns the schedule + estimated average price. Read-only. Never signs or broadcasts. Use before committing to a TWAP.",inputSchema:{type:"object",required:["chainId","tokenIn","tokenOut","taker"],oneOf:[{required:["amount"]},{required:["amountIn"]}],properties:{chainId:{type:"number"},tokenIn:{type:"string"},tokenOut:{type:"string"},amount:{type:"string",description:"raw base units of tokenIn"},amountIn:{type:"string",description:"read-only alias for amount"},taker:{type:"string",description:"the REAL wallet that will sign"},splits:{type:"number",description:"number of chunks (default 10, max 100)"},windowHours:{type:"number",description:"total window in hours (default 6)"},slippageBps:{type:"number",description:"slippage cap in bps (default 100)"}}}},{name:"bridge_aggregator_scan",description:"Scan ALL cross-chain bridge routes: deBridge DLN + LI.FI/Relay + ChangeNOW. Ranks every route by net output, checks for existing token approvals that should be revoked before bridging, and returns the winner + runners-up. Read-only. Never signs or broadcasts. ChangeNOW requires ticker symbols.",inputSchema:{type:"object",required:["fromChainId","toChainId","tokenIn","tokenOut","amount","taker"],properties:{fromChainId:{type:"number"},toChainId:{type:"number"},tokenIn:{type:"string"},tokenOut:{type:"string"},amount:{type:"string",description:"raw base units of tokenIn"},taker:{type:"string"},fromSymbol:{type:"string",description:"ticker for ChangeNOW (e.g. ETH, USDC)"},toSymbol:{type:"string",description:"ticker for ChangeNOW"},fromDecimals:{type:"number",description:"default 18"},toDecimals:{type:"number",description:"default 18"}}}},{name:"perps_markets",description:"Scan perps markets across dYdX (standalone chain), Drift (Solana), and Vertex (Arbitrum). Returns ticker, oracle price, funding rate, open interest, and 24h volume. Read-only. Never signs.",inputSchema:{type:"object",properties:{venue:{type:"string",description:"dydx, drift, or vertex (default: all)"}}}},{name:"dex_quote",description:"Quote a swap across PancakeSwap (BSC+), SushiSwap (30+ chains), or Raydium (Solana via Jupiter). Specify the DEX and chain. Read-only.",inputSchema:{type:"object",required:["dex","chainId","tokenIn","tokenOut","amountIn"],properties:{dex:{type:"string",description:"pancakeswap, sushiswap, or raydium"},chainId:{type:"number"},tokenIn:{type:"string"},tokenOut:{type:"string"},amountIn:{type:"string",description:"raw base units"}}}},{name:"options_markets",description:"Scan on-chain options markets (calls/puts). Currently Aevo. Returns instruments, mark prices, funding, open interest. Read-only.",inputSchema:{type:"object",properties:{}}},{name:"cex_market_data",description:"Read PUBLIC centralized-exchange market data from Binance, OKX or Bybit: spot/perp ticker, orderbook depth, perp funding rate, mark price, and open interest. Keyless public endpoints only \u2014 no account, no trading, never signs.",inputSchema:{type:"object",required:["coin"],properties:{venue:{type:"string",description:"binance, okx, bybit, or all (default: all)"},op:{type:"string",description:"ticker, orderbook, funding, markPrice, or openInterest (default: ticker)"},coin:{type:"string",description:"Base asset, e.g. BTC. Full exchange symbols also accepted."},quote:{type:"string",description:"Quote asset (default: USDT)"},market:{type:"string",description:"spot or perp (default: spot; funding/openInterest force perp)"},limit:{type:"number",description:"Orderbook depth levels"}}}},{name:"cex_basis_scan",description:"Cross-venue perp basis and funding-spread scan across Binance, OKX, Bybit and Hyperliquid public data. Returns per-venue perp mark vs spot basis in bps plus pairwise ANNUALIZED funding deltas (Hyperliquid settles hourly, CEXes 8h, so raw rates are not comparable). Analysis over public reads \u2014 no sizing, no order, never signs.",inputSchema:{type:"object",required:["coin"],properties:{coin:{type:"string",description:"Base asset, e.g. BTC or ETH"},quote:{type:"string",description:"Quote asset for the CEX legs (default: USDT)"},venues:{type:"string",description:"Comma-separated subset of binance,okx,bybit,hyperliquid (default: all)"},fundingOnly:{type:"boolean",description:"Return only the funding-spread view"}}}},{name:"snapshot_governance",description:"Read-only Snapshot.org hub: spaces, proposals, proposal detail, an address's votes and voting power. Never signs a vote.",inputSchema:{type:"object",properties:{op:{type:"string",description:"spaces, proposals, activeProposals, proposal, votes, votingPower, or health (default: spaces)"},space:{type:"string"},spaces:{type:"array",items:{type:"string"}},id:{type:"string",description:"proposal id"},voter:{type:"string"},state:{type:"string"},first:{type:"number"}}}},{name:"tally_governance",description:"Read-only Governor Bravo / OZ Governor proposal state and vote tallies for major DAOs. Never casts, queues, or executes a vote.",inputSchema:{type:"object",properties:{op:{type:"string",description:"governors, info, proposals, proposal, voterStatus, or health (default: governors)"},dao:{type:"string",description:"compound, uniswap, ens, aave, gitcoin, arbitrum, optimism"},proposalId:{type:"string"},account:{type:"string"}}}},{name:"stablecoin_peg_scan",description:"Rank major and Hyperliquid-native stables by absolute bps from $1. Unpriced is unknown, never on-peg. Read-only.",inputSchema:{type:"object",properties:{symbols:{type:"array",items:{type:"string"}},usePyth:{type:"boolean"},useDex:{type:"boolean"}}}},{name:"lending_markets",description:"Scan lending protocol markets across Compound ($2B+ TVL). Returns supply/borrow APYs, total supply, collateral factors. Read-only.",inputSchema:{type:"object",properties:{}}},{name:"yield_vaults",description:"Scan yield aggregator vaults across Yearn + Convex. Returns vault APYs, TVLs, boosted status. Read-only.",inputSchema:{type:"object",properties:{}}},{name:"watch_list",description:"List alert-only price/token watches. Never execute.",inputSchema:{type:"object",properties:{}}},{name:"watch_create",description:"Create an alert-only watch. actionMode is always alert_only. Never execute.",inputSchema:{type:"object",required:["chain","token","condition"],properties:{chain:{type:"string"},token:{type:"string"},condition:{type:"string"},note:{type:"string"}}}},{name:"receipt_report",description:"Classify a caller-supplied receipt. Reports whether a tx hash exists. Does not verify chain success.",inputSchema:{type:"object",properties:{hash:{type:"string"},transactionHash:{type:"string"},txid:{type:"string"},receipt:{type:"object"}}}},{name:"twitter_ca_watch",description:"One Twitter CA watch tick: read an account, extract EVM/Solana CAs, rank the USD book, PREPARE only. Automated ticks never emit a card and never broadcast. Needs ORACLE_XURL_ENABLED=true.",inputSchema:{type:"object",required:["handle"],properties:{handle:{type:"string"},chainId:{type:"number",description:"default 4663 Robinhood"},limit:{type:"number"}}}},{name:"trade_lifecycle",description:"Create, verify, or advance a prepare-only trade fact chain. Signing and broadcasting are never performed here.",inputSchema:{type:"object",required:["action"],properties:{action:{type:"string",enum:["create","verify","advance"]},tradeId:{type:"string"},intent:{type:"object"},lifecycle:{type:"object"},state:{type:"string"},fact:{type:"object"},asOf:{type:"number"}}}},{name:"signal_score",description:"Cold-score onchain signal events. Never fetches or executes.",inputSchema:{type:"object",required:["events"],properties:{events:{type:"array",items:{type:"object"}},markouts:{type:"array",items:{type:"object"}},openIntents:{type:"boolean"},limit:{type:"number"}}}},{name:"workspace_artifact",description:"Get, list, put, or link deterministic workspace artifacts. No arbitrary paths.",inputSchema:{type:"object",required:["action"],properties:{action:{type:"string",enum:["get","list","put","link"]},id:{type:"string"},type:{type:"string"},createdAt:{type:"string"},data:{type:"object"},parentId:{type:"string"},childId:{type:"string"}}}},{name:"research_artifact",description:"Create a citation-bearing research artifact. fetchedAt must be supplied by the caller.",inputSchema:{type:"object",required:["sourceUrl","fetchedAt","snapshot","claim","confidence"],properties:{sourceUrl:{type:"string"},fetchedAt:{type:"string"},snapshot:{type:"string"},claim:{type:"string"},confidence:{type:"number"},contradictions:{type:"array",items:{type:"string"}}}}},{name:"portfolio_analyze",description:"Summarize a caller-supplied portfolio ledger. Read-only.",inputSchema:{type:"object",required:["ledger","asOf"],properties:{ledger:{type:"object"},asOf:{type:"number"},priceTtlMs:{type:"number"}}}},{name:"tax_lots",description:"Build exact-integer cost-basis records from caller-supplied events. Accounting records only, not tax advice.",inputSchema:{type:"object",required:["input"],properties:{input:{type:"object",additionalProperties:!0},method:{type:"string",enum:["fifo","lifo","hifo","specific"]},asOf:{type:"string",minLength:1}},additionalProperties:!1}},{name:"position_health",description:"Evaluate caller-supplied lending or farming snapshots. Alert-only, with no network access or execution signal.",inputSchema:{type:"object",required:["action","input","asOf"],properties:{action:{type:"string",enum:["evaluate","book"]},input:{type:"object",additionalProperties:!0},asOf:{type:"string",minLength:1},thresholds:{type:"object",additionalProperties:!0}},additionalProperties:!1}},{name:"governance_prepare",description:"Create a deterministic semantic preview of a caller-supplied governance intent. No adapter, calldata, vote, signature, or broadcast.",inputSchema:{type:"object",required:["input","asOf"],properties:{input:{type:"object",additionalProperties:!0},asOf:{type:"string",minLength:1}},additionalProperties:!1}},{name:"safety_intelligence",description:"Evaluate caller-supplied address or transaction safety evidence. No source is contacted and unknown evidence fails closed.",inputSchema:{type:"object",required:["action","input","asOf"],properties:{action:{type:"string",enum:["address","transaction"]},input:{type:"object",additionalProperties:!0},asOf:{type:"string",minLength:1},minClearConfidence:{type:"number",minimum:0,maximum:1},minBlockConfidence:{type:"number",minimum:0,maximum:1}},additionalProperties:!1}},{name:"portfolio_risk",description:"Summarize concentration and coverage from caller-supplied portfolio snapshots. No network or account access.",inputSchema:{type:"object",required:["input"],properties:{input:{type:"object",additionalProperties:!0}},additionalProperties:!1}},{name:"mev_status",description:"MEV observer/operator flag posture. Read-only. Never implies a live trade. Flash-loan execute still needs ORACLE_MEV_EXECUTE_ENABLED=1 and literal --execute on oracle mev.",inputSchema:{type:"object",properties:{}}},{name:"chain_list",description:"List Oracle's EVM chain registry (chainId, name, rpc env names). Read-only.",inputSchema:{type:"object",properties:{}}},{name:"tron_account",description:"Tron account: TRX balance (sun + display) and resource state via public TronGrid. Read-only; no keys, no broadcast.",inputSchema:{type:"object",required:["address"],properties:{address:{type:"string",description:"Base58 Tron address (T\u2026)"}}}},{name:"tron_trc20_balances",description:"TRC20 token balances for a Tron address. USDT-TRC20 is decorated with symbol/decimals. Read-only.",inputSchema:{type:"object",required:["address"],properties:{address:{type:"string"},contract:{type:"string",description:"Optional TRC20 contract to filter to."}}}},{name:"tron_trc20_transfers",description:"TRC20 transfer history for a Tron address. Defaults to the USDT contract (the dominant stablecoin rail); pass contract:'all' to drop the filter. Read-only.",inputSchema:{type:"object",required:["address"],properties:{address:{type:"string"},contract:{type:"string",description:"TRC20 contract, or 'all'. Defaults to USDT-TRC20."},limit:{type:"number"}}}},{name:"tron_chain_parameters",description:"Tron network chain parameters (energy fee, bandwidth price, account create fee). Read-only.",inputSchema:{type:"object",properties:{key:{type:"string"}}}},{name:"ton_account",description:"TON account state and nanoton/TON balance via public toncenter. Accepts raw (0:hex) or base64url addresses. Read-only.",inputSchema:{type:"object",required:["address"],properties:{address:{type:"string"}}}},{name:"ton_jetton_balances",description:"Jetton (TON fungible token) balances for an owner, with symbol/decimals where published. Read-only.",inputSchema:{type:"object",required:["owner"],properties:{owner:{type:"string"},jettonMaster:{type:"string"},limit:{type:"number"}}}},{name:"ton_transactions",description:"Recent TON transactions for an address (newest first). Read-only.",inputSchema:{type:"object",required:["address"],properties:{address:{type:"string"},limit:{type:"number"}}}},{name:"cosmos_chains",description:"List the Cosmos SDK chains Oracle can reach keylessly (cosmoshub, osmosis, celestia, injective, neutron, dydx, noble, kava) plus their LCD env overrides. Read-only.",inputSchema:{type:"object",properties:{}}},{name:"cosmos_balances",description:"Bank balances for a bech32 Cosmos address on any Cosmos SDK chain. IBC denoms are flagged with their hash for denom-trace resolution. Read-only.",inputSchema:{type:"object",required:["address"],properties:{address:{type:"string"},chain:{type:"string",description:"Chain key (default cosmoshub)."},lcdUrl:{type:"string",description:"Explicit LCD/REST base URL override."},limit:{type:"number"}}}},{name:"cosmos_delegations",description:"Staking delegations, unbonding entries, and pending rewards for a Cosmos delegator. Read-only.",inputSchema:{type:"object",required:["address"],properties:{address:{type:"string"},chain:{type:"string"},lcdUrl:{type:"string"},includeRewards:{type:"boolean"}}}},{name:"cosmos_denom_trace",description:"Resolve an ibc/<64-hex> denom back to its (path, base_denom) origin, or list a chain's trace table. Read-only.",inputSchema:{type:"object",properties:{hash:{type:"string",description:"ibc/<hash> denom or bare 64-hex hash. Omit to list traces."},chain:{type:"string"},lcdUrl:{type:"string"},limit:{type:"number"}}}},{name:"aptos_account",description:"Aptos account sequence number and authentication key via the public fullnode. Read-only.",inputSchema:{type:"object",required:["address"],properties:{address:{type:"string"}}}},{name:"aptos_resources",description:"Move resources held by an Aptos account, or one resource via resourceType. Read-only.",inputSchema:{type:"object",required:["address"],properties:{address:{type:"string"},resourceType:{type:"string"},limit:{type:"number"}}}},{name:"aptos_coin_balances",description:"Aptos coin balances: every 0x1::coin::CoinStore held, or one coinType through the 0x1::coin::balance view function. Read-only.",inputSchema:{type:"object",required:["address"],properties:{address:{type:"string"},coinType:{type:"string"}}}}],kv=String(qf.env.ORACLE_DEFAULT_ADDRESS||qf.env.MAD_OPERATOR_ADDRESS||"").trim(),NM=Object.freeze(["data_call","address_book_remember","address_book_list","address_book_lookup","address_book_forget","vault_status","signer_status","signer_pending","signer_queue","signer_ack","signer_deny","skill_list","skill_load"]),CM=new Set(Ov.map(e=>e.name));for(let e of NM)if(CM.has(e))throw new Error(`public MCP custody boundary violated: ${e}`);var RM={evm_token_sniper_scan:e=>({provider:"evm-token-sniper",op:"scan",args:e}),hlp_vault_tracker:e=>({provider:"hl-vaults",op:"tracker",args:e}),hl_precompile_read:e=>({provider:"hl-precompiles",op:"read",args:e}),protocol_eval:()=>({provider:"protocol-templates",op:"eval",args:{}}),hl_delta_neutral:e=>({provider:"hl-delta-neutral",op:e.op==="quote"?"quote":e.op==="loop"?"loop":"scan",args:e}),lighter_delta_neutral:e=>({provider:"lighter-delta-neutral",op:e.op==="quote"?"quote":e.op==="loop"?"loop":"scan",args:e}),llama_protocols:()=>({provider:"defillama",op:"protocols",args:{}}),llama_prices:e=>({provider:"defillama",op:"prices",args:{coins:e.coins}}),dex_search:e=>({provider:"dexscreener",op:"search",args:{q:e.q}}),dex_token:e=>({provider:"dexscreener",op:"token",args:{address:e.address}}),lifi_quote:e=>({provider:"lifi",op:"quote",args:{fromChain:e.fromChain,toChain:e.toChain,fromToken:e.fromToken,toToken:e.toToken,fromAmount:e.fromAmount,fromAddress:e.fromAddress||kv||void 0}}),portfolio_balance:e=>({provider:"portfolio",op:"balances",args:{addresses:e.addresses,evmChainIds:e.evmChainIds,includeTokens:e.includeTokens,includeCollectibles:e.includeCollectibles,includePrices:e.includePrices}}),portfolio_snapshot:e=>({provider:"portfolio",op:"snapshot",args:e}),portfolio_history:e=>({provider:"portfolio",op:"history",args:e}),portfolio_value_graph:e=>({provider:"portfolio",op:"valueGraph",args:e}),nft_inventory:e=>({provider:"nft-portfolio",op:"inventory",args:e}),nft_gallery:e=>({provider:"nft-portfolio",op:"gallery",args:e}),nft_pnl:e=>({provider:"nft-portfolio",op:"pnl",args:e}),nft_prepare_list:e=>({provider:"nft-portfolio",op:"prepareList",args:e}),nft_trait_snipe:e=>({provider:"nft-portfolio",op:"traitSnipe",args:e}),anvil_nft_scan:e=>({provider:"anvil-nft",op:"scanCollection",args:e}),anvil_opensea_arb:e=>({provider:"anvil-nft",op:"scanCrossVenueArb",args:e}),anvil_marketplace_scan:e=>({provider:"anvil-nft",op:"scanAllMarkets",args:e}),anvil_marketplace_opensea_arb:e=>({provider:"anvil-nft",op:"scanAllMarketsArb",args:e}),anvil_prepare_buy:e=>({provider:"anvil-nft",op:"prepareSpecificBuy",args:e}),anvil_prepare_sell:e=>({provider:"anvil-nft",op:"prepareSell",args:e}),stonkbrokers_scan_loot:e=>({provider:"stonkbrokers",op:"scanBrokerLoot",args:e}),stonkbrokers_broker_desk:e=>({provider:"stonkbrokers",op:e.mode?"prepareClockIn":"brokerDesk",args:e}),contract_risk_scan:e=>({provider:"contract-risk",op:"scan",args:e}),nft_mint_prepare:e=>({provider:"nft-mint",op:"prepare",args:e}),nft_mint_gas_price:e=>({provider:"nft-mint",op:"priceGas",args:e}),nft_mint_trigger:e=>({provider:"nft-mint",op:"createTrigger",args:e}),nft_mancer_os_scan:e=>({provider:"nft-mint",op:"evaluateMancerOs",args:e}),evm_simulate_transaction:e=>({provider:"evm-simulate",op:"simulate",args:e}),rpc_balance:e=>{let t=e.address||kv;if(!t)throw new Error("address required (set ORACLE_DEFAULT_ADDRESS to supply a default)");return{provider:"evm-rpc",op:"getBalance",args:{chainId:e.chainId,address:t}}},rpc_block:e=>({provider:"evm-rpc",op:"blockNumber",args:{chainId:e.chainId}}),solana_balance:e=>({provider:"solana-rpc",op:"getBalance",args:{address:e.address,commitment:e.commitment}}),solana_token_accounts:e=>({provider:"solana-rpc",op:"tokenAccounts",args:{owner:e.owner,mint:e.mint,commitment:e.commitment}}),solana_simulate:e=>({provider:"solana-rpc",op:"simulate",args:{transaction:e.transaction,sigVerify:e.sigVerify,replaceRecentBlockhash:e.replaceRecentBlockhash}}),jupiter_venues:e=>({provider:"jupiter",op:"venues",args:{verify:e.verify,rpc:e.rpc}}),jupiter_quote:e=>({provider:"jupiter",op:"quote",args:{inputMint:e.inputMint,outputMint:e.outputMint,amount:e.amount,slippageBps:e.slippageBps}}),jupiter_prepare:e=>({provider:"jupiter",op:"prepare",args:{userPublicKey:e.userPublicKey,quoteResponse:e.quoteResponse,inputMint:e.inputMint,outputMint:e.outputMint,amount:e.amount,slippageBps:e.slippageBps}}),btc_health:()=>({provider:"bitcoin-esplora",op:"health",args:{}}),tron_account:e=>({provider:"tron-public",op:"account",args:{address:e.address}}),tron_trc20_balances:e=>({provider:"tron-public",op:"trc20Balances",args:{address:e.address,contract:e.contract}}),tron_trc20_transfers:e=>({provider:"tron-public",op:"trc20Transfers",args:{address:e.address,contract:e.contract,limit:e.limit}}),tron_chain_parameters:e=>({provider:"tron-public",op:"chainParameters",args:{key:e.key}}),ton_account:e=>({provider:"ton-public",op:"accountState",args:{address:e.address}}),ton_jetton_balances:e=>({provider:"ton-public",op:"jettonBalances",args:{owner:e.owner,jettonMaster:e.jettonMaster,limit:e.limit}}),ton_transactions:e=>({provider:"ton-public",op:"transactions",args:{address:e.address,limit:e.limit}}),cosmos_chains:()=>({provider:"cosmos-lcd",op:"chains",args:{}}),cosmos_balances:e=>({provider:"cosmos-lcd",op:"balances",args:{address:e.address,chain:e.chain,lcdUrl:e.lcdUrl,limit:e.limit}}),cosmos_delegations:e=>({provider:"cosmos-lcd",op:"delegations",args:{address:e.address,chain:e.chain,lcdUrl:e.lcdUrl,includeRewards:e.includeRewards}}),cosmos_denom_trace:e=>({provider:"cosmos-lcd",op:"denomTrace",args:{hash:e.hash,chain:e.chain,lcdUrl:e.lcdUrl,limit:e.limit}}),aptos_account:e=>({provider:"aptos-public",op:"account",args:{address:e.address}}),aptos_resources:e=>({provider:"aptos-public",op:"resources",args:{address:e.address,resourceType:e.resourceType,limit:e.limit}}),aptos_coin_balances:e=>({provider:"aptos-public",op:"coinBalances",args:{address:e.address,coinType:e.coinType}}),btc_fees:()=>({provider:"bitcoin-esplora",op:"fees",args:{}}),btc_balance:e=>({provider:"bitcoin-esplora",op:"address",args:{address:e.address}}),btc_utxos:e=>({provider:"bitcoin-esplora",op:"utxos",args:{address:e.address}}),btc_tx:e=>({provider:"bitcoin-esplora",op:"tx",args:{txid:e.txid}}),btc_meta_health:()=>({provider:"bitcoin-meta",op:"health",args:{}}),btc_rune_balance:e=>({provider:"bitcoin-meta",op:"runeBalances",args:{address:e.address}}),btc_inscriptions:e=>({provider:"bitcoin-meta",op:"inscriptions",args:{address:e.address,limit:e.limit}}),btc_inscription_info:e=>({provider:"bitcoin-meta",op:"inscriptionInfo",args:{inscriptionId:e.inscriptionId}}),btc_inscription_children:e=>({provider:"bitcoin-meta",op:"inscriptionChildren",args:{inscriptionId:e.inscriptionId,page:e.page}}),btc_ord_block_info:e=>({provider:"bitcoin-meta",op:"ordBlockInfo",args:{height:e.height}}),satflow_health:()=>({provider:"satflow",op:"health",args:{}}),satflow_floors:e=>({provider:"satflow",op:"collectionFloors",args:{type:e.type,ids:e.ids}}),satflow_wallet:e=>({provider:"satflow",op:"walletContents",args:{address:e.address,type:e.type,limit:e.limit}}),satflow_item:e=>({provider:"satflow",op:"item",args:{inscriptionId:e.inscriptionId||e.id}}),satflow_floor_listings:e=>({provider:"satflow",op:"floorListings",args:{collectionIds:e.collectionIds||e.ids,limit:e.limit}})};async function Ff(e,{method:t="GET",body:n,signal:r}={}){let o=await fetch(e,{method:t,headers:{"content-type":"application/json"},body:n?JSON.stringify(n):void 0,signal:r}),i=await TM(o);if(!o.ok)throw new Error(i.error||`HTTP ${o.status}`);return i}async function pt(e,t,n={},r={}){try{return await Ff(`${Mf}/data/call`,{method:"POST",body:{provider:e,op:t,args:n},signal:r.signal})}catch(o){let i=typeof o?.message=="string"?o.message:"";if(i&&!/^HTTP \d+$/.test(i))return{error:i,provider:e,op:t};throw o}}async function _v(e,t={},n={}){if(e.startsWith("launch_radar_"))return Rd(e,t);let r={strategy_draft:{operation:"draft"},strategy_validate:{operation:"validate"},strategy_backtest:{operation:"backtest"},strategy_optimize:{operation:"optimize"},strategy_evidence:{operation:"evidence"},strategy_shadow_start:{operation:"shadow",action:"start"},strategy_shadow_list:{operation:"shadow",action:"list"},strategy_shadow_status:{operation:"shadow",action:"get"},strategy_shadow_step:{operation:"shadow",action:"step"},strategy_shadow_stop:{operation:"shadow",action:"stop"},strategy_prepare_live:{operation:"prepare"}}[e];if(r){let{runStrategyOperation:i}=await Promise.resolve().then(()=>(W0(),V0));return i(r.operation,{...t,...r.action?{action:r.action}:{},nowMs:t.nowMs??Date.now()},{signal:n.signal})}if(e==="rfq_quote"){let{normalizeRfqIntent:i}=await Promise.resolve().then(()=>(mp(),iw)),{requestRfqQuotes:s}=await Promise.resolve().then(()=>(dw(),uw)),a=i({...t,sources:t.sources??t.allowedSources});return s(a,{decimalsIn:t.decimalsIn,decimalsOut:t.decimalsOut,signal:n.signal})}if(e==="best_swap_route"||e==="best_bridge_route"){let{bestSwapRoute:i,bestBridgeRoute:s}=await Promise.resolve().then(()=>(Po(),Jh));return e==="best_swap_route"?i(t,n):s(t,n)}if(e==="prepare_best_route"){let{prepareBestRoute:i}=await Promise.resolve().then(()=>(pu(),Qh));return i(t,n)}if(e==="prepare_best_bridge_route"){let{prepareBestBridgeRoute:i}=await Promise.resolve().then(()=>(fw(),pw));return i(t,n)}if(e==="twap_simulate"){let{simulateTwap:i}=await Promise.resolve().then(()=>(gw(),yw));return i({...t,amount:t.amount??t.amountIn},{signal:n.signal,...n.quoteFn?{quoteFn:n.quoteFn}:{}})}if(e==="bridge_aggregator_scan"){let{scanBridgeRoutes:i}=await Promise.resolve().then(()=>(Qw(),Xw));return i(t,n)}if(e==="perps_markets"){let i=String(t.venue||"all").toLowerCase(),s={};if(i==="all"||i==="dydx"){let{dydxMarkets:a}=await Promise.resolve().then(()=>(eE(),Zw));s.dydx=await a(void 0,n)}if(i==="all"||i==="drift"){let{driftMarkets:a}=await Promise.resolve().then(()=>(iE(),oE));s.drift=await a(n)}if(i==="all"||i==="vertex"){let{vertexMarkets:a}=await Promise.resolve().then(()=>(lE(),cE));s.vertex=await a(n)}return s}if(e==="dex_quote"){let i=String(t.dex||"").toLowerCase();if(i==="pancakeswap"){let{pancakeQuote:s}=await Promise.resolve().then(()=>(dE(),uE));return s(t,n)}if(i==="sushiswap"){let{sushiQuote:s}=await Promise.resolve().then(()=>(mE(),fE));return s(t,n)}if(i==="raydium"){let{raydiumQuote:s}=await Promise.resolve().then(()=>(yE(),hE));return s(t,n)}return{error:`unknown dex: ${i} \u2014 use pancakeswap, sushiswap, or raydium`}}if(e==="options_markets"){let{aevoMarkets:i}=await Promise.resolve().then(()=>(bE(),gE));return{aevo:await i(n)}}if(e==="cex_market_data"){let i=String(t.venue||"all").toLowerCase(),s=String(t.op||"ticker"),a=new Set(["ticker","orderbook","funding","markPrice","openInterest"]);if(!a.has(s))return{error:`unknown op: ${s} \u2014 use ${[...a].join(", ")}`};if(!t.coin&&!t.symbol)return{error:"cex_market_data requires coin"};let c={coin:t.coin??t.symbol,quote:t.quote,market:t.market,limit:t.limit},[l,u,d]=await Promise.all([Promise.resolve().then(()=>(bs(),xp)),Promise.resolve().then(()=>(Np(),Tp)),Promise.resolve().then(()=>(Lp(),Pp))]),p={binance:{ticker:l.binanceTicker,orderbook:l.binanceOrderbook,funding:l.binanceFunding,markPrice:l.binanceMarkPrice,openInterest:l.binanceOpenInterest},okx:{ticker:u.okxTicker,orderbook:u.okxOrderbook,funding:u.okxFunding,markPrice:u.okxMarkPrice,openInterest:u.okxOpenInterest},bybit:{ticker:d.bybitTicker,orderbook:d.bybitOrderbook,funding:d.bybitFunding,markPrice:d.bybitMarkPrice,openInterest:d.bybitOpenInterest}};if(i!=="all"&&!p[i])return{error:`unknown venue: ${i} \u2014 use binance, okx, bybit, or all`};let f=i==="all"?Object.keys(p):[i],m=await Promise.all(f.map(async h=>{try{return[h,await p[h][s](c,n)]}catch(y){return[h,{error:String(y.message||y).slice(0,200)}]}}));return{op:s,...Object.fromEntries(m)}}if(e==="cex_basis_scan"){if(!t.coin)return{error:"cex_basis_scan requires coin"};let{cexBasis:i,cexFundingSpread:s}=await Promise.resolve().then(()=>($E(),LE)),a={coin:t.coin,quote:t.quote,venues:t.venues};return t.fundingOnly===!0?s(a,n):i(a,n)}if(e==="snapshot_governance"){let i=String(t.op||"spaces"),s={health:()=>pt("snapshot-governance","health",{},n),spaces:()=>pt("snapshot-governance","spaces",t,n),proposals:()=>pt("snapshot-governance","proposals",t,n),activeProposals:()=>pt("snapshot-governance","activeProposals",t,n),proposal:()=>pt("snapshot-governance","proposal",t,n),votes:()=>pt("snapshot-governance","votes",t,n),votingPower:()=>pt("snapshot-governance","votingPower",t,n)};return s[i]?s[i]():{error:`unknown op: ${i}`}}if(e==="tally_governance"){let i=String(t.op||"governors"),s={health:()=>pt("tally-governance","health",{},n),governors:()=>pt("tally-governance","governors",{},n),info:()=>pt("tally-governance","info",t,n),proposals:()=>pt("tally-governance","proposals",t,n),proposal:()=>pt("tally-governance","proposal",t,n),voterStatus:()=>pt("tally-governance","voterStatus",t,n),tallyProposals:()=>pt("tally-governance","tallyProposals",t,n)};return s[i]?s[i]():{error:`unknown op: ${i}`}}if(e==="stablecoin_peg_scan")return pt("stablecoin-peg","scan",t,n);if(e==="lending_markets"){let{compoundMarkets:i}=await Promise.resolve().then(()=>(UE(),DE));return{compound:await i(n)}}if(e==="yield_vaults"){let[{yearnVaults:i},{convexPools:s}]=await Promise.all([Promise.resolve().then(()=>(qE(),BE)),Promise.resolve().then(()=>(FE(),ME))]);return{yearn:await i(n),convex:await s(n)}}if(e==="equity_venues"){let{equityVenues:i,toJsonSafe:s}=await Promise.resolve().then(()=>(Kc(),Gc));return s(i())}if(e==="equity_quote"){let{bestEquityRoute:i,toJsonSafe:s}=await Promise.resolve().then(()=>(Kc(),Gc));return s(i({ticker:t.ticker,sizeUsd:t.sizeUsd,horizonHours:t.horizonHours}))}if(e==="equity_prepare"){let{prepareEquityRoute:i,toJsonSafe:s}=await Promise.resolve().then(()=>(Kc(),Gc));return s(i({ticker:t.ticker,recipient:t.recipient||t.taker,sizeUsd:t.sizeUsd}))}if(e==="scanner_coverage"){let i=await Promise.resolve().then(()=>(Jc(),Yc));return i.registerBuiltinScanners?.(),i.scannerCoverage()}if(e==="scan_token"){let i=await Promise.resolve().then(()=>(Jc(),Yc));i.registerBuiltinScanners?.();let s=i.getScanner(Number(t.chainId));if(!s)throw new Error(`no scanner registered for chainId ${t.chainId}`);let a=await s.resolveToken(t.token,n),c=s.supports?.("resolvePools")?await s.resolvePools(t.token,n).catch(()=>null):null,l=s.supports?.("scoreRisk")?await s.scoreRisk(t.token,n).catch(()=>null):null;return{chainId:Number(t.chainId),token:a,pools:c,risk:l}}if(e==="wallet_balances"){let i=await Promise.resolve().then(()=>(Jc(),Yc));i.registerBuiltinScanners?.();let s=i.getScanner(Number(t.chainId));if(!s)throw new Error(`no scanner registered for chainId ${t.chainId}`);let a=await s.nativeBalance(t.address,n),c=t.token?await s.tokenBalance({owner:t.address,token:t.token},n).catch(()=>null):null;return{chainId:Number(t.chainId),address:t.address,native:a,token:c}}if(e==="watch_list"){let{listWatches:i}=await Promise.resolve().then(()=>(lf(),cf));return{ok:!0,watches:i(),actionMode:"alert_only",execution:!1}}if(e==="watch_create"){let{createWatch:i}=await Promise.resolve().then(()=>(lf(),cf));return{ok:!0,watch:i(t),execution:!1}}if(e==="receipt_report"){let{classifyReceipt:i}=await Promise.resolve().then(()=>(qA(),BA));return{ok:!0,...i(t.receipt||t),execution:!1}}if(e==="twitter_ca_watch"){let{tickTwitterCaWatch:i}=await Promise.resolve().then(()=>(oS(),rS));return i({handle:t.handle,chainId:t.chainId,limit:t.limit,automated:!0},n)}if(["trade_lifecycle","signal_score","workspace_artifact","research_artifact","portfolio_analyze","tax_lots","position_health","governance_prepare","safety_intelligence","portfolio_risk"].includes(e)){let{runDeskTool:i}=await Promise.resolve().then(()=>(Av(),Ev));return i(e,t,{signal:n.signal})}if(e==="mev_status"){let{executeGloballyEnabled:i,mevExecuteEnabled:s}=await Promise.resolve().then(()=>(vv(),Sv));return{ok:!0,observer:!0,executeGloballyEnabled:i()===!0,mevExecuteEnabled:s()===!0,autonomous:!1,note:"Observer may run. Execute still needs the local signer plus literal --execute on oracle mev."}}if(e==="chain_list"){let{CHAINS:i}=await Promise.resolve().then(()=>(Dl(),pm));return{ok:!0,chains:Object.entries(i).map(([s,a])=>({id:s,chainId:a.chainId,name:a.name,evm:a.evm===!0}))}}if(e==="data_catalog")return Ff(`${Mf}/data/catalog`,{signal:n.signal});if(e==="data_health")return Ff(`${Mf}/data/health`,{signal:n.signal});if(e==="tool_output_shape"){let i=String(t?.tool||""),s=Zf(i);return s?{ok:!0,tool:i,shape:s.shape,observedAtMs:s.observedAtMs}:{ok:!0,tool:i,shape:null,note:"no observed output yet \u2014 call the tool once, then re-ask"}}let o=RM[e];if(o){let{provider:i,op:s,args:a}=o(t);return pt(i,s,a,n)}throw new Error(`Unknown tool: ${e}`)}function Tv(e,t){if(e?.dataBase64&&/^image\/(?:svg\+xml|png|jpeg|webp)$/.test(String(e.mimeType||""))){let{dataBase64:c,...l}=e,u=Ws(JSON.stringify(ki(l),null,2));return{content:[{type:"image",data:c,mimeType:e.mimeType},{type:"text",text:u}]}}let n=JSON.stringify(e,null,2),r=ki(e),o=Ws(JSON.stringify(r,null,2)),s=/"(?:mac|calldata|calldataHash|unsignedTransaction|typedData)"\s*:/.test(o)?null:Jf(t,o,r);t!=="tool_output_shape"&&Qf(t,r);let a=[{type:"text",text:s?s.text:o}];try{let c=o===n?Gf(t,e):null;c&&a.push(c)}catch{}return{content:a}}var Nv=Object.freeze({name:"oracle-data-mcp",version:"1",tools:Ov,async call(e,t,n={}){return Tv(await _v(e,t,n),e)}});function PM(){return Al(Nv)}function LM(){let e=qf.argv[1];if(!e)return!1;try{return xv.realpathSync(e)===xv.realpathSync(kM(import.meta.url))}catch{return!1}}LM()&&PM();function $M({timeoutMs:e,callToolOptions:t={}}={}){return Vs({...Nv,async call(n,r,o={}){return Tv(await _v(n,r,{...t,...o}),n)}},{...e==null?{}:{callTimeoutMs:e}})}var O7=$M();export{NM as PUBLIC_MCP_FORBIDDEN_TOOLS,RM as ROUTES,Ov as TOOLS,_v as callTool,$M as createPublicMcpHandler,Tv as formatMcpResult,O7 as handle,Ff as httpJson,TM as readBoundedJsonResponse,OM as resolveDataUrl,PM as startStdioLoop,Ov as tools};