@oracle-agent/oracle 0.35.18 → 0.35.19

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.
@@ -1,14 +1,14 @@
1
1
  #!/usr/bin/env node
2
- var t0=Object.defineProperty;var A=(e,t,r)=>()=>{if(r)throw r[0];try{return e&&(t=e(e=0)),t}catch(n){throw r=[n],n}};var B=(e,t)=>{for(var r in t)t0(e,r,{get:t[r],enumerable:!0})};import{homedir as xi}from"node:os";import{join as ki}from"node:path";function Si(e,t,r=""){let n=process.env[e];if(n!=null&&String(n).trim()!=="")return n;let o=t?process.env[t]:void 0;return o!=null&&String(o).trim()!==""?o:r}function _n(e,t,r=!1){return String(Si(e,t,r?"1":"")).trim()==="1"}var Ac,r0,U1,On=A(()=>{Ac=process.env.ORACLE_PUBLIC_DESKTOP==="1",r0=Ac?process.env.ORACLE_CONFIG_DIR||ki(xi(),".config","oracle"):ki(xi(),".config","oracle"),U1=Ac?r0:ki(xi(),".config","mad-desk")});function v0(e){let t=String(e??"");return t.length<18?"[REDACTED]":`${t.slice(0,6)}\u2026${t.slice(-4)}`}function I0(e){return`\xABredacted:${String(e??"").slice(0,4)}\u2026\xBB`}function vt(e,t={}){if(e==null)return e;let r=typeof e=="string"?e:String(e);if(!r||!(t.force||h0))return r;let n=t.fileRead?I0:v0;r=r.replace(g0,"[REDACTED_PRIVATE_KEY]"),r=r.replace(b0,"[REDACTED_EVM_KEY]"),r=r.replace(w0,o=>n(o));for(let o of y0)o.lastIndex=0,r=r.replace(o,i=>n(i));return r=r.replace(x0,(o,i,s,a)=>/^(?:os\.(?:getenv|environ)|process\.env|\$ENV\{)/.test(a)?`${i}=${s||""}${a}${s||""}`:`${i}=${s||""}${n(a)}${s||""}`),r=r.replace(k0,(o,i,s,a)=>o.replace(a,n(a))),r=r.replace(S0,(o,i,s,a)=>`${i}${n(s)}${a}`),r}function Cc(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 r=[...t.searchParams.keys()];for(let n of r){let o=String(n).replace(/[^a-z0-9]/gi,"").toLowerCase();A0.has(o)&&t.searchParams.set(n,"[REDACTED]")}return{ok:!0,url:t,href:t.toString()}}var m0,h0,y0,b0,g0,w0,x0,k0,S0,E0,A0,Ai=A(()=>{m0=(process.env.ORACLE_REDACT_SECRETS??"true").toLowerCase(),h0=["1","true","yes","on"].includes(m0),y0=[/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],b0=/\b0x[a-fA-F0-9]{64}\b/g,g0=/-----BEGIN (?:RSA |EC |OPENSSH |ENCRYPTED )?PRIVATE KEY-----[\s\S]*?-----END (?:RSA |EC |OPENSSH |ENCRYPTED )?PRIVATE KEY-----/g,w0=/\beyJ[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\b/g,x0=/\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,k0=/^(?:export\s+)?((?:api[_-]?key|token|secret|password|private[_-]?key|mnemonic|seed[_-]?phrase|authorization))\s*[:=]\s*(['"]?)([^\s&]+)\2/gim,S0=/("(?:api[_-]?key|apiKey|access[_-]?token|refresh[_-]?token|client[_-]?secret|private[_-]?key|privateKey|secret|password|authorization|bearer|mnemonic|seedPhrase)"\s*:\s*")([^"]{6,})(")/gi,E0=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"]),A0=new Set([...E0].map(e=>e.replace(/[^a-z0-9]/gi,"").toLowerCase()))});import It from"node:net";import C0 from"node:dns";function Rn(e){let t=String(e).toLowerCase().split("%")[0];if((t.match(/::/g)||[]).length>1)return null;let r=l=>{if(!l)return[];let d=l.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))},[n,o]=t.split("::"),i=r(n),s=r(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 vi(e,t,r){let n=Math.floor(r/8),o=r%8;for(let s=0;s<n;s+=1)if(e[s]!==t[s])return!1;if(!o)return!0;let i=255<<8-o;return(e[n]&i)===(t[n]&i)}function Ii(e){if(It.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(It.isIPv6(e)){let t=Rn(e);if(!t)return!1;let r=Rn("::ffff:0:0");return vi(t,r,96)?Ii([...t.slice(12)].join(".")):vi(t,Rn("2000::"),3)?![["2001::",23],["2001:db8::",32],["2001:10::",28],["2001:2::",48],["2002::",16],["3fff::",20]].some(([o,i])=>vi(t,Rn(o),i)):!1}return!1}function R0(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 r=t.hostname.toLowerCase().replace(/^\[|\]$/g,"").replace(/\.+$/,"");if(T0.has(r)||r.endsWith(".localhost")||r.endsWith(".internal"))return{ok:!1,error:`refused internal host ${r}`};let n=It.isIP(r);return n!==0&&!Ii(r)?{ok:!1,error:`refused private address ${r}`}:{ok:!0,url:t,host:r,isLiteralIp:n!==0}}async function _i(e,{lookupFn:t=C0.promises.lookup}={}){let r=R0(e);if(!r.ok)return r;if(r.isLiteralIp)return{ok:!0,url:r.url,addresses:[{address:r.host,family:It.isIPv6(r.host)?6:4}]};let n;try{n=await t(r.host,{all:!0,verbatim:!0})}catch{return{ok:!1,error:`refused: ${r.host} did not resolve`}}return!Array.isArray(n)||n.length===0||n.some(o=>!Ii(o.address))?{ok:!1,error:`refused: ${r.host} resolves to a non-public address`}:{ok:!0,url:r.url,addresses:n}}async function Oi({requireUndici:e=!1,importUndici:t=()=>import("undici")}={}){let r,n;try{let d=await t();r=d.Agent,n=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 r!="function"||typeof n!="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||(It.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(It.isIP(p))return[{address:p,family:It.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},u=new r({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)}}}),l=N0((d,p={})=>n(d,{...p,dispatcher:u}),a);return{dispatcher:u,fetch:l,pin:a,resolve:c,async close(){try{await u.destroy()}catch{}}}}function N0(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[Ci]=Object.freeze({pin:t}),e}function Ti(e){return typeof e=="function"&&typeof e[Ci]?.pin=="function"}function Rc(e,t,r){if(!Ti(e))throw new Error("pinFetchToAddresses: fetchImpl is not pin-capable");e[Ci].pin(t,r)}var T0,Ci,Nc=A(()=>{T0=new Set(["localhost","metadata.google.internal","metadata.goog"]);Ci=Symbol.for("oracle.egressGuard.pinCapableFetch")});import{createHash as Pc}from"node:crypto";function U0(e){let t=String(e||"").toLowerCase();return Dc.includes(t)||/(^|-)(api[-_]?key|key|token|secret|auth|authorization|session|cookie|signature|access)(-|$)/.test(t)}function B0(e){let t={};for(let[r,n]of Object.entries(e||{}))U0(r)||(t[r]=n);return t}function F0(e,t){if(!e)throw new Error(`HTTP redirect from ${t} missing Location`);let r=new URL(String(e),String(t));if(r.protocol!=="http:"&&r.protocol!=="https:")throw new Error(`HTTP redirect from ${t} used unsupported protocol ${r.protocol}`);return r.toString()}function D0(e,t){return new URL(String(e)).origin===new URL(String(t)).origin}function Uc(e){let t=String(e?.method||"");return t?!M0.test(t):!1}function H0(e,t){if(e==="GET"&&t==null)return!0;if(e!=="POST"||t==null)return!1;let r=t;if(typeof t=="string")try{r=JSON.parse(t)}catch{return!1}return Array.isArray(r)?r.length>0&&r.every(Uc):!r||typeof r!="object"?!1:r.jsonrpc&&r.method?Uc(r):typeof r.type=="string"&&j0.has(r.type)&&r.action==null&&r.signature==null&&r.nonce==null}function z0(e,t,r,n={},o=null){let i={};for(let[p,f]of Object.entries(r||{}))i[p.toLowerCase()]=f;let s=Object.keys(i).filter(p=>/(^|-)(api[-_]?key|key|token|secret|auth|authorization|session|cookie|signature|access)(-|$)/.test(p)),c=[...new Set([...Dc,...s])].sort().map(p=>`${p}=${i[p]??""}`).join(`
3
- `),u=Pc("sha256").update(c).digest("hex").slice(0,32),l=`${n.untrustedUrl?"untrusted":"trusted"}:${n.maxResponseBytes??"unbounded"}`,d=o==null?"-":Pc("sha256").update(String(o)).digest("hex").slice(0,32);return`${e} ${t} ${l} ${u} ${d}`}function V0(e,t){let r=Number(t);return Number.isFinite(r)&&r>0?Math.min(r*1e3,qc):Math.min(250*2**e,qc)+Math.floor(Math.random()*100)}function Ir(e,t={}){let r=new Error(e);return r.retryable=!1,Object.assign(r,t),r}function Ni(e,t,r){return Ir(`HTTP response from ${e} exceeded maxResponseBytes ${r} (${t})`,{oversize:!0})}function _r(e){try{let t=e?.body?.cancel?.();t&&typeof t.then=="function"&&t.catch(()=>{})}catch{}}function G0(e){return e?e.byteLength??e.length??0:0}async function Bc(e,t,{url:r,truncate:n=!1,onOversize:o}={}){if(t==null)return await e.text();let i=Number(e.headers?.get?.("content-length"));if(Number.isFinite(i)&&i>t&&(_r(e),!n))throw Ni(r,`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(!n)throw Ni(r,`body ${p} 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:p}=await s.read();if(p)break;if(d&&(a.push(Buffer.from(d)),c+=G0(d),c>t)){u=!0;break}}}finally{if(u)try{await s.cancel()}catch{}try{s.releaseLock?.()}catch{}}if(u&&(typeof o=="function"&&o(),!n))throw Ni(r,`streamed ${c} bytes`,t);let l=Buffer.concat(a);return(u?l.subarray(0,t):l).toString("utf8")}function Fc(e){if(!e)return null;try{return JSON.parse(e)}catch{return null}}async function K0(e,{fetchImpl:t,method:r,headers:n,body:o,timeoutMs:i,lookupFn:s,realFetch:a,untrustedUrl:c=!1,maxResponseBytes:u=null,importUndici:l,validateResponse:d,signal:p}){let f=new AbortController,m=setTimeout(()=>f.abort(),i),h=p?typeof AbortSignal.any=="function"?AbortSignal.any([p,f.signal]):p:f.signal,y=null,x=t,E=s?{lookupFn:s}:{};if(c&&!a&&!Ti(x))throw Ir(`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 _=async(w,{status:O=null}={})=>{let v=await _i(w,E);if(!v.ok)throw Ir(O==null?`HTTP refused ${w}: ${v.error}`:`HTTP redirect to ${w} ${v.error}`,O==null?{}:{status:O});let g=new URL(w).hostname;if(a){if(y&&(await y.close(),y=null),!y)try{y=await Oi({requireUndici:!0,...l?{importUndici:l}:{}})}catch(b){throw Ir(O==null?`HTTP refused ${w}: ${b?.message||b}`:`HTTP redirect to ${w} refused: ${b?.message||b}`,O==null?{}:{status:O})}y.pin(g,v.addresses),x=y.fetch}else Rc(x,g,v.addresses);return v};try{let w=String(e),O={...n||{}};c&&await _(w);for(let v=0;v<=Lc;v+=1){let g=await x(w,{method:r,headers:O,body:o,signal:h,redirect:"manual"});if(q0.has(g.status)){if(r!=="GET"&&r!=="HEAD"){let P=await Bc(g,u??L0,{url:w,truncate:!0}),L=new Error(`HTTP ${g.status} ${r} ${w} redirected non-idempotent request`);throw L.status=g.status,L.body=Fc(P)??P.slice(0,300),L}if(v===Lc)throw _r(g),new Error(`HTTP redirect loop for ${e}`);let k=g.headers?.get?.("location"),N;try{N=F0(k,w)}catch(P){throw _r(g),P}let I=!D0(N,w);if(_r(g),I&&(O=B0(O)),c)await _(N,{status:g.status});else if(I){let P=await _i(N,E);if(!P.ok){let L=new Error(`HTTP redirect from ${w} ${P.error}`);throw L.status=g.status,L.retryable=!1,L}a&&P.addresses?.length&&(y||(y=await Oi(l?{importUndici:l}:{})),y&&(y.pin(new URL(N).hostname,P.addresses),x=y.fetch))}w=N;continue}if(typeof d=="function")try{await d(g,{url:w})}catch(k){throw _r(g),Ir(k?.message||String(k))}let b=await Bc(g,u,{url:w,onOversize:()=>f.abort()}),S=Fc(b);if(!g.ok){let k=new Error(`HTTP ${g.status} ${r} ${w}`);throw k.status=g.status,k.retryAfter=g.headers?.get?.("retry-after")??null,k.body=S??b.slice(0,300),k}return S??b}throw new Error(`HTTP redirect loop for ${e}`)}finally{clearTimeout(m),y&&await y.close()}}async function C(e,t={}){let r=t.fetchImpl||globalThis.fetch;if(typeof r!="function")throw new Error("fetch unavailable \u2014 pass opts.fetchImpl");let n=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):$0,c=t.lookupFn,u=!t.fetchImpl,l=t.untrustedUrl===!0,d=t.importUndici,p=t.validateResponse,f=t.signal,m=Number(t.maxResponseBytes),h=Number.isFinite(m)&&m>0?Math.floor(m):null,y=async()=>{let O;for(let v=0;v<=a;v++){f?.throwIfAborted?.();try{return await K0(e,{fetchImpl:r,method:o,headers:i,body:s,timeoutMs:n,lookupFn:c,realFetch:u,untrustedUrl:l,maxResponseBytes:h,importUndici:d,validateResponse:p,signal:f})}catch(g){O=g;let b=g?.status,S=g?.name==="AbortError"||g?.name==="TimeoutError"||f?.aborted,k=new Set([408,425,429]),N=g?.retryable===!1?!1:b!=null?k.has(b)||P0.has(b)&&$c.has(o):!S&&$c.has(o);if(v===a||!N)throw g;let I=V0(v,g?.retryAfter);f?await new Promise((P,L)=>{let H=setTimeout(P,I);f.addEventListener("abort",()=>{clearTimeout(H),L(f.reason||new DOMException("Aborted","AbortError"))},{once:!0})}):await W0(I)}}throw O};if(!(t.dedupe!==!1&&!f&&H0(o,s)))return y();let E=z0(o,e,i,{untrustedUrl:l,maxResponseBytes:h},s),_=Ri.get(E);if(_)return _;let w=y().finally(()=>Ri.delete(E));return Ri.set(E,w),w}async function jt(e,t,r){let n=Array.from(e),o=Math.max(1,Math.min(Number(t)||1,n.length||1)),i=new Array(n.length),s=0;return await Promise.all(Array.from({length:o},async()=>{for(;s<n.length;){let a=s++;i[a]=await r(n[a],a)}})),i}var P0,$c,$0,qc,Dc,q0,Lc,L0,Ri,M0,j0,W0,j=A(()=>{Nc();P0=new Set([408,425,429,500,502,503,504]),$c=new Set(["GET","HEAD","OPTIONS","PUT","DELETE"]),$0=2,qc=4e3,Dc=["authorization","x-api-key","x-tensor-api-key","0x-api-key","api-key","cookie","proxy-authorization"],q0=new Set([301,302,303,307,308]),Lc=3,L0=64*1024;Ri=new Map,M0=/(?:^|_)(send|submit|broadcast|sign|requestAirdrop)(?=[A-Z_]|$)/i,j0=new Set(["allMids","l2Book","outcomeMeta","spotClearinghouseState","userFills","meta","metaAndAssetCtxs","perpDexs","candleSnapshot","fundingHistory","openOrders","frontendOpenOrders","clearinghouseState","spotMeta","validatorSummaries","delegatorSummary","delegations","delegatorRewards","delegatorHistory","maxBuilderFee"]);W0=e=>new Promise(t=>setTimeout(t,e))});function J0({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 r=process.env.HL_API_URL.replace(/\/$/,"");return r.endsWith("/info")?r:`${r}/info`}return e||process.env.HL_TESTNET==="1"?Y0:X0}async function Or(e,t={}){if(!e||!e.type)throw new Error("hlInfo requires body.type");let r=J0(t);return C(r,{method:"POST",body:e,fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function Mc(e={}){return Or({type:"allMids"},e)}async function jc(e={}){return Or({type:"meta"},e)}async function Hc(e={}){let t={type:"metaAndAssetCtxs"};return e.dex&&(t.dex=e.dex),Or(t,e)}async function zc({coin:e,interval:t="1h",startTime:r,endTime:n},o={}){if(!e)throw new Error("hlCandleSnapshot requires coin");let i={type:"candleSnapshot",req:{coin:String(e),interval:t,startTime:r??Date.now()-24*3600*1e3,endTime:n??Date.now()}};return Or(i,o)}async function Vc({coin:e,startTime:t,endTime:r},n={}){if(!e)throw new Error("hlFundingHistory requires coin");return Or({type:"fundingHistory",coin:String(e),startTime:t??Date.now()-24*3600*1e3,endTime:r??Date.now()},n)}var X0,Y0,Nn=A(()=>{j();X0="https://api.hyperliquid.xyz/info",Y0="https://api.hyperliquid-testnet.xyz/info"});import{createHash as Q0}from"node:crypto";function Ye(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function Ht(e){return typeof e=="number"&&Number.isFinite(e)}function qi(e){if(e==null||typeof e!="object"||Object.isFrozen(e))return e;if(Array.isArray(e)){for(let t of e)qi(t);return Object.freeze(e)}for(let t of Object.keys(e))qi(e[t]);return Object.freeze(e)}function _t(e){if(Array.isArray(e))return e.map(_t);if(e!=null&&typeof e=="object"){let t={};for(let r of Object.keys(e).sort())t[r]=_t(e[r]);return t}return e}function Pi(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 Wc(e){return{feesUsd:e.costs.feesUsd,builderFeesUsd:e.costs.builderFeesUsd,fundingUsd:e.costs.fundingUsd,slippageUsd:e.costs.slippageUsd}}function ey(e){return(e.feesUsd||0)+(e.builderFeesUsd||0)+Math.max(0,e.fundingUsd||0)+(e.slippageUsd||0)}function ty(e){let t=0;for(let r of e.trades)r.grossPnlUsd>0&&(t+=r.grossPnlUsd);return t}function ry(e,t,r){return!(!e||e.tradeCount<Math.max(1,Math.min(r,3))||!(e.netPnlUsd>0)||!(e.profitFactor>1)||!(e.maxDrawdownPct<=t.maxDailyLossPct))}function Kc(e){if(!Ye(e))throw new TypeError("evidence artifact must be a plain object");if(!Z0.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(!Ye(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(!Ye(e.walkForward)||!Array.isArray(e.walkForward.windows))throw new TypeError("evidence artifact walkForward windows required");if(e.status==="pass_live_eligible"&&(!Ye(e.train)||!Ye(e.holdout)))throw new TypeError("live-eligible evidence artifact requires train and holdout facts");return _t({barsHash:e.barsHash,compilerHash:e.compilerHash,flags:e.flags.map(t=>_t(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 Xc(e){return Q0("sha256").update(JSON.stringify(Kc(e)),"utf8").digest("hex")}function Le(e,t,r=0){if(!Number.isInteger(e)||e<r)throw new Error(`${t} must be an integer >= ${r}`);return e}function $i(e,t){if(!Ye(e)||!Ye(e.metrics))throw new Error(`${t} metrics required`);let r=Le(e.tradeCount,`${t}.tradeCount`);if(e.metrics.tradeCount!==r)throw new Error(`${t} tradeCount contradicts metrics.tradeCount`);for(let n of["netPnlUsd","profitFactor","maxDrawdownPct"])if(!Ht(e.metrics[n]))throw new Error(`${t}.metrics.${n} must be finite`);if(e.metrics.maxDrawdownPct<0)throw new Error(`${t}.metrics.maxDrawdownPct must be >= 0`);return e.metrics}function ny(e,{maxDailyLossPct:t}={}){let r=e.split,n=Le(r.trainStartIndex,"split.trainStartIndex"),o=Le(r.trainEndIndex,"split.trainEndIndex"),i=Le(r.trainBarCount,"split.trainBarCount",1),s=Le(r.holdoutStartIndex,"split.holdoutStartIndex"),a=Le(r.holdoutEndIndex,"split.holdoutEndIndex"),c=Le(r.holdoutBarCount,"split.holdoutBarCount",1);if(n!==0||o-n+1!==i||s!==o+1||a-s+1!==c)throw new Error("evidence split must be contiguous, chronological, and count-consistent");if(!Ht(r.trainFraction)||r.trainFraction<=0||r.trainFraction>=1)throw new Error("split.trainFraction must be in (0,1)");$i(e.train,"train");let u=$i(e.holdout,"holdout");if(u.tradeCount<1||u.netPnlUsd<=0||u.profitFactor<=1)throw new Error("live-eligible holdout metrics do not pass");if(Ht(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 p=0,f=-1;for(let h=0;h<d.length;h++){let y=d[h];if(!Ye(y)||y.index!==h||typeof y.passed!="boolean")throw new Error("walk-forward windows must be ordered and structurally valid");let x=Le(y.trainStartIndex,`walkForward.windows[${h}].trainStartIndex`),E=Le(y.trainEndIndex,`walkForward.windows[${h}].trainEndIndex`),_=Le(y.evalStartIndex,`walkForward.windows[${h}].evalStartIndex`),w=Le(y.evalEndIndex,`walkForward.windows[${h}].evalEndIndex`);if(x!==0||E>=_||_>w||_<=f)throw new Error("walk-forward windows must be chronological and disjoint");if(f=w,y.passed){if(p+=1,y.reason!=="pass")throw new Error("passed walk-forward window reason must be pass");let O=$i({metrics:y.metrics,tradeCount:y.metrics?.tradeCount},`walkForward.windows[${h}]`);if(O.tradeCount<1||O.netPnlUsd<=0||O.profitFactor<=1)throw new Error("passed walk-forward window metrics do not pass");if(Ht(t)&&O.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(!Ht(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 Yc(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 r=Kc(e),n=_t({id:e.id,...r});if(JSON.stringify(_t(e))!==JSON.stringify(n))throw new Error("evidence artifact contains fields unbound from its deterministic identity");let o=Xc(e);if(e.id!==o)throw new Error("evidence.id does not match its deterministic artifact facts digest");return e.status==="pass_live_eligible"&&ny(e,t),e}function Li({strategy:e,bars:t,backtestOptions:r={},trainFraction:n=.7,walkForwardWindows:o=3,minTrades:i=10}={}){let s=[];if(!Ye(e))throw new TypeError("strategy must be a plain object");if(!Array.isArray(t))throw new TypeError("bars must be an array");if(!Ye(r))throw new TypeError("backtestOptions must be a plain object");if(!Ht(n)||n<=0||n>=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=be(e),c=zt(a),u=Cr(t),l=t.length,d=(F=[],z={})=>Gc({status:"fail",strategy:a,sHash:c,barsHash:u,split:z.split||{trainStartIndex:0,trainEndIndex:-1,trainBarCount:0,holdoutStartIndex:0,holdoutEndIndex:-1,holdoutBarCount:0,trainFraction:n},train:z.train||null,holdout:z.holdout||null,walkForward:z.walkForward||{windows:[],passRate:0},flags:[...s,...F]});if(l<10)return d([{type:"insufficient_bars",message:"need at least 10 bars for evidence"}]);let p=Math.floor(l*n),f=p,m=l-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),x,E;try{x=mt(a,h,r),E=mt(a,y,r)}catch(F){return d([{type:"backtest_error",message:String(F.message||F)}])}let _={metrics:Pi(x),costs:Wc(x),tradeCount:x.metrics.tradeCount},w={metrics:Pi(E),costs:Wc(E),tradeCount:E.metrics.tradeCount},O={trainStartIndex:0,trainEndIndex:p-1,trainBarCount:p,holdoutStartIndex:f,holdoutEndIndex:l-1,holdoutBarCount:m,trainFraction:n},v=[],g=Math.floor(l/(o+1));if(g<3)s.push({type:"invalid_windowing",message:"walk-forward window size too small",wfSize:g});else for(let F=0;F<o;F++){let z=g*(F+1),ie=z,K=Math.min(l,ie+g);if(K-ie<3||z<3){v.push({index:F,trainStartIndex:0,trainEndIndex:z-1,evalStartIndex:ie,evalEndIndex:K-1,passed:!1,reason:"window_too_small",metrics:null});continue}let Ge=t.slice(ie,K),An;try{An=mt(a,Ge,r)}catch{v.push({index:F,trainStartIndex:0,trainEndIndex:z-1,evalStartIndex:ie,evalEndIndex:K-1,passed:!1,reason:"backtest_error",metrics:null});continue}let vn=Pi(An),In=ry(vn,a.risk,i);v.push({index:F,trainStartIndex:0,trainEndIndex:z-1,evalStartIndex:ie,evalEndIndex:K-1,passed:In,reason:In?"pass":"fail_metrics",metrics:vn})}let b=v.filter(F=>F.passed).length,S=v.length===0?0:b/v.length,k={windows:v,passRate:S,windowsRun:v.length};w.metrics.tradeCount===0&&_.metrics.tradeCount===0&&s.push({type:"no_trades",message:"no trades in train or holdout"}),w.metrics.tradeCount===0&&s.push({type:"absent_oos_trades",message:"holdout produced no trades"}),w.metrics.netPnlUsd<0&&s.push({type:"holdout_loss",message:"holdout netPnlUsd is negative"}),_.metrics.netPnlUsd>0&&w.metrics.netPnlUsd<0&&_.metrics.netPnlUsd>Math.abs(w.metrics.netPnlUsd)*.25?s.push({type:"overfit",message:"profitable train with losing holdout (OOS collapse)"}):_.metrics.netPnlUsd>0&&w.metrics.netPnlUsd>0&&w.metrics.netPnlUsd<_.metrics.netPnlUsd*.1&&_.metrics.tradeCount>=i&&s.push({type:"severe_oos_collapse",message:"holdout pnl collapsed vs train"});let N=ey(w.costs),I=ty(E);I>0&&N>I&&s.push({type:"costs_exceed_gross",message:"holdout costs exceed gross gains"});let P=s.some(F=>["insufficient_bars","invalid_windowing","absent_oos_trades","holdout_loss","no_trades","severe_oos_collapse","backtest_error"].includes(F.type)),L=s.some(F=>F.type==="overfit"),H="fail";return w.metrics.tradeCount>=i&&w.metrics.netPnlUsd>0&&w.metrics.profitFactor>1&&w.metrics.maxDrawdownPct<=a.risk.maxDailyLossPct&&S>=.6&&!(I>0&&N>I)&&!L&&!s.some(F=>F.type==="severe_oos_collapse"||F.type==="invalid_windowing")?H="pass_live_eligible":!P&&w.metrics.tradeCount>0&&_.metrics.tradeCount>0&&Number.isFinite(w.metrics.netPnlUsd)?(H="pass_paper_only",w.metrics.tradeCount<i&&s.push({type:"undersampled",message:"holdout trades below minTrades"})):L&&w.metrics.tradeCount>0&&_.metrics.netPnlUsd>0?H="fail":w.metrics.tradeCount>0&&_.metrics.tradeCount>0&&!P?H="pass_paper_only":H="fail",w.metrics.netPnlUsd<0&&(H=H==="pass_live_eligible"?"fail":H==="pass_paper_only"?"pass_paper_only":"fail",H="fail"),Gc({status:H,strategy:a,sHash:c,barsHash:u,split:O,train:_,holdout:w,walkForward:k,flags:s})}function Gc({status:e,strategy:t,sHash:r,barsHash:n,split:o,train:i,holdout:s,walkForward:a,flags:c}){let u={status:e,strategyHash:r,compilerHash:Ct,barsHash:n,split:o,train:i,holdout:s,walkForward:a,flags:c};return u.id=Xc(u),qi(_t(JSON.parse(JSON.stringify(u))))}var Z0,Ui=A(()=>{Tt();Ot();Pn();Z0=Object.freeze(["fail","pass_paper_only","pass_live_eligible"])});import{createHash as oy,createHmac as iy,timingSafeEqual as iI}from"node:crypto";function Bi(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(Bi).join(",")}]`:`{${Object.keys(e).sort().map(r=>`${JSON.stringify(r)}:${Bi(e[r])}`).join(",")}}`}function Jc(e){let t=String(e?.ORACLE_STAMP_HMAC_SECRET||"").trim();return t.length>=16?t:""}function Qc(e=process.env){return Jc(process.env)||Jc(e)}function uy(e){let{prepareHash:t,prepareMac:r,note:n,...o}=e||{};return o}function ly(e){let t=uy(e);return oy("sha256").update(Bi(t)).digest("hex")}function dy(e,t=Qc()){return t?iy("sha256",t).update(String(e)).digest("hex"):""}function Q(e,{provider:t,kind:r,env:n=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||r,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+ay:Number(i),l=u-c;if(!Number.isSafeInteger(c)||!Number.isSafeInteger(u)||l<=0||l>cy)throw new Error("stampPrepared: bounded preparedAt/expiresAt required");let p={...a,preparedAt:c,expiresAt:u,prepareVersion:sy},f=ly(p),m=Qc(n),h=m?dy(f,m):void 0,y={...p,prepareHash:f};return h&&(y.prepareMac=h),y}var sy,ay,cy,xe=A(()=>{sy=2,ay=300*1e3,cy=(()=>{let e=Number(process.env.ORACLE_PREPARE_HARD_MAX_AGE_MS);return Number.isFinite(e)&&e>0?e:1800*1e3})()});function Tr(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function fy(e){return String(e).toLowerCase().replace(/[^a-z0-9]/g,"")}function Di(e,t="value"){if(Array.isArray(e)){e.forEach((r,n)=>Di(r,`${t}[${n}]`));return}if(Tr(e))for(let[r,n]of Object.entries(e)){let o=fy(r);if(py.some(i=>o.includes(i)))throw new Error(`handoff: forbidden secret-like field at ${t}.${r}`);Di(n,`${t}.${r}`)}}function Fi(e){return typeof e=="number"&&Number.isFinite(e)&&e>0}function Zc({strategy:e,evidence:t,shadow:r,caps:n,nowMs:o=Date.now(),env:i=process.env}={}){if(Di({strategy:e,evidence:t,shadow:r,caps:n},"handoff"),!Tr(e))throw new Error("handoff: strategy required");if(!Tr(t))throw new Error("handoff: evidence required");if(!Tr(r))throw new Error("handoff: shadow required");if(!Tr(n))throw new Error("handoff: caps required");if(typeof r.id!="string"||!r.id.trim())throw new Error("handoff: shadow.id required");if(typeof r.stateHash!="string"||!/^[0-9a-f]{64}$/.test(r.stateHash))throw new Error("handoff: shadow.stateHash must be a sha256 hash");if(r.status!=="running")throw new Error("handoff: shadow.status must be running");if(!Number.isInteger(r.cursor)||r.cursor<=0)throw new Error("handoff: shadow.cursor must be a positive integer");if(!Number.isInteger(r.updatedAt)||r.updatedAt<=0||r.updatedAt>o)throw new Error("handoff: shadow.updatedAt must be a positive integer <= nowMs");let s=be(e,{nowMs:o}),a=ge(s);if(Yc(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 n)||n[p]==null)throw new Error(`handoff: caps.${p} required`);if(!Fi(n.perStrategyNotionalUsd))throw new Error("handoff: caps.perStrategyNotionalUsd must be positive");if(n.perStrategyNotionalUsd>a.strategy.risk.maxNotionalUsd)throw new Error("handoff: caps.perStrategyNotionalUsd exceeds strategy.risk.maxNotionalUsd");if(!Fi(n.maxLeverage))throw new Error("handoff: caps.maxLeverage must be positive");if(n.maxLeverage>a.strategy.risk.maxLeverage)throw new Error("handoff: caps.maxLeverage exceeds strategy.risk.maxLeverage");if(!Fi(n.dailyLossCapUsd))throw new Error("handoff: caps.dailyLossCapUsd must be positive");let u=a.strategy.risk.maxNotionalUsd*(a.strategy.risk.maxDailyLossPct/100);if(n.dailyLossCapUsd>u)throw new Error("handoff: caps.dailyLossCapUsd exceeds strategy daily loss ceiling");if(!Array.isArray(n.chainAllowlist)||n.chainAllowlist.length===0)throw new Error("handoff: caps.chainAllowlist must be a non-empty array");if(!n.chainAllowlist.every(p=>p==="hyperliquid"))throw new Error("handoff: caps.chainAllowlist must include only hyperliquid");if(!n.chainAllowlist.includes("hyperliquid"))throw new Error("handoff: caps.chainAllowlist must include hyperliquid");if(!Array.isArray(n.assetAllowlist)||n.assetAllowlist.length===0)throw new Error("handoff: caps.assetAllowlist must be a non-empty array");if(n.assetAllowlist.length!==1||n.assetAllowlist[0]!==a.strategy.market.coin)throw new Error("handoff: caps.assetAllowlist must contain only the strategy market coin");if(!Number.isInteger(n.expiresAt)||!(n.expiresAt>o))throw new Error("handoff: caps.expiresAt must be an integer > nowMs");if(n.expiresAt>a.strategy.risk.expiresAt)throw new Error("handoff: caps.expiresAt exceeds strategy.risk.expiresAt");if(n.killSwitchRequired!==!0)throw new Error("handoff: caps.killSwitchRequired must be exactly true");let l={perStrategyNotionalUsd:n.perStrategyNotionalUsd,maxLeverage:n.maxLeverage,dailyLossCapUsd:n.dailyLossCapUsd,chainAllowlist:[...n.chainAllowlist],assetAllowlist:[...n.assetAllowlist],expiresAt:n.expiresAt,killSwitchRequired:!0},d={strategyHash:a.strategyHash,compilerHash:a.compilerHash,evidence:JSON.parse(JSON.stringify(t)),shadow:{id:r.id,stateHash:r.stateHash,status:r.status,cursor:r.cursor,updatedAt:r.updatedAt},compiled:{strategyHash:a.strategyHash,compilerHash:a.compilerHash,compilerVersion:Rr,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 Q(d,{provider:"hl-strategy",kind:"strategy-live-handoff",env:i})}var py,eu=A(()=>{Tt();Ui();Ot();xe();py=["privatekey","secretkey","seed","mnemonic","passphrase","password","keystore","keymaterial","apikey","authtoken","accesstoken","refreshtoken","credential","bearer","signature","authorization","xprv","xpriv","wif"]});function Vt(e,t){let r=Number(e);if(!Number.isFinite(r))throw new TypeError(`${t} must be finite`);return r}function Wt(e,t){if(!Number.isSafeInteger(e)||e<0)throw new TypeError(`${t} must be a non-negative safe integer`);return e}function Nr(e){if(Array.isArray(e))for(let t of e)Nr(t);else if(e&&typeof e=="object")for(let t of Object.values(e))Nr(t);return Object.freeze(e)}function hy(e){let t=my[e];if(!t)throw new TypeError(`unsupported strategy interval: ${e}`);return t}function yy(e,{endTime:t=Number.MAX_SAFE_INTEGER}={}){if(!Array.isArray(e))throw new TypeError("Hyperliquid candles must be an array");Wt(t,"endTime");let r=new Map;for(let n=0;n<e.length;n++){let o=e[n];if(!o||typeof o!="object"||Array.isArray(o))throw new TypeError(`candles[${n}] must be an object`);let i=Wt(Number(o.t),`candles[${n}].t`);if(Wt(Number(o.T),`candles[${n}].T`)>t)continue;let a={t:i,o:Vt(o.o,`candles[${n}].o`),h:Vt(o.h,`candles[${n}].h`),l:Vt(o.l,`candles[${n}].l`),c:Vt(o.c,`candles[${n}].c`),v:Vt(o.v,`candles[${n}].v`)};if(a.h<Math.max(a.o,a.c,a.l))throw new TypeError(`candles[${n}].h is below another price`);if(a.l>Math.min(a.o,a.c,a.h))throw new TypeError(`candles[${n}].l is above another price`);if(a.v<0)throw new TypeError(`candles[${n}].v must be non-negative`);let c=r.get(i);if(c&&JSON.stringify(c)!==JSON.stringify(a))throw new TypeError(`conflicting duplicate candle at timestamp ${i}`);c||r.set(i,a)}return Nr([...r.values()].sort((n,o)=>n.t-o.t))}function by(e,t){if(!Array.isArray(e))throw new TypeError("Hyperliquid funding history must be an array");let r=new Map;for(let n=0;n<e.length;n++){let o=e[n];if(!o||typeof o!="object"||Array.isArray(o))throw new TypeError(`funding[${n}] must be an object`);let i=Wt(Number(o.time),`funding[${n}].time`);i>t||r.set(i,{time:i,fundingRate:Vt(o.fundingRate,`funding[${n}].fundingRate`)})}return[...r.values()].sort((n,o)=>n.time-o.time)}async function gy({coin:e,startTime:t,endTime:r},n){let o=[],i=Math.max(0,t-288e5),s=!1;for(let a=0;a<16&&i<=r;a++){let c=await Vc({coin:e,startTime:i,endTime:r},n);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>=r){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 by(o,r)}function wy(e,t,r){let n=0,o=null;return e.map(i=>{let s=i.t+r,a=0;for(;n<t.length&&t[n].time<s;){let c=t[n];o=c.fundingRate,c.time>=i.t&&(a+=c.fundingRate),n+=1}return o==null?{...i,fundingPaymentRate:a}:{...i,fundingRate:o,fundingPaymentRate:a}})}async function tu(e,t={}){if(!e||typeof e!="object"||Array.isArray(e))throw new TypeError("strategy history input must be an object");let r=String(e.coin||"").trim().toUpperCase();if(!/^[A-Z0-9][A-Z0-9._-]{0,11}$/.test(r))throw new TypeError("coin must be an uppercase Hyperliquid asset id");let n=String(e.interval||"15m"),o=hy(n);if(e.endTime==null)throw new TypeError("endTime is required for deterministic history");let i=Wt(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):Wt(e.startTime,"startTime");if(a>=i)throw new TypeError("startTime must be before endTime");let[c,u]=await Promise.all([zc({coin:r,interval:n,startTime:a,endTime:i},t),gy({coin:r,startTime:a,endTime:i},t)]),l=yy(c,{endTime:i}),d=Nr(wy(l,u,o));return Nr({coin:r,interval:n,range:{startTime:a,endTime:i},bars:d})}var my,ru=A(()=>{Nn();my=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 Sy(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 r of Object.keys(e))ky.has(r)||t.push({path:`market.${r}`,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"||!xy.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 Ey(e={}){let t=await jc(e);if(!t||!Array.isArray(t.universe))throw new TypeError("Hyperliquid market metadata must contain universe");return Object.freeze(t.universe.map((r,n)=>{if(!r||typeof r.name!="string"||!r.name)throw new TypeError(`Hyperliquid market metadata universe[${n}].name is invalid`);return r.name}))}var xy,ky,nu,ou=A(()=>{Nn();eu();ru();xy=new Set(["1m","3m","5m","15m","30m","1h","2h","4h","8h","12h","1d"]),ky=new Set(["coin","interval"]);nu=Object.freeze({id:"hyperliquid",validateMarket:Sy,fetchBars:tu,listMarkets:Ey,prepareIntent(e){return Zc(e)}})});function vy(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 Ay.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 Mi(e){return typeof e!="string"?null:Iy.get(e)??null}function ji(e){let t=Mi(e);if(!t)throw new Error(`unknown strategy venue: ${String(e)}`);return t}var Ay,iu,Iy,wI,Hi=A(()=>{ou();Ay=Object.freeze(["id","validateMarket","prepareIntent"]);iu=[nu].map(vy),Iy=new Map(iu.map(e=>[e.id,e])),wI=Object.freeze([...iu])});import{createHash as _y}from"node:crypto";function Ne(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function ne(e){return typeof e=="number"&&Number.isFinite(e)}function fu(e){return Number.isInteger(e)&&e>0}function Ki(e){if(e==null||typeof e!="object"||Object.isFrozen(e))return e;if(Array.isArray(e)){for(let t of e)Ki(t);return Object.freeze(e)}for(let t of Object.keys(e))Ki(e[t]);return Object.freeze(e)}function Xi(e){if(Array.isArray(e))return e.map(Xi);if(e!=null&&typeof e=="object"){let t={};for(let r of Object.keys(e).sort())t[r]=Xi(e[r]);return t}return e}function T(e,t,r){e.push({path:t,message:r})}function ht(e,t,r,n){for(let o of Object.keys(e))t.has(o)||T(n,r?`${r}.${o}`:o,"unknown field is not allowed")}function bu(e,t,r,n){if(!ne(e)||!ne(t)||!ne(r)||!ne(n)||n<=0||e<t||e>r)return!1;let o=(e-t)/n;if(!Number.isFinite(o))return!1;let i=Math.round(o);return Math.abs(o-i)<=1e-9}function Gi(e,t,r,n){if(Ne(e)){if(ht(e,new Set(["param"]),t,n),typeof e.param!="string"||!e.param)return T(n,`${t}.param`,"must be a parameter name string"),null;if(!Object.prototype.hasOwnProperty.call(r,e.param))return T(n,`${t}.param`,`unknown parameter "${e.param}"`),null;let o=r[e.param];return!Ne(o)||![o.value,o.min,o.max,o.step].every(fu)?(T(n,`${t}.param`,"referenced period parameter value min max and step must be positive integers"),null):{param:e.param}}return fu(e)?e:(T(n,t,"must be a positive integer or {param}"),null)}function mu(e,t,r,n){return Ne(e)?(ht(e,new Set(["param"]),t,n),typeof e.param!="string"||!e.param?(T(n,`${t}.param`,"must be a parameter name string"),null):Object.prototype.hasOwnProperty.call(r,e.param)?{param:e.param}:(T(n,`${t}.param`,`unknown parameter "${e.param}"`),null)):ne(e)?e:(T(n,t,"must be a finite number or {param}"),null)}function $n(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 Ly(e){let t=new Map,r=n=>{let o=t.get(n)||0;if(o===1)return!0;if(o===2)return!1;t.set(n,1);let i=e.get(n);if(i){for(let s of $n(i))if(e.has(s)&&r(s))return!0}return t.set(n,2),!1};for(let n of e.keys())if(r(n))return!0;return!1}function Uy(e,t){if(!Ne(e))return T(t,"parameters","must be a plain object"),null;let r=Object.keys(e);if(r.length>lu)return T(t,"parameters",`too many parameters (max ${lu})`),null;let n={};for(let o of r){if(!hu.test(o)){T(t,`parameters.${o}`,"parameter name is malformed");continue}let i=e[o],s=`parameters.${o}`;if(!Ne(i)){T(t,s,"must be a plain object");continue}ht(i,au,s,t);for(let d of au)d in i||T(t,`${s}.${d}`,"required field is missing");let{value:a,min:c,max:u,step:l}=i;ne(c)||T(t,`${s}.min`,"must be a finite number"),ne(u)||T(t,`${s}.max`,"must be a finite number"),(!ne(l)||l<=0)&&T(t,`${s}.step`,"must be a positive finite number"),ne(a)||T(t,`${s}.value`,"must be a finite number"),ne(c)&&ne(u)&&c>u&&T(t,`${s}.min`,"min must be <= max"),ne(a)&&ne(c)&&ne(u)&&ne(l)&&l>0&&(bu(a,c,u,l)||T(t,`${s}.value`,"value must lie on the declared min/max/step grid")),n[o]={value:a,min:c,max:u,step:l}}return n}function By(e,t,r,n){let o=`nodes.${t}`;if(!Ne(e))return T(n,o,"must be a plain object"),null;if(typeof e.type!="string"||!uu[e.type])return T(n,`${o}.type`,"unknown or missing node type"),ht(e,qy,o,n),null;switch(ht(e,uu[e.type],o,n),(typeof e.id!="string"||!yu.test(e.id))&&T(n,`${o}.id`,"must be a 1-64 char id starting with alphanumeric"),e.type){case"input":return(typeof e.field!="string"||!Oy.has(e.field))&&T(n,`${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=mu(e.value,`${o}.value`,r,n);return{id:e.id,type:"constant",value:i}}case"indicator":{(typeof e.indicator!="string"||!Cy.has(e.indicator))&&T(n,`${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?T(n,`${o}.input`,"must be a node id string when provided"):s.input=e.input);let a=Gi(e.period,`${o}.period`,r,n);a!=null&&(s.period=a)}else typeof e.input!="string"||!e.input?T(n,`${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))T(n,`${o}.period`,"required field is missing");else{let a=Gi(e.period,`${o}.period`,r,n);a!=null&&(s.period=a)}if(i==="macd"){for(let a of["fastPeriod","slowPeriod","signalPeriod"])if(!(a in e))T(n,`${o}.${a}`,"required field is missing");else{let c=Gi(e[a],`${o}.${a}`,r,n);c!=null&&(s[a]=c)}"output"in e?Py.has(e.output)?s.output=e.output:T(n,`${o}.output`,"must be line|signal|histogram"):T(n,`${o}.output`,"required field is missing"),"period"in e&&T(n,`${o}.period`,"forbidden for macd"),"stdDev"in e&&T(n,`${o}.stdDev`,"forbidden for macd")}else if(i==="bollinger"){if(!("stdDev"in e))T(n,`${o}.stdDev`,"required field is missing");else{let a=mu(e.stdDev,`${o}.stdDev`,r,n);a!=null&&(typeof a=="number"&&a<=0?T(n,`${o}.stdDev`,"must be > 0"):s.stdDev=a)}"output"in e?$y.has(e.output)?s.output=e.output:T(n,`${o}.output`,"must be upper|middle|lower"):T(n,`${o}.output`,"required field is missing");for(let a of["fastPeriod","slowPeriod","signalPeriod"])a in e&&T(n,`${o}.${a}`,`forbidden for ${i}`)}else{"output"in e&&T(n,`${o}.output`,`forbidden for ${i}`),"stdDev"in e&&i!=="bollinger"&&T(n,`${o}.stdDev`,`forbidden for ${i}`);for(let a of["fastPeriod","slowPeriod","signalPeriod"])a in e&&T(n,`${o}.${a}`,`forbidden for ${i}`)}return s}case"compare":return(typeof e.op!="string"||!Ty.has(e.op))&&T(n,`${o}.op`,"must be gt|gte|lt|lte|eq"),(typeof e.left!="string"||!e.left)&&T(n,`${o}.left`,"must be a node id"),(typeof e.right!="string"||!e.right)&&T(n,`${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"||!Ry.has(e.op))&&T(n,`${o}.op`,"must be and|or|not"),!Array.isArray(e.inputs))return T(n,`${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?T(n,`${o}.inputs.${s}`,"must be a node id"):i.push(a)}return e.op==="not"?i.length!==1&&T(n,`${o}.inputs`,"not requires exactly one input"):(e.op==="and"||e.op==="or")&&i.length<2&&T(n,`${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"||!Ny.has(e.direction))&&T(n,`${o}.direction`,"must be above|below"),(typeof e.left!="string"||!e.left)&&T(n,`${o}.left`,"must be a node id"),(typeof e.right!="string"||!e.right)&&T(n,`${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 Fy(e,t,r){if(!Ne(e))return T(t,"risk","must be a plain object"),null;ht(e,cu,"risk",t);for(let p of cu)(!(p in e)||e[p]==null)&&T(t,`risk.${p}`,"required field is missing");let n={},o=e.maxLeverage;!ne(o)||o<=0||o>50?T(t,"risk.maxLeverage","must be a number > 0 and <= 50"):n.maxLeverage=o;let i=e.maxNotionalUsd;!ne(i)||i<=0?T(t,"risk.maxNotionalUsd","must be a number > 0"):n.maxNotionalUsd=i;let s=e.positionSizePct;!ne(s)||s<=0||s>100?T(t,"risk.positionSizePct","must be a number > 0 and <= 100"):n.positionSizePct=s;let a=e.stopLossPct;!ne(a)||a<=0||a>100?T(t,"risk.stopLossPct","must be a number > 0 and <= 100"):n.stopLossPct=a;let c=e.takeProfitPct;!ne(c)||c<=0||c>1e3?T(t,"risk.takeProfitPct","must be a number > 0 and <= 1000"):n.takeProfitPct=c;let u=e.cooldownBars;!Number.isInteger(u)||u<0||u>1e5?T(t,"risk.cooldownBars","must be an integer >= 0 and <= 100000"):n.cooldownBars=u;let l=e.maxDailyLossPct;!ne(l)||l<=0||l>100?T(t,"risk.maxDailyLossPct","must be a number > 0 and <= 100"):n.maxDailyLossPct=l;let d=e.expiresAt;return!Number.isInteger(d)||d<=0?T(t,"risk.expiresAt","must be an integer epoch milliseconds > 0"):(r.nowMs!==void 0&&(Number.isInteger(r.nowMs)?d<=r.nowMs&&T(t,"risk.expiresAt","must be strictly greater than nowMs"):T(t,"nowMs","must be an integer epoch milliseconds")),n.expiresAt=d),n}function Yi(e,t={}){let r=[];if(!Ne(e))return T(r,"","strategy must be a plain object"),{ok:!1,errors:r,strategy:null};ht(e,su,"",r);for(let d of su)(!(d in e)||e[d]==null)&&T(r,d,"required field is missing");e.version!==zi&&T(r,"version",`must be ${zi}`),(typeof e.id!="string"||!hu.test(e.id))&&T(r,"id","must match /^[a-z0-9][a-z0-9._-]{0,63}$/"),(typeof e.name!="string"||e.name.length===0||e.name.length>pu)&&T(r,"name",`must be a non-empty string max ${pu}`);let n=Mi(e.venue);n||T(r,"venue",`unknown strategy venue "${String(e.venue)}"`);let o=null;if(!n)Ne(e.market)||T(r,"market","must be a plain object");else{let d=n.validateMarket(e.market);if(!d||typeof d.ok!="boolean"||!Array.isArray(d.errors))T(r,"market",`venue ${n.id} returned an invalid market validation result`);else if(d.ok)o=d.market;else for(let p of d.errors)T(r,p.path,p.message)}let i=Uy(e.parameters,r),s=null,a=new Map;if(!Array.isArray(e.nodes))T(r,"nodes","must be an array");else if(e.nodes.length>du)T(r,"nodes",`too many nodes (max ${du})`);else{s=[];for(let d=0;d<e.nodes.length;d++){let p=By(e.nodes[d],d,i||{},r);p&&(typeof p.id=="string"&&yu.test(p.id)&&(a.has(p.id)?T(r,`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 $n(p))a.has(m)||T(r,f,`unknown node ref "${m}"`);if(p.type==="indicator"||p.type==="compare"||p.type==="cross")for(let m of $n(p)){let h=a.get(m);h&&Vi.has(h.type)&&T(r,f,`node ref "${m}" must be numeric`)}if(p.type==="logic")for(let m of $n(p)){let h=a.get(m);h&&!Vi.has(h.type)&&T(r,f,`node ref "${m}" must be boolean`)}}Ly(a)&&T(r,"nodes","graph contains a cycle")}let c=null;if(!Ne(e.rules))T(r,"rules","must be a plain object");else{ht(e.rules,Wi,"rules",r);for(let d of Wi)d in e.rules||T(r,`rules.${d}`,"required field is missing");c={};for(let d of Wi){let p=e.rules[d];if(p===null){c[d]=null;continue}if(typeof p!="string"||!p){T(r,`rules.${d}`,"must be a node id or null"),c[d]=p;continue}if(!a.has(p)){T(r,`rules.${d}`,`unknown node ref "${p}"`),c[d]=p;continue}let f=a.get(p);Vi.has(f.type)||T(r,`rules.${d}`,`rule must reference a boolean node, not ${f.type}`),c[d]=p}}let u=Fy(e.risk,r,t);if(r.length)return{ok:!1,errors:r,strategy:null};let l=Ki({version:zi,id:e.id,name:e.name,venue:n.id,market:o,parameters:i,nodes:s,rules:c,risk:u});return{ok:!0,errors:[],strategy:l}}function be(e,t={}){let r=Yi(e,t);if(!r.ok)throw new Gt(r.errors);return r.strategy}function Dy(e){let t=be(e);return JSON.stringify(Xi(t))}function zt(e){let t=Dy(e);return _y("sha256").update(t,"utf8").digest("hex")}function Pr(e,t){if(!Ne(e))throw new Gt([{path:"",message:"strategy must be a plain object"}]);if(!Ne(t))throw new Gt([{path:"overrides",message:"must be a plain object"}]);let r=be(e),n={};for(let[i,s]of Object.entries(r.parameters))n[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(n,i)){T(o,i,`unknown parameter "${i}"`);continue}let a=n[i];if(!ne(s)){T(o,i,"override must be a finite number");continue}if(!bu(s,a.min,a.max,a.step)){T(o,i,"override must lie on the declared min/max/step grid");continue}n[i]={...a,value:s}}if(o.length)throw new Gt(o);return be({version:r.version,id:r.id,name:r.name,venue:r.venue,market:{coin:r.market.coin,interval:r.market.interval},parameters:n,nodes:r.nodes.map(i=>{let s={...i};return Array.isArray(i.inputs)&&(s.inputs=[...i.inputs]),s}),rules:{...r.rules},risk:{...r.risk}})}var zi,hu,yu,Oy,Cy,Ty,Ry,Ny,Py,$y,Vi,su,au,Wi,cu,qy,uu,lu,du,pu,Gt,Ot=A(()=>{Hi();zi=1,hu=/^[a-z0-9][a-z0-9._-]{0,63}$/,yu=/^[A-Za-z0-9][A-Za-z0-9._-]{0,63}$/,Oy=new Set(["open","high","low","close","volume","fundingRate","openInterest","premium","oiDelta","bookImbalance"]),Cy=new Set(["sma","ema","rsi","macd","bollinger","atr"]),Ty=new Set(["gt","gte","lt","lte","eq"]),Ry=new Set(["and","or","not"]),Ny=new Set(["above","below"]),Py=new Set(["line","signal","histogram"]),$y=new Set(["upper","middle","lower"]),Vi=new Set(["compare","logic","cross"]),su=new Set(["version","id","name","venue","market","parameters","nodes","rules","risk"]),au=new Set(["value","min","max","step"]),Wi=new Set(["entryLong","entryShort","exitLong","exitShort"]),cu=new Set(["maxLeverage","maxNotionalUsd","positionSizePct","stopLossPct","takeProfitPct","cooldownBars","maxDailyLossPct","expiresAt"]),qy=new Set(["id","type"]),uu={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"])},lu=16,du=128,pu=100,Gt=class extends Error{constructor(t){let r=t.map(n=>`${n.path}: ${n.message}`);super(`invalid strategy (${t.length} error${t.length===1?"":"s"}): ${r.join("; ")}`),this.name="StrategyValidationError",this.errors=t}}});function $r(e){if(!Array.isArray(e))throw new TypeError("values must be an array");for(let t=0;t<e.length;t++){let r=e[t];if(typeof r!="number"||!Number.isFinite(r))throw new TypeError(`values[${t}] must be a finite number`)}}function yt(e){if(!Number.isInteger(e)||e<=0)throw new TypeError("period must be a positive integer")}function My(e){if(!Array.isArray(e))throw new TypeError("bars must be an array");for(let t=0;t<e.length;t++){let r=e[t];if(r==null||typeof r!="object")throw new TypeError(`bars[${t}] must be an object`);for(let n of["o","h","l","c"]){let o=r[n];if(typeof o!="number"||!Number.isFinite(o))throw new TypeError(`bars[${t}].${n} must be a finite number`)}if(r.h<r.l)throw new TypeError(`bars[${t}] high must be >= low`)}}function wu(e,t){$r(e),yt(t);let r=new Array(e.length).fill(null);if(e.length<t)return r;let n=0;for(let o=0;o<e.length;o++)n+=e[o],o>=t&&(n-=e[o-t]),o>=t-1&&(r[o]=n/t);return r}function qn(e,t){$r(e),yt(t);let r=new Array(e.length).fill(null);if(e.length<t)return r;let n=0;for(let s=0;s<t;s++)n+=e[s];let o=n/t;r[t-1]=o;let i=2/(t+1);for(let s=t;s<e.length;s++)o=i*e[s]+(1-i)*o,r[s]=o;return r}function xu(e,t){$r(e),yt(t);let r=new Array(e.length).fill(null);if(e.length<=t)return r;let n=0,o=0;for(let a=1;a<=t;a++){let c=e[a]-e[a-1];c>=0?n+=c:o-=c}let i=n/t,s=o/t;r[t]=gu(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,r[a]=gu(i,s)}return r}function gu(e,t){return e===0&&t===0?50:t===0?100:e===0?0:100-100/(1+e/t)}function ku(e,t={}){$r(e);let r=t.fastPeriod,n=t.slowPeriod,o=t.signalPeriod;if(yt(r),yt(n),yt(o),r>=n)throw new TypeError("fastPeriod must be < slowPeriod");let i=qn(e,r),s=qn(e,n),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 h=0;h<o;h++)d+=a[l[h]];let p=d/o,f=l[o-1];c[f]=p,u[f]=a[f]-p;let m=2/(o+1);for(let h=o;h<l.length;h++){let y=l[h];p=m*a[y]+(1-m)*p,c[y]=p,u[y]=a[y]-p}}return{line:a,signal:c,histogram:u}}function Su(e,t={}){$r(e);let r=t.period,n=t.stdDev;if(yt(r),typeof n!="number"||!Number.isFinite(n)||n<=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<r)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>=r){let d=e[u-r];a-=d,c-=d*d}if(u>=r-1){let d=a/r,p=c/r-d*d;p<0&&p>-1e-12&&(p=0);let f=Math.sqrt(p);o[u]=d,i[u]=d+n*f,s[u]=d-n*f}}return{upper:i,middle:o,lower:s}}function Eu(e,t){My(e),yt(t);let r=new Array(e.length).fill(null);if(e.length<t)return r;let n=new Array(e.length);for(let s=0;s<e.length;s++){let a=e[s];if(s===0)n[s]=a.h-a.l;else{let c=e[s-1].c;n[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+=n[s];let i=o/t;r[t-1]=i;for(let s=t;s<e.length;s++)i=(i*(t-1)+n[s])/t,r[s]=i;return r}var Au=A(()=>{});import{createHash as jy}from"node:crypto";var Ji,Hy,zy,Vy,vu,Iu=A(()=>{Ji=3,Hy="7477966facc4ef928a94e6221c8fd238eef4fcbeec46b96ae1b89178e13c2d5f",zy="68f5b412a9975f04024cf9b9b6209b4bccedd52f176e95f34f786b3f53479c6a",Vy="967fd45ecddd0d59ac0f662fe92ea813c32620ba751f249b4ace6cb6b809fb5e",vu=jy("sha256").update(JSON.stringify({version:Ji,compilerSourceHash:Hy,indicatorsSourceHash:zy,schemaSourceHash:Vy})).digest("hex")});function _e(e){return typeof e=="number"&&Number.isFinite(e)}function Ky(e){let t=new Map(e.map(a=>[a.id,a])),r=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[]}},n=new Map,o=new Map;for(let a of e)n.set(a.id,0),o.set(a.id,[]);for(let a of e)for(let c of r(a))t.has(c)&&(o.get(c).push(a.id),n.set(a.id,n.get(a.id)+1));let i=[];for(let[a,c]of n)c===0&&i.push(a);let s=[];for(;i.length;){let a=i.shift();s.push(a);for(let c of o.get(a))n.set(c,n.get(c)-1),n.get(c)===0&&i.push(c)}if(s.length!==e.length)throw new Error("strategy graph is cyclic");return s}function Kt(e,t){return e!=null&&typeof e=="object"&&"param"in e?t[e.param].value:e}function Xy(e,t,r){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 n=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(!_e(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",u],["c",l],["v",d]])if(!_e(f))throw new TypeError(`bars[${o}].${p} must be a finite number`);for(let[p,f]of[["o",a],["h",c],["l",u],["c",l]])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,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(n!=null){if(!(s>n))throw new TypeError("bars t must be strictly increasing");if(s-n!==Gy[r])throw new TypeError(`bars t must match ${r} cadence`)}if(n=s,"fundingRate"in i&&i.fundingRate!=null&&!_e(i.fundingRate))throw new TypeError(`bars[${o}].fundingRate must be finite when present`);if("openInterest"in i&&i.openInterest!=null){if(!_e(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&&!_e(i[p]))throw new TypeError(`bars[${o}].${p} must be finite when present`);if("bookImbalance"in i&&i.bookImbalance!=null){if(!_e(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 Rt(e,t,r,n,o,i){if(i.has(e))return i.get(e);let s=t.get(e),a;switch(s.type){case"input":{let c=Wy[s.field];a=new Array(o+1);for(let u=0;u<=o;u++){let l=n[u][c];a[u]=l===void 0?null:l}break}case"constant":{let c=Kt(s.value,r);a=new Array(o+1).fill(c);break}case"indicator":{let c=s.period!=null?Kt(s.period,r):void 0;if(s.indicator==="atr"){let d=[];for(let p=0;p<=o;p++){let f=n[p];d.push({o:f.o,h:f.h,l:f.l,c:f.c})}a=Eu(d,c);break}let l=Rt(s.input,t,r,n,o,i).map((d,p)=>{if(d==null||!_e(d))throw new TypeError(`indicator input ${s.input} has non-finite value at ${p}`);return d});if(s.indicator==="sma")a=wu(l,c);else if(s.indicator==="ema")a=qn(l,c);else if(s.indicator==="rsi")a=xu(l,c);else if(s.indicator==="macd")a=ku(l,{fastPeriod:Kt(s.fastPeriod,r),slowPeriod:Kt(s.slowPeriod,r),signalPeriod:Kt(s.signalPeriod,r)})[s.output];else if(s.indicator==="bollinger")a=Su(l,{period:c,stdDev:Kt(s.stdDev,r)})[s.output];else throw new Error(`unsupported indicator ${s.indicator}`);break}case"compare":{let c=Rt(s.left,t,r,n,o,i),u=Rt(s.right,t,r,n,o,i);a=new Array(o+1);for(let l=0;l<=o;l++){let d=c[l],p=u[l];if(d==null||p==null||!_e(d)||!_e(p)){a[l]=!1;continue}switch(s.op){case"gt":a[l]=d>p;break;case"gte":a[l]=d>=p;break;case"lt":a[l]=d<p;break;case"lte":a[l]=d<=p;break;case"eq":a[l]=d===p;break;default:a[l]=!1}}break}case"logic":{let c=s.inputs.map(u=>Rt(u,t,r,n,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=Rt(s.left,t,r,n,o,i),u=Rt(s.right,t,r,n,o,i);a=new Array(o+1),a[0]=!1;for(let l=1;l<=o;l++){let d=c[l-1],p=u[l-1],f=c[l],m=u[l];if(d==null||p==null||f==null||m==null||!_e(d)||!_e(p)||!_e(f)||!_e(m)){a[l]=!1;continue}s.direction==="above"?a[l]=d<=p&&f>m:a[l]=d>=p&&f<m}break}default:throw new Error(`unknown node type ${s.type}`)}return i.set(e,a),a}function ge(e,t={}){let r=be(e);t&&Object.keys(t).length&&(r=Pr(r,t));let n=new Map(r.nodes.map(f=>[f.id,f])),o=Object.freeze(Ky(r.nodes)),i=r.parameters,s=new Set(r.nodes.filter(f=>f.type==="input").map(f=>f.field));if(r.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=zt(r);function u(f,m){let h={};for(let x of o){let E=f.get(x);h[x]=E[m]}let y=x=>x!=null&&h[x]===!0;return{values:h,signals:{entryLong:y(r.rules.entryLong),entryShort:y(r.rules.entryShort),exitLong:y(r.rules.exitLong),exitShort:y(r.rules.exitShort)}}}function l(f,m){Xy(f,m,r.market.interval);let h=new Map;for(let y of o)Rt(y,n,i,f,m,h);return h}function d(f,m){return u(l(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=l(f,m);return Object.freeze(f.map((y,x)=>Object.freeze(u(h,x))))}return Object.freeze({strategy:r,strategyHash:c,compilerVersion:Rr,compilerHash:Ct,requiredSeries:a,nodeOrder:o,evaluate:d,evaluateAll:p})}var Rr,Ct,Wy,Gy,Tt=A(()=>{Ot();Au();Iu();Rr=Ji,Ct=vu,Wy=Object.freeze({open:"o",high:"h",low:"l",close:"c",volume:"v",fundingRate:"fundingRate",openInterest:"openInterest",premium:"premium",oiDelta:"oiDelta",bookImbalance:"bookImbalance"}),Gy=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 Yy}from"node:crypto";function Qy(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function Je(e){return typeof e=="number"&&Number.isFinite(e)}function Qi(e){if(e==null||typeof e!="object"||Object.isFrozen(e))return e;if(Array.isArray(e)){for(let t of e)Qi(t);return Object.freeze(e)}for(let t of Object.keys(e))Qi(e[t]);return Object.freeze(e)}function Ln(e){if(Array.isArray(e))return e.map(Ln);if(e!=null&&typeof e=="object"){let t={};for(let r of Object.keys(e).sort())t[r]=Ln(e[r]);return t}return e}function Zi(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((r,n)=>Zi(r,`${t}[${n}]`));return}for(let[r,n]of Object.entries(e))Zi(n,`${t}.${r}`)}}function Ou(e){if(!Array.isArray(e)||e.length===0)throw new TypeError("bars must be a non-empty array");let t=null;for(let r=0;r<e.length;r++){let n=e[r];if(n==null||typeof n!="object"||Array.isArray(n))throw new TypeError(`bars[${r}] must be an object`);let{t:o,o:i,h:s,l:a,c,v:u}=n;if(!Je(o))throw new TypeError(`bars[${r}].t must be finite`);for(let[l,d]of[["o",i],["h",s],["l",a],["c",c],["v",u]])if(!Je(d))throw new TypeError(`bars[${r}].${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[${r}].${l} price must be positive`);if(u<0)throw new TypeError(`bars[${r}].v volume must be non-negative`);if(s<Math.max(i,c,a))throw new TypeError(`bars[${r}] high must be >= max(open, close, low)`);if(a>Math.min(i,c,s))throw new TypeError(`bars[${r}] 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 n&&n.fundingRate!=null&&!Je(n.fundingRate))throw new TypeError(`bars[${r}].fundingRate must be finite when present`);if("fundingPaymentRate"in n&&n.fundingPaymentRate!=null&&!Je(n.fundingPaymentRate))throw new TypeError(`bars[${r}].fundingPaymentRate must be finite when present`);if("openInterest"in n&&n.openInterest!=null&&!Je(n.openInterest))throw new TypeError(`bars[${r}].openInterest must be finite when present`)}}function Cr(e){if(!Array.isArray(e))throw new TypeError("bars must be an array");return e.length>0&&Ou(e),Yy("sha256").update(JSON.stringify(Ln(e)),"utf8").digest("hex")}function Zy(e){if(e==null&&(e={}),!Qy(e))throw new TypeError("options must be a plain object");let t={...Jy},r=new Set(["initialEquityUsd","takerFeeBps","builderFeeBps","slippageBps","latencyBars","maxVolumeParticipationPct","nowMs"]);for(let n of Object.keys(e))if(!r.has(n))throw new TypeError(`unknown option "${n}"`);if("initialEquityUsd"in e){if(!Je(e.initialEquityUsd)||e.initialEquityUsd<=0)throw new TypeError("initialEquityUsd must be a positive finite number");t.initialEquityUsd=e.initialEquityUsd}for(let n of["takerFeeBps","builderFeeBps","slippageBps"])if(n in e){let o=e[n];if(!Je(o)||o<0)throw new TypeError(`${n} must be a finite number >= 0`);if(n==="slippageBps"?o>=1e4:o>1e4)throw new TypeError(`${n} exceeds its safe basis-point bound`);t[n]=o}if("latencyBars"in e){let n=e.latencyBars;if(!Number.isInteger(n)||n<1)throw new TypeError("latencyBars must be an integer >= 1");t.latencyBars=n}if("maxVolumeParticipationPct"in e){let n=e.maxVolumeParticipationPct;if(!Je(n)||n<=0||n>100)throw new TypeError("maxVolumeParticipationPct must be in (0,100]");t.maxVolumeParticipationPct=n}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 Un(e){return e/1e4}function eb(e,t,r){let n=Un(r);return t==="long"?e*(1+n):e*(1-n)}function tb(e,t,r){let n=Un(r);return t==="long"?e*(1-n):e*(1+n)}function _u(e,t,r){let n=Math.abs(e)*Un(t),o=Math.abs(e)*Un(r);return{taker:n,builder:o,total:n+o}}function rb(e,t){let r=e*(t.positionSizePct/100)*t.maxLeverage;return Math.min(r,t.maxNotionalUsd)}function nb(e,t,r){let n=r/100;return t==="long"?e*(1-n):e*(1+n)}function ob(e,t,r){let n=r/100;return t==="long"?e*(1+n):e*(1-n)}function ib(e,t,r,n){if(!(r>0))return t==="long"?0:Number.POSITIVE_INFINITY;let o=Math.min(.99,1/(2*r)+n/1e4);return t==="long"?e*(1-1/r)/(1-o):e*(1+1/r)/(1+o)}function sb(e,t,r){return t==="long"?e.l<=r:e.h>=r}function ab(e,t,r){return t==="long"?e.h>=r:e.l<=r}function cb(e,t,r){return t==="long"?e.l<=r:e.h>=r}function qr(e,t){for(let r of e.requiredSeries)if(ub.includes(r)&&!t.every(n=>Je(n?.[r])))throw new Error(`strategy required series is absent: ${r}`)}function lb(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 r=0;for(let s of t)r+=s;let n=r/t.length,o=0;for(let s of t)o+=(s-n)**2;let i=Math.sqrt(o/(t.length-1));return i>0?n/i:0}function db(e){let t=-1/0,r=0;for(let n of e){let o=n.equity;if(o>t&&(t=o),t>0){let i=(t-o)/t*100;i>r&&(r=i)}}return r}function mt(e,t,r={}){let n=Zy(r);Ou(t);let o=Cr(t);n.nowMs!==void 0&&be(e,{nowMs:n.nowMs});let i=ge(e);if(qr(i,t),n.nowMs!==void 0&&i.strategy.risk.expiresAt<=n.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=n.latencyBars,u=n.slippageBps,l=n.takerFeeBps,d=n.builderFeeBps,p=n.initialEquityUsd,f=0,m=0,h=0,y=0,x=0,E=[],_=[],w=[],O=[],v=[],g=null,b=0,S=null,k=p,N=!1,I=0,P=0,L=[],H=new Array(t.length).fill(0);function X(R){L.push(R)}function F(R){let M=t[R].v*(n.maxVolumeParticipationPct/100);return Math.max(0,M-H[R])}function z(R){if(!g)return p;let M=g.side==="long"?(R-g.entryPrice)*g.qty:(g.entryPrice-R)*g.qty;return p+M}function ie(R,M,$){let ee=$.o,V=rb(p,s);if(!(V>0)||!(ee>0))return;let te=eb(ee,M,u),J=V/te,se=F(R),kr=te*se;if(J>se){w.push({kind:"entry",barIndex:R,time:$.t,side:M,requestedNotionalUsd:V,maxFillNotionalUsd:kr,reason:"volume_participation"});return}H[R]+=J;let Ke=Math.abs(te-ee)*J,ot=_u(V,l,d);p-=ot.total,f+=ot.taker,m+=ot.builder,y+=Ke,x+=V,g={lifecycleEpoch:++P,side:M,entryBarIndex:R,entryReferencePrice:ee,entryPrice:te,qty:J,notionalUsd:V,stop:nb(te,M,s.stopLossPct),take:ob(te,M,s.takeProfitPct),liq:ib(te,M,s.maxLeverage,l+d),entryFees:ot.taker,entryBuilderFees:ot.builder,entrySlippageUsd:Ke,fundingAccrued:0}}function K(R,M,$,ee){if(!g)return!1;let V=g.side,te=M,J=te;$!=="liquidation"&&ee&&(J=tb(te,V,u));let se=g.qty,kr=se*J;if($!=="liquidation"){let Ec=F(R),e0=J*Ec;if(se>Ec)return w.push({kind:"exit",barIndex:R,time:t[R].t,side:V,requestedNotionalUsd:kr,maxFillNotionalUsd:e0,reason:"volume_participation",triggerReason:$}),!1;H[R]+=se}let Ke=_u(kr,l,d),ot=$==="liquidation"?0:Math.abs(J-te)*se,Sr,wi;V==="long"?(Sr=(te-g.entryReferencePrice)*se,wi=(J-g.entryPrice)*se):(Sr=(g.entryReferencePrice-te)*se,wi=(g.entryPrice-J)*se),p+=wi,p-=Ke.total,f+=Ke.taker,m+=Ke.builder,y+=ot,x+=kr;let Zh={side:V,entryBarIndex:g.entryBarIndex,entryTime:t[g.entryBarIndex].t,entryPrice:g.entryPrice,exitBarIndex:R,exitTime:t[R].t,exitPrice:J,exitReason:$,qty:se,notionalUsd:g.notionalUsd,grossPnlUsd:Sr,feesUsd:g.entryFees+Ke.taker,builderFeesUsd:g.entryBuilderFees+Ke.builder,fundingUsd:g.fundingAccrued,slippageUsd:g.entrySlippageUsd+ot,netPnlUsd:Sr-(g.entryFees+Ke.taker+g.entryBuilderFees+Ke.builder)-g.fundingAccrued-(g.entrySlippageUsd+ot)};return E.push(Zh),$==="liquidation"&&_.push({barIndex:R,time:t[R].t,side:V,price:J,tradeIndex:E.length-1}),g=null,P+=1,I=R+1+(s.cooldownBars||0),!0}function Ge(R,M,$,ee){let V=R+1;if(V>=t.length)return;L.some(J=>J.kind==="exit"&&J.side===M&&J.fillBar===V&&J.epoch===ee)||X({kind:"exit",side:M,signalBar:R,fillBar:V,reason:$,epoch:ee})}function An(R){let M=L.filter($=>$.fillBar===R);for(let $=L.length-1;$>=0;$--)L[$].fillBar===R&&L.splice($,1);M.sort(($,ee)=>{let V=te=>te.kind==="exit"?0:1;return V($)-V(ee)});for(let $ of M)if($.kind==="exit"){if(!g||g.side!==$.side||g.lifecycleEpoch!==$.epoch)continue;let ee=$.reason||"rule";K(R,t[R].o,ee,!0)||Ge(R,$.side,ee,$.epoch)}else if($.kind==="entry"){if(g||$.epoch!==P||R<I)continue;ie(R,$.side,t[R])}}function vn(R){if(!g)return;let M=t[R],$=M.fundingPaymentRate;if($==null||!Je($)||$===0)return;let ee=Math.abs(g.qty*M.c),V=$*ee;g.side==="long"?(p-=V,g.fundingAccrued+=V,h+=V):(p+=V,g.fundingAccrued-=V,h-=V)}function In(R){if(!g)return;let M=t[R].o;(g.side==="long"?M<=g.liq:M>=g.liq)&&K(R,M,"liquidation",!1)}function gc(R){if(!g)return;let M=t[R],$=g.side,ee=cb(M,$,g.liq),V=sb(M,$,g.stop),te=ab(M,$,g.take),J=se=>$==="long"?Math.min(se,M.o):Math.max(se,M.o);if(ee){K(R,J(g.liq),"liquidation",!1);return}if(V&&te){K(R,J(g.stop),"stop_loss",!0)||Ge(R,$,"stop_loss",g.lifecycleEpoch);return}if(V){K(R,J(g.stop),"stop_loss",!0)||Ge(R,$,"stop_loss",g.lifecycleEpoch);return}te&&(K(R,g.take,"take_profit",!0)||Ge(R,$,"take_profit",g.lifecycleEpoch))}for(let R=0;R<t.length;R++){let M=Math.floor(t[R].t/864e5);M!==S&&(S=M,k=z(t[R].o),N=!1),In(R),An(R),gc(R),vn(R),!N&&z(t[R].c)<=k*(1-s.maxDailyLossPct/100)&&(N=!0,O.push({type:"daily_loss_limit",barIndex:R,time:t[R].t,message:"daily loss limit reached; new entries blocked for UTC day"}));let $=a[R].signals,ee=R+c;if(g)(g.side==="long"&&$.exitLong===!0||g.side==="short"&&$.exitShort===!0)&&ee<t.length&&(L.some(se=>se.kind==="exit"&&se.side===g.side&&se.fillBar===ee&&se.epoch===g.lifecycleEpoch)||X({kind:"exit",side:g.side,signalBar:R,fillBar:ee,reason:"rule",epoch:g.lifecycleEpoch}));else{let te=$.entryLong===!0,J=$.entryShort===!0;te&&J?O.push({type:"conflicting_entry_signals",barIndex:R,time:t[R].t,message:"conflicting entry signals; no position opened"}):!N&&(te||J)&&ee<t.length&&R>=I&&X({kind:"entry",side:te?"long":"short",signalBar:R,fillBar:ee,epoch:P})}let V=p;g&&(b+=1,V=z(t[R].c)),v.push({barIndex:R,time:t[R].t,equity:V,positionSide:g?g.side:null})}let wc=null;if(g){let R=t.length-1;if(K(R,t[R].c,"end_of_data",!0))v[R]={barIndex:R,time:t[R].t,equity:p,positionSide:null};else{let $=z(t[R].c);wc={side:g.side,entryBarIndex:g.entryBarIndex,entryTime:t[g.entryBarIndex].t,entryPrice:g.entryPrice,qty:g.qty,notionalUsd:g.notionalUsd,markPrice:t[R].c,markedEquityUsd:$},O.push({type:"open_position_at_end",barIndex:R,time:t[R].t,message:"end-of-data exit missed; position remains open and marked"})}}let xc=(g?z(t[t.length-1].c):p)-n.initialEquityUsd,Xh=xc/n.initialEquityUsd*100,kc=0,hi=0,yi=0;for(let R of E)R.netPnlUsd>0?(kc+=1,hi+=R.netPnlUsd):R.netPnlUsd<0&&(yi+=-R.netPnlUsd);let bi=E.length,Yh=bi===0?0:kc/bi,gi=0;yi>0?gi=hi/yi:hi>0&&(gi=1e12);let Jh={netPnlUsd:xc,netPnlPct:Xh,maxDrawdownPct:db(v),winRate:Yh,profitFactor:gi,tradeCount:bi,sharpe:lb(v),turnoverUsd:x,exposurePct:b/t.length*100},Qh={initialEquityUsd:n.initialEquityUsd,takerFeeBps:n.takerFeeBps,builderFeeBps:n.builderFeeBps,slippageBps:n.slippageBps,latencyBars:n.latencyBars,maxVolumeParticipationPct:n.maxVolumeParticipationPct},Sc={barsHash:o,strategyHash:i.strategyHash,compilerHash:Ct,compilerVersion:Rr,config:Qh,trades:E,equityCurve:v,metrics:Jh,costs:{feesUsd:f,builderFeesUsd:m,fundingUsd:h,slippageUsd:y},liquidations:_,missedFills:w,openPositionAtEnd:wc,flags:O};return Zi(Sc),Qi(Ln(Sc))}var Jy,ub,Pn=A(()=>{Tt();Ot();Jy=Object.freeze({initialEquityUsd:1e4,takerFeeBps:3.5,builderFeeBps:2,slippageBps:2,latencyBars:1,maxVolumeParticipationPct:100});ub=Object.freeze(["fundingRate","openInterest","premium","oiDelta","bookImbalance"])});import{createHash as pb}from"node:crypto";function xb(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function es(e){if(e==null||typeof e!="object"||Object.isFrozen(e))return e;if(Array.isArray(e)){for(let t of e)es(t);return Object.freeze(e)}for(let t of Object.keys(e))es(e[t]);return Object.freeze(e)}function kb(e){return String(e).trim().replace(/\s+/g," ")}function Sb(e){let t=e.match(/\b(long|short)\b/i);return t?t[1].toLowerCase():null}function Eb(e){for(let r of mb)if(new RegExp(`\\b${r}\\b`,"i").test(e))return r;let t=e.match(/\b([A-Z][A-Z0-9]{1,11})\b/);return t?t[1]:null}function Ab(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 r=t[1].toLowerCase();return fb.has(r)?r:null}function vb(e){let t={...yb},r=e.match(/stop\s*loss\s*(\d+(?:\.\d+)?)\s*%?/i);r&&(t.stopLossPct=Number(r[1]));let n=e.match(/take\s*profit\s*(\d+(?:\.\d+)?)\s*%?/i);n&&(t.takeProfitPct=Number(n[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 Ib(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(r=>(e.match(r)??[]).length>1)}function _b(e){let t=pb("sha256").update(e,"utf8").digest("hex").slice(0,10),r=e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").slice(0,40),o=`${r.length?r:"draft"}-${t}`.replace(/[^a-z0-9._-]/g,"").slice(0,64);return/^[a-z0-9]/.test(o)?o:`d${o}`.slice(0,64)}function Ob(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 r=Number(t[1]),n=t[2].toLowerCase(),o=Number(t[3]);if(!(r>0)||!(o>0)||r===o)return null;let i=/\b(exit\s+on\s+reverse|reverse\s+exit)\b/i.test(e);return{kind:"ema_cross",fast:r,slow:o,direction:n,reverse:i}}function Cb(e){let t=e.match(/\brsi\s*(\d+)\s*(above|below)\s*(-?\d+(?:\.\d+)?)/i);if(!t)return null;let r=Number(t[3]);return!Number.isFinite(r)||r<=0||r>=100?null:{kind:"rsi",period:Number(t[1]),op:t[2].toLowerCase(),threshold:r}}function Tb(e){let t=e.match(/\bfunding\s*rate\s*(above|below)\s*(-?\d+(?:\.\d+)?)(%?)(?=\s|,|$)/i);if(!t)return null;let r=Number(t[2]);return t[3]==="%"&&(r=r/100),{kind:"funding",op:t[1].toLowerCase(),threshold:r}}function Rb(e){let t=e.match(/\bopen\s*interest\s*(above|below)\s*(-?\d+(?:\.\d+)?)(?=\s|,|$)/i);if(!t)return null;let r=Number(t[2]);return!Number.isFinite(r)||r<0?null:{kind:"open_interest",op:t[1].toLowerCase(),threshold:r}}function Nb(e){let t=e.match(/\bpremium\s*(above|below)\s*(-?\d+(?:\.\d+)?)(%?)(?=\s|,|$)/i);if(!t)return null;let r=Number(t[2]);return Number.isFinite(r)?(t[3]==="%"&&(r=r/100),{kind:"premium",op:t[1].toLowerCase(),threshold:r}):null}function Pb(e){let t=e.match(/\boi\s*delta\s*(above|below)\s*(-?\d+(?:\.\d+)?)(?=\s|,|$)/i);if(!t)return null;let r=Number(t[2]);return Number.isFinite(r)?{kind:"oi_delta",op:t[1].toLowerCase(),threshold:r}:null}function $b(e){let t=e.match(/\bbook\s*imbalance\s*(above|below)\s*(-?\d+(?:\.\d+)?)(?=\s|,|$)/i);if(!t)return null;let r=Number(t[2]);return!Number.isFinite(r)||r<-1||r>1?null:{kind:"book_imbalance",op:t[1].toLowerCase(),threshold:r}}function qb(e,t){let r=e.replace(/^(long|short)\s+[A-Z][A-Z0-9]{1,11}\s+when\s+/i,"");if(r===e)return!1;t.kind==="ema_cross"?r=r.replace(/^ema\s*\d+\s*cross(?:es)?\s*(?:above|below)\s*ema\s*\d+\b/i,""):t.kind==="rsi"?r=r.replace(/^rsi\s*\d+\s*(?:above|below)\s*\d+(?:\.\d+)?\b/i,""):t.kind==="open_interest"?r=r.replace(/^open\s*interest\s*(?:above|below)\s*-?\d+(?:\.\d+)?(?=\s|,|$)/i,""):t.kind==="premium"?r=r.replace(/^premium\s*(?:above|below)\s*-?\d+(?:\.\d+)?%?(?=\s|,|$)/i,""):t.kind==="oi_delta"?r=r.replace(/^oi\s*delta\s*(?:above|below)\s*-?\d+(?:\.\d+)?(?=\s|,|$)/i,""):t.kind==="book_imbalance"?r=r.replace(/^book\s*imbalance\s*(?:above|below)\s*-?\d+(?:\.\d+)?(?=\s|,|$)/i,""):r=r.replace(/^funding\s*rate\s*(?:above|below)\s*-?\d+(?:\.\d+)?%?(?=\s|,|$)/i,"");let n=[/(?:,\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"&&n.push(/(?:,\s*)?\b(?:exit\s+on\s+reverse|reverse\s+exit)\b/gi);for(let o of n)r=r.replace(o,"");return r.replace(/[\s,;]+/g,"")===""}function Cu(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 Lb({side:e,coin:t,interval:r,risk:n,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:r},parameters:{ema_left_period:Cu(a.fast),ema_right_period:Cu(a.slow)},nodes:c,rules:u,risk:{...n,expiresAt:o}}}function Ub({side:e,coin:t,interval:r,risk:n,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:r},parameters:{},nodes:c,rules:{entryLong:e==="long"?"sig":null,entryShort:e==="short"?"sig":null,exitLong:null,exitShort:null},risk:{...n,expiresAt:o}}}function Bb({side:e,coin:t,interval:r,risk:n,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:r},parameters:{},nodes:c,rules:{entryLong:e==="long"?"sig":null,entryShort:e==="short"?"sig":null,exitLong:null,exitShort:null},risk:{...n,expiresAt:o}}}function Fb({side:e,coin:t,interval:r,risk:n,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:r},parameters:{},nodes:c,rules:{entryLong:e==="long"?"sig":null,entryShort:e==="short"?"sig":null,exitLong:null,exitShort:null},risk:{...n,expiresAt:o}}}function Mb({side:e,coin:t,interval:r,risk:n,expiresAt:o,id:i,name:s,spec:a}){let u=[{id:"sig_input",type:"input",field:Db[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:r},parameters:{},nodes:u,rules:{entryLong:e==="long"?"sig":null,entryShort:e==="short"?"sig":null,exitLong:null,exitShort:null},risk:{...n,expiresAt:o}}}function Tu(e,t={}){if(typeof e!="string")throw new le("prompt must be a string");if(e.length>1e3)throw new le("prompt length must be <= 1000");if(!xb(t))throw new le("options must be a plain object");if(!Number.isInteger(t.nowMs))throw new le("options.nowMs is required integer epoch ms");let r=t.nowMs,n=wb;if("expiresInMs"in t){if(!Number.isInteger(t.expiresInMs))throw new le("expiresInMs must be an integer");if(n=t.expiresInMs,n<bb||n>gb)throw new le("expiresInMs must be between 1h and 30d")}if(hb.test(e))throw new le(`prompt appears to contain secrets and is rejected. ${Xt}`);let o=kb(e);if(!o)throw new le(`empty prompt. ${Xt}`);if(Ib(o))throw new le(`duplicate interval or risk clause. ${Xt}`);let i=Sb(o),s=Eb(o),a=Ab(o);if(!i||!s||!a)throw new le(`could not parse side/coin/interval. ${Xt}`);let c=vb(o);if(!(c.maxLeverage>0)||c.maxLeverage>50)throw new le("leverage out of range");if(!(c.positionSizePct>0)||c.positionSizePct>100)throw new le("position size out of range");let u=r+n,l=_b(o),d=`Draft ${s} ${i}`.slice(0,100),p=Ob(o),f=Cb(o),m=Tb(o),h=Rb(o),y=Nb(o),x=Pb(o),E=$b(o),_=[p,f,m,h,y,x,E].filter(Boolean);if(_.length!==1)throw new le(`unsupported or ambiguous prompt. ${Xt}`);if(!qb(o,_[0]))throw new le(`unsupported or ambiguous prompt. ${Xt}`);let w,O=_[0],v={side:i,coin:s,interval:a,risk:c,expiresAt:u,id:l,name:d,spec:O};O.kind==="ema_cross"?w=Lb(v):O.kind==="rsi"?w=Ub(v):O.kind==="open_interest"?w=Fb(v):O.kind==="funding"?w=Bb(v):w=Mb(v);let g=Yi(w,{nowMs:r});if(!g.ok)throw new le(`draft failed validation: ${g.errors.map(b=>b.message).join("; ")}`);return es(be(w,{nowMs:r}))}var le,fb,mb,hb,Xt,yb,bb,gb,wb,Db,Ru=A(()=>{Ot();le=class extends Error{constructor(t){super(t),this.name="StrategyDraftError"}},fb=new Set(["1m","3m","5m","15m","30m","1h","2h","4h","8h","12h","1d"]),mb=new Set(["BTC","ETH","SOL","HYPE"]),hb=/\b(mnemonic|private\s*key|privkey|seed\s*phrase|seed\b|api[_-]?key|secret\s*key|wallet\s*key|passphrase)\b/i,Xt="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.",yb=Object.freeze({maxLeverage:1,maxNotionalUsd:100,positionSizePct:5,stopLossPct:2,takeProfitPct:4,cooldownBars:1,maxDailyLossPct:3}),bb=36e5,gb=30*864e5,wb=864e5;Db=Object.freeze({funding:"fundingRate",open_interest:"openInterest",premium:"premium",oi_delta:"oiDelta",book_imbalance:"bookImbalance"})});import{createHash as jb}from"node:crypto";function $u(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 qu(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function rs(e){if(e==null||typeof e!="object"||Object.isFrozen(e))return e;if(Array.isArray(e)){for(let t of e)rs(t);return Object.freeze(e)}for(let t of Object.keys(e))rs(e[t]);return Object.freeze(e)}function Lr(e){if(Array.isArray(e))return e.map(Lr);if(e!=null&&typeof e=="object"){let t={};for(let r of Object.keys(e).sort())t[r]=Lr(e[r]);return t}return e}function Bn(e){return JSON.stringify(Lr(e))}function Hb(e){let{min:t,max:r,step:n}=e;if(!(n>0)||t>r)return[];let o=[],i=Math.floor((r-t)/n+1e-9);for(let a=0;a<=i;a++){let c=t+a*n;if(c>r+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>r+1e-9||o.push(u)}if(o.length===0)return[];let s=o[o.length-1];if(Math.abs(s-r)>1e-9){let a=(r-t)/n;Math.abs(a-Math.round(a))<=1e-9&&o.push(r)}return o}function zb(e,t){if(e.length===0)return[];let r=[{}];for(let n of e){let o=t[n],i=[];for(let s of r)for(let a of o)i.push({...s,[n]:a});r=i}return r.sort((n,o)=>{let i=Bn(n),s=Bn(o);return i<s?-1:i>s?1:0}),r}function ts(e,t,r,n,o){let i=0;if(e==="maxDrawdownPct"){if(i=t.maxDrawdownPct-n.maxDrawdownPct,i!==0)return i<0}else if(i=t[e]-n[e],i!==0)return i>0;let s=Bn(r),a=Bn(o);return s<a}function Lu(e,t,r={}){if(!qu(r))throw new TypeError("options must be a plain object");for(let w of Object.keys(r))if($u(w))throw new TypeError(`options must not include holdout/test/oos key "${w}"`);let n=new Set(["maxTrials","objective","backtestOptions"]);for(let w of Object.keys(r))if(!n.has(w))throw new TypeError(`unknown option "${w}"`);let o=64;if("maxTrials"in r){let w=r.maxTrials;if(!Number.isInteger(w)||w<1||w>Nu)throw new TypeError(`maxTrials must be an integer 1..${Nu}`);o=w}let i=r.objective??"netPnlUsd";if(!Pu.has(i))throw new TypeError(`objective must be one of ${[...Pu].join("|")}`);let s=r.backtestOptions??{};if(!qu(s))throw new TypeError("backtestOptions must be a plain object");for(let w of Object.keys(s))if($u(w))throw new TypeError(`backtestOptions must not include holdout/test/oos key "${w}"`);let a=be(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 w of c){let O=Hb(a.parameters[w]);if(O.length===0)throw new Error(`parameter "${w}" produces an empty grid`);u[w]=O,l*=O.length}let d=zb(c,u);if(d.length===0)throw new Error("parameter grid is empty");let p=d.slice(0,o),f=[],m=null,h=null;for(let w of p){let O=Pr(a,w),v=mt(O,t,s);h==null&&(h=v.config);let g={netPnlUsd:v.metrics.netPnlUsd,netPnlPct:v.metrics.netPnlPct,maxDrawdownPct:v.metrics.maxDrawdownPct,winRate:v.metrics.winRate,profitFactor:v.metrics.profitFactor,tradeCount:v.metrics.tradeCount,sharpe:v.metrics.sharpe,turnoverUsd:v.metrics.turnoverUsd},b={parameters:{...w},metrics:g};f.push(b),(!m||ts(i,g,w,m.metrics,m.parameters))&&(m=b)}f.sort((w,O)=>ts(i,w.metrics,w.parameters,O.metrics,O.parameters)?-1:ts(i,O.metrics,O.parameters,w.metrics,w.parameters)?1:0);let y={...m.parameters},x=Pr(a,y),E={strategyHash:zt(a),compilerHash:Ct,trainBarsHash:Cr(t),backtestConfig:h,objective:i,maxTrials:o,trialsRun:f.length,candidates:f,bestParameters:y,bestStrategy:x},_={id:jb("sha256").update(JSON.stringify(Lr(E)),"utf8").digest("hex"),...E};return rs(Lr(JSON.parse(JSON.stringify(_))))}var Nu,Pu,Uu=A(()=>{Tt();Ot();Pn();Nu=256,Pu=new Set(["netPnlUsd","profitFactor","sharpe","maxDrawdownPct"])});import it from"node:fs";import Fn from"node:path";function Dn(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function Qe(e){return e==null?e:JSON.parse(JSON.stringify(e))}function Wb(e){return String(e).toLowerCase().replace(/[^a-z0-9]/g,"")}function Yt(e,t="record"){if(Array.isArray(e)){e.forEach((r,n)=>Yt(r,`${t}[${n}]`));return}if(Dn(e))for(let[r,n]of Object.entries(e)){let o=Wb(r);if(Vb.some(i=>o.includes(i)))throw new Error(`shadow-store: forbidden secret-like field at ${t}.${r}`);Yt(n,`${t}.${r}`)}}function Gb(e){if(typeof e!="string"||!e||!Fn.isAbsolute(e))throw new Error("shadow-store: path must be an absolute path")}function Bu(e){let t;try{t=it.lstatSync(e)}catch(n){if(n&&n.code==="ENOENT")return;throw n}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 Kb(){return{version:os,runners:[]}}function Fu(e,t){let r;try{r=JSON.parse(e)}catch{throw new Error("shadow-store: malformed JSON")}if(!Dn(r))throw new Error("shadow-store: malformed JSON root");if(r.version!==os)throw new Error(`shadow-store: unsupported version ${r.version}`);if(!Array.isArray(r.runners))throw new Error("shadow-store: runners must be an array");return Yt(r,Fn.basename(t)),{version:os,runners:r.runners.map(n=>Qe(n))}}function Du(e,t){Yt(t,"store");let r=Fn.dirname(e);it.mkdirSync(r,{recursive:!0,mode:448});let n=Fn.join(r,`.shadow-store.${process.pid}.${Date.now()}.tmp`),o=`${JSON.stringify(t)}
4
- `;try{it.writeFileSync(n,o,{mode:384,flag:"wx"}),it.renameSync(n,e);try{it.chmodSync(e,384)}catch{}}catch(i){try{it.unlinkSync(n)}catch{}throw i}}function Mu(e={}){let t=e.path;if(Gb(t),Bu(t),it.existsSync(t)?Fu(it.readFileSync(t,"utf8"),t):Du(t,Kb()),ns.has(t))return ns.get(t);let r=!1,n=[];function o(){if(r)return;let m=n.shift();if(m){r=!0;try{let h=m.fn();r=!1,m.resolve(h),o()}catch(h){r=!1,m.reject(h),o()}}}function i(m){if(!r&&n.length===0){r=!0;try{return m()}finally{r=!1,queueMicrotask(o)}}return new Promise((h,y)=>{n.push({fn:m,resolve:h,reject:y}),queueMicrotask(o)})}function s(){return Bu(t),Fu(it.readFileSync(t,"utf8"),t)}function a(m){Du(t,m)}function c(m){if(!Dn(m)||typeof m.id!="string"||!m.id)throw new Error("shadow-store: create requires record with string id");Yt(m,"record");let h=s();if(h.runners.some(x=>x.id===m.id))throw new Error(`shadow-store: runner id already exists: ${m.id}`);let y=Qe(m);return h.runners.push(y),a(h),Qe(y)}function u(m){let h=s().runners.find(y=>y.id===m);return h?Qe(h):null}function l(){return s().runners.map(m=>Qe(m))}function d(m,h){if(typeof h!="function")throw new Error("shadow-store: updater must be a function");let y=s(),x=y.runners.findIndex(w=>w.id===m);if(x<0)throw new Error(`shadow-store: runner not found: ${m}`);let E=Qe(y.runners[x]),_=h(E);if(!Dn(_)||_.id!==m)throw new Error("shadow-store: updater must return record with same id");return Yt(_,"record"),y.runners[x]=Qe(_),a(y),Qe(y.runners[x])}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 x=Qe(h.runners[y]);return x.status!=="stopped"&&(x.status="stopped",h.runners[y]=x,a(h)),Qe(h.runners[y])}let f={create(m){return i(()=>c(m))},get(m){return u(m)},list(){return l()},update(m,h){return i(()=>d(m,h))},stop(m){return i(()=>p(m))}};return ns.set(t,f),f}var os,Vb,ns,ju=A(()=>{os=1,Vb=["privatekey","secretkey","seed","mnemonic","passphrase","password","keystore","keymaterial","apikey","authtoken","accesstoken","refreshtoken","credential","bearer","signature","authorization","xprv","xpriv","wif"];ns=new Map});import{createHash as as}from"node:crypto";function is(e){return e==null?e:JSON.parse(JSON.stringify(e))}function ss(e){return Array.isArray(e)?e.map(ss):e&&typeof e=="object"?Object.fromEntries(Object.keys(e).sort().map(t=>[t,ss(e[t])])):e}function zu(e){if(!e||typeof e!="object"||Array.isArray(e))throw new TypeError("shadow-runner: record must be an object");return as("sha256").update(JSON.stringify(ss(e))).digest("hex")}function Xb(e,t,r,n,o){return as("sha256").update(`${e}|${t}|${r}|${n}|${o}`).digest("hex")}function Yb(e,t,r,n){return as("sha256").update(`shadow|${e}|${t}|${r}|${n??""}`).digest("hex")}function Jb(e){return e==="entryLong"||e==="exitShort"?"buy":e==="entryShort"||e==="exitLong"?"sell":e}function Hu(e){return e==="entryLong"||e==="entryShort"}function cs({storePath:e,clock:t=Date.now}={}){if(typeof e!="string"||!e)throw new Error("shadow-runner: storePath required");let r=Mu({path:e});function n({strategy:c,evidenceId:u=null}={}){let l=ge(c),d=u==null?null:String(u),p=r.list().filter(x=>x.status==="running"&&x.strategyHash===l.strategyHash&&x.compilerHash===l.compilerHash&&x.evidenceId===d).sort((x,E)=>x.createdAt-E.createdAt||x.id.localeCompare(E.id))[0];if(p)return is(p);let f=t(),m=Yb(f,l.strategyHash,l.compilerHash,d),h=r.get(m);if(h)return is(h);let y={id:m,strategy:is(l.strategy),strategyHash:l.strategyHash,compilerHash:l.compilerHash,evidenceId:d,status:"running",cursor:null,intendedOrders:[],fills:[],missedFills:[],markouts:[],createdAt:f,updatedAt:f,position:null,cooldownBarsRemaining:0,cooldownStartT:null,lastProcessedBarIndex:-1};return r.create(y)}function o(c){return r.get(c)}function i(){return r.list()}function s(c){return r.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 r.update(c,d=>{if(d.status!=="running")throw new Error("shadow-runner: runner is stopped");if(u.length===0)return d;let f=ge(d.strategy).evaluateAll(u),m=new Map;for(let I=0;I<u.length;I++)m.set(u[I].t,I);let h=d.cursor,y=[];for(let I=0;I<u.length;I++){let P=u[I].t;(h==null||P>h)&&y.push(I)}if(y.length===0)return d;let x=new Map(d.intendedOrders.map(I=>[I.id,I])),E=new Set(d.fills.map(I=>I.orderId)),_=new Map(d.missedFills.map(I=>[I.orderId,I])),w=(I,P)=>`${I}|${P}`,O=new Map(d.markouts.map(I=>[w(I.orderId,I.horizon),I])),v=d.position?{...d.position}:null,g=Number.isInteger(d.cooldownBarsRemaining)?Math.max(0,d.cooldownBarsRemaining):0,b=Number.isFinite(d.cooldownStartT)?d.cooldownStartT:null;function S({action:I,signalBarT:P,signalIndex:L}){let H=Jb(I),X=Xb(d.id,d.strategyHash,P,H,I);if(x.has(X))return x.get(X);let F=L+1,z=F<u.length,ie={id:X,action:I,type:I,side:H,signalBarT:P,fillBarT:z?u[F].t:null,status:z?"open":"missed"};return x.set(X,ie),d.intendedOrders.push(ie),ie}function k(I,P,L){if(E.has(I.id))return;let H={orderId:I.id,action:Hu(I.action)?"entry":"exit",side:I.side,price:P.o,barT:P.t,signalBarT:I.signalBarT,barIndex:L};if(d.fills.push(H),E.add(I.id),I.status="filled",I.fillBarT=P.t,_.has(I.id)&&(_.delete(I.id),d.missedFills=d.missedFills.filter(X=>X.orderId!==I.id)),Hu(I.action)){v={side:I.action==="entryLong"?"long":"short",entryOrderId:I.id,entryBarT:P.t,entryPrice:P.o,entryBarIndex:L};for(let X of l){let F=w(I.id,X);if(O.has(F))continue;let z={orderId:I.id,horizon:X,entryBarT:P.t,entryPrice:P.o,side:v.side,status:"pending",close:null,barT:null};O.set(F,z),d.markouts.push(z)}}else v=null,g=Number(d.strategy?.risk?.cooldownBars)||0,b=P.t}function N(I){if(E.has(I.id)||_.has(I.id))return;let P={orderId:I.id,action:I.action,side:I.side,signalBarT:I.signalBarT,status:"missed"};_.set(I.id,P),d.missedFills.push(P),I.status="missed"}for(let I of d.intendedOrders){if(I.status==="filled"||E.has(I.id))continue;let P=m.get(I.signalBarT);if(P==null)continue;let L=P+1;L<u.length&&(h==null||u[L].t>h)&&k(I,u[L],L)}for(let I of y){let P=u[I],L=f[I].signals,H=v,X=z=>{if(v||g>0&&(b==null||P.t>=b))return;let K=S({action:z,signalBarT:P.t,signalIndex:I}),Ge=I+1;Ge<u.length?k(K,u[Ge],Ge):N(K)},F=z=>{if(!v||v.side==="long"&&z!=="exitLong"||v.side==="short"&&z!=="exitShort")return;let ie=S({action:z,signalBarT:P.t,signalIndex:I}),K=I+1;K<u.length?k(ie,u[K],K):N(ie)};H?(L.exitLong&&F("exitLong"),L.exitShort&&F("exitShort")):L.entryLong&&L.entryShort||(L.entryLong&&X("entryLong"),L.entryShort&&X("entryShort")),g>0&&b!=null&&P.t>=b&&(g-=1,g===0&&(b=null)),d.cursor=P.t,d.lastProcessedBarIndex=I}for(let I of d.markouts){if(I.status!=="pending")continue;let P=d.fills.find(X=>X.orderId===I.orderId&&X.action==="entry");if(!P)continue;let L=m.get(P.barT);if(L==null)continue;let H=L+I.horizon;if(H<u.length){I.close=u[H].c,I.barT=u[H].t,I.status="filled";let X=I.entryPrice;I.markout=I.side==="long"?(I.close-X)/X:(X-I.close)/X}}return d.position=v,d.cooldownBarsRemaining=g,d.cooldownStartT=b,d.updatedAt=t(),d})}return{start:n,step:a,list:i,get:o,stop:s}}var Vu=A(()=>{Tt();ju()});var Ku={};B(Ku,{runStrategyOperation:()=>ig});import Qb from"node:os";import Zb from"node:path";function Ur(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function tg(e){return String(e).toLowerCase().replace(/[^a-z0-9]/g,"")}function ls(e){if(Array.isArray(e)){for(let t of e)ls(t);return}if(Ur(e))for(let[t,r]of Object.entries(e)){if(eg.some(n=>tg(t).includes(n)))throw new Error(`strategy service: secret-like field "${t}" is forbidden`);ls(r)}}function rg(e){if(!Ur(e))throw new TypeError("strategy input must be a plain object");return ls(e),e}function ng(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 r=Date.now();if(e.nowMs===void 0||e.nowMs===null)return r;if(!Number.isInteger(e.nowMs))throw new TypeError("nowMs must be an integer epoch milliseconds");if(Math.abs(e.nowMs-r)>12e4)throw new Error("nowMs outside allowed wall-clock skew (120s); omit nowMs to use server time");return e.nowMs}async function us(e,t,r,n){if(Array.isArray(t.bars))return t.bars;let o=ji(e.venue),i=r.fetchBars??o.fetchBars;if(typeof i!="function")throw new Error(`strategy venue ${o.id} does not support history`);r.signal?.throwIfAborted?.();let s=await i({coin:e.market.coin,interval:e.market.interval,count:t.count??1500,endTime:t.endTime??n},{signal:r.signal});r.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 ds(e,t){let r=e.backtestOptions??{};if(!Ur(r))throw new TypeError("backtestOptions must be a plain object");return{...r,nowMs:t}}function Wu(e,t,r,n,o={}){let i=e.evidenceOptions??{};if(!Ur(i))throw new TypeError("evidenceOptions must be a plain object");return{...i,...o,strategy:t,bars:r,backtestOptions:ds(e,n)}}function Gu(){return Zb.join(Qb.homedir(),".oracle","strategy-shadow.json")}function og(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 ig(e,t={},r={}){r.signal?.throwIfAborted?.();let n=rg(t),o=ng(n,r);if(e==="draft")return{strategy:Tu(n.prompt,{nowMs:o})};if(e==="validate"){let i=ge(n.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=ge(n.strategy),s=await us(i.strategy,n,r,o);qr(i,s);let a=Li(Wu(n,i.strategy,s,o));return e==="evidence"?a:{backtest:mt(i.strategy,s,ds(n,o)),evidence:a}}if(e==="optimize"){let i=ge(n.strategy),s=await us(i.strategy,n,r,o);qr(i,s);let a=n.trainFraction,c=n.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=n.options??{};if(!Ur(d))throw new TypeError("options must be a plain object");let p=Lu(i.strategy,l,{...d,...n.maxTrials==null?{}:{maxTrials:n.maxTrials},backtestOptions:ds(n,o)}),f=p.bestStrategy;return{strategy:f,optimization:p,evidence:Li(Wu(n,f,s,o,{trainFraction:u}))}}if(e==="shadow"){let i=cs({storePath:r.storePath??Gu(),clock:()=>o}),s=n.action;if(s==="start")return await i.start({strategy:n.strategy,evidenceId:n.evidenceId??n.evidence?.id??null});if(s==="list")return await i.list();if(s==="get")return await i.get(n.id);if(s==="stop")return await i.stop(n.id);if(s==="step"){let a=await i.get(n.id);if(!a)throw new Error(`shadow runner not found: ${n.id}`);let c=await us(a.strategy,n,r,o);return qr(ge(a.strategy),c),await i.step(n.id,c,n.stepOptions??{})}throw new Error(`unknown shadow action: ${s}`)}if(e==="prepare"){let i=ge(n.strategy),s=ji(i.strategy.venue);if(typeof n.shadowId!="string"||!n.shadowId)throw new Error("strategy prepare requires a matching shadow runner id");let c=await cs({storePath:r.storePath??Gu(),clock:()=>o}).get(n.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!==n.evidence?.id)throw new Error("strategy prepare shadow runner does not match evidence artifact");let u=n.caps??og(i.strategy,o);return s.prepareIntent({strategy:i.strategy,evidence:n.evidence,shadow:{id:c.id,stateHash:zu(c),status:c.status,cursor:c.cursor,updatedAt:c.updatedAt},caps:u,nowMs:o,env:r.env??process.env})}throw new Error(`unknown strategy operation: ${e}`)}var eg,Xu=A(()=>{Pn();Tt();Ui();Ru();Uu();Vu();Hi();eg=["privatekey","secretkey","seed","mnemonic","passphrase","password","keystore","keymaterial","apikey","authtoken","accesstoken","refreshtoken","credential","bearer","signature","authorization","xprv","xpriv","wif"]});var cl={};B(cl,{DEFAULT_CROSS_CHAIN_SOURCES:()=>rl,DEFAULT_SAME_CHAIN_SOURCES:()=>tl,NATIVE_TOKEN:()=>ps,canonicalJson:()=>ol,hashFirmQuote:()=>al,hashRfqIntent:()=>sl,normalizeFirmQuote:()=>ms,normalizeRfqIntent:()=>dg,sha256Hex:()=>Br});import{createHash as sg}from"node:crypto";import{getAddress as el,isAddress as fs}from"ethers";function re(e,t="invalid"){throw new Error(`rfq: ${e} ${t}`)}function Ju(e,t){let r=Number(e);return(!Number.isSafeInteger(r)||r<=0)&&re(t,"must be a positive chainId"),r}function Mn(e,t){let r=String(e??"").trim();return(!ag.test(r)||BigInt(r)<=0n)&&re(t,"must be a positive integer string"),r}function cg(e,t){return e==null||e===""?null:Mn(e,t)}function Qu(e,t){let r=String(e??"").trim();return r.toLowerCase()===ps.toLowerCase()?ps:(fs(r)||re(t,"must be an EVM address or native token sentinel"),el(r))}function nl(e,t){let r=String(e??"").trim();return fs(r)||re(t,"must be an EVM address"),el(r)}function ug(e,t){return e==null||e===""?null:nl(e,t)}function Zu(e,t,r){return e===void 0?[...r]:(Array.isArray(e)||re(t,"must be an array"),e.map(n=>String(n).trim()).filter(Boolean))}function lg(e,{nowMs:t,maxDeadlineMs:r},n){let o=Number(e);return Number.isFinite(o)||re(n,"must be a finite millisecond timestamp"),o<=t&&re(n,"expired"),o>t+r&&re(n,"exceeds maxDeadlineMs"),Math.floor(o)}function Jt(e){if(Array.isArray(e))return e.map(Jt);if(e&&typeof e=="object"){let t={};for(let r of Object.keys(e).sort())e[r]!==void 0&&(t[r]=Jt(e[r]));return t}return e}function ol(e){return JSON.stringify(Jt(e))}function Br(e){return`0x${sg("sha256").update(ol(e)).digest("hex")}`}function il(e,t){let r={...e};for(let n of t)delete r[n];return r}function sl(e){return Br(il(e,["intentHash"]))}function al(e){return Br(il(e,["firmQuoteHash"]))}function dg(e={},t={}){let r=Number(t.nowMs??Date.now()),n=Number(t.maxDeadlineMs??1800*1e3);(!Number.isFinite(r)||!Number.isFinite(n)||n<=0)&&re("time","is invalid");let o=Ju(e.fromChainId??e.fromChain,"fromChainId"),i=Ju(e.toChainId??e.toChain,"toChainId"),a=o===i?tl:rl,c={kind:"rfq-intent",version:1,fromChainId:o,toChainId:i,sellToken:Qu(e.sellToken??e.tokenIn??e.fromToken,"sellToken"),buyToken:Qu(e.buyToken??e.tokenOut??e.toToken,"buyToken"),sellAmount:Mn(e.sellAmount??e.amountIn??e.fromAmount,"sellAmount"),receiver:nl(e.receiver??e.recipient??e.to,"receiver"),deadlineMs:lg(e.deadlineMs??e.deadline??e.expiresAtMs,{nowMs:r,maxDeadlineMs:n},"deadline"),minBuyAmount:cg(e.minBuyAmount??e.minOut??e.amountOutMin,"minBuyAmount"),allowedSources:Zu(e.allowedSources,"allowedSources",a),allowedRouters:Zu(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)?Jt(e.metadata):{}};return c.slippageBps!=null&&(!Number.isInteger(c.slippageBps)||c.slippageBps<0||c.slippageBps>1e4)&&re("slippageBps","must be 0 to 10000"),c.intentId=e.intentId?String(e.intentId):Br({seed:"rfq-intent",intent:c}).slice(0,34),c.intentHash=sl(c),Object.freeze(c)}function pg(e){return(!e||typeof e!="object"||Array.isArray(e))&&re("artifact","required"),e.typedDataHash!=null&&!Yu.test(String(e.typedDataHash))&&re("artifact.typedDataHash","must be bytes32"),e.calldataHash!=null&&!Yu.test(String(e.calldataHash))&&re("artifact.calldataHash","must be bytes32"),e.to!=null&&!fs(String(e.to))&&re("artifact.to","must be an address"),e.data!=null&&!/^0x(?:[0-9a-fA-F]{2})*$/.test(String(e.data))&&re("artifact.data","must be hex"),Jt(e)}function ms(e,t={},r={}){(!e||e.kind!=="rfq-intent")&&re("intent","required");let n=Number(r.nowMs??Date.now()),o=Number(t.expiryMs??t.expiresAtMs??t.validUntilMs);Number.isFinite(o)||re("quote expiry","required"),o<=n&&re("quote","expired"),o>e.deadlineMs&&re("quote expiry","exceeds intent deadline");let i=String(t.source??t.provider??"").trim();i||re("source","required"),e.allowedSources.includes(i)||re("source","not allowed by intent");let s=Mn(t.amountOut??t.buyAmount,"amountOut"),a=Mn(t.minBuyAmount??t.minOut??s,"minBuyAmount");BigInt(a)>BigInt(s)&&re("minBuyAmount","exceeds amountOut");let c=pg(t.artifact??t.executableArtifact??t.transaction??t.typedData),u=Number(t.quotedAtMs??t.timestampMs??r.nowMs??Date.now());Number.isFinite(u)||re("quotedAtMs","must be finite");let l=ug(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)?Jt(t.metadata):{}};return d.quoteId||(d.quoteId=Br({seed:"rfq-quote",out:d}).slice(0,34)),d.firmQuoteHash=al(d),Object.freeze(d)}var ps,tl,rl,Yu,ag,hs=A(()=>{ps="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",tl=Object.freeze(["lifi","paraswap","0x","cow","uniswap-v3"]),rl=Object.freeze(["lifi"]),Yu=/^0x[0-9a-fA-F]{64}$/,ag=/^\d+$/});import{readFileSync as fg}from"node:fs";import{homedir as mg}from"node:os";import{join as jn}from"node:path";function hg(){if(process.env.ORACLE_TEST_ISOLATE_SECRETS==="1"){let r=(process.env.ORACLE_EXEC_ENV_FILE||"").trim();return r?[r]:[]}let e=(process.env.ORACLE_EXEC_ENV_FILE||process.env.MAD_EXEC_ENV_FILE||"").trim(),t=mg();if(process.env.ORACLE_PUBLIC_DESKTOP==="1"){let r=(process.env.ORACLE_CONFIG_DIR||jn(t,".config","oracle")).trim();return[e,jn(r,"exec.env")].filter(Boolean)}return[e,jn(t,".config","oracle","exec.env"),jn(t,".config","mad-desk","exec.env")].filter(Boolean)}function ul(e,t,r){let n=e??process.env[t]??process.env[r];if(!String(n||"").trim())for(let o of hg())try{let i=fg(o,"utf8"),s=i.match(new RegExp(`^${t}=(.*)$`,"m"))||i.match(new RegExp(`^${r}=(.*)$`,"m"));if(s&&(n=s[1].trim(),n))break}catch{}if(!String(n||"").trim())throw new Error(`${t} required for attestation. Set it in the environment, or place ${t}=<value> in ~/.config/oracle/exec.env`);return n}var ll=A(()=>{});var dl=A(()=>{});import{createHash as yg,createHmac as fl,timingSafeEqual as bg}from"node:crypto";function Hn(e){return Array.isArray(e)?`[${e.map(Hn).join(",")}]`:e&&typeof e=="object"?`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${Hn(e[t])}`).join(",")}}`:JSON.stringify(e??null)}function ml(e,{required:t=!1}={}){try{return ul(e,"ORACLE_ROUTE_ATTESTATION_SECRET","MAD_ROUTE_ATTESTATION_SECRET")}catch(r){if(t)throw r;return null}}function bs(e){let{signature:t,...r}=e;return r}function hl(e,{secret:t}={}){let r=ml(t);return r?{...e,signature:fl("sha256",r).update(Hn(bs(e))).digest("hex")}:e}function gg(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 yg("sha256").update(Buffer.from(t.slice(2),"hex")).digest("hex")}function Oe(e,{chainId:t,venue:r,data:n,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(r||"").toLowerCase())throw new Error("auto-slippage guard venue mismatch");let i=ml(o);if(i){let f=fl("sha256",i).update(Hn(bs(e))).digest("hex");if(!wg(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>st||!Number.isInteger(a)||a<0||a>st||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 p=kg(n);if(p!=null&&p!==u)throw new Error(`auto-slippage: calldata encodes floor ${p}, not the guard floor ${u} \u2014 refusing to bind`);return hl({...bs(e),calldataHash:gg(n)},{secret:o})}function wg(e,t){let r=Buffer.from(String(e??""),"utf8"),n=Buffer.from(String(t??""),"utf8");return r.length!==n.length||r.length===0?!1:bg(r,n)}function ys(e,t=0){let r=Number(e);return Number.isFinite(r)?r:t}function xg(e){let t=e==null?st: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,st)}function at({liquidityUsd:e,priceChange5m:t=0,quoteAgeMs:r=0,crossChain:n=!1,requestedCapBps:o}={}){let i=ys(e,0),s=i>0?i>=25e4?5:i>=1e5?10:i>=5e4?20:i>=1e4?40:70:n?30:10,a=Math.min(60,Math.abs(ys(t,0))*2),c=Math.min(40,Math.floor(Math.max(0,ys(r,0))/5e3)*5),u=Math.max(25,Math.ceil(20+s+a+c)),l=xg(o);return{mode:"auto",requiredBps:u,selectedBps:Math.min(u,l),capBps:l,executable:u<=l}}function gs({chainId:e,venue:t,quoteAmountOut:r,liquidityUsd:n,priceChange5m:o=0,quoteAgeMs:i=0,crossChain:s=!1,requestedCapBps:a,quotedAtMs:c=Date.now(),ttlMs:u=pl,secret:l}={}){let d=BigInt(r??0);if(d<=0n)throw new Error("auto-slippage guard requires positive quoteAmountOut");let p=at({liquidityUsd:n,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(u)||pl)),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 x=Number((d-y)*10000n/(d===0n?1n:d));if(x>p.capBps)throw new Error(`auto-slippage: realised floor implies ${x} bps, above cap ${p.capBps} \u2014 refusing to issue a guard weaker than advertised`);return hl({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:l})}function kg(e){let t=String(e||"");if(!/^0x[0-9a-fA-F]+$/.test(t)||t.length<10||t.length%2!==0)return null;let r=t.slice(0,10).toLowerCase(),n=[];for(let i=10;i+64<=t.length;i+=64)n.push(t.slice(i,i+64));let o=i=>n[i]==null?null:BigInt("0x"+n[i]);switch(r){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 ae(e,{chainId:t,venue:r,amountOut:n,liquidityUsd:o,priceChange5m:i,crossChain:s,requestedCapBps:a,quotedAtMs:c=Date.now(),ttlMs:u}={}){let l=gs({chainId:t,venue:r,quoteAmountOut:n,liquidityUsd:o,priceChange5m:i,crossChain:s,requestedCapBps:a,quotedAtMs:c,ttlMs:u});return{...e,autoSlippage:l,amountOutMinimum:l.minAmountOut}}var st,pl,Ue=A(()=>{ll();dl();st=100,pl=2e4});function ws(e){let t=String(e||"").trim();return/^0x[0-9a-fA-F]{40}$/.test(t)?t:bt}var bt,zn=A(()=>{bt="0x000000000000000000000000000000000000dEaD"});import{Contract as Sg,JsonRpcProvider as Eg}from"ethers";function Cg(e){return Og.test(String(e||""))}async function yl(e,{contract:t=Ag,rpc:r=Ig,chainId:n=vg,balanceOf:o}={}){if(!Cg(e))throw new Error("invalid-address");if(o)return BigInt(await o(e));let i=new Eg(r,n,{staticNetwork:!0}),s=new Sg(t,_g,i);return BigInt(await s.balanceOf(e))}var Ag,vg,Ig,_g,Og,bl=A(()=>{Ag="0x62FCFAf7573AD8B41a0FBF347AfEb85e06599A75",vg=999,Ig="https://rpc.hyperliquid.xyz/evm",_g=["function balanceOf(address owner) view returns (uint256)"],Og=/^0x[a-fA-F0-9]{40}$/});import{existsSync as Tg,readFileSync as Rg,lstatSync as Ng}from"node:fs";import{homedir as gl}from"node:os";import{join as xs}from"node:path";function qg(e){let t=String(e||"swap").toLowerCase();return Object.prototype.hasOwnProperty.call(wl,t)?wl[t]:$g}function Dg(e=process.env){if(process.env.ORACLE_TEST_ISOLATE_SECRETS==="1"){if(e[xl])return String(e[xl]);let t=e.ORACLE_CONFIG_DIR||xs(gl(),".config","oracle");return xs(t,"fee-recipient")}return xs(gl(),".config","oracle","fee-recipient")}function Mg(e=process.env){try{let t=Dg(e);if(!Tg(t)||Ng(t).isSymbolicLink())return"";let r=Rg(t,"utf8").trim().toLowerCase();return/^0x[a-f0-9]{40}$/.test(r)?r:""}catch{return""}}function jg(e,{fallback:t=0}={}){if(e==null)return t;if(String(e).trim()==="")return 0;let r=Number(e);return!Number.isFinite(r)||r<=0?0:Math.min(Math.floor(r),Pg)}function Hg({env:e=process.env,action:t="swap",admin:r=!1}={}){let n=String(e[Ug]||"").trim(),o=String(e[Bg]||Fg).trim();if(r===!0)return{bps:0,recipient:"",integrator:o,action:t,applies:!1,reason:"admin-oracle"};let i=qg(t),s=jg(e[Lg],{fallback:n?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(n))return{bps:0,recipient:"",integrator:o,action:t,applies:!1,reason:"no-recipient"};let c=Mg(e);return!c||c!==n.toLowerCase()?{bps:0,recipient:"",integrator:o,action:t,applies:!1,reason:"recipient-not-pinned"}:{bps:a,recipient:n,integrator:o,action:t,applies:!0,reason:"configured"}}async function Vn({wallet:e,env:t=process.env,action:r="swap",holderCheck:n={},admin:o=!1}={}){let i=Hg({env:t,action:r,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 yl(s,n))>0n?{...i,bps:0,applies:!1,reason:"locals-only-holder",holderVerificationStatus:"holder"}:{...i,holderVerificationStatus:"non-holder"}}catch{return{...i,holderVerificationStatus:"unavailable"}}}function kl(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 Sl(e){return e?.applies?{integrator:e.integrator,fee:String(e.bps/1e4)}:{}}function El(e){return e?.applies?{partner:e.integrator,partnerFeeBps:String(e.bps),partnerAddress:e.recipient}:{}}var Pg,$g,wl,Lg,Ug,Bg,xl,Fg,Wn=A(()=>{bl();Pg=100,$g=5,wl=Object.freeze({swap:5,bridge:5,perps:0,nft:0});Lg="ORACLE_INTEGRATOR_FEE_BPS",Ug="ORACLE_INTEGRATOR_FEE_RECIPIENT",Bg="ORACLE_INTEGRATOR_ID",xl="ORACLE_INTEGRATOR_FEE_RECIPIENT_PIN",Fg="oracle"});var Es={};B(Es,{LIFI_API:()=>vl,lifiChains:()=>Kg,lifiHealth:()=>Wg,lifiPrepare:()=>Gg,lifiQuote:()=>Nt});function Ss(e={}){return(e.baseUrl||process.env.LIFI_API_URL||vl).replace(/\/$/,"")}function Vg(e){let t=String(e||ks).toLowerCase();return t===ks.toLowerCase()||t===zg}function Al(e,t){let r=String(e||"").trim();if(!/^0x[0-9a-fA-F]{40}$/.test(r))throw new Error(`lifi: ${t} must be a 20-byte address`);return r.toLowerCase()}async function Wg(e={}){let t=await C(`${Ss(e)}/chains`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??12e3}),r=Array.isArray(t)?t.length:t?.chains?.length||0;return{ok:r>0,chainCount:r}}async function Nt(e={},t={}){let{fromChain:r,toChain:n=r,fromToken:o=ks,toToken:i,fromAmount:s,fromAddress:a=bt}=e;if(r==null||!i||!s)throw new Error("lifiQuote requires fromChain, toToken, fromAmount");let c=new URLSearchParams({fromChain:String(r),toChain:String(n),fromToken:o,toToken:i,fromAmount:String(s),fromAddress:a}),u=at({liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,crossChain:Number(n)!==Number(r),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 Vn({wallet:e.fromAddress,env:t.env,action:e.feeAction||"swap",holderCheck:t.holderCheck});for(let[y,x]of Object.entries(Sl(l)))c.set(y,x);let d=await C(`${Ss(t)}/quote?${c}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4}),p=d?.estimate?.toAmount||d?.toAmount;if(!p)return{...d,autoSlippagePolicy:u,oracleFee:l};let f=d?.transactionRequest?.to||d?.estimate?.approvalAddress||"lifi",m=ae(d,{chainId:Number(r),venue:f,amountOut:p,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,crossChain:Number(n)!==Number(r),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:l}}async function Gg(e={},t={}){let r=await Nt(e,t),n=r?.transactionRequest;if(!n?.to||!n?.data)throw new Error("lifi: quote did not return an executable transactionRequest");let o=Number(e.fromChain);if(n.chainId!=null&&Number(n.chainId)!==o)throw new Error("lifi: transaction chain mismatch");if(e.fromAddress&&n.from&&String(n.from).toLowerCase()!==String(e.fromAddress).toLowerCase())throw new Error("lifi: transaction sender mismatch");let i=null;if(!Vg(e.fromToken)){let s=r?.estimate?.approvalAddress||r?.approvalAddress;if(!s)throw new Error("lifi: ERC20 route missing approvalAddress");let a=r?.action?.fromToken?.address||r?.estimate?.fromToken?.address||e.fromToken;i={token:Al(a,"approval token"),spender:Al(s,"approval spender"),amount:String(e.fromAmount)}}return Q({provider:"lifi",calldataReady:!0,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:o,quote:r,autoSlippage:r.autoSlippage,requiresApproval:i,transaction:{chainId:o,from:n.from||e.fromAddress,to:n.to,data:n.data,value:n.value??"0x0",...n.gasLimit!=null?{gasLimit:n.gasLimit}:{},slippageGuard:Oe(r.autoSlippage,{chainId:o,venue:n.to,data:n.data})}},{provider:"lifi",kind:"lifi-tx"})}async function Kg(e={}){return C(`${Ss(e)}/chains`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??12e3})}var vl,ks,zg,Fr=A(()=>{j();Ue();zn();xe();Wn();vl="https://li.quest/v1";ks="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",zg="0x0000000000000000000000000000000000000000"});var Ol={};B(Ol,{PARASWAP_API:()=>Il,paraswapHealth:()=>Yg,paraswapPrepare:()=>Xg,paraswapPrice:()=>Zt,paraswapTokens:()=>_l});function Qt(e,t){let r=String(e||"");if(!/^0x[0-9a-fA-F]{40}$/.test(r))throw new Error(`${t} must be a 20-byte token address`);return r.toLowerCase()}async function _l(e={},t={}){let r=Number(e.chainId||1);return C(`${As(t)}/tokens/${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function Zt(e={},t={}){let r=Number(e.chainId||e.network||1);if(e.amount==null)throw new Error("amount required");let n=new URLSearchParams({srcToken:Qt(e.srcToken,"srcToken"),destToken:Qt(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(r),version:String(e.version||"6.2")});e.includeDEXS&&n.set("includeDEXS",String(e.includeDEXS)),e.excludeDEXS&&n.set("excludeDEXS",String(e.excludeDEXS));let o=await Vn({wallet:e.userAddress||e.fromAddress,env:t.env,action:e.feeAction||"swap",holderCheck:t.holderCheck});for(let[a,c]of Object.entries(El(o)))n.set(a,c);let i=await C(`${As(t)}/prices?${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4}),s=i?.priceRoute?.destAmount;return s?{...ae(i,{chainId:r,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 Xg(e={},t={}){if(String(e.side||"SELL").toUpperCase()!=="SELL")throw new Error("paraswap: agentic prepare currently supports exact-input SELL only");let r=Number(e.chainId||e.network||1),n=Qt(e.userAddress,"userAddress"),o=await Zt(e,t),i=o?.priceRoute,s=String(i?.contractAddress||"").toLowerCase();if(!s)throw new Error("paraswap: price route missing contractAddress");let a={srcToken:Qt(e.srcToken,"srcToken"),destToken:Qt(e.destToken,"destToken"),srcAmount:String(i.srcAmount||e.amount),destAmount:String(o.amountOutMinimum),priceRoute:i,userAddress:n,ignoreChecks:!1,ignoreGasEstimate:!1};e.receiver&&(a.receiver=Qt(e.receiver,"receiver"));let c=await C(`${As(t)}/transactions/${r}`,{method:"POST",body:a,fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??25e3});if(Number(c.chainId??r)!==r)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()!==n)throw new Error("paraswap: transaction sender mismatch");return Q({provider:"paraswap",calldataReady:!0,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:r,quote:o,autoSlippage:o.autoSlippage,requiresApproval:a.srcToken!=="0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee"?{token:a.srcToken,spender:i.tokenTransferProxy||s,amount:a.srcAmount}:null,transaction:{chainId:r,from:c.from||n,to:c.to,data:c.data,value:c.value??"0x0",...c.gas!=null?{gasLimit:c.gas}:{},slippageGuard:Oe(o.autoSlippage,{chainId:r,venue:c.to,data:c.data})}},{provider:"paraswap",kind:"paraswap-tx"})}async function Yg(e={}){let t=await _l({chainId:1},e),r=Array.isArray(t?.tokens)?t.tokens.length:Object.keys(t?.tokens||{}).length;return{ok:r>0,tokenSample:r}}var Il,As,Gn=A(()=>{j();Ue();xe();Wn();Il="https://api.paraswap.io",As=(e={})=>(e.baseUrl||process.env.PARASWAP_API_URL||Il).replace(/\/$/,"")});function Kn({provider:e,defaultUrl:t,hosts:r=[],url:n,strict:o=!1}){let s=(String(n??"").trim()||String(t)).replace(/\/$/,"");if(s===String(t).replace(/\/$/,""))return{baseUrl:s,trusted:!0,host:Tl(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([Tl(t),...r]).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[Cl]||"")==="1")return{baseUrl:s,trusted:!1,host:c};if(o)throw new Error(`${e}: refusing to call non-allowlisted host ${c} (set ${Cl}=1 to permit it)`);return{baseUrl:s,trusted:!1,host:c}}function Tl(e){let t=new URL(String(e));if(t.protocol!=="http:"&&t.protocol!=="https:")throw new Error("unsupported protocol");return t.host}function Xn(e,t,r){let n={...e};if(!r)return n;for(let[o,i]of Object.entries(t||{}))i&&(n[o]=i);return n}var Cl,vs=A(()=>{Cl="ORACLE_ALLOW_CUSTOM_PROVIDER_URL"});var Ll={};B(Ll,{ZEROX_API:()=>Rl,zeroxHealth:()=>Jg,zeroxPrepare:()=>Qg,zeroxPrice:()=>ql,zeroxQuote:()=>er});function Nl(e={}){return Kn({provider:"zerox",defaultUrl:Rl,hosts:["api.0x.org"],url:e.baseUrl||process.env.ZEROX_API_URL})}function Pl(e={}){return Nl(e).baseUrl}function Yn(e={}){return e.apiKey||process.env.ZEROX_API_KEY||process.env.OX_API_KEY||process.env["0X_API_KEY"]||""}function $l(e={}){return Xn({"0x-version":"v2",accept:"application/json"},{"0x-api-key":Yn(e)},Nl(e).trusted)}async function Jg(e={}){if(!Yn(e))return{ok:!1,configured:!1,error:"ZEROX_API_KEY not set"};try{let t=await ql({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 ql(e={},t={}){if(!Yn(t))throw new Error("ZEROX_API_KEY required for 0x");let{chainId:r=8453,sellToken:n,buyToken:o,sellAmount:i,taker:s}=e;if(!n||!o||!i)throw new Error("zeroxPrice requires sellToken, buyToken, sellAmount");let a=new URLSearchParams({chainId:String(r),sellToken:n,buyToken:o,sellAmount:String(i)});return s&&a.set("taker",s),C(`${Pl(t)}/swap/allowance-holder/price?${a}`,{headers:$l(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function er(e={},t={}){if(!Yn(t))throw new Error("ZEROX_API_KEY required for 0x");let{chainId:r=8453,sellToken:n,buyToken:o,sellAmount:i,taker:s}=e;if(!n||!o||!i)throw new Error("zeroxQuote requires sellToken, buyToken, sellAmount");let a=at({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(r),sellToken:n,buyToken:o,sellAmount:String(i),slippageBps:String(a.selectedBps)});s&&c.set("taker",s);let u=await C(`${Pl(t)}/swap/allowance-holder/quote?${c}`,{headers:$l(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),l=u?.buyAmount||u?.grossBuyAmount;return l?ae(u,{chainId:r,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 Qg(e={},t={}){if(!e.taker)throw new Error("0x: taker required for executable prepare");let r=await er(e,t),n=r?.transaction;if(!n?.to||!n?.data)throw new Error("0x: firm quote returned no transaction");let o=Number(e.chainId??8453),i=r?.issues?.allowance?.spender||r?.allowanceTarget;return Q({provider:"zerox",calldataReady:!0,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:o,quote:r,autoSlippage:r.autoSlippage,requiresApproval:r?.issues?.allowance?.actual!=null&&BigInt(r.issues.allowance.actual)<BigInt(e.sellAmount)?{token:e.sellToken,spender:i,amount:String(e.sellAmount)}:null,transaction:{chainId:o,from:e.taker,to:n.to,data:n.data,value:n.value??"0x0",...n.gas!=null?{gasLimit:n.gas}:{},slippageGuard:Oe(r.autoSlippage,{chainId:o,venue:n.to,data:n.data})}},{provider:"zerox",kind:"zerox-tx"})}var Rl,Jn=A(()=>{j();Ue();vs();xe();Rl="https://api.0x.org"});var D_,Ul=A(()=>{D_=Object.freeze({READ:"read",PREPARE:"prepare",EXECUTE:"execute",AUTONOMOUS:"autonomous"})});import Qn from"node:fs";import Zg from"node:os";import rr from"node:path";import{fileURLToPath as ew}from"node:url";function Bl(){return process.env.ORACLE_FAKE_HOME||Zg.homedir()}function rw(){return process.env.ORACLE_PUBLIC_DESKTOP==="1"}function Zn(){return rw()?process.env.ORACLE_CONFIG_DIR||rr.join(Bl(),".config","oracle"):rr.join(Bl(),".config","oracle")}function nw(){return rr.join(Zn(),"desk.json")}function ow(){return rr.join(Zn(),"env")}function tr({force:e=!1}={}){if(tr._done&&!e)return tr._result||null;tr._done=!0;let t={},r=(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=ow();if(Qn.existsSync(o))for(let i of Qn.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)),r(s[1],a)}}catch{}try{let o=nw();if(Qn.existsSync(o)){let i=JSON.parse(Qn.readFileSync(o,"utf8"));i&&typeof i=="object"&&(r("ORACLE_DESK_URL",i.deskUrl||i.dataUrl||i.url),r("ORACLE_DATA_URL",i.dataUrl||i.deskUrl||i.url),r("ORACLE_API_URL",i.apiUrl||i.dataUrl||i.deskUrl),r("ORACLE_PUBLIC_URL",i.publicUrl||i.deskUrl||i.dataUrl),r("ORACLE_EXEC_URL",i.execUrl),r("MAD_DESK_URL",i.deskUrl||i.dataUrl))}}catch{}let n=process.env.ORACLE_DESK_URL||process.env.ORACLE_DATA_URL||"";return n&&(r("ORACLE_DESK_URL",n),r("ORACLE_DATA_URL",n),r("ORACLE_API_URL",n),r("ORACLE_PUBLIC_URL",n),r("MAD_DESK_URL",n)),tr._result=Object.keys(t).length?t:null,tr._result}var tw,W_,Fl=A(()=>{tw=rr.dirname(ew(import.meta.url)),W_=rr.resolve(tw,"../..");try{tr()}catch{}});var jl={};B(jl,{armPreparedAction:()=>pw,callSigner:()=>Dl,queueOwnerAction:()=>Ml});import{existsSync as iw,readFileSync as sw}from"node:fs";import{request as aw}from"node:http";import cw from"node:path";function lw(e=process.env){let t=String(e.ORACLE_SIGNER_URL||uw).replace(/\/$/,""),r;try{r=new URL(t)}catch{return null}return r.hostname!=="127.0.0.1"&&r.hostname!=="localhost"&&r.hostname!=="::1"?null:r.origin}function dw(e=process.env){if(e.ORACLE_SIGNER_TOKEN)return String(e.ORACLE_SIGNER_TOKEN);let t=cw.join(Zn(),"signer","signer-token");return iw(t)?sw(t,"utf8").trim():null}function Dl(e,{method:t="GET",body:r=null,env:n=process.env,timeoutMs:o=4e3}={}){let i=lw(n),s=dw(n);return!i||!s?Promise.resolve({ok:!1,error:"local signer is not running"}):new Promise(a=>{let c=new URL(e,i),u=r?Buffer.from(JSON.stringify(r)):null,l=aw({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 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})})});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 Ml(e,t=process.env){if(!e||e.version!==1||!e.surface)throw new Error("queueOwnerAction: version-1 surface envelope required");return Dl("/pending",{method:"POST",body:{artifact:e},env:t,timeoutMs:8e3})}async function pw(e,t=process.env){let r=e?.localSignerEnvelope||e?.envelope;if(!r||r.version!==1||!r.surface)throw new Error("armPreparedAction: prepared.localSignerEnvelope v1 required");return Ml(r,t)}var uw,Hl=A(()=>{Fl();uw="http://127.0.0.1:9462"});var Ql={};B(Ql,{COW_CANCEL_TYPES:()=>Gl,COW_HOSTS:()=>to,COW_ORDER_TYPES:()=>eo,COW_SETTLEMENT:()=>zl,COW_VAULT_RELAYER:()=>Vl,armCowOrder:()=>ww,buildArmedCowOrder:()=>Cs,cowCancelOrders:()=>vw,cowChains:()=>Ow,cowHealth:()=>bw,cowOrder:()=>Jl,cowOrderStatus:()=>Yl,cowOrderUid:()=>xw,cowPrepareCancel:()=>Ew,cowPrepareOrder:()=>gw,cowQuote:()=>Pt,cowSignCancel:()=>Aw,cowSignOrder:()=>kw,cowSubmitSignedOrder:()=>Sw,cowVerifyOrderFill:()=>_w});import{TypedDataEncoder as _s,getAddress as Dr,isAddress as fw}from"ethers";function ro(e,t={}){if(t.baseUrl)return t.baseUrl.replace(/\/$/,"");let r=to[Number(e)];if(!r)throw new Error(`cowswap: unsupported chainId ${e}`);return r}function mw(e,t="v1",r={}){let n=ro(e,r);return t==="v1"?n:n.replace(/\/api\/v1$/,`/api/${t}`)}function ct(e,t){let r=String(e||"").trim();if(!fw(r))throw new Error(`cowswap: ${t} must be an address`);return Dr(r).toLowerCase()}function nr(e,t){try{let r=BigInt(String(e));if(r<0n)throw new Error("negative");return r.toString()}catch{throw new Error(`cowswap: ${t} must be a non-negative integer string`)}}function Kl(e,t){let r=String(e||"").trim();if(!/^0x[0-9a-fA-F]{64}$/.test(r))throw new Error(`cowswap: ${t} must be bytes32 hex`);return r.toLowerCase()}function Xl(e,t="uid"){let r=String(e||"").trim();if(!/^0x[0-9a-fA-F]{112}$/.test(r))throw new Error(`cowswap: ${t} must be 56-byte order UID hex`);return r.toLowerCase()}function hw({digest:e,owner:t,validTo:r}={}){let n=Kl(e,"order digest").slice(2),o=ct(t,"owner").slice(2).toLowerCase(),i=Number(r);if(!Number.isInteger(i)||i<0||i>4294967295)throw new Error("cowswap: validTo must fit uint32");return`0x${n}${o}${i.toString(16).padStart(8,"0")}`.toLowerCase()}function Os(e){let t=zl[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:Dr(t)}}function yw(e={},t,r){let n=ct(e.sellToken,"sellToken"),o=ct(e.buyToken,"buyToken"),i=ct(e.receiver||r,"receiver"),s=Number(e.validTo);if(!Number.isInteger(s)||s<=0)throw new Error("cowswap: quote.validTo required");let a=Kl(e.appData||e.appDataHash||`0x${"0".repeat(64)}`,"appData");return{sellToken:n,buyToken:o,receiver:i,sellAmount:nr(e.sellAmount,"sellAmount"),buyAmount:nr(e.buyAmount,"buyAmount"),validTo:s,appData:a,feeAmount:nr(e.feeAmount??"0","feeAmount"),kind:String(e.kind||"sell"),partiallyFillable:!!e.partiallyFillable,sellTokenBalance:String(e.sellTokenBalance||"erc20"),buyTokenBalance:String(e.buyTokenBalance||"erc20")}}async function bw(e={}){try{let t=await Pt({chainId:1,sellToken:Is[1],buyToken:Wl[1],sellAmountBeforeFee:"1000000000000000",from:bt},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 Pt(e={},t={}){let r=Number(e.chainId??1),n=ws(e.from||e.owner),o=e.sellToken||Is[r],i=e.buyToken||Wl[r],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=Is[r],!o))throw new Error("no WETH mapping for chain");let a={sellToken:o,buyToken:i,from:n,receiver:e.receiver||n,sellAmountBeforeFee:s,kind:e.kind||"sell",signingScheme:e.signingScheme||"eip1271"},c=await C(`${ro(r,t)}/quote`,{method:"POST",body:a,fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),u=c?.quote?.buyAmount||c?.buyAmount;return u?ae(c,{chainId:r,venue:"cowswap-order",amountOut:u,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps}):c}async function gw(e={},t={}){let r=Number(e.chainId??1),n=ct(ws(e.from||e.owner||e.signer),"owner"),o=await Pt({...e,chainId:r,from:n,signingScheme:e.signingScheme||"eip712"},t),i=yw(o?.quote||o,r,n),s=Os(r),a={domain:s,types:eo,primaryType:"Order",message:i},c=_s.hash(s,eo,i),u=Vl[r];if(!u)throw new Error(`cowswap: vault relayer not registered for chain ${r}`);return Q({provider:"cowswap",orderReady:!0,executionReady:!1,chainId:r,owner:n,signingScheme:"eip712",settlement:s.verifyingContract.toLowerCase(),vaultRelayer:Dr(u).toLowerCase(),quote:o,quoteId:o?.id??e.quoteId??null,typedData:a,cowGuard:{mode:"cow-order",version:1,provider:"cowswap",chainId:r,owner:n,settlement:s.verifyingContract.toLowerCase(),vaultRelayer:Dr(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:Dr(u).toLowerCase(),amount:i.sellAmount},localSignerEnvelope:Cs({chainId:r,owner:n,typedData:a,quoteId:o?.id??e.quoteId??null,cowGuard:{expiresAtMs:Math.min(i.validTo*1e3,Date.now()+2e4)}})},{provider:"cowswap",kind:"cow-order"})}function Cs(e={},t={}){let r=e.typedData;if(!r?.domain||!r?.types||!r?.message)throw new Error("cowswap: typedData required to arm");let n=Number(e.chainId??r.domain.chainId),o=to[n];if(!o)throw new Error(`cowswap: unsupported chainId ${n}`);let i=ct(e.owner,"owner"),s=Number(t.nowMs??Date.now()),a=_s.hash(r.domain,r.types,r.message);return Object.freeze({tradeId:`cow:${n}:${a.slice(2)}`,version:1,surface:"evm-order",action:"order",owner:i,destination:"cowswap",chainId:n,expiresAtMs:Number(e.cowGuard?.expiresAtMs??s+2e4),slippageBps:0,fee:{oracleFeeBps:0},artifact:Object.freeze({kind:"cow",chainId:n,submitTo:`${o}/orders`,quoteId:e.quoteId??null,domain:r.domain,types:r.types,message:r.message,typedData:r})})}async function ww(e={},t={}){let{queueOwnerAction:r}=await Promise.resolve().then(()=>(Hl(),jl)),n=e.localSignerEnvelope||Cs(e,t);return{...await r(n,t.env),envelope:n,execution:"armed-local",exec:!1}}async function Yl(e={},t={}){let r=Number(e.chainId??1),n=String(e.uid||e.orderUid||"").trim();if(!n)throw new Error("cowOrderStatus requires uid");return C(`${ro(r,t)}/orders/${encodeURIComponent(n)}/status`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function Jl(e={},t={}){let r=Number(e.chainId??1),n=String(e.uid||e.orderUid||"").trim();if(!n)throw new Error("cowOrder requires uid");return C(`${ro(r,t)}/orders/${encodeURIComponent(n)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}function xw(e={}){let t=e.typedData||e,r=Number(e.chainId??t?.domain?.chainId),n=t?.message||e.order||e.message;if(!n)throw new Error("cowswap: typed order message required");let o=e.cowGuard?.typedDataHash||_s.hash(Os(r),eo,n),i=e.owner||e.from||e.signer||n.receiver;return hw({digest:o,owner:i,validTo:n.validTo})}async function kw(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 Sw(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 Ew(e={}){let t=Number(e.chainId??1),r=ct(e.owner||e.from||e.signer,"owner"),n=(e.orderUids||e.uids||[e.uid]).filter(Boolean).map((s,a)=>Xl(s,`orderUids[${a}]`));if(!n.length)throw new Error("cowswap: orderUids required");let o=Os(t);return Q({provider:"cowswap",chainId:t,owner:r,orderUids:n,signingScheme:"eip712",typedData:{domain:o,types:Gl,primaryType:"OrderCancellations",message:{orderUids:n}},cancelReady:!0,executableArtifact:!0},{provider:"cowswap",kind:"cow-cancel"})}async function Aw(e={},t={}){throw new Error("cowswap.cowSignCancel refused: @oracle-agent/oracle is prepare-only. Cancel-sign with the user wallet.")}async function vw(e={},t={}){throw new Error("cowswap.cowCancelOrders refused: @oracle-agent/oracle is prepare-only. Cancel from the user wallet or local operator.")}function Iw(e={}){return nr(e.buyAmount??e.executedBuyAmount??"0","trade.buyAmount")}async function _w(e={},t={}){let r=Number(e.chainId??1),n=Xl(e.uid||e.orderUid),o=t.order||await Jl({chainId:r,uid:n},t),i=t.status||o.status||await Yl({chainId:r,uid:n},t).catch(()=>null),s=t.trades||await C(`${mw(r,"v2",t)}/trades?orderUid=${encodeURIComponent(n)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),a=Array.isArray(s)?s:[],c=e.expectedOwner?ct(e.expectedOwner,"expectedOwner"):null;if(c&&ct(o.owner||a[0]?.owner||c,"owner")!==c)return{ok:!1,provider:"cowswap",chainId:r,uid:n,reason:"owner mismatch",order:o,status:i,trades:a};let u=0n;for(let p of a.filter(f=>String(f.orderUid||"").toLowerCase()===n))u+=BigInt(Iw(p));u===0n&&o.executedBuyAmount!=null&&(u=BigInt(nr(o.executedBuyAmount,"executedBuyAmount")));let l=e.minBuyAmount!=null?BigInt(nr(e.minBuyAmount,"minBuyAmount")):0n,d=u>=l&&String(o.status||i?.status||"").toLowerCase()!=="expired";return{ok:d,provider:"cowswap",chainId:r,uid:n,status:o.status||i?.status||null,executedBuyAmount:u.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 Ow(){return Object.keys(to).map(Number)}var to,zl,Vl,Is,Wl,eo,Gl,no=A(()=>{j();Ue();Ul();zn();xe();to={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"},zl=Object.freeze({1:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41",100:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41",42161:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41",8453:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41"}),Vl=Object.freeze({1:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110",100:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110",42161:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110",8453:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110"}),Is={1:"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",8453:"0x4200000000000000000000000000000000000006",42161:"0x82aF49447D8a07e3bd95BD0d56f35241523fBab1"},Wl={1:"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",8453:"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",42161:"0xaf88d065e77c8cC2239327C5EDb3A432268e5831"},eo=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"}]}),Gl=Object.freeze({OrderCancellations:[{name:"orderUids",type:"bytes[]"}]})});var ed={};B(ed,{CHAINS:()=>oo,chainById:()=>Rs,isSupportedChain:()=>Zl,registerChain:()=>Cw,rpcUrlFor:()=>Ns});function Rs(e){return Ts.get(Number(e))||null}function Cw({key:e,chainId:t,name:r,rpcEnv:n=[]}){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:r||e,rpcEnv:n,evm:!0};return oo[e]=o,Ts.set(o.chainId,o),o}function Ns(e,t=process.env){let r=Rs(e);if(!r)return null;for(let n of r.rpcEnv){let o=(t[n]||"").trim();if(o)return o}return null}function Zl(e){return Ts.has(Number(e))}var oo,Ts,Ps=A(()=>{oo={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}},Ts=new Map(Object.values(oo).map(e=>[e.chainId,e]))});import{Interface as Tw,getAddress as Rw}from"ethers";function jr(e,t){try{return Rw(e).toLowerCase()}catch{throw new Error(`${t} must be a valid EVM address`)}}function Pw(e,{rpcUrl:t,env:r=process.env}={}){if(t)return t;let n=Ns(e,r);return n||Nw[Number(e)]||null}function qw(e){let t=String(e||""),r=t.toLowerCase();if(t!==t.trim()||!/^[a-zA-Z0-9_]+$/.test(t)||!$w.test(r))throw new Error(`evm-rpc: ${t} refused \u2014 @oracle-agent/oracle is prepare-only (read RPC only; no broadcast/sign)`);return r}function Lw(e){let t=new Error(e?.message||JSON.stringify(e));return t.code=e?.code,t}function Uw(e){if(e?.error)throw Lw(e.error);return e?.result}function Bw(e,t,r){return`${e}
2
+ var d0=Object.defineProperty;var A=(e,t,r)=>()=>{if(r)throw r[0];try{return e&&(t=e(e=0)),t}catch(n){throw r=[n],n}};var B=(e,t)=>{for(var r in t)d0(e,r,{get:t[r],enumerable:!0})};import{homedir as Ei}from"node:os";import{join as Ai}from"node:path";function vi(e,t,r=""){let n=process.env[e];if(n!=null&&String(n).trim()!=="")return n;let o=t?process.env[t]:void 0;return o!=null&&String(o).trim()!==""?o:r}function Tn(e,t,r=!1){return String(vi(e,t,r?"1":"")).trim()==="1"}var Oc,p0,tI,Rn=A(()=>{Oc=process.env.ORACLE_PUBLIC_DESKTOP==="1",p0=Oc?process.env.ORACLE_CONFIG_DIR||Ai(Ei(),".config","oracle"):Ai(Ei(),".config","oracle"),tI=Oc?p0:Ai(Ei(),".config","mad-desk")});function H0(e){let t=String(e??"");return t.length<18?"[REDACTED]":`${t.slice(0,6)}\u2026${t.slice(-4)}`}function z0(e){return`\xABredacted:${String(e??"").slice(0,4)}\u2026\xBB`}function It(e,t={}){if(e==null)return e;let r=typeof e=="string"?e:String(e);if(!r||!(t.force||P0))return r;let n=t.fileRead?z0:H0;r=r.replace(L0,"[REDACTED_PRIVATE_KEY]"),r=r.replace(q0,"[REDACTED_EVM_KEY]"),r=r.replace(U0,o=>n(o));for(let o of $0)o.lastIndex=0,r=r.replace(o,i=>n(i));return r=r.replace(B0,(o,i,s,a)=>/^(?:os\.(?:getenv|environ)|process\.env|\$ENV\{)/.test(a)?`${i}=${s||""}${a}${s||""}`:`${i}=${s||""}${n(a)}${s||""}`),r=r.replace(F0,(o,i,s,a)=>o.replace(a,n(a))),r=r.replace(D0,(o,i,s,a)=>`${i}${n(s)}${a}`),r}function Fc(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 r=[...t.searchParams.keys()];for(let n of r){let o=String(n).replace(/[^a-z0-9]/gi,"").toLowerCase();j0.has(o)&&t.searchParams.set(n,"[REDACTED]")}return{ok:!0,url:t,href:t.toString()}}var N0,P0,$0,q0,L0,U0,B0,F0,D0,M0,j0,Oi=A(()=>{N0=(process.env.ORACLE_REDACT_SECRETS??"true").toLowerCase(),P0=["1","true","yes","on"].includes(N0),$0=[/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],q0=/\b0x[a-fA-F0-9]{64}\b/g,L0=/-----BEGIN (?:RSA |EC |OPENSSH |ENCRYPTED )?PRIVATE KEY-----[\s\S]*?-----END (?:RSA |EC |OPENSSH |ENCRYPTED )?PRIVATE KEY-----/g,U0=/\beyJ[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\b/g,B0=/\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,F0=/^(?:export\s+)?((?:api[_-]?key|token|secret|password|private[_-]?key|mnemonic|seed[_-]?phrase|authorization))\s*[:=]\s*(['"]?)([^\s&]+)\2/gim,D0=/("(?:api[_-]?key|apiKey|access[_-]?token|refresh[_-]?token|client[_-]?secret|private[_-]?key|privateKey|secret|password|authorization|bearer|mnemonic|seedPhrase)"\s*:\s*")([^"]{6,})(")/gi,M0=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"]),j0=new Set([...M0].map(e=>e.replace(/[^a-z0-9]/gi,"").toLowerCase()))});import _t from"node:net";import G0 from"node:dns";function $n(e){let t=String(e).toLowerCase().split("%")[0];if((t.match(/::/g)||[]).length>1)return null;let r=l=>{if(!l)return[];let d=l.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))},[n,o]=t.split("::"),i=r(n),s=r(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 Ci(e,t,r){let n=Math.floor(r/8),o=r%8;for(let s=0;s<n;s+=1)if(e[s]!==t[s])return!1;if(!o)return!0;let i=255<<8-o;return(e[n]&i)===(t[n]&i)}function Ti(e){if(_t.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(_t.isIPv6(e)){let t=$n(e);if(!t)return!1;let r=$n("::ffff:0:0");return Ci(t,r,96)?Ti([...t.slice(12)].join(".")):Ci(t,$n("2000::"),3)?![["2001::",23],["2001:db8::",32],["2001:10::",28],["2001:2::",48],["2002::",16],["3fff::",20]].some(([o,i])=>Ci(t,$n(o),i)):!1}return!1}function X0(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 r=t.hostname.toLowerCase().replace(/^\[|\]$/g,"").replace(/\.+$/,"");if(K0.has(r)||r.endsWith(".localhost")||r.endsWith(".internal"))return{ok:!1,error:`refused internal host ${r}`};let n=_t.isIP(r);return n!==0&&!Ti(r)?{ok:!1,error:`refused private address ${r}`}:{ok:!0,url:t,host:r,isLiteralIp:n!==0}}async function Ri(e,{lookupFn:t=G0.promises.lookup}={}){let r=X0(e);if(!r.ok)return r;if(r.isLiteralIp)return{ok:!0,url:r.url,addresses:[{address:r.host,family:_t.isIPv6(r.host)?6:4}]};let n;try{n=await t(r.host,{all:!0,verbatim:!0})}catch{return{ok:!1,error:`refused: ${r.host} did not resolve`}}return!Array.isArray(n)||n.length===0||n.some(o=>!Ti(o.address))?{ok:!1,error:`refused: ${r.host} resolves to a non-public address`}:{ok:!0,url:r.url,addresses:n}}async function Ni({requireUndici:e=!1,importUndici:t=()=>import("undici")}={}){let r,n;try{let d=await t();r=d.Agent,n=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 r!="function"||typeof n!="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||(_t.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(_t.isIP(p))return[{address:p,family:_t.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},u=new r({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)}}}),l=Y0((d,p={})=>n(d,{...p,dispatcher:u}),a);return{dispatcher:u,fetch:l,pin:a,resolve:c,async close(){try{await u.destroy()}catch{}}}}function Y0(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[Pi]=Object.freeze({pin:t}),e}function $i(e){return typeof e=="function"&&typeof e[Pi]?.pin=="function"}function Mc(e,t,r){if(!$i(e))throw new Error("pinFetchToAddresses: fetchImpl is not pin-capable");e[Pi].pin(t,r)}var K0,Pi,jc=A(()=>{K0=new Set(["localhost","metadata.google.internal","metadata.goog"]);Pi=Symbol.for("oracle.egressGuard.pinCapableFetch")});import{createHash as Hc}from"node:crypto";function ty(e){let t=String(e||"").toLowerCase();return Yc.includes(t)||/(^|-)(api[-_]?key|key|token|secret|auth|authorization|session|cookie|signature|access)(-|$)/.test(t)}function ry(e){let t={};for(let[r,n]of Object.entries(e||{}))ty(r)||(t[r]=n);return t}function ny(e,t){if(!e)throw new Error(`HTTP redirect from ${t} missing Location`);let r=new URL(String(e),String(t));if(r.protocol!=="http:"&&r.protocol!=="https:")throw new Error(`HTTP redirect from ${t} used unsupported protocol ${r.protocol}`);return r.toString()}function oy(e,t){return new URL(String(e)).origin===new URL(String(t)).origin}function Gc(e){let t=String(e?.method||"");return t?!iy.test(t):!1}function ay(e,t){if(e==="GET"&&t==null)return!0;if(e!=="POST"||t==null)return!1;let r=t;if(typeof t=="string")try{r=JSON.parse(t)}catch{return!1}return Array.isArray(r)?r.length>0&&r.every(Gc):!r||typeof r!="object"?!1:r.jsonrpc&&r.method?Gc(r):typeof r.type=="string"&&sy.has(r.type)&&r.action==null&&r.signature==null&&r.nonce==null}function cy(e,t,r,n={},o=null){let i={};for(let[p,f]of Object.entries(r||{}))i[p.toLowerCase()]=f;let s=Object.keys(i).filter(p=>/(^|-)(api[-_]?key|key|token|secret|auth|authorization|session|cookie|signature|access)(-|$)/.test(p)),c=[...new Set([...Yc,...s])].sort().map(p=>`${p}=${i[p]??""}`).join(`
3
+ `),u=Hc("sha256").update(c).digest("hex").slice(0,32),l=`${n.untrustedUrl?"untrusted":"trusted"}:${n.maxResponseBytes??"unbounded"}`,d=o==null?"-":Hc("sha256").update(String(o)).digest("hex").slice(0,32);return`${e} ${t} ${l} ${u} ${d}`}function uy(e,t){let r=Number(t);return Number.isFinite(r)&&r>0?Math.min(r*1e3,Vc):Math.min(250*2**e,Vc)+Math.floor(Math.random()*100)}function Cr(e,t={}){let r=new Error(e);return r.retryable=!1,Object.assign(r,t),r}function Li(e,t,r){return Cr(`HTTP response from ${e} exceeded maxResponseBytes ${r} (${t})`,{oversize:!0})}function Tr(e){try{let t=e?.body?.cancel?.();t&&typeof t.then=="function"&&t.catch(()=>{})}catch{}}function dy(e){return e?e.byteLength??e.length??0:0}async function Kc(e,t,{url:r,truncate:n=!1,onOversize:o}={}){if(t==null)return await e.text();let i=Number(e.headers?.get?.("content-length"));if(Number.isFinite(i)&&i>t&&(Tr(e),!n))throw Li(r,`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(!n)throw Li(r,`body ${p} 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:p}=await s.read();if(p)break;if(d&&(a.push(Buffer.from(d)),c+=dy(d),c>t)){u=!0;break}}}finally{if(u)try{await s.cancel()}catch{}try{s.releaseLock?.()}catch{}}if(u&&(typeof o=="function"&&o(),!n))throw Li(r,`streamed ${c} bytes`,t);let l=Buffer.concat(a);return(u?l.subarray(0,t):l).toString("utf8")}function Xc(e){if(!e)return null;try{return JSON.parse(e)}catch{return null}}async function py(e,{fetchImpl:t,method:r,headers:n,body:o,timeoutMs:i,lookupFn:s,realFetch:a,untrustedUrl:c=!1,maxResponseBytes:u=null,importUndici:l,validateResponse:d,signal:p}){let f=new AbortController,m=setTimeout(()=>f.abort(),i),h=p?typeof AbortSignal.any=="function"?AbortSignal.any([p,f.signal]):p:f.signal,y=null,x=t,E=s?{lookupFn:s}:{};if(c&&!a&&!$i(x))throw Cr(`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 _=async(w,{status:O=null}={})=>{let v=await Ri(w,E);if(!v.ok)throw Cr(O==null?`HTTP refused ${w}: ${v.error}`:`HTTP redirect to ${w} ${v.error}`,O==null?{}:{status:O});let g=new URL(w).hostname;if(a){if(y&&(await y.close(),y=null),!y)try{y=await Ni({requireUndici:!0,...l?{importUndici:l}:{}})}catch(b){throw Cr(O==null?`HTTP refused ${w}: ${b?.message||b}`:`HTTP redirect to ${w} refused: ${b?.message||b}`,O==null?{}:{status:O})}y.pin(g,v.addresses),x=y.fetch}else Mc(x,g,v.addresses);return v};try{let w=String(e),O={...n||{}};c&&await _(w);for(let v=0;v<=Wc;v+=1){let g=await x(w,{method:r,headers:O,body:o,signal:h,redirect:"manual"});if(Z0.has(g.status)){if(r!=="GET"&&r!=="HEAD"){let P=await Kc(g,u??ey,{url:w,truncate:!0}),L=new Error(`HTTP ${g.status} ${r} ${w} redirected non-idempotent request`);throw L.status=g.status,L.body=Xc(P)??P.slice(0,300),L}if(v===Wc)throw Tr(g),new Error(`HTTP redirect loop for ${e}`);let k=g.headers?.get?.("location"),N;try{N=ny(k,w)}catch(P){throw Tr(g),P}let I=!oy(N,w);if(Tr(g),I&&(O=ry(O)),c)await _(N,{status:g.status});else if(I){let P=await Ri(N,E);if(!P.ok){let L=new Error(`HTTP redirect from ${w} ${P.error}`);throw L.status=g.status,L.retryable=!1,L}a&&P.addresses?.length&&(y||(y=await Ni(l?{importUndici:l}:{})),y&&(y.pin(new URL(N).hostname,P.addresses),x=y.fetch))}w=N;continue}if(typeof d=="function")try{await d(g,{url:w})}catch(k){throw Tr(g),Cr(k?.message||String(k))}let b=await Kc(g,u,{url:w,onOversize:()=>f.abort()}),S=Xc(b);if(!g.ok){let k=new Error(`HTTP ${g.status} ${r} ${w}`);throw k.status=g.status,k.retryAfter=g.headers?.get?.("retry-after")??null,k.body=S??b.slice(0,300),k}return S??b}throw new Error(`HTTP redirect loop for ${e}`)}finally{clearTimeout(m),y&&await y.close()}}async function C(e,t={}){let r=t.fetchImpl||globalThis.fetch;if(typeof r!="function")throw new Error("fetch unavailable \u2014 pass opts.fetchImpl");let n=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):Q0,c=t.lookupFn,u=!t.fetchImpl,l=t.untrustedUrl===!0,d=t.importUndici,p=t.validateResponse,f=t.signal,m=Number(t.maxResponseBytes),h=Number.isFinite(m)&&m>0?Math.floor(m):null,y=async()=>{let O;for(let v=0;v<=a;v++){f?.throwIfAborted?.();try{return await py(e,{fetchImpl:r,method:o,headers:i,body:s,timeoutMs:n,lookupFn:c,realFetch:u,untrustedUrl:l,maxResponseBytes:h,importUndici:d,validateResponse:p,signal:f})}catch(g){O=g;let b=g?.status,S=g?.name==="AbortError"||g?.name==="TimeoutError"||f?.aborted,k=new Set([408,425,429]),N=g?.retryable===!1?!1:b!=null?k.has(b)||J0.has(b)&&zc.has(o):!S&&zc.has(o);if(v===a||!N)throw g;let I=uy(v,g?.retryAfter);f?await new Promise((P,L)=>{let H=setTimeout(P,I);f.addEventListener("abort",()=>{clearTimeout(H),L(f.reason||new DOMException("Aborted","AbortError"))},{once:!0})}):await ly(I)}}throw O};if(!(t.dedupe!==!1&&!f&&ay(o,s)))return y();let E=cy(o,e,i,{untrustedUrl:l,maxResponseBytes:h},s),_=qi.get(E);if(_)return _;let w=y().finally(()=>qi.delete(E));return qi.set(E,w),w}async function Vt(e,t,r){let n=Array.from(e),o=Math.max(1,Math.min(Number(t)||1,n.length||1)),i=new Array(n.length),s=0;return await Promise.all(Array.from({length:o},async()=>{for(;s<n.length;){let a=s++;i[a]=await r(n[a],a)}})),i}var J0,zc,Q0,Vc,Yc,Z0,Wc,ey,qi,iy,sy,ly,j=A(()=>{jc();J0=new Set([408,425,429,500,502,503,504]),zc=new Set(["GET","HEAD","OPTIONS","PUT","DELETE"]),Q0=2,Vc=4e3,Yc=["authorization","x-api-key","x-tensor-api-key","0x-api-key","api-key","cookie","proxy-authorization"],Z0=new Set([301,302,303,307,308]),Wc=3,ey=64*1024;qi=new Map,iy=/(?:^|_)(send|submit|broadcast|sign|requestAirdrop)(?=[A-Z_]|$)/i,sy=new Set(["allMids","l2Book","outcomeMeta","spotClearinghouseState","userFills","meta","metaAndAssetCtxs","perpDexs","candleSnapshot","fundingHistory","openOrders","frontendOpenOrders","clearinghouseState","spotMeta","validatorSummaries","delegatorSummary","delegations","delegatorRewards","delegatorHistory","maxBuilderFee"]);ly=e=>new Promise(t=>setTimeout(t,e))});function hy({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 r=process.env.HL_API_URL.replace(/\/$/,"");return r.endsWith("/info")?r:`${r}/info`}return e||process.env.HL_TESTNET==="1"?my:fy}async function Rr(e,t={}){if(!e||!e.type)throw new Error("hlInfo requires body.type");let r=hy(t);return C(r,{method:"POST",body:e,fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function Jc(e={}){return Rr({type:"allMids"},e)}async function Qc(e={}){return Rr({type:"meta"},e)}async function Zc(e={}){let t={type:"metaAndAssetCtxs"};return e.dex&&(t.dex=e.dex),Rr(t,e)}async function eu({coin:e,interval:t="1h",startTime:r,endTime:n},o={}){if(!e)throw new Error("hlCandleSnapshot requires coin");let i={type:"candleSnapshot",req:{coin:String(e),interval:t,startTime:r??Date.now()-24*3600*1e3,endTime:n??Date.now()}};return Rr(i,o)}async function tu({coin:e,startTime:t,endTime:r},n={}){if(!e)throw new Error("hlFundingHistory requires coin");return Rr({type:"fundingHistory",coin:String(e),startTime:t??Date.now()-24*3600*1e3,endTime:r??Date.now()},n)}var fy,my,qn=A(()=>{j();fy="https://api.hyperliquid.xyz/info",my="https://api.hyperliquid-testnet.xyz/info"});import{createHash as yy}from"node:crypto";function Ye(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function Wt(e){return typeof e=="number"&&Number.isFinite(e)}function Fi(e){if(e==null||typeof e!="object"||Object.isFrozen(e))return e;if(Array.isArray(e)){for(let t of e)Fi(t);return Object.freeze(e)}for(let t of Object.keys(e))Fi(e[t]);return Object.freeze(e)}function Ot(e){if(Array.isArray(e))return e.map(Ot);if(e!=null&&typeof e=="object"){let t={};for(let r of Object.keys(e).sort())t[r]=Ot(e[r]);return t}return e}function Ui(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 ru(e){return{feesUsd:e.costs.feesUsd,builderFeesUsd:e.costs.builderFeesUsd,fundingUsd:e.costs.fundingUsd,slippageUsd:e.costs.slippageUsd}}function gy(e){return(e.feesUsd||0)+(e.builderFeesUsd||0)+Math.max(0,e.fundingUsd||0)+(e.slippageUsd||0)}function wy(e){let t=0;for(let r of e.trades)r.grossPnlUsd>0&&(t+=r.grossPnlUsd);return t}function xy(e,t,r){return!(!e||e.tradeCount<Math.max(1,Math.min(r,3))||!(e.netPnlUsd>0)||!(e.profitFactor>1)||!(e.maxDrawdownPct<=t.maxDailyLossPct))}function ou(e){if(!Ye(e))throw new TypeError("evidence artifact must be a plain object");if(!by.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(!Ye(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(!Ye(e.walkForward)||!Array.isArray(e.walkForward.windows))throw new TypeError("evidence artifact walkForward windows required");if(e.status==="pass_live_eligible"&&(!Ye(e.train)||!Ye(e.holdout)))throw new TypeError("live-eligible evidence artifact requires train and holdout facts");return Ot({barsHash:e.barsHash,compilerHash:e.compilerHash,flags:e.flags.map(t=>Ot(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 iu(e){return yy("sha256").update(JSON.stringify(ou(e)),"utf8").digest("hex")}function Le(e,t,r=0){if(!Number.isInteger(e)||e<r)throw new Error(`${t} must be an integer >= ${r}`);return e}function Bi(e,t){if(!Ye(e)||!Ye(e.metrics))throw new Error(`${t} metrics required`);let r=Le(e.tradeCount,`${t}.tradeCount`);if(e.metrics.tradeCount!==r)throw new Error(`${t} tradeCount contradicts metrics.tradeCount`);for(let n of["netPnlUsd","profitFactor","maxDrawdownPct"])if(!Wt(e.metrics[n]))throw new Error(`${t}.metrics.${n} must be finite`);if(e.metrics.maxDrawdownPct<0)throw new Error(`${t}.metrics.maxDrawdownPct must be >= 0`);return e.metrics}function ky(e,{maxDailyLossPct:t}={}){let r=e.split,n=Le(r.trainStartIndex,"split.trainStartIndex"),o=Le(r.trainEndIndex,"split.trainEndIndex"),i=Le(r.trainBarCount,"split.trainBarCount",1),s=Le(r.holdoutStartIndex,"split.holdoutStartIndex"),a=Le(r.holdoutEndIndex,"split.holdoutEndIndex"),c=Le(r.holdoutBarCount,"split.holdoutBarCount",1);if(n!==0||o-n+1!==i||s!==o+1||a-s+1!==c)throw new Error("evidence split must be contiguous, chronological, and count-consistent");if(!Wt(r.trainFraction)||r.trainFraction<=0||r.trainFraction>=1)throw new Error("split.trainFraction must be in (0,1)");Bi(e.train,"train");let u=Bi(e.holdout,"holdout");if(u.tradeCount<1||u.netPnlUsd<=0||u.profitFactor<=1)throw new Error("live-eligible holdout metrics do not pass");if(Wt(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 p=0,f=-1;for(let h=0;h<d.length;h++){let y=d[h];if(!Ye(y)||y.index!==h||typeof y.passed!="boolean")throw new Error("walk-forward windows must be ordered and structurally valid");let x=Le(y.trainStartIndex,`walkForward.windows[${h}].trainStartIndex`),E=Le(y.trainEndIndex,`walkForward.windows[${h}].trainEndIndex`),_=Le(y.evalStartIndex,`walkForward.windows[${h}].evalStartIndex`),w=Le(y.evalEndIndex,`walkForward.windows[${h}].evalEndIndex`);if(x!==0||E>=_||_>w||_<=f)throw new Error("walk-forward windows must be chronological and disjoint");if(f=w,y.passed){if(p+=1,y.reason!=="pass")throw new Error("passed walk-forward window reason must be pass");let O=Bi({metrics:y.metrics,tradeCount:y.metrics?.tradeCount},`walkForward.windows[${h}]`);if(O.tradeCount<1||O.netPnlUsd<=0||O.profitFactor<=1)throw new Error("passed walk-forward window metrics do not pass");if(Wt(t)&&O.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(!Wt(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 su(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 r=ou(e),n=Ot({id:e.id,...r});if(JSON.stringify(Ot(e))!==JSON.stringify(n))throw new Error("evidence artifact contains fields unbound from its deterministic identity");let o=iu(e);if(e.id!==o)throw new Error("evidence.id does not match its deterministic artifact facts digest");return e.status==="pass_live_eligible"&&ky(e,t),e}function Di({strategy:e,bars:t,backtestOptions:r={},trainFraction:n=.7,walkForwardWindows:o=3,minTrades:i=10}={}){let s=[];if(!Ye(e))throw new TypeError("strategy must be a plain object");if(!Array.isArray(t))throw new TypeError("bars must be an array");if(!Ye(r))throw new TypeError("backtestOptions must be a plain object");if(!Wt(n)||n<=0||n>=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=be(e),c=Gt(a),u=Nr(t),l=t.length,d=(F=[],z={})=>nu({status:"fail",strategy:a,sHash:c,barsHash:u,split:z.split||{trainStartIndex:0,trainEndIndex:-1,trainBarCount:0,holdoutStartIndex:0,holdoutEndIndex:-1,holdoutBarCount:0,trainFraction:n},train:z.train||null,holdout:z.holdout||null,walkForward:z.walkForward||{windows:[],passRate:0},flags:[...s,...F]});if(l<10)return d([{type:"insufficient_bars",message:"need at least 10 bars for evidence"}]);let p=Math.floor(l*n),f=p,m=l-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),x,E;try{x=ht(a,h,r),E=ht(a,y,r)}catch(F){return d([{type:"backtest_error",message:String(F.message||F)}])}let _={metrics:Ui(x),costs:ru(x),tradeCount:x.metrics.tradeCount},w={metrics:Ui(E),costs:ru(E),tradeCount:E.metrics.tradeCount},O={trainStartIndex:0,trainEndIndex:p-1,trainBarCount:p,holdoutStartIndex:f,holdoutEndIndex:l-1,holdoutBarCount:m,trainFraction:n},v=[],g=Math.floor(l/(o+1));if(g<3)s.push({type:"invalid_windowing",message:"walk-forward window size too small",wfSize:g});else for(let F=0;F<o;F++){let z=g*(F+1),ie=z,K=Math.min(l,ie+g);if(K-ie<3||z<3){v.push({index:F,trainStartIndex:0,trainEndIndex:z-1,evalStartIndex:ie,evalEndIndex:K-1,passed:!1,reason:"window_too_small",metrics:null});continue}let Ge=t.slice(ie,K),_n;try{_n=ht(a,Ge,r)}catch{v.push({index:F,trainStartIndex:0,trainEndIndex:z-1,evalStartIndex:ie,evalEndIndex:K-1,passed:!1,reason:"backtest_error",metrics:null});continue}let On=Ui(_n),Cn=xy(On,a.risk,i);v.push({index:F,trainStartIndex:0,trainEndIndex:z-1,evalStartIndex:ie,evalEndIndex:K-1,passed:Cn,reason:Cn?"pass":"fail_metrics",metrics:On})}let b=v.filter(F=>F.passed).length,S=v.length===0?0:b/v.length,k={windows:v,passRate:S,windowsRun:v.length};w.metrics.tradeCount===0&&_.metrics.tradeCount===0&&s.push({type:"no_trades",message:"no trades in train or holdout"}),w.metrics.tradeCount===0&&s.push({type:"absent_oos_trades",message:"holdout produced no trades"}),w.metrics.netPnlUsd<0&&s.push({type:"holdout_loss",message:"holdout netPnlUsd is negative"}),_.metrics.netPnlUsd>0&&w.metrics.netPnlUsd<0&&_.metrics.netPnlUsd>Math.abs(w.metrics.netPnlUsd)*.25?s.push({type:"overfit",message:"profitable train with losing holdout (OOS collapse)"}):_.metrics.netPnlUsd>0&&w.metrics.netPnlUsd>0&&w.metrics.netPnlUsd<_.metrics.netPnlUsd*.1&&_.metrics.tradeCount>=i&&s.push({type:"severe_oos_collapse",message:"holdout pnl collapsed vs train"});let N=gy(w.costs),I=wy(E);I>0&&N>I&&s.push({type:"costs_exceed_gross",message:"holdout costs exceed gross gains"});let P=s.some(F=>["insufficient_bars","invalid_windowing","absent_oos_trades","holdout_loss","no_trades","severe_oos_collapse","backtest_error"].includes(F.type)),L=s.some(F=>F.type==="overfit"),H="fail";return w.metrics.tradeCount>=i&&w.metrics.netPnlUsd>0&&w.metrics.profitFactor>1&&w.metrics.maxDrawdownPct<=a.risk.maxDailyLossPct&&S>=.6&&!(I>0&&N>I)&&!L&&!s.some(F=>F.type==="severe_oos_collapse"||F.type==="invalid_windowing")?H="pass_live_eligible":!P&&w.metrics.tradeCount>0&&_.metrics.tradeCount>0&&Number.isFinite(w.metrics.netPnlUsd)?(H="pass_paper_only",w.metrics.tradeCount<i&&s.push({type:"undersampled",message:"holdout trades below minTrades"})):L&&w.metrics.tradeCount>0&&_.metrics.netPnlUsd>0?H="fail":w.metrics.tradeCount>0&&_.metrics.tradeCount>0&&!P?H="pass_paper_only":H="fail",w.metrics.netPnlUsd<0&&(H=H==="pass_live_eligible"?"fail":H==="pass_paper_only"?"pass_paper_only":"fail",H="fail"),nu({status:H,strategy:a,sHash:c,barsHash:u,split:O,train:_,holdout:w,walkForward:k,flags:s})}function nu({status:e,strategy:t,sHash:r,barsHash:n,split:o,train:i,holdout:s,walkForward:a,flags:c}){let u={status:e,strategyHash:r,compilerHash:Tt,barsHash:n,split:o,train:i,holdout:s,walkForward:a,flags:c};return u.id=iu(u),Fi(Ot(JSON.parse(JSON.stringify(u))))}var by,Mi=A(()=>{Rt();Ct();Ln();by=Object.freeze(["fail","pass_paper_only","pass_live_eligible"])});import{createHash as Sy,createHmac as Ey,timingSafeEqual as OI}from"node:crypto";function ji(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(ji).join(",")}]`:`{${Object.keys(e).sort().map(r=>`${JSON.stringify(r)}:${ji(e[r])}`).join(",")}}`}function au(e){let t=String(e?.ORACLE_STAMP_HMAC_SECRET||"").trim();return t.length>=16?t:""}function cu(e=process.env){return au(process.env)||au(e)}function _y(e){let{prepareHash:t,prepareMac:r,note:n,...o}=e||{};return o}function Oy(e){let t=_y(e);return Sy("sha256").update(ji(t)).digest("hex")}function Cy(e,t=cu()){return t?Ey("sha256",t).update(String(e)).digest("hex"):""}function Q(e,{provider:t,kind:r,env:n=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||r,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+vy:Number(i),l=u-c;if(!Number.isSafeInteger(c)||!Number.isSafeInteger(u)||l<=0||l>Iy)throw new Error("stampPrepared: bounded preparedAt/expiresAt required");let p={...a,preparedAt:c,expiresAt:u,prepareVersion:Ay},f=Oy(p),m=cu(n),h=m?Cy(f,m):void 0,y={...p,prepareHash:f};return h&&(y.prepareMac=h),y}var Ay,vy,Iy,xe=A(()=>{Ay=2,vy=300*1e3,Iy=(()=>{let e=Number(process.env.ORACLE_PREPARE_HARD_MAX_AGE_MS);return Number.isFinite(e)&&e>0?e:1800*1e3})()});function Pr(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function Ry(e){return String(e).toLowerCase().replace(/[^a-z0-9]/g,"")}function zi(e,t="value"){if(Array.isArray(e)){e.forEach((r,n)=>zi(r,`${t}[${n}]`));return}if(Pr(e))for(let[r,n]of Object.entries(e)){let o=Ry(r);if(Ty.some(i=>o.includes(i)))throw new Error(`handoff: forbidden secret-like field at ${t}.${r}`);zi(n,`${t}.${r}`)}}function Hi(e){return typeof e=="number"&&Number.isFinite(e)&&e>0}function uu({strategy:e,evidence:t,shadow:r,caps:n,nowMs:o=Date.now(),env:i=process.env}={}){if(zi({strategy:e,evidence:t,shadow:r,caps:n},"handoff"),!Pr(e))throw new Error("handoff: strategy required");if(!Pr(t))throw new Error("handoff: evidence required");if(!Pr(r))throw new Error("handoff: shadow required");if(!Pr(n))throw new Error("handoff: caps required");if(typeof r.id!="string"||!r.id.trim())throw new Error("handoff: shadow.id required");if(typeof r.stateHash!="string"||!/^[0-9a-f]{64}$/.test(r.stateHash))throw new Error("handoff: shadow.stateHash must be a sha256 hash");if(r.status!=="running")throw new Error("handoff: shadow.status must be running");if(!Number.isInteger(r.cursor)||r.cursor<=0)throw new Error("handoff: shadow.cursor must be a positive integer");if(!Number.isInteger(r.updatedAt)||r.updatedAt<=0||r.updatedAt>o)throw new Error("handoff: shadow.updatedAt must be a positive integer <= nowMs");let s=be(e,{nowMs:o}),a=ge(s);if(su(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 n)||n[p]==null)throw new Error(`handoff: caps.${p} required`);if(!Hi(n.perStrategyNotionalUsd))throw new Error("handoff: caps.perStrategyNotionalUsd must be positive");if(n.perStrategyNotionalUsd>a.strategy.risk.maxNotionalUsd)throw new Error("handoff: caps.perStrategyNotionalUsd exceeds strategy.risk.maxNotionalUsd");if(!Hi(n.maxLeverage))throw new Error("handoff: caps.maxLeverage must be positive");if(n.maxLeverage>a.strategy.risk.maxLeverage)throw new Error("handoff: caps.maxLeverage exceeds strategy.risk.maxLeverage");if(!Hi(n.dailyLossCapUsd))throw new Error("handoff: caps.dailyLossCapUsd must be positive");let u=a.strategy.risk.maxNotionalUsd*(a.strategy.risk.maxDailyLossPct/100);if(n.dailyLossCapUsd>u)throw new Error("handoff: caps.dailyLossCapUsd exceeds strategy daily loss ceiling");if(!Array.isArray(n.chainAllowlist)||n.chainAllowlist.length===0)throw new Error("handoff: caps.chainAllowlist must be a non-empty array");if(!n.chainAllowlist.every(p=>p==="hyperliquid"))throw new Error("handoff: caps.chainAllowlist must include only hyperliquid");if(!n.chainAllowlist.includes("hyperliquid"))throw new Error("handoff: caps.chainAllowlist must include hyperliquid");if(!Array.isArray(n.assetAllowlist)||n.assetAllowlist.length===0)throw new Error("handoff: caps.assetAllowlist must be a non-empty array");if(n.assetAllowlist.length!==1||n.assetAllowlist[0]!==a.strategy.market.coin)throw new Error("handoff: caps.assetAllowlist must contain only the strategy market coin");if(!Number.isInteger(n.expiresAt)||!(n.expiresAt>o))throw new Error("handoff: caps.expiresAt must be an integer > nowMs");if(n.expiresAt>a.strategy.risk.expiresAt)throw new Error("handoff: caps.expiresAt exceeds strategy.risk.expiresAt");if(n.killSwitchRequired!==!0)throw new Error("handoff: caps.killSwitchRequired must be exactly true");let l={perStrategyNotionalUsd:n.perStrategyNotionalUsd,maxLeverage:n.maxLeverage,dailyLossCapUsd:n.dailyLossCapUsd,chainAllowlist:[...n.chainAllowlist],assetAllowlist:[...n.assetAllowlist],expiresAt:n.expiresAt,killSwitchRequired:!0},d={strategyHash:a.strategyHash,compilerHash:a.compilerHash,evidence:JSON.parse(JSON.stringify(t)),shadow:{id:r.id,stateHash:r.stateHash,status:r.status,cursor:r.cursor,updatedAt:r.updatedAt},compiled:{strategyHash:a.strategyHash,compilerHash:a.compilerHash,compilerVersion:$r,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 Q(d,{provider:"hl-strategy",kind:"strategy-live-handoff",env:i})}var Ty,lu=A(()=>{Rt();Mi();Ct();xe();Ty=["privatekey","secretkey","seed","mnemonic","passphrase","password","keystore","keymaterial","apikey","authtoken","accesstoken","refreshtoken","credential","bearer","signature","authorization","xprv","xpriv","wif"]});function Kt(e,t){let r=Number(e);if(!Number.isFinite(r))throw new TypeError(`${t} must be finite`);return r}function Xt(e,t){if(!Number.isSafeInteger(e)||e<0)throw new TypeError(`${t} must be a non-negative safe integer`);return e}function qr(e){if(Array.isArray(e))for(let t of e)qr(t);else if(e&&typeof e=="object")for(let t of Object.values(e))qr(t);return Object.freeze(e)}function Py(e){let t=Ny[e];if(!t)throw new TypeError(`unsupported strategy interval: ${e}`);return t}function $y(e,{endTime:t=Number.MAX_SAFE_INTEGER}={}){if(!Array.isArray(e))throw new TypeError("Hyperliquid candles must be an array");Xt(t,"endTime");let r=new Map;for(let n=0;n<e.length;n++){let o=e[n];if(!o||typeof o!="object"||Array.isArray(o))throw new TypeError(`candles[${n}] must be an object`);let i=Xt(Number(o.t),`candles[${n}].t`);if(Xt(Number(o.T),`candles[${n}].T`)>t)continue;let a={t:i,o:Kt(o.o,`candles[${n}].o`),h:Kt(o.h,`candles[${n}].h`),l:Kt(o.l,`candles[${n}].l`),c:Kt(o.c,`candles[${n}].c`),v:Kt(o.v,`candles[${n}].v`)};if(a.h<Math.max(a.o,a.c,a.l))throw new TypeError(`candles[${n}].h is below another price`);if(a.l>Math.min(a.o,a.c,a.h))throw new TypeError(`candles[${n}].l is above another price`);if(a.v<0)throw new TypeError(`candles[${n}].v must be non-negative`);let c=r.get(i);if(c&&JSON.stringify(c)!==JSON.stringify(a))throw new TypeError(`conflicting duplicate candle at timestamp ${i}`);c||r.set(i,a)}return qr([...r.values()].sort((n,o)=>n.t-o.t))}function qy(e,t){if(!Array.isArray(e))throw new TypeError("Hyperliquid funding history must be an array");let r=new Map;for(let n=0;n<e.length;n++){let o=e[n];if(!o||typeof o!="object"||Array.isArray(o))throw new TypeError(`funding[${n}] must be an object`);let i=Xt(Number(o.time),`funding[${n}].time`);i>t||r.set(i,{time:i,fundingRate:Kt(o.fundingRate,`funding[${n}].fundingRate`)})}return[...r.values()].sort((n,o)=>n.time-o.time)}async function Ly({coin:e,startTime:t,endTime:r},n){let o=[],i=Math.max(0,t-288e5),s=!1;for(let a=0;a<16&&i<=r;a++){let c=await tu({coin:e,startTime:i,endTime:r},n);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>=r){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 qy(o,r)}function Uy(e,t,r){let n=0,o=null;return e.map(i=>{let s=i.t+r,a=0;for(;n<t.length&&t[n].time<s;){let c=t[n];o=c.fundingRate,c.time>=i.t&&(a+=c.fundingRate),n+=1}return o==null?{...i,fundingPaymentRate:a}:{...i,fundingRate:o,fundingPaymentRate:a}})}async function du(e,t={}){if(!e||typeof e!="object"||Array.isArray(e))throw new TypeError("strategy history input must be an object");let r=String(e.coin||"").trim().toUpperCase();if(!/^[A-Z0-9][A-Z0-9._-]{0,11}$/.test(r))throw new TypeError("coin must be an uppercase Hyperliquid asset id");let n=String(e.interval||"15m"),o=Py(n);if(e.endTime==null)throw new TypeError("endTime is required for deterministic history");let i=Xt(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):Xt(e.startTime,"startTime");if(a>=i)throw new TypeError("startTime must be before endTime");let[c,u]=await Promise.all([eu({coin:r,interval:n,startTime:a,endTime:i},t),Ly({coin:r,startTime:a,endTime:i},t)]),l=$y(c,{endTime:i}),d=qr(Uy(l,u,o));return qr({coin:r,interval:n,range:{startTime:a,endTime:i},bars:d})}var Ny,pu=A(()=>{qn();Ny=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 Dy(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 r of Object.keys(e))Fy.has(r)||t.push({path:`market.${r}`,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"||!By.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 My(e={}){let t=await Qc(e);if(!t||!Array.isArray(t.universe))throw new TypeError("Hyperliquid market metadata must contain universe");return Object.freeze(t.universe.map((r,n)=>{if(!r||typeof r.name!="string"||!r.name)throw new TypeError(`Hyperliquid market metadata universe[${n}].name is invalid`);return r.name}))}var By,Fy,fu,mu=A(()=>{qn();lu();pu();By=new Set(["1m","3m","5m","15m","30m","1h","2h","4h","8h","12h","1d"]),Fy=new Set(["coin","interval"]);fu=Object.freeze({id:"hyperliquid",validateMarket:Dy,fetchBars:du,listMarkets:My,prepareIntent(e){return uu(e)}})});function Hy(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 jy.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 Vi(e){return typeof e!="string"?null:zy.get(e)??null}function Wi(e){let t=Vi(e);if(!t)throw new Error(`unknown strategy venue: ${String(e)}`);return t}var jy,hu,zy,jI,Gi=A(()=>{mu();jy=Object.freeze(["id","validateMarket","prepareIntent"]);hu=[fu].map(Hy),zy=new Map(hu.map(e=>[e.id,e])),jI=Object.freeze([...hu])});import{createHash as Vy}from"node:crypto";function Ne(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function ne(e){return typeof e=="number"&&Number.isFinite(e)}function Eu(e){return Number.isInteger(e)&&e>0}function Qi(e){if(e==null||typeof e!="object"||Object.isFrozen(e))return e;if(Array.isArray(e)){for(let t of e)Qi(t);return Object.freeze(e)}for(let t of Object.keys(e))Qi(e[t]);return Object.freeze(e)}function Zi(e){if(Array.isArray(e))return e.map(Zi);if(e!=null&&typeof e=="object"){let t={};for(let r of Object.keys(e).sort())t[r]=Zi(e[r]);return t}return e}function T(e,t,r){e.push({path:t,message:r})}function yt(e,t,r,n){for(let o of Object.keys(e))t.has(o)||T(n,r?`${r}.${o}`:o,"unknown field is not allowed")}function _u(e,t,r,n){if(!ne(e)||!ne(t)||!ne(r)||!ne(n)||n<=0||e<t||e>r)return!1;let o=(e-t)/n;if(!Number.isFinite(o))return!1;let i=Math.round(o);return Math.abs(o-i)<=1e-9}function Ji(e,t,r,n){if(Ne(e)){if(yt(e,new Set(["param"]),t,n),typeof e.param!="string"||!e.param)return T(n,`${t}.param`,"must be a parameter name string"),null;if(!Object.prototype.hasOwnProperty.call(r,e.param))return T(n,`${t}.param`,`unknown parameter "${e.param}"`),null;let o=r[e.param];return!Ne(o)||![o.value,o.min,o.max,o.step].every(Eu)?(T(n,`${t}.param`,"referenced period parameter value min max and step must be positive integers"),null):{param:e.param}}return Eu(e)?e:(T(n,t,"must be a positive integer or {param}"),null)}function Au(e,t,r,n){return Ne(e)?(yt(e,new Set(["param"]),t,n),typeof e.param!="string"||!e.param?(T(n,`${t}.param`,"must be a parameter name string"),null):Object.prototype.hasOwnProperty.call(r,e.param)?{param:e.param}:(T(n,`${t}.param`,`unknown parameter "${e.param}"`),null)):ne(e)?e:(T(n,t,"must be a finite number or {param}"),null)}function Un(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 eb(e){let t=new Map,r=n=>{let o=t.get(n)||0;if(o===1)return!0;if(o===2)return!1;t.set(n,1);let i=e.get(n);if(i){for(let s of Un(i))if(e.has(s)&&r(s))return!0}return t.set(n,2),!1};for(let n of e.keys())if(r(n))return!0;return!1}function tb(e,t){if(!Ne(e))return T(t,"parameters","must be a plain object"),null;let r=Object.keys(e);if(r.length>xu)return T(t,"parameters",`too many parameters (max ${xu})`),null;let n={};for(let o of r){if(!vu.test(o)){T(t,`parameters.${o}`,"parameter name is malformed");continue}let i=e[o],s=`parameters.${o}`;if(!Ne(i)){T(t,s,"must be a plain object");continue}yt(i,bu,s,t);for(let d of bu)d in i||T(t,`${s}.${d}`,"required field is missing");let{value:a,min:c,max:u,step:l}=i;ne(c)||T(t,`${s}.min`,"must be a finite number"),ne(u)||T(t,`${s}.max`,"must be a finite number"),(!ne(l)||l<=0)&&T(t,`${s}.step`,"must be a positive finite number"),ne(a)||T(t,`${s}.value`,"must be a finite number"),ne(c)&&ne(u)&&c>u&&T(t,`${s}.min`,"min must be <= max"),ne(a)&&ne(c)&&ne(u)&&ne(l)&&l>0&&(_u(a,c,u,l)||T(t,`${s}.value`,"value must lie on the declared min/max/step grid")),n[o]={value:a,min:c,max:u,step:l}}return n}function rb(e,t,r,n){let o=`nodes.${t}`;if(!Ne(e))return T(n,o,"must be a plain object"),null;if(typeof e.type!="string"||!wu[e.type])return T(n,`${o}.type`,"unknown or missing node type"),yt(e,Zy,o,n),null;switch(yt(e,wu[e.type],o,n),(typeof e.id!="string"||!Iu.test(e.id))&&T(n,`${o}.id`,"must be a 1-64 char id starting with alphanumeric"),e.type){case"input":return(typeof e.field!="string"||!Wy.has(e.field))&&T(n,`${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=Au(e.value,`${o}.value`,r,n);return{id:e.id,type:"constant",value:i}}case"indicator":{(typeof e.indicator!="string"||!Gy.has(e.indicator))&&T(n,`${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?T(n,`${o}.input`,"must be a node id string when provided"):s.input=e.input);let a=Ji(e.period,`${o}.period`,r,n);a!=null&&(s.period=a)}else typeof e.input!="string"||!e.input?T(n,`${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))T(n,`${o}.period`,"required field is missing");else{let a=Ji(e.period,`${o}.period`,r,n);a!=null&&(s.period=a)}if(i==="macd"){for(let a of["fastPeriod","slowPeriod","signalPeriod"])if(!(a in e))T(n,`${o}.${a}`,"required field is missing");else{let c=Ji(e[a],`${o}.${a}`,r,n);c!=null&&(s[a]=c)}"output"in e?Jy.has(e.output)?s.output=e.output:T(n,`${o}.output`,"must be line|signal|histogram"):T(n,`${o}.output`,"required field is missing"),"period"in e&&T(n,`${o}.period`,"forbidden for macd"),"stdDev"in e&&T(n,`${o}.stdDev`,"forbidden for macd")}else if(i==="bollinger"){if(!("stdDev"in e))T(n,`${o}.stdDev`,"required field is missing");else{let a=Au(e.stdDev,`${o}.stdDev`,r,n);a!=null&&(typeof a=="number"&&a<=0?T(n,`${o}.stdDev`,"must be > 0"):s.stdDev=a)}"output"in e?Qy.has(e.output)?s.output=e.output:T(n,`${o}.output`,"must be upper|middle|lower"):T(n,`${o}.output`,"required field is missing");for(let a of["fastPeriod","slowPeriod","signalPeriod"])a in e&&T(n,`${o}.${a}`,`forbidden for ${i}`)}else{"output"in e&&T(n,`${o}.output`,`forbidden for ${i}`),"stdDev"in e&&i!=="bollinger"&&T(n,`${o}.stdDev`,`forbidden for ${i}`);for(let a of["fastPeriod","slowPeriod","signalPeriod"])a in e&&T(n,`${o}.${a}`,`forbidden for ${i}`)}return s}case"compare":return(typeof e.op!="string"||!Ky.has(e.op))&&T(n,`${o}.op`,"must be gt|gte|lt|lte|eq"),(typeof e.left!="string"||!e.left)&&T(n,`${o}.left`,"must be a node id"),(typeof e.right!="string"||!e.right)&&T(n,`${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"||!Xy.has(e.op))&&T(n,`${o}.op`,"must be and|or|not"),!Array.isArray(e.inputs))return T(n,`${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?T(n,`${o}.inputs.${s}`,"must be a node id"):i.push(a)}return e.op==="not"?i.length!==1&&T(n,`${o}.inputs`,"not requires exactly one input"):(e.op==="and"||e.op==="or")&&i.length<2&&T(n,`${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"||!Yy.has(e.direction))&&T(n,`${o}.direction`,"must be above|below"),(typeof e.left!="string"||!e.left)&&T(n,`${o}.left`,"must be a node id"),(typeof e.right!="string"||!e.right)&&T(n,`${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 nb(e,t,r){if(!Ne(e))return T(t,"risk","must be a plain object"),null;yt(e,gu,"risk",t);for(let p of gu)(!(p in e)||e[p]==null)&&T(t,`risk.${p}`,"required field is missing");let n={},o=e.maxLeverage;!ne(o)||o<=0||o>50?T(t,"risk.maxLeverage","must be a number > 0 and <= 50"):n.maxLeverage=o;let i=e.maxNotionalUsd;!ne(i)||i<=0?T(t,"risk.maxNotionalUsd","must be a number > 0"):n.maxNotionalUsd=i;let s=e.positionSizePct;!ne(s)||s<=0||s>100?T(t,"risk.positionSizePct","must be a number > 0 and <= 100"):n.positionSizePct=s;let a=e.stopLossPct;!ne(a)||a<=0||a>100?T(t,"risk.stopLossPct","must be a number > 0 and <= 100"):n.stopLossPct=a;let c=e.takeProfitPct;!ne(c)||c<=0||c>1e3?T(t,"risk.takeProfitPct","must be a number > 0 and <= 1000"):n.takeProfitPct=c;let u=e.cooldownBars;!Number.isInteger(u)||u<0||u>1e5?T(t,"risk.cooldownBars","must be an integer >= 0 and <= 100000"):n.cooldownBars=u;let l=e.maxDailyLossPct;!ne(l)||l<=0||l>100?T(t,"risk.maxDailyLossPct","must be a number > 0 and <= 100"):n.maxDailyLossPct=l;let d=e.expiresAt;return!Number.isInteger(d)||d<=0?T(t,"risk.expiresAt","must be an integer epoch milliseconds > 0"):(r.nowMs!==void 0&&(Number.isInteger(r.nowMs)?d<=r.nowMs&&T(t,"risk.expiresAt","must be strictly greater than nowMs"):T(t,"nowMs","must be an integer epoch milliseconds")),n.expiresAt=d),n}function es(e,t={}){let r=[];if(!Ne(e))return T(r,"","strategy must be a plain object"),{ok:!1,errors:r,strategy:null};yt(e,yu,"",r);for(let d of yu)(!(d in e)||e[d]==null)&&T(r,d,"required field is missing");e.version!==Ki&&T(r,"version",`must be ${Ki}`),(typeof e.id!="string"||!vu.test(e.id))&&T(r,"id","must match /^[a-z0-9][a-z0-9._-]{0,63}$/"),(typeof e.name!="string"||e.name.length===0||e.name.length>Su)&&T(r,"name",`must be a non-empty string max ${Su}`);let n=Vi(e.venue);n||T(r,"venue",`unknown strategy venue "${String(e.venue)}"`);let o=null;if(!n)Ne(e.market)||T(r,"market","must be a plain object");else{let d=n.validateMarket(e.market);if(!d||typeof d.ok!="boolean"||!Array.isArray(d.errors))T(r,"market",`venue ${n.id} returned an invalid market validation result`);else if(d.ok)o=d.market;else for(let p of d.errors)T(r,p.path,p.message)}let i=tb(e.parameters,r),s=null,a=new Map;if(!Array.isArray(e.nodes))T(r,"nodes","must be an array");else if(e.nodes.length>ku)T(r,"nodes",`too many nodes (max ${ku})`);else{s=[];for(let d=0;d<e.nodes.length;d++){let p=rb(e.nodes[d],d,i||{},r);p&&(typeof p.id=="string"&&Iu.test(p.id)&&(a.has(p.id)?T(r,`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 Un(p))a.has(m)||T(r,f,`unknown node ref "${m}"`);if(p.type==="indicator"||p.type==="compare"||p.type==="cross")for(let m of Un(p)){let h=a.get(m);h&&Xi.has(h.type)&&T(r,f,`node ref "${m}" must be numeric`)}if(p.type==="logic")for(let m of Un(p)){let h=a.get(m);h&&!Xi.has(h.type)&&T(r,f,`node ref "${m}" must be boolean`)}}eb(a)&&T(r,"nodes","graph contains a cycle")}let c=null;if(!Ne(e.rules))T(r,"rules","must be a plain object");else{yt(e.rules,Yi,"rules",r);for(let d of Yi)d in e.rules||T(r,`rules.${d}`,"required field is missing");c={};for(let d of Yi){let p=e.rules[d];if(p===null){c[d]=null;continue}if(typeof p!="string"||!p){T(r,`rules.${d}`,"must be a node id or null"),c[d]=p;continue}if(!a.has(p)){T(r,`rules.${d}`,`unknown node ref "${p}"`),c[d]=p;continue}let f=a.get(p);Xi.has(f.type)||T(r,`rules.${d}`,`rule must reference a boolean node, not ${f.type}`),c[d]=p}}let u=nb(e.risk,r,t);if(r.length)return{ok:!1,errors:r,strategy:null};let l=Qi({version:Ki,id:e.id,name:e.name,venue:n.id,market:o,parameters:i,nodes:s,rules:c,risk:u});return{ok:!0,errors:[],strategy:l}}function be(e,t={}){let r=es(e,t);if(!r.ok)throw new Yt(r.errors);return r.strategy}function ob(e){let t=be(e);return JSON.stringify(Zi(t))}function Gt(e){let t=ob(e);return Vy("sha256").update(t,"utf8").digest("hex")}function Lr(e,t){if(!Ne(e))throw new Yt([{path:"",message:"strategy must be a plain object"}]);if(!Ne(t))throw new Yt([{path:"overrides",message:"must be a plain object"}]);let r=be(e),n={};for(let[i,s]of Object.entries(r.parameters))n[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(n,i)){T(o,i,`unknown parameter "${i}"`);continue}let a=n[i];if(!ne(s)){T(o,i,"override must be a finite number");continue}if(!_u(s,a.min,a.max,a.step)){T(o,i,"override must lie on the declared min/max/step grid");continue}n[i]={...a,value:s}}if(o.length)throw new Yt(o);return be({version:r.version,id:r.id,name:r.name,venue:r.venue,market:{coin:r.market.coin,interval:r.market.interval},parameters:n,nodes:r.nodes.map(i=>{let s={...i};return Array.isArray(i.inputs)&&(s.inputs=[...i.inputs]),s}),rules:{...r.rules},risk:{...r.risk}})}var Ki,vu,Iu,Wy,Gy,Ky,Xy,Yy,Jy,Qy,Xi,yu,bu,Yi,gu,Zy,wu,xu,ku,Su,Yt,Ct=A(()=>{Gi();Ki=1,vu=/^[a-z0-9][a-z0-9._-]{0,63}$/,Iu=/^[A-Za-z0-9][A-Za-z0-9._-]{0,63}$/,Wy=new Set(["open","high","low","close","volume","fundingRate","openInterest","premium","oiDelta","bookImbalance"]),Gy=new Set(["sma","ema","rsi","macd","bollinger","atr"]),Ky=new Set(["gt","gte","lt","lte","eq"]),Xy=new Set(["and","or","not"]),Yy=new Set(["above","below"]),Jy=new Set(["line","signal","histogram"]),Qy=new Set(["upper","middle","lower"]),Xi=new Set(["compare","logic","cross"]),yu=new Set(["version","id","name","venue","market","parameters","nodes","rules","risk"]),bu=new Set(["value","min","max","step"]),Yi=new Set(["entryLong","entryShort","exitLong","exitShort"]),gu=new Set(["maxLeverage","maxNotionalUsd","positionSizePct","stopLossPct","takeProfitPct","cooldownBars","maxDailyLossPct","expiresAt"]),Zy=new Set(["id","type"]),wu={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"])},xu=16,ku=128,Su=100,Yt=class extends Error{constructor(t){let r=t.map(n=>`${n.path}: ${n.message}`);super(`invalid strategy (${t.length} error${t.length===1?"":"s"}): ${r.join("; ")}`),this.name="StrategyValidationError",this.errors=t}}});function Ur(e){if(!Array.isArray(e))throw new TypeError("values must be an array");for(let t=0;t<e.length;t++){let r=e[t];if(typeof r!="number"||!Number.isFinite(r))throw new TypeError(`values[${t}] must be a finite number`)}}function bt(e){if(!Number.isInteger(e)||e<=0)throw new TypeError("period must be a positive integer")}function ib(e){if(!Array.isArray(e))throw new TypeError("bars must be an array");for(let t=0;t<e.length;t++){let r=e[t];if(r==null||typeof r!="object")throw new TypeError(`bars[${t}] must be an object`);for(let n of["o","h","l","c"]){let o=r[n];if(typeof o!="number"||!Number.isFinite(o))throw new TypeError(`bars[${t}].${n} must be a finite number`)}if(r.h<r.l)throw new TypeError(`bars[${t}] high must be >= low`)}}function Cu(e,t){Ur(e),bt(t);let r=new Array(e.length).fill(null);if(e.length<t)return r;let n=0;for(let o=0;o<e.length;o++)n+=e[o],o>=t&&(n-=e[o-t]),o>=t-1&&(r[o]=n/t);return r}function Bn(e,t){Ur(e),bt(t);let r=new Array(e.length).fill(null);if(e.length<t)return r;let n=0;for(let s=0;s<t;s++)n+=e[s];let o=n/t;r[t-1]=o;let i=2/(t+1);for(let s=t;s<e.length;s++)o=i*e[s]+(1-i)*o,r[s]=o;return r}function Tu(e,t){Ur(e),bt(t);let r=new Array(e.length).fill(null);if(e.length<=t)return r;let n=0,o=0;for(let a=1;a<=t;a++){let c=e[a]-e[a-1];c>=0?n+=c:o-=c}let i=n/t,s=o/t;r[t]=Ou(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,r[a]=Ou(i,s)}return r}function Ou(e,t){return e===0&&t===0?50:t===0?100:e===0?0:100-100/(1+e/t)}function Ru(e,t={}){Ur(e);let r=t.fastPeriod,n=t.slowPeriod,o=t.signalPeriod;if(bt(r),bt(n),bt(o),r>=n)throw new TypeError("fastPeriod must be < slowPeriod");let i=Bn(e,r),s=Bn(e,n),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 h=0;h<o;h++)d+=a[l[h]];let p=d/o,f=l[o-1];c[f]=p,u[f]=a[f]-p;let m=2/(o+1);for(let h=o;h<l.length;h++){let y=l[h];p=m*a[y]+(1-m)*p,c[y]=p,u[y]=a[y]-p}}return{line:a,signal:c,histogram:u}}function Nu(e,t={}){Ur(e);let r=t.period,n=t.stdDev;if(bt(r),typeof n!="number"||!Number.isFinite(n)||n<=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<r)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>=r){let d=e[u-r];a-=d,c-=d*d}if(u>=r-1){let d=a/r,p=c/r-d*d;p<0&&p>-1e-12&&(p=0);let f=Math.sqrt(p);o[u]=d,i[u]=d+n*f,s[u]=d-n*f}}return{upper:i,middle:o,lower:s}}function Pu(e,t){ib(e),bt(t);let r=new Array(e.length).fill(null);if(e.length<t)return r;let n=new Array(e.length);for(let s=0;s<e.length;s++){let a=e[s];if(s===0)n[s]=a.h-a.l;else{let c=e[s-1].c;n[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+=n[s];let i=o/t;r[t-1]=i;for(let s=t;s<e.length;s++)i=(i*(t-1)+n[s])/t,r[s]=i;return r}var $u=A(()=>{});import{createHash as sb}from"node:crypto";var ts,ab,cb,ub,qu,Lu=A(()=>{ts=3,ab="7477966facc4ef928a94e6221c8fd238eef4fcbeec46b96ae1b89178e13c2d5f",cb="68f5b412a9975f04024cf9b9b6209b4bccedd52f176e95f34f786b3f53479c6a",ub="967fd45ecddd0d59ac0f662fe92ea813c32620ba751f249b4ace6cb6b809fb5e",qu=sb("sha256").update(JSON.stringify({version:ts,compilerSourceHash:ab,indicatorsSourceHash:cb,schemaSourceHash:ub})).digest("hex")});function _e(e){return typeof e=="number"&&Number.isFinite(e)}function pb(e){let t=new Map(e.map(a=>[a.id,a])),r=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[]}},n=new Map,o=new Map;for(let a of e)n.set(a.id,0),o.set(a.id,[]);for(let a of e)for(let c of r(a))t.has(c)&&(o.get(c).push(a.id),n.set(a.id,n.get(a.id)+1));let i=[];for(let[a,c]of n)c===0&&i.push(a);let s=[];for(;i.length;){let a=i.shift();s.push(a);for(let c of o.get(a))n.set(c,n.get(c)-1),n.get(c)===0&&i.push(c)}if(s.length!==e.length)throw new Error("strategy graph is cyclic");return s}function Jt(e,t){return e!=null&&typeof e=="object"&&"param"in e?t[e.param].value:e}function fb(e,t,r){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 n=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(!_e(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",u],["c",l],["v",d]])if(!_e(f))throw new TypeError(`bars[${o}].${p} must be a finite number`);for(let[p,f]of[["o",a],["h",c],["l",u],["c",l]])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,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(n!=null){if(!(s>n))throw new TypeError("bars t must be strictly increasing");if(s-n!==db[r])throw new TypeError(`bars t must match ${r} cadence`)}if(n=s,"fundingRate"in i&&i.fundingRate!=null&&!_e(i.fundingRate))throw new TypeError(`bars[${o}].fundingRate must be finite when present`);if("openInterest"in i&&i.openInterest!=null){if(!_e(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&&!_e(i[p]))throw new TypeError(`bars[${o}].${p} must be finite when present`);if("bookImbalance"in i&&i.bookImbalance!=null){if(!_e(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 Nt(e,t,r,n,o,i){if(i.has(e))return i.get(e);let s=t.get(e),a;switch(s.type){case"input":{let c=lb[s.field];a=new Array(o+1);for(let u=0;u<=o;u++){let l=n[u][c];a[u]=l===void 0?null:l}break}case"constant":{let c=Jt(s.value,r);a=new Array(o+1).fill(c);break}case"indicator":{let c=s.period!=null?Jt(s.period,r):void 0;if(s.indicator==="atr"){let d=[];for(let p=0;p<=o;p++){let f=n[p];d.push({o:f.o,h:f.h,l:f.l,c:f.c})}a=Pu(d,c);break}let l=Nt(s.input,t,r,n,o,i).map((d,p)=>{if(d==null||!_e(d))throw new TypeError(`indicator input ${s.input} has non-finite value at ${p}`);return d});if(s.indicator==="sma")a=Cu(l,c);else if(s.indicator==="ema")a=Bn(l,c);else if(s.indicator==="rsi")a=Tu(l,c);else if(s.indicator==="macd")a=Ru(l,{fastPeriod:Jt(s.fastPeriod,r),slowPeriod:Jt(s.slowPeriod,r),signalPeriod:Jt(s.signalPeriod,r)})[s.output];else if(s.indicator==="bollinger")a=Nu(l,{period:c,stdDev:Jt(s.stdDev,r)})[s.output];else throw new Error(`unsupported indicator ${s.indicator}`);break}case"compare":{let c=Nt(s.left,t,r,n,o,i),u=Nt(s.right,t,r,n,o,i);a=new Array(o+1);for(let l=0;l<=o;l++){let d=c[l],p=u[l];if(d==null||p==null||!_e(d)||!_e(p)){a[l]=!1;continue}switch(s.op){case"gt":a[l]=d>p;break;case"gte":a[l]=d>=p;break;case"lt":a[l]=d<p;break;case"lte":a[l]=d<=p;break;case"eq":a[l]=d===p;break;default:a[l]=!1}}break}case"logic":{let c=s.inputs.map(u=>Nt(u,t,r,n,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=Nt(s.left,t,r,n,o,i),u=Nt(s.right,t,r,n,o,i);a=new Array(o+1),a[0]=!1;for(let l=1;l<=o;l++){let d=c[l-1],p=u[l-1],f=c[l],m=u[l];if(d==null||p==null||f==null||m==null||!_e(d)||!_e(p)||!_e(f)||!_e(m)){a[l]=!1;continue}s.direction==="above"?a[l]=d<=p&&f>m:a[l]=d>=p&&f<m}break}default:throw new Error(`unknown node type ${s.type}`)}return i.set(e,a),a}function ge(e,t={}){let r=be(e);t&&Object.keys(t).length&&(r=Lr(r,t));let n=new Map(r.nodes.map(f=>[f.id,f])),o=Object.freeze(pb(r.nodes)),i=r.parameters,s=new Set(r.nodes.filter(f=>f.type==="input").map(f=>f.field));if(r.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=Gt(r);function u(f,m){let h={};for(let x of o){let E=f.get(x);h[x]=E[m]}let y=x=>x!=null&&h[x]===!0;return{values:h,signals:{entryLong:y(r.rules.entryLong),entryShort:y(r.rules.entryShort),exitLong:y(r.rules.exitLong),exitShort:y(r.rules.exitShort)}}}function l(f,m){fb(f,m,r.market.interval);let h=new Map;for(let y of o)Nt(y,n,i,f,m,h);return h}function d(f,m){return u(l(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=l(f,m);return Object.freeze(f.map((y,x)=>Object.freeze(u(h,x))))}return Object.freeze({strategy:r,strategyHash:c,compilerVersion:$r,compilerHash:Tt,requiredSeries:a,nodeOrder:o,evaluate:d,evaluateAll:p})}var $r,Tt,lb,db,Rt=A(()=>{Ct();$u();Lu();$r=ts,Tt=qu,lb=Object.freeze({open:"o",high:"h",low:"l",close:"c",volume:"v",fundingRate:"fundingRate",openInterest:"openInterest",premium:"premium",oiDelta:"oiDelta",bookImbalance:"bookImbalance"}),db=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 mb}from"node:crypto";function yb(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function Je(e){return typeof e=="number"&&Number.isFinite(e)}function rs(e){if(e==null||typeof e!="object"||Object.isFrozen(e))return e;if(Array.isArray(e)){for(let t of e)rs(t);return Object.freeze(e)}for(let t of Object.keys(e))rs(e[t]);return Object.freeze(e)}function Fn(e){if(Array.isArray(e))return e.map(Fn);if(e!=null&&typeof e=="object"){let t={};for(let r of Object.keys(e).sort())t[r]=Fn(e[r]);return t}return e}function ns(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((r,n)=>ns(r,`${t}[${n}]`));return}for(let[r,n]of Object.entries(e))ns(n,`${t}.${r}`)}}function Bu(e){if(!Array.isArray(e)||e.length===0)throw new TypeError("bars must be a non-empty array");let t=null;for(let r=0;r<e.length;r++){let n=e[r];if(n==null||typeof n!="object"||Array.isArray(n))throw new TypeError(`bars[${r}] must be an object`);let{t:o,o:i,h:s,l:a,c,v:u}=n;if(!Je(o))throw new TypeError(`bars[${r}].t must be finite`);for(let[l,d]of[["o",i],["h",s],["l",a],["c",c],["v",u]])if(!Je(d))throw new TypeError(`bars[${r}].${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[${r}].${l} price must be positive`);if(u<0)throw new TypeError(`bars[${r}].v volume must be non-negative`);if(s<Math.max(i,c,a))throw new TypeError(`bars[${r}] high must be >= max(open, close, low)`);if(a>Math.min(i,c,s))throw new TypeError(`bars[${r}] 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 n&&n.fundingRate!=null&&!Je(n.fundingRate))throw new TypeError(`bars[${r}].fundingRate must be finite when present`);if("fundingPaymentRate"in n&&n.fundingPaymentRate!=null&&!Je(n.fundingPaymentRate))throw new TypeError(`bars[${r}].fundingPaymentRate must be finite when present`);if("openInterest"in n&&n.openInterest!=null&&!Je(n.openInterest))throw new TypeError(`bars[${r}].openInterest must be finite when present`)}}function Nr(e){if(!Array.isArray(e))throw new TypeError("bars must be an array");return e.length>0&&Bu(e),mb("sha256").update(JSON.stringify(Fn(e)),"utf8").digest("hex")}function bb(e){if(e==null&&(e={}),!yb(e))throw new TypeError("options must be a plain object");let t={...hb},r=new Set(["initialEquityUsd","takerFeeBps","builderFeeBps","slippageBps","latencyBars","maxVolumeParticipationPct","nowMs"]);for(let n of Object.keys(e))if(!r.has(n))throw new TypeError(`unknown option "${n}"`);if("initialEquityUsd"in e){if(!Je(e.initialEquityUsd)||e.initialEquityUsd<=0)throw new TypeError("initialEquityUsd must be a positive finite number");t.initialEquityUsd=e.initialEquityUsd}for(let n of["takerFeeBps","builderFeeBps","slippageBps"])if(n in e){let o=e[n];if(!Je(o)||o<0)throw new TypeError(`${n} must be a finite number >= 0`);if(n==="slippageBps"?o>=1e4:o>1e4)throw new TypeError(`${n} exceeds its safe basis-point bound`);t[n]=o}if("latencyBars"in e){let n=e.latencyBars;if(!Number.isInteger(n)||n<1)throw new TypeError("latencyBars must be an integer >= 1");t.latencyBars=n}if("maxVolumeParticipationPct"in e){let n=e.maxVolumeParticipationPct;if(!Je(n)||n<=0||n>100)throw new TypeError("maxVolumeParticipationPct must be in (0,100]");t.maxVolumeParticipationPct=n}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 Dn(e){return e/1e4}function gb(e,t,r){let n=Dn(r);return t==="long"?e*(1+n):e*(1-n)}function wb(e,t,r){let n=Dn(r);return t==="long"?e*(1-n):e*(1+n)}function Uu(e,t,r){let n=Math.abs(e)*Dn(t),o=Math.abs(e)*Dn(r);return{taker:n,builder:o,total:n+o}}function xb(e,t){let r=e*(t.positionSizePct/100)*t.maxLeverage;return Math.min(r,t.maxNotionalUsd)}function kb(e,t,r){let n=r/100;return t==="long"?e*(1-n):e*(1+n)}function Sb(e,t,r){let n=r/100;return t==="long"?e*(1+n):e*(1-n)}function Eb(e,t,r,n){if(!(r>0))return t==="long"?0:Number.POSITIVE_INFINITY;let o=Math.min(.99,1/(2*r)+n/1e4);return t==="long"?e*(1-1/r)/(1-o):e*(1+1/r)/(1+o)}function Ab(e,t,r){return t==="long"?e.l<=r:e.h>=r}function vb(e,t,r){return t==="long"?e.h>=r:e.l<=r}function Ib(e,t,r){return t==="long"?e.l<=r:e.h>=r}function Br(e,t){for(let r of e.requiredSeries)if(_b.includes(r)&&!t.every(n=>Je(n?.[r])))throw new Error(`strategy required series is absent: ${r}`)}function Ob(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 r=0;for(let s of t)r+=s;let n=r/t.length,o=0;for(let s of t)o+=(s-n)**2;let i=Math.sqrt(o/(t.length-1));return i>0?n/i:0}function Cb(e){let t=-1/0,r=0;for(let n of e){let o=n.equity;if(o>t&&(t=o),t>0){let i=(t-o)/t*100;i>r&&(r=i)}}return r}function ht(e,t,r={}){let n=bb(r);Bu(t);let o=Nr(t);n.nowMs!==void 0&&be(e,{nowMs:n.nowMs});let i=ge(e);if(Br(i,t),n.nowMs!==void 0&&i.strategy.risk.expiresAt<=n.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=n.latencyBars,u=n.slippageBps,l=n.takerFeeBps,d=n.builderFeeBps,p=n.initialEquityUsd,f=0,m=0,h=0,y=0,x=0,E=[],_=[],w=[],O=[],v=[],g=null,b=0,S=null,k=p,N=!1,I=0,P=0,L=[],H=new Array(t.length).fill(0);function X(R){L.push(R)}function F(R){let M=t[R].v*(n.maxVolumeParticipationPct/100);return Math.max(0,M-H[R])}function z(R){if(!g)return p;let M=g.side==="long"?(R-g.entryPrice)*g.qty:(g.entryPrice-R)*g.qty;return p+M}function ie(R,M,$){let ee=$.o,V=xb(p,s);if(!(V>0)||!(ee>0))return;let te=gb(ee,M,u),J=V/te,se=F(R),Ar=te*se;if(J>se){w.push({kind:"entry",barIndex:R,time:$.t,side:M,requestedNotionalUsd:V,maxFillNotionalUsd:Ar,reason:"volume_participation"});return}H[R]+=J;let Ke=Math.abs(te-ee)*J,ot=Uu(V,l,d);p-=ot.total,f+=ot.taker,m+=ot.builder,y+=Ke,x+=V,g={lifecycleEpoch:++P,side:M,entryBarIndex:R,entryReferencePrice:ee,entryPrice:te,qty:J,notionalUsd:V,stop:kb(te,M,s.stopLossPct),take:Sb(te,M,s.takeProfitPct),liq:Eb(te,M,s.maxLeverage,l+d),entryFees:ot.taker,entryBuilderFees:ot.builder,entrySlippageUsd:Ke,fundingAccrued:0}}function K(R,M,$,ee){if(!g)return!1;let V=g.side,te=M,J=te;$!=="liquidation"&&ee&&(J=wb(te,V,u));let se=g.qty,Ar=se*J;if($!=="liquidation"){let _c=F(R),l0=J*_c;if(se>_c)return w.push({kind:"exit",barIndex:R,time:t[R].t,side:V,requestedNotionalUsd:Ar,maxFillNotionalUsd:l0,reason:"volume_participation",triggerReason:$}),!1;H[R]+=se}let Ke=Uu(Ar,l,d),ot=$==="liquidation"?0:Math.abs(J-te)*se,vr,Si;V==="long"?(vr=(te-g.entryReferencePrice)*se,Si=(J-g.entryPrice)*se):(vr=(g.entryReferencePrice-te)*se,Si=(g.entryPrice-J)*se),p+=Si,p-=Ke.total,f+=Ke.taker,m+=Ke.builder,y+=ot,x+=Ar;let u0={side:V,entryBarIndex:g.entryBarIndex,entryTime:t[g.entryBarIndex].t,entryPrice:g.entryPrice,exitBarIndex:R,exitTime:t[R].t,exitPrice:J,exitReason:$,qty:se,notionalUsd:g.notionalUsd,grossPnlUsd:vr,feesUsd:g.entryFees+Ke.taker,builderFeesUsd:g.entryBuilderFees+Ke.builder,fundingUsd:g.fundingAccrued,slippageUsd:g.entrySlippageUsd+ot,netPnlUsd:vr-(g.entryFees+Ke.taker+g.entryBuilderFees+Ke.builder)-g.fundingAccrued-(g.entrySlippageUsd+ot)};return E.push(u0),$==="liquidation"&&_.push({barIndex:R,time:t[R].t,side:V,price:J,tradeIndex:E.length-1}),g=null,P+=1,I=R+1+(s.cooldownBars||0),!0}function Ge(R,M,$,ee){let V=R+1;if(V>=t.length)return;L.some(J=>J.kind==="exit"&&J.side===M&&J.fillBar===V&&J.epoch===ee)||X({kind:"exit",side:M,signalBar:R,fillBar:V,reason:$,epoch:ee})}function _n(R){let M=L.filter($=>$.fillBar===R);for(let $=L.length-1;$>=0;$--)L[$].fillBar===R&&L.splice($,1);M.sort(($,ee)=>{let V=te=>te.kind==="exit"?0:1;return V($)-V(ee)});for(let $ of M)if($.kind==="exit"){if(!g||g.side!==$.side||g.lifecycleEpoch!==$.epoch)continue;let ee=$.reason||"rule";K(R,t[R].o,ee,!0)||Ge(R,$.side,ee,$.epoch)}else if($.kind==="entry"){if(g||$.epoch!==P||R<I)continue;ie(R,$.side,t[R])}}function On(R){if(!g)return;let M=t[R],$=M.fundingPaymentRate;if($==null||!Je($)||$===0)return;let ee=Math.abs(g.qty*M.c),V=$*ee;g.side==="long"?(p-=V,g.fundingAccrued+=V,h+=V):(p+=V,g.fundingAccrued-=V,h-=V)}function Cn(R){if(!g)return;let M=t[R].o;(g.side==="long"?M<=g.liq:M>=g.liq)&&K(R,M,"liquidation",!1)}function Sc(R){if(!g)return;let M=t[R],$=g.side,ee=Ib(M,$,g.liq),V=Ab(M,$,g.stop),te=vb(M,$,g.take),J=se=>$==="long"?Math.min(se,M.o):Math.max(se,M.o);if(ee){K(R,J(g.liq),"liquidation",!1);return}if(V&&te){K(R,J(g.stop),"stop_loss",!0)||Ge(R,$,"stop_loss",g.lifecycleEpoch);return}if(V){K(R,J(g.stop),"stop_loss",!0)||Ge(R,$,"stop_loss",g.lifecycleEpoch);return}te&&(K(R,g.take,"take_profit",!0)||Ge(R,$,"take_profit",g.lifecycleEpoch))}for(let R=0;R<t.length;R++){let M=Math.floor(t[R].t/864e5);M!==S&&(S=M,k=z(t[R].o),N=!1),Cn(R),_n(R),Sc(R),On(R),!N&&z(t[R].c)<=k*(1-s.maxDailyLossPct/100)&&(N=!0,O.push({type:"daily_loss_limit",barIndex:R,time:t[R].t,message:"daily loss limit reached; new entries blocked for UTC day"}));let $=a[R].signals,ee=R+c;if(g)(g.side==="long"&&$.exitLong===!0||g.side==="short"&&$.exitShort===!0)&&ee<t.length&&(L.some(se=>se.kind==="exit"&&se.side===g.side&&se.fillBar===ee&&se.epoch===g.lifecycleEpoch)||X({kind:"exit",side:g.side,signalBar:R,fillBar:ee,reason:"rule",epoch:g.lifecycleEpoch}));else{let te=$.entryLong===!0,J=$.entryShort===!0;te&&J?O.push({type:"conflicting_entry_signals",barIndex:R,time:t[R].t,message:"conflicting entry signals; no position opened"}):!N&&(te||J)&&ee<t.length&&R>=I&&X({kind:"entry",side:te?"long":"short",signalBar:R,fillBar:ee,epoch:P})}let V=p;g&&(b+=1,V=z(t[R].c)),v.push({barIndex:R,time:t[R].t,equity:V,positionSide:g?g.side:null})}let Ec=null;if(g){let R=t.length-1;if(K(R,t[R].c,"end_of_data",!0))v[R]={barIndex:R,time:t[R].t,equity:p,positionSide:null};else{let $=z(t[R].c);Ec={side:g.side,entryBarIndex:g.entryBarIndex,entryTime:t[g.entryBarIndex].t,entryPrice:g.entryPrice,qty:g.qty,notionalUsd:g.notionalUsd,markPrice:t[R].c,markedEquityUsd:$},O.push({type:"open_position_at_end",barIndex:R,time:t[R].t,message:"end-of-data exit missed; position remains open and marked"})}}let Ac=(g?z(t[t.length-1].c):p)-n.initialEquityUsd,i0=Ac/n.initialEquityUsd*100,vc=0,gi=0,wi=0;for(let R of E)R.netPnlUsd>0?(vc+=1,gi+=R.netPnlUsd):R.netPnlUsd<0&&(wi+=-R.netPnlUsd);let xi=E.length,s0=xi===0?0:vc/xi,ki=0;wi>0?ki=gi/wi:gi>0&&(ki=1e12);let a0={netPnlUsd:Ac,netPnlPct:i0,maxDrawdownPct:Cb(v),winRate:s0,profitFactor:ki,tradeCount:xi,sharpe:Ob(v),turnoverUsd:x,exposurePct:b/t.length*100},c0={initialEquityUsd:n.initialEquityUsd,takerFeeBps:n.takerFeeBps,builderFeeBps:n.builderFeeBps,slippageBps:n.slippageBps,latencyBars:n.latencyBars,maxVolumeParticipationPct:n.maxVolumeParticipationPct},Ic={barsHash:o,strategyHash:i.strategyHash,compilerHash:Tt,compilerVersion:$r,config:c0,trades:E,equityCurve:v,metrics:a0,costs:{feesUsd:f,builderFeesUsd:m,fundingUsd:h,slippageUsd:y},liquidations:_,missedFills:w,openPositionAtEnd:Ec,flags:O};return ns(Ic),rs(Fn(Ic))}var hb,_b,Ln=A(()=>{Rt();Ct();hb=Object.freeze({initialEquityUsd:1e4,takerFeeBps:3.5,builderFeeBps:2,slippageBps:2,latencyBars:1,maxVolumeParticipationPct:100});_b=Object.freeze(["fundingRate","openInterest","premium","oiDelta","bookImbalance"])});import{createHash as Tb}from"node:crypto";function Bb(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function os(e){if(e==null||typeof e!="object"||Object.isFrozen(e))return e;if(Array.isArray(e)){for(let t of e)os(t);return Object.freeze(e)}for(let t of Object.keys(e))os(e[t]);return Object.freeze(e)}function Fb(e){return String(e).trim().replace(/\s+/g," ")}function Db(e){let t=e.match(/\b(long|short)\b/i);return t?t[1].toLowerCase():null}function Mb(e){for(let r of Nb)if(new RegExp(`\\b${r}\\b`,"i").test(e))return r;let t=e.match(/\b([A-Z][A-Z0-9]{1,11})\b/);return t?t[1]:null}function jb(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 r=t[1].toLowerCase();return Rb.has(r)?r:null}function Hb(e){let t={...$b},r=e.match(/stop\s*loss\s*(\d+(?:\.\d+)?)\s*%?/i);r&&(t.stopLossPct=Number(r[1]));let n=e.match(/take\s*profit\s*(\d+(?:\.\d+)?)\s*%?/i);n&&(t.takeProfitPct=Number(n[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 zb(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(r=>(e.match(r)??[]).length>1)}function Vb(e){let t=Tb("sha256").update(e,"utf8").digest("hex").slice(0,10),r=e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").slice(0,40),o=`${r.length?r:"draft"}-${t}`.replace(/[^a-z0-9._-]/g,"").slice(0,64);return/^[a-z0-9]/.test(o)?o:`d${o}`.slice(0,64)}function Wb(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 r=Number(t[1]),n=t[2].toLowerCase(),o=Number(t[3]);if(!(r>0)||!(o>0)||r===o)return null;let i=/\b(exit\s+on\s+reverse|reverse\s+exit)\b/i.test(e);return{kind:"ema_cross",fast:r,slow:o,direction:n,reverse:i}}function Gb(e){let t=e.match(/\brsi\s*(\d+)\s*(above|below)\s*(-?\d+(?:\.\d+)?)/i);if(!t)return null;let r=Number(t[3]);return!Number.isFinite(r)||r<=0||r>=100?null:{kind:"rsi",period:Number(t[1]),op:t[2].toLowerCase(),threshold:r}}function Kb(e){let t=e.match(/\bfunding\s*rate\s*(above|below)\s*(-?\d+(?:\.\d+)?)(%?)(?=\s|,|$)/i);if(!t)return null;let r=Number(t[2]);return t[3]==="%"&&(r=r/100),{kind:"funding",op:t[1].toLowerCase(),threshold:r}}function Xb(e){let t=e.match(/\bopen\s*interest\s*(above|below)\s*(-?\d+(?:\.\d+)?)(?=\s|,|$)/i);if(!t)return null;let r=Number(t[2]);return!Number.isFinite(r)||r<0?null:{kind:"open_interest",op:t[1].toLowerCase(),threshold:r}}function Yb(e){let t=e.match(/\bpremium\s*(above|below)\s*(-?\d+(?:\.\d+)?)(%?)(?=\s|,|$)/i);if(!t)return null;let r=Number(t[2]);return Number.isFinite(r)?(t[3]==="%"&&(r=r/100),{kind:"premium",op:t[1].toLowerCase(),threshold:r}):null}function Jb(e){let t=e.match(/\boi\s*delta\s*(above|below)\s*(-?\d+(?:\.\d+)?)(?=\s|,|$)/i);if(!t)return null;let r=Number(t[2]);return Number.isFinite(r)?{kind:"oi_delta",op:t[1].toLowerCase(),threshold:r}:null}function Qb(e){let t=e.match(/\bbook\s*imbalance\s*(above|below)\s*(-?\d+(?:\.\d+)?)(?=\s|,|$)/i);if(!t)return null;let r=Number(t[2]);return!Number.isFinite(r)||r<-1||r>1?null:{kind:"book_imbalance",op:t[1].toLowerCase(),threshold:r}}function Zb(e,t){let r=e.replace(/^(long|short)\s+[A-Z][A-Z0-9]{1,11}\s+when\s+/i,"");if(r===e)return!1;t.kind==="ema_cross"?r=r.replace(/^ema\s*\d+\s*cross(?:es)?\s*(?:above|below)\s*ema\s*\d+\b/i,""):t.kind==="rsi"?r=r.replace(/^rsi\s*\d+\s*(?:above|below)\s*\d+(?:\.\d+)?\b/i,""):t.kind==="open_interest"?r=r.replace(/^open\s*interest\s*(?:above|below)\s*-?\d+(?:\.\d+)?(?=\s|,|$)/i,""):t.kind==="premium"?r=r.replace(/^premium\s*(?:above|below)\s*-?\d+(?:\.\d+)?%?(?=\s|,|$)/i,""):t.kind==="oi_delta"?r=r.replace(/^oi\s*delta\s*(?:above|below)\s*-?\d+(?:\.\d+)?(?=\s|,|$)/i,""):t.kind==="book_imbalance"?r=r.replace(/^book\s*imbalance\s*(?:above|below)\s*-?\d+(?:\.\d+)?(?=\s|,|$)/i,""):r=r.replace(/^funding\s*rate\s*(?:above|below)\s*-?\d+(?:\.\d+)?%?(?=\s|,|$)/i,"");let n=[/(?:,\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"&&n.push(/(?:,\s*)?\b(?:exit\s+on\s+reverse|reverse\s+exit)\b/gi);for(let o of n)r=r.replace(o,"");return r.replace(/[\s,;]+/g,"")===""}function Fu(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 eg({side:e,coin:t,interval:r,risk:n,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:r},parameters:{ema_left_period:Fu(a.fast),ema_right_period:Fu(a.slow)},nodes:c,rules:u,risk:{...n,expiresAt:o}}}function tg({side:e,coin:t,interval:r,risk:n,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:r},parameters:{},nodes:c,rules:{entryLong:e==="long"?"sig":null,entryShort:e==="short"?"sig":null,exitLong:null,exitShort:null},risk:{...n,expiresAt:o}}}function rg({side:e,coin:t,interval:r,risk:n,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:r},parameters:{},nodes:c,rules:{entryLong:e==="long"?"sig":null,entryShort:e==="short"?"sig":null,exitLong:null,exitShort:null},risk:{...n,expiresAt:o}}}function ng({side:e,coin:t,interval:r,risk:n,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:r},parameters:{},nodes:c,rules:{entryLong:e==="long"?"sig":null,entryShort:e==="short"?"sig":null,exitLong:null,exitShort:null},risk:{...n,expiresAt:o}}}function ig({side:e,coin:t,interval:r,risk:n,expiresAt:o,id:i,name:s,spec:a}){let u=[{id:"sig_input",type:"input",field:og[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:r},parameters:{},nodes:u,rules:{entryLong:e==="long"?"sig":null,entryShort:e==="short"?"sig":null,exitLong:null,exitShort:null},risk:{...n,expiresAt:o}}}function Du(e,t={}){if(typeof e!="string")throw new le("prompt must be a string");if(e.length>1e3)throw new le("prompt length must be <= 1000");if(!Bb(t))throw new le("options must be a plain object");if(!Number.isInteger(t.nowMs))throw new le("options.nowMs is required integer epoch ms");let r=t.nowMs,n=Ub;if("expiresInMs"in t){if(!Number.isInteger(t.expiresInMs))throw new le("expiresInMs must be an integer");if(n=t.expiresInMs,n<qb||n>Lb)throw new le("expiresInMs must be between 1h and 30d")}if(Pb.test(e))throw new le(`prompt appears to contain secrets and is rejected. ${Qt}`);let o=Fb(e);if(!o)throw new le(`empty prompt. ${Qt}`);if(zb(o))throw new le(`duplicate interval or risk clause. ${Qt}`);let i=Db(o),s=Mb(o),a=jb(o);if(!i||!s||!a)throw new le(`could not parse side/coin/interval. ${Qt}`);let c=Hb(o);if(!(c.maxLeverage>0)||c.maxLeverage>50)throw new le("leverage out of range");if(!(c.positionSizePct>0)||c.positionSizePct>100)throw new le("position size out of range");let u=r+n,l=Vb(o),d=`Draft ${s} ${i}`.slice(0,100),p=Wb(o),f=Gb(o),m=Kb(o),h=Xb(o),y=Yb(o),x=Jb(o),E=Qb(o),_=[p,f,m,h,y,x,E].filter(Boolean);if(_.length!==1)throw new le(`unsupported or ambiguous prompt. ${Qt}`);if(!Zb(o,_[0]))throw new le(`unsupported or ambiguous prompt. ${Qt}`);let w,O=_[0],v={side:i,coin:s,interval:a,risk:c,expiresAt:u,id:l,name:d,spec:O};O.kind==="ema_cross"?w=eg(v):O.kind==="rsi"?w=tg(v):O.kind==="open_interest"?w=ng(v):O.kind==="funding"?w=rg(v):w=ig(v);let g=es(w,{nowMs:r});if(!g.ok)throw new le(`draft failed validation: ${g.errors.map(b=>b.message).join("; ")}`);return os(be(w,{nowMs:r}))}var le,Rb,Nb,Pb,Qt,$b,qb,Lb,Ub,og,Mu=A(()=>{Ct();le=class extends Error{constructor(t){super(t),this.name="StrategyDraftError"}},Rb=new Set(["1m","3m","5m","15m","30m","1h","2h","4h","8h","12h","1d"]),Nb=new Set(["BTC","ETH","SOL","HYPE"]),Pb=/\b(mnemonic|private\s*key|privkey|seed\s*phrase|seed\b|api[_-]?key|secret\s*key|wallet\s*key|passphrase)\b/i,Qt="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.",$b=Object.freeze({maxLeverage:1,maxNotionalUsd:100,positionSizePct:5,stopLossPct:2,takeProfitPct:4,cooldownBars:1,maxDailyLossPct:3}),qb=36e5,Lb=30*864e5,Ub=864e5;og=Object.freeze({funding:"fundingRate",open_interest:"openInterest",premium:"premium",oi_delta:"oiDelta",book_imbalance:"bookImbalance"})});import{createHash as sg}from"node:crypto";function zu(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 Vu(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function ss(e){if(e==null||typeof e!="object"||Object.isFrozen(e))return e;if(Array.isArray(e)){for(let t of e)ss(t);return Object.freeze(e)}for(let t of Object.keys(e))ss(e[t]);return Object.freeze(e)}function Fr(e){if(Array.isArray(e))return e.map(Fr);if(e!=null&&typeof e=="object"){let t={};for(let r of Object.keys(e).sort())t[r]=Fr(e[r]);return t}return e}function Mn(e){return JSON.stringify(Fr(e))}function ag(e){let{min:t,max:r,step:n}=e;if(!(n>0)||t>r)return[];let o=[],i=Math.floor((r-t)/n+1e-9);for(let a=0;a<=i;a++){let c=t+a*n;if(c>r+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>r+1e-9||o.push(u)}if(o.length===0)return[];let s=o[o.length-1];if(Math.abs(s-r)>1e-9){let a=(r-t)/n;Math.abs(a-Math.round(a))<=1e-9&&o.push(r)}return o}function cg(e,t){if(e.length===0)return[];let r=[{}];for(let n of e){let o=t[n],i=[];for(let s of r)for(let a of o)i.push({...s,[n]:a});r=i}return r.sort((n,o)=>{let i=Mn(n),s=Mn(o);return i<s?-1:i>s?1:0}),r}function is(e,t,r,n,o){let i=0;if(e==="maxDrawdownPct"){if(i=t.maxDrawdownPct-n.maxDrawdownPct,i!==0)return i<0}else if(i=t[e]-n[e],i!==0)return i>0;let s=Mn(r),a=Mn(o);return s<a}function Wu(e,t,r={}){if(!Vu(r))throw new TypeError("options must be a plain object");for(let w of Object.keys(r))if(zu(w))throw new TypeError(`options must not include holdout/test/oos key "${w}"`);let n=new Set(["maxTrials","objective","backtestOptions"]);for(let w of Object.keys(r))if(!n.has(w))throw new TypeError(`unknown option "${w}"`);let o=64;if("maxTrials"in r){let w=r.maxTrials;if(!Number.isInteger(w)||w<1||w>ju)throw new TypeError(`maxTrials must be an integer 1..${ju}`);o=w}let i=r.objective??"netPnlUsd";if(!Hu.has(i))throw new TypeError(`objective must be one of ${[...Hu].join("|")}`);let s=r.backtestOptions??{};if(!Vu(s))throw new TypeError("backtestOptions must be a plain object");for(let w of Object.keys(s))if(zu(w))throw new TypeError(`backtestOptions must not include holdout/test/oos key "${w}"`);let a=be(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 w of c){let O=ag(a.parameters[w]);if(O.length===0)throw new Error(`parameter "${w}" produces an empty grid`);u[w]=O,l*=O.length}let d=cg(c,u);if(d.length===0)throw new Error("parameter grid is empty");let p=d.slice(0,o),f=[],m=null,h=null;for(let w of p){let O=Lr(a,w),v=ht(O,t,s);h==null&&(h=v.config);let g={netPnlUsd:v.metrics.netPnlUsd,netPnlPct:v.metrics.netPnlPct,maxDrawdownPct:v.metrics.maxDrawdownPct,winRate:v.metrics.winRate,profitFactor:v.metrics.profitFactor,tradeCount:v.metrics.tradeCount,sharpe:v.metrics.sharpe,turnoverUsd:v.metrics.turnoverUsd},b={parameters:{...w},metrics:g};f.push(b),(!m||is(i,g,w,m.metrics,m.parameters))&&(m=b)}f.sort((w,O)=>is(i,w.metrics,w.parameters,O.metrics,O.parameters)?-1:is(i,O.metrics,O.parameters,w.metrics,w.parameters)?1:0);let y={...m.parameters},x=Lr(a,y),E={strategyHash:Gt(a),compilerHash:Tt,trainBarsHash:Nr(t),backtestConfig:h,objective:i,maxTrials:o,trialsRun:f.length,candidates:f,bestParameters:y,bestStrategy:x},_={id:sg("sha256").update(JSON.stringify(Fr(E)),"utf8").digest("hex"),...E};return ss(Fr(JSON.parse(JSON.stringify(_))))}var ju,Hu,Gu=A(()=>{Rt();Ct();Ln();ju=256,Hu=new Set(["netPnlUsd","profitFactor","sharpe","maxDrawdownPct"])});import it from"node:fs";import jn from"node:path";function Hn(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function Qe(e){return e==null?e:JSON.parse(JSON.stringify(e))}function lg(e){return String(e).toLowerCase().replace(/[^a-z0-9]/g,"")}function Zt(e,t="record"){if(Array.isArray(e)){e.forEach((r,n)=>Zt(r,`${t}[${n}]`));return}if(Hn(e))for(let[r,n]of Object.entries(e)){let o=lg(r);if(ug.some(i=>o.includes(i)))throw new Error(`shadow-store: forbidden secret-like field at ${t}.${r}`);Zt(n,`${t}.${r}`)}}function dg(e){if(typeof e!="string"||!e||!jn.isAbsolute(e))throw new Error("shadow-store: path must be an absolute path")}function Ku(e){let t;try{t=it.lstatSync(e)}catch(n){if(n&&n.code==="ENOENT")return;throw n}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 pg(){return{version:cs,runners:[]}}function Xu(e,t){let r;try{r=JSON.parse(e)}catch{throw new Error("shadow-store: malformed JSON")}if(!Hn(r))throw new Error("shadow-store: malformed JSON root");if(r.version!==cs)throw new Error(`shadow-store: unsupported version ${r.version}`);if(!Array.isArray(r.runners))throw new Error("shadow-store: runners must be an array");return Zt(r,jn.basename(t)),{version:cs,runners:r.runners.map(n=>Qe(n))}}function Yu(e,t){Zt(t,"store");let r=jn.dirname(e);it.mkdirSync(r,{recursive:!0,mode:448});let n=jn.join(r,`.shadow-store.${process.pid}.${Date.now()}.tmp`),o=`${JSON.stringify(t)}
4
+ `;try{it.writeFileSync(n,o,{mode:384,flag:"wx"}),it.renameSync(n,e);try{it.chmodSync(e,384)}catch{}}catch(i){try{it.unlinkSync(n)}catch{}throw i}}function Ju(e={}){let t=e.path;if(dg(t),Ku(t),it.existsSync(t)?Xu(it.readFileSync(t,"utf8"),t):Yu(t,pg()),as.has(t))return as.get(t);let r=!1,n=[];function o(){if(r)return;let m=n.shift();if(m){r=!0;try{let h=m.fn();r=!1,m.resolve(h),o()}catch(h){r=!1,m.reject(h),o()}}}function i(m){if(!r&&n.length===0){r=!0;try{return m()}finally{r=!1,queueMicrotask(o)}}return new Promise((h,y)=>{n.push({fn:m,resolve:h,reject:y}),queueMicrotask(o)})}function s(){return Ku(t),Xu(it.readFileSync(t,"utf8"),t)}function a(m){Yu(t,m)}function c(m){if(!Hn(m)||typeof m.id!="string"||!m.id)throw new Error("shadow-store: create requires record with string id");Zt(m,"record");let h=s();if(h.runners.some(x=>x.id===m.id))throw new Error(`shadow-store: runner id already exists: ${m.id}`);let y=Qe(m);return h.runners.push(y),a(h),Qe(y)}function u(m){let h=s().runners.find(y=>y.id===m);return h?Qe(h):null}function l(){return s().runners.map(m=>Qe(m))}function d(m,h){if(typeof h!="function")throw new Error("shadow-store: updater must be a function");let y=s(),x=y.runners.findIndex(w=>w.id===m);if(x<0)throw new Error(`shadow-store: runner not found: ${m}`);let E=Qe(y.runners[x]),_=h(E);if(!Hn(_)||_.id!==m)throw new Error("shadow-store: updater must return record with same id");return Zt(_,"record"),y.runners[x]=Qe(_),a(y),Qe(y.runners[x])}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 x=Qe(h.runners[y]);return x.status!=="stopped"&&(x.status="stopped",h.runners[y]=x,a(h)),Qe(h.runners[y])}let f={create(m){return i(()=>c(m))},get(m){return u(m)},list(){return l()},update(m,h){return i(()=>d(m,h))},stop(m){return i(()=>p(m))}};return as.set(t,f),f}var cs,ug,as,Qu=A(()=>{cs=1,ug=["privatekey","secretkey","seed","mnemonic","passphrase","password","keystore","keymaterial","apikey","authtoken","accesstoken","refreshtoken","credential","bearer","signature","authorization","xprv","xpriv","wif"];as=new Map});import{createHash as ds}from"node:crypto";function us(e){return e==null?e:JSON.parse(JSON.stringify(e))}function ls(e){return Array.isArray(e)?e.map(ls):e&&typeof e=="object"?Object.fromEntries(Object.keys(e).sort().map(t=>[t,ls(e[t])])):e}function el(e){if(!e||typeof e!="object"||Array.isArray(e))throw new TypeError("shadow-runner: record must be an object");return ds("sha256").update(JSON.stringify(ls(e))).digest("hex")}function fg(e,t,r,n,o){return ds("sha256").update(`${e}|${t}|${r}|${n}|${o}`).digest("hex")}function mg(e,t,r,n){return ds("sha256").update(`shadow|${e}|${t}|${r}|${n??""}`).digest("hex")}function hg(e){return e==="entryLong"||e==="exitShort"?"buy":e==="entryShort"||e==="exitLong"?"sell":e}function Zu(e){return e==="entryLong"||e==="entryShort"}function ps({storePath:e,clock:t=Date.now}={}){if(typeof e!="string"||!e)throw new Error("shadow-runner: storePath required");let r=Ju({path:e});function n({strategy:c,evidenceId:u=null}={}){let l=ge(c),d=u==null?null:String(u),p=r.list().filter(x=>x.status==="running"&&x.strategyHash===l.strategyHash&&x.compilerHash===l.compilerHash&&x.evidenceId===d).sort((x,E)=>x.createdAt-E.createdAt||x.id.localeCompare(E.id))[0];if(p)return us(p);let f=t(),m=mg(f,l.strategyHash,l.compilerHash,d),h=r.get(m);if(h)return us(h);let y={id:m,strategy:us(l.strategy),strategyHash:l.strategyHash,compilerHash:l.compilerHash,evidenceId:d,status:"running",cursor:null,intendedOrders:[],fills:[],missedFills:[],markouts:[],createdAt:f,updatedAt:f,position:null,cooldownBarsRemaining:0,cooldownStartT:null,lastProcessedBarIndex:-1};return r.create(y)}function o(c){return r.get(c)}function i(){return r.list()}function s(c){return r.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 r.update(c,d=>{if(d.status!=="running")throw new Error("shadow-runner: runner is stopped");if(u.length===0)return d;let f=ge(d.strategy).evaluateAll(u),m=new Map;for(let I=0;I<u.length;I++)m.set(u[I].t,I);let h=d.cursor,y=[];for(let I=0;I<u.length;I++){let P=u[I].t;(h==null||P>h)&&y.push(I)}if(y.length===0)return d;let x=new Map(d.intendedOrders.map(I=>[I.id,I])),E=new Set(d.fills.map(I=>I.orderId)),_=new Map(d.missedFills.map(I=>[I.orderId,I])),w=(I,P)=>`${I}|${P}`,O=new Map(d.markouts.map(I=>[w(I.orderId,I.horizon),I])),v=d.position?{...d.position}:null,g=Number.isInteger(d.cooldownBarsRemaining)?Math.max(0,d.cooldownBarsRemaining):0,b=Number.isFinite(d.cooldownStartT)?d.cooldownStartT:null;function S({action:I,signalBarT:P,signalIndex:L}){let H=hg(I),X=fg(d.id,d.strategyHash,P,H,I);if(x.has(X))return x.get(X);let F=L+1,z=F<u.length,ie={id:X,action:I,type:I,side:H,signalBarT:P,fillBarT:z?u[F].t:null,status:z?"open":"missed"};return x.set(X,ie),d.intendedOrders.push(ie),ie}function k(I,P,L){if(E.has(I.id))return;let H={orderId:I.id,action:Zu(I.action)?"entry":"exit",side:I.side,price:P.o,barT:P.t,signalBarT:I.signalBarT,barIndex:L};if(d.fills.push(H),E.add(I.id),I.status="filled",I.fillBarT=P.t,_.has(I.id)&&(_.delete(I.id),d.missedFills=d.missedFills.filter(X=>X.orderId!==I.id)),Zu(I.action)){v={side:I.action==="entryLong"?"long":"short",entryOrderId:I.id,entryBarT:P.t,entryPrice:P.o,entryBarIndex:L};for(let X of l){let F=w(I.id,X);if(O.has(F))continue;let z={orderId:I.id,horizon:X,entryBarT:P.t,entryPrice:P.o,side:v.side,status:"pending",close:null,barT:null};O.set(F,z),d.markouts.push(z)}}else v=null,g=Number(d.strategy?.risk?.cooldownBars)||0,b=P.t}function N(I){if(E.has(I.id)||_.has(I.id))return;let P={orderId:I.id,action:I.action,side:I.side,signalBarT:I.signalBarT,status:"missed"};_.set(I.id,P),d.missedFills.push(P),I.status="missed"}for(let I of d.intendedOrders){if(I.status==="filled"||E.has(I.id))continue;let P=m.get(I.signalBarT);if(P==null)continue;let L=P+1;L<u.length&&(h==null||u[L].t>h)&&k(I,u[L],L)}for(let I of y){let P=u[I],L=f[I].signals,H=v,X=z=>{if(v||g>0&&(b==null||P.t>=b))return;let K=S({action:z,signalBarT:P.t,signalIndex:I}),Ge=I+1;Ge<u.length?k(K,u[Ge],Ge):N(K)},F=z=>{if(!v||v.side==="long"&&z!=="exitLong"||v.side==="short"&&z!=="exitShort")return;let ie=S({action:z,signalBarT:P.t,signalIndex:I}),K=I+1;K<u.length?k(ie,u[K],K):N(ie)};H?(L.exitLong&&F("exitLong"),L.exitShort&&F("exitShort")):L.entryLong&&L.entryShort||(L.entryLong&&X("entryLong"),L.entryShort&&X("entryShort")),g>0&&b!=null&&P.t>=b&&(g-=1,g===0&&(b=null)),d.cursor=P.t,d.lastProcessedBarIndex=I}for(let I of d.markouts){if(I.status!=="pending")continue;let P=d.fills.find(X=>X.orderId===I.orderId&&X.action==="entry");if(!P)continue;let L=m.get(P.barT);if(L==null)continue;let H=L+I.horizon;if(H<u.length){I.close=u[H].c,I.barT=u[H].t,I.status="filled";let X=I.entryPrice;I.markout=I.side==="long"?(I.close-X)/X:(X-I.close)/X}}return d.position=v,d.cooldownBarsRemaining=g,d.cooldownStartT=b,d.updatedAt=t(),d})}return{start:n,step:a,list:i,get:o,stop:s}}var tl=A(()=>{Rt();Qu()});var ol={};B(ol,{runStrategyOperation:()=>Eg});import yg from"node:os";import bg from"node:path";function Dr(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function wg(e){return String(e).toLowerCase().replace(/[^a-z0-9]/g,"")}function ms(e){if(Array.isArray(e)){for(let t of e)ms(t);return}if(Dr(e))for(let[t,r]of Object.entries(e)){if(gg.some(n=>wg(t).includes(n)))throw new Error(`strategy service: secret-like field "${t}" is forbidden`);ms(r)}}function xg(e){if(!Dr(e))throw new TypeError("strategy input must be a plain object");return ms(e),e}function kg(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 r=Date.now();if(e.nowMs===void 0||e.nowMs===null)return r;if(!Number.isInteger(e.nowMs))throw new TypeError("nowMs must be an integer epoch milliseconds");if(Math.abs(e.nowMs-r)>12e4)throw new Error("nowMs outside allowed wall-clock skew (120s); omit nowMs to use server time");return e.nowMs}async function fs(e,t,r,n){if(Array.isArray(t.bars))return t.bars;let o=Wi(e.venue),i=r.fetchBars??o.fetchBars;if(typeof i!="function")throw new Error(`strategy venue ${o.id} does not support history`);r.signal?.throwIfAborted?.();let s=await i({coin:e.market.coin,interval:e.market.interval,count:t.count??1500,endTime:t.endTime??n},{signal:r.signal});r.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 hs(e,t){let r=e.backtestOptions??{};if(!Dr(r))throw new TypeError("backtestOptions must be a plain object");return{...r,nowMs:t}}function rl(e,t,r,n,o={}){let i=e.evidenceOptions??{};if(!Dr(i))throw new TypeError("evidenceOptions must be a plain object");return{...i,...o,strategy:t,bars:r,backtestOptions:hs(e,n)}}function nl(){return bg.join(yg.homedir(),".oracle","strategy-shadow.json")}function Sg(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 Eg(e,t={},r={}){r.signal?.throwIfAborted?.();let n=xg(t),o=kg(n,r);if(e==="draft")return{strategy:Du(n.prompt,{nowMs:o})};if(e==="validate"){let i=ge(n.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=ge(n.strategy),s=await fs(i.strategy,n,r,o);Br(i,s);let a=Di(rl(n,i.strategy,s,o));return e==="evidence"?a:{backtest:ht(i.strategy,s,hs(n,o)),evidence:a}}if(e==="optimize"){let i=ge(n.strategy),s=await fs(i.strategy,n,r,o);Br(i,s);let a=n.trainFraction,c=n.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=n.options??{};if(!Dr(d))throw new TypeError("options must be a plain object");let p=Wu(i.strategy,l,{...d,...n.maxTrials==null?{}:{maxTrials:n.maxTrials},backtestOptions:hs(n,o)}),f=p.bestStrategy;return{strategy:f,optimization:p,evidence:Di(rl(n,f,s,o,{trainFraction:u}))}}if(e==="shadow"){let i=ps({storePath:r.storePath??nl(),clock:()=>o}),s=n.action;if(s==="start")return await i.start({strategy:n.strategy,evidenceId:n.evidenceId??n.evidence?.id??null});if(s==="list")return await i.list();if(s==="get")return await i.get(n.id);if(s==="stop")return await i.stop(n.id);if(s==="step"){let a=await i.get(n.id);if(!a)throw new Error(`shadow runner not found: ${n.id}`);let c=await fs(a.strategy,n,r,o);return Br(ge(a.strategy),c),await i.step(n.id,c,n.stepOptions??{})}throw new Error(`unknown shadow action: ${s}`)}if(e==="prepare"){let i=ge(n.strategy),s=Wi(i.strategy.venue);if(typeof n.shadowId!="string"||!n.shadowId)throw new Error("strategy prepare requires a matching shadow runner id");let c=await ps({storePath:r.storePath??nl(),clock:()=>o}).get(n.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!==n.evidence?.id)throw new Error("strategy prepare shadow runner does not match evidence artifact");let u=n.caps??Sg(i.strategy,o);return s.prepareIntent({strategy:i.strategy,evidence:n.evidence,shadow:{id:c.id,stateHash:el(c),status:c.status,cursor:c.cursor,updatedAt:c.updatedAt},caps:u,nowMs:o,env:r.env??process.env})}throw new Error(`unknown strategy operation: ${e}`)}var gg,il=A(()=>{Ln();Rt();Mi();Mu();Gu();tl();Gi();gg=["privatekey","secretkey","seed","mnemonic","passphrase","password","keystore","keymaterial","apikey","authtoken","accesstoken","refreshtoken","credential","bearer","signature","authorization","xprv","xpriv","wif"]});var gl={};B(gl,{DEFAULT_CROSS_CHAIN_SOURCES:()=>pl,DEFAULT_SAME_CHAIN_SOURCES:()=>dl,NATIVE_TOKEN:()=>ys,canonicalJson:()=>ml,hashFirmQuote:()=>bl,hashRfqIntent:()=>yl,normalizeFirmQuote:()=>gs,normalizeRfqIntent:()=>Cg,sha256Hex:()=>Mr});import{createHash as Ag}from"node:crypto";import{getAddress as ll,isAddress as bs}from"ethers";function re(e,t="invalid"){throw new Error(`rfq: ${e} ${t}`)}function al(e,t){let r=Number(e);return(!Number.isSafeInteger(r)||r<=0)&&re(t,"must be a positive chainId"),r}function zn(e,t){let r=String(e??"").trim();return(!vg.test(r)||BigInt(r)<=0n)&&re(t,"must be a positive integer string"),r}function Ig(e,t){return e==null||e===""?null:zn(e,t)}function cl(e,t){let r=String(e??"").trim();return r.toLowerCase()===ys.toLowerCase()?ys:(bs(r)||re(t,"must be an EVM address or native token sentinel"),ll(r))}function fl(e,t){let r=String(e??"").trim();return bs(r)||re(t,"must be an EVM address"),ll(r)}function _g(e,t){return e==null||e===""?null:fl(e,t)}function ul(e,t,r){return e===void 0?[...r]:(Array.isArray(e)||re(t,"must be an array"),e.map(n=>String(n).trim()).filter(Boolean))}function Og(e,{nowMs:t,maxDeadlineMs:r},n){let o=Number(e);return Number.isFinite(o)||re(n,"must be a finite millisecond timestamp"),o<=t&&re(n,"expired"),o>t+r&&re(n,"exceeds maxDeadlineMs"),Math.floor(o)}function er(e){if(Array.isArray(e))return e.map(er);if(e&&typeof e=="object"){let t={};for(let r of Object.keys(e).sort())e[r]!==void 0&&(t[r]=er(e[r]));return t}return e}function ml(e){return JSON.stringify(er(e))}function Mr(e){return`0x${Ag("sha256").update(ml(e)).digest("hex")}`}function hl(e,t){let r={...e};for(let n of t)delete r[n];return r}function yl(e){return Mr(hl(e,["intentHash"]))}function bl(e){return Mr(hl(e,["firmQuoteHash"]))}function Cg(e={},t={}){let r=Number(t.nowMs??Date.now()),n=Number(t.maxDeadlineMs??1800*1e3);(!Number.isFinite(r)||!Number.isFinite(n)||n<=0)&&re("time","is invalid");let o=al(e.fromChainId??e.fromChain,"fromChainId"),i=al(e.toChainId??e.toChain,"toChainId"),a=o===i?dl:pl,c={kind:"rfq-intent",version:1,fromChainId:o,toChainId:i,sellToken:cl(e.sellToken??e.tokenIn??e.fromToken,"sellToken"),buyToken:cl(e.buyToken??e.tokenOut??e.toToken,"buyToken"),sellAmount:zn(e.sellAmount??e.amountIn??e.fromAmount,"sellAmount"),receiver:fl(e.receiver??e.recipient??e.to,"receiver"),deadlineMs:Og(e.deadlineMs??e.deadline??e.expiresAtMs,{nowMs:r,maxDeadlineMs:n},"deadline"),minBuyAmount:Ig(e.minBuyAmount??e.minOut??e.amountOutMin,"minBuyAmount"),allowedSources:ul(e.allowedSources,"allowedSources",a),allowedRouters:ul(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)?er(e.metadata):{}};return c.slippageBps!=null&&(!Number.isInteger(c.slippageBps)||c.slippageBps<0||c.slippageBps>1e4)&&re("slippageBps","must be 0 to 10000"),c.intentId=e.intentId?String(e.intentId):Mr({seed:"rfq-intent",intent:c}).slice(0,34),c.intentHash=yl(c),Object.freeze(c)}function Tg(e){return(!e||typeof e!="object"||Array.isArray(e))&&re("artifact","required"),e.typedDataHash!=null&&!sl.test(String(e.typedDataHash))&&re("artifact.typedDataHash","must be bytes32"),e.calldataHash!=null&&!sl.test(String(e.calldataHash))&&re("artifact.calldataHash","must be bytes32"),e.to!=null&&!bs(String(e.to))&&re("artifact.to","must be an address"),e.data!=null&&!/^0x(?:[0-9a-fA-F]{2})*$/.test(String(e.data))&&re("artifact.data","must be hex"),er(e)}function gs(e,t={},r={}){(!e||e.kind!=="rfq-intent")&&re("intent","required");let n=Number(r.nowMs??Date.now()),o=Number(t.expiryMs??t.expiresAtMs??t.validUntilMs);Number.isFinite(o)||re("quote expiry","required"),o<=n&&re("quote","expired"),o>e.deadlineMs&&re("quote expiry","exceeds intent deadline");let i=String(t.source??t.provider??"").trim();i||re("source","required"),e.allowedSources.includes(i)||re("source","not allowed by intent");let s=zn(t.amountOut??t.buyAmount,"amountOut"),a=zn(t.minBuyAmount??t.minOut??s,"minBuyAmount");BigInt(a)>BigInt(s)&&re("minBuyAmount","exceeds amountOut");let c=Tg(t.artifact??t.executableArtifact??t.transaction??t.typedData),u=Number(t.quotedAtMs??t.timestampMs??r.nowMs??Date.now());Number.isFinite(u)||re("quotedAtMs","must be finite");let l=_g(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)?er(t.metadata):{}};return d.quoteId||(d.quoteId=Mr({seed:"rfq-quote",out:d}).slice(0,34)),d.firmQuoteHash=bl(d),Object.freeze(d)}var ys,dl,pl,sl,vg,ws=A(()=>{ys="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",dl=Object.freeze(["lifi","paraswap","0x","cow","uniswap-v3"]),pl=Object.freeze(["lifi"]),sl=/^0x[0-9a-fA-F]{64}$/,vg=/^\d+$/});import{readFileSync as Rg}from"node:fs";import{homedir as Ng}from"node:os";import{join as Vn}from"node:path";function Pg(){if(process.env.ORACLE_TEST_ISOLATE_SECRETS==="1"){let r=(process.env.ORACLE_EXEC_ENV_FILE||"").trim();return r?[r]:[]}let e=(process.env.ORACLE_EXEC_ENV_FILE||process.env.MAD_EXEC_ENV_FILE||"").trim(),t=Ng();if(process.env.ORACLE_PUBLIC_DESKTOP==="1"){let r=(process.env.ORACLE_CONFIG_DIR||Vn(t,".config","oracle")).trim();return[e,Vn(r,"exec.env")].filter(Boolean)}return[e,Vn(t,".config","oracle","exec.env"),Vn(t,".config","mad-desk","exec.env")].filter(Boolean)}function wl(e,t,r){let n=e??process.env[t]??process.env[r];if(!String(n||"").trim())for(let o of Pg())try{let i=Rg(o,"utf8"),s=i.match(new RegExp(`^${t}=(.*)$`,"m"))||i.match(new RegExp(`^${r}=(.*)$`,"m"));if(s&&(n=s[1].trim(),n))break}catch{}if(!String(n||"").trim())throw new Error(`${t} required for attestation. Set it in the environment, or place ${t}=<value> in ~/.config/oracle/exec.env`);return n}var xl=A(()=>{});var kl=A(()=>{});import{createHash as $g,createHmac as El,timingSafeEqual as qg}from"node:crypto";function Wn(e){return Array.isArray(e)?`[${e.map(Wn).join(",")}]`:e&&typeof e=="object"?`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${Wn(e[t])}`).join(",")}}`:JSON.stringify(e??null)}function Al(e,{required:t=!1}={}){try{return wl(e,"ORACLE_ROUTE_ATTESTATION_SECRET","MAD_ROUTE_ATTESTATION_SECRET")}catch(r){if(t)throw r;return null}}function ks(e){let{signature:t,...r}=e;return r}function vl(e,{secret:t}={}){let r=Al(t);return r?{...e,signature:El("sha256",r).update(Wn(ks(e))).digest("hex")}:e}function Lg(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 $g("sha256").update(Buffer.from(t.slice(2),"hex")).digest("hex")}function Oe(e,{chainId:t,venue:r,data:n,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(r||"").toLowerCase())throw new Error("auto-slippage guard venue mismatch");let i=Al(o);if(i){let f=El("sha256",i).update(Wn(ks(e))).digest("hex");if(!Ug(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>st||!Number.isInteger(a)||a<0||a>st||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 p=Fg(n);if(p!=null&&p!==u)throw new Error(`auto-slippage: calldata encodes floor ${p}, not the guard floor ${u} \u2014 refusing to bind`);return vl({...ks(e),calldataHash:Lg(n)},{secret:o})}function Ug(e,t){let r=Buffer.from(String(e??""),"utf8"),n=Buffer.from(String(t??""),"utf8");return r.length!==n.length||r.length===0?!1:qg(r,n)}function xs(e,t=0){let r=Number(e);return Number.isFinite(r)?r:t}function Bg(e){let t=e==null?st: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,st)}function at({liquidityUsd:e,priceChange5m:t=0,quoteAgeMs:r=0,crossChain:n=!1,requestedCapBps:o}={}){let i=xs(e,0),s=i>0?i>=25e4?5:i>=1e5?10:i>=5e4?20:i>=1e4?40:70:n?30:10,a=Math.min(60,Math.abs(xs(t,0))*2),c=Math.min(40,Math.floor(Math.max(0,xs(r,0))/5e3)*5),u=Math.max(25,Math.ceil(20+s+a+c)),l=Bg(o);return{mode:"auto",requiredBps:u,selectedBps:Math.min(u,l),capBps:l,executable:u<=l}}function Ss({chainId:e,venue:t,quoteAmountOut:r,liquidityUsd:n,priceChange5m:o=0,quoteAgeMs:i=0,crossChain:s=!1,requestedCapBps:a,quotedAtMs:c=Date.now(),ttlMs:u=Sl,secret:l}={}){let d=BigInt(r??0);if(d<=0n)throw new Error("auto-slippage guard requires positive quoteAmountOut");let p=at({liquidityUsd:n,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(u)||Sl)),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 x=Number((d-y)*10000n/(d===0n?1n:d));if(x>p.capBps)throw new Error(`auto-slippage: realised floor implies ${x} bps, above cap ${p.capBps} \u2014 refusing to issue a guard weaker than advertised`);return vl({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:l})}function Fg(e){let t=String(e||"");if(!/^0x[0-9a-fA-F]+$/.test(t)||t.length<10||t.length%2!==0)return null;let r=t.slice(0,10).toLowerCase(),n=[];for(let i=10;i+64<=t.length;i+=64)n.push(t.slice(i,i+64));let o=i=>n[i]==null?null:BigInt("0x"+n[i]);switch(r){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 ae(e,{chainId:t,venue:r,amountOut:n,liquidityUsd:o,priceChange5m:i,crossChain:s,requestedCapBps:a,quotedAtMs:c=Date.now(),ttlMs:u}={}){let l=Ss({chainId:t,venue:r,quoteAmountOut:n,liquidityUsd:o,priceChange5m:i,crossChain:s,requestedCapBps:a,quotedAtMs:c,ttlMs:u});return{...e,autoSlippage:l,amountOutMinimum:l.minAmountOut}}var st,Sl,Ue=A(()=>{xl();kl();st=100,Sl=2e4});function Es(e){let t=String(e||"").trim();return/^0x[0-9a-fA-F]{40}$/.test(t)?t:gt}var gt,Gn=A(()=>{gt="0x000000000000000000000000000000000000dEaD"});import{Contract as Dg,JsonRpcProvider as Mg}from"ethers";function Gg(e){return Wg.test(String(e||""))}async function Il(e,{contract:t=jg,rpc:r=zg,chainId:n=Hg,balanceOf:o}={}){if(!Gg(e))throw new Error("invalid-address");if(o)return BigInt(await o(e));let i=new Mg(r,n,{staticNetwork:!0}),s=new Dg(t,Vg,i);return BigInt(await s.balanceOf(e))}var jg,Hg,zg,Vg,Wg,_l=A(()=>{jg="0x62FCFAf7573AD8B41a0FBF347AfEb85e06599A75",Hg=999,zg="https://rpc.hyperliquid.xyz/evm",Vg=["function balanceOf(address owner) view returns (uint256)"],Wg=/^0x[a-fA-F0-9]{40}$/});import{existsSync as Kg,readFileSync as Xg,lstatSync as Yg}from"node:fs";import{homedir as Ol}from"node:os";import{join as As}from"node:path";function Zg(e){let t=String(e||"swap").toLowerCase();return Object.prototype.hasOwnProperty.call(Cl,t)?Cl[t]:Qg}function ow(e=process.env){if(process.env.ORACLE_TEST_ISOLATE_SECRETS==="1"){if(e[Tl])return String(e[Tl]);let t=e.ORACLE_CONFIG_DIR||As(Ol(),".config","oracle");return As(t,"fee-recipient")}return As(Ol(),".config","oracle","fee-recipient")}function iw(e=process.env){try{let t=ow(e);if(!Kg(t)||Yg(t).isSymbolicLink())return"";let r=Xg(t,"utf8").trim().toLowerCase();return/^0x[a-f0-9]{40}$/.test(r)?r:""}catch{return""}}function sw(e,{fallback:t=0}={}){if(e==null)return t;if(String(e).trim()==="")return 0;let r=Number(e);return!Number.isFinite(r)||r<=0?0:Math.min(Math.floor(r),Jg)}function aw({env:e=process.env,action:t="swap",admin:r=!1}={}){let n=String(e[tw]||"").trim(),o=String(e[rw]||nw).trim();if(r===!0)return{bps:0,recipient:"",integrator:o,action:t,applies:!1,reason:"admin-oracle"};let i=Zg(t),s=sw(e[ew],{fallback:n?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(n))return{bps:0,recipient:"",integrator:o,action:t,applies:!1,reason:"no-recipient"};let c=iw(e);return!c||c!==n.toLowerCase()?{bps:0,recipient:"",integrator:o,action:t,applies:!1,reason:"recipient-not-pinned"}:{bps:a,recipient:n,integrator:o,action:t,applies:!0,reason:"configured"}}async function Kn({wallet:e,env:t=process.env,action:r="swap",holderCheck:n={},admin:o=!1}={}){let i=aw({env:t,action:r,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 Il(s,n))>0n?{...i,bps:0,applies:!1,reason:"locals-only-holder",holderVerificationStatus:"holder"}:{...i,holderVerificationStatus:"non-holder"}}catch{return{...i,holderVerificationStatus:"unavailable"}}}function Rl(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 Nl(e){return e?.applies?{integrator:e.integrator,fee:String(e.bps/1e4)}:{}}function Pl(e){return e?.applies?{partner:e.integrator,partnerFeeBps:String(e.bps),partnerAddress:e.recipient}:{}}var Jg,Qg,Cl,ew,tw,rw,Tl,nw,Xn=A(()=>{_l();Jg=100,Qg=5,Cl=Object.freeze({swap:5,bridge:5,perps:0,nft:0});ew="ORACLE_INTEGRATOR_FEE_BPS",tw="ORACLE_INTEGRATOR_FEE_RECIPIENT",rw="ORACLE_INTEGRATOR_ID",Tl="ORACLE_INTEGRATOR_FEE_RECIPIENT_PIN",nw="oracle"});var _s={};B(_s,{LIFI_API:()=>ql,lifiChains:()=>pw,lifiHealth:()=>lw,lifiPrepare:()=>dw,lifiQuote:()=>Pt});function Is(e={}){return(e.baseUrl||process.env.LIFI_API_URL||ql).replace(/\/$/,"")}function uw(e){let t=String(e||vs).toLowerCase();return t===vs.toLowerCase()||t===cw}function $l(e,t){let r=String(e||"").trim();if(!/^0x[0-9a-fA-F]{40}$/.test(r))throw new Error(`lifi: ${t} must be a 20-byte address`);return r.toLowerCase()}async function lw(e={}){let t=await C(`${Is(e)}/chains`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??12e3}),r=Array.isArray(t)?t.length:t?.chains?.length||0;return{ok:r>0,chainCount:r}}async function Pt(e={},t={}){let{fromChain:r,toChain:n=r,fromToken:o=vs,toToken:i,fromAmount:s,fromAddress:a=gt}=e;if(r==null||!i||!s)throw new Error("lifiQuote requires fromChain, toToken, fromAmount");let c=new URLSearchParams({fromChain:String(r),toChain:String(n),fromToken:o,toToken:i,fromAmount:String(s),fromAddress:a}),u=at({liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,crossChain:Number(n)!==Number(r),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 Kn({wallet:e.fromAddress,env:t.env,action:e.feeAction||"swap",holderCheck:t.holderCheck});for(let[y,x]of Object.entries(Nl(l)))c.set(y,x);let d=await C(`${Is(t)}/quote?${c}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4}),p=d?.estimate?.toAmount||d?.toAmount;if(!p)return{...d,autoSlippagePolicy:u,oracleFee:l};let f=d?.transactionRequest?.to||d?.estimate?.approvalAddress||"lifi",m=ae(d,{chainId:Number(r),venue:f,amountOut:p,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,crossChain:Number(n)!==Number(r),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:l}}async function dw(e={},t={}){let r=await Pt(e,t),n=r?.transactionRequest;if(!n?.to||!n?.data)throw new Error("lifi: quote did not return an executable transactionRequest");let o=Number(e.fromChain);if(n.chainId!=null&&Number(n.chainId)!==o)throw new Error("lifi: transaction chain mismatch");if(e.fromAddress&&n.from&&String(n.from).toLowerCase()!==String(e.fromAddress).toLowerCase())throw new Error("lifi: transaction sender mismatch");let i=null;if(!uw(e.fromToken)){let s=r?.estimate?.approvalAddress||r?.approvalAddress;if(!s)throw new Error("lifi: ERC20 route missing approvalAddress");let a=r?.action?.fromToken?.address||r?.estimate?.fromToken?.address||e.fromToken;i={token:$l(a,"approval token"),spender:$l(s,"approval spender"),amount:String(e.fromAmount)}}return Q({provider:"lifi",calldataReady:!0,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:o,quote:r,autoSlippage:r.autoSlippage,requiresApproval:i,transaction:{chainId:o,from:n.from||e.fromAddress,to:n.to,data:n.data,value:n.value??"0x0",...n.gasLimit!=null?{gasLimit:n.gasLimit}:{},slippageGuard:Oe(r.autoSlippage,{chainId:o,venue:n.to,data:n.data})}},{provider:"lifi",kind:"lifi-tx"})}async function pw(e={}){return C(`${Is(e)}/chains`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??12e3})}var ql,vs,cw,jr=A(()=>{j();Ue();Gn();xe();Xn();ql="https://li.quest/v1";vs="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",cw="0x0000000000000000000000000000000000000000"});var Bl={};B(Bl,{PARASWAP_API:()=>Ll,paraswapHealth:()=>mw,paraswapPrepare:()=>fw,paraswapPrice:()=>rr,paraswapTokens:()=>Ul});function tr(e,t){let r=String(e||"");if(!/^0x[0-9a-fA-F]{40}$/.test(r))throw new Error(`${t} must be a 20-byte token address`);return r.toLowerCase()}async function Ul(e={},t={}){let r=Number(e.chainId||1);return C(`${Os(t)}/tokens/${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function rr(e={},t={}){let r=Number(e.chainId||e.network||1);if(e.amount==null)throw new Error("amount required");let n=new URLSearchParams({srcToken:tr(e.srcToken,"srcToken"),destToken:tr(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(r),version:String(e.version||"6.2")});e.includeDEXS&&n.set("includeDEXS",String(e.includeDEXS)),e.excludeDEXS&&n.set("excludeDEXS",String(e.excludeDEXS));let o=await Kn({wallet:e.userAddress||e.fromAddress,env:t.env,action:e.feeAction||"swap",holderCheck:t.holderCheck});for(let[a,c]of Object.entries(Pl(o)))n.set(a,c);let i=await C(`${Os(t)}/prices?${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4}),s=i?.priceRoute?.destAmount;return s?{...ae(i,{chainId:r,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 fw(e={},t={}){if(String(e.side||"SELL").toUpperCase()!=="SELL")throw new Error("paraswap: agentic prepare currently supports exact-input SELL only");let r=Number(e.chainId||e.network||1),n=tr(e.userAddress,"userAddress"),o=await rr(e,t),i=o?.priceRoute,s=String(i?.contractAddress||"").toLowerCase();if(!s)throw new Error("paraswap: price route missing contractAddress");let a={srcToken:tr(e.srcToken,"srcToken"),destToken:tr(e.destToken,"destToken"),srcAmount:String(i.srcAmount||e.amount),destAmount:String(o.amountOutMinimum),priceRoute:i,userAddress:n,ignoreChecks:!1,ignoreGasEstimate:!1};e.receiver&&(a.receiver=tr(e.receiver,"receiver"));let c=await C(`${Os(t)}/transactions/${r}`,{method:"POST",body:a,fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??25e3});if(Number(c.chainId??r)!==r)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()!==n)throw new Error("paraswap: transaction sender mismatch");return Q({provider:"paraswap",calldataReady:!0,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:r,quote:o,autoSlippage:o.autoSlippage,requiresApproval:a.srcToken!=="0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee"?{token:a.srcToken,spender:i.tokenTransferProxy||s,amount:a.srcAmount}:null,transaction:{chainId:r,from:c.from||n,to:c.to,data:c.data,value:c.value??"0x0",...c.gas!=null?{gasLimit:c.gas}:{},slippageGuard:Oe(o.autoSlippage,{chainId:r,venue:c.to,data:c.data})}},{provider:"paraswap",kind:"paraswap-tx"})}async function mw(e={}){let t=await Ul({chainId:1},e),r=Array.isArray(t?.tokens)?t.tokens.length:Object.keys(t?.tokens||{}).length;return{ok:r>0,tokenSample:r}}var Ll,Os,Yn=A(()=>{j();Ue();xe();Xn();Ll="https://api.paraswap.io",Os=(e={})=>(e.baseUrl||process.env.PARASWAP_API_URL||Ll).replace(/\/$/,"")});function Jn({provider:e,defaultUrl:t,hosts:r=[],url:n,strict:o=!1}){let s=(String(n??"").trim()||String(t)).replace(/\/$/,"");if(s===String(t).replace(/\/$/,""))return{baseUrl:s,trusted:!0,host:Dl(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([Dl(t),...r]).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[Fl]||"")==="1")return{baseUrl:s,trusted:!1,host:c};if(o)throw new Error(`${e}: refusing to call non-allowlisted host ${c} (set ${Fl}=1 to permit it)`);return{baseUrl:s,trusted:!1,host:c}}function Dl(e){let t=new URL(String(e));if(t.protocol!=="http:"&&t.protocol!=="https:")throw new Error("unsupported protocol");return t.host}function Qn(e,t,r){let n={...e};if(!r)return n;for(let[o,i]of Object.entries(t||{}))i&&(n[o]=i);return n}var Fl,Cs=A(()=>{Fl="ORACLE_ALLOW_CUSTOM_PROVIDER_URL"});var Wl={};B(Wl,{ZEROX_API:()=>Ml,zeroxHealth:()=>hw,zeroxPrepare:()=>yw,zeroxPrice:()=>Vl,zeroxQuote:()=>nr});function jl(e={}){return Jn({provider:"zerox",defaultUrl:Ml,hosts:["api.0x.org"],url:e.baseUrl||process.env.ZEROX_API_URL})}function Hl(e={}){return jl(e).baseUrl}function Zn(e={}){return e.apiKey||process.env.ZEROX_API_KEY||process.env.OX_API_KEY||process.env["0X_API_KEY"]||""}function zl(e={}){return Qn({"0x-version":"v2",accept:"application/json"},{"0x-api-key":Zn(e)},jl(e).trusted)}async function hw(e={}){if(!Zn(e))return{ok:!1,configured:!1,error:"ZEROX_API_KEY not set"};try{let t=await Vl({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 Vl(e={},t={}){if(!Zn(t))throw new Error("ZEROX_API_KEY required for 0x");let{chainId:r=8453,sellToken:n,buyToken:o,sellAmount:i,taker:s}=e;if(!n||!o||!i)throw new Error("zeroxPrice requires sellToken, buyToken, sellAmount");let a=new URLSearchParams({chainId:String(r),sellToken:n,buyToken:o,sellAmount:String(i)});return s&&a.set("taker",s),C(`${Hl(t)}/swap/allowance-holder/price?${a}`,{headers:zl(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function nr(e={},t={}){if(!Zn(t))throw new Error("ZEROX_API_KEY required for 0x");let{chainId:r=8453,sellToken:n,buyToken:o,sellAmount:i,taker:s}=e;if(!n||!o||!i)throw new Error("zeroxQuote requires sellToken, buyToken, sellAmount");let a=at({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(r),sellToken:n,buyToken:o,sellAmount:String(i),slippageBps:String(a.selectedBps)});s&&c.set("taker",s);let u=await C(`${Hl(t)}/swap/allowance-holder/quote?${c}`,{headers:zl(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),l=u?.buyAmount||u?.grossBuyAmount;return l?ae(u,{chainId:r,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 yw(e={},t={}){if(!e.taker)throw new Error("0x: taker required for executable prepare");let r=await nr(e,t),n=r?.transaction;if(!n?.to||!n?.data)throw new Error("0x: firm quote returned no transaction");let o=Number(e.chainId??8453),i=r?.issues?.allowance?.spender||r?.allowanceTarget;return Q({provider:"zerox",calldataReady:!0,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:o,quote:r,autoSlippage:r.autoSlippage,requiresApproval:r?.issues?.allowance?.actual!=null&&BigInt(r.issues.allowance.actual)<BigInt(e.sellAmount)?{token:e.sellToken,spender:i,amount:String(e.sellAmount)}:null,transaction:{chainId:o,from:e.taker,to:n.to,data:n.data,value:n.value??"0x0",...n.gas!=null?{gasLimit:n.gas}:{},slippageGuard:Oe(r.autoSlippage,{chainId:o,venue:n.to,data:n.data})}},{provider:"zerox",kind:"zerox-tx"})}var Ml,eo=A(()=>{j();Ue();Cs();xe();Ml="https://api.0x.org"});var uO,Gl=A(()=>{uO=Object.freeze({READ:"read",PREPARE:"prepare",EXECUTE:"execute",AUTONOMOUS:"autonomous"})});import to from"node:fs";import bw from"node:os";import ir from"node:path";import{fileURLToPath as gw}from"node:url";function Kl(){return process.env.ORACLE_FAKE_HOME||bw.homedir()}function xw(){return process.env.ORACLE_PUBLIC_DESKTOP==="1"}function ro(){return xw()?process.env.ORACLE_CONFIG_DIR||ir.join(Kl(),".config","oracle"):ir.join(Kl(),".config","oracle")}function kw(){return ir.join(ro(),"desk.json")}function Sw(){return ir.join(ro(),"env")}function or({force:e=!1}={}){if(or._done&&!e)return or._result||null;or._done=!0;let t={},r=(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=Sw();if(to.existsSync(o))for(let i of to.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)),r(s[1],a)}}catch{}try{let o=kw();if(to.existsSync(o)){let i=JSON.parse(to.readFileSync(o,"utf8"));i&&typeof i=="object"&&(r("ORACLE_DESK_URL",i.deskUrl||i.dataUrl||i.url),r("ORACLE_DATA_URL",i.dataUrl||i.deskUrl||i.url),r("ORACLE_API_URL",i.apiUrl||i.dataUrl||i.deskUrl),r("ORACLE_PUBLIC_URL",i.publicUrl||i.deskUrl||i.dataUrl),r("ORACLE_EXEC_URL",i.execUrl),r("MAD_DESK_URL",i.deskUrl||i.dataUrl))}}catch{}let n=process.env.ORACLE_DESK_URL||process.env.ORACLE_DATA_URL||"";return n&&(r("ORACLE_DESK_URL",n),r("ORACLE_DATA_URL",n),r("ORACLE_API_URL",n),r("ORACLE_PUBLIC_URL",n),r("MAD_DESK_URL",n)),or._result=Object.keys(t).length?t:null,or._result}var ww,hO,Xl=A(()=>{ww=ir.dirname(gw(import.meta.url)),hO=ir.resolve(ww,"../..");try{or()}catch{}});var Ql={};B(Ql,{armPreparedAction:()=>Tw,callSigner:()=>Yl,queueOwnerAction:()=>Jl});import{existsSync as Ew,readFileSync as Aw}from"node:fs";import{request as vw}from"node:http";import Iw from"node:path";function Ow(e=process.env){let t=String(e.ORACLE_SIGNER_URL||_w).replace(/\/$/,""),r;try{r=new URL(t)}catch{return null}return r.hostname!=="127.0.0.1"&&r.hostname!=="localhost"&&r.hostname!=="::1"?null:r.origin}function Cw(e=process.env){if(e.ORACLE_SIGNER_TOKEN)return String(e.ORACLE_SIGNER_TOKEN);let t=Iw.join(ro(),"signer","signer-token");return Ew(t)?Aw(t,"utf8").trim():null}function Yl(e,{method:t="GET",body:r=null,env:n=process.env,timeoutMs:o=4e3}={}){let i=Ow(n),s=Cw(n);return!i||!s?Promise.resolve({ok:!1,error:"local signer is not running"}):new Promise(a=>{let c=new URL(e,i),u=r?Buffer.from(JSON.stringify(r)):null,l=vw({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 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})})});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 Jl(e,t=process.env){if(!e||e.version!==1||!e.surface)throw new Error("queueOwnerAction: version-1 surface envelope required");return Yl("/pending",{method:"POST",body:{artifact:e},env:t,timeoutMs:8e3})}async function Tw(e,t=process.env){let r=e?.localSignerEnvelope||e?.envelope;if(!r||r.version!==1||!r.surface)throw new Error("armPreparedAction: prepared.localSignerEnvelope v1 required");return Jl(r,t)}var _w,Zl=A(()=>{Xl();_w="http://127.0.0.1:9462"});var cd={};B(cd,{COW_CANCEL_TYPES:()=>nd,COW_HOSTS:()=>oo,COW_ORDER_TYPES:()=>no,COW_SETTLEMENT:()=>ed,COW_VAULT_RELAYER:()=>td,armCowOrder:()=>Uw,buildArmedCowOrder:()=>Ps,cowCancelOrders:()=>Hw,cowChains:()=>Ww,cowHealth:()=>qw,cowOrder:()=>ad,cowOrderStatus:()=>sd,cowOrderUid:()=>Bw,cowPrepareCancel:()=>Mw,cowPrepareOrder:()=>Lw,cowQuote:()=>$t,cowSignCancel:()=>jw,cowSignOrder:()=>Fw,cowSubmitSignedOrder:()=>Dw,cowVerifyOrderFill:()=>Vw});import{TypedDataEncoder as Rs,getAddress as Hr,isAddress as Rw}from"ethers";function io(e,t={}){if(t.baseUrl)return t.baseUrl.replace(/\/$/,"");let r=oo[Number(e)];if(!r)throw new Error(`cowswap: unsupported chainId ${e}`);return r}function Nw(e,t="v1",r={}){let n=io(e,r);return t==="v1"?n:n.replace(/\/api\/v1$/,`/api/${t}`)}function ct(e,t){let r=String(e||"").trim();if(!Rw(r))throw new Error(`cowswap: ${t} must be an address`);return Hr(r).toLowerCase()}function sr(e,t){try{let r=BigInt(String(e));if(r<0n)throw new Error("negative");return r.toString()}catch{throw new Error(`cowswap: ${t} must be a non-negative integer string`)}}function od(e,t){let r=String(e||"").trim();if(!/^0x[0-9a-fA-F]{64}$/.test(r))throw new Error(`cowswap: ${t} must be bytes32 hex`);return r.toLowerCase()}function id(e,t="uid"){let r=String(e||"").trim();if(!/^0x[0-9a-fA-F]{112}$/.test(r))throw new Error(`cowswap: ${t} must be 56-byte order UID hex`);return r.toLowerCase()}function Pw({digest:e,owner:t,validTo:r}={}){let n=od(e,"order digest").slice(2),o=ct(t,"owner").slice(2).toLowerCase(),i=Number(r);if(!Number.isInteger(i)||i<0||i>4294967295)throw new Error("cowswap: validTo must fit uint32");return`0x${n}${o}${i.toString(16).padStart(8,"0")}`.toLowerCase()}function Ns(e){let t=ed[Number(e)];if(!t)throw new Error(`cowswap: settlement contract not registered for chain ${e}`);return{name:"Gnosis Protocol",version:"v2",chainId:Number(e),verifyingContract:Hr(t)}}function $w(e={},t,r){let n=ct(e.sellToken,"sellToken"),o=ct(e.buyToken,"buyToken"),i=ct(e.receiver||r,"receiver"),s=Number(e.validTo);if(!Number.isInteger(s)||s<=0)throw new Error("cowswap: quote.validTo required");let a=od(e.appData||e.appDataHash||`0x${"0".repeat(64)}`,"appData");return{sellToken:n,buyToken:o,receiver:i,sellAmount:sr(e.sellAmount,"sellAmount"),buyAmount:sr(e.buyAmount,"buyAmount"),validTo:s,appData:a,feeAmount:sr(e.feeAmount??"0","feeAmount"),kind:String(e.kind||"sell"),partiallyFillable:!!e.partiallyFillable,sellTokenBalance:String(e.sellTokenBalance||"erc20"),buyTokenBalance:String(e.buyTokenBalance||"erc20")}}async function qw(e={}){try{let t=await $t({chainId:1,sellToken:Ts[1],buyToken:rd[1],sellAmountBeforeFee:"1000000000000000",from:gt},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 $t(e={},t={}){let r=Number(e.chainId??1),n=Es(e.from||e.owner),o=e.sellToken||Ts[r],i=e.buyToken||rd[r],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=Ts[r],!o))throw new Error("no WETH mapping for chain");let a={sellToken:o,buyToken:i,from:n,receiver:e.receiver||n,sellAmountBeforeFee:s,kind:e.kind||"sell",signingScheme:e.signingScheme||"eip1271"},c=await C(`${io(r,t)}/quote`,{method:"POST",body:a,fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),u=c?.quote?.buyAmount||c?.buyAmount;return u?ae(c,{chainId:r,venue:"cowswap-order",amountOut:u,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps}):c}async function Lw(e={},t={}){let r=Number(e.chainId??1),n=ct(Es(e.from||e.owner||e.signer),"owner"),o=await $t({...e,chainId:r,from:n,signingScheme:e.signingScheme||"eip712"},t),i=$w(o?.quote||o,r,n),s=Ns(r),a={domain:s,types:no,primaryType:"Order",message:i},c=Rs.hash(s,no,i),u=td[r];if(!u)throw new Error(`cowswap: vault relayer not registered for chain ${r}`);return Q({provider:"cowswap",orderReady:!0,executionReady:!1,chainId:r,owner:n,signingScheme:"eip712",settlement:s.verifyingContract.toLowerCase(),vaultRelayer:Hr(u).toLowerCase(),quote:o,quoteId:o?.id??e.quoteId??null,typedData:a,cowGuard:{mode:"cow-order",version:1,provider:"cowswap",chainId:r,owner:n,settlement:s.verifyingContract.toLowerCase(),vaultRelayer:Hr(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:Hr(u).toLowerCase(),amount:i.sellAmount},localSignerEnvelope:Ps({chainId:r,owner:n,typedData:a,quoteId:o?.id??e.quoteId??null,cowGuard:{expiresAtMs:Math.min(i.validTo*1e3,Date.now()+2e4)}})},{provider:"cowswap",kind:"cow-order"})}function Ps(e={},t={}){let r=e.typedData;if(!r?.domain||!r?.types||!r?.message)throw new Error("cowswap: typedData required to arm");let n=Number(e.chainId??r.domain.chainId),o=oo[n];if(!o)throw new Error(`cowswap: unsupported chainId ${n}`);let i=ct(e.owner,"owner"),s=Number(t.nowMs??Date.now()),a=Rs.hash(r.domain,r.types,r.message);return Object.freeze({tradeId:`cow:${n}:${a.slice(2)}`,version:1,surface:"evm-order",action:"order",owner:i,destination:"cowswap",chainId:n,expiresAtMs:Number(e.cowGuard?.expiresAtMs??s+2e4),slippageBps:0,fee:{oracleFeeBps:0},artifact:Object.freeze({kind:"cow",chainId:n,submitTo:`${o}/orders`,quoteId:e.quoteId??null,domain:r.domain,types:r.types,message:r.message,typedData:r})})}async function Uw(e={},t={}){let{queueOwnerAction:r}=await Promise.resolve().then(()=>(Zl(),Ql)),n=e.localSignerEnvelope||Ps(e,t);return{...await r(n,t.env),envelope:n,execution:"armed-local",exec:!1}}async function sd(e={},t={}){let r=Number(e.chainId??1),n=String(e.uid||e.orderUid||"").trim();if(!n)throw new Error("cowOrderStatus requires uid");return C(`${io(r,t)}/orders/${encodeURIComponent(n)}/status`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function ad(e={},t={}){let r=Number(e.chainId??1),n=String(e.uid||e.orderUid||"").trim();if(!n)throw new Error("cowOrder requires uid");return C(`${io(r,t)}/orders/${encodeURIComponent(n)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}function Bw(e={}){let t=e.typedData||e,r=Number(e.chainId??t?.domain?.chainId),n=t?.message||e.order||e.message;if(!n)throw new Error("cowswap: typed order message required");let o=e.cowGuard?.typedDataHash||Rs.hash(Ns(r),no,n),i=e.owner||e.from||e.signer||n.receiver;return Pw({digest:o,owner:i,validTo:n.validTo})}async function Fw(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 Dw(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 Mw(e={}){let t=Number(e.chainId??1),r=ct(e.owner||e.from||e.signer,"owner"),n=(e.orderUids||e.uids||[e.uid]).filter(Boolean).map((s,a)=>id(s,`orderUids[${a}]`));if(!n.length)throw new Error("cowswap: orderUids required");let o=Ns(t);return Q({provider:"cowswap",chainId:t,owner:r,orderUids:n,signingScheme:"eip712",typedData:{domain:o,types:nd,primaryType:"OrderCancellations",message:{orderUids:n}},cancelReady:!0,executableArtifact:!0},{provider:"cowswap",kind:"cow-cancel"})}async function jw(e={},t={}){throw new Error("cowswap.cowSignCancel refused: @oracle-agent/oracle is prepare-only. Cancel-sign with the user wallet.")}async function Hw(e={},t={}){throw new Error("cowswap.cowCancelOrders refused: @oracle-agent/oracle is prepare-only. Cancel from the user wallet or local operator.")}function zw(e={}){return sr(e.buyAmount??e.executedBuyAmount??"0","trade.buyAmount")}async function Vw(e={},t={}){let r=Number(e.chainId??1),n=id(e.uid||e.orderUid),o=t.order||await ad({chainId:r,uid:n},t),i=t.status||o.status||await sd({chainId:r,uid:n},t).catch(()=>null),s=t.trades||await C(`${Nw(r,"v2",t)}/trades?orderUid=${encodeURIComponent(n)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),a=Array.isArray(s)?s:[],c=e.expectedOwner?ct(e.expectedOwner,"expectedOwner"):null;if(c&&ct(o.owner||a[0]?.owner||c,"owner")!==c)return{ok:!1,provider:"cowswap",chainId:r,uid:n,reason:"owner mismatch",order:o,status:i,trades:a};let u=0n;for(let p of a.filter(f=>String(f.orderUid||"").toLowerCase()===n))u+=BigInt(zw(p));u===0n&&o.executedBuyAmount!=null&&(u=BigInt(sr(o.executedBuyAmount,"executedBuyAmount")));let l=e.minBuyAmount!=null?BigInt(sr(e.minBuyAmount,"minBuyAmount")):0n,d=u>=l&&String(o.status||i?.status||"").toLowerCase()!=="expired";return{ok:d,provider:"cowswap",chainId:r,uid:n,status:o.status||i?.status||null,executedBuyAmount:u.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 Ww(){return Object.keys(oo).map(Number)}var oo,ed,td,Ts,rd,no,nd,so=A(()=>{j();Ue();Gl();Gn();xe();oo={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"},ed=Object.freeze({1:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41",100:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41",42161:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41",8453:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41"}),td=Object.freeze({1:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110",100:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110",42161:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110",8453:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110"}),Ts={1:"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",8453:"0x4200000000000000000000000000000000000006",42161:"0x82aF49447D8a07e3bd95BD0d56f35241523fBab1"},rd={1:"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",8453:"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",42161:"0xaf88d065e77c8cC2239327C5EDb3A432268e5831"},no=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"}]}),nd=Object.freeze({OrderCancellations:[{name:"orderUids",type:"bytes[]"}]})});var ld={};B(ld,{CHAINS:()=>ao,chainById:()=>qs,isSupportedChain:()=>ud,registerChain:()=>Gw,rpcUrlFor:()=>Ls});function qs(e){return $s.get(Number(e))||null}function Gw({key:e,chainId:t,name:r,rpcEnv:n=[]}){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:r||e,rpcEnv:n,evm:!0};return ao[e]=o,$s.set(o.chainId,o),o}function Ls(e,t=process.env){let r=qs(e);if(!r)return null;for(let n of r.rpcEnv){let o=(t[n]||"").trim();if(o)return o}return null}function ud(e){return $s.has(Number(e))}var ao,$s,Us=A(()=>{ao={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}},$s=new Map(Object.values(ao).map(e=>[e.chainId,e]))});import{Interface as Kw,getAddress as Xw}from"ethers";function Vr(e,t){try{return Xw(e).toLowerCase()}catch{throw new Error(`${t} must be a valid EVM address`)}}function Jw(e,{rpcUrl:t,env:r=process.env}={}){if(t)return t;let n=Ls(e,r);return n||Yw[Number(e)]||null}function Zw(e){let t=String(e||""),r=t.toLowerCase();if(t!==t.trim()||!/^[a-zA-Z0-9_]+$/.test(t)||!Qw.test(r))throw new Error(`evm-rpc: ${t} refused \u2014 @oracle-agent/oracle is prepare-only (read RPC only; no broadcast/sign)`);return r}function ex(e){let t=new Error(e?.message||JSON.stringify(e));return t.code=e?.code,t}function tx(e){if(e?.error)throw ex(e.error);return e?.result}function rx(e,t,r){return`${e}
5
5
  ${t}
6
- ${JSON.stringify(r??[])}`}async function Fw(e,t,r){return C(e,{method:"POST",body:t,fetchImpl:r.fetchImpl,timeoutMs:r.timeoutMs??12e3,signal:r.signal})}async function Y(e,t,r=[],n={}){let o=String(t||""),i=qw(o),s=Pw(e,n);if(!s)throw new Error(`No RPC URL for chainId ${e} (set env from chain registry rpcEnv or pass rpcUrl)`);if(i==="eth_chainid"&&n.cacheChainId!==!1){let l=td.get(s);if(l!=null)return l}let c=n.dedupe!==!1&&!n.signal?Bw(s,o,r):null;if(c&&Mr.has(c))return Mr.get(c);let u=(async()=>{let l=await Fw(s,{jsonrpc:"2.0",id:1,method:t,params:r},n),d=Uw(l);return i==="eth_chainid"&&typeof d=="string"&&td.set(s,d),d})();return c&&(Mr.set(c,u),u.finally(()=>{Mr.get(c)===u&&Mr.delete(c)}).catch(()=>{})),u}async function so(e,t={}){let r=await Y(e,"eth_blockNumber",[],t);return parseInt(r,16)}async function rd(e,t={}){let r=await Y(e,"eth_gasPrice",[],t);if(r==null)return null;try{return BigInt(r)}catch{return null}}async function nd(e,t,r={}){if(!t)throw new Error("rpcGetBalance requires address");let n=await Y(e,"eth_getBalance",[t,"latest"],r);return{chainId:Number(e),address:t,balanceWei:BigInt(n).toString(),balanceHex:n}}async function od(e={},t={}){let r=Number(e.chainId??t.chainId??1),n=jr(e.token||e.tokenAddress,"token"),o=jr(e.owner,"owner"),i=jr(e.spender,"spender"),s=io.encodeFunctionData("allowance",[o,i]),a=await Y(r,"eth_call",[{to:n,data:s},e.blockTag||"latest"],t),c=io.decodeFunctionResult("allowance",a),u=BigInt(c[0]);return{chainId:r,token:n,owner:o,spender:i,allowance:u.toString(),allowanceHex:`0x${u.toString(16)}`,blockTag:e.blockTag||"latest"}}async function id(e={},t={}){let r=Number(e.chainId??t.chainId??1),n=jr(e.token||e.tokenAddress,"token"),o=jr(e.account||e.owner||e.address,"account"),i=io.encodeFunctionData("balanceOf",[o]),s=await Y(r,"eth_call",[{to:n,data:i},e.blockTag||"latest"],t),a=io.decodeFunctionResult("balanceOf",s),c=BigInt(a[0]);return{chainId:r,token:n,account:o,balance:c.toString(),balanceHex:`0x${c.toString(16)}`,blockTag:e.blockTag||"latest"}}var io,Nw,$w,Mr,td,ut=A(()=>{j();Ps();io=new Tw(["function allowance(address owner,address spender) view returns (uint256)","function balanceOf(address account) view returns (uint256)"]);Nw={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"};$w=/^(?:eth_(?:call|blocknumber|chainid|get[a-z0-9]+|feehistory|gasprice|maxpriorityfeepergas|syncing|protocolversion|estimategas|createaccesslist)|net_(?:version|listening|peercount)|web3_(?:clientversion|sha3))$/;Mr=new Map,td=new Map});function sd(e,t){let r=String(e||"").toLowerCase(),n=String(t?.quote||t?.quoteToken?.address||"").toLowerCase(),o=String(t?.base||t?.baseToken?.address||"").toLowerCase();return n===r?{address:t.base||t.baseToken?.address,symbol:t.baseToken?.symbol}:o===r?{address:t.quote||t.quoteToken?.address,symbol:t.quoteToken?.symbol}:{address:t.quote||t.quoteToken?.address,symbol:t.quoteToken?.symbol}}function ao(e,t=[],{stables:r=[],wrappedNative:n=null}={}){let o=String(e||"").toLowerCase(),i=new Set((r||[]).map(c=>String(c).toLowerCase())),s=String(n||"").toLowerCase(),a=(t||[]).map((c,u)=>{let l=sd(o,c),d=String(l.address||"").toLowerCase(),p=String(l.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)||Dw.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:u,otherAddr:d,liquidityUsd:m}});return a.sort((c,u)=>u.score-c.score||c.index-u.index),a.map(c=>c.pool)}function ad(e,t=[]){let r=Array.isArray(t)?t:[];return r.length&&sd(e,r[0]).address||null}var Dw,$s=A(()=>{Dw=new Set(["usdc","usdt","usdg","dai","usd1","usde","pyusd"])});function zw(e,t,r){let n=Be(t),o=Be(r),i=Be(e?.baseToken?.address),s=Be(e?.quoteToken?.address);return i===n&&s===o||i===o&&s===n}function Vw(e){let t=Number(e?.liquidity?.usd);return Number.isFinite(t)&&t>=0?t:null}function Ww(e={}){return(e.baseUrl||process.env.DEXSCREENER_API_URL||Mw).replace(/\/$/,"")}async function co(e,t={}){if(!e)throw new Error("tokenAddress required");return C(`${Ww(t)}/latest/dex/tokens/${e}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3})}async function cd({chainId:e,tokenA:t,tokenB:r,dexIds:n=[]}={},o={}){return(await Hr({chainId:e,tokenA:t,tokenB:r,dexIds:n},o))[0]??null}async function Hr({chainId:e,tokenA:t,tokenB:r,dexIds:n=[]}={},o={}){if(e==null||!t||!r)throw new Error("chainId, tokenA, and tokenB required");let i=Be(jw[Number(e)]||e),s=new Set(Hw(n).filter(Boolean).map(Be)),a=[...new Set([t,r].map(p=>String(p)).filter(Boolean))],c=await Promise.allSettled(a.map(p=>co(p,{...o,baseUrl:o.dexscreenerBaseUrl,timeoutMs:o.dexscreenerTimeoutMs??Math.min(Number(o.timeoutMs??4e3),4e3)}))),u=new Set,l=[];for(let p of c)if(p.status==="fulfilled")for(let f of p.value?.pairs||p.value?.data?.pairs||[]){let m=`${Be(f?.chainId)}:${Be(f?.dexId)}:${Be(f?.pairAddress)}`;u.has(m)||(u.add(m),l.push(f))}return l.filter(p=>Be(p?.chainId)===i).filter(p=>zw(p,t,r)).filter(p=>!s.size||s.has(Be(p?.dexId))).map(p=>({pairAddress:p.pairAddress??null,dexId:p.dexId??null,chainId:p.chainId??null,liquidityUsd:Vw(p),pairCreatedAt:p.pairCreatedAt??null})).filter(p=>p.liquidityUsd!=null).sort((p,f)=>f.liquidityUsd-p.liquidityUsd)}async function ud(e,{chainSlug:t="solana",stables:r=Gw}={},n={}){let o=await co(e,n),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=ao(e,s,{stables:r});return{chain:t,token:e,pools:a,topPool:a[0]||null}}var Mw,jw,Be,Hw,Gw,zr=A(()=>{j();$s();Mw="https://api.dexscreener.com",jw=Object.freeze({1:"ethereum",10:"optimism",56:"bsc",137:"polygon",8453:"base",42161:"arbitrum",43114:"avalanche",999:"hyperevm",4663:"robinhood"}),Be=e=>String(e??"").toLowerCase(),Hw=e=>Array.isArray(e)?e:e==null?[]:[e];Gw=["EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v","Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB"]});var gd={};B(gd,{PANCAKE_FEE_TIERS:()=>uo,UNI_V3_CHAINS:()=>ke,UNI_V3_FEE_TIERS:()=>fd,UNI_V3_VENUES:()=>yd,uniV3Chains:()=>ex,uniV3EthUsdc:()=>bd,uniV3Health:()=>Zw,uniV3PrepareExactIn:()=>Qw,uniV3QuoteExactIn:()=>$t,uniV3QuoteExactInPath:()=>Jw});import{Interface as dd,getAddress as Vr,isAddress as pd}from"ethers";function Ls(e,t){let r=Number(e),n=ke[r];if(!n)throw new Error(`uniswap-v3: unsupported chainId ${e} (supported: ${Object.keys(ke).join(", ")})`);let o=yd[r]||{};if(!t){if(!n.quoter||!n.router){let c=Object.keys(o).join(", ")||"none registered";throw new Error(`uniswap-v3: chain ${r} (${n.name}) has no canonical Uniswap v3 deployment -- name a venue explicitly (known: ${c})`)}return{chainId:r,venue:n.name,...n}}let i=String(t).toLowerCase();if(i===n.name&&n.quoter&&n.router)return{chainId:r,venue:n.name,...n};let s=o,a=s[i];if(!a){let c=[...n.quoter&&n.router?[n.name]:[],...Object.keys(s)].join(", ");throw new Error(`uniswap-v3: unknown venue "${t}" on chain ${r} (known: ${c})`)}return{chainId:r,venue:i,...n,quoter:a.quoter,router:a.router,feeTiers:a.feeTiers||null}}function qs(e,t){let r=ke[Number(t)];if(!e||e===md||e===hd||/^eth$/i.test(String(e)))return Vr(r.weth);let n=String(e);if(/^weth$/i.test(n))return Vr(r.weth);if(/^usdc$/i.test(n))return Vr(r.usdc);if(!pd(n))throw new Error(`invalid token address: ${e}`);return Vr(n)}function Xw(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 Yw(e,t){if(e.length!==t.length+1)throw new Error("path: fees.length must be tokens.length - 1");let r="0x";for(let n=0;n<t.length;n++)r+=e[n].slice(2).toLowerCase(),r+=Number(t[n]).toString(16).padStart(6,"0");return r+=e[e.length-1].slice(2).toLowerCase(),r}async function $t(e={},t={}){let{chainId:r,quoter:n,router:o,feeTiers:i}=Ls(e.chainId??8453,e.venue),s=qs(e.tokenIn||"WETH",r),a=qs(e.tokenOut||ke[r].usdc,r),c=BigInt(e.amountIn??0);if(c<=0n)throw new Error("amountIn required (raw base units)");let u=i&&i.length?i:fd,l=e.fee!=null?[Number(e.fee)]:e.tryFees===!1?[u[Math.min(2,u.length-1)]]:[...u],p=await Promise.all(l.map(async g=>{let b=lo.encodeFunctionData("quoteExactInputSingle",[{tokenIn:s,tokenOut:a,amountIn:c,fee:g,sqrtPriceLimitX96:0n}]);try{let S=await Y(r,"eth_call",[{to:n,data:b},"latest"],t);if(!S||S==="0x")return{fee:g,ok:!1,error:"empty result"};let k=lo.decodeFunctionResult("quoteExactInputSingle",S);return{fee:g,ok:!0,amountOut:k[0].toString(),sqrtPriceX96After:k[1].toString(),initializedTicksCrossed:Number(k[2]),gasEstimate:k[3].toString()}}catch(S){return{fee:g,ok:!1,error:String(S.message||S).slice(0,160)}}})),f=null;for(let g of p)g.ok&&(!f||BigInt(g.amountOut)>BigInt(f.amountOut))&&(f=g);if(!f){let g=p.map(b=>`${b.fee}:${b.error||"fail"}`).join("; ");throw new Error(`uniswap-v3 quote failed chain=${r}: ${g}`)}let m=e.liquidityUsd==null?await Hr({chainId:r,tokenA:s,tokenB:a,dexIds:Xw(e.venue)},t).catch(()=>[]):[],h={};await Promise.all(m.slice(0,8).map(async g=>{if(!(!g.pairAddress||!pd(g.pairAddress)))try{let b=await Y(r,"eth_call",[{to:g.pairAddress,data:Kw},"latest"],t),S=b&&b!=="0x"&&b.length<=66?Number.parseInt(b,16):NaN;if(!Number.isFinite(S)||S<=0||S>1e6)return;let k=h[S];(k==null||g.liquidityUsd>k.liquidityUsd)&&(h[S]=g)}catch{}}));let y=e.liquidityBandBps==null?50:Number(e.liquidityBandBps),x=null;if(e.fee==null&&y>0&&BigInt(f.amountOut)>0n){let g=BigInt(f.amountOut),S=p.filter(k=>k.ok&&Number((g-BigInt(k.amountOut))*10000n/g)<=y).filter(k=>h[k.fee]?.liquidityUsd!=null).sort((k,N)=>h[N.fee].liquidityUsd-h[k.fee].liquidityUsd)[0];S&&S.fee!==f.fee&&(x={priceBestFee:f.fee,chosenFee:S.fee,chosenPoolUsd:h[S.fee].liquidityUsd,bandBps:y},f=S)}let E=h[f.fee]??null,_=m[0]??null,w=E??_,O=e.liquidityUsd??E?.liquidityUsd??_?.liquidityUsd??null,v=e.liquidityUsd!=null?"caller":E?"pool":_?"pair":null;return ae({venue:"uniswap-v3",chainId:r,chain:ke[r].name,quoter:n,tokenIn:s,tokenOut:a,amountIn:c.toString(),fee:f.fee,amountOut:f.amountOut,gasEstimate:f.gasEstimate,liquidityUsd:O,liquiditySource:w,liquidityAttribution:v,liquidityPick:x,sqrtPriceX96After:f.sqrtPriceX96After,initializedTicksCrossed:f.initializedTicksCrossed,triedFees:p,best:!0},{chainId:r,venue:o,amountOut:f.amountOut,liquidityUsd:O,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps})}async function Jw(e={},t={}){let{chainId:r,quoter:n,router:o}=Ls(e.chainId??8453),i=(e.tokens||[]).map(p=>qs(p,r)),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=Yw(i,s),u=lo.encodeFunctionData("quoteExactInput",[c,a]),l=await Y(r,"eth_call",[{to:n,data:u},"latest"],t),d=lo.decodeFunctionResult("quoteExactInput",l);return ae({venue:"uniswap-v3",chainId:r,chain:ke[r].name,quoter:n,tokens:i,fees:s,path:c,amountIn:a.toString(),amountOut:d[0].toString(),gasEstimate:d[3].toString()},{chainId:r,venue:o,amountOut:d[0].toString(),liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps})}async function bd(e={},t={}){let r=Number(e.chainId??8453),n=e.amountIn??"1000000000000000",o=await $t({chainId:r,tokenIn:ke[r].weth,tokenOut:ke[r].usdc,amountIn:n,fee:e.fee},t),i=Number(o.amountOut)/1e6;return{...o,amountOutUsdc:i,pair:"WETH/USDC"}}async function Qw(e={},t={}){let r=Number(e.chainId??8453),n=Ls(r,e.venue),o=Vr(e.recipient),i=String(e.tokenIn||"WETH"),s=!e.tokenIn||i===md||i===hd||/^eth$/i.test(i),a=await $t(e,t),c=ld.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,p=ld.encodeFunctionData("multicall",[d,[c]]);return Q({provider:"uniswap-v3",calldataReady:!0,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:r,deadline:d,quote:a,autoSlippage:a.autoSlippage,requiresApproval:s?null:{token:a.tokenIn,spender:n.router,amount:a.amountIn},transaction:{chainId:r,from:o,to:n.router,data:p,value:s?a.amountIn:"0",slippageGuard:Oe(a.autoSlippage,{chainId:r,venue:n.router,data:p})}},{provider:"uniswap-v3",kind:"univ3-swap-tx"})}async function Zw(e={}){let t=Number(e.chainId??8453);try{let r=await bd({chainId:t,amountIn:"1000000000000000"},e);return{ok:!0,chainId:t,fee:r.fee,amountOutUsdc:r.amountOutUsdc,midPxHint:r.amountOutUsdc/.001}}catch(r){return{ok:!1,chainId:t,error:String(r.message||r).slice(0,200)}}}async function ex(){return Object.entries(ke).map(([e,t])=>({chainId:Number(e),name:t.name,quoter:t.quoter,weth:t.weth,usdc:t.usdc}))}var ke,fd,Kw,lo,ld,md,hd,uo,yd,po=A(()=>{ut();zr();Ue();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"}},fd=[100,500,3e3,1e4],Kw="0xddca3f43",lo=new dd(["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)"]),ld=new dd(["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)"]),md="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",hd="0x0000000000000000000000000000000000000000",uo=[100,500,2500,1e4],yd={56:{pancakeswap:{name:"pancakeswap",quoter:"0xB048Bbc1Ee6b733FFfCFb9e9CeF7375518e25997",router:"0x13f4EA83D0bd40E75C8222255bc855a974568Dd4",feeTiers:uo}},8453:{pancakeswap:{name:"pancakeswap",quoter:"0xB048Bbc1Ee6b733FFfCFb9e9CeF7375518e25997",router:"0x13f4EA83D0bd40E75C8222255bc855a974568Dd4",feeTiers:uo}},42161:{pancakeswap:{name:"pancakeswap",quoter:"0xB048Bbc1Ee6b733FFfCFb9e9CeF7375518e25997",router:"0x13f4EA83D0bd40E75C8222255bc855a974568Dd4",feeTiers:uo}},999:{hyperswap:{name:"hyperswap",quoter:"0x03A918028f22D9E1473B7959C927AD7425A45C7C",router:"0x4E2960a8cd19B467b82d26D83fAcb0fAE26b094D"}}}});var Ed={};B(Ed,{executeRfqCandidates:()=>kd,rankRfqQuotes:()=>Sd,requestRfqQuotes:()=>nx,sourceCandidates:()=>xd});function Wr(e,t){return Array.isArray(e?.allowedSources)&&e.allowedSources.includes(t)}function wd(e,t){return String(e?.[t]??"").trim()}function Gr(e,t){return Object.freeze({source:e,run:t})}function xd(e,t={}){if(!e||e.kind!=="rfq-intent")throw new Error("rfq: intent required");let r=t.env??process.env,n=t.providers??{},o=t.supportedUniV3Chains??ke,i=Number(e.fromChainId)===Number(e.toChainId),s=[];return Wr(e,"lifi")&&s.push(Gr("lifi",async()=>{let c=await(n.lifiQuote??Nt)({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 tx(t,c.transactionRequest.data):void 0,route:c},metadata:{tool:c?.tool??c?.toolDetails?.name??null}}})),i&&(Wr(e,"paraswap")&&s.push(Gr("paraswap",async()=>{let c=await(n.paraswapPrice??Zt)({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}}})),Wr(e,"0x")&&(wd(r,"ZEROX_API_KEY")||wd(r,"0X_API_KEY")||n.zeroxQuote)&&s.push(Gr("0x",async()=>{let c=await(n.zeroxQuote??er)({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}}})),Wr(e,"cow")&&s.push(Gr("cow",async()=>{let c=await(n.cowQuote??Pt)({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}}})),Wr(e,"uniswap-v3")&&o[Number(e.fromChainId)]&&s.push(Gr("uniswap-v3",async()=>{let c=await(n.uniV3QuoteExactIn??$t)({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 tx(e,t){return`0x${(await import("node:crypto")).createHash("sha256").update(String(t)).digest("hex")}`}async function rx(e,t){return Promise.race([Promise.resolve().then(e.run),new Promise((r,n)=>setTimeout(()=>n(new Error(`${e.source}: timeout`)),t))])}async function kd(e,t,r={}){let n=Number(r.timeoutMs??12e3),o=await Promise.allSettled(t.map(a=>rx(a,n))),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(ms(e,{...u.value,source:c.source},r))}catch(l){s.push({source:c.source,error:String(l?.message||l)})}}return{quotes:i,failed:s}}function Sd(e=[],t={}){let r=Number(t.nowMs??Date.now()),n=e.filter(s=>Number(s.expiryMs??0)>r);n.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=n.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 nx(e,t={}){let r=xd(e,t),{quotes:n,failed:o}=await kd(e,r,t),i=Sd(n,t);return{kind:"rfq-result",intent:e,best:i.best,quotes:i.quotes,failed:o,warnings:[...i.warnings],sourcesTried:r.length,sourcesAnswered:n.length}}var Ad=A(()=>{Fr();Gn();Jn();no();po();hs()});function vd(e={}){let t=[],r=[];if(!e||typeof e!="object")return{ok:!1,errors:["definition must be an object"],warnings:r};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}ox.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||r.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 n=e.capabilities||{};for(let o of Object.keys(n))or.includes(o)?typeof n[o]!="function"&&t.push(`capability "${o}" must be a function`):t.push(`unknown capability "${o}"`);return Object.keys(n).length===0&&r.push("scanner implements no capabilities -- it can only be registered, not used"),n.prepareUnsignedTx&&!n.quote&&r.push("prepareUnsignedTx without quote: no priced expectation to validate the built tx against"),n.prepareUnsignedTx&&!n.sellSimulation&&r.push("prepareUnsignedTx without sellSimulation: cannot prove an asset is exitable before buying"),{ok:t.length===0,errors:t,warnings:r}}function Id(e){let{ok:t,errors:r,warnings:n}=vd(e);if(!t)throw new Error(`invalid scanner for ${e?.key??"<unknown>"}:
6
+ ${JSON.stringify(r??[])}`}async function nx(e,t,r){return C(e,{method:"POST",body:t,fetchImpl:r.fetchImpl,timeoutMs:r.timeoutMs??12e3,signal:r.signal})}async function Y(e,t,r=[],n={}){let o=String(t||""),i=Zw(o),s=Jw(e,n);if(!s)throw new Error(`No RPC URL for chainId ${e} (set env from chain registry rpcEnv or pass rpcUrl)`);if(i==="eth_chainid"&&n.cacheChainId!==!1){let l=dd.get(s);if(l!=null)return l}let c=n.dedupe!==!1&&!n.signal?rx(s,o,r):null;if(c&&zr.has(c))return zr.get(c);let u=(async()=>{let l=await nx(s,{jsonrpc:"2.0",id:1,method:t,params:r},n),d=tx(l);return i==="eth_chainid"&&typeof d=="string"&&dd.set(s,d),d})();return c&&(zr.set(c,u),u.finally(()=>{zr.get(c)===u&&zr.delete(c)}).catch(()=>{})),u}async function uo(e,t={}){let r=await Y(e,"eth_blockNumber",[],t);return parseInt(r,16)}async function pd(e,t={}){let r=await Y(e,"eth_gasPrice",[],t);if(r==null)return null;try{return BigInt(r)}catch{return null}}async function fd(e,t,r={}){if(!t)throw new Error("rpcGetBalance requires address");let n=await Y(e,"eth_getBalance",[t,"latest"],r);return{chainId:Number(e),address:t,balanceWei:BigInt(n).toString(),balanceHex:n}}async function md(e={},t={}){let r=Number(e.chainId??t.chainId??1),n=Vr(e.token||e.tokenAddress,"token"),o=Vr(e.owner,"owner"),i=Vr(e.spender,"spender"),s=co.encodeFunctionData("allowance",[o,i]),a=await Y(r,"eth_call",[{to:n,data:s},e.blockTag||"latest"],t),c=co.decodeFunctionResult("allowance",a),u=BigInt(c[0]);return{chainId:r,token:n,owner:o,spender:i,allowance:u.toString(),allowanceHex:`0x${u.toString(16)}`,blockTag:e.blockTag||"latest"}}async function hd(e={},t={}){let r=Number(e.chainId??t.chainId??1),n=Vr(e.token||e.tokenAddress,"token"),o=Vr(e.account||e.owner||e.address,"account"),i=co.encodeFunctionData("balanceOf",[o]),s=await Y(r,"eth_call",[{to:n,data:i},e.blockTag||"latest"],t),a=co.decodeFunctionResult("balanceOf",s),c=BigInt(a[0]);return{chainId:r,token:n,account:o,balance:c.toString(),balanceHex:`0x${c.toString(16)}`,blockTag:e.blockTag||"latest"}}var co,Yw,Qw,zr,dd,ut=A(()=>{j();Us();co=new Kw(["function allowance(address owner,address spender) view returns (uint256)","function balanceOf(address account) view returns (uint256)"]);Yw={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"};Qw=/^(?:eth_(?:call|blocknumber|chainid|get[a-z0-9]+|feehistory|gasprice|maxpriorityfeepergas|syncing|protocolversion|estimategas|createaccesslist)|net_(?:version|listening|peercount)|web3_(?:clientversion|sha3))$/;zr=new Map,dd=new Map});function yd(e,t){let r=String(e||"").toLowerCase(),n=String(t?.quote||t?.quoteToken?.address||"").toLowerCase(),o=String(t?.base||t?.baseToken?.address||"").toLowerCase();return n===r?{address:t.base||t.baseToken?.address,symbol:t.baseToken?.symbol}:o===r?{address:t.quote||t.quoteToken?.address,symbol:t.quoteToken?.symbol}:{address:t.quote||t.quoteToken?.address,symbol:t.quoteToken?.symbol}}function lo(e,t=[],{stables:r=[],wrappedNative:n=null}={}){let o=String(e||"").toLowerCase(),i=new Set((r||[]).map(c=>String(c).toLowerCase())),s=String(n||"").toLowerCase(),a=(t||[]).map((c,u)=>{let l=yd(o,c),d=String(l.address||"").toLowerCase(),p=String(l.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)||ox.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:u,otherAddr:d,liquidityUsd:m}});return a.sort((c,u)=>u.score-c.score||c.index-u.index),a.map(c=>c.pool)}function bd(e,t=[]){let r=Array.isArray(t)?t:[];return r.length&&yd(e,r[0]).address||null}var ox,Bs=A(()=>{ox=new Set(["usdc","usdt","usdg","dai","usd1","usde","pyusd"])});function cx(e,t,r){let n=Be(t),o=Be(r),i=Be(e?.baseToken?.address),s=Be(e?.quoteToken?.address);return i===n&&s===o||i===o&&s===n}function ux(e){let t=Number(e?.liquidity?.usd);return Number.isFinite(t)&&t>=0?t:null}function lx(e={}){return(e.baseUrl||process.env.DEXSCREENER_API_URL||ix).replace(/\/$/,"")}async function po(e,t={}){if(!e)throw new Error("tokenAddress required");return C(`${lx(t)}/latest/dex/tokens/${e}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3})}async function gd({chainId:e,tokenA:t,tokenB:r,dexIds:n=[]}={},o={}){return(await Wr({chainId:e,tokenA:t,tokenB:r,dexIds:n},o))[0]??null}async function Wr({chainId:e,tokenA:t,tokenB:r,dexIds:n=[]}={},o={}){if(e==null||!t||!r)throw new Error("chainId, tokenA, and tokenB required");let i=Be(sx[Number(e)]||e),s=new Set(ax(n).filter(Boolean).map(Be)),a=[...new Set([t,r].map(p=>String(p)).filter(Boolean))],c=await Promise.allSettled(a.map(p=>po(p,{...o,baseUrl:o.dexscreenerBaseUrl,timeoutMs:o.dexscreenerTimeoutMs??Math.min(Number(o.timeoutMs??4e3),4e3)}))),u=new Set,l=[];for(let p of c)if(p.status==="fulfilled")for(let f of p.value?.pairs||p.value?.data?.pairs||[]){let m=`${Be(f?.chainId)}:${Be(f?.dexId)}:${Be(f?.pairAddress)}`;u.has(m)||(u.add(m),l.push(f))}return l.filter(p=>Be(p?.chainId)===i).filter(p=>cx(p,t,r)).filter(p=>!s.size||s.has(Be(p?.dexId))).map(p=>({pairAddress:p.pairAddress??null,dexId:p.dexId??null,chainId:p.chainId??null,liquidityUsd:ux(p),pairCreatedAt:p.pairCreatedAt??null})).filter(p=>p.liquidityUsd!=null).sort((p,f)=>f.liquidityUsd-p.liquidityUsd)}async function wd(e,{chainSlug:t="solana",stables:r=dx}={},n={}){let o=await po(e,n),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=lo(e,s,{stables:r});return{chain:t,token:e,pools:a,topPool:a[0]||null}}var ix,sx,Be,ax,dx,Gr=A(()=>{j();Bs();ix="https://api.dexscreener.com",sx=Object.freeze({1:"ethereum",10:"optimism",56:"bsc",137:"polygon",8453:"base",42161:"arbitrum",43114:"avalanche",999:"hyperevm",4663:"robinhood"}),Be=e=>String(e??"").toLowerCase(),ax=e=>Array.isArray(e)?e:e==null?[]:[e];dx=["EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v","Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB"]});var Od={};B(Od,{PANCAKE_FEE_TIERS:()=>fo,UNI_V3_CHAINS:()=>ke,UNI_V3_FEE_TIERS:()=>Ed,UNI_V3_VENUES:()=>Id,uniV3Chains:()=>gx,uniV3EthUsdc:()=>_d,uniV3Health:()=>bx,uniV3PrepareExactIn:()=>yx,uniV3QuoteExactIn:()=>qt,uniV3QuoteExactInPath:()=>hx});import{Interface as kd,getAddress as Kr,isAddress as Sd}from"ethers";function Ds(e,t){let r=Number(e),n=ke[r];if(!n)throw new Error(`uniswap-v3: unsupported chainId ${e} (supported: ${Object.keys(ke).join(", ")})`);let o=Id[r]||{};if(!t){if(!n.quoter||!n.router){let c=Object.keys(o).join(", ")||"none registered";throw new Error(`uniswap-v3: chain ${r} (${n.name}) has no canonical Uniswap v3 deployment -- name a venue explicitly (known: ${c})`)}return{chainId:r,venue:n.name,...n}}let i=String(t).toLowerCase();if(i===n.name&&n.quoter&&n.router)return{chainId:r,venue:n.name,...n};let s=o,a=s[i];if(!a){let c=[...n.quoter&&n.router?[n.name]:[],...Object.keys(s)].join(", ");throw new Error(`uniswap-v3: unknown venue "${t}" on chain ${r} (known: ${c})`)}return{chainId:r,venue:i,...n,quoter:a.quoter,router:a.router,feeTiers:a.feeTiers||null}}function Fs(e,t){let r=ke[Number(t)];if(!e||e===Ad||e===vd||/^eth$/i.test(String(e)))return Kr(r.weth);let n=String(e);if(/^weth$/i.test(n))return Kr(r.weth);if(/^usdc$/i.test(n))return Kr(r.usdc);if(!Sd(n))throw new Error(`invalid token address: ${e}`);return Kr(n)}function fx(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 mx(e,t){if(e.length!==t.length+1)throw new Error("path: fees.length must be tokens.length - 1");let r="0x";for(let n=0;n<t.length;n++)r+=e[n].slice(2).toLowerCase(),r+=Number(t[n]).toString(16).padStart(6,"0");return r+=e[e.length-1].slice(2).toLowerCase(),r}async function qt(e={},t={}){let{chainId:r,quoter:n,router:o,feeTiers:i}=Ds(e.chainId??8453,e.venue),s=Fs(e.tokenIn||"WETH",r),a=Fs(e.tokenOut||ke[r].usdc,r),c=BigInt(e.amountIn??0);if(c<=0n)throw new Error("amountIn required (raw base units)");let u=i&&i.length?i:Ed,l=e.fee!=null?[Number(e.fee)]:e.tryFees===!1?[u[Math.min(2,u.length-1)]]:[...u],p=await Promise.all(l.map(async g=>{let b=mo.encodeFunctionData("quoteExactInputSingle",[{tokenIn:s,tokenOut:a,amountIn:c,fee:g,sqrtPriceLimitX96:0n}]);try{let S=await Y(r,"eth_call",[{to:n,data:b},"latest"],t);if(!S||S==="0x")return{fee:g,ok:!1,error:"empty result"};let k=mo.decodeFunctionResult("quoteExactInputSingle",S);return{fee:g,ok:!0,amountOut:k[0].toString(),sqrtPriceX96After:k[1].toString(),initializedTicksCrossed:Number(k[2]),gasEstimate:k[3].toString()}}catch(S){return{fee:g,ok:!1,error:String(S.message||S).slice(0,160)}}})),f=null;for(let g of p)g.ok&&(!f||BigInt(g.amountOut)>BigInt(f.amountOut))&&(f=g);if(!f){let g=p.map(b=>`${b.fee}:${b.error||"fail"}`).join("; ");throw new Error(`uniswap-v3 quote failed chain=${r}: ${g}`)}let m=e.liquidityUsd==null?await Wr({chainId:r,tokenA:s,tokenB:a,dexIds:fx(e.venue)},t).catch(()=>[]):[],h={};await Promise.all(m.slice(0,8).map(async g=>{if(!(!g.pairAddress||!Sd(g.pairAddress)))try{let b=await Y(r,"eth_call",[{to:g.pairAddress,data:px},"latest"],t),S=b&&b!=="0x"&&b.length<=66?Number.parseInt(b,16):NaN;if(!Number.isFinite(S)||S<=0||S>1e6)return;let k=h[S];(k==null||g.liquidityUsd>k.liquidityUsd)&&(h[S]=g)}catch{}}));let y=e.liquidityBandBps==null?50:Number(e.liquidityBandBps),x=null;if(e.fee==null&&y>0&&BigInt(f.amountOut)>0n){let g=BigInt(f.amountOut),S=p.filter(k=>k.ok&&Number((g-BigInt(k.amountOut))*10000n/g)<=y).filter(k=>h[k.fee]?.liquidityUsd!=null).sort((k,N)=>h[N.fee].liquidityUsd-h[k.fee].liquidityUsd)[0];S&&S.fee!==f.fee&&(x={priceBestFee:f.fee,chosenFee:S.fee,chosenPoolUsd:h[S.fee].liquidityUsd,bandBps:y},f=S)}let E=h[f.fee]??null,_=m[0]??null,w=E??_,O=e.liquidityUsd??E?.liquidityUsd??_?.liquidityUsd??null,v=e.liquidityUsd!=null?"caller":E?"pool":_?"pair":null;return ae({venue:"uniswap-v3",chainId:r,chain:ke[r].name,quoter:n,tokenIn:s,tokenOut:a,amountIn:c.toString(),fee:f.fee,amountOut:f.amountOut,gasEstimate:f.gasEstimate,liquidityUsd:O,liquiditySource:w,liquidityAttribution:v,liquidityPick:x,sqrtPriceX96After:f.sqrtPriceX96After,initializedTicksCrossed:f.initializedTicksCrossed,triedFees:p,best:!0},{chainId:r,venue:o,amountOut:f.amountOut,liquidityUsd:O,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps})}async function hx(e={},t={}){let{chainId:r,quoter:n,router:o}=Ds(e.chainId??8453),i=(e.tokens||[]).map(p=>Fs(p,r)),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=mx(i,s),u=mo.encodeFunctionData("quoteExactInput",[c,a]),l=await Y(r,"eth_call",[{to:n,data:u},"latest"],t),d=mo.decodeFunctionResult("quoteExactInput",l);return ae({venue:"uniswap-v3",chainId:r,chain:ke[r].name,quoter:n,tokens:i,fees:s,path:c,amountIn:a.toString(),amountOut:d[0].toString(),gasEstimate:d[3].toString()},{chainId:r,venue:o,amountOut:d[0].toString(),liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps})}async function _d(e={},t={}){let r=Number(e.chainId??8453),n=e.amountIn??"1000000000000000",o=await qt({chainId:r,tokenIn:ke[r].weth,tokenOut:ke[r].usdc,amountIn:n,fee:e.fee},t),i=Number(o.amountOut)/1e6;return{...o,amountOutUsdc:i,pair:"WETH/USDC"}}async function yx(e={},t={}){let r=Number(e.chainId??8453),n=Ds(r,e.venue),o=Kr(e.recipient),i=String(e.tokenIn||"WETH"),s=!e.tokenIn||i===Ad||i===vd||/^eth$/i.test(i),a=await qt(e,t),c=xd.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,p=xd.encodeFunctionData("multicall",[d,[c]]);return Q({provider:"uniswap-v3",calldataReady:!0,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:r,deadline:d,quote:a,autoSlippage:a.autoSlippage,requiresApproval:s?null:{token:a.tokenIn,spender:n.router,amount:a.amountIn},transaction:{chainId:r,from:o,to:n.router,data:p,value:s?a.amountIn:"0",slippageGuard:Oe(a.autoSlippage,{chainId:r,venue:n.router,data:p})}},{provider:"uniswap-v3",kind:"univ3-swap-tx"})}async function bx(e={}){let t=Number(e.chainId??8453);try{let r=await _d({chainId:t,amountIn:"1000000000000000"},e);return{ok:!0,chainId:t,fee:r.fee,amountOutUsdc:r.amountOutUsdc,midPxHint:r.amountOutUsdc/.001}}catch(r){return{ok:!1,chainId:t,error:String(r.message||r).slice(0,200)}}}async function gx(){return Object.entries(ke).map(([e,t])=>({chainId:Number(e),name:t.name,quoter:t.quoter,weth:t.weth,usdc:t.usdc}))}var ke,Ed,px,mo,xd,Ad,vd,fo,Id,ho=A(()=>{ut();Gr();Ue();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"}},Ed=[100,500,3e3,1e4],px="0xddca3f43",mo=new kd(["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)"]),xd=new kd(["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)"]),Ad="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",vd="0x0000000000000000000000000000000000000000",fo=[100,500,2500,1e4],Id={56:{pancakeswap:{name:"pancakeswap",quoter:"0xB048Bbc1Ee6b733FFfCFb9e9CeF7375518e25997",router:"0x13f4EA83D0bd40E75C8222255bc855a974568Dd4",feeTiers:fo}},8453:{pancakeswap:{name:"pancakeswap",quoter:"0xB048Bbc1Ee6b733FFfCFb9e9CeF7375518e25997",router:"0x13f4EA83D0bd40E75C8222255bc855a974568Dd4",feeTiers:fo}},42161:{pancakeswap:{name:"pancakeswap",quoter:"0xB048Bbc1Ee6b733FFfCFb9e9CeF7375518e25997",router:"0x13f4EA83D0bd40E75C8222255bc855a974568Dd4",feeTiers:fo}},999:{hyperswap:{name:"hyperswap",quoter:"0x03A918028f22D9E1473B7959C927AD7425A45C7C",router:"0x4E2960a8cd19B467b82d26D83fAcb0fAE26b094D"}}}});var Pd={};B(Pd,{executeRfqCandidates:()=>Rd,rankRfqQuotes:()=>Nd,requestRfqQuotes:()=>kx,sourceCandidates:()=>Td});function Xr(e,t){return Array.isArray(e?.allowedSources)&&e.allowedSources.includes(t)}function Cd(e,t){return String(e?.[t]??"").trim()}function Yr(e,t){return Object.freeze({source:e,run:t})}function Td(e,t={}){if(!e||e.kind!=="rfq-intent")throw new Error("rfq: intent required");let r=t.env??process.env,n=t.providers??{},o=t.supportedUniV3Chains??ke,i=Number(e.fromChainId)===Number(e.toChainId),s=[];return Xr(e,"lifi")&&s.push(Yr("lifi",async()=>{let c=await(n.lifiQuote??Pt)({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 wx(t,c.transactionRequest.data):void 0,route:c},metadata:{tool:c?.tool??c?.toolDetails?.name??null}}})),i&&(Xr(e,"paraswap")&&s.push(Yr("paraswap",async()=>{let c=await(n.paraswapPrice??rr)({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}}})),Xr(e,"0x")&&(Cd(r,"ZEROX_API_KEY")||Cd(r,"0X_API_KEY")||n.zeroxQuote)&&s.push(Yr("0x",async()=>{let c=await(n.zeroxQuote??nr)({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}}})),Xr(e,"cow")&&s.push(Yr("cow",async()=>{let c=await(n.cowQuote??$t)({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}}})),Xr(e,"uniswap-v3")&&o[Number(e.fromChainId)]&&s.push(Yr("uniswap-v3",async()=>{let c=await(n.uniV3QuoteExactIn??qt)({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 wx(e,t){return`0x${(await import("node:crypto")).createHash("sha256").update(String(t)).digest("hex")}`}async function xx(e,t){return Promise.race([Promise.resolve().then(e.run),new Promise((r,n)=>setTimeout(()=>n(new Error(`${e.source}: timeout`)),t))])}async function Rd(e,t,r={}){let n=Number(r.timeoutMs??12e3),o=await Promise.allSettled(t.map(a=>xx(a,n))),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(gs(e,{...u.value,source:c.source},r))}catch(l){s.push({source:c.source,error:String(l?.message||l)})}}return{quotes:i,failed:s}}function Nd(e=[],t={}){let r=Number(t.nowMs??Date.now()),n=e.filter(s=>Number(s.expiryMs??0)>r);n.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=n.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 kx(e,t={}){let r=Td(e,t),{quotes:n,failed:o}=await Rd(e,r,t),i=Nd(n,t);return{kind:"rfq-result",intent:e,best:i.best,quotes:i.quotes,failed:o,warnings:[...i.warnings],sourcesTried:r.length,sourcesAnswered:n.length}}var $d=A(()=>{jr();Yn();eo();so();ho();ws()});function qd(e={}){let t=[],r=[];if(!e||typeof e!="object")return{ok:!1,errors:["definition must be an object"],warnings:r};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}Sx.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||r.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 n=e.capabilities||{};for(let o of Object.keys(n))ar.includes(o)?typeof n[o]!="function"&&t.push(`capability "${o}" must be a function`):t.push(`unknown capability "${o}"`);return Object.keys(n).length===0&&r.push("scanner implements no capabilities -- it can only be registered, not used"),n.prepareUnsignedTx&&!n.quote&&r.push("prepareUnsignedTx without quote: no priced expectation to validate the built tx against"),n.prepareUnsignedTx&&!n.sellSimulation&&r.push("prepareUnsignedTx without sellSimulation: cannot prove an asset is exitable before buying"),{ok:t.length===0,errors:t,warnings:r}}function Ld(e){let{ok:t,errors:r,warnings:n}=qd(e);if(!t)throw new Error(`invalid scanner for ${e?.key??"<unknown>"}:
7
7
  - ${r.join(`
8
- - `)}`);let o=e.capabilities||{},i=or.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:n,capabilities(){return{chainId:e.chainId,key:e.key,supported:[...i],unsupported:or.filter(a=>!i.includes(a))}},supports(a){return i.includes(a)}};for(let a of or)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 fo(e){let t=Id(e);return ir.set(t.chainId,t),t}function Us(e){return ir.get(Number(e))||null}function _d(){return[...ir.values()]}function ix(){ir.clear()}function sx(){let e={};for(let t of ir.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:ir.size,capabilities:[...or],chains:e}}var or,U,q,ox,ir,gt=A(()=>{or=Object.freeze(["blockNumber","nativeBalance","tokenBalance","resolveToken","resolvePools","scanBlocks","scoreRisk","quote","sellSimulation","prepareUnsignedTx"]),U=Object.freeze({LIVE:"LIVE",CACHED:"CACHED",STALE:"STALE",UNKNOWN:"UNKNOWN",UNAVAILABLE:"UNAVAILABLE"}),q=Object.freeze({PASS:"PASS",CAUTION:"CAUTION",FAIL:"FAIL",UNKNOWN:"UNKNOWN"}),ox=/^0x[0-9a-fA-F]{40}$/;ir=new Map});function Od(e){let{source:t,amountOut:r,minOut:n=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||r==null)return{source:t,quality:Fe.FAILED,amountOut:null,error:u||"no amountOut returned"};let p=Kr(r);if(p==null||p<=0n)return{source:t,quality:Fe.FAILED,amountOut:null,error:"non-positive amountOut"};let f=Number(s);return{source:t,quality:o==null?Fe.NO_GAS:Fe.FULL,amountOut:p.toString(),minOut:Kr(n)?.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:l,meta:d}}async function Td(e,t,{divisor:r=1000n}={}){let n=Kr(t);if(n==null||n<=0n)return null;let o=n/r>0n?n/r:1n;if(o>=n)return null;let i,s;try{[i,s]=await Promise.all([e(o),e(n)])}catch{return null}let a=Kr(i),c=Kr(s);if(a==null||c==null||a<=0n)return null;let u=Number(a)/Number(o),l=Number(c)/Number(n);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 Rd(e,t,{maxImpactPct:r=25}={}){let n=[],o=[],i=(e.routes??[]).filter(a=>{let c=t?.[a.source];return c?c.impactPct>r?(n.push({source:a.source,impactPct:Number(c.impactPct.toFixed(2)),reason:`price impact ${c.impactPct.toFixed(1)}% exceeds ${r}% ceiling -- the venue cannot absorb this size near the quoted price`}),!1):!0:(o.push(a.source),!0)}),s=[...e.warnings??[]];return n.length&&s.push(`dropped ${n.length} route(s) on price impact: `+n.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:n,impactUnmeasured:o,warnings:s}}function Bs(e,{destPriceUsd:t=null,destDecimals:r=null,liquidityFirst:n=!0,liquidityBandBps:o=50,gasPriceWei:i=null,nativePriceUsd:s=null}={}){let a=e.filter(b=>b.quality!==Fe.FAILED),c=e.filter(b=>b.quality===Fe.FAILED),u=t!=null&&t>0&&r!=null&&r>=0,l=Number(i),d=Number(s),p=Number.isFinite(l)&&l>0&&Number.isFinite(d)&&d>0,f=a.map(b=>{let S=BigInt(b.amountOut),k=0n,N=!1,I=!1,P=BigInt(b.oracleFeeBps??0),L=P>0n?S*P/10000n:0n;if(u){let F=b.gasUsd,z=Number(b.meta?.gasUnits??b.estimatedGas);if(F==null&&p&&Number.isFinite(z)&&z>0){let K=z*l/1e18*d;Number.isFinite(K)&&K>=0&&(F=K,I=!0)}let ie=(F??0)+(b.feeUsd??0);if(ie>0){let K=ie/t*10**r;Number.isFinite(K)&&K>=0&&(k=BigInt(Math.floor(K)),N=!0)}else F===0&&(N=!0)}let H=k+L,X=S>H?S-H:0n;return{...b,grossOut:S.toString(),netOut:X.toString(),costInDest:k.toString(),oracleFeeInDest:L.toString(),costAccounted:N,gasEstimated:I}}),m=Number(o)>0?Number(o):0,h=f.reduce((b,S)=>BigInt(S.netOut)>b?BigInt(S.netOut):b,0n),y=b=>h>0n?Number((h-BigInt(b))*10000n/h):0,x=[],E=f.slice().sort((b,S)=>BigInt(S.netOut)>BigInt(b.netOut)?1:-1)[0]??null;f.sort((b,S)=>{let k=y(b.netOut)<=m?0:1,N=y(S.netOut)<=m?0:1;if(n&&m>0&&k!==N)return k-N;if(n&&m>0){let I=b.liquidityUsd??-1,P=S.liquidityUsd??-1;if(I!==P)return P-I}return BigInt(S.netOut)>BigInt(b.netOut)?1:-1}),n&&m>0&&E&&f[0]&&f[0].source!==E.source&&x.push(`liquidity-first: chose ${f[0].source} (liquidity $${f[0].liquidityUsd??"unknown"}) over best-price ${E.source} within ${m} bps`);let _=f.filter(b=>!b.costAccounted).map(b=>b.source);u?_.length&&x.push(`gas not reported by: ${_.join(", ")}. These are ranked on gross output and may be overstated relative to gas-measured routes.`):x.push("destination price/decimals unavailable: ranked on GROSS output. Gas is not included, so a cheap-looking route may cost more to execute.");let w=f[0];if(u&&w&&w.costAccounted===!1){let b=f.find(S=>S.costAccounted&&y(S.netOut)<=m);b&&x.push(`winner ${w.source} has UNMEASURED gas; gas-measured ${b.source} is within ${m} bps and may net more once ${w.source}'s real gas is paid \u2014 prefer it if unsure.`)}let O=f.filter(b=>b.gasEstimated).map(b=>b.source);O.length&&x.push(`gas ESTIMATED (from gas units x current gas price, not measured) for: ${O.join(", ")}. Net includes this estimate so the ranking is gas-inclusive, but the on-chain gas may differ.`);let v=null,g=null;if(f.length>=2&&f[0].costAccounted&&f[1].costAccounted){let b=BigInt(f[0].netOut),S=BigInt(f[1].netOut);S>0n&&(v=Number((b-S)*10000n/S),g=`${f[0].source} vs ${f[1].source}`)}return{best:f[0]??null,routes:f,failed:c,improvementBps:v,spreadBasis:g,rankedOn:u?"net-of-cost":"gross",warnings:x}}async function mo(e,{timeoutMs:t=12e3}={}){let r=(o,i)=>Promise.race([o,new Promise((s,a)=>setTimeout(()=>a(new Error(`${i}: timeout`)),t))]);return(await Promise.allSettled(e.map(o=>r(Promise.resolve().then(o.run),o.source)))).map((o,i)=>{let s=e[i].source;return o.status==="rejected"?Od({source:s,error:String(o.reason?.message||o.reason)}):Od({source:s,...o.value})})}var Fe,Cd,Kr,Fs=A(()=>{gt();Fe=Object.freeze({FULL:"FULL",NO_GAS:"NO_GAS",FAILED:"FAILED"}),Cd={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"},Kr=e=>{try{return e==null||e===""?null:BigInt(String(e).split(".")[0])}catch{return null}}});function Nd(e={}){return Kn({provider:"oneinch",defaultUrl:ax,hosts:["api.1inch.dev"],url:e.baseUrl||process.env.ONEINCH_API_URL})}function cx(e={}){return Nd(e).baseUrl}function Pd(e={}){return e.apiKey||process.env.ONEINCH_API_KEY||process.env.ONE_INCH_API_KEY||""}function ux(e={}){let t=Pd(e);return Xn({accept:"application/json"},{Authorization:t?`Bearer ${t}`:""},Nd(e).trusted)}async function $d(e={},t={}){if(!Pd(t))throw new Error("ONEINCH_API_KEY required for 1inch");let r=Number(e.chainId??1),{src:n,dst:o,amount:i}=e;if(!n||!o||!i)throw new Error("oneinchQuote requires src, dst, amount");let s=new URLSearchParams({src:n,dst:o,amount:String(i)}),a=await C(`${cx(t)}/${r}/quote?${s}`,{headers:ux(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3});return a?.dstAmount?ae(a,{chainId:r,venue:"1inch-quote",amountOut:a.dstAmount,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps}):a}var ax,qd=A(()=>{j();Ue();vs();xe();ax="https://api.1inch.dev/swap/v6.0"});var Bd={};B(Bd,{UNI_V4_CHAINS:()=>De,UNI_V4_FEE_TIERS:()=>js,computeV4PoolId:()=>bo,decodeV4HookPermissions:()=>zs,uniV4Chains:()=>Sx,uniV4Health:()=>Ex,uniV4InspectHook:()=>wx,uniV4PrepareExactIn:()=>kx,uniV4QuoteExactIn:()=>go,uniV4QuoteExactOut:()=>xx});import{AbiCoder as lx,Interface as Ds,getAddress as Ze,isAddress as Ms,keccak256 as dx}from"ethers";function zs(e){let t=Qr(e),r=Number(BigInt(t)&fx),n=Object.fromEntries(Ld.map(([s,a])=>[a,!!(r&1<<s)])),i=[["beforeSwapReturnsDelta","beforeSwap"],["afterSwapReturnsDelta","afterSwap"],["afterAddLiquidityReturnsDelta","afterAddLiquidity"],["afterRemoveLiquidityReturnsDelta","afterRemoveLiquidity"]].filter(([s,a])=>n[s]&&!n[a]).map(([s,a])=>`${s} requires ${a}`);return Object.freeze({address:t,mask:r,maskHex:`0x${r.toString(16).padStart(4,"0")}`,flags:Object.freeze(n),enabled:Object.freeze(Ld.filter(([,s])=>n[s]).map(([,s])=>s)),valid:i.length===0,violations:Object.freeze(i)})}function Jr(e){let t=Number(e),r=De[t];if(!r)throw new Error(`uniswap-v4: unsupported chainId ${e} (supported: ${Object.keys(De).join(", ")})`);return{chainId:t,...r}}function Qr(e){if(e==null||e==="")return we;let t=String(e);if(!Ms(t))throw new Error(`invalid Uniswap V4 hook address: ${e}`);return Ze(t)}function sr(e,t){let r=De[Number(t)];if(Yr(e))return Ze(r.weth);let n=String(e);if(/^weth$/i.test(n))return Ze(r.weth);if(/^usdc$/i.test(n)||/^usdg$/i.test(n))return Ze(r.usdc);if(!Ms(n))throw new Error(`invalid token address: ${e}`);return Ze(n)}function Yr(e){let t=String(e||"").trim().toLowerCase();return!t||t===bx.toLowerCase()||t===we.toLowerCase()||t==="eth"}function bo({currency0:e,currency1:t,fee:r,tickSpacing:n,hooks:o=we}){let i=Ze(e),s=Ze(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=Qr(o);return dx(Xr.encode(["address","address","uint24","int24","address"],[a,c,Number(r),Number(n),u]))}function Vs({tokenIn:e,tokenOut:t,fee:r,tickSpacing:n,hooks:o=we}){let i=Ze(e),s=Ze(t),[a,c]=i.toLowerCase()<s.toLowerCase()?[i,s]:[s,i],u=i.toLowerCase()===a.toLowerCase();return{poolKey:{currency0:a,currency1:c,fee:Number(r),tickSpacing:Number(n),hooks:Qr(o)},zeroForOne:u}}function gx({hook:e,codePresent:t,initialized:r,dynamicFee:n}){let o=zs(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!==we&&(c="low",a.push("nonzero hook requires independent contract review")),n&&(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)),n&&e===we&&(c="critical",a.push("dynamic-fee pool has no hook authority")),e!==we&&o.enabled.length===0&&(c="critical",a.push("nonzero hook declares no permissions")),r||(c="critical",a.push("pool is not initialized")),e!==we&&!t&&(c="critical",a.push("hook address has no deployed bytecode")),Object.freeze({tier:c,audited:!1,requiresReview:e!==we,returnsDelta:i,reasons:Object.freeze(a)})}async function wx(e={},t={}){let r=Jr(e.chainId??8453);if(!r.stateView)throw new Error(`uniswap-v4: no StateView on chain ${r.chainId}`);let n=sr(e.tokenIn||"WETH",r.chainId),o=sr(e.tokenOut||r.usdc,r.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=Qr(e.hooks),{poolKey:c}=Vs({tokenIn:n,tokenOut:o,fee:i,tickSpacing:s,hooks:a}),u=bo(c),l=t.rpcCall||Y,d=ho.encodeFunctionData("getSlot0",[u]),p=ho.encodeFunctionData("getLiquidity",[u]),[f,m,h]=await Promise.all([l(r.chainId,"eth_call",[{to:r.stateView,data:d},"latest"],t),l(r.chainId,"eth_call",[{to:r.stateView,data:p},"latest"],t),a===we?Promise.resolve(null):l(r.chainId,"eth_getCode",[a,"latest"],t)]),y=ho.decodeFunctionResult("getSlot0",f),x=ho.decodeFunctionResult("getLiquidity",m)[0],E=y[0],_=E>0n,w=a===we?null:typeof h=="string"&&h!=="0x"&&h.length>4,O=!!(i&Hs),v=gx({hook:a,codePresent:w,initialized:_,dynamicFee:O});return Object.freeze({venue:"uniswap-v4",chainId:r.chainId,stateView:r.stateView,poolId:u,poolKey:Object.freeze(c),pool:Object.freeze({initialized:_,sqrtPriceX96:E.toString(),tick:Number(y[1]),protocolFee:Number(y[2]),lpFee:Number(y[3]),liquidity:x.toString(),dynamicFee:O}),hook:Object.freeze({address:a,codePresent:w,codeBytes:w?(h.length-2)/2:0,permissions:zs(a)}),risk:v})}async function go(e={},t={}){let{chainId:r,quoter:n,poolManager:o,universalRouter:i}=Jr(e.chainId??8453),s=sr(e.tokenIn||"WETH",r),a=sr(e.tokenOut||De[r].usdc,r),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.fee!=null&&e.tickSpacing!=null?[{fee:Number(e.fee),tickSpacing:Number(e.tickSpacing)}]:e.tryTiers===!1?[{fee:500,tickSpacing:10}]:[...js],l=e.hooks||we,p=await Promise.all(u.map(async b=>{let{poolKey:S,zeroForOne:k}=Vs({tokenIn:s,tokenOut:a,fee:b.fee,tickSpacing:b.tickSpacing,hooks:l}),N=yo.encodeFunctionData("quoteExactInputSingle",[{poolKey:S,zeroForOne:k,exactAmount:c,hookData:"0x"}]);try{let I=await(t.rpcCall||Y)(r,"eth_call",[{to:n,data:N},"latest"],t);if(!I||I==="0x")return{...b,ok:!1,error:"empty result"};let P=yo.decodeFunctionResult("quoteExactInputSingle",I);return{fee:b.fee,tickSpacing:b.tickSpacing,ok:!0,amountOut:P[0].toString(),gasEstimate:P[1].toString(),poolKey:S,zeroForOne:k,poolId:bo({...S})}}catch(I){return{...b,ok:!1,error:String(I.message||I).slice(0,160)}}})),f=null;for(let b of p)b.ok&&(!f||BigInt(b.amountOut)>BigInt(f.amountOut))&&(f=b);if(!f){let b=p.map(S=>`${S.fee}/${S.tickSpacing}:${S.error||"fail"}`).join("; ");throw new Error(`uniswap-v4 quote failed chain=${r}: ${b}`)}let m=e.liquidityUsd==null?await Hr({chainId:r,tokenA:s,tokenB:a,dexIds:Ud},t).catch(()=>[]):[],h=new Map;for(let b of m){let S=String(b.pairAddress||"").toLowerCase();S&&h.set(S,b)}let y=b=>h.get(String(b.poolId||"").toLowerCase())??null,x=e.liquidityBandBps==null?50:Number(e.liquidityBandBps),E=null;if(!(e.fee!=null&&e.tickSpacing!=null)&&x>0&&BigInt(f.amountOut)>0n){let b=BigInt(f.amountOut),k=p.filter(N=>N.ok&&Number((b-BigInt(N.amountOut))*10000n/b)<=x).filter(N=>y(N)?.liquidityUsd!=null).sort((N,I)=>y(I).liquidityUsd-y(N).liquidityUsd)[0];k&&k.poolId!==f.poolId&&(E={priceBestFee:f.fee,chosenFee:k.fee,chosenPoolUsd:y(k).liquidityUsd,bandBps:x},f=k)}let _=y(f),w=m[0]??null,O=_??w,v=e.liquidityUsd??_?.liquidityUsd??w?.liquidityUsd??null,g=e.liquidityUsd!=null?"caller":_?"pool":w?"pair":null;return ae({venue:"uniswap-v4",chainId:r,chain:De[r].name,poolManager:o,quoter:n,universalRouter:i||null,tokenIn:s,tokenOut:a,amountIn:c.toString(),fee:f.fee,tickSpacing:f.tickSpacing,hooks:f.poolKey.hooks,poolId:f.poolId,zeroForOne:f.zeroForOne,amountOut:f.amountOut,gasEstimate:f.gasEstimate,liquidityUsd:v,liquiditySource:O,liquidityAttribution:g,liquidityPick:E,triedTiers:p,best:!0,executionReady:!1,prepareReady:typeof e.recipient=="string"&&Ms(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&&!Yr(e.tokenIn)&&!Yr(e.tokenOut)&&(e.hookData==null||String(e.hookData).toLowerCase()==="0x")&&f.poolKey.hooks===we&&!(f.fee&Hs)},{chainId:r,venue:i||n,amountOut:f.amountOut,liquidityUsd:v,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps})}async function xx(e={},t={}){let{chainId:r,quoter:n,poolManager:o,universalRouter:i}=Jr(e.chainId??8453),s=sr(e.tokenIn||"WETH",r),a=sr(e.tokenOut||De[r].usdc,r),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}]:[...js],l=e.hooks||we,p=await Promise.all(u.map(async h=>{let{poolKey:y,zeroForOne:x}=Vs({tokenIn:s,tokenOut:a,fee:h.fee,tickSpacing:h.tickSpacing,hooks:l}),E=yo.encodeFunctionData("quoteExactOutputSingle",[{poolKey:y,zeroForOne:x,exactAmount:c,hookData:"0x"}]);try{let _=await(t.rpcCall||Y)(r,"eth_call",[{to:n,data:E},"latest"],t);if(!_||_==="0x")return{...h,ok:!1,error:"empty result"};let w=yo.decodeFunctionResult("quoteExactOutputSingle",_);return{fee:h.fee,tickSpacing:h.tickSpacing,ok:!0,amountIn:w[0].toString(),gasEstimate:w[1].toString(),poolKey:y,zeroForOne:x,poolId:bo({...y})}}catch(_){return{...h,ok:!1,error:String(_.message||_).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=${r}: ${h}`)}let m=e.liquidityUsd==null?await cd({chainId:r,tokenA:s,tokenB:a,dexIds:Ud},t).catch(()=>null):null;return{venue:"uniswap-v4",chainId:r,chain:De[r].name,poolManager:o,quoter:n,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 kx(e={},t={}){if(["operation","exactOutput","amountOut","multihop","path","positionManager","modifyLiquidities","commands","actions"].some(w=>Object.hasOwn(e,w)))throw new Error("uniswap-v4 unsupported operation shape is inspect/quote-only");let n=Number(e.chainId??8453),o=Jr(n);if(Qr(e.hooks)!==we)throw new Error("uniswap-v4 nonzero hooks are inspect/quote-only until a code-hash-specific adapter exists");if(Number(e.fee)&Hs)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 s=Ze(e.recipient);if(e.slippageBps==null)throw new Error("uniswap-v4 prepare requires explicit slippageBps");let a=Number(e.slippageBps);if(!Number.isInteger(a)||a<0||a>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 c=Number(e.deadlineSeconds);if(!Number.isInteger(c)||c<30||c>600)throw new Error("deadlineSeconds must be an integer from 30 through 600");if(Yr(e.tokenIn)||Yr(e.tokenOut))throw new Error("uniswap-v4 prepare currently requires ERC-20 tokenIn and tokenOut; native routes are not inferred");let u=await go(e,t);if(!o.universalRouter)throw new Error(`uniswap-v4: no Universal Router on chain ${n}`);let l=BigInt(u.amountOut)*BigInt(1e4-a)/10000n,d={currency0:u.zeroForOne?u.tokenIn:u.tokenOut,currency1:u.zeroForOne?u.tokenOut:u.tokenIn,fee:u.fee,tickSpacing:u.tickSpacing,hooks:u.hooks},f=Xr.encode(["tuple(tuple(address currency0,address currency1,uint24 fee,int24 tickSpacing,address hooks) poolKey,bool zeroForOne,uint128 amountIn,uint128 amountOutMinimum,uint256 minHopPriceX36,bytes hookData)"],[[d,u.zeroForOne,BigInt(u.amountIn),l,0n,"0x"]]),m=Xr.encode(["address","uint256"],[u.tokenIn,BigInt(u.amountIn)]),h=Xr.encode(["address","uint256"],[u.tokenOut,l]),y=Xr.encode(["bytes","bytes[]"],[hx,[f,m,h]]),E=Number(t.nowSeconds??Math.floor(Date.now()/1e3))+c,_=px.encodeFunctionData("execute",[mx,[y],E]);return Q({provider:"uniswap-v4",prepareReady:!0,calldataReady:!0,executionReady:!1,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:n,deadline:E,quote:{...u,amountOutMinimum:l.toString(),slippageBps:a},hookInspection:null,requiresApproval:{token:u.tokenIn,spender:yx,amount:u.amountIn,note:"Universal Router V4 settlement uses Permit2; Permit2 authorization for the Universal Router is also required"},transaction:{chainId:n,from:s,to:o.universalRouter,data:_,value:"0"}},{provider:"uniswap-v4",kind:"univ4-swap-tx"})}async function Sx(){return Object.entries(De).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 Ex(e={}){let t=Jr(e.chainId??8453),r=await Y(t.chainId,"eth_getCode",[t.quoter,"latest"],e),n=typeof r=="string"&&r!=="0x"&&r.length>4;return{ok:n,chainId:t.chainId,quoter:t.quoter,poolManager:t.poolManager,codeBytes:n?(r.length-2)/2:0}}var Xr,we,De,js,yo,px,ho,Ld,fx,Hs,mx,hx,yx,bx,Ud,Ws=A(()=>{ut();zr();Ue();xe();Xr=lx.defaultAbiCoder(),we="0x0000000000000000000000000000000000000000",De={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"}},js=[{fee:100,tickSpacing:1},{fee:500,tickSpacing:10},{fee:3e3,tickSpacing:60},{fee:1e4,tickSpacing:200},{fee:25e3,tickSpacing:8}],yo=new Ds(["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)"]),px=new Ds(["function execute(bytes commands,bytes[] inputs,uint256 deadline) payable"]),ho=new Ds(["function getSlot0(bytes32 poolId) view returns (uint160 sqrtPriceX96,int24 tick,uint24 protocolFee,uint24 lpFee)","function getLiquidity(bytes32 poolId) view returns (uint128 liquidity)"]),Ld=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"]]),fx=(1n<<14n)-1n,Hs=8388608;mx="0x10",hx="0x060c0f",yx="0x000000000022D473030F116dDEE9F6B43aC78BA3",bx="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE";Ud=["uniswap-v4","uniswapv4"]});function Ix(e={}){return(e.baseUrl||process.env.DEFILLAMA_COINS_URL||Ax).replace(/\/$/,"")}function _x(e={}){return(e.baseUrl||process.env.DEFILLAMA_API_URL||vx).replace(/\/$/,"")}async function wo(e,t={}){if(!Array.isArray(e)||!e.length)throw new Error("llamaPrices requires coins[]");let r=e.map(encodeURIComponent).join(",");return C(`${Ix(t)}/prices/current/${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function Fd(e={}){return C(`${_x(e)}/protocols`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??2e4})}var Ax,vx,Gs=A(()=>{j();Ax="https://coins.llama.fi",vx="https://api.llama.fi"});var xo={};B(xo,{ACROSS_API:()=>Dd,HOP_API:()=>Md,RELAY_API:()=>jd,acrossHealth:()=>Cx,acrossSuggestedFees:()=>Hd,hopHealth:()=>Tx,hopQuote:()=>zd,relayHealth:()=>Rx,relayPrepare:()=>Nx,relayQuote:()=>Ks});async function Cx(e={}){try{return{ok:!0,estimatedFillTimeSec:(await Hd({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 Hd(e={},t={}){let{token:r,destinationToken:n=r,originChainId:o,destinationChainId:i,amount:s}=e;if(!r||o==null||i==null||!s)throw new Error("acrossSuggestedFees requires token, originChainId, destinationChainId, amount");let a=new URLSearchParams({token:r,destinationToken:n,originChainId:String(o),destinationChainId:String(i),amount:String(s)}),c=(t.baseUrl||process.env.ACROSS_API_URL||Dd).replace(/\/$/,"");return C(`${c}/suggested-fees?${a}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function Tx(e={}){try{let t=await zd({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 zd(e={},t={}){let{amount:r,token:n="ETH",fromChain:o="ethereum",toChain:i="arbitrum"}=e;if(!r)throw new Error("hopQuote requires amount");let s=e.slippage==null?void 0:Math.round(Number(e.slippage)*100),a=at({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(r),token:n,fromChain:o,toChain:i,slippage:String(a.selectedBps/100)}),u=(t.baseUrl||process.env.HOP_API_URL||Md).replace(/\/$/,""),l=await C(`${u}/quote?${c}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),d=l?.estimatedRecieved||l?.estimatedReceived;return d?ae(l,{chainId:Number(e.originChainId||e.chainId||Ox[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 Rx(e={}){try{let t=await Ks({user:bt,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 Ks(e={},t={}){let{user:r=bt,originChainId:n,destinationChainId:o,originCurrency:i="0x0000000000000000000000000000000000000000",destinationCurrency:s="0x0000000000000000000000000000000000000000",amount:a,tradeType:c="EXACT_INPUT"}=e;if(n==null||o==null||!a)throw new Error("relayQuote requires originChainId, destinationChainId, amount");let u=at({liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,crossChain:Number(n)!==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||jd).replace(/\/$/,""),d=await C(`${l}/quote`,{method:"POST",body:{user:r,originChainId:Number(n),destinationChainId:Number(o),originCurrency:i,destinationCurrency:s,amount:String(a),tradeType:c,slippageTolerance:String(u.selectedBps)},fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4}),p=d?.details?.currencyOut?.amount;return!p||!/^\d+$/.test(String(p))?{...d,autoSlippagePolicy:u}:ae(d,{chainId:Number(n),venue:d?.steps?.[0]?.items?.[0]?.data?.to||"relay",amountOut:p,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,crossChain:Number(n)!==Number(o),requestedCapBps:e.maxSlippageBps??e.slippageBps})}async function Nx(e={},t={}){let r=await Ks(e,t),n=Number(e.originChainId),o=(r.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(r?.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:n,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:Oe(r.autoSlippage,{chainId:n,venue:a.to,data:a.data})}));return Q({provider:"relay",calldataReady:!0,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:n,quote:r,autoSlippage:r.autoSlippage,transactions:s},{provider:"relay",kind:"relay-tx"})}var Dd,Md,jd,Ox,ko=A(()=>{j();Ue();zn();xe();Dd="https://across.to/api",Md="https://api.hop.exchange/v1",jd="https://api.relay.link",Ox={ethereum:1,optimism:10,bsc:56,polygon:137,arbitrum:42161,avalanche:43114,base:8453}});function So(e){if(!Array.isArray(e))return null;let t=0,r=!1;for(let n of e){let o=et(n?.amountUSD);o!=null&&(t+=o,r=!0)}return r?t:null}async function Wd(e,t={}){let r=Cd[Number(e)];if(!r)return null;try{let n=await wo([r],t);return et(n?.coins?.[r]?.price)}catch{return null}}async function Px(e={}){try{let t=await Fd({...e,baseUrl:e.defillamaApiBaseUrl,timeoutMs:e.defillamaTimeoutMs??Math.min(Number(e.timeoutMs??5e3),5e3)});return Array.isArray(t)?t:[]}catch{return[]}}function $x(e,t={}){let r=wt(t.tool||t.provider||t.bridge||t.protocol),n=[];return e==="lifi"&&r&&r!=="lifi"&&n.push(...Vd[r]||[r]),n.push(...Vd[wt(e)]||[e]),n}function qx(e,t,r={}){let n=Array.isArray(e)?e:[],o=$x(t,r).map(wt).filter(Boolean);for(let i of o){let s=n.find(c=>wt(c?.slug)===i||wt(c?.name)===i),a=et(s?.tvl);if(a!=null)return{liquidityUsd:a,protocol:s?.name??s?.slug??i}}for(let i of o){let s=n.find(c=>{let u=wt(c?.category);return!u.includes("bridge")&&!u.includes("crosschain")?!1:wt(c?.slug).includes(i)||wt(c?.name).includes(i)}),a=et(s?.tvl);if(a!=null)return{liquidityUsd:a,protocol:s?.name??s?.slug??i}}return null}function Xs({chainId:e,tokenIn:t,tokenOut:r,amountIn:n,taker:o,slippageBps:i,decimalsIn:s,decimalsOut:a,nativePriceUsd:c=null,destDecimalsPromise:u=null,opts:l={}}){let d=[];return d.push({source:"lifi",run:async()=>{let p=await Nt({fromChain:e,toChain:e,fromToken:t,toToken:r,fromAmount:n},l),f=p?.estimate??p?.[0]?.estimate;return{amountOut:f?.toAmount,minOut:f?.toAmountMin,gasUsd:So(f?.gasCosts),feeUsd:So(f?.feeCosts),oracleFeeBps:p?.oracleFee?.applies?p.oracleFee.bps:0,meta:{tool:p?.tool??p?.toolDetails?.name,oracleFee:p?.oracleFee??null}}}}),s!=null&&d.push({source:"paraswap",run:async()=>{let p=a??(await Promise.resolve(u))?.decimals;if(p==null)throw new Error("paraswap needs destination decimals; none supplied or resolvable");let f=await Zt({chainId:e,srcToken:t,destToken:r,amount:n,srcDecimals:s,destDecimals:p},l),m=f?.priceRoute;return{amountOut:m?.destAmount,gasUsd:et(m?.gasCostUSD),oracleFeeBps:f?.oracleFee?.applies?f.oracleFee.bps:0,meta:{bestRoute:m?.bestRoute?.[0]?.swaps?.[0]?.swapExchanges?.[0]?.exchange,oracleFee:f?.oracleFee??null}}}}),process.env.ZEROX_API_KEY&&d.push({source:"0x",run:async()=>{let p=await er({chainId:e,sellToken:t,buyToken:r,sellAmount:n,taker:o},l),f=null,m=p?.totalNetworkFee,h=await Promise.resolve(c);return m!=null&&h&&(f=Number(m)/1e18*h),{amountOut:p?.buyAmount,minOut:p?.minBuyAmount,gasUsd:f,meta:{source:p?.route?.fills?.[0]?.source}}}}),process.env.ONEINCH_API_KEY&&d.push({source:"1inch",run:async()=>{let p=await $d({chainId:e,src:t,dst:r,amount:n},l),f=null;return p?.gas!=null&&c&&(f=null),{amountOut:p?.dstAmount,gasUsd:f,meta:{gasUnits:p?.gas}}}}),d.push({source:"cow",run:async()=>{let p=await Pt({chainId:e,sellToken:t,buyToken:r,sellAmountBeforeFee:String(n),from:o},l),f=p?.quote??p,m=f?.feeAmount;return{amountOut:f?.buyAmount,gasUsd:0,meta:{intent:!0,feeAmountInSellToken:m,settlement:"solver-executed"}}}}),De[Number(e)]&&d.push({source:"uniswap-v4",run:async()=>{let p=await go({chainId:e,tokenIn:t,tokenOut:r,amountIn:n,recipient:o,slippageBps:i},l);return{amountOut:p?.amountOut,minOut:p?.minOut??p?.amountOutMinimum??null,gasUsd:null,liquidityUsd:p?.liquidityUsd??null,meta:{onchain:!0,venue:"uniswap-v4",fee:p?.fee,tickSpacing:p?.tickSpacing,poolId:p?.poolId,hooks:p?.hooks,gasUnits:p?.gasEstimate,quoter:p?.quoter,poolManager:p?.poolManager,prepareReady:p?.prepareReady===!0,executionReady:!1}}}}),ke[Number(e)]&&d.push({source:"uniswap-v3",run:async()=>{let p=await $t({chainId:e,tokenIn:t,tokenOut:r,amountIn:n},l);return{amountOut:p?.amountOut,minOut:p?.minOut??p?.amountOutMinimum??null,gasUsd:null,liquidityUsd:p?.liquidityUsd??null,meta:{onchain:!0,fee:p?.fee,gasUnits:p?.gasEstimate,quoter:p?.quoter}}}}),d}function Gd({fromChainId:e,toChainId:t,tokenIn:r,tokenOut:n,amountIn:o,taker:i,opts:s={}}){let a=[],c=null,u=async(l,d={})=>(c||=Px(s),qx(await c,l,d));return a.push({source:"lifi",run:async()=>{let l=await Nt({fromChain:e,toChain:t,fromToken:r,toToken:n,fromAmount:o},s),d=l?.estimate??l?.[0]?.estimate,p={tool:l?.tool??l?.toolDetails?.name,durationSeconds:et(d?.executionDuration)},f=await u("lifi",p);return{amountOut:d?.toAmount,minOut:d?.toAmountMin,gasUsd:So(d?.gasCosts),feeUsd:So(d?.feeCosts),oracleFeeBps:l?.oracleFee?.applies?l.oracleFee.bps:0,liquidityUsd:f?.liquidityUsd??null,meta:{...p,liquidityProtocol:f?.protocol,oracleFee:l?.oracleFee??null}}}}),a.push({source:"relay",run:async()=>{let{relayQuote:l}=await Promise.resolve().then(()=>(ko(),xo)),p=(await l({user:i,originChainId:e,destinationChainId:t,originCurrency:r,destinationCurrency:n,amount:String(o)},s))?.details,f={durationSeconds:et(p?.timeEstimate),rate:p?.rate},m=await u("relay",f);return{amountOut:p?.currencyOut?.amount,minOut:p?.currencyOut?.minimumAmount,gasUsd:et(p?.totalImpact?.usd)!=null?Math.abs(et(p.totalImpact.usd)):null,liquidityUsd:m?.liquidityUsd??null,meta:{...f,liquidityProtocol:m?.protocol}}}}),a.push({source:"across",run:async()=>{let{acrossSuggestedFees:l}=await Promise.resolve().then(()=>(ko(),xo)),d=await l({token:r,destinationToken:n,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 u("across");return{amountOut:f,gasUsd:null,liquidityUsd:m?.liquidityUsd??null,meta:{derivedFromFees:!0,durationSeconds:et(d?.estimatedFillTimeSec),limits:d?.limits?{min:d.limits.minDeposit,max:d.limits.maxDeposit}:void 0,liquidityProtocol:m?.protocol}}}}),a}var et,wt,Vd,Kd=A(()=>{Fr();Gn();Jn();qd();no();po();Ws();Gs();Fs();et=e=>{let t=Number(e);return Number.isFinite(t)?t:null};wt=e=>String(e??"").toLowerCase().replace(/[^a-z0-9]/g,""),Vd=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 Yd={};B(Yd,{QUALITY:()=>Fe,bestBridgeRoute:()=>Zr,bestSwapRoute:()=>ar,formatComparisonNote:()=>Eo});async function Xd(e,t,r){let n=Lx[Number(e)];if(!n)return{priceUsd:null,decimals:null};let o=`${n}:${t}`;try{let s=(await wo([o],r))?.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 ar(e,t={}){let{chainId:r,tokenIn:n,tokenOut:o,amountIn:i}=e;if(r==null||!n||!o||i==null)throw new Error("bestSwapRoute requires chainId, tokenIn, tokenOut, amountIn");let s=Wd(r,t),a=Xd(r,o,t),c=rd(r,t).catch(()=>null),u=Xs({...e,nativePriceUsd:s,decimalsOut:e.decimalsOut,destDecimalsPromise:a,opts:t}),[l,d,p]=await Promise.all([mo(u,{timeoutMs:t.timeoutMs??12e3}),a,c]);s.catch(()=>{});let f=await s.then(y=>y,()=>null),m=Bs(l,{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 Td(async _=>{let w=Xs({...e,amountIn:_.toString(),nativePriceUsd:s,decimalsOut:e.decimalsOut,destDecimalsPromise:a,opts:t}).filter(v=>v.source===y);return w.length?(await mo(w,{timeoutMs:t.timeoutMs??12e3}))?.[0]?.amountOut??null:null},i);if(E){let _=Rd(m,{[y]:E},{maxImpactPct:h});return{kind:"swap",chainId:r,tokenIn:n,tokenOut:o,amountIn:String(i),..._,sourcesTried:u.length,sourcesAnswered:l.filter(w=>w.quality!==Fe.FAILED).length,note:Eo(_,u.length),priceImpact:{[y]:Number(E.impactPct.toFixed(2))}}}}return{kind:"swap",chainId:r,tokenIn:n,tokenOut:o,amountIn:String(i),...m,sourcesTried:u.length,sourcesAnswered:l.filter(y=>y.quality!==Fe.FAILED).length,note:Eo(m,u.length)}}async function Zr(e,t={}){let{fromChainId:r,toChainId:n,tokenIn:o,tokenOut:i,amountIn:s}=e;if(r==null||n==null||!o||!i||s==null)throw new Error("bestBridgeRoute requires fromChainId, toChainId, tokenIn, tokenOut, amountIn");if(Number(r)===Number(n))throw new Error("bestBridgeRoute is for cross-chain; use bestSwapRoute for same-chain");let a=Xd(n,i,t),c=Gd({...e,opts:t}),[u,l]=await Promise.all([mo(c,{timeoutMs:t.timeoutMs??15e3}),a]),d=Bs(u,{destPriceUsd:l.priceUsd,destDecimals:e.decimalsOut??l.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:r,toChainId:n,tokenIn:o,tokenOut:i,amountIn:String(s),...d,durations:p,sourcesTried:c.length,sourcesAnswered:u.filter(f=>f.quality!==Fe.FAILED).length,note:Eo(d,c.length)}}function Ux(e){let t=e?.meta?.oracleFee;return t?.applies?` \xB7 ${kl(t)}`:""}function Eo(e,t){if(!e.best)return"no source returned a usable route";let r=e.routes.length,n=Ux(e.best);if(r===1)return`only 1 of ${t} sources answered, so this is the ONLY route, not a proven best one. Treat it as unbenchmarked.`+n;if(e.improvementBps!=null){let o=e.improvementBps,i=o/100;if(o<.01)return`best of ${r} routes, ranked on ${e.rankedOn}: effectively tied with the runner-up (${e.spreadBasis}), inside quote noise. Re-quote before you size up.`+n;let s=i>=.01?`${i.toFixed(2)}%`:`${o.toFixed(2)}bps`;return`best of ${r} routes, ranked on ${e.rankedOn}: ${s} better than the runner-up (${e.spreadBasis})`+n}return`best of ${r} routes, ranked on ${e.rankedOn}. No spread quoted: the top routes report cost differently, so the margin is not comparable.`+n}var Lx,cr=A(()=>{Fs();Kd();Wn();Gs();ut();Lx={1:"ethereum",10:"optimism",56:"bsc",137:"polygon",8453:"base",42161:"arbitrum",43114:"avax"}});var Jd={};B(Jd,{ARTIFACT:()=>lt,prepareBestRoute:()=>Hx,supportedPreparers:()=>Fx});function Fx(){return Object.keys(Ao)}async function Hx(e,t={}){if(jx.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:r}=e;if(!r)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(!Mx.test(r))throw new Error(`taker must be a valid 20-byte address, got "${r}"`);if(Dx.has(r.toLowerCase()))throw new Error(`taker "${r}" 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 n=await ar(e,t);if(!n.best){let y=n.impactRejected??[];return{ok:!1,reason:y.length?y[0].reason:"no source returned a usable route",priceImpactBlocked:y.length>0,impactRejected:y,comparison:n}}let o=e.source||n.best.source,i=n.routes.find(y=>y.source===o);if(!i)return{ok:!1,reason:`source "${o}" did not return a usable route`,comparison:n};let s=Ao[o];if(!s){let y=n.routes.find(x=>Ao[x.source]&&x.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:n,winner:o}}let a;try{a=await s(e,t)}catch(y){let x=typeof y?.body=="string"?y.body:y?.body?JSON.stringify(y.body):"",E=[String(y?.message||y),x].filter(Boolean).join(" :: "),_=/allowance/i.test(E),w=!_&&/not enough|insufficient|balance/i.test(E),O,v;_?(v="approval-required-first",O=`${o} will not build swap calldata until the token approval exists on-chain. Approve the spender first, then prepare again. Underlying: ${E}`):w?(v="taker-not-funded",O=`${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.`):(v="provider-error",O=`${o} prepare failed: ${E}`);let g=n.routes.find(b=>Ao[b.source]&&b.source!==o);return{ok:!1,reason:O,failureKind:v,...g?{alternative:g.source}:{},comparison:n}}let c=e.driftToleranceBps??Bx,u=null,l=null;if(a.amountOut!=null&&i.grossOut!=null)try{let y=BigInt(i.grossOut),x=BigInt(a.amountOut);y>0n&&(u=Number((x-y)*10000n/y),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=n.routes.filter(y=>y.source!==o).map(y=>({source:y.source,netOut:y.netOut,gasUsd:y.gasUsd})),f=n.routes.map(y=>({source:y.source,liquidityUsd:y.liquidityUsd??null})).reduce((y,x)=>Math.max(y,x.liquidityUsd??0),0)||null,m=i.liquidityUsd??null,h=m!=null&&f>0?Math.round(m/f*100):null;return Q({ok:!0,chosen:{source:o,wasWinner:o===n.best.source,netOut:i.netOut,grossOut:i.grossOut,gasUsd:i.gasUsd,liquidityUsd:i.liquidityUsd??null},liquidity:{chosenUsd:m,maxUsd:f,sharePct:h},priceImpact:n.priceImpact??null,impactUnmeasured:n.impactUnmeasured??[],...a,unsigned:!0,signedBy:"user-wallet",destination:a.artifactKind===lt.TRANSACTION?a.transaction?.to??null:a.settlement??null,driftBps:u,warnings:[...l?[l]:[],...n.warnings||[],...a.artifactKind===lt.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:n.rankedOn,sourcesAnswered:n.sourcesAnswered,sourcesTried:n.sourcesTried,improvementBps:n.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 lt,Bx,Ao,Dx,Mx,jx,Qd=A(()=>{cr();xe();lt=Object.freeze({TRANSACTION:"unsigned-transaction",TYPED_DATA_ORDER:"typed-data-order"}),Bx=100,Ao={"uniswap-v3":async({chainId:e,tokenIn:t,tokenOut:r,amountIn:n,taker:o},i)=>{let{uniV3PrepareExactIn:s}=await Promise.resolve().then(()=>(po(),gd)),a=await s({chainId:e,tokenIn:t,tokenOut:r,amountIn:n,recipient:o},i);return{artifactKind:lt.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:r,amountIn:n,taker:o,slippageBps:i,deadlineSeconds:s,fee:a,tickSpacing:c,hooks:u},l)=>{let{uniV4PrepareExactIn:d}=await Promise.resolve().then(()=>(Ws(),Bd)),p=await d({chainId:e,tokenIn:t,tokenOut:r,amountIn:n,recipient:o,slippageBps:i,deadlineSeconds:s,fee:a,tickSpacing:c,hooks:u},l);return{artifactKind:lt.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:r,amountIn:n,taker:o},i)=>{let{lifiPrepare:s}=await Promise.resolve().then(()=>(Fr(),Es)),a=await s({fromChain:e,toChain:e,fromToken:t,toToken:r,fromAmount:n,fromAddress:o},i);return{artifactKind:lt.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:r,amountIn:n,taker:o,decimalsIn:i,decimalsOut:s},a)=>{let{paraswapPrepare:c}=await Promise.resolve().then(()=>(Gn(),Ol)),u=await c({chainId:e,srcToken:t,destToken:r,amount:n,srcDecimals:i,destDecimals:s,userAddress:o,side:"SELL"},a);return{artifactKind:lt.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:r,amountIn:n,taker:o},i)=>{let{zeroxPrepare:s}=await Promise.resolve().then(()=>(Jn(),Ll)),a=await s({chainId:e,sellToken:t,buyToken:r,sellAmount:n,taker:o},i);return{artifactKind:lt.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:r,amountIn:n,taker:o},i)=>{let{cowPrepareOrder:s}=await Promise.resolve().then(()=>(no(),Ql)),a=await s({chainId:e,sellToken:t,buyToken:r,sellAmountBeforeFee:String(n),from:o},i);return{artifactKind:lt.TYPED_DATA_ORDER,typedData:a.typedData,requiresApproval:{token:t,spender:a.vaultRelayer,amount:String(n),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"}}};Dx=new Set(["0x0000000000000000000000000000000000000000","0x000000000000000000000000000000000000dead","0x0000000000000000000000000000000000000001","0x00000000000000000000000000000000000a1ce5"].map(e=>e.toLowerCase())),Mx=/^0x[0-9a-fA-F]{40}$/,jx=Object.freeze(["operation","exactOutput","amountOut","multihop","path","positionManager","modifyLiquidities","commands","actions"])});var Zd={};B(Zd,{prepareBestBridgeRoute:()=>Kx,supportedBridgePreparers:()=>Gx});function Gx(){return Object.keys(vo)}async function Kx(e,t={}){let{taker:r,fromChainId:n,toChainId:o}=e;if(!r)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(!zx.test(r))throw new Error(`taker must be a valid 20-byte address, got "${r}"`);if(Vx.has(r.toLowerCase()))throw new Error(`taker "${r}" 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 Zr(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=vo[s];if(!c){let y=i.routes.find(x=>vo[x.source]&&x.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 u;try{u=await c(e,t)}catch(y){let x=typeof y?.body=="string"?y.body:y?.body?JSON.stringify(y.body):"",E=[String(y?.message||y),x].filter(Boolean).join(" :: "),_=/allowance/i.test(E),w=!_&&/not enough|insufficient|balance/i.test(E),O=i.routes.find(v=>vo[v.source]&&v.source!==s);return{ok:!1,reason:_?`${s} will not build calldata until the token approval exists on-chain. Approve first, then prepare again. Underlying: ${E}`:w?`${s} refused to build: ${E}. Quoting works for any address; preparing needs the real funded wallet on chain ${n}.`:`${s} bridge prepare failed: ${E}`,failureKind:_?"approval-required-first":w?"taker-not-funded":"provider-error",...O?{alternative:O.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(y=>y.chainId!=null&&Number(y.chainId)!==Number(n));if(d.length)return{ok:!1,reason:`${s} returned a transaction for chain ${d[0].chainId} but the origin chain is ${n}. Refusing to hand over a mismatched artifact.`,failureKind:"chain-mismatch",comparison:i};let p=e.driftToleranceBps??Wx,f=null,m=null;if(u.amountOut!=null&&a.grossOut!=null)try{let y=BigInt(a.grossOut),x=BigInt(u.amountOut);y>0n&&(f=Number((x-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 ~${u.durationSeconds!=null?`${u.durationSeconds}s`:"minutes"} before the destination credits, and do not re-send if it is pending.`];return l.length>1&&h.push(`This route needs ${l.length} transactions signed IN ORDER. Signing only the first leaves funds approved but not bridged.`),Q({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(n),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: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. ${l.length} transaction(s) on chain ${n}, crediting chain ${o}. Verify every destination address before signing.`},{provider:"router",kind:"best-bridge"})}var zx,Vx,Wx,vo,ep=A(()=>{cr();xe();zx=/^0x[0-9a-fA-F]{40}$/,Vx=new Set(["0x0000000000000000000000000000000000000000","0x000000000000000000000000000000000000dead","0x0000000000000000000000000000000000000001","0x00000000000000000000000000000000000a1ce5"].map(e=>e.toLowerCase())),Wx=100,vo={relay:async({fromChainId:e,toChainId:t,tokenIn:r,tokenOut:n,amountIn:o,taker:i},s)=>{let{relayPrepare:a}=await Promise.resolve().then(()=>(ko(),xo)),c=await a({user:i,originChainId:e,destinationChainId:t,originCurrency:r,destinationCurrency:n,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:r,tokenOut:n,amountIn:o,taker:i,isHolder:s},a)=>{let{lifiPrepare:c}=await Promise.resolve().then(()=>(Fr(),Es)),u=await c({fromChain:e,toChain:t,fromToken:r,toToken:n,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 np={};B(np,{buildTwapSchedule:()=>rp,normalizeTwapParams:()=>tp,prepareTwapChunk:()=>ek,simulateTwap:()=>tk});function tp(e={}){let t=Math.max(Xx,Math.min(Yx,Number(e.splits)||Qx)),r=Math.max(.1,Number(e.windowHours)||Zx),n=Math.max(Jx,r*3600),o=BigInt(e.amount)/BigInt(t),i=Math.floor(n/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:r,windowSec:n,intervalSec:i,taker:String(e.taker),slippageBps:s,status:"planned",createdAt:new Date().toISOString()}}function rp(e){let t=tp(e),r=Math.floor(Date.now()/1e3),n=[];for(let o=0;o<t.splits;o++)n.push({splitIndex:o+1,executeAfter:new Date((r+o*t.intervalSec)*1e3).toISOString(),chunkSize:t.chunkSize});return{params:t,schedule:n}}async function ek(e,t,{chainId:r,tokenIn:n,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 ar({chainId:r,tokenIn:n,tokenOut:o,amountIn:i,taker:s}),u=Q(c.transaction??c.tx,{chainId:r,taker:s,tokenIn:n,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 tk(e,{quoteFn:t=ar,...r}={}){let n=rp(e),o=[],i=0n,s="unknown";for(let c=0;c<n.params.splits;c++)try{let u=await t({chainId:n.params.chainId,tokenIn:n.params.tokenIn,tokenOut:n.params.tokenOut,amountIn:n.params.chunkSize,taker:n.params.taker},r),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(r.signal?.aborted)throw r.signal.reason||u;o.push({splitIndex:c+1,error:String(u.message||u).slice(0,200)})}let a=i>0n?(Number(i)/Number(BigInt(n.params.amount))).toFixed(6):null;return{params:n.params,schedule:n.schedule,totalOut:String(i),averagePrice:a,bestSource:s,chunks:o,simulatedAt:new Date().toISOString()}}var Xx,Yx,Jx,Qx,Zx,op=A(()=>{cr();xe();Xx=2,Yx=100,Jx=60,Qx=10,Zx=6});async function ap({srcChainId:e,srcChainTokenIn:t,srcChainTokenInAmount:r,dstChainId:n,dstChainTokenOut:o,slippage:i=100,affiliateFeePercent:s="0"}={},a={}){if(!e||!n||!t||!o||!r)return{error:"debridge quote requires srcChainId, dstChainId, srcChainTokenIn, dstChainTokenOut, srcChainTokenInAmount"};if(!ip.has(Number(e))||!ip.has(Number(n)))return{error:`debridge: unsupported chain pair ${e} -> ${n}`};try{let c={srcChainId:String(e),srcChainTokenIn:t,srcChainTokenInAmount:String(r),dstChainId:String(n),dstChainTokenOut:o,slippage:i,affiliateFeePercent:s},u=await C(`${sp}/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 cp(){try{return{ok:!0,chainCount:(await C(`${sp}/supported-chains-info`))?.chains?.length??0}}catch(e){return{ok:!1,error:String(e.message||e).slice(0,160)}}}var sp,ip,up=A(()=>{j();xe();sp="https://dln.debridge.finance/v1.0",ip=new Set([1,10,56,137,8453,42161,43114,59144,534352,7777777,324,5e3,1101,81457])});async function dp({active:e=!0}={},t={}){let r=Date.now();if(ur.size&&r-lp<rk)return[...ur.values()];try{let n=await C(`${Ys}/exchange/currencies?active=${e?"true":"false"}`,t);ur.clear();for(let o of n??[])ur.set(String(o.ticker).toLowerCase(),o);return lp=r,n??[]}catch(n){return ur.size?[...ur.values()]:{error:String(n.message||n).slice(0,200)}}}async function nk(e,t,r={}){if(!e||!t)return{error:"changenow minAmount requires fromTicker and toTicker"};try{return{minAmount:(await C(`${Ys}/exchange/min-amount/${encodeURIComponent(e)}_${encodeURIComponent(t)}`,r))?.minAmount??"0"}}catch(n){return{error:String(n.message||n).slice(0,200)}}}async function ok(e,t,r,{flow:n="standard"}={},o={}){if(!e||!t||!r)return{error:"changenow estimate requires fromTicker, toTicker, fromAmount"};try{let i=new URLSearchParams({fromCurrency:String(e).toLowerCase(),toCurrency:String(t).toLowerCase(),fromAmount:String(r),flow:n}),s=await C(`${Ys}/exchange/estimated-amount?${i}`,o);return{fromAmount:s?.fromAmount,toAmount:s?.toAmount,rate:s?.rate,flow:s?.flow??n}}catch(i){return{error:String(i.message||i).slice(0,200)}}}async function pp({fromTicker:e,toTicker:t,fromAmount:r,flow:n}={},o={}){if(!e||!t)return{error:"changenow quote requires fromTicker and toTicker"};let i=await nk(e,t,o);if(i.error)return i;let s=r??i.minAmount,a=await ok(e,t,s,{flow:n},o);if(a.error)return a;let c=await dp({},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 fp(){try{let e=await dp();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 Ys,ur,lp,rk,mp=A(()=>{j();Ys="https://api.changenow.io/v2",ur=new Map,lp=0,rk=6e5});async function hp({fromChain:e,toChain:t,fromToken:r,toToken:n,fromAmount:o,fromAddress:i,slippage:s=1}={},a={}){if(!e||!t||!r||!n||!o||!i)return{error:"squid quote requires fromChain, toChain, fromToken, toToken, fromAmount, fromAddress"};try{let c={fromChain:e,toChain:t,fromToken:r,toToken:n,fromAmount:String(o),fromAddress:i,slippage:s},u=await C(`${ik}/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 ik,yp=A(()=>{j();ik="https://api.squidrouter.com/v1"});async function bp({srcChainId:e,dstChainId:t,token:r,amount:n,dstGasForCall:o=0,minAmountOut:i="0"}={},s={}){if(!e||!t||!r||!n)return{error:"stargate quote requires srcChainId, dstChainId, token, amount"};try{let a=new URLSearchParams({srcChainId:String(e),dstChainId:String(t),token:r,amount:String(n),dstGasForCall:String(o),minAmountOut:String(i)}),c=await C(`${sk}/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 sk,gp=A(()=>{j();sk="https://api.stargate.finance"});async function wp({fromAsset:e,toAsset:t,amount:r,destination:n}={},o={}){if(!e||!t||!r)return{error:"thorchain quote requires fromAsset, toAsset, amount"};try{let i=new URLSearchParams({from_asset:e,to_asset:t,amount:String(r),destination:n||""}),s=await C(`${ak}/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 ak,xp=A(()=>{j();ak="https://midgard.ninerealms.com/v2"});async function kp({fromChainId:e,toChainId:t,fromToken:r,toToken:n,fromAmount:o,userAddress:i}={},s={}){if(!e||!t||!r||!n||!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:r,toTokenAddress:n,fromAmount:String(o),userAddress:i,sort:"output",singleTxOnly:"false"}),c=await C(`${ck}/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 ck,Sp=A(()=>{j();ck="https://api.socket.tech/v2"});async function Ep({originDomain:e,destinationDomain:t,originToken:r,destinationToken:n,amount:o}={},i={}){if(!e||!t||!r||!n||!o)return{error:"connext quote requires originDomain, destinationDomain, originToken, destinationToken, amount"};try{let s={originDomain:String(e),destinationDomain:String(t),originToken:r,destinationToken:n,amount:String(o)},a=await C(`${uk}/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 uk,Ap=A(()=>{j();uk="https://api.connext.network"});async function vp({fromChain:e,toChain:t,token:r,amount:n}={},o={}){if(!e||!t||!r||!n)return{error:"wormhole quote requires fromChain, toChain, token, amount"};try{let i=new URLSearchParams({fromChain:String(e),toChain:String(t),token:r,amount:String(n)}),s=await C(`${lk}/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 lk,Ip=A(()=>{j();lk="https://api.portalbridge.com/v1"});function dk(e,t){return`0x${Qs.getAmountsOut}`+Pe(e)+Pe(64)+Pe(t.length)+t.map(en).join("")}function pk(e){if(!e||e==="0x")return null;let t=e.slice(2);if(t.length<128)return null;let r=Number(BigInt(`0x${t.slice(64,128)}`));if(!Number.isFinite(r)||r<1||r>16)return null;let n=[];for(let o=0;o<r;o++){let i=128+o*64;if(t.length<i+64)return null;n.push(BigInt(`0x${t.slice(i,i+64)}`))}return n}function Js(e,t="router"){return(e?.venues||[]).find(n=>n.kind===t)?.address??null}function fk(e,t){let r=Number(t);if(!Number.isFinite(r)||r<0)throw new Error("slippageBps must be a non-negative number");if(r>Zs)throw new Error(`slippageBps ${r} exceeds the ${Zs} 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(r))/10000n}function _p(e){let{chainId:t,wrappedNative:r}=e;async function n(o,i,s,a){let c=await Y(t,"eth_call",[{to:o,data:dk(i,s)},"latest"],a);return pk(c?.result??c)}return{async quote({tokenIn:o,tokenOut:i,amountIn:s,path:a},c={}){let u=Js(c.scanner);if(!u)return{chainId:t,evidence:U.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(p=>!/^0x[0-9a-fA-F]{40}$/.test(p||"")))throw new Error("quote requires valid 20-byte addresses");let d=await n(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:U.LIVE,note:"exact-input quote at current reserves; not a guaranteed fill"}:{chainId:t,router:u,path:l,evidence:U.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=Js(a.scanner),u=s||r;if(u&&String(o).toLowerCase()===String(u).toLowerCase())return{chainId:t,token:o,verdict:q.UNKNOWN,evidence:U.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:q.UNKNOWN,evidence:U.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 n(c,i,[u,o],a);if(!l)return{chainId:t,token:o,verdict:q.FAIL,evidence:U.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:q.FAIL,evidence:U.LIVE,leg:"buy",reason:"buy leg quotes zero output"};let p=await n(c,d,[o,u],a);if(!p)return{chainId:t,token:o,verdict:q.FAIL,evidence:U.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=q.PASS,y="round trip completes with expected fee/impact loss";return m<5e3?(h=q.FAIL,y=`round trip returns only ${(m/100).toFixed(2)}% -- punitive tax or no real liquidity`):m<9e3&&(h=q.CAUTION,y=`round trip returns ${(m/100).toFixed(2)}% -- transfer tax or thin liquidity at this size`),{chainId:t,token:o,base:u,router:c,verdict:h,reason:y,amountIn:String(i),bought:d.toString(),returned:f.toString(),retentionBps:m,evidence:U.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 p=d.scanner,f=Js(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=l||[o,i],h=await this.quote({tokenIn:o,tokenOut:i,amountIn:s,path:m},d);if(h.evidence!==U.LIVE)throw new Error(`cannot prepare without a live quote (${h.evidence}: ${h.reason??"no reason given"})`);let y=fk(h.amountOut,c);if(y<=0n)throw new Error("computed minOut is zero -- refusing to prepare");let x=BigInt(Math.floor(Date.now()/1e3)+Number(u)),E=r&&m[0].toLowerCase()===r.toLowerCase()&&d.useNative,_=E?`0x${Qs.swapExactETHForTokens}`+Pe(y)+Pe(128)+en(a)+Pe(x)+Pe(m.length)+m.map(en).join(""):`0x${Qs.swapExactTokensForTokens}`+Pe(s)+Pe(y)+Pe(160)+en(a)+Pe(x)+Pe(m.length)+m.map(en).join("");return{unsigned:!0,signedBy:"user-wallet",chainId:t,tx:{to:f,data:_,value:E?`0x${BigInt(s).toString(16)}`:"0x0"},guard:{quotedOut:h.amountOut,minOut:y.toString(),slippageBps:c,maxSlippageBps:Zs,deadline:x.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 Qs,Pe,en,Zs,Op=A(()=>{ut();gt();Qs={getAmountsOut:"d06ca61f",swapExactTokensForTokens:"38ed1739",swapExactETHForTokens:"7ff36ab5"},Pe=e=>BigInt(e).toString(16).padStart(64,"0"),en=e=>e.slice(2).toLowerCase().padStart(64,"0");Zs=100});function hk(e,t){let r=Number(t);if(!Number.isFinite(r)||r<0)throw new Error("slippageBps must be a non-negative number");if(r>ta)throw new Error(`slippageBps ${r} exceeds the ${ta} 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(r))/10000n}function ea(e,t){return(e?.venues||[]).find(r=>r.kind===t)?.address??null}function Rp(e){let{chainId:t,wrappedNative:r}=e;async function n({quoter:i,tokenIn:s,tokenOut:a,amountIn:c,fee:u},l){let d=`0x${Cp.quoteExactInputSingle}`+tn(s)+tn(a)+qt(c)+qt(u)+qt(0),p=await Y(t,"eth_call",[{to:i,data:d},"latest"],l).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},u){let l=await Promise.all(mk.map(async p=>{let f=await n({quoter:i,tokenIn:s,tokenOut:a,amountIn:c,fee:p},u);return{fee:p,amountOut:f?f.toString():null,out:f}})),d=null;for(let p of l)p.out&&(!d||p.out>d.amountOut)&&(d={fee:p.fee,amountOut:p.out});return{best:d,tried:l.map(({fee:p,amountOut:f})=>({fee:p,amountOut:f}))}}return{async quote({tokenIn:i,tokenOut:s,amountIn:a},c={}){let u=ea(c.scanner,"quoter");if(!u)return{chainId:t,evidence:U.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(!Tp.test(p||""))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:!!r&&String(i).toLowerCase()===String(r).toLowerCase(),triedFeeTiers:d,evidence:U.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:U.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=ea(c.scanner,"quoter"),l=(e.stableQuoteAssets||[]).map(O=>String(O).toLowerCase()),d=null;!a&&typeof e.resolveQuoteAsset=="function"&&(d=await e.resolveQuoteAsset(i,c).catch(()=>null));let p=String(i).toLowerCase(),f=String(r||"").toLowerCase();if(f&&p===f)return{chainId:t,token:i,verdict:q.UNKNOWN,evidence:U.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]&&p!==l[0]?l[0]:null)||r;if(m&&p===String(m).toLowerCase())return{chainId:t,token:i,verdict:q.UNKNOWN,evidence:U.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:q.UNKNOWN,evidence:U.UNAVAILABLE,reason:u?"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:u,tokenIn:m,tokenOut:i,amountIn:s},c);if(!h.best){let O=l.find(v=>v&&v!==String(m).toLowerCase()&&v!==String(i).toLowerCase());if(O){let v=await o({quoter:u,tokenIn:O,tokenOut:i,amountIn:s},c);if(v.best){let g=await o({quoter:u,tokenIn:i,tokenOut:O,amountIn:v.best.amountOut},c);if(g.best){let b=g.best.amountOut,S=Number(b*10000n/BigInt(s)),k=q.PASS,N="round trip vs dollar book completes with expected fee/impact loss";return S<5e3?(k=q.FAIL,N=`round trip vs dollar book returns only ${(S/100).toFixed(2)}% -- punitive tax or no real liquidity`):S<9e3&&(k=q.CAUTION,N=`round trip vs dollar book returns ${(S/100).toFixed(2)}% -- transfer tax or thin liquidity at this size`),{chainId:t,venue:"uniswap-v3",token:i,base:O,quoteAsset:O,verdict:k,reason:N,amountIn:String(s),bought:v.best.amountOut.toString(),returned:b.toString(),retentionBps:S,buyFee:v.best.fee,sellFee:g.best.fee,evidence:U.LIVE,note:"Quoted against the dollar book, not wrapped native. A missing WETH pool is not a honeypot."}}}}return{chainId:t,token:i,verdict:q.FAIL,evidence:U.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:u,tokenIn:i,tokenOut:m,amountIn:h.best.amountOut},c);if(!y.best){let O=l.find(v=>v&&v!==String(m).toLowerCase()&&v!==String(i).toLowerCase());if(O){let v=await o({quoter:u,tokenIn:O,tokenOut:i,amountIn:s},c),g=v.best?await o({quoter:u,tokenIn:i,tokenOut:O,amountIn:v.best.amountOut},c):{best:null};if(v.best&&g.best){let b=g.best.amountOut,S=Number(b*10000n/BigInt(s)),k=q.PASS,N="round trip vs dollar book completes; missing WETH sell pool is not a honeypot";return S<5e3?(k=q.FAIL,N=`dollar-book round trip returns only ${(S/100).toFixed(2)}%`):S<9e3&&(k=q.CAUTION,N=`dollar-book round trip returns ${(S/100).toFixed(2)}%`),{chainId:t,venue:"uniswap-v3",token:i,base:O,quoteAsset:O,verdict:k,reason:N,amountIn:String(s),bought:v.best.amountOut.toString(),returned:b.toString(),retentionBps:S,buyFee:v.best.fee,sellFee:g.best.fee,evidence:U.LIVE,note:"Sell vs wrapped native failed; dollar book succeeded. Not labelled honeypot."}}}return{chainId:t,token:i,verdict:q.FAIL,evidence:U.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 x=y.best.amountOut,E=Number(x*10000n/BigInt(s)),_=q.PASS,w="round trip completes with expected fee/impact loss";return E<5e3?(_=q.FAIL,w=`round trip returns only ${(E/100).toFixed(2)}% -- punitive tax or no real liquidity`):E<9e3&&(_=q.CAUTION,w=`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:_,reason:w,amountIn:String(s),bought:h.best.amountOut.toString(),returned:x.toString(),retentionBps:E,buyFee:h.best.fee,sellFee:y.best.fee,evidence:U.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 p=ea(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(!Tp.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!==U.LIVE)throw new Error(`cannot prepare without a live quote (${f.evidence}: ${f.reason??"no reason given"})`);let m=l??f.fee,h=hk(f.amountOut,u);if(h<=0n)throw new Error("computed minOut is zero -- refusing to prepare");let y=!!(d.useNative||f.useNative)&&r&&String(i).toLowerCase()===String(r).toLowerCase(),x=`0x${Cp.exactInputSingle}`+tn(i)+tn(s)+qt(m)+tn(c)+qt(a)+qt(h)+qt(0);return{unsigned:!0,signedBy:"user-wallet",chainId:t,venue:"uniswap-v3",tx:{to:p,data:x,value:y?String(a):"0x0"},guard:{quotedOut:f.amountOut,minOut:h.toString(),slippageBps:u,maxSlippageBps:ta,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 mk,Cp,qt,tn,Tp,ta,Np=A(()=>{ut();gt();mk=[100,500,3e3,1e4],Cp={quoteExactInputSingle:"c6a5026a",exactInputSingle:"04e45aaf"},qt=e=>BigInt(e).toString(16).padStart(64,"0"),tn=e=>e.slice(2).toLowerCase().padStart(64,"0"),Tp=/^0x[0-9a-fA-F]{40}$/,ta=100});function Pp(e){if(!e||e==="0x")return null;try{return BigInt(e)}catch{return null}}function $p(e){if(!e||e==="0x")return null;let t=e.slice(2);if(t.length>=128){let n=Number(BigInt(`0x${t.slice(64,128)}`));if(n>0&&n<=256&&t.length>=128+n*2){let o=t.slice(128,128+n*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 yk(e){let{chainId:t}=e;async function r(n,o,i){return Y(t,"eth_call",[{to:n,data:o},"latest"],i)}return{async blockNumber(n={}){let o=await so(t,n);return{chainId:t,blockNumber:o?.blockNumber??o,evidence:U.LIVE}},async nativeBalance(n,o={}){let i=await nd(t,n,o);return{chainId:t,address:n,wei:i?.wei??i?.balance??null,symbol:e.nativeCurrency?.symbol??null,decimals:e.nativeCurrency?.decimals??18,evidence:U.LIVE}},async tokenBalance({token:n,owner:o},i={}){let s=await id({chainId:t,token:n,owner:o},i);return{chainId:t,token:n,owner:o,raw:s?.balance??s,evidence:U.LIVE}},async resolveToken(n,o={}){if(!/^0x[0-9a-fA-F]{40}$/.test(n||""))return{chainId:t,token:n,evidence:U.UNKNOWN,error:"resolveToken needs a 20-byte address; symbol lookup is a market-data concern"};let[i,s,a,c]=await Promise.all([r(n,Io.decimals,o).catch(()=>null),r(n,Io.symbol,o).catch(()=>null),r(n,Io.name,o).catch(()=>null),r(n,Io.totalSupply,o).catch(()=>null)]),u=Pp(i?.result??i),l=u!==null||s?.result||a?.result;return{chainId:t,address:n,decimals:u===null?null:Number(u),symbol:$p(s?.result??s),name:$p(a?.result??a),totalSupply:(Pp(c?.result??c)??null)?.toString()??null,evidence:l?U.LIVE:U.UNKNOWN,warning:l?void 0:"no ERC-20 metadata returned -- may not be a token contract"}},async resolvePools(n,o={}){let i=e.dexscreenerSlug;if(!i)return{chainId:t,token:n,pools:[],evidence:U.UNAVAILABLE,reason:"no dexscreenerSlug configured for this chain; pool discovery is unavailable rather than guessed"};let s=await co(n,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=ao(n,c,{stables:e.stableQuoteAssets||[],wrappedNative:e.wrappedNative});return{chainId:t,token:n,pools:u,topPool:u[0]||null,quoteAsset:ad(n,u),evidence:u.length?U.LIVE:U.UNKNOWN}},async scanBlocks({fromBlock:n,toBlock:o,address:i,topics:s,chunkSize:a=2e3}={},c={}){if(!Number.isInteger(n)||!Number.isInteger(o))throw new Error("scanBlocks requires integer fromBlock and toBlock");if(o<n)throw new Error("toBlock must be >= fromBlock");let u=[],l=[];for(let p=n;p<=o;p+=a){let f=Math.min(p+a-1,o);l.push([p,f])}let d=await jt(l,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 Y(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:n,toBlock:o,logs:u,complete:!1,failedAt:[p,f],error:m.error,evidence:U.UNKNOWN};for(let h of m?.result??m??[])u.push(h)}return{chainId:t,fromBlock:n,toBlock:o,logs:u,complete:!0,chunks:l.length,evidence:U.LIVE}},async scoreRisk(n,o={}){let i=[],s=q.PASS,a=l=>{let d={[q.PASS]:0,[q.CAUTION]:1,[q.UNKNOWN]:2,[q.FAIL]:3};d[l]>d[s]&&(s=l)},[c,u]=await Promise.all([this.resolveToken(n,o),this.resolvePools(n,o)]);if(c.evidence!==U.LIVE?(i.push({check:"erc20-metadata",result:q.UNKNOWN,detail:c.warning}),a(q.UNKNOWN)):i.push({check:"erc20-metadata",result:q.PASS,detail:`${c.symbol} / ${c.decimals}d`}),u.evidence===U.UNAVAILABLE)i.push({check:"liquidity",result:q.UNKNOWN,detail:u.reason}),a(q.UNKNOWN);else if(!u.pools.length)i.push({check:"liquidity",result:q.FAIL,detail:"no pool with liquidity found"}),a(q.FAIL);else{let l=u.pools[0],d=l.liquidityUsd??0;d<5e3?(i.push({check:"liquidity",result:q.CAUTION,detail:`top pool only $${d}`}),a(q.CAUTION)):i.push({check:"liquidity",result:q.PASS,detail:`$${d} on ${l.dex}`}),l.createdAt&&Date.now()-l.createdAt<24*3600*1e3&&(i.push({check:"age",result:q.CAUTION,detail:"pool under 24h old"}),a(q.CAUTION))}if(typeof this.sellSimulation=="function"){let l=await this.sellSimulation({token:n,amountIn:(10n**16n).toString()},o).catch(d=>({verdict:q.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:q.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(q.UNKNOWN);return{chainId:t,token:n,verdict:s,checks:i,note:"Structural checks only. UNKNOWN is not PASS. A token is not tradeable until a sell simulation succeeds."}}}}function ra(e){let r={...yk(e)},n=new Set((e.venues||[]).map(i=>i.kind));e.venueKind==="uniswap-v3"&&n.has("quoter")&&n.has("router")?Object.assign(r,Rp({chainId:e.chainId,wrappedNative:e.wrappedNative,stableQuoteAssets:e.stableQuoteAssets||[],resolveQuoteAsset:async(i,s)=>(await r.resolvePools(i,s)).quoteAsset||null})):e.venueKind==="uniswap-v2"&&n.has("router")&&Object.assign(r,_p({chainId:e.chainId,wrappedNative:e.wrappedNative}));let o={};for(let[i,s]of Object.entries(r))o[i]=s.bind(r);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 Io,qp=A(()=>{ut();zr();j();gt();Op();Np();$s();Io={decimals:"0x313ce567",symbol:"0x95d89b41",name:"0x06fdde03",totalSupply:"0x18160ddd",owner:"0x8da5cb5b"}});function _o(){return rn.map(e=>fo(ra(e)))}function Lp(e){return fo(ra(e))}var rn,Oo=A(()=>{qp();gt();rn=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{Interface as jp,getAddress as bk,id as Hp}from"ethers";function lr(e){return e?.cache===!1?!1:!e?.fetchImpl||e.cache===!0}function ia(e,t,r){let n=e.get(t);return n?Date.now()-n.at>r?(e.delete(t),null):n:null}function Co(e,t,r,n){for(e.delete(t),e.set(t,{at:Date.now(),value:r});e.size>n;){let o=e.keys().next();if(o.done)break;e.delete(o.value)}}function $k(e,t){try{return bk(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 Mp(e){return`0x${String(e).slice(-40).toLowerCase()}`}function Lk({unlimited:e,spenderLabel:t,lastActivityAt:r}){if(e)return"unlimited";if(!t)return"unknown-spender";if(r){let n=Date.parse(r);if(Number.isFinite(n)&&Date.now()-n>Ok)return"stale"}return"scoped"}function Uk(e,t,r){if(r)return"UNLIMITED";if(t==null)return e.toString();let n=10n**BigInt(t),o=e/n,i=e%n;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 Bk(e,t,r,n){let o=`${e}:${t}`,i=n?.get(o);if(i)return i;if(lr(r)){let a=ia(Fp,o,Ck);if(a)return a.value}let s=(async()=>{let a=async d=>{try{let p=Up.encodeFunctionData(d,[]),f=await Y(e,"eth_call",[{to:t,data:p},"latest"],r);return!f||f==="0x"?null:Up.decodeFunctionResult(d,f)[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 lr(r)&&Co(Fp,o,l,Nk),l})();return n?.set(o,s),s}async function Fk(e,t,r){let n=Math.min(Math.max(Number(r.lookbackBlocks)||wk,1),xk),o=await so(e,r);if(!Number.isFinite(o))throw new Error("chain head unavailable");let i=Math.max(0,o-n),s=await Y(e,"eth_getLogs",[{fromBlock:`0x${i.toString(16)}`,toBlock:"latest",topics:[gk,qk(t)]}],r);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}:${Mp(l)}`,{token:u,spender:Mp(l)})}return{pairs:[...a.values()],fromBlock:i,toBlock:o}}function Dk(e){return(vk[e]||[]).flatMap(r=>Sk.map(n=>({token:r.address,spender:n.address,symbol:r.symbol,decimals:r.decimals})))}async function Mk(e,t,r={}){let n=[],o="direct-probe",i=null,s=Dk(e),a=oa(e),c=lr(r)&&ia(na,e,Tk)?.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 Fk(e,t,r);n=u.pairs,o="log-scan",i={fromBlock:u.fromBlock,toBlock:u.toBlock},lr(r)&&Co(na,e,!0,64)}catch{if(lr(r)&&Co(na,e,!1,64),n=s,n.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 jt(n,r.concurrency||4,async f=>{try{let m=await od({chainId:e,token:f.token,owner:t,spender:f.spender},r),h=BigInt(m.allowance);if(h<=0n)return null;let y=f.symbol?{symbol:f.symbol,decimals:f.decimals??null}:await Bk(e,f.token,r,u),x=h>=_k,E=kk[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:Uk(h,y.decimals,x),unlimited:x,lastActivityAt:null,risk:Lk({unlimited:x,spenderLabel:E,lastActivityAt:null})}}catch{return null}})).filter(Boolean),p=await Hk(e,t,r);return{scan:{chainId:e,status:"ok",method:o,pairsProbed:n.length,collectionsProbed:oa(e).length,...i||{}},approvals:[...d,...p]}}catch(u){return{scan:{chainId:e,status:"unavailable",method:o,error:String(u?.message||u).slice(0,200)},approvals:[]}}}async function jk(e,t,r,n,o){try{let i=Bp.encodeFunctionData("isApprovedForAll",[r,n]),s=await Y(e,"eth_call",[{to:t,data:i},"latest"],o);return!s||s==="0x"?null:!!Bp.decodeFunctionResult("isApprovedForAll",s)[0]}catch{return null}}function oa(e){return(Ak[e]||[]).flatMap(r=>Ek.map(n=>({collection:r.address,collectionName:r.name,operator:n.address,operatorLabel:n.label})))}async function Hk(e,t,r){let n=oa(e);return n.length===0?[]:(await jt(n,r.concurrency||4,async i=>await jk(e,i.collection,t,i.operator,r)!==!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 zp(e={},t={}){let r=$k(e.owner||e.address,"owner"),n=new Map(rn.map(f=>[f.chainId,f])),o=Array.isArray(e.chainIds)&&e.chainIds.length?[...new Set(e.chainIds.map(Number))].filter(f=>n.has(f)):[...n.keys()],i=`${r}:${[...o].sort((f,m)=>f-m).join(",")}:${e.lookbackBlocks??""}`,s=lr(t)&&!e.refresh;if(s){let f=ia(Dp,i,Rk);if(f)return{...f.value,cached:!0,cachedAgeMs:Date.now()-f.at}}let a=await jt(o,e.concurrency||3,f=>Mk(f,r,{...t,lookbackBlocks:e.lookbackBlocks})),c=a.flatMap(f=>f.approvals),u=a.map(f=>f.scan),l=u.find(f=>f.method==="log-scan"&&f.toBlock),d=u.some(f=>f.method==="direct-probe"&&f.status==="ok"),p={provider:"approvals",operation:"scan",readOnly:!0,queriedAt:new Date().toISOString(),owner:r,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&&Co(Dp,i,p,Pk),{...p,cached:!1,cachedAgeMs:0}}var Up,Bp,gk,JC,wk,xk,kk,Sk,Ek,Ak,vk,Ik,_k,Ok,Ck,Tk,Rk,Nk,Pk,Fp,na,Dp,Vp=A(()=>{Oo();j();ut();Up=new jp(["function decimals() view returns (uint8)","function symbol() view returns (string)"]),Bp=new jp(["function isApprovedForAll(address owner, address operator) view returns (bool)","function name() view returns (string)"]),gk=Hp("Approval(address,address,uint256)"),JC=Hp("ApprovalForAll(address,address,bool)"),wk=1e4,xk=2e5,kk=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)"}),Sk=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"}]),Ek=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"}]),Ak=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"}]}),vk=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}]}),Ik=(1n<<256n)-1n,_k=Ik/2n,Ok=4320*60*60*1e3,Ck=360*60*1e3,Tk=600*1e3,Rk=45*1e3,Nk=512,Pk=128,Fp=new Map,na=new Map,Dp=new Map});var Kp={};B(Kp,{aggregateBridgeQuotes:()=>Wp,bridgeAggregatorHealth:()=>Vk,checkRevokeNeeded:()=>Gp,scanBridgeRoutes:()=>zk});async function Wp(e={},t={}){let{fromChainId:r,toChainId:n,tokenIn:o,tokenOut:i,amount:s,taker:a,fromSymbol:c="?",toSymbol:u="?",fromDecimals:l=18,toDecimals:d=18}=e,p=[],f=[],m=ap({srcChainId:r,srcChainTokenIn:o,srcChainTokenInAmount:s,dstChainId:n,dstChainTokenOut:i},t).then(b=>b.error?(f.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=>(f.push(`debridge: ${b.message}`),null)),h=Zr({fromChainId:r,toChainId:n,tokenIn:o,tokenOut:i,amountIn:s,taker:a},t).then(b=>!b||b.error?(f.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=>(f.push(`lifi: ${b.message}`),null)),y=hp({fromChain:r,toChain:n,fromToken:o,toToken:i,fromAmount:s,fromAddress:a},t).then(b=>b.error?(f.push(`squid: ${b.error}`),null):{provider:"squid",amountOut:b.toAmount,feeUsd:Array.isArray(b.fee)?b.fee.reduce((S,k)=>S+(Number(k.amountUsd)||0),0):null,estimatedTime:"30s - 3min",preparable:!1,raw:b}).catch(b=>(f.push(`squid: ${b.message}`),null)),x=bp({srcChainId:r,dstChainId:n,token:o,amount:s},t).then(b=>b.error?(f.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=>(f.push(`stargate: ${b.message}`),null)),E=wp({fromAsset:c,toAsset:u,amount:s,destination:a},t).then(b=>b.error?(f.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=>(f.push(`thorchain: ${b.message}`),null)),_=(async()=>{if(!c||!u||c==="?"||u==="?")return f.push("changenow: ticker symbols required, skipping"),null;try{let b=await pp({fromTicker:c,toTicker:u,fromAmount:s},t);return b.error?(f.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 f.push(`changenow: ${b.message}`),null}})(),w=kp({fromChainId:r,toChainId:n,fromToken:o,toToken:i,fromAmount:s,userAddress:a},t).then(b=>b.error?(f.push(`bungee: ${b.error}`),null):{provider:"bungee",amountOut:b.amountOut,feeUsd:b.feeUsd,estimatedTime:b.estimatedTime,preparable:!1,raw:b}).catch(b=>(f.push(`bungee: ${b.message}`),null)),O=Ep({originDomain:r,destinationDomain:n,originToken:o,destinationToken:i,amount:s},t).then(b=>b.error?(f.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=>(f.push(`connext: ${b.message}`),null)),v=vp({fromChain:r,toChain:n,token:o,amount:s},t).then(b=>b.error?(f.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=>(f.push(`wormhole: ${b.message}`),null)),g=await Promise.allSettled([m,h,y,x,E,w,O,v,_]);for(let b of g)b.status==="fulfilled"&&b.value&&p.push(b.value);return p.sort((b,S)=>{let k=Number(b.amountOut??0),N=Number(S.amountOut??0);return k!==N?N-k:b.preparable&&!S.preparable?-1:!b.preparable&&S.preparable?1:0}),{providers:p.map(b=>b.provider),bestRoute:p[0]?.provider??"none",winner:p[0]??null,runnersUp:p.slice(1),errors:f.length?f:null}}async function Gp({chainId:e,taker:t,tokenIn:r}={},n={}){if(!e||!t)return{needsRevoke:!1,note:"no wallet to check"};try{let i=(await zp({chainIds:[e],address:t},n)).approvals;if(!i?.length)return{needsRevoke:!1,note:"no active approvals found"};let s=r?i.find(a=>String(a.token).toLowerCase()===String(r).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 zk(e={},t={}){let[r,n]=await Promise.all([Wp(e,t),Gp({chainId:e.fromChainId,taker:e.taker,tokenIn:e.tokenIn},t)]),o=r.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:r.providers,runnersUp:r.runnersUp,revokeCheck:n,errors:r.errors,confidence:r.providers.length>=2?.85:r.providers.length===1?.6:.1}}async function Vk(){let[e,t]=await Promise.all([cp().catch(r=>({ok:!1,error:r.message})),fp().catch(r=>({ok:!1,error:r.message}))]);return{debridge:e,changenow:t,lifi:{ok:!0,note:"integrated via router"}}}var ET,Xp=A(()=>{cr();up();mp();yp();gp();xp();Sp();Ap();Ip();Vp();ET=Object.freeze(["debridge","lifi-relay","squid","stargate","thorchain","bungee","connext","wormhole","changenow"])});var Yp={};B(Yp,{DYDX_API:()=>To,dydxHealth:()=>Xk,dydxMarkets:()=>Gk,dydxOrderbook:()=>Kk});function nn(e){if(e==null||e==="")return null;let t=Number(e);return Number.isFinite(t)?t:null}function Wk(e){let t=e?.markets;return Array.isArray(t)?t:t&&typeof t=="object"?Object.values(t):[]}async function Gk(e=50,t={}){try{let r=await C(`${To}/v4/perpetualMarkets?limit=${e}`,t);return Wk(r).map(o=>{let i=nn(o?.nextFundingRate),s=nn(o?.oraclePrice),a=nn(o?.openInterest),c=nn(o?.volume24H),u=nn(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(r){return{error:String(r.message||r).slice(0,200),venue:"dydx",quality:"FAILED"}}}async function Kk(e){try{let t=await C(`${To}/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 Xk(){try{return{ok:!0,serverTime:(await C(`${To}/v4/time`))?.iso}}catch(e){return{ok:!1,error:String(e.message||e).slice(0,160)}}}var To,Jp=A(()=>{j();To="https://indexer.dydx.trade"});var tf={};B(tf,{DRIFT_API:()=>Zp,driftHealth:()=>Yk,driftMarkets:()=>ef});async function ef(e={}){try{let r=(await C(`${Zp}/v2/markets`,e))?.markets;return!Array.isArray(r)||r.length===0?{error:Qp,venue:"drift",quality:"FAILED"}:r.map(n=>({symbol:n?.symbol||n?.marketIndex,coin:n?.symbol,oraclePrice:n?.amm?.oraclePrice,markPrice:n?.amm?.markPrice,fundingRate:n?.amm?.lastFundingRate?`${(Number(n.amm.lastFundingRate)*100).toFixed(4)}%`:null,openInterest:{long:n?.amm?.longFunding,short:n?.amm?.shortFunding},volume24h:n?.amm?.quoteAssetVolume,venue:"drift",quality:"LIVE"}))}catch(t){return{error:`${Qp} (${String(t.message||t).slice(0,120)})`,venue:"drift",quality:"FAILED"}}}async function Yk(){let e=await ef();return e?.error?{ok:!1,error:e.error,quality:"FAILED"}:{ok:!0,note:"Drift v2 perps on Solana",quality:"LIVE"}}var Zp,Qp,rf=A(()=>{j();Zp="https://dlob.drift.trade",Qp="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 sf={};B(sf,{VERTEX_API:()=>sa,vertexHealth:()=>Qk,vertexMarkets:()=>of,vertexOrderbook:()=>Jk});async function of(e={}){try{let r=(await C(`${sa}/query`,{...e,method:"POST",body:JSON.stringify({all_markets:{}}),headers:{"content-type":"application/json",...e.headers||{}}}))?.data?.all_markets;return!Array.isArray(r)||r.length===0?{error:nf,venue:"vertex",quality:"FAILED"}:r.map(n=>({market:n?.market,type:n?.type,oraclePrice:n?.oracle_price_x18?(Number(BigInt(n.oracle_price_x18))/1e18).toFixed(4):null,minSize:n?.min_size,productId:n?.product_id,venue:"vertex",quality:"LIVE"}))}catch(t){return{error:`${nf} (${String(t.message||t).slice(0,120)})`,venue:"vertex",quality:"FAILED"}}}async function Jk(e){try{let r=(await C(`${sa}/query`,{method:"POST",body:JSON.stringify({market_liquidity:{product_id:Number(e),depth:5}}),headers:{"content-type":"application/json"}}))?.data?.market_liquidity;return{bids:r?.bids||[],asks:r?.asks||[]}}catch(t){return{error:String(t.message||t).slice(0,200),quality:"FAILED"}}}async function Qk(){let e=await of();return e?.error?{ok:!1,error:e.error,quality:"FAILED"}:{ok:!0,status:"ok",quality:"LIVE"}}var sa,nf,af=A(()=>{j();sa="https://gateway.prod.vertexprotocol.com/v2",nf="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 cf={};B(cf,{pancakeHealth:()=>tS,pancakeQuote:()=>eS});async function eS({chainId:e=56,tokenIn:t,tokenOut:r,amountIn:n,fee:o=500}={},i={}){if(!t||!r||!n)return{error:"pancake quote requires tokenIn, tokenOut, amountIn"};try{let s={tokenIn:String(t).toLowerCase(),tokenOut:String(r).toLowerCase(),amountIn:String(n),fee:String(o)},a=await C(`${Zk}/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 tS(){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 Zk,uf=A(()=>{j();Zk="https://api.thegraph.com/subgraphs/name/pancakeswap/exchange-v3-bsc"});var df={};B(df,{sushiHealth:()=>oS,sushiQuote:()=>nS});async function nS({chainId:e=1,tokenIn:t,tokenOut:r,amountIn:n,fee:o=500}={},i={}){if(!t||!r||!n)return{error:"sushi quote requires tokenIn, tokenOut, amountIn"};try{let s=`{ quote(tokenIn:"${t}",tokenOut:"${r}",amountIn:"${n}",fee:${o}) { amountOut route } }`,a=await C(`${rS(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 oS(){try{return{ok:!0,chains:Object.keys(lf).length+" chains"}}catch(e){return{ok:!1,error:String(e.message||e).slice(0,160)}}}var rS,lf,pf=A(()=>{j();rS=e=>`https://api.thegraph.com/subgraphs/name/sushi-v3/v3-${lf[e]||"ethereum"}`,lf={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 ff={};B(ff,{raydiumHealth:()=>aS,raydiumQuote:()=>sS});async function sS({inputMint:e,outputMint:t,amount:r,slippageBps:n=50}={},o={}){if(!e||!t||!r)return{error:"raydium quote requires inputMint, outputMint, amount"};try{let i=new URLSearchParams({inputMint:e,outputMint:t,amount:String(r),slippageBps:String(n),onlyDirectRoutes:"true"}),s=await C(`${iS}/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 aS(){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 iS,mf=A(()=>{j();iS="https://quote-api.jup.ag/v6"});var hf={};B(hf,{AEVO_API:()=>aa,aevoHealth:()=>uS,aevoMarkets:()=>cS});async function cS(e={}){try{return(await C(`${aa}/markets`,e)||[]).map(r=>({instrument:r?.instrument_name,type:r?.instrument_type,markPrice:r?.mark_price,indexPrice:r?.index_price,fundingRate:r?.funding_rate?`${(Number(r.funding_rate)*100).toFixed(4)}%`:null,openInterest:r?.open_interest,volume24h:r?.volume_24h}))}catch(t){return{error:String(t.message||t).slice(0,200)}}}async function uS(){try{return{ok:(await C(`${aa}/ping`))?.status==="ok"}}catch(e){return{ok:!1,error:String(e.message||e).slice(0,160)}}}var aa,yf=A(()=>{j();aa="https://api.aevo.xyz"});var da={};B(da,{BINANCE_DEFAULT_FUNDING_INTERVAL_HOURS:()=>wf,BINANCE_FUTURES_API:()=>gf,BINANCE_SPOT_API:()=>bf,binanceFunding:()=>No,binanceFundingHistory:()=>fS,binanceHealth:()=>ua,binanceMarkPrice:()=>dS,binanceOpenInterest:()=>pS,binanceOrderbook:()=>lS,binanceSymbol:()=>dr,binanceTicker:()=>la,normalizeBook:()=>pr});function ca(e={}){return(e.spotBaseUrl||e.baseUrl||process.env.BINANCE_API_URL||bf).replace(/\/$/,"")}function Ro(e={}){return(e.futuresBaseUrl||process.env.BINANCE_FAPI_URL||gf).replace(/\/$/,"")}function on(e){return{error:String(e.message||e).slice(0,200)}}function Ce(e){let t=Number(e);return Number.isFinite(t)?t:null}function dr(e,t="USDT"){let r=String(e||"").trim().toUpperCase().replace(/[-_/]/g,"");return r?r.endsWith(t)?r:`${r}${t}`:""}async function ua(e={}){try{let t=await C(`${ca(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 la(e={},t={}){let r=dr(e.symbol||e.coin,e.quote||"USDT");if(!r)return{error:"binanceTicker requires symbol or coin"};try{let n=e.full?"/api/v3/ticker/24hr":"/api/v3/ticker/price",o=await C(`${ca(t)}${n}?symbol=${encodeURIComponent(r)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3});return{venue:"binance",market:"spot",symbol:r,price:Ce(o?.price??o?.lastPrice),volume24h:Ce(o?.volume),quoteVolume24h:Ce(o?.quoteVolume),raw:o}}catch(n){return on(n)}}async function lS(e={},t={}){let r=dr(e.symbol||e.coin,e.quote||"USDT");if(!r)return{error:"binanceOrderbook requires symbol or coin"};let n=Math.min(Math.max(Number(e.limit)||20,1),1e3),o=String(e.market||"spot").toLowerCase()==="perp";try{let i=o?`${Ro(t)}/fapi/v1/depth?symbol=${encodeURIComponent(r)}&limit=${n}`:`${ca(t)}/api/v3/depth?symbol=${encodeURIComponent(r)}&limit=${n}`,s=await C(i,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3});return pr({venue:"binance",market:o?"perp":"spot",symbol:r,bids:s?.bids,asks:s?.asks,raw:s})}catch(i){return on(i)}}async function No(e={},t={}){let r=dr(e.symbol||e.coin,e.quote||"USDT");if(!r)return{error:"binanceFunding requires symbol or coin"};try{let n=await C(`${Ro(t)}/fapi/v1/premiumIndex?symbol=${encodeURIComponent(r)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),o=Array.isArray(n)?n[0]:n,i=Number(e.fundingIntervalHours)||wf,s=Ce(o?.lastFundingRate);return{venue:"binance",market:"perp",symbol:r,markPrice:Ce(o?.markPrice),indexPrice:Ce(o?.indexPrice),fundingRate:s,fundingIntervalHours:i,fundingAprPct:s==null?null:s*(8760/i)*100,nextFundingTime:Ce(o?.nextFundingTime),raw:o??null}}catch(n){return on(n)}}async function dS(e={},t={}){let r=await No(e,t);return r?.error?r:{venue:"binance",market:"perp",symbol:r.symbol,markPrice:r.markPrice,indexPrice:r.indexPrice}}async function pS(e={},t={}){let r=dr(e.symbol||e.coin,e.quote||"USDT");if(!r)return{error:"binanceOpenInterest requires symbol or coin"};try{let n=await C(`${Ro(t)}/fapi/v1/openInterest?symbol=${encodeURIComponent(r)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3});return{venue:"binance",market:"perp",symbol:r,openInterest:Ce(n?.openInterest),time:Ce(n?.time),raw:n??null}}catch(n){return on(n)}}async function fS(e={},t={}){let r=dr(e.symbol||e.coin,e.quote||"USDT");if(!r)return{error:"binanceFundingHistory requires symbol or coin"};let n=Math.min(Math.max(Number(e.limit)||10,1),1e3);try{let o=await C(`${Ro(t)}/fapi/v1/fundingRate?symbol=${encodeURIComponent(r)}&limit=${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),i=Array.isArray(o)?o:[];return{venue:"binance",symbol:r,count:i.length,history:i.map(s=>({fundingTime:Ce(s?.fundingTime),fundingRate:Ce(s?.fundingRate)}))}}catch(o){return on(o)}}function pr({venue:e,market:t,symbol:r,bids:n,asks:o,raw:i}){let s=f=>(Array.isArray(f)?f:[]).map(m=>{let h=Ce(Array.isArray(m)?m[0]:m?.price),y=Ce(Array.isArray(m)?m[1]:m?.size);return h==null||y==null?null:{price:h,size:y}}).filter(Boolean),a=s(n),c=s(o),u=a[0]?.price??null,l=c[0]?.price??null,d=u!=null&&l!=null?(u+l)/2:null,p=d?(l-u)/d*1e4:null;return{venue:e,market:t,symbol:r,bids:a,asks:c,bestBid:u,bestAsk:l,mid:d,spreadBps:p,raw:i??null}}var bf,gf,wf,sn=A(()=>{j();bf="https://api.binance.com",gf="https://fapi.binance.com",wf=8});var ya={};B(ya,{OKX_API:()=>xf,OKX_DEFAULT_FUNDING_INTERVAL_HOURS:()=>kf,okxFunding:()=>ma,okxHealth:()=>pa,okxInstId:()=>mr,okxMarkPrice:()=>ha,okxOpenInterest:()=>hS,okxOrderbook:()=>mS,okxTicker:()=>fa});function fr(e={}){return(e.baseUrl||process.env.OKX_API_URL||xf).replace(/\/$/,"")}function an(e){return{error:String(e.message||e).slice(0,200)}}function Se(e){if(e===""||e==null)return null;let t=Number(e);return Number.isFinite(t)?t:null}function mr(e,{market:t="spot",quote:r="USDT"}={}){let n=String(e||"").trim().toUpperCase();if(!n)return"";if(n.includes("-"))return n;let o=`${n}-${r}`;return t==="perp"?`${o}-SWAP`:o}function hr(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 pa(e={}){try{let t=await C(`${fr(e)}/api/v5/public/time`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??1e4});return{ok:hr(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 fa(e={},t={}){let r=String(e.market||"spot").toLowerCase(),n=mr(e.instId||e.symbol||e.coin,{market:r,quote:e.quote||"USDT"});if(!n)return{error:"okxTicker requires instId, symbol or coin"};try{let o=await C(`${fr(t)}/api/v5/market/ticker?instId=${encodeURIComponent(n)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),i=hr(o)[0];return i?{venue:"okx",market:n.endsWith("-SWAP")?"perp":"spot",symbol:n,price:Se(i.last),bestBid:Se(i.bidPx),bestAsk:Se(i.askPx),volume24h:Se(i.vol24h),quoteVolume24h:Se(i.volCcy24h),raw:i}:{error:`okx ticker empty for ${n}`}}catch(o){return an(o)}}async function mS(e={},t={}){let r=String(e.market||"spot").toLowerCase(),n=mr(e.instId||e.symbol||e.coin,{market:r,quote:e.quote||"USDT"});if(!n)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(`${fr(t)}/api/v5/market/books?instId=${encodeURIComponent(n)}&sz=${o}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),s=hr(i)[0];return s?pr({venue:"okx",market:n.endsWith("-SWAP")?"perp":"spot",symbol:n,bids:s.bids,asks:s.asks,raw:s}):{error:`okx books empty for ${n}`}}catch(i){return an(i)}}async function ma(e={},t={}){let r=mr(e.instId||e.symbol||e.coin,{market:"perp",quote:e.quote||"USDT"});if(!r)return{error:"okxFunding requires instId, symbol or coin"};try{let n=await C(`${fr(t)}/api/v5/public/funding-rate?instId=${encodeURIComponent(r)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),o=hr(n)[0];if(!o)return{error:`okx funding-rate empty for ${r}`};let i=Number(e.fundingIntervalHours)||kf,s=Se(o.fundingRate);return{venue:"okx",market:"perp",symbol:r,fundingRate:s,nextFundingRate:Se(o.nextFundingRate),fundingIntervalHours:i,fundingAprPct:s==null?null:s*(8760/i)*100,nextFundingTime:Se(o.nextFundingTime??o.fundingTime),raw:o}}catch(n){return an(n)}}async function ha(e={},t={}){let r=mr(e.instId||e.symbol||e.coin,{market:"perp",quote:e.quote||"USDT"});if(!r)return{error:"okxMarkPrice requires instId, symbol or coin"};let n=String(e.instType||"SWAP").toUpperCase();try{let o=await C(`${fr(t)}/api/v5/public/mark-price?instType=${encodeURIComponent(n)}&instId=${encodeURIComponent(r)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),i=hr(o)[0];return i?{venue:"okx",market:"perp",symbol:r,markPrice:Se(i.markPx),time:Se(i.ts),raw:i}:{error:`okx mark-price empty for ${r}`}}catch(o){return an(o)}}async function hS(e={},t={}){let r=mr(e.instId||e.symbol||e.coin,{market:"perp",quote:e.quote||"USDT"});if(!r)return{error:"okxOpenInterest requires instId, symbol or coin"};let n=String(e.instType||"SWAP").toUpperCase();try{let o=await C(`${fr(t)}/api/v5/public/open-interest?instType=${encodeURIComponent(n)}&instId=${encodeURIComponent(r)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),i=hr(o)[0];return i?{venue:"okx",market:"perp",symbol:r,openInterest:Se(i.oiCcy??i.oi),openInterestContracts:Se(i.oi),openInterestUsd:Se(i.oiUsd),time:Se(i.ts),raw:i}:{error:`okx open-interest empty for ${r}`}}catch(o){return an(o)}}var xf,kf,ba=A(()=>{j();sn();xf="https://www.okx.com",kf=8});var xa={};B(xa,{BYBIT_API:()=>Sf,BYBIT_DEFAULT_FUNDING_INTERVAL_HOURS:()=>Ef,bybitCategory:()=>Po,bybitFunding:()=>$o,bybitFundingHistory:()=>wS,bybitHealth:()=>ga,bybitMarkPrice:()=>bS,bybitOpenInterest:()=>gS,bybitOrderbook:()=>yS,bybitSymbol:()=>ln,bybitTicker:()=>wa});function cn(e={}){return(e.baseUrl||process.env.BYBIT_API_URL||Sf).replace(/\/$/,"")}function un(e){return{error:String(e.message||e).slice(0,200)}}function ce(e){if(e===""||e==null)return null;let t=Number(e);return Number.isFinite(t)?t:null}function ln(e,t="USDT"){let r=String(e||"").trim().toUpperCase().replace(/[-_/]/g,"");return r?r.endsWith(t)?r:`${r}${t}`:""}function Po(e){let t=String(e||"spot").toLowerCase();return t==="perp"||t==="linear"||t==="swap"?"linear":t==="inverse"?"inverse":"spot"}function dn(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 ga(e={}){try{let t=await C(`${cn(e)}/v5/market/time`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??1e4});return{ok:!!dn(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 Af(e,t){let r=Po(e.market),n=ln(e.symbol||e.coin,e.quote||"USDT");if(!n)return{error:"bybit requires symbol or coin"};let o=await C(`${cn(t)}/v5/market/tickers?category=${encodeURIComponent(r)}&symbol=${encodeURIComponent(n)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),i=dn(o)?.list?.[0];return i?{row:i,symbol:n,category:r}:{error:`bybit tickers empty for ${n}`}}async function wa(e={},t={}){try{let r=await Af(e,t);if(r.error)return r;let{row:n,symbol:o,category:i}=r;return{venue:"bybit",market:i==="spot"?"spot":"perp",symbol:o,price:ce(n.lastPrice),bestBid:ce(n.bid1Price),bestAsk:ce(n.ask1Price),markPrice:ce(n.markPrice),indexPrice:ce(n.indexPrice),volume24h:ce(n.volume24h),quoteVolume24h:ce(n.turnover24h),raw:n}}catch(r){return un(r)}}async function yS(e={},t={}){let r=Po(e.market),n=ln(e.symbol||e.coin,e.quote||"USDT");if(!n)return{error:"bybitOrderbook requires symbol or coin"};let o=Math.min(Math.max(Number(e.limit)||25,1),200);try{let i=await C(`${cn(t)}/v5/market/orderbook?category=${encodeURIComponent(r)}&symbol=${encodeURIComponent(n)}&limit=${o}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),s=dn(i);return s?pr({venue:"bybit",market:r==="spot"?"spot":"perp",symbol:n,bids:s.b,asks:s.a,raw:s}):{error:`bybit orderbook empty for ${n}`}}catch(i){return un(i)}}async function $o(e={},t={}){try{let r=await Af({...e,market:e.market||"perp"},t);if(r.error)return r;let{row:n,symbol:o}=r,i=Number(e.fundingIntervalHours)||Ef,s=ce(n.fundingRate);return{venue:"bybit",market:"perp",symbol:o,markPrice:ce(n.markPrice),indexPrice:ce(n.indexPrice),fundingRate:s,fundingIntervalHours:i,fundingAprPct:s==null?null:s*(8760/i)*100,nextFundingTime:ce(n.nextFundingTime),openInterest:ce(n.openInterest),raw:n}}catch(r){return un(r)}}async function bS(e={},t={}){let r=await $o(e,t);return r?.error?r:{venue:"bybit",market:"perp",symbol:r.symbol,markPrice:r.markPrice,indexPrice:r.indexPrice}}async function gS(e={},t={}){let r=ln(e.symbol||e.coin,e.quote||"USDT");if(!r)return{error:"bybitOpenInterest requires symbol or coin"};let n=Po(e.market||"perp"),o=String(e.intervalTime||"1h"),i=Math.min(Math.max(Number(e.limit)||1,1),200);try{let s=await C(`${cn(t)}/v5/market/open-interest?category=${encodeURIComponent(n)}&symbol=${encodeURIComponent(r)}&intervalTime=${encodeURIComponent(o)}&limit=${i}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),a=dn(s)?.list,c=Array.isArray(a)?a[0]:null;return c?{venue:"bybit",market:"perp",symbol:r,openInterest:ce(c.openInterest),time:ce(c.timestamp),history:(Array.isArray(a)?a:[]).map(u=>({openInterest:ce(u?.openInterest),timestamp:ce(u?.timestamp)}))}:{error:`bybit open-interest empty for ${r}`}}catch(s){return un(s)}}async function wS(e={},t={}){let r=ln(e.symbol||e.coin,e.quote||"USDT");if(!r)return{error:"bybitFundingHistory requires symbol or coin"};let n=Math.min(Math.max(Number(e.limit)||10,1),200);try{let o=await C(`${cn(t)}/v5/market/funding/history?category=linear&symbol=${encodeURIComponent(r)}&limit=${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),i=dn(o)?.list,s=Array.isArray(i)?i:[];return{venue:"bybit",symbol:r,count:s.length,history:s.map(a=>({fundingRate:ce(a?.fundingRate),fundingTime:ce(a?.fundingRateTimestamp)}))}}catch(o){return un(o)}}var Sf,Ef,ka=A(()=>{j();sn();Sf="https://api.bybit.com",Ef=8});var Nf={};B(Nf,{CEX_BASIS_VENUES:()=>qo,HL_FUNDING_INTERVAL_HOURS:()=>Sa,cexBasis:()=>Tf,cexBasisHealth:()=>AS,cexFundingSpread:()=>ES,cexVenueLegs:()=>Cf,hyperliquidPerpLeg:()=>If,hyperliquidSpotLeg:()=>_f,okxPerpLeg:()=>Of,pairwiseFundingSpreads:()=>Rf});function pn(e){return{error:String(e.message||e).slice(0,200)}}function fe(e){if(e===""||e==null)return null;let t=Number(e);return Number.isFinite(t)?t:null}function xS(e,t){return e==null||!t?null:e*(8760/t)*100}function Ea(e={}){return String(e.coin||e.symbol||"").trim().toUpperCase().replace(/[-_/]/g,"").replace(/USDT?$/,"")||""}function kS(e={}){let t=e.venues,r=Array.isArray(t)?t:typeof t=="string"&&t.trim()&&t.trim().toLowerCase()!=="all"?t.split(","):qo,n=new Set(r.map(i=>String(i).trim().toLowerCase()).filter(Boolean)),o=qo.filter(i=>n.has(i));return o.length?o:qo}async function If(e={},t={}){let r=Ea(e);if(!r)return{error:"hyperliquidPerpLeg requires coin"};try{let n=await Hc(t),o=n?.[0]?.universe,i=n?.[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()===r);if(s<0)return{error:`hyperliquid has no perp for ${r}`};let a=i[s]||{},c=fe(a.funding);return{venue:"hyperliquid",market:"perp",symbol:r,markPrice:fe(a.markPx),indexPrice:fe(a.oraclePx),midPrice:fe(a.midPx),fundingRate:c,fundingIntervalHours:Sa,fundingAprPct:xS(c,Sa),openInterest:fe(a.openInterest)}}catch(n){return pn(n)}}async function _f(e={},t={}){let r=Ea(e);if(!r)return{error:"hyperliquidSpotLeg requires coin"};try{let n=await Mc(t),o=fe(n?.[r]);return o==null?{error:`hyperliquid allMids has no entry for ${r}`}:{venue:"hyperliquid",market:"spot",symbol:r,price:o}}catch(n){return pn(n)}}async function Of(e={},t={}){let[r,n]=await Promise.all([ma(e,t).catch(pn),ha(e,t).catch(pn)]);return r?.error&&n?.error?r:{...r?.error?{venue:"okx",market:"perp",fundingError:r.error}:r,markPrice:n?.error?null:fe(n.markPrice),...n?.error?{markError:n.error}:{}}}async function xt(e,t){try{let r=await t;return[e,r&&typeof r=="object"?r:{error:"empty response"}]}catch(r){return[e,pn(r)]}}async function Cf(e={},t={}){let r=Ea(e);if(!r)return{error:"cexVenueLegs requires coin"};let n=e.quote||"USDT",o=kS(e),i=[];o.includes("binance")&&(i.push(xt("binance:perp",No({coin:r,quote:n},t))),i.push(xt("binance:spot",la({coin:r,quote:n},t)))),o.includes("okx")&&(i.push(xt("okx:perp",Of({coin:r,quote:n},t))),i.push(xt("okx:spot",fa({coin:r,quote:n,market:"spot"},t)))),o.includes("bybit")&&(i.push(xt("bybit:perp",$o({coin:r,quote:n},t))),i.push(xt("bybit:spot",wa({coin:r,quote:n,market:"spot"},t)))),o.includes("hyperliquid")&&(i.push(xt("hyperliquid:perp",If({coin:r},t))),i.push(xt("hyperliquid:spot",_f({coin:r},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:r,quote:n,venues:o,legs:a}}function vf(e){return!e||e.error?null:fe(e.price)??fe(e.mid)??null}function SS(e){return!e||e.error?null:fe(e.markPrice)??fe(e.midPrice)??null}async function Tf(e={},t={}){let r=await Cf(e,t);if(r.error)return r;let{coin:n,quote:o,venues:i,legs:s}=r,a=[];for(let m of i){let h=vf(s[m]?.spot);h!=null&&h>0&&a.push(h)}let c=[...a].sort((m,h)=>m-h),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 h=s[m]?.perp,y=s[m]?.spot,x=SS(h),E=vf(y),_=E??u,w=x!=null&&_?(x-_)/_*1e4:null;l.push({venue:m,symbol:h?.symbol??y?.symbol??n,markPrice:x,spotPrice:E,spotSource:E!=null?m:u!=null?"cross-venue-median":null,basisBps:w,fundingRate:h&&!h.error?fe(h.fundingRate):null,fundingIntervalHours:h&&!h.error?fe(h.fundingIntervalHours):null,fundingAprPct:h&&!h.error?fe(h.fundingAprPct):null,openInterest:h&&!h.error?fe(h.openInterest):null,errors:[h?.error,y?.error].filter(Boolean)})}let d=Rf(l),p=l.filter(m=>m.markPrice!=null),f=l.filter(m=>m.basisBps!=null);return{coin:n,quote:o,referenceSpot:u,asOf:new Date().toISOString(),venues:l,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 Rf(e=[]){let t=e.filter(n=>fe(n?.fundingAprPct)!=null),r=[];for(let n=0;n<t.length;n++)for(let o=n+1;o<t.length;o++){let i=t[n],s=t[o],a=i.fundingAprPct-s.fundingAprPct,c=a>0?s.venue:i.venue,u=a>0?i.venue:s.venue;r.push({pair:`${i.venue}/${s.venue}`,aprSpreadPct:Math.abs(a),signedAprSpreadPct:a,longVenue:c,shortVenue:u})}return r.sort((n,o)=>o.aprSpreadPct-n.aprSpreadPct)}async function ES(e={},t={}){let r=await Tf(e,t);return r.error?r:{coin:r.coin,asOf:r.asOf,venues:r.venues.map(n=>({venue:n.venue,symbol:n.symbol,fundingRate:n.fundingRate,fundingIntervalHours:n.fundingIntervalHours,fundingAprPct:n.fundingAprPct,errors:n.errors})),fundingSpreads:r.fundingSpreads,widestFundingSpread:r.widestFundingSpread,execution:"read-only",exec:!1}}async function AS(e={}){try{let t=await Promise.all([ua(e).catch(()=>({ok:!1})),pa(e).catch(()=>({ok:!1})),ga(e).catch(()=>({ok:!1}))]),r={binance:!!t[0]?.ok,okx:!!t[1]?.ok,bybit:!!t[2]?.ok};return{ok:Object.values(r).some(Boolean),provider:"cex-basis",upstream:r,execution:"read-only",exec:!1}}catch(t){return{ok:!1,provider:"cex-basis",error:String(t.message||t).slice(0,160)}}}var qo,Sa,Pf=A(()=>{sn();ba();ka();Nn();qo=["binance","okx","bybit","hyperliquid"],Sa=1});var $f={};B($f,{compoundHealth:()=>_S,compoundMarkets:()=>IS});async function IS(e={}){try{return((await C(`${vS}/ctoken`,e))?.cToken||[]).map(r=>({symbol:r?.symbol,underlying:r?.underlying_symbol,supplyApy:r?.supply_rate?.value?`${(Number(r.supply_rate.value)*100).toFixed(2)}%`:null,borrowApy:r?.borrow_rate?.value?`${(Number(r.borrow_rate.value)*100).toFixed(2)}%`:null,totalSupply:r?.total_supply?.value,totalBorrow:r?.total_borrows?.value,collateralFactor:r?.collateral_factor?.value?`${(Number(r.collateral_factor.value)*100).toFixed(0)}%`:null}))}catch(t){return{error:String(t.message||t).slice(0,200)}}}async function _S(){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 vS,qf=A(()=>{j();vS="https://api.compound.finance/api/v2"});var Lf={};B(Lf,{yearnHealth:()=>TS,yearnVaults:()=>CS});async function CS(e={}){try{return(await C(`${OS}/vaults/all`,e)||[]).map(r=>({name:r?.name,symbol:r?.symbol,apy:r?.apy?.net_apy?`${(Number(r.apy.net_apy)*100).toFixed(2)}%`:null,tvl:r?.tvl?.tvl_deposited,chain:r?.chainId,type:r?.type||"v2"}))}catch(t){return{error:String(t.message||t).slice(0,200)}}}async function TS(){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 OS,Uf=A(()=>{j();OS="https://api.yearn.fi/v1"});var Bf={};B(Bf,{convexHealth:()=>PS,convexPools:()=>NS});async function NS(e={}){try{return(await C(`${RS}/pools`,e)||[]).map(r=>({name:r?.curvePool?.name||r?.name,curveApy:r?.curvePool?.apy?`${(Number(r.curvePool.apy)*100).toFixed(2)}%`:null,convexApy:r?.apy?`${(Number(r.apy)*100).toFixed(2)}%`:null,tvl:r?.tvl,boosted:r?.boosted||!1}))}catch(t){return{error:String(t.message||t).slice(0,200)}}}async function PS(){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 RS,Ff=A(()=>{j();RS="https://api.convexfinance.com/api"});function Lt(e){if(!Number.isSafeInteger(e)||e<0||e>1e3)throw new RangeError("scale must be a safe integer from 0 through 1000")}function tt(e,t){if(typeof e!="bigint")throw new TypeError("mantissa must be a bigint");return Lt(t),Object.freeze({mantissa:e,scale:t})}function kt(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`);Lt(e.scale)}function Lo(e){return Lt(e),10n**BigInt(e)}function D(e){if(typeof e!="string"||!/^[+-]?\d+(?:\.\d+)?$/.test(e))throw new TypeError("value must be a plain decimal string");let t=e.startsWith("-"),r=e[0]==="-"||e[0]==="+"?e.slice(1):e,[n,o=""]=r.split("."),i=`${n}${o}`,s=BigInt(i)*(t?-1n:1n);return tt(s,o.length)}function Ee(e,t){if(Lt(t),typeof e=="bigint")return tt(e,t);if(typeof e!="string"||!/^[+-]?\d+$/.test(e))throw new TypeError("value must be an integer string or bigint");return tt(BigInt(e),t)}function Me(e){kt(e);let t=e.mantissa<0n,r=(t?-e.mantissa:e.mantissa).toString();if(e.scale===0)return`${t?"-":""}${r}`;let n=r.padStart(e.scale+1,"0"),o=n.length-e.scale;return`${t?"-":""}${n.slice(0,o)}.${n.slice(o)}`}function fn(e,t){return kt(e),Lt(t),t===e.scale?tt(e.mantissa,e.scale):t>e.scale?tt(e.mantissa*Lo(t-e.scale),t):tt(e.mantissa/Lo(e.scale-t),t)}function Aa(e,t){kt(e,"left"),kt(t,"right");let r=Math.max(e.scale,t.scale);return[fn(e,r),fn(t,r),r]}function St(e,t){let[r,n,o]=Aa(e,t);return tt(r.mantissa+n.mantissa,o)}function mn(e,t){let[r,n,o]=Aa(e,t);return tt(r.mantissa-n.mantissa,o)}function Te(e,t){kt(e,"left"),kt(t,"right");let r=e.scale+t.scale;return Lt(r),tt(e.mantissa*t.mantissa,r)}function je(e,t,r=Math.max(e?.scale??0,t?.scale??0)){if(kt(e,"left"),kt(t,"right"),Lt(r),t.mantissa===0n)throw new RangeError("division by zero");let n=e.mantissa*Lo(t.scale+r),o=t.mantissa*Lo(e.scale);return tt(n/o,r)}function Et(e,t){let[r,n]=Aa(e,t);return r.mantissa<n.mantissa?-1:r.mantissa>n.mantissa?1:0}var DT,$e=A(()=>{DT=Object.freeze({mantissa:10000n,scale:0})});import{existsSync as Mf,readFileSync as $S}from"node:fs";import{dirname as Df,join as va}from"node:path";import{fileURLToPath as qS}from"node:url";function LS(e){let t=Df(qS(e));for(let r=0;r<8;r+=1){let n=va(t,"package.json");if(Mf(n))try{let i=JSON.parse($S(n,"utf8"));if(i&&typeof i.version=="string")return t}catch{}let o=Df(t);if(o===t)break;t=o}throw new Error(`oracle: could not resolve package root from ${e}`)}function jf(e,t){let r=LS(t),n=va(r,e);return Mf(n)?n:va(r,"dist","assets",e)}var Hf=A(()=>{});import{readFileSync as US,existsSync as BS}from"node:fs";import{fileURLToPath as FS}from"node:url";import{dirname as DS,join as Vf}from"node:path";function jS(){try{let e=jf("equities-fixtures",import.meta.url);if(e&&BS(e))return e}catch{}return MS}function zS(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function W(e,t){throw new TypeError(`Fixture fixtures/${e}: ${t}`)}function oe(e,t,r){zS(e)||W(t,`${r} must be an object`)}function G(e,t,r){(typeof e!="string"||e.length===0)&&W(t,`${r} must be a nonempty string`)}function rt(e,t,r){Number.isSafeInteger(e)||W(t,`${r} must be a safe integer`)}function At(e,t,r){oe(e,t,r);for(let[n,o]of Object.entries(e))G(n,t,`${r} key`),oe(o,t,`${r}.${n}`)}function VS(e,t){oe(e,t,"root"),rt(e.capturedAt,t,"capturedAt"),oe(e.venues,t,"venues");let r=[["hyperliquid_hip3","dexs"],["arcus","markets"],["arcus_spot","pairs"],["rh_uniswap","pools"],["rh_chainlink_oracles","assets"]];for(let[n,o]of r){let i=e.venues[n];oe(i,t,`venues.${n}`),G(i.type,t,`venues.${n}.type`),G(i.chain,t,`venues.${n}.chain`),G(i.tier,t,`venues.${n}.tier`),At(i[o],t,`venues.${n}.${o}`)}for(let[n,o]of Object.entries(e.venues.hyperliquid_hip3.dexs))At(o,t,`venues.hyperliquid_hip3.dexs.${n}`)}function WS(e,t){At(e,t,"root"),Object.keys(e).length===0&&W(t,"root must not be empty");for(let[r,n]of Object.entries(e))Array.isArray(n.venues)||W(t,`${r}.venues must be an array`),n.venues.forEach((o,i)=>G(o,t,`${r}.venues[${i}]`))}function GS(e,t){oe(e,t,"root");for(let r of["chainId","block","oracleScaleExp","usdgDecimals","equityDecimals"])rt(e[r],t,r);G(e.usdg,t,"usdg"),At(e.assets,t,"assets");for(let[r,n]of Object.entries(e.assets))G(n.oracle,t,`assets.${r}.oracle`),G(n.token,t,`assets.${r}.token`),(typeof n.rawPrice!="string"||!/^\d+$/.test(n.rawPrice))&&W(t,`assets.${r}.rawPrice must be an integer string`),(typeof n.usd!="number"||!Number.isFinite(n.usd)||n.usd<0)&&W(t,`assets.${r}.usd must be a nonnegative finite source number`)}function KS(e,t){oe(e,t,"root");for(let n of["holidayDayIndex","names","dates"])Array.isArray(e[n])||W(t,`${n} must be an array`);let r=e.holidayDayIndex.length;(e.names.length!==r||e.dates.length!==r)&&W(t,"holidayDayIndex, names, and dates must have equal lengths"),e.holidayDayIndex.forEach((n,o)=>rt(n,t,`holidayDayIndex[${o}]`)),e.names.forEach((n,o)=>G(n,t,`names[${o}]`)),e.dates.forEach((n,o)=>{(typeof n!="string"||!/^\d{4}-\d{2}-\d{2}$/.test(n))&&W(t,`dates[${o}] must use YYYY-MM-DD`)})}function XS(e,t){oe(e,t,"root"),(!Array.isArray(e.dstTransitions)||e.dstTransitions.length===0)&&W(t,"dstTransitions must be a nonempty array");let r=new Set;e.dstTransitions.forEach((n,o)=>{oe(n,t,`dstTransitions[${o}]`);for(let i of["year","startUtc","endUtc"])rt(n[i],t,`dstTransitions[${o}].${i}`);n.startUtc>=n.endUtc&&W(t,`dstTransitions[${o}] startUtc must be before endUtc`),r.has(n.year)&&W(t,`dstTransitions contains duplicate year ${n.year}`),r.add(n.year)})}function YS(e,t){At(e,t,"root"),Object.keys(e).length===0&&W(t,"root must not be empty");for(let[r,n]of Object.entries(e)){for(let o of["addr","quote","quoteAddr","dex","pair"])G(n[o],t,`${r}.${o}`);(typeof n.liq!="number"||!Number.isFinite(n.liq)||n.liq<0)&&W(t,`${r}.liq must be a nonnegative finite source number`)}}function JS(e,t){oe(e,t,"root"),rt(e.capturedAt,t,"capturedAt"),rt(e.block,t,"block"),rt(e.chainId,t,"chainId"),G(e.gasPriceWei,t,"gasPriceWei"),G(e.stateView,t,"stateView"),At(e.pools,t,"pools"),Object.keys(e.pools).length===0&&W(t,"pools must not be empty");for(let[r,n]of Object.entries(e.pools)){for(let o of["pair","version","quote","token","sqrtPriceX96"])G(n[o],t,`pools.${r}.${o}`);n.version!=="v3"&&n.version!=="v4"&&W(t,`pools.${r}.version must be v3 or v4`),typeof n.quoteIsToken0!="boolean"&&W(t,`pools.${r}.quoteIsToken0 must be a boolean`),(!/^[0-9]+$/.test(n.sqrtPriceX96)||BigInt(n.sqrtPriceX96)<=0n)&&W(t,`pools.${r}.sqrtPriceX96 must be a positive integer string`)}}function QS(e,t){oe(e,t,"root"),rt(e.capturedAt,t,"capturedAt"),G(e.source,t,"source"),oe(e.books,t,"books"),Object.keys(e.books).length===0&&W(t,"books must not be empty");for(let[r,n]of Object.entries(e.books)){oe(n,t,`books.${r}`),(!Array.isArray(n.bids)||!Array.isArray(n.asks))&&W(t,`books.${r} must have bids and asks arrays`);for(let[o,i]of n.bids.entries())oe(i,t,`books.${r}.bids[${o}]`),G(i.px,t,`books.${r}.bids[${o}].px`),G(i.sz,t,`books.${r}.bids[${o}].sz`);for(let[o,i]of n.asks.entries())oe(i,t,`books.${r}.asks[${o}]`),G(i.px,t,`books.${r}.asks[${o}].px`),G(i.sz,t,`books.${r}.asks[${o}].sz`)}}function ZS(e,t){oe(e,t,"root"),rt(e.capturedAt,t,"capturedAt"),G(e.source,t,"source"),G(e.chain,t,"chain"),At(e.tokens,t,"tokens"),oe(e.pairs,t,"pairs"),Object.keys(e.tokens).length===0&&W(t,"tokens must not be empty");for(let[r,n]of Object.entries(e.tokens)){G(n.symbolRaw,t,`tokens.${r}.symbolRaw`),G(n.mint,t,`tokens.${r}.mint`),Object.hasOwn(e.pairs,r)||W(t,`pairs.${r} is required for token ${r}`),(!Array.isArray(e.pairs[r])||e.pairs[r].length===0)&&W(t,`pairs.${r} must be a nonempty array`);for(let[o,i]of e.pairs[r].entries())oe(i,t,`pairs.${r}[${o}]`),G(i.pairAddress,t,`pairs.${r}[${o}].pairAddress`),G(i.dexId,t,`pairs.${r}[${o}].dexId`),(typeof i.priceUsd!="number"||!Number.isFinite(i.priceUsd)||i.priceUsd<=0)&&W(t,`pairs.${r}[${o}].priceUsd must be a positive finite number`),(typeof i.liquidityUsd!="number"||!Number.isFinite(i.liquidityUsd)||i.liquidityUsd<0)&&W(t,`pairs.${r}[${o}].liquidityUsd must be a nonnegative finite number`)}}function eE(e,t){oe(e,t,"root"),rt(e.capturedAt,t,"capturedAt"),G(e.source,t,"source"),G(e.chain,t,"chain"),e.chain!=="ton"&&W(t,'chain must be "ton"'),At(e.tokens,t,"tokens"),oe(e.pairs,t,"pairs"),Object.keys(e.tokens).length===0&&W(t,"tokens must not be empty");for(let[r,n]of Object.entries(e.tokens)){G(n.symbolRaw,t,`tokens.${r}.symbolRaw`),G(n.mint,t,`tokens.${r}.mint`),Object.hasOwn(e.pairs,r)||W(t,`pairs.${r} is required for token ${r}`),(!Array.isArray(e.pairs[r])||e.pairs[r].length===0)&&W(t,`pairs.${r} must be a nonempty array`);for(let[o,i]of e.pairs[r].entries())oe(i,t,`pairs.${r}[${o}]`),G(i.pairAddress,t,`pairs.${r}[${o}].pairAddress`),G(i.dexId,t,`pairs.${r}[${o}].dexId`),(typeof i.priceUsd!="number"||!Number.isFinite(i.priceUsd)||i.priceUsd<=0)&&W(t,`pairs.${r}[${o}].priceUsd must be a positive finite number`),(typeof i.liquidityUsd!="number"||!Number.isFinite(i.liquidityUsd)||i.liquidityUsd<0)&&W(t,`pairs.${r}[${o}].liquidityUsd must be a nonnegative finite number`)}}function rE(e,t){let r=Wf[t],n=Vf(e,r),o;try{o=US(n,"utf8")}catch(s){throw s?.code==="ENOENT"?new Error(`Fixture fixtures/${r} is missing at ${n}`):new Error(`Fixture fixtures/${r} could not be read: ${s.message}`)}let i;try{i=JSON.parse(o)}catch(s){throw new SyntaxError(`Fixture fixtures/${r} contains invalid JSON: ${s.message}`)}return tE[t](i,r),i}function Gf(e){if(e!==null&&typeof e=="object"&&!Object.isFrozen(e)){Object.freeze(e);for(let t of Object.values(e))Gf(t)}return e}function Ia({fixtureDir:e=HS}={}){if(typeof e!="string"||e.length===0)throw new TypeError("fixtureDir must be a nonempty path string");let t={};for(let r of Object.keys(Wf))t[r]=rE(e,r);return Gf(t)}function dt(){return zf??=Ia(),zf}function Re(){return dt().venues}function Kf(){return dt().universe}function Xf(){return dt().oracles}function Yf(){return dt().nyseHolidays}function Jf(){return dt().dstTransitions}function Uo(){return dt().rhPoolState}function Qf(){return dt().solanaXstocks}function Zf(){return dt().tonXstocks}function em(){return dt().hip3L2Books}var MS,HS,Wf,tE,zf,He=A(()=>{Hf();MS=Vf(DS(FS(import.meta.url)),"fixtures");HS=jS(),Wf=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"});tE=Object.freeze({venues:VS,universe:WS,oracles:GS,nyseHolidays:KS,dstTransitions:XS,equityDexPools:YS,rhPoolState:JS,solanaXstocks:ZS,tonXstocks:eE,hip3L2Books:QS})});function iE(){let e=Jf().dstTransitions.map(n=>({year:n.year,startMs:n.startUtc*Oa,endMs:n.endUtc*Oa}));e.sort((n,o)=>n.startMs-o.startMs);let t=e[0].year,r=e[e.length-1].year;return Object.freeze({rows:Object.freeze(e),firstYear:t,lastYear:r,coverageStartMs:Date.UTC(t,0,1),coverageEndMs:Date.UTC(r+1,0,1)})}function cm(){return rm??=iE(),rm}function sE(){return _a===void 0&&(_a=new Set(Yf().holidayDayIndex)),_a}function um(e,t){if(!Number.isSafeInteger(e))throw new TypeError(`${t}: epochMs must be a safe integer number of milliseconds`)}function aE(e,t){let{coverageStartMs:r,coverageEndMs:n,firstYear:o,lastYear:i}=cm();if(e<r||e>=n)throw new RangeError(`${t}: ${new Date(e).toISOString()} is outside DST fixture coverage (${o} through ${i}). Refusing to assume a UTC offset.`)}function cE(e){for(let t of cm().rows)if(e>=t.startMs&&e<t.endMs)return!0;return!1}function uE(e){return cE(e)?oE:nE}function lE(e){let t=e+uE(e),r=Math.floor(t/tm),n=t-r*tm,o=new Date(t);return{dayIndex:r,minuteOfDay:Math.floor(n/nm),msIntoDay:n,weekday:o.getUTCDay()}}function dE({dayIndex:e,weekday:t}){return t===0||t===6?!1:!sE().has(e)}function pE(e){return e<om?"dark":e<im?"extended":e<sm?"core":e<am?"extended":"dark"}function hn(e){um(e,"sessionState"),aE(e,"sessionState");let t=lE(e);return dE(t)?pE(t.minuteOfDay):"dark"}function Ta(e){return um(e,"isDark"),hn(e)==="dark"}var Oa,nm,Ca,tm,nE,oE,om,im,sm,am,QT,ZT,rm,_a,Bo=A(()=>{He();Oa=1e3,nm=60*Oa,Ca=60*nm,tm=24*Ca,nE=-5*Ca,oE=-4*Ca,om=240,im=570,sm=960,am=1200,QT=Object.freeze([om,im,sm,am]),ZT=Object.freeze(["core","extended","dark"])});function Do(e,t){e.push(Object.freeze({venue:t.venue,symbol:t.symbol??null,reason:t.reason,evidence:t.evidence??null}))}function hE(e){let t=e.raw?.vol24h;return!!(t===0||t===0||typeof t=="number"&&Number.isFinite(t)&&t<=0)}function yE(e){return!e.bid||!e.ask?!1:Et(e.bid,e.ask)>0}function lm(e,t,r){return Number.isSafeInteger(e.capturedAt)?t-e.capturedAt>r:!1}function Mo(e,t={}){if(!Array.isArray(e))throw new TypeError("quotes must be an array");let r=t.nowMs??Date.now(),n=t.quoteFreshnessMs??fE,o=t.oracleFreshnessMs??mE,i=t.includeDormant===!0,s=[],a=[];for(let c of e){if(hE(c)){i?s.push(Object.freeze({...c,staleData:!0})):Do(a,{venue:c.venue,symbol:c.symbolRaw??c.symbol,reason:Fo.DORMANT_VENUE,evidence:{vol24h:c.raw?.vol24h??null}});continue}if(yE(c)){Do(a,{venue:c.venue,symbol:c.symbolRaw??c.symbol,reason:Fo.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(lm(c,r,n)){Do(a,{venue:c.venue,symbol:c.symbolRaw??c.symbol,reason:Fo.STALE_QUOTE,evidence:{capturedAt:c.capturedAt,nowMs:r,ageMs:r-c.capturedAt,freshnessMs:n}});continue}if(c.tier==="read-only"&&c.raw?.oracleRaw!==void 0){let u=hn(r),l=u==="core"?o:o*2;if(lm(c,r,l)){Do(a,{venue:c.venue,symbol:c.symbolRaw??c.symbol,reason:Fo.STALE_ORACLE,evidence:{capturedAt:c.capturedAt,nowMs:r,session:u}});continue}}s.push(c)}return{survivors:s,excluded:a}}var Fo,fE,mE,Ra=A(()=>{$e();Bo();Fo=Object.freeze({DORMANT_VENUE:"dormant-venue",CROSSED_BOOK:"crossed-book",STALE_QUOTE:"stale-quote",STALE_ORACLE:"stale-oracle"}),fE=12e4,mE=6e5});function bE(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[r,n]=t.split(/[eE]/),o=Number(n),i=r.startsWith("-"),s=i?r.slice(1):r,[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 de(e){return e==null?null:typeof e=="string"?D(e):typeof e!="number"||!Number.isFinite(e)?null:D(bE(e))}function ze(e,t){let r=de(e);if(r===null)throw new TypeError(`${t} must be a finite source number`);return r}var Ut=A(()=>{$e()});function Z(e,t){throw new TypeError(`${e} ${t}`)}function fm(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function Bt(e,t){fm(e)||Z(t,"must be an object")}function mm(e,t,r){Object.hasOwn(e,t)||Z(`${r}.${t}`,"is required")}function yr(e,t){(typeof e!="string"||e.length===0)&&Z(t,"must be a nonempty string")}function yn(e,t,r){t.has(e)||Z(r,`must be one of ${[...t].join(", ")}`)}function Pa(e,t){(!Number.isSafeInteger(e)||e<0)&&Z(t,"must be a nonnegative safe integer")}function Na(e,t,r=!1){e===null&&r||(fm(e)||Z(t,"must be a fixed point value"),typeof e.mantissa!="bigint"&&Z(`${t}.mantissa`,"must be a bigint"),(!Number.isSafeInteger(e.scale)||e.scale<0)&&Z(`${t}.scale`,"must be a nonnegative safe integer"))}function jo(e,t,r=!1){e===null&&r||Bt(e,t)}function pm(e,t){Bt(e,t),yr(e.venue,`${t}.venue`),yr(e.reason,`${t}.reason`),AE.test(e.reason)||Z(`${t}.reason`,"must be a machine readable lower case code"),Object.hasOwn(e,"symbol")&&e.symbol!==null&&yr(e.symbol,`${t}.symbol`)}function Ae(e){Bt(e,"quote");for(let r of["venue","chain","instrument","tier","symbolRaw","symbol","side","requestedSize",...dm,"costAccounted","capturedAt","blockOrSeq","raw"])mm(e,r,"quote");yr(e.venue,"quote.venue"),!(typeof e.chain=="string"&&e.chain.length>0)&&!(Number.isSafeInteger(e.chain)&&e.chain>=0)&&Z("quote.chain","must be a nonempty string or nonnegative chain id"),yn(e.instrument,gE,"quote.instrument"),yn(e.tier,wE,"quote.tier"),yr(e.symbolRaw,"quote.symbolRaw"),yr(e.symbol,"quote.symbol"),yn(e.side,xE,"quote.side"),Na(e.requestedSize,"quote.requestedSize"),e.requestedSize.mantissa<0n&&Z("quote.requestedSize","must not be negative");let t=0;for(let r of EE)Object.hasOwn(e,r)&&(Na(e[r],`quote.${r}`),t+=1);t===0&&Z("quote","must contain at least one of bid, ask, mid, mark");for(let r of dm)Na(e[r],`quote.${r}`,!0);if(typeof e.costAccounted!="boolean"&&Z("quote.costAccounted","must be a boolean"),e.costAccounted){for(let r of["fees","gasEstimate","priceImpact"])e[r]===null&&Z(`quote.${r}`,"cannot be unknown when costAccounted is true");e.instrument==="perp"&&e.fundingHourly===null&&Z("quote.fundingHourly","cannot be unknown when costAccounted is true for a perp")}return e.instrument==="spot"&&e.fundingHourly!==null&&Z("quote.fundingHourly","must be null for a spot quote"),Pa(e.capturedAt,"quote.capturedAt"),e.blockOrSeq!==null&&!(typeof e.blockOrSeq=="string"&&e.blockOrSeq.length>0)&&!(Number.isSafeInteger(e.blockOrSeq)&&e.blockOrSeq>=0)&&Z("quote.blockOrSeq","must be null, a nonempty string, or a nonnegative safe integer"),Bt(e.raw,"quote.raw"),e}function Ho(e){Bt(e,"rankResult");for(let t of["rankedOn","ranked","winner","runnersUp","improvementBps","sourcesAnswered","sourcesTried","failed","excluded","darkWindow","instrumentMix","bestPreparable"])mm(e,t,"rankResult");return yn(e.rankedOn,kE,"rankResult.rankedOn"),Array.isArray(e.ranked)||Z("rankResult.ranked","must be an array"),e.ranked.forEach((t,r)=>jo(t,`rankResult.ranked[${r}]`)),jo(e.winner,"rankResult.winner",!0),e.ranked.length===0&&e.winner!==null&&Z("rankResult.winner","must be null when ranked is empty"),e.ranked.length>0&&e.winner===null&&Z("rankResult.winner","must be present when ranked is not empty"),Array.isArray(e.runnersUp)||Z("rankResult.runnersUp","must be an array"),e.runnersUp.forEach((t,r)=>jo(t,`rankResult.runnersUp[${r}]`)),e.improvementBps!==null&&!(typeof e.improvementBps=="number"&&Number.isFinite(e.improvementBps))&&Z("rankResult.improvementBps","must be a finite number or null"),Pa(e.sourcesAnswered,"rankResult.sourcesAnswered"),Pa(e.sourcesTried,"rankResult.sourcesTried"),e.sourcesAnswered>e.sourcesTried&&Z("rankResult.sourcesAnswered","must not exceed sourcesTried"),Array.isArray(e.failed)||Z("rankResult.failed","must be an array"),e.failed.forEach((t,r)=>pm(t,`failed[${r}]`)),Array.isArray(e.excluded)||Z("rankResult.excluded","must be an array"),e.excluded.forEach((t,r)=>pm(t,`excluded[${r}]`)),e.darkWindow!==null&&Bt(e.darkWindow,"rankResult.darkWindow"),yn(e.instrumentMix,SE,"rankResult.instrumentMix"),jo(e.bestPreparable,"rankResult.bestPreparable",!0),Object.hasOwn(e,"carry")&&e.carry!==null&&Bt(e.carry,"rankResult.carry"),e}var gE,wE,xE,kE,SE,EE,dm,AE,pt=A(()=>{gE=new Set(["spot","perp"]),wE=new Set(["read-only","quote-only","prepare","intent"]),xE=new Set(["buy","sell"]),kE=new Set(["net-of-cost","gross"]),SE=new Set(["homogeneous","heterogeneous"]),EE=["bid","ask","mid","mark"],dm=["fees","gasEstimate","priceImpact","fundingHourly"],AE=/^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$/});function hm(){return Re().venues.arcus}function OE(){return Object.keys(hm().markets).sort()}function CE({symbol:e,side:t="buy",sizeUsd:r=null}={}){if(typeof e!="string"||e.length===0)return null;let n=e.endsWith("-USD")?e.slice(0,-4):e,o=hm().markets[n];if(!o)return null;let i=ze(o.mark,`${n}.mark`),s=de(o.oracle),a=de(o.fundingHourly),c=r===null?D("0"):r,u={venue:vE,chain:IE,instrument:"perp",tier:_E,symbolRaw:e,symbol:n,side:t,requestedSize:c,mark:i,fees:null,gasEstimate:null,priceImpact:null,fundingHourly:a,costAccounted:!1,capturedAt:Re().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:zo,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),Ae(u)}function Vo({side:e="buy",sizeUsd:t=null}={}){return OE().map(r=>CE({symbol:r,side:e,sizeUsd:t})).filter(r=>r!==null)}var vE,IE,_E,zo,$a=A(()=>{He();Ut();$e();pt();vE="arcus_perp",IE="robinhood-4663",_E="quote-only",zo="0.00000480324074074"});function qa(e,t,r=8){if(e==null)throw new TypeError("hourlyFundingRate is required");if(!Number.isFinite(t)||t<0)throw new RangeError("horizonHours must be a nonnegative finite number");if(t===0)return D("0");let n=D(String(t)),o=Ee(10000n,0);return Te(Te(e,n),o)}function bm(e,t,r={}){if(e.instrument!=="perp")return{model:"current-funding-held-constant",horizonHours:t,carryBps:D("0"),carryBpsDisplay:"0",confidence:"estimate",note:"spot has no funding carry"};let n=r.nowMs??Date.now(),o=r.applyDarkWindowLock===!0,i=e.fundingHourly;if(o&&i!==null){let a=TE(n,t),c=t-a,u=D(zo),l=qa(i,c),d=qa(u,a),p=Math.max(l.scale,d.scale),f={mantissa:l.mantissa*10n**BigInt(p-l.scale)+d.mantissa*10n**BigInt(p-d.scale),scale:p};return{model:"current-funding-held-constant",horizonHours:t,carryBps:f,carryBpsDisplay:Me(f),confidence:"estimate",darkHours:a,litHours:c,darkWindowRate:zo,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=qa(i,t);return{model:"current-funding-held-constant",horizonHours:t,carryBps:s,carryBpsDisplay:Me(s),confidence:"estimate",compounding:"ignored",compoundingErrorBoundNote:"simple sum; at 30d and 1e-5/h the ignored compound is under 0.5bp"}}function TE(e,t){if(t<=0)return 0;let r=0,n=Math.floor(t);for(let o=0;o<n;o+=1)Ta(e+o*ym)&&(r+=1);return t>n&&Ta(e+n*ym)&&(r+=t-n),r}var ym,y2,gm=A(()=>{$e();$a();Bo();ym=36e5,y2=24*365});function RE(e){return e.mid??e.mark??e.ask??e.bid??null}function NE(e){let t=RE(e);if(t===null)return null;let r=e.costAccounted===!0,n=D("0");e.fees!==null?n=St(n,e.fees):r=!1,e.priceImpact!==null?n=St(n,e.priceImpact):e.requestedSize&&e.requestedSize.mantissa>0n&&(r=!1),e.gasEstimate===null?r=!1:n=St(n,e.gasEstimate);let o;if(e.fees!==null&&Et(e.fees,D("1"))<0&&Et(e.fees,D("0"))>=0){let i=St(D("1"),e.fees);o=Te(t,i),e.priceImpact!==null&&(o=St(o,Te(t,e.priceImpact)))}else o=St(t,n);return{net:o,costAccounted:r,px:t}}function PE(e,t,r=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:r,quote:e}}function $E(e,t){if(!e||!t||!e.costAccounted||!t.costAccounted||e.instrument!==t.instrument||e.net.mantissa===0n)return null;let r=mn(t.net,e.net);return je(Te(r,Ee(10000n,0)),t.net,4)}function Wo(e,t={}){if(!Array.isArray(e))throw new TypeError("quotes must be an array");let r=t.nowMs??e[0]?.capturedAt??Date.now(),n=e.length,o=e,i=[];if(!t.skipLiveness){let g=Mo(e,{nowMs:r});o=g.survivors,i=g.excluded}let s=e.length,a=[],c=t.horizonHours,u=Number.isFinite(c)&&c>0,l=[];for(let g of o){let b=NE(g);if(b===null)continue;let S=null;if(u&&g.instrument==="perp"&&(S=bm(g,c,{nowMs:r}),S.carryBps!==null)){let k=St(D("1"),je(S.carryBps,Ee(10000n,0),12));b.net=Te(b.net,k),b.costAccounted=!1}l.push(PE(g,b,S))}let d=l,p="homogeneous";if(u)p="heterogeneous",d=l;else{let g=l.filter(S=>S.instrument==="spot"),b=l.filter(S=>S.instrument==="perp");g.length>0&&b.length>0?(d=g.length>=b.length?g:b,p="homogeneous"):(d=l,p="homogeneous")}d.sort((g,b)=>{let S=Et(g.net,b.net);return S!==0?S:g.venue<b.venue?-1:g.venue>b.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 x=m.length===0?null:$E(f,m[0]),E=l.find(g=>g.tier==="prepare")??null,_=hn(r),w=_==="core"?null:{session:_,warning:_==="dark"?"market is dark; marks are not real price discovery":"extended session; thinner books and higher staleness risk"},O=null;u&&(O=qE(l));let v={rankedOn:y,ranked:h,winner:f,runnersUp:m,improvementBps:x===null?null:Number(Me(x)),sourcesAnswered:s,sourcesTried:n,failed:a,excluded:i,darkWindow:w,instrumentMix:p,bestPreparable:E,carry:f?.carry??null,breakEvenHorizonHours:O};return Ho(v)}function qE(e){let t=e.filter(i=>i.instrument==="spot").sort((i,s)=>Et(i.net,s.net))[0],r=e.filter(i=>i.instrument==="perp").sort((i,s)=>Et(i.net,s.net))[0];if(!t||!r||r.fundingHourly===null)return null;let n=mn(t.net,r.net);if(n.mantissa===0n)return 0;let o=Te(r.fundingHourly,r.price);if(o.mantissa===0n)return null;try{let i=je(n,o,4),s=Number(Me(i));return!Number.isFinite(s)||s<0?null:s}catch{return null}}var La=A(()=>{Ra();gm();Bo();$e();pt()});function Ua(){return Uo()}function ME(e){return{mantissa:e*e*10n**BigInt(br)/FE,scale:br}}function jE(e){let t=ME(BigInt(e.sqrtPriceX96)),r=e.quote==="USDG"?6:18,n=18;if(e.quoteIsToken0){let o=je(Te(t,Ee(10n**BigInt(r),0)),Ee(10n**BigInt(n),0),br);return o.mantissa===0n?null:je(D("1"),o,br)}return je(Te(t,Ee(10n**BigInt(n),0)),Ee(10n**BigInt(r),0),br)}function HE(e){let t=Xf(),r=t.assets[e];return r?Ee(r.rawPrice,t.oracleScaleExp):null}function zE(e,t){if(e===null||t===null||e.mantissa<=0n||t.mantissa<=0n)return null;let r={...e};return je(t,VE(r,t),br)}function VE(e,t){let r=Math.max(e.scale,t.scale);return{mantissa:fn(e,r).mantissa+fn(t,r).mantissa,scale:r}}function WE(e){let t=Ua(),r=DE[e];return r?{wei:BigInt(t.gasPriceWei)*r,units:r,native:"ETH"}:null}function Ba(){return Object.keys(Ua().pools).sort()}function gr({symbol:e,side:t="buy",sizeUsd:r=null}={}){if(typeof e!="string"||e.length===0)throw new TypeError("symbol must be a nonempty string");let n=Ua(),o=n.pools[e];if(!o)return null;let i=jE(o);if(i===null)return null;let s=de(o.liqUsd),a=r===null?D("0"):r,c=o.feePpm===null||o.feePpm===void 0?null:je(Ee(BigInt(o.feePpm),0),Ee(1000000n,0),8),u=a.mantissa===0n?D("0"):zE(s,a),l=WE(o.version),f={venue:LE,chain:UE,instrument:"spot",tier:BE,symbolRaw:e,symbol:e,side:t,requestedSize:a,mid:i,fees:c,gasEstimate:null,priceImpact:u,fundingHourly:null,costAccounted:!1,capturedAt:n.capturedAt*1e3,blockOrSeq:n.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=HE(e);return m!==null&&(f.referencePrice=m,f.referenceBasisBps=Me(je(Te(mn(i,m),Ee(10000n,0)),m,4))),Ae(f)}function wm({side:e="buy",sizeUsd:t=null}={}){return Ba().map(r=>gr({symbol:r,side:e,sizeUsd:t})).filter(r=>r!==null)}var LE,UE,BE,FE,br,DE,Fa=A(()=>{He();Ut();$e();pt();LE="rh_uniswap",UE=4663,BE="prepare",FE=1n<<192n,br=18,DE=Object.freeze({v3:180000n,v4:240000n})});function Go(e={}){let{symbol:t,side:r="buy",sizeUsd:n=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:r,sizeUsd:n});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>xm)throw new Error(`quote is stale (${a}ms old, bound ${xm}ms); re-quote before preparing`);let u=Uo().pools[t],l=u.version==="v4"?KE:GE,d=l,p=r==="buy"?u.quoteAddr:u.token;return Object.freeze({artifactKind:"unsigned-tx",chainId:4663,to:l,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:u.version,pair:u.pair},quoteAgeMs:a,recipient:o,side:r,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 xm,GE,KE,Da=A(()=>{Fa();He();xm=12e4,GE="0x0000000000000000000000000000000000000000",KE="0x84b75b19A3cdf8E2F56d0507d22D442847B2053C"});function bn(){return Re().venues.hyperliquid_hip3}function km(){return Object.keys(bn().dexs).sort()}function QE(){let e=[];for(let[t,r]of Object.entries(bn().dexs))for(let n of Object.keys(r))e.push(`${t}:${n}`);return e.sort()}function ZE(e){if(typeof e!="string"||e.length===0)return[];let t=e.indexOf(":");if(t>0){let n=e.slice(0,t),o=e.slice(t+1),i=bn().dexs[n]?.[o];return i?[{dex:n,ticker:o,market:i}]:[]}let r=[];for(let[n,o]of Object.entries(bn().dexs))Object.hasOwn(o,e)&&r.push({dex:n,ticker:e,market:o[e]});return r}function eA(e,t){try{return em().books[`${e}:${t}`]??null}catch{return null}}function tA(e,t,r){if(!e||r===null||r.mantissa<=0n)return null;let n=t==="buy"?e.asks:e.bids;if(!n||n.length===0)return null;let o=Number(Me(r));if(!Number.isFinite(o)||o<=0)return null;let i=0,s=0,a=0;for(let c of n){let u=Number(c.px),l=Number(c.sz);if(!(u>0)||!(l>0))continue;let d=u*l,p=Math.min(o,d),f=p/u;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 rA(e,t,r,n){let o=tA(e,t,r);if(!o)return{impact:null,depth:null};let i=Number(Me(n));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:de(Number(a.toPrecision(12))),depth:{...o,impactFraction:a,fullyFilled:o.unfilledUsd<=1e-6}}}function Sm({dex:e,ticker:t,market:r,side:n,size:o}){let i=ze(r.mark,`${e}:${t}.mark`),s=de(r.fundingHourly),a=de(r.vol24h),c=de(r.oi),u=o===null?D("0"):o,l=eA(e,t),d=null,p=null,f="fees and gas not captured";if(u.mantissa>0n)if(l){let y=rA(l,n,u,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 l?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:XE,chain:YE,instrument:"perp",tier:JE,symbolRaw:`${e}:${t}`,symbol:t,side:n,requestedSize:u,mark:i,fees:null,gasEstimate:null,priceImpact:d,fundingHourly:s,costAccounted:!1,capturedAt:Re().capturedAt*1e3,blockOrSeq:null,raw:{fixture:"fixtures/venues.json#venues.hyperliquid_hip3",dex:e,ticker:t,vol24h:r.vol24h,oi:r.oi,fundingAnnPct:r.fundingAnnPct,maxLev:r.maxLev,reasonCostUnknown:f,hasL2Book:l!==null,l2BookFixture:l?"fixtures/hip3_l2books.json":null,depth:p}};return a!==null&&(h.raw.vol24hFixed=a),c!==null&&(h.raw.oiFixed=c),l?.bids?.[0]&&l?.asks?.[0]&&(h.bid=D(String(l.bids[0].px)),h.ask=D(String(l.asks[0].px))),Ae(h)}function Em({symbol:e,side:t="buy",sizeUsd:r=null}={}){let n=ZE(e);return n.length===0||n.length>1?null:Sm({...n[0],side:t,size:r})}function Ko({side:e="buy",sizeUsd:t=null,ticker:r=null}={}){let n=[];for(let o of QE()){let[i,s]=o.split(":");if(r!==null&&s!==r)continue;let a=bn().dexs[i][s];n.push(Sm({dex:i,ticker:s,market:a,side:e,size:t}))}return n}var XE,YE,JE,Am=A(()=>{He();Ut();$e();pt();XE="hyperliquid_hip3",YE="hyperliquid",JE="quote-only"});function vm(){return Re().venues.arcus_spot}function sA(){return Object.keys(vm().pairs).sort()}function aA({symbol:e,side:t="buy",sizeUsd:r=null}={}){if(typeof e!="string"||e.length===0)return null;let n=vm().pairs[e];if(!n)return null;let o=n.bid===void 0||n.bid===null?null:ze(n.bid,`${e}.bid`),i=n.ask===void 0||n.ask===null?null:ze(n.ask,`${e}.ask`),s=de(n.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=r===null?D("0"):r,u=D("0"),l={venue:nA,chain:oA,instrument:"spot",tier:iA,symbolRaw:e,symbol:e,side:t,requestedSize:c,fees:u,gasEstimate:null,priceImpact:null,fundingHourly:null,costAccounted:!1,capturedAt:Re().capturedAt*1e3,blockOrSeq:null,raw:{fixture:"fixtures/venues.json#venues.arcus_spot",last:n.last,bid:n.bid,ask:n.ask,vol24h:n.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),Ae(l)}function Xo({side:e="buy",sizeUsd:t=null}={}){return sA().map(r=>aA({symbol:r,side:e,sizeUsd:t})).filter(r=>r!==null)}var nA,oA,iA,Im=A(()=>{He();Ut();$e();pt();nA="arcus_spot",oA="robinhood-4663",iA="quote-only"});function Yo(){return Qf()}function Ma(){return Object.keys(Yo().tokens).sort()}function dA(e){let t=Yo().pairs[e];return!t||t.length===0?null:[...t].sort((r,n)=>(n.liquidityUsd??0)-(r.liquidityUsd??0))[0]}function pA(e,t){if(e===null||t===null)return null;if(e.mantissa<=0n||t.mantissa<=0n)return D("0");let r=Math.max(e.scale,t.scale),n=e.scale===r?e.mantissa:e.mantissa*10n**BigInt(r-e.scale),o=t.scale===r?t.mantissa:t.mantissa*10n**BigInt(r-t.scale),i=o*10n**6n,s=n+o;return{mantissa:i/s,scale:6}}function ja({symbol:e,side:t="buy",sizeUsd:r=null}={}){if(typeof e!="string"||e.length===0)return null;let n=e,o=e,i=Yo().tokens;if(Object.hasOwn(i,e))n=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))n=m,o=i[m].symbolRaw;else return null}else return null;let s=i[n],a=dA(n);if(!s||!a)return null;let c=ze(a.priceUsd,`${n}.priceUsd`),u=de(a.liquidityUsd),l=r===null?D("0"):r,d=l.mantissa===0n?D("0"):pA(u,l),p=!1;l.mantissa===0n&&(a.liquidityUsd??0)>=_m&&(p=!1);let f={venue:cA,chain:uA,instrument:"spot",tier:lA,symbolRaw:o,symbol:n,side:t,requestedSize:l,mid:c,fees:null,gasEstimate:null,priceImpact:d,fundingHourly:null,costAccounted:p,capturedAt:Yo().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)<_m}};return Ae(f)}function Om({side:e="buy",sizeUsd:t=null}={}){return Ma().map(r=>ja({symbol:r,side:e,sizeUsd:t})).filter(r=>r!==null)}var cA,uA,lA,_m,Cm=A(()=>{He();Ut();$e();pt();cA="solana_xstocks",uA="solana",lA="quote-only",_m=25e3});function Jo(){return Zf()}function Ha(){return Object.keys(Jo().tokens).sort()}function gA(e){let t=Jo().pairs[e];return!t||t.length===0?null:[...t].sort((r,n)=>(n.liquidityUsd??0)-(r.liquidityUsd??0))[0]}function wA(e,t){if(e===null||t===null)return null;if(e.mantissa<=0n||t.mantissa<=0n)return D("0");let r=Math.max(e.scale,t.scale),n=e.scale===r?e.mantissa:e.mantissa*10n**BigInt(r-e.scale),o=t.scale===r?t.mantissa:t.mantissa*10n**BigInt(r-t.scale),i=o*10n**6n,s=n+o;return{mantissa:i/s,scale:6}}function za({symbol:e,side:t="buy",sizeUsd:r=null}={}){if(typeof e!="string"||e.length===0)return null;let n=e,o=e,i=Jo().tokens;if(Object.hasOwn(i,e))n=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))n=m,o=i[m].symbolRaw;else return null}else{let m=e.toUpperCase();if(Object.hasOwn(i,m))n=m,o=i[m].symbolRaw;else return null}let s=i[n],a=gA(n);if(!s||!a)return null;let c=ze(a.priceUsd,`${n}.priceUsd`),u=de(a.liquidityUsd),l=r===null?D("0"):r,d=l.mantissa===0n?D("0"):wA(u,l),f={venue:fA,chain:mA,instrument:"spot",tier:hA,symbolRaw:o,symbol:n,side:t,requestedSize:l,mid:c,fees:null,gasEstimate:null,priceImpact:d,fundingHourly:null,costAccounted:!1,capturedAt:Jo().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)<yA,impactSizeFractionHint:bA}};return Ae(f)}function Tm({side:e="buy",sizeUsd:t=null}={}){return Ha().map(r=>za({symbol:r,side:e,sizeUsd:t})).filter(r=>r!==null)}var fA,mA,hA,yA,bA,Rm=A(()=>{He();Ut();$e();pt();fA="ton_stonfi",mA="ton",hA="quote-only",yA=25e3,bA=.01});var Qo={};B(Qo,{bestEquityRoute:()=>xA,collectEquityQuotes:()=>Pm,equityVenues:()=>kA,getUniverse:()=>Kf,getVenues:()=>Re,loadFixtures:()=>Ia,prepareEquity:()=>Go,prepareEquityRoute:()=>SA,rankEquityQuotes:()=>Wo,toJsonSafe:()=>EA,validateQuote:()=>Ae,validateRankResult:()=>Ho});function Va(e){return e==null||e===""?null:typeof e=="object"&&e&&typeof e.mantissa=="bigint"?e:D(String(e))}function Pm(e,{sizeUsd:t=null}={}){if(typeof e!="string"||!e.trim())throw new TypeError("ticker is required");let r=e.trim().toUpperCase(),n=Va(t),o=[],i=Em({symbol:`xyz:${r}`,sizeUsd:n});if(i)o.push(i);else for(let u of Ko({ticker:r,sizeUsd:n}))o.push(u);for(let u of Vo({sizeUsd:n}))u.symbol===r&&o.push(u);for(let u of Xo({sizeUsd:n}))u.symbol===r&&o.push(u);let s=gr({symbol:r,sizeUsd:n});s&&o.push(s);let a=ja({symbol:r,sizeUsd:n});a&&o.push(a);let c=za({symbol:r,sizeUsd:n});return c&&o.push(c),o}function xA(e={}){let t=String(e.ticker||e.symbol||"").trim().toUpperCase();if(!t)throw new Error("bestEquityRoute requires ticker");let r=Va(e.sizeUsd??e.size??null),n=Pm(t,{sizeUsd:r});if(n.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=n[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=Wo(n,{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>Nm}}function kA(){let e=[{venue:"hyperliquid_hip3",tier:"quote-only",chain:"hyperliquid",n:Ko().length},{venue:"arcus_perp",tier:"quote-only",chain:"robinhood-4663",n:Vo().length},{venue:"arcus_spot",tier:"quote-only",chain:"robinhood-4663",n:Xo().length},{venue:"rh_uniswap",tier:"prepare",chain:4663,n:Ba().length},{venue:"solana_xstocks",tier:"quote-only",chain:"solana",n:Ma().length},{venue:"ton_stonfi",tier:"quote-only",chain:"ton",n:Ha().length}],t=[...Ko(),...Vo(),...Xo(),...wm(),...Om(),...Tm()],r=(t[0]?.capturedAt??Date.now())+1e3,{survivors:n,excluded:o}=Mo(t,{nowMs:r});return{inventory:e,hip3Dexs:km(),liveness:{survivors:n.length,excluded:o.length,byReason:o.reduce((i,s)=>(i[s.reason]=(i[s.reason]??0)+1,i),{})},capturedAt:Re().capturedAt,custody:"prepare-only",note:"quote-only venues are ranked for discovery; only rh_uniswap is preparable in v1"}}function SA(e={}){let t=String(e.ticker||e.symbol||"").trim().toUpperCase(),r=e.recipient||e.taker;if(!t)throw new Error("prepareEquityRoute requires ticker");if(!r)throw new Error("prepareEquityRoute requires recipient (signing wallet)");let n=Va(e.sizeUsd??e.size??null),o=gr({symbol:t,sizeUsd:n});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=Go({symbol:t,sizeUsd:n,recipient:r,nowMs:a});return{ok:!0,ticker:t,artifact:u,bestPreparableVenue:"rh_uniswap",dataSource:s?"caller-clock":"live-clock",capturedAt:i,ageMs:c,stale:c>Nm}}catch(i){return{ok:!1,failureKind:"prepare-refused",ticker:t,error:String(i.message||i)}}}function EA(e){return JSON.parse(JSON.stringify(e,(t,r)=>typeof r=="bigint"?r.toString():r))}var Nm,Zo=A(()=>{$e();La();Da();Ra();Am();Im();$a();Fa();Cm();Rm();He();La();Da();pt();He();Nm=3600*1e3});var ei={};B(ei,{CHAIN_CONFIGS:()=>rn,EVIDENCE:()=>U,RISK:()=>q,SCANNER_CAPABILITIES:()=>or,__clearScanners:()=>ix,createScanner:()=>Id,getScanner:()=>Us,listScanners:()=>_d,registerBuiltinScanners:()=>_o,registerCustomChain:()=>Lp,registerScanner:()=>fo,scannerCoverage:()=>sx,validateScanner:()=>vd});var ti=A(()=>{gt();Oo()});var Ka={};B(Ka,{createWatch:()=>OA,listWatches:()=>_A,removeWatch:()=>CA});import gn from"node:fs";import Wa from"node:path";import{randomUUID as AA}from"node:crypto";import{homedir as vA}from"node:os";function IA(e=process.env){return e.ORACLE_CONFIG_DIR||Wa.join(vA(),".config","oracle")}function $m(e=process.env){return Wa.join(IA(e),"watches.json")}function Ga(e=process.env){let t=$m(e);if(!gn.existsSync(t))return{watches:[]};try{let r=JSON.parse(gn.readFileSync(t,"utf8"));return{watches:Array.isArray(r.watches)?r.watches:[]}}catch{return{watches:[]}}}function qm(e,t=process.env){let r=$m(t);gn.mkdirSync(Wa.dirname(r),{recursive:!0,mode:448});let n=`${r}.${process.pid}.tmp`;gn.writeFileSync(n,`${JSON.stringify(e,null,2)}
9
- `,{mode:384}),gn.renameSync(n,r)}function _A(e=process.env){return Ga(e).watches}function OA({chain:e,token:t,condition:r,note:n}={},o=process.env){if(!e||!t||!r)throw new Error("watch requires chain, token, condition");let i={id:AA(),chain:String(e),token:String(t),condition:String(r),note:n?String(n):null,actionMode:"alert_only",createdAt:new Date().toISOString()},s=Ga(o);return s.watches.push(i),qm(s,o),i}function CA(e,t=process.env){let r=Ga(t),n=r.watches.filter(o=>o.id!==e);return n.length===r.watches.length?!1:(qm({watches:n},t),!0)}var Xa=A(()=>{});var Lm={};B(Lm,{classifyReceipt:()=>TA});function TA(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 Um=A(()=>{});function qA(e){return!($A.has(e)||/^0x/i.test(e)||!/\d/.test(e)&&e===e.toLowerCase()||!/\d/.test(e)&&e===e.toUpperCase())}function Bm(e,{extras:t=[]}={}){let r=[e,...t].map(i=>String(i||"")).join(`
10
- `),n=[...new Set((r.match(RA)||[]).map(i=>i.toLowerCase()))].filter(i=>!PA.has(i)),o=[...new Set(r.match(NA)||[])].filter(qA);return{evm:n,solana:o,all:[...n.map(i=>({chainFamily:"evm",address:i})),...o.map(i=>({chainFamily:"solana",address:i}))]}}function Fm(e){let t=String(e||"").trim();if(!t)return[];let r=[],n=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)&&r.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(n):n(o)}catch{for(let o of t.split(`
11
- `)){let i=o.trim();if(i.startsWith("{"))try{n(JSON.parse(i))}catch{}}r.length||r.push({id:"",text:t,urls:[]})}return r}var RA,NA,PA,$A,Dm=A(()=>{RA=/\b0x[a-fA-F0-9]{40}\b/g,NA=/\b[1-9A-HJ-NP-Za-km-z]{32,44}\b/g,PA=new Set(["0x0000000000000000000000000000000000000000","0x000000000000000000000000000000000000dead","0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee"].map(e=>e.toLowerCase())),$A=new Set(["So11111111111111111111111111111111111111112","EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v","Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB","11111111111111111111111111111111"])});import{spawnSync as LA}from"node:child_process";import Mm from"node:fs";import Ya from"node:path";function DA(e=process.env){let t=String(e.ORACLE_XURL_ENABLED||"").trim().toLowerCase();return t==="1"||t==="true"||t==="yes"||t==="on"}function zm(e=process.env){let t=String(e.ORACLE_XURL_ALLOW_WRITE||"").trim().toLowerCase();return t==="1"||t==="true"||t==="yes"||t==="on"}function MA(e=process.env){let t=String(e.ORACLE_XURL_BIN||"").trim();if(t)return Ya.isAbsolute(t)?Mm.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 r=String(e.PATH||process.env.PATH||"");for(let n of r.split(Ya.delimiter)){if(!n)continue;let o=Ya.join(n,"xurl");try{if(Mm.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 jA(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 HA(e){for(let t of e){let r=String(t);if(Hm.includes(r))return r;if(Hm.some(n=>n.startsWith("--")&&r.startsWith(`${n}=`)))return r.split("=")[0]}return null}function zA(e={},t=process.env){let r;if(Array.isArray(e.argv))r=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)))),r=[c,...u]}if(r.length===0)return{ok:!1,error:"empty argv"};if(r.length>24)return{ok:!1,error:"too many arguments"};for(let c of r)if(String(c).length>4e3)return{ok:!1,error:"argument too long"};let n=HA(r);if(n)return{ok:!1,error:`forbidden flag: ${n}`};if(r.some(c=>String(c).includes("\0")))return{ok:!1,error:"nul byte in argv"};let o=String(r[0]||"").replace(/^\//,"");if(o.startsWith("2/")||r[0].startsWith("/2/")||r[0].startsWith("https://api.x.com/")){if(!zm(t)&&r.some(c=>/^-X$/.test(c)||/^--request$/.test(c))){let c=r.findIndex(l=>l==="-X"||l==="--request"),u=String(r[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(r[1]||"")!=="status")return{ok:!1,error:"only `auth status` is allowed (no apps add / oauth2 from the agent)"}}else if(!BA.includes(o))if(FA.includes(o)){if(!zm(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=[...r],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 Vm(e,t={},r={}){if(e!=="xurl")return{ok:!1,error:`unknown tool: ${e}`};let n=r.env||process.env;if(!DA(n))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=zA(t,n);if(!o.ok)return o;let i=MA(n);if(!i.ok)return i;let a=(r.spawnFn||LA)(i.bin,o.argv,{encoding:"utf8",timeout:r.timeoutMs||jm,maxBuffer:1024*1024,env:jA(n)});if(a.error){let d=a.error.code==="ETIMEDOUT"?`xurl timed out after ${r.timeoutMs||jm}ms`:String(a.error.message||a.error);return{ok:!1,error:vt(d,{force:!0})}}let c=vt(String(a.stdout||"").slice(0,UA),{force:!0}),u=vt(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 jm,UA,BA,FA,Hm,CR,Wm=A(()=>{Ai();jm=45e3,UA=4e4,BA=Object.freeze(["whoami","user","read","search","timeline","mentions","bookmarks","likes","following","followers","dms","auth"]),FA=Object.freeze(["post","reply","quote","delete","like","unlike","repost","unrepost","bookmark","unbookmark","follow","unfollow","block","unblock","mute","unmute","dm"]),Hm=Object.freeze(["--verbose","-v","--trace","-t","--bearer-token","--consumer-key","--consumer-secret","--access-token","--token-secret","--client-id","--client-secret"]);CR=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 KA(e){return!e||e==="0x"||e===GA}async function Gm(e={},t={}){let r=t.rpcCall||Y,n=String(e.address||"").trim().toLowerCase(),o=Number(e.chainId);if(!/^0x[a-f0-9]{40}$/.test(n))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 r(o,"eth_getCode",[n,"latest"],t)}catch(h){return{address:n,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:n,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(VA))c.includes(h)&&a.push({selector:`0x${h}`,...y});let u=!1,l=null,d=null,p=await Promise.all(WA.map(async({label:h,slot:y})=>{try{let x=await r(o,"eth_getStorageAt",[n,y,"latest"],t);return{label:h,word:x,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),!u&&h.word&&!KA(h.word)&&(u=!0,l=h.label,d=`0x${String(h.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(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:n,chainId:o,status:"ok",risk:m,findings:a,isProxy:u,proxyStandard:l,implementation:d,codeSize:Math.floor(c.length/2),notes:s}}var VA,WA,GA,Km=A(()=>{ut();VA=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"}}),WA=Object.freeze([{label:"eip1967",slot:"0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc"},{label:"zeppelinos",slot:"0x7050c9e0f4ca769c69bd3a8ef740bc37934f8e2c036e5a723fd8ee048ed3f8c3"},{label:"eip1822",slot:"0xc5f16f0fcc639fa48a6947836d9850f504798523bf8c9a3a87d5876cf622bcf7"}]),GA=`0x${"0".repeat(64)}`});function ri(e,t){let r=String(e||"").trim();if(!XA.test(r))throw new Error(`evm-token-sniper: ${t} must be a 0x EVM address`);return r}function Ja(e,t){let r=String(e??"").trim();if(!/^\d+$/.test(r)||BigInt(r)<=0n)throw new Error(`evm-token-sniper: ${t} must be a positive raw integer amount`);return r}function wn(e,t){return e==null||e===""?null:Ja(e,t)}function JA({chainId:e,tokenAddress:t,tokenIn:r,amountIn:n,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=ri(l.to,"prepared destination"),p=String(l.data||"").toLowerCase();if(!/^0x[0-9a-f]+$/.test(p))throw new Error("local-signer envelope requires hex calldata");let f=Ja(l.value??n,"prepared native value");if(BigInt(f)!==BigInt(n))throw new Error("local-signer envelope requires native value equal amountIn");let m=wn(l.gasLimit??c.gasLimit,"gasLimit"),h=wn(l.maxFeePerGas??c.maxFeePerGas,"maxFeePerGas");if(!m||!h)throw new Error("local-signer envelope requires explicit gasLimit and maxFeePerGas caps");let y=Number(u.nowMs??Date.now()),x=Math.min(6e4,Math.max(1e3,Number(c.ttlMs??c.expiresInMs??3e4)||3e4)),E=gs({chainId:e,venue:"uniswap-v3",quoteAmountOut:i?.amountOut,liquidityUsd:s?.liquidityUsd,requestedCapBps:c.slippageBps??50,quotedAtMs:y,ttlMs:x,secret:u.routeAttestationSecret}),_=Oe(E,{chainId:e,venue:"uniswap-v3",data:p,secret:u.routeAttestationSecret}),w={chainId:e,from:o,to:d,data:p,value:f,gasLimit:m,maxFeePerGas:h,slippageBps:_.selectedBps,expiresAtMs:y+x},O=wn(l.maxPriorityFeePerGas??c.maxPriorityFeePerGas,"maxPriorityFeePerGas");return O&&(w.maxPriorityFeePerGas=O),c.nonce!==void 0&&(w.nonce=Number(c.nonce)),(c.txType!==void 0||O)&&(w.type=Number(c.txType??2)),c.l1FeeWei!==void 0&&(w.l1FeeWei=wn(c.l1FeeWei,"l1FeeWei")??"0"),c.operatorFeeWei!==void 0&&(w.operatorFeeWei=wn(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:_.selectedBps,expiresAtMs:y+x,fee:{oracleFeeBps:5},autoSlippage:_,artifact:{chainId:e,owner:o,transactions:[w]},meta:{source:"evm-token-sniper",tokenIn:r,tokenOut:t}}}function QA(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}_o();let r=Us(e);if(!r)throw new Error(`evm-token-sniper: unsupported EVM chainId ${e}`);return r}function ZA({token:e,pools:t,structuralRisk:r,scannerRisk:n,sellability:o,quote:i,args:s,scanner:a}){let c=[];return e?.evidence!==U.LIVE&&c.push("token identity is not live-verified"),(!Array.isArray(t?.pools)||t.pools.length===0)&&c.push("no liquid pool was resolved"),r?.status!=="ok"&&c.push("structural contract risk is unavailable"),r?.risk==="high"&&c.push("structural contract risk is high"),n?.verdict!==q.PASS&&c.push(`scanner risk verdict is ${n?.verdict||"UNKNOWN"}`),a.supports?.("sellSimulation")?o?.verdict!==q.PASS&&c.push(`sellability verdict is ${o?.verdict||"UNKNOWN"}`):c.push("sell simulation is unavailable on this chain"),a.supports?.("quote")?i?.evidence!==U.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 Xm(e={},t={}){let r=Number(e.chainId??YA);if(!Number.isInteger(r)||r<=0)throw new Error("evm-token-sniper: chainId must be a positive integer");let n=ri(e.tokenAddress||e.address||e.token,"tokenAddress"),o=e.tokenIn?ri(e.tokenIn,"tokenIn"):null,i=e.recipient?ri(e.recipient,"recipient"):null,s=e.amountIn==null?null:Ja(e.amountIn,"amountIn"),a=QA(r,t.scanner),c=t.scanContractRisk||Gm,[u,l,d]=await Promise.all([a.resolveToken(n),a.resolvePools(n),c({address:n,chainId:r},t.contractRiskOpts||t)]),p=await a.scoreRisk(n),f=null;a.supports?.("sellSimulation")&&s?f=await a.sellSimulation({token:n,amountIn:s,base:o||void 0}):a.supports?.("sellSimulation")&&(f=await a.sellSimulation({token:n,amountIn:"10000000000000000"}));let m=null;a.supports?.("quote")&&o&&s&&(m=await a.quote({tokenIn:o,tokenOut:n,amountIn:s}));let h={...e,tokenIn:o,amountIn:s,recipient:i},y=ZA({token:u,pools:l,structuralRisk:d,scannerRisk:p,sellability:f,quote:m,args:h,scanner:a}),x=null,E=null,_=null;if(e.prepare===!0&&y.length===0){x=await a.prepareUnsignedTx({tokenIn:o,tokenOut:n,amountIn:s,recipient:i,slippageBps:e.slippageBps??50,fee:m?.fee});try{E=JA({chainId:r,tokenAddress:n,tokenIn:o,amountIn:s,recipient:i,quote:m,topPool:l?.pools?.[0]||null,unsignedTx:x,args:e,opts:t})}catch(w){_=String(w?.message||w).slice(0,200)}}return{provider:"evm-token-sniper",execution:"armed-local",armed:!!E,signing:"local-signer",broadcasting:"local-signer",chainId:r,chain:{key:a.key,name:a.name,nativeCurrency:a.nativeCurrency},token:u,pools:l,topPool:l?.pools?.[0]||null,structuralRisk:d,scannerRisk:p,sellability:f,quote:m,blockedReasons:y,prepared:!!x,unsignedTx:x,localSignerEnvelope:E,localSignerBlockedReason:_,signed:E?"pending-local-signer":!1,broadcast:E?"pending-local-signer":!1}}var XA,YA,Ym=A(()=>{Oo();gt();Ue();Km();XA=/^0x[0-9a-fA-F]{40}$/,YA=4663});var th={};B(th,{evaluateContracts:()=>eh,fetchAccountTweets:()=>Zm,snipeExecuteEnabled:()=>Jm,tickTwitterCaWatch:()=>iv,twitterSnipeEmitsCard:()=>sv});function Jm(e=process.env){return String((e||process.env).ORACLE_SNIPE_EXECUTE||"").trim()==="1"}function Qm(e){return String(e||"").trim().replace(/^@/,"")}async function Zm({handle:e,limit:t=5,xurlFn:r=Vm}={},n={}){let o=Qm(e);if(!o)throw new Error("twitter-ca-watch: handle required");let i=await r("xurl",{command:"search",query:`from:${o}`,limit:Math.min(20,Math.max(1,Number(t)||5))},n);return i?.ok?{ok:!0,tweets:Fm(i.stdout),raw:i}:{ok:!1,error:i?.error||"xurl search failed",tweets:[]}}async function nv(e,{chainId:t,amountIn:r,tokenIn:n,recipient:o,prepare:i},s){let a=await Xm({chainId:t,tokenAddress:e,amountIn:r,tokenIn:n,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 ov(e,t){let r=await ud(e,{chainSlug:"solana",stables:[tv,rv]},t);return{chainFamily:"solana",chainId:"solana",address:e,topPool:r.topPool,pools:r.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 eh(e,t={},r={}){let n=Number(t.chainId??ev),o=[];for(let i of e.evm||[])o.push(await nv(i,{...t,chainId:n},r));for(let i of e.solana||[])o.push(await ov(i,r));return o}async function iv(e={},t={}){let r=Qm(e.handle),n=e.seen instanceof Set?e.seen:new Set(e.seen||[]),o=await Zm({handle:r,limit:e.limit,xurlFn:t.xurlFn},t);if(!o.ok)return{ok:!1,handle:r,error:o.error,hits:[],seen:[...n]};let i=[];for(let a of o.tweets){let c=a.id||`${r}:${a.text.slice(0,80)}`;if(n.has(c))continue;let u=Bm(a.text,{extras:a.urls||[]});if(!u.all.length){n.add(c);continue}let d=await(t.evaluateFn||eh)(u,e,t);n.add(c),i.push({tweetId:a.id||null,handle:r,text:a.text,contracts:u,evaluations:d})}let s=e.automated!==!1;return{ok:!0,handle:r,source:"twitter-ca-watch",automated:s,card:!1,notify:!1,telegram:!1,execution:!1,broadcast:!1,snipeExecuteEnabled:Jm(t.env||process.env),hits:i,seen:[...n]}}function sv(e={}){return!e||typeof e!="object"||e.source==="twitter-ca-watch"||e.automated===!0||e.card===!1||e.notify===!1,!1}var ev,tv,rv,rh=A(()=>{Dm();Wm();Ym();zr();On();ev=4663,tv="EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",rv="Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB"});import{wordlists as av}from"ethers";function dv(e){let t=String(e).trim().toLowerCase().split(/\s+/).filter(Boolean);return lv.has(t.length)&&t.every(r=>av.en.getWordIndex(r)>=0)}function hv(e){let t=nh(e);return mv.has(t)||fv.test(t)}function nh(e){return String(e).replace(/[^a-z0-9]/gi,"").toLowerCase()}function yv(e){let t=nh(e);return[...cv].some(r=>t.includes(r))}function bv(e,t,r){if(typeof t=="string"){if(uv.some(n=>n.test(t))||dv(t))throw new xn(r);if(pv.test(t)&&!hv(e))throw new xn(r)}}function Qa(e,t="$",r=""){if(e==null||typeof e=="boolean")return e;if(typeof e=="string")return bv(r,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)=>Qa(o,`${t}[${i}]`,r));if(typeof e!="object"||Object.getPrototypeOf(e)!==Object.prototype)throw new TypeError(`action receipt: JSON-like value required at ${t}`);let n={};for(let o of Object.keys(e).sort()){let i=`${t}.${o}`;if(yv(o))throw new xn(i);e[o]!==void 0&&(n[o]=Qa(e[o],i,o))}return n}function wr(e){return Qa(e)}var cv,uv,lv,pv,fv,mv,xn,Za=A(()=>{cv=new Set(["privatekey","privkey","secretkey","seedphrase","seed","mnemonic","passphrase","password","keystore","keymaterial","wif","xprv","xpriv","bearer","authorization","signature","apikey","credential"]),uv=[/\b[5KL][1-9A-HJ-NP-Za-km-z]{50,51}\b/,/\bxprv[0-9A-Za-z]{50,}\b/],lv=new Set([12,15,18,21,24]);pv=/^\s*(?:0x)?[0-9a-fA-F]{64}\s*$/,fv=/(hash|digest|root|salt|nonce|proof|commitment|sig|id)(?:e?s)?$/i,mv=new Set(["calldata","data","publickey","pubkey","message","payload","input","extradata"]);xn=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 gv,chmod as ni,readFile as wv,rename as xv,writeFile as kv}from"node:fs/promises";import{homedir as Sv}from"node:os";import{dirname as oh,join as ec}from"node:path";import Ev from"sql.js";function si(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(si).join(",")}]`:`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${si(e[t])}`).join(",")}}`}function ih(e){if(!Av.has(e))throw new TypeError(`unknown artifact type: ${e}`);return e}function oi(e){let t=[];for(;e.step();)t.push(e.getAsObject());return e.free(),t}function ii(e){return e?{id:e.id,type:e.type,createdAt:e.created_at,data:JSON.parse(e.data_json)}:null}async function sh(e={}){let t=e.path||_v;await gv(oh(t),{recursive:!0,mode:448}),await ni(oh(t),448);let r;try{r=await wv(t)}catch(u){if(u.code!=="ENOENT")throw u}let n=await Ev(e.sqlJs||{}),o=r?new n.Database(r):new n.Database;o.run(`
8
+ - `)}`);let o=e.capabilities||{},i=ar.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:n,capabilities(){return{chainId:e.chainId,key:e.key,supported:[...i],unsupported:ar.filter(a=>!i.includes(a))}},supports(a){return i.includes(a)}};for(let a of ar)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 yo(e){let t=Ld(e);return cr.set(t.chainId,t),t}function Ms(e){return cr.get(Number(e))||null}function Ud(){return[...cr.values()]}function Ex(){cr.clear()}function Ax(){let e={};for(let t of cr.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:cr.size,capabilities:[...ar],chains:e}}var ar,U,q,Sx,cr,wt=A(()=>{ar=Object.freeze(["blockNumber","nativeBalance","tokenBalance","resolveToken","resolvePools","scanBlocks","scoreRisk","quote","sellSimulation","prepareUnsignedTx"]),U=Object.freeze({LIVE:"LIVE",CACHED:"CACHED",STALE:"STALE",UNKNOWN:"UNKNOWN",UNAVAILABLE:"UNAVAILABLE"}),q=Object.freeze({PASS:"PASS",CAUTION:"CAUTION",FAIL:"FAIL",UNKNOWN:"UNKNOWN"}),Sx=/^0x[0-9a-fA-F]{40}$/;cr=new Map});function Bd(e){let{source:t,amountOut:r,minOut:n=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||r==null)return{source:t,quality:Fe.FAILED,amountOut:null,error:u||"no amountOut returned"};let p=Jr(r);if(p==null||p<=0n)return{source:t,quality:Fe.FAILED,amountOut:null,error:"non-positive amountOut"};let f=Number(s);return{source:t,quality:o==null?Fe.NO_GAS:Fe.FULL,amountOut:p.toString(),minOut:Jr(n)?.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:l,meta:d}}async function Dd(e,t,{divisor:r=1000n}={}){let n=Jr(t);if(n==null||n<=0n)return null;let o=n/r>0n?n/r:1n;if(o>=n)return null;let i,s;try{[i,s]=await Promise.all([e(o),e(n)])}catch{return null}let a=Jr(i),c=Jr(s);if(a==null||c==null||a<=0n)return null;let u=Number(a)/Number(o),l=Number(c)/Number(n);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 Md(e,t,{maxImpactPct:r=25}={}){let n=[],o=[],i=(e.routes??[]).filter(a=>{let c=t?.[a.source];return c?c.impactPct>r?(n.push({source:a.source,impactPct:Number(c.impactPct.toFixed(2)),reason:`price impact ${c.impactPct.toFixed(1)}% exceeds ${r}% ceiling -- the venue cannot absorb this size near the quoted price`}),!1):!0:(o.push(a.source),!0)}),s=[...e.warnings??[]];return n.length&&s.push(`dropped ${n.length} route(s) on price impact: `+n.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:n,impactUnmeasured:o,warnings:s}}function js(e,{destPriceUsd:t=null,destDecimals:r=null,liquidityFirst:n=!0,liquidityBandBps:o=50,gasPriceWei:i=null,nativePriceUsd:s=null}={}){let a=e.filter(b=>b.quality!==Fe.FAILED),c=e.filter(b=>b.quality===Fe.FAILED),u=t!=null&&t>0&&r!=null&&r>=0,l=Number(i),d=Number(s),p=Number.isFinite(l)&&l>0&&Number.isFinite(d)&&d>0,f=a.map(b=>{let S=BigInt(b.amountOut),k=0n,N=!1,I=!1,P=BigInt(b.oracleFeeBps??0),L=P>0n?S*P/10000n:0n;if(u){let F=b.gasUsd,z=Number(b.meta?.gasUnits??b.estimatedGas);if(F==null&&p&&Number.isFinite(z)&&z>0){let K=z*l/1e18*d;Number.isFinite(K)&&K>=0&&(F=K,I=!0)}let ie=(F??0)+(b.feeUsd??0);if(ie>0){let K=ie/t*10**r;Number.isFinite(K)&&K>=0&&(k=BigInt(Math.floor(K)),N=!0)}else F===0&&(N=!0)}let H=k+L,X=S>H?S-H:0n;return{...b,grossOut:S.toString(),netOut:X.toString(),costInDest:k.toString(),oracleFeeInDest:L.toString(),costAccounted:N,gasEstimated:I}}),m=Number(o)>0?Number(o):0,h=f.reduce((b,S)=>BigInt(S.netOut)>b?BigInt(S.netOut):b,0n),y=b=>h>0n?Number((h-BigInt(b))*10000n/h):0,x=[],E=f.slice().sort((b,S)=>BigInt(S.netOut)>BigInt(b.netOut)?1:-1)[0]??null;f.sort((b,S)=>{let k=y(b.netOut)<=m?0:1,N=y(S.netOut)<=m?0:1;if(n&&m>0&&k!==N)return k-N;if(n&&m>0){let I=b.liquidityUsd??-1,P=S.liquidityUsd??-1;if(I!==P)return P-I}return BigInt(S.netOut)>BigInt(b.netOut)?1:-1}),n&&m>0&&E&&f[0]&&f[0].source!==E.source&&x.push(`liquidity-first: chose ${f[0].source} (liquidity $${f[0].liquidityUsd??"unknown"}) over best-price ${E.source} within ${m} bps`);let _=f.filter(b=>!b.costAccounted).map(b=>b.source);u?_.length&&x.push(`gas not reported by: ${_.join(", ")}. These are ranked on gross output and may be overstated relative to gas-measured routes.`):x.push("destination price/decimals unavailable: ranked on GROSS output. Gas is not included, so a cheap-looking route may cost more to execute.");let w=f[0];if(u&&w&&w.costAccounted===!1){let b=f.find(S=>S.costAccounted&&y(S.netOut)<=m);b&&x.push(`winner ${w.source} has UNMEASURED gas; gas-measured ${b.source} is within ${m} bps and may net more once ${w.source}'s real gas is paid \u2014 prefer it if unsure.`)}let O=f.filter(b=>b.gasEstimated).map(b=>b.source);O.length&&x.push(`gas ESTIMATED (from gas units x current gas price, not measured) for: ${O.join(", ")}. Net includes this estimate so the ranking is gas-inclusive, but the on-chain gas may differ.`);let v=null,g=null;if(f.length>=2&&f[0].costAccounted&&f[1].costAccounted){let b=BigInt(f[0].netOut),S=BigInt(f[1].netOut);S>0n&&(v=Number((b-S)*10000n/S),g=`${f[0].source} vs ${f[1].source}`)}return{best:f[0]??null,routes:f,failed:c,improvementBps:v,spreadBasis:g,rankedOn:u?"net-of-cost":"gross",warnings:x}}async function bo(e,{timeoutMs:t=12e3}={}){let r=(o,i)=>Promise.race([o,new Promise((s,a)=>setTimeout(()=>a(new Error(`${i}: timeout`)),t))]);return(await Promise.allSettled(e.map(o=>r(Promise.resolve().then(o.run),o.source)))).map((o,i)=>{let s=e[i].source;return o.status==="rejected"?Bd({source:s,error:String(o.reason?.message||o.reason)}):Bd({source:s,...o.value})})}var Fe,Fd,Jr,Hs=A(()=>{wt();Fe=Object.freeze({FULL:"FULL",NO_GAS:"NO_GAS",FAILED:"FAILED"}),Fd={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"},Jr=e=>{try{return e==null||e===""?null:BigInt(String(e).split(".")[0])}catch{return null}}});function jd(e={}){return Jn({provider:"oneinch",defaultUrl:vx,hosts:["api.1inch.dev"],url:e.baseUrl||process.env.ONEINCH_API_URL})}function Ix(e={}){return jd(e).baseUrl}function Hd(e={}){return e.apiKey||process.env.ONEINCH_API_KEY||process.env.ONE_INCH_API_KEY||""}function _x(e={}){let t=Hd(e);return Qn({accept:"application/json"},{Authorization:t?`Bearer ${t}`:""},jd(e).trusted)}async function zd(e={},t={}){if(!Hd(t))throw new Error("ONEINCH_API_KEY required for 1inch");let r=Number(e.chainId??1),{src:n,dst:o,amount:i}=e;if(!n||!o||!i)throw new Error("oneinchQuote requires src, dst, amount");let s=new URLSearchParams({src:n,dst:o,amount:String(i)}),a=await C(`${Ix(t)}/${r}/quote?${s}`,{headers:_x(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3});return a?.dstAmount?ae(a,{chainId:r,venue:"1inch-quote",amountOut:a.dstAmount,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps}):a}var vx,Vd=A(()=>{j();Ue();Cs();xe();vx="https://api.1inch.dev/swap/v6.0"});var Kd={};B(Kd,{UNI_V4_CHAINS:()=>De,UNI_V4_FEE_TIERS:()=>Ws,computeV4PoolId:()=>xo,decodeV4HookPermissions:()=>Ks,uniV4Chains:()=>Dx,uniV4Health:()=>Mx,uniV4InspectHook:()=>Ux,uniV4PrepareExactIn:()=>Fx,uniV4QuoteExactIn:()=>ko,uniV4QuoteExactOut:()=>Bx});import{AbiCoder as Ox,Interface as zs,getAddress as Ze,isAddress as Vs,keccak256 as Cx}from"ethers";function Ks(e){let t=tn(e),r=Number(BigInt(t)&Rx),n=Object.fromEntries(Wd.map(([s,a])=>[a,!!(r&1<<s)])),i=[["beforeSwapReturnsDelta","beforeSwap"],["afterSwapReturnsDelta","afterSwap"],["afterAddLiquidityReturnsDelta","afterAddLiquidity"],["afterRemoveLiquidityReturnsDelta","afterRemoveLiquidity"]].filter(([s,a])=>n[s]&&!n[a]).map(([s,a])=>`${s} requires ${a}`);return Object.freeze({address:t,mask:r,maskHex:`0x${r.toString(16).padStart(4,"0")}`,flags:Object.freeze(n),enabled:Object.freeze(Wd.filter(([,s])=>n[s]).map(([,s])=>s)),valid:i.length===0,violations:Object.freeze(i)})}function en(e){let t=Number(e),r=De[t];if(!r)throw new Error(`uniswap-v4: unsupported chainId ${e} (supported: ${Object.keys(De).join(", ")})`);return{chainId:t,...r}}function tn(e){if(e==null||e==="")return we;let t=String(e);if(!Vs(t))throw new Error(`invalid Uniswap V4 hook address: ${e}`);return Ze(t)}function ur(e,t){let r=De[Number(t)];if(Zr(e))return Ze(r.weth);let n=String(e);if(/^weth$/i.test(n))return Ze(r.weth);if(/^usdc$/i.test(n)||/^usdg$/i.test(n))return Ze(r.usdc);if(!Vs(n))throw new Error(`invalid token address: ${e}`);return Ze(n)}function Zr(e){let t=String(e||"").trim().toLowerCase();return!t||t===qx.toLowerCase()||t===we.toLowerCase()||t==="eth"}function xo({currency0:e,currency1:t,fee:r,tickSpacing:n,hooks:o=we}){let i=Ze(e),s=Ze(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=tn(o);return Cx(Qr.encode(["address","address","uint24","int24","address"],[a,c,Number(r),Number(n),u]))}function Xs({tokenIn:e,tokenOut:t,fee:r,tickSpacing:n,hooks:o=we}){let i=Ze(e),s=Ze(t),[a,c]=i.toLowerCase()<s.toLowerCase()?[i,s]:[s,i],u=i.toLowerCase()===a.toLowerCase();return{poolKey:{currency0:a,currency1:c,fee:Number(r),tickSpacing:Number(n),hooks:tn(o)},zeroForOne:u}}function Lx({hook:e,codePresent:t,initialized:r,dynamicFee:n}){let o=Ks(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!==we&&(c="low",a.push("nonzero hook requires independent contract review")),n&&(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)),n&&e===we&&(c="critical",a.push("dynamic-fee pool has no hook authority")),e!==we&&o.enabled.length===0&&(c="critical",a.push("nonzero hook declares no permissions")),r||(c="critical",a.push("pool is not initialized")),e!==we&&!t&&(c="critical",a.push("hook address has no deployed bytecode")),Object.freeze({tier:c,audited:!1,requiresReview:e!==we,returnsDelta:i,reasons:Object.freeze(a)})}async function Ux(e={},t={}){let r=en(e.chainId??8453);if(!r.stateView)throw new Error(`uniswap-v4: no StateView on chain ${r.chainId}`);let n=ur(e.tokenIn||"WETH",r.chainId),o=ur(e.tokenOut||r.usdc,r.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=tn(e.hooks),{poolKey:c}=Xs({tokenIn:n,tokenOut:o,fee:i,tickSpacing:s,hooks:a}),u=xo(c),l=t.rpcCall||Y,d=go.encodeFunctionData("getSlot0",[u]),p=go.encodeFunctionData("getLiquidity",[u]),[f,m,h]=await Promise.all([l(r.chainId,"eth_call",[{to:r.stateView,data:d},"latest"],t),l(r.chainId,"eth_call",[{to:r.stateView,data:p},"latest"],t),a===we?Promise.resolve(null):l(r.chainId,"eth_getCode",[a,"latest"],t)]),y=go.decodeFunctionResult("getSlot0",f),x=go.decodeFunctionResult("getLiquidity",m)[0],E=y[0],_=E>0n,w=a===we?null:typeof h=="string"&&h!=="0x"&&h.length>4,O=!!(i&Gs),v=Lx({hook:a,codePresent:w,initialized:_,dynamicFee:O});return Object.freeze({venue:"uniswap-v4",chainId:r.chainId,stateView:r.stateView,poolId:u,poolKey:Object.freeze(c),pool:Object.freeze({initialized:_,sqrtPriceX96:E.toString(),tick:Number(y[1]),protocolFee:Number(y[2]),lpFee:Number(y[3]),liquidity:x.toString(),dynamicFee:O}),hook:Object.freeze({address:a,codePresent:w,codeBytes:w?(h.length-2)/2:0,permissions:Ks(a)}),risk:v})}async function ko(e={},t={}){let{chainId:r,quoter:n,poolManager:o,universalRouter:i}=en(e.chainId??8453),s=ur(e.tokenIn||"WETH",r),a=ur(e.tokenOut||De[r].usdc,r),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.fee!=null&&e.tickSpacing!=null?[{fee:Number(e.fee),tickSpacing:Number(e.tickSpacing)}]:e.tryTiers===!1?[{fee:500,tickSpacing:10}]:[...Ws],l=e.hooks||we,p=await Promise.all(u.map(async b=>{let{poolKey:S,zeroForOne:k}=Xs({tokenIn:s,tokenOut:a,fee:b.fee,tickSpacing:b.tickSpacing,hooks:l}),N=wo.encodeFunctionData("quoteExactInputSingle",[{poolKey:S,zeroForOne:k,exactAmount:c,hookData:"0x"}]);try{let I=await(t.rpcCall||Y)(r,"eth_call",[{to:n,data:N},"latest"],t);if(!I||I==="0x")return{...b,ok:!1,error:"empty result"};let P=wo.decodeFunctionResult("quoteExactInputSingle",I);return{fee:b.fee,tickSpacing:b.tickSpacing,ok:!0,amountOut:P[0].toString(),gasEstimate:P[1].toString(),poolKey:S,zeroForOne:k,poolId:xo({...S})}}catch(I){return{...b,ok:!1,error:String(I.message||I).slice(0,160)}}})),f=null;for(let b of p)b.ok&&(!f||BigInt(b.amountOut)>BigInt(f.amountOut))&&(f=b);if(!f){let b=p.map(S=>`${S.fee}/${S.tickSpacing}:${S.error||"fail"}`).join("; ");throw new Error(`uniswap-v4 quote failed chain=${r}: ${b}`)}let m=e.liquidityUsd==null?await Wr({chainId:r,tokenA:s,tokenB:a,dexIds:Gd},t).catch(()=>[]):[],h=new Map;for(let b of m){let S=String(b.pairAddress||"").toLowerCase();S&&h.set(S,b)}let y=b=>h.get(String(b.poolId||"").toLowerCase())??null,x=e.liquidityBandBps==null?50:Number(e.liquidityBandBps),E=null;if(!(e.fee!=null&&e.tickSpacing!=null)&&x>0&&BigInt(f.amountOut)>0n){let b=BigInt(f.amountOut),k=p.filter(N=>N.ok&&Number((b-BigInt(N.amountOut))*10000n/b)<=x).filter(N=>y(N)?.liquidityUsd!=null).sort((N,I)=>y(I).liquidityUsd-y(N).liquidityUsd)[0];k&&k.poolId!==f.poolId&&(E={priceBestFee:f.fee,chosenFee:k.fee,chosenPoolUsd:y(k).liquidityUsd,bandBps:x},f=k)}let _=y(f),w=m[0]??null,O=_??w,v=e.liquidityUsd??_?.liquidityUsd??w?.liquidityUsd??null,g=e.liquidityUsd!=null?"caller":_?"pool":w?"pair":null;return ae({venue:"uniswap-v4",chainId:r,chain:De[r].name,poolManager:o,quoter:n,universalRouter:i||null,tokenIn:s,tokenOut:a,amountIn:c.toString(),fee:f.fee,tickSpacing:f.tickSpacing,hooks:f.poolKey.hooks,poolId:f.poolId,zeroForOne:f.zeroForOne,amountOut:f.amountOut,gasEstimate:f.gasEstimate,liquidityUsd:v,liquiditySource:O,liquidityAttribution:g,liquidityPick:E,triedTiers:p,best:!0,executionReady:!1,prepareReady:typeof e.recipient=="string"&&Vs(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&&!Zr(e.tokenIn)&&!Zr(e.tokenOut)&&(e.hookData==null||String(e.hookData).toLowerCase()==="0x")&&f.poolKey.hooks===we&&!(f.fee&Gs)},{chainId:r,venue:i||n,amountOut:f.amountOut,liquidityUsd:v,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps})}async function Bx(e={},t={}){let{chainId:r,quoter:n,poolManager:o,universalRouter:i}=en(e.chainId??8453),s=ur(e.tokenIn||"WETH",r),a=ur(e.tokenOut||De[r].usdc,r),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}]:[...Ws],l=e.hooks||we,p=await Promise.all(u.map(async h=>{let{poolKey:y,zeroForOne:x}=Xs({tokenIn:s,tokenOut:a,fee:h.fee,tickSpacing:h.tickSpacing,hooks:l}),E=wo.encodeFunctionData("quoteExactOutputSingle",[{poolKey:y,zeroForOne:x,exactAmount:c,hookData:"0x"}]);try{let _=await(t.rpcCall||Y)(r,"eth_call",[{to:n,data:E},"latest"],t);if(!_||_==="0x")return{...h,ok:!1,error:"empty result"};let w=wo.decodeFunctionResult("quoteExactOutputSingle",_);return{fee:h.fee,tickSpacing:h.tickSpacing,ok:!0,amountIn:w[0].toString(),gasEstimate:w[1].toString(),poolKey:y,zeroForOne:x,poolId:xo({...y})}}catch(_){return{...h,ok:!1,error:String(_.message||_).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=${r}: ${h}`)}let m=e.liquidityUsd==null?await gd({chainId:r,tokenA:s,tokenB:a,dexIds:Gd},t).catch(()=>null):null;return{venue:"uniswap-v4",chainId:r,chain:De[r].name,poolManager:o,quoter:n,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 Fx(e={},t={}){if(["operation","exactOutput","amountOut","multihop","path","positionManager","modifyLiquidities","commands","actions"].some(w=>Object.hasOwn(e,w)))throw new Error("uniswap-v4 unsupported operation shape is inspect/quote-only");let n=Number(e.chainId??8453),o=en(n);if(tn(e.hooks)!==we)throw new Error("uniswap-v4 nonzero hooks are inspect/quote-only until a code-hash-specific adapter exists");if(Number(e.fee)&Gs)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 s=Ze(e.recipient);if(e.slippageBps==null)throw new Error("uniswap-v4 prepare requires explicit slippageBps");let a=Number(e.slippageBps);if(!Number.isInteger(a)||a<0||a>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 c=Number(e.deadlineSeconds);if(!Number.isInteger(c)||c<30||c>600)throw new Error("deadlineSeconds must be an integer from 30 through 600");if(Zr(e.tokenIn)||Zr(e.tokenOut))throw new Error("uniswap-v4 prepare currently requires ERC-20 tokenIn and tokenOut; native routes are not inferred");let u=await ko(e,t);if(!o.universalRouter)throw new Error(`uniswap-v4: no Universal Router on chain ${n}`);let l=BigInt(u.amountOut)*BigInt(1e4-a)/10000n,d={currency0:u.zeroForOne?u.tokenIn:u.tokenOut,currency1:u.zeroForOne?u.tokenOut:u.tokenIn,fee:u.fee,tickSpacing:u.tickSpacing,hooks:u.hooks},f=Qr.encode(["tuple(tuple(address currency0,address currency1,uint24 fee,int24 tickSpacing,address hooks) poolKey,bool zeroForOne,uint128 amountIn,uint128 amountOutMinimum,uint256 minHopPriceX36,bytes hookData)"],[[d,u.zeroForOne,BigInt(u.amountIn),l,0n,"0x"]]),m=Qr.encode(["address","uint256"],[u.tokenIn,BigInt(u.amountIn)]),h=Qr.encode(["address","uint256"],[u.tokenOut,l]),y=Qr.encode(["bytes","bytes[]"],[Px,[f,m,h]]),E=Number(t.nowSeconds??Math.floor(Date.now()/1e3))+c,_=Tx.encodeFunctionData("execute",[Nx,[y],E]);return Q({provider:"uniswap-v4",prepareReady:!0,calldataReady:!0,executionReady:!1,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:n,deadline:E,quote:{...u,amountOutMinimum:l.toString(),slippageBps:a},hookInspection:null,requiresApproval:{token:u.tokenIn,spender:$x,amount:u.amountIn,note:"Universal Router V4 settlement uses Permit2; Permit2 authorization for the Universal Router is also required"},transaction:{chainId:n,from:s,to:o.universalRouter,data:_,value:"0"}},{provider:"uniswap-v4",kind:"univ4-swap-tx"})}async function Dx(){return Object.entries(De).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 Mx(e={}){let t=en(e.chainId??8453),r=await Y(t.chainId,"eth_getCode",[t.quoter,"latest"],e),n=typeof r=="string"&&r!=="0x"&&r.length>4;return{ok:n,chainId:t.chainId,quoter:t.quoter,poolManager:t.poolManager,codeBytes:n?(r.length-2)/2:0}}var Qr,we,De,Ws,wo,Tx,go,Wd,Rx,Gs,Nx,Px,$x,qx,Gd,Ys=A(()=>{ut();Gr();Ue();xe();Qr=Ox.defaultAbiCoder(),we="0x0000000000000000000000000000000000000000",De={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"}},Ws=[{fee:100,tickSpacing:1},{fee:500,tickSpacing:10},{fee:3e3,tickSpacing:60},{fee:1e4,tickSpacing:200},{fee:25e3,tickSpacing:8}],wo=new zs(["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)"]),Tx=new zs(["function execute(bytes commands,bytes[] inputs,uint256 deadline) payable"]),go=new zs(["function getSlot0(bytes32 poolId) view returns (uint160 sqrtPriceX96,int24 tick,uint24 protocolFee,uint24 lpFee)","function getLiquidity(bytes32 poolId) view returns (uint128 liquidity)"]),Wd=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"]]),Rx=(1n<<14n)-1n,Gs=8388608;Nx="0x10",Px="0x060c0f",$x="0x000000000022D473030F116dDEE9F6B43aC78BA3",qx="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE";Gd=["uniswap-v4","uniswapv4"]});function zx(e={}){return(e.baseUrl||process.env.DEFILLAMA_COINS_URL||jx).replace(/\/$/,"")}function Vx(e={}){return(e.baseUrl||process.env.DEFILLAMA_API_URL||Hx).replace(/\/$/,"")}async function So(e,t={}){if(!Array.isArray(e)||!e.length)throw new Error("llamaPrices requires coins[]");let r=e.map(encodeURIComponent).join(",");return C(`${zx(t)}/prices/current/${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function Xd(e={}){return C(`${Vx(e)}/protocols`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??2e4})}var jx,Hx,Js=A(()=>{j();jx="https://coins.llama.fi",Hx="https://api.llama.fi"});var Eo={};B(Eo,{ACROSS_API:()=>Yd,HOP_API:()=>Jd,RELAY_API:()=>Qd,acrossHealth:()=>Gx,acrossSuggestedFees:()=>Zd,hopHealth:()=>Kx,hopQuote:()=>ep,relayHealth:()=>Xx,relayPrepare:()=>Yx,relayQuote:()=>Qs});async function Gx(e={}){try{return{ok:!0,estimatedFillTimeSec:(await Zd({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 Zd(e={},t={}){let{token:r,destinationToken:n=r,originChainId:o,destinationChainId:i,amount:s}=e;if(!r||o==null||i==null||!s)throw new Error("acrossSuggestedFees requires token, originChainId, destinationChainId, amount");let a=new URLSearchParams({token:r,destinationToken:n,originChainId:String(o),destinationChainId:String(i),amount:String(s)}),c=(t.baseUrl||process.env.ACROSS_API_URL||Yd).replace(/\/$/,"");return C(`${c}/suggested-fees?${a}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function Kx(e={}){try{let t=await ep({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 ep(e={},t={}){let{amount:r,token:n="ETH",fromChain:o="ethereum",toChain:i="arbitrum"}=e;if(!r)throw new Error("hopQuote requires amount");let s=e.slippage==null?void 0:Math.round(Number(e.slippage)*100),a=at({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(r),token:n,fromChain:o,toChain:i,slippage:String(a.selectedBps/100)}),u=(t.baseUrl||process.env.HOP_API_URL||Jd).replace(/\/$/,""),l=await C(`${u}/quote?${c}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),d=l?.estimatedRecieved||l?.estimatedReceived;return d?ae(l,{chainId:Number(e.originChainId||e.chainId||Wx[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 Xx(e={}){try{let t=await Qs({user:gt,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 Qs(e={},t={}){let{user:r=gt,originChainId:n,destinationChainId:o,originCurrency:i="0x0000000000000000000000000000000000000000",destinationCurrency:s="0x0000000000000000000000000000000000000000",amount:a,tradeType:c="EXACT_INPUT"}=e;if(n==null||o==null||!a)throw new Error("relayQuote requires originChainId, destinationChainId, amount");let u=at({liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,crossChain:Number(n)!==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||Qd).replace(/\/$/,""),d=await C(`${l}/quote`,{method:"POST",body:{user:r,originChainId:Number(n),destinationChainId:Number(o),originCurrency:i,destinationCurrency:s,amount:String(a),tradeType:c,slippageTolerance:String(u.selectedBps)},fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4}),p=d?.details?.currencyOut?.amount;return!p||!/^\d+$/.test(String(p))?{...d,autoSlippagePolicy:u}:ae(d,{chainId:Number(n),venue:d?.steps?.[0]?.items?.[0]?.data?.to||"relay",amountOut:p,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,crossChain:Number(n)!==Number(o),requestedCapBps:e.maxSlippageBps??e.slippageBps})}async function Yx(e={},t={}){let r=await Qs(e,t),n=Number(e.originChainId),o=(r.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(r?.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:n,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:Oe(r.autoSlippage,{chainId:n,venue:a.to,data:a.data})}));return Q({provider:"relay",calldataReady:!0,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:n,quote:r,autoSlippage:r.autoSlippage,transactions:s},{provider:"relay",kind:"relay-tx"})}var Yd,Jd,Qd,Wx,Ao=A(()=>{j();Ue();Gn();xe();Yd="https://across.to/api",Jd="https://api.hop.exchange/v1",Qd="https://api.relay.link",Wx={ethereum:1,optimism:10,bsc:56,polygon:137,arbitrum:42161,avalanche:43114,base:8453}});function vo(e){if(!Array.isArray(e))return null;let t=0,r=!1;for(let n of e){let o=et(n?.amountUSD);o!=null&&(t+=o,r=!0)}return r?t:null}async function rp(e,t={}){let r=Fd[Number(e)];if(!r)return null;try{let n=await So([r],t);return et(n?.coins?.[r]?.price)}catch{return null}}async function Jx(e={}){try{let t=await Xd({...e,baseUrl:e.defillamaApiBaseUrl,timeoutMs:e.defillamaTimeoutMs??Math.min(Number(e.timeoutMs??5e3),5e3)});return Array.isArray(t)?t:[]}catch{return[]}}function Qx(e,t={}){let r=xt(t.tool||t.provider||t.bridge||t.protocol),n=[];return e==="lifi"&&r&&r!=="lifi"&&n.push(...tp[r]||[r]),n.push(...tp[xt(e)]||[e]),n}function Zx(e,t,r={}){let n=Array.isArray(e)?e:[],o=Qx(t,r).map(xt).filter(Boolean);for(let i of o){let s=n.find(c=>xt(c?.slug)===i||xt(c?.name)===i),a=et(s?.tvl);if(a!=null)return{liquidityUsd:a,protocol:s?.name??s?.slug??i}}for(let i of o){let s=n.find(c=>{let u=xt(c?.category);return!u.includes("bridge")&&!u.includes("crosschain")?!1:xt(c?.slug).includes(i)||xt(c?.name).includes(i)}),a=et(s?.tvl);if(a!=null)return{liquidityUsd:a,protocol:s?.name??s?.slug??i}}return null}function Zs({chainId:e,tokenIn:t,tokenOut:r,amountIn:n,taker:o,slippageBps:i,decimalsIn:s,decimalsOut:a,nativePriceUsd:c=null,destDecimalsPromise:u=null,opts:l={}}){let d=[];return d.push({source:"lifi",run:async()=>{let p=await Pt({fromChain:e,toChain:e,fromToken:t,toToken:r,fromAmount:n},l),f=p?.estimate??p?.[0]?.estimate;return{amountOut:f?.toAmount,minOut:f?.toAmountMin,gasUsd:vo(f?.gasCosts),feeUsd:vo(f?.feeCosts),oracleFeeBps:p?.oracleFee?.applies?p.oracleFee.bps:0,meta:{tool:p?.tool??p?.toolDetails?.name,oracleFee:p?.oracleFee??null}}}}),s!=null&&d.push({source:"paraswap",run:async()=>{let p=a??(await Promise.resolve(u))?.decimals;if(p==null)throw new Error("paraswap needs destination decimals; none supplied or resolvable");let f=await rr({chainId:e,srcToken:t,destToken:r,amount:n,srcDecimals:s,destDecimals:p},l),m=f?.priceRoute;return{amountOut:m?.destAmount,gasUsd:et(m?.gasCostUSD),oracleFeeBps:f?.oracleFee?.applies?f.oracleFee.bps:0,meta:{bestRoute:m?.bestRoute?.[0]?.swaps?.[0]?.swapExchanges?.[0]?.exchange,oracleFee:f?.oracleFee??null}}}}),process.env.ZEROX_API_KEY&&d.push({source:"0x",run:async()=>{let p=await nr({chainId:e,sellToken:t,buyToken:r,sellAmount:n,taker:o},l),f=null,m=p?.totalNetworkFee,h=await Promise.resolve(c);return m!=null&&h&&(f=Number(m)/1e18*h),{amountOut:p?.buyAmount,minOut:p?.minBuyAmount,gasUsd:f,meta:{source:p?.route?.fills?.[0]?.source}}}}),process.env.ONEINCH_API_KEY&&d.push({source:"1inch",run:async()=>{let p=await zd({chainId:e,src:t,dst:r,amount:n},l),f=null;return p?.gas!=null&&c&&(f=null),{amountOut:p?.dstAmount,gasUsd:f,meta:{gasUnits:p?.gas}}}}),d.push({source:"cow",run:async()=>{let p=await $t({chainId:e,sellToken:t,buyToken:r,sellAmountBeforeFee:String(n),from:o},l),f=p?.quote??p,m=f?.feeAmount;return{amountOut:f?.buyAmount,gasUsd:0,meta:{intent:!0,feeAmountInSellToken:m,settlement:"solver-executed"}}}}),De[Number(e)]&&d.push({source:"uniswap-v4",run:async()=>{let p=await ko({chainId:e,tokenIn:t,tokenOut:r,amountIn:n,recipient:o,slippageBps:i},l);return{amountOut:p?.amountOut,minOut:p?.minOut??p?.amountOutMinimum??null,gasUsd:null,liquidityUsd:p?.liquidityUsd??null,meta:{onchain:!0,venue:"uniswap-v4",fee:p?.fee,tickSpacing:p?.tickSpacing,poolId:p?.poolId,hooks:p?.hooks,gasUnits:p?.gasEstimate,quoter:p?.quoter,poolManager:p?.poolManager,prepareReady:p?.prepareReady===!0,executionReady:!1}}}}),ke[Number(e)]&&d.push({source:"uniswap-v3",run:async()=>{let p=await qt({chainId:e,tokenIn:t,tokenOut:r,amountIn:n},l);return{amountOut:p?.amountOut,minOut:p?.minOut??p?.amountOutMinimum??null,gasUsd:null,liquidityUsd:p?.liquidityUsd??null,meta:{onchain:!0,fee:p?.fee,gasUnits:p?.gasEstimate,quoter:p?.quoter}}}}),d}function np({fromChainId:e,toChainId:t,tokenIn:r,tokenOut:n,amountIn:o,taker:i,opts:s={}}){let a=[],c=null,u=async(l,d={})=>(c||=Jx(s),Zx(await c,l,d));return a.push({source:"lifi",run:async()=>{let l=await Pt({fromChain:e,toChain:t,fromToken:r,toToken:n,fromAmount:o},s),d=l?.estimate??l?.[0]?.estimate,p={tool:l?.tool??l?.toolDetails?.name,durationSeconds:et(d?.executionDuration)},f=await u("lifi",p);return{amountOut:d?.toAmount,minOut:d?.toAmountMin,gasUsd:vo(d?.gasCosts),feeUsd:vo(d?.feeCosts),oracleFeeBps:l?.oracleFee?.applies?l.oracleFee.bps:0,liquidityUsd:f?.liquidityUsd??null,meta:{...p,liquidityProtocol:f?.protocol,oracleFee:l?.oracleFee??null}}}}),a.push({source:"relay",run:async()=>{let{relayQuote:l}=await Promise.resolve().then(()=>(Ao(),Eo)),p=(await l({user:i,originChainId:e,destinationChainId:t,originCurrency:r,destinationCurrency:n,amount:String(o)},s))?.details,f={durationSeconds:et(p?.timeEstimate),rate:p?.rate},m=await u("relay",f);return{amountOut:p?.currencyOut?.amount,minOut:p?.currencyOut?.minimumAmount,gasUsd:et(p?.totalImpact?.usd)!=null?Math.abs(et(p.totalImpact.usd)):null,liquidityUsd:m?.liquidityUsd??null,meta:{...f,liquidityProtocol:m?.protocol}}}}),a.push({source:"across",run:async()=>{let{acrossSuggestedFees:l}=await Promise.resolve().then(()=>(Ao(),Eo)),d=await l({token:r,destinationToken:n,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 u("across");return{amountOut:f,gasUsd:null,liquidityUsd:m?.liquidityUsd??null,meta:{derivedFromFees:!0,durationSeconds:et(d?.estimatedFillTimeSec),limits:d?.limits?{min:d.limits.minDeposit,max:d.limits.maxDeposit}:void 0,liquidityProtocol:m?.protocol}}}}),a}var et,xt,tp,op=A(()=>{jr();Yn();eo();Vd();so();ho();Ys();Js();Hs();et=e=>{let t=Number(e);return Number.isFinite(t)?t:null};xt=e=>String(e??"").toLowerCase().replace(/[^a-z0-9]/g,""),tp=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 sp={};B(sp,{QUALITY:()=>Fe,bestBridgeRoute:()=>rn,bestSwapRoute:()=>lr,formatComparisonNote:()=>Io});async function ip(e,t,r){let n=ek[Number(e)];if(!n)return{priceUsd:null,decimals:null};let o=`${n}:${t}`;try{let s=(await So([o],r))?.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 lr(e,t={}){let{chainId:r,tokenIn:n,tokenOut:o,amountIn:i}=e;if(r==null||!n||!o||i==null)throw new Error("bestSwapRoute requires chainId, tokenIn, tokenOut, amountIn");let s=rp(r,t),a=ip(r,o,t),c=pd(r,t).catch(()=>null),u=Zs({...e,nativePriceUsd:s,decimalsOut:e.decimalsOut,destDecimalsPromise:a,opts:t}),[l,d,p]=await Promise.all([bo(u,{timeoutMs:t.timeoutMs??12e3}),a,c]);s.catch(()=>{});let f=await s.then(y=>y,()=>null),m=js(l,{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 Dd(async _=>{let w=Zs({...e,amountIn:_.toString(),nativePriceUsd:s,decimalsOut:e.decimalsOut,destDecimalsPromise:a,opts:t}).filter(v=>v.source===y);return w.length?(await bo(w,{timeoutMs:t.timeoutMs??12e3}))?.[0]?.amountOut??null:null},i);if(E){let _=Md(m,{[y]:E},{maxImpactPct:h});return{kind:"swap",chainId:r,tokenIn:n,tokenOut:o,amountIn:String(i),..._,sourcesTried:u.length,sourcesAnswered:l.filter(w=>w.quality!==Fe.FAILED).length,note:Io(_,u.length),priceImpact:{[y]:Number(E.impactPct.toFixed(2))}}}}return{kind:"swap",chainId:r,tokenIn:n,tokenOut:o,amountIn:String(i),...m,sourcesTried:u.length,sourcesAnswered:l.filter(y=>y.quality!==Fe.FAILED).length,note:Io(m,u.length)}}async function rn(e,t={}){let{fromChainId:r,toChainId:n,tokenIn:o,tokenOut:i,amountIn:s}=e;if(r==null||n==null||!o||!i||s==null)throw new Error("bestBridgeRoute requires fromChainId, toChainId, tokenIn, tokenOut, amountIn");if(Number(r)===Number(n))throw new Error("bestBridgeRoute is for cross-chain; use bestSwapRoute for same-chain");let a=ip(n,i,t),c=np({...e,opts:t}),[u,l]=await Promise.all([bo(c,{timeoutMs:t.timeoutMs??15e3}),a]),d=js(u,{destPriceUsd:l.priceUsd,destDecimals:e.decimalsOut??l.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:r,toChainId:n,tokenIn:o,tokenOut:i,amountIn:String(s),...d,durations:p,sourcesTried:c.length,sourcesAnswered:u.filter(f=>f.quality!==Fe.FAILED).length,note:Io(d,c.length)}}function tk(e){let t=e?.meta?.oracleFee;return t?.applies?` \xB7 ${Rl(t)}`:""}function Io(e,t){if(!e.best)return"no source returned a usable route";let r=e.routes.length,n=tk(e.best);if(r===1)return`only 1 of ${t} sources answered, so this is the ONLY route, not a proven best one. Treat it as unbenchmarked.`+n;if(e.improvementBps!=null){let o=e.improvementBps,i=o/100;if(o<.01)return`best of ${r} routes, ranked on ${e.rankedOn}: effectively tied with the runner-up (${e.spreadBasis}), inside quote noise. Re-quote before you size up.`+n;let s=i>=.01?`${i.toFixed(2)}%`:`${o.toFixed(2)}bps`;return`best of ${r} routes, ranked on ${e.rankedOn}: ${s} better than the runner-up (${e.spreadBasis})`+n}return`best of ${r} routes, ranked on ${e.rankedOn}. No spread quoted: the top routes report cost differently, so the margin is not comparable.`+n}var ek,dr=A(()=>{Hs();op();Xn();Js();ut();ek={1:"ethereum",10:"optimism",56:"bsc",137:"polygon",8453:"base",42161:"arbitrum",43114:"avax"}});var ap={};B(ap,{ARTIFACT:()=>lt,prepareBestRoute:()=>ak,supportedPreparers:()=>nk});function nk(){return Object.keys(_o)}async function ak(e,t={}){if(sk.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:r}=e;if(!r)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(!ik.test(r))throw new Error(`taker must be a valid 20-byte address, got "${r}"`);if(ok.has(r.toLowerCase()))throw new Error(`taker "${r}" 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 n=await lr(e,t);if(!n.best){let y=n.impactRejected??[];return{ok:!1,reason:y.length?y[0].reason:"no source returned a usable route",priceImpactBlocked:y.length>0,impactRejected:y,comparison:n}}let o=e.source||n.best.source,i=n.routes.find(y=>y.source===o);if(!i)return{ok:!1,reason:`source "${o}" did not return a usable route`,comparison:n};let s=_o[o];if(!s){let y=n.routes.find(x=>_o[x.source]&&x.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:n,winner:o}}let a;try{a=await s(e,t)}catch(y){let x=typeof y?.body=="string"?y.body:y?.body?JSON.stringify(y.body):"",E=[String(y?.message||y),x].filter(Boolean).join(" :: "),_=/allowance/i.test(E),w=!_&&/not enough|insufficient|balance/i.test(E),O,v;_?(v="approval-required-first",O=`${o} will not build swap calldata until the token approval exists on-chain. Approve the spender first, then prepare again. Underlying: ${E}`):w?(v="taker-not-funded",O=`${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.`):(v="provider-error",O=`${o} prepare failed: ${E}`);let g=n.routes.find(b=>_o[b.source]&&b.source!==o);return{ok:!1,reason:O,failureKind:v,...g?{alternative:g.source}:{},comparison:n}}let c=e.driftToleranceBps??rk,u=null,l=null;if(a.amountOut!=null&&i.grossOut!=null)try{let y=BigInt(i.grossOut),x=BigInt(a.amountOut);y>0n&&(u=Number((x-y)*10000n/y),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=n.routes.filter(y=>y.source!==o).map(y=>({source:y.source,netOut:y.netOut,gasUsd:y.gasUsd})),f=n.routes.map(y=>({source:y.source,liquidityUsd:y.liquidityUsd??null})).reduce((y,x)=>Math.max(y,x.liquidityUsd??0),0)||null,m=i.liquidityUsd??null,h=m!=null&&f>0?Math.round(m/f*100):null;return Q({ok:!0,chosen:{source:o,wasWinner:o===n.best.source,netOut:i.netOut,grossOut:i.grossOut,gasUsd:i.gasUsd,liquidityUsd:i.liquidityUsd??null},liquidity:{chosenUsd:m,maxUsd:f,sharePct:h},priceImpact:n.priceImpact??null,impactUnmeasured:n.impactUnmeasured??[],...a,unsigned:!0,signedBy:"user-wallet",destination:a.artifactKind===lt.TRANSACTION?a.transaction?.to??null:a.settlement??null,driftBps:u,warnings:[...l?[l]:[],...n.warnings||[],...a.artifactKind===lt.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:n.rankedOn,sourcesAnswered:n.sourcesAnswered,sourcesTried:n.sourcesTried,improvementBps:n.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 lt,rk,_o,ok,ik,sk,cp=A(()=>{dr();xe();lt=Object.freeze({TRANSACTION:"unsigned-transaction",TYPED_DATA_ORDER:"typed-data-order"}),rk=100,_o={"uniswap-v3":async({chainId:e,tokenIn:t,tokenOut:r,amountIn:n,taker:o},i)=>{let{uniV3PrepareExactIn:s}=await Promise.resolve().then(()=>(ho(),Od)),a=await s({chainId:e,tokenIn:t,tokenOut:r,amountIn:n,recipient:o},i);return{artifactKind:lt.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:r,amountIn:n,taker:o,slippageBps:i,deadlineSeconds:s,fee:a,tickSpacing:c,hooks:u},l)=>{let{uniV4PrepareExactIn:d}=await Promise.resolve().then(()=>(Ys(),Kd)),p=await d({chainId:e,tokenIn:t,tokenOut:r,amountIn:n,recipient:o,slippageBps:i,deadlineSeconds:s,fee:a,tickSpacing:c,hooks:u},l);return{artifactKind:lt.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:r,amountIn:n,taker:o},i)=>{let{lifiPrepare:s}=await Promise.resolve().then(()=>(jr(),_s)),a=await s({fromChain:e,toChain:e,fromToken:t,toToken:r,fromAmount:n,fromAddress:o},i);return{artifactKind:lt.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:r,amountIn:n,taker:o,decimalsIn:i,decimalsOut:s},a)=>{let{paraswapPrepare:c}=await Promise.resolve().then(()=>(Yn(),Bl)),u=await c({chainId:e,srcToken:t,destToken:r,amount:n,srcDecimals:i,destDecimals:s,userAddress:o,side:"SELL"},a);return{artifactKind:lt.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:r,amountIn:n,taker:o},i)=>{let{zeroxPrepare:s}=await Promise.resolve().then(()=>(eo(),Wl)),a=await s({chainId:e,sellToken:t,buyToken:r,sellAmount:n,taker:o},i);return{artifactKind:lt.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:r,amountIn:n,taker:o},i)=>{let{cowPrepareOrder:s}=await Promise.resolve().then(()=>(so(),cd)),a=await s({chainId:e,sellToken:t,buyToken:r,sellAmountBeforeFee:String(n),from:o},i);return{artifactKind:lt.TYPED_DATA_ORDER,typedData:a.typedData,requiresApproval:{token:t,spender:a.vaultRelayer,amount:String(n),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"}}};ok=new Set(["0x0000000000000000000000000000000000000000","0x000000000000000000000000000000000000dead","0x0000000000000000000000000000000000000001","0x00000000000000000000000000000000000a1ce5"].map(e=>e.toLowerCase())),ik=/^0x[0-9a-fA-F]{40}$/,sk=Object.freeze(["operation","exactOutput","amountOut","multihop","path","positionManager","modifyLiquidities","commands","actions"])});var up={};B(up,{prepareBestBridgeRoute:()=>pk,supportedBridgePreparers:()=>dk});function dk(){return Object.keys(Oo)}async function pk(e,t={}){let{taker:r,fromChainId:n,toChainId:o}=e;if(!r)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(!ck.test(r))throw new Error(`taker must be a valid 20-byte address, got "${r}"`);if(uk.has(r.toLowerCase()))throw new Error(`taker "${r}" 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 rn(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=Oo[s];if(!c){let y=i.routes.find(x=>Oo[x.source]&&x.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 u;try{u=await c(e,t)}catch(y){let x=typeof y?.body=="string"?y.body:y?.body?JSON.stringify(y.body):"",E=[String(y?.message||y),x].filter(Boolean).join(" :: "),_=/allowance/i.test(E),w=!_&&/not enough|insufficient|balance/i.test(E),O=i.routes.find(v=>Oo[v.source]&&v.source!==s);return{ok:!1,reason:_?`${s} will not build calldata until the token approval exists on-chain. Approve first, then prepare again. Underlying: ${E}`:w?`${s} refused to build: ${E}. Quoting works for any address; preparing needs the real funded wallet on chain ${n}.`:`${s} bridge prepare failed: ${E}`,failureKind:_?"approval-required-first":w?"taker-not-funded":"provider-error",...O?{alternative:O.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(y=>y.chainId!=null&&Number(y.chainId)!==Number(n));if(d.length)return{ok:!1,reason:`${s} returned a transaction for chain ${d[0].chainId} but the origin chain is ${n}. Refusing to hand over a mismatched artifact.`,failureKind:"chain-mismatch",comparison:i};let p=e.driftToleranceBps??lk,f=null,m=null;if(u.amountOut!=null&&a.grossOut!=null)try{let y=BigInt(a.grossOut),x=BigInt(u.amountOut);y>0n&&(f=Number((x-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 ~${u.durationSeconds!=null?`${u.durationSeconds}s`:"minutes"} before the destination credits, and do not re-send if it is pending.`];return l.length>1&&h.push(`This route needs ${l.length} transactions signed IN ORDER. Signing only the first leaves funds approved but not bridged.`),Q({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(n),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: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. ${l.length} transaction(s) on chain ${n}, crediting chain ${o}. Verify every destination address before signing.`},{provider:"router",kind:"best-bridge"})}var ck,uk,lk,Oo,lp=A(()=>{dr();xe();ck=/^0x[0-9a-fA-F]{40}$/,uk=new Set(["0x0000000000000000000000000000000000000000","0x000000000000000000000000000000000000dead","0x0000000000000000000000000000000000000001","0x00000000000000000000000000000000000a1ce5"].map(e=>e.toLowerCase())),lk=100,Oo={relay:async({fromChainId:e,toChainId:t,tokenIn:r,tokenOut:n,amountIn:o,taker:i},s)=>{let{relayPrepare:a}=await Promise.resolve().then(()=>(Ao(),Eo)),c=await a({user:i,originChainId:e,destinationChainId:t,originCurrency:r,destinationCurrency:n,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:r,tokenOut:n,amountIn:o,taker:i,isHolder:s},a)=>{let{lifiPrepare:c}=await Promise.resolve().then(()=>(jr(),_s)),u=await c({fromChain:e,toChain:t,fromToken:r,toToken:n,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 fp={};B(fp,{buildTwapSchedule:()=>pp,normalizeTwapParams:()=>dp,prepareTwapChunk:()=>gk,simulateTwap:()=>wk});function dp(e={}){let t=Math.max(fk,Math.min(mk,Number(e.splits)||yk)),r=Math.max(.1,Number(e.windowHours)||bk),n=Math.max(hk,r*3600),o=BigInt(e.amount)/BigInt(t),i=Math.floor(n/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:r,windowSec:n,intervalSec:i,taker:String(e.taker),slippageBps:s,status:"planned",createdAt:new Date().toISOString()}}function pp(e){let t=dp(e),r=Math.floor(Date.now()/1e3),n=[];for(let o=0;o<t.splits;o++)n.push({splitIndex:o+1,executeAfter:new Date((r+o*t.intervalSec)*1e3).toISOString(),chunkSize:t.chunkSize});return{params:t,schedule:n}}async function gk(e,t,{chainId:r,tokenIn:n,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 lr({chainId:r,tokenIn:n,tokenOut:o,amountIn:i,taker:s}),u=Q(c.transaction??c.tx,{chainId:r,taker:s,tokenIn:n,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 wk(e,{quoteFn:t=lr,...r}={}){let n=pp(e),o=[],i=0n,s="unknown";for(let c=0;c<n.params.splits;c++)try{let u=await t({chainId:n.params.chainId,tokenIn:n.params.tokenIn,tokenOut:n.params.tokenOut,amountIn:n.params.chunkSize,taker:n.params.taker},r),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(r.signal?.aborted)throw r.signal.reason||u;o.push({splitIndex:c+1,error:String(u.message||u).slice(0,200)})}let a=i>0n?(Number(i)/Number(BigInt(n.params.amount))).toFixed(6):null;return{params:n.params,schedule:n.schedule,totalOut:String(i),averagePrice:a,bestSource:s,chunks:o,simulatedAt:new Date().toISOString()}}var fk,mk,hk,yk,bk,mp=A(()=>{dr();xe();fk=2,mk=100,hk=60,yk=10,bk=6});async function bp({srcChainId:e,srcChainTokenIn:t,srcChainTokenInAmount:r,dstChainId:n,dstChainTokenOut:o,slippage:i=100,affiliateFeePercent:s="0"}={},a={}){if(!e||!n||!t||!o||!r)return{error:"debridge quote requires srcChainId, dstChainId, srcChainTokenIn, dstChainTokenOut, srcChainTokenInAmount"};if(!hp.has(Number(e))||!hp.has(Number(n)))return{error:`debridge: unsupported chain pair ${e} -> ${n}`};try{let c={srcChainId:String(e),srcChainTokenIn:t,srcChainTokenInAmount:String(r),dstChainId:String(n),dstChainTokenOut:o,slippage:i,affiliateFeePercent:s},u=await C(`${yp}/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 gp(){try{return{ok:!0,chainCount:(await C(`${yp}/supported-chains-info`))?.chains?.length??0}}catch(e){return{ok:!1,error:String(e.message||e).slice(0,160)}}}var yp,hp,wp=A(()=>{j();xe();yp="https://dln.debridge.finance/v1.0",hp=new Set([1,10,56,137,8453,42161,43114,59144,534352,7777777,324,5e3,1101,81457])});async function kp({active:e=!0}={},t={}){let r=Date.now();if(pr.size&&r-xp<xk)return[...pr.values()];try{let n=await C(`${ea}/exchange/currencies?active=${e?"true":"false"}`,t);pr.clear();for(let o of n??[])pr.set(String(o.ticker).toLowerCase(),o);return xp=r,n??[]}catch(n){return pr.size?[...pr.values()]:{error:String(n.message||n).slice(0,200)}}}async function kk(e,t,r={}){if(!e||!t)return{error:"changenow minAmount requires fromTicker and toTicker"};try{return{minAmount:(await C(`${ea}/exchange/min-amount/${encodeURIComponent(e)}_${encodeURIComponent(t)}`,r))?.minAmount??"0"}}catch(n){return{error:String(n.message||n).slice(0,200)}}}async function Sk(e,t,r,{flow:n="standard"}={},o={}){if(!e||!t||!r)return{error:"changenow estimate requires fromTicker, toTicker, fromAmount"};try{let i=new URLSearchParams({fromCurrency:String(e).toLowerCase(),toCurrency:String(t).toLowerCase(),fromAmount:String(r),flow:n}),s=await C(`${ea}/exchange/estimated-amount?${i}`,o);return{fromAmount:s?.fromAmount,toAmount:s?.toAmount,rate:s?.rate,flow:s?.flow??n}}catch(i){return{error:String(i.message||i).slice(0,200)}}}async function Sp({fromTicker:e,toTicker:t,fromAmount:r,flow:n}={},o={}){if(!e||!t)return{error:"changenow quote requires fromTicker and toTicker"};let i=await kk(e,t,o);if(i.error)return i;let s=r??i.minAmount,a=await Sk(e,t,s,{flow:n},o);if(a.error)return a;let c=await kp({},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 Ep(){try{let e=await kp();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 ea,pr,xp,xk,Ap=A(()=>{j();ea="https://api.changenow.io/v2",pr=new Map,xp=0,xk=6e5});async function vp({fromChain:e,toChain:t,fromToken:r,toToken:n,fromAmount:o,fromAddress:i,slippage:s=1}={},a={}){if(!e||!t||!r||!n||!o||!i)return{error:"squid quote requires fromChain, toChain, fromToken, toToken, fromAmount, fromAddress"};try{let c={fromChain:e,toChain:t,fromToken:r,toToken:n,fromAmount:String(o),fromAddress:i,slippage:s},u=await C(`${Ek}/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 Ek,Ip=A(()=>{j();Ek="https://api.squidrouter.com/v1"});async function _p({srcChainId:e,dstChainId:t,token:r,amount:n,dstGasForCall:o=0,minAmountOut:i="0"}={},s={}){if(!e||!t||!r||!n)return{error:"stargate quote requires srcChainId, dstChainId, token, amount"};try{let a=new URLSearchParams({srcChainId:String(e),dstChainId:String(t),token:r,amount:String(n),dstGasForCall:String(o),minAmountOut:String(i)}),c=await C(`${Ak}/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 Ak,Op=A(()=>{j();Ak="https://api.stargate.finance"});async function Cp({fromAsset:e,toAsset:t,amount:r,destination:n}={},o={}){if(!e||!t||!r)return{error:"thorchain quote requires fromAsset, toAsset, amount"};try{let i=new URLSearchParams({from_asset:e,to_asset:t,amount:String(r),destination:n||""}),s=await C(`${vk}/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 vk,Tp=A(()=>{j();vk="https://midgard.ninerealms.com/v2"});async function Rp({fromChainId:e,toChainId:t,fromToken:r,toToken:n,fromAmount:o,userAddress:i}={},s={}){if(!e||!t||!r||!n||!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:r,toTokenAddress:n,fromAmount:String(o),userAddress:i,sort:"output",singleTxOnly:"false"}),c=await C(`${Ik}/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 Ik,Np=A(()=>{j();Ik="https://api.socket.tech/v2"});async function Pp({originDomain:e,destinationDomain:t,originToken:r,destinationToken:n,amount:o}={},i={}){if(!e||!t||!r||!n||!o)return{error:"connext quote requires originDomain, destinationDomain, originToken, destinationToken, amount"};try{let s={originDomain:String(e),destinationDomain:String(t),originToken:r,destinationToken:n,amount:String(o)},a=await C(`${_k}/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 _k,$p=A(()=>{j();_k="https://api.connext.network"});async function qp({fromChain:e,toChain:t,token:r,amount:n}={},o={}){if(!e||!t||!r||!n)return{error:"wormhole quote requires fromChain, toChain, token, amount"};try{let i=new URLSearchParams({fromChain:String(e),toChain:String(t),token:r,amount:String(n)}),s=await C(`${Ok}/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 Ok,Lp=A(()=>{j();Ok="https://api.portalbridge.com/v1"});function Ck(e,t){return`0x${ra.getAmountsOut}`+Pe(e)+Pe(64)+Pe(t.length)+t.map(nn).join("")}function Tk(e){if(!e||e==="0x")return null;let t=e.slice(2);if(t.length<128)return null;let r=Number(BigInt(`0x${t.slice(64,128)}`));if(!Number.isFinite(r)||r<1||r>16)return null;let n=[];for(let o=0;o<r;o++){let i=128+o*64;if(t.length<i+64)return null;n.push(BigInt(`0x${t.slice(i,i+64)}`))}return n}function ta(e,t="router"){return(e?.venues||[]).find(n=>n.kind===t)?.address??null}function Rk(e,t){let r=Number(t);if(!Number.isFinite(r)||r<0)throw new Error("slippageBps must be a non-negative number");if(r>na)throw new Error(`slippageBps ${r} exceeds the ${na} 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(r))/10000n}function Up(e){let{chainId:t,wrappedNative:r}=e;async function n(o,i,s,a){let c=await Y(t,"eth_call",[{to:o,data:Ck(i,s)},"latest"],a);return Tk(c?.result??c)}return{async quote({tokenIn:o,tokenOut:i,amountIn:s,path:a},c={}){let u=ta(c.scanner);if(!u)return{chainId:t,evidence:U.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(p=>!/^0x[0-9a-fA-F]{40}$/.test(p||"")))throw new Error("quote requires valid 20-byte addresses");let d=await n(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:U.LIVE,note:"exact-input quote at current reserves; not a guaranteed fill"}:{chainId:t,router:u,path:l,evidence:U.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=ta(a.scanner),u=s||r;if(u&&String(o).toLowerCase()===String(u).toLowerCase())return{chainId:t,token:o,verdict:q.UNKNOWN,evidence:U.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:q.UNKNOWN,evidence:U.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 n(c,i,[u,o],a);if(!l)return{chainId:t,token:o,verdict:q.FAIL,evidence:U.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:q.FAIL,evidence:U.LIVE,leg:"buy",reason:"buy leg quotes zero output"};let p=await n(c,d,[o,u],a);if(!p)return{chainId:t,token:o,verdict:q.FAIL,evidence:U.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=q.PASS,y="round trip completes with expected fee/impact loss";return m<5e3?(h=q.FAIL,y=`round trip returns only ${(m/100).toFixed(2)}% -- punitive tax or no real liquidity`):m<9e3&&(h=q.CAUTION,y=`round trip returns ${(m/100).toFixed(2)}% -- transfer tax or thin liquidity at this size`),{chainId:t,token:o,base:u,router:c,verdict:h,reason:y,amountIn:String(i),bought:d.toString(),returned:f.toString(),retentionBps:m,evidence:U.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 p=d.scanner,f=ta(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=l||[o,i],h=await this.quote({tokenIn:o,tokenOut:i,amountIn:s,path:m},d);if(h.evidence!==U.LIVE)throw new Error(`cannot prepare without a live quote (${h.evidence}: ${h.reason??"no reason given"})`);let y=Rk(h.amountOut,c);if(y<=0n)throw new Error("computed minOut is zero -- refusing to prepare");let x=BigInt(Math.floor(Date.now()/1e3)+Number(u)),E=r&&m[0].toLowerCase()===r.toLowerCase()&&d.useNative,_=E?`0x${ra.swapExactETHForTokens}`+Pe(y)+Pe(128)+nn(a)+Pe(x)+Pe(m.length)+m.map(nn).join(""):`0x${ra.swapExactTokensForTokens}`+Pe(s)+Pe(y)+Pe(160)+nn(a)+Pe(x)+Pe(m.length)+m.map(nn).join("");return{unsigned:!0,signedBy:"user-wallet",chainId:t,tx:{to:f,data:_,value:E?`0x${BigInt(s).toString(16)}`:"0x0"},guard:{quotedOut:h.amountOut,minOut:y.toString(),slippageBps:c,maxSlippageBps:na,deadline:x.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 ra,Pe,nn,na,Bp=A(()=>{ut();wt();ra={getAmountsOut:"d06ca61f",swapExactTokensForTokens:"38ed1739",swapExactETHForTokens:"7ff36ab5"},Pe=e=>BigInt(e).toString(16).padStart(64,"0"),nn=e=>e.slice(2).toLowerCase().padStart(64,"0");na=100});function Pk(e,t){let r=Number(t);if(!Number.isFinite(r)||r<0)throw new Error("slippageBps must be a non-negative number");if(r>ia)throw new Error(`slippageBps ${r} exceeds the ${ia} 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(r))/10000n}function oa(e,t){return(e?.venues||[]).find(r=>r.kind===t)?.address??null}function Mp(e){let{chainId:t,wrappedNative:r}=e;async function n({quoter:i,tokenIn:s,tokenOut:a,amountIn:c,fee:u},l){let d=`0x${Fp.quoteExactInputSingle}`+on(s)+on(a)+Lt(c)+Lt(u)+Lt(0),p=await Y(t,"eth_call",[{to:i,data:d},"latest"],l).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},u){let l=await Promise.all(Nk.map(async p=>{let f=await n({quoter:i,tokenIn:s,tokenOut:a,amountIn:c,fee:p},u);return{fee:p,amountOut:f?f.toString():null,out:f}})),d=null;for(let p of l)p.out&&(!d||p.out>d.amountOut)&&(d={fee:p.fee,amountOut:p.out});return{best:d,tried:l.map(({fee:p,amountOut:f})=>({fee:p,amountOut:f}))}}return{async quote({tokenIn:i,tokenOut:s,amountIn:a},c={}){let u=oa(c.scanner,"quoter");if(!u)return{chainId:t,evidence:U.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(!Dp.test(p||""))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:!!r&&String(i).toLowerCase()===String(r).toLowerCase(),triedFeeTiers:d,evidence:U.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:U.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=oa(c.scanner,"quoter"),l=(e.stableQuoteAssets||[]).map(O=>String(O).toLowerCase()),d=null;!a&&typeof e.resolveQuoteAsset=="function"&&(d=await e.resolveQuoteAsset(i,c).catch(()=>null));let p=String(i).toLowerCase(),f=String(r||"").toLowerCase();if(f&&p===f)return{chainId:t,token:i,verdict:q.UNKNOWN,evidence:U.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]&&p!==l[0]?l[0]:null)||r;if(m&&p===String(m).toLowerCase())return{chainId:t,token:i,verdict:q.UNKNOWN,evidence:U.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:q.UNKNOWN,evidence:U.UNAVAILABLE,reason:u?"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:u,tokenIn:m,tokenOut:i,amountIn:s},c);if(!h.best){let O=l.find(v=>v&&v!==String(m).toLowerCase()&&v!==String(i).toLowerCase());if(O){let v=await o({quoter:u,tokenIn:O,tokenOut:i,amountIn:s},c);if(v.best){let g=await o({quoter:u,tokenIn:i,tokenOut:O,amountIn:v.best.amountOut},c);if(g.best){let b=g.best.amountOut,S=Number(b*10000n/BigInt(s)),k=q.PASS,N="round trip vs dollar book completes with expected fee/impact loss";return S<5e3?(k=q.FAIL,N=`round trip vs dollar book returns only ${(S/100).toFixed(2)}% -- punitive tax or no real liquidity`):S<9e3&&(k=q.CAUTION,N=`round trip vs dollar book returns ${(S/100).toFixed(2)}% -- transfer tax or thin liquidity at this size`),{chainId:t,venue:"uniswap-v3",token:i,base:O,quoteAsset:O,verdict:k,reason:N,amountIn:String(s),bought:v.best.amountOut.toString(),returned:b.toString(),retentionBps:S,buyFee:v.best.fee,sellFee:g.best.fee,evidence:U.LIVE,note:"Quoted against the dollar book, not wrapped native. A missing WETH pool is not a honeypot."}}}}return{chainId:t,token:i,verdict:q.FAIL,evidence:U.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:u,tokenIn:i,tokenOut:m,amountIn:h.best.amountOut},c);if(!y.best){let O=l.find(v=>v&&v!==String(m).toLowerCase()&&v!==String(i).toLowerCase());if(O){let v=await o({quoter:u,tokenIn:O,tokenOut:i,amountIn:s},c),g=v.best?await o({quoter:u,tokenIn:i,tokenOut:O,amountIn:v.best.amountOut},c):{best:null};if(v.best&&g.best){let b=g.best.amountOut,S=Number(b*10000n/BigInt(s)),k=q.PASS,N="round trip vs dollar book completes; missing WETH sell pool is not a honeypot";return S<5e3?(k=q.FAIL,N=`dollar-book round trip returns only ${(S/100).toFixed(2)}%`):S<9e3&&(k=q.CAUTION,N=`dollar-book round trip returns ${(S/100).toFixed(2)}%`),{chainId:t,venue:"uniswap-v3",token:i,base:O,quoteAsset:O,verdict:k,reason:N,amountIn:String(s),bought:v.best.amountOut.toString(),returned:b.toString(),retentionBps:S,buyFee:v.best.fee,sellFee:g.best.fee,evidence:U.LIVE,note:"Sell vs wrapped native failed; dollar book succeeded. Not labelled honeypot."}}}return{chainId:t,token:i,verdict:q.FAIL,evidence:U.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 x=y.best.amountOut,E=Number(x*10000n/BigInt(s)),_=q.PASS,w="round trip completes with expected fee/impact loss";return E<5e3?(_=q.FAIL,w=`round trip returns only ${(E/100).toFixed(2)}% -- punitive tax or no real liquidity`):E<9e3&&(_=q.CAUTION,w=`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:_,reason:w,amountIn:String(s),bought:h.best.amountOut.toString(),returned:x.toString(),retentionBps:E,buyFee:h.best.fee,sellFee:y.best.fee,evidence:U.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 p=oa(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(!Dp.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!==U.LIVE)throw new Error(`cannot prepare without a live quote (${f.evidence}: ${f.reason??"no reason given"})`);let m=l??f.fee,h=Pk(f.amountOut,u);if(h<=0n)throw new Error("computed minOut is zero -- refusing to prepare");let y=!!(d.useNative||f.useNative)&&r&&String(i).toLowerCase()===String(r).toLowerCase(),x=`0x${Fp.exactInputSingle}`+on(i)+on(s)+Lt(m)+on(c)+Lt(a)+Lt(h)+Lt(0);return{unsigned:!0,signedBy:"user-wallet",chainId:t,venue:"uniswap-v3",tx:{to:p,data:x,value:y?String(a):"0x0"},guard:{quotedOut:f.amountOut,minOut:h.toString(),slippageBps:u,maxSlippageBps:ia,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 Nk,Fp,Lt,on,Dp,ia,jp=A(()=>{ut();wt();Nk=[100,500,3e3,1e4],Fp={quoteExactInputSingle:"c6a5026a",exactInputSingle:"04e45aaf"},Lt=e=>BigInt(e).toString(16).padStart(64,"0"),on=e=>e.slice(2).toLowerCase().padStart(64,"0"),Dp=/^0x[0-9a-fA-F]{40}$/,ia=100});function Hp(e){if(!e||e==="0x")return null;try{return BigInt(e)}catch{return null}}function zp(e){if(!e||e==="0x")return null;let t=e.slice(2);if(t.length>=128){let n=Number(BigInt(`0x${t.slice(64,128)}`));if(n>0&&n<=256&&t.length>=128+n*2){let o=t.slice(128,128+n*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 $k(e){let{chainId:t}=e;async function r(n,o,i){return Y(t,"eth_call",[{to:n,data:o},"latest"],i)}return{async blockNumber(n={}){let o=await uo(t,n);return{chainId:t,blockNumber:o?.blockNumber??o,evidence:U.LIVE}},async nativeBalance(n,o={}){let i=await fd(t,n,o);return{chainId:t,address:n,wei:i?.wei??i?.balance??null,symbol:e.nativeCurrency?.symbol??null,decimals:e.nativeCurrency?.decimals??18,evidence:U.LIVE}},async tokenBalance({token:n,owner:o},i={}){let s=await hd({chainId:t,token:n,owner:o},i);return{chainId:t,token:n,owner:o,raw:s?.balance??s,evidence:U.LIVE}},async resolveToken(n,o={}){if(!/^0x[0-9a-fA-F]{40}$/.test(n||""))return{chainId:t,token:n,evidence:U.UNKNOWN,error:"resolveToken needs a 20-byte address; symbol lookup is a market-data concern"};let[i,s,a,c]=await Promise.all([r(n,Co.decimals,o).catch(()=>null),r(n,Co.symbol,o).catch(()=>null),r(n,Co.name,o).catch(()=>null),r(n,Co.totalSupply,o).catch(()=>null)]),u=Hp(i?.result??i),l=u!==null||s?.result||a?.result;return{chainId:t,address:n,decimals:u===null?null:Number(u),symbol:zp(s?.result??s),name:zp(a?.result??a),totalSupply:(Hp(c?.result??c)??null)?.toString()??null,evidence:l?U.LIVE:U.UNKNOWN,warning:l?void 0:"no ERC-20 metadata returned -- may not be a token contract"}},async resolvePools(n,o={}){let i=e.dexscreenerSlug;if(!i)return{chainId:t,token:n,pools:[],evidence:U.UNAVAILABLE,reason:"no dexscreenerSlug configured for this chain; pool discovery is unavailable rather than guessed"};let s=await po(n,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=lo(n,c,{stables:e.stableQuoteAssets||[],wrappedNative:e.wrappedNative});return{chainId:t,token:n,pools:u,topPool:u[0]||null,quoteAsset:bd(n,u),evidence:u.length?U.LIVE:U.UNKNOWN}},async scanBlocks({fromBlock:n,toBlock:o,address:i,topics:s,chunkSize:a=2e3}={},c={}){if(!Number.isInteger(n)||!Number.isInteger(o))throw new Error("scanBlocks requires integer fromBlock and toBlock");if(o<n)throw new Error("toBlock must be >= fromBlock");let u=[],l=[];for(let p=n;p<=o;p+=a){let f=Math.min(p+a-1,o);l.push([p,f])}let d=await Vt(l,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 Y(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:n,toBlock:o,logs:u,complete:!1,failedAt:[p,f],error:m.error,evidence:U.UNKNOWN};for(let h of m?.result??m??[])u.push(h)}return{chainId:t,fromBlock:n,toBlock:o,logs:u,complete:!0,chunks:l.length,evidence:U.LIVE}},async scoreRisk(n,o={}){let i=[],s=q.PASS,a=l=>{let d={[q.PASS]:0,[q.CAUTION]:1,[q.UNKNOWN]:2,[q.FAIL]:3};d[l]>d[s]&&(s=l)},[c,u]=await Promise.all([this.resolveToken(n,o),this.resolvePools(n,o)]);if(c.evidence!==U.LIVE?(i.push({check:"erc20-metadata",result:q.UNKNOWN,detail:c.warning}),a(q.UNKNOWN)):i.push({check:"erc20-metadata",result:q.PASS,detail:`${c.symbol} / ${c.decimals}d`}),u.evidence===U.UNAVAILABLE)i.push({check:"liquidity",result:q.UNKNOWN,detail:u.reason}),a(q.UNKNOWN);else if(!u.pools.length)i.push({check:"liquidity",result:q.FAIL,detail:"no pool with liquidity found"}),a(q.FAIL);else{let l=u.pools[0],d=l.liquidityUsd??0;d<5e3?(i.push({check:"liquidity",result:q.CAUTION,detail:`top pool only $${d}`}),a(q.CAUTION)):i.push({check:"liquidity",result:q.PASS,detail:`$${d} on ${l.dex}`}),l.createdAt&&Date.now()-l.createdAt<24*3600*1e3&&(i.push({check:"age",result:q.CAUTION,detail:"pool under 24h old"}),a(q.CAUTION))}if(typeof this.sellSimulation=="function"){let l=await this.sellSimulation({token:n,amountIn:(10n**16n).toString()},o).catch(d=>({verdict:q.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:q.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(q.UNKNOWN);return{chainId:t,token:n,verdict:s,checks:i,note:"Structural checks only. UNKNOWN is not PASS. A token is not tradeable until a sell simulation succeeds."}}}}function sa(e){let r={...$k(e)},n=new Set((e.venues||[]).map(i=>i.kind));e.venueKind==="uniswap-v3"&&n.has("quoter")&&n.has("router")?Object.assign(r,Mp({chainId:e.chainId,wrappedNative:e.wrappedNative,stableQuoteAssets:e.stableQuoteAssets||[],resolveQuoteAsset:async(i,s)=>(await r.resolvePools(i,s)).quoteAsset||null})):e.venueKind==="uniswap-v2"&&n.has("router")&&Object.assign(r,Up({chainId:e.chainId,wrappedNative:e.wrappedNative}));let o={};for(let[i,s]of Object.entries(r))o[i]=s.bind(r);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 Co,Vp=A(()=>{ut();Gr();j();wt();Bp();jp();Bs();Co={decimals:"0x313ce567",symbol:"0x95d89b41",name:"0x06fdde03",totalSupply:"0x18160ddd",owner:"0x8da5cb5b"}});function To(){return sn.map(e=>yo(sa(e)))}function Wp(e){return yo(sa(e))}var sn,Ro=A(()=>{Vp();wt();sn=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{Interface as Qp,getAddress as qk,id as Zp}from"ethers";function fr(e){return e?.cache===!1?!1:!e?.fetchImpl||e.cache===!0}function ua(e,t,r){let n=e.get(t);return n?Date.now()-n.at>r?(e.delete(t),null):n:null}function No(e,t,r,n){for(e.delete(t),e.set(t,{at:Date.now(),value:r});e.size>n;){let o=e.keys().next();if(o.done)break;e.delete(o.value)}}function Qk(e,t){try{return qk(e).toLowerCase()}catch{throw new Error(`${t} must be a valid EVM address`)}}function Zk(e){return`0x${e.slice(2).toLowerCase().padStart(64,"0")}`}function Jp(e){return`0x${String(e).slice(-40).toLowerCase()}`}function eS({unlimited:e,spenderLabel:t,lastActivityAt:r}){if(e)return"unlimited";if(!t)return"unknown-spender";if(r){let n=Date.parse(r);if(Number.isFinite(n)&&Date.now()-n>Wk)return"stale"}return"scoped"}function tS(e,t,r){if(r)return"UNLIMITED";if(t==null)return e.toString();let n=10n**BigInt(t),o=e/n,i=e%n;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 rS(e,t,r,n){let o=`${e}:${t}`,i=n?.get(o);if(i)return i;if(fr(r)){let a=ua(Xp,o,Gk);if(a)return a.value}let s=(async()=>{let a=async d=>{try{let p=Gp.encodeFunctionData(d,[]),f=await Y(e,"eth_call",[{to:t,data:p},"latest"],r);return!f||f==="0x"?null:Gp.decodeFunctionResult(d,f)[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 fr(r)&&No(Xp,o,l,Yk),l})();return n?.set(o,s),s}async function nS(e,t,r){let n=Math.min(Math.max(Number(r.lookbackBlocks)||Uk,1),Bk),o=await uo(e,r);if(!Number.isFinite(o))throw new Error("chain head unavailable");let i=Math.max(0,o-n),s=await Y(e,"eth_getLogs",[{fromBlock:`0x${i.toString(16)}`,toBlock:"latest",topics:[Lk,Zk(t)]}],r);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}:${Jp(l)}`,{token:u,spender:Jp(l)})}return{pairs:[...a.values()],fromBlock:i,toBlock:o}}function oS(e){return(Hk[e]||[]).flatMap(r=>Dk.map(n=>({token:r.address,spender:n.address,symbol:r.symbol,decimals:r.decimals})))}async function iS(e,t,r={}){let n=[],o="direct-probe",i=null,s=oS(e),a=ca(e),c=fr(r)&&ua(aa,e,Kk)?.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 nS(e,t,r);n=u.pairs,o="log-scan",i={fromBlock:u.fromBlock,toBlock:u.toBlock},fr(r)&&No(aa,e,!0,64)}catch{if(fr(r)&&No(aa,e,!1,64),n=s,n.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 Vt(n,r.concurrency||4,async f=>{try{let m=await md({chainId:e,token:f.token,owner:t,spender:f.spender},r),h=BigInt(m.allowance);if(h<=0n)return null;let y=f.symbol?{symbol:f.symbol,decimals:f.decimals??null}:await rS(e,f.token,r,u),x=h>=Vk,E=Fk[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:tS(h,y.decimals,x),unlimited:x,lastActivityAt:null,risk:eS({unlimited:x,spenderLabel:E,lastActivityAt:null})}}catch{return null}})).filter(Boolean),p=await aS(e,t,r);return{scan:{chainId:e,status:"ok",method:o,pairsProbed:n.length,collectionsProbed:ca(e).length,...i||{}},approvals:[...d,...p]}}catch(u){return{scan:{chainId:e,status:"unavailable",method:o,error:String(u?.message||u).slice(0,200)},approvals:[]}}}async function sS(e,t,r,n,o){try{let i=Kp.encodeFunctionData("isApprovedForAll",[r,n]),s=await Y(e,"eth_call",[{to:t,data:i},"latest"],o);return!s||s==="0x"?null:!!Kp.decodeFunctionResult("isApprovedForAll",s)[0]}catch{return null}}function ca(e){return(jk[e]||[]).flatMap(r=>Mk.map(n=>({collection:r.address,collectionName:r.name,operator:n.address,operatorLabel:n.label})))}async function aS(e,t,r){let n=ca(e);return n.length===0?[]:(await Vt(n,r.concurrency||4,async i=>await sS(e,i.collection,t,i.operator,r)!==!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 ef(e={},t={}){let r=Qk(e.owner||e.address,"owner"),n=new Map(sn.map(f=>[f.chainId,f])),o=Array.isArray(e.chainIds)&&e.chainIds.length?[...new Set(e.chainIds.map(Number))].filter(f=>n.has(f)):[...n.keys()],i=`${r}:${[...o].sort((f,m)=>f-m).join(",")}:${e.lookbackBlocks??""}`,s=fr(t)&&!e.refresh;if(s){let f=ua(Yp,i,Xk);if(f)return{...f.value,cached:!0,cachedAgeMs:Date.now()-f.at}}let a=await Vt(o,e.concurrency||3,f=>iS(f,r,{...t,lookbackBlocks:e.lookbackBlocks})),c=a.flatMap(f=>f.approvals),u=a.map(f=>f.scan),l=u.find(f=>f.method==="log-scan"&&f.toBlock),d=u.some(f=>f.method==="direct-probe"&&f.status==="ok"),p={provider:"approvals",operation:"scan",readOnly:!0,queriedAt:new Date().toISOString(),owner:r,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&&No(Yp,i,p,Jk),{...p,cached:!1,cachedAgeMs:0}}var Gp,Kp,Lk,xT,Uk,Bk,Fk,Dk,Mk,jk,Hk,zk,Vk,Wk,Gk,Kk,Xk,Yk,Jk,Xp,aa,Yp,tf=A(()=>{Ro();j();ut();Gp=new Qp(["function decimals() view returns (uint8)","function symbol() view returns (string)"]),Kp=new Qp(["function isApprovedForAll(address owner, address operator) view returns (bool)","function name() view returns (string)"]),Lk=Zp("Approval(address,address,uint256)"),xT=Zp("ApprovalForAll(address,address,bool)"),Uk=1e4,Bk=2e5,Fk=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)"}),Dk=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"}]),Mk=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"}]),jk=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"}]}),Hk=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}]}),zk=(1n<<256n)-1n,Vk=zk/2n,Wk=4320*60*60*1e3,Gk=360*60*1e3,Kk=600*1e3,Xk=45*1e3,Yk=512,Jk=128,Xp=new Map,aa=new Map,Yp=new Map});var of={};B(of,{aggregateBridgeQuotes:()=>rf,bridgeAggregatorHealth:()=>uS,checkRevokeNeeded:()=>nf,scanBridgeRoutes:()=>cS});async function rf(e={},t={}){let{fromChainId:r,toChainId:n,tokenIn:o,tokenOut:i,amount:s,taker:a,fromSymbol:c="?",toSymbol:u="?",fromDecimals:l=18,toDecimals:d=18}=e,p=[],f=[],m=bp({srcChainId:r,srcChainTokenIn:o,srcChainTokenInAmount:s,dstChainId:n,dstChainTokenOut:i},t).then(b=>b.error?(f.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=>(f.push(`debridge: ${b.message}`),null)),h=rn({fromChainId:r,toChainId:n,tokenIn:o,tokenOut:i,amountIn:s,taker:a},t).then(b=>!b||b.error?(f.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=>(f.push(`lifi: ${b.message}`),null)),y=vp({fromChain:r,toChain:n,fromToken:o,toToken:i,fromAmount:s,fromAddress:a},t).then(b=>b.error?(f.push(`squid: ${b.error}`),null):{provider:"squid",amountOut:b.toAmount,feeUsd:Array.isArray(b.fee)?b.fee.reduce((S,k)=>S+(Number(k.amountUsd)||0),0):null,estimatedTime:"30s - 3min",preparable:!1,raw:b}).catch(b=>(f.push(`squid: ${b.message}`),null)),x=_p({srcChainId:r,dstChainId:n,token:o,amount:s},t).then(b=>b.error?(f.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=>(f.push(`stargate: ${b.message}`),null)),E=Cp({fromAsset:c,toAsset:u,amount:s,destination:a},t).then(b=>b.error?(f.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=>(f.push(`thorchain: ${b.message}`),null)),_=(async()=>{if(!c||!u||c==="?"||u==="?")return f.push("changenow: ticker symbols required, skipping"),null;try{let b=await Sp({fromTicker:c,toTicker:u,fromAmount:s},t);return b.error?(f.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 f.push(`changenow: ${b.message}`),null}})(),w=Rp({fromChainId:r,toChainId:n,fromToken:o,toToken:i,fromAmount:s,userAddress:a},t).then(b=>b.error?(f.push(`bungee: ${b.error}`),null):{provider:"bungee",amountOut:b.amountOut,feeUsd:b.feeUsd,estimatedTime:b.estimatedTime,preparable:!1,raw:b}).catch(b=>(f.push(`bungee: ${b.message}`),null)),O=Pp({originDomain:r,destinationDomain:n,originToken:o,destinationToken:i,amount:s},t).then(b=>b.error?(f.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=>(f.push(`connext: ${b.message}`),null)),v=qp({fromChain:r,toChain:n,token:o,amount:s},t).then(b=>b.error?(f.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=>(f.push(`wormhole: ${b.message}`),null)),g=await Promise.allSettled([m,h,y,x,E,w,O,v,_]);for(let b of g)b.status==="fulfilled"&&b.value&&p.push(b.value);return p.sort((b,S)=>{let k=Number(b.amountOut??0),N=Number(S.amountOut??0);return k!==N?N-k:b.preparable&&!S.preparable?-1:!b.preparable&&S.preparable?1:0}),{providers:p.map(b=>b.provider),bestRoute:p[0]?.provider??"none",winner:p[0]??null,runnersUp:p.slice(1),errors:f.length?f:null}}async function nf({chainId:e,taker:t,tokenIn:r}={},n={}){if(!e||!t)return{needsRevoke:!1,note:"no wallet to check"};try{let i=(await ef({chainIds:[e],address:t},n)).approvals;if(!i?.length)return{needsRevoke:!1,note:"no active approvals found"};let s=r?i.find(a=>String(a.token).toLowerCase()===String(r).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 cS(e={},t={}){let[r,n]=await Promise.all([rf(e,t),nf({chainId:e.fromChainId,taker:e.taker,tokenIn:e.tokenIn},t)]),o=r.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:r.providers,runnersUp:r.runnersUp,revokeCheck:n,errors:r.errors,confidence:r.providers.length>=2?.85:r.providers.length===1?.6:.1}}async function uS(){let[e,t]=await Promise.all([gp().catch(r=>({ok:!1,error:r.message})),Ep().catch(r=>({ok:!1,error:r.message}))]);return{debridge:e,changenow:t,lifi:{ok:!0,note:"integrated via router"}}}var WT,sf=A(()=>{dr();wp();Ap();Ip();Op();Tp();Np();$p();Lp();tf();WT=Object.freeze(["debridge","lifi-relay","squid","stargate","thorchain","bungee","connext","wormhole","changenow"])});var af={};B(af,{DYDX_API:()=>Po,dydxHealth:()=>fS,dydxMarkets:()=>dS,dydxOrderbook:()=>pS});function an(e){if(e==null||e==="")return null;let t=Number(e);return Number.isFinite(t)?t:null}function lS(e){let t=e?.markets;return Array.isArray(t)?t:t&&typeof t=="object"?Object.values(t):[]}async function dS(e=50,t={}){try{let r=await C(`${Po}/v4/perpetualMarkets?limit=${e}`,t);return lS(r).map(o=>{let i=an(o?.nextFundingRate),s=an(o?.oraclePrice),a=an(o?.openInterest),c=an(o?.volume24H),u=an(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(r){return{error:String(r.message||r).slice(0,200),venue:"dydx",quality:"FAILED"}}}async function pS(e){try{let t=await C(`${Po}/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 fS(){try{return{ok:!0,serverTime:(await C(`${Po}/v4/time`))?.iso}}catch(e){return{ok:!1,error:String(e.message||e).slice(0,160)}}}var Po,cf=A(()=>{j();Po="https://indexer.dydx.trade"});var pf={};B(pf,{DRIFT_API:()=>lf,driftHealth:()=>mS,driftMarkets:()=>df});async function df(e={}){try{let r=(await C(`${lf}/v2/markets`,e))?.markets;return!Array.isArray(r)||r.length===0?{error:uf,venue:"drift",quality:"FAILED"}:r.map(n=>({symbol:n?.symbol||n?.marketIndex,coin:n?.symbol,oraclePrice:n?.amm?.oraclePrice,markPrice:n?.amm?.markPrice,fundingRate:n?.amm?.lastFundingRate?`${(Number(n.amm.lastFundingRate)*100).toFixed(4)}%`:null,openInterest:{long:n?.amm?.longFunding,short:n?.amm?.shortFunding},volume24h:n?.amm?.quoteAssetVolume,venue:"drift",quality:"LIVE"}))}catch(t){return{error:`${uf} (${String(t.message||t).slice(0,120)})`,venue:"drift",quality:"FAILED"}}}async function mS(){let e=await df();return e?.error?{ok:!1,error:e.error,quality:"FAILED"}:{ok:!0,note:"Drift v2 perps on Solana",quality:"LIVE"}}var lf,uf,ff=A(()=>{j();lf="https://dlob.drift.trade",uf="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 yf={};B(yf,{VERTEX_API:()=>la,vertexHealth:()=>yS,vertexMarkets:()=>hf,vertexOrderbook:()=>hS});async function hf(e={}){try{let r=(await C(`${la}/query`,{...e,method:"POST",body:JSON.stringify({all_markets:{}}),headers:{"content-type":"application/json",...e.headers||{}}}))?.data?.all_markets;return!Array.isArray(r)||r.length===0?{error:mf,venue:"vertex",quality:"FAILED"}:r.map(n=>({market:n?.market,type:n?.type,oraclePrice:n?.oracle_price_x18?(Number(BigInt(n.oracle_price_x18))/1e18).toFixed(4):null,minSize:n?.min_size,productId:n?.product_id,venue:"vertex",quality:"LIVE"}))}catch(t){return{error:`${mf} (${String(t.message||t).slice(0,120)})`,venue:"vertex",quality:"FAILED"}}}async function hS(e){try{let r=(await C(`${la}/query`,{method:"POST",body:JSON.stringify({market_liquidity:{product_id:Number(e),depth:5}}),headers:{"content-type":"application/json"}}))?.data?.market_liquidity;return{bids:r?.bids||[],asks:r?.asks||[]}}catch(t){return{error:String(t.message||t).slice(0,200),quality:"FAILED"}}}async function yS(){let e=await hf();return e?.error?{ok:!1,error:e.error,quality:"FAILED"}:{ok:!0,status:"ok",quality:"LIVE"}}var la,mf,bf=A(()=>{j();la="https://gateway.prod.vertexprotocol.com/v2",mf="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 gf={};B(gf,{pancakeHealth:()=>wS,pancakeQuote:()=>gS});async function gS({chainId:e=56,tokenIn:t,tokenOut:r,amountIn:n,fee:o=500}={},i={}){if(!t||!r||!n)return{error:"pancake quote requires tokenIn, tokenOut, amountIn"};try{let s={tokenIn:String(t).toLowerCase(),tokenOut:String(r).toLowerCase(),amountIn:String(n),fee:String(o)},a=await C(`${bS}/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 wS(){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 bS,wf=A(()=>{j();bS="https://api.thegraph.com/subgraphs/name/pancakeswap/exchange-v3-bsc"});var kf={};B(kf,{sushiHealth:()=>SS,sushiQuote:()=>kS});async function kS({chainId:e=1,tokenIn:t,tokenOut:r,amountIn:n,fee:o=500}={},i={}){if(!t||!r||!n)return{error:"sushi quote requires tokenIn, tokenOut, amountIn"};try{let s=`{ quote(tokenIn:"${t}",tokenOut:"${r}",amountIn:"${n}",fee:${o}) { amountOut route } }`,a=await C(`${xS(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 SS(){try{return{ok:!0,chains:Object.keys(xf).length+" chains"}}catch(e){return{ok:!1,error:String(e.message||e).slice(0,160)}}}var xS,xf,Sf=A(()=>{j();xS=e=>`https://api.thegraph.com/subgraphs/name/sushi-v3/v3-${xf[e]||"ethereum"}`,xf={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 Ef={};B(Ef,{raydiumHealth:()=>vS,raydiumQuote:()=>AS});async function AS({inputMint:e,outputMint:t,amount:r,slippageBps:n=50}={},o={}){if(!e||!t||!r)return{error:"raydium quote requires inputMint, outputMint, amount"};try{let i=new URLSearchParams({inputMint:e,outputMint:t,amount:String(r),slippageBps:String(n),onlyDirectRoutes:"true"}),s=await C(`${ES}/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 vS(){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 ES,Af=A(()=>{j();ES="https://quote-api.jup.ag/v6"});var vf={};B(vf,{AEVO_API:()=>da,aevoHealth:()=>_S,aevoMarkets:()=>IS});async function IS(e={}){try{return(await C(`${da}/markets`,e)||[]).map(r=>({instrument:r?.instrument_name,type:r?.instrument_type,markPrice:r?.mark_price,indexPrice:r?.index_price,fundingRate:r?.funding_rate?`${(Number(r.funding_rate)*100).toFixed(4)}%`:null,openInterest:r?.open_interest,volume24h:r?.volume_24h}))}catch(t){return{error:String(t.message||t).slice(0,200)}}}async function _S(){try{return{ok:(await C(`${da}/ping`))?.status==="ok"}}catch(e){return{ok:!1,error:String(e.message||e).slice(0,160)}}}var da,If=A(()=>{j();da="https://api.aevo.xyz"});var ha={};B(ha,{BINANCE_DEFAULT_FUNDING_INTERVAL_HOURS:()=>Cf,BINANCE_FUTURES_API:()=>Of,BINANCE_SPOT_API:()=>_f,binanceFunding:()=>qo,binanceFundingHistory:()=>RS,binanceHealth:()=>fa,binanceMarkPrice:()=>CS,binanceOpenInterest:()=>TS,binanceOrderbook:()=>OS,binanceSymbol:()=>mr,binanceTicker:()=>ma,normalizeBook:()=>hr});function pa(e={}){return(e.spotBaseUrl||e.baseUrl||process.env.BINANCE_API_URL||_f).replace(/\/$/,"")}function $o(e={}){return(e.futuresBaseUrl||process.env.BINANCE_FAPI_URL||Of).replace(/\/$/,"")}function cn(e){return{error:String(e.message||e).slice(0,200)}}function Ce(e){let t=Number(e);return Number.isFinite(t)?t:null}function mr(e,t="USDT"){let r=String(e||"").trim().toUpperCase().replace(/[-_/]/g,"");return r?r.endsWith(t)?r:`${r}${t}`:""}async function fa(e={}){try{let t=await C(`${pa(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 ma(e={},t={}){let r=mr(e.symbol||e.coin,e.quote||"USDT");if(!r)return{error:"binanceTicker requires symbol or coin"};try{let n=e.full?"/api/v3/ticker/24hr":"/api/v3/ticker/price",o=await C(`${pa(t)}${n}?symbol=${encodeURIComponent(r)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3});return{venue:"binance",market:"spot",symbol:r,price:Ce(o?.price??o?.lastPrice),volume24h:Ce(o?.volume),quoteVolume24h:Ce(o?.quoteVolume),raw:o}}catch(n){return cn(n)}}async function OS(e={},t={}){let r=mr(e.symbol||e.coin,e.quote||"USDT");if(!r)return{error:"binanceOrderbook requires symbol or coin"};let n=Math.min(Math.max(Number(e.limit)||20,1),1e3),o=String(e.market||"spot").toLowerCase()==="perp";try{let i=o?`${$o(t)}/fapi/v1/depth?symbol=${encodeURIComponent(r)}&limit=${n}`:`${pa(t)}/api/v3/depth?symbol=${encodeURIComponent(r)}&limit=${n}`,s=await C(i,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3});return hr({venue:"binance",market:o?"perp":"spot",symbol:r,bids:s?.bids,asks:s?.asks,raw:s})}catch(i){return cn(i)}}async function qo(e={},t={}){let r=mr(e.symbol||e.coin,e.quote||"USDT");if(!r)return{error:"binanceFunding requires symbol or coin"};try{let n=await C(`${$o(t)}/fapi/v1/premiumIndex?symbol=${encodeURIComponent(r)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),o=Array.isArray(n)?n[0]:n,i=Number(e.fundingIntervalHours)||Cf,s=Ce(o?.lastFundingRate);return{venue:"binance",market:"perp",symbol:r,markPrice:Ce(o?.markPrice),indexPrice:Ce(o?.indexPrice),fundingRate:s,fundingIntervalHours:i,fundingAprPct:s==null?null:s*(8760/i)*100,nextFundingTime:Ce(o?.nextFundingTime),raw:o??null}}catch(n){return cn(n)}}async function CS(e={},t={}){let r=await qo(e,t);return r?.error?r:{venue:"binance",market:"perp",symbol:r.symbol,markPrice:r.markPrice,indexPrice:r.indexPrice}}async function TS(e={},t={}){let r=mr(e.symbol||e.coin,e.quote||"USDT");if(!r)return{error:"binanceOpenInterest requires symbol or coin"};try{let n=await C(`${$o(t)}/fapi/v1/openInterest?symbol=${encodeURIComponent(r)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3});return{venue:"binance",market:"perp",symbol:r,openInterest:Ce(n?.openInterest),time:Ce(n?.time),raw:n??null}}catch(n){return cn(n)}}async function RS(e={},t={}){let r=mr(e.symbol||e.coin,e.quote||"USDT");if(!r)return{error:"binanceFundingHistory requires symbol or coin"};let n=Math.min(Math.max(Number(e.limit)||10,1),1e3);try{let o=await C(`${$o(t)}/fapi/v1/fundingRate?symbol=${encodeURIComponent(r)}&limit=${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),i=Array.isArray(o)?o:[];return{venue:"binance",symbol:r,count:i.length,history:i.map(s=>({fundingTime:Ce(s?.fundingTime),fundingRate:Ce(s?.fundingRate)}))}}catch(o){return cn(o)}}function hr({venue:e,market:t,symbol:r,bids:n,asks:o,raw:i}){let s=f=>(Array.isArray(f)?f:[]).map(m=>{let h=Ce(Array.isArray(m)?m[0]:m?.price),y=Ce(Array.isArray(m)?m[1]:m?.size);return h==null||y==null?null:{price:h,size:y}}).filter(Boolean),a=s(n),c=s(o),u=a[0]?.price??null,l=c[0]?.price??null,d=u!=null&&l!=null?(u+l)/2:null,p=d?(l-u)/d*1e4:null;return{venue:e,market:t,symbol:r,bids:a,asks:c,bestBid:u,bestAsk:l,mid:d,spreadBps:p,raw:i??null}}var _f,Of,Cf,un=A(()=>{j();_f="https://api.binance.com",Of="https://fapi.binance.com",Cf=8});var xa={};B(xa,{OKX_API:()=>Tf,OKX_DEFAULT_FUNDING_INTERVAL_HOURS:()=>Rf,okxFunding:()=>ga,okxHealth:()=>ya,okxInstId:()=>br,okxMarkPrice:()=>wa,okxOpenInterest:()=>PS,okxOrderbook:()=>NS,okxTicker:()=>ba});function yr(e={}){return(e.baseUrl||process.env.OKX_API_URL||Tf).replace(/\/$/,"")}function ln(e){return{error:String(e.message||e).slice(0,200)}}function Se(e){if(e===""||e==null)return null;let t=Number(e);return Number.isFinite(t)?t:null}function br(e,{market:t="spot",quote:r="USDT"}={}){let n=String(e||"").trim().toUpperCase();if(!n)return"";if(n.includes("-"))return n;let o=`${n}-${r}`;return t==="perp"?`${o}-SWAP`:o}function gr(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 ya(e={}){try{let t=await C(`${yr(e)}/api/v5/public/time`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??1e4});return{ok:gr(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 ba(e={},t={}){let r=String(e.market||"spot").toLowerCase(),n=br(e.instId||e.symbol||e.coin,{market:r,quote:e.quote||"USDT"});if(!n)return{error:"okxTicker requires instId, symbol or coin"};try{let o=await C(`${yr(t)}/api/v5/market/ticker?instId=${encodeURIComponent(n)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),i=gr(o)[0];return i?{venue:"okx",market:n.endsWith("-SWAP")?"perp":"spot",symbol:n,price:Se(i.last),bestBid:Se(i.bidPx),bestAsk:Se(i.askPx),volume24h:Se(i.vol24h),quoteVolume24h:Se(i.volCcy24h),raw:i}:{error:`okx ticker empty for ${n}`}}catch(o){return ln(o)}}async function NS(e={},t={}){let r=String(e.market||"spot").toLowerCase(),n=br(e.instId||e.symbol||e.coin,{market:r,quote:e.quote||"USDT"});if(!n)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(`${yr(t)}/api/v5/market/books?instId=${encodeURIComponent(n)}&sz=${o}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),s=gr(i)[0];return s?hr({venue:"okx",market:n.endsWith("-SWAP")?"perp":"spot",symbol:n,bids:s.bids,asks:s.asks,raw:s}):{error:`okx books empty for ${n}`}}catch(i){return ln(i)}}async function ga(e={},t={}){let r=br(e.instId||e.symbol||e.coin,{market:"perp",quote:e.quote||"USDT"});if(!r)return{error:"okxFunding requires instId, symbol or coin"};try{let n=await C(`${yr(t)}/api/v5/public/funding-rate?instId=${encodeURIComponent(r)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),o=gr(n)[0];if(!o)return{error:`okx funding-rate empty for ${r}`};let i=Number(e.fundingIntervalHours)||Rf,s=Se(o.fundingRate);return{venue:"okx",market:"perp",symbol:r,fundingRate:s,nextFundingRate:Se(o.nextFundingRate),fundingIntervalHours:i,fundingAprPct:s==null?null:s*(8760/i)*100,nextFundingTime:Se(o.nextFundingTime??o.fundingTime),raw:o}}catch(n){return ln(n)}}async function wa(e={},t={}){let r=br(e.instId||e.symbol||e.coin,{market:"perp",quote:e.quote||"USDT"});if(!r)return{error:"okxMarkPrice requires instId, symbol or coin"};let n=String(e.instType||"SWAP").toUpperCase();try{let o=await C(`${yr(t)}/api/v5/public/mark-price?instType=${encodeURIComponent(n)}&instId=${encodeURIComponent(r)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),i=gr(o)[0];return i?{venue:"okx",market:"perp",symbol:r,markPrice:Se(i.markPx),time:Se(i.ts),raw:i}:{error:`okx mark-price empty for ${r}`}}catch(o){return ln(o)}}async function PS(e={},t={}){let r=br(e.instId||e.symbol||e.coin,{market:"perp",quote:e.quote||"USDT"});if(!r)return{error:"okxOpenInterest requires instId, symbol or coin"};let n=String(e.instType||"SWAP").toUpperCase();try{let o=await C(`${yr(t)}/api/v5/public/open-interest?instType=${encodeURIComponent(n)}&instId=${encodeURIComponent(r)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),i=gr(o)[0];return i?{venue:"okx",market:"perp",symbol:r,openInterest:Se(i.oiCcy??i.oi),openInterestContracts:Se(i.oi),openInterestUsd:Se(i.oiUsd),time:Se(i.ts),raw:i}:{error:`okx open-interest empty for ${r}`}}catch(o){return ln(o)}}var Tf,Rf,ka=A(()=>{j();un();Tf="https://www.okx.com",Rf=8});var Aa={};B(Aa,{BYBIT_API:()=>Nf,BYBIT_DEFAULT_FUNDING_INTERVAL_HOURS:()=>Pf,bybitCategory:()=>Lo,bybitFunding:()=>Uo,bybitFundingHistory:()=>US,bybitHealth:()=>Sa,bybitMarkPrice:()=>qS,bybitOpenInterest:()=>LS,bybitOrderbook:()=>$S,bybitSymbol:()=>fn,bybitTicker:()=>Ea});function dn(e={}){return(e.baseUrl||process.env.BYBIT_API_URL||Nf).replace(/\/$/,"")}function pn(e){return{error:String(e.message||e).slice(0,200)}}function ce(e){if(e===""||e==null)return null;let t=Number(e);return Number.isFinite(t)?t:null}function fn(e,t="USDT"){let r=String(e||"").trim().toUpperCase().replace(/[-_/]/g,"");return r?r.endsWith(t)?r:`${r}${t}`:""}function Lo(e){let t=String(e||"spot").toLowerCase();return t==="perp"||t==="linear"||t==="swap"?"linear":t==="inverse"?"inverse":"spot"}function mn(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 Sa(e={}){try{let t=await C(`${dn(e)}/v5/market/time`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??1e4});return{ok:!!mn(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 $f(e,t){let r=Lo(e.market),n=fn(e.symbol||e.coin,e.quote||"USDT");if(!n)return{error:"bybit requires symbol or coin"};let o=await C(`${dn(t)}/v5/market/tickers?category=${encodeURIComponent(r)}&symbol=${encodeURIComponent(n)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),i=mn(o)?.list?.[0];return i?{row:i,symbol:n,category:r}:{error:`bybit tickers empty for ${n}`}}async function Ea(e={},t={}){try{let r=await $f(e,t);if(r.error)return r;let{row:n,symbol:o,category:i}=r;return{venue:"bybit",market:i==="spot"?"spot":"perp",symbol:o,price:ce(n.lastPrice),bestBid:ce(n.bid1Price),bestAsk:ce(n.ask1Price),markPrice:ce(n.markPrice),indexPrice:ce(n.indexPrice),volume24h:ce(n.volume24h),quoteVolume24h:ce(n.turnover24h),raw:n}}catch(r){return pn(r)}}async function $S(e={},t={}){let r=Lo(e.market),n=fn(e.symbol||e.coin,e.quote||"USDT");if(!n)return{error:"bybitOrderbook requires symbol or coin"};let o=Math.min(Math.max(Number(e.limit)||25,1),200);try{let i=await C(`${dn(t)}/v5/market/orderbook?category=${encodeURIComponent(r)}&symbol=${encodeURIComponent(n)}&limit=${o}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),s=mn(i);return s?hr({venue:"bybit",market:r==="spot"?"spot":"perp",symbol:n,bids:s.b,asks:s.a,raw:s}):{error:`bybit orderbook empty for ${n}`}}catch(i){return pn(i)}}async function Uo(e={},t={}){try{let r=await $f({...e,market:e.market||"perp"},t);if(r.error)return r;let{row:n,symbol:o}=r,i=Number(e.fundingIntervalHours)||Pf,s=ce(n.fundingRate);return{venue:"bybit",market:"perp",symbol:o,markPrice:ce(n.markPrice),indexPrice:ce(n.indexPrice),fundingRate:s,fundingIntervalHours:i,fundingAprPct:s==null?null:s*(8760/i)*100,nextFundingTime:ce(n.nextFundingTime),openInterest:ce(n.openInterest),raw:n}}catch(r){return pn(r)}}async function qS(e={},t={}){let r=await Uo(e,t);return r?.error?r:{venue:"bybit",market:"perp",symbol:r.symbol,markPrice:r.markPrice,indexPrice:r.indexPrice}}async function LS(e={},t={}){let r=fn(e.symbol||e.coin,e.quote||"USDT");if(!r)return{error:"bybitOpenInterest requires symbol or coin"};let n=Lo(e.market||"perp"),o=String(e.intervalTime||"1h"),i=Math.min(Math.max(Number(e.limit)||1,1),200);try{let s=await C(`${dn(t)}/v5/market/open-interest?category=${encodeURIComponent(n)}&symbol=${encodeURIComponent(r)}&intervalTime=${encodeURIComponent(o)}&limit=${i}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),a=mn(s)?.list,c=Array.isArray(a)?a[0]:null;return c?{venue:"bybit",market:"perp",symbol:r,openInterest:ce(c.openInterest),time:ce(c.timestamp),history:(Array.isArray(a)?a:[]).map(u=>({openInterest:ce(u?.openInterest),timestamp:ce(u?.timestamp)}))}:{error:`bybit open-interest empty for ${r}`}}catch(s){return pn(s)}}async function US(e={},t={}){let r=fn(e.symbol||e.coin,e.quote||"USDT");if(!r)return{error:"bybitFundingHistory requires symbol or coin"};let n=Math.min(Math.max(Number(e.limit)||10,1),200);try{let o=await C(`${dn(t)}/v5/market/funding/history?category=linear&symbol=${encodeURIComponent(r)}&limit=${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),i=mn(o)?.list,s=Array.isArray(i)?i:[];return{venue:"bybit",symbol:r,count:s.length,history:s.map(a=>({fundingRate:ce(a?.fundingRate),fundingTime:ce(a?.fundingRateTimestamp)}))}}catch(o){return pn(o)}}var Nf,Pf,va=A(()=>{j();un();Nf="https://api.bybit.com",Pf=8});var jf={};B(jf,{CEX_BASIS_VENUES:()=>Bo,HL_FUNDING_INTERVAL_HOURS:()=>Ia,cexBasis:()=>Df,cexBasisHealth:()=>jS,cexFundingSpread:()=>MS,cexVenueLegs:()=>Ff,hyperliquidPerpLeg:()=>Lf,hyperliquidSpotLeg:()=>Uf,okxPerpLeg:()=>Bf,pairwiseFundingSpreads:()=>Mf});function hn(e){return{error:String(e.message||e).slice(0,200)}}function fe(e){if(e===""||e==null)return null;let t=Number(e);return Number.isFinite(t)?t:null}function BS(e,t){return e==null||!t?null:e*(8760/t)*100}function _a(e={}){return String(e.coin||e.symbol||"").trim().toUpperCase().replace(/[-_/]/g,"").replace(/USDT?$/,"")||""}function FS(e={}){let t=e.venues,r=Array.isArray(t)?t:typeof t=="string"&&t.trim()&&t.trim().toLowerCase()!=="all"?t.split(","):Bo,n=new Set(r.map(i=>String(i).trim().toLowerCase()).filter(Boolean)),o=Bo.filter(i=>n.has(i));return o.length?o:Bo}async function Lf(e={},t={}){let r=_a(e);if(!r)return{error:"hyperliquidPerpLeg requires coin"};try{let n=await Zc(t),o=n?.[0]?.universe,i=n?.[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()===r);if(s<0)return{error:`hyperliquid has no perp for ${r}`};let a=i[s]||{},c=fe(a.funding);return{venue:"hyperliquid",market:"perp",symbol:r,markPrice:fe(a.markPx),indexPrice:fe(a.oraclePx),midPrice:fe(a.midPx),fundingRate:c,fundingIntervalHours:Ia,fundingAprPct:BS(c,Ia),openInterest:fe(a.openInterest)}}catch(n){return hn(n)}}async function Uf(e={},t={}){let r=_a(e);if(!r)return{error:"hyperliquidSpotLeg requires coin"};try{let n=await Jc(t),o=fe(n?.[r]);return o==null?{error:`hyperliquid allMids has no entry for ${r}`}:{venue:"hyperliquid",market:"spot",symbol:r,price:o}}catch(n){return hn(n)}}async function Bf(e={},t={}){let[r,n]=await Promise.all([ga(e,t).catch(hn),wa(e,t).catch(hn)]);return r?.error&&n?.error?r:{...r?.error?{venue:"okx",market:"perp",fundingError:r.error}:r,markPrice:n?.error?null:fe(n.markPrice),...n?.error?{markError:n.error}:{}}}async function kt(e,t){try{let r=await t;return[e,r&&typeof r=="object"?r:{error:"empty response"}]}catch(r){return[e,hn(r)]}}async function Ff(e={},t={}){let r=_a(e);if(!r)return{error:"cexVenueLegs requires coin"};let n=e.quote||"USDT",o=FS(e),i=[];o.includes("binance")&&(i.push(kt("binance:perp",qo({coin:r,quote:n},t))),i.push(kt("binance:spot",ma({coin:r,quote:n},t)))),o.includes("okx")&&(i.push(kt("okx:perp",Bf({coin:r,quote:n},t))),i.push(kt("okx:spot",ba({coin:r,quote:n,market:"spot"},t)))),o.includes("bybit")&&(i.push(kt("bybit:perp",Uo({coin:r,quote:n},t))),i.push(kt("bybit:spot",Ea({coin:r,quote:n,market:"spot"},t)))),o.includes("hyperliquid")&&(i.push(kt("hyperliquid:perp",Lf({coin:r},t))),i.push(kt("hyperliquid:spot",Uf({coin:r},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:r,quote:n,venues:o,legs:a}}function qf(e){return!e||e.error?null:fe(e.price)??fe(e.mid)??null}function DS(e){return!e||e.error?null:fe(e.markPrice)??fe(e.midPrice)??null}async function Df(e={},t={}){let r=await Ff(e,t);if(r.error)return r;let{coin:n,quote:o,venues:i,legs:s}=r,a=[];for(let m of i){let h=qf(s[m]?.spot);h!=null&&h>0&&a.push(h)}let c=[...a].sort((m,h)=>m-h),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 h=s[m]?.perp,y=s[m]?.spot,x=DS(h),E=qf(y),_=E??u,w=x!=null&&_?(x-_)/_*1e4:null;l.push({venue:m,symbol:h?.symbol??y?.symbol??n,markPrice:x,spotPrice:E,spotSource:E!=null?m:u!=null?"cross-venue-median":null,basisBps:w,fundingRate:h&&!h.error?fe(h.fundingRate):null,fundingIntervalHours:h&&!h.error?fe(h.fundingIntervalHours):null,fundingAprPct:h&&!h.error?fe(h.fundingAprPct):null,openInterest:h&&!h.error?fe(h.openInterest):null,errors:[h?.error,y?.error].filter(Boolean)})}let d=Mf(l),p=l.filter(m=>m.markPrice!=null),f=l.filter(m=>m.basisBps!=null);return{coin:n,quote:o,referenceSpot:u,asOf:new Date().toISOString(),venues:l,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 Mf(e=[]){let t=e.filter(n=>fe(n?.fundingAprPct)!=null),r=[];for(let n=0;n<t.length;n++)for(let o=n+1;o<t.length;o++){let i=t[n],s=t[o],a=i.fundingAprPct-s.fundingAprPct,c=a>0?s.venue:i.venue,u=a>0?i.venue:s.venue;r.push({pair:`${i.venue}/${s.venue}`,aprSpreadPct:Math.abs(a),signedAprSpreadPct:a,longVenue:c,shortVenue:u})}return r.sort((n,o)=>o.aprSpreadPct-n.aprSpreadPct)}async function MS(e={},t={}){let r=await Df(e,t);return r.error?r:{coin:r.coin,asOf:r.asOf,venues:r.venues.map(n=>({venue:n.venue,symbol:n.symbol,fundingRate:n.fundingRate,fundingIntervalHours:n.fundingIntervalHours,fundingAprPct:n.fundingAprPct,errors:n.errors})),fundingSpreads:r.fundingSpreads,widestFundingSpread:r.widestFundingSpread,execution:"read-only",exec:!1}}async function jS(e={}){try{let t=await Promise.all([fa(e).catch(()=>({ok:!1})),ya(e).catch(()=>({ok:!1})),Sa(e).catch(()=>({ok:!1}))]),r={binance:!!t[0]?.ok,okx:!!t[1]?.ok,bybit:!!t[2]?.ok};return{ok:Object.values(r).some(Boolean),provider:"cex-basis",upstream:r,execution:"read-only",exec:!1}}catch(t){return{ok:!1,provider:"cex-basis",error:String(t.message||t).slice(0,160)}}}var Bo,Ia,Hf=A(()=>{un();ka();va();qn();Bo=["binance","okx","bybit","hyperliquid"],Ia=1});var zf={};B(zf,{compoundHealth:()=>VS,compoundMarkets:()=>zS});async function zS(e={}){try{return((await C(`${HS}/ctoken`,e))?.cToken||[]).map(r=>({symbol:r?.symbol,underlying:r?.underlying_symbol,supplyApy:r?.supply_rate?.value?`${(Number(r.supply_rate.value)*100).toFixed(2)}%`:null,borrowApy:r?.borrow_rate?.value?`${(Number(r.borrow_rate.value)*100).toFixed(2)}%`:null,totalSupply:r?.total_supply?.value,totalBorrow:r?.total_borrows?.value,collateralFactor:r?.collateral_factor?.value?`${(Number(r.collateral_factor.value)*100).toFixed(0)}%`:null}))}catch(t){return{error:String(t.message||t).slice(0,200)}}}async function VS(){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 HS,Vf=A(()=>{j();HS="https://api.compound.finance/api/v2"});var Wf={};B(Wf,{yearnHealth:()=>KS,yearnVaults:()=>GS});async function GS(e={}){try{return(await C(`${WS}/vaults/all`,e)||[]).map(r=>({name:r?.name,symbol:r?.symbol,apy:r?.apy?.net_apy?`${(Number(r.apy.net_apy)*100).toFixed(2)}%`:null,tvl:r?.tvl?.tvl_deposited,chain:r?.chainId,type:r?.type||"v2"}))}catch(t){return{error:String(t.message||t).slice(0,200)}}}async function KS(){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 WS,Gf=A(()=>{j();WS="https://api.yearn.fi/v1"});var Kf={};B(Kf,{convexHealth:()=>JS,convexPools:()=>YS});async function YS(e={}){try{return(await C(`${XS}/pools`,e)||[]).map(r=>({name:r?.curvePool?.name||r?.name,curveApy:r?.curvePool?.apy?`${(Number(r.curvePool.apy)*100).toFixed(2)}%`:null,convexApy:r?.apy?`${(Number(r.apy)*100).toFixed(2)}%`:null,tvl:r?.tvl,boosted:r?.boosted||!1}))}catch(t){return{error:String(t.message||t).slice(0,200)}}}async function JS(){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 XS,Xf=A(()=>{j();XS="https://api.convexfinance.com/api"});function Ut(e){if(!Number.isSafeInteger(e)||e<0||e>1e3)throw new RangeError("scale must be a safe integer from 0 through 1000")}function tt(e,t){if(typeof e!="bigint")throw new TypeError("mantissa must be a bigint");return Ut(t),Object.freeze({mantissa:e,scale:t})}function St(e,t="value"){if(e===null||typeof e!="object")throw new TypeError(`${t} must be a fixed point value`);if(typeof e.mantissa!="bigint")throw new TypeError(`${t}.mantissa must be a bigint`);Ut(e.scale)}function Fo(e){return Ut(e),10n**BigInt(e)}function D(e){if(typeof e!="string"||!/^[+-]?\d+(?:\.\d+)?$/.test(e))throw new TypeError("value must be a plain decimal string");let t=e.startsWith("-"),r=e[0]==="-"||e[0]==="+"?e.slice(1):e,[n,o=""]=r.split("."),i=`${n}${o}`,s=BigInt(i)*(t?-1n:1n);return tt(s,o.length)}function Ee(e,t){if(Ut(t),typeof e=="bigint")return tt(e,t);if(typeof e!="string"||!/^[+-]?\d+$/.test(e))throw new TypeError("value must be an integer string or bigint");return tt(BigInt(e),t)}function Me(e){St(e);let t=e.mantissa<0n,r=(t?-e.mantissa:e.mantissa).toString();if(e.scale===0)return`${t?"-":""}${r}`;let n=r.padStart(e.scale+1,"0"),o=n.length-e.scale;return`${t?"-":""}${n.slice(0,o)}.${n.slice(o)}`}function yn(e,t){return St(e),Ut(t),t===e.scale?tt(e.mantissa,e.scale):t>e.scale?tt(e.mantissa*Fo(t-e.scale),t):tt(e.mantissa/Fo(e.scale-t),t)}function Oa(e,t){St(e,"left"),St(t,"right");let r=Math.max(e.scale,t.scale);return[yn(e,r),yn(t,r),r]}function Et(e,t){let[r,n,o]=Oa(e,t);return tt(r.mantissa+n.mantissa,o)}function bn(e,t){let[r,n,o]=Oa(e,t);return tt(r.mantissa-n.mantissa,o)}function Te(e,t){St(e,"left"),St(t,"right");let r=e.scale+t.scale;return Ut(r),tt(e.mantissa*t.mantissa,r)}function je(e,t,r=Math.max(e?.scale??0,t?.scale??0)){if(St(e,"left"),St(t,"right"),Ut(r),t.mantissa===0n)throw new RangeError("division by zero");let n=e.mantissa*Fo(t.scale+r),o=t.mantissa*Fo(e.scale);return tt(n/o,r)}function At(e,t){let[r,n]=Oa(e,t);return r.mantissa<n.mantissa?-1:r.mantissa>n.mantissa?1:0}var u2,$e=A(()=>{u2=Object.freeze({mantissa:10000n,scale:0})});import{existsSync as Jf,readFileSync as QS}from"node:fs";import{dirname as Yf,join as Ca}from"node:path";import{fileURLToPath as ZS}from"node:url";function eE(e){let t=Yf(ZS(e));for(let r=0;r<8;r+=1){let n=Ca(t,"package.json");if(Jf(n))try{let i=JSON.parse(QS(n,"utf8"));if(i&&typeof i.version=="string")return t}catch{}let o=Yf(t);if(o===t)break;t=o}throw new Error(`oracle: could not resolve package root from ${e}`)}function Qf(e,t){let r=eE(t),n=Ca(r,e);return Jf(n)?n:Ca(r,"dist","assets",e)}var Zf=A(()=>{});import{readFileSync as tE,existsSync as rE}from"node:fs";import{fileURLToPath as nE}from"node:url";import{dirname as oE,join as tm}from"node:path";function sE(){try{let e=Qf("equities-fixtures",import.meta.url);if(e&&rE(e))return e}catch{}return iE}function cE(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function W(e,t){throw new TypeError(`Fixture fixtures/${e}: ${t}`)}function oe(e,t,r){cE(e)||W(t,`${r} must be an object`)}function G(e,t,r){(typeof e!="string"||e.length===0)&&W(t,`${r} must be a nonempty string`)}function rt(e,t,r){Number.isSafeInteger(e)||W(t,`${r} must be a safe integer`)}function vt(e,t,r){oe(e,t,r);for(let[n,o]of Object.entries(e))G(n,t,`${r} key`),oe(o,t,`${r}.${n}`)}function uE(e,t){oe(e,t,"root"),rt(e.capturedAt,t,"capturedAt"),oe(e.venues,t,"venues");let r=[["hyperliquid_hip3","dexs"],["arcus","markets"],["arcus_spot","pairs"],["rh_uniswap","pools"],["rh_chainlink_oracles","assets"]];for(let[n,o]of r){let i=e.venues[n];oe(i,t,`venues.${n}`),G(i.type,t,`venues.${n}.type`),G(i.chain,t,`venues.${n}.chain`),G(i.tier,t,`venues.${n}.tier`),vt(i[o],t,`venues.${n}.${o}`)}for(let[n,o]of Object.entries(e.venues.hyperliquid_hip3.dexs))vt(o,t,`venues.hyperliquid_hip3.dexs.${n}`)}function lE(e,t){vt(e,t,"root"),Object.keys(e).length===0&&W(t,"root must not be empty");for(let[r,n]of Object.entries(e))Array.isArray(n.venues)||W(t,`${r}.venues must be an array`),n.venues.forEach((o,i)=>G(o,t,`${r}.venues[${i}]`))}function dE(e,t){oe(e,t,"root");for(let r of["chainId","block","oracleScaleExp","usdgDecimals","equityDecimals"])rt(e[r],t,r);G(e.usdg,t,"usdg"),vt(e.assets,t,"assets");for(let[r,n]of Object.entries(e.assets))G(n.oracle,t,`assets.${r}.oracle`),G(n.token,t,`assets.${r}.token`),(typeof n.rawPrice!="string"||!/^\d+$/.test(n.rawPrice))&&W(t,`assets.${r}.rawPrice must be an integer string`),(typeof n.usd!="number"||!Number.isFinite(n.usd)||n.usd<0)&&W(t,`assets.${r}.usd must be a nonnegative finite source number`)}function pE(e,t){oe(e,t,"root");for(let n of["holidayDayIndex","names","dates"])Array.isArray(e[n])||W(t,`${n} must be an array`);let r=e.holidayDayIndex.length;(e.names.length!==r||e.dates.length!==r)&&W(t,"holidayDayIndex, names, and dates must have equal lengths"),e.holidayDayIndex.forEach((n,o)=>rt(n,t,`holidayDayIndex[${o}]`)),e.names.forEach((n,o)=>G(n,t,`names[${o}]`)),e.dates.forEach((n,o)=>{(typeof n!="string"||!/^\d{4}-\d{2}-\d{2}$/.test(n))&&W(t,`dates[${o}] must use YYYY-MM-DD`)})}function fE(e,t){oe(e,t,"root"),(!Array.isArray(e.dstTransitions)||e.dstTransitions.length===0)&&W(t,"dstTransitions must be a nonempty array");let r=new Set;e.dstTransitions.forEach((n,o)=>{oe(n,t,`dstTransitions[${o}]`);for(let i of["year","startUtc","endUtc"])rt(n[i],t,`dstTransitions[${o}].${i}`);n.startUtc>=n.endUtc&&W(t,`dstTransitions[${o}] startUtc must be before endUtc`),r.has(n.year)&&W(t,`dstTransitions contains duplicate year ${n.year}`),r.add(n.year)})}function mE(e,t){vt(e,t,"root"),Object.keys(e).length===0&&W(t,"root must not be empty");for(let[r,n]of Object.entries(e)){for(let o of["addr","quote","quoteAddr","dex","pair"])G(n[o],t,`${r}.${o}`);(typeof n.liq!="number"||!Number.isFinite(n.liq)||n.liq<0)&&W(t,`${r}.liq must be a nonnegative finite source number`)}}function hE(e,t){oe(e,t,"root"),rt(e.capturedAt,t,"capturedAt"),rt(e.block,t,"block"),rt(e.chainId,t,"chainId"),G(e.gasPriceWei,t,"gasPriceWei"),G(e.stateView,t,"stateView"),vt(e.pools,t,"pools"),Object.keys(e.pools).length===0&&W(t,"pools must not be empty");for(let[r,n]of Object.entries(e.pools)){for(let o of["pair","version","quote","token","sqrtPriceX96"])G(n[o],t,`pools.${r}.${o}`);n.version!=="v3"&&n.version!=="v4"&&W(t,`pools.${r}.version must be v3 or v4`),typeof n.quoteIsToken0!="boolean"&&W(t,`pools.${r}.quoteIsToken0 must be a boolean`),(!/^[0-9]+$/.test(n.sqrtPriceX96)||BigInt(n.sqrtPriceX96)<=0n)&&W(t,`pools.${r}.sqrtPriceX96 must be a positive integer string`)}}function yE(e,t){oe(e,t,"root"),rt(e.capturedAt,t,"capturedAt"),G(e.source,t,"source"),oe(e.books,t,"books"),Object.keys(e.books).length===0&&W(t,"books must not be empty");for(let[r,n]of Object.entries(e.books)){oe(n,t,`books.${r}`),(!Array.isArray(n.bids)||!Array.isArray(n.asks))&&W(t,`books.${r} must have bids and asks arrays`);for(let[o,i]of n.bids.entries())oe(i,t,`books.${r}.bids[${o}]`),G(i.px,t,`books.${r}.bids[${o}].px`),G(i.sz,t,`books.${r}.bids[${o}].sz`);for(let[o,i]of n.asks.entries())oe(i,t,`books.${r}.asks[${o}]`),G(i.px,t,`books.${r}.asks[${o}].px`),G(i.sz,t,`books.${r}.asks[${o}].sz`)}}function bE(e,t){oe(e,t,"root"),rt(e.capturedAt,t,"capturedAt"),G(e.source,t,"source"),G(e.chain,t,"chain"),vt(e.tokens,t,"tokens"),oe(e.pairs,t,"pairs"),Object.keys(e.tokens).length===0&&W(t,"tokens must not be empty");for(let[r,n]of Object.entries(e.tokens)){G(n.symbolRaw,t,`tokens.${r}.symbolRaw`),G(n.mint,t,`tokens.${r}.mint`),Object.hasOwn(e.pairs,r)||W(t,`pairs.${r} is required for token ${r}`),(!Array.isArray(e.pairs[r])||e.pairs[r].length===0)&&W(t,`pairs.${r} must be a nonempty array`);for(let[o,i]of e.pairs[r].entries())oe(i,t,`pairs.${r}[${o}]`),G(i.pairAddress,t,`pairs.${r}[${o}].pairAddress`),G(i.dexId,t,`pairs.${r}[${o}].dexId`),(typeof i.priceUsd!="number"||!Number.isFinite(i.priceUsd)||i.priceUsd<=0)&&W(t,`pairs.${r}[${o}].priceUsd must be a positive finite number`),(typeof i.liquidityUsd!="number"||!Number.isFinite(i.liquidityUsd)||i.liquidityUsd<0)&&W(t,`pairs.${r}[${o}].liquidityUsd must be a nonnegative finite number`)}}function gE(e,t){oe(e,t,"root"),rt(e.capturedAt,t,"capturedAt"),G(e.source,t,"source"),G(e.chain,t,"chain"),e.chain!=="ton"&&W(t,'chain must be "ton"'),vt(e.tokens,t,"tokens"),oe(e.pairs,t,"pairs"),Object.keys(e.tokens).length===0&&W(t,"tokens must not be empty");for(let[r,n]of Object.entries(e.tokens)){G(n.symbolRaw,t,`tokens.${r}.symbolRaw`),G(n.mint,t,`tokens.${r}.mint`),Object.hasOwn(e.pairs,r)||W(t,`pairs.${r} is required for token ${r}`),(!Array.isArray(e.pairs[r])||e.pairs[r].length===0)&&W(t,`pairs.${r} must be a nonempty array`);for(let[o,i]of e.pairs[r].entries())oe(i,t,`pairs.${r}[${o}]`),G(i.pairAddress,t,`pairs.${r}[${o}].pairAddress`),G(i.dexId,t,`pairs.${r}[${o}].dexId`),(typeof i.priceUsd!="number"||!Number.isFinite(i.priceUsd)||i.priceUsd<=0)&&W(t,`pairs.${r}[${o}].priceUsd must be a positive finite number`),(typeof i.liquidityUsd!="number"||!Number.isFinite(i.liquidityUsd)||i.liquidityUsd<0)&&W(t,`pairs.${r}[${o}].liquidityUsd must be a nonnegative finite number`)}}function xE(e,t){let r=rm[t],n=tm(e,r),o;try{o=tE(n,"utf8")}catch(s){throw s?.code==="ENOENT"?new Error(`Fixture fixtures/${r} is missing at ${n}`):new Error(`Fixture fixtures/${r} could not be read: ${s.message}`)}let i;try{i=JSON.parse(o)}catch(s){throw new SyntaxError(`Fixture fixtures/${r} contains invalid JSON: ${s.message}`)}return wE[t](i,r),i}function nm(e){if(e!==null&&typeof e=="object"&&!Object.isFrozen(e)){Object.freeze(e);for(let t of Object.values(e))nm(t)}return e}function Ta({fixtureDir:e=aE}={}){if(typeof e!="string"||e.length===0)throw new TypeError("fixtureDir must be a nonempty path string");let t={};for(let r of Object.keys(rm))t[r]=xE(e,r);return nm(t)}function dt(){return em??=Ta(),em}function Re(){return dt().venues}function om(){return dt().universe}function im(){return dt().oracles}function sm(){return dt().nyseHolidays}function am(){return dt().dstTransitions}function Do(){return dt().rhPoolState}function cm(){return dt().solanaXstocks}function um(){return dt().tonXstocks}function lm(){return dt().hip3L2Books}var iE,aE,rm,wE,em,He=A(()=>{Zf();iE=tm(oE(nE(import.meta.url)),"fixtures");aE=sE(),rm=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"});wE=Object.freeze({venues:uE,universe:lE,oracles:dE,nyseHolidays:pE,dstTransitions:fE,equityDexPools:mE,rhPoolState:hE,solanaXstocks:bE,tonXstocks:gE,hip3L2Books:yE})});function EE(){let e=am().dstTransitions.map(n=>({year:n.year,startMs:n.startUtc*Na,endMs:n.endUtc*Na}));e.sort((n,o)=>n.startMs-o.startMs);let t=e[0].year,r=e[e.length-1].year;return Object.freeze({rows:Object.freeze(e),firstYear:t,lastYear:r,coverageStartMs:Date.UTC(t,0,1),coverageEndMs:Date.UTC(r+1,0,1)})}function gm(){return pm??=EE(),pm}function AE(){return Ra===void 0&&(Ra=new Set(sm().holidayDayIndex)),Ra}function wm(e,t){if(!Number.isSafeInteger(e))throw new TypeError(`${t}: epochMs must be a safe integer number of milliseconds`)}function vE(e,t){let{coverageStartMs:r,coverageEndMs:n,firstYear:o,lastYear:i}=gm();if(e<r||e>=n)throw new RangeError(`${t}: ${new Date(e).toISOString()} is outside DST fixture coverage (${o} through ${i}). Refusing to assume a UTC offset.`)}function IE(e){for(let t of gm().rows)if(e>=t.startMs&&e<t.endMs)return!0;return!1}function _E(e){return IE(e)?SE:kE}function OE(e){let t=e+_E(e),r=Math.floor(t/dm),n=t-r*dm,o=new Date(t);return{dayIndex:r,minuteOfDay:Math.floor(n/fm),msIntoDay:n,weekday:o.getUTCDay()}}function CE({dayIndex:e,weekday:t}){return t===0||t===6?!1:!AE().has(e)}function TE(e){return e<mm?"dark":e<hm?"extended":e<ym?"core":e<bm?"extended":"dark"}function gn(e){wm(e,"sessionState"),vE(e,"sessionState");let t=OE(e);return CE(t)?TE(t.minuteOfDay):"dark"}function $a(e){return wm(e,"isDark"),gn(e)==="dark"}var Na,fm,Pa,dm,kE,SE,mm,hm,ym,bm,k2,S2,pm,Ra,Mo=A(()=>{He();Na=1e3,fm=60*Na,Pa=60*fm,dm=24*Pa,kE=-5*Pa,SE=-4*Pa,mm=240,hm=570,ym=960,bm=1200,k2=Object.freeze([mm,hm,ym,bm]),S2=Object.freeze(["core","extended","dark"])});function Ho(e,t){e.push(Object.freeze({venue:t.venue,symbol:t.symbol??null,reason:t.reason,evidence:t.evidence??null}))}function PE(e){let t=e.raw?.vol24h;return!!(t===0||t===0||typeof t=="number"&&Number.isFinite(t)&&t<=0)}function $E(e){return!e.bid||!e.ask?!1:At(e.bid,e.ask)>0}function xm(e,t,r){return Number.isSafeInteger(e.capturedAt)?t-e.capturedAt>r:!1}function zo(e,t={}){if(!Array.isArray(e))throw new TypeError("quotes must be an array");let r=t.nowMs??Date.now(),n=t.quoteFreshnessMs??RE,o=t.oracleFreshnessMs??NE,i=t.includeDormant===!0,s=[],a=[];for(let c of e){if(PE(c)){i?s.push(Object.freeze({...c,staleData:!0})):Ho(a,{venue:c.venue,symbol:c.symbolRaw??c.symbol,reason:jo.DORMANT_VENUE,evidence:{vol24h:c.raw?.vol24h??null}});continue}if($E(c)){Ho(a,{venue:c.venue,symbol:c.symbolRaw??c.symbol,reason:jo.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(xm(c,r,n)){Ho(a,{venue:c.venue,symbol:c.symbolRaw??c.symbol,reason:jo.STALE_QUOTE,evidence:{capturedAt:c.capturedAt,nowMs:r,ageMs:r-c.capturedAt,freshnessMs:n}});continue}if(c.tier==="read-only"&&c.raw?.oracleRaw!==void 0){let u=gn(r),l=u==="core"?o:o*2;if(xm(c,r,l)){Ho(a,{venue:c.venue,symbol:c.symbolRaw??c.symbol,reason:jo.STALE_ORACLE,evidence:{capturedAt:c.capturedAt,nowMs:r,session:u}});continue}}s.push(c)}return{survivors:s,excluded:a}}var jo,RE,NE,qa=A(()=>{$e();Mo();jo=Object.freeze({DORMANT_VENUE:"dormant-venue",CROSSED_BOOK:"crossed-book",STALE_QUOTE:"stale-quote",STALE_ORACLE:"stale-oracle"}),RE=12e4,NE=6e5});function qE(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[r,n]=t.split(/[eE]/),o=Number(n),i=r.startsWith("-"),s=i?r.slice(1):r,[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 de(e){return e==null?null:typeof e=="string"?D(e):typeof e!="number"||!Number.isFinite(e)?null:D(qE(e))}function ze(e,t){let r=de(e);if(r===null)throw new TypeError(`${t} must be a finite source number`);return r}var Bt=A(()=>{$e()});function Z(e,t){throw new TypeError(`${e} ${t}`)}function Em(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function Ft(e,t){Em(e)||Z(t,"must be an object")}function Am(e,t,r){Object.hasOwn(e,t)||Z(`${r}.${t}`,"is required")}function wr(e,t){(typeof e!="string"||e.length===0)&&Z(t,"must be a nonempty string")}function wn(e,t,r){t.has(e)||Z(r,`must be one of ${[...t].join(", ")}`)}function Ua(e,t){(!Number.isSafeInteger(e)||e<0)&&Z(t,"must be a nonnegative safe integer")}function La(e,t,r=!1){e===null&&r||(Em(e)||Z(t,"must be a fixed point value"),typeof e.mantissa!="bigint"&&Z(`${t}.mantissa`,"must be a bigint"),(!Number.isSafeInteger(e.scale)||e.scale<0)&&Z(`${t}.scale`,"must be a nonnegative safe integer"))}function Vo(e,t,r=!1){e===null&&r||Ft(e,t)}function Sm(e,t){Ft(e,t),wr(e.venue,`${t}.venue`),wr(e.reason,`${t}.reason`),jE.test(e.reason)||Z(`${t}.reason`,"must be a machine readable lower case code"),Object.hasOwn(e,"symbol")&&e.symbol!==null&&wr(e.symbol,`${t}.symbol`)}function Ae(e){Ft(e,"quote");for(let r of["venue","chain","instrument","tier","symbolRaw","symbol","side","requestedSize",...km,"costAccounted","capturedAt","blockOrSeq","raw"])Am(e,r,"quote");wr(e.venue,"quote.venue"),!(typeof e.chain=="string"&&e.chain.length>0)&&!(Number.isSafeInteger(e.chain)&&e.chain>=0)&&Z("quote.chain","must be a nonempty string or nonnegative chain id"),wn(e.instrument,LE,"quote.instrument"),wn(e.tier,UE,"quote.tier"),wr(e.symbolRaw,"quote.symbolRaw"),wr(e.symbol,"quote.symbol"),wn(e.side,BE,"quote.side"),La(e.requestedSize,"quote.requestedSize"),e.requestedSize.mantissa<0n&&Z("quote.requestedSize","must not be negative");let t=0;for(let r of ME)Object.hasOwn(e,r)&&(La(e[r],`quote.${r}`),t+=1);t===0&&Z("quote","must contain at least one of bid, ask, mid, mark");for(let r of km)La(e[r],`quote.${r}`,!0);if(typeof e.costAccounted!="boolean"&&Z("quote.costAccounted","must be a boolean"),e.costAccounted){for(let r of["fees","gasEstimate","priceImpact"])e[r]===null&&Z(`quote.${r}`,"cannot be unknown when costAccounted is true");e.instrument==="perp"&&e.fundingHourly===null&&Z("quote.fundingHourly","cannot be unknown when costAccounted is true for a perp")}return e.instrument==="spot"&&e.fundingHourly!==null&&Z("quote.fundingHourly","must be null for a spot quote"),Ua(e.capturedAt,"quote.capturedAt"),e.blockOrSeq!==null&&!(typeof e.blockOrSeq=="string"&&e.blockOrSeq.length>0)&&!(Number.isSafeInteger(e.blockOrSeq)&&e.blockOrSeq>=0)&&Z("quote.blockOrSeq","must be null, a nonempty string, or a nonnegative safe integer"),Ft(e.raw,"quote.raw"),e}function Wo(e){Ft(e,"rankResult");for(let t of["rankedOn","ranked","winner","runnersUp","improvementBps","sourcesAnswered","sourcesTried","failed","excluded","darkWindow","instrumentMix","bestPreparable"])Am(e,t,"rankResult");return wn(e.rankedOn,FE,"rankResult.rankedOn"),Array.isArray(e.ranked)||Z("rankResult.ranked","must be an array"),e.ranked.forEach((t,r)=>Vo(t,`rankResult.ranked[${r}]`)),Vo(e.winner,"rankResult.winner",!0),e.ranked.length===0&&e.winner!==null&&Z("rankResult.winner","must be null when ranked is empty"),e.ranked.length>0&&e.winner===null&&Z("rankResult.winner","must be present when ranked is not empty"),Array.isArray(e.runnersUp)||Z("rankResult.runnersUp","must be an array"),e.runnersUp.forEach((t,r)=>Vo(t,`rankResult.runnersUp[${r}]`)),e.improvementBps!==null&&!(typeof e.improvementBps=="number"&&Number.isFinite(e.improvementBps))&&Z("rankResult.improvementBps","must be a finite number or null"),Ua(e.sourcesAnswered,"rankResult.sourcesAnswered"),Ua(e.sourcesTried,"rankResult.sourcesTried"),e.sourcesAnswered>e.sourcesTried&&Z("rankResult.sourcesAnswered","must not exceed sourcesTried"),Array.isArray(e.failed)||Z("rankResult.failed","must be an array"),e.failed.forEach((t,r)=>Sm(t,`failed[${r}]`)),Array.isArray(e.excluded)||Z("rankResult.excluded","must be an array"),e.excluded.forEach((t,r)=>Sm(t,`excluded[${r}]`)),e.darkWindow!==null&&Ft(e.darkWindow,"rankResult.darkWindow"),wn(e.instrumentMix,DE,"rankResult.instrumentMix"),Vo(e.bestPreparable,"rankResult.bestPreparable",!0),Object.hasOwn(e,"carry")&&e.carry!==null&&Ft(e.carry,"rankResult.carry"),e}var LE,UE,BE,FE,DE,ME,km,jE,pt=A(()=>{LE=new Set(["spot","perp"]),UE=new Set(["read-only","quote-only","prepare","intent"]),BE=new Set(["buy","sell"]),FE=new Set(["net-of-cost","gross"]),DE=new Set(["homogeneous","heterogeneous"]),ME=["bid","ask","mid","mark"],km=["fees","gasEstimate","priceImpact","fundingHourly"],jE=/^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$/});function vm(){return Re().venues.arcus}function WE(){return Object.keys(vm().markets).sort()}function GE({symbol:e,side:t="buy",sizeUsd:r=null}={}){if(typeof e!="string"||e.length===0)return null;let n=e.endsWith("-USD")?e.slice(0,-4):e,o=vm().markets[n];if(!o)return null;let i=ze(o.mark,`${n}.mark`),s=de(o.oracle),a=de(o.fundingHourly),c=r===null?D("0"):r,u={venue:HE,chain:zE,instrument:"perp",tier:VE,symbolRaw:e,symbol:n,side:t,requestedSize:c,mark:i,fees:null,gasEstimate:null,priceImpact:null,fundingHourly:a,costAccounted:!1,capturedAt:Re().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:Go,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),Ae(u)}function Ko({side:e="buy",sizeUsd:t=null}={}){return WE().map(r=>GE({symbol:r,side:e,sizeUsd:t})).filter(r=>r!==null)}var HE,zE,VE,Go,Ba=A(()=>{He();Bt();$e();pt();HE="arcus_perp",zE="robinhood-4663",VE="quote-only",Go="0.00000480324074074"});function Fa(e,t,r=8){if(e==null)throw new TypeError("hourlyFundingRate is required");if(!Number.isFinite(t)||t<0)throw new RangeError("horizonHours must be a nonnegative finite number");if(t===0)return D("0");let n=D(String(t)),o=Ee(10000n,0);return Te(Te(e,n),o)}function _m(e,t,r={}){if(e.instrument!=="perp")return{model:"current-funding-held-constant",horizonHours:t,carryBps:D("0"),carryBpsDisplay:"0",confidence:"estimate",note:"spot has no funding carry"};let n=r.nowMs??Date.now(),o=r.applyDarkWindowLock===!0,i=e.fundingHourly;if(o&&i!==null){let a=KE(n,t),c=t-a,u=D(Go),l=Fa(i,c),d=Fa(u,a),p=Math.max(l.scale,d.scale),f={mantissa:l.mantissa*10n**BigInt(p-l.scale)+d.mantissa*10n**BigInt(p-d.scale),scale:p};return{model:"current-funding-held-constant",horizonHours:t,carryBps:f,carryBpsDisplay:Me(f),confidence:"estimate",darkHours:a,litHours:c,darkWindowRate:Go,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=Fa(i,t);return{model:"current-funding-held-constant",horizonHours:t,carryBps:s,carryBpsDisplay:Me(s),confidence:"estimate",compounding:"ignored",compoundingErrorBoundNote:"simple sum; at 30d and 1e-5/h the ignored compound is under 0.5bp"}}function KE(e,t){if(t<=0)return 0;let r=0,n=Math.floor(t);for(let o=0;o<n;o+=1)$a(e+o*Im)&&(r+=1);return t>n&&$a(e+n*Im)&&(r+=t-n),r}var Im,F2,Om=A(()=>{$e();Ba();Mo();Im=36e5,F2=24*365});function XE(e){return e.mid??e.mark??e.ask??e.bid??null}function YE(e){let t=XE(e);if(t===null)return null;let r=e.costAccounted===!0,n=D("0");e.fees!==null?n=Et(n,e.fees):r=!1,e.priceImpact!==null?n=Et(n,e.priceImpact):e.requestedSize&&e.requestedSize.mantissa>0n&&(r=!1),e.gasEstimate===null?r=!1:n=Et(n,e.gasEstimate);let o;if(e.fees!==null&&At(e.fees,D("1"))<0&&At(e.fees,D("0"))>=0){let i=Et(D("1"),e.fees);o=Te(t,i),e.priceImpact!==null&&(o=Et(o,Te(t,e.priceImpact)))}else o=Et(t,n);return{net:o,costAccounted:r,px:t}}function JE(e,t,r=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:r,quote:e}}function QE(e,t){if(!e||!t||!e.costAccounted||!t.costAccounted||e.instrument!==t.instrument||e.net.mantissa===0n)return null;let r=bn(t.net,e.net);return je(Te(r,Ee(10000n,0)),t.net,4)}function Xo(e,t={}){if(!Array.isArray(e))throw new TypeError("quotes must be an array");let r=t.nowMs??e[0]?.capturedAt??Date.now(),n=e.length,o=e,i=[];if(!t.skipLiveness){let g=zo(e,{nowMs:r});o=g.survivors,i=g.excluded}let s=e.length,a=[],c=t.horizonHours,u=Number.isFinite(c)&&c>0,l=[];for(let g of o){let b=YE(g);if(b===null)continue;let S=null;if(u&&g.instrument==="perp"&&(S=_m(g,c,{nowMs:r}),S.carryBps!==null)){let k=Et(D("1"),je(S.carryBps,Ee(10000n,0),12));b.net=Te(b.net,k),b.costAccounted=!1}l.push(JE(g,b,S))}let d=l,p="homogeneous";if(u)p="heterogeneous",d=l;else{let g=l.filter(S=>S.instrument==="spot"),b=l.filter(S=>S.instrument==="perp");g.length>0&&b.length>0?(d=g.length>=b.length?g:b,p="homogeneous"):(d=l,p="homogeneous")}d.sort((g,b)=>{let S=At(g.net,b.net);return S!==0?S:g.venue<b.venue?-1:g.venue>b.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 x=m.length===0?null:QE(f,m[0]),E=l.find(g=>g.tier==="prepare")??null,_=gn(r),w=_==="core"?null:{session:_,warning:_==="dark"?"market is dark; marks are not real price discovery":"extended session; thinner books and higher staleness risk"},O=null;u&&(O=ZE(l));let v={rankedOn:y,ranked:h,winner:f,runnersUp:m,improvementBps:x===null?null:Number(Me(x)),sourcesAnswered:s,sourcesTried:n,failed:a,excluded:i,darkWindow:w,instrumentMix:p,bestPreparable:E,carry:f?.carry??null,breakEvenHorizonHours:O};return Wo(v)}function ZE(e){let t=e.filter(i=>i.instrument==="spot").sort((i,s)=>At(i.net,s.net))[0],r=e.filter(i=>i.instrument==="perp").sort((i,s)=>At(i.net,s.net))[0];if(!t||!r||r.fundingHourly===null)return null;let n=bn(t.net,r.net);if(n.mantissa===0n)return 0;let o=Te(r.fundingHourly,r.price);if(o.mantissa===0n)return null;try{let i=je(n,o,4),s=Number(Me(i));return!Number.isFinite(s)||s<0?null:s}catch{return null}}var Da=A(()=>{qa();Om();Mo();$e();pt()});function Ma(){return Do()}function iA(e){return{mantissa:e*e*10n**BigInt(xr)/nA,scale:xr}}function sA(e){let t=iA(BigInt(e.sqrtPriceX96)),r=e.quote==="USDG"?6:18,n=18;if(e.quoteIsToken0){let o=je(Te(t,Ee(10n**BigInt(r),0)),Ee(10n**BigInt(n),0),xr);return o.mantissa===0n?null:je(D("1"),o,xr)}return je(Te(t,Ee(10n**BigInt(n),0)),Ee(10n**BigInt(r),0),xr)}function aA(e){let t=im(),r=t.assets[e];return r?Ee(r.rawPrice,t.oracleScaleExp):null}function cA(e,t){if(e===null||t===null||e.mantissa<=0n||t.mantissa<=0n)return null;let r={...e};return je(t,uA(r,t),xr)}function uA(e,t){let r=Math.max(e.scale,t.scale);return{mantissa:yn(e,r).mantissa+yn(t,r).mantissa,scale:r}}function lA(e){let t=Ma(),r=oA[e];return r?{wei:BigInt(t.gasPriceWei)*r,units:r,native:"ETH"}:null}function ja(){return Object.keys(Ma().pools).sort()}function kr({symbol:e,side:t="buy",sizeUsd:r=null}={}){if(typeof e!="string"||e.length===0)throw new TypeError("symbol must be a nonempty string");let n=Ma(),o=n.pools[e];if(!o)return null;let i=sA(o);if(i===null)return null;let s=de(o.liqUsd),a=r===null?D("0"):r,c=o.feePpm===null||o.feePpm===void 0?null:je(Ee(BigInt(o.feePpm),0),Ee(1000000n,0),8),u=a.mantissa===0n?D("0"):cA(s,a),l=lA(o.version),f={venue:eA,chain:tA,instrument:"spot",tier:rA,symbolRaw:e,symbol:e,side:t,requestedSize:a,mid:i,fees:c,gasEstimate:null,priceImpact:u,fundingHourly:null,costAccounted:!1,capturedAt:n.capturedAt*1e3,blockOrSeq:n.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=aA(e);return m!==null&&(f.referencePrice=m,f.referenceBasisBps=Me(je(Te(bn(i,m),Ee(10000n,0)),m,4))),Ae(f)}function Cm({side:e="buy",sizeUsd:t=null}={}){return ja().map(r=>kr({symbol:r,side:e,sizeUsd:t})).filter(r=>r!==null)}var eA,tA,rA,nA,xr,oA,Ha=A(()=>{He();Bt();$e();pt();eA="rh_uniswap",tA=4663,rA="prepare",nA=1n<<192n,xr=18,oA=Object.freeze({v3:180000n,v4:240000n})});function Yo(e={}){let{symbol:t,side:r="buy",sizeUsd:n=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=kr({symbol:t,side:r,sizeUsd:n});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>Tm)throw new Error(`quote is stale (${a}ms old, bound ${Tm}ms); re-quote before preparing`);let u=Do().pools[t],l=u.version==="v4"?pA:dA,d=l,p=r==="buy"?u.quoteAddr:u.token;return Object.freeze({artifactKind:"unsigned-tx",chainId:4663,to:l,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:u.version,pair:u.pair},quoteAgeMs:a,recipient:o,side:r,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 Tm,dA,pA,za=A(()=>{Ha();He();Tm=12e4,dA="0x0000000000000000000000000000000000000000",pA="0x84b75b19A3cdf8E2F56d0507d22D442847B2053C"});function xn(){return Re().venues.hyperliquid_hip3}function Rm(){return Object.keys(xn().dexs).sort()}function yA(){let e=[];for(let[t,r]of Object.entries(xn().dexs))for(let n of Object.keys(r))e.push(`${t}:${n}`);return e.sort()}function bA(e){if(typeof e!="string"||e.length===0)return[];let t=e.indexOf(":");if(t>0){let n=e.slice(0,t),o=e.slice(t+1),i=xn().dexs[n]?.[o];return i?[{dex:n,ticker:o,market:i}]:[]}let r=[];for(let[n,o]of Object.entries(xn().dexs))Object.hasOwn(o,e)&&r.push({dex:n,ticker:e,market:o[e]});return r}function gA(e,t){try{return lm().books[`${e}:${t}`]??null}catch{return null}}function wA(e,t,r){if(!e||r===null||r.mantissa<=0n)return null;let n=t==="buy"?e.asks:e.bids;if(!n||n.length===0)return null;let o=Number(Me(r));if(!Number.isFinite(o)||o<=0)return null;let i=0,s=0,a=0;for(let c of n){let u=Number(c.px),l=Number(c.sz);if(!(u>0)||!(l>0))continue;let d=u*l,p=Math.min(o,d),f=p/u;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 xA(e,t,r,n){let o=wA(e,t,r);if(!o)return{impact:null,depth:null};let i=Number(Me(n));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:de(Number(a.toPrecision(12))),depth:{...o,impactFraction:a,fullyFilled:o.unfilledUsd<=1e-6}}}function Nm({dex:e,ticker:t,market:r,side:n,size:o}){let i=ze(r.mark,`${e}:${t}.mark`),s=de(r.fundingHourly),a=de(r.vol24h),c=de(r.oi),u=o===null?D("0"):o,l=gA(e,t),d=null,p=null,f="fees and gas not captured";if(u.mantissa>0n)if(l){let y=xA(l,n,u,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 l?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:fA,chain:mA,instrument:"perp",tier:hA,symbolRaw:`${e}:${t}`,symbol:t,side:n,requestedSize:u,mark:i,fees:null,gasEstimate:null,priceImpact:d,fundingHourly:s,costAccounted:!1,capturedAt:Re().capturedAt*1e3,blockOrSeq:null,raw:{fixture:"fixtures/venues.json#venues.hyperliquid_hip3",dex:e,ticker:t,vol24h:r.vol24h,oi:r.oi,fundingAnnPct:r.fundingAnnPct,maxLev:r.maxLev,reasonCostUnknown:f,hasL2Book:l!==null,l2BookFixture:l?"fixtures/hip3_l2books.json":null,depth:p}};return a!==null&&(h.raw.vol24hFixed=a),c!==null&&(h.raw.oiFixed=c),l?.bids?.[0]&&l?.asks?.[0]&&(h.bid=D(String(l.bids[0].px)),h.ask=D(String(l.asks[0].px))),Ae(h)}function Pm({symbol:e,side:t="buy",sizeUsd:r=null}={}){let n=bA(e);return n.length===0||n.length>1?null:Nm({...n[0],side:t,size:r})}function Jo({side:e="buy",sizeUsd:t=null,ticker:r=null}={}){let n=[];for(let o of yA()){let[i,s]=o.split(":");if(r!==null&&s!==r)continue;let a=xn().dexs[i][s];n.push(Nm({dex:i,ticker:s,market:a,side:e,size:t}))}return n}var fA,mA,hA,$m=A(()=>{He();Bt();$e();pt();fA="hyperliquid_hip3",mA="hyperliquid",hA="quote-only"});function qm(){return Re().venues.arcus_spot}function AA(){return Object.keys(qm().pairs).sort()}function vA({symbol:e,side:t="buy",sizeUsd:r=null}={}){if(typeof e!="string"||e.length===0)return null;let n=qm().pairs[e];if(!n)return null;let o=n.bid===void 0||n.bid===null?null:ze(n.bid,`${e}.bid`),i=n.ask===void 0||n.ask===null?null:ze(n.ask,`${e}.ask`),s=de(n.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=r===null?D("0"):r,u=D("0"),l={venue:kA,chain:SA,instrument:"spot",tier:EA,symbolRaw:e,symbol:e,side:t,requestedSize:c,fees:u,gasEstimate:null,priceImpact:null,fundingHourly:null,costAccounted:!1,capturedAt:Re().capturedAt*1e3,blockOrSeq:null,raw:{fixture:"fixtures/venues.json#venues.arcus_spot",last:n.last,bid:n.bid,ask:n.ask,vol24h:n.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),Ae(l)}function Qo({side:e="buy",sizeUsd:t=null}={}){return AA().map(r=>vA({symbol:r,side:e,sizeUsd:t})).filter(r=>r!==null)}var kA,SA,EA,Lm=A(()=>{He();Bt();$e();pt();kA="arcus_spot",SA="robinhood-4663",EA="quote-only"});function Zo(){return cm()}function Va(){return Object.keys(Zo().tokens).sort()}function CA(e){let t=Zo().pairs[e];return!t||t.length===0?null:[...t].sort((r,n)=>(n.liquidityUsd??0)-(r.liquidityUsd??0))[0]}function TA(e,t){if(e===null||t===null)return null;if(e.mantissa<=0n||t.mantissa<=0n)return D("0");let r=Math.max(e.scale,t.scale),n=e.scale===r?e.mantissa:e.mantissa*10n**BigInt(r-e.scale),o=t.scale===r?t.mantissa:t.mantissa*10n**BigInt(r-t.scale),i=o*10n**6n,s=n+o;return{mantissa:i/s,scale:6}}function Wa({symbol:e,side:t="buy",sizeUsd:r=null}={}){if(typeof e!="string"||e.length===0)return null;let n=e,o=e,i=Zo().tokens;if(Object.hasOwn(i,e))n=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))n=m,o=i[m].symbolRaw;else return null}else return null;let s=i[n],a=CA(n);if(!s||!a)return null;let c=ze(a.priceUsd,`${n}.priceUsd`),u=de(a.liquidityUsd),l=r===null?D("0"):r,d=l.mantissa===0n?D("0"):TA(u,l),p=!1;l.mantissa===0n&&(a.liquidityUsd??0)>=Um&&(p=!1);let f={venue:IA,chain:_A,instrument:"spot",tier:OA,symbolRaw:o,symbol:n,side:t,requestedSize:l,mid:c,fees:null,gasEstimate:null,priceImpact:d,fundingHourly:null,costAccounted:p,capturedAt:Zo().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)<Um}};return Ae(f)}function Bm({side:e="buy",sizeUsd:t=null}={}){return Va().map(r=>Wa({symbol:r,side:e,sizeUsd:t})).filter(r=>r!==null)}var IA,_A,OA,Um,Fm=A(()=>{He();Bt();$e();pt();IA="solana_xstocks",_A="solana",OA="quote-only",Um=25e3});function ei(){return um()}function Ga(){return Object.keys(ei().tokens).sort()}function LA(e){let t=ei().pairs[e];return!t||t.length===0?null:[...t].sort((r,n)=>(n.liquidityUsd??0)-(r.liquidityUsd??0))[0]}function UA(e,t){if(e===null||t===null)return null;if(e.mantissa<=0n||t.mantissa<=0n)return D("0");let r=Math.max(e.scale,t.scale),n=e.scale===r?e.mantissa:e.mantissa*10n**BigInt(r-e.scale),o=t.scale===r?t.mantissa:t.mantissa*10n**BigInt(r-t.scale),i=o*10n**6n,s=n+o;return{mantissa:i/s,scale:6}}function Ka({symbol:e,side:t="buy",sizeUsd:r=null}={}){if(typeof e!="string"||e.length===0)return null;let n=e,o=e,i=ei().tokens;if(Object.hasOwn(i,e))n=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))n=m,o=i[m].symbolRaw;else return null}else{let m=e.toUpperCase();if(Object.hasOwn(i,m))n=m,o=i[m].symbolRaw;else return null}let s=i[n],a=LA(n);if(!s||!a)return null;let c=ze(a.priceUsd,`${n}.priceUsd`),u=de(a.liquidityUsd),l=r===null?D("0"):r,d=l.mantissa===0n?D("0"):UA(u,l),f={venue:RA,chain:NA,instrument:"spot",tier:PA,symbolRaw:o,symbol:n,side:t,requestedSize:l,mid:c,fees:null,gasEstimate:null,priceImpact:d,fundingHourly:null,costAccounted:!1,capturedAt:ei().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)<$A,impactSizeFractionHint:qA}};return Ae(f)}function Dm({side:e="buy",sizeUsd:t=null}={}){return Ga().map(r=>Ka({symbol:r,side:e,sizeUsd:t})).filter(r=>r!==null)}var RA,NA,PA,$A,qA,Mm=A(()=>{He();Bt();$e();pt();RA="ton_stonfi",NA="ton",PA="quote-only",$A=25e3,qA=.01});var ti={};B(ti,{bestEquityRoute:()=>BA,collectEquityQuotes:()=>Hm,equityVenues:()=>FA,getUniverse:()=>om,getVenues:()=>Re,loadFixtures:()=>Ta,prepareEquity:()=>Yo,prepareEquityRoute:()=>DA,rankEquityQuotes:()=>Xo,toJsonSafe:()=>MA,validateQuote:()=>Ae,validateRankResult:()=>Wo});function Xa(e){return e==null||e===""?null:typeof e=="object"&&e&&typeof e.mantissa=="bigint"?e:D(String(e))}function Hm(e,{sizeUsd:t=null}={}){if(typeof e!="string"||!e.trim())throw new TypeError("ticker is required");let r=e.trim().toUpperCase(),n=Xa(t),o=[],i=Pm({symbol:`xyz:${r}`,sizeUsd:n});if(i)o.push(i);else for(let u of Jo({ticker:r,sizeUsd:n}))o.push(u);for(let u of Ko({sizeUsd:n}))u.symbol===r&&o.push(u);for(let u of Qo({sizeUsd:n}))u.symbol===r&&o.push(u);let s=kr({symbol:r,sizeUsd:n});s&&o.push(s);let a=Wa({symbol:r,sizeUsd:n});a&&o.push(a);let c=Ka({symbol:r,sizeUsd:n});return c&&o.push(c),o}function BA(e={}){let t=String(e.ticker||e.symbol||"").trim().toUpperCase();if(!t)throw new Error("bestEquityRoute requires ticker");let r=Xa(e.sizeUsd??e.size??null),n=Hm(t,{sizeUsd:r});if(n.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=n[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=Xo(n,{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>jm}}function FA(){let e=[{venue:"hyperliquid_hip3",tier:"quote-only",chain:"hyperliquid",n:Jo().length},{venue:"arcus_perp",tier:"quote-only",chain:"robinhood-4663",n:Ko().length},{venue:"arcus_spot",tier:"quote-only",chain:"robinhood-4663",n:Qo().length},{venue:"rh_uniswap",tier:"prepare",chain:4663,n:ja().length},{venue:"solana_xstocks",tier:"quote-only",chain:"solana",n:Va().length},{venue:"ton_stonfi",tier:"quote-only",chain:"ton",n:Ga().length}],t=[...Jo(),...Ko(),...Qo(),...Cm(),...Bm(),...Dm()],r=(t[0]?.capturedAt??Date.now())+1e3,{survivors:n,excluded:o}=zo(t,{nowMs:r});return{inventory:e,hip3Dexs:Rm(),liveness:{survivors:n.length,excluded:o.length,byReason:o.reduce((i,s)=>(i[s.reason]=(i[s.reason]??0)+1,i),{})},capturedAt:Re().capturedAt,custody:"prepare-only",note:"quote-only venues are ranked for discovery; only rh_uniswap is preparable in v1"}}function DA(e={}){let t=String(e.ticker||e.symbol||"").trim().toUpperCase(),r=e.recipient||e.taker;if(!t)throw new Error("prepareEquityRoute requires ticker");if(!r)throw new Error("prepareEquityRoute requires recipient (signing wallet)");let n=Xa(e.sizeUsd??e.size??null),o=kr({symbol:t,sizeUsd:n});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=Yo({symbol:t,sizeUsd:n,recipient:r,nowMs:a});return{ok:!0,ticker:t,artifact:u,bestPreparableVenue:"rh_uniswap",dataSource:s?"caller-clock":"live-clock",capturedAt:i,ageMs:c,stale:c>jm}}catch(i){return{ok:!1,failureKind:"prepare-refused",ticker:t,error:String(i.message||i)}}}function MA(e){return JSON.parse(JSON.stringify(e,(t,r)=>typeof r=="bigint"?r.toString():r))}var jm,ri=A(()=>{$e();Da();za();qa();$m();Lm();Ba();Ha();Fm();Mm();He();Da();za();pt();He();jm=3600*1e3});var ni={};B(ni,{CHAIN_CONFIGS:()=>sn,EVIDENCE:()=>U,RISK:()=>q,SCANNER_CAPABILITIES:()=>ar,__clearScanners:()=>Ex,createScanner:()=>Ld,getScanner:()=>Ms,listScanners:()=>Ud,registerBuiltinScanners:()=>To,registerCustomChain:()=>Wp,registerScanner:()=>yo,scannerCoverage:()=>Ax,validateScanner:()=>qd});var oi=A(()=>{wt();Ro()});var Qa={};B(Qa,{createWatch:()=>WA,listWatches:()=>VA,removeWatch:()=>GA});import kn from"node:fs";import Ya from"node:path";import{randomUUID as jA}from"node:crypto";import{homedir as HA}from"node:os";function zA(e=process.env){return e.ORACLE_CONFIG_DIR||Ya.join(HA(),".config","oracle")}function zm(e=process.env){return Ya.join(zA(e),"watches.json")}function Ja(e=process.env){let t=zm(e);if(!kn.existsSync(t))return{watches:[]};try{let r=JSON.parse(kn.readFileSync(t,"utf8"));return{watches:Array.isArray(r.watches)?r.watches:[]}}catch{return{watches:[]}}}function Vm(e,t=process.env){let r=zm(t);kn.mkdirSync(Ya.dirname(r),{recursive:!0,mode:448});let n=`${r}.${process.pid}.tmp`;kn.writeFileSync(n,`${JSON.stringify(e,null,2)}
9
+ `,{mode:384}),kn.renameSync(n,r)}function VA(e=process.env){return Ja(e).watches}function WA({chain:e,token:t,condition:r,note:n}={},o=process.env){if(!e||!t||!r)throw new Error("watch requires chain, token, condition");let i={id:jA(),chain:String(e),token:String(t),condition:String(r),note:n?String(n):null,actionMode:"alert_only",createdAt:new Date().toISOString()},s=Ja(o);return s.watches.push(i),Vm(s,o),i}function GA(e,t=process.env){let r=Ja(t),n=r.watches.filter(o=>o.id!==e);return n.length===r.watches.length?!1:(Vm({watches:n},t),!0)}var Za=A(()=>{});var Wm={};B(Wm,{classifyReceipt:()=>KA});function KA(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 Gm=A(()=>{});function ZA(e){return!(QA.has(e)||/^0x/i.test(e)||!/\d/.test(e)&&e===e.toLowerCase()||!/\d/.test(e)&&e===e.toUpperCase())}function Km(e,{extras:t=[]}={}){let r=[e,...t].map(i=>String(i||"")).join(`
10
+ `),n=[...new Set((r.match(XA)||[]).map(i=>i.toLowerCase()))].filter(i=>!JA.has(i)),o=[...new Set(r.match(YA)||[])].filter(ZA);return{evm:n,solana:o,all:[...n.map(i=>({chainFamily:"evm",address:i})),...o.map(i=>({chainFamily:"solana",address:i}))]}}function Xm(e){let t=String(e||"").trim();if(!t)return[];let r=[],n=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)&&r.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(n):n(o)}catch{for(let o of t.split(`
11
+ `)){let i=o.trim();if(i.startsWith("{"))try{n(JSON.parse(i))}catch{}}r.length||r.push({id:"",text:t,urls:[]})}return r}var XA,YA,JA,QA,Ym=A(()=>{XA=/\b0x[a-fA-F0-9]{40}\b/g,YA=/\b[1-9A-HJ-NP-Za-km-z]{32,44}\b/g,JA=new Set(["0x0000000000000000000000000000000000000000","0x000000000000000000000000000000000000dead","0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee"].map(e=>e.toLowerCase())),QA=new Set(["So11111111111111111111111111111111111111112","EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v","Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB","11111111111111111111111111111111"])});import{spawnSync as ev}from"node:child_process";import Jm from"node:fs";import ec from"node:path";function ov(e=process.env){let t=String(e.ORACLE_XURL_ENABLED||"").trim().toLowerCase();return t==="1"||t==="true"||t==="yes"||t==="on"}function eh(e=process.env){let t=String(e.ORACLE_XURL_ALLOW_WRITE||"").trim().toLowerCase();return t==="1"||t==="true"||t==="yes"||t==="on"}function iv(e=process.env){let t=String(e.ORACLE_XURL_BIN||"").trim();if(t)return ec.isAbsolute(t)?Jm.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 r=String(e.PATH||process.env.PATH||"");for(let n of r.split(ec.delimiter)){if(!n)continue;let o=ec.join(n,"xurl");try{if(Jm.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 sv(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 av(e){for(let t of e){let r=String(t);if(Zm.includes(r))return r;if(Zm.some(n=>n.startsWith("--")&&r.startsWith(`${n}=`)))return r.split("=")[0]}return null}function cv(e={},t=process.env){let r;if(Array.isArray(e.argv))r=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)))),r=[c,...u]}if(r.length===0)return{ok:!1,error:"empty argv"};if(r.length>24)return{ok:!1,error:"too many arguments"};for(let c of r)if(String(c).length>4e3)return{ok:!1,error:"argument too long"};let n=av(r);if(n)return{ok:!1,error:`forbidden flag: ${n}`};if(r.some(c=>String(c).includes("\0")))return{ok:!1,error:"nul byte in argv"};let o=String(r[0]||"").replace(/^\//,"");if(o.startsWith("2/")||r[0].startsWith("/2/")||r[0].startsWith("https://api.x.com/")){if(!eh(t)&&r.some(c=>/^-X$/.test(c)||/^--request$/.test(c))){let c=r.findIndex(l=>l==="-X"||l==="--request"),u=String(r[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(r[1]||"")!=="status")return{ok:!1,error:"only `auth status` is allowed (no apps add / oauth2 from the agent)"}}else if(!rv.includes(o))if(nv.includes(o)){if(!eh(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=[...r],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 th(e,t={},r={}){if(e!=="xurl")return{ok:!1,error:`unknown tool: ${e}`};let n=r.env||process.env;if(!ov(n))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=cv(t,n);if(!o.ok)return o;let i=iv(n);if(!i.ok)return i;let a=(r.spawnFn||ev)(i.bin,o.argv,{encoding:"utf8",timeout:r.timeoutMs||Qm,maxBuffer:1024*1024,env:sv(n)});if(a.error){let d=a.error.code==="ETIMEDOUT"?`xurl timed out after ${r.timeoutMs||Qm}ms`:String(a.error.message||a.error);return{ok:!1,error:It(d,{force:!0})}}let c=It(String(a.stdout||"").slice(0,tv),{force:!0}),u=It(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 Qm,tv,rv,nv,Zm,QR,rh=A(()=>{Oi();Qm=45e3,tv=4e4,rv=Object.freeze(["whoami","user","read","search","timeline","mentions","bookmarks","likes","following","followers","dms","auth"]),nv=Object.freeze(["post","reply","quote","delete","like","unlike","repost","unrepost","bookmark","unbookmark","follow","unfollow","block","unblock","mute","unmute","dm"]),Zm=Object.freeze(["--verbose","-v","--trace","-t","--bearer-token","--consumer-key","--consumer-secret","--access-token","--token-secret","--client-id","--client-secret"]);QR=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 pv(e){return!e||e==="0x"||e===dv}async function nh(e={},t={}){let r=t.rpcCall||Y,n=String(e.address||"").trim().toLowerCase(),o=Number(e.chainId);if(!/^0x[a-f0-9]{40}$/.test(n))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 r(o,"eth_getCode",[n,"latest"],t)}catch(h){return{address:n,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:n,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(uv))c.includes(h)&&a.push({selector:`0x${h}`,...y});let u=!1,l=null,d=null,p=await Promise.all(lv.map(async({label:h,slot:y})=>{try{let x=await r(o,"eth_getStorageAt",[n,y,"latest"],t);return{label:h,word:x,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),!u&&h.word&&!pv(h.word)&&(u=!0,l=h.label,d=`0x${String(h.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(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:n,chainId:o,status:"ok",risk:m,findings:a,isProxy:u,proxyStandard:l,implementation:d,codeSize:Math.floor(c.length/2),notes:s}}var uv,lv,dv,oh=A(()=>{ut();uv=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"}}),lv=Object.freeze([{label:"eip1967",slot:"0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc"},{label:"zeppelinos",slot:"0x7050c9e0f4ca769c69bd3a8ef740bc37934f8e2c036e5a723fd8ee048ed3f8c3"},{label:"eip1822",slot:"0xc5f16f0fcc639fa48a6947836d9850f504798523bf8c9a3a87d5876cf622bcf7"}]),dv=`0x${"0".repeat(64)}`});function ii(e,t){let r=String(e||"").trim();if(!fv.test(r))throw new Error(`evm-token-sniper: ${t} must be a 0x EVM address`);return r}function tc(e,t){let r=String(e??"").trim();if(!/^\d+$/.test(r)||BigInt(r)<=0n)throw new Error(`evm-token-sniper: ${t} must be a positive raw integer amount`);return r}function Sn(e,t){return e==null||e===""?null:tc(e,t)}function hv({chainId:e,tokenAddress:t,tokenIn:r,amountIn:n,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=ii(l.to,"prepared destination"),p=String(l.data||"").toLowerCase();if(!/^0x[0-9a-f]+$/.test(p))throw new Error("local-signer envelope requires hex calldata");let f=tc(l.value??n,"prepared native value");if(BigInt(f)!==BigInt(n))throw new Error("local-signer envelope requires native value equal amountIn");let m=Sn(l.gasLimit??c.gasLimit,"gasLimit"),h=Sn(l.maxFeePerGas??c.maxFeePerGas,"maxFeePerGas");if(!m||!h)throw new Error("local-signer envelope requires explicit gasLimit and maxFeePerGas caps");let y=Number(u.nowMs??Date.now()),x=Math.min(6e4,Math.max(1e3,Number(c.ttlMs??c.expiresInMs??3e4)||3e4)),E=Ss({chainId:e,venue:"uniswap-v3",quoteAmountOut:i?.amountOut,liquidityUsd:s?.liquidityUsd,requestedCapBps:c.slippageBps??50,quotedAtMs:y,ttlMs:x,secret:u.routeAttestationSecret}),_=Oe(E,{chainId:e,venue:"uniswap-v3",data:p,secret:u.routeAttestationSecret}),w={chainId:e,from:o,to:d,data:p,value:f,gasLimit:m,maxFeePerGas:h,slippageBps:_.selectedBps,expiresAtMs:y+x},O=Sn(l.maxPriorityFeePerGas??c.maxPriorityFeePerGas,"maxPriorityFeePerGas");return O&&(w.maxPriorityFeePerGas=O),c.nonce!==void 0&&(w.nonce=Number(c.nonce)),(c.txType!==void 0||O)&&(w.type=Number(c.txType??2)),c.l1FeeWei!==void 0&&(w.l1FeeWei=Sn(c.l1FeeWei,"l1FeeWei")??"0"),c.operatorFeeWei!==void 0&&(w.operatorFeeWei=Sn(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:_.selectedBps,expiresAtMs:y+x,fee:{oracleFeeBps:5},autoSlippage:_,artifact:{chainId:e,owner:o,transactions:[w]},meta:{source:"evm-token-sniper",tokenIn:r,tokenOut:t}}}function yv(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}To();let r=Ms(e);if(!r)throw new Error(`evm-token-sniper: unsupported EVM chainId ${e}`);return r}function bv({token:e,pools:t,structuralRisk:r,scannerRisk:n,sellability:o,quote:i,args:s,scanner:a}){let c=[];return e?.evidence!==U.LIVE&&c.push("token identity is not live-verified"),(!Array.isArray(t?.pools)||t.pools.length===0)&&c.push("no liquid pool was resolved"),r?.status!=="ok"&&c.push("structural contract risk is unavailable"),r?.risk==="high"&&c.push("structural contract risk is high"),n?.verdict!==q.PASS&&c.push(`scanner risk verdict is ${n?.verdict||"UNKNOWN"}`),a.supports?.("sellSimulation")?o?.verdict!==q.PASS&&c.push(`sellability verdict is ${o?.verdict||"UNKNOWN"}`):c.push("sell simulation is unavailable on this chain"),a.supports?.("quote")?i?.evidence!==U.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 ih(e={},t={}){let r=Number(e.chainId??mv);if(!Number.isInteger(r)||r<=0)throw new Error("evm-token-sniper: chainId must be a positive integer");let n=ii(e.tokenAddress||e.address||e.token,"tokenAddress"),o=e.tokenIn?ii(e.tokenIn,"tokenIn"):null,i=e.recipient?ii(e.recipient,"recipient"):null,s=e.amountIn==null?null:tc(e.amountIn,"amountIn"),a=yv(r,t.scanner),c=t.scanContractRisk||nh,[u,l,d]=await Promise.all([a.resolveToken(n),a.resolvePools(n),c({address:n,chainId:r},t.contractRiskOpts||t)]),p=await a.scoreRisk(n),f=null;a.supports?.("sellSimulation")&&s?f=await a.sellSimulation({token:n,amountIn:s,base:o||void 0}):a.supports?.("sellSimulation")&&(f=await a.sellSimulation({token:n,amountIn:"10000000000000000"}));let m=null;a.supports?.("quote")&&o&&s&&(m=await a.quote({tokenIn:o,tokenOut:n,amountIn:s}));let h={...e,tokenIn:o,amountIn:s,recipient:i},y=bv({token:u,pools:l,structuralRisk:d,scannerRisk:p,sellability:f,quote:m,args:h,scanner:a}),x=null,E=null,_=null;if(e.prepare===!0&&y.length===0){x=await a.prepareUnsignedTx({tokenIn:o,tokenOut:n,amountIn:s,recipient:i,slippageBps:e.slippageBps??50,fee:m?.fee});try{E=hv({chainId:r,tokenAddress:n,tokenIn:o,amountIn:s,recipient:i,quote:m,topPool:l?.pools?.[0]||null,unsignedTx:x,args:e,opts:t})}catch(w){_=String(w?.message||w).slice(0,200)}}return{provider:"evm-token-sniper",execution:"armed-local",armed:!!E,signing:"local-signer",broadcasting:"local-signer",chainId:r,chain:{key:a.key,name:a.name,nativeCurrency:a.nativeCurrency},token:u,pools:l,topPool:l?.pools?.[0]||null,structuralRisk:d,scannerRisk:p,sellability:f,quote:m,blockedReasons:y,prepared:!!x,unsignedTx:x,localSignerEnvelope:E,localSignerBlockedReason:_,signed:E?"pending-local-signer":!1,broadcast:E?"pending-local-signer":!1}}var fv,mv,sh=A(()=>{Ro();wt();Ue();oh();fv=/^0x[0-9a-fA-F]{40}$/,mv=4663});var dh={};B(dh,{evaluateContracts:()=>lh,fetchAccountTweets:()=>uh,snipeExecuteEnabled:()=>ah,tickTwitterCaWatch:()=>Ev,twitterSnipeEmitsCard:()=>Av});function ah(e=process.env){return String((e||process.env).ORACLE_SNIPE_EXECUTE||"").trim()==="1"}function ch(e){return String(e||"").trim().replace(/^@/,"")}async function uh({handle:e,limit:t=5,xurlFn:r=th}={},n={}){let o=ch(e);if(!o)throw new Error("twitter-ca-watch: handle required");let i=await r("xurl",{command:"search",query:`from:${o}`,limit:Math.min(20,Math.max(1,Number(t)||5))},n);return i?.ok?{ok:!0,tweets:Xm(i.stdout),raw:i}:{ok:!1,error:i?.error||"xurl search failed",tweets:[]}}async function kv(e,{chainId:t,amountIn:r,tokenIn:n,recipient:o,prepare:i},s){let a=await ih({chainId:t,tokenAddress:e,amountIn:r,tokenIn:n,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 Sv(e,t){let r=await wd(e,{chainSlug:"solana",stables:[wv,xv]},t);return{chainFamily:"solana",chainId:"solana",address:e,topPool:r.topPool,pools:r.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 lh(e,t={},r={}){let n=Number(t.chainId??gv),o=[];for(let i of e.evm||[])o.push(await kv(i,{...t,chainId:n},r));for(let i of e.solana||[])o.push(await Sv(i,r));return o}async function Ev(e={},t={}){let r=ch(e.handle),n=e.seen instanceof Set?e.seen:new Set(e.seen||[]),o=await uh({handle:r,limit:e.limit,xurlFn:t.xurlFn},t);if(!o.ok)return{ok:!1,handle:r,error:o.error,hits:[],seen:[...n]};let i=[];for(let a of o.tweets){let c=a.id||`${r}:${a.text.slice(0,80)}`;if(n.has(c))continue;let u=Km(a.text,{extras:a.urls||[]});if(!u.all.length){n.add(c);continue}let d=await(t.evaluateFn||lh)(u,e,t);n.add(c),i.push({tweetId:a.id||null,handle:r,text:a.text,contracts:u,evaluations:d})}let s=e.automated!==!1;return{ok:!0,handle:r,source:"twitter-ca-watch",automated:s,card:!1,notify:!1,telegram:!1,execution:!1,broadcast:!1,snipeExecuteEnabled:ah(t.env||process.env),hits:i,seen:[...n]}}function Av(e={}){return!e||typeof e!="object"||e.source==="twitter-ca-watch"||e.automated===!0||e.card===!1||e.notify===!1,!1}var gv,wv,xv,ph=A(()=>{Ym();rh();sh();Gr();Rn();gv=4663,wv="EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",xv="Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB"});import{wordlists as vv}from"ethers";function Cv(e){let t=String(e).trim().toLowerCase().split(/\s+/).filter(Boolean);return Ov.has(t.length)&&t.every(r=>vv.en.getWordIndex(r)>=0)}function Pv(e){let t=fh(e);return Nv.has(t)||Rv.test(t)}function fh(e){return String(e).replace(/[^a-z0-9]/gi,"").toLowerCase()}function $v(e){let t=fh(e);return[...Iv].some(r=>t.includes(r))}function qv(e,t,r){if(typeof t=="string"){if(_v.some(n=>n.test(t))||Cv(t))throw new En(r);if(Tv.test(t)&&!Pv(e))throw new En(r)}}function rc(e,t="$",r=""){if(e==null||typeof e=="boolean")return e;if(typeof e=="string")return qv(r,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)=>rc(o,`${t}[${i}]`,r));if(typeof e!="object"||Object.getPrototypeOf(e)!==Object.prototype)throw new TypeError(`action receipt: JSON-like value required at ${t}`);let n={};for(let o of Object.keys(e).sort()){let i=`${t}.${o}`;if($v(o))throw new En(i);e[o]!==void 0&&(n[o]=rc(e[o],i,o))}return n}function Sr(e){return rc(e)}var Iv,_v,Ov,Tv,Rv,Nv,En,nc=A(()=>{Iv=new Set(["privatekey","privkey","secretkey","seedphrase","seed","mnemonic","passphrase","password","keystore","keymaterial","wif","xprv","xpriv","bearer","authorization","signature","apikey","credential"]),_v=[/\b[5KL][1-9A-HJ-NP-Za-km-z]{50,51}\b/,/\bxprv[0-9A-Za-z]{50,}\b/],Ov=new Set([12,15,18,21,24]);Tv=/^\s*(?:0x)?[0-9a-fA-F]{64}\s*$/,Rv=/(hash|digest|root|salt|nonce|proof|commitment|sig|id)(?:e?s)?$/i,Nv=new Set(["calldata","data","publickey","pubkey","message","payload","input","extradata"]);En=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 Lv,chmod as si,readFile as Uv,rename as Bv,writeFile as Fv}from"node:fs/promises";import{homedir as Dv}from"node:os";import{dirname as mh,join as oc}from"node:path";import Mv from"sql.js";function ui(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(ui).join(",")}]`:`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${ui(e[t])}`).join(",")}}`}function hh(e){if(!jv.has(e))throw new TypeError(`unknown artifact type: ${e}`);return e}function ai(e){let t=[];for(;e.step();)t.push(e.getAsObject());return e.free(),t}function ci(e){return e?{id:e.id,type:e.type,createdAt:e.created_at,data:JSON.parse(e.data_json)}:null}async function yh(e={}){let t=e.path||Vv;await Lv(mh(t),{recursive:!0,mode:448}),await si(mh(t),448);let r;try{r=await Uv(t)}catch(u){if(u.code!=="ENOENT")throw u}let n=await Mv(e.sqlJs||{}),o=r?new n.Database(r):new n.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(r??[])}`}async function Fw(e,t,r){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 kv(l,Buffer.from(o.export()),{mode:384}),await ni(l,384),await xv(l,t),await ni(t,384)};return s=s.then(u,u),s}r?await ni(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=ih(String(u.type)),d=String(u.id||"").trim();if(!d)throw new TypeError("artifact id required");let p=wr(u.data??{}),f=String(u.createdAt||new Date().toISOString());return o.run("INSERT INTO artifacts(id,type,created_at,data_json) VALUES(?,?,?,?)",[d,l,f,si(p)]),await a(),{id:d,type:l,createdAt:f,data:p}},getArtifact(u){c();let l=o.prepare("SELECT * FROM artifacts WHERE id=?");l.bind([String(u)]);let d=l.step()?ii(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"):(ih(String(u)),o.prepare("SELECT * FROM artifacts WHERE type=? ORDER BY created_at,id"));return u!==void 0&&l.bind([String(u)]),oi(l).map(ii)},async link(u,l){c();let d=o.prepare("SELECT id,type FROM artifacts WHERE id IN (?,?)");d.bind([String(u),String(l)]);let p=oi(d),f=p.find(h=>h.id===String(u)),m=p.find(h=>h.id===String(l));if(!f||!m)throw new TypeError("edge endpoints must exist");if(!vv.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(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)]),oi(l).map(ii)},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)]),oi(l).map(ii)},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 p=wr(l);return o.run("INSERT INTO action_receipts(artifact_id,receipt_json) VALUES(?,?)",[String(u),si(p)]),await a(),p},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 tc,Av,vv,Iv,_v,ah=A(()=>{Za();tc=Object.freeze(["project","entity","source","thesis","strategy","simulation","prepared_action","receipt","position"]),Av=new Set(tc),vv=new Set(tc.slice(0,-1).map((e,t)=>`${e}:${tc[t+1]}`)),Iv=ec(process.env.ORACLE_CONFIG_DIR||ec(Sv(),".config","oracle"),"workspace"),_v=ec(Iv,"artifacts.sqlite")});import{createHash as ch}from"node:crypto";function Cv(e){return Ov.has(String(e).replace(/[^a-z0-9]/gi,"").toLowerCase())}function rc(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(rc).join(",")}]`:`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${rc(e[t])}`).join(",")}}`}function Tv(e){return ch("sha256").update(String(e)).digest("hex")}function uh(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 r of t.searchParams.keys())if(Cv(r))throw new TypeError("research source URL must not contain sensitive query parameters");return t.toString()}function lh(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 Rv(e={}){let t=uh(e.url??e.sourceUrl),r=lh(e.fetchedAt),n=String(e.contentHash||"").toLowerCase();if(!/^[0-9a-f]{64}$/.test(n))throw new TypeError("research citation contentHash must be 64 lowercase hex characters");return Object.freeze(wr({url:t,fetchedAt:r,contentHash:n}))}function dh(e={}){let t=uh(e.sourceUrl??e.url),r=String(e.snapshot??e.content??"");if(!r)throw new TypeError("research snapshot required");let n=String(e.claim||"").trim();if(!n)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=lh(e.fetchedAt),s=Tv(r);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(Rv),c=wr({sourceUrl:t,fetchedAt:i,contentHash:s,snapshot:r,claim:n,confidence:o,contradictions:(e.contradictions||[]).map(String),citations:a});return Object.freeze({id:`research:${ch("sha256").update(rc(c)).digest("hex")}`,...c})}var Ov,ph=A(()=>{Za();Ov=new Set(["accesstoken","refreshtoken","idtoken","token","apikey","clientsecret","password","auth","jwt","session","secret","key","code","signature","xamzsignature","privatekey","authorization","bearer","credential"])});function fh(e){if(e===null||e===""||e===void 0)return null;let t=Number(e);return Number.isFinite(t)&&t>=0?t:null}function kn(e){return Math.round((e+Number.EPSILON)*1e8)/1e8}function oc(e,t){return t>0?kn(e/t*100):null}function ic(e){return e.address||e.owner||e.walletAddress||e.wallet?.address||null}function $v(e){let t=Array.isArray(e)?e:Array.isArray(e?.entries)?e.entries:[],r=new Map;for(let n of t){if(!n?.address)continue;let o=String(n.address).toLowerCase();r.has(o)||r.set(o,n)}return r}function Ft(e,t,r={}){if(!t||typeof t!="object")return;let n=String(t.symbol??t.coin??t.name??t.collection??t.tokenId??"unknown"),o=fh(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:n,usdValue:o,chain:String(t.chain??t.chainName??r.chain??"unknown"),venue:String(t.venue??t.protocol??t.platform??r.venue??"wallet"),address:t.address??r.address??null,kind:i,stablecoin:t.stablecoin===!0||Pv.has(n.toUpperCase())})}function qv(e){let t=[],r=ic(e);for(let n of e.assets||e.holdings||[])Ft(t,n,{address:r,chain:e.chain,venue:e.venue});for(let n of e.chains||[]){let o=n.chain??n.name??n.slug??(n.chainId!=null?String(n.chainId):n.family)??"unknown",i={address:n.address??r,chain:o,venue:n.venue};n.native&&(n.native.amount==null||Number(n.native.amount)!==0)&&Ft(t,{...n.native,symbol:n.native.symbol??n.symbol??o},i);for(let a of n.assets||n.fungibleTokens?.assets||[])Ft(t,a,i);for(let a of n.collectibles?.assets||n.nfts||[])Ft(t,{...a,kind:"nft"},i);for(let a of n.spot?.balances||[])Ft(t,a,{...i,venue:"Hyperliquid spot"});let s=fh(n.perps?.accountValueUsd);s!=null&&Ft(t,{symbol:"perps account",usdValue:s},{...i,venue:"Hyperliquid perps"})}for(let n of e.inventory?.items||e.nfts?.items||[])Ft(t,{...n,kind:"nft"},{address:r,chain:n.chain??e.chain,venue:n.marketplace??e.venue});return t}function Lv(e,t){let r=ic(e),n=e.chain??e.chainId??e.family??"*";return r?`${String(r).toLowerCase()}|${String(n).toLowerCase()}`:`snapshot:${t}`}function nc(e,t,r){let n=new Map;for(let o of e){if(o.usdValue==null)continue;let i=o[t];n.set(i,(n.get(i)||0)+o.usdValue)}return[...n].map(([o,i])=>({name:o,knownUsd:kn(i),percentOfKnown:oc(i,r)})).sort((o,i)=>i.knownUsd-o.knownUsd||o.name.localeCompare(i.name))}function mh(e={},t={}){let r=Array.isArray(e)?e:Array.isArray(e.snapshots)?e.snapshots:e.snapshot?[e.snapshot]:[],n=$v(t.labels??t.addressBook??e.labels??e.addressBook),o={...Nv,...e.thresholds||{},...t.thresholds||{}},i=[],s=new Set,a=0;r.forEach((k,N)=>{if(!k||typeof k!="object")return;let I=Lv(k,N);s.has(I)?a+=1:(s.add(I),i.push(k))});let c=i.flatMap(qv),u=c.filter(k=>k.usdValue!=null),l=c.filter(k=>k.usdValue==null),d=i.reduce((k,N)=>k+Number(N.valuation?.unpricedNonzeroItems||N.unpricedNonzeroItems||0),0),p=kn(u.reduce((k,N)=>k+N.usdValue,0)),f=l.length+d,m=nc(u,"chain",p),h=nc(u,"venue",p),y=nc(u,"symbol",p);for(let k of m)k.chain=k.name;for(let k of h)k.venue=k.name;for(let k of y)k.asset=k.name,k.symbol=k.name;let x=kn(u.filter(k=>k.stablecoin).reduce((k,N)=>k+N.usdValue,0)),E=c.filter(k=>k.kind==="nft"),_=i.reduce((k,N)=>k+Number(N.valuation?.nftUnvaluedItems||0),0),w=E.filter(k=>k.usdValue==null).length+_,O=E.filter(k=>k.usdValue!=null).length,v=y[0]||null,g=v?v.percentOfKnown>=o.assetHighPct?"high":v.percentOfKnown>=o.assetMediumPct?"medium":"low":"unknown",b=[];f&&b.push(`${f} nonzero holding(s) have unknown USD value; they are excluded from totals and percentages.`),w&&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.`),v&&g!=="low"&&b.push(`Asset concentration is ${g}: ${v.name} is ${v.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.`),h[0]?.percentOfKnown>=o.venueHighPct&&b.push(`Venue concentration is high: ${h[0].name} is ${h[0].percentOfKnown}% of known value.`);let S=i.map(ic).filter(Boolean).map(k=>{let N=n.get(String(k).toLowerCase());return{address:k,label:N?.label??null,who:N?.who??null,role:N?.role??null}});return{totalKnownUsd:p,coverage:{complete:i.length>0&&f===0&&i.every(k=>k.valuation?.complete!==!1&&k.coverage?.complete!==!1),label:f===0&&i.length&&i.every(k=>k.valuation?.complete!==!1&&k.coverage?.complete!==!1)?"complete for the supplied snapshots":"known priced value only; portfolio coverage is partial or unverified",unknownUsd:f?null:0,pricedItemCount:u.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:g,topAsset:v?.name??null,topAssetPercent:v?.percentOfKnown??null,thresholds:{mediumPct:o.assetMediumPct,highPct:o.assetHighPct}},stablecoinExposure:{knownUsd:x,percentOfKnown:oc(x,p),high:p>0&&oc(x,p)>=o.stablecoinHighPct},nftCoverage:{status:E.length||_?w?"partial":"valued":"not-observed",valuedItems:O,unvaluedItems:w,knownUsd:kn(E.filter(k=>k.usdValue!=null).reduce((k,N)=>k+N.usdValue,0))},addresses:S,warnings:[...new Set(b)]}}var Nv,Pv,hh=A(()=>{Nv=Object.freeze({assetHighPct:50,assetMediumPct:25,chainHighPct:75,venueHighPct:60,stablecoinHighPct:70}),Pv=new Set(["USDC","USDT","USDT0","DAI","FRAX","LUSD","TUSD","USDP","GUSD","PYUSD","USDE"])});function yh(e){return me(e.asOf??e.updatedAt??e.timestamp,0)}function wh(e){return e.filledAt??e.executedAt??e.time??e.timestamp??e.asOf??e.updatedAt??e.createdAt}function Uv(e){return Number.isFinite(Number(wh(e)))}function bh(e){return me(wh(e),0)}function Bv(e){let t=new Set,r=[];return(e||[]).forEach((o,i)=>{if(!o||typeof o!="object"||!We(o))return;let s=xh(o);t.has(s)||(t.add(s),r.push({row:o,seq:i}))}),r.every(({row:o})=>Uv(o))?r.sort((o,i)=>bh(o.row)-bh(i.row)||o.seq-i.seq).map(({row:o})=>o):r.map(({row:o})=>o)}function xh(e){let t=e.fillId??e.tradeId??e.orderId??e.txHash??e.transactionHash??e.timestamp??e.asOf;return[ci(e),ue(t),ue(e.side),me(e.quantity??e.amount??e.size),me(e.price??e.priceUsd)].join("|")}function ai(e,t){let r=new Map,n=0;for(let o of e||[]){if(!o||typeof o!="object"||!We(o))continue;let i=t==="fill"?xh(o):ci(o);r.has(i)?(n+=1,t!=="fill"&&yh(o)>yh(r.get(i))&&r.set(i,{...o,identity:i})):r.set(i,{...o,identity:i})}return{rows:[...r.values()].sort((o,i)=>o.identity.localeCompare(i.identity)),duplicatesIgnored:n}}function Fv(e){let t=new Map;for(let r of e){let n=[ci(r),`${ue(r.chain??r.chainId)}|${ue(We(r))}`,`*|${ue(We(r))}`];for(let o of n)t.has(o)||t.set(o,r)}return t}function Dv(e,t){return t.get(ci(e))??t.get(`${ue(e.chain??e.chainId)}|${ue(We(e))}`)??t.get(`*|${ue(We(e))}`)??null}function Mv(e){let t=new Map,r=0;for(let n of e){let o=[ue(n.chain??n.chainId),ue(gh(n)),ue(We(n))].join("|"),i=t.get(o)??{quantity:0,cost:0},s=Math.abs(me(n.quantity??n.amount??n.size)),a=me(n.price??n.priceUsd),c=me(n.feeUsd);if(ue(n.side)==="sell"){let u=Math.min(s,i.quantity),l=i.quantity?i.cost/i.quantity:me(n.costBasisUsd)/(s||1);r+=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:Ve(r),lots:t}}function kh(e={},t={}){let r=me(t.asOf??e.asOf,0),n=Math.max(0,me(t.priceTtlMs??e.priceTtlMs,6e4)),o=ai(e.balances||[],"balance"),i=ai(e.positions||[],"position"),s=ai(e.fills||[],"fill"),a=ai(e.prices||[],"price"),c=Fv(a.rows),u=[],l=0,d=0;for(let S of[...o.rows,...i.rows]){let k=Dv(S,c),N=me(S.quantity??S.amount??S.size),I=k?me(k.priceUsd??k.price,NaN):me(S.priceUsd,NaN);if(!Number.isFinite(I)){d+=1;continue}let P=N*I,L=me(k?.asOf??S.priceAsOf,0),H=r-L>n;H&&(l+=Math.abs(P)),u.push({...S,quantity:N,priceUsd:I,valueUsd:P,stale:H,kind:i.rows.includes(S)?"position":"balance"})}let p=u.filter(S=>S.kind==="balance").reduce((S,k)=>S+k.valueUsd,0),f=u.filter(S=>S.kind==="position"),m=f.reduce((S,k)=>S+k.valueUsd,0),h=f.reduce((S,k)=>S+Math.abs(k.valueUsd),0),y=p+m,x=me(e.equityUsd,y),E=Mv(Bv(e.fills||[])).realizedPnlUsd,_=f.reduce((S,k)=>{let N=me(k.entryPriceUsd??k.averageEntryPrice??k.costBasisPrice,k.priceUsd);return S+k.quantity*(k.priceUsd-N)},0),w=new Map;for(let S of u)w.set(ue(We(S)),(w.get(ue(We(S)))||0)+Math.abs(S.valueUsd));let O=[...w.values()].reduce((S,k)=>S+k,0),v=[...w].map(([S,k])=>({asset:S,exposureUsd:Ve(k),percent:O?Ve(k/O*100):null})).sort((S,k)=>k.exposureUsd-S.exposureUsd||S.asset.localeCompare(k.asset)),g=u.reduce((S,k)=>S+Math.abs(k.valueUsd),0),b=mh({snapshots:[{assets:u.map(S=>({symbol:We(S),usdValue:Math.abs(S.valueUsd),chain:S.chain,venue:S.source}))}],thresholds:e.thresholds});return Object.freeze({asOf:r,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:Ve(_),totalUsd:Ve(E+_)},exposure:{grossUsd:Ve(h),netUsd:Ve(y),leverage:x>0?Ve(h/x):null,equityUsd:Ve(x)},concentration:v,priceCoverage:{pricedItems:u.length,unpricedItems:d,staleItems:u.filter(S=>S.stale).length,staleValueUsd:Ve(l),stalePercent:g?Ve(l/g*100):null,ttlMs:n},risk:b})}var me,Ve,ue,We,gh,ci,Sh=A(()=>{hh();me=(e,t=0)=>Number.isFinite(Number(e))?Number(e):t,Ve=e=>Math.round((e+Number.EPSILON)*1e8)/1e8,ue=(e,t="unknown")=>String(e??t).trim().toLowerCase(),We=e=>e.asset??e.symbol??e.coin,gh=e=>e.address??e.owner??e.account,ci=e=>[ue(e.chain??e.chainId),ue(gh(e)),ue(We(e)),ue(e.source)].join("|")});var oN,iN,sN,Eh=A(()=>{oN=Object.freeze(["chainId","agentAddress","accountAddress","actions","targets","maxValueWei","maxGasWei","maxSlippageBps","expiresAt","nonce","revocationKey"]),iN=Object.freeze(["read","simulate"]),sN=1440*60});function Ah(e){let t=String(e),r=t.toLowerCase().replace(/[\s._-]+/g,"");return jv.test(t)||Hv.includes(r)}function Dt(e,t="$",r=new Set,n=""){if(e==null)return e;if(typeof e=="string"){let o=Vv.includes(String(n).toLowerCase().replace(/[_-]/g,""));for(let{rule:i,re:s}of zv)if(!(o&&i.startsWith("raw-32-byte-hex"))&&s.test(e))throw new Sn(t,i);return e}if(typeof e!="object"||r.has(e)||(r.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"&&Ah(o))throw new Sn(`${t}[${JSON.stringify(o)}]`,"forbidden-key-name");Dt(o,`${t}[key]`,r),Dt(i,`${t}[${String(o)}]`,r)}return e}if(e instanceof Set){let o=0;for(let i of e.values())Dt(i,`${t}[${o++}]`,r);return e}if(Array.isArray(e))return e.forEach((o,i)=>Dt(o,`${t}[${i}]`,r)),e;for(let[o,i]of Object.entries(e)){if(Ah(o))throw new Sn(`${t}.${o}`,"forbidden-key-name");Dt(i,`${t}.${o}`,r,o)}return e}var Sn,jv,Hv,zv,Vv,vh=A(()=>{Eh();Sn=class extends Error{constructor(t,r){super(`secret material must never appear in a public API object (at ${t}, rule: ${r})`),this.name="SecretLeakError",this.path=t,this.rule=r}},jv=/(private[_-]?key|secret|bearer|keystore|mnemonic|seed[_-]?phrase|passphrase|password|api[_-]?key|access[_-]?token|auth[_-]?token|session[_-]?token|signer[_-]?url|signature)/i,Hv=Object.freeze(["privkey","wif","xprv","seed"]);zv=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}]),Vv=Object.freeze(["grantid","id","hash","sha256","sha256hex","checksum","txhash","transactionhash","blockhash","digest","userophash","commithash","prevhash","intenthash","canonicalhash","payloadhash","requestid"])});import{createHash as Wv}from"node:crypto";function ac(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(ac).join(",")}]`:`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${ac(e[t])}`).join(",")}}`}function Gv(e){return e===void 0?null:JSON.parse(JSON.stringify(e))}function ui(e){if(e&&typeof e=="object"&&!Object.isFrozen(e)){Object.freeze(e);for(let t of Object.values(e))ui(t)}return e}function cc(e,t="fact"){try{Dt(e,t)}catch{throw new Error(`${t} contains custody material and is forbidden`)}}function Oh(e){return Wv("sha256").update(ac(e)).digest("hex")}function Ch({tradeId:e,state:t,fact:r,asOf:n,previousHash:o,external:i}){let s={tradeId:e,state:t,asOf:n,previousHash:o??null,external:i===!0,fact:Gv(r)};return ui({...s,hash:Oh(s)})}function li({tradeId:e,intent:t,asOf:r=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");cc(t,"intent");let n=Ch({tradeId:e,state:"intent",fact:t,asOf:r,previousHash:null,external:!1});return ui({tradeId:e,state:"intent",events:[n],headHash:n.hash,custody:"none",execution:"prepare-only"})}function Th(e,t,r,n={}){if(uc(e),!(Ih[e.state]||[]).includes(t))throw new Error(`invalid trade transition ${e.state} -> ${t}`);if(!r||typeof r!="object"||Array.isArray(r))throw new Error(`${t} fact is required`);cc(r,t);let i=n.external===!0||n.externallySupplied===!0;if(_h.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=n.asOf??s.asOf;if(!Number.isFinite(Number(a))||Number(a)<Number(s.asOf))throw new Error("asOf must be finite and monotonic");let c=Ch({tradeId:e.tradeId,state:t,fact:r,asOf:a,previousHash:s.hash,external:i});return ui({...e,state:t,events:[...e.events,c],headHash:c.hash})}function uc(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 r=0;r<e.events.length;r+=1){let n=e.events[r],{hash:o,...i}=n;if(Oh(i)!==o)throw new Error(`trade event ${r} hash mismatch`);if(cc(n.fact,`trade event ${r} fact`),!Number.isFinite(Number(n.asOf))||t&&Number(n.asOf)<Number(t.asOf))throw new Error(`trade event ${r} asOf must be finite and monotonic`);if(n.tradeId!==e.tradeId||n.previousHash!==t?.hash&&r>0)throw new Error(`trade event ${r} chain mismatch`);if(r===0&&(n.state!=="intent"||n.previousHash!==null))throw new Error("trade lifecycle must start with intent");if(t&&!Ih[t.state]?.includes(n.state))throw new Error(`invalid recorded transition ${t.state} -> ${n.state}`);if(_h.has(n.state)&&n.external!==!0)throw new Error(`${n.state} is not externally supplied`);t=n}if(e.state!==t.state||e.headHash!==t.hash)throw new Error("trade lifecycle head mismatch");return!0}var sc,Ih,_h,lc=A(()=>{vh();sc=Object.freeze(["intent","quote_comparison","simulation","prepared","approval","signed","broadcast","settlement","balance_delta","position"]),Ih=Object.freeze(Object.fromEntries(sc.map((e,t)=>[e,Object.freeze(t+1<sc.length?[sc[t+1]]:[])]))),_h=new Set(["signed","broadcast"])});function Rh(e){let t=String(e?.type??e?.surface??e?.kind??"").toLowerCase();return Kv[t]??t}function Xv(e,t){return String(e?.id??e?.signalId??e?.asset??e?.market??e?.pool??e?.collection??`${Rh(e)}:${t}`)}function qe(e,t,r,n=!0){!n||r===null||!Number.isFinite(r)||e.push({feature:t,value:di(r)})}function Yv(e,t){let r=ve(e.repeatBuys??e.repeat_buys??e.buyCount),n=ve(e.walletWinRate??e.winRate);qe(t,"repeat_buys",r===null?null:he((r-1)/4)*.38),qe(t,"wallet_win_rate",n===null?null:(he(n)-.5)*.5)}function Jv(e,t){let r=ve(e.ageHours??e.poolAgeHours),n=ve(e.liquidityUsd??e.liquidity),o=e.liquidityLocked??e.locked;qe(t,"pool_age",r===null?null:r<24?-.42:he(r/720)*.12),qe(t,"liquidity",n===null?null:(he(Math.log10(Math.max(1,n))/7)-.5)*.28),qe(t,"liquidity_lock",o==null?null:o?.12:-.28)}function Qv(e,t){let r=ve(e.floorChange??e.floorChangePct),n=ve(e.sales??e.saleCount);qe(t,"floor_change",r===null?null:he(r,-1,1)*.35),qe(t,"sales_depth",n===null?null:he(n/50)*.18)}function Zv(e,t){let r=ve(e.flowImbalance??e.imbalance),n=ve(e.fundingRate??e.funding);qe(t,"flow_imbalance",r===null?null:he(r,-1,1)*.42),qe(t,"funding",n===null?null:-he(n*100,-1,1)*.12)}function e1(e,t){let r=ve(e.marketProbability??e.marketPrice??e.probability),n=ve(e.fairProbability??e.referenceProbability??e.fairValue);qe(t,"probability_mispricing",r===null||n===null?null:he(n-r,-1,1)*.65);let o=ve(e.liquidityUsd??e.liquidity);qe(t,"market_liquidity",o===null?null:he(Math.log10(Math.max(1,o))/6)*.12)}function r1(e,t,r){let n=r.filter(i=>{let s=i?.signalId??i?.eventId??i?.id??i?.asset??i?.market;return s!=null&&String(s)===t});if(n.length===0)return null;let o=n.map(i=>ve(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 pi(e=[],t=[],r={}){if(!Array.isArray(e)||!Array.isArray(t))throw new TypeError("events and markouts must be arrays");let n=he(ve(r.minimumCoverage)??.5);return e.map((o,i)=>{let s=Rh(o),a=Xv(o,i),c=t1[s],u=[];c&&c(o,u);let l=s==="wallet"?2:s==="pool"?3:2,d=di(he(u.length/l)),p=u.reduce((_,w)=>_+w.value,0),f=r1(o,a,t),m=f===null?0:he(f,-1,1)*.35;f!==null&&qe(u,"shadow_markout",m);let h=di(he(.5+p+m)),y=f===null?.8:he(.85+f*.3,.35,1),x=di(he(d*y)),E=["COLD_INTELLIGENCE_ONLY","NO_HOT_EXECUTION"];return c||E.push("UNSUPPORTED_SIGNAL_TYPE"),d<n&&E.push("LOW_COVERAGE","NO_TRADE"),x<.5&&E.push("LOW_CONFIDENCE","NO_TRADE"),s==="pool"&&(ve(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:x,coverage:d,contributions:u,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 wN,Kv,he,ve,di,t1,dc=A(()=>{wN=Object.freeze(["wallet","pool","nft_floor","hl_flow","prediction_market"]),Kv=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"}),he=(e,t=0,r=1)=>Math.min(r,Math.max(t,e)),ve=e=>Number.isFinite(Number(e))?Number(e):null,di=e=>Math.round(e*1e4)/1e4;t1=Object.freeze({wallet:Yv,pool:Jv,nft_floor:Qv,hl_flow:Zv,prediction_market:e1})});function n1(e=[],t=[],r={}){let n=pi(e,t,r),o=n.filter(a=>a&&a.noTrade!==!0&&a.executionAllowed===!1),i=n.filter(a=>a?.noTrade===!0),s=o.filter(a=>(a.confidence??0)>=(r.promoteMinConfidence??.55)&&(a.score??0)>=(r.promoteMinScore??.55));return{scored:n,candidates:s,blocked:i}}function o1(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 r=String(t.tradeId||`sig-${e.id||"unknown"}`).slice(0,128),n={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=li({tradeId:r,intent:n,asOf:t.asOf??Date.now()});return{tradeId:r,intent:n,lifecycle:o,recommendation:"PREPARE_RESEARCH_ONLY"}}function Nh(e=[],t=[],r={}){let{scored:n,candidates:o,blocked:i}=n1(e,t,r),s=Math.min(Math.max(Number(r.limit)||3,0),20),a=[];for(let c of o.slice(0,s))try{a.push(o1(c,{asOf:r.asOf,tradeId:r.tradeIdPrefix?`${r.tradeIdPrefix}-${c.id}`:void 0,intentExtra:r.intentExtra}))}catch{}return{ok:!0,cold:!0,executionAllowed:!1,scoredCount:n.length,blockedCount:i.length,intentCount:a.length,intents:a,blocked:i.slice(0,20)}}var Ph=A(()=>{dc();lc()});function $h(e){let t=s1[Number(e)]||[];return new Set([...t,...i1].map(r=>String(r).trim().toLowerCase()).filter(Boolean))}var i1,s1,qh=A(()=>{i1=["0x000000000022d473030f116ddee9f6b43ac78ba3"],s1={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 fi(e,t={}){e&&e.passes.push({ok:!0,kind:t.kind||"gather",name:t.name||null})}function pc(e){e&&(e.prepareAttempted=!0)}function fc(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 l1(e,t=process.env){let r=t&&typeof t=="object"?t:process.env,n=String(r.ORACLE_DEST_ALLOWLIST||r.MAD_DEST_ALLOWLIST||"").split(",").map(s=>s.trim().toLowerCase()).filter(Boolean),o=Number(e),i=Number.isInteger(o)&&o>0?[...$h(o)]:[];return new Set([...n,...i])}function d1(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 p1(e){return!e||typeof e!="object"?!1:!!(e.transaction||e.tx||e.to||e.destination||e.settlement||e.data||e.value!=null)}function f1(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 m1(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 h1(e,t={}){let r=[],n={unsigned:!1,destination:"n/a",slippage:"n/a"};if(!e||typeof e!="object"||Array.isArray(e))return{ok:!1,checks:n,errors:["prepared fact must be an object"]};e.signed===!0&&r.push("prepared fact is signed"),e.broadcast===!0&&r.push("prepared fact claims broadcast");for(let o of a1)e[o]&&r.push(`prepared fact carries ${o}`);for(let o of c1)e[o]&&r.push(`prepared fact claims executed ${o}`);if(n.unsigned=r.length===0,p1(e)){let o=f1(e),i=o.to==null?"":String(o.to).trim();if(!i)r.push("prepared transaction is missing destination"),n.destination="missing";else{let s=u1.test(i);if(i.startsWith("0x")&&!s)r.push("prepared destination is not a 20-byte address"),n.destination="malformed";else{let a=l1(o.chainId,t.env),c=i.toLowerCase(),u=!!(e.routeAttestation||e.madRoute||e.vaultGuard||e.madVault);a.size>0&&s&&!a.has(c)&&!u?(r.push(`destination ${c} not allowlisted`),n.destination="blocked"):n.destination=a.size===0?"unset":"allowlisted"}}}if(d1(e)){let o=m1(e),i=e.slippageGuard?.capBps!=null?Number(e.slippageGuard.capBps):st;!Number.isInteger(o)||o<0?(r.push("swap prepare is missing integer slippage bps"),n.slippage="missing"):o>st||Number.isInteger(i)&&o>i||Number.isInteger(i)&&i>st?(r.push(`slippage ${o} exceeds cap ${Math.min(i,st)}`),n.slippage="blocked"):n.slippage="ok"}return{ok:r.length===0,checks:n,errors:r}}function mc(e,t){let r=[];e?.execution!=="prepare-only"&&r.push("lifecycle execution must be prepare-only"),e?.custody!=="none"&&r.push("lifecycle custody must be none");let n=h1(t);return{ok:r.length===0&&n.ok,checks:n.checks,errors:[...r,...n.errors]}}var a1,c1,u1,Lh=A(()=>{qh();Ue();a1=Object.freeze(["signature","signedTx","signedTransaction","rawTransaction","signedPayload","signedRaw"]),c1=Object.freeze(["txid","txHash","transactionHash","broadcastHash"]),u1=/^0x[a-fA-F0-9]{40}$/});var Bh={};B(Bh,{DESK_TOOLS:()=>b1,runDeskTool:()=>w1});function g1(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")>y1)throw new TypeError("tool arguments exceed size limit")}function nt(e,t,r=[]){for(let o of t)if(!(o in e))throw new TypeError(`${o} is required`);let n=new Set([...t,...r]);for(let o of Object.keys(e))if(!n.has(o))throw new TypeError(`unexpected argument: ${o}`)}async function w1(e,t,r={}){if(g1(t),e==="research_artifact"){if(nt(t,["sourceUrl","fetchedAt","snapshot","claim","confidence"],["contradictions"]),String(t.snapshot).length>Uh)throw new TypeError("snapshot exceeds size limit");return{ok:!0,artifact:(r.createResearchArtifact||dh)(t)}}if(e==="portfolio_analyze")return nt(t,["ledger","asOf"],["priceTtlMs"]),{ok:!0,analysis:(r.summarizePortfolioLedger||kh)(t.ledger,{asOf:t.asOf,priceTtlMs:t.priceTtlMs})};if(e==="trade_lifecycle"){let n=r.createTradeLifecycle||li,o=r.advanceTradeLifecycle||Th,i=r.assertTradeLifecycle||uc;if(t.action==="create")return nt(t,["action","tradeId","intent"],["asOf"]),{ok:!0,lifecycle:n({tradeId:t.tradeId,intent:t.intent,asOf:t.asOf})};if(t.action==="verify"){if(nt(t,["action","lifecycle"]),i(t.lifecycle),t.lifecycle.state==="prepared"){pc(r.loopVerifier);let s=t.lifecycle.events?.findLast?.(c=>c.state==="prepared")||t.lifecycle.events?.filter(c=>c.state==="prepared").at(-1),a=mc(t.lifecycle,s?.fact||{});if(!a.ok)return fc(r.loopVerifier,{name:"trade_lifecycle",error:a.errors[0]}),{ok:!1,error:`prepare verifier failed: ${a.errors[0]}`,checks:a.checks};fi(r.loopVerifier,{kind:"prepare",name:"trade_lifecycle"})}else fi(r.loopVerifier,{kind:"lifecycle",name:"trade_lifecycle"});return{ok:!0,valid:!0,lifecycle:t.lifecycle}}if(t.action==="advance"){if(nt(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"){pc(r.loopVerifier);let a=mc(t.lifecycle,t.fact);if(!a.ok)return fc(r.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"&&fi(r.loopVerifier,{kind:"prepare",name:"trade_lifecycle"}),{ok:!0,lifecycle:s}}throw new TypeError("unknown trade lifecycle action")}if(e==="signal_score"){if(nt(t,["events"],["markouts","openIntents","limit"]),!Array.isArray(t.events))throw new TypeError("events must be an array");let n=Array.isArray(t.markouts)?t.markouts:[];if(t.openIntents===!0)return(r.signalsToPrepareIntents||Nh)(t.events,n,{limit:t.limit});let i=(r.scoreSignals||pi)(t.events,n);return{ok:!0,cold:!0,executionAllowed:!1,scored:i,noTradeCount:i.filter(s=>s.noTrade).length}}if(e==="workspace_artifact"){let n=r.openArtifactStore||sh,o=!r.artifactStore,i=r.artifactStore||await n(r.artifactStoreOptions||{});try{if(t.action==="get")return nt(t,["action","id"]),{ok:!0,artifact:await i.getArtifact(t.id)};if(t.action==="list")return nt(t,["action"],["type"]),{ok:!0,artifacts:await i.listArtifacts(t.type)};if(t.action==="put")return nt(t,["action","id","type","data","createdAt"]),{ok:!0,artifact:await i.putArtifact(t)};if(t.action==="link")return nt(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 y1,Uh,mi,Mt,En,b1,Fh=A(()=>{ah();ph();Sh();lc();dc();Ph();Lh();y1=128*1024,Uh=5e4,mi={type:"string",minLength:1,maxLength:256},Mt={type:"object",additionalProperties:!0},En=(e,t,r)=>Object.freeze({type:"function",function:Object.freeze({name:e,description:t,strict:!0,parameters:r})}),b1=Object.freeze([En("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:mi,type:{type:"string",enum:["project","entity","source","thesis","strategy","simulation","prepared_action","receipt","position"]},createdAt:{type:"string",minLength:1,maxLength:64},data:Mt,parentId:mi,childId:mi},required:["action"],additionalProperties:!1}),En("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:Uh},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}),En("portfolio_analyze","Deterministically summarize a caller-supplied portfolio ledger; performs no network or account access.",{type:"object",properties:{ledger:Mt,asOf:{type:"number"},priceTtlMs:{type:"number",minimum:0}},required:["ledger","asOf"],additionalProperties:!1}),En("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:mi,intent:Mt,lifecycle:Mt,state:{type:"string",enum:["quote_comparison","simulation","prepared","approval","settlement","balance_delta","position"]},fact:Mt,asOf:{type:"number"}},required:["action"],additionalProperties:!1}),En("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:Mt},markouts:{type:"array",maxItems:100,items:Mt},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 Dh={};B(Dh,{deployGloballyEnabled:()=>k1,executeGloballyEnabled:()=>x1,mevExecuteEnabled:()=>S1});function x1(){return _n("ORACLE_EXECUTE_ENABLED","MAD_EXECUTE_ENABLED",!1)}function k1(){return _n("ORACLE_DEPLOY_ENABLED","MAD_DEPLOY_ENABLED",!1)}function S1(){return _n("ORACLE_MEV_EXECUTE_ENABLED",null,!1)}var Mh=A(()=>{On()});On();import jh from"node:fs";import hc from"node:process";import{fileURLToPath as E1}from"node:url";import{createInterface as n0}from"node:readline";var Xe=Object.freeze({maxRequestBytes:256*1024,maxResponseBytes:2*1024*1024,maxTools:256,maxToolNameLength:64,maxArgumentBytes:128*1024,defaultCallTimeoutMs:3e4,maxCallTimeoutMs:6e4,maxConcurrentCalls:32}),o0=/^[A-Za-z0-9_-]{1,64}$/;function Cn(e,t){return{jsonrpc:"2.0",id:e??null,result:t}}function pe(e,t,r){return{jsonrpc:"2.0",id:e??null,error:{code:t,message:r}}}function i0(e){return!!(e&&typeof e=="object"&&!Array.isArray(e)&&e.jsonrpc==="2.0"&&typeof e.method=="string"&&e.method.length>0)}function s0(e){if(!Array.isArray(e))return[];let t=[],r=new Set;for(let n of e){if(t.length>=Xe.maxTools)break;if(!n||typeof n!="object"||Array.isArray(n))continue;let o=typeof n.name=="string"?n.name.trim():"";if(!o0.test(o)||r.has(o))continue;r.add(o);let i=n.inputSchema&&typeof n.inputSchema=="object"&&!Array.isArray(n.inputSchema)?{...n.inputSchema}:{type:"object",properties:{},additionalProperties:!1};i.type==="object"&&i.additionalProperties===void 0&&(i.additionalProperties=!1),t.push({...n,name:o,inputSchema:i})}return t}function a0(e){let t=Number(e)||Xe.defaultCallTimeoutMs;return Math.min(Math.max(t,1),Xe.maxCallTimeoutMs)}async function c0(e,t,r){let n;try{return await Promise.race([e,new Promise((o,i)=>{n=setTimeout(()=>{let s=new Error("tool call timed out");s.code="ORACLE_MCP_TIMEOUT",i(s);try{r?.()}catch{}},t)})])}finally{clearTimeout(n)}}function u0(e){return e===null?"null":Array.isArray(e)?"array":Number.isInteger(e)?"integer":typeof e}function Er(e,t,r="arguments",n=0){if(!t||typeof t!="object"||Array.isArray(t))return null;if(n>12)return`${r} exceeded the nesting limit`;if(Array.isArray(t.oneOf)&&t.oneOf.length&&!t.oneOf.some(i=>Er(e,i,r,n+1)===null))return`${r} did not match an allowed shape`;if(Array.isArray(t.anyOf)&&t.anyOf.length&&!t.anyOf.some(i=>Er(e,i,r,n+1)===null))return`${r} did not match a required alternative`;if(Array.isArray(t.enum)&&!t.enum.some(o=>Object.is(o,e)))return`${r} must be one of the allowed values`;if(Object.hasOwn(t,"const")&&!Object.is(t.const,e))return`${r} must equal the required constant`;if(t.type){let o=u0(e);if(!(t.type==="number"?typeof e=="number"&&Number.isFinite(e):t.type==="integer"?Number.isSafeInteger(e):o===t.type))return`${r} 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`${r} exceeded the string limit`;if(Number.isSafeInteger(t.minLength)&&e.length<t.minLength)return`${r} is too short`}if(Array.isArray(e)){let o=Math.min(Number.isSafeInteger(t.maxItems)?t.maxItems:1e3,1e3);if(e.length>o)return`${r} exceeded the array limit`;if(Number.isSafeInteger(t.minItems)&&e.length<t.minItems)return`${r} has too few items`;if(t.items)for(let i=0;i<e.length;i+=1){let s=Er(e[i],t.items,`${r}[${i}]`,n+1);if(s)return s}}if(e&&typeof e=="object"&&!Array.isArray(e)){let o=Object.keys(e);if(o.length>256)return`${r} 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`${r}.${s} is required`;if(t.additionalProperties===!1){let s=o.find(a=>!Object.hasOwn(i,a));if(s)return`${r}.${s} is not allowed`}for(let s of o){if(!Object.hasOwn(i,s))continue;let a=Er(e[s],i[s],`${r}.${s}`,n+1);if(a)return a}}return null}function Ei(e,t={}){let r=s0(e?.tools),n=new Set(r.map(u=>u.name)),o=new Map(r.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=a0(t.callTimeoutMs),c=!1;return async function(l){let d=l?.id??null;if(!i0(l))return pe(d,-32600,"invalid request");if(l.method==="initialize")return c=!0,Cn(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 Cn(d,{});if(!c)return pe(d,-32002,"server not initialized");if(l.method==="tools/list")return Cn(d,{tools:r});if(l.method==="tools/call"){let p=l.params?.name,f=l.params?.arguments??{};if(typeof p!="string"||!n.has(p))return pe(d,-32602,"unknown tool");if(!f||typeof f!="object"||Array.isArray(f))return pe(d,-32602,"tool arguments must be an object");let m;try{m=JSON.stringify(f)}catch{return pe(d,-32602,"tool arguments are not serializable")}if(Buffer.byteLength(m)>Xe.maxArgumentBytes)return pe(d,-32602,"tool arguments exceeded the size limit");let h=Er(f,o.get(p)?.inputSchema);if(h)return pe(d,-32602,h);try{let y=new AbortController,x=await c0(Promise.resolve(e.call(p,f,{signal:y.signal})),a,()=>y.abort(new Error("tool call timed out")));return Cn(d,x)}catch(y){if(y?.code==="ORACLE_MCP_TIMEOUT")return pe(d,-32001,"tool call timed out");let x=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(x),_=/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(x.replace(/\btoken(?:In|Out|s\b)/g,"asset"));return E&&!_&&x.length<=200?pe(d,-32e3,`tool call failed: ${x}`):pe(d,-32e3,"tool call failed")}}return pe(d,-32601,"method not found")}}function vc(e,t={}){let r=t.input||process.stdin,n=t.output||process.stdout,o=Math.min(Math.max(Number(t.maxRequestBytes)||Xe.maxRequestBytes,64),Xe.maxRequestBytes),i=Math.min(Math.max(Number(t.maxResponseBytes)||Xe.maxResponseBytes,256),Xe.maxResponseBytes),s=Math.min(Math.max(Number(t.maxConcurrentCalls)||Xe.maxConcurrentCalls,1),Xe.maxConcurrentCalls),a=s*8,c=Ei(e,t),u={closed:!1,inflight:0},l=n0({input:r,terminal:!1,crlfDelay:1/0}),d=0,p=[],f=!1,m=!1;function h(){if(u.closed||u.readerClosed)return;let w=u.inflight>=s||p.length>0||m;w&&!f?(f=!0,l.pause(),typeof r.pause=="function"&&r.pause()):!w&&f&&(f=!1,typeof r.resume=="function"&&r.resume(),l.resume())}function y(w){if(!w||u.closed)return;let O=JSON.stringify(w);Buffer.byteLength(O)>i&&(O=JSON.stringify(pe(w.id,-32003,"response exceeded the size limit"))),n.write(`${O}
23
+ `);let i=!1,s=Promise.resolve();function a(){let u=async()=>{let l=`${t}.tmp-${process.pid}`;await Fv(l,Buffer.from(o.export()),{mode:384}),await si(l,384),await Bv(l,t),await si(t,384)};return s=s.then(u,u),s}r?await si(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=hh(String(u.type)),d=String(u.id||"").trim();if(!d)throw new TypeError("artifact id required");let p=Sr(u.data??{}),f=String(u.createdAt||new Date().toISOString());return o.run("INSERT INTO artifacts(id,type,created_at,data_json) VALUES(?,?,?,?)",[d,l,f,ui(p)]),await a(),{id:d,type:l,createdAt:f,data:p}},getArtifact(u){c();let l=o.prepare("SELECT * FROM artifacts WHERE id=?");l.bind([String(u)]);let d=l.step()?ci(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"):(hh(String(u)),o.prepare("SELECT * FROM artifacts WHERE type=? ORDER BY created_at,id"));return u!==void 0&&l.bind([String(u)]),ai(l).map(ci)},async link(u,l){c();let d=o.prepare("SELECT id,type FROM artifacts WHERE id IN (?,?)");d.bind([String(u),String(l)]);let p=ai(d),f=p.find(h=>h.id===String(u)),m=p.find(h=>h.id===String(l));if(!f||!m)throw new TypeError("edge endpoints must exist");if(!Hv.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(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)]),ai(l).map(ci)},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)]),ai(l).map(ci)},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 p=Sr(l);return o.run("INSERT INTO action_receipts(artifact_id,receipt_json) VALUES(?,?)",[String(u),ui(p)]),await a(),p},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 ic,jv,Hv,zv,Vv,bh=A(()=>{nc();ic=Object.freeze(["project","entity","source","thesis","strategy","simulation","prepared_action","receipt","position"]),jv=new Set(ic),Hv=new Set(ic.slice(0,-1).map((e,t)=>`${e}:${ic[t+1]}`)),zv=oc(process.env.ORACLE_CONFIG_DIR||oc(Dv(),".config","oracle"),"workspace"),Vv=oc(zv,"artifacts.sqlite")});import{createHash as gh}from"node:crypto";function Gv(e){return Wv.has(String(e).replace(/[^a-z0-9]/gi,"").toLowerCase())}function sc(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(sc).join(",")}]`:`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${sc(e[t])}`).join(",")}}`}function Kv(e){return gh("sha256").update(String(e)).digest("hex")}function wh(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 r of t.searchParams.keys())if(Gv(r))throw new TypeError("research source URL must not contain sensitive query parameters");return t.toString()}function xh(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 Xv(e={}){let t=wh(e.url??e.sourceUrl),r=xh(e.fetchedAt),n=String(e.contentHash||"").toLowerCase();if(!/^[0-9a-f]{64}$/.test(n))throw new TypeError("research citation contentHash must be 64 lowercase hex characters");return Object.freeze(Sr({url:t,fetchedAt:r,contentHash:n}))}function kh(e={}){let t=wh(e.sourceUrl??e.url),r=String(e.snapshot??e.content??"");if(!r)throw new TypeError("research snapshot required");let n=String(e.claim||"").trim();if(!n)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=xh(e.fetchedAt),s=Kv(r);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(Xv),c=Sr({sourceUrl:t,fetchedAt:i,contentHash:s,snapshot:r,claim:n,confidence:o,contradictions:(e.contradictions||[]).map(String),citations:a});return Object.freeze({id:`research:${gh("sha256").update(sc(c)).digest("hex")}`,...c})}var Wv,Sh=A(()=>{nc();Wv=new Set(["accesstoken","refreshtoken","idtoken","token","apikey","clientsecret","password","auth","jwt","session","secret","key","code","signature","xamzsignature","privatekey","authorization","bearer","credential"])});function Eh(e){if(e===null||e===""||e===void 0)return null;let t=Number(e);return Number.isFinite(t)&&t>=0?t:null}function An(e){return Math.round((e+Number.EPSILON)*1e8)/1e8}function cc(e,t){return t>0?An(e/t*100):null}function uc(e){return e.address||e.owner||e.walletAddress||e.wallet?.address||null}function Qv(e){let t=Array.isArray(e)?e:Array.isArray(e?.entries)?e.entries:[],r=new Map;for(let n of t){if(!n?.address)continue;let o=String(n.address).toLowerCase();r.has(o)||r.set(o,n)}return r}function Dt(e,t,r={}){if(!t||typeof t!="object")return;let n=String(t.symbol??t.coin??t.name??t.collection??t.tokenId??"unknown"),o=Eh(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:n,usdValue:o,chain:String(t.chain??t.chainName??r.chain??"unknown"),venue:String(t.venue??t.protocol??t.platform??r.venue??"wallet"),address:t.address??r.address??null,kind:i,stablecoin:t.stablecoin===!0||Jv.has(n.toUpperCase())})}function Zv(e){let t=[],r=uc(e);for(let n of e.assets||e.holdings||[])Dt(t,n,{address:r,chain:e.chain,venue:e.venue});for(let n of e.chains||[]){let o=n.chain??n.name??n.slug??(n.chainId!=null?String(n.chainId):n.family)??"unknown",i={address:n.address??r,chain:o,venue:n.venue};n.native&&(n.native.amount==null||Number(n.native.amount)!==0)&&Dt(t,{...n.native,symbol:n.native.symbol??n.symbol??o},i);for(let a of n.assets||n.fungibleTokens?.assets||[])Dt(t,a,i);for(let a of n.collectibles?.assets||n.nfts||[])Dt(t,{...a,kind:"nft"},i);for(let a of n.spot?.balances||[])Dt(t,a,{...i,venue:"Hyperliquid spot"});let s=Eh(n.perps?.accountValueUsd);s!=null&&Dt(t,{symbol:"perps account",usdValue:s},{...i,venue:"Hyperliquid perps"})}for(let n of e.inventory?.items||e.nfts?.items||[])Dt(t,{...n,kind:"nft"},{address:r,chain:n.chain??e.chain,venue:n.marketplace??e.venue});return t}function e1(e,t){let r=uc(e),n=e.chain??e.chainId??e.family??"*";return r?`${String(r).toLowerCase()}|${String(n).toLowerCase()}`:`snapshot:${t}`}function ac(e,t,r){let n=new Map;for(let o of e){if(o.usdValue==null)continue;let i=o[t];n.set(i,(n.get(i)||0)+o.usdValue)}return[...n].map(([o,i])=>({name:o,knownUsd:An(i),percentOfKnown:cc(i,r)})).sort((o,i)=>i.knownUsd-o.knownUsd||o.name.localeCompare(i.name))}function Ah(e={},t={}){let r=Array.isArray(e)?e:Array.isArray(e.snapshots)?e.snapshots:e.snapshot?[e.snapshot]:[],n=Qv(t.labels??t.addressBook??e.labels??e.addressBook),o={...Yv,...e.thresholds||{},...t.thresholds||{}},i=[],s=new Set,a=0;r.forEach((k,N)=>{if(!k||typeof k!="object")return;let I=e1(k,N);s.has(I)?a+=1:(s.add(I),i.push(k))});let c=i.flatMap(Zv),u=c.filter(k=>k.usdValue!=null),l=c.filter(k=>k.usdValue==null),d=i.reduce((k,N)=>k+Number(N.valuation?.unpricedNonzeroItems||N.unpricedNonzeroItems||0),0),p=An(u.reduce((k,N)=>k+N.usdValue,0)),f=l.length+d,m=ac(u,"chain",p),h=ac(u,"venue",p),y=ac(u,"symbol",p);for(let k of m)k.chain=k.name;for(let k of h)k.venue=k.name;for(let k of y)k.asset=k.name,k.symbol=k.name;let x=An(u.filter(k=>k.stablecoin).reduce((k,N)=>k+N.usdValue,0)),E=c.filter(k=>k.kind==="nft"),_=i.reduce((k,N)=>k+Number(N.valuation?.nftUnvaluedItems||0),0),w=E.filter(k=>k.usdValue==null).length+_,O=E.filter(k=>k.usdValue!=null).length,v=y[0]||null,g=v?v.percentOfKnown>=o.assetHighPct?"high":v.percentOfKnown>=o.assetMediumPct?"medium":"low":"unknown",b=[];f&&b.push(`${f} nonzero holding(s) have unknown USD value; they are excluded from totals and percentages.`),w&&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.`),v&&g!=="low"&&b.push(`Asset concentration is ${g}: ${v.name} is ${v.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.`),h[0]?.percentOfKnown>=o.venueHighPct&&b.push(`Venue concentration is high: ${h[0].name} is ${h[0].percentOfKnown}% of known value.`);let S=i.map(uc).filter(Boolean).map(k=>{let N=n.get(String(k).toLowerCase());return{address:k,label:N?.label??null,who:N?.who??null,role:N?.role??null}});return{totalKnownUsd:p,coverage:{complete:i.length>0&&f===0&&i.every(k=>k.valuation?.complete!==!1&&k.coverage?.complete!==!1),label:f===0&&i.length&&i.every(k=>k.valuation?.complete!==!1&&k.coverage?.complete!==!1)?"complete for the supplied snapshots":"known priced value only; portfolio coverage is partial or unverified",unknownUsd:f?null:0,pricedItemCount:u.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:g,topAsset:v?.name??null,topAssetPercent:v?.percentOfKnown??null,thresholds:{mediumPct:o.assetMediumPct,highPct:o.assetHighPct}},stablecoinExposure:{knownUsd:x,percentOfKnown:cc(x,p),high:p>0&&cc(x,p)>=o.stablecoinHighPct},nftCoverage:{status:E.length||_?w?"partial":"valued":"not-observed",valuedItems:O,unvaluedItems:w,knownUsd:An(E.filter(k=>k.usdValue!=null).reduce((k,N)=>k+N.usdValue,0))},addresses:S,warnings:[...new Set(b)]}}var Yv,Jv,vh=A(()=>{Yv=Object.freeze({assetHighPct:50,assetMediumPct:25,chainHighPct:75,venueHighPct:60,stablecoinHighPct:70}),Jv=new Set(["USDC","USDT","USDT0","DAI","FRAX","LUSD","TUSD","USDP","GUSD","PYUSD","USDE"])});function Ih(e){return me(e.asOf??e.updatedAt??e.timestamp,0)}function Ch(e){return e.filledAt??e.executedAt??e.time??e.timestamp??e.asOf??e.updatedAt??e.createdAt}function t1(e){return Number.isFinite(Number(Ch(e)))}function _h(e){return me(Ch(e),0)}function r1(e){let t=new Set,r=[];return(e||[]).forEach((o,i)=>{if(!o||typeof o!="object"||!We(o))return;let s=Th(o);t.has(s)||(t.add(s),r.push({row:o,seq:i}))}),r.every(({row:o})=>t1(o))?r.sort((o,i)=>_h(o.row)-_h(i.row)||o.seq-i.seq).map(({row:o})=>o):r.map(({row:o})=>o)}function Th(e){let t=e.fillId??e.tradeId??e.orderId??e.txHash??e.transactionHash??e.timestamp??e.asOf;return[di(e),ue(t),ue(e.side),me(e.quantity??e.amount??e.size),me(e.price??e.priceUsd)].join("|")}function li(e,t){let r=new Map,n=0;for(let o of e||[]){if(!o||typeof o!="object"||!We(o))continue;let i=t==="fill"?Th(o):di(o);r.has(i)?(n+=1,t!=="fill"&&Ih(o)>Ih(r.get(i))&&r.set(i,{...o,identity:i})):r.set(i,{...o,identity:i})}return{rows:[...r.values()].sort((o,i)=>o.identity.localeCompare(i.identity)),duplicatesIgnored:n}}function n1(e){let t=new Map;for(let r of e){let n=[di(r),`${ue(r.chain??r.chainId)}|${ue(We(r))}`,`*|${ue(We(r))}`];for(let o of n)t.has(o)||t.set(o,r)}return t}function o1(e,t){return t.get(di(e))??t.get(`${ue(e.chain??e.chainId)}|${ue(We(e))}`)??t.get(`*|${ue(We(e))}`)??null}function i1(e){let t=new Map,r=0;for(let n of e){let o=[ue(n.chain??n.chainId),ue(Oh(n)),ue(We(n))].join("|"),i=t.get(o)??{quantity:0,cost:0},s=Math.abs(me(n.quantity??n.amount??n.size)),a=me(n.price??n.priceUsd),c=me(n.feeUsd);if(ue(n.side)==="sell"){let u=Math.min(s,i.quantity),l=i.quantity?i.cost/i.quantity:me(n.costBasisUsd)/(s||1);r+=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:Ve(r),lots:t}}function Rh(e={},t={}){let r=me(t.asOf??e.asOf,0),n=Math.max(0,me(t.priceTtlMs??e.priceTtlMs,6e4)),o=li(e.balances||[],"balance"),i=li(e.positions||[],"position"),s=li(e.fills||[],"fill"),a=li(e.prices||[],"price"),c=n1(a.rows),u=[],l=0,d=0;for(let S of[...o.rows,...i.rows]){let k=o1(S,c),N=me(S.quantity??S.amount??S.size),I=k?me(k.priceUsd??k.price,NaN):me(S.priceUsd,NaN);if(!Number.isFinite(I)){d+=1;continue}let P=N*I,L=me(k?.asOf??S.priceAsOf,0),H=r-L>n;H&&(l+=Math.abs(P)),u.push({...S,quantity:N,priceUsd:I,valueUsd:P,stale:H,kind:i.rows.includes(S)?"position":"balance"})}let p=u.filter(S=>S.kind==="balance").reduce((S,k)=>S+k.valueUsd,0),f=u.filter(S=>S.kind==="position"),m=f.reduce((S,k)=>S+k.valueUsd,0),h=f.reduce((S,k)=>S+Math.abs(k.valueUsd),0),y=p+m,x=me(e.equityUsd,y),E=i1(r1(e.fills||[])).realizedPnlUsd,_=f.reduce((S,k)=>{let N=me(k.entryPriceUsd??k.averageEntryPrice??k.costBasisPrice,k.priceUsd);return S+k.quantity*(k.priceUsd-N)},0),w=new Map;for(let S of u)w.set(ue(We(S)),(w.get(ue(We(S)))||0)+Math.abs(S.valueUsd));let O=[...w.values()].reduce((S,k)=>S+k,0),v=[...w].map(([S,k])=>({asset:S,exposureUsd:Ve(k),percent:O?Ve(k/O*100):null})).sort((S,k)=>k.exposureUsd-S.exposureUsd||S.asset.localeCompare(k.asset)),g=u.reduce((S,k)=>S+Math.abs(k.valueUsd),0),b=Ah({snapshots:[{assets:u.map(S=>({symbol:We(S),usdValue:Math.abs(S.valueUsd),chain:S.chain,venue:S.source}))}],thresholds:e.thresholds});return Object.freeze({asOf:r,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:Ve(_),totalUsd:Ve(E+_)},exposure:{grossUsd:Ve(h),netUsd:Ve(y),leverage:x>0?Ve(h/x):null,equityUsd:Ve(x)},concentration:v,priceCoverage:{pricedItems:u.length,unpricedItems:d,staleItems:u.filter(S=>S.stale).length,staleValueUsd:Ve(l),stalePercent:g?Ve(l/g*100):null,ttlMs:n},risk:b})}var me,Ve,ue,We,Oh,di,Nh=A(()=>{vh();me=(e,t=0)=>Number.isFinite(Number(e))?Number(e):t,Ve=e=>Math.round((e+Number.EPSILON)*1e8)/1e8,ue=(e,t="unknown")=>String(e??t).trim().toLowerCase(),We=e=>e.asset??e.symbol??e.coin,Oh=e=>e.address??e.owner??e.account,di=e=>[ue(e.chain??e.chainId),ue(Oh(e)),ue(We(e)),ue(e.source)].join("|")});var _N,ON,CN,Ph=A(()=>{_N=Object.freeze(["chainId","agentAddress","accountAddress","actions","targets","maxValueWei","maxGasWei","maxSlippageBps","expiresAt","nonce","revocationKey"]),ON=Object.freeze(["read","simulate"]),CN=1440*60});function $h(e){let t=String(e),r=t.toLowerCase().replace(/[\s._-]+/g,"");return s1.test(t)||a1.includes(r)}function Mt(e,t="$",r=new Set,n=""){if(e==null)return e;if(typeof e=="string"){let o=u1.includes(String(n).toLowerCase().replace(/[_-]/g,""));for(let{rule:i,re:s}of c1)if(!(o&&i.startsWith("raw-32-byte-hex"))&&s.test(e))throw new vn(t,i);return e}if(typeof e!="object"||r.has(e)||(r.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"&&$h(o))throw new vn(`${t}[${JSON.stringify(o)}]`,"forbidden-key-name");Mt(o,`${t}[key]`,r),Mt(i,`${t}[${String(o)}]`,r)}return e}if(e instanceof Set){let o=0;for(let i of e.values())Mt(i,`${t}[${o++}]`,r);return e}if(Array.isArray(e))return e.forEach((o,i)=>Mt(o,`${t}[${i}]`,r)),e;for(let[o,i]of Object.entries(e)){if($h(o))throw new vn(`${t}.${o}`,"forbidden-key-name");Mt(i,`${t}.${o}`,r,o)}return e}var vn,s1,a1,c1,u1,qh=A(()=>{Ph();vn=class extends Error{constructor(t,r){super(`secret material must never appear in a public API object (at ${t}, rule: ${r})`),this.name="SecretLeakError",this.path=t,this.rule=r}},s1=/(private[_-]?key|secret|bearer|keystore|mnemonic|seed[_-]?phrase|passphrase|password|api[_-]?key|access[_-]?token|auth[_-]?token|session[_-]?token|signer[_-]?url|signature)/i,a1=Object.freeze(["privkey","wif","xprv","seed"]);c1=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}]),u1=Object.freeze(["grantid","id","hash","sha256","sha256hex","checksum","txhash","transactionhash","blockhash","digest","userophash","commithash","prevhash","intenthash","canonicalhash","payloadhash","requestid"])});import{createHash as l1}from"node:crypto";function dc(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(dc).join(",")}]`:`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${dc(e[t])}`).join(",")}}`}function d1(e){return e===void 0?null:JSON.parse(JSON.stringify(e))}function pi(e){if(e&&typeof e=="object"&&!Object.isFrozen(e)){Object.freeze(e);for(let t of Object.values(e))pi(t)}return e}function pc(e,t="fact"){try{Mt(e,t)}catch{throw new Error(`${t} contains custody material and is forbidden`)}}function Bh(e){return l1("sha256").update(dc(e)).digest("hex")}function Fh({tradeId:e,state:t,fact:r,asOf:n,previousHash:o,external:i}){let s={tradeId:e,state:t,asOf:n,previousHash:o??null,external:i===!0,fact:d1(r)};return pi({...s,hash:Bh(s)})}function fi({tradeId:e,intent:t,asOf:r=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");pc(t,"intent");let n=Fh({tradeId:e,state:"intent",fact:t,asOf:r,previousHash:null,external:!1});return pi({tradeId:e,state:"intent",events:[n],headHash:n.hash,custody:"none",execution:"prepare-only"})}function Dh(e,t,r,n={}){if(fc(e),!(Lh[e.state]||[]).includes(t))throw new Error(`invalid trade transition ${e.state} -> ${t}`);if(!r||typeof r!="object"||Array.isArray(r))throw new Error(`${t} fact is required`);pc(r,t);let i=n.external===!0||n.externallySupplied===!0;if(Uh.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=n.asOf??s.asOf;if(!Number.isFinite(Number(a))||Number(a)<Number(s.asOf))throw new Error("asOf must be finite and monotonic");let c=Fh({tradeId:e.tradeId,state:t,fact:r,asOf:a,previousHash:s.hash,external:i});return pi({...e,state:t,events:[...e.events,c],headHash:c.hash})}function fc(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 r=0;r<e.events.length;r+=1){let n=e.events[r],{hash:o,...i}=n;if(Bh(i)!==o)throw new Error(`trade event ${r} hash mismatch`);if(pc(n.fact,`trade event ${r} fact`),!Number.isFinite(Number(n.asOf))||t&&Number(n.asOf)<Number(t.asOf))throw new Error(`trade event ${r} asOf must be finite and monotonic`);if(n.tradeId!==e.tradeId||n.previousHash!==t?.hash&&r>0)throw new Error(`trade event ${r} chain mismatch`);if(r===0&&(n.state!=="intent"||n.previousHash!==null))throw new Error("trade lifecycle must start with intent");if(t&&!Lh[t.state]?.includes(n.state))throw new Error(`invalid recorded transition ${t.state} -> ${n.state}`);if(Uh.has(n.state)&&n.external!==!0)throw new Error(`${n.state} is not externally supplied`);t=n}if(e.state!==t.state||e.headHash!==t.hash)throw new Error("trade lifecycle head mismatch");return!0}var lc,Lh,Uh,mc=A(()=>{qh();lc=Object.freeze(["intent","quote_comparison","simulation","prepared","approval","signed","broadcast","settlement","balance_delta","position"]),Lh=Object.freeze(Object.fromEntries(lc.map((e,t)=>[e,Object.freeze(t+1<lc.length?[lc[t+1]]:[])]))),Uh=new Set(["signed","broadcast"])});function Mh(e){let t=String(e?.type??e?.surface??e?.kind??"").toLowerCase();return p1[t]??t}function f1(e,t){return String(e?.id??e?.signalId??e?.asset??e?.market??e?.pool??e?.collection??`${Mh(e)}:${t}`)}function qe(e,t,r,n=!0){!n||r===null||!Number.isFinite(r)||e.push({feature:t,value:mi(r)})}function m1(e,t){let r=ve(e.repeatBuys??e.repeat_buys??e.buyCount),n=ve(e.walletWinRate??e.winRate);qe(t,"repeat_buys",r===null?null:he((r-1)/4)*.38),qe(t,"wallet_win_rate",n===null?null:(he(n)-.5)*.5)}function h1(e,t){let r=ve(e.ageHours??e.poolAgeHours),n=ve(e.liquidityUsd??e.liquidity),o=e.liquidityLocked??e.locked;qe(t,"pool_age",r===null?null:r<24?-.42:he(r/720)*.12),qe(t,"liquidity",n===null?null:(he(Math.log10(Math.max(1,n))/7)-.5)*.28),qe(t,"liquidity_lock",o==null?null:o?.12:-.28)}function y1(e,t){let r=ve(e.floorChange??e.floorChangePct),n=ve(e.sales??e.saleCount);qe(t,"floor_change",r===null?null:he(r,-1,1)*.35),qe(t,"sales_depth",n===null?null:he(n/50)*.18)}function b1(e,t){let r=ve(e.flowImbalance??e.imbalance),n=ve(e.fundingRate??e.funding);qe(t,"flow_imbalance",r===null?null:he(r,-1,1)*.42),qe(t,"funding",n===null?null:-he(n*100,-1,1)*.12)}function g1(e,t){let r=ve(e.marketProbability??e.marketPrice??e.probability),n=ve(e.fairProbability??e.referenceProbability??e.fairValue);qe(t,"probability_mispricing",r===null||n===null?null:he(n-r,-1,1)*.65);let o=ve(e.liquidityUsd??e.liquidity);qe(t,"market_liquidity",o===null?null:he(Math.log10(Math.max(1,o))/6)*.12)}function x1(e,t,r){let n=r.filter(i=>{let s=i?.signalId??i?.eventId??i?.id??i?.asset??i?.market;return s!=null&&String(s)===t});if(n.length===0)return null;let o=n.map(i=>ve(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 hi(e=[],t=[],r={}){if(!Array.isArray(e)||!Array.isArray(t))throw new TypeError("events and markouts must be arrays");let n=he(ve(r.minimumCoverage)??.5);return e.map((o,i)=>{let s=Mh(o),a=f1(o,i),c=w1[s],u=[];c&&c(o,u);let l=s==="wallet"?2:s==="pool"?3:2,d=mi(he(u.length/l)),p=u.reduce((_,w)=>_+w.value,0),f=x1(o,a,t),m=f===null?0:he(f,-1,1)*.35;f!==null&&qe(u,"shadow_markout",m);let h=mi(he(.5+p+m)),y=f===null?.8:he(.85+f*.3,.35,1),x=mi(he(d*y)),E=["COLD_INTELLIGENCE_ONLY","NO_HOT_EXECUTION"];return c||E.push("UNSUPPORTED_SIGNAL_TYPE"),d<n&&E.push("LOW_COVERAGE","NO_TRADE"),x<.5&&E.push("LOW_CONFIDENCE","NO_TRADE"),s==="pool"&&(ve(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:x,coverage:d,contributions:u,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 jN,p1,he,ve,mi,w1,hc=A(()=>{jN=Object.freeze(["wallet","pool","nft_floor","hl_flow","prediction_market"]),p1=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"}),he=(e,t=0,r=1)=>Math.min(r,Math.max(t,e)),ve=e=>Number.isFinite(Number(e))?Number(e):null,mi=e=>Math.round(e*1e4)/1e4;w1=Object.freeze({wallet:m1,pool:h1,nft_floor:y1,hl_flow:b1,prediction_market:g1})});function k1(e=[],t=[],r={}){let n=hi(e,t,r),o=n.filter(a=>a&&a.noTrade!==!0&&a.executionAllowed===!1),i=n.filter(a=>a?.noTrade===!0),s=o.filter(a=>(a.confidence??0)>=(r.promoteMinConfidence??.55)&&(a.score??0)>=(r.promoteMinScore??.55));return{scored:n,candidates:s,blocked:i}}function S1(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 r=String(t.tradeId||`sig-${e.id||"unknown"}`).slice(0,128),n={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=fi({tradeId:r,intent:n,asOf:t.asOf??Date.now()});return{tradeId:r,intent:n,lifecycle:o,recommendation:"PREPARE_RESEARCH_ONLY"}}function jh(e=[],t=[],r={}){let{scored:n,candidates:o,blocked:i}=k1(e,t,r),s=Math.min(Math.max(Number(r.limit)||3,0),20),a=[];for(let c of o.slice(0,s))try{a.push(S1(c,{asOf:r.asOf,tradeId:r.tradeIdPrefix?`${r.tradeIdPrefix}-${c.id}`:void 0,intentExtra:r.intentExtra}))}catch{}return{ok:!0,cold:!0,executionAllowed:!1,scoredCount:n.length,blockedCount:i.length,intentCount:a.length,intents:a,blocked:i.slice(0,20)}}var Hh=A(()=>{hc();mc()});function zh(e){let t=A1[Number(e)]||[];return new Set([...t,...E1].map(r=>String(r).trim().toLowerCase()).filter(Boolean))}var E1,A1,Vh=A(()=>{E1=["0x000000000022d473030f116ddee9f6b43ac78ba3"],A1={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 yi(e,t={}){e&&e.passes.push({ok:!0,kind:t.kind||"gather",name:t.name||null})}function yc(e){e&&(e.prepareAttempted=!0)}function bc(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 O1(e,t=process.env){let r=t&&typeof t=="object"?t:process.env,n=String(r.ORACLE_DEST_ALLOWLIST||r.MAD_DEST_ALLOWLIST||"").split(",").map(s=>s.trim().toLowerCase()).filter(Boolean),o=Number(e),i=Number.isInteger(o)&&o>0?[...zh(o)]:[];return new Set([...n,...i])}function C1(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 T1(e){return!e||typeof e!="object"?!1:!!(e.transaction||e.tx||e.to||e.destination||e.settlement||e.data||e.value!=null)}function R1(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 N1(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 P1(e,t={}){let r=[],n={unsigned:!1,destination:"n/a",slippage:"n/a"};if(!e||typeof e!="object"||Array.isArray(e))return{ok:!1,checks:n,errors:["prepared fact must be an object"]};e.signed===!0&&r.push("prepared fact is signed"),e.broadcast===!0&&r.push("prepared fact claims broadcast");for(let o of v1)e[o]&&r.push(`prepared fact carries ${o}`);for(let o of I1)e[o]&&r.push(`prepared fact claims executed ${o}`);if(n.unsigned=r.length===0,T1(e)){let o=R1(e),i=o.to==null?"":String(o.to).trim();if(!i)r.push("prepared transaction is missing destination"),n.destination="missing";else{let s=_1.test(i);if(i.startsWith("0x")&&!s)r.push("prepared destination is not a 20-byte address"),n.destination="malformed";else{let a=O1(o.chainId,t.env),c=i.toLowerCase(),u=!!(e.routeAttestation||e.madRoute||e.vaultGuard||e.madVault);a.size>0&&s&&!a.has(c)&&!u?(r.push(`destination ${c} not allowlisted`),n.destination="blocked"):n.destination=a.size===0?"unset":"allowlisted"}}}if(C1(e)){let o=N1(e),i=e.slippageGuard?.capBps!=null?Number(e.slippageGuard.capBps):st;!Number.isInteger(o)||o<0?(r.push("swap prepare is missing integer slippage bps"),n.slippage="missing"):o>st||Number.isInteger(i)&&o>i||Number.isInteger(i)&&i>st?(r.push(`slippage ${o} exceeds cap ${Math.min(i,st)}`),n.slippage="blocked"):n.slippage="ok"}return{ok:r.length===0,checks:n,errors:r}}function gc(e,t){let r=[];e?.execution!=="prepare-only"&&r.push("lifecycle execution must be prepare-only"),e?.custody!=="none"&&r.push("lifecycle custody must be none");let n=P1(t);return{ok:r.length===0&&n.ok,checks:n.checks,errors:[...r,...n.errors]}}var v1,I1,_1,Wh=A(()=>{Vh();Ue();v1=Object.freeze(["signature","signedTx","signedTransaction","rawTransaction","signedPayload","signedRaw"]),I1=Object.freeze(["txid","txHash","transactionHash","broadcastHash"]),_1=/^0x[a-fA-F0-9]{40}$/});var Kh={};B(Kh,{DESK_TOOLS:()=>q1,runDeskTool:()=>U1});function L1(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")>$1)throw new TypeError("tool arguments exceed size limit")}function nt(e,t,r=[]){for(let o of t)if(!(o in e))throw new TypeError(`${o} is required`);let n=new Set([...t,...r]);for(let o of Object.keys(e))if(!n.has(o))throw new TypeError(`unexpected argument: ${o}`)}async function U1(e,t,r={}){if(L1(t),e==="research_artifact"){if(nt(t,["sourceUrl","fetchedAt","snapshot","claim","confidence"],["contradictions"]),String(t.snapshot).length>Gh)throw new TypeError("snapshot exceeds size limit");return{ok:!0,artifact:(r.createResearchArtifact||kh)(t)}}if(e==="portfolio_analyze")return nt(t,["ledger","asOf"],["priceTtlMs"]),{ok:!0,analysis:(r.summarizePortfolioLedger||Rh)(t.ledger,{asOf:t.asOf,priceTtlMs:t.priceTtlMs})};if(e==="trade_lifecycle"){let n=r.createTradeLifecycle||fi,o=r.advanceTradeLifecycle||Dh,i=r.assertTradeLifecycle||fc;if(t.action==="create")return nt(t,["action","tradeId","intent"],["asOf"]),{ok:!0,lifecycle:n({tradeId:t.tradeId,intent:t.intent,asOf:t.asOf})};if(t.action==="verify"){if(nt(t,["action","lifecycle"]),i(t.lifecycle),t.lifecycle.state==="prepared"){yc(r.loopVerifier);let s=t.lifecycle.events?.findLast?.(c=>c.state==="prepared")||t.lifecycle.events?.filter(c=>c.state==="prepared").at(-1),a=gc(t.lifecycle,s?.fact||{});if(!a.ok)return bc(r.loopVerifier,{name:"trade_lifecycle",error:a.errors[0]}),{ok:!1,error:`prepare verifier failed: ${a.errors[0]}`,checks:a.checks};yi(r.loopVerifier,{kind:"prepare",name:"trade_lifecycle"})}else yi(r.loopVerifier,{kind:"lifecycle",name:"trade_lifecycle"});return{ok:!0,valid:!0,lifecycle:t.lifecycle}}if(t.action==="advance"){if(nt(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"){yc(r.loopVerifier);let a=gc(t.lifecycle,t.fact);if(!a.ok)return bc(r.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"&&yi(r.loopVerifier,{kind:"prepare",name:"trade_lifecycle"}),{ok:!0,lifecycle:s}}throw new TypeError("unknown trade lifecycle action")}if(e==="signal_score"){if(nt(t,["events"],["markouts","openIntents","limit"]),!Array.isArray(t.events))throw new TypeError("events must be an array");let n=Array.isArray(t.markouts)?t.markouts:[];if(t.openIntents===!0)return(r.signalsToPrepareIntents||jh)(t.events,n,{limit:t.limit});let i=(r.scoreSignals||hi)(t.events,n);return{ok:!0,cold:!0,executionAllowed:!1,scored:i,noTradeCount:i.filter(s=>s.noTrade).length}}if(e==="workspace_artifact"){let n=r.openArtifactStore||yh,o=!r.artifactStore,i=r.artifactStore||await n(r.artifactStoreOptions||{});try{if(t.action==="get")return nt(t,["action","id"]),{ok:!0,artifact:await i.getArtifact(t.id)};if(t.action==="list")return nt(t,["action"],["type"]),{ok:!0,artifacts:await i.listArtifacts(t.type)};if(t.action==="put")return nt(t,["action","id","type","data","createdAt"]),{ok:!0,artifact:await i.putArtifact(t)};if(t.action==="link")return nt(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 $1,Gh,bi,jt,In,q1,Xh=A(()=>{bh();Sh();Nh();mc();hc();Hh();Wh();$1=128*1024,Gh=5e4,bi={type:"string",minLength:1,maxLength:256},jt={type:"object",additionalProperties:!0},In=(e,t,r)=>Object.freeze({type:"function",function:Object.freeze({name:e,description:t,strict:!0,parameters:r})}),q1=Object.freeze([In("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:bi,type:{type:"string",enum:["project","entity","source","thesis","strategy","simulation","prepared_action","receipt","position"]},createdAt:{type:"string",minLength:1,maxLength:64},data:jt,parentId:bi,childId:bi},required:["action"],additionalProperties:!1}),In("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:Gh},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}),In("portfolio_analyze","Deterministically summarize a caller-supplied portfolio ledger; performs no network or account access.",{type:"object",properties:{ledger:jt,asOf:{type:"number"},priceTtlMs:{type:"number",minimum:0}},required:["ledger","asOf"],additionalProperties:!1}),In("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:bi,intent:jt,lifecycle:jt,state:{type:"string",enum:["quote_comparison","simulation","prepared","approval","settlement","balance_delta","position"]},fact:jt,asOf:{type:"number"}},required:["action"],additionalProperties:!1}),In("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:jt},markouts:{type:"array",maxItems:100,items:jt},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 Yh={};B(Yh,{deployGloballyEnabled:()=>F1,executeGloballyEnabled:()=>B1,mevExecuteEnabled:()=>D1});function B1(){return Tn("ORACLE_EXECUTE_ENABLED","MAD_EXECUTE_ENABLED",!1)}function F1(){return Tn("ORACLE_DEPLOY_ENABLED","MAD_DEPLOY_ENABLED",!1)}function D1(){return Tn("ORACLE_MEV_EXECUTE_ENABLED",null,!1)}var Jh=A(()=>{Rn()});Rn();import Qh from"node:fs";import wc from"node:process";import{fileURLToPath as M1}from"node:url";import{createInterface as f0}from"node:readline";var Xe=Object.freeze({maxRequestBytes:256*1024,maxResponseBytes:2*1024*1024,maxTools:256,maxToolNameLength:64,maxArgumentBytes:128*1024,defaultCallTimeoutMs:3e4,maxCallTimeoutMs:6e4,maxConcurrentCalls:32}),m0=/^[A-Za-z0-9_-]{1,64}$/;function Nn(e,t){return{jsonrpc:"2.0",id:e??null,result:t}}function pe(e,t,r){return{jsonrpc:"2.0",id:e??null,error:{code:t,message:r}}}function h0(e){return!!(e&&typeof e=="object"&&!Array.isArray(e)&&e.jsonrpc==="2.0"&&typeof e.method=="string"&&e.method.length>0)}function y0(e){if(!Array.isArray(e))return[];let t=[],r=new Set;for(let n of e){if(t.length>=Xe.maxTools)break;if(!n||typeof n!="object"||Array.isArray(n))continue;let o=typeof n.name=="string"?n.name.trim():"";if(!m0.test(o)||r.has(o))continue;r.add(o);let i=n.inputSchema&&typeof n.inputSchema=="object"&&!Array.isArray(n.inputSchema)?{...n.inputSchema}:{type:"object",properties:{},additionalProperties:!1};i.type==="object"&&i.additionalProperties===void 0&&(i.additionalProperties=!1),t.push({...n,name:o,inputSchema:i})}return t}function b0(e){let t=Number(e)||Xe.defaultCallTimeoutMs;return Math.min(Math.max(t,1),Xe.maxCallTimeoutMs)}async function g0(e,t,r){let n;try{return await Promise.race([e,new Promise((o,i)=>{n=setTimeout(()=>{let s=new Error("tool call timed out");s.code="ORACLE_MCP_TIMEOUT",i(s);try{r?.()}catch{}},t)})])}finally{clearTimeout(n)}}function w0(e){return e===null?"null":Array.isArray(e)?"array":Number.isInteger(e)?"integer":typeof e}function Ir(e,t,r="arguments",n=0){if(!t||typeof t!="object"||Array.isArray(t))return null;if(n>12)return`${r} exceeded the nesting limit`;if(Array.isArray(t.oneOf)&&t.oneOf.length&&!t.oneOf.some(i=>Ir(e,i,r,n+1)===null))return`${r} did not match an allowed shape`;if(Array.isArray(t.anyOf)&&t.anyOf.length&&!t.anyOf.some(i=>Ir(e,i,r,n+1)===null))return`${r} did not match a required alternative`;if(Array.isArray(t.enum)&&!t.enum.some(o=>Object.is(o,e)))return`${r} must be one of the allowed values`;if(Object.hasOwn(t,"const")&&!Object.is(t.const,e))return`${r} must equal the required constant`;if(t.type){let o=w0(e);if(!(t.type==="number"?typeof e=="number"&&Number.isFinite(e):t.type==="integer"?Number.isSafeInteger(e):o===t.type))return`${r} 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`${r} exceeded the string limit`;if(Number.isSafeInteger(t.minLength)&&e.length<t.minLength)return`${r} is too short`}if(Array.isArray(e)){let o=Math.min(Number.isSafeInteger(t.maxItems)?t.maxItems:1e3,1e3);if(e.length>o)return`${r} exceeded the array limit`;if(Number.isSafeInteger(t.minItems)&&e.length<t.minItems)return`${r} has too few items`;if(t.items)for(let i=0;i<e.length;i+=1){let s=Ir(e[i],t.items,`${r}[${i}]`,n+1);if(s)return s}}if(e&&typeof e=="object"&&!Array.isArray(e)){let o=Object.keys(e);if(o.length>256)return`${r} 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`${r}.${s} is required`;if(t.additionalProperties===!1){let s=o.find(a=>!Object.hasOwn(i,a));if(s)return`${r}.${s} is not allowed`}for(let s of o){if(!Object.hasOwn(i,s))continue;let a=Ir(e[s],i[s],`${r}.${s}`,n+1);if(a)return a}}return null}function Ii(e,t={}){let r=y0(e?.tools),n=new Set(r.map(u=>u.name)),o=new Map(r.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=b0(t.callTimeoutMs),c=!1;return async function(l){let d=l?.id??null;if(!h0(l))return pe(d,-32600,"invalid request");if(l.method==="initialize")return c=!0,Nn(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 Nn(d,{});if(!c)return pe(d,-32002,"server not initialized");if(l.method==="tools/list")return Nn(d,{tools:r});if(l.method==="tools/call"){let p=l.params?.name,f=l.params?.arguments??{};if(typeof p!="string"||!n.has(p))return pe(d,-32602,"unknown tool");if(!f||typeof f!="object"||Array.isArray(f))return pe(d,-32602,"tool arguments must be an object");let m;try{m=JSON.stringify(f)}catch{return pe(d,-32602,"tool arguments are not serializable")}if(Buffer.byteLength(m)>Xe.maxArgumentBytes)return pe(d,-32602,"tool arguments exceeded the size limit");let h=Ir(f,o.get(p)?.inputSchema);if(h)return pe(d,-32602,h);try{let y=new AbortController,x=await g0(Promise.resolve(e.call(p,f,{signal:y.signal})),a,()=>y.abort(new Error("tool call timed out")));return Nn(d,x)}catch(y){if(y?.code==="ORACLE_MCP_TIMEOUT")return pe(d,-32001,"tool call timed out");let x=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(x),_=/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(x.replace(/\btoken(?:In|Out|s\b)/g,"asset"));return E&&!_&&x.length<=200?pe(d,-32e3,`tool call failed: ${x}`):pe(d,-32e3,"tool call failed")}}return pe(d,-32601,"method not found")}}function Cc(e,t={}){let r=t.input||process.stdin,n=t.output||process.stdout,o=Math.min(Math.max(Number(t.maxRequestBytes)||Xe.maxRequestBytes,64),Xe.maxRequestBytes),i=Math.min(Math.max(Number(t.maxResponseBytes)||Xe.maxResponseBytes,256),Xe.maxResponseBytes),s=Math.min(Math.max(Number(t.maxConcurrentCalls)||Xe.maxConcurrentCalls,1),Xe.maxConcurrentCalls),a=s*8,c=Ii(e,t),u={closed:!1,inflight:0},l=f0({input:r,terminal:!1,crlfDelay:1/0}),d=0,p=[],f=!1,m=!1;function h(){if(u.closed||u.readerClosed)return;let w=u.inflight>=s||p.length>0||m;w&&!f?(f=!0,l.pause(),typeof r.pause=="function"&&r.pause()):!w&&f&&(f=!1,typeof r.resume=="function"&&r.resume(),l.resume())}function y(w){if(!w||u.closed)return;let O=JSON.stringify(w);Buffer.byteLength(O)>i&&(O=JSON.stringify(pe(w.id,-32003,"response exceeded the size limit"))),n.write(`${O}
24
24
  `)===!1&&!m&&(m=!0,h(),n.once("drain",()=>{m=!1,E()}))}function x(w){u.inflight+=1,h(),Promise.resolve(c(w)).then(y).catch(()=>y(pe(w?.id,-32603,"internal error"))).finally(()=>{u.inflight-=1,E()})}function E(){for(;!u.closed&&!m&&u.inflight<s&&p.length>0;)x(p.shift());h()}function _(){u.closed||(y(pe(null,-32700,"request exceeded the size limit")),u.closed=!0,l.close(),typeof r.destroy=="function"&&r.destroy())}return r.on("data",w=>{if(u.closed)return;let O=String(w).split(`
25
- `);for(let v=0;v<O.length;v+=1){if(d+=Buffer.byteLength(O[v]),d>o){_();return}v<O.length-1&&(d=0)}}),l.on("line",w=>{if(u.closed)return;if(Buffer.byteLength(w)>o){_();return}let O;try{O=JSON.parse(w)}catch{y(pe(null,-32700,"parse error"));return}if(p.length>=a){y(pe(O?.id,-32e3,"server busy"));return}p.push(O),E()}),l.on("close",()=>{u.readerClosed=!0,t.exitOnClose!==!1&&(process.exitCode=0)}),u}var Ic=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"}}),l0=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 ft(e){return String(e??"").replaceAll("&","&amp;").replaceAll("<","&lt;").replaceAll(">","&gt;").replaceAll('"',"&quot;")}function Ie(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 Ar(e,t){if(e==null)return null;let r=String(e);if(/^\d{7,}$/.test(r)){let n=Number(t);if(Number.isFinite(n)&&n>0&&n<=36){let o=Number(r)/10**n;if(Number.isFinite(o))return Ie(o)}return`${r} raw`}return Ie(e)}var d0=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 p0(e,t){let r=Number(t);return t!=null&&Number.isFinite(r)?r:d0[String(e||"").toUpperCase()]}function _c(e,t){let r=t&&typeof t=="object"?t:{},n=r.result&&typeof r.result=="object"?r.result:r,o=n;if(n.estimate&&typeof n.estimate=="object"){let c=n.estimate,u=(c.gasCosts||[]).reduce((d,p)=>d+(Number(p.amountUSD)||0),0)||null,l=(c.feeCosts||[]).reduce((d,p)=>d+(Number(p.amountUSD)||0),0)||null;o={best:{provider:n.tool||n.toolDetails?.name||"lifi",amountOut:c.toAmount,minOut:c.toAmountMin,gasUsd:u,feeUsd:l,decimalsOut:n.action?.toToken?.decimals},tokenIn:n.action?.fromToken?.symbol,tokenOut:n.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=p0(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,p=Ar(l,u);s(p!=null?"NET OUT":"EST OUT (GROSS)",p??Ar(d,u),{hero:!0}),s("GROSS OUT",l!==void 0&&d!==void 0&&String(l)!==String(d)?Ar(d,u):null),c.gasUsd!==void 0&&c.gasUsd!==null?s("GAS",`$${Ie(c.gasUsd)}`):c.feeUsd!==void 0&&c.feeUsd!==null?s("GAS+FEES",`$${Ie(c.feeUsd)}`):s("GAS","NOT PRICED IN",{warn:!0});let m=c.minOut??c.minAmountOut??c.minReceived;if(s("MIN RECEIVED",Ar(m,u)),c.slippageBps!==void 0&&c.slippageBps!==null)s("SLIPPAGE",`${c.slippageBps} bps`);else if(m!==void 0&&d!==void 0){let x=Number(d),E=Number(m);Number.isFinite(x)&&Number.isFinite(E)&&x>0&&E>0&&E<=x&&s("SLIPPAGE",`${((1-E/x)*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",`$${Ie(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(x=>x!==a).slice(0,3):[];for(let x of y){let E=x?.provider||x?.venue||x?.source,_=Ar(x?.netOut??x?.amountOut??x?.toAmount,u);E&&_&&s(`vs ${E}`,_,{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?`$${Ie(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 f=l.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),`$${Ie(m.knownUsd)}`,{dim:!0})}let d=o.avgEntryUsd??o.avgCostUsd;if(d!==void 0)s("AVG ENTRY",`$${Ie(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",`$${Ie(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?`$${Ie(o.pnlUsd)}`:null);let c=o.avgBuy??o.avgBuyEth??o.avgCostEth??o.avgPurchase;if(c!==void 0)s("AVG BUY",Ie(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",`${Ie(u.reduce((l,d)=>l+d,0)/u.length)} \xB7 ${u.length} buys`)}s("OWNERS",Ie(o.owners??o.numOwners))}return i}function f0(e,t,r){let n=Ic[e]||Ic.generic,o=_c(e,r),i=o.find(u=>u.hero),s=o.filter(u=>!u.hero),a=ft(JSON.stringify(r,null,2)).slice(0,2e4),c=s.map(u=>`<div class="row${u.dim?" dim":""}${u.warn?" warn":""}"><span>${ft(u.label)}</span><b>${ft(u.value)}</b></div>`).join("");return`<!doctype html><html><head><meta charset="utf-8"><style>
25
+ `);for(let v=0;v<O.length;v+=1){if(d+=Buffer.byteLength(O[v]),d>o){_();return}v<O.length-1&&(d=0)}}),l.on("line",w=>{if(u.closed)return;if(Buffer.byteLength(w)>o){_();return}let O;try{O=JSON.parse(w)}catch{y(pe(null,-32700,"parse error"));return}if(p.length>=a){y(pe(O?.id,-32e3,"server busy"));return}p.push(O),E()}),l.on("close",()=>{u.readerClosed=!0,t.exitOnClose!==!1&&(process.exitCode=0)}),u}var Tc=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"}}),x0=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 ft(e){return String(e??"").replaceAll("&","&amp;").replaceAll("<","&lt;").replaceAll(">","&gt;").replaceAll('"',"&quot;")}function Ie(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 r=String(e);if(/^\d{7,}$/.test(r)){let n=Number(t);if(Number.isFinite(n)&&n>0&&n<=36){let o=Number(r)/10**n;if(Number.isFinite(o))return Ie(o)}return`${r} raw`}return Ie(e)}var k0=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 S0(e,t){let r=Number(t);return t!=null&&Number.isFinite(r)?r:k0[String(e||"").toUpperCase()]}function Rc(e,t){let r=t&&typeof t=="object"?t:{},n=r.result&&typeof r.result=="object"?r.result:r,o=n;if(n.estimate&&typeof n.estimate=="object"){let c=n.estimate,u=(c.gasCosts||[]).reduce((d,p)=>d+(Number(p.amountUSD)||0),0)||null,l=(c.feeCosts||[]).reduce((d,p)=>d+(Number(p.amountUSD)||0),0)||null;o={best:{provider:n.tool||n.toolDetails?.name||"lifi",amountOut:c.toAmount,minOut:c.toAmountMin,gasUsd:u,feeUsd:l,decimalsOut:n.action?.toToken?.decimals},tokenIn:n.action?.fromToken?.symbol,tokenOut:n.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=S0(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,p=_r(l,u);s(p!=null?"NET OUT":"EST OUT (GROSS)",p??_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",`$${Ie(c.gasUsd)}`):c.feeUsd!==void 0&&c.feeUsd!==null?s("GAS+FEES",`$${Ie(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 x=Number(d),E=Number(m);Number.isFinite(x)&&Number.isFinite(E)&&x>0&&E>0&&E<=x&&s("SLIPPAGE",`${((1-E/x)*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",`$${Ie(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(x=>x!==a).slice(0,3):[];for(let x of y){let E=x?.provider||x?.venue||x?.source,_=_r(x?.netOut??x?.amountOut??x?.toAmount,u);E&&_&&s(`vs ${E}`,_,{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?`$${Ie(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 f=l.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),`$${Ie(m.knownUsd)}`,{dim:!0})}let d=o.avgEntryUsd??o.avgCostUsd;if(d!==void 0)s("AVG ENTRY",`$${Ie(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",`$${Ie(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?`$${Ie(o.pnlUsd)}`:null);let c=o.avgBuy??o.avgBuyEth??o.avgCostEth??o.avgPurchase;if(c!==void 0)s("AVG BUY",Ie(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",`${Ie(u.reduce((l,d)=>l+d,0)/u.length)} \xB7 ${u.length} buys`)}s("OWNERS",Ie(o.owners??o.numOwners))}return i}function E0(e,t,r){let n=Tc[e]||Tc.generic,o=Rc(e,r),i=o.find(u=>u.hero),s=o.filter(u=>!u.hero),a=ft(JSON.stringify(r,null,2)).slice(0,2e4),c=s.map(u=>`<div class="row${u.dim?" dim":""}${u.warn?" warn":""}"><span>${ft(u.label)}</span><b>${ft(u.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}
@@ -63,4 +63,5 @@ ${i?`<div class="hero">${ft(i.value)}</div><div class="herolabel">${ft(i.label)}
63
63
  ${c}
64
64
  <details><summary>details \xB7 ${ft(t)}</summary><pre>${a}</pre></details>
65
65
  <div class="foot"><span>${ft(t)}</span><span class="tag">THE FUTURE IS AGENTIC</span></div>
66
- </div><script>document.documentElement.classList.add("live")</script></body></html>`}function Oc(e,t){let r=l0[e];if(!r||!t||typeof t!="object"||t.error||t.ok===!1||!_c(r,t).some(i=>i.hero))return null;let o=f0(r,e,t);return{type:"resource",resource:{uri:`ui://oracle/card/${e}/${Date.now().toString(36)}`,mimeType:"text/html",text:o}}}Ai();function Tc(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 _0=[/\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 Tn(e){let t=String(e??"");for(let r of _0)r.lastIndex=0,t=t.replace(r,"[REDACTED]");return t=t.replace(/\b([A-Za-z][A-Za-z0-9_-]{0,80})\s*([:=])\s*("[^"]*"|'[^']*'|[^\s,;}\]]+)/g,(r,n,o)=>Tc(n)?`${n}${o}[REDACTED]`:r),O0(vt(t,{force:!0}))}function O0(e){return String(e).replace(/https?:\/\/[^\s"'<>]+/gi,t=>{let r=Cc(t);return r.ok?r.href:t})}function vr(e,{depth:t=0,seen:r=new WeakSet,key:n=""}={}){if(Tc(n))return"[REDACTED]";if(typeof e=="string"){let i=Tn(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 vt(String(e),{force:!0}).slice(0,240);if(r.has(e))return"[circular]";if(r.add(e),Array.isArray(e))return e.slice(0,1e3).map(i=>vr(i,{depth:t+1,seen:r,key:n}));let o={};for(let[i,s]of Object.entries(e))o[i]=vr(s,{depth:t+1,seen:r,key:i});return o}function A1(e){let t;try{t=new URL(String(e||""))}catch{throw new Error("ORACLE_DATA_URL must be a loopback HTTP URL")}let r=t.hostname==="127.0.0.1"||t.hostname==="localhost"||t.hostname==="[::1]";if(t.protocol!=="http:"||!r||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 yc=A1(Si("ORACLE_DATA_URL","MAD_DESK_URL","http://127.0.0.1:8787")),v1=2*1024*1024;async function I1(e,t=v1){let r=Number(e.headers?.get?.("content-length")||0);if(Number.isFinite(r)&&r>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 n=e.body.getReader(),o=[],i=0;try{for(;;){let{done:s,value:a}=await n.read();if(s)break;let c=Buffer.from(a);if(i+=c.length,i>t)throw await n.cancel("response too large").catch(()=>{}),new Error("data response exceeded the size limit");o.push(c)}}finally{n.releaseLock?.()}try{return JSON.parse(Buffer.concat(o).toString("utf8"))}catch{return{}}}var Hh={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"}}},xr={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:Hh,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:Hh,mac:{type:"string"},quotedAtMs:{type:"number"},expiresAtMs:{type:"number"}}}}]},Vh=[{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:"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:xr,conversionGasEvidence:xr,gasPriceEvidence:xr,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:xr,conversionGasEvidence:xr,gasPriceEvidence:xr,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:"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:"sui_balances",description:"Sui coin balances for an owner (all coin types, or one via coinType). Read-only JSON-RPC; execute/sign/dry-run methods are refused.",inputSchema:{type:"object",required:["owner"],properties:{owner:{type:"string"},coinType:{type:"string"}}}},{name:"sui_owned_objects",description:"Objects owned by a Sui address (NFTs, caps, positions) with type and display metadata. Read-only.",inputSchema:{type:"object",required:["owner"],properties:{owner:{type:"string"},structType:{type:"string"},limit:{type:"number"},cursor:{type:"string"}}}},{name:"sui_coin_metadata",description:"Decimals/symbol/name for a Sui coin type. Read-only.",inputSchema:{type:"object",required:["coinType"],properties:{coinType:{type:"string"}}}},{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"}}}}],zh=String(hc.env.ORACLE_DEFAULT_ADDRESS||hc.env.MAD_OPERATOR_ADDRESS||"").trim(),_1=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"]),O1=new Set(Vh.map(e=>e.name));for(let e of _1)if(O1.has(e))throw new Error(`public MCP custody boundary violated: ${e}`);var C1={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||zh||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||zh;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}}),sui_balances:e=>({provider:"sui-public",op:"balances",args:{owner:e.owner,coinType:e.coinType}}),sui_owned_objects:e=>({provider:"sui-public",op:"ownedObjects",args:{owner:e.owner,structType:e.structType,limit:e.limit,cursor:e.cursor}}),sui_coin_metadata:e=>({provider:"sui-public",op:"coinMetadata",args:{coinType:e.coinType}}),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 bc(e,{method:t="GET",body:r,signal:n}={}){let o=await fetch(e,{method:t,headers:{"content-type":"application/json"},body:r?JSON.stringify(r):void 0,signal:n}),i=await I1(o);if(!o.ok)throw new Error(i.error||`HTTP ${o.status}`);return i}async function ye(e,t,r={},n={}){try{return await bc(`${yc}/data/call`,{method:"POST",body:{provider:e,op:t,args:r},signal:n.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 Wh(e,t={},r={}){let n={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(n){let{runStrategyOperation:i}=await Promise.resolve().then(()=>(Xu(),Ku));return i(n.operation,{...t,...n.action?{action:n.action}:{},nowMs:t.nowMs??Date.now()},{signal:r.signal})}if(e==="rfq_quote"){let{normalizeRfqIntent:i}=await Promise.resolve().then(()=>(hs(),cl)),{requestRfqQuotes:s}=await Promise.resolve().then(()=>(Ad(),Ed)),a=i({...t,sources:t.sources??t.allowedSources});return s(a,{decimalsIn:t.decimalsIn,decimalsOut:t.decimalsOut,signal:r.signal})}if(e==="best_swap_route"||e==="best_bridge_route"){let{bestSwapRoute:i,bestBridgeRoute:s}=await Promise.resolve().then(()=>(cr(),Yd));return e==="best_swap_route"?i(t,r):s(t,r)}if(e==="prepare_best_route"){let{prepareBestRoute:i}=await Promise.resolve().then(()=>(Qd(),Jd));return i(t,r)}if(e==="prepare_best_bridge_route"){let{prepareBestBridgeRoute:i}=await Promise.resolve().then(()=>(ep(),Zd));return i(t,r)}if(e==="twap_simulate"){let{simulateTwap:i}=await Promise.resolve().then(()=>(op(),np));return i({...t,amount:t.amount??t.amountIn},{signal:r.signal,...r.quoteFn?{quoteFn:r.quoteFn}:{}})}if(e==="bridge_aggregator_scan"){let{scanBridgeRoutes:i}=await Promise.resolve().then(()=>(Xp(),Kp));return i(t,r)}if(e==="perps_markets"){let i=String(t.venue||"all").toLowerCase(),s={};if(i==="all"||i==="dydx"){let{dydxMarkets:a}=await Promise.resolve().then(()=>(Jp(),Yp));s.dydx=await a(void 0,r)}if(i==="all"||i==="drift"){let{driftMarkets:a}=await Promise.resolve().then(()=>(rf(),tf));s.drift=await a(r)}if(i==="all"||i==="vertex"){let{vertexMarkets:a}=await Promise.resolve().then(()=>(af(),sf));s.vertex=await a(r)}return s}if(e==="dex_quote"){let i=String(t.dex||"").toLowerCase();if(i==="pancakeswap"){let{pancakeQuote:s}=await Promise.resolve().then(()=>(uf(),cf));return s(t,r)}if(i==="sushiswap"){let{sushiQuote:s}=await Promise.resolve().then(()=>(pf(),df));return s(t,r)}if(i==="raydium"){let{raydiumQuote:s}=await Promise.resolve().then(()=>(mf(),ff));return s(t,r)}return{error:`unknown dex: ${i} \u2014 use pancakeswap, sushiswap, or raydium`}}if(e==="options_markets"){let{aevoMarkets:i}=await Promise.resolve().then(()=>(yf(),hf));return{aevo:await i(r)}}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(()=>(sn(),da)),Promise.resolve().then(()=>(ba(),ya)),Promise.resolve().then(()=>(ka(),xa))]),p={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"&&!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,r)]}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(()=>(Pf(),Nf)),a={coin:t.coin,quote:t.quote,venues:t.venues};return t.fundingOnly===!0?s(a,r):i(a,r)}if(e==="snapshot_governance"){let i=String(t.op||"spaces"),s={health:()=>ye("snapshot-governance","health",{},r),spaces:()=>ye("snapshot-governance","spaces",t,r),proposals:()=>ye("snapshot-governance","proposals",t,r),activeProposals:()=>ye("snapshot-governance","activeProposals",t,r),proposal:()=>ye("snapshot-governance","proposal",t,r),votes:()=>ye("snapshot-governance","votes",t,r),votingPower:()=>ye("snapshot-governance","votingPower",t,r)};return s[i]?s[i]():{error:`unknown op: ${i}`}}if(e==="tally_governance"){let i=String(t.op||"governors"),s={health:()=>ye("tally-governance","health",{},r),governors:()=>ye("tally-governance","governors",{},r),info:()=>ye("tally-governance","info",t,r),proposals:()=>ye("tally-governance","proposals",t,r),proposal:()=>ye("tally-governance","proposal",t,r),voterStatus:()=>ye("tally-governance","voterStatus",t,r),tallyProposals:()=>ye("tally-governance","tallyProposals",t,r)};return s[i]?s[i]():{error:`unknown op: ${i}`}}if(e==="stablecoin_peg_scan")return ye("stablecoin-peg","scan",t,r);if(e==="lending_markets"){let{compoundMarkets:i}=await Promise.resolve().then(()=>(qf(),$f));return{compound:await i(r)}}if(e==="yield_vaults"){let[{yearnVaults:i},{convexPools:s}]=await Promise.all([Promise.resolve().then(()=>(Uf(),Lf)),Promise.resolve().then(()=>(Ff(),Bf))]);return{yearn:await i(r),convex:await s(r)}}if(e==="equity_venues"){let{equityVenues:i,toJsonSafe:s}=await Promise.resolve().then(()=>(Zo(),Qo));return s(i())}if(e==="equity_quote"){let{bestEquityRoute:i,toJsonSafe:s}=await Promise.resolve().then(()=>(Zo(),Qo));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(()=>(Zo(),Qo));return s(i({ticker:t.ticker,recipient:t.recipient||t.taker,sizeUsd:t.sizeUsd}))}if(e==="scanner_coverage"){let i=await Promise.resolve().then(()=>(ti(),ei));return i.registerBuiltinScanners?.(),i.scannerCoverage()}if(e==="scan_token"){let i=await Promise.resolve().then(()=>(ti(),ei));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,r),c=s.supports?.("resolvePools")?await s.resolvePools(t.token,r).catch(()=>null):null,u=s.supports?.("scoreRisk")?await s.scoreRisk(t.token,r).catch(()=>null):null;return{chainId:Number(t.chainId),token:a,pools:c,risk:u}}if(e==="wallet_balances"){let i=await Promise.resolve().then(()=>(ti(),ei));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,r),c=t.token?await s.tokenBalance({owner:t.address,token:t.token},r).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(()=>(Xa(),Ka));return{ok:!0,watches:i(),actionMode:"alert_only",execution:!1}}if(e==="watch_create"){let{createWatch:i}=await Promise.resolve().then(()=>(Xa(),Ka));return{ok:!0,watch:i(t),execution:!1}}if(e==="receipt_report"){let{classifyReceipt:i}=await Promise.resolve().then(()=>(Um(),Lm));return{ok:!0,...i(t.receipt||t),execution:!1}}if(e==="twitter_ca_watch"){let{tickTwitterCaWatch:i}=await Promise.resolve().then(()=>(rh(),th));return i({handle:t.handle,chainId:t.chainId,limit:t.limit,automated:!0},r)}if(e==="trade_lifecycle"||e==="signal_score"||e==="workspace_artifact"||e==="research_artifact"||e==="portfolio_analyze"){let{runDeskTool:i}=await Promise.resolve().then(()=>(Fh(),Bh));return i(e,t,{signal:r.signal})}if(e==="mev_status"){let{executeGloballyEnabled:i,mevExecuteEnabled:s}=await Promise.resolve().then(()=>(Mh(),Dh));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(()=>(Ps(),ed));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 bc(`${yc}/data/catalog`,{signal:r.signal});if(e==="data_health")return bc(`${yc}/data/health`,{signal:r.signal});let o=C1[e];if(o){let{provider:i,op:s,args:a}=o(t);return ye(i,s,a,r)}throw new Error(`Unknown tool: ${e}`)}function Gh(e,t){if(e?.dataBase64&&/^image\/(?:svg\+xml|png|jpeg|webp)$/.test(String(e.mimeType||""))){let{dataBase64:s,...a}=e,c=Tn(JSON.stringify(vr(a),null,2));return{content:[{type:"image",data:s,mimeType:e.mimeType},{type:"text",text:c}]}}let r=JSON.stringify(e,null,2),n=vr(e),o=Tn(JSON.stringify(n,null,2)),i=[{type:"text",text:o}];try{let s=o===r?Oc(t,e):null;s&&i.push(s)}catch{}return{content:i}}var Kh=Object.freeze({name:"oracle-data-mcp",version:"1",tools:Vh,async call(e,t,r={}){return Gh(await Wh(e,t,r),e)}});function T1(){return vc(Kh)}function R1(){let e=hc.argv[1];if(!e)return!1;try{return jh.realpathSync(e)===jh.realpathSync(E1(import.meta.url))}catch{return!1}}R1()&&T1();function N1({timeoutMs:e,callToolOptions:t={}}={}){return Ei({...Kh,async call(r,n,o={}){return Gh(await Wh(r,n,{...t,...o}),r)}},{...e==null?{}:{callTimeoutMs:e}})}var HN=N1();export{_1 as PUBLIC_MCP_FORBIDDEN_TOOLS,C1 as ROUTES,Vh as TOOLS,Wh as callTool,N1 as createPublicMcpHandler,Gh as formatMcpResult,HN as handle,bc as httpJson,I1 as readBoundedJsonResponse,A1 as resolveDataUrl,T1 as startStdioLoop,Vh as tools};
66
+ </div><script>document.documentElement.classList.add("live")</script></body></html>`}function Nc(e,t){let r=x0[e];if(!r||!t||typeof t!="object"||t.error||t.ok===!1||!Rc(r,t).some(i=>i.hero))return null;let o=E0(r,e,t);return{type:"resource",resource:{uri:`ui://oracle/card/${e}/${Date.now().toString(36)}`,mimeType:"text/html",text:o}}}import mt from"node:fs";import A0 from"node:os";import zt from"node:path";import v0 from"node:crypto";var I0=48e3,Pc=4e3,_0=1440*60*1e3,O0=8e3,C0=1e6;function T0(e=process.env.ORACLE_MCP_SPILL_BYTES){let t=Number(e);return!Number.isFinite(t)||t<=0?I0:Math.min(Math.max(Math.floor(t),O0),C0)}function _i(e=process.env.ORACLE_MCP_SPILL_DIR){if(typeof e=="string"&&e.trim())return zt.resolve(e.trim());let t=process.env.XDG_STATE_HOME&&process.env.XDG_STATE_HOME.trim()?process.env.XDG_STATE_HOME.trim():zt.join(A0.homedir(),".local","state");return zt.join(t,"oracle","mcp-spill")}function $c(e,{maxDepth:t=4,maxKeys:r=24}={}){let n={entries:400};function o(i,s){if(n.entries<=0)return"\u2026";if(n.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,r))a[u]=o(i[u],s+1);return c.length>r&&(a[`\u2026+${c.length-r} keys`]="\u2026"),a}return typeof i=="string"?i.length>40?`string(${i.length})`:"string":typeof i}return o(e,0)}function R0(e){try{let t=Date.now();for(let r of mt.readdirSync(e)){if(!r.endsWith(".json"))continue;let n=zt.join(e,r);try{t-mt.statSync(n).mtimeMs>_0&&mt.unlinkSync(n)}catch{}}}catch{}}function qc(e,t,r,n={}){let o=n.thresholdBytes??T0(),i=Buffer.byteLength(t,"utf8");if(i<=o)return null;try{let s=n.dir??_i();mt.mkdirSync(s,{recursive:!0,mode:448}),R0(s);let a=new Date().toISOString().replace(/[:.]/g,"-"),c=v0.randomBytes(4).toString("hex"),u=String(e).replace(/[^A-Za-z0-9_-]/g,"_").slice(0,64)||"tool",l=zt.join(s,`${a}_${u}_${c}.json`);mt.writeFileSync(l,t,{mode:384});let d=t.slice(0,Pc),p=$c(r),f=[`[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(p,null,2),"",`Preview (first ${Math.min(Pc,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:f}}catch{return null}}var Ht=new Map;function Lc(e){return zt.join(e??_i(),"observed-shapes.json")}function Uc(e,t,r={}){try{let n=$c(t);if(Ht.set(String(e),{shape:n,observedAtMs:Date.now()}),Ht.size>512){let i=[...Ht.entries()].sort((s,a)=>s[1].observedAtMs-a[1].observedAtMs)[0];i&&Ht.delete(i[0])}let o=r.dir??_i();mt.mkdirSync(o,{recursive:!0,mode:448}),mt.writeFileSync(Lc(o),JSON.stringify(Object.fromEntries(Ht),null,1),{mode:384})}catch{}}function Bc(e,t={}){let r=Ht.get(String(e));if(r)return r;try{let o=JSON.parse(mt.readFileSync(Lc(t.dir),"utf8"))?.[String(e)];if(o&&typeof o=="object")return o}catch{}return null}Oi();function Dc(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 V0=[/\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 Pn(e){let t=String(e??"");for(let r of V0)r.lastIndex=0,t=t.replace(r,"[REDACTED]");return t=t.replace(/\b([A-Za-z][A-Za-z0-9_-]{0,80})\s*([:=])\s*("[^"]*"|'[^']*'|[^\s,;}\]]+)/g,(r,n,o)=>Dc(n)?`${n}${o}[REDACTED]`:r),W0(It(t,{force:!0}))}function W0(e){return String(e).replace(/https?:\/\/[^\s"'<>]+/gi,t=>{let r=Fc(t);return r.ok?r.href:t})}function Or(e,{depth:t=0,seen:r=new WeakSet,key:n=""}={}){if(Dc(n))return"[REDACTED]";if(typeof e=="string"){let i=Pn(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 It(String(e),{force:!0}).slice(0,240);if(r.has(e))return"[circular]";if(r.add(e),Array.isArray(e))return e.slice(0,1e3).map(i=>Or(i,{depth:t+1,seen:r,key:n}));let o={};for(let[i,s]of Object.entries(e))o[i]=Or(s,{depth:t+1,seen:r,key:i});return o}function j1(e){let t;try{t=new URL(String(e||""))}catch{throw new Error("ORACLE_DATA_URL must be a loopback HTTP URL")}let r=t.hostname==="127.0.0.1"||t.hostname==="localhost"||t.hostname==="[::1]";if(t.protocol!=="http:"||!r||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 xc=j1(vi("ORACLE_DATA_URL","MAD_DESK_URL","http://127.0.0.1:8787")),H1=2*1024*1024;async function z1(e,t=H1){let r=Number(e.headers?.get?.("content-length")||0);if(Number.isFinite(r)&&r>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 n=e.body.getReader(),o=[],i=0;try{for(;;){let{done:s,value:a}=await n.read();if(s)break;let c=Buffer.from(a);if(i+=c.length,i>t)throw await n.cancel("response too large").catch(()=>{}),new Error("data response exceeded the size limit");o.push(c)}}finally{n.releaseLock?.()}try{return JSON.parse(Buffer.concat(o).toString("utf8"))}catch{return{}}}var Zh={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"}}},Er={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:Zh,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:Zh,mac:{type:"string"},quotedAtMs:{type:"number"},expiresAtMs:{type:"number"}}}}]},t0=[{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:Er,conversionGasEvidence:Er,gasPriceEvidence:Er,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:Er,conversionGasEvidence:Er,gasPriceEvidence:Er,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:"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:"sui_balances",description:"Sui coin balances for an owner (all coin types, or one via coinType). Read-only JSON-RPC; execute/sign/dry-run methods are refused.",inputSchema:{type:"object",required:["owner"],properties:{owner:{type:"string"},coinType:{type:"string"}}}},{name:"sui_owned_objects",description:"Objects owned by a Sui address (NFTs, caps, positions) with type and display metadata. Read-only.",inputSchema:{type:"object",required:["owner"],properties:{owner:{type:"string"},structType:{type:"string"},limit:{type:"number"},cursor:{type:"string"}}}},{name:"sui_coin_metadata",description:"Decimals/symbol/name for a Sui coin type. Read-only.",inputSchema:{type:"object",required:["coinType"],properties:{coinType:{type:"string"}}}},{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"}}}}],e0=String(wc.env.ORACLE_DEFAULT_ADDRESS||wc.env.MAD_OPERATOR_ADDRESS||"").trim(),V1=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"]),W1=new Set(t0.map(e=>e.name));for(let e of V1)if(W1.has(e))throw new Error(`public MCP custody boundary violated: ${e}`);var G1={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||e0||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||e0;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}}),sui_balances:e=>({provider:"sui-public",op:"balances",args:{owner:e.owner,coinType:e.coinType}}),sui_owned_objects:e=>({provider:"sui-public",op:"ownedObjects",args:{owner:e.owner,structType:e.structType,limit:e.limit,cursor:e.cursor}}),sui_coin_metadata:e=>({provider:"sui-public",op:"coinMetadata",args:{coinType:e.coinType}}),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 kc(e,{method:t="GET",body:r,signal:n}={}){let o=await fetch(e,{method:t,headers:{"content-type":"application/json"},body:r?JSON.stringify(r):void 0,signal:n}),i=await z1(o);if(!o.ok)throw new Error(i.error||`HTTP ${o.status}`);return i}async function ye(e,t,r={},n={}){try{return await kc(`${xc}/data/call`,{method:"POST",body:{provider:e,op:t,args:r},signal:n.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 r0(e,t={},r={}){let n={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(n){let{runStrategyOperation:i}=await Promise.resolve().then(()=>(il(),ol));return i(n.operation,{...t,...n.action?{action:n.action}:{},nowMs:t.nowMs??Date.now()},{signal:r.signal})}if(e==="rfq_quote"){let{normalizeRfqIntent:i}=await Promise.resolve().then(()=>(ws(),gl)),{requestRfqQuotes:s}=await Promise.resolve().then(()=>($d(),Pd)),a=i({...t,sources:t.sources??t.allowedSources});return s(a,{decimalsIn:t.decimalsIn,decimalsOut:t.decimalsOut,signal:r.signal})}if(e==="best_swap_route"||e==="best_bridge_route"){let{bestSwapRoute:i,bestBridgeRoute:s}=await Promise.resolve().then(()=>(dr(),sp));return e==="best_swap_route"?i(t,r):s(t,r)}if(e==="prepare_best_route"){let{prepareBestRoute:i}=await Promise.resolve().then(()=>(cp(),ap));return i(t,r)}if(e==="prepare_best_bridge_route"){let{prepareBestBridgeRoute:i}=await Promise.resolve().then(()=>(lp(),up));return i(t,r)}if(e==="twap_simulate"){let{simulateTwap:i}=await Promise.resolve().then(()=>(mp(),fp));return i({...t,amount:t.amount??t.amountIn},{signal:r.signal,...r.quoteFn?{quoteFn:r.quoteFn}:{}})}if(e==="bridge_aggregator_scan"){let{scanBridgeRoutes:i}=await Promise.resolve().then(()=>(sf(),of));return i(t,r)}if(e==="perps_markets"){let i=String(t.venue||"all").toLowerCase(),s={};if(i==="all"||i==="dydx"){let{dydxMarkets:a}=await Promise.resolve().then(()=>(cf(),af));s.dydx=await a(void 0,r)}if(i==="all"||i==="drift"){let{driftMarkets:a}=await Promise.resolve().then(()=>(ff(),pf));s.drift=await a(r)}if(i==="all"||i==="vertex"){let{vertexMarkets:a}=await Promise.resolve().then(()=>(bf(),yf));s.vertex=await a(r)}return s}if(e==="dex_quote"){let i=String(t.dex||"").toLowerCase();if(i==="pancakeswap"){let{pancakeQuote:s}=await Promise.resolve().then(()=>(wf(),gf));return s(t,r)}if(i==="sushiswap"){let{sushiQuote:s}=await Promise.resolve().then(()=>(Sf(),kf));return s(t,r)}if(i==="raydium"){let{raydiumQuote:s}=await Promise.resolve().then(()=>(Af(),Ef));return s(t,r)}return{error:`unknown dex: ${i} \u2014 use pancakeswap, sushiswap, or raydium`}}if(e==="options_markets"){let{aevoMarkets:i}=await Promise.resolve().then(()=>(If(),vf));return{aevo:await i(r)}}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(()=>(un(),ha)),Promise.resolve().then(()=>(ka(),xa)),Promise.resolve().then(()=>(va(),Aa))]),p={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"&&!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,r)]}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(()=>(Hf(),jf)),a={coin:t.coin,quote:t.quote,venues:t.venues};return t.fundingOnly===!0?s(a,r):i(a,r)}if(e==="snapshot_governance"){let i=String(t.op||"spaces"),s={health:()=>ye("snapshot-governance","health",{},r),spaces:()=>ye("snapshot-governance","spaces",t,r),proposals:()=>ye("snapshot-governance","proposals",t,r),activeProposals:()=>ye("snapshot-governance","activeProposals",t,r),proposal:()=>ye("snapshot-governance","proposal",t,r),votes:()=>ye("snapshot-governance","votes",t,r),votingPower:()=>ye("snapshot-governance","votingPower",t,r)};return s[i]?s[i]():{error:`unknown op: ${i}`}}if(e==="tally_governance"){let i=String(t.op||"governors"),s={health:()=>ye("tally-governance","health",{},r),governors:()=>ye("tally-governance","governors",{},r),info:()=>ye("tally-governance","info",t,r),proposals:()=>ye("tally-governance","proposals",t,r),proposal:()=>ye("tally-governance","proposal",t,r),voterStatus:()=>ye("tally-governance","voterStatus",t,r),tallyProposals:()=>ye("tally-governance","tallyProposals",t,r)};return s[i]?s[i]():{error:`unknown op: ${i}`}}if(e==="stablecoin_peg_scan")return ye("stablecoin-peg","scan",t,r);if(e==="lending_markets"){let{compoundMarkets:i}=await Promise.resolve().then(()=>(Vf(),zf));return{compound:await i(r)}}if(e==="yield_vaults"){let[{yearnVaults:i},{convexPools:s}]=await Promise.all([Promise.resolve().then(()=>(Gf(),Wf)),Promise.resolve().then(()=>(Xf(),Kf))]);return{yearn:await i(r),convex:await s(r)}}if(e==="equity_venues"){let{equityVenues:i,toJsonSafe:s}=await Promise.resolve().then(()=>(ri(),ti));return s(i())}if(e==="equity_quote"){let{bestEquityRoute:i,toJsonSafe:s}=await Promise.resolve().then(()=>(ri(),ti));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(()=>(ri(),ti));return s(i({ticker:t.ticker,recipient:t.recipient||t.taker,sizeUsd:t.sizeUsd}))}if(e==="scanner_coverage"){let i=await Promise.resolve().then(()=>(oi(),ni));return i.registerBuiltinScanners?.(),i.scannerCoverage()}if(e==="scan_token"){let i=await Promise.resolve().then(()=>(oi(),ni));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,r),c=s.supports?.("resolvePools")?await s.resolvePools(t.token,r).catch(()=>null):null,u=s.supports?.("scoreRisk")?await s.scoreRisk(t.token,r).catch(()=>null):null;return{chainId:Number(t.chainId),token:a,pools:c,risk:u}}if(e==="wallet_balances"){let i=await Promise.resolve().then(()=>(oi(),ni));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,r),c=t.token?await s.tokenBalance({owner:t.address,token:t.token},r).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(()=>(Za(),Qa));return{ok:!0,watches:i(),actionMode:"alert_only",execution:!1}}if(e==="watch_create"){let{createWatch:i}=await Promise.resolve().then(()=>(Za(),Qa));return{ok:!0,watch:i(t),execution:!1}}if(e==="receipt_report"){let{classifyReceipt:i}=await Promise.resolve().then(()=>(Gm(),Wm));return{ok:!0,...i(t.receipt||t),execution:!1}}if(e==="twitter_ca_watch"){let{tickTwitterCaWatch:i}=await Promise.resolve().then(()=>(ph(),dh));return i({handle:t.handle,chainId:t.chainId,limit:t.limit,automated:!0},r)}if(e==="trade_lifecycle"||e==="signal_score"||e==="workspace_artifact"||e==="research_artifact"||e==="portfolio_analyze"){let{runDeskTool:i}=await Promise.resolve().then(()=>(Xh(),Kh));return i(e,t,{signal:r.signal})}if(e==="mev_status"){let{executeGloballyEnabled:i,mevExecuteEnabled:s}=await Promise.resolve().then(()=>(Jh(),Yh));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(()=>(Us(),ld));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 kc(`${xc}/data/catalog`,{signal:r.signal});if(e==="data_health")return kc(`${xc}/data/health`,{signal:r.signal});if(e==="tool_output_shape"){let i=String(t?.tool||""),s=Bc(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=G1[e];if(o){let{provider:i,op:s,args:a}=o(t);return ye(i,s,a,r)}throw new Error(`Unknown tool: ${e}`)}function n0(e,t){if(e?.dataBase64&&/^image\/(?:svg\+xml|png|jpeg|webp)$/.test(String(e.mimeType||""))){let{dataBase64:c,...u}=e,l=Pn(JSON.stringify(Or(u),null,2));return{content:[{type:"image",data:c,mimeType:e.mimeType},{type:"text",text:l}]}}let r=JSON.stringify(e,null,2),n=Or(e),o=Pn(JSON.stringify(n,null,2)),s=/"(?:mac|calldata|calldataHash|unsignedTransaction|typedData)"\s*:/.test(o)?null:qc(t,o,n);t!=="tool_output_shape"&&Uc(t,n);let a=[{type:"text",text:s?s.text:o}];try{let c=o===r?Nc(t,e):null;c&&a.push(c)}catch{}return{content:a}}var o0=Object.freeze({name:"oracle-data-mcp",version:"1",tools:t0,async call(e,t,r={}){return n0(await r0(e,t,r),e)}});function K1(){return Cc(o0)}function X1(){let e=wc.argv[1];if(!e)return!1;try{return Qh.realpathSync(e)===Qh.realpathSync(M1(import.meta.url))}catch{return!1}}X1()&&K1();function Y1({timeoutMs:e,callToolOptions:t={}}={}){return Ii({...o0,async call(r,n,o={}){return n0(await r0(r,n,{...t,...o}),r)}},{...e==null?{}:{callTimeoutMs:e}})}var fP=Y1();export{V1 as PUBLIC_MCP_FORBIDDEN_TOOLS,G1 as ROUTES,t0 as TOOLS,r0 as callTool,Y1 as createPublicMcpHandler,n0 as formatMcpResult,fP as handle,kc as httpJson,z1 as readBoundedJsonResponse,j1 as resolveDataUrl,K1 as startStdioLoop,t0 as tools};