@oracle-agent/oracle 0.35.25 → 0.35.26

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 Q0=Object.defineProperty;var v=(e,t,r)=>()=>{if(r)throw r[0];try{return e&&(t=e(e=0)),t}catch(n){throw r=[n],n}};var H=(e,t)=>{for(var r in t)Q0(e,r,{get:t[r],enumerable:!0})};import{homedir as bs}from"node:os";import{join as ws}from"node:path";function ks(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 wo(e,t,r=!1){return String(ks(e,t,r?"1":"")).trim()==="1"}var $u,Y0,zT,ko=v(()=>{$u=process.env.ORACLE_PUBLIC_DESKTOP==="1",Y0=$u?process.env.ORACLE_CONFIG_DIR||ws(bs(),".config","oracle"):ws(bs(),".config","oracle"),zT=$u?Y0:ws(bs(),".config","mad-desk")});function Og(e){let t=String(e??"");return t.length<18?"[REDACTED]":`${t.slice(0,6)}\u2026${t.slice(-4)}`}function Tg(e){return`\xABredacted:${String(e??"").slice(0,4)}\u2026\xBB`}function sr(e,t={}){if(e==null)return e;let r=typeof e=="string"?e:String(e);if(!r||!(t.force||bg))return r;let n=t.fileRead?Tg:Og;r=r.replace(xg,"[REDACTED_PRIVATE_KEY]"),r=r.replace(kg,"[REDACTED_EVM_KEY]"),r=r.replace(Sg,o=>n(o));for(let o of wg)o.lastIndex=0,r=r.replace(o,i=>n(i));return r=r.replace(Eg,(o,i,s,a)=>/^(?:os\.(?:getenv|environ)|process\.env|\$ENV\{)/.test(a)?`${i}=${s||""}${a}${s||""}`:`${i}=${s||""}${n(a)}${s||""}`),r=r.replace(Ag,(o,i,s,a)=>o.replace(a,n(a))),r=r.replace(vg,(o,i,s,a)=>`${i}${n(s)}${a}`),r}function zu(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();_g.has(o)&&t.searchParams.set(n,"[REDACTED]")}return{ok:!0,url:t,href:t.toString()}}var gg,bg,wg,kg,xg,Sg,Eg,Ag,vg,Ig,_g,Es=v(()=>{gg=(process.env.ORACLE_REDACT_SECRETS??"true").toLowerCase(),bg=["1","true","yes","on"].includes(gg),wg=[/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],kg=/\b0x[a-fA-F0-9]{64}\b/g,xg=/-----BEGIN (?:RSA |EC |OPENSSH |ENCRYPTED )?PRIVATE KEY-----[\s\S]*?-----END (?:RSA |EC |OPENSSH |ENCRYPTED )?PRIVATE KEY-----/g,Sg=/\beyJ[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\b/g,Eg=/\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,Ag=/^(?:export\s+)?((?:api[_-]?key|token|secret|password|private[_-]?key|mnemonic|seed[_-]?phrase|authorization))\s*[:=]\s*(['"]?)([^\s&]+)\2/gim,vg=/("(?:api[_-]?key|apiKey|access[_-]?token|refresh[_-]?token|client[_-]?secret|private[_-]?key|privateKey|secret|password|authorization|bearer|mnemonic|seedPhrase)"\s*:\s*")([^"]{6,})(")/gi,Ig=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"]),_g=new Set([...Ig].map(e=>e.replace(/[^a-z0-9]/gi,"").toLowerCase()))});import ar from"node:net";import Rg from"node:dns";function Eo(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 As(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 vs(e){if(ar.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(ar.isIPv6(e)){let t=Eo(e);if(!t)return!1;let r=Eo("::ffff:0:0");return As(t,r,96)?vs([...t.slice(12)].join(".")):As(t,Eo("2000::"),3)?![["2001::",23],["2001:db8::",32],["2001:10::",28],["2001:2::",48],["2002::",16],["3fff::",20]].some(([o,i])=>As(t,Eo(o),i)):!1}return!1}function Pg(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($g.has(r)||r.endsWith(".localhost")||r.endsWith(".internal"))return{ok:!1,error:`refused internal host ${r}`};let n=ar.isIP(r);return n!==0&&!vs(r)?{ok:!1,error:`refused private address ${r}`}:{ok:!0,url:t,host:r,isLiteralIp:n!==0}}async function Is(e,{lookupFn:t=Rg.promises.lookup}={}){let r=Pg(e);if(!r.ok)return r;if(r.isLiteralIp)return{ok:!0,url:r.url,addresses:[{address:r.host,family:ar.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=>!vs(o.address))?{ok:!1,error:`refused: ${r.host} resolves to a non-public address`}:{ok:!0,url:r.url,addresses:n}}async function _s({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||(ar.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(ar.isIP(p))return[{address:p,family:ar.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(y){return f(y)}return p?.all?f(null,m):f(null,m[0].address,m[0].family)}}}),l=qg((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 qg(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[Os]=Object.freeze({pin:t}),e}function Ts(e){return typeof e=="function"&&typeof e[Os]?.pin=="function"}function Wu(e,t,r){if(!Ts(e))throw new Error("pinFetchToAddresses: fetchImpl is not pin-capable");e[Os].pin(t,r)}var $g,Os,Gu=v(()=>{$g=new Set(["localhost","metadata.google.internal","metadata.goog"]);Os=Symbol.for("oracle.egressGuard.pinCapableFetch")});import{createHash as Ku}from"node:crypto";function Mg(e){let t=String(e||"").toLowerCase();return tl.includes(t)||/(^|-)(api[-_]?key|key|token|secret|auth|authorization|session|cookie|signature|access)(-|$)/.test(t)}function Fg(e){let t={};for(let[r,n]of Object.entries(e||{}))Mg(r)||(t[r]=n);return t}function jg(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 Hg(e,t){return new URL(String(e)).origin===new URL(String(t)).origin}function Ju(e){let t=String(e?.method||"");return t?!zg.test(t):!1}function Wg(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(Ju):!r||typeof r!="object"?!1:r.jsonrpc&&r.method?Ju(r):typeof r.type=="string"&&Vg.has(r.type)&&r.action==null&&r.signature==null&&r.nonce==null}function Gg(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([...tl,...s])].sort().map(p=>`${p}=${i[p]??""}`).join(`
3
- `),u=Ku("sha256").update(c).digest("hex").slice(0,32),l=`${n.untrustedUrl?"untrusted":"trusted"}:${n.maxResponseBytes??"unbounded"}`,d=o==null?"-":Ku("sha256").update(String(o)).digest("hex").slice(0,32);return`${e} ${t} ${l} ${u} ${d}`}function Kg(e,t){let r=Number(t);return Number.isFinite(r)&&r>0?Math.min(r*1e3,Qu):Math.min(250*2**e,Qu)+Math.floor(Math.random()*100)}function hn(e,t={}){let r=new Error(e);return r.retryable=!1,Object.assign(r,t),r}function Ns(e,t,r){return hn(`HTTP response from ${e} exceeded maxResponseBytes ${r} (${t})`,{oversize:!0})}function yn(e){try{let t=e?.body?.cancel?.();t&&typeof t.then=="function"&&t.catch(()=>{})}catch{}}function Qg(e){return e?e.byteLength??e.length??0:0}async function Zu(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&&(yn(e),!n))throw Ns(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 Ns(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+=Qg(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 Ns(r,`streamed ${c} bytes`,t);let l=Buffer.concat(a);return(u?l.subarray(0,t):l).toString("utf8")}function el(e){if(!e)return null;try{return JSON.parse(e)}catch{return null}}async function Yg(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),y=p?typeof AbortSignal.any=="function"?AbortSignal.any([p,f.signal]):p:f.signal,h=null,w=t,E=s?{lookupFn:s}:{};if(c&&!a&&!Ts(w))throw hn(`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(x,{status:O=null}={})=>{let I=await Is(x,E);if(!I.ok)throw hn(O==null?`HTTP refused ${x}: ${I.error}`:`HTTP redirect to ${x} ${I.error}`,O==null?{}:{status:O});let k=new URL(x).hostname;if(a){if(h&&(await h.close(),h=null),!h)try{h=await _s({requireUndici:!0,...l?{importUndici:l}:{}})}catch(g){throw hn(O==null?`HTTP refused ${x}: ${g?.message||g}`:`HTTP redirect to ${x} refused: ${g?.message||g}`,O==null?{}:{status:O})}h.pin(k,I.addresses),w=h.fetch}else Wu(w,k,I.addresses);return I};try{let x=String(e),O={...n||{}};c&&await _(x);for(let I=0;I<=Yu;I+=1){let k=await w(x,{method:r,headers:O,body:o,signal:y,redirect:"manual"});if(Ug.has(k.status)){if(r!=="GET"&&r!=="HEAD"){let $=await Zu(k,u??Dg,{url:x,truncate:!0}),q=new Error(`HTTP ${k.status} ${r} ${x} redirected non-idempotent request`);throw q.status=k.status,q.body=el($)??$.slice(0,300),q}if(I===Yu)throw yn(k),new Error(`HTTP redirect loop for ${e}`);let S=k.headers?.get?.("location"),R;try{R=jg(S,x)}catch($){throw yn(k),$}let A=!Hg(R,x);if(yn(k),A&&(O=Fg(O)),c)await _(R,{status:k.status});else if(A){let $=await Is(R,E);if(!$.ok){let q=new Error(`HTTP redirect from ${x} ${$.error}`);throw q.status=k.status,q.retryable=!1,q}a&&$.addresses?.length&&(h||(h=await _s(l?{importUndici:l}:{})),h&&(h.pin(new URL(R).hostname,$.addresses),w=h.fetch))}x=R;continue}if(typeof d=="function")try{await d(k,{url:x})}catch(S){throw yn(k),hn(S?.message||String(S))}let g=await Zu(k,u,{url:x,onOversize:()=>f.abort()}),b=el(g);if(!k.ok){let S=new Error(`HTTP ${k.status} ${r} ${x}`);throw S.status=k.status,S.retryAfter=k.headers?.get?.("retry-after")??null,S.body=b??g.slice(0,300),S}return b??g}throw new Error(`HTTP redirect loop for ${e}`)}finally{clearTimeout(m),h&&await h.close()}}async function T(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):Bg,c=t.lookupFn,u=!t.fetchImpl,l=t.untrustedUrl===!0,d=t.importUndici,p=t.validateResponse,f=t.signal,m=Number(t.maxResponseBytes),y=Number.isFinite(m)&&m>0?Math.floor(m):null,h=async()=>{let O;for(let I=0;I<=a;I++){f?.throwIfAborted?.();try{return await Yg(e,{fetchImpl:r,method:o,headers:i,body:s,timeoutMs:n,lookupFn:c,realFetch:u,untrustedUrl:l,maxResponseBytes:y,importUndici:d,validateResponse:p,signal:f})}catch(k){O=k;let g=k?.status,b=k?.name==="AbortError"||k?.name==="TimeoutError"||f?.aborted,S=new Set([408,425,429]),R=k?.retryable===!1?!1:g!=null?S.has(g)||Lg.has(g)&&Xu.has(o):!b&&Xu.has(o);if(I===a||!R)throw k;let A=Kg(I,k?.retryAfter);f?await new Promise(($,q)=>{let j=setTimeout($,A);f.addEventListener("abort",()=>{clearTimeout(j),q(f.reason||new DOMException("Aborted","AbortError"))},{once:!0})}):await Xg(A)}}throw O};if(!(t.dedupe!==!1&&!f&&Wg(o,s)))return h();let E=Gg(o,e,i,{untrustedUrl:l,maxResponseBytes:y},s),_=Cs.get(E);if(_)return _;let x=h().finally(()=>Cs.delete(E));return Cs.set(E,x),x}async function Ir(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 Lg,Xu,Bg,Qu,tl,Ug,Yu,Dg,Cs,zg,Vg,Xg,G=v(()=>{Gu();Lg=new Set([408,425,429,500,502,503,504]),Xu=new Set(["GET","HEAD","OPTIONS","PUT","DELETE"]),Bg=2,Qu=4e3,tl=["authorization","x-api-key","x-tensor-api-key","0x-api-key","api-key","cookie","proxy-authorization"],Ug=new Set([301,302,303,307,308]),Yu=3,Dg=64*1024;Cs=new Map,zg=/(?:^|_)(send|submit|broadcast|sign|requestAirdrop)(?=[A-Z_]|$)/i,Vg=new Set(["allMids","l2Book","outcomeMeta","spotClearinghouseState","userFills","meta","metaAndAssetCtxs","perpDexs","candleSnapshot","fundingHistory","openOrders","frontendOpenOrders","clearinghouseState","spotMeta","validatorSummaries","delegatorSummary","delegations","delegatorRewards","delegatorHistory","maxBuilderFee"]);Xg=e=>new Promise(t=>setTimeout(t,e))});function eb({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"?Zg:Jg}async function gn(e,t={}){if(!e||!e.type)throw new Error("hlInfo requires body.type");let r=eb(t);return T(r,{method:"POST",body:e,fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function rl(e={}){return gn({type:"allMids"},e)}async function nl(e={}){return gn({type:"meta"},e)}async function ol(e={}){let t={type:"metaAndAssetCtxs"};return e.dex&&(t.dex=e.dex),gn(t,e)}async function il({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 gn(i,o)}async function sl({coin:e,startTime:t,endTime:r},n={}){if(!e)throw new Error("hlFundingHistory requires coin");return gn({type:"fundingHistory",coin:String(e),startTime:t??Date.now()-24*3600*1e3,endTime:r??Date.now()},n)}var Jg,Zg,Ao=v(()=>{G();Jg="https://api.hyperliquid.xyz/info",Zg="https://api.hyperliquid-testnet.xyz/info"});import{createHash as tb}from"node:crypto";function mt(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function _r(e){return typeof e=="number"&&Number.isFinite(e)}function Ps(e){if(e==null||typeof e!="object"||Object.isFrozen(e))return e;if(Array.isArray(e)){for(let t of e)Ps(t);return Object.freeze(e)}for(let t of Object.keys(e))Ps(e[t]);return Object.freeze(e)}function cr(e){if(Array.isArray(e))return e.map(cr);if(e!=null&&typeof e=="object"){let t={};for(let r of Object.keys(e).sort())t[r]=cr(e[r]);return t}return e}function Rs(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 al(e){return{feesUsd:e.costs.feesUsd,builderFeesUsd:e.costs.builderFeesUsd,fundingUsd:e.costs.fundingUsd,slippageUsd:e.costs.slippageUsd}}function nb(e){return(e.feesUsd||0)+(e.builderFeesUsd||0)+Math.max(0,e.fundingUsd||0)+(e.slippageUsd||0)}function ob(e){let t=0;for(let r of e.trades)r.grossPnlUsd>0&&(t+=r.grossPnlUsd);return t}function ib(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 ul(e){if(!mt(e))throw new TypeError("evidence artifact must be a plain object");if(!rb.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(!mt(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(!mt(e.walkForward)||!Array.isArray(e.walkForward.windows))throw new TypeError("evidence artifact walkForward windows required");if(e.status==="pass_live_eligible"&&(!mt(e.train)||!mt(e.holdout)))throw new TypeError("live-eligible evidence artifact requires train and holdout facts");return cr({barsHash:e.barsHash,compilerHash:e.compilerHash,flags:e.flags.map(t=>cr(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 ll(e){return tb("sha256").update(JSON.stringify(ul(e)),"utf8").digest("hex")}function tt(e,t,r=0){if(!Number.isInteger(e)||e<r)throw new Error(`${t} must be an integer >= ${r}`);return e}function $s(e,t){if(!mt(e)||!mt(e.metrics))throw new Error(`${t} metrics required`);let r=tt(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(!_r(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 sb(e,{maxDailyLossPct:t}={}){let r=e.split,n=tt(r.trainStartIndex,"split.trainStartIndex"),o=tt(r.trainEndIndex,"split.trainEndIndex"),i=tt(r.trainBarCount,"split.trainBarCount",1),s=tt(r.holdoutStartIndex,"split.holdoutStartIndex"),a=tt(r.holdoutEndIndex,"split.holdoutEndIndex"),c=tt(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(!_r(r.trainFraction)||r.trainFraction<=0||r.trainFraction>=1)throw new Error("split.trainFraction must be in (0,1)");$s(e.train,"train");let u=$s(e.holdout,"holdout");if(u.tradeCount<1||u.netPnlUsd<=0||u.profitFactor<=1)throw new Error("live-eligible holdout metrics do not pass");if(_r(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 y=0;y<d.length;y++){let h=d[y];if(!mt(h)||h.index!==y||typeof h.passed!="boolean")throw new Error("walk-forward windows must be ordered and structurally valid");let w=tt(h.trainStartIndex,`walkForward.windows[${y}].trainStartIndex`),E=tt(h.trainEndIndex,`walkForward.windows[${y}].trainEndIndex`),_=tt(h.evalStartIndex,`walkForward.windows[${y}].evalStartIndex`),x=tt(h.evalEndIndex,`walkForward.windows[${y}].evalEndIndex`);if(w!==0||E>=_||_>x||_<=f)throw new Error("walk-forward windows must be chronological and disjoint");if(f=x,h.passed){if(p+=1,h.reason!=="pass")throw new Error("passed walk-forward window reason must be pass");let O=$s({metrics:h.metrics,tradeCount:h.metrics?.tradeCount},`walkForward.windows[${y}]`);if(O.tradeCount<1||O.netPnlUsd<=0||O.profitFactor<=1)throw new Error("passed walk-forward window metrics do not pass");if(_r(t)&&O.maxDrawdownPct>t)throw new Error("passed walk-forward drawdown exceeds strategy risk")}else if(h.reason==="pass")throw new Error("failed walk-forward window cannot have pass reason")}let m=p/d.length;if(!_r(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 dl(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=ul(e),n=cr({id:e.id,...r});if(JSON.stringify(cr(e))!==JSON.stringify(n))throw new Error("evidence artifact contains fields unbound from its deterministic identity");let o=ll(e);if(e.id!==o)throw new Error("evidence.id does not match its deterministic artifact facts digest");return e.status==="pass_live_eligible"&&sb(e,t),e}function qs({strategy:e,bars:t,backtestOptions:r={},trainFraction:n=.7,walkForwardWindows:o=3,minTrades:i=10}={}){let s=[];if(!mt(e))throw new TypeError("strategy must be a plain object");if(!Array.isArray(t))throw new TypeError("bars must be an array");if(!mt(r))throw new TypeError("backtestOptions must be a plain object");if(!_r(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=Ie(e),c=Or(a),u=bn(t),l=t.length,d=(D=[],U={})=>cl({status:"fail",strategy:a,sHash:c,barsHash:u,split:U.split||{trainStartIndex:0,trainEndIndex:-1,trainBarCount:0,holdoutStartIndex:0,holdoutEndIndex:-1,holdoutBarCount:0,trainFraction:n},train:U.train||null,holdout:U.holdout||null,walkForward:U.walkForward||{windows:[],passRate:0},flags:[...s,...D]});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 y=t.slice(0,p),h=t.slice(f),w,E;try{w=Wt(a,y,r),E=Wt(a,h,r)}catch(D){return d([{type:"backtest_error",message:String(D.message||D)}])}let _={metrics:Rs(w),costs:al(w),tradeCount:w.metrics.tradeCount},x={metrics:Rs(E),costs:al(E),tradeCount:E.metrics.tradeCount},O={trainStartIndex:0,trainEndIndex:p-1,trainBarCount:p,holdoutStartIndex:f,holdoutEndIndex:l-1,holdoutBarCount:m,trainFraction:n},I=[],k=Math.floor(l/(o+1));if(k<3)s.push({type:"invalid_windowing",message:"walk-forward window size too small",wfSize:k});else for(let D=0;D<o;D++){let U=k*(D+1),Y=U,K=Math.min(l,Y+k);if(K-Y<3||U<3){I.push({index:D,trainStartIndex:0,trainEndIndex:U-1,evalStartIndex:Y,evalEndIndex:K-1,passed:!1,reason:"window_too_small",metrics:null});continue}let Pe=t.slice(Y,K),ue;try{ue=Wt(a,Pe,r)}catch{I.push({index:D,trainStartIndex:0,trainEndIndex:U-1,evalStartIndex:Y,evalEndIndex:K-1,passed:!1,reason:"backtest_error",metrics:null});continue}let jt=Rs(ue),Ht=ib(jt,a.risk,i);I.push({index:D,trainStartIndex:0,trainEndIndex:U-1,evalStartIndex:Y,evalEndIndex:K-1,passed:Ht,reason:Ht?"pass":"fail_metrics",metrics:jt})}let g=I.filter(D=>D.passed).length,b=I.length===0?0:g/I.length,S={windows:I,passRate:b,windowsRun:I.length};x.metrics.tradeCount===0&&_.metrics.tradeCount===0&&s.push({type:"no_trades",message:"no trades in train or holdout"}),x.metrics.tradeCount===0&&s.push({type:"absent_oos_trades",message:"holdout produced no trades"}),x.metrics.netPnlUsd<0&&s.push({type:"holdout_loss",message:"holdout netPnlUsd is negative"}),_.metrics.netPnlUsd>0&&x.metrics.netPnlUsd<0&&_.metrics.netPnlUsd>Math.abs(x.metrics.netPnlUsd)*.25?s.push({type:"overfit",message:"profitable train with losing holdout (OOS collapse)"}):_.metrics.netPnlUsd>0&&x.metrics.netPnlUsd>0&&x.metrics.netPnlUsd<_.metrics.netPnlUsd*.1&&_.metrics.tradeCount>=i&&s.push({type:"severe_oos_collapse",message:"holdout pnl collapsed vs train"});let R=nb(x.costs),A=ob(E);A>0&&R>A&&s.push({type:"costs_exceed_gross",message:"holdout costs exceed gross gains"});let $=s.some(D=>["insufficient_bars","invalid_windowing","absent_oos_trades","holdout_loss","no_trades","severe_oos_collapse","backtest_error"].includes(D.type)),q=s.some(D=>D.type==="overfit"),j="fail";return x.metrics.tradeCount>=i&&x.metrics.netPnlUsd>0&&x.metrics.profitFactor>1&&x.metrics.maxDrawdownPct<=a.risk.maxDailyLossPct&&b>=.6&&!(A>0&&R>A)&&!q&&!s.some(D=>D.type==="severe_oos_collapse"||D.type==="invalid_windowing")?j="pass_live_eligible":!$&&x.metrics.tradeCount>0&&_.metrics.tradeCount>0&&Number.isFinite(x.metrics.netPnlUsd)?(j="pass_paper_only",x.metrics.tradeCount<i&&s.push({type:"undersampled",message:"holdout trades below minTrades"})):q&&x.metrics.tradeCount>0&&_.metrics.netPnlUsd>0?j="fail":x.metrics.tradeCount>0&&_.metrics.tradeCount>0&&!$?j="pass_paper_only":j="fail",x.metrics.netPnlUsd<0&&(j=j==="pass_live_eligible"?"fail":j==="pass_paper_only"?"pass_paper_only":"fail",j="fail"),cl({status:j,strategy:a,sHash:c,barsHash:u,split:O,train:_,holdout:x,walkForward:S,flags:s})}function cl({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:lr,barsHash:n,split:o,train:i,holdout:s,walkForward:a,flags:c};return u.id=ll(u),Ps(cr(JSON.parse(JSON.stringify(u))))}var rb,Ls=v(()=>{dr();ur();vo();rb=Object.freeze(["fail","pass_paper_only","pass_live_eligible"])});import{createHash as ab,createHmac as cb,timingSafeEqual as gC}from"node:crypto";function Bs(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(Bs).join(",")}]`:`{${Object.keys(e).sort().map(r=>`${JSON.stringify(r)}:${Bs(e[r])}`).join(",")}}`}function pl(e){let t=String(e?.ORACLE_STAMP_HMAC_SECRET||"").trim();return t.length>=16?t:""}function fl(e=process.env){return pl(process.env)||pl(e)}function pb(e){let{prepareHash:t,prepareMac:r,note:n,...o}=e||{};return o}function fb(e){let t=pb(e);return ab("sha256").update(Bs(t)).digest("hex")}function mb(e,t=fl()){return t?cb("sha256",t).update(String(e)).digest("hex"):""}function re(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+lb:Number(i),l=u-c;if(!Number.isSafeInteger(c)||!Number.isSafeInteger(u)||l<=0||l>db)throw new Error("stampPrepared: bounded preparedAt/expiresAt required");let p={...a,preparedAt:c,expiresAt:u,prepareVersion:ub},f=fb(p),m=fl(n),y=m?mb(f,m):void 0,h={...p,prepareHash:f};return y&&(h.prepareMac=y),h}var ub,lb,db,qe=v(()=>{ub=2,lb=300*1e3,db=(()=>{let e=Number(process.env.ORACLE_PREPARE_HARD_MAX_AGE_MS);return Number.isFinite(e)&&e>0?e:1800*1e3})()});function wn(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function yb(e){return String(e).toLowerCase().replace(/[^a-z0-9]/g,"")}function Ds(e,t="value"){if(Array.isArray(e)){e.forEach((r,n)=>Ds(r,`${t}[${n}]`));return}if(wn(e))for(let[r,n]of Object.entries(e)){let o=yb(r);if(hb.some(i=>o.includes(i)))throw new Error(`handoff: forbidden secret-like field at ${t}.${r}`);Ds(n,`${t}.${r}`)}}function Us(e){return typeof e=="number"&&Number.isFinite(e)&&e>0}function ml({strategy:e,evidence:t,shadow:r,caps:n,nowMs:o=Date.now(),env:i=process.env}={}){if(Ds({strategy:e,evidence:t,shadow:r,caps:n},"handoff"),!wn(e))throw new Error("handoff: strategy required");if(!wn(t))throw new Error("handoff: evidence required");if(!wn(r))throw new Error("handoff: shadow required");if(!wn(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=Ie(e,{nowMs:o}),a=_e(s);if(dl(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(!Us(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(!Us(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(!Us(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:kn,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 re(d,{provider:"hl-strategy",kind:"strategy-live-handoff",env:i})}var hb,hl=v(()=>{dr();Ls();ur();qe();hb=["privatekey","secretkey","seed","mnemonic","passphrase","password","keystore","keymaterial","apikey","authtoken","accesstoken","refreshtoken","credential","bearer","signature","authorization","xprv","xpriv","wif"]});function Tr(e,t){let r=Number(e);if(!Number.isFinite(r))throw new TypeError(`${t} must be finite`);return r}function Cr(e,t){if(!Number.isSafeInteger(e)||e<0)throw new TypeError(`${t} must be a non-negative safe integer`);return e}function xn(e){if(Array.isArray(e))for(let t of e)xn(t);else if(e&&typeof e=="object")for(let t of Object.values(e))xn(t);return Object.freeze(e)}function bb(e){let t=gb[e];if(!t)throw new TypeError(`unsupported strategy interval: ${e}`);return t}function wb(e,{endTime:t=Number.MAX_SAFE_INTEGER}={}){if(!Array.isArray(e))throw new TypeError("Hyperliquid candles must be an array");Cr(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=Cr(Number(o.t),`candles[${n}].t`);if(Cr(Number(o.T),`candles[${n}].T`)>t)continue;let a={t:i,o:Tr(o.o,`candles[${n}].o`),h:Tr(o.h,`candles[${n}].h`),l:Tr(o.l,`candles[${n}].l`),c:Tr(o.c,`candles[${n}].c`),v:Tr(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 xn([...r.values()].sort((n,o)=>n.t-o.t))}function kb(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=Cr(Number(o.time),`funding[${n}].time`);i>t||r.set(i,{time:i,fundingRate:Tr(o.fundingRate,`funding[${n}].fundingRate`)})}return[...r.values()].sort((n,o)=>n.time-o.time)}async function xb({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 sl({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 kb(o,r)}function Sb(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 yl(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=bb(n);if(e.endTime==null)throw new TypeError("endTime is required for deterministic history");let i=Cr(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):Cr(e.startTime,"startTime");if(a>=i)throw new TypeError("startTime must be before endTime");let[c,u]=await Promise.all([il({coin:r,interval:n,startTime:a,endTime:i},t),xb({coin:r,startTime:a,endTime:i},t)]),l=wb(c,{endTime:i}),d=xn(Sb(l,u,o));return xn({coin:r,interval:n,range:{startTime:a,endTime:i},bars:d})}var gb,gl=v(()=>{Ao();gb=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 vb(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))Ab.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"||!Eb.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 Ib(e={}){let t=await nl(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 Eb,Ab,bl,wl=v(()=>{Ao();hl();gl();Eb=new Set(["1m","3m","5m","15m","30m","1h","2h","4h","8h","12h","1d"]),Ab=new Set(["coin","interval"]);bl=Object.freeze({id:"hyperliquid",validateMarket:vb,fetchBars:yl,listMarkets:Ib,prepareIntent(e){return ml(e)}})});function Ob(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 _b.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 Ms(e){return typeof e!="string"?null:Tb.get(e)??null}function Fs(e){let t=Ms(e);if(!t)throw new Error(`unknown strategy venue: ${String(e)}`);return t}var _b,kl,Tb,NC,js=v(()=>{wl();_b=Object.freeze(["id","validateMarket","prepareIntent"]);kl=[bl].map(Ob),Tb=new Map(kl.map(e=>[e.id,e])),NC=Object.freeze([...kl])});import{createHash as Cb}from"node:crypto";function Ye(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function ae(e){return typeof e=="number"&&Number.isFinite(e)}function Ol(e){return Number.isInteger(e)&&e>0}function Gs(e){if(e==null||typeof e!="object"||Object.isFrozen(e))return e;if(Array.isArray(e)){for(let t of e)Gs(t);return Object.freeze(e)}for(let t of Object.keys(e))Gs(e[t]);return Object.freeze(e)}function Ks(e){if(Array.isArray(e))return e.map(Ks);if(e!=null&&typeof e=="object"){let t={};for(let r of Object.keys(e).sort())t[r]=Ks(e[r]);return t}return e}function C(e,t,r){e.push({path:t,message:r})}function Gt(e,t,r,n){for(let o of Object.keys(e))t.has(o)||C(n,r?`${r}.${o}`:o,"unknown field is not allowed")}function Rl(e,t,r,n){if(!ae(e)||!ae(t)||!ae(r)||!ae(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 Ws(e,t,r,n){if(Ye(e)){if(Gt(e,new Set(["param"]),t,n),typeof e.param!="string"||!e.param)return C(n,`${t}.param`,"must be a parameter name string"),null;if(!Object.prototype.hasOwnProperty.call(r,e.param))return C(n,`${t}.param`,`unknown parameter "${e.param}"`),null;let o=r[e.param];return!Ye(o)||![o.value,o.min,o.max,o.step].every(Ol)?(C(n,`${t}.param`,"referenced period parameter value min max and step must be positive integers"),null):{param:e.param}}return Ol(e)?e:(C(n,t,"must be a positive integer or {param}"),null)}function Tl(e,t,r,n){return Ye(e)?(Gt(e,new Set(["param"]),t,n),typeof e.param!="string"||!e.param?(C(n,`${t}.param`,"must be a parameter name string"),null):Object.prototype.hasOwnProperty.call(r,e.param)?{param:e.param}:(C(n,`${t}.param`,`unknown parameter "${e.param}"`),null)):ae(e)?e:(C(n,t,"must be a finite number or {param}"),null)}function Io(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 Db(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 Io(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 Mb(e,t){if(!Ye(e))return C(t,"parameters","must be a plain object"),null;let r=Object.keys(e);if(r.length>vl)return C(t,"parameters",`too many parameters (max ${vl})`),null;let n={};for(let o of r){if(!Cl.test(o)){C(t,`parameters.${o}`,"parameter name is malformed");continue}let i=e[o],s=`parameters.${o}`;if(!Ye(i)){C(t,s,"must be a plain object");continue}Gt(i,Sl,s,t);for(let d of Sl)d in i||C(t,`${s}.${d}`,"required field is missing");let{value:a,min:c,max:u,step:l}=i;ae(c)||C(t,`${s}.min`,"must be a finite number"),ae(u)||C(t,`${s}.max`,"must be a finite number"),(!ae(l)||l<=0)&&C(t,`${s}.step`,"must be a positive finite number"),ae(a)||C(t,`${s}.value`,"must be a finite number"),ae(c)&&ae(u)&&c>u&&C(t,`${s}.min`,"min must be <= max"),ae(a)&&ae(c)&&ae(u)&&ae(l)&&l>0&&(Rl(a,c,u,l)||C(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 Fb(e,t,r,n){let o=`nodes.${t}`;if(!Ye(e))return C(n,o,"must be a plain object"),null;if(typeof e.type!="string"||!Al[e.type])return C(n,`${o}.type`,"unknown or missing node type"),Gt(e,Ub,o,n),null;switch(Gt(e,Al[e.type],o,n),(typeof e.id!="string"||!Nl.test(e.id))&&C(n,`${o}.id`,"must be a 1-64 char id starting with alphanumeric"),e.type){case"input":return(typeof e.field!="string"||!Nb.has(e.field))&&C(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=Tl(e.value,`${o}.value`,r,n);return{id:e.id,type:"constant",value:i}}case"indicator":{(typeof e.indicator!="string"||!Rb.has(e.indicator))&&C(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?C(n,`${o}.input`,"must be a node id string when provided"):s.input=e.input);let a=Ws(e.period,`${o}.period`,r,n);a!=null&&(s.period=a)}else typeof e.input!="string"||!e.input?C(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))C(n,`${o}.period`,"required field is missing");else{let a=Ws(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))C(n,`${o}.${a}`,"required field is missing");else{let c=Ws(e[a],`${o}.${a}`,r,n);c!=null&&(s[a]=c)}"output"in e?Lb.has(e.output)?s.output=e.output:C(n,`${o}.output`,"must be line|signal|histogram"):C(n,`${o}.output`,"required field is missing"),"period"in e&&C(n,`${o}.period`,"forbidden for macd"),"stdDev"in e&&C(n,`${o}.stdDev`,"forbidden for macd")}else if(i==="bollinger"){if(!("stdDev"in e))C(n,`${o}.stdDev`,"required field is missing");else{let a=Tl(e.stdDev,`${o}.stdDev`,r,n);a!=null&&(typeof a=="number"&&a<=0?C(n,`${o}.stdDev`,"must be > 0"):s.stdDev=a)}"output"in e?Bb.has(e.output)?s.output=e.output:C(n,`${o}.output`,"must be upper|middle|lower"):C(n,`${o}.output`,"required field is missing");for(let a of["fastPeriod","slowPeriod","signalPeriod"])a in e&&C(n,`${o}.${a}`,`forbidden for ${i}`)}else{"output"in e&&C(n,`${o}.output`,`forbidden for ${i}`),"stdDev"in e&&i!=="bollinger"&&C(n,`${o}.stdDev`,`forbidden for ${i}`);for(let a of["fastPeriod","slowPeriod","signalPeriod"])a in e&&C(n,`${o}.${a}`,`forbidden for ${i}`)}return s}case"compare":return(typeof e.op!="string"||!$b.has(e.op))&&C(n,`${o}.op`,"must be gt|gte|lt|lte|eq"),(typeof e.left!="string"||!e.left)&&C(n,`${o}.left`,"must be a node id"),(typeof e.right!="string"||!e.right)&&C(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"||!Pb.has(e.op))&&C(n,`${o}.op`,"must be and|or|not"),!Array.isArray(e.inputs))return C(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?C(n,`${o}.inputs.${s}`,"must be a node id"):i.push(a)}return e.op==="not"?i.length!==1&&C(n,`${o}.inputs`,"not requires exactly one input"):(e.op==="and"||e.op==="or")&&i.length<2&&C(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"||!qb.has(e.direction))&&C(n,`${o}.direction`,"must be above|below"),(typeof e.left!="string"||!e.left)&&C(n,`${o}.left`,"must be a node id"),(typeof e.right!="string"||!e.right)&&C(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 jb(e,t,r){if(!Ye(e))return C(t,"risk","must be a plain object"),null;Gt(e,El,"risk",t);for(let p of El)(!(p in e)||e[p]==null)&&C(t,`risk.${p}`,"required field is missing");let n={},o=e.maxLeverage;!ae(o)||o<=0||o>50?C(t,"risk.maxLeverage","must be a number > 0 and <= 50"):n.maxLeverage=o;let i=e.maxNotionalUsd;!ae(i)||i<=0?C(t,"risk.maxNotionalUsd","must be a number > 0"):n.maxNotionalUsd=i;let s=e.positionSizePct;!ae(s)||s<=0||s>100?C(t,"risk.positionSizePct","must be a number > 0 and <= 100"):n.positionSizePct=s;let a=e.stopLossPct;!ae(a)||a<=0||a>100?C(t,"risk.stopLossPct","must be a number > 0 and <= 100"):n.stopLossPct=a;let c=e.takeProfitPct;!ae(c)||c<=0||c>1e3?C(t,"risk.takeProfitPct","must be a number > 0 and <= 1000"):n.takeProfitPct=c;let u=e.cooldownBars;!Number.isInteger(u)||u<0||u>1e5?C(t,"risk.cooldownBars","must be an integer >= 0 and <= 100000"):n.cooldownBars=u;let l=e.maxDailyLossPct;!ae(l)||l<=0||l>100?C(t,"risk.maxDailyLossPct","must be a number > 0 and <= 100"):n.maxDailyLossPct=l;let d=e.expiresAt;return!Number.isInteger(d)||d<=0?C(t,"risk.expiresAt","must be an integer epoch milliseconds > 0"):(r.nowMs!==void 0&&(Number.isInteger(r.nowMs)?d<=r.nowMs&&C(t,"risk.expiresAt","must be strictly greater than nowMs"):C(t,"nowMs","must be an integer epoch milliseconds")),n.expiresAt=d),n}function Xs(e,t={}){let r=[];if(!Ye(e))return C(r,"","strategy must be a plain object"),{ok:!1,errors:r,strategy:null};Gt(e,xl,"",r);for(let d of xl)(!(d in e)||e[d]==null)&&C(r,d,"required field is missing");e.version!==Hs&&C(r,"version",`must be ${Hs}`),(typeof e.id!="string"||!Cl.test(e.id))&&C(r,"id","must match /^[a-z0-9][a-z0-9._-]{0,63}$/"),(typeof e.name!="string"||e.name.length===0||e.name.length>_l)&&C(r,"name",`must be a non-empty string max ${_l}`);let n=Ms(e.venue);n||C(r,"venue",`unknown strategy venue "${String(e.venue)}"`);let o=null;if(!n)Ye(e.market)||C(r,"market","must be a plain object");else{let d=n.validateMarket(e.market);if(!d||typeof d.ok!="boolean"||!Array.isArray(d.errors))C(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)C(r,p.path,p.message)}let i=Mb(e.parameters,r),s=null,a=new Map;if(!Array.isArray(e.nodes))C(r,"nodes","must be an array");else if(e.nodes.length>Il)C(r,"nodes",`too many nodes (max ${Il})`);else{s=[];for(let d=0;d<e.nodes.length;d++){let p=Fb(e.nodes[d],d,i||{},r);p&&(typeof p.id=="string"&&Nl.test(p.id)&&(a.has(p.id)?C(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 Io(p))a.has(m)||C(r,f,`unknown node ref "${m}"`);if(p.type==="indicator"||p.type==="compare"||p.type==="cross")for(let m of Io(p)){let y=a.get(m);y&&zs.has(y.type)&&C(r,f,`node ref "${m}" must be numeric`)}if(p.type==="logic")for(let m of Io(p)){let y=a.get(m);y&&!zs.has(y.type)&&C(r,f,`node ref "${m}" must be boolean`)}}Db(a)&&C(r,"nodes","graph contains a cycle")}let c=null;if(!Ye(e.rules))C(r,"rules","must be a plain object");else{Gt(e.rules,Vs,"rules",r);for(let d of Vs)d in e.rules||C(r,`rules.${d}`,"required field is missing");c={};for(let d of Vs){let p=e.rules[d];if(p===null){c[d]=null;continue}if(typeof p!="string"||!p){C(r,`rules.${d}`,"must be a node id or null"),c[d]=p;continue}if(!a.has(p)){C(r,`rules.${d}`,`unknown node ref "${p}"`),c[d]=p;continue}let f=a.get(p);zs.has(f.type)||C(r,`rules.${d}`,`rule must reference a boolean node, not ${f.type}`),c[d]=p}}let u=jb(e.risk,r,t);if(r.length)return{ok:!1,errors:r,strategy:null};let l=Gs({version:Hs,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 Ie(e,t={}){let r=Xs(e,t);if(!r.ok)throw new Nr(r.errors);return r.strategy}function Hb(e){let t=Ie(e);return JSON.stringify(Ks(t))}function Or(e){let t=Hb(e);return Cb("sha256").update(t,"utf8").digest("hex")}function Sn(e,t){if(!Ye(e))throw new Nr([{path:"",message:"strategy must be a plain object"}]);if(!Ye(t))throw new Nr([{path:"overrides",message:"must be a plain object"}]);let r=Ie(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)){C(o,i,`unknown parameter "${i}"`);continue}let a=n[i];if(!ae(s)){C(o,i,"override must be a finite number");continue}if(!Rl(s,a.min,a.max,a.step)){C(o,i,"override must lie on the declared min/max/step grid");continue}n[i]={...a,value:s}}if(o.length)throw new Nr(o);return Ie({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 Hs,Cl,Nl,Nb,Rb,$b,Pb,qb,Lb,Bb,zs,xl,Sl,Vs,El,Ub,Al,vl,Il,_l,Nr,ur=v(()=>{js();Hs=1,Cl=/^[a-z0-9][a-z0-9._-]{0,63}$/,Nl=/^[A-Za-z0-9][A-Za-z0-9._-]{0,63}$/,Nb=new Set(["open","high","low","close","volume","fundingRate","openInterest","premium","oiDelta","bookImbalance"]),Rb=new Set(["sma","ema","rsi","macd","bollinger","atr"]),$b=new Set(["gt","gte","lt","lte","eq"]),Pb=new Set(["and","or","not"]),qb=new Set(["above","below"]),Lb=new Set(["line","signal","histogram"]),Bb=new Set(["upper","middle","lower"]),zs=new Set(["compare","logic","cross"]),xl=new Set(["version","id","name","venue","market","parameters","nodes","rules","risk"]),Sl=new Set(["value","min","max","step"]),Vs=new Set(["entryLong","entryShort","exitLong","exitShort"]),El=new Set(["maxLeverage","maxNotionalUsd","positionSizePct","stopLossPct","takeProfitPct","cooldownBars","maxDailyLossPct","expiresAt"]),Ub=new Set(["id","type"]),Al={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"])},vl=16,Il=128,_l=100,Nr=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 En(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 Kt(e){if(!Number.isInteger(e)||e<=0)throw new TypeError("period must be a positive integer")}function zb(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 Pl(e,t){En(e),Kt(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 _o(e,t){En(e),Kt(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 ql(e,t){En(e),Kt(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]=$l(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]=$l(i,s)}return r}function $l(e,t){return e===0&&t===0?50:t===0?100:e===0?0:100-100/(1+e/t)}function Ll(e,t={}){En(e);let r=t.fastPeriod,n=t.slowPeriod,o=t.signalPeriod;if(Kt(r),Kt(n),Kt(o),r>=n)throw new TypeError("fastPeriod must be < slowPeriod");let i=_o(e,r),s=_o(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 y=0;y<o;y++)d+=a[l[y]];let p=d/o,f=l[o-1];c[f]=p,u[f]=a[f]-p;let m=2/(o+1);for(let y=o;y<l.length;y++){let h=l[y];p=m*a[h]+(1-m)*p,c[h]=p,u[h]=a[h]-p}}return{line:a,signal:c,histogram:u}}function Bl(e,t={}){En(e);let r=t.period,n=t.stdDev;if(Kt(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 Ul(e,t){zb(e),Kt(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 Dl=v(()=>{});import{createHash as Vb}from"node:crypto";var Qs,Wb,Gb,Kb,Ml,Fl=v(()=>{Qs=3,Wb="7477966facc4ef928a94e6221c8fd238eef4fcbeec46b96ae1b89178e13c2d5f",Gb="68f5b412a9975f04024cf9b9b6209b4bccedd52f176e95f34f786b3f53479c6a",Kb="967fd45ecddd0d59ac0f662fe92ea813c32620ba751f249b4ace6cb6b809fb5e",Ml=Vb("sha256").update(JSON.stringify({version:Qs,compilerSourceHash:Wb,indicatorsSourceHash:Gb,schemaSourceHash:Kb})).digest("hex")});function He(e){return typeof e=="number"&&Number.isFinite(e)}function Yb(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 Rr(e,t){return e!=null&&typeof e=="object"&&"param"in e?t[e.param].value:e}function Jb(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(!He(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(!He(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!==Qb[r])throw new TypeError(`bars t must match ${r} cadence`)}if(n=s,"fundingRate"in i&&i.fundingRate!=null&&!He(i.fundingRate))throw new TypeError(`bars[${o}].fundingRate must be finite when present`);if("openInterest"in i&&i.openInterest!=null){if(!He(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&&!He(i[p]))throw new TypeError(`bars[${o}].${p} must be finite when present`);if("bookImbalance"in i&&i.bookImbalance!=null){if(!He(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 pr(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=Xb[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=Rr(s.value,r);a=new Array(o+1).fill(c);break}case"indicator":{let c=s.period!=null?Rr(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=Ul(d,c);break}let l=pr(s.input,t,r,n,o,i).map((d,p)=>{if(d==null||!He(d))throw new TypeError(`indicator input ${s.input} has non-finite value at ${p}`);return d});if(s.indicator==="sma")a=Pl(l,c);else if(s.indicator==="ema")a=_o(l,c);else if(s.indicator==="rsi")a=ql(l,c);else if(s.indicator==="macd")a=Ll(l,{fastPeriod:Rr(s.fastPeriod,r),slowPeriod:Rr(s.slowPeriod,r),signalPeriod:Rr(s.signalPeriod,r)})[s.output];else if(s.indicator==="bollinger")a=Bl(l,{period:c,stdDev:Rr(s.stdDev,r)})[s.output];else throw new Error(`unsupported indicator ${s.indicator}`);break}case"compare":{let c=pr(s.left,t,r,n,o,i),u=pr(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||!He(d)||!He(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=>pr(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=pr(s.left,t,r,n,o,i),u=pr(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||!He(d)||!He(p)||!He(f)||!He(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 _e(e,t={}){let r=Ie(e);t&&Object.keys(t).length&&(r=Sn(r,t));let n=new Map(r.nodes.map(f=>[f.id,f])),o=Object.freeze(Yb(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=Or(r);function u(f,m){let y={};for(let w of o){let E=f.get(w);y[w]=E[m]}let h=w=>w!=null&&y[w]===!0;return{values:y,signals:{entryLong:h(r.rules.entryLong),entryShort:h(r.rules.entryShort),exitLong:h(r.rules.exitLong),exitShort:h(r.rules.exitShort)}}}function l(f,m){Jb(f,m,r.market.interval);let y=new Map;for(let h of o)pr(h,n,i,f,m,y);return y}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,y=l(f,m);return Object.freeze(f.map((h,w)=>Object.freeze(u(y,w))))}return Object.freeze({strategy:r,strategyHash:c,compilerVersion:kn,compilerHash:lr,requiredSeries:a,nodeOrder:o,evaluate:d,evaluateAll:p})}var kn,lr,Xb,Qb,dr=v(()=>{ur();Dl();Fl();kn=Qs,lr=Ml,Xb=Object.freeze({open:"o",high:"h",low:"l",close:"c",volume:"v",fundingRate:"fundingRate",openInterest:"openInterest",premium:"premium",oiDelta:"oiDelta",bookImbalance:"bookImbalance"}),Qb=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 Zb}from"node:crypto";function tw(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function ht(e){return typeof e=="number"&&Number.isFinite(e)}function Ys(e){if(e==null||typeof e!="object"||Object.isFrozen(e))return e;if(Array.isArray(e)){for(let t of e)Ys(t);return Object.freeze(e)}for(let t of Object.keys(e))Ys(e[t]);return Object.freeze(e)}function Oo(e){if(Array.isArray(e))return e.map(Oo);if(e!=null&&typeof e=="object"){let t={};for(let r of Object.keys(e).sort())t[r]=Oo(e[r]);return t}return e}function Js(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)=>Js(r,`${t}[${n}]`));return}for(let[r,n]of Object.entries(e))Js(n,`${t}.${r}`)}}function Hl(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(!ht(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(!ht(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&&!ht(n.fundingRate))throw new TypeError(`bars[${r}].fundingRate must be finite when present`);if("fundingPaymentRate"in n&&n.fundingPaymentRate!=null&&!ht(n.fundingPaymentRate))throw new TypeError(`bars[${r}].fundingPaymentRate must be finite when present`);if("openInterest"in n&&n.openInterest!=null&&!ht(n.openInterest))throw new TypeError(`bars[${r}].openInterest must be finite when present`)}}function bn(e){if(!Array.isArray(e))throw new TypeError("bars must be an array");return e.length>0&&Hl(e),Zb("sha256").update(JSON.stringify(Oo(e)),"utf8").digest("hex")}function rw(e){if(e==null&&(e={}),!tw(e))throw new TypeError("options must be a plain object");let t={...ew},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(!ht(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(!ht(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(!ht(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 To(e){return e/1e4}function nw(e,t,r){let n=To(r);return t==="long"?e*(1+n):e*(1-n)}function ow(e,t,r){let n=To(r);return t==="long"?e*(1-n):e*(1+n)}function jl(e,t,r){let n=Math.abs(e)*To(t),o=Math.abs(e)*To(r);return{taker:n,builder:o,total:n+o}}function iw(e,t){let r=e*(t.positionSizePct/100)*t.maxLeverage;return Math.min(r,t.maxNotionalUsd)}function sw(e,t,r){let n=r/100;return t==="long"?e*(1-n):e*(1+n)}function aw(e,t,r){let n=r/100;return t==="long"?e*(1+n):e*(1-n)}function cw(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 uw(e,t,r){return t==="long"?e.l<=r:e.h>=r}function lw(e,t,r){return t==="long"?e.h>=r:e.l<=r}function dw(e,t,r){return t==="long"?e.l<=r:e.h>=r}function An(e,t){for(let r of e.requiredSeries)if(pw.includes(r)&&!t.every(n=>ht(n?.[r])))throw new Error(`strategy required series is absent: ${r}`)}function fw(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 mw(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 Wt(e,t,r={}){let n=rw(r);Hl(t);let o=bn(t);n.nowMs!==void 0&&Ie(e,{nowMs:n.nowMs});let i=_e(e);if(An(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,y=0,h=0,w=0,E=[],_=[],x=[],O=[],I=[],k=null,g=0,b=null,S=p,R=!1,A=0,$=0,q=[],j=new Array(t.length).fill(0);function P(N){q.push(N)}function D(N){let V=t[N].v*(n.maxVolumeParticipationPct/100);return Math.max(0,V-j[N])}function U(N){if(!k)return p;let V=k.side==="long"?(N-k.entryPrice)*k.qty:(k.entryPrice-N)*k.qty;return p+V}function Y(N,V,L){let oe=L.o,X=iw(p,s);if(!(X>0)||!(oe>0))return;let ie=nw(oe,V,u),te=X/ie,fe=D(N),ln=ie*fe;if(te>fe){x.push({kind:"entry",barIndex:N,time:L.t,side:V,requestedNotionalUsd:X,maxFillNotionalUsd:ln,reason:"volume_participation"});return}j[N]+=te;let pt=Math.abs(ie-oe)*te,Ot=jl(X,l,d);p-=Ot.total,f+=Ot.taker,m+=Ot.builder,h+=pt,w+=X,k={lifecycleEpoch:++$,side:V,entryBarIndex:N,entryReferencePrice:oe,entryPrice:ie,qty:te,notionalUsd:X,stop:sw(ie,V,s.stopLossPct),take:aw(ie,V,s.takeProfitPct),liq:cw(ie,V,s.maxLeverage,l+d),entryFees:Ot.taker,entryBuilderFees:Ot.builder,entrySlippageUsd:pt,fundingAccrued:0}}function K(N,V,L,oe){if(!k)return!1;let X=k.side,ie=V,te=ie;L!=="liquidation"&&oe&&(te=ow(ie,X,u));let fe=k.qty,ln=fe*te;if(L!=="liquidation"){let Ru=D(N),X0=te*Ru;if(fe>Ru)return x.push({kind:"exit",barIndex:N,time:t[N].t,side:X,requestedNotionalUsd:ln,maxFillNotionalUsd:X0,reason:"volume_participation",triggerReason:L}),!1;j[N]+=fe}let pt=jl(ln,l,d),Ot=L==="liquidation"?0:Math.abs(te-ie)*fe,dn,gs;X==="long"?(dn=(ie-k.entryReferencePrice)*fe,gs=(te-k.entryPrice)*fe):(dn=(k.entryReferencePrice-ie)*fe,gs=(k.entryPrice-te)*fe),p+=gs,p-=pt.total,f+=pt.taker,m+=pt.builder,h+=Ot,w+=ln;let K0={side:X,entryBarIndex:k.entryBarIndex,entryTime:t[k.entryBarIndex].t,entryPrice:k.entryPrice,exitBarIndex:N,exitTime:t[N].t,exitPrice:te,exitReason:L,qty:fe,notionalUsd:k.notionalUsd,grossPnlUsd:dn,feesUsd:k.entryFees+pt.taker,builderFeesUsd:k.entryBuilderFees+pt.builder,fundingUsd:k.fundingAccrued,slippageUsd:k.entrySlippageUsd+Ot,netPnlUsd:dn-(k.entryFees+pt.taker+k.entryBuilderFees+pt.builder)-k.fundingAccrued-(k.entrySlippageUsd+Ot)};return E.push(K0),L==="liquidation"&&_.push({barIndex:N,time:t[N].t,side:X,price:te,tradeIndex:E.length-1}),k=null,$+=1,A=N+1+(s.cooldownBars||0),!0}function Pe(N,V,L,oe){let X=N+1;if(X>=t.length)return;q.some(te=>te.kind==="exit"&&te.side===V&&te.fillBar===X&&te.epoch===oe)||P({kind:"exit",side:V,signalBar:N,fillBar:X,reason:L,epoch:oe})}function ue(N){let V=q.filter(L=>L.fillBar===N);for(let L=q.length-1;L>=0;L--)q[L].fillBar===N&&q.splice(L,1);V.sort((L,oe)=>{let X=ie=>ie.kind==="exit"?0:1;return X(L)-X(oe)});for(let L of V)if(L.kind==="exit"){if(!k||k.side!==L.side||k.lifecycleEpoch!==L.epoch)continue;let oe=L.reason||"rule";K(N,t[N].o,oe,!0)||Pe(N,L.side,oe,L.epoch)}else if(L.kind==="entry"){if(k||L.epoch!==$||N<A)continue;Y(N,L.side,t[N])}}function jt(N){if(!k)return;let V=t[N],L=V.fundingPaymentRate;if(L==null||!ht(L)||L===0)return;let oe=Math.abs(k.qty*V.c),X=L*oe;k.side==="long"?(p-=X,k.fundingAccrued+=X,y+=X):(p+=X,k.fundingAccrued-=X,y-=X)}function Ht(N){if(!k)return;let V=t[N].o;(k.side==="long"?V<=k.liq:V>=k.liq)&&K(N,V,"liquidation",!1)}function _u(N){if(!k)return;let V=t[N],L=k.side,oe=dw(V,L,k.liq),X=uw(V,L,k.stop),ie=lw(V,L,k.take),te=fe=>L==="long"?Math.min(fe,V.o):Math.max(fe,V.o);if(oe){K(N,te(k.liq),"liquidation",!1);return}if(X&&ie){K(N,te(k.stop),"stop_loss",!0)||Pe(N,L,"stop_loss",k.lifecycleEpoch);return}if(X){K(N,te(k.stop),"stop_loss",!0)||Pe(N,L,"stop_loss",k.lifecycleEpoch);return}ie&&(K(N,k.take,"take_profit",!0)||Pe(N,L,"take_profit",k.lifecycleEpoch))}for(let N=0;N<t.length;N++){let V=Math.floor(t[N].t/864e5);V!==b&&(b=V,S=U(t[N].o),R=!1),Ht(N),ue(N),_u(N),jt(N),!R&&U(t[N].c)<=S*(1-s.maxDailyLossPct/100)&&(R=!0,O.push({type:"daily_loss_limit",barIndex:N,time:t[N].t,message:"daily loss limit reached; new entries blocked for UTC day"}));let L=a[N].signals,oe=N+c;if(k)(k.side==="long"&&L.exitLong===!0||k.side==="short"&&L.exitShort===!0)&&oe<t.length&&(q.some(fe=>fe.kind==="exit"&&fe.side===k.side&&fe.fillBar===oe&&fe.epoch===k.lifecycleEpoch)||P({kind:"exit",side:k.side,signalBar:N,fillBar:oe,reason:"rule",epoch:k.lifecycleEpoch}));else{let ie=L.entryLong===!0,te=L.entryShort===!0;ie&&te?O.push({type:"conflicting_entry_signals",barIndex:N,time:t[N].t,message:"conflicting entry signals; no position opened"}):!R&&(ie||te)&&oe<t.length&&N>=A&&P({kind:"entry",side:ie?"long":"short",signalBar:N,fillBar:oe,epoch:$})}let X=p;k&&(g+=1,X=U(t[N].c)),I.push({barIndex:N,time:t[N].t,equity:X,positionSide:k?k.side:null})}let Ou=null;if(k){let N=t.length-1;if(K(N,t[N].c,"end_of_data",!0))I[N]={barIndex:N,time:t[N].t,equity:p,positionSide:null};else{let L=U(t[N].c);Ou={side:k.side,entryBarIndex:k.entryBarIndex,entryTime:t[k.entryBarIndex].t,entryPrice:k.entryPrice,qty:k.qty,notionalUsd:k.notionalUsd,markPrice:t[N].c,markedEquityUsd:L},O.push({type:"open_position_at_end",barIndex:N,time:t[N].t,message:"end-of-data exit missed; position remains open and marked"})}}let Tu=(k?U(t[t.length-1].c):p)-n.initialEquityUsd,z0=Tu/n.initialEquityUsd*100,Cu=0,fs=0,ms=0;for(let N of E)N.netPnlUsd>0?(Cu+=1,fs+=N.netPnlUsd):N.netPnlUsd<0&&(ms+=-N.netPnlUsd);let hs=E.length,V0=hs===0?0:Cu/hs,ys=0;ms>0?ys=fs/ms:fs>0&&(ys=1e12);let W0={netPnlUsd:Tu,netPnlPct:z0,maxDrawdownPct:mw(I),winRate:V0,profitFactor:ys,tradeCount:hs,sharpe:fw(I),turnoverUsd:w,exposurePct:g/t.length*100},G0={initialEquityUsd:n.initialEquityUsd,takerFeeBps:n.takerFeeBps,builderFeeBps:n.builderFeeBps,slippageBps:n.slippageBps,latencyBars:n.latencyBars,maxVolumeParticipationPct:n.maxVolumeParticipationPct},Nu={barsHash:o,strategyHash:i.strategyHash,compilerHash:lr,compilerVersion:kn,config:G0,trades:E,equityCurve:I,metrics:W0,costs:{feesUsd:f,builderFeesUsd:m,fundingUsd:y,slippageUsd:h},liquidations:_,missedFills:x,openPositionAtEnd:Ou,flags:O};return Js(Nu),Ys(Oo(Nu))}var ew,pw,vo=v(()=>{dr();ur();ew=Object.freeze({initialEquityUsd:1e4,takerFeeBps:3.5,builderFeeBps:2,slippageBps:2,latencyBars:1,maxVolumeParticipationPct:100});pw=Object.freeze(["fundingRate","openInterest","premium","oiDelta","bookImbalance"])});import{createHash as hw}from"node:crypto";function Ew(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function Zs(e){if(e==null||typeof e!="object"||Object.isFrozen(e))return e;if(Array.isArray(e)){for(let t of e)Zs(t);return Object.freeze(e)}for(let t of Object.keys(e))Zs(e[t]);return Object.freeze(e)}function Aw(e){return String(e).trim().replace(/\s+/g," ")}function vw(e){let t=e.match(/\b(long|short)\b/i);return t?t[1].toLowerCase():null}function Iw(e){for(let r of gw)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 _w(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 yw.has(r)?r:null}function Ow(e){let t={...ww},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 Tw(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 Cw(e){let t=hw("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 Nw(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 Rw(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 $w(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 Pw(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 qw(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 Lw(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 Bw(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 Uw(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 zl(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 Dw({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:zl(a.fast),ema_right_period:zl(a.slow)},nodes:c,rules:u,risk:{...n,expiresAt:o}}}function Mw({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 Fw({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 jw({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 zw({side:e,coin:t,interval:r,risk:n,expiresAt:o,id:i,name:s,spec:a}){let u=[{id:"sig_input",type:"input",field:Hw[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 Vl(e,t={}){if(typeof e!="string")throw new we("prompt must be a string");if(e.length>1e3)throw new we("prompt length must be <= 1000");if(!Ew(t))throw new we("options must be a plain object");if(!Number.isInteger(t.nowMs))throw new we("options.nowMs is required integer epoch ms");let r=t.nowMs,n=Sw;if("expiresInMs"in t){if(!Number.isInteger(t.expiresInMs))throw new we("expiresInMs must be an integer");if(n=t.expiresInMs,n<kw||n>xw)throw new we("expiresInMs must be between 1h and 30d")}if(bw.test(e))throw new we(`prompt appears to contain secrets and is rejected. ${$r}`);let o=Aw(e);if(!o)throw new we(`empty prompt. ${$r}`);if(Tw(o))throw new we(`duplicate interval or risk clause. ${$r}`);let i=vw(o),s=Iw(o),a=_w(o);if(!i||!s||!a)throw new we(`could not parse side/coin/interval. ${$r}`);let c=Ow(o);if(!(c.maxLeverage>0)||c.maxLeverage>50)throw new we("leverage out of range");if(!(c.positionSizePct>0)||c.positionSizePct>100)throw new we("position size out of range");let u=r+n,l=Cw(o),d=`Draft ${s} ${i}`.slice(0,100),p=Nw(o),f=Rw(o),m=$w(o),y=Pw(o),h=qw(o),w=Lw(o),E=Bw(o),_=[p,f,m,y,h,w,E].filter(Boolean);if(_.length!==1)throw new we(`unsupported or ambiguous prompt. ${$r}`);if(!Uw(o,_[0]))throw new we(`unsupported or ambiguous prompt. ${$r}`);let x,O=_[0],I={side:i,coin:s,interval:a,risk:c,expiresAt:u,id:l,name:d,spec:O};O.kind==="ema_cross"?x=Dw(I):O.kind==="rsi"?x=Mw(I):O.kind==="open_interest"?x=jw(I):O.kind==="funding"?x=Fw(I):x=zw(I);let k=Xs(x,{nowMs:r});if(!k.ok)throw new we(`draft failed validation: ${k.errors.map(g=>g.message).join("; ")}`);return Zs(Ie(x,{nowMs:r}))}var we,yw,gw,bw,$r,ww,kw,xw,Sw,Hw,Wl=v(()=>{ur();we=class extends Error{constructor(t){super(t),this.name="StrategyDraftError"}},yw=new Set(["1m","3m","5m","15m","30m","1h","2h","4h","8h","12h","1d"]),gw=new Set(["BTC","ETH","SOL","HYPE"]),bw=/\b(mnemonic|private\s*key|privkey|seed\s*phrase|seed\b|api[_-]?key|secret\s*key|wallet\s*key|passphrase)\b/i,$r="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.",ww=Object.freeze({maxLeverage:1,maxNotionalUsd:100,positionSizePct:5,stopLossPct:2,takeProfitPct:4,cooldownBars:1,maxDailyLossPct:3}),kw=36e5,xw=30*864e5,Sw=864e5;Hw=Object.freeze({funding:"fundingRate",open_interest:"openInterest",premium:"premium",oi_delta:"oiDelta",book_imbalance:"bookImbalance"})});import{createHash as Vw}from"node:crypto";function Xl(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 Ql(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function ta(e){if(e==null||typeof e!="object"||Object.isFrozen(e))return e;if(Array.isArray(e)){for(let t of e)ta(t);return Object.freeze(e)}for(let t of Object.keys(e))ta(e[t]);return Object.freeze(e)}function vn(e){if(Array.isArray(e))return e.map(vn);if(e!=null&&typeof e=="object"){let t={};for(let r of Object.keys(e).sort())t[r]=vn(e[r]);return t}return e}function Co(e){return JSON.stringify(vn(e))}function Ww(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 Gw(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=Co(n),s=Co(o);return i<s?-1:i>s?1:0}),r}function ea(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=Co(r),a=Co(o);return s<a}function Yl(e,t,r={}){if(!Ql(r))throw new TypeError("options must be a plain object");for(let x of Object.keys(r))if(Xl(x))throw new TypeError(`options must not include holdout/test/oos key "${x}"`);let n=new Set(["maxTrials","objective","backtestOptions"]);for(let x of Object.keys(r))if(!n.has(x))throw new TypeError(`unknown option "${x}"`);let o=64;if("maxTrials"in r){let x=r.maxTrials;if(!Number.isInteger(x)||x<1||x>Gl)throw new TypeError(`maxTrials must be an integer 1..${Gl}`);o=x}let i=r.objective??"netPnlUsd";if(!Kl.has(i))throw new TypeError(`objective must be one of ${[...Kl].join("|")}`);let s=r.backtestOptions??{};if(!Ql(s))throw new TypeError("backtestOptions must be a plain object");for(let x of Object.keys(s))if(Xl(x))throw new TypeError(`backtestOptions must not include holdout/test/oos key "${x}"`);let a=Ie(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 x of c){let O=Ww(a.parameters[x]);if(O.length===0)throw new Error(`parameter "${x}" produces an empty grid`);u[x]=O,l*=O.length}let d=Gw(c,u);if(d.length===0)throw new Error("parameter grid is empty");let p=d.slice(0,o),f=[],m=null,y=null;for(let x of p){let O=Sn(a,x),I=Wt(O,t,s);y==null&&(y=I.config);let k={netPnlUsd:I.metrics.netPnlUsd,netPnlPct:I.metrics.netPnlPct,maxDrawdownPct:I.metrics.maxDrawdownPct,winRate:I.metrics.winRate,profitFactor:I.metrics.profitFactor,tradeCount:I.metrics.tradeCount,sharpe:I.metrics.sharpe,turnoverUsd:I.metrics.turnoverUsd},g={parameters:{...x},metrics:k};f.push(g),(!m||ea(i,k,x,m.metrics,m.parameters))&&(m=g)}f.sort((x,O)=>ea(i,x.metrics,x.parameters,O.metrics,O.parameters)?-1:ea(i,O.metrics,O.parameters,x.metrics,x.parameters)?1:0);let h={...m.parameters},w=Sn(a,h),E={strategyHash:Or(a),compilerHash:lr,trainBarsHash:bn(t),backtestConfig:y,objective:i,maxTrials:o,trialsRun:f.length,candidates:f,bestParameters:h,bestStrategy:w},_={id:Vw("sha256").update(JSON.stringify(vn(E)),"utf8").digest("hex"),...E};return ta(vn(JSON.parse(JSON.stringify(_))))}var Gl,Kl,Jl=v(()=>{dr();ur();vo();Gl=256,Kl=new Set(["netPnlUsd","profitFactor","sharpe","maxDrawdownPct"])});import Tt from"node:fs";import No from"node:path";function Ro(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function yt(e){return e==null?e:JSON.parse(JSON.stringify(e))}function Xw(e){return String(e).toLowerCase().replace(/[^a-z0-9]/g,"")}function Pr(e,t="record"){if(Array.isArray(e)){e.forEach((r,n)=>Pr(r,`${t}[${n}]`));return}if(Ro(e))for(let[r,n]of Object.entries(e)){let o=Xw(r);if(Kw.some(i=>o.includes(i)))throw new Error(`shadow-store: forbidden secret-like field at ${t}.${r}`);Pr(n,`${t}.${r}`)}}function Qw(e){if(typeof e!="string"||!e||!No.isAbsolute(e))throw new Error("shadow-store: path must be an absolute path")}function Zl(e){let t;try{t=Tt.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 Yw(){return{version:na,runners:[]}}function ed(e,t){let r;try{r=JSON.parse(e)}catch{throw new Error("shadow-store: malformed JSON")}if(!Ro(r))throw new Error("shadow-store: malformed JSON root");if(r.version!==na)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 Pr(r,No.basename(t)),{version:na,runners:r.runners.map(n=>yt(n))}}function td(e,t){Pr(t,"store");let r=No.dirname(e);Tt.mkdirSync(r,{recursive:!0,mode:448});let n=No.join(r,`.shadow-store.${process.pid}.${Date.now()}.tmp`),o=`${JSON.stringify(t)}
4
- `;try{Tt.writeFileSync(n,o,{mode:384,flag:"wx"}),Tt.renameSync(n,e);try{Tt.chmodSync(e,384)}catch{}}catch(i){try{Tt.unlinkSync(n)}catch{}throw i}}function rd(e={}){let t=e.path;if(Qw(t),Zl(t),Tt.existsSync(t)?ed(Tt.readFileSync(t,"utf8"),t):td(t,Yw()),ra.has(t))return ra.get(t);let r=!1,n=[];function o(){if(r)return;let m=n.shift();if(m){r=!0;try{let y=m.fn();r=!1,m.resolve(y),o()}catch(y){r=!1,m.reject(y),o()}}}function i(m){if(!r&&n.length===0){r=!0;try{return m()}finally{r=!1,queueMicrotask(o)}}return new Promise((y,h)=>{n.push({fn:m,resolve:y,reject:h}),queueMicrotask(o)})}function s(){return Zl(t),ed(Tt.readFileSync(t,"utf8"),t)}function a(m){td(t,m)}function c(m){if(!Ro(m)||typeof m.id!="string"||!m.id)throw new Error("shadow-store: create requires record with string id");Pr(m,"record");let y=s();if(y.runners.some(w=>w.id===m.id))throw new Error(`shadow-store: runner id already exists: ${m.id}`);let h=yt(m);return y.runners.push(h),a(y),yt(h)}function u(m){let y=s().runners.find(h=>h.id===m);return y?yt(y):null}function l(){return s().runners.map(m=>yt(m))}function d(m,y){if(typeof y!="function")throw new Error("shadow-store: updater must be a function");let h=s(),w=h.runners.findIndex(x=>x.id===m);if(w<0)throw new Error(`shadow-store: runner not found: ${m}`);let E=yt(h.runners[w]),_=y(E);if(!Ro(_)||_.id!==m)throw new Error("shadow-store: updater must return record with same id");return Pr(_,"record"),h.runners[w]=yt(_),a(h),yt(h.runners[w])}function p(m){let y=s(),h=y.runners.findIndex(E=>E.id===m);if(h<0)throw new Error(`shadow-store: runner not found: ${m}`);let w=yt(y.runners[h]);return w.status!=="stopped"&&(w.status="stopped",y.runners[h]=w,a(y)),yt(y.runners[h])}let f={create(m){return i(()=>c(m))},get(m){return u(m)},list(){return l()},update(m,y){return i(()=>d(m,y))},stop(m){return i(()=>p(m))}};return ra.set(t,f),f}var na,Kw,ra,nd=v(()=>{na=1,Kw=["privatekey","secretkey","seed","mnemonic","passphrase","password","keystore","keymaterial","apikey","authtoken","accesstoken","refreshtoken","credential","bearer","signature","authorization","xprv","xpriv","wif"];ra=new Map});import{createHash as sa}from"node:crypto";function oa(e){return e==null?e:JSON.parse(JSON.stringify(e))}function ia(e){return Array.isArray(e)?e.map(ia):e&&typeof e=="object"?Object.fromEntries(Object.keys(e).sort().map(t=>[t,ia(e[t])])):e}function id(e){if(!e||typeof e!="object"||Array.isArray(e))throw new TypeError("shadow-runner: record must be an object");return sa("sha256").update(JSON.stringify(ia(e))).digest("hex")}function Jw(e,t,r,n,o){return sa("sha256").update(`${e}|${t}|${r}|${n}|${o}`).digest("hex")}function Zw(e,t,r,n){return sa("sha256").update(`shadow|${e}|${t}|${r}|${n??""}`).digest("hex")}function ek(e){return e==="entryLong"||e==="exitShort"?"buy":e==="entryShort"||e==="exitLong"?"sell":e}function od(e){return e==="entryLong"||e==="entryShort"}function aa({storePath:e,clock:t=Date.now}={}){if(typeof e!="string"||!e)throw new Error("shadow-runner: storePath required");let r=rd({path:e});function n({strategy:c,evidenceId:u=null}={}){let l=_e(c),d=u==null?null:String(u),p=r.list().filter(w=>w.status==="running"&&w.strategyHash===l.strategyHash&&w.compilerHash===l.compilerHash&&w.evidenceId===d).sort((w,E)=>w.createdAt-E.createdAt||w.id.localeCompare(E.id))[0];if(p)return oa(p);let f=t(),m=Zw(f,l.strategyHash,l.compilerHash,d),y=r.get(m);if(y)return oa(y);let h={id:m,strategy:oa(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(h)}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=_e(d.strategy).evaluateAll(u),m=new Map;for(let A=0;A<u.length;A++)m.set(u[A].t,A);let y=d.cursor,h=[];for(let A=0;A<u.length;A++){let $=u[A].t;(y==null||$>y)&&h.push(A)}if(h.length===0)return d;let w=new Map(d.intendedOrders.map(A=>[A.id,A])),E=new Set(d.fills.map(A=>A.orderId)),_=new Map(d.missedFills.map(A=>[A.orderId,A])),x=(A,$)=>`${A}|${$}`,O=new Map(d.markouts.map(A=>[x(A.orderId,A.horizon),A])),I=d.position?{...d.position}:null,k=Number.isInteger(d.cooldownBarsRemaining)?Math.max(0,d.cooldownBarsRemaining):0,g=Number.isFinite(d.cooldownStartT)?d.cooldownStartT:null;function b({action:A,signalBarT:$,signalIndex:q}){let j=ek(A),P=Jw(d.id,d.strategyHash,$,j,A);if(w.has(P))return w.get(P);let D=q+1,U=D<u.length,Y={id:P,action:A,type:A,side:j,signalBarT:$,fillBarT:U?u[D].t:null,status:U?"open":"missed"};return w.set(P,Y),d.intendedOrders.push(Y),Y}function S(A,$,q){if(E.has(A.id))return;let j={orderId:A.id,action:od(A.action)?"entry":"exit",side:A.side,price:$.o,barT:$.t,signalBarT:A.signalBarT,barIndex:q};if(d.fills.push(j),E.add(A.id),A.status="filled",A.fillBarT=$.t,_.has(A.id)&&(_.delete(A.id),d.missedFills=d.missedFills.filter(P=>P.orderId!==A.id)),od(A.action)){I={side:A.action==="entryLong"?"long":"short",entryOrderId:A.id,entryBarT:$.t,entryPrice:$.o,entryBarIndex:q};for(let P of l){let D=x(A.id,P);if(O.has(D))continue;let U={orderId:A.id,horizon:P,entryBarT:$.t,entryPrice:$.o,side:I.side,status:"pending",close:null,barT:null};O.set(D,U),d.markouts.push(U)}}else I=null,k=Number(d.strategy?.risk?.cooldownBars)||0,g=$.t}function R(A){if(E.has(A.id)||_.has(A.id))return;let $={orderId:A.id,action:A.action,side:A.side,signalBarT:A.signalBarT,status:"missed"};_.set(A.id,$),d.missedFills.push($),A.status="missed"}for(let A of d.intendedOrders){if(A.status==="filled"||E.has(A.id))continue;let $=m.get(A.signalBarT);if($==null)continue;let q=$+1;q<u.length&&(y==null||u[q].t>y)&&S(A,u[q],q)}for(let A of h){let $=u[A],q=f[A].signals,j=I,P=U=>{if(I||k>0&&(g==null||$.t>=g))return;let K=b({action:U,signalBarT:$.t,signalIndex:A}),Pe=A+1;Pe<u.length?S(K,u[Pe],Pe):R(K)},D=U=>{if(!I||I.side==="long"&&U!=="exitLong"||I.side==="short"&&U!=="exitShort")return;let Y=b({action:U,signalBarT:$.t,signalIndex:A}),K=A+1;K<u.length?S(Y,u[K],K):R(Y)};j?(q.exitLong&&D("exitLong"),q.exitShort&&D("exitShort")):q.entryLong&&q.entryShort||(q.entryLong&&P("entryLong"),q.entryShort&&P("entryShort")),k>0&&g!=null&&$.t>=g&&(k-=1,k===0&&(g=null)),d.cursor=$.t,d.lastProcessedBarIndex=A}for(let A of d.markouts){if(A.status!=="pending")continue;let $=d.fills.find(P=>P.orderId===A.orderId&&P.action==="entry");if(!$)continue;let q=m.get($.barT);if(q==null)continue;let j=q+A.horizon;if(j<u.length){A.close=u[j].c,A.barT=u[j].t,A.status="filled";let P=A.entryPrice;A.markout=A.side==="long"?(A.close-P)/P:(P-A.close)/P}}return d.position=I,d.cooldownBarsRemaining=k,d.cooldownStartT=g,d.updatedAt=t(),d})}return{start:n,step:a,list:i,get:o,stop:s}}var sd=v(()=>{dr();nd()});var ud={};H(ud,{runStrategyOperation:()=>ck});import tk from"node:os";import rk from"node:path";function In(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function ok(e){return String(e).toLowerCase().replace(/[^a-z0-9]/g,"")}function ua(e){if(Array.isArray(e)){for(let t of e)ua(t);return}if(In(e))for(let[t,r]of Object.entries(e)){if(nk.some(n=>ok(t).includes(n)))throw new Error(`strategy service: secret-like field "${t}" is forbidden`);ua(r)}}function ik(e){if(!In(e))throw new TypeError("strategy input must be a plain object");return ua(e),e}function sk(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 ca(e,t,r,n){if(Array.isArray(t.bars))return t.bars;let o=Fs(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 la(e,t){let r=e.backtestOptions??{};if(!In(r))throw new TypeError("backtestOptions must be a plain object");return{...r,nowMs:t}}function ad(e,t,r,n,o={}){let i=e.evidenceOptions??{};if(!In(i))throw new TypeError("evidenceOptions must be a plain object");return{...i,...o,strategy:t,bars:r,backtestOptions:la(e,n)}}function cd(){return rk.join(tk.homedir(),".oracle","strategy-shadow.json")}function ak(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 ck(e,t={},r={}){r.signal?.throwIfAborted?.();let n=ik(t),o=sk(n,r);if(e==="draft")return{strategy:Vl(n.prompt,{nowMs:o})};if(e==="validate"){let i=_e(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=_e(n.strategy),s=await ca(i.strategy,n,r,o);An(i,s);let a=qs(ad(n,i.strategy,s,o));return e==="evidence"?a:{backtest:Wt(i.strategy,s,la(n,o)),evidence:a}}if(e==="optimize"){let i=_e(n.strategy),s=await ca(i.strategy,n,r,o);An(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(!In(d))throw new TypeError("options must be a plain object");let p=Yl(i.strategy,l,{...d,...n.maxTrials==null?{}:{maxTrials:n.maxTrials},backtestOptions:la(n,o)}),f=p.bestStrategy;return{strategy:f,optimization:p,evidence:qs(ad(n,f,s,o,{trainFraction:u}))}}if(e==="shadow"){let i=aa({storePath:r.storePath??cd(),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 ca(a.strategy,n,r,o);return An(_e(a.strategy),c),await i.step(n.id,c,n.stepOptions??{})}throw new Error(`unknown shadow action: ${s}`)}if(e==="prepare"){let i=_e(n.strategy),s=Fs(i.strategy.venue);if(typeof n.shadowId!="string"||!n.shadowId)throw new Error("strategy prepare requires a matching shadow runner id");let c=await aa({storePath:r.storePath??cd(),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??ak(i.strategy,o);return s.prepareIntent({strategy:i.strategy,evidence:n.evidence,shadow:{id:c.id,stateHash:id(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 nk,ld=v(()=>{vo();dr();Ls();Wl();Jl();sd();js();nk=["privatekey","secretkey","seed","mnemonic","passphrase","password","keystore","keymaterial","apikey","authtoken","accesstoken","refreshtoken","credential","bearer","signature","authorization","xprv","xpriv","wif"]});var Ed={};H(Ed,{DEFAULT_CROSS_CHAIN_SOURCES:()=>gd,DEFAULT_SAME_CHAIN_SOURCES:()=>yd,NATIVE_TOKEN:()=>da,canonicalJson:()=>wd,hashFirmQuote:()=>Sd,hashRfqIntent:()=>xd,normalizeFirmQuote:()=>fa,normalizeRfqIntent:()=>mk,sha256Hex:()=>_n});import{createHash as uk}from"node:crypto";import{getAddress as hd,isAddress as pa}from"ethers";function se(e,t="invalid"){throw new Error(`rfq: ${e} ${t}`)}function pd(e,t){let r=Number(e);return(!Number.isSafeInteger(r)||r<=0)&&se(t,"must be a positive chainId"),r}function $o(e,t){let r=String(e??"").trim();return(!lk.test(r)||BigInt(r)<=0n)&&se(t,"must be a positive integer string"),r}function dk(e,t){return e==null||e===""?null:$o(e,t)}function fd(e,t){let r=String(e??"").trim();return r.toLowerCase()===da.toLowerCase()?da:(pa(r)||se(t,"must be an EVM address or native token sentinel"),hd(r))}function bd(e,t){let r=String(e??"").trim();return pa(r)||se(t,"must be an EVM address"),hd(r)}function pk(e,t){return e==null||e===""?null:bd(e,t)}function md(e,t,r){return e===void 0?[...r]:(Array.isArray(e)||se(t,"must be an array"),e.map(n=>String(n).trim()).filter(Boolean))}function fk(e,{nowMs:t,maxDeadlineMs:r},n){let o=Number(e);return Number.isFinite(o)||se(n,"must be a finite millisecond timestamp"),o<=t&&se(n,"expired"),o>t+r&&se(n,"exceeds maxDeadlineMs"),Math.floor(o)}function qr(e){if(Array.isArray(e))return e.map(qr);if(e&&typeof e=="object"){let t={};for(let r of Object.keys(e).sort())e[r]!==void 0&&(t[r]=qr(e[r]));return t}return e}function wd(e){return JSON.stringify(qr(e))}function _n(e){return`0x${uk("sha256").update(wd(e)).digest("hex")}`}function kd(e,t){let r={...e};for(let n of t)delete r[n];return r}function xd(e){return _n(kd(e,["intentHash"]))}function Sd(e){return _n(kd(e,["firmQuoteHash"]))}function mk(e={},t={}){let r=Number(t.nowMs??Date.now()),n=Number(t.maxDeadlineMs??1800*1e3);(!Number.isFinite(r)||!Number.isFinite(n)||n<=0)&&se("time","is invalid");let o=pd(e.fromChainId??e.fromChain,"fromChainId"),i=pd(e.toChainId??e.toChain,"toChainId"),a=o===i?yd:gd,c={kind:"rfq-intent",version:1,fromChainId:o,toChainId:i,sellToken:fd(e.sellToken??e.tokenIn??e.fromToken,"sellToken"),buyToken:fd(e.buyToken??e.tokenOut??e.toToken,"buyToken"),sellAmount:$o(e.sellAmount??e.amountIn??e.fromAmount,"sellAmount"),receiver:bd(e.receiver??e.recipient??e.to,"receiver"),deadlineMs:fk(e.deadlineMs??e.deadline??e.expiresAtMs,{nowMs:r,maxDeadlineMs:n},"deadline"),minBuyAmount:dk(e.minBuyAmount??e.minOut??e.amountOutMin,"minBuyAmount"),allowedSources:md(e.allowedSources,"allowedSources",a),allowedRouters:md(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)?qr(e.metadata):{}};return c.slippageBps!=null&&(!Number.isInteger(c.slippageBps)||c.slippageBps<0||c.slippageBps>1e4)&&se("slippageBps","must be 0 to 10000"),c.intentId=e.intentId?String(e.intentId):_n({seed:"rfq-intent",intent:c}).slice(0,34),c.intentHash=xd(c),Object.freeze(c)}function hk(e){return(!e||typeof e!="object"||Array.isArray(e))&&se("artifact","required"),e.typedDataHash!=null&&!dd.test(String(e.typedDataHash))&&se("artifact.typedDataHash","must be bytes32"),e.calldataHash!=null&&!dd.test(String(e.calldataHash))&&se("artifact.calldataHash","must be bytes32"),e.to!=null&&!pa(String(e.to))&&se("artifact.to","must be an address"),e.data!=null&&!/^0x(?:[0-9a-fA-F]{2})*$/.test(String(e.data))&&se("artifact.data","must be hex"),qr(e)}function fa(e,t={},r={}){(!e||e.kind!=="rfq-intent")&&se("intent","required");let n=Number(r.nowMs??Date.now()),o=Number(t.expiryMs??t.expiresAtMs??t.validUntilMs);Number.isFinite(o)||se("quote expiry","required"),o<=n&&se("quote","expired"),o>e.deadlineMs&&se("quote expiry","exceeds intent deadline");let i=String(t.source??t.provider??"").trim();i||se("source","required"),e.allowedSources.includes(i)||se("source","not allowed by intent");let s=$o(t.amountOut??t.buyAmount,"amountOut"),a=$o(t.minBuyAmount??t.minOut??s,"minBuyAmount");BigInt(a)>BigInt(s)&&se("minBuyAmount","exceeds amountOut");let c=hk(t.artifact??t.executableArtifact??t.transaction??t.typedData),u=Number(t.quotedAtMs??t.timestampMs??r.nowMs??Date.now());Number.isFinite(u)||se("quotedAtMs","must be finite");let l=pk(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)?qr(t.metadata):{}};return d.quoteId||(d.quoteId=_n({seed:"rfq-quote",out:d}).slice(0,34)),d.firmQuoteHash=Sd(d),Object.freeze(d)}var da,yd,gd,dd,lk,ma=v(()=>{da="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",yd=Object.freeze(["lifi","paraswap","0x","cow","uniswap-v3"]),gd=Object.freeze(["lifi"]),dd=/^0x[0-9a-fA-F]{64}$/,lk=/^\d+$/});import{readFileSync as yk}from"node:fs";import{homedir as gk}from"node:os";import{join as Po}from"node:path";function bk(){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=gk();if(process.env.ORACLE_PUBLIC_DESKTOP==="1"){let r=(process.env.ORACLE_CONFIG_DIR||Po(t,".config","oracle")).trim();return[e,Po(r,"exec.env")].filter(Boolean)}return[e,Po(t,".config","oracle","exec.env"),Po(t,".config","mad-desk","exec.env")].filter(Boolean)}function Ad(e,t,r){let n=e??process.env[t]??process.env[r];if(!String(n||"").trim())for(let o of bk())try{let i=yk(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 vd=v(()=>{});var Id=v(()=>{});import{createHash as wk,createHmac as Od,timingSafeEqual as kk}from"node:crypto";function qo(e){return Array.isArray(e)?`[${e.map(qo).join(",")}]`:e&&typeof e=="object"?`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${qo(e[t])}`).join(",")}}`:JSON.stringify(e??null)}function Td(e,{required:t=!1}={}){try{return Ad(e,"ORACLE_ROUTE_ATTESTATION_SECRET","MAD_ROUTE_ATTESTATION_SECRET")}catch(r){if(t)throw r;return null}}function ya(e){let{signature:t,...r}=e;return r}function Cd(e,{secret:t}={}){let r=Td(t);return r?{...e,signature:Od("sha256",r).update(qo(ya(e))).digest("hex")}:e}function xk(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 wk("sha256").update(Buffer.from(t.slice(2),"hex")).digest("hex")}function ze(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=Td(o);if(i){let f=Od("sha256",i).update(qo(ya(e))).digest("hex");if(!Sk(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>Ct||!Number.isInteger(a)||a<0||a>Ct||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=Ak(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 Cd({...ya(e),calldataHash:xk(n)},{secret:o})}function Sk(e,t){let r=Buffer.from(String(e??""),"utf8"),n=Buffer.from(String(t??""),"utf8");return r.length!==n.length||r.length===0?!1:kk(r,n)}function ha(e,t=0){let r=Number(e);return Number.isFinite(r)?r:t}function Ek(e){let t=e==null?Ct: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,Ct)}function Nt({liquidityUsd:e,priceChange5m:t=0,quoteAgeMs:r=0,crossChain:n=!1,requestedCapBps:o}={}){let i=ha(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(ha(t,0))*2),c=Math.min(40,Math.floor(Math.max(0,ha(r,0))/5e3)*5),u=Math.max(25,Math.ceil(20+s+a+c)),l=Ek(o);return{mode:"auto",requiredBps:u,selectedBps:Math.min(u,l),capBps:l,executable:u<=l}}function ga({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=_d,secret:l}={}){let d=BigInt(r??0);if(d<=0n)throw new Error("auto-slippage guard requires positive quoteAmountOut");let p=Nt({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)||_d)),y=d*BigInt(1e4-p.selectedBps),h=y/10000n;if(y%10000n!==0n&&(h+=1n),h>d&&(h=d),d>0n&&h<=0n)throw new Error(`auto-slippage: quote ${d} is too small to express a ${p.selectedBps} bps floor without rounding to zero`);let w=Number((d-h)*10000n/(d===0n?1n:d));if(w>p.capBps)throw new Error(`auto-slippage: realised floor implies ${w} bps, above cap ${p.capBps} \u2014 refusing to issue a guard weaker than advertised`);return Cd({mode:"auto",chainId:Number(e),venue:String(t||"unknown"),quoteAmountOut:d.toString(),minAmountOut:h.toString(),requiredBps:p.requiredBps,selectedBps:p.selectedBps,capBps:p.capBps,quotedAtMs:f,expiresAtMs:f+m},{secret:l})}function Ak(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 he(e,{chainId:t,venue:r,amountOut:n,liquidityUsd:o,priceChange5m:i,crossChain:s,requestedCapBps:a,quotedAtMs:c=Date.now(),ttlMs:u}={}){let l=ga({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 Ct,_d,rt=v(()=>{vd();Id();Ct=100,_d=2e4});function ba(e){let t=String(e||"").trim();return/^0x[0-9a-fA-F]{40}$/.test(t)?t:Xt}var Xt,Lo=v(()=>{Xt="0x000000000000000000000000000000000000dEaD"});import{Contract as vk,JsonRpcProvider as Ik}from"ethers";function Rk(e){return Nk.test(String(e||""))}async function Nd(e,{contract:t=_k,rpc:r=Tk,chainId:n=Ok,balanceOf:o}={}){if(!Rk(e))throw new Error("invalid-address");if(o)return BigInt(await o(e));let i=new Ik(r,n,{staticNetwork:!0}),s=new vk(t,Ck,i);return BigInt(await s.balanceOf(e))}var _k,Ok,Tk,Ck,Nk,Rd=v(()=>{_k="0x62FCFAf7573AD8B41a0FBF347AfEb85e06599A75",Ok=999,Tk="https://rpc.hyperliquid.xyz/evm",Ck=["function balanceOf(address owner) view returns (uint256)"],Nk=/^0x[a-fA-F0-9]{40}$/});import{existsSync as $k,readFileSync as Pk,lstatSync as qk}from"node:fs";import{homedir as $d}from"node:os";import{join as wa}from"node:path";function Uk(e){let t=String(e||"swap").toLowerCase();return Object.prototype.hasOwnProperty.call(Pd,t)?Pd[t]:Bk}function Hk(e=process.env){if(process.env.ORACLE_TEST_ISOLATE_SECRETS==="1"){if(e[qd])return String(e[qd]);let t=e.ORACLE_CONFIG_DIR||wa($d(),".config","oracle");return wa(t,"fee-recipient")}return wa($d(),".config","oracle","fee-recipient")}function zk(e=process.env){try{let t=Hk(e);if(!$k(t)||qk(t).isSymbolicLink())return"";let r=Pk(t,"utf8").trim().toLowerCase();return/^0x[a-f0-9]{40}$/.test(r)?r:""}catch{return""}}function Vk(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),Lk)}function Wk({env:e=process.env,action:t="swap",admin:r=!1}={}){let n=String(e[Mk]||"").trim(),o=String(e[Fk]||jk).trim();if(r===!0)return{bps:0,recipient:"",integrator:o,action:t,applies:!1,reason:"admin-oracle"};let i=Uk(t),s=Vk(e[Dk],{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=zk(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 Bo({wallet:e,env:t=process.env,action:r="swap",holderCheck:n={},admin:o=!1}={}){let i=Wk({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 Nd(s,n))>0n?{...i,bps:0,applies:!1,reason:"locals-only-holder",holderVerificationStatus:"holder"}:{...i,holderVerificationStatus:"non-holder"}}catch{return{...i,holderVerificationStatus:"unavailable"}}}function Ld(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 Bd(e){return e?.applies?{integrator:e.integrator,fee:String(e.bps/1e4)}:{}}function Ud(e){return e?.applies?{partner:e.integrator,partnerFeeBps:String(e.bps),partnerAddress:e.recipient}:{}}var Lk,Bk,Pd,Dk,Mk,Fk,qd,jk,Uo=v(()=>{Rd();Lk=100,Bk=5,Pd=Object.freeze({swap:5,bridge:5,perps:0,nft:0});Dk="ORACLE_INTEGRATOR_FEE_BPS",Mk="ORACLE_INTEGRATOR_FEE_RECIPIENT",Fk="ORACLE_INTEGRATOR_ID",qd="ORACLE_INTEGRATOR_FEE_RECIPIENT_PIN",jk="oracle"});var Sa={};H(Sa,{LIFI_API:()=>Md,lifiChains:()=>Yk,lifiHealth:()=>Xk,lifiPrepare:()=>Qk,lifiQuote:()=>fr});function xa(e={}){return(e.baseUrl||process.env.LIFI_API_URL||Md).replace(/\/$/,"")}function Kk(e){let t=String(e||ka).toLowerCase();return t===ka.toLowerCase()||t===Gk}function Dd(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 Xk(e={}){let t=await T(`${xa(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 fr(e={},t={}){let{fromChain:r,toChain:n=r,fromToken:o=ka,toToken:i,fromAmount:s,fromAddress:a=Xt}=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=Nt({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 Bo({wallet:e.fromAddress,env:t.env,action:e.feeAction||"swap",holderCheck:t.holderCheck});for(let[h,w]of Object.entries(Bd(l)))c.set(h,w);let d=await T(`${xa(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=he(d,{chainId:Number(r),venue:f,amountOut:p,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,crossChain:Number(n)!==Number(r),requestedCapBps:e.maxSlippageBps??e.slippageBps}),y=d?.estimate?.toAmountMin||d?.toAmountMin;if(y!=null&&BigInt(y)<BigInt(m.amountOutMinimum))throw new Error("lifi: provider transaction is under-protected versus bounded auto-slippage floor");return{...m,oracleFee:l}}async function Qk(e={},t={}){let r=await fr(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(!Kk(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:Dd(a,"approval token"),spender:Dd(s,"approval spender"),amount:String(e.fromAmount)}}return re({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:ze(r.autoSlippage,{chainId:o,venue:n.to,data:n.data})}},{provider:"lifi",kind:"lifi-tx"})}async function Yk(e={}){return T(`${xa(e)}/chains`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??12e3})}var Md,ka,Gk,On=v(()=>{G();rt();Lo();qe();Uo();Md="https://li.quest/v1";ka="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",Gk="0x0000000000000000000000000000000000000000"});var Hd={};H(Hd,{PARASWAP_API:()=>Fd,paraswapHealth:()=>Zk,paraswapPrepare:()=>Jk,paraswapPrice:()=>Br,paraswapTokens:()=>jd});function Lr(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 jd(e={},t={}){let r=Number(e.chainId||1);return T(`${Ea(t)}/tokens/${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function Br(e={},t={}){let r=Number(e.chainId||e.network||1);if(e.amount==null)throw new Error("amount required");let n=new URLSearchParams({srcToken:Lr(e.srcToken,"srcToken"),destToken:Lr(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 Bo({wallet:e.userAddress||e.fromAddress,env:t.env,action:e.feeAction||"swap",holderCheck:t.holderCheck});for(let[a,c]of Object.entries(Ud(o)))n.set(a,c);let i=await T(`${Ea(t)}/prices?${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4}),s=i?.priceRoute?.destAmount;return s?{...he(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 Jk(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=Lr(e.userAddress,"userAddress"),o=await Br(e,t),i=o?.priceRoute,s=String(i?.contractAddress||"").toLowerCase();if(!s)throw new Error("paraswap: price route missing contractAddress");let a={srcToken:Lr(e.srcToken,"srcToken"),destToken:Lr(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=Lr(e.receiver,"receiver"));let c=await T(`${Ea(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 re({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:ze(o.autoSlippage,{chainId:r,venue:c.to,data:c.data})}},{provider:"paraswap",kind:"paraswap-tx"})}async function Zk(e={}){let t=await jd({chainId:1},e),r=Array.isArray(t?.tokens)?t.tokens.length:Object.keys(t?.tokens||{}).length;return{ok:r>0,tokenSample:r}}var Fd,Ea,Do=v(()=>{G();rt();qe();Uo();Fd="https://api.paraswap.io",Ea=(e={})=>(e.baseUrl||process.env.PARASWAP_API_URL||Fd).replace(/\/$/,"")});function Mo({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:Vd(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([Vd(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[zd]||"")==="1")return{baseUrl:s,trusted:!1,host:c};if(o)throw new Error(`${e}: refusing to call non-allowlisted host ${c} (set ${zd}=1 to permit it)`);return{baseUrl:s,trusted:!1,host:c}}function Vd(e){let t=new URL(String(e));if(t.protocol!=="http:"&&t.protocol!=="https:")throw new Error("unsupported protocol");return t.host}function Fo(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 zd,Aa=v(()=>{zd="ORACLE_ALLOW_CUSTOM_PROVIDER_URL"});var Yd={};H(Yd,{ZEROX_API:()=>Wd,zeroxHealth:()=>ex,zeroxPrepare:()=>tx,zeroxPrice:()=>Qd,zeroxQuote:()=>Ur});function Gd(e={}){return Mo({provider:"zerox",defaultUrl:Wd,hosts:["api.0x.org"],url:e.baseUrl||process.env.ZEROX_API_URL})}function Kd(e={}){return Gd(e).baseUrl}function jo(e={}){return e.apiKey||process.env.ZEROX_API_KEY||process.env.OX_API_KEY||process.env["0X_API_KEY"]||""}function Xd(e={}){return Fo({"0x-version":"v2",accept:"application/json"},{"0x-api-key":jo(e)},Gd(e).trusted)}async function ex(e={}){if(!jo(e))return{ok:!1,configured:!1,error:"ZEROX_API_KEY not set"};try{let t=await Qd({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 Qd(e={},t={}){if(!jo(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),T(`${Kd(t)}/swap/allowance-holder/price?${a}`,{headers:Xd(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function Ur(e={},t={}){if(!jo(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=Nt({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 T(`${Kd(t)}/swap/allowance-holder/quote?${c}`,{headers:Xd(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),l=u?.buyAmount||u?.grossBuyAmount;return l?he(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 tx(e={},t={}){if(!e.taker)throw new Error("0x: taker required for executable prepare");let r=await Ur(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 re({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:ze(r.autoSlippage,{chainId:o,venue:n.to,data:n.data})}},{provider:"zerox",kind:"zerox-tx"})}var Wd,Ho=v(()=>{G();rt();Aa();qe();Wd="https://api.0x.org"});var JN,Jd=v(()=>{JN=Object.freeze({READ:"read",PREPARE:"prepare",EXECUTE:"execute",AUTONOMOUS:"autonomous"})});import zo from"node:fs";import rx from"node:os";import Mr from"node:path";import{fileURLToPath as nx}from"node:url";function Zd(){return process.env.ORACLE_FAKE_HOME||rx.homedir()}function ix(){return process.env.ORACLE_PUBLIC_DESKTOP==="1"}function Vo(){return ix()?process.env.ORACLE_CONFIG_DIR||Mr.join(Zd(),".config","oracle"):Mr.join(Zd(),".config","oracle")}function sx(){return Mr.join(Vo(),"desk.json")}function ax(){return Mr.join(Vo(),"env")}function Dr({force:e=!1}={}){if(Dr._done&&!e)return Dr._result||null;Dr._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=ax();if(zo.existsSync(o))for(let i of zo.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=sx();if(zo.existsSync(o)){let i=JSON.parse(zo.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)),Dr._result=Object.keys(t).length?t:null,Dr._result}var ox,oR,ep=v(()=>{ox=Mr.dirname(nx(import.meta.url)),oR=Mr.resolve(ox,"../..");try{Dr()}catch{}});var np={};H(np,{armPreparedAction:()=>hx,callSigner:()=>tp,queueOwnerAction:()=>rp});import{existsSync as cx,readFileSync as ux}from"node:fs";import{request as lx}from"node:http";import dx from"node:path";function fx(e=process.env){let t=String(e.ORACLE_SIGNER_URL||px).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 mx(e=process.env){if(e.ORACLE_SIGNER_TOKEN)return String(e.ORACLE_SIGNER_TOKEN);let t=dx.join(Vo(),"signer","signer-token");return cx(t)?ux(t,"utf8").trim():null}function tp(e,{method:t="GET",body:r=null,env:n=process.env,timeoutMs:o=4e3}={}){let i=fx(n),s=mx(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=lx({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 rp(e,t=process.env){if(!e||e.version!==1||!e.surface)throw new Error("queueOwnerAction: version-1 surface envelope required");return tp("/pending",{method:"POST",body:{artifact:e},env:t,timeoutMs:8e3})}async function hx(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 rp(r,t)}var px,op=v(()=>{ep();px="http://127.0.0.1:9462"});var fp={};H(fp,{COW_CANCEL_TYPES:()=>cp,COW_HOSTS:()=>Go,COW_ORDER_TYPES:()=>Wo,COW_SETTLEMENT:()=>ip,COW_VAULT_RELAYER:()=>sp,armCowOrder:()=>Sx,buildArmedCowOrder:()=>Oa,cowCancelOrders:()=>Ox,cowChains:()=>Nx,cowHealth:()=>kx,cowOrder:()=>pp,cowOrderStatus:()=>dp,cowOrderUid:()=>Ex,cowPrepareCancel:()=>Ix,cowPrepareOrder:()=>xx,cowQuote:()=>mr,cowSignCancel:()=>_x,cowSignOrder:()=>Ax,cowSubmitSignedOrder:()=>vx,cowVerifyOrderFill:()=>Cx});import{TypedDataEncoder as Ia,getAddress as Tn,isAddress as yx}from"ethers";function Ko(e,t={}){if(t.baseUrl)return t.baseUrl.replace(/\/$/,"");let r=Go[Number(e)];if(!r)throw new Error(`cowswap: unsupported chainId ${e}`);return r}function gx(e,t="v1",r={}){let n=Ko(e,r);return t==="v1"?n:n.replace(/\/api\/v1$/,`/api/${t}`)}function Rt(e,t){let r=String(e||"").trim();if(!yx(r))throw new Error(`cowswap: ${t} must be an address`);return Tn(r).toLowerCase()}function Fr(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 up(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 lp(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 bx({digest:e,owner:t,validTo:r}={}){let n=up(e,"order digest").slice(2),o=Rt(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 _a(e){let t=ip[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:Tn(t)}}function wx(e={},t,r){let n=Rt(e.sellToken,"sellToken"),o=Rt(e.buyToken,"buyToken"),i=Rt(e.receiver||r,"receiver"),s=Number(e.validTo);if(!Number.isInteger(s)||s<=0)throw new Error("cowswap: quote.validTo required");let a=up(e.appData||e.appDataHash||`0x${"0".repeat(64)}`,"appData");return{sellToken:n,buyToken:o,receiver:i,sellAmount:Fr(e.sellAmount,"sellAmount"),buyAmount:Fr(e.buyAmount,"buyAmount"),validTo:s,appData:a,feeAmount:Fr(e.feeAmount??"0","feeAmount"),kind:String(e.kind||"sell"),partiallyFillable:!!e.partiallyFillable,sellTokenBalance:String(e.sellTokenBalance||"erc20"),buyTokenBalance:String(e.buyTokenBalance||"erc20")}}async function kx(e={}){try{let t=await mr({chainId:1,sellToken:va[1],buyToken:ap[1],sellAmountBeforeFee:"1000000000000000",from:Xt},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 mr(e={},t={}){let r=Number(e.chainId??1),n=ba(e.from||e.owner),o=e.sellToken||va[r],i=e.buyToken||ap[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=va[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 T(`${Ko(r,t)}/quote`,{method:"POST",body:a,fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),u=c?.quote?.buyAmount||c?.buyAmount;return u?he(c,{chainId:r,venue:"cowswap-order",amountOut:u,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps}):c}async function xx(e={},t={}){let r=Number(e.chainId??1),n=Rt(ba(e.from||e.owner||e.signer),"owner"),o=await mr({...e,chainId:r,from:n,signingScheme:e.signingScheme||"eip712"},t),i=wx(o?.quote||o,r,n),s=_a(r),a={domain:s,types:Wo,primaryType:"Order",message:i},c=Ia.hash(s,Wo,i),u=sp[r];if(!u)throw new Error(`cowswap: vault relayer not registered for chain ${r}`);return re({provider:"cowswap",orderReady:!0,executionReady:!1,chainId:r,owner:n,signingScheme:"eip712",settlement:s.verifyingContract.toLowerCase(),vaultRelayer:Tn(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:Tn(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:Tn(u).toLowerCase(),amount:i.sellAmount},localSignerEnvelope:Oa({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 Oa(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=Go[n];if(!o)throw new Error(`cowswap: unsupported chainId ${n}`);let i=Rt(e.owner,"owner"),s=Number(t.nowMs??Date.now()),a=Ia.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 Sx(e={},t={}){let{queueOwnerAction:r}=await Promise.resolve().then(()=>(op(),np)),n=e.localSignerEnvelope||Oa(e,t);return{...await r(n,t.env),envelope:n,execution:"armed-local",exec:!1}}async function dp(e={},t={}){let r=Number(e.chainId??1),n=String(e.uid||e.orderUid||"").trim();if(!n)throw new Error("cowOrderStatus requires uid");return T(`${Ko(r,t)}/orders/${encodeURIComponent(n)}/status`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function pp(e={},t={}){let r=Number(e.chainId??1),n=String(e.uid||e.orderUid||"").trim();if(!n)throw new Error("cowOrder requires uid");return T(`${Ko(r,t)}/orders/${encodeURIComponent(n)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}function Ex(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||Ia.hash(_a(r),Wo,n),i=e.owner||e.from||e.signer||n.receiver;return bx({digest:o,owner:i,validTo:n.validTo})}async function Ax(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 vx(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 Ix(e={}){let t=Number(e.chainId??1),r=Rt(e.owner||e.from||e.signer,"owner"),n=(e.orderUids||e.uids||[e.uid]).filter(Boolean).map((s,a)=>lp(s,`orderUids[${a}]`));if(!n.length)throw new Error("cowswap: orderUids required");let o=_a(t);return re({provider:"cowswap",chainId:t,owner:r,orderUids:n,signingScheme:"eip712",typedData:{domain:o,types:cp,primaryType:"OrderCancellations",message:{orderUids:n}},cancelReady:!0,executableArtifact:!0},{provider:"cowswap",kind:"cow-cancel"})}async function _x(e={},t={}){throw new Error("cowswap.cowSignCancel refused: @oracle-agent/oracle is prepare-only. Cancel-sign with the user wallet.")}async function Ox(e={},t={}){throw new Error("cowswap.cowCancelOrders refused: @oracle-agent/oracle is prepare-only. Cancel from the user wallet or local operator.")}function Tx(e={}){return Fr(e.buyAmount??e.executedBuyAmount??"0","trade.buyAmount")}async function Cx(e={},t={}){let r=Number(e.chainId??1),n=lp(e.uid||e.orderUid),o=t.order||await pp({chainId:r,uid:n},t),i=t.status||o.status||await dp({chainId:r,uid:n},t).catch(()=>null),s=t.trades||await T(`${gx(r,"v2",t)}/trades?orderUid=${encodeURIComponent(n)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),a=Array.isArray(s)?s:[],c=e.expectedOwner?Rt(e.expectedOwner,"expectedOwner"):null;if(c&&Rt(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(Tx(p));u===0n&&o.executedBuyAmount!=null&&(u=BigInt(Fr(o.executedBuyAmount,"executedBuyAmount")));let l=e.minBuyAmount!=null?BigInt(Fr(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 Nx(){return Object.keys(Go).map(Number)}var Go,ip,sp,va,ap,Wo,cp,Xo=v(()=>{G();rt();Jd();Lo();qe();Go={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"},ip=Object.freeze({1:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41",100:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41",42161:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41",8453:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41"}),sp=Object.freeze({1:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110",100:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110",42161:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110",8453:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110"}),va={1:"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",8453:"0x4200000000000000000000000000000000000006",42161:"0x82aF49447D8a07e3bd95BD0d56f35241523fBab1"},ap={1:"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",8453:"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",42161:"0xaf88d065e77c8cC2239327C5EDb3A432268e5831"},Wo=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"}]}),cp=Object.freeze({OrderCancellations:[{name:"orderUids",type:"bytes[]"}]})});var hp={};H(hp,{CHAINS:()=>Qo,chainById:()=>Ca,isSupportedChain:()=>mp,registerChain:()=>Rx,rpcUrlFor:()=>Na});function Ca(e){return Ta.get(Number(e))||null}function Rx({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 Qo[e]=o,Ta.set(o.chainId,o),o}function Na(e,t=process.env){let r=Ca(e);if(!r)return null;for(let n of r.rpcEnv){let o=(t[n]||"").trim();if(o)return o}return null}function mp(e){return Ta.has(Number(e))}var Qo,Ta,Ra=v(()=>{Qo={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}},Ta=new Map(Object.values(Qo).map(e=>[e.chainId,e]))});import{Interface as $x,getAddress as Px}from"ethers";function Nn(e,t){try{return Px(e).toLowerCase()}catch{throw new Error(`${t} must be a valid EVM address`)}}function Lx(e,{rpcUrl:t,env:r=process.env}={}){if(t)return t;let n=Na(e,r);return n||qx[Number(e)]||null}function Ux(e){let t=String(e||""),r=t.toLowerCase();if(t!==t.trim()||!/^[a-zA-Z0-9_]+$/.test(t)||!Bx.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 Dx(e){let t=new Error(e?.message||JSON.stringify(e));return t.code=e?.code,t}function Mx(e){if(e?.error)throw Dx(e.error);return e?.result}function Fx(e,t,r){return`${e}
2
+ var ab=Object.defineProperty;var O=(e,t,n)=>()=>{if(n)throw n[0];try{return e&&(t=e(e=0)),t}catch(r){throw n=[r],r}};var z=(e,t)=>{for(var n in t)ab(e,n,{get:t[n],enumerable:!0})};import{homedir as Ms}from"node:os";import{join as Ds}from"node:path";function Fs(e,t,n=""){let r=process.env[e];if(r!=null&&String(r).trim()!=="")return r;let o=t?process.env[t]:void 0;return o!=null&&String(o).trim()!==""?o:n}function Lo(e,t,n=!1){return String(Fs(e,t,n?"1":"")).trim()==="1"}var ul,cb,ZN,$o=O(()=>{ul=process.env.ORACLE_PUBLIC_DESKTOP==="1",cb=ul?process.env.ORACLE_CONFIG_DIR||Ds(Ms(),".config","oracle"):Ds(Ms(),".config","oracle"),ZN=ul?cb:Ds(Ms(),".config","mad-desk")});function Mb(e){let t=String(e??"");return t.length<18?"[REDACTED]":`${t.slice(0,6)}\u2026${t.slice(-4)}`}function Db(e){return`\xABredacted:${String(e??"").slice(0,4)}\u2026\xBB`}function pn(e,t={}){if(e==null)return e;let n=typeof e=="string"?e:String(e);if(!n||!(t.force||Tb))return n;let r=t.fileRead?Db:Mb;n=n.replace(Rb,"[REDACTED_PRIVATE_KEY]"),n=n.replace(Nb,"[REDACTED_EVM_KEY]"),n=n.replace(Pb,o=>r(o));for(let o of Cb)o.lastIndex=0,n=n.replace(o,i=>r(i));return n=n.replace(Lb,(o,i,s,a)=>/^(?:os\.(?:getenv|environ)|process\.env|\$ENV\{)/.test(a)?`${i}=${s||""}${a}${s||""}`:`${i}=${s||""}${r(a)}${s||""}`),n=n.replace($b,(o,i,s,a)=>o.replace(a,r(a))),n=n.replace(qb,(o,i,s,a)=>`${i}${r(s)}${a}`),n}function wl(e){let t;try{t=new URL(String(e))}catch{return{ok:!1,error:`not a valid URL: ${String(e).slice(0,120)}`}}(t.username||t.password)&&(t.username="",t.password="");let n=[...t.searchParams.keys()];for(let r of n){let o=String(r).replace(/[^a-z0-9]/gi,"").toLowerCase();Ub.has(o)&&t.searchParams.set(r,"[REDACTED]")}return{ok:!0,url:t,href:t.toString()}}var Ob,Tb,Cb,Nb,Rb,Pb,Lb,$b,qb,Bb,Ub,zs=O(()=>{Ob=(process.env.ORACLE_REDACT_SECRETS??"true").toLowerCase(),Tb=["1","true","yes","on"].includes(Ob),Cb=[/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],Nb=/\b0x[a-fA-F0-9]{64}\b/g,Rb=/-----BEGIN (?:RSA |EC |OPENSSH |ENCRYPTED )?PRIVATE KEY-----[\s\S]*?-----END (?:RSA |EC |OPENSSH |ENCRYPTED )?PRIVATE KEY-----/g,Pb=/\beyJ[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\b/g,Lb=/\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,$b=/^(?:export\s+)?((?:api[_-]?key|token|secret|password|private[_-]?key|mnemonic|seed[_-]?phrase|authorization))\s*[:=]\s*(['"]?)([^\s&]+)\2/gim,qb=/("(?:api[_-]?key|apiKey|access[_-]?token|refresh[_-]?token|client[_-]?secret|private[_-]?key|privateKey|secret|password|authorization|bearer|mnemonic|seedPhrase)"\s*:\s*")([^"]{6,})(")/gi,Bb=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"]),Ub=new Set([...Bb].map(e=>e.replace(/[^a-z0-9]/gi,"").toLowerCase()))});import fn from"node:net";import Hb from"node:dns";function Mo(e){let t=String(e).toLowerCase().split("%")[0];if((t.match(/::/g)||[]).length>1)return null;let n=l=>{if(!l)return[];let d=l.split(":"),f=d.at(-1);if(f?.includes(".")){let p=f.split(".").map(Number);if(p.length!==4||p.some(m=>!Number.isInteger(m)||m<0||m>255))return null;d.splice(d.length-1,1,(p[0]<<8|p[1]).toString(16),(p[2]<<8|p[3]).toString(16))}return d.some(p=>!/^[0-9a-f]{1,4}$/.test(p))?null:d.map(p=>Number.parseInt(p,16))},[r,o]=t.split("::"),i=n(r),s=n(o);if(!i||!s)return null;let a=t.includes("::"),c=8-i.length-s.length;if(!a&&c!==0||a&&c<1)return null;let u=[...i,...Array(Math.max(0,c)).fill(0),...s];return u.length!==8?null:Uint8Array.from(u.flatMap(l=>[l>>8,l&255]))}function Vs(e,t,n){let r=Math.floor(n/8),o=n%8;for(let s=0;s<r;s+=1)if(e[s]!==t[s])return!1;if(!o)return!0;let i=255<<8-o;return(e[r]&i)===(t[r]&i)}function Ws(e){if(fn.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(fn.isIPv6(e)){let t=Mo(e);if(!t)return!1;let n=Mo("::ffff:0:0");return Vs(t,n,96)?Ws([...t.slice(12)].join(".")):Vs(t,Mo("2000::"),3)?![["2001::",23],["2001:db8::",32],["2001:10::",28],["2001:2::",48],["2002::",16],["3fff::",20]].some(([o,i])=>Vs(t,Mo(o),i)):!1}return!1}function Vb(e){let t;try{t=new URL(String(e))}catch{return{ok:!1,error:`not a valid URL: ${String(e).slice(0,120)}`}}if(t.protocol!=="http:"&&t.protocol!=="https:")return{ok:!1,error:`refused protocol ${t.protocol} (only http/https)`};let n=t.hostname.toLowerCase().replace(/^\[|\]$/g,"").replace(/\.+$/,"");if(zb.has(n)||n.endsWith(".localhost")||n.endsWith(".internal"))return{ok:!1,error:`refused internal host ${n}`};let r=fn.isIP(n);return r!==0&&!Ws(n)?{ok:!1,error:`refused private address ${n}`}:{ok:!0,url:t,host:n,isLiteralIp:r!==0}}async function Gs(e,{lookupFn:t=Hb.promises.lookup}={}){let n=Vb(e);if(!n.ok)return n;if(n.isLiteralIp)return{ok:!0,url:n.url,addresses:[{address:n.host,family:fn.isIPv6(n.host)?6:4}]};let r;try{r=await t(n.host,{all:!0,verbatim:!0})}catch{return{ok:!1,error:`refused: ${n.host} did not resolve`}}return!Array.isArray(r)||r.length===0||r.some(o=>!Ws(o.address))?{ok:!1,error:`refused: ${n.host} resolves to a non-public address`}:{ok:!0,url:n.url,addresses:r}}async function Ks({requireUndici:e=!1,importUndici:t=()=>import("undici")}={}){let n,r;try{let d=await t();n=d.Agent,r=d.fetch}catch(d){if(e)throw new Error(`egress-guard: untrustedUrl pinning requires the undici package, which failed to load: ${d?.message||d}`);return null}if(typeof n!="function"||typeof r!="function"){if(e)throw new Error("egress-guard: untrustedUrl pinning requires undici's Agent and fetch exports, which were not found on the imported module");return null}let o=d=>String(d).toLowerCase().replace(/^\[|\]$/g,"").replace(/\.+$/,""),i=new Map,s=d=>(Array.isArray(d)?d:[d]).map(f=>typeof f=="string"?{address:f}:f).filter(f=>f&&f.address).map(f=>({address:f.address,family:f.family||(fn.isIPv6(f.address)?6:4)})),a=(d,f,p)=>{i.set(o(d),s(typeof f=="string"?[{address:f,family:p}]:f))},c=d=>{let f=o(d);if(fn.isIP(f))return[{address:f,family:fn.isIPv6(f)?6:4}];let p=i.get(f);if(!p||!p.length)throw new Error(`refused: unpinned host ${d} during pinned fetch`);return p},u=new n({connect:{lookup(d,f,p){let m;try{m=c(d)}catch(y){return p(y)}return f?.all?p(null,m):p(null,m[0].address,m[0].family)}}}),l=Wb((d,f={})=>r(d,{...f,dispatcher:u}),a);return{dispatcher:u,fetch:l,pin:a,resolve:c,async close(){try{await u.destroy()}catch{}}}}function Wb(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[Ys]=Object.freeze({pin:t}),e}function Xs(e){return typeof e=="function"&&typeof e[Ys]?.pin=="function"}function Sl(e,t,n){if(!Xs(e))throw new Error("pinFetchToAddresses: fetchImpl is not pin-capable");e[Ys].pin(t,n)}var zb,Ys,vl=O(()=>{zb=new Set(["localhost","metadata.google.internal","metadata.goog"]);Ys=Symbol.for("oracle.egressGuard.pinCapableFetch")});import{createHash as Al}from"node:crypto";function Jb(e){let t=String(e||"").toLowerCase();return Cl.includes(t)||/(^|-)(api[-_]?key|key|token|secret|auth|authorization|session|cookie|signature|access)(-|$)/.test(t)}function Qb(e){let t={};for(let[n,r]of Object.entries(e||{}))Jb(n)||(t[n]=r);return t}function Zb(e,t){if(!e)throw new Error(`HTTP redirect from ${t} missing Location`);let n=new URL(String(e),String(t));if(n.protocol!=="http:"&&n.protocol!=="https:")throw new Error(`HTTP redirect from ${t} used unsupported protocol ${n.protocol}`);return n.toString()}function ew(e,t){return new URL(String(e)).origin===new URL(String(t)).origin}function _l(e){let t=String(e?.method||"");return t?!tw.test(t):!1}function rw(e,t){if(e==="GET"&&t==null)return!0;if(e!=="POST"||t==null)return!1;let n=t;if(typeof t=="string")try{n=JSON.parse(t)}catch{return!1}return Array.isArray(n)?n.length>0&&n.every(_l):!n||typeof n!="object"?!1:n.jsonrpc&&n.method?_l(n):typeof n.type=="string"&&nw.has(n.type)&&n.action==null&&n.signature==null&&n.nonce==null}function ow(e,t,n,r={},o=null){let i={};for(let[f,p]of Object.entries(n||{}))i[f.toLowerCase()]=p;let s=Object.keys(i).filter(f=>/(^|-)(api[-_]?key|key|token|secret|auth|authorization|session|cookie|signature|access)(-|$)/.test(f)),c=[...new Set([...Cl,...s])].sort().map(f=>`${f}=${i[f]??""}`).join(`
3
+ `),u=Al("sha256").update(c).digest("hex").slice(0,32),l=`${r.untrustedUrl?"untrusted":"trusted"}:${r.maxResponseBytes??"unbounded"}`,d=o==null?"-":Al("sha256").update(String(o)).digest("hex").slice(0,32);return`${e} ${t} ${l} ${u} ${d}`}function iw(e,t){let n=Number(t);return Number.isFinite(n)&&n>0?Math.min(n*1e3,kl):Math.min(250*2**e,kl)+Math.floor(Math.random()*100)}function kr(e,t={}){let n=new Error(e);return n.retryable=!1,Object.assign(n,t),n}function Qs(e,t,n){return kr(`HTTP response from ${e} exceeded maxResponseBytes ${n} (${t})`,{oversize:!0})}function Ir(e){try{let t=e?.body?.cancel?.();t&&typeof t.then=="function"&&t.catch(()=>{})}catch{}}function aw(e){return e?e.byteLength??e.length??0:0}async function Ol(e,t,{url:n,truncate:r=!1,onOversize:o}={}){if(t==null)return await e.text();let i=Number(e.headers?.get?.("content-length"));if(Number.isFinite(i)&&i>t&&(Ir(e),!r))throw Qs(n,`content-length ${i}`,t);let s=e.body?.getReader?.();if(!s){let d=await e.text(),f=Buffer.byteLength(d,"utf8");if(f>t){if(!r)throw Qs(n,`body ${f} bytes`,t);return Buffer.from(d,"utf8").subarray(0,t).toString("utf8")}return d}let a=[],c=0,u=!1;try{for(;;){let{value:d,done:f}=await s.read();if(f)break;if(d&&(a.push(Buffer.from(d)),c+=aw(d),c>t)){u=!0;break}}}finally{if(u)try{await s.cancel()}catch{}try{s.releaseLock?.()}catch{}}if(u&&(typeof o=="function"&&o(),!r))throw Qs(n,`streamed ${c} bytes`,t);let l=Buffer.concat(a);return(u?l.subarray(0,t):l).toString("utf8")}function Tl(e){if(!e)return null;try{return JSON.parse(e)}catch{return null}}async function cw(e,{fetchImpl:t,method:n,headers:r,body:o,timeoutMs:i,lookupFn:s,realFetch:a,untrustedUrl:c=!1,maxResponseBytes:u=null,importUndici:l,validateResponse:d,signal:f}){let p=new AbortController,m=setTimeout(()=>p.abort(),i),y=f?typeof AbortSignal.any=="function"?AbortSignal.any([f,p.signal]):f:p.signal,h=null,w=t,A=s?{lookupFn:s}:{};if(c&&!a&&!Xs(w))throw kr(`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(S,{status:k=null}={})=>{let x=await Gs(S,A);if(!x.ok)throw kr(k==null?`HTTP refused ${S}: ${x.error}`:`HTTP redirect to ${S} ${x.error}`,k==null?{}:{status:k});let E=new URL(S).hostname;if(a){if(h&&(await h.close(),h=null),!h)try{h=await Ks({requireUndici:!0,...l?{importUndici:l}:{}})}catch(g){throw kr(k==null?`HTTP refused ${S}: ${g?.message||g}`:`HTTP redirect to ${S} refused: ${g?.message||g}`,k==null?{}:{status:k})}h.pin(E,x.addresses),w=h.fetch}else Sl(w,E,x.addresses);return x};try{let S=String(e),k={...r||{}};c&&await _(S);for(let x=0;x<=Il;x+=1){let E=await w(S,{method:n,headers:k,body:o,signal:y,redirect:"manual"});if(Yb.has(E.status)){if(n!=="GET"&&n!=="HEAD"){let L=await Ol(E,u??Xb,{url:S,truncate:!0}),q=new Error(`HTTP ${E.status} ${n} ${S} redirected non-idempotent request`);throw q.status=E.status,q.body=Tl(L)??L.slice(0,300),q}if(x===Il)throw Ir(E),new Error(`HTTP redirect loop for ${e}`);let v=E.headers?.get?.("location"),P;try{P=Zb(v,S)}catch(L){throw Ir(E),L}let I=!ew(P,S);if(Ir(E),I&&(k=Qb(k)),c)await _(P,{status:E.status});else if(I){let L=await Gs(P,A);if(!L.ok){let q=new Error(`HTTP redirect from ${S} ${L.error}`);throw q.status=E.status,q.retryable=!1,q}a&&L.addresses?.length&&(h||(h=await Ks(l?{importUndici:l}:{})),h&&(h.pin(new URL(P).hostname,L.addresses),w=h.fetch))}S=P;continue}if(typeof d=="function")try{await d(E,{url:S})}catch(v){throw Ir(E),kr(v?.message||String(v))}let g=await Ol(E,u,{url:S,onOversize:()=>p.abort()}),b=Tl(g);if(!E.ok){let v=new Error(`HTTP ${E.status} ${n} ${S}`);throw v.status=E.status,v.retryAfter=E.headers?.get?.("retry-after")??null,v.body=b??g.slice(0,300),v}return b??g}throw new Error(`HTTP redirect loop for ${e}`)}finally{clearTimeout(m),h&&await h.close()}}async function C(e,t={}){let n=t.fetchImpl||globalThis.fetch;if(typeof n!="function")throw new Error("fetch unavailable \u2014 pass opts.fetchImpl");let r=t.timeoutMs??12e3,o=(t.method||"GET").toUpperCase(),i={Accept:"application/json",...t.headers||{}},s=t.body;s!=null&&typeof s!="string"&&(i["Content-Type"]=i["Content-Type"]||"application/json",s=JSON.stringify(s));let a=Number.isInteger(t.retries)?Math.max(t.retries,0):Kb,c=t.lookupFn,u=!t.fetchImpl,l=t.untrustedUrl===!0,d=t.importUndici,f=t.validateResponse,p=t.signal,m=Number(t.maxResponseBytes),y=Number.isFinite(m)&&m>0?Math.floor(m):null,h=async()=>{let k;for(let x=0;x<=a;x++){p?.throwIfAborted?.();try{return await cw(e,{fetchImpl:n,method:o,headers:i,body:s,timeoutMs:r,lookupFn:c,realFetch:u,untrustedUrl:l,maxResponseBytes:y,importUndici:d,validateResponse:f,signal:p})}catch(E){k=E;let g=E?.status,b=E?.name==="AbortError"||E?.name==="TimeoutError"||p?.aborted,v=new Set([408,425,429]),P=E?.retryable===!1?!1:g!=null?v.has(g)||Gb.has(g)&&xl.has(o):!b&&xl.has(o);if(x===a||!P)throw E;let I=iw(x,E?.retryAfter);p?await new Promise((L,q)=>{let H=setTimeout(L,I);p.addEventListener("abort",()=>{clearTimeout(H),q(p.reason||new DOMException("Aborted","AbortError"))},{once:!0})}):await sw(I)}}throw k};if(!(t.dedupe!==!1&&!p&&rw(o,s)))return h();let A=ow(o,e,i,{untrustedUrl:l,maxResponseBytes:y},s),_=Js.get(A);if(_)return _;let S=h().finally(()=>Js.delete(A));return Js.set(A,S),S}async function mn(e,t,n){let r=Array.from(e),o=Math.max(1,Math.min(Number(t)||1,r.length||1)),i=new Array(r.length),s=0;return await Promise.all(Array.from({length:o},async()=>{for(;s<r.length;){let a=s++;i[a]=await n(r[a],a)}})),i}var Gb,xl,Kb,kl,Cl,Yb,Il,Xb,Js,tw,nw,sw,G=O(()=>{vl();Gb=new Set([408,425,429,500,502,503,504]),xl=new Set(["GET","HEAD","OPTIONS","PUT","DELETE"]),Kb=2,kl=4e3,Cl=["authorization","x-api-key","x-tensor-api-key","0x-api-key","api-key","cookie","proxy-authorization"],Yb=new Set([301,302,303,307,308]),Il=3,Xb=64*1024;Js=new Map,tw=/(?:^|_)(send|submit|broadcast|sign|requestAirdrop)(?=[A-Z_]|$)/i,nw=new Set(["allMids","l2Book","outcomeMeta","spotClearinghouseState","userFills","meta","metaAndAssetCtxs","perpDexs","candleSnapshot","fundingHistory","openOrders","frontendOpenOrders","clearinghouseState","spotMeta","validatorSummaries","delegatorSummary","delegations","delegatorRewards","delegatorHistory","maxBuilderFee"]);sw=e=>new Promise(t=>setTimeout(t,e))});var Rl={};z(Rl,{CHAINS:()=>Do,chainById:()=>ea,isSupportedChain:()=>Nl,registerChain:()=>uw,rpcUrlFor:()=>ta});function ea(e){return Zs.get(Number(e))||null}function uw({key:e,chainId:t,name:n,rpcEnv:r=[]}){if(!e)throw new Error("registerChain requires a key");if(!Number.isInteger(Number(t)))throw new Error("registerChain requires a numeric chainId");let o={chainId:Number(t),name:n||e,rpcEnv:r,evm:!0};return Do[e]=o,Zs.set(o.chainId,o),o}function ta(e,t=process.env){let n=ea(e);if(!n)return null;for(let r of n.rpcEnv){let o=(t[r]||"").trim();if(o)return o}return null}function Nl(e){return Zs.has(Number(e))}var Do,Zs,na=O(()=>{Do={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}},Zs=new Map(Object.values(Do).map(e=>[e.chainId,e]))});import{Interface as lw,getAddress as dw}from"ethers";function Or(e,t){try{return dw(e).toLowerCase()}catch{throw new Error(`${t} must be a valid EVM address`)}}function fw(e,{rpcUrl:t,env:n=process.env}={}){if(t)return t;let r=ta(e,n);return r||pw[Number(e)]||null}function hw(e){let t=String(e||""),n=t.toLowerCase();if(t!==t.trim()||!/^[a-zA-Z0-9_]+$/.test(t)||!mw.test(n))throw new Error(`evm-rpc: ${t} refused \u2014 @oracle-agent/oracle is prepare-only (read RPC only; no broadcast/sign)`);return n}function yw(e){let t=new Error(e?.message||JSON.stringify(e));return t.code=e?.code,t}function gw(e){if(e?.error)throw yw(e.error);return e?.result}function bw(e,t,n){return`${e}
5
4
  ${t}
6
- ${JSON.stringify(r??[])}`}async function jx(e,t,r){return T(e,{method:"POST",body:t,fetchImpl:r.fetchImpl,timeoutMs:r.timeoutMs??12e3,signal:r.signal})}async function ee(e,t,r=[],n={}){let o=String(t||""),i=Ux(o),s=Lx(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=yp.get(s);if(l!=null)return l}let c=n.dedupe!==!1&&!n.signal?Fx(s,o,r):null;if(c&&Cn.has(c))return Cn.get(c);let u=(async()=>{let l=await jx(s,{jsonrpc:"2.0",id:1,method:t,params:r},n),d=Mx(l);return i==="eth_chainid"&&typeof d=="string"&&yp.set(s,d),d})();return c&&(Cn.set(c,u),u.finally(()=>{Cn.get(c)===u&&Cn.delete(c)}).catch(()=>{})),u}async function Jo(e,t={}){let r=await ee(e,"eth_blockNumber",[],t);return parseInt(r,16)}async function gp(e,t={}){let r=await ee(e,"eth_gasPrice",[],t);if(r==null)return null;try{return BigInt(r)}catch{return null}}async function bp(e,t,r={}){if(!t)throw new Error("rpcGetBalance requires address");let n=await ee(e,"eth_getBalance",[t,"latest"],r);return{chainId:Number(e),address:t,balanceWei:BigInt(n).toString(),balanceHex:n}}async function wp(e={},t={}){let r=Number(e.chainId??t.chainId??1),n=Nn(e.token||e.tokenAddress,"token"),o=Nn(e.owner,"owner"),i=Nn(e.spender,"spender"),s=Yo.encodeFunctionData("allowance",[o,i]),a=await ee(r,"eth_call",[{to:n,data:s},e.blockTag||"latest"],t),c=Yo.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 kp(e={},t={}){let r=Number(e.chainId??t.chainId??1),n=Nn(e.token||e.tokenAddress,"token"),o=Nn(e.account||e.owner||e.address,"account"),i=Yo.encodeFunctionData("balanceOf",[o]),s=await ee(r,"eth_call",[{to:n,data:i},e.blockTag||"latest"],t),a=Yo.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 Yo,qx,Bx,Cn,yp,$t=v(()=>{G();Ra();Yo=new $x(["function allowance(address owner,address spender) view returns (uint256)","function balanceOf(address account) view returns (uint256)"]);qx={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"};Bx=/^(?:eth_(?:call|blocknumber|chainid|get[a-z0-9]+|feehistory|gasprice|maxpriorityfeepergas|syncing|protocolversion|estimategas|createaccesslist)|net_(?:version|listening|peercount)|web3_(?:clientversion|sha3))$/;Cn=new Map,yp=new Map});function xp(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 Zo(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=xp(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,y=String(c.dex||c.dexId||"").toLowerCase(),h=0;return i.has(d)||Hx.has(p)?h=300:s&&d===s&&(h=100),y.includes("v4")?h+=20:y.includes("v3")?h+=10:(y.includes("v2")||y.includes("raydium")||y.includes("orca")||y.includes("meteora"))&&(h+=8),{pool:c,score:h*1e12+m,index:u,otherAddr:d,liquidityUsd:m}});return a.sort((c,u)=>u.score-c.score||c.index-u.index),a.map(c=>c.pool)}function Sp(e,t=[]){let r=Array.isArray(t)?t:[];return r.length&&xp(e,r[0]).address||null}var Hx,$a=v(()=>{Hx=new Set(["usdc","usdt","usdg","dai","usd1","usde","pyusd"])});function Gx(e,t,r){let n=nt(t),o=nt(r),i=nt(e?.baseToken?.address),s=nt(e?.quoteToken?.address);return i===n&&s===o||i===o&&s===n}function Kx(e){let t=Number(e?.liquidity?.usd);return Number.isFinite(t)&&t>=0?t:null}function Xx(e={}){return(e.baseUrl||process.env.DEXSCREENER_API_URL||zx).replace(/\/$/,"")}async function ei(e,t={}){if(!e)throw new Error("tokenAddress required");return T(`${Xx(t)}/latest/dex/tokens/${e}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3})}async function Ep({chainId:e,tokenA:t,tokenB:r,dexIds:n=[]}={},o={}){return(await Rn({chainId:e,tokenA:t,tokenB:r,dexIds:n},o))[0]??null}async function Rn({chainId:e,tokenA:t,tokenB:r,dexIds:n=[]}={},o={}){if(e==null||!t||!r)throw new Error("chainId, tokenA, and tokenB required");let i=nt(Vx[Number(e)]||e),s=new Set(Wx(n).filter(Boolean).map(nt)),a=[...new Set([t,r].map(p=>String(p)).filter(Boolean))],c=await Promise.allSettled(a.map(p=>ei(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=`${nt(f?.chainId)}:${nt(f?.dexId)}:${nt(f?.pairAddress)}`;u.has(m)||(u.add(m),l.push(f))}return l.filter(p=>nt(p?.chainId)===i).filter(p=>Gx(p,t,r)).filter(p=>!s.size||s.has(nt(p?.dexId))).map(p=>({pairAddress:p.pairAddress??null,dexId:p.dexId??null,chainId:p.chainId??null,liquidityUsd:Kx(p),pairCreatedAt:p.pairCreatedAt??null})).filter(p=>p.liquidityUsd!=null).sort((p,f)=>f.liquidityUsd-p.liquidityUsd)}async function Ap(e,{chainSlug:t="solana",stables:r=Qx}={},n={}){let o=await ei(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=Zo(e,s,{stables:r});return{chain:t,token:e,pools:a,topPool:a[0]||null}}var zx,Vx,nt,Wx,Qx,$n=v(()=>{G();$a();zx="https://api.dexscreener.com",Vx=Object.freeze({1:"ethereum",10:"optimism",56:"bsc",137:"polygon",8453:"base",42161:"arbitrum",43114:"avalanche",999:"hyperevm",4663:"robinhood"}),nt=e=>String(e??"").toLowerCase(),Wx=e=>Array.isArray(e)?e:e==null?[]:[e];Qx=["EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v","Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB"]});var $p={};H($p,{PANCAKE_FEE_TIERS:()=>ti,UNI_V3_CHAINS:()=>Le,UNI_V3_FEE_TIERS:()=>Op,UNI_V3_VENUES:()=>Np,uniV3Chains:()=>nS,uniV3EthUsdc:()=>Rp,uniV3Health:()=>rS,uniV3PrepareExactIn:()=>tS,uniV3QuoteExactIn:()=>hr,uniV3QuoteExactInPath:()=>eS});import{Interface as Ip,getAddress as Pn,isAddress as _p}from"ethers";function qa(e,t){let r=Number(e),n=Le[r];if(!n)throw new Error(`uniswap-v3: unsupported chainId ${e} (supported: ${Object.keys(Le).join(", ")})`);let o=Np[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 Pa(e,t){let r=Le[Number(t)];if(!e||e===Tp||e===Cp||/^eth$/i.test(String(e)))return Pn(r.weth);let n=String(e);if(/^weth$/i.test(n))return Pn(r.weth);if(/^usdc$/i.test(n))return Pn(r.usdc);if(!_p(n))throw new Error(`invalid token address: ${e}`);return Pn(n)}function Jx(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 Zx(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 hr(e={},t={}){let{chainId:r,quoter:n,router:o,feeTiers:i}=qa(e.chainId??8453,e.venue),s=Pa(e.tokenIn||"WETH",r),a=Pa(e.tokenOut||Le[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:Op,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 k=>{let g=ri.encodeFunctionData("quoteExactInputSingle",[{tokenIn:s,tokenOut:a,amountIn:c,fee:k,sqrtPriceLimitX96:0n}]);try{let b=await ee(r,"eth_call",[{to:n,data:g},"latest"],t);if(!b||b==="0x")return{fee:k,ok:!1,error:"empty result"};let S=ri.decodeFunctionResult("quoteExactInputSingle",b);return{fee:k,ok:!0,amountOut:S[0].toString(),sqrtPriceX96After:S[1].toString(),initializedTicksCrossed:Number(S[2]),gasEstimate:S[3].toString()}}catch(b){return{fee:k,ok:!1,error:String(b.message||b).slice(0,160)}}})),f=null;for(let k of p)k.ok&&(!f||BigInt(k.amountOut)>BigInt(f.amountOut))&&(f=k);if(!f){let k=p.map(g=>`${g.fee}:${g.error||"fail"}`).join("; ");throw new Error(`uniswap-v3 quote failed chain=${r}: ${k}`)}let m=e.liquidityUsd==null?await Rn({chainId:r,tokenA:s,tokenB:a,dexIds:Jx(e.venue)},t).catch(()=>[]):[],y={};await Promise.all(m.slice(0,8).map(async k=>{if(!(!k.pairAddress||!_p(k.pairAddress)))try{let g=await ee(r,"eth_call",[{to:k.pairAddress,data:Yx},"latest"],t),b=g&&g!=="0x"&&g.length<=66?Number.parseInt(g,16):NaN;if(!Number.isFinite(b)||b<=0||b>1e6)return;let S=y[b];(S==null||k.liquidityUsd>S.liquidityUsd)&&(y[b]=k)}catch{}}));let h=e.liquidityBandBps==null?50:Number(e.liquidityBandBps),w=null;if(e.fee==null&&h>0&&BigInt(f.amountOut)>0n){let k=BigInt(f.amountOut),b=p.filter(S=>S.ok&&Number((k-BigInt(S.amountOut))*10000n/k)<=h).filter(S=>y[S.fee]?.liquidityUsd!=null).sort((S,R)=>y[R.fee].liquidityUsd-y[S.fee].liquidityUsd)[0];b&&b.fee!==f.fee&&(w={priceBestFee:f.fee,chosenFee:b.fee,chosenPoolUsd:y[b.fee].liquidityUsd,bandBps:h},f=b)}let E=y[f.fee]??null,_=m[0]??null,x=E??_,O=e.liquidityUsd??E?.liquidityUsd??_?.liquidityUsd??null,I=e.liquidityUsd!=null?"caller":E?"pool":_?"pair":null;return he({venue:"uniswap-v3",chainId:r,chain:Le[r].name,quoter:n,tokenIn:s,tokenOut:a,amountIn:c.toString(),fee:f.fee,amountOut:f.amountOut,gasEstimate:f.gasEstimate,liquidityUsd:O,liquiditySource:x,liquidityAttribution:I,liquidityPick:w,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 eS(e={},t={}){let{chainId:r,quoter:n,router:o}=qa(e.chainId??8453),i=(e.tokens||[]).map(p=>Pa(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=Zx(i,s),u=ri.encodeFunctionData("quoteExactInput",[c,a]),l=await ee(r,"eth_call",[{to:n,data:u},"latest"],t),d=ri.decodeFunctionResult("quoteExactInput",l);return he({venue:"uniswap-v3",chainId:r,chain:Le[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 Rp(e={},t={}){let r=Number(e.chainId??8453),n=e.amountIn??"1000000000000000",o=await hr({chainId:r,tokenIn:Le[r].weth,tokenOut:Le[r].usdc,amountIn:n,fee:e.fee},t),i=Number(o.amountOut)/1e6;return{...o,amountOutUsdc:i,pair:"WETH/USDC"}}async function tS(e={},t={}){let r=Number(e.chainId??8453),n=qa(r,e.venue),o=Pn(e.recipient),i=String(e.tokenIn||"WETH"),s=!e.tokenIn||i===Tp||i===Cp||/^eth$/i.test(i),a=await hr(e,t),c=vp.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=vp.encodeFunctionData("multicall",[d,[c]]);return re({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:ze(a.autoSlippage,{chainId:r,venue:n.router,data:p})}},{provider:"uniswap-v3",kind:"univ3-swap-tx"})}async function rS(e={}){let t=Number(e.chainId??8453);try{let r=await Rp({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 nS(){return Object.entries(Le).map(([e,t])=>({chainId:Number(e),name:t.name,quoter:t.quoter,weth:t.weth,usdc:t.usdc}))}var Le,Op,Yx,ri,vp,Tp,Cp,ti,Np,ni=v(()=>{$t();$n();rt();qe();Le={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"}},Op=[100,500,3e3,1e4],Yx="0xddca3f43",ri=new Ip(["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)"]),vp=new Ip(["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)"]),Tp="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",Cp="0x0000000000000000000000000000000000000000",ti=[100,500,2500,1e4],Np={56:{pancakeswap:{name:"pancakeswap",quoter:"0xB048Bbc1Ee6b733FFfCFb9e9CeF7375518e25997",router:"0x13f4EA83D0bd40E75C8222255bc855a974568Dd4",feeTiers:ti}},8453:{pancakeswap:{name:"pancakeswap",quoter:"0xB048Bbc1Ee6b733FFfCFb9e9CeF7375518e25997",router:"0x13f4EA83D0bd40E75C8222255bc855a974568Dd4",feeTiers:ti}},42161:{pancakeswap:{name:"pancakeswap",quoter:"0xB048Bbc1Ee6b733FFfCFb9e9CeF7375518e25997",router:"0x13f4EA83D0bd40E75C8222255bc855a974568Dd4",feeTiers:ti}},999:{hyperswap:{name:"hyperswap",quoter:"0x03A918028f22D9E1473B7959C927AD7425A45C7C",router:"0x4E2960a8cd19B467b82d26D83fAcb0fAE26b094D"}}}});var Up={};H(Up,{executeRfqCandidates:()=>Lp,rankRfqQuotes:()=>Bp,requestRfqQuotes:()=>sS,sourceCandidates:()=>qp});function qn(e,t){return Array.isArray(e?.allowedSources)&&e.allowedSources.includes(t)}function Pp(e,t){return String(e?.[t]??"").trim()}function Ln(e,t){return Object.freeze({source:e,run:t})}function qp(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??Le,i=Number(e.fromChainId)===Number(e.toChainId),s=[];return qn(e,"lifi")&&s.push(Ln("lifi",async()=>{let c=await(n.lifiQuote??fr)({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 oS(t,c.transactionRequest.data):void 0,route:c},metadata:{tool:c?.tool??c?.toolDetails?.name??null}}})),i&&(qn(e,"paraswap")&&s.push(Ln("paraswap",async()=>{let c=await(n.paraswapPrice??Br)({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}}})),qn(e,"0x")&&(Pp(r,"ZEROX_API_KEY")||Pp(r,"0X_API_KEY")||n.zeroxQuote)&&s.push(Ln("0x",async()=>{let c=await(n.zeroxQuote??Ur)({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}}})),qn(e,"cow")&&s.push(Ln("cow",async()=>{let c=await(n.cowQuote??mr)({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}}})),qn(e,"uniswap-v3")&&o[Number(e.fromChainId)]&&s.push(Ln("uniswap-v3",async()=>{let c=await(n.uniV3QuoteExactIn??hr)({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 oS(e,t){return`0x${(await import("node:crypto")).createHash("sha256").update(String(t)).digest("hex")}`}async function iS(e,t){return Promise.race([Promise.resolve().then(e.run),new Promise((r,n)=>setTimeout(()=>n(new Error(`${e.source}: timeout`)),t))])}async function Lp(e,t,r={}){let n=Number(r.timeoutMs??12e3),o=await Promise.allSettled(t.map(a=>iS(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(fa(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 Bp(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 sS(e,t={}){let r=qp(e,t),{quotes:n,failed:o}=await Lp(e,r,t),i=Bp(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 Dp=v(()=>{On();Do();Ho();Xo();ni();ma()});function Mp(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}aS.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))jr.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 Fp(e){let{ok:t,errors:r,warnings:n}=Mp(e);if(!t)throw new Error(`invalid scanner for ${e?.key??"<unknown>"}:
7
- - ${r.join(`
8
- - `)}`);let o=e.capabilities||{},i=jr.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:jr.filter(a=>!i.includes(a))}},supports(a){return i.includes(a)}};for(let a of jr)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 oi(e){let t=Fp(e);return Hr.set(t.chainId,t),t}function La(e){return Hr.get(Number(e))||null}function jp(){return[...Hr.values()]}function cS(){Hr.clear()}function uS(){let e={};for(let t of Hr.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:Hr.size,capabilities:[...jr],chains:e}}var jr,M,B,aS,Hr,Qt=v(()=>{jr=Object.freeze(["blockNumber","nativeBalance","tokenBalance","resolveToken","resolvePools","scanBlocks","scoreRisk","quote","sellSimulation","prepareUnsignedTx"]),M=Object.freeze({LIVE:"LIVE",CACHED:"CACHED",STALE:"STALE",UNKNOWN:"UNKNOWN",UNAVAILABLE:"UNAVAILABLE"}),B=Object.freeze({PASS:"PASS",CAUTION:"CAUTION",FAIL:"FAIL",UNKNOWN:"UNKNOWN"}),aS=/^0x[0-9a-fA-F]{40}$/;Hr=new Map});function Hp(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:ot.FAILED,amountOut:null,error:u||"no amountOut returned"};let p=Bn(r);if(p==null||p<=0n)return{source:t,quality:ot.FAILED,amountOut:null,error:"non-positive amountOut"};let f=Number(s);return{source:t,quality:o==null?ot.NO_GAS:ot.FULL,amountOut:p.toString(),minOut:Bn(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 Vp(e,t,{divisor:r=1000n}={}){let n=Bn(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=Bn(i),c=Bn(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 Wp(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 Ba(e,{destPriceUsd:t=null,destDecimals:r=null,liquidityFirst:n=!0,liquidityBandBps:o=50,gasPriceWei:i=null,nativePriceUsd:s=null}={}){let a=e.filter(g=>g.quality!==ot.FAILED),c=e.filter(g=>g.quality===ot.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(g=>{let b=BigInt(g.amountOut),S=0n,R=!1,A=!1,$=BigInt(g.oracleFeeBps??0),q=$>0n?b*$/10000n:0n;if(u){let D=g.gasUsd,U=Number(g.meta?.gasUnits??g.estimatedGas);if(D==null&&p&&Number.isFinite(U)&&U>0){let K=U*l/1e18*d;Number.isFinite(K)&&K>=0&&(D=K,A=!0)}let Y=(D??0)+(g.feeUsd??0);if(Y>0){let K=Y/t*10**r;Number.isFinite(K)&&K>=0&&(S=BigInt(Math.floor(K)),R=!0)}else D===0&&(R=!0)}let j=S+q,P=b>j?b-j:0n;return{...g,grossOut:b.toString(),netOut:P.toString(),costInDest:S.toString(),oracleFeeInDest:q.toString(),costAccounted:R,gasEstimated:A}}),m=Number(o)>0?Number(o):0,y=f.reduce((g,b)=>BigInt(b.netOut)>g?BigInt(b.netOut):g,0n),h=g=>y>0n?Number((y-BigInt(g))*10000n/y):0,w=[],E=f.slice().sort((g,b)=>BigInt(b.netOut)>BigInt(g.netOut)?1:-1)[0]??null;f.sort((g,b)=>{let S=h(g.netOut)<=m?0:1,R=h(b.netOut)<=m?0:1;if(n&&m>0&&S!==R)return S-R;if(n&&m>0){let A=g.liquidityUsd??-1,$=b.liquidityUsd??-1;if(A!==$)return $-A}return BigInt(b.netOut)>BigInt(g.netOut)?1:-1}),n&&m>0&&E&&f[0]&&f[0].source!==E.source&&w.push(`liquidity-first: chose ${f[0].source} (liquidity $${f[0].liquidityUsd??"unknown"}) over best-price ${E.source} within ${m} bps`);let _=f.filter(g=>!g.costAccounted).map(g=>g.source);u?_.length&&w.push(`gas not reported by: ${_.join(", ")}. These are ranked on gross output and may be overstated relative to gas-measured routes.`):w.push("destination price/decimals unavailable: ranked on GROSS output. Gas is not included, so a cheap-looking route may cost more to execute.");let x=f[0];if(u&&x&&x.costAccounted===!1){let g=f.find(b=>b.costAccounted&&h(b.netOut)<=m);g&&w.push(`winner ${x.source} has UNMEASURED gas; gas-measured ${g.source} is within ${m} bps and may net more once ${x.source}'s real gas is paid \u2014 prefer it if unsure.`)}let O=f.filter(g=>g.gasEstimated).map(g=>g.source);O.length&&w.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 I=null,k=null;if(f.length>=2&&f[0].costAccounted&&f[1].costAccounted){let g=BigInt(f[0].netOut),b=BigInt(f[1].netOut);b>0n&&(I=Number((g-b)*10000n/b),k=`${f[0].source} vs ${f[1].source}`)}return{best:f[0]??null,routes:f,failed:c,improvementBps:I,spreadBasis:k,rankedOn:u?"net-of-cost":"gross",warnings:w}}async function ii(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"?Hp({source:s,error:String(o.reason?.message||o.reason)}):Hp({source:s,...o.value})})}var ot,zp,Bn,Ua=v(()=>{Qt();ot=Object.freeze({FULL:"FULL",NO_GAS:"NO_GAS",FAILED:"FAILED"}),zp={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"},Bn=e=>{try{return e==null||e===""?null:BigInt(String(e).split(".")[0])}catch{return null}}});function Gp(e={}){return Mo({provider:"oneinch",defaultUrl:lS,hosts:["api.1inch.dev"],url:e.baseUrl||process.env.ONEINCH_API_URL})}function dS(e={}){return Gp(e).baseUrl}function Kp(e={}){return e.apiKey||process.env.ONEINCH_API_KEY||process.env.ONE_INCH_API_KEY||""}function pS(e={}){let t=Kp(e);return Fo({accept:"application/json"},{Authorization:t?`Bearer ${t}`:""},Gp(e).trusted)}async function Xp(e={},t={}){if(!Kp(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 T(`${dS(t)}/${r}/quote?${s}`,{headers:pS(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3});return a?.dstAmount?he(a,{chainId:r,venue:"1inch-quote",amountOut:a.dstAmount,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps}):a}var lS,Qp=v(()=>{G();rt();Aa();qe();lS="https://api.1inch.dev/swap/v6.0"});var Zp={};H(Zp,{UNI_V4_CHAINS:()=>it,UNI_V4_FEE_TIERS:()=>Fa,computeV4PoolId:()=>ci,decodeV4HookPermissions:()=>Ha,uniV4Chains:()=>vS,uniV4Health:()=>IS,uniV4InspectHook:()=>SS,uniV4PrepareExactIn:()=>AS,uniV4QuoteExactIn:()=>ui,uniV4QuoteExactOut:()=>ES});import{AbiCoder as fS,Interface as Da,getAddress as gt,isAddress as Ma,keccak256 as mS}from"ethers";function Ha(e){let t=Fn(e),r=Number(BigInt(t)&yS),n=Object.fromEntries(Yp.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(Yp.filter(([,s])=>n[s]).map(([,s])=>s)),valid:i.length===0,violations:Object.freeze(i)})}function Mn(e){let t=Number(e),r=it[t];if(!r)throw new Error(`uniswap-v4: unsupported chainId ${e} (supported: ${Object.keys(it).join(", ")})`);return{chainId:t,...r}}function Fn(e){if(e==null||e==="")return Oe;let t=String(e);if(!Ma(t))throw new Error(`invalid Uniswap V4 hook address: ${e}`);return gt(t)}function zr(e,t){let r=it[Number(t)];if(Dn(e))return gt(r.weth);let n=String(e);if(/^weth$/i.test(n))return gt(r.weth);if(/^usdc$/i.test(n)||/^usdg$/i.test(n))return gt(r.usdc);if(!Ma(n))throw new Error(`invalid token address: ${e}`);return gt(n)}function Dn(e){let t=String(e||"").trim().toLowerCase();return!t||t===kS.toLowerCase()||t===Oe.toLowerCase()||t==="eth"}function ci({currency0:e,currency1:t,fee:r,tickSpacing:n,hooks:o=Oe}){let i=gt(e),s=gt(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=Fn(o);return mS(Un.encode(["address","address","uint24","int24","address"],[a,c,Number(r),Number(n),u]))}function za({tokenIn:e,tokenOut:t,fee:r,tickSpacing:n,hooks:o=Oe}){let i=gt(e),s=gt(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:Fn(o)},zeroForOne:u}}function xS({hook:e,codePresent:t,initialized:r,dynamicFee:n}){let o=Ha(e),i=o.enabled.some(u=>u.endsWith("ReturnsDelta")),s=o.flags.beforeSwap||o.flags.afterSwap||o.flags.beforeDonate||o.flags.afterDonate,a=[],c="none";return e!==Oe&&(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===Oe&&(c="critical",a.push("dynamic-fee pool has no hook authority")),e!==Oe&&o.enabled.length===0&&(c="critical",a.push("nonzero hook declares no permissions")),r||(c="critical",a.push("pool is not initialized")),e!==Oe&&!t&&(c="critical",a.push("hook address has no deployed bytecode")),Object.freeze({tier:c,audited:!1,requiresReview:e!==Oe,returnsDelta:i,reasons:Object.freeze(a)})}async function SS(e={},t={}){let r=Mn(e.chainId??8453);if(!r.stateView)throw new Error(`uniswap-v4: no StateView on chain ${r.chainId}`);let n=zr(e.tokenIn||"WETH",r.chainId),o=zr(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=Fn(e.hooks),{poolKey:c}=za({tokenIn:n,tokenOut:o,fee:i,tickSpacing:s,hooks:a}),u=ci(c),l=t.rpcCall||ee,d=si.encodeFunctionData("getSlot0",[u]),p=si.encodeFunctionData("getLiquidity",[u]),[f,m,y]=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===Oe?Promise.resolve(null):l(r.chainId,"eth_getCode",[a,"latest"],t)]),h=si.decodeFunctionResult("getSlot0",f),w=si.decodeFunctionResult("getLiquidity",m)[0],E=h[0],_=E>0n,x=a===Oe?null:typeof y=="string"&&y!=="0x"&&y.length>4,O=!!(i&ja),I=xS({hook:a,codePresent:x,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(h[1]),protocolFee:Number(h[2]),lpFee:Number(h[3]),liquidity:w.toString(),dynamicFee:O}),hook:Object.freeze({address:a,codePresent:x,codeBytes:x?(y.length-2)/2:0,permissions:Ha(a)}),risk:I})}async function ui(e={},t={}){let{chainId:r,quoter:n,poolManager:o,universalRouter:i}=Mn(e.chainId??8453),s=zr(e.tokenIn||"WETH",r),a=zr(e.tokenOut||it[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}]:[...Fa],l=e.hooks||Oe,p=await Promise.all(u.map(async g=>{let{poolKey:b,zeroForOne:S}=za({tokenIn:s,tokenOut:a,fee:g.fee,tickSpacing:g.tickSpacing,hooks:l}),R=ai.encodeFunctionData("quoteExactInputSingle",[{poolKey:b,zeroForOne:S,exactAmount:c,hookData:"0x"}]);try{let A=await(t.rpcCall||ee)(r,"eth_call",[{to:n,data:R},"latest"],t);if(!A||A==="0x")return{...g,ok:!1,error:"empty result"};let $=ai.decodeFunctionResult("quoteExactInputSingle",A);return{fee:g.fee,tickSpacing:g.tickSpacing,ok:!0,amountOut:$[0].toString(),gasEstimate:$[1].toString(),poolKey:b,zeroForOne:S,poolId:ci({...b})}}catch(A){return{...g,ok:!1,error:String(A.message||A).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.tickSpacing}:${b.error||"fail"}`).join("; ");throw new Error(`uniswap-v4 quote failed chain=${r}: ${g}`)}let m=e.liquidityUsd==null?await Rn({chainId:r,tokenA:s,tokenB:a,dexIds:Jp},t).catch(()=>[]):[],y=new Map;for(let g of m){let b=String(g.pairAddress||"").toLowerCase();b&&y.set(b,g)}let h=g=>y.get(String(g.poolId||"").toLowerCase())??null,w=e.liquidityBandBps==null?50:Number(e.liquidityBandBps),E=null;if(!(e.fee!=null&&e.tickSpacing!=null)&&w>0&&BigInt(f.amountOut)>0n){let g=BigInt(f.amountOut),S=p.filter(R=>R.ok&&Number((g-BigInt(R.amountOut))*10000n/g)<=w).filter(R=>h(R)?.liquidityUsd!=null).sort((R,A)=>h(A).liquidityUsd-h(R).liquidityUsd)[0];S&&S.poolId!==f.poolId&&(E={priceBestFee:f.fee,chosenFee:S.fee,chosenPoolUsd:h(S).liquidityUsd,bandBps:w},f=S)}let _=h(f),x=m[0]??null,O=_??x,I=e.liquidityUsd??_?.liquidityUsd??x?.liquidityUsd??null,k=e.liquidityUsd!=null?"caller":_?"pool":x?"pair":null;return he({venue:"uniswap-v4",chainId:r,chain:it[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:I,liquiditySource:O,liquidityAttribution:k,liquidityPick:E,triedTiers:p,best:!0,executionReady:!1,prepareReady:typeof e.recipient=="string"&&Ma(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&&!Dn(e.tokenIn)&&!Dn(e.tokenOut)&&(e.hookData==null||String(e.hookData).toLowerCase()==="0x")&&f.poolKey.hooks===Oe&&!(f.fee&ja)},{chainId:r,venue:i||n,amountOut:f.amountOut,liquidityUsd:I,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps})}async function ES(e={},t={}){let{chainId:r,quoter:n,poolManager:o,universalRouter:i}=Mn(e.chainId??8453),s=zr(e.tokenIn||"WETH",r),a=zr(e.tokenOut||it[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}]:[...Fa],l=e.hooks||Oe,p=await Promise.all(u.map(async y=>{let{poolKey:h,zeroForOne:w}=za({tokenIn:s,tokenOut:a,fee:y.fee,tickSpacing:y.tickSpacing,hooks:l}),E=ai.encodeFunctionData("quoteExactOutputSingle",[{poolKey:h,zeroForOne:w,exactAmount:c,hookData:"0x"}]);try{let _=await(t.rpcCall||ee)(r,"eth_call",[{to:n,data:E},"latest"],t);if(!_||_==="0x")return{...y,ok:!1,error:"empty result"};let x=ai.decodeFunctionResult("quoteExactOutputSingle",_);return{fee:y.fee,tickSpacing:y.tickSpacing,ok:!0,amountIn:x[0].toString(),gasEstimate:x[1].toString(),poolKey:h,zeroForOne:w,poolId:ci({...h})}}catch(_){return{...y,ok:!1,error:String(_.message||_).slice(0,160)}}})),f=null;for(let y of p)y.ok&&(!f||BigInt(y.amountIn)<BigInt(f.amountIn))&&(f=y);if(!f){let y=p.map(h=>`${h.fee}/${h.tickSpacing}:${h.error||"fail"}`).join("; ");throw new Error(`uniswap-v4 exact-output quote failed chain=${r}: ${y}`)}let m=e.liquidityUsd==null?await Ep({chainId:r,tokenA:s,tokenB:a,dexIds:Jp},t).catch(()=>null):null;return{venue:"uniswap-v4",chainId:r,chain:it[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 AS(e={},t={}){if(["operation","exactOutput","amountOut","multihop","path","positionManager","modifyLiquidities","commands","actions"].some(x=>Object.hasOwn(e,x)))throw new Error("uniswap-v4 unsupported operation shape is inspect/quote-only");let n=Number(e.chainId??8453),o=Mn(n);if(Fn(e.hooks)!==Oe)throw new Error("uniswap-v4 nonzero hooks are inspect/quote-only until a code-hash-specific adapter exists");if(Number(e.fee)&ja)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=gt(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(Dn(e.tokenIn)||Dn(e.tokenOut))throw new Error("uniswap-v4 prepare currently requires ERC-20 tokenIn and tokenOut; native routes are not inferred");let u=await ui(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=Un.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=Un.encode(["address","uint256"],[u.tokenIn,BigInt(u.amountIn)]),y=Un.encode(["address","uint256"],[u.tokenOut,l]),h=Un.encode(["bytes","bytes[]"],[bS,[f,m,y]]),E=Number(t.nowSeconds??Math.floor(Date.now()/1e3))+c,_=hS.encodeFunctionData("execute",[gS,[h],E]);return re({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:wS,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 vS(){return Object.entries(it).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 IS(e={}){let t=Mn(e.chainId??8453),r=await ee(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 Un,Oe,it,Fa,ai,hS,si,Yp,yS,ja,gS,bS,wS,kS,Jp,Va=v(()=>{$t();$n();rt();qe();Un=fS.defaultAbiCoder(),Oe="0x0000000000000000000000000000000000000000",it={1:{name:"ethereum",poolManager:"0x000000000004444c5dc75cB358380D2e3dE08A90",quoter:"0x52f0e24d1c21c8a0cb1e5a5dd6198556bd9e1203",stateView:"0x7ffe42c4a5deea5b0fec41c94c136cf115597227",universalRouter:"0x66a9893cc07d91d95644aedd05d03f95e1dba8af",weth:"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",usdc:"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48"},10:{name:"optimism",poolManager:"0x9a13f98cb987694c9f086b1f5eb990eea8264ec3",quoter:"0x1f3131a13296fb91c90870043742c3cdbff1a8d7",stateView:"0xc18a3169788f4f75a170290584eca6395c75ecdb",universalRouter:"0x851116d9223fabed8e56c0e6b8ad0c31d98b3507",weth:"0x4200000000000000000000000000000000000006",usdc:"0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85"},56:{name:"bsc",poolManager:"0x28e2ea090877bf75740558f6bfb36a5ffee9e9df",quoter:"0x9f75dd27d6664c475b90e105573e550ff69437b0",stateView:"0xd13dd3d6e93f276fafc9db9e6bb47c1180aee0c4",universalRouter:"0x1906c1d672b88cd1b9ac7593301ca990f94eae07",weth:"0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c",usdc:"0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d"},137:{name:"polygon",poolManager:"0x67366782805870060151383f4bbff9dab53e5cd6",quoter:"0xb3d5c3dfc3a7aebff71895a7191796bffc2c81b9",stateView:"0x5ea1bd7974c8a611cbab0bdcafcb1d9cc9b3ba5a",universalRouter:"0x1095692a6237d83c6a72f3f5efedb9a670c49223",weth:"0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270",usdc:"0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359"},8453:{name:"base",poolManager:"0x498581fF718922c3f8e6A244956aF099B2652b2b",quoter:"0x0d5e0f971ed27fbff6c2837bf31316121532048d",stateView:"0xa3c0c9b65bad0b08107aa264b0f3db444b867a71",universalRouter:"0x6ff5693b99212da76ad316178a184ab56d299b43",weth:"0x4200000000000000000000000000000000000006",usdc:"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"},42161:{name:"arbitrum",poolManager:"0x360e68faccca8ca495c1b759fd9eee466db9fb32",quoter:"0x3972c00f7ed4885e145823eb7c655375d275a1c5",stateView:"0x76fd297e2d437cd7f76d50f01afe6160f86e9990",universalRouter:"0xa51afafe0263b40edaef0df8781ea9aa03e381a3",weth:"0x82aF49447D8a07e3bd95BD0d56f35241523fBab1",usdc:"0xaf88d065e77c8cC2239327C5EDb3A432268e5831"},43114:{name:"avalanche",poolManager:"0x06380c0e0912312b5150364b9dc4542ba0dbbc85",quoter:"0xbe40675bb704506a3c2ccfb762dcfd1e979845c2",stateView:"0xc3c9e198c735a4b97e3e683f391ccbdd60b69286",universalRouter:"0x94b75331ae8d42c1b61065089b7d48fe14aa73b7",weth:"0xB31f66AA3C1e785363F0875A1B74E27b85FD66c7",usdc:"0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E"},4663:{name:"robinhood",poolManager:"0x8366a39cc670b4001a1121b8f6a443a643e40951",quoter:"0x8dc178efb8111bb0973dd9d722ebeff267c98f94",stateView:"0xf3334192d15450cdd385c8b70e03f9a6bd9e673b",universalRouter:"0x8876789976dEcBfCbBbe364623C63652db8C0904",weth:"0x0bd7d308f8e1639fab988df18a8011f41eacad73",usdc:"0x5fc5360D0400a0Fd4f2af552ADD042D716F1d168"}},Fa=[{fee:100,tickSpacing:1},{fee:500,tickSpacing:10},{fee:3e3,tickSpacing:60},{fee:1e4,tickSpacing:200},{fee:25e3,tickSpacing:8}],ai=new Da(["function quoteExactInputSingle(((address currency0,address currency1,uint24 fee,int24 tickSpacing,address hooks) poolKey,bool zeroForOne,uint128 exactAmount,bytes hookData) params) returns (uint256 amountOut, uint256 gasEstimate)","function quoteExactOutputSingle(((address currency0,address currency1,uint24 fee,int24 tickSpacing,address hooks) poolKey,bool zeroForOne,uint128 exactAmount,bytes hookData) params) returns (uint256 amountIn, uint256 gasEstimate)"]),hS=new Da(["function execute(bytes commands,bytes[] inputs,uint256 deadline) payable"]),si=new Da(["function getSlot0(bytes32 poolId) view returns (uint160 sqrtPriceX96,int24 tick,uint24 protocolFee,uint24 lpFee)","function getLiquidity(bytes32 poolId) view returns (uint128 liquidity)"]),Yp=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"]]),yS=(1n<<14n)-1n,ja=8388608;gS="0x10",bS="0x060c0f",wS="0x000000000022D473030F116dDEE9F6B43aC78BA3",kS="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE";Jp=["uniswap-v4","uniswapv4"]});function TS(e={}){return(e.baseUrl||process.env.DEFILLAMA_COINS_URL||_S).replace(/\/$/,"")}function CS(e={}){return(e.baseUrl||process.env.DEFILLAMA_API_URL||OS).replace(/\/$/,"")}async function li(e,t={}){if(!Array.isArray(e)||!e.length)throw new Error("llamaPrices requires coins[]");let r=e.map(encodeURIComponent).join(",");return T(`${TS(t)}/prices/current/${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function ef(e={}){return T(`${CS(e)}/protocols`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??2e4})}var _S,OS,Wa=v(()=>{G();_S="https://coins.llama.fi",OS="https://api.llama.fi"});var di={};H(di,{ACROSS_API:()=>tf,HOP_API:()=>rf,RELAY_API:()=>nf,acrossHealth:()=>RS,acrossSuggestedFees:()=>of,hopHealth:()=>$S,hopQuote:()=>sf,relayHealth:()=>PS,relayPrepare:()=>qS,relayQuote:()=>Ga});async function RS(e={}){try{return{ok:!0,estimatedFillTimeSec:(await of({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 of(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||tf).replace(/\/$/,"");return T(`${c}/suggested-fees?${a}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function $S(e={}){try{let t=await sf({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 sf(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=Nt({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||rf).replace(/\/$/,""),l=await T(`${u}/quote?${c}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),d=l?.estimatedRecieved||l?.estimatedReceived;return d?he(l,{chainId:Number(e.originChainId||e.chainId||NS[o]||0),venue:l?.tx?.to||"hop",amountOut:d,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,crossChain:o!==i,requestedCapBps:e.maxSlippageBps??e.slippageBps??s}):{...l,autoSlippagePolicy:a}}async function PS(e={}){try{let t=await Ga({user:Xt,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 Ga(e={},t={}){let{user:r=Xt,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=Nt({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||nf).replace(/\/$/,""),d=await T(`${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}:he(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 qS(e={},t={}){let r=await Ga(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:ze(r.autoSlippage,{chainId:n,venue:a.to,data:a.data})}));return re({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 tf,rf,nf,NS,pi=v(()=>{G();rt();Lo();qe();tf="https://across.to/api",rf="https://api.hop.exchange/v1",nf="https://api.relay.link",NS={ethereum:1,optimism:10,bsc:56,polygon:137,arbitrum:42161,avalanche:43114,base:8453}});function fi(e){if(!Array.isArray(e))return null;let t=0,r=!1;for(let n of e){let o=bt(n?.amountUSD);o!=null&&(t+=o,r=!0)}return r?t:null}async function cf(e,t={}){let r=zp[Number(e)];if(!r)return null;try{let n=await li([r],t);return bt(n?.coins?.[r]?.price)}catch{return null}}async function LS(e={}){try{let t=await ef({...e,baseUrl:e.defillamaApiBaseUrl,timeoutMs:e.defillamaTimeoutMs??Math.min(Number(e.timeoutMs??5e3),5e3)});return Array.isArray(t)?t:[]}catch{return[]}}function BS(e,t={}){let r=Yt(t.tool||t.provider||t.bridge||t.protocol),n=[];return e==="lifi"&&r&&r!=="lifi"&&n.push(...af[r]||[r]),n.push(...af[Yt(e)]||[e]),n}function US(e,t,r={}){let n=Array.isArray(e)?e:[],o=BS(t,r).map(Yt).filter(Boolean);for(let i of o){let s=n.find(c=>Yt(c?.slug)===i||Yt(c?.name)===i),a=bt(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=Yt(c?.category);return!u.includes("bridge")&&!u.includes("crosschain")?!1:Yt(c?.slug).includes(i)||Yt(c?.name).includes(i)}),a=bt(s?.tvl);if(a!=null)return{liquidityUsd:a,protocol:s?.name??s?.slug??i}}return null}function Ka({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 fr({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:fi(f?.gasCosts),feeUsd:fi(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 Br({chainId:e,srcToken:t,destToken:r,amount:n,srcDecimals:s,destDecimals:p},l),m=f?.priceRoute;return{amountOut:m?.destAmount,gasUsd:bt(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 Ur({chainId:e,sellToken:t,buyToken:r,sellAmount:n,taker:o},l),f=null,m=p?.totalNetworkFee,y=await Promise.resolve(c);return m!=null&&y&&(f=Number(m)/1e18*y),{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 Xp({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 mr({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"}}}}),it[Number(e)]&&d.push({source:"uniswap-v4",run:async()=>{let p=await ui({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}}}}),Le[Number(e)]&&d.push({source:"uniswap-v3",run:async()=>{let p=await hr({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 uf({fromChainId:e,toChainId:t,tokenIn:r,tokenOut:n,amountIn:o,taker:i,opts:s={}}){let a=[],c=null,u=async(l,d={})=>(c||=LS(s),US(await c,l,d));return a.push({source:"lifi",run:async()=>{let l=await fr({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:bt(d?.executionDuration)},f=await u("lifi",p);return{amountOut:d?.toAmount,minOut:d?.toAmountMin,gasUsd:fi(d?.gasCosts),feeUsd:fi(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(()=>(pi(),di)),p=(await l({user:i,originChainId:e,destinationChainId:t,originCurrency:r,destinationCurrency:n,amount:String(o)},s))?.details,f={durationSeconds:bt(p?.timeEstimate),rate:p?.rate},m=await u("relay",f);return{amountOut:p?.currencyOut?.amount,minOut:p?.currencyOut?.minimumAmount,gasUsd:bt(p?.totalImpact?.usd)!=null?Math.abs(bt(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(()=>(pi(),di)),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 y=BigInt(String(o))-BigInt(String(p));y>0n&&(f=y.toString())}catch{}let m=await u("across");return{amountOut:f,gasUsd:null,liquidityUsd:m?.liquidityUsd??null,meta:{derivedFromFees:!0,durationSeconds:bt(d?.estimatedFillTimeSec),limits:d?.limits?{min:d.limits.minDeposit,max:d.limits.maxDeposit}:void 0,liquidityProtocol:m?.protocol}}}}),a}var bt,Yt,af,lf=v(()=>{On();Do();Ho();Qp();Xo();ni();Va();Wa();Ua();bt=e=>{let t=Number(e);return Number.isFinite(t)?t:null};Yt=e=>String(e??"").toLowerCase().replace(/[^a-z0-9]/g,""),af=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 pf={};H(pf,{QUALITY:()=>ot,bestBridgeRoute:()=>jn,bestSwapRoute:()=>Vr,formatComparisonNote:()=>mi});async function df(e,t,r){let n=DS[Number(e)];if(!n)return{priceUsd:null,decimals:null};let o=`${n}:${t}`;try{let s=(await li([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 Vr(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=cf(r,t),a=df(r,o,t),c=gp(r,t).catch(()=>null),u=Ka({...e,nativePriceUsd:s,decimalsOut:e.decimalsOut,destDecimalsPromise:a,opts:t}),[l,d,p]=await Promise.all([ii(u,{timeoutMs:t.timeoutMs??12e3}),a,c]);s.catch(()=>{});let f=await s.then(h=>h,()=>null),m=Ba(l,{destPriceUsd:d.priceUsd,destDecimals:e.decimalsOut??d.decimals,liquidityBandBps:t.liquidityBandBps??50,gasPriceWei:p,nativePriceUsd:f}),y=t.maxImpactPct===void 0?25:t.maxImpactPct;if(y!=null&&m.best){let h=m.best.source,E=await Vp(async _=>{let x=Ka({...e,amountIn:_.toString(),nativePriceUsd:s,decimalsOut:e.decimalsOut,destDecimalsPromise:a,opts:t}).filter(I=>I.source===h);return x.length?(await ii(x,{timeoutMs:t.timeoutMs??12e3}))?.[0]?.amountOut??null:null},i);if(E){let _=Wp(m,{[h]:E},{maxImpactPct:y});return{kind:"swap",chainId:r,tokenIn:n,tokenOut:o,amountIn:String(i),..._,sourcesTried:u.length,sourcesAnswered:l.filter(x=>x.quality!==ot.FAILED).length,note:mi(_,u.length),priceImpact:{[h]:Number(E.impactPct.toFixed(2))}}}}return{kind:"swap",chainId:r,tokenIn:n,tokenOut:o,amountIn:String(i),...m,sourcesTried:u.length,sourcesAnswered:l.filter(h=>h.quality!==ot.FAILED).length,note:mi(m,u.length)}}async function jn(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=df(n,i,t),c=uf({...e,opts:t}),[u,l]=await Promise.all([ii(c,{timeoutMs:t.timeoutMs??15e3}),a]),d=Ba(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!==ot.FAILED).length,note:mi(d,c.length)}}function MS(e){let t=e?.meta?.oracleFee;return t?.applies?` \xB7 ${Ld(t)}`:""}function mi(e,t){if(!e.best)return"no source returned a usable route";let r=e.routes.length,n=MS(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 DS,Wr=v(()=>{Ua();lf();Uo();Wa();$t();DS={1:"ethereum",10:"optimism",56:"bsc",137:"polygon",8453:"base",42161:"arbitrum",43114:"avax"}});var ff={};H(ff,{ARTIFACT:()=>Pt,prepareBestRoute:()=>WS,supportedPreparers:()=>jS});function jS(){return Object.keys(hi)}async function WS(e,t={}){if(VS.some(h=>Object.hasOwn(e,h)))throw new Error("unsupported operation shape is inspect/quote-only");if(e.hookData!=null&&String(e.hookData).toLowerCase()!=="0x")throw new Error("opaque hookData is inspect/quote-only");let{taker: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(!zS.test(r))throw new Error(`taker must be a valid 20-byte address, got "${r}"`);if(HS.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 Vr(e,t);if(!n.best){let h=n.impactRejected??[];return{ok:!1,reason:h.length?h[0].reason:"no source returned a usable route",priceImpactBlocked:h.length>0,impactRejected:h,comparison:n}}let o=e.source||n.best.source,i=n.routes.find(h=>h.source===o);if(!i)return{ok:!1,reason:`source "${o}" did not return a usable route`,comparison:n};let s=hi[o];if(!s){let h=n.routes.find(w=>hi[w.source]&&w.source!==o);return{ok:!1,reason:`${o} won the comparison but has no prepare path in this build. `+(h?`Next preparable route is ${h.source}; pass source:"${h.source}" to use it.`:"No route in this comparison can be prepared."),comparison:n,winner:o}}let a;try{a=await s(e,t)}catch(h){let w=typeof h?.body=="string"?h.body:h?.body?JSON.stringify(h.body):"",E=[String(h?.message||h),w].filter(Boolean).join(" :: "),_=/allowance/i.test(E),x=!_&&/not enough|insufficient|balance/i.test(E),O,I;_?(I="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}`):x?(I="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.`):(I="provider-error",O=`${o} prepare failed: ${E}`);let k=n.routes.find(g=>hi[g.source]&&g.source!==o);return{ok:!1,reason:O,failureKind:I,...k?{alternative:k.source}:{},comparison:n}}let c=e.driftToleranceBps??FS,u=null,l=null;if(a.amountOut!=null&&i.grossOut!=null)try{let h=BigInt(i.grossOut),w=BigInt(a.amountOut);h>0n&&(u=Number((w-h)*10000n/h),u<-c&&(l=`route moved ${(u/100).toFixed(2)}% against you between the comparison and this prepare (tolerance ${(c/100).toFixed(2)}%). The ranking may no longer hold -- re-run the comparison before signing.`))}catch{}let d=n.routes.filter(h=>h.source!==o).map(h=>({source:h.source,netOut:h.netOut,gasUsd:h.gasUsd})),f=n.routes.map(h=>({source:h.source,liquidityUsd:h.liquidityUsd??null})).reduce((h,w)=>Math.max(h,w.liquidityUsd??0),0)||null,m=i.liquidityUsd??null,y=m!=null&&f>0?Math.round(m/f*100):null;return re({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:y},priceImpact:n.priceImpact??null,impactUnmeasured:n.impactUnmeasured??[],...a,unsigned:!0,signedBy:"user-wallet",destination:a.artifactKind===Pt.TRANSACTION?a.transaction?.to??null:a.settlement??null,driftBps:u,warnings:[...l?[l]:[],...n.warnings||[],...a.artifactKind===Pt.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 Pt,FS,hi,HS,zS,VS,mf=v(()=>{Wr();qe();Pt=Object.freeze({TRANSACTION:"unsigned-transaction",TYPED_DATA_ORDER:"typed-data-order"}),FS=100,hi={"uniswap-v3":async({chainId:e,tokenIn:t,tokenOut:r,amountIn:n,taker:o},i)=>{let{uniV3PrepareExactIn:s}=await Promise.resolve().then(()=>(ni(),$p)),a=await s({chainId:e,tokenIn:t,tokenOut:r,amountIn:n,recipient:o},i);return{artifactKind:Pt.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(()=>(Va(),Zp)),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:Pt.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(()=>(On(),Sa)),a=await s({fromChain:e,toChain:e,fromToken:t,toToken:r,fromAmount:n,fromAddress:o},i);return{artifactKind:Pt.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(()=>(Do(),Hd)),u=await c({chainId:e,srcToken:t,destToken:r,amount:n,srcDecimals:i,destDecimals:s,userAddress:o,side:"SELL"},a);return{artifactKind:Pt.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(()=>(Ho(),Yd)),a=await s({chainId:e,sellToken:t,buyToken:r,sellAmount:n,taker:o},i);return{artifactKind:Pt.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(()=>(Xo(),fp)),a=await s({chainId:e,sellToken:t,buyToken:r,sellAmountBeforeFee:String(n),from:o},i);return{artifactKind:Pt.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"}}};HS=new Set(["0x0000000000000000000000000000000000000000","0x000000000000000000000000000000000000dead","0x0000000000000000000000000000000000000001","0x00000000000000000000000000000000000a1ce5"].map(e=>e.toLowerCase())),zS=/^0x[0-9a-fA-F]{40}$/,VS=Object.freeze(["operation","exactOutput","amountOut","multihop","path","positionManager","modifyLiquidities","commands","actions"])});var hf={};H(hf,{prepareBestBridgeRoute:()=>YS,supportedBridgePreparers:()=>QS});function QS(){return Object.keys(yi)}async function YS(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(!GS.test(r))throw new Error(`taker must be a valid 20-byte address, got "${r}"`);if(KS.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 jn(e,t);if(!i.best)return{ok:!1,reason:"no source returned a usable bridge route",comparison:i};let s=e.source||i.best.source,a=i.routes.find(h=>h.source===s);if(!a)return{ok:!1,reason:`source "${s}" returned no usable route`,comparison:i};let c=yi[s];if(!c){let h=i.routes.find(w=>yi[w.source]&&w.source!==s);return{ok:!1,reason:`${s} won the comparison but has no bridge prepare path in this build. `+(h?`Next preparable route is ${h.source}; pass source:"${h.source}".`:"No route in this comparison can be prepared."),failureKind:"no-prepare-path",...h?{alternative:h.source}:{},winner:s,comparison:i}}let u;try{u=await c(e,t)}catch(h){let w=typeof h?.body=="string"?h.body:h?.body?JSON.stringify(h.body):"",E=[String(h?.message||h),w].filter(Boolean).join(" :: "),_=/allowance/i.test(E),x=!_&&/not enough|insufficient|balance/i.test(E),O=i.routes.find(I=>yi[I.source]&&I.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}`:x?`${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":x?"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(h=>h.chainId!=null&&Number(h.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??XS,f=null,m=null;if(u.amountOut!=null&&a.grossOut!=null)try{let h=BigInt(a.grossOut),w=BigInt(u.amountOut);h>0n&&(f=Number((w-h)*10000n/h),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 y=[...m?[m]:[],...i.warnings||[],`Bridging is NOT atomic: the origin transaction succeeding does not mean funds arrived on chain ${o}. Expect ~${u.durationSeconds!=null?`${u.durationSeconds}s`:"minutes"} before the destination credits, and do not re-send if it is pending.`];return l.length>1&&y.push(`This route needs ${l.length} transactions signed IN ORDER. Signing only the first leaves funds approved but not bridged.`),re({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:y,runnersUp:i.routes.filter(h=>h.source!==s).map(h=>({source:h.source,netOut:h.netOut,gasUsd:h.gasUsd})),comparison:{rankedOn:i.rankedOn,sourcesAnswered:i.sourcesAnswered,sourcesTried:i.sourcesTried,improvementBps:i.improvementBps},note:`UNSIGNED. ${l.length} transaction(s) on chain ${n}, crediting chain ${o}. Verify every destination address before signing.`},{provider:"router",kind:"best-bridge"})}var GS,KS,XS,yi,yf=v(()=>{Wr();qe();GS=/^0x[0-9a-fA-F]{40}$/,KS=new Set(["0x0000000000000000000000000000000000000000","0x000000000000000000000000000000000000dead","0x0000000000000000000000000000000000000001","0x00000000000000000000000000000000000a1ce5"].map(e=>e.toLowerCase())),XS=100,yi={relay:async({fromChainId:e,toChainId:t,tokenIn:r,tokenOut:n,amountIn:o,taker:i},s)=>{let{relayPrepare:a}=await Promise.resolve().then(()=>(pi(),di)),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(()=>(On(),Sa)),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 wf={};H(wf,{buildTwapSchedule:()=>bf,normalizeTwapParams:()=>gf,prepareTwapChunk:()=>nE,simulateTwap:()=>oE});function gf(e={}){let t=Math.max(JS,Math.min(ZS,Number(e.splits)||tE)),r=Math.max(.1,Number(e.windowHours)||rE),n=Math.max(eE,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 bf(e){let t=gf(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 nE(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 Vr({chainId:r,tokenIn:n,tokenOut:o,amountIn:i,taker:s}),u=re(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 oE(e,{quoteFn:t=Vr,...r}={}){let n=bf(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 JS,ZS,eE,tE,rE,kf=v(()=>{Wr();qe();JS=2,ZS=100,eE=60,tE=10,rE=6});async function Ef({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(!xf.has(Number(e))||!xf.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 T(`${Sf}/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 Af(){try{return{ok:!0,chainCount:(await T(`${Sf}/supported-chains-info`))?.chains?.length??0}}catch(e){return{ok:!1,error:String(e.message||e).slice(0,160)}}}var Sf,xf,vf=v(()=>{G();qe();Sf="https://dln.debridge.finance/v1.0",xf=new Set([1,10,56,137,8453,42161,43114,59144,534352,7777777,324,5e3,1101,81457])});async function _f({active:e=!0}={},t={}){let r=Date.now();if(Gr.size&&r-If<iE)return[...Gr.values()];try{let n=await T(`${Xa}/exchange/currencies?active=${e?"true":"false"}`,t);Gr.clear();for(let o of n??[])Gr.set(String(o.ticker).toLowerCase(),o);return If=r,n??[]}catch(n){return Gr.size?[...Gr.values()]:{error:String(n.message||n).slice(0,200)}}}async function sE(e,t,r={}){if(!e||!t)return{error:"changenow minAmount requires fromTicker and toTicker"};try{return{minAmount:(await T(`${Xa}/exchange/min-amount/${encodeURIComponent(e)}_${encodeURIComponent(t)}`,r))?.minAmount??"0"}}catch(n){return{error:String(n.message||n).slice(0,200)}}}async function aE(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 T(`${Xa}/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 Of({fromTicker:e,toTicker:t,fromAmount:r,flow:n}={},o={}){if(!e||!t)return{error:"changenow quote requires fromTicker and toTicker"};let i=await sE(e,t,o);if(i.error)return i;let s=r??i.minAmount,a=await aE(e,t,s,{flow:n},o);if(a.error)return a;let c=await _f({},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 Tf(){try{let e=await _f();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 Xa,Gr,If,iE,Cf=v(()=>{G();Xa="https://api.changenow.io/v2",Gr=new Map,If=0,iE=6e5});async function Nf({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 T(`${cE}/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 cE,Rf=v(()=>{G();cE="https://api.squidrouter.com/v1"});async function $f({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 T(`${uE}/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 uE,Pf=v(()=>{G();uE="https://api.stargate.finance"});async function qf({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 T(`${lE}/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 lE,Lf=v(()=>{G();lE="https://midgard.ninerealms.com/v2"});async function Bf({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 T(`${dE}/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 dE,Uf=v(()=>{G();dE="https://api.socket.tech/v2"});async function Df({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 T(`${pE}/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 pE,Mf=v(()=>{G();pE="https://api.connext.network"});async function Ff({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 T(`${fE}/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 fE,jf=v(()=>{G();fE="https://api.portalbridge.com/v1"});function mE(e,t){return`0x${Ya.getAmountsOut}`+Je(e)+Je(64)+Je(t.length)+t.map(Hn).join("")}function hE(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 Qa(e,t="router"){return(e?.venues||[]).find(n=>n.kind===t)?.address??null}function yE(e,t){let r=Number(t);if(!Number.isFinite(r)||r<0)throw new Error("slippageBps must be a non-negative number");if(r>Ja)throw new Error(`slippageBps ${r} exceeds the ${Ja} 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 Hf(e){let{chainId:t,wrappedNative:r}=e;async function n(o,i,s,a){let c=await ee(t,"eth_call",[{to:o,data:mE(i,s)},"latest"],a);return hE(c?.result??c)}return{async quote({tokenIn:o,tokenOut:i,amountIn:s,path:a},c={}){let u=Qa(c.scanner);if(!u)return{chainId:t,evidence:M.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:M.LIVE,note:"exact-input quote at current reserves; not a guaranteed fill"}:{chainId:t,router:u,path:l,evidence:M.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=Qa(a.scanner),u=s||r;if(u&&String(o).toLowerCase()===String(u).toLowerCase())return{chainId:t,token:o,verdict:B.UNKNOWN,evidence:M.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:B.UNKNOWN,evidence:M.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:B.FAIL,evidence:M.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:B.FAIL,evidence:M.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:B.FAIL,evidence:M.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)),y=B.PASS,h="round trip completes with expected fee/impact loss";return m<5e3?(y=B.FAIL,h=`round trip returns only ${(m/100).toFixed(2)}% -- punitive tax or no real liquidity`):m<9e3&&(y=B.CAUTION,h=`round trip returns ${(m/100).toFixed(2)}% -- transfer tax or thin liquidity at this size`),{chainId:t,token:o,base:u,router:c,verdict:y,reason:h,amountIn:String(i),bought:d.toString(),returned:f.toString(),retentionBps:m,evidence:M.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=Qa(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],y=await this.quote({tokenIn:o,tokenOut:i,amountIn:s,path:m},d);if(y.evidence!==M.LIVE)throw new Error(`cannot prepare without a live quote (${y.evidence}: ${y.reason??"no reason given"})`);let h=yE(y.amountOut,c);if(h<=0n)throw new Error("computed minOut is zero -- refusing to prepare");let w=BigInt(Math.floor(Date.now()/1e3)+Number(u)),E=r&&m[0].toLowerCase()===r.toLowerCase()&&d.useNative,_=E?`0x${Ya.swapExactETHForTokens}`+Je(h)+Je(128)+Hn(a)+Je(w)+Je(m.length)+m.map(Hn).join(""):`0x${Ya.swapExactTokensForTokens}`+Je(s)+Je(h)+Je(160)+Hn(a)+Je(w)+Je(m.length)+m.map(Hn).join("");return{unsigned:!0,signedBy:"user-wallet",chainId:t,tx:{to:f,data:_,value:E?`0x${BigInt(s).toString(16)}`:"0x0"},guard:{quotedOut:y.amountOut,minOut:h.toString(),slippageBps:c,maxSlippageBps:Ja,deadline:w.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 Ya,Je,Hn,Ja,zf=v(()=>{$t();Qt();Ya={getAmountsOut:"d06ca61f",swapExactTokensForTokens:"38ed1739",swapExactETHForTokens:"7ff36ab5"},Je=e=>BigInt(e).toString(16).padStart(64,"0"),Hn=e=>e.slice(2).toLowerCase().padStart(64,"0");Ja=100});function bE(e,t){let r=Number(t);if(!Number.isFinite(r)||r<0)throw new Error("slippageBps must be a non-negative number");if(r>ec)throw new Error(`slippageBps ${r} exceeds the ${ec} 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 Za(e,t){return(e?.venues||[]).find(r=>r.kind===t)?.address??null}function Gf(e){let{chainId:t,wrappedNative:r}=e;async function n({quoter:i,tokenIn:s,tokenOut:a,amountIn:c,fee:u},l){let d=`0x${Vf.quoteExactInputSingle}`+zn(s)+zn(a)+yr(c)+yr(u)+yr(0),p=await ee(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(gE.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=Za(c.scanner,"quoter");if(!u)return{chainId:t,evidence:M.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(!Wf.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:M.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:M.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=Za(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:B.UNKNOWN,evidence:M.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:B.UNKNOWN,evidence:M.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:B.UNKNOWN,evidence:M.UNAVAILABLE,reason:u?"no wrappedNative configured, so there is no base asset to round-trip against":"no verified quoter configured for this chain"};let y=await o({quoter:u,tokenIn:m,tokenOut:i,amountIn:s},c);if(!y.best){let O=l.find(I=>I&&I!==String(m).toLowerCase()&&I!==String(i).toLowerCase());if(O){let I=await o({quoter:u,tokenIn:O,tokenOut:i,amountIn:s},c);if(I.best){let k=await o({quoter:u,tokenIn:i,tokenOut:O,amountIn:I.best.amountOut},c);if(k.best){let g=k.best.amountOut,b=Number(g*10000n/BigInt(s)),S=B.PASS,R="round trip vs dollar book completes with expected fee/impact loss";return b<5e3?(S=B.FAIL,R=`round trip vs dollar book returns only ${(b/100).toFixed(2)}% -- punitive tax or no real liquidity`):b<9e3&&(S=B.CAUTION,R=`round trip vs dollar book returns ${(b/100).toFixed(2)}% -- transfer tax or thin liquidity at this size`),{chainId:t,venue:"uniswap-v3",token:i,base:O,quoteAsset:O,verdict:S,reason:R,amountIn:String(s),bought:I.best.amountOut.toString(),returned:g.toString(),retentionBps:b,buyFee:I.best.fee,sellFee:k.best.fee,evidence:M.LIVE,note:"Quoted against the dollar book, not wrapped native. A missing WETH pool is not a honeypot."}}}}return{chainId:t,token:i,verdict:B.FAIL,evidence:M.LIVE,leg:"buy",reason:"no V3 pool priced the buy leg on any fee tier against wrapped native or the dollar book"}}let h=await o({quoter:u,tokenIn:i,tokenOut:m,amountIn:y.best.amountOut},c);if(!h.best){let O=l.find(I=>I&&I!==String(m).toLowerCase()&&I!==String(i).toLowerCase());if(O){let I=await o({quoter:u,tokenIn:O,tokenOut:i,amountIn:s},c),k=I.best?await o({quoter:u,tokenIn:i,tokenOut:O,amountIn:I.best.amountOut},c):{best:null};if(I.best&&k.best){let g=k.best.amountOut,b=Number(g*10000n/BigInt(s)),S=B.PASS,R="round trip vs dollar book completes; missing WETH sell pool is not a honeypot";return b<5e3?(S=B.FAIL,R=`dollar-book round trip returns only ${(b/100).toFixed(2)}%`):b<9e3&&(S=B.CAUTION,R=`dollar-book round trip returns ${(b/100).toFixed(2)}%`),{chainId:t,venue:"uniswap-v3",token:i,base:O,quoteAsset:O,verdict:S,reason:R,amountIn:String(s),bought:I.best.amountOut.toString(),returned:g.toString(),retentionBps:b,buyFee:I.best.fee,sellFee:k.best.fee,evidence:M.LIVE,note:"Sell vs wrapped native failed; dollar book succeeded. Not labelled honeypot."}}}return{chainId:t,token:i,verdict:B.FAIL,evidence:M.LIVE,leg:"sell",bought:y.best.amountOut.toString(),reason:"SELL LEG FAILED against wrapped native and the dollar book. This is the honeypot signature: do not trade."}}let w=h.best.amountOut,E=Number(w*10000n/BigInt(s)),_=B.PASS,x="round trip completes with expected fee/impact loss";return E<5e3?(_=B.FAIL,x=`round trip returns only ${(E/100).toFixed(2)}% -- punitive tax or no real liquidity`):E<9e3&&(_=B.CAUTION,x=`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:x,amountIn:String(s),bought:y.best.amountOut.toString(),returned:w.toString(),retentionBps:E,buyFee:y.best.fee,sellFee:h.best.fee,evidence:M.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=Za(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(!Wf.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!==M.LIVE)throw new Error(`cannot prepare without a live quote (${f.evidence}: ${f.reason??"no reason given"})`);let m=l??f.fee,y=bE(f.amountOut,u);if(y<=0n)throw new Error("computed minOut is zero -- refusing to prepare");let h=!!(d.useNative||f.useNative)&&r&&String(i).toLowerCase()===String(r).toLowerCase(),w=`0x${Vf.exactInputSingle}`+zn(i)+zn(s)+yr(m)+zn(c)+yr(a)+yr(y)+yr(0);return{unsigned:!0,signedBy:"user-wallet",chainId:t,venue:"uniswap-v3",tx:{to:p,data:w,value:h?String(a):"0x0"},guard:{quotedOut:f.amountOut,minOut:y.toString(),slippageBps:u,maxSlippageBps:ec,fee:m},requires:h?[]:[{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 gE,Vf,yr,zn,Wf,ec,Kf=v(()=>{$t();Qt();gE=[100,500,3e3,1e4],Vf={quoteExactInputSingle:"c6a5026a",exactInputSingle:"04e45aaf"},yr=e=>BigInt(e).toString(16).padStart(64,"0"),zn=e=>e.slice(2).toLowerCase().padStart(64,"0"),Wf=/^0x[0-9a-fA-F]{40}$/,ec=100});function Xf(e){if(!e||e==="0x")return null;try{return BigInt(e)}catch{return null}}function Qf(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 wE(e){let{chainId:t}=e;async function r(n,o,i){return ee(t,"eth_call",[{to:n,data:o},"latest"],i)}return{async blockNumber(n={}){let o=await Jo(t,n);return{chainId:t,blockNumber:o?.blockNumber??o,evidence:M.LIVE}},async nativeBalance(n,o={}){let i=await bp(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:M.LIVE}},async tokenBalance({token:n,owner:o},i={}){let s=await kp({chainId:t,token:n,owner:o},i);return{chainId:t,token:n,owner:o,raw:s?.balance??s,evidence:M.LIVE}},async resolveToken(n,o={}){if(!/^0x[0-9a-fA-F]{40}$/.test(n||""))return{chainId:t,token:n,evidence:M.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,gi.decimals,o).catch(()=>null),r(n,gi.symbol,o).catch(()=>null),r(n,gi.name,o).catch(()=>null),r(n,gi.totalSupply,o).catch(()=>null)]),u=Xf(i?.result??i),l=u!==null||s?.result||a?.result;return{chainId:t,address:n,decimals:u===null?null:Number(u),symbol:Qf(s?.result??s),name:Qf(a?.result??a),totalSupply:(Xf(c?.result??c)??null)?.toString()??null,evidence:l?M.LIVE:M.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:M.UNAVAILABLE,reason:"no dexscreenerSlug configured for this chain; pool discovery is unavailable rather than guessed"};let s=await ei(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=Zo(n,c,{stables:e.stableQuoteAssets||[],wrappedNative:e.wrappedNative});return{chainId:t,token:n,pools:u,topPool:u[0]||null,quoteAsset:Sp(n,u),evidence:u.length?M.LIVE:M.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 Ir(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 y=await ee(t,"eth_getLogs",[m],c).catch(h=>({error:String(h?.message||h)}));return{start:p,end:f,res:y}});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:M.UNKNOWN};for(let y of m?.result??m??[])u.push(y)}return{chainId:t,fromBlock:n,toBlock:o,logs:u,complete:!0,chunks:l.length,evidence:M.LIVE}},async scoreRisk(n,o={}){let i=[],s=B.PASS,a=l=>{let d={[B.PASS]:0,[B.CAUTION]:1,[B.UNKNOWN]:2,[B.FAIL]:3};d[l]>d[s]&&(s=l)},[c,u]=await Promise.all([this.resolveToken(n,o),this.resolvePools(n,o)]);if(c.evidence!==M.LIVE?(i.push({check:"erc20-metadata",result:B.UNKNOWN,detail:c.warning}),a(B.UNKNOWN)):i.push({check:"erc20-metadata",result:B.PASS,detail:`${c.symbol} / ${c.decimals}d`}),u.evidence===M.UNAVAILABLE)i.push({check:"liquidity",result:B.UNKNOWN,detail:u.reason}),a(B.UNKNOWN);else if(!u.pools.length)i.push({check:"liquidity",result:B.FAIL,detail:"no pool with liquidity found"}),a(B.FAIL);else{let l=u.pools[0],d=l.liquidityUsd??0;d<5e3?(i.push({check:"liquidity",result:B.CAUTION,detail:`top pool only $${d}`}),a(B.CAUTION)):i.push({check:"liquidity",result:B.PASS,detail:`$${d} on ${l.dex}`}),l.createdAt&&Date.now()-l.createdAt<24*3600*1e3&&(i.push({check:"age",result:B.CAUTION,detail:"pool under 24h old"}),a(B.CAUTION))}if(typeof this.sellSimulation=="function"){let l=await this.sellSimulation({token:n,amountIn:(10n**16n).toString()},o).catch(d=>({verdict:B.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:B.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(B.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 tc(e){let r={...wE(e)},n=new Set((e.venues||[]).map(i=>i.kind));e.venueKind==="uniswap-v3"&&n.has("quoter")&&n.has("router")?Object.assign(r,Gf({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,Hf({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 gi,Yf=v(()=>{$t();$n();G();Qt();zf();Kf();$a();gi={decimals:"0x313ce567",symbol:"0x95d89b41",name:"0x06fdde03",totalSupply:"0x18160ddd",owner:"0x8da5cb5b"}});function bi(){return Vn.map(e=>oi(tc(e)))}function Jf(e){return oi(tc(e))}var Vn,wi=v(()=>{Yf();Qt();Vn=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 om,getAddress as kE,id as im}from"ethers";function Kr(e){return e?.cache===!1?!1:!e?.fetchImpl||e.cache===!0}function oc(e,t,r){let n=e.get(t);return n?Date.now()-n.at>r?(e.delete(t),null):n:null}function ki(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 BE(e,t){try{return kE(e).toLowerCase()}catch{throw new Error(`${t} must be a valid EVM address`)}}function UE(e){return`0x${e.slice(2).toLowerCase().padStart(64,"0")}`}function nm(e){return`0x${String(e).slice(-40).toLowerCase()}`}function DE({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>NE)return"stale"}return"scoped"}function ME(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 FE(e,t,r,n){let o=`${e}:${t}`,i=n?.get(o);if(i)return i;if(Kr(r)){let a=oc(tm,o,RE);if(a)return a.value}let s=(async()=>{let a=async d=>{try{let p=Zf.encodeFunctionData(d,[]),f=await ee(e,"eth_call",[{to:t,data:p},"latest"],r);return!f||f==="0x"?null:Zf.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 Kr(r)&&ki(tm,o,l,qE),l})();return n?.set(o,s),s}async function jE(e,t,r){let n=Math.min(Math.max(Number(r.lookbackBlocks)||SE,1),EE),o=await Jo(e,r);if(!Number.isFinite(o))throw new Error("chain head unavailable");let i=Math.max(0,o-n),s=await ee(e,"eth_getLogs",[{fromBlock:`0x${i.toString(16)}`,toBlock:"latest",topics:[xE,UE(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}:${nm(l)}`,{token:u,spender:nm(l)})}return{pairs:[...a.values()],fromBlock:i,toBlock:o}}function HE(e){return(OE[e]||[]).flatMap(r=>vE.map(n=>({token:r.address,spender:n.address,symbol:r.symbol,decimals:r.decimals})))}async function zE(e,t,r={}){let n=[],o="direct-probe",i=null,s=HE(e),a=nc(e),c=Kr(r)&&oc(rc,e,$E)?.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 jE(e,t,r);n=u.pairs,o="log-scan",i={fromBlock:u.fromBlock,toBlock:u.toBlock},Kr(r)&&ki(rc,e,!0,64)}catch{if(Kr(r)&&ki(rc,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 Ir(n,r.concurrency||4,async f=>{try{let m=await wp({chainId:e,token:f.token,owner:t,spender:f.spender},r),y=BigInt(m.allowance);if(y<=0n)return null;let h=f.symbol?{symbol:f.symbol,decimals:f.decimals??null}:await FE(e,f.token,r,u),w=y>=CE,E=AE[f.spender]||null;return{id:`${e}:${f.token}:${f.spender}`,chainId:e,standard:"erc20",token:f.token,tokenSymbol:h.symbol,decimals:h.decimals,spender:f.spender,spenderLabel:E,allowance:y.toString(),allowanceDisplay:ME(y,h.decimals,w),unlimited:w,lastActivityAt:null,risk:DE({unlimited:w,spenderLabel:E,lastActivityAt:null})}}catch{return null}})).filter(Boolean),p=await WE(e,t,r);return{scan:{chainId:e,status:"ok",method:o,pairsProbed:n.length,collectionsProbed:nc(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 VE(e,t,r,n,o){try{let i=em.encodeFunctionData("isApprovedForAll",[r,n]),s=await ee(e,"eth_call",[{to:t,data:i},"latest"],o);return!s||s==="0x"?null:!!em.decodeFunctionResult("isApprovedForAll",s)[0]}catch{return null}}function nc(e){return(_E[e]||[]).flatMap(r=>IE.map(n=>({collection:r.address,collectionName:r.name,operator:n.address,operatorLabel:n.label})))}async function WE(e,t,r){let n=nc(e);return n.length===0?[]:(await Ir(n,r.concurrency||4,async i=>await VE(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 sm(e={},t={}){let r=BE(e.owner||e.address,"owner"),n=new Map(Vn.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=Kr(t)&&!e.refresh;if(s){let f=oc(rm,i,PE);if(f)return{...f.value,cached:!0,cachedAgeMs:Date.now()-f.at}}let a=await Ir(o,e.concurrency||3,f=>zE(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&&ki(rm,i,p,LE),{...p,cached:!1,cachedAgeMs:0}}var Zf,em,xE,u$,SE,EE,AE,vE,IE,_E,OE,TE,CE,NE,RE,$E,PE,qE,LE,tm,rc,rm,am=v(()=>{wi();G();$t();Zf=new om(["function decimals() view returns (uint8)","function symbol() view returns (string)"]),em=new om(["function isApprovedForAll(address owner, address operator) view returns (bool)","function name() view returns (string)"]),xE=im("Approval(address,address,uint256)"),u$=im("ApprovalForAll(address,address,bool)"),SE=1e4,EE=2e5,AE=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)"}),vE=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"}]),IE=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"}]),_E=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"}]}),OE=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}]}),TE=(1n<<256n)-1n,CE=TE/2n,NE=4320*60*60*1e3,RE=360*60*1e3,$E=600*1e3,PE=45*1e3,qE=512,LE=128,tm=new Map,rc=new Map,rm=new Map});var lm={};H(lm,{aggregateBridgeQuotes:()=>cm,bridgeAggregatorHealth:()=>KE,checkRevokeNeeded:()=>um,scanBridgeRoutes:()=>GE});async function cm(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=Ef({srcChainId:r,srcChainTokenIn:o,srcChainTokenInAmount:s,dstChainId:n,dstChainTokenOut:i},t).then(g=>g.error?(f.push(`debridge: ${g.error}`),null):{provider:"debridge",amountOut:g.estimation?.dstChainTokenOut?.amount??g.estimation?.toAmount,feeUsd:g.estimation?.fixFee??g.fixFee,estimatedTime:g.estimation?.execution?.estimatedTransferTime?`${g.estimation.execution.estimatedTransferTime}s`:"unknown",preparable:!0,raw:g}).catch(g=>(f.push(`debridge: ${g.message}`),null)),y=jn({fromChainId:r,toChainId:n,tokenIn:o,tokenOut:i,amountIn:s,taker:a},t).then(g=>!g||g.error?(f.push(`lifi: ${g?.error??"no route"}`),null):{provider:"lifi-relay",amountOut:g.amountOut??g.quote?.amountOut,feeUsd:g.feeUsd??g.totalFee,estimatedTime:g.estimatedTime??g.duration??"unknown",preparable:!!g.transaction,raw:g}).catch(g=>(f.push(`lifi: ${g.message}`),null)),h=Nf({fromChain:r,toChain:n,fromToken:o,toToken:i,fromAmount:s,fromAddress:a},t).then(g=>g.error?(f.push(`squid: ${g.error}`),null):{provider:"squid",amountOut:g.toAmount,feeUsd:Array.isArray(g.fee)?g.fee.reduce((b,S)=>b+(Number(S.amountUsd)||0),0):null,estimatedTime:"30s - 3min",preparable:!1,raw:g}).catch(g=>(f.push(`squid: ${g.message}`),null)),w=$f({srcChainId:r,dstChainId:n,token:o,amount:s},t).then(g=>g.error?(f.push(`stargate: ${g.error}`),null):{provider:"stargate",amountOut:g.amountOut,feeUsd:g.fee,estimatedTime:g.estimatedTime||"1-5 min",preparable:!1,raw:g}).catch(g=>(f.push(`stargate: ${g.message}`),null)),E=qf({fromAsset:c,toAsset:u,amount:s,destination:a},t).then(g=>g.error?(f.push(`thorchain: ${g.error}`),null):{provider:"thorchain",amountOut:g.expectedAmountOut,feeUsd:g.fees?.total,estimatedTime:g.estimatedTime||"10-30 min",preparable:!1,raw:g}).catch(g=>(f.push(`thorchain: ${g.message}`),null)),_=(async()=>{if(!c||!u||c==="?"||u==="?")return f.push("changenow: ticker symbols required, skipping"),null;try{let g=await Of({fromTicker:c,toTicker:u,fromAmount:s},t);return g.error?(f.push(`changenow: ${g.error}`),null):{provider:"changenow",amountOut:g.toAmount,feeUsd:g.networkFee,estimatedTime:g.flow==="standard"?"5-30 min":"instant",preparable:!1,kycRequired:g.kycRequired,raw:g}}catch(g){return f.push(`changenow: ${g.message}`),null}})(),x=Bf({fromChainId:r,toChainId:n,fromToken:o,toToken:i,fromAmount:s,userAddress:a},t).then(g=>g.error?(f.push(`bungee: ${g.error}`),null):{provider:"bungee",amountOut:g.amountOut,feeUsd:g.feeUsd,estimatedTime:g.estimatedTime,preparable:!1,raw:g}).catch(g=>(f.push(`bungee: ${g.message}`),null)),O=Df({originDomain:r,destinationDomain:n,originToken:o,destinationToken:i,amount:s},t).then(g=>g.error?(f.push(`connext: ${g.error}`),null):{provider:"connext",amountOut:g.amountOut,feeUsd:g.fee,estimatedTime:g.estimatedTime||"5-20 min",preparable:!1,raw:g}).catch(g=>(f.push(`connext: ${g.message}`),null)),I=Ff({fromChain:r,toChain:n,token:o,amount:s},t).then(g=>g.error?(f.push(`wormhole: ${g.error}`),null):{provider:"wormhole",amountOut:g.amountOut,feeUsd:g.fee,estimatedTime:g.estimatedTime||"5-15 min",preparable:!1,raw:g}).catch(g=>(f.push(`wormhole: ${g.message}`),null)),k=await Promise.allSettled([m,y,h,w,E,x,O,I,_]);for(let g of k)g.status==="fulfilled"&&g.value&&p.push(g.value);return p.sort((g,b)=>{let S=Number(g.amountOut??0),R=Number(b.amountOut??0);return S!==R?R-S:g.preparable&&!b.preparable?-1:!g.preparable&&b.preparable?1:0}),{providers:p.map(g=>g.provider),bestRoute:p[0]?.provider??"none",winner:p[0]??null,runnersUp:p.slice(1),errors:f.length?f:null}}async function um({chainId:e,taker:t,tokenIn:r}={},n={}){if(!e||!t)return{needsRevoke:!1,note:"no wallet to check"};try{let i=(await sm({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 GE(e={},t={}){let[r,n]=await Promise.all([cm(e,t),um({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 KE(){let[e,t]=await Promise.all([Af().catch(r=>({ok:!1,error:r.message})),Tf().catch(r=>({ok:!1,error:r.message}))]);return{debridge:e,changenow:t,lifi:{ok:!0,note:"integrated via router"}}}var q$,dm=v(()=>{Wr();vf();Cf();Rf();Pf();Lf();Uf();Mf();jf();am();q$=Object.freeze(["debridge","lifi-relay","squid","stargate","thorchain","bungee","connext","wormhole","changenow"])});var pm={};H(pm,{DYDX_API:()=>xi,dydxHealth:()=>JE,dydxMarkets:()=>QE,dydxOrderbook:()=>YE});function Wn(e){if(e==null||e==="")return null;let t=Number(e);return Number.isFinite(t)?t:null}function XE(e){let t=e?.markets;return Array.isArray(t)?t:t&&typeof t=="object"?Object.values(t):[]}async function QE(e=50,t={}){try{let r=await T(`${xi}/v4/perpetualMarkets?limit=${e}`,t);return XE(r).map(o=>{let i=Wn(o?.nextFundingRate),s=Wn(o?.oraclePrice),a=Wn(o?.openInterest),c=Wn(o?.volume24H),u=Wn(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 YE(e){try{let t=await T(`${xi}/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 JE(){try{return{ok:!0,serverTime:(await T(`${xi}/v4/time`))?.iso}}catch(e){return{ok:!1,error:String(e.message||e).slice(0,160)}}}var xi,fm=v(()=>{G();xi="https://indexer.dydx.trade"});var gm={};H(gm,{DRIFT_API:()=>hm,driftHealth:()=>ZE,driftMarkets:()=>ym});async function ym(e={}){try{let r=(await T(`${hm}/v2/markets`,e))?.markets;return!Array.isArray(r)||r.length===0?{error:mm,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:`${mm} (${String(t.message||t).slice(0,120)})`,venue:"drift",quality:"FAILED"}}}async function ZE(){let e=await ym();return e?.error?{ok:!1,error:e.error,quality:"FAILED"}:{ok:!0,note:"Drift v2 perps on Solana",quality:"LIVE"}}var hm,mm,bm=v(()=>{G();hm="https://dlob.drift.trade",mm="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 xm={};H(xm,{VERTEX_API:()=>ic,vertexHealth:()=>tA,vertexMarkets:()=>km,vertexOrderbook:()=>eA});async function km(e={}){try{let r=(await T(`${ic}/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:wm,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:`${wm} (${String(t.message||t).slice(0,120)})`,venue:"vertex",quality:"FAILED"}}}async function eA(e){try{let r=(await T(`${ic}/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 tA(){let e=await km();return e?.error?{ok:!1,error:e.error,quality:"FAILED"}:{ok:!0,status:"ok",quality:"LIVE"}}var ic,wm,Sm=v(()=>{G();ic="https://gateway.prod.vertexprotocol.com/v2",wm="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 Em={};H(Em,{pancakeHealth:()=>oA,pancakeQuote:()=>nA});async function nA({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 T(`${rA}/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 oA(){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 rA,Am=v(()=>{G();rA="https://api.thegraph.com/subgraphs/name/pancakeswap/exchange-v3-bsc"});var Im={};H(Im,{sushiHealth:()=>aA,sushiQuote:()=>sA});async function sA({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 T(`${iA(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 aA(){try{return{ok:!0,chains:Object.keys(vm).length+" chains"}}catch(e){return{ok:!1,error:String(e.message||e).slice(0,160)}}}var iA,vm,_m=v(()=>{G();iA=e=>`https://api.thegraph.com/subgraphs/name/sushi-v3/v3-${vm[e]||"ethereum"}`,vm={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 Om={};H(Om,{raydiumHealth:()=>lA,raydiumQuote:()=>uA});async function uA({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 T(`${cA}/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 lA(){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 cA,Tm=v(()=>{G();cA="https://quote-api.jup.ag/v6"});var Cm={};H(Cm,{AEVO_API:()=>sc,aevoHealth:()=>pA,aevoMarkets:()=>dA});async function dA(e={}){try{return(await T(`${sc}/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 pA(){try{return{ok:(await T(`${sc}/ping`))?.status==="ok"}}catch(e){return{ok:!1,error:String(e.message||e).slice(0,160)}}}var sc,Nm=v(()=>{G();sc="https://api.aevo.xyz"});var lc={};H(lc,{BINANCE_DEFAULT_FUNDING_INTERVAL_HOURS:()=>Pm,BINANCE_FUTURES_API:()=>$m,BINANCE_SPOT_API:()=>Rm,binanceFunding:()=>Ei,binanceFundingHistory:()=>yA,binanceHealth:()=>cc,binanceMarkPrice:()=>mA,binanceOpenInterest:()=>hA,binanceOrderbook:()=>fA,binanceSymbol:()=>Xr,binanceTicker:()=>uc,normalizeBook:()=>Qr});function ac(e={}){return(e.spotBaseUrl||e.baseUrl||process.env.BINANCE_API_URL||Rm).replace(/\/$/,"")}function Si(e={}){return(e.futuresBaseUrl||process.env.BINANCE_FAPI_URL||$m).replace(/\/$/,"")}function Gn(e){return{error:String(e.message||e).slice(0,200)}}function Ve(e){let t=Number(e);return Number.isFinite(t)?t:null}function Xr(e,t="USDT"){let r=String(e||"").trim().toUpperCase().replace(/[-_/]/g,"");return r?r.endsWith(t)?r:`${r}${t}`:""}async function cc(e={}){try{let t=await T(`${ac(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 uc(e={},t={}){let r=Xr(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 T(`${ac(t)}${n}?symbol=${encodeURIComponent(r)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3});return{venue:"binance",market:"spot",symbol:r,price:Ve(o?.price??o?.lastPrice),volume24h:Ve(o?.volume),quoteVolume24h:Ve(o?.quoteVolume),raw:o}}catch(n){return Gn(n)}}async function fA(e={},t={}){let r=Xr(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?`${Si(t)}/fapi/v1/depth?symbol=${encodeURIComponent(r)}&limit=${n}`:`${ac(t)}/api/v3/depth?symbol=${encodeURIComponent(r)}&limit=${n}`,s=await T(i,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3});return Qr({venue:"binance",market:o?"perp":"spot",symbol:r,bids:s?.bids,asks:s?.asks,raw:s})}catch(i){return Gn(i)}}async function Ei(e={},t={}){let r=Xr(e.symbol||e.coin,e.quote||"USDT");if(!r)return{error:"binanceFunding requires symbol or coin"};try{let n=await T(`${Si(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)||Pm,s=Ve(o?.lastFundingRate);return{venue:"binance",market:"perp",symbol:r,markPrice:Ve(o?.markPrice),indexPrice:Ve(o?.indexPrice),fundingRate:s,fundingIntervalHours:i,fundingAprPct:s==null?null:s*(8760/i)*100,nextFundingTime:Ve(o?.nextFundingTime),raw:o??null}}catch(n){return Gn(n)}}async function mA(e={},t={}){let r=await Ei(e,t);return r?.error?r:{venue:"binance",market:"perp",symbol:r.symbol,markPrice:r.markPrice,indexPrice:r.indexPrice}}async function hA(e={},t={}){let r=Xr(e.symbol||e.coin,e.quote||"USDT");if(!r)return{error:"binanceOpenInterest requires symbol or coin"};try{let n=await T(`${Si(t)}/fapi/v1/openInterest?symbol=${encodeURIComponent(r)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3});return{venue:"binance",market:"perp",symbol:r,openInterest:Ve(n?.openInterest),time:Ve(n?.time),raw:n??null}}catch(n){return Gn(n)}}async function yA(e={},t={}){let r=Xr(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 T(`${Si(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:Ve(s?.fundingTime),fundingRate:Ve(s?.fundingRate)}))}}catch(o){return Gn(o)}}function Qr({venue:e,market:t,symbol:r,bids:n,asks:o,raw:i}){let s=f=>(Array.isArray(f)?f:[]).map(m=>{let y=Ve(Array.isArray(m)?m[0]:m?.price),h=Ve(Array.isArray(m)?m[1]:m?.size);return y==null||h==null?null:{price:y,size:h}}).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 Rm,$m,Pm,Kn=v(()=>{G();Rm="https://api.binance.com",$m="https://fapi.binance.com",Pm=8});var hc={};H(hc,{OKX_API:()=>qm,OKX_DEFAULT_FUNDING_INTERVAL_HOURS:()=>Lm,okxFunding:()=>fc,okxHealth:()=>dc,okxInstId:()=>Jr,okxMarkPrice:()=>mc,okxOpenInterest:()=>bA,okxOrderbook:()=>gA,okxTicker:()=>pc});function Yr(e={}){return(e.baseUrl||process.env.OKX_API_URL||qm).replace(/\/$/,"")}function Xn(e){return{error:String(e.message||e).slice(0,200)}}function Be(e){if(e===""||e==null)return null;let t=Number(e);return Number.isFinite(t)?t:null}function Jr(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 Zr(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 dc(e={}){try{let t=await T(`${Yr(e)}/api/v5/public/time`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??1e4});return{ok:Zr(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 pc(e={},t={}){let r=String(e.market||"spot").toLowerCase(),n=Jr(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 T(`${Yr(t)}/api/v5/market/ticker?instId=${encodeURIComponent(n)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),i=Zr(o)[0];return i?{venue:"okx",market:n.endsWith("-SWAP")?"perp":"spot",symbol:n,price:Be(i.last),bestBid:Be(i.bidPx),bestAsk:Be(i.askPx),volume24h:Be(i.vol24h),quoteVolume24h:Be(i.volCcy24h),raw:i}:{error:`okx ticker empty for ${n}`}}catch(o){return Xn(o)}}async function gA(e={},t={}){let r=String(e.market||"spot").toLowerCase(),n=Jr(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 T(`${Yr(t)}/api/v5/market/books?instId=${encodeURIComponent(n)}&sz=${o}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),s=Zr(i)[0];return s?Qr({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 Xn(i)}}async function fc(e={},t={}){let r=Jr(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 T(`${Yr(t)}/api/v5/public/funding-rate?instId=${encodeURIComponent(r)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),o=Zr(n)[0];if(!o)return{error:`okx funding-rate empty for ${r}`};let i=Number(e.fundingIntervalHours)||Lm,s=Be(o.fundingRate);return{venue:"okx",market:"perp",symbol:r,fundingRate:s,nextFundingRate:Be(o.nextFundingRate),fundingIntervalHours:i,fundingAprPct:s==null?null:s*(8760/i)*100,nextFundingTime:Be(o.nextFundingTime??o.fundingTime),raw:o}}catch(n){return Xn(n)}}async function mc(e={},t={}){let r=Jr(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 T(`${Yr(t)}/api/v5/public/mark-price?instType=${encodeURIComponent(n)}&instId=${encodeURIComponent(r)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),i=Zr(o)[0];return i?{venue:"okx",market:"perp",symbol:r,markPrice:Be(i.markPx),time:Be(i.ts),raw:i}:{error:`okx mark-price empty for ${r}`}}catch(o){return Xn(o)}}async function bA(e={},t={}){let r=Jr(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 T(`${Yr(t)}/api/v5/public/open-interest?instType=${encodeURIComponent(n)}&instId=${encodeURIComponent(r)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),i=Zr(o)[0];return i?{venue:"okx",market:"perp",symbol:r,openInterest:Be(i.oiCcy??i.oi),openInterestContracts:Be(i.oi),openInterestUsd:Be(i.oiUsd),time:Be(i.ts),raw:i}:{error:`okx open-interest empty for ${r}`}}catch(o){return Xn(o)}}var qm,Lm,yc=v(()=>{G();Kn();qm="https://www.okx.com",Lm=8});var wc={};H(wc,{BYBIT_API:()=>Bm,BYBIT_DEFAULT_FUNDING_INTERVAL_HOURS:()=>Um,bybitCategory:()=>Ai,bybitFunding:()=>vi,bybitFundingHistory:()=>SA,bybitHealth:()=>gc,bybitMarkPrice:()=>kA,bybitOpenInterest:()=>xA,bybitOrderbook:()=>wA,bybitSymbol:()=>Jn,bybitTicker:()=>bc});function Qn(e={}){return(e.baseUrl||process.env.BYBIT_API_URL||Bm).replace(/\/$/,"")}function Yn(e){return{error:String(e.message||e).slice(0,200)}}function ye(e){if(e===""||e==null)return null;let t=Number(e);return Number.isFinite(t)?t:null}function Jn(e,t="USDT"){let r=String(e||"").trim().toUpperCase().replace(/[-_/]/g,"");return r?r.endsWith(t)?r:`${r}${t}`:""}function Ai(e){let t=String(e||"spot").toLowerCase();return t==="perp"||t==="linear"||t==="swap"?"linear":t==="inverse"?"inverse":"spot"}function Zn(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 gc(e={}){try{let t=await T(`${Qn(e)}/v5/market/time`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??1e4});return{ok:!!Zn(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 Dm(e,t){let r=Ai(e.market),n=Jn(e.symbol||e.coin,e.quote||"USDT");if(!n)return{error:"bybit requires symbol or coin"};let o=await T(`${Qn(t)}/v5/market/tickers?category=${encodeURIComponent(r)}&symbol=${encodeURIComponent(n)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),i=Zn(o)?.list?.[0];return i?{row:i,symbol:n,category:r}:{error:`bybit tickers empty for ${n}`}}async function bc(e={},t={}){try{let r=await Dm(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:ye(n.lastPrice),bestBid:ye(n.bid1Price),bestAsk:ye(n.ask1Price),markPrice:ye(n.markPrice),indexPrice:ye(n.indexPrice),volume24h:ye(n.volume24h),quoteVolume24h:ye(n.turnover24h),raw:n}}catch(r){return Yn(r)}}async function wA(e={},t={}){let r=Ai(e.market),n=Jn(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 T(`${Qn(t)}/v5/market/orderbook?category=${encodeURIComponent(r)}&symbol=${encodeURIComponent(n)}&limit=${o}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),s=Zn(i);return s?Qr({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 Yn(i)}}async function vi(e={},t={}){try{let r=await Dm({...e,market:e.market||"perp"},t);if(r.error)return r;let{row:n,symbol:o}=r,i=Number(e.fundingIntervalHours)||Um,s=ye(n.fundingRate);return{venue:"bybit",market:"perp",symbol:o,markPrice:ye(n.markPrice),indexPrice:ye(n.indexPrice),fundingRate:s,fundingIntervalHours:i,fundingAprPct:s==null?null:s*(8760/i)*100,nextFundingTime:ye(n.nextFundingTime),openInterest:ye(n.openInterest),raw:n}}catch(r){return Yn(r)}}async function kA(e={},t={}){let r=await vi(e,t);return r?.error?r:{venue:"bybit",market:"perp",symbol:r.symbol,markPrice:r.markPrice,indexPrice:r.indexPrice}}async function xA(e={},t={}){let r=Jn(e.symbol||e.coin,e.quote||"USDT");if(!r)return{error:"bybitOpenInterest requires symbol or coin"};let n=Ai(e.market||"perp"),o=String(e.intervalTime||"1h"),i=Math.min(Math.max(Number(e.limit)||1,1),200);try{let s=await T(`${Qn(t)}/v5/market/open-interest?category=${encodeURIComponent(n)}&symbol=${encodeURIComponent(r)}&intervalTime=${encodeURIComponent(o)}&limit=${i}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),a=Zn(s)?.list,c=Array.isArray(a)?a[0]:null;return c?{venue:"bybit",market:"perp",symbol:r,openInterest:ye(c.openInterest),time:ye(c.timestamp),history:(Array.isArray(a)?a:[]).map(u=>({openInterest:ye(u?.openInterest),timestamp:ye(u?.timestamp)}))}:{error:`bybit open-interest empty for ${r}`}}catch(s){return Yn(s)}}async function SA(e={},t={}){let r=Jn(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 T(`${Qn(t)}/v5/market/funding/history?category=linear&symbol=${encodeURIComponent(r)}&limit=${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),i=Zn(o)?.list,s=Array.isArray(i)?i:[];return{venue:"bybit",symbol:r,count:s.length,history:s.map(a=>({fundingRate:ye(a?.fundingRate),fundingTime:ye(a?.fundingRateTimestamp)}))}}catch(o){return Yn(o)}}var Bm,Um,kc=v(()=>{G();Kn();Bm="https://api.bybit.com",Um=8});var Gm={};H(Gm,{CEX_BASIS_VENUES:()=>Ii,HL_FUNDING_INTERVAL_HOURS:()=>xc,cexBasis:()=>Vm,cexBasisHealth:()=>_A,cexFundingSpread:()=>IA,cexVenueLegs:()=>zm,hyperliquidPerpLeg:()=>Fm,hyperliquidSpotLeg:()=>jm,okxPerpLeg:()=>Hm,pairwiseFundingSpreads:()=>Wm});function eo(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 EA(e,t){return e==null||!t?null:e*(8760/t)*100}function Sc(e={}){return String(e.coin||e.symbol||"").trim().toUpperCase().replace(/[-_/]/g,"").replace(/USDT?$/,"")||""}function AA(e={}){let t=e.venues,r=Array.isArray(t)?t:typeof t=="string"&&t.trim()&&t.trim().toLowerCase()!=="all"?t.split(","):Ii,n=new Set(r.map(i=>String(i).trim().toLowerCase()).filter(Boolean)),o=Ii.filter(i=>n.has(i));return o.length?o:Ii}async function Fm(e={},t={}){let r=Sc(e);if(!r)return{error:"hyperliquidPerpLeg requires coin"};try{let n=await ol(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=Se(a.funding);return{venue:"hyperliquid",market:"perp",symbol:r,markPrice:Se(a.markPx),indexPrice:Se(a.oraclePx),midPrice:Se(a.midPx),fundingRate:c,fundingIntervalHours:xc,fundingAprPct:EA(c,xc),openInterest:Se(a.openInterest)}}catch(n){return eo(n)}}async function jm(e={},t={}){let r=Sc(e);if(!r)return{error:"hyperliquidSpotLeg requires coin"};try{let n=await rl(t),o=Se(n?.[r]);return o==null?{error:`hyperliquid allMids has no entry for ${r}`}:{venue:"hyperliquid",market:"spot",symbol:r,price:o}}catch(n){return eo(n)}}async function Hm(e={},t={}){let[r,n]=await Promise.all([fc(e,t).catch(eo),mc(e,t).catch(eo)]);return r?.error&&n?.error?r:{...r?.error?{venue:"okx",market:"perp",fundingError:r.error}:r,markPrice:n?.error?null:Se(n.markPrice),...n?.error?{markError:n.error}:{}}}async function Jt(e,t){try{let r=await t;return[e,r&&typeof r=="object"?r:{error:"empty response"}]}catch(r){return[e,eo(r)]}}async function zm(e={},t={}){let r=Sc(e);if(!r)return{error:"cexVenueLegs requires coin"};let n=e.quote||"USDT",o=AA(e),i=[];o.includes("binance")&&(i.push(Jt("binance:perp",Ei({coin:r,quote:n},t))),i.push(Jt("binance:spot",uc({coin:r,quote:n},t)))),o.includes("okx")&&(i.push(Jt("okx:perp",Hm({coin:r,quote:n},t))),i.push(Jt("okx:spot",pc({coin:r,quote:n,market:"spot"},t)))),o.includes("bybit")&&(i.push(Jt("bybit:perp",vi({coin:r,quote:n},t))),i.push(Jt("bybit:spot",bc({coin:r,quote:n,market:"spot"},t)))),o.includes("hyperliquid")&&(i.push(Jt("hyperliquid:perp",Fm({coin:r},t))),i.push(Jt("hyperliquid:spot",jm({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 Mm(e){return!e||e.error?null:Se(e.price)??Se(e.mid)??null}function vA(e){return!e||e.error?null:Se(e.markPrice)??Se(e.midPrice)??null}async function Vm(e={},t={}){let r=await zm(e,t);if(r.error)return r;let{coin:n,quote:o,venues:i,legs:s}=r,a=[];for(let m of i){let y=Mm(s[m]?.spot);y!=null&&y>0&&a.push(y)}let c=[...a].sort((m,y)=>m-y),u=c.length?c.length%2?c[(c.length-1)/2]:(c[c.length/2-1]+c[c.length/2])/2:null,l=[];for(let m of i){let y=s[m]?.perp,h=s[m]?.spot,w=vA(y),E=Mm(h),_=E??u,x=w!=null&&_?(w-_)/_*1e4:null;l.push({venue:m,symbol:y?.symbol??h?.symbol??n,markPrice:w,spotPrice:E,spotSource:E!=null?m:u!=null?"cross-venue-median":null,basisBps:x,fundingRate:y&&!y.error?Se(y.fundingRate):null,fundingIntervalHours:y&&!y.error?Se(y.fundingIntervalHours):null,fundingAprPct:y&&!y.error?Se(y.fundingAprPct):null,openInterest:y&&!y.error?Se(y.openInterest):null,errors:[y?.error,h?.error].filter(Boolean)})}let d=Wm(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,y)=>y.basisBps>m.basisBps?y:m):null,cheapestBasis:f.length?f.reduce((m,y)=>y.basisBps<m.basisBps?y: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 Wm(e=[]){let t=e.filter(n=>Se(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 IA(e={},t={}){let r=await Vm(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 _A(e={}){try{let t=await Promise.all([cc(e).catch(()=>({ok:!1})),dc(e).catch(()=>({ok:!1})),gc(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 Ii,xc,Km=v(()=>{Kn();yc();kc();Ao();Ii=["binance","okx","bybit","hyperliquid"],xc=1});var Xm={};H(Xm,{compoundHealth:()=>CA,compoundMarkets:()=>TA});async function TA(e={}){try{return((await T(`${OA}/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 CA(){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 OA,Qm=v(()=>{G();OA="https://api.compound.finance/api/v2"});var Ym={};H(Ym,{yearnHealth:()=>$A,yearnVaults:()=>RA});async function RA(e={}){try{return(await T(`${NA}/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 $A(){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 NA,Jm=v(()=>{G();NA="https://api.yearn.fi/v1"});var Zm={};H(Zm,{convexHealth:()=>LA,convexPools:()=>qA});async function qA(e={}){try{return(await T(`${PA}/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 LA(){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 PA,eh=v(()=>{G();PA="https://api.convexfinance.com/api"});function gr(e){if(!Number.isSafeInteger(e)||e<0||e>1e3)throw new RangeError("scale must be a safe integer from 0 through 1000")}function wt(e,t){if(typeof e!="bigint")throw new TypeError("mantissa must be a bigint");return gr(t),Object.freeze({mantissa:e,scale:t})}function Zt(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`);gr(e.scale)}function _i(e){return gr(e),10n**BigInt(e)}function z(e){if(typeof e!="string"||!/^[+-]?\d+(?:\.\d+)?$/.test(e))throw new TypeError("value must be a plain decimal string");let t=e.startsWith("-"),r=e[0]==="-"||e[0]==="+"?e.slice(1):e,[n,o=""]=r.split("."),i=`${n}${o}`,s=BigInt(i)*(t?-1n:1n);return wt(s,o.length)}function Ue(e,t){if(gr(t),typeof e=="bigint")return wt(e,t);if(typeof e!="string"||!/^[+-]?\d+$/.test(e))throw new TypeError("value must be an integer string or bigint");return wt(BigInt(e),t)}function st(e){Zt(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 to(e,t){return Zt(e),gr(t),t===e.scale?wt(e.mantissa,e.scale):t>e.scale?wt(e.mantissa*_i(t-e.scale),t):wt(e.mantissa/_i(e.scale-t),t)}function Ec(e,t){Zt(e,"left"),Zt(t,"right");let r=Math.max(e.scale,t.scale);return[to(e,r),to(t,r),r]}function er(e,t){let[r,n,o]=Ec(e,t);return wt(r.mantissa+n.mantissa,o)}function ro(e,t){let[r,n,o]=Ec(e,t);return wt(r.mantissa-n.mantissa,o)}function We(e,t){Zt(e,"left"),Zt(t,"right");let r=e.scale+t.scale;return gr(r),wt(e.mantissa*t.mantissa,r)}function at(e,t,r=Math.max(e?.scale??0,t?.scale??0)){if(Zt(e,"left"),Zt(t,"right"),gr(r),t.mantissa===0n)throw new RangeError("division by zero");let n=e.mantissa*_i(t.scale+r),o=t.mantissa*_i(e.scale);return wt(n/o,r)}function tr(e,t){let[r,n]=Ec(e,t);return r.mantissa<n.mantissa?-1:r.mantissa>n.mantissa?1:0}var J$,Ze=v(()=>{J$=Object.freeze({mantissa:10000n,scale:0})});import{existsSync as rh,readFileSync as BA}from"node:fs";import{dirname as th,join as Ac}from"node:path";import{fileURLToPath as UA}from"node:url";function DA(e){let t=th(UA(e));for(let r=0;r<8;r+=1){let n=Ac(t,"package.json");if(rh(n))try{let i=JSON.parse(BA(n,"utf8"));if(i&&typeof i.version=="string")return t}catch{}let o=th(t);if(o===t)break;t=o}throw new Error(`oracle: could not resolve package root from ${e}`)}function nh(e,t){let r=DA(t),n=Ac(r,e);return rh(n)?n:Ac(r,"dist","assets",e)}var oh=v(()=>{});import{readFileSync as MA,existsSync as FA}from"node:fs";import{fileURLToPath as jA}from"node:url";import{dirname as HA,join as sh}from"node:path";function VA(){try{let e=nh("equities-fixtures",import.meta.url);if(e&&FA(e))return e}catch{}return zA}function GA(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function Q(e,t){throw new TypeError(`Fixture fixtures/${e}: ${t}`)}function le(e,t,r){GA(e)||Q(t,`${r} must be an object`)}function Z(e,t,r){(typeof e!="string"||e.length===0)&&Q(t,`${r} must be a nonempty string`)}function kt(e,t,r){Number.isSafeInteger(e)||Q(t,`${r} must be a safe integer`)}function rr(e,t,r){le(e,t,r);for(let[n,o]of Object.entries(e))Z(n,t,`${r} key`),le(o,t,`${r}.${n}`)}function KA(e,t){le(e,t,"root"),kt(e.capturedAt,t,"capturedAt"),le(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];le(i,t,`venues.${n}`),Z(i.type,t,`venues.${n}.type`),Z(i.chain,t,`venues.${n}.chain`),Z(i.tier,t,`venues.${n}.tier`),rr(i[o],t,`venues.${n}.${o}`)}for(let[n,o]of Object.entries(e.venues.hyperliquid_hip3.dexs))rr(o,t,`venues.hyperliquid_hip3.dexs.${n}`)}function XA(e,t){rr(e,t,"root"),Object.keys(e).length===0&&Q(t,"root must not be empty");for(let[r,n]of Object.entries(e))Array.isArray(n.venues)||Q(t,`${r}.venues must be an array`),n.venues.forEach((o,i)=>Z(o,t,`${r}.venues[${i}]`))}function QA(e,t){le(e,t,"root");for(let r of["chainId","block","oracleScaleExp","usdgDecimals","equityDecimals"])kt(e[r],t,r);Z(e.usdg,t,"usdg"),rr(e.assets,t,"assets");for(let[r,n]of Object.entries(e.assets))Z(n.oracle,t,`assets.${r}.oracle`),Z(n.token,t,`assets.${r}.token`),(typeof n.rawPrice!="string"||!/^\d+$/.test(n.rawPrice))&&Q(t,`assets.${r}.rawPrice must be an integer string`),(typeof n.usd!="number"||!Number.isFinite(n.usd)||n.usd<0)&&Q(t,`assets.${r}.usd must be a nonnegative finite source number`)}function YA(e,t){le(e,t,"root");for(let n of["holidayDayIndex","names","dates"])Array.isArray(e[n])||Q(t,`${n} must be an array`);let r=e.holidayDayIndex.length;(e.names.length!==r||e.dates.length!==r)&&Q(t,"holidayDayIndex, names, and dates must have equal lengths"),e.holidayDayIndex.forEach((n,o)=>kt(n,t,`holidayDayIndex[${o}]`)),e.names.forEach((n,o)=>Z(n,t,`names[${o}]`)),e.dates.forEach((n,o)=>{(typeof n!="string"||!/^\d{4}-\d{2}-\d{2}$/.test(n))&&Q(t,`dates[${o}] must use YYYY-MM-DD`)})}function JA(e,t){le(e,t,"root"),(!Array.isArray(e.dstTransitions)||e.dstTransitions.length===0)&&Q(t,"dstTransitions must be a nonempty array");let r=new Set;e.dstTransitions.forEach((n,o)=>{le(n,t,`dstTransitions[${o}]`);for(let i of["year","startUtc","endUtc"])kt(n[i],t,`dstTransitions[${o}].${i}`);n.startUtc>=n.endUtc&&Q(t,`dstTransitions[${o}] startUtc must be before endUtc`),r.has(n.year)&&Q(t,`dstTransitions contains duplicate year ${n.year}`),r.add(n.year)})}function ZA(e,t){rr(e,t,"root"),Object.keys(e).length===0&&Q(t,"root must not be empty");for(let[r,n]of Object.entries(e)){for(let o of["addr","quote","quoteAddr","dex","pair"])Z(n[o],t,`${r}.${o}`);(typeof n.liq!="number"||!Number.isFinite(n.liq)||n.liq<0)&&Q(t,`${r}.liq must be a nonnegative finite source number`)}}function ev(e,t){le(e,t,"root"),kt(e.capturedAt,t,"capturedAt"),kt(e.block,t,"block"),kt(e.chainId,t,"chainId"),Z(e.gasPriceWei,t,"gasPriceWei"),Z(e.stateView,t,"stateView"),rr(e.pools,t,"pools"),Object.keys(e.pools).length===0&&Q(t,"pools must not be empty");for(let[r,n]of Object.entries(e.pools)){for(let o of["pair","version","quote","token","sqrtPriceX96"])Z(n[o],t,`pools.${r}.${o}`);n.version!=="v3"&&n.version!=="v4"&&Q(t,`pools.${r}.version must be v3 or v4`),typeof n.quoteIsToken0!="boolean"&&Q(t,`pools.${r}.quoteIsToken0 must be a boolean`),(!/^[0-9]+$/.test(n.sqrtPriceX96)||BigInt(n.sqrtPriceX96)<=0n)&&Q(t,`pools.${r}.sqrtPriceX96 must be a positive integer string`)}}function tv(e,t){le(e,t,"root"),kt(e.capturedAt,t,"capturedAt"),Z(e.source,t,"source"),le(e.books,t,"books"),Object.keys(e.books).length===0&&Q(t,"books must not be empty");for(let[r,n]of Object.entries(e.books)){le(n,t,`books.${r}`),(!Array.isArray(n.bids)||!Array.isArray(n.asks))&&Q(t,`books.${r} must have bids and asks arrays`);for(let[o,i]of n.bids.entries())le(i,t,`books.${r}.bids[${o}]`),Z(i.px,t,`books.${r}.bids[${o}].px`),Z(i.sz,t,`books.${r}.bids[${o}].sz`);for(let[o,i]of n.asks.entries())le(i,t,`books.${r}.asks[${o}]`),Z(i.px,t,`books.${r}.asks[${o}].px`),Z(i.sz,t,`books.${r}.asks[${o}].sz`)}}function rv(e,t){le(e,t,"root"),kt(e.capturedAt,t,"capturedAt"),Z(e.source,t,"source"),Z(e.chain,t,"chain"),rr(e.tokens,t,"tokens"),le(e.pairs,t,"pairs"),Object.keys(e.tokens).length===0&&Q(t,"tokens must not be empty");for(let[r,n]of Object.entries(e.tokens)){Z(n.symbolRaw,t,`tokens.${r}.symbolRaw`),Z(n.mint,t,`tokens.${r}.mint`),Object.hasOwn(e.pairs,r)||Q(t,`pairs.${r} is required for token ${r}`),(!Array.isArray(e.pairs[r])||e.pairs[r].length===0)&&Q(t,`pairs.${r} must be a nonempty array`);for(let[o,i]of e.pairs[r].entries())le(i,t,`pairs.${r}[${o}]`),Z(i.pairAddress,t,`pairs.${r}[${o}].pairAddress`),Z(i.dexId,t,`pairs.${r}[${o}].dexId`),(typeof i.priceUsd!="number"||!Number.isFinite(i.priceUsd)||i.priceUsd<=0)&&Q(t,`pairs.${r}[${o}].priceUsd must be a positive finite number`),(typeof i.liquidityUsd!="number"||!Number.isFinite(i.liquidityUsd)||i.liquidityUsd<0)&&Q(t,`pairs.${r}[${o}].liquidityUsd must be a nonnegative finite number`)}}function nv(e,t){le(e,t,"root"),kt(e.capturedAt,t,"capturedAt"),Z(e.source,t,"source"),Z(e.chain,t,"chain"),e.chain!=="ton"&&Q(t,'chain must be "ton"'),rr(e.tokens,t,"tokens"),le(e.pairs,t,"pairs"),Object.keys(e.tokens).length===0&&Q(t,"tokens must not be empty");for(let[r,n]of Object.entries(e.tokens)){Z(n.symbolRaw,t,`tokens.${r}.symbolRaw`),Z(n.mint,t,`tokens.${r}.mint`),Object.hasOwn(e.pairs,r)||Q(t,`pairs.${r} is required for token ${r}`),(!Array.isArray(e.pairs[r])||e.pairs[r].length===0)&&Q(t,`pairs.${r} must be a nonempty array`);for(let[o,i]of e.pairs[r].entries())le(i,t,`pairs.${r}[${o}]`),Z(i.pairAddress,t,`pairs.${r}[${o}].pairAddress`),Z(i.dexId,t,`pairs.${r}[${o}].dexId`),(typeof i.priceUsd!="number"||!Number.isFinite(i.priceUsd)||i.priceUsd<=0)&&Q(t,`pairs.${r}[${o}].priceUsd must be a positive finite number`),(typeof i.liquidityUsd!="number"||!Number.isFinite(i.liquidityUsd)||i.liquidityUsd<0)&&Q(t,`pairs.${r}[${o}].liquidityUsd must be a nonnegative finite number`)}}function iv(e,t){let r=ah[t],n=sh(e,r),o;try{o=MA(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 ov[t](i,r),i}function ch(e){if(e!==null&&typeof e=="object"&&!Object.isFrozen(e)){Object.freeze(e);for(let t of Object.values(e))ch(t)}return e}function vc({fixtureDir:e=WA}={}){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(ah))t[r]=iv(e,r);return ch(t)}function qt(){return ih??=vc(),ih}function Ge(){return qt().venues}function uh(){return qt().universe}function lh(){return qt().oracles}function dh(){return qt().nyseHolidays}function ph(){return qt().dstTransitions}function Oi(){return qt().rhPoolState}function fh(){return qt().solanaXstocks}function mh(){return qt().tonXstocks}function hh(){return qt().hip3L2Books}var zA,WA,ah,ov,ih,ct=v(()=>{oh();zA=sh(HA(jA(import.meta.url)),"fixtures");WA=VA(),ah=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"});ov=Object.freeze({venues:KA,universe:XA,oracles:QA,nyseHolidays:YA,dstTransitions:JA,equityDexPools:ZA,rhPoolState:ev,solanaXstocks:rv,tonXstocks:nv,hip3L2Books:tv})});function cv(){let e=ph().dstTransitions.map(n=>({year:n.year,startMs:n.startUtc*_c,endMs:n.endUtc*_c}));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 Eh(){return gh??=cv(),gh}function uv(){return Ic===void 0&&(Ic=new Set(dh().holidayDayIndex)),Ic}function Ah(e,t){if(!Number.isSafeInteger(e))throw new TypeError(`${t}: epochMs must be a safe integer number of milliseconds`)}function lv(e,t){let{coverageStartMs:r,coverageEndMs:n,firstYear:o,lastYear:i}=Eh();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 dv(e){for(let t of Eh().rows)if(e>=t.startMs&&e<t.endMs)return!0;return!1}function pv(e){return dv(e)?av:sv}function fv(e){let t=e+pv(e),r=Math.floor(t/yh),n=t-r*yh,o=new Date(t);return{dayIndex:r,minuteOfDay:Math.floor(n/bh),msIntoDay:n,weekday:o.getUTCDay()}}function mv({dayIndex:e,weekday:t}){return t===0||t===6?!1:!uv().has(e)}function hv(e){return e<wh?"dark":e<kh?"extended":e<xh?"core":e<Sh?"extended":"dark"}function no(e){Ah(e,"sessionState"),lv(e,"sessionState");let t=fv(e);return mv(t)?hv(t.minuteOfDay):"dark"}function Tc(e){return Ah(e,"isDark"),no(e)==="dark"}var _c,bh,Oc,yh,sv,av,wh,kh,xh,Sh,lP,dP,gh,Ic,Ti=v(()=>{ct();_c=1e3,bh=60*_c,Oc=60*bh,yh=24*Oc,sv=-5*Oc,av=-4*Oc,wh=240,kh=570,xh=960,Sh=1200,lP=Object.freeze([wh,kh,xh,Sh]),dP=Object.freeze(["core","extended","dark"])});function Ni(e,t){e.push(Object.freeze({venue:t.venue,symbol:t.symbol??null,reason:t.reason,evidence:t.evidence??null}))}function bv(e){let t=e.raw?.vol24h;return!!(t===0||t===0||typeof t=="number"&&Number.isFinite(t)&&t<=0)}function wv(e){return!e.bid||!e.ask?!1:tr(e.bid,e.ask)>0}function vh(e,t,r){return Number.isSafeInteger(e.capturedAt)?t-e.capturedAt>r:!1}function Ri(e,t={}){if(!Array.isArray(e))throw new TypeError("quotes must be an array");let r=t.nowMs??Date.now(),n=t.quoteFreshnessMs??yv,o=t.oracleFreshnessMs??gv,i=t.includeDormant===!0,s=[],a=[];for(let c of e){if(bv(c)){i?s.push(Object.freeze({...c,staleData:!0})):Ni(a,{venue:c.venue,symbol:c.symbolRaw??c.symbol,reason:Ci.DORMANT_VENUE,evidence:{vol24h:c.raw?.vol24h??null}});continue}if(wv(c)){Ni(a,{venue:c.venue,symbol:c.symbolRaw??c.symbol,reason:Ci.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(vh(c,r,n)){Ni(a,{venue:c.venue,symbol:c.symbolRaw??c.symbol,reason:Ci.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=no(r),l=u==="core"?o:o*2;if(vh(c,r,l)){Ni(a,{venue:c.venue,symbol:c.symbolRaw??c.symbol,reason:Ci.STALE_ORACLE,evidence:{capturedAt:c.capturedAt,nowMs:r,session:u}});continue}}s.push(c)}return{survivors:s,excluded:a}}var Ci,yv,gv,Cc=v(()=>{Ze();Ti();Ci=Object.freeze({DORMANT_VENUE:"dormant-venue",CROSSED_BOOK:"crossed-book",STALE_QUOTE:"stale-quote",STALE_ORACLE:"stale-oracle"}),yv=12e4,gv=6e5});function kv(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 ke(e){return e==null?null:typeof e=="string"?z(e):typeof e!="number"||!Number.isFinite(e)?null:z(kv(e))}function ut(e,t){let r=ke(e);if(r===null)throw new TypeError(`${t} must be a finite source number`);return r}var br=v(()=>{Ze()});function ne(e,t){throw new TypeError(`${e} ${t}`)}function Oh(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function wr(e,t){Oh(e)||ne(t,"must be an object")}function Th(e,t,r){Object.hasOwn(e,t)||ne(`${r}.${t}`,"is required")}function en(e,t){(typeof e!="string"||e.length===0)&&ne(t,"must be a nonempty string")}function oo(e,t,r){t.has(e)||ne(r,`must be one of ${[...t].join(", ")}`)}function Rc(e,t){(!Number.isSafeInteger(e)||e<0)&&ne(t,"must be a nonnegative safe integer")}function Nc(e,t,r=!1){e===null&&r||(Oh(e)||ne(t,"must be a fixed point value"),typeof e.mantissa!="bigint"&&ne(`${t}.mantissa`,"must be a bigint"),(!Number.isSafeInteger(e.scale)||e.scale<0)&&ne(`${t}.scale`,"must be a nonnegative safe integer"))}function $i(e,t,r=!1){e===null&&r||wr(e,t)}function _h(e,t){wr(e,t),en(e.venue,`${t}.venue`),en(e.reason,`${t}.reason`),_v.test(e.reason)||ne(`${t}.reason`,"must be a machine readable lower case code"),Object.hasOwn(e,"symbol")&&e.symbol!==null&&en(e.symbol,`${t}.symbol`)}function De(e){wr(e,"quote");for(let r of["venue","chain","instrument","tier","symbolRaw","symbol","side","requestedSize",...Ih,"costAccounted","capturedAt","blockOrSeq","raw"])Th(e,r,"quote");en(e.venue,"quote.venue"),!(typeof e.chain=="string"&&e.chain.length>0)&&!(Number.isSafeInteger(e.chain)&&e.chain>=0)&&ne("quote.chain","must be a nonempty string or nonnegative chain id"),oo(e.instrument,xv,"quote.instrument"),oo(e.tier,Sv,"quote.tier"),en(e.symbolRaw,"quote.symbolRaw"),en(e.symbol,"quote.symbol"),oo(e.side,Ev,"quote.side"),Nc(e.requestedSize,"quote.requestedSize"),e.requestedSize.mantissa<0n&&ne("quote.requestedSize","must not be negative");let t=0;for(let r of Iv)Object.hasOwn(e,r)&&(Nc(e[r],`quote.${r}`),t+=1);t===0&&ne("quote","must contain at least one of bid, ask, mid, mark");for(let r of Ih)Nc(e[r],`quote.${r}`,!0);if(typeof e.costAccounted!="boolean"&&ne("quote.costAccounted","must be a boolean"),e.costAccounted){for(let r of["fees","gasEstimate","priceImpact"])e[r]===null&&ne(`quote.${r}`,"cannot be unknown when costAccounted is true");e.instrument==="perp"&&e.fundingHourly===null&&ne("quote.fundingHourly","cannot be unknown when costAccounted is true for a perp")}return e.instrument==="spot"&&e.fundingHourly!==null&&ne("quote.fundingHourly","must be null for a spot quote"),Rc(e.capturedAt,"quote.capturedAt"),e.blockOrSeq!==null&&!(typeof e.blockOrSeq=="string"&&e.blockOrSeq.length>0)&&!(Number.isSafeInteger(e.blockOrSeq)&&e.blockOrSeq>=0)&&ne("quote.blockOrSeq","must be null, a nonempty string, or a nonnegative safe integer"),wr(e.raw,"quote.raw"),e}function Pi(e){wr(e,"rankResult");for(let t of["rankedOn","ranked","winner","runnersUp","improvementBps","sourcesAnswered","sourcesTried","failed","excluded","darkWindow","instrumentMix","bestPreparable"])Th(e,t,"rankResult");return oo(e.rankedOn,Av,"rankResult.rankedOn"),Array.isArray(e.ranked)||ne("rankResult.ranked","must be an array"),e.ranked.forEach((t,r)=>$i(t,`rankResult.ranked[${r}]`)),$i(e.winner,"rankResult.winner",!0),e.ranked.length===0&&e.winner!==null&&ne("rankResult.winner","must be null when ranked is empty"),e.ranked.length>0&&e.winner===null&&ne("rankResult.winner","must be present when ranked is not empty"),Array.isArray(e.runnersUp)||ne("rankResult.runnersUp","must be an array"),e.runnersUp.forEach((t,r)=>$i(t,`rankResult.runnersUp[${r}]`)),e.improvementBps!==null&&!(typeof e.improvementBps=="number"&&Number.isFinite(e.improvementBps))&&ne("rankResult.improvementBps","must be a finite number or null"),Rc(e.sourcesAnswered,"rankResult.sourcesAnswered"),Rc(e.sourcesTried,"rankResult.sourcesTried"),e.sourcesAnswered>e.sourcesTried&&ne("rankResult.sourcesAnswered","must not exceed sourcesTried"),Array.isArray(e.failed)||ne("rankResult.failed","must be an array"),e.failed.forEach((t,r)=>_h(t,`failed[${r}]`)),Array.isArray(e.excluded)||ne("rankResult.excluded","must be an array"),e.excluded.forEach((t,r)=>_h(t,`excluded[${r}]`)),e.darkWindow!==null&&wr(e.darkWindow,"rankResult.darkWindow"),oo(e.instrumentMix,vv,"rankResult.instrumentMix"),$i(e.bestPreparable,"rankResult.bestPreparable",!0),Object.hasOwn(e,"carry")&&e.carry!==null&&wr(e.carry,"rankResult.carry"),e}var xv,Sv,Ev,Av,vv,Iv,Ih,_v,Lt=v(()=>{xv=new Set(["spot","perp"]),Sv=new Set(["read-only","quote-only","prepare","intent"]),Ev=new Set(["buy","sell"]),Av=new Set(["net-of-cost","gross"]),vv=new Set(["homogeneous","heterogeneous"]),Iv=["bid","ask","mid","mark"],Ih=["fees","gasEstimate","priceImpact","fundingHourly"],_v=/^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$/});function Ch(){return Ge().venues.arcus}function Nv(){return Object.keys(Ch().markets).sort()}function Rv({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=Ch().markets[n];if(!o)return null;let i=ut(o.mark,`${n}.mark`),s=ke(o.oracle),a=ke(o.fundingHourly),c=r===null?z("0"):r,u={venue:Ov,chain:Tv,instrument:"perp",tier:Cv,symbolRaw:e,symbol:n,side:t,requestedSize:c,mark:i,fees:null,gasEstimate:null,priceImpact:null,fundingHourly:a,costAccounted:!1,capturedAt:Ge().capturedAt*1e3,blockOrSeq:null,raw:{fixture:"fixtures/venues.json#venues.arcus",oraclePrice:o.oracle,vol24h:o.vol24h,oi:o.oi,fundingAnnPct:o.fundingAnnPct,category:o.category,isOutsideRth:o.isOutsideRth===!0,rth:o.rth,darkWindowFundingHourly:qi,initialMarginFraction:o.initialMarginFraction??null,offHoursInitialMarginFraction:o.offHoursInitialMarginFraction??null,reasonCostUnknown:"fees, gas, and impact at size not captured for Arcus perps"}};return s!==null&&(u.raw.oracleFixed=s),De(u)}function Li({side:e="buy",sizeUsd:t=null}={}){return Nv().map(r=>Rv({symbol:r,side:e,sizeUsd:t})).filter(r=>r!==null)}var Ov,Tv,Cv,qi,$c=v(()=>{ct();br();Ze();Lt();Ov="arcus_perp",Tv="robinhood-4663",Cv="quote-only",qi="0.00000480324074074"});function Pc(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 z("0");let n=z(String(t)),o=Ue(10000n,0);return We(We(e,n),o)}function Rh(e,t,r={}){if(e.instrument!=="perp")return{model:"current-funding-held-constant",horizonHours:t,carryBps:z("0"),carryBpsDisplay:"0",confidence:"estimate",note:"spot has no funding carry"};let n=r.nowMs??Date.now(),o=r.applyDarkWindowLock===!0,i=e.fundingHourly;if(o&&i!==null){let a=$v(n,t),c=t-a,u=z(qi),l=Pc(i,c),d=Pc(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:st(f),confidence:"estimate",darkHours:a,litHours:c,darkWindowRate:qi,compounding:"ignored",compoundingErrorBoundNote:"simple sum; at 30d and 1e-5/h the ignored compound is under 0.5bp"}}if(i===null)return{model:"current-funding-held-constant",horizonHours:t,carryBps:null,carryBpsDisplay:null,confidence:"estimate",note:"funding rate unknown"};let s=Pc(i,t);return{model:"current-funding-held-constant",horizonHours:t,carryBps:s,carryBpsDisplay:st(s),confidence:"estimate",compounding:"ignored",compoundingErrorBoundNote:"simple sum; at 30d and 1e-5/h the ignored compound is under 0.5bp"}}function $v(e,t){if(t<=0)return 0;let r=0,n=Math.floor(t);for(let o=0;o<n;o+=1)Tc(e+o*Nh)&&(r+=1);return t>n&&Tc(e+n*Nh)&&(r+=t-n),r}var Nh,OP,$h=v(()=>{Ze();$c();Ti();Nh=36e5,OP=24*365});function Pv(e){return e.mid??e.mark??e.ask??e.bid??null}function qv(e){let t=Pv(e);if(t===null)return null;let r=e.costAccounted===!0,n=z("0");e.fees!==null?n=er(n,e.fees):r=!1,e.priceImpact!==null?n=er(n,e.priceImpact):e.requestedSize&&e.requestedSize.mantissa>0n&&(r=!1),e.gasEstimate===null?r=!1:n=er(n,e.gasEstimate);let o;if(e.fees!==null&&tr(e.fees,z("1"))<0&&tr(e.fees,z("0"))>=0){let i=er(z("1"),e.fees);o=We(t,i),e.priceImpact!==null&&(o=er(o,We(t,e.priceImpact)))}else o=er(t,n);return{net:o,costAccounted:r,px:t}}function Lv(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 Bv(e,t){if(!e||!t||!e.costAccounted||!t.costAccounted||e.instrument!==t.instrument||e.net.mantissa===0n)return null;let r=ro(t.net,e.net);return at(We(r,Ue(10000n,0)),t.net,4)}function Bi(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 k=Ri(e,{nowMs:r});o=k.survivors,i=k.excluded}let s=e.length,a=[],c=t.horizonHours,u=Number.isFinite(c)&&c>0,l=[];for(let k of o){let g=qv(k);if(g===null)continue;let b=null;if(u&&k.instrument==="perp"&&(b=Rh(k,c,{nowMs:r}),b.carryBps!==null)){let S=er(z("1"),at(b.carryBps,Ue(10000n,0),12));g.net=We(g.net,S),g.costAccounted=!1}l.push(Lv(k,g,b))}let d=l,p="homogeneous";if(u)p="heterogeneous",d=l;else{let k=l.filter(b=>b.instrument==="spot"),g=l.filter(b=>b.instrument==="perp");k.length>0&&g.length>0?(d=k.length>=g.length?k:g,p="homogeneous"):(d=l,p="homogeneous")}d.sort((k,g)=>{let b=tr(k.net,g.net);return b!==0?b:k.venue<g.venue?-1:k.venue>g.venue?1:0});let f=d[0]??null,m=d.slice(1),y=d,h="gross";f&&f.costAccounted&&(m.length===0||m[0].costAccounted)&&(h="net-of-cost");let w=m.length===0?null:Bv(f,m[0]),E=l.find(k=>k.tier==="prepare")??null,_=no(r),x=_==="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=Uv(l));let I={rankedOn:h,ranked:y,winner:f,runnersUp:m,improvementBps:w===null?null:Number(st(w)),sourcesAnswered:s,sourcesTried:n,failed:a,excluded:i,darkWindow:x,instrumentMix:p,bestPreparable:E,carry:f?.carry??null,breakEvenHorizonHours:O};return Pi(I)}function Uv(e){let t=e.filter(i=>i.instrument==="spot").sort((i,s)=>tr(i.net,s.net))[0],r=e.filter(i=>i.instrument==="perp").sort((i,s)=>tr(i.net,s.net))[0];if(!t||!r||r.fundingHourly===null)return null;let n=ro(t.net,r.net);if(n.mantissa===0n)return 0;let o=We(r.fundingHourly,r.price);if(o.mantissa===0n)return null;try{let i=at(n,o,4),s=Number(st(i));return!Number.isFinite(s)||s<0?null:s}catch{return null}}var qc=v(()=>{Cc();$h();Ti();Ze();Lt()});function Lc(){return Oi()}function zv(e){return{mantissa:e*e*10n**BigInt(tn)/jv,scale:tn}}function Vv(e){let t=zv(BigInt(e.sqrtPriceX96)),r=e.quote==="USDG"?6:18,n=18;if(e.quoteIsToken0){let o=at(We(t,Ue(10n**BigInt(r),0)),Ue(10n**BigInt(n),0),tn);return o.mantissa===0n?null:at(z("1"),o,tn)}return at(We(t,Ue(10n**BigInt(n),0)),Ue(10n**BigInt(r),0),tn)}function Wv(e){let t=lh(),r=t.assets[e];return r?Ue(r.rawPrice,t.oracleScaleExp):null}function Gv(e,t){if(e===null||t===null||e.mantissa<=0n||t.mantissa<=0n)return null;let r={...e};return at(t,Kv(r,t),tn)}function Kv(e,t){let r=Math.max(e.scale,t.scale);return{mantissa:to(e,r).mantissa+to(t,r).mantissa,scale:r}}function Xv(e){let t=Lc(),r=Hv[e];return r?{wei:BigInt(t.gasPriceWei)*r,units:r,native:"ETH"}:null}function Bc(){return Object.keys(Lc().pools).sort()}function rn({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=Lc(),o=n.pools[e];if(!o)return null;let i=Vv(o);if(i===null)return null;let s=ke(o.liqUsd),a=r===null?z("0"):r,c=o.feePpm===null||o.feePpm===void 0?null:at(Ue(BigInt(o.feePpm),0),Ue(1000000n,0),8),u=a.mantissa===0n?z("0"):Gv(s,a),l=Xv(o.version),f={venue:Dv,chain:Mv,instrument:"spot",tier:Fv,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=Wv(e);return m!==null&&(f.referencePrice=m,f.referenceBasisBps=st(at(We(ro(i,m),Ue(10000n,0)),m,4))),De(f)}function Ph({side:e="buy",sizeUsd:t=null}={}){return Bc().map(r=>rn({symbol:r,side:e,sizeUsd:t})).filter(r=>r!==null)}var Dv,Mv,Fv,jv,tn,Hv,Uc=v(()=>{ct();br();Ze();Lt();Dv="rh_uniswap",Mv=4663,Fv="prepare",jv=1n<<192n,tn=18,Hv=Object.freeze({v3:180000n,v4:240000n})});function Ui(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=rn({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>qh)throw new Error(`quote is stale (${a}ms old, bound ${qh}ms); re-quote before preparing`);let u=Oi().pools[t],l=u.version==="v4"?Yv:Qv,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 qh,Qv,Yv,Dc=v(()=>{Uc();ct();qh=12e4,Qv="0x0000000000000000000000000000000000000000",Yv="0x84b75b19A3cdf8E2F56d0507d22D442847B2053C"});function io(){return Ge().venues.hyperliquid_hip3}function Lh(){return Object.keys(io().dexs).sort()}function tI(){let e=[];for(let[t,r]of Object.entries(io().dexs))for(let n of Object.keys(r))e.push(`${t}:${n}`);return e.sort()}function rI(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=io().dexs[n]?.[o];return i?[{dex:n,ticker:o,market:i}]:[]}let r=[];for(let[n,o]of Object.entries(io().dexs))Object.hasOwn(o,e)&&r.push({dex:n,ticker:e,market:o[e]});return r}function nI(e,t){try{return hh().books[`${e}:${t}`]??null}catch{return null}}function oI(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(st(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 iI(e,t,r,n){let o=oI(e,t,r);if(!o)return{impact:null,depth:null};let i=Number(st(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:ke(Number(a.toPrecision(12))),depth:{...o,impactFraction:a,fullyFilled:o.unfilledUsd<=1e-6}}}function Bh({dex:e,ticker:t,market:r,side:n,size:o}){let i=ut(r.mark,`${e}:${t}.mark`),s=ke(r.fundingHourly),a=ke(r.vol24h),c=ke(r.oi),u=o===null?z("0"):o,l=nI(e,t),d=null,p=null,f="fees and gas not captured";if(u.mantissa>0n)if(l){let h=iI(l,n,u,i);d=h.impact,p=h.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 y={venue:Jv,chain:Zv,instrument:"perp",tier:eI,symbolRaw:`${e}:${t}`,symbol:t,side:n,requestedSize:u,mark:i,fees:null,gasEstimate:null,priceImpact:d,fundingHourly:s,costAccounted:!1,capturedAt:Ge().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&&(y.raw.vol24hFixed=a),c!==null&&(y.raw.oiFixed=c),l?.bids?.[0]&&l?.asks?.[0]&&(y.bid=z(String(l.bids[0].px)),y.ask=z(String(l.asks[0].px))),De(y)}function Uh({symbol:e,side:t="buy",sizeUsd:r=null}={}){let n=rI(e);return n.length===0||n.length>1?null:Bh({...n[0],side:t,size:r})}function Di({side:e="buy",sizeUsd:t=null,ticker:r=null}={}){let n=[];for(let o of tI()){let[i,s]=o.split(":");if(r!==null&&s!==r)continue;let a=io().dexs[i][s];n.push(Bh({dex:i,ticker:s,market:a,side:e,size:t}))}return n}var Jv,Zv,eI,Dh=v(()=>{ct();br();Ze();Lt();Jv="hyperliquid_hip3",Zv="hyperliquid",eI="quote-only"});function Mh(){return Ge().venues.arcus_spot}function uI(){return Object.keys(Mh().pairs).sort()}function lI({symbol:e,side:t="buy",sizeUsd:r=null}={}){if(typeof e!="string"||e.length===0)return null;let n=Mh().pairs[e];if(!n)return null;let o=n.bid===void 0||n.bid===null?null:ut(n.bid,`${e}.bid`),i=n.ask===void 0||n.ask===null?null:ut(n.ask,`${e}.ask`),s=ke(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?z("0"):r,u=z("0"),l={venue:sI,chain:aI,instrument:"spot",tier:cI,symbolRaw:e,symbol:e,side:t,requestedSize:c,fees:u,gasEstimate:null,priceImpact:null,fundingHourly:null,costAccounted:!1,capturedAt:Ge().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),De(l)}function Mi({side:e="buy",sizeUsd:t=null}={}){return uI().map(r=>lI({symbol:r,side:e,sizeUsd:t})).filter(r=>r!==null)}var sI,aI,cI,Fh=v(()=>{ct();br();Ze();Lt();sI="arcus_spot",aI="robinhood-4663",cI="quote-only"});function Fi(){return fh()}function Mc(){return Object.keys(Fi().tokens).sort()}function mI(e){let t=Fi().pairs[e];return!t||t.length===0?null:[...t].sort((r,n)=>(n.liquidityUsd??0)-(r.liquidityUsd??0))[0]}function hI(e,t){if(e===null||t===null)return null;if(e.mantissa<=0n||t.mantissa<=0n)return z("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 Fc({symbol:e,side:t="buy",sizeUsd:r=null}={}){if(typeof e!="string"||e.length===0)return null;let n=e,o=e,i=Fi().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=mI(n);if(!s||!a)return null;let c=ut(a.priceUsd,`${n}.priceUsd`),u=ke(a.liquidityUsd),l=r===null?z("0"):r,d=l.mantissa===0n?z("0"):hI(u,l),p=!1;l.mantissa===0n&&(a.liquidityUsd??0)>=jh&&(p=!1);let f={venue:dI,chain:pI,instrument:"spot",tier:fI,symbolRaw:o,symbol:n,side:t,requestedSize:l,mid:c,fees:null,gasEstimate:null,priceImpact:d,fundingHourly:null,costAccounted:p,capturedAt:Fi().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)<jh}};return De(f)}function Hh({side:e="buy",sizeUsd:t=null}={}){return Mc().map(r=>Fc({symbol:r,side:e,sizeUsd:t})).filter(r=>r!==null)}var dI,pI,fI,jh,zh=v(()=>{ct();br();Ze();Lt();dI="solana_xstocks",pI="solana",fI="quote-only",jh=25e3});function ji(){return mh()}function jc(){return Object.keys(ji().tokens).sort()}function xI(e){let t=ji().pairs[e];return!t||t.length===0?null:[...t].sort((r,n)=>(n.liquidityUsd??0)-(r.liquidityUsd??0))[0]}function SI(e,t){if(e===null||t===null)return null;if(e.mantissa<=0n||t.mantissa<=0n)return z("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 Hc({symbol:e,side:t="buy",sizeUsd:r=null}={}){if(typeof e!="string"||e.length===0)return null;let n=e,o=e,i=ji().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=xI(n);if(!s||!a)return null;let c=ut(a.priceUsd,`${n}.priceUsd`),u=ke(a.liquidityUsd),l=r===null?z("0"):r,d=l.mantissa===0n?z("0"):SI(u,l),f={venue:yI,chain:gI,instrument:"spot",tier:bI,symbolRaw:o,symbol:n,side:t,requestedSize:l,mid:c,fees:null,gasEstimate:null,priceImpact:d,fundingHourly:null,costAccounted:!1,capturedAt:ji().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)<wI,impactSizeFractionHint:kI}};return De(f)}function Vh({side:e="buy",sizeUsd:t=null}={}){return jc().map(r=>Hc({symbol:r,side:e,sizeUsd:t})).filter(r=>r!==null)}var yI,gI,bI,wI,kI,Wh=v(()=>{ct();br();Ze();Lt();yI="ton_stonfi",gI="ton",bI="quote-only",wI=25e3,kI=.01});var Hi={};H(Hi,{bestEquityRoute:()=>EI,collectEquityQuotes:()=>Kh,equityVenues:()=>AI,getUniverse:()=>uh,getVenues:()=>Ge,loadFixtures:()=>vc,prepareEquity:()=>Ui,prepareEquityRoute:()=>vI,rankEquityQuotes:()=>Bi,toJsonSafe:()=>II,validateQuote:()=>De,validateRankResult:()=>Pi});function zc(e){return e==null||e===""?null:typeof e=="object"&&e&&typeof e.mantissa=="bigint"?e:z(String(e))}function Kh(e,{sizeUsd:t=null}={}){if(typeof e!="string"||!e.trim())throw new TypeError("ticker is required");let r=e.trim().toUpperCase(),n=zc(t),o=[],i=Uh({symbol:`xyz:${r}`,sizeUsd:n});if(i)o.push(i);else for(let u of Di({ticker:r,sizeUsd:n}))o.push(u);for(let u of Li({sizeUsd:n}))u.symbol===r&&o.push(u);for(let u of Mi({sizeUsd:n}))u.symbol===r&&o.push(u);let s=rn({symbol:r,sizeUsd:n});s&&o.push(s);let a=Fc({symbol:r,sizeUsd:n});a&&o.push(a);let c=Hc({symbol:r,sizeUsd:n});return c&&o.push(c),o}function EI(e={}){let t=String(e.ticker||e.symbol||"").trim().toUpperCase();if(!t)throw new Error("bestEquityRoute requires ticker");let r=zc(e.sizeUsd??e.size??null),n=Kh(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=Bi(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>Gh}}function AI(){let e=[{venue:"hyperliquid_hip3",tier:"quote-only",chain:"hyperliquid",n:Di().length},{venue:"arcus_perp",tier:"quote-only",chain:"robinhood-4663",n:Li().length},{venue:"arcus_spot",tier:"quote-only",chain:"robinhood-4663",n:Mi().length},{venue:"rh_uniswap",tier:"prepare",chain:4663,n:Bc().length},{venue:"solana_xstocks",tier:"quote-only",chain:"solana",n:Mc().length},{venue:"ton_stonfi",tier:"quote-only",chain:"ton",n:jc().length}],t=[...Di(),...Li(),...Mi(),...Ph(),...Hh(),...Vh()],r=(t[0]?.capturedAt??Date.now())+1e3,{survivors:n,excluded:o}=Ri(t,{nowMs:r});return{inventory:e,hip3Dexs:Lh(),liveness:{survivors:n.length,excluded:o.length,byReason:o.reduce((i,s)=>(i[s.reason]=(i[s.reason]??0)+1,i),{})},capturedAt:Ge().capturedAt,custody:"prepare-only",note:"quote-only venues are ranked for discovery; only rh_uniswap is preparable in v1"}}function vI(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=zc(e.sizeUsd??e.size??null),o=rn({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=Ui({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>Gh}}catch(i){return{ok:!1,failureKind:"prepare-refused",ticker:t,error:String(i.message||i)}}}function II(e){return JSON.parse(JSON.stringify(e,(t,r)=>typeof r=="bigint"?r.toString():r))}var Gh,zi=v(()=>{Ze();qc();Dc();Cc();Dh();Fh();$c();Uc();zh();Wh();ct();qc();Dc();Lt();ct();Gh=3600*1e3});var Vi={};H(Vi,{CHAIN_CONFIGS:()=>Vn,EVIDENCE:()=>M,RISK:()=>B,SCANNER_CAPABILITIES:()=>jr,__clearScanners:()=>cS,createScanner:()=>Fp,getScanner:()=>La,listScanners:()=>jp,registerBuiltinScanners:()=>bi,registerCustomChain:()=>Jf,registerScanner:()=>oi,scannerCoverage:()=>uS,validateScanner:()=>Mp});var Wi=v(()=>{Qt();wi()});var Gc={};H(Gc,{createWatch:()=>NI,listWatches:()=>CI,removeWatch:()=>RI});import so from"node:fs";import Vc from"node:path";import{randomUUID as _I}from"node:crypto";import{homedir as OI}from"node:os";function TI(e=process.env){return e.ORACLE_CONFIG_DIR||Vc.join(OI(),".config","oracle")}function Xh(e=process.env){return Vc.join(TI(e),"watches.json")}function Wc(e=process.env){let t=Xh(e);if(!so.existsSync(t))return{watches:[]};try{let r=JSON.parse(so.readFileSync(t,"utf8"));return{watches:Array.isArray(r.watches)?r.watches:[]}}catch{return{watches:[]}}}function Qh(e,t=process.env){let r=Xh(t);so.mkdirSync(Vc.dirname(r),{recursive:!0,mode:448});let n=`${r}.${process.pid}.tmp`;so.writeFileSync(n,`${JSON.stringify(e,null,2)}
9
- `,{mode:384}),so.renameSync(n,r)}function CI(e=process.env){return Wc(e).watches}function NI({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:_I(),chain:String(e),token:String(t),condition:String(r),note:n?String(n):null,actionMode:"alert_only",createdAt:new Date().toISOString()},s=Wc(o);return s.watches.push(i),Qh(s,o),i}function RI(e,t=process.env){let r=Wc(t),n=r.watches.filter(o=>o.id!==e);return n.length===r.watches.length?!1:(Qh({watches:n},t),!0)}var Kc=v(()=>{});var Yh={};H(Yh,{classifyReceipt:()=>$I});function $I(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 Jh=v(()=>{});function UI(e){return!(BI.has(e)||/^0x/i.test(e)||!/\d/.test(e)&&e===e.toLowerCase()||!/\d/.test(e)&&e===e.toUpperCase())}function Zh(e,{extras:t=[]}={}){let r=[e,...t].map(i=>String(i||"")).join(`
10
- `),n=[...new Set((r.match(PI)||[]).map(i=>i.toLowerCase()))].filter(i=>!LI.has(i)),o=[...new Set(r.match(qI)||[])].filter(UI);return{evm:n,solana:o,all:[...n.map(i=>({chainFamily:"evm",address:i})),...o.map(i=>({chainFamily:"solana",address:i}))]}}function ey(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 PI,qI,LI,BI,ty=v(()=>{PI=/\b0x[a-fA-F0-9]{40}\b/g,qI=/\b[1-9A-HJ-NP-Za-km-z]{32,44}\b/g,LI=new Set(["0x0000000000000000000000000000000000000000","0x000000000000000000000000000000000000dead","0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee"].map(e=>e.toLowerCase())),BI=new Set(["So11111111111111111111111111111111111111112","EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v","Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB","11111111111111111111111111111111"])});import{spawnSync as DI}from"node:child_process";import ry from"node:fs";import Xc from"node:path";function HI(e=process.env){let t=String(e.ORACLE_XURL_ENABLED||"").trim().toLowerCase();return t==="1"||t==="true"||t==="yes"||t==="on"}function iy(e=process.env){let t=String(e.ORACLE_XURL_ALLOW_WRITE||"").trim().toLowerCase();return t==="1"||t==="true"||t==="yes"||t==="on"}function zI(e=process.env){let t=String(e.ORACLE_XURL_BIN||"").trim();if(t)return Xc.isAbsolute(t)?ry.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(Xc.delimiter)){if(!n)continue;let o=Xc.join(n,"xurl");try{if(ry.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 VI(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 WI(e){for(let t of e){let r=String(t);if(oy.includes(r))return r;if(oy.some(n=>n.startsWith("--")&&r.startsWith(`${n}=`)))return r.split("=")[0]}return null}function GI(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=WI(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(!iy(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(!FI.includes(o))if(jI.includes(o)){if(!iy(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 sy(e,t={},r={}){if(e!=="xurl")return{ok:!1,error:`unknown tool: ${e}`};let n=r.env||process.env;if(!HI(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=GI(t,n);if(!o.ok)return o;let i=zI(n);if(!i.ok)return i;let a=(r.spawnFn||DI)(i.bin,o.argv,{encoding:"utf8",timeout:r.timeoutMs||ny,maxBuffer:1024*1024,env:VI(n)});if(a.error){let d=a.error.code==="ETIMEDOUT"?`xurl timed out after ${r.timeoutMs||ny}ms`:String(a.error.message||a.error);return{ok:!1,error:sr(d,{force:!0})}}let c=sr(String(a.stdout||"").slice(0,MI),{force:!0}),u=sr(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 ny,MI,FI,jI,oy,Fq,ay=v(()=>{Es();ny=45e3,MI=4e4,FI=Object.freeze(["whoami","user","read","search","timeline","mentions","bookmarks","likes","following","followers","dms","auth"]),jI=Object.freeze(["post","reply","quote","delete","like","unlike","repost","unrepost","bookmark","unbookmark","follow","unfollow","block","unblock","mute","unmute","dm"]),oy=Object.freeze(["--verbose","-v","--trace","-t","--bearer-token","--consumer-key","--consumer-secret","--access-token","--token-secret","--client-id","--client-secret"]);Fq=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 YI(e){return!e||e==="0x"||e===QI}async function cy(e={},t={}){let r=t.rpcCall||ee,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(y){return{address:n,chainId:o,status:"unavailable",error:y?.message||"eth_getCode failed",risk:"unknown-risk",findings:[],isProxy:!1,codeSize:0,notes:["could not read contract code; treat as unverified"]}}if(!i||i==="0x")return{address: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[y,h]of Object.entries(KI))c.includes(y)&&a.push({selector:`0x${y}`,...h});let u=!1,l=null,d=null,p=await Promise.all(XI.map(async({label:y,slot:h})=>{try{let w=await r(o,"eth_getStorageAt",[n,h,"latest"],t);return{label:y,word:w,error:null}}catch{return{label:y,word:null,error:`proxy slot (${y}) unreadable; proxy status uncertain`}}}));for(let y of p)y.error&&s.push(y.error),!u&&y.word&&!YI(y.word)&&(u=!0,l=y.label,d=`0x${String(y.word).slice(-40)}`);u&&(a.push({selector:l,name:"proxy",weight:"high",note:"implementation is upgradeable \u2014 current behaviour is not a guarantee"}),s.push(`bytecode scan covers the proxy (${l}), not the implementation ${d} it delegates to`));let m=a.filter(y=>y.weight==="high").length>0?"high":a.length>0?"elevated":"unknown-risk";return m==="unknown-risk"&&s.push("no owner-power selectors found; this is weak evidence, not a safety guarantee"),{address:n,chainId:o,status:"ok",risk:m,findings:a,isProxy:u,proxyStandard:l,implementation:d,codeSize:Math.floor(c.length/2),notes:s}}var KI,XI,QI,uy=v(()=>{$t();KI=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"}}),XI=Object.freeze([{label:"eip1967",slot:"0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc"},{label:"zeppelinos",slot:"0x7050c9e0f4ca769c69bd3a8ef740bc37934f8e2c036e5a723fd8ee048ed3f8c3"},{label:"eip1822",slot:"0xc5f16f0fcc639fa48a6947836d9850f504798523bf8c9a3a87d5876cf622bcf7"}]),QI=`0x${"0".repeat(64)}`});function Gi(e,t){let r=String(e||"").trim();if(!JI.test(r))throw new Error(`evm-token-sniper: ${t} must be a 0x EVM address`);return r}function Qc(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 ao(e,t){return e==null||e===""?null:Qc(e,t)}function e_({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=Gi(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=Qc(l.value??n,"prepared native value");if(BigInt(f)!==BigInt(n))throw new Error("local-signer envelope requires native value equal amountIn");let m=ao(l.gasLimit??c.gasLimit,"gasLimit"),y=ao(l.maxFeePerGas??c.maxFeePerGas,"maxFeePerGas");if(!m||!y)throw new Error("local-signer envelope requires explicit gasLimit and maxFeePerGas caps");let h=Number(u.nowMs??Date.now()),w=Math.min(6e4,Math.max(1e3,Number(c.ttlMs??c.expiresInMs??3e4)||3e4)),E=ga({chainId:e,venue:"uniswap-v3",quoteAmountOut:i?.amountOut,liquidityUsd:s?.liquidityUsd,requestedCapBps:c.slippageBps??50,quotedAtMs:h,ttlMs:w,secret:u.routeAttestationSecret}),_=ze(E,{chainId:e,venue:"uniswap-v3",data:p,secret:u.routeAttestationSecret}),x={chainId:e,from:o,to:d,data:p,value:f,gasLimit:m,maxFeePerGas:y,slippageBps:_.selectedBps,expiresAtMs:h+w},O=ao(l.maxPriorityFeePerGas??c.maxPriorityFeePerGas,"maxPriorityFeePerGas");return O&&(x.maxPriorityFeePerGas=O),c.nonce!==void 0&&(x.nonce=Number(c.nonce)),(c.txType!==void 0||O)&&(x.type=Number(c.txType??2)),c.l1FeeWei!==void 0&&(x.l1FeeWei=ao(c.l1FeeWei,"l1FeeWei")??"0"),c.operatorFeeWei!==void 0&&(x.operatorFeeWei=ao(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:h+w,fee:{oracleFeeBps:5},autoSlippage:_,artifact:{chainId:e,owner:o,transactions:[x]},meta:{source:"evm-token-sniper",tokenIn:r,tokenOut:t}}}function t_(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}bi();let r=La(e);if(!r)throw new Error(`evm-token-sniper: unsupported EVM chainId ${e}`);return r}function r_({token:e,pools:t,structuralRisk:r,scannerRisk:n,sellability:o,quote:i,args:s,scanner:a}){let c=[];return e?.evidence!==M.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!==B.PASS&&c.push(`scanner risk verdict is ${n?.verdict||"UNKNOWN"}`),a.supports?.("sellSimulation")?o?.verdict!==B.PASS&&c.push(`sellability verdict is ${o?.verdict||"UNKNOWN"}`):c.push("sell simulation is unavailable on this chain"),a.supports?.("quote")?i?.evidence!==M.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 ly(e={},t={}){let r=Number(e.chainId??ZI);if(!Number.isInteger(r)||r<=0)throw new Error("evm-token-sniper: chainId must be a positive integer");let n=Gi(e.tokenAddress||e.address||e.token,"tokenAddress"),o=e.tokenIn?Gi(e.tokenIn,"tokenIn"):null,i=e.recipient?Gi(e.recipient,"recipient"):null,s=e.amountIn==null?null:Qc(e.amountIn,"amountIn"),a=t_(r,t.scanner),c=t.scanContractRisk||cy,[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 y={...e,tokenIn:o,amountIn:s,recipient:i},h=r_({token:u,pools:l,structuralRisk:d,scannerRisk:p,sellability:f,quote:m,args:y,scanner:a}),w=null,E=null,_=null;if(e.prepare===!0&&h.length===0){w=await a.prepareUnsignedTx({tokenIn:o,tokenOut:n,amountIn:s,recipient:i,slippageBps:e.slippageBps??50,fee:m?.fee});try{E=e_({chainId:r,tokenAddress:n,tokenIn:o,amountIn:s,recipient:i,quote:m,topPool:l?.pools?.[0]||null,unsignedTx:w,args:e,opts:t})}catch(x){_=String(x?.message||x).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:h,prepared:!!w,unsignedTx:w,localSignerEnvelope:E,localSignerBlockedReason:_,signed:E?"pending-local-signer":!1,broadcast:E?"pending-local-signer":!1}}var JI,ZI,dy=v(()=>{wi();Qt();rt();uy();JI=/^0x[0-9a-fA-F]{40}$/,ZI=4663});var yy={};H(yy,{evaluateContracts:()=>hy,fetchAccountTweets:()=>my,snipeExecuteEnabled:()=>py,tickTwitterCaWatch:()=>c_,twitterSnipeEmitsCard:()=>u_});function py(e=process.env){return String((e||process.env).ORACLE_SNIPE_EXECUTE||"").trim()==="1"}function fy(e){return String(e||"").trim().replace(/^@/,"")}async function my({handle:e,limit:t=5,xurlFn:r=sy}={},n={}){let o=fy(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:ey(i.stdout),raw:i}:{ok:!1,error:i?.error||"xurl search failed",tweets:[]}}async function s_(e,{chainId:t,amountIn:r,tokenIn:n,recipient:o,prepare:i},s){let a=await ly({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 a_(e,t){let r=await Ap(e,{chainSlug:"solana",stables:[o_,i_]},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 hy(e,t={},r={}){let n=Number(t.chainId??n_),o=[];for(let i of e.evm||[])o.push(await s_(i,{...t,chainId:n},r));for(let i of e.solana||[])o.push(await a_(i,r));return o}async function c_(e={},t={}){let r=fy(e.handle),n=e.seen instanceof Set?e.seen:new Set(e.seen||[]),o=await my({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=Zh(a.text,{extras:a.urls||[]});if(!u.all.length){n.add(c);continue}let d=await(t.evaluateFn||hy)(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:py(t.env||process.env),hits:i,seen:[...n]}}function u_(e={}){return!e||typeof e!="object"||e.source==="twitter-ca-watch"||e.automated===!0||e.card===!1||e.notify===!1,!1}var n_,o_,i_,gy=v(()=>{ty();ay();dy();$n();ko();n_=4663,o_="EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",i_="Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB"});import{wordlists as l_}from"ethers";function m_(e){let t=String(e).trim().toLowerCase().split(/\s+/).filter(Boolean);return f_.has(t.length)&&t.every(r=>l_.en.getWordIndex(r)>=0)}function b_(e){let t=by(e);return g_.has(t)||y_.test(t)}function by(e){return String(e).replace(/[^a-z0-9]/gi,"").toLowerCase()}function w_(e){let t=by(e);return[...d_].some(r=>t.includes(r))}function k_(e,t,r){if(typeof t=="string"){if(p_.some(n=>n.test(t))||m_(t))throw new co(r);if(h_.test(t)&&!b_(e))throw new co(r)}}function Ki(e,t="$",r=""){if(e==null||typeof e=="boolean")return e;if(typeof e=="string")return k_(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)=>Ki(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(w_(o))throw new co(i);e[o]!==void 0&&(n[o]=Ki(e[o],i,o))}return n}function W(e){return Ki(e)}function Yc(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(Yc).join(",")}]`:`{${Object.keys(e).map(t=>`${JSON.stringify(t)}:${Yc(e[t])}`).join(",")}}`}function uo(e){return Yc(Ki(e))}var d_,p_,f_,h_,y_,g_,co,nn=v(()=>{d_=new Set(["privatekey","privkey","secretkey","seedphrase","seed","mnemonic","passphrase","password","keystore","keymaterial","wif","xprv","xpriv","bearer","authorization","signature","apikey","credential"]),p_=[/\b[5KL][1-9A-HJ-NP-Za-km-z]{50,51}\b/,/\bxprv[0-9A-Za-z]{50,}\b/],f_=new Set([12,15,18,21,24]);h_=/^\s*(?:0x)?[0-9a-fA-F]{64}\s*$/,y_=/(hash|digest|root|salt|nonce|proof|commitment|sig|id)(?:e?s)?$/i,g_=new Set(["calldata","data","publickey","pubkey","message","payload","input","extradata"]);co=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 x_,chmod as Xi,readFile as S_,rename as E_,writeFile as A_}from"node:fs/promises";import{homedir as v_}from"node:os";import{dirname as wy,join as Jc}from"node:path";import I_ from"sql.js";function Ji(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(Ji).join(",")}]`:`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${Ji(e[t])}`).join(",")}}`}function ky(e){if(!__.has(e))throw new TypeError(`unknown artifact type: ${e}`);return e}function Qi(e){let t=[];for(;e.step();)t.push(e.getAsObject());return e.free(),t}function Yi(e){return e?{id:e.id,type:e.type,createdAt:e.created_at,data:JSON.parse(e.data_json)}:null}async function xy(e={}){let t=e.path||C_;await x_(wy(t),{recursive:!0,mode:448}),await Xi(wy(t),448);let r;try{r=await S_(t)}catch(u){if(u.code!=="ENOENT")throw u}let n=await I_(e.sqlJs||{}),o=r?new n.Database(r):new n.Database;o.run(`
5
+ ${JSON.stringify(n??[])}`}async function ww(e,t,n){return C(e,{method:"POST",body:t,fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs??12e3,signal:n.signal})}async function te(e,t,n=[],r={}){let o=String(t||""),i=hw(o),s=fw(e,r);if(!s)throw new Error(`No RPC URL for chainId ${e} (set env from chain registry rpcEnv or pass rpcUrl)`);if(i==="eth_chainid"&&r.cacheChainId!==!1){let l=Pl.get(s);if(l!=null)return l}let c=r.dedupe!==!1&&!r.signal?bw(s,o,n):null;if(c&&_r.has(c))return _r.get(c);let u=(async()=>{let l=await ww(s,{jsonrpc:"2.0",id:1,method:t,params:n},r),d=gw(l);return i==="eth_chainid"&&typeof d=="string"&&Pl.set(s,d),d})();return c&&(_r.set(c,u),u.finally(()=>{_r.get(c)===u&&_r.delete(c)}).catch(()=>{})),u}async function jo(e,t={}){let n=await te(e,"eth_blockNumber",[],t);return parseInt(n,16)}async function Ll(e,t={}){let n=await te(e,"eth_gasPrice",[],t);if(n==null)return null;try{return BigInt(n)}catch{return null}}async function $l(e,t,n={}){if(!t)throw new Error("rpcGetBalance requires address");let r=await te(e,"eth_getBalance",[t,"latest"],n);return{chainId:Number(e),address:t,balanceWei:BigInt(r).toString(),balanceHex:r}}async function ql(e={},t={}){let n=Number(e.chainId??t.chainId??1),r=Or(e.token||e.tokenAddress,"token"),o=Or(e.owner,"owner"),i=Or(e.spender,"spender"),s=Fo.encodeFunctionData("allowance",[o,i]),a=await te(n,"eth_call",[{to:r,data:s},e.blockTag||"latest"],t),c=Fo.decodeFunctionResult("allowance",a),u=BigInt(c[0]);return{chainId:n,token:r,owner:o,spender:i,allowance:u.toString(),allowanceHex:`0x${u.toString(16)}`,blockTag:e.blockTag||"latest"}}async function Bl(e={},t={}){let n=Number(e.chainId??t.chainId??1),r=Or(e.token||e.tokenAddress,"token"),o=Or(e.account||e.owner||e.address,"account"),i=Fo.encodeFunctionData("balanceOf",[o]),s=await te(n,"eth_call",[{to:r,data:i},e.blockTag||"latest"],t),a=Fo.decodeFunctionResult("balanceOf",s),c=BigInt(a[0]);return{chainId:n,token:r,account:o,balance:c.toString(),balanceHex:`0x${c.toString(16)}`,blockTag:e.blockTag||"latest"}}var Fo,pw,mw,_r,Pl,ot=O(()=>{G();na();Fo=new lw(["function allowance(address owner,address spender) view returns (uint256)","function balanceOf(address account) view returns (uint256)"]);pw={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"};mw=/^(?:eth_(?:call|blocknumber|chainid|get[a-z0-9]+|feehistory|gasprice|maxpriorityfeepergas|syncing|protocolversion|estimategas|createaccesslist)|net_(?:version|listening|peercount)|web3_(?:clientversion|sha3))$/;_r=new Map,Pl=new Map});function Ul(e,t){let n=String(e||"").toLowerCase(),r=String(t?.quote||t?.quoteToken?.address||"").toLowerCase(),o=String(t?.base||t?.baseToken?.address||"").toLowerCase();return r===n?{address:t.base||t.baseToken?.address,symbol:t.baseToken?.symbol}:o===n?{address:t.quote||t.quoteToken?.address,symbol:t.quoteToken?.symbol}:{address:t.quote||t.quoteToken?.address,symbol:t.quoteToken?.symbol}}function Ho(e,t=[],{stables:n=[],wrappedNative:r=null}={}){let o=String(e||"").toLowerCase(),i=new Set((n||[]).map(c=>String(c).toLowerCase())),s=String(r||"").toLowerCase(),a=(t||[]).map((c,u)=>{let l=Ul(o,c),d=String(l.address||"").toLowerCase(),f=String(l.symbol||"").toLowerCase(),p=Number(c.liquidityUsd??c.liquidity?.usd),m=Number.isFinite(p)?p:0,y=String(c.dex||c.dexId||"").toLowerCase(),h=0;return i.has(d)||Ew.has(f)?h=300:s&&d===s&&(h=100),y.includes("v4")?h+=20:y.includes("v3")?h+=10:(y.includes("v2")||y.includes("raydium")||y.includes("orca")||y.includes("meteora"))&&(h+=8),{pool:c,score:h*1e12+m,index:u,otherAddr:d,liquidityUsd:m}});return a.sort((c,u)=>u.score-c.score||c.index-u.index),a.map(c=>c.pool)}function Ml(e,t=[]){let n=Array.isArray(t)?t:[];return n.length&&Ul(e,n[0]).address||null}var Ew,ra=O(()=>{Ew=new Set(["usdc","usdt","usdg","dai","usd1","usde","pyusd"])});function xw(e,t,n){let r=it(t),o=it(n),i=it(e?.baseToken?.address),s=it(e?.quoteToken?.address);return i===r&&s===o||i===o&&s===r}function kw(e){let t=Number(e?.liquidity?.usd);return Number.isFinite(t)&&t>=0?t:null}function Iw(e={}){return(e.baseUrl||process.env.DEXSCREENER_API_URL||Sw).replace(/\/$/,"")}async function zo(e,t={}){if(!e)throw new Error("tokenAddress required");return C(`${Iw(t)}/latest/dex/tokens/${e}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3})}async function Dl({chainId:e,tokenA:t,tokenB:n,dexIds:r=[]}={},o={}){return(await Tr({chainId:e,tokenA:t,tokenB:n,dexIds:r},o))[0]??null}async function Tr({chainId:e,tokenA:t,tokenB:n,dexIds:r=[]}={},o={}){if(e==null||!t||!n)throw new Error("chainId, tokenA, and tokenB required");let i=it(vw[Number(e)]||e),s=new Set(Aw(r).filter(Boolean).map(it)),a=[...new Set([t,n].map(f=>String(f)).filter(Boolean))],c=await Promise.allSettled(a.map(f=>zo(f,{...o,baseUrl:o.dexscreenerBaseUrl,timeoutMs:o.dexscreenerTimeoutMs??Math.min(Number(o.timeoutMs??4e3),4e3)}))),u=new Set,l=[];for(let f of c)if(f.status==="fulfilled")for(let p of f.value?.pairs||f.value?.data?.pairs||[]){let m=`${it(p?.chainId)}:${it(p?.dexId)}:${it(p?.pairAddress)}`;u.has(m)||(u.add(m),l.push(p))}return l.filter(f=>it(f?.chainId)===i).filter(f=>xw(f,t,n)).filter(f=>!s.size||s.has(it(f?.dexId))).map(f=>({pairAddress:f.pairAddress??null,dexId:f.dexId??null,chainId:f.chainId??null,liquidityUsd:kw(f),pairCreatedAt:f.pairCreatedAt??null})).filter(f=>f.liquidityUsd!=null).sort((f,p)=>p.liquidityUsd-f.liquidityUsd)}async function Fl(e,{chainSlug:t="solana",stables:n=_w}={},r={}){let o=await zo(e,r),s=(o?.pairs||o?.data?.pairs||[]).filter(c=>String(c.chainId).toLowerCase()===String(t).toLowerCase()).map(c=>({pair:c.pairAddress,dex:c.dexId,dexId:c.dexId,base:c.baseToken?.address,quote:c.quoteToken?.address,baseToken:c.baseToken,quoteToken:c.quoteToken,liquidityUsd:c.liquidity?.usd??null,priceUsd:c.priceUsd??null,volume24hUsd:c.volume?.h24??null,createdAt:c.pairCreatedAt??null})),a=Ho(e,s,{stables:n});return{chain:t,token:e,pools:a,topPool:a[0]||null}}var Sw,vw,it,Aw,_w,Cr=O(()=>{G();ra();Sw="https://api.dexscreener.com",vw=Object.freeze({1:"ethereum",10:"optimism",56:"bsc",137:"polygon",8453:"base",42161:"arbitrum",43114:"avalanche",999:"hyperevm",4663:"robinhood"}),it=e=>String(e??"").toLowerCase(),Aw=e=>Array.isArray(e)?e:e==null?[]:[e];_w=["EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v","Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB"]});import{readFileSync as Ow}from"node:fs";import{homedir as Tw}from"node:os";import{join as Vo}from"node:path";function Cw(){if(process.env.ORACLE_TEST_ISOLATE_SECRETS==="1"){let n=(process.env.ORACLE_EXEC_ENV_FILE||"").trim();return n?[n]:[]}let e=(process.env.ORACLE_EXEC_ENV_FILE||process.env.MAD_EXEC_ENV_FILE||"").trim(),t=Tw();if(process.env.ORACLE_PUBLIC_DESKTOP==="1"){let n=(process.env.ORACLE_CONFIG_DIR||Vo(t,".config","oracle")).trim();return[e,Vo(n,"exec.env")].filter(Boolean)}return[e,Vo(t,".config","oracle","exec.env"),Vo(t,".config","mad-desk","exec.env")].filter(Boolean)}function jl(e,t,n){let r=e??process.env[t]??process.env[n];if(!String(r||"").trim())for(let o of Cw())try{let i=Ow(o,"utf8"),s=i.match(new RegExp(`^${t}=(.*)$`,"m"))||i.match(new RegExp(`^${n}=(.*)$`,"m"));if(s&&(r=s[1].trim(),r))break}catch{}if(!String(r||"").trim())throw new Error(`${t} required for attestation. Set it in the environment, or place ${t}=<value> in ~/.config/oracle/exec.env`);return r}var Hl=O(()=>{});var zl=O(()=>{});import{createHash as Nw,createHmac as Wl,timingSafeEqual as Rw}from"node:crypto";function Wo(e){return Array.isArray(e)?`[${e.map(Wo).join(",")}]`:e&&typeof e=="object"?`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${Wo(e[t])}`).join(",")}}`:JSON.stringify(e??null)}function Gl(e,{required:t=!1}={}){try{return jl(e,"ORACLE_ROUTE_ATTESTATION_SECRET","MAD_ROUTE_ATTESTATION_SECRET")}catch(n){if(t)throw n;return null}}function ia(e){let{signature:t,...n}=e;return n}function Kl(e,{secret:t}={}){let n=Gl(t);return n?{...e,signature:Wl("sha256",n).update(Wo(ia(e))).digest("hex")}:e}function Pw(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 Nw("sha256").update(Buffer.from(t.slice(2),"hex")).digest("hex")}function Ve(e,{chainId:t,venue:n,data:r,secret:o}={}){if(!e||e.mode!=="auto")throw new Error("bounded auto-slippage guard required");if(Number(e.chainId)!==Number(t))throw new Error("auto-slippage guard chain mismatch");if(String(e.venue).toLowerCase()!==String(n||"").toLowerCase())throw new Error("auto-slippage guard venue mismatch");let i=Gl(o);if(i){let p=Wl("sha256",i).update(Wo(ia(e))).digest("hex");if(!Lw(e.signature,p))throw new Error("auto-slippage guard signature mismatch \u2014 refusing to bind a guard this Oracle did not issue")}let s=Number(e.selectedBps),a=Number(e.capBps);if(!Number.isInteger(s)||s<0||s>Lt||!Number.isInteger(a)||a<0||a>Lt||s>a)throw new Error("auto-slippage guard bounds are invalid");let c=BigInt(e.quoteAmountOut??0),u=BigInt(e.minAmountOut??0);if(c<=0n||u<=0n)throw new Error("auto-slippage guard amounts must be positive");let l=c*BigInt(1e4-s),d=l/10000n;if(l%10000n!==0n&&(d+=1n),u<d)throw new Error("auto-slippage guard is under-protected relative to its quote");let f=qw(r);if(f!=null&&f!==u)throw new Error(`auto-slippage: calldata encodes floor ${f}, not the guard floor ${u} \u2014 refusing to bind`);return Kl({...ia(e),calldataHash:Pw(r)},{secret:o})}function Lw(e,t){let n=Buffer.from(String(e??""),"utf8"),r=Buffer.from(String(t??""),"utf8");return n.length!==r.length||n.length===0?!1:Rw(n,r)}function oa(e,t=0){let n=Number(e);return Number.isFinite(n)?n:t}function $w(e){let t=e==null?Lt:Number(e);if(!Number.isInteger(t)||t<0)throw new Error("auto-slippage cap must be a non-negative integer bps value");return Math.min(t,Lt)}function $t({liquidityUsd:e,priceChange5m:t=0,quoteAgeMs:n=0,crossChain:r=!1,requestedCapBps:o}={}){let i=oa(e,0),s=i>0?i>=25e4?5:i>=1e5?10:i>=5e4?20:i>=1e4?40:70:r?30:10,a=Math.min(60,Math.abs(oa(t,0))*2),c=Math.min(40,Math.floor(Math.max(0,oa(n,0))/5e3)*5),u=Math.max(25,Math.ceil(20+s+a+c)),l=$w(o);return{mode:"auto",requiredBps:u,selectedBps:Math.min(u,l),capBps:l,executable:u<=l}}function sa({chainId:e,venue:t,quoteAmountOut:n,liquidityUsd:r,priceChange5m:o=0,quoteAgeMs:i=0,crossChain:s=!1,requestedCapBps:a,quotedAtMs:c=Date.now(),ttlMs:u=Vl,secret:l}={}){let d=BigInt(n??0);if(d<=0n)throw new Error("auto-slippage guard requires positive quoteAmountOut");let f=$t({liquidityUsd:r,priceChange5m:o,quoteAgeMs:i,crossChain:s,requestedCapBps:a});if(!f.executable)throw new Error(`auto-slippage requires ${f.requiredBps} bps above hard/requested cap ${f.capBps}; route blocked`);let p=Number(c);if(!Number.isFinite(p))throw new Error("auto-slippage: quotedAtMs must be a finite number");let m=Math.min(3e4,Math.max(1e3,Number(u)||Vl)),y=d*BigInt(1e4-f.selectedBps),h=y/10000n;if(y%10000n!==0n&&(h+=1n),h>d&&(h=d),d>0n&&h<=0n)throw new Error(`auto-slippage: quote ${d} is too small to express a ${f.selectedBps} bps floor without rounding to zero`);let w=Number((d-h)*10000n/(d===0n?1n:d));if(w>f.capBps)throw new Error(`auto-slippage: realised floor implies ${w} bps, above cap ${f.capBps} \u2014 refusing to issue a guard weaker than advertised`);return Kl({mode:"auto",chainId:Number(e),venue:String(t||"unknown"),quoteAmountOut:d.toString(),minAmountOut:h.toString(),requiredBps:f.requiredBps,selectedBps:f.selectedBps,capBps:f.capBps,quotedAtMs:p,expiresAtMs:p+m},{secret:l})}function qw(e){let t=String(e||"");if(!/^0x[0-9a-fA-F]+$/.test(t)||t.length<10||t.length%2!==0)return null;let n=t.slice(0,10).toLowerCase(),r=[];for(let i=10;i+64<=t.length;i+=64)r.push(t.slice(i,i+64));let o=i=>r[i]==null?null:BigInt("0x"+r[i]);switch(n){case"0x414bf389":return o(6);case"0x04e45aaf":return o(5);case"0xc04b8d59":{let i=o(0);if(i==null)return null;let s=Number(i)/32;return!Number.isInteger(s)||s<0?null:o(s+4)}case"0xb858183f":{let i=o(0);if(i==null)return null;let s=Number(i)/32;return!Number.isInteger(s)||s<0?null:o(s+3)}case"0xa026383e":return o(6);case"0x38ed1739":case"0x5c11d795":return o(1);case"0x7ff36ab5":case"0xb6f9de95":return o(0);case"0x18cbafe5":case"0x791ac947":return o(1);default:return null}}function ge(e,{chainId:t,venue:n,amountOut:r,liquidityUsd:o,priceChange5m:i,crossChain:s,requestedCapBps:a,quotedAtMs:c=Date.now(),ttlMs:u}={}){let l=sa({chainId:t,venue:n,quoteAmountOut:r,liquidityUsd:o,priceChange5m:i,crossChain:s,requestedCapBps:a,quotedAtMs:c,ttlMs:u});return{...e,autoSlippage:l,amountOutMinimum:l.minAmountOut}}var Lt,Vl,st=O(()=>{Hl();zl();Lt=100,Vl=2e4});import{createHash as Bw,createHmac as Uw,timingSafeEqual as BR}from"node:crypto";function aa(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(aa).join(",")}]`:`{${Object.keys(e).sort().map(n=>`${JSON.stringify(n)}:${aa(e[n])}`).join(",")}}`}function Yl(e){let t=String(e?.ORACLE_STAMP_HMAC_SECRET||"").trim();return t.length>=16?t:""}function Jl(e=process.env){return Yl(process.env)||Yl(e)}function Fw(e){let{prepareHash:t,prepareMac:n,note:r,...o}=e||{};return o}function jw(e){let t=Fw(e);return Bw("sha256").update(aa(t)).digest("hex")}function Hw(e,t=Jl()){return t?Uw("sha256",t).update(String(e)).digest("hex"):""}function ne(e,{provider:t,kind:n,env:r=process.env,nowMs:o=Date.now(),expiresAtMs:i}={}){if(!e||typeof e!="object")throw new Error("stampPrepared: payload object required");let s=Object.prototype.hasOwnProperty.call(e,"oraclePrepared");if(s&&typeof e.oraclePrepared!="boolean")throw new Error("stampPrepared: oraclePrepared must be boolean");let a={...e,provider:e.provider||t,kind:e.kind||n,requiresUserSignature:e.requiresUserSignature!==!1,signingReady:!1,broadcastReady:!1,executionReady:!1,oraclePrepared:s?e.oraclePrepared:!0};if(!a.provider)throw new Error("stampPrepared: provider required");if(!a.kind)throw new Error("stampPrepared: kind required");let c=Number(o),u=i==null?c+Xl:Number(i),l=u-c;if(!Number.isSafeInteger(c)||!Number.isSafeInteger(u)||l<=0||l>Dw)throw new Error("stampPrepared: bounded preparedAt/expiresAt required");let f={...a,preparedAt:c,expiresAt:u,prepareVersion:Mw},p=jw(f),m=Jl(r),y=m?Hw(p,m):void 0,h={...f,prepareHash:p};return y&&(h.prepareMac=y),h}var Mw,Xl,Dw,xe=O(()=>{Mw=2,Xl=300*1e3,Dw=(()=>{let e=Number(process.env.ORACLE_PREPARE_HARD_MAX_AGE_MS);return Number.isFinite(e)&&e>0?e:1800*1e3})()});var sd={};z(sd,{PANCAKE_FEE_TIERS:()=>Go,UNI_V3_CHAINS:()=>ke,UNI_V3_FEE_TIERS:()=>td,UNI_V3_VENUES:()=>od,uniV3Chains:()=>Xw,uniV3EthUsdc:()=>id,uniV3Health:()=>Yw,uniV3PrepareExactIn:()=>Kw,uniV3QuoteExactIn:()=>hn,uniV3QuoteExactInPath:()=>Gw});import{Interface as Zl,getAddress as Nr,isAddress as ed}from"ethers";function ua(e,t){let n=Number(e),r=ke[n];if(!r)throw new Error(`uniswap-v3: unsupported chainId ${e} (supported: ${Object.keys(ke).join(", ")})`);let o=od[n]||{};if(!t){if(!r.quoter||!r.router){let c=Object.keys(o).join(", ")||"none registered";throw new Error(`uniswap-v3: chain ${n} (${r.name}) has no canonical Uniswap v3 deployment -- name a venue explicitly (known: ${c})`)}return{chainId:n,venue:r.name,...r}}let i=String(t).toLowerCase();if(i===r.name&&r.quoter&&r.router)return{chainId:n,venue:r.name,...r};let s=o,a=s[i];if(!a){let c=[...r.quoter&&r.router?[r.name]:[],...Object.keys(s)].join(", ");throw new Error(`uniswap-v3: unknown venue "${t}" on chain ${n} (known: ${c})`)}return{chainId:n,venue:i,...r,quoter:a.quoter,router:a.router,feeTiers:a.feeTiers||null}}function ca(e,t){let n=ke[Number(t)];if(!e||e===nd||e===rd||/^eth$/i.test(String(e)))return Nr(n.weth);let r=String(e);if(/^weth$/i.test(r))return Nr(n.weth);if(/^usdc$/i.test(r))return Nr(n.usdc);if(!ed(r))throw new Error(`invalid token address: ${e}`);return Nr(r)}function Vw(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 Ww(e,t){if(e.length!==t.length+1)throw new Error("path: fees.length must be tokens.length - 1");let n="0x";for(let r=0;r<t.length;r++)n+=e[r].slice(2).toLowerCase(),n+=Number(t[r]).toString(16).padStart(6,"0");return n+=e[e.length-1].slice(2).toLowerCase(),n}async function hn(e={},t={}){let{chainId:n,quoter:r,router:o,feeTiers:i}=ua(e.chainId??8453,e.venue),s=ca(e.tokenIn||"WETH",n),a=ca(e.tokenOut||ke[n].usdc,n),c=BigInt(e.amountIn??0);if(c<=0n)throw new Error("amountIn required (raw base units)");let u=i&&i.length?i:td,l=e.fee!=null?[Number(e.fee)]:e.tryFees===!1?[u[Math.min(2,u.length-1)]]:[...u],f=await Promise.all(l.map(async E=>{let g=Ko.encodeFunctionData("quoteExactInputSingle",[{tokenIn:s,tokenOut:a,amountIn:c,fee:E,sqrtPriceLimitX96:0n}]);try{let b=await te(n,"eth_call",[{to:r,data:g},"latest"],t);if(!b||b==="0x")return{fee:E,ok:!1,error:"empty result"};let v=Ko.decodeFunctionResult("quoteExactInputSingle",b);return{fee:E,ok:!0,amountOut:v[0].toString(),sqrtPriceX96After:v[1].toString(),initializedTicksCrossed:Number(v[2]),gasEstimate:v[3].toString()}}catch(b){return{fee:E,ok:!1,error:String(b.message||b).slice(0,160)}}})),p=null;for(let E of f)E.ok&&(!p||BigInt(E.amountOut)>BigInt(p.amountOut))&&(p=E);if(!p){let E=f.map(g=>`${g.fee}:${g.error||"fail"}`).join("; ");throw new Error(`uniswap-v3 quote failed chain=${n}: ${E}`)}let m=e.liquidityUsd==null?await Tr({chainId:n,tokenA:s,tokenB:a,dexIds:Vw(e.venue)},t).catch(()=>[]):[],y={};await Promise.all(m.slice(0,8).map(async E=>{if(!(!E.pairAddress||!ed(E.pairAddress)))try{let g=await te(n,"eth_call",[{to:E.pairAddress,data:zw},"latest"],t),b=g&&g!=="0x"&&g.length<=66?Number.parseInt(g,16):NaN;if(!Number.isFinite(b)||b<=0||b>1e6)return;let v=y[b];(v==null||E.liquidityUsd>v.liquidityUsd)&&(y[b]=E)}catch{}}));let h=e.liquidityBandBps==null?50:Number(e.liquidityBandBps),w=null;if(e.fee==null&&h>0&&BigInt(p.amountOut)>0n){let E=BigInt(p.amountOut),b=f.filter(v=>v.ok&&Number((E-BigInt(v.amountOut))*10000n/E)<=h).filter(v=>y[v.fee]?.liquidityUsd!=null).sort((v,P)=>y[P.fee].liquidityUsd-y[v.fee].liquidityUsd)[0];b&&b.fee!==p.fee&&(w={priceBestFee:p.fee,chosenFee:b.fee,chosenPoolUsd:y[b.fee].liquidityUsd,bandBps:h},p=b)}let A=y[p.fee]??null,_=m[0]??null,S=A??_,k=e.liquidityUsd??A?.liquidityUsd??_?.liquidityUsd??null,x=e.liquidityUsd!=null?"caller":A?"pool":_?"pair":null;return ge({venue:"uniswap-v3",chainId:n,chain:ke[n].name,quoter:r,tokenIn:s,tokenOut:a,amountIn:c.toString(),fee:p.fee,amountOut:p.amountOut,gasEstimate:p.gasEstimate,liquidityUsd:k,liquiditySource:S,liquidityAttribution:x,liquidityPick:w,sqrtPriceX96After:p.sqrtPriceX96After,initializedTicksCrossed:p.initializedTicksCrossed,triedFees:f,best:!0},{chainId:n,venue:o,amountOut:p.amountOut,liquidityUsd:k,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps})}async function Gw(e={},t={}){let{chainId:n,quoter:r,router:o}=ua(e.chainId??8453),i=(e.tokens||[]).map(f=>ca(f,n)),s=(e.fees||[]).map(Number);if(i.length<2)throw new Error("tokens[] need at least 2 addresses");let a=BigInt(e.amountIn??0);if(a<=0n)throw new Error("amountIn required");let c=Ww(i,s),u=Ko.encodeFunctionData("quoteExactInput",[c,a]),l=await te(n,"eth_call",[{to:r,data:u},"latest"],t),d=Ko.decodeFunctionResult("quoteExactInput",l);return ge({venue:"uniswap-v3",chainId:n,chain:ke[n].name,quoter:r,tokens:i,fees:s,path:c,amountIn:a.toString(),amountOut:d[0].toString(),gasEstimate:d[3].toString()},{chainId:n,venue:o,amountOut:d[0].toString(),liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps})}async function id(e={},t={}){let n=Number(e.chainId??8453),r=e.amountIn??"1000000000000000",o=await hn({chainId:n,tokenIn:ke[n].weth,tokenOut:ke[n].usdc,amountIn:r,fee:e.fee},t),i=Number(o.amountOut)/1e6;return{...o,amountOutUsdc:i,pair:"WETH/USDC"}}async function Kw(e={},t={}){let n=Number(e.chainId??8453),r=ua(n,e.venue),o=Nr(e.recipient),i=String(e.tokenIn||"WETH"),s=!e.tokenIn||i===nd||i===rd||/^eth$/i.test(i),a=await hn(e,t),c=Ql.encodeFunctionData("exactInputSingle",[{tokenIn:a.tokenIn,tokenOut:a.tokenOut,fee:a.fee,recipient:o,amountIn:BigInt(a.amountIn),amountOutMinimum:BigInt(a.amountOutMinimum),sqrtPriceLimitX96:0n}]),u=Math.min(600,Math.max(30,Number(e.deadlineSeconds??300))),d=Number(t.nowSeconds??Math.floor(Date.now()/1e3))+u,f=Ql.encodeFunctionData("multicall",[d,[c]]);return ne({provider:"uniswap-v3",calldataReady:!0,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:n,deadline:d,quote:a,autoSlippage:a.autoSlippage,requiresApproval:s?null:{token:a.tokenIn,spender:r.router,amount:a.amountIn},transaction:{chainId:n,from:o,to:r.router,data:f,value:s?a.amountIn:"0",slippageGuard:Ve(a.autoSlippage,{chainId:n,venue:r.router,data:f})}},{provider:"uniswap-v3",kind:"univ3-swap-tx"})}async function Yw(e={}){let t=Number(e.chainId??8453);try{let n=await id({chainId:t,amountIn:"1000000000000000"},e);return{ok:!0,chainId:t,fee:n.fee,amountOutUsdc:n.amountOutUsdc,midPxHint:n.amountOutUsdc/.001}}catch(n){return{ok:!1,chainId:t,error:String(n.message||n).slice(0,200)}}}async function Xw(){return Object.entries(ke).map(([e,t])=>({chainId:Number(e),name:t.name,quoter:t.quoter,weth:t.weth,usdc:t.usdc}))}var ke,td,zw,Ko,Ql,nd,rd,Go,od,Rr=O(()=>{ot();Cr();st();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"}},td=[100,500,3e3,1e4],zw="0xddca3f43",Ko=new Zl(["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)"]),Ql=new Zl(["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)"]),nd="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",rd="0x0000000000000000000000000000000000000000",Go=[100,500,2500,1e4],od={56:{pancakeswap:{name:"pancakeswap",quoter:"0xB048Bbc1Ee6b733FFfCFb9e9CeF7375518e25997",router:"0x13f4EA83D0bd40E75C8222255bc855a974568Dd4",feeTiers:Go}},8453:{pancakeswap:{name:"pancakeswap",quoter:"0xB048Bbc1Ee6b733FFfCFb9e9CeF7375518e25997",router:"0x13f4EA83D0bd40E75C8222255bc855a974568Dd4",feeTiers:Go}},42161:{pancakeswap:{name:"pancakeswap",quoter:"0xB048Bbc1Ee6b733FFfCFb9e9CeF7375518e25997",router:"0x13f4EA83D0bd40E75C8222255bc855a974568Dd4",feeTiers:Go}},999:{hyperswap:{name:"hyperswap",quoter:"0x03A918028f22D9E1473B7959C927AD7425A45C7C",router:"0x4E2960a8cd19B467b82d26D83fAcb0fAE26b094D"}}}});var ud={};z(ud,{UNI_V4_CHAINS:()=>We,UNI_V4_FEE_TIERS:()=>pa,computeV4PoolId:()=>Jo,decodeV4HookPermissions:()=>ma,uniV4Chains:()=>uE,uniV4Health:()=>lE,uniV4InspectHook:()=>sE,uniV4PrepareExactIn:()=>cE,uniV4QuoteExactIn:()=>Qo,uniV4QuoteExactOut:()=>aE});import{AbiCoder as Jw,Interface as la,getAddress as gt,isAddress as da,keccak256 as Qw}from"ethers";function ma(e){let t=qr(e),n=Number(BigInt(t)&eE),r=Object.fromEntries(ad.map(([s,a])=>[a,!!(n&1<<s)])),i=[["beforeSwapReturnsDelta","beforeSwap"],["afterSwapReturnsDelta","afterSwap"],["afterAddLiquidityReturnsDelta","afterAddLiquidity"],["afterRemoveLiquidityReturnsDelta","afterRemoveLiquidity"]].filter(([s,a])=>r[s]&&!r[a]).map(([s,a])=>`${s} requires ${a}`);return Object.freeze({address:t,mask:n,maskHex:`0x${n.toString(16).padStart(4,"0")}`,flags:Object.freeze(r),enabled:Object.freeze(ad.filter(([,s])=>r[s]).map(([,s])=>s)),valid:i.length===0,violations:Object.freeze(i)})}function $r(e){let t=Number(e),n=We[t];if(!n)throw new Error(`uniswap-v4: unsupported chainId ${e} (supported: ${Object.keys(We).join(", ")})`);return{chainId:t,...n}}function qr(e){if(e==null||e==="")return Ce;let t=String(e);if(!da(t))throw new Error(`invalid Uniswap V4 hook address: ${e}`);return gt(t)}function $n(e,t){let n=We[Number(t)];if(Lr(e))return gt(n.weth);let r=String(e);if(/^weth$/i.test(r))return gt(n.weth);if(/^usdc$/i.test(r)||/^usdg$/i.test(r))return gt(n.usdc);if(!da(r))throw new Error(`invalid token address: ${e}`);return gt(r)}function Lr(e){let t=String(e||"").trim().toLowerCase();return!t||t===oE.toLowerCase()||t===Ce.toLowerCase()||t==="eth"}function Jo({currency0:e,currency1:t,fee:n,tickSpacing:r,hooks:o=Ce}){let i=gt(e),s=gt(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 Qw(Pr.encode(["address","address","uint24","int24","address"],[a,c,Number(n),Number(r),u]))}function ha({tokenIn:e,tokenOut:t,fee:n,tickSpacing:r,hooks:o=Ce}){let i=gt(e),s=gt(t),[a,c]=i.toLowerCase()<s.toLowerCase()?[i,s]:[s,i],u=i.toLowerCase()===a.toLowerCase();return{poolKey:{currency0:a,currency1:c,fee:Number(n),tickSpacing:Number(r),hooks:qr(o)},zeroForOne:u}}function iE({hook:e,codePresent:t,initialized:n,dynamicFee:r}){let o=ma(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!==Ce&&(c="low",a.push("nonzero hook requires independent contract review")),r&&(c="medium",a.push("pool uses a dynamic LP fee")),s&&(c="medium",a.push("hook runs during swap or donate flow")),i&&(c="high",a.push("hook can return custom accounting deltas")),o.valid||(c="critical",a.push(...o.violations)),r&&e===Ce&&(c="critical",a.push("dynamic-fee pool has no hook authority")),e!==Ce&&o.enabled.length===0&&(c="critical",a.push("nonzero hook declares no permissions")),n||(c="critical",a.push("pool is not initialized")),e!==Ce&&!t&&(c="critical",a.push("hook address has no deployed bytecode")),Object.freeze({tier:c,audited:!1,requiresReview:e!==Ce,returnsDelta:i,reasons:Object.freeze(a)})}async function sE(e={},t={}){let n=$r(e.chainId??8453);if(!n.stateView)throw new Error(`uniswap-v4: no StateView on chain ${n.chainId}`);let r=$n(e.tokenIn||"WETH",n.chainId),o=$n(e.tokenOut||n.usdc,n.chainId),i=Number(e.fee),s=Number(e.tickSpacing);if(!Number.isInteger(i)||i<0||i>16777215)throw new Error("uniswap-v4 inspectHook requires uint24 fee");if(!Number.isInteger(s)||s<-8388608||s>8388607)throw new Error("uniswap-v4 inspectHook requires int24 tickSpacing");let a=qr(e.hooks),{poolKey:c}=ha({tokenIn:r,tokenOut:o,fee:i,tickSpacing:s,hooks:a}),u=Jo(c),l=t.rpcCall||te,d=Yo.encodeFunctionData("getSlot0",[u]),f=Yo.encodeFunctionData("getLiquidity",[u]),[p,m,y]=await Promise.all([l(n.chainId,"eth_call",[{to:n.stateView,data:d},"latest"],t),l(n.chainId,"eth_call",[{to:n.stateView,data:f},"latest"],t),a===Ce?Promise.resolve(null):l(n.chainId,"eth_getCode",[a,"latest"],t)]),h=Yo.decodeFunctionResult("getSlot0",p),w=Yo.decodeFunctionResult("getLiquidity",m)[0],A=h[0],_=A>0n,S=a===Ce?null:typeof y=="string"&&y!=="0x"&&y.length>4,k=!!(i&fa),x=iE({hook:a,codePresent:S,initialized:_,dynamicFee:k});return Object.freeze({venue:"uniswap-v4",chainId:n.chainId,stateView:n.stateView,poolId:u,poolKey:Object.freeze(c),pool:Object.freeze({initialized:_,sqrtPriceX96:A.toString(),tick:Number(h[1]),protocolFee:Number(h[2]),lpFee:Number(h[3]),liquidity:w.toString(),dynamicFee:k}),hook:Object.freeze({address:a,codePresent:S,codeBytes:S?(y.length-2)/2:0,permissions:ma(a)}),risk:x})}async function Qo(e={},t={}){let{chainId:n,quoter:r,poolManager:o,universalRouter:i}=$r(e.chainId??8453),s=$n(e.tokenIn||"WETH",n),a=$n(e.tokenOut||We[n].usdc,n),c=BigInt(e.amountIn??0);if(c<=0n)throw new Error("amountIn required (raw base units)");if(c>0xffffffffffffffffffffffffffffffffn)throw new Error("amountIn exceeds uint128");let u=e.fee!=null&&e.tickSpacing!=null?[{fee:Number(e.fee),tickSpacing:Number(e.tickSpacing)}]:e.tryTiers===!1?[{fee:500,tickSpacing:10}]:[...pa],l=e.hooks||Ce,f=await Promise.all(u.map(async g=>{let{poolKey:b,zeroForOne:v}=ha({tokenIn:s,tokenOut:a,fee:g.fee,tickSpacing:g.tickSpacing,hooks:l}),P=Xo.encodeFunctionData("quoteExactInputSingle",[{poolKey:b,zeroForOne:v,exactAmount:c,hookData:"0x"}]);try{let I=await(t.rpcCall||te)(n,"eth_call",[{to:r,data:P},"latest"],t);if(!I||I==="0x")return{...g,ok:!1,error:"empty result"};let L=Xo.decodeFunctionResult("quoteExactInputSingle",I);return{fee:g.fee,tickSpacing:g.tickSpacing,ok:!0,amountOut:L[0].toString(),gasEstimate:L[1].toString(),poolKey:b,zeroForOne:v,poolId:Jo({...b})}}catch(I){return{...g,ok:!1,error:String(I.message||I).slice(0,160)}}})),p=null;for(let g of f)g.ok&&(!p||BigInt(g.amountOut)>BigInt(p.amountOut))&&(p=g);if(!p){let g=f.map(b=>`${b.fee}/${b.tickSpacing}:${b.error||"fail"}`).join("; ");throw new Error(`uniswap-v4 quote failed chain=${n}: ${g}`)}let m=e.liquidityUsd==null?await Tr({chainId:n,tokenA:s,tokenB:a,dexIds:cd},t).catch(()=>[]):[],y=new Map;for(let g of m){let b=String(g.pairAddress||"").toLowerCase();b&&y.set(b,g)}let h=g=>y.get(String(g.poolId||"").toLowerCase())??null,w=e.liquidityBandBps==null?50:Number(e.liquidityBandBps),A=null;if(!(e.fee!=null&&e.tickSpacing!=null)&&w>0&&BigInt(p.amountOut)>0n){let g=BigInt(p.amountOut),v=f.filter(P=>P.ok&&Number((g-BigInt(P.amountOut))*10000n/g)<=w).filter(P=>h(P)?.liquidityUsd!=null).sort((P,I)=>h(I).liquidityUsd-h(P).liquidityUsd)[0];v&&v.poolId!==p.poolId&&(A={priceBestFee:p.fee,chosenFee:v.fee,chosenPoolUsd:h(v).liquidityUsd,bandBps:w},p=v)}let _=h(p),S=m[0]??null,k=_??S,x=e.liquidityUsd??_?.liquidityUsd??S?.liquidityUsd??null,E=e.liquidityUsd!=null?"caller":_?"pool":S?"pair":null;return ge({venue:"uniswap-v4",chainId:n,chain:We[n].name,poolManager:o,quoter:r,universalRouter:i||null,tokenIn:s,tokenOut:a,amountIn:c.toString(),fee:p.fee,tickSpacing:p.tickSpacing,hooks:p.poolKey.hooks,poolId:p.poolId,zeroForOne:p.zeroForOne,amountOut:p.amountOut,gasEstimate:p.gasEstimate,liquidityUsd:x,liquiditySource:k,liquidityAttribution:E,liquidityPick:A,triedTiers:f,best:!0,executionReady:!1,prepareReady:typeof e.recipient=="string"&&da(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&&!Lr(e.tokenIn)&&!Lr(e.tokenOut)&&(e.hookData==null||String(e.hookData).toLowerCase()==="0x")&&p.poolKey.hooks===Ce&&!(p.fee&fa)},{chainId:n,venue:i||r,amountOut:p.amountOut,liquidityUsd:x,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps})}async function aE(e={},t={}){let{chainId:n,quoter:r,poolManager:o,universalRouter:i}=$r(e.chainId??8453),s=$n(e.tokenIn||"WETH",n),a=$n(e.tokenOut||We[n].usdc,n),c=BigInt(e.amountOut??0);if(c<=0n)throw new Error("amountOut required (raw base units)");if(c>0xffffffffffffffffffffffffffffffffn)throw new Error("amountOut exceeds uint128");let u=e.fee!=null&&e.tickSpacing!=null?[{fee:Number(e.fee),tickSpacing:Number(e.tickSpacing)}]:e.tryTiers===!1?[{fee:500,tickSpacing:10}]:[...pa],l=e.hooks||Ce,f=await Promise.all(u.map(async y=>{let{poolKey:h,zeroForOne:w}=ha({tokenIn:s,tokenOut:a,fee:y.fee,tickSpacing:y.tickSpacing,hooks:l}),A=Xo.encodeFunctionData("quoteExactOutputSingle",[{poolKey:h,zeroForOne:w,exactAmount:c,hookData:"0x"}]);try{let _=await(t.rpcCall||te)(n,"eth_call",[{to:r,data:A},"latest"],t);if(!_||_==="0x")return{...y,ok:!1,error:"empty result"};let S=Xo.decodeFunctionResult("quoteExactOutputSingle",_);return{fee:y.fee,tickSpacing:y.tickSpacing,ok:!0,amountIn:S[0].toString(),gasEstimate:S[1].toString(),poolKey:h,zeroForOne:w,poolId:Jo({...h})}}catch(_){return{...y,ok:!1,error:String(_.message||_).slice(0,160)}}})),p=null;for(let y of f)y.ok&&(!p||BigInt(y.amountIn)<BigInt(p.amountIn))&&(p=y);if(!p){let y=f.map(h=>`${h.fee}/${h.tickSpacing}:${h.error||"fail"}`).join("; ");throw new Error(`uniswap-v4 exact-output quote failed chain=${n}: ${y}`)}let m=e.liquidityUsd==null?await Dl({chainId:n,tokenA:s,tokenB:a,dexIds:cd},t).catch(()=>null):null;return{venue:"uniswap-v4",chainId:n,chain:We[n].name,poolManager:o,quoter:r,universalRouter:i||null,tokenIn:s,tokenOut:a,amountIn:p.amountIn,amountOut:c.toString(),gasEstimate:p.gasEstimate,fee:p.fee,tickSpacing:p.tickSpacing,hooks:p.poolKey.hooks,poolId:p.poolId,zeroForOne:p.zeroForOne,liquidityUsd:e.liquidityUsd??m?.liquidityUsd??null,liquiditySource:m,triedTiers:f,best:!0,executionReady:!1,prepareReady:!1}}async function cE(e={},t={}){if(["operation","exactOutput","amountOut","multihop","path","positionManager","modifyLiquidities","commands","actions"].some(S=>Object.hasOwn(e,S)))throw new Error("uniswap-v4 unsupported operation shape is inspect/quote-only");let r=Number(e.chainId??8453),o=$r(r);if(qr(e.hooks)!==Ce)throw new Error("uniswap-v4 nonzero hooks are inspect/quote-only until a code-hash-specific adapter exists");if(Number(e.fee)&fa)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=gt(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(Lr(e.tokenIn)||Lr(e.tokenOut))throw new Error("uniswap-v4 prepare currently requires ERC-20 tokenIn and tokenOut; native routes are not inferred");let u=await Qo(e,t);if(!o.universalRouter)throw new Error(`uniswap-v4: no Universal Router on chain ${r}`);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},p=Pr.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=Pr.encode(["address","uint256"],[u.tokenIn,BigInt(u.amountIn)]),y=Pr.encode(["address","uint256"],[u.tokenOut,l]),h=Pr.encode(["bytes","bytes[]"],[nE,[p,m,y]]),A=Number(t.nowSeconds??Math.floor(Date.now()/1e3))+c,_=Zw.encodeFunctionData("execute",[tE,[h],A]);return ne({provider:"uniswap-v4",prepareReady:!0,calldataReady:!0,executionReady:!1,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:r,deadline:A,quote:{...u,amountOutMinimum:l.toString(),slippageBps:a},hookInspection:null,requiresApproval:{token:u.tokenIn,spender:rE,amount:u.amountIn,note:"Universal Router V4 settlement uses Permit2; Permit2 authorization for the Universal Router is also required"},transaction:{chainId:r,from:s,to:o.universalRouter,data:_,value:"0"}},{provider:"uniswap-v4",kind:"univ4-swap-tx"})}async function uE(){return Object.entries(We).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 lE(e={}){let t=$r(e.chainId??8453),n=await te(t.chainId,"eth_getCode",[t.quoter,"latest"],e),r=typeof n=="string"&&n!=="0x"&&n.length>4;return{ok:r,chainId:t.chainId,quoter:t.quoter,poolManager:t.poolManager,codeBytes:r?(n.length-2)/2:0}}var Pr,Ce,We,pa,Xo,Zw,Yo,ad,eE,fa,tE,nE,rE,oE,cd,Zo=O(()=>{ot();Cr();st();xe();Pr=Jw.defaultAbiCoder(),Ce="0x0000000000000000000000000000000000000000",We={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"}},pa=[{fee:100,tickSpacing:1},{fee:500,tickSpacing:10},{fee:3e3,tickSpacing:60},{fee:1e4,tickSpacing:200},{fee:25e3,tickSpacing:8}],Xo=new la(["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)"]),Zw=new la(["function execute(bytes commands,bytes[] inputs,uint256 deadline) payable"]),Yo=new la(["function getSlot0(bytes32 poolId) view returns (uint160 sqrtPriceX96,int24 tick,uint24 protocolFee,uint24 lpFee)","function getLiquidity(bytes32 poolId) view returns (uint128 liquidity)"]),ad=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"]]),eE=(1n<<14n)-1n,fa=8388608;tE="0x10",nE="0x060c0f",rE="0x000000000022D473030F116dDEE9F6B43aC78BA3",oE="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE";cd=["uniswap-v4","uniswapv4"]});function ld(e={}){let t=[],n=[];if(!e||typeof e!="object")return{ok:!1,errors:["definition must be an object"],warnings:n};if((!Number.isInteger(e.chainId)||e.chainId<=0)&&t.push("chainId must be a positive integer"),(typeof e.key!="string"||!/^[a-z][a-z0-9-]*$/.test(e.key||""))&&t.push('key must be a lowercase slug (e.g. "base")'),(typeof e.name!="string"||!e.name.trim())&&t.push("name is required"),!Array.isArray(e.rpcEnv)||e.rpcEnv.length===0)t.push("rpcEnv must list at least one environment variable name");else for(let o of e.rpcEnv)(typeof o!="string"||!/^[A-Z][A-Z0-9_]*$/.test(o))&&t.push(`rpcEnv entry "${o}" should be an UPPER_SNAKE env var name`);if(e.nativeCurrency){let o=e.nativeCurrency;(typeof o.symbol!="string"||!o.symbol)&&t.push("nativeCurrency.symbol is required when nativeCurrency is set"),Number.isInteger(o.decimals)||t.push("nativeCurrency.decimals must be an integer")}for(let[o,i]of(e.venues||[]).entries()){let s=`venues[${o}]`;if(!i||typeof i!="object"){t.push(`${s} must be an object`);continue}dE.test(i.address||"")||t.push(`${s}.address is not a valid 20-byte address`),/^0x0{40}$/.test(i.address||"")&&t.push(`${s}.address is the zero address -- placeholder left in place?`),i.kind||t.push(`${s}.kind is required (router|quoter|factory|...)`),i.verified?(i.verified.method||t.push(`${s}.verified.method is required`),i.verified.source||t.push(`${s}.verified.source is required`),i.verified.date||n.push(`${s}.verified.date missing -- add one so staleness is visible`)):t.push(`${s} must record verification: { verified: { method, source, date } }. An unverified venue stays blocked.`)}let r=e.capabilities||{};for(let o of Object.keys(r))qn.includes(o)?typeof r[o]!="function"&&t.push(`capability "${o}" must be a function`):t.push(`unknown capability "${o}"`);return Object.keys(r).length===0&&n.push("scanner implements no capabilities -- it can only be registered, not used"),r.prepareUnsignedTx&&!r.quote&&n.push("prepareUnsignedTx without quote: no priced expectation to validate the built tx against"),r.prepareUnsignedTx&&!r.sellSimulation&&n.push("prepareUnsignedTx without sellSimulation: cannot prove an asset is exitable before buying"),{ok:t.length===0,errors:t,warnings:n}}function dd(e){let{ok:t,errors:n,warnings:r}=ld(e);if(!t)throw new Error(`invalid scanner for ${e?.key??"<unknown>"}:
6
+ - ${n.join(`
7
+ - `)}`);let o=e.capabilities||{},i=qn.filter(a=>typeof o[a]=="function"),s={key:e.key,chainId:e.chainId,name:e.name,rpcEnv:[...e.rpcEnv],nativeCurrency:e.nativeCurrency?{...e.nativeCurrency}:null,wrappedNative:e.wrappedNative||null,explorer:e.explorer||null,venues:(e.venues||[]).map(a=>({...a})),warnings:r,capabilities(){return{chainId:e.chainId,key:e.key,supported:[...i],unsupported:qn.filter(a=>!i.includes(a))}},supports(a){return i.includes(a)}};for(let a of qn)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 ei(e){let t=dd(e);return Bn.set(t.chainId,t),t}function ya(e){return Bn.get(Number(e))||null}function pd(){return[...Bn.values()]}function pE(){Bn.clear()}function fE(){let e={};for(let t of Bn.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:Bn.size,capabilities:[...qn],chains:e}}var qn,F,U,dE,Bn,Xt=O(()=>{qn=Object.freeze(["blockNumber","nativeBalance","tokenBalance","resolveToken","resolvePools","scanBlocks","scoreRisk","quote","sellSimulation","prepareUnsignedTx"]),F=Object.freeze({LIVE:"LIVE",CACHED:"CACHED",STALE:"STALE",UNKNOWN:"UNKNOWN",UNAVAILABLE:"UNAVAILABLE"}),U=Object.freeze({PASS:"PASS",CAUTION:"CAUTION",FAIL:"FAIL",UNKNOWN:"UNKNOWN"}),dE=/^0x[0-9a-fA-F]{40}$/;Bn=new Map});function fd(e){let{source:t,amountOut:n,minOut:r=null,gasUsd:o=null,feeUsd:i=null,oracleFeeBps:s=0,estimatedGas:a=null,liquidityUsd:c=null,error:u=null,executionReady:l=!1,meta:d={}}=e||{};if(u||n==null)return{source:t,quality:at.FAILED,amountOut:null,error:u||"no amountOut returned"};let f=Br(n);if(f==null||f<=0n)return{source:t,quality:at.FAILED,amountOut:null,error:"non-positive amountOut"};let p=Number(s);return{source:t,quality:o==null?at.NO_GAS:at.FULL,amountOut:f.toString(),minOut:Br(r)?.toString()??null,gasUsd:o,feeUsd:i,oracleFeeBps:Number.isFinite(p)&&p>0?Math.floor(p):0,estimatedGas:a==null?null:String(a),liquidityUsd:c==null?null:Number(c),executionReady:l,meta:d}}async function hd(e,t,{divisor:n=1000n}={}){let r=Br(t);if(r==null||r<=0n)return null;let o=r/n>0n?r/n:1n;if(o>=r)return null;let i,s;try{[i,s]=await Promise.all([e(o),e(r)])}catch{return null}let a=Br(i),c=Br(s);if(a==null||c==null||a<=0n)return null;let u=Number(a)/Number(o),l=Number(c)/Number(r);return!Number.isFinite(u)||!Number.isFinite(l)||u<=0?null:{impactPct:(1-l/u)*100,probeAmountIn:o.toString(),probeAmountOut:a.toString(),fullAmountOut:c.toString()}}function yd(e,t,{maxImpactPct:n=25}={}){let r=[],o=[],i=(e.routes??[]).filter(a=>{let c=t?.[a.source];return c?c.impactPct>n?(r.push({source:a.source,impactPct:Number(c.impactPct.toFixed(2)),reason:`price impact ${c.impactPct.toFixed(1)}% exceeds ${n}% ceiling -- the venue cannot absorb this size near the quoted price`}),!1):!0:(o.push(a.source),!0)}),s=[...e.warnings??[]];return r.length&&s.push(`dropped ${r.length} route(s) on price impact: `+r.map(a=>`${a.source} (${a.impactPct}%)`).join(", ")),o.length&&s.push(`price impact NOT measured for: ${o.join(", ")}. These are unproven against thin liquidity, not proven safe.`),{...e,routes:i,best:i[0]??null,impactRejected:r,impactUnmeasured:o,warnings:s}}function ga(e,{destPriceUsd:t=null,destDecimals:n=null,liquidityFirst:r=!0,liquidityBandBps:o=50,gasPriceWei:i=null,nativePriceUsd:s=null}={}){let a=e.filter(g=>g.quality!==at.FAILED),c=e.filter(g=>g.quality===at.FAILED),u=t!=null&&t>0&&n!=null&&n>=0,l=Number(i),d=Number(s),f=Number.isFinite(l)&&l>0&&Number.isFinite(d)&&d>0,p=a.map(g=>{let b=BigInt(g.amountOut),v=0n,P=!1,I=!1,L=BigInt(g.oracleFeeBps??0),q=L>0n?b*L/10000n:0n;if(u){let D=g.gasUsd,M=Number(g.meta?.gasUnits??g.estimatedGas);if(D==null&&f&&Number.isFinite(M)&&M>0){let Y=M*l/1e18*d;Number.isFinite(Y)&&Y>=0&&(D=Y,I=!0)}let Q=(D??0)+(g.feeUsd??0);if(Q>0){let Y=Q/t*10**n;Number.isFinite(Y)&&Y>=0&&(v=BigInt(Math.floor(Y)),P=!0)}else D===0&&(P=!0)}let H=v+q,$=b>H?b-H:0n;return{...g,grossOut:b.toString(),netOut:$.toString(),costInDest:v.toString(),oracleFeeInDest:q.toString(),costAccounted:P,gasEstimated:I}}),m=Number(o)>0?Number(o):0,y=p.reduce((g,b)=>BigInt(b.netOut)>g?BigInt(b.netOut):g,0n),h=g=>y>0n?Number((y-BigInt(g))*10000n/y):0,w=[],A=p.slice().sort((g,b)=>BigInt(b.netOut)>BigInt(g.netOut)?1:-1)[0]??null;p.sort((g,b)=>{let v=h(g.netOut)<=m?0:1,P=h(b.netOut)<=m?0:1;if(r&&m>0&&v!==P)return v-P;if(r&&m>0){let I=g.liquidityUsd??-1,L=b.liquidityUsd??-1;if(I!==L)return L-I}return BigInt(b.netOut)>BigInt(g.netOut)?1:-1}),r&&m>0&&A&&p[0]&&p[0].source!==A.source&&w.push(`liquidity-first: chose ${p[0].source} (liquidity $${p[0].liquidityUsd??"unknown"}) over best-price ${A.source} within ${m} bps`);let _=p.filter(g=>!g.costAccounted).map(g=>g.source);u?_.length&&w.push(`gas not reported by: ${_.join(", ")}. These are ranked on gross output and may be overstated relative to gas-measured routes.`):w.push("destination price/decimals unavailable: ranked on GROSS output. Gas is not included, so a cheap-looking route may cost more to execute.");let S=p[0];if(u&&S&&S.costAccounted===!1){let g=p.find(b=>b.costAccounted&&h(b.netOut)<=m);g&&w.push(`winner ${S.source} has UNMEASURED gas; gas-measured ${g.source} is within ${m} bps and may net more once ${S.source}'s real gas is paid \u2014 prefer it if unsure.`)}let k=p.filter(g=>g.gasEstimated).map(g=>g.source);k.length&&w.push(`gas ESTIMATED (from gas units x current gas price, not measured) for: ${k.join(", ")}. Net includes this estimate so the ranking is gas-inclusive, but the on-chain gas may differ.`);let x=null,E=null;if(p.length>=2&&p[0].costAccounted&&p[1].costAccounted){let g=BigInt(p[0].netOut),b=BigInt(p[1].netOut);b>0n&&(x=Number((g-b)*10000n/b),E=`${p[0].source} vs ${p[1].source}`)}return{best:p[0]??null,routes:p,failed:c,improvementBps:x,spreadBasis:E,rankedOn:u?"net-of-cost":"gross",warnings:w}}async function ti(e,{timeoutMs:t=12e3}={}){let n=(o,i)=>Promise.race([o,new Promise((s,a)=>setTimeout(()=>a(new Error(`${i}: timeout`)),t))]);return(await Promise.allSettled(e.map(o=>n(Promise.resolve().then(o.run),o.source)))).map((o,i)=>{let s=e[i].source;return o.status==="rejected"?fd({source:s,error:String(o.reason?.message||o.reason)}):fd({source:s,...o.value})})}var at,md,Br,ba=O(()=>{Xt();at=Object.freeze({FULL:"FULL",NO_GAS:"NO_GAS",FAILED:"FAILED"}),md={1:"coingecko:ethereum",10:"coingecko:ethereum",56:"coingecko:binancecoin",137:"coingecko:matic-network",8453:"coingecko:ethereum",42161:"coingecko:ethereum",43114:"coingecko:avalanche-2",999:"coingecko:ethereum"},Br=e=>{try{return e==null||e===""?null:BigInt(String(e).split(".")[0])}catch{return null}}});function wa(e){let t=String(e||"").trim();return/^0x[0-9a-fA-F]{40}$/.test(t)?t:Jt}var Jt,ni=O(()=>{Jt="0x000000000000000000000000000000000000dEaD"});import{Contract as mE,JsonRpcProvider as hE}from"ethers";function SE(e){return EE.test(String(e||""))}async function gd(e,{contract:t=yE,rpc:n=bE,chainId:r=gE,balanceOf:o}={}){if(!SE(e))throw new Error("invalid-address");if(o)return BigInt(await o(e));let i=new hE(n,r,{staticNetwork:!0}),s=new mE(t,wE,i);return BigInt(await s.balanceOf(e))}var yE,gE,bE,wE,EE,bd=O(()=>{yE="0x62FCFAf7573AD8B41a0FBF347AfEb85e06599A75",gE=999,bE="https://rpc.hyperliquid.xyz/evm",wE=["function balanceOf(address owner) view returns (uint256)"],EE=/^0x[a-fA-F0-9]{40}$/});import{existsSync as vE,readFileSync as AE,lstatSync as xE}from"node:fs";import{homedir as wd}from"node:os";import{join as Ea}from"node:path";function _E(e){let t=String(e||"swap").toLowerCase();return Object.prototype.hasOwnProperty.call(Ed,t)?Ed[t]:IE}function RE(e=process.env){if(process.env.ORACLE_TEST_ISOLATE_SECRETS==="1"){if(e[Sd])return String(e[Sd]);let t=e.ORACLE_CONFIG_DIR||Ea(wd(),".config","oracle");return Ea(t,"fee-recipient")}return Ea(wd(),".config","oracle","fee-recipient")}function PE(e=process.env){try{let t=RE(e);if(!vE(t)||xE(t).isSymbolicLink())return"";let n=AE(t,"utf8").trim().toLowerCase();return/^0x[a-f0-9]{40}$/.test(n)?n:""}catch{return""}}function LE(e,{fallback:t=0}={}){if(e==null)return t;if(String(e).trim()==="")return 0;let n=Number(e);return!Number.isFinite(n)||n<=0?0:Math.min(Math.floor(n),kE)}function $E({env:e=process.env,action:t="swap",admin:n=!1}={}){let r=String(e[TE]||"").trim(),o=String(e[CE]||NE).trim();if(n===!0)return{bps:0,recipient:"",integrator:o,action:t,applies:!1,reason:"admin-oracle"};let i=_E(t),s=LE(e[OE],{fallback:r?i:0}),a=Math.min(s,i);if(!a)return{bps:0,recipient:"",integrator:o,action:t,applies:!1,reason:"not-configured"};if(!/^0x[a-fA-F0-9]{40}$/.test(r))return{bps:0,recipient:"",integrator:o,action:t,applies:!1,reason:"no-recipient"};let c=PE(e);return!c||c!==r.toLowerCase()?{bps:0,recipient:"",integrator:o,action:t,applies:!1,reason:"recipient-not-pinned"}:{bps:a,recipient:r,integrator:o,action:t,applies:!0,reason:"configured"}}async function ri({wallet:e,env:t=process.env,action:n="swap",holderCheck:r={},admin:o=!1}={}){let i=$E({env:t,action:n,admin:o});if(o===!0)return{...i,holderVerificationStatus:"admin-oracle"};let s=String(e||"").trim().toLowerCase();if(!/^0x[a-f0-9]{40}$/.test(s))return{...i,holderVerificationStatus:"wallet-required"};try{return BigInt(await gd(s,r))>0n?{...i,bps:0,applies:!1,reason:"locals-only-holder",holderVerificationStatus:"holder"}:{...i,holderVerificationStatus:"non-holder"}}catch{return{...i,holderVerificationStatus:"unavailable"}}}function vd(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 Ad(e){return e?.applies?{integrator:e.integrator,fee:String(e.bps/1e4)}:{}}function xd(e){return e?.applies?{partner:e.integrator,partnerFeeBps:String(e.bps),partnerAddress:e.recipient}:{}}var kE,IE,Ed,OE,TE,CE,Sd,NE,oi=O(()=>{bd();kE=100,IE=5,Ed=Object.freeze({swap:5,bridge:5,perps:0,nft:0});OE="ORACLE_INTEGRATOR_FEE_BPS",TE="ORACLE_INTEGRATOR_FEE_RECIPIENT",CE="ORACLE_INTEGRATOR_ID",Sd="ORACLE_INTEGRATOR_FEE_RECIPIENT_PIN",NE="oracle"});var Aa={};z(Aa,{LIFI_API:()=>Id,lifiChains:()=>DE,lifiHealth:()=>UE,lifiPrepare:()=>ME,lifiQuote:()=>yn});function va(e={}){return(e.baseUrl||process.env.LIFI_API_URL||Id).replace(/\/$/,"")}function BE(e){let t=String(e||Sa).toLowerCase();return t===Sa.toLowerCase()||t===qE}function kd(e,t){let n=String(e||"").trim();if(!/^0x[0-9a-fA-F]{40}$/.test(n))throw new Error(`lifi: ${t} must be a 20-byte address`);return n.toLowerCase()}async function UE(e={}){let t=await C(`${va(e)}/chains`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??12e3}),n=Array.isArray(t)?t.length:t?.chains?.length||0;return{ok:n>0,chainCount:n}}async function yn(e={},t={}){let{fromChain:n,toChain:r=n,fromToken:o=Sa,toToken:i,fromAmount:s,fromAddress:a=Jt}=e;if(n==null||!i||!s)throw new Error("lifiQuote requires fromChain, toToken, fromAmount");let c=new URLSearchParams({fromChain:String(n),toChain:String(r),fromToken:o,toToken:i,fromAmount:String(s),fromAddress:a}),u=$t({liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,crossChain:Number(r)!==Number(n),requestedCapBps:e.maxSlippageBps??e.slippageBps});if(!u.executable)throw new Error(`lifi: route requires ${u.requiredBps} bps above cap ${u.capBps}`);c.set("slippage",String(u.selectedBps/1e4));let l=await ri({wallet:e.fromAddress,env:t.env,action:e.feeAction||"swap",holderCheck:t.holderCheck});for(let[h,w]of Object.entries(Ad(l)))c.set(h,w);let d=await C(`${va(t)}/quote?${c}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4}),f=d?.estimate?.toAmount||d?.toAmount;if(!f)return{...d,autoSlippagePolicy:u,oracleFee:l};let p=d?.transactionRequest?.to||d?.estimate?.approvalAddress||"lifi",m=ge(d,{chainId:Number(n),venue:p,amountOut:f,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,crossChain:Number(r)!==Number(n),requestedCapBps:e.maxSlippageBps??e.slippageBps}),y=d?.estimate?.toAmountMin||d?.toAmountMin;if(y!=null&&BigInt(y)<BigInt(m.amountOutMinimum))throw new Error("lifi: provider transaction is under-protected versus bounded auto-slippage floor");return{...m,oracleFee:l}}async function ME(e={},t={}){let n=await yn(e,t),r=n?.transactionRequest;if(!r?.to||!r?.data)throw new Error("lifi: quote did not return an executable transactionRequest");let o=Number(e.fromChain);if(r.chainId!=null&&Number(r.chainId)!==o)throw new Error("lifi: transaction chain mismatch");if(e.fromAddress&&r.from&&String(r.from).toLowerCase()!==String(e.fromAddress).toLowerCase())throw new Error("lifi: transaction sender mismatch");let i=null;if(!BE(e.fromToken)){let s=n?.estimate?.approvalAddress||n?.approvalAddress;if(!s)throw new Error("lifi: ERC20 route missing approvalAddress");let a=n?.action?.fromToken?.address||n?.estimate?.fromToken?.address||e.fromToken;i={token:kd(a,"approval token"),spender:kd(s,"approval spender"),amount:String(e.fromAmount)}}return ne({provider:"lifi",calldataReady:!0,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:o,quote:n,autoSlippage:n.autoSlippage,requiresApproval:i,transaction:{chainId:o,from:r.from||e.fromAddress,to:r.to,data:r.data,value:r.value??"0x0",...r.gasLimit!=null?{gasLimit:r.gasLimit}:{},slippageGuard:Ve(n.autoSlippage,{chainId:o,venue:r.to,data:r.data})}},{provider:"lifi",kind:"lifi-tx"})}async function DE(e={}){return C(`${va(e)}/chains`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??12e3})}var Id,Sa,qE,Ur=O(()=>{G();st();ni();xe();oi();Id="https://li.quest/v1";Sa="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",qE="0x0000000000000000000000000000000000000000"});var Td={};z(Td,{PARASWAP_API:()=>_d,paraswapHealth:()=>jE,paraswapPrepare:()=>FE,paraswapPrice:()=>Mn,paraswapTokens:()=>Od});function Un(e,t){let n=String(e||"");if(!/^0x[0-9a-fA-F]{40}$/.test(n))throw new Error(`${t} must be a 20-byte token address`);return n.toLowerCase()}async function Od(e={},t={}){let n=Number(e.chainId||1);return C(`${xa(t)}/tokens/${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function Mn(e={},t={}){let n=Number(e.chainId||e.network||1);if(e.amount==null)throw new Error("amount required");let r=new URLSearchParams({srcToken:Un(e.srcToken,"srcToken"),destToken:Un(e.destToken,"destToken"),amount:String(e.amount),srcDecimals:String(Number(e.srcDecimals)),destDecimals:String(Number(e.destDecimals)),side:String(e.side||"SELL").toUpperCase(),network:String(n),version:String(e.version||"6.2")});e.includeDEXS&&r.set("includeDEXS",String(e.includeDEXS)),e.excludeDEXS&&r.set("excludeDEXS",String(e.excludeDEXS));let o=await ri({wallet:e.userAddress||e.fromAddress,env:t.env,action:e.feeAction||"swap",holderCheck:t.holderCheck});for(let[a,c]of Object.entries(xd(o)))r.set(a,c);let i=await C(`${xa(t)}/prices?${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4}),s=i?.priceRoute?.destAmount;return s?{...ge(i,{chainId:n,venue:i?.priceRoute?.contractAddress||"paraswap-quote",amountOut:s,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,quoteAgeMs:0,requestedCapBps:e.maxSlippageBps??e.slippageBps}),executionReady:!1,executionBlocker:"call prepare to bind the price route to a validated transaction",oracleFee:o}:{...i,executionReady:!1,oracleFee:o}}async function FE(e={},t={}){if(String(e.side||"SELL").toUpperCase()!=="SELL")throw new Error("paraswap: agentic prepare currently supports exact-input SELL only");let n=Number(e.chainId||e.network||1),r=Un(e.userAddress,"userAddress"),o=await Mn(e,t),i=o?.priceRoute,s=String(i?.contractAddress||"").toLowerCase();if(!s)throw new Error("paraswap: price route missing contractAddress");let a={srcToken:Un(e.srcToken,"srcToken"),destToken:Un(e.destToken,"destToken"),srcAmount:String(i.srcAmount||e.amount),destAmount:String(o.amountOutMinimum),priceRoute:i,userAddress:r,ignoreChecks:!1,ignoreGasEstimate:!1};e.receiver&&(a.receiver=Un(e.receiver,"receiver"));let c=await C(`${xa(t)}/transactions/${n}`,{method:"POST",body:a,fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??25e3});if(Number(c.chainId??n)!==n)throw new Error("paraswap: transaction chain mismatch");if(String(c.to||"").toLowerCase()!==s)throw new Error("paraswap: transaction target mismatch");if(c.from&&String(c.from).toLowerCase()!==r)throw new Error("paraswap: transaction sender mismatch");return ne({provider:"paraswap",calldataReady:!0,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:n,quote:o,autoSlippage:o.autoSlippage,requiresApproval:a.srcToken!=="0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee"?{token:a.srcToken,spender:i.tokenTransferProxy||s,amount:a.srcAmount}:null,transaction:{chainId:n,from:c.from||r,to:c.to,data:c.data,value:c.value??"0x0",...c.gas!=null?{gasLimit:c.gas}:{},slippageGuard:Ve(o.autoSlippage,{chainId:n,venue:c.to,data:c.data})}},{provider:"paraswap",kind:"paraswap-tx"})}async function jE(e={}){let t=await Od({chainId:1},e),n=Array.isArray(t?.tokens)?t.tokens.length:Object.keys(t?.tokens||{}).length;return{ok:n>0,tokenSample:n}}var _d,xa,ii=O(()=>{G();st();xe();oi();_d="https://api.paraswap.io",xa=(e={})=>(e.baseUrl||process.env.PARASWAP_API_URL||_d).replace(/\/$/,"")});function Mr({provider:e,defaultUrl:t,hosts:n=[],url:r,strict:o=!1}){let s=(String(r??"").trim()||String(t)).replace(/\/$/,"");if(s===String(t).replace(/\/$/,""))return{baseUrl:s,trusted:!0,host:Nd(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([Nd(t),...n]).has(c)){let l=/^(127\.0\.0\.1|localhost|\[::1\])(:\d+)?$/i.test(c);return a.protocol==="http:"&&!l?{baseUrl:s,trusted:!1,host:c,reason:"plaintext http downgrade"}:{baseUrl:s,trusted:!0,host:c}}if(String(process.env[Cd]||"")==="1")return{baseUrl:s,trusted:!1,host:c};if(o)throw new Error(`${e}: refusing to call non-allowlisted host ${c} (set ${Cd}=1 to permit it)`);return{baseUrl:s,trusted:!1,host:c}}function Nd(e){let t=new URL(String(e));if(t.protocol!=="http:"&&t.protocol!=="https:")throw new Error("unsupported protocol");return t.host}function Dr(e,t,n){let r={...e};if(!n)return r;for(let[o,i]of Object.entries(t||{}))i&&(r[o]=i);return r}var Cd,si=O(()=>{Cd="ORACLE_ALLOW_CUSTOM_PROVIDER_URL"});var Bd={};z(Bd,{ZEROX_API:()=>Rd,zeroxHealth:()=>HE,zeroxPrepare:()=>zE,zeroxPrice:()=>qd,zeroxQuote:()=>Dn});function Pd(e={}){return Mr({provider:"zerox",defaultUrl:Rd,hosts:["api.0x.org"],url:e.baseUrl||process.env.ZEROX_API_URL})}function Ld(e={}){return Pd(e).baseUrl}function ai(e={}){return e.apiKey||process.env.ZEROX_API_KEY||process.env.OX_API_KEY||process.env["0X_API_KEY"]||""}function $d(e={}){return Dr({"0x-version":"v2",accept:"application/json"},{"0x-api-key":ai(e)},Pd(e).trusted)}async function HE(e={}){if(!ai(e))return{ok:!1,configured:!1,error:"ZEROX_API_KEY not set"};try{let t=await qd({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 qd(e={},t={}){if(!ai(t))throw new Error("ZEROX_API_KEY required for 0x");let{chainId:n=8453,sellToken:r,buyToken:o,sellAmount:i,taker:s}=e;if(!r||!o||!i)throw new Error("zeroxPrice requires sellToken, buyToken, sellAmount");let a=new URLSearchParams({chainId:String(n),sellToken:r,buyToken:o,sellAmount:String(i)});return s&&a.set("taker",s),C(`${Ld(t)}/swap/allowance-holder/price?${a}`,{headers:$d(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function Dn(e={},t={}){if(!ai(t))throw new Error("ZEROX_API_KEY required for 0x");let{chainId:n=8453,sellToken:r,buyToken:o,sellAmount:i,taker:s}=e;if(!r||!o||!i)throw new Error("zeroxQuote requires sellToken, buyToken, sellAmount");let a=$t({liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps});if(!a.executable)throw new Error(`0x: route requires ${a.requiredBps} bps above cap ${a.capBps}`);let c=new URLSearchParams({chainId:String(n),sellToken:r,buyToken:o,sellAmount:String(i),slippageBps:String(a.selectedBps)});s&&c.set("taker",s);let u=await C(`${Ld(t)}/swap/allowance-holder/quote?${c}`,{headers:$d(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),l=u?.buyAmount||u?.grossBuyAmount;return l?ge(u,{chainId:n,venue:u?.transaction?.to||u?.to||"0x",amountOut:l,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps}):{...u,autoSlippagePolicy:a}}async function zE(e={},t={}){if(!e.taker)throw new Error("0x: taker required for executable prepare");let n=await Dn(e,t),r=n?.transaction;if(!r?.to||!r?.data)throw new Error("0x: firm quote returned no transaction");let o=Number(e.chainId??8453),i=n?.issues?.allowance?.spender||n?.allowanceTarget;return ne({provider:"zerox",calldataReady:!0,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:o,quote:n,autoSlippage:n.autoSlippage,requiresApproval:n?.issues?.allowance?.actual!=null&&BigInt(n.issues.allowance.actual)<BigInt(e.sellAmount)?{token:e.sellToken,spender:i,amount:String(e.sellAmount)}:null,transaction:{chainId:o,from:e.taker,to:r.to,data:r.data,value:r.value??"0x0",...r.gas!=null?{gasLimit:r.gas}:{},slippageGuard:Ve(n.autoSlippage,{chainId:o,venue:r.to,data:r.data})}},{provider:"zerox",kind:"zerox-tx"})}var Rd,ci=O(()=>{G();st();si();xe();Rd="https://api.0x.org"});function Ud(e={}){return Mr({provider:"oneinch",defaultUrl:VE,hosts:["api.1inch.dev"],url:e.baseUrl||process.env.ONEINCH_API_URL})}function WE(e={}){return Ud(e).baseUrl}function Md(e={}){return e.apiKey||process.env.ONEINCH_API_KEY||process.env.ONE_INCH_API_KEY||""}function GE(e={}){let t=Md(e);return Dr({accept:"application/json"},{Authorization:t?`Bearer ${t}`:""},Ud(e).trusted)}async function Dd(e={},t={}){if(!Md(t))throw new Error("ONEINCH_API_KEY required for 1inch");let n=Number(e.chainId??1),{src:r,dst:o,amount:i}=e;if(!r||!o||!i)throw new Error("oneinchQuote requires src, dst, amount");let s=new URLSearchParams({src:r,dst:o,amount:String(i)}),a=await C(`${WE(t)}/${n}/quote?${s}`,{headers:GE(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3});return a?.dstAmount?ge(a,{chainId:n,venue:"1inch-quote",amountOut:a.dstAmount,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps}):a}var VE,Fd=O(()=>{G();st();si();xe();VE="https://api.1inch.dev/swap/v6.0"});var CP,jd=O(()=>{CP=Object.freeze({READ:"read",PREPARE:"prepare",EXECUTE:"execute",AUTONOMOUS:"autonomous"})});import ui from"node:fs";import KE from"node:os";import jn from"node:path";import{fileURLToPath as YE}from"node:url";function Hd(){return process.env.ORACLE_FAKE_HOME||KE.homedir()}function JE(){return process.env.ORACLE_PUBLIC_DESKTOP==="1"}function li(){return JE()?process.env.ORACLE_CONFIG_DIR||jn.join(Hd(),".config","oracle"):jn.join(Hd(),".config","oracle")}function QE(){return jn.join(li(),"desk.json")}function ZE(){return jn.join(li(),"env")}function Fn({force:e=!1}={}){if(Fn._done&&!e)return Fn._result||null;Fn._done=!0;let t={},n=(o,i)=>{if(i==null)return;let s=String(i).trim();s&&(process.env[o]!=null&&String(process.env[o]).trim()!==""||(process.env[o]=s,t[o]=s))};try{let o=ZE();if(ui.existsSync(o))for(let i of ui.readFileSync(o,"utf8").split(/\r?\n/)){let s=i.match(/^\s*([A-Z0-9_]+)\s*=\s*(.*?)\s*$/);if(!s||s[2].startsWith("#"))continue;let a=s[2];(a.startsWith('"')&&a.endsWith('"')||a.startsWith("'")&&a.endsWith("'"))&&(a=a.slice(1,-1)),n(s[1],a)}}catch{}try{let o=QE();if(ui.existsSync(o)){let i=JSON.parse(ui.readFileSync(o,"utf8"));i&&typeof i=="object"&&(n("ORACLE_DESK_URL",i.deskUrl||i.dataUrl||i.url),n("ORACLE_DATA_URL",i.dataUrl||i.deskUrl||i.url),n("ORACLE_API_URL",i.apiUrl||i.dataUrl||i.deskUrl),n("ORACLE_PUBLIC_URL",i.publicUrl||i.deskUrl||i.dataUrl),n("ORACLE_EXEC_URL",i.execUrl),n("MAD_DESK_URL",i.deskUrl||i.dataUrl))}}catch{}let r=process.env.ORACLE_DESK_URL||process.env.ORACLE_DATA_URL||"";return r&&(n("ORACLE_DESK_URL",r),n("ORACLE_DATA_URL",r),n("ORACLE_API_URL",r),n("ORACLE_PUBLIC_URL",r),n("MAD_DESK_URL",r)),Fn._result=Object.keys(t).length?t:null,Fn._result}var XE,qP,zd=O(()=>{XE=jn.dirname(YE(import.meta.url)),qP=jn.resolve(XE,"../..");try{Fn()}catch{}});var Gd={};z(Gd,{armPreparedAction:()=>aS,callSigner:()=>Vd,queueOwnerAction:()=>Wd});import{existsSync as eS,readFileSync as tS}from"node:fs";import{request as nS}from"node:http";import rS from"node:path";function iS(e=process.env){let t=String(e.ORACLE_SIGNER_URL||oS).replace(/\/$/,""),n;try{n=new URL(t)}catch{return null}return n.hostname!=="127.0.0.1"&&n.hostname!=="localhost"&&n.hostname!=="::1"?null:n.origin}function sS(e=process.env){if(e.ORACLE_SIGNER_TOKEN)return String(e.ORACLE_SIGNER_TOKEN);let t=rS.join(li(),"signer","signer-token");return eS(t)?tS(t,"utf8").trim():null}function Vd(e,{method:t="GET",body:n=null,env:r=process.env,timeoutMs:o=4e3}={}){let i=iS(r),s=sS(r);return!i||!s?Promise.resolve({ok:!1,error:"local signer is not running"}):new Promise(a=>{let c=new URL(e,i),u=n?Buffer.from(JSON.stringify(n)):null,l=nS({hostname:c.hostname,port:c.port||80,path:c.pathname,method:t,timeout:o,headers:{authorization:`Bearer ${s}`,origin:i,...u?{"content-type":"application/json","content-length":u.length}:{}}},d=>{let f=[];d.on("data",p=>f.push(p)),d.on("end",()=>{let p=Buffer.concat(f).toString("utf8"),m={};try{m=p?JSON.parse(p):{}}catch{m={error:"signer refused"}}a({httpStatus:d.statusCode,...m})})});l.on("timeout",()=>{l.destroy(),a({ok:!1,error:"local signer timed out"})}),l.on("error",()=>a({ok:!1,error:"local signer is not running"})),u&&l.write(u),l.end()})}async function Wd(e,t=process.env){if(!e||e.version!==1||!e.surface)throw new Error("queueOwnerAction: version-1 surface envelope required");return Vd("/pending",{method:"POST",body:{artifact:e},env:t,timeoutMs:8e3})}async function aS(e,t=process.env){let n=e?.localSignerEnvelope||e?.envelope;if(!n||n.version!==1||!n.surface)throw new Error("armPreparedAction: prepared.localSignerEnvelope v1 required");return Wd(n,t)}var oS,Kd=O(()=>{zd();oS="http://127.0.0.1:9462"});var rp={};z(rp,{COW_CANCEL_TYPES:()=>Qd,COW_HOSTS:()=>pi,COW_ORDER_TYPES:()=>di,COW_SETTLEMENT:()=>Yd,COW_VAULT_RELAYER:()=>Xd,armCowOrder:()=>mS,buildArmedCowOrder:()=>Oa,cowCancelOrders:()=>ES,cowChains:()=>AS,cowHealth:()=>pS,cowOrder:()=>np,cowOrderStatus:()=>tp,cowOrderUid:()=>hS,cowPrepareCancel:()=>bS,cowPrepareOrder:()=>fS,cowQuote:()=>gn,cowSignCancel:()=>wS,cowSignOrder:()=>yS,cowSubmitSignedOrder:()=>gS,cowVerifyOrderFill:()=>vS});import{TypedDataEncoder as Ia,getAddress as Fr,isAddress as cS}from"ethers";function fi(e,t={}){if(t.baseUrl)return t.baseUrl.replace(/\/$/,"");let n=pi[Number(e)];if(!n)throw new Error(`cowswap: unsupported chainId ${e}`);return n}function uS(e,t="v1",n={}){let r=fi(e,n);return t==="v1"?r:r.replace(/\/api\/v1$/,`/api/${t}`)}function qt(e,t){let n=String(e||"").trim();if(!cS(n))throw new Error(`cowswap: ${t} must be an address`);return Fr(n).toLowerCase()}function Hn(e,t){try{let n=BigInt(String(e));if(n<0n)throw new Error("negative");return n.toString()}catch{throw new Error(`cowswap: ${t} must be a non-negative integer string`)}}function Zd(e,t){let n=String(e||"").trim();if(!/^0x[0-9a-fA-F]{64}$/.test(n))throw new Error(`cowswap: ${t} must be bytes32 hex`);return n.toLowerCase()}function ep(e,t="uid"){let n=String(e||"").trim();if(!/^0x[0-9a-fA-F]{112}$/.test(n))throw new Error(`cowswap: ${t} must be 56-byte order UID hex`);return n.toLowerCase()}function lS({digest:e,owner:t,validTo:n}={}){let r=Zd(e,"order digest").slice(2),o=qt(t,"owner").slice(2).toLowerCase(),i=Number(n);if(!Number.isInteger(i)||i<0||i>4294967295)throw new Error("cowswap: validTo must fit uint32");return`0x${r}${o}${i.toString(16).padStart(8,"0")}`.toLowerCase()}function _a(e){let t=Yd[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:Fr(t)}}function dS(e={},t,n){let r=qt(e.sellToken,"sellToken"),o=qt(e.buyToken,"buyToken"),i=qt(e.receiver||n,"receiver"),s=Number(e.validTo);if(!Number.isInteger(s)||s<=0)throw new Error("cowswap: quote.validTo required");let a=Zd(e.appData||e.appDataHash||`0x${"0".repeat(64)}`,"appData");return{sellToken:r,buyToken:o,receiver:i,sellAmount:Hn(e.sellAmount,"sellAmount"),buyAmount:Hn(e.buyAmount,"buyAmount"),validTo:s,appData:a,feeAmount:Hn(e.feeAmount??"0","feeAmount"),kind:String(e.kind||"sell"),partiallyFillable:!!e.partiallyFillable,sellTokenBalance:String(e.sellTokenBalance||"erc20"),buyTokenBalance:String(e.buyTokenBalance||"erc20")}}async function pS(e={}){try{let t=await gn({chainId:1,sellToken:ka[1],buyToken:Jd[1],sellAmountBeforeFee:"1000000000000000",from:Jt},e);return{ok:!0,buyAmount:t.quote?.buyAmount||t.buyAmount}}catch(t){return{ok:!1,error:String(t.message||t).slice(0,160)}}}async function gn(e={},t={}){let n=Number(e.chainId??1),r=wa(e.from||e.owner),o=e.sellToken||ka[n],i=e.buyToken||Jd[n],s=String(e.sellAmountBeforeFee||e.sellAmount||"0");if(!o||!i||s==="0")throw new Error("cowQuote requires sellToken, buyToken, sellAmountBeforeFee");if(/eeeeeeee|native|^eth$/i.test(o)&&(o=ka[n],!o))throw new Error("no WETH mapping for chain");let a={sellToken:o,buyToken:i,from:r,receiver:e.receiver||r,sellAmountBeforeFee:s,kind:e.kind||"sell",signingScheme:e.signingScheme||"eip1271"},c=await C(`${fi(n,t)}/quote`,{method:"POST",body:a,fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),u=c?.quote?.buyAmount||c?.buyAmount;return u?ge(c,{chainId:n,venue:"cowswap-order",amountOut:u,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps}):c}async function fS(e={},t={}){let n=Number(e.chainId??1),r=qt(wa(e.from||e.owner||e.signer),"owner"),o=await gn({...e,chainId:n,from:r,signingScheme:e.signingScheme||"eip712"},t),i=dS(o?.quote||o,n,r),s=_a(n),a={domain:s,types:di,primaryType:"Order",message:i},c=Ia.hash(s,di,i),u=Xd[n];if(!u)throw new Error(`cowswap: vault relayer not registered for chain ${n}`);return ne({provider:"cowswap",orderReady:!0,executionReady:!1,chainId:n,owner:r,signingScheme:"eip712",settlement:s.verifyingContract.toLowerCase(),vaultRelayer:Fr(u).toLowerCase(),quote:o,quoteId:o?.id??e.quoteId??null,typedData:a,cowGuard:{mode:"cow-order",version:1,provider:"cowswap",chainId:n,owner:r,settlement:s.verifyingContract.toLowerCase(),vaultRelayer:Fr(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:Fr(u).toLowerCase(),amount:i.sellAmount},localSignerEnvelope:Oa({chainId:n,owner:r,typedData:a,quoteId:o?.id??e.quoteId??null,cowGuard:{expiresAtMs:Math.min(i.validTo*1e3,Date.now()+2e4)}})},{provider:"cowswap",kind:"cow-order"})}function Oa(e={},t={}){let n=e.typedData;if(!n?.domain||!n?.types||!n?.message)throw new Error("cowswap: typedData required to arm");let r=Number(e.chainId??n.domain.chainId),o=pi[r];if(!o)throw new Error(`cowswap: unsupported chainId ${r}`);let i=qt(e.owner,"owner"),s=Number(t.nowMs??Date.now()),a=Ia.hash(n.domain,n.types,n.message);return Object.freeze({tradeId:`cow:${r}:${a.slice(2)}`,version:1,surface:"evm-order",action:"order",owner:i,destination:"cowswap",chainId:r,expiresAtMs:Number(e.cowGuard?.expiresAtMs??s+2e4),slippageBps:0,fee:{oracleFeeBps:0},artifact:Object.freeze({kind:"cow",chainId:r,submitTo:`${o}/orders`,quoteId:e.quoteId??null,domain:n.domain,types:n.types,message:n.message,typedData:n})})}async function mS(e={},t={}){let{queueOwnerAction:n}=await Promise.resolve().then(()=>(Kd(),Gd)),r=e.localSignerEnvelope||Oa(e,t);return{...await n(r,t.env),envelope:r,execution:"armed-local",exec:!1}}async function tp(e={},t={}){let n=Number(e.chainId??1),r=String(e.uid||e.orderUid||"").trim();if(!r)throw new Error("cowOrderStatus requires uid");return C(`${fi(n,t)}/orders/${encodeURIComponent(r)}/status`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function np(e={},t={}){let n=Number(e.chainId??1),r=String(e.uid||e.orderUid||"").trim();if(!r)throw new Error("cowOrder requires uid");return C(`${fi(n,t)}/orders/${encodeURIComponent(r)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}function hS(e={}){let t=e.typedData||e,n=Number(e.chainId??t?.domain?.chainId),r=t?.message||e.order||e.message;if(!r)throw new Error("cowswap: typed order message required");let o=e.cowGuard?.typedDataHash||Ia.hash(_a(n),di,r),i=e.owner||e.from||e.signer||r.receiver;return lS({digest:o,owner:i,validTo:r.validTo})}async function yS(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 gS(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 bS(e={}){let t=Number(e.chainId??1),n=qt(e.owner||e.from||e.signer,"owner"),r=(e.orderUids||e.uids||[e.uid]).filter(Boolean).map((s,a)=>ep(s,`orderUids[${a}]`));if(!r.length)throw new Error("cowswap: orderUids required");let o=_a(t);return ne({provider:"cowswap",chainId:t,owner:n,orderUids:r,signingScheme:"eip712",typedData:{domain:o,types:Qd,primaryType:"OrderCancellations",message:{orderUids:r}},cancelReady:!0,executableArtifact:!0},{provider:"cowswap",kind:"cow-cancel"})}async function wS(e={},t={}){throw new Error("cowswap.cowSignCancel refused: @oracle-agent/oracle is prepare-only. Cancel-sign with the user wallet.")}async function ES(e={},t={}){throw new Error("cowswap.cowCancelOrders refused: @oracle-agent/oracle is prepare-only. Cancel from the user wallet or local operator.")}function SS(e={}){return Hn(e.buyAmount??e.executedBuyAmount??"0","trade.buyAmount")}async function vS(e={},t={}){let n=Number(e.chainId??1),r=ep(e.uid||e.orderUid),o=t.order||await np({chainId:n,uid:r},t),i=t.status||o.status||await tp({chainId:n,uid:r},t).catch(()=>null),s=t.trades||await C(`${uS(n,"v2",t)}/trades?orderUid=${encodeURIComponent(r)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),a=Array.isArray(s)?s:[],c=e.expectedOwner?qt(e.expectedOwner,"expectedOwner"):null;if(c&&qt(o.owner||a[0]?.owner||c,"owner")!==c)return{ok:!1,provider:"cowswap",chainId:n,uid:r,reason:"owner mismatch",order:o,status:i,trades:a};let u=0n;for(let f of a.filter(p=>String(p.orderUid||"").toLowerCase()===r))u+=BigInt(SS(f));u===0n&&o.executedBuyAmount!=null&&(u=BigInt(Hn(o.executedBuyAmount,"executedBuyAmount")));let l=e.minBuyAmount!=null?BigInt(Hn(e.minBuyAmount,"minBuyAmount")):0n,d=u>=l&&String(o.status||i?.status||"").toLowerCase()!=="expired";return{ok:d,provider:"cowswap",chainId:n,uid:r,status:o.status||i?.status||null,executedBuyAmount:u.toString(),minBuyAmount:e.minBuyAmount??null,trades:a,settlementTxs:[...new Set(a.map(f=>f.txHash).filter(Boolean))],order:o,orderStatus:i,reason:d?null:"insufficient fill or expired order"}}function AS(){return Object.keys(pi).map(Number)}var pi,Yd,Xd,ka,Jd,di,Qd,mi=O(()=>{G();st();jd();ni();xe();pi={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"},Yd=Object.freeze({1:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41",100:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41",42161:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41",8453:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41"}),Xd=Object.freeze({1:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110",100:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110",42161:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110",8453:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110"}),ka={1:"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",8453:"0x4200000000000000000000000000000000000006",42161:"0x82aF49447D8a07e3bd95BD0d56f35241523fBab1"},Jd={1:"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",8453:"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",42161:"0xaf88d065e77c8cC2239327C5EDb3A432268e5831"},di=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"}]}),Qd=Object.freeze({OrderCancellations:[{name:"orderUids",type:"bytes[]"}]})});function IS(e={}){return(e.baseUrl||process.env.DEFILLAMA_COINS_URL||xS).replace(/\/$/,"")}function _S(e={}){return(e.baseUrl||process.env.DEFILLAMA_API_URL||kS).replace(/\/$/,"")}async function hi(e,t={}){if(!Array.isArray(e)||!e.length)throw new Error("llamaPrices requires coins[]");let n=e.map(encodeURIComponent).join(",");return C(`${IS(t)}/prices/current/${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function op(e={}){return C(`${_S(e)}/protocols`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??2e4})}var xS,kS,Ta=O(()=>{G();xS="https://coins.llama.fi",kS="https://api.llama.fi"});var yi={};z(yi,{ACROSS_API:()=>ip,HOP_API:()=>sp,RELAY_API:()=>ap,acrossHealth:()=>TS,acrossSuggestedFees:()=>cp,hopHealth:()=>CS,hopQuote:()=>up,relayHealth:()=>NS,relayPrepare:()=>RS,relayQuote:()=>Ca});async function TS(e={}){try{return{ok:!0,estimatedFillTimeSec:(await cp({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 cp(e={},t={}){let{token:n,destinationToken:r=n,originChainId:o,destinationChainId:i,amount:s}=e;if(!n||o==null||i==null||!s)throw new Error("acrossSuggestedFees requires token, originChainId, destinationChainId, amount");let a=new URLSearchParams({token:n,destinationToken:r,originChainId:String(o),destinationChainId:String(i),amount:String(s)}),c=(t.baseUrl||process.env.ACROSS_API_URL||ip).replace(/\/$/,"");return C(`${c}/suggested-fees?${a}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function CS(e={}){try{let t=await up({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 up(e={},t={}){let{amount:n,token:r="ETH",fromChain:o="ethereum",toChain:i="arbitrum"}=e;if(!n)throw new Error("hopQuote requires amount");let s=e.slippage==null?void 0:Math.round(Number(e.slippage)*100),a=$t({liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,crossChain:o!==i,requestedCapBps:e.maxSlippageBps??e.slippageBps??s});if(!a.executable)throw new Error(`hop: route requires ${a.requiredBps} bps above cap ${a.capBps}`);let c=new URLSearchParams({amount:String(n),token:r,fromChain:o,toChain:i,slippage:String(a.selectedBps/100)}),u=(t.baseUrl||process.env.HOP_API_URL||sp).replace(/\/$/,""),l=await C(`${u}/quote?${c}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),d=l?.estimatedRecieved||l?.estimatedReceived;return d?ge(l,{chainId:Number(e.originChainId||e.chainId||OS[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 NS(e={}){try{let t=await Ca({user:Jt,originChainId:1,destinationChainId:8453,originCurrency:"0x0000000000000000000000000000000000000000",destinationCurrency:"0x0000000000000000000000000000000000000000",amount:"1000000000000000",tradeType:"EXACT_INPUT"},e);return{ok:!0,hasSteps:Array.isArray(t.steps),stepCount:t.steps?.length||0}}catch(t){return{ok:!1,error:String(t.message||t).slice(0,160)}}}async function Ca(e={},t={}){let{user:n=Jt,originChainId:r,destinationChainId:o,originCurrency:i="0x0000000000000000000000000000000000000000",destinationCurrency:s="0x0000000000000000000000000000000000000000",amount:a,tradeType:c="EXACT_INPUT"}=e;if(r==null||o==null||!a)throw new Error("relayQuote requires originChainId, destinationChainId, amount");let u=$t({liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,crossChain:Number(r)!==Number(o),requestedCapBps:e.maxSlippageBps??e.slippageBps});if(!u.executable)throw new Error(`relay: route requires ${u.requiredBps} bps above cap ${u.capBps}`);let l=(t.baseUrl||process.env.RELAY_API_URL||ap).replace(/\/$/,""),d=await C(`${l}/quote`,{method:"POST",body:{user:n,originChainId:Number(r),destinationChainId:Number(o),originCurrency:i,destinationCurrency:s,amount:String(a),tradeType:c,slippageTolerance:String(u.selectedBps)},fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4}),f=d?.details?.currencyOut?.amount;return!f||!/^\d+$/.test(String(f))?{...d,autoSlippagePolicy:u}:ge(d,{chainId:Number(r),venue:d?.steps?.[0]?.items?.[0]?.data?.to||"relay",amountOut:f,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,crossChain:Number(r)!==Number(o),requestedCapBps:e.maxSlippageBps??e.slippageBps})}async function RS(e={},t={}){let n=await Ca(e,t),r=Number(e.originChainId),o=(n.steps||[]).flatMap(a=>(a.items||[]).filter(c=>c?.data?.to&&c?.data?.data).map(c=>({stepId:a.id,...c.data})));if(!o.length)throw new Error("relay: quote returned no executable transaction items");let i=String(n?.autoSlippage?.venue||"").toLowerCase();if(o.some(a=>String(a.to).toLowerCase()!==i))throw new Error("relay: route includes a separate approval/transaction that is not yet safely bound");let s=o.map(a=>({chainId:r,from:a.from||e.user,to:a.to,data:a.data,value:a.value??"0x0",...a.gasLimit!=null||a.gas!=null?{gasLimit:a.gasLimit??a.gas}:{},slippageGuard:Ve(n.autoSlippage,{chainId:r,venue:a.to,data:a.data})}));return ne({provider:"relay",calldataReady:!0,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:r,quote:n,autoSlippage:n.autoSlippage,transactions:s},{provider:"relay",kind:"relay-tx"})}var ip,sp,ap,OS,gi=O(()=>{G();st();ni();xe();ip="https://across.to/api",sp="https://api.hop.exchange/v1",ap="https://api.relay.link",OS={ethereum:1,optimism:10,bsc:56,polygon:137,arbitrum:42161,avalanche:43114,base:8453}});function bi(e){if(!Array.isArray(e))return null;let t=0,n=!1;for(let r of e){let o=bt(r?.amountUSD);o!=null&&(t+=o,n=!0)}return n?t:null}async function dp(e,t={}){let n=md[Number(e)];if(!n)return null;try{let r=await hi([n],t);return bt(r?.coins?.[n]?.price)}catch{return null}}async function PS(e={}){try{let t=await op({...e,baseUrl:e.defillamaApiBaseUrl,timeoutMs:e.defillamaTimeoutMs??Math.min(Number(e.timeoutMs??5e3),5e3)});return Array.isArray(t)?t:[]}catch{return[]}}function LS(e,t={}){let n=Qt(t.tool||t.provider||t.bridge||t.protocol),r=[];return e==="lifi"&&n&&n!=="lifi"&&r.push(...lp[n]||[n]),r.push(...lp[Qt(e)]||[e]),r}function $S(e,t,n={}){let r=Array.isArray(e)?e:[],o=LS(t,n).map(Qt).filter(Boolean);for(let i of o){let s=r.find(c=>Qt(c?.slug)===i||Qt(c?.name)===i),a=bt(s?.tvl);if(a!=null)return{liquidityUsd:a,protocol:s?.name??s?.slug??i}}for(let i of o){let s=r.find(c=>{let u=Qt(c?.category);return!u.includes("bridge")&&!u.includes("crosschain")?!1:Qt(c?.slug).includes(i)||Qt(c?.name).includes(i)}),a=bt(s?.tvl);if(a!=null)return{liquidityUsd:a,protocol:s?.name??s?.slug??i}}return null}function Na({chainId:e,tokenIn:t,tokenOut:n,amountIn:r,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 f=await yn({fromChain:e,toChain:e,fromToken:t,toToken:n,fromAmount:r},l),p=f?.estimate??f?.[0]?.estimate;return{amountOut:p?.toAmount,minOut:p?.toAmountMin,gasUsd:bi(p?.gasCosts),feeUsd:bi(p?.feeCosts),oracleFeeBps:f?.oracleFee?.applies?f.oracleFee.bps:0,meta:{tool:f?.tool??f?.toolDetails?.name,oracleFee:f?.oracleFee??null}}}}),s!=null&&d.push({source:"paraswap",run:async()=>{let f=a??(await Promise.resolve(u))?.decimals;if(f==null)throw new Error("paraswap needs destination decimals; none supplied or resolvable");let p=await Mn({chainId:e,srcToken:t,destToken:n,amount:r,srcDecimals:s,destDecimals:f},l),m=p?.priceRoute;return{amountOut:m?.destAmount,gasUsd:bt(m?.gasCostUSD),oracleFeeBps:p?.oracleFee?.applies?p.oracleFee.bps:0,meta:{bestRoute:m?.bestRoute?.[0]?.swaps?.[0]?.swapExchanges?.[0]?.exchange,oracleFee:p?.oracleFee??null}}}}),process.env.ZEROX_API_KEY&&d.push({source:"0x",run:async()=>{let f=await Dn({chainId:e,sellToken:t,buyToken:n,sellAmount:r,taker:o},l),p=null,m=f?.totalNetworkFee,y=await Promise.resolve(c);return m!=null&&y&&(p=Number(m)/1e18*y),{amountOut:f?.buyAmount,minOut:f?.minBuyAmount,gasUsd:p,meta:{source:f?.route?.fills?.[0]?.source}}}}),process.env.ONEINCH_API_KEY&&d.push({source:"1inch",run:async()=>{let f=await Dd({chainId:e,src:t,dst:n,amount:r},l),p=null;return f?.gas!=null&&c&&(p=null),{amountOut:f?.dstAmount,gasUsd:p,meta:{gasUnits:f?.gas}}}}),d.push({source:"cow",run:async()=>{let f=await gn({chainId:e,sellToken:t,buyToken:n,sellAmountBeforeFee:String(r),from:o},l),p=f?.quote??f,m=p?.feeAmount;return{amountOut:p?.buyAmount,gasUsd:0,meta:{intent:!0,feeAmountInSellToken:m,settlement:"solver-executed"}}}}),We[Number(e)]&&d.push({source:"uniswap-v4",run:async()=>{let f=await Qo({chainId:e,tokenIn:t,tokenOut:n,amountIn:r,recipient:o,slippageBps:i},l);return{amountOut:f?.amountOut,minOut:f?.minOut??f?.amountOutMinimum??null,gasUsd:null,liquidityUsd:f?.liquidityUsd??null,meta:{onchain:!0,venue:"uniswap-v4",fee:f?.fee,tickSpacing:f?.tickSpacing,poolId:f?.poolId,hooks:f?.hooks,gasUnits:f?.gasEstimate,quoter:f?.quoter,poolManager:f?.poolManager,prepareReady:f?.prepareReady===!0,executionReady:!1}}}}),ke[Number(e)]&&d.push({source:"uniswap-v3",run:async()=>{let f=await hn({chainId:e,tokenIn:t,tokenOut:n,amountIn:r},l);return{amountOut:f?.amountOut,minOut:f?.minOut??f?.amountOutMinimum??null,gasUsd:null,liquidityUsd:f?.liquidityUsd??null,meta:{onchain:!0,fee:f?.fee,gasUnits:f?.gasEstimate,quoter:f?.quoter}}}}),d}function pp({fromChainId:e,toChainId:t,tokenIn:n,tokenOut:r,amountIn:o,taker:i,opts:s={}}){let a=[],c=null,u=async(l,d={})=>(c||=PS(s),$S(await c,l,d));return a.push({source:"lifi",run:async()=>{let l=await yn({fromChain:e,toChain:t,fromToken:n,toToken:r,fromAmount:o},s),d=l?.estimate??l?.[0]?.estimate,f={tool:l?.tool??l?.toolDetails?.name,durationSeconds:bt(d?.executionDuration)},p=await u("lifi",f);return{amountOut:d?.toAmount,minOut:d?.toAmountMin,gasUsd:bi(d?.gasCosts),feeUsd:bi(d?.feeCosts),oracleFeeBps:l?.oracleFee?.applies?l.oracleFee.bps:0,liquidityUsd:p?.liquidityUsd??null,meta:{...f,liquidityProtocol:p?.protocol,oracleFee:l?.oracleFee??null}}}}),a.push({source:"relay",run:async()=>{let{relayQuote:l}=await Promise.resolve().then(()=>(gi(),yi)),f=(await l({user:i,originChainId:e,destinationChainId:t,originCurrency:n,destinationCurrency:r,amount:String(o)},s))?.details,p={durationSeconds:bt(f?.timeEstimate),rate:f?.rate},m=await u("relay",p);return{amountOut:f?.currencyOut?.amount,minOut:f?.currencyOut?.minimumAmount,gasUsd:bt(f?.totalImpact?.usd)!=null?Math.abs(bt(f.totalImpact.usd)):null,liquidityUsd:m?.liquidityUsd??null,meta:{...p,liquidityProtocol:m?.protocol}}}}),a.push({source:"across",run:async()=>{let{acrossSuggestedFees:l}=await Promise.resolve().then(()=>(gi(),yi)),d=await l({token:n,destinationToken:r,originChainId:e,destinationChainId:t,amount:String(o)},s),f=d?.totalRelayFee?.total,p=null;if(f!=null)try{let y=BigInt(String(o))-BigInt(String(f));y>0n&&(p=y.toString())}catch{}let m=await u("across");return{amountOut:p,gasUsd:null,liquidityUsd:m?.liquidityUsd??null,meta:{derivedFromFees:!0,durationSeconds:bt(d?.estimatedFillTimeSec),limits:d?.limits?{min:d.limits.minDeposit,max:d.limits.maxDeposit}:void 0,liquidityProtocol:m?.protocol}}}}),a}var bt,Qt,lp,fp=O(()=>{Ur();ii();ci();Fd();mi();Rr();Zo();Ta();ba();bt=e=>{let t=Number(e);return Number.isFinite(t)?t:null};Qt=e=>String(e??"").toLowerCase().replace(/[^a-z0-9]/g,""),lp=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 hp={};z(hp,{QUALITY:()=>at,bestBridgeRoute:()=>jr,bestSwapRoute:()=>zn,formatComparisonNote:()=>wi});async function mp(e,t,n){let r=qS[Number(e)];if(!r)return{priceUsd:null,decimals:null};let o=`${r}:${t}`;try{let s=(await hi([o],n))?.coins?.[o],a=Number(s?.price),c=Number(s?.decimals);return{priceUsd:Number.isFinite(a)?a:null,decimals:Number.isFinite(c)?c:null}}catch{return{priceUsd:null,decimals:null}}}async function zn(e,t={}){let{chainId:n,tokenIn:r,tokenOut:o,amountIn:i}=e;if(n==null||!r||!o||i==null)throw new Error("bestSwapRoute requires chainId, tokenIn, tokenOut, amountIn");let s=dp(n,t),a=mp(n,o,t),c=Ll(n,t).catch(()=>null),u=Na({...e,nativePriceUsd:s,decimalsOut:e.decimalsOut,destDecimalsPromise:a,opts:t}),[l,d,f]=await Promise.all([ti(u,{timeoutMs:t.timeoutMs??12e3}),a,c]);s.catch(()=>{});let p=await s.then(h=>h,()=>null),m=ga(l,{destPriceUsd:d.priceUsd,destDecimals:e.decimalsOut??d.decimals,liquidityBandBps:t.liquidityBandBps??50,gasPriceWei:f,nativePriceUsd:p}),y=t.maxImpactPct===void 0?25:t.maxImpactPct;if(y!=null&&m.best){let h=m.best.source,A=await hd(async _=>{let S=Na({...e,amountIn:_.toString(),nativePriceUsd:s,decimalsOut:e.decimalsOut,destDecimalsPromise:a,opts:t}).filter(x=>x.source===h);return S.length?(await ti(S,{timeoutMs:t.timeoutMs??12e3}))?.[0]?.amountOut??null:null},i);if(A){let _=yd(m,{[h]:A},{maxImpactPct:y});return{kind:"swap",chainId:n,tokenIn:r,tokenOut:o,amountIn:String(i),..._,sourcesTried:u.length,sourcesAnswered:l.filter(S=>S.quality!==at.FAILED).length,note:wi(_,u.length),priceImpact:{[h]:Number(A.impactPct.toFixed(2))}}}}return{kind:"swap",chainId:n,tokenIn:r,tokenOut:o,amountIn:String(i),...m,sourcesTried:u.length,sourcesAnswered:l.filter(h=>h.quality!==at.FAILED).length,note:wi(m,u.length)}}async function jr(e,t={}){let{fromChainId:n,toChainId:r,tokenIn:o,tokenOut:i,amountIn:s}=e;if(n==null||r==null||!o||!i||s==null)throw new Error("bestBridgeRoute requires fromChainId, toChainId, tokenIn, tokenOut, amountIn");if(Number(n)===Number(r))throw new Error("bestBridgeRoute is for cross-chain; use bestSwapRoute for same-chain");let a=mp(r,i,t),c=pp({...e,opts:t}),[u,l]=await Promise.all([ti(c,{timeoutMs:t.timeoutMs??15e3}),a]),d=ga(u,{destPriceUsd:l.priceUsd,destDecimals:e.decimalsOut??l.decimals,liquidityBandBps:t.liquidityBandBps??50}),f=d.routes.map(p=>({source:p.source,seconds:p.meta?.durationSeconds??null})).filter(p=>p.seconds!=null);return{kind:"bridge",fromChainId:n,toChainId:r,tokenIn:o,tokenOut:i,amountIn:String(s),...d,durations:f,sourcesTried:c.length,sourcesAnswered:u.filter(p=>p.quality!==at.FAILED).length,note:wi(d,c.length)}}function BS(e){let t=e?.meta?.oracleFee;return t?.applies?` \xB7 ${vd(t)}`:""}function wi(e,t){if(!e.best)return"no source returned a usable route";let n=e.routes.length,r=BS(e.best);if(n===1)return`only 1 of ${t} sources answered, so this is the ONLY route, not a proven best one. Treat it as unbenchmarked.`+r;if(e.improvementBps!=null){let o=e.improvementBps,i=o/100;if(o<.01)return`best of ${n} routes, ranked on ${e.rankedOn}: effectively tied with the runner-up (${e.spreadBasis}), inside quote noise. Re-quote before you size up.`+r;let s=i>=.01?`${i.toFixed(2)}%`:`${o.toFixed(2)}bps`;return`best of ${n} routes, ranked on ${e.rankedOn}: ${s} better than the runner-up (${e.spreadBasis})`+r}return`best of ${n} routes, ranked on ${e.rankedOn}. No spread quoted: the top routes report cost differently, so the margin is not comparable.`+r}var qS,Vn=O(()=>{ba();fp();oi();Ta();ot();qS={1:"ethereum",10:"optimism",56:"bsc",137:"polygon",8453:"base",42161:"arbitrum",43114:"avax"}});var gp={};z(gp,{ARTIFACT:()=>Bt,prepareBestRoute:()=>yp,supportedPreparers:()=>MS});function MS(){return Object.keys(Ei)}async function yp(e,t={}){if(jS.some(h=>Object.hasOwn(e,h)))throw new Error("unsupported operation shape is inspect/quote-only");if(e.hookData!=null&&String(e.hookData).toLowerCase()!=="0x")throw new Error("opaque hookData is inspect/quote-only");let{taker:n}=e;if(!n)throw new Error("prepareBestRoute requires taker: a prepared transaction is built FOR an address, and the quote-only placeholder must never end up in one");if(!FS.test(n))throw new Error(`taker must be a valid 20-byte address, got "${n}"`);if(DS.has(n.toLowerCase()))throw new Error(`taker "${n}" is a placeholder/burn address. It is valid for quoting but not for preparing -- that would build a transaction for an address nobody controls. Pass the real wallet that will sign.`);let r=await zn(e,t);if(!r.best){let h=r.impactRejected??[];return{ok:!1,reason:h.length?h[0].reason:"no source returned a usable route",priceImpactBlocked:h.length>0,impactRejected:h,comparison:r}}let o=e.source||r.best.source,i=r.routes.find(h=>h.source===o);if(!i)return{ok:!1,reason:`source "${o}" did not return a usable route`,comparison:r};let s=Ei[o];if(!s){let h=r.routes.find(w=>Ei[w.source]&&w.source!==o);return{ok:!1,reason:`${o} won the comparison but has no prepare path in this build. `+(h?`Next preparable route is ${h.source}; pass source:"${h.source}" to use it.`:"No route in this comparison can be prepared."),comparison:r,winner:o}}let a;try{a=await s(e,t)}catch(h){let w=typeof h?.body=="string"?h.body:h?.body?JSON.stringify(h.body):"",A=[String(h?.message||h),w].filter(Boolean).join(" :: "),_=/allowance/i.test(A),S=!_&&/not enough|insufficient|balance/i.test(A),k,x;_?(x="approval-required-first",k=`${o} will not build swap calldata until the token approval exists on-chain. Approve the spender first, then prepare again. Underlying: ${A}`):S?(x="taker-not-funded",k=`${o} refused to build the transaction: ${A}. This venue verifies the taker holds the input token. Quoting works for any address; preparing needs the real funded wallet.`):(x="provider-error",k=`${o} prepare failed: ${A}`);let E=r.routes.find(g=>Ei[g.source]&&g.source!==o);return{ok:!1,reason:k,failureKind:x,...E?{alternative:E.source}:{},comparison:r}}let c=e.driftToleranceBps??US,u=null,l=null;if(a.amountOut!=null&&i.grossOut!=null)try{let h=BigInt(i.grossOut),w=BigInt(a.amountOut);h>0n&&(u=Number((w-h)*10000n/h),u<-c&&(l=`route moved ${(u/100).toFixed(2)}% against you between the comparison and this prepare (tolerance ${(c/100).toFixed(2)}%). The ranking may no longer hold -- re-run the comparison before signing.`))}catch{}let d=r.routes.filter(h=>h.source!==o).map(h=>({source:h.source,netOut:h.netOut,gasUsd:h.gasUsd})),p=r.routes.map(h=>({source:h.source,liquidityUsd:h.liquidityUsd??null})).reduce((h,w)=>Math.max(h,w.liquidityUsd??0),0)||null,m=i.liquidityUsd??null,y=m!=null&&p>0?Math.round(m/p*100):null;return ne({ok:!0,chosen:{source:o,wasWinner:o===r.best.source,netOut:i.netOut,grossOut:i.grossOut,gasUsd:i.gasUsd,liquidityUsd:i.liquidityUsd??null},liquidity:{chosenUsd:m,maxUsd:p,sharePct:y},priceImpact:r.priceImpact??null,impactUnmeasured:r.impactUnmeasured??[],...a,unsigned:!0,signedBy:"user-wallet",destination:a.artifactKind===Bt.TRANSACTION?a.transaction?.to??null:a.settlement??null,driftBps:u,warnings:[...l?[l]:[],...r.warnings||[],...a.artifactKind===Bt.TYPED_DATA_ORDER?["This is an ORDER to sign, not a transaction to broadcast. Signing it authorizes a solver to settle on your behalf."]:[]],runnersUp:d,comparison:{rankedOn:r.rankedOn,sourcesAnswered:r.sourcesAnswered,sourcesTried:r.sourcesTried,improvementBps:r.improvementBps},note:"UNSIGNED. Verify the destination address and minOut against a fresh quote immediately before signing -- a quote-time minimum is not a minimum at broadcast time."},{provider:"router",kind:"best-route"})}var Bt,US,Ei,DS,FS,jS,Ra=O(()=>{Vn();xe();Bt=Object.freeze({TRANSACTION:"unsigned-transaction",TYPED_DATA_ORDER:"typed-data-order"}),US=100,Ei={"uniswap-v3":async({chainId:e,tokenIn:t,tokenOut:n,amountIn:r,taker:o},i)=>{let{uniV3PrepareExactIn:s}=await Promise.resolve().then(()=>(Rr(),sd)),a=await s({chainId:e,tokenIn:t,tokenOut:n,amountIn:r,recipient:o},i);return{artifactKind:Bt.TRANSACTION,transaction:a.transaction,requiresApproval:a.requiresApproval??null,amountOut:a.quote?.amountOut??null,minOut:a.quote?.amountOutMinimum??null}},"uniswap-v4":async({chainId:e,tokenIn:t,tokenOut:n,amountIn:r,taker:o,slippageBps:i,deadlineSeconds:s,fee:a,tickSpacing:c,hooks:u},l)=>{let{uniV4PrepareExactIn:d}=await Promise.resolve().then(()=>(Zo(),ud)),f=await d({chainId:e,tokenIn:t,tokenOut:n,amountIn:r,recipient:o,slippageBps:i,deadlineSeconds:s,fee:a,tickSpacing:c,hooks:u},l);return{artifactKind:Bt.TRANSACTION,transaction:f.transaction,requiresApproval:f.requiresApproval,amountOut:f.quote?.amountOut??null,minOut:f.quote?.amountOutMinimum??null,prepareReady:!0,executionReady:!1}},lifi:async({chainId:e,tokenIn:t,tokenOut:n,amountIn:r,taker:o},i)=>{let{lifiPrepare:s}=await Promise.resolve().then(()=>(Ur(),Aa)),a=await s({fromChain:e,toChain:e,fromToken:t,toToken:n,fromAmount:r,fromAddress:o},i);return{artifactKind:Bt.TRANSACTION,transaction:a.transaction,requiresApproval:a.requiresApproval??null,amountOut:a.quote?.estimate?.toAmount??null,minOut:a.quote?.estimate?.toAmountMin??null}},paraswap:async({chainId:e,tokenIn:t,tokenOut:n,amountIn:r,taker:o,decimalsIn:i,decimalsOut:s},a)=>{let{paraswapPrepare:c}=await Promise.resolve().then(()=>(ii(),Td)),u=await c({chainId:e,srcToken:t,destToken:n,amount:r,srcDecimals:i,destDecimals:s,userAddress:o,side:"SELL"},a);return{artifactKind:Bt.TRANSACTION,transaction:u.transaction,requiresApproval:u.requiresApproval??null,amountOut:u.quote?.priceRoute?.destAmount??null,minOut:u.quote?.amountOutMinimum??null}},"0x":async({chainId:e,tokenIn:t,tokenOut:n,amountIn:r,taker:o},i)=>{let{zeroxPrepare:s}=await Promise.resolve().then(()=>(ci(),Bd)),a=await s({chainId:e,sellToken:t,buyToken:n,sellAmount:r,taker:o},i);return{artifactKind:Bt.TRANSACTION,transaction:a.transaction,requiresApproval:a.requiresApproval??null,amountOut:a.quote?.buyAmount??null,minOut:a.quote?.minBuyAmount??null}},cow:async({chainId:e,tokenIn:t,tokenOut:n,amountIn:r,taker:o},i)=>{let{cowPrepareOrder:s}=await Promise.resolve().then(()=>(mi(),rp)),a=await s({chainId:e,sellToken:t,buyToken:n,sellAmountBeforeFee:String(r),from:o},i);return{artifactKind:Bt.TYPED_DATA_ORDER,typedData:a.typedData,requiresApproval:{token:t,spender:a.vaultRelayer,amount:String(r),note:"CoW pulls funds via the vault relayer, not the settlement contract"},settlement:a.settlement,amountOut:a.quote?.quote?.buyAmount??null,minOut:null,submission:"sign the typed data, then submit the order to the CoW API"}}};DS=new Set(["0x0000000000000000000000000000000000000000","0x000000000000000000000000000000000000dead","0x0000000000000000000000000000000000000001","0x00000000000000000000000000000000000a1ce5"].map(e=>e.toLowerCase())),FS=/^0x[0-9a-fA-F]{40}$/,jS=Object.freeze(["operation","exactOutput","amountOut","multihop","path","positionManager","modifyLiquidities","commands","actions"])});function WS(e,t){return`0x${La.getAmountsOut}`+et(e)+et(64)+et(t.length)+t.map(Hr).join("")}function GS(e){if(!e||e==="0x")return null;let t=e.slice(2);if(t.length<128)return null;let n=Number(BigInt(`0x${t.slice(64,128)}`));if(!Number.isFinite(n)||n<1||n>16)return null;let r=[];for(let o=0;o<n;o++){let i=128+o*64;if(t.length<i+64)return null;r.push(BigInt(`0x${t.slice(i,i+64)}`))}return r}function Pa(e,t="router"){return(e?.venues||[]).find(r=>r.kind===t)?.address??null}function KS(e,t){let n=Number(t);if(!Number.isFinite(n)||n<0)throw new Error("slippageBps must be a non-negative number");if(n>$a)throw new Error(`slippageBps ${n} exceeds the ${$a} bps ceiling. Block and requote or split the order -- do not widen the guard to force a fill.`);return BigInt(e)*BigInt(1e4-Math.floor(n))/10000n}function Sp(e){let{chainId:t,wrappedNative:n}=e;async function r(o,i,s,a){let c=await te(t,"eth_call",[{to:o,data:WS(i,s)},"latest"],a);return GS(c?.result??c)}return{async quote({tokenIn:o,tokenOut:i,amountIn:s,path:a},c={}){let u=Pa(c.scanner);if(!u)return{chainId:t,evidence:F.UNAVAILABLE,reason:"no verified router configured for this chain; quoting stays fail-closed rather than guessing a venue address"};let l=a||[o,i];if(l.some(f=>!/^0x[0-9a-fA-F]{40}$/.test(f||"")))throw new Error("quote requires valid 20-byte addresses");let d=await r(u,s,l,c);return d?{chainId:t,router:u,path:l,amountIn:String(s),amountOut:d[d.length-1].toString(),hops:l.length-1,evidence:F.LIVE,note:"exact-input quote at current reserves; not a guaranteed fill"}:{chainId:t,router:u,path:l,evidence:F.UNKNOWN,reason:"router returned no amounts -- no pool for this path, or the call reverted"}},async sellSimulation({token:o,amountIn:i,base:s},a={}){let c=Pa(a.scanner),u=s||n;if(u&&String(o).toLowerCase()===String(u).toLowerCase())return{chainId:t,token:o,verdict:U.UNKNOWN,evidence:F.UNAVAILABLE,reason:"token is the base asset for this chain, so there is nothing to round-trip against. Sellability must be judged against a different quote asset."};if(!c||!u)return{chainId:t,token:o,verdict:U.UNKNOWN,evidence:F.UNAVAILABLE,reason:c?"no wrappedNative configured for this chain, so no base asset to round-trip against":"no verified router configured for this chain"};let l=await r(c,i,[u,o],a);if(!l)return{chainId:t,token:o,verdict:U.FAIL,evidence:F.LIVE,leg:"buy",reason:"buy leg returned no amounts -- no route in"};let d=l[l.length-1];if(d===0n)return{chainId:t,token:o,verdict:U.FAIL,evidence:F.LIVE,leg:"buy",reason:"buy leg quotes zero output"};let f=await r(c,d,[o,u],a);if(!f)return{chainId:t,token:o,verdict:U.FAIL,evidence:F.LIVE,leg:"sell",bought:d.toString(),reason:"SELL LEG FAILED while the buy leg quoted fine. This is the honeypot signature: do not trade."};let p=f[f.length-1],m=Number(p*10000n/BigInt(i)),y=U.PASS,h="round trip completes with expected fee/impact loss";return m<5e3?(y=U.FAIL,h=`round trip returns only ${(m/100).toFixed(2)}% -- punitive tax or no real liquidity`):m<9e3&&(y=U.CAUTION,h=`round trip returns ${(m/100).toFixed(2)}% -- transfer tax or thin liquidity at this size`),{chainId:t,token:o,base:u,router:c,verdict:y,reason:h,amountIn:String(i),bought:d.toString(),returned:p.toString(),retentionBps:m,evidence:F.LIVE,note:"Quote-level round trip. It does not prove transfer hooks absent at execution time."}},async prepareUnsignedTx({tokenIn:o,tokenOut:i,amountIn:s,recipient:a,slippageBps:c=50,deadlineSeconds:u=900,path:l},d={}){let f=d.scanner,p=Pa(f);if(!p)throw new Error(`chain ${t} has no verified router; preparing a swap stays fail-closed. Add a venue with recorded provenance first (see docs/adding-a-chain.md).`);if(!/^0x[0-9a-fA-F]{40}$/.test(a||""))throw new Error("prepareUnsignedTx requires a valid recipient address");let m=l||[o,i],y=await this.quote({tokenIn:o,tokenOut:i,amountIn:s,path:m},d);if(y.evidence!==F.LIVE)throw new Error(`cannot prepare without a live quote (${y.evidence}: ${y.reason??"no reason given"})`);let h=KS(y.amountOut,c);if(h<=0n)throw new Error("computed minOut is zero -- refusing to prepare");let w=BigInt(Math.floor(Date.now()/1e3)+Number(u)),A=n&&m[0].toLowerCase()===n.toLowerCase()&&d.useNative,_=A?`0x${La.swapExactETHForTokens}`+et(h)+et(128)+Hr(a)+et(w)+et(m.length)+m.map(Hr).join(""):`0x${La.swapExactTokensForTokens}`+et(s)+et(h)+et(160)+Hr(a)+et(w)+et(m.length)+m.map(Hr).join("");return{unsigned:!0,signedBy:"user-wallet",chainId:t,tx:{to:p,data:_,value:A?`0x${BigInt(s).toString(16)}`:"0x0"},guard:{quotedOut:y.amountOut,minOut:h.toString(),slippageBps:c,maxSlippageBps:$a,deadline:w.toString()},requires:A?[]:[{step:"approve",token:m[0],spender:p,amount:String(s)}],note:"UNSIGNED. Re-verify the guard against a fresh quote immediately before signing -- a quote-time minimum is not a minimum at broadcast time."}}}}var La,et,Hr,$a,vp=O(()=>{ot();Xt();La={getAmountsOut:"d06ca61f",swapExactTokensForTokens:"38ed1739",swapExactETHForTokens:"7ff36ab5"},et=e=>BigInt(e).toString(16).padStart(64,"0"),Hr=e=>e.slice(2).toLowerCase().padStart(64,"0");$a=100});function XS(e,t){let n=Number(t);if(!Number.isFinite(n)||n<0)throw new Error("slippageBps must be a non-negative number");if(n>Ba)throw new Error(`slippageBps ${n} exceeds the ${Ba} bps ceiling. Block and requote or split the order -- do not widen the guard to force a fill.`);return BigInt(e)*BigInt(1e4-Math.floor(n))/10000n}function qa(e,t){return(e?.venues||[]).find(n=>n.kind===t)?.address??null}function kp(e){let{chainId:t,wrappedNative:n}=e;async function r({quoter:i,tokenIn:s,tokenOut:a,amountIn:c,fee:u},l){let d=`0x${Ap.quoteExactInputSingle}`+zr(s)+zr(a)+bn(c)+bn(u)+bn(0),f=await te(t,"eth_call",[{to:i,data:d},"latest"],l).catch(()=>null),p=f?.result??f;if(!p||p==="0x"||p.length<66)return null;let m=BigInt(`0x${p.slice(2,66)}`);return m>0n?m:null}async function o({quoter:i,tokenIn:s,tokenOut:a,amountIn:c},u){let l=await Promise.all(YS.map(async f=>{let p=await r({quoter:i,tokenIn:s,tokenOut:a,amountIn:c,fee:f},u);return{fee:f,amountOut:p?p.toString():null,out:p}})),d=null;for(let f of l)f.out&&(!d||f.out>d.amountOut)&&(d={fee:f.fee,amountOut:f.out});return{best:d,tried:l.map(({fee:f,amountOut:p})=>({fee:f,amountOut:p}))}}return{async quote({tokenIn:i,tokenOut:s,amountIn:a},c={}){let u=qa(c.scanner,"quoter");if(!u)return{chainId:t,evidence:F.UNAVAILABLE,reason:"no verified quoter configured for this chain; quoting stays fail-closed rather than guessing a venue address"};for(let f of[i,s])if(!xp.test(f||""))throw new Error("quote requires valid 20-byte addresses");let{best:l,tried:d}=await o({quoter:u,tokenIn:i,tokenOut:s,amountIn:a},c);return l?{chainId:t,venue:"uniswap-v3",quoter:u,tokenIn:i,tokenOut:s,amountIn:String(a),amountOut:l.amountOut.toString(),fee:l.fee,useNative:!!n&&String(i).toLowerCase()===String(n).toLowerCase(),triedFeeTiers:d,evidence:F.LIVE,note:"exact-input single-hop quote at current tick; not a guaranteed fill"}:{chainId:t,quoter:u,tokenIn:i,tokenOut:s,triedFeeTiers:d,evidence:F.UNKNOWN,reason:"no fee tier returned a quote -- no V3 pool for this pair, or no liquidity"}},async sellSimulation({token:i,amountIn:s,base:a},c={}){let u=qa(c.scanner,"quoter"),l=(e.stableQuoteAssets||[]).map(k=>String(k).toLowerCase()),d=null;!a&&typeof e.resolveQuoteAsset=="function"&&(d=await e.resolveQuoteAsset(i,c).catch(()=>null));let f=String(i).toLowerCase(),p=String(n||"").toLowerCase();if(p&&f===p)return{chainId:t,token:i,verdict:U.UNKNOWN,evidence:F.UNAVAILABLE,reason:"token is the base asset for this chain, so there is nothing to round-trip against. Sellability must be judged against a different quote asset."};let m=a||d||(l[0]&&f!==l[0]?l[0]:null)||n;if(m&&f===String(m).toLowerCase())return{chainId:t,token:i,verdict:U.UNKNOWN,evidence:F.UNAVAILABLE,reason:"token is the base asset for this chain, so there is nothing to round-trip against. Sellability must be judged against a different quote asset."};if(!u||!m)return{chainId:t,token:i,verdict:U.UNKNOWN,evidence:F.UNAVAILABLE,reason:u?"no wrappedNative configured, so there is no base asset to round-trip against":"no verified quoter configured for this chain"};let y=await o({quoter:u,tokenIn:m,tokenOut:i,amountIn:s},c);if(!y.best){let k=l.find(x=>x&&x!==String(m).toLowerCase()&&x!==String(i).toLowerCase());if(k){let x=await o({quoter:u,tokenIn:k,tokenOut:i,amountIn:s},c);if(x.best){let E=await o({quoter:u,tokenIn:i,tokenOut:k,amountIn:x.best.amountOut},c);if(E.best){let g=E.best.amountOut,b=Number(g*10000n/BigInt(s)),v=U.PASS,P="round trip vs dollar book completes with expected fee/impact loss";return b<5e3?(v=U.FAIL,P=`round trip vs dollar book returns only ${(b/100).toFixed(2)}% -- punitive tax or no real liquidity`):b<9e3&&(v=U.CAUTION,P=`round trip vs dollar book returns ${(b/100).toFixed(2)}% -- transfer tax or thin liquidity at this size`),{chainId:t,venue:"uniswap-v3",token:i,base:k,quoteAsset:k,verdict:v,reason:P,amountIn:String(s),bought:x.best.amountOut.toString(),returned:g.toString(),retentionBps:b,buyFee:x.best.fee,sellFee:E.best.fee,evidence:F.LIVE,note:"Quoted against the dollar book, not wrapped native. A missing WETH pool is not a honeypot."}}}}return{chainId:t,token:i,verdict:U.FAIL,evidence:F.LIVE,leg:"buy",reason:"no V3 pool priced the buy leg on any fee tier against wrapped native or the dollar book"}}let h=await o({quoter:u,tokenIn:i,tokenOut:m,amountIn:y.best.amountOut},c);if(!h.best){let k=l.find(x=>x&&x!==String(m).toLowerCase()&&x!==String(i).toLowerCase());if(k){let x=await o({quoter:u,tokenIn:k,tokenOut:i,amountIn:s},c),E=x.best?await o({quoter:u,tokenIn:i,tokenOut:k,amountIn:x.best.amountOut},c):{best:null};if(x.best&&E.best){let g=E.best.amountOut,b=Number(g*10000n/BigInt(s)),v=U.PASS,P="round trip vs dollar book completes; missing WETH sell pool is not a honeypot";return b<5e3?(v=U.FAIL,P=`dollar-book round trip returns only ${(b/100).toFixed(2)}%`):b<9e3&&(v=U.CAUTION,P=`dollar-book round trip returns ${(b/100).toFixed(2)}%`),{chainId:t,venue:"uniswap-v3",token:i,base:k,quoteAsset:k,verdict:v,reason:P,amountIn:String(s),bought:x.best.amountOut.toString(),returned:g.toString(),retentionBps:b,buyFee:x.best.fee,sellFee:E.best.fee,evidence:F.LIVE,note:"Sell vs wrapped native failed; dollar book succeeded. Not labelled honeypot."}}}return{chainId:t,token:i,verdict:U.FAIL,evidence:F.LIVE,leg:"sell",bought:y.best.amountOut.toString(),reason:"SELL LEG FAILED against wrapped native and the dollar book. This is the honeypot signature: do not trade."}}let w=h.best.amountOut,A=Number(w*10000n/BigInt(s)),_=U.PASS,S="round trip completes with expected fee/impact loss";return A<5e3?(_=U.FAIL,S=`round trip returns only ${(A/100).toFixed(2)}% -- punitive tax or no real liquidity`):A<9e3&&(_=U.CAUTION,S=`round trip returns ${(A/100).toFixed(2)}% -- transfer tax or thin liquidity at this size`),{chainId:t,venue:"uniswap-v3",token:i,base:m,verdict:_,reason:S,amountIn:String(s),bought:y.best.amountOut.toString(),returned:w.toString(),retentionBps:A,buyFee:y.best.fee,sellFee:h.best.fee,evidence:F.LIVE,note:"Quote-level round trip. It does not prove transfer hooks absent at execution time."}},async prepareUnsignedTx({tokenIn:i,tokenOut:s,amountIn:a,recipient:c,slippageBps:u=50,fee:l},d={}){let f=qa(d.scanner,"router");if(!f)throw new Error(`chain ${t} has no verified V3 router; preparing a swap stays fail-closed. Add a venue with recorded provenance first (see docs/adding-a-chain.md).`);if(!xp.test(c||""))throw new Error("prepareUnsignedTx requires a valid recipient address");let p=await this.quote({tokenIn:i,tokenOut:s,amountIn:a},d);if(p.evidence!==F.LIVE)throw new Error(`cannot prepare without a live quote (${p.evidence}: ${p.reason??"no reason given"})`);let m=l??p.fee,y=XS(p.amountOut,u);if(y<=0n)throw new Error("computed minOut is zero -- refusing to prepare");let h=!!(d.useNative||p.useNative)&&n&&String(i).toLowerCase()===String(n).toLowerCase(),w=`0x${Ap.exactInputSingle}`+zr(i)+zr(s)+bn(m)+zr(c)+bn(a)+bn(y)+bn(0);return{unsigned:!0,signedBy:"user-wallet",chainId:t,venue:"uniswap-v3",tx:{to:f,data:w,value:h?String(a):"0x0"},guard:{quotedOut:p.amountOut,minOut:y.toString(),slippageBps:u,maxSlippageBps:Ba,fee:m},requires:h?[]:[{step:"approve",token:i,spender:f,amount:String(a)}],note:"UNSIGNED. Re-verify the guard against a fresh quote immediately before signing -- a quote-time minimum is not a minimum at broadcast time."}}}}var YS,Ap,bn,zr,xp,Ba,Ip=O(()=>{ot();Xt();YS=[100,500,3e3,1e4],Ap={quoteExactInputSingle:"c6a5026a",exactInputSingle:"04e45aaf"},bn=e=>BigInt(e).toString(16).padStart(64,"0"),zr=e=>e.slice(2).toLowerCase().padStart(64,"0"),xp=/^0x[0-9a-fA-F]{40}$/,Ba=100});function _p(e){if(!e||e==="0x")return null;try{return BigInt(e)}catch{return null}}function Op(e){if(!e||e==="0x")return null;let t=e.slice(2);if(t.length>=128){let r=Number(BigInt(`0x${t.slice(64,128)}`));if(r>0&&r<=256&&t.length>=128+r*2){let o=t.slice(128,128+r*2),i=Buffer.from(o,"hex").toString("utf8").replace(/\0+$/,"");if(i)return i}}return Buffer.from(t.slice(0,64),"hex").toString("utf8").replace(/\0+$/,"")||null}function JS(e){let{chainId:t}=e;async function n(r,o,i){return te(t,"eth_call",[{to:r,data:o},"latest"],i)}return{async blockNumber(r={}){let o=await jo(t,r);return{chainId:t,blockNumber:o?.blockNumber??o,evidence:F.LIVE}},async nativeBalance(r,o={}){let i=await $l(t,r,o);return{chainId:t,address:r,wei:i?.wei??i?.balance??null,symbol:e.nativeCurrency?.symbol??null,decimals:e.nativeCurrency?.decimals??18,evidence:F.LIVE}},async tokenBalance({token:r,owner:o},i={}){let s=await Bl({chainId:t,token:r,owner:o},i);return{chainId:t,token:r,owner:o,raw:s?.balance??s,evidence:F.LIVE}},async resolveToken(r,o={}){if(!/^0x[0-9a-fA-F]{40}$/.test(r||""))return{chainId:t,token:r,evidence:F.UNKNOWN,error:"resolveToken needs a 20-byte address; symbol lookup is a market-data concern"};let[i,s,a,c]=await Promise.all([n(r,vi.decimals,o).catch(()=>null),n(r,vi.symbol,o).catch(()=>null),n(r,vi.name,o).catch(()=>null),n(r,vi.totalSupply,o).catch(()=>null)]),u=_p(i?.result??i),l=u!==null||s?.result||a?.result;return{chainId:t,address:r,decimals:u===null?null:Number(u),symbol:Op(s?.result??s),name:Op(a?.result??a),totalSupply:(_p(c?.result??c)??null)?.toString()??null,evidence:l?F.LIVE:F.UNKNOWN,warning:l?void 0:"no ERC-20 metadata returned -- may not be a token contract"}},async resolvePools(r,o={}){let i=e.dexscreenerSlug;if(!i)return{chainId:t,token:r,pools:[],evidence:F.UNAVAILABLE,reason:"no dexscreenerSlug configured for this chain; pool discovery is unavailable rather than guessed"};let s=await zo(r,o).catch(()=>null),c=(s?.pairs||s?.data?.pairs||[]).filter(l=>String(l.chainId).toLowerCase()===String(i).toLowerCase()).map(l=>({pair:l.pairAddress,dex:l.dexId,base:l.baseToken?.address,quote:l.quoteToken?.address,liquidityUsd:l.liquidity?.usd??null,priceUsd:l.priceUsd??null,volume24hUsd:l.volume?.h24??null,createdAt:l.pairCreatedAt??null})).sort((l,d)=>(d.liquidityUsd??0)-(l.liquidityUsd??0)),u=Ho(r,c,{stables:e.stableQuoteAssets||[],wrappedNative:e.wrappedNative});return{chainId:t,token:r,pools:u,topPool:u[0]||null,quoteAsset:Ml(r,u),evidence:u.length?F.LIVE:F.UNKNOWN}},async scanBlocks({fromBlock:r,toBlock:o,address:i,topics:s,chunkSize:a=2e3}={},c={}){if(!Number.isInteger(r)||!Number.isInteger(o))throw new Error("scanBlocks requires integer fromBlock and toBlock");if(o<r)throw new Error("toBlock must be >= fromBlock");let u=[],l=[];for(let f=r;f<=o;f+=a){let p=Math.min(f+a-1,o);l.push([f,p])}let d=await mn(l,4,async([f,p])=>{let m={fromBlock:`0x${f.toString(16)}`,toBlock:`0x${p.toString(16)}`};i&&(m.address=i),s&&(m.topics=s);let y=await te(t,"eth_getLogs",[m],c).catch(h=>({error:String(h?.message||h)}));return{start:f,end:p,res:y}});for(let{start:f,end:p,res:m}of d){if(m?.error)return{chainId:t,fromBlock:r,toBlock:o,logs:u,complete:!1,failedAt:[f,p],error:m.error,evidence:F.UNKNOWN};for(let y of m?.result??m??[])u.push(y)}return{chainId:t,fromBlock:r,toBlock:o,logs:u,complete:!0,chunks:l.length,evidence:F.LIVE}},async scoreRisk(r,o={}){let i=[],s=U.PASS,a=l=>{let d={[U.PASS]:0,[U.CAUTION]:1,[U.UNKNOWN]:2,[U.FAIL]:3};d[l]>d[s]&&(s=l)},[c,u]=await Promise.all([this.resolveToken(r,o),this.resolvePools(r,o)]);if(c.evidence!==F.LIVE?(i.push({check:"erc20-metadata",result:U.UNKNOWN,detail:c.warning}),a(U.UNKNOWN)):i.push({check:"erc20-metadata",result:U.PASS,detail:`${c.symbol} / ${c.decimals}d`}),u.evidence===F.UNAVAILABLE)i.push({check:"liquidity",result:U.UNKNOWN,detail:u.reason}),a(U.UNKNOWN);else if(!u.pools.length)i.push({check:"liquidity",result:U.FAIL,detail:"no pool with liquidity found"}),a(U.FAIL);else{let l=u.pools[0],d=l.liquidityUsd??0;d<5e3?(i.push({check:"liquidity",result:U.CAUTION,detail:`top pool only $${d}`}),a(U.CAUTION)):i.push({check:"liquidity",result:U.PASS,detail:`$${d} on ${l.dex}`}),l.createdAt&&Date.now()-l.createdAt<24*3600*1e3&&(i.push({check:"age",result:U.CAUTION,detail:"pool under 24h old"}),a(U.CAUTION))}if(typeof this.sellSimulation=="function"){let l=await this.sellSimulation({token:r,amountIn:(10n**16n).toString()},o).catch(d=>({verdict:U.UNKNOWN,reason:String(d?.message||d)}));i.push({check:"sellability",result:l.verdict,detail:l.retentionBps!=null?`round trip returns ${(l.retentionBps/100).toFixed(2)}% -- ${l.reason}`:l.reason}),a(l.verdict)}else i.push({check:"sellability",result:U.UNKNOWN,detail:"no verified router on this chain, so a round-trip sell simulation cannot run. Treat as unproven -- a buy path is not an exit path."}),a(U.UNKNOWN);return{chainId:t,token:r,verdict:s,checks:i,note:"Structural checks only. UNKNOWN is not PASS. A token is not tradeable until a sell simulation succeeds."}}}}function Ua(e){let n={...JS(e)},r=new Set((e.venues||[]).map(i=>i.kind));e.venueKind==="uniswap-v3"&&r.has("quoter")&&r.has("router")?Object.assign(n,kp({chainId:e.chainId,wrappedNative:e.wrappedNative,stableQuoteAssets:e.stableQuoteAssets||[],resolveQuoteAsset:async(i,s)=>(await n.resolvePools(i,s)).quoteAsset||null})):e.venueKind==="uniswap-v2"&&r.has("router")&&Object.assign(n,Sp({chainId:e.chainId,wrappedNative:e.wrappedNative}));let o={};for(let[i,s]of Object.entries(n))o[i]=s.bind(n);return{key:e.key,chainId:e.chainId,name:e.name,rpcEnv:e.rpcEnv,nativeCurrency:e.nativeCurrency,explorer:e.explorer,venues:e.venues||[],capabilities:o}}var vi,Tp=O(()=>{ot();Cr();G();Xt();vp();Ip();ra();vi={decimals:"0x313ce567",symbol:"0x95d89b41",name:"0x06fdde03",totalSupply:"0x18160ddd",owner:"0x8da5cb5b"}});function Ai(){return Zt.map(e=>ei(Ua(e)))}function Cp(e){return ei(Ua(e))}var Zt,Vr=O(()=>{Tp();Xt();Zt=Object.freeze([{key:"ethereum",chainId:1,name:"Ethereum",rpcEnv:["ETH_RPC_URL","ETHEREUM_RPC_URL","MAINNET_RPC_URL"],nativeCurrency:{symbol:"ETH",decimals:18},explorer:"https://etherscan.io",dexscreenerSlug:"ethereum",venueKind:"uniswap-v3",wrappedNative:"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",stableQuoteAssets:["0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48","0xdAC17F958D2ee523a2206206994597C13D831ec7"],venues:[{kind:"quoter",address:"0x61fFE014bA17989E743c5F6cB21bF9697530B21e",label:"Uniswap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle returned a live sane price (WETH->USDC fee 500 quoted 1908.71 USDC). A contract that correctly prices a known pair IS a working V3 quoter",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:1}},{kind:"router",address:"0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45",label:"Uniswap V3 SwapRouter02",verified:{method:"eth_getCode returned real bytecode on this chain and the paired quoter at the same deployment passed a live functional quote",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:1}}]},{key:"optimism",chainId:10,name:"OP Mainnet",rpcEnv:["OPTIMISM_RPC_URL","OP_RPC_URL"],nativeCurrency:{symbol:"ETH",decimals:18},explorer:"https://optimistic.etherscan.io",dexscreenerSlug:"optimism",venueKind:"uniswap-v3",wrappedNative:"0x4200000000000000000000000000000000000006",stableQuoteAssets:["0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85","0x94b008aA00579c1307B0EF2c499aD98a8ce58e58"],venues:[{kind:"quoter",address:"0x61fFE014bA17989E743c5F6cB21bF9697530B21e",label:"Uniswap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle returned a live sane price (WETH->USDC fee 500 quoted 1905.23 USDC). A contract that correctly prices a known pair IS a working V3 quoter",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:10}},{kind:"router",address:"0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45",label:"Uniswap V3 SwapRouter02",verified:{method:"eth_getCode returned real bytecode on this chain and the paired quoter at the same deployment passed a live functional quote",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:10}}]},{key:"bsc",chainId:56,name:"BNB Smart Chain",rpcEnv:["BSC_RPC_URL","BNB_RPC_URL"],nativeCurrency:{symbol:"BNB",decimals:18},explorer:"https://bscscan.com",dexscreenerSlug:"bsc",venueKind:"uniswap-v3",wrappedNative:"0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c",stableQuoteAssets:["0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d","0x55d398326f99059fF775485246999027B3197955"],venues:[{kind:"quoter",address:"0x78D78E420Da98ad378D7799bE8f4AF69033EB077",label:"Uniswap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle returned a live sane price (WBNB->USDC fee 500 quoted 413.86 USDC). A contract that correctly prices a known pair IS a working V3 quoter",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:56}},{kind:"router",address:"0xB971eF87ede563556b2ED4b1C0b0019111Dd85d2",label:"Uniswap V3 SwapRouter02",verified:{method:"eth_getCode returned real bytecode on this chain and the paired quoter at the same deployment passed a live functional quote",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:56}}]},{key:"polygon",chainId:137,name:"Polygon",rpcEnv:["POLYGON_RPC_URL","POLYGON_RPC"],nativeCurrency:{symbol:"POL",decimals:18},explorer:"https://polygonscan.com",dexscreenerSlug:"polygon",venueKind:"uniswap-v3",wrappedNative:"0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270",stableQuoteAssets:["0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359","0xc2132D05D31c914a87C6611C10748AEb04B58e8F"],venues:[{kind:"quoter",address:"0x61fFE014bA17989E743c5F6cB21bF9697530B21e",label:"Uniswap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle returned a live sane price (WMATIC->USDC fee 500 quoted 0.0720 USDC). A contract that correctly prices a known pair IS a working V3 quoter",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:137}},{kind:"router",address:"0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45",label:"Uniswap V3 SwapRouter02",verified:{method:"eth_getCode returned real bytecode on this chain and the paired quoter at the same deployment passed a live functional quote",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:137}}]},{key:"stable",chainId:988,name:"Stable Mainnet",rpcEnv:["STABLE_RPC_URL","STABLE_RPC"],nativeCurrency:{symbol:"USDT0",decimals:18},venueKind:"uniswap-v3",wrappedNative:"0x5d442b349590a6048Eb2dC0eC346cAA5F47A9ab5",venues:[{kind:"quoter",address:"0xb070179E7032CdA868b53e6C1742F80c9e940d1A",label:"Uniswap V3 QuoterV2 (canonical)",verified:{method:"Stable is on the OFFICIAL Uniswap v3 Deployments List (governance-recognised 2026-05-12, UAC process completed 2026-04, deployed by Protofire), so this is a canonical deployment rather than a fork. eth_getCode returned 8273 bytes, the same size as the canonical quoter on the seven already-verified chains. Functional probe on a live pool (TOAST -> USDT0, fee 10000): 100 in -> 0.000003, 1000 -> 0.000031, 10000 -> 0.000319 USDT0. Output scales monotonically with input, which is a working quoter answering, not a revert. Two of three sampled pools carry non-zero liquidity. NOTE: the pools discovered so far are thin, so real routing size is limited -- the venue is proved, deep liquidity is not.",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-08-05",chainId:988}},{kind:"router",address:"0x32eaf9B5d5F2CD7361c5012890C943D7de84C22a",label:"Uniswap SwapRouter02 (canonical)",verified:{method:"eth_getCode returned 24497 bytes. Cross-checked on-chain rather than trusted from docs: router.factory() returns 0x88f0a512ef09175d456bc9547f914f48c013e4aa, the same v3 core factory that created the pools quoted above, and router.WETH9() returns the wrappedNative recorded on this chain entry. Address published in the Stable docs DEX reference and the Uniswap deployments list.",source:"docs.stable.xyz/en/reference/dexes + on-chain factory()/WETH9() round-trip",date:"2026-08-05",chainId:988}}]},{key:"hyperevm",chainId:999,name:"HyperEVM",rpcEnv:["HYPEREVM_RPC_URL","HYPER_EVM_RPC"],nativeCurrency:{symbol:"HYPE",decimals:18},dexscreenerSlug:"hyperevm",venueKind:"uniswap-v3",wrappedNative:"0x5555555555555555555555555555555555555555",venues:[{kind:"quoter",address:"0x03A918028f22D9E1473B7959C927AD7425A45C7C",label:"HyperSwap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle(1 WHYPE -> USDT0) returned live output on all four fee tiers (100: 57.3385, 500: 57.4187, 3000: 57.3237, 10000: 56.1963 USDT0). Decimals read on-chain: WHYPE 18, USDT0 6. Best tier checked against an INDEPENDENT control the same minute -- Hyperliquid allMids put HYPE at 57.3205, so the pool is 0.171% from the perp mid, which is the right shape for fee plus impact rather than a wrong contract or a decimals bug.",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-08-05",chainId:999}},{kind:"router",address:"0x4E2960a8cd19B467b82d26D83fAcb0fAE26b094D",label:"HyperSwap V3 SwapRouter",verified:{method:"eth_getCode returned 12070 bytes, and it is the router paired with the quoter proved above -- the same pair already shipped in UNI_V3_VENUES[999].hyperswap, which is the map the quote/prepare path actually routes through.",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-08-05",chainId:999}}]},{key:"abstract",chainId:2741,name:"Abstract",rpcEnv:["ABSTRACT_RPC_URL","ABS_RPC_URL"],nativeCurrency:{symbol:"ETH",decimals:18},venueKind:"uniswap-v3",wrappedNative:"0x3439153EB7AF838Ad19d56E1571FBD09333C2809",venues:[{kind:"quoter",address:"0x728BD3eC25D5EDBafebB84F3d67367Cd9EBC7693",label:"Uniswap V3 QuoterV2 (Abstract deployment)",verified:{method:"Abstract is a ZK-stack chain, so CREATE2 addresses differ and the canonical Uniswap addresses are NOT valid here -- probing them returns codesize 0, which is what previously made this chain look like it had no V3 at all. Found the real deployment from live traffic instead: scanned recent Swap(...) logs, took the busiest pool, read pool.factory() = 0xa1160e73b63f322ae88cc2d8e700833e71d0b2a1, then enumerated that factory's deployer (0xf3d63166F0Ca56C3c1A3508FcE03Ff0Cf3Fb691e) and probed each of its 56 contracts with a real quoteExactInputSingle call. Exactly one answered: 1 WETH -> 1846.475731 USDC.e at fee 500. Independent sanity check: the pool's own slot0() spot price is 1873.11 USDC.e per WETH, so the quoter sits ~1.4% below spot, the right shape for fee plus price impact on this size.",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-08-05",chainId:2741}},{kind:"router",address:"0x7712FA47387542819d4E35A23f8116C90C18767C",label:"Uniswap SwapRouter02 (Abstract deployment)",verified:{method:"eth_getCode returned 167392 bytes and the runtime contains the exactInputSingle selector. router.factory() matches the factory proved above and router.WETH9() matches the wrappedNative on this entry. Chosen over its byte-identical twin (0xfD6257F4...) because this is the address real users actually route through: it appeared as tx.to on live swaps against the WETH/USDC.e pool.",source:"on-chain factory()/WETH9() round-trip + live swap tx.to sampling",date:"2026-08-05",chainId:2741}}]},{key:"robinhood",chainId:4663,name:"Robinhood Chain",rpcEnv:["RH_CHAIN_RPC","ROBINHOOD_RPC_URL"],nativeCurrency:{symbol:"ETH",decimals:18},dexscreenerSlug:"robinhood",venueKind:"uniswap-v3",wrappedNative:"0x0bd7d308f8e1639fab988df18a8011f41eacad73",stableQuoteAssets:["0x5fc5360d0400a0fd4f2af552add042d716f1d168"],venues:[{kind:"quoter",address:"0x33e885ed0ec9bf04ecfb19341582aadcb4c8a9e7",label:"Uniswap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle returned a live sane price (WETH->USDG fee 100 quoted 1866.58 USDG, and USDG->CASHCAT fee 10000 quoted a live amount). A contract that correctly prices known pairs IS a working V3 quoter",source:"live eth_call against rpc.mainnet.chain.robinhood.com",date:"2026-07-31",chainId:4663}},{kind:"router",address:"0xcaf681a66d020601342297493863e78c959e5cb2",label:"Uniswap V3 SwapRouter02",verified:{method:"eth_getCode returned real bytecode (24497 bytes) on this chain and the paired quoter at the same deployment passed a live functional quote",source:"live eth_getCode against rpc.mainnet.chain.robinhood.com",date:"2026-07-31",chainId:4663}},{kind:"factory",address:"0x1f7d7550b1b028f7571e69a784071f0205fd2efa",label:"Uniswap V3 Factory",verified:{method:"eth_getCode returned real bytecode (24535 bytes) and a PoolCreated log scan over this factory returned 76 pools in ~9000 recent blocks",source:"live eth_getLogs against rpc.mainnet.chain.robinhood.com",date:"2026-07-31",chainId:4663}}]},{key:"base",chainId:8453,name:"Base",rpcEnv:["BASE_RPC_URL"],nativeCurrency:{symbol:"ETH",decimals:18},explorer:"https://basescan.org",dexscreenerSlug:"base",venueKind:"uniswap-v3",wrappedNative:"0x4200000000000000000000000000000000000006",stableQuoteAssets:["0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"],venues:[{kind:"quoter",address:"0x3d4e44Eb1374240CE5F1B871ab261CD16335B76a",label:"Uniswap V3 QuoterV2 (Base)",verified:{method:"functional probe: quoteExactInputSingle returned WETH->USDC at fee 500 = 1908.44 USDC, a live sane price. The canonical mainnet quoter address also has bytecode on Base but does NOT price this pair, which is exactly the false positive a codesize-only check accepts",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:8453}},{kind:"router",address:"0x2626664c2603336E57B271c5C0b26F421741e481",label:"Uniswap V3 SwapRouter02 (Base)",verified:{method:"eth_getCode returned real bytecode and the paired Base quoter passed a live functional quote",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:8453}},{kind:"router-v2",address:"0x4752ba5DBc23f44D87826276BF6Fd6b1C372aD24",label:"Uniswap V2 Router02 (Base)",verified:{method:"eth_getCode returned 17891 bytes; live getAmountsOut on WETH->USDC round-tripped to 98.75% (2x0.30% fee + impact)",source:"https://docs.uniswap.org/contracts/v2/reference/smart-contracts/v2-deployments",date:"2026-07-30",chainId:8453}}]},{key:"arbitrum",chainId:42161,name:"Arbitrum One",rpcEnv:["ARBITRUM_RPC_URL","ARB_RPC_URL"],nativeCurrency:{symbol:"ETH",decimals:18},explorer:"https://arbiscan.io",dexscreenerSlug:"arbitrum",venueKind:"uniswap-v3",wrappedNative:"0x82aF49447D8a07e3bd95BD0d56f35241523fBab1",stableQuoteAssets:["0xaf88d065e77c8cC2239327C5EDb3A432268e5831","0xFd086bC7CD5C481DCC9C85ebE478A1C0b69FCbb9"],venues:[{kind:"quoter",address:"0x61fFE014bA17989E743c5F6cB21bF9697530B21e",label:"Uniswap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle returned a live sane price (WETH->USDC fee 500 quoted 1908.72 USDC). A contract that correctly prices a known pair IS a working V3 quoter",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:42161}},{kind:"router",address:"0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45",label:"Uniswap V3 SwapRouter02",verified:{method:"eth_getCode returned real bytecode on this chain and the paired quoter at the same deployment passed a live functional quote",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:42161}}]},{key:"avalanche",chainId:43114,name:"Avalanche C-Chain",rpcEnv:["AVALANCHE_RPC_URL","AVAX_RPC_URL"],nativeCurrency:{symbol:"AVAX",decimals:18},explorer:"https://snowtrace.io",dexscreenerSlug:"avalanche",venueKind:"uniswap-v3",wrappedNative:"0xB31f66AA3C1e785363F0875A1B74E27b85FD66c7",stableQuoteAssets:["0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E"],venues:[{kind:"quoter",address:"0xbe0F5544EC67e9B3b2D979aaA43f18Fd87E6257F",label:"Uniswap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle returned a live sane price (WAVAX->USDC fee 500 quoted 6.48 USDC). A contract that correctly prices a known pair IS a working V3 quoter",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:43114}},{kind:"router",address:"0xbb00FF08d01D300023C629E8fFfFcb65A5a578cE",label:"Uniswap V3 SwapRouter02",verified:{method:"eth_getCode returned real bytecode on this chain and the paired quoter at the same deployment passed a live functional quote",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:43114}}]}])});function Jv({testnet:e,baseUrl:t}={}){if(t)return t.replace(/\/$/,"").endsWith("/info")?t:`${t.replace(/\/$/,"")}/info`;if(process.env.HL_INFO_URL)return process.env.HL_INFO_URL;if(process.env.HL_API_URL){let n=process.env.HL_API_URL.replace(/\/$/,"");return n.endsWith("/info")?n:`${n}/info`}return e||process.env.HL_TESTNET==="1"?Xv:Yv}async function Kr(e,t={}){if(!e||!e.type)throw new Error("hlInfo requires body.type");let n=Jv(t);return C(n,{method:"POST",body:e,fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function lf(e={}){return Kr({type:"allMids"},e)}async function df(e={}){return Kr({type:"meta"},e)}async function pf(e={}){let t={type:"metaAndAssetCtxs"};return e.dex&&(t.dex=e.dex),Kr(t,e)}async function ff({coin:e,interval:t="1h",startTime:n,endTime:r},o={}){if(!e)throw new Error("hlCandleSnapshot requires coin");let i={type:"candleSnapshot",req:{coin:String(e),interval:t,startTime:n??Date.now()-24*3600*1e3,endTime:r??Date.now()}};return Kr(i,o)}async function mf({coin:e,startTime:t,endTime:n},r={}){if(!e)throw new Error("hlFundingHistory requires coin");return Kr({type:"fundingHistory",coin:String(e),startTime:t??Date.now()-24*3600*1e3,endTime:n??Date.now()},r)}var Yv,Xv,Ci=O(()=>{G();Yv="https://api.hyperliquid.xyz/info",Xv="https://api.hyperliquid-testnet.xyz/info"});import{createHash as Qv}from"node:crypto";function St(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function Yn(e){return typeof e=="number"&&Number.isFinite(e)}function Ja(e){if(e==null||typeof e!="object"||Object.isFrozen(e))return e;if(Array.isArray(e)){for(let t of e)Ja(t);return Object.freeze(e)}for(let t of Object.keys(e))Ja(e[t]);return Object.freeze(e)}function Sn(e){if(Array.isArray(e))return e.map(Sn);if(e!=null&&typeof e=="object"){let t={};for(let n of Object.keys(e).sort())t[n]=Sn(e[n]);return t}return e}function Ya(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 hf(e){return{feesUsd:e.costs.feesUsd,builderFeesUsd:e.costs.builderFeesUsd,fundingUsd:e.costs.fundingUsd,slippageUsd:e.costs.slippageUsd}}function eA(e){return(e.feesUsd||0)+(e.builderFeesUsd||0)+Math.max(0,e.fundingUsd||0)+(e.slippageUsd||0)}function tA(e){let t=0;for(let n of e.trades)n.grossPnlUsd>0&&(t+=n.grossPnlUsd);return t}function nA(e,t,n){return!(!e||e.tradeCount<Math.max(1,Math.min(n,3))||!(e.netPnlUsd>0)||!(e.profitFactor>1)||!(e.maxDrawdownPct<=t.maxDailyLossPct))}function gf(e){if(!St(e))throw new TypeError("evidence artifact must be a plain object");if(!Zv.includes(e.status))throw new TypeError("evidence artifact status is invalid");for(let t of["strategyHash","compilerHash","barsHash"])if(typeof e[t]!="string"||!/^[0-9a-f]{64}$/.test(e[t]))throw new TypeError(`evidence artifact ${t} must be a sha256 hash`);if(!St(e.split))throw new TypeError("evidence artifact split required");if(!Array.isArray(e.flags))throw new TypeError("evidence artifact flags must be an array");if(!St(e.walkForward)||!Array.isArray(e.walkForward.windows))throw new TypeError("evidence artifact walkForward windows required");if(e.status==="pass_live_eligible"&&(!St(e.train)||!St(e.holdout)))throw new TypeError("live-eligible evidence artifact requires train and holdout facts");return Sn({barsHash:e.barsHash,compilerHash:e.compilerHash,flags:e.flags.map(t=>Sn(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 bf(e){return Qv("sha256").update(JSON.stringify(gf(e)),"utf8").digest("hex")}function ct(e,t,n=0){if(!Number.isInteger(e)||e<n)throw new Error(`${t} must be an integer >= ${n}`);return e}function Xa(e,t){if(!St(e)||!St(e.metrics))throw new Error(`${t} metrics required`);let n=ct(e.tradeCount,`${t}.tradeCount`);if(e.metrics.tradeCount!==n)throw new Error(`${t} tradeCount contradicts metrics.tradeCount`);for(let r of["netPnlUsd","profitFactor","maxDrawdownPct"])if(!Yn(e.metrics[r]))throw new Error(`${t}.metrics.${r} must be finite`);if(e.metrics.maxDrawdownPct<0)throw new Error(`${t}.metrics.maxDrawdownPct must be >= 0`);return e.metrics}function rA(e,{maxDailyLossPct:t}={}){let n=e.split,r=ct(n.trainStartIndex,"split.trainStartIndex"),o=ct(n.trainEndIndex,"split.trainEndIndex"),i=ct(n.trainBarCount,"split.trainBarCount",1),s=ct(n.holdoutStartIndex,"split.holdoutStartIndex"),a=ct(n.holdoutEndIndex,"split.holdoutEndIndex"),c=ct(n.holdoutBarCount,"split.holdoutBarCount",1);if(r!==0||o-r+1!==i||s!==o+1||a-s+1!==c)throw new Error("evidence split must be contiguous, chronological, and count-consistent");if(!Yn(n.trainFraction)||n.trainFraction<=0||n.trainFraction>=1)throw new Error("split.trainFraction must be in (0,1)");Xa(e.train,"train");let u=Xa(e.holdout,"holdout");if(u.tradeCount<1||u.netPnlUsd<=0||u.profitFactor<=1)throw new Error("live-eligible holdout metrics do not pass");if(Yn(t)&&u.maxDrawdownPct>t)throw new Error("live-eligible holdout drawdown exceeds strategy risk");if(e.flags.length>0)throw new Error("live-eligible evidence cannot contain failure flags");let l=e.walkForward,d=l.windows;if(d.length<1||l.windowsRun!==d.length)throw new Error("live-eligible walk-forward windowsRun must match nonempty windows");let f=0,p=-1;for(let y=0;y<d.length;y++){let h=d[y];if(!St(h)||h.index!==y||typeof h.passed!="boolean")throw new Error("walk-forward windows must be ordered and structurally valid");let w=ct(h.trainStartIndex,`walkForward.windows[${y}].trainStartIndex`),A=ct(h.trainEndIndex,`walkForward.windows[${y}].trainEndIndex`),_=ct(h.evalStartIndex,`walkForward.windows[${y}].evalStartIndex`),S=ct(h.evalEndIndex,`walkForward.windows[${y}].evalEndIndex`);if(w!==0||A>=_||_>S||_<=p)throw new Error("walk-forward windows must be chronological and disjoint");if(p=S,h.passed){if(f+=1,h.reason!=="pass")throw new Error("passed walk-forward window reason must be pass");let k=Xa({metrics:h.metrics,tradeCount:h.metrics?.tradeCount},`walkForward.windows[${y}]`);if(k.tradeCount<1||k.netPnlUsd<=0||k.profitFactor<=1)throw new Error("passed walk-forward window metrics do not pass");if(Yn(t)&&k.maxDrawdownPct>t)throw new Error("passed walk-forward drawdown exceeds strategy risk")}else if(h.reason==="pass")throw new Error("failed walk-forward window cannot have pass reason")}let m=f/d.length;if(!Yn(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 wf(e,t={}){if(typeof e?.id!="string"||!/^[0-9a-f]{64}$/.test(e.id))throw new Error("evidence.id must be a sha256 evidence artifact hash");let n=gf(e),r=Sn({id:e.id,...n});if(JSON.stringify(Sn(e))!==JSON.stringify(r))throw new Error("evidence artifact contains fields unbound from its deterministic identity");let o=bf(e);if(e.id!==o)throw new Error("evidence.id does not match its deterministic artifact facts digest");return e.status==="pass_live_eligible"&&rA(e,t),e}function Qa({strategy:e,bars:t,backtestOptions:n={},trainFraction:r=.7,walkForwardWindows:o=3,minTrades:i=10}={}){let s=[];if(!St(e))throw new TypeError("strategy must be a plain object");if(!Array.isArray(t))throw new TypeError("bars must be an array");if(!St(n))throw new TypeError("backtestOptions must be a plain object");if(!Yn(r)||r<=0||r>=1)throw new TypeError("trainFraction must be in (0,1)");if(!Number.isInteger(o)||o<1)throw new TypeError("walkForwardWindows must be a positive integer");if(!Number.isInteger(i)||i<0)throw new TypeError("minTrades must be an integer >= 0");let a=Ne(e),c=Xn(a),u=Yr(t),l=t.length,d=(D=[],M={})=>yf({status:"fail",strategy:a,sHash:c,barsHash:u,split:M.split||{trainStartIndex:0,trainEndIndex:-1,trainBarCount:0,holdoutStartIndex:0,holdoutEndIndex:-1,holdoutBarCount:0,trainFraction:r},train:M.train||null,holdout:M.holdout||null,walkForward:M.walkForward||{windows:[],passRate:0},flags:[...s,...D]});if(l<10)return d([{type:"insufficient_bars",message:"need at least 10 bars for evidence"}]);let f=Math.floor(l*r),p=f,m=l-p;if(f<5||m<3)return d([{type:"invalid_windowing",message:"train/holdout split too small",trainCount:f,holdoutCount:m}]);let y=t.slice(0,f),h=t.slice(p),w,A;try{w=en(a,y,n),A=en(a,h,n)}catch(D){return d([{type:"backtest_error",message:String(D.message||D)}])}let _={metrics:Ya(w),costs:hf(w),tradeCount:w.metrics.tradeCount},S={metrics:Ya(A),costs:hf(A),tradeCount:A.metrics.tradeCount},k={trainStartIndex:0,trainEndIndex:f-1,trainBarCount:f,holdoutStartIndex:p,holdoutEndIndex:l-1,holdoutBarCount:m,trainFraction:r},x=[],E=Math.floor(l/(o+1));if(E<3)s.push({type:"invalid_windowing",message:"walk-forward window size too small",wfSize:E});else for(let D=0;D<o;D++){let M=E*(D+1),Q=M,Y=Math.min(l,Q+E);if(Y-Q<3||M<3){x.push({index:D,trainStartIndex:0,trainEndIndex:M-1,evalStartIndex:Q,evalEndIndex:Y-1,passed:!1,reason:"window_too_small",metrics:null});continue}let Ue=t.slice(Q,Y),le;try{le=en(a,Ue,n)}catch{x.push({index:D,trainStartIndex:0,trainEndIndex:M-1,evalStartIndex:Q,evalEndIndex:Y-1,passed:!1,reason:"backtest_error",metrics:null});continue}let Wt=Ya(le),Gt=nA(Wt,a.risk,i);x.push({index:D,trainStartIndex:0,trainEndIndex:M-1,evalStartIndex:Q,evalEndIndex:Y-1,passed:Gt,reason:Gt?"pass":"fail_metrics",metrics:Wt})}let g=x.filter(D=>D.passed).length,b=x.length===0?0:g/x.length,v={windows:x,passRate:b,windowsRun:x.length};S.metrics.tradeCount===0&&_.metrics.tradeCount===0&&s.push({type:"no_trades",message:"no trades in train or holdout"}),S.metrics.tradeCount===0&&s.push({type:"absent_oos_trades",message:"holdout produced no trades"}),S.metrics.netPnlUsd<0&&s.push({type:"holdout_loss",message:"holdout netPnlUsd is negative"}),_.metrics.netPnlUsd>0&&S.metrics.netPnlUsd<0&&_.metrics.netPnlUsd>Math.abs(S.metrics.netPnlUsd)*.25?s.push({type:"overfit",message:"profitable train with losing holdout (OOS collapse)"}):_.metrics.netPnlUsd>0&&S.metrics.netPnlUsd>0&&S.metrics.netPnlUsd<_.metrics.netPnlUsd*.1&&_.metrics.tradeCount>=i&&s.push({type:"severe_oos_collapse",message:"holdout pnl collapsed vs train"});let P=eA(S.costs),I=tA(A);I>0&&P>I&&s.push({type:"costs_exceed_gross",message:"holdout costs exceed gross gains"});let L=s.some(D=>["insufficient_bars","invalid_windowing","absent_oos_trades","holdout_loss","no_trades","severe_oos_collapse","backtest_error"].includes(D.type)),q=s.some(D=>D.type==="overfit"),H="fail";return S.metrics.tradeCount>=i&&S.metrics.netPnlUsd>0&&S.metrics.profitFactor>1&&S.metrics.maxDrawdownPct<=a.risk.maxDailyLossPct&&b>=.6&&!(I>0&&P>I)&&!q&&!s.some(D=>D.type==="severe_oos_collapse"||D.type==="invalid_windowing")?H="pass_live_eligible":!L&&S.metrics.tradeCount>0&&_.metrics.tradeCount>0&&Number.isFinite(S.metrics.netPnlUsd)?(H="pass_paper_only",S.metrics.tradeCount<i&&s.push({type:"undersampled",message:"holdout trades below minTrades"})):q&&S.metrics.tradeCount>0&&_.metrics.netPnlUsd>0?H="fail":S.metrics.tradeCount>0&&_.metrics.tradeCount>0&&!L?H="pass_paper_only":H="fail",S.metrics.netPnlUsd<0&&(H=H==="pass_live_eligible"?"fail":H==="pass_paper_only"?"pass_paper_only":"fail",H="fail"),yf({status:H,strategy:a,sHash:c,barsHash:u,split:k,train:_,holdout:S,walkForward:v,flags:s})}function yf({status:e,strategy:t,sHash:n,barsHash:r,split:o,train:i,holdout:s,walkForward:a,flags:c}){let u={status:e,strategyHash:n,compilerHash:An,barsHash:r,split:o,train:i,holdout:s,walkForward:a,flags:c};return u.id=bf(u),Ja(Sn(JSON.parse(JSON.stringify(u))))}var Zv,Za=O(()=>{xn();vn();Ni();Zv=Object.freeze(["fail","pass_paper_only","pass_live_eligible"])});function Xr(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function iA(e){return String(e).toLowerCase().replace(/[^a-z0-9]/g,"")}function tc(e,t="value"){if(Array.isArray(e)){e.forEach((n,r)=>tc(n,`${t}[${r}]`));return}if(Xr(e))for(let[n,r]of Object.entries(e)){let o=iA(n);if(oA.some(i=>o.includes(i)))throw new Error(`handoff: forbidden secret-like field at ${t}.${n}`);tc(r,`${t}.${n}`)}}function ec(e){return typeof e=="number"&&Number.isFinite(e)&&e>0}function Ef({strategy:e,evidence:t,shadow:n,caps:r,nowMs:o=Date.now(),env:i=process.env}={}){if(tc({strategy:e,evidence:t,shadow:n,caps:r},"handoff"),!Xr(e))throw new Error("handoff: strategy required");if(!Xr(t))throw new Error("handoff: evidence required");if(!Xr(n))throw new Error("handoff: shadow required");if(!Xr(r))throw new Error("handoff: caps required");if(typeof n.id!="string"||!n.id.trim())throw new Error("handoff: shadow.id required");if(typeof n.stateHash!="string"||!/^[0-9a-f]{64}$/.test(n.stateHash))throw new Error("handoff: shadow.stateHash must be a sha256 hash");if(n.status!=="running")throw new Error("handoff: shadow.status must be running");if(!Number.isInteger(n.cursor)||n.cursor<=0)throw new Error("handoff: shadow.cursor must be a positive integer");if(!Number.isInteger(n.updatedAt)||n.updatedAt<=0||n.updatedAt>o)throw new Error("handoff: shadow.updatedAt must be a positive integer <= nowMs");let s=Ne(e,{nowMs:o}),a=Re(s);if(wf(t,{maxDailyLossPct:s.risk.maxDailyLossPct}),t.status!=="pass_live_eligible")throw new Error("handoff: evidence.status must be pass_live_eligible");if(t.strategyHash!==a.strategyHash)throw new Error("handoff: evidence.strategyHash mismatch");if(t.compilerHash!==a.compilerHash)throw new Error("handoff: evidence.compilerHash mismatch");let c=["perStrategyNotionalUsd","maxLeverage","dailyLossCapUsd","chainAllowlist","assetAllowlist","expiresAt","killSwitchRequired"];for(let f of c)if(!(f in r)||r[f]==null)throw new Error(`handoff: caps.${f} required`);if(!ec(r.perStrategyNotionalUsd))throw new Error("handoff: caps.perStrategyNotionalUsd must be positive");if(r.perStrategyNotionalUsd>a.strategy.risk.maxNotionalUsd)throw new Error("handoff: caps.perStrategyNotionalUsd exceeds strategy.risk.maxNotionalUsd");if(!ec(r.maxLeverage))throw new Error("handoff: caps.maxLeverage must be positive");if(r.maxLeverage>a.strategy.risk.maxLeverage)throw new Error("handoff: caps.maxLeverage exceeds strategy.risk.maxLeverage");if(!ec(r.dailyLossCapUsd))throw new Error("handoff: caps.dailyLossCapUsd must be positive");let u=a.strategy.risk.maxNotionalUsd*(a.strategy.risk.maxDailyLossPct/100);if(r.dailyLossCapUsd>u)throw new Error("handoff: caps.dailyLossCapUsd exceeds strategy daily loss ceiling");if(!Array.isArray(r.chainAllowlist)||r.chainAllowlist.length===0)throw new Error("handoff: caps.chainAllowlist must be a non-empty array");if(!r.chainAllowlist.every(f=>f==="hyperliquid"))throw new Error("handoff: caps.chainAllowlist must include only hyperliquid");if(!r.chainAllowlist.includes("hyperliquid"))throw new Error("handoff: caps.chainAllowlist must include hyperliquid");if(!Array.isArray(r.assetAllowlist)||r.assetAllowlist.length===0)throw new Error("handoff: caps.assetAllowlist must be a non-empty array");if(r.assetAllowlist.length!==1||r.assetAllowlist[0]!==a.strategy.market.coin)throw new Error("handoff: caps.assetAllowlist must contain only the strategy market coin");if(!Number.isInteger(r.expiresAt)||!(r.expiresAt>o))throw new Error("handoff: caps.expiresAt must be an integer > nowMs");if(r.expiresAt>a.strategy.risk.expiresAt)throw new Error("handoff: caps.expiresAt exceeds strategy.risk.expiresAt");if(r.killSwitchRequired!==!0)throw new Error("handoff: caps.killSwitchRequired must be exactly true");let l={perStrategyNotionalUsd:r.perStrategyNotionalUsd,maxLeverage:r.maxLeverage,dailyLossCapUsd:r.dailyLossCapUsd,chainAllowlist:[...r.chainAllowlist],assetAllowlist:[...r.assetAllowlist],expiresAt:r.expiresAt,killSwitchRequired:!0},d={strategyHash:a.strategyHash,compilerHash:a.compilerHash,evidence:JSON.parse(JSON.stringify(t)),shadow:{id:n.id,stateHash:n.stateHash,status:n.status,cursor:n.cursor,updatedAt:n.updatedAt},compiled:{strategyHash:a.strategyHash,compilerHash:a.compilerHash,compilerVersion:Jr,venue:"hyperliquid",market:{coin:a.strategy.market.coin,kind:"perp",interval:a.strategy.market.interval},risk:{...a.strategy.risk},strategy:JSON.parse(JSON.stringify(a.strategy))},arming:{liveBroadcast:!1,requiresExplicitUserArm:!0,caps:l},requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,executionReady:!1};return ne(d,{provider:"hl-strategy",kind:"strategy-live-handoff",env:i})}var oA,Sf=O(()=>{xn();Za();vn();xe();oA=["privatekey","secretkey","seed","mnemonic","passphrase","password","keystore","keymaterial","apikey","authtoken","accesstoken","refreshtoken","credential","bearer","signature","authorization","xprv","xpriv","wif"]});function Jn(e,t){let n=Number(e);if(!Number.isFinite(n))throw new TypeError(`${t} must be finite`);return n}function Qn(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 aA(e){let t=sA[e];if(!t)throw new TypeError(`unsupported strategy interval: ${e}`);return t}function cA(e,{endTime:t=Number.MAX_SAFE_INTEGER}={}){if(!Array.isArray(e))throw new TypeError("Hyperliquid candles must be an array");Qn(t,"endTime");let n=new Map;for(let r=0;r<e.length;r++){let o=e[r];if(!o||typeof o!="object"||Array.isArray(o))throw new TypeError(`candles[${r}] must be an object`);let i=Qn(Number(o.t),`candles[${r}].t`);if(Qn(Number(o.T),`candles[${r}].T`)>t)continue;let a={t:i,o:Jn(o.o,`candles[${r}].o`),h:Jn(o.h,`candles[${r}].h`),l:Jn(o.l,`candles[${r}].l`),c:Jn(o.c,`candles[${r}].c`),v:Jn(o.v,`candles[${r}].v`)};if(a.h<Math.max(a.o,a.c,a.l))throw new TypeError(`candles[${r}].h is below another price`);if(a.l>Math.min(a.o,a.c,a.h))throw new TypeError(`candles[${r}].l is above another price`);if(a.v<0)throw new TypeError(`candles[${r}].v must be non-negative`);let c=n.get(i);if(c&&JSON.stringify(c)!==JSON.stringify(a))throw new TypeError(`conflicting duplicate candle at timestamp ${i}`);c||n.set(i,a)}return Qr([...n.values()].sort((r,o)=>r.t-o.t))}function uA(e,t){if(!Array.isArray(e))throw new TypeError("Hyperliquid funding history must be an array");let n=new Map;for(let r=0;r<e.length;r++){let o=e[r];if(!o||typeof o!="object"||Array.isArray(o))throw new TypeError(`funding[${r}] must be an object`);let i=Qn(Number(o.time),`funding[${r}].time`);i>t||n.set(i,{time:i,fundingRate:Jn(o.fundingRate,`funding[${r}].fundingRate`)})}return[...n.values()].sort((r,o)=>r.time-o.time)}async function lA({coin:e,startTime:t,endTime:n},r){let o=[],i=Math.max(0,t-288e5),s=!1;for(let a=0;a<16&&i<=n;a++){let c=await mf({coin:e,startTime:i,endTime:n},r);if(!Array.isArray(c))throw new TypeError("Hyperliquid funding history must be an array");o.push(...c);let u=i;for(let l of c){let d=Number(l?.time);Number.isSafeInteger(d)&&d>u&&(u=d)}if(c.length<500||u>=n){s=!0;break}if(u<=i)throw new Error("Hyperliquid funding history pagination did not advance");i=u+1}if(!s)throw new Error("strategy history exceeds the bounded funding history limit");return uA(o,n)}function dA(e,t,n){let r=0,o=null;return e.map(i=>{let s=i.t+n,a=0;for(;r<t.length&&t[r].time<s;){let c=t[r];o=c.fundingRate,c.time>=i.t&&(a+=c.fundingRate),r+=1}return o==null?{...i,fundingPaymentRate:a}:{...i,fundingRate:o,fundingPaymentRate:a}})}async function vf(e,t={}){if(!e||typeof e!="object"||Array.isArray(e))throw new TypeError("strategy history input must be an object");let n=String(e.coin||"").trim().toUpperCase();if(!/^[A-Z0-9][A-Z0-9._-]{0,11}$/.test(n))throw new TypeError("coin must be an uppercase Hyperliquid asset id");let r=String(e.interval||"15m"),o=aA(r);if(e.endTime==null)throw new TypeError("endTime is required for deterministic history");let i=Qn(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):Qn(e.startTime,"startTime");if(a>=i)throw new TypeError("startTime must be before endTime");let[c,u]=await Promise.all([ff({coin:n,interval:r,startTime:a,endTime:i},t),lA({coin:n,startTime:a,endTime:i},t)]),l=cA(c,{endTime:i}),d=Qr(dA(l,u,o));return Qr({coin:n,interval:r,range:{startTime:a,endTime:i},bars:d})}var sA,Af=O(()=>{Ci();sA=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 mA(e){let t=[];if(!e||typeof e!="object"||Array.isArray(e))return{ok:!1,errors:[{path:"market",message:"must be a plain object"}],market:null};for(let n of Object.keys(e))fA.has(n)||t.push({path:`market.${n}`,message:"unknown field is not allowed"});return(typeof e.coin!="string"||e.coin.length===0||e.coin.length>32)&&t.push({path:"market.coin",message:"must be a non-empty string max 32"}),(typeof e.interval!="string"||!pA.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 hA(e={}){let t=await df(e);if(!t||!Array.isArray(t.universe))throw new TypeError("Hyperliquid market metadata must contain universe");return Object.freeze(t.universe.map((n,r)=>{if(!n||typeof n.name!="string"||!n.name)throw new TypeError(`Hyperliquid market metadata universe[${r}].name is invalid`);return n.name}))}var pA,fA,xf,kf=O(()=>{Ci();Sf();Af();pA=new Set(["1m","3m","5m","15m","30m","1h","2h","4h","8h","12h","1d"]),fA=new Set(["coin","interval"]);xf=Object.freeze({id:"hyperliquid",validateMarket:mA,fetchBars:vf,listMarkets:hA,prepareIntent(e){return Ef(e)}})});function gA(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 yA.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 nc(e){return typeof e!="string"?null:bA.get(e)??null}function rc(e){let t=nc(e);if(!t)throw new Error(`unknown strategy venue: ${String(e)}`);return t}var yA,If,bA,p$,oc=O(()=>{kf();yA=Object.freeze(["id","validateMarket","prepareIntent"]);If=[xf].map(gA),bA=new Map(If.map(e=>[e.id,e])),p$=Object.freeze([...If])});import{createHash as wA}from"node:crypto";function tt(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function ce(e){return typeof e=="number"&&Number.isFinite(e)}function Lf(e){return Number.isInteger(e)&&e>0}function uc(e){if(e==null||typeof e!="object"||Object.isFrozen(e))return e;if(Array.isArray(e)){for(let t of e)uc(t);return Object.freeze(e)}for(let t of Object.keys(e))uc(e[t]);return Object.freeze(e)}function lc(e){if(Array.isArray(e))return e.map(lc);if(e!=null&&typeof e=="object"){let t={};for(let n of Object.keys(e).sort())t[n]=lc(e[n]);return t}return e}function N(e,t,n){e.push({path:t,message:n})}function tn(e,t,n,r){for(let o of Object.keys(e))t.has(o)||N(r,n?`${n}.${o}`:o,"unknown field is not allowed")}function Uf(e,t,n,r){if(!ce(e)||!ce(t)||!ce(n)||!ce(r)||r<=0||e<t||e>n)return!1;let o=(e-t)/r;if(!Number.isFinite(o))return!1;let i=Math.round(o);return Math.abs(o-i)<=1e-9}function cc(e,t,n,r){if(tt(e)){if(tn(e,new Set(["param"]),t,r),typeof e.param!="string"||!e.param)return N(r,`${t}.param`,"must be a parameter name string"),null;if(!Object.prototype.hasOwnProperty.call(n,e.param))return N(r,`${t}.param`,`unknown parameter "${e.param}"`),null;let o=n[e.param];return!tt(o)||![o.value,o.min,o.max,o.step].every(Lf)?(N(r,`${t}.param`,"referenced period parameter value min max and step must be positive integers"),null):{param:e.param}}return Lf(e)?e:(N(r,t,"must be a positive integer or {param}"),null)}function $f(e,t,n,r){return tt(e)?(tn(e,new Set(["param"]),t,r),typeof e.param!="string"||!e.param?(N(r,`${t}.param`,"must be a parameter name string"),null):Object.prototype.hasOwnProperty.call(n,e.param)?{param:e.param}:(N(r,`${t}.param`,`unknown parameter "${e.param}"`),null)):ce(e)?e:(N(r,t,"must be a finite number or {param}"),null)}function Ri(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 OA(e){let t=new Map,n=r=>{let o=t.get(r)||0;if(o===1)return!0;if(o===2)return!1;t.set(r,1);let i=e.get(r);if(i){for(let s of Ri(i))if(e.has(s)&&n(s))return!0}return t.set(r,2),!1};for(let r of e.keys())if(n(r))return!0;return!1}function TA(e,t){if(!tt(e))return N(t,"parameters","must be a plain object"),null;let n=Object.keys(e);if(n.length>Nf)return N(t,"parameters",`too many parameters (max ${Nf})`),null;let r={};for(let o of n){if(!qf.test(o)){N(t,`parameters.${o}`,"parameter name is malformed");continue}let i=e[o],s=`parameters.${o}`;if(!tt(i)){N(t,s,"must be a plain object");continue}tn(i,Of,s,t);for(let d of Of)d in i||N(t,`${s}.${d}`,"required field is missing");let{value:a,min:c,max:u,step:l}=i;ce(c)||N(t,`${s}.min`,"must be a finite number"),ce(u)||N(t,`${s}.max`,"must be a finite number"),(!ce(l)||l<=0)&&N(t,`${s}.step`,"must be a positive finite number"),ce(a)||N(t,`${s}.value`,"must be a finite number"),ce(c)&&ce(u)&&c>u&&N(t,`${s}.min`,"min must be <= max"),ce(a)&&ce(c)&&ce(u)&&ce(l)&&l>0&&(Uf(a,c,u,l)||N(t,`${s}.value`,"value must lie on the declared min/max/step grid")),r[o]={value:a,min:c,max:u,step:l}}return r}function CA(e,t,n,r){let o=`nodes.${t}`;if(!tt(e))return N(r,o,"must be a plain object"),null;if(typeof e.type!="string"||!Cf[e.type])return N(r,`${o}.type`,"unknown or missing node type"),tn(e,_A,o,r),null;switch(tn(e,Cf[e.type],o,r),(typeof e.id!="string"||!Bf.test(e.id))&&N(r,`${o}.id`,"must be a 1-64 char id starting with alphanumeric"),e.type){case"input":return(typeof e.field!="string"||!EA.has(e.field))&&N(r,`${o}.field`,"must be one of open|high|low|close|volume|fundingRate|openInterest|premium|oiDelta|bookImbalance"),{id:e.id,type:"input",field:e.field};case"constant":{let i=$f(e.value,`${o}.value`,n,r);return{id:e.id,type:"constant",value:i}}case"indicator":{(typeof e.indicator!="string"||!SA.has(e.indicator))&&N(r,`${o}.indicator`,"must be one of sma|ema|rsi|macd|bollinger|atr");let i=e.indicator,s={id:e.id,type:"indicator",indicator:i};if(i==="atr"){"input"in e&&(typeof e.input!="string"||!e.input?N(r,`${o}.input`,"must be a node id string when provided"):s.input=e.input);let a=cc(e.period,`${o}.period`,n,r);a!=null&&(s.period=a)}else typeof e.input!="string"||!e.input?N(r,`${o}.input`,"must be a node id string"):s.input=e.input;if((i==="sma"||i==="ema"||i==="rsi"||i==="bollinger"||i==="atr")&&("period"in e,i!=="macd"))if(!("period"in e))N(r,`${o}.period`,"required field is missing");else{let a=cc(e.period,`${o}.period`,n,r);a!=null&&(s.period=a)}if(i==="macd"){for(let a of["fastPeriod","slowPeriod","signalPeriod"])if(!(a in e))N(r,`${o}.${a}`,"required field is missing");else{let c=cc(e[a],`${o}.${a}`,n,r);c!=null&&(s[a]=c)}"output"in e?kA.has(e.output)?s.output=e.output:N(r,`${o}.output`,"must be line|signal|histogram"):N(r,`${o}.output`,"required field is missing"),"period"in e&&N(r,`${o}.period`,"forbidden for macd"),"stdDev"in e&&N(r,`${o}.stdDev`,"forbidden for macd")}else if(i==="bollinger"){if(!("stdDev"in e))N(r,`${o}.stdDev`,"required field is missing");else{let a=$f(e.stdDev,`${o}.stdDev`,n,r);a!=null&&(typeof a=="number"&&a<=0?N(r,`${o}.stdDev`,"must be > 0"):s.stdDev=a)}"output"in e?IA.has(e.output)?s.output=e.output:N(r,`${o}.output`,"must be upper|middle|lower"):N(r,`${o}.output`,"required field is missing");for(let a of["fastPeriod","slowPeriod","signalPeriod"])a in e&&N(r,`${o}.${a}`,`forbidden for ${i}`)}else{"output"in e&&N(r,`${o}.output`,`forbidden for ${i}`),"stdDev"in e&&i!=="bollinger"&&N(r,`${o}.stdDev`,`forbidden for ${i}`);for(let a of["fastPeriod","slowPeriod","signalPeriod"])a in e&&N(r,`${o}.${a}`,`forbidden for ${i}`)}return s}case"compare":return(typeof e.op!="string"||!vA.has(e.op))&&N(r,`${o}.op`,"must be gt|gte|lt|lte|eq"),(typeof e.left!="string"||!e.left)&&N(r,`${o}.left`,"must be a node id"),(typeof e.right!="string"||!e.right)&&N(r,`${o}.right`,"must be a node id"),{id:e.id,type:"compare",op:e.op,left:e.left,right:e.right};case"logic":{if((typeof e.op!="string"||!AA.has(e.op))&&N(r,`${o}.op`,"must be and|or|not"),!Array.isArray(e.inputs))return N(r,`${o}.inputs`,"must be an array of node ids"),{id:e.id,type:"logic",op:e.op,inputs:[]};let i=[];for(let s=0;s<e.inputs.length;s++){let a=e.inputs[s];typeof a!="string"||!a?N(r,`${o}.inputs.${s}`,"must be a node id"):i.push(a)}return e.op==="not"?i.length!==1&&N(r,`${o}.inputs`,"not requires exactly one input"):(e.op==="and"||e.op==="or")&&i.length<2&&N(r,`${o}.inputs`,`${e.op} requires at least two inputs`),{id:e.id,type:"logic",op:e.op,inputs:i}}case"cross":return(typeof e.direction!="string"||!xA.has(e.direction))&&N(r,`${o}.direction`,"must be above|below"),(typeof e.left!="string"||!e.left)&&N(r,`${o}.left`,"must be a node id"),(typeof e.right!="string"||!e.right)&&N(r,`${o}.right`,"must be a node id"),{id:e.id,type:"cross",direction:e.direction,left:e.left,right:e.right};default:return null}}function NA(e,t,n){if(!tt(e))return N(t,"risk","must be a plain object"),null;tn(e,Tf,"risk",t);for(let f of Tf)(!(f in e)||e[f]==null)&&N(t,`risk.${f}`,"required field is missing");let r={},o=e.maxLeverage;!ce(o)||o<=0||o>50?N(t,"risk.maxLeverage","must be a number > 0 and <= 50"):r.maxLeverage=o;let i=e.maxNotionalUsd;!ce(i)||i<=0?N(t,"risk.maxNotionalUsd","must be a number > 0"):r.maxNotionalUsd=i;let s=e.positionSizePct;!ce(s)||s<=0||s>100?N(t,"risk.positionSizePct","must be a number > 0 and <= 100"):r.positionSizePct=s;let a=e.stopLossPct;!ce(a)||a<=0||a>100?N(t,"risk.stopLossPct","must be a number > 0 and <= 100"):r.stopLossPct=a;let c=e.takeProfitPct;!ce(c)||c<=0||c>1e3?N(t,"risk.takeProfitPct","must be a number > 0 and <= 1000"):r.takeProfitPct=c;let u=e.cooldownBars;!Number.isInteger(u)||u<0||u>1e5?N(t,"risk.cooldownBars","must be an integer >= 0 and <= 100000"):r.cooldownBars=u;let l=e.maxDailyLossPct;!ce(l)||l<=0||l>100?N(t,"risk.maxDailyLossPct","must be a number > 0 and <= 100"):r.maxDailyLossPct=l;let d=e.expiresAt;return!Number.isInteger(d)||d<=0?N(t,"risk.expiresAt","must be an integer epoch milliseconds > 0"):(n.nowMs!==void 0&&(Number.isInteger(n.nowMs)?d<=n.nowMs&&N(t,"risk.expiresAt","must be strictly greater than nowMs"):N(t,"nowMs","must be an integer epoch milliseconds")),r.expiresAt=d),r}function dc(e,t={}){let n=[];if(!tt(e))return N(n,"","strategy must be a plain object"),{ok:!1,errors:n,strategy:null};tn(e,_f,"",n);for(let d of _f)(!(d in e)||e[d]==null)&&N(n,d,"required field is missing");e.version!==ic&&N(n,"version",`must be ${ic}`),(typeof e.id!="string"||!qf.test(e.id))&&N(n,"id","must match /^[a-z0-9][a-z0-9._-]{0,63}$/"),(typeof e.name!="string"||e.name.length===0||e.name.length>Pf)&&N(n,"name",`must be a non-empty string max ${Pf}`);let r=nc(e.venue);r||N(n,"venue",`unknown strategy venue "${String(e.venue)}"`);let o=null;if(!r)tt(e.market)||N(n,"market","must be a plain object");else{let d=r.validateMarket(e.market);if(!d||typeof d.ok!="boolean"||!Array.isArray(d.errors))N(n,"market",`venue ${r.id} returned an invalid market validation result`);else if(d.ok)o=d.market;else for(let f of d.errors)N(n,f.path,f.message)}let i=TA(e.parameters,n),s=null,a=new Map;if(!Array.isArray(e.nodes))N(n,"nodes","must be an array");else if(e.nodes.length>Rf)N(n,"nodes",`too many nodes (max ${Rf})`);else{s=[];for(let d=0;d<e.nodes.length;d++){let f=CA(e.nodes[d],d,i||{},n);f&&(typeof f.id=="string"&&Bf.test(f.id)&&(a.has(f.id)?N(n,`nodes.${d}.id`,`duplicate node id "${f.id}"`):a.set(f.id,f)),s.push(f))}for(let d=0;d<s.length;d++){let f=s[d],p=`nodes.${d}`;for(let m of Ri(f))a.has(m)||N(n,p,`unknown node ref "${m}"`);if(f.type==="indicator"||f.type==="compare"||f.type==="cross")for(let m of Ri(f)){let y=a.get(m);y&&sc.has(y.type)&&N(n,p,`node ref "${m}" must be numeric`)}if(f.type==="logic")for(let m of Ri(f)){let y=a.get(m);y&&!sc.has(y.type)&&N(n,p,`node ref "${m}" must be boolean`)}}OA(a)&&N(n,"nodes","graph contains a cycle")}let c=null;if(!tt(e.rules))N(n,"rules","must be a plain object");else{tn(e.rules,ac,"rules",n);for(let d of ac)d in e.rules||N(n,`rules.${d}`,"required field is missing");c={};for(let d of ac){let f=e.rules[d];if(f===null){c[d]=null;continue}if(typeof f!="string"||!f){N(n,`rules.${d}`,"must be a node id or null"),c[d]=f;continue}if(!a.has(f)){N(n,`rules.${d}`,`unknown node ref "${f}"`),c[d]=f;continue}let p=a.get(f);sc.has(p.type)||N(n,`rules.${d}`,`rule must reference a boolean node, not ${p.type}`),c[d]=f}}let u=NA(e.risk,n,t);if(n.length)return{ok:!1,errors:n,strategy:null};let l=uc({version:ic,id:e.id,name:e.name,venue:r.id,market:o,parameters:i,nodes:s,rules:c,risk:u});return{ok:!0,errors:[],strategy:l}}function Ne(e,t={}){let n=dc(e,t);if(!n.ok)throw new Zn(n.errors);return n.strategy}function RA(e){let t=Ne(e);return JSON.stringify(lc(t))}function Xn(e){let t=RA(e);return wA("sha256").update(t,"utf8").digest("hex")}function Zr(e,t){if(!tt(e))throw new Zn([{path:"",message:"strategy must be a plain object"}]);if(!tt(t))throw new Zn([{path:"overrides",message:"must be a plain object"}]);let n=Ne(e),r={};for(let[i,s]of Object.entries(n.parameters))r[i]={value:s.value,min:s.min,max:s.max,step:s.step};let o=[];for(let[i,s]of Object.entries(t)){if(!Object.prototype.hasOwnProperty.call(r,i)){N(o,i,`unknown parameter "${i}"`);continue}let a=r[i];if(!ce(s)){N(o,i,"override must be a finite number");continue}if(!Uf(s,a.min,a.max,a.step)){N(o,i,"override must lie on the declared min/max/step grid");continue}r[i]={...a,value:s}}if(o.length)throw new Zn(o);return Ne({version:n.version,id:n.id,name:n.name,venue:n.venue,market:{coin:n.market.coin,interval:n.market.interval},parameters:r,nodes:n.nodes.map(i=>{let s={...i};return Array.isArray(i.inputs)&&(s.inputs=[...i.inputs]),s}),rules:{...n.rules},risk:{...n.risk}})}var ic,qf,Bf,EA,SA,vA,AA,xA,kA,IA,sc,_f,Of,ac,Tf,_A,Cf,Nf,Rf,Pf,Zn,vn=O(()=>{oc();ic=1,qf=/^[a-z0-9][a-z0-9._-]{0,63}$/,Bf=/^[A-Za-z0-9][A-Za-z0-9._-]{0,63}$/,EA=new Set(["open","high","low","close","volume","fundingRate","openInterest","premium","oiDelta","bookImbalance"]),SA=new Set(["sma","ema","rsi","macd","bollinger","atr"]),vA=new Set(["gt","gte","lt","lte","eq"]),AA=new Set(["and","or","not"]),xA=new Set(["above","below"]),kA=new Set(["line","signal","histogram"]),IA=new Set(["upper","middle","lower"]),sc=new Set(["compare","logic","cross"]),_f=new Set(["version","id","name","venue","market","parameters","nodes","rules","risk"]),Of=new Set(["value","min","max","step"]),ac=new Set(["entryLong","entryShort","exitLong","exitShort"]),Tf=new Set(["maxLeverage","maxNotionalUsd","positionSizePct","stopLossPct","takeProfitPct","cooldownBars","maxDailyLossPct","expiresAt"]),_A=new Set(["id","type"]),Cf={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"])},Nf=16,Rf=128,Pf=100,Zn=class extends Error{constructor(t){let n=t.map(r=>`${r.path}: ${r.message}`);super(`invalid strategy (${t.length} error${t.length===1?"":"s"}): ${n.join("; ")}`),this.name="StrategyValidationError",this.errors=t}}});function eo(e){if(!Array.isArray(e))throw new TypeError("values must be an array");for(let t=0;t<e.length;t++){let n=e[t];if(typeof n!="number"||!Number.isFinite(n))throw new TypeError(`values[${t}] must be a finite number`)}}function nn(e){if(!Number.isInteger(e)||e<=0)throw new TypeError("period must be a positive integer")}function PA(e){if(!Array.isArray(e))throw new TypeError("bars must be an array");for(let t=0;t<e.length;t++){let n=e[t];if(n==null||typeof n!="object")throw new TypeError(`bars[${t}] must be an object`);for(let r of["o","h","l","c"]){let o=n[r];if(typeof o!="number"||!Number.isFinite(o))throw new TypeError(`bars[${t}].${r} must be a finite number`)}if(n.h<n.l)throw new TypeError(`bars[${t}] high must be >= low`)}}function Df(e,t){eo(e),nn(t);let n=new Array(e.length).fill(null);if(e.length<t)return n;let r=0;for(let o=0;o<e.length;o++)r+=e[o],o>=t&&(r-=e[o-t]),o>=t-1&&(n[o]=r/t);return n}function Pi(e,t){eo(e),nn(t);let n=new Array(e.length).fill(null);if(e.length<t)return n;let r=0;for(let s=0;s<t;s++)r+=e[s];let o=r/t;n[t-1]=o;let i=2/(t+1);for(let s=t;s<e.length;s++)o=i*e[s]+(1-i)*o,n[s]=o;return n}function Ff(e,t){eo(e),nn(t);let n=new Array(e.length).fill(null);if(e.length<=t)return n;let r=0,o=0;for(let a=1;a<=t;a++){let c=e[a]-e[a-1];c>=0?r+=c:o-=c}let i=r/t,s=o/t;n[t]=Mf(i,s);for(let a=t+1;a<e.length;a++){let c=e[a]-e[a-1],u=c>0?c:0,l=c<0?-c:0;i=(i*(t-1)+u)/t,s=(s*(t-1)+l)/t,n[a]=Mf(i,s)}return n}function Mf(e,t){return e===0&&t===0?50:t===0?100:e===0?0:100-100/(1+e/t)}function jf(e,t={}){eo(e);let n=t.fastPeriod,r=t.slowPeriod,o=t.signalPeriod;if(nn(n),nn(r),nn(o),n>=r)throw new TypeError("fastPeriod must be < slowPeriod");let i=Pi(e,n),s=Pi(e,r),a=new Array(e.length).fill(null);for(let d=0;d<e.length;d++)i[d]!=null&&s[d]!=null&&(a[d]=i[d]-s[d]);let c=new Array(e.length).fill(null),u=new Array(e.length).fill(null),l=[];for(let d=0;d<a.length;d++)a[d]!=null&&l.push(d);if(l.length>=o){let d=0;for(let y=0;y<o;y++)d+=a[l[y]];let f=d/o,p=l[o-1];c[p]=f,u[p]=a[p]-f;let m=2/(o+1);for(let y=o;y<l.length;y++){let h=l[y];f=m*a[h]+(1-m)*f,c[h]=f,u[h]=a[h]-f}}return{line:a,signal:c,histogram:u}}function Hf(e,t={}){eo(e);let n=t.period,r=t.stdDev;if(nn(n),typeof r!="number"||!Number.isFinite(r)||r<=0)throw new TypeError("stdDev must be a finite number > 0");let o=new Array(e.length).fill(null),i=new Array(e.length).fill(null),s=new Array(e.length).fill(null);if(e.length<n)return{upper:i,middle:o,lower:s};let a=0,c=0;for(let u=0;u<e.length;u++){let l=e[u];if(a+=l,c+=l*l,u>=n){let d=e[u-n];a-=d,c-=d*d}if(u>=n-1){let d=a/n,f=c/n-d*d;f<0&&f>-1e-12&&(f=0);let p=Math.sqrt(f);o[u]=d,i[u]=d+r*p,s[u]=d-r*p}}return{upper:i,middle:o,lower:s}}function zf(e,t){PA(e),nn(t);let n=new Array(e.length).fill(null);if(e.length<t)return n;let r=new Array(e.length);for(let s=0;s<e.length;s++){let a=e[s];if(s===0)r[s]=a.h-a.l;else{let c=e[s-1].c;r[s]=Math.max(a.h-a.l,Math.abs(a.h-c),Math.abs(a.l-c))}}let o=0;for(let s=0;s<t;s++)o+=r[s];let i=o/t;n[t-1]=i;for(let s=t;s<e.length;s++)i=(i*(t-1)+r[s])/t,n[s]=i;return n}var Vf=O(()=>{});import{createHash as LA}from"node:crypto";var pc,$A,qA,BA,Wf,Gf=O(()=>{pc=3,$A="7477966facc4ef928a94e6221c8fd238eef4fcbeec46b96ae1b89178e13c2d5f",qA="68f5b412a9975f04024cf9b9b6209b4bccedd52f176e95f34f786b3f53479c6a",BA="967fd45ecddd0d59ac0f662fe92ea813c32620ba751f249b4ace6cb6b809fb5e",Wf=LA("sha256").update(JSON.stringify({version:pc,compilerSourceHash:$A,indicatorsSourceHash:qA,schemaSourceHash:BA})).digest("hex")});function Ge(e){return typeof e=="number"&&Number.isFinite(e)}function DA(e){let t=new Map(e.map(a=>[a.id,a])),n=a=>{switch(a.type){case"indicator":return a.input?[a.input]:[];case"compare":case"cross":return[a.left,a.right];case"logic":return[...a.inputs];default:return[]}},r=new Map,o=new Map;for(let a of e)r.set(a.id,0),o.set(a.id,[]);for(let a of e)for(let c of n(a))t.has(c)&&(o.get(c).push(a.id),r.set(a.id,r.get(a.id)+1));let i=[];for(let[a,c]of r)c===0&&i.push(a);let s=[];for(;i.length;){let a=i.shift();s.push(a);for(let c of o.get(a))r.set(c,r.get(c)-1),r.get(c)===0&&i.push(c)}if(s.length!==e.length)throw new Error("strategy graph is cyclic");return s}function er(e,t){return e!=null&&typeof e=="object"&&"param"in e?t[e.param].value:e}function FA(e,t,n){if(!Array.isArray(e)||e.length===0)throw new TypeError("bars must be a non-empty array");if(!Number.isInteger(t)||t<0||t>=e.length)throw new RangeError("index out of range");let r=null;for(let o=0;o<=t;o++){let i=e[o];if(i==null||typeof i!="object"||Array.isArray(i))throw new TypeError(`bars[${o}] must be an object`);let{t:s,o:a,h:c,l:u,c:l,v:d}=i;if(!Ge(s)&&(typeof s=="number"&&Number.isFinite(s)),!Number.isFinite(s))throw new TypeError(`bars[${o}].t must be finite`);for(let[f,p]of[["o",a],["h",c],["l",u],["c",l],["v",d]])if(!Ge(p))throw new TypeError(`bars[${o}].${f} must be a finite number`);for(let[f,p]of[["o",a],["h",c],["l",u],["c",l]])if(!(p>0))throw new TypeError(`bars[${o}].${f} price must be positive`);if(d<0)throw new TypeError(`bars[${o}].v volume must be non-negative`);if(c<Math.max(a,l,u))throw new TypeError(`bars[${o}] high must be >= max(open, close, low)`);if(u>Math.min(a,l,c))throw new TypeError(`bars[${o}] low must be <= min(open, close, high)`);if(r!=null){if(!(s>r))throw new TypeError("bars t must be strictly increasing");if(s-r!==MA[n])throw new TypeError(`bars t must match ${n} cadence`)}if(r=s,"fundingRate"in i&&i.fundingRate!=null&&!Ge(i.fundingRate))throw new TypeError(`bars[${o}].fundingRate must be finite when present`);if("openInterest"in i&&i.openInterest!=null){if(!Ge(i.openInterest))throw new TypeError(`bars[${o}].openInterest must be finite when present`);if(i.openInterest<0)throw new TypeError(`bars[${o}].openInterest must be non-negative`)}for(let f of["premium","oiDelta"])if(f in i&&i[f]!=null&&!Ge(i[f]))throw new TypeError(`bars[${o}].${f} must be finite when present`);if("bookImbalance"in i&&i.bookImbalance!=null){if(!Ge(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 kn(e,t,n,r,o,i){if(i.has(e))return i.get(e);let s=t.get(e),a;switch(s.type){case"input":{let c=UA[s.field];a=new Array(o+1);for(let u=0;u<=o;u++){let l=r[u][c];a[u]=l===void 0?null:l}break}case"constant":{let c=er(s.value,n);a=new Array(o+1).fill(c);break}case"indicator":{let c=s.period!=null?er(s.period,n):void 0;if(s.indicator==="atr"){let d=[];for(let f=0;f<=o;f++){let p=r[f];d.push({o:p.o,h:p.h,l:p.l,c:p.c})}a=zf(d,c);break}let l=kn(s.input,t,n,r,o,i).map((d,f)=>{if(d==null||!Ge(d))throw new TypeError(`indicator input ${s.input} has non-finite value at ${f}`);return d});if(s.indicator==="sma")a=Df(l,c);else if(s.indicator==="ema")a=Pi(l,c);else if(s.indicator==="rsi")a=Ff(l,c);else if(s.indicator==="macd")a=jf(l,{fastPeriod:er(s.fastPeriod,n),slowPeriod:er(s.slowPeriod,n),signalPeriod:er(s.signalPeriod,n)})[s.output];else if(s.indicator==="bollinger")a=Hf(l,{period:c,stdDev:er(s.stdDev,n)})[s.output];else throw new Error(`unsupported indicator ${s.indicator}`);break}case"compare":{let c=kn(s.left,t,n,r,o,i),u=kn(s.right,t,n,r,o,i);a=new Array(o+1);for(let l=0;l<=o;l++){let d=c[l],f=u[l];if(d==null||f==null||!Ge(d)||!Ge(f)){a[l]=!1;continue}switch(s.op){case"gt":a[l]=d>f;break;case"gte":a[l]=d>=f;break;case"lt":a[l]=d<f;break;case"lte":a[l]=d<=f;break;case"eq":a[l]=d===f;break;default:a[l]=!1}}break}case"logic":{let c=s.inputs.map(u=>kn(u,t,n,r,o,i));a=new Array(o+1);for(let u=0;u<=o;u++)if(s.op==="not"){let l=c[0][u];a[u]=l===!0?!1:l===!1}else if(s.op==="and"){let l=!0;for(let d of c)if(d[u]!==!0){l=!1;break}a[u]=l}else if(s.op==="or"){let l=!1;for(let d of c)if(d[u]===!0){l=!0;break}a[u]=l}else a[u]=!1;break}case"cross":{let c=kn(s.left,t,n,r,o,i),u=kn(s.right,t,n,r,o,i);a=new Array(o+1),a[0]=!1;for(let l=1;l<=o;l++){let d=c[l-1],f=u[l-1],p=c[l],m=u[l];if(d==null||f==null||p==null||m==null||!Ge(d)||!Ge(f)||!Ge(p)||!Ge(m)){a[l]=!1;continue}s.direction==="above"?a[l]=d<=f&&p>m:a[l]=d>=f&&p<m}break}default:throw new Error(`unknown node type ${s.type}`)}return i.set(e,a),a}function Re(e,t={}){let n=Ne(e);t&&Object.keys(t).length&&(n=Zr(n,t));let r=new Map(n.nodes.map(p=>[p.id,p])),o=Object.freeze(DA(n.nodes)),i=n.parameters,s=new Set(n.nodes.filter(p=>p.type==="input").map(p=>p.field));if(n.nodes.some(p=>p.type==="indicator"&&p.indicator==="atr"))for(let p of["open","high","low","close"])s.add(p);let a=Object.freeze([...s].sort()),c=Xn(n);function u(p,m){let y={};for(let w of o){let A=p.get(w);y[w]=A[m]}let h=w=>w!=null&&y[w]===!0;return{values:y,signals:{entryLong:h(n.rules.entryLong),entryShort:h(n.rules.entryShort),exitLong:h(n.rules.exitLong),exitShort:h(n.rules.exitShort)}}}function l(p,m){FA(p,m,n.market.interval);let y=new Map;for(let h of o)kn(h,r,i,p,m,y);return y}function d(p,m){return u(l(p,m),m)}function f(p){if(!Array.isArray(p)||p.length===0)throw new TypeError("bars must be a non-empty array");let m=p.length-1,y=l(p,m);return Object.freeze(p.map((h,w)=>Object.freeze(u(y,w))))}return Object.freeze({strategy:n,strategyHash:c,compilerVersion:Jr,compilerHash:An,requiredSeries:a,nodeOrder:o,evaluate:d,evaluateAll:f})}var Jr,An,UA,MA,xn=O(()=>{vn();Vf();Gf();Jr=pc,An=Wf,UA=Object.freeze({open:"o",high:"h",low:"l",close:"c",volume:"v",fundingRate:"fundingRate",openInterest:"openInterest",premium:"premium",oiDelta:"oiDelta",bookImbalance:"bookImbalance"}),MA=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 jA}from"node:crypto";function zA(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function vt(e){return typeof e=="number"&&Number.isFinite(e)}function fc(e){if(e==null||typeof e!="object"||Object.isFrozen(e))return e;if(Array.isArray(e)){for(let t of e)fc(t);return Object.freeze(e)}for(let t of Object.keys(e))fc(e[t]);return Object.freeze(e)}function Li(e){if(Array.isArray(e))return e.map(Li);if(e!=null&&typeof e=="object"){let t={};for(let n of Object.keys(e).sort())t[n]=Li(e[n]);return t}return e}function mc(e,t="result"){if(typeof e=="number"){if(!Number.isFinite(e))throw new Error(`non-finite backtest result at ${t}`);return}if(!(e==null||typeof e!="object")){if(Array.isArray(e)){e.forEach((n,r)=>mc(n,`${t}[${r}]`));return}for(let[n,r]of Object.entries(e))mc(r,`${t}.${n}`)}}function Yf(e){if(!Array.isArray(e)||e.length===0)throw new TypeError("bars must be a non-empty array");let t=null;for(let n=0;n<e.length;n++){let r=e[n];if(r==null||typeof r!="object"||Array.isArray(r))throw new TypeError(`bars[${n}] must be an object`);let{t:o,o:i,h:s,l:a,c,v:u}=r;if(!vt(o))throw new TypeError(`bars[${n}].t must be finite`);for(let[l,d]of[["o",i],["h",s],["l",a],["c",c],["v",u]])if(!vt(d))throw new TypeError(`bars[${n}].${l} must be a finite number`);for(let[l,d]of[["o",i],["h",s],["l",a],["c",c]])if(!(d>0))throw new TypeError(`bars[${n}].${l} price must be positive`);if(u<0)throw new TypeError(`bars[${n}].v volume must be non-negative`);if(s<Math.max(i,c,a))throw new TypeError(`bars[${n}] high must be >= max(open, close, low)`);if(a>Math.min(i,c,s))throw new TypeError(`bars[${n}] low must be <= min(open, close, high)`);if(t!=null&&!(o>t))throw new TypeError("bars t must be strictly increasing");if(t=o,"fundingRate"in r&&r.fundingRate!=null&&!vt(r.fundingRate))throw new TypeError(`bars[${n}].fundingRate must be finite when present`);if("fundingPaymentRate"in r&&r.fundingPaymentRate!=null&&!vt(r.fundingPaymentRate))throw new TypeError(`bars[${n}].fundingPaymentRate must be finite when present`);if("openInterest"in r&&r.openInterest!=null&&!vt(r.openInterest))throw new TypeError(`bars[${n}].openInterest must be finite when present`)}}function Yr(e){if(!Array.isArray(e))throw new TypeError("bars must be an array");return e.length>0&&Yf(e),jA("sha256").update(JSON.stringify(Li(e)),"utf8").digest("hex")}function VA(e){if(e==null&&(e={}),!zA(e))throw new TypeError("options must be a plain object");let t={...HA},n=new Set(["initialEquityUsd","takerFeeBps","builderFeeBps","slippageBps","latencyBars","maxVolumeParticipationPct","nowMs"]);for(let r of Object.keys(e))if(!n.has(r))throw new TypeError(`unknown option "${r}"`);if("initialEquityUsd"in e){if(!vt(e.initialEquityUsd)||e.initialEquityUsd<=0)throw new TypeError("initialEquityUsd must be a positive finite number");t.initialEquityUsd=e.initialEquityUsd}for(let r of["takerFeeBps","builderFeeBps","slippageBps"])if(r in e){let o=e[r];if(!vt(o)||o<0)throw new TypeError(`${r} must be a finite number >= 0`);if(r==="slippageBps"?o>=1e4:o>1e4)throw new TypeError(`${r} exceeds its safe basis-point bound`);t[r]=o}if("latencyBars"in e){let r=e.latencyBars;if(!Number.isInteger(r)||r<1)throw new TypeError("latencyBars must be an integer >= 1");t.latencyBars=r}if("maxVolumeParticipationPct"in e){let r=e.maxVolumeParticipationPct;if(!vt(r)||r<=0||r>100)throw new TypeError("maxVolumeParticipationPct must be in (0,100]");t.maxVolumeParticipationPct=r}if("nowMs"in e){if(!Number.isInteger(e.nowMs))throw new TypeError("nowMs must be an integer epoch milliseconds");t.nowMs=e.nowMs}return t}function $i(e){return e/1e4}function WA(e,t,n){let r=$i(n);return t==="long"?e*(1+r):e*(1-r)}function GA(e,t,n){let r=$i(n);return t==="long"?e*(1-r):e*(1+r)}function Kf(e,t,n){let r=Math.abs(e)*$i(t),o=Math.abs(e)*$i(n);return{taker:r,builder:o,total:r+o}}function KA(e,t){let n=e*(t.positionSizePct/100)*t.maxLeverage;return Math.min(n,t.maxNotionalUsd)}function YA(e,t,n){let r=n/100;return t==="long"?e*(1-r):e*(1+r)}function XA(e,t,n){let r=n/100;return t==="long"?e*(1+r):e*(1-r)}function JA(e,t,n,r){if(!(n>0))return t==="long"?0:Number.POSITIVE_INFINITY;let o=Math.min(.99,1/(2*n)+r/1e4);return t==="long"?e*(1-1/n)/(1-o):e*(1+1/n)/(1+o)}function QA(e,t,n){return t==="long"?e.l<=n:e.h>=n}function ZA(e,t,n){return t==="long"?e.h>=n:e.l<=n}function ex(e,t,n){return t==="long"?e.l<=n:e.h>=n}function to(e,t){for(let n of e.requiredSeries)if(tx.includes(n)&&!t.every(r=>vt(r?.[n])))throw new Error(`strategy required series is absent: ${n}`)}function nx(e){if(e.length<3)return 0;let t=[];for(let s=1;s<e.length;s++){let a=e[s-1].equity,c=e[s].equity;a>0&&t.push((c-a)/a)}if(t.length<2)return 0;let n=0;for(let s of t)n+=s;let r=n/t.length,o=0;for(let s of t)o+=(s-r)**2;let i=Math.sqrt(o/(t.length-1));return i>0?r/i:0}function rx(e){let t=-1/0,n=0;for(let r of e){let o=r.equity;if(o>t&&(t=o),t>0){let i=(t-o)/t*100;i>n&&(n=i)}}return n}function en(e,t,n={}){let r=VA(n);Yf(t);let o=Yr(t);r.nowMs!==void 0&&Ne(e,{nowMs:r.nowMs});let i=Re(e);if(to(i,t),r.nowMs!==void 0&&i.strategy.risk.expiresAt<=r.nowMs)throw new Error("strategy is expired: risk.expiresAt must be strictly greater than nowMs");let s=i.strategy.risk,a=i.evaluateAll(t),c=r.latencyBars,u=r.slippageBps,l=r.takerFeeBps,d=r.builderFeeBps,f=r.initialEquityUsd,p=0,m=0,y=0,h=0,w=0,A=[],_=[],S=[],k=[],x=[],E=null,g=0,b=null,v=f,P=!1,I=0,L=0,q=[],H=new Array(t.length).fill(0);function $(R){q.push(R)}function D(R){let W=t[R].v*(r.maxVolumeParticipationPct/100);return Math.max(0,W-H[R])}function M(R){if(!E)return f;let W=E.side==="long"?(R-E.entryPrice)*E.qty:(E.entryPrice-R)*E.qty;return f+W}function Q(R,W,B){let ie=B.o,X=KA(f,s);if(!(X>0)||!(ie>0))return;let se=WA(ie,W,u),re=X/se,me=D(R),Er=se*me;if(re>me){S.push({kind:"entry",barIndex:R,time:B.t,side:W,requestedNotionalUsd:X,maxFillNotionalUsd:Er,reason:"volume_participation"});return}H[R]+=re;let ht=Math.abs(se-ie)*re,Pt=Kf(X,l,d);f-=Pt.total,p+=Pt.taker,m+=Pt.builder,h+=ht,w+=X,E={lifecycleEpoch:++L,side:W,entryBarIndex:R,entryReferencePrice:ie,entryPrice:se,qty:re,notionalUsd:X,stop:YA(se,W,s.stopLossPct),take:XA(se,W,s.takeProfitPct),liq:JA(se,W,s.maxLeverage,l+d),entryFees:Pt.taker,entryBuilderFees:Pt.builder,entrySlippageUsd:ht,fundingAccrued:0}}function Y(R,W,B,ie){if(!E)return!1;let X=E.side,se=W,re=se;B!=="liquidation"&&ie&&(re=GA(se,X,u));let me=E.qty,Er=me*re;if(B!=="liquidation"){let cl=D(R),sb=re*cl;if(me>cl)return S.push({kind:"exit",barIndex:R,time:t[R].t,side:X,requestedNotionalUsd:Er,maxFillNotionalUsd:sb,reason:"volume_participation",triggerReason:B}),!1;H[R]+=me}let ht=Kf(Er,l,d),Pt=B==="liquidation"?0:Math.abs(re-se)*me,Sr,Us;X==="long"?(Sr=(se-E.entryReferencePrice)*me,Us=(re-E.entryPrice)*me):(Sr=(E.entryReferencePrice-se)*me,Us=(E.entryPrice-re)*me),f+=Us,f-=ht.total,p+=ht.taker,m+=ht.builder,h+=Pt,w+=Er;let ib={side:X,entryBarIndex:E.entryBarIndex,entryTime:t[E.entryBarIndex].t,entryPrice:E.entryPrice,exitBarIndex:R,exitTime:t[R].t,exitPrice:re,exitReason:B,qty:me,notionalUsd:E.notionalUsd,grossPnlUsd:Sr,feesUsd:E.entryFees+ht.taker,builderFeesUsd:E.entryBuilderFees+ht.builder,fundingUsd:E.fundingAccrued,slippageUsd:E.entrySlippageUsd+Pt,netPnlUsd:Sr-(E.entryFees+ht.taker+E.entryBuilderFees+ht.builder)-E.fundingAccrued-(E.entrySlippageUsd+Pt)};return A.push(ib),B==="liquidation"&&_.push({barIndex:R,time:t[R].t,side:X,price:re,tradeIndex:A.length-1}),E=null,L+=1,I=R+1+(s.cooldownBars||0),!0}function Ue(R,W,B,ie){let X=R+1;if(X>=t.length)return;q.some(re=>re.kind==="exit"&&re.side===W&&re.fillBar===X&&re.epoch===ie)||$({kind:"exit",side:W,signalBar:R,fillBar:X,reason:B,epoch:ie})}function le(R){let W=q.filter(B=>B.fillBar===R);for(let B=q.length-1;B>=0;B--)q[B].fillBar===R&&q.splice(B,1);W.sort((B,ie)=>{let X=se=>se.kind==="exit"?0:1;return X(B)-X(ie)});for(let B of W)if(B.kind==="exit"){if(!E||E.side!==B.side||E.lifecycleEpoch!==B.epoch)continue;let ie=B.reason||"rule";Y(R,t[R].o,ie,!0)||Ue(R,B.side,ie,B.epoch)}else if(B.kind==="entry"){if(E||B.epoch!==L||R<I)continue;Q(R,B.side,t[R])}}function Wt(R){if(!E)return;let W=t[R],B=W.fundingPaymentRate;if(B==null||!vt(B)||B===0)return;let ie=Math.abs(E.qty*W.c),X=B*ie;E.side==="long"?(f-=X,E.fundingAccrued+=X,y+=X):(f+=X,E.fundingAccrued-=X,y-=X)}function Gt(R){if(!E)return;let W=t[R].o;(E.side==="long"?W<=E.liq:W>=E.liq)&&Y(R,W,"liquidation",!1)}function rl(R){if(!E)return;let W=t[R],B=E.side,ie=ex(W,B,E.liq),X=QA(W,B,E.stop),se=ZA(W,B,E.take),re=me=>B==="long"?Math.min(me,W.o):Math.max(me,W.o);if(ie){Y(R,re(E.liq),"liquidation",!1);return}if(X&&se){Y(R,re(E.stop),"stop_loss",!0)||Ue(R,B,"stop_loss",E.lifecycleEpoch);return}if(X){Y(R,re(E.stop),"stop_loss",!0)||Ue(R,B,"stop_loss",E.lifecycleEpoch);return}se&&(Y(R,E.take,"take_profit",!0)||Ue(R,B,"take_profit",E.lifecycleEpoch))}for(let R=0;R<t.length;R++){let W=Math.floor(t[R].t/864e5);W!==b&&(b=W,v=M(t[R].o),P=!1),Gt(R),le(R),rl(R),Wt(R),!P&&M(t[R].c)<=v*(1-s.maxDailyLossPct/100)&&(P=!0,k.push({type:"daily_loss_limit",barIndex:R,time:t[R].t,message:"daily loss limit reached; new entries blocked for UTC day"}));let B=a[R].signals,ie=R+c;if(E)(E.side==="long"&&B.exitLong===!0||E.side==="short"&&B.exitShort===!0)&&ie<t.length&&(q.some(me=>me.kind==="exit"&&me.side===E.side&&me.fillBar===ie&&me.epoch===E.lifecycleEpoch)||$({kind:"exit",side:E.side,signalBar:R,fillBar:ie,reason:"rule",epoch:E.lifecycleEpoch}));else{let se=B.entryLong===!0,re=B.entryShort===!0;se&&re?k.push({type:"conflicting_entry_signals",barIndex:R,time:t[R].t,message:"conflicting entry signals; no position opened"}):!P&&(se||re)&&ie<t.length&&R>=I&&$({kind:"entry",side:se?"long":"short",signalBar:R,fillBar:ie,epoch:L})}let X=f;E&&(g+=1,X=M(t[R].c)),x.push({barIndex:R,time:t[R].t,equity:X,positionSide:E?E.side:null})}let ol=null;if(E){let R=t.length-1;if(Y(R,t[R].c,"end_of_data",!0))x[R]={barIndex:R,time:t[R].t,equity:f,positionSide:null};else{let B=M(t[R].c);ol={side:E.side,entryBarIndex:E.entryBarIndex,entryTime:t[E.entryBarIndex].t,entryPrice:E.entryPrice,qty:E.qty,notionalUsd:E.notionalUsd,markPrice:t[R].c,markedEquityUsd:B},k.push({type:"open_position_at_end",barIndex:R,time:t[R].t,message:"end-of-data exit missed; position remains open and marked"})}}let il=(E?M(t[t.length-1].c):f)-r.initialEquityUsd,tb=il/r.initialEquityUsd*100,sl=0,Ls=0,$s=0;for(let R of A)R.netPnlUsd>0?(sl+=1,Ls+=R.netPnlUsd):R.netPnlUsd<0&&($s+=-R.netPnlUsd);let qs=A.length,nb=qs===0?0:sl/qs,Bs=0;$s>0?Bs=Ls/$s:Ls>0&&(Bs=1e12);let rb={netPnlUsd:il,netPnlPct:tb,maxDrawdownPct:rx(x),winRate:nb,profitFactor:Bs,tradeCount:qs,sharpe:nx(x),turnoverUsd:w,exposurePct:g/t.length*100},ob={initialEquityUsd:r.initialEquityUsd,takerFeeBps:r.takerFeeBps,builderFeeBps:r.builderFeeBps,slippageBps:r.slippageBps,latencyBars:r.latencyBars,maxVolumeParticipationPct:r.maxVolumeParticipationPct},al={barsHash:o,strategyHash:i.strategyHash,compilerHash:An,compilerVersion:Jr,config:ob,trades:A,equityCurve:x,metrics:rb,costs:{feesUsd:p,builderFeesUsd:m,fundingUsd:y,slippageUsd:h},liquidations:_,missedFills:S,openPositionAtEnd:ol,flags:k};return mc(al),fc(Li(al))}var HA,tx,Ni=O(()=>{xn();vn();HA=Object.freeze({initialEquityUsd:1e4,takerFeeBps:3.5,builderFeeBps:2,slippageBps:2,latencyBars:1,maxVolumeParticipationPct:100});tx=Object.freeze(["fundingRate","openInterest","premium","oiDelta","bookImbalance"])});import{createHash as ox}from"node:crypto";function px(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function hc(e){if(e==null||typeof e!="object"||Object.isFrozen(e))return e;if(Array.isArray(e)){for(let t of e)hc(t);return Object.freeze(e)}for(let t of Object.keys(e))hc(e[t]);return Object.freeze(e)}function fx(e){return String(e).trim().replace(/\s+/g," ")}function mx(e){let t=e.match(/\b(long|short)\b/i);return t?t[1].toLowerCase():null}function hx(e){for(let n of sx)if(new RegExp(`\\b${n}\\b`,"i").test(e))return n;let t=e.match(/\b([A-Z][A-Z0-9]{1,11})\b/);return t?t[1]:null}function yx(e){let t=e.match(/\bon\s+(1m|3m|5m|15m|30m|1h|2h|4h|8h|12h|1d)\b/i);if(!t)return"15m";let n=t[1].toLowerCase();return ix.has(n)?n:null}function gx(e){let t={...cx},n=e.match(/stop\s*loss\s*(\d+(?:\.\d+)?)\s*%?/i);n&&(t.stopLossPct=Number(n[1]));let r=e.match(/take\s*profit\s*(\d+(?:\.\d+)?)\s*%?/i);r&&(t.takeProfitPct=Number(r[1]));let o=e.match(/leverage\s*(\d+(?:\.\d+)?)/i);o&&(t.maxLeverage=Number(o[1]));let i=e.match(/position\s*size\s*(\d+(?:\.\d+)?)\s*%?/i);i&&(t.positionSizePct=Number(i[1]));let s=e.match(/max\s*notional\s*(?:usd\s*)?\$?\s*(\d+(?:\.\d+)?)/i);return s&&(t.maxNotionalUsd=Number(s[1])),t}function bx(e){return[/\bon\s+(?:1m|3m|5m|15m|30m|1h|2h|4h|8h|12h|1d)\b/gi,/\bstop\s*loss\s*\d+(?:\.\d+)?\s*%?/gi,/\btake\s*profit\s*\d+(?:\.\d+)?\s*%?/gi,/\bleverage\s*\d+(?:\.\d+)?/gi,/\bposition\s*size\s*\d+(?:\.\d+)?\s*%?/gi,/\bmax\s*notional\s*(?:usd\s*)?\$?\s*\d+(?:\.\d+)?/gi].some(n=>(e.match(n)??[]).length>1)}function wx(e){let t=ox("sha256").update(e,"utf8").digest("hex").slice(0,10),n=e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").slice(0,40),o=`${n.length?n:"draft"}-${t}`.replace(/[^a-z0-9._-]/g,"").slice(0,64);return/^[a-z0-9]/.test(o)?o:`d${o}`.slice(0,64)}function Ex(e){let t=e.match(/\bema\s*(\d+)\s*cross(?:es)?\s*(above|below)\s*ema\s*(\d+)\b/i);if(!t)return null;let n=Number(t[1]),r=t[2].toLowerCase(),o=Number(t[3]);if(!(n>0)||!(o>0)||n===o)return null;let i=/\b(exit\s+on\s+reverse|reverse\s+exit)\b/i.test(e);return{kind:"ema_cross",fast:n,slow:o,direction:r,reverse:i}}function Sx(e){let t=e.match(/\brsi\s*(\d+)\s*(above|below)\s*(-?\d+(?:\.\d+)?)/i);if(!t)return null;let n=Number(t[3]);return!Number.isFinite(n)||n<=0||n>=100?null:{kind:"rsi",period:Number(t[1]),op:t[2].toLowerCase(),threshold:n}}function vx(e){let t=e.match(/\bfunding\s*rate\s*(above|below)\s*(-?\d+(?:\.\d+)?)(%?)(?=\s|,|$)/i);if(!t)return null;let n=Number(t[2]);return t[3]==="%"&&(n=n/100),{kind:"funding",op:t[1].toLowerCase(),threshold:n}}function Ax(e){let t=e.match(/\bopen\s*interest\s*(above|below)\s*(-?\d+(?:\.\d+)?)(?=\s|,|$)/i);if(!t)return null;let n=Number(t[2]);return!Number.isFinite(n)||n<0?null:{kind:"open_interest",op:t[1].toLowerCase(),threshold:n}}function xx(e){let t=e.match(/\bpremium\s*(above|below)\s*(-?\d+(?:\.\d+)?)(%?)(?=\s|,|$)/i);if(!t)return null;let n=Number(t[2]);return Number.isFinite(n)?(t[3]==="%"&&(n=n/100),{kind:"premium",op:t[1].toLowerCase(),threshold:n}):null}function kx(e){let t=e.match(/\boi\s*delta\s*(above|below)\s*(-?\d+(?:\.\d+)?)(?=\s|,|$)/i);if(!t)return null;let n=Number(t[2]);return Number.isFinite(n)?{kind:"oi_delta",op:t[1].toLowerCase(),threshold:n}:null}function Ix(e){let t=e.match(/\bbook\s*imbalance\s*(above|below)\s*(-?\d+(?:\.\d+)?)(?=\s|,|$)/i);if(!t)return null;let n=Number(t[2]);return!Number.isFinite(n)||n<-1||n>1?null:{kind:"book_imbalance",op:t[1].toLowerCase(),threshold:n}}function _x(e,t){let n=e.replace(/^(long|short)\s+[A-Z][A-Z0-9]{1,11}\s+when\s+/i,"");if(n===e)return!1;t.kind==="ema_cross"?n=n.replace(/^ema\s*\d+\s*cross(?:es)?\s*(?:above|below)\s*ema\s*\d+\b/i,""):t.kind==="rsi"?n=n.replace(/^rsi\s*\d+\s*(?:above|below)\s*\d+(?:\.\d+)?\b/i,""):t.kind==="open_interest"?n=n.replace(/^open\s*interest\s*(?:above|below)\s*-?\d+(?:\.\d+)?(?=\s|,|$)/i,""):t.kind==="premium"?n=n.replace(/^premium\s*(?:above|below)\s*-?\d+(?:\.\d+)?%?(?=\s|,|$)/i,""):t.kind==="oi_delta"?n=n.replace(/^oi\s*delta\s*(?:above|below)\s*-?\d+(?:\.\d+)?(?=\s|,|$)/i,""):t.kind==="book_imbalance"?n=n.replace(/^book\s*imbalance\s*(?:above|below)\s*-?\d+(?:\.\d+)?(?=\s|,|$)/i,""):n=n.replace(/^funding\s*rate\s*(?:above|below)\s*-?\d+(?:\.\d+)?%?(?=\s|,|$)/i,"");let r=[/(?:,\s*)?\bon\s+(?:1m|3m|5m|15m|30m|1h|2h|4h|8h|12h|1d)\b/gi,/(?:,\s*)?\bstop\s*loss\s*\d+(?:\.\d+)?\s*%?/gi,/(?:,\s*)?\btake\s*profit\s*\d+(?:\.\d+)?\s*%?/gi,/(?:,\s*)?\bleverage\s*\d+(?:\.\d+)?/gi,/(?:,\s*)?\bposition\s*size\s*\d+(?:\.\d+)?\s*%?/gi,/(?:,\s*)?\bmax\s*notional\s*(?:usd\s*)?\$?\s*\d+(?:\.\d+)?/gi];t.kind==="ema_cross"&&r.push(/(?:,\s*)?\b(?:exit\s+on\s+reverse|reverse\s+exit)\b/gi);for(let o of r)n=n.replace(o,"");return n.replace(/[\s,;]+/g,"")===""}function Xf(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 Ox({side:e,coin:t,interval:n,risk:r,expiresAt:o,id:i,name:s,spec:a}){let c=[{id:"c",type:"input",field:"close"},{id:"emaLeft",type:"indicator",indicator:"ema",input:"c",period:{param:"ema_left_period"}},{id:"emaRight",type:"indicator",indicator:"ema",input:"c",period:{param:"ema_right_period"}},{id:"cross",type:"cross",direction:a.direction,left:"emaLeft",right:"emaRight"}],u={entryLong:null,entryShort:null,exitLong:null,exitShort:null};if(e==="long"?u.entryLong="cross":u.entryShort="cross",a.reverse){let l=a.direction==="above"?"below":"above";c.push({id:"crossRev",type:"cross",direction:l,left:"emaLeft",right:"emaRight"}),e==="long"?u.exitLong="crossRev":u.exitShort="crossRev"}return{version:1,id:i,name:s,venue:"hyperliquid",market:{coin:t,interval:n},parameters:{ema_left_period:Xf(a.fast),ema_right_period:Xf(a.slow)},nodes:c,rules:u,risk:{...r,expiresAt:o}}}function Tx({side:e,coin:t,interval:n,risk:r,expiresAt:o,id:i,name:s,spec:a}){let c=[{id:"c",type:"input",field:"close"},{id:"rsi",type:"indicator",indicator:"rsi",input:"c",period:a.period},{id:"thr",type:"constant",value:a.threshold},{id:"sig",type:"compare",op:a.op==="above"?"gt":"lt",left:"rsi",right:"thr"}];return{version:1,id:i,name:s,venue:"hyperliquid",market:{coin:t,interval:n},parameters:{},nodes:c,rules:{entryLong:e==="long"?"sig":null,entryShort:e==="short"?"sig":null,exitLong:null,exitShort:null},risk:{...r,expiresAt:o}}}function Cx({side:e,coin:t,interval:n,risk:r,expiresAt:o,id:i,name:s,spec:a}){let c=[{id:"fr",type:"input",field:"fundingRate"},{id:"thr",type:"constant",value:a.threshold},{id:"sig",type:"compare",op:a.op==="above"?"gt":"lt",left:"fr",right:"thr"}];return{version:1,id:i,name:s,venue:"hyperliquid",market:{coin:t,interval:n},parameters:{},nodes:c,rules:{entryLong:e==="long"?"sig":null,entryShort:e==="short"?"sig":null,exitLong:null,exitShort:null},risk:{...r,expiresAt:o}}}function Nx({side:e,coin:t,interval:n,risk:r,expiresAt:o,id:i,name:s,spec:a}){let c=[{id:"oi",type:"input",field:"openInterest"},{id:"thr",type:"constant",value:a.threshold},{id:"sig",type:"compare",op:a.op==="above"?"gt":"lt",left:"oi",right:"thr"}];return{version:1,id:i,name:s,venue:"hyperliquid",market:{coin:t,interval:n},parameters:{},nodes:c,rules:{entryLong:e==="long"?"sig":null,entryShort:e==="short"?"sig":null,exitLong:null,exitShort:null},risk:{...r,expiresAt:o}}}function Px({side:e,coin:t,interval:n,risk:r,expiresAt:o,id:i,name:s,spec:a}){let u=[{id:"sig_input",type:"input",field:Rx[a.kind]},{id:"thr",type:"constant",value:a.threshold},{id:"sig",type:"compare",op:a.op==="above"?"gt":"lt",left:"sig_input",right:"thr"}];return{version:1,id:i,name:s,venue:"hyperliquid",market:{coin:t,interval:n},parameters:{},nodes:u,rules:{entryLong:e==="long"?"sig":null,entryShort:e==="short"?"sig":null,exitLong:null,exitShort:null},risk:{...r,expiresAt:o}}}function Jf(e,t={}){if(typeof e!="string")throw new Se("prompt must be a string");if(e.length>1e3)throw new Se("prompt length must be <= 1000");if(!px(t))throw new Se("options must be a plain object");if(!Number.isInteger(t.nowMs))throw new Se("options.nowMs is required integer epoch ms");let n=t.nowMs,r=dx;if("expiresInMs"in t){if(!Number.isInteger(t.expiresInMs))throw new Se("expiresInMs must be an integer");if(r=t.expiresInMs,r<ux||r>lx)throw new Se("expiresInMs must be between 1h and 30d")}if(ax.test(e))throw new Se(`prompt appears to contain secrets and is rejected. ${tr}`);let o=fx(e);if(!o)throw new Se(`empty prompt. ${tr}`);if(bx(o))throw new Se(`duplicate interval or risk clause. ${tr}`);let i=mx(o),s=hx(o),a=yx(o);if(!i||!s||!a)throw new Se(`could not parse side/coin/interval. ${tr}`);let c=gx(o);if(!(c.maxLeverage>0)||c.maxLeverage>50)throw new Se("leverage out of range");if(!(c.positionSizePct>0)||c.positionSizePct>100)throw new Se("position size out of range");let u=n+r,l=wx(o),d=`Draft ${s} ${i}`.slice(0,100),f=Ex(o),p=Sx(o),m=vx(o),y=Ax(o),h=xx(o),w=kx(o),A=Ix(o),_=[f,p,m,y,h,w,A].filter(Boolean);if(_.length!==1)throw new Se(`unsupported or ambiguous prompt. ${tr}`);if(!_x(o,_[0]))throw new Se(`unsupported or ambiguous prompt. ${tr}`);let S,k=_[0],x={side:i,coin:s,interval:a,risk:c,expiresAt:u,id:l,name:d,spec:k};k.kind==="ema_cross"?S=Ox(x):k.kind==="rsi"?S=Tx(x):k.kind==="open_interest"?S=Nx(x):k.kind==="funding"?S=Cx(x):S=Px(x);let E=dc(S,{nowMs:n});if(!E.ok)throw new Se(`draft failed validation: ${E.errors.map(g=>g.message).join("; ")}`);return hc(Ne(S,{nowMs:n}))}var Se,ix,sx,ax,tr,cx,ux,lx,dx,Rx,Qf=O(()=>{vn();Se=class extends Error{constructor(t){super(t),this.name="StrategyDraftError"}},ix=new Set(["1m","3m","5m","15m","30m","1h","2h","4h","8h","12h","1d"]),sx=new Set(["BTC","ETH","SOL","HYPE"]),ax=/\b(mnemonic|private\s*key|privkey|seed\s*phrase|seed\b|api[_-]?key|secret\s*key|wallet\s*key|passphrase)\b/i,tr="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.",cx=Object.freeze({maxLeverage:1,maxNotionalUsd:100,positionSizePct:5,stopLossPct:2,takeProfitPct:4,cooldownBars:1,maxDailyLossPct:3}),ux=36e5,lx=30*864e5,dx=864e5;Rx=Object.freeze({funding:"fundingRate",open_interest:"openInterest",premium:"premium",oi_delta:"oiDelta",book_imbalance:"bookImbalance"})});import{createHash as Lx}from"node:crypto";function tm(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 nm(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function gc(e){if(e==null||typeof e!="object"||Object.isFrozen(e))return e;if(Array.isArray(e)){for(let t of e)gc(t);return Object.freeze(e)}for(let t of Object.keys(e))gc(e[t]);return Object.freeze(e)}function no(e){if(Array.isArray(e))return e.map(no);if(e!=null&&typeof e=="object"){let t={};for(let n of Object.keys(e).sort())t[n]=no(e[n]);return t}return e}function qi(e){return JSON.stringify(no(e))}function $x(e){let{min:t,max:n,step:r}=e;if(!(r>0)||t>n)return[];let o=[],i=Math.floor((n-t)/r+1e-9);for(let a=0;a<=i;a++){let c=t+a*r;if(c>n+1e-9)break;let u=Math.abs(c-Math.round(c))<1e-9?Math.round(c):Number(c.toPrecision(12));u<t-1e-9||u>n+1e-9||o.push(u)}if(o.length===0)return[];let s=o[o.length-1];if(Math.abs(s-n)>1e-9){let a=(n-t)/r;Math.abs(a-Math.round(a))<=1e-9&&o.push(n)}return o}function qx(e,t){if(e.length===0)return[];let n=[{}];for(let r of e){let o=t[r],i=[];for(let s of n)for(let a of o)i.push({...s,[r]:a});n=i}return n.sort((r,o)=>{let i=qi(r),s=qi(o);return i<s?-1:i>s?1:0}),n}function yc(e,t,n,r,o){let i=0;if(e==="maxDrawdownPct"){if(i=t.maxDrawdownPct-r.maxDrawdownPct,i!==0)return i<0}else if(i=t[e]-r[e],i!==0)return i>0;let s=qi(n),a=qi(o);return s<a}function rm(e,t,n={}){if(!nm(n))throw new TypeError("options must be a plain object");for(let S of Object.keys(n))if(tm(S))throw new TypeError(`options must not include holdout/test/oos key "${S}"`);let r=new Set(["maxTrials","objective","backtestOptions"]);for(let S of Object.keys(n))if(!r.has(S))throw new TypeError(`unknown option "${S}"`);let o=64;if("maxTrials"in n){let S=n.maxTrials;if(!Number.isInteger(S)||S<1||S>Zf)throw new TypeError(`maxTrials must be an integer 1..${Zf}`);o=S}let i=n.objective??"netPnlUsd";if(!em.has(i))throw new TypeError(`objective must be one of ${[...em].join("|")}`);let s=n.backtestOptions??{};if(!nm(s))throw new TypeError("backtestOptions must be a plain object");for(let S of Object.keys(s))if(tm(S))throw new TypeError(`backtestOptions must not include holdout/test/oos key "${S}"`);let a=Ne(e),c=Object.keys(a.parameters).sort();if(c.length===0)throw new Error("optimizeStrategy requires at least one declared parameter");let u={},l=1;for(let S of c){let k=$x(a.parameters[S]);if(k.length===0)throw new Error(`parameter "${S}" produces an empty grid`);u[S]=k,l*=k.length}let d=qx(c,u);if(d.length===0)throw new Error("parameter grid is empty");let f=d.slice(0,o),p=[],m=null,y=null;for(let S of f){let k=Zr(a,S),x=en(k,t,s);y==null&&(y=x.config);let E={netPnlUsd:x.metrics.netPnlUsd,netPnlPct:x.metrics.netPnlPct,maxDrawdownPct:x.metrics.maxDrawdownPct,winRate:x.metrics.winRate,profitFactor:x.metrics.profitFactor,tradeCount:x.metrics.tradeCount,sharpe:x.metrics.sharpe,turnoverUsd:x.metrics.turnoverUsd},g={parameters:{...S},metrics:E};p.push(g),(!m||yc(i,E,S,m.metrics,m.parameters))&&(m=g)}p.sort((S,k)=>yc(i,S.metrics,S.parameters,k.metrics,k.parameters)?-1:yc(i,k.metrics,k.parameters,S.metrics,S.parameters)?1:0);let h={...m.parameters},w=Zr(a,h),A={strategyHash:Xn(a),compilerHash:An,trainBarsHash:Yr(t),backtestConfig:y,objective:i,maxTrials:o,trialsRun:p.length,candidates:p,bestParameters:h,bestStrategy:w},_={id:Lx("sha256").update(JSON.stringify(no(A)),"utf8").digest("hex"),...A};return gc(no(JSON.parse(JSON.stringify(_))))}var Zf,em,om=O(()=>{xn();vn();Ni();Zf=256,em=new Set(["netPnlUsd","profitFactor","sharpe","maxDrawdownPct"])});import Ut from"node:fs";import Bi from"node:path";function Ui(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function At(e){return e==null?e:JSON.parse(JSON.stringify(e))}function Ux(e){return String(e).toLowerCase().replace(/[^a-z0-9]/g,"")}function nr(e,t="record"){if(Array.isArray(e)){e.forEach((n,r)=>nr(n,`${t}[${r}]`));return}if(Ui(e))for(let[n,r]of Object.entries(e)){let o=Ux(n);if(Bx.some(i=>o.includes(i)))throw new Error(`shadow-store: forbidden secret-like field at ${t}.${n}`);nr(r,`${t}.${n}`)}}function Mx(e){if(typeof e!="string"||!e||!Bi.isAbsolute(e))throw new Error("shadow-store: path must be an absolute path")}function im(e){let t;try{t=Ut.lstatSync(e)}catch(r){if(r&&r.code==="ENOENT")return;throw r}if(t.isSymbolicLink())throw new Error("shadow-store: store path must not be a symlink");if(!t.isFile())throw new Error("shadow-store: store path must be a regular file");if(t.mode&511&18)throw new Error("shadow-store: store file must not be group or world writable")}function Dx(){return{version:wc,runners:[]}}function sm(e,t){let n;try{n=JSON.parse(e)}catch{throw new Error("shadow-store: malformed JSON")}if(!Ui(n))throw new Error("shadow-store: malformed JSON root");if(n.version!==wc)throw new Error(`shadow-store: unsupported version ${n.version}`);if(!Array.isArray(n.runners))throw new Error("shadow-store: runners must be an array");return nr(n,Bi.basename(t)),{version:wc,runners:n.runners.map(r=>At(r))}}function am(e,t){nr(t,"store");let n=Bi.dirname(e);Ut.mkdirSync(n,{recursive:!0,mode:448});let r=Bi.join(n,`.shadow-store.${process.pid}.${Date.now()}.tmp`),o=`${JSON.stringify(t)}
8
+ `;try{Ut.writeFileSync(r,o,{mode:384,flag:"wx"}),Ut.renameSync(r,e);try{Ut.chmodSync(e,384)}catch{}}catch(i){try{Ut.unlinkSync(r)}catch{}throw i}}function cm(e={}){let t=e.path;if(Mx(t),im(t),Ut.existsSync(t)?sm(Ut.readFileSync(t,"utf8"),t):am(t,Dx()),bc.has(t))return bc.get(t);let n=!1,r=[];function o(){if(n)return;let m=r.shift();if(m){n=!0;try{let y=m.fn();n=!1,m.resolve(y),o()}catch(y){n=!1,m.reject(y),o()}}}function i(m){if(!n&&r.length===0){n=!0;try{return m()}finally{n=!1,queueMicrotask(o)}}return new Promise((y,h)=>{r.push({fn:m,resolve:y,reject:h}),queueMicrotask(o)})}function s(){return im(t),sm(Ut.readFileSync(t,"utf8"),t)}function a(m){am(t,m)}function c(m){if(!Ui(m)||typeof m.id!="string"||!m.id)throw new Error("shadow-store: create requires record with string id");nr(m,"record");let y=s();if(y.runners.some(w=>w.id===m.id))throw new Error(`shadow-store: runner id already exists: ${m.id}`);let h=At(m);return y.runners.push(h),a(y),At(h)}function u(m){let y=s().runners.find(h=>h.id===m);return y?At(y):null}function l(){return s().runners.map(m=>At(m))}function d(m,y){if(typeof y!="function")throw new Error("shadow-store: updater must be a function");let h=s(),w=h.runners.findIndex(S=>S.id===m);if(w<0)throw new Error(`shadow-store: runner not found: ${m}`);let A=At(h.runners[w]),_=y(A);if(!Ui(_)||_.id!==m)throw new Error("shadow-store: updater must return record with same id");return nr(_,"record"),h.runners[w]=At(_),a(h),At(h.runners[w])}function f(m){let y=s(),h=y.runners.findIndex(A=>A.id===m);if(h<0)throw new Error(`shadow-store: runner not found: ${m}`);let w=At(y.runners[h]);return w.status!=="stopped"&&(w.status="stopped",y.runners[h]=w,a(y)),At(y.runners[h])}let p={create(m){return i(()=>c(m))},get(m){return u(m)},list(){return l()},update(m,y){return i(()=>d(m,y))},stop(m){return i(()=>f(m))}};return bc.set(t,p),p}var wc,Bx,bc,um=O(()=>{wc=1,Bx=["privatekey","secretkey","seed","mnemonic","passphrase","password","keystore","keymaterial","apikey","authtoken","accesstoken","refreshtoken","credential","bearer","signature","authorization","xprv","xpriv","wif"];bc=new Map});import{createHash as vc}from"node:crypto";function Ec(e){return e==null?e:JSON.parse(JSON.stringify(e))}function Sc(e){return Array.isArray(e)?e.map(Sc):e&&typeof e=="object"?Object.fromEntries(Object.keys(e).sort().map(t=>[t,Sc(e[t])])):e}function dm(e){if(!e||typeof e!="object"||Array.isArray(e))throw new TypeError("shadow-runner: record must be an object");return vc("sha256").update(JSON.stringify(Sc(e))).digest("hex")}function Fx(e,t,n,r,o){return vc("sha256").update(`${e}|${t}|${n}|${r}|${o}`).digest("hex")}function jx(e,t,n,r){return vc("sha256").update(`shadow|${e}|${t}|${n}|${r??""}`).digest("hex")}function Hx(e){return e==="entryLong"||e==="exitShort"?"buy":e==="entryShort"||e==="exitLong"?"sell":e}function lm(e){return e==="entryLong"||e==="entryShort"}function Ac({storePath:e,clock:t=Date.now}={}){if(typeof e!="string"||!e)throw new Error("shadow-runner: storePath required");let n=cm({path:e});function r({strategy:c,evidenceId:u=null}={}){let l=Re(c),d=u==null?null:String(u),f=n.list().filter(w=>w.status==="running"&&w.strategyHash===l.strategyHash&&w.compilerHash===l.compilerHash&&w.evidenceId===d).sort((w,A)=>w.createdAt-A.createdAt||w.id.localeCompare(A.id))[0];if(f)return Ec(f);let p=t(),m=jx(p,l.strategyHash,l.compilerHash,d),y=n.get(m);if(y)return Ec(y);let h={id:m,strategy:Ec(l.strategy),strategyHash:l.strategyHash,compilerHash:l.compilerHash,evidenceId:d,status:"running",cursor:null,intendedOrders:[],fills:[],missedFills:[],markouts:[],createdAt:p,updatedAt:p,position:null,cooldownBarsRemaining:0,cooldownStartT:null,lastProcessedBarIndex:-1};return n.create(h)}function o(c){return n.get(c)}function i(){return n.list()}function s(c){return n.stop(c)}function a(c,u,{markoutHorizons:l=[1,4,12]}={}){if(!Array.isArray(u))throw new TypeError("shadow-runner: bars must be an array");return n.update(c,d=>{if(d.status!=="running")throw new Error("shadow-runner: runner is stopped");if(u.length===0)return d;let p=Re(d.strategy).evaluateAll(u),m=new Map;for(let I=0;I<u.length;I++)m.set(u[I].t,I);let y=d.cursor,h=[];for(let I=0;I<u.length;I++){let L=u[I].t;(y==null||L>y)&&h.push(I)}if(h.length===0)return d;let w=new Map(d.intendedOrders.map(I=>[I.id,I])),A=new Set(d.fills.map(I=>I.orderId)),_=new Map(d.missedFills.map(I=>[I.orderId,I])),S=(I,L)=>`${I}|${L}`,k=new Map(d.markouts.map(I=>[S(I.orderId,I.horizon),I])),x=d.position?{...d.position}:null,E=Number.isInteger(d.cooldownBarsRemaining)?Math.max(0,d.cooldownBarsRemaining):0,g=Number.isFinite(d.cooldownStartT)?d.cooldownStartT:null;function b({action:I,signalBarT:L,signalIndex:q}){let H=Hx(I),$=Fx(d.id,d.strategyHash,L,H,I);if(w.has($))return w.get($);let D=q+1,M=D<u.length,Q={id:$,action:I,type:I,side:H,signalBarT:L,fillBarT:M?u[D].t:null,status:M?"open":"missed"};return w.set($,Q),d.intendedOrders.push(Q),Q}function v(I,L,q){if(A.has(I.id))return;let H={orderId:I.id,action:lm(I.action)?"entry":"exit",side:I.side,price:L.o,barT:L.t,signalBarT:I.signalBarT,barIndex:q};if(d.fills.push(H),A.add(I.id),I.status="filled",I.fillBarT=L.t,_.has(I.id)&&(_.delete(I.id),d.missedFills=d.missedFills.filter($=>$.orderId!==I.id)),lm(I.action)){x={side:I.action==="entryLong"?"long":"short",entryOrderId:I.id,entryBarT:L.t,entryPrice:L.o,entryBarIndex:q};for(let $ of l){let D=S(I.id,$);if(k.has(D))continue;let M={orderId:I.id,horizon:$,entryBarT:L.t,entryPrice:L.o,side:x.side,status:"pending",close:null,barT:null};k.set(D,M),d.markouts.push(M)}}else x=null,E=Number(d.strategy?.risk?.cooldownBars)||0,g=L.t}function P(I){if(A.has(I.id)||_.has(I.id))return;let L={orderId:I.id,action:I.action,side:I.side,signalBarT:I.signalBarT,status:"missed"};_.set(I.id,L),d.missedFills.push(L),I.status="missed"}for(let I of d.intendedOrders){if(I.status==="filled"||A.has(I.id))continue;let L=m.get(I.signalBarT);if(L==null)continue;let q=L+1;q<u.length&&(y==null||u[q].t>y)&&v(I,u[q],q)}for(let I of h){let L=u[I],q=p[I].signals,H=x,$=M=>{if(x||E>0&&(g==null||L.t>=g))return;let Y=b({action:M,signalBarT:L.t,signalIndex:I}),Ue=I+1;Ue<u.length?v(Y,u[Ue],Ue):P(Y)},D=M=>{if(!x||x.side==="long"&&M!=="exitLong"||x.side==="short"&&M!=="exitShort")return;let Q=b({action:M,signalBarT:L.t,signalIndex:I}),Y=I+1;Y<u.length?v(Q,u[Y],Y):P(Q)};H?(q.exitLong&&D("exitLong"),q.exitShort&&D("exitShort")):q.entryLong&&q.entryShort||(q.entryLong&&$("entryLong"),q.entryShort&&$("entryShort")),E>0&&g!=null&&L.t>=g&&(E-=1,E===0&&(g=null)),d.cursor=L.t,d.lastProcessedBarIndex=I}for(let I of d.markouts){if(I.status!=="pending")continue;let L=d.fills.find($=>$.orderId===I.orderId&&$.action==="entry");if(!L)continue;let q=m.get(L.barT);if(q==null)continue;let H=q+I.horizon;if(H<u.length){I.close=u[H].c,I.barT=u[H].t,I.status="filled";let $=I.entryPrice;I.markout=I.side==="long"?(I.close-$)/$:($-I.close)/$}}return d.position=x,d.cooldownBarsRemaining=E,d.cooldownStartT=g,d.updatedAt=t(),d})}return{start:r,step:a,list:i,get:o,stop:s}}var pm=O(()=>{xn();um()});var hm={};z(hm,{runStrategyOperation:()=>Jx});import zx from"node:os";import Vx from"node:path";function ro(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function Gx(e){return String(e).toLowerCase().replace(/[^a-z0-9]/g,"")}function kc(e){if(Array.isArray(e)){for(let t of e)kc(t);return}if(ro(e))for(let[t,n]of Object.entries(e)){if(Wx.some(r=>Gx(t).includes(r)))throw new Error(`strategy service: secret-like field "${t}" is forbidden`);kc(n)}}function Kx(e){if(!ro(e))throw new TypeError("strategy input must be a plain object");return kc(e),e}function Yx(e,t={}){if(t.nowMs!==void 0){if(!Number.isInteger(t.nowMs))throw new TypeError("nowMs must be an integer epoch milliseconds");return t.nowMs}let n=Date.now();if(e.nowMs===void 0||e.nowMs===null)return n;if(!Number.isInteger(e.nowMs))throw new TypeError("nowMs must be an integer epoch milliseconds");if(Math.abs(e.nowMs-n)>12e4)throw new Error("nowMs outside allowed wall-clock skew (120s); omit nowMs to use server time");return e.nowMs}async function xc(e,t,n,r){if(Array.isArray(t.bars))return t.bars;let o=rc(e.venue),i=n.fetchBars??o.fetchBars;if(typeof i!="function")throw new Error(`strategy venue ${o.id} does not support history`);n.signal?.throwIfAborted?.();let s=await i({coin:e.market.coin,interval:e.market.interval,count:t.count??1500,endTime:t.endTime??r},{signal:n.signal});n.signal?.throwIfAborted?.();let a=Array.isArray(s)?s:s?.bars;if(!Array.isArray(a))throw new Error("strategy history provider returned no bars");return a}function Ic(e,t){let n=e.backtestOptions??{};if(!ro(n))throw new TypeError("backtestOptions must be a plain object");return{...n,nowMs:t}}function fm(e,t,n,r,o={}){let i=e.evidenceOptions??{};if(!ro(i))throw new TypeError("evidenceOptions must be a plain object");return{...i,...o,strategy:t,bars:n,backtestOptions:Ic(e,r)}}function mm(){return Vx.join(zx.homedir(),".oracle","strategy-shadow.json")}function Xx(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 Jx(e,t={},n={}){n.signal?.throwIfAborted?.();let r=Kx(t),o=Yx(r,n);if(e==="draft")return{strategy:Jf(r.prompt,{nowMs:o})};if(e==="validate"){let i=Re(r.strategy);if(i.strategy.risk.expiresAt<=o)throw new Error("strategy is expired");return{valid:!0,strategy:i.strategy,strategyHash:i.strategyHash,compilerHash:i.compilerHash,compilerVersion:i.compilerVersion,requiredSeries:i.requiredSeries}}if(e==="backtest"||e==="evidence"){let i=Re(r.strategy),s=await xc(i.strategy,r,n,o);to(i,s);let a=Qa(fm(r,i.strategy,s,o));return e==="evidence"?a:{backtest:en(i.strategy,s,Ic(r,o)),evidence:a}}if(e==="optimize"){let i=Re(r.strategy),s=await xc(i.strategy,r,n,o);to(i,s);let a=r.trainFraction,c=r.evidenceOptions?.trainFraction;if(a!=null&&c!=null&&a!==c)throw new TypeError("conflicting trainFraction controls are forbidden");let u=a??c??.7;if(typeof u!="number"||u<=0||u>=1)throw new TypeError("trainFraction must be in (0,1)");let l=s.slice(0,Math.floor(s.length*u)),d=r.options??{};if(!ro(d))throw new TypeError("options must be a plain object");let f=rm(i.strategy,l,{...d,...r.maxTrials==null?{}:{maxTrials:r.maxTrials},backtestOptions:Ic(r,o)}),p=f.bestStrategy;return{strategy:p,optimization:f,evidence:Qa(fm(r,p,s,o,{trainFraction:u}))}}if(e==="shadow"){let i=Ac({storePath:n.storePath??mm(),clock:()=>o}),s=r.action;if(s==="start")return await i.start({strategy:r.strategy,evidenceId:r.evidenceId??r.evidence?.id??null});if(s==="list")return await i.list();if(s==="get")return await i.get(r.id);if(s==="stop")return await i.stop(r.id);if(s==="step"){let a=await i.get(r.id);if(!a)throw new Error(`shadow runner not found: ${r.id}`);let c=await xc(a.strategy,r,n,o);return to(Re(a.strategy),c),await i.step(r.id,c,r.stepOptions??{})}throw new Error(`unknown shadow action: ${s}`)}if(e==="prepare"){let i=Re(r.strategy),s=rc(i.strategy.venue);if(typeof r.shadowId!="string"||!r.shadowId)throw new Error("strategy prepare requires a matching shadow runner id");let c=await Ac({storePath:n.storePath??mm(),clock:()=>o}).get(r.shadowId);if(!c)throw new Error("strategy prepare shadow runner not found");if(c.status!=="running")throw new Error("strategy prepare requires an active shadow runner");if(!Number.isFinite(c.cursor))throw new Error("strategy prepare requires a stepped shadow runner");if(c.strategyHash!==i.strategyHash||c.compilerHash!==i.compilerHash)throw new Error("strategy prepare shadow runner does not match strategy artifacts");if(c.evidenceId!==r.evidence?.id)throw new Error("strategy prepare shadow runner does not match evidence artifact");let u=r.caps??Xx(i.strategy,o);return s.prepareIntent({strategy:i.strategy,evidence:r.evidence,shadow:{id:c.id,stateHash:dm(c),status:c.status,cursor:c.cursor,updatedAt:c.updatedAt},caps:u,nowMs:o,env:n.env??process.env})}throw new Error(`unknown strategy operation: ${e}`)}var Wx,ym=O(()=>{Ni();xn();Za();Qf();om();pm();oc();Wx=["privatekey","secretkey","seed","mnemonic","passphrase","password","keystore","keymaterial","apikey","authtoken","accesstoken","refreshtoken","credential","bearer","signature","authorization","xprv","xpriv","wif"]});var Tm={};z(Tm,{DEFAULT_CROSS_CHAIN_SOURCES:()=>Am,DEFAULT_SAME_CHAIN_SOURCES:()=>vm,NATIVE_TOKEN:()=>_c,canonicalJson:()=>km,hashFirmQuote:()=>Om,hashRfqIntent:()=>_m,normalizeFirmQuote:()=>Tc,normalizeRfqIntent:()=>rk,sha256Hex:()=>oo});import{createHash as Qx}from"node:crypto";import{getAddress as Sm,isAddress as Oc}from"ethers";function ae(e,t="invalid"){throw new Error(`rfq: ${e} ${t}`)}function bm(e,t){let n=Number(e);return(!Number.isSafeInteger(n)||n<=0)&&ae(t,"must be a positive chainId"),n}function Mi(e,t){let n=String(e??"").trim();return(!Zx.test(n)||BigInt(n)<=0n)&&ae(t,"must be a positive integer string"),n}function ek(e,t){return e==null||e===""?null:Mi(e,t)}function wm(e,t){let n=String(e??"").trim();return n.toLowerCase()===_c.toLowerCase()?_c:(Oc(n)||ae(t,"must be an EVM address or native token sentinel"),Sm(n))}function xm(e,t){let n=String(e??"").trim();return Oc(n)||ae(t,"must be an EVM address"),Sm(n)}function tk(e,t){return e==null||e===""?null:xm(e,t)}function Em(e,t,n){return e===void 0?[...n]:(Array.isArray(e)||ae(t,"must be an array"),e.map(r=>String(r).trim()).filter(Boolean))}function nk(e,{nowMs:t,maxDeadlineMs:n},r){let o=Number(e);return Number.isFinite(o)||ae(r,"must be a finite millisecond timestamp"),o<=t&&ae(r,"expired"),o>t+n&&ae(r,"exceeds maxDeadlineMs"),Math.floor(o)}function rr(e){if(Array.isArray(e))return e.map(rr);if(e&&typeof e=="object"){let t={};for(let n of Object.keys(e).sort())e[n]!==void 0&&(t[n]=rr(e[n]));return t}return e}function km(e){return JSON.stringify(rr(e))}function oo(e){return`0x${Qx("sha256").update(km(e)).digest("hex")}`}function Im(e,t){let n={...e};for(let r of t)delete n[r];return n}function _m(e){return oo(Im(e,["intentHash"]))}function Om(e){return oo(Im(e,["firmQuoteHash"]))}function rk(e={},t={}){let n=Number(t.nowMs??Date.now()),r=Number(t.maxDeadlineMs??1800*1e3);(!Number.isFinite(n)||!Number.isFinite(r)||r<=0)&&ae("time","is invalid");let o=bm(e.fromChainId??e.fromChain,"fromChainId"),i=bm(e.toChainId??e.toChain,"toChainId"),a=o===i?vm:Am,c={kind:"rfq-intent",version:1,fromChainId:o,toChainId:i,sellToken:wm(e.sellToken??e.tokenIn??e.fromToken,"sellToken"),buyToken:wm(e.buyToken??e.tokenOut??e.toToken,"buyToken"),sellAmount:Mi(e.sellAmount??e.amountIn??e.fromAmount,"sellAmount"),receiver:xm(e.receiver??e.recipient??e.to,"receiver"),deadlineMs:nk(e.deadlineMs??e.deadline??e.expiresAtMs,{nowMs:n,maxDeadlineMs:r},"deadline"),minBuyAmount:ek(e.minBuyAmount??e.minOut??e.amountOutMin,"minBuyAmount"),allowedSources:Em(e.allowedSources,"allowedSources",a),allowedRouters:Em(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)?rr(e.metadata):{}};return c.slippageBps!=null&&(!Number.isInteger(c.slippageBps)||c.slippageBps<0||c.slippageBps>1e4)&&ae("slippageBps","must be 0 to 10000"),c.intentId=e.intentId?String(e.intentId):oo({seed:"rfq-intent",intent:c}).slice(0,34),c.intentHash=_m(c),Object.freeze(c)}function ok(e){return(!e||typeof e!="object"||Array.isArray(e))&&ae("artifact","required"),e.typedDataHash!=null&&!gm.test(String(e.typedDataHash))&&ae("artifact.typedDataHash","must be bytes32"),e.calldataHash!=null&&!gm.test(String(e.calldataHash))&&ae("artifact.calldataHash","must be bytes32"),e.to!=null&&!Oc(String(e.to))&&ae("artifact.to","must be an address"),e.data!=null&&!/^0x(?:[0-9a-fA-F]{2})*$/.test(String(e.data))&&ae("artifact.data","must be hex"),rr(e)}function Tc(e,t={},n={}){(!e||e.kind!=="rfq-intent")&&ae("intent","required");let r=Number(n.nowMs??Date.now()),o=Number(t.expiryMs??t.expiresAtMs??t.validUntilMs);Number.isFinite(o)||ae("quote expiry","required"),o<=r&&ae("quote","expired"),o>e.deadlineMs&&ae("quote expiry","exceeds intent deadline");let i=String(t.source??t.provider??"").trim();i||ae("source","required"),e.allowedSources.includes(i)||ae("source","not allowed by intent");let s=Mi(t.amountOut??t.buyAmount,"amountOut"),a=Mi(t.minBuyAmount??t.minOut??s,"minBuyAmount");BigInt(a)>BigInt(s)&&ae("minBuyAmount","exceeds amountOut");let c=ok(t.artifact??t.executableArtifact??t.transaction??t.typedData),u=Number(t.quotedAtMs??t.timestampMs??n.nowMs??Date.now());Number.isFinite(u)||ae("quotedAtMs","must be finite");let l=tk(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)?rr(t.metadata):{}};return d.quoteId||(d.quoteId=oo({seed:"rfq-quote",out:d}).slice(0,34)),d.firmQuoteHash=Om(d),Object.freeze(d)}var _c,vm,Am,gm,Zx,Cc=O(()=>{_c="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",vm=Object.freeze(["lifi","paraswap","0x","cow","uniswap-v3"]),Am=Object.freeze(["lifi"]),gm=/^0x[0-9a-fA-F]{64}$/,Zx=/^\d+$/});var Lm={};z(Lm,{executeRfqCandidates:()=>Rm,rankRfqQuotes:()=>Pm,requestRfqQuotes:()=>ak,sourceCandidates:()=>Nm});function io(e,t){return Array.isArray(e?.allowedSources)&&e.allowedSources.includes(t)}function Cm(e,t){return String(e?.[t]??"").trim()}function so(e,t){return Object.freeze({source:e,run:t})}function Nm(e,t={}){if(!e||e.kind!=="rfq-intent")throw new Error("rfq: intent required");let n=t.env??process.env,r=t.providers??{},o=t.supportedUniV3Chains??ke,i=Number(e.fromChainId)===Number(e.toChainId),s=[];return io(e,"lifi")&&s.push(so("lifi",async()=>{let c=await(r.lifiQuote??yn)({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 ik(t,c.transactionRequest.data):void 0,route:c},metadata:{tool:c?.tool??c?.toolDetails?.name??null}}})),i&&(io(e,"paraswap")&&s.push(so("paraswap",async()=>{let c=await(r.paraswapPrice??Mn)({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}}})),io(e,"0x")&&(Cm(n,"ZEROX_API_KEY")||Cm(n,"0X_API_KEY")||r.zeroxQuote)&&s.push(so("0x",async()=>{let c=await(r.zeroxQuote??Dn)({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}}})),io(e,"cow")&&s.push(so("cow",async()=>{let c=await(r.cowQuote??gn)({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}}})),io(e,"uniswap-v3")&&o[Number(e.fromChainId)]&&s.push(so("uniswap-v3",async()=>{let c=await(r.uniV3QuoteExactIn??hn)({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 ik(e,t){return`0x${(await import("node:crypto")).createHash("sha256").update(String(t)).digest("hex")}`}async function sk(e,t){return Promise.race([Promise.resolve().then(e.run),new Promise((n,r)=>setTimeout(()=>r(new Error(`${e.source}: timeout`)),t))])}async function Rm(e,t,n={}){let r=Number(n.timeoutMs??12e3),o=await Promise.allSettled(t.map(a=>sk(a,r))),i=[],s=[];for(let a=0;a<o.length;a++){let c=t[a],u=o[a];if(u.status==="rejected"){s.push({source:c.source,error:String(u.reason?.message||u.reason)});continue}try{i.push(Tc(e,{...u.value,source:c.source},n))}catch(l){s.push({source:c.source,error:String(l?.message||l)})}}return{quotes:i,failed:s}}function Pm(e=[],t={}){let n=Number(t.nowMs??Date.now()),r=e.filter(s=>Number(s.expiryMs??0)>n);r.sort((s,a)=>{let c=BigInt(a.minBuyAmount??0)-BigInt(s.minBuyAmount??0);if(c!==0n)return c>0n?1:-1;let u=BigInt(a.amountOut??0)-BigInt(s.amountOut??0);return u>0n?1:u<0n?-1:0});let o=r.map(s=>({...s,scoreBasis:"minBuyAmount"})),i=[];return o.length||i.push("no RFQ source returned a usable firm quote"),e.length!==o.length&&i.push("expired RFQ quotes were excluded from ranking"),{best:o[0]??null,quotes:o,failed:[],warnings:i}}async function ak(e,t={}){let n=Nm(e,t),{quotes:r,failed:o}=await Rm(e,n,t),i=Pm(r,t);return{kind:"rfq-result",intent:e,best:i.best,quotes:i.quotes,failed:o,warnings:[...i.warnings],sourcesTried:n.length,sourcesAnswered:r.length}}var $m=O(()=>{Ur();ii();ci();mi();Rr();Cc()});var qm={};z(qm,{prepareBestBridgeRoute:()=>pk,supportedBridgePreparers:()=>dk});function dk(){return Object.keys(Di)}async function pk(e,t={}){let{taker:n,fromChainId:r,toChainId:o}=e;if(!n)throw new Error("prepareBestBridgeRoute requires taker: bridge transactions are built FOR an address, and the quote-only placeholder must never end up in one");if(!ck.test(n))throw new Error(`taker must be a valid 20-byte address, got "${n}"`);if(uk.has(n.toLowerCase()))throw new Error(`taker "${n}" is a placeholder/burn address. Bridging to it would send funds to an address nobody controls, on a chain where you cannot undo it.`);let i=await jr(e,t);if(!i.best)return{ok:!1,reason:"no source returned a usable bridge route",comparison:i};let s=e.source||i.best.source,a=i.routes.find(h=>h.source===s);if(!a)return{ok:!1,reason:`source "${s}" returned no usable route`,comparison:i};let c=Di[s];if(!c){let h=i.routes.find(w=>Di[w.source]&&w.source!==s);return{ok:!1,reason:`${s} won the comparison but has no bridge prepare path in this build. `+(h?`Next preparable route is ${h.source}; pass source:"${h.source}".`:"No route in this comparison can be prepared."),failureKind:"no-prepare-path",...h?{alternative:h.source}:{},winner:s,comparison:i}}let u;try{u=await c(e,t)}catch(h){let w=typeof h?.body=="string"?h.body:h?.body?JSON.stringify(h.body):"",A=[String(h?.message||h),w].filter(Boolean).join(" :: "),_=/allowance/i.test(A),S=!_&&/not enough|insufficient|balance/i.test(A),k=i.routes.find(x=>Di[x.source]&&x.source!==s);return{ok:!1,reason:_?`${s} will not build calldata until the token approval exists on-chain. Approve first, then prepare again. Underlying: ${A}`:S?`${s} refused to build: ${A}. Quoting works for any address; preparing needs the real funded wallet on chain ${r}.`:`${s} bridge prepare failed: ${A}`,failureKind:_?"approval-required-first":S?"taker-not-funded":"provider-error",...k?{alternative:k.source}:{},comparison:i}}let l=u.transactions||[];if(!l.length)return{ok:!1,reason:`${s} returned no executable transaction for this route`,failureKind:"provider-error",comparison:i};let d=l.filter(h=>h.chainId!=null&&Number(h.chainId)!==Number(r));if(d.length)return{ok:!1,reason:`${s} returned a transaction for chain ${d[0].chainId} but the origin chain is ${r}. Refusing to hand over a mismatched artifact.`,failureKind:"chain-mismatch",comparison:i};let f=e.driftToleranceBps??lk,p=null,m=null;if(u.amountOut!=null&&a.grossOut!=null)try{let h=BigInt(a.grossOut),w=BigInt(u.amountOut);h>0n&&(p=Number((w-h)*10000n/h),p<-f&&(m=`route moved ${(p/100).toFixed(2)}% against you since the comparison (tolerance ${(f/100).toFixed(2)}%). Re-compare before signing.`))}catch{}let y=[...m?[m]:[],...i.warnings||[],`Bridging is NOT atomic: the origin transaction succeeding does not mean funds arrived on chain ${o}. Expect ~${u.durationSeconds!=null?`${u.durationSeconds}s`:"minutes"} before the destination credits, and do not re-send if it is pending.`];return l.length>1&&y.push(`This route needs ${l.length} transactions signed IN ORDER. Signing only the first leaves funds approved but not bridged.`),ne({ok:!0,chosen:{source:s,wasWinner:s===i.best.source,netOut:a.netOut,grossOut:a.grossOut,gasUsd:a.gasUsd},artifactKind:"unsigned-transaction-sequence",fromChainId:Number(r),toChainId:Number(o),transactionCount:l.length,transactions:l,requiresApproval:u.requiresApproval??null,minOut:u.minOut??null,durationSeconds:u.durationSeconds??null,destination:l[0]?.to??null,unsigned:!0,signedBy:"user-wallet",driftBps:p,warnings:y,runnersUp:i.routes.filter(h=>h.source!==s).map(h=>({source:h.source,netOut:h.netOut,gasUsd:h.gasUsd})),comparison:{rankedOn:i.rankedOn,sourcesAnswered:i.sourcesAnswered,sourcesTried:i.sourcesTried,improvementBps:i.improvementBps},note:`UNSIGNED. ${l.length} transaction(s) on chain ${r}, crediting chain ${o}. Verify every destination address before signing.`},{provider:"router",kind:"best-bridge"})}var ck,uk,lk,Di,Bm=O(()=>{Vn();xe();ck=/^0x[0-9a-fA-F]{40}$/,uk=new Set(["0x0000000000000000000000000000000000000000","0x000000000000000000000000000000000000dead","0x0000000000000000000000000000000000000001","0x00000000000000000000000000000000000a1ce5"].map(e=>e.toLowerCase())),lk=100,Di={relay:async({fromChainId:e,toChainId:t,tokenIn:n,tokenOut:r,amountIn:o,taker:i},s)=>{let{relayPrepare:a}=await Promise.resolve().then(()=>(gi(),yi)),c=await a({user:i,originChainId:e,destinationChainId:t,originCurrency:n,destinationCurrency:r,amount:String(o)},s);return{transactions:c.transactions||[],amountOut:c.quote?.details?.currencyOut?.amount??null,minOut:c.quote?.details?.currencyOut?.minimumAmount??null,durationSeconds:c.quote?.details?.timeEstimate??null}},lifi:async({fromChainId:e,toChainId:t,tokenIn:n,tokenOut:r,amountIn:o,taker:i,isHolder:s},a)=>{let{lifiPrepare:c}=await Promise.resolve().then(()=>(Ur(),Aa)),u=await c({fromChain:e,toChain:t,fromToken:n,toToken:r,fromAmount:o,fromAddress:i,isHolder:s,feeAction:"bridge"},a);return{transactions:u.transaction?[u.transaction]:[],requiresApproval:u.requiresApproval??null,amountOut:u.quote?.estimate?.toAmount??null,minOut:u.quote?.estimate?.toAmountMin??null,durationSeconds:u.quote?.estimate?.executionDuration??null}}}});var Dm={};z(Dm,{buildTwapSchedule:()=>Mm,normalizeTwapParams:()=>Um,prepareTwapChunk:()=>bk,simulateTwap:()=>wk});function Um(e={}){let t=Math.max(fk,Math.min(mk,Number(e.splits)||yk)),n=Math.max(.1,Number(e.windowHours)||gk),r=Math.max(hk,n*3600),o=BigInt(e.amount)/BigInt(t),i=Math.floor(r/t),s=Number(e.slippageBps)||100;if(!e.chainId)throw new Error("twap requires chainId");if(!e.tokenIn||!e.tokenOut)throw new Error("twap requires tokenIn and tokenOut");if(!e.taker)throw new Error("twap requires taker address");if(BigInt(e.amount)<=0n)throw new Error("twap amount must be positive");return{chainId:Number(e.chainId),tokenIn:String(e.tokenIn),tokenOut:String(e.tokenOut),amount:String(e.amount),splits:t,chunkSize:String(o),windowHours:n,windowSec:r,intervalSec:i,taker:String(e.taker),slippageBps:s,status:"planned",createdAt:new Date().toISOString()}}function Mm(e){let t=Um(e),n=Math.floor(Date.now()/1e3),r=[];for(let o=0;o<t.splits;o++)r.push({splitIndex:o+1,executeAfter:new Date((n+o*t.intervalSec)*1e3).toISOString(),chunkSize:t.chunkSize});return{params:t,schedule:r}}async function bk(e,t,{chainId:n,tokenIn:r,tokenOut:o,chunkSize:i,taker:s,slippageBps:a}=e.params){if(t<1||t>e.params.splits)throw new Error(`splitIndex ${t} out of range 1-${e.params.splits}`);let c=await zn({chainId:n,tokenIn:r,tokenOut:o,amountIn:i,taker:s}),u=ne(c.transaction??c.tx,{chainId:n,taker:s,tokenIn:r,tokenOut:o,amountIn:i,slippageBps:a,kind:"twap",splitIndex:t,totalSplits:e.params.splits});return{splitIndex:t,chunkSize:i,quote:{amountOut:c.amountOut??c.quote?.amountOut,source:c.source??c.venue,priceImpact:c.priceImpact},...u}}async function wk(e,{quoteFn:t=zn,...n}={}){let r=Mm(e),o=[],i=0n,s="unknown";for(let c=0;c<r.params.splits;c++)try{let u=await t({chainId:r.params.chainId,tokenIn:r.params.tokenIn,tokenOut:r.params.tokenOut,amountIn:r.params.chunkSize,taker:r.params.taker},n),l=BigInt(u.amountOut??u.quote?.amountOut??"0");i+=l,s=u.source??u.venue??s,o.push({splitIndex:c+1,amountOut:String(l),source:u.source??u.venue})}catch(u){if(n.signal?.aborted)throw n.signal.reason||u;o.push({splitIndex:c+1,error:String(u.message||u).slice(0,200)})}let a=i>0n?(Number(i)/Number(BigInt(r.params.amount))).toFixed(6):null;return{params:r.params,schedule:r.schedule,totalOut:String(i),averagePrice:a,bestSource:s,chunks:o,simulatedAt:new Date().toISOString()}}var fk,mk,hk,yk,gk,Fm=O(()=>{Vn();xe();fk=2,mk=100,hk=60,yk=10,gk=6});async function zm({srcChainId:e,srcChainTokenIn:t,srcChainTokenInAmount:n,dstChainId:r,dstChainTokenOut:o,slippage:i=100,affiliateFeePercent:s="0"}={},a={}){if(!e||!r||!t||!o||!n)return{error:"debridge quote requires srcChainId, dstChainId, srcChainTokenIn, dstChainTokenOut, srcChainTokenInAmount"};if(!jm.has(Number(e))||!jm.has(Number(r)))return{error:`debridge: unsupported chain pair ${e} -> ${r}`};try{let c={srcChainId:String(e),srcChainTokenIn:t,srcChainTokenInAmount:String(n),dstChainId:String(r),dstChainTokenOut:o,slippage:i,affiliateFeePercent:s},u=await C(`${Hm}/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 Vm(){try{return{ok:!0,chainCount:(await C(`${Hm}/supported-chains-info`))?.chains?.length??0}}catch(e){return{ok:!1,error:String(e.message||e).slice(0,160)}}}var Hm,jm,Wm=O(()=>{G();xe();Hm="https://dln.debridge.finance/v1.0",jm=new Set([1,10,56,137,8453,42161,43114,59144,534352,7777777,324,5e3,1101,81457])});async function Km({active:e=!0}={},t={}){let n=Date.now();if(or.size&&n-Gm<Ek)return[...or.values()];try{let r=await C(`${Nc}/exchange/currencies?active=${e?"true":"false"}`,t);or.clear();for(let o of r??[])or.set(String(o.ticker).toLowerCase(),o);return Gm=n,r??[]}catch(r){return or.size?[...or.values()]:{error:String(r.message||r).slice(0,200)}}}async function Sk(e,t,n={}){if(!e||!t)return{error:"changenow minAmount requires fromTicker and toTicker"};try{return{minAmount:(await C(`${Nc}/exchange/min-amount/${encodeURIComponent(e)}_${encodeURIComponent(t)}`,n))?.minAmount??"0"}}catch(r){return{error:String(r.message||r).slice(0,200)}}}async function vk(e,t,n,{flow:r="standard"}={},o={}){if(!e||!t||!n)return{error:"changenow estimate requires fromTicker, toTicker, fromAmount"};try{let i=new URLSearchParams({fromCurrency:String(e).toLowerCase(),toCurrency:String(t).toLowerCase(),fromAmount:String(n),flow:r}),s=await C(`${Nc}/exchange/estimated-amount?${i}`,o);return{fromAmount:s?.fromAmount,toAmount:s?.toAmount,rate:s?.rate,flow:s?.flow??r}}catch(i){return{error:String(i.message||i).slice(0,200)}}}async function Ym({fromTicker:e,toTicker:t,fromAmount:n,flow:r}={},o={}){if(!e||!t)return{error:"changenow quote requires fromTicker and toTicker"};let i=await Sk(e,t,o);if(i.error)return i;let s=n??i.minAmount,a=await vk(e,t,s,{flow:r},o);if(a.error)return a;let c=await Km({},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 Xm(){try{let e=await Km();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 Nc,or,Gm,Ek,Jm=O(()=>{G();Nc="https://api.changenow.io/v2",or=new Map,Gm=0,Ek=6e5});async function Qm({fromChain:e,toChain:t,fromToken:n,toToken:r,fromAmount:o,fromAddress:i,slippage:s=1}={},a={}){if(!e||!t||!n||!r||!o||!i)return{error:"squid quote requires fromChain, toChain, fromToken, toToken, fromAmount, fromAddress"};try{let c={fromChain:e,toChain:t,fromToken:n,toToken:r,fromAmount:String(o),fromAddress:i,slippage:s},u=await C(`${Ak}/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 Ak,Zm=O(()=>{G();Ak="https://api.squidrouter.com/v1"});async function eh({srcChainId:e,dstChainId:t,token:n,amount:r,dstGasForCall:o=0,minAmountOut:i="0"}={},s={}){if(!e||!t||!n||!r)return{error:"stargate quote requires srcChainId, dstChainId, token, amount"};try{let a=new URLSearchParams({srcChainId:String(e),dstChainId:String(t),token:n,amount:String(r),dstGasForCall:String(o),minAmountOut:String(i)}),c=await C(`${xk}/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 xk,th=O(()=>{G();xk="https://api.stargate.finance"});async function nh({fromAsset:e,toAsset:t,amount:n,destination:r}={},o={}){if(!e||!t||!n)return{error:"thorchain quote requires fromAsset, toAsset, amount"};try{let i=new URLSearchParams({from_asset:e,to_asset:t,amount:String(n),destination:r||""}),s=await C(`${kk}/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 kk,rh=O(()=>{G();kk="https://midgard.ninerealms.com/v2"});async function oh({fromChainId:e,toChainId:t,fromToken:n,toToken:r,fromAmount:o,userAddress:i}={},s={}){if(!e||!t||!n||!r||!o||!i)return{error:"bungee quote requires fromChainId, toChainId, fromToken, toToken, fromAmount, userAddress"};try{let a=new URLSearchParams({fromChainId:String(e),toChainId:String(t),fromTokenAddress:n,toTokenAddress:r,fromAmount:String(o),userAddress:i,sort:"output",singleTxOnly:"false"}),c=await C(`${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,ih=O(()=>{G();Ik="https://api.socket.tech/v2"});async function sh({originDomain:e,destinationDomain:t,originToken:n,destinationToken:r,amount:o}={},i={}){if(!e||!t||!n||!r||!o)return{error:"connext quote requires originDomain, destinationDomain, originToken, destinationToken, amount"};try{let s={originDomain:String(e),destinationDomain:String(t),originToken:n,destinationToken:r,amount:String(o)},a=await C(`${_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,ah=O(()=>{G();_k="https://api.connext.network"});async function ch({fromChain:e,toChain:t,token:n,amount:r}={},o={}){if(!e||!t||!n||!r)return{error:"wormhole quote requires fromChain, toChain, token, amount"};try{let i=new URLSearchParams({fromChain:String(e),toChain:String(t),token:n,amount:String(r)}),s=await C(`${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,uh=O(()=>{G();Ok="https://api.portalbridge.com/v1"});import{Interface as hh,getAddress as Tk,id as yh}from"ethers";function ir(e){return e?.cache===!1?!1:!e?.fetchImpl||e.cache===!0}function Lc(e,t,n){let r=e.get(t);return r?Date.now()-r.at>n?(e.delete(t),null):r:null}function Fi(e,t,n,r){for(e.delete(t),e.set(t,{at:Date.now(),value:n});e.size>r;){let o=e.keys().next();if(o.done)break;e.delete(o.value)}}function Wk(e,t){try{return Tk(e).toLowerCase()}catch{throw new Error(`${t} must be a valid EVM address`)}}function Gk(e){return`0x${e.slice(2).toLowerCase().padStart(64,"0")}`}function mh(e){return`0x${String(e).slice(-40).toLowerCase()}`}function Kk({unlimited:e,spenderLabel:t,lastActivityAt:n}){if(e)return"unlimited";if(!t)return"unknown-spender";if(n){let r=Date.parse(n);if(Number.isFinite(r)&&Date.now()-r>Dk)return"stale"}return"scoped"}function Yk(e,t,n){if(n)return"UNLIMITED";if(t==null)return e.toString();let r=10n**BigInt(t),o=e/r,i=e%r;if(i===0n)return o.toLocaleString("en-US");let s=i.toString().padStart(t,"0").replace(/0+$/,"").slice(0,6);return`${o.toLocaleString("en-US")}${s?`.${s}`:""}`}async function Xk(e,t,n,r){let o=`${e}:${t}`,i=r?.get(o);if(i)return i;if(ir(n)){let a=Lc(ph,o,Fk);if(a)return a.value}let s=(async()=>{let a=async d=>{try{let f=lh.encodeFunctionData(d,[]),p=await te(e,"eth_call",[{to:t,data:f},"latest"],n);return!p||p==="0x"?null:lh.decodeFunctionResult(d,p)[0]}catch{return null}},[c,u]=await Promise.all([a("decimals"),a("symbol")]),l={decimals:c==null?null:Number(c),symbol:u==null?null:String(u).slice(0,24)};return ir(n)&&Fi(ph,o,l,zk),l})();return r?.set(o,s),s}async function Jk(e,t,n){let r=Math.min(Math.max(Number(n.lookbackBlocks)||Nk,1),Rk),o=await jo(e,n);if(!Number.isFinite(o))throw new Error("chain head unavailable");let i=Math.max(0,o-r),s=await te(e,"eth_getLogs",[{fromBlock:`0x${i.toString(16)}`,toBlock:"latest",topics:[Ck,Gk(t)]}],n);if(!Array.isArray(s))throw new Error("log scan returned no array");let a=new Map;for(let c of s){let u=String(c?.address||"").toLowerCase(),l=c?.topics?.[2];!u||!l||a.set(`${u}:${mh(l)}`,{token:u,spender:mh(l)})}return{pairs:[...a.values()],fromBlock:i,toBlock:o}}function Qk(e){return(Bk[e]||[]).flatMap(n=>Lk.map(r=>({token:n.address,spender:r.address,symbol:n.symbol,decimals:n.decimals})))}async function Zk(e,t,n={}){let r=[],o="direct-probe",i=null,s=Qk(e),a=Pc(e),c=ir(n)&&Lc(Rc,e,jk)?.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 Jk(e,t,n);r=u.pairs,o="log-scan",i={fromBlock:u.fromBlock,toBlock:u.toBlock},ir(n)&&Fi(Rc,e,!0,64)}catch{if(ir(n)&&Fi(Rc,e,!1,64),r=s,r.length===0&&a.length===0)return{scan:{chainId:e,status:"unconfigured",method:o,error:"no Approval log access and no candidate token or collection set for this chain"},approvals:[]}}try{let u=new Map,d=(await mn(r,n.concurrency||4,async p=>{try{let m=await ql({chainId:e,token:p.token,owner:t,spender:p.spender},n),y=BigInt(m.allowance);if(y<=0n)return null;let h=p.symbol?{symbol:p.symbol,decimals:p.decimals??null}:await Xk(e,p.token,n,u),w=y>=Mk,A=Pk[p.spender]||null;return{id:`${e}:${p.token}:${p.spender}`,chainId:e,standard:"erc20",token:p.token,tokenSymbol:h.symbol,decimals:h.decimals,spender:p.spender,spenderLabel:A,allowance:y.toString(),allowanceDisplay:Yk(y,h.decimals,w),unlimited:w,lastActivityAt:null,risk:Kk({unlimited:w,spenderLabel:A,lastActivityAt:null})}}catch{return null}})).filter(Boolean),f=await tI(e,t,n);return{scan:{chainId:e,status:"ok",method:o,pairsProbed:r.length,collectionsProbed:Pc(e).length,...i||{}},approvals:[...d,...f]}}catch(u){return{scan:{chainId:e,status:"unavailable",method:o,error:String(u?.message||u).slice(0,200)},approvals:[]}}}async function eI(e,t,n,r,o){try{let i=dh.encodeFunctionData("isApprovedForAll",[n,r]),s=await te(e,"eth_call",[{to:t,data:i},"latest"],o);return!s||s==="0x"?null:!!dh.decodeFunctionResult("isApprovedForAll",s)[0]}catch{return null}}function Pc(e){return(qk[e]||[]).flatMap(n=>$k.map(r=>({collection:n.address,collectionName:n.name,operator:r.address,operatorLabel:r.label})))}async function tI(e,t,n){let r=Pc(e);return r.length===0?[]:(await mn(r,n.concurrency||4,async i=>await eI(e,i.collection,t,i.operator,n)!==!0?null:{id:`${e}:${i.collection}:${i.operator}:all`,chainId:e,standard:"erc721",token:i.collection,tokenSymbol:i.collectionName,decimals:null,spender:i.operator,spenderLabel:i.operatorLabel,allowance:null,allowanceDisplay:"ALL ITEMS",unlimited:!0,lastActivityAt:null,risk:"operator-all"})).filter(Boolean)}async function gh(e={},t={}){let n=Wk(e.owner||e.address,"owner"),r=new Map(Zt.map(p=>[p.chainId,p])),o=Array.isArray(e.chainIds)&&e.chainIds.length?[...new Set(e.chainIds.map(Number))].filter(p=>r.has(p)):[...r.keys()],i=`${n}:${[...o].sort((p,m)=>p-m).join(",")}:${e.lookbackBlocks??""}`,s=ir(t)&&!e.refresh;if(s){let p=Lc(fh,i,Hk);if(p)return{...p.value,cached:!0,cachedAgeMs:Date.now()-p.at}}let a=await mn(o,e.concurrency||3,p=>Zk(p,n,{...t,lookbackBlocks:e.lookbackBlocks})),c=a.flatMap(p=>p.approvals),u=a.map(p=>p.scan),l=u.find(p=>p.method==="log-scan"&&p.toBlock),d=u.some(p=>p.method==="direct-probe"&&p.status==="ok"),f={provider:"approvals",operation:"scan",readOnly:!0,queriedAt:new Date().toISOString(),owner:n,scannedRange:l?`last ${l.toBlock-l.fromBlock} blocks`:d?"known routers, live allowance probe":null,approvals:c,scans:u,warnings:["Approval discovery is scoped. Log scanning is used where the endpoint permits it; otherwise a curated router set is probed directly. An empty result means nothing was found in that scope, not that the wallet is safe.","NFT operator approval (setApprovalForAll) is checked against a curated collection and marketplace set on supported chains only. A collection outside that set is not checked."]};return s&&Fi(fh,i,f,Vk),{...f,cached:!1,cachedAgeMs:0}}var lh,dh,Ck,Nq,Nk,Rk,Pk,Lk,$k,qk,Bk,Uk,Mk,Dk,Fk,jk,Hk,zk,Vk,ph,Rc,fh,bh=O(()=>{Vr();G();ot();lh=new hh(["function decimals() view returns (uint8)","function symbol() view returns (string)"]),dh=new hh(["function isApprovedForAll(address owner, address operator) view returns (bool)","function name() view returns (string)"]),Ck=yh("Approval(address,address,uint256)"),Nq=yh("ApprovalForAll(address,address,bool)"),Nk=1e4,Rk=2e5,Pk=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)"}),Lk=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"}]),$k=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"}]),qk=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"}]}),Bk=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}]}),Uk=(1n<<256n)-1n,Mk=Uk/2n,Dk=4320*60*60*1e3,Fk=360*60*1e3,jk=600*1e3,Hk=45*1e3,zk=512,Vk=128,ph=new Map,Rc=new Map,fh=new Map});var Sh={};z(Sh,{aggregateBridgeQuotes:()=>wh,bridgeAggregatorHealth:()=>rI,checkRevokeNeeded:()=>Eh,scanBridgeRoutes:()=>nI});async function wh(e={},t={}){let{fromChainId:n,toChainId:r,tokenIn:o,tokenOut:i,amount:s,taker:a,fromSymbol:c="?",toSymbol:u="?",fromDecimals:l=18,toDecimals:d=18}=e,f=[],p=[],m=zm({srcChainId:n,srcChainTokenIn:o,srcChainTokenInAmount:s,dstChainId:r,dstChainTokenOut:i},t).then(g=>g.error?(p.push(`debridge: ${g.error}`),null):{provider:"debridge",amountOut:g.estimation?.dstChainTokenOut?.amount??g.estimation?.toAmount,feeUsd:g.estimation?.fixFee??g.fixFee,estimatedTime:g.estimation?.execution?.estimatedTransferTime?`${g.estimation.execution.estimatedTransferTime}s`:"unknown",preparable:!0,raw:g}).catch(g=>(p.push(`debridge: ${g.message}`),null)),y=jr({fromChainId:n,toChainId:r,tokenIn:o,tokenOut:i,amountIn:s,taker:a},t).then(g=>!g||g.error?(p.push(`lifi: ${g?.error??"no route"}`),null):{provider:"lifi-relay",amountOut:g.amountOut??g.quote?.amountOut,feeUsd:g.feeUsd??g.totalFee,estimatedTime:g.estimatedTime??g.duration??"unknown",preparable:!!g.transaction,raw:g}).catch(g=>(p.push(`lifi: ${g.message}`),null)),h=Qm({fromChain:n,toChain:r,fromToken:o,toToken:i,fromAmount:s,fromAddress:a},t).then(g=>g.error?(p.push(`squid: ${g.error}`),null):{provider:"squid",amountOut:g.toAmount,feeUsd:Array.isArray(g.fee)?g.fee.reduce((b,v)=>b+(Number(v.amountUsd)||0),0):null,estimatedTime:"30s - 3min",preparable:!1,raw:g}).catch(g=>(p.push(`squid: ${g.message}`),null)),w=eh({srcChainId:n,dstChainId:r,token:o,amount:s},t).then(g=>g.error?(p.push(`stargate: ${g.error}`),null):{provider:"stargate",amountOut:g.amountOut,feeUsd:g.fee,estimatedTime:g.estimatedTime||"1-5 min",preparable:!1,raw:g}).catch(g=>(p.push(`stargate: ${g.message}`),null)),A=nh({fromAsset:c,toAsset:u,amount:s,destination:a},t).then(g=>g.error?(p.push(`thorchain: ${g.error}`),null):{provider:"thorchain",amountOut:g.expectedAmountOut,feeUsd:g.fees?.total,estimatedTime:g.estimatedTime||"10-30 min",preparable:!1,raw:g}).catch(g=>(p.push(`thorchain: ${g.message}`),null)),_=(async()=>{if(!c||!u||c==="?"||u==="?")return p.push("changenow: ticker symbols required, skipping"),null;try{let g=await Ym({fromTicker:c,toTicker:u,fromAmount:s},t);return g.error?(p.push(`changenow: ${g.error}`),null):{provider:"changenow",amountOut:g.toAmount,feeUsd:g.networkFee,estimatedTime:g.flow==="standard"?"5-30 min":"instant",preparable:!1,kycRequired:g.kycRequired,raw:g}}catch(g){return p.push(`changenow: ${g.message}`),null}})(),S=oh({fromChainId:n,toChainId:r,fromToken:o,toToken:i,fromAmount:s,userAddress:a},t).then(g=>g.error?(p.push(`bungee: ${g.error}`),null):{provider:"bungee",amountOut:g.amountOut,feeUsd:g.feeUsd,estimatedTime:g.estimatedTime,preparable:!1,raw:g}).catch(g=>(p.push(`bungee: ${g.message}`),null)),k=sh({originDomain:n,destinationDomain:r,originToken:o,destinationToken:i,amount:s},t).then(g=>g.error?(p.push(`connext: ${g.error}`),null):{provider:"connext",amountOut:g.amountOut,feeUsd:g.fee,estimatedTime:g.estimatedTime||"5-20 min",preparable:!1,raw:g}).catch(g=>(p.push(`connext: ${g.message}`),null)),x=ch({fromChain:n,toChain:r,token:o,amount:s},t).then(g=>g.error?(p.push(`wormhole: ${g.error}`),null):{provider:"wormhole",amountOut:g.amountOut,feeUsd:g.fee,estimatedTime:g.estimatedTime||"5-15 min",preparable:!1,raw:g}).catch(g=>(p.push(`wormhole: ${g.message}`),null)),E=await Promise.allSettled([m,y,h,w,A,S,k,x,_]);for(let g of E)g.status==="fulfilled"&&g.value&&f.push(g.value);return f.sort((g,b)=>{let v=Number(g.amountOut??0),P=Number(b.amountOut??0);return v!==P?P-v:g.preparable&&!b.preparable?-1:!g.preparable&&b.preparable?1:0}),{providers:f.map(g=>g.provider),bestRoute:f[0]?.provider??"none",winner:f[0]??null,runnersUp:f.slice(1),errors:p.length?p:null}}async function Eh({chainId:e,taker:t,tokenIn:n}={},r={}){if(!e||!t)return{needsRevoke:!1,note:"no wallet to check"};try{let i=(await gh({chainIds:[e],address:t},r)).approvals;if(!i?.length)return{needsRevoke:!1,note:"no active approvals found"};let s=n?i.find(a=>String(a.token).toLowerCase()===String(n).toLowerCase()):null;return s&&BigInt(s.allowance??"0")>0n?{needsRevoke:!0,spender:s.spender,amount:s.allowance,symbol:s.symbol??"?",decimals:s.decimals??18,note:`approval found for ${s.spender}, revoke before bridging`}:{needsRevoke:!1,note:`no active approval for this token (${i.length} total approvals on chain)`}}catch(o){return{needsRevoke:!1,note:`revoke check unavailable: ${String(o.message||o).slice(0,100)}`}}}async function nI(e={},t={}){let[n,r]=await Promise.all([wh(e,t),Eh({chainId:e.fromChainId,taker:e.taker,tokenIn:e.tokenIn},t)]),o=n.winner??{};return{kind:"bridge",fromChainId:e.fromChainId,toChainId:e.toChainId,fromSymbol:e.fromSymbol,toSymbol:e.toSymbol,amount:e.amount,fromDecimals:e.fromDecimals??18,toDecimals:e.toDecimals??18,bestRoute:o.provider??"none",amountOut:o.amountOut,feeUsd:o.feeUsd,estimatedTime:o.estimatedTime,preparable:o.preparable?"yes":"no (manual send)",providers:n.providers,runnersUp:n.runnersUp,revokeCheck:r,errors:n.errors,confidence:n.providers.length>=2?.85:n.providers.length===1?.6:.1}}async function rI(){let[e,t]=await Promise.all([Vm().catch(n=>({ok:!1,error:n.message})),Xm().catch(n=>({ok:!1,error:n.message}))]);return{debridge:e,changenow:t,lifi:{ok:!0,note:"integrated via router"}}}var rB,vh=O(()=>{Vn();Wm();Jm();Zm();th();rh();ih();ah();uh();bh();rB=Object.freeze(["debridge","lifi-relay","squid","stargate","thorchain","bungee","connext","wormhole","changenow"])});var Ah={};z(Ah,{DYDX_API:()=>ji,dydxHealth:()=>aI,dydxMarkets:()=>iI,dydxOrderbook:()=>sI});function ao(e){if(e==null||e==="")return null;let t=Number(e);return Number.isFinite(t)?t:null}function oI(e){let t=e?.markets;return Array.isArray(t)?t:t&&typeof t=="object"?Object.values(t):[]}async function iI(e=50,t={}){try{let n=await C(`${ji}/v4/perpetualMarkets?limit=${e}`,t);return oI(n).map(o=>{let i=ao(o?.nextFundingRate),s=ao(o?.oraclePrice),a=ao(o?.openInterest),c=ao(o?.volume24H),u=ao(o?.priceChange24H);return{ticker:o?.ticker,coin:String(o?.ticker||"").replace(/-USD$/,""),markPx:s,oraclePx:s,fundingRate:i,fundingRateAprPct:i==null?null:i*24*365*100,openInterest:a,dayNtlVolumeUsd:c,change24hPct:s&&u!=null?u/s*100:null,oraclePrice:o?.oraclePrice,indexPrice:o?.indexPrice,nextFundingRate:i==null?null:`${(i*100).toFixed(4)}%`,volume24h:o?.volume24H,venue:"dydx",quality:"LIVE"}}).filter(o=>o.ticker)}catch(n){return{error:String(n.message||n).slice(0,200),venue:"dydx",quality:"FAILED"}}}async function sI(e){try{let t=await C(`${ji}/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 aI(){try{return{ok:!0,serverTime:(await C(`${ji}/v4/time`))?.iso}}catch(e){return{ok:!1,error:String(e.message||e).slice(0,160)}}}var ji,xh=O(()=>{G();ji="https://indexer.dydx.trade"});var Oh={};z(Oh,{DRIFT_API:()=>Ih,driftHealth:()=>cI,driftMarkets:()=>_h});async function _h(e={}){try{let n=(await C(`${Ih}/v2/markets`,e))?.markets;return!Array.isArray(n)||n.length===0?{error:kh,venue:"drift",quality:"FAILED"}:n.map(r=>({symbol:r?.symbol||r?.marketIndex,coin:r?.symbol,oraclePrice:r?.amm?.oraclePrice,markPrice:r?.amm?.markPrice,fundingRate:r?.amm?.lastFundingRate?`${(Number(r.amm.lastFundingRate)*100).toFixed(4)}%`:null,openInterest:{long:r?.amm?.longFunding,short:r?.amm?.shortFunding},volume24h:r?.amm?.quoteAssetVolume,venue:"drift",quality:"LIVE"}))}catch(t){return{error:`${kh} (${String(t.message||t).slice(0,120)})`,venue:"drift",quality:"FAILED"}}}async function cI(){let e=await _h();return e?.error?{ok:!1,error:e.error,quality:"FAILED"}:{ok:!0,note:"Drift v2 perps on Solana",quality:"LIVE"}}var Ih,kh,Th=O(()=>{G();Ih="https://dlob.drift.trade",kh="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 Rh={};z(Rh,{VERTEX_API:()=>$c,vertexHealth:()=>lI,vertexMarkets:()=>Nh,vertexOrderbook:()=>uI});async function Nh(e={}){try{let n=(await C(`${$c}/query`,{...e,method:"POST",body:JSON.stringify({all_markets:{}}),headers:{"content-type":"application/json",...e.headers||{}}}))?.data?.all_markets;return!Array.isArray(n)||n.length===0?{error:Ch,venue:"vertex",quality:"FAILED"}:n.map(r=>({market:r?.market,type:r?.type,oraclePrice:r?.oracle_price_x18?(Number(BigInt(r.oracle_price_x18))/1e18).toFixed(4):null,minSize:r?.min_size,productId:r?.product_id,venue:"vertex",quality:"LIVE"}))}catch(t){return{error:`${Ch} (${String(t.message||t).slice(0,120)})`,venue:"vertex",quality:"FAILED"}}}async function uI(e){try{let n=(await C(`${$c}/query`,{method:"POST",body:JSON.stringify({market_liquidity:{product_id:Number(e),depth:5}}),headers:{"content-type":"application/json"}}))?.data?.market_liquidity;return{bids:n?.bids||[],asks:n?.asks||[]}}catch(t){return{error:String(t.message||t).slice(0,200),quality:"FAILED"}}}async function lI(){let e=await Nh();return e?.error?{ok:!1,error:e.error,quality:"FAILED"}:{ok:!0,status:"ok",quality:"LIVE"}}var $c,Ch,Ph=O(()=>{G();$c="https://gateway.prod.vertexprotocol.com/v2",Ch="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 Lh={};z(Lh,{pancakeHealth:()=>fI,pancakeQuote:()=>pI});async function pI({chainId:e=56,tokenIn:t,tokenOut:n,amountIn:r,fee:o=500}={},i={}){if(!t||!n||!r)return{error:"pancake quote requires tokenIn, tokenOut, amountIn"};try{let s={tokenIn:String(t).toLowerCase(),tokenOut:String(n).toLowerCase(),amountIn:String(r),fee:String(o)},a=await C(`${dI}/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 fI(){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 dI,$h=O(()=>{G();dI="https://api.thegraph.com/subgraphs/name/pancakeswap/exchange-v3-bsc"});var Bh={};z(Bh,{sushiHealth:()=>yI,sushiQuote:()=>hI});async function hI({chainId:e=1,tokenIn:t,tokenOut:n,amountIn:r,fee:o=500}={},i={}){if(!t||!n||!r)return{error:"sushi quote requires tokenIn, tokenOut, amountIn"};try{let s=`{ quote(tokenIn:"${t}",tokenOut:"${n}",amountIn:"${r}",fee:${o}) { amountOut route } }`,a=await C(`${mI(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 yI(){try{return{ok:!0,chains:Object.keys(qh).length+" chains"}}catch(e){return{ok:!1,error:String(e.message||e).slice(0,160)}}}var mI,qh,Uh=O(()=>{G();mI=e=>`https://api.thegraph.com/subgraphs/name/sushi-v3/v3-${qh[e]||"ethereum"}`,qh={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 Mh={};z(Mh,{raydiumHealth:()=>wI,raydiumQuote:()=>bI});async function bI({inputMint:e,outputMint:t,amount:n,slippageBps:r=50}={},o={}){if(!e||!t||!n)return{error:"raydium quote requires inputMint, outputMint, amount"};try{let i=new URLSearchParams({inputMint:e,outputMint:t,amount:String(n),slippageBps:String(r),onlyDirectRoutes:"true"}),s=await C(`${gI}/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 wI(){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 gI,Dh=O(()=>{G();gI="https://quote-api.jup.ag/v6"});var Fh={};z(Fh,{AEVO_API:()=>qc,aevoHealth:()=>SI,aevoMarkets:()=>EI});async function EI(e={}){try{return(await C(`${qc}/markets`,e)||[]).map(n=>({instrument:n?.instrument_name,type:n?.instrument_type,markPrice:n?.mark_price,indexPrice:n?.index_price,fundingRate:n?.funding_rate?`${(Number(n.funding_rate)*100).toFixed(4)}%`:null,openInterest:n?.open_interest,volume24h:n?.volume_24h}))}catch(t){return{error:String(t.message||t).slice(0,200)}}}async function SI(){try{return{ok:(await C(`${qc}/ping`))?.status==="ok"}}catch(e){return{ok:!1,error:String(e.message||e).slice(0,160)}}}var qc,jh=O(()=>{G();qc="https://api.aevo.xyz"});var Dc={};z(Dc,{BINANCE_DEFAULT_FUNDING_INTERVAL_HOURS:()=>Vh,BINANCE_FUTURES_API:()=>zh,BINANCE_SPOT_API:()=>Hh,binanceFunding:()=>zi,binanceFundingHistory:()=>kI,binanceHealth:()=>Uc,binanceMarkPrice:()=>AI,binanceOpenInterest:()=>xI,binanceOrderbook:()=>vI,binanceSymbol:()=>sr,binanceTicker:()=>Mc,normalizeBook:()=>ar});function Bc(e={}){return(e.spotBaseUrl||e.baseUrl||process.env.BINANCE_API_URL||Hh).replace(/\/$/,"")}function Hi(e={}){return(e.futuresBaseUrl||process.env.BINANCE_FAPI_URL||zh).replace(/\/$/,"")}function co(e){return{error:String(e.message||e).slice(0,200)}}function Ke(e){let t=Number(e);return Number.isFinite(t)?t:null}function sr(e,t="USDT"){let n=String(e||"").trim().toUpperCase().replace(/[-_/]/g,"");return n?n.endsWith(t)?n:`${n}${t}`:""}async function Uc(e={}){try{let t=await C(`${Bc(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 Mc(e={},t={}){let n=sr(e.symbol||e.coin,e.quote||"USDT");if(!n)return{error:"binanceTicker requires symbol or coin"};try{let r=e.full?"/api/v3/ticker/24hr":"/api/v3/ticker/price",o=await C(`${Bc(t)}${r}?symbol=${encodeURIComponent(n)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3});return{venue:"binance",market:"spot",symbol:n,price:Ke(o?.price??o?.lastPrice),volume24h:Ke(o?.volume),quoteVolume24h:Ke(o?.quoteVolume),raw:o}}catch(r){return co(r)}}async function vI(e={},t={}){let n=sr(e.symbol||e.coin,e.quote||"USDT");if(!n)return{error:"binanceOrderbook requires symbol or coin"};let r=Math.min(Math.max(Number(e.limit)||20,1),1e3),o=String(e.market||"spot").toLowerCase()==="perp";try{let i=o?`${Hi(t)}/fapi/v1/depth?symbol=${encodeURIComponent(n)}&limit=${r}`:`${Bc(t)}/api/v3/depth?symbol=${encodeURIComponent(n)}&limit=${r}`,s=await C(i,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3});return ar({venue:"binance",market:o?"perp":"spot",symbol:n,bids:s?.bids,asks:s?.asks,raw:s})}catch(i){return co(i)}}async function zi(e={},t={}){let n=sr(e.symbol||e.coin,e.quote||"USDT");if(!n)return{error:"binanceFunding requires symbol or coin"};try{let r=await C(`${Hi(t)}/fapi/v1/premiumIndex?symbol=${encodeURIComponent(n)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),o=Array.isArray(r)?r[0]:r,i=Number(e.fundingIntervalHours)||Vh,s=Ke(o?.lastFundingRate);return{venue:"binance",market:"perp",symbol:n,markPrice:Ke(o?.markPrice),indexPrice:Ke(o?.indexPrice),fundingRate:s,fundingIntervalHours:i,fundingAprPct:s==null?null:s*(8760/i)*100,nextFundingTime:Ke(o?.nextFundingTime),raw:o??null}}catch(r){return co(r)}}async function AI(e={},t={}){let n=await zi(e,t);return n?.error?n:{venue:"binance",market:"perp",symbol:n.symbol,markPrice:n.markPrice,indexPrice:n.indexPrice}}async function xI(e={},t={}){let n=sr(e.symbol||e.coin,e.quote||"USDT");if(!n)return{error:"binanceOpenInterest requires symbol or coin"};try{let r=await C(`${Hi(t)}/fapi/v1/openInterest?symbol=${encodeURIComponent(n)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3});return{venue:"binance",market:"perp",symbol:n,openInterest:Ke(r?.openInterest),time:Ke(r?.time),raw:r??null}}catch(r){return co(r)}}async function kI(e={},t={}){let n=sr(e.symbol||e.coin,e.quote||"USDT");if(!n)return{error:"binanceFundingHistory requires symbol or coin"};let r=Math.min(Math.max(Number(e.limit)||10,1),1e3);try{let o=await C(`${Hi(t)}/fapi/v1/fundingRate?symbol=${encodeURIComponent(n)}&limit=${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),i=Array.isArray(o)?o:[];return{venue:"binance",symbol:n,count:i.length,history:i.map(s=>({fundingTime:Ke(s?.fundingTime),fundingRate:Ke(s?.fundingRate)}))}}catch(o){return co(o)}}function ar({venue:e,market:t,symbol:n,bids:r,asks:o,raw:i}){let s=p=>(Array.isArray(p)?p:[]).map(m=>{let y=Ke(Array.isArray(m)?m[0]:m?.price),h=Ke(Array.isArray(m)?m[1]:m?.size);return y==null||h==null?null:{price:y,size:h}}).filter(Boolean),a=s(r),c=s(o),u=a[0]?.price??null,l=c[0]?.price??null,d=u!=null&&l!=null?(u+l)/2:null,f=d?(l-u)/d*1e4:null;return{venue:e,market:t,symbol:n,bids:a,asks:c,bestBid:u,bestAsk:l,mid:d,spreadBps:f,raw:i??null}}var Hh,zh,Vh,uo=O(()=>{G();Hh="https://api.binance.com",zh="https://fapi.binance.com",Vh=8});var Vc={};z(Vc,{OKX_API:()=>Wh,OKX_DEFAULT_FUNDING_INTERVAL_HOURS:()=>Gh,okxFunding:()=>Hc,okxHealth:()=>Fc,okxInstId:()=>ur,okxMarkPrice:()=>zc,okxOpenInterest:()=>_I,okxOrderbook:()=>II,okxTicker:()=>jc});function cr(e={}){return(e.baseUrl||process.env.OKX_API_URL||Wh).replace(/\/$/,"")}function lo(e){return{error:String(e.message||e).slice(0,200)}}function Me(e){if(e===""||e==null)return null;let t=Number(e);return Number.isFinite(t)?t:null}function ur(e,{market:t="spot",quote:n="USDT"}={}){let r=String(e||"").trim().toUpperCase();if(!r)return"";if(r.includes("-"))return r;let o=`${r}-${n}`;return t==="perp"?`${o}-SWAP`:o}function lr(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 Fc(e={}){try{let t=await C(`${cr(e)}/api/v5/public/time`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??1e4});return{ok:lr(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 jc(e={},t={}){let n=String(e.market||"spot").toLowerCase(),r=ur(e.instId||e.symbol||e.coin,{market:n,quote:e.quote||"USDT"});if(!r)return{error:"okxTicker requires instId, symbol or coin"};try{let o=await C(`${cr(t)}/api/v5/market/ticker?instId=${encodeURIComponent(r)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),i=lr(o)[0];return i?{venue:"okx",market:r.endsWith("-SWAP")?"perp":"spot",symbol:r,price:Me(i.last),bestBid:Me(i.bidPx),bestAsk:Me(i.askPx),volume24h:Me(i.vol24h),quoteVolume24h:Me(i.volCcy24h),raw:i}:{error:`okx ticker empty for ${r}`}}catch(o){return lo(o)}}async function II(e={},t={}){let n=String(e.market||"spot").toLowerCase(),r=ur(e.instId||e.symbol||e.coin,{market:n,quote:e.quote||"USDT"});if(!r)return{error:"okxOrderbook requires instId, symbol or coin"};let o=Math.min(Math.max(Number(e.limit)||20,1),400);try{let i=await C(`${cr(t)}/api/v5/market/books?instId=${encodeURIComponent(r)}&sz=${o}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),s=lr(i)[0];return s?ar({venue:"okx",market:r.endsWith("-SWAP")?"perp":"spot",symbol:r,bids:s.bids,asks:s.asks,raw:s}):{error:`okx books empty for ${r}`}}catch(i){return lo(i)}}async function Hc(e={},t={}){let n=ur(e.instId||e.symbol||e.coin,{market:"perp",quote:e.quote||"USDT"});if(!n)return{error:"okxFunding requires instId, symbol or coin"};try{let r=await C(`${cr(t)}/api/v5/public/funding-rate?instId=${encodeURIComponent(n)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),o=lr(r)[0];if(!o)return{error:`okx funding-rate empty for ${n}`};let i=Number(e.fundingIntervalHours)||Gh,s=Me(o.fundingRate);return{venue:"okx",market:"perp",symbol:n,fundingRate:s,nextFundingRate:Me(o.nextFundingRate),fundingIntervalHours:i,fundingAprPct:s==null?null:s*(8760/i)*100,nextFundingTime:Me(o.nextFundingTime??o.fundingTime),raw:o}}catch(r){return lo(r)}}async function zc(e={},t={}){let n=ur(e.instId||e.symbol||e.coin,{market:"perp",quote:e.quote||"USDT"});if(!n)return{error:"okxMarkPrice requires instId, symbol or coin"};let r=String(e.instType||"SWAP").toUpperCase();try{let o=await C(`${cr(t)}/api/v5/public/mark-price?instType=${encodeURIComponent(r)}&instId=${encodeURIComponent(n)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),i=lr(o)[0];return i?{venue:"okx",market:"perp",symbol:n,markPrice:Me(i.markPx),time:Me(i.ts),raw:i}:{error:`okx mark-price empty for ${n}`}}catch(o){return lo(o)}}async function _I(e={},t={}){let n=ur(e.instId||e.symbol||e.coin,{market:"perp",quote:e.quote||"USDT"});if(!n)return{error:"okxOpenInterest requires instId, symbol or coin"};let r=String(e.instType||"SWAP").toUpperCase();try{let o=await C(`${cr(t)}/api/v5/public/open-interest?instType=${encodeURIComponent(r)}&instId=${encodeURIComponent(n)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),i=lr(o)[0];return i?{venue:"okx",market:"perp",symbol:n,openInterest:Me(i.oiCcy??i.oi),openInterestContracts:Me(i.oi),openInterestUsd:Me(i.oiUsd),time:Me(i.ts),raw:i}:{error:`okx open-interest empty for ${n}`}}catch(o){return lo(o)}}var Wh,Gh,Wc=O(()=>{G();uo();Wh="https://www.okx.com",Gh=8});var Yc={};z(Yc,{BYBIT_API:()=>Kh,BYBIT_DEFAULT_FUNDING_INTERVAL_HOURS:()=>Yh,bybitCategory:()=>Vi,bybitFunding:()=>Wi,bybitFundingHistory:()=>NI,bybitHealth:()=>Gc,bybitMarkPrice:()=>TI,bybitOpenInterest:()=>CI,bybitOrderbook:()=>OI,bybitSymbol:()=>mo,bybitTicker:()=>Kc});function po(e={}){return(e.baseUrl||process.env.BYBIT_API_URL||Kh).replace(/\/$/,"")}function fo(e){return{error:String(e.message||e).slice(0,200)}}function be(e){if(e===""||e==null)return null;let t=Number(e);return Number.isFinite(t)?t:null}function mo(e,t="USDT"){let n=String(e||"").trim().toUpperCase().replace(/[-_/]/g,"");return n?n.endsWith(t)?n:`${n}${t}`:""}function Vi(e){let t=String(e||"spot").toLowerCase();return t==="perp"||t==="linear"||t==="swap"?"linear":t==="inverse"?"inverse":"spot"}function ho(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 Gc(e={}){try{let t=await C(`${po(e)}/v5/market/time`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??1e4});return{ok:!!ho(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 Xh(e,t){let n=Vi(e.market),r=mo(e.symbol||e.coin,e.quote||"USDT");if(!r)return{error:"bybit requires symbol or coin"};let o=await C(`${po(t)}/v5/market/tickers?category=${encodeURIComponent(n)}&symbol=${encodeURIComponent(r)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),i=ho(o)?.list?.[0];return i?{row:i,symbol:r,category:n}:{error:`bybit tickers empty for ${r}`}}async function Kc(e={},t={}){try{let n=await Xh(e,t);if(n.error)return n;let{row:r,symbol:o,category:i}=n;return{venue:"bybit",market:i==="spot"?"spot":"perp",symbol:o,price:be(r.lastPrice),bestBid:be(r.bid1Price),bestAsk:be(r.ask1Price),markPrice:be(r.markPrice),indexPrice:be(r.indexPrice),volume24h:be(r.volume24h),quoteVolume24h:be(r.turnover24h),raw:r}}catch(n){return fo(n)}}async function OI(e={},t={}){let n=Vi(e.market),r=mo(e.symbol||e.coin,e.quote||"USDT");if(!r)return{error:"bybitOrderbook requires symbol or coin"};let o=Math.min(Math.max(Number(e.limit)||25,1),200);try{let i=await C(`${po(t)}/v5/market/orderbook?category=${encodeURIComponent(n)}&symbol=${encodeURIComponent(r)}&limit=${o}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),s=ho(i);return s?ar({venue:"bybit",market:n==="spot"?"spot":"perp",symbol:r,bids:s.b,asks:s.a,raw:s}):{error:`bybit orderbook empty for ${r}`}}catch(i){return fo(i)}}async function Wi(e={},t={}){try{let n=await Xh({...e,market:e.market||"perp"},t);if(n.error)return n;let{row:r,symbol:o}=n,i=Number(e.fundingIntervalHours)||Yh,s=be(r.fundingRate);return{venue:"bybit",market:"perp",symbol:o,markPrice:be(r.markPrice),indexPrice:be(r.indexPrice),fundingRate:s,fundingIntervalHours:i,fundingAprPct:s==null?null:s*(8760/i)*100,nextFundingTime:be(r.nextFundingTime),openInterest:be(r.openInterest),raw:r}}catch(n){return fo(n)}}async function TI(e={},t={}){let n=await Wi(e,t);return n?.error?n:{venue:"bybit",market:"perp",symbol:n.symbol,markPrice:n.markPrice,indexPrice:n.indexPrice}}async function CI(e={},t={}){let n=mo(e.symbol||e.coin,e.quote||"USDT");if(!n)return{error:"bybitOpenInterest requires symbol or coin"};let r=Vi(e.market||"perp"),o=String(e.intervalTime||"1h"),i=Math.min(Math.max(Number(e.limit)||1,1),200);try{let s=await C(`${po(t)}/v5/market/open-interest?category=${encodeURIComponent(r)}&symbol=${encodeURIComponent(n)}&intervalTime=${encodeURIComponent(o)}&limit=${i}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),a=ho(s)?.list,c=Array.isArray(a)?a[0]:null;return c?{venue:"bybit",market:"perp",symbol:n,openInterest:be(c.openInterest),time:be(c.timestamp),history:(Array.isArray(a)?a:[]).map(u=>({openInterest:be(u?.openInterest),timestamp:be(u?.timestamp)}))}:{error:`bybit open-interest empty for ${n}`}}catch(s){return fo(s)}}async function NI(e={},t={}){let n=mo(e.symbol||e.coin,e.quote||"USDT");if(!n)return{error:"bybitFundingHistory requires symbol or coin"};let r=Math.min(Math.max(Number(e.limit)||10,1),200);try{let o=await C(`${po(t)}/v5/market/funding/history?category=linear&symbol=${encodeURIComponent(n)}&limit=${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),i=ho(o)?.list,s=Array.isArray(i)?i:[];return{venue:"bybit",symbol:n,count:s.length,history:s.map(a=>({fundingRate:be(a?.fundingRate),fundingTime:be(a?.fundingRateTimestamp)}))}}catch(o){return fo(o)}}var Kh,Yh,Xc=O(()=>{G();uo();Kh="https://api.bybit.com",Yh=8});var oy={};z(oy,{CEX_BASIS_VENUES:()=>Gi,HL_FUNDING_INTERVAL_HOURS:()=>Jc,cexBasis:()=>ny,cexBasisHealth:()=>qI,cexFundingSpread:()=>$I,cexVenueLegs:()=>ty,hyperliquidPerpLeg:()=>Qh,hyperliquidSpotLeg:()=>Zh,okxPerpLeg:()=>ey,pairwiseFundingSpreads:()=>ry});function yo(e){return{error:String(e.message||e).slice(0,200)}}function Ie(e){if(e===""||e==null)return null;let t=Number(e);return Number.isFinite(t)?t:null}function RI(e,t){return e==null||!t?null:e*(8760/t)*100}function Qc(e={}){return String(e.coin||e.symbol||"").trim().toUpperCase().replace(/[-_/]/g,"").replace(/USDT?$/,"")||""}function PI(e={}){let t=e.venues,n=Array.isArray(t)?t:typeof t=="string"&&t.trim()&&t.trim().toLowerCase()!=="all"?t.split(","):Gi,r=new Set(n.map(i=>String(i).trim().toLowerCase()).filter(Boolean)),o=Gi.filter(i=>r.has(i));return o.length?o:Gi}async function Qh(e={},t={}){let n=Qc(e);if(!n)return{error:"hyperliquidPerpLeg requires coin"};try{let r=await pf(t),o=r?.[0]?.universe,i=r?.[1];if(!Array.isArray(o)||!Array.isArray(i))return{error:"hyperliquid metaAndAssetCtxs returned an unexpected shape"};let s=o.findIndex(u=>String(u?.name||"").toUpperCase()===n);if(s<0)return{error:`hyperliquid has no perp for ${n}`};let a=i[s]||{},c=Ie(a.funding);return{venue:"hyperliquid",market:"perp",symbol:n,markPrice:Ie(a.markPx),indexPrice:Ie(a.oraclePx),midPrice:Ie(a.midPx),fundingRate:c,fundingIntervalHours:Jc,fundingAprPct:RI(c,Jc),openInterest:Ie(a.openInterest)}}catch(r){return yo(r)}}async function Zh(e={},t={}){let n=Qc(e);if(!n)return{error:"hyperliquidSpotLeg requires coin"};try{let r=await lf(t),o=Ie(r?.[n]);return o==null?{error:`hyperliquid allMids has no entry for ${n}`}:{venue:"hyperliquid",market:"spot",symbol:n,price:o}}catch(r){return yo(r)}}async function ey(e={},t={}){let[n,r]=await Promise.all([Hc(e,t).catch(yo),zc(e,t).catch(yo)]);return n?.error&&r?.error?n:{...n?.error?{venue:"okx",market:"perp",fundingError:n.error}:n,markPrice:r?.error?null:Ie(r.markPrice),...r?.error?{markError:r.error}:{}}}async function rn(e,t){try{let n=await t;return[e,n&&typeof n=="object"?n:{error:"empty response"}]}catch(n){return[e,yo(n)]}}async function ty(e={},t={}){let n=Qc(e);if(!n)return{error:"cexVenueLegs requires coin"};let r=e.quote||"USDT",o=PI(e),i=[];o.includes("binance")&&(i.push(rn("binance:perp",zi({coin:n,quote:r},t))),i.push(rn("binance:spot",Mc({coin:n,quote:r},t)))),o.includes("okx")&&(i.push(rn("okx:perp",ey({coin:n,quote:r},t))),i.push(rn("okx:spot",jc({coin:n,quote:r,market:"spot"},t)))),o.includes("bybit")&&(i.push(rn("bybit:perp",Wi({coin:n,quote:r},t))),i.push(rn("bybit:spot",Kc({coin:n,quote:r,market:"spot"},t)))),o.includes("hyperliquid")&&(i.push(rn("hyperliquid:perp",Qh({coin:n},t))),i.push(rn("hyperliquid:spot",Zh({coin:n},t))));let s=await Promise.all(i),a={};for(let[c,u]of s){let[l,d]=c.split(":");a[l]=a[l]||{},a[l][d]=u}return{coin:n,quote:r,venues:o,legs:a}}function Jh(e){return!e||e.error?null:Ie(e.price)??Ie(e.mid)??null}function LI(e){return!e||e.error?null:Ie(e.markPrice)??Ie(e.midPrice)??null}async function ny(e={},t={}){let n=await ty(e,t);if(n.error)return n;let{coin:r,quote:o,venues:i,legs:s}=n,a=[];for(let m of i){let y=Jh(s[m]?.spot);y!=null&&y>0&&a.push(y)}let c=[...a].sort((m,y)=>m-y),u=c.length?c.length%2?c[(c.length-1)/2]:(c[c.length/2-1]+c[c.length/2])/2:null,l=[];for(let m of i){let y=s[m]?.perp,h=s[m]?.spot,w=LI(y),A=Jh(h),_=A??u,S=w!=null&&_?(w-_)/_*1e4:null;l.push({venue:m,symbol:y?.symbol??h?.symbol??r,markPrice:w,spotPrice:A,spotSource:A!=null?m:u!=null?"cross-venue-median":null,basisBps:S,fundingRate:y&&!y.error?Ie(y.fundingRate):null,fundingIntervalHours:y&&!y.error?Ie(y.fundingIntervalHours):null,fundingAprPct:y&&!y.error?Ie(y.fundingAprPct):null,openInterest:y&&!y.error?Ie(y.openInterest):null,errors:[y?.error,h?.error].filter(Boolean)})}let d=ry(l),f=l.filter(m=>m.markPrice!=null),p=l.filter(m=>m.basisBps!=null);return{coin:r,quote:o,referenceSpot:u,asOf:new Date().toISOString(),venues:l,fundingSpreads:d,widestFundingSpread:d[0]??null,richestBasis:p.length?p.reduce((m,y)=>y.basisBps>m.basisBps?y:m):null,cheapestBasis:p.length?p.reduce((m,y)=>y.basisBps<m.basisBps?y:m):null,venuesPriced:f.length,venuesRequested:i.length,execution:"read-only",exec:!1,note:"Public market data only. Funding compared on an annualized basis (HL settles hourly, CEXes 8h). Not advice."}}function ry(e=[]){let t=e.filter(r=>Ie(r?.fundingAprPct)!=null),n=[];for(let r=0;r<t.length;r++)for(let o=r+1;o<t.length;o++){let i=t[r],s=t[o],a=i.fundingAprPct-s.fundingAprPct,c=a>0?s.venue:i.venue,u=a>0?i.venue:s.venue;n.push({pair:`${i.venue}/${s.venue}`,aprSpreadPct:Math.abs(a),signedAprSpreadPct:a,longVenue:c,shortVenue:u})}return n.sort((r,o)=>o.aprSpreadPct-r.aprSpreadPct)}async function $I(e={},t={}){let n=await ny(e,t);return n.error?n:{coin:n.coin,asOf:n.asOf,venues:n.venues.map(r=>({venue:r.venue,symbol:r.symbol,fundingRate:r.fundingRate,fundingIntervalHours:r.fundingIntervalHours,fundingAprPct:r.fundingAprPct,errors:r.errors})),fundingSpreads:n.fundingSpreads,widestFundingSpread:n.widestFundingSpread,execution:"read-only",exec:!1}}async function qI(e={}){try{let t=await Promise.all([Uc(e).catch(()=>({ok:!1})),Fc(e).catch(()=>({ok:!1})),Gc(e).catch(()=>({ok:!1}))]),n={binance:!!t[0]?.ok,okx:!!t[1]?.ok,bybit:!!t[2]?.ok};return{ok:Object.values(n).some(Boolean),provider:"cex-basis",upstream:n,execution:"read-only",exec:!1}}catch(t){return{ok:!1,provider:"cex-basis",error:String(t.message||t).slice(0,160)}}}var Gi,Jc,iy=O(()=>{uo();Wc();Xc();Ci();Gi=["binance","okx","bybit","hyperliquid"],Jc=1});var sy={};z(sy,{compoundHealth:()=>MI,compoundMarkets:()=>UI});async function UI(e={}){try{return((await C(`${BI}/ctoken`,e))?.cToken||[]).map(n=>({symbol:n?.symbol,underlying:n?.underlying_symbol,supplyApy:n?.supply_rate?.value?`${(Number(n.supply_rate.value)*100).toFixed(2)}%`:null,borrowApy:n?.borrow_rate?.value?`${(Number(n.borrow_rate.value)*100).toFixed(2)}%`:null,totalSupply:n?.total_supply?.value,totalBorrow:n?.total_borrows?.value,collateralFactor:n?.collateral_factor?.value?`${(Number(n.collateral_factor.value)*100).toFixed(0)}%`:null}))}catch(t){return{error:String(t.message||t).slice(0,200)}}}async function MI(){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 BI,ay=O(()=>{G();BI="https://api.compound.finance/api/v2"});var cy={};z(cy,{yearnHealth:()=>jI,yearnVaults:()=>FI});async function FI(e={}){try{return(await C(`${DI}/vaults/all`,e)||[]).map(n=>({name:n?.name,symbol:n?.symbol,apy:n?.apy?.net_apy?`${(Number(n.apy.net_apy)*100).toFixed(2)}%`:null,tvl:n?.tvl?.tvl_deposited,chain:n?.chainId,type:n?.type||"v2"}))}catch(t){return{error:String(t.message||t).slice(0,200)}}}async function jI(){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 DI,uy=O(()=>{G();DI="https://api.yearn.fi/v1"});var ly={};z(ly,{convexHealth:()=>VI,convexPools:()=>zI});async function zI(e={}){try{return(await C(`${HI}/pools`,e)||[]).map(n=>({name:n?.curvePool?.name||n?.name,curveApy:n?.curvePool?.apy?`${(Number(n.curvePool.apy)*100).toFixed(2)}%`:null,convexApy:n?.apy?`${(Number(n.apy)*100).toFixed(2)}%`:null,tvl:n?.tvl,boosted:n?.boosted||!1}))}catch(t){return{error:String(t.message||t).slice(0,200)}}}async function VI(){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 HI,dy=O(()=>{G();HI="https://api.convexfinance.com/api"});function In(e){if(!Number.isSafeInteger(e)||e<0||e>1e3)throw new RangeError("scale must be a safe integer from 0 through 1000")}function xt(e,t){if(typeof e!="bigint")throw new TypeError("mantissa must be a bigint");return In(t),Object.freeze({mantissa:e,scale:t})}function on(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`);In(e.scale)}function Ki(e){return In(e),10n**BigInt(e)}function V(e){if(typeof e!="string"||!/^[+-]?\d+(?:\.\d+)?$/.test(e))throw new TypeError("value must be a plain decimal string");let t=e.startsWith("-"),n=e[0]==="-"||e[0]==="+"?e.slice(1):e,[r,o=""]=n.split("."),i=`${r}${o}`,s=BigInt(i)*(t?-1n:1n);return xt(s,o.length)}function De(e,t){if(In(t),typeof e=="bigint")return xt(e,t);if(typeof e!="string"||!/^[+-]?\d+$/.test(e))throw new TypeError("value must be an integer string or bigint");return xt(BigInt(e),t)}function ut(e){on(e);let t=e.mantissa<0n,n=(t?-e.mantissa:e.mantissa).toString();if(e.scale===0)return`${t?"-":""}${n}`;let r=n.padStart(e.scale+1,"0"),o=r.length-e.scale;return`${t?"-":""}${r.slice(0,o)}.${r.slice(o)}`}function go(e,t){return on(e),In(t),t===e.scale?xt(e.mantissa,e.scale):t>e.scale?xt(e.mantissa*Ki(t-e.scale),t):xt(e.mantissa/Ki(e.scale-t),t)}function Zc(e,t){on(e,"left"),on(t,"right");let n=Math.max(e.scale,t.scale);return[go(e,n),go(t,n),n]}function sn(e,t){let[n,r,o]=Zc(e,t);return xt(n.mantissa+r.mantissa,o)}function bo(e,t){let[n,r,o]=Zc(e,t);return xt(n.mantissa-r.mantissa,o)}function Ye(e,t){on(e,"left"),on(t,"right");let n=e.scale+t.scale;return In(n),xt(e.mantissa*t.mantissa,n)}function lt(e,t,n=Math.max(e?.scale??0,t?.scale??0)){if(on(e,"left"),on(t,"right"),In(n),t.mantissa===0n)throw new RangeError("division by zero");let r=e.mantissa*Ki(t.scale+n),o=t.mantissa*Ki(e.scale);return xt(r/o,n)}function an(e,t){let[n,r]=Zc(e,t);return n.mantissa<r.mantissa?-1:n.mantissa>r.mantissa?1:0}var EB,nt=O(()=>{EB=Object.freeze({mantissa:10000n,scale:0})});import{existsSync as fy,readFileSync as WI}from"node:fs";import{dirname as py,join as eu}from"node:path";import{fileURLToPath as GI}from"node:url";function KI(e){let t=py(GI(e));for(let n=0;n<8;n+=1){let r=eu(t,"package.json");if(fy(r))try{let i=JSON.parse(WI(r,"utf8"));if(i&&typeof i.version=="string")return t}catch{}let o=py(t);if(o===t)break;t=o}throw new Error(`oracle: could not resolve package root from ${e}`)}function my(e,t){let n=KI(t),r=eu(n,e);return fy(r)?r:eu(n,"dist","assets",e)}var hy=O(()=>{});import{readFileSync as YI,existsSync as XI}from"node:fs";import{fileURLToPath as JI}from"node:url";import{dirname as QI,join as gy}from"node:path";function e_(){try{let e=my("equities-fixtures",import.meta.url);if(e&&XI(e))return e}catch{}return ZI}function n_(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function J(e,t){throw new TypeError(`Fixture fixtures/${e}: ${t}`)}function de(e,t,n){n_(e)||J(t,`${n} must be an object`)}function ee(e,t,n){(typeof e!="string"||e.length===0)&&J(t,`${n} must be a nonempty string`)}function kt(e,t,n){Number.isSafeInteger(e)||J(t,`${n} must be a safe integer`)}function cn(e,t,n){de(e,t,n);for(let[r,o]of Object.entries(e))ee(r,t,`${n} key`),de(o,t,`${n}.${r}`)}function r_(e,t){de(e,t,"root"),kt(e.capturedAt,t,"capturedAt"),de(e.venues,t,"venues");let n=[["hyperliquid_hip3","dexs"],["arcus","markets"],["arcus_spot","pairs"],["rh_uniswap","pools"],["rh_chainlink_oracles","assets"]];for(let[r,o]of n){let i=e.venues[r];de(i,t,`venues.${r}`),ee(i.type,t,`venues.${r}.type`),ee(i.chain,t,`venues.${r}.chain`),ee(i.tier,t,`venues.${r}.tier`),cn(i[o],t,`venues.${r}.${o}`)}for(let[r,o]of Object.entries(e.venues.hyperliquid_hip3.dexs))cn(o,t,`venues.hyperliquid_hip3.dexs.${r}`)}function o_(e,t){cn(e,t,"root"),Object.keys(e).length===0&&J(t,"root must not be empty");for(let[n,r]of Object.entries(e))Array.isArray(r.venues)||J(t,`${n}.venues must be an array`),r.venues.forEach((o,i)=>ee(o,t,`${n}.venues[${i}]`))}function i_(e,t){de(e,t,"root");for(let n of["chainId","block","oracleScaleExp","usdgDecimals","equityDecimals"])kt(e[n],t,n);ee(e.usdg,t,"usdg"),cn(e.assets,t,"assets");for(let[n,r]of Object.entries(e.assets))ee(r.oracle,t,`assets.${n}.oracle`),ee(r.token,t,`assets.${n}.token`),(typeof r.rawPrice!="string"||!/^\d+$/.test(r.rawPrice))&&J(t,`assets.${n}.rawPrice must be an integer string`),(typeof r.usd!="number"||!Number.isFinite(r.usd)||r.usd<0)&&J(t,`assets.${n}.usd must be a nonnegative finite source number`)}function s_(e,t){de(e,t,"root");for(let r of["holidayDayIndex","names","dates"])Array.isArray(e[r])||J(t,`${r} must be an array`);let n=e.holidayDayIndex.length;(e.names.length!==n||e.dates.length!==n)&&J(t,"holidayDayIndex, names, and dates must have equal lengths"),e.holidayDayIndex.forEach((r,o)=>kt(r,t,`holidayDayIndex[${o}]`)),e.names.forEach((r,o)=>ee(r,t,`names[${o}]`)),e.dates.forEach((r,o)=>{(typeof r!="string"||!/^\d{4}-\d{2}-\d{2}$/.test(r))&&J(t,`dates[${o}] must use YYYY-MM-DD`)})}function a_(e,t){de(e,t,"root"),(!Array.isArray(e.dstTransitions)||e.dstTransitions.length===0)&&J(t,"dstTransitions must be a nonempty array");let n=new Set;e.dstTransitions.forEach((r,o)=>{de(r,t,`dstTransitions[${o}]`);for(let i of["year","startUtc","endUtc"])kt(r[i],t,`dstTransitions[${o}].${i}`);r.startUtc>=r.endUtc&&J(t,`dstTransitions[${o}] startUtc must be before endUtc`),n.has(r.year)&&J(t,`dstTransitions contains duplicate year ${r.year}`),n.add(r.year)})}function c_(e,t){cn(e,t,"root"),Object.keys(e).length===0&&J(t,"root must not be empty");for(let[n,r]of Object.entries(e)){for(let o of["addr","quote","quoteAddr","dex","pair"])ee(r[o],t,`${n}.${o}`);(typeof r.liq!="number"||!Number.isFinite(r.liq)||r.liq<0)&&J(t,`${n}.liq must be a nonnegative finite source number`)}}function u_(e,t){de(e,t,"root"),kt(e.capturedAt,t,"capturedAt"),kt(e.block,t,"block"),kt(e.chainId,t,"chainId"),ee(e.gasPriceWei,t,"gasPriceWei"),ee(e.stateView,t,"stateView"),cn(e.pools,t,"pools"),Object.keys(e.pools).length===0&&J(t,"pools must not be empty");for(let[n,r]of Object.entries(e.pools)){for(let o of["pair","version","quote","token","sqrtPriceX96"])ee(r[o],t,`pools.${n}.${o}`);r.version!=="v3"&&r.version!=="v4"&&J(t,`pools.${n}.version must be v3 or v4`),typeof r.quoteIsToken0!="boolean"&&J(t,`pools.${n}.quoteIsToken0 must be a boolean`),(!/^[0-9]+$/.test(r.sqrtPriceX96)||BigInt(r.sqrtPriceX96)<=0n)&&J(t,`pools.${n}.sqrtPriceX96 must be a positive integer string`)}}function l_(e,t){de(e,t,"root"),kt(e.capturedAt,t,"capturedAt"),ee(e.source,t,"source"),de(e.books,t,"books"),Object.keys(e.books).length===0&&J(t,"books must not be empty");for(let[n,r]of Object.entries(e.books)){de(r,t,`books.${n}`),(!Array.isArray(r.bids)||!Array.isArray(r.asks))&&J(t,`books.${n} must have bids and asks arrays`);for(let[o,i]of r.bids.entries())de(i,t,`books.${n}.bids[${o}]`),ee(i.px,t,`books.${n}.bids[${o}].px`),ee(i.sz,t,`books.${n}.bids[${o}].sz`);for(let[o,i]of r.asks.entries())de(i,t,`books.${n}.asks[${o}]`),ee(i.px,t,`books.${n}.asks[${o}].px`),ee(i.sz,t,`books.${n}.asks[${o}].sz`)}}function d_(e,t){de(e,t,"root"),kt(e.capturedAt,t,"capturedAt"),ee(e.source,t,"source"),ee(e.chain,t,"chain"),cn(e.tokens,t,"tokens"),de(e.pairs,t,"pairs"),Object.keys(e.tokens).length===0&&J(t,"tokens must not be empty");for(let[n,r]of Object.entries(e.tokens)){ee(r.symbolRaw,t,`tokens.${n}.symbolRaw`),ee(r.mint,t,`tokens.${n}.mint`),Object.hasOwn(e.pairs,n)||J(t,`pairs.${n} is required for token ${n}`),(!Array.isArray(e.pairs[n])||e.pairs[n].length===0)&&J(t,`pairs.${n} must be a nonempty array`);for(let[o,i]of e.pairs[n].entries())de(i,t,`pairs.${n}[${o}]`),ee(i.pairAddress,t,`pairs.${n}[${o}].pairAddress`),ee(i.dexId,t,`pairs.${n}[${o}].dexId`),(typeof i.priceUsd!="number"||!Number.isFinite(i.priceUsd)||i.priceUsd<=0)&&J(t,`pairs.${n}[${o}].priceUsd must be a positive finite number`),(typeof i.liquidityUsd!="number"||!Number.isFinite(i.liquidityUsd)||i.liquidityUsd<0)&&J(t,`pairs.${n}[${o}].liquidityUsd must be a nonnegative finite number`)}}function p_(e,t){de(e,t,"root"),kt(e.capturedAt,t,"capturedAt"),ee(e.source,t,"source"),ee(e.chain,t,"chain"),e.chain!=="ton"&&J(t,'chain must be "ton"'),cn(e.tokens,t,"tokens"),de(e.pairs,t,"pairs"),Object.keys(e.tokens).length===0&&J(t,"tokens must not be empty");for(let[n,r]of Object.entries(e.tokens)){ee(r.symbolRaw,t,`tokens.${n}.symbolRaw`),ee(r.mint,t,`tokens.${n}.mint`),Object.hasOwn(e.pairs,n)||J(t,`pairs.${n} is required for token ${n}`),(!Array.isArray(e.pairs[n])||e.pairs[n].length===0)&&J(t,`pairs.${n} must be a nonempty array`);for(let[o,i]of e.pairs[n].entries())de(i,t,`pairs.${n}[${o}]`),ee(i.pairAddress,t,`pairs.${n}[${o}].pairAddress`),ee(i.dexId,t,`pairs.${n}[${o}].dexId`),(typeof i.priceUsd!="number"||!Number.isFinite(i.priceUsd)||i.priceUsd<=0)&&J(t,`pairs.${n}[${o}].priceUsd must be a positive finite number`),(typeof i.liquidityUsd!="number"||!Number.isFinite(i.liquidityUsd)||i.liquidityUsd<0)&&J(t,`pairs.${n}[${o}].liquidityUsd must be a nonnegative finite number`)}}function m_(e,t){let n=by[t],r=gy(e,n),o;try{o=YI(r,"utf8")}catch(s){throw s?.code==="ENOENT"?new Error(`Fixture fixtures/${n} is missing at ${r}`):new Error(`Fixture fixtures/${n} could not be read: ${s.message}`)}let i;try{i=JSON.parse(o)}catch(s){throw new SyntaxError(`Fixture fixtures/${n} contains invalid JSON: ${s.message}`)}return f_[t](i,n),i}function wy(e){if(e!==null&&typeof e=="object"&&!Object.isFrozen(e)){Object.freeze(e);for(let t of Object.values(e))wy(t)}return e}function tu({fixtureDir:e=t_}={}){if(typeof e!="string"||e.length===0)throw new TypeError("fixtureDir must be a nonempty path string");let t={};for(let n of Object.keys(by))t[n]=m_(e,n);return wy(t)}function Mt(){return yy??=tu(),yy}function Xe(){return Mt().venues}function Ey(){return Mt().universe}function Sy(){return Mt().oracles}function vy(){return Mt().nyseHolidays}function Ay(){return Mt().dstTransitions}function Yi(){return Mt().rhPoolState}function xy(){return Mt().solanaXstocks}function ky(){return Mt().tonXstocks}function Iy(){return Mt().hip3L2Books}var ZI,t_,by,f_,yy,dt=O(()=>{hy();ZI=gy(QI(JI(import.meta.url)),"fixtures");t_=e_(),by=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"});f_=Object.freeze({venues:r_,universe:o_,oracles:i_,nyseHolidays:s_,dstTransitions:a_,equityDexPools:c_,rhPoolState:u_,solanaXstocks:d_,tonXstocks:p_,hip3L2Books:l_})});function g_(){let e=Ay().dstTransitions.map(r=>({year:r.year,startMs:r.startUtc*ru,endMs:r.endUtc*ru}));e.sort((r,o)=>r.startMs-o.startMs);let t=e[0].year,n=e[e.length-1].year;return Object.freeze({rows:Object.freeze(e),firstYear:t,lastYear:n,coverageStartMs:Date.UTC(t,0,1),coverageEndMs:Date.UTC(n+1,0,1)})}function Ly(){return Oy??=g_(),Oy}function b_(){return nu===void 0&&(nu=new Set(vy().holidayDayIndex)),nu}function $y(e,t){if(!Number.isSafeInteger(e))throw new TypeError(`${t}: epochMs must be a safe integer number of milliseconds`)}function w_(e,t){let{coverageStartMs:n,coverageEndMs:r,firstYear:o,lastYear:i}=Ly();if(e<n||e>=r)throw new RangeError(`${t}: ${new Date(e).toISOString()} is outside DST fixture coverage (${o} through ${i}). Refusing to assume a UTC offset.`)}function E_(e){for(let t of Ly().rows)if(e>=t.startMs&&e<t.endMs)return!0;return!1}function S_(e){return E_(e)?y_:h_}function v_(e){let t=e+S_(e),n=Math.floor(t/_y),r=t-n*_y,o=new Date(t);return{dayIndex:n,minuteOfDay:Math.floor(r/Ty),msIntoDay:r,weekday:o.getUTCDay()}}function A_({dayIndex:e,weekday:t}){return t===0||t===6?!1:!b_().has(e)}function x_(e){return e<Cy?"dark":e<Ny?"extended":e<Ry?"core":e<Py?"extended":"dark"}function wo(e){$y(e,"sessionState"),w_(e,"sessionState");let t=v_(e);return A_(t)?x_(t.minuteOfDay):"dark"}function iu(e){return $y(e,"isDark"),wo(e)==="dark"}var ru,Ty,ou,_y,h_,y_,Cy,Ny,Ry,Py,RB,PB,Oy,nu,Xi=O(()=>{dt();ru=1e3,Ty=60*ru,ou=60*Ty,_y=24*ou,h_=-5*ou,y_=-4*ou,Cy=240,Ny=570,Ry=960,Py=1200,RB=Object.freeze([Cy,Ny,Ry,Py]),PB=Object.freeze(["core","extended","dark"])});function Qi(e,t){e.push(Object.freeze({venue:t.venue,symbol:t.symbol??null,reason:t.reason,evidence:t.evidence??null}))}function __(e){let t=e.raw?.vol24h;return!!(t===0||t===0||typeof t=="number"&&Number.isFinite(t)&&t<=0)}function O_(e){return!e.bid||!e.ask?!1:an(e.bid,e.ask)>0}function qy(e,t,n){return Number.isSafeInteger(e.capturedAt)?t-e.capturedAt>n:!1}function Zi(e,t={}){if(!Array.isArray(e))throw new TypeError("quotes must be an array");let n=t.nowMs??Date.now(),r=t.quoteFreshnessMs??k_,o=t.oracleFreshnessMs??I_,i=t.includeDormant===!0,s=[],a=[];for(let c of e){if(__(c)){i?s.push(Object.freeze({...c,staleData:!0})):Qi(a,{venue:c.venue,symbol:c.symbolRaw??c.symbol,reason:Ji.DORMANT_VENUE,evidence:{vol24h:c.raw?.vol24h??null}});continue}if(O_(c)){Qi(a,{venue:c.venue,symbol:c.symbolRaw??c.symbol,reason:Ji.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(qy(c,n,r)){Qi(a,{venue:c.venue,symbol:c.symbolRaw??c.symbol,reason:Ji.STALE_QUOTE,evidence:{capturedAt:c.capturedAt,nowMs:n,ageMs:n-c.capturedAt,freshnessMs:r}});continue}if(c.tier==="read-only"&&c.raw?.oracleRaw!==void 0){let u=wo(n),l=u==="core"?o:o*2;if(qy(c,n,l)){Qi(a,{venue:c.venue,symbol:c.symbolRaw??c.symbol,reason:Ji.STALE_ORACLE,evidence:{capturedAt:c.capturedAt,nowMs:n,session:u}});continue}}s.push(c)}return{survivors:s,excluded:a}}var Ji,k_,I_,su=O(()=>{nt();Xi();Ji=Object.freeze({DORMANT_VENUE:"dormant-venue",CROSSED_BOOK:"crossed-book",STALE_QUOTE:"stale-quote",STALE_ORACLE:"stale-oracle"}),k_=12e4,I_=6e5});function T_(e){if(typeof e!="number"||!Number.isFinite(e))throw new TypeError("value must be a finite number");let t=String(e);if(!t.includes("e")&&!t.includes("E"))return t;let[n,r]=t.split(/[eE]/),o=Number(r),i=n.startsWith("-"),s=i?n.slice(1):n,[a,c=""]=s.split("."),u=`${a}${c}`,l=a.length+o,d;return l<=0?d=`0.${"0".repeat(-l)}${u}`:l>=u.length?d=`${u}${"0".repeat(l-u.length)}`:d=`${u.slice(0,l)}.${u.slice(l)}`,`${i?"-":""}${d}`}function ve(e){return e==null?null:typeof e=="string"?V(e):typeof e!="number"||!Number.isFinite(e)?null:V(T_(e))}function pt(e,t){let n=ve(e);if(n===null)throw new TypeError(`${t} must be a finite source number`);return n}var _n=O(()=>{nt()});function oe(e,t){throw new TypeError(`${e} ${t}`)}function My(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function On(e,t){My(e)||oe(t,"must be an object")}function Dy(e,t,n){Object.hasOwn(e,t)||oe(`${n}.${t}`,"is required")}function dr(e,t){(typeof e!="string"||e.length===0)&&oe(t,"must be a nonempty string")}function Eo(e,t,n){t.has(e)||oe(n,`must be one of ${[...t].join(", ")}`)}function cu(e,t){(!Number.isSafeInteger(e)||e<0)&&oe(t,"must be a nonnegative safe integer")}function au(e,t,n=!1){e===null&&n||(My(e)||oe(t,"must be a fixed point value"),typeof e.mantissa!="bigint"&&oe(`${t}.mantissa`,"must be a bigint"),(!Number.isSafeInteger(e.scale)||e.scale<0)&&oe(`${t}.scale`,"must be a nonnegative safe integer"))}function es(e,t,n=!1){e===null&&n||On(e,t)}function Uy(e,t){On(e,t),dr(e.venue,`${t}.venue`),dr(e.reason,`${t}.reason`),q_.test(e.reason)||oe(`${t}.reason`,"must be a machine readable lower case code"),Object.hasOwn(e,"symbol")&&e.symbol!==null&&dr(e.symbol,`${t}.symbol`)}function Fe(e){On(e,"quote");for(let n of["venue","chain","instrument","tier","symbolRaw","symbol","side","requestedSize",...By,"costAccounted","capturedAt","blockOrSeq","raw"])Dy(e,n,"quote");dr(e.venue,"quote.venue"),!(typeof e.chain=="string"&&e.chain.length>0)&&!(Number.isSafeInteger(e.chain)&&e.chain>=0)&&oe("quote.chain","must be a nonempty string or nonnegative chain id"),Eo(e.instrument,C_,"quote.instrument"),Eo(e.tier,N_,"quote.tier"),dr(e.symbolRaw,"quote.symbolRaw"),dr(e.symbol,"quote.symbol"),Eo(e.side,R_,"quote.side"),au(e.requestedSize,"quote.requestedSize"),e.requestedSize.mantissa<0n&&oe("quote.requestedSize","must not be negative");let t=0;for(let n of $_)Object.hasOwn(e,n)&&(au(e[n],`quote.${n}`),t+=1);t===0&&oe("quote","must contain at least one of bid, ask, mid, mark");for(let n of By)au(e[n],`quote.${n}`,!0);if(typeof e.costAccounted!="boolean"&&oe("quote.costAccounted","must be a boolean"),e.costAccounted){for(let n of["fees","gasEstimate","priceImpact"])e[n]===null&&oe(`quote.${n}`,"cannot be unknown when costAccounted is true");e.instrument==="perp"&&e.fundingHourly===null&&oe("quote.fundingHourly","cannot be unknown when costAccounted is true for a perp")}return e.instrument==="spot"&&e.fundingHourly!==null&&oe("quote.fundingHourly","must be null for a spot quote"),cu(e.capturedAt,"quote.capturedAt"),e.blockOrSeq!==null&&!(typeof e.blockOrSeq=="string"&&e.blockOrSeq.length>0)&&!(Number.isSafeInteger(e.blockOrSeq)&&e.blockOrSeq>=0)&&oe("quote.blockOrSeq","must be null, a nonempty string, or a nonnegative safe integer"),On(e.raw,"quote.raw"),e}function ts(e){On(e,"rankResult");for(let t of["rankedOn","ranked","winner","runnersUp","improvementBps","sourcesAnswered","sourcesTried","failed","excluded","darkWindow","instrumentMix","bestPreparable"])Dy(e,t,"rankResult");return Eo(e.rankedOn,P_,"rankResult.rankedOn"),Array.isArray(e.ranked)||oe("rankResult.ranked","must be an array"),e.ranked.forEach((t,n)=>es(t,`rankResult.ranked[${n}]`)),es(e.winner,"rankResult.winner",!0),e.ranked.length===0&&e.winner!==null&&oe("rankResult.winner","must be null when ranked is empty"),e.ranked.length>0&&e.winner===null&&oe("rankResult.winner","must be present when ranked is not empty"),Array.isArray(e.runnersUp)||oe("rankResult.runnersUp","must be an array"),e.runnersUp.forEach((t,n)=>es(t,`rankResult.runnersUp[${n}]`)),e.improvementBps!==null&&!(typeof e.improvementBps=="number"&&Number.isFinite(e.improvementBps))&&oe("rankResult.improvementBps","must be a finite number or null"),cu(e.sourcesAnswered,"rankResult.sourcesAnswered"),cu(e.sourcesTried,"rankResult.sourcesTried"),e.sourcesAnswered>e.sourcesTried&&oe("rankResult.sourcesAnswered","must not exceed sourcesTried"),Array.isArray(e.failed)||oe("rankResult.failed","must be an array"),e.failed.forEach((t,n)=>Uy(t,`failed[${n}]`)),Array.isArray(e.excluded)||oe("rankResult.excluded","must be an array"),e.excluded.forEach((t,n)=>Uy(t,`excluded[${n}]`)),e.darkWindow!==null&&On(e.darkWindow,"rankResult.darkWindow"),Eo(e.instrumentMix,L_,"rankResult.instrumentMix"),es(e.bestPreparable,"rankResult.bestPreparable",!0),Object.hasOwn(e,"carry")&&e.carry!==null&&On(e.carry,"rankResult.carry"),e}var C_,N_,R_,P_,L_,$_,By,q_,Dt=O(()=>{C_=new Set(["spot","perp"]),N_=new Set(["read-only","quote-only","prepare","intent"]),R_=new Set(["buy","sell"]),P_=new Set(["net-of-cost","gross"]),L_=new Set(["homogeneous","heterogeneous"]),$_=["bid","ask","mid","mark"],By=["fees","gasEstimate","priceImpact","fundingHourly"],q_=/^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$/});function Fy(){return Xe().venues.arcus}function D_(){return Object.keys(Fy().markets).sort()}function F_({symbol:e,side:t="buy",sizeUsd:n=null}={}){if(typeof e!="string"||e.length===0)return null;let r=e.endsWith("-USD")?e.slice(0,-4):e,o=Fy().markets[r];if(!o)return null;let i=pt(o.mark,`${r}.mark`),s=ve(o.oracle),a=ve(o.fundingHourly),c=n===null?V("0"):n,u={venue:B_,chain:U_,instrument:"perp",tier:M_,symbolRaw:e,symbol:r,side:t,requestedSize:c,mark:i,fees:null,gasEstimate:null,priceImpact:null,fundingHourly:a,costAccounted:!1,capturedAt:Xe().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:ns,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),Fe(u)}function rs({side:e="buy",sizeUsd:t=null}={}){return D_().map(n=>F_({symbol:n,side:e,sizeUsd:t})).filter(n=>n!==null)}var B_,U_,M_,ns,uu=O(()=>{dt();_n();nt();Dt();B_="arcus_perp",U_="robinhood-4663",M_="quote-only",ns="0.00000480324074074"});function lu(e,t,n=8){if(e==null)throw new TypeError("hourlyFundingRate is required");if(!Number.isFinite(t)||t<0)throw new RangeError("horizonHours must be a nonnegative finite number");if(t===0)return V("0");let r=V(String(t)),o=De(10000n,0);return Ye(Ye(e,r),o)}function Hy(e,t,n={}){if(e.instrument!=="perp")return{model:"current-funding-held-constant",horizonHours:t,carryBps:V("0"),carryBpsDisplay:"0",confidence:"estimate",note:"spot has no funding carry"};let r=n.nowMs??Date.now(),o=n.applyDarkWindowLock===!0,i=e.fundingHourly;if(o&&i!==null){let a=j_(r,t),c=t-a,u=V(ns),l=lu(i,c),d=lu(u,a),f=Math.max(l.scale,d.scale),p={mantissa:l.mantissa*10n**BigInt(f-l.scale)+d.mantissa*10n**BigInt(f-d.scale),scale:f};return{model:"current-funding-held-constant",horizonHours:t,carryBps:p,carryBpsDisplay:ut(p),confidence:"estimate",darkHours:a,litHours:c,darkWindowRate:ns,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=lu(i,t);return{model:"current-funding-held-constant",horizonHours:t,carryBps:s,carryBpsDisplay:ut(s),confidence:"estimate",compounding:"ignored",compoundingErrorBoundNote:"simple sum; at 30d and 1e-5/h the ignored compound is under 0.5bp"}}function j_(e,t){if(t<=0)return 0;let n=0,r=Math.floor(t);for(let o=0;o<r;o+=1)iu(e+o*jy)&&(n+=1);return t>r&&iu(e+r*jy)&&(n+=t-r),n}var jy,XB,zy=O(()=>{nt();uu();Xi();jy=36e5,XB=24*365});function H_(e){return e.mid??e.mark??e.ask??e.bid??null}function z_(e){let t=H_(e);if(t===null)return null;let n=e.costAccounted===!0,r=V("0");e.fees!==null?r=sn(r,e.fees):n=!1,e.priceImpact!==null?r=sn(r,e.priceImpact):e.requestedSize&&e.requestedSize.mantissa>0n&&(n=!1),e.gasEstimate===null?n=!1:r=sn(r,e.gasEstimate);let o;if(e.fees!==null&&an(e.fees,V("1"))<0&&an(e.fees,V("0"))>=0){let i=sn(V("1"),e.fees);o=Ye(t,i),e.priceImpact!==null&&(o=sn(o,Ye(t,e.priceImpact)))}else o=sn(t,r);return{net:o,costAccounted:n,px:t}}function V_(e,t,n=null){return{venue:e.venue,chain:e.chain,instrument:e.instrument,tier:e.tier,symbol:e.symbol,symbolRaw:e.symbolRaw,side:e.side,price:t.px,net:t.net,costAccounted:t.costAccounted,fundingHourly:e.fundingHourly,carry:n,quote:e}}function W_(e,t){if(!e||!t||!e.costAccounted||!t.costAccounted||e.instrument!==t.instrument||e.net.mantissa===0n)return null;let n=bo(t.net,e.net);return lt(Ye(n,De(10000n,0)),t.net,4)}function os(e,t={}){if(!Array.isArray(e))throw new TypeError("quotes must be an array");let n=t.nowMs??e[0]?.capturedAt??Date.now(),r=e.length,o=e,i=[];if(!t.skipLiveness){let E=Zi(e,{nowMs:n});o=E.survivors,i=E.excluded}let s=e.length,a=[],c=t.horizonHours,u=Number.isFinite(c)&&c>0,l=[];for(let E of o){let g=z_(E);if(g===null)continue;let b=null;if(u&&E.instrument==="perp"&&(b=Hy(E,c,{nowMs:n}),b.carryBps!==null)){let v=sn(V("1"),lt(b.carryBps,De(10000n,0),12));g.net=Ye(g.net,v),g.costAccounted=!1}l.push(V_(E,g,b))}let d=l,f="homogeneous";if(u)f="heterogeneous",d=l;else{let E=l.filter(b=>b.instrument==="spot"),g=l.filter(b=>b.instrument==="perp");E.length>0&&g.length>0?(d=E.length>=g.length?E:g,f="homogeneous"):(d=l,f="homogeneous")}d.sort((E,g)=>{let b=an(E.net,g.net);return b!==0?b:E.venue<g.venue?-1:E.venue>g.venue?1:0});let p=d[0]??null,m=d.slice(1),y=d,h="gross";p&&p.costAccounted&&(m.length===0||m[0].costAccounted)&&(h="net-of-cost");let w=m.length===0?null:W_(p,m[0]),A=l.find(E=>E.tier==="prepare")??null,_=wo(n),S=_==="core"?null:{session:_,warning:_==="dark"?"market is dark; marks are not real price discovery":"extended session; thinner books and higher staleness risk"},k=null;u&&(k=G_(l));let x={rankedOn:h,ranked:y,winner:p,runnersUp:m,improvementBps:w===null?null:Number(ut(w)),sourcesAnswered:s,sourcesTried:r,failed:a,excluded:i,darkWindow:S,instrumentMix:f,bestPreparable:A,carry:p?.carry??null,breakEvenHorizonHours:k};return ts(x)}function G_(e){let t=e.filter(i=>i.instrument==="spot").sort((i,s)=>an(i.net,s.net))[0],n=e.filter(i=>i.instrument==="perp").sort((i,s)=>an(i.net,s.net))[0];if(!t||!n||n.fundingHourly===null)return null;let r=bo(t.net,n.net);if(r.mantissa===0n)return 0;let o=Ye(n.fundingHourly,n.price);if(o.mantissa===0n)return null;try{let i=lt(r,o,4),s=Number(ut(i));return!Number.isFinite(s)||s<0?null:s}catch{return null}}var du=O(()=>{su();zy();Xi();nt();Dt()});function pu(){return Yi()}function Z_(e){return{mantissa:e*e*10n**BigInt(pr)/J_,scale:pr}}function e1(e){let t=Z_(BigInt(e.sqrtPriceX96)),n=e.quote==="USDG"?6:18,r=18;if(e.quoteIsToken0){let o=lt(Ye(t,De(10n**BigInt(n),0)),De(10n**BigInt(r),0),pr);return o.mantissa===0n?null:lt(V("1"),o,pr)}return lt(Ye(t,De(10n**BigInt(r),0)),De(10n**BigInt(n),0),pr)}function t1(e){let t=Sy(),n=t.assets[e];return n?De(n.rawPrice,t.oracleScaleExp):null}function n1(e,t){if(e===null||t===null||e.mantissa<=0n||t.mantissa<=0n)return null;let n={...e};return lt(t,r1(n,t),pr)}function r1(e,t){let n=Math.max(e.scale,t.scale);return{mantissa:go(e,n).mantissa+go(t,n).mantissa,scale:n}}function o1(e){let t=pu(),n=Q_[e];return n?{wei:BigInt(t.gasPriceWei)*n,units:n,native:"ETH"}:null}function fu(){return Object.keys(pu().pools).sort()}function fr({symbol:e,side:t="buy",sizeUsd:n=null}={}){if(typeof e!="string"||e.length===0)throw new TypeError("symbol must be a nonempty string");let r=pu(),o=r.pools[e];if(!o)return null;let i=e1(o);if(i===null)return null;let s=ve(o.liqUsd),a=n===null?V("0"):n,c=o.feePpm===null||o.feePpm===void 0?null:lt(De(BigInt(o.feePpm),0),De(1000000n,0),8),u=a.mantissa===0n?V("0"):n1(s,a),l=o1(o.version),p={venue:K_,chain:Y_,instrument:"spot",tier:X_,symbolRaw:e,symbol:e,side:t,requestedSize:a,mid:i,fees:c,gasEstimate:null,priceImpact:u,fundingHourly:null,costAccounted:!1,capturedAt:r.capturedAt*1e3,blockOrSeq:r.block,raw:{fixture:"fixtures/rh_pool_state.json",pair:o.pair,version:o.version,sqrtPriceX96:o.sqrtPriceX96,quote:o.quote,quoteIsToken0:o.quoteIsToken0,liqUsd:o.liqUsd,gasNativeWei:l===null?null:l.wei.toString(),gasUnits:l===null?null:l.units.toString(),impactModel:"constant-product-estimate",notes:["price read live from chain 4663",o.version==="v4"?"v4 fee may be dynamic via hook and was not captured":"v3 fee tier is the pool static fee","gas known in native wei only, no ETH price captured to denominate it"]}},m=t1(e);return m!==null&&(p.referencePrice=m,p.referenceBasisBps=ut(lt(Ye(bo(i,m),De(10000n,0)),m,4))),Fe(p)}function Vy({side:e="buy",sizeUsd:t=null}={}){return fu().map(n=>fr({symbol:n,side:e,sizeUsd:t})).filter(n=>n!==null)}var K_,Y_,X_,J_,pr,Q_,mu=O(()=>{dt();_n();nt();Dt();K_="rh_uniswap",Y_=4663,X_="prepare",J_=1n<<192n,pr=18,Q_=Object.freeze({v3:180000n,v4:240000n})});function is(e={}){let{symbol:t,side:n="buy",sizeUsd:r=null,recipient:o,nowMs:i=Date.now()}=e;if(typeof t!="string"||!t)throw new TypeError("symbol is required");if(typeof o!="string"||!/^0x[0-9a-fA-F]{40}$/.test(o))throw new TypeError("recipient must be a 0x-prefixed 20 byte address");let s=fr({symbol:t,side:n,sizeUsd:r});if(s===null)throw new Error(`no RH Uniswap pool for ${t}`);if(s.tier!=="prepare")throw new Error(`route tier is ${s.tier}, only prepare tier can be prepared`);let a=i-s.capturedAt;if(a>Wy)throw new Error(`quote is stale (${a}ms old, bound ${Wy}ms); re-quote before preparing`);let u=Yi().pools[t],l=u.version==="v4"?s1:i1,d=l,f=n==="buy"?u.quoteAddr:u.token;return Object.freeze({artifactKind:"unsigned-tx",chainId:4663,to:l,data:"0x",value:"0",requiresApproval:{spender:d,token:f,amount:null},requiresWalletSignature:!0,backendSigner:!1,unsigned:!0,houseSigned:!1,quoteRef:{venue:s.venue,symbol:s.symbol,symbolRaw:s.symbolRaw,capturedAt:s.capturedAt,blockOrSeq:s.blockOrSeq,mid:s.mid,version:u.version,pair:u.pair},quoteAgeMs:a,recipient:o,side:n,notes:["prepare-only: user wallet must sign","calldata encoding is deferred; this artifact is the bound intent",u.version==="v4"?"V4 route via PoolManager":"V3 route via SwapRouter (address not yet pinned)"]})}var Wy,i1,s1,hu=O(()=>{mu();dt();Wy=12e4,i1="0x0000000000000000000000000000000000000000",s1="0x84b75b19A3cdf8E2F56d0507d22D442847B2053C"});function So(){return Xe().venues.hyperliquid_hip3}function Gy(){return Object.keys(So().dexs).sort()}function l1(){let e=[];for(let[t,n]of Object.entries(So().dexs))for(let r of Object.keys(n))e.push(`${t}:${r}`);return e.sort()}function d1(e){if(typeof e!="string"||e.length===0)return[];let t=e.indexOf(":");if(t>0){let r=e.slice(0,t),o=e.slice(t+1),i=So().dexs[r]?.[o];return i?[{dex:r,ticker:o,market:i}]:[]}let n=[];for(let[r,o]of Object.entries(So().dexs))Object.hasOwn(o,e)&&n.push({dex:r,ticker:e,market:o[e]});return n}function p1(e,t){try{return Iy().books[`${e}:${t}`]??null}catch{return null}}function f1(e,t,n){if(!e||n===null||n.mantissa<=0n)return null;let r=t==="buy"?e.asks:e.bids;if(!r||r.length===0)return null;let o=Number(ut(n));if(!Number.isFinite(o)||o<=0)return null;let i=0,s=0,a=0;for(let c of r){let u=Number(c.px),l=Number(c.sz);if(!(u>0)||!(l>0))continue;let d=u*l,f=Math.min(o,d),p=f/u;if(i+=f,s+=p,o-=f,a+=1,o<=1e-9)break}return s<=0?null:{vwap:i/s,filledUsd:i,unfilledUsd:Math.max(0,o),levelsUsed:a}}function m1(e,t,n,r){let o=f1(e,t,n);if(!o)return{impact:null,depth:null};let i=Number(ut(r));if(!(i>0))return{impact:null,depth:o};let s=t==="buy"?(o.vwap-i)/i:(i-o.vwap)/i,a=Math.max(0,s);return{impact:ve(Number(a.toPrecision(12))),depth:{...o,impactFraction:a,fullyFilled:o.unfilledUsd<=1e-6}}}function Ky({dex:e,ticker:t,market:n,side:r,size:o}){let i=pt(n.mark,`${e}:${t}.mark`),s=ve(n.fundingHourly),a=ve(n.vol24h),c=ve(n.oi),u=o===null?V("0"):o,l=p1(e,t),d=null,f=null,p="fees and gas not captured";if(u.mantissa>0n)if(l){let h=m1(l,r,u,i);d=h.impact,f=h.depth,f?.fullyFilled?p="impact measured from l2Book; fees and gas still not captured":p="book walked but size exceeds visible depth; fees and gas not captured"}else p="no order book depth wired for this coin; fees and gas not captured";else l?p="zero size; fees and gas not captured":p="no order book depth wired for this coin; fees and gas not captured";let y={venue:a1,chain:c1,instrument:"perp",tier:u1,symbolRaw:`${e}:${t}`,symbol:t,side:r,requestedSize:u,mark:i,fees:null,gasEstimate:null,priceImpact:d,fundingHourly:s,costAccounted:!1,capturedAt:Xe().capturedAt*1e3,blockOrSeq:null,raw:{fixture:"fixtures/venues.json#venues.hyperliquid_hip3",dex:e,ticker:t,vol24h:n.vol24h,oi:n.oi,fundingAnnPct:n.fundingAnnPct,maxLev:n.maxLev,reasonCostUnknown:p,hasL2Book:l!==null,l2BookFixture:l?"fixtures/hip3_l2books.json":null,depth:f}};return a!==null&&(y.raw.vol24hFixed=a),c!==null&&(y.raw.oiFixed=c),l?.bids?.[0]&&l?.asks?.[0]&&(y.bid=V(String(l.bids[0].px)),y.ask=V(String(l.asks[0].px))),Fe(y)}function Yy({symbol:e,side:t="buy",sizeUsd:n=null}={}){let r=d1(e);return r.length===0||r.length>1?null:Ky({...r[0],side:t,size:n})}function ss({side:e="buy",sizeUsd:t=null,ticker:n=null}={}){let r=[];for(let o of l1()){let[i,s]=o.split(":");if(n!==null&&s!==n)continue;let a=So().dexs[i][s];r.push(Ky({dex:i,ticker:s,market:a,side:e,size:t}))}return r}var a1,c1,u1,Xy=O(()=>{dt();_n();nt();Dt();a1="hyperliquid_hip3",c1="hyperliquid",u1="quote-only"});function Jy(){return Xe().venues.arcus_spot}function b1(){return Object.keys(Jy().pairs).sort()}function w1({symbol:e,side:t="buy",sizeUsd:n=null}={}){if(typeof e!="string"||e.length===0)return null;let r=Jy().pairs[e];if(!r)return null;let o=r.bid===void 0||r.bid===null?null:pt(r.bid,`${e}.bid`),i=r.ask===void 0||r.ask===null?null:pt(r.ask,`${e}.ask`),s=ve(r.last),a=null;if(o!==null&&i!==null){a={mantissa:o.mantissa+i.mantissa,scale:o.scale===i.scale?o.scale+1:Math.max(o.scale,i.scale)+1};let d=Math.max(o.scale,i.scale),f=o.scale===d?o.mantissa:o.mantissa*10n**BigInt(d-o.scale),p=i.scale===d?i.mantissa:i.mantissa*10n**BigInt(d-i.scale);a={mantissa:f+p,scale:d+1},a={mantissa:(f+p)/2n,scale:d}}else s!==null&&(a=s);if(o===null&&i===null&&a===null)return null;let c=n===null?V("0"):n,u=V("0"),l={venue:h1,chain:y1,instrument:"spot",tier:g1,symbolRaw:e,symbol:e,side:t,requestedSize:c,fees:u,gasEstimate:null,priceImpact:null,fundingHourly:null,costAccounted:!1,capturedAt:Xe().capturedAt*1e3,blockOrSeq:null,raw:{fixture:"fixtures/venues.json#venues.arcus_spot",last:r.last,bid:r.bid,ask:r.ask,vol24h:r.vol24h,feeKnownZero:!0,reasonCostUnknown:"gas and impact at size not captured; fee is a known zero"}};return o!==null&&(l.bid=o),i!==null&&(l.ask=i),a!==null&&(l.mid=a),Fe(l)}function as({side:e="buy",sizeUsd:t=null}={}){return b1().map(n=>w1({symbol:n,side:e,sizeUsd:t})).filter(n=>n!==null)}var h1,y1,g1,Qy=O(()=>{dt();_n();nt();Dt();h1="arcus_spot",y1="robinhood-4663",g1="quote-only"});function cs(){return xy()}function yu(){return Object.keys(cs().tokens).sort()}function A1(e){let t=cs().pairs[e];return!t||t.length===0?null:[...t].sort((n,r)=>(r.liquidityUsd??0)-(n.liquidityUsd??0))[0]}function x1(e,t){if(e===null||t===null)return null;if(e.mantissa<=0n||t.mantissa<=0n)return V("0");let n=Math.max(e.scale,t.scale),r=e.scale===n?e.mantissa:e.mantissa*10n**BigInt(n-e.scale),o=t.scale===n?t.mantissa:t.mantissa*10n**BigInt(n-t.scale),i=o*10n**6n,s=r+o;return{mantissa:i/s,scale:6}}function gu({symbol:e,side:t="buy",sizeUsd:n=null}={}){if(typeof e!="string"||e.length===0)return null;let r=e,o=e,i=cs().tokens;if(Object.hasOwn(i,e))r=e,o=i[e].symbolRaw;else if(e.endsWith("x")||e.endsWith("X")){let m=e.slice(0,-1).toUpperCase();if(Object.hasOwn(i,m))r=m,o=i[m].symbolRaw;else return null}else return null;let s=i[r],a=A1(r);if(!s||!a)return null;let c=pt(a.priceUsd,`${r}.priceUsd`),u=ve(a.liquidityUsd),l=n===null?V("0"):n,d=l.mantissa===0n?V("0"):x1(u,l),f=!1;l.mantissa===0n&&(a.liquidityUsd??0)>=Zy&&(f=!1);let p={venue:E1,chain:S1,instrument:"spot",tier:v1,symbolRaw:o,symbol:r,side:t,requestedSize:l,mid:c,fees:null,gasEstimate:null,priceImpact:d,fundingHourly:null,costAccounted:f,capturedAt:cs().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)<Zy}};return Fe(p)}function eg({side:e="buy",sizeUsd:t=null}={}){return yu().map(n=>gu({symbol:n,side:e,sizeUsd:t})).filter(n=>n!==null)}var E1,S1,v1,Zy,tg=O(()=>{dt();_n();nt();Dt();E1="solana_xstocks",S1="solana",v1="quote-only",Zy=25e3});function us(){return ky()}function bu(){return Object.keys(us().tokens).sort()}function C1(e){let t=us().pairs[e];return!t||t.length===0?null:[...t].sort((n,r)=>(r.liquidityUsd??0)-(n.liquidityUsd??0))[0]}function N1(e,t){if(e===null||t===null)return null;if(e.mantissa<=0n||t.mantissa<=0n)return V("0");let n=Math.max(e.scale,t.scale),r=e.scale===n?e.mantissa:e.mantissa*10n**BigInt(n-e.scale),o=t.scale===n?t.mantissa:t.mantissa*10n**BigInt(n-t.scale),i=o*10n**6n,s=r+o;return{mantissa:i/s,scale:6}}function wu({symbol:e,side:t="buy",sizeUsd:n=null}={}){if(typeof e!="string"||e.length===0)return null;let r=e,o=e,i=us().tokens;if(Object.hasOwn(i,e))r=e,o=i[e].symbolRaw;else if(e.endsWith("x")||e.endsWith("X")){let m=e.slice(0,-1).toUpperCase();if(Object.hasOwn(i,m))r=m,o=i[m].symbolRaw;else return null}else{let m=e.toUpperCase();if(Object.hasOwn(i,m))r=m,o=i[m].symbolRaw;else return null}let s=i[r],a=C1(r);if(!s||!a)return null;let c=pt(a.priceUsd,`${r}.priceUsd`),u=ve(a.liquidityUsd),l=n===null?V("0"):n,d=l.mantissa===0n?V("0"):N1(u,l),p={venue:k1,chain:I1,instrument:"spot",tier:_1,symbolRaw:o,symbol:r,side:t,requestedSize:l,mid:c,fees:null,gasEstimate:null,priceImpact:d,fundingHourly:null,costAccounted:!1,capturedAt:us().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)<O1,impactSizeFractionHint:T1}};return Fe(p)}function ng({side:e="buy",sizeUsd:t=null}={}){return bu().map(n=>wu({symbol:n,side:e,sizeUsd:t})).filter(n=>n!==null)}var k1,I1,_1,O1,T1,rg=O(()=>{dt();_n();nt();Dt();k1="ton_stonfi",I1="ton",_1="quote-only",O1=25e3,T1=.01});var ls={};z(ls,{bestEquityRoute:()=>R1,collectEquityQuotes:()=>ig,equityVenues:()=>P1,getUniverse:()=>Ey,getVenues:()=>Xe,loadFixtures:()=>tu,prepareEquity:()=>is,prepareEquityRoute:()=>L1,rankEquityQuotes:()=>os,toJsonSafe:()=>$1,validateQuote:()=>Fe,validateRankResult:()=>ts});function Eu(e){return e==null||e===""?null:typeof e=="object"&&e&&typeof e.mantissa=="bigint"?e:V(String(e))}function ig(e,{sizeUsd:t=null}={}){if(typeof e!="string"||!e.trim())throw new TypeError("ticker is required");let n=e.trim().toUpperCase(),r=Eu(t),o=[],i=Yy({symbol:`xyz:${n}`,sizeUsd:r});if(i)o.push(i);else for(let u of ss({ticker:n,sizeUsd:r}))o.push(u);for(let u of rs({sizeUsd:r}))u.symbol===n&&o.push(u);for(let u of as({sizeUsd:r}))u.symbol===n&&o.push(u);let s=fr({symbol:n,sizeUsd:r});s&&o.push(s);let a=gu({symbol:n,sizeUsd:r});a&&o.push(a);let c=wu({symbol:n,sizeUsd:r});return c&&o.push(c),o}function R1(e={}){let t=String(e.ticker||e.symbol||"").trim().toUpperCase();if(!t)throw new Error("bestEquityRoute requires ticker");let n=Eu(e.sizeUsd??e.size??null),r=ig(t,{sizeUsd:n});if(r.length===0)return{ticker:t,rankedOn:"gross",ranked:[],winner:null,runnersUp:[],improvementBps:null,sourcesAnswered:0,sourcesTried:0,failed:[],excluded:[],bestPreparable:null,instrumentMix:"homogeneous",note:"no venue answered for this ticker in the pinned fixture capture"};let o=r[0].capturedAt,i=String(o).length<=10?o*1e3:o,s=e.nowMs==null,a=e.nowMs??o+1e3,c=Math.max(0,Date.now()-i),u=os(r,{nowMs:a,horizonHours:e.horizonHours!=null?Number(e.horizonHours):void 0,skipLiveness:e.skipLiveness===!0});return{ticker:t,...u,dataSource:s?"fixture":"caller-clock",capturedAt:i,ageMs:c,stale:c>og}}function P1(){let e=[{venue:"hyperliquid_hip3",tier:"quote-only",chain:"hyperliquid",n:ss().length},{venue:"arcus_perp",tier:"quote-only",chain:"robinhood-4663",n:rs().length},{venue:"arcus_spot",tier:"quote-only",chain:"robinhood-4663",n:as().length},{venue:"rh_uniswap",tier:"prepare",chain:4663,n:fu().length},{venue:"solana_xstocks",tier:"quote-only",chain:"solana",n:yu().length},{venue:"ton_stonfi",tier:"quote-only",chain:"ton",n:bu().length}],t=[...ss(),...rs(),...as(),...Vy(),...eg(),...ng()],n=(t[0]?.capturedAt??Date.now())+1e3,{survivors:r,excluded:o}=Zi(t,{nowMs:n});return{inventory:e,hip3Dexs:Gy(),liveness:{survivors:r.length,excluded:o.length,byReason:o.reduce((i,s)=>(i[s.reason]=(i[s.reason]??0)+1,i),{})},capturedAt:Xe().capturedAt,custody:"prepare-only",note:"quote-only venues are ranked for discovery; only rh_uniswap is preparable in v1"}}function L1(e={}){let t=String(e.ticker||e.symbol||"").trim().toUpperCase(),n=e.recipient||e.taker;if(!t)throw new Error("prepareEquityRoute requires ticker");if(!n)throw new Error("prepareEquityRoute requires recipient (signing wallet)");let r=Eu(e.sizeUsd??e.size??null),o=fr({symbol:t,sizeUsd:r});if(!o)return{ok:!1,failureKind:"no-prepare-path",ticker:t,note:"no RH Uniswap prepare-tier route for this ticker in fixtures"};try{let i=String(o.capturedAt).length<=10?o.capturedAt*1e3:o.capturedAt,s=e.nowMs!=null,a=s?Number(e.nowMs):Date.now(),c=Math.max(0,Date.now()-i),u=is({symbol:t,sizeUsd:r,recipient:n,nowMs:a});return{ok:!0,ticker:t,artifact:u,bestPreparableVenue:"rh_uniswap",dataSource:s?"caller-clock":"live-clock",capturedAt:i,ageMs:c,stale:c>og}}catch(i){return{ok:!1,failureKind:"prepare-refused",ticker:t,error:String(i.message||i)}}}function $1(e){return JSON.parse(JSON.stringify(e,(t,n)=>typeof n=="bigint"?n.toString():n))}var og,ds=O(()=>{nt();du();hu();su();Xy();Qy();uu();mu();tg();rg();dt();du();hu();Dt();dt();og=3600*1e3});var ps={};z(ps,{CHAIN_CONFIGS:()=>Zt,EVIDENCE:()=>F,RISK:()=>U,SCANNER_CAPABILITIES:()=>qn,__clearScanners:()=>pE,createScanner:()=>dd,getScanner:()=>ya,listScanners:()=>pd,registerBuiltinScanners:()=>Ai,registerCustomChain:()=>Cp,registerScanner:()=>ei,scannerCoverage:()=>fE,validateScanner:()=>ld});var fs=O(()=>{Xt();Vr()});var Au={};z(Au,{createWatch:()=>D1,listWatches:()=>M1,removeWatch:()=>F1});import vo from"node:fs";import Su from"node:path";import{randomUUID as q1}from"node:crypto";import{homedir as B1}from"node:os";function U1(e=process.env){return e.ORACLE_CONFIG_DIR||Su.join(B1(),".config","oracle")}function sg(e=process.env){return Su.join(U1(e),"watches.json")}function vu(e=process.env){let t=sg(e);if(!vo.existsSync(t))return{watches:[]};try{let n=JSON.parse(vo.readFileSync(t,"utf8"));return{watches:Array.isArray(n.watches)?n.watches:[]}}catch{return{watches:[]}}}function ag(e,t=process.env){let n=sg(t);vo.mkdirSync(Su.dirname(n),{recursive:!0,mode:448});let r=`${n}.${process.pid}.tmp`;vo.writeFileSync(r,`${JSON.stringify(e,null,2)}
9
+ `,{mode:384}),vo.renameSync(r,n)}function M1(e=process.env){return vu(e).watches}function D1({chain:e,token:t,condition:n,note:r}={},o=process.env){if(!e||!t||!n)throw new Error("watch requires chain, token, condition");let i={id:q1(),chain:String(e),token:String(t),condition:String(n),note:r?String(r):null,actionMode:"alert_only",createdAt:new Date().toISOString()},s=vu(o);return s.watches.push(i),ag(s,o),i}function F1(e,t=process.env){let n=vu(t),r=n.watches.filter(o=>o.id!==e);return r.length===n.watches.length?!1:(ag({watches:r},t),!0)}var xu=O(()=>{});var cg={};z(cg,{classifyReceipt:()=>j1});function j1(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 ug=O(()=>{});function G1(e){return!(W1.has(e)||/^0x/i.test(e)||!/\d/.test(e)&&e===e.toLowerCase()||!/\d/.test(e)&&e===e.toUpperCase())}function lg(e,{extras:t=[]}={}){let n=[e,...t].map(i=>String(i||"")).join(`
10
+ `),r=[...new Set((n.match(H1)||[]).map(i=>i.toLowerCase()))].filter(i=>!V1.has(i)),o=[...new Set(n.match(z1)||[])].filter(G1);return{evm:r,solana:o,all:[...r.map(i=>({chainFamily:"evm",address:i})),...o.map(i=>({chainFamily:"solana",address:i}))]}}function dg(e){let t=String(e||"").trim();if(!t)return[];let n=[],r=o=>{if(!o||typeof o!="object")return;let i=String(o.id||o.id_str||o.tweetId||o.statusId||""),s=o.text||o.full_text||o.fullText||o.body||o.note_tweet?.text||"",a=[],c=o.entities?.urls||o.entities?.Urls||[];for(let u of c)u?.expanded_url&&a.push(u.expanded_url),u?.url&&a.push(u.url);(i||s)&&n.push({id:i,text:String(s),urls:a,raw:o})};try{let o=JSON.parse(t),i=Array.isArray(o)?o:o.data?Array.isArray(o.data)?o.data:[o.data]:o.tweets||o.statuses||o.results||[];Array.isArray(i)?i.forEach(r):r(o)}catch{for(let o of t.split(`
11
+ `)){let i=o.trim();if(i.startsWith("{"))try{r(JSON.parse(i))}catch{}}n.length||n.push({id:"",text:t,urls:[]})}return n}var H1,z1,V1,W1,pg=O(()=>{H1=/\b0x[a-fA-F0-9]{40}\b/g,z1=/\b[1-9A-HJ-NP-Za-km-z]{32,44}\b/g,V1=new Set(["0x0000000000000000000000000000000000000000","0x000000000000000000000000000000000000dead","0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee"].map(e=>e.toLowerCase())),W1=new Set(["So11111111111111111111111111111111111111112","EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v","Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB","11111111111111111111111111111111"])});import{spawnSync as K1}from"node:child_process";import fg from"node:fs";import ku from"node:path";function Q1(e=process.env){let t=String(e.ORACLE_XURL_ENABLED||"").trim().toLowerCase();return t==="1"||t==="true"||t==="yes"||t==="on"}function yg(e=process.env){let t=String(e.ORACLE_XURL_ALLOW_WRITE||"").trim().toLowerCase();return t==="1"||t==="true"||t==="yes"||t==="on"}function Z1(e=process.env){let t=String(e.ORACLE_XURL_BIN||"").trim();if(t)return ku.isAbsolute(t)?fg.existsSync(t)?{ok:!0,bin:t}:{ok:!1,error:`ORACLE_XURL_BIN not found: ${t}`}:{ok:!1,error:"ORACLE_XURL_BIN must be absolute"};let n=String(e.PATH||process.env.PATH||"");for(let r of n.split(ku.delimiter)){if(!r)continue;let o=ku.join(r,"xurl");try{if(fg.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 eO(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 tO(e){for(let t of e){let n=String(t);if(hg.includes(n))return n;if(hg.some(r=>r.startsWith("--")&&n.startsWith(`${r}=`)))return n.split("=")[0]}return null}function nO(e={},t=process.env){let n;if(Array.isArray(e.argv))n=e.argv.map(c=>String(c));else{let c=String(e.command||e.cmd||"").trim();if(!c)return{ok:!1,error:"command is required (e.g. whoami, search, read, post)"};let u=Array.isArray(e.args)?e.args.map(l=>String(l)):typeof e.query=="string"?[e.query]:typeof e.text=="string"?[e.text]:typeof e.id=="string"?[e.id]:typeof e.handle=="string"?[e.handle]:[];c==="search"&&e.limit!=null&&u.push("-n",String(Math.min(50,Math.max(1,Number(e.limit)||10)))),(c==="timeline"||c==="mentions")&&e.limit!=null&&u.push("-n",String(Math.min(50,Math.max(1,Number(e.limit)||10)))),n=[c,...u]}if(n.length===0)return{ok:!1,error:"empty argv"};if(n.length>24)return{ok:!1,error:"too many arguments"};for(let c of n)if(String(c).length>4e3)return{ok:!1,error:"argument too long"};let r=tO(n);if(r)return{ok:!1,error:`forbidden flag: ${r}`};if(n.some(c=>String(c).includes("\0")))return{ok:!1,error:"nul byte in argv"};let o=String(n[0]||"").replace(/^\//,"");if(o.startsWith("2/")||n[0].startsWith("/2/")||n[0].startsWith("https://api.x.com/")){if(!yg(t)&&n.some(c=>/^-X$/.test(c)||/^--request$/.test(c))){let c=n.findIndex(l=>l==="-X"||l==="--request"),u=String(n[c+1]||"GET").toUpperCase();if(u!=="GET"&&u!=="HEAD")return{ok:!1,error:"raw non-GET requires ORACLE_XURL_ALLOW_WRITE=true"}}}else if(o==="auth"){if(String(n[1]||"")!=="status")return{ok:!1,error:"only `auth status` is allowed (no apps add / oauth2 from the agent)"}}else if(!X1.includes(o))if(J1.includes(o)){if(!yg(t))return{ok:!1,error:`write command '${o}' requires ORACLE_XURL_ALLOW_WRITE=true`}}else return o==="media"?{ok:!1,error:"media upload is disabled in the agent tool (run xurl media outside the agent)"}:{ok:!1,error:`command not allowlisted: ${o}`};let i=[...n],s=String(t.ORACLE_XURL_APP||"").trim(),a=String(t.ORACLE_XURL_USER||"").trim();if(s&&!i.includes("--app")&&i.unshift("--app",s),a&&!i.includes("--username")&&!i.includes("-u")){let c=0;i[0]==="--app"&&(c=2),c<i.length&&i.splice(c+1,0,"-u",a)}return{ok:!0,argv:i,command:o}}async function gg(e,t={},n={}){if(e!=="xurl")return{ok:!1,error:`unknown tool: ${e}`};let r=n.env||process.env;if(!Q1(r))return{ok:!1,error:"xurl is disabled. Set ORACLE_XURL_ENABLED=true after `xurl auth status` succeeds. Writes stay off until ORACLE_XURL_ALLOW_WRITE=true."};let o=nO(t,r);if(!o.ok)return o;let i=Z1(r);if(!i.ok)return i;let a=(n.spawnFn||K1)(i.bin,o.argv,{encoding:"utf8",timeout:n.timeoutMs||mg,maxBuffer:1024*1024,env:eO(r)});if(a.error){let d=a.error.code==="ETIMEDOUT"?`xurl timed out after ${n.timeoutMs||mg}ms`:String(a.error.message||a.error);return{ok:!1,error:pn(d,{force:!0})}}let c=pn(String(a.stdout||"").slice(0,Y1),{force:!0}),u=pn(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 mg,Y1,X1,J1,hg,u6,bg=O(()=>{zs();mg=45e3,Y1=4e4,X1=Object.freeze(["whoami","user","read","search","timeline","mentions","bookmarks","likes","following","followers","dms","auth"]),J1=Object.freeze(["post","reply","quote","delete","like","unlike","repost","unrepost","bookmark","unbookmark","follow","unfollow","block","unblock","mute","unmute","dm"]),hg=Object.freeze(["--verbose","-v","--trace","-t","--bearer-token","--consumer-key","--consumer-secret","--access-token","--token-secret","--client-id","--client-secret"]);u6=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 sO(e){return!e||e==="0x"||e===iO}async function wg(e={},t={}){let n=t.rpcCall||te,r=String(e.address||"").trim().toLowerCase(),o=Number(e.chainId);if(!/^0x[a-f0-9]{40}$/.test(r))return{status:"error",error:"address must be a 0x-prefixed EVM address",risk:"unknown-risk",findings:[],notes:[]};if(!Number.isInteger(o))return{status:"error",error:"chainId is required",risk:"unknown-risk",findings:[],notes:[]};let i;try{i=await n(o,"eth_getCode",[r,"latest"],t)}catch(y){return{address:r,chainId:o,status:"unavailable",error:y?.message||"eth_getCode failed",risk:"unknown-risk",findings:[],isProxy:!1,codeSize:0,notes:["could not read contract code; treat as unverified"]}}if(!i||i==="0x")return{address:r,chainId:o,status:"ok",risk:"high",findings:[{selector:"-",name:"no-code",weight:"high",note:"no contract deployed at this address"}],isProxy:!1,codeSize:0,notes:["nothing is deployed here \u2014 an approval or transfer to this address is unrecoverable"]};let s=[],a=[],c=i.slice(2).toLowerCase();for(let[y,h]of Object.entries(rO))c.includes(y)&&a.push({selector:`0x${y}`,...h});let u=!1,l=null,d=null,f=await Promise.all(oO.map(async({label:y,slot:h})=>{try{let w=await n(o,"eth_getStorageAt",[r,h,"latest"],t);return{label:y,word:w,error:null}}catch{return{label:y,word:null,error:`proxy slot (${y}) unreadable; proxy status uncertain`}}}));for(let y of f)y.error&&s.push(y.error),!u&&y.word&&!sO(y.word)&&(u=!0,l=y.label,d=`0x${String(y.word).slice(-40)}`);u&&(a.push({selector:l,name:"proxy",weight:"high",note:"implementation is upgradeable \u2014 current behaviour is not a guarantee"}),s.push(`bytecode scan covers the proxy (${l}), not the implementation ${d} it delegates to`));let m=a.filter(y=>y.weight==="high").length>0?"high":a.length>0?"elevated":"unknown-risk";return m==="unknown-risk"&&s.push("no owner-power selectors found; this is weak evidence, not a safety guarantee"),{address:r,chainId:o,status:"ok",risk:m,findings:a,isProxy:u,proxyStandard:l,implementation:d,codeSize:Math.floor(c.length/2),notes:s}}var rO,oO,iO,Eg=O(()=>{ot();rO=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"}}),oO=Object.freeze([{label:"eip1967",slot:"0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc"},{label:"zeppelinos",slot:"0x7050c9e0f4ca769c69bd3a8ef740bc37934f8e2c036e5a723fd8ee048ed3f8c3"},{label:"eip1822",slot:"0xc5f16f0fcc639fa48a6947836d9850f504798523bf8c9a3a87d5876cf622bcf7"}]),iO=`0x${"0".repeat(64)}`});function ms(e,t){let n=String(e||"").trim();if(!aO.test(n))throw new Error(`evm-token-sniper: ${t} must be a 0x EVM address`);return n}function Iu(e,t){let n=String(e??"").trim();if(!/^\d+$/.test(n)||BigInt(n)<=0n)throw new Error(`evm-token-sniper: ${t} must be a positive raw integer amount`);return n}function Ao(e,t){return e==null||e===""?null:Iu(e,t)}function uO({chainId:e,tokenAddress:t,tokenIn:n,amountIn:r,recipient:o,quote:i,topPool:s,unsignedTx:a,args:c,opts:u}){let l=a?.tx;if(!l||typeof l!="object")throw new Error("local-signer envelope requires unsigned tx object");let d=ms(l.to,"prepared destination"),f=String(l.data||"").toLowerCase();if(!/^0x[0-9a-f]+$/.test(f))throw new Error("local-signer envelope requires hex calldata");let p=Iu(l.value??r,"prepared native value");if(BigInt(p)!==BigInt(r))throw new Error("local-signer envelope requires native value equal amountIn");let m=Ao(l.gasLimit??c.gasLimit,"gasLimit"),y=Ao(l.maxFeePerGas??c.maxFeePerGas,"maxFeePerGas");if(!m||!y)throw new Error("local-signer envelope requires explicit gasLimit and maxFeePerGas caps");let h=Number(u.nowMs??Date.now()),w=Math.min(6e4,Math.max(1e3,Number(c.ttlMs??c.expiresInMs??3e4)||3e4)),A=sa({chainId:e,venue:"uniswap-v3",quoteAmountOut:i?.amountOut,liquidityUsd:s?.liquidityUsd,requestedCapBps:c.slippageBps??50,quotedAtMs:h,ttlMs:w,secret:u.routeAttestationSecret}),_=Ve(A,{chainId:e,venue:"uniswap-v3",data:f,secret:u.routeAttestationSecret}),S={chainId:e,from:o,to:d,data:f,value:p,gasLimit:m,maxFeePerGas:y,slippageBps:_.selectedBps,expiresAtMs:h+w},k=Ao(l.maxPriorityFeePerGas??c.maxPriorityFeePerGas,"maxPriorityFeePerGas");return k&&(S.maxPriorityFeePerGas=k),c.nonce!==void 0&&(S.nonce=Number(c.nonce)),(c.txType!==void 0||k)&&(S.type=Number(c.txType??2)),c.l1FeeWei!==void 0&&(S.l1FeeWei=Ao(c.l1FeeWei,"l1FeeWei")??"0"),c.operatorFeeWei!==void 0&&(S.operatorFeeWei=Ao(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:h+w,fee:{oracleFeeBps:5},autoSlippage:_,artifact:{chainId:e,owner:o,transactions:[S]},meta:{source:"evm-token-sniper",tokenIn:n,tokenOut:t}}}function lO(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}Ai();let n=ya(e);if(!n)throw new Error(`evm-token-sniper: unsupported EVM chainId ${e}`);return n}function dO({token:e,pools:t,structuralRisk:n,scannerRisk:r,sellability:o,quote:i,args:s,scanner:a}){let c=[];return e?.evidence!==F.LIVE&&c.push("token identity is not live-verified"),(!Array.isArray(t?.pools)||t.pools.length===0)&&c.push("no liquid pool was resolved"),n?.status!=="ok"&&c.push("structural contract risk is unavailable"),n?.risk==="high"&&c.push("structural contract risk is high"),r?.verdict!==U.PASS&&c.push(`scanner risk verdict is ${r?.verdict||"UNKNOWN"}`),a.supports?.("sellSimulation")?o?.verdict!==U.PASS&&c.push(`sellability verdict is ${o?.verdict||"UNKNOWN"}`):c.push("sell simulation is unavailable on this chain"),a.supports?.("quote")?i?.evidence!==F.LIVE&&c.push("no live quote was returned"):c.push("live quoting is unavailable on this chain"),a.supports?.("prepareUnsignedTx")||c.push("unsigned transaction preparation is unavailable on this chain"),s.tokenIn||c.push("tokenIn is required to prepare"),s.amountIn||c.push("amountIn is required to prepare"),s.recipient||c.push("recipient is required to prepare"),c}async function Sg(e={},t={}){let n=Number(e.chainId??cO);if(!Number.isInteger(n)||n<=0)throw new Error("evm-token-sniper: chainId must be a positive integer");let r=ms(e.tokenAddress||e.address||e.token,"tokenAddress"),o=e.tokenIn?ms(e.tokenIn,"tokenIn"):null,i=e.recipient?ms(e.recipient,"recipient"):null,s=e.amountIn==null?null:Iu(e.amountIn,"amountIn"),a=lO(n,t.scanner),c=t.scanContractRisk||wg,[u,l,d]=await Promise.all([a.resolveToken(r),a.resolvePools(r),c({address:r,chainId:n},t.contractRiskOpts||t)]),f=await a.scoreRisk(r),p=null;a.supports?.("sellSimulation")&&s?p=await a.sellSimulation({token:r,amountIn:s,base:o||void 0}):a.supports?.("sellSimulation")&&(p=await a.sellSimulation({token:r,amountIn:"10000000000000000"}));let m=null;a.supports?.("quote")&&o&&s&&(m=await a.quote({tokenIn:o,tokenOut:r,amountIn:s}));let y={...e,tokenIn:o,amountIn:s,recipient:i},h=dO({token:u,pools:l,structuralRisk:d,scannerRisk:f,sellability:p,quote:m,args:y,scanner:a}),w=null,A=null,_=null;if(e.prepare===!0&&h.length===0){w=await a.prepareUnsignedTx({tokenIn:o,tokenOut:r,amountIn:s,recipient:i,slippageBps:e.slippageBps??50,fee:m?.fee});try{A=uO({chainId:n,tokenAddress:r,tokenIn:o,amountIn:s,recipient:i,quote:m,topPool:l?.pools?.[0]||null,unsignedTx:w,args:e,opts:t})}catch(S){_=String(S?.message||S).slice(0,200)}}return{provider:"evm-token-sniper",execution:"armed-local",armed:!!A,signing:"local-signer",broadcasting:"local-signer",chainId:n,chain:{key:a.key,name:a.name,nativeCurrency:a.nativeCurrency},token:u,pools:l,topPool:l?.pools?.[0]||null,structuralRisk:d,scannerRisk:f,sellability:p,quote:m,blockedReasons:h,prepared:!!w,unsignedTx:w,localSignerEnvelope:A,localSignerBlockedReason:_,signed:A?"pending-local-signer":!1,broadcast:A?"pending-local-signer":!1}}var aO,cO,vg=O(()=>{Vr();Xt();st();Eg();aO=/^0x[0-9a-fA-F]{40}$/,cO=4663});var _g={};z(_g,{evaluateContracts:()=>Ig,fetchAccountTweets:()=>kg,snipeExecuteEnabled:()=>Ag,tickTwitterCaWatch:()=>gO,twitterSnipeEmitsCard:()=>bO});function Ag(e=process.env){return String((e||process.env).ORACLE_SNIPE_EXECUTE||"").trim()==="1"}function xg(e){return String(e||"").trim().replace(/^@/,"")}async function kg({handle:e,limit:t=5,xurlFn:n=gg}={},r={}){let o=xg(e);if(!o)throw new Error("twitter-ca-watch: handle required");let i=await n("xurl",{command:"search",query:`from:${o}`,limit:Math.min(20,Math.max(1,Number(t)||5))},r);return i?.ok?{ok:!0,tweets:dg(i.stdout),raw:i}:{ok:!1,error:i?.error||"xurl search failed",tweets:[]}}async function hO(e,{chainId:t,amountIn:n,tokenIn:r,recipient:o,prepare:i},s){let a=await Sg({chainId:t,tokenAddress:e,amountIn:n,tokenIn:r,recipient:o,prepare:i===!0},s),c=a.topPool||a.pools?.pools?.[0]||null;return{chainFamily:"evm",chainId:t,address:e,topPool:c,quoteAsset:a.pools?.quoteAsset||null,sellability:a.sellability||null,blockedReasons:a.blockedReasons||[],prepared:!!a.prepared,unsignedTx:a.unsignedTx||null,localSignerEnvelope:a.localSignerEnvelope||null,execution:!1,broadcast:!1}}async function yO(e,t){let n=await Fl(e,{chainSlug:"solana",stables:[fO,mO]},t);return{chainFamily:"solana",chainId:"solana",address:e,topPool:n.topPool,pools:n.pools,prepared:!1,execution:!1,broadcast:!1,note:"Solana CA ranked on USD book. Prepare stays Jupiter/local-signer; this tick does not broadcast."}}async function Ig(e,t={},n={}){let r=Number(t.chainId??pO),o=[];for(let i of e.evm||[])o.push(await hO(i,{...t,chainId:r},n));for(let i of e.solana||[])o.push(await yO(i,n));return o}async function gO(e={},t={}){let n=xg(e.handle),r=e.seen instanceof Set?e.seen:new Set(e.seen||[]),o=await kg({handle:n,limit:e.limit,xurlFn:t.xurlFn},t);if(!o.ok)return{ok:!1,handle:n,error:o.error,hits:[],seen:[...r]};let i=[];for(let a of o.tweets){let c=a.id||`${n}:${a.text.slice(0,80)}`;if(r.has(c))continue;let u=lg(a.text,{extras:a.urls||[]});if(!u.all.length){r.add(c);continue}let d=await(t.evaluateFn||Ig)(u,e,t);r.add(c),i.push({tweetId:a.id||null,handle:n,text:a.text,contracts:u,evaluations:d})}let s=e.automated!==!1;return{ok:!0,handle:n,source:"twitter-ca-watch",automated:s,card:!1,notify:!1,telegram:!1,execution:!1,broadcast:!1,snipeExecuteEnabled:Ag(t.env||process.env),hits:i,seen:[...r]}}function bO(e={}){return!e||typeof e!="object"||e.source==="twitter-ca-watch"||e.automated===!0||e.card===!1||e.notify===!1,!1}var pO,fO,mO,Og=O(()=>{pg();bg();vg();Cr();$o();pO=4663,fO="EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",mO="Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB"});import{wordlists as wO}from"ethers";function AO(e){let t=String(e).trim().toLowerCase().split(/\s+/).filter(Boolean);return vO.has(t.length)&&t.every(n=>wO.en.getWordIndex(n)>=0)}function _O(e){let t=Tg(e);return IO.has(t)||kO.test(t)}function Tg(e){return String(e).replace(/[^a-z0-9]/gi,"").toLowerCase()}function OO(e){let t=Tg(e);return[...EO].some(n=>t.includes(n))}function TO(e,t,n){if(typeof t=="string"){if(SO.some(r=>r.test(t))||AO(t))throw new xo(n);if(xO.test(t)&&!_O(e))throw new xo(n)}}function hs(e,t="$",n=""){if(e==null||typeof e=="boolean")return e;if(typeof e=="string")return TO(n,e,t),e;if(typeof e=="number"){if(!Number.isFinite(e))throw new TypeError(`action receipt: non-finite number at ${t}`);return e}if(typeof e=="bigint")return e.toString();if(Array.isArray(e))return e.map((o,i)=>hs(o,`${t}[${i}]`,n));if(typeof e!="object"||Object.getPrototypeOf(e)!==Object.prototype)throw new TypeError(`action receipt: JSON-like value required at ${t}`);let r={};for(let o of Object.keys(e).sort()){let i=`${t}.${o}`;if(OO(o))throw new xo(i);e[o]!==void 0&&(r[o]=hs(e[o],i,o))}return r}function K(e){return hs(e)}function _u(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(_u).join(",")}]`:`{${Object.keys(e).map(t=>`${JSON.stringify(t)}:${_u(e[t])}`).join(",")}}`}function ko(e){return _u(hs(e))}var EO,SO,vO,xO,kO,IO,xo,mr=O(()=>{EO=new Set(["privatekey","privkey","secretkey","seedphrase","seed","mnemonic","passphrase","password","keystore","keymaterial","wif","xprv","xpriv","bearer","authorization","signature","apikey","credential"]),SO=[/\b[5KL][1-9A-HJ-NP-Za-km-z]{50,51}\b/,/\bxprv[0-9A-Za-z]{50,}\b/],vO=new Set([12,15,18,21,24]);xO=/^\s*(?:0x)?[0-9a-fA-F]{64}\s*$/,kO=/(hash|digest|root|salt|nonce|proof|commitment|sig|id)(?:e?s)?$/i,IO=new Set(["calldata","data","publickey","pubkey","message","payload","input","extradata"]);xo=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 CO,chmod as ys,readFile as NO,rename as RO,writeFile as PO}from"node:fs/promises";import{homedir as LO}from"node:os";import{dirname as Cg,join as Ou}from"node:path";import $O from"sql.js";function ws(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(ws).join(",")}]`:`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${ws(e[t])}`).join(",")}}`}function Ng(e){if(!qO.has(e))throw new TypeError(`unknown artifact type: ${e}`);return e}function gs(e){let t=[];for(;e.step();)t.push(e.getAsObject());return e.free(),t}function bs(e){return e?{id:e.id,type:e.type,createdAt:e.created_at,data:JSON.parse(e.data_json)}:null}async function Rg(e={}){let t=e.path||MO;await CO(Cg(t),{recursive:!0,mode:448}),await ys(Cg(t),448);let n;try{n=await NO(t)}catch(u){if(u.code!=="ENOENT")throw u}let r=await $O(e.sqlJs||{}),o=n?new r.Database(n):new r.Database;o.run(`
12
12
  PRAGMA foreign_keys=ON;
13
13
  CREATE TABLE IF NOT EXISTS artifacts (
14
14
  id TEXT PRIMARY KEY, type TEXT NOT NULL, created_at TEXT NOT NULL, data_json TEXT NOT NULL
@@ -20,9 +20,9 @@ ${JSON.stringify(r??[])}`}async function jx(e,t,r){return T(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 A_(l,Buffer.from(o.export()),{mode:384}),await Xi(l,384),await E_(l,t),await Xi(t,384)};return s=s.then(u,u),s}r?await Xi(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=ky(String(u.type)),d=String(u.id||"").trim();if(!d)throw new TypeError("artifact id required");let p=W(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,Ji(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()?Yi(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"):(ky(String(u)),o.prepare("SELECT * FROM artifacts WHERE type=? ORDER BY created_at,id"));return u!==void 0&&l.bind([String(u)]),Qi(l).map(Yi)},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=Qi(d),f=p.find(y=>y.id===String(u)),m=p.find(y=>y.id===String(l));if(!f||!m)throw new TypeError("edge endpoints must exist");if(!O_.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)]),Qi(l).map(Yi)},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)]),Qi(l).map(Yi)},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=W(l);return o.run("INSERT INTO action_receipts(artifact_id,receipt_json) VALUES(?,?)",[String(u),Ji(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 Zc,__,O_,T_,C_,Sy=v(()=>{nn();Zc=Object.freeze(["project","entity","source","thesis","strategy","simulation","prepared_action","receipt","position"]),__=new Set(Zc),O_=new Set(Zc.slice(0,-1).map((e,t)=>`${e}:${Zc[t+1]}`)),T_=Jc(process.env.ORACLE_CONFIG_DIR||Jc(v_(),".config","oracle"),"workspace"),C_=Jc(T_,"artifacts.sqlite")});import{createHash as Ey}from"node:crypto";function R_(e){return N_.has(String(e).replace(/[^a-z0-9]/gi,"").toLowerCase())}function eu(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(eu).join(",")}]`:`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${eu(e[t])}`).join(",")}}`}function $_(e){return Ey("sha256").update(String(e)).digest("hex")}function Ay(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(R_(r))throw new TypeError("research source URL must not contain sensitive query parameters");return t.toString()}function vy(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 P_(e={}){let t=Ay(e.url??e.sourceUrl),r=vy(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(W({url:t,fetchedAt:r,contentHash:n}))}function Iy(e={}){let t=Ay(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=vy(e.fetchedAt),s=$_(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(P_),c=W({sourceUrl:t,fetchedAt:i,contentHash:s,snapshot:r,claim:n,confidence:o,contradictions:(e.contradictions||[]).map(String),citations:a});return Object.freeze({id:`research:${Ey("sha256").update(eu(c)).digest("hex")}`,...c})}var N_,_y=v(()=>{nn();N_=new Set(["accesstoken","refreshtoken","idtoken","token","apikey","clientsecret","password","auth","jwt","session","secret","key","code","signature","xamzsignature","privatekey","authorization","bearer","credential"])});function Oy(e){if(e===null||e===""||e===void 0)return null;let t=Number(e);return Number.isFinite(t)&&t>=0?t:null}function lo(e){return Math.round((e+Number.EPSILON)*1e8)/1e8}function ru(e,t){return t>0?lo(e/t*100):null}function nu(e){return e.address||e.owner||e.walletAddress||e.wallet?.address||null}function B_(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 kr(e,t,r={}){if(!t||typeof t!="object")return;let n=String(t.symbol??t.coin??t.name??t.collection??t.tokenId??"unknown"),o=Oy(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||L_.has(n.toUpperCase())})}function U_(e){let t=[],r=nu(e);for(let n of e.assets||e.holdings||[])kr(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)&&kr(t,{...n.native,symbol:n.native.symbol??n.symbol??o},i);for(let a of n.assets||n.fungibleTokens?.assets||[])kr(t,a,i);for(let a of n.collectibles?.assets||n.nfts||[])kr(t,{...a,kind:"nft"},i);for(let a of n.spot?.balances||[])kr(t,a,{...i,venue:"Hyperliquid spot"});let s=Oy(n.perps?.accountValueUsd);s!=null&&kr(t,{symbol:"perps account",usdValue:s},{...i,venue:"Hyperliquid perps"})}for(let n of e.inventory?.items||e.nfts?.items||[])kr(t,{...n,kind:"nft"},{address:r,chain:n.chain??e.chain,venue:n.marketplace??e.venue});return t}function D_(e,t){let r=nu(e),n=e.chain??e.chainId??e.family??"*";return r?`${String(r).toLowerCase()}|${String(n).toLowerCase()}`:`snapshot:${t}`}function tu(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:lo(i),percentOfKnown:ru(i,r)})).sort((o,i)=>i.knownUsd-o.knownUsd||o.name.localeCompare(i.name))}function Zi(e={},t={}){let r=Array.isArray(e)?e:Array.isArray(e.snapshots)?e.snapshots:e.snapshot?[e.snapshot]:[],n=B_(t.labels??t.addressBook??e.labels??e.addressBook),o={...q_,...e.thresholds||{},...t.thresholds||{}},i=[],s=new Set,a=0;r.forEach((S,R)=>{if(!S||typeof S!="object")return;let A=D_(S,R);s.has(A)?a+=1:(s.add(A),i.push(S))});let c=i.flatMap(U_),u=c.filter(S=>S.usdValue!=null),l=c.filter(S=>S.usdValue==null),d=i.reduce((S,R)=>S+Number(R.valuation?.unpricedNonzeroItems||R.unpricedNonzeroItems||0),0),p=lo(u.reduce((S,R)=>S+R.usdValue,0)),f=l.length+d,m=tu(u,"chain",p),y=tu(u,"venue",p),h=tu(u,"symbol",p);for(let S of m)S.chain=S.name;for(let S of y)S.venue=S.name;for(let S of h)S.asset=S.name,S.symbol=S.name;let w=lo(u.filter(S=>S.stablecoin).reduce((S,R)=>S+R.usdValue,0)),E=c.filter(S=>S.kind==="nft"),_=i.reduce((S,R)=>S+Number(R.valuation?.nftUnvaluedItems||0),0),x=E.filter(S=>S.usdValue==null).length+_,O=E.filter(S=>S.usdValue!=null).length,I=h[0]||null,k=I?I.percentOfKnown>=o.assetHighPct?"high":I.percentOfKnown>=o.assetMediumPct?"medium":"low":"unknown",g=[];f&&g.push(`${f} nonzero holding(s) have unknown USD value; they are excluded from totals and percentages.`),x&&g.push("NFT valuation coverage is partial; estimates are not executable bids and unvalued NFTs are not treated as zero."),a&&g.push(`${a} duplicate address/chain snapshot(s) were ignored.`),I&&k!=="low"&&g.push(`Asset concentration is ${k}: ${I.name} is ${I.percentOfKnown}% of known value.`),m[0]?.percentOfKnown>=o.chainHighPct&&g.push(`Chain concentration is high: ${m[0].name} is ${m[0].percentOfKnown}% of known value.`),y[0]?.percentOfKnown>=o.venueHighPct&&g.push(`Venue concentration is high: ${y[0].name} is ${y[0].percentOfKnown}% of known value.`);let b=i.map(nu).filter(Boolean).map(S=>{let R=n.get(String(S).toLowerCase());return{address:S,label:R?.label??null,who:R?.who??null,role:R?.role??null}});return{totalKnownUsd:p,coverage:{complete:i.length>0&&f===0&&i.every(S=>S.valuation?.complete!==!1&&S.coverage?.complete!==!1),label:f===0&&i.length&&i.every(S=>S.valuation?.complete!==!1&&S.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:y,topAssets:h.slice(0,Math.max(1,Number(t.topAssets??e.topAssets??10))),concentrationRisk:{level:k,topAsset:I?.name??null,topAssetPercent:I?.percentOfKnown??null,thresholds:{mediumPct:o.assetMediumPct,highPct:o.assetHighPct}},stablecoinExposure:{knownUsd:w,percentOfKnown:ru(w,p),high:p>0&&ru(w,p)>=o.stablecoinHighPct},nftCoverage:{status:E.length||_?x?"partial":"valued":"not-observed",valuedItems:O,unvaluedItems:x,knownUsd:lo(E.filter(S=>S.usdValue!=null).reduce((S,R)=>S+R.usdValue,0))},addresses:b,warnings:[...new Set(g)]}}var q_,L_,ou=v(()=>{q_=Object.freeze({assetHighPct:50,assetMediumPct:25,chainHighPct:75,venueHighPct:60,stablecoinHighPct:70}),L_=new Set(["USDC","USDT","USDT0","DAI","FRAX","LUSD","TUSD","USDP","GUSD","PYUSD","USDE"])});function Ty(e){return Ee(e.asOf??e.updatedAt??e.timestamp,0)}function Ry(e){return e.filledAt??e.executedAt??e.time??e.timestamp??e.asOf??e.updatedAt??e.createdAt}function M_(e){return Number.isFinite(Number(Ry(e)))}function Cy(e){return Ee(Ry(e),0)}function F_(e){let t=new Set,r=[];return(e||[]).forEach((o,i)=>{if(!o||typeof o!="object"||!dt(o))return;let s=$y(o);t.has(s)||(t.add(s),r.push({row:o,seq:i}))}),r.every(({row:o})=>M_(o))?r.sort((o,i)=>Cy(o.row)-Cy(i.row)||o.seq-i.seq).map(({row:o})=>o):r.map(({row:o})=>o)}function $y(e){let t=e.fillId??e.tradeId??e.orderId??e.txHash??e.transactionHash??e.timestamp??e.asOf;return[ts(e),ge(t),ge(e.side),Ee(e.quantity??e.amount??e.size),Ee(e.price??e.priceUsd)].join("|")}function es(e,t){let r=new Map,n=0;for(let o of e||[]){if(!o||typeof o!="object"||!dt(o))continue;let i=t==="fill"?$y(o):ts(o);r.has(i)?(n+=1,t!=="fill"&&Ty(o)>Ty(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 j_(e){let t=new Map;for(let r of e){let n=[ts(r),`${ge(r.chain??r.chainId)}|${ge(dt(r))}`,`*|${ge(dt(r))}`];for(let o of n)t.has(o)||t.set(o,r)}return t}function H_(e,t){return t.get(ts(e))??t.get(`${ge(e.chain??e.chainId)}|${ge(dt(e))}`)??t.get(`*|${ge(dt(e))}`)??null}function z_(e){let t=new Map,r=0;for(let n of e){let o=[ge(n.chain??n.chainId),ge(Ny(n)),ge(dt(n))].join("|"),i=t.get(o)??{quantity:0,cost:0},s=Math.abs(Ee(n.quantity??n.amount??n.size)),a=Ee(n.price??n.priceUsd),c=Ee(n.feeUsd);if(ge(n.side)==="sell"){let u=Math.min(s,i.quantity),l=i.quantity?i.cost/i.quantity:Ee(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:lt(r),lots:t}}function Py(e={},t={}){let r=Ee(t.asOf??e.asOf,0),n=Math.max(0,Ee(t.priceTtlMs??e.priceTtlMs,6e4)),o=es(e.balances||[],"balance"),i=es(e.positions||[],"position"),s=es(e.fills||[],"fill"),a=es(e.prices||[],"price"),c=j_(a.rows),u=[],l=0,d=0;for(let b of[...o.rows,...i.rows]){let S=H_(b,c),R=Ee(b.quantity??b.amount??b.size),A=S?Ee(S.priceUsd??S.price,NaN):Ee(b.priceUsd,NaN);if(!Number.isFinite(A)){d+=1;continue}let $=R*A,q=Ee(S?.asOf??b.priceAsOf,0),j=r-q>n;j&&(l+=Math.abs($)),u.push({...b,quantity:R,priceUsd:A,valueUsd:$,stale:j,kind:i.rows.includes(b)?"position":"balance"})}let p=u.filter(b=>b.kind==="balance").reduce((b,S)=>b+S.valueUsd,0),f=u.filter(b=>b.kind==="position"),m=f.reduce((b,S)=>b+S.valueUsd,0),y=f.reduce((b,S)=>b+Math.abs(S.valueUsd),0),h=p+m,w=Ee(e.equityUsd,h),E=z_(F_(e.fills||[])).realizedPnlUsd,_=f.reduce((b,S)=>{let R=Ee(S.entryPriceUsd??S.averageEntryPrice??S.costBasisPrice,S.priceUsd);return b+S.quantity*(S.priceUsd-R)},0),x=new Map;for(let b of u)x.set(ge(dt(b)),(x.get(ge(dt(b)))||0)+Math.abs(b.valueUsd));let O=[...x.values()].reduce((b,S)=>b+S,0),I=[...x].map(([b,S])=>({asset:b,exposureUsd:lt(S),percent:O?lt(S/O*100):null})).sort((b,S)=>S.exposureUsd-b.exposureUsd||b.asset.localeCompare(S.asset)),k=u.reduce((b,S)=>b+Math.abs(S.valueUsd),0),g=Zi({snapshots:[{assets:u.map(b=>({symbol:dt(b),usdValue:Math.abs(b.valueUsd),chain:b.chain,venue:b.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:lt(_),totalUsd:lt(E+_)},exposure:{grossUsd:lt(y),netUsd:lt(h),leverage:w>0?lt(y/w):null,equityUsd:lt(w)},concentration:I,priceCoverage:{pricedItems:u.length,unpricedItems:d,staleItems:u.filter(b=>b.stale).length,staleValueUsd:lt(l),stalePercent:k?lt(l/k*100):null,ttlMs:n},risk:g})}var Ee,lt,ge,dt,Ny,ts,qy=v(()=>{ou();Ee=(e,t=0)=>Number.isFinite(Number(e))?Number(e):t,lt=e=>Math.round((e+Number.EPSILON)*1e8)/1e8,ge=(e,t="unknown")=>String(e??t).trim().toLowerCase(),dt=e=>e.asset??e.symbol??e.coin,Ny=e=>e.address??e.owner??e.account,ts=e=>[ge(e.chain??e.chainId),ge(Ny(e)),ge(dt(e)),ge(e.source)].join("|")});function de(e,t){throw new su(e,t)}function Bt(e,t){return e<t?-1:e>t?1:0}function be(e){if(e&&typeof e=="object"&&!Object.isFrozen(e)){for(let t of Object.values(e))be(t);Object.freeze(e)}return e}function Ut(e,t){return(!e||typeof e!="object"||Array.isArray(e)||Object.getPrototypeOf(e)!==Object.prototype)&&de(`${t} must be a plain object`),e}function Ce(e,t,{optional:r=!1,lower:n=!1}={}){if(e==null&&r)return null;typeof e!="string"&&de(`${t} must be a string`);let o=e.trim();return o||de(`${t} is required`),Q_.test(o)&&de(`${t} contains control characters`),o.length>512&&de(`${t} is too long`),n?o.toLowerCase():o}function xt(e,t,{optional:r=!1,positive:n=!1}={}){if(e==null&&r)return null;typeof e=="number"&&de(`${t} must be an exact decimal string or BigInt; Number coercion is refused`,"COST_BASIS_UNSAFE_NUMBER");let o;typeof e=="bigint"?o=e.toString():typeof e=="string"?o=e:de(`${t} must be an exact decimal string or BigInt`),/^\d+$/.test(o)||de(`${t} must be a non-negative base-10 integer string`);let i=BigInt(o);return n&&i===0n&&de(`${t} must be positive`),i.toString()}function on(e){return e==null?null:e.toString()}function po(e,t){let r=Ut(e,t);return be({chain:Ce(r.chain??r.chainId,`${t}.chain`,{lower:!0}),account:Ce(r.account??r.address??r.owner,`${t}.account`)})}function nr(e,t){return`${e.length}:${e}|${t.chain.length}:${t.chain}|${t.account.length}:${t.account}`}function Dy(e,t="evidence"){if(e==null)return be({status:"unknown",references:[]});let r=Ut(e,t),n=Ce(r.status??"unknown",`${t}.status`,{lower:!0});X_.has(n)||de(`${t}.status must be complete, incomplete, or unknown`),r.references!=null&&!Array.isArray(r.references)&&de(`${t}.references must be an array`);let o=(r.references||[]).map((s,a)=>{let c=Ut(s,`${t}.references[${a}]`);return{kind:Ce(c.kind??c.type,`${t}.references[${a}].kind`,{lower:!0}),id:Ce(c.id??c.receiptId??c.txHash,`${t}.references[${a}].id`)}}).sort((s,a)=>Bt(s.kind,a.kind)||Bt(s.id,a.id)),i=[];for(let s of o)i.some(a=>a.kind===s.kind&&a.id===s.id)||i.push(s);return be({status:n,references:i})}function Ly(e,t){if(e==null)return[];(!Array.isArray(e)||e.length===0)&&de(`${t} must be a non-empty array`);let r=new Set;return e.map((n,o)=>{let i=Ut(n,`${t}[${o}]`),s=Ce(i.lotId,`${t}[${o}].lotId`);return r.has(s)&&de(`${t} repeats lotId ${JSON.stringify(s)}`),r.add(s),be({lotId:s,quantity:xt(i.quantity,`${t}[${o}].quantity`,{positive:!0})})})}function Y_(e){W(e);let t=Ut(e,"event"),r=Ce(t.type,"event.type",{lower:!0});K_.has(r)||de("event.type must be acquisition, disposal, or transfer");let n=Ce(t.id??t.eventId,"event.id"),o=xt(t.occurredAt??t.timestamp,"event.occurredAt"),i=Ce(t.asset??t.symbol??t.coin,"event.asset"),s=xt(t.quantity??t.amount??t.size,"event.quantity",{positive:!0}),a=xt(t.feeMinor??t.feeUsdMinor??"0","event.feeMinor"),c=Dy(t.evidence),u=t.source==null?null:Ce(t.source,"event.source"),l={id:n,type:r,occurredAt:o,asset:i,quantity:s,feeMinor:a,source:u,evidence:c};if(r==="acquisition"){let d={...l,location:po(t.location??{chain:t.chain??t.chainId,account:t.account??t.address??t.owner},"event.location"),grossAmountMinor:xt(t.grossAmountMinor??t.costMinor??t.basisBeforeFeesMinor,"event.grossAmountMinor",{optional:!0}),lotId:Ce(t.lotId??n,"event.lotId"),specificLots:[]};return be(d)}return be(r==="disposal"?{...l,location:po(t.location??{chain:t.chain??t.chainId,account:t.account??t.address??t.owner},"event.location"),grossAmountMinor:xt(t.grossAmountMinor??t.proceedsMinor??t.proceedsBeforeFeesMinor,"event.grossAmountMinor",{optional:!0}),specificLots:Ly(t.specificLots??t.lotSelections,"event.specificLots")}:{...l,from:po(t.from,"event.from"),to:po(t.to,"event.to"),grossAmountMinor:null,specificLots:Ly(t.specificLots??t.lotSelections,"event.specificLots")})}function J_(e,t){let r=BigInt(e.occurredAt)-BigInt(t.occurredAt);return r<0n?-1:r>0n?1:Bt(e.id,t.id)}function Z_(e=[]){Array.isArray(e)||de("events must be an array");let t=new Map,r=0;for(let n of e){let o=Y_(n),i=uo(o),s=t.get(o.id);if(s){s.canonical!==i&&de(`conflicting duplicate event id ${JSON.stringify(o.id)}`,"COST_BASIS_DUPLICATE_CONFLICT"),r+=1;continue}t.set(o.id,{event:o,canonical:i})}return be({events:[...t.values()].map(({event:n})=>n).sort(J_),duplicatesIgnored:r})}function e1(e){let t=Ce(e??"fifo","method",{lower:!0});return W_.includes(t)||de("method must be fifo, lifo, hifo, or specific"),t}function t1(e){e!=null&&Ut(e,"treatment");let t=e||{},r={};for(let n of Object.keys(By))r[n]=Ce(t[n]??"unresolved",`treatment.${n}`,{lower:!0}),By[n].has(r[n])||de(`treatment.${n} has an unsupported value`);return be(r)}function r1(e,t){W(e);let r=Ut(e,`marketValues[${t}]`);return be({id:Ce(r.id??r.valuationId,`marketValues[${t}].id`),asset:Ce(r.asset??r.symbol??r.coin,`marketValues[${t}].asset`),location:po(r.location??{chain:r.chain??r.chainId,account:r.account??r.address??r.owner},`marketValues[${t}].location`),quantity:xt(r.quantity,`marketValues[${t}].quantity`),valueMinor:xt(r.valueMinor??r.marketValueMinor,`marketValues[${t}].valueMinor`),asOf:xt(r.asOf,`marketValues[${t}].asOf`),evidence:Dy(r.evidence,`marketValues[${t}].evidence`)})}function My(e,t){return t==null||BigInt(e)<=BigInt(t)}function n1(e=[],t=null){Array.isArray(e)||de("marketValues must be an array");let r=new Map,n=0;e.forEach((s,a)=>{let c=r1(s,a),u=uo(c),l=r.get(c.id);l?(l.canonical!==u&&de(`conflicting duplicate market value id ${JSON.stringify(c.id)}`,"COST_BASIS_DUPLICATE_CONFLICT"),n+=1):r.set(c.id,{row:c,canonical:u})});let o=[...r.values()].map(({row:s})=>s).filter(s=>My(s.asOf,t)),i=new Map;for(let s of o){let a=nr(s.asset,s.location),c=i.get(a);(!c||BigInt(s.asOf)>BigInt(c.asOf)||s.asOf===c.asOf&&Bt(s.id,c.id)<0)&&i.set(a,s)}return{values:o.sort((s,a)=>Bt(s.id,a.id)),byHolding:i,duplicatesIgnored:n}}function Te(e,t,r,n){e.push(be({code:t,eventId:r??null,detail:n}))}function o1(e,t,r){if(e.grossAmountMinor==null)return Te(r,"missing-acquisition-basis",e.id,"gross acquisition amount is unknown; lot basis remains unknown"),null;let n=BigInt(e.grossAmountMinor),o=BigInt(e.feeMinor);return o===0n?n:t.acquisitionFees==="include-in-basis"?n+o:t.acquisitionFees==="exclude"?n:(Te(r,"unresolved-acquisition-fee-treatment",e.id,"fee treatment was not supplied; lot basis remains unknown"),null)}function i1(e,t,r){if(e.grossAmountMinor==null)return Te(r,"missing-disposal-proceeds",e.id,"gross disposal proceeds are unknown"),null;let n=BigInt(e.grossAmountMinor),o=BigInt(e.feeMinor);return o===0n?n:t.disposalFees==="reduce-proceeds"?n-o:t.disposalFees==="exclude"?n:(Te(r,"unresolved-disposal-fee-treatment",e.id,"fee treatment was not supplied; recognized proceeds remain unknown"),null)}function s1(e,t){let r=(n,o)=>{let i=BigInt(n.acquiredAt)-BigInt(o.acquiredAt);return i<0n?-1:i>0n?1:Bt(n.lotId,o.lotId)};return e==="fifo"?[...t].sort(r):e==="lifo"?[...t].sort((n,o)=>-r(n,o)):e==="hifo"?[...t].sort((n,o)=>{let i=n.basisRemaining*o.quantityRemaining,s=o.basisRemaining*n.quantityRemaining;return i>s?-1:i<s?1:r(n,o)}):[...t]}function Uy(e,t){let r=e.quantityRemaining,n=e.basisRemaining,o=null;return n!=null&&(o=t===r?n:n*t/r,e.basisRemaining-=o),e.quantityRemaining-=t,{lot:e,quantity:t,basis:o}}function a1(e,t,r){let n=nr(t,r);return e.filter(o=>o.key===n&&o.quantityRemaining>0n)}function c1({event:e,lots:t,method:r,issues:n,tainted:o}){let i=e.type==="transfer"?e.from:e.location,s=nr(e.asset,i),a=BigInt(e.quantity);if(o.has(s))return Te(n,"inventory-state-incomplete",e.id,"an earlier unmatched record makes this holding indeterminate"),{matches:[],missing:a,key:s,indeterminate:!0};let c=a1(t,e.asset,i);if(r==="hifo"&&c.some(d=>d.basisRemaining==null))return Te(n,"hifo-basis-unknown",e.id,"HIFO cannot rank a lot whose basis is unknown"),o.add(s),{matches:[],missing:a,key:s,indeterminate:!0};let u=[],l=a;if(r==="specific"){if(e.specificLots.length===0)return Te(n,"specific-lots-required",e.id,"specific-lot method requires explicit lot selections"),o.add(s),{matches:u,missing:l,key:s,indeterminate:!0};if(e.specificLots.reduce((p,f)=>p+BigInt(f.quantity),0n)!==a)return Te(n,"specific-lot-quantity-mismatch",e.id,"specific-lot quantities do not equal the event quantity"),o.add(s),{matches:u,missing:l,key:s,indeterminate:!0};for(let p of e.specificLots){let f=c.find(y=>y.lotId===p.lotId),m=BigInt(p.quantity);if(!f||f.quantityRemaining<m){Te(n,"specific-lot-unavailable",e.id,`requested lot ${JSON.stringify(p.lotId)} is absent or too small`);continue}u.push(Uy(f,m)),l-=m}}else{e.specificLots.length&&de(`event ${JSON.stringify(e.id)} supplies specificLots but method is ${r}`);for(let d of s1(r,c)){if(l===0n)break;let p=l<d.quantityRemaining?l:d.quantityRemaining;u.push(Uy(d,p)),l-=p}}return l>0n&&(Te(n,"insufficient-inventory",e.id,"recorded lots do not cover the event quantity; no replacement basis was invented"),o.add(s)),{matches:u,missing:l,key:s,indeterminate:l>0n}}function iu(e,t,r){if(e==null)return t.map(()=>null);let n=e,o=r;return t.map(i=>{if(o===0n)return 0n;let s=i===o?n:n*i/o;return n-=s,o-=i,s})}function u1(e,t){let r=[...e.map(n=>n.evidence.status),...t.map(n=>n.evidence.status)];return r.length===0||r.every(n=>n==="complete")?"complete":r.some(n=>n==="incomplete")?"incomplete":"unknown"}function sn(e,t){let r=e.map(o=>o[t]),n=r.filter(o=>o!=null).reduce((o,i)=>o+BigInt(i),0n);return{value:r.every(o=>o!=null)?n.toString():null,known:n.toString()}}function l1(e,t){return{lotId:e.lotId,originLotId:e.lotId,acquisitionEventId:e.id,asset:e.asset,location:e.location,key:nr(e.asset,e.location),acquiredAt:e.occurredAt,quantityRemaining:BigInt(e.quantity),basisRemaining:t,evidenceStatus:e.evidence.status}}function Fy(e={},t={}){W(e),W(t),Ut(e,"input"),Ut(t,"options");let r=xt(t.asOf??e.asOf,"asOf",{optional:!0}),n=Z_(e.events||[]),o=r==null?n.events:n.events.filter(b=>My(b.occurredAt,r)),i=e1(t.method??e.method),s=t1(t.treatment??e.treatment),a=n1(e.marketValues||[],r),c=[],u=[],l=new Set,d=[],p=[],f=new Set;for(let b of o){if(b.type==="acquisition"){if(l.has(b.lotId)){Te(c,"duplicate-lot-id",b.id,`lotId ${JSON.stringify(b.lotId)} is already in use`),f.add(nr(b.asset,b.location));continue}l.add(b.lotId),u.push(l1(b,o1(b,s,c)));continue}let S=c1({event:b,lots:u,method:i,issues:c,tainted:f});if(b.type==="disposal"){let P=i1(b,s,c),D=iu(P,S.matches.map(ue=>ue.quantity),BigInt(b.quantity)),U=S.matches.map((ue,jt)=>{let Ht=D[jt];return be({lotId:ue.lot.lotId,originLotId:ue.lot.originLotId,quantity:ue.quantity.toString(),basisMinor:on(ue.basis),proceedsMinor:on(Ht),gainMinor:ue.basis==null||Ht==null?null:(Ht-ue.basis).toString(),acquiredAt:ue.lot.acquiredAt,evidenceStatus:ue.lot.evidenceStatus})}),Y=U.filter(ue=>ue.basisMinor!=null).reduce((ue,jt)=>ue+BigInt(jt.basisMinor),0n),K=S.missing===0n&&U.every(ue=>ue.basisMinor!=null),Pe=S.missing===0n&&P!=null;d.push(be({eventId:b.id,asset:b.asset,location:b.location,occurredAt:b.occurredAt,quantity:b.quantity,grossProceedsMinor:b.grossAmountMinor,feeMinor:b.feeMinor,recognizedProceedsMinor:Pe?P.toString():null,basisMinor:K?Y.toString():null,gainMinor:K&&Pe?(P-Y).toString():null,unknownQuantity:S.missing.toString(),status:K&&Pe?"complete":"incomplete",evidenceStatus:b.evidence.status,matches:U}));continue}let R=BigInt(b.feeMinor),A=R>0n&&s.transferFees==="include-in-basis",$=R>0n&&s.transferFees==="unresolved";$&&Te(c,"unresolved-transfer-fee-treatment",b.id,"fee treatment was not supplied; transferred lot basis remains unknown");let q=iu(A?R:0n,S.matches.map(P=>P.quantity),BigInt(b.quantity)),j=S.matches.map((P,D)=>{let U=P.basis;$?U=null:U!=null&&A&&(U+=q[D]);let Y=`${b.id}:${D+1}`;return l.has(Y)?(Te(c,"duplicate-lot-id",b.id,`derived transfer lotId ${JSON.stringify(Y)} is already in use`),f.add(nr(b.asset,b.to)),null):(l.add(Y),u.push({lotId:Y,originLotId:P.lot.originLotId,acquisitionEventId:P.lot.acquisitionEventId,asset:b.asset,location:b.to,key:nr(b.asset,b.to),acquiredAt:P.lot.acquiredAt,quantityRemaining:P.quantity,basisRemaining:U,evidenceStatus:b.evidence.status==="complete"&&P.lot.evidenceStatus==="complete"?"complete":"unknown"}),be({fromLotId:P.lot.lotId,toLotId:Y,originLotId:P.lot.originLotId,quantity:P.quantity.toString(),basisMinor:on(U)}))}).filter(Boolean);S.indeterminate&&f.add(nr(b.asset,b.to)),p.push(be({eventId:b.id,asset:b.asset,from:b.from,to:b.to,occurredAt:b.occurredAt,quantity:b.quantity,feeMinor:b.feeMinor,unknownQuantity:S.missing.toString(),status:S.indeterminate||j.some(P=>P.basisMinor==null)?"incomplete":"complete",moved:j}))}let m=u.filter(b=>b.quantityRemaining>0n).sort((b,S)=>Bt(b.key,S.key)||Bt(b.lotId,S.lotId)),y=new Map;for(let b of m)y.has(b.key)||y.set(b.key,[]),y.get(b.key).push(b);let h=[];for(let[b,S]of[...y].sort(([R],[A])=>Bt(R,A))){let R=S.reduce((P,D)=>P+D.quantityRemaining,0n),A=a.byHolding.get(b)||null,$=f.has(b),q=A;A?BigInt(A.quantity)!==R&&(Te(c,"market-value-quantity-mismatch",null,`market value ${JSON.stringify(A.id)} does not cover the recorded holding quantity`),q=null):Te(c,"missing-market-value",null,`no market value was supplied for holding ${b}`),$&&(q=null);let j=iu(q?BigInt(q.valueMinor):null,S.map(P=>P.quantityRemaining),R);S.forEach((P,D)=>{let U=j[D],Y=U==null||P.basisRemaining==null?null:U-P.basisRemaining;h.push(be({lotId:P.lotId,originLotId:P.originLotId,acquisitionEventId:P.acquisitionEventId,asset:P.asset,location:P.location,acquiredAt:P.acquiredAt,quantity:P.quantityRemaining.toString(),basisMinor:$?null:on(P.basisRemaining),marketValueMinor:on(U),unrealizedGainMinor:$?null:on(Y),valuationId:q?.id??null,status:$||P.basisRemaining==null||U==null?"incomplete":"complete",evidenceStatus:P.evidenceStatus}))})}let w=sn(d,"basisMinor"),E=sn(d,"recognizedProceedsMinor"),_=sn(d,"gainMinor"),x=sn(h,"basisMinor"),O=sn(h,"marketValueMinor"),I=sn(h,"unrealizedGainMinor"),k=o.every(b=>BigInt(b.feeMinor)>0n?b.type==="acquisition"?s.acquisitionFees!=="unresolved":b.type==="disposal"?s.disposalFees!=="unresolved":s.transferFees!=="unresolved":!0),g={recordVersion:V_,recordType:"cost-basis-records",label:G_,asOf:r,method:i,units:{quantity:"exact asset minor units as base-10 integer strings",usd:"USD minor units as base-10 integer strings"},accountingFacts:{events:o,marketValues:a.values,duplicatesIgnored:n.duplicatesIgnored+a.duplicatesIgnored},jurisdictionalTreatment:{suppliedByCaller:s,status:k?"specified":"unresolved",note:"Fee and lot-selection treatment can vary by jurisdiction. These caller-selected recordkeeping rules are not tax advice."},realized:{disposals:d,totals:{proceedsMinor:E.value,basisMinor:w.value,gainMinor:_.value,knownProceedsSubtotalMinor:E.known,knownBasisSubtotalMinor:w.known,knownGainSubtotalMinor:_.known}},transfers:p,holdings:h,unrealized:{totals:{marketValueMinor:O.value,basisMinor:x.value,gainMinor:I.value,knownMarketValueSubtotalMinor:O.known,knownBasisSubtotalMinor:x.known,knownGainSubtotalMinor:I.known}},completeness:{accounting:c.some(b=>b.code!=="missing-market-value")?"incomplete":"complete",valuation:h.every(b=>b.marketValueMinor!=null)?"complete":"incomplete",evidence:u1(o,a.values),treatment:k?"specified":"unresolved"},issues:c};return be(g)}var V_,W_,G_,K_,X_,Q_,su,By,jy=v(()=>{nn();V_=1,W_=Object.freeze(["fifo","lifo","hifo","specific"]),G_="Accounting records only; not tax advice.",K_=new Set(["acquisition","disposal","transfer"]),X_=new Set(["complete","incomplete","unknown"]),Q_=/[\u0000-\u001f\u007f]/,su=class extends Error{constructor(t,r="COST_BASIS_INVALID"){super(`cost basis: ${t}`),this.name="CostBasisValidationError",this.code=r}};By=Object.freeze({acquisitionFees:new Set(["include-in-basis","exclude","unresolved"]),disposalFees:new Set(["reduce-proceeds","exclude","unresolved"]),transferFees:new Set(["include-in-basis","exclude","unresolved"])})});function J(e,t){throw new cu(e,t)}function xr(e,t){return e<t?-1:e>t?1:0}function Xe(e){if(e&&typeof e=="object"&&!Object.isFrozen(e)){for(let t of Object.values(e))Xe(t);Object.freeze(e)}return e}function ce(e,t){return(!e||typeof e!="object"||Array.isArray(e)||Object.getPrototypeOf(e)!==Object.prototype)&&J(`${t} must be a plain object`),e}function St(e,t,{optional:r=!1,lower:n=!1}={}){if(e==null&&r)return null;typeof e!="string"&&J(`${t} must be a string`);let o=e.trim();return o||J(`${t} is required`),h1.test(o)&&J(`${t} contains control characters`),o.length>512&&J(`${t} is too long`),n?o.toLowerCase():o}function Ke(e,t,{optional:r=!1,positive:n=!1}={}){if(e==null&&r)return null;typeof e=="number"&&J(`${t} must be an exact decimal string or BigInt; Number coercion is refused`,"POSITION_HEALTH_UNSAFE_NUMBER");let o;typeof e=="bigint"?o=e.toString():typeof e=="string"?o=e.trim():J(`${t} must be an exact decimal string or BigInt`),/^\d+$/.test(o)||J(`${t} must be a non-negative base-10 integer string`);let i=BigInt(o);return n&&i===0n&&J(`${t} must be positive`),i.toString()}function Gy(e,t){e==null&&J(`${t} is required`,"POSITION_HEALTH_MISSING_DECIMALS"),typeof e=="number"&&J(`${t} must be an exact decimal string or BigInt; Number coercion is refused`,"POSITION_HEALTH_UNSAFE_NUMBER");let r=Ke(e,t),n=BigInt(r);return n>BigInt(zy)&&J(`${t} exceeds ${zy}`),Number(n)}function mo(e,t){return e==null?null:St(e,t)}function y1(e,t){return e==null&&J(`${t} is required`),typeof e=="bigint"?e.toString():typeof e=="number"?((!Number.isInteger(e)||!Number.isSafeInteger(e)||e<0)&&J(`${t} must be a safe non-negative integer, decimal string, or slug`),String(e)):St(String(e),t,{lower:!0})}function F(e,t){for(let r of t)if(e[r]!==void 0)return e[r]}function g1(e,t="protocol"){if(e==null)return"generic";let r=St(e,t,{lower:!0}),n=f1[r]||r;return p1.has(n)||J(`${t} must be a supported lending or yield protocol`),n}function Zy(e){return e.protocol!=null?g1(e.protocol):e.marketId!=null||e.lltv!=null||e.loanAsset&&e.collateralAsset?"morpho":e.cToken!=null||e.underlying_symbol!=null||e.collateralFactor!=null?"compound":e.borrowedAmountWads!=null||e.lendingMarket!=null||e.mintDecimals!=null?"solend":e.recipe!=null||e.farmingMethod!=null||e.methodId!=null?"farming":e.spark!=null||e.savingsVault!=null?"spark":e.userReserves!=null||e.reserves!=null||e.liquidationThreshold!=null?"aave-v3":"generic"}function b1(e,t="evidence"){if(e==null)return Xe({status:"unknown",references:[]});let r=ce(e,t),n=St(r.status??"unknown",`${t}.status`,{lower:!0});m1.has(n)||J(`${t}.status must be complete, incomplete, unknown, or stale`),r.references!=null&&!Array.isArray(r.references)&&J(`${t}.references must be an array`);let o=(r.references||[]).map((s,a)=>{let c=ce(s,`${t}.references[${a}]`);return{kind:St(c.kind??c.type,`${t}.references[${a}].kind`,{lower:!0}),id:St(c.id??c.receiptId??c.txHash,`${t}.references[${a}].id`)}}).sort((s,a)=>xr(s.kind,a.kind)||xr(s.id,a.id)),i=[];for(let s of o)i.some(a=>a.kind===s.kind&&a.id===s.id)||i.push(s);return Xe({status:n,references:i})}function e0(e,t){if(e==null)return null;if(typeof e=="number"&&J(`${t} must be an exact integer string or BigInt; Number coercion is refused`,"POSITION_HEALTH_UNSAFE_NUMBER"),typeof e=="object"){let o=ce(e,t);if(o.bps!=null)return e0(o.bps,`${t}.bps`);if(o.ray!=null)return au(o.ray,`${t}.ray`);if(o.wad!=null)return Ky(o.wad,`${t}.wad`);if(o.raw!=null)return au(o.raw,`${t}.raw`);o.value!=null&&J(`${t}.value is not an exact integer threshold; supply bps, wad, or ray`,"POSITION_HEALTH_UNSAFE_NUMBER"),J(`${t} must include bps, wad, or ray`)}let r=typeof e=="bigint"?e.toString():String(e).trim();/^\d+$/.test(r)||J(`${t} must be a non-negative base-10 integer string`);let n=BigInt(r);return n<=10000n?n.toString():n<=an?Ky(n,t):au(n,t)}function Ky(e,t){let n=BigInt(Ke(e,t))*10000n/an;return n>10000n&&J(`${t} exceeds 100%`),n.toString()}function au(e,t){let r=BigInt(Ke(e,t)),n=10n**27n,o=r*10000n/n;return o>10000n&&J(`${t} exceeds 100%`),o.toString()}function Xy(e,t,r){let n=`${r}[${t}]`,o=ce(e,n),i=St(F(o,["asset","symbol","coin","underlying","underlyingToken","name"])??o.underlyingToken?.symbol??o.liquidityToken?.symbol,`${n}.asset`),s=mo(F(o,["address","token","mint","underlyingAddress"])??o.underlyingToken?.address??o.liquidityToken?.mint,`${n}.address`),a=Ke(F(o,["amount","balance","aTokenBalance","supplyBalance","supplyAssets","collateral","deposited","shares"]),`${n}.amount`),c=Gy(F(o,["decimals","tokenDecimals","mintDecimals"])??o.underlyingToken?.decimals??o.liquidityToken?.decimals,`${n}.decimals`),u=Ke(F(o,["price","priceQuoteMinor","oraclePrice","marketPrice"]),`${n}.price`),l=Gy(F(o,["priceDecimals","oraclePriceDecimals","quoteDecimals"]),`${n}.priceDecimals`),d=null;if(r==="collateral"){let p=F(o,["liquidationThresholdBps","liquidationThreshold","lltv","ltvBps","collateralFactor","collateralFactorBps"])??o.supplyInfo?.liquidationThreshold;p==null&&J(`${n}.liquidationThresholdBps is required`,"POSITION_HEALTH_MISSING_THRESHOLD"),d=e0(p,`${n}.liquidationThreshold`)}return Xe({asset:i,address:s,amount:a,decimals:String(c),price:u,priceDecimals:String(l),liquidationThresholdBps:d})}function rs(e,t){return e==null?[]:(Array.isArray(e)||J(`${t} must be an array`),e.length>Vy&&J(`${t} exceeds ${Vy} assets`),e)}function w1(e){let t=F(e,["chain","chainId","network"]),r=e.market&&typeof e.market=="object"?e.market.chain?.chainId??(typeof e.market.chain=="string"||typeof e.market.chain=="bigint"?e.market.chain:null):null,n=y1(t??r,"chain"),o=St(F(e,["account","address","owner","user","wallet"]),"account"),i=F(e,["marketId","pool","vault"]);return typeof e.market=="string"||typeof e.market=="bigint"?i=i??e.market:e.market&&typeof e.market=="object"&&(i=i??e.market.address??e.market.name??e.market.marketId??null),{chain:n,account:o,market:i==null?null:St(String(i),"market")}}function k1(e,t){let r=Ke(t.asOf??e.asOf,"asOf"),n=Ke(F(e,["observedAt","fetchedAt","updatedAt","lastUpdate","asOfObserved"]),"observedAt"),o=Ke(F(e,["expiresAt","validUntil","staleAfter"]),"expiresAt");return{asOf:r,observedAt:n,expiresAt:o}}function x1(e,t,r,n){return BigInt(n)<BigInt(t)?{status:"unknown",reason:"FUTURE_EVIDENCE"}:BigInt(n)>=BigInt(r)?{status:"stale",reason:"STALE_EVIDENCE"}:e.status==="stale"?{status:"stale",reason:"STALE_EVIDENCE"}:e.status==="unknown"?{status:"unknown",reason:"UNKNOWN_EVIDENCE"}:e.status==="incomplete"?{status:"incomplete",reason:"INCOMPLETE_EVIDENCE"}:{status:"complete",reason:null}}function fo(e,t,r,n={}){return Xe({code:e,severity:t,message:r,...n})}function t0(e){let t={critical:0,warning:1,info:2};return[...e].sort((r,n)=>{let o=(t[r.severity]??9)-(t[n.severity]??9);return o||xr(r.code,n.code)||xr(r.message,n.message)})}function Qy(e,t,r,n,o,i){return BigInt(e)*BigInt(r)*10n**BigInt(o-t)*10n**BigInt(i-n)}function S1(e,t){let r=[...e,...t],n=r.reduce((w,E)=>Math.max(w,Number(E.decimals)),0),o=r.reduce((w,E)=>Math.max(w,Number(E.priceDecimals)),0),i=0n,s=0n,a=0n;for(let w of e){let E=Qy(w.amount,Number(w.decimals),w.price,Number(w.priceDecimals),n,o);s+=E,i+=E*BigInt(w.liquidationThresholdBps)}for(let w of t)a+=Qy(w.amount,Number(w.decimals),w.price,Number(w.priceDecimals),n,o);let c=10n**BigInt(n),u={tokenDecimals:String(n),priceDecimals:String(o),unit:"quote-minor = floor(scaledValue / 10^tokenDecimals) at priceDecimals"},l=(s/c).toString(),d=(a/c).toString(),p=(i/10000n/c).toString();if(a===0n)return Xe({healthFactorWad:null,healthFactorStatus:s===0n?"empty":"no-debt",totalCollateralQuoteMinor:l,totalDebtQuoteMinor:"0",weightedCollateralQuoteMinor:p,liquidationBufferQuoteMinor:p,quote:u});let f=(i*an/(a*10000n)).toString(),m=i/10000n-a,y=m<0n?"-":"",h=m<0n?-m:m;return Xe({healthFactorWad:f,healthFactorStatus:BigInt(f)<an?"liquidatable":"priced",totalCollateralQuoteMinor:l,totalDebtQuoteMinor:d,weightedCollateralQuoteMinor:p,liquidationBufferQuoteMinor:`${y}${(h/c).toString()}`,quote:u})}function Ne(e,t={}){W(e),W(t);let r=ce(e,"snapshot");ce(t,"options");let n=Zy(r),{chain:o,account:i,market:s}=w1(r),a=b1(r.evidence),{asOf:c,observedAt:u,expiresAt:l}=k1(r,t),d=St(r.id??r.positionId??`${n}:${o}:${i}:${s??"default"}`,"id"),p=mo(r.tenantId,"tenantId"),f=rs(r.collateral??r.supplies??r.deposits,"collateral").map((h,w)=>Xy(h,w,"collateral")),m=rs(r.debt??r.borrows??r.liabilities,"debt").map((h,w)=>Xy(h,w,"debt")),y={id:d,protocol:n,chain:o,account:i,market:s,observedAt:u,expiresAt:l,asOf:c,evidence:a,collateral:f,debt:m};return p&&(y.tenantId=p),Xe(y)}function E1(e){return F(e,["liquidationThresholdBps","liquidationThreshold","lltv"])??e.market?.lltv??e.state?.lltv}function A1(e,t={}){return F(t,["collateralFactorBps","collateralFactor","liquidationThresholdBps","liquidationThreshold"])??F(e,["collateralFactorBps","collateralFactor","liquidationThresholdBps"])}function v1(e){return F(e,["price","priceQuoteMinor","oraclePrice","marketPrice"])}function I1(e,t={}){W(e);let r=ce(e,"snapshot");if(Array.isArray(r.collateral)||Array.isArray(r.debt))return Ne({...r,protocol:"aave-v3"},t);let n=r.userReserves??r.reserves??r.market?.reserves;if(!Array.isArray(n))return Ne({...r,protocol:"aave-v3"},t);let o=[],i=[];for(let s of n){let a=ce(s,"reserve"),c=ce(a.underlyingToken??a.token??a,"reserve.token"),u={asset:c.symbol??a.symbol,address:c.address??a.address,decimals:c.decimals??a.decimals,price:F(a,["price","priceQuoteMinor","oraclePrice"])??a.size?.usd,priceDecimals:F(a,["priceDecimals","oraclePriceDecimals"]),liquidationThreshold:a.liquidationThresholdBps??a.liquidationThreshold??a.supplyInfo?.liquidationThreshold},l=F(a,["aTokenBalance","supplyBalance","collateral","amount","supplied"]),d=F(a,["variableDebtTokenBalance","stableDebtTokenBalance","borrowBalance","debt","borrowed"]);l!=null&&l!=="0"&&o.push({...u,amount:l}),d!=null&&d!=="0"&&i.push({...u,amount:d})}return Ne({...r,protocol:"aave-v3",collateral:r.collateral??o,debt:r.debt??i},t)}function _1(e,t={}){W(e);let r=ce(e,"snapshot");if(Array.isArray(r.collateral)||Array.isArray(r.debt))return Ne({...r,protocol:"morpho"},t);let n=E1(r),o=r.collateralAsset??r.market?.collateralAsset??{},i=r.loanAsset??r.market?.loanAsset??{},s=r.position??r.state??{},a=[{asset:o.symbol??r.collateralSymbol,address:o.address,decimals:o.decimals??r.collateralDecimals,amount:F(r,["collateral","collateralAmount","supplyAssets"])??s.collateral??s.supplyAssets,price:F(r,["collateralPrice","price","priceQuoteMinor"])??o.price,priceDecimals:F(r,["collateralPriceDecimals","priceDecimals"])??o.priceDecimals,liquidationThreshold:n}],c=r.debt??[{asset:i.symbol??r.loanSymbol,address:i.address,decimals:i.decimals??r.loanDecimals,amount:F(r,["borrowAssets","debt","borrowAmount"])??s.borrowAssets,price:F(r,["loanPrice","debtPrice"])??i.price,priceDecimals:F(r,["loanPriceDecimals","debtPriceDecimals"])??i.priceDecimals}],u=(Array.isArray(c)?c:[c]).filter(l=>l&&l.amount!=null&&l.amount!=="0"&&l.amount!==0n);return Ne({...r,protocol:"morpho",market:r.marketId??r.market?.marketId??r.market,collateral:Array.isArray(a)?a:[a],debt:u},t)}function O1(e,t={}){W(e);let r=ce(e,"snapshot"),n=r.markets??r.cTokens??(r.cToken||r.underlying?[r]:null);if(r.collateral||r.debt)return Ne({...r,protocol:"compound"},t);let o=[],i=[];for(let s of rs(n??[],"markets")){let a=ce(s,"market"),c={asset:a.underlying??a.underlying_symbol??a.symbol??a.asset,address:a.address??a.cToken,decimals:a.decimals??a.underlyingDecimals,price:a.price??a.priceQuoteMinor??a.oraclePrice,priceDecimals:a.priceDecimals,liquidationThreshold:A1(r,a)},u=F(a,["supplyBalance","balance","amount","totalSupply"]),l=F(a,["borrowBalance","borrow","debt","totalBorrow"]);u!=null&&u!=="0"&&o.push({...c,amount:u}),l!=null&&l!=="0"&&i.push({...c,amount:l})}return Ne({...r,protocol:"compound",collateral:o,debt:i},t)}function T1(e,t={}){W(e);let r=ce(e,"snapshot");if(r.stale===!0||r.reserve?.lastUpdate?.stale===1)return Ne({...r,protocol:"solend",evidence:{...r.evidence||{},status:"stale"}},t);if(r.collateral||r.debt)return Ne({...r,protocol:"solend"},t);let n=r.reserves??r.obligation?.deposits??(r.mint||r.mintDecimals!=null?[r]:[]),o=[],i=[];for(let s of rs(n,"reserves")){let a=ce(s,"reserve"),c={asset:a.symbol??a.asset??a.liquidityToken?.symbol,address:a.mint??a.address??a.liquidityToken?.mint,decimals:a.mintDecimals??a.decimals??a.liquidityToken?.decimals,price:v1(a),priceDecimals:a.priceDecimals??a.oraclePriceDecimals,liquidationThreshold:a.liquidationThresholdBps??a.liquidationThreshold??a.loanToValueRatio??r.liquidationThresholdBps},u=F(a,["depositedAmount","collateral","amount","availableAmount"]),l=F(a,["borrowedAmount","borrowBalance","debt"]);if(l==null&&a.borrowedAmountWads!=null){let d=Ke(a.borrowedAmountWads,"borrowedAmountWads");l=(BigInt(d)/10n**18n).toString()}u!=null&&u!=="0"&&o.push({...c,amount:u}),l!=null&&l!=="0"&&i.push({...c,amount:l})}return Ne({...r,protocol:"solend",collateral:o,debt:i},t)}function C1(e,t={}){W(e);let r=ce(e,"snapshot");if(r.collateral||r.debt)return Ne({...r,protocol:"spark"},t);let n=r.vault??r.savingsVault??r.data?.vault??r,o=ce(n,"vault"),i=[{asset:o.symbol??o.asset??r.token??"savings",address:o.address??r.address,decimals:o.decimals??r.decimals,amount:F(r,["amount","shares","balance"])??o.amount??o.shares,price:F(r,["price","priceQuoteMinor"])??o.price,priceDecimals:F(r,["priceDecimals"])??o.priceDecimals,liquidationThreshold:F(r,["liquidationThresholdBps","liquidationThreshold"])??"10000"}],s=F(r,["debt","borrowed","borrowAmount"]),a=s==null||s==="0"?[]:[{asset:r.debtAsset??r.borrowSymbol??"debt",address:r.debtAddress,decimals:r.debtDecimals??o.decimals??r.decimals,amount:s,price:r.debtPrice??r.price,priceDecimals:r.debtPriceDecimals??r.priceDecimals??o.priceDecimals}];return Ne({...r,protocol:"spark",collateral:i,debt:a},t)}function N1(e,t={}){W(e);let r=ce(e,"snapshot");if(r.tvlUsd!=null&&typeof r.tvlUsd=="number"&&J("farming tvlUsd Number is refused; supply exact collateral and debt amounts","POSITION_HEALTH_UNSAFE_NUMBER"),Array.isArray(r.collateral)||Array.isArray(r.debt)){let c=Ne({...r,protocol:"farming"},t),u=mo(r.recipe??r.farmingMethod??r.methodId,"recipe");return Xe(u?{...c,recipe:u}:c)}let n=mo(r.recipe??r.farmingMethod??r.methodId,"recipe"),o=[{asset:r.symbol??r.asset??r.project??"farm",address:r.pool??r.address,decimals:r.decimals,amount:F(r,["amount","deposited","shares","collateral"]),price:F(r,["price","priceQuoteMinor"]),priceDecimals:r.priceDecimals,liquidationThreshold:F(r,["liquidationThresholdBps","liquidationThreshold","lltv"])??"10000"}],i=F(r,["debt","borrowed","borrowAmount"]),s=i==null||i==="0"?[]:[{asset:r.debtAsset??r.borrowSymbol??"debt",decimals:r.debtDecimals??r.decimals,amount:i,price:r.debtPrice??r.price,priceDecimals:r.debtPriceDecimals??r.priceDecimals}],a=Ne({...r,protocol:"farming",collateral:o,debt:s},t);return Xe(n?{...a,recipe:n}:a)}function $1(e,t={}){W(e);let r=ce(e,"snapshot"),n=Zy(r);return R1[n]({...r,protocol:n},t)}function P1(e){let t=e==null?{}:ce(e,"thresholds"),r=Ke(t.criticalHealthFactorWad??Hy.criticalHealthFactorWad,"thresholds.criticalHealthFactorWad",{positive:!0}),n=Ke(t.warningHealthFactorWad??Hy.warningHealthFactorWad,"thresholds.warningHealthFactorWad",{positive:!0});BigInt(n)<BigInt(r)&&J("thresholds.warningHealthFactorWad must be >= criticalHealthFactorWad");let o=Ke(t.minLiquidationBufferQuoteMinor,"thresholds.minLiquidationBufferQuoteMinor",{optional:!0});return Xe({criticalHealthFactorWad:r,warningHealthFactorWad:n,minLiquidationBufferQuoteMinor:o})}function q1(e,t,r){let n=[];if(r.status!=="complete"){let a=r.reason||"UNKNOWN_EVIDENCE";return n.push(fo(a,"critical","Position evidence is not current and complete; health fails closed.")),{healthStatus:r.status==="stale"?"stale":"unknown",findings:n,metrics:{healthFactorWad:null,totalCollateralQuoteMinor:null,totalDebtQuoteMinor:null,weightedCollateralQuoteMinor:null,liquidationBufferQuoteMinor:null,quote:null}}}let o=e;if(e.healthFactorStatus==="empty")return{healthStatus:"empty",findings:n,metrics:o};if(e.healthFactorStatus==="no-debt")return{healthStatus:"no-debt",findings:n,metrics:o};let i=BigInt(e.healthFactorWad);i<an?n.push(fo("LIQUIDATABLE","critical","Health factor is below 1.0 wad; the position is at or past liquidation.")):i<BigInt(t.criticalHealthFactorWad)?n.push(fo("HEALTH_FACTOR_CRITICAL","critical","Health factor is below the configured critical threshold.")):i<BigInt(t.warningHealthFactorWad)&&n.push(fo("HEALTH_FACTOR_WARNING","warning","Health factor is below the configured warning threshold.")),t.minLiquidationBufferQuoteMinor!=null&&BigInt(e.liquidationBufferQuoteMinor)<BigInt(t.minLiquidationBufferQuoteMinor)&&n.push(fo("LIQUIDATION_BUFFER_LOW",i<an?"critical":"warning","Liquidation buffer is below the configured quote-minor minimum."));let s="healthy";return n.some(a=>a.code==="LIQUIDATABLE")?s="liquidatable":n.some(a=>a.severity==="critical")?s="critical":n.length&&(s="warning"),{healthStatus:s,findings:n,metrics:o}}function uu(e={},t={}){W(e),W(t),ce(e,"input"),ce(t,"options"),t.asOf==null&&e.asOf==null&&J("explicit asOf required","POSITION_HEALTH_MISSING_ASOF");let r=$1(e,t),n=P1(t.thresholds??e.thresholds),o=x1(r.evidence,r.observedAt,r.expiresAt,r.asOf),i=q1(o.status==="complete"?S1(r.collateral,r.debt):{healthFactorStatus:"unknown"},n,o),s={recordVersion:Yy,recordType:"position-health",label:Jy,posture:"alert-only",executionReady:!1,signingReady:!1,broadcastReady:!1,id:r.id,protocol:r.protocol,chain:r.chain,account:r.account,market:r.market,observedAt:r.observedAt,expiresAt:r.expiresAt,asOf:r.asOf,evidence:r.evidence,collateral:r.collateral,debt:r.debt,thresholds:n,healthStatus:i.healthStatus,healthFactorWad:i.metrics.healthFactorWad,totalCollateralQuoteMinor:i.metrics.totalCollateralQuoteMinor,totalDebtQuoteMinor:i.metrics.totalDebtQuoteMinor,weightedCollateralQuoteMinor:i.metrics.weightedCollateralQuoteMinor,liquidationBufferQuoteMinor:i.metrics.liquidationBufferQuoteMinor,quote:i.metrics.quote,findings:t0(i.findings)};return r.tenantId&&(s.tenantId=r.tenantId),r.recipe&&(s.recipe=r.recipe),Xe(s)}function r0(e={},t={}){W(e),W(t);let r=Array.isArray(e)?{snapshots:e}:ce(e,"input"),n=r.snapshots??r.positions;Array.isArray(n)||J("snapshots must be an array"),n.length>Wy&&J(`snapshots exceed ${Wy}`);let o=Ke(t.asOf??r.asOf,"asOf"),i=t.thresholds??r.thresholds,s=mo(r.tenantId,"tenantId"),a=n.map((p,f)=>uu(s&&p?.tenantId==null?{...p,tenantId:s}:p,{...t,asOf:o,thresholds:i,index:f})).sort((p,f)=>xr(p.chain,f.chain)||xr(p.account,f.account)||xr(p.id,f.id)),c=t0(a.flatMap(p=>p.findings.map(f=>({...f,positionId:p.id})))),u=a.filter(p=>p.healthStatus==="unknown"||p.healthStatus==="stale").length,l=a.filter(p=>p.findings.length>0).length,d={recordVersion:Yy,recordType:"position-health-book",label:Jy,posture:"alert-only",asOf:o,positionCount:String(a.length),alertCount:String(l),failClosedCount:String(u),positions:a,findings:c};return s&&(d.tenantId=s),Xe(d)}var Yy,Jy,d1,Hy,p1,f1,m1,h1,an,zy,Vy,Wy,cu,R1,n0=v(()=>{nn();Yy=1,Jy="Alert findings only; not an execution signal and not a live oracle.",d1=Object.freeze(["aave-v3","morpho","compound","solend","spark","farming","generic"]),Hy=Object.freeze({criticalHealthFactorWad:"1050000000000000000",warningHealthFactorWad:"1250000000000000000"}),p1=new Set(d1),f1=Object.freeze({aave:"aave-v3",aavev3:"aave-v3","aave-v3":"aave-v3",morpho:"morpho",compound:"compound","compound-v2":"compound","compound-v3":"compound",solend:"solend",save:"solend",spark:"spark","spark-lend":"spark",farming:"farming",farm:"farming",yield:"farming",generic:"generic",lending:"generic"}),m1=new Set(["complete","incomplete","unknown","stale"]),h1=/[\u0000-\u001f\u007f]/,an=10n**18n,zy=36,Vy=64,Wy=128,cu=class extends Error{constructor(t,r="POSITION_HEALTH_INVALID"){super(`position health: ${t}`),this.name="PositionHealthValidationError",this.code=r}};R1=Object.freeze({"aave-v3":I1,morpho:_1,compound:O1,solend:T1,spark:C1,farming:N1,generic:Ne})});function pe(e,t){throw new lu(e,t)}function Sr(e){if(e&&typeof e=="object"&&!Object.isFrozen(e)){for(let t of Object.values(e))Sr(t);Object.freeze(e)}return e}function Dt(e,t){return(!e||typeof e!="object"||Array.isArray(e)||Object.getPrototypeOf(e)!==Object.prototype)&&pe(`${t} must be a plain object`),e}function Me(e,t,{optional:r=!1,lower:n=!1}={}){if(e==null&&r)return null;typeof e!="string"&&pe(`${t} must be a string`);let o=e.trim();return o||pe(`${t} is required`),z1.test(o)&&pe(`${t} contains control characters`),o.length>2048&&pe(`${t} is too long`),n?o.toLowerCase():o}function Et(e,t,{optional:r=!1,positive:n=!1}={}){if(e==null&&r)return null;typeof e=="number"&&pe(`${t} must be an exact decimal string or BigInt; Number coercion is refused`,"GOVERNANCE_UNSAFE_NUMBER");let o;typeof e=="bigint"?o=e.toString():typeof e=="string"?o=e.trim():pe(`${t} must be an exact decimal string or BigInt`),/^\d+$/.test(o)||pe(`${t} must be a non-negative base-10 integer string`);let i=BigInt(o);return n&&i===0n&&pe(`${t} must be positive`),i.toString()}function cn(e,t){return e==null?null:Me(e,t)}function ir(e,t){for(let r of t)if(e[r]!==void 0)return e[r]}function G1(e,t="action"){let r=Me(e,t,{lower:!0});return M1.has(r)||pe(`${t} must be proposal, delegation, or vote`),r}function K1(e,t="proposal.state"){e==null&&pe(`${t} is required`,"GOVERNANCE_MISSING_PROPOSAL_STATE");let r=Me(e,t,{lower:!0});return F1.has(r)||pe(`${t} is not a recognized proposal state`),r==="unknown"&&pe(`${t} is unknown; voting and execution fail closed`,"GOVERNANCE_UNKNOWN_PROPOSAL_STATE"),r}function X1(e){let t=Me(e,"support",{lower:!0});return j1.has(t)||pe("support must be for, against, or abstain"),t}function ns(e,{accountRequired:t=!0}={}){return Sr({chain:Me(ir(e,["chain","chainId","network"]),"chain",{lower:!0}),governor:Me(ir(e,["governor","governorAddress","governance","contract"]),"governor"),account:Me(ir(e,["account","address","owner","voter","from","proposer"]),"account",{optional:!t})})}function yo(e,t){let r=cn(t.tenantId??e.tenantId,"tenantId");return r?{tenantId:r}:{}}function os(e,t,r="asOf"){return Et(t.asOf??e.asOf,r)}function Q1(e,t={}){W(e),W(t);let r=Dt(e,"proposal");Dt(t,"options");let n=os(r,t),o=ns(r,{accountRequired:!1}),i=Me(ir(r,["proposalId","id"]),"proposalId"),s=K1(ir(r,["state","status","proposalState"])),a=cn(r.title??r.name,"title"),c=cn(r.description??r.body??r.summary,"description"),u=cn(r.proposer,"proposer"),l=Et(r.startBlock??r.start,"startBlock",{optional:!0}),d=Et(r.endBlock??r.end,"endBlock",{optional:!0}),p=Et(r.forVotes??r.votesFor,"forVotes",{optional:!0}),f=Et(r.againstVotes??r.votesAgainst,"againstVotes",{optional:!0}),m=Et(r.abstainVotes??r.votesAbstain,"abstainVotes",{optional:!0}),y={recordVersion:ho,recordType:"governance-proposal",label:or,asOf:n,chain:o.chain,governor:o.governor,proposalId:i,state:s,votable:V1.has(s),terminal:W1.has(s),title:a,description:c,proposer:u,startBlock:l,endBlock:d,tallies:{forVotes:p,againstVotes:f,abstainVotes:m},occurred:!1,...yo(r,t)};return Sr(y)}function Y1(e,t={}){W(e),W(t);let r=Dt(e,"intent");Dt(t,"options");let n=os(r,t),o=ns(r),i=r.mode??(r.action==="undelegate"?"undelegate":"delegate"),s=Me(i,"mode",{lower:!0});H1.has(s)||pe("mode must be delegate or undelegate");let a=s==="undelegate"?cn(r.delegatee??r.to,"delegatee"):Me(r.delegatee??r.to,"delegatee"),c=Et(ir(r,["votingPower","votes","power","balance"]),"votingPower",{positive:!0}),u={recordVersion:ho,recordType:"governance-delegation-intent",label:or,action:"delegation",mode:s,asOf:n,chain:o.chain,governor:o.governor,account:o.account,delegatee:s==="undelegate"?a??o.account:a,votingPower:c,occurred:!1,...yo(r,t)};return Sr(u)}function J1(e,t={}){W(e),W(t);let r=Dt(e,"intent");Dt(t,"options");let n=os(r,t),o=Q1(r.proposal??r,t);o.votable||pe(`proposal ${o.proposalId} is ${o.state} and is not votable`,"GOVERNANCE_PROPOSAL_NOT_VOTABLE");let i=ns({...r,chain:r.chain??o.chain,governor:r.governor??o.governor}),s=X1(r.support??r.choice??r.vote),a=Et(ir(r,["votingPower","votes","power","weight"]),"votingPower",{positive:!0}),c=cn(r.reason??r.comment,"reason"),u={recordVersion:ho,recordType:"governance-vote-intent",label:or,action:"vote",asOf:n,chain:i.chain,governor:i.governor,account:i.account,proposalId:o.proposalId,proposalState:o.state,support:s,votingPower:a,reason:c,occurred:!1,voted:!1,signed:!1,broadcast:!1,proposal:o,...yo(r,t)};return Sr(u)}function Z1(e,t={}){W(e);let r=Dt(e,"intent"),n=os(r,t),o=ns(r),i=Me(r.title??r.name,"title"),s=Me(r.description??r.body,"description"),a=r.targets;(!Array.isArray(a)||a.length===0)&&pe("targets must be a non-empty array");let c=(r.values??a.map(()=>"0")).map((d,p)=>Et(d,`values[${p}]`));c.length!==a.length&&pe("values length must match targets");let u=(r.calldatas??r.data??[]).map((d,p)=>Me(String(d),`calldatas[${p}]`));u.length!==a.length&&pe("calldatas length must match targets");let l=Et(ir(r,["votingPower","proposalThreshold","threshold"]),"votingPower",{positive:!0});return Sr({recordVersion:ho,recordType:"governance-proposal-intent",label:or,action:"proposal",asOf:n,chain:o.chain,governor:o.governor,account:o.account,title:i,description:s,targets:a.map((d,p)=>Me(d,`targets[${p}]`)),values:c,calldatas:u,votingPower:l,occurred:!1,...yo(r,t)})}function eO(e,t,r){return e==="vote"?J1(t,r):e==="delegation"?Y1(t,r):Z1(t,r)}function tO(e){return e.action==="vote"?[`Unsigned vote preview for proposal ${e.proposalId} on ${e.governor}.`,`Support: ${e.support}. Voting power: ${e.votingPower} (exact base units).`,`Proposal state is ${e.proposalState}. No ballot is submitted.`,or]:e.action==="delegation"?[`Unsigned ${e.mode} preview on ${e.governor}.`,`Account ${e.account} \u2192 ${e.delegatee}. Voting power: ${e.votingPower}.`,"No delegation transaction is signed or broadcast.",or]:[`Unsigned proposal preview on ${e.governor}: ${e.title}.`,`${e.targets.length} target(s). Voting power: ${e.votingPower}.`,"No proposal is submitted.",or]}function o0(e={},t={}){W(e),W(t);let r=Dt(e,"intent");Dt(t,"options"),t.asOf==null&&r.asOf==null&&pe("explicit asOf required","GOVERNANCE_MISSING_ASOF");let n=G1(r.action??r.type??t.action??rO(r)),o=eO(n,{...r,action:n},t);return Sr({recordVersion:ho,recordType:"governance-preview",label:or,action:n,asOf:o.asOf,occurred:!1,voted:!1,signed:!1,broadcast:!1,executionReady:!1,signingReady:!1,broadcastReady:!1,lines:tO(o),intent:o,...yo(r,t)})}function rO(e){if(e.support!=null||e.choice!=null||e.proposalId!=null)return"vote";if(e.delegatee!=null||e.mode==="delegate"||e.mode==="undelegate")return"delegation";if(e.targets!=null||e.title!=null)return"proposal";pe("action is required")}var ho,or,L1,B1,U1,D1,M1,F1,j1,H1,z1,V1,W1,lu,i0=v(()=>{nn();ho=1,or="Unsigned prepare material only; no vote, signature, or broadcast occurred.",L1=Object.freeze(["proposal","delegation","vote"]),B1=Object.freeze(["pending","active","succeeded","queued","executed","defeated","canceled","expired","unknown"]),U1=Object.freeze(["for","against","abstain"]),D1=Object.freeze(["delegate","undelegate"]),M1=new Set(L1),F1=new Set(B1),j1=new Set(U1),H1=new Set(D1),z1=/[\u0000-\u001f\u007f]/,V1=new Set(["active"]),W1=new Set(["executed","defeated","canceled","expired"]),lu=class extends Error{constructor(t,r="GOVERNANCE_PREPARE_INVALID"){super(`governance prepare: ${t}`),this.name="GovernancePrepareError",this.code=r}}});import{createHash as nO}from"node:crypto";import{getAddress as oO,wordlists as iO}from"ethers";import{address as sO}from"@solana/addresses";import{base58check as aO,bech32 as s0,bech32m as cO}from"@scure/base";import{sha256 as uO}from"@noble/hashes/sha2.js";function p0(e){return String(e).replace(/[^a-z0-9]/gi,"").toLowerCase()}function CO(e){let t=p0(e);return kO.some(r=>t.includes(r))}function NO(e){return OO.has(p0(e))}function RO(e){let t=String(e).trim().toLowerCase().split(/\s+/).filter(Boolean);return AO.has(t.length)&&t.every(r=>iO.en.getWordIndex(r)>=0)}function It(e){let t=new WeakSet,r=0;function n(o,i,s,a=""){if(r+=1,r>hO)throw new RangeError("safety-intelligence: input is too large");if(s>yO)throw new RangeError("safety-intelligence: input is too deep");if(o==null||typeof o=="boolean")return;if(typeof o=="string"){if(o.length>gO)throw new RangeError(`safety-intelligence: string too long at ${i}`);if(xO.test(o)||SO.test(o)||RO(o))throw new TypeError(`safety-intelligence: key material refused at ${i}`);if(EO.test(o)&&!NO(a))throw new TypeError(`safety-intelligence: key material refused at ${i}`);return}if(typeof o=="number"){if(!Number.isFinite(o))throw new TypeError(`safety-intelligence: finite number required at ${i}`);return}if(typeof o=="bigint")return;if(typeof o!="object")throw new TypeError(`safety-intelligence: JSON-like input required at ${i}`);if(ArrayBuffer.isView(o)||o instanceof ArrayBuffer)throw new TypeError(`safety-intelligence: binary key material refused at ${i}`);if(t.has(o))throw new TypeError(`safety-intelligence: cyclic input refused at ${i}`);if(t.add(o),Array.isArray(o)){if(o.length>go)throw new RangeError(`safety-intelligence: array too large at ${i}`);if(o.length===64&&o.every(u=>Number.isInteger(u)&&u>=0&&u<=255))throw new TypeError(`safety-intelligence: key material refused at ${i}`);o.forEach((u,l)=>n(u,`${i}[${l}]`,s+1,a)),t.delete(o);return}if(Object.getPrototypeOf(o)!==Object.prototype)throw new TypeError(`safety-intelligence: plain object required at ${i}`);let c=Reflect.ownKeys(o).filter(u=>typeof u=="string");if(c.length>64)throw new RangeError(`safety-intelligence: too many fields at ${i}`);for(let u of c){if(CO(u))throw new TypeError(`safety-intelligence: secret-bearing field refused at ${i}.${u}`);let l=Object.getOwnPropertyDescriptor(o,u),d=l&&"get"in l&&typeof l.get=="function"?l.get.call(o):o[u];d!==void 0&&n(d,`${i}.${u}`,s+1,u)}t.delete(o)}return n(e,"$",0),e}function Re(e,t,r){for(let n of Object.keys(e||{}))if(!t.has(n))throw new TypeError(`safety-intelligence: unknown ${r} field ${n}`)}function Mt(e,t,r,{required:n=!1}={}){if(e==null||e===""){if(n)throw new TypeError(`safety-intelligence: ${t} required`);return null}let o=String(e).trim();if(!o&&n)throw new TypeError(`safety-intelligence: ${t} required`);if(o.length>r)throw new RangeError(`safety-intelligence: ${t} exceeds ${r} characters`);if(/[\u0000-\u001f\u007f\u200b-\u200f\u202a-\u202e\u2060-\u2064\ufeff]/i.test(o))throw new TypeError(`safety-intelligence: control or invisible characters refused in ${t}`);return o||null}function is(e,t){if(e==null||e==="")throw new TypeError(`safety-intelligence: ${t} required`);let r;if(typeof e=="number"){if(!Number.isSafeInteger(e)||e<0)throw new TypeError(`safety-intelligence: ${t} must be a safe integer millisecond timestamp`);r=e}else if(typeof e=="string"){let n=e.trim();if(IO.test(n)&&n.length<=_O){if(r=Number(n),!Number.isSafeInteger(r))throw new TypeError(`safety-intelligence: ${t} must be a safe integer millisecond timestamp`)}else if(vO.test(n)){if(r=Date.parse(n),!Number.isFinite(r)||new Date(r).toISOString().replace(/\.000Z$/,"Z")!==n&&new Date(r).toISOString()!==n)throw new TypeError(`safety-intelligence: ${t} must be a canonical ISO timestamp`)}else throw new TypeError(`safety-intelligence: ${t} must be a canonical ISO timestamp or integer milliseconds`)}else throw new TypeError(`safety-intelligence: ${t} must be a timestamp`);if(!Number.isFinite(r))throw new TypeError(`safety-intelligence: ${t} must be a valid timestamp`);return{ms:r,iso:new Date(r).toISOString()}}function f0(e,t){return e==null||e===""?null:is(e,t)}function l0(e){let t=String(e||"").trim().toLowerCase();if(t==="evm"||t==="eip155")return"evm";if(t==="solana")return"solana";if(t==="bitcoin"||t==="bip122"||t==="btc")return"bitcoin";throw new TypeError("safety-intelligence: chain family must be evm, solana, or bitcoin")}function m0(e){It(e);let t,r;if(Number.isInteger(e))t="evm",r=e;else if(typeof e=="string"){let i=e.trim();if(/^\d+$/.test(i))t="evm",r=Number(i);else{let s=/^(eip155|evm|solana|bitcoin|bip122|btc):([^:]+)$/i.exec(i);if(!s)throw new TypeError("safety-intelligence: chain must include a supported family");t=l0(s[1]),r=s[2]}}else if(e&&typeof e=="object"&&!Array.isArray(e))Re(e,new Set(["family","namespace","chainId","reference","network","key"]),"chain"),t=l0(e.family??e.namespace??(e.chainId!=null?"evm":"")),r=t==="evm"?e.chainId??e.reference:e.network??e.reference;else throw new TypeError("safety-intelligence: chain required");if(t==="evm"){let i=typeof r=="string"&&/^\d+$/.test(r)?Number(r):r;if(!Number.isSafeInteger(i)||i<=0)throw new TypeError("safety-intelligence: EVM chainId must be a positive safe integer");return me({family:t,namespace:"eip155",reference:String(i),chainId:i,key:`eip155:${i}`})}let n=Mt(r,`${t} network`,80,{required:!0}).toLowerCase();if(!/^[a-z0-9][a-z0-9._-]*$/.test(n))throw new TypeError(`safety-intelligence: invalid ${t} network`);let o=t==="bitcoin"?"bip122":"solana";return me({family:t,namespace:o,reference:n,network:n,key:`${o}:${n}`})}function $O(e){let t=String(e).toLowerCase();return["mainnet","main","bitcoin"].includes(t)?"mainnet":["testnet","testnet3","test","signet"].includes(t)?"testnet":t==="regtest"?"regtest":"unknown"}function PO(e,t){let r=Mt(e,"bitcoin address",100,{required:!0}),n=$O(t.reference);if(/^(bc1|tb1|bcrt1)/i.test(r)){if(r!==r.toLowerCase()&&r!==r.toUpperCase())throw new TypeError("safety-intelligence: mixed-case Bitcoin bech32 address refused");let s=r.toLowerCase(),a,c;try{a=s0.decode(s,100),c="bech32"}catch{try{a=cO.decode(s,100),c="bech32m"}catch{throw new TypeError("safety-intelligence: invalid Bitcoin bech32 checksum")}}let u=a.words[0],l;try{l=s0.fromWords(a.words.slice(1))}catch{throw new TypeError("safety-intelligence: invalid Bitcoin witness program")}if(!Number.isInteger(u)||u<0||u>16||l.length<2||l.length>40)throw new TypeError("safety-intelligence: invalid Bitcoin witness program");if(u===0&&(c!=="bech32"||![20,32].includes(l.length)))throw new TypeError("safety-intelligence: invalid v0 Bitcoin witness address");if(u>0&&c!=="bech32m")throw new TypeError("safety-intelligence: v1+ Bitcoin witness address must use bech32m");let d=n==="mainnet"?"bc":n==="testnet"?"tb":n==="regtest"?"bcrt":null;if(d&&a.prefix!==d)throw new TypeError(`safety-intelligence: Bitcoin address does not match ${t.reference}`);return{canonical:s,display:s}}let o;try{o=wO.decode(r)}catch{throw new TypeError("safety-intelligence: invalid Bitcoin base58check address")}if(o.length!==21)throw new TypeError("safety-intelligence: invalid Bitcoin address payload");let i=o[0];if(n==="mainnet"&&![0,5].includes(i))throw new TypeError("safety-intelligence: Bitcoin address does not match mainnet");if((n==="testnet"||n==="regtest")&&![111,196].includes(i))throw new TypeError(`safety-intelligence: Bitcoin address does not match ${t.reference}`);return{canonical:r,display:r}}function qO(e,t){let r=m0(t);It(e);let n=Mt(e,`${r.family} address`,128,{required:!0});if(r.family==="evm"){let o=n.startsWith("0X")?`0x${n.slice(2)}`:n,i;try{i=oO(o)}catch{throw new TypeError("safety-intelligence: invalid EVM address or mixed-case checksum")}return me({canonical:i.toLowerCase(),display:i})}if(r.family==="solana"){let o;try{o=String(sO(n))}catch{throw new TypeError("safety-intelligence: invalid Solana address")}return me({canonical:o,display:o})}return me(PO(n,r))}function Ft(e={}){if(It(e),!e||typeof e!="object"||Array.isArray(e))throw new TypeError("safety-intelligence: target object required");Re(e,new Set(["chain","chainId","family","network","address","displayAddress","key"]),"target");let t=e.chain??(e.chainId!=null?{family:e.family??"evm",chainId:e.chainId}:{family:e.family,network:e.network}),r=m0(t),n=qO(e.address,r);return me({chain:r,address:n.canonical,displayAddress:n.display,key:`${r.key}:${n.canonical}`})}function vt(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(vt).join(",")}]`:`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${vt(e[t])}`).join(",")}}`}function fu(e){return nO("sha256").update(e).digest("hex")}function me(e){if(!e||typeof e!="object"||Object.isFrozen(e))return e;for(let t of Object.values(e))me(t);return Object.freeze(e)}function du(e){let t=String(e||"").trim().toLowerCase().replace(/_/g,"-"),n={sanction:"sanctions",sanctions:"sanctions",phishing:"phishing",scam:"scam",fraud:"scam",poisoning:"address-poisoning","address-poisoning":"address-poisoning"}[t];if(!n||!pO.has(n))throw new TypeError(`safety-intelligence: unsupported evidence kind ${String(e||"<missing>")}`);return n}function LO(e){let t=e.verdict??e.disposition??e.result??e.status;if(t==null){for(let o of["match","listed","malicious"])if(typeof e[o]=="boolean"){t=e[o]?"MATCH":"NO_MATCH";break}}let r=String(t||"").trim().toUpperCase().replace(/[ -]+/g,"_"),n=TO[r];if(!n)throw new TypeError(`safety-intelligence: unsupported evidence verdict ${String(t||"<missing>")}`);return n}function BO(e,t){let r=e.target??(e.address!=null?{address:e.address,chain:e.chain,chainId:e.chainId,family:e.family,network:e.network}:null);if(!r){if(!t)throw new TypeError("safety-intelligence: evidence target required");return t}return Ft(r)}function UO(e={},t={}){if(It({input:e,options:t}),!e||typeof e!="object"||Array.isArray(e))throw new TypeError("safety-intelligence: evidence object required");Re(e,new Set(["kind","type","category","source","sourceRecordId","recordId","reference","verdict","disposition","result","status","match","listed","malicious","confidence","fetchedAt","expiresAt","expiry","ttlMs","summary","target","address","chain","chainId","family","network"]),"evidence"),Re(t,new Set(["target","asOf"]),"evidence option");let r=BO(e,t.target?Ft(t.target):null),n=du(e.kind??e.type??e.category),o=LO(e),i=e.source&&typeof e.source=="object"?e.source.name??e.source.id:e.source,s=Mt(i,"evidence source",120,{required:!0}),a=Number(e.confidence);if(!Number.isFinite(a)||a<0||a>1)throw new TypeError("safety-intelligence: evidence confidence must be between 0 and 1");let c=is(e.fetchedAt,"evidence fetchedAt"),u=f0(e.expiresAt??e.expiry,"evidence expiresAt");if(!u&&e.ttlMs!=null){let h=Number(e.ttlMs);if(!Number.isSafeInteger(h)||h<=0||h>c0)throw new RangeError(`safety-intelligence: evidence ttlMs must be 1..${c0}`);u={ms:c.ms+h,iso:new Date(c.ms+h).toISOString()}}if(!u)throw new TypeError("safety-intelligence: evidence expiresAt or ttlMs required");if(u.ms<=c.ms)throw new TypeError("safety-intelligence: evidence expiry must be after fetchedAt");if(t.asOf==null)throw new TypeError("safety-intelligence: explicit asOf required for deterministic freshness");let l=is(t.asOf,"asOf").ms,d=c.ms>l+bO?"FUTURE":u.ms<=l?"STALE":"CURRENT",p=Mt(e.sourceRecordId??e.recordId??e.reference,"source record id",160),f=Mt(e.summary,"evidence summary",500),m={kind:n,verdict:o,source:s,...p?{sourceRecordId:p}:{},fetchedAt:c.iso,expiresAt:u.iso,confidence:a,freshness:d,target:r.key,...f?{summary:f}:{}},y=`safety-evidence:${fu(vt(m))}`;return me({id:y,...m})}function DO(e=[],t={}){if(It({records:e,options:t}),!Array.isArray(e))throw new TypeError("safety-intelligence: evidence must be an array");let r=t.maxEvidence??fO;if(!Number.isSafeInteger(r)||r<=0||r>go)throw new RangeError("safety-intelligence: invalid maxEvidence");if(e.length>r)throw new RangeError(`safety-intelligence: evidence exceeds ${r} records`);Re(t,new Set(["target","asOf","maxEvidence"]),"evidence-set option");let n={target:t.target,asOf:t.asOf},o=new Map(e.map(i=>{let s=UO(i,n);return[s.id,s]}));return me([...o.values()].sort((i,s)=>i.id.localeCompare(s.id)))}function MO(e,t,r){if(!e||typeof e!="object"||Array.isArray(e))throw new TypeError(`safety-intelligence: knownContacts[${r}] must be an object`);Re(e,new Set(["id","label","address","chain","chainId","family","network"]),"contact");let n=Ft({address:e.address,chain:e.chain??(e.chainId!=null?{family:e.family??"evm",chainId:e.chainId}:e.family||e.network?{family:e.family,network:e.network}:t)}),o=Mt(e.id,"contact id",120),i=Mt(e.label,"contact label",120);return me({...o?{id:o}:{},...i?{label:i}:{},target:n})}function ss(e,t){if(typeof e=="number"&&(!Number.isSafeInteger(e)||e<0))throw new TypeError(`safety-intelligence: ${t} must be an exact non-negative integer`);let r=typeof e=="bigint"?e.toString():String(e??"").trim();if(!/^\d+$/.test(r)||r.length>100)throw new TypeError(`safety-intelligence: ${t} must be a bounded base-unit integer`);return BigInt(r).toString()}function FO(e,t,r){if(!e||typeof e!="object"||Array.isArray(e))throw new TypeError(`safety-intelligence: observations[${r}] must be an object`);Re(e,new Set(["address","counterparty","from","direction","amountBaseUnits","chain","chainId","family","network","observedAt"]),"observation");let n=e.counterparty??e.address??e.from,o=Ft({address:n,chain:e.chain??(e.chainId!=null?{family:e.family??"evm",chainId:e.chainId}:e.family||e.network?{family:e.family,network:e.network}:t)}),i=String(e.direction??(e.from!=null?"inbound":"unknown")).toLowerCase(),s=["inbound","received","receive"].includes(i)?"inbound":["outbound","sent","send"].includes(i)?"outbound":"unknown",a=ss(e.amountBaseUnits,`observations[${r}].amountBaseUnits`),c=f0(e.observedAt,`observations[${r}].observedAt`)?.iso??null;return me({target:o,direction:s,amountBaseUnits:a,...c?{observedAt:c}:{}})}function jO(e,t){let r=0;for(;r<e.length&&r<t.length&&e[r]===t[r];)r+=1;return r}function HO(e,t){let r=0;for(;r<e.length&&r<t.length&&e[e.length-1-r]===t[t.length-1-r];)r+=1;return r}function d0(e){return e.chain.family==="evm"?e.address.slice(2):e.address}function At(e){return me({code:e.code,severity:e.severity,category:e.category,basis:e.basis,message:e.message,...e.evidenceIds?.length?{evidenceIds:[...e.evidenceIds].sort()}:{},...e.relatedTargets?.length?{relatedTargets:[...e.relatedTargets].sort()}:{}})}function pu(e){let t=new Map;for(let r of e){let n=vt(r);t.set(n,r)}return[...t.values()].sort((r,n)=>(u0[r.severity]??9)-(u0[n.severity]??9)||r.category.localeCompare(n.category)||r.code.localeCompare(n.code)||vt(r).localeCompare(vt(n)))}function zO(e={},t={}){if(It({input:e,options:t}),!e||typeof e!="object"||Array.isArray(e))throw new TypeError("safety-intelligence: poisoning input object required");Re(e,new Set(["target","address","chain","chainId","family","network","knownContacts","expectedContact","observations","dustThresholdBaseUnits","lookalikeEdgeChars"]),"poisoning input"),Re(t,new Set(["maxContacts","maxObservations"]),"poisoning option");let r=Ft(e.target??{address:e.address,chain:e.chain,chainId:e.chainId,family:e.family,network:e.network}),n=e.knownContacts??[],o=e.observations??[];if(!Array.isArray(n))throw new TypeError("safety-intelligence: knownContacts must be an array");if(!Array.isArray(o))throw new TypeError("safety-intelligence: observations must be an array");let i=t.maxContacts??mO,s=t.maxObservations??go;if(!Number.isSafeInteger(i)||i<=0||i>go)throw new RangeError("safety-intelligence: invalid maxContacts");if(!Number.isSafeInteger(s)||s<=0||s>go)throw new RangeError("safety-intelligence: invalid maxObservations");if(n.length>i)throw new RangeError(`safety-intelligence: knownContacts exceeds ${i}`);if(o.length>s)throw new RangeError(`safety-intelligence: observations exceeds ${s}`);let a=n.map((f,m)=>MO(f,r.chain,m)).sort((f,m)=>f.target.key.localeCompare(m.target.key)||String(f.id||f.label||"").localeCompare(String(m.id||m.label||""))),c=o.map((f,m)=>FO(f,r.chain,m)).sort((f,m)=>vt(f).localeCompare(vt(m))),u=a.filter(f=>f.target.chain.key===r.chain.key),l=u.filter(f=>f.target.address===r.address),d=[],p=null;if(e.expectedContact!=null){if(typeof e.expectedContact=="string")p=Ft({chain:r.chain,address:e.expectedContact});else if(typeof e.expectedContact=="object"&&!Array.isArray(e.expectedContact))Re(e.expectedContact,new Set(["address","chain","chainId","family","network"]),"expectedContact"),p=Ft({address:e.expectedContact.address,chain:e.expectedContact.chain??(e.expectedContact.chainId!=null?{family:e.expectedContact.family??"evm",chainId:e.expectedContact.chainId}:e.expectedContact.family||e.expectedContact.network?{family:e.expectedContact.family,network:e.expectedContact.network}:r.chain)});else throw new TypeError("safety-intelligence: expectedContact must be an address or target object");p.key!==r.key&&d.push(At({code:"EXPECTED_CONTACT_MISMATCH",severity:"REVIEW",category:"address-poisoning",basis:"contact-match",message:"Destination does not exactly match the caller-supplied expected contact.",relatedTargets:[p.key,r.key]}))}if(l.length===0){let f=Number(e.lookalikeEdgeChars??4);if(!Number.isSafeInteger(f)||f<3||f>12)throw new RangeError("safety-intelligence: lookalikeEdgeChars must be 3..12");let m=d0(r);for(let y of u){let h=d0(y.target),w=jO(m,h),E=HO(m,h);w>=f&&E>=f&&m!==h&&d.push(At({code:"ADDRESS_LOOKALIKE",severity:"REVIEW",category:"address-poisoning",basis:"heuristic",message:`Destination shares at least ${f} leading and trailing characters with a different known contact.`,relatedTargets:[y.target.key,r.key]}))}if(e.dustThresholdBaseUnits!=null){let y=BigInt(ss(e.dustThresholdBaseUnits,"dustThresholdBaseUnits"));c.filter(w=>w.target.key===r.key&&w.direction==="inbound"&&BigInt(w.amountBaseUnits)<=y).length>0&&d.push(At({code:"PRIOR_DUST_CONTACT",severity:"REVIEW",category:"address-poisoning",basis:"heuristic",message:"Destination appeared as an inbound counterparty at or below the caller-supplied base-unit dust threshold.",relatedTargets:[r.key]}))}}return me({target:r,exactKnownContact:l.length>0,exactContacts:l,findings:pu(d),dustThresholdBaseUnits:e.dustThresholdBaseUnits==null?null:ss(e.dustThresholdBaseUnits,"dustThresholdBaseUnits")})}function VO(e){let t=e??dO;if(!Array.isArray(t)||t.length===0||t.length>32)throw new TypeError("safety-intelligence: requiredChecks must be a non-empty bounded array");let r=t.map((o,i)=>{if(typeof o=="string")return{kind:du(o),source:null};if(!o||typeof o!="object"||Array.isArray(o))throw new TypeError(`safety-intelligence: requiredChecks[${i}] must be a kind or object`);return Re(o,new Set(["kind","source"]),"required check"),{kind:du(o.kind),source:Mt(o.source,"required check source",120,{required:!0})}}),n=new Map(r.map(o=>[`${o.kind}:${o.source||"*"}`,o]));return me([...n.values()].sort((o,i)=>`${o.kind}:${o.source||"*"}`.localeCompare(`${i.kind}:${i.source||"*"}`)))}function WO(e,t){return e.filter(r=>r.kind===t.kind&&(!t.source||r.source===t.source))}function GO(e){return e.some(t=>t.severity==="BLOCK")?"BLOCK":e.some(t=>t.severity==="REVIEW")?"REVIEW":e.some(t=>t.severity==="UNKNOWN")?"UNKNOWN":"CLEAR"}function h0(e){return It(e),`sha256:${fu(vt(e))}`}function mu(e={},t={}){if(It({input:e,options:t}),!e||typeof e!="object"||Array.isArray(e))throw new TypeError("safety-intelligence: evaluation input object required");if(Re(e,new Set(["target","address","chain","chainId","family","network","evidence","requiredChecks","knownContacts","expectedContact","observations","dustThresholdBaseUnits","lookalikeEdgeChars"]),"evaluation input"),Re(t,new Set(["asOf","minClearConfidence","minBlockConfidence","maxEvidence","maxContacts","maxObservations"]),"evaluation option"),t.asOf==null)throw new TypeError("safety-intelligence: explicit asOf required for deterministic evaluation");let r=is(t.asOf,"asOf").iso,n=e.target??{address:e.address,chain:e.chain,chainId:e.chainId,family:e.family,network:e.network},o=Ft(n),i=Number(t.minClearConfidence??.8),s=Number(t.minBlockConfidence??.8);for(let[h,w]of[["minClearConfidence",i],["minBlockConfidence",s]])if(!Number.isFinite(w)||w<0||w>1)throw new TypeError(`safety-intelligence: ${h} must be between 0 and 1`);let a=DO(e.evidence??[],{target:o,asOf:r,maxEvidence:t.maxEvidence}),c=a.filter(h=>h.target===o.key),u=VO(e.requiredChecks),l=[];for(let h of c)h.freshness==="CURRENT"&&h.verdict==="BLOCK"?l.push(At({code:h.confidence>=s?"CURRENT_EXPLICIT_BLOCK":"LOW_CONFIDENCE_BLOCK_SIGNAL",severity:h.confidence>=s?"BLOCK":"REVIEW",category:h.kind,basis:"explicit-evidence",message:h.confidence>=s?"A current injected source returned an explicit BLOCK disposition.":"A current injected source returned BLOCK below the configured block-confidence threshold.",evidenceIds:[h.id]})):h.freshness==="CURRENT"&&h.verdict==="REVIEW"?l.push(At({code:"CURRENT_EXPLICIT_REVIEW",severity:"REVIEW",category:h.kind,basis:"explicit-evidence",message:"A current injected source returned an explicit REVIEW disposition.",evidenceIds:[h.id]})):h.freshness!=="CURRENT"&&["BLOCK","REVIEW"].includes(h.verdict)?l.push(At({code:h.freshness==="FUTURE"?"FUTURE_POSITIVE_EVIDENCE":"STALE_POSITIVE_EVIDENCE",severity:"REVIEW",category:h.kind,basis:"explicit-evidence",message:"Non-current injected adverse evidence requires human review; it is not treated as a current fact.",evidenceIds:[h.id]})):h.freshness==="CURRENT"&&h.verdict==="UNKNOWN"&&l.push(At({code:"SOURCE_UNKNOWN",severity:"UNKNOWN",category:h.kind,basis:"explicit-evidence",message:"A current injected source could not determine a disposition.",evidenceIds:[h.id]}));for(let h of u){let w=WO(c,h),E=w.filter(O=>O.freshness==="CURRENT"),_=E.filter(O=>O.verdict==="CLEAR"&&O.confidence>=i),x=E.filter(O=>O.verdict==="BLOCK");if(_.length>0&&x.length>0&&l.push(At({code:"CONTRADICTORY_EVIDENCE",severity:"REVIEW",category:h.kind,basis:"explicit-evidence",message:"Current injected sources conflict for a required check.",evidenceIds:[..._,...x].map(O=>O.id)})),_.length===0){let O=E.filter(g=>g.verdict==="CLEAR"),I=w.filter(g=>g.verdict==="CLEAR"&&g.freshness!=="CURRENT"),k=h.source?`${h.kind} from ${h.source}`:h.kind;l.push(At({code:O.length>0?"CLEAR_CONFIDENCE_TOO_LOW":I.length>0?"STALE_CLEAR_EVIDENCE":"MISSING_CURRENT_EVIDENCE",severity:"UNKNOWN",category:h.kind,basis:"coverage",message:`Required check ${k} lacks current explicit CLEAR evidence at the configured confidence threshold.`,evidenceIds:[...O,...I].map(g=>g.id)}))}}let d=zO({target:o,knownContacts:e.knownContacts??[],expectedContact:e.expectedContact,observations:e.observations??[],dustThresholdBaseUnits:e.dustThresholdBaseUnits,lookalikeEdgeChars:e.lookalikeEdgeChars},{maxContacts:t.maxContacts,maxObservations:t.maxObservations});l.push(...d.findings);let p=pu(l),f=GO(p);f==="CLEAR"&&(p=pu([At({code:"REQUIRED_EVIDENCE_CURRENT_CLEAR",severity:"INFO",category:"coverage",basis:"explicit-evidence",message:"Every required injected check supplied current explicit CLEAR evidence; this is source-scoped and not a safety guarantee.",evidenceIds:c.filter(h=>h.freshness==="CURRENT"&&h.verdict==="CLEAR").map(h=>h.id)})]),f="CLEAR");let m={version:a0,target:o.key,evaluatedAt:r,decision:f,gate:f==="CLEAR"?"CONTINUE":f==="BLOCK"?"BLOCK":"HOLD",requiredChecks:u,evidenceIds:c.map(h=>h.id).sort(),findings:p},y=me({...m,hash:h0(m)});return me({version:a0,target:o,evaluatedAt:r,status:f,evidence:a,requiredChecks:u,poisoning:d,policy:y})}function KO(e={}){if(It(e),!e||typeof e!="object"||Array.isArray(e))throw new TypeError("safety-intelligence: transaction object required");Re(e,new Set(["target","to","destination","address","chain","chainId","family","network","amountBaseUnits","valueBaseUnits"]),"transaction");let t=Ft(e.target??{address:e.to??e.destination??e.address,chain:e.chain,chainId:e.chainId,family:e.family,network:e.network}),r=e.amountBaseUnits??e.valueBaseUnits,n=r==null?null:ss(r,"transaction amountBaseUnits"),o={target:t,amountBaseUnits:n};return me({id:`safety-transaction:${fu(vt(o))}`,...o})}function y0(e={},t={}){if(It({input:e,options:t}),!e||typeof e!="object"||Array.isArray(e))throw new TypeError("safety-intelligence: transaction evaluation input object required");Re(e,new Set(["transaction","evidence","requiredChecks","knownContacts","expectedContact","observations","dustThresholdBaseUnits","lookalikeEdgeChars"]),"transaction evaluation input");let r=KO(e.transaction),n=mu({target:r.target,evidence:e.evidence??[],requiredChecks:e.requiredChecks,knownContacts:e.knownContacts??[],expectedContact:e.expectedContact,observations:e.observations??[],dustThresholdBaseUnits:e.dustThresholdBaseUnits,lookalikeEdgeChars:e.lookalikeEdgeChars},t),{hash:o,...i}=n.policy,s={...i,transactionId:r.id},a=me({...s,hash:h0(s)});return me({...n,transaction:r,policy:a})}var a0,OL,lO,dO,pO,fO,mO,go,hO,yO,gO,c0,bO,wO,kO,xO,SO,EO,AO,vO,IO,_O,OO,TO,u0,g0=v(()=>{a0=1,OL=Object.freeze({CLEAR:"CLEAR",UNKNOWN:"UNKNOWN",REVIEW:"REVIEW",BLOCK:"BLOCK"}),lO=Object.freeze(["sanctions","phishing","scam","address-poisoning"]),dO=Object.freeze(["sanctions","phishing","scam"]),pO=new Set(lO),fO=128,mO=256,go=512,hO=4096,yO=8,gO=2048,c0=366*24*60*60*1e3,bO=6e4,wO=aO(uO),kO=["privatekey","privkey","secretkey","secret","seedphrase","seed","mnemonic","passphrase","password","keystore","keymaterial","wif","xprv","xpriv","apikey","bearer","authorization","credential"],xO=/\b[5KL][1-9A-HJ-NP-Za-km-z]{50,51}\b/,SO=/\bxprv[0-9A-Za-z]{50,}\b/,EO=/^\s*(?:0x)?[0-9a-fA-F]{64}\s*$/,AO=new Set([12,15,18,21,24]),vO=/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d{3})?Z$/,IO=/^\d+$/,_O=String(Number.MAX_SAFE_INTEGER).length,OO=new Set(["txhash","transactionhash","recordid","hash","digest","evidenceid","sourcerecordid","blockhash","receipthash","commithash","payloadhash","sha256","sha256hex","id"]),TO=Object.freeze({CLEAR:"CLEAR",NO_MATCH:"CLEAR",NOT_LISTED:"CLEAR",ABSENT:"CLEAR",REVIEW:"REVIEW",SUSPECTED:"REVIEW",POSSIBLE_MATCH:"REVIEW",INCONCLUSIVE:"REVIEW",BLOCK:"BLOCK",MATCH:"BLOCK",LISTED:"BLOCK",MALICIOUS:"BLOCK",PHISHING:"BLOCK",SCAM:"BLOCK",UNKNOWN:"UNKNOWN",UNAVAILABLE:"UNKNOWN",ERROR:"UNKNOWN"}),u0=Object.freeze({BLOCK:0,REVIEW:1,UNKNOWN:2,INFO:3})});var CL,NL,RL,b0=v(()=>{CL=Object.freeze(["chainId","agentAddress","accountAddress","actions","targets","maxValueWei","maxGasWei","maxSlippageBps","expiresAt","nonce","revocationKey"]),NL=Object.freeze(["read","simulate"]),RL=1440*60});function w0(e){let t=String(e),r=t.toLowerCase().replace(/[\s._-]+/g,"");return XO.test(t)||QO.includes(r)}function Er(e,t="$",r=new Set,n=""){if(e==null)return e;if(typeof e=="string"){let o=JO.includes(String(n).toLowerCase().replace(/[_-]/g,""));for(let{rule:i,re:s}of YO)if(!(o&&i.startsWith("raw-32-byte-hex"))&&s.test(e))throw new bo(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"&&w0(o))throw new bo(`${t}[${JSON.stringify(o)}]`,"forbidden-key-name");Er(o,`${t}[key]`,r),Er(i,`${t}[${String(o)}]`,r)}return e}if(e instanceof Set){let o=0;for(let i of e.values())Er(i,`${t}[${o++}]`,r);return e}if(Array.isArray(e))return e.forEach((o,i)=>Er(o,`${t}[${i}]`,r)),e;for(let[o,i]of Object.entries(e)){if(w0(o))throw new bo(`${t}.${o}`,"forbidden-key-name");Er(i,`${t}.${o}`,r,o)}return e}var bo,XO,QO,YO,JO,k0=v(()=>{b0();bo=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}},XO=/(private[_-]?key|secret|bearer|keystore|mnemonic|seed[_-]?phrase|passphrase|password|api[_-]?key|access[_-]?token|auth[_-]?token|session[_-]?token|signer[_-]?url|signature)/i,QO=Object.freeze(["privkey","wif","xprv","seed"]);YO=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}]),JO=Object.freeze(["grantid","id","hash","sha256","sha256hex","checksum","txhash","transactionhash","blockhash","digest","userophash","commithash","prevhash","intenthash","canonicalhash","payloadhash","requestid"])});import{createHash as ZO}from"node:crypto";function yu(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(yu).join(",")}]`:`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${yu(e[t])}`).join(",")}}`}function eT(e){return e===void 0?null:JSON.parse(JSON.stringify(e))}function as(e){if(e&&typeof e=="object"&&!Object.isFrozen(e)){Object.freeze(e);for(let t of Object.values(e))as(t)}return e}function gu(e,t="fact"){try{Er(e,t)}catch{throw new Error(`${t} contains custody material and is forbidden`)}}function E0(e){return ZO("sha256").update(yu(e)).digest("hex")}function A0({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:eT(r)};return as({...s,hash:E0(s)})}function cs({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");gu(t,"intent");let n=A0({tradeId:e,state:"intent",fact:t,asOf:r,previousHash:null,external:!1});return as({tradeId:e,state:"intent",events:[n],headHash:n.hash,custody:"none",execution:"prepare-only"})}function v0(e,t,r,n={}){if(bu(e),!(x0[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`);gu(r,t);let i=n.external===!0||n.externallySupplied===!0;if(S0.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=A0({tradeId:e.tradeId,state:t,fact:r,asOf:a,previousHash:s.hash,external:i});return as({...e,state:t,events:[...e.events,c],headHash:c.hash})}function bu(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(E0(i)!==o)throw new Error(`trade event ${r} hash mismatch`);if(gu(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&&!x0[t.state]?.includes(n.state))throw new Error(`invalid recorded transition ${t.state} -> ${n.state}`);if(S0.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 hu,x0,S0,wu=v(()=>{k0();hu=Object.freeze(["intent","quote_comparison","simulation","prepared","approval","signed","broadcast","settlement","balance_delta","position"]),x0=Object.freeze(Object.fromEntries(hu.map((e,t)=>[e,Object.freeze(t+1<hu.length?[hu[t+1]]:[])]))),S0=new Set(["signed","broadcast"])});function I0(e){let t=String(e?.type??e?.surface??e?.kind??"").toLowerCase();return tT[t]??t}function rT(e,t){return String(e?.id??e?.signalId??e?.asset??e?.market??e?.pool??e?.collection??`${I0(e)}:${t}`)}function et(e,t,r,n=!0){!n||r===null||!Number.isFinite(r)||e.push({feature:t,value:us(r)})}function nT(e,t){let r=Fe(e.repeatBuys??e.repeat_buys??e.buyCount),n=Fe(e.walletWinRate??e.winRate);et(t,"repeat_buys",r===null?null:Ae((r-1)/4)*.38),et(t,"wallet_win_rate",n===null?null:(Ae(n)-.5)*.5)}function oT(e,t){let r=Fe(e.ageHours??e.poolAgeHours),n=Fe(e.liquidityUsd??e.liquidity),o=e.liquidityLocked??e.locked;et(t,"pool_age",r===null?null:r<24?-.42:Ae(r/720)*.12),et(t,"liquidity",n===null?null:(Ae(Math.log10(Math.max(1,n))/7)-.5)*.28),et(t,"liquidity_lock",o==null?null:o?.12:-.28)}function iT(e,t){let r=Fe(e.floorChange??e.floorChangePct),n=Fe(e.sales??e.saleCount);et(t,"floor_change",r===null?null:Ae(r,-1,1)*.35),et(t,"sales_depth",n===null?null:Ae(n/50)*.18)}function sT(e,t){let r=Fe(e.flowImbalance??e.imbalance),n=Fe(e.fundingRate??e.funding);et(t,"flow_imbalance",r===null?null:Ae(r,-1,1)*.42),et(t,"funding",n===null?null:-Ae(n*100,-1,1)*.12)}function aT(e,t){let r=Fe(e.marketProbability??e.marketPrice??e.probability),n=Fe(e.fairProbability??e.referenceProbability??e.fairValue);et(t,"probability_mispricing",r===null||n===null?null:Ae(n-r,-1,1)*.65);let o=Fe(e.liquidityUsd??e.liquidity);et(t,"market_liquidity",o===null?null:Ae(Math.log10(Math.max(1,o))/6)*.12)}function uT(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=>Fe(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 ls(e=[],t=[],r={}){if(!Array.isArray(e)||!Array.isArray(t))throw new TypeError("events and markouts must be arrays");let n=Ae(Fe(r.minimumCoverage)??.5);return e.map((o,i)=>{let s=I0(o),a=rT(o,i),c=cT[s],u=[];c&&c(o,u);let l=s==="wallet"?2:s==="pool"?3:2,d=us(Ae(u.length/l)),p=u.reduce((_,x)=>_+x.value,0),f=uT(o,a,t),m=f===null?0:Ae(f,-1,1)*.35;f!==null&&et(u,"shadow_markout",m);let y=us(Ae(.5+p+m)),h=f===null?.8:Ae(.85+f*.3,.35,1),w=us(Ae(d*h)),E=["COLD_INTELLIGENCE_ONLY","NO_HOT_EXECUTION"];return c||E.push("UNSUPPORTED_SIGNAL_TYPE"),d<n&&E.push("LOW_COVERAGE","NO_TRADE"),w<.5&&E.push("LOW_CONFIDENCE","NO_TRADE"),s==="pool"&&(Fe(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:y,confidence:w,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 VL,tT,Ae,Fe,us,cT,ku=v(()=>{VL=Object.freeze(["wallet","pool","nft_floor","hl_flow","prediction_market"]),tT=Object.freeze({wallets:"wallet",smart_wallet:"wallet",pools:"pool",new_pool:"pool",nft:"nft_floor",nft_floors:"nft_floor",hyperliquid:"hl_flow",prediction:"prediction_market",prediction_markets:"prediction_market"}),Ae=(e,t=0,r=1)=>Math.min(r,Math.max(t,e)),Fe=e=>Number.isFinite(Number(e))?Number(e):null,us=e=>Math.round(e*1e4)/1e4;cT=Object.freeze({wallet:nT,pool:oT,nft_floor:iT,hl_flow:sT,prediction_market:aT})});function lT(e=[],t=[],r={}){let n=ls(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 dT(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=cs({tradeId:r,intent:n,asOf:t.asOf??Date.now()});return{tradeId:r,intent:n,lifecycle:o,recommendation:"PREPARE_RESEARCH_ONLY"}}function _0(e=[],t=[],r={}){let{scored:n,candidates:o,blocked:i}=lT(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(dT(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 O0=v(()=>{ku();wu()});function T0(e){let t=fT[Number(e)]||[];return new Set([...t,...pT].map(r=>String(r).trim().toLowerCase()).filter(Boolean))}var pT,fT,C0=v(()=>{pT=["0x000000000022d473030f116ddee9f6b43ac78ba3"],fT={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 ds(e,t={}){e&&e.passes.push({ok:!0,kind:t.kind||"gather",name:t.name||null})}function xu(e){e&&(e.prepareAttempted=!0)}function Su(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 gT(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?[...T0(o)]:[];return new Set([...n,...i])}function bT(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 wT(e){return!e||typeof e!="object"?!1:!!(e.transaction||e.tx||e.to||e.destination||e.settlement||e.data||e.value!=null)}function kT(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 xT(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 ST(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 mT)e[o]&&r.push(`prepared fact carries ${o}`);for(let o of hT)e[o]&&r.push(`prepared fact claims executed ${o}`);if(n.unsigned=r.length===0,wT(e)){let o=kT(e),i=o.to==null?"":String(o.to).trim();if(!i)r.push("prepared transaction is missing destination"),n.destination="missing";else{let s=yT.test(i);if(i.startsWith("0x")&&!s)r.push("prepared destination is not a 20-byte address"),n.destination="malformed";else{let a=gT(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(bT(e)){let o=xT(e),i=e.slippageGuard?.capBps!=null?Number(e.slippageGuard.capBps):Ct;!Number.isInteger(o)||o<0?(r.push("swap prepare is missing integer slippage bps"),n.slippage="missing"):o>Ct||Number.isInteger(i)&&o>i||Number.isInteger(i)&&i>Ct?(r.push(`slippage ${o} exceeds cap ${Math.min(i,Ct)}`),n.slippage="blocked"):n.slippage="ok"}return{ok:r.length===0,checks:n,errors:r}}function Eu(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=ST(t);return{ok:r.length===0&&n.ok,checks:n.checks,errors:[...r,...n.errors]}}var mT,hT,yT,N0=v(()=>{C0();rt();mT=Object.freeze(["signature","signedTx","signedTransaction","rawTransaction","signedPayload","signedRaw"]),hT=Object.freeze(["txid","txHash","transactionHash","broadcastHash"]),yT=/^0x[a-fA-F0-9]{40}$/});var $0={};H($0,{DESK_TOOLS:()=>AT,runDeskTool:()=>IT});function vT(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")>ET)throw new TypeError("tool arguments exceed size limit")}function $e(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 IT(e,t,r={}){if(vT(t),e==="research_artifact"){if($e(t,["sourceUrl","fetchedAt","snapshot","claim","confidence"],["contradictions"]),String(t.snapshot).length>R0)throw new TypeError("snapshot exceeds size limit");return{ok:!0,artifact:(r.createResearchArtifact||Iy)(t)}}if(e==="portfolio_analyze")return $e(t,["ledger","asOf"],["priceTtlMs"]),{ok:!0,analysis:(r.summarizePortfolioLedger||Py)(t.ledger,{asOf:t.asOf,priceTtlMs:t.priceTtlMs})};if(e==="tax_lots")return $e(t,["input"],["method","asOf"]),{ok:!0,records:(r.createCostBasisRecords||Fy)(t.input,{method:t.method,asOf:t.asOf})};if(e==="position_health"){$e(t,["action","input","asOf"],["thresholds"]);let n={asOf:t.asOf,thresholds:t.thresholds};if(t.action==="evaluate")return{ok:!0,analysis:(r.evaluatePositionHealth||uu)(t.input,n)};if(t.action==="book")return{ok:!0,analysis:(r.evaluatePositionBook||r0)(t.input,n)};throw new TypeError("unknown position health action")}if(e==="governance_prepare")return $e(t,["input","asOf"]),{ok:!0,preview:(r.previewGovernanceAction||o0)(t.input,{asOf:t.asOf}),prepared:!1};if(e==="safety_intelligence"){$e(t,["action","input","asOf"],["minClearConfidence","minBlockConfidence"]);let n={asOf:t.asOf,minClearConfidence:t.minClearConfidence,minBlockConfidence:t.minBlockConfidence};if(t.action==="address")return{ok:!0,analysis:(r.evaluateAddressSafety||mu)(t.input,n)};if(t.action==="transaction")return{ok:!0,analysis:(r.evaluateTransactionSafety||y0)(t.input,n)};throw new TypeError("unknown safety intelligence action")}if(e==="portfolio_risk")return $e(t,["input"]),{ok:!0,analysis:(r.summarizePortfolioRisk||Zi)(t.input)};if(e==="trade_lifecycle"){let n=r.createTradeLifecycle||cs,o=r.advanceTradeLifecycle||v0,i=r.assertTradeLifecycle||bu;if(t.action==="create")return $e(t,["action","tradeId","intent"],["asOf"]),{ok:!0,lifecycle:n({tradeId:t.tradeId,intent:t.intent,asOf:t.asOf})};if(t.action==="verify"){if($e(t,["action","lifecycle"]),i(t.lifecycle),t.lifecycle.state==="prepared"){xu(r.loopVerifier);let s=t.lifecycle.events?.findLast?.(c=>c.state==="prepared")||t.lifecycle.events?.filter(c=>c.state==="prepared").at(-1),a=Eu(t.lifecycle,s?.fact||{});if(!a.ok)return Su(r.loopVerifier,{name:"trade_lifecycle",error:a.errors[0]}),{ok:!1,error:`prepare verifier failed: ${a.errors[0]}`,checks:a.checks};ds(r.loopVerifier,{kind:"prepare",name:"trade_lifecycle"})}else ds(r.loopVerifier,{kind:"lifecycle",name:"trade_lifecycle"});return{ok:!0,valid:!0,lifecycle:t.lifecycle}}if(t.action==="advance"){if($e(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"){xu(r.loopVerifier);let a=Eu(t.lifecycle,t.fact);if(!a.ok)return Su(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"&&ds(r.loopVerifier,{kind:"prepare",name:"trade_lifecycle"}),{ok:!0,lifecycle:s}}throw new TypeError("unknown trade lifecycle action")}if(e==="signal_score"){if($e(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||_0)(t.events,n,{limit:t.limit});let i=(r.scoreSignals||ls)(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||xy,o=!r.artifactStore,i=r.artifactStore||await n(r.artifactStoreOptions||{});try{if(t.action==="get")return $e(t,["action","id"]),{ok:!0,artifact:await i.getArtifact(t.id)};if(t.action==="list")return $e(t,["action"],["type"]),{ok:!0,artifacts:await i.listArtifacts(t.type)};if(t.action==="put")return $e(t,["action","id","type","data","createdAt"]),{ok:!0,artifact:await i.putArtifact(t)};if(t.action==="link")return $e(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 ET,R0,ps,Qe,_t,AT,P0=v(()=>{Sy();_y();qy();ou();jy();n0();i0();g0();wu();ku();O0();N0();ET=128*1024,R0=5e4,ps={type:"string",minLength:1,maxLength:256},Qe={type:"object",additionalProperties:!0},_t=(e,t,r)=>Object.freeze({type:"function",function:Object.freeze({name:e,description:t,strict:!0,parameters:r})}),AT=Object.freeze([_t("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:ps,type:{type:"string",enum:["project","entity","source","thesis","strategy","simulation","prepared_action","receipt","position"]},createdAt:{type:"string",minLength:1,maxLength:64},data:Qe,parentId:ps,childId:ps},required:["action"],additionalProperties:!1}),_t("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:R0},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}),_t("portfolio_analyze","Deterministically summarize a caller-supplied portfolio ledger; performs no network or account access.",{type:"object",properties:{ledger:Qe,asOf:{type:"number"},priceTtlMs:{type:"number",minimum:0}},required:["ledger","asOf"],additionalProperties:!1}),_t("tax_lots","Build exact-integer cost-basis records from caller-supplied events. Accounting records only, not tax advice.",{type:"object",properties:{input:Qe,method:{type:"string",enum:["fifo","lifo","hifo","specific"]},asOf:{type:"string",minLength:1}},required:["input"],additionalProperties:!1}),_t("position_health","Evaluate caller-supplied lending or farming snapshots. Alert-only, with no network access or execution signal.",{type:"object",properties:{action:{type:"string",enum:["evaluate","book"]},input:Qe,asOf:{type:"string",minLength:1},thresholds:Qe},required:["action","input","asOf"],additionalProperties:!1}),_t("governance_prepare","Create a deterministic semantic preview of a caller-supplied governance intent. No adapter, calldata, vote, signature, or broadcast.",{type:"object",properties:{input:Qe,asOf:{type:"string",minLength:1}},required:["input","asOf"],additionalProperties:!1}),_t("safety_intelligence","Evaluate caller-supplied address or transaction safety evidence. No source is contacted and unknown evidence fails closed.",{type:"object",properties:{action:{type:"string",enum:["address","transaction"]},input:Qe,asOf:{type:"string",minLength:1},minClearConfidence:{type:"number",minimum:0,maximum:1},minBlockConfidence:{type:"number",minimum:0,maximum:1}},required:["action","input","asOf"],additionalProperties:!1}),_t("portfolio_risk","Summarize concentration and coverage from caller-supplied portfolio snapshots. No network or account access.",{type:"object",properties:{input:Qe},required:["input"],additionalProperties:!1}),_t("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:ps,intent:Qe,lifecycle:Qe,state:{type:"string",enum:["quote_comparison","simulation","prepared","approval","settlement","balance_delta","position"]},fact:Qe,asOf:{type:"number"}},required:["action"],additionalProperties:!1}),_t("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:Qe},markouts:{type:"array",maxItems:100,items:Qe},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 q0={};H(q0,{deployGloballyEnabled:()=>OT,executeGloballyEnabled:()=>_T,mevExecuteEnabled:()=>TT});function _T(){return wo("ORACLE_EXECUTE_ENABLED","MAD_EXECUTE_ENABLED",!1)}function OT(){return wo("ORACLE_DEPLOY_ENABLED","MAD_DEPLOY_ENABLED",!1)}function TT(){return wo("ORACLE_MEV_EXECUTE_ENABLED",null,!1)}var L0=v(()=>{ko()});ko();import B0 from"node:fs";import Au from"node:process";import{fileURLToPath as CT}from"node:url";import{createInterface as J0}from"node:readline";var ft=Object.freeze({maxRequestBytes:256*1024,maxResponseBytes:2*1024*1024,maxTools:256,maxToolNameLength:64,maxArgumentBytes:128*1024,defaultCallTimeoutMs:3e4,maxCallTimeoutMs:6e4,maxConcurrentCalls:32}),Z0=/^[A-Za-z0-9_-]{1,64}$/;function xo(e,t){return{jsonrpc:"2.0",id:e??null,result:t}}function xe(e,t,r){return{jsonrpc:"2.0",id:e??null,error:{code:t,message:r}}}function eg(e){return!!(e&&typeof e=="object"&&!Array.isArray(e)&&e.jsonrpc==="2.0"&&typeof e.method=="string"&&e.method.length>0)}function tg(e){if(!Array.isArray(e))return[];let t=[],r=new Set;for(let n of e){if(t.length>=ft.maxTools)break;if(!n||typeof n!="object"||Array.isArray(n))continue;let o=typeof n.name=="string"?n.name.trim():"";if(!Z0.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 rg(e){let t=Number(e)||ft.defaultCallTimeoutMs;return Math.min(Math.max(t,1),ft.maxCallTimeoutMs)}async function ng(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 og(e){return e===null?"null":Array.isArray(e)?"array":Number.isInteger(e)?"integer":typeof e}function pn(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=>pn(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=>pn(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=og(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=pn(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=pn(e[s],i[s],`${r}.${s}`,n+1);if(a)return a}}return null}function xs(e,t={}){let r=tg(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=rg(t.callTimeoutMs),c=!1;return async function(l){let d=l?.id??null;if(!eg(l))return xe(d,-32600,"invalid request");if(l.method==="initialize")return c=!0,xo(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 xo(d,{});if(!c)return xe(d,-32002,"server not initialized");if(l.method==="tools/list")return xo(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 xe(d,-32602,"unknown tool");if(!f||typeof f!="object"||Array.isArray(f))return xe(d,-32602,"tool arguments must be an object");let m;try{m=JSON.stringify(f)}catch{return xe(d,-32602,"tool arguments are not serializable")}if(Buffer.byteLength(m)>ft.maxArgumentBytes)return xe(d,-32602,"tool arguments exceeded the size limit");let y=pn(f,o.get(p)?.inputSchema);if(y)return xe(d,-32602,y);try{let h=new AbortController,w=await ng(Promise.resolve(e.call(p,f,{signal:h.signal})),a,()=>h.abort(new Error("tool call timed out")));return xo(d,w)}catch(h){if(h?.code==="ORACLE_MCP_TIMEOUT")return xe(d,-32001,"tool call timed out");let w=typeof h?.message=="string"?h.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(w),_=/https?:\/\/|[/~][\w.-]+\/|0x[0-9a-fA-F]{8,}|[A-Za-z0-9+/_-]{24,}={0,2}|\b(?:secret|apikey|api[-_ ]key|private[-_ ]?key|token|password|credential|seed|mnemonic)s?\b/i.test(w.replace(/\btoken(?:In|Out|s\b)/g,"asset"));return E&&!_&&w.length<=200?xe(d,-32e3,`tool call failed: ${w}`):xe(d,-32e3,"tool call failed")}}return xe(d,-32601,"method not found")}}function Pu(e,t={}){let r=t.input||process.stdin,n=t.output||process.stdout,o=Math.min(Math.max(Number(t.maxRequestBytes)||ft.maxRequestBytes,64),ft.maxRequestBytes),i=Math.min(Math.max(Number(t.maxResponseBytes)||ft.maxResponseBytes,256),ft.maxResponseBytes),s=Math.min(Math.max(Number(t.maxConcurrentCalls)||ft.maxConcurrentCalls,1),ft.maxConcurrentCalls),a=s*8,c=xs(e,t),u={closed:!1,inflight:0},l=J0({input:r,terminal:!1,crlfDelay:1/0}),d=0,p=[],f=!1,m=!1;function y(){if(u.closed||u.readerClosed)return;let x=u.inflight>=s||p.length>0||m;x&&!f?(f=!0,l.pause(),typeof r.pause=="function"&&r.pause()):!x&&f&&(f=!1,typeof r.resume=="function"&&r.resume(),l.resume())}function h(x){if(!x||u.closed)return;let O=JSON.stringify(x);Buffer.byteLength(O)>i&&(O=JSON.stringify(xe(x.id,-32003,"response exceeded the size limit"))),n.write(`${O}
24
- `)===!1&&!m&&(m=!0,y(),n.once("drain",()=>{m=!1,E()}))}function w(x){u.inflight+=1,y(),Promise.resolve(c(x)).then(h).catch(()=>h(xe(x?.id,-32603,"internal error"))).finally(()=>{u.inflight-=1,E()})}function E(){for(;!u.closed&&!m&&u.inflight<s&&p.length>0;)w(p.shift());y()}function _(){u.closed||(h(xe(null,-32700,"request exceeded the size limit")),u.closed=!0,l.close(),typeof r.destroy=="function"&&r.destroy())}return r.on("data",x=>{if(u.closed)return;let O=String(x).split(`
25
- `);for(let I=0;I<O.length;I+=1){if(d+=Buffer.byteLength(O[I]),d>o){_();return}I<O.length-1&&(d=0)}}),l.on("line",x=>{if(u.closed)return;if(Buffer.byteLength(x)>o){_();return}let O;try{O=JSON.parse(x)}catch{h(xe(null,-32700,"parse error"));return}if(p.length>=a){h(xe(O?.id,-32e3,"server busy"));return}p.push(O),E()}),l.on("close",()=>{u.readerClosed=!0,t.exitOnClose!==!1&&(process.exitCode=0)}),u}var qu=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"}}),ig=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 zt(e){return String(e??"").replaceAll("&","&amp;").replaceAll("<","&lt;").replaceAll(">","&gt;").replaceAll('"',"&quot;")}function je(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 fn(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 je(o)}return`${r} raw`}return je(e)}var sg=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 ag(e,t){let r=Number(t);return t!=null&&Number.isFinite(r)?r:sg[String(e||"").toUpperCase()]}function Lu(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=ag(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=fn(l,u);s(p!=null?"NET OUT":"EST OUT (GROSS)",p??fn(d,u),{hero:!0}),s("GROSS OUT",l!==void 0&&d!==void 0&&String(l)!==String(d)?fn(d,u):null),c.gasUsd!==void 0&&c.gasUsd!==null?s("GAS",`$${je(c.gasUsd)}`):c.feeUsd!==void 0&&c.feeUsd!==null?s("GAS+FEES",`$${je(c.feeUsd)}`):s("GAS","NOT PRICED IN",{warn:!0});let m=c.minOut??c.minAmountOut??c.minReceived;if(s("MIN RECEIVED",fn(m,u)),c.slippageBps!==void 0&&c.slippageBps!==null)s("SLIPPAGE",`${c.slippageBps} bps`);else if(m!==void 0&&d!==void 0){let w=Number(d),E=Number(m);Number.isFinite(w)&&Number.isFinite(E)&&w>0&&E>0&&E<=w&&s("SLIPPAGE",`${((1-E/w)*1e4).toFixed(0)} bps max`)}let y=c.meta?.fee??c.poolFee;y!=null&&s("POOL FEE",`${Number(y)/100} bps`),c.liquidityUsd!==void 0&&c.liquidityUsd!==null&&s("LIQUIDITY",`$${je(c.liquidityUsd)}`),o.rankedOn&&s("RANKED ON",String(o.rankedOn).toUpperCase(),{warn:String(o.rankedOn)==="gross"});let h=Array.isArray(o.ranked)?o.ranked.slice(1,4):Array.isArray(o.routes)?o.routes.filter(w=>w!==a).slice(0,3):[];for(let w of h){let E=w?.provider||w?.venue||w?.source,_=fn(w?.netOut??w?.amountOut??w?.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?`$${je(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,y)=>Number(y.knownUsd)-Number(m.knownUsd)).slice(0,3);for(let m of f)s(String(m.name||m.family||m.chainId),`$${je(m.knownUsd)}`,{dim:!0})}let d=o.avgEntryUsd??o.avgCostUsd;if(d!==void 0)s("AVG ENTRY",`$${je(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((y,h)=>y+h,0)/f.length;s("AVG ENTRY",`$${je(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?`$${je(o.pnlUsd)}`:null);let c=o.avgBuy??o.avgBuyEth??o.avgCostEth??o.avgPurchase;if(c!==void 0)s("AVG BUY",je(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",`${je(u.reduce((l,d)=>l+d,0)/u.length)} \xB7 ${u.length} buys`)}s("OWNERS",je(o.owners??o.numOwners))}return i}function cg(e,t,r){let n=qu[e]||qu.generic,o=Lu(e,r),i=o.find(u=>u.hero),s=o.filter(u=>!u.hero),a=zt(JSON.stringify(r,null,2)).slice(0,2e4),c=s.map(u=>`<div class="row${u.dim?" dim":""}${u.warn?" warn":""}"><span>${zt(u.label)}</span><b>${zt(u.value)}</b></div>`).join("");return`<!doctype html><html><head><meta charset="utf-8"><style>
23
+ `);let i=!1,s=Promise.resolve();function a(){let u=async()=>{let l=`${t}.tmp-${process.pid}`;await PO(l,Buffer.from(o.export()),{mode:384}),await ys(l,384),await RO(l,t),await ys(t,384)};return s=s.then(u,u),s}n?await ys(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=Ng(String(u.type)),d=String(u.id||"").trim();if(!d)throw new TypeError("artifact id required");let f=K(u.data??{}),p=String(u.createdAt||new Date().toISOString());return o.run("INSERT INTO artifacts(id,type,created_at,data_json) VALUES(?,?,?,?)",[d,l,p,ws(f)]),await a(),{id:d,type:l,createdAt:p,data:f}},getArtifact(u){c();let l=o.prepare("SELECT * FROM artifacts WHERE id=?");l.bind([String(u)]);let d=l.step()?bs(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"):(Ng(String(u)),o.prepare("SELECT * FROM artifacts WHERE type=? ORDER BY created_at,id"));return u!==void 0&&l.bind([String(u)]),gs(l).map(bs)},async link(u,l){c();let d=o.prepare("SELECT id,type FROM artifacts WHERE id IN (?,?)");d.bind([String(u),String(l)]);let f=gs(d),p=f.find(y=>y.id===String(u)),m=f.find(y=>y.id===String(l));if(!p||!m)throw new TypeError("edge endpoints must exist");if(!BO.has(`${p.type}:${m.type}`))throw new TypeError(`invalid artifact edge: ${p.type} -> ${m.type}`);return o.run("INSERT INTO artifact_edges(parent_id,child_id) VALUES(?,?)",[p.id,m.id]),await a(),{parentId:p.id,childId:m.id}},children(u){c();let l=o.prepare("SELECT a.* FROM artifacts a JOIN artifact_edges e ON e.child_id=a.id WHERE e.parent_id=? ORDER BY a.created_at,a.id");return l.bind([String(u)]),gs(l).map(bs)},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)]),gs(l).map(bs)},async putReceipt(u,l){c();let d=this.getArtifact(u);if(!d||d.type!=="receipt")throw new TypeError("receipt boundary requires a receipt artifact");let f=K(l);return o.run("INSERT INTO action_receipts(artifact_id,receipt_json) VALUES(?,?)",[String(u),ws(f)]),await a(),f},getReceipt(u){c();let l=o.prepare("SELECT receipt_json FROM action_receipts WHERE artifact_id=?");l.bind([String(u)]);let d=l.step()?JSON.parse(l.getAsObject().receipt_json):null;return l.free(),d},async close(){i||(await a(),o.close(),i=!0)}}}var Tu,qO,BO,UO,MO,Pg=O(()=>{mr();Tu=Object.freeze(["project","entity","source","thesis","strategy","simulation","prepared_action","receipt","position"]),qO=new Set(Tu),BO=new Set(Tu.slice(0,-1).map((e,t)=>`${e}:${Tu[t+1]}`)),UO=Ou(process.env.ORACLE_CONFIG_DIR||Ou(LO(),".config","oracle"),"workspace"),MO=Ou(UO,"artifacts.sqlite")});import{createHash as Lg}from"node:crypto";function FO(e){return DO.has(String(e).replace(/[^a-z0-9]/gi,"").toLowerCase())}function Cu(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(Cu).join(",")}]`:`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${Cu(e[t])}`).join(",")}}`}function jO(e){return Lg("sha256").update(String(e)).digest("hex")}function $g(e){let t;try{t=new URL(String(e))}catch{throw new TypeError("research source URL must be valid")}if(!/^https?:$/.test(t.protocol))throw new TypeError("research source URL must be http(s)");if(t.username||t.password)throw new TypeError("research source URL must not contain credentials");for(let n of t.searchParams.keys())if(FO(n))throw new TypeError("research source URL must not contain sensitive query parameters");return t.toString()}function qg(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 HO(e={}){let t=$g(e.url??e.sourceUrl),n=qg(e.fetchedAt),r=String(e.contentHash||"").toLowerCase();if(!/^[0-9a-f]{64}$/.test(r))throw new TypeError("research citation contentHash must be 64 lowercase hex characters");return Object.freeze(K({url:t,fetchedAt:n,contentHash:r}))}function Bg(e={}){let t=$g(e.sourceUrl??e.url),n=String(e.snapshot??e.content??"");if(!n)throw new TypeError("research snapshot required");let r=String(e.claim||"").trim();if(!r)throw new TypeError("research claim required");let o=Number(e.confidence);if(!Number.isFinite(o)||o<0||o>1)throw new TypeError("research confidence must be between 0 and 1");let i=qg(e.fetchedAt),s=jO(n);if(!Array.isArray(e.contradictions??[]))throw new TypeError("research contradictions must be an array");let a=(e.citations||[{url:t,fetchedAt:i,contentHash:s}]).map(HO),c=K({sourceUrl:t,fetchedAt:i,contentHash:s,snapshot:n,claim:r,confidence:o,contradictions:(e.contradictions||[]).map(String),citations:a});return Object.freeze({id:`research:${Lg("sha256").update(Cu(c)).digest("hex")}`,...c})}var DO,Ug=O(()=>{mr();DO=new Set(["accesstoken","refreshtoken","idtoken","token","apikey","clientsecret","password","auth","jwt","session","secret","key","code","signature","xamzsignature","privatekey","authorization","bearer","credential"])});function Mg(e){if(e===null||e===""||e===void 0)return null;let t=Number(e);return Number.isFinite(t)&&t>=0?t:null}function Io(e){return Math.round((e+Number.EPSILON)*1e8)/1e8}function Ru(e,t){return t>0?Io(e/t*100):null}function Pu(e){return e.address||e.owner||e.walletAddress||e.wallet?.address||null}function WO(e){let t=Array.isArray(e)?e:Array.isArray(e?.entries)?e.entries:[],n=new Map;for(let r of t){if(!r?.address)continue;let o=String(r.address).toLowerCase();n.has(o)||n.set(o,r)}return n}function Tn(e,t,n={}){if(!t||typeof t!="object")return;let r=String(t.symbol??t.coin??t.name??t.collection??t.tokenId??"unknown"),o=Mg(t.usdValue??t.valueUsd??t.knownUsd??t.estimatedValueUsd??t.floorValueUsd),i=t.kind==="nft"||t.type==="nft"||t.collection||t.tokenId!=null?"nft":"fungible";e.push({symbol:r,usdValue:o,chain:String(t.chain??t.chainName??n.chain??"unknown"),venue:String(t.venue??t.protocol??t.platform??n.venue??"wallet"),address:t.address??n.address??null,kind:i,stablecoin:t.stablecoin===!0||VO.has(r.toUpperCase())})}function GO(e){let t=[],n=Pu(e);for(let r of e.assets||e.holdings||[])Tn(t,r,{address:n,chain:e.chain,venue:e.venue});for(let r of e.chains||[]){let o=r.chain??r.name??r.slug??(r.chainId!=null?String(r.chainId):r.family)??"unknown",i={address:r.address??n,chain:o,venue:r.venue};r.native&&(r.native.amount==null||Number(r.native.amount)!==0)&&Tn(t,{...r.native,symbol:r.native.symbol??r.symbol??o},i);for(let a of r.assets||r.fungibleTokens?.assets||[])Tn(t,a,i);for(let a of r.collectibles?.assets||r.nfts||[])Tn(t,{...a,kind:"nft"},i);for(let a of r.spot?.balances||[])Tn(t,a,{...i,venue:"Hyperliquid spot"});let s=Mg(r.perps?.accountValueUsd);s!=null&&Tn(t,{symbol:"perps account",usdValue:s},{...i,venue:"Hyperliquid perps"})}for(let r of e.inventory?.items||e.nfts?.items||[])Tn(t,{...r,kind:"nft"},{address:n,chain:r.chain??e.chain,venue:r.marketplace??e.venue});return t}function KO(e,t){let n=Pu(e),r=e.chain??e.chainId??e.family??"*";return n?`${String(n).toLowerCase()}|${String(r).toLowerCase()}`:`snapshot:${t}`}function Nu(e,t,n){let r=new Map;for(let o of e){if(o.usdValue==null)continue;let i=o[t];r.set(i,(r.get(i)||0)+o.usdValue)}return[...r].map(([o,i])=>({name:o,knownUsd:Io(i),percentOfKnown:Ru(i,n)})).sort((o,i)=>i.knownUsd-o.knownUsd||o.name.localeCompare(i.name))}function Es(e={},t={}){let n=Array.isArray(e)?e:Array.isArray(e.snapshots)?e.snapshots:e.snapshot?[e.snapshot]:[],r=WO(t.labels??t.addressBook??e.labels??e.addressBook),o={...zO,...e.thresholds||{},...t.thresholds||{}},i=[],s=new Set,a=0;n.forEach((v,P)=>{if(!v||typeof v!="object")return;let I=KO(v,P);s.has(I)?a+=1:(s.add(I),i.push(v))});let c=i.flatMap(GO),u=c.filter(v=>v.usdValue!=null),l=c.filter(v=>v.usdValue==null),d=i.reduce((v,P)=>v+Number(P.valuation?.unpricedNonzeroItems||P.unpricedNonzeroItems||0),0),f=Io(u.reduce((v,P)=>v+P.usdValue,0)),p=l.length+d,m=Nu(u,"chain",f),y=Nu(u,"venue",f),h=Nu(u,"symbol",f);for(let v of m)v.chain=v.name;for(let v of y)v.venue=v.name;for(let v of h)v.asset=v.name,v.symbol=v.name;let w=Io(u.filter(v=>v.stablecoin).reduce((v,P)=>v+P.usdValue,0)),A=c.filter(v=>v.kind==="nft"),_=i.reduce((v,P)=>v+Number(P.valuation?.nftUnvaluedItems||0),0),S=A.filter(v=>v.usdValue==null).length+_,k=A.filter(v=>v.usdValue!=null).length,x=h[0]||null,E=x?x.percentOfKnown>=o.assetHighPct?"high":x.percentOfKnown>=o.assetMediumPct?"medium":"low":"unknown",g=[];p&&g.push(`${p} nonzero holding(s) have unknown USD value; they are excluded from totals and percentages.`),S&&g.push("NFT valuation coverage is partial; estimates are not executable bids and unvalued NFTs are not treated as zero."),a&&g.push(`${a} duplicate address/chain snapshot(s) were ignored.`),x&&E!=="low"&&g.push(`Asset concentration is ${E}: ${x.name} is ${x.percentOfKnown}% of known value.`),m[0]?.percentOfKnown>=o.chainHighPct&&g.push(`Chain concentration is high: ${m[0].name} is ${m[0].percentOfKnown}% of known value.`),y[0]?.percentOfKnown>=o.venueHighPct&&g.push(`Venue concentration is high: ${y[0].name} is ${y[0].percentOfKnown}% of known value.`);let b=i.map(Pu).filter(Boolean).map(v=>{let P=r.get(String(v).toLowerCase());return{address:v,label:P?.label??null,who:P?.who??null,role:P?.role??null}});return{totalKnownUsd:f,coverage:{complete:i.length>0&&p===0&&i.every(v=>v.valuation?.complete!==!1&&v.coverage?.complete!==!1),label:p===0&&i.length&&i.every(v=>v.valuation?.complete!==!1&&v.coverage?.complete!==!1)?"complete for the supplied snapshots":"known priced value only; portfolio coverage is partial or unverified",unknownUsd:p?null:0,pricedItemCount:u.length,unknownItemCount:p,snapshotCount:i.length,duplicatesIgnored:a},chainExposures:m,venueExposures:y,topAssets:h.slice(0,Math.max(1,Number(t.topAssets??e.topAssets??10))),concentrationRisk:{level:E,topAsset:x?.name??null,topAssetPercent:x?.percentOfKnown??null,thresholds:{mediumPct:o.assetMediumPct,highPct:o.assetHighPct}},stablecoinExposure:{knownUsd:w,percentOfKnown:Ru(w,f),high:f>0&&Ru(w,f)>=o.stablecoinHighPct},nftCoverage:{status:A.length||_?S?"partial":"valued":"not-observed",valuedItems:k,unvaluedItems:S,knownUsd:Io(A.filter(v=>v.usdValue!=null).reduce((v,P)=>v+P.usdValue,0))},addresses:b,warnings:[...new Set(g)]}}var zO,VO,Lu=O(()=>{zO=Object.freeze({assetHighPct:50,assetMediumPct:25,chainHighPct:75,venueHighPct:60,stablecoinHighPct:70}),VO=new Set(["USDC","USDT","USDT0","DAI","FRAX","LUSD","TUSD","USDP","GUSD","PYUSD","USDE"])});function Dg(e){return _e(e.asOf??e.updatedAt??e.timestamp,0)}function Hg(e){return e.filledAt??e.executedAt??e.time??e.timestamp??e.asOf??e.updatedAt??e.createdAt}function YO(e){return Number.isFinite(Number(Hg(e)))}function Fg(e){return _e(Hg(e),0)}function XO(e){let t=new Set,n=[];return(e||[]).forEach((o,i)=>{if(!o||typeof o!="object"||!mt(o))return;let s=zg(o);t.has(s)||(t.add(s),n.push({row:o,seq:i}))}),n.every(({row:o})=>YO(o))?n.sort((o,i)=>Fg(o.row)-Fg(i.row)||o.seq-i.seq).map(({row:o})=>o):n.map(({row:o})=>o)}function zg(e){let t=e.fillId??e.tradeId??e.orderId??e.txHash??e.transactionHash??e.timestamp??e.asOf;return[vs(e),we(t),we(e.side),_e(e.quantity??e.amount??e.size),_e(e.price??e.priceUsd)].join("|")}function Ss(e,t){let n=new Map,r=0;for(let o of e||[]){if(!o||typeof o!="object"||!mt(o))continue;let i=t==="fill"?zg(o):vs(o);n.has(i)?(r+=1,t!=="fill"&&Dg(o)>Dg(n.get(i))&&n.set(i,{...o,identity:i})):n.set(i,{...o,identity:i})}return{rows:[...n.values()].sort((o,i)=>o.identity.localeCompare(i.identity)),duplicatesIgnored:r}}function JO(e){let t=new Map;for(let n of e){let r=[vs(n),`${we(n.chain??n.chainId)}|${we(mt(n))}`,`*|${we(mt(n))}`];for(let o of r)t.has(o)||t.set(o,n)}return t}function QO(e,t){return t.get(vs(e))??t.get(`${we(e.chain??e.chainId)}|${we(mt(e))}`)??t.get(`*|${we(mt(e))}`)??null}function ZO(e){let t=new Map,n=0;for(let r of e){let o=[we(r.chain??r.chainId),we(jg(r)),we(mt(r))].join("|"),i=t.get(o)??{quantity:0,cost:0},s=Math.abs(_e(r.quantity??r.amount??r.size)),a=_e(r.price??r.priceUsd),c=_e(r.feeUsd);if(we(r.side)==="sell"){let u=Math.min(s,i.quantity),l=i.quantity?i.cost/i.quantity:_e(r.costBasisUsd)/(s||1);n+=u*(a-l)-c,i.quantity-=u,i.cost-=u*l}else i.quantity+=s,i.cost+=s*a+c;t.set(o,i)}return{realizedPnlUsd:ft(n),lots:t}}function Vg(e={},t={}){let n=_e(t.asOf??e.asOf,0),r=Math.max(0,_e(t.priceTtlMs??e.priceTtlMs,6e4)),o=Ss(e.balances||[],"balance"),i=Ss(e.positions||[],"position"),s=Ss(e.fills||[],"fill"),a=Ss(e.prices||[],"price"),c=JO(a.rows),u=[],l=0,d=0;for(let b of[...o.rows,...i.rows]){let v=QO(b,c),P=_e(b.quantity??b.amount??b.size),I=v?_e(v.priceUsd??v.price,NaN):_e(b.priceUsd,NaN);if(!Number.isFinite(I)){d+=1;continue}let L=P*I,q=_e(v?.asOf??b.priceAsOf,0),H=n-q>r;H&&(l+=Math.abs(L)),u.push({...b,quantity:P,priceUsd:I,valueUsd:L,stale:H,kind:i.rows.includes(b)?"position":"balance"})}let f=u.filter(b=>b.kind==="balance").reduce((b,v)=>b+v.valueUsd,0),p=u.filter(b=>b.kind==="position"),m=p.reduce((b,v)=>b+v.valueUsd,0),y=p.reduce((b,v)=>b+Math.abs(v.valueUsd),0),h=f+m,w=_e(e.equityUsd,h),A=ZO(XO(e.fills||[])).realizedPnlUsd,_=p.reduce((b,v)=>{let P=_e(v.entryPriceUsd??v.averageEntryPrice??v.costBasisPrice,v.priceUsd);return b+v.quantity*(v.priceUsd-P)},0),S=new Map;for(let b of u)S.set(we(mt(b)),(S.get(we(mt(b)))||0)+Math.abs(b.valueUsd));let k=[...S.values()].reduce((b,v)=>b+v,0),x=[...S].map(([b,v])=>({asset:b,exposureUsd:ft(v),percent:k?ft(v/k*100):null})).sort((b,v)=>v.exposureUsd-b.exposureUsd||b.asset.localeCompare(v.asset)),E=u.reduce((b,v)=>b+Math.abs(v.valueUsd),0),g=Es({snapshots:[{assets:u.map(b=>({symbol:mt(b),usdValue:Math.abs(b.valueUsd),chain:b.chain,venue:b.source}))}],thresholds:e.thresholds});return Object.freeze({asOf:n,balances:o.rows,positions:i.rows,fills:s.rows,prices:a.rows,duplicatesIgnored:o.duplicatesIgnored+i.duplicatesIgnored+s.duplicatesIgnored+a.duplicatesIgnored,pnl:{realizedUsd:A,unrealizedUsd:ft(_),totalUsd:ft(A+_)},exposure:{grossUsd:ft(y),netUsd:ft(h),leverage:w>0?ft(y/w):null,equityUsd:ft(w)},concentration:x,priceCoverage:{pricedItems:u.length,unpricedItems:d,staleItems:u.filter(b=>b.stale).length,staleValueUsd:ft(l),stalePercent:E?ft(l/E*100):null,ttlMs:r},risk:g})}var _e,ft,we,mt,jg,vs,Wg=O(()=>{Lu();_e=(e,t=0)=>Number.isFinite(Number(e))?Number(e):t,ft=e=>Math.round((e+Number.EPSILON)*1e8)/1e8,we=(e,t="unknown")=>String(e??t).trim().toLowerCase(),mt=e=>e.asset??e.symbol??e.coin,jg=e=>e.address??e.owner??e.account,vs=e=>[we(e.chain??e.chainId),we(jg(e)),we(mt(e)),we(e.source)].join("|")});function pe(e,t){throw new qu(e,t)}function Ft(e,t){return e<t?-1:e>t?1:0}function Ee(e){if(e&&typeof e=="object"&&!Object.isFrozen(e)){for(let t of Object.values(e))Ee(t);Object.freeze(e)}return e}function jt(e,t){return(!e||typeof e!="object"||Array.isArray(e)||Object.getPrototypeOf(e)!==Object.prototype)&&pe(`${t} must be a plain object`),e}function Le(e,t,{optional:n=!1,lower:r=!1}={}){if(e==null&&n)return null;typeof e!="string"&&pe(`${t} must be a string`);let o=e.trim();return o||pe(`${t} is required`),iT.test(o)&&pe(`${t} contains control characters`),o.length>512&&pe(`${t} is too long`),r?o.toLowerCase():o}function It(e,t,{optional:n=!1,positive:r=!1}={}){if(e==null&&n)return null;typeof e=="number"&&pe(`${t} must be an exact decimal string or BigInt; Number coercion is refused`,"COST_BASIS_UNSAFE_NUMBER");let o;typeof e=="bigint"?o=e.toString():typeof e=="string"?o=e:pe(`${t} must be an exact decimal string or BigInt`),/^\d+$/.test(o)||pe(`${t} must be a non-negative base-10 integer string`);let i=BigInt(o);return r&&i===0n&&pe(`${t} must be positive`),i.toString()}function hr(e){return e==null?null:e.toString()}function _o(e,t){let n=jt(e,t);return Ee({chain:Le(n.chain??n.chainId,`${t}.chain`,{lower:!0}),account:Le(n.account??n.address??n.owner,`${t}.account`)})}function un(e,t){return`${e.length}:${e}|${t.chain.length}:${t.chain}|${t.account.length}:${t.account}`}function Xg(e,t="evidence"){if(e==null)return Ee({status:"unknown",references:[]});let n=jt(e,t),r=Le(n.status??"unknown",`${t}.status`,{lower:!0});oT.has(r)||pe(`${t}.status must be complete, incomplete, or unknown`),n.references!=null&&!Array.isArray(n.references)&&pe(`${t}.references must be an array`);let o=(n.references||[]).map((s,a)=>{let c=jt(s,`${t}.references[${a}]`);return{kind:Le(c.kind??c.type,`${t}.references[${a}].kind`,{lower:!0}),id:Le(c.id??c.receiptId??c.txHash,`${t}.references[${a}].id`)}}).sort((s,a)=>Ft(s.kind,a.kind)||Ft(s.id,a.id)),i=[];for(let s of o)i.some(a=>a.kind===s.kind&&a.id===s.id)||i.push(s);return Ee({status:r,references:i})}function Gg(e,t){if(e==null)return[];(!Array.isArray(e)||e.length===0)&&pe(`${t} must be a non-empty array`);let n=new Set;return e.map((r,o)=>{let i=jt(r,`${t}[${o}]`),s=Le(i.lotId,`${t}[${o}].lotId`);return n.has(s)&&pe(`${t} repeats lotId ${JSON.stringify(s)}`),n.add(s),Ee({lotId:s,quantity:It(i.quantity,`${t}[${o}].quantity`,{positive:!0})})})}function sT(e){K(e);let t=jt(e,"event"),n=Le(t.type,"event.type",{lower:!0});rT.has(n)||pe("event.type must be acquisition, disposal, or transfer");let r=Le(t.id??t.eventId,"event.id"),o=It(t.occurredAt??t.timestamp,"event.occurredAt"),i=Le(t.asset??t.symbol??t.coin,"event.asset"),s=It(t.quantity??t.amount??t.size,"event.quantity",{positive:!0}),a=It(t.feeMinor??t.feeUsdMinor??"0","event.feeMinor"),c=Xg(t.evidence),u=t.source==null?null:Le(t.source,"event.source"),l={id:r,type:n,occurredAt:o,asset:i,quantity:s,feeMinor:a,source:u,evidence:c};if(n==="acquisition"){let d={...l,location:_o(t.location??{chain:t.chain??t.chainId,account:t.account??t.address??t.owner},"event.location"),grossAmountMinor:It(t.grossAmountMinor??t.costMinor??t.basisBeforeFeesMinor,"event.grossAmountMinor",{optional:!0}),lotId:Le(t.lotId??r,"event.lotId"),specificLots:[]};return Ee(d)}return Ee(n==="disposal"?{...l,location:_o(t.location??{chain:t.chain??t.chainId,account:t.account??t.address??t.owner},"event.location"),grossAmountMinor:It(t.grossAmountMinor??t.proceedsMinor??t.proceedsBeforeFeesMinor,"event.grossAmountMinor",{optional:!0}),specificLots:Gg(t.specificLots??t.lotSelections,"event.specificLots")}:{...l,from:_o(t.from,"event.from"),to:_o(t.to,"event.to"),grossAmountMinor:null,specificLots:Gg(t.specificLots??t.lotSelections,"event.specificLots")})}function aT(e,t){let n=BigInt(e.occurredAt)-BigInt(t.occurredAt);return n<0n?-1:n>0n?1:Ft(e.id,t.id)}function cT(e=[]){Array.isArray(e)||pe("events must be an array");let t=new Map,n=0;for(let r of e){let o=sT(r),i=ko(o),s=t.get(o.id);if(s){s.canonical!==i&&pe(`conflicting duplicate event id ${JSON.stringify(o.id)}`,"COST_BASIS_DUPLICATE_CONFLICT"),n+=1;continue}t.set(o.id,{event:o,canonical:i})}return Ee({events:[...t.values()].map(({event:r})=>r).sort(aT),duplicatesIgnored:n})}function uT(e){let t=Le(e??"fifo","method",{lower:!0});return tT.includes(t)||pe("method must be fifo, lifo, hifo, or specific"),t}function lT(e){e!=null&&jt(e,"treatment");let t=e||{},n={};for(let r of Object.keys(Kg))n[r]=Le(t[r]??"unresolved",`treatment.${r}`,{lower:!0}),Kg[r].has(n[r])||pe(`treatment.${r} has an unsupported value`);return Ee(n)}function dT(e,t){K(e);let n=jt(e,`marketValues[${t}]`);return Ee({id:Le(n.id??n.valuationId,`marketValues[${t}].id`),asset:Le(n.asset??n.symbol??n.coin,`marketValues[${t}].asset`),location:_o(n.location??{chain:n.chain??n.chainId,account:n.account??n.address??n.owner},`marketValues[${t}].location`),quantity:It(n.quantity,`marketValues[${t}].quantity`),valueMinor:It(n.valueMinor??n.marketValueMinor,`marketValues[${t}].valueMinor`),asOf:It(n.asOf,`marketValues[${t}].asOf`),evidence:Xg(n.evidence,`marketValues[${t}].evidence`)})}function Jg(e,t){return t==null||BigInt(e)<=BigInt(t)}function pT(e=[],t=null){Array.isArray(e)||pe("marketValues must be an array");let n=new Map,r=0;e.forEach((s,a)=>{let c=dT(s,a),u=ko(c),l=n.get(c.id);l?(l.canonical!==u&&pe(`conflicting duplicate market value id ${JSON.stringify(c.id)}`,"COST_BASIS_DUPLICATE_CONFLICT"),r+=1):n.set(c.id,{row:c,canonical:u})});let o=[...n.values()].map(({row:s})=>s).filter(s=>Jg(s.asOf,t)),i=new Map;for(let s of o){let a=un(s.asset,s.location),c=i.get(a);(!c||BigInt(s.asOf)>BigInt(c.asOf)||s.asOf===c.asOf&&Ft(s.id,c.id)<0)&&i.set(a,s)}return{values:o.sort((s,a)=>Ft(s.id,a.id)),byHolding:i,duplicatesIgnored:r}}function Pe(e,t,n,r){e.push(Ee({code:t,eventId:n??null,detail:r}))}function fT(e,t,n){if(e.grossAmountMinor==null)return Pe(n,"missing-acquisition-basis",e.id,"gross acquisition amount is unknown; lot basis remains unknown"),null;let r=BigInt(e.grossAmountMinor),o=BigInt(e.feeMinor);return o===0n?r:t.acquisitionFees==="include-in-basis"?r+o:t.acquisitionFees==="exclude"?r:(Pe(n,"unresolved-acquisition-fee-treatment",e.id,"fee treatment was not supplied; lot basis remains unknown"),null)}function mT(e,t,n){if(e.grossAmountMinor==null)return Pe(n,"missing-disposal-proceeds",e.id,"gross disposal proceeds are unknown"),null;let r=BigInt(e.grossAmountMinor),o=BigInt(e.feeMinor);return o===0n?r:t.disposalFees==="reduce-proceeds"?r-o:t.disposalFees==="exclude"?r:(Pe(n,"unresolved-disposal-fee-treatment",e.id,"fee treatment was not supplied; recognized proceeds remain unknown"),null)}function hT(e,t){let n=(r,o)=>{let i=BigInt(r.acquiredAt)-BigInt(o.acquiredAt);return i<0n?-1:i>0n?1:Ft(r.lotId,o.lotId)};return e==="fifo"?[...t].sort(n):e==="lifo"?[...t].sort((r,o)=>-n(r,o)):e==="hifo"?[...t].sort((r,o)=>{let i=r.basisRemaining*o.quantityRemaining,s=o.basisRemaining*r.quantityRemaining;return i>s?-1:i<s?1:n(r,o)}):[...t]}function Yg(e,t){let n=e.quantityRemaining,r=e.basisRemaining,o=null;return r!=null&&(o=t===n?r:r*t/n,e.basisRemaining-=o),e.quantityRemaining-=t,{lot:e,quantity:t,basis:o}}function yT(e,t,n){let r=un(t,n);return e.filter(o=>o.key===r&&o.quantityRemaining>0n)}function gT({event:e,lots:t,method:n,issues:r,tainted:o}){let i=e.type==="transfer"?e.from:e.location,s=un(e.asset,i),a=BigInt(e.quantity);if(o.has(s))return Pe(r,"inventory-state-incomplete",e.id,"an earlier unmatched record makes this holding indeterminate"),{matches:[],missing:a,key:s,indeterminate:!0};let c=yT(t,e.asset,i);if(n==="hifo"&&c.some(d=>d.basisRemaining==null))return Pe(r,"hifo-basis-unknown",e.id,"HIFO cannot rank a lot whose basis is unknown"),o.add(s),{matches:[],missing:a,key:s,indeterminate:!0};let u=[],l=a;if(n==="specific"){if(e.specificLots.length===0)return Pe(r,"specific-lots-required",e.id,"specific-lot method requires explicit lot selections"),o.add(s),{matches:u,missing:l,key:s,indeterminate:!0};if(e.specificLots.reduce((f,p)=>f+BigInt(p.quantity),0n)!==a)return Pe(r,"specific-lot-quantity-mismatch",e.id,"specific-lot quantities do not equal the event quantity"),o.add(s),{matches:u,missing:l,key:s,indeterminate:!0};for(let f of e.specificLots){let p=c.find(y=>y.lotId===f.lotId),m=BigInt(f.quantity);if(!p||p.quantityRemaining<m){Pe(r,"specific-lot-unavailable",e.id,`requested lot ${JSON.stringify(f.lotId)} is absent or too small`);continue}u.push(Yg(p,m)),l-=m}}else{e.specificLots.length&&pe(`event ${JSON.stringify(e.id)} supplies specificLots but method is ${n}`);for(let d of hT(n,c)){if(l===0n)break;let f=l<d.quantityRemaining?l:d.quantityRemaining;u.push(Yg(d,f)),l-=f}}return l>0n&&(Pe(r,"insufficient-inventory",e.id,"recorded lots do not cover the event quantity; no replacement basis was invented"),o.add(s)),{matches:u,missing:l,key:s,indeterminate:l>0n}}function $u(e,t,n){if(e==null)return t.map(()=>null);let r=e,o=n;return t.map(i=>{if(o===0n)return 0n;let s=i===o?r:r*i/o;return r-=s,o-=i,s})}function bT(e,t){let n=[...e.map(r=>r.evidence.status),...t.map(r=>r.evidence.status)];return n.length===0||n.every(r=>r==="complete")?"complete":n.some(r=>r==="incomplete")?"incomplete":"unknown"}function yr(e,t){let n=e.map(o=>o[t]),r=n.filter(o=>o!=null).reduce((o,i)=>o+BigInt(i),0n);return{value:n.every(o=>o!=null)?r.toString():null,known:r.toString()}}function wT(e,t){return{lotId:e.lotId,originLotId:e.lotId,acquisitionEventId:e.id,asset:e.asset,location:e.location,key:un(e.asset,e.location),acquiredAt:e.occurredAt,quantityRemaining:BigInt(e.quantity),basisRemaining:t,evidenceStatus:e.evidence.status}}function Qg(e={},t={}){K(e),K(t),jt(e,"input"),jt(t,"options");let n=It(t.asOf??e.asOf,"asOf",{optional:!0}),r=cT(e.events||[]),o=n==null?r.events:r.events.filter(b=>Jg(b.occurredAt,n)),i=uT(t.method??e.method),s=lT(t.treatment??e.treatment),a=pT(e.marketValues||[],n),c=[],u=[],l=new Set,d=[],f=[],p=new Set;for(let b of o){if(b.type==="acquisition"){if(l.has(b.lotId)){Pe(c,"duplicate-lot-id",b.id,`lotId ${JSON.stringify(b.lotId)} is already in use`),p.add(un(b.asset,b.location));continue}l.add(b.lotId),u.push(wT(b,fT(b,s,c)));continue}let v=gT({event:b,lots:u,method:i,issues:c,tainted:p});if(b.type==="disposal"){let $=mT(b,s,c),D=$u($,v.matches.map(le=>le.quantity),BigInt(b.quantity)),M=v.matches.map((le,Wt)=>{let Gt=D[Wt];return Ee({lotId:le.lot.lotId,originLotId:le.lot.originLotId,quantity:le.quantity.toString(),basisMinor:hr(le.basis),proceedsMinor:hr(Gt),gainMinor:le.basis==null||Gt==null?null:(Gt-le.basis).toString(),acquiredAt:le.lot.acquiredAt,evidenceStatus:le.lot.evidenceStatus})}),Q=M.filter(le=>le.basisMinor!=null).reduce((le,Wt)=>le+BigInt(Wt.basisMinor),0n),Y=v.missing===0n&&M.every(le=>le.basisMinor!=null),Ue=v.missing===0n&&$!=null;d.push(Ee({eventId:b.id,asset:b.asset,location:b.location,occurredAt:b.occurredAt,quantity:b.quantity,grossProceedsMinor:b.grossAmountMinor,feeMinor:b.feeMinor,recognizedProceedsMinor:Ue?$.toString():null,basisMinor:Y?Q.toString():null,gainMinor:Y&&Ue?($-Q).toString():null,unknownQuantity:v.missing.toString(),status:Y&&Ue?"complete":"incomplete",evidenceStatus:b.evidence.status,matches:M}));continue}let P=BigInt(b.feeMinor),I=P>0n&&s.transferFees==="include-in-basis",L=P>0n&&s.transferFees==="unresolved";L&&Pe(c,"unresolved-transfer-fee-treatment",b.id,"fee treatment was not supplied; transferred lot basis remains unknown");let q=$u(I?P:0n,v.matches.map($=>$.quantity),BigInt(b.quantity)),H=v.matches.map(($,D)=>{let M=$.basis;L?M=null:M!=null&&I&&(M+=q[D]);let Q=`${b.id}:${D+1}`;return l.has(Q)?(Pe(c,"duplicate-lot-id",b.id,`derived transfer lotId ${JSON.stringify(Q)} is already in use`),p.add(un(b.asset,b.to)),null):(l.add(Q),u.push({lotId:Q,originLotId:$.lot.originLotId,acquisitionEventId:$.lot.acquisitionEventId,asset:b.asset,location:b.to,key:un(b.asset,b.to),acquiredAt:$.lot.acquiredAt,quantityRemaining:$.quantity,basisRemaining:M,evidenceStatus:b.evidence.status==="complete"&&$.lot.evidenceStatus==="complete"?"complete":"unknown"}),Ee({fromLotId:$.lot.lotId,toLotId:Q,originLotId:$.lot.originLotId,quantity:$.quantity.toString(),basisMinor:hr(M)}))}).filter(Boolean);v.indeterminate&&p.add(un(b.asset,b.to)),f.push(Ee({eventId:b.id,asset:b.asset,from:b.from,to:b.to,occurredAt:b.occurredAt,quantity:b.quantity,feeMinor:b.feeMinor,unknownQuantity:v.missing.toString(),status:v.indeterminate||H.some($=>$.basisMinor==null)?"incomplete":"complete",moved:H}))}let m=u.filter(b=>b.quantityRemaining>0n).sort((b,v)=>Ft(b.key,v.key)||Ft(b.lotId,v.lotId)),y=new Map;for(let b of m)y.has(b.key)||y.set(b.key,[]),y.get(b.key).push(b);let h=[];for(let[b,v]of[...y].sort(([P],[I])=>Ft(P,I))){let P=v.reduce(($,D)=>$+D.quantityRemaining,0n),I=a.byHolding.get(b)||null,L=p.has(b),q=I;I?BigInt(I.quantity)!==P&&(Pe(c,"market-value-quantity-mismatch",null,`market value ${JSON.stringify(I.id)} does not cover the recorded holding quantity`),q=null):Pe(c,"missing-market-value",null,`no market value was supplied for holding ${b}`),L&&(q=null);let H=$u(q?BigInt(q.valueMinor):null,v.map($=>$.quantityRemaining),P);v.forEach(($,D)=>{let M=H[D],Q=M==null||$.basisRemaining==null?null:M-$.basisRemaining;h.push(Ee({lotId:$.lotId,originLotId:$.originLotId,acquisitionEventId:$.acquisitionEventId,asset:$.asset,location:$.location,acquiredAt:$.acquiredAt,quantity:$.quantityRemaining.toString(),basisMinor:L?null:hr($.basisRemaining),marketValueMinor:hr(M),unrealizedGainMinor:L?null:hr(Q),valuationId:q?.id??null,status:L||$.basisRemaining==null||M==null?"incomplete":"complete",evidenceStatus:$.evidenceStatus}))})}let w=yr(d,"basisMinor"),A=yr(d,"recognizedProceedsMinor"),_=yr(d,"gainMinor"),S=yr(h,"basisMinor"),k=yr(h,"marketValueMinor"),x=yr(h,"unrealizedGainMinor"),E=o.every(b=>BigInt(b.feeMinor)>0n?b.type==="acquisition"?s.acquisitionFees!=="unresolved":b.type==="disposal"?s.disposalFees!=="unresolved":s.transferFees!=="unresolved":!0),g={recordVersion:eT,recordType:"cost-basis-records",label:nT,asOf:n,method:i,units:{quantity:"exact asset minor units as base-10 integer strings",usd:"USD minor units as base-10 integer strings"},accountingFacts:{events:o,marketValues:a.values,duplicatesIgnored:r.duplicatesIgnored+a.duplicatesIgnored},jurisdictionalTreatment:{suppliedByCaller:s,status:E?"specified":"unresolved",note:"Fee and lot-selection treatment can vary by jurisdiction. These caller-selected recordkeeping rules are not tax advice."},realized:{disposals:d,totals:{proceedsMinor:A.value,basisMinor:w.value,gainMinor:_.value,knownProceedsSubtotalMinor:A.known,knownBasisSubtotalMinor:w.known,knownGainSubtotalMinor:_.known}},transfers:f,holdings:h,unrealized:{totals:{marketValueMinor:k.value,basisMinor:S.value,gainMinor:x.value,knownMarketValueSubtotalMinor:k.known,knownBasisSubtotalMinor:S.known,knownGainSubtotalMinor:x.known}},completeness:{accounting:c.some(b=>b.code!=="missing-market-value")?"incomplete":"complete",valuation:h.every(b=>b.marketValueMinor!=null)?"complete":"incomplete",evidence:bT(o,a.values),treatment:E?"specified":"unresolved"},issues:c};return Ee(g)}var eT,tT,nT,rT,oT,iT,qu,Kg,Zg=O(()=>{mr();eT=1,tT=Object.freeze(["fifo","lifo","hifo","specific"]),nT="Accounting records only; not tax advice.",rT=new Set(["acquisition","disposal","transfer"]),oT=new Set(["complete","incomplete","unknown"]),iT=/[\u0000-\u001f\u007f]/,qu=class extends Error{constructor(t,n="COST_BASIS_INVALID"){super(`cost basis: ${t}`),this.name="CostBasisValidationError",this.code=n}};Kg=Object.freeze({acquisitionFees:new Set(["include-in-basis","exclude","unresolved"]),disposalFees:new Set(["reduce-proceeds","exclude","unresolved"]),transferFees:new Set(["include-in-basis","exclude","unresolved"])})});function Z(e,t){throw new Uu(e,t)}function Cn(e,t){return e<t?-1:e>t?1:0}function Qe(e){if(e&&typeof e=="object"&&!Object.isFrozen(e)){for(let t of Object.values(e))Qe(t);Object.freeze(e)}return e}function ue(e,t){return(!e||typeof e!="object"||Array.isArray(e)||Object.getPrototypeOf(e)!==Object.prototype)&&Z(`${t} must be a plain object`),e}function _t(e,t,{optional:n=!1,lower:r=!1}={}){if(e==null&&n)return null;typeof e!="string"&&Z(`${t} must be a string`);let o=e.trim();return o||Z(`${t} is required`),xT.test(o)&&Z(`${t} contains control characters`),o.length>512&&Z(`${t} is too long`),r?o.toLowerCase():o}function Je(e,t,{optional:n=!1,positive:r=!1}={}){if(e==null&&n)return null;typeof e=="number"&&Z(`${t} must be an exact decimal string or BigInt; Number coercion is refused`,"POSITION_HEALTH_UNSAFE_NUMBER");let o;typeof e=="bigint"?o=e.toString():typeof e=="string"?o=e.trim():Z(`${t} must be an exact decimal string or BigInt`),/^\d+$/.test(o)||Z(`${t} must be a non-negative base-10 integer string`);let i=BigInt(o);return r&&i===0n&&Z(`${t} must be positive`),i.toString()}function o0(e,t){e==null&&Z(`${t} is required`,"POSITION_HEALTH_MISSING_DECIMALS"),typeof e=="number"&&Z(`${t} must be an exact decimal string or BigInt; Number coercion is refused`,"POSITION_HEALTH_UNSAFE_NUMBER");let n=Je(e,t),r=BigInt(n);return r>BigInt(t0)&&Z(`${t} exceeds ${t0}`),Number(r)}function To(e,t){return e==null?null:_t(e,t)}function kT(e,t){return e==null&&Z(`${t} is required`),typeof e=="bigint"?e.toString():typeof e=="number"?((!Number.isInteger(e)||!Number.isSafeInteger(e)||e<0)&&Z(`${t} must be a safe non-negative integer, decimal string, or slug`),String(e)):_t(String(e),t,{lower:!0})}function j(e,t){for(let n of t)if(e[n]!==void 0)return e[n]}function IT(e,t="protocol"){if(e==null)return"generic";let n=_t(e,t,{lower:!0}),r=vT[n]||n;return ST.has(r)||Z(`${t} must be a supported lending or yield protocol`),r}function l0(e){return e.protocol!=null?IT(e.protocol):e.marketId!=null||e.lltv!=null||e.loanAsset&&e.collateralAsset?"morpho":e.cToken!=null||e.underlying_symbol!=null||e.collateralFactor!=null?"compound":e.borrowedAmountWads!=null||e.lendingMarket!=null||e.mintDecimals!=null?"solend":e.recipe!=null||e.farmingMethod!=null||e.methodId!=null?"farming":e.spark!=null||e.savingsVault!=null?"spark":e.userReserves!=null||e.reserves!=null||e.liquidationThreshold!=null?"aave-v3":"generic"}function _T(e,t="evidence"){if(e==null)return Qe({status:"unknown",references:[]});let n=ue(e,t),r=_t(n.status??"unknown",`${t}.status`,{lower:!0});AT.has(r)||Z(`${t}.status must be complete, incomplete, unknown, or stale`),n.references!=null&&!Array.isArray(n.references)&&Z(`${t}.references must be an array`);let o=(n.references||[]).map((s,a)=>{let c=ue(s,`${t}.references[${a}]`);return{kind:_t(c.kind??c.type,`${t}.references[${a}].kind`,{lower:!0}),id:_t(c.id??c.receiptId??c.txHash,`${t}.references[${a}].id`)}}).sort((s,a)=>Cn(s.kind,a.kind)||Cn(s.id,a.id)),i=[];for(let s of o)i.some(a=>a.kind===s.kind&&a.id===s.id)||i.push(s);return Qe({status:r,references:i})}function d0(e,t){if(e==null)return null;if(typeof e=="number"&&Z(`${t} must be an exact integer string or BigInt; Number coercion is refused`,"POSITION_HEALTH_UNSAFE_NUMBER"),typeof e=="object"){let o=ue(e,t);if(o.bps!=null)return d0(o.bps,`${t}.bps`);if(o.ray!=null)return Bu(o.ray,`${t}.ray`);if(o.wad!=null)return i0(o.wad,`${t}.wad`);if(o.raw!=null)return Bu(o.raw,`${t}.raw`);o.value!=null&&Z(`${t}.value is not an exact integer threshold; supply bps, wad, or ray`,"POSITION_HEALTH_UNSAFE_NUMBER"),Z(`${t} must include bps, wad, or ray`)}let n=typeof e=="bigint"?e.toString():String(e).trim();/^\d+$/.test(n)||Z(`${t} must be a non-negative base-10 integer string`);let r=BigInt(n);return r<=10000n?r.toString():r<=gr?i0(r,t):Bu(r,t)}function i0(e,t){let r=BigInt(Je(e,t))*10000n/gr;return r>10000n&&Z(`${t} exceeds 100%`),r.toString()}function Bu(e,t){let n=BigInt(Je(e,t)),r=10n**27n,o=n*10000n/r;return o>10000n&&Z(`${t} exceeds 100%`),o.toString()}function s0(e,t,n){let r=`${n}[${t}]`,o=ue(e,r),i=_t(j(o,["asset","symbol","coin","underlying","underlyingToken","name"])??o.underlyingToken?.symbol??o.liquidityToken?.symbol,`${r}.asset`),s=To(j(o,["address","token","mint","underlyingAddress"])??o.underlyingToken?.address??o.liquidityToken?.mint,`${r}.address`),a=Je(j(o,["amount","balance","aTokenBalance","supplyBalance","supplyAssets","collateral","deposited","shares"]),`${r}.amount`),c=o0(j(o,["decimals","tokenDecimals","mintDecimals"])??o.underlyingToken?.decimals??o.liquidityToken?.decimals,`${r}.decimals`),u=Je(j(o,["price","priceQuoteMinor","oraclePrice","marketPrice"]),`${r}.price`),l=o0(j(o,["priceDecimals","oraclePriceDecimals","quoteDecimals"]),`${r}.priceDecimals`),d=null;if(n==="collateral"){let f=j(o,["liquidationThresholdBps","liquidationThreshold","lltv","ltvBps","collateralFactor","collateralFactorBps"])??o.supplyInfo?.liquidationThreshold;f==null&&Z(`${r}.liquidationThresholdBps is required`,"POSITION_HEALTH_MISSING_THRESHOLD"),d=d0(f,`${r}.liquidationThreshold`)}return Qe({asset:i,address:s,amount:a,decimals:String(c),price:u,priceDecimals:String(l),liquidationThresholdBps:d})}function As(e,t){return e==null?[]:(Array.isArray(e)||Z(`${t} must be an array`),e.length>n0&&Z(`${t} exceeds ${n0} assets`),e)}function OT(e){let t=j(e,["chain","chainId","network"]),n=e.market&&typeof e.market=="object"?e.market.chain?.chainId??(typeof e.market.chain=="string"||typeof e.market.chain=="bigint"?e.market.chain:null):null,r=kT(t??n,"chain"),o=_t(j(e,["account","address","owner","user","wallet"]),"account"),i=j(e,["marketId","pool","vault"]);return typeof e.market=="string"||typeof e.market=="bigint"?i=i??e.market:e.market&&typeof e.market=="object"&&(i=i??e.market.address??e.market.name??e.market.marketId??null),{chain:r,account:o,market:i==null?null:_t(String(i),"market")}}function TT(e,t){let n=Je(t.asOf??e.asOf,"asOf"),r=Je(j(e,["observedAt","fetchedAt","updatedAt","lastUpdate","asOfObserved"]),"observedAt"),o=Je(j(e,["expiresAt","validUntil","staleAfter"]),"expiresAt");return{asOf:n,observedAt:r,expiresAt:o}}function CT(e,t,n,r){return BigInt(r)<BigInt(t)?{status:"unknown",reason:"FUTURE_EVIDENCE"}:BigInt(r)>=BigInt(n)?{status:"stale",reason:"STALE_EVIDENCE"}:e.status==="stale"?{status:"stale",reason:"STALE_EVIDENCE"}:e.status==="unknown"?{status:"unknown",reason:"UNKNOWN_EVIDENCE"}:e.status==="incomplete"?{status:"incomplete",reason:"INCOMPLETE_EVIDENCE"}:{status:"complete",reason:null}}function Oo(e,t,n,r={}){return Qe({code:e,severity:t,message:n,...r})}function p0(e){let t={critical:0,warning:1,info:2};return[...e].sort((n,r)=>{let o=(t[n.severity]??9)-(t[r.severity]??9);return o||Cn(n.code,r.code)||Cn(n.message,r.message)})}function a0(e,t,n,r,o,i){return BigInt(e)*BigInt(n)*10n**BigInt(o-t)*10n**BigInt(i-r)}function NT(e,t){let n=[...e,...t],r=n.reduce((w,A)=>Math.max(w,Number(A.decimals)),0),o=n.reduce((w,A)=>Math.max(w,Number(A.priceDecimals)),0),i=0n,s=0n,a=0n;for(let w of e){let A=a0(w.amount,Number(w.decimals),w.price,Number(w.priceDecimals),r,o);s+=A,i+=A*BigInt(w.liquidationThresholdBps)}for(let w of t)a+=a0(w.amount,Number(w.decimals),w.price,Number(w.priceDecimals),r,o);let c=10n**BigInt(r),u={tokenDecimals:String(r),priceDecimals:String(o),unit:"quote-minor = floor(scaledValue / 10^tokenDecimals) at priceDecimals"},l=(s/c).toString(),d=(a/c).toString(),f=(i/10000n/c).toString();if(a===0n)return Qe({healthFactorWad:null,healthFactorStatus:s===0n?"empty":"no-debt",totalCollateralQuoteMinor:l,totalDebtQuoteMinor:"0",weightedCollateralQuoteMinor:f,liquidationBufferQuoteMinor:f,quote:u});let p=(i*gr/(a*10000n)).toString(),m=i/10000n-a,y=m<0n?"-":"",h=m<0n?-m:m;return Qe({healthFactorWad:p,healthFactorStatus:BigInt(p)<gr?"liquidatable":"priced",totalCollateralQuoteMinor:l,totalDebtQuoteMinor:d,weightedCollateralQuoteMinor:f,liquidationBufferQuoteMinor:`${y}${(h/c).toString()}`,quote:u})}function $e(e,t={}){K(e),K(t);let n=ue(e,"snapshot");ue(t,"options");let r=l0(n),{chain:o,account:i,market:s}=OT(n),a=_T(n.evidence),{asOf:c,observedAt:u,expiresAt:l}=TT(n,t),d=_t(n.id??n.positionId??`${r}:${o}:${i}:${s??"default"}`,"id"),f=To(n.tenantId,"tenantId"),p=As(n.collateral??n.supplies??n.deposits,"collateral").map((h,w)=>s0(h,w,"collateral")),m=As(n.debt??n.borrows??n.liabilities,"debt").map((h,w)=>s0(h,w,"debt")),y={id:d,protocol:r,chain:o,account:i,market:s,observedAt:u,expiresAt:l,asOf:c,evidence:a,collateral:p,debt:m};return f&&(y.tenantId=f),Qe(y)}function RT(e){return j(e,["liquidationThresholdBps","liquidationThreshold","lltv"])??e.market?.lltv??e.state?.lltv}function PT(e,t={}){return j(t,["collateralFactorBps","collateralFactor","liquidationThresholdBps","liquidationThreshold"])??j(e,["collateralFactorBps","collateralFactor","liquidationThresholdBps"])}function LT(e){return j(e,["price","priceQuoteMinor","oraclePrice","marketPrice"])}function $T(e,t={}){K(e);let n=ue(e,"snapshot");if(Array.isArray(n.collateral)||Array.isArray(n.debt))return $e({...n,protocol:"aave-v3"},t);let r=n.userReserves??n.reserves??n.market?.reserves;if(!Array.isArray(r))return $e({...n,protocol:"aave-v3"},t);let o=[],i=[];for(let s of r){let a=ue(s,"reserve"),c=ue(a.underlyingToken??a.token??a,"reserve.token"),u={asset:c.symbol??a.symbol,address:c.address??a.address,decimals:c.decimals??a.decimals,price:j(a,["price","priceQuoteMinor","oraclePrice"])??a.size?.usd,priceDecimals:j(a,["priceDecimals","oraclePriceDecimals"]),liquidationThreshold:a.liquidationThresholdBps??a.liquidationThreshold??a.supplyInfo?.liquidationThreshold},l=j(a,["aTokenBalance","supplyBalance","collateral","amount","supplied"]),d=j(a,["variableDebtTokenBalance","stableDebtTokenBalance","borrowBalance","debt","borrowed"]);l!=null&&l!=="0"&&o.push({...u,amount:l}),d!=null&&d!=="0"&&i.push({...u,amount:d})}return $e({...n,protocol:"aave-v3",collateral:n.collateral??o,debt:n.debt??i},t)}function qT(e,t={}){K(e);let n=ue(e,"snapshot");if(Array.isArray(n.collateral)||Array.isArray(n.debt))return $e({...n,protocol:"morpho"},t);let r=RT(n),o=n.collateralAsset??n.market?.collateralAsset??{},i=n.loanAsset??n.market?.loanAsset??{},s=n.position??n.state??{},a=[{asset:o.symbol??n.collateralSymbol,address:o.address,decimals:o.decimals??n.collateralDecimals,amount:j(n,["collateral","collateralAmount","supplyAssets"])??s.collateral??s.supplyAssets,price:j(n,["collateralPrice","price","priceQuoteMinor"])??o.price,priceDecimals:j(n,["collateralPriceDecimals","priceDecimals"])??o.priceDecimals,liquidationThreshold:r}],c=n.debt??[{asset:i.symbol??n.loanSymbol,address:i.address,decimals:i.decimals??n.loanDecimals,amount:j(n,["borrowAssets","debt","borrowAmount"])??s.borrowAssets,price:j(n,["loanPrice","debtPrice"])??i.price,priceDecimals:j(n,["loanPriceDecimals","debtPriceDecimals"])??i.priceDecimals}],u=(Array.isArray(c)?c:[c]).filter(l=>l&&l.amount!=null&&l.amount!=="0"&&l.amount!==0n);return $e({...n,protocol:"morpho",market:n.marketId??n.market?.marketId??n.market,collateral:Array.isArray(a)?a:[a],debt:u},t)}function BT(e,t={}){K(e);let n=ue(e,"snapshot"),r=n.markets??n.cTokens??(n.cToken||n.underlying?[n]:null);if(n.collateral||n.debt)return $e({...n,protocol:"compound"},t);let o=[],i=[];for(let s of As(r??[],"markets")){let a=ue(s,"market"),c={asset:a.underlying??a.underlying_symbol??a.symbol??a.asset,address:a.address??a.cToken,decimals:a.decimals??a.underlyingDecimals,price:a.price??a.priceQuoteMinor??a.oraclePrice,priceDecimals:a.priceDecimals,liquidationThreshold:PT(n,a)},u=j(a,["supplyBalance","balance","amount","totalSupply"]),l=j(a,["borrowBalance","borrow","debt","totalBorrow"]);u!=null&&u!=="0"&&o.push({...c,amount:u}),l!=null&&l!=="0"&&i.push({...c,amount:l})}return $e({...n,protocol:"compound",collateral:o,debt:i},t)}function UT(e,t={}){K(e);let n=ue(e,"snapshot");if(n.stale===!0||n.reserve?.lastUpdate?.stale===1)return $e({...n,protocol:"solend",evidence:{...n.evidence||{},status:"stale"}},t);if(n.collateral||n.debt)return $e({...n,protocol:"solend"},t);let r=n.reserves??n.obligation?.deposits??(n.mint||n.mintDecimals!=null?[n]:[]),o=[],i=[];for(let s of As(r,"reserves")){let a=ue(s,"reserve"),c={asset:a.symbol??a.asset??a.liquidityToken?.symbol,address:a.mint??a.address??a.liquidityToken?.mint,decimals:a.mintDecimals??a.decimals??a.liquidityToken?.decimals,price:LT(a),priceDecimals:a.priceDecimals??a.oraclePriceDecimals,liquidationThreshold:a.liquidationThresholdBps??a.liquidationThreshold??a.loanToValueRatio??n.liquidationThresholdBps},u=j(a,["depositedAmount","collateral","amount","availableAmount"]),l=j(a,["borrowedAmount","borrowBalance","debt"]);if(l==null&&a.borrowedAmountWads!=null){let d=Je(a.borrowedAmountWads,"borrowedAmountWads");l=(BigInt(d)/10n**18n).toString()}u!=null&&u!=="0"&&o.push({...c,amount:u}),l!=null&&l!=="0"&&i.push({...c,amount:l})}return $e({...n,protocol:"solend",collateral:o,debt:i},t)}function MT(e,t={}){K(e);let n=ue(e,"snapshot");if(n.collateral||n.debt)return $e({...n,protocol:"spark"},t);let r=n.vault??n.savingsVault??n.data?.vault??n,o=ue(r,"vault"),i=[{asset:o.symbol??o.asset??n.token??"savings",address:o.address??n.address,decimals:o.decimals??n.decimals,amount:j(n,["amount","shares","balance"])??o.amount??o.shares,price:j(n,["price","priceQuoteMinor"])??o.price,priceDecimals:j(n,["priceDecimals"])??o.priceDecimals,liquidationThreshold:j(n,["liquidationThresholdBps","liquidationThreshold"])??"10000"}],s=j(n,["debt","borrowed","borrowAmount"]),a=s==null||s==="0"?[]:[{asset:n.debtAsset??n.borrowSymbol??"debt",address:n.debtAddress,decimals:n.debtDecimals??o.decimals??n.decimals,amount:s,price:n.debtPrice??n.price,priceDecimals:n.debtPriceDecimals??n.priceDecimals??o.priceDecimals}];return $e({...n,protocol:"spark",collateral:i,debt:a},t)}function DT(e,t={}){K(e);let n=ue(e,"snapshot");if(n.tvlUsd!=null&&typeof n.tvlUsd=="number"&&Z("farming tvlUsd Number is refused; supply exact collateral and debt amounts","POSITION_HEALTH_UNSAFE_NUMBER"),Array.isArray(n.collateral)||Array.isArray(n.debt)){let c=$e({...n,protocol:"farming"},t),u=To(n.recipe??n.farmingMethod??n.methodId,"recipe");return Qe(u?{...c,recipe:u}:c)}let r=To(n.recipe??n.farmingMethod??n.methodId,"recipe"),o=[{asset:n.symbol??n.asset??n.project??"farm",address:n.pool??n.address,decimals:n.decimals,amount:j(n,["amount","deposited","shares","collateral"]),price:j(n,["price","priceQuoteMinor"]),priceDecimals:n.priceDecimals,liquidationThreshold:j(n,["liquidationThresholdBps","liquidationThreshold","lltv"])??"10000"}],i=j(n,["debt","borrowed","borrowAmount"]),s=i==null||i==="0"?[]:[{asset:n.debtAsset??n.borrowSymbol??"debt",decimals:n.debtDecimals??n.decimals,amount:i,price:n.debtPrice??n.price,priceDecimals:n.debtPriceDecimals??n.priceDecimals}],a=$e({...n,protocol:"farming",collateral:o,debt:s},t);return Qe(r?{...a,recipe:r}:a)}function jT(e,t={}){K(e);let n=ue(e,"snapshot"),r=l0(n);return FT[r]({...n,protocol:r},t)}function HT(e){let t=e==null?{}:ue(e,"thresholds"),n=Je(t.criticalHealthFactorWad??e0.criticalHealthFactorWad,"thresholds.criticalHealthFactorWad",{positive:!0}),r=Je(t.warningHealthFactorWad??e0.warningHealthFactorWad,"thresholds.warningHealthFactorWad",{positive:!0});BigInt(r)<BigInt(n)&&Z("thresholds.warningHealthFactorWad must be >= criticalHealthFactorWad");let o=Je(t.minLiquidationBufferQuoteMinor,"thresholds.minLiquidationBufferQuoteMinor",{optional:!0});return Qe({criticalHealthFactorWad:n,warningHealthFactorWad:r,minLiquidationBufferQuoteMinor:o})}function zT(e,t,n){let r=[];if(n.status!=="complete"){let a=n.reason||"UNKNOWN_EVIDENCE";return r.push(Oo(a,"critical","Position evidence is not current and complete; health fails closed.")),{healthStatus:n.status==="stale"?"stale":"unknown",findings:r,metrics:{healthFactorWad:null,totalCollateralQuoteMinor:null,totalDebtQuoteMinor:null,weightedCollateralQuoteMinor:null,liquidationBufferQuoteMinor:null,quote:null}}}let o=e;if(e.healthFactorStatus==="empty")return{healthStatus:"empty",findings:r,metrics:o};if(e.healthFactorStatus==="no-debt")return{healthStatus:"no-debt",findings:r,metrics:o};let i=BigInt(e.healthFactorWad);i<gr?r.push(Oo("LIQUIDATABLE","critical","Health factor is below 1.0 wad; the position is at or past liquidation.")):i<BigInt(t.criticalHealthFactorWad)?r.push(Oo("HEALTH_FACTOR_CRITICAL","critical","Health factor is below the configured critical threshold.")):i<BigInt(t.warningHealthFactorWad)&&r.push(Oo("HEALTH_FACTOR_WARNING","warning","Health factor is below the configured warning threshold.")),t.minLiquidationBufferQuoteMinor!=null&&BigInt(e.liquidationBufferQuoteMinor)<BigInt(t.minLiquidationBufferQuoteMinor)&&r.push(Oo("LIQUIDATION_BUFFER_LOW",i<gr?"critical":"warning","Liquidation buffer is below the configured quote-minor minimum."));let s="healthy";return r.some(a=>a.code==="LIQUIDATABLE")?s="liquidatable":r.some(a=>a.severity==="critical")?s="critical":r.length&&(s="warning"),{healthStatus:s,findings:r,metrics:o}}function Mu(e={},t={}){K(e),K(t),ue(e,"input"),ue(t,"options"),t.asOf==null&&e.asOf==null&&Z("explicit asOf required","POSITION_HEALTH_MISSING_ASOF");let n=jT(e,t),r=HT(t.thresholds??e.thresholds),o=CT(n.evidence,n.observedAt,n.expiresAt,n.asOf),i=zT(o.status==="complete"?NT(n.collateral,n.debt):{healthFactorStatus:"unknown"},r,o),s={recordVersion:c0,recordType:"position-health",label:u0,posture:"alert-only",executionReady:!1,signingReady:!1,broadcastReady:!1,id:n.id,protocol:n.protocol,chain:n.chain,account:n.account,market:n.market,observedAt:n.observedAt,expiresAt:n.expiresAt,asOf:n.asOf,evidence:n.evidence,collateral:n.collateral,debt:n.debt,thresholds:r,healthStatus:i.healthStatus,healthFactorWad:i.metrics.healthFactorWad,totalCollateralQuoteMinor:i.metrics.totalCollateralQuoteMinor,totalDebtQuoteMinor:i.metrics.totalDebtQuoteMinor,weightedCollateralQuoteMinor:i.metrics.weightedCollateralQuoteMinor,liquidationBufferQuoteMinor:i.metrics.liquidationBufferQuoteMinor,quote:i.metrics.quote,findings:p0(i.findings)};return n.tenantId&&(s.tenantId=n.tenantId),n.recipe&&(s.recipe=n.recipe),Qe(s)}function f0(e={},t={}){K(e),K(t);let n=Array.isArray(e)?{snapshots:e}:ue(e,"input"),r=n.snapshots??n.positions;Array.isArray(r)||Z("snapshots must be an array"),r.length>r0&&Z(`snapshots exceed ${r0}`);let o=Je(t.asOf??n.asOf,"asOf"),i=t.thresholds??n.thresholds,s=To(n.tenantId,"tenantId"),a=r.map((f,p)=>Mu(s&&f?.tenantId==null?{...f,tenantId:s}:f,{...t,asOf:o,thresholds:i,index:p})).sort((f,p)=>Cn(f.chain,p.chain)||Cn(f.account,p.account)||Cn(f.id,p.id)),c=p0(a.flatMap(f=>f.findings.map(p=>({...p,positionId:f.id})))),u=a.filter(f=>f.healthStatus==="unknown"||f.healthStatus==="stale").length,l=a.filter(f=>f.findings.length>0).length,d={recordVersion:c0,recordType:"position-health-book",label:u0,posture:"alert-only",asOf:o,positionCount:String(a.length),alertCount:String(l),failClosedCount:String(u),positions:a,findings:c};return s&&(d.tenantId=s),Qe(d)}var c0,u0,ET,e0,ST,vT,AT,xT,gr,t0,n0,r0,Uu,FT,m0=O(()=>{mr();c0=1,u0="Alert findings only; not an execution signal and not a live oracle.",ET=Object.freeze(["aave-v3","morpho","compound","solend","spark","farming","generic"]),e0=Object.freeze({criticalHealthFactorWad:"1050000000000000000",warningHealthFactorWad:"1250000000000000000"}),ST=new Set(ET),vT=Object.freeze({aave:"aave-v3",aavev3:"aave-v3","aave-v3":"aave-v3",morpho:"morpho",compound:"compound","compound-v2":"compound","compound-v3":"compound",solend:"solend",save:"solend",spark:"spark","spark-lend":"spark",farming:"farming",farm:"farming",yield:"farming",generic:"generic",lending:"generic"}),AT=new Set(["complete","incomplete","unknown","stale"]),xT=/[\u0000-\u001f\u007f]/,gr=10n**18n,t0=36,n0=64,r0=128,Uu=class extends Error{constructor(t,n="POSITION_HEALTH_INVALID"){super(`position health: ${t}`),this.name="PositionHealthValidationError",this.code=n}};FT=Object.freeze({"aave-v3":$T,morpho:qT,compound:BT,solend:UT,spark:MT,farming:DT,generic:$e})});function fe(e,t){throw new Du(e,t)}function Nn(e){if(e&&typeof e=="object"&&!Object.isFrozen(e)){for(let t of Object.values(e))Nn(t);Object.freeze(e)}return e}function Ht(e,t){return(!e||typeof e!="object"||Array.isArray(e)||Object.getPrototypeOf(e)!==Object.prototype)&&fe(`${t} must be a plain object`),e}function je(e,t,{optional:n=!1,lower:r=!1}={}){if(e==null&&n)return null;typeof e!="string"&&fe(`${t} must be a string`);let o=e.trim();return o||fe(`${t} is required`),ZT.test(o)&&fe(`${t} contains control characters`),o.length>2048&&fe(`${t} is too long`),r?o.toLowerCase():o}function Ot(e,t,{optional:n=!1,positive:r=!1}={}){if(e==null&&n)return null;typeof e=="number"&&fe(`${t} must be an exact decimal string or BigInt; Number coercion is refused`,"GOVERNANCE_UNSAFE_NUMBER");let o;typeof e=="bigint"?o=e.toString():typeof e=="string"?o=e.trim():fe(`${t} must be an exact decimal string or BigInt`),/^\d+$/.test(o)||fe(`${t} must be a non-negative base-10 integer string`);let i=BigInt(o);return r&&i===0n&&fe(`${t} must be positive`),i.toString()}function br(e,t){return e==null?null:je(e,t)}function dn(e,t){for(let n of t)if(e[n]!==void 0)return e[n]}function nC(e,t="action"){let n=je(e,t,{lower:!0});return YT.has(n)||fe(`${t} must be proposal, delegation, or vote`),n}function rC(e,t="proposal.state"){e==null&&fe(`${t} is required`,"GOVERNANCE_MISSING_PROPOSAL_STATE");let n=je(e,t,{lower:!0});return XT.has(n)||fe(`${t} is not a recognized proposal state`),n==="unknown"&&fe(`${t} is unknown; voting and execution fail closed`,"GOVERNANCE_UNKNOWN_PROPOSAL_STATE"),n}function oC(e){let t=je(e,"support",{lower:!0});return JT.has(t)||fe("support must be for, against, or abstain"),t}function xs(e,{accountRequired:t=!0}={}){return Nn({chain:je(dn(e,["chain","chainId","network"]),"chain",{lower:!0}),governor:je(dn(e,["governor","governorAddress","governance","contract"]),"governor"),account:je(dn(e,["account","address","owner","voter","from","proposer"]),"account",{optional:!t})})}function No(e,t){let n=br(t.tenantId??e.tenantId,"tenantId");return n?{tenantId:n}:{}}function ks(e,t,n="asOf"){return Ot(t.asOf??e.asOf,n)}function iC(e,t={}){K(e),K(t);let n=Ht(e,"proposal");Ht(t,"options");let r=ks(n,t),o=xs(n,{accountRequired:!1}),i=je(dn(n,["proposalId","id"]),"proposalId"),s=rC(dn(n,["state","status","proposalState"])),a=br(n.title??n.name,"title"),c=br(n.description??n.body??n.summary,"description"),u=br(n.proposer,"proposer"),l=Ot(n.startBlock??n.start,"startBlock",{optional:!0}),d=Ot(n.endBlock??n.end,"endBlock",{optional:!0}),f=Ot(n.forVotes??n.votesFor,"forVotes",{optional:!0}),p=Ot(n.againstVotes??n.votesAgainst,"againstVotes",{optional:!0}),m=Ot(n.abstainVotes??n.votesAbstain,"abstainVotes",{optional:!0}),y={recordVersion:Co,recordType:"governance-proposal",label:ln,asOf:r,chain:o.chain,governor:o.governor,proposalId:i,state:s,votable:eC.has(s),terminal:tC.has(s),title:a,description:c,proposer:u,startBlock:l,endBlock:d,tallies:{forVotes:f,againstVotes:p,abstainVotes:m},occurred:!1,...No(n,t)};return Nn(y)}function sC(e,t={}){K(e),K(t);let n=Ht(e,"intent");Ht(t,"options");let r=ks(n,t),o=xs(n),i=n.mode??(n.action==="undelegate"?"undelegate":"delegate"),s=je(i,"mode",{lower:!0});QT.has(s)||fe("mode must be delegate or undelegate");let a=s==="undelegate"?br(n.delegatee??n.to,"delegatee"):je(n.delegatee??n.to,"delegatee"),c=Ot(dn(n,["votingPower","votes","power","balance"]),"votingPower",{positive:!0}),u={recordVersion:Co,recordType:"governance-delegation-intent",label:ln,action:"delegation",mode:s,asOf:r,chain:o.chain,governor:o.governor,account:o.account,delegatee:s==="undelegate"?a??o.account:a,votingPower:c,occurred:!1,...No(n,t)};return Nn(u)}function aC(e,t={}){K(e),K(t);let n=Ht(e,"intent");Ht(t,"options");let r=ks(n,t),o=iC(n.proposal??n,t);o.votable||fe(`proposal ${o.proposalId} is ${o.state} and is not votable`,"GOVERNANCE_PROPOSAL_NOT_VOTABLE");let i=xs({...n,chain:n.chain??o.chain,governor:n.governor??o.governor}),s=oC(n.support??n.choice??n.vote),a=Ot(dn(n,["votingPower","votes","power","weight"]),"votingPower",{positive:!0}),c=br(n.reason??n.comment,"reason"),u={recordVersion:Co,recordType:"governance-vote-intent",label:ln,action:"vote",asOf:r,chain:i.chain,governor:i.governor,account:i.account,proposalId:o.proposalId,proposalState:o.state,support:s,votingPower:a,reason:c,occurred:!1,voted:!1,signed:!1,broadcast:!1,proposal:o,...No(n,t)};return Nn(u)}function cC(e,t={}){K(e);let n=Ht(e,"intent"),r=ks(n,t),o=xs(n),i=je(n.title??n.name,"title"),s=je(n.description??n.body,"description"),a=n.targets;(!Array.isArray(a)||a.length===0)&&fe("targets must be a non-empty array");let c=(n.values??a.map(()=>"0")).map((d,f)=>Ot(d,`values[${f}]`));c.length!==a.length&&fe("values length must match targets");let u=(n.calldatas??n.data??[]).map((d,f)=>je(String(d),`calldatas[${f}]`));u.length!==a.length&&fe("calldatas length must match targets");let l=Ot(dn(n,["votingPower","proposalThreshold","threshold"]),"votingPower",{positive:!0});return Nn({recordVersion:Co,recordType:"governance-proposal-intent",label:ln,action:"proposal",asOf:r,chain:o.chain,governor:o.governor,account:o.account,title:i,description:s,targets:a.map((d,f)=>je(d,`targets[${f}]`)),values:c,calldatas:u,votingPower:l,occurred:!1,...No(n,t)})}function uC(e,t,n){return e==="vote"?aC(t,n):e==="delegation"?sC(t,n):cC(t,n)}function lC(e){return e.action==="vote"?[`Unsigned vote preview for proposal ${e.proposalId} on ${e.governor}.`,`Support: ${e.support}. Voting power: ${e.votingPower} (exact base units).`,`Proposal state is ${e.proposalState}. No ballot is submitted.`,ln]:e.action==="delegation"?[`Unsigned ${e.mode} preview on ${e.governor}.`,`Account ${e.account} \u2192 ${e.delegatee}. Voting power: ${e.votingPower}.`,"No delegation transaction is signed or broadcast.",ln]:[`Unsigned proposal preview on ${e.governor}: ${e.title}.`,`${e.targets.length} target(s). Voting power: ${e.votingPower}.`,"No proposal is submitted.",ln]}function h0(e={},t={}){K(e),K(t);let n=Ht(e,"intent");Ht(t,"options"),t.asOf==null&&n.asOf==null&&fe("explicit asOf required","GOVERNANCE_MISSING_ASOF");let r=nC(n.action??n.type??t.action??dC(n)),o=uC(r,{...n,action:r},t);return Nn({recordVersion:Co,recordType:"governance-preview",label:ln,action:r,asOf:o.asOf,occurred:!1,voted:!1,signed:!1,broadcast:!1,executionReady:!1,signingReady:!1,broadcastReady:!1,lines:lC(o),intent:o,...No(n,t)})}function dC(e){if(e.support!=null||e.choice!=null||e.proposalId!=null)return"vote";if(e.delegatee!=null||e.mode==="delegate"||e.mode==="undelegate")return"delegation";if(e.targets!=null||e.title!=null)return"proposal";fe("action is required")}var Co,ln,VT,WT,GT,KT,YT,XT,JT,QT,ZT,eC,tC,Du,y0=O(()=>{mr();Co=1,ln="Unsigned prepare material only; no vote, signature, or broadcast occurred.",VT=Object.freeze(["proposal","delegation","vote"]),WT=Object.freeze(["pending","active","succeeded","queued","executed","defeated","canceled","expired","unknown"]),GT=Object.freeze(["for","against","abstain"]),KT=Object.freeze(["delegate","undelegate"]),YT=new Set(VT),XT=new Set(WT),JT=new Set(GT),QT=new Set(KT),ZT=/[\u0000-\u001f\u007f]/,eC=new Set(["active"]),tC=new Set(["executed","defeated","canceled","expired"]),Du=class extends Error{constructor(t,n="GOVERNANCE_PREPARE_INVALID"){super(`governance prepare: ${t}`),this.name="GovernancePrepareError",this.code=n}}});import{createHash as pC}from"node:crypto";import{getAddress as fC,wordlists as mC}from"ethers";import{address as hC}from"@solana/addresses";import{base58check as yC,bech32 as g0,bech32m as gC}from"@scure/base";import{sha256 as bC}from"@noble/hashes/sha2.js";function A0(e){return String(e).replace(/[^a-z0-9]/gi,"").toLowerCase()}function MC(e){let t=A0(e);return TC.some(n=>t.includes(n))}function DC(e){return BC.has(A0(e))}function FC(e){let t=String(e).trim().toLowerCase().split(/\s+/).filter(Boolean);return PC.has(t.length)&&t.every(n=>mC.en.getWordIndex(n)>=0)}function Nt(e){let t=new WeakSet,n=0;function r(o,i,s,a=""){if(n+=1,n>xC)throw new RangeError("safety-intelligence: input is too large");if(s>kC)throw new RangeError("safety-intelligence: input is too deep");if(o==null||typeof o=="boolean")return;if(typeof o=="string"){if(o.length>IC)throw new RangeError(`safety-intelligence: string too long at ${i}`);if(CC.test(o)||NC.test(o)||FC(o))throw new TypeError(`safety-intelligence: key material refused at ${i}`);if(RC.test(o)&&!DC(a))throw new TypeError(`safety-intelligence: key material refused at ${i}`);return}if(typeof o=="number"){if(!Number.isFinite(o))throw new TypeError(`safety-intelligence: finite number required at ${i}`);return}if(typeof o=="bigint")return;if(typeof o!="object")throw new TypeError(`safety-intelligence: JSON-like input required at ${i}`);if(ArrayBuffer.isView(o)||o instanceof ArrayBuffer)throw new TypeError(`safety-intelligence: binary key material refused at ${i}`);if(t.has(o))throw new TypeError(`safety-intelligence: cyclic input refused at ${i}`);if(t.add(o),Array.isArray(o)){if(o.length>Ro)throw new RangeError(`safety-intelligence: array too large at ${i}`);if(o.length===64&&o.every(u=>Number.isInteger(u)&&u>=0&&u<=255))throw new TypeError(`safety-intelligence: key material refused at ${i}`);o.forEach((u,l)=>r(u,`${i}[${l}]`,s+1,a)),t.delete(o);return}if(Object.getPrototypeOf(o)!==Object.prototype)throw new TypeError(`safety-intelligence: plain object required at ${i}`);let c=Reflect.ownKeys(o).filter(u=>typeof u=="string");if(c.length>64)throw new RangeError(`safety-intelligence: too many fields at ${i}`);for(let u of c){if(MC(u))throw new TypeError(`safety-intelligence: secret-bearing field refused at ${i}.${u}`);let l=Object.getOwnPropertyDescriptor(o,u),d=l&&"get"in l&&typeof l.get=="function"?l.get.call(o):o[u];d!==void 0&&r(d,`${i}.${u}`,s+1,u)}t.delete(o)}return r(e,"$",0),e}function qe(e,t,n){for(let r of Object.keys(e||{}))if(!t.has(r))throw new TypeError(`safety-intelligence: unknown ${n} field ${r}`)}function zt(e,t,n,{required:r=!1}={}){if(e==null||e===""){if(r)throw new TypeError(`safety-intelligence: ${t} required`);return null}let o=String(e).trim();if(!o&&r)throw new TypeError(`safety-intelligence: ${t} required`);if(o.length>n)throw new RangeError(`safety-intelligence: ${t} exceeds ${n} characters`);if(/[\u0000-\u001f\u007f\u200b-\u200f\u202a-\u202e\u2060-\u2064\ufeff]/i.test(o))throw new TypeError(`safety-intelligence: control or invisible characters refused in ${t}`);return o||null}function Is(e,t){if(e==null||e==="")throw new TypeError(`safety-intelligence: ${t} required`);let n;if(typeof e=="number"){if(!Number.isSafeInteger(e)||e<0)throw new TypeError(`safety-intelligence: ${t} must be a safe integer millisecond timestamp`);n=e}else if(typeof e=="string"){let r=e.trim();if($C.test(r)&&r.length<=qC){if(n=Number(r),!Number.isSafeInteger(n))throw new TypeError(`safety-intelligence: ${t} must be a safe integer millisecond timestamp`)}else if(LC.test(r)){if(n=Date.parse(r),!Number.isFinite(n)||new Date(n).toISOString().replace(/\.000Z$/,"Z")!==r&&new Date(n).toISOString()!==r)throw new TypeError(`safety-intelligence: ${t} must be a canonical ISO timestamp`)}else throw new TypeError(`safety-intelligence: ${t} must be a canonical ISO timestamp or integer milliseconds`)}else throw new TypeError(`safety-intelligence: ${t} must be a timestamp`);if(!Number.isFinite(n))throw new TypeError(`safety-intelligence: ${t} must be a valid timestamp`);return{ms:n,iso:new Date(n).toISOString()}}function x0(e,t){return e==null||e===""?null:Is(e,t)}function S0(e){let t=String(e||"").trim().toLowerCase();if(t==="evm"||t==="eip155")return"evm";if(t==="solana")return"solana";if(t==="bitcoin"||t==="bip122"||t==="btc")return"bitcoin";throw new TypeError("safety-intelligence: chain family must be evm, solana, or bitcoin")}function k0(e){Nt(e);let t,n;if(Number.isInteger(e))t="evm",n=e;else if(typeof e=="string"){let i=e.trim();if(/^\d+$/.test(i))t="evm",n=Number(i);else{let s=/^(eip155|evm|solana|bitcoin|bip122|btc):([^:]+)$/i.exec(i);if(!s)throw new TypeError("safety-intelligence: chain must include a supported family");t=S0(s[1]),n=s[2]}}else if(e&&typeof e=="object"&&!Array.isArray(e))qe(e,new Set(["family","namespace","chainId","reference","network","key"]),"chain"),t=S0(e.family??e.namespace??(e.chainId!=null?"evm":"")),n=t==="evm"?e.chainId??e.reference:e.network??e.reference;else throw new TypeError("safety-intelligence: chain required");if(t==="evm"){let i=typeof n=="string"&&/^\d+$/.test(n)?Number(n):n;if(!Number.isSafeInteger(i)||i<=0)throw new TypeError("safety-intelligence: EVM chainId must be a positive safe integer");return ye({family:t,namespace:"eip155",reference:String(i),chainId:i,key:`eip155:${i}`})}let r=zt(n,`${t} network`,80,{required:!0}).toLowerCase();if(!/^[a-z0-9][a-z0-9._-]*$/.test(r))throw new TypeError(`safety-intelligence: invalid ${t} network`);let o=t==="bitcoin"?"bip122":"solana";return ye({family:t,namespace:o,reference:r,network:r,key:`${o}:${r}`})}function jC(e){let t=String(e).toLowerCase();return["mainnet","main","bitcoin"].includes(t)?"mainnet":["testnet","testnet3","test","signet"].includes(t)?"testnet":t==="regtest"?"regtest":"unknown"}function HC(e,t){let n=zt(e,"bitcoin address",100,{required:!0}),r=jC(t.reference);if(/^(bc1|tb1|bcrt1)/i.test(n)){if(n!==n.toLowerCase()&&n!==n.toUpperCase())throw new TypeError("safety-intelligence: mixed-case Bitcoin bech32 address refused");let s=n.toLowerCase(),a,c;try{a=g0.decode(s,100),c="bech32"}catch{try{a=gC.decode(s,100),c="bech32m"}catch{throw new TypeError("safety-intelligence: invalid Bitcoin bech32 checksum")}}let u=a.words[0],l;try{l=g0.fromWords(a.words.slice(1))}catch{throw new TypeError("safety-intelligence: invalid Bitcoin witness program")}if(!Number.isInteger(u)||u<0||u>16||l.length<2||l.length>40)throw new TypeError("safety-intelligence: invalid Bitcoin witness program");if(u===0&&(c!=="bech32"||![20,32].includes(l.length)))throw new TypeError("safety-intelligence: invalid v0 Bitcoin witness address");if(u>0&&c!=="bech32m")throw new TypeError("safety-intelligence: v1+ Bitcoin witness address must use bech32m");let d=r==="mainnet"?"bc":r==="testnet"?"tb":r==="regtest"?"bcrt":null;if(d&&a.prefix!==d)throw new TypeError(`safety-intelligence: Bitcoin address does not match ${t.reference}`);return{canonical:s,display:s}}let o;try{o=OC.decode(n)}catch{throw new TypeError("safety-intelligence: invalid Bitcoin base58check address")}if(o.length!==21)throw new TypeError("safety-intelligence: invalid Bitcoin address payload");let i=o[0];if(r==="mainnet"&&![0,5].includes(i))throw new TypeError("safety-intelligence: Bitcoin address does not match mainnet");if((r==="testnet"||r==="regtest")&&![111,196].includes(i))throw new TypeError(`safety-intelligence: Bitcoin address does not match ${t.reference}`);return{canonical:n,display:n}}function zC(e,t){let n=k0(t);Nt(e);let r=zt(e,`${n.family} address`,128,{required:!0});if(n.family==="evm"){let o=r.startsWith("0X")?`0x${r.slice(2)}`:r,i;try{i=fC(o)}catch{throw new TypeError("safety-intelligence: invalid EVM address or mixed-case checksum")}return ye({canonical:i.toLowerCase(),display:i})}if(n.family==="solana"){let o;try{o=String(hC(r))}catch{throw new TypeError("safety-intelligence: invalid Solana address")}return ye({canonical:o,display:o})}return ye(HC(r,n))}function Vt(e={}){if(Nt(e),!e||typeof e!="object"||Array.isArray(e))throw new TypeError("safety-intelligence: target object required");qe(e,new Set(["chain","chainId","family","network","address","displayAddress","key"]),"target");let t=e.chain??(e.chainId!=null?{family:e.family??"evm",chainId:e.chainId}:{family:e.family,network:e.network}),n=k0(t),r=zC(e.address,n);return ye({chain:n,address:r.canonical,displayAddress:r.display,key:`${n.key}:${r.canonical}`})}function Ct(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(Ct).join(",")}]`:`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${Ct(e[t])}`).join(",")}}`}function Hu(e){return pC("sha256").update(e).digest("hex")}function ye(e){if(!e||typeof e!="object"||Object.isFrozen(e))return e;for(let t of Object.values(e))ye(t);return Object.freeze(e)}function Fu(e){let t=String(e||"").trim().toLowerCase().replace(/_/g,"-"),r={sanction:"sanctions",sanctions:"sanctions",phishing:"phishing",scam:"scam",fraud:"scam",poisoning:"address-poisoning","address-poisoning":"address-poisoning"}[t];if(!r||!SC.has(r))throw new TypeError(`safety-intelligence: unsupported evidence kind ${String(e||"<missing>")}`);return r}function VC(e){let t=e.verdict??e.disposition??e.result??e.status;if(t==null){for(let o of["match","listed","malicious"])if(typeof e[o]=="boolean"){t=e[o]?"MATCH":"NO_MATCH";break}}let n=String(t||"").trim().toUpperCase().replace(/[ -]+/g,"_"),r=UC[n];if(!r)throw new TypeError(`safety-intelligence: unsupported evidence verdict ${String(t||"<missing>")}`);return r}function WC(e,t){let n=e.target??(e.address!=null?{address:e.address,chain:e.chain,chainId:e.chainId,family:e.family,network:e.network}:null);if(!n){if(!t)throw new TypeError("safety-intelligence: evidence target required");return t}return Vt(n)}function GC(e={},t={}){if(Nt({input:e,options:t}),!e||typeof e!="object"||Array.isArray(e))throw new TypeError("safety-intelligence: evidence object required");qe(e,new Set(["kind","type","category","source","sourceRecordId","recordId","reference","verdict","disposition","result","status","match","listed","malicious","confidence","fetchedAt","expiresAt","expiry","ttlMs","summary","target","address","chain","chainId","family","network"]),"evidence"),qe(t,new Set(["target","asOf"]),"evidence option");let n=WC(e,t.target?Vt(t.target):null),r=Fu(e.kind??e.type??e.category),o=VC(e),i=e.source&&typeof e.source=="object"?e.source.name??e.source.id:e.source,s=zt(i,"evidence source",120,{required:!0}),a=Number(e.confidence);if(!Number.isFinite(a)||a<0||a>1)throw new TypeError("safety-intelligence: evidence confidence must be between 0 and 1");let c=Is(e.fetchedAt,"evidence fetchedAt"),u=x0(e.expiresAt??e.expiry,"evidence expiresAt");if(!u&&e.ttlMs!=null){let h=Number(e.ttlMs);if(!Number.isSafeInteger(h)||h<=0||h>w0)throw new RangeError(`safety-intelligence: evidence ttlMs must be 1..${w0}`);u={ms:c.ms+h,iso:new Date(c.ms+h).toISOString()}}if(!u)throw new TypeError("safety-intelligence: evidence expiresAt or ttlMs required");if(u.ms<=c.ms)throw new TypeError("safety-intelligence: evidence expiry must be after fetchedAt");if(t.asOf==null)throw new TypeError("safety-intelligence: explicit asOf required for deterministic freshness");let l=Is(t.asOf,"asOf").ms,d=c.ms>l+_C?"FUTURE":u.ms<=l?"STALE":"CURRENT",f=zt(e.sourceRecordId??e.recordId??e.reference,"source record id",160),p=zt(e.summary,"evidence summary",500),m={kind:r,verdict:o,source:s,...f?{sourceRecordId:f}:{},fetchedAt:c.iso,expiresAt:u.iso,confidence:a,freshness:d,target:n.key,...p?{summary:p}:{}},y=`safety-evidence:${Hu(Ct(m))}`;return ye({id:y,...m})}function KC(e=[],t={}){if(Nt({records:e,options:t}),!Array.isArray(e))throw new TypeError("safety-intelligence: evidence must be an array");let n=t.maxEvidence??vC;if(!Number.isSafeInteger(n)||n<=0||n>Ro)throw new RangeError("safety-intelligence: invalid maxEvidence");if(e.length>n)throw new RangeError(`safety-intelligence: evidence exceeds ${n} records`);qe(t,new Set(["target","asOf","maxEvidence"]),"evidence-set option");let r={target:t.target,asOf:t.asOf},o=new Map(e.map(i=>{let s=GC(i,r);return[s.id,s]}));return ye([...o.values()].sort((i,s)=>i.id.localeCompare(s.id)))}function YC(e,t,n){if(!e||typeof e!="object"||Array.isArray(e))throw new TypeError(`safety-intelligence: knownContacts[${n}] must be an object`);qe(e,new Set(["id","label","address","chain","chainId","family","network"]),"contact");let r=Vt({address:e.address,chain:e.chain??(e.chainId!=null?{family:e.family??"evm",chainId:e.chainId}:e.family||e.network?{family:e.family,network:e.network}:t)}),o=zt(e.id,"contact id",120),i=zt(e.label,"contact label",120);return ye({...o?{id:o}:{},...i?{label:i}:{},target:r})}function _s(e,t){if(typeof e=="number"&&(!Number.isSafeInteger(e)||e<0))throw new TypeError(`safety-intelligence: ${t} must be an exact non-negative integer`);let n=typeof e=="bigint"?e.toString():String(e??"").trim();if(!/^\d+$/.test(n)||n.length>100)throw new TypeError(`safety-intelligence: ${t} must be a bounded base-unit integer`);return BigInt(n).toString()}function XC(e,t,n){if(!e||typeof e!="object"||Array.isArray(e))throw new TypeError(`safety-intelligence: observations[${n}] must be an object`);qe(e,new Set(["address","counterparty","from","direction","amountBaseUnits","chain","chainId","family","network","observedAt"]),"observation");let r=e.counterparty??e.address??e.from,o=Vt({address:r,chain:e.chain??(e.chainId!=null?{family:e.family??"evm",chainId:e.chainId}:e.family||e.network?{family:e.family,network:e.network}:t)}),i=String(e.direction??(e.from!=null?"inbound":"unknown")).toLowerCase(),s=["inbound","received","receive"].includes(i)?"inbound":["outbound","sent","send"].includes(i)?"outbound":"unknown",a=_s(e.amountBaseUnits,`observations[${n}].amountBaseUnits`),c=x0(e.observedAt,`observations[${n}].observedAt`)?.iso??null;return ye({target:o,direction:s,amountBaseUnits:a,...c?{observedAt:c}:{}})}function JC(e,t){let n=0;for(;n<e.length&&n<t.length&&e[n]===t[n];)n+=1;return n}function QC(e,t){let n=0;for(;n<e.length&&n<t.length&&e[e.length-1-n]===t[t.length-1-n];)n+=1;return n}function v0(e){return e.chain.family==="evm"?e.address.slice(2):e.address}function Tt(e){return ye({code:e.code,severity:e.severity,category:e.category,basis:e.basis,message:e.message,...e.evidenceIds?.length?{evidenceIds:[...e.evidenceIds].sort()}:{},...e.relatedTargets?.length?{relatedTargets:[...e.relatedTargets].sort()}:{}})}function ju(e){let t=new Map;for(let n of e){let r=Ct(n);t.set(r,n)}return[...t.values()].sort((n,r)=>(E0[n.severity]??9)-(E0[r.severity]??9)||n.category.localeCompare(r.category)||n.code.localeCompare(r.code)||Ct(n).localeCompare(Ct(r)))}function ZC(e={},t={}){if(Nt({input:e,options:t}),!e||typeof e!="object"||Array.isArray(e))throw new TypeError("safety-intelligence: poisoning input object required");qe(e,new Set(["target","address","chain","chainId","family","network","knownContacts","expectedContact","observations","dustThresholdBaseUnits","lookalikeEdgeChars"]),"poisoning input"),qe(t,new Set(["maxContacts","maxObservations"]),"poisoning option");let n=Vt(e.target??{address:e.address,chain:e.chain,chainId:e.chainId,family:e.family,network:e.network}),r=e.knownContacts??[],o=e.observations??[];if(!Array.isArray(r))throw new TypeError("safety-intelligence: knownContacts must be an array");if(!Array.isArray(o))throw new TypeError("safety-intelligence: observations must be an array");let i=t.maxContacts??AC,s=t.maxObservations??Ro;if(!Number.isSafeInteger(i)||i<=0||i>Ro)throw new RangeError("safety-intelligence: invalid maxContacts");if(!Number.isSafeInteger(s)||s<=0||s>Ro)throw new RangeError("safety-intelligence: invalid maxObservations");if(r.length>i)throw new RangeError(`safety-intelligence: knownContacts exceeds ${i}`);if(o.length>s)throw new RangeError(`safety-intelligence: observations exceeds ${s}`);let a=r.map((p,m)=>YC(p,n.chain,m)).sort((p,m)=>p.target.key.localeCompare(m.target.key)||String(p.id||p.label||"").localeCompare(String(m.id||m.label||""))),c=o.map((p,m)=>XC(p,n.chain,m)).sort((p,m)=>Ct(p).localeCompare(Ct(m))),u=a.filter(p=>p.target.chain.key===n.chain.key),l=u.filter(p=>p.target.address===n.address),d=[],f=null;if(e.expectedContact!=null){if(typeof e.expectedContact=="string")f=Vt({chain:n.chain,address:e.expectedContact});else if(typeof e.expectedContact=="object"&&!Array.isArray(e.expectedContact))qe(e.expectedContact,new Set(["address","chain","chainId","family","network"]),"expectedContact"),f=Vt({address:e.expectedContact.address,chain:e.expectedContact.chain??(e.expectedContact.chainId!=null?{family:e.expectedContact.family??"evm",chainId:e.expectedContact.chainId}:e.expectedContact.family||e.expectedContact.network?{family:e.expectedContact.family,network:e.expectedContact.network}:n.chain)});else throw new TypeError("safety-intelligence: expectedContact must be an address or target object");f.key!==n.key&&d.push(Tt({code:"EXPECTED_CONTACT_MISMATCH",severity:"REVIEW",category:"address-poisoning",basis:"contact-match",message:"Destination does not exactly match the caller-supplied expected contact.",relatedTargets:[f.key,n.key]}))}if(l.length===0){let p=Number(e.lookalikeEdgeChars??4);if(!Number.isSafeInteger(p)||p<3||p>12)throw new RangeError("safety-intelligence: lookalikeEdgeChars must be 3..12");let m=v0(n);for(let y of u){let h=v0(y.target),w=JC(m,h),A=QC(m,h);w>=p&&A>=p&&m!==h&&d.push(Tt({code:"ADDRESS_LOOKALIKE",severity:"REVIEW",category:"address-poisoning",basis:"heuristic",message:`Destination shares at least ${p} leading and trailing characters with a different known contact.`,relatedTargets:[y.target.key,n.key]}))}if(e.dustThresholdBaseUnits!=null){let y=BigInt(_s(e.dustThresholdBaseUnits,"dustThresholdBaseUnits"));c.filter(w=>w.target.key===n.key&&w.direction==="inbound"&&BigInt(w.amountBaseUnits)<=y).length>0&&d.push(Tt({code:"PRIOR_DUST_CONTACT",severity:"REVIEW",category:"address-poisoning",basis:"heuristic",message:"Destination appeared as an inbound counterparty at or below the caller-supplied base-unit dust threshold.",relatedTargets:[n.key]}))}}return ye({target:n,exactKnownContact:l.length>0,exactContacts:l,findings:ju(d),dustThresholdBaseUnits:e.dustThresholdBaseUnits==null?null:_s(e.dustThresholdBaseUnits,"dustThresholdBaseUnits")})}function eN(e){let t=e??EC;if(!Array.isArray(t)||t.length===0||t.length>32)throw new TypeError("safety-intelligence: requiredChecks must be a non-empty bounded array");let n=t.map((o,i)=>{if(typeof o=="string")return{kind:Fu(o),source:null};if(!o||typeof o!="object"||Array.isArray(o))throw new TypeError(`safety-intelligence: requiredChecks[${i}] must be a kind or object`);return qe(o,new Set(["kind","source"]),"required check"),{kind:Fu(o.kind),source:zt(o.source,"required check source",120,{required:!0})}}),r=new Map(n.map(o=>[`${o.kind}:${o.source||"*"}`,o]));return ye([...r.values()].sort((o,i)=>`${o.kind}:${o.source||"*"}`.localeCompare(`${i.kind}:${i.source||"*"}`)))}function tN(e,t){return e.filter(n=>n.kind===t.kind&&(!t.source||n.source===t.source))}function nN(e){return e.some(t=>t.severity==="BLOCK")?"BLOCK":e.some(t=>t.severity==="REVIEW")?"REVIEW":e.some(t=>t.severity==="UNKNOWN")?"UNKNOWN":"CLEAR"}function I0(e){return Nt(e),`sha256:${Hu(Ct(e))}`}function zu(e={},t={}){if(Nt({input:e,options:t}),!e||typeof e!="object"||Array.isArray(e))throw new TypeError("safety-intelligence: evaluation input object required");if(qe(e,new Set(["target","address","chain","chainId","family","network","evidence","requiredChecks","knownContacts","expectedContact","observations","dustThresholdBaseUnits","lookalikeEdgeChars"]),"evaluation input"),qe(t,new Set(["asOf","minClearConfidence","minBlockConfidence","maxEvidence","maxContacts","maxObservations"]),"evaluation option"),t.asOf==null)throw new TypeError("safety-intelligence: explicit asOf required for deterministic evaluation");let n=Is(t.asOf,"asOf").iso,r=e.target??{address:e.address,chain:e.chain,chainId:e.chainId,family:e.family,network:e.network},o=Vt(r),i=Number(t.minClearConfidence??.8),s=Number(t.minBlockConfidence??.8);for(let[h,w]of[["minClearConfidence",i],["minBlockConfidence",s]])if(!Number.isFinite(w)||w<0||w>1)throw new TypeError(`safety-intelligence: ${h} must be between 0 and 1`);let a=KC(e.evidence??[],{target:o,asOf:n,maxEvidence:t.maxEvidence}),c=a.filter(h=>h.target===o.key),u=eN(e.requiredChecks),l=[];for(let h of c)h.freshness==="CURRENT"&&h.verdict==="BLOCK"?l.push(Tt({code:h.confidence>=s?"CURRENT_EXPLICIT_BLOCK":"LOW_CONFIDENCE_BLOCK_SIGNAL",severity:h.confidence>=s?"BLOCK":"REVIEW",category:h.kind,basis:"explicit-evidence",message:h.confidence>=s?"A current injected source returned an explicit BLOCK disposition.":"A current injected source returned BLOCK below the configured block-confidence threshold.",evidenceIds:[h.id]})):h.freshness==="CURRENT"&&h.verdict==="REVIEW"?l.push(Tt({code:"CURRENT_EXPLICIT_REVIEW",severity:"REVIEW",category:h.kind,basis:"explicit-evidence",message:"A current injected source returned an explicit REVIEW disposition.",evidenceIds:[h.id]})):h.freshness!=="CURRENT"&&["BLOCK","REVIEW"].includes(h.verdict)?l.push(Tt({code:h.freshness==="FUTURE"?"FUTURE_POSITIVE_EVIDENCE":"STALE_POSITIVE_EVIDENCE",severity:"REVIEW",category:h.kind,basis:"explicit-evidence",message:"Non-current injected adverse evidence requires human review; it is not treated as a current fact.",evidenceIds:[h.id]})):h.freshness==="CURRENT"&&h.verdict==="UNKNOWN"&&l.push(Tt({code:"SOURCE_UNKNOWN",severity:"UNKNOWN",category:h.kind,basis:"explicit-evidence",message:"A current injected source could not determine a disposition.",evidenceIds:[h.id]}));for(let h of u){let w=tN(c,h),A=w.filter(k=>k.freshness==="CURRENT"),_=A.filter(k=>k.verdict==="CLEAR"&&k.confidence>=i),S=A.filter(k=>k.verdict==="BLOCK");if(_.length>0&&S.length>0&&l.push(Tt({code:"CONTRADICTORY_EVIDENCE",severity:"REVIEW",category:h.kind,basis:"explicit-evidence",message:"Current injected sources conflict for a required check.",evidenceIds:[..._,...S].map(k=>k.id)})),_.length===0){let k=A.filter(g=>g.verdict==="CLEAR"),x=w.filter(g=>g.verdict==="CLEAR"&&g.freshness!=="CURRENT"),E=h.source?`${h.kind} from ${h.source}`:h.kind;l.push(Tt({code:k.length>0?"CLEAR_CONFIDENCE_TOO_LOW":x.length>0?"STALE_CLEAR_EVIDENCE":"MISSING_CURRENT_EVIDENCE",severity:"UNKNOWN",category:h.kind,basis:"coverage",message:`Required check ${E} lacks current explicit CLEAR evidence at the configured confidence threshold.`,evidenceIds:[...k,...x].map(g=>g.id)}))}}let d=ZC({target:o,knownContacts:e.knownContacts??[],expectedContact:e.expectedContact,observations:e.observations??[],dustThresholdBaseUnits:e.dustThresholdBaseUnits,lookalikeEdgeChars:e.lookalikeEdgeChars},{maxContacts:t.maxContacts,maxObservations:t.maxObservations});l.push(...d.findings);let f=ju(l),p=nN(f);p==="CLEAR"&&(f=ju([Tt({code:"REQUIRED_EVIDENCE_CURRENT_CLEAR",severity:"INFO",category:"coverage",basis:"explicit-evidence",message:"Every required injected check supplied current explicit CLEAR evidence; this is source-scoped and not a safety guarantee.",evidenceIds:c.filter(h=>h.freshness==="CURRENT"&&h.verdict==="CLEAR").map(h=>h.id)})]),p="CLEAR");let m={version:b0,target:o.key,evaluatedAt:n,decision:p,gate:p==="CLEAR"?"CONTINUE":p==="BLOCK"?"BLOCK":"HOLD",requiredChecks:u,evidenceIds:c.map(h=>h.id).sort(),findings:f},y=ye({...m,hash:I0(m)});return ye({version:b0,target:o,evaluatedAt:n,status:p,evidence:a,requiredChecks:u,poisoning:d,policy:y})}function rN(e={}){if(Nt(e),!e||typeof e!="object"||Array.isArray(e))throw new TypeError("safety-intelligence: transaction object required");qe(e,new Set(["target","to","destination","address","chain","chainId","family","network","amountBaseUnits","valueBaseUnits"]),"transaction");let t=Vt(e.target??{address:e.to??e.destination??e.address,chain:e.chain,chainId:e.chainId,family:e.family,network:e.network}),n=e.amountBaseUnits??e.valueBaseUnits,r=n==null?null:_s(n,"transaction amountBaseUnits"),o={target:t,amountBaseUnits:r};return ye({id:`safety-transaction:${Hu(Ct(o))}`,...o})}function _0(e={},t={}){if(Nt({input:e,options:t}),!e||typeof e!="object"||Array.isArray(e))throw new TypeError("safety-intelligence: transaction evaluation input object required");qe(e,new Set(["transaction","evidence","requiredChecks","knownContacts","expectedContact","observations","dustThresholdBaseUnits","lookalikeEdgeChars"]),"transaction evaluation input");let n=rN(e.transaction),r=zu({target:n.target,evidence:e.evidence??[],requiredChecks:e.requiredChecks,knownContacts:e.knownContacts??[],expectedContact:e.expectedContact,observations:e.observations??[],dustThresholdBaseUnits:e.dustThresholdBaseUnits,lookalikeEdgeChars:e.lookalikeEdgeChars},t),{hash:o,...i}=r.policy,s={...i,transactionId:n.id},a=ye({...s,hash:I0(s)});return ye({...r,transaction:n,policy:a})}var b0,X6,wC,EC,SC,vC,AC,Ro,xC,kC,IC,w0,_C,OC,TC,CC,NC,RC,PC,LC,$C,qC,BC,UC,E0,O0=O(()=>{b0=1,X6=Object.freeze({CLEAR:"CLEAR",UNKNOWN:"UNKNOWN",REVIEW:"REVIEW",BLOCK:"BLOCK"}),wC=Object.freeze(["sanctions","phishing","scam","address-poisoning"]),EC=Object.freeze(["sanctions","phishing","scam"]),SC=new Set(wC),vC=128,AC=256,Ro=512,xC=4096,kC=8,IC=2048,w0=366*24*60*60*1e3,_C=6e4,OC=yC(bC),TC=["privatekey","privkey","secretkey","secret","seedphrase","seed","mnemonic","passphrase","password","keystore","keymaterial","wif","xprv","xpriv","apikey","bearer","authorization","credential"],CC=/\b[5KL][1-9A-HJ-NP-Za-km-z]{50,51}\b/,NC=/\bxprv[0-9A-Za-z]{50,}\b/,RC=/^\s*(?:0x)?[0-9a-fA-F]{64}\s*$/,PC=new Set([12,15,18,21,24]),LC=/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d{3})?Z$/,$C=/^\d+$/,qC=String(Number.MAX_SAFE_INTEGER).length,BC=new Set(["txhash","transactionhash","recordid","hash","digest","evidenceid","sourcerecordid","blockhash","receipthash","commithash","payloadhash","sha256","sha256hex","id"]),UC=Object.freeze({CLEAR:"CLEAR",NO_MATCH:"CLEAR",NOT_LISTED:"CLEAR",ABSENT:"CLEAR",REVIEW:"REVIEW",SUSPECTED:"REVIEW",POSSIBLE_MATCH:"REVIEW",INCONCLUSIVE:"REVIEW",BLOCK:"BLOCK",MATCH:"BLOCK",LISTED:"BLOCK",MALICIOUS:"BLOCK",PHISHING:"BLOCK",SCAM:"BLOCK",UNKNOWN:"UNKNOWN",UNAVAILABLE:"UNKNOWN",ERROR:"UNKNOWN"}),E0=Object.freeze({BLOCK:0,REVIEW:1,UNKNOWN:2,INFO:3})});var Q6,Z6,eM,T0=O(()=>{Q6=Object.freeze(["chainId","agentAddress","accountAddress","actions","targets","maxValueWei","maxGasWei","maxSlippageBps","expiresAt","nonce","revocationKey"]),Z6=Object.freeze(["read","simulate"]),eM=1440*60});function C0(e){let t=String(e),n=t.toLowerCase().replace(/[\s._-]+/g,"");return oN.test(t)||iN.includes(n)}function Rn(e,t="$",n=new Set,r=""){if(e==null)return e;if(typeof e=="string"){let o=aN.includes(String(r).toLowerCase().replace(/[_-]/g,""));for(let{rule:i,re:s}of sN)if(!(o&&i.startsWith("raw-32-byte-hex"))&&s.test(e))throw new Po(t,i);return e}if(typeof e!="object"||n.has(e)||(n.add(e),ArrayBuffer.isView(e)||e instanceof ArrayBuffer))return e;if(e instanceof Map){for(let[o,i]of e.entries()){if(typeof o=="string"&&C0(o))throw new Po(`${t}[${JSON.stringify(o)}]`,"forbidden-key-name");Rn(o,`${t}[key]`,n),Rn(i,`${t}[${String(o)}]`,n)}return e}if(e instanceof Set){let o=0;for(let i of e.values())Rn(i,`${t}[${o++}]`,n);return e}if(Array.isArray(e))return e.forEach((o,i)=>Rn(o,`${t}[${i}]`,n)),e;for(let[o,i]of Object.entries(e)){if(C0(o))throw new Po(`${t}.${o}`,"forbidden-key-name");Rn(i,`${t}.${o}`,n,o)}return e}var Po,oN,iN,sN,aN,N0=O(()=>{T0();Po=class extends Error{constructor(t,n){super(`secret material must never appear in a public API object (at ${t}, rule: ${n})`),this.name="SecretLeakError",this.path=t,this.rule=n}},oN=/(private[_-]?key|secret|bearer|keystore|mnemonic|seed[_-]?phrase|passphrase|password|api[_-]?key|access[_-]?token|auth[_-]?token|session[_-]?token|signer[_-]?url|signature)/i,iN=Object.freeze(["privkey","wif","xprv","seed"]);sN=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}]),aN=Object.freeze(["grantid","id","hash","sha256","sha256hex","checksum","txhash","transactionhash","blockhash","digest","userophash","commithash","prevhash","intenthash","canonicalhash","payloadhash","requestid"])});import{createHash as cN}from"node:crypto";function Wu(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(Wu).join(",")}]`:`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${Wu(e[t])}`).join(",")}}`}function uN(e){return e===void 0?null:JSON.parse(JSON.stringify(e))}function Os(e){if(e&&typeof e=="object"&&!Object.isFrozen(e)){Object.freeze(e);for(let t of Object.values(e))Os(t)}return e}function Gu(e,t="fact"){try{Rn(e,t)}catch{throw new Error(`${t} contains custody material and is forbidden`)}}function L0(e){return cN("sha256").update(Wu(e)).digest("hex")}function $0({tradeId:e,state:t,fact:n,asOf:r,previousHash:o,external:i}){let s={tradeId:e,state:t,asOf:r,previousHash:o??null,external:i===!0,fact:uN(n)};return Os({...s,hash:L0(s)})}function Ts({tradeId:e,intent:t,asOf:n=0}={}){if(!e||typeof e!="string")throw new Error("tradeId is required");if(!t||typeof t!="object"||Array.isArray(t))throw new Error("intent fact is required");Gu(t,"intent");let r=$0({tradeId:e,state:"intent",fact:t,asOf:n,previousHash:null,external:!1});return Os({tradeId:e,state:"intent",events:[r],headHash:r.hash,custody:"none",execution:"prepare-only"})}function q0(e,t,n,r={}){if(Ku(e),!(R0[e.state]||[]).includes(t))throw new Error(`invalid trade transition ${e.state} -> ${t}`);if(!n||typeof n!="object"||Array.isArray(n))throw new Error(`${t} fact is required`);Gu(n,t);let i=r.external===!0||r.externallySupplied===!0;if(P0.has(t)&&!i)throw new Error(`${t} must be an externally supplied fact; this module never signs or broadcasts`);let s=e.events.at(-1),a=r.asOf??s.asOf;if(!Number.isFinite(Number(a))||Number(a)<Number(s.asOf))throw new Error("asOf must be finite and monotonic");let c=$0({tradeId:e.tradeId,state:t,fact:n,asOf:a,previousHash:s.hash,external:i});return Os({...e,state:t,events:[...e.events,c],headHash:c.hash})}function Ku(e){if(!e||!Array.isArray(e.events)||e.events.length===0)throw new Error("invalid trade lifecycle");if(e.custody!=="none")throw new Error("trade lifecycle custody must be none");if(e.execution!=="prepare-only")throw new Error("trade lifecycle execution must be prepare-only");let t=null;for(let n=0;n<e.events.length;n+=1){let r=e.events[n],{hash:o,...i}=r;if(L0(i)!==o)throw new Error(`trade event ${n} hash mismatch`);if(Gu(r.fact,`trade event ${n} fact`),!Number.isFinite(Number(r.asOf))||t&&Number(r.asOf)<Number(t.asOf))throw new Error(`trade event ${n} asOf must be finite and monotonic`);if(r.tradeId!==e.tradeId||r.previousHash!==t?.hash&&n>0)throw new Error(`trade event ${n} chain mismatch`);if(n===0&&(r.state!=="intent"||r.previousHash!==null))throw new Error("trade lifecycle must start with intent");if(t&&!R0[t.state]?.includes(r.state))throw new Error(`invalid recorded transition ${t.state} -> ${r.state}`);if(P0.has(r.state)&&r.external!==!0)throw new Error(`${r.state} is not externally supplied`);t=r}if(e.state!==t.state||e.headHash!==t.hash)throw new Error("trade lifecycle head mismatch");return!0}var Vu,R0,P0,Yu=O(()=>{N0();Vu=Object.freeze(["intent","quote_comparison","simulation","prepared","approval","signed","broadcast","settlement","balance_delta","position"]),R0=Object.freeze(Object.fromEntries(Vu.map((e,t)=>[e,Object.freeze(t+1<Vu.length?[Vu[t+1]]:[])]))),P0=new Set(["signed","broadcast"])});function B0(e){let t=String(e?.type??e?.surface??e?.kind??"").toLowerCase();return lN[t]??t}function dN(e,t){return String(e?.id??e?.signalId??e?.asset??e?.market??e?.pool??e?.collection??`${B0(e)}:${t}`)}function rt(e,t,n,r=!0){!r||n===null||!Number.isFinite(n)||e.push({feature:t,value:Cs(n)})}function pN(e,t){let n=He(e.repeatBuys??e.repeat_buys??e.buyCount),r=He(e.walletWinRate??e.winRate);rt(t,"repeat_buys",n===null?null:Oe((n-1)/4)*.38),rt(t,"wallet_win_rate",r===null?null:(Oe(r)-.5)*.5)}function fN(e,t){let n=He(e.ageHours??e.poolAgeHours),r=He(e.liquidityUsd??e.liquidity),o=e.liquidityLocked??e.locked;rt(t,"pool_age",n===null?null:n<24?-.42:Oe(n/720)*.12),rt(t,"liquidity",r===null?null:(Oe(Math.log10(Math.max(1,r))/7)-.5)*.28),rt(t,"liquidity_lock",o==null?null:o?.12:-.28)}function mN(e,t){let n=He(e.floorChange??e.floorChangePct),r=He(e.sales??e.saleCount);rt(t,"floor_change",n===null?null:Oe(n,-1,1)*.35),rt(t,"sales_depth",r===null?null:Oe(r/50)*.18)}function hN(e,t){let n=He(e.flowImbalance??e.imbalance),r=He(e.fundingRate??e.funding);rt(t,"flow_imbalance",n===null?null:Oe(n,-1,1)*.42),rt(t,"funding",r===null?null:-Oe(r*100,-1,1)*.12)}function yN(e,t){let n=He(e.marketProbability??e.marketPrice??e.probability),r=He(e.fairProbability??e.referenceProbability??e.fairValue);rt(t,"probability_mispricing",n===null||r===null?null:Oe(r-n,-1,1)*.65);let o=He(e.liquidityUsd??e.liquidity);rt(t,"market_liquidity",o===null?null:Oe(Math.log10(Math.max(1,o))/6)*.12)}function bN(e,t,n){let r=n.filter(i=>{let s=i?.signalId??i?.eventId??i?.id??i?.asset??i?.market;return s!=null&&String(s)===t});if(r.length===0)return null;let o=r.map(i=>He(i.return??i.markout??i.pnl??i.value)).filter(i=>i!==null);return o.length===0?null:o.reduce((i,s)=>i+s,0)/o.length}function Ns(e=[],t=[],n={}){if(!Array.isArray(e)||!Array.isArray(t))throw new TypeError("events and markouts must be arrays");let r=Oe(He(n.minimumCoverage)??.5);return e.map((o,i)=>{let s=B0(o),a=dN(o,i),c=gN[s],u=[];c&&c(o,u);let l=s==="wallet"?2:s==="pool"?3:2,d=Cs(Oe(u.length/l)),f=u.reduce((_,S)=>_+S.value,0),p=bN(o,a,t),m=p===null?0:Oe(p,-1,1)*.35;p!==null&&rt(u,"shadow_markout",m);let y=Cs(Oe(.5+f+m)),h=p===null?.8:Oe(.85+p*.3,.35,1),w=Cs(Oe(d*h)),A=["COLD_INTELLIGENCE_ONLY","NO_HOT_EXECUTION"];return c||A.push("UNSUPPORTED_SIGNAL_TYPE"),d<r&&A.push("LOW_COVERAGE","NO_TRADE"),w<.5&&A.push("LOW_CONFIDENCE","NO_TRADE"),s==="pool"&&(He(o.ageHours??o.poolAgeHours)??1/0)<24&&A.push("NEW_POOL_RISK","NO_TRADE"),p!==null&&p<0&&A.push("NEGATIVE_MARKOUT"),{id:a,type:s,score:y,confidence:w,coverage:d,contributions:u,flags:[...new Set(A)],noTrade:A.includes("NO_TRADE"),executionAllowed:!1}}).sort((o,i)=>i.score-o.score||i.confidence-o.confidence||o.id.localeCompare(i.id))}var fM,lN,Oe,He,Cs,gN,Xu=O(()=>{fM=Object.freeze(["wallet","pool","nft_floor","hl_flow","prediction_market"]),lN=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"}),Oe=(e,t=0,n=1)=>Math.min(n,Math.max(t,e)),He=e=>Number.isFinite(Number(e))?Number(e):null,Cs=e=>Math.round(e*1e4)/1e4;gN=Object.freeze({wallet:pN,pool:fN,nft_floor:mN,hl_flow:hN,prediction_market:yN})});function wN(e=[],t=[],n={}){let r=Ns(e,t,n),o=r.filter(a=>a&&a.noTrade!==!0&&a.executionAllowed===!1),i=r.filter(a=>a?.noTrade===!0),s=o.filter(a=>(a.confidence??0)>=(n.promoteMinConfidence??.55)&&(a.score??0)>=(n.promoteMinScore??.55));return{scored:r,candidates:s,blocked:i}}function EN(e,t={}){if(!e||typeof e!="object")throw new TypeError("signal required");if(e.noTrade===!0)throw new Error("NO_TRADE signal cannot open a trade lifecycle");if(e.executionAllowed===!0)throw new Error("executionAllowed must be false on public plane");let n=String(t.tradeId||`sig-${e.id||"unknown"}`).slice(0,128),r={source:"signal_score",signalId:e.id,signalType:e.type,score:e.score,confidence:e.confidence,flags:e.flags||[],promote:"research_only",execution:"prepare-only",custody:"none",note:"Cold signal \u2192 prepare intent only. Owner wallet must sign any later tx.",...t.intentExtra&&typeof t.intentExtra=="object"?t.intentExtra:{}},o=Ts({tradeId:n,intent:r,asOf:t.asOf??Date.now()});return{tradeId:n,intent:r,lifecycle:o,recommendation:"PREPARE_RESEARCH_ONLY"}}function U0(e=[],t=[],n={}){let{scored:r,candidates:o,blocked:i}=wN(e,t,n),s=Math.min(Math.max(Number(n.limit)||3,0),20),a=[];for(let c of o.slice(0,s))try{a.push(EN(c,{asOf:n.asOf,tradeId:n.tradeIdPrefix?`${n.tradeIdPrefix}-${c.id}`:void 0,intentExtra:n.intentExtra}))}catch{}return{ok:!0,cold:!0,executionAllowed:!1,scoredCount:r.length,blockedCount:i.length,intentCount:a.length,intents:a,blocked:i.slice(0,20)}}var M0=O(()=>{Xu();Yu()});function D0(e){let t=vN[Number(e)]||[];return new Set([...t,...SN].map(n=>String(n).trim().toLowerCase()).filter(Boolean))}var SN,vN,F0=O(()=>{SN=["0x000000000022d473030f116ddee9f6b43ac78ba3"],vN={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 Rs(e,t={}){e&&e.passes.push({ok:!0,kind:t.kind||"gather",name:t.name||null})}function Ju(e){e&&(e.prepareAttempted=!0)}function Qu(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 IN(e,t=process.env){let n=t&&typeof t=="object"?t:process.env,r=String(n.ORACLE_DEST_ALLOWLIST||n.MAD_DEST_ALLOWLIST||"").split(",").map(s=>s.trim().toLowerCase()).filter(Boolean),o=Number(e),i=Number.isInteger(o)&&o>0?[...D0(o)]:[];return new Set([...r,...i])}function _N(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 ON(e){return!e||typeof e!="object"?!1:!!(e.transaction||e.tx||e.to||e.destination||e.settlement||e.data||e.value!=null)}function TN(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 CN(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 NN(e,t={}){let n=[],r={unsigned:!1,destination:"n/a",slippage:"n/a"};if(!e||typeof e!="object"||Array.isArray(e))return{ok:!1,checks:r,errors:["prepared fact must be an object"]};e.signed===!0&&n.push("prepared fact is signed"),e.broadcast===!0&&n.push("prepared fact claims broadcast");for(let o of AN)e[o]&&n.push(`prepared fact carries ${o}`);for(let o of xN)e[o]&&n.push(`prepared fact claims executed ${o}`);if(r.unsigned=n.length===0,ON(e)){let o=TN(e),i=o.to==null?"":String(o.to).trim();if(!i)n.push("prepared transaction is missing destination"),r.destination="missing";else{let s=kN.test(i);if(i.startsWith("0x")&&!s)n.push("prepared destination is not a 20-byte address"),r.destination="malformed";else{let a=IN(o.chainId,t.env),c=i.toLowerCase(),u=!!(e.routeAttestation||e.madRoute||e.vaultGuard||e.madVault);a.size>0&&s&&!a.has(c)&&!u?(n.push(`destination ${c} not allowlisted`),r.destination="blocked"):r.destination=a.size===0?"unset":"allowlisted"}}}if(_N(e)){let o=CN(e),i=e.slippageGuard?.capBps!=null?Number(e.slippageGuard.capBps):Lt;!Number.isInteger(o)||o<0?(n.push("swap prepare is missing integer slippage bps"),r.slippage="missing"):o>Lt||Number.isInteger(i)&&o>i||Number.isInteger(i)&&i>Lt?(n.push(`slippage ${o} exceeds cap ${Math.min(i,Lt)}`),r.slippage="blocked"):r.slippage="ok"}return{ok:n.length===0,checks:r,errors:n}}function Zu(e,t){let n=[];e?.execution!=="prepare-only"&&n.push("lifecycle execution must be prepare-only"),e?.custody!=="none"&&n.push("lifecycle custody must be none");let r=NN(t);return{ok:n.length===0&&r.ok,checks:r.checks,errors:[...n,...r.errors]}}var AN,xN,kN,j0=O(()=>{F0();st();AN=Object.freeze(["signature","signedTx","signedTransaction","rawTransaction","signedPayload","signedRaw"]),xN=Object.freeze(["txid","txHash","transactionHash","broadcastHash"]),kN=/^0x[a-fA-F0-9]{40}$/});var z0={};z(z0,{DESK_TOOLS:()=>PN,runDeskTool:()=>$N});function LN(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")>RN)throw new TypeError("tool arguments exceed size limit")}function Be(e,t,n=[]){for(let o of t)if(!(o in e))throw new TypeError(`${o} is required`);let r=new Set([...t,...n]);for(let o of Object.keys(e))if(!r.has(o))throw new TypeError(`unexpected argument: ${o}`)}async function $N(e,t,n={}){if(LN(t),e==="research_artifact"){if(Be(t,["sourceUrl","fetchedAt","snapshot","claim","confidence"],["contradictions"]),String(t.snapshot).length>H0)throw new TypeError("snapshot exceeds size limit");return{ok:!0,artifact:(n.createResearchArtifact||Bg)(t)}}if(e==="portfolio_analyze")return Be(t,["ledger","asOf"],["priceTtlMs"]),{ok:!0,analysis:(n.summarizePortfolioLedger||Vg)(t.ledger,{asOf:t.asOf,priceTtlMs:t.priceTtlMs})};if(e==="tax_lots")return Be(t,["input"],["method","asOf"]),{ok:!0,records:(n.createCostBasisRecords||Qg)(t.input,{method:t.method,asOf:t.asOf})};if(e==="position_health"){Be(t,["action","input","asOf"],["thresholds"]);let r={asOf:t.asOf,thresholds:t.thresholds};if(t.action==="evaluate")return{ok:!0,analysis:(n.evaluatePositionHealth||Mu)(t.input,r)};if(t.action==="book")return{ok:!0,analysis:(n.evaluatePositionBook||f0)(t.input,r)};throw new TypeError("unknown position health action")}if(e==="governance_prepare")return Be(t,["input","asOf"]),{ok:!0,preview:(n.previewGovernanceAction||h0)(t.input,{asOf:t.asOf}),prepared:!1};if(e==="safety_intelligence"){Be(t,["action","input","asOf"],["minClearConfidence","minBlockConfidence"]);let r={asOf:t.asOf,minClearConfidence:t.minClearConfidence,minBlockConfidence:t.minBlockConfidence};if(t.action==="address")return{ok:!0,analysis:(n.evaluateAddressSafety||zu)(t.input,r)};if(t.action==="transaction")return{ok:!0,analysis:(n.evaluateTransactionSafety||_0)(t.input,r)};throw new TypeError("unknown safety intelligence action")}if(e==="portfolio_risk")return Be(t,["input"]),{ok:!0,analysis:(n.summarizePortfolioRisk||Es)(t.input)};if(e==="trade_lifecycle"){let r=n.createTradeLifecycle||Ts,o=n.advanceTradeLifecycle||q0,i=n.assertTradeLifecycle||Ku;if(t.action==="create")return Be(t,["action","tradeId","intent"],["asOf"]),{ok:!0,lifecycle:r({tradeId:t.tradeId,intent:t.intent,asOf:t.asOf})};if(t.action==="verify"){if(Be(t,["action","lifecycle"]),i(t.lifecycle),t.lifecycle.state==="prepared"){Ju(n.loopVerifier);let s=t.lifecycle.events?.findLast?.(c=>c.state==="prepared")||t.lifecycle.events?.filter(c=>c.state==="prepared").at(-1),a=Zu(t.lifecycle,s?.fact||{});if(!a.ok)return Qu(n.loopVerifier,{name:"trade_lifecycle",error:a.errors[0]}),{ok:!1,error:`prepare verifier failed: ${a.errors[0]}`,checks:a.checks};Rs(n.loopVerifier,{kind:"prepare",name:"trade_lifecycle"})}else Rs(n.loopVerifier,{kind:"lifecycle",name:"trade_lifecycle"});return{ok:!0,valid:!0,lifecycle:t.lifecycle}}if(t.action==="advance"){if(Be(t,["action","lifecycle","state","fact"],["asOf"]),t.state==="signed"||t.state==="broadcast")throw new TypeError(`${t.state} facts are not accepted by the agent tool`);if(t.state==="prepared"){Ju(n.loopVerifier);let a=Zu(t.lifecycle,t.fact);if(!a.ok)return Qu(n.loopVerifier,{name:"trade_lifecycle",error:a.errors[0]}),{ok:!1,error:`prepare verifier failed: ${a.errors[0]}`,checks:a.checks}}let s=o(t.lifecycle,t.state,t.fact,{asOf:t.asOf});return t.state==="prepared"&&Rs(n.loopVerifier,{kind:"prepare",name:"trade_lifecycle"}),{ok:!0,lifecycle:s}}throw new TypeError("unknown trade lifecycle action")}if(e==="signal_score"){if(Be(t,["events"],["markouts","openIntents","limit"]),!Array.isArray(t.events))throw new TypeError("events must be an array");let r=Array.isArray(t.markouts)?t.markouts:[];if(t.openIntents===!0)return(n.signalsToPrepareIntents||U0)(t.events,r,{limit:t.limit});let i=(n.scoreSignals||Ns)(t.events,r);return{ok:!0,cold:!0,executionAllowed:!1,scored:i,noTradeCount:i.filter(s=>s.noTrade).length}}if(e==="workspace_artifact"){let r=n.openArtifactStore||Rg,o=!n.artifactStore,i=n.artifactStore||await r(n.artifactStoreOptions||{});try{if(t.action==="get")return Be(t,["action","id"]),{ok:!0,artifact:await i.getArtifact(t.id)};if(t.action==="list")return Be(t,["action"],["type"]),{ok:!0,artifacts:await i.listArtifacts(t.type)};if(t.action==="put")return Be(t,["action","id","type","data","createdAt"]),{ok:!0,artifact:await i.putArtifact(t)};if(t.action==="link")return Be(t,["action","parentId","childId"]),{ok:!0,link:await i.link(t.parentId,t.childId)};throw new TypeError("unknown workspace artifact action")}finally{o&&typeof i?.close=="function"&&await i.close()}}return{ok:!1,error:`unknown desk tool: ${e}`}}var RN,H0,Ps,Ze,Rt,PN,V0=O(()=>{Pg();Ug();Wg();Lu();Zg();m0();y0();O0();Yu();Xu();M0();j0();RN=128*1024,H0=5e4,Ps={type:"string",minLength:1,maxLength:256},Ze={type:"object",additionalProperties:!0},Rt=(e,t,n)=>Object.freeze({type:"function",function:Object.freeze({name:e,description:t,strict:!0,parameters:n})}),PN=Object.freeze([Rt("workspace_artifact","Get, list, put, or link deterministic workspace artifacts. No arbitrary paths or SQL.",{type:"object",properties:{action:{type:"string",enum:["get","list","put","link"]},id:Ps,type:{type:"string",enum:["project","entity","source","thesis","strategy","simulation","prepared_action","receipt","position"]},createdAt:{type:"string",minLength:1,maxLength:64},data:Ze,parentId:Ps,childId:Ps},required:["action"],additionalProperties:!1}),Rt("research_artifact","Create a deterministic, citation-bearing research artifact. fetchedAt must be supplied by the caller.",{type:"object",properties:{sourceUrl:{type:"string",minLength:1,maxLength:4096},fetchedAt:{type:"string",minLength:1,maxLength:64},snapshot:{type:"string",minLength:1,maxLength:H0},claim:{type:"string",minLength:1,maxLength:1e4},confidence:{type:"number",minimum:0,maximum:1},contradictions:{type:"array",maxItems:50,items:{type:"string",maxLength:2e3}}},required:["sourceUrl","fetchedAt","snapshot","claim","confidence"],additionalProperties:!1}),Rt("portfolio_analyze","Deterministically summarize a caller-supplied portfolio ledger; performs no network or account access.",{type:"object",properties:{ledger:Ze,asOf:{type:"number"},priceTtlMs:{type:"number",minimum:0}},required:["ledger","asOf"],additionalProperties:!1}),Rt("tax_lots","Build exact-integer cost-basis records from caller-supplied events. Accounting records only, not tax advice.",{type:"object",properties:{input:Ze,method:{type:"string",enum:["fifo","lifo","hifo","specific"]},asOf:{type:"string",minLength:1}},required:["input"],additionalProperties:!1}),Rt("position_health","Evaluate caller-supplied lending or farming snapshots. Alert-only, with no network access or execution signal.",{type:"object",properties:{action:{type:"string",enum:["evaluate","book"]},input:Ze,asOf:{type:"string",minLength:1},thresholds:Ze},required:["action","input","asOf"],additionalProperties:!1}),Rt("governance_prepare","Create a deterministic semantic preview of a caller-supplied governance intent. No adapter, calldata, vote, signature, or broadcast.",{type:"object",properties:{input:Ze,asOf:{type:"string",minLength:1}},required:["input","asOf"],additionalProperties:!1}),Rt("safety_intelligence","Evaluate caller-supplied address or transaction safety evidence. No source is contacted and unknown evidence fails closed.",{type:"object",properties:{action:{type:"string",enum:["address","transaction"]},input:Ze,asOf:{type:"string",minLength:1},minClearConfidence:{type:"number",minimum:0,maximum:1},minBlockConfidence:{type:"number",minimum:0,maximum:1}},required:["action","input","asOf"],additionalProperties:!1}),Rt("portfolio_risk","Summarize concentration and coverage from caller-supplied portfolio snapshots. No network or account access.",{type:"object",properties:{input:Ze},required:["input"],additionalProperties:!1}),Rt("trade_lifecycle","Create, verify, or advance a prepare-only trade fact chain. A request is not a record: observed status is NONE until create returns an explicit INTENT event. Proposed next work never advances current state. Signing and broadcasting are never performed.",{type:"object",properties:{action:{type:"string",enum:["create","verify","advance"]},tradeId:Ps,intent:Ze,lifecycle:Ze,state:{type:"string",enum:["quote_comparison","simulation","prepared","approval","settlement","balance_delta","position"]},fact:Ze,asOf:{type:"number"}},required:["action"],additionalProperties:!1}),Rt("signal_score","Cold-score onchain signal events (wallet/pool/nft/hl/prediction). Never fetches or executes. NO_TRADE flags block promotion.",{type:"object",properties:{events:{type:"array",maxItems:100,items:Ze},markouts:{type:"array",maxItems:100,items:Ze},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 W0={};z(W0,{deployGloballyEnabled:()=>BN,executeGloballyEnabled:()=>qN,mevExecuteEnabled:()=>UN});function qN(){return Lo("ORACLE_EXECUTE_ENABLED","MAD_EXECUTE_ENABLED",!1)}function BN(){return Lo("ORACLE_DEPLOY_ENABLED","MAD_DEPLOY_ENABLED",!1)}function UN(){return Lo("ORACLE_MEV_EXECUTE_ENABLED",null,!1)}var G0=O(()=>{$o()});$o();import K0 from"node:fs";import el from"node:process";import{fileURLToPath as MN}from"node:url";import{createInterface as ub}from"node:readline";var yt=Object.freeze({maxRequestBytes:256*1024,maxResponseBytes:2*1024*1024,maxTools:256,maxToolNameLength:64,maxArgumentBytes:128*1024,defaultCallTimeoutMs:3e4,maxCallTimeoutMs:6e4,maxConcurrentCalls:32}),lb=/^[A-Za-z0-9_-]{1,64}$/;function qo(e,t){return{jsonrpc:"2.0",id:e??null,result:t}}function Ae(e,t,n){return{jsonrpc:"2.0",id:e??null,error:{code:t,message:n}}}function db(e){return!!(e&&typeof e=="object"&&!Array.isArray(e)&&e.jsonrpc==="2.0"&&typeof e.method=="string"&&e.method.length>0)}function pb(e){if(!Array.isArray(e))return[];let t=[],n=new Set;for(let r of e){if(t.length>=yt.maxTools)break;if(!r||typeof r!="object"||Array.isArray(r))continue;let o=typeof r.name=="string"?r.name.trim():"";if(!lb.test(o)||n.has(o))continue;n.add(o);let i=r.inputSchema&&typeof r.inputSchema=="object"&&!Array.isArray(r.inputSchema)?{...r.inputSchema}:{type:"object",properties:{},additionalProperties:!1};i.type==="object"&&i.additionalProperties===void 0&&(i.additionalProperties=!1),t.push({...r,name:o,inputSchema:i})}return t}function fb(e){let t=Number(e)||yt.defaultCallTimeoutMs;return Math.min(Math.max(t,1),yt.maxCallTimeoutMs)}async function mb(e,t,n){let r;try{return await Promise.race([e,new Promise((o,i)=>{r=setTimeout(()=>{let s=new Error("tool call timed out");s.code="ORACLE_MCP_TIMEOUT",i(s);try{n?.()}catch{}},t)})])}finally{clearTimeout(r)}}function hb(e){return e===null?"null":Array.isArray(e)?"array":Number.isInteger(e)?"integer":typeof e}function vr(e,t,n="arguments",r=0){if(!t||typeof t!="object"||Array.isArray(t))return null;if(r>12)return`${n} exceeded the nesting limit`;if(Array.isArray(t.oneOf)&&t.oneOf.length&&!t.oneOf.some(i=>vr(e,i,n,r+1)===null))return`${n} did not match an allowed shape`;if(Array.isArray(t.anyOf)&&t.anyOf.length&&!t.anyOf.some(i=>vr(e,i,n,r+1)===null))return`${n} did not match a required alternative`;if(Array.isArray(t.enum)&&!t.enum.some(o=>Object.is(o,e)))return`${n} must be one of the allowed values`;if(Object.hasOwn(t,"const")&&!Object.is(t.const,e))return`${n} must equal the required constant`;if(t.type){let o=hb(e);if(!(t.type==="number"?typeof e=="number"&&Number.isFinite(e):t.type==="integer"?Number.isSafeInteger(e):o===t.type))return`${n} must be ${t.type}`}if(typeof e=="string"){let o=Math.min(Number.isSafeInteger(t.maxLength)?t.maxLength:16384,16384);if(e.length>o)return`${n} exceeded the string limit`;if(Number.isSafeInteger(t.minLength)&&e.length<t.minLength)return`${n} is too short`}if(Array.isArray(e)){let o=Math.min(Number.isSafeInteger(t.maxItems)?t.maxItems:1e3,1e3);if(e.length>o)return`${n} exceeded the array limit`;if(Number.isSafeInteger(t.minItems)&&e.length<t.minItems)return`${n} has too few items`;if(t.items)for(let i=0;i<e.length;i+=1){let s=vr(e[i],t.items,`${n}[${i}]`,r+1);if(s)return s}}if(e&&typeof e=="object"&&!Array.isArray(e)){let o=Object.keys(e);if(o.length>256)return`${n} exceeded the property limit`;let i=t.properties&&typeof t.properties=="object"?t.properties:{};for(let s of Array.isArray(t.required)?t.required:[])if(!Object.hasOwn(e,s))return`${n}.${s} is required`;if(t.additionalProperties===!1){let s=o.find(a=>!Object.hasOwn(i,a));if(s)return`${n}.${s} is not allowed`}for(let s of o){if(!Object.hasOwn(i,s))continue;let a=vr(e[s],i[s],`${n}.${s}`,r+1);if(a)return a}}return null}function Bo(e,t={}){let n=pb(e?.tools),r=new Set(n.map(u=>u.name)),o=new Map(n.map(u=>[u.name,u])),i=typeof e?.name=="string"&&e.name?e.name.slice(0,80):"oracle-mcp",s=typeof e?.version=="string"&&e.version?e.version.slice(0,40):"1",a=fb(t.callTimeoutMs),c=!1;return async function(l){let d=l?.id??null;if(!db(l))return Ae(d,-32600,"invalid request");if(l.method==="initialize")return c=!0,qo(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 qo(d,{});if(!c)return Ae(d,-32002,"server not initialized");if(l.method==="tools/list")return qo(d,{tools:n});if(l.method==="tools/call"){let f=l.params?.name,p=l.params?.arguments??{};if(typeof f!="string"||!r.has(f))return Ae(d,-32602,"unknown tool");if(!p||typeof p!="object"||Array.isArray(p))return Ae(d,-32602,"tool arguments must be an object");let m;try{m=JSON.stringify(p)}catch{return Ae(d,-32602,"tool arguments are not serializable")}if(Buffer.byteLength(m)>yt.maxArgumentBytes)return Ae(d,-32602,"tool arguments exceeded the size limit");let y=vr(p,o.get(f)?.inputSchema);if(y)return Ae(d,-32602,y);try{let h=new AbortController,w=await mb(Promise.resolve(e.call(f,p,{signal:h.signal})),a,()=>h.abort(new Error("tool call timed out")));return qo(d,w)}catch(h){if(h?.code==="ORACLE_MCP_TIMEOUT")return Ae(d,-32001,"tool call timed out");let w=typeof h?.message=="string"?h.message.replace(/\s+/g," ").trim():"",A=/\b(requires?|must be|missing|unknown|invalid|expected|unsupported|out of range|too (?:large|small|long|many)|not a|cannot convert)\b/i.test(w),_=/https?:\/\/|[/~][\w.-]+\/|0x[0-9a-fA-F]{8,}|[A-Za-z0-9+/_-]{24,}={0,2}|\b(?:secret|apikey|api[-_ ]key|private[-_ ]?key|token|password|credential|seed|mnemonic)s?\b/i.test(w.replace(/\btoken(?:In|Out|s\b)/g,"asset"));return A&&!_&&w.length<=200?Ae(d,-32e3,`tool call failed: ${w}`):Ae(d,-32e3,"tool call failed")}}return Ae(d,-32601,"method not found")}}function js(e,t={}){let n=t.input||process.stdin,r=t.output||process.stdout,o=Math.min(Math.max(Number(t.maxRequestBytes)||yt.maxRequestBytes,64),yt.maxRequestBytes),i=Math.min(Math.max(Number(t.maxResponseBytes)||yt.maxResponseBytes,256),yt.maxResponseBytes),s=Math.min(Math.max(Number(t.maxConcurrentCalls)||yt.maxConcurrentCalls,1),yt.maxConcurrentCalls),a=s*8,c=Bo(e,t),u={closed:!1,inflight:0},l=ub({input:n,terminal:!1,crlfDelay:1/0}),d=0,f=[],p=!1,m=!1;function y(){if(u.closed||u.readerClosed)return;let S=u.inflight>=s||f.length>0||m;S&&!p?(p=!0,l.pause(),typeof n.pause=="function"&&n.pause()):!S&&p&&(p=!1,typeof n.resume=="function"&&n.resume(),l.resume())}function h(S){if(!S||u.closed)return;let k=JSON.stringify(S);Buffer.byteLength(k)>i&&(k=JSON.stringify(Ae(S.id,-32003,"response exceeded the size limit"))),r.write(`${k}
24
+ `)===!1&&!m&&(m=!0,y(),r.once("drain",()=>{m=!1,A()}))}function w(S){u.inflight+=1,y(),Promise.resolve(c(S)).then(h).catch(()=>h(Ae(S?.id,-32603,"internal error"))).finally(()=>{u.inflight-=1,A()})}function A(){for(;!u.closed&&!m&&u.inflight<s&&f.length>0;)w(f.shift());y()}function _(){u.closed||(h(Ae(null,-32700,"request exceeded the size limit")),u.closed=!0,l.close(),typeof n.destroy=="function"&&n.destroy())}return n.on("data",S=>{if(u.closed)return;let k=String(S).split(`
25
+ `);for(let x=0;x<k.length;x+=1){if(d+=Buffer.byteLength(k[x]),d>o){_();return}x<k.length-1&&(d=0)}}),l.on("line",S=>{if(u.closed)return;if(Buffer.byteLength(S)>o){_();return}let k;try{k=JSON.parse(S)}catch{h(Ae(null,-32700,"parse error"));return}if(f.length>=a){h(Ae(k?.id,-32e3,"server busy"));return}f.push(k),A()}),l.on("close",()=>{u.readerClosed=!0,t.exitOnClose!==!1&&(process.exitCode=0)}),u}var ll=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"}}),yb=Object.freeze({best_swap_route:"swap",prepare_best_route:"swap",dex_quote:"swap",jupiter_quote:"swap",lifi_quote:"bridge",best_bridge_route:"bridge",bridge_aggregator_scan:"bridge",prepare_best_bridge_route:"bridge",rfq_quote:"quote",equity_quote:"quote",twap_simulate:"quote",portfolio_balance:"portfolio",portfolio_snapshot:"portfolio",wallet_balances:"portfolio",nft_pnl:"nft",nft_trait_snipe:"nft",satflow_floors:"nft"});function Kt(e){return String(e??"").replaceAll("&","&amp;").replaceAll("<","&lt;").replaceAll(">","&gt;").replaceAll('"',"&quot;")}function ze(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 n=String(e);if(/^\d{7,}$/.test(n)){let r=Number(t);if(Number.isFinite(r)&&r>0&&r<=36){let o=Number(n)/10**r;if(Number.isFinite(o))return ze(o)}return`${n} raw`}return ze(e)}var gb=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 bb(e,t){let n=Number(t);return t!=null&&Number.isFinite(n)?n:gb[String(e||"").toUpperCase()]}function dl(e,t){let n=t&&typeof t=="object"?t:{},r=n.result&&typeof n.result=="object"?n.result:n,o=r;if(r.estimate&&typeof r.estimate=="object"){let c=r.estimate,u=(c.gasCosts||[]).reduce((d,f)=>d+(Number(f.amountUSD)||0),0)||null,l=(c.feeCosts||[]).reduce((d,f)=>d+(Number(f.amountUSD)||0),0)||null;o={best:{provider:r.tool||r.toolDetails?.name||"lifi",amountOut:c.toAmount,minOut:c.toAmountMin,gasUsd:u,feeUsd:l,decimalsOut:r.action?.toToken?.decimals},tokenIn:r.action?.fromToken?.symbol,tokenOut:r.action?.toToken?.symbol}}let i=[],s=(c,u,l={})=>{u==null||u===""||i.push({label:c,value:String(u),...l})},a=o.best||o.winner||o.topRoute||null;if(e==="swap"||e==="bridge"||e==="quote"){let c=a||o,u=bb(o.tokenOut??o.buyToken,o.tokenOutDecimals??o.decimalsOut??c.tokenOutDecimals??c.decimalsOut);s("ROUTE",c.provider||c.venue||c.source||c.aggregator),o.tokenIn&&o.tokenOut&&s("PAIR",`${o.tokenIn} \u2192 ${o.tokenOut}`);let l=c.netOut??c.netOutput??c.amountOutNet??c.toAmountNet,d=c.amountOut??c.outAmount??c.toAmount??c.expectedOut,f=Ar(l,u);s(f!=null?"NET OUT":"EST OUT (GROSS)",f??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",`$${ze(c.gasUsd)}`):c.feeUsd!==void 0&&c.feeUsd!==null?s("GAS+FEES",`$${ze(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 w=Number(d),A=Number(m);Number.isFinite(w)&&Number.isFinite(A)&&w>0&&A>0&&A<=w&&s("SLIPPAGE",`${((1-A/w)*1e4).toFixed(0)} bps max`)}let y=c.meta?.fee??c.poolFee;y!=null&&s("POOL FEE",`${Number(y)/100} bps`),c.liquidityUsd!==void 0&&c.liquidityUsd!==null&&s("LIQUIDITY",`$${ze(c.liquidityUsd)}`),o.rankedOn&&s("RANKED ON",String(o.rankedOn).toUpperCase(),{warn:String(o.rankedOn)==="gross"});let h=Array.isArray(o.ranked)?o.ranked.slice(1,4):Array.isArray(o.routes)?o.routes.filter(w=>w!==a).slice(0,3):[];for(let w of h){let A=w?.provider||w?.venue||w?.source,_=Ar(w?.netOut??w?.amountOut??w?.toAmount,u);A&&_&&s(`vs ${A}`,_,{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?`$${ze(u)}`:null,{hero:!0});let l=Array.isArray(o.chains)?o.chains:null;if(s("CHAINS",l?l.length:o.chainCount),s("TOKENS",Array.isArray(o.tokens)?o.tokens.length:o.tokenCount),s("NFTS",Array.isArray(o.nfts)?o.nfts.length:o.nftCount),l){let p=l.filter(m=>Number.isFinite(Number(m?.knownUsd))&&Number(m.knownUsd)>0).sort((m,y)=>Number(y.knownUsd)-Number(m.knownUsd)).slice(0,3);for(let m of p)s(String(m.name||m.family||m.chainId),`$${ze(m.knownUsd)}`,{dim:!0})}let d=o.avgEntryUsd??o.avgCostUsd;if(d!==void 0)s("AVG ENTRY",`$${ze(d)}`);else if(Array.isArray(o.tokens)){let p=o.tokens.map(m=>Number(m?.avgEntryUsd??m?.avgCostUsd??m?.costBasisUsd)).filter(m=>Number.isFinite(m)&&m>0);if(p.length>0){let m=p.reduce((y,h)=>y+h,0)/p.length;s("AVG ENTRY",`$${ze(m)} \xB7 ${p.length} coins`)}}let f=o.coverage;f&&typeof f=="object"?(Number(f.unavailable)||0)+(Number(f.notConfigured)||0)>0&&s("COVERAGE",`${f.ok??0}/${f.requestedSurfaces??"?"} SURFACES`,{warn:!0}):(o.incomplete||o.partial)&&s("COVERAGE","INCOMPLETE",{warn:!0})}else if(e==="nft"){s("COLLECTION",o.collection||o.slug||o.name),s("FLOOR",o.floor??o.floorEth??o.floorPrice,{hero:!0}),s("PNL",o.pnlUsd!==void 0?`$${ze(o.pnlUsd)}`:null);let c=o.avgBuy??o.avgBuyEth??o.avgCostEth??o.avgPurchase;if(c!==void 0)s("AVG BUY",ze(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",`${ze(u.reduce((l,d)=>l+d,0)/u.length)} \xB7 ${u.length} buys`)}s("OWNERS",ze(o.owners??o.numOwners))}return i}function wb(e,t,n){let r=ll[e]||ll.generic,o=dl(e,n),i=o.find(u=>u.hero),s=o.filter(u=>!u.hero),a=Kt(JSON.stringify(n,null,2)).slice(0,2e4),c=s.map(u=>`<div class="row${u.dim?" dim":""}${u.warn?" warn":""}"><span>${Kt(u.label)}</span><b>${Kt(u.value)}</b></div>`).join("");return`<!doctype html><html><head><meta charset="utf-8"><style>
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}
@@ -34,8 +34,8 @@ body{background:transparent;font-family:ui-monospace,SFMono-Regular,Menlo,monosp
34
34
  .live .card{animation:in .45s cubic-bezier(.2,.9,.3,1.2) both}
35
35
  @keyframes in{from{opacity:0;transform:translateY(14px) scale(.97)}to{opacity:1;transform:none}}
36
36
  .head{display:flex;align-items:center;gap:10px;margin-bottom:12px}
37
- .globe{width:22px;height:22px;border-radius:50%;border:2px solid ${n.accent};position:relative;flex:none}
38
- .globe::after{content:"";position:absolute;inset:4px;border-radius:50%;background:${n.accent};opacity:.85}
37
+ .globe{width:22px;height:22px;border-radius:50%;border:2px solid ${r.accent};position:relative;flex:none}
38
+ .globe::after{content:"";position:absolute;inset:4px;border-radius:50%;background:${r.accent};opacity:.85}
39
39
  .live .globe::after{animation:pulse 2.4s ease-in-out infinite}
40
40
  @keyframes pulse{0%,100%{transform:scale(1);opacity:.85}50%{transform:scale(.7);opacity:.5}}
41
41
  .brand{font-size:15px;letter-spacing:.14em;color:#A7D8FF;font-family:Georgia,serif}
@@ -58,10 +58,10 @@ summary::before{content:"\u25B8 "}details[open] summary::before{content:"\u25BE
58
58
  pre{margin-top:8px;font-size:10px;color:#9FB8D2;max-height:260px;overflow:auto;white-space:pre-wrap;word-break:break-all}
59
59
  .card:active{transform:scale(.985);transition:transform .1s}
60
60
  </style></head><body><div class="card">
61
- <div class="head"><div class="globe"></div><span class="brand">ORACLE</span><span class="kind">${zt(n.title)}</span></div>
62
- ${i?`<div class="hero">${zt(i.value)}</div><div class="herolabel">${zt(i.label)}</div>`:""}
61
+ <div class="head"><div class="globe"></div><span class="brand">ORACLE</span><span class="kind">${Kt(r.title)}</span></div>
62
+ ${i?`<div class="hero">${Kt(i.value)}</div><div class="herolabel">${Kt(i.label)}</div>`:""}
63
63
  ${c}
64
- <details><summary>details \xB7 ${zt(t)}</summary><pre>${a}</pre></details>
65
- <div class="foot"><span>${zt(t)}</span><span class="tag">THE FUTURE IS AGENTIC</span></div>
66
- </div><script>document.documentElement.classList.add("live")</script></body></html>`}function Bu(e,t){let r=ig[e];if(!r||!t||typeof t!="object"||t.error||t.ok===!1||!Lu(r,t).some(i=>i.hero))return null;let o=cg(r,e,t);return{type:"resource",resource:{uri:`ui://oracle/card/${e}/${Date.now().toString(36)}`,mimeType:"text/html",text:o}}}import Vt from"node:fs";import ug from"node:os";import vr from"node:path";import lg from"node:crypto";var dg=48e3,Uu=4e3,pg=1440*60*1e3,fg=8e3,mg=1e6;function hg(e=process.env.ORACLE_MCP_SPILL_BYTES){let t=Number(e);return!Number.isFinite(t)||t<=0?dg:Math.min(Math.max(Math.floor(t),fg),mg)}function Ss(e=process.env.ORACLE_MCP_SPILL_DIR){if(typeof e=="string"&&e.trim())return vr.resolve(e.trim());let t=process.env.XDG_STATE_HOME&&process.env.XDG_STATE_HOME.trim()?process.env.XDG_STATE_HOME.trim():vr.join(ug.homedir(),".local","state");return vr.join(t,"oracle","mcp-spill")}function Du(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 yg(e){try{let t=Date.now();for(let r of Vt.readdirSync(e)){if(!r.endsWith(".json"))continue;let n=vr.join(e,r);try{t-Vt.statSync(n).mtimeMs>pg&&Vt.unlinkSync(n)}catch{}}}catch{}}function Mu(e,t,r,n={}){let o=n.thresholdBytes??hg(),i=Buffer.byteLength(t,"utf8");if(i<=o)return null;try{let s=n.dir??Ss();Vt.mkdirSync(s,{recursive:!0,mode:448}),yg(s);let a=new Date().toISOString().replace(/[:.]/g,"-"),c=lg.randomBytes(4).toString("hex"),u=String(e).replace(/[^A-Za-z0-9_-]/g,"_").slice(0,64)||"tool",l=vr.join(s,`${a}_${u}_${c}.json`);Vt.writeFileSync(l,t,{mode:384});let d=t.slice(0,Uu),p=Du(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(Uu,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 Ar=new Map;function Fu(e){return vr.join(e??Ss(),"observed-shapes.json")}function ju(e,t,r={}){try{let n=Du(t);if(Ar.set(String(e),{shape:n,observedAtMs:Date.now()}),Ar.size>512){let i=[...Ar.entries()].sort((s,a)=>s[1].observedAtMs-a[1].observedAtMs)[0];i&&Ar.delete(i[0])}let o=r.dir??Ss();Vt.mkdirSync(o,{recursive:!0,mode:448}),Vt.writeFileSync(Fu(o),JSON.stringify(Object.fromEntries(Ar),null,1),{mode:384})}catch{}}function Hu(e,t={}){let r=Ar.get(String(e));if(r)return r;try{let o=JSON.parse(Vt.readFileSync(Fu(t.dir),"utf8"))?.[String(e)];if(o&&typeof o=="object")return o}catch{}return null}Es();function Vu(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 Cg=[/\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 So(e){let t=String(e??"");for(let r of Cg)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)=>Vu(n)?`${n}${o}[REDACTED]`:r),Ng(sr(t,{force:!0}))}function Ng(e){return String(e).replace(/https?:\/\/[^\s"'<>]+/gi,t=>{let r=zu(t);return r.ok?r.href:t})}function mn(e,{depth:t=0,seen:r=new WeakSet,key:n=""}={}){if(Vu(n))return"[REDACTED]";if(typeof e=="string"){let i=So(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 sr(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=>mn(i,{depth:t+1,seen:r,key:n}));let o={};for(let[i,s]of Object.entries(e))o[i]=mn(s,{depth:t+1,seen:r,key:i});return o}function NT(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 vu=NT(ks("ORACLE_DATA_URL","MAD_DESK_URL","http://127.0.0.1:8787")),RT=2*1024*1024;async function $T(e,t=RT){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 U0={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"}}},un={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:U0,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:U0,mac:{type:"string"},quotedAtMs:{type:"number"},expiresAtMs:{type:"number"}}}}]},M0=[{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:un,conversionGasEvidence:un,gasPriceEvidence:un,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:un,conversionGasEvidence:un,gasPriceEvidence:un,minNetWei:{type:"string"}}}},{name:"anvil_prepare_buy",description:"Build one exact-token Anvil buy action for Oracle's armed owner-local signer. The caller cap may reject but never widen the exact fresh quote encoded and confirmed. Requires sufficient allowance, exact human confirmation, simulation, and arm.",inputSchema:{type:"object",required:["market","collection","tokenId","buyer","maxTotalCostRaw","confirmedTotalCostRaw","maxNativeSwapFeeWei","actionGasLimit","maxFeePerGasWei","actionNonce","tradeId","userConfirmed"],properties:{market:{type:"string"},collection:{type:"string"},tokenId:{type:"string"},buyer:{type:"string"},maxTotalCostRaw:{type:"string"},confirmedTotalCostRaw:{type:"string",description:"Exact freshly quoted total cost reviewed by the user; must equal the re-read quote."},maxNativeSwapFeeWei:{type:"string"},actionGasLimit:{type:"string"},maxFeePerGasWei:{type:"string"},maxPriorityFeePerGasWei:{type:"string"},actionNonce:{type:"number"},ttlMs:{type:"number"},tradeId:{type:"string"},userConfirmed:{type:"boolean",const:!0}}}},{name:"anvil_prepare_sell",description:"Build one exact-token Anvil sale action for Oracle's armed owner-local signer. The caller floor may reject but never widen the exact fresh net payout encoded and confirmed. Requires pre-existing ERC721 approval, exact human confirmation, simulation, and arm.",inputSchema:{type:"object",required:["market","collection","tokenId","seller","minPayoutRaw","confirmedNetPayoutRaw","maxNativeSwapFeeWei","actionGasLimit","maxFeePerGasWei","actionNonce","tradeId","userConfirmed"],properties:{market:{type:"string"},collection:{type:"string"},tokenId:{type:"string"},seller:{type:"string"},minPayoutRaw:{type:"string"},confirmedNetPayoutRaw:{type:"string",description:"Exact freshly quoted net payout reviewed by the user; must equal the re-read quote."},maxNativeSwapFeeWei:{type:"string"},actionGasLimit:{type:"string"},maxFeePerGasWei:{type:"string"},maxPriorityFeePerGasWei:{type:"string"},actionNonce:{type:"number"},ttlMs:{type:"number"},tradeId:{type:"string"},userConfirmed:{type:"boolean",const:!0}}}},{name:"stonkbrokers_scan_loot",description:"Verify StonkBroker parent availability and nested ERC-6551 loot custody, then rank matching traits without treating rarity as buy evidence. Read-only.",inputSchema:{type:"object",required:["candidates"],properties:{candidates:{type:"array",items:{type:"object"}},traitType:{type:"string"},minStars:{type:"number"}}}},{name:"stonkbrokers_broker_desk",description:"Read StonkBroker owner/TBA identities and Clock In state, or prepare an unsigned permissionless Clock In call. No signing or broadcast.",inputSchema:{type:"object",properties:{owner:{type:"string"},brokerTokenIds:{type:"array",items:{type:"string"}},which:{type:"string"},mode:{type:"string"},batchSize:{type:"number"},minOutBps:{type:"number"}}}},{name:"rpc_balance",description:"Native token balance of an address on a chain via public RPC. Read-only. Omit address to read the operator wallet.",inputSchema:{type:"object",required:["chainId"],properties:{chainId:{type:"number"},address:{type:"string"}}}},{name:"rpc_block",description:"Latest block number on a chain via public RPC. Read-only.",inputSchema:{type:"object",required:["chainId"],properties:{chainId:{type:"number"}}}},{name:"solana_balance",description:"Solana mainnet SOL balance for a base58 public key. Read-only; no signing or broadcast.",inputSchema:{type:"object",required:["address"],properties:{address:{type:"string"},commitment:{type:"string"}}}},{name:"solana_token_accounts",description:"Solana SPL token accounts for an owner, optionally filtered by mint. Read-only.",inputSchema:{type:"object",required:["owner"],properties:{owner:{type:"string"},mint:{type:"string"},commitment:{type:"string"}}}},{name:"solana_simulate",description:"Simulate a base64 Solana transaction through RPC. Read-only; never signs or broadcasts.",inputSchema:{type:"object",required:["transaction"],properties:{transaction:{type:"string"},sigVerify:{type:"boolean"},replaceRecentBlockhash:{type:"boolean"}}}},{name:"jupiter_venues",description:"Jupiter Solana venue map, optionally verified on-chain against executable BPF loader ownership. Read-only.",inputSchema:{type:"object",properties:{verify:{type:"boolean"},rpc:{type:"string"}}}},{name:"jupiter_quote",description:"Jupiter Solana Swap API quote with a hard <=100 bps slippage cap. Read-only.",inputSchema:{type:"object",required:["inputMint","outputMint","amount"],properties:{inputMint:{type:"string"},outputMint:{type:"string"},amount:{type:"string"},slippageBps:{type:"number"}}}},{name:"jupiter_prepare",description:"Prepare an unsigned Jupiter swap transaction for the user's Solana wallet to sign. No local signer, no broadcast.",inputSchema:{type:"object",required:["userPublicKey"],properties:{userPublicKey:{type:"string"},quoteResponse:{type:"object"},inputMint:{type:"string"},outputMint:{type:"string"},amount:{type:"string"},slippageBps:{type:"number"}}}},{name:"btc_health",description:"Bitcoin L1 Esplora health + tip height (mempool.space by default). No Core RPC, no keys. Read-only.",inputSchema:{type:"object",properties:{}}},{name:"btc_fees",description:"Recommended Bitcoin fee rates (sats/vB). Read-only.",inputSchema:{type:"object",properties:{}}},{name:"btc_balance",description:"Bitcoin address balance in sats via Esplora. Read-only.",inputSchema:{type:"object",required:["address"],properties:{address:{type:"string",description:"bc1\u2026/1\u2026/3\u2026 address"}}}},{name:"btc_utxos",description:"UTXOs for a Bitcoin address via Esplora. Read-only.",inputSchema:{type:"object",required:["address"],properties:{address:{type:"string"}}}},{name:"btc_tx",description:"Lookup a Bitcoin transaction by txid via Esplora. Read-only.",inputSchema:{type:"object",required:["txid"],properties:{txid:{type:"string"}}}},{name:"btc_meta_health",description:"Ordinals/runes indexer health. Reports whether BTC_META_API_URL / vendor API keys are configured. Read-only.",inputSchema:{type:"object",properties:{}}},{name:"btc_rune_balance",description:"Rune balances for a Bitcoin address (requires configured indexer + optional API key). Read-only.",inputSchema:{type:"object",required:["address"],properties:{address:{type:"string"}}}},{name:"btc_inscriptions",description:"Inscriptions controlled by an address. REQUIRES a keyed indexer (ordinals.com has no address index). Returns unknownNotEmpty:true when unconfigured \u2014 that means UNKNOWN, never 'wallet holds none'. Protect these UTXOs from fee spends.",inputSchema:{type:"object",required:["address"],properties:{address:{type:"string"},limit:{type:"number"}}}},{name:"btc_inscription_info",description:"Inscription metadata by inscription id (content type/length, height, sat, fee). KEYLESS via ordinals.com recursive. Read-only.",inputSchema:{type:"object",required:["inscriptionId"],properties:{inscriptionId:{type:"string",description:"<64-hex-txid>i<index>"}}}},{name:"btc_inscription_children",description:"Child inscriptions of a parent (collections). KEYLESS via ordinals.com recursive. Read-only.",inputSchema:{type:"object",required:["inscriptionId"],properties:{inscriptionId:{type:"string",description:"<64-hex-txid>i<index>"},page:{type:"number"}}}},{name:"btc_ord_block_info",description:"Ord node block info / indexer tip. KEYLESS. Use to confirm the ordinals indexer is at the same tip as Esplora before trusting metaprotocol reads.",inputSchema:{type:"object",properties:{height:{type:"number",description:"omit for current tip"}}}},{name:"satflow_health",description:"Satflow marketplace health (primary BTC ordinals/runes market after Magic Eden BTC sunset). Needs SATFLOW_API_KEY. Read-only.",inputSchema:{type:"object",properties:{}}},{name:"satflow_floors",description:"Satflow collection floor prices. type=ordinals|runes. Read-only.",inputSchema:{type:"object",properties:{type:{type:"string",description:"ordinals or runes"},ids:{type:"string",description:"optional comma-separated collection ids"}}}},{name:"satflow_wallet",description:"Satflow wallet contents (ordinals/runes) for an address. Read-only.",inputSchema:{type:"object",required:["address"],properties:{address:{type:"string"},type:{type:"string"},limit:{type:"number"}}}},{name:"satflow_item",description:"Satflow item detail for an inscription id (listing + bids + meta). Read-only.",inputSchema:{type:"object",oneOf:[{required:["inscriptionId"]},{required:["id"]}],properties:{inscriptionId:{type:"string"},id:{type:"string",description:"alias for inscriptionId"}}}},{name:"satflow_floor_listings",description:"Satflow floor listings for collection id(s). Read-only.",inputSchema:{type:"object",oneOf:[{required:["collectionIds"]},{required:["ids"]}],properties:{collectionIds:{type:"string"},ids:{type:"string",description:"alias for collectionIds"},limit:{type:"number"}}}},{name:"scanner_coverage",description:"Which chains the on-chain scanner supports and which capabilities each one has (blockNumber, nativeBalance, tokenBalance, resolveToken, resolvePools, scanBlocks, scoreRisk, quote, sellSimulation, prepareUnsignedTx). Read-only.",inputSchema:{type:"object",properties:{}}},{name:"scan_token",description:"Resolve a token on an EVM chain: metadata, its pools, and a risk score. Works on chains no indexer covers because it reads the chain directly. Read-only.",inputSchema:{type:"object",properties:{chainId:{type:"number",description:"EVM chain id, e.g. 4663 for Robinhood Chain"},token:{type:"string",description:"token contract address"}},required:["chainId","token"]}},{name:"wallet_balances",description:"Native balance for an address on an EVM chain, plus one token balance when a token address is supplied. Read-only; never signs.",inputSchema:{type:"object",properties:{chainId:{type:"number"},address:{type:"string",description:"wallet address to inspect"},token:{type:"string",description:"optional token contract for a token balance"}},required:["chainId","address"]}},{name:"rfq_quote",description:"Create a cross-chain RFQ intent and fan it out to reviewed solver or venue sources. Returns firm quote objects with intentHash, firmQuoteHash, expiry, min receive, and unsigned executable artifacts. Never signs or broadcasts.",inputSchema:{type:"object",required:["fromChainId","toChainId","sellToken","buyToken","sellAmount","receiver","deadlineMs"],properties:{fromChainId:{type:"number"},toChainId:{type:"number"},sellToken:{type:"string"},buyToken:{type:"string"},sellAmount:{type:"string"},receiver:{type:"string"},deadlineMs:{type:"number"},minBuyAmount:{type:"string"},allowedSources:{type:"array",items:{type:"string"}},sources:{type:"array",items:{type:"string"},description:"alias for allowedSources"},allowedRouters:{type:"array",items:{type:"string"}},slippageBps:{type:"number"},decimalsIn:{type:"number"},decimalsOut:{type:"number"}}}},{name:"best_swap_route",description:"Compare swap routes across every available aggregator and rank by NET output (after gas and fees), not headline quote. Returns the winner plus all runners-up so the ranking can be checked rather than trusted.",inputSchema:{type:"object",properties:{chainId:{type:"number",description:"EVM chain id, e.g. 8453 for Base"},tokenIn:{type:"string",description:"sell token address"},tokenOut:{type:"string",description:"buy token address"},amountIn:{type:"string",description:"raw units of tokenIn (wei-scale)"},taker:{type:"string",description:"address used for quoting only; nothing is signed"},decimalsIn:{type:"number"},decimalsOut:{type:"number"}},required:["chainId","tokenIn","tokenOut","amountIn"]}},{name:"best_bridge_route",description:"Compare cross-chain bridge routes and rank by NET output. Also reports each route's expected duration, which is NOT folded into the score -- a route that saves $2 but takes 30 minutes is a trade-off for the caller to make.",inputSchema:{type:"object",properties:{fromChainId:{type:"number"},toChainId:{type:"number"},tokenIn:{type:"string",description:"token on the origin chain"},tokenOut:{type:"string",description:"token on the destination chain"},amountIn:{type:"string",description:"raw units of tokenIn"},taker:{type:"string",description:"address used for quoting only"},decimalsOut:{type:"number"}},required:["fromChainId","toChainId","tokenIn","tokenOut","amountIn"]}},{name:"prepare_best_route",description:"Compare routes, then build the SIGNABLE artifact for the winner. Returns an unsigned transaction (LI.FI/ParaSwap/0x) or EIP-712 typed data for an off-chain order (CoW) -- the artifactKind field says which, and they require different wallet actions. Re-quotes before preparing and reports drift against the comparison. Never signs or broadcasts.",inputSchema:{type:"object",properties:{chainId:{type:"number"},tokenIn:{type:"string"},tokenOut:{type:"string"},amountIn:{type:"string",description:"raw units of tokenIn"},taker:{type:"string",description:"the REAL wallet that will sign. Placeholder/burn addresses are rejected: quoting is anonymous, preparing is not."},decimalsIn:{type:"number"},decimalsOut:{type:"number"},source:{type:"string",description:"force a specific source instead of the winner (flagged in the result)"},driftToleranceBps:{type:"number",description:"default 100"}},required:["chainId","tokenIn","tokenOut","amountIn","taker"]}},{name:"prepare_best_bridge_route",description:"Compare cross-chain bridge routes, then build the signable transaction sequence for the winner. Returns a LIST of unsigned transactions -- some routes need an approval and a deposit signed in order, and signing only the first leaves funds approved but not bridged. Reports the destination chain and expected credit time. Bridging is not atomic. Never signs or broadcasts.",inputSchema:{type:"object",properties:{fromChainId:{type:"number"},toChainId:{type:"number"},tokenIn:{type:"string",description:"token on the origin chain"},tokenOut:{type:"string",description:"token on the destination chain"},amountIn:{type:"string",description:"raw units of tokenIn"},taker:{type:"string",description:"the REAL wallet that will sign; placeholders rejected"},source:{type:"string",description:"force a source instead of the winner"},driftToleranceBps:{type:"number",description:"default 100"}},required:["fromChainId","toChainId","tokenIn","tokenOut","amountIn","taker"]}},{name:"equity_venues",description:"Inventory of on-chain equities venues (HIP-3 builder DEXes, Arcus perps/spot on Robinhood 4663, RH Uniswap prepare tier, Solana xStocks, TON ston.fi) with tiers and a liveness snapshot. Offline fixtures by default. Read-only / prepare-only.",inputSchema:{type:"object",properties:{}}},{name:"equity_quote",description:"Cross-chain best-execution comparison for a tokenized equity ticker (NVDA, SPY, TSLA, ...). Ranks HIP-3, Arcus, RH Uniswap, Solana xStocks, and TON. Returns winner + runners-up + bestPreparable (only rh_uniswap is preparable in v1). rankedOn is usually gross because fees/gas are unmeasured - say so. Never signs.",inputSchema:{type:"object",required:["ticker"],properties:{ticker:{type:"string",description:"equity ticker, e.g. NVDA, SPY, TSLA"},sizeUsd:{type:"string",description:"optional notional USD size for impact model"},horizonHours:{type:"number",description:"optional holding horizon; enables funding-adjusted spot-vs-perp ranking"}}}},{name:"equity_prepare",description:"Prepare an UNSIGNED Robinhood-chain Uniswap artifact for a tokenized equity. Only the prepare-tier venue (rh_uniswap / chain 4663). Requires the real wallet as recipient. requiresWalletSignature=true, backendSigner=false. Never signs or broadcasts.",inputSchema:{type:"object",required:["ticker"],oneOf:[{required:["recipient"]},{required:["taker"]}],properties:{ticker:{type:"string"},recipient:{type:"string",description:"the REAL 0x wallet that will sign; placeholders rejected"},taker:{type:"string",description:"alias for recipient"},sizeUsd:{type:"string",description:"optional notional USD size"}}}},{name:"strategy_draft",description:"Draft a deterministic Hyperliquid strategy DSL from supported plain-English EMA, RSI, or funding rules. Fails closed on unsupported ambiguity. Never signs or broadcasts.",inputSchema:{type:"object",required:["prompt"],properties:{prompt:{type:"string"},nowMs:{type:"number"}}}},{name:"strategy_validate",description:"Strictly compile and hash a Hyperliquid strategy DSL. No network or execution.",inputSchema:{type:"object",required:["strategy"],properties:{strategy:{type:"object"},nowMs:{type:"number"}}}},{name:"strategy_backtest",description:"Backtest a deterministic strategy with fees, builder fees, slippage, funding, latency, stops, take profit, and liquidation. Uses supplied bars or keyless Hyperliquid history.",inputSchema:{type:"object",required:["strategy"],properties:{strategy:{type:"object"},bars:{type:"array",items:{type:"object"}},count:{type:"number"},backtestOptions:{type:"object"}}}},{name:"strategy_optimize",description:"Run bounded deterministic parameter search on training bars, then separately evaluate out-of-sample evidence. Never uses holdout data during optimization.",inputSchema:{type:"object",required:["strategy"],properties:{strategy:{type:"object"},bars:{type:"array",items:{type:"object"}},count:{type:"number"},maxTrials:{type:"number"}}}},{name:"strategy_evidence",description:"Produce separate train, holdout, and walk-forward evidence with overfitting flags and a fail, paper-only, or live-eligible status. Live eligibility never arms execution.",inputSchema:{type:"object",required:["strategy"],properties:{strategy:{type:"object"},bars:{type:"array",items:{type:"object"}},count:{type:"number"}}}},{name:"strategy_shadow_start",description:"Start a durable local shadow runner that records intended orders and theoretical fills only. Never signs or broadcasts.",inputSchema:{type:"object",required:["strategy"],properties:{strategy:{type:"object"},evidenceId:{type:"string"}}}},{name:"strategy_shadow_list",description:"List durable local shadow runners. Read-only and secret-free.",inputSchema:{type:"object",properties:{}}},{name:"strategy_shadow_status",description:"Inspect one durable local shadow runner. Read-only and secret-free.",inputSchema:{type:"object",required:["id"],properties:{id:{type:"string"}}}},{name:"strategy_shadow_step",description:"Advance one durable shadow runner over supplied or keyless historical bars. Never signs or broadcasts.",inputSchema:{type:"object",required:["id"],properties:{id:{type:"string"},bars:{type:"array",items:{type:"object"}},count:{type:"number"}}}},{name:"strategy_shadow_stop",description:"Stop one durable local shadow runner. Does not submit or cancel exchange orders.",inputSchema:{type:"object",required:["id"],properties:{id:{type:"string"}}}},{name:"strategy_prepare_live",description:"Create an integrity-bound prepare-only handoff after live-eligible evidence, HMAC-authenticated when local attestation is configured. All execution flags stay false. A separate local operator must revalidate, arm, sign, and broadcast.",inputSchema:{type:"object",required:["strategy","evidence","shadowId"],properties:{strategy:{type:"object"},evidence:{type:"object"},shadowId:{type:"string"},caps:{type:"object"},nowMs:{type:"number"}}}},{name:"twap_simulate",description:"Simulate a TWAP (time-weighted average price) DCA order. Splits a large order into equal-sized chunks over a configurable window, quotes every chunk at current prices, and returns the schedule + estimated average price. Read-only. Never signs or broadcasts. Use before committing to a TWAP.",inputSchema:{type:"object",required:["chainId","tokenIn","tokenOut","taker"],oneOf:[{required:["amount"]},{required:["amountIn"]}],properties:{chainId:{type:"number"},tokenIn:{type:"string"},tokenOut:{type:"string"},amount:{type:"string",description:"raw base units of tokenIn"},amountIn:{type:"string",description:"read-only alias for amount"},taker:{type:"string",description:"the REAL wallet that will sign"},splits:{type:"number",description:"number of chunks (default 10, max 100)"},windowHours:{type:"number",description:"total window in hours (default 6)"},slippageBps:{type:"number",description:"slippage cap in bps (default 100)"}}}},{name:"bridge_aggregator_scan",description:"Scan ALL cross-chain bridge routes: deBridge DLN + LI.FI/Relay + ChangeNOW. Ranks every route by net output, checks for existing token approvals that should be revoked before bridging, and returns the winner + runners-up. Read-only. Never signs or broadcasts. ChangeNOW requires ticker symbols.",inputSchema:{type:"object",required:["fromChainId","toChainId","tokenIn","tokenOut","amount","taker"],properties:{fromChainId:{type:"number"},toChainId:{type:"number"},tokenIn:{type:"string"},tokenOut:{type:"string"},amount:{type:"string",description:"raw base units of tokenIn"},taker:{type:"string"},fromSymbol:{type:"string",description:"ticker for ChangeNOW (e.g. ETH, USDC)"},toSymbol:{type:"string",description:"ticker for ChangeNOW"},fromDecimals:{type:"number",description:"default 18"},toDecimals:{type:"number",description:"default 18"}}}},{name:"perps_markets",description:"Scan perps markets across dYdX (standalone chain), Drift (Solana), and Vertex (Arbitrum). Returns ticker, oracle price, funding rate, open interest, and 24h volume. Read-only. Never signs.",inputSchema:{type:"object",properties:{venue:{type:"string",description:"dydx, drift, or vertex (default: all)"}}}},{name:"dex_quote",description:"Quote a swap across PancakeSwap (BSC+), SushiSwap (30+ chains), or Raydium (Solana via Jupiter). Specify the DEX and chain. Read-only.",inputSchema:{type:"object",required:["dex","chainId","tokenIn","tokenOut","amountIn"],properties:{dex:{type:"string",description:"pancakeswap, sushiswap, or raydium"},chainId:{type:"number"},tokenIn:{type:"string"},tokenOut:{type:"string"},amountIn:{type:"string",description:"raw base units"}}}},{name:"options_markets",description:"Scan on-chain options markets (calls/puts). Currently Aevo. Returns instruments, mark prices, funding, open interest. Read-only.",inputSchema:{type:"object",properties:{}}},{name:"cex_market_data",description:"Read PUBLIC centralized-exchange market data from Binance, OKX or Bybit: spot/perp ticker, orderbook depth, perp funding rate, mark price, and open interest. Keyless public endpoints only \u2014 no account, no trading, never signs.",inputSchema:{type:"object",required:["coin"],properties:{venue:{type:"string",description:"binance, okx, bybit, or all (default: all)"},op:{type:"string",description:"ticker, orderbook, funding, markPrice, or openInterest (default: ticker)"},coin:{type:"string",description:"Base asset, e.g. BTC. Full exchange symbols also accepted."},quote:{type:"string",description:"Quote asset (default: USDT)"},market:{type:"string",description:"spot or perp (default: spot; funding/openInterest force perp)"},limit:{type:"number",description:"Orderbook depth levels"}}}},{name:"cex_basis_scan",description:"Cross-venue perp basis and funding-spread scan across Binance, OKX, Bybit and Hyperliquid public data. Returns per-venue perp mark vs spot basis in bps plus pairwise ANNUALIZED funding deltas (Hyperliquid settles hourly, CEXes 8h, so raw rates are not comparable). Analysis over public reads \u2014 no sizing, no order, never signs.",inputSchema:{type:"object",required:["coin"],properties:{coin:{type:"string",description:"Base asset, e.g. BTC or ETH"},quote:{type:"string",description:"Quote asset for the CEX legs (default: USDT)"},venues:{type:"string",description:"Comma-separated subset of binance,okx,bybit,hyperliquid (default: all)"},fundingOnly:{type:"boolean",description:"Return only the funding-spread view"}}}},{name:"snapshot_governance",description:"Read-only Snapshot.org hub: spaces, proposals, proposal detail, an address's votes and voting power. Never signs a vote.",inputSchema:{type:"object",properties:{op:{type:"string",description:"spaces, proposals, activeProposals, proposal, votes, votingPower, or health (default: spaces)"},space:{type:"string"},spaces:{type:"array",items:{type:"string"}},id:{type:"string",description:"proposal id"},voter:{type:"string"},state:{type:"string"},first:{type:"number"}}}},{name:"tally_governance",description:"Read-only Governor Bravo / OZ Governor proposal state and vote tallies for major DAOs. Never casts, queues, or executes a vote.",inputSchema:{type:"object",properties:{op:{type:"string",description:"governors, info, proposals, proposal, voterStatus, or health (default: governors)"},dao:{type:"string",description:"compound, uniswap, ens, aave, gitcoin, arbitrum, optimism"},proposalId:{type:"string"},account:{type:"string"}}}},{name:"stablecoin_peg_scan",description:"Rank major and Hyperliquid-native stables by absolute bps from $1. Unpriced is unknown, never on-peg. Read-only.",inputSchema:{type:"object",properties:{symbols:{type:"array",items:{type:"string"}},usePyth:{type:"boolean"},useDex:{type:"boolean"}}}},{name:"lending_markets",description:"Scan lending protocol markets across Compound ($2B+ TVL). Returns supply/borrow APYs, total supply, collateral factors. Read-only.",inputSchema:{type:"object",properties:{}}},{name:"yield_vaults",description:"Scan yield aggregator vaults across Yearn + Convex. Returns vault APYs, TVLs, boosted status. Read-only.",inputSchema:{type:"object",properties:{}}},{name:"watch_list",description:"List alert-only price/token watches. Never execute.",inputSchema:{type:"object",properties:{}}},{name:"watch_create",description:"Create an alert-only watch. actionMode is always alert_only. Never execute.",inputSchema:{type:"object",required:["chain","token","condition"],properties:{chain:{type:"string"},token:{type:"string"},condition:{type:"string"},note:{type:"string"}}}},{name:"receipt_report",description:"Classify a caller-supplied receipt. Reports whether a tx hash exists. Does not verify chain success.",inputSchema:{type:"object",properties:{hash:{type:"string"},transactionHash:{type:"string"},txid:{type:"string"},receipt:{type:"object"}}}},{name:"twitter_ca_watch",description:"One Twitter CA watch tick: read an account, extract EVM/Solana CAs, rank the USD book, PREPARE only. Automated ticks never emit a card and never broadcast. Needs ORACLE_XURL_ENABLED=true.",inputSchema:{type:"object",required:["handle"],properties:{handle:{type:"string"},chainId:{type:"number",description:"default 4663 Robinhood"},limit:{type:"number"}}}},{name:"trade_lifecycle",description:"Create, verify, or advance a prepare-only trade fact chain. Signing and broadcasting are never performed here.",inputSchema:{type:"object",required:["action"],properties:{action:{type:"string",enum:["create","verify","advance"]},tradeId:{type:"string"},intent:{type:"object"},lifecycle:{type:"object"},state:{type:"string"},fact:{type:"object"},asOf:{type:"number"}}}},{name:"signal_score",description:"Cold-score onchain signal events. Never fetches or executes.",inputSchema:{type:"object",required:["events"],properties:{events:{type:"array",items:{type:"object"}},markouts:{type:"array",items:{type:"object"}},openIntents:{type:"boolean"},limit:{type:"number"}}}},{name:"workspace_artifact",description:"Get, list, put, or link deterministic workspace artifacts. No arbitrary paths.",inputSchema:{type:"object",required:["action"],properties:{action:{type:"string",enum:["get","list","put","link"]},id:{type:"string"},type:{type:"string"},createdAt:{type:"string"},data:{type:"object"},parentId:{type:"string"},childId:{type:"string"}}}},{name:"research_artifact",description:"Create a citation-bearing research artifact. fetchedAt must be supplied by the caller.",inputSchema:{type:"object",required:["sourceUrl","fetchedAt","snapshot","claim","confidence"],properties:{sourceUrl:{type:"string"},fetchedAt:{type:"string"},snapshot:{type:"string"},claim:{type:"string"},confidence:{type:"number"},contradictions:{type:"array",items:{type:"string"}}}}},{name:"portfolio_analyze",description:"Summarize a caller-supplied portfolio ledger. Read-only.",inputSchema:{type:"object",required:["ledger","asOf"],properties:{ledger:{type:"object"},asOf:{type:"number"},priceTtlMs:{type:"number"}}}},{name:"tax_lots",description:"Build exact-integer cost-basis records from caller-supplied events. Accounting records only, not tax advice.",inputSchema:{type:"object",required:["input"],properties:{input:{type:"object",additionalProperties:!0},method:{type:"string",enum:["fifo","lifo","hifo","specific"]},asOf:{type:"string",minLength:1}},additionalProperties:!1}},{name:"position_health",description:"Evaluate caller-supplied lending or farming snapshots. Alert-only, with no network access or execution signal.",inputSchema:{type:"object",required:["action","input","asOf"],properties:{action:{type:"string",enum:["evaluate","book"]},input:{type:"object",additionalProperties:!0},asOf:{type:"string",minLength:1},thresholds:{type:"object",additionalProperties:!0}},additionalProperties:!1}},{name:"governance_prepare",description:"Create a deterministic semantic preview of a caller-supplied governance intent. No adapter, calldata, vote, signature, or broadcast.",inputSchema:{type:"object",required:["input","asOf"],properties:{input:{type:"object",additionalProperties:!0},asOf:{type:"string",minLength:1}},additionalProperties:!1}},{name:"safety_intelligence",description:"Evaluate caller-supplied address or transaction safety evidence. No source is contacted and unknown evidence fails closed.",inputSchema:{type:"object",required:["action","input","asOf"],properties:{action:{type:"string",enum:["address","transaction"]},input:{type:"object",additionalProperties:!0},asOf:{type:"string",minLength:1},minClearConfidence:{type:"number",minimum:0,maximum:1},minBlockConfidence:{type:"number",minimum:0,maximum:1}},additionalProperties:!1}},{name:"portfolio_risk",description:"Summarize concentration and coverage from caller-supplied portfolio snapshots. No network or account access.",inputSchema:{type:"object",required:["input"],properties:{input:{type:"object",additionalProperties:!0}},additionalProperties:!1}},{name:"mev_status",description:"MEV observer/operator flag posture. Read-only. Never implies a live trade. Flash-loan execute still needs ORACLE_MEV_EXECUTE_ENABLED=1 and literal --execute on oracle mev.",inputSchema:{type:"object",properties:{}}},{name:"chain_list",description:"List Oracle's EVM chain registry (chainId, name, rpc env names). Read-only.",inputSchema:{type:"object",properties:{}}},{name:"tron_account",description:"Tron account: TRX balance (sun + display) and resource state via public TronGrid. Read-only; no keys, no broadcast.",inputSchema:{type:"object",required:["address"],properties:{address:{type:"string",description:"Base58 Tron address (T\u2026)"}}}},{name:"tron_trc20_balances",description:"TRC20 token balances for a Tron address. USDT-TRC20 is decorated with symbol/decimals. Read-only.",inputSchema:{type:"object",required:["address"],properties:{address:{type:"string"},contract:{type:"string",description:"Optional TRC20 contract to filter to."}}}},{name:"tron_trc20_transfers",description:"TRC20 transfer history for a Tron address. Defaults to the USDT contract (the dominant stablecoin rail); pass contract:'all' to drop the filter. Read-only.",inputSchema:{type:"object",required:["address"],properties:{address:{type:"string"},contract:{type:"string",description:"TRC20 contract, or 'all'. Defaults to USDT-TRC20."},limit:{type:"number"}}}},{name:"tron_chain_parameters",description:"Tron network chain parameters (energy fee, bandwidth price, account create fee). Read-only.",inputSchema:{type:"object",properties:{key:{type:"string"}}}},{name:"ton_account",description:"TON account state and nanoton/TON balance via public toncenter. Accepts raw (0:hex) or base64url addresses. Read-only.",inputSchema:{type:"object",required:["address"],properties:{address:{type:"string"}}}},{name:"ton_jetton_balances",description:"Jetton (TON fungible token) balances for an owner, with symbol/decimals where published. Read-only.",inputSchema:{type:"object",required:["owner"],properties:{owner:{type:"string"},jettonMaster:{type:"string"},limit:{type:"number"}}}},{name:"ton_transactions",description:"Recent TON transactions for an address (newest first). Read-only.",inputSchema:{type:"object",required:["address"],properties:{address:{type:"string"},limit:{type:"number"}}}},{name:"cosmos_chains",description:"List the Cosmos SDK chains Oracle can reach keylessly (cosmoshub, osmosis, celestia, injective, neutron, dydx, noble, kava) plus their LCD env overrides. Read-only.",inputSchema:{type:"object",properties:{}}},{name:"cosmos_balances",description:"Bank balances for a bech32 Cosmos address on any Cosmos SDK chain. IBC denoms are flagged with their hash for denom-trace resolution. Read-only.",inputSchema:{type:"object",required:["address"],properties:{address:{type:"string"},chain:{type:"string",description:"Chain key (default cosmoshub)."},lcdUrl:{type:"string",description:"Explicit LCD/REST base URL override."},limit:{type:"number"}}}},{name:"cosmos_delegations",description:"Staking delegations, unbonding entries, and pending rewards for a Cosmos delegator. Read-only.",inputSchema:{type:"object",required:["address"],properties:{address:{type:"string"},chain:{type:"string"},lcdUrl:{type:"string"},includeRewards:{type:"boolean"}}}},{name:"cosmos_denom_trace",description:"Resolve an ibc/<64-hex> denom back to its (path, base_denom) origin, or list a chain's trace table. Read-only.",inputSchema:{type:"object",properties:{hash:{type:"string",description:"ibc/<hash> denom or bare 64-hex hash. Omit to list traces."},chain:{type:"string"},lcdUrl:{type:"string"},limit:{type:"number"}}}},{name:"aptos_account",description:"Aptos account sequence number and authentication key via the public fullnode. Read-only.",inputSchema:{type:"object",required:["address"],properties:{address:{type:"string"}}}},{name:"aptos_resources",description:"Move resources held by an Aptos account, or one resource via resourceType. Read-only.",inputSchema:{type:"object",required:["address"],properties:{address:{type:"string"},resourceType:{type:"string"},limit:{type:"number"}}}},{name:"aptos_coin_balances",description:"Aptos coin balances: every 0x1::coin::CoinStore held, or one coinType through the 0x1::coin::balance view function. Read-only.",inputSchema:{type:"object",required:["address"],properties:{address:{type:"string"},coinType:{type:"string"}}}}],D0=String(Au.env.ORACLE_DEFAULT_ADDRESS||Au.env.MAD_OPERATOR_ADDRESS||"").trim(),PT=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"]),qT=new Set(M0.map(e=>e.name));for(let e of PT)if(qT.has(e))throw new Error(`public MCP custody boundary violated: ${e}`);var LT={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||D0||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||D0;if(!t)throw new Error("address required (set ORACLE_DEFAULT_ADDRESS to supply a default)");return{provider:"evm-rpc",op:"getBalance",args:{chainId:e.chainId,address:t}}},rpc_block:e=>({provider:"evm-rpc",op:"blockNumber",args:{chainId:e.chainId}}),solana_balance:e=>({provider:"solana-rpc",op:"getBalance",args:{address:e.address,commitment:e.commitment}}),solana_token_accounts:e=>({provider:"solana-rpc",op:"tokenAccounts",args:{owner:e.owner,mint:e.mint,commitment:e.commitment}}),solana_simulate:e=>({provider:"solana-rpc",op:"simulate",args:{transaction:e.transaction,sigVerify:e.sigVerify,replaceRecentBlockhash:e.replaceRecentBlockhash}}),jupiter_venues:e=>({provider:"jupiter",op:"venues",args:{verify:e.verify,rpc:e.rpc}}),jupiter_quote:e=>({provider:"jupiter",op:"quote",args:{inputMint:e.inputMint,outputMint:e.outputMint,amount:e.amount,slippageBps:e.slippageBps}}),jupiter_prepare:e=>({provider:"jupiter",op:"prepare",args:{userPublicKey:e.userPublicKey,quoteResponse:e.quoteResponse,inputMint:e.inputMint,outputMint:e.outputMint,amount:e.amount,slippageBps:e.slippageBps}}),btc_health:()=>({provider:"bitcoin-esplora",op:"health",args:{}}),tron_account:e=>({provider:"tron-public",op:"account",args:{address:e.address}}),tron_trc20_balances:e=>({provider:"tron-public",op:"trc20Balances",args:{address:e.address,contract:e.contract}}),tron_trc20_transfers:e=>({provider:"tron-public",op:"trc20Transfers",args:{address:e.address,contract:e.contract,limit:e.limit}}),tron_chain_parameters:e=>({provider:"tron-public",op:"chainParameters",args:{key:e.key}}),ton_account:e=>({provider:"ton-public",op:"accountState",args:{address:e.address}}),ton_jetton_balances:e=>({provider:"ton-public",op:"jettonBalances",args:{owner:e.owner,jettonMaster:e.jettonMaster,limit:e.limit}}),ton_transactions:e=>({provider:"ton-public",op:"transactions",args:{address:e.address,limit:e.limit}}),cosmos_chains:()=>({provider:"cosmos-lcd",op:"chains",args:{}}),cosmos_balances:e=>({provider:"cosmos-lcd",op:"balances",args:{address:e.address,chain:e.chain,lcdUrl:e.lcdUrl,limit:e.limit}}),cosmos_delegations:e=>({provider:"cosmos-lcd",op:"delegations",args:{address:e.address,chain:e.chain,lcdUrl:e.lcdUrl,includeRewards:e.includeRewards}}),cosmos_denom_trace:e=>({provider:"cosmos-lcd",op:"denomTrace",args:{hash:e.hash,chain:e.chain,lcdUrl:e.lcdUrl,limit:e.limit}}),aptos_account:e=>({provider:"aptos-public",op:"account",args:{address:e.address}}),aptos_resources:e=>({provider:"aptos-public",op:"resources",args:{address:e.address,resourceType:e.resourceType,limit:e.limit}}),aptos_coin_balances:e=>({provider:"aptos-public",op:"coinBalances",args:{address:e.address,coinType:e.coinType}}),btc_fees:()=>({provider:"bitcoin-esplora",op:"fees",args:{}}),btc_balance:e=>({provider:"bitcoin-esplora",op:"address",args:{address:e.address}}),btc_utxos:e=>({provider:"bitcoin-esplora",op:"utxos",args:{address:e.address}}),btc_tx:e=>({provider:"bitcoin-esplora",op:"tx",args:{txid:e.txid}}),btc_meta_health:()=>({provider:"bitcoin-meta",op:"health",args:{}}),btc_rune_balance:e=>({provider:"bitcoin-meta",op:"runeBalances",args:{address:e.address}}),btc_inscriptions:e=>({provider:"bitcoin-meta",op:"inscriptions",args:{address:e.address,limit:e.limit}}),btc_inscription_info:e=>({provider:"bitcoin-meta",op:"inscriptionInfo",args:{inscriptionId:e.inscriptionId}}),btc_inscription_children:e=>({provider:"bitcoin-meta",op:"inscriptionChildren",args:{inscriptionId:e.inscriptionId,page:e.page}}),btc_ord_block_info:e=>({provider:"bitcoin-meta",op:"ordBlockInfo",args:{height:e.height}}),satflow_health:()=>({provider:"satflow",op:"health",args:{}}),satflow_floors:e=>({provider:"satflow",op:"collectionFloors",args:{type:e.type,ids:e.ids}}),satflow_wallet:e=>({provider:"satflow",op:"walletContents",args:{address:e.address,type:e.type,limit:e.limit}}),satflow_item:e=>({provider:"satflow",op:"item",args:{inscriptionId:e.inscriptionId||e.id}}),satflow_floor_listings:e=>({provider:"satflow",op:"floorListings",args:{collectionIds:e.collectionIds||e.ids,limit:e.limit}})};async function Iu(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 $T(o);if(!o.ok)throw new Error(i.error||`HTTP ${o.status}`);return i}async function ve(e,t,r={},n={}){try{return await Iu(`${vu}/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 F0(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(()=>(ld(),ud));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(()=>(ma(),Ed)),{requestRfqQuotes:s}=await Promise.resolve().then(()=>(Dp(),Up)),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(()=>(Wr(),pf));return e==="best_swap_route"?i(t,r):s(t,r)}if(e==="prepare_best_route"){let{prepareBestRoute:i}=await Promise.resolve().then(()=>(mf(),ff));return i(t,r)}if(e==="prepare_best_bridge_route"){let{prepareBestBridgeRoute:i}=await Promise.resolve().then(()=>(yf(),hf));return i(t,r)}if(e==="twap_simulate"){let{simulateTwap:i}=await Promise.resolve().then(()=>(kf(),wf));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(()=>(dm(),lm));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(()=>(fm(),pm));s.dydx=await a(void 0,r)}if(i==="all"||i==="drift"){let{driftMarkets:a}=await Promise.resolve().then(()=>(bm(),gm));s.drift=await a(r)}if(i==="all"||i==="vertex"){let{vertexMarkets:a}=await Promise.resolve().then(()=>(Sm(),xm));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(()=>(Am(),Em));return s(t,r)}if(i==="sushiswap"){let{sushiQuote:s}=await Promise.resolve().then(()=>(_m(),Im));return s(t,r)}if(i==="raydium"){let{raydiumQuote:s}=await Promise.resolve().then(()=>(Tm(),Om));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(()=>(Nm(),Cm));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(()=>(Kn(),lc)),Promise.resolve().then(()=>(yc(),hc)),Promise.resolve().then(()=>(kc(),wc))]),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 y=>{try{return[y,await p[y][s](c,r)]}catch(h){return[y,{error:String(h.message||h).slice(0,200)}]}}));return{op:s,...Object.fromEntries(m)}}if(e==="cex_basis_scan"){if(!t.coin)return{error:"cex_basis_scan requires coin"};let{cexBasis:i,cexFundingSpread:s}=await Promise.resolve().then(()=>(Km(),Gm)),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:()=>ve("snapshot-governance","health",{},r),spaces:()=>ve("snapshot-governance","spaces",t,r),proposals:()=>ve("snapshot-governance","proposals",t,r),activeProposals:()=>ve("snapshot-governance","activeProposals",t,r),proposal:()=>ve("snapshot-governance","proposal",t,r),votes:()=>ve("snapshot-governance","votes",t,r),votingPower:()=>ve("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:()=>ve("tally-governance","health",{},r),governors:()=>ve("tally-governance","governors",{},r),info:()=>ve("tally-governance","info",t,r),proposals:()=>ve("tally-governance","proposals",t,r),proposal:()=>ve("tally-governance","proposal",t,r),voterStatus:()=>ve("tally-governance","voterStatus",t,r),tallyProposals:()=>ve("tally-governance","tallyProposals",t,r)};return s[i]?s[i]():{error:`unknown op: ${i}`}}if(e==="stablecoin_peg_scan")return ve("stablecoin-peg","scan",t,r);if(e==="lending_markets"){let{compoundMarkets:i}=await Promise.resolve().then(()=>(Qm(),Xm));return{compound:await i(r)}}if(e==="yield_vaults"){let[{yearnVaults:i},{convexPools:s}]=await Promise.all([Promise.resolve().then(()=>(Jm(),Ym)),Promise.resolve().then(()=>(eh(),Zm))]);return{yearn:await i(r),convex:await s(r)}}if(e==="equity_venues"){let{equityVenues:i,toJsonSafe:s}=await Promise.resolve().then(()=>(zi(),Hi));return s(i())}if(e==="equity_quote"){let{bestEquityRoute:i,toJsonSafe:s}=await Promise.resolve().then(()=>(zi(),Hi));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(()=>(zi(),Hi));return s(i({ticker:t.ticker,recipient:t.recipient||t.taker,sizeUsd:t.sizeUsd}))}if(e==="scanner_coverage"){let i=await Promise.resolve().then(()=>(Wi(),Vi));return i.registerBuiltinScanners?.(),i.scannerCoverage()}if(e==="scan_token"){let i=await Promise.resolve().then(()=>(Wi(),Vi));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(()=>(Wi(),Vi));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(()=>(Kc(),Gc));return{ok:!0,watches:i(),actionMode:"alert_only",execution:!1}}if(e==="watch_create"){let{createWatch:i}=await Promise.resolve().then(()=>(Kc(),Gc));return{ok:!0,watch:i(t),execution:!1}}if(e==="receipt_report"){let{classifyReceipt:i}=await Promise.resolve().then(()=>(Jh(),Yh));return{ok:!0,...i(t.receipt||t),execution:!1}}if(e==="twitter_ca_watch"){let{tickTwitterCaWatch:i}=await Promise.resolve().then(()=>(gy(),yy));return i({handle:t.handle,chainId:t.chainId,limit:t.limit,automated:!0},r)}if(["trade_lifecycle","signal_score","workspace_artifact","research_artifact","portfolio_analyze","tax_lots","position_health","governance_prepare","safety_intelligence","portfolio_risk"].includes(e)){let{runDeskTool:i}=await Promise.resolve().then(()=>(P0(),$0));return i(e,t,{signal:r.signal})}if(e==="mev_status"){let{executeGloballyEnabled:i,mevExecuteEnabled:s}=await Promise.resolve().then(()=>(L0(),q0));return{ok:!0,observer:!0,executeGloballyEnabled:i()===!0,mevExecuteEnabled:s()===!0,autonomous:!1,note:"Observer may run. Execute still needs the local signer plus literal --execute on oracle mev."}}if(e==="chain_list"){let{CHAINS:i}=await Promise.resolve().then(()=>(Ra(),hp));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 Iu(`${vu}/data/catalog`,{signal:r.signal});if(e==="data_health")return Iu(`${vu}/data/health`,{signal:r.signal});if(e==="tool_output_shape"){let i=String(t?.tool||""),s=Hu(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=LT[e];if(o){let{provider:i,op:s,args:a}=o(t);return ve(i,s,a,r)}throw new Error(`Unknown tool: ${e}`)}function j0(e,t){if(e?.dataBase64&&/^image\/(?:svg\+xml|png|jpeg|webp)$/.test(String(e.mimeType||""))){let{dataBase64:c,...u}=e,l=So(JSON.stringify(mn(u),null,2));return{content:[{type:"image",data:c,mimeType:e.mimeType},{type:"text",text:l}]}}let r=JSON.stringify(e,null,2),n=mn(e),o=So(JSON.stringify(n,null,2)),s=/"(?:mac|calldata|calldataHash|unsignedTransaction|typedData)"\s*:/.test(o)?null:Mu(t,o,n);t!=="tool_output_shape"&&ju(t,n);let a=[{type:"text",text:s?s.text:o}];try{let c=o===r?Bu(t,e):null;c&&a.push(c)}catch{}return{content:a}}var H0=Object.freeze({name:"oracle-data-mcp",version:"1",tools:M0,async call(e,t,r={}){return j0(await F0(e,t,r),e)}});function BT(){return Pu(H0)}function UT(){let e=Au.argv[1];if(!e)return!1;try{return B0.realpathSync(e)===B0.realpathSync(CT(import.meta.url))}catch{return!1}}UT()&&BT();function DT({timeoutMs:e,callToolOptions:t={}}={}){return xs({...H0,async call(r,n,o={}){return j0(await F0(r,n,{...t,...o}),r)}},{...e==null?{}:{callTimeoutMs:e}})}var xB=DT();export{PT as PUBLIC_MCP_FORBIDDEN_TOOLS,LT as ROUTES,M0 as TOOLS,F0 as callTool,DT as createPublicMcpHandler,j0 as formatMcpResult,xB as handle,Iu as httpJson,$T as readBoundedJsonResponse,NT as resolveDataUrl,BT as startStdioLoop,M0 as tools};
64
+ <details><summary>details \xB7 ${Kt(t)}</summary><pre>${a}</pre></details>
65
+ <div class="foot"><span>${Kt(t)}</span><span class="tag">THE FUTURE IS AGENTIC</span></div>
66
+ </div><script>document.documentElement.classList.add("live")</script></body></html>`}function pl(e,t){let n=yb[e];if(!n||!t||typeof t!="object"||t.error||t.ok===!1||!dl(n,t).some(i=>i.hero))return null;let o=wb(n,e,t);return{type:"resource",resource:{uri:`ui://oracle/card/${e}/${Date.now().toString(36)}`,mimeType:"text/html",text:o}}}import Yt from"node:fs";import Eb from"node:os";import Ln from"node:path";import Sb from"node:crypto";var vb=48e3,fl=4e3,Ab=1440*60*1e3,xb=8e3,kb=1e6;function Ib(e=process.env.ORACLE_MCP_SPILL_BYTES){let t=Number(e);return!Number.isFinite(t)||t<=0?vb:Math.min(Math.max(Math.floor(t),xb),kb)}function Hs(e=process.env.ORACLE_MCP_SPILL_DIR){if(typeof e=="string"&&e.trim())return Ln.resolve(e.trim());let t=process.env.XDG_STATE_HOME&&process.env.XDG_STATE_HOME.trim()?process.env.XDG_STATE_HOME.trim():Ln.join(Eb.homedir(),".local","state");return Ln.join(t,"oracle","mcp-spill")}function ml(e,{maxDepth:t=4,maxKeys:n=24}={}){let r={entries:400};function o(i,s){if(r.entries<=0)return"\u2026";if(r.entries-=1,i===null)return"null";if(Array.isArray(i))return i.length===0?"[]":s>=t?`array(${i.length})`:{[`array(${i.length})`]:o(i[0],s+1)};if(typeof i=="object"){if(s>=t)return"object";let a={},c=Object.keys(i);for(let u of c.slice(0,n))a[u]=o(i[u],s+1);return c.length>n&&(a[`\u2026+${c.length-n} keys`]="\u2026"),a}return typeof i=="string"?i.length>40?`string(${i.length})`:"string":typeof i}return o(e,0)}function _b(e){try{let t=Date.now();for(let n of Yt.readdirSync(e)){if(!n.endsWith(".json"))continue;let r=Ln.join(e,n);try{t-Yt.statSync(r).mtimeMs>Ab&&Yt.unlinkSync(r)}catch{}}}catch{}}function hl(e,t,n,r={}){let o=r.thresholdBytes??Ib(),i=Buffer.byteLength(t,"utf8");if(i<=o)return null;try{let s=r.dir??Hs();Yt.mkdirSync(s,{recursive:!0,mode:448}),_b(s);let a=new Date().toISOString().replace(/[:.]/g,"-"),c=Sb.randomBytes(4).toString("hex"),u=String(e).replace(/[^A-Za-z0-9_-]/g,"_").slice(0,64)||"tool",l=Ln.join(s,`${a}_${u}_${c}.json`);Yt.writeFileSync(l,t,{mode:384});let d=t.slice(0,fl),f=ml(n),p=[`[oracle-mcp spill] ${e} returned ${i} bytes \u2014 full redacted result saved to:`,l,"","Key-shape outline (know the keys before parsing \u2014 read the file for full data):",JSON.stringify(f,null,2),"",`Preview (first ${Math.min(fl,i)} bytes):`,d,d.length<t.length?"\u2026 [truncated \u2014 read the file above for the rest]":""].join(`
67
+ `);return{file:l,bytes:i,text:p}}catch{return null}}var Pn=new Map;function yl(e){return Ln.join(e??Hs(),"observed-shapes.json")}function gl(e,t,n={}){try{let r=ml(t);if(Pn.set(String(e),{shape:r,observedAtMs:Date.now()}),Pn.size>512){let i=[...Pn.entries()].sort((s,a)=>s[1].observedAtMs-a[1].observedAtMs)[0];i&&Pn.delete(i[0])}let o=n.dir??Hs();Yt.mkdirSync(o,{recursive:!0,mode:448}),Yt.writeFileSync(yl(o),JSON.stringify(Object.fromEntries(Pn),null,1),{mode:384})}catch{}}function bl(e,t={}){let n=Pn.get(String(e));if(n)return n;try{let o=JSON.parse(Yt.readFileSync(yl(t.dir),"utf8"))?.[String(e)];if(o&&typeof o=="object")return o}catch{}return null}zs();function El(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 Fb=[/\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 Uo(e){let t=String(e??"");for(let n of Fb)n.lastIndex=0,t=t.replace(n,"[REDACTED]");return t=t.replace(/\b([A-Za-z][A-Za-z0-9_-]{0,80})\s*([:=])\s*("[^"]*"|'[^']*'|[^\s,;}\]]+)/g,(n,r,o)=>El(r)?`${r}${o}[REDACTED]`:n),jb(pn(t,{force:!0}))}function jb(e){return String(e).replace(/https?:\/\/[^\s"'<>]+/gi,t=>{let n=wl(t);return n.ok?n.href:t})}function xr(e,{depth:t=0,seen:n=new WeakSet,key:r=""}={}){if(El(r))return"[REDACTED]";if(typeof e=="string"){let i=Uo(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 pn(String(e),{force:!0}).slice(0,240);if(n.has(e))return"[circular]";if(n.add(e),Array.isArray(e))return e.slice(0,1e3).map(i=>xr(i,{depth:t+1,seen:n,key:r}));let o={};for(let[i,s]of Object.entries(e))o[i]=xr(s,{depth:t+1,seen:n,key:i});return o}Rr();Zo();ot();import{Interface as bp,getAddress as A2,id as HS,isAddress as x2}from"ethers";ot();var XR=Object.freeze({1:"assertion failed",17:"arithmetic overflow or underflow",18:"division or modulo by zero",33:"invalid enum value",34:"invalid storage byte array encoding",49:"pop() on an empty array",50:"array index out of bounds",65:"out of memory",81:"call to an uninitialized function pointer"});Ra();xe();var wp=Object.freeze({1:Object.freeze({name:"ethereum",positionManager:"0xC36442b4a4522E871399CD717aBDD847Ab11FE88",wrappedNative:"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",venue:"uniswap-v3",source:"https://docs.uniswap.org/contracts/v3/reference/deployments/ethereum-deployments"}),8453:Object.freeze({name:"base",positionManager:"0x03a520b32C04BF3bEEf7BEb72E919cf822Ed34f1",wrappedNative:"0x4200000000000000000000000000000000000006",venue:"uniswap-v3",source:"https://docs.uniswap.org/contracts/v3/reference/deployments/base-deployments"})}),T2=new bp(["function ownerOf(uint256 tokenId) view returns (address)","function positions(uint256 tokenId) view returns (uint96 nonce,address operator,address token0,address token1,uint24 fee,int24 tickLower,int24 tickUpper,uint128 liquidity,uint256 feeGrowthInside0LastX128,uint256 feeGrowthInside1LastX128,uint128 tokensOwed0,uint128 tokensOwed1)","function decreaseLiquidity((uint256 tokenId,uint128 liquidity,uint256 amount0Min,uint256 amount1Min,uint256 deadline) params) payable returns (uint256 amount0,uint256 amount1)","function collect((uint256 tokenId,address recipient,uint128 amount0Max,uint128 amount1Max) params) payable returns (uint256 amount0,uint256 amount1)","function multicall(bytes[] data) payable returns (bytes[] results)"]),C2=new bp(["function withdraw(uint256 wad)"]),N2=(1n<<128n)-1n;var R2=HS("Transfer(address,address,uint256)").toLowerCase();G();si();xe();import{getAddress as B2,Interface as Si,TypedDataEncoder as U2,parseUnits as M2}from"ethers";var zS="fulfillAdvancedOrder(((address offerer,address zone,(uint8 itemType,address token,uint256 identifierOrCriteria,uint256 startAmount,uint256 endAmount)[] offer,(uint8 itemType,address token,uint256 identifierOrCriteria,uint256 startAmount,uint256 endAmount,address recipient)[] consideration,uint8 orderType,uint256 startTime,uint256 endTime,bytes32 zoneHash,uint256 salt,bytes32 conduitKey,uint256 totalOriginalConsiderationItems) parameters,uint120 numerator,uint120 denominator,bytes signature,bytes extraData) advancedOrder,(uint256 orderIndex,uint8 side,uint256 index,uint256 identifier,bytes32[] criteriaProof)[] criteriaResolvers,bytes32 fulfillerConduitKey,address recipient)",z2=new Si([`function ${zS}`]),V2=new Si(["function mintPublic(address nftContract,address feeRecipient,address minterIfNotPayer,uint256 quantity) payable","function mintAllowList(address nftContract,address feeRecipient,address minterIfNotPayer,uint256 quantity,(uint80 mintPrice,uint48 maxTotalMintableByWallet,uint48 startTime,uint48 endTime,uint48 dropStageIndex,uint32 maxTokenSupplyForStage,uint16 feeBps,bool restrictFeeRecipients) mintParams,bytes32[] proof) payable"]),VS=Object.freeze(["blast","base","ethereum","zora","arbitrum","sei","avalanche","polygon","optimism","ape_chain","flow","b3","soneium","ronin","bera_chain","solana","shape","unichain","gunzilla","abstract","animechain","hyperevm","somnia","monad","hyperliquid","megaeth","ink","robinhood","stablechain"]),W2=new Set(VS);var Ep=Object.freeze({robinhood:4663,ethereum:1,base:8453,arbitrum:42161,optimism:10,polygon:137,avalanche:43114,zora:7777777,blast:81457,sei:1329,ape_chain:33139,b3:8333,soneium:1868,ronin:2020,bera_chain:80094,shape:360,unichain:130,gunzilla:43419,abstract:2741,animechain:69e3,hyperevm:999,somnia:5031,monad:143,megaeth:4326,ink:57073,stablechain:988});var G2=Object.freeze({OrderComponents:[{name:"offerer",type:"address"},{name:"zone",type:"address"},{name:"offer",type:"OfferItem[]"},{name:"consideration",type:"ConsiderationItem[]"},{name:"orderType",type:"uint8"},{name:"startTime",type:"uint256"},{name:"endTime",type:"uint256"},{name:"zoneHash",type:"bytes32"},{name:"salt",type:"uint256"},{name:"conduitKey",type:"bytes32"},{name:"counter",type:"uint256"}],OfferItem:[{name:"itemType",type:"uint8"},{name:"token",type:"address"},{name:"identifierOrCriteria",type:"uint256"},{name:"startAmount",type:"uint256"},{name:"endAmount",type:"uint256"}],ConsiderationItem:[{name:"itemType",type:"uint8"},{name:"token",type:"address"},{name:"identifierOrCriteria",type:"uint256"},{name:"startAmount",type:"uint256"},{name:"endAmount",type:"uint256"},{name:"recipient",type:"address"}]});var K2=new Si(["function setApprovalForAll(address operator,bool approved)"]),Y2=new Si(["function cancel((address offerer,address zone,(uint8 itemType,address token,uint256 identifierOrCriteria,uint256 startAmount,uint256 endAmount)[] offer,(uint8 itemType,address token,uint256 identifierOrCriteria,uint256 startAmount,uint256 endAmount,address recipient)[] consideration,uint8 orderType,uint256 startTime,uint256 endTime,bytes32 zoneHash,uint256 salt,bytes32 conduitKey,uint256 counter)[] orders) returns (bool cancelled)"]);Vr();var xi=new Map,QS=Object.keys(ke).map(Number),ZS=Object.keys(We).map(Number),ev=Object.keys(wp).map(Number),Da=Zt.map(e=>e.chainId),tv=[...new Set(Object.values(Ep))],Ma=new Set,Np=!1;function Rp(e){if(!e||typeof e!="object"||Object.isFrozen(e))return e;for(let t of Object.values(e))Rp(t);return Object.freeze(e)}function T(e){if(!e?.id)throw new Error("registerProvider requires id");if(!e.venue)throw new Error("registerProvider requires venue");if(!Array.isArray(e.ops))throw new Error("registerProvider requires ops[]");let t=String(e.id);if(Np&&Ma.has(t))throw new Error(`registerProvider refuses to overwrite built-in provider: ${t}`);return xi.set(t,{chainIds:e.chainIds||[],auth:e.auth||"none",description:e.description||"",baseEnv:e.baseEnv||[],...e,id:t}),xi.get(t)}function Pp(e){return xi.get(e)||null}function nv(){Ma.clear();for(let[e,t]of xi)Ma.add(e),Rp(t);Np=!0}T({id:"hl-info",venue:"hl",chainIds:[],auth:"none",ops:["health","allMids","l2Book","outcomeMeta","clearinghouse","userFills","meta","metaAndAssetCtxs","candleSnapshot","openOrders","frontendOpenOrders","userState","spotMeta"],baseEnv:["HL_INFO_URL","HL_API_URL"],description:"Hyperliquid public /info"});T({id:"hl-vaults",venue:"hyperliquid-vaults",chainIds:[],auth:"none",ops:["health","summaries","details","userEquities","tracker"],execution:"read-only",baseEnv:["HL_INFO_URL","HL_API_URL"],description:"Read-only Hyperliquid vault summaries, vault details, user vault equities, and HLP tracking."});T({id:"hl-precompiles",venue:"hyperliquid",chainIds:[999],auth:"none",ops:["health","read","l1BlockNumber","markPx","oraclePx","spotPx","position","spotBalance","vaultEquity","withdrawable"],execution:"read-only",baseEnv:["HYPEREVM_RPC_URL","HYPER_EVM_RPC"],description:"HyperEVM L1Read precompiles (0x800-0x809). eth_call only. Includes HLP vault equity. No CoreWriter."});T({id:"protocol-templates",venue:"protocol-builder",chainIds:[],auth:"none",ops:["health","list","listNative","gate","prepareDeploy","buildNative","eval"],description:"Gated EVM templates plus deterministic Solana program and Bitcoin policy scaffolds. Native bundles require chain-specific compile, tests, and simulation before any unsigned deploy/funding prepare. NOT a firm audit."});T({id:"poly-public",venue:"poly",chainIds:[137],auth:"none",ops:["health","time","markets","book","midpoint","spread","price","events"],execution:"read-only",baseEnv:["POLY_CLOB_URL","POLY_GAMMA_URL"],description:"Polymarket CLOB + Gamma public REST"});T({id:"poly-clob",venue:"poly",chainIds:[137],auth:"none",ops:["health","prepareOrder"],execution:"prepare",localSignerSurfaces:["poly"],description:"Polymarket CLOB unsigned EIP-712 order prepare plus owner-operated local-signer submit. Hosted/keyless remains prepare-only."});T({id:"hl-delta-neutral",venue:"hyperliquid",chainIds:[],auth:"none",ops:["health","scan","quote","prepare","loop"],execution:"prepare",localSignerSurfaces:["hl"],description:"Hyperliquid funding carry. Armed through the existing hl signer. Hosted/keyless remains prepare-only. Not automated."});T({id:"lighter-delta-neutral",venue:"lighter",chainIds:[],auth:"none",ops:["health","scan","quote","prepare","loop"],execution:"prepare",localSignerSurfaces:["lighter"],description:"Lighter.xyz funding carry. Armed through the official sendTx local-signer. Hosted/keyless remains prepare-only. Not automated."});T({id:"portfolio",venue:"multichain-wallet",chainIds:[1,10,56,137,988,999,2741,4663,8453,42161,43114],auth:"none",ops:["health","balances","snapshot","history","valueGraph"],execution:"read-only",description:"Read-only balance aggregation across configured EVM chains, Solana, Bitcoin, and Hyperliquid, plus profile-local observation snapshots, history, and value graphs with explicit partial coverage."});T({id:"nft-portfolio",venue:"multichain-nft-wallet",chainIds:[1,10,137,988,999,2741,4663,8453,42161,43114],auth:"optionalApiKey",ops:["health","inventory","gallery","pnl","prepareList","traitSnipe"],execution:"prepare",baseEnv:["OPENSEA_API_KEY","MAGICEDEN_API_KEY","SATFLOW_API_KEY"],description:"Normalized EVM, Solana, and Bitcoin NFT inventory, static contact-sheet galleries, explicit PnL coverage, user-confirmed unsigned listing preparation, and evidence-gated trait-snipe buy intents."});T({id:"evm-simulate",venue:"onchain-simulation",chainIds:[1,10,56,137,988,999,2741,4663,8453,42161,43114],auth:"none",ops:["health","simulate"],execution:"read",baseEnv:[],description:"Pre-sign EVM transaction simulation: eth_call at pending state to catch reverts, decoded revert reasons (Error(string), Panic codes, custom-error selectors), and a buffered gas estimate. Distinguishes a genuine revert from an unreachable node \u2014 an infra failure is never reported as 'would fail'. A pass reflects current chain state and is explicitly not a guarantee."});T({id:"nft-mint",venue:"onchain-mint",chainIds:[1,10,56,137,988,999,2741,4663,8453,42161,43114],auth:"none",ops:["health","discover","prepare","priceGas","createTrigger","checkOpen"],execution:"prepare",localSignerSurfaces:["evm-nft"],baseEnv:[],description:"EVM NFT mints: discover the collection's mint entrypoint from bytecode, price a competitive EIP-1559 bid from fee-history percentiles, enforce gas-war caps, surface contract risk, and hand execution to the local signer after explicit arming and bounded grant."});T({id:"universal-mint-router",venue:"universal-nft-mint",chainIds:[],auth:"optionalApiKey",ops:["health","capabilities","prepare"],execution:"prepare",baseEnv:["OPENSEA_API_KEY"],description:"Prepare-only exact universal mint routing across reviewed EVM and Ordinals adapters. Universal Solana mint is RESEARCH_ONLY and disabled until canonical serialized-message decoding ships; the separate Magic Eden marketplace provider is unchanged. It never signs or broadcasts."});T({id:"universal-nft-lifecycle",venue:"universal-nft-lifecycle",chainIds:[],auth:"optionalApiKey",ops:["health","capabilities","route"],execution:"read",baseEnv:["OPENSEA_API_KEY","MAGICEDEN_API_KEY","SATFLOW_API_KEY"],description:"Read-only NFT lifecycle route discovery. It does not prepare, sign, or broadcast artifacts; callers must invoke and review the selected provider operation separately."});for(let[e,t,n]of[["universal-evm-nft-transfer","evm-nft-transfer","Exact unsigned ERC-721/ERC-1155 safeTransferFrom preparation."],["universal-solana-nft-transfer","solana-nft-transfer","Exact unsigned verified Metaplex NFT/Core transfer preparation."],["universal-ordinals-transfer","bitcoin-nft-transfer","Exact unsigned Ordinals PSBT transfer-plan preparation."]])T({id:e,venue:t,chainIds:[],auth:"none",ops:["health","prepare"],execution:"prepare",description:n});T({id:"contract-risk",venue:"onchain-bytecode",chainIds:[1,10,56,137,988,999,2741,4663,8453,42161,43114],auth:"none",ops:["health","scan"],execution:"read",baseEnv:[],description:"Structural contract risk from on-chain bytecode: retained owner powers (mint, blacklist, pause, fee changes) and upgradeability across EIP-1967, legacy zeppelinos, and EIP-1822 proxy slots. Complements behavioural sell simulation. Never reports 'safe' \u2014 a clean scan is weak evidence, not a guarantee."});T({id:"evm-token-sniper",venue:"evm-token-launches",chainIds:Da,auth:"none",ops:["health","scan"],execution:"prepare",localSignerSurfaces:["evm-swap"],baseEnv:Zt.flatMap(e=>e.rpcEnv),description:"One generic EVM token-sniping path across every configured EVM chain: live identity, pools, structural risk, sell simulation, quote, guarded transaction preparation, and local-signer execution handoff. Robinhood Chain is the default, not a special implementation."});T({id:"evm-rpc",venue:"evm",chainIds:[1,137,42161,8453,10,4663,999],auth:"none",ops:["health","healthAll","blockNumber","chainId","getBalance","call","erc20Allowance","erc20Balance","transactionReceipt"],baseEnv:["ETH_RPC_URL","POLYGON_RPC_URL","RH_CHAIN_RPC","BASE_RPC_URL","ARBITRUM_RPC_URL"],description:"EVM JSON-RPC multi-chain (env RPC or public fallbacks)"});T({id:"solana-rpc",venue:"solana",chainIds:[],auth:"none",ops:["health","latestBlockhash","getBalance","tokenAccounts","simulate"],baseEnv:["SOLANA_RPC_URL"],description:"Solana mainnet JSON-RPC read/prepare surface (no key, no signing, no broadcast)"});T({id:"bitcoin-esplora",venue:"bitcoin",chainIds:[],auth:"none",ops:["health","tipHeight","fees","address","utxos","tx","decode"],execution:"read-only",baseEnv:["BTC_ESPLORA_URL","BTC_NETWORK"],description:"Bitcoin L1 via Esplora (mempool.space/Blockstream). Reads only on data plane. User-signed broadcast is bitcoin_send on exec MCP. No Core RPC, no house keys. Wallets: Xverse/UniSat/Leather/OKX/Phantom"});T({id:"bitcoin-meta",venue:"bitcoin-metaprotocol",chainIds:[],auth:"optionalApiKey",ops:["health","runeBalances","inscriptions","inscriptionInfo","inscriptionChildren","ordBlockInfo"],execution:"read-only",baseEnv:["BTC_META_API_URL","UNISAT_API_KEY","BESTINSLOT_API_KEY"],description:"Bitcoin ordinals/runes reads. Keyless tier via ordinals.com recursive (inscriptionInfo/children/blockInfo); address-indexed ops (inscriptions, runeBalances) need a keyed indexer. Hiro is deprecated (410) and Magic Eden BTC is dead \u2014 use satflow for market."});T({id:"satflow",venue:"bitcoin-marketplace",chainIds:[],auth:"apiKey",ops:["health","collectionFloors","collectionStats","item","walletContents","floorListings","preparePurchase","prepareList"],execution:"prepare",localSignerSurfaces:["btc"],baseEnv:["SATFLOW_API_KEY","SATFLOW_API_URL"],description:"Satflow ordinals+runes marketplace (api.satflow.com). Primary BTC NFT market after Magic Eden BTC sunset. PSBT intents for buy/list; key via x-api-key."});T({id:"jupiter",venue:"solana-dex",chainIds:[],auth:"none",ops:["health","venues","quote","prepare"],execution:"prepare",localSignerSurfaces:["sol"],baseEnv:["JUPITER_SWAP_API_URL","SOLANA_RPC_URL"],description:"Jupiter Swap API v1 quote + local-signer Solana swap handoff"});T({id:"hl-perps",venue:"hyperliquid",chainIds:[],auth:"none",ops:["health","assetInfo","prepareOrder","prepareCancel","prepareLeverage","prepareIsolatedMargin","prepareBracket","prepareBuilderApproval"],execution:"prepare",localSignerSurfaces:["hl"],notes:"Hyperliquid perp, HIP-3, and HIP-4 outcome orders through local-signer L1 action handoff."});T({id:"hl-markets",venue:"hyperliquid",chainIds:[],auth:"none",ops:["health","markets","leaderboards","coin","spot"],notes:"Joined Hyperliquid market datapoints for the Hyperliquid agent. Read-only."});T({id:"hl-entry-state",venue:"hyperliquid",chainIds:[],auth:"none",ops:["health","see","qualify","lock","list","watch"],execution:"read-only",description:"SEE/ENTER/MANAGE for discretionary HL perps: compose sourced /info fields, qualify a side, lock the state only after a fill receipt, and alert_only-diff live vs that lock. Never signs."});T({id:"hl-staking",venue:"hypercore-staking",chainIds:[],auth:"none",ops:["health","validators","delegatorSummary","delegations","rewards","history","preflight","prepareStakeDeposit","prepareStakeWithdraw","prepareDelegate"],execution:"prepare",localSignerSurfaces:["hl"],baseEnv:["HL_INFO_URL","HL_EXCHANGE_URL","HL_TESTNET"],description:"Hyperliquid HyperCore HYPE staking. Public reads plus local-signer EIP-712 execution for cDeposit / cWithdraw / tokenDelegate after arming. Hosted/keyless remains prepare-only."});T({id:"magiceden-sol",venue:"solana-nft",chainIds:[],auth:"optionalApiKey",ops:["health","stats","listings","tokenListings","prepareBuy","prepareList","prepareMint"],execution:"prepare",baseEnv:["MAGICEDEN_API_KEY","MAGICEDEN_API_URL"],description:"Magic Eden Solana NFT market. Reads (stats/listings) are keyless; buy/list/mint instruction builders need MAGICEDEN_API_KEY and return an unsigned base64 transaction for the user's Solana wallet. Never signs or broadcasts."});T({id:"defillama",venue:"prices",chainIds:[],auth:"none",ops:["health","prices","pricesBySymbol","protocols","yields","stablecoins","dexVolumes"],baseEnv:["DEFILLAMA_COINS_URL","DEFILLAMA_API_URL"],description:"DeFiLlama public prices + protocols TVL"});T({id:"lifi",venue:"dex",chainIds:[1,10,56,137,988,999,2741,4663,8453,42161,43114],auth:"none",ops:["health","quote","prepare","chains"],execution:"prepare",baseEnv:["LIFI_API_URL"],description:"LI.FI public cross-chain / DEX aggregator quotes (no key)"});T({id:"dexscreener",venue:"dex",chainIds:[],auth:"none",ops:["health","token","search","pair"],baseEnv:["DEXSCREENER_API_URL"],description:"DexScreener public token/pair discovery"});T({id:"uniswap-v3",venue:"dex",chainIds:QS,auth:"none",ops:["health","quote","prepare","quotePath","ethUsdc","chains"],execution:"prepare",localSignerSurfaces:["evm-swap"],baseEnv:["ETH_RPC_URL","BASE_RPC_URL","ARBITRUM_RPC_URL","OPTIMISM_RPC_URL","BSC_RPC_URL","POLYGON_RPC_URL","AVALANCHE_RPC_URL","RH_CHAIN_RPC"],description:"Uniswap V3 QuoterV2 exact-in quotes via eth_call across official deployments plus Robinhood Chain, no key"});T({id:"lp-exit",venue:"dex",chainIds:ev,auth:"none",ops:["health","inspect","prepareRemove","prepareSettlement","prepareUnwrap","chains"],execution:"prepare",baseEnv:["ETH_RPC_URL","BASE_RPC_URL"],description:"Receipt-gated Uniswap V3 LP exit into native asset: remove/collect, net-route token legs, then unwrap. Unsigned only."});T({id:"lp-liquidity-ranker",venue:"dex",chainIds:Da,auth:"none",ops:["health","rank"],execution:"read-only",description:"Cross-chain LP destination analysis: deepest liquidity and net-best migration are separate, exact canonical mappings required."});T({id:"lp-destination-discovery",venue:"dex",chainIds:Da,auth:"none",ops:["health","discover"],execution:"read-only",description:"Live exact-address LP pool discovery across configured chains; reports deepest liquidity separately from cost-qualified migration evidence."});T({id:"uniswap-v4",venue:"dex",chainIds:ZS,auth:"none",ops:["health","quote","inspectHook","prepare","chains"],execution:"prepare",baseEnv:["ETH_RPC_URL","BASE_RPC_URL","ARBITRUM_RPC_URL","OPTIMISM_RPC_URL","BSC_RPC_URL","POLYGON_RPC_URL","AVALANCHE_RPC_URL","RH_CHAIN_RPC"],description:"Uniswap V4 quotes, hook permission/code/pool-state inspection, and guarded unsigned Universal Router preparation across official deployments plus Robinhood Chain."});T({id:"x402",venue:"payments",chainIds:[],auth:"none",ops:["health","inspect","prepare"],execution:"prepare",description:"x402 v2 PAYMENT-REQUIRED inspection and explicit-cap exact-payment templates. Never signs, calls a facilitator, or retries a paid request."});T({id:"bankr",venue:"wallet-data",chainIds:[],auth:"apiKey",ops:["health","wallet","portfolio","swapQuote"],execution:"read-only",baseEnv:["BANKR_API_KEY","BANKR_API_URL"],description:"Bankr Wallet API read-only identity, portfolio, and swap quotes. Oracle excludes Bankr swap, transfer, sign, submit, agent, and LLM endpoints."});T({id:"aerodrome",venue:"dex",chainIds:[8453],auth:"none",ops:["health","quote","prepare","chains"],execution:"prepare",localSignerSurfaces:["evm-swap"],baseEnv:["BASE_RPC_URL"],description:"Aerodrome Slipstream CL on Base \u2014 QuoterV2 + SwapRouter exact-input via eth_call (tickSpacing, no key)"});T({id:"zerox",venue:"dex",chainIds:[1,10,137,8453,42161],auth:"apiKey",ops:["health","price","quote","prepare"],execution:"prepare",baseEnv:["ZEROX_API_KEY","ZEROX_API_URL"],description:"0x Swap API v2 price/quote/prepare \u2014 requires ZEROX_API_KEY (unconfigured without key; no Oracle key shipped)"});T({id:"across",venue:"bridge",chainIds:[1,10,137,42161,8453],auth:"none",ops:["health","suggestedFees"],baseEnv:["ACROSS_API_URL"],description:"Across bridge suggested-fees (public)"});T({id:"hop",venue:"bridge",chainIds:[1,10,137,42161],auth:"none",ops:["health","quote"],baseEnv:["HOP_API_URL"],description:"Hop Protocol bridge quotes (public)"});T({id:"relay",venue:"bridge",chainIds:[1,10,137,8453,42161],auth:"none",ops:["health","quote","prepare"],execution:"prepare",baseEnv:["RELAY_API_URL"],description:"Relay.link bridge/swap quotes (public)"});T({id:"cowswap",venue:"dex",chainIds:[1,100,42161,8453],auth:"none",ops:["health","quote","prepareOrder","order","status","chains","arm"],execution:"armed-local",localSignerSurfaces:["evm-order"],baseEnv:[],description:"CowSwap batch auction. Quote is public; Allow posts official api.cow.fi orders."});T({id:"oneinch",venue:"dex",chainIds:[1,10,137,8453,42161],auth:"apiKey",ops:["health","quote","prepare","approveSpender"],execution:"prepare",baseEnv:["ONEINCH_API_KEY","ONEINCH_API_URL"],description:"1inch Swap API v6 quote/prepare \u2014 requires ONEINCH_API_KEY (unconfigured without key; no Oracle key shipped)"});T({id:"hl-ws",venue:"hl",chainIds:[],auth:"none",ops:["health","allMids","l2Book","snapshot"],baseEnv:["HL_WS_URL"],description:"Hyperliquid short-lived WS snapshots (allMids/l2Book)"});T({id:"poly-ws",venue:"poly",chainIds:[137],auth:"none",ops:["health","book","snapshot"],baseEnv:["POLY_WS_URL"],description:"Polymarket CLOB short-lived WS market snapshots"});T({id:"anvil-nft",venue:"robinhood-nft",chainIds:[4663],auth:"optionalApiKey",ops:["health","markets","quoteSpecificBuy","quoteSell","scanCollection","scanAllMarkets","scanCrossVenueArb","scanAllMarketsArb","prepareSpecificBuy","prepareSell"],execution:"prepare",localSignerSurfaces:["evm-nft"],baseEnv:["RH_CHAIN_RPC","OPENSEA_API_KEY","OPENSEA_ENV_FILE"],description:"All-market Anvil discovery and exact-token arbitrage, with exact buy and sell execution through the armed owner-local signer after human confirmation"});T({id:"stonkbrokers",venue:"robinhood-nft",chainIds:[4663],auth:"optionalApiKey",ops:["health","quoteBrokerBuy","scanBrokerLoot","prepareBrokerBuy","brokerDesk","clockInStatus","prepareClockIn"],execution:"prepare",baseEnv:["RH_CHAIN_RPC"],description:"Unsigned StonkBrokers Broker Desk discovery, nested-loot verification, and bounded local-only preparations"});T({id:"opensea-nft",venue:"nft",chainIds:tv,auth:"apiKey",ops:["health","collection","floor","bestListings","bestListing","bestOffer","accountNfts","accountPnl","prepareMint","prepareList","prepareCancel"],execution:"prepare",baseEnv:["OPENSEA_API_KEY","OPENSEA_ENV_FILE"],description:"OpenSea multichain NFT inventory, floors, and unsigned bounded mint, listing, and listing-cancellation preparations; opaque buy/sweep fulfillment is disabled"});T({id:"local-marketplace",venue:"local-p2",chainIds:[],auth:"none",ops:["health","createListing","listListings","cancelListing","createOffer","armFill"],execution:"prepare",localSignerSurfaces:["evm-nft"],description:"Owner-local P2 catalog stored under ~/.config/oracle. Additive and isolated from OpenSea, Magic Eden, Satflow, Bisq, Anvil, and Polymarket. Listings are armed for the owner-local signer; sign-and-broadcast is an explicit createLocalMarketplace().instructFill instruction. Generic signHash is refused."});T({id:"local-x402",venue:"local-x402",chainIds:[],auth:"none",ops:["health","createIntent","listIntents","cancelIntent","armPayment"],execution:"prepare",localSignerSurfaces:["evm-swap"],description:"Owner-local x402 payment budgets under ~/.config/oracle. Additive and isolated from OpenSea and Telegram. Intents are armed; sign-and-broadcast is an explicit createLocalX402().instructPay instruction. Generic signHash is refused."});T({id:"local-pack-registry",venue:"local-packs",chainIds:[],auth:"none",ops:["health","registerPack","listPacks","revokePack"],execution:"read-only",description:"Owner-local third-party pack REGISTRY under ~/.config/oracle. Catalog only: packs are never loaded or executed. Isolated from OpenSea and Telegram."});T({id:"erc8004-identity",venue:"agent-identity",chainIds:[],auth:"none",ops:["health","prepareIdentityRegistration","prepareAgentURIUpdate","inspectIdentity","arm"],execution:"armed-local",localSignerSurfaces:["evm"],baseEnv:["ORACLE_ERC8004_CHAIN_ID","ORACLE_ERC8004_IDENTITY_REGISTRY"],description:"Draft ERC-8004 identity. Public prepare is keyless; Allow broadcasts type-2 register/setAgentURI."});T({id:"hyperevm-dex",venue:"hyperevm",chainIds:[999],auth:"none",ops:["health","search","token"],baseEnv:["HYPEREVM_RPC_URL"],description:"HyperEVM pair discovery via DexScreener + optional RPC"});T({id:"geckoterminal",venue:"dex-data",chainIds:[],auth:"none",ops:["health","networks","pool","token","ohlcv"],baseEnv:["GECKOTERMINAL_API_URL"],description:"GeckoTerminal public networks, pools, tokens, and OHLCV"});T({id:"curve",venue:"dex",chainIds:[1,10,56,137,988,999,4663,8453,42161,43114],auth:"none",ops:["health","openapi","pools","quote","prepare"],execution:"prepare",baseEnv:["CURVE_API_URL"],description:"Curve public pool registry API + RouterNG validated single-hop prepare"});T({id:"gmx",venue:"perps-data",chainIds:[42161,43114],auth:"none",ops:["health","tickers","markets","marketsInfo","tokens","prepareOrder","positions","orderStatus","verifyOrder"],execution:"intent",baseEnv:[],description:"GMX v2 public oracle/markets plus guarded async order intents on Arbitrum and Avalanche"});T({id:"morpho",venue:"lending-data",chainIds:[1,10,137,2741,8453,42161,4663,999,988],auth:"none",ops:["health","markets","vaults","prepareVault"],execution:"intent",baseEnv:["MORPHO_API_URL"],description:"Morpho public GraphQL markets/vaults + guarded ERC-4626 vault intents"});T({id:"balancer",venue:"dex",chainIds:[1,10,137,42161,43114,8453],auth:"none",ops:["health","pools","quote","prepare"],execution:"prepare",baseEnv:["BALANCER_API_URL"],description:"Balancer public GraphQL pool data + v3 Router exact-input prepare (Polygon read-only)"});T({id:"pendle",venue:"yield",chainIds:[1,10,56,8453,42161,999],auth:"none",ops:["health","markets","quote","prepare"],execution:"prepare",baseEnv:["PENDLE_API_URL"],description:"Pendle public yield-market API + Hosted SDK direct Convert prepare"});T({id:"odos",venue:"dex",chainIds:[1,10,56,137,8453,42161,43114,4663],auth:"none",ops:["health"],execution:"unavailable",deprecated:{since:"2026-07-30",reason:"Odos sunset the public SOR API; /sor/quote/v2 and v3 both return 410 Gone",evidence:"sunset: Thu, 30 Jul 2026 12:00:00 GMT response header"},baseEnv:["ODOS_API_URL"],description:"Odos public SOR (DEPRECATED upstream 2026-07-30 -- endpoint returns 410)"});T({id:"blockscout",venue:"explorer",chainIds:[1,10,137,8453,42161],auth:"none",ops:["health","stats","address","token"],baseEnv:[],description:"Verified public Blockscout REST v2 instances"});T({id:"paraswap",venue:"dex",chainIds:[1,10,56,137,8453,42161,43114,4663],auth:"none",ops:["health","tokens","price","quote","prepare"],execution:"prepare",baseEnv:["PARASWAP_API_URL"],description:"ParaSwap/Velora public price routes + validated transaction builder"});T({id:"rfq",venue:"intent-rfq",chainIds:[1,10,56,137,8453,42161,43114,4663],auth:"none",ops:["health","intent","quote"],execution:"prepare",baseEnv:["ZEROX_API_KEY","ONEINCH_API_KEY"],description:"Cross-chain RFQ intent normalizer and firm-quote fanout over reviewed venues. Prepares artifacts only, never signs or broadcasts."});T({id:"execution-strategies",venue:"oracle-native",chainIds:[],auth:"none",ops:["health","plan"],execution:"plan-only",baseEnv:[],description:"Oracle-native TWAP, VWAP, POV, iceberg, and implementation-shortfall planners. No Tread.fi/API dependency. Plans never sign or broadcast; every slice requires a fresh best-execution quote, policy check, simulation, confirmation, wallet signature, and receipt."});T({id:"polygon-staking",venue:"polygon-staking",chainIds:[137],auth:"none",ops:["health","validators","validatorDetail"],baseEnv:["POLYGON_STAKING_API_URL"],description:"Polygon POS staking validators"});T({id:"babylon-staking",venue:"btc-staking",chainIds:[],auth:"none",ops:["health","stats","finalityProviders","delegations"],execution:"read-only",baseEnv:["BABYLON_STAKING_API_URL"],description:"Babylon native BTC staking (staking-api.babylonlabs.io v2). Keyless per-staker positions from a PUBLIC key alone \u2014 APR, TVL, finality-provider roster, and delegations. Read-only; staking/unbonding is user-wallet."});T({id:"mempool-mining",venue:"btc-mining",chainIds:[],auth:"none",ops:["health","difficulty","poolShare","hashrate","rewardStats"],execution:"read-only",baseEnv:["MEMPOOL_API_URL"],description:"Bitcoin mining + network security telemetry via mempool.space /api/v1/mining. Difficulty retarget, pool concentration (top-1/top-3 share), hashrate trend, subsidy-vs-fee split."});T({id:"liquid-esplora",venue:"liquid",chainIds:[],auth:"none",ops:["health","tipHeight","addressInfo","assetInfo"],execution:"read-only",baseEnv:["LIQUID_ESPLORA_URL"],description:"Liquid Network (Blockstream sidechain) via Esplora. Same schema as bitcoin-esplora plus multi-asset issuance/peg stats. Confidential addresses return TXO counts only \u2014 amounts are blinded on chain and reported as such."});T({id:"hiro-stacks",venue:"stacks",chainIds:[],auth:"none",ops:["health","networkInfo","stackingInfo","poxCycles","blocks"],execution:"read-only",baseEnv:["HIRO_API_URL","HIRO_API_KEY"],description:"Stacks (Bitcoin L2) via Hiro public API. Network tip, PoX stacking state (the BTC-yield mechanism), and historical reward cycles. Keyless tier is ~20 rps; HIRO_API_KEY is optional and never required."});T({id:"tron-public",venue:"tron",chainIds:[],auth:"none",ops:["health","account","trc20Balances","trc20Transfers","chainParameters"],execution:"read-only",localSignerSurfaces:[],baseEnv:["TRON_API_URL","TRONGRID_API_KEY"],description:"Tron mainnet via public TronGrid. TRX balance, TRC20 token balances, USDT-TRC20 transfer history, chain parameters. Tron carries the largest USDT float of any chain. Keyless; TRONGRID_API_KEY only raises the rate ceiling and never travels to a non-TronGrid host."});T({id:"ton-public",venue:"ton",chainIds:[],auth:"none",ops:["health","accountState","jettonBalances","transactions"],execution:"read-only",localSignerSurfaces:[],baseEnv:["TON_API_URL","TONCENTER_API_KEY"],description:"TON via public toncenter. Account state + nanoton balance, jetton (TON's ERC20) balances, transaction history. The settlement layer for Telegram-native assets. Keyless; TONCENTER_API_KEY only raises the rate ceiling."});T({id:"cosmos-lcd",venue:"cosmos",chainIds:[],auth:"none",ops:["health","chains","balances","delegations","denomTrace"],execution:"read-only",localSignerSurfaces:[],baseEnv:["COSMOS_LCD_URL","COSMOS_CHAIN"],description:"Cosmos SDK chains via keyless LCD/REST \u2014 one provider, many chains (cosmoshub default, plus osmosis/celestia/injective/neutron/dydx/noble/kava, or any LCD via COSMOS_LCD_URL_<CHAIN>). Bank balances, staking delegations + unbondings + rewards, and IBC denom-trace resolution for ibc/<hash> denoms."});T({id:"sui-public",venue:"sui",chainIds:[],auth:"none",ops:["health"],execution:"unavailable",deprecated:{since:"2026-08-25",reason:"Sui public fullnodes return JSON-RPC -32601 because the JSON-RPC surface is deprecated",evidence:"Migrate the provider to Sui GraphQL or gRPC before restoring it to the live roster"},localSignerSurfaces:[],baseEnv:["SUI_RPC_URL"],description:"QUARANTINED: Sui public JSON-RPC is deprecated. A GraphQL or gRPC replacement has not shipped."});T({id:"aptos-public",venue:"aptos",chainIds:[],auth:"none",ops:["health","account","resources","coinBalances"],execution:"read-only",localSignerSurfaces:[],baseEnv:["APTOS_FULLNODE_URL","APTOS_API_KEY"],description:"Aptos mainnet via the public fullnode REST API. Ledger info, account sequence/auth key, Move resources, and coin balances (0x1::coin::balance view with a CoinStore resource fallback). Read-only; the transaction submit door is never called."});T({id:"ordinals-runes",venue:"btc-runes",chainIds:[],auth:"none",ops:["health","blockHeight","blockInfo","satInfo","runeInfo"],execution:"read-only",baseEnv:["ORDINALS_BASE_URL"],description:"Runes + sat/block index via a public ord server (ordinals.com). /r/blockheight is PLAIN TEXT; the /runes listing is 406 'JSON API disabled' so only per-rune lookup exists; rune names must drop the bullet spacer (UNCOMMONGOODS)."});T({id:"mempool-lightning",venue:"btc-lightning",chainIds:[],auth:"none",ops:["health","statistics","nodeRankings","nodeCountries"],execution:"read-only",baseEnv:["MEMPOOL_API_URL"],description:"Lightning Network topology via mempool.space. Capacity/channel/node aggregates, node rankings, country distribution. STALE-PRONE: the crawler snapshot has been observed weeks behind, so every response carries ageDays + a stale flag."});T({id:"bob-rootstock",venue:"btc-l2",chainIds:[60808,30],auth:"none",ops:["health","stats","addressInfo","tokenBalances"],execution:"read-only",baseEnv:["BOB_EXPLORER_URL","ROOTSTOCK_EXPLORER_URL"],description:"BOB (60808) and Rootstock (30) \u2014 the EVM Bitcoin L2s \u2014 via their Blockscout v2 instances (identical schema, one code path). Chain stats, gas prices, native balances, token holdings. Pass chainId 'all' to fan out."});T({id:"bisq-markets",venue:"bisq",chainIds:[],auth:"none",ops:["health","markets","ticker","trades"],execution:"read-only",baseEnv:["BISQ_MARKETS_URL"],description:"Bisq non-KYC P2P BTC price discovery (markets.bisq.network). Value is the BASIS against centralized spot, not the absolute print: volume is thin and the last trade can be hours old, so trade age is always reported."});T({id:"social-intel",venue:"oracle-social",chainIds:[],auth:"none",ops:["health","trendingTokens","trendingCas","keywordMentions","smartAccounts","narratives"],execution:"read-only",localSignerSurfaces:[],baseEnv:["ORACLE_SOCIAL_INTEL_STORE","ORACLE_SOCIAL_INTEL_STALE_MIN"],description:"Local curated-account crypto social intelligence. Sample = graded caller list, NOT a firehose; every response reports sample size and snapshot age."});T({id:"magiceden-ordinals",venue:"btc-ordinals-market",chainIds:[],auth:"none",ops:["health","collectionStat"],execution:"read-only",baseEnv:["MAGICEDEN_ORD_API_URL","MAGICEDEN_API_KEY","MAGICEDEN_PROBE_COLLECTION"],description:"Magic Eden ordinals collection stats. DEGRADED UPSTREAM: /v2/ord/btc/* returned 503 'no healthy upstream' on every verification attempt. health() reports ok:false while it is down and collectionStat() returns upstreamDown:true with fallback 'satflow' instead of throwing. Only /stat is wired; 600 req/min documented."});T({id:"braiins-insights",venue:"btc-mining",chainIds:[],auth:"none",ops:["health","priceStats","poolStats"],execution:"read-only",baseEnv:["BRAIINS_INSIGHTS_URL"],description:"Braiins mining insights \u2014 BTC price tick + per-pool block/hashrate distribution. Use insights.braiins.com (302s to learn.braiins.com, followed transparently); pool.braiins.com/api is 403 and is NOT the public API."});T({id:"pyth-price-feeds",venue:"solana-oracle",chainIds:[],auth:"none",ops:["health","latestPrice","latestPrices","feedDirectory"],baseEnv:["PYTH_HERMES_URL"],description:"Pyth Network: Solana price feeds with confidence intervals, real-time updates, zero auth"});T({id:"solend-lending",venue:"solana-lending",chainIds:[],auth:"none",ops:["health","markets","reserves"],baseEnv:["SAVE_API_URL"],description:"Solend/Save lending: markets + per-reserve supply/borrow APY, Solana's Aave equivalent (keyless)"});T({id:"jito-mev",venue:"solana-mev",chainIds:[],auth:"none",ops:["health","recentBundles","tipFloor"],baseEnv:["JITO_API_URL"],description:"Jito MEV: recent bundles, tippers, tip floor \u2014 real-time Solana MEV data (keyless)"});T({id:"sanctum-lst",venue:"solana-staking",chainIds:[],auth:"none",ops:["health","lstList","apyAll","apyIndividual"],baseEnv:["SANCTUM_API_URL"],description:"Sanctum LST: liquid staking tokens with per-token APY \u2014 JitoSOL, mSOL, bSOL, compSOL, pathSOL, etc. (keyless)"});T({id:"kamino-strategies",venue:"solana-yield",chainIds:[],auth:"none",ops:["health","strategies","strategyMetrics"],baseEnv:["KAMINO_API_URL"],description:"Kamino: live yield strategies with APY, TVL, vault balances (keyless)"});T({id:"meteora-dlmm",venue:"solana-dex",chainIds:[],auth:"none",ops:["health","pools","poolSearch"],baseEnv:["METEORA_API_URL"],description:"Meteora DLMM: concentrated liquidity pools via amm-v2 API, distinct from Jupiter DEX routes (keyless)"});T({id:"aave-v3",venue:"evm-lending",chainIds:[1,10,56,137,59144,1088,534352,8453,42161,43114,5e3,1868],auth:"none",ops:["health","markets","marketReserves","chains"],baseEnv:["AAVE_V3_API_URL"],description:"Aave V3 GraphQL: multi-chain lending, full market + reserve schema with supplyInfo/borrowInfo (keyless)"});T({id:"cow-protocol",venue:"evm-intent",chainIds:[1,100,42161],auth:"none",ops:["health","auction","openOrders","recentTrades"],baseEnv:["COW_API_URL"],description:"CoW Protocol: intent/solver auction data, open orders, trades \u2014 intent-based DEX not covered by existing providers (keyless)"});T({id:"relayscan-mev",venue:"evm-mev",chainIds:[1],auth:"none",ops:["health","overview","builderProfit","dailyStats"],baseEnv:["RELAYSCAN_API_URL"],description:"Relayscan: MEV relay overview, builder profit rankings, daily block stats (keyless)"});T({id:"birdeye-tokens",venue:"solana-tokens",chainIds:[],auth:"none",ops:["health","tokenList"],baseEnv:["BIRDEYE_API_URL"],description:"Birdeye public token list: Solana tokens ranked by 24h volume, market cap (keyless)"});T({id:"das-assets",venue:"solana-nft",chainIds:[],auth:"none",ops:["health","assetsByOwner","searchAssets","assetProof"],baseEnv:["SOLANA_RPC_URL"],description:"Digital Asset Standard (DAS): compressed NFT reads via public Solana RPC \u2014 getAssetsByOwner, searchAssets, assetProof. No Helius key needed."});T({id:"symbiotic-restaking",venue:"evm-restaking",chainIds:[1],auth:"none",ops:["health","vaults","vaultDetail"],baseEnv:["SYMBIOTIC_API_URL"],description:"Symbiotic restaking: vaults with collateral data, approved status, operator metadata (keyless)"});T({id:"beefy-yields",venue:"evm-yield",chainIds:[1,10,56,137,8453,42161,43114,250,1088],auth:"none",ops:["health","apy","apyBreakdown"],baseEnv:["BEEFY_API_URL"],description:"Beefy Finance: cross-chain yield aggregator vaults with APY breakdowns (keyless)"});T({id:"across-bridge",venue:"evm-bridge",chainIds:[1,10,42161,8453,324,59144],auth:"none",ops:["health","pools","suggestedFees"],baseEnv:["ACROSS_API_URL"],description:"Across bridge: pool liquidity + APY per bridge pool with suggested fees (keyless)"});T({id:"spark-lend",venue:"evm-lending",chainIds:[1],auth:"none",ops:["health","markets"],baseEnv:["SPARK_API_URL"],description:"Spark Lend / Sky Savings: ERC-4626 vault APY + TVL + user count (keyless)"});T({id:"l2beat-tvl",venue:"evm-l2",chainIds:[],auth:"none",ops:["health","tvl","activity"],baseEnv:["L2BEAT_API_URL"],description:"L2Beat: L2 scaling TVL, project-level breakdowns, activity metrics (keyless)"});T({id:"celestia-da",venue:"evm-da",chainIds:[],auth:"none",ops:["health","stats","blockStats"],baseEnv:["CELENIUM_API_URL"],description:"Celestia DA via Celenium: blob stats, block-level blob counts, network metrics (keyless)"});T({id:"limit-order",venue:"1inch-lop",chainIds:[1,10,56,137,8453,42161],auth:"none",ops:["health","prepare","arm"],execution:"armed-local",localSignerSurfaces:["evm-order"],description:"1inch Limit Order Protocol v4. Queues on the local signer; Allow posts the order."});T({id:"jupiter-dca",venue:"jupiter",chainIds:[],auth:"none",ops:["health","prepare","arm"],execution:"armed-local",localSignerSurfaces:["sol"],description:"Jupiter limit/DCA. Unsigned tx queues on the sol signer; Allow submits."});T({id:"protective-monitors",venue:"oracle-intel",chainIds:[],auth:"none",ops:["health","depeg","oracleDeviation","exploitFeed","goplus","liquidationLadder"],execution:"read-only",description:"Alert-only depeg, oracle deviation, exploit feed, GoPlus second opinion, liquidation ladder."});T({id:"funding-scanner",venue:"perps",chainIds:[],auth:"none",ops:["health","scan"],execution:"read-only",description:"Cross-venue funding carry ranked net of fee drag. Failed venues stay FAILED."});T({id:"perp-universal",venue:"perps",chainIds:[],auth:"none",ops:["health","fundingAll","prepareOrder"],execution:"prepare-only",description:"Live fundingAll across HL/GMX/dYdX + honest FAILED Drift/Vertex. prepareOrder unsigned."});T({id:"onchain-options",venue:"options",chainIds:[],auth:"none",ops:["health","rank"],execution:"read-only",description:"Local Black-Scholes ranking. No arm until official Derive/Lyra domain is pinned."});T({id:"holder-clusters",venue:"oracle-intel",chainIds:[],auth:"none",ops:["health","score"],execution:"read-only",description:"Heuristic holder HHI + common-funding clusters. Not identity."});T({id:"kalshi",venue:"prediction",chainIds:[],auth:"none",ops:["health","markets"],execution:"read-only",description:"Kalshi market catalog read-only. Trading may be US-restricted. Prepare refused."});T({id:"derive-options",venue:"options",chainIds:[],auth:"none",ops:["health"],execution:"unavailable",deprecated:{since:"2026-08-25",reason:"No official Derive EIP-712 domain or contract is pinned, so prepare remains unavailable",evidence:"prepareOption() in onchain-options.mjs refuses unconditionally"},description:"UNAVAILABLE: Derive execution has no pinned official domain. Use onchain-options for local ranking."});T({id:"limitless",venue:"prediction",chainIds:[],auth:"none",ops:["health","markets"],execution:"read-only",description:"Limitless market catalog. Prepare refused \u2014 no grant-bound decoder."});T({id:"dov-vaults",venue:"options",chainIds:[],auth:"none",ops:["health"],execution:"unavailable",deprecated:{since:"2026-08-25",reason:"The reviewed DOV vault registry is empty, so every vault read refuses",evidence:"REVIEWED_DOV_VAULTS.length is zero and no reviewed code hash is pinned"},description:"UNAVAILABLE: the reviewed DOV vault registry is empty and every read fails closed."});T({id:"prediction-match",venue:"prediction",chainIds:[],auth:"none",ops:["health","match"],execution:"read-only",description:"Cross-venue event match. Same title is not a match."});T({id:"tee-attestation",venue:"identity",chainIds:[],auth:"none",ops:["health","verify"],execution:"read-only",description:"TEE schema stub. Hardware unavailable. Unknown root unverified."});T({id:"keeper-mirror",venue:"oracle-intel",chainIds:[],auth:"none",ops:["health"],execution:"read-only",description:"Keeper alert-mirror. Off by default. No execute path."});T({id:"erc7715-permissions",venue:"aa",chainIds:[],auth:"none",ops:["health","normalize"],execution:"read-only",description:"ERC-7715 permission normalize. Wildcards refused. aa allowlist empty."});T({id:"erc7710-delegation",venue:"aa",chainIds:[],auth:"none",ops:["health","inspect"],execution:"read-only",description:"ERC-7710 delegation inspect. Missing revocation/expiry fails closed."});T({id:"binance-public",venue:"cex",chainIds:[],auth:"none",ops:["health","ticker","orderbook","funding","markPrice","openInterest","fundingHistory"],execution:"read-only",localSignerSurfaces:[],baseEnv:["BINANCE_API_URL","BINANCE_FAPI_URL"],description:"Binance public spot + USD-M perp market data (ticker, depth, premiumIndex funding, open interest). Keyless reads only; no trading endpoints."});T({id:"okx-public",venue:"cex",chainIds:[],auth:"none",ops:["health","ticker","orderbook","funding","markPrice","openInterest"],execution:"read-only",localSignerSurfaces:[],baseEnv:["OKX_API_URL"],description:"OKX public v5 market data (ticker, books, swap funding-rate, mark-price, open-interest). Keyless reads only; no trading endpoints."});T({id:"bybit-public",venue:"cex",chainIds:[],auth:"none",ops:["health","ticker","orderbook","funding","markPrice","openInterest","fundingHistory"],execution:"read-only",localSignerSurfaces:[],baseEnv:["BYBIT_API_URL"],description:"Bybit public v5 market data (spot/linear tickers, orderbook, funding, open interest). Keyless reads only; no trading endpoints."});T({id:"cex-basis",venue:"cex",chainIds:[],auth:"none",ops:["health","basis","fundingSpread","legs"],execution:"read-only",localSignerSurfaces:[],baseEnv:["BINANCE_API_URL","OKX_API_URL","BYBIT_API_URL","HL_INFO_URL"],description:"Cross-venue perp basis and annualized funding spreads across Binance, OKX, Bybit and Hyperliquid public data. Analysis only, no sizing and no prepare."});T({id:"snapshot-governance",venue:"governance",chainIds:[],auth:"none",ops:["health","spaces","proposals","activeProposals","proposal","votes","votingPower"],execution:"read-only",localSignerSurfaces:[],baseEnv:["SNAPSHOT_API_URL"],description:"Snapshot.org off-chain governance reads: spaces, proposals, proposal detail, an address's votes and voting power. Never signs a vote."});T({id:"tally-governance",venue:"governance",chainIds:[1,10,42161],auth:"none",ops:["health","governors","info","proposals","proposal","voterStatus","tallyProposals"],execution:"read-only",localSignerSurfaces:[],baseEnv:["TALLY_API_URL","TALLY_API_KEY"],description:"Governor Bravo / OZ Governor on-chain proposal state and vote tallies for major DAOs, plus optional keyed Tally metadata. Read-only ABI has no vote/queue/execute selector."});T({id:"launch-radar",venue:"launch-radar",chainIds:[],auth:"none",ops:["health","status","snapshot","candidates","rpcHealth","evaluateStrategy"],execution:"read-only",localSignerSurfaces:[],baseEnv:["ORACLE_CONFIG_DIR","LAUNCH_RADAR_STORE_PATH"],description:"Read-only Launch Radar data plane: durable shadow-cycle status/snapshot from local disk, plus pure candidate normalization, RPC-sample ranking, and strategy-policy evaluation over caller-supplied inputs. Shadow-only, unfunded, no signer, no broadcast."});T({id:"stablecoin-peg",venue:"oracle-intel",chainIds:[],auth:"none",ops:["health","scan"],execution:"read-only",localSignerSurfaces:[],baseEnv:[],description:"Peg-deviation scan across major and Hyperliquid-native stables. Ranks by absolute bps from $1 and classifies normal/watch/warn/depeg. Unpriced is unknown, never on-peg. Read-only composition of DefiLlama/Pyth/DexScreener."});nv();import $v from"node:os";import Jp from"node:path";import qp from"node:fs";import av from"node:path";import{createHash as rv}from"node:crypto";var ov="sha256:"+"0".repeat(64);function Lp(e){if(e&&typeof e=="object"&&!Object.isFrozen(e)){for(let t of Object.values(e))Lp(t);Object.freeze(e)}return e}function Fa(e){return Array.isArray(e)?`[${e.map(Fa).join(",")}]`:e&&typeof e=="object"?`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${Fa(e[t])}`).join(",")}}`:JSON.stringify(e)}function iv(e){return`sha256:${rv("sha256").update(Fa(e)).digest("hex")}`}function sv(e,t,n){if(!e||typeof e!="object"||Array.isArray(e))throw new TypeError("evidence event must be an object");if(typeof e.id!="string"||e.id.length===0)throw new TypeError("evidence event id must be non-empty");if(typeof e.type!="string"||e.type.length===0)throw new TypeError("evidence event type must be non-empty");if(typeof e.at!="string"||!Number.isFinite(Date.parse(e.at))||new Date(e.at).toISOString()!==e.at)throw new TypeError("evidence event at must be an exact ISO instant");if(!e.data||typeof e.data!="object"||Array.isArray(e.data))throw new TypeError("evidence event data must be an object");return{sequence:t,id:e.id,type:e.type,at:e.at,data:structuredClone(e.data),previousDigest:n}}function $p(e=[]){if(!Array.isArray(e))throw new TypeError("evidence records must be an array");let t=new Set,n=ov,r=e.map((o,i)=>{if(t.has(o?.id))throw new Error(`duplicate evidence event id: ${o.id}`);t.add(o?.id);let s=sv(o,i+1,n),a=iv(s);if(o.sequence!==i+1||o.previousDigest!==n||o.digest!==a)throw new Error(`evidence digest chain mismatch at sequence ${i+1}`);return n=a,{...s,digest:a}});return Lp(r)}var cv=1;function ki(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)&&Object.getPrototypeOf(e)===Object.prototype}function uv(e){return structuredClone(e)}function ja(e,t="state"){if(!(e===null||typeof e=="string"||typeof e=="boolean")&&!(typeof e=="number"&&Number.isFinite(e))){if(Array.isArray(e))return e.forEach((n,r)=>ja(n,`${t}[${r}]`));if(ki(e)){for(let[n,r]of Object.entries(e)){if(r===void 0)throw new Error(`launch-radar store: non-JSON value at ${t}.${n}`);ja(r,`${t}.${n}`)}return}throw new Error(`launch-radar store: non-JSON value at ${t}`)}}function lv(e){if(!ki(e)||!["shadow","armed","autonomous"].includes(e.mode)||typeof e.status!="string"||typeof e.ambiguous!="boolean")throw new Error("launch-radar store: corrupt strategy status shape")}function dv(e){if(!ki(e)||e.version!==cv)throw new Error("launch-radar store: corrupt or unsupported version");if(!Array.isArray(e.candidates)||!(e.cursor===null||ki(e.cursor))||!Array.isArray(e.evidence))throw new Error("launch-radar store: corrupt state shape");lv(e.strategyStatus),ja(e);try{$p(e.evidence)}catch(t){throw new Error(`launch-radar store: corrupt evidence: ${t.message}`)}return uv(e)}function pv(e,t=!1){let n;try{n=qp.lstatSync(e)}catch(r){if(t&&r?.code==="ENOENT")return!1;throw r}if(n.isSymbolicLink())throw new Error("launch-radar store: path must not be a symlink");if(!n.isFile())throw new Error("launch-radar store: path must be a regular file");if((n.mode&511)!==384)throw new Error("launch-radar store: existing file permissions must be 0600");return!0}function fv(e){pv(e);let t;try{t=JSON.parse(qp.readFileSync(e,"utf8"))}catch{throw new Error("launch-radar store: corrupt JSON")}return dv(t)}function Bp(e={}){let t=e.path;if(typeof t!="string"||!av.isAbsolute(t))throw new Error("launch-radar store: path must be absolute");return fv(t)}var Wr=Object.freeze({PASS:"PASS",WARN:"WARN",BLOCK:"BLOCK",UNKNOWN:"UNKNOWN"}),mv=new Set(["LIVE","CACHED","STALE","UNKNOWN","UNAVAILABLE"]),Up=/^0x[0-9a-fA-F]{40}$/;function Wn(e){if(e&&typeof e=="object"&&!Object.isFrozen(e)){for(let t of Object.values(e))Wn(t);Object.freeze(e)}return e}function wt(e,t=null){return e&&typeof e=="object"?structuredClone(e):t}function Dp(e){return typeof e!="string"||!Number.isFinite(Date.parse(e))?null:new Date(e).toISOString()===e?e:null}function Mp(e){return!!(e&&mv.has(e.evidence)&&Dp(e.observedAt))}function Fp(e){return!e||e.status!=="KNOWN"||e.amount===null||e.amount===void 0||e.amount===""?{status:"UNKNOWN",amount:null,unit:e?.unit??null}:{status:"KNOWN",amount:String(e.amount),unit:e.unit??null}}function Ii(e){return[...new Set(e.filter(Boolean))]}function hv(e={}){let t=[],n=[],r=[];(e.venue?.supported!==!0||e.venue?.verified!==!0)&&t.push("unsupported venue"),e.signal?.unsolicitedAirdrop===!0&&t.push("unsolicited airdrop is not a held or eligible candidate"),e.risk?.verdict==="FAIL"&&t.push("risk verdict is FAIL"),e.sellability?.verdict==="FAIL"&&t.push("sellability verdict is FAIL"),e.route?.status==="BLOCK"&&t.push("route is blocked");for(let[i,s]of[["token",e.token],["venue",e.venue],["signal",e.signal],["risk",e.risk],["sellability",e.sellability],["route",e.route]])!Mp(s)||s.evidence==="UNKNOWN"||s.evidence==="UNAVAILABLE"?n.push(`${i} evidence is missing or unavailable`):(s.evidence==="CACHED"||s.evidence==="STALE")&&r.push(`${i} evidence is ${s.evidence}`);(!e.pool||!Mp(e.pool))&&n.push("pool evidence is missing or unavailable"),(!e.risk||!["PASS","CAUTION","FAIL"].includes(e.risk.verdict))&&n.push("risk verdict is UNKNOWN"),(!e.sellability||!["PASS","CAUTION","FAIL"].includes(e.sellability.verdict))&&n.push("sellability verdict is UNKNOWN"),(!e.route||!["PASS","WARN","BLOCK"].includes(e.route.status))&&n.push("route status is UNKNOWN"),Fp(e.route?.cost).status==="UNKNOWN"&&n.push("route cost is UNKNOWN"),e.risk?.verdict==="CAUTION"&&r.push("risk verdict is CAUTION"),e.sellability?.verdict==="CAUTION"&&r.push("sellability verdict is CAUTION"),e.route?.status==="WARN"&&r.push("route status is WARN");let o=Ii(t);return o.length?Wn({status:Wr.BLOCK,whyBlocked:o}):n.length?Wn({status:Wr.UNKNOWN,whyBlocked:Ii(n)}):r.length?Wn({status:Wr.WARN,whyBlocked:[],warnings:Ii(r)}):Wn({status:Wr.PASS,whyBlocked:[]})}function yv(e={}){let t=wt(e,{}),n=Object.fromEntries(Object.entries(t).map(([o,i])=>[o,Dp(i)])),r=(o,i)=>n[o]&&n[i]?Math.max(0,Date.parse(n[i])-Date.parse(n[o])):null;return t.stagesMs={discoveryToRisk:r("discoveredAt","riskCompletedAt"),riskToSellability:r("riskCompletedAt","sellabilityCompletedAt"),sellabilityToRoute:r("sellabilityCompletedAt","routeCompletedAt"),routeToNormalized:r("routeCompletedAt","normalizedAt"),total:r("discoveredAt","normalizedAt")},t}function jp(e={}){if(!e||typeof e!="object"||Array.isArray(e))throw new TypeError("candidate must be an object");let t=wt(e.chain,{}),n=wt(e.token,{}),r=wt(e.pool),o=wt(e.venue,{}),i=wt(e.signal,{}),s=wt(e.route,{});s.cost=Fp(s.cost);let a=hv({...e,chain:t,token:n,pool:r,venue:o,signal:i,route:s}),c=i.unsolicitedAirdrop===!0,u=Up.test(n.address||"")?n.address.toLowerCase():"unknown-token",l=Up.test(r?.address||"")?r.address.toLowerCase():"unknown-pool",d=`${Number.isInteger(t.id)?t.id:"unknown-chain"}:${u}:${l}:${o.key||"unknown-venue"}`;return Wn({id:d,status:a.status,chain:t,token:n,pool:r,venue:o,signal:i,risk:wt(e.risk,{verdict:"UNKNOWN",evidence:"UNKNOWN",observedAt:null}),sellability:wt(e.sellability,{verdict:"UNKNOWN",evidence:"UNKNOWN",observedAt:null}),route:s,prepared:wt(e.prepared,{status:"NOT_PREPARED",unsigned:!0}),whyBlocked:Ii([...e.whyBlocked||[],...a.whyBlocked]),latency:yv(e.latency),held:c?!1:e.held===!0,eligible:c?!1:a.status===Wr.PASS&&e.eligible!==!1})}function Hp(e=[]){if(!Array.isArray(e))throw new TypeError("candidates must be an array");return Object.freeze(e.map(jp).sort((t,n)=>t.id.localeCompare(n.id)))}function zp(e){return[...new Set(e.filter(Boolean).map(String))]}function wn(e,t,n="UNKNOWN"){return!e||typeof e!="object"?{evidence:n,observedAt:t}:{...structuredClone(e),evidence:e.evidence||n,observedAt:e.observedAt||t}}function gv(e,t,n,r){let o=e.observedAt||r,i=t.topPool||t.pools?.pools?.find(l=>l.address?.toLowerCase()===e.poolAddress?.toLowerCase())||{address:e.poolAddress},s=wn(t.scannerRisk||t.risk,o),a=wn(t.sellability,o,"UNAVAILABLE"),c=wn(t.quote,o,"UNAVAILABLE"),u=c.evidence==="LIVE"?"PASS":"UNKNOWN";return{chain:{id:e.chainId,...t.chain||{}},token:wn({address:e.tokenAddress,...t.token||{}},o,"LIVE"),pool:wn({address:e.poolAddress,...i},o,"LIVE"),venue:wn({...e.venue,supported:e.venue?.supported===!0,verified:e.venue?.verified===!0},o,"LIVE"),signal:wn({kind:e.kind,source:"verified-factory",unsolicitedAirdrop:!1},o,"LIVE"),risk:s,sellability:a,route:{status:u,amountOut:c.amountOut??null,cost:c.fee==null?{status:"UNKNOWN",amount:null,unit:null}:{status:"KNOWN",amount:String(c.fee),unit:c.feeUnit||"wei"},evidence:c.evidence,observedAt:c.observedAt},prepared:{status:"NOT_PREPARED",unsigned:!0},whyBlocked:zp([...n||[],...t.blockedReasons||[],t.error]),latency:{discoveredAt:o,riskCompletedAt:s.observedAt,sellabilityCompletedAt:a.observedAt,routeCompletedAt:c.observedAt,normalizedAt:r}}}async function Vp(e={}){let t=e.discover||e.discoveryFn,n=e.evaluator||e.evaluate;if(typeof t!="function")throw new TypeError("service requires an injected discovery function");if(typeof n!="function")throw new TypeError("service requires an injected evaluator function");let r=await t(e.discovery||e.discoveryOptions||{}),o=Array.isArray(r?.discoveries)?r.discoveries:[],i=e.observedAt||o[0]?.observedAt||new Date(0).toISOString(),s=[];for(let a of o){if(a?.signal?.unsolicitedAirdrop===!0||a?.unsolicitedAirdrop===!0||a?.kind==="wallet-transfer")continue;let c;try{c=await n({chainId:a.chainId,tokenAddress:a.tokenAddress,prepare:e.prepare===!0})}catch(u){c={error:`evaluation unavailable: ${String(u?.message||u).slice(0,300)}`}}s.push(gv(a,c||{},r?.status==="LIVE"?[]:r?.whyBlocked,i))}return Object.freeze({status:r?.status||"UNKNOWN",cursor:r?.cursor||null,unavailable:Object.freeze([...r?.unavailable||[]]),whyBlocked:Object.freeze(zp(r?.whyBlocked||[])),candidates:Hp(s)})}var Gn=Object.freeze({OK:"ok",DEGRADED:"degraded",UNKNOWN:"unknown"}),Wp=Object.freeze({fresh:0,stale:1,down:2});function bv(e,t,n=.5){return Number.isFinite(t)?e==null||!Number.isFinite(e)?t:n*t+(1-n)*e:e??null}function wv(e,t=Math.random){let n=Math.min(1e3,50*2**Math.max(0,e-1)),r=t()*n*.5;return Math.round(n+r)}function Ev(e){if(!e||typeof e!="object")return{ok:!1,reason:"malformed probe response: not an object"};let{blockNumber:t,chainId:n,timestampMs:r}=e;return!Number.isInteger(t)||t<0?{ok:!1,reason:"malformed probe response: blockNumber must be a non-negative integer"}:n!=null&&(!Number.isFinite(n)||n<=0)?{ok:!1,reason:"malformed probe response: chainId must be a positive number"}:r!=null&&(!Number.isFinite(r)||r<0)?{ok:!1,reason:"malformed probe response: timestampMs must be a non-negative number"}:{ok:!0}}function Sv(e,t,n){let r=n(t).then(()=>{throw new Error(`rpc-health: probe timeout after ${t}ms`)});return r.catch(()=>{}),Promise.race([e,r])}async function vv(e,t){let{probe:n,clock:r,sleep:o,rng:i,timeoutMs:s,maxRetries:a,backoff:c,latencyAlpha:u,previousLatencyEwmaMs:l,previousErrorRate:d,previousSamples:f}=t,p=1+a,m=0,y=0,h=l??null,w=null,A=null;for(let x=1;x<=p;x++){m=x;let E=r.now();try{let g=await Sv(n(e,{attempt:x,timeoutMs:s}),s,o),b=r.now()-E,v=Ev(g);if(!v.ok)y+=1,w=v.reason;else{h=bv(h,b,u),A={blockNumber:g.blockNumber,chainId:g.chainId??null,timestampMs:g.timestampMs??null,latencyMs:b};break}}catch(g){y+=1,w=g?.message||String(g)}if(x<p){let g=c(x,i);await o(g)}}let _=(f??0)+m,S=d!=null&&f?d*f:0,k=_>0?(S+y)/_:0;return{id:e.id,endpoint:e,ok:A!=null,attempts:m,failures:y,errorRate:k,latencyEwmaMs:A?h:l??null,latencyMs:A?A.latencyMs:null,blockNumber:A?A.blockNumber:null,chainId:A?A.chainId:null,timestampMs:A?A.timestampMs:null,lastError:A?null:w,sampleCount:_}}async function Av(e,t,n){let r=new Array(e.length),o=0;async function i(){for(;o<e.length;){let a=o++;r[a]=await n(e[a],a)}}let s=Math.max(1,Math.min(t,e.length));return await Promise.all(Array.from({length:s},()=>i())),r}function xv(e,{networkHeadBlock:t,maxHeadLagBlocks:n,maxHeadAgeMs:r,now:o}){if(!e.ok)return"down";let i=t!=null&&e.blockNumber!=null?t-e.blockNumber:null,s=i!=null&&i>n,a=e.timestampMs!=null&&o-e.timestampMs>r;return s||a?"stale":"fresh"}function kv(e,t){let n=Wp[e.tier]-Wp[t.tier];if(n!==0)return n;let r=e.errorRate-t.errorRate;if(r!==0)return r;let o=e.headLagBlocks??1/0,i=t.headLagBlocks??1/0;if(o!==i)return o-i;let s=e.latencyEwmaMs??1/0,a=t.latencyEwmaMs??1/0;return s!==a?s-a:e.id<t.id?-1:e.id>t.id?1:0}async function Gp(e,t={}){if(!Array.isArray(e)||e.length===0)throw new Error("rankRpcEndpoints requires a non-empty array of endpoints");let{probe:n,clock:r={now:()=>Date.now()},sleep:o=b=>new Promise(v=>setTimeout(v,b)),rng:i=Math.random,timeoutMs:s=2e3,retries:a=3,concurrency:c=4,backoff:u=wv,maxHeadLagBlocks:l=3,maxHeadAgeMs:d=6e4,latencyAlpha:f=.5,previousStats:p={}}=t;if(typeof n!="function")throw new Error("rankRpcEndpoints requires an injected probe(endpoint, ctx) function");let m=new Set;for(let b of e){if(!b||typeof b.id!="string"||!b.id)throw new Error("each RPC endpoint requires a stable string id");if(m.has(b.id))throw new Error(`duplicate RPC endpoint id: ${b.id}`);m.add(b.id)}let y=Math.min(Math.max(0,a),3),h=await Av(e,c,b=>vv(b,{probe:n,clock:r,sleep:o,rng:i,timeoutMs:s,maxRetries:y,backoff:u,latencyAlpha:f,previousLatencyEwmaMs:p[b.id]?.latencyEwmaMs??null,previousErrorRate:p[b.id]?.errorRate??null,previousSamples:p[b.id]?.sampleCount??0})),w=h.reduce((b,v)=>v.ok&&v.blockNumber!=null&&(b==null||v.blockNumber>b)?v.blockNumber:b,null),A=r.now(),S=[...h.map(b=>{let v=xv(b,{networkHeadBlock:w,maxHeadLagBlocks:l,maxHeadAgeMs:d,now:A}),P=b.ok&&w!=null&&b.blockNumber!=null?w-b.blockNumber:null;return{...b,tier:v,headLagBlocks:P,costUnknown:!b.ok}})].sort(kv),k=S.every(b=>b.tier==="down"),x=k?null:S[0],E=k?null:S[1]??null;return{status:k?Gn.UNKNOWN:S.some(b=>b.tier!=="fresh")?Gn.DEGRADED:Gn.OK,networkHeadBlock:w,results:S,primary:x,backup:E,allDown:k}}import{createHash as Iv}from"node:crypto";var En=Object.freeze({SHADOW:"shadow",ARMED:"armed",AUTONOMOUS:"autonomous"}),_v=3,Ov=new Set(Object.values(En));function Va(e){if(e&&typeof e=="object"&&!Object.isFrozen(e)){for(let t of Object.values(e))Va(t);Object.freeze(e)}return e}function za(e){return Array.isArray(e)?`[${e.map(za).join(",")}]`:e&&typeof e=="object"?`{${Object.keys(e).filter(t=>e[t]!==void 0).sort().map(t=>`${JSON.stringify(t)}:${za(e[t])}`).join(",")}}`:JSON.stringify(e)}function Tv(e){return`sha256:${Iv("sha256").update(za(e)).digest("hex")}`}function Ha(e,t,n){if(!Array.isArray(e)||e.length===0)throw new TypeError(`${t} must be a non-empty exact allowlist`);let r=e.map(o=>n(o,t));if(new Set(r).size!==r.length)throw new TypeError(`${t} contains a duplicate entry`);return r.sort((o,i)=>typeof o=="number"?o-i:o.localeCompare(i))}function Cv(e,t){if(!Number.isSafeInteger(e)||e<=0)throw new TypeError(`${t} entries must be positive safe integers`);return e}function Kp(e,t){if(typeof e!="string"||e.trim()!==e||e.length===0)throw new TypeError(`${t} entries must be non-empty exact strings`);return e}function Kn(e,t,{positive:n=!1}={}){let r=typeof e=="number"?String(e):e;if(typeof r!="string"||!/^(?:0|[1-9]\d*)(?:\.\d+)?$/.test(r))throw new TypeError(`${t} must be a finite non-negative decimal`);if(n&&/^0(?:\.0+)?$/.test(r))throw new TypeError(`${t} must be greater than zero`);return r}function _i(e,t,{min:n=0,max:r=Number.MAX_SAFE_INTEGER}={}){if(!Number.isSafeInteger(e)||e<n||e>r)throw new TypeError(`${t} must be an integer from ${n} through ${r}`);return e}function Ti(e,t){let n=Kn(e,t),[r,o=""]=n.split(".");return{digits:BigInt(r+o),scale:o.length}}function Oi(e,t,n="value"){let r=Ti(e,n),o=Ti(t,"strategy cap"),i=Math.max(r.scale,o.scale),s=r.digits*10n**BigInt(i-r.scale),a=o.digits*10n**BigInt(i-o.scale);return s<a?-1:s>a?1:0}function Yp(e){let t=structuredClone(e);return delete t.digest,t}function Nv(e){if(!e||typeof e!="object"||Array.isArray(e))throw new TypeError("strategy must be an object");return Tv(Yp(e))}function Rv(e={}){if(!e||typeof e!="object"||Array.isArray(e))throw new TypeError("strategy must be an object");let t=e.mode??En.SHADOW;if(!Ov.has(t))throw new TypeError("mode must be shadow, armed, or autonomous");let n={version:1,mode:t,chains:Ha(e.chains,"chains",Cv),venues:Ha(e.venues,"venues",Kp),quoteAssets:Ha(e.quoteAssets,"quoteAssets",Kp),maxSpendPerTrade:Kn(e.maxSpendPerTrade,"maxSpendPerTrade",{positive:!0}),maxSpendPerDay:Kn(e.maxSpendPerDay,"maxSpendPerDay",{positive:!0}),minLiquidityUsd:Kn(e.minLiquidityUsd,"minLiquidityUsd",{positive:!0}),maxSlippageBps:_i(e.maxSlippageBps,"maxSlippageBps",{max:1e4}),maxGas:Kn(e.maxGas,"maxGas",{positive:!0}),maxPriorityFee:Kn(e.maxPriorityFee,"maxPriorityFee"),maxBuysPerHour:_i(e.maxBuysPerHour,"maxBuysPerHour",{min:1}),retryCeiling:_i(e.retryCeiling,"retryCeiling",{max:_v}),ttlMs:_i(e.ttlMs,"ttlMs",{min:1}),requireSellSimulation:e.requireSellSimulation,killSwitch:e.killSwitch};if(n.requireSellSimulation!==!0)throw new TypeError("requireSellSimulation must be true");if(typeof n.killSwitch!="boolean")throw new TypeError("killSwitch must be boolean");if(Oi(n.maxSpendPerTrade,n.maxSpendPerDay)>0)throw new TypeError("maxSpendPerTrade cannot exceed maxSpendPerDay");return n.digest=Nv(n),Va(n)}var Pv=Object.freeze([["localSignerReady","local signer is not ready"],["dedicatedWallet","dedicated non-main wallet evidence is missing"],["exactStrategyBinding","exact strategy digest/grant binding is missing"],["trustedOneUseTrigger","fresh trusted one-use trigger attestation is missing"],["durableReceipts","durable receipts evidence is missing"],["balanceReconciliation","balance reconciliation evidence is missing"]]);function he(e,t,n){t&&e.push(n)}function Xp(e,t={},n={}){let r=Rv(Yp(e)),o=[];he(o,r.killSwitch,"kill switch is engaged"),he(o,!r.chains.includes(t.chain),"chain is not on the exact allowlist"),he(o,!r.venues.includes(t.venue),"venue is not on the exact allowlist"),he(o,!r.quoteAssets.includes(t.quoteAsset),"quote asset is not on the exact allowlist");let i=(a,c,u)=>{try{he(o,Oi(a,c,u)>0,`${u} exceeds cap`)}catch{o.push(`${u} evidence is missing or unknown`)}};i(t.spend,r.maxSpendPerTrade,"per-trade spend");try{let a=Ti(t.spentToday,"daily spend"),c=Ti(t.spend,"per-trade spend"),u=Math.max(a.scale,c.scale),l=a.digits*10n**BigInt(u-a.scale)+c.digits*10n**BigInt(u-c.scale),d=u===0?String(l):`${String(l).padStart(u+1,"0").slice(0,-u)}.${String(l).padStart(u+1,"0").slice(-u)}`;he(o,Oi(d,r.maxSpendPerDay,"daily spend")>0,"daily spend cap would be exceeded")}catch{o.push("daily spend evidence is missing or unknown")}try{he(o,Oi(t.liquidityUsd,r.minLiquidityUsd,"liquidity")<0,"minimum real liquidity is not met")}catch{o.push("liquidity evidence is missing or unknown")}i(t.slippageBps,String(r.maxSlippageBps),"slippage"),i(t.gas,r.maxGas,"gas"),i(t.priorityFee,r.maxPriorityFee,"priority fee"),he(o,!Number.isSafeInteger(t.buysLastHour),"buys per hour evidence is missing or unknown"),he(o,Number.isSafeInteger(t.buysLastHour)&&t.buysLastHour>=r.maxBuysPerHour,"buys per hour cap is reached"),he(o,!Number.isSafeInteger(t.retries)||t.retries<0,"retry evidence is missing or unknown"),he(o,Number.isSafeInteger(t.retries)&&t.retries>r.retryCeiling,"retry ceiling is exceeded"),he(o,!Number.isFinite(t.ageMs)||t.ageMs<0,"TTL evidence is missing or unknown"),he(o,Number.isFinite(t.ageMs)&&t.ageMs>=r.ttlMs,"TTL has expired"),he(o,t.sellSimulation?.verdict!=="PASS"||t.sellSimulation?.evidence!=="LIVE","mandatory sell simulation has no LIVE PASS evidence"),he(o,typeof t.fireId!="string"||t.fireId.length===0,"fire id evidence is missing or unknown"),he(o,!Array.isArray(t.firedIds),"duplicate-fire history is missing or unknown"),he(o,Array.isArray(t.firedIds)&&t.firedIds.includes(t.fireId),"duplicate fire is blocked");let s=[...o];he(s,n?.ORACLE_AUTONOMOUS_TRADING!=="1","ORACLE_AUTONOMOUS_TRADING=1 is required literally");for(let[a,c]of Pv)he(s,t.autonomousGates?.[a]!==!0,c);return he(s,r.mode!==En.AUTONOMOUS,"strategy mode is not autonomous"),Va({strategyDigest:r.digest,mode:r.mode,policyEligible:o.length===0,blockers:o,autonomousEligible:s.length===0,autonomousBlockers:s,reportOnly:!0})}var Et="oracle.launch-radar.data-plane.v1",qv=200,Bv=500,Uv=100,Mv=500;function Gr(e){return String(e?.message||e||"unknown error").slice(0,300)}function Dv(e={}){return e.configDir||process.env.ORACLE_CONFIG_DIR||Jp.join($v.homedir(),".config","oracle")}function Fv(e={}){return e.storePath||process.env.LAUNCH_RADAR_STORE_PATH||Jp.join(Dv(e),"launch-radar","state.json")}function Wa(e,t,n){return Number.isSafeInteger(e)&&e>0?Math.min(e,n):t}function Qp(e={}){let t=Fv(e);try{return{ok:!0,path:t,state:Bp({path:t})}}catch(n){return{ok:!1,path:t,error:Gr(n)}}}function Zp(){return process.env.ORACLE_AUTONOMOUS_TRADING==="1"}function ef(){return Object.freeze({schema:Et,evidence:"LIVE",mode:En.SHADOW,executionReady:!1,signingReady:!1,broadcastReady:!1,funded:!1,autonomousTradingEnvSet:Zp()})}function tf(e={},t={}){let n=Qp(t),r={schema:Et,storePath:n.path,executionReady:!1,signingReady:!1,broadcastReady:!1,requiresUserSignature:!0,autonomousTradingEnvSet:Zp()};if(!n.ok)return Object.freeze({...r,evidence:"UNAVAILABLE",reason:n.error,mode:En.SHADOW,status:"unavailable",ambiguous:null,candidateCount:null,cursor:null,evidenceCount:null,lastEvidenceAt:null});let{state:o}=n,i=o.evidence.at(-1)||null;return Object.freeze({...r,evidence:"LIVE",reason:o.strategyStatus.reason??null,mode:o.strategyStatus.mode,status:o.strategyStatus.status,ambiguous:o.strategyStatus.ambiguous,candidateCount:o.candidates.length,cursor:o.cursor,evidenceCount:o.evidence.length,lastEvidenceAt:i?i.at:null})}function nf(e={},t={}){let n=Qp(t);if(!n.ok)return Object.freeze({schema:Et,evidence:"UNAVAILABLE",reason:n.error,storePath:n.path,strategyStatus:null,cursor:null,candidates:[],evidenceRecords:[]});let{state:r}=n,o=Wa(e.limit,qv,Bv),i=Wa(e.evidenceLimit,Uv,Mv);return Object.freeze({schema:Et,evidence:"LIVE",storePath:n.path,strategyStatus:structuredClone(r.strategyStatus),cursor:structuredClone(r.cursor),candidateCount:r.candidates.length,candidates:structuredClone(r.candidates.slice(0,o)),evidenceCount:r.evidence.length,evidenceRecords:structuredClone(r.evidence.slice(-i))})}async function rf(e={}){let t=Array.isArray(e.discoveries)?e.discoveries:[],n=Array.isArray(e.evaluations)?e.evaluations:[],r=Array.isArray(e.whyBlocked)?e.whyBlocked:[],o=typeof e.status=="string"&&e.status?e.status:t.length?"LIVE":"UNKNOWN",i=async()=>({status:o,cursor:e.cursor??null,discoveries:t,whyBlocked:r,unavailable:[]}),s=async({chainId:a,tokenAddress:c})=>{let u=n.find(l=>l?.chainId===a&&String(l?.tokenAddress||"").toLowerCase()===String(c||"").toLowerCase());return u?u.evaluation&&typeof u.evaluation=="object"?u.evaluation:u:{}};try{let a=await Vp({discover:i,evaluator:s,observedAt:e.observedAt}),c=a.status==="LIVE"?"LIVE":a.status==="UNAVAILABLE"?"UNAVAILABLE":"UNKNOWN";return{schema:Et,evidence:c,...a}}catch(a){return{schema:Et,evidence:"UNAVAILABLE",reason:Gr(a),status:"UNKNOWN",cursor:null,unavailable:[],whyBlocked:[Gr(a)],candidates:[]}}}async function of(e={}){let t=Array.isArray(e.endpoints)?e.endpoints:[],n={schema:Et,evidence:"UNAVAILABLE",status:Gn.UNKNOWN,networkHeadBlock:null,results:[],primary:null,backup:null,allDown:!0};if(t.length===0)return{...n,reason:"no endpoints supplied"};let r=e.samples&&typeof e.samples=="object"&&!Array.isArray(e.samples)?e.samples:{},o=async s=>{let a=r[s.id];if(!a||a.ok===!1)throw new Error(a?.error||`no probe sample supplied for endpoint "${s.id}"`);return a},i=Wa(e.retries,0,3);try{let s=await Gp(t,{probe:o,retries:i,concurrency:e.concurrency,maxHeadLagBlocks:e.maxHeadLagBlocks,maxHeadAgeMs:e.maxHeadAgeMs}),a=s.allDown?"UNAVAILABLE":s.status===Gn.OK?"LIVE":"STALE";return{schema:Et,evidence:a,...s}}catch(s){return{...n,reason:Gr(s)}}}function sf(e={}){try{let t=Xp(e.strategy,e.observation,{});return{schema:Et,evidence:"LIVE",...t,autonomousEligible:!1,autonomousBlockers:[...new Set([...t.autonomousBlockers||[],"Launch Radar autonomous execution is not released"])],reportOnly:!0}}catch(t){let n=Gr(t);return{schema:Et,evidence:"UNAVAILABLE",reason:n,mode:En.SHADOW,policyEligible:!1,blockers:[n],autonomousEligible:!1,autonomousBlockers:[n],reportOnly:!0}}}var Hv=/^arm|sign|execute|broadcast|submit|send|write|place/i,af=Object.freeze({"launch-radar":Object.freeze({health:(e,t)=>ef(e,t),status:(e,t)=>tf(e,t),snapshot:(e,t)=>nf(e,t),candidates:(e,t)=>rf(e,t),rpcHealth:(e,t)=>of(e,t),evaluateStrategy:(e,t)=>sf(e,t)})});function zv(e,t){let n=String(t||"");if(Hv.test(n))throw new Error(`data facade forbidden op: ${e}.${n}`);let r=Pp(e);if(!r)throw new Error(`unknown data provider: ${e}`);if(!Array.isArray(r.ops)||!r.ops.includes(n))throw new Error(`data facade: provider ${e} does not support op ${n}`);let o=af[e];if(!o||typeof o[n]!="function")throw new Error(`data facade: no handler wired for ${e}.${n}`)}async function cf(e,t,n={},r={}){return zv(e,t),af[e][t](n,r)}var Vv="oracle-launch-radar-mcp",Wv="1",uf=Object.freeze({type:"object",properties:{},additionalProperties:!1}),Ga=Object.freeze([{name:"launch_radar_health",description:"Launch Radar data-plane health: static capability flags only (mode, executionReady, signingReady, broadcastReady, funded). Always shadow-only and unfunded. Read-only, no arguments.",inputSchema:uf},{name:"launch_radar_status",description:"Current durable shadow-cycle status read from local disk: mode, status, ambiguous, candidate/evidence counts, and the honest autonomous-trading env-gate state. Reports evidence: UNAVAILABLE with a reason if the store cannot be read. Never signs or broadcasts. Read-only, no arguments (store path is server-configured, never caller-supplied).",inputSchema:uf},{name:"launch_radar_snapshot",description:"Full durable snapshot: strategyStatus, cursor, normalized candidates, and the evidence event log, straight off local disk. Read-only, no arguments beyond optional result-size limits.",inputSchema:{type:"object",properties:{limit:{type:"integer",minimum:1,maximum:500,description:"Max candidates to return (default 200)."},evidenceLimit:{type:"integer",minimum:1,maximum:500,description:"Max most-recent evidence records to return (default 100)."}},additionalProperties:!1}},{name:"launch_radar_candidates",description:"Recompute normalized PASS/WARN/BLOCK/UNKNOWN candidates from caller-supplied discovery + evaluation data through the exact launch-radar service/domain normalization. Missing evaluations come back UNKNOWN, never a fabricated PASS. Makes no network call itself \u2014 all inputs are supplied by the caller.",inputSchema:{type:"object",properties:{discoveries:{type:"array",items:{type:"object"},maxItems:200},evaluations:{type:"array",items:{type:"object"},maxItems:200},status:{type:"string",enum:["LIVE","UNKNOWN","UNAVAILABLE"]},cursor:{},whyBlocked:{type:"array",items:{type:"string"},maxItems:50},observedAt:{type:"string"}},additionalProperties:!1}},{name:"launch_radar_rpc_health",description:"Rank caller-supplied RPC probe samples (freshness/error-rate/latency) through the exact deterministic rpc-health module. This tool performs no probe itself \u2014 supply already-collected samples keyed by endpoint id. An endpoint with no sample counts as down; all-down reports evidence: UNAVAILABLE rather than a fabricated best endpoint.",inputSchema:{type:"object",required:["endpoints"],properties:{endpoints:{type:"array",items:{type:"object",required:["id"],properties:{id:{type:"string"}}},minItems:1,maxItems:64},samples:{type:"object",description:"Map of endpoint id -> { blockNumber, chainId, timestampMs } or { ok: false, error }."},retries:{type:"integer",minimum:0,maximum:3},concurrency:{type:"integer",minimum:1,maximum:32},maxHeadLagBlocks:{type:"number"},maxHeadAgeMs:{type:"number"}},additionalProperties:!1}},{name:"launch_radar_evaluate_strategy",description:"Pure, report-only strategy-policy evaluation over an exact caller-supplied strategy + observation (spend/liquidity/slippage/TTL/retry/kill-switch gates, plus the six-gate autonomous checklist). Reads the live ORACLE_AUTONOMOUS_TRADING env var for an honest autonomous-gate readout. Never signs, arms, or executes \u2014 reportOnly is always true.",inputSchema:{type:"object",required:["strategy","observation"],properties:{strategy:{type:"object"},observation:{type:"object"}},additionalProperties:!1}}]),Gv=Object.freeze({launch_radar_health:"health",launch_radar_status:"status",launch_radar_snapshot:"snapshot",launch_radar_candidates:"candidates",launch_radar_rpc_health:"rpcHealth",launch_radar_evaluate_strategy:"evaluateStrategy"});async function Ka(e,t={}){let n=Gv[e];if(!n)throw new Error(`unknown tool: ${e}`);return cf("launch-radar",n,t,{})}function Kv(e){return{content:[{type:"text",text:JSON.stringify(e)}]}}var VL=Object.freeze({name:Vv,version:Wv,tools:Ga,async call(e,t){return Kv(await Ka(e,t))}});function DN(e){let t;try{t=new URL(String(e||""))}catch{throw new Error("ORACLE_DATA_URL must be a loopback HTTP URL")}let n=t.hostname==="127.0.0.1"||t.hostname==="localhost"||t.hostname==="[::1]";if(t.protocol!=="http:"||!n||t.pathname!=="/"||t.username||t.password||t.search||t.hash)throw new Error("ORACLE_DATA_URL must be an uncredentialed loopback HTTP URL");return t.href.replace(/\/$/,"")}var tl=DN(Fs("ORACLE_DATA_URL","MAD_DESK_URL","http://127.0.0.1:8787")),FN=2*1024*1024;async function jN(e,t=FN){let n=Number(e.headers?.get?.("content-length")||0);if(Number.isFinite(n)&&n>t)throw new Error("data response exceeded the size limit");if(!e.body?.getReader){let s=await e.text();if(Buffer.byteLength(s)>t)throw new Error("data response exceeded the size limit");try{return JSON.parse(s)}catch{return{}}}let r=e.body.getReader(),o=[],i=0;try{for(;;){let{done:s,value:a}=await r.read();if(s)break;let c=Buffer.from(a);if(i+=c.length,i>t)throw await r.cancel("response too large").catch(()=>{}),new Error("data response exceeded the size limit");o.push(c)}}finally{r.releaseLock?.()}try{return JSON.parse(Buffer.concat(o).toString("utf8"))}catch{return{}}}var Y0={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"}}},wr={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:Y0,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:Y0,mac:{type:"string"},quotedAtMs:{type:"number"},expiresAtMs:{type:"number"}}}}]},J0=[...Ga,{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:wr,conversionGasEvidence:wr,gasPriceEvidence:wr,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:wr,conversionGasEvidence:wr,gasPriceEvidence:wr,minNetWei:{type:"string"}}}},{name:"anvil_prepare_buy",description:"Build one exact-token Anvil buy action for Oracle's armed owner-local signer. The caller cap may reject but never widen the exact fresh quote encoded and confirmed. Requires sufficient allowance, exact human confirmation, simulation, and arm.",inputSchema:{type:"object",required:["market","collection","tokenId","buyer","maxTotalCostRaw","confirmedTotalCostRaw","maxNativeSwapFeeWei","actionGasLimit","maxFeePerGasWei","actionNonce","tradeId","userConfirmed"],properties:{market:{type:"string"},collection:{type:"string"},tokenId:{type:"string"},buyer:{type:"string"},maxTotalCostRaw:{type:"string"},confirmedTotalCostRaw:{type:"string",description:"Exact freshly quoted total cost reviewed by the user; must equal the re-read quote."},maxNativeSwapFeeWei:{type:"string"},actionGasLimit:{type:"string"},maxFeePerGasWei:{type:"string"},maxPriorityFeePerGasWei:{type:"string"},actionNonce:{type:"number"},ttlMs:{type:"number"},tradeId:{type:"string"},userConfirmed:{type:"boolean",const:!0}}}},{name:"anvil_prepare_sell",description:"Build one exact-token Anvil sale action for Oracle's armed owner-local signer. The caller floor may reject but never widen the exact fresh net payout encoded and confirmed. Requires pre-existing ERC721 approval, exact human confirmation, simulation, and arm.",inputSchema:{type:"object",required:["market","collection","tokenId","seller","minPayoutRaw","confirmedNetPayoutRaw","maxNativeSwapFeeWei","actionGasLimit","maxFeePerGasWei","actionNonce","tradeId","userConfirmed"],properties:{market:{type:"string"},collection:{type:"string"},tokenId:{type:"string"},seller:{type:"string"},minPayoutRaw:{type:"string"},confirmedNetPayoutRaw:{type:"string",description:"Exact freshly quoted net payout reviewed by the user; must equal the re-read quote."},maxNativeSwapFeeWei:{type:"string"},actionGasLimit:{type:"string"},maxFeePerGasWei:{type:"string"},maxPriorityFeePerGasWei:{type:"string"},actionNonce:{type:"number"},ttlMs:{type:"number"},tradeId:{type:"string"},userConfirmed:{type:"boolean",const:!0}}}},{name:"stonkbrokers_scan_loot",description:"Verify StonkBroker parent availability and nested ERC-6551 loot custody, then rank matching traits without treating rarity as buy evidence. Read-only.",inputSchema:{type:"object",required:["candidates"],properties:{candidates:{type:"array",items:{type:"object"}},traitType:{type:"string"},minStars:{type:"number"}}}},{name:"stonkbrokers_broker_desk",description:"Read StonkBroker owner/TBA identities and Clock In state, or prepare an unsigned permissionless Clock In call. No signing or broadcast.",inputSchema:{type:"object",properties:{owner:{type:"string"},brokerTokenIds:{type:"array",items:{type:"string"}},which:{type:"string"},mode:{type:"string"},batchSize:{type:"number"},minOutBps:{type:"number"}}}},{name:"rpc_balance",description:"Native token balance of an address on a chain via public RPC. Read-only. Omit address to read the operator wallet.",inputSchema:{type:"object",required:["chainId"],properties:{chainId:{type:"number"},address:{type:"string"}}}},{name:"rpc_block",description:"Latest block number on a chain via public RPC. Read-only.",inputSchema:{type:"object",required:["chainId"],properties:{chainId:{type:"number"}}}},{name:"solana_balance",description:"Solana mainnet SOL balance for a base58 public key. Read-only; no signing or broadcast.",inputSchema:{type:"object",required:["address"],properties:{address:{type:"string"},commitment:{type:"string"}}}},{name:"solana_token_accounts",description:"Solana SPL token accounts for an owner, optionally filtered by mint. Read-only.",inputSchema:{type:"object",required:["owner"],properties:{owner:{type:"string"},mint:{type:"string"},commitment:{type:"string"}}}},{name:"solana_simulate",description:"Simulate a base64 Solana transaction through RPC. Read-only; never signs or broadcasts.",inputSchema:{type:"object",required:["transaction"],properties:{transaction:{type:"string"},sigVerify:{type:"boolean"},replaceRecentBlockhash:{type:"boolean"}}}},{name:"jupiter_venues",description:"Jupiter Solana venue map, optionally verified on-chain against executable BPF loader ownership. Read-only.",inputSchema:{type:"object",properties:{verify:{type:"boolean"},rpc:{type:"string"}}}},{name:"jupiter_quote",description:"Jupiter Solana Swap API quote with a hard <=100 bps slippage cap. Read-only.",inputSchema:{type:"object",required:["inputMint","outputMint","amount"],properties:{inputMint:{type:"string"},outputMint:{type:"string"},amount:{type:"string"},slippageBps:{type:"number"}}}},{name:"jupiter_prepare",description:"Prepare an unsigned Jupiter swap transaction for the user's Solana wallet to sign. No local signer, no broadcast.",inputSchema:{type:"object",required:["userPublicKey"],properties:{userPublicKey:{type:"string"},quoteResponse:{type:"object"},inputMint:{type:"string"},outputMint:{type:"string"},amount:{type:"string"},slippageBps:{type:"number"}}}},{name:"btc_health",description:"Bitcoin L1 Esplora health + tip height (mempool.space by default). No Core RPC, no keys. Read-only.",inputSchema:{type:"object",properties:{}}},{name:"btc_fees",description:"Recommended Bitcoin fee rates (sats/vB). Read-only.",inputSchema:{type:"object",properties:{}}},{name:"btc_balance",description:"Bitcoin address balance in sats via Esplora. Read-only.",inputSchema:{type:"object",required:["address"],properties:{address:{type:"string",description:"bc1\u2026/1\u2026/3\u2026 address"}}}},{name:"btc_utxos",description:"UTXOs for a Bitcoin address via Esplora. Read-only.",inputSchema:{type:"object",required:["address"],properties:{address:{type:"string"}}}},{name:"btc_tx",description:"Lookup a Bitcoin transaction by txid via Esplora. Read-only.",inputSchema:{type:"object",required:["txid"],properties:{txid:{type:"string"}}}},{name:"btc_meta_health",description:"Ordinals/runes indexer health. Reports whether BTC_META_API_URL / vendor API keys are configured. Read-only.",inputSchema:{type:"object",properties:{}}},{name:"btc_rune_balance",description:"Rune balances for a Bitcoin address (requires configured indexer + optional API key). Read-only.",inputSchema:{type:"object",required:["address"],properties:{address:{type:"string"}}}},{name:"btc_inscriptions",description:"Inscriptions controlled by an address. REQUIRES a keyed indexer (ordinals.com has no address index). Returns unknownNotEmpty:true when unconfigured \u2014 that means UNKNOWN, never 'wallet holds none'. Protect these UTXOs from fee spends.",inputSchema:{type:"object",required:["address"],properties:{address:{type:"string"},limit:{type:"number"}}}},{name:"btc_inscription_info",description:"Inscription metadata by inscription id (content type/length, height, sat, fee). KEYLESS via ordinals.com recursive. Read-only.",inputSchema:{type:"object",required:["inscriptionId"],properties:{inscriptionId:{type:"string",description:"<64-hex-txid>i<index>"}}}},{name:"btc_inscription_children",description:"Child inscriptions of a parent (collections). KEYLESS via ordinals.com recursive. Read-only.",inputSchema:{type:"object",required:["inscriptionId"],properties:{inscriptionId:{type:"string",description:"<64-hex-txid>i<index>"},page:{type:"number"}}}},{name:"btc_ord_block_info",description:"Ord node block info / indexer tip. KEYLESS. Use to confirm the ordinals indexer is at the same tip as Esplora before trusting metaprotocol reads.",inputSchema:{type:"object",properties:{height:{type:"number",description:"omit for current tip"}}}},{name:"satflow_health",description:"Satflow marketplace health (primary BTC ordinals/runes market after Magic Eden BTC sunset). Needs SATFLOW_API_KEY. Read-only.",inputSchema:{type:"object",properties:{}}},{name:"satflow_floors",description:"Satflow collection floor prices. type=ordinals|runes. Read-only.",inputSchema:{type:"object",properties:{type:{type:"string",description:"ordinals or runes"},ids:{type:"string",description:"optional comma-separated collection ids"}}}},{name:"satflow_wallet",description:"Satflow wallet contents (ordinals/runes) for an address. Read-only.",inputSchema:{type:"object",required:["address"],properties:{address:{type:"string"},type:{type:"string"},limit:{type:"number"}}}},{name:"satflow_item",description:"Satflow item detail for an inscription id (listing + bids + meta). Read-only.",inputSchema:{type:"object",oneOf:[{required:["inscriptionId"]},{required:["id"]}],properties:{inscriptionId:{type:"string"},id:{type:"string",description:"alias for inscriptionId"}}}},{name:"satflow_floor_listings",description:"Satflow floor listings for collection id(s). Read-only.",inputSchema:{type:"object",oneOf:[{required:["collectionIds"]},{required:["ids"]}],properties:{collectionIds:{type:"string"},ids:{type:"string",description:"alias for collectionIds"},limit:{type:"number"}}}},{name:"scanner_coverage",description:"Which chains the on-chain scanner supports and which capabilities each one has (blockNumber, nativeBalance, tokenBalance, resolveToken, resolvePools, scanBlocks, scoreRisk, quote, sellSimulation, prepareUnsignedTx). Read-only.",inputSchema:{type:"object",properties:{}}},{name:"scan_token",description:"Resolve a token on an EVM chain: metadata, its pools, and a risk score. Works on chains no indexer covers because it reads the chain directly. Read-only.",inputSchema:{type:"object",properties:{chainId:{type:"number",description:"EVM chain id, e.g. 4663 for Robinhood Chain"},token:{type:"string",description:"token contract address"}},required:["chainId","token"]}},{name:"wallet_balances",description:"Native balance for an address on an EVM chain, plus one token balance when a token address is supplied. Read-only; never signs.",inputSchema:{type:"object",properties:{chainId:{type:"number"},address:{type:"string",description:"wallet address to inspect"},token:{type:"string",description:"optional token contract for a token balance"}},required:["chainId","address"]}},{name:"rfq_quote",description:"Create a cross-chain RFQ intent and fan it out to reviewed solver or venue sources. Returns firm quote objects with intentHash, firmQuoteHash, expiry, min receive, and unsigned executable artifacts. Never signs or broadcasts.",inputSchema:{type:"object",required:["fromChainId","toChainId","sellToken","buyToken","sellAmount","receiver","deadlineMs"],properties:{fromChainId:{type:"number"},toChainId:{type:"number"},sellToken:{type:"string"},buyToken:{type:"string"},sellAmount:{type:"string"},receiver:{type:"string"},deadlineMs:{type:"number"},minBuyAmount:{type:"string"},allowedSources:{type:"array",items:{type:"string"}},sources:{type:"array",items:{type:"string"},description:"alias for allowedSources"},allowedRouters:{type:"array",items:{type:"string"}},slippageBps:{type:"number"},decimalsIn:{type:"number"},decimalsOut:{type:"number"}}}},{name:"best_swap_route",description:"Compare swap routes across every available aggregator and rank by NET output (after gas and fees), not headline quote. Returns the winner plus all runners-up so the ranking can be checked rather than trusted.",inputSchema:{type:"object",properties:{chainId:{type:"number",description:"EVM chain id, e.g. 8453 for Base"},tokenIn:{type:"string",description:"sell token address"},tokenOut:{type:"string",description:"buy token address"},amountIn:{type:"string",description:"raw units of tokenIn (wei-scale)"},taker:{type:"string",description:"address used for quoting only; nothing is signed"},decimalsIn:{type:"number"},decimalsOut:{type:"number"}},required:["chainId","tokenIn","tokenOut","amountIn"]}},{name:"best_bridge_route",description:"Compare cross-chain bridge routes and rank by NET output. Also reports each route's expected duration, which is NOT folded into the score -- a route that saves $2 but takes 30 minutes is a trade-off for the caller to make.",inputSchema:{type:"object",properties:{fromChainId:{type:"number"},toChainId:{type:"number"},tokenIn:{type:"string",description:"token on the origin chain"},tokenOut:{type:"string",description:"token on the destination chain"},amountIn:{type:"string",description:"raw units of tokenIn"},taker:{type:"string",description:"address used for quoting only"},decimalsOut:{type:"number"}},required:["fromChainId","toChainId","tokenIn","tokenOut","amountIn"]}},{name:"prepare_best_route",description:"Compare routes, then build the SIGNABLE artifact for the winner. Returns an unsigned transaction (LI.FI/ParaSwap/0x) or EIP-712 typed data for an off-chain order (CoW) -- the artifactKind field says which, and they require different wallet actions. Re-quotes before preparing and reports drift against the comparison. Never signs or broadcasts.",inputSchema:{type:"object",properties:{chainId:{type:"number"},tokenIn:{type:"string"},tokenOut:{type:"string"},amountIn:{type:"string",description:"raw units of tokenIn"},taker:{type:"string",description:"the REAL wallet that will sign. Placeholder/burn addresses are rejected: quoting is anonymous, preparing is not."},decimalsIn:{type:"number"},decimalsOut:{type:"number"},source:{type:"string",description:"force a specific source instead of the winner (flagged in the result)"},driftToleranceBps:{type:"number",description:"default 100"}},required:["chainId","tokenIn","tokenOut","amountIn","taker"]}},{name:"prepare_best_bridge_route",description:"Compare cross-chain bridge routes, then build the signable transaction sequence for the winner. Returns a LIST of unsigned transactions -- some routes need an approval and a deposit signed in order, and signing only the first leaves funds approved but not bridged. Reports the destination chain and expected credit time. Bridging is not atomic. Never signs or broadcasts.",inputSchema:{type:"object",properties:{fromChainId:{type:"number"},toChainId:{type:"number"},tokenIn:{type:"string",description:"token on the origin chain"},tokenOut:{type:"string",description:"token on the destination chain"},amountIn:{type:"string",description:"raw units of tokenIn"},taker:{type:"string",description:"the REAL wallet that will sign; placeholders rejected"},source:{type:"string",description:"force a source instead of the winner"},driftToleranceBps:{type:"number",description:"default 100"}},required:["fromChainId","toChainId","tokenIn","tokenOut","amountIn","taker"]}},{name:"equity_venues",description:"Inventory of on-chain equities venues (HIP-3 builder DEXes, Arcus perps/spot on Robinhood 4663, RH Uniswap prepare tier, Solana xStocks, TON ston.fi) with tiers and a liveness snapshot. Offline fixtures by default. Read-only / prepare-only.",inputSchema:{type:"object",properties:{}}},{name:"equity_quote",description:"Cross-chain best-execution comparison for a tokenized equity ticker (NVDA, SPY, TSLA, ...). Ranks HIP-3, Arcus, RH Uniswap, Solana xStocks, and TON. Returns winner + runners-up + bestPreparable (only rh_uniswap is preparable in v1). rankedOn is usually gross because fees/gas are unmeasured - say so. Never signs.",inputSchema:{type:"object",required:["ticker"],properties:{ticker:{type:"string",description:"equity ticker, e.g. NVDA, SPY, TSLA"},sizeUsd:{type:"string",description:"optional notional USD size for impact model"},horizonHours:{type:"number",description:"optional holding horizon; enables funding-adjusted spot-vs-perp ranking"}}}},{name:"equity_prepare",description:"Prepare an UNSIGNED Robinhood-chain Uniswap artifact for a tokenized equity. Only the prepare-tier venue (rh_uniswap / chain 4663). Requires the real wallet as recipient. requiresWalletSignature=true, backendSigner=false. Never signs or broadcasts.",inputSchema:{type:"object",required:["ticker"],oneOf:[{required:["recipient"]},{required:["taker"]}],properties:{ticker:{type:"string"},recipient:{type:"string",description:"the REAL 0x wallet that will sign; placeholders rejected"},taker:{type:"string",description:"alias for recipient"},sizeUsd:{type:"string",description:"optional notional USD size"}}}},{name:"strategy_draft",description:"Draft a deterministic Hyperliquid strategy DSL from supported plain-English EMA, RSI, or funding rules. Fails closed on unsupported ambiguity. Never signs or broadcasts.",inputSchema:{type:"object",required:["prompt"],properties:{prompt:{type:"string"},nowMs:{type:"number"}}}},{name:"strategy_validate",description:"Strictly compile and hash a Hyperliquid strategy DSL. No network or execution.",inputSchema:{type:"object",required:["strategy"],properties:{strategy:{type:"object"},nowMs:{type:"number"}}}},{name:"strategy_backtest",description:"Backtest a deterministic strategy with fees, builder fees, slippage, funding, latency, stops, take profit, and liquidation. Uses supplied bars or keyless Hyperliquid history.",inputSchema:{type:"object",required:["strategy"],properties:{strategy:{type:"object"},bars:{type:"array",items:{type:"object"}},count:{type:"number"},backtestOptions:{type:"object"}}}},{name:"strategy_optimize",description:"Run bounded deterministic parameter search on training bars, then separately evaluate out-of-sample evidence. Never uses holdout data during optimization.",inputSchema:{type:"object",required:["strategy"],properties:{strategy:{type:"object"},bars:{type:"array",items:{type:"object"}},count:{type:"number"},maxTrials:{type:"number"}}}},{name:"strategy_evidence",description:"Produce separate train, holdout, and walk-forward evidence with overfitting flags and a fail, paper-only, or live-eligible status. Live eligibility never arms execution.",inputSchema:{type:"object",required:["strategy"],properties:{strategy:{type:"object"},bars:{type:"array",items:{type:"object"}},count:{type:"number"}}}},{name:"strategy_shadow_start",description:"Start a durable local shadow runner that records intended orders and theoretical fills only. Never signs or broadcasts.",inputSchema:{type:"object",required:["strategy"],properties:{strategy:{type:"object"},evidenceId:{type:"string"}}}},{name:"strategy_shadow_list",description:"List durable local shadow runners. Read-only and secret-free.",inputSchema:{type:"object",properties:{}}},{name:"strategy_shadow_status",description:"Inspect one durable local shadow runner. Read-only and secret-free.",inputSchema:{type:"object",required:["id"],properties:{id:{type:"string"}}}},{name:"strategy_shadow_step",description:"Advance one durable shadow runner over supplied or keyless historical bars. Never signs or broadcasts.",inputSchema:{type:"object",required:["id"],properties:{id:{type:"string"},bars:{type:"array",items:{type:"object"}},count:{type:"number"}}}},{name:"strategy_shadow_stop",description:"Stop one durable local shadow runner. Does not submit or cancel exchange orders.",inputSchema:{type:"object",required:["id"],properties:{id:{type:"string"}}}},{name:"strategy_prepare_live",description:"Create an integrity-bound prepare-only handoff after live-eligible evidence, HMAC-authenticated when local attestation is configured. All execution flags stay false. A separate local operator must revalidate, arm, sign, and broadcast.",inputSchema:{type:"object",required:["strategy","evidence","shadowId"],properties:{strategy:{type:"object"},evidence:{type:"object"},shadowId:{type:"string"},caps:{type:"object"},nowMs:{type:"number"}}}},{name:"twap_simulate",description:"Simulate a TWAP (time-weighted average price) DCA order. Splits a large order into equal-sized chunks over a configurable window, quotes every chunk at current prices, and returns the schedule + estimated average price. Read-only. Never signs or broadcasts. Use before committing to a TWAP.",inputSchema:{type:"object",required:["chainId","tokenIn","tokenOut","taker"],oneOf:[{required:["amount"]},{required:["amountIn"]}],properties:{chainId:{type:"number"},tokenIn:{type:"string"},tokenOut:{type:"string"},amount:{type:"string",description:"raw base units of tokenIn"},amountIn:{type:"string",description:"read-only alias for amount"},taker:{type:"string",description:"the REAL wallet that will sign"},splits:{type:"number",description:"number of chunks (default 10, max 100)"},windowHours:{type:"number",description:"total window in hours (default 6)"},slippageBps:{type:"number",description:"slippage cap in bps (default 100)"}}}},{name:"bridge_aggregator_scan",description:"Scan ALL cross-chain bridge routes: deBridge DLN + LI.FI/Relay + ChangeNOW. Ranks every route by net output, checks for existing token approvals that should be revoked before bridging, and returns the winner + runners-up. Read-only. Never signs or broadcasts. ChangeNOW requires ticker symbols.",inputSchema:{type:"object",required:["fromChainId","toChainId","tokenIn","tokenOut","amount","taker"],properties:{fromChainId:{type:"number"},toChainId:{type:"number"},tokenIn:{type:"string"},tokenOut:{type:"string"},amount:{type:"string",description:"raw base units of tokenIn"},taker:{type:"string"},fromSymbol:{type:"string",description:"ticker for ChangeNOW (e.g. ETH, USDC)"},toSymbol:{type:"string",description:"ticker for ChangeNOW"},fromDecimals:{type:"number",description:"default 18"},toDecimals:{type:"number",description:"default 18"}}}},{name:"perps_markets",description:"Scan perps markets across dYdX (standalone chain), Drift (Solana), and Vertex (Arbitrum). Returns ticker, oracle price, funding rate, open interest, and 24h volume. Read-only. Never signs.",inputSchema:{type:"object",properties:{venue:{type:"string",description:"dydx, drift, or vertex (default: all)"}}}},{name:"dex_quote",description:"Quote a swap across PancakeSwap (BSC+), SushiSwap (30+ chains), or Raydium (Solana via Jupiter). Specify the DEX and chain. Read-only.",inputSchema:{type:"object",required:["dex","chainId","tokenIn","tokenOut","amountIn"],properties:{dex:{type:"string",description:"pancakeswap, sushiswap, or raydium"},chainId:{type:"number"},tokenIn:{type:"string"},tokenOut:{type:"string"},amountIn:{type:"string",description:"raw base units"}}}},{name:"options_markets",description:"Scan on-chain options markets (calls/puts). Currently Aevo. Returns instruments, mark prices, funding, open interest. Read-only.",inputSchema:{type:"object",properties:{}}},{name:"cex_market_data",description:"Read PUBLIC centralized-exchange market data from Binance, OKX or Bybit: spot/perp ticker, orderbook depth, perp funding rate, mark price, and open interest. Keyless public endpoints only \u2014 no account, no trading, never signs.",inputSchema:{type:"object",required:["coin"],properties:{venue:{type:"string",description:"binance, okx, bybit, or all (default: all)"},op:{type:"string",description:"ticker, orderbook, funding, markPrice, or openInterest (default: ticker)"},coin:{type:"string",description:"Base asset, e.g. BTC. Full exchange symbols also accepted."},quote:{type:"string",description:"Quote asset (default: USDT)"},market:{type:"string",description:"spot or perp (default: spot; funding/openInterest force perp)"},limit:{type:"number",description:"Orderbook depth levels"}}}},{name:"cex_basis_scan",description:"Cross-venue perp basis and funding-spread scan across Binance, OKX, Bybit and Hyperliquid public data. Returns per-venue perp mark vs spot basis in bps plus pairwise ANNUALIZED funding deltas (Hyperliquid settles hourly, CEXes 8h, so raw rates are not comparable). Analysis over public reads \u2014 no sizing, no order, never signs.",inputSchema:{type:"object",required:["coin"],properties:{coin:{type:"string",description:"Base asset, e.g. BTC or ETH"},quote:{type:"string",description:"Quote asset for the CEX legs (default: USDT)"},venues:{type:"string",description:"Comma-separated subset of binance,okx,bybit,hyperliquid (default: all)"},fundingOnly:{type:"boolean",description:"Return only the funding-spread view"}}}},{name:"snapshot_governance",description:"Read-only Snapshot.org hub: spaces, proposals, proposal detail, an address's votes and voting power. Never signs a vote.",inputSchema:{type:"object",properties:{op:{type:"string",description:"spaces, proposals, activeProposals, proposal, votes, votingPower, or health (default: spaces)"},space:{type:"string"},spaces:{type:"array",items:{type:"string"}},id:{type:"string",description:"proposal id"},voter:{type:"string"},state:{type:"string"},first:{type:"number"}}}},{name:"tally_governance",description:"Read-only Governor Bravo / OZ Governor proposal state and vote tallies for major DAOs. Never casts, queues, or executes a vote.",inputSchema:{type:"object",properties:{op:{type:"string",description:"governors, info, proposals, proposal, voterStatus, or health (default: governors)"},dao:{type:"string",description:"compound, uniswap, ens, aave, gitcoin, arbitrum, optimism"},proposalId:{type:"string"},account:{type:"string"}}}},{name:"stablecoin_peg_scan",description:"Rank major and Hyperliquid-native stables by absolute bps from $1. Unpriced is unknown, never on-peg. Read-only.",inputSchema:{type:"object",properties:{symbols:{type:"array",items:{type:"string"}},usePyth:{type:"boolean"},useDex:{type:"boolean"}}}},{name:"lending_markets",description:"Scan lending protocol markets across Compound ($2B+ TVL). Returns supply/borrow APYs, total supply, collateral factors. Read-only.",inputSchema:{type:"object",properties:{}}},{name:"yield_vaults",description:"Scan yield aggregator vaults across Yearn + Convex. Returns vault APYs, TVLs, boosted status. Read-only.",inputSchema:{type:"object",properties:{}}},{name:"watch_list",description:"List alert-only price/token watches. Never execute.",inputSchema:{type:"object",properties:{}}},{name:"watch_create",description:"Create an alert-only watch. actionMode is always alert_only. Never execute.",inputSchema:{type:"object",required:["chain","token","condition"],properties:{chain:{type:"string"},token:{type:"string"},condition:{type:"string"},note:{type:"string"}}}},{name:"receipt_report",description:"Classify a caller-supplied receipt. Reports whether a tx hash exists. Does not verify chain success.",inputSchema:{type:"object",properties:{hash:{type:"string"},transactionHash:{type:"string"},txid:{type:"string"},receipt:{type:"object"}}}},{name:"twitter_ca_watch",description:"One Twitter CA watch tick: read an account, extract EVM/Solana CAs, rank the USD book, PREPARE only. Automated ticks never emit a card and never broadcast. Needs ORACLE_XURL_ENABLED=true.",inputSchema:{type:"object",required:["handle"],properties:{handle:{type:"string"},chainId:{type:"number",description:"default 4663 Robinhood"},limit:{type:"number"}}}},{name:"trade_lifecycle",description:"Create, verify, or advance a prepare-only trade fact chain. Signing and broadcasting are never performed here.",inputSchema:{type:"object",required:["action"],properties:{action:{type:"string",enum:["create","verify","advance"]},tradeId:{type:"string"},intent:{type:"object"},lifecycle:{type:"object"},state:{type:"string"},fact:{type:"object"},asOf:{type:"number"}}}},{name:"signal_score",description:"Cold-score onchain signal events. Never fetches or executes.",inputSchema:{type:"object",required:["events"],properties:{events:{type:"array",items:{type:"object"}},markouts:{type:"array",items:{type:"object"}},openIntents:{type:"boolean"},limit:{type:"number"}}}},{name:"workspace_artifact",description:"Get, list, put, or link deterministic workspace artifacts. No arbitrary paths.",inputSchema:{type:"object",required:["action"],properties:{action:{type:"string",enum:["get","list","put","link"]},id:{type:"string"},type:{type:"string"},createdAt:{type:"string"},data:{type:"object"},parentId:{type:"string"},childId:{type:"string"}}}},{name:"research_artifact",description:"Create a citation-bearing research artifact. fetchedAt must be supplied by the caller.",inputSchema:{type:"object",required:["sourceUrl","fetchedAt","snapshot","claim","confidence"],properties:{sourceUrl:{type:"string"},fetchedAt:{type:"string"},snapshot:{type:"string"},claim:{type:"string"},confidence:{type:"number"},contradictions:{type:"array",items:{type:"string"}}}}},{name:"portfolio_analyze",description:"Summarize a caller-supplied portfolio ledger. Read-only.",inputSchema:{type:"object",required:["ledger","asOf"],properties:{ledger:{type:"object"},asOf:{type:"number"},priceTtlMs:{type:"number"}}}},{name:"tax_lots",description:"Build exact-integer cost-basis records from caller-supplied events. Accounting records only, not tax advice.",inputSchema:{type:"object",required:["input"],properties:{input:{type:"object",additionalProperties:!0},method:{type:"string",enum:["fifo","lifo","hifo","specific"]},asOf:{type:"string",minLength:1}},additionalProperties:!1}},{name:"position_health",description:"Evaluate caller-supplied lending or farming snapshots. Alert-only, with no network access or execution signal.",inputSchema:{type:"object",required:["action","input","asOf"],properties:{action:{type:"string",enum:["evaluate","book"]},input:{type:"object",additionalProperties:!0},asOf:{type:"string",minLength:1},thresholds:{type:"object",additionalProperties:!0}},additionalProperties:!1}},{name:"governance_prepare",description:"Create a deterministic semantic preview of a caller-supplied governance intent. No adapter, calldata, vote, signature, or broadcast.",inputSchema:{type:"object",required:["input","asOf"],properties:{input:{type:"object",additionalProperties:!0},asOf:{type:"string",minLength:1}},additionalProperties:!1}},{name:"safety_intelligence",description:"Evaluate caller-supplied address or transaction safety evidence. No source is contacted and unknown evidence fails closed.",inputSchema:{type:"object",required:["action","input","asOf"],properties:{action:{type:"string",enum:["address","transaction"]},input:{type:"object",additionalProperties:!0},asOf:{type:"string",minLength:1},minClearConfidence:{type:"number",minimum:0,maximum:1},minBlockConfidence:{type:"number",minimum:0,maximum:1}},additionalProperties:!1}},{name:"portfolio_risk",description:"Summarize concentration and coverage from caller-supplied portfolio snapshots. No network or account access.",inputSchema:{type:"object",required:["input"],properties:{input:{type:"object",additionalProperties:!0}},additionalProperties:!1}},{name:"mev_status",description:"MEV observer/operator flag posture. Read-only. Never implies a live trade. Flash-loan execute still needs ORACLE_MEV_EXECUTE_ENABLED=1 and literal --execute on oracle mev.",inputSchema:{type:"object",properties:{}}},{name:"chain_list",description:"List Oracle's EVM chain registry (chainId, name, rpc env names). Read-only.",inputSchema:{type:"object",properties:{}}},{name:"tron_account",description:"Tron account: TRX balance (sun + display) and resource state via public TronGrid. Read-only; no keys, no broadcast.",inputSchema:{type:"object",required:["address"],properties:{address:{type:"string",description:"Base58 Tron address (T\u2026)"}}}},{name:"tron_trc20_balances",description:"TRC20 token balances for a Tron address. USDT-TRC20 is decorated with symbol/decimals. Read-only.",inputSchema:{type:"object",required:["address"],properties:{address:{type:"string"},contract:{type:"string",description:"Optional TRC20 contract to filter to."}}}},{name:"tron_trc20_transfers",description:"TRC20 transfer history for a Tron address. Defaults to the USDT contract (the dominant stablecoin rail); pass contract:'all' to drop the filter. Read-only.",inputSchema:{type:"object",required:["address"],properties:{address:{type:"string"},contract:{type:"string",description:"TRC20 contract, or 'all'. Defaults to USDT-TRC20."},limit:{type:"number"}}}},{name:"tron_chain_parameters",description:"Tron network chain parameters (energy fee, bandwidth price, account create fee). Read-only.",inputSchema:{type:"object",properties:{key:{type:"string"}}}},{name:"ton_account",description:"TON account state and nanoton/TON balance via public toncenter. Accepts raw (0:hex) or base64url addresses. Read-only.",inputSchema:{type:"object",required:["address"],properties:{address:{type:"string"}}}},{name:"ton_jetton_balances",description:"Jetton (TON fungible token) balances for an owner, with symbol/decimals where published. Read-only.",inputSchema:{type:"object",required:["owner"],properties:{owner:{type:"string"},jettonMaster:{type:"string"},limit:{type:"number"}}}},{name:"ton_transactions",description:"Recent TON transactions for an address (newest first). Read-only.",inputSchema:{type:"object",required:["address"],properties:{address:{type:"string"},limit:{type:"number"}}}},{name:"cosmos_chains",description:"List the Cosmos SDK chains Oracle can reach keylessly (cosmoshub, osmosis, celestia, injective, neutron, dydx, noble, kava) plus their LCD env overrides. Read-only.",inputSchema:{type:"object",properties:{}}},{name:"cosmos_balances",description:"Bank balances for a bech32 Cosmos address on any Cosmos SDK chain. IBC denoms are flagged with their hash for denom-trace resolution. Read-only.",inputSchema:{type:"object",required:["address"],properties:{address:{type:"string"},chain:{type:"string",description:"Chain key (default cosmoshub)."},lcdUrl:{type:"string",description:"Explicit LCD/REST base URL override."},limit:{type:"number"}}}},{name:"cosmos_delegations",description:"Staking delegations, unbonding entries, and pending rewards for a Cosmos delegator. Read-only.",inputSchema:{type:"object",required:["address"],properties:{address:{type:"string"},chain:{type:"string"},lcdUrl:{type:"string"},includeRewards:{type:"boolean"}}}},{name:"cosmos_denom_trace",description:"Resolve an ibc/<64-hex> denom back to its (path, base_denom) origin, or list a chain's trace table. Read-only.",inputSchema:{type:"object",properties:{hash:{type:"string",description:"ibc/<hash> denom or bare 64-hex hash. Omit to list traces."},chain:{type:"string"},lcdUrl:{type:"string"},limit:{type:"number"}}}},{name:"aptos_account",description:"Aptos account sequence number and authentication key via the public fullnode. Read-only.",inputSchema:{type:"object",required:["address"],properties:{address:{type:"string"}}}},{name:"aptos_resources",description:"Move resources held by an Aptos account, or one resource via resourceType. Read-only.",inputSchema:{type:"object",required:["address"],properties:{address:{type:"string"},resourceType:{type:"string"},limit:{type:"number"}}}},{name:"aptos_coin_balances",description:"Aptos coin balances: every 0x1::coin::CoinStore held, or one coinType through the 0x1::coin::balance view function. Read-only.",inputSchema:{type:"object",required:["address"],properties:{address:{type:"string"},coinType:{type:"string"}}}}],X0=String(el.env.ORACLE_DEFAULT_ADDRESS||el.env.MAD_OPERATOR_ADDRESS||"").trim(),HN=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"]),zN=new Set(J0.map(e=>e.name));for(let e of HN)if(zN.has(e))throw new Error(`public MCP custody boundary violated: ${e}`);var VN={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||X0||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||X0;if(!t)throw new Error("address required (set ORACLE_DEFAULT_ADDRESS to supply a default)");return{provider:"evm-rpc",op:"getBalance",args:{chainId:e.chainId,address:t}}},rpc_block:e=>({provider:"evm-rpc",op:"blockNumber",args:{chainId:e.chainId}}),solana_balance:e=>({provider:"solana-rpc",op:"getBalance",args:{address:e.address,commitment:e.commitment}}),solana_token_accounts:e=>({provider:"solana-rpc",op:"tokenAccounts",args:{owner:e.owner,mint:e.mint,commitment:e.commitment}}),solana_simulate:e=>({provider:"solana-rpc",op:"simulate",args:{transaction:e.transaction,sigVerify:e.sigVerify,replaceRecentBlockhash:e.replaceRecentBlockhash}}),jupiter_venues:e=>({provider:"jupiter",op:"venues",args:{verify:e.verify,rpc:e.rpc}}),jupiter_quote:e=>({provider:"jupiter",op:"quote",args:{inputMint:e.inputMint,outputMint:e.outputMint,amount:e.amount,slippageBps:e.slippageBps}}),jupiter_prepare:e=>({provider:"jupiter",op:"prepare",args:{userPublicKey:e.userPublicKey,quoteResponse:e.quoteResponse,inputMint:e.inputMint,outputMint:e.outputMint,amount:e.amount,slippageBps:e.slippageBps}}),btc_health:()=>({provider:"bitcoin-esplora",op:"health",args:{}}),tron_account:e=>({provider:"tron-public",op:"account",args:{address:e.address}}),tron_trc20_balances:e=>({provider:"tron-public",op:"trc20Balances",args:{address:e.address,contract:e.contract}}),tron_trc20_transfers:e=>({provider:"tron-public",op:"trc20Transfers",args:{address:e.address,contract:e.contract,limit:e.limit}}),tron_chain_parameters:e=>({provider:"tron-public",op:"chainParameters",args:{key:e.key}}),ton_account:e=>({provider:"ton-public",op:"accountState",args:{address:e.address}}),ton_jetton_balances:e=>({provider:"ton-public",op:"jettonBalances",args:{owner:e.owner,jettonMaster:e.jettonMaster,limit:e.limit}}),ton_transactions:e=>({provider:"ton-public",op:"transactions",args:{address:e.address,limit:e.limit}}),cosmos_chains:()=>({provider:"cosmos-lcd",op:"chains",args:{}}),cosmos_balances:e=>({provider:"cosmos-lcd",op:"balances",args:{address:e.address,chain:e.chain,lcdUrl:e.lcdUrl,limit:e.limit}}),cosmos_delegations:e=>({provider:"cosmos-lcd",op:"delegations",args:{address:e.address,chain:e.chain,lcdUrl:e.lcdUrl,includeRewards:e.includeRewards}}),cosmos_denom_trace:e=>({provider:"cosmos-lcd",op:"denomTrace",args:{hash:e.hash,chain:e.chain,lcdUrl:e.lcdUrl,limit:e.limit}}),aptos_account:e=>({provider:"aptos-public",op:"account",args:{address:e.address}}),aptos_resources:e=>({provider:"aptos-public",op:"resources",args:{address:e.address,resourceType:e.resourceType,limit:e.limit}}),aptos_coin_balances:e=>({provider:"aptos-public",op:"coinBalances",args:{address:e.address,coinType:e.coinType}}),btc_fees:()=>({provider:"bitcoin-esplora",op:"fees",args:{}}),btc_balance:e=>({provider:"bitcoin-esplora",op:"address",args:{address:e.address}}),btc_utxos:e=>({provider:"bitcoin-esplora",op:"utxos",args:{address:e.address}}),btc_tx:e=>({provider:"bitcoin-esplora",op:"tx",args:{txid:e.txid}}),btc_meta_health:()=>({provider:"bitcoin-meta",op:"health",args:{}}),btc_rune_balance:e=>({provider:"bitcoin-meta",op:"runeBalances",args:{address:e.address}}),btc_inscriptions:e=>({provider:"bitcoin-meta",op:"inscriptions",args:{address:e.address,limit:e.limit}}),btc_inscription_info:e=>({provider:"bitcoin-meta",op:"inscriptionInfo",args:{inscriptionId:e.inscriptionId}}),btc_inscription_children:e=>({provider:"bitcoin-meta",op:"inscriptionChildren",args:{inscriptionId:e.inscriptionId,page:e.page}}),btc_ord_block_info:e=>({provider:"bitcoin-meta",op:"ordBlockInfo",args:{height:e.height}}),satflow_health:()=>({provider:"satflow",op:"health",args:{}}),satflow_floors:e=>({provider:"satflow",op:"collectionFloors",args:{type:e.type,ids:e.ids}}),satflow_wallet:e=>({provider:"satflow",op:"walletContents",args:{address:e.address,type:e.type,limit:e.limit}}),satflow_item:e=>({provider:"satflow",op:"item",args:{inscriptionId:e.inscriptionId||e.id}}),satflow_floor_listings:e=>({provider:"satflow",op:"floorListings",args:{collectionIds:e.collectionIds||e.ids,limit:e.limit}})};async function nl(e,{method:t="GET",body:n,signal:r}={}){let o=await fetch(e,{method:t,headers:{"content-type":"application/json"},body:n?JSON.stringify(n):void 0,signal:r}),i=await jN(o);if(!o.ok)throw new Error(i.error||`HTTP ${o.status}`);return i}async function Te(e,t,n={},r={}){try{return await nl(`${tl}/data/call`,{method:"POST",body:{provider:e,op:t,args:n},signal:r.signal})}catch(o){let i=typeof o?.message=="string"?o.message:"";if(i&&!/^HTTP \d+$/.test(i))return{error:i,provider:e,op:t};throw o}}async function Q0(e,t={},n={}){if(e.startsWith("launch_radar_"))return Ka(e,t);let r={strategy_draft:{operation:"draft"},strategy_validate:{operation:"validate"},strategy_backtest:{operation:"backtest"},strategy_optimize:{operation:"optimize"},strategy_evidence:{operation:"evidence"},strategy_shadow_start:{operation:"shadow",action:"start"},strategy_shadow_list:{operation:"shadow",action:"list"},strategy_shadow_status:{operation:"shadow",action:"get"},strategy_shadow_step:{operation:"shadow",action:"step"},strategy_shadow_stop:{operation:"shadow",action:"stop"},strategy_prepare_live:{operation:"prepare"}}[e];if(r){let{runStrategyOperation:i}=await Promise.resolve().then(()=>(ym(),hm));return i(r.operation,{...t,...r.action?{action:r.action}:{},nowMs:t.nowMs??Date.now()},{signal:n.signal})}if(e==="rfq_quote"){let{normalizeRfqIntent:i}=await Promise.resolve().then(()=>(Cc(),Tm)),{requestRfqQuotes:s}=await Promise.resolve().then(()=>($m(),Lm)),a=i({...t,sources:t.sources??t.allowedSources});return s(a,{decimalsIn:t.decimalsIn,decimalsOut:t.decimalsOut,signal:n.signal})}if(e==="best_swap_route"||e==="best_bridge_route"){let{bestSwapRoute:i,bestBridgeRoute:s}=await Promise.resolve().then(()=>(Vn(),hp));return e==="best_swap_route"?i(t,n):s(t,n)}if(e==="prepare_best_route"){let{prepareBestRoute:i}=await Promise.resolve().then(()=>(Ra(),gp));return i(t,n)}if(e==="prepare_best_bridge_route"){let{prepareBestBridgeRoute:i}=await Promise.resolve().then(()=>(Bm(),qm));return i(t,n)}if(e==="twap_simulate"){let{simulateTwap:i}=await Promise.resolve().then(()=>(Fm(),Dm));return i({...t,amount:t.amount??t.amountIn},{signal:n.signal,...n.quoteFn?{quoteFn:n.quoteFn}:{}})}if(e==="bridge_aggregator_scan"){let{scanBridgeRoutes:i}=await Promise.resolve().then(()=>(vh(),Sh));return i(t,n)}if(e==="perps_markets"){let i=String(t.venue||"all").toLowerCase(),s={};if(i==="all"||i==="dydx"){let{dydxMarkets:a}=await Promise.resolve().then(()=>(xh(),Ah));s.dydx=await a(void 0,n)}if(i==="all"||i==="drift"){let{driftMarkets:a}=await Promise.resolve().then(()=>(Th(),Oh));s.drift=await a(n)}if(i==="all"||i==="vertex"){let{vertexMarkets:a}=await Promise.resolve().then(()=>(Ph(),Rh));s.vertex=await a(n)}return s}if(e==="dex_quote"){let i=String(t.dex||"").toLowerCase();if(i==="pancakeswap"){let{pancakeQuote:s}=await Promise.resolve().then(()=>($h(),Lh));return s(t,n)}if(i==="sushiswap"){let{sushiQuote:s}=await Promise.resolve().then(()=>(Uh(),Bh));return s(t,n)}if(i==="raydium"){let{raydiumQuote:s}=await Promise.resolve().then(()=>(Dh(),Mh));return s(t,n)}return{error:`unknown dex: ${i} \u2014 use pancakeswap, sushiswap, or raydium`}}if(e==="options_markets"){let{aevoMarkets:i}=await Promise.resolve().then(()=>(jh(),Fh));return{aevo:await i(n)}}if(e==="cex_market_data"){let i=String(t.venue||"all").toLowerCase(),s=String(t.op||"ticker"),a=new Set(["ticker","orderbook","funding","markPrice","openInterest"]);if(!a.has(s))return{error:`unknown op: ${s} \u2014 use ${[...a].join(", ")}`};if(!t.coin&&!t.symbol)return{error:"cex_market_data requires coin"};let c={coin:t.coin??t.symbol,quote:t.quote,market:t.market,limit:t.limit},[u,l,d]=await Promise.all([Promise.resolve().then(()=>(uo(),Dc)),Promise.resolve().then(()=>(Wc(),Vc)),Promise.resolve().then(()=>(Xc(),Yc))]),f={binance:{ticker:u.binanceTicker,orderbook:u.binanceOrderbook,funding:u.binanceFunding,markPrice:u.binanceMarkPrice,openInterest:u.binanceOpenInterest},okx:{ticker:l.okxTicker,orderbook:l.okxOrderbook,funding:l.okxFunding,markPrice:l.okxMarkPrice,openInterest:l.okxOpenInterest},bybit:{ticker:d.bybitTicker,orderbook:d.bybitOrderbook,funding:d.bybitFunding,markPrice:d.bybitMarkPrice,openInterest:d.bybitOpenInterest}};if(i!=="all"&&!f[i])return{error:`unknown venue: ${i} \u2014 use binance, okx, bybit, or all`};let p=i==="all"?Object.keys(f):[i],m=await Promise.all(p.map(async y=>{try{return[y,await f[y][s](c,n)]}catch(h){return[y,{error:String(h.message||h).slice(0,200)}]}}));return{op:s,...Object.fromEntries(m)}}if(e==="cex_basis_scan"){if(!t.coin)return{error:"cex_basis_scan requires coin"};let{cexBasis:i,cexFundingSpread:s}=await Promise.resolve().then(()=>(iy(),oy)),a={coin:t.coin,quote:t.quote,venues:t.venues};return t.fundingOnly===!0?s(a,n):i(a,n)}if(e==="snapshot_governance"){let i=String(t.op||"spaces"),s={health:()=>Te("snapshot-governance","health",{},n),spaces:()=>Te("snapshot-governance","spaces",t,n),proposals:()=>Te("snapshot-governance","proposals",t,n),activeProposals:()=>Te("snapshot-governance","activeProposals",t,n),proposal:()=>Te("snapshot-governance","proposal",t,n),votes:()=>Te("snapshot-governance","votes",t,n),votingPower:()=>Te("snapshot-governance","votingPower",t,n)};return s[i]?s[i]():{error:`unknown op: ${i}`}}if(e==="tally_governance"){let i=String(t.op||"governors"),s={health:()=>Te("tally-governance","health",{},n),governors:()=>Te("tally-governance","governors",{},n),info:()=>Te("tally-governance","info",t,n),proposals:()=>Te("tally-governance","proposals",t,n),proposal:()=>Te("tally-governance","proposal",t,n),voterStatus:()=>Te("tally-governance","voterStatus",t,n),tallyProposals:()=>Te("tally-governance","tallyProposals",t,n)};return s[i]?s[i]():{error:`unknown op: ${i}`}}if(e==="stablecoin_peg_scan")return Te("stablecoin-peg","scan",t,n);if(e==="lending_markets"){let{compoundMarkets:i}=await Promise.resolve().then(()=>(ay(),sy));return{compound:await i(n)}}if(e==="yield_vaults"){let[{yearnVaults:i},{convexPools:s}]=await Promise.all([Promise.resolve().then(()=>(uy(),cy)),Promise.resolve().then(()=>(dy(),ly))]);return{yearn:await i(n),convex:await s(n)}}if(e==="equity_venues"){let{equityVenues:i,toJsonSafe:s}=await Promise.resolve().then(()=>(ds(),ls));return s(i())}if(e==="equity_quote"){let{bestEquityRoute:i,toJsonSafe:s}=await Promise.resolve().then(()=>(ds(),ls));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(()=>(ds(),ls));return s(i({ticker:t.ticker,recipient:t.recipient||t.taker,sizeUsd:t.sizeUsd}))}if(e==="scanner_coverage"){let i=await Promise.resolve().then(()=>(fs(),ps));return i.registerBuiltinScanners?.(),i.scannerCoverage()}if(e==="scan_token"){let i=await Promise.resolve().then(()=>(fs(),ps));i.registerBuiltinScanners?.();let s=i.getScanner(Number(t.chainId));if(!s)throw new Error(`no scanner registered for chainId ${t.chainId}`);let a=await s.resolveToken(t.token,n),c=s.supports?.("resolvePools")?await s.resolvePools(t.token,n).catch(()=>null):null,u=s.supports?.("scoreRisk")?await s.scoreRisk(t.token,n).catch(()=>null):null;return{chainId:Number(t.chainId),token:a,pools:c,risk:u}}if(e==="wallet_balances"){let i=await Promise.resolve().then(()=>(fs(),ps));i.registerBuiltinScanners?.();let s=i.getScanner(Number(t.chainId));if(!s)throw new Error(`no scanner registered for chainId ${t.chainId}`);let a=await s.nativeBalance(t.address,n),c=t.token?await s.tokenBalance({owner:t.address,token:t.token},n).catch(()=>null):null;return{chainId:Number(t.chainId),address:t.address,native:a,token:c}}if(e==="watch_list"){let{listWatches:i}=await Promise.resolve().then(()=>(xu(),Au));return{ok:!0,watches:i(),actionMode:"alert_only",execution:!1}}if(e==="watch_create"){let{createWatch:i}=await Promise.resolve().then(()=>(xu(),Au));return{ok:!0,watch:i(t),execution:!1}}if(e==="receipt_report"){let{classifyReceipt:i}=await Promise.resolve().then(()=>(ug(),cg));return{ok:!0,...i(t.receipt||t),execution:!1}}if(e==="twitter_ca_watch"){let{tickTwitterCaWatch:i}=await Promise.resolve().then(()=>(Og(),_g));return i({handle:t.handle,chainId:t.chainId,limit:t.limit,automated:!0},n)}if(["trade_lifecycle","signal_score","workspace_artifact","research_artifact","portfolio_analyze","tax_lots","position_health","governance_prepare","safety_intelligence","portfolio_risk"].includes(e)){let{runDeskTool:i}=await Promise.resolve().then(()=>(V0(),z0));return i(e,t,{signal:n.signal})}if(e==="mev_status"){let{executeGloballyEnabled:i,mevExecuteEnabled:s}=await Promise.resolve().then(()=>(G0(),W0));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(()=>(na(),Rl));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 nl(`${tl}/data/catalog`,{signal:n.signal});if(e==="data_health")return nl(`${tl}/data/health`,{signal:n.signal});if(e==="tool_output_shape"){let i=String(t?.tool||""),s=bl(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=VN[e];if(o){let{provider:i,op:s,args:a}=o(t);return Te(i,s,a,n)}throw new Error(`Unknown tool: ${e}`)}function Z0(e,t){if(e?.dataBase64&&/^image\/(?:svg\+xml|png|jpeg|webp)$/.test(String(e.mimeType||""))){let{dataBase64:c,...u}=e,l=Uo(JSON.stringify(xr(u),null,2));return{content:[{type:"image",data:c,mimeType:e.mimeType},{type:"text",text:l}]}}let n=JSON.stringify(e,null,2),r=xr(e),o=Uo(JSON.stringify(r,null,2)),s=/"(?:mac|calldata|calldataHash|unsignedTransaction|typedData)"\s*:/.test(o)?null:hl(t,o,r);t!=="tool_output_shape"&&gl(t,r);let a=[{type:"text",text:s?s.text:o}];try{let c=o===n?pl(t,e):null;c&&a.push(c)}catch{}return{content:a}}var eb=Object.freeze({name:"oracle-data-mcp",version:"1",tools:J0,async call(e,t,n={}){return Z0(await Q0(e,t,n),e)}});function WN(){return js(eb)}function GN(){let e=el.argv[1];if(!e)return!1;try{return K0.realpathSync(e)===K0.realpathSync(MN(import.meta.url))}catch{return!1}}GN()&&WN();function KN({timeoutMs:e,callToolOptions:t={}}={}){return Bo({...eb,async call(n,r,o={}){return Z0(await Q0(n,r,{...t,...o}),n)}},{...e==null?{}:{callTimeoutMs:e}})}var zM=KN();export{HN as PUBLIC_MCP_FORBIDDEN_TOOLS,VN as ROUTES,J0 as TOOLS,Q0 as callTool,KN as createPublicMcpHandler,Z0 as formatMcpResult,zM as handle,nl as httpJson,jN as readBoundedJsonResponse,DN as resolveDataUrl,WN as startStdioLoop,J0 as tools};