@oracle-agent/oracle 0.28.28 → 0.28.30

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (61) hide show
  1. package/README.md +10 -3
  2. package/SETUP.md +3 -0
  3. package/dist/assets/skills/bankrbot/SKILL.md +24 -0
  4. package/dist/assets/skills/oracle-agentic-crypto/SKILL.md +39 -0
  5. package/dist/assets/skills/oracle-desk-product/SKILL.md +1 -1
  6. package/dist/assets/skills/oracle-uniswap-v4-hooks/SKILL.md +31 -0
  7. package/dist/assets/skills/oracle-x402/SKILL.md +30 -0
  8. package/dist/bin/desk-server.mjs +28 -26
  9. package/dist/bin/oracle-data-mcp.mjs +26 -12
  10. package/dist/bin/oracle-gateway.mjs +39 -27
  11. package/dist/bin/oracle-mev-arb-shadow.mjs +5 -5
  12. package/dist/bin/oracle-mev-shadow.mjs +5 -5
  13. package/dist/bin/oracle-public-server.mjs +4 -4
  14. package/dist/bin/oracle-route.mjs +15 -15
  15. package/dist/bin/oracle-scan.mjs +11 -11
  16. package/dist/bin/oracle.mjs +4 -3
  17. package/dist/cli/commands/auth.mjs +6 -6
  18. package/dist/cli/commands/chat.mjs +161 -161
  19. package/dist/cli/commands/doctor.mjs +1 -1
  20. package/dist/cli/commands/eval.mjs +138 -139
  21. package/dist/cli/commands/farm.mjs +22 -22
  22. package/dist/cli/commands/follow.mjs +14 -14
  23. package/dist/cli/commands/harness.mjs +4 -4
  24. package/dist/cli/commands/model.mjs +163 -163
  25. package/dist/cli/commands/receipt.mjs +1 -1
  26. package/dist/cli/commands/resolve.mjs +6 -6
  27. package/dist/cli/commands/setup.mjs +23 -23
  28. package/dist/cli/commands/snipe.mjs +24 -0
  29. package/dist/cli/commands/strategy.mjs +3 -3
  30. package/dist/cli/commands/swap.mjs +25 -25
  31. package/dist/cli/commands/venues.mjs +1 -1
  32. package/dist/control/approval-binding.mjs +1 -0
  33. package/dist/control/finality.mjs +1 -0
  34. package/dist/control-plane/index.mjs +6 -0
  35. package/dist/data/desk-data.mjs +27 -25
  36. package/dist/data/names.mjs +2 -2
  37. package/dist/data/providers/farming.mjs +2 -2
  38. package/dist/governance-prepare.mjs +2 -0
  39. package/dist/index.mjs +44 -31
  40. package/dist/local-marketplace.mjs +3 -0
  41. package/dist/local-pack-registry.mjs +3 -0
  42. package/dist/local-signer/runtime.mjs +7 -7
  43. package/dist/local-x402.mjs +3 -0
  44. package/dist/nft/universal-mint-router.mjs +3 -3
  45. package/dist/notifications/index.mjs +3 -0
  46. package/dist/position-health.mjs +2 -0
  47. package/dist/router/index.mjs +2 -2
  48. package/dist/router/prepare-bridge.mjs +2 -2
  49. package/dist/safety-intelligence.mjs +1 -0
  50. package/dist/scanner/index.mjs +3 -3
  51. package/dist/strategy/index.mjs +3 -3
  52. package/dist/task.d.mts +130 -0
  53. package/dist/task.mjs +2 -0
  54. package/dist/tax-lots.mjs +5 -0
  55. package/dist/tenant-rbac.mjs +1 -0
  56. package/dist/workflow-telemetry.mjs +1 -0
  57. package/package.json +17 -2
  58. package/public/agent-connect/index.html +2 -2
  59. package/public/install.sh +2 -2
  60. package/public/oracle-splash/index.html +2 -2
  61. package/public/oracle-splash/install.sh +2 -2
@@ -1,12 +1,26 @@
1
1
  #!/usr/bin/env node
2
- var lp=Object.defineProperty;var E=(e,t,r)=>()=>{if(r)throw r[0];try{return e&&(t=e(e=0)),t}catch(n){throw r=[n],n}};var Q=(e,t)=>{for(var r in t)lp(e,r,{get:t[r],enumerable:!0})};import ut from"node:net";import Cp from"node:dns";function $r(e){let t=String(e).toLowerCase().split("%")[0];if((t.match(/::/g)||[]).length>1)return null;let r=p=>{if(!p)return[];let l=p.split(":"),d=l.at(-1);if(d?.includes(".")){let f=d.split(".").map(Number);if(f.length!==4||f.some(m=>!Number.isInteger(m)||m<0||m>255))return null;l.splice(l.length-1,1,(f[0]<<8|f[1]).toString(16),(f[2]<<8|f[3]).toString(16))}return l.some(f=>!/^[0-9a-f]{1,4}$/.test(f))?null:l.map(f=>Number.parseInt(f,16))},[n,o]=t.split("::"),s=r(n),i=r(o);if(!s||!i)return null;let a=t.includes("::"),c=8-s.length-i.length;if(!a&&c!==0||a&&c<1)return null;let u=[...s,...Array(Math.max(0,c)).fill(0),...i];return u.length!==8?null:Uint8Array.from(u.flatMap(p=>[p>>8,p&255]))}function ao(e,t,r){let n=Math.floor(r/8),o=r%8;for(let i=0;i<n;i+=1)if(e[i]!==t[i])return!1;if(!o)return!0;let s=255<<8-o;return(e[n]&s)===(t[n]&s)}function co(e){if(ut.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(ut.isIPv6(e)){let t=$r(e);if(!t)return!1;let r=$r("::ffff:0:0");return ao(t,r,96)?co([...t.slice(12)].join(".")):ao(t,$r("2000::"),3)?![["2001::",23],["2001:db8::",32],["2001:10::",28],["2001:2::",48],["2002::",16],["3fff::",20]].some(([o,s])=>ao(t,$r(o),s)):!1}return!1}function Tp(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(Op.has(r)||r.endsWith(".localhost")||r.endsWith(".internal"))return{ok:!1,error:`refused internal host ${r}`};let n=ut.isIP(r);return n!==0&&!co(r)?{ok:!1,error:`refused private address ${r}`}:{ok:!0,url:t,host:r,isLiteralIp:n!==0}}async function uo(e,{lookupFn:t=Cp.promises.lookup}={}){let r=Tp(e);if(!r.ok)return r;if(r.isLiteralIp)return{ok:!0,url:r.url,addresses:[{address:r.host,family:ut.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=>!co(o.address))?{ok:!1,error:`refused: ${r.host} resolves to a non-public address`}:{ok:!0,url:r.url,addresses:n}}async function lo({requireUndici:e=!1,importUndici:t=()=>import("undici")}={}){let r,n;try{let l=await t();r=l.Agent,n=l.fetch}catch(l){if(e)throw new Error(`egress-guard: untrustedUrl pinning requires the undici package, which failed to load: ${l?.message||l}`);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=l=>String(l).toLowerCase().replace(/^\[|\]$/g,"").replace(/\.+$/,""),s=new Map,i=l=>(Array.isArray(l)?l:[l]).map(d=>typeof d=="string"?{address:d}:d).filter(d=>d&&d.address).map(d=>({address:d.address,family:d.family||(ut.isIPv6(d.address)?6:4)})),a=(l,d,f)=>{s.set(o(l),i(typeof d=="string"?[{address:d,family:f}]:d))},c=l=>{let d=o(l);if(ut.isIP(d))return[{address:d,family:ut.isIPv6(d)?6:4}];let f=s.get(d);if(!f||!f.length)throw new Error(`refused: unpinned host ${l} during pinned fetch`);return f},u=new r({connect:{lookup(l,d,f){let m;try{m=c(l)}catch(y){return f(y)}return d?.all?f(null,m):f(null,m[0].address,m[0].family)}}}),p=Np((l,d={})=>n(l,{...d,dispatcher:u}),a);return{dispatcher:u,fetch:p,pin:a,resolve:c,async close(){try{await u.destroy()}catch{}}}}function Np(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[po]=Object.freeze({pin:t}),e}function fo(e){return typeof e=="function"&&typeof e[po]?.pin=="function"}function _i(e,t,r){if(!fo(e))throw new Error("pinFetchToAddresses: fetchImpl is not pin-capable");e[po].pin(t,r)}var Op,po,Ci=E(()=>{Op=new Set(["localhost","metadata.google.internal","metadata.goog"]);po=Symbol.for("oracle.egressGuard.pinCapableFetch")});import{createHash as Rp}from"node:crypto";function Up(e){let t=String(e||"").toLowerCase();return $i.includes(t)||/(^|-)(api[-_]?key|key|token|secret|auth|authorization|session|cookie|signature|access)(-|$)/.test(t)}function Fp(e){let t={};for(let[r,n]of Object.entries(e||{}))Up(r)||(t[r]=n);return t}function Lp(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 Dp(e,t){return new URL(String(e)).origin===new URL(String(t)).origin}function Mp(e,t,r,n={}){let o={};for(let[p,l]of Object.entries(r||{}))o[p.toLowerCase()]=l;let s=Object.keys(o).filter(p=>/(^|-)(api[-_]?key|key|token|secret|auth|authorization|session|cookie|signature|access)(-|$)/.test(p)),a=[...new Set([...$i,...s])].sort().map(p=>`${p}=${o[p]??""}`).join(`
3
- `),c=Rp("sha256").update(a).digest("hex").slice(0,32),u=`${n.untrustedUrl?"untrusted":"trusted"}:${n.maxResponseBytes??"unbounded"}`;return`${e} ${t} ${u} ${c}`}function jp(e,t){let r=Number(t);return Number.isFinite(r)&&r>0?Math.min(r*1e3,Ti):Math.min(250*2**e,Ti)+Math.floor(Math.random()*100)}function Zt(e,t={}){let r=new Error(e);return r.retryable=!1,Object.assign(r,t),r}function ho(e,t,r){return Zt(`HTTP response from ${e} exceeded maxResponseBytes ${r} (${t})`,{oversize:!0})}function er(e){try{let t=e?.body?.cancel?.();t&&typeof t.then=="function"&&t.catch(()=>{})}catch{}}function zp(e){return e?e.byteLength??e.length??0:0}async function Ri(e,t,{url:r,truncate:n=!1,onOversize:o}={}){if(t==null)return await e.text();let s=Number(e.headers?.get?.("content-length"));if(Number.isFinite(s)&&s>t&&(er(e),!n))throw ho(r,`content-length ${s}`,t);let i=e.body?.getReader?.();if(!i){let l=await e.text(),d=Buffer.byteLength(l,"utf8");if(d>t){if(!n)throw ho(r,`body ${d} bytes`,t);return Buffer.from(l,"utf8").subarray(0,t).toString("utf8")}return l}let a=[],c=0,u=!1;try{for(;;){let{value:l,done:d}=await i.read();if(d)break;if(l&&(a.push(Buffer.from(l)),c+=zp(l),c>t)){u=!0;break}}}finally{if(u)try{await i.cancel()}catch{}try{i.releaseLock?.()}catch{}}if(u&&(typeof o=="function"&&o(),!n))throw ho(r,`streamed ${c} bytes`,t);let p=Buffer.concat(a);return(u?p.subarray(0,t):p).toString("utf8")}function Pi(e){if(!e)return null;try{return JSON.parse(e)}catch{return null}}async function Vp(e,{fetchImpl:t,method:r,headers:n,body:o,timeoutMs:s,lookupFn:i,realFetch:a,untrustedUrl:c=!1,maxResponseBytes:u=null,importUndici:p,validateResponse:l}){let d=new AbortController,f=setTimeout(()=>d.abort(),s),m=null,y=t,g=i?{lookupFn:i}:{};if(c&&!a&&!fo(y))throw Zt(`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 b=async(S,{status:C=null}={})=>{let x=await uo(S,g);if(!x.ok)throw Zt(C==null?`HTTP refused ${S}: ${x.error}`:`HTTP redirect to ${S} ${x.error}`,C==null?{}:{status:C});let I=new URL(S).hostname;if(a){if(m&&(await m.close(),m=null),!m)try{m=await lo({requireUndici:!0,...p?{importUndici:p}:{}})}catch(v){throw Zt(C==null?`HTTP refused ${S}: ${v?.message||v}`:`HTTP redirect to ${S} refused: ${v?.message||v}`,C==null?{}:{status:C})}m.pin(I,x.addresses),y=m.fetch}else _i(y,I,x.addresses);return x};try{let S=String(e),C={...n||{}};c&&await b(S);for(let x=0;x<=Ni;x+=1){let I=await y(S,{method:r,headers:C,body:o,signal:d.signal,redirect:"manual"});if(qp.has(I.status)){if(r!=="GET"&&r!=="HEAD"){let U=await Ri(I,u??Bp,{url:S,truncate:!0}),k=new Error(`HTTP ${I.status} ${r} ${S} redirected non-idempotent request`);throw k.status=I.status,k.body=Pi(U)??U.slice(0,300),k}if(x===Ni)throw er(I),new Error(`HTTP redirect loop for ${e}`);let w=I.headers?.get?.("location"),O;try{O=Lp(w,S)}catch(U){throw er(I),U}let P=!Dp(O,S);if(er(I),P&&(C=Fp(C)),c)await b(O,{status:I.status});else if(P){let U=await uo(O,g);if(!U.ok){let k=new Error(`HTTP redirect from ${S} ${U.error}`);throw k.status=I.status,k.retryable=!1,k}a&&U.addresses?.length&&(m||(m=await lo(p?{importUndici:p}:{})),m&&(m.pin(new URL(O).hostname,U.addresses),y=m.fetch))}S=O;continue}if(typeof l=="function")try{await l(I,{url:S})}catch(w){throw er(I),Zt(w?.message||String(w))}let v=await Ri(I,u,{url:S,onOversize:()=>d.abort()}),h=Pi(v);if(!I.ok){let w=new Error(`HTTP ${I.status} ${r} ${S}`);throw w.status=I.status,w.retryAfter=I.headers?.get?.("retry-after")??null,w.body=h??v.slice(0,300),w}return h??v}throw new Error(`HTTP redirect loop for ${e}`)}finally{clearTimeout(f),m&&await m.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(),s={Accept:"application/json",...t.headers||{}},i=t.body;i!=null&&typeof i!="string"&&(s["Content-Type"]=s["Content-Type"]||"application/json",i=JSON.stringify(i));let a=Number.isInteger(t.retries)?Math.max(t.retries,0):$p,c=t.lookupFn,u=!t.fetchImpl,p=t.untrustedUrl===!0,l=t.importUndici,d=t.validateResponse,f=Number(t.maxResponseBytes),m=Number.isFinite(f)&&f>0?Math.floor(f):null,y=async()=>{let x;for(let I=0;I<=a;I++)try{return await Vp(e,{fetchImpl:r,method:o,headers:s,body:i,timeoutMs:n,lookupFn:c,realFetch:u,untrustedUrl:p,maxResponseBytes:m,importUndici:l,validateResponse:d})}catch(v){x=v;let h=v?.status,w=v?.name==="AbortError",O=new Set([408,425,429]),P=v?.retryable===!1?!1:h!=null?O.has(h)||Pp.has(h)&&Oi.has(o):!w&&Oi.has(o);if(I===a||!P)throw v;await Hp(jp(I,v?.retryAfter))}throw x};if(!(t.dedupe!==!1&&o==="GET"&&i==null))return y();let b=Mp(o,e,s,{untrustedUrl:p,maxResponseBytes:m}),S=mo.get(b);if(S)return S;let C=y().finally(()=>mo.delete(b));return mo.set(b,C),C}async function qr(e,t,r){let n=Array.from(e),o=Math.max(1,Math.min(Number(t)||1,n.length||1)),s=new Array(n.length),i=0;return await Promise.all(Array.from({length:o},async()=>{for(;i<n.length;){let a=i++;s[a]=await r(n[a],a)}})),s}var Pp,Oi,$p,Ti,$i,qp,Ni,Bp,mo,Hp,z=E(()=>{Ci();Pp=new Set([408,425,429,500,502,503,504]),Oi=new Set(["GET","HEAD","OPTIONS","PUT","DELETE"]),$p=2,Ti=4e3,$i=["authorization","x-api-key","x-tensor-api-key","0x-api-key","api-key","cookie","proxy-authorization"],qp=new Set([301,302,303,307,308]),Ni=3,Bp=64*1024;mo=new Map;Hp=e=>new Promise(t=>setTimeout(t,e))});function Gp({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"?Kp:Wp}async function go(e,t={}){if(!e||!e.type)throw new Error("hlInfo requires body.type");let r=Gp(t);return T(r,{method:"POST",body:e,fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function qi(e={}){return go({type:"meta"},e)}async function Bi({coin:e,interval:t="1h",startTime:r,endTime:n},o={}){if(!e)throw new Error("hlCandleSnapshot requires coin");let s={type:"candleSnapshot",req:{coin:String(e),interval:t,startTime:r??Date.now()-24*3600*1e3,endTime:n??Date.now()}};return go(s,o)}async function Ui({coin:e,startTime:t,endTime:r},n={}){if(!e)throw new Error("hlFundingHistory requires coin");return go({type:"fundingHistory",coin:String(e),startTime:t??Date.now()-24*3600*1e3,endTime:r??Date.now()},n)}var Wp,Kp,yo=E(()=>{z();Wp="https://api.hyperliquid.xyz/info",Kp="https://api.hyperliquid-testnet.xyz/info"});import{createHash as Qp}from"node:crypto";function Ue(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function Et(e){return typeof e=="number"&&Number.isFinite(e)}function xo(e){if(e==null||typeof e!="object"||Object.isFrozen(e))return e;if(Array.isArray(e)){for(let t of e)xo(t);return Object.freeze(e)}for(let t of Object.keys(e))xo(e[t]);return Object.freeze(e)}function lt(e){if(Array.isArray(e))return e.map(lt);if(e!=null&&typeof e=="object"){let t={};for(let r of Object.keys(e).sort())t[r]=lt(e[r]);return t}return e}function bo(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 Fi(e){return{feesUsd:e.costs.feesUsd,builderFeesUsd:e.costs.builderFeesUsd,fundingUsd:e.costs.fundingUsd,slippageUsd:e.costs.slippageUsd}}function Jp(e){return(e.feesUsd||0)+(e.builderFeesUsd||0)+Math.max(0,e.fundingUsd||0)+(e.slippageUsd||0)}function Xp(e){let t=0;for(let r of e.trades)r.grossPnlUsd>0&&(t+=r.grossPnlUsd);return t}function Zp(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 Di(e){if(!Ue(e))throw new TypeError("evidence artifact must be a plain object");if(!Yp.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(!Ue(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(!Ue(e.walkForward)||!Array.isArray(e.walkForward.windows))throw new TypeError("evidence artifact walkForward windows required");if(e.status==="pass_live_eligible"&&(!Ue(e.train)||!Ue(e.holdout)))throw new TypeError("live-eligible evidence artifact requires train and holdout facts");return lt({barsHash:e.barsHash,compilerHash:e.compilerHash,flags:e.flags.map(t=>lt(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 Mi(e){return Qp("sha256").update(JSON.stringify(Di(e)),"utf8").digest("hex")}function ve(e,t,r=0){if(!Number.isInteger(e)||e<r)throw new Error(`${t} must be an integer >= ${r}`);return e}function wo(e,t){if(!Ue(e)||!Ue(e.metrics))throw new Error(`${t} metrics required`);let r=ve(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(!Et(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 ef(e,{maxDailyLossPct:t}={}){let r=e.split,n=ve(r.trainStartIndex,"split.trainStartIndex"),o=ve(r.trainEndIndex,"split.trainEndIndex"),s=ve(r.trainBarCount,"split.trainBarCount",1),i=ve(r.holdoutStartIndex,"split.holdoutStartIndex"),a=ve(r.holdoutEndIndex,"split.holdoutEndIndex"),c=ve(r.holdoutBarCount,"split.holdoutBarCount",1);if(n!==0||o-n+1!==s||i!==o+1||a-i+1!==c)throw new Error("evidence split must be contiguous, chronological, and count-consistent");if(!Et(r.trainFraction)||r.trainFraction<=0||r.trainFraction>=1)throw new Error("split.trainFraction must be in (0,1)");wo(e.train,"train");let u=wo(e.holdout,"holdout");if(u.tradeCount<1||u.netPnlUsd<=0||u.profitFactor<=1)throw new Error("live-eligible holdout metrics do not pass");if(Et(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 p=e.walkForward,l=p.windows;if(l.length<1||p.windowsRun!==l.length)throw new Error("live-eligible walk-forward windowsRun must match nonempty windows");let d=0,f=-1;for(let y=0;y<l.length;y++){let g=l[y];if(!Ue(g)||g.index!==y||typeof g.passed!="boolean")throw new Error("walk-forward windows must be ordered and structurally valid");let b=ve(g.trainStartIndex,`walkForward.windows[${y}].trainStartIndex`),S=ve(g.trainEndIndex,`walkForward.windows[${y}].trainEndIndex`),C=ve(g.evalStartIndex,`walkForward.windows[${y}].evalStartIndex`),x=ve(g.evalEndIndex,`walkForward.windows[${y}].evalEndIndex`);if(b!==0||S>=C||C>x||C<=f)throw new Error("walk-forward windows must be chronological and disjoint");if(f=x,g.passed){if(d+=1,g.reason!=="pass")throw new Error("passed walk-forward window reason must be pass");let I=wo({metrics:g.metrics,tradeCount:g.metrics?.tradeCount},`walkForward.windows[${y}]`);if(I.tradeCount<1||I.netPnlUsd<=0||I.profitFactor<=1)throw new Error("passed walk-forward window metrics do not pass");if(Et(t)&&I.maxDrawdownPct>t)throw new Error("passed walk-forward drawdown exceeds strategy risk")}else if(g.reason==="pass")throw new Error("failed walk-forward window cannot have pass reason")}let m=d/l.length;if(!Et(p.passRate)||Math.abs(p.passRate-m)>Number.EPSILON||m<.6)throw new Error("walk-forward passRate contradicts concrete windows or is below live threshold")}function ji(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=Di(e),n=lt({id:e.id,...r});if(JSON.stringify(lt(e))!==JSON.stringify(n))throw new Error("evidence artifact contains fields unbound from its deterministic identity");let o=Mi(e);if(e.id!==o)throw new Error("evidence.id does not match its deterministic artifact facts digest");return e.status==="pass_live_eligible"&&ef(e,t),e}function So({strategy:e,bars:t,backtestOptions:r={},trainFraction:n=.7,walkForwardWindows:o=3,minTrades:s=10}={}){let i=[];if(!Ue(e))throw new TypeError("strategy must be a plain object");if(!Array.isArray(t))throw new TypeError("bars must be an array");if(!Ue(r))throw new TypeError("backtestOptions must be a plain object");if(!Et(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(s)||s<0)throw new TypeError("minTrades must be an integer >= 0");let a=de(e),c=At(a),u=tr(t),p=t.length,l=(q=[],M={})=>Li({status:"fail",strategy:a,sHash:c,barsHash:u,split:M.split||{trainStartIndex:0,trainEndIndex:-1,trainBarCount:0,holdoutStartIndex:0,holdoutEndIndex:-1,holdoutBarCount:0,trainFraction:n},train:M.train||null,holdout:M.holdout||null,walkForward:M.walkForward||{windows:[],passRate:0},flags:[...i,...q]});if(p<10)return l([{type:"insufficient_bars",message:"need at least 10 bars for evidence"}]);let d=Math.floor(p*n),f=d,m=p-f;if(d<5||m<3)return l([{type:"invalid_windowing",message:"train/holdout split too small",trainCount:d,holdoutCount:m}]);let y=t.slice(0,d),g=t.slice(f),b,S;try{b=Je(a,y,r),S=Je(a,g,r)}catch(q){return l([{type:"backtest_error",message:String(q.message||q)}])}let C={metrics:bo(b),costs:Fi(b),tradeCount:b.metrics.tradeCount},x={metrics:bo(S),costs:Fi(S),tradeCount:S.metrics.tradeCount},I={trainStartIndex:0,trainEndIndex:d-1,trainBarCount:d,holdoutStartIndex:f,holdoutEndIndex:p-1,holdoutBarCount:m,trainFraction:n},v=[],h=Math.floor(p/(o+1));if(h<3)i.push({type:"invalid_windowing",message:"walk-forward window size too small",wfSize:h});else for(let q=0;q<o;q++){let M=h*(q+1),se=M,K=Math.min(p,se+h);if(K-se<3||M<3){v.push({index:q,trainStartIndex:0,trainEndIndex:M-1,evalStartIndex:se,evalEndIndex:K-1,passed:!1,reason:"window_too_small",metrics:null});continue}let $e=t.slice(se,K),Or;try{Or=Je(a,$e,r)}catch{v.push({index:q,trainStartIndex:0,trainEndIndex:M-1,evalStartIndex:se,evalEndIndex:K-1,passed:!1,reason:"backtest_error",metrics:null});continue}let Tr=bo(Or),Nr=Zp(Tr,a.risk,s);v.push({index:q,trainStartIndex:0,trainEndIndex:M-1,evalStartIndex:se,evalEndIndex:K-1,passed:Nr,reason:Nr?"pass":"fail_metrics",metrics:Tr})}let w=v.filter(q=>q.passed).length,O=v.length===0?0:w/v.length,P={windows:v,passRate:O,windowsRun:v.length};x.metrics.tradeCount===0&&C.metrics.tradeCount===0&&i.push({type:"no_trades",message:"no trades in train or holdout"}),x.metrics.tradeCount===0&&i.push({type:"absent_oos_trades",message:"holdout produced no trades"}),x.metrics.netPnlUsd<0&&i.push({type:"holdout_loss",message:"holdout netPnlUsd is negative"}),C.metrics.netPnlUsd>0&&x.metrics.netPnlUsd<0&&C.metrics.netPnlUsd>Math.abs(x.metrics.netPnlUsd)*.25?i.push({type:"overfit",message:"profitable train with losing holdout (OOS collapse)"}):C.metrics.netPnlUsd>0&&x.metrics.netPnlUsd>0&&x.metrics.netPnlUsd<C.metrics.netPnlUsd*.1&&C.metrics.tradeCount>=s&&i.push({type:"severe_oos_collapse",message:"holdout pnl collapsed vs train"});let U=Jp(x.costs),k=Xp(S);k>0&&U>k&&i.push({type:"costs_exceed_gross",message:"holdout costs exceed gross gains"});let R=i.some(q=>["insufficient_bars","invalid_windowing","absent_oos_trades","holdout_loss","no_trades","severe_oos_collapse","backtest_error"].includes(q.type)),D=i.some(q=>q.type==="overfit"),W="fail";return x.metrics.tradeCount>=s&&x.metrics.netPnlUsd>0&&x.metrics.profitFactor>1&&x.metrics.maxDrawdownPct<=a.risk.maxDailyLossPct&&O>=.6&&!(k>0&&U>k)&&!D&&!i.some(q=>q.type==="severe_oos_collapse"||q.type==="invalid_windowing")?W="pass_live_eligible":!R&&x.metrics.tradeCount>0&&C.metrics.tradeCount>0&&Number.isFinite(x.metrics.netPnlUsd)?(W="pass_paper_only",x.metrics.tradeCount<s&&i.push({type:"undersampled",message:"holdout trades below minTrades"})):D&&x.metrics.tradeCount>0&&C.metrics.netPnlUsd>0?W="fail":x.metrics.tradeCount>0&&C.metrics.tradeCount>0&&!R?W="pass_paper_only":W="fail",x.metrics.netPnlUsd<0&&(W=W==="pass_live_eligible"?"fail":W==="pass_paper_only"?"pass_paper_only":"fail",W="fail"),Li({status:W,strategy:a,sHash:c,barsHash:u,split:I,train:C,holdout:x,walkForward:P,flags:i})}function Li({status:e,strategy:t,sHash:r,barsHash:n,split:o,train:s,holdout:i,walkForward:a,flags:c}){let u={status:e,strategyHash:r,compilerHash:pt,barsHash:n,split:o,train:s,holdout:i,walkForward:a,flags:c};return u.id=Mi(u),xo(lt(JSON.parse(JSON.stringify(u))))}var Yp,ko=E(()=>{ft();dt();Br();Yp=Object.freeze(["fail","pass_paper_only","pass_live_eligible"])});import{createHash as tf,createHmac as rf,timingSafeEqual as dx}from"node:crypto";function vo(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(vo).join(",")}]`:`{${Object.keys(e).sort().map(r=>`${JSON.stringify(r)}:${vo(e[r])}`).join(",")}}`}function Hi(e){let t=String(e?.ORACLE_STAMP_HMAC_SECRET||"").trim();return t.length>=16?t:""}function zi(e=process.env){return Hi(process.env)||Hi(e)}function af(e){let{prepareHash:t,prepareMac:r,note:n,...o}=e||{};return o}function cf(e){let t=af(e);return tf("sha256").update(vo(t)).digest("hex")}function uf(e,t=zi()){return t?rf("sha256",t).update(String(e)).digest("hex"):""}function J(e,{provider:t,kind:r,env:n=process.env,nowMs:o=Date.now(),expiresAtMs:s}={}){if(!e||typeof e!="object")throw new Error("stampPrepared: payload object required");let i=Object.prototype.hasOwnProperty.call(e,"oraclePrepared");if(i&&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:i?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=s==null?c+of:Number(s),p=u-c;if(!Number.isSafeInteger(c)||!Number.isSafeInteger(u)||p<=0||p>sf)throw new Error("stampPrepared: bounded preparedAt/expiresAt required");let d={...a,preparedAt:c,expiresAt:u,prepareVersion:nf},f=cf(d),m=zi(n),y=m?uf(f,m):void 0,g={...d,prepareHash:f};return y&&(g.prepareMac=y),g}var nf,of,sf,fe=E(()=>{nf=2,of=300*1e3,sf=(()=>{let e=Number(process.env.ORACLE_PREPARE_HARD_MAX_AGE_MS);return Number.isFinite(e)&&e>0?e:1800*1e3})()});function rr(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function df(e){return String(e).toLowerCase().replace(/[^a-z0-9]/g,"")}function Ao(e,t="value"){if(Array.isArray(e)){e.forEach((r,n)=>Ao(r,`${t}[${n}]`));return}if(rr(e))for(let[r,n]of Object.entries(e)){let o=df(r);if(lf.some(s=>o.includes(s)))throw new Error(`handoff: forbidden secret-like field at ${t}.${r}`);Ao(n,`${t}.${r}`)}}function Eo(e){return typeof e=="number"&&Number.isFinite(e)&&e>0}function Vi({strategy:e,evidence:t,shadow:r,caps:n,nowMs:o=Date.now(),env:s=process.env}={}){if(Ao({strategy:e,evidence:t,shadow:r,caps:n},"handoff"),!rr(e))throw new Error("handoff: strategy required");if(!rr(t))throw new Error("handoff: evidence required");if(!rr(r))throw new Error("handoff: shadow required");if(!rr(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 i=de(e,{nowMs:o}),a=pe(i);if(ji(t,{maxDailyLossPct:i.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 d of c)if(!(d in n)||n[d]==null)throw new Error(`handoff: caps.${d} required`);if(!Eo(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(!Eo(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(!Eo(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(d=>d==="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 p={perStrategyNotionalUsd:n.perStrategyNotionalUsd,maxLeverage:n.maxLeverage,dailyLossCapUsd:n.dailyLossCapUsd,chainAllowlist:[...n.chainAllowlist],assetAllowlist:[...n.assetAllowlist],expiresAt:n.expiresAt,killSwitchRequired:!0},l={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:nr,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:p},requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,executionReady:!1};return J(l,{provider:"hl-strategy",kind:"strategy-live-handoff",env:s})}var lf,Wi=E(()=>{ft();ko();dt();fe();lf=["privatekey","secretkey","seed","mnemonic","passphrase","password","keystore","keymaterial","apikey","authtoken","accesstoken","refreshtoken","credential","bearer","signature","authorization","xprv","xpriv","wif"]});function It(e,t){let r=Number(e);if(!Number.isFinite(r))throw new TypeError(`${t} must be finite`);return r}function _t(e,t){if(!Number.isSafeInteger(e)||e<0)throw new TypeError(`${t} must be a non-negative safe integer`);return e}function or(e){if(Array.isArray(e))for(let t of e)or(t);else if(e&&typeof e=="object")for(let t of Object.values(e))or(t);return Object.freeze(e)}function ff(e){let t=pf[e];if(!t)throw new TypeError(`unsupported strategy interval: ${e}`);return t}function mf(e,{endTime:t=Number.MAX_SAFE_INTEGER}={}){if(!Array.isArray(e))throw new TypeError("Hyperliquid candles must be an array");_t(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 s=_t(Number(o.t),`candles[${n}].t`);if(_t(Number(o.T),`candles[${n}].T`)>t)continue;let a={t:s,o:It(o.o,`candles[${n}].o`),h:It(o.h,`candles[${n}].h`),l:It(o.l,`candles[${n}].l`),c:It(o.c,`candles[${n}].c`),v:It(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(s);if(c&&JSON.stringify(c)!==JSON.stringify(a))throw new TypeError(`conflicting duplicate candle at timestamp ${s}`);c||r.set(s,a)}return or([...r.values()].sort((n,o)=>n.t-o.t))}function hf(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 s=_t(Number(o.time),`funding[${n}].time`);s>t||r.set(s,{time:s,fundingRate:It(o.fundingRate,`funding[${n}].fundingRate`)})}return[...r.values()].sort((n,o)=>n.time-o.time)}async function gf({coin:e,startTime:t,endTime:r},n){let o=[],s=Math.max(0,t-288e5),i=!1;for(let a=0;a<16&&s<=r;a++){let c=await Ui({coin:e,startTime:s,endTime:r},n);if(!Array.isArray(c))throw new TypeError("Hyperliquid funding history must be an array");o.push(...c);let u=s;for(let p of c){let l=Number(p?.time);Number.isSafeInteger(l)&&l>u&&(u=l)}if(c.length<500||u>=r){i=!0;break}if(u<=s)throw new Error("Hyperliquid funding history pagination did not advance");s=u+1}if(!i)throw new Error("strategy history exceeds the bounded funding history limit");return hf(o,r)}function yf(e,t,r){let n=0,o=null;return e.map(s=>{let i=s.t+r,a=0;for(;n<t.length&&t[n].time<i;){let c=t[n];o=c.fundingRate,c.time>=s.t&&(a+=c.fundingRate),n+=1}return o==null?{...s,fundingPaymentRate:a}:{...s,fundingRate:o,fundingPaymentRate:a}})}async function Ki(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=ff(n);if(e.endTime==null)throw new TypeError("endTime is required for deterministic history");let s=_t(e.endTime,"endTime"),i=e.count==null?1500:e.count;if(!Number.isInteger(i)||i<20||i>5e3)throw new TypeError("count must be an integer from 20 to 5000");let a=e.startTime==null?Math.max(0,s-i*o):_t(e.startTime,"startTime");if(a>=s)throw new TypeError("startTime must be before endTime");let[c,u]=await Promise.all([Bi({coin:r,interval:n,startTime:a,endTime:s},t),gf({coin:r,startTime:a,endTime:s},t)]),p=mf(c,{endTime:s}),l=or(yf(p,u,o));return or({coin:r,interval:n,range:{startTime:a,endTime:s},bars:l})}var pf,Gi=E(()=>{yo();pf=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 xf(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))wf.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"||!bf.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 Sf(e={}){let t=await qi(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 bf,wf,Qi,Yi=E(()=>{yo();Wi();Gi();bf=new Set(["1m","3m","5m","15m","30m","1h","2h","4h","8h","12h","1d"]),wf=new Set(["coin","interval"]);Qi=Object.freeze({id:"hyperliquid",validateMarket:xf,fetchBars:Ki,listMarkets:Sf,prepareIntent(e){return Vi(e)}})});function vf(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 kf.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 Io(e){return typeof e!="string"?null:Ef.get(e)??null}function _o(e){let t=Io(e);if(!t)throw new Error(`unknown strategy venue: ${String(e)}`);return t}var kf,Ji,Ef,Ax,Co=E(()=>{Yi();kf=Object.freeze(["id","validateMarket","prepareIntent"]);Ji=[Qi].map(vf),Ef=new Map(Ji.map(e=>[e.id,e])),Ax=Object.freeze([...Ji])});import{createHash as Af}from"node:crypto";function xe(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function ne(e){return typeof e=="number"&&Number.isFinite(e)}function sa(e){return Number.isInteger(e)&&e>0}function Po(e){if(e==null||typeof e!="object"||Object.isFrozen(e))return e;if(Array.isArray(e)){for(let t of e)Po(t);return Object.freeze(e)}for(let t of Object.keys(e))Po(e[t]);return Object.freeze(e)}function $o(e){if(Array.isArray(e))return e.map($o);if(e!=null&&typeof e=="object"){let t={};for(let r of Object.keys(e).sort())t[r]=$o(e[r]);return t}return e}function A(e,t,r){e.push({path:t,message:r})}function Xe(e,t,r,n){for(let o of Object.keys(e))t.has(o)||A(n,r?`${r}.${o}`:o,"unknown field is not allowed")}function ua(e,t,r,n){if(!ne(e)||!ne(t)||!ne(r)||!ne(n)||n<=0||e<t||e>r)return!1;let o=(e-t)/n;if(!Number.isFinite(o))return!1;let s=Math.round(o);return Math.abs(o-s)<=1e-9}function Ro(e,t,r,n){if(xe(e)){if(Xe(e,new Set(["param"]),t,n),typeof e.param!="string"||!e.param)return A(n,`${t}.param`,"must be a parameter name string"),null;if(!Object.prototype.hasOwnProperty.call(r,e.param))return A(n,`${t}.param`,`unknown parameter "${e.param}"`),null;let o=r[e.param];return!xe(o)||![o.value,o.min,o.max,o.step].every(sa)?(A(n,`${t}.param`,"referenced period parameter value min max and step must be positive integers"),null):{param:e.param}}return sa(e)?e:(A(n,t,"must be a positive integer or {param}"),null)}function ia(e,t,r,n){return xe(e)?(Xe(e,new Set(["param"]),t,n),typeof e.param!="string"||!e.param?(A(n,`${t}.param`,"must be a parameter name string"),null):Object.prototype.hasOwnProperty.call(r,e.param)?{param:e.param}:(A(n,`${t}.param`,`unknown parameter "${e.param}"`),null)):ne(e)?e:(A(n,t,"must be a finite number or {param}"),null)}function Ur(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 $f(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 s=e.get(n);if(s){for(let i of Ur(s))if(e.has(i)&&r(i))return!0}return t.set(n,2),!1};for(let n of e.keys())if(r(n))return!0;return!1}function qf(e,t){if(!xe(e))return A(t,"parameters","must be a plain object"),null;let r=Object.keys(e);if(r.length>ra)return A(t,"parameters",`too many parameters (max ${ra})`),null;let n={};for(let o of r){if(!aa.test(o)){A(t,`parameters.${o}`,"parameter name is malformed");continue}let s=e[o],i=`parameters.${o}`;if(!xe(s)){A(t,i,"must be a plain object");continue}Xe(s,Zi,i,t);for(let l of Zi)l in s||A(t,`${i}.${l}`,"required field is missing");let{value:a,min:c,max:u,step:p}=s;ne(c)||A(t,`${i}.min`,"must be a finite number"),ne(u)||A(t,`${i}.max`,"must be a finite number"),(!ne(p)||p<=0)&&A(t,`${i}.step`,"must be a positive finite number"),ne(a)||A(t,`${i}.value`,"must be a finite number"),ne(c)&&ne(u)&&c>u&&A(t,`${i}.min`,"min must be <= max"),ne(a)&&ne(c)&&ne(u)&&ne(p)&&p>0&&(ua(a,c,u,p)||A(t,`${i}.value`,"value must lie on the declared min/max/step grid")),n[o]={value:a,min:c,max:u,step:p}}return n}function Bf(e,t,r,n){let o=`nodes.${t}`;if(!xe(e))return A(n,o,"must be a plain object"),null;if(typeof e.type!="string"||!ta[e.type])return A(n,`${o}.type`,"unknown or missing node type"),Xe(e,Pf,o,n),null;switch(Xe(e,ta[e.type],o,n),(typeof e.id!="string"||!ca.test(e.id))&&A(n,`${o}.id`,"must be a 1-64 char id starting with alphanumeric"),e.type){case"input":return(typeof e.field!="string"||!If.has(e.field))&&A(n,`${o}.field`,"must be one of open|high|low|close|volume|fundingRate|openInterest"),{id:e.id,type:"input",field:e.field};case"constant":{let s=ia(e.value,`${o}.value`,r,n);return{id:e.id,type:"constant",value:s}}case"indicator":{(typeof e.indicator!="string"||!_f.has(e.indicator))&&A(n,`${o}.indicator`,"must be one of sma|ema|rsi|macd|bollinger|atr");let s=e.indicator,i={id:e.id,type:"indicator",indicator:s};if(s==="atr"){"input"in e&&(typeof e.input!="string"||!e.input?A(n,`${o}.input`,"must be a node id string when provided"):i.input=e.input);let a=Ro(e.period,`${o}.period`,r,n);a!=null&&(i.period=a)}else typeof e.input!="string"||!e.input?A(n,`${o}.input`,"must be a node id string"):i.input=e.input;if((s==="sma"||s==="ema"||s==="rsi"||s==="bollinger"||s==="atr")&&("period"in e,s!=="macd"))if(!("period"in e))A(n,`${o}.period`,"required field is missing");else{let a=Ro(e.period,`${o}.period`,r,n);a!=null&&(i.period=a)}if(s==="macd"){for(let a of["fastPeriod","slowPeriod","signalPeriod"])if(!(a in e))A(n,`${o}.${a}`,"required field is missing");else{let c=Ro(e[a],`${o}.${a}`,r,n);c!=null&&(i[a]=c)}"output"in e?Nf.has(e.output)?i.output=e.output:A(n,`${o}.output`,"must be line|signal|histogram"):A(n,`${o}.output`,"required field is missing"),"period"in e&&A(n,`${o}.period`,"forbidden for macd"),"stdDev"in e&&A(n,`${o}.stdDev`,"forbidden for macd")}else if(s==="bollinger"){if(!("stdDev"in e))A(n,`${o}.stdDev`,"required field is missing");else{let a=ia(e.stdDev,`${o}.stdDev`,r,n);a!=null&&(typeof a=="number"&&a<=0?A(n,`${o}.stdDev`,"must be > 0"):i.stdDev=a)}"output"in e?Rf.has(e.output)?i.output=e.output:A(n,`${o}.output`,"must be upper|middle|lower"):A(n,`${o}.output`,"required field is missing");for(let a of["fastPeriod","slowPeriod","signalPeriod"])a in e&&A(n,`${o}.${a}`,`forbidden for ${s}`)}else{"output"in e&&A(n,`${o}.output`,`forbidden for ${s}`),"stdDev"in e&&s!=="bollinger"&&A(n,`${o}.stdDev`,`forbidden for ${s}`);for(let a of["fastPeriod","slowPeriod","signalPeriod"])a in e&&A(n,`${o}.${a}`,`forbidden for ${s}`)}return i}case"compare":return(typeof e.op!="string"||!Cf.has(e.op))&&A(n,`${o}.op`,"must be gt|gte|lt|lte|eq"),(typeof e.left!="string"||!e.left)&&A(n,`${o}.left`,"must be a node id"),(typeof e.right!="string"||!e.right)&&A(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"||!Of.has(e.op))&&A(n,`${o}.op`,"must be and|or|not"),!Array.isArray(e.inputs))return A(n,`${o}.inputs`,"must be an array of node ids"),{id:e.id,type:"logic",op:e.op,inputs:[]};let s=[];for(let i=0;i<e.inputs.length;i++){let a=e.inputs[i];typeof a!="string"||!a?A(n,`${o}.inputs.${i}`,"must be a node id"):s.push(a)}return e.op==="not"?s.length!==1&&A(n,`${o}.inputs`,"not requires exactly one input"):(e.op==="and"||e.op==="or")&&s.length<2&&A(n,`${o}.inputs`,`${e.op} requires at least two inputs`),{id:e.id,type:"logic",op:e.op,inputs:s}}case"cross":return(typeof e.direction!="string"||!Tf.has(e.direction))&&A(n,`${o}.direction`,"must be above|below"),(typeof e.left!="string"||!e.left)&&A(n,`${o}.left`,"must be a node id"),(typeof e.right!="string"||!e.right)&&A(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 Uf(e,t,r){if(!xe(e))return A(t,"risk","must be a plain object"),null;Xe(e,ea,"risk",t);for(let d of ea)(!(d in e)||e[d]==null)&&A(t,`risk.${d}`,"required field is missing");let n={},o=e.maxLeverage;!ne(o)||o<=0||o>50?A(t,"risk.maxLeverage","must be a number > 0 and <= 50"):n.maxLeverage=o;let s=e.maxNotionalUsd;!ne(s)||s<=0?A(t,"risk.maxNotionalUsd","must be a number > 0"):n.maxNotionalUsd=s;let i=e.positionSizePct;!ne(i)||i<=0||i>100?A(t,"risk.positionSizePct","must be a number > 0 and <= 100"):n.positionSizePct=i;let a=e.stopLossPct;!ne(a)||a<=0||a>100?A(t,"risk.stopLossPct","must be a number > 0 and <= 100"):n.stopLossPct=a;let c=e.takeProfitPct;!ne(c)||c<=0||c>1e3?A(t,"risk.takeProfitPct","must be a number > 0 and <= 1000"):n.takeProfitPct=c;let u=e.cooldownBars;!Number.isInteger(u)||u<0||u>1e5?A(t,"risk.cooldownBars","must be an integer >= 0 and <= 100000"):n.cooldownBars=u;let p=e.maxDailyLossPct;!ne(p)||p<=0||p>100?A(t,"risk.maxDailyLossPct","must be a number > 0 and <= 100"):n.maxDailyLossPct=p;let l=e.expiresAt;return!Number.isInteger(l)||l<=0?A(t,"risk.expiresAt","must be an integer epoch milliseconds > 0"):(r.nowMs!==void 0&&(Number.isInteger(r.nowMs)?l<=r.nowMs&&A(t,"risk.expiresAt","must be strictly greater than nowMs"):A(t,"nowMs","must be an integer epoch milliseconds")),n.expiresAt=l),n}function qo(e,t={}){let r=[];if(!xe(e))return A(r,"","strategy must be a plain object"),{ok:!1,errors:r,strategy:null};Xe(e,Xi,"",r);for(let l of Xi)(!(l in e)||e[l]==null)&&A(r,l,"required field is missing");e.version!==Oo&&A(r,"version",`must be ${Oo}`),(typeof e.id!="string"||!aa.test(e.id))&&A(r,"id","must match /^[a-z0-9][a-z0-9._-]{0,63}$/"),(typeof e.name!="string"||e.name.length===0||e.name.length>oa)&&A(r,"name",`must be a non-empty string max ${oa}`);let n=Io(e.venue);n||A(r,"venue",`unknown strategy venue "${String(e.venue)}"`);let o=null;if(!n)xe(e.market)||A(r,"market","must be a plain object");else{let l=n.validateMarket(e.market);if(!l||typeof l.ok!="boolean"||!Array.isArray(l.errors))A(r,"market",`venue ${n.id} returned an invalid market validation result`);else if(l.ok)o=l.market;else for(let d of l.errors)A(r,d.path,d.message)}let s=qf(e.parameters,r),i=null,a=new Map;if(!Array.isArray(e.nodes))A(r,"nodes","must be an array");else if(e.nodes.length>na)A(r,"nodes",`too many nodes (max ${na})`);else{i=[];for(let l=0;l<e.nodes.length;l++){let d=Bf(e.nodes[l],l,s||{},r);d&&(typeof d.id=="string"&&ca.test(d.id)&&(a.has(d.id)?A(r,`nodes.${l}.id`,`duplicate node id "${d.id}"`):a.set(d.id,d)),i.push(d))}for(let l=0;l<i.length;l++){let d=i[l],f=`nodes.${l}`;for(let m of Ur(d))a.has(m)||A(r,f,`unknown node ref "${m}"`);if(d.type==="indicator"||d.type==="compare"||d.type==="cross")for(let m of Ur(d)){let y=a.get(m);y&&To.has(y.type)&&A(r,f,`node ref "${m}" must be numeric`)}if(d.type==="logic")for(let m of Ur(d)){let y=a.get(m);y&&!To.has(y.type)&&A(r,f,`node ref "${m}" must be boolean`)}}$f(a)&&A(r,"nodes","graph contains a cycle")}let c=null;if(!xe(e.rules))A(r,"rules","must be a plain object");else{Xe(e.rules,No,"rules",r);for(let l of No)l in e.rules||A(r,`rules.${l}`,"required field is missing");c={};for(let l of No){let d=e.rules[l];if(d===null){c[l]=null;continue}if(typeof d!="string"||!d){A(r,`rules.${l}`,"must be a node id or null"),c[l]=d;continue}if(!a.has(d)){A(r,`rules.${l}`,`unknown node ref "${d}"`),c[l]=d;continue}let f=a.get(d);To.has(f.type)||A(r,`rules.${l}`,`rule must reference a boolean node, not ${f.type}`),c[l]=d}}let u=Uf(e.risk,r,t);if(r.length)return{ok:!1,errors:r,strategy:null};let p=Po({version:Oo,id:e.id,name:e.name,venue:n.id,market:o,parameters:s,nodes:i,rules:c,risk:u});return{ok:!0,errors:[],strategy:p}}function de(e,t={}){let r=qo(e,t);if(!r.ok)throw new Ct(r.errors);return r.strategy}function Ff(e){let t=de(e);return JSON.stringify($o(t))}function At(e){let t=Ff(e);return Af("sha256").update(t,"utf8").digest("hex")}function sr(e,t){if(!xe(e))throw new Ct([{path:"",message:"strategy must be a plain object"}]);if(!xe(t))throw new Ct([{path:"overrides",message:"must be a plain object"}]);let r=de(e),n={};for(let[s,i]of Object.entries(r.parameters))n[s]={value:i.value,min:i.min,max:i.max,step:i.step};let o=[];for(let[s,i]of Object.entries(t)){if(!Object.prototype.hasOwnProperty.call(n,s)){A(o,s,`unknown parameter "${s}"`);continue}let a=n[s];if(!ne(i)){A(o,s,"override must be a finite number");continue}if(!ua(i,a.min,a.max,a.step)){A(o,s,"override must lie on the declared min/max/step grid");continue}n[s]={...a,value:i}}if(o.length)throw new Ct(o);return de({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(s=>{let i={...s};return Array.isArray(s.inputs)&&(i.inputs=[...s.inputs]),i}),rules:{...r.rules},risk:{...r.risk}})}var Oo,aa,ca,If,_f,Cf,Of,Tf,Nf,Rf,To,Xi,Zi,No,ea,Pf,ta,ra,na,oa,Ct,dt=E(()=>{Co();Oo=1,aa=/^[a-z0-9][a-z0-9._-]{0,63}$/,ca=/^[A-Za-z0-9][A-Za-z0-9._-]{0,63}$/,If=new Set(["open","high","low","close","volume","fundingRate","openInterest"]),_f=new Set(["sma","ema","rsi","macd","bollinger","atr"]),Cf=new Set(["gt","gte","lt","lte","eq"]),Of=new Set(["and","or","not"]),Tf=new Set(["above","below"]),Nf=new Set(["line","signal","histogram"]),Rf=new Set(["upper","middle","lower"]),To=new Set(["compare","logic","cross"]),Xi=new Set(["version","id","name","venue","market","parameters","nodes","rules","risk"]),Zi=new Set(["value","min","max","step"]),No=new Set(["entryLong","entryShort","exitLong","exitShort"]),ea=new Set(["maxLeverage","maxNotionalUsd","positionSizePct","stopLossPct","takeProfitPct","cooldownBars","maxDailyLossPct","expiresAt"]),Pf=new Set(["id","type"]),ta={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"])},ra=16,na=128,oa=100,Ct=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 ir(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 Ze(e){if(!Number.isInteger(e)||e<=0)throw new TypeError("period must be a positive integer")}function Lf(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 da(e,t){ir(e),Ze(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 Fr(e,t){ir(e),Ze(t);let r=new Array(e.length).fill(null);if(e.length<t)return r;let n=0;for(let i=0;i<t;i++)n+=e[i];let o=n/t;r[t-1]=o;let s=2/(t+1);for(let i=t;i<e.length;i++)o=s*e[i]+(1-s)*o,r[i]=o;return r}function pa(e,t){ir(e),Ze(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 s=n/t,i=o/t;r[t]=la(s,i);for(let a=t+1;a<e.length;a++){let c=e[a]-e[a-1],u=c>0?c:0,p=c<0?-c:0;s=(s*(t-1)+u)/t,i=(i*(t-1)+p)/t,r[a]=la(s,i)}return r}function la(e,t){return e===0&&t===0?50:t===0?100:e===0?0:100-100/(1+e/t)}function fa(e,t={}){ir(e);let r=t.fastPeriod,n=t.slowPeriod,o=t.signalPeriod;if(Ze(r),Ze(n),Ze(o),r>=n)throw new TypeError("fastPeriod must be < slowPeriod");let s=Fr(e,r),i=Fr(e,n),a=new Array(e.length).fill(null);for(let l=0;l<e.length;l++)s[l]!=null&&i[l]!=null&&(a[l]=s[l]-i[l]);let c=new Array(e.length).fill(null),u=new Array(e.length).fill(null),p=[];for(let l=0;l<a.length;l++)a[l]!=null&&p.push(l);if(p.length>=o){let l=0;for(let y=0;y<o;y++)l+=a[p[y]];let d=l/o,f=p[o-1];c[f]=d,u[f]=a[f]-d;let m=2/(o+1);for(let y=o;y<p.length;y++){let g=p[y];d=m*a[g]+(1-m)*d,c[g]=d,u[g]=a[g]-d}}return{line:a,signal:c,histogram:u}}function ma(e,t={}){ir(e);let r=t.period,n=t.stdDev;if(Ze(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),s=new Array(e.length).fill(null),i=new Array(e.length).fill(null);if(e.length<r)return{upper:s,middle:o,lower:i};let a=0,c=0;for(let u=0;u<e.length;u++){let p=e[u];if(a+=p,c+=p*p,u>=r){let l=e[u-r];a-=l,c-=l*l}if(u>=r-1){let l=a/r,d=c/r-l*l;d<0&&d>-1e-12&&(d=0);let f=Math.sqrt(d);o[u]=l,s[u]=l+n*f,i[u]=l-n*f}}return{upper:s,middle:o,lower:i}}function ha(e,t){Lf(e),Ze(t);let r=new Array(e.length).fill(null);if(e.length<t)return r;let n=new Array(e.length);for(let i=0;i<e.length;i++){let a=e[i];if(i===0)n[i]=a.h-a.l;else{let c=e[i-1].c;n[i]=Math.max(a.h-a.l,Math.abs(a.h-c),Math.abs(a.l-c))}}let o=0;for(let i=0;i<t;i++)o+=n[i];let s=o/t;r[t-1]=s;for(let i=t;i<e.length;i++)s=(s*(t-1)+n[i])/t,r[i]=s;return r}var ga=E(()=>{});import{createHash as Df}from"node:crypto";var Bo,Mf,jf,Hf,ya,ba=E(()=>{Bo=2,Mf="93f9c998260e73756c13871dc1a84dd6cdb26ec6113bd1941f023519939db440",jf="68f5b412a9975f04024cf9b9b6209b4bccedd52f176e95f34f786b3f53479c6a",Hf="f197a38ff1c0f4ebe13326db8cbb8167ea3dd5d62e6033fe97c2fee8d23d96b5",ya=Df("sha256").update(JSON.stringify({version:Bo,compilerSourceHash:Mf,indicatorsSourceHash:jf,schemaSourceHash:Hf})).digest("hex")});function Ee(e){return typeof e=="number"&&Number.isFinite(e)}function Wf(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 s=[];for(let[a,c]of n)c===0&&s.push(a);let i=[];for(;s.length;){let a=s.shift();i.push(a);for(let c of o.get(a))n.set(c,n.get(c)-1),n.get(c)===0&&s.push(c)}if(i.length!==e.length)throw new Error("strategy graph is cyclic");return i}function Ot(e,t){return e!=null&&typeof e=="object"&&"param"in e?t[e.param].value:e}function Kf(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 s=e[o];if(s==null||typeof s!="object"||Array.isArray(s))throw new TypeError(`bars[${o}] must be an object`);let{t:i,o:a,h:c,l:u,c:p,v:l}=s;if(!Ee(i)&&(typeof i=="number"&&Number.isFinite(i)),!Number.isFinite(i))throw new TypeError(`bars[${o}].t must be finite`);for(let[d,f]of[["o",a],["h",c],["l",u],["c",p],["v",l]])if(!Ee(f))throw new TypeError(`bars[${o}].${d} must be a finite number`);for(let[d,f]of[["o",a],["h",c],["l",u],["c",p]])if(!(f>0))throw new TypeError(`bars[${o}].${d} price must be positive`);if(l<0)throw new TypeError(`bars[${o}].v volume must be non-negative`);if(c<Math.max(a,p,u))throw new TypeError(`bars[${o}] high must be >= max(open, close, low)`);if(u>Math.min(a,p,c))throw new TypeError(`bars[${o}] low must be <= min(open, close, high)`);if(n!=null){if(!(i>n))throw new TypeError("bars t must be strictly increasing");if(i-n!==Vf[r])throw new TypeError(`bars t must match ${r} cadence`)}if(n=i,"fundingRate"in s&&s.fundingRate!=null&&!Ee(s.fundingRate))throw new TypeError(`bars[${o}].fundingRate must be finite when present`);if("openInterest"in s&&s.openInterest!=null){if(!Ee(s.openInterest))throw new TypeError(`bars[${o}].openInterest must be finite when present`);if(s.openInterest<0)throw new TypeError(`bars[${o}].openInterest must be non-negative`)}}}function mt(e,t,r,n,o,s){if(s.has(e))return s.get(e);let i=t.get(e),a;switch(i.type){case"input":{let c=zf[i.field];a=new Array(o+1);for(let u=0;u<=o;u++){let p=n[u][c];a[u]=p===void 0?null:p}break}case"constant":{let c=Ot(i.value,r);a=new Array(o+1).fill(c);break}case"indicator":{let c=i.period!=null?Ot(i.period,r):void 0;if(i.indicator==="atr"){let l=[];for(let d=0;d<=o;d++){let f=n[d];l.push({o:f.o,h:f.h,l:f.l,c:f.c})}a=ha(l,c);break}let p=mt(i.input,t,r,n,o,s).map((l,d)=>{if(l==null||!Ee(l))throw new TypeError(`indicator input ${i.input} has non-finite value at ${d}`);return l});if(i.indicator==="sma")a=da(p,c);else if(i.indicator==="ema")a=Fr(p,c);else if(i.indicator==="rsi")a=pa(p,c);else if(i.indicator==="macd")a=fa(p,{fastPeriod:Ot(i.fastPeriod,r),slowPeriod:Ot(i.slowPeriod,r),signalPeriod:Ot(i.signalPeriod,r)})[i.output];else if(i.indicator==="bollinger")a=ma(p,{period:c,stdDev:Ot(i.stdDev,r)})[i.output];else throw new Error(`unsupported indicator ${i.indicator}`);break}case"compare":{let c=mt(i.left,t,r,n,o,s),u=mt(i.right,t,r,n,o,s);a=new Array(o+1);for(let p=0;p<=o;p++){let l=c[p],d=u[p];if(l==null||d==null||!Ee(l)||!Ee(d)){a[p]=!1;continue}switch(i.op){case"gt":a[p]=l>d;break;case"gte":a[p]=l>=d;break;case"lt":a[p]=l<d;break;case"lte":a[p]=l<=d;break;case"eq":a[p]=l===d;break;default:a[p]=!1}}break}case"logic":{let c=i.inputs.map(u=>mt(u,t,r,n,o,s));a=new Array(o+1);for(let u=0;u<=o;u++)if(i.op==="not"){let p=c[0][u];a[u]=p===!0?!1:p===!1}else if(i.op==="and"){let p=!0;for(let l of c)if(l[u]!==!0){p=!1;break}a[u]=p}else if(i.op==="or"){let p=!1;for(let l of c)if(l[u]===!0){p=!0;break}a[u]=p}else a[u]=!1;break}case"cross":{let c=mt(i.left,t,r,n,o,s),u=mt(i.right,t,r,n,o,s);a=new Array(o+1),a[0]=!1;for(let p=1;p<=o;p++){let l=c[p-1],d=u[p-1],f=c[p],m=u[p];if(l==null||d==null||f==null||m==null||!Ee(l)||!Ee(d)||!Ee(f)||!Ee(m)){a[p]=!1;continue}i.direction==="above"?a[p]=l<=d&&f>m:a[p]=l>=d&&f<m}break}default:throw new Error(`unknown node type ${i.type}`)}return s.set(e,a),a}function pe(e,t={}){let r=de(e);t&&Object.keys(t).length&&(r=sr(r,t));let n=new Map(r.nodes.map(f=>[f.id,f])),o=Object.freeze(Wf(r.nodes)),s=r.parameters,i=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"])i.add(f);let a=Object.freeze([...i].sort()),c=At(r);function u(f,m){let y={};for(let b of o){let S=f.get(b);y[b]=S[m]}let g=b=>b!=null&&y[b]===!0;return{values:y,signals:{entryLong:g(r.rules.entryLong),entryShort:g(r.rules.entryShort),exitLong:g(r.rules.exitLong),exitShort:g(r.rules.exitShort)}}}function p(f,m){Kf(f,m,r.market.interval);let y=new Map;for(let g of o)mt(g,n,s,f,m,y);return y}function l(f,m){return u(p(f,m),m)}function d(f){if(!Array.isArray(f)||f.length===0)throw new TypeError("bars must be a non-empty array");let m=f.length-1,y=p(f,m);return Object.freeze(f.map((g,b)=>Object.freeze(u(y,b))))}return Object.freeze({strategy:r,strategyHash:c,compilerVersion:nr,compilerHash:pt,requiredSeries:a,nodeOrder:o,evaluate:l,evaluateAll:d})}var nr,pt,zf,Vf,ft=E(()=>{dt();ga();ba();nr=Bo,pt=ya,zf=Object.freeze({open:"o",high:"h",low:"l",close:"c",volume:"v",fundingRate:"fundingRate",openInterest:"openInterest"}),Vf=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 Gf}from"node:crypto";function Yf(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function Fe(e){return typeof e=="number"&&Number.isFinite(e)}function Uo(e){if(e==null||typeof e!="object"||Object.isFrozen(e))return e;if(Array.isArray(e)){for(let t of e)Uo(t);return Object.freeze(e)}for(let t of Object.keys(e))Uo(e[t]);return Object.freeze(e)}function Lr(e){if(Array.isArray(e))return e.map(Lr);if(e!=null&&typeof e=="object"){let t={};for(let r of Object.keys(e).sort())t[r]=Lr(e[r]);return t}return e}function Fo(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)=>Fo(r,`${t}[${n}]`));return}for(let[r,n]of Object.entries(e))Fo(n,`${t}.${r}`)}}function xa(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:s,h:i,l:a,c,v:u}=n;if(!Fe(o))throw new TypeError(`bars[${r}].t must be finite`);for(let[p,l]of[["o",s],["h",i],["l",a],["c",c],["v",u]])if(!Fe(l))throw new TypeError(`bars[${r}].${p} must be a finite number`);for(let[p,l]of[["o",s],["h",i],["l",a],["c",c]])if(!(l>0))throw new TypeError(`bars[${r}].${p} price must be positive`);if(u<0)throw new TypeError(`bars[${r}].v volume must be non-negative`);if(i<Math.max(s,c,a))throw new TypeError(`bars[${r}] high must be >= max(open, close, low)`);if(a>Math.min(s,c,i))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&&!Fe(n.fundingRate))throw new TypeError(`bars[${r}].fundingRate must be finite when present`);if("fundingPaymentRate"in n&&n.fundingPaymentRate!=null&&!Fe(n.fundingPaymentRate))throw new TypeError(`bars[${r}].fundingPaymentRate must be finite when present`);if("openInterest"in n&&n.openInterest!=null&&!Fe(n.openInterest))throw new TypeError(`bars[${r}].openInterest must be finite when present`)}}function tr(e){if(!Array.isArray(e))throw new TypeError("bars must be an array");return e.length>0&&xa(e),Gf("sha256").update(JSON.stringify(Lr(e)),"utf8").digest("hex")}function Jf(e){if(e==null&&(e={}),!Yf(e))throw new TypeError("options must be a plain object");let t={...Qf},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(!Fe(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(!Fe(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(!Fe(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 Dr(e){return e/1e4}function Xf(e,t,r){let n=Dr(r);return t==="long"?e*(1+n):e*(1-n)}function Zf(e,t,r){let n=Dr(r);return t==="long"?e*(1-n):e*(1+n)}function wa(e,t,r){let n=Math.abs(e)*Dr(t),o=Math.abs(e)*Dr(r);return{taker:n,builder:o,total:n+o}}function em(e,t){let r=e*(t.positionSizePct/100)*t.maxLeverage;return Math.min(r,t.maxNotionalUsd)}function tm(e,t,r){let n=r/100;return t==="long"?e*(1-n):e*(1+n)}function rm(e,t,r){let n=r/100;return t==="long"?e*(1+n):e*(1-n)}function nm(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 om(e,t,r){return t==="long"?e.l<=r:e.h>=r}function sm(e,t,r){return t==="long"?e.h>=r:e.l<=r}function im(e,t,r){return t==="long"?e.l<=r:e.h>=r}function ar(e,t){for(let r of e.requiredSeries)if(["fundingRate","openInterest"].includes(r)&&!t.every(n=>Fe(n?.[r])))throw new Error(`strategy required series is absent: ${r}`)}function am(e){if(e.length<3)return 0;let t=[];for(let i=1;i<e.length;i++){let a=e[i-1].equity,c=e[i].equity;a>0&&t.push((c-a)/a)}if(t.length<2)return 0;let r=0;for(let i of t)r+=i;let n=r/t.length,o=0;for(let i of t)o+=(i-n)**2;let s=Math.sqrt(o/(t.length-1));return s>0?n/s:0}function cm(e){let t=-1/0,r=0;for(let n of e){let o=n.equity;if(o>t&&(t=o),t>0){let s=(t-o)/t*100;s>r&&(r=s)}}return r}function Je(e,t,r={}){let n=Jf(r);xa(t);let o=tr(t);n.nowMs!==void 0&&de(e,{nowMs:n.nowMs});let s=pe(e);if(ar(s,t),n.nowMs!==void 0&&s.strategy.risk.expiresAt<=n.nowMs)throw new Error("strategy is expired: risk.expiresAt must be strictly greater than nowMs");let i=s.strategy.risk,a=s.evaluateAll(t),c=n.latencyBars,u=n.slippageBps,p=n.takerFeeBps,l=n.builderFeeBps,d=n.initialEquityUsd,f=0,m=0,y=0,g=0,b=0,S=[],C=[],x=[],I=[],v=[],h=null,w=0,O=null,P=d,U=!1,k=0,R=0,D=[],W=new Array(t.length).fill(0);function G(_){D.push(_)}function q(_){let L=t[_].v*(n.maxVolumeParticipationPct/100);return Math.max(0,L-W[_])}function M(_){if(!h)return d;let L=h.side==="long"?(_-h.entryPrice)*h.qty:(h.entryPrice-_)*h.qty;return d+L}function se(_,L,N){let Z=N.o,j=em(d,i);if(!(j>0)||!(Z>0))return;let ee=Xf(Z,L,u),Y=j/ee,ie=q(_),Kt=ee*ie;if(Y>ie){x.push({kind:"entry",barIndex:_,time:N.t,side:L,requestedNotionalUsd:j,maxFillNotionalUsd:Kt,reason:"volume_participation"});return}W[_]+=Y;let qe=Math.abs(ee-Z)*Y,He=wa(j,p,l);d-=He.total,f+=He.taker,m+=He.builder,g+=qe,b+=j,h={lifecycleEpoch:++R,side:L,entryBarIndex:_,entryReferencePrice:Z,entryPrice:ee,qty:Y,notionalUsd:j,stop:tm(ee,L,i.stopLossPct),take:rm(ee,L,i.takeProfitPct),liq:nm(ee,L,i.maxLeverage,p+l),entryFees:He.taker,entryBuilderFees:He.builder,entrySlippageUsd:qe,fundingAccrued:0}}function K(_,L,N,Z){if(!h)return!1;let j=h.side,ee=L,Y=ee;N!=="liquidation"&&Z&&(Y=Zf(ee,j,u));let ie=h.qty,Kt=ie*Y;if(N!=="liquidation"){let pi=q(_),up=Y*pi;if(ie>pi)return x.push({kind:"exit",barIndex:_,time:t[_].t,side:j,requestedNotionalUsd:Kt,maxFillNotionalUsd:up,reason:"volume_participation",triggerReason:N}),!1;W[_]+=ie}let qe=wa(Kt,p,l),He=N==="liquidation"?0:Math.abs(Y-ee)*ie,Gt,eo;j==="long"?(Gt=(ee-h.entryReferencePrice)*ie,eo=(Y-h.entryPrice)*ie):(Gt=(h.entryReferencePrice-ee)*ie,eo=(h.entryPrice-Y)*ie),d+=eo,d-=qe.total,f+=qe.taker,m+=qe.builder,g+=He,b+=Kt;let cp={side:j,entryBarIndex:h.entryBarIndex,entryTime:t[h.entryBarIndex].t,entryPrice:h.entryPrice,exitBarIndex:_,exitTime:t[_].t,exitPrice:Y,exitReason:N,qty:ie,notionalUsd:h.notionalUsd,grossPnlUsd:Gt,feesUsd:h.entryFees+qe.taker,builderFeesUsd:h.entryBuilderFees+qe.builder,fundingUsd:h.fundingAccrued,slippageUsd:h.entrySlippageUsd+He,netPnlUsd:Gt-(h.entryFees+qe.taker+h.entryBuilderFees+qe.builder)-h.fundingAccrued-(h.entrySlippageUsd+He)};return S.push(cp),N==="liquidation"&&C.push({barIndex:_,time:t[_].t,side:j,price:Y,tradeIndex:S.length-1}),h=null,R+=1,k=_+1+(i.cooldownBars||0),!0}function $e(_,L,N,Z){let j=_+1;if(j>=t.length)return;D.some(Y=>Y.kind==="exit"&&Y.side===L&&Y.fillBar===j&&Y.epoch===Z)||G({kind:"exit",side:L,signalBar:_,fillBar:j,reason:N,epoch:Z})}function Or(_){let L=D.filter(N=>N.fillBar===_);for(let N=D.length-1;N>=0;N--)D[N].fillBar===_&&D.splice(N,1);L.sort((N,Z)=>{let j=ee=>ee.kind==="exit"?0:1;return j(N)-j(Z)});for(let N of L)if(N.kind==="exit"){if(!h||h.side!==N.side||h.lifecycleEpoch!==N.epoch)continue;let Z=N.reason||"rule";K(_,t[_].o,Z,!0)||$e(_,N.side,Z,N.epoch)}else if(N.kind==="entry"){if(h||N.epoch!==R||_<k)continue;se(_,N.side,t[_])}}function Tr(_){if(!h)return;let L=t[_],N=L.fundingPaymentRate;if(N==null||!Fe(N)||N===0)return;let Z=Math.abs(h.qty*L.c),j=N*Z;h.side==="long"?(d-=j,h.fundingAccrued+=j,y+=j):(d+=j,h.fundingAccrued-=j,y-=j)}function Nr(_){if(!h)return;let L=t[_].o;(h.side==="long"?L<=h.liq:L>=h.liq)&&K(_,L,"liquidation",!1)}function ai(_){if(!h)return;let L=t[_],N=h.side,Z=im(L,N,h.liq),j=om(L,N,h.stop),ee=sm(L,N,h.take),Y=ie=>N==="long"?Math.min(ie,L.o):Math.max(ie,L.o);if(Z){K(_,Y(h.liq),"liquidation",!1);return}if(j&&ee){K(_,Y(h.stop),"stop_loss",!0)||$e(_,N,"stop_loss",h.lifecycleEpoch);return}if(j){K(_,Y(h.stop),"stop_loss",!0)||$e(_,N,"stop_loss",h.lifecycleEpoch);return}ee&&(K(_,h.take,"take_profit",!0)||$e(_,N,"take_profit",h.lifecycleEpoch))}for(let _=0;_<t.length;_++){let L=Math.floor(t[_].t/864e5);L!==O&&(O=L,P=M(t[_].o),U=!1),Nr(_),Or(_),ai(_),Tr(_),!U&&M(t[_].c)<=P*(1-i.maxDailyLossPct/100)&&(U=!0,I.push({type:"daily_loss_limit",barIndex:_,time:t[_].t,message:"daily loss limit reached; new entries blocked for UTC day"}));let N=a[_].signals,Z=_+c;if(h)(h.side==="long"&&N.exitLong===!0||h.side==="short"&&N.exitShort===!0)&&Z<t.length&&(D.some(ie=>ie.kind==="exit"&&ie.side===h.side&&ie.fillBar===Z&&ie.epoch===h.lifecycleEpoch)||G({kind:"exit",side:h.side,signalBar:_,fillBar:Z,reason:"rule",epoch:h.lifecycleEpoch}));else{let ee=N.entryLong===!0,Y=N.entryShort===!0;ee&&Y?I.push({type:"conflicting_entry_signals",barIndex:_,time:t[_].t,message:"conflicting entry signals; no position opened"}):!U&&(ee||Y)&&Z<t.length&&_>=k&&G({kind:"entry",side:ee?"long":"short",signalBar:_,fillBar:Z,epoch:R})}let j=d;h&&(w+=1,j=M(t[_].c)),v.push({barIndex:_,time:t[_].t,equity:j,positionSide:h?h.side:null})}let ci=null;if(h){let _=t.length-1;if(K(_,t[_].c,"end_of_data",!0))v[_]={barIndex:_,time:t[_].t,equity:d,positionSide:null};else{let N=M(t[_].c);ci={side:h.side,entryBarIndex:h.entryBarIndex,entryTime:t[h.entryBarIndex].t,entryPrice:h.entryPrice,qty:h.qty,notionalUsd:h.notionalUsd,markPrice:t[_].c,markedEquityUsd:N},I.push({type:"open_position_at_end",barIndex:_,time:t[_].t,message:"end-of-data exit missed; position remains open and marked"})}}let ui=(h?M(t[t.length-1].c):d)-n.initialEquityUsd,op=ui/n.initialEquityUsd*100,li=0,Yn=0,Jn=0;for(let _ of S)_.netPnlUsd>0?(li+=1,Yn+=_.netPnlUsd):_.netPnlUsd<0&&(Jn+=-_.netPnlUsd);let Xn=S.length,sp=Xn===0?0:li/Xn,Zn=0;Jn>0?Zn=Yn/Jn:Yn>0&&(Zn=1e12);let ip={netPnlUsd:ui,netPnlPct:op,maxDrawdownPct:cm(v),winRate:sp,profitFactor:Zn,tradeCount:Xn,sharpe:am(v),turnoverUsd:b,exposurePct:w/t.length*100},ap={initialEquityUsd:n.initialEquityUsd,takerFeeBps:n.takerFeeBps,builderFeeBps:n.builderFeeBps,slippageBps:n.slippageBps,latencyBars:n.latencyBars,maxVolumeParticipationPct:n.maxVolumeParticipationPct},di={barsHash:o,strategyHash:s.strategyHash,compilerHash:pt,compilerVersion:nr,config:ap,trades:S,equityCurve:v,metrics:ip,costs:{feesUsd:f,builderFeesUsd:m,fundingUsd:y,slippageUsd:g},liquidations:C,missedFills:x,openPositionAtEnd:ci,flags:I};return Fo(di),Uo(Lr(di))}var Qf,Br=E(()=>{ft();dt();Qf=Object.freeze({initialEquityUsd:1e4,takerFeeBps:3.5,builderFeeBps:2,slippageBps:2,latencyBars:1,maxVolumeParticipationPct:100})});import{createHash as um}from"node:crypto";function ym(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function Lo(e){if(e==null||typeof e!="object"||Object.isFrozen(e))return e;if(Array.isArray(e)){for(let t of e)Lo(t);return Object.freeze(e)}for(let t of Object.keys(e))Lo(e[t]);return Object.freeze(e)}function bm(e){return String(e).trim().replace(/\s+/g," ")}function wm(e){let t=e.match(/\b(long|short)\b/i);return t?t[1].toLowerCase():null}function xm(e){for(let r of dm)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 Sm(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 lm.has(r)?r:null}function km(e){let t={...fm},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 s=e.match(/position\s*size\s*(\d+(?:\.\d+)?)\s*%?/i);s&&(t.positionSizePct=Number(s[1]));let i=e.match(/max\s*notional\s*(?:usd\s*)?\$?\s*(\d+(?:\.\d+)?)/i);return i&&(t.maxNotionalUsd=Number(i[1])),t}function vm(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 Em(e){let t=um("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 Am(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 s=/\b(exit\s+on\s+reverse|reverse\s+exit)\b/i.test(e);return{kind:"ema_cross",fast:r,slow:o,direction:n,reverse:s}}function Im(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 _m(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 Cm(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,""):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 Sa(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 Om({side:e,coin:t,interval:r,risk:n,expiresAt:o,id:s,name:i,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 p=a.direction==="above"?"below":"above";c.push({id:"crossRev",type:"cross",direction:p,left:"emaLeft",right:"emaRight"}),e==="long"?u.exitLong="crossRev":u.exitShort="crossRev"}return{version:1,id:s,name:i,venue:"hyperliquid",market:{coin:t,interval:r},parameters:{ema_left_period:Sa(a.fast),ema_right_period:Sa(a.slow)},nodes:c,rules:u,risk:{...n,expiresAt:o}}}function Tm({side:e,coin:t,interval:r,risk:n,expiresAt:o,id:s,name:i,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:s,name:i,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 Nm({side:e,coin:t,interval:r,risk:n,expiresAt:o,id:s,name:i,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:s,name:i,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 ka(e,t={}){if(typeof e!="string")throw new ce("prompt must be a string");if(e.length>1e3)throw new ce("prompt length must be <= 1000");if(!ym(t))throw new ce("options must be a plain object");if(!Number.isInteger(t.nowMs))throw new ce("options.nowMs is required integer epoch ms");let r=t.nowMs,n=gm;if("expiresInMs"in t){if(!Number.isInteger(t.expiresInMs))throw new ce("expiresInMs must be an integer");if(n=t.expiresInMs,n<mm||n>hm)throw new ce("expiresInMs must be between 1h and 30d")}if(pm.test(e))throw new ce(`prompt appears to contain secrets and is rejected. ${Tt}`);let o=bm(e);if(!o)throw new ce(`empty prompt. ${Tt}`);if(vm(o))throw new ce(`duplicate interval or risk clause. ${Tt}`);let s=wm(o),i=xm(o),a=Sm(o);if(!s||!i||!a)throw new ce(`could not parse side/coin/interval. ${Tt}`);let c=km(o);if(!(c.maxLeverage>0)||c.maxLeverage>50)throw new ce("leverage out of range");if(!(c.positionSizePct>0)||c.positionSizePct>100)throw new ce("position size out of range");let u=r+n,p=Em(o),l=`Draft ${i} ${s}`.slice(0,100),d=Am(o),f=Im(o),m=_m(o),y=[d,f,m].filter(Boolean);if(y.length!==1)throw new ce(`unsupported or ambiguous prompt. ${Tt}`);if(!Cm(o,y[0]))throw new ce(`unsupported or ambiguous prompt. ${Tt}`);let g,b=y[0],S={side:s,coin:i,interval:a,risk:c,expiresAt:u,id:p,name:l,spec:b};b.kind==="ema_cross"?g=Om(S):b.kind==="rsi"?g=Tm(S):g=Nm(S);let C=qo(g,{nowMs:r});if(!C.ok)throw new ce(`draft failed validation: ${C.errors.map(x=>x.message).join("; ")}`);return Lo(de(g,{nowMs:r}))}var ce,lm,dm,pm,Tt,fm,mm,hm,gm,va=E(()=>{dt();ce=class extends Error{constructor(t){super(t),this.name="StrategyDraftError"}},lm=new Set(["1m","3m","5m","15m","30m","1h","2h","4h","8h","12h","1d"]),dm=new Set(["BTC","ETH","SOL","HYPE"]),pm=/\b(mnemonic|private\s*key|privkey|seed\s*phrase|seed\b|api[_-]?key|secret\s*key|wallet\s*key|passphrase)\b/i,Tt="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]. 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.",fm=Object.freeze({maxLeverage:1,maxNotionalUsd:100,positionSizePct:5,stopLossPct:2,takeProfitPct:4,cooldownBars:1,maxDailyLossPct:3}),mm=36e5,hm=30*864e5,gm=864e5});import{createHash as Rm}from"node:crypto";function Ia(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 _a(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function Mo(e){if(e==null||typeof e!="object"||Object.isFrozen(e))return e;if(Array.isArray(e)){for(let t of e)Mo(t);return Object.freeze(e)}for(let t of Object.keys(e))Mo(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 Mr(e){return JSON.stringify(cr(e))}function Pm(e){let{min:t,max:r,step:n}=e;if(!(n>0)||t>r)return[];let o=[],s=Math.floor((r-t)/n+1e-9);for(let a=0;a<=s;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 i=o[o.length-1];if(Math.abs(i-r)>1e-9){let a=(r-t)/n;Math.abs(a-Math.round(a))<=1e-9&&o.push(r)}return o}function $m(e,t){if(e.length===0)return[];let r=[{}];for(let n of e){let o=t[n],s=[];for(let i of r)for(let a of o)s.push({...i,[n]:a});r=s}return r.sort((n,o)=>{let s=Mr(n),i=Mr(o);return s<i?-1:s>i?1:0}),r}function Do(e,t,r,n,o){let s=0;if(e==="maxDrawdownPct"){if(s=t.maxDrawdownPct-n.maxDrawdownPct,s!==0)return s<0}else if(s=t[e]-n[e],s!==0)return s>0;let i=Mr(r),a=Mr(o);return i<a}function Ca(e,t,r={}){if(!_a(r))throw new TypeError("options must be a plain object");for(let x of Object.keys(r))if(Ia(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>Ea)throw new TypeError(`maxTrials must be an integer 1..${Ea}`);o=x}let s=r.objective??"netPnlUsd";if(!Aa.has(s))throw new TypeError(`objective must be one of ${[...Aa].join("|")}`);let i=r.backtestOptions??{};if(!_a(i))throw new TypeError("backtestOptions must be a plain object");for(let x of Object.keys(i))if(Ia(x))throw new TypeError(`backtestOptions must not include holdout/test/oos key "${x}"`);let a=de(e),c=Object.keys(a.parameters).sort();if(c.length===0)throw new Error("optimizeStrategy requires at least one declared parameter");let u={},p=1;for(let x of c){let I=Pm(a.parameters[x]);if(I.length===0)throw new Error(`parameter "${x}" produces an empty grid`);u[x]=I,p*=I.length}let l=$m(c,u);if(l.length===0)throw new Error("parameter grid is empty");let d=l.slice(0,o),f=[],m=null,y=null;for(let x of d){let I=sr(a,x),v=Je(I,t,i);y==null&&(y=v.config);let h={netPnlUsd:v.metrics.netPnlUsd,netPnlPct:v.metrics.netPnlPct,maxDrawdownPct:v.metrics.maxDrawdownPct,winRate:v.metrics.winRate,profitFactor:v.metrics.profitFactor,tradeCount:v.metrics.tradeCount,sharpe:v.metrics.sharpe,turnoverUsd:v.metrics.turnoverUsd},w={parameters:{...x},metrics:h};f.push(w),(!m||Do(s,h,x,m.metrics,m.parameters))&&(m=w)}f.sort((x,I)=>Do(s,x.metrics,x.parameters,I.metrics,I.parameters)?-1:Do(s,I.metrics,I.parameters,x.metrics,x.parameters)?1:0);let g={...m.parameters},b=sr(a,g),S={strategyHash:At(a),compilerHash:pt,trainBarsHash:tr(t),backtestConfig:y,objective:s,maxTrials:o,trialsRun:f.length,candidates:f,bestParameters:g,bestStrategy:b},C={id:Rm("sha256").update(JSON.stringify(cr(S)),"utf8").digest("hex"),...S};return Mo(cr(JSON.parse(JSON.stringify(C))))}var Ea,Aa,Oa=E(()=>{ft();dt();Br();Ea=256,Aa=new Set(["netPnlUsd","profitFactor","sharpe","maxDrawdownPct"])});import ze from"node:fs";import jr from"node:path";function Hr(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function Le(e){return e==null?e:JSON.parse(JSON.stringify(e))}function Bm(e){return String(e).toLowerCase().replace(/[^a-z0-9]/g,"")}function Nt(e,t="record"){if(Array.isArray(e)){e.forEach((r,n)=>Nt(r,`${t}[${n}]`));return}if(Hr(e))for(let[r,n]of Object.entries(e)){let o=Bm(r);if(qm.some(s=>o.includes(s)))throw new Error(`shadow-store: forbidden secret-like field at ${t}.${r}`);Nt(n,`${t}.${r}`)}}function Um(e){if(typeof e!="string"||!e||!jr.isAbsolute(e))throw new Error("shadow-store: path must be an absolute path")}function Ta(e){let t;try{t=ze.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 Fm(){return{version:Ho,runners:[]}}function Na(e,t){let r;try{r=JSON.parse(e)}catch{throw new Error("shadow-store: malformed JSON")}if(!Hr(r))throw new Error("shadow-store: malformed JSON root");if(r.version!==Ho)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 Nt(r,jr.basename(t)),{version:Ho,runners:r.runners.map(n=>Le(n))}}function Ra(e,t){Nt(t,"store");let r=jr.dirname(e);ze.mkdirSync(r,{recursive:!0,mode:448});let n=jr.join(r,`.shadow-store.${process.pid}.${Date.now()}.tmp`),o=`${JSON.stringify(t)}
4
- `;try{ze.writeFileSync(n,o,{mode:384,flag:"wx"}),ze.renameSync(n,e);try{ze.chmodSync(e,384)}catch{}}catch(s){try{ze.unlinkSync(n)}catch{}throw s}}function Pa(e={}){let t=e.path;if(Um(t),Ta(t),ze.existsSync(t)?Na(ze.readFileSync(t,"utf8"),t):Ra(t,Fm()),jo.has(t))return jo.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 s(m){if(!r&&n.length===0){r=!0;try{return m()}finally{r=!1,queueMicrotask(o)}}return new Promise((y,g)=>{n.push({fn:m,resolve:y,reject:g}),queueMicrotask(o)})}function i(){return Ta(t),Na(ze.readFileSync(t,"utf8"),t)}function a(m){Ra(t,m)}function c(m){if(!Hr(m)||typeof m.id!="string"||!m.id)throw new Error("shadow-store: create requires record with string id");Nt(m,"record");let y=i();if(y.runners.some(b=>b.id===m.id))throw new Error(`shadow-store: runner id already exists: ${m.id}`);let g=Le(m);return y.runners.push(g),a(y),Le(g)}function u(m){let y=i().runners.find(g=>g.id===m);return y?Le(y):null}function p(){return i().runners.map(m=>Le(m))}function l(m,y){if(typeof y!="function")throw new Error("shadow-store: updater must be a function");let g=i(),b=g.runners.findIndex(x=>x.id===m);if(b<0)throw new Error(`shadow-store: runner not found: ${m}`);let S=Le(g.runners[b]),C=y(S);if(!Hr(C)||C.id!==m)throw new Error("shadow-store: updater must return record with same id");return Nt(C,"record"),g.runners[b]=Le(C),a(g),Le(g.runners[b])}function d(m){let y=i(),g=y.runners.findIndex(S=>S.id===m);if(g<0)throw new Error(`shadow-store: runner not found: ${m}`);let b=Le(y.runners[g]);return b.status!=="stopped"&&(b.status="stopped",y.runners[g]=b,a(y)),Le(y.runners[g])}let f={create(m){return s(()=>c(m))},get(m){return u(m)},list(){return p()},update(m,y){return s(()=>l(m,y))},stop(m){return s(()=>d(m))}};return jo.set(t,f),f}var Ho,qm,jo,$a=E(()=>{Ho=1,qm=["privatekey","secretkey","seed","mnemonic","passphrase","password","keystore","keymaterial","apikey","authtoken","accesstoken","refreshtoken","credential","bearer","signature","authorization","xprv","xpriv","wif"];jo=new Map});import{createHash as Wo}from"node:crypto";function zo(e){return e==null?e:JSON.parse(JSON.stringify(e))}function Vo(e){return Array.isArray(e)?e.map(Vo):e&&typeof e=="object"?Object.fromEntries(Object.keys(e).sort().map(t=>[t,Vo(e[t])])):e}function Ba(e){if(!e||typeof e!="object"||Array.isArray(e))throw new TypeError("shadow-runner: record must be an object");return Wo("sha256").update(JSON.stringify(Vo(e))).digest("hex")}function Lm(e,t,r,n,o){return Wo("sha256").update(`${e}|${t}|${r}|${n}|${o}`).digest("hex")}function Dm(e,t,r,n){return Wo("sha256").update(`shadow|${e}|${t}|${r}|${n??""}`).digest("hex")}function Mm(e){return e==="entryLong"||e==="exitShort"?"buy":e==="entryShort"||e==="exitLong"?"sell":e}function qa(e){return e==="entryLong"||e==="entryShort"}function Ko({storePath:e,clock:t=Date.now}={}){if(typeof e!="string"||!e)throw new Error("shadow-runner: storePath required");let r=Pa({path:e});function n({strategy:c,evidenceId:u=null}={}){let p=pe(c),l=u==null?null:String(u),d=r.list().filter(b=>b.status==="running"&&b.strategyHash===p.strategyHash&&b.compilerHash===p.compilerHash&&b.evidenceId===l).sort((b,S)=>b.createdAt-S.createdAt||b.id.localeCompare(S.id))[0];if(d)return zo(d);let f=t(),m=Dm(f,p.strategyHash,p.compilerHash,l),y=r.get(m);if(y)return zo(y);let g={id:m,strategy:zo(p.strategy),strategyHash:p.strategyHash,compilerHash:p.compilerHash,evidenceId:l,status:"running",cursor:null,intendedOrders:[],fills:[],missedFills:[],markouts:[],createdAt:f,updatedAt:f,position:null,cooldownBarsRemaining:0,cooldownStartT:null,lastProcessedBarIndex:-1};return r.create(g)}function o(c){return r.get(c)}function s(){return r.list()}function i(c){return r.stop(c)}function a(c,u,{markoutHorizons:p=[1,4,12]}={}){if(!Array.isArray(u))throw new TypeError("shadow-runner: bars must be an array");return r.update(c,l=>{if(l.status!=="running")throw new Error("shadow-runner: runner is stopped");if(u.length===0)return l;let f=pe(l.strategy).evaluateAll(u),m=new Map;for(let k=0;k<u.length;k++)m.set(u[k].t,k);let y=l.cursor,g=[];for(let k=0;k<u.length;k++){let R=u[k].t;(y==null||R>y)&&g.push(k)}if(g.length===0)return l;let b=new Map(l.intendedOrders.map(k=>[k.id,k])),S=new Set(l.fills.map(k=>k.orderId)),C=new Map(l.missedFills.map(k=>[k.orderId,k])),x=(k,R)=>`${k}|${R}`,I=new Map(l.markouts.map(k=>[x(k.orderId,k.horizon),k])),v=l.position?{...l.position}:null,h=Number.isInteger(l.cooldownBarsRemaining)?Math.max(0,l.cooldownBarsRemaining):0,w=Number.isFinite(l.cooldownStartT)?l.cooldownStartT:null;function O({action:k,signalBarT:R,signalIndex:D}){let W=Mm(k),G=Lm(l.id,l.strategyHash,R,W,k);if(b.has(G))return b.get(G);let q=D+1,M=q<u.length,se={id:G,action:k,type:k,side:W,signalBarT:R,fillBarT:M?u[q].t:null,status:M?"open":"missed"};return b.set(G,se),l.intendedOrders.push(se),se}function P(k,R,D){if(S.has(k.id))return;let W={orderId:k.id,action:qa(k.action)?"entry":"exit",side:k.side,price:R.o,barT:R.t,signalBarT:k.signalBarT,barIndex:D};if(l.fills.push(W),S.add(k.id),k.status="filled",k.fillBarT=R.t,C.has(k.id)&&(C.delete(k.id),l.missedFills=l.missedFills.filter(G=>G.orderId!==k.id)),qa(k.action)){v={side:k.action==="entryLong"?"long":"short",entryOrderId:k.id,entryBarT:R.t,entryPrice:R.o,entryBarIndex:D};for(let G of p){let q=x(k.id,G);if(I.has(q))continue;let M={orderId:k.id,horizon:G,entryBarT:R.t,entryPrice:R.o,side:v.side,status:"pending",close:null,barT:null};I.set(q,M),l.markouts.push(M)}}else v=null,h=Number(l.strategy?.risk?.cooldownBars)||0,w=R.t}function U(k){if(S.has(k.id)||C.has(k.id))return;let R={orderId:k.id,action:k.action,side:k.side,signalBarT:k.signalBarT,status:"missed"};C.set(k.id,R),l.missedFills.push(R),k.status="missed"}for(let k of l.intendedOrders){if(k.status==="filled"||S.has(k.id))continue;let R=m.get(k.signalBarT);if(R==null)continue;let D=R+1;D<u.length&&(y==null||u[D].t>y)&&P(k,u[D],D)}for(let k of g){let R=u[k],D=f[k].signals,W=v,G=M=>{if(v||h>0&&(w==null||R.t>=w))return;let K=O({action:M,signalBarT:R.t,signalIndex:k}),$e=k+1;$e<u.length?P(K,u[$e],$e):U(K)},q=M=>{if(!v||v.side==="long"&&M!=="exitLong"||v.side==="short"&&M!=="exitShort")return;let se=O({action:M,signalBarT:R.t,signalIndex:k}),K=k+1;K<u.length?P(se,u[K],K):U(se)};W?(D.exitLong&&q("exitLong"),D.exitShort&&q("exitShort")):D.entryLong&&D.entryShort||(D.entryLong&&G("entryLong"),D.entryShort&&G("entryShort")),h>0&&w!=null&&R.t>=w&&(h-=1,h===0&&(w=null)),l.cursor=R.t,l.lastProcessedBarIndex=k}for(let k of l.markouts){if(k.status!=="pending")continue;let R=l.fills.find(G=>G.orderId===k.orderId&&G.action==="entry");if(!R)continue;let D=m.get(R.barT);if(D==null)continue;let W=D+k.horizon;if(W<u.length){k.close=u[W].c,k.barT=u[W].t,k.status="filled";let G=k.entryPrice;k.markout=k.side==="long"?(k.close-G)/G:(G-k.close)/G}}return l.position=v,l.cooldownBarsRemaining=h,l.cooldownStartT=w,l.updatedAt=t(),l})}return{start:n,step:a,list:s,get:o,stop:i}}var Ua=E(()=>{ft();$a()});var Da={};Q(Da,{runStrategyOperation:()=>Qm});import jm from"node:os";import Hm from"node:path";function ur(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function Vm(e){return String(e).toLowerCase().replace(/[^a-z0-9]/g,"")}function Qo(e){if(Array.isArray(e)){for(let t of e)Qo(t);return}if(ur(e))for(let[t,r]of Object.entries(e)){if(zm.some(n=>Vm(t).includes(n)))throw new Error(`strategy service: secret-like field "${t}" is forbidden`);Qo(r)}}function Wm(e){if(!ur(e))throw new TypeError("strategy input must be a plain object");return Qo(e),e}function Km(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 Go(e,t,r,n){if(Array.isArray(t.bars))return t.bars;let o=_o(e.venue),s=r.fetchBars??o.fetchBars;if(typeof s!="function")throw new Error(`strategy venue ${o.id} does not support history`);let i=await s({coin:e.market.coin,interval:e.market.interval,count:t.count??1500,endTime:t.endTime??n}),a=Array.isArray(i)?i:i?.bars;if(!Array.isArray(a))throw new Error("strategy history provider returned no bars");return a}function Yo(e,t){let r=e.backtestOptions??{};if(!ur(r))throw new TypeError("backtestOptions must be a plain object");return{...r,nowMs:t}}function Fa(e,t,r,n,o={}){let s=e.evidenceOptions??{};if(!ur(s))throw new TypeError("evidenceOptions must be a plain object");return{...s,...o,strategy:t,bars:r,backtestOptions:Yo(e,n)}}function La(){return Hm.join(jm.homedir(),".oracle","strategy-shadow.json")}function Gm(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 Qm(e,t={},r={}){let n=Wm(t),o=Km(n,r);if(e==="draft")return{strategy:ka(n.prompt,{nowMs:o})};if(e==="validate"){let s=pe(n.strategy);if(s.strategy.risk.expiresAt<=o)throw new Error("strategy is expired");return{valid:!0,strategy:s.strategy,strategyHash:s.strategyHash,compilerHash:s.compilerHash,compilerVersion:s.compilerVersion,requiredSeries:s.requiredSeries}}if(e==="backtest"||e==="evidence"){let s=pe(n.strategy),i=await Go(s.strategy,n,r,o);ar(s,i);let a=So(Fa(n,s.strategy,i,o));return e==="evidence"?a:{backtest:Je(s.strategy,i,Yo(n,o)),evidence:a}}if(e==="optimize"){let s=pe(n.strategy),i=await Go(s.strategy,n,r,o);ar(s,i);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 p=i.slice(0,Math.floor(i.length*u)),l=n.options??{};if(!ur(l))throw new TypeError("options must be a plain object");let d=Ca(s.strategy,p,{...l,...n.maxTrials==null?{}:{maxTrials:n.maxTrials},backtestOptions:Yo(n,o)}),f=d.bestStrategy;return{strategy:f,optimization:d,evidence:So(Fa(n,f,i,o,{trainFraction:u}))}}if(e==="shadow"){let s=Ko({storePath:r.storePath??La(),clock:()=>o}),i=n.action;if(i==="start")return await s.start({strategy:n.strategy,evidenceId:n.evidenceId??n.evidence?.id??null});if(i==="list")return await s.list();if(i==="get")return await s.get(n.id);if(i==="stop")return await s.stop(n.id);if(i==="step"){let a=await s.get(n.id);if(!a)throw new Error(`shadow runner not found: ${n.id}`);let c=await Go(a.strategy,n,r,o);return ar(pe(a.strategy),c),await s.step(n.id,c,n.stepOptions??{})}throw new Error(`unknown shadow action: ${i}`)}if(e==="prepare"){let s=pe(n.strategy),i=_o(s.strategy.venue);if(typeof n.shadowId!="string"||!n.shadowId)throw new Error("strategy prepare requires a matching shadow runner id");let c=await Ko({storePath:r.storePath??La(),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!==s.strategyHash||c.compilerHash!==s.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??Gm(s.strategy,o);return i.prepareIntent({strategy:s.strategy,evidence:n.evidence,shadow:{id:c.id,stateHash:Ba(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 zm,Ma=E(()=>{Br();ft();ko();va();Oa();Ua();Co();zm=["privatekey","secretkey","seed","mnemonic","passphrase","password","keystore","keymaterial","apikey","authtoken","accesstoken","refreshtoken","credential","bearer","signature","authorization","xprv","xpriv","wif"]});var ec={};Q(ec,{DEFAULT_CROSS_CHAIN_SOURCES:()=>Ga,DEFAULT_SAME_CHAIN_SOURCES:()=>Ka,NATIVE_TOKEN:()=>Jo,canonicalJson:()=>Ya,hashFirmQuote:()=>Za,hashRfqIntent:()=>Xa,normalizeFirmQuote:()=>Zo,normalizeRfqIntent:()=>th,sha256Hex:()=>lr});import{createHash as Ym}from"node:crypto";import{getAddress as Wa,isAddress as Xo}from"ethers";function re(e,t="invalid"){throw new Error(`rfq: ${e} ${t}`)}function Ha(e,t){let r=Number(e);return(!Number.isSafeInteger(r)||r<=0)&&re(t,"must be a positive chainId"),r}function zr(e,t){let r=String(e??"").trim();return(!Jm.test(r)||BigInt(r)<=0n)&&re(t,"must be a positive integer string"),r}function Xm(e,t){return e==null||e===""?null:zr(e,t)}function za(e,t){let r=String(e??"").trim();return r.toLowerCase()===Jo.toLowerCase()?Jo:(Xo(r)||re(t,"must be an EVM address or native token sentinel"),Wa(r))}function Qa(e,t){let r=String(e??"").trim();return Xo(r)||re(t,"must be an EVM address"),Wa(r)}function Zm(e,t){return e==null||e===""?null:Qa(e,t)}function Va(e,t,r){return e===void 0?[...r]:(Array.isArray(e)||re(t,"must be an array"),e.map(n=>String(n).trim()).filter(Boolean))}function eh(e,{nowMs:t,maxDeadlineMs:r},n){let o=Number(e);return Number.isFinite(o)||re(n,"must be a finite millisecond timestamp"),o<=t&&re(n,"expired"),o>t+r&&re(n,"exceeds maxDeadlineMs"),Math.floor(o)}function Rt(e){if(Array.isArray(e))return e.map(Rt);if(e&&typeof e=="object"){let t={};for(let r of Object.keys(e).sort())e[r]!==void 0&&(t[r]=Rt(e[r]));return t}return e}function Ya(e){return JSON.stringify(Rt(e))}function lr(e){return`0x${Ym("sha256").update(Ya(e)).digest("hex")}`}function Ja(e,t){let r={...e};for(let n of t)delete r[n];return r}function Xa(e){return lr(Ja(e,["intentHash"]))}function Za(e){return lr(Ja(e,["firmQuoteHash"]))}function th(e={},t={}){let r=Number(t.nowMs??Date.now()),n=Number(t.maxDeadlineMs??1800*1e3);(!Number.isFinite(r)||!Number.isFinite(n)||n<=0)&&re("time","is invalid");let o=Ha(e.fromChainId??e.fromChain,"fromChainId"),s=Ha(e.toChainId??e.toChain,"toChainId"),a=o===s?Ka:Ga,c={kind:"rfq-intent",version:1,fromChainId:o,toChainId:s,sellToken:za(e.sellToken??e.tokenIn??e.fromToken,"sellToken"),buyToken:za(e.buyToken??e.tokenOut??e.toToken,"buyToken"),sellAmount:zr(e.sellAmount??e.amountIn??e.fromAmount,"sellAmount"),receiver:Qa(e.receiver??e.recipient??e.to,"receiver"),deadlineMs:eh(e.deadlineMs??e.deadline??e.expiresAtMs,{nowMs:r,maxDeadlineMs:n},"deadline"),minBuyAmount:Xm(e.minBuyAmount??e.minOut??e.amountOutMin,"minBuyAmount"),allowedSources:Va(e.allowedSources,"allowedSources",a),allowedRouters:Va(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)?Rt(e.metadata):{}};return c.slippageBps!=null&&(!Number.isInteger(c.slippageBps)||c.slippageBps<0||c.slippageBps>1e4)&&re("slippageBps","must be 0 to 10000"),c.intentId=e.intentId?String(e.intentId):lr({seed:"rfq-intent",intent:c}).slice(0,34),c.intentHash=Xa(c),Object.freeze(c)}function rh(e){return(!e||typeof e!="object"||Array.isArray(e))&&re("artifact","required"),e.typedDataHash!=null&&!ja.test(String(e.typedDataHash))&&re("artifact.typedDataHash","must be bytes32"),e.calldataHash!=null&&!ja.test(String(e.calldataHash))&&re("artifact.calldataHash","must be bytes32"),e.to!=null&&!Xo(String(e.to))&&re("artifact.to","must be an address"),e.data!=null&&!/^0x(?:[0-9a-fA-F]{2})*$/.test(String(e.data))&&re("artifact.data","must be hex"),Rt(e)}function Zo(e,t={},r={}){(!e||e.kind!=="rfq-intent")&&re("intent","required");let n=Number(r.nowMs??Date.now()),o=Number(t.expiryMs??t.expiresAtMs??t.validUntilMs);Number.isFinite(o)||re("quote expiry","required"),o<=n&&re("quote","expired"),o>e.deadlineMs&&re("quote expiry","exceeds intent deadline");let s=String(t.source??t.provider??"").trim();s||re("source","required"),e.allowedSources.includes(s)||re("source","not allowed by intent");let i=zr(t.amountOut??t.buyAmount,"amountOut"),a=zr(t.minBuyAmount??t.minOut??i,"minBuyAmount");BigInt(a)>BigInt(i)&&re("minBuyAmount","exceeds amountOut");let c=rh(t.artifact??t.executableArtifact??t.transaction??t.typedData),u=Number(t.quotedAtMs??t.timestampMs??r.nowMs??Date.now());Number.isFinite(u)||re("quotedAtMs","must be finite");let p=Zm(t.router??t.settlementRouter??c.to,"router"),l={kind:"rfq-firm-quote",provider:"rfq",surface:"rfq",version:1,quoteId:String(t.quoteId??t.id??"").trim(),source:s,intentHash:e.intentHash,fromChainId:e.fromChainId,toChainId:e.toChainId,sellToken:e.sellToken,buyToken:e.buyToken,sellAmount:e.sellAmount,receiver:e.receiver,router:p,amountOut:i,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)?Rt(t.metadata):{}};return l.quoteId||(l.quoteId=lr({seed:"rfq-quote",out:l}).slice(0,34)),l.firmQuoteHash=Za(l),Object.freeze(l)}var Jo,Ka,Ga,ja,Jm,es=E(()=>{Jo="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",Ka=Object.freeze(["lifi","paraswap","0x","cow","uniswap-v3"]),Ga=Object.freeze(["lifi"]),ja=/^0x[0-9a-fA-F]{64}$/,Jm=/^\d+$/});import{readFileSync as nh}from"node:fs";import{homedir as oh}from"node:os";import{join as Vr}from"node:path";function sh(){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=oh();if(process.env.ORACLE_PUBLIC_DESKTOP==="1"){let r=(process.env.ORACLE_CONFIG_DIR||Vr(t,".config","oracle")).trim();return[e,Vr(r,"exec.env")].filter(Boolean)}return[e,Vr(t,".config","oracle","exec.env"),Vr(t,".config","mad-desk","exec.env")].filter(Boolean)}function tc(e,t,r){let n=e??process.env[t]??process.env[r];if(!String(n||"").trim())for(let o of sh())try{let s=nh(o,"utf8"),i=s.match(new RegExp(`^${t}=(.*)$`,"m"))||s.match(new RegExp(`^${r}=(.*)$`,"m"));if(i&&(n=i[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 rc=E(()=>{});var nc=E(()=>{});import{createHash as ih,createHmac as sc,timingSafeEqual as ah}from"node:crypto";function Kr(e){return Array.isArray(e)?`[${e.map(Kr).join(",")}]`:e&&typeof e=="object"?`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${Kr(e[t])}`).join(",")}}`:JSON.stringify(e??null)}function ic(e,{required:t=!1}={}){try{return tc(e,"ORACLE_ROUTE_ATTESTATION_SECRET","MAD_ROUTE_ATTESTATION_SECRET")}catch(r){if(t)throw r;return null}}function rs(e){let{signature:t,...r}=e;return r}function ac(e,{secret:t}={}){let r=ic(t);return r?{...e,signature:sc("sha256",r).update(Kr(rs(e))).digest("hex")}:e}function ch(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 ih("sha256").update(Buffer.from(t.slice(2),"hex")).digest("hex")}function Ae(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 s=ic(o);if(s){let f=sc("sha256",s).update(Kr(rs(e))).digest("hex");if(!uh(e.signature,f))throw new Error("auto-slippage guard signature mismatch \u2014 refusing to bind a guard this Oracle did not issue")}let i=Number(e.selectedBps),a=Number(e.capBps);if(!Number.isInteger(i)||i<0||i>Wr||!Number.isInteger(a)||a<0||a>Wr||i>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 p=c*BigInt(1e4-i),l=p/10000n;if(p%10000n!==0n&&(l+=1n),u<l)throw new Error("auto-slippage guard is under-protected relative to its quote");let d=ph(n);if(d!=null&&d!==u)throw new Error(`auto-slippage: calldata encodes floor ${d}, not the guard floor ${u} \u2014 refusing to bind`);return ac({...rs(e),calldataHash:ch(n)},{secret:o})}function uh(e,t){let r=Buffer.from(String(e??""),"utf8"),n=Buffer.from(String(t??""),"utf8");return r.length!==n.length||r.length===0?!1:ah(r,n)}function ts(e,t=0){let r=Number(e);return Number.isFinite(r)?r:t}function lh(e){let t=e==null?Wr: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,Wr)}function Ve({liquidityUsd:e,priceChange5m:t=0,quoteAgeMs:r=0,crossChain:n=!1,requestedCapBps:o}={}){let s=ts(e,0),i=s>0?s>=25e4?5:s>=1e5?10:s>=5e4?20:s>=1e4?40:70:n?30:10,a=Math.min(60,Math.abs(ts(t,0))*2),c=Math.min(40,Math.floor(Math.max(0,ts(r,0))/5e3)*5),u=Math.max(25,Math.ceil(20+i+a+c)),p=lh(o);return{mode:"auto",requiredBps:u,selectedBps:Math.min(u,p),capBps:p,executable:u<=p}}function dh({chainId:e,venue:t,quoteAmountOut:r,liquidityUsd:n,priceChange5m:o=0,quoteAgeMs:s=0,crossChain:i=!1,requestedCapBps:a,quotedAtMs:c=Date.now(),ttlMs:u=oc,secret:p}={}){let l=BigInt(r??0);if(l<=0n)throw new Error("auto-slippage guard requires positive quoteAmountOut");let d=Ve({liquidityUsd:n,priceChange5m:o,quoteAgeMs:s,crossChain:i,requestedCapBps:a});if(!d.executable)throw new Error(`auto-slippage requires ${d.requiredBps} bps above hard/requested cap ${d.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)||oc)),y=l*BigInt(1e4-d.selectedBps),g=y/10000n;if(y%10000n!==0n&&(g+=1n),g>l&&(g=l),l>0n&&g<=0n)throw new Error(`auto-slippage: quote ${l} is too small to express a ${d.selectedBps} bps floor without rounding to zero`);let b=Number((l-g)*10000n/(l===0n?1n:l));if(b>d.capBps)throw new Error(`auto-slippage: realised floor implies ${b} bps, above cap ${d.capBps} \u2014 refusing to issue a guard weaker than advertised`);return ac({mode:"auto",chainId:Number(e),venue:String(t||"unknown"),quoteAmountOut:l.toString(),minAmountOut:g.toString(),requiredBps:d.requiredBps,selectedBps:d.selectedBps,capBps:d.capBps,quotedAtMs:f,expiresAtMs:f+m},{secret:p})}function ph(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 s=10;s+64<=t.length;s+=64)n.push(t.slice(s,s+64));let o=s=>n[s]==null?null:BigInt("0x"+n[s]);switch(r){case"0x414bf389":return o(6);case"0x04e45aaf":return o(5);case"0xc04b8d59":{let s=o(0);if(s==null)return null;let i=Number(s)/32;return!Number.isInteger(i)||i<0?null:o(i+4)}case"0xb858183f":{let s=o(0);if(s==null)return null;let i=Number(s)/32;return!Number.isInteger(i)||i<0?null:o(i+3)}case"0xa026383e":return o(6);case"0x38ed1739":case"0x5c11d795":return o(1);case"0x7ff36ab5":case"0xb6f9de95":return o(0);case"0x18cbafe5":case"0x791ac947":return o(1);default:return null}}function ae(e,{chainId:t,venue:r,amountOut:n,liquidityUsd:o,priceChange5m:s,crossChain:i,requestedCapBps:a,quotedAtMs:c=Date.now(),ttlMs:u}={}){let p=dh({chainId:t,venue:r,quoteAmountOut:n,liquidityUsd:o,priceChange5m:s,crossChain:i,requestedCapBps:a,quotedAtMs:c,ttlMs:u});return{...e,autoSlippage:p,amountOutMinimum:p.minAmountOut}}var Wr,oc,We=E(()=>{rc();nc();Wr=100,oc=2e4});function ns(e){let t=String(e||"").trim();return/^0x[0-9a-fA-F]{40}$/.test(t)?t:et}var et,Gr=E(()=>{et="0x000000000000000000000000000000000000dEaD"});import{Contract as fh,JsonRpcProvider as mh}from"ethers";function xh(e){return wh.test(String(e||""))}async function cc(e,{contract:t=hh,rpc:r=yh,chainId:n=gh,balanceOf:o}={}){if(!xh(e))throw new Error("invalid-address");if(o)return BigInt(await o(e));let s=new mh(r,n,{staticNetwork:!0}),i=new fh(t,bh,s);return BigInt(await i.balanceOf(e))}var hh,gh,yh,bh,wh,uc=E(()=>{hh="0x62FCFAf7573AD8B41a0FBF347AfEb85e06599A75",gh=999,yh="https://rpc.hyperliquid.xyz/evm",bh=["function balanceOf(address owner) view returns (uint256)"],wh=/^0x[a-fA-F0-9]{40}$/});import{existsSync as Sh,readFileSync as kh,lstatSync as vh}from"node:fs";import{homedir as lc}from"node:os";import{join as os}from"node:path";function Ih(e){let t=String(e||"swap").toLowerCase();return Object.prototype.hasOwnProperty.call(dc,t)?dc[t]:Ah}function Nh(e=process.env){if(process.env.ORACLE_TEST_ISOLATE_SECRETS==="1"){if(e[pc])return String(e[pc]);let t=e.ORACLE_CONFIG_DIR||os(lc(),".config","oracle");return os(t,"fee-recipient")}return os(lc(),".config","oracle","fee-recipient")}function Rh(e=process.env){try{let t=Nh(e);if(!Sh(t)||vh(t).isSymbolicLink())return"";let r=kh(t,"utf8").trim().toLowerCase();return/^0x[a-f0-9]{40}$/.test(r)?r:""}catch{return""}}function Ph(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),Eh)}function $h({env:e=process.env,action:t="swap",admin:r=!1}={}){let n=String(e[Ch]||"").trim(),o=String(e[Oh]||Th).trim();if(r===!0)return{bps:0,recipient:"",integrator:o,action:t,applies:!1,reason:"admin-oracle"};let s=Ih(t),i=Ph(e[_h],{fallback:n?s:0}),a=Math.min(i,s);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=Rh(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 Qr({wallet:e,env:t=process.env,action:r="swap",holderCheck:n={},admin:o=!1}={}){let s=$h({env:t,action:r,admin:o});if(o===!0)return{...s,holderVerificationStatus:"admin-oracle"};let i=String(e||"").trim().toLowerCase();if(!/^0x[a-f0-9]{40}$/.test(i))return{...s,holderVerificationStatus:"wallet-required"};try{return BigInt(await cc(i,n))>0n?{...s,bps:0,applies:!1,reason:"locals-only-holder",holderVerificationStatus:"holder"}:{...s,holderVerificationStatus:"non-holder"}}catch{return{...s,holderVerificationStatus:"unavailable"}}}function fc(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 mc(e){return e?.applies?{integrator:e.integrator,fee:String(e.bps/1e4)}:{}}function hc(e){return e?.applies?{partner:e.integrator,partnerFeeBps:String(e.bps),partnerAddress:e.recipient}:{}}var Eh,Ah,dc,_h,Ch,Oh,pc,Th,Yr=E(()=>{uc();Eh=100,Ah=5,dc=Object.freeze({swap:5,bridge:5,perps:0,nft:0});_h="ORACLE_INTEGRATOR_FEE_BPS",Ch="ORACLE_INTEGRATOR_FEE_RECIPIENT",Oh="ORACLE_INTEGRATOR_ID",pc="ORACLE_INTEGRATOR_FEE_RECIPIENT_PIN",Th="oracle"});var as={};Q(as,{LIFI_API:()=>yc,lifiChains:()=>Lh,lifiHealth:()=>Uh,lifiPrepare:()=>Fh,lifiQuote:()=>ht});function is(e={}){return(e.baseUrl||process.env.LIFI_API_URL||yc).replace(/\/$/,"")}function Bh(e){let t=String(e||ss).toLowerCase();return t===ss.toLowerCase()||t===qh}function gc(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 Uh(e={}){let t=await T(`${is(e)}/chains`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??12e3}),r=Array.isArray(t)?t.length:t?.chains?.length||0;return{ok:r>0,chainCount:r}}async function ht(e={},t={}){let{fromChain:r,toChain:n=r,fromToken:o=ss,toToken:s,fromAmount:i,fromAddress:a=et}=e;if(r==null||!s||!i)throw new Error("lifiQuote requires fromChain, toToken, fromAmount");let c=new URLSearchParams({fromChain:String(r),toChain:String(n),fromToken:o,toToken:s,fromAmount:String(i),fromAddress:a}),u=Ve({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 p=await Qr({wallet:e.fromAddress,env:t.env,action:e.feeAction||"swap",holderCheck:t.holderCheck});for(let[g,b]of Object.entries(mc(p)))c.set(g,b);let l=await T(`${is(t)}/quote?${c}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4}),d=l?.estimate?.toAmount||l?.toAmount;if(!d)return{...l,autoSlippagePolicy:u,oracleFee:p};let f=l?.transactionRequest?.to||l?.estimate?.approvalAddress||"lifi",m=ae(l,{chainId:Number(r),venue:f,amountOut:d,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,crossChain:Number(n)!==Number(r),requestedCapBps:e.maxSlippageBps??e.slippageBps}),y=l?.estimate?.toAmountMin||l?.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:p}}async function Fh(e={},t={}){let r=await ht(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 s=null;if(!Bh(e.fromToken)){let i=r?.estimate?.approvalAddress||r?.approvalAddress;if(!i)throw new Error("lifi: ERC20 route missing approvalAddress");let a=r?.action?.fromToken?.address||r?.estimate?.fromToken?.address||e.fromToken;s={token:gc(a,"approval token"),spender:gc(i,"approval spender"),amount:String(e.fromAmount)}}return J({provider:"lifi",calldataReady:!0,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:o,quote:r,autoSlippage:r.autoSlippage,requiresApproval:s,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:Ae(r.autoSlippage,{chainId:o,venue:n.to,data:n.data})}},{provider:"lifi",kind:"lifi-tx"})}async function Lh(e={}){return T(`${is(e)}/chains`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??12e3})}var yc,ss,qh,dr=E(()=>{z();We();Gr();fe();Yr();yc="https://li.quest/v1";ss="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",qh="0x0000000000000000000000000000000000000000"});var xc={};Q(xc,{PARASWAP_API:()=>bc,paraswapHealth:()=>Mh,paraswapPrepare:()=>Dh,paraswapPrice:()=>$t,paraswapTokens:()=>wc});function Pt(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 wc(e={},t={}){let r=Number(e.chainId||1);return T(`${cs(t)}/tokens/${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function $t(e={},t={}){let r=Number(e.chainId||e.network||1);if(e.amount==null)throw new Error("amount required");let n=new URLSearchParams({srcToken:Pt(e.srcToken,"srcToken"),destToken:Pt(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 Qr({wallet:e.userAddress||e.fromAddress,env:t.env,action:e.feeAction||"swap",holderCheck:t.holderCheck});for(let[a,c]of Object.entries(hc(o)))n.set(a,c);let s=await T(`${cs(t)}/prices?${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4}),i=s?.priceRoute?.destAmount;return i?{...ae(s,{chainId:r,venue:s?.priceRoute?.contractAddress||"paraswap-quote",amountOut:i,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}:{...s,executionReady:!1,oracleFee:o}}async function Dh(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=Pt(e.userAddress,"userAddress"),o=await $t(e,t),s=o?.priceRoute,i=String(s?.contractAddress||"").toLowerCase();if(!i)throw new Error("paraswap: price route missing contractAddress");let a={srcToken:Pt(e.srcToken,"srcToken"),destToken:Pt(e.destToken,"destToken"),srcAmount:String(s.srcAmount||e.amount),destAmount:String(o.amountOutMinimum),priceRoute:s,userAddress:n,ignoreChecks:!1,ignoreGasEstimate:!1};e.receiver&&(a.receiver=Pt(e.receiver,"receiver"));let c=await T(`${cs(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()!==i)throw new Error("paraswap: transaction target mismatch");if(c.from&&String(c.from).toLowerCase()!==n)throw new Error("paraswap: transaction sender mismatch");return J({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:s.tokenTransferProxy||i,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:Ae(o.autoSlippage,{chainId:r,venue:c.to,data:c.data})}},{provider:"paraswap",kind:"paraswap-tx"})}async function Mh(e={}){let t=await wc({chainId:1},e),r=Array.isArray(t?.tokens)?t.tokens.length:Object.keys(t?.tokens||{}).length;return{ok:r>0,tokenSample:r}}var bc,cs,Jr=E(()=>{z();We();fe();Yr();bc="https://api.paraswap.io",cs=(e={})=>(e.baseUrl||process.env.PARASWAP_API_URL||bc).replace(/\/$/,"")});function Xr({provider:e,defaultUrl:t,hosts:r=[],url:n,strict:o=!1}){let i=(String(n??"").trim()||String(t)).replace(/\/$/,"");if(i===String(t).replace(/\/$/,""))return{baseUrl:i,trusted:!0,host:kc(t)};let a;try{a=new URL(i)}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([kc(t),...r]).has(c)){let p=/^(127\.0\.0\.1|localhost|\[::1\])(:\d+)?$/i.test(c);return a.protocol==="http:"&&!p?{baseUrl:i,trusted:!1,host:c,reason:"plaintext http downgrade"}:{baseUrl:i,trusted:!0,host:c}}if(String(process.env[Sc]||"")==="1")return{baseUrl:i,trusted:!1,host:c};if(o)throw new Error(`${e}: refusing to call non-allowlisted host ${c} (set ${Sc}=1 to permit it)`);return{baseUrl:i,trusted:!1,host:c}}function kc(e){let t=new URL(String(e));if(t.protocol!=="http:"&&t.protocol!=="https:")throw new Error("unsupported protocol");return t.host}function Zr(e,t,r){let n={...e};if(!r)return n;for(let[o,s]of Object.entries(t||{}))s&&(n[o]=s);return n}var Sc,us=E(()=>{Sc="ORACLE_ALLOW_CUSTOM_PROVIDER_URL"});var Cc={};Q(Cc,{ZEROX_API:()=>vc,zeroxHealth:()=>jh,zeroxPrepare:()=>Hh,zeroxPrice:()=>_c,zeroxQuote:()=>qt});function Ec(e={}){return Xr({provider:"zerox",defaultUrl:vc,hosts:["api.0x.org"],url:e.baseUrl||process.env.ZEROX_API_URL})}function Ac(e={}){return Ec(e).baseUrl}function en(e={}){return e.apiKey||process.env.ZEROX_API_KEY||process.env.OX_API_KEY||process.env["0X_API_KEY"]||""}function Ic(e={}){return Zr({"0x-version":"v2",accept:"application/json"},{"0x-api-key":en(e)},Ec(e).trusted)}async function jh(e={}){if(!en(e))return{ok:!1,configured:!1,error:"ZEROX_API_KEY not set"};try{let t=await _c({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 _c(e={},t={}){if(!en(t))throw new Error("ZEROX_API_KEY required for 0x");let{chainId:r=8453,sellToken:n,buyToken:o,sellAmount:s,taker:i}=e;if(!n||!o||!s)throw new Error("zeroxPrice requires sellToken, buyToken, sellAmount");let a=new URLSearchParams({chainId:String(r),sellToken:n,buyToken:o,sellAmount:String(s)});return i&&a.set("taker",i),T(`${Ac(t)}/swap/allowance-holder/price?${a}`,{headers:Ic(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function qt(e={},t={}){if(!en(t))throw new Error("ZEROX_API_KEY required for 0x");let{chainId:r=8453,sellToken:n,buyToken:o,sellAmount:s,taker:i}=e;if(!n||!o||!s)throw new Error("zeroxQuote requires sellToken, buyToken, sellAmount");let a=Ve({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(s),slippageBps:String(a.selectedBps)});i&&c.set("taker",i);let u=await T(`${Ac(t)}/swap/allowance-holder/quote?${c}`,{headers:Ic(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),p=u?.buyAmount||u?.grossBuyAmount;return p?ae(u,{chainId:r,venue:u?.transaction?.to||u?.to||"0x",amountOut:p,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps}):{...u,autoSlippagePolicy:a}}async function Hh(e={},t={}){if(!e.taker)throw new Error("0x: taker required for executable prepare");let r=await qt(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),s=r?.issues?.allowance?.spender||r?.allowanceTarget;return J({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:s,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:Ae(r.autoSlippage,{chainId:o,venue:n.to,data:n.data})}},{provider:"zerox",kind:"zerox-tx"})}var vc,tn=E(()=>{z();We();us();fe();vc="https://api.0x.org"});var WS,Oc=E(()=>{WS=Object.freeze({READ:"read",PREPARE:"prepare",EXECUTE:"execute",AUTONOMOUS:"autonomous"})});var Lc={};Q(Lc,{COW_CANCEL_TYPES:()=>$c,COW_HOSTS:()=>ds,COW_ORDER_TYPES:()=>rn,COW_SETTLEMENT:()=>Nc,COW_VAULT_RELAYER:()=>Rc,cowCancelOrders:()=>t0,cowChains:()=>o0,cowHealth:()=>Gh,cowOrder:()=>Fc,cowOrderStatus:()=>Uc,cowOrderUid:()=>Yh,cowPrepareCancel:()=>Zh,cowPrepareOrder:()=>Qh,cowQuote:()=>gt,cowSignCancel:()=>e0,cowSignOrder:()=>Jh,cowSubmitSignedOrder:()=>Xh,cowVerifyOrderFill:()=>n0});import{TypedDataEncoder as Tc,getAddress as pr,isAddress as zh}from"ethers";function nn(e,t={}){if(t.baseUrl)return t.baseUrl.replace(/\/$/,"");let r=ds[Number(e)];if(!r)throw new Error(`cowswap: unsupported chainId ${e}`);return r}function Vh(e,t="v1",r={}){let n=nn(e,r);return t==="v1"?n:n.replace(/\/api\/v1$/,`/api/${t}`)}function tt(e,t){let r=String(e||"").trim();if(!zh(r))throw new Error(`cowswap: ${t} must be an address`);return pr(r).toLowerCase()}function Bt(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 qc(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 Bc(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 Wh({digest:e,owner:t,validTo:r}={}){let n=qc(e,"order digest").slice(2),o=tt(t,"owner").slice(2).toLowerCase(),s=Number(r);if(!Number.isInteger(s)||s<0||s>4294967295)throw new Error("cowswap: validTo must fit uint32");return`0x${n}${o}${s.toString(16).padStart(8,"0")}`.toLowerCase()}function ps(e){let t=Nc[Number(e)];if(!t)throw new Error(`cowswap: settlement contract not registered for chain ${e}`);return{name:"Gnosis Protocol",version:"v2",chainId:Number(e),verifyingContract:pr(t)}}function Kh(e={},t,r){let n=tt(e.sellToken,"sellToken"),o=tt(e.buyToken,"buyToken"),s=tt(e.receiver||r,"receiver"),i=Number(e.validTo);if(!Number.isInteger(i)||i<=0)throw new Error("cowswap: quote.validTo required");let a=qc(e.appData||e.appDataHash||`0x${"0".repeat(64)}`,"appData");return{sellToken:n,buyToken:o,receiver:s,sellAmount:Bt(e.sellAmount,"sellAmount"),buyAmount:Bt(e.buyAmount,"buyAmount"),validTo:i,appData:a,feeAmount:Bt(e.feeAmount??"0","feeAmount"),kind:String(e.kind||"sell"),partiallyFillable:!!e.partiallyFillable,sellTokenBalance:String(e.sellTokenBalance||"erc20"),buyTokenBalance:String(e.buyTokenBalance||"erc20")}}async function Gh(e={}){try{let t=await gt({chainId:1,sellToken:ls[1],buyToken:Pc[1],sellAmountBeforeFee:"1000000000000000",from:et},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 gt(e={},t={}){let r=Number(e.chainId??1),n=ns(e.from||e.owner),o=e.sellToken||ls[r],s=e.buyToken||Pc[r],i=String(e.sellAmountBeforeFee||e.sellAmount||"0");if(!o||!s||i==="0")throw new Error("cowQuote requires sellToken, buyToken, sellAmountBeforeFee");if(/eeeeeeee|native|^eth$/i.test(o)&&(o=ls[r],!o))throw new Error("no WETH mapping for chain");let a={sellToken:o,buyToken:s,from:n,receiver:e.receiver||n,sellAmountBeforeFee:i,kind:e.kind||"sell",signingScheme:e.signingScheme||"eip1271"},c=await T(`${nn(r,t)}/quote`,{method:"POST",body:a,fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),u=c?.quote?.buyAmount||c?.buyAmount;return u?ae(c,{chainId:r,venue:"cowswap-order",amountOut:u,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps}):c}async function Qh(e={},t={}){let r=Number(e.chainId??1),n=tt(ns(e.from||e.owner||e.signer),"owner"),o=await gt({...e,chainId:r,from:n,signingScheme:e.signingScheme||"eip712"},t),s=Kh(o?.quote||o,r,n),i=ps(r),a={domain:i,types:rn,primaryType:"Order",message:s},c=Tc.hash(i,rn,s),u=Rc[r];if(!u)throw new Error(`cowswap: vault relayer not registered for chain ${r}`);return J({provider:"cowswap",orderReady:!0,executionReady:!1,chainId:r,owner:n,signingScheme:"eip712",settlement:i.verifyingContract.toLowerCase(),vaultRelayer:pr(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:i.verifyingContract.toLowerCase(),vaultRelayer:pr(u).toLowerCase(),sellToken:s.sellToken,buyToken:s.buyToken,sellAmount:s.sellAmount,buyAmount:s.buyAmount,validTo:s.validTo,quoteId:o?.id??e.quoteId??null,typedDataHash:c,issuedAtMs:Date.now(),expiresAtMs:Math.min(s.validTo*1e3,Date.now()+2e4)},requiresApproval:{token:s.sellToken,spender:pr(u).toLowerCase(),amount:s.sellAmount}},{provider:"cowswap",kind:"cow-order"})}async function Uc(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(`${nn(r,t)}/orders/${encodeURIComponent(n)}/status`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function Fc(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(`${nn(r,t)}/orders/${encodeURIComponent(n)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}function Yh(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||Tc.hash(ps(r),rn,n),s=e.owner||e.from||e.signer||n.receiver;return Wh({digest:o,owner:s,validTo:n.validTo})}async function Jh(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 Xh(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 Zh(e={}){let t=Number(e.chainId??1),r=tt(e.owner||e.from||e.signer,"owner"),n=(e.orderUids||e.uids||[e.uid]).filter(Boolean).map((i,a)=>Bc(i,`orderUids[${a}]`));if(!n.length)throw new Error("cowswap: orderUids required");let o=ps(t);return J({provider:"cowswap",chainId:t,owner:r,orderUids:n,signingScheme:"eip712",typedData:{domain:o,types:$c,primaryType:"OrderCancellations",message:{orderUids:n}},cancelReady:!0,executableArtifact:!0},{provider:"cowswap",kind:"cow-cancel"})}async function e0(e={},t={}){throw new Error("cowswap.cowSignCancel refused: @oracle-agent/oracle is prepare-only. Cancel-sign with the user wallet.")}async function t0(e={},t={}){throw new Error("cowswap.cowCancelOrders refused: @oracle-agent/oracle is prepare-only. Cancel from the user wallet or local operator.")}function r0(e={}){return Bt(e.buyAmount??e.executedBuyAmount??"0","trade.buyAmount")}async function n0(e={},t={}){let r=Number(e.chainId??1),n=Bc(e.uid||e.orderUid),o=t.order||await Fc({chainId:r,uid:n},t),s=t.status||o.status||await Uc({chainId:r,uid:n},t).catch(()=>null),i=t.trades||await T(`${Vh(r,"v2",t)}/trades?orderUid=${encodeURIComponent(n)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),a=Array.isArray(i)?i:[],c=e.expectedOwner?tt(e.expectedOwner,"expectedOwner"):null;if(c&&tt(o.owner||a[0]?.owner||c,"owner")!==c)return{ok:!1,provider:"cowswap",chainId:r,uid:n,reason:"owner mismatch",order:o,status:s,trades:a};let u=0n;for(let d of a.filter(f=>String(f.orderUid||"").toLowerCase()===n))u+=BigInt(r0(d));u===0n&&o.executedBuyAmount!=null&&(u=BigInt(Bt(o.executedBuyAmount,"executedBuyAmount")));let p=e.minBuyAmount!=null?BigInt(Bt(e.minBuyAmount,"minBuyAmount")):0n,l=u>=p&&String(o.status||s?.status||"").toLowerCase()!=="expired";return{ok:l,provider:"cowswap",chainId:r,uid:n,status:o.status||s?.status||null,executedBuyAmount:u.toString(),minBuyAmount:e.minBuyAmount??null,trades:a,settlementTxs:[...new Set(a.map(d=>d.txHash).filter(Boolean))],order:o,orderStatus:s,reason:l?null:"insufficient fill or expired order"}}function o0(){return Object.keys(ds).map(Number)}var ds,Nc,Rc,ls,Pc,rn,$c,on=E(()=>{z();We();Oc();Gr();fe();ds={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"},Nc=Object.freeze({1:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41",100:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41",42161:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41",8453:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41"}),Rc=Object.freeze({1:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110",100:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110",42161:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110",8453:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110"}),ls={1:"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",8453:"0x4200000000000000000000000000000000000006",42161:"0x82aF49447D8a07e3bd95BD0d56f35241523fBab1"},Pc={1:"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",8453:"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",42161:"0xaf88d065e77c8cC2239327C5EDb3A432268e5831"},rn=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"}]}),$c=Object.freeze({OrderCancellations:[{name:"orderUids",type:"bytes[]"}]})});function Mc(e){return s0.get(Number(e))||null}function jc(e,t=process.env){let r=Mc(e);if(!r)return null;for(let n of r.rpcEnv){let o=(t[n]||"").trim();if(o)return o}return null}var Dc,s0,Hc=E(()=>{Dc={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}},s0=new Map(Object.values(Dc).map(e=>[e.chainId,e]))});import{Interface as i0,getAddress as a0}from"ethers";function fr(e,t){try{return a0(e).toLowerCase()}catch{throw new Error(`${t} must be a valid EVM address`)}}function u0(e,{rpcUrl:t,env:r=process.env}={}){if(t)return t;let n=jc(e,r);return n||c0[Number(e)]||null}function d0(e){let t=String(e||""),r=t.toLowerCase();if(t!==t.trim()||!/^[a-zA-Z0-9_]+$/.test(t)||!l0.test(r))throw new Error(`evm-rpc: ${t} refused \u2014 @oracle-agent/oracle is prepare-only (read RPC only; no broadcast/sign)`);return r}async function te(e,t,r=[],n={}){let o=String(t||"");d0(o);let s=u0(e,n);if(!s)throw new Error(`No RPC URL for chainId ${e} (set env from chain registry rpcEnv or pass rpcUrl)`);let a=await T(s,{method:"POST",body:{jsonrpc:"2.0",id:1,method:t,params:r},fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs??12e3});if(a?.error){let c=new Error(a.error.message||JSON.stringify(a.error));throw c.code=a.error.code,c}return a.result}async function an(e,t={}){let r=await te(e,"eth_blockNumber",[],t);return parseInt(r,16)}async function zc(e,t={}){let r=await te(e,"eth_gasPrice",[],t);if(r==null)return null;try{return BigInt(r)}catch{return null}}async function Vc(e,t,r={}){if(!t)throw new Error("rpcGetBalance requires address");let n=await te(e,"eth_getBalance",[t,"latest"],r);return{chainId:Number(e),address:t,balanceWei:BigInt(n).toString(),balanceHex:n}}async function Wc(e={},t={}){let r=Number(e.chainId??t.chainId??1),n=fr(e.token||e.tokenAddress,"token"),o=fr(e.owner,"owner"),s=fr(e.spender,"spender"),i=sn.encodeFunctionData("allowance",[o,s]),a=await te(r,"eth_call",[{to:n,data:i},e.blockTag||"latest"],t),c=sn.decodeFunctionResult("allowance",a),u=BigInt(c[0]);return{chainId:r,token:n,owner:o,spender:s,allowance:u.toString(),allowanceHex:`0x${u.toString(16)}`,blockTag:e.blockTag||"latest"}}async function Kc(e={},t={}){let r=Number(e.chainId??t.chainId??1),n=fr(e.token||e.tokenAddress,"token"),o=fr(e.account||e.owner||e.address,"account"),s=sn.encodeFunctionData("balanceOf",[o]),i=await te(r,"eth_call",[{to:n,data:s},e.blockTag||"latest"],t),a=sn.decodeFunctionResult("balanceOf",i),c=BigInt(a[0]);return{chainId:r,token:n,account:o,balance:c.toString(),balanceHex:`0x${c.toString(16)}`,blockTag:e.blockTag||"latest"}}var sn,c0,l0,rt=E(()=>{z();Hc();sn=new i0(["function allowance(address owner,address spender) view returns (uint256)","function balanceOf(address account) view returns (uint256)"]);c0={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"};l0=/^(?:eth_(?:call|blocknumber|chainid|get[a-z0-9]+|feehistory|gasprice|maxpriorityfeepergas|syncing|protocolversion|estimategas|createaccesslist)|net_(?:version|listening|peercount)|web3_(?:clientversion|sha3))$/});function h0(e,t,r){let n=Ie(t),o=Ie(r),s=Ie(e?.baseToken?.address),i=Ie(e?.quoteToken?.address);return s===n&&i===o||s===o&&i===n}function g0(e){let t=Number(e?.liquidity?.usd);return Number.isFinite(t)&&t>=0?t:null}function y0(e={}){return(e.baseUrl||process.env.DEXSCREENER_API_URL||p0).replace(/\/$/,"")}async function fs(e,t={}){if(!e)throw new Error("tokenAddress required");return T(`${y0(t)}/latest/dex/tokens/${e}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3})}async function Gc({chainId:e,tokenA:t,tokenB:r,dexIds:n=[]}={},o={}){return(await mr({chainId:e,tokenA:t,tokenB:r,dexIds:n},o))[0]??null}async function mr({chainId:e,tokenA:t,tokenB:r,dexIds:n=[]}={},o={}){if(e==null||!t||!r)throw new Error("chainId, tokenA, and tokenB required");let s=Ie(f0[Number(e)]||e),i=new Set(m0(n).filter(Boolean).map(Ie)),a=[...new Set([t,r].map(d=>String(d)).filter(Boolean))],c=await Promise.allSettled(a.map(d=>fs(d,{...o,baseUrl:o.dexscreenerBaseUrl,timeoutMs:o.dexscreenerTimeoutMs??Math.min(Number(o.timeoutMs??4e3),4e3)}))),u=new Set,p=[];for(let d of c)if(d.status==="fulfilled")for(let f of d.value?.pairs||d.value?.data?.pairs||[]){let m=`${Ie(f?.chainId)}:${Ie(f?.dexId)}:${Ie(f?.pairAddress)}`;u.has(m)||(u.add(m),p.push(f))}return p.filter(d=>Ie(d?.chainId)===s).filter(d=>h0(d,t,r)).filter(d=>!i.size||i.has(Ie(d?.dexId))).map(d=>({pairAddress:d.pairAddress??null,dexId:d.dexId??null,chainId:d.chainId??null,liquidityUsd:g0(d),pairCreatedAt:d.pairCreatedAt??null})).filter(d=>d.liquidityUsd!=null).sort((d,f)=>f.liquidityUsd-d.liquidityUsd)}var p0,f0,Ie,m0,cn=E(()=>{z();p0="https://api.dexscreener.com",f0=Object.freeze({1:"ethereum",10:"optimism",56:"bsc",137:"polygon",8453:"base",42161:"arbitrum",43114:"avalanche",999:"hyperevm",4663:"robinhood"}),Ie=e=>String(e??"").toLowerCase(),m0=e=>Array.isArray(e)?e:e==null?[]:[e]});var nu={};Q(nu,{PANCAKE_FEE_TIERS:()=>un,UNI_V3_CHAINS:()=>me,UNI_V3_FEE_TIERS:()=>Xc,UNI_V3_VENUES:()=>tu,uniV3Chains:()=>E0,uniV3EthUsdc:()=>ru,uniV3Health:()=>v0,uniV3PrepareExactIn:()=>k0,uniV3QuoteExactIn:()=>yt,uniV3QuoteExactInPath:()=>S0});import{Interface as Yc,getAddress as hr,isAddress as Jc}from"ethers";function hs(e,t){let r=Number(e),n=me[r];if(!n)throw new Error(`uniswap-v3: unsupported chainId ${e} (supported: ${Object.keys(me).join(", ")})`);let o=tu[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 s=String(t).toLowerCase();if(s===n.name&&n.quoter&&n.router)return{chainId:r,venue:n.name,...n};let i=o,a=i[s];if(!a){let c=[...n.quoter&&n.router?[n.name]:[],...Object.keys(i)].join(", ");throw new Error(`uniswap-v3: unknown venue "${t}" on chain ${r} (known: ${c})`)}return{chainId:r,venue:s,...n,quoter:a.quoter,router:a.router,feeTiers:a.feeTiers||null}}function ms(e,t){let r=me[Number(t)];if(!e||e===Zc||e===eu||/^eth$/i.test(String(e)))return hr(r.weth);let n=String(e);if(/^weth$/i.test(n))return hr(r.weth);if(/^usdc$/i.test(n))return hr(r.usdc);if(!Jc(n))throw new Error(`invalid token address: ${e}`);return hr(n)}function w0(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 x0(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 yt(e={},t={}){let{chainId:r,quoter:n,router:o,feeTiers:s}=hs(e.chainId??8453,e.venue),i=ms(e.tokenIn||"WETH",r),a=ms(e.tokenOut||me[r].usdc,r),c=BigInt(e.amountIn??0);if(c<=0n)throw new Error("amountIn required (raw base units)");let u=s&&s.length?s:Xc,p=e.fee!=null?[Number(e.fee)]:e.tryFees===!1?[u[Math.min(2,u.length-1)]]:[...u],l=[],d=null;for(let v of p){let h=ln.encodeFunctionData("quoteExactInputSingle",[{tokenIn:i,tokenOut:a,amountIn:c,fee:v,sqrtPriceLimitX96:0n}]);try{let w=await te(r,"eth_call",[{to:n,data:h},"latest"],t);if(!w||w==="0x"){l.push({fee:v,ok:!1,error:"empty result"});continue}let O=ln.decodeFunctionResult("quoteExactInputSingle",w),P={fee:v,ok:!0,amountOut:O[0].toString(),sqrtPriceX96After:O[1].toString(),initializedTicksCrossed:Number(O[2]),gasEstimate:O[3].toString()};l.push(P),(!d||BigInt(P.amountOut)>BigInt(d.amountOut))&&(d=P)}catch(w){l.push({fee:v,ok:!1,error:String(w.message||w).slice(0,160)})}}if(!d){let v=l.map(h=>`${h.fee}:${h.error||"fail"}`).join("; ");throw new Error(`uniswap-v3 quote failed chain=${r}: ${v}`)}let f=e.liquidityUsd==null?await mr({chainId:r,tokenA:i,tokenB:a,dexIds:w0(e.venue)},t).catch(()=>[]):[],m={};for(let v of f.slice(0,8))if(!(!v.pairAddress||!Jc(v.pairAddress)))try{let h=await te(r,"eth_call",[{to:v.pairAddress,data:b0},"latest"],t),w=h&&h!=="0x"&&h.length<=66?Number.parseInt(h,16):NaN;if(!Number.isFinite(w)||w<=0||w>1e6)continue;(m[w]==null||v.liquidityUsd>m[w].liquidityUsd)&&(m[w]=v)}catch{}let y=e.liquidityBandBps==null?50:Number(e.liquidityBandBps),g=null;if(e.fee==null&&y>0&&BigInt(d.amountOut)>0n){let v=BigInt(d.amountOut),w=l.filter(O=>O.ok&&Number((v-BigInt(O.amountOut))*10000n/v)<=y).filter(O=>m[O.fee]?.liquidityUsd!=null).sort((O,P)=>m[P.fee].liquidityUsd-m[O.fee].liquidityUsd)[0];w&&w.fee!==d.fee&&(g={priceBestFee:d.fee,chosenFee:w.fee,chosenPoolUsd:m[w.fee].liquidityUsd,bandBps:y},d=w)}let b=m[d.fee]??null,S=f[0]??null,C=b??S,x=e.liquidityUsd??b?.liquidityUsd??S?.liquidityUsd??null,I=e.liquidityUsd!=null?"caller":b?"pool":S?"pair":null;return ae({venue:"uniswap-v3",chainId:r,chain:me[r].name,quoter:n,tokenIn:i,tokenOut:a,amountIn:c.toString(),fee:d.fee,amountOut:d.amountOut,gasEstimate:d.gasEstimate,liquidityUsd:x,liquiditySource:C,liquidityAttribution:I,liquidityPick:g,sqrtPriceX96After:d.sqrtPriceX96After,initializedTicksCrossed:d.initializedTicksCrossed,triedFees:l,best:!0},{chainId:r,venue:o,amountOut:d.amountOut,liquidityUsd:x,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps})}async function S0(e={},t={}){let{chainId:r,quoter:n,router:o}=hs(e.chainId??8453),s=(e.tokens||[]).map(d=>ms(d,r)),i=(e.fees||[]).map(Number);if(s.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=x0(s,i),u=ln.encodeFunctionData("quoteExactInput",[c,a]),p=await te(r,"eth_call",[{to:n,data:u},"latest"],t),l=ln.decodeFunctionResult("quoteExactInput",p);return ae({venue:"uniswap-v3",chainId:r,chain:me[r].name,quoter:n,tokens:s,fees:i,path:c,amountIn:a.toString(),amountOut:l[0].toString(),gasEstimate:l[3].toString()},{chainId:r,venue:o,amountOut:l[0].toString(),liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps})}async function ru(e={},t={}){let r=Number(e.chainId??8453),n=e.amountIn??"1000000000000000",o=await yt({chainId:r,tokenIn:me[r].weth,tokenOut:me[r].usdc,amountIn:n,fee:e.fee},t),s=Number(o.amountOut)/1e6;return{...o,amountOutUsdc:s,pair:"WETH/USDC"}}async function k0(e={},t={}){let r=Number(e.chainId??8453),n=hs(r,e.venue),o=hr(e.recipient),s=String(e.tokenIn||"WETH"),i=!e.tokenIn||s===Zc||s===eu||/^eth$/i.test(s),a=await yt(e,t),c=Qc.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))),l=Number(t.nowSeconds??Math.floor(Date.now()/1e3))+u,d=Qc.encodeFunctionData("multicall",[l,[c]]);return J({provider:"uniswap-v3",calldataReady:!0,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:r,deadline:l,quote:a,autoSlippage:a.autoSlippage,requiresApproval:i?null:{token:a.tokenIn,spender:n.router,amount:a.amountIn},transaction:{chainId:r,from:o,to:n.router,data:d,value:i?a.amountIn:"0",slippageGuard:Ae(a.autoSlippage,{chainId:r,venue:n.router,data:d})}},{provider:"uniswap-v3",kind:"univ3-swap-tx"})}async function v0(e={}){let t=Number(e.chainId??8453);try{let r=await ru({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 E0(){return Object.entries(me).map(([e,t])=>({chainId:Number(e),name:t.name,quoter:t.quoter,weth:t.weth,usdc:t.usdc}))}var me,Xc,b0,ln,Qc,Zc,eu,un,tu,dn=E(()=>{rt();cn();We();fe();me={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"}},Xc=[100,500,3e3,1e4],b0="0xddca3f43",ln=new Yc(["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)"]),Qc=new Yc(["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)"]),Zc="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",eu="0x0000000000000000000000000000000000000000",un=[100,500,2500,1e4],tu={56:{pancakeswap:{name:"pancakeswap",quoter:"0xB048Bbc1Ee6b733FFfCFb9e9CeF7375518e25997",router:"0x13f4EA83D0bd40E75C8222255bc855a974568Dd4",feeTiers:un}},8453:{pancakeswap:{name:"pancakeswap",quoter:"0xB048Bbc1Ee6b733FFfCFb9e9CeF7375518e25997",router:"0x13f4EA83D0bd40E75C8222255bc855a974568Dd4",feeTiers:un}},42161:{pancakeswap:{name:"pancakeswap",quoter:"0xB048Bbc1Ee6b733FFfCFb9e9CeF7375518e25997",router:"0x13f4EA83D0bd40E75C8222255bc855a974568Dd4",feeTiers:un}},999:{hyperswap:{name:"hyperswap",quoter:"0x03A918028f22D9E1473B7959C927AD7425A45C7C",router:"0x4E2960a8cd19B467b82d26D83fAcb0fAE26b094D"}}}});var cu={};Q(cu,{executeRfqCandidates:()=>iu,rankRfqQuotes:()=>au,requestRfqQuotes:()=>_0,sourceCandidates:()=>su});function gr(e,t){return Array.isArray(e?.allowedSources)&&e.allowedSources.includes(t)}function ou(e,t){return String(e?.[t]??"").trim()}function yr(e,t){return Object.freeze({source:e,run:t})}function su(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??me,s=Number(e.fromChainId)===Number(e.toChainId),i=[];return gr(e,"lifi")&&i.push(yr("lifi",async()=>{let c=await(n.lifiQuote??ht)({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 A0(t,c.transactionRequest.data):void 0,route:c},metadata:{tool:c?.tool??c?.toolDetails?.name??null}}})),s&&(gr(e,"paraswap")&&i.push(yr("paraswap",async()=>{let c=await(n.paraswapPrice??$t)({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}}})),gr(e,"0x")&&(ou(r,"ZEROX_API_KEY")||ou(r,"0X_API_KEY")||n.zeroxQuote)&&i.push(yr("0x",async()=>{let c=await(n.zeroxQuote??qt)({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}}})),gr(e,"cow")&&i.push(yr("cow",async()=>{let c=await(n.cowQuote??gt)({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}}})),gr(e,"uniswap-v3")&&o[Number(e.fromChainId)]&&i.push(yr("uniswap-v3",async()=>{let c=await(n.uniV3QuoteExactIn??yt)({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}}}))),i}async function A0(e,t){return`0x${(await import("node:crypto")).createHash("sha256").update(String(t)).digest("hex")}`}async function I0(e,t){return Promise.race([Promise.resolve().then(e.run),new Promise((r,n)=>setTimeout(()=>n(new Error(`${e.source}: timeout`)),t))])}async function iu(e,t,r={}){let n=Number(r.timeoutMs??12e3),o=await Promise.allSettled(t.map(a=>I0(a,n))),s=[],i=[];for(let a=0;a<o.length;a++){let c=t[a],u=o[a];if(u.status==="rejected"){i.push({source:c.source,error:String(u.reason?.message||u.reason)});continue}try{s.push(Zo(e,{...u.value,source:c.source},r))}catch(p){i.push({source:c.source,error:String(p?.message||p)})}}return{quotes:s,failed:i}}function au(e=[],t={}){let r=Number(t.nowMs??Date.now()),n=e.filter(i=>Number(i.expiryMs??0)>r);n.sort((i,a)=>{let c=BigInt(a.minBuyAmount??0)-BigInt(i.minBuyAmount??0);if(c!==0n)return c>0n?1:-1;let u=BigInt(a.amountOut??0)-BigInt(i.amountOut??0);return u>0n?1:u<0n?-1:0});let o=n.map(i=>({...i,scoreBasis:"minBuyAmount"})),s=[];return o.length||s.push("no RFQ source returned a usable firm quote"),e.length!==o.length&&s.push("expired RFQ quotes were excluded from ranking"),{best:o[0]??null,quotes:o,failed:[],warnings:s}}async function _0(e,t={}){let r=su(e,t),{quotes:n,failed:o}=await iu(e,r,t),s=au(n,t);return{kind:"rfq-result",intent:e,best:s.best,quotes:s.quotes,failed:o,warnings:[...s.warnings],sourcesTried:r.length,sourcesAnswered:n.length}}var uu=E(()=>{dr();Jr();tn();on();dn();es()});function lu(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,s]of(e.venues||[]).entries()){let i=`venues[${o}]`;if(!s||typeof s!="object"){t.push(`${i} must be an object`);continue}C0.test(s.address||"")||t.push(`${i}.address is not a valid 20-byte address`),/^0x0{40}$/.test(s.address||"")&&t.push(`${i}.address is the zero address -- placeholder left in place?`),s.kind||t.push(`${i}.kind is required (router|quoter|factory|...)`),s.verified?(s.verified.method||t.push(`${i}.verified.method is required`),s.verified.source||t.push(`${i}.verified.source is required`),s.verified.date||r.push(`${i}.verified.date missing -- add one so staleness is visible`)):t.push(`${i} must record verification: { verified: { method, source, date } }. An unverified venue stays blocked.`)}let n=e.capabilities||{};for(let o of Object.keys(n))Ut.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 du(e){let{ok:t,errors:r,warnings:n}=lu(e);if(!t)throw new Error(`invalid scanner for ${e?.key??"<unknown>"}:
2
+ var Tm=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 j=(e,t)=>{for(var r in t)Tm(e,r,{get:t[r],enumerable:!0})};import{homedir as jo}from"node:os";import{join as Ho}from"node:path";function zo(e,t,r=""){let n=process.env[e];if(n!=null&&String(n).trim()!=="")return n;let o=t?process.env[t]:void 0;return o!=null&&String(o).trim()!==""?o:r}function tn(e,t,r=!1){return String(zo(e,t,r?"1":"")).trim()==="1"}var Ta,Nm,AA,rn=v(()=>{Ta=process.env.ORACLE_PUBLIC_DESKTOP==="1",Nm=Ta?process.env.ORACLE_CONFIG_DIR||Ho(jo(),".config","oracle"):Ho(jo(),".config","oracle"),AA=Ta?Nm:Ho(jo(),".config","mad-desk")});function eh(e){let t=String(e??"");return t.length<18?"[REDACTED]":`${t.slice(0,6)}\u2026${t.slice(-4)}`}function th(e){return`\xABredacted:${String(e??"").slice(0,4)}\u2026\xBB`}function wt(e,t={}){if(e==null)return e;let r=typeof e=="string"?e:String(e);if(!r||!(t.force||zm))return r;let n=t.fileRead?th:eh;r=r.replace(Gm,"[REDACTED_PRIVATE_KEY]"),r=r.replace(Wm,"[REDACTED_EVM_KEY]"),r=r.replace(Km,o=>n(o));for(let o of Vm)o.lastIndex=0,r=r.replace(o,i=>n(i));return r=r.replace(Xm,(o,i,s,a)=>/^(?:os\.(?:getenv|environ)|process\.env|\$ENV\{)/.test(a)?`${i}=${s||""}${a}${s||""}`:`${i}=${s||""}${n(a)}${s||""}`),r=r.replace(Ym,(o,i,s,a)=>o.replace(a,n(a))),r=r.replace(Qm,(o,i,s,a)=>`${i}${n(s)}${a}`),r}function qa(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();Zm.has(o)&&t.searchParams.set(n,"[REDACTED]")}return{ok:!0,url:t,href:t.toString()}}var Hm,zm,Vm,Wm,Gm,Km,Xm,Ym,Qm,Jm,Zm,Wo=v(()=>{Hm=(process.env.ORACLE_REDACT_SECRETS??"true").toLowerCase(),zm=["1","true","yes","on"].includes(Hm),Vm=[/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],Wm=/\b0x[a-fA-F0-9]{64}\b/g,Gm=/-----BEGIN (?:RSA |EC |OPENSSH |ENCRYPTED )?PRIVATE KEY-----[\s\S]*?-----END (?:RSA |EC |OPENSSH |ENCRYPTED )?PRIVATE KEY-----/g,Km=/\beyJ[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\b/g,Xm=/\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,Ym=/^(?:export\s+)?((?:api[_-]?key|token|secret|password|private[_-]?key|mnemonic|seed[_-]?phrase|authorization))\s*[:=]\s*(['"]?)([^\s&]+)\2/gim,Qm=/("(?:api[_-]?key|apiKey|access[_-]?token|refresh[_-]?token|client[_-]?secret|private[_-]?key|privateKey|secret|password|authorization|bearer|mnemonic|seedPhrase)"\s*:\s*")([^"]{6,})(")/gi,Jm=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"]),Zm=new Set([...Jm].map(e=>e.replace(/[^a-z0-9]/gi,"").toLowerCase()))});import xt from"node:net";import oh from"node:dns";function sn(e){let t=String(e).toLowerCase().split("%")[0];if((t.match(/::/g)||[]).length>1)return null;let r=d=>{if(!d)return[];let l=d.split(":"),p=l.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;l.splice(l.length-1,1,(f[0]<<8|f[1]).toString(16),(f[2]<<8|f[3]).toString(16))}return l.some(f=>!/^[0-9a-f]{1,4}$/.test(f))?null:l.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(d=>[d>>8,d&255]))}function Go(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 Ko(e){if(xt.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(xt.isIPv6(e)){let t=sn(e);if(!t)return!1;let r=sn("::ffff:0:0");return Go(t,r,96)?Ko([...t.slice(12)].join(".")):Go(t,sn("2000::"),3)?![["2001::",23],["2001:db8::",32],["2001:10::",28],["2001:2::",48],["2002::",16],["3fff::",20]].some(([o,i])=>Go(t,sn(o),i)):!1}return!1}function sh(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(ih.has(r)||r.endsWith(".localhost")||r.endsWith(".internal"))return{ok:!1,error:`refused internal host ${r}`};let n=xt.isIP(r);return n!==0&&!Ko(r)?{ok:!1,error:`refused private address ${r}`}:{ok:!0,url:t,host:r,isLiteralIp:n!==0}}async function Xo(e,{lookupFn:t=oh.promises.lookup}={}){let r=sh(e);if(!r.ok)return r;if(r.isLiteralIp)return{ok:!0,url:r.url,addresses:[{address:r.host,family:xt.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=>!Ko(o.address))?{ok:!1,error:`refused: ${r.host} resolves to a non-public address`}:{ok:!0,url:r.url,addresses:n}}async function Yo({requireUndici:e=!1,importUndici:t=()=>import("undici")}={}){let r,n;try{let l=await t();r=l.Agent,n=l.fetch}catch(l){if(e)throw new Error(`egress-guard: untrustedUrl pinning requires the undici package, which failed to load: ${l?.message||l}`);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=l=>String(l).toLowerCase().replace(/^\[|\]$/g,"").replace(/\.+$/,""),i=new Map,s=l=>(Array.isArray(l)?l:[l]).map(p=>typeof p=="string"?{address:p}:p).filter(p=>p&&p.address).map(p=>({address:p.address,family:p.family||(xt.isIPv6(p.address)?6:4)})),a=(l,p,f)=>{i.set(o(l),s(typeof p=="string"?[{address:p,family:f}]:p))},c=l=>{let p=o(l);if(xt.isIP(p))return[{address:p,family:xt.isIPv6(p)?6:4}];let f=i.get(p);if(!f||!f.length)throw new Error(`refused: unpinned host ${l} during pinned fetch`);return f},u=new r({connect:{lookup(l,p,f){let m;try{m=c(l)}catch(g){return f(g)}return p?.all?f(null,m):f(null,m[0].address,m[0].family)}}}),d=ah((l,p={})=>n(l,{...p,dispatcher:u}),a);return{dispatcher:u,fetch:d,pin:a,resolve:c,async close(){try{await u.destroy()}catch{}}}}function ah(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[Qo]=Object.freeze({pin:t}),e}function Jo(e){return typeof e=="function"&&typeof e[Qo]?.pin=="function"}function Ua(e,t,r){if(!Jo(e))throw new Error("pinFetchToAddresses: fetchImpl is not pin-capable");e[Qo].pin(t,r)}var ih,Qo,Ba=v(()=>{ih=new Set(["localhost","metadata.google.internal","metadata.goog"]);Qo=Symbol.for("oracle.egressGuard.pinCapableFetch")});import{createHash as ch}from"node:crypto";function fh(e){let t=String(e||"").toLowerCase();return za.includes(t)||/(^|-)(api[-_]?key|key|token|secret|auth|authorization|session|cookie|signature|access)(-|$)/.test(t)}function mh(e){let t={};for(let[r,n]of Object.entries(e||{}))fh(r)||(t[r]=n);return t}function hh(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 yh(e,t){return new URL(String(e)).origin===new URL(String(t)).origin}function gh(e,t,r,n={}){let o={};for(let[d,l]of Object.entries(r||{}))o[d.toLowerCase()]=l;let i=Object.keys(o).filter(d=>/(^|-)(api[-_]?key|key|token|secret|auth|authorization|session|cookie|signature|access)(-|$)/.test(d)),a=[...new Set([...za,...i])].sort().map(d=>`${d}=${o[d]??""}`).join(`
3
+ `),c=ch("sha256").update(a).digest("hex").slice(0,32),u=`${n.untrustedUrl?"untrusted":"trusted"}:${n.maxResponseBytes??"unbounded"}`;return`${e} ${t} ${u} ${c}`}function bh(e,t){let r=Number(t);return Number.isFinite(r)&&r>0?Math.min(r*1e3,Da):Math.min(250*2**e,Da)+Math.floor(Math.random()*100)}function pr(e,t={}){let r=new Error(e);return r.retryable=!1,Object.assign(r,t),r}function ei(e,t,r){return pr(`HTTP response from ${e} exceeded maxResponseBytes ${r} (${t})`,{oversize:!0})}function fr(e){try{let t=e?.body?.cancel?.();t&&typeof t.then=="function"&&t.catch(()=>{})}catch{}}function xh(e){return e?e.byteLength??e.length??0:0}async function ja(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&&(fr(e),!n))throw ei(r,`content-length ${i}`,t);let s=e.body?.getReader?.();if(!s){let l=await e.text(),p=Buffer.byteLength(l,"utf8");if(p>t){if(!n)throw ei(r,`body ${p} bytes`,t);return Buffer.from(l,"utf8").subarray(0,t).toString("utf8")}return l}let a=[],c=0,u=!1;try{for(;;){let{value:l,done:p}=await s.read();if(p)break;if(l&&(a.push(Buffer.from(l)),c+=xh(l),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 ei(r,`streamed ${c} bytes`,t);let d=Buffer.concat(a);return(u?d.subarray(0,t):d).toString("utf8")}function Ha(e){if(!e)return null;try{return JSON.parse(e)}catch{return null}}async function Sh(e,{fetchImpl:t,method:r,headers:n,body:o,timeoutMs:i,lookupFn:s,realFetch:a,untrustedUrl:c=!1,maxResponseBytes:u=null,importUndici:d,validateResponse:l,signal:p}){let f=new AbortController,m=setTimeout(()=>f.abort(),i),g=p?typeof AbortSignal.any=="function"?AbortSignal.any([p,f.signal]):p:f.signal,h=null,w=t,S=s?{lookupFn:s}:{};if(c&&!a&&!Jo(w))throw pr(`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 A=await Xo(x,S);if(!A.ok)throw pr(O==null?`HTTP refused ${x}: ${A.error}`:`HTTP redirect to ${x} ${A.error}`,O==null?{}:{status:O});let b=new URL(x).hostname;if(a){if(h&&(await h.close(),h=null),!h)try{h=await Yo({requireUndici:!0,...d?{importUndici:d}:{}})}catch(y){throw pr(O==null?`HTTP refused ${x}: ${y?.message||y}`:`HTTP redirect to ${x} refused: ${y?.message||y}`,O==null?{}:{status:O})}h.pin(b,A.addresses),w=h.fetch}else Ua(w,b,A.addresses);return A};try{let x=String(e),O={...n||{}};c&&await _(x);for(let A=0;A<=Ma;A+=1){let b=await w(x,{method:r,headers:O,body:o,signal:g,redirect:"manual"});if(dh.has(b.status)){if(r!=="GET"&&r!=="HEAD"){let $=await ja(b,u??ph,{url:x,truncate:!0}),L=new Error(`HTTP ${b.status} ${r} ${x} redirected non-idempotent request`);throw L.status=b.status,L.body=Ha($)??$.slice(0,300),L}if(A===Ma)throw fr(b),new Error(`HTTP redirect loop for ${e}`);let E=b.headers?.get?.("location"),R;try{R=hh(E,x)}catch($){throw fr(b),$}let I=!yh(R,x);if(fr(b),I&&(O=mh(O)),c)await _(R,{status:b.status});else if(I){let $=await Xo(R,S);if(!$.ok){let L=new Error(`HTTP redirect from ${x} ${$.error}`);throw L.status=b.status,L.retryable=!1,L}a&&$.addresses?.length&&(h||(h=await Yo(d?{importUndici:d}:{})),h&&(h.pin(new URL(R).hostname,$.addresses),w=h.fetch))}x=R;continue}if(typeof l=="function")try{await l(b,{url:x})}catch(E){throw fr(b),pr(E?.message||String(E))}let y=await ja(b,u,{url:x,onOversize:()=>f.abort()}),k=Ha(y);if(!b.ok){let E=new Error(`HTTP ${b.status} ${r} ${x}`);throw E.status=b.status,E.retryAfter=b.headers?.get?.("retry-after")??null,E.body=k??y.slice(0,300),E}return k??y}throw new Error(`HTTP redirect loop for ${e}`)}finally{clearTimeout(m),h&&await h.close()}}async function N(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):lh,c=t.lookupFn,u=!t.fetchImpl,d=t.untrustedUrl===!0,l=t.importUndici,p=t.validateResponse,f=t.signal,m=Number(t.maxResponseBytes),g=Number.isFinite(m)&&m>0?Math.floor(m):null,h=async()=>{let O;for(let A=0;A<=a;A++){f?.throwIfAborted?.();try{return await Sh(e,{fetchImpl:r,method:o,headers:i,body:s,timeoutMs:n,lookupFn:c,realFetch:u,untrustedUrl:d,maxResponseBytes:g,importUndici:l,validateResponse:p,signal:f})}catch(b){O=b;let y=b?.status,k=b?.name==="AbortError"||b?.name==="TimeoutError"||f?.aborted,E=new Set([408,425,429]),R=b?.retryable===!1?!1:y!=null?E.has(y)||uh.has(y)&&Fa.has(o):!k&&Fa.has(o);if(A===a||!R)throw b;let I=bh(A,b?.retryAfter);f?await new Promise(($,L)=>{let M=setTimeout($,I);f.addEventListener("abort",()=>{clearTimeout(M),L(f.reason||new DOMException("Aborted","AbortError"))},{once:!0})}):await wh(I)}}throw O};if(!(t.dedupe!==!1&&!f&&o==="GET"&&s==null))return h();let S=gh(o,e,i,{untrustedUrl:d,maxResponseBytes:g}),_=Zo.get(S);if(_)return _;let x=h().finally(()=>Zo.delete(S));return Zo.set(S,x),x}async function an(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 uh,Fa,lh,Da,za,dh,Ma,ph,Zo,wh,W=v(()=>{Ba();uh=new Set([408,425,429,500,502,503,504]),Fa=new Set(["GET","HEAD","OPTIONS","PUT","DELETE"]),lh=2,Da=4e3,za=["authorization","x-api-key","x-tensor-api-key","0x-api-key","api-key","cookie","proxy-authorization"],dh=new Set([301,302,303,307,308]),Ma=3,ph=64*1024;Zo=new Map;wh=e=>new Promise(t=>setTimeout(t,e))});function Ah({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"?kh:Eh}async function ti(e,t={}){if(!e||!e.type)throw new Error("hlInfo requires body.type");let r=Ah(t);return N(r,{method:"POST",body:e,fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function Va(e={}){return ti({type:"meta"},e)}async function Wa({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 ti(i,o)}async function Ga({coin:e,startTime:t,endTime:r},n={}){if(!e)throw new Error("hlFundingHistory requires coin");return ti({type:"fundingHistory",coin:String(e),startTime:t??Date.now()-24*3600*1e3,endTime:r??Date.now()},n)}var Eh,kh,ri=v(()=>{W();Eh="https://api.hyperliquid.xyz/info",kh="https://api.hyperliquid-testnet.xyz/info"});import{createHash as vh}from"node:crypto";function Ve(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function Lt(e){return typeof e=="number"&&Number.isFinite(e)}function ii(e){if(e==null||typeof e!="object"||Object.isFrozen(e))return e;if(Array.isArray(e)){for(let t of e)ii(t);return Object.freeze(e)}for(let t of Object.keys(e))ii(e[t]);return Object.freeze(e)}function St(e){if(Array.isArray(e))return e.map(St);if(e!=null&&typeof e=="object"){let t={};for(let r of Object.keys(e).sort())t[r]=St(e[r]);return t}return e}function ni(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 Ka(e){return{feesUsd:e.costs.feesUsd,builderFeesUsd:e.costs.builderFeesUsd,fundingUsd:e.costs.fundingUsd,slippageUsd:e.costs.slippageUsd}}function _h(e){return(e.feesUsd||0)+(e.builderFeesUsd||0)+Math.max(0,e.fundingUsd||0)+(e.slippageUsd||0)}function Oh(e){let t=0;for(let r of e.trades)r.grossPnlUsd>0&&(t+=r.grossPnlUsd);return t}function Ch(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 Ya(e){if(!Ve(e))throw new TypeError("evidence artifact must be a plain object");if(!Ih.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(!Ve(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(!Ve(e.walkForward)||!Array.isArray(e.walkForward.windows))throw new TypeError("evidence artifact walkForward windows required");if(e.status==="pass_live_eligible"&&(!Ve(e.train)||!Ve(e.holdout)))throw new TypeError("live-eligible evidence artifact requires train and holdout facts");return St({barsHash:e.barsHash,compilerHash:e.compilerHash,flags:e.flags.map(t=>St(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 Qa(e){return vh("sha256").update(JSON.stringify(Ya(e)),"utf8").digest("hex")}function Te(e,t,r=0){if(!Number.isInteger(e)||e<r)throw new Error(`${t} must be an integer >= ${r}`);return e}function oi(e,t){if(!Ve(e)||!Ve(e.metrics))throw new Error(`${t} metrics required`);let r=Te(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(!Lt(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 Th(e,{maxDailyLossPct:t}={}){let r=e.split,n=Te(r.trainStartIndex,"split.trainStartIndex"),o=Te(r.trainEndIndex,"split.trainEndIndex"),i=Te(r.trainBarCount,"split.trainBarCount",1),s=Te(r.holdoutStartIndex,"split.holdoutStartIndex"),a=Te(r.holdoutEndIndex,"split.holdoutEndIndex"),c=Te(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(!Lt(r.trainFraction)||r.trainFraction<=0||r.trainFraction>=1)throw new Error("split.trainFraction must be in (0,1)");oi(e.train,"train");let u=oi(e.holdout,"holdout");if(u.tradeCount<1||u.netPnlUsd<=0||u.profitFactor<=1)throw new Error("live-eligible holdout metrics do not pass");if(Lt(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 d=e.walkForward,l=d.windows;if(l.length<1||d.windowsRun!==l.length)throw new Error("live-eligible walk-forward windowsRun must match nonempty windows");let p=0,f=-1;for(let g=0;g<l.length;g++){let h=l[g];if(!Ve(h)||h.index!==g||typeof h.passed!="boolean")throw new Error("walk-forward windows must be ordered and structurally valid");let w=Te(h.trainStartIndex,`walkForward.windows[${g}].trainStartIndex`),S=Te(h.trainEndIndex,`walkForward.windows[${g}].trainEndIndex`),_=Te(h.evalStartIndex,`walkForward.windows[${g}].evalStartIndex`),x=Te(h.evalEndIndex,`walkForward.windows[${g}].evalEndIndex`);if(w!==0||S>=_||_>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=oi({metrics:h.metrics,tradeCount:h.metrics?.tradeCount},`walkForward.windows[${g}]`);if(O.tradeCount<1||O.netPnlUsd<=0||O.profitFactor<=1)throw new Error("passed walk-forward window metrics do not pass");if(Lt(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/l.length;if(!Lt(d.passRate)||Math.abs(d.passRate-m)>Number.EPSILON||m<.6)throw new Error("walk-forward passRate contradicts concrete windows or is below live threshold")}function Ja(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=Ya(e),n=St({id:e.id,...r});if(JSON.stringify(St(e))!==JSON.stringify(n))throw new Error("evidence artifact contains fields unbound from its deterministic identity");let o=Qa(e);if(e.id!==o)throw new Error("evidence.id does not match its deterministic artifact facts digest");return e.status==="pass_live_eligible"&&Th(e,t),e}function si({strategy:e,bars:t,backtestOptions:r={},trainFraction:n=.7,walkForwardWindows:o=3,minTrades:i=10}={}){let s=[];if(!Ve(e))throw new TypeError("strategy must be a plain object");if(!Array.isArray(t))throw new TypeError("bars must be an array");if(!Ve(r))throw new TypeError("backtestOptions must be a plain object");if(!Lt(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=me(e),c=Ut(a),u=mr(t),d=t.length,l=(B=[],H={})=>Xa({status:"fail",strategy:a,sHash:c,barsHash:u,split:H.split||{trainStartIndex:0,trainEndIndex:-1,trainBarCount:0,holdoutStartIndex:0,holdoutEndIndex:-1,holdoutBarCount:0,trainFraction:n},train:H.train||null,holdout:H.holdout||null,walkForward:H.walkForward||{windows:[],passRate:0},flags:[...s,...B]});if(d<10)return l([{type:"insufficient_bars",message:"need at least 10 bars for evidence"}]);let p=Math.floor(d*n),f=p,m=d-f;if(p<5||m<3)return l([{type:"invalid_windowing",message:"train/holdout split too small",trainCount:p,holdoutCount:m}]);let g=t.slice(0,p),h=t.slice(f),w,S;try{w=ct(a,g,r),S=ct(a,h,r)}catch(B){return l([{type:"backtest_error",message:String(B.message||B)}])}let _={metrics:ni(w),costs:Ka(w),tradeCount:w.metrics.tradeCount},x={metrics:ni(S),costs:Ka(S),tradeCount:S.metrics.tradeCount},O={trainStartIndex:0,trainEndIndex:p-1,trainBarCount:p,holdoutStartIndex:f,holdoutEndIndex:d-1,holdoutBarCount:m,trainFraction:n},A=[],b=Math.floor(d/(o+1));if(b<3)s.push({type:"invalid_windowing",message:"walk-forward window size too small",wfSize:b});else for(let B=0;B<o;B++){let H=b*(B+1),ie=H,K=Math.min(d,ie+b);if(K-ie<3||H<3){A.push({index:B,trainStartIndex:0,trainEndIndex:H-1,evalStartIndex:ie,evalEndIndex:K-1,passed:!1,reason:"window_too_small",metrics:null});continue}let je=t.slice(ie,K),Jr;try{Jr=ct(a,je,r)}catch{A.push({index:B,trainStartIndex:0,trainEndIndex:H-1,evalStartIndex:ie,evalEndIndex:K-1,passed:!1,reason:"backtest_error",metrics:null});continue}let Zr=ni(Jr),en=Ch(Zr,a.risk,i);A.push({index:B,trainStartIndex:0,trainEndIndex:H-1,evalStartIndex:ie,evalEndIndex:K-1,passed:en,reason:en?"pass":"fail_metrics",metrics:Zr})}let y=A.filter(B=>B.passed).length,k=A.length===0?0:y/A.length,E={windows:A,passRate:k,windowsRun:A.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=_h(x.costs),I=Oh(S);I>0&&R>I&&s.push({type:"costs_exceed_gross",message:"holdout costs exceed gross gains"});let $=s.some(B=>["insufficient_bars","invalid_windowing","absent_oos_trades","holdout_loss","no_trades","severe_oos_collapse","backtest_error"].includes(B.type)),L=s.some(B=>B.type==="overfit"),M="fail";return x.metrics.tradeCount>=i&&x.metrics.netPnlUsd>0&&x.metrics.profitFactor>1&&x.metrics.maxDrawdownPct<=a.risk.maxDailyLossPct&&k>=.6&&!(I>0&&R>I)&&!L&&!s.some(B=>B.type==="severe_oos_collapse"||B.type==="invalid_windowing")?M="pass_live_eligible":!$&&x.metrics.tradeCount>0&&_.metrics.tradeCount>0&&Number.isFinite(x.metrics.netPnlUsd)?(M="pass_paper_only",x.metrics.tradeCount<i&&s.push({type:"undersampled",message:"holdout trades below minTrades"})):L&&x.metrics.tradeCount>0&&_.metrics.netPnlUsd>0?M="fail":x.metrics.tradeCount>0&&_.metrics.tradeCount>0&&!$?M="pass_paper_only":M="fail",x.metrics.netPnlUsd<0&&(M=M==="pass_live_eligible"?"fail":M==="pass_paper_only"?"pass_paper_only":"fail",M="fail"),Xa({status:M,strategy:a,sHash:c,barsHash:u,split:O,train:_,holdout:x,walkForward:E,flags:s})}function Xa({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:kt,barsHash:n,split:o,train:i,holdout:s,walkForward:a,flags:c};return u.id=Qa(u),ii(St(JSON.parse(JSON.stringify(u))))}var Ih,ai=v(()=>{At();Et();cn();Ih=Object.freeze(["fail","pass_paper_only","pass_live_eligible"])});import{createHash as Nh,createHmac as Rh,timingSafeEqual as WA}from"node:crypto";function ci(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(ci).join(",")}]`:`{${Object.keys(e).sort().map(r=>`${JSON.stringify(r)}:${ci(e[r])}`).join(",")}}`}function Za(e){let t=String(e?.ORACLE_STAMP_HMAC_SECRET||"").trim();return t.length>=16?t:""}function ec(e=process.env){return Za(process.env)||Za(e)}function Lh(e){let{prepareHash:t,prepareMac:r,note:n,...o}=e||{};return o}function Uh(e){let t=Lh(e);return Nh("sha256").update(ci(t)).digest("hex")}function Bh(e,t=ec()){return t?Rh("sha256",t).update(String(e)).digest("hex"):""}function J(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+Ph:Number(i),d=u-c;if(!Number.isSafeInteger(c)||!Number.isSafeInteger(u)||d<=0||d>qh)throw new Error("stampPrepared: bounded preparedAt/expiresAt required");let p={...a,preparedAt:c,expiresAt:u,prepareVersion:$h},f=Uh(p),m=ec(n),g=m?Bh(f,m):void 0,h={...p,prepareHash:f};return g&&(h.prepareMac=g),h}var $h,Ph,qh,ge=v(()=>{$h=2,Ph=300*1e3,qh=(()=>{let e=Number(process.env.ORACLE_PREPARE_HARD_MAX_AGE_MS);return Number.isFinite(e)&&e>0?e:1800*1e3})()});function hr(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function Dh(e){return String(e).toLowerCase().replace(/[^a-z0-9]/g,"")}function li(e,t="value"){if(Array.isArray(e)){e.forEach((r,n)=>li(r,`${t}[${n}]`));return}if(hr(e))for(let[r,n]of Object.entries(e)){let o=Dh(r);if(Fh.some(i=>o.includes(i)))throw new Error(`handoff: forbidden secret-like field at ${t}.${r}`);li(n,`${t}.${r}`)}}function ui(e){return typeof e=="number"&&Number.isFinite(e)&&e>0}function tc({strategy:e,evidence:t,shadow:r,caps:n,nowMs:o=Date.now(),env:i=process.env}={}){if(li({strategy:e,evidence:t,shadow:r,caps:n},"handoff"),!hr(e))throw new Error("handoff: strategy required");if(!hr(t))throw new Error("handoff: evidence required");if(!hr(r))throw new Error("handoff: shadow required");if(!hr(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=me(e,{nowMs:o}),a=he(s);if(Ja(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(!ui(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(!ui(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(!ui(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 d={perStrategyNotionalUsd:n.perStrategyNotionalUsd,maxLeverage:n.maxLeverage,dailyLossCapUsd:n.dailyLossCapUsd,chainAllowlist:[...n.chainAllowlist],assetAllowlist:[...n.assetAllowlist],expiresAt:n.expiresAt,killSwitchRequired:!0},l={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:yr,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:d},requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,executionReady:!1};return J(l,{provider:"hl-strategy",kind:"strategy-live-handoff",env:i})}var Fh,rc=v(()=>{At();ai();Et();ge();Fh=["privatekey","secretkey","seed","mnemonic","passphrase","password","keystore","keymaterial","apikey","authtoken","accesstoken","refreshtoken","credential","bearer","signature","authorization","xprv","xpriv","wif"]});function Bt(e,t){let r=Number(e);if(!Number.isFinite(r))throw new TypeError(`${t} must be finite`);return r}function Ft(e,t){if(!Number.isSafeInteger(e)||e<0)throw new TypeError(`${t} must be a non-negative safe integer`);return e}function gr(e){if(Array.isArray(e))for(let t of e)gr(t);else if(e&&typeof e=="object")for(let t of Object.values(e))gr(t);return Object.freeze(e)}function jh(e){let t=Mh[e];if(!t)throw new TypeError(`unsupported strategy interval: ${e}`);return t}function Hh(e,{endTime:t=Number.MAX_SAFE_INTEGER}={}){if(!Array.isArray(e))throw new TypeError("Hyperliquid candles must be an array");Ft(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=Ft(Number(o.t),`candles[${n}].t`);if(Ft(Number(o.T),`candles[${n}].T`)>t)continue;let a={t:i,o:Bt(o.o,`candles[${n}].o`),h:Bt(o.h,`candles[${n}].h`),l:Bt(o.l,`candles[${n}].l`),c:Bt(o.c,`candles[${n}].c`),v:Bt(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 gr([...r.values()].sort((n,o)=>n.t-o.t))}function zh(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=Ft(Number(o.time),`funding[${n}].time`);i>t||r.set(i,{time:i,fundingRate:Bt(o.fundingRate,`funding[${n}].fundingRate`)})}return[...r.values()].sort((n,o)=>n.time-o.time)}async function Vh({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 Ga({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 d of c){let l=Number(d?.time);Number.isSafeInteger(l)&&l>u&&(u=l)}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 zh(o,r)}function Wh(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 nc(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=jh(n);if(e.endTime==null)throw new TypeError("endTime is required for deterministic history");let i=Ft(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):Ft(e.startTime,"startTime");if(a>=i)throw new TypeError("startTime must be before endTime");let[c,u]=await Promise.all([Wa({coin:r,interval:n,startTime:a,endTime:i},t),Vh({coin:r,startTime:a,endTime:i},t)]),d=Hh(c,{endTime:i}),l=gr(Wh(d,u,o));return gr({coin:r,interval:n,range:{startTime:a,endTime:i},bars:l})}var Mh,oc=v(()=>{ri();Mh=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 Xh(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))Kh.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"||!Gh.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 Yh(e={}){let t=await Va(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 Gh,Kh,ic,sc=v(()=>{ri();rc();oc();Gh=new Set(["1m","3m","5m","15m","30m","1h","2h","4h","8h","12h","1d"]),Kh=new Set(["coin","interval"]);ic=Object.freeze({id:"hyperliquid",validateMarket:Xh,fetchBars:nc,listMarkets:Yh,prepareIntent(e){return tc(e)}})});function Jh(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 Qh.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 di(e){return typeof e!="string"?null:Zh.get(e)??null}function pi(e){let t=di(e);if(!t)throw new Error(`unknown strategy venue: ${String(e)}`);return t}var Qh,ac,Zh,s1,fi=v(()=>{sc();Qh=Object.freeze(["id","validateMarket","prepareIntent"]);ac=[ic].map(Jh),Zh=new Map(ac.map(e=>[e.id,e])),s1=Object.freeze([...ac])});import{createHash as e0}from"node:crypto";function Ie(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function ne(e){return typeof e=="number"&&Number.isFinite(e)}function hc(e){return Number.isInteger(e)&&e>0}function bi(e){if(e==null||typeof e!="object"||Object.isFrozen(e))return e;if(Array.isArray(e)){for(let t of e)bi(t);return Object.freeze(e)}for(let t of Object.keys(e))bi(e[t]);return Object.freeze(e)}function wi(e){if(Array.isArray(e))return e.map(wi);if(e!=null&&typeof e=="object"){let t={};for(let r of Object.keys(e).sort())t[r]=wi(e[r]);return t}return e}function C(e,t,r){e.push({path:t,message:r})}function ut(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 wc(e,t,r,n){if(!ne(e)||!ne(t)||!ne(r)||!ne(n)||n<=0||e<t||e>r)return!1;let o=(e-t)/n;if(!Number.isFinite(o))return!1;let i=Math.round(o);return Math.abs(o-i)<=1e-9}function gi(e,t,r,n){if(Ie(e)){if(ut(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!Ie(o)||![o.value,o.min,o.max,o.step].every(hc)?(C(n,`${t}.param`,"referenced period parameter value min max and step must be positive integers"),null):{param:e.param}}return hc(e)?e:(C(n,t,"must be a positive integer or {param}"),null)}function yc(e,t,r,n){return Ie(e)?(ut(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)):ne(e)?e:(C(n,t,"must be a finite number or {param}"),null)}function un(e){switch(e.type){case"input":case"constant":return[];case"indicator":return e.input?[e.input]:[];case"compare":case"cross":return[e.left,e.right].filter(Boolean);case"logic":return Array.isArray(e.inputs)?[...e.inputs]:[];default:return[]}}function u0(e){let t=new Map,r=n=>{let o=t.get(n)||0;if(o===1)return!0;if(o===2)return!1;t.set(n,1);let i=e.get(n);if(i){for(let s of un(i))if(e.has(s)&&r(s))return!0}return t.set(n,2),!1};for(let n of e.keys())if(r(n))return!0;return!1}function l0(e,t){if(!Ie(e))return C(t,"parameters","must be a plain object"),null;let r=Object.keys(e);if(r.length>pc)return C(t,"parameters",`too many parameters (max ${pc})`),null;let n={};for(let o of r){if(!gc.test(o)){C(t,`parameters.${o}`,"parameter name is malformed");continue}let i=e[o],s=`parameters.${o}`;if(!Ie(i)){C(t,s,"must be a plain object");continue}ut(i,uc,s,t);for(let l of uc)l in i||C(t,`${s}.${l}`,"required field is missing");let{value:a,min:c,max:u,step:d}=i;ne(c)||C(t,`${s}.min`,"must be a finite number"),ne(u)||C(t,`${s}.max`,"must be a finite number"),(!ne(d)||d<=0)&&C(t,`${s}.step`,"must be a positive finite number"),ne(a)||C(t,`${s}.value`,"must be a finite number"),ne(c)&&ne(u)&&c>u&&C(t,`${s}.min`,"min must be <= max"),ne(a)&&ne(c)&&ne(u)&&ne(d)&&d>0&&(wc(a,c,u,d)||C(t,`${s}.value`,"value must lie on the declared min/max/step grid")),n[o]={value:a,min:c,max:u,step:d}}return n}function d0(e,t,r,n){let o=`nodes.${t}`;if(!Ie(e))return C(n,o,"must be a plain object"),null;if(typeof e.type!="string"||!dc[e.type])return C(n,`${o}.type`,"unknown or missing node type"),ut(e,c0,o,n),null;switch(ut(e,dc[e.type],o,n),(typeof e.id!="string"||!bc.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"||!t0.has(e.field))&&C(n,`${o}.field`,"must be one of open|high|low|close|volume|fundingRate|openInterest"),{id:e.id,type:"input",field:e.field};case"constant":{let i=yc(e.value,`${o}.value`,r,n);return{id:e.id,type:"constant",value:i}}case"indicator":{(typeof e.indicator!="string"||!r0.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=gi(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=gi(e.period,`${o}.period`,r,n);a!=null&&(s.period=a)}if(i==="macd"){for(let a of["fastPeriod","slowPeriod","signalPeriod"])if(!(a in e))C(n,`${o}.${a}`,"required field is missing");else{let c=gi(e[a],`${o}.${a}`,r,n);c!=null&&(s[a]=c)}"output"in e?s0.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=yc(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?a0.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"||!n0.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"||!o0.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"||!i0.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 p0(e,t,r){if(!Ie(e))return C(t,"risk","must be a plain object"),null;ut(e,lc,"risk",t);for(let p of lc)(!(p in e)||e[p]==null)&&C(t,`risk.${p}`,"required field is missing");let n={},o=e.maxLeverage;!ne(o)||o<=0||o>50?C(t,"risk.maxLeverage","must be a number > 0 and <= 50"):n.maxLeverage=o;let i=e.maxNotionalUsd;!ne(i)||i<=0?C(t,"risk.maxNotionalUsd","must be a number > 0"):n.maxNotionalUsd=i;let s=e.positionSizePct;!ne(s)||s<=0||s>100?C(t,"risk.positionSizePct","must be a number > 0 and <= 100"):n.positionSizePct=s;let a=e.stopLossPct;!ne(a)||a<=0||a>100?C(t,"risk.stopLossPct","must be a number > 0 and <= 100"):n.stopLossPct=a;let c=e.takeProfitPct;!ne(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 d=e.maxDailyLossPct;!ne(d)||d<=0||d>100?C(t,"risk.maxDailyLossPct","must be a number > 0 and <= 100"):n.maxDailyLossPct=d;let l=e.expiresAt;return!Number.isInteger(l)||l<=0?C(t,"risk.expiresAt","must be an integer epoch milliseconds > 0"):(r.nowMs!==void 0&&(Number.isInteger(r.nowMs)?l<=r.nowMs&&C(t,"risk.expiresAt","must be strictly greater than nowMs"):C(t,"nowMs","must be an integer epoch milliseconds")),n.expiresAt=l),n}function xi(e,t={}){let r=[];if(!Ie(e))return C(r,"","strategy must be a plain object"),{ok:!1,errors:r,strategy:null};ut(e,cc,"",r);for(let l of cc)(!(l in e)||e[l]==null)&&C(r,l,"required field is missing");e.version!==mi&&C(r,"version",`must be ${mi}`),(typeof e.id!="string"||!gc.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>mc)&&C(r,"name",`must be a non-empty string max ${mc}`);let n=di(e.venue);n||C(r,"venue",`unknown strategy venue "${String(e.venue)}"`);let o=null;if(!n)Ie(e.market)||C(r,"market","must be a plain object");else{let l=n.validateMarket(e.market);if(!l||typeof l.ok!="boolean"||!Array.isArray(l.errors))C(r,"market",`venue ${n.id} returned an invalid market validation result`);else if(l.ok)o=l.market;else for(let p of l.errors)C(r,p.path,p.message)}let i=l0(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>fc)C(r,"nodes",`too many nodes (max ${fc})`);else{s=[];for(let l=0;l<e.nodes.length;l++){let p=d0(e.nodes[l],l,i||{},r);p&&(typeof p.id=="string"&&bc.test(p.id)&&(a.has(p.id)?C(r,`nodes.${l}.id`,`duplicate node id "${p.id}"`):a.set(p.id,p)),s.push(p))}for(let l=0;l<s.length;l++){let p=s[l],f=`nodes.${l}`;for(let m of un(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 un(p)){let g=a.get(m);g&&hi.has(g.type)&&C(r,f,`node ref "${m}" must be numeric`)}if(p.type==="logic")for(let m of un(p)){let g=a.get(m);g&&!hi.has(g.type)&&C(r,f,`node ref "${m}" must be boolean`)}}u0(a)&&C(r,"nodes","graph contains a cycle")}let c=null;if(!Ie(e.rules))C(r,"rules","must be a plain object");else{ut(e.rules,yi,"rules",r);for(let l of yi)l in e.rules||C(r,`rules.${l}`,"required field is missing");c={};for(let l of yi){let p=e.rules[l];if(p===null){c[l]=null;continue}if(typeof p!="string"||!p){C(r,`rules.${l}`,"must be a node id or null"),c[l]=p;continue}if(!a.has(p)){C(r,`rules.${l}`,`unknown node ref "${p}"`),c[l]=p;continue}let f=a.get(p);hi.has(f.type)||C(r,`rules.${l}`,`rule must reference a boolean node, not ${f.type}`),c[l]=p}}let u=p0(e.risk,r,t);if(r.length)return{ok:!1,errors:r,strategy:null};let d=bi({version:mi,id:e.id,name:e.name,venue:n.id,market:o,parameters:i,nodes:s,rules:c,risk:u});return{ok:!0,errors:[],strategy:d}}function me(e,t={}){let r=xi(e,t);if(!r.ok)throw new Dt(r.errors);return r.strategy}function f0(e){let t=me(e);return JSON.stringify(wi(t))}function Ut(e){let t=f0(e);return e0("sha256").update(t,"utf8").digest("hex")}function br(e,t){if(!Ie(e))throw new Dt([{path:"",message:"strategy must be a plain object"}]);if(!Ie(t))throw new Dt([{path:"overrides",message:"must be a plain object"}]);let r=me(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(!ne(s)){C(o,i,"override must be a finite number");continue}if(!wc(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 Dt(o);return me({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 mi,gc,bc,t0,r0,n0,o0,i0,s0,a0,hi,cc,uc,yi,lc,c0,dc,pc,fc,mc,Dt,Et=v(()=>{fi();mi=1,gc=/^[a-z0-9][a-z0-9._-]{0,63}$/,bc=/^[A-Za-z0-9][A-Za-z0-9._-]{0,63}$/,t0=new Set(["open","high","low","close","volume","fundingRate","openInterest"]),r0=new Set(["sma","ema","rsi","macd","bollinger","atr"]),n0=new Set(["gt","gte","lt","lte","eq"]),o0=new Set(["and","or","not"]),i0=new Set(["above","below"]),s0=new Set(["line","signal","histogram"]),a0=new Set(["upper","middle","lower"]),hi=new Set(["compare","logic","cross"]),cc=new Set(["version","id","name","venue","market","parameters","nodes","rules","risk"]),uc=new Set(["value","min","max","step"]),yi=new Set(["entryLong","entryShort","exitLong","exitShort"]),lc=new Set(["maxLeverage","maxNotionalUsd","positionSizePct","stopLossPct","takeProfitPct","cooldownBars","maxDailyLossPct","expiresAt"]),c0=new Set(["id","type"]),dc={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"])},pc=16,fc=128,mc=100,Dt=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 wr(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 lt(e){if(!Number.isInteger(e)||e<=0)throw new TypeError("period must be a positive integer")}function m0(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 Sc(e,t){wr(e),lt(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 ln(e,t){wr(e),lt(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 Ec(e,t){wr(e),lt(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]=xc(i,s);for(let a=t+1;a<e.length;a++){let c=e[a]-e[a-1],u=c>0?c:0,d=c<0?-c:0;i=(i*(t-1)+u)/t,s=(s*(t-1)+d)/t,r[a]=xc(i,s)}return r}function xc(e,t){return e===0&&t===0?50:t===0?100:e===0?0:100-100/(1+e/t)}function kc(e,t={}){wr(e);let r=t.fastPeriod,n=t.slowPeriod,o=t.signalPeriod;if(lt(r),lt(n),lt(o),r>=n)throw new TypeError("fastPeriod must be < slowPeriod");let i=ln(e,r),s=ln(e,n),a=new Array(e.length).fill(null);for(let l=0;l<e.length;l++)i[l]!=null&&s[l]!=null&&(a[l]=i[l]-s[l]);let c=new Array(e.length).fill(null),u=new Array(e.length).fill(null),d=[];for(let l=0;l<a.length;l++)a[l]!=null&&d.push(l);if(d.length>=o){let l=0;for(let g=0;g<o;g++)l+=a[d[g]];let p=l/o,f=d[o-1];c[f]=p,u[f]=a[f]-p;let m=2/(o+1);for(let g=o;g<d.length;g++){let h=d[g];p=m*a[h]+(1-m)*p,c[h]=p,u[h]=a[h]-p}}return{line:a,signal:c,histogram:u}}function Ac(e,t={}){wr(e);let r=t.period,n=t.stdDev;if(lt(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 d=e[u];if(a+=d,c+=d*d,u>=r){let l=e[u-r];a-=l,c-=l*l}if(u>=r-1){let l=a/r,p=c/r-l*l;p<0&&p>-1e-12&&(p=0);let f=Math.sqrt(p);o[u]=l,i[u]=l+n*f,s[u]=l-n*f}}return{upper:i,middle:o,lower:s}}function vc(e,t){m0(e),lt(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 Ic=v(()=>{});import{createHash as h0}from"node:crypto";var Si,y0,g0,b0,_c,Oc=v(()=>{Si=2,y0="93f9c998260e73756c13871dc1a84dd6cdb26ec6113bd1941f023519939db440",g0="68f5b412a9975f04024cf9b9b6209b4bccedd52f176e95f34f786b3f53479c6a",b0="f197a38ff1c0f4ebe13326db8cbb8167ea3dd5d62e6033fe97c2fee8d23d96b5",_c=h0("sha256").update(JSON.stringify({version:Si,compilerSourceHash:y0,indicatorsSourceHash:g0,schemaSourceHash:b0})).digest("hex")});function Ne(e){return typeof e=="number"&&Number.isFinite(e)}function S0(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 Mt(e,t){return e!=null&&typeof e=="object"&&"param"in e?t[e.param].value:e}function E0(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:d,v:l}=i;if(!Ne(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",d],["v",l]])if(!Ne(f))throw new TypeError(`bars[${o}].${p} must be a finite number`);for(let[p,f]of[["o",a],["h",c],["l",u],["c",d]])if(!(f>0))throw new TypeError(`bars[${o}].${p} price must be positive`);if(l<0)throw new TypeError(`bars[${o}].v volume must be non-negative`);if(c<Math.max(a,d,u))throw new TypeError(`bars[${o}] high must be >= max(open, close, low)`);if(u>Math.min(a,d,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!==x0[r])throw new TypeError(`bars t must match ${r} cadence`)}if(n=s,"fundingRate"in i&&i.fundingRate!=null&&!Ne(i.fundingRate))throw new TypeError(`bars[${o}].fundingRate must be finite when present`);if("openInterest"in i&&i.openInterest!=null){if(!Ne(i.openInterest))throw new TypeError(`bars[${o}].openInterest must be finite when present`);if(i.openInterest<0)throw new TypeError(`bars[${o}].openInterest must be non-negative`)}}}function vt(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=w0[s.field];a=new Array(o+1);for(let u=0;u<=o;u++){let d=n[u][c];a[u]=d===void 0?null:d}break}case"constant":{let c=Mt(s.value,r);a=new Array(o+1).fill(c);break}case"indicator":{let c=s.period!=null?Mt(s.period,r):void 0;if(s.indicator==="atr"){let l=[];for(let p=0;p<=o;p++){let f=n[p];l.push({o:f.o,h:f.h,l:f.l,c:f.c})}a=vc(l,c);break}let d=vt(s.input,t,r,n,o,i).map((l,p)=>{if(l==null||!Ne(l))throw new TypeError(`indicator input ${s.input} has non-finite value at ${p}`);return l});if(s.indicator==="sma")a=Sc(d,c);else if(s.indicator==="ema")a=ln(d,c);else if(s.indicator==="rsi")a=Ec(d,c);else if(s.indicator==="macd")a=kc(d,{fastPeriod:Mt(s.fastPeriod,r),slowPeriod:Mt(s.slowPeriod,r),signalPeriod:Mt(s.signalPeriod,r)})[s.output];else if(s.indicator==="bollinger")a=Ac(d,{period:c,stdDev:Mt(s.stdDev,r)})[s.output];else throw new Error(`unsupported indicator ${s.indicator}`);break}case"compare":{let c=vt(s.left,t,r,n,o,i),u=vt(s.right,t,r,n,o,i);a=new Array(o+1);for(let d=0;d<=o;d++){let l=c[d],p=u[d];if(l==null||p==null||!Ne(l)||!Ne(p)){a[d]=!1;continue}switch(s.op){case"gt":a[d]=l>p;break;case"gte":a[d]=l>=p;break;case"lt":a[d]=l<p;break;case"lte":a[d]=l<=p;break;case"eq":a[d]=l===p;break;default:a[d]=!1}}break}case"logic":{let c=s.inputs.map(u=>vt(u,t,r,n,o,i));a=new Array(o+1);for(let u=0;u<=o;u++)if(s.op==="not"){let d=c[0][u];a[u]=d===!0?!1:d===!1}else if(s.op==="and"){let d=!0;for(let l of c)if(l[u]!==!0){d=!1;break}a[u]=d}else if(s.op==="or"){let d=!1;for(let l of c)if(l[u]===!0){d=!0;break}a[u]=d}else a[u]=!1;break}case"cross":{let c=vt(s.left,t,r,n,o,i),u=vt(s.right,t,r,n,o,i);a=new Array(o+1),a[0]=!1;for(let d=1;d<=o;d++){let l=c[d-1],p=u[d-1],f=c[d],m=u[d];if(l==null||p==null||f==null||m==null||!Ne(l)||!Ne(p)||!Ne(f)||!Ne(m)){a[d]=!1;continue}s.direction==="above"?a[d]=l<=p&&f>m:a[d]=l>=p&&f<m}break}default:throw new Error(`unknown node type ${s.type}`)}return i.set(e,a),a}function he(e,t={}){let r=me(e);t&&Object.keys(t).length&&(r=br(r,t));let n=new Map(r.nodes.map(f=>[f.id,f])),o=Object.freeze(S0(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=Ut(r);function u(f,m){let g={};for(let w of o){let S=f.get(w);g[w]=S[m]}let h=w=>w!=null&&g[w]===!0;return{values:g,signals:{entryLong:h(r.rules.entryLong),entryShort:h(r.rules.entryShort),exitLong:h(r.rules.exitLong),exitShort:h(r.rules.exitShort)}}}function d(f,m){E0(f,m,r.market.interval);let g=new Map;for(let h of o)vt(h,n,i,f,m,g);return g}function l(f,m){return u(d(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,g=d(f,m);return Object.freeze(f.map((h,w)=>Object.freeze(u(g,w))))}return Object.freeze({strategy:r,strategyHash:c,compilerVersion:yr,compilerHash:kt,requiredSeries:a,nodeOrder:o,evaluate:l,evaluateAll:p})}var yr,kt,w0,x0,At=v(()=>{Et();Ic();Oc();yr=Si,kt=_c,w0=Object.freeze({open:"o",high:"h",low:"l",close:"c",volume:"v",fundingRate:"fundingRate",openInterest:"openInterest"}),x0=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 k0}from"node:crypto";function v0(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function We(e){return typeof e=="number"&&Number.isFinite(e)}function Ei(e){if(e==null||typeof e!="object"||Object.isFrozen(e))return e;if(Array.isArray(e)){for(let t of e)Ei(t);return Object.freeze(e)}for(let t of Object.keys(e))Ei(e[t]);return Object.freeze(e)}function dn(e){if(Array.isArray(e))return e.map(dn);if(e!=null&&typeof e=="object"){let t={};for(let r of Object.keys(e).sort())t[r]=dn(e[r]);return t}return e}function ki(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)=>ki(r,`${t}[${n}]`));return}for(let[r,n]of Object.entries(e))ki(n,`${t}.${r}`)}}function Tc(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(!We(o))throw new TypeError(`bars[${r}].t must be finite`);for(let[d,l]of[["o",i],["h",s],["l",a],["c",c],["v",u]])if(!We(l))throw new TypeError(`bars[${r}].${d} must be a finite number`);for(let[d,l]of[["o",i],["h",s],["l",a],["c",c]])if(!(l>0))throw new TypeError(`bars[${r}].${d} 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&&!We(n.fundingRate))throw new TypeError(`bars[${r}].fundingRate must be finite when present`);if("fundingPaymentRate"in n&&n.fundingPaymentRate!=null&&!We(n.fundingPaymentRate))throw new TypeError(`bars[${r}].fundingPaymentRate must be finite when present`);if("openInterest"in n&&n.openInterest!=null&&!We(n.openInterest))throw new TypeError(`bars[${r}].openInterest must be finite when present`)}}function mr(e){if(!Array.isArray(e))throw new TypeError("bars must be an array");return e.length>0&&Tc(e),k0("sha256").update(JSON.stringify(dn(e)),"utf8").digest("hex")}function I0(e){if(e==null&&(e={}),!v0(e))throw new TypeError("options must be a plain object");let t={...A0},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(!We(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(!We(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(!We(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 pn(e){return e/1e4}function _0(e,t,r){let n=pn(r);return t==="long"?e*(1+n):e*(1-n)}function O0(e,t,r){let n=pn(r);return t==="long"?e*(1-n):e*(1+n)}function Cc(e,t,r){let n=Math.abs(e)*pn(t),o=Math.abs(e)*pn(r);return{taker:n,builder:o,total:n+o}}function C0(e,t){let r=e*(t.positionSizePct/100)*t.maxLeverage;return Math.min(r,t.maxNotionalUsd)}function T0(e,t,r){let n=r/100;return t==="long"?e*(1-n):e*(1+n)}function N0(e,t,r){let n=r/100;return t==="long"?e*(1+n):e*(1-n)}function R0(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 $0(e,t,r){return t==="long"?e.l<=r:e.h>=r}function P0(e,t,r){return t==="long"?e.h>=r:e.l<=r}function q0(e,t,r){return t==="long"?e.l<=r:e.h>=r}function xr(e,t){for(let r of e.requiredSeries)if(["fundingRate","openInterest"].includes(r)&&!t.every(n=>We(n?.[r])))throw new Error(`strategy required series is absent: ${r}`)}function L0(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 U0(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 ct(e,t,r={}){let n=I0(r);Tc(t);let o=mr(t);n.nowMs!==void 0&&me(e,{nowMs:n.nowMs});let i=he(e);if(xr(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,d=n.takerFeeBps,l=n.builderFeeBps,p=n.initialEquityUsd,f=0,m=0,g=0,h=0,w=0,S=[],_=[],x=[],O=[],A=[],b=null,y=0,k=null,E=p,R=!1,I=0,$=0,L=[],M=new Array(t.length).fill(0);function X(T){L.push(T)}function B(T){let D=t[T].v*(n.maxVolumeParticipationPct/100);return Math.max(0,D-M[T])}function H(T){if(!b)return p;let D=b.side==="long"?(T-b.entryPrice)*b.qty:(b.entryPrice-T)*b.qty;return p+D}function ie(T,D,P){let ee=P.o,z=C0(p,s);if(!(z>0)||!(ee>0))return;let te=_0(ee,D,u),Q=z/te,se=B(T),ar=te*se;if(Q>se){x.push({kind:"entry",barIndex:T,time:P.t,side:D,requestedNotionalUsd:z,maxFillNotionalUsd:ar,reason:"volume_participation"});return}M[T]+=Q;let He=Math.abs(te-ee)*Q,Ze=Cc(z,d,l);p-=Ze.total,f+=Ze.taker,m+=Ze.builder,h+=He,w+=z,b={lifecycleEpoch:++$,side:D,entryBarIndex:T,entryReferencePrice:ee,entryPrice:te,qty:Q,notionalUsd:z,stop:T0(te,D,s.stopLossPct),take:N0(te,D,s.takeProfitPct),liq:R0(te,D,s.maxLeverage,d+l),entryFees:Ze.taker,entryBuilderFees:Ze.builder,entrySlippageUsd:He,fundingAccrued:0}}function K(T,D,P,ee){if(!b)return!1;let z=b.side,te=D,Q=te;P!=="liquidation"&&ee&&(Q=O0(te,z,u));let se=b.qty,ar=se*Q;if(P!=="liquidation"){let Ca=B(T),Cm=Q*Ca;if(se>Ca)return x.push({kind:"exit",barIndex:T,time:t[T].t,side:z,requestedNotionalUsd:ar,maxFillNotionalUsd:Cm,reason:"volume_participation",triggerReason:P}),!1;M[T]+=se}let He=Cc(ar,d,l),Ze=P==="liquidation"?0:Math.abs(Q-te)*se,cr,Mo;z==="long"?(cr=(te-b.entryReferencePrice)*se,Mo=(Q-b.entryPrice)*se):(cr=(b.entryReferencePrice-te)*se,Mo=(b.entryPrice-Q)*se),p+=Mo,p-=He.total,f+=He.taker,m+=He.builder,h+=Ze,w+=ar;let Om={side:z,entryBarIndex:b.entryBarIndex,entryTime:t[b.entryBarIndex].t,entryPrice:b.entryPrice,exitBarIndex:T,exitTime:t[T].t,exitPrice:Q,exitReason:P,qty:se,notionalUsd:b.notionalUsd,grossPnlUsd:cr,feesUsd:b.entryFees+He.taker,builderFeesUsd:b.entryBuilderFees+He.builder,fundingUsd:b.fundingAccrued,slippageUsd:b.entrySlippageUsd+Ze,netPnlUsd:cr-(b.entryFees+He.taker+b.entryBuilderFees+He.builder)-b.fundingAccrued-(b.entrySlippageUsd+Ze)};return S.push(Om),P==="liquidation"&&_.push({barIndex:T,time:t[T].t,side:z,price:Q,tradeIndex:S.length-1}),b=null,$+=1,I=T+1+(s.cooldownBars||0),!0}function je(T,D,P,ee){let z=T+1;if(z>=t.length)return;L.some(Q=>Q.kind==="exit"&&Q.side===D&&Q.fillBar===z&&Q.epoch===ee)||X({kind:"exit",side:D,signalBar:T,fillBar:z,reason:P,epoch:ee})}function Jr(T){let D=L.filter(P=>P.fillBar===T);for(let P=L.length-1;P>=0;P--)L[P].fillBar===T&&L.splice(P,1);D.sort((P,ee)=>{let z=te=>te.kind==="exit"?0:1;return z(P)-z(ee)});for(let P of D)if(P.kind==="exit"){if(!b||b.side!==P.side||b.lifecycleEpoch!==P.epoch)continue;let ee=P.reason||"rule";K(T,t[T].o,ee,!0)||je(T,P.side,ee,P.epoch)}else if(P.kind==="entry"){if(b||P.epoch!==$||T<I)continue;ie(T,P.side,t[T])}}function Zr(T){if(!b)return;let D=t[T],P=D.fundingPaymentRate;if(P==null||!We(P)||P===0)return;let ee=Math.abs(b.qty*D.c),z=P*ee;b.side==="long"?(p-=z,b.fundingAccrued+=z,g+=z):(p+=z,b.fundingAccrued-=z,g-=z)}function en(T){if(!b)return;let D=t[T].o;(b.side==="long"?D<=b.liq:D>=b.liq)&&K(T,D,"liquidation",!1)}function Aa(T){if(!b)return;let D=t[T],P=b.side,ee=q0(D,P,b.liq),z=$0(D,P,b.stop),te=P0(D,P,b.take),Q=se=>P==="long"?Math.min(se,D.o):Math.max(se,D.o);if(ee){K(T,Q(b.liq),"liquidation",!1);return}if(z&&te){K(T,Q(b.stop),"stop_loss",!0)||je(T,P,"stop_loss",b.lifecycleEpoch);return}if(z){K(T,Q(b.stop),"stop_loss",!0)||je(T,P,"stop_loss",b.lifecycleEpoch);return}te&&(K(T,b.take,"take_profit",!0)||je(T,P,"take_profit",b.lifecycleEpoch))}for(let T=0;T<t.length;T++){let D=Math.floor(t[T].t/864e5);D!==k&&(k=D,E=H(t[T].o),R=!1),en(T),Jr(T),Aa(T),Zr(T),!R&&H(t[T].c)<=E*(1-s.maxDailyLossPct/100)&&(R=!0,O.push({type:"daily_loss_limit",barIndex:T,time:t[T].t,message:"daily loss limit reached; new entries blocked for UTC day"}));let P=a[T].signals,ee=T+c;if(b)(b.side==="long"&&P.exitLong===!0||b.side==="short"&&P.exitShort===!0)&&ee<t.length&&(L.some(se=>se.kind==="exit"&&se.side===b.side&&se.fillBar===ee&&se.epoch===b.lifecycleEpoch)||X({kind:"exit",side:b.side,signalBar:T,fillBar:ee,reason:"rule",epoch:b.lifecycleEpoch}));else{let te=P.entryLong===!0,Q=P.entryShort===!0;te&&Q?O.push({type:"conflicting_entry_signals",barIndex:T,time:t[T].t,message:"conflicting entry signals; no position opened"}):!R&&(te||Q)&&ee<t.length&&T>=I&&X({kind:"entry",side:te?"long":"short",signalBar:T,fillBar:ee,epoch:$})}let z=p;b&&(y+=1,z=H(t[T].c)),A.push({barIndex:T,time:t[T].t,equity:z,positionSide:b?b.side:null})}let va=null;if(b){let T=t.length-1;if(K(T,t[T].c,"end_of_data",!0))A[T]={barIndex:T,time:t[T].t,equity:p,positionSide:null};else{let P=H(t[T].c);va={side:b.side,entryBarIndex:b.entryBarIndex,entryTime:t[b.entryBarIndex].t,entryPrice:b.entryPrice,qty:b.qty,notionalUsd:b.notionalUsd,markPrice:t[T].c,markedEquityUsd:P},O.push({type:"open_position_at_end",barIndex:T,time:t[T].t,message:"end-of-data exit missed; position remains open and marked"})}}let Ia=(b?H(t[t.length-1].c):p)-n.initialEquityUsd,Am=Ia/n.initialEquityUsd*100,_a=0,Uo=0,Bo=0;for(let T of S)T.netPnlUsd>0?(_a+=1,Uo+=T.netPnlUsd):T.netPnlUsd<0&&(Bo+=-T.netPnlUsd);let Fo=S.length,vm=Fo===0?0:_a/Fo,Do=0;Bo>0?Do=Uo/Bo:Uo>0&&(Do=1e12);let Im={netPnlUsd:Ia,netPnlPct:Am,maxDrawdownPct:U0(A),winRate:vm,profitFactor:Do,tradeCount:Fo,sharpe:L0(A),turnoverUsd:w,exposurePct:y/t.length*100},_m={initialEquityUsd:n.initialEquityUsd,takerFeeBps:n.takerFeeBps,builderFeeBps:n.builderFeeBps,slippageBps:n.slippageBps,latencyBars:n.latencyBars,maxVolumeParticipationPct:n.maxVolumeParticipationPct},Oa={barsHash:o,strategyHash:i.strategyHash,compilerHash:kt,compilerVersion:yr,config:_m,trades:S,equityCurve:A,metrics:Im,costs:{feesUsd:f,builderFeesUsd:m,fundingUsd:g,slippageUsd:h},liquidations:_,missedFills:x,openPositionAtEnd:va,flags:O};return ki(Oa),Ei(dn(Oa))}var A0,cn=v(()=>{At();Et();A0=Object.freeze({initialEquityUsd:1e4,takerFeeBps:3.5,builderFeeBps:2,slippageBps:2,latencyBars:1,maxVolumeParticipationPct:100})});import{createHash as B0}from"node:crypto";function W0(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function Ai(e){if(e==null||typeof e!="object"||Object.isFrozen(e))return e;if(Array.isArray(e)){for(let t of e)Ai(t);return Object.freeze(e)}for(let t of Object.keys(e))Ai(e[t]);return Object.freeze(e)}function G0(e){return String(e).trim().replace(/\s+/g," ")}function K0(e){let t=e.match(/\b(long|short)\b/i);return t?t[1].toLowerCase():null}function X0(e){for(let r of D0)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 Y0(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 F0.has(r)?r:null}function Q0(e){let t={...j0},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 J0(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 Z0(e){let t=B0("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 ey(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 ty(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 ry(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 ny(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,""):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 Nc(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 oy({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 d=a.direction==="above"?"below":"above";c.push({id:"crossRev",type:"cross",direction:d,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:Nc(a.fast),ema_right_period:Nc(a.slow)},nodes:c,rules:u,risk:{...n,expiresAt:o}}}function iy({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 sy({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 Rc(e,t={}){if(typeof e!="string")throw new ue("prompt must be a string");if(e.length>1e3)throw new ue("prompt length must be <= 1000");if(!W0(t))throw new ue("options must be a plain object");if(!Number.isInteger(t.nowMs))throw new ue("options.nowMs is required integer epoch ms");let r=t.nowMs,n=V0;if("expiresInMs"in t){if(!Number.isInteger(t.expiresInMs))throw new ue("expiresInMs must be an integer");if(n=t.expiresInMs,n<H0||n>z0)throw new ue("expiresInMs must be between 1h and 30d")}if(M0.test(e))throw new ue(`prompt appears to contain secrets and is rejected. ${jt}`);let o=G0(e);if(!o)throw new ue(`empty prompt. ${jt}`);if(J0(o))throw new ue(`duplicate interval or risk clause. ${jt}`);let i=K0(o),s=X0(o),a=Y0(o);if(!i||!s||!a)throw new ue(`could not parse side/coin/interval. ${jt}`);let c=Q0(o);if(!(c.maxLeverage>0)||c.maxLeverage>50)throw new ue("leverage out of range");if(!(c.positionSizePct>0)||c.positionSizePct>100)throw new ue("position size out of range");let u=r+n,d=Z0(o),l=`Draft ${s} ${i}`.slice(0,100),p=ey(o),f=ty(o),m=ry(o),g=[p,f,m].filter(Boolean);if(g.length!==1)throw new ue(`unsupported or ambiguous prompt. ${jt}`);if(!ny(o,g[0]))throw new ue(`unsupported or ambiguous prompt. ${jt}`);let h,w=g[0],S={side:i,coin:s,interval:a,risk:c,expiresAt:u,id:d,name:l,spec:w};w.kind==="ema_cross"?h=oy(S):w.kind==="rsi"?h=iy(S):h=sy(S);let _=xi(h,{nowMs:r});if(!_.ok)throw new ue(`draft failed validation: ${_.errors.map(x=>x.message).join("; ")}`);return Ai(me(h,{nowMs:r}))}var ue,F0,D0,M0,jt,j0,H0,z0,V0,$c=v(()=>{Et();ue=class extends Error{constructor(t){super(t),this.name="StrategyDraftError"}},F0=new Set(["1m","3m","5m","15m","30m","1h","2h","4h","8h","12h","1d"]),D0=new Set(["BTC","ETH","SOL","HYPE"]),M0=/\b(mnemonic|private\s*key|privkey|seed\s*phrase|seed\b|api[_-]?key|secret\s*key|wallet\s*key|passphrase)\b/i,jt="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]. 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.",j0=Object.freeze({maxLeverage:1,maxNotionalUsd:100,positionSizePct:5,stopLossPct:2,takeProfitPct:4,cooldownBars:1,maxDailyLossPct:3}),H0=36e5,z0=30*864e5,V0=864e5});import{createHash as ay}from"node:crypto";function Lc(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 Uc(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function Ii(e){if(e==null||typeof e!="object"||Object.isFrozen(e))return e;if(Array.isArray(e)){for(let t of e)Ii(t);return Object.freeze(e)}for(let t of Object.keys(e))Ii(e[t]);return Object.freeze(e)}function Sr(e){if(Array.isArray(e))return e.map(Sr);if(e!=null&&typeof e=="object"){let t={};for(let r of Object.keys(e).sort())t[r]=Sr(e[r]);return t}return e}function fn(e){return JSON.stringify(Sr(e))}function cy(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 uy(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=fn(n),s=fn(o);return i<s?-1:i>s?1:0}),r}function vi(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=fn(r),a=fn(o);return s<a}function Bc(e,t,r={}){if(!Uc(r))throw new TypeError("options must be a plain object");for(let x of Object.keys(r))if(Lc(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>Pc)throw new TypeError(`maxTrials must be an integer 1..${Pc}`);o=x}let i=r.objective??"netPnlUsd";if(!qc.has(i))throw new TypeError(`objective must be one of ${[...qc].join("|")}`);let s=r.backtestOptions??{};if(!Uc(s))throw new TypeError("backtestOptions must be a plain object");for(let x of Object.keys(s))if(Lc(x))throw new TypeError(`backtestOptions must not include holdout/test/oos key "${x}"`);let a=me(e),c=Object.keys(a.parameters).sort();if(c.length===0)throw new Error("optimizeStrategy requires at least one declared parameter");let u={},d=1;for(let x of c){let O=cy(a.parameters[x]);if(O.length===0)throw new Error(`parameter "${x}" produces an empty grid`);u[x]=O,d*=O.length}let l=uy(c,u);if(l.length===0)throw new Error("parameter grid is empty");let p=l.slice(0,o),f=[],m=null,g=null;for(let x of p){let O=br(a,x),A=ct(O,t,s);g==null&&(g=A.config);let b={netPnlUsd:A.metrics.netPnlUsd,netPnlPct:A.metrics.netPnlPct,maxDrawdownPct:A.metrics.maxDrawdownPct,winRate:A.metrics.winRate,profitFactor:A.metrics.profitFactor,tradeCount:A.metrics.tradeCount,sharpe:A.metrics.sharpe,turnoverUsd:A.metrics.turnoverUsd},y={parameters:{...x},metrics:b};f.push(y),(!m||vi(i,b,x,m.metrics,m.parameters))&&(m=y)}f.sort((x,O)=>vi(i,x.metrics,x.parameters,O.metrics,O.parameters)?-1:vi(i,O.metrics,O.parameters,x.metrics,x.parameters)?1:0);let h={...m.parameters},w=br(a,h),S={strategyHash:Ut(a),compilerHash:kt,trainBarsHash:mr(t),backtestConfig:g,objective:i,maxTrials:o,trialsRun:f.length,candidates:f,bestParameters:h,bestStrategy:w},_={id:ay("sha256").update(JSON.stringify(Sr(S)),"utf8").digest("hex"),...S};return Ii(Sr(JSON.parse(JSON.stringify(_))))}var Pc,qc,Fc=v(()=>{At();Et();cn();Pc=256,qc=new Set(["netPnlUsd","profitFactor","sharpe","maxDrawdownPct"])});import et from"node:fs";import mn from"node:path";function hn(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function Ge(e){return e==null?e:JSON.parse(JSON.stringify(e))}function dy(e){return String(e).toLowerCase().replace(/[^a-z0-9]/g,"")}function Ht(e,t="record"){if(Array.isArray(e)){e.forEach((r,n)=>Ht(r,`${t}[${n}]`));return}if(hn(e))for(let[r,n]of Object.entries(e)){let o=dy(r);if(ly.some(i=>o.includes(i)))throw new Error(`shadow-store: forbidden secret-like field at ${t}.${r}`);Ht(n,`${t}.${r}`)}}function py(e){if(typeof e!="string"||!e||!mn.isAbsolute(e))throw new Error("shadow-store: path must be an absolute path")}function Dc(e){let t;try{t=et.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 fy(){return{version:Oi,runners:[]}}function Mc(e,t){let r;try{r=JSON.parse(e)}catch{throw new Error("shadow-store: malformed JSON")}if(!hn(r))throw new Error("shadow-store: malformed JSON root");if(r.version!==Oi)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 Ht(r,mn.basename(t)),{version:Oi,runners:r.runners.map(n=>Ge(n))}}function jc(e,t){Ht(t,"store");let r=mn.dirname(e);et.mkdirSync(r,{recursive:!0,mode:448});let n=mn.join(r,`.shadow-store.${process.pid}.${Date.now()}.tmp`),o=`${JSON.stringify(t)}
4
+ `;try{et.writeFileSync(n,o,{mode:384,flag:"wx"}),et.renameSync(n,e);try{et.chmodSync(e,384)}catch{}}catch(i){try{et.unlinkSync(n)}catch{}throw i}}function Hc(e={}){let t=e.path;if(py(t),Dc(t),et.existsSync(t)?Mc(et.readFileSync(t,"utf8"),t):jc(t,fy()),_i.has(t))return _i.get(t);let r=!1,n=[];function o(){if(r)return;let m=n.shift();if(m){r=!0;try{let g=m.fn();r=!1,m.resolve(g),o()}catch(g){r=!1,m.reject(g),o()}}}function i(m){if(!r&&n.length===0){r=!0;try{return m()}finally{r=!1,queueMicrotask(o)}}return new Promise((g,h)=>{n.push({fn:m,resolve:g,reject:h}),queueMicrotask(o)})}function s(){return Dc(t),Mc(et.readFileSync(t,"utf8"),t)}function a(m){jc(t,m)}function c(m){if(!hn(m)||typeof m.id!="string"||!m.id)throw new Error("shadow-store: create requires record with string id");Ht(m,"record");let g=s();if(g.runners.some(w=>w.id===m.id))throw new Error(`shadow-store: runner id already exists: ${m.id}`);let h=Ge(m);return g.runners.push(h),a(g),Ge(h)}function u(m){let g=s().runners.find(h=>h.id===m);return g?Ge(g):null}function d(){return s().runners.map(m=>Ge(m))}function l(m,g){if(typeof g!="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 S=Ge(h.runners[w]),_=g(S);if(!hn(_)||_.id!==m)throw new Error("shadow-store: updater must return record with same id");return Ht(_,"record"),h.runners[w]=Ge(_),a(h),Ge(h.runners[w])}function p(m){let g=s(),h=g.runners.findIndex(S=>S.id===m);if(h<0)throw new Error(`shadow-store: runner not found: ${m}`);let w=Ge(g.runners[h]);return w.status!=="stopped"&&(w.status="stopped",g.runners[h]=w,a(g)),Ge(g.runners[h])}let f={create(m){return i(()=>c(m))},get(m){return u(m)},list(){return d()},update(m,g){return i(()=>l(m,g))},stop(m){return i(()=>p(m))}};return _i.set(t,f),f}var Oi,ly,_i,zc=v(()=>{Oi=1,ly=["privatekey","secretkey","seed","mnemonic","passphrase","password","keystore","keymaterial","apikey","authtoken","accesstoken","refreshtoken","credential","bearer","signature","authorization","xprv","xpriv","wif"];_i=new Map});import{createHash as Ni}from"node:crypto";function Ci(e){return e==null?e:JSON.parse(JSON.stringify(e))}function Ti(e){return Array.isArray(e)?e.map(Ti):e&&typeof e=="object"?Object.fromEntries(Object.keys(e).sort().map(t=>[t,Ti(e[t])])):e}function Wc(e){if(!e||typeof e!="object"||Array.isArray(e))throw new TypeError("shadow-runner: record must be an object");return Ni("sha256").update(JSON.stringify(Ti(e))).digest("hex")}function my(e,t,r,n,o){return Ni("sha256").update(`${e}|${t}|${r}|${n}|${o}`).digest("hex")}function hy(e,t,r,n){return Ni("sha256").update(`shadow|${e}|${t}|${r}|${n??""}`).digest("hex")}function yy(e){return e==="entryLong"||e==="exitShort"?"buy":e==="entryShort"||e==="exitLong"?"sell":e}function Vc(e){return e==="entryLong"||e==="entryShort"}function Ri({storePath:e,clock:t=Date.now}={}){if(typeof e!="string"||!e)throw new Error("shadow-runner: storePath required");let r=Hc({path:e});function n({strategy:c,evidenceId:u=null}={}){let d=he(c),l=u==null?null:String(u),p=r.list().filter(w=>w.status==="running"&&w.strategyHash===d.strategyHash&&w.compilerHash===d.compilerHash&&w.evidenceId===l).sort((w,S)=>w.createdAt-S.createdAt||w.id.localeCompare(S.id))[0];if(p)return Ci(p);let f=t(),m=hy(f,d.strategyHash,d.compilerHash,l),g=r.get(m);if(g)return Ci(g);let h={id:m,strategy:Ci(d.strategy),strategyHash:d.strategyHash,compilerHash:d.compilerHash,evidenceId:l,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:d=[1,4,12]}={}){if(!Array.isArray(u))throw new TypeError("shadow-runner: bars must be an array");return r.update(c,l=>{if(l.status!=="running")throw new Error("shadow-runner: runner is stopped");if(u.length===0)return l;let f=he(l.strategy).evaluateAll(u),m=new Map;for(let I=0;I<u.length;I++)m.set(u[I].t,I);let g=l.cursor,h=[];for(let I=0;I<u.length;I++){let $=u[I].t;(g==null||$>g)&&h.push(I)}if(h.length===0)return l;let w=new Map(l.intendedOrders.map(I=>[I.id,I])),S=new Set(l.fills.map(I=>I.orderId)),_=new Map(l.missedFills.map(I=>[I.orderId,I])),x=(I,$)=>`${I}|${$}`,O=new Map(l.markouts.map(I=>[x(I.orderId,I.horizon),I])),A=l.position?{...l.position}:null,b=Number.isInteger(l.cooldownBarsRemaining)?Math.max(0,l.cooldownBarsRemaining):0,y=Number.isFinite(l.cooldownStartT)?l.cooldownStartT:null;function k({action:I,signalBarT:$,signalIndex:L}){let M=yy(I),X=my(l.id,l.strategyHash,$,M,I);if(w.has(X))return w.get(X);let B=L+1,H=B<u.length,ie={id:X,action:I,type:I,side:M,signalBarT:$,fillBarT:H?u[B].t:null,status:H?"open":"missed"};return w.set(X,ie),l.intendedOrders.push(ie),ie}function E(I,$,L){if(S.has(I.id))return;let M={orderId:I.id,action:Vc(I.action)?"entry":"exit",side:I.side,price:$.o,barT:$.t,signalBarT:I.signalBarT,barIndex:L};if(l.fills.push(M),S.add(I.id),I.status="filled",I.fillBarT=$.t,_.has(I.id)&&(_.delete(I.id),l.missedFills=l.missedFills.filter(X=>X.orderId!==I.id)),Vc(I.action)){A={side:I.action==="entryLong"?"long":"short",entryOrderId:I.id,entryBarT:$.t,entryPrice:$.o,entryBarIndex:L};for(let X of d){let B=x(I.id,X);if(O.has(B))continue;let H={orderId:I.id,horizon:X,entryBarT:$.t,entryPrice:$.o,side:A.side,status:"pending",close:null,barT:null};O.set(B,H),l.markouts.push(H)}}else A=null,b=Number(l.strategy?.risk?.cooldownBars)||0,y=$.t}function R(I){if(S.has(I.id)||_.has(I.id))return;let $={orderId:I.id,action:I.action,side:I.side,signalBarT:I.signalBarT,status:"missed"};_.set(I.id,$),l.missedFills.push($),I.status="missed"}for(let I of l.intendedOrders){if(I.status==="filled"||S.has(I.id))continue;let $=m.get(I.signalBarT);if($==null)continue;let L=$+1;L<u.length&&(g==null||u[L].t>g)&&E(I,u[L],L)}for(let I of h){let $=u[I],L=f[I].signals,M=A,X=H=>{if(A||b>0&&(y==null||$.t>=y))return;let K=k({action:H,signalBarT:$.t,signalIndex:I}),je=I+1;je<u.length?E(K,u[je],je):R(K)},B=H=>{if(!A||A.side==="long"&&H!=="exitLong"||A.side==="short"&&H!=="exitShort")return;let ie=k({action:H,signalBarT:$.t,signalIndex:I}),K=I+1;K<u.length?E(ie,u[K],K):R(ie)};M?(L.exitLong&&B("exitLong"),L.exitShort&&B("exitShort")):L.entryLong&&L.entryShort||(L.entryLong&&X("entryLong"),L.entryShort&&X("entryShort")),b>0&&y!=null&&$.t>=y&&(b-=1,b===0&&(y=null)),l.cursor=$.t,l.lastProcessedBarIndex=I}for(let I of l.markouts){if(I.status!=="pending")continue;let $=l.fills.find(X=>X.orderId===I.orderId&&X.action==="entry");if(!$)continue;let L=m.get($.barT);if(L==null)continue;let M=L+I.horizon;if(M<u.length){I.close=u[M].c,I.barT=u[M].t,I.status="filled";let X=I.entryPrice;I.markout=I.side==="long"?(I.close-X)/X:(X-I.close)/X}}return l.position=A,l.cooldownBarsRemaining=b,l.cooldownStartT=y,l.updatedAt=t(),l})}return{start:n,step:a,list:i,get:o,stop:s}}var Gc=v(()=>{At();zc()});var Yc={};j(Yc,{runStrategyOperation:()=>Ay});import gy from"node:os";import by from"node:path";function Er(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function xy(e){return String(e).toLowerCase().replace(/[^a-z0-9]/g,"")}function Pi(e){if(Array.isArray(e)){for(let t of e)Pi(t);return}if(Er(e))for(let[t,r]of Object.entries(e)){if(wy.some(n=>xy(t).includes(n)))throw new Error(`strategy service: secret-like field "${t}" is forbidden`);Pi(r)}}function Sy(e){if(!Er(e))throw new TypeError("strategy input must be a plain object");return Pi(e),e}function Ey(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 $i(e,t,r,n){if(Array.isArray(t.bars))return t.bars;let o=pi(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 qi(e,t){let r=e.backtestOptions??{};if(!Er(r))throw new TypeError("backtestOptions must be a plain object");return{...r,nowMs:t}}function Kc(e,t,r,n,o={}){let i=e.evidenceOptions??{};if(!Er(i))throw new TypeError("evidenceOptions must be a plain object");return{...i,...o,strategy:t,bars:r,backtestOptions:qi(e,n)}}function Xc(){return by.join(gy.homedir(),".oracle","strategy-shadow.json")}function ky(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 Ay(e,t={},r={}){r.signal?.throwIfAborted?.();let n=Sy(t),o=Ey(n,r);if(e==="draft")return{strategy:Rc(n.prompt,{nowMs:o})};if(e==="validate"){let i=he(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=he(n.strategy),s=await $i(i.strategy,n,r,o);xr(i,s);let a=si(Kc(n,i.strategy,s,o));return e==="evidence"?a:{backtest:ct(i.strategy,s,qi(n,o)),evidence:a}}if(e==="optimize"){let i=he(n.strategy),s=await $i(i.strategy,n,r,o);xr(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 d=s.slice(0,Math.floor(s.length*u)),l=n.options??{};if(!Er(l))throw new TypeError("options must be a plain object");let p=Bc(i.strategy,d,{...l,...n.maxTrials==null?{}:{maxTrials:n.maxTrials},backtestOptions:qi(n,o)}),f=p.bestStrategy;return{strategy:f,optimization:p,evidence:si(Kc(n,f,s,o,{trainFraction:u}))}}if(e==="shadow"){let i=Ri({storePath:r.storePath??Xc(),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 $i(a.strategy,n,r,o);return xr(he(a.strategy),c),await i.step(n.id,c,n.stepOptions??{})}throw new Error(`unknown shadow action: ${s}`)}if(e==="prepare"){let i=he(n.strategy),s=pi(i.strategy.venue);if(typeof n.shadowId!="string"||!n.shadowId)throw new Error("strategy prepare requires a matching shadow runner id");let c=await Ri({storePath:r.storePath??Xc(),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??ky(i.strategy,o);return s.prepareIntent({strategy:i.strategy,evidence:n.evidence,shadow:{id:c.id,stateHash:Wc(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 wy,Qc=v(()=>{cn();At();ai();$c();Fc();Gc();fi();wy=["privatekey","secretkey","seed","mnemonic","passphrase","password","keystore","keymaterial","apikey","authtoken","accesstoken","refreshtoken","credential","bearer","signature","authorization","xprv","xpriv","wif"]});var lu={};j(lu,{DEFAULT_CROSS_CHAIN_SOURCES:()=>ou,DEFAULT_SAME_CHAIN_SOURCES:()=>nu,NATIVE_TOKEN:()=>Li,canonicalJson:()=>su,hashFirmQuote:()=>uu,hashRfqIntent:()=>cu,normalizeFirmQuote:()=>Bi,normalizeRfqIntent:()=>Ty,sha256Hex:()=>kr});import{createHash as vy}from"node:crypto";import{getAddress as ru,isAddress as Ui}from"ethers";function re(e,t="invalid"){throw new Error(`rfq: ${e} ${t}`)}function Zc(e,t){let r=Number(e);return(!Number.isSafeInteger(r)||r<=0)&&re(t,"must be a positive chainId"),r}function yn(e,t){let r=String(e??"").trim();return(!Iy.test(r)||BigInt(r)<=0n)&&re(t,"must be a positive integer string"),r}function _y(e,t){return e==null||e===""?null:yn(e,t)}function eu(e,t){let r=String(e??"").trim();return r.toLowerCase()===Li.toLowerCase()?Li:(Ui(r)||re(t,"must be an EVM address or native token sentinel"),ru(r))}function iu(e,t){let r=String(e??"").trim();return Ui(r)||re(t,"must be an EVM address"),ru(r)}function Oy(e,t){return e==null||e===""?null:iu(e,t)}function tu(e,t,r){return e===void 0?[...r]:(Array.isArray(e)||re(t,"must be an array"),e.map(n=>String(n).trim()).filter(Boolean))}function Cy(e,{nowMs:t,maxDeadlineMs:r},n){let o=Number(e);return Number.isFinite(o)||re(n,"must be a finite millisecond timestamp"),o<=t&&re(n,"expired"),o>t+r&&re(n,"exceeds maxDeadlineMs"),Math.floor(o)}function zt(e){if(Array.isArray(e))return e.map(zt);if(e&&typeof e=="object"){let t={};for(let r of Object.keys(e).sort())e[r]!==void 0&&(t[r]=zt(e[r]));return t}return e}function su(e){return JSON.stringify(zt(e))}function kr(e){return`0x${vy("sha256").update(su(e)).digest("hex")}`}function au(e,t){let r={...e};for(let n of t)delete r[n];return r}function cu(e){return kr(au(e,["intentHash"]))}function uu(e){return kr(au(e,["firmQuoteHash"]))}function Ty(e={},t={}){let r=Number(t.nowMs??Date.now()),n=Number(t.maxDeadlineMs??1800*1e3);(!Number.isFinite(r)||!Number.isFinite(n)||n<=0)&&re("time","is invalid");let o=Zc(e.fromChainId??e.fromChain,"fromChainId"),i=Zc(e.toChainId??e.toChain,"toChainId"),a=o===i?nu:ou,c={kind:"rfq-intent",version:1,fromChainId:o,toChainId:i,sellToken:eu(e.sellToken??e.tokenIn??e.fromToken,"sellToken"),buyToken:eu(e.buyToken??e.tokenOut??e.toToken,"buyToken"),sellAmount:yn(e.sellAmount??e.amountIn??e.fromAmount,"sellAmount"),receiver:iu(e.receiver??e.recipient??e.to,"receiver"),deadlineMs:Cy(e.deadlineMs??e.deadline??e.expiresAtMs,{nowMs:r,maxDeadlineMs:n},"deadline"),minBuyAmount:_y(e.minBuyAmount??e.minOut??e.amountOutMin,"minBuyAmount"),allowedSources:tu(e.allowedSources,"allowedSources",a),allowedRouters:tu(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)?zt(e.metadata):{}};return c.slippageBps!=null&&(!Number.isInteger(c.slippageBps)||c.slippageBps<0||c.slippageBps>1e4)&&re("slippageBps","must be 0 to 10000"),c.intentId=e.intentId?String(e.intentId):kr({seed:"rfq-intent",intent:c}).slice(0,34),c.intentHash=cu(c),Object.freeze(c)}function Ny(e){return(!e||typeof e!="object"||Array.isArray(e))&&re("artifact","required"),e.typedDataHash!=null&&!Jc.test(String(e.typedDataHash))&&re("artifact.typedDataHash","must be bytes32"),e.calldataHash!=null&&!Jc.test(String(e.calldataHash))&&re("artifact.calldataHash","must be bytes32"),e.to!=null&&!Ui(String(e.to))&&re("artifact.to","must be an address"),e.data!=null&&!/^0x(?:[0-9a-fA-F]{2})*$/.test(String(e.data))&&re("artifact.data","must be hex"),zt(e)}function Bi(e,t={},r={}){(!e||e.kind!=="rfq-intent")&&re("intent","required");let n=Number(r.nowMs??Date.now()),o=Number(t.expiryMs??t.expiresAtMs??t.validUntilMs);Number.isFinite(o)||re("quote expiry","required"),o<=n&&re("quote","expired"),o>e.deadlineMs&&re("quote expiry","exceeds intent deadline");let i=String(t.source??t.provider??"").trim();i||re("source","required"),e.allowedSources.includes(i)||re("source","not allowed by intent");let s=yn(t.amountOut??t.buyAmount,"amountOut"),a=yn(t.minBuyAmount??t.minOut??s,"minBuyAmount");BigInt(a)>BigInt(s)&&re("minBuyAmount","exceeds amountOut");let c=Ny(t.artifact??t.executableArtifact??t.transaction??t.typedData),u=Number(t.quotedAtMs??t.timestampMs??r.nowMs??Date.now());Number.isFinite(u)||re("quotedAtMs","must be finite");let d=Oy(t.router??t.settlementRouter??c.to,"router"),l={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:d,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)?zt(t.metadata):{}};return l.quoteId||(l.quoteId=kr({seed:"rfq-quote",out:l}).slice(0,34)),l.firmQuoteHash=uu(l),Object.freeze(l)}var Li,nu,ou,Jc,Iy,Fi=v(()=>{Li="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",nu=Object.freeze(["lifi","paraswap","0x","cow","uniswap-v3"]),ou=Object.freeze(["lifi"]),Jc=/^0x[0-9a-fA-F]{64}$/,Iy=/^\d+$/});import{readFileSync as Ry}from"node:fs";import{homedir as $y}from"node:os";import{join as gn}from"node:path";function Py(){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=$y();if(process.env.ORACLE_PUBLIC_DESKTOP==="1"){let r=(process.env.ORACLE_CONFIG_DIR||gn(t,".config","oracle")).trim();return[e,gn(r,"exec.env")].filter(Boolean)}return[e,gn(t,".config","oracle","exec.env"),gn(t,".config","mad-desk","exec.env")].filter(Boolean)}function du(e,t,r){let n=e??process.env[t]??process.env[r];if(!String(n||"").trim())for(let o of Py())try{let i=Ry(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 pu=v(()=>{});var fu=v(()=>{});import{createHash as qy,createHmac as hu,timingSafeEqual as Ly}from"node:crypto";function bn(e){return Array.isArray(e)?`[${e.map(bn).join(",")}]`:e&&typeof e=="object"?`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${bn(e[t])}`).join(",")}}`:JSON.stringify(e??null)}function yu(e,{required:t=!1}={}){try{return du(e,"ORACLE_ROUTE_ATTESTATION_SECRET","MAD_ROUTE_ATTESTATION_SECRET")}catch(r){if(t)throw r;return null}}function Mi(e){let{signature:t,...r}=e;return r}function gu(e,{secret:t}={}){let r=yu(t);return r?{...e,signature:hu("sha256",r).update(bn(Mi(e))).digest("hex")}:e}function Uy(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 qy("sha256").update(Buffer.from(t.slice(2),"hex")).digest("hex")}function ke(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=yu(o);if(i){let f=hu("sha256",i).update(bn(Mi(e))).digest("hex");if(!By(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>tt||!Number.isInteger(a)||a<0||a>tt||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 d=c*BigInt(1e4-s),l=d/10000n;if(d%10000n!==0n&&(l+=1n),u<l)throw new Error("auto-slippage guard is under-protected relative to its quote");let p=Dy(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 gu({...Mi(e),calldataHash:Uy(n)},{secret:o})}function By(e,t){let r=Buffer.from(String(e??""),"utf8"),n=Buffer.from(String(t??""),"utf8");return r.length!==n.length||r.length===0?!1:Ly(r,n)}function Di(e,t=0){let r=Number(e);return Number.isFinite(r)?r:t}function Fy(e){let t=e==null?tt: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,tt)}function rt({liquidityUsd:e,priceChange5m:t=0,quoteAgeMs:r=0,crossChain:n=!1,requestedCapBps:o}={}){let i=Di(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(Di(t,0))*2),c=Math.min(40,Math.floor(Math.max(0,Di(r,0))/5e3)*5),u=Math.max(25,Math.ceil(20+s+a+c)),d=Fy(o);return{mode:"auto",requiredBps:u,selectedBps:Math.min(u,d),capBps:d,executable:u<=d}}function ji({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=mu,secret:d}={}){let l=BigInt(r??0);if(l<=0n)throw new Error("auto-slippage guard requires positive quoteAmountOut");let p=rt({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)||mu)),g=l*BigInt(1e4-p.selectedBps),h=g/10000n;if(g%10000n!==0n&&(h+=1n),h>l&&(h=l),l>0n&&h<=0n)throw new Error(`auto-slippage: quote ${l} is too small to express a ${p.selectedBps} bps floor without rounding to zero`);let w=Number((l-h)*10000n/(l===0n?1n:l));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 gu({mode:"auto",chainId:Number(e),venue:String(t||"unknown"),quoteAmountOut:l.toString(),minAmountOut:h.toString(),requiredBps:p.requiredBps,selectedBps:p.selectedBps,capBps:p.capBps,quotedAtMs:f,expiresAtMs:f+m},{secret:d})}function Dy(e){let t=String(e||"");if(!/^0x[0-9a-fA-F]+$/.test(t)||t.length<10||t.length%2!==0)return null;let r=t.slice(0,10).toLowerCase(),n=[];for(let i=10;i+64<=t.length;i+=64)n.push(t.slice(i,i+64));let o=i=>n[i]==null?null:BigInt("0x"+n[i]);switch(r){case"0x414bf389":return o(6);case"0x04e45aaf":return o(5);case"0xc04b8d59":{let i=o(0);if(i==null)return null;let s=Number(i)/32;return!Number.isInteger(s)||s<0?null:o(s+4)}case"0xb858183f":{let i=o(0);if(i==null)return null;let s=Number(i)/32;return!Number.isInteger(s)||s<0?null:o(s+3)}case"0xa026383e":return o(6);case"0x38ed1739":case"0x5c11d795":return o(1);case"0x7ff36ab5":case"0xb6f9de95":return o(0);case"0x18cbafe5":case"0x791ac947":return o(1);default:return null}}function ae(e,{chainId:t,venue:r,amountOut:n,liquidityUsd:o,priceChange5m:i,crossChain:s,requestedCapBps:a,quotedAtMs:c=Date.now(),ttlMs:u}={}){let d=ji({chainId:t,venue:r,quoteAmountOut:n,liquidityUsd:o,priceChange5m:i,crossChain:s,requestedCapBps:a,quotedAtMs:c,ttlMs:u});return{...e,autoSlippage:d,amountOutMinimum:d.minAmountOut}}var tt,mu,Re=v(()=>{pu();fu();tt=100,mu=2e4});function Hi(e){let t=String(e||"").trim();return/^0x[0-9a-fA-F]{40}$/.test(t)?t:dt}var dt,wn=v(()=>{dt="0x000000000000000000000000000000000000dEaD"});import{Contract as My,JsonRpcProvider as jy}from"ethers";function Ky(e){return Gy.test(String(e||""))}async function bu(e,{contract:t=Hy,rpc:r=Vy,chainId:n=zy,balanceOf:o}={}){if(!Ky(e))throw new Error("invalid-address");if(o)return BigInt(await o(e));let i=new jy(r,n,{staticNetwork:!0}),s=new My(t,Wy,i);return BigInt(await s.balanceOf(e))}var Hy,zy,Vy,Wy,Gy,wu=v(()=>{Hy="0x62FCFAf7573AD8B41a0FBF347AfEb85e06599A75",zy=999,Vy="https://rpc.hyperliquid.xyz/evm",Wy=["function balanceOf(address owner) view returns (uint256)"],Gy=/^0x[a-fA-F0-9]{40}$/});import{existsSync as Xy,readFileSync as Yy,lstatSync as Qy}from"node:fs";import{homedir as xu}from"node:os";import{join as zi}from"node:path";function eg(e){let t=String(e||"swap").toLowerCase();return Object.prototype.hasOwnProperty.call(Su,t)?Su[t]:Zy}function ig(e=process.env){if(process.env.ORACLE_TEST_ISOLATE_SECRETS==="1"){if(e[Eu])return String(e[Eu]);let t=e.ORACLE_CONFIG_DIR||zi(xu(),".config","oracle");return zi(t,"fee-recipient")}return zi(xu(),".config","oracle","fee-recipient")}function sg(e=process.env){try{let t=ig(e);if(!Xy(t)||Qy(t).isSymbolicLink())return"";let r=Yy(t,"utf8").trim().toLowerCase();return/^0x[a-f0-9]{40}$/.test(r)?r:""}catch{return""}}function ag(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),Jy)}function cg({env:e=process.env,action:t="swap",admin:r=!1}={}){let n=String(e[rg]||"").trim(),o=String(e[ng]||og).trim();if(r===!0)return{bps:0,recipient:"",integrator:o,action:t,applies:!1,reason:"admin-oracle"};let i=eg(t),s=ag(e[tg],{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=sg(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 xn({wallet:e,env:t=process.env,action:r="swap",holderCheck:n={},admin:o=!1}={}){let i=cg({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 bu(s,n))>0n?{...i,bps:0,applies:!1,reason:"locals-only-holder",holderVerificationStatus:"holder"}:{...i,holderVerificationStatus:"non-holder"}}catch{return{...i,holderVerificationStatus:"unavailable"}}}function ku(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 Au(e){return e?.applies?{integrator:e.integrator,fee:String(e.bps/1e4)}:{}}function vu(e){return e?.applies?{partner:e.integrator,partnerFeeBps:String(e.bps),partnerAddress:e.recipient}:{}}var Jy,Zy,Su,tg,rg,ng,Eu,og,Sn=v(()=>{wu();Jy=100,Zy=5,Su=Object.freeze({swap:5,bridge:5,perps:0,nft:0});tg="ORACLE_INTEGRATOR_FEE_BPS",rg="ORACLE_INTEGRATOR_FEE_RECIPIENT",ng="ORACLE_INTEGRATOR_ID",Eu="ORACLE_INTEGRATOR_FEE_RECIPIENT_PIN",og="oracle"});var Gi={};j(Gi,{LIFI_API:()=>_u,lifiChains:()=>fg,lifiHealth:()=>dg,lifiPrepare:()=>pg,lifiQuote:()=>It});function Wi(e={}){return(e.baseUrl||process.env.LIFI_API_URL||_u).replace(/\/$/,"")}function lg(e){let t=String(e||Vi).toLowerCase();return t===Vi.toLowerCase()||t===ug}function Iu(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 dg(e={}){let t=await N(`${Wi(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 It(e={},t={}){let{fromChain:r,toChain:n=r,fromToken:o=Vi,toToken:i,fromAmount:s,fromAddress:a=dt}=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=rt({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 d=await xn({wallet:e.fromAddress,env:t.env,action:e.feeAction||"swap",holderCheck:t.holderCheck});for(let[h,w]of Object.entries(Au(d)))c.set(h,w);let l=await N(`${Wi(t)}/quote?${c}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4}),p=l?.estimate?.toAmount||l?.toAmount;if(!p)return{...l,autoSlippagePolicy:u,oracleFee:d};let f=l?.transactionRequest?.to||l?.estimate?.approvalAddress||"lifi",m=ae(l,{chainId:Number(r),venue:f,amountOut:p,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,crossChain:Number(n)!==Number(r),requestedCapBps:e.maxSlippageBps??e.slippageBps}),g=l?.estimate?.toAmountMin||l?.toAmountMin;if(g!=null&&BigInt(g)<BigInt(m.amountOutMinimum))throw new Error("lifi: provider transaction is under-protected versus bounded auto-slippage floor");return{...m,oracleFee:d}}async function pg(e={},t={}){let r=await It(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(!lg(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:Iu(a,"approval token"),spender:Iu(s,"approval spender"),amount:String(e.fromAmount)}}return J({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:ke(r.autoSlippage,{chainId:o,venue:n.to,data:n.data})}},{provider:"lifi",kind:"lifi-tx"})}async function fg(e={}){return N(`${Wi(e)}/chains`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??12e3})}var _u,Vi,ug,Ar=v(()=>{W();Re();wn();ge();Sn();_u="https://li.quest/v1";Vi="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",ug="0x0000000000000000000000000000000000000000"});var Tu={};j(Tu,{PARASWAP_API:()=>Ou,paraswapHealth:()=>hg,paraswapPrepare:()=>mg,paraswapPrice:()=>Wt,paraswapTokens:()=>Cu});function Vt(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 Cu(e={},t={}){let r=Number(e.chainId||1);return N(`${Ki(t)}/tokens/${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function Wt(e={},t={}){let r=Number(e.chainId||e.network||1);if(e.amount==null)throw new Error("amount required");let n=new URLSearchParams({srcToken:Vt(e.srcToken,"srcToken"),destToken:Vt(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 xn({wallet:e.userAddress||e.fromAddress,env:t.env,action:e.feeAction||"swap",holderCheck:t.holderCheck});for(let[a,c]of Object.entries(vu(o)))n.set(a,c);let i=await N(`${Ki(t)}/prices?${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4}),s=i?.priceRoute?.destAmount;return s?{...ae(i,{chainId:r,venue:i?.priceRoute?.contractAddress||"paraswap-quote",amountOut:s,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,quoteAgeMs:0,requestedCapBps:e.maxSlippageBps??e.slippageBps}),executionReady:!1,executionBlocker:"call prepare to bind the price route to a validated transaction",oracleFee:o}:{...i,executionReady:!1,oracleFee:o}}async function mg(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=Vt(e.userAddress,"userAddress"),o=await Wt(e,t),i=o?.priceRoute,s=String(i?.contractAddress||"").toLowerCase();if(!s)throw new Error("paraswap: price route missing contractAddress");let a={srcToken:Vt(e.srcToken,"srcToken"),destToken:Vt(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=Vt(e.receiver,"receiver"));let c=await N(`${Ki(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 J({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:ke(o.autoSlippage,{chainId:r,venue:c.to,data:c.data})}},{provider:"paraswap",kind:"paraswap-tx"})}async function hg(e={}){let t=await Cu({chainId:1},e),r=Array.isArray(t?.tokens)?t.tokens.length:Object.keys(t?.tokens||{}).length;return{ok:r>0,tokenSample:r}}var Ou,Ki,En=v(()=>{W();Re();ge();Sn();Ou="https://api.paraswap.io",Ki=(e={})=>(e.baseUrl||process.env.PARASWAP_API_URL||Ou).replace(/\/$/,"")});function kn({provider:e,defaultUrl:t,hosts:r=[],url:n,strict:o=!1}){let s=(String(n??"").trim()||String(t)).replace(/\/$/,"");if(s===String(t).replace(/\/$/,""))return{baseUrl:s,trusted:!0,host:Ru(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([Ru(t),...r]).has(c)){let d=/^(127\.0\.0\.1|localhost|\[::1\])(:\d+)?$/i.test(c);return a.protocol==="http:"&&!d?{baseUrl:s,trusted:!1,host:c,reason:"plaintext http downgrade"}:{baseUrl:s,trusted:!0,host:c}}if(String(process.env[Nu]||"")==="1")return{baseUrl:s,trusted:!1,host:c};if(o)throw new Error(`${e}: refusing to call non-allowlisted host ${c} (set ${Nu}=1 to permit it)`);return{baseUrl:s,trusted:!1,host:c}}function Ru(e){let t=new URL(String(e));if(t.protocol!=="http:"&&t.protocol!=="https:")throw new Error("unsupported protocol");return t.host}function An(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 Nu,Xi=v(()=>{Nu="ORACLE_ALLOW_CUSTOM_PROVIDER_URL"});var Bu={};j(Bu,{ZEROX_API:()=>$u,zeroxHealth:()=>yg,zeroxPrepare:()=>gg,zeroxPrice:()=>Uu,zeroxQuote:()=>Gt});function Pu(e={}){return kn({provider:"zerox",defaultUrl:$u,hosts:["api.0x.org"],url:e.baseUrl||process.env.ZEROX_API_URL})}function qu(e={}){return Pu(e).baseUrl}function vn(e={}){return e.apiKey||process.env.ZEROX_API_KEY||process.env.OX_API_KEY||process.env["0X_API_KEY"]||""}function Lu(e={}){return An({"0x-version":"v2",accept:"application/json"},{"0x-api-key":vn(e)},Pu(e).trusted)}async function yg(e={}){if(!vn(e))return{ok:!1,configured:!1,error:"ZEROX_API_KEY not set"};try{let t=await Uu({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 Uu(e={},t={}){if(!vn(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),N(`${qu(t)}/swap/allowance-holder/price?${a}`,{headers:Lu(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function Gt(e={},t={}){if(!vn(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=rt({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 N(`${qu(t)}/swap/allowance-holder/quote?${c}`,{headers:Lu(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),d=u?.buyAmount||u?.grossBuyAmount;return d?ae(u,{chainId:r,venue:u?.transaction?.to||u?.to||"0x",amountOut:d,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps}):{...u,autoSlippagePolicy:a}}async function gg(e={},t={}){if(!e.taker)throw new Error("0x: taker required for executable prepare");let r=await Gt(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 J({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:ke(r.autoSlippage,{chainId:o,venue:n.to,data:n.data})}},{provider:"zerox",kind:"zerox-tx"})}var $u,In=v(()=>{W();Re();Xi();ge();$u="https://api.0x.org"});var _v,Fu=v(()=>{_v=Object.freeze({READ:"read",PREPARE:"prepare",EXECUTE:"execute",AUTONOMOUS:"autonomous"})});var Xu={};j(Xu,{COW_CANCEL_TYPES:()=>zu,COW_HOSTS:()=>Qi,COW_ORDER_TYPES:()=>_n,COW_SETTLEMENT:()=>Mu,COW_VAULT_RELAYER:()=>ju,cowCancelOrders:()=>Cg,cowChains:()=>Rg,cowHealth:()=>Eg,cowOrder:()=>Ku,cowOrderStatus:()=>Gu,cowOrderUid:()=>Ag,cowPrepareCancel:()=>_g,cowPrepareOrder:()=>kg,cowQuote:()=>_t,cowSignCancel:()=>Og,cowSignOrder:()=>vg,cowSubmitSignedOrder:()=>Ig,cowVerifyOrderFill:()=>Ng});import{TypedDataEncoder as Du,getAddress as vr,isAddress as bg}from"ethers";function On(e,t={}){if(t.baseUrl)return t.baseUrl.replace(/\/$/,"");let r=Qi[Number(e)];if(!r)throw new Error(`cowswap: unsupported chainId ${e}`);return r}function wg(e,t="v1",r={}){let n=On(e,r);return t==="v1"?n:n.replace(/\/api\/v1$/,`/api/${t}`)}function pt(e,t){let r=String(e||"").trim();if(!bg(r))throw new Error(`cowswap: ${t} must be an address`);return vr(r).toLowerCase()}function Kt(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 Vu(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 Wu(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 xg({digest:e,owner:t,validTo:r}={}){let n=Vu(e,"order digest").slice(2),o=pt(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 Ji(e){let t=Mu[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:vr(t)}}function Sg(e={},t,r){let n=pt(e.sellToken,"sellToken"),o=pt(e.buyToken,"buyToken"),i=pt(e.receiver||r,"receiver"),s=Number(e.validTo);if(!Number.isInteger(s)||s<=0)throw new Error("cowswap: quote.validTo required");let a=Vu(e.appData||e.appDataHash||`0x${"0".repeat(64)}`,"appData");return{sellToken:n,buyToken:o,receiver:i,sellAmount:Kt(e.sellAmount,"sellAmount"),buyAmount:Kt(e.buyAmount,"buyAmount"),validTo:s,appData:a,feeAmount:Kt(e.feeAmount??"0","feeAmount"),kind:String(e.kind||"sell"),partiallyFillable:!!e.partiallyFillable,sellTokenBalance:String(e.sellTokenBalance||"erc20"),buyTokenBalance:String(e.buyTokenBalance||"erc20")}}async function Eg(e={}){try{let t=await _t({chainId:1,sellToken:Yi[1],buyToken:Hu[1],sellAmountBeforeFee:"1000000000000000",from:dt},e);return{ok:!0,buyAmount:t.quote?.buyAmount||t.buyAmount}}catch(t){return{ok:!1,error:String(t.message||t).slice(0,160)}}}async function _t(e={},t={}){let r=Number(e.chainId??1),n=Hi(e.from||e.owner),o=e.sellToken||Yi[r],i=e.buyToken||Hu[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=Yi[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 N(`${On(r,t)}/quote`,{method:"POST",body:a,fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),u=c?.quote?.buyAmount||c?.buyAmount;return u?ae(c,{chainId:r,venue:"cowswap-order",amountOut:u,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps}):c}async function kg(e={},t={}){let r=Number(e.chainId??1),n=pt(Hi(e.from||e.owner||e.signer),"owner"),o=await _t({...e,chainId:r,from:n,signingScheme:e.signingScheme||"eip712"},t),i=Sg(o?.quote||o,r,n),s=Ji(r),a={domain:s,types:_n,primaryType:"Order",message:i},c=Du.hash(s,_n,i),u=ju[r];if(!u)throw new Error(`cowswap: vault relayer not registered for chain ${r}`);return J({provider:"cowswap",orderReady:!0,executionReady:!1,chainId:r,owner:n,signingScheme:"eip712",settlement:s.verifyingContract.toLowerCase(),vaultRelayer:vr(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:vr(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:vr(u).toLowerCase(),amount:i.sellAmount}},{provider:"cowswap",kind:"cow-order"})}async function Gu(e={},t={}){let r=Number(e.chainId??1),n=String(e.uid||e.orderUid||"").trim();if(!n)throw new Error("cowOrderStatus requires uid");return N(`${On(r,t)}/orders/${encodeURIComponent(n)}/status`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function Ku(e={},t={}){let r=Number(e.chainId??1),n=String(e.uid||e.orderUid||"").trim();if(!n)throw new Error("cowOrder requires uid");return N(`${On(r,t)}/orders/${encodeURIComponent(n)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}function Ag(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||Du.hash(Ji(r),_n,n),i=e.owner||e.from||e.signer||n.receiver;return xg({digest:o,owner:i,validTo:n.validTo})}async function vg(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 Ig(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 _g(e={}){let t=Number(e.chainId??1),r=pt(e.owner||e.from||e.signer,"owner"),n=(e.orderUids||e.uids||[e.uid]).filter(Boolean).map((s,a)=>Wu(s,`orderUids[${a}]`));if(!n.length)throw new Error("cowswap: orderUids required");let o=Ji(t);return J({provider:"cowswap",chainId:t,owner:r,orderUids:n,signingScheme:"eip712",typedData:{domain:o,types:zu,primaryType:"OrderCancellations",message:{orderUids:n}},cancelReady:!0,executableArtifact:!0},{provider:"cowswap",kind:"cow-cancel"})}async function Og(e={},t={}){throw new Error("cowswap.cowSignCancel refused: @oracle-agent/oracle is prepare-only. Cancel-sign with the user wallet.")}async function Cg(e={},t={}){throw new Error("cowswap.cowCancelOrders refused: @oracle-agent/oracle is prepare-only. Cancel from the user wallet or local operator.")}function Tg(e={}){return Kt(e.buyAmount??e.executedBuyAmount??"0","trade.buyAmount")}async function Ng(e={},t={}){let r=Number(e.chainId??1),n=Wu(e.uid||e.orderUid),o=t.order||await Ku({chainId:r,uid:n},t),i=t.status||o.status||await Gu({chainId:r,uid:n},t).catch(()=>null),s=t.trades||await N(`${wg(r,"v2",t)}/trades?orderUid=${encodeURIComponent(n)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),a=Array.isArray(s)?s:[],c=e.expectedOwner?pt(e.expectedOwner,"expectedOwner"):null;if(c&&pt(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(Tg(p));u===0n&&o.executedBuyAmount!=null&&(u=BigInt(Kt(o.executedBuyAmount,"executedBuyAmount")));let d=e.minBuyAmount!=null?BigInt(Kt(e.minBuyAmount,"minBuyAmount")):0n,l=u>=d&&String(o.status||i?.status||"").toLowerCase()!=="expired";return{ok:l,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:l?null:"insufficient fill or expired order"}}function Rg(){return Object.keys(Qi).map(Number)}var Qi,Mu,ju,Yi,Hu,_n,zu,Cn=v(()=>{W();Re();Fu();wn();ge();Qi={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"},Mu=Object.freeze({1:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41",100:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41",42161:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41",8453:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41"}),ju=Object.freeze({1:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110",100:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110",42161:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110",8453:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110"}),Yi={1:"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",8453:"0x4200000000000000000000000000000000000006",42161:"0x82aF49447D8a07e3bd95BD0d56f35241523fBab1"},Hu={1:"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",8453:"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",42161:"0xaf88d065e77c8cC2239327C5EDb3A432268e5831"},_n=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"}]}),zu=Object.freeze({OrderCancellations:[{name:"orderUids",type:"bytes[]"}]})});var Qu={};j(Qu,{CHAINS:()=>Tn,chainById:()=>es,isSupportedChain:()=>Yu,registerChain:()=>$g,rpcUrlFor:()=>ts});function es(e){return Zi.get(Number(e))||null}function $g({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 Tn[e]=o,Zi.set(o.chainId,o),o}function ts(e,t=process.env){let r=es(e);if(!r)return null;for(let n of r.rpcEnv){let o=(t[n]||"").trim();if(o)return o}return null}function Yu(e){return Zi.has(Number(e))}var Tn,Zi,rs=v(()=>{Tn={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}},Zi=new Map(Object.values(Tn).map(e=>[e.chainId,e]))});import{Interface as Pg,getAddress as qg}from"ethers";function Ir(e,t){try{return qg(e).toLowerCase()}catch{throw new Error(`${t} must be a valid EVM address`)}}function Ug(e,{rpcUrl:t,env:r=process.env}={}){if(t)return t;let n=ts(e,r);return n||Lg[Number(e)]||null}function Fg(e){let t=String(e||""),r=t.toLowerCase();if(t!==t.trim()||!/^[a-zA-Z0-9_]+$/.test(t)||!Bg.test(r))throw new Error(`evm-rpc: ${t} refused \u2014 @oracle-agent/oracle is prepare-only (read RPC only; no broadcast/sign)`);return r}async function Y(e,t,r=[],n={}){let o=String(t||"");Fg(o);let i=Ug(e,n);if(!i)throw new Error(`No RPC URL for chainId ${e} (set env from chain registry rpcEnv or pass rpcUrl)`);let a=await N(i,{method:"POST",body:{jsonrpc:"2.0",id:1,method:t,params:r},fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs??12e3,signal:n.signal});if(a?.error){let c=new Error(a.error.message||JSON.stringify(a.error));throw c.code=a.error.code,c}return a.result}async function Rn(e,t={}){let r=await Y(e,"eth_blockNumber",[],t);return parseInt(r,16)}async function Ju(e,t={}){let r=await Y(e,"eth_gasPrice",[],t);if(r==null)return null;try{return BigInt(r)}catch{return null}}async function Zu(e,t,r={}){if(!t)throw new Error("rpcGetBalance requires address");let n=await Y(e,"eth_getBalance",[t,"latest"],r);return{chainId:Number(e),address:t,balanceWei:BigInt(n).toString(),balanceHex:n}}async function el(e={},t={}){let r=Number(e.chainId??t.chainId??1),n=Ir(e.token||e.tokenAddress,"token"),o=Ir(e.owner,"owner"),i=Ir(e.spender,"spender"),s=Nn.encodeFunctionData("allowance",[o,i]),a=await Y(r,"eth_call",[{to:n,data:s},e.blockTag||"latest"],t),c=Nn.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 tl(e={},t={}){let r=Number(e.chainId??t.chainId??1),n=Ir(e.token||e.tokenAddress,"token"),o=Ir(e.account||e.owner||e.address,"account"),i=Nn.encodeFunctionData("balanceOf",[o]),s=await Y(r,"eth_call",[{to:n,data:i},e.blockTag||"latest"],t),a=Nn.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 Nn,Lg,Bg,nt=v(()=>{W();rs();Nn=new Pg(["function allowance(address owner,address spender) view returns (uint256)","function balanceOf(address account) view returns (uint256)"]);Lg={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"};Bg=/^(?:eth_(?:call|blocknumber|chainid|get[a-z0-9]+|feehistory|gasprice|maxpriorityfeepergas|syncing|protocolversion|estimategas|createaccesslist)|net_(?:version|listening|peercount)|web3_(?:clientversion|sha3))$/});function rl(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 $n(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 d=rl(o,c),l=String(d.address||"").toLowerCase(),p=String(d.symbol||"").toLowerCase(),f=Number(c.liquidityUsd??c.liquidity?.usd),m=Number.isFinite(f)?f:0,g=String(c.dex||c.dexId||"").toLowerCase(),h=0;return i.has(l)||Dg.has(p)?h=300:s&&l===s&&(h=100),g.includes("v4")?h+=20:g.includes("v3")?h+=10:(g.includes("v2")||g.includes("raydium")||g.includes("orca")||g.includes("meteora"))&&(h+=8),{pool:c,score:h*1e12+m,index:u,otherAddr:l,liquidityUsd:m}});return a.sort((c,u)=>u.score-c.score||c.index-u.index),a.map(c=>c.pool)}function nl(e,t=[]){let r=Array.isArray(t)?t:[];return r.length&&rl(e,r[0]).address||null}var Dg,ns=v(()=>{Dg=new Set(["usdc","usdt","usdg","dai","usd1","usde","pyusd"])});function zg(e,t,r){let n=$e(t),o=$e(r),i=$e(e?.baseToken?.address),s=$e(e?.quoteToken?.address);return i===n&&s===o||i===o&&s===n}function Vg(e){let t=Number(e?.liquidity?.usd);return Number.isFinite(t)&&t>=0?t:null}function Wg(e={}){return(e.baseUrl||process.env.DEXSCREENER_API_URL||Mg).replace(/\/$/,"")}async function Pn(e,t={}){if(!e)throw new Error("tokenAddress required");return N(`${Wg(t)}/latest/dex/tokens/${e}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3})}async function ol({chainId:e,tokenA:t,tokenB:r,dexIds:n=[]}={},o={}){return(await _r({chainId:e,tokenA:t,tokenB:r,dexIds:n},o))[0]??null}async function _r({chainId:e,tokenA:t,tokenB:r,dexIds:n=[]}={},o={}){if(e==null||!t||!r)throw new Error("chainId, tokenA, and tokenB required");let i=$e(jg[Number(e)]||e),s=new Set(Hg(n).filter(Boolean).map($e)),a=[...new Set([t,r].map(p=>String(p)).filter(Boolean))],c=await Promise.allSettled(a.map(p=>Pn(p,{...o,baseUrl:o.dexscreenerBaseUrl,timeoutMs:o.dexscreenerTimeoutMs??Math.min(Number(o.timeoutMs??4e3),4e3)}))),u=new Set,d=[];for(let p of c)if(p.status==="fulfilled")for(let f of p.value?.pairs||p.value?.data?.pairs||[]){let m=`${$e(f?.chainId)}:${$e(f?.dexId)}:${$e(f?.pairAddress)}`;u.has(m)||(u.add(m),d.push(f))}return d.filter(p=>$e(p?.chainId)===i).filter(p=>zg(p,t,r)).filter(p=>!s.size||s.has($e(p?.dexId))).map(p=>({pairAddress:p.pairAddress??null,dexId:p.dexId??null,chainId:p.chainId??null,liquidityUsd:Vg(p),pairCreatedAt:p.pairCreatedAt??null})).filter(p=>p.liquidityUsd!=null).sort((p,f)=>f.liquidityUsd-p.liquidityUsd)}async function il(e,{chainSlug:t="solana",stables:r=Gg}={},n={}){let o=await Pn(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=$n(e,s,{stables:r});return{chain:t,token:e,pools:a,topPool:a[0]||null}}var Mg,jg,$e,Hg,Gg,Or=v(()=>{W();ns();Mg="https://api.dexscreener.com",jg=Object.freeze({1:"ethereum",10:"optimism",56:"bsc",137:"polygon",8453:"base",42161:"arbitrum",43114:"avalanche",999:"hyperevm",4663:"robinhood"}),$e=e=>String(e??"").toLowerCase(),Hg=e=>Array.isArray(e)?e:e==null?[]:[e];Gg=["EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v","Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB"]});var ml={};j(ml,{PANCAKE_FEE_TIERS:()=>qn,UNI_V3_CHAINS:()=>be,UNI_V3_FEE_TIERS:()=>ul,UNI_V3_VENUES:()=>pl,uniV3Chains:()=>eb,uniV3EthUsdc:()=>fl,uniV3Health:()=>Zg,uniV3PrepareExactIn:()=>Jg,uniV3QuoteExactIn:()=>Ot,uniV3QuoteExactInPath:()=>Qg});import{Interface as al,getAddress as Cr,isAddress as cl}from"ethers";function is(e,t){let r=Number(e),n=be[r];if(!n)throw new Error(`uniswap-v3: unsupported chainId ${e} (supported: ${Object.keys(be).join(", ")})`);let o=pl[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 os(e,t){let r=be[Number(t)];if(!e||e===ll||e===dl||/^eth$/i.test(String(e)))return Cr(r.weth);let n=String(e);if(/^weth$/i.test(n))return Cr(r.weth);if(/^usdc$/i.test(n))return Cr(r.usdc);if(!cl(n))throw new Error(`invalid token address: ${e}`);return Cr(n)}function Xg(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 Yg(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 Ot(e={},t={}){let{chainId:r,quoter:n,router:o,feeTiers:i}=is(e.chainId??8453,e.venue),s=os(e.tokenIn||"WETH",r),a=os(e.tokenOut||be[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:ul,d=e.fee!=null?[Number(e.fee)]:e.tryFees===!1?[u[Math.min(2,u.length-1)]]:[...u],l=[],p=null;for(let A of d){let b=Ln.encodeFunctionData("quoteExactInputSingle",[{tokenIn:s,tokenOut:a,amountIn:c,fee:A,sqrtPriceLimitX96:0n}]);try{let y=await Y(r,"eth_call",[{to:n,data:b},"latest"],t);if(!y||y==="0x"){l.push({fee:A,ok:!1,error:"empty result"});continue}let k=Ln.decodeFunctionResult("quoteExactInputSingle",y),E={fee:A,ok:!0,amountOut:k[0].toString(),sqrtPriceX96After:k[1].toString(),initializedTicksCrossed:Number(k[2]),gasEstimate:k[3].toString()};l.push(E),(!p||BigInt(E.amountOut)>BigInt(p.amountOut))&&(p=E)}catch(y){l.push({fee:A,ok:!1,error:String(y.message||y).slice(0,160)})}}if(!p){let A=l.map(b=>`${b.fee}:${b.error||"fail"}`).join("; ");throw new Error(`uniswap-v3 quote failed chain=${r}: ${A}`)}let f=e.liquidityUsd==null?await _r({chainId:r,tokenA:s,tokenB:a,dexIds:Xg(e.venue)},t).catch(()=>[]):[],m={};for(let A of f.slice(0,8))if(!(!A.pairAddress||!cl(A.pairAddress)))try{let b=await Y(r,"eth_call",[{to:A.pairAddress,data:Kg},"latest"],t),y=b&&b!=="0x"&&b.length<=66?Number.parseInt(b,16):NaN;if(!Number.isFinite(y)||y<=0||y>1e6)continue;(m[y]==null||A.liquidityUsd>m[y].liquidityUsd)&&(m[y]=A)}catch{}let g=e.liquidityBandBps==null?50:Number(e.liquidityBandBps),h=null;if(e.fee==null&&g>0&&BigInt(p.amountOut)>0n){let A=BigInt(p.amountOut),y=l.filter(k=>k.ok&&Number((A-BigInt(k.amountOut))*10000n/A)<=g).filter(k=>m[k.fee]?.liquidityUsd!=null).sort((k,E)=>m[E.fee].liquidityUsd-m[k.fee].liquidityUsd)[0];y&&y.fee!==p.fee&&(h={priceBestFee:p.fee,chosenFee:y.fee,chosenPoolUsd:m[y.fee].liquidityUsd,bandBps:g},p=y)}let w=m[p.fee]??null,S=f[0]??null,_=w??S,x=e.liquidityUsd??w?.liquidityUsd??S?.liquidityUsd??null,O=e.liquidityUsd!=null?"caller":w?"pool":S?"pair":null;return ae({venue:"uniswap-v3",chainId:r,chain:be[r].name,quoter:n,tokenIn:s,tokenOut:a,amountIn:c.toString(),fee:p.fee,amountOut:p.amountOut,gasEstimate:p.gasEstimate,liquidityUsd:x,liquiditySource:_,liquidityAttribution:O,liquidityPick:h,sqrtPriceX96After:p.sqrtPriceX96After,initializedTicksCrossed:p.initializedTicksCrossed,triedFees:l,best:!0},{chainId:r,venue:o,amountOut:p.amountOut,liquidityUsd:x,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps})}async function Qg(e={},t={}){let{chainId:r,quoter:n,router:o}=is(e.chainId??8453),i=(e.tokens||[]).map(p=>os(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=Yg(i,s),u=Ln.encodeFunctionData("quoteExactInput",[c,a]),d=await Y(r,"eth_call",[{to:n,data:u},"latest"],t),l=Ln.decodeFunctionResult("quoteExactInput",d);return ae({venue:"uniswap-v3",chainId:r,chain:be[r].name,quoter:n,tokens:i,fees:s,path:c,amountIn:a.toString(),amountOut:l[0].toString(),gasEstimate:l[3].toString()},{chainId:r,venue:o,amountOut:l[0].toString(),liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps})}async function fl(e={},t={}){let r=Number(e.chainId??8453),n=e.amountIn??"1000000000000000",o=await Ot({chainId:r,tokenIn:be[r].weth,tokenOut:be[r].usdc,amountIn:n,fee:e.fee},t),i=Number(o.amountOut)/1e6;return{...o,amountOutUsdc:i,pair:"WETH/USDC"}}async function Jg(e={},t={}){let r=Number(e.chainId??8453),n=is(r,e.venue),o=Cr(e.recipient),i=String(e.tokenIn||"WETH"),s=!e.tokenIn||i===ll||i===dl||/^eth$/i.test(i),a=await Ot(e,t),c=sl.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))),l=Number(t.nowSeconds??Math.floor(Date.now()/1e3))+u,p=sl.encodeFunctionData("multicall",[l,[c]]);return J({provider:"uniswap-v3",calldataReady:!0,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:r,deadline:l,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:ke(a.autoSlippage,{chainId:r,venue:n.router,data:p})}},{provider:"uniswap-v3",kind:"univ3-swap-tx"})}async function Zg(e={}){let t=Number(e.chainId??8453);try{let r=await fl({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 eb(){return Object.entries(be).map(([e,t])=>({chainId:Number(e),name:t.name,quoter:t.quoter,weth:t.weth,usdc:t.usdc}))}var be,ul,Kg,Ln,sl,ll,dl,qn,pl,Un=v(()=>{nt();Or();Re();ge();be={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"}},ul=[100,500,3e3,1e4],Kg="0xddca3f43",Ln=new al(["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)"]),sl=new al(["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)"]),ll="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",dl="0x0000000000000000000000000000000000000000",qn=[100,500,2500,1e4],pl={56:{pancakeswap:{name:"pancakeswap",quoter:"0xB048Bbc1Ee6b733FFfCFb9e9CeF7375518e25997",router:"0x13f4EA83D0bd40E75C8222255bc855a974568Dd4",feeTiers:qn}},8453:{pancakeswap:{name:"pancakeswap",quoter:"0xB048Bbc1Ee6b733FFfCFb9e9CeF7375518e25997",router:"0x13f4EA83D0bd40E75C8222255bc855a974568Dd4",feeTiers:qn}},42161:{pancakeswap:{name:"pancakeswap",quoter:"0xB048Bbc1Ee6b733FFfCFb9e9CeF7375518e25997",router:"0x13f4EA83D0bd40E75C8222255bc855a974568Dd4",feeTiers:qn}},999:{hyperswap:{name:"hyperswap",quoter:"0x03A918028f22D9E1473B7959C927AD7425A45C7C",router:"0x4E2960a8cd19B467b82d26D83fAcb0fAE26b094D"}}}});var wl={};j(wl,{executeRfqCandidates:()=>gl,rankRfqQuotes:()=>bl,requestRfqQuotes:()=>nb,sourceCandidates:()=>yl});function Tr(e,t){return Array.isArray(e?.allowedSources)&&e.allowedSources.includes(t)}function hl(e,t){return String(e?.[t]??"").trim()}function Nr(e,t){return Object.freeze({source:e,run:t})}function yl(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??be,i=Number(e.fromChainId)===Number(e.toChainId),s=[];return Tr(e,"lifi")&&s.push(Nr("lifi",async()=>{let c=await(n.lifiQuote??It)({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 tb(t,c.transactionRequest.data):void 0,route:c},metadata:{tool:c?.tool??c?.toolDetails?.name??null}}})),i&&(Tr(e,"paraswap")&&s.push(Nr("paraswap",async()=>{let c=await(n.paraswapPrice??Wt)({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}}})),Tr(e,"0x")&&(hl(r,"ZEROX_API_KEY")||hl(r,"0X_API_KEY")||n.zeroxQuote)&&s.push(Nr("0x",async()=>{let c=await(n.zeroxQuote??Gt)({chainId:e.fromChainId,sellToken:e.sellToken,buyToken:e.buyToken,sellAmount:e.sellAmount,taker:e.receiver},t);return{quoteId:c?.id??null,amountOut:c?.buyAmount??c?.grossBuyAmount,minBuyAmount:c?.minBuyAmount??c?.buyAmount,expiryMs:Date.now()+Number(t.defaultQuoteTtlMs??2e4),artifact:{type:"0x-transaction",to:c?.transaction?.to,data:c?.transaction?.data,value:c?.transaction?.value??"0"},metadata:{route:c?.route??null}}})),Tr(e,"cow")&&s.push(Nr("cow",async()=>{let c=await(n.cowQuote??_t)({chainId:e.fromChainId,sellToken:e.sellToken,buyToken:e.buyToken,sellAmountBeforeFee:e.sellAmount,from:e.receiver,signingScheme:"eip712"},t),u=c?.quote??c;return{quoteId:c?.id??null,amountOut:u?.buyAmount,minBuyAmount:u?.buyAmount,expiryMs:Math.min(Number(u?.validTo??0)*1e3||Date.now()+Number(t.defaultQuoteTtlMs??2e4),e.deadlineMs),artifact:{type:"cow-order",order:u},metadata:{solver:!0}}})),Tr(e,"uniswap-v3")&&o[Number(e.fromChainId)]&&s.push(Nr("uniswap-v3",async()=>{let c=await(n.uniV3QuoteExactIn??Ot)({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 tb(e,t){return`0x${(await import("node:crypto")).createHash("sha256").update(String(t)).digest("hex")}`}async function rb(e,t){return Promise.race([Promise.resolve().then(e.run),new Promise((r,n)=>setTimeout(()=>n(new Error(`${e.source}: timeout`)),t))])}async function gl(e,t,r={}){let n=Number(r.timeoutMs??12e3),o=await Promise.allSettled(t.map(a=>rb(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(Bi(e,{...u.value,source:c.source},r))}catch(d){s.push({source:c.source,error:String(d?.message||d)})}}return{quotes:i,failed:s}}function bl(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 nb(e,t={}){let r=yl(e,t),{quotes:n,failed:o}=await gl(e,r,t),i=bl(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 xl=v(()=>{Ar();En();In();Cn();Un();Fi()});function Sl(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}ob.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))Xt.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 El(e){let{ok:t,errors:r,warnings:n}=Sl(e);if(!t)throw new Error(`invalid scanner for ${e?.key??"<unknown>"}:
5
5
  - ${r.join(`
6
- - `)}`);let o=e.capabilities||{},s=Ut.filter(a=>typeof o[a]=="function"),i={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:[...s],unsupported:Ut.filter(a=>!s.includes(a))}},supports(a){return s.includes(a)}};for(let a of Ut)s.includes(a)?i[a]=async(...c)=>o[a](...c,{scanner:i}):i[a]=async()=>{throw new Error(`${e.key} (chain ${e.chainId}) does not implement "${a}". Supported: ${s.join(", ")||"none"}. An unimplemented capability is absent, not assumed -- implement it or treat this chain as fail-closed for that operation.`)};return Object.freeze(i)}function pn(e){let t=du(e);return Ft.set(t.chainId,t),t}function O0(e){return Ft.get(Number(e))||null}function T0(){return[...Ft.values()]}function N0(){Ft.clear()}function R0(){let e={};for(let t of Ft.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:Ft.size,capabilities:[...Ut],chains:e}}var Ut,F,$,C0,Ft,bt=E(()=>{Ut=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"}),$=Object.freeze({PASS:"PASS",CAUTION:"CAUTION",FAIL:"FAIL",UNKNOWN:"UNKNOWN"}),C0=/^0x[0-9a-fA-F]{40}$/;Ft=new Map});function pu(e){let{source:t,amountOut:r,minOut:n=null,gasUsd:o=null,feeUsd:s=null,oracleFeeBps:i=0,estimatedGas:a=null,liquidityUsd:c=null,error:u=null,executionReady:p=!1,meta:l={}}=e||{};if(u||r==null)return{source:t,quality:_e.FAILED,amountOut:null,error:u||"no amountOut returned"};let d=br(r);if(d==null||d<=0n)return{source:t,quality:_e.FAILED,amountOut:null,error:"non-positive amountOut"};let f=Number(i);return{source:t,quality:o==null?_e.NO_GAS:_e.FULL,amountOut:d.toString(),minOut:br(n)?.toString()??null,gasUsd:o,feeUsd:s,oracleFeeBps:Number.isFinite(f)&&f>0?Math.floor(f):0,estimatedGas:a==null?null:String(a),liquidityUsd:c==null?null:Number(c),executionReady:p,meta:l}}async function mu(e,t,{divisor:r=1000n}={}){let n=br(t);if(n==null||n<=0n)return null;let o=n/r>0n?n/r:1n;if(o>=n)return null;let s,i;try{[s,i]=await Promise.all([e(o),e(n)])}catch{return null}let a=br(s),c=br(i);if(a==null||c==null||a<=0n)return null;let u=Number(a)/Number(o),p=Number(c)/Number(n);return!Number.isFinite(u)||!Number.isFinite(p)||u<=0?null:{impactPct:(1-p/u)*100,probeAmountIn:o.toString(),probeAmountOut:a.toString(),fullAmountOut:c.toString()}}function hu(e,t,{maxImpactPct:r=25}={}){let n=[],o=[],s=(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)}),i=[...e.warnings??[]];return n.length&&i.push(`dropped ${n.length} route(s) on price impact: `+n.map(a=>`${a.source} (${a.impactPct}%)`).join(", ")),o.length&&i.push(`price impact NOT measured for: ${o.join(", ")}. These are unproven against thin liquidity, not proven safe.`),{...e,routes:s,best:s[0]??null,impactRejected:n,impactUnmeasured:o,warnings:i}}function gs(e,{destPriceUsd:t=null,destDecimals:r=null,liquidityFirst:n=!0,liquidityBandBps:o=50,gasPriceWei:s=null,nativePriceUsd:i=null}={}){let a=e.filter(w=>w.quality!==_e.FAILED),c=e.filter(w=>w.quality===_e.FAILED),u=t!=null&&t>0&&r!=null&&r>=0,p=Number(s),l=Number(i),d=Number.isFinite(p)&&p>0&&Number.isFinite(l)&&l>0,f=a.map(w=>{let O=BigInt(w.amountOut),P=0n,U=!1,k=!1,R=BigInt(w.oracleFeeBps??0),D=R>0n?O*R/10000n:0n;if(u){let q=w.gasUsd,M=Number(w.meta?.gasUnits??w.estimatedGas);if(q==null&&d&&Number.isFinite(M)&&M>0){let K=M*p/1e18*l;Number.isFinite(K)&&K>=0&&(q=K,k=!0)}let se=(q??0)+(w.feeUsd??0);if(se>0){let K=se/t*10**r;Number.isFinite(K)&&K>=0&&(P=BigInt(Math.floor(K)),U=!0)}else q===0&&(U=!0)}let W=P+D,G=O>W?O-W:0n;return{...w,grossOut:O.toString(),netOut:G.toString(),costInDest:P.toString(),oracleFeeInDest:D.toString(),costAccounted:U,gasEstimated:k}}),m=Number(o)>0?Number(o):0,y=f.reduce((w,O)=>BigInt(O.netOut)>w?BigInt(O.netOut):w,0n),g=w=>y>0n?Number((y-BigInt(w))*10000n/y):0,b=[],S=f.slice().sort((w,O)=>BigInt(O.netOut)>BigInt(w.netOut)?1:-1)[0]??null;f.sort((w,O)=>{let P=g(w.netOut)<=m?0:1,U=g(O.netOut)<=m?0:1;if(n&&m>0&&P!==U)return P-U;if(n&&m>0){let k=w.liquidityUsd??-1,R=O.liquidityUsd??-1;if(k!==R)return R-k}return BigInt(O.netOut)>BigInt(w.netOut)?1:-1}),n&&m>0&&S&&f[0]&&f[0].source!==S.source&&b.push(`liquidity-first: chose ${f[0].source} (liquidity $${f[0].liquidityUsd??"unknown"}) over best-price ${S.source} within ${m} bps`);let C=f.filter(w=>!w.costAccounted).map(w=>w.source);u?C.length&&b.push(`gas not reported by: ${C.join(", ")}. These are ranked on gross output and may be overstated relative to gas-measured routes.`):b.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 w=f.find(O=>O.costAccounted&&g(O.netOut)<=m);w&&b.push(`winner ${x.source} has UNMEASURED gas; gas-measured ${w.source} is within ${m} bps and may net more once ${x.source}'s real gas is paid \u2014 prefer it if unsure.`)}let I=f.filter(w=>w.gasEstimated).map(w=>w.source);I.length&&b.push(`gas ESTIMATED (from gas units x current gas price, not measured) for: ${I.join(", ")}. Net includes this estimate so the ranking is gas-inclusive, but the on-chain gas may differ.`);let v=null,h=null;if(f.length>=2&&f[0].costAccounted&&f[1].costAccounted){let w=BigInt(f[0].netOut),O=BigInt(f[1].netOut);O>0n&&(v=Number((w-O)*10000n/O),h=`${f[0].source} vs ${f[1].source}`)}return{best:f[0]??null,routes:f,failed:c,improvementBps:v,spreadBasis:h,rankedOn:u?"net-of-cost":"gross",warnings:b}}async function fn(e,{timeoutMs:t=12e3}={}){let r=(o,s)=>Promise.race([o,new Promise((i,a)=>setTimeout(()=>a(new Error(`${s}: timeout`)),t))]);return(await Promise.allSettled(e.map(o=>r(Promise.resolve().then(o.run),o.source)))).map((o,s)=>{let i=e[s].source;return o.status==="rejected"?pu({source:i,error:String(o.reason?.message||o.reason)}):pu({source:i,...o.value})})}var _e,fu,br,ys=E(()=>{bt();_e=Object.freeze({FULL:"FULL",NO_GAS:"NO_GAS",FAILED:"FAILED"}),fu={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 gu(e={}){return Xr({provider:"oneinch",defaultUrl:P0,hosts:["api.1inch.dev"],url:e.baseUrl||process.env.ONEINCH_API_URL})}function $0(e={}){return gu(e).baseUrl}function yu(e={}){return e.apiKey||process.env.ONEINCH_API_KEY||process.env.ONE_INCH_API_KEY||""}function q0(e={}){let t=yu(e);return Zr({accept:"application/json"},{Authorization:t?`Bearer ${t}`:""},gu(e).trusted)}async function bu(e={},t={}){if(!yu(t))throw new Error("ONEINCH_API_KEY required for 1inch");let r=Number(e.chainId??1),{src:n,dst:o,amount:s}=e;if(!n||!o||!s)throw new Error("oneinchQuote requires src, dst, amount");let i=new URLSearchParams({src:n,dst:o,amount:String(s)}),a=await T(`${$0(t)}/${r}/quote?${i}`,{headers:q0(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3});return a?.dstAmount?ae(a,{chainId:r,venue:"1inch-quote",amountOut:a.dstAmount,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps}):a}var P0,wu=E(()=>{z();We();us();fe();P0="https://api.1inch.dev/swap/v6.0"});var Eu={};Q(Eu,{UNI_V4_CHAINS:()=>Oe,UNI_V4_FEE_TIERS:()=>bs,computeV4PoolId:()=>ws,uniV4Chains:()=>z0,uniV4Health:()=>V0,uniV4PrepareExactIn:()=>H0,uniV4QuoteExactIn:()=>bn,uniV4QuoteExactOut:()=>j0});import{AbiCoder as B0,Interface as xu,getAddress as Ce,isAddress as gn,keccak256 as U0}from"ethers";function yn(e){let t=Number(e),r=Oe[t];if(!r)throw new Error(`uniswap-v4: unsupported chainId ${e} (supported: ${Object.keys(Oe).join(", ")})`);return{chainId:t,...r}}function hn(e,t){let r=Oe[Number(t)];if(!e||e===Su||e===nt||/^eth$/i.test(String(e)))return Ce(r.weth);let n=String(e);if(/^weth$/i.test(n))return Ce(r.weth);if(/^usdc$/i.test(n)||/^usdg$/i.test(n))return Ce(r.usdc);if(!gn(n))throw new Error(`invalid token address: ${e}`);return Ce(n)}function ws({currency0:e,currency1:t,fee:r,tickSpacing:n,hooks:o=nt}){let s=Ce(e),i=Ce(t);if(s.toLowerCase()===i.toLowerCase())throw new Error("poolKey currencies must differ");let[a,c]=s.toLowerCase()<i.toLowerCase()?[s,i]:[i,s],u=o&&gn(o)?Ce(o):nt;return U0(wr.encode(["address","address","uint24","int24","address"],[a,c,Number(r),Number(n),u]))}function ku({tokenIn:e,tokenOut:t,fee:r,tickSpacing:n,hooks:o=nt}){let s=Ce(e),i=Ce(t),[a,c]=s.toLowerCase()<i.toLowerCase()?[s,i]:[i,s],u=s.toLowerCase()===a.toLowerCase();return{poolKey:{currency0:a,currency1:c,fee:Number(r),tickSpacing:Number(n),hooks:o&&gn(o)?Ce(o):nt},zeroForOne:u}}async function bn(e={},t={}){let{chainId:r,quoter:n,poolManager:o,universalRouter:s}=yn(e.chainId??8453),i=hn(e.tokenIn||"WETH",r),a=hn(e.tokenOut||Oe[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}]:[...bs],p=e.hooks||nt,l=[],d=null;for(let h of u){let{poolKey:w,zeroForOne:O}=ku({tokenIn:i,tokenOut:a,fee:h.fee,tickSpacing:h.tickSpacing,hooks:p}),P=mn.encodeFunctionData("quoteExactInputSingle",[{poolKey:w,zeroForOne:O,exactAmount:c,hookData:"0x"}]);try{let U=await(t.rpcCall||te)(r,"eth_call",[{to:n,data:P},"latest"],t);if(!U||U==="0x"){l.push({...h,ok:!1,error:"empty result"});continue}let k=mn.decodeFunctionResult("quoteExactInputSingle",U),R={fee:h.fee,tickSpacing:h.tickSpacing,ok:!0,amountOut:k[0].toString(),gasEstimate:k[1].toString(),poolKey:w,zeroForOne:O,poolId:ws({...w})};l.push(R),(!d||BigInt(R.amountOut)>BigInt(d.amountOut))&&(d=R)}catch(U){l.push({...h,ok:!1,error:String(U.message||U).slice(0,160)})}}if(!d){let h=l.map(w=>`${w.fee}/${w.tickSpacing}:${w.error||"fail"}`).join("; ");throw new Error(`uniswap-v4 quote failed chain=${r}: ${h}`)}let f=e.liquidityUsd==null?await mr({chainId:r,tokenA:i,tokenB:a,dexIds:vu},t).catch(()=>[]):[],m=new Map;for(let h of f){let w=String(h.pairAddress||"").toLowerCase();w&&m.set(w,h)}let y=h=>m.get(String(h.poolId||"").toLowerCase())??null,g=e.liquidityBandBps==null?50:Number(e.liquidityBandBps),b=null;if(!(e.fee!=null&&e.tickSpacing!=null)&&g>0&&BigInt(d.amountOut)>0n){let h=BigInt(d.amountOut),O=l.filter(P=>P.ok&&Number((h-BigInt(P.amountOut))*10000n/h)<=g).filter(P=>y(P)?.liquidityUsd!=null).sort((P,U)=>y(U).liquidityUsd-y(P).liquidityUsd)[0];O&&O.poolId!==d.poolId&&(b={priceBestFee:d.fee,chosenFee:O.fee,chosenPoolUsd:y(O).liquidityUsd,bandBps:g},d=O)}let S=y(d),C=f[0]??null,x=S??C,I=e.liquidityUsd??S?.liquidityUsd??C?.liquidityUsd??null,v=e.liquidityUsd!=null?"caller":S?"pool":C?"pair":null;return ae({venue:"uniswap-v4",chainId:r,chain:Oe[r].name,poolManager:o,quoter:n,universalRouter:s||null,tokenIn:i,tokenOut:a,amountIn:c.toString(),fee:d.fee,tickSpacing:d.tickSpacing,hooks:d.poolKey.hooks,poolId:d.poolId,zeroForOne:d.zeroForOne,amountOut:d.amountOut,gasEstimate:d.gasEstimate,liquidityUsd:I,liquiditySource:x,liquidityAttribution:v,liquidityPick:b,triedTiers:l,best:!0,executionReady:!1,prepareReady:typeof e.recipient=="string"&&gn(e.recipient)&&e.slippageBps!=null},{chainId:r,venue:s||n,amountOut:d.amountOut,liquidityUsd:I,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps})}async function j0(e={},t={}){let{chainId:r,quoter:n,poolManager:o,universalRouter:s}=yn(e.chainId??8453),i=hn(e.tokenIn||"WETH",r),a=hn(e.tokenOut||Oe[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}]:[...bs],p=e.hooks||nt,l=[],d=null;for(let m of u){let{poolKey:y,zeroForOne:g}=ku({tokenIn:i,tokenOut:a,fee:m.fee,tickSpacing:m.tickSpacing,hooks:p}),b=mn.encodeFunctionData("quoteExactOutputSingle",[{poolKey:y,zeroForOne:g,exactAmount:c,hookData:"0x"}]);try{let S=await(t.rpcCall||te)(r,"eth_call",[{to:n,data:b},"latest"],t);if(!S||S==="0x"){l.push({...m,ok:!1,error:"empty result"});continue}let C=mn.decodeFunctionResult("quoteExactOutputSingle",S),x={fee:m.fee,tickSpacing:m.tickSpacing,ok:!0,amountIn:C[0].toString(),gasEstimate:C[1].toString(),poolKey:y,zeroForOne:g,poolId:ws({...y})};l.push(x),(!d||BigInt(x.amountIn)<BigInt(d.amountIn))&&(d=x)}catch(S){l.push({...m,ok:!1,error:String(S.message||S).slice(0,160)})}}if(!d){let m=l.map(y=>`${y.fee}/${y.tickSpacing}:${y.error||"fail"}`).join("; ");throw new Error(`uniswap-v4 exact-output quote failed chain=${r}: ${m}`)}let f=e.liquidityUsd==null?await Gc({chainId:r,tokenA:i,tokenB:a,dexIds:vu},t).catch(()=>null):null;return{venue:"uniswap-v4",chainId:r,chain:Oe[r].name,poolManager:o,quoter:n,universalRouter:s||null,tokenIn:i,tokenOut:a,amountIn:d.amountIn,amountOut:c.toString(),gasEstimate:d.gasEstimate,fee:d.fee,tickSpacing:d.tickSpacing,hooks:d.poolKey.hooks,poolId:d.poolId,zeroForOne:d.zeroForOne,liquidityUsd:e.liquidityUsd??f?.liquidityUsd??null,liquiditySource:f,triedTiers:l,best:!0,executionReady:!1,prepareReady:!1}}async function H0(e={},t={}){let r=Number(e.chainId??8453),n=yn(r);if(!e.recipient)throw new Error("uniswap-v4 prepare requires recipient");let o=Ce(e.recipient);if(e.slippageBps==null)throw new Error("uniswap-v4 prepare requires explicit slippageBps");let s=Number(e.slippageBps);if(!Number.isInteger(s)||s<0||s>=1e4)throw new Error("slippageBps must be an integer from 0 through 9999");let i=String(e.tokenIn||"");if(!i||i===Su||i===nt||/^eth$/i.test(i))throw new Error("uniswap-v4 prepare currently requires an ERC-20 tokenIn; native input is not inferred");let a=await bn(e,t);if(!n.universalRouter)throw new Error(`uniswap-v4: no Universal Router on chain ${r}`);let c=BigInt(a.amountOut)*BigInt(1e4-s)/10000n,u={currency0:a.zeroForOne?a.tokenIn:a.tokenOut,currency1:a.zeroForOne?a.tokenOut:a.tokenIn,fee:a.fee,tickSpacing:a.tickSpacing,hooks:a.hooks},l=wr.encode(["tuple(tuple(address currency0,address currency1,uint24 fee,int24 tickSpacing,address hooks) poolKey,bool zeroForOne,uint128 amountIn,uint128 amountOutMinimum,uint256 minHopPriceX36,bytes hookData)"],[[u,a.zeroForOne,BigInt(a.amountIn),c,0n,"0x"]]),d=wr.encode(["address","uint256"],[a.tokenIn,BigInt(a.amountIn)]),f=wr.encode(["address","uint256"],[a.tokenOut,c]),m=wr.encode(["bytes","bytes[]"],[D0,[l,d,f]]),y=Math.min(600,Math.max(30,Number(e.deadlineSeconds??300))),b=Number(t.nowSeconds??Math.floor(Date.now()/1e3))+y,S=F0.encodeFunctionData("execute",[L0,[m],b]);return J({provider:"uniswap-v4",prepareReady:!0,calldataReady:!0,executionReady:!1,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:r,deadline:b,quote:{...a,amountOutMinimum:c.toString(),slippageBps:s},requiresApproval:{token:a.tokenIn,spender:M0,amount:a.amountIn,note:"Universal Router V4 settlement uses Permit2; Permit2 authorization for the Universal Router is also required"},transaction:{chainId:r,from:o,to:n.universalRouter,data:S,value:"0"}},{provider:"uniswap-v4",kind:"univ4-swap-tx"})}async function z0(){return Object.entries(Oe).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 V0(e={}){let t=yn(e.chainId??8453),r=await te(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 wr,nt,Oe,bs,mn,F0,L0,D0,M0,Su,vu,xs=E(()=>{rt();cn();We();fe();wr=B0.defaultAbiCoder(),nt="0x0000000000000000000000000000000000000000",Oe={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"}},bs=[{fee:100,tickSpacing:1},{fee:500,tickSpacing:10},{fee:3e3,tickSpacing:60},{fee:1e4,tickSpacing:200},{fee:25e3,tickSpacing:8}],mn=new xu(["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)"]),F0=new xu(["function execute(bytes commands,bytes[] inputs,uint256 deadline) payable"]),L0="0x10",D0="0x060c0f",M0="0x000000000022D473030F116dDEE9F6B43aC78BA3",Su="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE";vu=["uniswap-v4","uniswapv4"]});function G0(e={}){return(e.baseUrl||process.env.DEFILLAMA_COINS_URL||W0).replace(/\/$/,"")}function Q0(e={}){return(e.baseUrl||process.env.DEFILLAMA_API_URL||K0).replace(/\/$/,"")}async function wn(e,t={}){if(!Array.isArray(e)||!e.length)throw new Error("llamaPrices requires coins[]");let r=e.map(encodeURIComponent).join(",");return T(`${G0(t)}/prices/current/${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function Au(e={}){return T(`${Q0(e)}/protocols`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??2e4})}var W0,K0,Ss=E(()=>{z();W0="https://coins.llama.fi",K0="https://api.llama.fi"});var xn={};Q(xn,{ACROSS_API:()=>Iu,HOP_API:()=>_u,RELAY_API:()=>Cu,acrossHealth:()=>J0,acrossSuggestedFees:()=>Ou,hopHealth:()=>X0,hopQuote:()=>Tu,relayHealth:()=>Z0,relayPrepare:()=>eg,relayQuote:()=>ks});async function J0(e={}){try{return{ok:!0,estimatedFillTimeSec:(await Ou({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 Ou(e={},t={}){let{token:r,destinationToken:n=r,originChainId:o,destinationChainId:s,amount:i}=e;if(!r||o==null||s==null||!i)throw new Error("acrossSuggestedFees requires token, originChainId, destinationChainId, amount");let a=new URLSearchParams({token:r,destinationToken:n,originChainId:String(o),destinationChainId:String(s),amount:String(i)}),c=(t.baseUrl||process.env.ACROSS_API_URL||Iu).replace(/\/$/,"");return T(`${c}/suggested-fees?${a}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function X0(e={}){try{let t=await Tu({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 Tu(e={},t={}){let{amount:r,token:n="ETH",fromChain:o="ethereum",toChain:s="arbitrum"}=e;if(!r)throw new Error("hopQuote requires amount");let i=e.slippage==null?void 0:Math.round(Number(e.slippage)*100),a=Ve({liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,crossChain:o!==s,requestedCapBps:e.maxSlippageBps??e.slippageBps??i});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:s,slippage:String(a.selectedBps/100)}),u=(t.baseUrl||process.env.HOP_API_URL||_u).replace(/\/$/,""),p=await T(`${u}/quote?${c}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),l=p?.estimatedRecieved||p?.estimatedReceived;return l?ae(p,{chainId:Number(e.originChainId||e.chainId||Y0[o]||0),venue:p?.tx?.to||"hop",amountOut:l,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,crossChain:o!==s,requestedCapBps:e.maxSlippageBps??e.slippageBps??i}):{...p,autoSlippagePolicy:a}}async function Z0(e={}){try{let t=await ks({user:et,originChainId:1,destinationChainId:8453,originCurrency:"0x0000000000000000000000000000000000000000",destinationCurrency:"0x0000000000000000000000000000000000000000",amount:"1000000000000000",tradeType:"EXACT_INPUT"},e);return{ok:!0,hasSteps:Array.isArray(t.steps),stepCount:t.steps?.length||0}}catch(t){return{ok:!1,error:String(t.message||t).slice(0,160)}}}async function ks(e={},t={}){let{user:r=et,originChainId:n,destinationChainId:o,originCurrency:s="0x0000000000000000000000000000000000000000",destinationCurrency:i="0x0000000000000000000000000000000000000000",amount:a,tradeType:c="EXACT_INPUT"}=e;if(n==null||o==null||!a)throw new Error("relayQuote requires originChainId, destinationChainId, amount");let u=Ve({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 p=(t.baseUrl||process.env.RELAY_API_URL||Cu).replace(/\/$/,""),l=await T(`${p}/quote`,{method:"POST",body:{user:r,originChainId:Number(n),destinationChainId:Number(o),originCurrency:s,destinationCurrency:i,amount:String(a),tradeType:c,slippageTolerance:String(u.selectedBps)},fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4}),d=l?.details?.currencyOut?.amount;return!d||!/^\d+$/.test(String(d))?{...l,autoSlippagePolicy:u}:ae(l,{chainId:Number(n),venue:l?.steps?.[0]?.items?.[0]?.data?.to||"relay",amountOut:d,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,crossChain:Number(n)!==Number(o),requestedCapBps:e.maxSlippageBps??e.slippageBps})}async function eg(e={},t={}){let r=await ks(e,t),n=Number(e.originChainId),o=(r.steps||[]).flatMap(a=>(a.items||[]).filter(c=>c?.data?.to&&c?.data?.data).map(c=>({stepId:a.id,...c.data})));if(!o.length)throw new Error("relay: quote returned no executable transaction items");let s=String(r?.autoSlippage?.venue||"").toLowerCase();if(o.some(a=>String(a.to).toLowerCase()!==s))throw new Error("relay: route includes a separate approval/transaction that is not yet safely bound");let i=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:Ae(r.autoSlippage,{chainId:n,venue:a.to,data:a.data})}));return J({provider:"relay",calldataReady:!0,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:n,quote:r,autoSlippage:r.autoSlippage,transactions:i},{provider:"relay",kind:"relay-tx"})}var Iu,_u,Cu,Y0,Sn=E(()=>{z();We();Gr();fe();Iu="https://across.to/api",_u="https://api.hop.exchange/v1",Cu="https://api.relay.link",Y0={ethereum:1,optimism:10,bsc:56,polygon:137,arbitrum:42161,avalanche:43114,base:8453}});function kn(e){if(!Array.isArray(e))return null;let t=0,r=!1;for(let n of e){let o=De(n?.amountUSD);o!=null&&(t+=o,r=!0)}return r?t:null}async function Ru(e,t={}){let r=fu[Number(e)];if(!r)return null;try{let n=await wn([r],t);return De(n?.coins?.[r]?.price)}catch{return null}}async function tg(e={}){try{let t=await Au({...e,baseUrl:e.defillamaApiBaseUrl,timeoutMs:e.defillamaTimeoutMs??Math.min(Number(e.timeoutMs??5e3),5e3)});return Array.isArray(t)?t:[]}catch{return[]}}function rg(e,t={}){let r=ot(t.tool||t.provider||t.bridge||t.protocol),n=[];return e==="lifi"&&r&&r!=="lifi"&&n.push(...Nu[r]||[r]),n.push(...Nu[ot(e)]||[e]),n}function ng(e,t,r={}){let n=Array.isArray(e)?e:[],o=rg(t,r).map(ot).filter(Boolean);for(let s of o){let i=n.find(c=>ot(c?.slug)===s||ot(c?.name)===s),a=De(i?.tvl);if(a!=null)return{liquidityUsd:a,protocol:i?.name??i?.slug??s}}for(let s of o){let i=n.find(c=>{let u=ot(c?.category);return!u.includes("bridge")&&!u.includes("crosschain")?!1:ot(c?.slug).includes(s)||ot(c?.name).includes(s)}),a=De(i?.tvl);if(a!=null)return{liquidityUsd:a,protocol:i?.name??i?.slug??s}}return null}function vs({chainId:e,tokenIn:t,tokenOut:r,amountIn:n,taker:o,slippageBps:s,decimalsIn:i,decimalsOut:a,nativePriceUsd:c=null,destDecimalsPromise:u=null,opts:p={}}){let l=[];return l.push({source:"lifi",run:async()=>{let d=await ht({fromChain:e,toChain:e,fromToken:t,toToken:r,fromAmount:n},p),f=d?.estimate??d?.[0]?.estimate;return{amountOut:f?.toAmount,minOut:f?.toAmountMin,gasUsd:kn(f?.gasCosts),feeUsd:kn(f?.feeCosts),oracleFeeBps:d?.oracleFee?.applies?d.oracleFee.bps:0,meta:{tool:d?.tool??d?.toolDetails?.name,oracleFee:d?.oracleFee??null}}}}),i!=null&&l.push({source:"paraswap",run:async()=>{let d=a??(await Promise.resolve(u))?.decimals;if(d==null)throw new Error("paraswap needs destination decimals; none supplied or resolvable");let f=await $t({chainId:e,srcToken:t,destToken:r,amount:n,srcDecimals:i,destDecimals:d},p),m=f?.priceRoute;return{amountOut:m?.destAmount,gasUsd:De(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&&l.push({source:"0x",run:async()=>{let d=await qt({chainId:e,sellToken:t,buyToken:r,sellAmount:n,taker:o},p),f=null,m=d?.totalNetworkFee,y=await Promise.resolve(c);return m!=null&&y&&(f=Number(m)/1e18*y),{amountOut:d?.buyAmount,minOut:d?.minBuyAmount,gasUsd:f,meta:{source:d?.route?.fills?.[0]?.source}}}}),process.env.ONEINCH_API_KEY&&l.push({source:"1inch",run:async()=>{let d=await bu({chainId:e,src:t,dst:r,amount:n},p),f=null;return d?.gas!=null&&c&&(f=null),{amountOut:d?.dstAmount,gasUsd:f,meta:{gasUnits:d?.gas}}}}),l.push({source:"cow",run:async()=>{let d=await gt({chainId:e,sellToken:t,buyToken:r,sellAmountBeforeFee:String(n),from:o},p),f=d?.quote??d,m=f?.feeAmount;return{amountOut:f?.buyAmount,gasUsd:0,meta:{intent:!0,feeAmountInSellToken:m,settlement:"solver-executed"}}}}),me[Number(e)]&&l.push({source:"uniswap-v3",run:async()=>{let d=await yt({chainId:e,tokenIn:t,tokenOut:r,amountIn:n},p);return{amountOut:d?.amountOut,minOut:d?.minOut??d?.amountOutMinimum??null,gasUsd:null,liquidityUsd:d?.liquidityUsd??null,meta:{onchain:!0,fee:d?.fee,gasUnits:d?.gasEstimate,quoter:d?.quoter}}}}),Oe[Number(e)]&&l.push({source:"uniswap-v4",run:async()=>{let d=await bn({chainId:e,tokenIn:t,tokenOut:r,amountIn:n,recipient:o,slippageBps:s},p);return{amountOut:d?.amountOut,minOut:d?.minOut??d?.amountOutMinimum??null,gasUsd:null,liquidityUsd:d?.liquidityUsd??null,meta:{onchain:!0,venue:"uniswap-v4",fee:d?.fee,tickSpacing:d?.tickSpacing,poolId:d?.poolId,hooks:d?.hooks,gasUnits:d?.gasEstimate,quoter:d?.quoter,poolManager:d?.poolManager,prepareReady:d?.prepareReady===!0,executionReady:!1}}}}),l}function Pu({fromChainId:e,toChainId:t,tokenIn:r,tokenOut:n,amountIn:o,taker:s,opts:i={}}){let a=[],c=null,u=async(p,l={})=>(c||=tg(i),ng(await c,p,l));return a.push({source:"lifi",run:async()=>{let p=await ht({fromChain:e,toChain:t,fromToken:r,toToken:n,fromAmount:o},i),l=p?.estimate??p?.[0]?.estimate,d={tool:p?.tool??p?.toolDetails?.name,durationSeconds:De(l?.executionDuration)},f=await u("lifi",d);return{amountOut:l?.toAmount,minOut:l?.toAmountMin,gasUsd:kn(l?.gasCosts),feeUsd:kn(l?.feeCosts),oracleFeeBps:p?.oracleFee?.applies?p.oracleFee.bps:0,liquidityUsd:f?.liquidityUsd??null,meta:{...d,liquidityProtocol:f?.protocol,oracleFee:p?.oracleFee??null}}}}),a.push({source:"relay",run:async()=>{let{relayQuote:p}=await Promise.resolve().then(()=>(Sn(),xn)),d=(await p({user:s,originChainId:e,destinationChainId:t,originCurrency:r,destinationCurrency:n,amount:String(o)},i))?.details,f={durationSeconds:De(d?.timeEstimate),rate:d?.rate},m=await u("relay",f);return{amountOut:d?.currencyOut?.amount,minOut:d?.currencyOut?.minimumAmount,gasUsd:De(d?.totalImpact?.usd)!=null?Math.abs(De(d.totalImpact.usd)):null,liquidityUsd:m?.liquidityUsd??null,meta:{...f,liquidityProtocol:m?.protocol}}}}),a.push({source:"across",run:async()=>{let{acrossSuggestedFees:p}=await Promise.resolve().then(()=>(Sn(),xn)),l=await p({token:r,destinationToken:n,originChainId:e,destinationChainId:t,amount:String(o)},i),d=l?.totalRelayFee?.total,f=null;if(d!=null)try{let y=BigInt(String(o))-BigInt(String(d));y>0n&&(f=y.toString())}catch{}let m=await u("across");return{amountOut:f,gasUsd:null,liquidityUsd:m?.liquidityUsd??null,meta:{derivedFromFees:!0,durationSeconds:De(l?.estimatedFillTimeSec),limits:l?.limits?{min:l.limits.minDeposit,max:l.limits.maxDeposit}:void 0,liquidityProtocol:m?.protocol}}}}),a}var De,ot,Nu,$u=E(()=>{dr();Jr();tn();wu();on();dn();xs();Ss();ys();De=e=>{let t=Number(e);return Number.isFinite(t)?t:null};ot=e=>String(e??"").toLowerCase().replace(/[^a-z0-9]/g,""),Nu=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 Bu={};Q(Bu,{QUALITY:()=>_e,bestBridgeRoute:()=>xr,bestSwapRoute:()=>Lt,formatComparisonNote:()=>vn});async function qu(e,t,r){let n=og[Number(e)];if(!n)return{priceUsd:null,decimals:null};let o=`${n}:${t}`;try{let i=(await wn([o],r))?.coins?.[o],a=Number(i?.price),c=Number(i?.decimals);return{priceUsd:Number.isFinite(a)?a:null,decimals:Number.isFinite(c)?c:null}}catch{return{priceUsd:null,decimals:null}}}async function Lt(e,t={}){let{chainId:r,tokenIn:n,tokenOut:o,amountIn:s}=e;if(r==null||!n||!o||s==null)throw new Error("bestSwapRoute requires chainId, tokenIn, tokenOut, amountIn");let i=Ru(r,t),a=qu(r,o,t),c=zc(r,t).catch(()=>null),u=vs({...e,nativePriceUsd:i,decimalsOut:e.decimalsOut,destDecimalsPromise:a,opts:t}),[p,l,d]=await Promise.all([fn(u,{timeoutMs:t.timeoutMs??12e3}),a,c]);i.catch(()=>{});let f=await i.then(g=>g,()=>null),m=gs(p,{destPriceUsd:l.priceUsd,destDecimals:e.decimalsOut??l.decimals,liquidityBandBps:t.liquidityBandBps??50,gasPriceWei:d,nativePriceUsd:f}),y=t.maxImpactPct===void 0?25:t.maxImpactPct;if(y!=null&&m.best){let g=m.best.source,S=await mu(async C=>{let x=vs({...e,amountIn:C.toString(),nativePriceUsd:i,decimalsOut:e.decimalsOut,destDecimalsPromise:a,opts:t}).filter(v=>v.source===g);return x.length?(await fn(x,{timeoutMs:t.timeoutMs??12e3}))?.[0]?.amountOut??null:null},s);if(S){let C=hu(m,{[g]:S},{maxImpactPct:y});return{kind:"swap",chainId:r,tokenIn:n,tokenOut:o,amountIn:String(s),...C,sourcesTried:u.length,sourcesAnswered:p.filter(x=>x.quality!==_e.FAILED).length,note:vn(C,u.length),priceImpact:{[g]:Number(S.impactPct.toFixed(2))}}}}return{kind:"swap",chainId:r,tokenIn:n,tokenOut:o,amountIn:String(s),...m,sourcesTried:u.length,sourcesAnswered:p.filter(g=>g.quality!==_e.FAILED).length,note:vn(m,u.length)}}async function xr(e,t={}){let{fromChainId:r,toChainId:n,tokenIn:o,tokenOut:s,amountIn:i}=e;if(r==null||n==null||!o||!s||i==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=qu(n,s,t),c=Pu({...e,opts:t}),[u,p]=await Promise.all([fn(c,{timeoutMs:t.timeoutMs??15e3}),a]),l=gs(u,{destPriceUsd:p.priceUsd,destDecimals:e.decimalsOut??p.decimals,liquidityBandBps:t.liquidityBandBps??50}),d=l.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:s,amountIn:String(i),...l,durations:d,sourcesTried:c.length,sourcesAnswered:u.filter(f=>f.quality!==_e.FAILED).length,note:vn(l,c.length)}}function sg(e){let t=e?.meta?.oracleFee;return t?.applies?` \xB7 ${fc(t)}`:""}function vn(e,t){if(!e.best)return"no source returned a usable route";let r=e.routes.length,n=sg(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,s=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 i=s>=.01?`${s.toFixed(2)}%`:`${o.toFixed(2)}bps`;return`best of ${r} routes, ranked on ${e.rankedOn}: ${i} 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 og,Dt=E(()=>{ys();$u();Yr();Ss();rt();og={1:"ethereum",10:"optimism",56:"bsc",137:"polygon",8453:"base",42161:"arbitrum",43114:"avax"}});var Uu={};Q(Uu,{ARTIFACT:()=>Ke,prepareBestRoute:()=>lg,supportedPreparers:()=>ag});function ag(){return Object.keys(En)}async function lg(e,t={}){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(!ug.test(r))throw new Error(`taker must be a valid 20-byte address, got "${r}"`);if(cg.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 Lt(e,t);if(!n.best){let g=n.impactRejected??[];return{ok:!1,reason:g.length?g[0].reason:"no source returned a usable route",priceImpactBlocked:g.length>0,impactRejected:g,comparison:n}}let o=e.source||n.best.source,s=n.routes.find(g=>g.source===o);if(!s)return{ok:!1,reason:`source "${o}" did not return a usable route`,comparison:n};let i=En[o];if(!i){let g=n.routes.find(b=>En[b.source]&&b.source!==o);return{ok:!1,reason:`${o} won the comparison but has no prepare path in this build. `+(g?`Next preparable route is ${g.source}; pass source:"${g.source}" to use it.`:"No route in this comparison can be prepared."),comparison:n,winner:o}}let a;try{a=await i(e,t)}catch(g){let b=typeof g?.body=="string"?g.body:g?.body?JSON.stringify(g.body):"",S=[String(g?.message||g),b].filter(Boolean).join(" :: "),C=/allowance/i.test(S),x=!C&&/not enough|insufficient|balance/i.test(S),I,v;C?(v="approval-required-first",I=`${o} will not build swap calldata until the token approval exists on-chain. Approve the spender first, then prepare again. Underlying: ${S}`):x?(v="taker-not-funded",I=`${o} refused to build the transaction: ${S}. This venue verifies the taker holds the input token. Quoting works for any address; preparing needs the real funded wallet.`):(v="provider-error",I=`${o} prepare failed: ${S}`);let h=n.routes.find(w=>En[w.source]&&w.source!==o);return{ok:!1,reason:I,failureKind:v,...h?{alternative:h.source}:{},comparison:n}}let c=e.driftToleranceBps??ig,u=null,p=null;if(a.amountOut!=null&&s.grossOut!=null)try{let g=BigInt(s.grossOut),b=BigInt(a.amountOut);g>0n&&(u=Number((b-g)*10000n/g),u<-c&&(p=`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 l=n.routes.filter(g=>g.source!==o).map(g=>({source:g.source,netOut:g.netOut,gasUsd:g.gasUsd})),f=n.routes.map(g=>({source:g.source,liquidityUsd:g.liquidityUsd??null})).reduce((g,b)=>Math.max(g,b.liquidityUsd??0),0)||null,m=s.liquidityUsd??null,y=m!=null&&f>0?Math.round(m/f*100):null;return J({ok:!0,chosen:{source:o,wasWinner:o===n.best.source,netOut:s.netOut,grossOut:s.grossOut,gasUsd:s.gasUsd,liquidityUsd:s.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===Ke.TRANSACTION?a.transaction?.to??null:a.settlement??null,driftBps:u,warnings:[...p?[p]:[],...n.warnings||[],...a.artifactKind===Ke.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:l,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 Ke,ig,En,cg,ug,Fu=E(()=>{Dt();fe();Ke=Object.freeze({TRANSACTION:"unsigned-transaction",TYPED_DATA_ORDER:"typed-data-order"}),ig=100,En={"uniswap-v3":async({chainId:e,tokenIn:t,tokenOut:r,amountIn:n,taker:o},s)=>{let{uniV3PrepareExactIn:i}=await Promise.resolve().then(()=>(dn(),nu)),a=await i({chainId:e,tokenIn:t,tokenOut:r,amountIn:n,recipient:o},s);return{artifactKind:Ke.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:s,fee:i,tickSpacing:a,hooks:c},u)=>{let{uniV4PrepareExactIn:p}=await Promise.resolve().then(()=>(xs(),Eu)),l=await p({chainId:e,tokenIn:t,tokenOut:r,amountIn:n,recipient:o,slippageBps:s,fee:i,tickSpacing:a,hooks:c},u);return{artifactKind:Ke.TRANSACTION,transaction:l.transaction,requiresApproval:l.requiresApproval,amountOut:l.quote?.amountOut??null,minOut:l.quote?.amountOutMinimum??null,prepareReady:!0,executionReady:!1}},lifi:async({chainId:e,tokenIn:t,tokenOut:r,amountIn:n,taker:o},s)=>{let{lifiPrepare:i}=await Promise.resolve().then(()=>(dr(),as)),a=await i({fromChain:e,toChain:e,fromToken:t,toToken:r,fromAmount:n,fromAddress:o},s);return{artifactKind:Ke.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:s,decimalsOut:i},a)=>{let{paraswapPrepare:c}=await Promise.resolve().then(()=>(Jr(),xc)),u=await c({chainId:e,srcToken:t,destToken:r,amount:n,srcDecimals:s,destDecimals:i,userAddress:o,side:"SELL"},a);return{artifactKind:Ke.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},s)=>{let{zeroxPrepare:i}=await Promise.resolve().then(()=>(tn(),Cc)),a=await i({chainId:e,sellToken:t,buyToken:r,sellAmount:n,taker:o},s);return{artifactKind:Ke.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},s)=>{let{cowPrepareOrder:i}=await Promise.resolve().then(()=>(on(),Lc)),a=await i({chainId:e,sellToken:t,buyToken:r,sellAmountBeforeFee:String(n),from:o},s);return{artifactKind:Ke.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"}}};cg=new Set(["0x0000000000000000000000000000000000000000","0x000000000000000000000000000000000000dead","0x0000000000000000000000000000000000000001","0x00000000000000000000000000000000000a1ce5"].map(e=>e.toLowerCase())),ug=/^0x[0-9a-fA-F]{40}$/});var Lu={};Q(Lu,{prepareBestBridgeRoute:()=>hg,supportedBridgePreparers:()=>mg});function mg(){return Object.keys(An)}async function hg(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(!dg.test(r))throw new Error(`taker must be a valid 20-byte address, got "${r}"`);if(pg.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 s=await xr(e,t);if(!s.best)return{ok:!1,reason:"no source returned a usable bridge route",comparison:s};let i=e.source||s.best.source,a=s.routes.find(g=>g.source===i);if(!a)return{ok:!1,reason:`source "${i}" returned no usable route`,comparison:s};let c=An[i];if(!c){let g=s.routes.find(b=>An[b.source]&&b.source!==i);return{ok:!1,reason:`${i} won the comparison but has no bridge prepare path in this build. `+(g?`Next preparable route is ${g.source}; pass source:"${g.source}".`:"No route in this comparison can be prepared."),failureKind:"no-prepare-path",...g?{alternative:g.source}:{},winner:i,comparison:s}}let u;try{u=await c(e,t)}catch(g){let b=typeof g?.body=="string"?g.body:g?.body?JSON.stringify(g.body):"",S=[String(g?.message||g),b].filter(Boolean).join(" :: "),C=/allowance/i.test(S),x=!C&&/not enough|insufficient|balance/i.test(S),I=s.routes.find(v=>An[v.source]&&v.source!==i);return{ok:!1,reason:C?`${i} will not build calldata until the token approval exists on-chain. Approve first, then prepare again. Underlying: ${S}`:x?`${i} refused to build: ${S}. Quoting works for any address; preparing needs the real funded wallet on chain ${n}.`:`${i} bridge prepare failed: ${S}`,failureKind:C?"approval-required-first":x?"taker-not-funded":"provider-error",...I?{alternative:I.source}:{},comparison:s}}let p=u.transactions||[];if(!p.length)return{ok:!1,reason:`${i} returned no executable transaction for this route`,failureKind:"provider-error",comparison:s};let l=p.filter(g=>g.chainId!=null&&Number(g.chainId)!==Number(n));if(l.length)return{ok:!1,reason:`${i} returned a transaction for chain ${l[0].chainId} but the origin chain is ${n}. Refusing to hand over a mismatched artifact.`,failureKind:"chain-mismatch",comparison:s};let d=e.driftToleranceBps??fg,f=null,m=null;if(u.amountOut!=null&&a.grossOut!=null)try{let g=BigInt(a.grossOut),b=BigInt(u.amountOut);g>0n&&(f=Number((b-g)*10000n/g),f<-d&&(m=`route moved ${(f/100).toFixed(2)}% against you since the comparison (tolerance ${(d/100).toFixed(2)}%). Re-compare before signing.`))}catch{}let y=[...m?[m]:[],...s.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 p.length>1&&y.push(`This route needs ${p.length} transactions signed IN ORDER. Signing only the first leaves funds approved but not bridged.`),J({ok:!0,chosen:{source:i,wasWinner:i===s.best.source,netOut:a.netOut,grossOut:a.grossOut,gasUsd:a.gasUsd},artifactKind:"unsigned-transaction-sequence",fromChainId:Number(n),toChainId:Number(o),transactionCount:p.length,transactions:p,requiresApproval:u.requiresApproval??null,minOut:u.minOut??null,durationSeconds:u.durationSeconds??null,destination:p[0]?.to??null,unsigned:!0,signedBy:"user-wallet",driftBps:f,warnings:y,runnersUp:s.routes.filter(g=>g.source!==i).map(g=>({source:g.source,netOut:g.netOut,gasUsd:g.gasUsd})),comparison:{rankedOn:s.rankedOn,sourcesAnswered:s.sourcesAnswered,sourcesTried:s.sourcesTried,improvementBps:s.improvementBps},note:`UNSIGNED. ${p.length} transaction(s) on chain ${n}, crediting chain ${o}. Verify every destination address before signing.`},{provider:"router",kind:"best-bridge"})}var dg,pg,fg,An,Du=E(()=>{Dt();fe();dg=/^0x[0-9a-fA-F]{40}$/,pg=new Set(["0x0000000000000000000000000000000000000000","0x000000000000000000000000000000000000dead","0x0000000000000000000000000000000000000001","0x00000000000000000000000000000000000a1ce5"].map(e=>e.toLowerCase())),fg=100,An={relay:async({fromChainId:e,toChainId:t,tokenIn:r,tokenOut:n,amountIn:o,taker:s},i)=>{let{relayPrepare:a}=await Promise.resolve().then(()=>(Sn(),xn)),c=await a({user:s,originChainId:e,destinationChainId:t,originCurrency:r,destinationCurrency:n,amount:String(o)},i);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:s,isHolder:i},a)=>{let{lifiPrepare:c}=await Promise.resolve().then(()=>(dr(),as)),u=await c({fromChain:e,toChain:t,fromToken:r,toToken:n,fromAmount:o,fromAddress:s,isHolder:i,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 Hu={};Q(Hu,{buildTwapSchedule:()=>ju,normalizeTwapParams:()=>Mu,prepareTwapChunk:()=>Sg,simulateTwap:()=>kg});function Mu(e={}){let t=Math.max(gg,Math.min(yg,Number(e.splits)||wg)),r=Math.max(.1,Number(e.windowHours)||xg),n=Math.max(bg,r*3600),o=BigInt(e.amount)/BigInt(t),s=Math.floor(n/t),i=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:s,taker:String(e.taker),slippageBps:i,status:"planned",createdAt:new Date().toISOString()}}function ju(e){let t=Mu(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 Sg(e,t,{chainId:r,tokenIn:n,tokenOut:o,chunkSize:s,taker:i,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 Lt({chainId:r,tokenIn:n,tokenOut:o,amountIn:s,taker:i}),u=J(c.transaction??c.tx,{chainId:r,taker:i,tokenIn:n,tokenOut:o,amountIn:s,slippageBps:a,kind:"twap",splitIndex:t,totalSplits:e.params.splits});return{splitIndex:t,chunkSize:s,quote:{amountOut:c.amountOut??c.quote?.amountOut,source:c.source??c.venue,priceImpact:c.priceImpact},...u}}async function kg(e,{quoteFn:t=Lt}={}){let r=ju(e),n=[],o=0n,s="unknown";for(let a=0;a<r.params.splits;a++)try{let c=await t({chainId:r.params.chainId,tokenIn:r.params.tokenIn,tokenOut:r.params.tokenOut,amountIn:r.params.chunkSize,taker:r.params.taker}),u=BigInt(c.amountOut??c.quote?.amountOut??"0");o+=u,s=c.source??c.venue??s,n.push({splitIndex:a+1,amountOut:String(u),source:c.source??c.venue})}catch(c){n.push({splitIndex:a+1,error:String(c.message||c).slice(0,200)})}let i=o>0n?(Number(o)/Number(BigInt(r.params.amount))).toFixed(6):null;return{params:r.params,schedule:r.schedule,totalOut:String(o),averagePrice:i,bestSource:s,chunks:n,simulatedAt:new Date().toISOString()}}var gg,yg,bg,wg,xg,zu=E(()=>{Dt();fe();gg=2,yg=100,bg=60,wg=10,xg=6});async function Ku({srcChainId:e,srcChainTokenIn:t,srcChainTokenInAmount:r,dstChainId:n,dstChainTokenOut:o,slippage:s=100,affiliateFeePercent:i="0"}={}){if(!e||!n||!t||!o||!r)return{error:"debridge quote requires srcChainId, dstChainId, srcChainTokenIn, dstChainTokenOut, srcChainTokenInAmount"};if(!Vu.has(Number(e))||!Vu.has(Number(n)))return{error:`debridge: unsupported chain pair ${e} -> ${n}`};try{let a={srcChainId:String(e),srcChainTokenIn:t,srcChainTokenInAmount:String(r),dstChainId:String(n),dstChainTokenOut:o,slippage:s,affiliateFeePercent:i},c=await T(`${Wu}/dln/order/quote`,{method:"POST",body:JSON.stringify(a),headers:{"content-type":"application/json"}});return c.error?{error:String(c.error)}:{estimation:c.estimation??{},order:c.order??{},fixFee:c.fixFee??"0"}}catch(a){return{error:String(a.message||a).slice(0,200)}}}async function Gu(){try{return{ok:!0,chainCount:(await T(`${Wu}/supported-chains-info`))?.chains?.length??0}}catch(e){return{ok:!1,error:String(e.message||e).slice(0,160)}}}var Wu,Vu,Qu=E(()=>{z();fe();Wu="https://dln.debridge.finance/v1.0",Vu=new Set([1,10,56,137,8453,42161,43114,59144,534352,7777777,324,5e3,1101,81457])});async function Ju({active:e=!0}={}){let t=Date.now();if(Mt.size&&t-Yu<vg)return[...Mt.values()];try{let r=await T(`${Es}/exchange/currencies?active=${e?"true":"false"}`);Mt.clear();for(let n of r??[])Mt.set(String(n.ticker).toLowerCase(),n);return Yu=t,r??[]}catch(r){return Mt.size?[...Mt.values()]:{error:String(r.message||r).slice(0,200)}}}async function Eg(e,t){if(!e||!t)return{error:"changenow minAmount requires fromTicker and toTicker"};try{return{minAmount:(await T(`${Es}/exchange/min-amount/${encodeURIComponent(e)}_${encodeURIComponent(t)}`))?.minAmount??"0"}}catch(r){return{error:String(r.message||r).slice(0,200)}}}async function Ag(e,t,r,{flow:n="standard"}={}){if(!e||!t||!r)return{error:"changenow estimate requires fromTicker, toTicker, fromAmount"};try{let o=new URLSearchParams({fromCurrency:String(e).toLowerCase(),toCurrency:String(t).toLowerCase(),fromAmount:String(r),flow:n}),s=await T(`${Es}/exchange/estimated-amount?${o}`);return{fromAmount:s?.fromAmount,toAmount:s?.toAmount,rate:s?.rate,flow:s?.flow??n}}catch(o){return{error:String(o.message||o).slice(0,200)}}}async function Xu({fromTicker:e,toTicker:t,fromAmount:r,flow:n}={}){if(!e||!t)return{error:"changenow quote requires fromTicker and toTicker"};let o=await Eg(e,t);if(o.error)return o;let s=r??o.minAmount,i=await Ag(e,t,s,{flow:n});if(i.error)return i;let a=await Ju(),c=a.find(p=>String(p?.ticker).toLowerCase()===String(e).toLowerCase()),u=a.find(p=>String(p?.ticker).toLowerCase()===String(t).toLowerCase());return{provider:"changenow",fromTicker:e,toTicker:t,fromAmount:s,toAmount:i.toAmount,estimatedRate:i.rate,minAmount:o.minAmount,flow:i.flow,networkFee:c?.networkFee??null,kycRequired:c?.kycRequired??u?.kycRequired??!1,riskDisclosure:"ChangeNOW is a centralized swap service. Funds are sent to a ChangeNOW deposit address. Not self-custodial during the swap window."}}async function Zu(){try{let e=await Ju();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 Es,Mt,Yu,vg,el=E(()=>{z();Es="https://api.changenow.io/v2",Mt=new Map,Yu=0,vg=6e5});async function tl({fromChain:e,toChain:t,fromToken:r,toToken:n,fromAmount:o,fromAddress:s,slippage:i=1}={}){if(!e||!t||!r||!n||!o||!s)return{error:"squid quote requires fromChain, toChain, fromToken, toToken, fromAmount, fromAddress"};try{let a={fromChain:e,toChain:t,fromToken:r,toToken:n,fromAmount:String(o),fromAddress:s,slippage:i},c=await T(`${Ig}/route`,{method:"POST",body:JSON.stringify(a),headers:{"content-type":"application/json"}});return{route:c?.route??{},toAmount:c?.route?.estimate?.toAmount,fee:c?.route?.estimate?.feeCosts}}catch(a){return{error:String(a.message||a).slice(0,200)}}}var Ig,rl=E(()=>{z();Ig="https://api.squidrouter.com/v1"});async function nl({srcChainId:e,dstChainId:t,token:r,amount:n,dstGasForCall:o=0,minAmountOut:s="0"}={}){if(!e||!t||!r||!n)return{error:"stargate quote requires srcChainId, dstChainId, token, amount"};try{let i=new URLSearchParams({srcChainId:String(e),dstChainId:String(t),token:r,amount:String(n),dstGasForCall:String(o),minAmountOut:String(s)}),a=await T(`${_g}/quote?${i}`);return{amountOut:a?.amountOut,fee:a?.fee,estimatedTime:a?.estimatedTime}}catch(i){return{error:String(i.message||i).slice(0,200)}}}var _g,ol=E(()=>{z();_g="https://api.stargate.finance"});async function sl({fromAsset:e,toAsset:t,amount:r,destination:n}={}){if(!e||!t||!r)return{error:"thorchain quote requires fromAsset, toAsset, amount"};try{let o=new URLSearchParams({from_asset:e,to_asset:t,amount:String(r),destination:n||""}),s=await T(`${Cg}/quote/swap?${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(o){return{error:String(o.message||o).slice(0,200)}}}var Cg,il=E(()=>{z();Cg="https://midgard.ninerealms.com/v2"});async function al({fromChainId:e,toChainId:t,fromToken:r,toToken:n,fromAmount:o,userAddress:s}={}){if(!e||!t||!r||!n||!o||!s)return{error:"bungee quote requires fromChainId, toChainId, fromToken, toToken, fromAmount, userAddress"};try{let i=new URLSearchParams({fromChainId:String(e),toChainId:String(t),fromTokenAddress:r,toTokenAddress:n,fromAmount:String(o),userAddress:s,sort:"output",singleTxOnly:"false"}),a=await T(`${Og}/quote?${i}`);return{amountOut:a?.result?.toAmount,feeUsd:a?.result?.totalGasFeesInUsd,route:a?.result?.route,estimatedTime:a?.result?.serviceTime?`${a.result.serviceTime}s`:"unknown"}}catch(i){return{error:String(i.message||i).slice(0,200)}}}var Og,cl=E(()=>{z();Og="https://api.socket.tech/v2"});async function ul({originDomain:e,destinationDomain:t,originToken:r,destinationToken:n,amount:o}={}){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)},i=await T(`${Tg}/estimate`,{method:"POST",body:JSON.stringify(s),headers:{"content-type":"application/json"}});return{amountOut:i?.amountOut,fee:i?.fee,estimatedTime:i?.estimatedTransferTime}}catch(s){return{error:String(s.message||s).slice(0,200)}}}var Tg,ll=E(()=>{z();Tg="https://api.connext.network"});async function dl({fromChain:e,toChain:t,token:r,amount:n}={}){if(!e||!t||!r||!n)return{error:"wormhole quote requires fromChain, toChain, token, amount"};try{let o=new URLSearchParams({fromChain:String(e),toChain:String(t),token:r,amount:String(n)}),s=await T(`${Ng}/quote?${o}`);return{amountOut:s?.amountOut,fee:s?.fee,estimatedTime:s?.estimatedTime}}catch(o){return{error:String(o.message||o).slice(0,200)}}}var Ng,pl=E(()=>{z();Ng="https://api.portalbridge.com/v1"});function Rg(e,t){return`0x${Is.getAmountsOut}`+Se(e)+Se(64)+Se(t.length)+t.map(Sr).join("")}function Pg(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 s=128+o*64;if(t.length<s+64)return null;n.push(BigInt(`0x${t.slice(s,s+64)}`))}return n}function As(e,t="router"){return(e?.venues||[]).find(n=>n.kind===t)?.address??null}function $g(e,t){let r=Number(t);if(!Number.isFinite(r)||r<0)throw new Error("slippageBps must be a non-negative number");if(r>_s)throw new Error(`slippageBps ${r} exceeds the ${_s} 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 fl(e){let{chainId:t,wrappedNative:r}=e;async function n(o,s,i,a){let c=await te(t,"eth_call",[{to:o,data:Rg(s,i)},"latest"],a);return Pg(c?.result??c)}return{async quote({tokenIn:o,tokenOut:s,amountIn:i,path:a},c={}){let u=As(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 p=a||[o,s];if(p.some(d=>!/^0x[0-9a-fA-F]{40}$/.test(d||"")))throw new Error("quote requires valid 20-byte addresses");let l=await n(u,i,p,c);return l?{chainId:t,router:u,path:p,amountIn:String(i),amountOut:l[l.length-1].toString(),hops:p.length-1,evidence:F.LIVE,note:"exact-input quote at current reserves; not a guaranteed fill"}:{chainId:t,router:u,path:p,evidence:F.UNKNOWN,reason:"router returned no amounts -- no pool for this path, or the call reverted"}},async sellSimulation({token:o,amountIn:s,base:i},a={}){let c=As(a.scanner),u=i||r;if(u&&String(o).toLowerCase()===String(u).toLowerCase())return{chainId:t,token:o,verdict:$.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:$.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 p=await n(c,s,[u,o],a);if(!p)return{chainId:t,token:o,verdict:$.FAIL,evidence:F.LIVE,leg:"buy",reason:"buy leg returned no amounts -- no route in"};let l=p[p.length-1];if(l===0n)return{chainId:t,token:o,verdict:$.FAIL,evidence:F.LIVE,leg:"buy",reason:"buy leg quotes zero output"};let d=await n(c,l,[o,u],a);if(!d)return{chainId:t,token:o,verdict:$.FAIL,evidence:F.LIVE,leg:"sell",bought:l.toString(),reason:"SELL LEG FAILED while the buy leg quoted fine. This is the honeypot signature: do not trade."};let f=d[d.length-1],m=Number(f*10000n/BigInt(s)),y=$.PASS,g="round trip completes with expected fee/impact loss";return m<5e3?(y=$.FAIL,g=`round trip returns only ${(m/100).toFixed(2)}% -- punitive tax or no real liquidity`):m<9e3&&(y=$.CAUTION,g=`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:g,amountIn:String(s),bought:l.toString(),returned:f.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:s,amountIn:i,recipient:a,slippageBps:c=50,deadlineSeconds:u=900,path:p},l={}){let d=l.scanner,f=As(d);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=p||[o,s],y=await this.quote({tokenIn:o,tokenOut:s,amountIn:i,path:m},l);if(y.evidence!==F.LIVE)throw new Error(`cannot prepare without a live quote (${y.evidence}: ${y.reason??"no reason given"})`);let g=$g(y.amountOut,c);if(g<=0n)throw new Error("computed minOut is zero -- refusing to prepare");let b=BigInt(Math.floor(Date.now()/1e3)+Number(u)),S=r&&m[0].toLowerCase()===r.toLowerCase()&&l.useNative,C=S?`0x${Is.swapExactETHForTokens}`+Se(g)+Se(128)+Sr(a)+Se(b)+Se(m.length)+m.map(Sr).join(""):`0x${Is.swapExactTokensForTokens}`+Se(i)+Se(g)+Se(160)+Sr(a)+Se(b)+Se(m.length)+m.map(Sr).join("");return{unsigned:!0,signedBy:"user-wallet",chainId:t,tx:{to:f,data:C,value:S?`0x${BigInt(i).toString(16)}`:"0x0"},guard:{quotedOut:y.amountOut,minOut:g.toString(),slippageBps:c,maxSlippageBps:_s,deadline:b.toString()},requires:S?[]:[{step:"approve",token:m[0],spender:f,amount:String(i)}],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 Is,Se,Sr,_s,ml=E(()=>{rt();bt();Is={getAmountsOut:"d06ca61f",swapExactTokensForTokens:"38ed1739",swapExactETHForTokens:"7ff36ab5"},Se=e=>BigInt(e).toString(16).padStart(64,"0"),Sr=e=>e.slice(2).toLowerCase().padStart(64,"0");_s=100});function Bg(e,t){let r=Number(t);if(!Number.isFinite(r)||r<0)throw new Error("slippageBps must be a non-negative number");if(r>Os)throw new Error(`slippageBps ${r} exceeds the ${Os} 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 Cs(e,t){return(e?.venues||[]).find(r=>r.kind===t)?.address??null}function yl(e){let{chainId:t,wrappedNative:r}=e;async function n({quoter:s,tokenIn:i,tokenOut:a,amountIn:c,fee:u},p){let l=`0x${hl.quoteExactInputSingle}`+kr(i)+kr(a)+wt(c)+wt(u)+wt(0),d=await te(t,"eth_call",[{to:s,data:l},"latest"],p).catch(()=>null),f=d?.result??d;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:s,tokenIn:i,tokenOut:a,amountIn:c},u){let p=[],l=null;for(let d of qg){let f=await n({quoter:s,tokenIn:i,tokenOut:a,amountIn:c,fee:d},u);p.push({fee:d,amountOut:f?f.toString():null}),f&&(!l||f>l.amountOut)&&(l={fee:d,amountOut:f})}return{best:l,tried:p}}return{async quote({tokenIn:s,tokenOut:i,amountIn:a},c={}){let u=Cs(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 d of[s,i])if(!gl.test(d||""))throw new Error("quote requires valid 20-byte addresses");let{best:p,tried:l}=await o({quoter:u,tokenIn:s,tokenOut:i,amountIn:a},c);return p?{chainId:t,venue:"uniswap-v3",quoter:u,tokenIn:s,tokenOut:i,amountIn:String(a),amountOut:p.amountOut.toString(),fee:p.fee,useNative:!!r&&String(s).toLowerCase()===String(r).toLowerCase(),triedFeeTiers:l,evidence:F.LIVE,note:"exact-input single-hop quote at current tick; not a guaranteed fill"}:{chainId:t,quoter:u,tokenIn:s,tokenOut:i,triedFeeTiers:l,evidence:F.UNKNOWN,reason:"no fee tier returned a quote -- no V3 pool for this pair, or no liquidity"}},async sellSimulation({token:s,amountIn:i,base:a},c={}){let u=Cs(c.scanner,"quoter"),p=a||r;if(p&&String(s).toLowerCase()===String(p).toLowerCase())return{chainId:t,token:s,verdict:$.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||!p)return{chainId:t,token:s,verdict:$.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 l=await o({quoter:u,tokenIn:p,tokenOut:s,amountIn:i},c);if(!l.best)return{chainId:t,token:s,verdict:$.FAIL,evidence:F.LIVE,leg:"buy",reason:"no V3 pool priced the buy leg on any fee tier"};let d=await o({quoter:u,tokenIn:s,tokenOut:p,amountIn:l.best.amountOut},c);if(!d.best)return{chainId:t,token:s,verdict:$.FAIL,evidence:F.LIVE,leg:"sell",bought:l.best.amountOut.toString(),reason:"SELL LEG FAILED while the buy leg quoted fine. This is the honeypot signature: do not trade."};let f=d.best.amountOut,m=Number(f*10000n/BigInt(i)),y=$.PASS,g="round trip completes with expected fee/impact loss";return m<5e3?(y=$.FAIL,g=`round trip returns only ${(m/100).toFixed(2)}% -- punitive tax or no real liquidity`):m<9e3&&(y=$.CAUTION,g=`round trip returns ${(m/100).toFixed(2)}% -- transfer tax or thin liquidity at this size`),{chainId:t,venue:"uniswap-v3",token:s,base:p,verdict:y,reason:g,amountIn:String(i),bought:l.best.amountOut.toString(),returned:f.toString(),retentionBps:m,buyFee:l.best.fee,sellFee:d.best.fee,evidence:F.LIVE,note:"Quote-level round trip. It does not prove transfer hooks absent at execution time."}},async prepareUnsignedTx({tokenIn:s,tokenOut:i,amountIn:a,recipient:c,slippageBps:u=50,fee:p},l={}){let d=Cs(l.scanner,"router");if(!d)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(!gl.test(c||""))throw new Error("prepareUnsignedTx requires a valid recipient address");let f=await this.quote({tokenIn:s,tokenOut:i,amountIn:a},l);if(f.evidence!==F.LIVE)throw new Error(`cannot prepare without a live quote (${f.evidence}: ${f.reason??"no reason given"})`);let m=p??f.fee,y=Bg(f.amountOut,u);if(y<=0n)throw new Error("computed minOut is zero -- refusing to prepare");let g=!!(l.useNative||f.useNative)&&r&&String(s).toLowerCase()===String(r).toLowerCase(),b=`0x${hl.exactInputSingle}`+kr(s)+kr(i)+wt(m)+kr(c)+wt(a)+wt(y)+wt(0);return{unsigned:!0,signedBy:"user-wallet",chainId:t,venue:"uniswap-v3",tx:{to:d,data:b,value:g?String(a):"0x0"},guard:{quotedOut:f.amountOut,minOut:y.toString(),slippageBps:u,maxSlippageBps:Os,fee:m},requires:g?[]:[{step:"approve",token:s,spender:d,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 qg,hl,wt,kr,gl,Os,bl=E(()=>{rt();bt();qg=[100,500,3e3,1e4],hl={quoteExactInputSingle:"c6a5026a",exactInputSingle:"04e45aaf"},wt=e=>BigInt(e).toString(16).padStart(64,"0"),kr=e=>e.slice(2).toLowerCase().padStart(64,"0"),gl=/^0x[0-9a-fA-F]{40}$/,Os=100});function wl(e){if(!e||e==="0x")return null;try{return BigInt(e)}catch{return null}}function xl(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),s=Buffer.from(o,"hex").toString("utf8").replace(/\0+$/,"");if(s)return s}}return Buffer.from(t.slice(0,64),"hex").toString("utf8").replace(/\0+$/,"")||null}function Ug(e){let{chainId:t}=e;async function r(n,o,s){return te(t,"eth_call",[{to:n,data:o},"latest"],s)}return{async blockNumber(n={}){let o=await an(t,n);return{chainId:t,blockNumber:o?.blockNumber??o,evidence:F.LIVE}},async nativeBalance(n,o={}){let s=await Vc(t,n,o);return{chainId:t,address:n,wei:s?.wei??s?.balance??null,symbol:e.nativeCurrency?.symbol??null,decimals:e.nativeCurrency?.decimals??18,evidence:F.LIVE}},async tokenBalance({token:n,owner:o},s={}){let i=await Kc({chainId:t,token:n,owner:o},s);return{chainId:t,token:n,owner:o,raw:i?.balance??i,evidence:F.LIVE}},async resolveToken(n,o={}){if(!/^0x[0-9a-fA-F]{40}$/.test(n||""))return{chainId:t,token:n,evidence:F.UNKNOWN,error:"resolveToken needs a 20-byte address; symbol lookup is a market-data concern"};let[s,i,a,c]=await Promise.all([r(n,In.decimals,o).catch(()=>null),r(n,In.symbol,o).catch(()=>null),r(n,In.name,o).catch(()=>null),r(n,In.totalSupply,o).catch(()=>null)]),u=wl(s?.result??s),p=u!==null||i?.result||a?.result;return{chainId:t,address:n,decimals:u===null?null:Number(u),symbol:xl(i?.result??i),name:xl(a?.result??a),totalSupply:(wl(c?.result??c)??null)?.toString()??null,evidence:p?F.LIVE:F.UNKNOWN,warning:p?void 0:"no ERC-20 metadata returned -- may not be a token contract"}},async resolvePools(n,o={}){let s=e.dexscreenerSlug;if(!s)return{chainId:t,token:n,pools:[],evidence:F.UNAVAILABLE,reason:"no dexscreenerSlug configured for this chain; pool discovery is unavailable rather than guessed"};let i=await fs(n,o).catch(()=>null),c=(i?.pairs||i?.data?.pairs||[]).filter(u=>String(u.chainId).toLowerCase()===String(s).toLowerCase()).map(u=>({pair:u.pairAddress,dex:u.dexId,base:u.baseToken?.address,quote:u.quoteToken?.address,liquidityUsd:u.liquidity?.usd??null,priceUsd:u.priceUsd??null,volume24hUsd:u.volume?.h24??null,createdAt:u.pairCreatedAt??null})).sort((u,p)=>(p.liquidityUsd??0)-(u.liquidityUsd??0));return{chainId:t,token:n,pools:c,evidence:c.length?F.LIVE:F.UNKNOWN}},async scanBlocks({fromBlock:n,toBlock:o,address:s,topics:i,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=[],p=[];for(let l=n;l<=o;l+=a){let d=Math.min(l+a-1,o);p.push([l,d])}for(let[l,d]of p){let f={fromBlock:`0x${l.toString(16)}`,toBlock:`0x${d.toString(16)}`};s&&(f.address=s),i&&(f.topics=i);let m=await te(t,"eth_getLogs",[f],c).catch(y=>({error:String(y?.message||y)}));if(m?.error)return{chainId:t,fromBlock:n,toBlock:o,logs:u,complete:!1,failedAt:[l,d],error:m.error,evidence:F.UNKNOWN};for(let y of m?.result??m??[])u.push(y)}return{chainId:t,fromBlock:n,toBlock:o,logs:u,complete:!0,chunks:p.length,evidence:F.LIVE}},async scoreRisk(n,o={}){let s=[],i=$.PASS,a=p=>{let l={[$.PASS]:0,[$.CAUTION]:1,[$.UNKNOWN]:2,[$.FAIL]:3};l[p]>l[i]&&(i=p)},c=await this.resolveToken(n,o);c.evidence!==F.LIVE?(s.push({check:"erc20-metadata",result:$.UNKNOWN,detail:c.warning}),a($.UNKNOWN)):s.push({check:"erc20-metadata",result:$.PASS,detail:`${c.symbol} / ${c.decimals}d`});let u=await this.resolvePools(n,o);if(u.evidence===F.UNAVAILABLE)s.push({check:"liquidity",result:$.UNKNOWN,detail:u.reason}),a($.UNKNOWN);else if(!u.pools.length)s.push({check:"liquidity",result:$.FAIL,detail:"no pool with liquidity found"}),a($.FAIL);else{let p=u.pools[0],l=p.liquidityUsd??0;l<5e3?(s.push({check:"liquidity",result:$.CAUTION,detail:`top pool only $${l}`}),a($.CAUTION)):s.push({check:"liquidity",result:$.PASS,detail:`$${l} on ${p.dex}`}),p.createdAt&&Date.now()-p.createdAt<24*3600*1e3&&(s.push({check:"age",result:$.CAUTION,detail:"pool under 24h old"}),a($.CAUTION))}if(typeof this.sellSimulation=="function"){let p=await this.sellSimulation({token:n,amountIn:(10n**16n).toString()},o).catch(l=>({verdict:$.UNKNOWN,reason:String(l?.message||l)}));s.push({check:"sellability",result:p.verdict,detail:p.retentionBps!=null?`round trip returns ${(p.retentionBps/100).toFixed(2)}% -- ${p.reason}`:p.reason}),a(p.verdict)}else s.push({check:"sellability",result:$.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($.UNKNOWN);return{chainId:t,token:n,verdict:i,checks:s,note:"Structural checks only. UNKNOWN is not PASS. A token is not tradeable until a sell simulation succeeds."}}}}function Ts(e){let r={...Ug(e)},n=new Set((e.venues||[]).map(s=>s.kind));e.venueKind==="uniswap-v3"&&n.has("quoter")&&n.has("router")?Object.assign(r,yl({chainId:e.chainId,wrappedNative:e.wrappedNative})):e.venueKind==="uniswap-v2"&&n.has("router")&&Object.assign(r,fl({chainId:e.chainId,wrappedNative:e.wrappedNative}));let o={};for(let[s,i]of Object.entries(r))o[s]=i.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 In,Sl=E(()=>{rt();cn();bt();ml();bl();In={decimals:"0x313ce567",symbol:"0x95d89b41",name:"0x06fdde03",totalSupply:"0x18160ddd",owner:"0x8da5cb5b"}});function kl(){return vr.map(e=>pn(Ts(e)))}function vl(e){return pn(Ts(e))}var vr,Ns=E(()=>{Sl();bt();vr=Object.freeze([{key:"ethereum",chainId:1,name:"Ethereum",rpcEnv:["ETH_RPC_URL","ETHEREUM_RPC_URL","MAINNET_RPC_URL"],nativeCurrency:{symbol:"ETH",decimals:18},explorer:"https://etherscan.io",dexscreenerSlug:"ethereum",venueKind:"uniswap-v3",wrappedNative:"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",venues:[{kind:"quoter",address:"0x61fFE014bA17989E743c5F6cB21bF9697530B21e",label:"Uniswap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle returned a live sane price (WETH->USDC fee 500 quoted 1908.71 USDC). A contract that correctly prices a known pair IS a working V3 quoter",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:1}},{kind:"router",address:"0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45",label:"Uniswap V3 SwapRouter02",verified:{method:"eth_getCode returned real bytecode on this chain and the paired quoter at the same deployment passed a live functional quote",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:1}}]},{key:"optimism",chainId:10,name:"OP Mainnet",rpcEnv:["OPTIMISM_RPC_URL","OP_RPC_URL"],nativeCurrency:{symbol:"ETH",decimals:18},explorer:"https://optimistic.etherscan.io",dexscreenerSlug:"optimism",venueKind:"uniswap-v3",wrappedNative:"0x4200000000000000000000000000000000000006",venues:[{kind:"quoter",address:"0x61fFE014bA17989E743c5F6cB21bF9697530B21e",label:"Uniswap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle returned a live sane price (WETH->USDC fee 500 quoted 1905.23 USDC). A contract that correctly prices a known pair IS a working V3 quoter",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:10}},{kind:"router",address:"0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45",label:"Uniswap V3 SwapRouter02",verified:{method:"eth_getCode returned real bytecode on this chain and the paired quoter at the same deployment passed a live functional quote",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:10}}]},{key:"bsc",chainId:56,name:"BNB Smart Chain",rpcEnv:["BSC_RPC_URL","BNB_RPC_URL"],nativeCurrency:{symbol:"BNB",decimals:18},explorer:"https://bscscan.com",dexscreenerSlug:"bsc",venueKind:"uniswap-v3",wrappedNative:"0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c",venues:[{kind:"quoter",address:"0x78D78E420Da98ad378D7799bE8f4AF69033EB077",label:"Uniswap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle returned a live sane price (WBNB->USDC fee 500 quoted 413.86 USDC). A contract that correctly prices a known pair IS a working V3 quoter",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:56}},{kind:"router",address:"0xB971eF87ede563556b2ED4b1C0b0019111Dd85d2",label:"Uniswap V3 SwapRouter02",verified:{method:"eth_getCode returned real bytecode on this chain and the paired quoter at the same deployment passed a live functional quote",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:56}}]},{key:"polygon",chainId:137,name:"Polygon",rpcEnv:["POLYGON_RPC_URL","POLYGON_RPC"],nativeCurrency:{symbol:"POL",decimals:18},explorer:"https://polygonscan.com",dexscreenerSlug:"polygon",venueKind:"uniswap-v3",wrappedNative:"0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270",venues:[{kind:"quoter",address:"0x61fFE014bA17989E743c5F6cB21bF9697530B21e",label:"Uniswap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle returned a live sane price (WMATIC->USDC fee 500 quoted 0.0720 USDC). A contract that correctly prices a known pair IS a working V3 quoter",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:137}},{kind:"router",address:"0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45",label:"Uniswap V3 SwapRouter02",verified:{method:"eth_getCode returned real bytecode on this chain and the paired quoter at the same deployment passed a live functional quote",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:137}}]},{key:"stable",chainId:988,name:"Stable Mainnet",rpcEnv:["STABLE_RPC_URL","STABLE_RPC"],nativeCurrency:{symbol:"USDT0",decimals:18},venueKind:"uniswap-v3",wrappedNative:"0x5d442b349590a6048Eb2dC0eC346cAA5F47A9ab5",venues:[{kind:"quoter",address:"0xb070179E7032CdA868b53e6C1742F80c9e940d1A",label:"Uniswap V3 QuoterV2 (canonical)",verified:{method:"Stable is on the OFFICIAL Uniswap v3 Deployments List (governance-recognised 2026-05-12, UAC process completed 2026-04, deployed by Protofire), so this is a canonical deployment rather than a fork. eth_getCode returned 8273 bytes, the same size as the canonical quoter on the seven already-verified chains. Functional probe on a live pool (TOAST -> USDT0, fee 10000): 100 in -> 0.000003, 1000 -> 0.000031, 10000 -> 0.000319 USDT0. Output scales monotonically with input, which is a working quoter answering, not a revert. Two of three sampled pools carry non-zero liquidity. NOTE: the pools discovered so far are thin, so real routing size is limited -- the venue is proved, deep liquidity is not.",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-08-05",chainId:988}},{kind:"router",address:"0x32eaf9B5d5F2CD7361c5012890C943D7de84C22a",label:"Uniswap SwapRouter02 (canonical)",verified:{method:"eth_getCode returned 24497 bytes. Cross-checked on-chain rather than trusted from docs: router.factory() returns 0x88f0a512ef09175d456bc9547f914f48c013e4aa, the same v3 core factory that created the pools quoted above, and router.WETH9() returns the wrappedNative recorded on this chain entry. Address published in the Stable docs DEX reference and the Uniswap deployments list.",source:"docs.stable.xyz/en/reference/dexes + on-chain factory()/WETH9() round-trip",date:"2026-08-05",chainId:988}}]},{key:"hyperevm",chainId:999,name:"HyperEVM",rpcEnv:["HYPEREVM_RPC_URL","HYPER_EVM_RPC"],nativeCurrency:{symbol:"HYPE",decimals:18},dexscreenerSlug:"hyperevm",venueKind:"uniswap-v3",wrappedNative:"0x5555555555555555555555555555555555555555",venues:[{kind:"quoter",address:"0x03A918028f22D9E1473B7959C927AD7425A45C7C",label:"HyperSwap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle(1 WHYPE -> USDT0) returned live output on all four fee tiers (100: 57.3385, 500: 57.4187, 3000: 57.3237, 10000: 56.1963 USDT0). Decimals read on-chain: WHYPE 18, USDT0 6. Best tier checked against an INDEPENDENT control the same minute -- Hyperliquid allMids put HYPE at 57.3205, so the pool is 0.171% from the perp mid, which is the right shape for fee plus impact rather than a wrong contract or a decimals bug.",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-08-05",chainId:999}},{kind:"router",address:"0x4E2960a8cd19B467b82d26D83fAcb0fAE26b094D",label:"HyperSwap V3 SwapRouter",verified:{method:"eth_getCode returned 12070 bytes, and it is the router paired with the quoter proved above -- the same pair already shipped in UNI_V3_VENUES[999].hyperswap, which is the map the quote/prepare path actually routes through.",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-08-05",chainId:999}}]},{key:"abstract",chainId:2741,name:"Abstract",rpcEnv:["ABSTRACT_RPC_URL","ABS_RPC_URL"],nativeCurrency:{symbol:"ETH",decimals:18},venueKind:"uniswap-v3",wrappedNative:"0x3439153EB7AF838Ad19d56E1571FBD09333C2809",venues:[{kind:"quoter",address:"0x728BD3eC25D5EDBafebB84F3d67367Cd9EBC7693",label:"Uniswap V3 QuoterV2 (Abstract deployment)",verified:{method:"Abstract is a ZK-stack chain, so CREATE2 addresses differ and the canonical Uniswap addresses are NOT valid here -- probing them returns codesize 0, which is what previously made this chain look like it had no V3 at all. Found the real deployment from live traffic instead: scanned recent Swap(...) logs, took the busiest pool, read pool.factory() = 0xa1160e73b63f322ae88cc2d8e700833e71d0b2a1, then enumerated that factory's deployer (0xf3d63166F0Ca56C3c1A3508FcE03Ff0Cf3Fb691e) and probed each of its 56 contracts with a real quoteExactInputSingle call. Exactly one answered: 1 WETH -> 1846.475731 USDC.e at fee 500. Independent sanity check: the pool's own slot0() spot price is 1873.11 USDC.e per WETH, so the quoter sits ~1.4% below spot, the right shape for fee plus price impact on this size.",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-08-05",chainId:2741}},{kind:"router",address:"0x7712FA47387542819d4E35A23f8116C90C18767C",label:"Uniswap SwapRouter02 (Abstract deployment)",verified:{method:"eth_getCode returned 167392 bytes and the runtime contains the exactInputSingle selector. router.factory() matches the factory proved above and router.WETH9() matches the wrappedNative on this entry. Chosen over its byte-identical twin (0xfD6257F4...) because this is the address real users actually route through: it appeared as tx.to on live swaps against the WETH/USDC.e pool.",source:"on-chain factory()/WETH9() round-trip + live swap tx.to sampling",date:"2026-08-05",chainId:2741}}]},{key:"robinhood",chainId:4663,name:"Robinhood Chain",rpcEnv:["RH_CHAIN_RPC","ROBINHOOD_RPC_URL"],nativeCurrency:{symbol:"ETH",decimals:18},dexscreenerSlug:"robinhood",venueKind:"uniswap-v3",wrappedNative:"0x0bd7d308f8e1639fab988df18a8011f41eacad73",venues:[{kind:"quoter",address:"0x33e885ed0ec9bf04ecfb19341582aadcb4c8a9e7",label:"Uniswap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle returned a live sane price (WETH->USDG fee 100 quoted 1866.58 USDG, and USDG->CASHCAT fee 10000 quoted a live amount). A contract that correctly prices known pairs IS a working V3 quoter",source:"live eth_call against rpc.mainnet.chain.robinhood.com",date:"2026-07-31",chainId:4663}},{kind:"router",address:"0xcaf681a66d020601342297493863e78c959e5cb2",label:"Uniswap V3 SwapRouter02",verified:{method:"eth_getCode returned real bytecode (24497 bytes) on this chain and the paired quoter at the same deployment passed a live functional quote",source:"live eth_getCode against rpc.mainnet.chain.robinhood.com",date:"2026-07-31",chainId:4663}},{kind:"factory",address:"0x1f7d7550b1b028f7571e69a784071f0205fd2efa",label:"Uniswap V3 Factory",verified:{method:"eth_getCode returned real bytecode (24535 bytes) and a PoolCreated log scan over this factory returned 76 pools in ~9000 recent blocks",source:"live eth_getLogs against rpc.mainnet.chain.robinhood.com",date:"2026-07-31",chainId:4663}}]},{key:"base",chainId:8453,name:"Base",rpcEnv:["BASE_RPC_URL"],nativeCurrency:{symbol:"ETH",decimals:18},explorer:"https://basescan.org",dexscreenerSlug:"base",venueKind:"uniswap-v3",wrappedNative:"0x4200000000000000000000000000000000000006",venues:[{kind:"quoter",address:"0x3d4e44Eb1374240CE5F1B871ab261CD16335B76a",label:"Uniswap V3 QuoterV2 (Base)",verified:{method:"functional probe: quoteExactInputSingle returned WETH->USDC at fee 500 = 1908.44 USDC, a live sane price. The canonical mainnet quoter address also has bytecode on Base but does NOT price this pair, which is exactly the false positive a codesize-only check accepts",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:8453}},{kind:"router",address:"0x2626664c2603336E57B271c5C0b26F421741e481",label:"Uniswap V3 SwapRouter02 (Base)",verified:{method:"eth_getCode returned real bytecode and the paired Base quoter passed a live functional quote",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:8453}},{kind:"router-v2",address:"0x4752ba5DBc23f44D87826276BF6Fd6b1C372aD24",label:"Uniswap V2 Router02 (Base)",verified:{method:"eth_getCode returned 17891 bytes; live getAmountsOut on WETH->USDC round-tripped to 98.75% (2x0.30% fee + impact)",source:"https://docs.uniswap.org/contracts/v2/reference/smart-contracts/v2-deployments",date:"2026-07-30",chainId:8453}}]},{key:"arbitrum",chainId:42161,name:"Arbitrum One",rpcEnv:["ARBITRUM_RPC_URL","ARB_RPC_URL"],nativeCurrency:{symbol:"ETH",decimals:18},explorer:"https://arbiscan.io",dexscreenerSlug:"arbitrum",venueKind:"uniswap-v3",wrappedNative:"0x82aF49447D8a07e3bd95BD0d56f35241523fBab1",venues:[{kind:"quoter",address:"0x61fFE014bA17989E743c5F6cB21bF9697530B21e",label:"Uniswap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle returned a live sane price (WETH->USDC fee 500 quoted 1908.72 USDC). A contract that correctly prices a known pair IS a working V3 quoter",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:42161}},{kind:"router",address:"0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45",label:"Uniswap V3 SwapRouter02",verified:{method:"eth_getCode returned real bytecode on this chain and the paired quoter at the same deployment passed a live functional quote",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:42161}}]},{key:"avalanche",chainId:43114,name:"Avalanche C-Chain",rpcEnv:["AVALANCHE_RPC_URL","AVAX_RPC_URL"],nativeCurrency:{symbol:"AVAX",decimals:18},explorer:"https://snowtrace.io",dexscreenerSlug:"avalanche",venueKind:"uniswap-v3",wrappedNative:"0xB31f66AA3C1e785363F0875A1B74E27b85FD66c7",venues:[{kind:"quoter",address:"0xbe0F5544EC67e9B3b2D979aaA43f18Fd87E6257F",label:"Uniswap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle returned a live sane price (WAVAX->USDC fee 500 quoted 6.48 USDC). A contract that correctly prices a known pair IS a working V3 quoter",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:43114}},{kind:"router",address:"0xbb00FF08d01D300023C629E8fFfFcb65A5a578cE",label:"Uniswap V3 SwapRouter02",verified:{method:"eth_getCode returned real bytecode on this chain and the paired quoter at the same deployment passed a live functional quote",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:43114}}]}])});import{Interface as Ol,getAddress as Fg,id as Tl}from"ethers";function jt(e){return e?.cache===!1?!1:!e?.fetchImpl||e.cache===!0}function $s(e,t,r){let n=e.get(t);return n?Date.now()-n.at>r?(e.delete(t),null):n:null}function _n(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 ty(e,t){try{return Fg(e).toLowerCase()}catch{throw new Error(`${t} must be a valid EVM address`)}}function ry(e){return`0x${e.slice(2).toLowerCase().padStart(64,"0")}`}function Cl(e){return`0x${String(e).slice(-40).toLowerCase()}`}function ny({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>Qg)return"stale"}return"scoped"}function oy(e,t,r){if(r)return"UNLIMITED";if(t==null)return e.toString();let n=10n**BigInt(t),o=e/n,s=e%n;if(s===0n)return o.toLocaleString("en-US");let i=s.toString().padStart(t,"0").replace(/0+$/,"").slice(0,6);return`${o.toLocaleString("en-US")}${i?`.${i}`:""}`}async function sy(e,t,r,n){let o=`${e}:${t}`,s=n?.get(o);if(s)return s;if(jt(r)){let a=$s(Il,o,Yg);if(a)return a.value}let i=(async()=>{let a=async l=>{try{let d=El.encodeFunctionData(l,[]),f=await te(e,"eth_call",[{to:t,data:d},"latest"],r);return!f||f==="0x"?null:El.decodeFunctionResult(l,f)[0]}catch{return null}},[c,u]=await Promise.all([a("decimals"),a("symbol")]),p={decimals:c==null?null:Number(c),symbol:u==null?null:String(u).slice(0,24)};return jt(r)&&_n(Il,o,p,Zg),p})();return n?.set(o,i),i}async function iy(e,t,r){let n=Math.min(Math.max(Number(r.lookbackBlocks)||Dg,1),Mg),o=await an(e,r);if(!Number.isFinite(o))throw new Error("chain head unavailable");let s=Math.max(0,o-n),i=await te(e,"eth_getLogs",[{fromBlock:`0x${s.toString(16)}`,toBlock:"latest",topics:[Lg,ry(t)]}],r);if(!Array.isArray(i))throw new Error("log scan returned no array");let a=new Map;for(let c of i){let u=String(c?.address||"").toLowerCase(),p=c?.topics?.[2];!u||!p||a.set(`${u}:${Cl(p)}`,{token:u,spender:Cl(p)})}return{pairs:[...a.values()],fromBlock:s,toBlock:o}}function ay(e){return(Wg[e]||[]).flatMap(r=>Hg.map(n=>({token:r.address,spender:n.address,symbol:r.symbol,decimals:r.decimals})))}async function cy(e,t,r={}){let n=[],o="direct-probe",s=null,i=ay(e),a=Ps(e),c=jt(r)&&$s(Rs,e,Jg)?.value===!1;if(i.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 iy(e,t,r);n=u.pairs,o="log-scan",s={fromBlock:u.fromBlock,toBlock:u.toBlock},jt(r)&&_n(Rs,e,!0,64)}catch{if(jt(r)&&_n(Rs,e,!1,64),n=i,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,l=(await qr(n,r.concurrency||4,async f=>{try{let m=await Wc({chainId:e,token:f.token,owner:t,spender:f.spender},r),y=BigInt(m.allowance);if(y<=0n)return null;let g=f.symbol?{symbol:f.symbol,decimals:f.decimals??null}:await sy(e,f.token,r,u),b=y>=Gg,S=jg[f.spender]||null;return{id:`${e}:${f.token}:${f.spender}`,chainId:e,standard:"erc20",token:f.token,tokenSymbol:g.symbol,decimals:g.decimals,spender:f.spender,spenderLabel:S,allowance:y.toString(),allowanceDisplay:oy(y,g.decimals,b),unlimited:b,lastActivityAt:null,risk:ny({unlimited:b,spenderLabel:S,lastActivityAt:null})}}catch{return null}})).filter(Boolean),d=await ly(e,t,r);return{scan:{chainId:e,status:"ok",method:o,pairsProbed:n.length,collectionsProbed:Ps(e).length,...s||{}},approvals:[...l,...d]}}catch(u){return{scan:{chainId:e,status:"unavailable",method:o,error:String(u?.message||u).slice(0,200)},approvals:[]}}}async function uy(e,t,r,n,o){try{let s=Al.encodeFunctionData("isApprovedForAll",[r,n]),i=await te(e,"eth_call",[{to:t,data:s},"latest"],o);return!i||i==="0x"?null:!!Al.decodeFunctionResult("isApprovedForAll",i)[0]}catch{return null}}function Ps(e){return(Vg[e]||[]).flatMap(r=>zg.map(n=>({collection:r.address,collectionName:r.name,operator:n.address,operatorLabel:n.label})))}async function ly(e,t,r){let n=Ps(e);return n.length===0?[]:(await qr(n,r.concurrency||4,async s=>await uy(e,s.collection,t,s.operator,r)!==!0?null:{id:`${e}:${s.collection}:${s.operator}:all`,chainId:e,standard:"erc721",token:s.collection,tokenSymbol:s.collectionName,decimals:null,spender:s.operator,spenderLabel:s.operatorLabel,allowance:null,allowanceDisplay:"ALL ITEMS",unlimited:!0,lastActivityAt:null,risk:"operator-all"})).filter(Boolean)}async function Nl(e={},t={}){let r=ty(e.owner||e.address,"owner"),n=new Map(vr.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()],s=`${r}:${[...o].sort((f,m)=>f-m).join(",")}:${e.lookbackBlocks??""}`,i=jt(t)&&!e.refresh;if(i){let f=$s(_l,s,Xg);if(f)return{...f.value,cached:!0,cachedAgeMs:Date.now()-f.at}}let a=await qr(o,e.concurrency||3,f=>cy(f,r,{...t,lookbackBlocks:e.lookbackBlocks})),c=a.flatMap(f=>f.approvals),u=a.map(f=>f.scan),p=u.find(f=>f.method==="log-scan"&&f.toBlock),l=u.some(f=>f.method==="direct-probe"&&f.status==="ok"),d={provider:"approvals",operation:"scan",readOnly:!0,queriedAt:new Date().toISOString(),owner:r,scannedRange:p?`last ${p.toBlock-p.fromBlock} blocks`:l?"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 i&&_n(_l,s,d,ey),{...d,cached:!1,cachedAgeMs:0}}var El,Al,Lg,Vv,Dg,Mg,jg,Hg,zg,Vg,Wg,Kg,Gg,Qg,Yg,Jg,Xg,Zg,ey,Il,Rs,_l,Rl=E(()=>{Ns();z();rt();El=new Ol(["function decimals() view returns (uint8)","function symbol() view returns (string)"]),Al=new Ol(["function isApprovedForAll(address owner, address operator) view returns (bool)","function name() view returns (string)"]),Lg=Tl("Approval(address,address,uint256)"),Vv=Tl("ApprovalForAll(address,address,bool)"),Dg=1e4,Mg=2e5,jg=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)"}),Hg=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"}]),zg=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"}]),Vg=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"}]}),Wg=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}]}),Kg=(1n<<256n)-1n,Gg=Kg/2n,Qg=4320*60*60*1e3,Yg=360*60*1e3,Jg=600*1e3,Xg=45*1e3,Zg=512,ey=128,Il=new Map,Rs=new Map,_l=new Map});var ql={};Q(ql,{aggregateBridgeQuotes:()=>Pl,bridgeAggregatorHealth:()=>py,checkRevokeNeeded:()=>$l,scanBridgeRoutes:()=>dy});async function Pl(e={}){let{fromChainId:t,toChainId:r,tokenIn:n,tokenOut:o,amount:s,taker:i,fromSymbol:a="?",toSymbol:c="?",fromDecimals:u=18,toDecimals:p=18}=e,l=[],d=[],f=Ku({srcChainId:t,srcChainTokenIn:n,srcChainTokenInAmount:s,dstChainId:r,dstChainTokenOut:o}).then(h=>h.error?(d.push(`debridge: ${h.error}`),null):{provider:"debridge",amountOut:h.estimation?.dstChainTokenOut?.amount??h.estimation?.toAmount,feeUsd:h.estimation?.fixFee??h.fixFee,estimatedTime:h.estimation?.execution?.estimatedTransferTime?`${h.estimation.execution.estimatedTransferTime}s`:"unknown",preparable:!0,raw:h}).catch(h=>(d.push(`debridge: ${h.message}`),null)),m=xr({fromChainId:t,toChainId:r,tokenIn:n,tokenOut:o,amountIn:s,taker:i}).then(h=>!h||h.error?(d.push(`lifi: ${h?.error??"no route"}`),null):{provider:"lifi-relay",amountOut:h.amountOut??h.quote?.amountOut,feeUsd:h.feeUsd??h.totalFee,estimatedTime:h.estimatedTime??h.duration??"unknown",preparable:!!h.transaction,raw:h}).catch(h=>(d.push(`lifi: ${h.message}`),null)),y=tl({fromChain:t,toChain:r,fromToken:n,toToken:o,fromAmount:s,fromAddress:i}).then(h=>h.error?(d.push(`squid: ${h.error}`),null):{provider:"squid",amountOut:h.toAmount,feeUsd:Array.isArray(h.fee)?h.fee.reduce((w,O)=>w+(Number(O.amountUsd)||0),0):null,estimatedTime:"30s - 3min",preparable:!1,raw:h}).catch(h=>(d.push(`squid: ${h.message}`),null)),g=nl({srcChainId:t,dstChainId:r,token:n,amount:s}).then(h=>h.error?(d.push(`stargate: ${h.error}`),null):{provider:"stargate",amountOut:h.amountOut,feeUsd:h.fee,estimatedTime:h.estimatedTime||"1-5 min",preparable:!1,raw:h}).catch(h=>(d.push(`stargate: ${h.message}`),null)),b=sl({fromAsset:a,toAsset:c,amount:s,destination:i}).then(h=>h.error?(d.push(`thorchain: ${h.error}`),null):{provider:"thorchain",amountOut:h.expectedAmountOut,feeUsd:h.fees?.total,estimatedTime:h.estimatedTime||"10-30 min",preparable:!1,raw:h}).catch(h=>(d.push(`thorchain: ${h.message}`),null)),S=(async()=>{if(!a||!c||a==="?"||c==="?")return d.push("changenow: ticker symbols required, skipping"),null;try{let h=await Xu({fromTicker:a,toTicker:c,fromAmount:s});return h.error?(d.push(`changenow: ${h.error}`),null):{provider:"changenow",amountOut:h.toAmount,feeUsd:h.networkFee,estimatedTime:h.flow==="standard"?"5-30 min":"instant",preparable:!1,kycRequired:h.kycRequired,raw:h}}catch(h){return d.push(`changenow: ${h.message}`),null}})(),C=al({fromChainId:t,toChainId:r,fromToken:n,toToken:o,fromAmount:s,userAddress:i}).then(h=>h.error?(d.push(`bungee: ${h.error}`),null):{provider:"bungee",amountOut:h.amountOut,feeUsd:h.feeUsd,estimatedTime:h.estimatedTime,preparable:!1,raw:h}).catch(h=>(d.push(`bungee: ${h.message}`),null)),x=ul({originDomain:t,destinationDomain:r,originToken:n,destinationToken:o,amount:s}).then(h=>h.error?(d.push(`connext: ${h.error}`),null):{provider:"connext",amountOut:h.amountOut,feeUsd:h.fee,estimatedTime:h.estimatedTime||"5-20 min",preparable:!1,raw:h}).catch(h=>(d.push(`connext: ${h.message}`),null)),I=dl({fromChain:t,toChain:r,token:n,amount:s}).then(h=>h.error?(d.push(`wormhole: ${h.error}`),null):{provider:"wormhole",amountOut:h.amountOut,feeUsd:h.fee,estimatedTime:h.estimatedTime||"5-15 min",preparable:!1,raw:h}).catch(h=>(d.push(`wormhole: ${h.message}`),null)),v=await Promise.allSettled([f,m,y,g,b,C,x,I,S]);for(let h of v)h.status==="fulfilled"&&h.value&&l.push(h.value);return l.sort((h,w)=>{let O=Number(h.amountOut??0),P=Number(w.amountOut??0);return O!==P?P-O:h.preparable&&!w.preparable?-1:!h.preparable&&w.preparable?1:0}),{providers:l.map(h=>h.provider),bestRoute:l[0]?.provider??"none",winner:l[0]??null,runnersUp:l.slice(1),errors:d.length?d:null}}async function $l({chainId:e,taker:t,tokenIn:r}={}){if(!e||!t)return{needsRevoke:!1,note:"no wallet to check"};try{let o=(await Nl({chainIds:[e],address:t})).approvals;if(!o?.length)return{needsRevoke:!1,note:"no active approvals found"};let s=r?o.find(i=>String(i.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 (${o.length} total approvals on chain)`}}catch(n){return{needsRevoke:!1,note:`revoke check unavailable: ${String(n.message||n).slice(0,100)}`}}}async function dy(e={}){let[t,r]=await Promise.all([Pl(e),$l({chainId:e.fromChainId,taker:e.taker,tokenIn:e.tokenIn})]),n=t.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:n.provider??"none",amountOut:n.amountOut,feeUsd:n.feeUsd,estimatedTime:n.estimatedTime,preparable:n.preparable?"yes":"no (manual send)",providers:t.providers,runnersUp:t.runnersUp,revokeCheck:r,errors:t.errors,confidence:t.providers.length>=2?.85:t.providers.length===1?.6:.1}}async function py(){let[e,t]=await Promise.all([Gu().catch(r=>({ok:!1,error:r.message})),Zu().catch(r=>({ok:!1,error:r.message}))]);return{debridge:e,changenow:t,lifi:{ok:!0,note:"integrated via router"}}}var yE,Bl=E(()=>{Dt();Qu();el();rl();ol();il();cl();ll();pl();Rl();yE=Object.freeze(["debridge","lifi-relay","squid","stargate","thorchain","bungee","connext","wormhole","changenow"])});var Ul={};Q(Ul,{DYDX_API:()=>Cn,dydxHealth:()=>hy,dydxMarkets:()=>fy,dydxOrderbook:()=>my});async function fy(e=50){try{return((await T(`${Cn}/v4/perpetualMarkets?limit=${e}`))?.markets||[]).map(r=>({ticker:r?.ticker,oraclePrice:r?.oraclePrice,indexPrice:r?.indexPrice,nextFundingRate:r?.nextFundingRate?`${(Number(r.nextFundingRate)*100).toFixed(4)}%`:null,openInterest:r?.openInterest,volume24h:r?.volume24H}))}catch(t){return{error:String(t.message||t).slice(0,200)}}}async function my(e){try{let t=await T(`${Cn}/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 hy(){try{return{ok:!0,serverTime:(await T(`${Cn}/v4/time`))?.iso}}catch(e){return{ok:!1,error:String(e.message||e).slice(0,160)}}}var Cn,Fl=E(()=>{z();Cn="https://api.dydx.exchange"});var Dl={};Q(Dl,{DRIFT_API:()=>Ll,driftHealth:()=>yy,driftMarkets:()=>gy});async function gy(){try{return((await T(`${Ll}/v2/markets`))?.markets||[]).map(t=>({symbol:t?.symbol||t?.marketIndex,oraclePrice:t?.amm?.oraclePrice,markPrice:t?.amm?.markPrice,fundingRate:t?.amm?.lastFundingRate?`${(Number(t.amm.lastFundingRate)*100).toFixed(4)}%`:null,openInterest:{long:t?.amm?.longFunding,short:t?.amm?.shortFunding},volume24h:t?.amm?.quoteAssetVolume}))}catch(e){return{error:String(e.message||e).slice(0,200)}}}async function yy(){try{return{ok:!0,note:"Drift v2 perps on Solana \u2014 public reads via dlob.drift.trade"}}catch(e){return{ok:!1,error:String(e.message||e).slice(0,160)}}}var Ll,Ml=E(()=>{z();Ll="https://dlob.drift.trade"});var jl={};Q(jl,{VERTEX_API:()=>On,vertexHealth:()=>xy,vertexMarkets:()=>by,vertexOrderbook:()=>wy});async function by(){try{return((await T(`${On}/query`,{method:"POST",body:JSON.stringify({all_markets:{}}),headers:{"content-type":"application/json"}}))?.data?.all_markets||[]).map(t=>({market:t?.market,type:t?.type,oraclePrice:t?.oracle_price_x18?(Number(BigInt(t.oracle_price_x18))/1e18).toFixed(4):null,minSize:t?.min_size,productId:t?.product_id}))}catch(e){return{error:String(e.message||e).slice(0,200)}}}async function wy(e){try{let r=(await T(`${On}/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)}}}async function xy(){try{return{ok:!0,status:(await T(`${On}/status`))?.status||"unknown"}}catch(e){return{ok:!1,error:String(e.message||e).slice(0,160)}}}var On,Hl=E(()=>{z();On="https://gateway.prod.vertexprotocol.com/v2"});var zl={};Q(zl,{pancakeHealth:()=>vy,pancakeQuote:()=>ky});async function ky({chainId:e=56,tokenIn:t,tokenOut:r,amountIn:n,fee:o=500}={}){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)},i=await T(`${Sy}/quote`,{method:"POST",body:JSON.stringify(s),headers:{"content-type":"application/json"}});return{amountOut:i?.amountOut,route:i?.route}}catch(s){return{error:String(s.message||s).slice(0,200)}}}async function vy(){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 Sy,Vl=E(()=>{z();Sy="https://api.thegraph.com/subgraphs/name/pancakeswap/exchange-v3-bsc"});var Kl={};Q(Kl,{sushiHealth:()=>Iy,sushiQuote:()=>Ay});async function Ay({chainId:e=1,tokenIn:t,tokenOut:r,amountIn:n,fee:o=500}={}){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 } }`,i=await T(`${Ey(e)}/quote?query=${encodeURIComponent(s)}`);return{amountOut:i?.data?.quote?.amountOut,route:i?.data?.quote?.route}}catch(s){return{error:String(s.message||s).slice(0,200)}}}async function Iy(){try{return{ok:!0,chains:Object.keys(Wl).length+" chains"}}catch(e){return{ok:!1,error:String(e.message||e).slice(0,160)}}}var Ey,Wl,Gl=E(()=>{z();Ey=e=>`https://api.thegraph.com/subgraphs/name/sushi-v3/v3-${Wl[e]||"ethereum"}`,Wl={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 Ql={};Q(Ql,{raydiumHealth:()=>Oy,raydiumQuote:()=>Cy});async function Cy({inputMint:e,outputMint:t,amount:r,slippageBps:n=50}={}){if(!e||!t||!r)return{error:"raydium quote requires inputMint, outputMint, amount"};try{let o=new URLSearchParams({inputMint:e,outputMint:t,amount:String(r),slippageBps:String(n),onlyDirectRoutes:"true"}),s=await T(`${_y}/quote?${o}`),i=(s?.routePlan||[]).filter(a=>a?.swapInfo?.label?.toLowerCase().includes("raydium"));return{amountOut:s?.outAmount,priceImpactPct:s?.priceImpactPct,raydiumRoutes:i.length,allRoutes:s?.routePlan?.length||0}}catch(o){return{error:String(o.message||o).slice(0,200)}}}async function Oy(){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 _y,Yl=E(()=>{z();_y="https://quote-api.jup.ag/v6"});var Jl={};Q(Jl,{AEVO_API:()=>qs,aevoHealth:()=>Ny,aevoMarkets:()=>Ty});async function Ty(){try{return(await T(`${qs}/markets`)||[]).map(t=>({instrument:t?.instrument_name,type:t?.instrument_type,markPrice:t?.mark_price,indexPrice:t?.index_price,fundingRate:t?.funding_rate?`${(Number(t.funding_rate)*100).toFixed(4)}%`:null,openInterest:t?.open_interest,volume24h:t?.volume_24h}))}catch(e){return{error:String(e.message||e).slice(0,200)}}}async function Ny(){try{return{ok:(await T(`${qs}/ping`))?.status==="ok"}}catch(e){return{ok:!1,error:String(e.message||e).slice(0,160)}}}var qs,Xl=E(()=>{z();qs="https://api.aevo.xyz"});var Zl={};Q(Zl,{compoundHealth:()=>$y,compoundMarkets:()=>Py});async function Py(){try{return((await T(`${Ry}/ctoken`))?.cToken||[]).map(t=>({symbol:t?.symbol,underlying:t?.underlying_symbol,supplyApy:t?.supply_rate?.value?`${(Number(t.supply_rate.value)*100).toFixed(2)}%`:null,borrowApy:t?.borrow_rate?.value?`${(Number(t.borrow_rate.value)*100).toFixed(2)}%`:null,totalSupply:t?.total_supply?.value,totalBorrow:t?.total_borrows?.value,collateralFactor:t?.collateral_factor?.value?`${(Number(t.collateral_factor.value)*100).toFixed(0)}%`:null}))}catch(e){return{error:String(e.message||e).slice(0,200)}}}async function $y(){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 Ry,ed=E(()=>{z();Ry="https://api.compound.finance/api/v2"});var td={};Q(td,{yearnHealth:()=>Uy,yearnVaults:()=>By});async function By(){try{return(await T(`${qy}/vaults/all`)||[]).map(t=>({name:t?.name,symbol:t?.symbol,apy:t?.apy?.net_apy?`${(Number(t.apy.net_apy)*100).toFixed(2)}%`:null,tvl:t?.tvl?.tvl_deposited,chain:t?.chainId,type:t?.type||"v2"}))}catch(e){return{error:String(e.message||e).slice(0,200)}}}async function Uy(){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 qy,rd=E(()=>{z();qy="https://api.yearn.fi/v1"});var nd={};Q(nd,{convexHealth:()=>Dy,convexPools:()=>Ly});async function Ly(){try{return(await T(`${Fy}/pools`)||[]).map(t=>({name:t?.curvePool?.name||t?.name,curveApy:t?.curvePool?.apy?`${(Number(t.curvePool.apy)*100).toFixed(2)}%`:null,convexApy:t?.apy?`${(Number(t.apy)*100).toFixed(2)}%`:null,tvl:t?.tvl,boosted:t?.boosted||!1}))}catch(e){return{error:String(e.message||e).slice(0,200)}}}async function Dy(){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 Fy,od=E(()=>{z();Fy="https://api.convexfinance.com/api"});function xt(e){if(!Number.isSafeInteger(e)||e<0||e>1e3)throw new RangeError("scale must be a safe integer from 0 through 1000")}function Me(e,t){if(typeof e!="bigint")throw new TypeError("mantissa must be a bigint");return xt(t),Object.freeze({mantissa:e,scale:t})}function st(e,t="value"){if(e===null||typeof e!="object")throw new TypeError(`${t} must be a fixed point value`);if(typeof e.mantissa!="bigint")throw new TypeError(`${t}.mantissa must be a bigint`);xt(e.scale)}function Tn(e){return xt(e),10n**BigInt(e)}function B(e){if(typeof e!="string"||!/^[+-]?\d+(?:\.\d+)?$/.test(e))throw new TypeError("value must be a plain decimal string");let t=e.startsWith("-"),r=e[0]==="-"||e[0]==="+"?e.slice(1):e,[n,o=""]=r.split("."),s=`${n}${o}`,i=BigInt(s)*(t?-1n:1n);return Me(i,o.length)}function he(e,t){if(xt(t),typeof e=="bigint")return Me(e,t);if(typeof e!="string"||!/^[+-]?\d+$/.test(e))throw new TypeError("value must be an integer string or bigint");return Me(BigInt(e),t)}function Te(e){st(e);let t=e.mantissa<0n,r=(t?-e.mantissa:e.mantissa).toString();if(e.scale===0)return`${t?"-":""}${r}`;let n=r.padStart(e.scale+1,"0"),o=n.length-e.scale;return`${t?"-":""}${n.slice(0,o)}.${n.slice(o)}`}function Er(e,t){return st(e),xt(t),t===e.scale?Me(e.mantissa,e.scale):t>e.scale?Me(e.mantissa*Tn(t-e.scale),t):Me(e.mantissa/Tn(e.scale-t),t)}function Bs(e,t){st(e,"left"),st(t,"right");let r=Math.max(e.scale,t.scale);return[Er(e,r),Er(t,r),r]}function it(e,t){let[r,n,o]=Bs(e,t);return Me(r.mantissa+n.mantissa,o)}function Ar(e,t){let[r,n,o]=Bs(e,t);return Me(r.mantissa-n.mantissa,o)}function be(e,t){st(e,"left"),st(t,"right");let r=e.scale+t.scale;return xt(r),Me(e.mantissa*t.mantissa,r)}function Ne(e,t,r=Math.max(e?.scale??0,t?.scale??0)){if(st(e,"left"),st(t,"right"),xt(r),t.mantissa===0n)throw new RangeError("division by zero");let n=e.mantissa*Tn(t.scale+r),o=t.mantissa*Tn(e.scale);return Me(n/o,r)}function at(e,t){let[r,n]=Bs(e,t);return r.mantissa<n.mantissa?-1:r.mantissa>n.mantissa?1:0}var CE,ke=E(()=>{CE=Object.freeze({mantissa:10000n,scale:0})});import{existsSync as id,readFileSync as My}from"node:fs";import{dirname as sd,join as Us}from"node:path";import{fileURLToPath as jy}from"node:url";function Hy(e){let t=sd(jy(e));for(let r=0;r<8;r+=1){let n=Us(t,"package.json");if(id(n))try{let s=JSON.parse(My(n,"utf8"));if(s&&typeof s.version=="string")return t}catch{}let o=sd(t);if(o===t)break;t=o}throw new Error(`oracle: could not resolve package root from ${e}`)}function ad(e,t){let r=Hy(t),n=Us(r,e);return id(n)?n:Us(r,"dist","assets",e)}var cd=E(()=>{});import{readFileSync as zy,existsSync as Vy}from"node:fs";import{fileURLToPath as Wy}from"node:url";import{dirname as Ky,join as ld}from"node:path";function Qy(){try{let e=ad("equities-fixtures",import.meta.url);if(e&&Vy(e))return e}catch{}return Gy}function Jy(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function H(e,t){throw new TypeError(`Fixture fixtures/${e}: ${t}`)}function oe(e,t,r){Jy(e)||H(t,`${r} must be an object`)}function V(e,t,r){(typeof e!="string"||e.length===0)&&H(t,`${r} must be a nonempty string`)}function je(e,t,r){Number.isSafeInteger(e)||H(t,`${r} must be a safe integer`)}function ct(e,t,r){oe(e,t,r);for(let[n,o]of Object.entries(e))V(n,t,`${r} key`),oe(o,t,`${r}.${n}`)}function Xy(e,t){oe(e,t,"root"),je(e.capturedAt,t,"capturedAt"),oe(e.venues,t,"venues");let r=[["hyperliquid_hip3","dexs"],["arcus","markets"],["arcus_spot","pairs"],["rh_uniswap","pools"],["rh_chainlink_oracles","assets"]];for(let[n,o]of r){let s=e.venues[n];oe(s,t,`venues.${n}`),V(s.type,t,`venues.${n}.type`),V(s.chain,t,`venues.${n}.chain`),V(s.tier,t,`venues.${n}.tier`),ct(s[o],t,`venues.${n}.${o}`)}for(let[n,o]of Object.entries(e.venues.hyperliquid_hip3.dexs))ct(o,t,`venues.hyperliquid_hip3.dexs.${n}`)}function Zy(e,t){ct(e,t,"root"),Object.keys(e).length===0&&H(t,"root must not be empty");for(let[r,n]of Object.entries(e))Array.isArray(n.venues)||H(t,`${r}.venues must be an array`),n.venues.forEach((o,s)=>V(o,t,`${r}.venues[${s}]`))}function eb(e,t){oe(e,t,"root");for(let r of["chainId","block","oracleScaleExp","usdgDecimals","equityDecimals"])je(e[r],t,r);V(e.usdg,t,"usdg"),ct(e.assets,t,"assets");for(let[r,n]of Object.entries(e.assets))V(n.oracle,t,`assets.${r}.oracle`),V(n.token,t,`assets.${r}.token`),(typeof n.rawPrice!="string"||!/^\d+$/.test(n.rawPrice))&&H(t,`assets.${r}.rawPrice must be an integer string`),(typeof n.usd!="number"||!Number.isFinite(n.usd)||n.usd<0)&&H(t,`assets.${r}.usd must be a nonnegative finite source number`)}function tb(e,t){oe(e,t,"root");for(let n of["holidayDayIndex","names","dates"])Array.isArray(e[n])||H(t,`${n} must be an array`);let r=e.holidayDayIndex.length;(e.names.length!==r||e.dates.length!==r)&&H(t,"holidayDayIndex, names, and dates must have equal lengths"),e.holidayDayIndex.forEach((n,o)=>je(n,t,`holidayDayIndex[${o}]`)),e.names.forEach((n,o)=>V(n,t,`names[${o}]`)),e.dates.forEach((n,o)=>{(typeof n!="string"||!/^\d{4}-\d{2}-\d{2}$/.test(n))&&H(t,`dates[${o}] must use YYYY-MM-DD`)})}function rb(e,t){oe(e,t,"root"),(!Array.isArray(e.dstTransitions)||e.dstTransitions.length===0)&&H(t,"dstTransitions must be a nonempty array");let r=new Set;e.dstTransitions.forEach((n,o)=>{oe(n,t,`dstTransitions[${o}]`);for(let s of["year","startUtc","endUtc"])je(n[s],t,`dstTransitions[${o}].${s}`);n.startUtc>=n.endUtc&&H(t,`dstTransitions[${o}] startUtc must be before endUtc`),r.has(n.year)&&H(t,`dstTransitions contains duplicate year ${n.year}`),r.add(n.year)})}function nb(e,t){ct(e,t,"root"),Object.keys(e).length===0&&H(t,"root must not be empty");for(let[r,n]of Object.entries(e)){for(let o of["addr","quote","quoteAddr","dex","pair"])V(n[o],t,`${r}.${o}`);(typeof n.liq!="number"||!Number.isFinite(n.liq)||n.liq<0)&&H(t,`${r}.liq must be a nonnegative finite source number`)}}function ob(e,t){oe(e,t,"root"),je(e.capturedAt,t,"capturedAt"),je(e.block,t,"block"),je(e.chainId,t,"chainId"),V(e.gasPriceWei,t,"gasPriceWei"),V(e.stateView,t,"stateView"),ct(e.pools,t,"pools"),Object.keys(e.pools).length===0&&H(t,"pools must not be empty");for(let[r,n]of Object.entries(e.pools)){for(let o of["pair","version","quote","token","sqrtPriceX96"])V(n[o],t,`pools.${r}.${o}`);n.version!=="v3"&&n.version!=="v4"&&H(t,`pools.${r}.version must be v3 or v4`),typeof n.quoteIsToken0!="boolean"&&H(t,`pools.${r}.quoteIsToken0 must be a boolean`),(!/^[0-9]+$/.test(n.sqrtPriceX96)||BigInt(n.sqrtPriceX96)<=0n)&&H(t,`pools.${r}.sqrtPriceX96 must be a positive integer string`)}}function sb(e,t){oe(e,t,"root"),je(e.capturedAt,t,"capturedAt"),V(e.source,t,"source"),oe(e.books,t,"books"),Object.keys(e.books).length===0&&H(t,"books must not be empty");for(let[r,n]of Object.entries(e.books)){oe(n,t,`books.${r}`),(!Array.isArray(n.bids)||!Array.isArray(n.asks))&&H(t,`books.${r} must have bids and asks arrays`);for(let[o,s]of n.bids.entries())oe(s,t,`books.${r}.bids[${o}]`),V(s.px,t,`books.${r}.bids[${o}].px`),V(s.sz,t,`books.${r}.bids[${o}].sz`);for(let[o,s]of n.asks.entries())oe(s,t,`books.${r}.asks[${o}]`),V(s.px,t,`books.${r}.asks[${o}].px`),V(s.sz,t,`books.${r}.asks[${o}].sz`)}}function ib(e,t){oe(e,t,"root"),je(e.capturedAt,t,"capturedAt"),V(e.source,t,"source"),V(e.chain,t,"chain"),ct(e.tokens,t,"tokens"),oe(e.pairs,t,"pairs"),Object.keys(e.tokens).length===0&&H(t,"tokens must not be empty");for(let[r,n]of Object.entries(e.tokens)){V(n.symbolRaw,t,`tokens.${r}.symbolRaw`),V(n.mint,t,`tokens.${r}.mint`),Object.hasOwn(e.pairs,r)||H(t,`pairs.${r} is required for token ${r}`),(!Array.isArray(e.pairs[r])||e.pairs[r].length===0)&&H(t,`pairs.${r} must be a nonempty array`);for(let[o,s]of e.pairs[r].entries())oe(s,t,`pairs.${r}[${o}]`),V(s.pairAddress,t,`pairs.${r}[${o}].pairAddress`),V(s.dexId,t,`pairs.${r}[${o}].dexId`),(typeof s.priceUsd!="number"||!Number.isFinite(s.priceUsd)||s.priceUsd<=0)&&H(t,`pairs.${r}[${o}].priceUsd must be a positive finite number`),(typeof s.liquidityUsd!="number"||!Number.isFinite(s.liquidityUsd)||s.liquidityUsd<0)&&H(t,`pairs.${r}[${o}].liquidityUsd must be a nonnegative finite number`)}}function ab(e,t){oe(e,t,"root"),je(e.capturedAt,t,"capturedAt"),V(e.source,t,"source"),V(e.chain,t,"chain"),e.chain!=="ton"&&H(t,'chain must be "ton"'),ct(e.tokens,t,"tokens"),oe(e.pairs,t,"pairs"),Object.keys(e.tokens).length===0&&H(t,"tokens must not be empty");for(let[r,n]of Object.entries(e.tokens)){V(n.symbolRaw,t,`tokens.${r}.symbolRaw`),V(n.mint,t,`tokens.${r}.mint`),Object.hasOwn(e.pairs,r)||H(t,`pairs.${r} is required for token ${r}`),(!Array.isArray(e.pairs[r])||e.pairs[r].length===0)&&H(t,`pairs.${r} must be a nonempty array`);for(let[o,s]of e.pairs[r].entries())oe(s,t,`pairs.${r}[${o}]`),V(s.pairAddress,t,`pairs.${r}[${o}].pairAddress`),V(s.dexId,t,`pairs.${r}[${o}].dexId`),(typeof s.priceUsd!="number"||!Number.isFinite(s.priceUsd)||s.priceUsd<=0)&&H(t,`pairs.${r}[${o}].priceUsd must be a positive finite number`),(typeof s.liquidityUsd!="number"||!Number.isFinite(s.liquidityUsd)||s.liquidityUsd<0)&&H(t,`pairs.${r}[${o}].liquidityUsd must be a nonnegative finite number`)}}function ub(e,t){let r=dd[t],n=ld(e,r),o;try{o=zy(n,"utf8")}catch(i){throw i?.code==="ENOENT"?new Error(`Fixture fixtures/${r} is missing at ${n}`):new Error(`Fixture fixtures/${r} could not be read: ${i.message}`)}let s;try{s=JSON.parse(o)}catch(i){throw new SyntaxError(`Fixture fixtures/${r} contains invalid JSON: ${i.message}`)}return cb[t](s,r),s}function pd(e){if(e!==null&&typeof e=="object"&&!Object.isFrozen(e)){Object.freeze(e);for(let t of Object.values(e))pd(t)}return e}function Fs({fixtureDir:e=Yy}={}){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(dd))t[r]=ub(e,r);return pd(t)}function Ge(){return ud??=Fs(),ud}function we(){return Ge().venues}function fd(){return Ge().universe}function md(){return Ge().oracles}function hd(){return Ge().nyseHolidays}function gd(){return Ge().dstTransitions}function Nn(){return Ge().rhPoolState}function yd(){return Ge().solanaXstocks}function bd(){return Ge().tonXstocks}function wd(){return Ge().hip3L2Books}var Gy,Yy,dd,cb,ud,Re=E(()=>{cd();Gy=ld(Ky(Wy(import.meta.url)),"fixtures");Yy=Qy(),dd=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"});cb=Object.freeze({venues:Xy,universe:Zy,oracles:eb,nyseHolidays:tb,dstTransitions:rb,equityDexPools:nb,rhPoolState:ob,solanaXstocks:ib,tonXstocks:ab,hip3L2Books:sb})});function pb(){let e=gd().dstTransitions.map(n=>({year:n.year,startMs:n.startUtc*Ds,endMs:n.endUtc*Ds}));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 _d(){return Sd??=pb(),Sd}function fb(){return Ls===void 0&&(Ls=new Set(hd().holidayDayIndex)),Ls}function Cd(e,t){if(!Number.isSafeInteger(e))throw new TypeError(`${t}: epochMs must be a safe integer number of milliseconds`)}function mb(e,t){let{coverageStartMs:r,coverageEndMs:n,firstYear:o,lastYear:s}=_d();if(e<r||e>=n)throw new RangeError(`${t}: ${new Date(e).toISOString()} is outside DST fixture coverage (${o} through ${s}). Refusing to assume a UTC offset.`)}function hb(e){for(let t of _d().rows)if(e>=t.startMs&&e<t.endMs)return!0;return!1}function gb(e){return hb(e)?db:lb}function yb(e){let t=e+gb(e),r=Math.floor(t/xd),n=t-r*xd,o=new Date(t);return{dayIndex:r,minuteOfDay:Math.floor(n/kd),msIntoDay:n,weekday:o.getUTCDay()}}function bb({dayIndex:e,weekday:t}){return t===0||t===6?!1:!fb().has(e)}function wb(e){return e<vd?"dark":e<Ed?"extended":e<Ad?"core":e<Id?"extended":"dark"}function Ir(e){Cd(e,"sessionState"),mb(e,"sessionState");let t=yb(e);return bb(t)?wb(t.minuteOfDay):"dark"}function js(e){return Cd(e,"isDark"),Ir(e)==="dark"}var Ds,kd,Ms,xd,lb,db,vd,Ed,Ad,Id,DE,ME,Sd,Ls,Rn=E(()=>{Re();Ds=1e3,kd=60*Ds,Ms=60*kd,xd=24*Ms,lb=-5*Ms,db=-4*Ms,vd=240,Ed=570,Ad=960,Id=1200,DE=Object.freeze([vd,Ed,Ad,Id]),ME=Object.freeze(["core","extended","dark"])});function $n(e,t){e.push(Object.freeze({venue:t.venue,symbol:t.symbol??null,reason:t.reason,evidence:t.evidence??null}))}function kb(e){let t=e.raw?.vol24h;return!!(t===0||t===0||typeof t=="number"&&Number.isFinite(t)&&t<=0)}function vb(e){return!e.bid||!e.ask?!1:at(e.bid,e.ask)>0}function Od(e,t,r){return Number.isSafeInteger(e.capturedAt)?t-e.capturedAt>r:!1}function qn(e,t={}){if(!Array.isArray(e))throw new TypeError("quotes must be an array");let r=t.nowMs??Date.now(),n=t.quoteFreshnessMs??xb,o=t.oracleFreshnessMs??Sb,s=t.includeDormant===!0,i=[],a=[];for(let c of e){if(kb(c)){s?i.push(Object.freeze({...c,staleData:!0})):$n(a,{venue:c.venue,symbol:c.symbolRaw??c.symbol,reason:Pn.DORMANT_VENUE,evidence:{vol24h:c.raw?.vol24h??null}});continue}if(vb(c)){$n(a,{venue:c.venue,symbol:c.symbolRaw??c.symbol,reason:Pn.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(Od(c,r,n)){$n(a,{venue:c.venue,symbol:c.symbolRaw??c.symbol,reason:Pn.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=Ir(r),p=u==="core"?o:o*2;if(Od(c,r,p)){$n(a,{venue:c.venue,symbol:c.symbolRaw??c.symbol,reason:Pn.STALE_ORACLE,evidence:{capturedAt:c.capturedAt,nowMs:r,session:u}});continue}}i.push(c)}return{survivors:i,excluded:a}}var Pn,xb,Sb,Hs=E(()=>{ke();Rn();Pn=Object.freeze({DORMANT_VENUE:"dormant-venue",CROSSED_BOOK:"crossed-book",STALE_QUOTE:"stale-quote",STALE_ORACLE:"stale-oracle"}),xb=12e4,Sb=6e5});function Eb(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),s=r.startsWith("-"),i=s?r.slice(1):r,[a,c=""]=i.split("."),u=`${a}${c}`,p=a.length+o,l;return p<=0?l=`0.${"0".repeat(-p)}${u}`:p>=u.length?l=`${u}${"0".repeat(p-u.length)}`:l=`${u.slice(0,p)}.${u.slice(p)}`,`${s?"-":""}${l}`}function ue(e){return e==null?null:typeof e=="string"?B(e):typeof e!="number"||!Number.isFinite(e)?null:B(Eb(e))}function Pe(e,t){let r=ue(e);if(r===null)throw new TypeError(`${t} must be a finite source number`);return r}var St=E(()=>{ke()});function X(e,t){throw new TypeError(`${e} ${t}`)}function Rd(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function kt(e,t){Rd(e)||X(t,"must be an object")}function Pd(e,t,r){Object.hasOwn(e,t)||X(`${r}.${t}`,"is required")}function Ht(e,t){(typeof e!="string"||e.length===0)&&X(t,"must be a nonempty string")}function _r(e,t,r){t.has(e)||X(r,`must be one of ${[...t].join(", ")}`)}function Vs(e,t){(!Number.isSafeInteger(e)||e<0)&&X(t,"must be a nonnegative safe integer")}function zs(e,t,r=!1){e===null&&r||(Rd(e)||X(t,"must be a fixed point value"),typeof e.mantissa!="bigint"&&X(`${t}.mantissa`,"must be a bigint"),(!Number.isSafeInteger(e.scale)||e.scale<0)&&X(`${t}.scale`,"must be a nonnegative safe integer"))}function Bn(e,t,r=!1){e===null&&r||kt(e,t)}function Nd(e,t){kt(e,t),Ht(e.venue,`${t}.venue`),Ht(e.reason,`${t}.reason`),Nb.test(e.reason)||X(`${t}.reason`,"must be a machine readable lower case code"),Object.hasOwn(e,"symbol")&&e.symbol!==null&&Ht(e.symbol,`${t}.symbol`)}function ge(e){kt(e,"quote");for(let r of["venue","chain","instrument","tier","symbolRaw","symbol","side","requestedSize",...Td,"costAccounted","capturedAt","blockOrSeq","raw"])Pd(e,r,"quote");Ht(e.venue,"quote.venue"),!(typeof e.chain=="string"&&e.chain.length>0)&&!(Number.isSafeInteger(e.chain)&&e.chain>=0)&&X("quote.chain","must be a nonempty string or nonnegative chain id"),_r(e.instrument,Ab,"quote.instrument"),_r(e.tier,Ib,"quote.tier"),Ht(e.symbolRaw,"quote.symbolRaw"),Ht(e.symbol,"quote.symbol"),_r(e.side,_b,"quote.side"),zs(e.requestedSize,"quote.requestedSize"),e.requestedSize.mantissa<0n&&X("quote.requestedSize","must not be negative");let t=0;for(let r of Tb)Object.hasOwn(e,r)&&(zs(e[r],`quote.${r}`),t+=1);t===0&&X("quote","must contain at least one of bid, ask, mid, mark");for(let r of Td)zs(e[r],`quote.${r}`,!0);if(typeof e.costAccounted!="boolean"&&X("quote.costAccounted","must be a boolean"),e.costAccounted){for(let r of["fees","gasEstimate","priceImpact"])e[r]===null&&X(`quote.${r}`,"cannot be unknown when costAccounted is true");e.instrument==="perp"&&e.fundingHourly===null&&X("quote.fundingHourly","cannot be unknown when costAccounted is true for a perp")}return e.instrument==="spot"&&e.fundingHourly!==null&&X("quote.fundingHourly","must be null for a spot quote"),Vs(e.capturedAt,"quote.capturedAt"),e.blockOrSeq!==null&&!(typeof e.blockOrSeq=="string"&&e.blockOrSeq.length>0)&&!(Number.isSafeInteger(e.blockOrSeq)&&e.blockOrSeq>=0)&&X("quote.blockOrSeq","must be null, a nonempty string, or a nonnegative safe integer"),kt(e.raw,"quote.raw"),e}function Un(e){kt(e,"rankResult");for(let t of["rankedOn","ranked","winner","runnersUp","improvementBps","sourcesAnswered","sourcesTried","failed","excluded","darkWindow","instrumentMix","bestPreparable"])Pd(e,t,"rankResult");return _r(e.rankedOn,Cb,"rankResult.rankedOn"),Array.isArray(e.ranked)||X("rankResult.ranked","must be an array"),e.ranked.forEach((t,r)=>Bn(t,`rankResult.ranked[${r}]`)),Bn(e.winner,"rankResult.winner",!0),e.ranked.length===0&&e.winner!==null&&X("rankResult.winner","must be null when ranked is empty"),e.ranked.length>0&&e.winner===null&&X("rankResult.winner","must be present when ranked is not empty"),Array.isArray(e.runnersUp)||X("rankResult.runnersUp","must be an array"),e.runnersUp.forEach((t,r)=>Bn(t,`rankResult.runnersUp[${r}]`)),e.improvementBps!==null&&!(typeof e.improvementBps=="number"&&Number.isFinite(e.improvementBps))&&X("rankResult.improvementBps","must be a finite number or null"),Vs(e.sourcesAnswered,"rankResult.sourcesAnswered"),Vs(e.sourcesTried,"rankResult.sourcesTried"),e.sourcesAnswered>e.sourcesTried&&X("rankResult.sourcesAnswered","must not exceed sourcesTried"),Array.isArray(e.failed)||X("rankResult.failed","must be an array"),e.failed.forEach((t,r)=>Nd(t,`failed[${r}]`)),Array.isArray(e.excluded)||X("rankResult.excluded","must be an array"),e.excluded.forEach((t,r)=>Nd(t,`excluded[${r}]`)),e.darkWindow!==null&&kt(e.darkWindow,"rankResult.darkWindow"),_r(e.instrumentMix,Ob,"rankResult.instrumentMix"),Bn(e.bestPreparable,"rankResult.bestPreparable",!0),Object.hasOwn(e,"carry")&&e.carry!==null&&kt(e.carry,"rankResult.carry"),e}var Ab,Ib,_b,Cb,Ob,Tb,Td,Nb,Qe=E(()=>{Ab=new Set(["spot","perp"]),Ib=new Set(["read-only","quote-only","prepare","intent"]),_b=new Set(["buy","sell"]),Cb=new Set(["net-of-cost","gross"]),Ob=new Set(["homogeneous","heterogeneous"]),Tb=["bid","ask","mid","mark"],Td=["fees","gasEstimate","priceImpact","fundingHourly"],Nb=/^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$/});function $d(){return we().venues.arcus}function qb(){return Object.keys($d().markets).sort()}function Bb({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=$d().markets[n];if(!o)return null;let s=Pe(o.mark,`${n}.mark`),i=ue(o.oracle),a=ue(o.fundingHourly),c=r===null?B("0"):r,u={venue:Rb,chain:Pb,instrument:"perp",tier:$b,symbolRaw:e,symbol:n,side:t,requestedSize:c,mark:s,fees:null,gasEstimate:null,priceImpact:null,fundingHourly:a,costAccounted:!1,capturedAt:we().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:Fn,initialMarginFraction:o.initialMarginFraction??null,offHoursInitialMarginFraction:o.offHoursInitialMarginFraction??null,reasonCostUnknown:"fees, gas, and impact at size not captured for Arcus perps"}};return i!==null&&(u.raw.oracleFixed=i),ge(u)}function Ln({side:e="buy",sizeUsd:t=null}={}){return qb().map(r=>Bb({symbol:r,side:e,sizeUsd:t})).filter(r=>r!==null)}var Rb,Pb,$b,Fn,Ws=E(()=>{Re();St();ke();Qe();Rb="arcus_perp",Pb="robinhood-4663",$b="quote-only",Fn="0.00000480324074074"});function Ks(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 B("0");let n=B(String(t)),o=he(10000n,0);return be(be(e,n),o)}function Bd(e,t,r={}){if(e.instrument!=="perp")return{model:"current-funding-held-constant",horizonHours:t,carryBps:B("0"),carryBpsDisplay:"0",confidence:"estimate",note:"spot has no funding carry"};let n=r.nowMs??Date.now(),o=r.applyDarkWindowLock===!0,s=e.fundingHourly;if(o&&s!==null){let a=Ub(n,t),c=t-a,u=B(Fn),p=Ks(s,c),l=Ks(u,a),d=Math.max(p.scale,l.scale),f={mantissa:p.mantissa*10n**BigInt(d-p.scale)+l.mantissa*10n**BigInt(d-l.scale),scale:d};return{model:"current-funding-held-constant",horizonHours:t,carryBps:f,carryBpsDisplay:Te(f),confidence:"estimate",darkHours:a,litHours:c,darkWindowRate:Fn,compounding:"ignored",compoundingErrorBoundNote:"simple sum; at 30d and 1e-5/h the ignored compound is under 0.5bp"}}if(s===null)return{model:"current-funding-held-constant",horizonHours:t,carryBps:null,carryBpsDisplay:null,confidence:"estimate",note:"funding rate unknown"};let i=Ks(s,t);return{model:"current-funding-held-constant",horizonHours:t,carryBps:i,carryBpsDisplay:Te(i),confidence:"estimate",compounding:"ignored",compoundingErrorBoundNote:"simple sum; at 30d and 1e-5/h the ignored compound is under 0.5bp"}}function Ub(e,t){if(t<=0)return 0;let r=0,n=Math.floor(t);for(let o=0;o<n;o+=1)js(e+o*qd)&&(r+=1);return t>n&&js(e+n*qd)&&(r+=t-n),r}var qd,oA,Ud=E(()=>{ke();Ws();Rn();qd=36e5,oA=24*365});function Fb(e){return e.mid??e.mark??e.ask??e.bid??null}function Lb(e){let t=Fb(e);if(t===null)return null;let r=e.costAccounted===!0,n=B("0");e.fees!==null?n=it(n,e.fees):r=!1,e.priceImpact!==null?n=it(n,e.priceImpact):e.requestedSize&&e.requestedSize.mantissa>0n&&(r=!1),e.gasEstimate===null?r=!1:n=it(n,e.gasEstimate);let o;if(e.fees!==null&&at(e.fees,B("1"))<0&&at(e.fees,B("0"))>=0){let s=it(B("1"),e.fees);o=be(t,s),e.priceImpact!==null&&(o=it(o,be(t,e.priceImpact)))}else o=it(t,n);return{net:o,costAccounted:r,px:t}}function Db(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 Mb(e,t){if(!e||!t||!e.costAccounted||!t.costAccounted||e.instrument!==t.instrument||e.net.mantissa===0n)return null;let r=Ar(t.net,e.net);return Ne(be(r,he(10000n,0)),t.net,4)}function Dn(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,s=[];if(!t.skipLiveness){let h=qn(e,{nowMs:r});o=h.survivors,s=h.excluded}let i=e.length,a=[],c=t.horizonHours,u=Number.isFinite(c)&&c>0,p=[];for(let h of o){let w=Lb(h);if(w===null)continue;let O=null;if(u&&h.instrument==="perp"&&(O=Bd(h,c,{nowMs:r}),O.carryBps!==null)){let P=it(B("1"),Ne(O.carryBps,he(10000n,0),12));w.net=be(w.net,P),w.costAccounted=!1}p.push(Db(h,w,O))}let l=p,d="homogeneous";if(u)d="heterogeneous",l=p;else{let h=p.filter(O=>O.instrument==="spot"),w=p.filter(O=>O.instrument==="perp");h.length>0&&w.length>0?(l=h.length>=w.length?h:w,d="homogeneous"):(l=p,d="homogeneous")}l.sort((h,w)=>{let O=at(h.net,w.net);return O!==0?O:h.venue<w.venue?-1:h.venue>w.venue?1:0});let f=l[0]??null,m=l.slice(1),y=l,g="gross";f&&f.costAccounted&&(m.length===0||m[0].costAccounted)&&(g="net-of-cost");let b=m.length===0?null:Mb(f,m[0]),S=p.find(h=>h.tier==="prepare")??null,C=Ir(r),x=C==="core"?null:{session:C,warning:C==="dark"?"market is dark; marks are not real price discovery":"extended session; thinner books and higher staleness risk"},I=null;u&&(I=jb(p));let v={rankedOn:g,ranked:y,winner:f,runnersUp:m,improvementBps:b===null?null:Number(Te(b)),sourcesAnswered:i,sourcesTried:n,failed:a,excluded:s,darkWindow:x,instrumentMix:d,bestPreparable:S,carry:f?.carry??null,breakEvenHorizonHours:I};return Un(v)}function jb(e){let t=e.filter(s=>s.instrument==="spot").sort((s,i)=>at(s.net,i.net))[0],r=e.filter(s=>s.instrument==="perp").sort((s,i)=>at(s.net,i.net))[0];if(!t||!r||r.fundingHourly===null)return null;let n=Ar(t.net,r.net);if(n.mantissa===0n)return 0;let o=be(r.fundingHourly,r.price);if(o.mantissa===0n)return null;try{let s=Ne(n,o,4),i=Number(Te(s));return!Number.isFinite(i)||i<0?null:i}catch{return null}}var Gs=E(()=>{Hs();Ud();Rn();ke();Qe()});function Qs(){return Nn()}function Gb(e){return{mantissa:e*e*10n**BigInt(zt)/Wb,scale:zt}}function Qb(e){let t=Gb(BigInt(e.sqrtPriceX96)),r=e.quote==="USDG"?6:18,n=18;if(e.quoteIsToken0){let o=Ne(be(t,he(10n**BigInt(r),0)),he(10n**BigInt(n),0),zt);return o.mantissa===0n?null:Ne(B("1"),o,zt)}return Ne(be(t,he(10n**BigInt(n),0)),he(10n**BigInt(r),0),zt)}function Yb(e){let t=md(),r=t.assets[e];return r?he(r.rawPrice,t.oracleScaleExp):null}function Jb(e,t){if(e===null||t===null||e.mantissa<=0n||t.mantissa<=0n)return null;let r={...e};return Ne(t,Xb(r,t),zt)}function Xb(e,t){let r=Math.max(e.scale,t.scale);return{mantissa:Er(e,r).mantissa+Er(t,r).mantissa,scale:r}}function Zb(e){let t=Qs(),r=Kb[e];return r?{wei:BigInt(t.gasPriceWei)*r,units:r,native:"ETH"}:null}function Ys(){return Object.keys(Qs().pools).sort()}function Vt({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=Qs(),o=n.pools[e];if(!o)return null;let s=Qb(o);if(s===null)return null;let i=ue(o.liqUsd),a=r===null?B("0"):r,c=o.feePpm===null||o.feePpm===void 0?null:Ne(he(BigInt(o.feePpm),0),he(1000000n,0),8),u=a.mantissa===0n?B("0"):Jb(i,a),p=Zb(o.version),f={venue:Hb,chain:zb,instrument:"spot",tier:Vb,symbolRaw:e,symbol:e,side:t,requestedSize:a,mid:s,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:p===null?null:p.wei.toString(),gasUnits:p===null?null:p.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=Yb(e);return m!==null&&(f.referencePrice=m,f.referenceBasisBps=Te(Ne(be(Ar(s,m),he(10000n,0)),m,4))),ge(f)}function Fd({side:e="buy",sizeUsd:t=null}={}){return Ys().map(r=>Vt({symbol:r,side:e,sizeUsd:t})).filter(r=>r!==null)}var Hb,zb,Vb,Wb,zt,Kb,Js=E(()=>{Re();St();ke();Qe();Hb="rh_uniswap",zb=4663,Vb="prepare",Wb=1n<<192n,zt=18,Kb=Object.freeze({v3:180000n,v4:240000n})});function Mn(e={}){let{symbol:t,side:r="buy",sizeUsd:n=null,recipient:o,nowMs:s=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 i=Vt({symbol:t,side:r,sizeUsd:n});if(i===null)throw new Error(`no RH Uniswap pool for ${t}`);if(i.tier!=="prepare")throw new Error(`route tier is ${i.tier}, only prepare tier can be prepared`);let a=s-i.capturedAt;if(a>Ld)throw new Error(`quote is stale (${a}ms old, bound ${Ld}ms); re-quote before preparing`);let u=Nn().pools[t],p=u.version==="v4"?tw:ew,l=p,d=r==="buy"?u.quoteAddr:u.token;return Object.freeze({artifactKind:"unsigned-tx",chainId:4663,to:p,data:"0x",value:"0",requiresApproval:{spender:l,token:d,amount:null},requiresWalletSignature:!0,backendSigner:!1,unsigned:!0,houseSigned:!1,quoteRef:{venue:i.venue,symbol:i.symbol,symbolRaw:i.symbolRaw,capturedAt:i.capturedAt,blockOrSeq:i.blockOrSeq,mid:i.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 Ld,ew,tw,Xs=E(()=>{Js();Re();Ld=12e4,ew="0x0000000000000000000000000000000000000000",tw="0x84b75b19A3cdf8E2F56d0507d22D442847B2053C"});function Cr(){return we().venues.hyperliquid_hip3}function Dd(){return Object.keys(Cr().dexs).sort()}function sw(){let e=[];for(let[t,r]of Object.entries(Cr().dexs))for(let n of Object.keys(r))e.push(`${t}:${n}`);return e.sort()}function iw(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),s=Cr().dexs[n]?.[o];return s?[{dex:n,ticker:o,market:s}]:[]}let r=[];for(let[n,o]of Object.entries(Cr().dexs))Object.hasOwn(o,e)&&r.push({dex:n,ticker:e,market:o[e]});return r}function aw(e,t){try{return wd().books[`${e}:${t}`]??null}catch{return null}}function cw(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(Te(r));if(!Number.isFinite(o)||o<=0)return null;let s=0,i=0,a=0;for(let c of n){let u=Number(c.px),p=Number(c.sz);if(!(u>0)||!(p>0))continue;let l=u*p,d=Math.min(o,l),f=d/u;if(s+=d,i+=f,o-=d,a+=1,o<=1e-9)break}return i<=0?null:{vwap:s/i,filledUsd:s,unfilledUsd:Math.max(0,o),levelsUsed:a}}function uw(e,t,r,n){let o=cw(e,t,r);if(!o)return{impact:null,depth:null};let s=Number(Te(n));if(!(s>0))return{impact:null,depth:o};let i=t==="buy"?(o.vwap-s)/s:(s-o.vwap)/s,a=Math.max(0,i);return{impact:ue(Number(a.toPrecision(12))),depth:{...o,impactFraction:a,fullyFilled:o.unfilledUsd<=1e-6}}}function Md({dex:e,ticker:t,market:r,side:n,size:o}){let s=Pe(r.mark,`${e}:${t}.mark`),i=ue(r.fundingHourly),a=ue(r.vol24h),c=ue(r.oi),u=o===null?B("0"):o,p=aw(e,t),l=null,d=null,f="fees and gas not captured";if(u.mantissa>0n)if(p){let g=uw(p,n,u,s);l=g.impact,d=g.depth,d?.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 p?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:rw,chain:nw,instrument:"perp",tier:ow,symbolRaw:`${e}:${t}`,symbol:t,side:n,requestedSize:u,mark:s,fees:null,gasEstimate:null,priceImpact:l,fundingHourly:i,costAccounted:!1,capturedAt:we().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:p!==null,l2BookFixture:p?"fixtures/hip3_l2books.json":null,depth:d}};return a!==null&&(y.raw.vol24hFixed=a),c!==null&&(y.raw.oiFixed=c),p?.bids?.[0]&&p?.asks?.[0]&&(y.bid=B(String(p.bids[0].px)),y.ask=B(String(p.asks[0].px))),ge(y)}function jd({symbol:e,side:t="buy",sizeUsd:r=null}={}){let n=iw(e);return n.length===0||n.length>1?null:Md({...n[0],side:t,size:r})}function jn({side:e="buy",sizeUsd:t=null,ticker:r=null}={}){let n=[];for(let o of sw()){let[s,i]=o.split(":");if(r!==null&&i!==r)continue;let a=Cr().dexs[s][i];n.push(Md({dex:s,ticker:i,market:a,side:e,size:t}))}return n}var rw,nw,ow,Hd=E(()=>{Re();St();ke();Qe();rw="hyperliquid_hip3",nw="hyperliquid",ow="quote-only"});function zd(){return we().venues.arcus_spot}function fw(){return Object.keys(zd().pairs).sort()}function mw({symbol:e,side:t="buy",sizeUsd:r=null}={}){if(typeof e!="string"||e.length===0)return null;let n=zd().pairs[e];if(!n)return null;let o=n.bid===void 0||n.bid===null?null:Pe(n.bid,`${e}.bid`),s=n.ask===void 0||n.ask===null?null:Pe(n.ask,`${e}.ask`),i=ue(n.last),a=null;if(o!==null&&s!==null){a={mantissa:o.mantissa+s.mantissa,scale:o.scale===s.scale?o.scale+1:Math.max(o.scale,s.scale)+1};let l=Math.max(o.scale,s.scale),d=o.scale===l?o.mantissa:o.mantissa*10n**BigInt(l-o.scale),f=s.scale===l?s.mantissa:s.mantissa*10n**BigInt(l-s.scale);a={mantissa:d+f,scale:l+1},a={mantissa:(d+f)/2n,scale:l}}else i!==null&&(a=i);if(o===null&&s===null&&a===null)return null;let c=r===null?B("0"):r,u=B("0"),p={venue:lw,chain:dw,instrument:"spot",tier:pw,symbolRaw:e,symbol:e,side:t,requestedSize:c,fees:u,gasEstimate:null,priceImpact:null,fundingHourly:null,costAccounted:!1,capturedAt:we().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&&(p.bid=o),s!==null&&(p.ask=s),a!==null&&(p.mid=a),ge(p)}function Hn({side:e="buy",sizeUsd:t=null}={}){return fw().map(r=>mw({symbol:r,side:e,sizeUsd:t})).filter(r=>r!==null)}var lw,dw,pw,Vd=E(()=>{Re();St();ke();Qe();lw="arcus_spot",dw="robinhood-4663",pw="quote-only"});function zn(){return yd()}function Zs(){return Object.keys(zn().tokens).sort()}function bw(e){let t=zn().pairs[e];return!t||t.length===0?null:[...t].sort((r,n)=>(n.liquidityUsd??0)-(r.liquidityUsd??0))[0]}function ww(e,t){if(e===null||t===null)return null;if(e.mantissa<=0n||t.mantissa<=0n)return B("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),s=o*10n**6n,i=n+o;return{mantissa:s/i,scale:6}}function ei({symbol:e,side:t="buy",sizeUsd:r=null}={}){if(typeof e!="string"||e.length===0)return null;let n=e,o=e,s=zn().tokens;if(Object.hasOwn(s,e))n=e,o=s[e].symbolRaw;else if(e.endsWith("x")||e.endsWith("X")){let m=e.slice(0,-1).toUpperCase();if(Object.hasOwn(s,m))n=m,o=s[m].symbolRaw;else return null}else return null;let i=s[n],a=bw(n);if(!i||!a)return null;let c=Pe(a.priceUsd,`${n}.priceUsd`),u=ue(a.liquidityUsd),p=r===null?B("0"):r,l=p.mantissa===0n?B("0"):ww(u,p),d=!1;p.mantissa===0n&&(a.liquidityUsd??0)>=Wd&&(d=!1);let f={venue:hw,chain:gw,instrument:"spot",tier:yw,symbolRaw:o,symbol:n,side:t,requestedSize:p,mid:c,fees:null,gasEstimate:null,priceImpact:l,fundingHourly:null,costAccounted:d,capturedAt:zn().capturedAt*1e3,blockOrSeq:null,raw:{fixture:"fixtures/solana_xstocks.json",mint:i.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)<Wd}};return ge(f)}function Kd({side:e="buy",sizeUsd:t=null}={}){return Zs().map(r=>ei({symbol:r,side:e,sizeUsd:t})).filter(r=>r!==null)}var hw,gw,yw,Wd,Gd=E(()=>{Re();St();ke();Qe();hw="solana_xstocks",gw="solana",yw="quote-only",Wd=25e3});function Vn(){return bd()}function ti(){return Object.keys(Vn().tokens).sort()}function Aw(e){let t=Vn().pairs[e];return!t||t.length===0?null:[...t].sort((r,n)=>(n.liquidityUsd??0)-(r.liquidityUsd??0))[0]}function Iw(e,t){if(e===null||t===null)return null;if(e.mantissa<=0n||t.mantissa<=0n)return B("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),s=o*10n**6n,i=n+o;return{mantissa:s/i,scale:6}}function ri({symbol:e,side:t="buy",sizeUsd:r=null}={}){if(typeof e!="string"||e.length===0)return null;let n=e,o=e,s=Vn().tokens;if(Object.hasOwn(s,e))n=e,o=s[e].symbolRaw;else if(e.endsWith("x")||e.endsWith("X")){let m=e.slice(0,-1).toUpperCase();if(Object.hasOwn(s,m))n=m,o=s[m].symbolRaw;else return null}else{let m=e.toUpperCase();if(Object.hasOwn(s,m))n=m,o=s[m].symbolRaw;else return null}let i=s[n],a=Aw(n);if(!i||!a)return null;let c=Pe(a.priceUsd,`${n}.priceUsd`),u=ue(a.liquidityUsd),p=r===null?B("0"):r,l=p.mantissa===0n?B("0"):Iw(u,p),f={venue:xw,chain:Sw,instrument:"spot",tier:kw,symbolRaw:o,symbol:n,side:t,requestedSize:p,mid:c,fees:null,gasEstimate:null,priceImpact:l,fundingHourly:null,costAccounted:!1,capturedAt:Vn().capturedAt*1e3,blockOrSeq:null,raw:{fixture:"fixtures/ton_xstocks.json",mint:i.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)<vw,impactSizeFractionHint:Ew}};return ge(f)}function Qd({side:e="buy",sizeUsd:t=null}={}){return ti().map(r=>ri({symbol:r,side:e,sizeUsd:t})).filter(r=>r!==null)}var xw,Sw,kw,vw,Ew,Yd=E(()=>{Re();St();ke();Qe();xw="ton_stonfi",Sw="ton",kw="quote-only",vw=25e3,Ew=.01});var Wn={};Q(Wn,{bestEquityRoute:()=>_w,collectEquityQuotes:()=>Xd,equityVenues:()=>Cw,getUniverse:()=>fd,getVenues:()=>we,loadFixtures:()=>Fs,prepareEquity:()=>Mn,prepareEquityRoute:()=>Ow,rankEquityQuotes:()=>Dn,toJsonSafe:()=>Tw,validateQuote:()=>ge,validateRankResult:()=>Un});function ni(e){return e==null||e===""?null:typeof e=="object"&&e&&typeof e.mantissa=="bigint"?e:B(String(e))}function Xd(e,{sizeUsd:t=null}={}){if(typeof e!="string"||!e.trim())throw new TypeError("ticker is required");let r=e.trim().toUpperCase(),n=ni(t),o=[],s=jd({symbol:`xyz:${r}`,sizeUsd:n});if(s)o.push(s);else for(let u of jn({ticker:r,sizeUsd:n}))o.push(u);for(let u of Ln({sizeUsd:n}))u.symbol===r&&o.push(u);for(let u of Hn({sizeUsd:n}))u.symbol===r&&o.push(u);let i=Vt({symbol:r,sizeUsd:n});i&&o.push(i);let a=ei({symbol:r,sizeUsd:n});a&&o.push(a);let c=ri({symbol:r,sizeUsd:n});return c&&o.push(c),o}function _w(e={}){let t=String(e.ticker||e.symbol||"").trim().toUpperCase();if(!t)throw new Error("bestEquityRoute requires ticker");let r=ni(e.sizeUsd??e.size??null),n=Xd(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,s=String(o).length<=10?o*1e3:o,i=e.nowMs==null,a=e.nowMs??o+1e3,c=Math.max(0,Date.now()-s),u=Dn(n,{nowMs:a,horizonHours:e.horizonHours!=null?Number(e.horizonHours):void 0,skipLiveness:e.skipLiveness===!0});return{ticker:t,...u,dataSource:i?"fixture":"caller-clock",capturedAt:s,ageMs:c,stale:c>Jd}}function Cw(){let e=[{venue:"hyperliquid_hip3",tier:"quote-only",chain:"hyperliquid",n:jn().length},{venue:"arcus_perp",tier:"quote-only",chain:"robinhood-4663",n:Ln().length},{venue:"arcus_spot",tier:"quote-only",chain:"robinhood-4663",n:Hn().length},{venue:"rh_uniswap",tier:"prepare",chain:4663,n:Ys().length},{venue:"solana_xstocks",tier:"quote-only",chain:"solana",n:Zs().length},{venue:"ton_stonfi",tier:"quote-only",chain:"ton",n:ti().length}],t=[...jn(),...Ln(),...Hn(),...Fd(),...Kd(),...Qd()],r=(t[0]?.capturedAt??Date.now())+1e3,{survivors:n,excluded:o}=qn(t,{nowMs:r});return{inventory:e,hip3Dexs:Dd(),liveness:{survivors:n.length,excluded:o.length,byReason:o.reduce((s,i)=>(s[i.reason]=(s[i.reason]??0)+1,s),{})},capturedAt:we().capturedAt,custody:"prepare-only",note:"quote-only venues are ranked for discovery; only rh_uniswap is preparable in v1"}}function Ow(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=ni(e.sizeUsd??e.size??null),o=Vt({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 s=String(o.capturedAt).length<=10?o.capturedAt*1e3:o.capturedAt,i=e.nowMs!=null,a=i?Number(e.nowMs):Date.now(),c=Math.max(0,Date.now()-s),u=Mn({symbol:t,sizeUsd:n,recipient:r,nowMs:a});return{ok:!0,ticker:t,artifact:u,bestPreparableVenue:"rh_uniswap",dataSource:i?"caller-clock":"live-clock",capturedAt:s,ageMs:c,stale:c>Jd}}catch(s){return{ok:!1,failureKind:"prepare-refused",ticker:t,error:String(s.message||s)}}}function Tw(e){return JSON.parse(JSON.stringify(e,(t,r)=>typeof r=="bigint"?r.toString():r))}var Jd,Kn=E(()=>{ke();Gs();Xs();Hs();Hd();Vd();Ws();Js();Gd();Yd();Re();Gs();Xs();Qe();Re();Jd=3600*1e3});var Gn={};Q(Gn,{CHAIN_CONFIGS:()=>vr,EVIDENCE:()=>F,RISK:()=>$,SCANNER_CAPABILITIES:()=>Ut,__clearScanners:()=>N0,createScanner:()=>du,getScanner:()=>O0,listScanners:()=>T0,registerBuiltinScanners:()=>kl,registerCustomChain:()=>vl,registerScanner:()=>pn,scannerCoverage:()=>R0,validateScanner:()=>lu});var Qn=E(()=>{bt();Ns()});import Zd from"node:fs";import oi from"node:process";import{fileURLToPath as Nw}from"node:url";import{homedir as to}from"node:os";import{join as ro}from"node:path";var fi=process.env.ORACLE_PUBLIC_DESKTOP==="1",no=fi?process.env.ORACLE_CONFIG_DIR||ro(to(),".config","oracle"):ro(to(),".config","oracle"),jw=fi?no:ro(to(),".config","mad-desk");function Qt(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}import Yt from"node:fs";import Jt from"node:path";var hi=/^0x[0-9a-fA-F]{40}$/,dp=new Set(["privatekey","private_key","secret","seed","mnemonic","passphrase","signature","keystore"]),pp=["privatekey","privkey","secretkey","secret","seedphrase","seed","mnemonic","passphrase","password","keystore","keymaterial","signature","wif","xprv","xpriv","apikey","bearer","credential"],fp=[/\b[5KL][1-9A-HJ-NP-Za-km-z]{50,51}\b/,/\bxprv[0-9A-Za-z]{50,}\b/,/\b(?:[a-z]{3,8}\s+){11,}[a-z]{3,8}\b/i],mp=/^\s*(?:0x)?[0-9a-fA-F]{64}\s*$/;function hp(e){return String(e).toLowerCase().replace(/[^a-z0-9]/g,"")}function gp(e,t){let r=hp(e);if(dp.has(String(e).toLowerCase())||pp.some(n=>r.includes(n)))throw new Error(`address-book: ${t} is forbidden; the book stores labels, never key material`)}function yp(e,t){if(typeof e=="string"&&(fp.some(r=>r.test(e))||mp.test(e)))throw new Error(`address-book: ${t} looks like key material; the book stores labels, never key material`)}function gi(){let e=Qt("ORACLE_ADDRESS_BOOK","MAD_ADDRESS_BOOK","");if(e)return Jt.resolve(e);let t=Qt("ORACLE_CONFIG_DIR","MAD_CONFIG_DIR",no);return Jt.join(t,"address-book.json")}function oo(e,t="field"){if(Array.isArray(e)){e.forEach((r,n)=>oo(r,`${t}[${n}]`));return}if(!e||typeof e!="object"){yp(e,t);return}for(let[r,n]of Object.entries(e))gp(r,r),oo(n,r)}function so(e){let t=String(e||"").trim();if(!hi.test(t))throw new Error("address-book: address must be 0x + 40 hex characters");return t.toLowerCase()}function vt(e,t){return e==null||e===""?null:String(e).slice(0,t)}function mi(){return{version:1,updatedAt:null,entries:[]}}function yi(e){return{address:String(e.address).toLowerCase(),label:vt(e.label,80)||"unknown",who:vt(e.who,120),role:vt(e.role,40),chainIds:Array.isArray(e.chainIds)?e.chainIds.map(Number).filter(Number.isFinite):[],notes:vt(e.notes,500),source:vt(e.source,80),firstSeenAt:e.firstSeenAt||null,lastSeenAt:e.lastSeenAt||null}}function Rr(){try{let e=JSON.parse(Yt.readFileSync(gi(),"utf8"));if(!e||typeof e!="object")return mi();let t=Array.isArray(e.entries)?e.entries:[];return{version:1,updatedAt:e.updatedAt||null,entries:t.filter(r=>r&&typeof r=="object"&&hi.test(String(r.address||""))).map(yi)}}catch{return mi()}}function bi(e){let t=gi();Yt.mkdirSync(Jt.dirname(t),{recursive:!0,mode:448});let r={...e,version:1,updatedAt:new Date().toISOString()},n=Jt.join(Jt.dirname(t),`.address-book.${process.pid}.tmp`);Yt.writeFileSync(n,`${JSON.stringify(r,null,2)}
7
- `,{mode:384}),Yt.renameSync(n,t);try{Yt.chmodSync(t,384)}catch{}return r}function wi(e={}){let t=Rr(),r=t.entries;if(e.role&&(r=r.filter(n=>n.role===String(e.role))),e.who){let n=String(e.who).toLowerCase();r=r.filter(o=>(o.who||"").toLowerCase().includes(n)||(o.label||"").toLowerCase().includes(n))}if(e.q){let n=String(e.q).toLowerCase();r=r.filter(o=>o.address.includes(n)||(o.label||"").toLowerCase().includes(n)||(o.who||"").toLowerCase().includes(n)||(o.notes||"").toLowerCase().includes(n))}return{updatedAt:t.updatedAt,count:r.length,entries:r}}function xi(e){let t=so(e),r=Rr().entries.filter(n=>n.address===t);return{address:t,found:r.length>0,entries:r}}function Si(e={}){oo(e);let t=so(e.address),r=vt(e.label??e.role,80)||"wallet",n=new Date().toISOString(),o=Rr(),s=o.entries.findIndex(u=>u.address===t&&u.label===r),i=yi({address:t,label:r,who:e.who,role:e.role,chainIds:e.chainIds,notes:e.notes,source:e.source||"agent",firstSeenAt:s>=0&&o.entries[s].firstSeenAt||n,lastSeenAt:n});s>=0?o.entries[s]=i:o.entries.push(i);let a=u=>u==="agent"?0:u==="owner"?1:2;o.entries.sort((u,p)=>a(u.role)-a(p.role)||u.label.localeCompare(p.label)||u.address.localeCompare(p.address));let c=bi(o);return{ok:!0,entry:i,count:c.entries.length}}function ki(e,t=null){let r=so(e),n=Rr(),o=n.entries.length;return n.entries=n.entries.filter(s=>s.address!==r?!0:t==null?!1:s.label!==String(t)),bi(n),{ok:!0,removed:o-n.entries.length,count:n.entries.length}}import{createInterface as bp}from"node:readline";var Be=Object.freeze({maxRequestBytes:256*1024,maxResponseBytes:2*1024*1024,maxTools:256,maxToolNameLength:64,maxArgumentBytes:128*1024,defaultCallTimeoutMs:3e4,maxCallTimeoutMs:6e4,maxConcurrentCalls:32}),wp=/^[A-Za-z0-9_-]{1,64}$/;function Pr(e,t){return{jsonrpc:"2.0",id:e??null,result:t}}function le(e,t,r){return{jsonrpc:"2.0",id:e??null,error:{code:t,message:r}}}function xp(e){return!!(e&&typeof e=="object"&&!Array.isArray(e)&&e.jsonrpc==="2.0"&&typeof e.method=="string"&&e.method.length>0)}function Sp(e){if(!Array.isArray(e))return[];let t=[],r=new Set;for(let n of e){if(t.length>=Be.maxTools)break;if(!n||typeof n!="object"||Array.isArray(n))continue;let o=typeof n.name=="string"?n.name.trim():"";!wp.test(o)||r.has(o)||(r.add(o),t.push(n))}return t}function kp(e){let t=Number(e)||Be.defaultCallTimeoutMs;return Math.min(Math.max(t,1),Be.maxCallTimeoutMs)}async function vp(e,t){let r;try{return await Promise.race([e,new Promise((n,o)=>{r=setTimeout(()=>{let s=new Error("tool call timed out");s.code="ORACLE_MCP_TIMEOUT",o(s)},t)})])}finally{clearTimeout(r)}}function io(e,t={}){let r=Sp(e?.tools),n=new Set(r.map(c=>c.name)),o=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",i=kp(t.callTimeoutMs),a=!1;return async function(u){let p=u?.id??null;if(!xp(u))return le(p,-32600,"invalid request");if(u.method==="initialize")return a=!0,Pr(p,{protocolVersion:u.params?.protocolVersion??"2025-03-26",capabilities:{tools:{}},serverInfo:{name:o,version:s}});if(u.method==="notifications/initialized")return null;if(u.method==="ping")return Pr(p,{});if(!a)return le(p,-32002,"server not initialized");if(u.method==="tools/list")return Pr(p,{tools:r});if(u.method==="tools/call"){let l=u.params?.name,d=u.params?.arguments??{};if(typeof l!="string"||!n.has(l))return le(p,-32602,"unknown tool");if(!d||typeof d!="object"||Array.isArray(d))return le(p,-32602,"tool arguments must be an object");let f;try{f=JSON.stringify(d)}catch{return le(p,-32602,"tool arguments are not serializable")}if(Buffer.byteLength(f)>Be.maxArgumentBytes)return le(p,-32602,"tool arguments exceeded the size limit");try{let m=await vp(Promise.resolve(e.call(l,d)),i);return Pr(p,m)}catch(m){if(m?.code==="ORACLE_MCP_TIMEOUT")return le(p,-32001,"tool call timed out");let y=typeof m?.message=="string"?m.message.replace(/\s+/g," ").trim():"",g=/\b(requires?|must be|missing|unknown|invalid|expected|unsupported|out of range|too (?:large|small|long|many)|not a|cannot convert)\b/i.test(y),b=/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(y.replace(/\btoken(?:In|Out|s\b)/g,"asset"));return g&&!b&&y.length<=200?le(p,-32e3,`tool call failed: ${y}`):le(p,-32e3,"tool call failed")}}return le(p,-32601,"method not found")}}function vi(e,t={}){let r=t.input||process.stdin,n=t.output||process.stdout,o=Math.min(Math.max(Number(t.maxRequestBytes)||Be.maxRequestBytes,64),Be.maxRequestBytes),s=Math.min(Math.max(Number(t.maxResponseBytes)||Be.maxResponseBytes,256),Be.maxResponseBytes),i=Math.min(Math.max(Number(t.maxConcurrentCalls)||Be.maxConcurrentCalls,1),Be.maxConcurrentCalls),a=i*8,c=io(e,t),u={closed:!1,inflight:0},p=bp({input:r,terminal:!1,crlfDelay:1/0}),l=0,d=[],f=!1,m=!1;function y(){if(u.closed||u.readerClosed)return;let x=u.inflight>=i||d.length>0||m;x&&!f?(f=!0,p.pause(),typeof r.pause=="function"&&r.pause()):!x&&f&&(f=!1,typeof r.resume=="function"&&r.resume(),p.resume())}function g(x){if(!x||u.closed)return;let I=JSON.stringify(x);Buffer.byteLength(I)>s&&(I=JSON.stringify(le(x.id,-32003,"response exceeded the size limit"))),n.write(`${I}
8
- `)===!1&&!m&&(m=!0,y(),n.once("drain",()=>{m=!1,S()}))}function b(x){u.inflight+=1,y(),Promise.resolve(c(x)).then(g).catch(()=>g(le(x?.id,-32603,"internal error"))).finally(()=>{u.inflight-=1,S()})}function S(){for(;!u.closed&&!m&&u.inflight<i&&d.length>0;)b(d.shift());y()}function C(){u.closed||(g(le(null,-32700,"request exceeded the size limit")),u.closed=!0,p.close(),typeof r.destroy=="function"&&r.destroy())}return r.on("data",x=>{if(u.closed)return;let I=String(x).split(`
9
- `);for(let v=0;v<I.length;v+=1){if(l+=Buffer.byteLength(I[v]),l>o){C();return}v<I.length-1&&(l=0)}}),p.on("line",x=>{if(u.closed)return;if(Buffer.byteLength(x)>o){C();return}let I;try{I=JSON.parse(x)}catch{g(le(null,-32700,"parse error"));return}if(d.length>=a){g(le(I?.id,-32e3,"server busy"));return}d.push(I),S()}),p.on("close",()=>{u.readerClosed=!0,t.exitOnClose!==!1&&(process.exitCode=0)}),u}var Ei=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"}}),Ep=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 Ye(e){return String(e??"").replaceAll("&","&amp;").replaceAll("<","&lt;").replaceAll(">","&gt;").replaceAll('"',"&quot;")}function ye(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 Xt(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 ye(o)}return`${r} raw`}return ye(e)}var Ap=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 Ip(e,t){let r=Number(t);return t!=null&&Number.isFinite(r)?r:Ap[String(e||"").toUpperCase()]}function Ai(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((l,d)=>l+(Number(d.amountUSD)||0),0)||null,p=(c.feeCosts||[]).reduce((l,d)=>l+(Number(d.amountUSD)||0),0)||null;o={best:{provider:n.tool||n.toolDetails?.name||"lifi",amountOut:c.toAmount,minOut:c.toAmountMin,gasUsd:u,feeUsd:p,decimalsOut:n.action?.toToken?.decimals},tokenIn:n.action?.fromToken?.symbol,tokenOut:n.action?.toToken?.symbol}}let s=[],i=(c,u,p={})=>{u==null||u===""||s.push({label:c,value:String(u),...p})},a=o.best||o.winner||o.topRoute||null;if(e==="swap"||e==="bridge"||e==="quote"){let c=a||o,u=Ip(o.tokenOut??o.buyToken,o.tokenOutDecimals??o.decimalsOut??c.tokenOutDecimals??c.decimalsOut);i("ROUTE",c.provider||c.venue||c.source||c.aggregator),o.tokenIn&&o.tokenOut&&i("PAIR",`${o.tokenIn} \u2192 ${o.tokenOut}`);let p=c.netOut??c.netOutput??c.amountOutNet??c.toAmountNet,l=c.amountOut??c.outAmount??c.toAmount??c.expectedOut,d=Xt(p,u);i(d!=null?"NET OUT":"EST OUT (GROSS)",d??Xt(l,u),{hero:!0}),i("GROSS OUT",p!==void 0&&l!==void 0&&String(p)!==String(l)?Xt(l,u):null),c.gasUsd!==void 0&&c.gasUsd!==null?i("GAS",`$${ye(c.gasUsd)}`):c.feeUsd!==void 0&&c.feeUsd!==null?i("GAS+FEES",`$${ye(c.feeUsd)}`):i("GAS","NOT PRICED IN",{warn:!0});let m=c.minOut??c.minAmountOut??c.minReceived;if(i("MIN RECEIVED",Xt(m,u)),c.slippageBps!==void 0&&c.slippageBps!==null)i("SLIPPAGE",`${c.slippageBps} bps`);else if(m!==void 0&&l!==void 0){let b=Number(l),S=Number(m);Number.isFinite(b)&&Number.isFinite(S)&&b>0&&S>0&&S<=b&&i("SLIPPAGE",`${((1-S/b)*1e4).toFixed(0)} bps max`)}let y=c.meta?.fee??c.poolFee;y!=null&&i("POOL FEE",`${Number(y)/100} bps`),c.liquidityUsd!==void 0&&c.liquidityUsd!==null&&i("LIQUIDITY",`$${ye(c.liquidityUsd)}`),o.rankedOn&&i("RANKED ON",String(o.rankedOn).toUpperCase(),{warn:String(o.rankedOn)==="gross"});let g=Array.isArray(o.ranked)?o.ranked.slice(1,4):Array.isArray(o.routes)?o.routes.filter(b=>b!==a).slice(0,3):[];for(let b of g){let S=b?.provider||b?.venue||b?.source,C=Xt(b?.netOut??b?.amountOut??b?.toAmount,u);S&&C&&i(`vs ${S}`,C,{dim:!0})}}else if(e==="portfolio"){let u=(o.valuation&&typeof o.valuation=="object"?o.valuation:o).knownUsd??o.knownUsd;i("KNOWN USD",u!=null?`$${ye(u)}`:null,{hero:!0});let p=Array.isArray(o.chains)?o.chains:null;if(i("CHAINS",p?p.length:o.chainCount),i("TOKENS",Array.isArray(o.tokens)?o.tokens.length:o.tokenCount),i("NFTS",Array.isArray(o.nfts)?o.nfts.length:o.nftCount),p){let f=p.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)i(String(m.name||m.family||m.chainId),`$${ye(m.knownUsd)}`,{dim:!0})}let l=o.avgEntryUsd??o.avgCostUsd;if(l!==void 0)i("AVG ENTRY",`$${ye(l)}`);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,g)=>y+g,0)/f.length;i("AVG ENTRY",`$${ye(m)} \xB7 ${f.length} coins`)}}let d=o.coverage;d&&typeof d=="object"?(Number(d.unavailable)||0)+(Number(d.notConfigured)||0)>0&&i("COVERAGE",`${d.ok??0}/${d.requestedSurfaces??"?"} SURFACES`,{warn:!0}):(o.incomplete||o.partial)&&i("COVERAGE","INCOMPLETE",{warn:!0})}else if(e==="nft"){i("COLLECTION",o.collection||o.slug||o.name),i("FLOOR",o.floor??o.floorEth??o.floorPrice,{hero:!0}),i("PNL",o.pnlUsd!==void 0?`$${ye(o.pnlUsd)}`:null);let c=o.avgBuy??o.avgBuyEth??o.avgCostEth??o.avgPurchase;if(c!==void 0)i("AVG BUY",ye(c));else if(Array.isArray(o.buys)||Array.isArray(o.purchases)){let u=(o.buys||o.purchases).map(p=>Number(p?.priceEth??p?.price??p?.costEth)).filter(p=>Number.isFinite(p)&&p>0);u.length>0&&i("AVG BUY",`${ye(u.reduce((p,l)=>p+l,0)/u.length)} \xB7 ${u.length} buys`)}i("OWNERS",ye(o.owners??o.numOwners))}return s}function _p(e,t,r){let n=Ei[e]||Ei.generic,o=Ai(e,r),s=o.find(u=>u.hero),i=o.filter(u=>!u.hero),a=Ye(JSON.stringify(r,null,2)).slice(0,2e4),c=i.map(u=>`<div class="row${u.dim?" dim":""}${u.warn?" warn":""}"><span>${Ye(u.label)}</span><b>${Ye(u.value)}</b></div>`).join("");return`<!doctype html><html><head><meta charset="utf-8"><style>
6
+ - `)}`);let o=e.capabilities||{},i=Xt.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:Xt.filter(a=>!i.includes(a))}},supports(a){return i.includes(a)}};for(let a of Xt)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 Bn(e){let t=El(e);return Yt.set(t.chainId,t),t}function ss(e){return Yt.get(Number(e))||null}function kl(){return[...Yt.values()]}function ib(){Yt.clear()}function sb(){let e={};for(let t of Yt.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:Yt.size,capabilities:[...Xt],chains:e}}var Xt,U,q,ob,Yt,ft=v(()=>{Xt=Object.freeze(["blockNumber","nativeBalance","tokenBalance","resolveToken","resolvePools","scanBlocks","scoreRisk","quote","sellSimulation","prepareUnsignedTx"]),U=Object.freeze({LIVE:"LIVE",CACHED:"CACHED",STALE:"STALE",UNKNOWN:"UNKNOWN",UNAVAILABLE:"UNAVAILABLE"}),q=Object.freeze({PASS:"PASS",CAUTION:"CAUTION",FAIL:"FAIL",UNKNOWN:"UNKNOWN"}),ob=/^0x[0-9a-fA-F]{40}$/;Yt=new Map});function Al(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:d=!1,meta:l={}}=e||{};if(u||r==null)return{source:t,quality:Pe.FAILED,amountOut:null,error:u||"no amountOut returned"};let p=Rr(r);if(p==null||p<=0n)return{source:t,quality:Pe.FAILED,amountOut:null,error:"non-positive amountOut"};let f=Number(s);return{source:t,quality:o==null?Pe.NO_GAS:Pe.FULL,amountOut:p.toString(),minOut:Rr(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:d,meta:l}}async function Il(e,t,{divisor:r=1000n}={}){let n=Rr(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=Rr(i),c=Rr(s);if(a==null||c==null||a<=0n)return null;let u=Number(a)/Number(o),d=Number(c)/Number(n);return!Number.isFinite(u)||!Number.isFinite(d)||u<=0?null:{impactPct:(1-d/u)*100,probeAmountIn:o.toString(),probeAmountOut:a.toString(),fullAmountOut:c.toString()}}function _l(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 as(e,{destPriceUsd:t=null,destDecimals:r=null,liquidityFirst:n=!0,liquidityBandBps:o=50,gasPriceWei:i=null,nativePriceUsd:s=null}={}){let a=e.filter(y=>y.quality!==Pe.FAILED),c=e.filter(y=>y.quality===Pe.FAILED),u=t!=null&&t>0&&r!=null&&r>=0,d=Number(i),l=Number(s),p=Number.isFinite(d)&&d>0&&Number.isFinite(l)&&l>0,f=a.map(y=>{let k=BigInt(y.amountOut),E=0n,R=!1,I=!1,$=BigInt(y.oracleFeeBps??0),L=$>0n?k*$/10000n:0n;if(u){let B=y.gasUsd,H=Number(y.meta?.gasUnits??y.estimatedGas);if(B==null&&p&&Number.isFinite(H)&&H>0){let K=H*d/1e18*l;Number.isFinite(K)&&K>=0&&(B=K,I=!0)}let ie=(B??0)+(y.feeUsd??0);if(ie>0){let K=ie/t*10**r;Number.isFinite(K)&&K>=0&&(E=BigInt(Math.floor(K)),R=!0)}else B===0&&(R=!0)}let M=E+L,X=k>M?k-M:0n;return{...y,grossOut:k.toString(),netOut:X.toString(),costInDest:E.toString(),oracleFeeInDest:L.toString(),costAccounted:R,gasEstimated:I}}),m=Number(o)>0?Number(o):0,g=f.reduce((y,k)=>BigInt(k.netOut)>y?BigInt(k.netOut):y,0n),h=y=>g>0n?Number((g-BigInt(y))*10000n/g):0,w=[],S=f.slice().sort((y,k)=>BigInt(k.netOut)>BigInt(y.netOut)?1:-1)[0]??null;f.sort((y,k)=>{let E=h(y.netOut)<=m?0:1,R=h(k.netOut)<=m?0:1;if(n&&m>0&&E!==R)return E-R;if(n&&m>0){let I=y.liquidityUsd??-1,$=k.liquidityUsd??-1;if(I!==$)return $-I}return BigInt(k.netOut)>BigInt(y.netOut)?1:-1}),n&&m>0&&S&&f[0]&&f[0].source!==S.source&&w.push(`liquidity-first: chose ${f[0].source} (liquidity $${f[0].liquidityUsd??"unknown"}) over best-price ${S.source} within ${m} bps`);let _=f.filter(y=>!y.costAccounted).map(y=>y.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 y=f.find(k=>k.costAccounted&&h(k.netOut)<=m);y&&w.push(`winner ${x.source} has UNMEASURED gas; gas-measured ${y.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(y=>y.gasEstimated).map(y=>y.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 A=null,b=null;if(f.length>=2&&f[0].costAccounted&&f[1].costAccounted){let y=BigInt(f[0].netOut),k=BigInt(f[1].netOut);k>0n&&(A=Number((y-k)*10000n/k),b=`${f[0].source} vs ${f[1].source}`)}return{best:f[0]??null,routes:f,failed:c,improvementBps:A,spreadBasis:b,rankedOn:u?"net-of-cost":"gross",warnings:w}}async function Fn(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"?Al({source:s,error:String(o.reason?.message||o.reason)}):Al({source:s,...o.value})})}var Pe,vl,Rr,cs=v(()=>{ft();Pe=Object.freeze({FULL:"FULL",NO_GAS:"NO_GAS",FAILED:"FAILED"}),vl={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"},Rr=e=>{try{return e==null||e===""?null:BigInt(String(e).split(".")[0])}catch{return null}}});function Ol(e={}){return kn({provider:"oneinch",defaultUrl:ab,hosts:["api.1inch.dev"],url:e.baseUrl||process.env.ONEINCH_API_URL})}function cb(e={}){return Ol(e).baseUrl}function Cl(e={}){return e.apiKey||process.env.ONEINCH_API_KEY||process.env.ONE_INCH_API_KEY||""}function ub(e={}){let t=Cl(e);return An({accept:"application/json"},{Authorization:t?`Bearer ${t}`:""},Ol(e).trusted)}async function Tl(e={},t={}){if(!Cl(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 N(`${cb(t)}/${r}/quote?${s}`,{headers:ub(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3});return a?.dstAmount?ae(a,{chainId:r,venue:"1inch-quote",amountOut:a.dstAmount,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps}):a}var ab,Nl=v(()=>{W();Re();Xi();ge();ab="https://api.1inch.dev/swap/v6.0"});var Pl={};j(Pl,{UNI_V4_CHAINS:()=>qe,UNI_V4_FEE_TIERS:()=>ds,computeV4PoolId:()=>jn,decodeV4HookPermissions:()=>fs,uniV4Chains:()=>Eb,uniV4Health:()=>kb,uniV4InspectHook:()=>wb,uniV4PrepareExactIn:()=>Sb,uniV4QuoteExactIn:()=>Hn,uniV4QuoteExactOut:()=>xb});import{AbiCoder as lb,Interface as us,getAddress as Ke,isAddress as ls,keccak256 as db}from"ethers";function fs(e){let t=Lr(e),r=Number(BigInt(t)&fb),n=Object.fromEntries(Rl.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(Rl.filter(([,s])=>n[s]).map(([,s])=>s)),valid:i.length===0,violations:Object.freeze(i)})}function qr(e){let t=Number(e),r=qe[t];if(!r)throw new Error(`uniswap-v4: unsupported chainId ${e} (supported: ${Object.keys(qe).join(", ")})`);return{chainId:t,...r}}function Lr(e){if(e==null||e==="")return ye;let t=String(e);if(!ls(t))throw new Error(`invalid Uniswap V4 hook address: ${e}`);return Ke(t)}function Qt(e,t){let r=qe[Number(t)];if(Pr(e))return Ke(r.weth);let n=String(e);if(/^weth$/i.test(n))return Ke(r.weth);if(/^usdc$/i.test(n)||/^usdg$/i.test(n))return Ke(r.usdc);if(!ls(n))throw new Error(`invalid token address: ${e}`);return Ke(n)}function Pr(e){let t=String(e||"").trim().toLowerCase();return!t||t===gb.toLowerCase()||t===ye.toLowerCase()||t==="eth"}function jn({currency0:e,currency1:t,fee:r,tickSpacing:n,hooks:o=ye}){let i=Ke(e),s=Ke(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=Lr(o);return db($r.encode(["address","address","uint24","int24","address"],[a,c,Number(r),Number(n),u]))}function ms({tokenIn:e,tokenOut:t,fee:r,tickSpacing:n,hooks:o=ye}){let i=Ke(e),s=Ke(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:Lr(o)},zeroForOne:u}}function bb({hook:e,codePresent:t,initialized:r,dynamicFee:n}){let o=fs(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!==ye&&(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===ye&&(c="critical",a.push("dynamic-fee pool has no hook authority")),e!==ye&&o.enabled.length===0&&(c="critical",a.push("nonzero hook declares no permissions")),r||(c="critical",a.push("pool is not initialized")),e!==ye&&!t&&(c="critical",a.push("hook address has no deployed bytecode")),Object.freeze({tier:c,audited:!1,requiresReview:e!==ye,returnsDelta:i,reasons:Object.freeze(a)})}async function wb(e={},t={}){let r=qr(e.chainId??8453);if(!r.stateView)throw new Error(`uniswap-v4: no StateView on chain ${r.chainId}`);let n=Qt(e.tokenIn||"WETH",r.chainId),o=Qt(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=Lr(e.hooks),{poolKey:c}=ms({tokenIn:n,tokenOut:o,fee:i,tickSpacing:s,hooks:a}),u=jn(c),d=t.rpcCall||Y,l=Dn.encodeFunctionData("getSlot0",[u]),p=Dn.encodeFunctionData("getLiquidity",[u]),[f,m,g]=await Promise.all([d(r.chainId,"eth_call",[{to:r.stateView,data:l},"latest"],t),d(r.chainId,"eth_call",[{to:r.stateView,data:p},"latest"],t),a===ye?Promise.resolve(null):d(r.chainId,"eth_getCode",[a,"latest"],t)]),h=Dn.decodeFunctionResult("getSlot0",f),w=Dn.decodeFunctionResult("getLiquidity",m)[0],S=h[0],_=S>0n,x=a===ye?null:typeof g=="string"&&g!=="0x"&&g.length>4,O=!!(i&ps),A=bb({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:S.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?(g.length-2)/2:0,permissions:fs(a)}),risk:A})}async function Hn(e={},t={}){let{chainId:r,quoter:n,poolManager:o,universalRouter:i}=qr(e.chainId??8453),s=Qt(e.tokenIn||"WETH",r),a=Qt(e.tokenOut||qe[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}]:[...ds],d=e.hooks||ye,l=[],p=null;for(let b of u){let{poolKey:y,zeroForOne:k}=ms({tokenIn:s,tokenOut:a,fee:b.fee,tickSpacing:b.tickSpacing,hooks:d}),E=Mn.encodeFunctionData("quoteExactInputSingle",[{poolKey:y,zeroForOne:k,exactAmount:c,hookData:"0x"}]);try{let R=await(t.rpcCall||Y)(r,"eth_call",[{to:n,data:E},"latest"],t);if(!R||R==="0x"){l.push({...b,ok:!1,error:"empty result"});continue}let I=Mn.decodeFunctionResult("quoteExactInputSingle",R),$={fee:b.fee,tickSpacing:b.tickSpacing,ok:!0,amountOut:I[0].toString(),gasEstimate:I[1].toString(),poolKey:y,zeroForOne:k,poolId:jn({...y})};l.push($),(!p||BigInt($.amountOut)>BigInt(p.amountOut))&&(p=$)}catch(R){l.push({...b,ok:!1,error:String(R.message||R).slice(0,160)})}}if(!p){let b=l.map(y=>`${y.fee}/${y.tickSpacing}:${y.error||"fail"}`).join("; ");throw new Error(`uniswap-v4 quote failed chain=${r}: ${b}`)}let f=e.liquidityUsd==null?await _r({chainId:r,tokenA:s,tokenB:a,dexIds:$l},t).catch(()=>[]):[],m=new Map;for(let b of f){let y=String(b.pairAddress||"").toLowerCase();y&&m.set(y,b)}let g=b=>m.get(String(b.poolId||"").toLowerCase())??null,h=e.liquidityBandBps==null?50:Number(e.liquidityBandBps),w=null;if(!(e.fee!=null&&e.tickSpacing!=null)&&h>0&&BigInt(p.amountOut)>0n){let b=BigInt(p.amountOut),k=l.filter(E=>E.ok&&Number((b-BigInt(E.amountOut))*10000n/b)<=h).filter(E=>g(E)?.liquidityUsd!=null).sort((E,R)=>g(R).liquidityUsd-g(E).liquidityUsd)[0];k&&k.poolId!==p.poolId&&(w={priceBestFee:p.fee,chosenFee:k.fee,chosenPoolUsd:g(k).liquidityUsd,bandBps:h},p=k)}let S=g(p),_=f[0]??null,x=S??_,O=e.liquidityUsd??S?.liquidityUsd??_?.liquidityUsd??null,A=e.liquidityUsd!=null?"caller":S?"pool":_?"pair":null;return ae({venue:"uniswap-v4",chainId:r,chain:qe[r].name,poolManager:o,quoter:n,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:O,liquiditySource:x,liquidityAttribution:A,liquidityPick:w,triedTiers:l,best:!0,executionReady:!1,prepareReady:typeof e.recipient=="string"&&ls(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&&!Pr(e.tokenIn)&&!Pr(e.tokenOut)&&(e.hookData==null||String(e.hookData).toLowerCase()==="0x")&&p.poolKey.hooks===ye&&!(p.fee&ps)},{chainId:r,venue:i||n,amountOut:p.amountOut,liquidityUsd:O,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps})}async function xb(e={},t={}){let{chainId:r,quoter:n,poolManager:o,universalRouter:i}=qr(e.chainId??8453),s=Qt(e.tokenIn||"WETH",r),a=Qt(e.tokenOut||qe[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}]:[...ds],d=e.hooks||ye,l=[],p=null;for(let m of u){let{poolKey:g,zeroForOne:h}=ms({tokenIn:s,tokenOut:a,fee:m.fee,tickSpacing:m.tickSpacing,hooks:d}),w=Mn.encodeFunctionData("quoteExactOutputSingle",[{poolKey:g,zeroForOne:h,exactAmount:c,hookData:"0x"}]);try{let S=await(t.rpcCall||Y)(r,"eth_call",[{to:n,data:w},"latest"],t);if(!S||S==="0x"){l.push({...m,ok:!1,error:"empty result"});continue}let _=Mn.decodeFunctionResult("quoteExactOutputSingle",S),x={fee:m.fee,tickSpacing:m.tickSpacing,ok:!0,amountIn:_[0].toString(),gasEstimate:_[1].toString(),poolKey:g,zeroForOne:h,poolId:jn({...g})};l.push(x),(!p||BigInt(x.amountIn)<BigInt(p.amountIn))&&(p=x)}catch(S){l.push({...m,ok:!1,error:String(S.message||S).slice(0,160)})}}if(!p){let m=l.map(g=>`${g.fee}/${g.tickSpacing}:${g.error||"fail"}`).join("; ");throw new Error(`uniswap-v4 exact-output quote failed chain=${r}: ${m}`)}let f=e.liquidityUsd==null?await ol({chainId:r,tokenA:s,tokenB:a,dexIds:$l},t).catch(()=>null):null;return{venue:"uniswap-v4",chainId:r,chain:qe[r].name,poolManager:o,quoter:n,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??f?.liquidityUsd??null,liquiditySource:f,triedTiers:l,best:!0,executionReady:!1,prepareReady:!1}}async function Sb(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=qr(n);if(Lr(e.hooks)!==ye)throw new Error("uniswap-v4 nonzero hooks are inspect/quote-only until a code-hash-specific adapter exists");if(Number(e.fee)&ps)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=Ke(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(Pr(e.tokenIn)||Pr(e.tokenOut))throw new Error("uniswap-v4 prepare currently requires ERC-20 tokenIn and tokenOut; native routes are not inferred");let u=await Hn(e,t);if(!o.universalRouter)throw new Error(`uniswap-v4: no Universal Router on chain ${n}`);let d=BigInt(u.amountOut)*BigInt(1e4-a)/10000n,l={currency0:u.zeroForOne?u.tokenIn:u.tokenOut,currency1:u.zeroForOne?u.tokenOut:u.tokenIn,fee:u.fee,tickSpacing:u.tickSpacing,hooks:u.hooks},f=$r.encode(["tuple(tuple(address currency0,address currency1,uint24 fee,int24 tickSpacing,address hooks) poolKey,bool zeroForOne,uint128 amountIn,uint128 amountOutMinimum,uint256 minHopPriceX36,bytes hookData)"],[[l,u.zeroForOne,BigInt(u.amountIn),d,0n,"0x"]]),m=$r.encode(["address","uint256"],[u.tokenIn,BigInt(u.amountIn)]),g=$r.encode(["address","uint256"],[u.tokenOut,d]),h=$r.encode(["bytes","bytes[]"],[hb,[f,m,g]]),S=Number(t.nowSeconds??Math.floor(Date.now()/1e3))+c,_=pb.encodeFunctionData("execute",[mb,[h],S]);return J({provider:"uniswap-v4",prepareReady:!0,calldataReady:!0,executionReady:!1,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:n,deadline:S,quote:{...u,amountOutMinimum:d.toString(),slippageBps:a},hookInspection:null,requiresApproval:{token:u.tokenIn,spender:yb,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 Eb(){return Object.entries(qe).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 kb(e={}){let t=qr(e.chainId??8453),r=await Y(t.chainId,"eth_getCode",[t.quoter,"latest"],e),n=typeof r=="string"&&r!=="0x"&&r.length>4;return{ok:n,chainId:t.chainId,quoter:t.quoter,poolManager:t.poolManager,codeBytes:n?(r.length-2)/2:0}}var $r,ye,qe,ds,Mn,pb,Dn,Rl,fb,ps,mb,hb,yb,gb,$l,hs=v(()=>{nt();Or();Re();ge();$r=lb.defaultAbiCoder(),ye="0x0000000000000000000000000000000000000000",qe={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"}},ds=[{fee:100,tickSpacing:1},{fee:500,tickSpacing:10},{fee:3e3,tickSpacing:60},{fee:1e4,tickSpacing:200},{fee:25e3,tickSpacing:8}],Mn=new us(["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)"]),pb=new us(["function execute(bytes commands,bytes[] inputs,uint256 deadline) payable"]),Dn=new us(["function getSlot0(bytes32 poolId) view returns (uint160 sqrtPriceX96,int24 tick,uint24 protocolFee,uint24 lpFee)","function getLiquidity(bytes32 poolId) view returns (uint128 liquidity)"]),Rl=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"]]),fb=(1n<<14n)-1n,ps=8388608;mb="0x10",hb="0x060c0f",yb="0x000000000022D473030F116dDEE9F6B43aC78BA3",gb="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE";$l=["uniswap-v4","uniswapv4"]});function Ib(e={}){return(e.baseUrl||process.env.DEFILLAMA_COINS_URL||Ab).replace(/\/$/,"")}function _b(e={}){return(e.baseUrl||process.env.DEFILLAMA_API_URL||vb).replace(/\/$/,"")}async function zn(e,t={}){if(!Array.isArray(e)||!e.length)throw new Error("llamaPrices requires coins[]");let r=e.map(encodeURIComponent).join(",");return N(`${Ib(t)}/prices/current/${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function ql(e={}){return N(`${_b(e)}/protocols`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??2e4})}var Ab,vb,ys=v(()=>{W();Ab="https://coins.llama.fi",vb="https://api.llama.fi"});var Vn={};j(Vn,{ACROSS_API:()=>Ll,HOP_API:()=>Ul,RELAY_API:()=>Bl,acrossHealth:()=>Cb,acrossSuggestedFees:()=>Fl,hopHealth:()=>Tb,hopQuote:()=>Dl,relayHealth:()=>Nb,relayPrepare:()=>Rb,relayQuote:()=>gs});async function Cb(e={}){try{return{ok:!0,estimatedFillTimeSec:(await Fl({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 Fl(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||Ll).replace(/\/$/,"");return N(`${c}/suggested-fees?${a}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function Tb(e={}){try{let t=await Dl({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 Dl(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=rt({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||Ul).replace(/\/$/,""),d=await N(`${u}/quote?${c}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),l=d?.estimatedRecieved||d?.estimatedReceived;return l?ae(d,{chainId:Number(e.originChainId||e.chainId||Ob[o]||0),venue:d?.tx?.to||"hop",amountOut:l,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,crossChain:o!==i,requestedCapBps:e.maxSlippageBps??e.slippageBps??s}):{...d,autoSlippagePolicy:a}}async function Nb(e={}){try{let t=await gs({user:dt,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 gs(e={},t={}){let{user:r=dt,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=rt({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 d=(t.baseUrl||process.env.RELAY_API_URL||Bl).replace(/\/$/,""),l=await N(`${d}/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=l?.details?.currencyOut?.amount;return!p||!/^\d+$/.test(String(p))?{...l,autoSlippagePolicy:u}:ae(l,{chainId:Number(n),venue:l?.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 Rb(e={},t={}){let r=await gs(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:ke(r.autoSlippage,{chainId:n,venue:a.to,data:a.data})}));return J({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 Ll,Ul,Bl,Ob,Wn=v(()=>{W();Re();wn();ge();Ll="https://across.to/api",Ul="https://api.hop.exchange/v1",Bl="https://api.relay.link",Ob={ethereum:1,optimism:10,bsc:56,polygon:137,arbitrum:42161,avalanche:43114,base:8453}});function Gn(e){if(!Array.isArray(e))return null;let t=0,r=!1;for(let n of e){let o=Xe(n?.amountUSD);o!=null&&(t+=o,r=!0)}return r?t:null}async function jl(e,t={}){let r=vl[Number(e)];if(!r)return null;try{let n=await zn([r],t);return Xe(n?.coins?.[r]?.price)}catch{return null}}async function $b(e={}){try{let t=await ql({...e,baseUrl:e.defillamaApiBaseUrl,timeoutMs:e.defillamaTimeoutMs??Math.min(Number(e.timeoutMs??5e3),5e3)});return Array.isArray(t)?t:[]}catch{return[]}}function Pb(e,t={}){let r=mt(t.tool||t.provider||t.bridge||t.protocol),n=[];return e==="lifi"&&r&&r!=="lifi"&&n.push(...Ml[r]||[r]),n.push(...Ml[mt(e)]||[e]),n}function qb(e,t,r={}){let n=Array.isArray(e)?e:[],o=Pb(t,r).map(mt).filter(Boolean);for(let i of o){let s=n.find(c=>mt(c?.slug)===i||mt(c?.name)===i),a=Xe(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=mt(c?.category);return!u.includes("bridge")&&!u.includes("crosschain")?!1:mt(c?.slug).includes(i)||mt(c?.name).includes(i)}),a=Xe(s?.tvl);if(a!=null)return{liquidityUsd:a,protocol:s?.name??s?.slug??i}}return null}function bs({chainId:e,tokenIn:t,tokenOut:r,amountIn:n,taker:o,slippageBps:i,decimalsIn:s,decimalsOut:a,nativePriceUsd:c=null,destDecimalsPromise:u=null,opts:d={}}){let l=[];return l.push({source:"lifi",run:async()=>{let p=await It({fromChain:e,toChain:e,fromToken:t,toToken:r,fromAmount:n},d),f=p?.estimate??p?.[0]?.estimate;return{amountOut:f?.toAmount,minOut:f?.toAmountMin,gasUsd:Gn(f?.gasCosts),feeUsd:Gn(f?.feeCosts),oracleFeeBps:p?.oracleFee?.applies?p.oracleFee.bps:0,meta:{tool:p?.tool??p?.toolDetails?.name,oracleFee:p?.oracleFee??null}}}}),s!=null&&l.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 Wt({chainId:e,srcToken:t,destToken:r,amount:n,srcDecimals:s,destDecimals:p},d),m=f?.priceRoute;return{amountOut:m?.destAmount,gasUsd:Xe(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&&l.push({source:"0x",run:async()=>{let p=await Gt({chainId:e,sellToken:t,buyToken:r,sellAmount:n,taker:o},d),f=null,m=p?.totalNetworkFee,g=await Promise.resolve(c);return m!=null&&g&&(f=Number(m)/1e18*g),{amountOut:p?.buyAmount,minOut:p?.minBuyAmount,gasUsd:f,meta:{source:p?.route?.fills?.[0]?.source}}}}),process.env.ONEINCH_API_KEY&&l.push({source:"1inch",run:async()=>{let p=await Tl({chainId:e,src:t,dst:r,amount:n},d),f=null;return p?.gas!=null&&c&&(f=null),{amountOut:p?.dstAmount,gasUsd:f,meta:{gasUnits:p?.gas}}}}),l.push({source:"cow",run:async()=>{let p=await _t({chainId:e,sellToken:t,buyToken:r,sellAmountBeforeFee:String(n),from:o},d),f=p?.quote??p,m=f?.feeAmount;return{amountOut:f?.buyAmount,gasUsd:0,meta:{intent:!0,feeAmountInSellToken:m,settlement:"solver-executed"}}}}),be[Number(e)]&&l.push({source:"uniswap-v3",run:async()=>{let p=await Ot({chainId:e,tokenIn:t,tokenOut:r,amountIn:n},d);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}}}}),qe[Number(e)]&&l.push({source:"uniswap-v4",run:async()=>{let p=await Hn({chainId:e,tokenIn:t,tokenOut:r,amountIn:n,recipient:o,slippageBps:i},d);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}}}}),l}function Hl({fromChainId:e,toChainId:t,tokenIn:r,tokenOut:n,amountIn:o,taker:i,opts:s={}}){let a=[],c=null,u=async(d,l={})=>(c||=$b(s),qb(await c,d,l));return a.push({source:"lifi",run:async()=>{let d=await It({fromChain:e,toChain:t,fromToken:r,toToken:n,fromAmount:o},s),l=d?.estimate??d?.[0]?.estimate,p={tool:d?.tool??d?.toolDetails?.name,durationSeconds:Xe(l?.executionDuration)},f=await u("lifi",p);return{amountOut:l?.toAmount,minOut:l?.toAmountMin,gasUsd:Gn(l?.gasCosts),feeUsd:Gn(l?.feeCosts),oracleFeeBps:d?.oracleFee?.applies?d.oracleFee.bps:0,liquidityUsd:f?.liquidityUsd??null,meta:{...p,liquidityProtocol:f?.protocol,oracleFee:d?.oracleFee??null}}}}),a.push({source:"relay",run:async()=>{let{relayQuote:d}=await Promise.resolve().then(()=>(Wn(),Vn)),p=(await d({user:i,originChainId:e,destinationChainId:t,originCurrency:r,destinationCurrency:n,amount:String(o)},s))?.details,f={durationSeconds:Xe(p?.timeEstimate),rate:p?.rate},m=await u("relay",f);return{amountOut:p?.currencyOut?.amount,minOut:p?.currencyOut?.minimumAmount,gasUsd:Xe(p?.totalImpact?.usd)!=null?Math.abs(Xe(p.totalImpact.usd)):null,liquidityUsd:m?.liquidityUsd??null,meta:{...f,liquidityProtocol:m?.protocol}}}}),a.push({source:"across",run:async()=>{let{acrossSuggestedFees:d}=await Promise.resolve().then(()=>(Wn(),Vn)),l=await d({token:r,destinationToken:n,originChainId:e,destinationChainId:t,amount:String(o)},s),p=l?.totalRelayFee?.total,f=null;if(p!=null)try{let g=BigInt(String(o))-BigInt(String(p));g>0n&&(f=g.toString())}catch{}let m=await u("across");return{amountOut:f,gasUsd:null,liquidityUsd:m?.liquidityUsd??null,meta:{derivedFromFees:!0,durationSeconds:Xe(l?.estimatedFillTimeSec),limits:l?.limits?{min:l.limits.minDeposit,max:l.limits.maxDeposit}:void 0,liquidityProtocol:m?.protocol}}}}),a}var Xe,mt,Ml,zl=v(()=>{Ar();En();In();Nl();Cn();Un();hs();ys();cs();Xe=e=>{let t=Number(e);return Number.isFinite(t)?t:null};mt=e=>String(e??"").toLowerCase().replace(/[^a-z0-9]/g,""),Ml=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 Wl={};j(Wl,{QUALITY:()=>Pe,bestBridgeRoute:()=>Ur,bestSwapRoute:()=>Jt,formatComparisonNote:()=>Kn});async function Vl(e,t,r){let n=Lb[Number(e)];if(!n)return{priceUsd:null,decimals:null};let o=`${n}:${t}`;try{let s=(await zn([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 Jt(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=jl(r,t),a=Vl(r,o,t),c=Ju(r,t).catch(()=>null),u=bs({...e,nativePriceUsd:s,decimalsOut:e.decimalsOut,destDecimalsPromise:a,opts:t}),[d,l,p]=await Promise.all([Fn(u,{timeoutMs:t.timeoutMs??12e3}),a,c]);s.catch(()=>{});let f=await s.then(h=>h,()=>null),m=as(d,{destPriceUsd:l.priceUsd,destDecimals:e.decimalsOut??l.decimals,liquidityBandBps:t.liquidityBandBps??50,gasPriceWei:p,nativePriceUsd:f}),g=t.maxImpactPct===void 0?25:t.maxImpactPct;if(g!=null&&m.best){let h=m.best.source,S=await Il(async _=>{let x=bs({...e,amountIn:_.toString(),nativePriceUsd:s,decimalsOut:e.decimalsOut,destDecimalsPromise:a,opts:t}).filter(A=>A.source===h);return x.length?(await Fn(x,{timeoutMs:t.timeoutMs??12e3}))?.[0]?.amountOut??null:null},i);if(S){let _=_l(m,{[h]:S},{maxImpactPct:g});return{kind:"swap",chainId:r,tokenIn:n,tokenOut:o,amountIn:String(i),..._,sourcesTried:u.length,sourcesAnswered:d.filter(x=>x.quality!==Pe.FAILED).length,note:Kn(_,u.length),priceImpact:{[h]:Number(S.impactPct.toFixed(2))}}}}return{kind:"swap",chainId:r,tokenIn:n,tokenOut:o,amountIn:String(i),...m,sourcesTried:u.length,sourcesAnswered:d.filter(h=>h.quality!==Pe.FAILED).length,note:Kn(m,u.length)}}async function Ur(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=Vl(n,i,t),c=Hl({...e,opts:t}),[u,d]=await Promise.all([Fn(c,{timeoutMs:t.timeoutMs??15e3}),a]),l=as(u,{destPriceUsd:d.priceUsd,destDecimals:e.decimalsOut??d.decimals,liquidityBandBps:t.liquidityBandBps??50}),p=l.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),...l,durations:p,sourcesTried:c.length,sourcesAnswered:u.filter(f=>f.quality!==Pe.FAILED).length,note:Kn(l,c.length)}}function Ub(e){let t=e?.meta?.oracleFee;return t?.applies?` \xB7 ${ku(t)}`:""}function Kn(e,t){if(!e.best)return"no source returned a usable route";let r=e.routes.length,n=Ub(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 Lb,Zt=v(()=>{cs();zl();Sn();ys();nt();Lb={1:"ethereum",10:"optimism",56:"bsc",137:"polygon",8453:"base",42161:"arbitrum",43114:"avax"}});var Gl={};j(Gl,{ARTIFACT:()=>ot,prepareBestRoute:()=>Hb,supportedPreparers:()=>Fb});function Fb(){return Object.keys(Xn)}async function Hb(e,t={}){if(jb.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(!Mb.test(r))throw new Error(`taker must be a valid 20-byte address, got "${r}"`);if(Db.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 Jt(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=Xn[o];if(!s){let h=n.routes.find(w=>Xn[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):"",S=[String(h?.message||h),w].filter(Boolean).join(" :: "),_=/allowance/i.test(S),x=!_&&/not enough|insufficient|balance/i.test(S),O,A;_?(A="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: ${S}`):x?(A="taker-not-funded",O=`${o} refused to build the transaction: ${S}. This venue verifies the taker holds the input token. Quoting works for any address; preparing needs the real funded wallet.`):(A="provider-error",O=`${o} prepare failed: ${S}`);let b=n.routes.find(y=>Xn[y.source]&&y.source!==o);return{ok:!1,reason:O,failureKind:A,...b?{alternative:b.source}:{},comparison:n}}let c=e.driftToleranceBps??Bb,u=null,d=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&&(d=`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 l=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,g=m!=null&&f>0?Math.round(m/f*100):null;return J({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:g},priceImpact:n.priceImpact??null,impactUnmeasured:n.impactUnmeasured??[],...a,unsigned:!0,signedBy:"user-wallet",destination:a.artifactKind===ot.TRANSACTION?a.transaction?.to??null:a.settlement??null,driftBps:u,warnings:[...d?[d]:[],...n.warnings||[],...a.artifactKind===ot.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:l,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 ot,Bb,Xn,Db,Mb,jb,Kl=v(()=>{Zt();ge();ot=Object.freeze({TRANSACTION:"unsigned-transaction",TYPED_DATA_ORDER:"typed-data-order"}),Bb=100,Xn={"uniswap-v3":async({chainId:e,tokenIn:t,tokenOut:r,amountIn:n,taker:o},i)=>{let{uniV3PrepareExactIn:s}=await Promise.resolve().then(()=>(Un(),ml)),a=await s({chainId:e,tokenIn:t,tokenOut:r,amountIn:n,recipient:o},i);return{artifactKind:ot.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},d)=>{let{uniV4PrepareExactIn:l}=await Promise.resolve().then(()=>(hs(),Pl)),p=await l({chainId:e,tokenIn:t,tokenOut:r,amountIn:n,recipient:o,slippageBps:i,deadlineSeconds:s,fee:a,tickSpacing:c,hooks:u},d);return{artifactKind:ot.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(()=>(Ar(),Gi)),a=await s({fromChain:e,toChain:e,fromToken:t,toToken:r,fromAmount:n,fromAddress:o},i);return{artifactKind:ot.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(()=>(En(),Tu)),u=await c({chainId:e,srcToken:t,destToken:r,amount:n,srcDecimals:i,destDecimals:s,userAddress:o,side:"SELL"},a);return{artifactKind:ot.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(()=>(In(),Bu)),a=await s({chainId:e,sellToken:t,buyToken:r,sellAmount:n,taker:o},i);return{artifactKind:ot.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(()=>(Cn(),Xu)),a=await s({chainId:e,sellToken:t,buyToken:r,sellAmountBeforeFee:String(n),from:o},i);return{artifactKind:ot.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"}}};Db=new Set(["0x0000000000000000000000000000000000000000","0x000000000000000000000000000000000000dead","0x0000000000000000000000000000000000000001","0x00000000000000000000000000000000000a1ce5"].map(e=>e.toLowerCase())),Mb=/^0x[0-9a-fA-F]{40}$/,jb=Object.freeze(["operation","exactOutput","amountOut","multihop","path","positionManager","modifyLiquidities","commands","actions"])});var Xl={};j(Xl,{prepareBestBridgeRoute:()=>Kb,supportedBridgePreparers:()=>Gb});function Gb(){return Object.keys(Yn)}async function Kb(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(!zb.test(r))throw new Error(`taker must be a valid 20-byte address, got "${r}"`);if(Vb.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 Ur(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=Yn[s];if(!c){let h=i.routes.find(w=>Yn[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):"",S=[String(h?.message||h),w].filter(Boolean).join(" :: "),_=/allowance/i.test(S),x=!_&&/not enough|insufficient|balance/i.test(S),O=i.routes.find(A=>Yn[A.source]&&A.source!==s);return{ok:!1,reason:_?`${s} will not build calldata until the token approval exists on-chain. Approve first, then prepare again. Underlying: ${S}`:x?`${s} refused to build: ${S}. Quoting works for any address; preparing needs the real funded wallet on chain ${n}.`:`${s} bridge prepare failed: ${S}`,failureKind:_?"approval-required-first":x?"taker-not-funded":"provider-error",...O?{alternative:O.source}:{},comparison:i}}let d=u.transactions||[];if(!d.length)return{ok:!1,reason:`${s} returned no executable transaction for this route`,failureKind:"provider-error",comparison:i};let l=d.filter(h=>h.chainId!=null&&Number(h.chainId)!==Number(n));if(l.length)return{ok:!1,reason:`${s} returned a transaction for chain ${l[0].chainId} but the origin chain is ${n}. Refusing to hand over a mismatched artifact.`,failureKind:"chain-mismatch",comparison:i};let p=e.driftToleranceBps??Wb,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 g=[...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 d.length>1&&g.push(`This route needs ${d.length} transactions signed IN ORDER. Signing only the first leaves funds approved but not bridged.`),J({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:d.length,transactions:d,requiresApproval:u.requiresApproval??null,minOut:u.minOut??null,durationSeconds:u.durationSeconds??null,destination:d[0]?.to??null,unsigned:!0,signedBy:"user-wallet",driftBps:f,warnings:g,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. ${d.length} transaction(s) on chain ${n}, crediting chain ${o}. Verify every destination address before signing.`},{provider:"router",kind:"best-bridge"})}var zb,Vb,Wb,Yn,Yl=v(()=>{Zt();ge();zb=/^0x[0-9a-fA-F]{40}$/,Vb=new Set(["0x0000000000000000000000000000000000000000","0x000000000000000000000000000000000000dead","0x0000000000000000000000000000000000000001","0x00000000000000000000000000000000000a1ce5"].map(e=>e.toLowerCase())),Wb=100,Yn={relay:async({fromChainId:e,toChainId:t,tokenIn:r,tokenOut:n,amountIn:o,taker:i},s)=>{let{relayPrepare:a}=await Promise.resolve().then(()=>(Wn(),Vn)),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(()=>(Ar(),Gi)),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 Zl={};j(Zl,{buildTwapSchedule:()=>Jl,normalizeTwapParams:()=>Ql,prepareTwapChunk:()=>ew,simulateTwap:()=>tw});function Ql(e={}){let t=Math.max(Xb,Math.min(Yb,Number(e.splits)||Jb)),r=Math.max(.1,Number(e.windowHours)||Zb),n=Math.max(Qb,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 Jl(e){let t=Ql(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 ew(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 Jt({chainId:r,tokenIn:n,tokenOut:o,amountIn:i,taker:s}),u=J(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 tw(e,{quoteFn:t=Jt,...r}={}){let n=Jl(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),d=BigInt(u.amountOut??u.quote?.amountOut??"0");i+=d,s=u.source??u.venue??s,o.push({splitIndex:c+1,amountOut:String(d),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 Xb,Yb,Qb,Jb,Zb,ed=v(()=>{Zt();ge();Xb=2,Yb=100,Qb=60,Jb=10,Zb=6});async function nd({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(!td.has(Number(e))||!td.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 N(`${rd}/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 od(){try{return{ok:!0,chainCount:(await N(`${rd}/supported-chains-info`))?.chains?.length??0}}catch(e){return{ok:!1,error:String(e.message||e).slice(0,160)}}}var rd,td,id=v(()=>{W();ge();rd="https://dln.debridge.finance/v1.0",td=new Set([1,10,56,137,8453,42161,43114,59144,534352,7777777,324,5e3,1101,81457])});async function ad({active:e=!0}={},t={}){let r=Date.now();if(er.size&&r-sd<rw)return[...er.values()];try{let n=await N(`${ws}/exchange/currencies?active=${e?"true":"false"}`,t);er.clear();for(let o of n??[])er.set(String(o.ticker).toLowerCase(),o);return sd=r,n??[]}catch(n){return er.size?[...er.values()]:{error:String(n.message||n).slice(0,200)}}}async function nw(e,t,r={}){if(!e||!t)return{error:"changenow minAmount requires fromTicker and toTicker"};try{return{minAmount:(await N(`${ws}/exchange/min-amount/${encodeURIComponent(e)}_${encodeURIComponent(t)}`,r))?.minAmount??"0"}}catch(n){return{error:String(n.message||n).slice(0,200)}}}async function ow(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 N(`${ws}/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 cd({fromTicker:e,toTicker:t,fromAmount:r,flow:n}={},o={}){if(!e||!t)return{error:"changenow quote requires fromTicker and toTicker"};let i=await nw(e,t,o);if(i.error)return i;let s=r??i.minAmount,a=await ow(e,t,s,{flow:n},o);if(a.error)return a;let c=await ad({},o),u=c.find(l=>String(l?.ticker).toLowerCase()===String(e).toLowerCase()),d=c.find(l=>String(l?.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??d?.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 ud(){try{let e=await ad();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 ws,er,sd,rw,ld=v(()=>{W();ws="https://api.changenow.io/v2",er=new Map,sd=0,rw=6e5});async function dd({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 N(`${iw}/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 iw,pd=v(()=>{W();iw="https://api.squidrouter.com/v1"});async function fd({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 N(`${sw}/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 sw,md=v(()=>{W();sw="https://api.stargate.finance"});async function hd({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 N(`${aw}/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 aw,yd=v(()=>{W();aw="https://midgard.ninerealms.com/v2"});async function gd({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 N(`${cw}/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 cw,bd=v(()=>{W();cw="https://api.socket.tech/v2"});async function wd({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 N(`${uw}/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 uw,xd=v(()=>{W();uw="https://api.connext.network"});async function Sd({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 N(`${lw}/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 lw,Ed=v(()=>{W();lw="https://api.portalbridge.com/v1"});function dw(e,t){return`0x${Ss.getAmountsOut}`+_e(e)+_e(64)+_e(t.length)+t.map(Br).join("")}function pw(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 xs(e,t="router"){return(e?.venues||[]).find(n=>n.kind===t)?.address??null}function fw(e,t){let r=Number(t);if(!Number.isFinite(r)||r<0)throw new Error("slippageBps must be a non-negative number");if(r>Es)throw new Error(`slippageBps ${r} exceeds the ${Es} 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 kd(e){let{chainId:t,wrappedNative:r}=e;async function n(o,i,s,a){let c=await Y(t,"eth_call",[{to:o,data:dw(i,s)},"latest"],a);return pw(c?.result??c)}return{async quote({tokenIn:o,tokenOut:i,amountIn:s,path:a},c={}){let u=xs(c.scanner);if(!u)return{chainId:t,evidence:U.UNAVAILABLE,reason:"no verified router configured for this chain; quoting stays fail-closed rather than guessing a venue address"};let d=a||[o,i];if(d.some(p=>!/^0x[0-9a-fA-F]{40}$/.test(p||"")))throw new Error("quote requires valid 20-byte addresses");let l=await n(u,s,d,c);return l?{chainId:t,router:u,path:d,amountIn:String(s),amountOut:l[l.length-1].toString(),hops:d.length-1,evidence:U.LIVE,note:"exact-input quote at current reserves; not a guaranteed fill"}:{chainId:t,router:u,path:d,evidence:U.UNKNOWN,reason:"router returned no amounts -- no pool for this path, or the call reverted"}},async sellSimulation({token:o,amountIn:i,base:s},a={}){let c=xs(a.scanner),u=s||r;if(u&&String(o).toLowerCase()===String(u).toLowerCase())return{chainId:t,token:o,verdict:q.UNKNOWN,evidence:U.UNAVAILABLE,reason:"token is the base asset for this chain, so there is nothing to round-trip against. Sellability must be judged against a different quote asset."};if(!c||!u)return{chainId:t,token:o,verdict:q.UNKNOWN,evidence:U.UNAVAILABLE,reason:c?"no wrappedNative configured for this chain, so no base asset to round-trip against":"no verified router configured for this chain"};let d=await n(c,i,[u,o],a);if(!d)return{chainId:t,token:o,verdict:q.FAIL,evidence:U.LIVE,leg:"buy",reason:"buy leg returned no amounts -- no route in"};let l=d[d.length-1];if(l===0n)return{chainId:t,token:o,verdict:q.FAIL,evidence:U.LIVE,leg:"buy",reason:"buy leg quotes zero output"};let p=await n(c,l,[o,u],a);if(!p)return{chainId:t,token:o,verdict:q.FAIL,evidence:U.LIVE,leg:"sell",bought:l.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)),g=q.PASS,h="round trip completes with expected fee/impact loss";return m<5e3?(g=q.FAIL,h=`round trip returns only ${(m/100).toFixed(2)}% -- punitive tax or no real liquidity`):m<9e3&&(g=q.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:g,reason:h,amountIn:String(i),bought:l.toString(),returned:f.toString(),retentionBps:m,evidence:U.LIVE,note:"Quote-level round trip. It does not prove transfer hooks absent at execution time."}},async prepareUnsignedTx({tokenIn:o,tokenOut:i,amountIn:s,recipient:a,slippageBps:c=50,deadlineSeconds:u=900,path:d},l={}){let p=l.scanner,f=xs(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=d||[o,i],g=await this.quote({tokenIn:o,tokenOut:i,amountIn:s,path:m},l);if(g.evidence!==U.LIVE)throw new Error(`cannot prepare without a live quote (${g.evidence}: ${g.reason??"no reason given"})`);let h=fw(g.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)),S=r&&m[0].toLowerCase()===r.toLowerCase()&&l.useNative,_=S?`0x${Ss.swapExactETHForTokens}`+_e(h)+_e(128)+Br(a)+_e(w)+_e(m.length)+m.map(Br).join(""):`0x${Ss.swapExactTokensForTokens}`+_e(s)+_e(h)+_e(160)+Br(a)+_e(w)+_e(m.length)+m.map(Br).join("");return{unsigned:!0,signedBy:"user-wallet",chainId:t,tx:{to:f,data:_,value:S?`0x${BigInt(s).toString(16)}`:"0x0"},guard:{quotedOut:g.amountOut,minOut:h.toString(),slippageBps:c,maxSlippageBps:Es,deadline:w.toString()},requires:S?[]:[{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 Ss,_e,Br,Es,Ad=v(()=>{nt();ft();Ss={getAmountsOut:"d06ca61f",swapExactTokensForTokens:"38ed1739",swapExactETHForTokens:"7ff36ab5"},_e=e=>BigInt(e).toString(16).padStart(64,"0"),Br=e=>e.slice(2).toLowerCase().padStart(64,"0");Es=100});function hw(e,t){let r=Number(t);if(!Number.isFinite(r)||r<0)throw new Error("slippageBps must be a non-negative number");if(r>As)throw new Error(`slippageBps ${r} exceeds the ${As} 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 ks(e,t){return(e?.venues||[]).find(r=>r.kind===t)?.address??null}function _d(e){let{chainId:t,wrappedNative:r}=e;async function n({quoter:i,tokenIn:s,tokenOut:a,amountIn:c,fee:u},d){let l=`0x${vd.quoteExactInputSingle}`+Fr(s)+Fr(a)+Ct(c)+Ct(u)+Ct(0),p=await Y(t,"eth_call",[{to:i,data:l},"latest"],d).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 d=[],l=null;for(let p of mw){let f=await n({quoter:i,tokenIn:s,tokenOut:a,amountIn:c,fee:p},u);d.push({fee:p,amountOut:f?f.toString():null}),f&&(!l||f>l.amountOut)&&(l={fee:p,amountOut:f})}return{best:l,tried:d}}return{async quote({tokenIn:i,tokenOut:s,amountIn:a},c={}){let u=ks(c.scanner,"quoter");if(!u)return{chainId:t,evidence:U.UNAVAILABLE,reason:"no verified quoter configured for this chain; quoting stays fail-closed rather than guessing a venue address"};for(let p of[i,s])if(!Id.test(p||""))throw new Error("quote requires valid 20-byte addresses");let{best:d,tried:l}=await o({quoter:u,tokenIn:i,tokenOut:s,amountIn:a},c);return d?{chainId:t,venue:"uniswap-v3",quoter:u,tokenIn:i,tokenOut:s,amountIn:String(a),amountOut:d.amountOut.toString(),fee:d.fee,useNative:!!r&&String(i).toLowerCase()===String(r).toLowerCase(),triedFeeTiers:l,evidence:U.LIVE,note:"exact-input single-hop quote at current tick; not a guaranteed fill"}:{chainId:t,quoter:u,tokenIn:i,tokenOut:s,triedFeeTiers:l,evidence:U.UNKNOWN,reason:"no fee tier returned a quote -- no V3 pool for this pair, or no liquidity"}},async sellSimulation({token:i,amountIn:s,base:a},c={}){let u=ks(c.scanner,"quoter"),d=(e.stableQuoteAssets||[]).map(O=>String(O).toLowerCase()),l=null;!a&&typeof e.resolveQuoteAsset=="function"&&(l=await e.resolveQuoteAsset(i,c).catch(()=>null));let p=String(i).toLowerCase(),f=String(r||"").toLowerCase();if(f&&p===f)return{chainId:t,token:i,verdict:q.UNKNOWN,evidence:U.UNAVAILABLE,reason:"token is the base asset for this chain, so there is nothing to round-trip against. Sellability must be judged against a different quote asset."};let m=a||l||(d[0]&&p!==d[0]?d[0]:null)||r;if(m&&p===String(m).toLowerCase())return{chainId:t,token:i,verdict:q.UNKNOWN,evidence:U.UNAVAILABLE,reason:"token is the base asset for this chain, so there is nothing to round-trip against. Sellability must be judged against a different quote asset."};if(!u||!m)return{chainId:t,token:i,verdict:q.UNKNOWN,evidence:U.UNAVAILABLE,reason:u?"no wrappedNative configured, so there is no base asset to round-trip against":"no verified quoter configured for this chain"};let g=await o({quoter:u,tokenIn:m,tokenOut:i,amountIn:s},c);if(!g.best){let O=d.find(A=>A&&A!==String(m).toLowerCase()&&A!==String(i).toLowerCase());if(O){let A=await o({quoter:u,tokenIn:O,tokenOut:i,amountIn:s},c);if(A.best){let b=await o({quoter:u,tokenIn:i,tokenOut:O,amountIn:A.best.amountOut},c);if(b.best){let y=b.best.amountOut,k=Number(y*10000n/BigInt(s)),E=q.PASS,R="round trip vs dollar book completes with expected fee/impact loss";return k<5e3?(E=q.FAIL,R=`round trip vs dollar book returns only ${(k/100).toFixed(2)}% -- punitive tax or no real liquidity`):k<9e3&&(E=q.CAUTION,R=`round trip vs dollar book returns ${(k/100).toFixed(2)}% -- transfer tax or thin liquidity at this size`),{chainId:t,venue:"uniswap-v3",token:i,base:O,quoteAsset:O,verdict:E,reason:R,amountIn:String(s),bought:A.best.amountOut.toString(),returned:y.toString(),retentionBps:k,buyFee:A.best.fee,sellFee:b.best.fee,evidence:U.LIVE,note:"Quoted against the dollar book, not wrapped native. A missing WETH pool is not a honeypot."}}}}return{chainId:t,token:i,verdict:q.FAIL,evidence:U.LIVE,leg:"buy",reason:"no V3 pool priced the buy leg on any fee tier against wrapped native or the dollar book"}}let h=await o({quoter:u,tokenIn:i,tokenOut:m,amountIn:g.best.amountOut},c);if(!h.best){let O=d.find(A=>A&&A!==String(m).toLowerCase()&&A!==String(i).toLowerCase());if(O){let A=await o({quoter:u,tokenIn:O,tokenOut:i,amountIn:s},c),b=A.best?await o({quoter:u,tokenIn:i,tokenOut:O,amountIn:A.best.amountOut},c):{best:null};if(A.best&&b.best){let y=b.best.amountOut,k=Number(y*10000n/BigInt(s)),E=q.PASS,R="round trip vs dollar book completes; missing WETH sell pool is not a honeypot";return k<5e3?(E=q.FAIL,R=`dollar-book round trip returns only ${(k/100).toFixed(2)}%`):k<9e3&&(E=q.CAUTION,R=`dollar-book round trip returns ${(k/100).toFixed(2)}%`),{chainId:t,venue:"uniswap-v3",token:i,base:O,quoteAsset:O,verdict:E,reason:R,amountIn:String(s),bought:A.best.amountOut.toString(),returned:y.toString(),retentionBps:k,buyFee:A.best.fee,sellFee:b.best.fee,evidence:U.LIVE,note:"Sell vs wrapped native failed; dollar book succeeded. Not labelled honeypot."}}}return{chainId:t,token:i,verdict:q.FAIL,evidence:U.LIVE,leg:"sell",bought:g.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,S=Number(w*10000n/BigInt(s)),_=q.PASS,x="round trip completes with expected fee/impact loss";return S<5e3?(_=q.FAIL,x=`round trip returns only ${(S/100).toFixed(2)}% -- punitive tax or no real liquidity`):S<9e3&&(_=q.CAUTION,x=`round trip returns ${(S/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:g.best.amountOut.toString(),returned:w.toString(),retentionBps:S,buyFee:g.best.fee,sellFee:h.best.fee,evidence:U.LIVE,note:"Quote-level round trip. It does not prove transfer hooks absent at execution time."}},async prepareUnsignedTx({tokenIn:i,tokenOut:s,amountIn:a,recipient:c,slippageBps:u=50,fee:d},l={}){let p=ks(l.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(!Id.test(c||""))throw new Error("prepareUnsignedTx requires a valid recipient address");let f=await this.quote({tokenIn:i,tokenOut:s,amountIn:a},l);if(f.evidence!==U.LIVE)throw new Error(`cannot prepare without a live quote (${f.evidence}: ${f.reason??"no reason given"})`);let m=d??f.fee,g=hw(f.amountOut,u);if(g<=0n)throw new Error("computed minOut is zero -- refusing to prepare");let h=!!(l.useNative||f.useNative)&&r&&String(i).toLowerCase()===String(r).toLowerCase(),w=`0x${vd.exactInputSingle}`+Fr(i)+Fr(s)+Ct(m)+Fr(c)+Ct(a)+Ct(g)+Ct(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:g.toString(),slippageBps:u,maxSlippageBps:As,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 mw,vd,Ct,Fr,Id,As,Od=v(()=>{nt();ft();mw=[100,500,3e3,1e4],vd={quoteExactInputSingle:"c6a5026a",exactInputSingle:"04e45aaf"},Ct=e=>BigInt(e).toString(16).padStart(64,"0"),Fr=e=>e.slice(2).toLowerCase().padStart(64,"0"),Id=/^0x[0-9a-fA-F]{40}$/,As=100});function Cd(e){if(!e||e==="0x")return null;try{return BigInt(e)}catch{return null}}function Td(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 yw(e){let{chainId:t}=e;async function r(n,o,i){return Y(t,"eth_call",[{to:n,data:o},"latest"],i)}return{async blockNumber(n={}){let o=await Rn(t,n);return{chainId:t,blockNumber:o?.blockNumber??o,evidence:U.LIVE}},async nativeBalance(n,o={}){let i=await Zu(t,n,o);return{chainId:t,address:n,wei:i?.wei??i?.balance??null,symbol:e.nativeCurrency?.symbol??null,decimals:e.nativeCurrency?.decimals??18,evidence:U.LIVE}},async tokenBalance({token:n,owner:o},i={}){let s=await tl({chainId:t,token:n,owner:o},i);return{chainId:t,token:n,owner:o,raw:s?.balance??s,evidence:U.LIVE}},async resolveToken(n,o={}){if(!/^0x[0-9a-fA-F]{40}$/.test(n||""))return{chainId:t,token:n,evidence:U.UNKNOWN,error:"resolveToken needs a 20-byte address; symbol lookup is a market-data concern"};let[i,s,a,c]=await Promise.all([r(n,Qn.decimals,o).catch(()=>null),r(n,Qn.symbol,o).catch(()=>null),r(n,Qn.name,o).catch(()=>null),r(n,Qn.totalSupply,o).catch(()=>null)]),u=Cd(i?.result??i),d=u!==null||s?.result||a?.result;return{chainId:t,address:n,decimals:u===null?null:Number(u),symbol:Td(s?.result??s),name:Td(a?.result??a),totalSupply:(Cd(c?.result??c)??null)?.toString()??null,evidence:d?U.LIVE:U.UNKNOWN,warning:d?void 0:"no ERC-20 metadata returned -- may not be a token contract"}},async resolvePools(n,o={}){let i=e.dexscreenerSlug;if(!i)return{chainId:t,token:n,pools:[],evidence:U.UNAVAILABLE,reason:"no dexscreenerSlug configured for this chain; pool discovery is unavailable rather than guessed"};let s=await Pn(n,o).catch(()=>null),c=(s?.pairs||s?.data?.pairs||[]).filter(d=>String(d.chainId).toLowerCase()===String(i).toLowerCase()).map(d=>({pair:d.pairAddress,dex:d.dexId,base:d.baseToken?.address,quote:d.quoteToken?.address,liquidityUsd:d.liquidity?.usd??null,priceUsd:d.priceUsd??null,volume24hUsd:d.volume?.h24??null,createdAt:d.pairCreatedAt??null})).sort((d,l)=>(l.liquidityUsd??0)-(d.liquidityUsd??0)),u=$n(n,c,{stables:e.stableQuoteAssets||[],wrappedNative:e.wrappedNative});return{chainId:t,token:n,pools:u,topPool:u[0]||null,quoteAsset:nl(n,u),evidence:u.length?U.LIVE:U.UNKNOWN}},async scanBlocks({fromBlock:n,toBlock:o,address:i,topics:s,chunkSize:a=2e3}={},c={}){if(!Number.isInteger(n)||!Number.isInteger(o))throw new Error("scanBlocks requires integer fromBlock and toBlock");if(o<n)throw new Error("toBlock must be >= fromBlock");let u=[],d=[];for(let l=n;l<=o;l+=a){let p=Math.min(l+a-1,o);d.push([l,p])}for(let[l,p]of d){let f={fromBlock:`0x${l.toString(16)}`,toBlock:`0x${p.toString(16)}`};i&&(f.address=i),s&&(f.topics=s);let m=await Y(t,"eth_getLogs",[f],c).catch(g=>({error:String(g?.message||g)}));if(m?.error)return{chainId:t,fromBlock:n,toBlock:o,logs:u,complete:!1,failedAt:[l,p],error:m.error,evidence:U.UNKNOWN};for(let g of m?.result??m??[])u.push(g)}return{chainId:t,fromBlock:n,toBlock:o,logs:u,complete:!0,chunks:d.length,evidence:U.LIVE}},async scoreRisk(n,o={}){let i=[],s=q.PASS,a=d=>{let l={[q.PASS]:0,[q.CAUTION]:1,[q.UNKNOWN]:2,[q.FAIL]:3};l[d]>l[s]&&(s=d)},c=await this.resolveToken(n,o);c.evidence!==U.LIVE?(i.push({check:"erc20-metadata",result:q.UNKNOWN,detail:c.warning}),a(q.UNKNOWN)):i.push({check:"erc20-metadata",result:q.PASS,detail:`${c.symbol} / ${c.decimals}d`});let u=await this.resolvePools(n,o);if(u.evidence===U.UNAVAILABLE)i.push({check:"liquidity",result:q.UNKNOWN,detail:u.reason}),a(q.UNKNOWN);else if(!u.pools.length)i.push({check:"liquidity",result:q.FAIL,detail:"no pool with liquidity found"}),a(q.FAIL);else{let d=u.pools[0],l=d.liquidityUsd??0;l<5e3?(i.push({check:"liquidity",result:q.CAUTION,detail:`top pool only $${l}`}),a(q.CAUTION)):i.push({check:"liquidity",result:q.PASS,detail:`$${l} on ${d.dex}`}),d.createdAt&&Date.now()-d.createdAt<24*3600*1e3&&(i.push({check:"age",result:q.CAUTION,detail:"pool under 24h old"}),a(q.CAUTION))}if(typeof this.sellSimulation=="function"){let d=await this.sellSimulation({token:n,amountIn:(10n**16n).toString()},o).catch(l=>({verdict:q.UNKNOWN,reason:String(l?.message||l)}));i.push({check:"sellability",result:d.verdict,detail:d.retentionBps!=null?`round trip returns ${(d.retentionBps/100).toFixed(2)}% -- ${d.reason}`:d.reason}),a(d.verdict)}else i.push({check:"sellability",result:q.UNKNOWN,detail:"no verified router on this chain, so a round-trip sell simulation cannot run. Treat as unproven -- a buy path is not an exit path."}),a(q.UNKNOWN);return{chainId:t,token:n,verdict:s,checks:i,note:"Structural checks only. UNKNOWN is not PASS. A token is not tradeable until a sell simulation succeeds."}}}}function vs(e){let r={...yw(e)},n=new Set((e.venues||[]).map(i=>i.kind));e.venueKind==="uniswap-v3"&&n.has("quoter")&&n.has("router")?Object.assign(r,_d({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,kd({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 Qn,Nd=v(()=>{nt();Or();ft();Ad();Od();ns();Qn={decimals:"0x313ce567",symbol:"0x95d89b41",name:"0x06fdde03",totalSupply:"0x18160ddd",owner:"0x8da5cb5b"}});function Jn(){return Dr.map(e=>Bn(vs(e)))}function Rd(e){return Bn(vs(e))}var Dr,Zn=v(()=>{Nd();ft();Dr=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 Bd,getAddress as gw,id as Fd}from"ethers";function tr(e){return e?.cache===!1?!1:!e?.fetchImpl||e.cache===!0}function Os(e,t,r){let n=e.get(t);return n?Date.now()-n.at>r?(e.delete(t),null):n:null}function eo(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 Pw(e,t){try{return gw(e).toLowerCase()}catch{throw new Error(`${t} must be a valid EVM address`)}}function qw(e){return`0x${e.slice(2).toLowerCase().padStart(64,"0")}`}function Ud(e){return`0x${String(e).slice(-40).toLowerCase()}`}function Lw({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>Ow)return"stale"}return"scoped"}function Uw(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 Bw(e,t,r,n){let o=`${e}:${t}`,i=n?.get(o);if(i)return i;if(tr(r)){let a=Os(qd,o,Cw);if(a)return a.value}let s=(async()=>{let a=async l=>{try{let p=$d.encodeFunctionData(l,[]),f=await Y(e,"eth_call",[{to:t,data:p},"latest"],r);return!f||f==="0x"?null:$d.decodeFunctionResult(l,f)[0]}catch{return null}},[c,u]=await Promise.all([a("decimals"),a("symbol")]),d={decimals:c==null?null:Number(c),symbol:u==null?null:String(u).slice(0,24)};return tr(r)&&eo(qd,o,d,Rw),d})();return n?.set(o,s),s}async function Fw(e,t,r){let n=Math.min(Math.max(Number(r.lookbackBlocks)||ww,1),xw),o=await Rn(e,r);if(!Number.isFinite(o))throw new Error("chain head unavailable");let i=Math.max(0,o-n),s=await Y(e,"eth_getLogs",[{fromBlock:`0x${i.toString(16)}`,toBlock:"latest",topics:[bw,qw(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(),d=c?.topics?.[2];!u||!d||a.set(`${u}:${Ud(d)}`,{token:u,spender:Ud(d)})}return{pairs:[...a.values()],fromBlock:i,toBlock:o}}function Dw(e){return(vw[e]||[]).flatMap(r=>Ew.map(n=>({token:r.address,spender:n.address,symbol:r.symbol,decimals:r.decimals})))}async function Mw(e,t,r={}){let n=[],o="direct-probe",i=null,s=Dw(e),a=_s(e),c=tr(r)&&Os(Is,e,Tw)?.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 Fw(e,t,r);n=u.pairs,o="log-scan",i={fromBlock:u.fromBlock,toBlock:u.toBlock},tr(r)&&eo(Is,e,!0,64)}catch{if(tr(r)&&eo(Is,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,l=(await an(n,r.concurrency||4,async f=>{try{let m=await el({chainId:e,token:f.token,owner:t,spender:f.spender},r),g=BigInt(m.allowance);if(g<=0n)return null;let h=f.symbol?{symbol:f.symbol,decimals:f.decimals??null}:await Bw(e,f.token,r,u),w=g>=_w,S=Sw[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:S,allowance:g.toString(),allowanceDisplay:Uw(g,h.decimals,w),unlimited:w,lastActivityAt:null,risk:Lw({unlimited:w,spenderLabel:S,lastActivityAt:null})}}catch{return null}})).filter(Boolean),p=await Hw(e,t,r);return{scan:{chainId:e,status:"ok",method:o,pairsProbed:n.length,collectionsProbed:_s(e).length,...i||{}},approvals:[...l,...p]}}catch(u){return{scan:{chainId:e,status:"unavailable",method:o,error:String(u?.message||u).slice(0,200)},approvals:[]}}}async function jw(e,t,r,n,o){try{let i=Pd.encodeFunctionData("isApprovedForAll",[r,n]),s=await Y(e,"eth_call",[{to:t,data:i},"latest"],o);return!s||s==="0x"?null:!!Pd.decodeFunctionResult("isApprovedForAll",s)[0]}catch{return null}}function _s(e){return(Aw[e]||[]).flatMap(r=>kw.map(n=>({collection:r.address,collectionName:r.name,operator:n.address,operatorLabel:n.label})))}async function Hw(e,t,r){let n=_s(e);return n.length===0?[]:(await an(n,r.concurrency||4,async i=>await jw(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 Dd(e={},t={}){let r=Pw(e.owner||e.address,"owner"),n=new Map(Dr.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=tr(t)&&!e.refresh;if(s){let f=Os(Ld,i,Nw);if(f)return{...f.value,cached:!0,cachedAgeMs:Date.now()-f.at}}let a=await an(o,e.concurrency||3,f=>Mw(f,r,{...t,lookbackBlocks:e.lookbackBlocks})),c=a.flatMap(f=>f.approvals),u=a.map(f=>f.scan),d=u.find(f=>f.method==="log-scan"&&f.toBlock),l=u.some(f=>f.method==="direct-probe"&&f.status==="ok"),p={provider:"approvals",operation:"scan",readOnly:!0,queriedAt:new Date().toISOString(),owner:r,scannedRange:d?`last ${d.toBlock-d.fromBlock} blocks`:l?"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&&eo(Ld,i,p,$w),{...p,cached:!1,cachedAgeMs:0}}var $d,Pd,bw,__,ww,xw,Sw,Ew,kw,Aw,vw,Iw,_w,Ow,Cw,Tw,Nw,Rw,$w,qd,Is,Ld,Md=v(()=>{Zn();W();nt();$d=new Bd(["function decimals() view returns (uint8)","function symbol() view returns (string)"]),Pd=new Bd(["function isApprovedForAll(address owner, address operator) view returns (bool)","function name() view returns (string)"]),bw=Fd("Approval(address,address,uint256)"),__=Fd("ApprovalForAll(address,address,bool)"),ww=1e4,xw=2e5,Sw=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)"}),Ew=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"}]),kw=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"}]),Aw=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"}]}),vw=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}]}),Iw=(1n<<256n)-1n,_w=Iw/2n,Ow=4320*60*60*1e3,Cw=360*60*1e3,Tw=600*1e3,Nw=45*1e3,Rw=512,$w=128,qd=new Map,Is=new Map,Ld=new Map});var zd={};j(zd,{aggregateBridgeQuotes:()=>jd,bridgeAggregatorHealth:()=>Vw,checkRevokeNeeded:()=>Hd,scanBridgeRoutes:()=>zw});async function jd(e={},t={}){let{fromChainId:r,toChainId:n,tokenIn:o,tokenOut:i,amount:s,taker:a,fromSymbol:c="?",toSymbol:u="?",fromDecimals:d=18,toDecimals:l=18}=e,p=[],f=[],m=nd({srcChainId:r,srcChainTokenIn:o,srcChainTokenInAmount:s,dstChainId:n,dstChainTokenOut:i},t).then(y=>y.error?(f.push(`debridge: ${y.error}`),null):{provider:"debridge",amountOut:y.estimation?.dstChainTokenOut?.amount??y.estimation?.toAmount,feeUsd:y.estimation?.fixFee??y.fixFee,estimatedTime:y.estimation?.execution?.estimatedTransferTime?`${y.estimation.execution.estimatedTransferTime}s`:"unknown",preparable:!0,raw:y}).catch(y=>(f.push(`debridge: ${y.message}`),null)),g=Ur({fromChainId:r,toChainId:n,tokenIn:o,tokenOut:i,amountIn:s,taker:a},t).then(y=>!y||y.error?(f.push(`lifi: ${y?.error??"no route"}`),null):{provider:"lifi-relay",amountOut:y.amountOut??y.quote?.amountOut,feeUsd:y.feeUsd??y.totalFee,estimatedTime:y.estimatedTime??y.duration??"unknown",preparable:!!y.transaction,raw:y}).catch(y=>(f.push(`lifi: ${y.message}`),null)),h=dd({fromChain:r,toChain:n,fromToken:o,toToken:i,fromAmount:s,fromAddress:a},t).then(y=>y.error?(f.push(`squid: ${y.error}`),null):{provider:"squid",amountOut:y.toAmount,feeUsd:Array.isArray(y.fee)?y.fee.reduce((k,E)=>k+(Number(E.amountUsd)||0),0):null,estimatedTime:"30s - 3min",preparable:!1,raw:y}).catch(y=>(f.push(`squid: ${y.message}`),null)),w=fd({srcChainId:r,dstChainId:n,token:o,amount:s},t).then(y=>y.error?(f.push(`stargate: ${y.error}`),null):{provider:"stargate",amountOut:y.amountOut,feeUsd:y.fee,estimatedTime:y.estimatedTime||"1-5 min",preparable:!1,raw:y}).catch(y=>(f.push(`stargate: ${y.message}`),null)),S=hd({fromAsset:c,toAsset:u,amount:s,destination:a},t).then(y=>y.error?(f.push(`thorchain: ${y.error}`),null):{provider:"thorchain",amountOut:y.expectedAmountOut,feeUsd:y.fees?.total,estimatedTime:y.estimatedTime||"10-30 min",preparable:!1,raw:y}).catch(y=>(f.push(`thorchain: ${y.message}`),null)),_=(async()=>{if(!c||!u||c==="?"||u==="?")return f.push("changenow: ticker symbols required, skipping"),null;try{let y=await cd({fromTicker:c,toTicker:u,fromAmount:s},t);return y.error?(f.push(`changenow: ${y.error}`),null):{provider:"changenow",amountOut:y.toAmount,feeUsd:y.networkFee,estimatedTime:y.flow==="standard"?"5-30 min":"instant",preparable:!1,kycRequired:y.kycRequired,raw:y}}catch(y){return f.push(`changenow: ${y.message}`),null}})(),x=gd({fromChainId:r,toChainId:n,fromToken:o,toToken:i,fromAmount:s,userAddress:a},t).then(y=>y.error?(f.push(`bungee: ${y.error}`),null):{provider:"bungee",amountOut:y.amountOut,feeUsd:y.feeUsd,estimatedTime:y.estimatedTime,preparable:!1,raw:y}).catch(y=>(f.push(`bungee: ${y.message}`),null)),O=wd({originDomain:r,destinationDomain:n,originToken:o,destinationToken:i,amount:s},t).then(y=>y.error?(f.push(`connext: ${y.error}`),null):{provider:"connext",amountOut:y.amountOut,feeUsd:y.fee,estimatedTime:y.estimatedTime||"5-20 min",preparable:!1,raw:y}).catch(y=>(f.push(`connext: ${y.message}`),null)),A=Sd({fromChain:r,toChain:n,token:o,amount:s},t).then(y=>y.error?(f.push(`wormhole: ${y.error}`),null):{provider:"wormhole",amountOut:y.amountOut,feeUsd:y.fee,estimatedTime:y.estimatedTime||"5-15 min",preparable:!1,raw:y}).catch(y=>(f.push(`wormhole: ${y.message}`),null)),b=await Promise.allSettled([m,g,h,w,S,x,O,A,_]);for(let y of b)y.status==="fulfilled"&&y.value&&p.push(y.value);return p.sort((y,k)=>{let E=Number(y.amountOut??0),R=Number(k.amountOut??0);return E!==R?R-E:y.preparable&&!k.preparable?-1:!y.preparable&&k.preparable?1:0}),{providers:p.map(y=>y.provider),bestRoute:p[0]?.provider??"none",winner:p[0]??null,runnersUp:p.slice(1),errors:f.length?f:null}}async function Hd({chainId:e,taker:t,tokenIn:r}={},n={}){if(!e||!t)return{needsRevoke:!1,note:"no wallet to check"};try{let i=(await Dd({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 zw(e={},t={}){let[r,n]=await Promise.all([jd(e,t),Hd({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 Vw(){let[e,t]=await Promise.all([od().catch(r=>({ok:!1,error:r.message})),ud().catch(r=>({ok:!1,error:r.message}))]);return{debridge:e,changenow:t,lifi:{ok:!0,note:"integrated via router"}}}var Z_,Vd=v(()=>{Zt();id();ld();pd();md();yd();bd();xd();Ed();Md();Z_=Object.freeze(["debridge","lifi-relay","squid","stargate","thorchain","bungee","connext","wormhole","changenow"])});var Wd={};j(Wd,{DYDX_API:()=>to,dydxHealth:()=>Kw,dydxMarkets:()=>Ww,dydxOrderbook:()=>Gw});async function Ww(e=50,t={}){try{return((await N(`${to}/v4/perpetualMarkets?limit=${e}`,t))?.markets||[]).map(n=>({ticker:n?.ticker,oraclePrice:n?.oraclePrice,indexPrice:n?.indexPrice,nextFundingRate:n?.nextFundingRate?`${(Number(n.nextFundingRate)*100).toFixed(4)}%`:null,openInterest:n?.openInterest,volume24h:n?.volume24H}))}catch(r){return{error:String(r.message||r).slice(0,200)}}}async function Gw(e){try{let t=await N(`${to}/v4/orderbooks/perpetualMarket/${e}`);return{bids:t?.bids?.slice(0,5),asks:t?.asks?.slice(0,5)}}catch(t){return{error:String(t.message||t).slice(0,200)}}}async function Kw(){try{return{ok:!0,serverTime:(await N(`${to}/v4/time`))?.iso}}catch(e){return{ok:!1,error:String(e.message||e).slice(0,160)}}}var to,Gd=v(()=>{W();to="https://api.dydx.exchange"});var Xd={};j(Xd,{DRIFT_API:()=>Kd,driftHealth:()=>Yw,driftMarkets:()=>Xw});async function Xw(e={}){try{return((await N(`${Kd}/v2/markets`,e))?.markets||[]).map(r=>({symbol:r?.symbol||r?.marketIndex,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}))}catch(t){return{error:String(t.message||t).slice(0,200)}}}async function Yw(){try{return{ok:!0,note:"Drift v2 perps on Solana \u2014 public reads via dlob.drift.trade"}}catch(e){return{ok:!1,error:String(e.message||e).slice(0,160)}}}var Kd,Yd=v(()=>{W();Kd="https://dlob.drift.trade"});var Qd={};j(Qd,{VERTEX_API:()=>ro,vertexHealth:()=>Zw,vertexMarkets:()=>Qw,vertexOrderbook:()=>Jw});async function Qw(e={}){try{return((await N(`${ro}/query`,{...e,method:"POST",body:JSON.stringify({all_markets:{}}),headers:{"content-type":"application/json",...e.headers||{}}}))?.data?.all_markets||[]).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}))}catch(t){return{error:String(t.message||t).slice(0,200)}}}async function Jw(e){try{let r=(await N(`${ro}/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)}}}async function Zw(){try{return{ok:!0,status:(await N(`${ro}/status`))?.status||"unknown"}}catch(e){return{ok:!1,error:String(e.message||e).slice(0,160)}}}var ro,Jd=v(()=>{W();ro="https://gateway.prod.vertexprotocol.com/v2"});var Zd={};j(Zd,{pancakeHealth:()=>rx,pancakeQuote:()=>tx});async function tx({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 N(`${ex}/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 rx(){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 ex,ep=v(()=>{W();ex="https://api.thegraph.com/subgraphs/name/pancakeswap/exchange-v3-bsc"});var rp={};j(rp,{sushiHealth:()=>ix,sushiQuote:()=>ox});async function ox({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 N(`${nx(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 ix(){try{return{ok:!0,chains:Object.keys(tp).length+" chains"}}catch(e){return{ok:!1,error:String(e.message||e).slice(0,160)}}}var nx,tp,np=v(()=>{W();nx=e=>`https://api.thegraph.com/subgraphs/name/sushi-v3/v3-${tp[e]||"ethereum"}`,tp={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 op={};j(op,{raydiumHealth:()=>cx,raydiumQuote:()=>ax});async function ax({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 N(`${sx}/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 cx(){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 sx,ip=v(()=>{W();sx="https://quote-api.jup.ag/v6"});var sp={};j(sp,{AEVO_API:()=>Cs,aevoHealth:()=>lx,aevoMarkets:()=>ux});async function ux(e={}){try{return(await N(`${Cs}/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 lx(){try{return{ok:(await N(`${Cs}/ping`))?.status==="ok"}}catch(e){return{ok:!1,error:String(e.message||e).slice(0,160)}}}var Cs,ap=v(()=>{W();Cs="https://api.aevo.xyz"});var cp={};j(cp,{compoundHealth:()=>fx,compoundMarkets:()=>px});async function px(e={}){try{return((await N(`${dx}/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 fx(){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 dx,up=v(()=>{W();dx="https://api.compound.finance/api/v2"});var lp={};j(lp,{yearnHealth:()=>yx,yearnVaults:()=>hx});async function hx(e={}){try{return(await N(`${mx}/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 yx(){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 mx,dp=v(()=>{W();mx="https://api.yearn.fi/v1"});var pp={};j(pp,{convexHealth:()=>wx,convexPools:()=>bx});async function bx(e={}){try{return(await N(`${gx}/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 wx(){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 gx,fp=v(()=>{W();gx="https://api.convexfinance.com/api"});function Tt(e){if(!Number.isSafeInteger(e)||e<0||e>1e3)throw new RangeError("scale must be a safe integer from 0 through 1000")}function Ye(e,t){if(typeof e!="bigint")throw new TypeError("mantissa must be a bigint");return Tt(t),Object.freeze({mantissa:e,scale:t})}function ht(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`);Tt(e.scale)}function no(e){return Tt(e),10n**BigInt(e)}function F(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 Ye(s,o.length)}function we(e,t){if(Tt(t),typeof e=="bigint")return Ye(e,t);if(typeof e!="string"||!/^[+-]?\d+$/.test(e))throw new TypeError("value must be an integer string or bigint");return Ye(BigInt(e),t)}function Le(e){ht(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 Mr(e,t){return ht(e),Tt(t),t===e.scale?Ye(e.mantissa,e.scale):t>e.scale?Ye(e.mantissa*no(t-e.scale),t):Ye(e.mantissa/no(e.scale-t),t)}function Ts(e,t){ht(e,"left"),ht(t,"right");let r=Math.max(e.scale,t.scale);return[Mr(e,r),Mr(t,r),r]}function yt(e,t){let[r,n,o]=Ts(e,t);return Ye(r.mantissa+n.mantissa,o)}function jr(e,t){let[r,n,o]=Ts(e,t);return Ye(r.mantissa-n.mantissa,o)}function Ae(e,t){ht(e,"left"),ht(t,"right");let r=e.scale+t.scale;return Tt(r),Ye(e.mantissa*t.mantissa,r)}function Ue(e,t,r=Math.max(e?.scale??0,t?.scale??0)){if(ht(e,"left"),ht(t,"right"),Tt(r),t.mantissa===0n)throw new RangeError("division by zero");let n=e.mantissa*no(t.scale+r),o=t.mantissa*no(e.scale);return Ye(n/o,r)}function gt(e,t){let[r,n]=Ts(e,t);return r.mantissa<n.mantissa?-1:r.mantissa>n.mantissa?1:0}var lO,Oe=v(()=>{lO=Object.freeze({mantissa:10000n,scale:0})});import{existsSync as hp,readFileSync as xx}from"node:fs";import{dirname as mp,join as Ns}from"node:path";import{fileURLToPath as Sx}from"node:url";function Ex(e){let t=mp(Sx(e));for(let r=0;r<8;r+=1){let n=Ns(t,"package.json");if(hp(n))try{let i=JSON.parse(xx(n,"utf8"));if(i&&typeof i.version=="string")return t}catch{}let o=mp(t);if(o===t)break;t=o}throw new Error(`oracle: could not resolve package root from ${e}`)}function yp(e,t){let r=Ex(t),n=Ns(r,e);return hp(n)?n:Ns(r,"dist","assets",e)}var gp=v(()=>{});import{readFileSync as kx,existsSync as Ax}from"node:fs";import{fileURLToPath as vx}from"node:url";import{dirname as Ix,join as wp}from"node:path";function Ox(){try{let e=yp("equities-fixtures",import.meta.url);if(e&&Ax(e))return e}catch{}return _x}function Tx(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function V(e,t){throw new TypeError(`Fixture fixtures/${e}: ${t}`)}function oe(e,t,r){Tx(e)||V(t,`${r} must be an object`)}function G(e,t,r){(typeof e!="string"||e.length===0)&&V(t,`${r} must be a nonempty string`)}function Qe(e,t,r){Number.isSafeInteger(e)||V(t,`${r} must be a safe integer`)}function bt(e,t,r){oe(e,t,r);for(let[n,o]of Object.entries(e))G(n,t,`${r} key`),oe(o,t,`${r}.${n}`)}function Nx(e,t){oe(e,t,"root"),Qe(e.capturedAt,t,"capturedAt"),oe(e.venues,t,"venues");let r=[["hyperliquid_hip3","dexs"],["arcus","markets"],["arcus_spot","pairs"],["rh_uniswap","pools"],["rh_chainlink_oracles","assets"]];for(let[n,o]of r){let i=e.venues[n];oe(i,t,`venues.${n}`),G(i.type,t,`venues.${n}.type`),G(i.chain,t,`venues.${n}.chain`),G(i.tier,t,`venues.${n}.tier`),bt(i[o],t,`venues.${n}.${o}`)}for(let[n,o]of Object.entries(e.venues.hyperliquid_hip3.dexs))bt(o,t,`venues.hyperliquid_hip3.dexs.${n}`)}function Rx(e,t){bt(e,t,"root"),Object.keys(e).length===0&&V(t,"root must not be empty");for(let[r,n]of Object.entries(e))Array.isArray(n.venues)||V(t,`${r}.venues must be an array`),n.venues.forEach((o,i)=>G(o,t,`${r}.venues[${i}]`))}function $x(e,t){oe(e,t,"root");for(let r of["chainId","block","oracleScaleExp","usdgDecimals","equityDecimals"])Qe(e[r],t,r);G(e.usdg,t,"usdg"),bt(e.assets,t,"assets");for(let[r,n]of Object.entries(e.assets))G(n.oracle,t,`assets.${r}.oracle`),G(n.token,t,`assets.${r}.token`),(typeof n.rawPrice!="string"||!/^\d+$/.test(n.rawPrice))&&V(t,`assets.${r}.rawPrice must be an integer string`),(typeof n.usd!="number"||!Number.isFinite(n.usd)||n.usd<0)&&V(t,`assets.${r}.usd must be a nonnegative finite source number`)}function Px(e,t){oe(e,t,"root");for(let n of["holidayDayIndex","names","dates"])Array.isArray(e[n])||V(t,`${n} must be an array`);let r=e.holidayDayIndex.length;(e.names.length!==r||e.dates.length!==r)&&V(t,"holidayDayIndex, names, and dates must have equal lengths"),e.holidayDayIndex.forEach((n,o)=>Qe(n,t,`holidayDayIndex[${o}]`)),e.names.forEach((n,o)=>G(n,t,`names[${o}]`)),e.dates.forEach((n,o)=>{(typeof n!="string"||!/^\d{4}-\d{2}-\d{2}$/.test(n))&&V(t,`dates[${o}] must use YYYY-MM-DD`)})}function qx(e,t){oe(e,t,"root"),(!Array.isArray(e.dstTransitions)||e.dstTransitions.length===0)&&V(t,"dstTransitions must be a nonempty array");let r=new Set;e.dstTransitions.forEach((n,o)=>{oe(n,t,`dstTransitions[${o}]`);for(let i of["year","startUtc","endUtc"])Qe(n[i],t,`dstTransitions[${o}].${i}`);n.startUtc>=n.endUtc&&V(t,`dstTransitions[${o}] startUtc must be before endUtc`),r.has(n.year)&&V(t,`dstTransitions contains duplicate year ${n.year}`),r.add(n.year)})}function Lx(e,t){bt(e,t,"root"),Object.keys(e).length===0&&V(t,"root must not be empty");for(let[r,n]of Object.entries(e)){for(let o of["addr","quote","quoteAddr","dex","pair"])G(n[o],t,`${r}.${o}`);(typeof n.liq!="number"||!Number.isFinite(n.liq)||n.liq<0)&&V(t,`${r}.liq must be a nonnegative finite source number`)}}function Ux(e,t){oe(e,t,"root"),Qe(e.capturedAt,t,"capturedAt"),Qe(e.block,t,"block"),Qe(e.chainId,t,"chainId"),G(e.gasPriceWei,t,"gasPriceWei"),G(e.stateView,t,"stateView"),bt(e.pools,t,"pools"),Object.keys(e.pools).length===0&&V(t,"pools must not be empty");for(let[r,n]of Object.entries(e.pools)){for(let o of["pair","version","quote","token","sqrtPriceX96"])G(n[o],t,`pools.${r}.${o}`);n.version!=="v3"&&n.version!=="v4"&&V(t,`pools.${r}.version must be v3 or v4`),typeof n.quoteIsToken0!="boolean"&&V(t,`pools.${r}.quoteIsToken0 must be a boolean`),(!/^[0-9]+$/.test(n.sqrtPriceX96)||BigInt(n.sqrtPriceX96)<=0n)&&V(t,`pools.${r}.sqrtPriceX96 must be a positive integer string`)}}function Bx(e,t){oe(e,t,"root"),Qe(e.capturedAt,t,"capturedAt"),G(e.source,t,"source"),oe(e.books,t,"books"),Object.keys(e.books).length===0&&V(t,"books must not be empty");for(let[r,n]of Object.entries(e.books)){oe(n,t,`books.${r}`),(!Array.isArray(n.bids)||!Array.isArray(n.asks))&&V(t,`books.${r} must have bids and asks arrays`);for(let[o,i]of n.bids.entries())oe(i,t,`books.${r}.bids[${o}]`),G(i.px,t,`books.${r}.bids[${o}].px`),G(i.sz,t,`books.${r}.bids[${o}].sz`);for(let[o,i]of n.asks.entries())oe(i,t,`books.${r}.asks[${o}]`),G(i.px,t,`books.${r}.asks[${o}].px`),G(i.sz,t,`books.${r}.asks[${o}].sz`)}}function Fx(e,t){oe(e,t,"root"),Qe(e.capturedAt,t,"capturedAt"),G(e.source,t,"source"),G(e.chain,t,"chain"),bt(e.tokens,t,"tokens"),oe(e.pairs,t,"pairs"),Object.keys(e.tokens).length===0&&V(t,"tokens must not be empty");for(let[r,n]of Object.entries(e.tokens)){G(n.symbolRaw,t,`tokens.${r}.symbolRaw`),G(n.mint,t,`tokens.${r}.mint`),Object.hasOwn(e.pairs,r)||V(t,`pairs.${r} is required for token ${r}`),(!Array.isArray(e.pairs[r])||e.pairs[r].length===0)&&V(t,`pairs.${r} must be a nonempty array`);for(let[o,i]of e.pairs[r].entries())oe(i,t,`pairs.${r}[${o}]`),G(i.pairAddress,t,`pairs.${r}[${o}].pairAddress`),G(i.dexId,t,`pairs.${r}[${o}].dexId`),(typeof i.priceUsd!="number"||!Number.isFinite(i.priceUsd)||i.priceUsd<=0)&&V(t,`pairs.${r}[${o}].priceUsd must be a positive finite number`),(typeof i.liquidityUsd!="number"||!Number.isFinite(i.liquidityUsd)||i.liquidityUsd<0)&&V(t,`pairs.${r}[${o}].liquidityUsd must be a nonnegative finite number`)}}function Dx(e,t){oe(e,t,"root"),Qe(e.capturedAt,t,"capturedAt"),G(e.source,t,"source"),G(e.chain,t,"chain"),e.chain!=="ton"&&V(t,'chain must be "ton"'),bt(e.tokens,t,"tokens"),oe(e.pairs,t,"pairs"),Object.keys(e.tokens).length===0&&V(t,"tokens must not be empty");for(let[r,n]of Object.entries(e.tokens)){G(n.symbolRaw,t,`tokens.${r}.symbolRaw`),G(n.mint,t,`tokens.${r}.mint`),Object.hasOwn(e.pairs,r)||V(t,`pairs.${r} is required for token ${r}`),(!Array.isArray(e.pairs[r])||e.pairs[r].length===0)&&V(t,`pairs.${r} must be a nonempty array`);for(let[o,i]of e.pairs[r].entries())oe(i,t,`pairs.${r}[${o}]`),G(i.pairAddress,t,`pairs.${r}[${o}].pairAddress`),G(i.dexId,t,`pairs.${r}[${o}].dexId`),(typeof i.priceUsd!="number"||!Number.isFinite(i.priceUsd)||i.priceUsd<=0)&&V(t,`pairs.${r}[${o}].priceUsd must be a positive finite number`),(typeof i.liquidityUsd!="number"||!Number.isFinite(i.liquidityUsd)||i.liquidityUsd<0)&&V(t,`pairs.${r}[${o}].liquidityUsd must be a nonnegative finite number`)}}function jx(e,t){let r=xp[t],n=wp(e,r),o;try{o=kx(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 Mx[t](i,r),i}function Sp(e){if(e!==null&&typeof e=="object"&&!Object.isFrozen(e)){Object.freeze(e);for(let t of Object.values(e))Sp(t)}return e}function Rs({fixtureDir:e=Cx}={}){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(xp))t[r]=jx(e,r);return Sp(t)}function it(){return bp??=Rs(),bp}function ve(){return it().venues}function Ep(){return it().universe}function kp(){return it().oracles}function Ap(){return it().nyseHolidays}function vp(){return it().dstTransitions}function oo(){return it().rhPoolState}function Ip(){return it().solanaXstocks}function _p(){return it().tonXstocks}function Op(){return it().hip3L2Books}var _x,Cx,xp,Mx,bp,Be=v(()=>{gp();_x=wp(Ix(vx(import.meta.url)),"fixtures");Cx=Ox(),xp=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"});Mx=Object.freeze({venues:Nx,universe:Rx,oracles:$x,nyseHolidays:Px,dstTransitions:qx,equityDexPools:Lx,rhPoolState:Ux,solanaXstocks:Fx,tonXstocks:Dx,hip3L2Books:Bx})});function Vx(){let e=vp().dstTransitions.map(n=>({year:n.year,startMs:n.startUtc*Ps,endMs:n.endUtc*Ps}));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 Lp(){return Tp??=Vx(),Tp}function Wx(){return $s===void 0&&($s=new Set(Ap().holidayDayIndex)),$s}function Up(e,t){if(!Number.isSafeInteger(e))throw new TypeError(`${t}: epochMs must be a safe integer number of milliseconds`)}function Gx(e,t){let{coverageStartMs:r,coverageEndMs:n,firstYear:o,lastYear:i}=Lp();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 Kx(e){for(let t of Lp().rows)if(e>=t.startMs&&e<t.endMs)return!0;return!1}function Xx(e){return Kx(e)?zx:Hx}function Yx(e){let t=e+Xx(e),r=Math.floor(t/Cp),n=t-r*Cp,o=new Date(t);return{dayIndex:r,minuteOfDay:Math.floor(n/Np),msIntoDay:n,weekday:o.getUTCDay()}}function Qx({dayIndex:e,weekday:t}){return t===0||t===6?!1:!Wx().has(e)}function Jx(e){return e<Rp?"dark":e<$p?"extended":e<Pp?"core":e<qp?"extended":"dark"}function Hr(e){Up(e,"sessionState"),Gx(e,"sessionState");let t=Yx(e);return Qx(t)?Jx(t.minuteOfDay):"dark"}function Ls(e){return Up(e,"isDark"),Hr(e)==="dark"}var Ps,Np,qs,Cp,Hx,zx,Rp,$p,Pp,qp,EO,kO,Tp,$s,io=v(()=>{Be();Ps=1e3,Np=60*Ps,qs=60*Np,Cp=24*qs,Hx=-5*qs,zx=-4*qs,Rp=240,$p=570,Pp=960,qp=1200,EO=Object.freeze([Rp,$p,Pp,qp]),kO=Object.freeze(["core","extended","dark"])});function ao(e,t){e.push(Object.freeze({venue:t.venue,symbol:t.symbol??null,reason:t.reason,evidence:t.evidence??null}))}function tS(e){let t=e.raw?.vol24h;return!!(t===0||t===0||typeof t=="number"&&Number.isFinite(t)&&t<=0)}function rS(e){return!e.bid||!e.ask?!1:gt(e.bid,e.ask)>0}function Bp(e,t,r){return Number.isSafeInteger(e.capturedAt)?t-e.capturedAt>r:!1}function co(e,t={}){if(!Array.isArray(e))throw new TypeError("quotes must be an array");let r=t.nowMs??Date.now(),n=t.quoteFreshnessMs??Zx,o=t.oracleFreshnessMs??eS,i=t.includeDormant===!0,s=[],a=[];for(let c of e){if(tS(c)){i?s.push(Object.freeze({...c,staleData:!0})):ao(a,{venue:c.venue,symbol:c.symbolRaw??c.symbol,reason:so.DORMANT_VENUE,evidence:{vol24h:c.raw?.vol24h??null}});continue}if(rS(c)){ao(a,{venue:c.venue,symbol:c.symbolRaw??c.symbol,reason:so.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(Bp(c,r,n)){ao(a,{venue:c.venue,symbol:c.symbolRaw??c.symbol,reason:so.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=Hr(r),d=u==="core"?o:o*2;if(Bp(c,r,d)){ao(a,{venue:c.venue,symbol:c.symbolRaw??c.symbol,reason:so.STALE_ORACLE,evidence:{capturedAt:c.capturedAt,nowMs:r,session:u}});continue}}s.push(c)}return{survivors:s,excluded:a}}var so,Zx,eS,Us=v(()=>{Oe();io();so=Object.freeze({DORMANT_VENUE:"dormant-venue",CROSSED_BOOK:"crossed-book",STALE_QUOTE:"stale-quote",STALE_ORACLE:"stale-oracle"}),Zx=12e4,eS=6e5});function nS(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}`,d=a.length+o,l;return d<=0?l=`0.${"0".repeat(-d)}${u}`:d>=u.length?l=`${u}${"0".repeat(d-u.length)}`:l=`${u.slice(0,d)}.${u.slice(d)}`,`${i?"-":""}${l}`}function le(e){return e==null?null:typeof e=="string"?F(e):typeof e!="number"||!Number.isFinite(e)?null:F(nS(e))}function Fe(e,t){let r=le(e);if(r===null)throw new TypeError(`${t} must be a finite source number`);return r}var Nt=v(()=>{Oe()});function Z(e,t){throw new TypeError(`${e} ${t}`)}function Mp(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function Rt(e,t){Mp(e)||Z(t,"must be an object")}function jp(e,t,r){Object.hasOwn(e,t)||Z(`${r}.${t}`,"is required")}function rr(e,t){(typeof e!="string"||e.length===0)&&Z(t,"must be a nonempty string")}function zr(e,t,r){t.has(e)||Z(r,`must be one of ${[...t].join(", ")}`)}function Fs(e,t){(!Number.isSafeInteger(e)||e<0)&&Z(t,"must be a nonnegative safe integer")}function Bs(e,t,r=!1){e===null&&r||(Mp(e)||Z(t,"must be a fixed point value"),typeof e.mantissa!="bigint"&&Z(`${t}.mantissa`,"must be a bigint"),(!Number.isSafeInteger(e.scale)||e.scale<0)&&Z(`${t}.scale`,"must be a nonnegative safe integer"))}function uo(e,t,r=!1){e===null&&r||Rt(e,t)}function Dp(e,t){Rt(e,t),rr(e.venue,`${t}.venue`),rr(e.reason,`${t}.reason`),lS.test(e.reason)||Z(`${t}.reason`,"must be a machine readable lower case code"),Object.hasOwn(e,"symbol")&&e.symbol!==null&&rr(e.symbol,`${t}.symbol`)}function xe(e){Rt(e,"quote");for(let r of["venue","chain","instrument","tier","symbolRaw","symbol","side","requestedSize",...Fp,"costAccounted","capturedAt","blockOrSeq","raw"])jp(e,r,"quote");rr(e.venue,"quote.venue"),!(typeof e.chain=="string"&&e.chain.length>0)&&!(Number.isSafeInteger(e.chain)&&e.chain>=0)&&Z("quote.chain","must be a nonempty string or nonnegative chain id"),zr(e.instrument,oS,"quote.instrument"),zr(e.tier,iS,"quote.tier"),rr(e.symbolRaw,"quote.symbolRaw"),rr(e.symbol,"quote.symbol"),zr(e.side,sS,"quote.side"),Bs(e.requestedSize,"quote.requestedSize"),e.requestedSize.mantissa<0n&&Z("quote.requestedSize","must not be negative");let t=0;for(let r of uS)Object.hasOwn(e,r)&&(Bs(e[r],`quote.${r}`),t+=1);t===0&&Z("quote","must contain at least one of bid, ask, mid, mark");for(let r of Fp)Bs(e[r],`quote.${r}`,!0);if(typeof e.costAccounted!="boolean"&&Z("quote.costAccounted","must be a boolean"),e.costAccounted){for(let r of["fees","gasEstimate","priceImpact"])e[r]===null&&Z(`quote.${r}`,"cannot be unknown when costAccounted is true");e.instrument==="perp"&&e.fundingHourly===null&&Z("quote.fundingHourly","cannot be unknown when costAccounted is true for a perp")}return e.instrument==="spot"&&e.fundingHourly!==null&&Z("quote.fundingHourly","must be null for a spot quote"),Fs(e.capturedAt,"quote.capturedAt"),e.blockOrSeq!==null&&!(typeof e.blockOrSeq=="string"&&e.blockOrSeq.length>0)&&!(Number.isSafeInteger(e.blockOrSeq)&&e.blockOrSeq>=0)&&Z("quote.blockOrSeq","must be null, a nonempty string, or a nonnegative safe integer"),Rt(e.raw,"quote.raw"),e}function lo(e){Rt(e,"rankResult");for(let t of["rankedOn","ranked","winner","runnersUp","improvementBps","sourcesAnswered","sourcesTried","failed","excluded","darkWindow","instrumentMix","bestPreparable"])jp(e,t,"rankResult");return zr(e.rankedOn,aS,"rankResult.rankedOn"),Array.isArray(e.ranked)||Z("rankResult.ranked","must be an array"),e.ranked.forEach((t,r)=>uo(t,`rankResult.ranked[${r}]`)),uo(e.winner,"rankResult.winner",!0),e.ranked.length===0&&e.winner!==null&&Z("rankResult.winner","must be null when ranked is empty"),e.ranked.length>0&&e.winner===null&&Z("rankResult.winner","must be present when ranked is not empty"),Array.isArray(e.runnersUp)||Z("rankResult.runnersUp","must be an array"),e.runnersUp.forEach((t,r)=>uo(t,`rankResult.runnersUp[${r}]`)),e.improvementBps!==null&&!(typeof e.improvementBps=="number"&&Number.isFinite(e.improvementBps))&&Z("rankResult.improvementBps","must be a finite number or null"),Fs(e.sourcesAnswered,"rankResult.sourcesAnswered"),Fs(e.sourcesTried,"rankResult.sourcesTried"),e.sourcesAnswered>e.sourcesTried&&Z("rankResult.sourcesAnswered","must not exceed sourcesTried"),Array.isArray(e.failed)||Z("rankResult.failed","must be an array"),e.failed.forEach((t,r)=>Dp(t,`failed[${r}]`)),Array.isArray(e.excluded)||Z("rankResult.excluded","must be an array"),e.excluded.forEach((t,r)=>Dp(t,`excluded[${r}]`)),e.darkWindow!==null&&Rt(e.darkWindow,"rankResult.darkWindow"),zr(e.instrumentMix,cS,"rankResult.instrumentMix"),uo(e.bestPreparable,"rankResult.bestPreparable",!0),Object.hasOwn(e,"carry")&&e.carry!==null&&Rt(e.carry,"rankResult.carry"),e}var oS,iS,sS,aS,cS,uS,Fp,lS,st=v(()=>{oS=new Set(["spot","perp"]),iS=new Set(["read-only","quote-only","prepare","intent"]),sS=new Set(["buy","sell"]),aS=new Set(["net-of-cost","gross"]),cS=new Set(["homogeneous","heterogeneous"]),uS=["bid","ask","mid","mark"],Fp=["fees","gasEstimate","priceImpact","fundingHourly"],lS=/^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$/});function Hp(){return ve().venues.arcus}function mS(){return Object.keys(Hp().markets).sort()}function hS({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=Hp().markets[n];if(!o)return null;let i=Fe(o.mark,`${n}.mark`),s=le(o.oracle),a=le(o.fundingHourly),c=r===null?F("0"):r,u={venue:dS,chain:pS,instrument:"perp",tier:fS,symbolRaw:e,symbol:n,side:t,requestedSize:c,mark:i,fees:null,gasEstimate:null,priceImpact:null,fundingHourly:a,costAccounted:!1,capturedAt:ve().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:po,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),xe(u)}function fo({side:e="buy",sizeUsd:t=null}={}){return mS().map(r=>hS({symbol:r,side:e,sizeUsd:t})).filter(r=>r!==null)}var dS,pS,fS,po,Ds=v(()=>{Be();Nt();Oe();st();dS="arcus_perp",pS="robinhood-4663",fS="quote-only",po="0.00000480324074074"});function Ms(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 F("0");let n=F(String(t)),o=we(10000n,0);return Ae(Ae(e,n),o)}function Vp(e,t,r={}){if(e.instrument!=="perp")return{model:"current-funding-held-constant",horizonHours:t,carryBps:F("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=yS(n,t),c=t-a,u=F(po),d=Ms(i,c),l=Ms(u,a),p=Math.max(d.scale,l.scale),f={mantissa:d.mantissa*10n**BigInt(p-d.scale)+l.mantissa*10n**BigInt(p-l.scale),scale:p};return{model:"current-funding-held-constant",horizonHours:t,carryBps:f,carryBpsDisplay:Le(f),confidence:"estimate",darkHours:a,litHours:c,darkWindowRate:po,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=Ms(i,t);return{model:"current-funding-held-constant",horizonHours:t,carryBps:s,carryBpsDisplay:Le(s),confidence:"estimate",compounding:"ignored",compoundingErrorBoundNote:"simple sum; at 30d and 1e-5/h the ignored compound is under 0.5bp"}}function yS(e,t){if(t<=0)return 0;let r=0,n=Math.floor(t);for(let o=0;o<n;o+=1)Ls(e+o*zp)&&(r+=1);return t>n&&Ls(e+n*zp)&&(r+=t-n),r}var zp,DO,Wp=v(()=>{Oe();Ds();io();zp=36e5,DO=24*365});function gS(e){return e.mid??e.mark??e.ask??e.bid??null}function bS(e){let t=gS(e);if(t===null)return null;let r=e.costAccounted===!0,n=F("0");e.fees!==null?n=yt(n,e.fees):r=!1,e.priceImpact!==null?n=yt(n,e.priceImpact):e.requestedSize&&e.requestedSize.mantissa>0n&&(r=!1),e.gasEstimate===null?r=!1:n=yt(n,e.gasEstimate);let o;if(e.fees!==null&&gt(e.fees,F("1"))<0&&gt(e.fees,F("0"))>=0){let i=yt(F("1"),e.fees);o=Ae(t,i),e.priceImpact!==null&&(o=yt(o,Ae(t,e.priceImpact)))}else o=yt(t,n);return{net:o,costAccounted:r,px:t}}function wS(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 xS(e,t){if(!e||!t||!e.costAccounted||!t.costAccounted||e.instrument!==t.instrument||e.net.mantissa===0n)return null;let r=jr(t.net,e.net);return Ue(Ae(r,we(10000n,0)),t.net,4)}function mo(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 b=co(e,{nowMs:r});o=b.survivors,i=b.excluded}let s=e.length,a=[],c=t.horizonHours,u=Number.isFinite(c)&&c>0,d=[];for(let b of o){let y=bS(b);if(y===null)continue;let k=null;if(u&&b.instrument==="perp"&&(k=Vp(b,c,{nowMs:r}),k.carryBps!==null)){let E=yt(F("1"),Ue(k.carryBps,we(10000n,0),12));y.net=Ae(y.net,E),y.costAccounted=!1}d.push(wS(b,y,k))}let l=d,p="homogeneous";if(u)p="heterogeneous",l=d;else{let b=d.filter(k=>k.instrument==="spot"),y=d.filter(k=>k.instrument==="perp");b.length>0&&y.length>0?(l=b.length>=y.length?b:y,p="homogeneous"):(l=d,p="homogeneous")}l.sort((b,y)=>{let k=gt(b.net,y.net);return k!==0?k:b.venue<y.venue?-1:b.venue>y.venue?1:0});let f=l[0]??null,m=l.slice(1),g=l,h="gross";f&&f.costAccounted&&(m.length===0||m[0].costAccounted)&&(h="net-of-cost");let w=m.length===0?null:xS(f,m[0]),S=d.find(b=>b.tier==="prepare")??null,_=Hr(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=SS(d));let A={rankedOn:h,ranked:g,winner:f,runnersUp:m,improvementBps:w===null?null:Number(Le(w)),sourcesAnswered:s,sourcesTried:n,failed:a,excluded:i,darkWindow:x,instrumentMix:p,bestPreparable:S,carry:f?.carry??null,breakEvenHorizonHours:O};return lo(A)}function SS(e){let t=e.filter(i=>i.instrument==="spot").sort((i,s)=>gt(i.net,s.net))[0],r=e.filter(i=>i.instrument==="perp").sort((i,s)=>gt(i.net,s.net))[0];if(!t||!r||r.fundingHourly===null)return null;let n=jr(t.net,r.net);if(n.mantissa===0n)return 0;let o=Ae(r.fundingHourly,r.price);if(o.mantissa===0n)return null;try{let i=Ue(n,o,4),s=Number(Le(i));return!Number.isFinite(s)||s<0?null:s}catch{return null}}var js=v(()=>{Us();Wp();io();Oe();st()});function Hs(){return oo()}function _S(e){return{mantissa:e*e*10n**BigInt(nr)/vS,scale:nr}}function OS(e){let t=_S(BigInt(e.sqrtPriceX96)),r=e.quote==="USDG"?6:18,n=18;if(e.quoteIsToken0){let o=Ue(Ae(t,we(10n**BigInt(r),0)),we(10n**BigInt(n),0),nr);return o.mantissa===0n?null:Ue(F("1"),o,nr)}return Ue(Ae(t,we(10n**BigInt(n),0)),we(10n**BigInt(r),0),nr)}function CS(e){let t=kp(),r=t.assets[e];return r?we(r.rawPrice,t.oracleScaleExp):null}function TS(e,t){if(e===null||t===null||e.mantissa<=0n||t.mantissa<=0n)return null;let r={...e};return Ue(t,NS(r,t),nr)}function NS(e,t){let r=Math.max(e.scale,t.scale);return{mantissa:Mr(e,r).mantissa+Mr(t,r).mantissa,scale:r}}function RS(e){let t=Hs(),r=IS[e];return r?{wei:BigInt(t.gasPriceWei)*r,units:r,native:"ETH"}:null}function zs(){return Object.keys(Hs().pools).sort()}function or({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=Hs(),o=n.pools[e];if(!o)return null;let i=OS(o);if(i===null)return null;let s=le(o.liqUsd),a=r===null?F("0"):r,c=o.feePpm===null||o.feePpm===void 0?null:Ue(we(BigInt(o.feePpm),0),we(1000000n,0),8),u=a.mantissa===0n?F("0"):TS(s,a),d=RS(o.version),f={venue:ES,chain:kS,instrument:"spot",tier:AS,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:d===null?null:d.wei.toString(),gasUnits:d===null?null:d.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=CS(e);return m!==null&&(f.referencePrice=m,f.referenceBasisBps=Le(Ue(Ae(jr(i,m),we(10000n,0)),m,4))),xe(f)}function Gp({side:e="buy",sizeUsd:t=null}={}){return zs().map(r=>or({symbol:r,side:e,sizeUsd:t})).filter(r=>r!==null)}var ES,kS,AS,vS,nr,IS,Vs=v(()=>{Be();Nt();Oe();st();ES="rh_uniswap",kS=4663,AS="prepare",vS=1n<<192n,nr=18,IS=Object.freeze({v3:180000n,v4:240000n})});function ho(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=or({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>Kp)throw new Error(`quote is stale (${a}ms old, bound ${Kp}ms); re-quote before preparing`);let u=oo().pools[t],d=u.version==="v4"?PS:$S,l=d,p=r==="buy"?u.quoteAddr:u.token;return Object.freeze({artifactKind:"unsigned-tx",chainId:4663,to:d,data:"0x",value:"0",requiresApproval:{spender:l,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 Kp,$S,PS,Ws=v(()=>{Vs();Be();Kp=12e4,$S="0x0000000000000000000000000000000000000000",PS="0x84b75b19A3cdf8E2F56d0507d22D442847B2053C"});function Vr(){return ve().venues.hyperliquid_hip3}function Xp(){return Object.keys(Vr().dexs).sort()}function BS(){let e=[];for(let[t,r]of Object.entries(Vr().dexs))for(let n of Object.keys(r))e.push(`${t}:${n}`);return e.sort()}function FS(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=Vr().dexs[n]?.[o];return i?[{dex:n,ticker:o,market:i}]:[]}let r=[];for(let[n,o]of Object.entries(Vr().dexs))Object.hasOwn(o,e)&&r.push({dex:n,ticker:e,market:o[e]});return r}function DS(e,t){try{return Op().books[`${e}:${t}`]??null}catch{return null}}function MS(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(Le(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),d=Number(c.sz);if(!(u>0)||!(d>0))continue;let l=u*d,p=Math.min(o,l),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 jS(e,t,r,n){let o=MS(e,t,r);if(!o)return{impact:null,depth:null};let i=Number(Le(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:le(Number(a.toPrecision(12))),depth:{...o,impactFraction:a,fullyFilled:o.unfilledUsd<=1e-6}}}function Yp({dex:e,ticker:t,market:r,side:n,size:o}){let i=Fe(r.mark,`${e}:${t}.mark`),s=le(r.fundingHourly),a=le(r.vol24h),c=le(r.oi),u=o===null?F("0"):o,d=DS(e,t),l=null,p=null,f="fees and gas not captured";if(u.mantissa>0n)if(d){let h=jS(d,n,u,i);l=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 d?f="zero size; fees and gas not captured":f="no order book depth wired for this coin; fees and gas not captured";let g={venue:qS,chain:LS,instrument:"perp",tier:US,symbolRaw:`${e}:${t}`,symbol:t,side:n,requestedSize:u,mark:i,fees:null,gasEstimate:null,priceImpact:l,fundingHourly:s,costAccounted:!1,capturedAt:ve().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:d!==null,l2BookFixture:d?"fixtures/hip3_l2books.json":null,depth:p}};return a!==null&&(g.raw.vol24hFixed=a),c!==null&&(g.raw.oiFixed=c),d?.bids?.[0]&&d?.asks?.[0]&&(g.bid=F(String(d.bids[0].px)),g.ask=F(String(d.asks[0].px))),xe(g)}function Qp({symbol:e,side:t="buy",sizeUsd:r=null}={}){let n=FS(e);return n.length===0||n.length>1?null:Yp({...n[0],side:t,size:r})}function yo({side:e="buy",sizeUsd:t=null,ticker:r=null}={}){let n=[];for(let o of BS()){let[i,s]=o.split(":");if(r!==null&&s!==r)continue;let a=Vr().dexs[i][s];n.push(Yp({dex:i,ticker:s,market:a,side:e,size:t}))}return n}var qS,LS,US,Jp=v(()=>{Be();Nt();Oe();st();qS="hyperliquid_hip3",LS="hyperliquid",US="quote-only"});function Zp(){return ve().venues.arcus_spot}function WS(){return Object.keys(Zp().pairs).sort()}function GS({symbol:e,side:t="buy",sizeUsd:r=null}={}){if(typeof e!="string"||e.length===0)return null;let n=Zp().pairs[e];if(!n)return null;let o=n.bid===void 0||n.bid===null?null:Fe(n.bid,`${e}.bid`),i=n.ask===void 0||n.ask===null?null:Fe(n.ask,`${e}.ask`),s=le(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 l=Math.max(o.scale,i.scale),p=o.scale===l?o.mantissa:o.mantissa*10n**BigInt(l-o.scale),f=i.scale===l?i.mantissa:i.mantissa*10n**BigInt(l-i.scale);a={mantissa:p+f,scale:l+1},a={mantissa:(p+f)/2n,scale:l}}else s!==null&&(a=s);if(o===null&&i===null&&a===null)return null;let c=r===null?F("0"):r,u=F("0"),d={venue:HS,chain:zS,instrument:"spot",tier:VS,symbolRaw:e,symbol:e,side:t,requestedSize:c,fees:u,gasEstimate:null,priceImpact:null,fundingHourly:null,costAccounted:!1,capturedAt:ve().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&&(d.bid=o),i!==null&&(d.ask=i),a!==null&&(d.mid=a),xe(d)}function go({side:e="buy",sizeUsd:t=null}={}){return WS().map(r=>GS({symbol:r,side:e,sizeUsd:t})).filter(r=>r!==null)}var HS,zS,VS,ef=v(()=>{Be();Nt();Oe();st();HS="arcus_spot",zS="robinhood-4663",VS="quote-only"});function bo(){return Ip()}function Gs(){return Object.keys(bo().tokens).sort()}function QS(e){let t=bo().pairs[e];return!t||t.length===0?null:[...t].sort((r,n)=>(n.liquidityUsd??0)-(r.liquidityUsd??0))[0]}function JS(e,t){if(e===null||t===null)return null;if(e.mantissa<=0n||t.mantissa<=0n)return F("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 Ks({symbol:e,side:t="buy",sizeUsd:r=null}={}){if(typeof e!="string"||e.length===0)return null;let n=e,o=e,i=bo().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=QS(n);if(!s||!a)return null;let c=Fe(a.priceUsd,`${n}.priceUsd`),u=le(a.liquidityUsd),d=r===null?F("0"):r,l=d.mantissa===0n?F("0"):JS(u,d),p=!1;d.mantissa===0n&&(a.liquidityUsd??0)>=tf&&(p=!1);let f={venue:KS,chain:XS,instrument:"spot",tier:YS,symbolRaw:o,symbol:n,side:t,requestedSize:d,mid:c,fees:null,gasEstimate:null,priceImpact:l,fundingHourly:null,costAccounted:p,capturedAt:bo().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)<tf}};return xe(f)}function rf({side:e="buy",sizeUsd:t=null}={}){return Gs().map(r=>Ks({symbol:r,side:e,sizeUsd:t})).filter(r=>r!==null)}var KS,XS,YS,tf,nf=v(()=>{Be();Nt();Oe();st();KS="solana_xstocks",XS="solana",YS="quote-only",tf=25e3});function wo(){return _p()}function Xs(){return Object.keys(wo().tokens).sort()}function oE(e){let t=wo().pairs[e];return!t||t.length===0?null:[...t].sort((r,n)=>(n.liquidityUsd??0)-(r.liquidityUsd??0))[0]}function iE(e,t){if(e===null||t===null)return null;if(e.mantissa<=0n||t.mantissa<=0n)return F("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 Ys({symbol:e,side:t="buy",sizeUsd:r=null}={}){if(typeof e!="string"||e.length===0)return null;let n=e,o=e,i=wo().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=oE(n);if(!s||!a)return null;let c=Fe(a.priceUsd,`${n}.priceUsd`),u=le(a.liquidityUsd),d=r===null?F("0"):r,l=d.mantissa===0n?F("0"):iE(u,d),f={venue:ZS,chain:eE,instrument:"spot",tier:tE,symbolRaw:o,symbol:n,side:t,requestedSize:d,mid:c,fees:null,gasEstimate:null,priceImpact:l,fundingHourly:null,costAccounted:!1,capturedAt:wo().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)<rE,impactSizeFractionHint:nE}};return xe(f)}function of({side:e="buy",sizeUsd:t=null}={}){return Xs().map(r=>Ys({symbol:r,side:e,sizeUsd:t})).filter(r=>r!==null)}var ZS,eE,tE,rE,nE,sf=v(()=>{Be();Nt();Oe();st();ZS="ton_stonfi",eE="ton",tE="quote-only",rE=25e3,nE=.01});var xo={};j(xo,{bestEquityRoute:()=>sE,collectEquityQuotes:()=>cf,equityVenues:()=>aE,getUniverse:()=>Ep,getVenues:()=>ve,loadFixtures:()=>Rs,prepareEquity:()=>ho,prepareEquityRoute:()=>cE,rankEquityQuotes:()=>mo,toJsonSafe:()=>uE,validateQuote:()=>xe,validateRankResult:()=>lo});function Qs(e){return e==null||e===""?null:typeof e=="object"&&e&&typeof e.mantissa=="bigint"?e:F(String(e))}function cf(e,{sizeUsd:t=null}={}){if(typeof e!="string"||!e.trim())throw new TypeError("ticker is required");let r=e.trim().toUpperCase(),n=Qs(t),o=[],i=Qp({symbol:`xyz:${r}`,sizeUsd:n});if(i)o.push(i);else for(let u of yo({ticker:r,sizeUsd:n}))o.push(u);for(let u of fo({sizeUsd:n}))u.symbol===r&&o.push(u);for(let u of go({sizeUsd:n}))u.symbol===r&&o.push(u);let s=or({symbol:r,sizeUsd:n});s&&o.push(s);let a=Ks({symbol:r,sizeUsd:n});a&&o.push(a);let c=Ys({symbol:r,sizeUsd:n});return c&&o.push(c),o}function sE(e={}){let t=String(e.ticker||e.symbol||"").trim().toUpperCase();if(!t)throw new Error("bestEquityRoute requires ticker");let r=Qs(e.sizeUsd??e.size??null),n=cf(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=mo(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>af}}function aE(){let e=[{venue:"hyperliquid_hip3",tier:"quote-only",chain:"hyperliquid",n:yo().length},{venue:"arcus_perp",tier:"quote-only",chain:"robinhood-4663",n:fo().length},{venue:"arcus_spot",tier:"quote-only",chain:"robinhood-4663",n:go().length},{venue:"rh_uniswap",tier:"prepare",chain:4663,n:zs().length},{venue:"solana_xstocks",tier:"quote-only",chain:"solana",n:Gs().length},{venue:"ton_stonfi",tier:"quote-only",chain:"ton",n:Xs().length}],t=[...yo(),...fo(),...go(),...Gp(),...rf(),...of()],r=(t[0]?.capturedAt??Date.now())+1e3,{survivors:n,excluded:o}=co(t,{nowMs:r});return{inventory:e,hip3Dexs:Xp(),liveness:{survivors:n.length,excluded:o.length,byReason:o.reduce((i,s)=>(i[s.reason]=(i[s.reason]??0)+1,i),{})},capturedAt:ve().capturedAt,custody:"prepare-only",note:"quote-only venues are ranked for discovery; only rh_uniswap is preparable in v1"}}function cE(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=Qs(e.sizeUsd??e.size??null),o=or({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=ho({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>af}}catch(i){return{ok:!1,failureKind:"prepare-refused",ticker:t,error:String(i.message||i)}}}function uE(e){return JSON.parse(JSON.stringify(e,(t,r)=>typeof r=="bigint"?r.toString():r))}var af,So=v(()=>{Oe();js();Ws();Us();Jp();ef();Ds();Vs();nf();sf();Be();js();Ws();st();Be();af=3600*1e3});var Eo={};j(Eo,{CHAIN_CONFIGS:()=>Dr,EVIDENCE:()=>U,RISK:()=>q,SCANNER_CAPABILITIES:()=>Xt,__clearScanners:()=>ib,createScanner:()=>El,getScanner:()=>ss,listScanners:()=>kl,registerBuiltinScanners:()=>Jn,registerCustomChain:()=>Rd,registerScanner:()=>Bn,scannerCoverage:()=>sb,validateScanner:()=>Sl});var ko=v(()=>{ft();Zn()});var ea={};j(ea,{createWatch:()=>mE,listWatches:()=>fE,removeWatch:()=>hE});import Wr from"node:fs";import Js from"node:path";import{randomUUID as lE}from"node:crypto";import{homedir as dE}from"node:os";function pE(e=process.env){return e.ORACLE_CONFIG_DIR||Js.join(dE(),".config","oracle")}function uf(e=process.env){return Js.join(pE(e),"watches.json")}function Zs(e=process.env){let t=uf(e);if(!Wr.existsSync(t))return{watches:[]};try{let r=JSON.parse(Wr.readFileSync(t,"utf8"));return{watches:Array.isArray(r.watches)?r.watches:[]}}catch{return{watches:[]}}}function lf(e,t=process.env){let r=uf(t);Wr.mkdirSync(Js.dirname(r),{recursive:!0,mode:448});let n=`${r}.${process.pid}.tmp`;Wr.writeFileSync(n,`${JSON.stringify(e,null,2)}
7
+ `,{mode:384}),Wr.renameSync(n,r)}function fE(e=process.env){return Zs(e).watches}function mE({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:lE(),chain:String(e),token:String(t),condition:String(r),note:n?String(n):null,actionMode:"alert_only",createdAt:new Date().toISOString()},s=Zs(o);return s.watches.push(i),lf(s,o),i}function hE(e,t=process.env){let r=Zs(t),n=r.watches.filter(o=>o.id!==e);return n.length===r.watches.length?!1:(lf({watches:n},t),!0)}var ta=v(()=>{});var df={};j(df,{classifyReceipt:()=>yE});function yE(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 pf=v(()=>{});function SE(e){return!(xE.has(e)||/^0x/i.test(e)||!/\d/.test(e)&&e===e.toLowerCase()||!/\d/.test(e)&&e===e.toUpperCase())}function ff(e,{extras:t=[]}={}){let r=[e,...t].map(i=>String(i||"")).join(`
8
+ `),n=[...new Set((r.match(gE)||[]).map(i=>i.toLowerCase()))].filter(i=>!wE.has(i)),o=[...new Set(r.match(bE)||[])].filter(SE);return{evm:n,solana:o,all:[...n.map(i=>({chainFamily:"evm",address:i})),...o.map(i=>({chainFamily:"solana",address:i}))]}}function mf(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(`
9
+ `)){let i=o.trim();if(i.startsWith("{"))try{n(JSON.parse(i))}catch{}}r.length||r.push({id:"",text:t,urls:[]})}return r}var gE,bE,wE,xE,hf=v(()=>{gE=/\b0x[a-fA-F0-9]{40}\b/g,bE=/\b[1-9A-HJ-NP-Za-km-z]{32,44}\b/g,wE=new Set(["0x0000000000000000000000000000000000000000","0x000000000000000000000000000000000000dead","0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee"].map(e=>e.toLowerCase())),xE=new Set(["So11111111111111111111111111111111111111112","EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v","Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB","11111111111111111111111111111111"])});import{spawnSync as EE}from"node:child_process";import yf from"node:fs";import ra from"node:path";function IE(e=process.env){let t=String(e.ORACLE_XURL_ENABLED||"").trim().toLowerCase();return t==="1"||t==="true"||t==="yes"||t==="on"}function wf(e=process.env){let t=String(e.ORACLE_XURL_ALLOW_WRITE||"").trim().toLowerCase();return t==="1"||t==="true"||t==="yes"||t==="on"}function _E(e=process.env){let t=String(e.ORACLE_XURL_BIN||"").trim();if(t)return ra.isAbsolute(t)?yf.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(ra.delimiter)){if(!n)continue;let o=ra.join(n,"xurl");try{if(yf.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 OE(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 CE(e){for(let t of e){let r=String(t);if(bf.includes(r))return r;if(bf.some(n=>n.startsWith("--")&&r.startsWith(`${n}=`)))return r.split("=")[0]}return null}function TE(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(d=>String(d)):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=CE(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(!wf(t)&&r.some(c=>/^-X$/.test(c)||/^--request$/.test(c))){let c=r.findIndex(d=>d==="-X"||d==="--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(!AE.includes(o))if(vE.includes(o)){if(!wf(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 xf(e,t={},r={}){if(e!=="xurl")return{ok:!1,error:`unknown tool: ${e}`};let n=r.env||process.env;if(!IE(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=TE(t,n);if(!o.ok)return o;let i=_E(n);if(!i.ok)return i;let a=(r.spawnFn||EE)(i.bin,o.argv,{encoding:"utf8",timeout:r.timeoutMs||gf,maxBuffer:1024*1024,env:OE(n)});if(a.error){let l=a.error.code==="ETIMEDOUT"?`xurl timed out after ${r.timeoutMs||gf}ms`:String(a.error.message||a.error);return{ok:!1,error:wt(l,{force:!0})}}let c=wt(String(a.stdout||"").slice(0,kE),{force:!0}),u=wt(String(a.stderr||"").slice(0,2e3),{force:!0}),d=typeof a.status=="number"?a.status:1;return{ok:d===0,status:d,command:o.command,argv:o.argv.map(l=>/=/.test(l)&&/token|secret|key|bearer/i.test(l)?"[redacted-arg]":l),stdout:c,stderr:u||void 0}}var gf,kE,AE,vE,bf,ZC,Sf=v(()=>{Wo();gf=45e3,kE=4e4,AE=Object.freeze(["whoami","user","read","search","timeline","mentions","bookmarks","likes","following","followers","dms","auth"]),vE=Object.freeze(["post","reply","quote","delete","like","unlike","repost","unrepost","bookmark","unbookmark","follow","unfollow","block","unblock","mute","unmute","dm"]),bf=Object.freeze(["--verbose","-v","--trace","-t","--bearer-token","--consumer-key","--consumer-secret","--access-token","--token-secret","--client-id","--client-secret"]);ZC=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 PE(e){return!e||e==="0x"||e===$E}async function Ef(e={},t={}){let r=t.rpcCall||Y,n=String(e.address||"").trim().toLowerCase(),o=Number(e.chainId);if(!/^0x[a-f0-9]{40}$/.test(n))return{status:"error",error:"address must be a 0x-prefixed EVM address",risk:"unknown-risk",findings:[],notes:[]};if(!Number.isInteger(o))return{status:"error",error:"chainId is required",risk:"unknown-risk",findings:[],notes:[]};let i;try{i=await r(o,"eth_getCode",[n,"latest"],t)}catch(m){return{address:n,chainId:o,status:"unavailable",error:m?.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[m,g]of Object.entries(NE))c.includes(m)&&a.push({selector:`0x${m}`,...g});let u=!1,d=null,l=null;for(let{label:m,slot:g}of RE)try{let h=await r(o,"eth_getStorageAt",[n,g,"latest"],t);if(!PE(h)){u=!0,d=m,l=`0x${String(h).slice(-40)}`;break}}catch{s.push(`proxy slot (${m}) unreadable; proxy status uncertain`)}u&&(a.push({selector:d,name:"proxy",weight:"high",note:"implementation is upgradeable \u2014 current behaviour is not a guarantee"}),s.push(`bytecode scan covers the proxy (${d}), not the implementation ${l} it delegates to`));let f=a.filter(m=>m.weight==="high").length>0?"high":a.length>0?"elevated":"unknown-risk";return f==="unknown-risk"&&s.push("no owner-power selectors found; this is weak evidence, not a safety guarantee"),{address:n,chainId:o,status:"ok",risk:f,findings:a,isProxy:u,proxyStandard:d,implementation:l,codeSize:Math.floor(c.length/2),notes:s}}var NE,RE,$E,kf=v(()=>{nt();NE=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"}}),RE=Object.freeze([{label:"eip1967",slot:"0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc"},{label:"zeppelinos",slot:"0x7050c9e0f4ca769c69bd3a8ef740bc37934f8e2c036e5a723fd8ee048ed3f8c3"},{label:"eip1822",slot:"0xc5f16f0fcc639fa48a6947836d9850f504798523bf8c9a3a87d5876cf622bcf7"}]),$E=`0x${"0".repeat(64)}`});function Ao(e,t){let r=String(e||"").trim();if(!qE.test(r))throw new Error(`evm-token-sniper: ${t} must be a 0x EVM address`);return r}function na(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 Gr(e,t){return e==null||e===""?null:na(e,t)}function UE({chainId:e,tokenAddress:t,tokenIn:r,amountIn:n,recipient:o,quote:i,topPool:s,unsignedTx:a,args:c,opts:u}){let d=a?.tx;if(!d||typeof d!="object")throw new Error("local-signer envelope requires unsigned tx object");let l=Ao(d.to,"prepared destination"),p=String(d.data||"").toLowerCase();if(!/^0x[0-9a-f]+$/.test(p))throw new Error("local-signer envelope requires hex calldata");let f=na(d.value??n,"prepared native value");if(BigInt(f)!==BigInt(n))throw new Error("local-signer envelope requires native value equal amountIn");let m=Gr(d.gasLimit??c.gasLimit,"gasLimit"),g=Gr(d.maxFeePerGas??c.maxFeePerGas,"maxFeePerGas");if(!m||!g)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)),S=ji({chainId:e,venue:"uniswap-v3",quoteAmountOut:i?.amountOut,liquidityUsd:s?.liquidityUsd,requestedCapBps:c.slippageBps??50,quotedAtMs:h,ttlMs:w,secret:u.routeAttestationSecret}),_=ke(S,{chainId:e,venue:"uniswap-v3",data:p,secret:u.routeAttestationSecret}),x={chainId:e,from:o,to:l,data:p,value:f,gasLimit:m,maxFeePerGas:g,slippageBps:_.selectedBps,expiresAtMs:h+w},O=Gr(d.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=Gr(c.l1FeeWei,"l1FeeWei")??"0"),c.operatorFeeWei!==void 0&&(x.operatorFeeWei=Gr(c.operatorFeeWei,"operatorFeeWei")??"0"),{version:1,surface:"evm-swap",action:"swap",provider:"uniswap-v3",owner:o,destination:l,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 BE(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}Jn();let r=ss(e);if(!r)throw new Error(`evm-token-sniper: unsupported EVM chainId ${e}`);return r}function FE({token:e,pools:t,structuralRisk:r,scannerRisk:n,sellability:o,quote:i,args:s,scanner:a}){let c=[];return e?.evidence!==U.LIVE&&c.push("token identity is not live-verified"),(!Array.isArray(t?.pools)||t.pools.length===0)&&c.push("no liquid pool was resolved"),r?.status!=="ok"&&c.push("structural contract risk is unavailable"),r?.risk==="high"&&c.push("structural contract risk is high"),n?.verdict!==q.PASS&&c.push(`scanner risk verdict is ${n?.verdict||"UNKNOWN"}`),a.supports?.("sellSimulation")?o?.verdict!==q.PASS&&c.push(`sellability verdict is ${o?.verdict||"UNKNOWN"}`):c.push("sell simulation is unavailable on this chain"),a.supports?.("quote")?i?.evidence!==U.LIVE&&c.push("no live quote was returned"):c.push("live quoting is unavailable on this chain"),a.supports?.("prepareUnsignedTx")||c.push("unsigned transaction preparation is unavailable on this chain"),s.tokenIn||c.push("tokenIn is required to prepare"),s.amountIn||c.push("amountIn is required to prepare"),s.recipient||c.push("recipient is required to prepare"),c}async function Af(e={},t={}){let r=Number(e.chainId??LE);if(!Number.isInteger(r)||r<=0)throw new Error("evm-token-sniper: chainId must be a positive integer");let n=Ao(e.tokenAddress||e.address||e.token,"tokenAddress"),o=e.tokenIn?Ao(e.tokenIn,"tokenIn"):null,i=e.recipient?Ao(e.recipient,"recipient"):null,s=e.amountIn==null?null:na(e.amountIn,"amountIn"),a=BE(r,t.scanner),c=t.scanContractRisk||Ef,[u,d,l]=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 g={...e,tokenIn:o,amountIn:s,recipient:i},h=FE({token:u,pools:d,structuralRisk:l,scannerRisk:p,sellability:f,quote:m,args:g,scanner:a}),w=null,S=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{S=UE({chainId:r,tokenAddress:n,tokenIn:o,amountIn:s,recipient:i,quote:m,topPool:d?.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:!!S,signing:"local-signer",broadcasting:"local-signer",chainId:r,chain:{key:a.key,name:a.name,nativeCurrency:a.nativeCurrency},token:u,pools:d,topPool:d?.pools?.[0]||null,structuralRisk:l,scannerRisk:p,sellability:f,quote:m,blockedReasons:h,prepared:!!w,unsignedTx:w,localSignerEnvelope:S,localSignerBlockedReason:_,signed:S?"pending-local-signer":!1,broadcast:S?"pending-local-signer":!1}}var qE,LE,vf=v(()=>{Zn();ft();Re();kf();qE=/^0x[0-9a-fA-F]{40}$/,LE=4663});var Tf={};j(Tf,{evaluateContracts:()=>Cf,fetchAccountTweets:()=>Of,snipeExecuteEnabled:()=>If,tickTwitterCaWatch:()=>VE,twitterSnipeEmitsCard:()=>WE});function If(e=process.env){return String((e||process.env).ORACLE_SNIPE_EXECUTE||"").trim()==="1"}function _f(e){return String(e||"").trim().replace(/^@/,"")}async function Of({handle:e,limit:t=5,xurlFn:r=xf}={},n={}){let o=_f(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:mf(i.stdout),raw:i}:{ok:!1,error:i?.error||"xurl search failed",tweets:[]}}async function HE(e,{chainId:t,amountIn:r,tokenIn:n,recipient:o,prepare:i},s){let a=await Af({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 zE(e,t){let r=await il(e,{chainSlug:"solana",stables:[ME,jE]},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 Cf(e,t={},r={}){let n=Number(t.chainId??DE),o=[];for(let i of e.evm||[])o.push(await HE(i,{...t,chainId:n},r));for(let i of e.solana||[])o.push(await zE(i,r));return o}async function VE(e={},t={}){let r=_f(e.handle),n=e.seen instanceof Set?e.seen:new Set(e.seen||[]),o=await Of({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=ff(a.text,{extras:a.urls||[]});if(!u.all.length){n.add(c);continue}let l=await(t.evaluateFn||Cf)(u,e,t);n.add(c),i.push({tweetId:a.id||null,handle:r,text:a.text,contracts:u,evaluations:l})}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:If(t.env||process.env),hits:i,seen:[...n]}}function WE(e={}){return!e||typeof e!="object"||e.source==="twitter-ca-watch"||e.automated===!0||e.card===!1||e.notify===!1,!1}var DE,ME,jE,Nf=v(()=>{hf();Sf();vf();Or();rn();DE=4663,ME="EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",jE="Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB"});import{wordlists as GE}from"ethers";function QE(e){let t=String(e).trim().toLowerCase().split(/\s+/).filter(Boolean);return YE.has(t.length)&&t.every(r=>GE.en.getWordIndex(r)>=0)}function tk(e){let t=Rf(e);return ek.has(t)||ZE.test(t)}function Rf(e){return String(e).replace(/[^a-z0-9]/gi,"").toLowerCase()}function rk(e){let t=Rf(e);return[...KE].some(r=>t.includes(r))}function nk(e,t,r){if(typeof t=="string"){if(XE.some(n=>n.test(t))||QE(t))throw new Kr(r);if(JE.test(t)&&!tk(e))throw new Kr(r)}}function oa(e,t="$",r=""){if(e==null||typeof e=="boolean")return e;if(typeof e=="string")return nk(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)=>oa(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(rk(o))throw new Kr(i);e[o]!==void 0&&(n[o]=oa(e[o],i,o))}return n}function ir(e){return oa(e)}var KE,XE,YE,JE,ZE,ek,Kr,ia=v(()=>{KE=new Set(["privatekey","privkey","secretkey","seedphrase","seed","mnemonic","passphrase","password","keystore","keymaterial","wif","xprv","xpriv","bearer","authorization","signature","apikey","credential"]),XE=[/\b[5KL][1-9A-HJ-NP-Za-km-z]{50,51}\b/,/\bxprv[0-9A-Za-z]{50,}\b/],YE=new Set([12,15,18,21,24]);JE=/^\s*(?:0x)?[0-9a-fA-F]{64}\s*$/,ZE=/(hash|digest|root|salt|nonce|proof|commitment|sig|id)(?:e?s)?$/i,ek=new Set(["calldata","data","publickey","pubkey","message","payload","input","extradata"]);Kr=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 ok,chmod as vo,readFile as ik,rename as sk,writeFile as ak}from"node:fs/promises";import{homedir as ck}from"node:os";import{dirname as $f,join as sa}from"node:path";import uk from"sql.js";function Oo(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(Oo).join(",")}]`:`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${Oo(e[t])}`).join(",")}}`}function Pf(e){if(!lk.has(e))throw new TypeError(`unknown artifact type: ${e}`);return e}function Io(e){let t=[];for(;e.step();)t.push(e.getAsObject());return e.free(),t}function _o(e){return e?{id:e.id,type:e.type,createdAt:e.created_at,data:JSON.parse(e.data_json)}:null}async function qf(e={}){let t=e.path||fk;await ok($f(t),{recursive:!0,mode:448}),await vo($f(t),448);let r;try{r=await ik(t)}catch(u){if(u.code!=="ENOENT")throw u}let n=await uk(e.sqlJs||{}),o=r?new n.Database(r):new n.Database;o.run(`
10
+ PRAGMA foreign_keys=ON;
11
+ CREATE TABLE IF NOT EXISTS artifacts (
12
+ id TEXT PRIMARY KEY, type TEXT NOT NULL, created_at TEXT NOT NULL, data_json TEXT NOT NULL
13
+ );
14
+ CREATE TABLE IF NOT EXISTS artifact_edges (
15
+ parent_id TEXT NOT NULL REFERENCES artifacts(id), child_id TEXT NOT NULL REFERENCES artifacts(id),
16
+ PRIMARY KEY(parent_id, child_id)
17
+ );
18
+ CREATE TABLE IF NOT EXISTS action_receipts (
19
+ artifact_id TEXT PRIMARY KEY REFERENCES artifacts(id), receipt_json TEXT NOT NULL
20
+ );
21
+ `);let i=!1,s=Promise.resolve();function a(){let u=async()=>{let d=`${t}.tmp-${process.pid}`;await ak(d,Buffer.from(o.export()),{mode:384}),await vo(d,384),await sk(d,t),await vo(t,384)};return s=s.then(u,u),s}r?await vo(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 d=Pf(String(u.type)),l=String(u.id||"").trim();if(!l)throw new TypeError("artifact id required");let p=ir(u.data??{}),f=String(u.createdAt||new Date().toISOString());return o.run("INSERT INTO artifacts(id,type,created_at,data_json) VALUES(?,?,?,?)",[l,d,f,Oo(p)]),await a(),{id:l,type:d,createdAt:f,data:p}},getArtifact(u){c();let d=o.prepare("SELECT * FROM artifacts WHERE id=?");d.bind([String(u)]);let l=d.step()?_o(d.getAsObject()):null;return d.free(),l},listArtifacts(u){c();let d=u===void 0?o.prepare("SELECT * FROM artifacts ORDER BY created_at,id"):(Pf(String(u)),o.prepare("SELECT * FROM artifacts WHERE type=? ORDER BY created_at,id"));return u!==void 0&&d.bind([String(u)]),Io(d).map(_o)},async link(u,d){c();let l=o.prepare("SELECT id,type FROM artifacts WHERE id IN (?,?)");l.bind([String(u),String(d)]);let p=Io(l),f=p.find(g=>g.id===String(u)),m=p.find(g=>g.id===String(d));if(!f||!m)throw new TypeError("edge endpoints must exist");if(!dk.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 d=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 d.bind([String(u)]),Io(d).map(_o)},parents(u){c();let d=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 d.bind([String(u)]),Io(d).map(_o)},async putReceipt(u,d){c();let l=this.getArtifact(u);if(!l||l.type!=="receipt")throw new TypeError("receipt boundary requires a receipt artifact");let p=ir(d);return o.run("INSERT INTO action_receipts(artifact_id,receipt_json) VALUES(?,?)",[String(u),Oo(p)]),await a(),p},getReceipt(u){c();let d=o.prepare("SELECT receipt_json FROM action_receipts WHERE artifact_id=?");d.bind([String(u)]);let l=d.step()?JSON.parse(d.getAsObject().receipt_json):null;return d.free(),l},async close(){i||(await a(),o.close(),i=!0)}}}var aa,lk,dk,pk,fk,Lf=v(()=>{ia();aa=Object.freeze(["project","entity","source","thesis","strategy","simulation","prepared_action","receipt","position"]),lk=new Set(aa),dk=new Set(aa.slice(0,-1).map((e,t)=>`${e}:${aa[t+1]}`)),pk=sa(process.env.ORACLE_CONFIG_DIR||sa(ck(),".config","oracle"),"workspace"),fk=sa(pk,"artifacts.sqlite")});import{createHash as Uf}from"node:crypto";function hk(e){return mk.has(String(e).replace(/[^a-z0-9]/gi,"").toLowerCase())}function ca(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(ca).join(",")}]`:`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${ca(e[t])}`).join(",")}}`}function yk(e){return Uf("sha256").update(String(e)).digest("hex")}function Bf(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(hk(r))throw new TypeError("research source URL must not contain sensitive query parameters");return t.toString()}function Ff(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 gk(e={}){let t=Bf(e.url??e.sourceUrl),r=Ff(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(ir({url:t,fetchedAt:r,contentHash:n}))}function Df(e={}){let t=Bf(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=Ff(e.fetchedAt),s=yk(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(gk),c=ir({sourceUrl:t,fetchedAt:i,contentHash:s,snapshot:r,claim:n,confidence:o,contradictions:(e.contradictions||[]).map(String),citations:a});return Object.freeze({id:`research:${Uf("sha256").update(ca(c)).digest("hex")}`,...c})}var mk,Mf=v(()=>{ia();mk=new Set(["accesstoken","refreshtoken","idtoken","token","apikey","clientsecret","password","auth","jwt","session","secret","key","code","signature","xamzsignature","privatekey","authorization","bearer","credential"])});function jf(e){if(e===null||e===""||e===void 0)return null;let t=Number(e);return Number.isFinite(t)&&t>=0?t:null}function Xr(e){return Math.round((e+Number.EPSILON)*1e8)/1e8}function la(e,t){return t>0?Xr(e/t*100):null}function da(e){return e.address||e.owner||e.walletAddress||e.wallet?.address||null}function xk(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 $t(e,t,r={}){if(!t||typeof t!="object")return;let n=String(t.symbol??t.coin??t.name??t.collection??t.tokenId??"unknown"),o=jf(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||wk.has(n.toUpperCase())})}function Sk(e){let t=[],r=da(e);for(let n of e.assets||e.holdings||[])$t(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)&&$t(t,{...n.native,symbol:n.native.symbol??n.symbol??o},i);for(let a of n.assets||n.fungibleTokens?.assets||[])$t(t,a,i);for(let a of n.collectibles?.assets||n.nfts||[])$t(t,{...a,kind:"nft"},i);for(let a of n.spot?.balances||[])$t(t,a,{...i,venue:"Hyperliquid spot"});let s=jf(n.perps?.accountValueUsd);s!=null&&$t(t,{symbol:"perps account",usdValue:s},{...i,venue:"Hyperliquid perps"})}for(let n of e.inventory?.items||e.nfts?.items||[])$t(t,{...n,kind:"nft"},{address:r,chain:n.chain??e.chain,venue:n.marketplace??e.venue});return t}function Ek(e,t){let r=da(e),n=e.chain??e.chainId??e.family??"*";return r?`${String(r).toLowerCase()}|${String(n).toLowerCase()}`:`snapshot:${t}`}function ua(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:Xr(i),percentOfKnown:la(i,r)})).sort((o,i)=>i.knownUsd-o.knownUsd||o.name.localeCompare(i.name))}function Hf(e={},t={}){let r=Array.isArray(e)?e:Array.isArray(e.snapshots)?e.snapshots:e.snapshot?[e.snapshot]:[],n=xk(t.labels??t.addressBook??e.labels??e.addressBook),o={...bk,...e.thresholds||{},...t.thresholds||{}},i=[],s=new Set,a=0;r.forEach((E,R)=>{if(!E||typeof E!="object")return;let I=Ek(E,R);s.has(I)?a+=1:(s.add(I),i.push(E))});let c=i.flatMap(Sk),u=c.filter(E=>E.usdValue!=null),d=c.filter(E=>E.usdValue==null),l=i.reduce((E,R)=>E+Number(R.valuation?.unpricedNonzeroItems||R.unpricedNonzeroItems||0),0),p=Xr(u.reduce((E,R)=>E+R.usdValue,0)),f=d.length+l,m=ua(u,"chain",p),g=ua(u,"venue",p),h=ua(u,"symbol",p);for(let E of m)E.chain=E.name;for(let E of g)E.venue=E.name;for(let E of h)E.asset=E.name,E.symbol=E.name;let w=Xr(u.filter(E=>E.stablecoin).reduce((E,R)=>E+R.usdValue,0)),S=c.filter(E=>E.kind==="nft"),_=i.reduce((E,R)=>E+Number(R.valuation?.nftUnvaluedItems||0),0),x=S.filter(E=>E.usdValue==null).length+_,O=S.filter(E=>E.usdValue!=null).length,A=h[0]||null,b=A?A.percentOfKnown>=o.assetHighPct?"high":A.percentOfKnown>=o.assetMediumPct?"medium":"low":"unknown",y=[];f&&y.push(`${f} nonzero holding(s) have unknown USD value; they are excluded from totals and percentages.`),x&&y.push("NFT valuation coverage is partial; estimates are not executable bids and unvalued NFTs are not treated as zero."),a&&y.push(`${a} duplicate address/chain snapshot(s) were ignored.`),A&&b!=="low"&&y.push(`Asset concentration is ${b}: ${A.name} is ${A.percentOfKnown}% of known value.`),m[0]?.percentOfKnown>=o.chainHighPct&&y.push(`Chain concentration is high: ${m[0].name} is ${m[0].percentOfKnown}% of known value.`),g[0]?.percentOfKnown>=o.venueHighPct&&y.push(`Venue concentration is high: ${g[0].name} is ${g[0].percentOfKnown}% of known value.`);let k=i.map(da).filter(Boolean).map(E=>{let R=n.get(String(E).toLowerCase());return{address:E,label:R?.label??null,who:R?.who??null,role:R?.role??null}});return{totalKnownUsd:p,coverage:{complete:i.length>0&&f===0&&i.every(E=>E.valuation?.complete!==!1&&E.coverage?.complete!==!1),label:f===0&&i.length&&i.every(E=>E.valuation?.complete!==!1&&E.coverage?.complete!==!1)?"complete for the supplied snapshots":"known priced value only; portfolio coverage is partial or unverified",unknownUsd:f?null:0,pricedItemCount:u.length,unknownItemCount:f,snapshotCount:i.length,duplicatesIgnored:a},chainExposures:m,venueExposures:g,topAssets:h.slice(0,Math.max(1,Number(t.topAssets??e.topAssets??10))),concentrationRisk:{level:b,topAsset:A?.name??null,topAssetPercent:A?.percentOfKnown??null,thresholds:{mediumPct:o.assetMediumPct,highPct:o.assetHighPct}},stablecoinExposure:{knownUsd:w,percentOfKnown:la(w,p),high:p>0&&la(w,p)>=o.stablecoinHighPct},nftCoverage:{status:S.length||_?x?"partial":"valued":"not-observed",valuedItems:O,unvaluedItems:x,knownUsd:Xr(S.filter(E=>E.usdValue!=null).reduce((E,R)=>E+R.usdValue,0))},addresses:k,warnings:[...new Set(y)]}}var bk,wk,zf=v(()=>{bk=Object.freeze({assetHighPct:50,assetMediumPct:25,chainHighPct:75,venueHighPct:60,stablecoinHighPct:70}),wk=new Set(["USDC","USDT","USDT0","DAI","FRAX","LUSD","TUSD","USDP","GUSD","PYUSD","USDE"])});function Vf(e){return pe(e.asOf??e.updatedAt??e.timestamp,0)}function Kf(e){return e.filledAt??e.executedAt??e.time??e.timestamp??e.asOf??e.updatedAt??e.createdAt}function kk(e){return Number.isFinite(Number(Kf(e)))}function Wf(e){return pe(Kf(e),0)}function Ak(e){let t=new Set,r=[];return(e||[]).forEach((o,i)=>{if(!o||typeof o!="object"||!Me(o))return;let s=Xf(o);t.has(s)||(t.add(s),r.push({row:o,seq:i}))}),r.every(({row:o})=>kk(o))?r.sort((o,i)=>Wf(o.row)-Wf(i.row)||o.seq-i.seq).map(({row:o})=>o):r.map(({row:o})=>o)}function Xf(e){let t=e.fillId??e.tradeId??e.orderId??e.txHash??e.transactionHash??e.timestamp??e.asOf;return[To(e),ce(t),ce(e.side),pe(e.quantity??e.amount??e.size),pe(e.price??e.priceUsd)].join("|")}function Co(e,t){let r=new Map,n=0;for(let o of e||[]){if(!o||typeof o!="object"||!Me(o))continue;let i=t==="fill"?Xf(o):To(o);r.has(i)?(n+=1,t!=="fill"&&Vf(o)>Vf(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 vk(e){let t=new Map;for(let r of e){let n=[To(r),`${ce(r.chain??r.chainId)}|${ce(Me(r))}`,`*|${ce(Me(r))}`];for(let o of n)t.has(o)||t.set(o,r)}return t}function Ik(e,t){return t.get(To(e))??t.get(`${ce(e.chain??e.chainId)}|${ce(Me(e))}`)??t.get(`*|${ce(Me(e))}`)??null}function _k(e){let t=new Map,r=0;for(let n of e){let o=[ce(n.chain??n.chainId),ce(Gf(n)),ce(Me(n))].join("|"),i=t.get(o)??{quantity:0,cost:0},s=Math.abs(pe(n.quantity??n.amount??n.size)),a=pe(n.price??n.priceUsd),c=pe(n.feeUsd);if(ce(n.side)==="sell"){let u=Math.min(s,i.quantity),d=i.quantity?i.cost/i.quantity:pe(n.costBasisUsd)/(s||1);r+=u*(a-d)-c,i.quantity-=u,i.cost-=u*d}else i.quantity+=s,i.cost+=s*a+c;t.set(o,i)}return{realizedPnlUsd:De(r),lots:t}}function Yf(e={},t={}){let r=pe(t.asOf??e.asOf,0),n=Math.max(0,pe(t.priceTtlMs??e.priceTtlMs,6e4)),o=Co(e.balances||[],"balance"),i=Co(e.positions||[],"position"),s=Co(e.fills||[],"fill"),a=Co(e.prices||[],"price"),c=vk(a.rows),u=[],d=0,l=0;for(let k of[...o.rows,...i.rows]){let E=Ik(k,c),R=pe(k.quantity??k.amount??k.size),I=E?pe(E.priceUsd??E.price,NaN):pe(k.priceUsd,NaN);if(!Number.isFinite(I)){l+=1;continue}let $=R*I,L=pe(E?.asOf??k.priceAsOf,0),M=r-L>n;M&&(d+=Math.abs($)),u.push({...k,quantity:R,priceUsd:I,valueUsd:$,stale:M,kind:i.rows.includes(k)?"position":"balance"})}let p=u.filter(k=>k.kind==="balance").reduce((k,E)=>k+E.valueUsd,0),f=u.filter(k=>k.kind==="position"),m=f.reduce((k,E)=>k+E.valueUsd,0),g=f.reduce((k,E)=>k+Math.abs(E.valueUsd),0),h=p+m,w=pe(e.equityUsd,h),S=_k(Ak(e.fills||[])).realizedPnlUsd,_=f.reduce((k,E)=>{let R=pe(E.entryPriceUsd??E.averageEntryPrice??E.costBasisPrice,E.priceUsd);return k+E.quantity*(E.priceUsd-R)},0),x=new Map;for(let k of u)x.set(ce(Me(k)),(x.get(ce(Me(k)))||0)+Math.abs(k.valueUsd));let O=[...x.values()].reduce((k,E)=>k+E,0),A=[...x].map(([k,E])=>({asset:k,exposureUsd:De(E),percent:O?De(E/O*100):null})).sort((k,E)=>E.exposureUsd-k.exposureUsd||k.asset.localeCompare(E.asset)),b=u.reduce((k,E)=>k+Math.abs(E.valueUsd),0),y=Hf({snapshots:[{assets:u.map(k=>({symbol:Me(k),usdValue:Math.abs(k.valueUsd),chain:k.chain,venue:k.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:S,unrealizedUsd:De(_),totalUsd:De(S+_)},exposure:{grossUsd:De(g),netUsd:De(h),leverage:w>0?De(g/w):null,equityUsd:De(w)},concentration:A,priceCoverage:{pricedItems:u.length,unpricedItems:l,staleItems:u.filter(k=>k.stale).length,staleValueUsd:De(d),stalePercent:b?De(d/b*100):null,ttlMs:n},risk:y})}var pe,De,ce,Me,Gf,To,Qf=v(()=>{zf();pe=(e,t=0)=>Number.isFinite(Number(e))?Number(e):t,De=e=>Math.round((e+Number.EPSILON)*1e8)/1e8,ce=(e,t="unknown")=>String(e??t).trim().toLowerCase(),Me=e=>e.asset??e.symbol??e.coin,Gf=e=>e.address??e.owner??e.account,To=e=>[ce(e.chain??e.chainId),ce(Gf(e)),ce(Me(e)),ce(e.source)].join("|")});var OT,CT,TT,Jf=v(()=>{OT=Object.freeze(["chainId","agentAddress","accountAddress","actions","targets","maxValueWei","maxGasWei","maxSlippageBps","expiresAt","nonce","revocationKey"]),CT=Object.freeze(["read","simulate"]),TT=1440*60});function Zf(e){let t=String(e),r=t.toLowerCase().replace(/[\s._-]+/g,"");return Ok.test(t)||Ck.includes(r)}function Pt(e,t="$",r=new Set,n=""){if(e==null)return e;if(typeof e=="string"){let o=Nk.includes(String(n).toLowerCase().replace(/[_-]/g,""));for(let{rule:i,re:s}of Tk)if(!(o&&i.startsWith("raw-32-byte-hex"))&&s.test(e))throw new Yr(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"&&Zf(o))throw new Yr(`${t}[${JSON.stringify(o)}]`,"forbidden-key-name");Pt(o,`${t}[key]`,r),Pt(i,`${t}[${String(o)}]`,r)}return e}if(e instanceof Set){let o=0;for(let i of e.values())Pt(i,`${t}[${o++}]`,r);return e}if(Array.isArray(e))return e.forEach((o,i)=>Pt(o,`${t}[${i}]`,r)),e;for(let[o,i]of Object.entries(e)){if(Zf(o))throw new Yr(`${t}.${o}`,"forbidden-key-name");Pt(i,`${t}.${o}`,r,o)}return e}var Yr,Ok,Ck,Tk,Nk,em=v(()=>{Jf();Yr=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}},Ok=/(private[_-]?key|secret|bearer|keystore|mnemonic|seed[_-]?phrase|passphrase|password|api[_-]?key|access[_-]?token|auth[_-]?token|session[_-]?token|signer[_-]?url|signature)/i,Ck=Object.freeze(["privkey","wif","xprv","seed"]);Tk=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}]),Nk=Object.freeze(["grantid","id","hash","sha256","sha256hex","checksum","txhash","transactionhash","blockhash","digest","userophash","commithash","prevhash","intenthash","canonicalhash","payloadhash","requestid"])});import{createHash as Rk}from"node:crypto";function fa(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(fa).join(",")}]`:`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${fa(e[t])}`).join(",")}}`}function $k(e){return e===void 0?null:JSON.parse(JSON.stringify(e))}function No(e){if(e&&typeof e=="object"&&!Object.isFrozen(e)){Object.freeze(e);for(let t of Object.values(e))No(t)}return e}function ma(e,t="fact"){try{Pt(e,t)}catch{throw new Error(`${t} contains custody material and is forbidden`)}}function nm(e){return Rk("sha256").update(fa(e)).digest("hex")}function om({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:$k(r)};return No({...s,hash:nm(s)})}function Ro({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");ma(t,"intent");let n=om({tradeId:e,state:"intent",fact:t,asOf:r,previousHash:null,external:!1});return No({tradeId:e,state:"intent",events:[n],headHash:n.hash,custody:"none",execution:"prepare-only"})}function im(e,t,r,n={}){if(ha(e),!(tm[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`);ma(r,t);let i=n.external===!0||n.externallySupplied===!0;if(rm.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=om({tradeId:e.tradeId,state:t,fact:r,asOf:a,previousHash:s.hash,external:i});return No({...e,state:t,events:[...e.events,c],headHash:c.hash})}function ha(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(nm(i)!==o)throw new Error(`trade event ${r} hash mismatch`);if(ma(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&&!tm[t.state]?.includes(n.state))throw new Error(`invalid recorded transition ${t.state} -> ${n.state}`);if(rm.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 pa,tm,rm,ya=v(()=>{em();pa=Object.freeze(["intent","quote_comparison","simulation","prepared","approval","signed","broadcast","settlement","balance_delta","position"]),tm=Object.freeze(Object.fromEntries(pa.map((e,t)=>[e,Object.freeze(t+1<pa.length?[pa[t+1]]:[])]))),rm=new Set(["signed","broadcast"])});function sm(e){let t=String(e?.type??e?.surface??e?.kind??"").toLowerCase();return Pk[t]??t}function qk(e,t){return String(e?.id??e?.signalId??e?.asset??e?.market??e?.pool??e?.collection??`${sm(e)}:${t}`)}function Ce(e,t,r,n=!0){!n||r===null||!Number.isFinite(r)||e.push({feature:t,value:$o(r)})}function Lk(e,t){let r=Se(e.repeatBuys??e.repeat_buys??e.buyCount),n=Se(e.walletWinRate??e.winRate);Ce(t,"repeat_buys",r===null?null:fe((r-1)/4)*.38),Ce(t,"wallet_win_rate",n===null?null:(fe(n)-.5)*.5)}function Uk(e,t){let r=Se(e.ageHours??e.poolAgeHours),n=Se(e.liquidityUsd??e.liquidity),o=e.liquidityLocked??e.locked;Ce(t,"pool_age",r===null?null:r<24?-.42:fe(r/720)*.12),Ce(t,"liquidity",n===null?null:(fe(Math.log10(Math.max(1,n))/7)-.5)*.28),Ce(t,"liquidity_lock",o==null?null:o?.12:-.28)}function Bk(e,t){let r=Se(e.floorChange??e.floorChangePct),n=Se(e.sales??e.saleCount);Ce(t,"floor_change",r===null?null:fe(r,-1,1)*.35),Ce(t,"sales_depth",n===null?null:fe(n/50)*.18)}function Fk(e,t){let r=Se(e.flowImbalance??e.imbalance),n=Se(e.fundingRate??e.funding);Ce(t,"flow_imbalance",r===null?null:fe(r,-1,1)*.42),Ce(t,"funding",n===null?null:-fe(n*100,-1,1)*.12)}function Dk(e,t){let r=Se(e.marketProbability??e.marketPrice??e.probability),n=Se(e.fairProbability??e.referenceProbability??e.fairValue);Ce(t,"probability_mispricing",r===null||n===null?null:fe(n-r,-1,1)*.65);let o=Se(e.liquidityUsd??e.liquidity);Ce(t,"market_liquidity",o===null?null:fe(Math.log10(Math.max(1,o))/6)*.12)}function jk(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=>Se(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 Po(e=[],t=[],r={}){if(!Array.isArray(e)||!Array.isArray(t))throw new TypeError("events and markouts must be arrays");let n=fe(Se(r.minimumCoverage)??.5);return e.map((o,i)=>{let s=sm(o),a=qk(o,i),c=Mk[s],u=[];c&&c(o,u);let d=s==="wallet"?2:s==="pool"?3:2,l=$o(fe(u.length/d)),p=u.reduce((_,x)=>_+x.value,0),f=jk(o,a,t),m=f===null?0:fe(f,-1,1)*.35;f!==null&&Ce(u,"shadow_markout",m);let g=$o(fe(.5+p+m)),h=f===null?.8:fe(.85+f*.3,.35,1),w=$o(fe(l*h)),S=["COLD_INTELLIGENCE_ONLY","NO_HOT_EXECUTION"];return c||S.push("UNSUPPORTED_SIGNAL_TYPE"),l<n&&S.push("LOW_COVERAGE","NO_TRADE"),w<.5&&S.push("LOW_CONFIDENCE","NO_TRADE"),s==="pool"&&(Se(o.ageHours??o.poolAgeHours)??1/0)<24&&S.push("NEW_POOL_RISK","NO_TRADE"),f!==null&&f<0&&S.push("NEGATIVE_MARKOUT"),{id:a,type:s,score:g,confidence:w,coverage:l,contributions:u,flags:[...new Set(S)],noTrade:S.includes("NO_TRADE"),executionAllowed:!1}}).sort((o,i)=>i.score-o.score||i.confidence-o.confidence||o.id.localeCompare(i.id))}var HT,Pk,fe,Se,$o,Mk,ga=v(()=>{HT=Object.freeze(["wallet","pool","nft_floor","hl_flow","prediction_market"]),Pk=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"}),fe=(e,t=0,r=1)=>Math.min(r,Math.max(t,e)),Se=e=>Number.isFinite(Number(e))?Number(e):null,$o=e=>Math.round(e*1e4)/1e4;Mk=Object.freeze({wallet:Lk,pool:Uk,nft_floor:Bk,hl_flow:Fk,prediction_market:Dk})});function Hk(e=[],t=[],r={}){let n=Po(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 zk(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=Ro({tradeId:r,intent:n,asOf:t.asOf??Date.now()});return{tradeId:r,intent:n,lifecycle:o,recommendation:"PREPARE_RESEARCH_ONLY"}}function am(e=[],t=[],r={}){let{scored:n,candidates:o,blocked:i}=Hk(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(zk(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 cm=v(()=>{ga();ya()});function um(e){let t=Wk[Number(e)]||[];return new Set([...t,...Vk].map(r=>String(r).trim().toLowerCase()).filter(Boolean))}var Vk,Wk,lm=v(()=>{Vk=["0x000000000022d473030f116ddee9f6b43ac78ba3"],Wk={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 qo(e,t={}){e&&e.passes.push({ok:!0,kind:t.kind||"gather",name:t.name||null})}function ba(e){e&&(e.prepareAttempted=!0)}function wa(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 Yk(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?[...um(o)]:[];return new Set([...n,...i])}function Qk(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 Jk(e){return!e||typeof e!="object"?!1:!!(e.transaction||e.tx||e.to||e.destination||e.settlement||e.data||e.value!=null)}function Zk(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 eA(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 tA(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 Gk)e[o]&&r.push(`prepared fact carries ${o}`);for(let o of Kk)e[o]&&r.push(`prepared fact claims executed ${o}`);if(n.unsigned=r.length===0,Jk(e)){let o=Zk(e),i=o.to==null?"":String(o.to).trim();if(!i)r.push("prepared transaction is missing destination"),n.destination="missing";else{let s=Xk.test(i);if(i.startsWith("0x")&&!s)r.push("prepared destination is not a 20-byte address"),n.destination="malformed";else{let a=Yk(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(Qk(e)){let o=eA(e),i=e.slippageGuard?.capBps!=null?Number(e.slippageGuard.capBps):tt;!Number.isInteger(o)||o<0?(r.push("swap prepare is missing integer slippage bps"),n.slippage="missing"):o>tt||Number.isInteger(i)&&o>i||Number.isInteger(i)&&i>tt?(r.push(`slippage ${o} exceeds cap ${Math.min(i,tt)}`),n.slippage="blocked"):n.slippage="ok"}return{ok:r.length===0,checks:n,errors:r}}function xa(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=tA(t);return{ok:r.length===0&&n.ok,checks:n.checks,errors:[...r,...n.errors]}}var Gk,Kk,Xk,dm=v(()=>{lm();Re();Gk=Object.freeze(["signature","signedTx","signedTransaction","rawTransaction","signedPayload","signedRaw"]),Kk=Object.freeze(["txid","txHash","transactionHash","broadcastHash"]),Xk=/^0x[a-fA-F0-9]{40}$/});var fm={};j(fm,{DESK_TOOLS:()=>nA,runDeskTool:()=>iA});function oA(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")>rA)throw new TypeError("tool arguments exceed size limit")}function Je(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 iA(e,t,r={}){if(oA(t),e==="research_artifact"){if(Je(t,["sourceUrl","fetchedAt","snapshot","claim","confidence"],["contradictions"]),String(t.snapshot).length>pm)throw new TypeError("snapshot exceeds size limit");return{ok:!0,artifact:(r.createResearchArtifact||Df)(t)}}if(e==="portfolio_analyze")return Je(t,["ledger","asOf"],["priceTtlMs"]),{ok:!0,analysis:(r.summarizePortfolioLedger||Yf)(t.ledger,{asOf:t.asOf,priceTtlMs:t.priceTtlMs})};if(e==="trade_lifecycle"){let n=r.createTradeLifecycle||Ro,o=r.advanceTradeLifecycle||im,i=r.assertTradeLifecycle||ha;if(t.action==="create")return Je(t,["action","tradeId","intent"],["asOf"]),{ok:!0,lifecycle:n({tradeId:t.tradeId,intent:t.intent,asOf:t.asOf})};if(t.action==="verify"){if(Je(t,["action","lifecycle"]),i(t.lifecycle),t.lifecycle.state==="prepared"){ba(r.loopVerifier);let s=t.lifecycle.events?.findLast?.(c=>c.state==="prepared")||t.lifecycle.events?.filter(c=>c.state==="prepared").at(-1),a=xa(t.lifecycle,s?.fact||{});if(!a.ok)return wa(r.loopVerifier,{name:"trade_lifecycle",error:a.errors[0]}),{ok:!1,error:`prepare verifier failed: ${a.errors[0]}`,checks:a.checks};qo(r.loopVerifier,{kind:"prepare",name:"trade_lifecycle"})}else qo(r.loopVerifier,{kind:"lifecycle",name:"trade_lifecycle"});return{ok:!0,valid:!0,lifecycle:t.lifecycle}}if(t.action==="advance"){if(Je(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"){ba(r.loopVerifier);let a=xa(t.lifecycle,t.fact);if(!a.ok)return wa(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"&&qo(r.loopVerifier,{kind:"prepare",name:"trade_lifecycle"}),{ok:!0,lifecycle:s}}throw new TypeError("unknown trade lifecycle action")}if(e==="signal_score"){if(Je(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||am)(t.events,n,{limit:t.limit});let i=(r.scoreSignals||Po)(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||qf,o=!r.artifactStore,i=r.artifactStore||await n(r.artifactStoreOptions||{});try{if(t.action==="get")return Je(t,["action","id"]),{ok:!0,artifact:await i.getArtifact(t.id)};if(t.action==="list")return Je(t,["action"],["type"]),{ok:!0,artifacts:await i.listArtifacts(t.type)};if(t.action==="put")return Je(t,["action","id","type","data","createdAt"]),{ok:!0,artifact:await i.putArtifact(t)};if(t.action==="link")return Je(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 rA,pm,Lo,qt,Qr,nA,mm=v(()=>{Lf();Mf();Qf();ya();ga();cm();dm();rA=128*1024,pm=5e4,Lo={type:"string",minLength:1,maxLength:256},qt={type:"object",additionalProperties:!0},Qr=(e,t,r)=>Object.freeze({type:"function",function:Object.freeze({name:e,description:t,strict:!0,parameters:r})}),nA=Object.freeze([Qr("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:Lo,type:{type:"string",enum:["project","entity","source","thesis","strategy","simulation","prepared_action","receipt","position"]},createdAt:{type:"string",minLength:1,maxLength:64},data:qt,parentId:Lo,childId:Lo},required:["action"],additionalProperties:!1}),Qr("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:pm},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}),Qr("portfolio_analyze","Deterministically summarize a caller-supplied portfolio ledger; performs no network or account access.",{type:"object",properties:{ledger:qt,asOf:{type:"number"},priceTtlMs:{type:"number",minimum:0}},required:["ledger","asOf"],additionalProperties:!1}),Qr("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:Lo,intent:qt,lifecycle:qt,state:{type:"string",enum:["quote_comparison","simulation","prepared","approval","settlement","balance_delta","position"]},fact:qt,asOf:{type:"number"}},required:["action"],additionalProperties:!1}),Qr("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:qt},markouts:{type:"array",maxItems:100,items:qt},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 hm={};j(hm,{deployGloballyEnabled:()=>aA,executeGloballyEnabled:()=>sA,mevExecuteEnabled:()=>cA});function sA(){return tn("ORACLE_EXECUTE_ENABLED","MAD_EXECUTE_ENABLED",!1)}function aA(){return tn("ORACLE_DEPLOY_ENABLED","MAD_DEPLOY_ENABLED",!1)}function cA(){return tn("ORACLE_MEV_EXECUTE_ENABLED",null,!1)}var ym=v(()=>{rn()});rn();import gm from"node:fs";import Sa from"node:process";import{fileURLToPath as uA}from"node:url";import{createInterface as Rm}from"node:readline";var ze=Object.freeze({maxRequestBytes:256*1024,maxResponseBytes:2*1024*1024,maxTools:256,maxToolNameLength:64,maxArgumentBytes:128*1024,defaultCallTimeoutMs:3e4,maxCallTimeoutMs:6e4,maxConcurrentCalls:32}),$m=/^[A-Za-z0-9_-]{1,64}$/;function nn(e,t){return{jsonrpc:"2.0",id:e??null,result:t}}function de(e,t,r){return{jsonrpc:"2.0",id:e??null,error:{code:t,message:r}}}function Pm(e){return!!(e&&typeof e=="object"&&!Array.isArray(e)&&e.jsonrpc==="2.0"&&typeof e.method=="string"&&e.method.length>0)}function qm(e){if(!Array.isArray(e))return[];let t=[],r=new Set;for(let n of e){if(t.length>=ze.maxTools)break;if(!n||typeof n!="object"||Array.isArray(n))continue;let o=typeof n.name=="string"?n.name.trim():"";if(!$m.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 Lm(e){let t=Number(e)||ze.defaultCallTimeoutMs;return Math.min(Math.max(t,1),ze.maxCallTimeoutMs)}async function Um(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 Bm(e){return e===null?"null":Array.isArray(e)?"array":Number.isInteger(e)?"integer":typeof e}function ur(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=>ur(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=>ur(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=Bm(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=ur(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=ur(e[s],i[s],`${r}.${s}`,n+1);if(a)return a}}return null}function Vo(e,t={}){let r=qm(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=Lm(t.callTimeoutMs),c=!1;return async function(d){let l=d?.id??null;if(!Pm(d))return de(l,-32600,"invalid request");if(d.method==="initialize")return c=!0,nn(l,{protocolVersion:d.params?.protocolVersion??"2025-03-26",capabilities:{tools:{}},serverInfo:{name:i,version:s}});if(d.method==="notifications/initialized")return null;if(d.method==="ping")return nn(l,{});if(!c)return de(l,-32002,"server not initialized");if(d.method==="tools/list")return nn(l,{tools:r});if(d.method==="tools/call"){let p=d.params?.name,f=d.params?.arguments??{};if(typeof p!="string"||!n.has(p))return de(l,-32602,"unknown tool");if(!f||typeof f!="object"||Array.isArray(f))return de(l,-32602,"tool arguments must be an object");let m;try{m=JSON.stringify(f)}catch{return de(l,-32602,"tool arguments are not serializable")}if(Buffer.byteLength(m)>ze.maxArgumentBytes)return de(l,-32602,"tool arguments exceeded the size limit");let g=ur(f,o.get(p)?.inputSchema);if(g)return de(l,-32602,g);try{let h=new AbortController,w=await Um(Promise.resolve(e.call(p,f,{signal:h.signal})),a,()=>h.abort(new Error("tool call timed out")));return nn(l,w)}catch(h){if(h?.code==="ORACLE_MCP_TIMEOUT")return de(l,-32001,"tool call timed out");let w=typeof h?.message=="string"?h.message.replace(/\s+/g," ").trim():"",S=/\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 S&&!_&&w.length<=200?de(l,-32e3,`tool call failed: ${w}`):de(l,-32e3,"tool call failed")}}return de(l,-32601,"method not found")}}function Na(e,t={}){let r=t.input||process.stdin,n=t.output||process.stdout,o=Math.min(Math.max(Number(t.maxRequestBytes)||ze.maxRequestBytes,64),ze.maxRequestBytes),i=Math.min(Math.max(Number(t.maxResponseBytes)||ze.maxResponseBytes,256),ze.maxResponseBytes),s=Math.min(Math.max(Number(t.maxConcurrentCalls)||ze.maxConcurrentCalls,1),ze.maxConcurrentCalls),a=s*8,c=Vo(e,t),u={closed:!1,inflight:0},d=Rm({input:r,terminal:!1,crlfDelay:1/0}),l=0,p=[],f=!1,m=!1;function g(){if(u.closed||u.readerClosed)return;let x=u.inflight>=s||p.length>0||m;x&&!f?(f=!0,d.pause(),typeof r.pause=="function"&&r.pause()):!x&&f&&(f=!1,typeof r.resume=="function"&&r.resume(),d.resume())}function h(x){if(!x||u.closed)return;let O=JSON.stringify(x);Buffer.byteLength(O)>i&&(O=JSON.stringify(de(x.id,-32003,"response exceeded the size limit"))),n.write(`${O}
22
+ `)===!1&&!m&&(m=!0,g(),n.once("drain",()=>{m=!1,S()}))}function w(x){u.inflight+=1,g(),Promise.resolve(c(x)).then(h).catch(()=>h(de(x?.id,-32603,"internal error"))).finally(()=>{u.inflight-=1,S()})}function S(){for(;!u.closed&&!m&&u.inflight<s&&p.length>0;)w(p.shift());g()}function _(){u.closed||(h(de(null,-32700,"request exceeded the size limit")),u.closed=!0,d.close(),typeof r.destroy=="function"&&r.destroy())}return r.on("data",x=>{if(u.closed)return;let O=String(x).split(`
23
+ `);for(let A=0;A<O.length;A+=1){if(l+=Buffer.byteLength(O[A]),l>o){_();return}A<O.length-1&&(l=0)}}),d.on("line",x=>{if(u.closed)return;if(Buffer.byteLength(x)>o){_();return}let O;try{O=JSON.parse(x)}catch{h(de(null,-32700,"parse error"));return}if(p.length>=a){h(de(O?.id,-32e3,"server busy"));return}p.push(O),S()}),d.on("close",()=>{u.readerClosed=!0,t.exitOnClose!==!1&&(process.exitCode=0)}),u}var Ra=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"}}),Fm=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 at(e){return String(e??"").replaceAll("&","&amp;").replaceAll("<","&lt;").replaceAll(">","&gt;").replaceAll('"',"&quot;")}function Ee(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 lr(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 Ee(o)}return`${r} raw`}return Ee(e)}var Dm=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 Mm(e,t){let r=Number(t);return t!=null&&Number.isFinite(r)?r:Dm[String(e||"").toUpperCase()]}function $a(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((l,p)=>l+(Number(p.amountUSD)||0),0)||null,d=(c.feeCosts||[]).reduce((l,p)=>l+(Number(p.amountUSD)||0),0)||null;o={best:{provider:n.tool||n.toolDetails?.name||"lifi",amountOut:c.toAmount,minOut:c.toAmountMin,gasUsd:u,feeUsd:d,decimalsOut:n.action?.toToken?.decimals},tokenIn:n.action?.fromToken?.symbol,tokenOut:n.action?.toToken?.symbol}}let i=[],s=(c,u,d={})=>{u==null||u===""||i.push({label:c,value:String(u),...d})},a=o.best||o.winner||o.topRoute||null;if(e==="swap"||e==="bridge"||e==="quote"){let c=a||o,u=Mm(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 d=c.netOut??c.netOutput??c.amountOutNet??c.toAmountNet,l=c.amountOut??c.outAmount??c.toAmount??c.expectedOut,p=lr(d,u);s(p!=null?"NET OUT":"EST OUT (GROSS)",p??lr(l,u),{hero:!0}),s("GROSS OUT",d!==void 0&&l!==void 0&&String(d)!==String(l)?lr(l,u):null),c.gasUsd!==void 0&&c.gasUsd!==null?s("GAS",`$${Ee(c.gasUsd)}`):c.feeUsd!==void 0&&c.feeUsd!==null?s("GAS+FEES",`$${Ee(c.feeUsd)}`):s("GAS","NOT PRICED IN",{warn:!0});let m=c.minOut??c.minAmountOut??c.minReceived;if(s("MIN RECEIVED",lr(m,u)),c.slippageBps!==void 0&&c.slippageBps!==null)s("SLIPPAGE",`${c.slippageBps} bps`);else if(m!==void 0&&l!==void 0){let w=Number(l),S=Number(m);Number.isFinite(w)&&Number.isFinite(S)&&w>0&&S>0&&S<=w&&s("SLIPPAGE",`${((1-S/w)*1e4).toFixed(0)} bps max`)}let g=c.meta?.fee??c.poolFee;g!=null&&s("POOL FEE",`${Number(g)/100} bps`),c.liquidityUsd!==void 0&&c.liquidityUsd!==null&&s("LIQUIDITY",`$${Ee(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 S=w?.provider||w?.venue||w?.source,_=lr(w?.netOut??w?.amountOut??w?.toAmount,u);S&&_&&s(`vs ${S}`,_,{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?`$${Ee(u)}`:null,{hero:!0});let d=Array.isArray(o.chains)?o.chains:null;if(s("CHAINS",d?d.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),d){let f=d.filter(m=>Number.isFinite(Number(m?.knownUsd))&&Number(m.knownUsd)>0).sort((m,g)=>Number(g.knownUsd)-Number(m.knownUsd)).slice(0,3);for(let m of f)s(String(m.name||m.family||m.chainId),`$${Ee(m.knownUsd)}`,{dim:!0})}let l=o.avgEntryUsd??o.avgCostUsd;if(l!==void 0)s("AVG ENTRY",`$${Ee(l)}`);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((g,h)=>g+h,0)/f.length;s("AVG ENTRY",`$${Ee(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?`$${Ee(o.pnlUsd)}`:null);let c=o.avgBuy??o.avgBuyEth??o.avgCostEth??o.avgPurchase;if(c!==void 0)s("AVG BUY",Ee(c));else if(Array.isArray(o.buys)||Array.isArray(o.purchases)){let u=(o.buys||o.purchases).map(d=>Number(d?.priceEth??d?.price??d?.costEth)).filter(d=>Number.isFinite(d)&&d>0);u.length>0&&s("AVG BUY",`${Ee(u.reduce((d,l)=>d+l,0)/u.length)} \xB7 ${u.length} buys`)}s("OWNERS",Ee(o.owners??o.numOwners))}return i}function jm(e,t,r){let n=Ra[e]||Ra.generic,o=$a(e,r),i=o.find(u=>u.hero),s=o.filter(u=>!u.hero),a=at(JSON.stringify(r,null,2)).slice(0,2e4),c=s.map(u=>`<div class="row${u.dim?" dim":""}${u.warn?" warn":""}"><span>${at(u.label)}</span><b>${at(u.value)}</b></div>`).join("");return`<!doctype html><html><head><meta charset="utf-8"><style>
10
24
  :root{color-scheme:dark}
11
25
  *{margin:0;padding:0;box-sizing:border-box}
12
26
  body{background:transparent;font-family:ui-monospace,SFMono-Regular,Menlo,monospace}
@@ -42,9 +56,9 @@ summary::before{content:"\u25B8 "}details[open] summary::before{content:"\u25BE
42
56
  pre{margin-top:8px;font-size:10px;color:#9FB8D2;max-height:260px;overflow:auto;white-space:pre-wrap;word-break:break-all}
43
57
  .card:active{transform:scale(.985);transition:transform .1s}
44
58
  </style></head><body><div class="card">
45
- <div class="head"><div class="globe"></div><span class="brand">ORACLE</span><span class="kind">${Ye(n.title)}</span></div>
46
- ${s?`<div class="hero">${Ye(s.value)}</div><div class="herolabel">${Ye(s.label)}</div>`:""}
59
+ <div class="head"><div class="globe"></div><span class="brand">ORACLE</span><span class="kind">${at(n.title)}</span></div>
60
+ ${i?`<div class="hero">${at(i.value)}</div><div class="herolabel">${at(i.label)}</div>`:""}
47
61
  ${c}
48
- <details><summary>details \xB7 ${Ye(t)}</summary><pre>${a}</pre></details>
49
- <div class="foot"><span>${Ye(t)}</span><span class="tag">THE FUTURE IS AGENTIC</span></div>
50
- </div><script>document.documentElement.classList.add("live")</script></body></html>`}function Ii(e,t){let r=Ep[e];if(!r||!t||typeof t!="object"||t.error||t.ok===!1||!Ai(r,t).some(s=>s.hero))return null;let o=_p(r,e,t);return{type:"resource",resource:{uri:`ui://oracle/card/${e}/${Date.now().toString(36)}`,mimeType:"text/html",text:o}}}var si=Qt("ORACLE_DATA_URL","MAD_DESK_URL","http://127.0.0.1:8787").replace(/\/$/,""),ep={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"}}},Wt={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:ep,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:ep,mac:{type:"string"},quotedAtMs:{type:"number"},expiresAtMs:{type:"number"}}}}]},Rw=[{name:"data_catalog",description:"List every read-plane provider the desk exposes (id, venue, chainIds, ops). Use this to discover what public APIs are available before calling data_call. Read-only.",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:"data_call",description:"Generic escape hatch: call any provider/op from the catalog. provider+op are required; args is a free-form object matching that op. Read-only. Use data_catalog first to see valid provider/op pairs.",inputSchema:{type:"object",required:["provider","op"],properties:{provider:{type:"string",description:"provider id, e.g. defillama, dexscreener, lifi, evm-rpc"},op:{type:"string",description:"op name for that provider, e.g. protocols, search, quote"},args:{type:"object",description:"op arguments (free-form)"}}}},{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:Wt,conversionGasEvidence:Wt,gasPriceEvidence:Wt,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:Wt,conversionGasEvidence:Wt,gasPriceEvidence:Wt,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",required:["inscriptionId"],properties:{inscriptionId:{type:"string"}}}},{name:"satflow_floor_listings",description:"Satflow floor listings for collection id(s). Read-only.",inputSchema:{type:"object",required:["collectionIds"],properties:{collectionIds:{type:"string"},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:"address_book_remember",description:"Remember a wallet address with a label. Call this whenever someone states their address or an agent/counterparty wallet is discovered, so it survives the conversation. Stores labels only \u2014 never private keys, seeds, or passphrases.",inputSchema:{type:"object",required:["address","label"],properties:{address:{type:"string",description:"0x address"},label:{type:"string",description:"short name, e.g. research-agent"},who:{type:"string",description:"person or entity the wallet belongs to"},role:{type:"string",description:"agent | owner | person | counterparty | venue"},chainIds:{type:"array",items:{type:"number"}},notes:{type:"string"}}}},{name:"address_book_list",description:"List remembered wallets (owner, agent, people, counterparties). Read-only. Check this before sending or bridging to a person.",inputSchema:{type:"object",properties:{q:{type:"string",description:"search across label, who, address, notes"},role:{type:"string"},who:{type:"string"}}}},{name:"address_book_lookup",description:"Look up one 0x address in the durable address book. Read-only.",inputSchema:{type:"object",required:["address"],properties:{address:{type:"string"}}}},{name:"address_book_forget",description:"Remove a remembered address, optionally only one label for it.",inputSchema:{type:"object",required:["address"],properties:{address:{type:"string"},label:{type:"string"}}}},{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"}},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","recipient"],properties:{ticker:{type:"string"},recipient:{type:"string",description:"the REAL 0x wallet that will sign; placeholders rejected"},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","amount","taker"],properties:{chainId:{type:"number"},tokenIn:{type:"string"},tokenOut:{type:"string"},amount:{type:"string",description:"raw base units of tokenIn"},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:"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:{}}}],tp=String(oi.env.ORACLE_DEFAULT_ADDRESS||oi.env.MAD_OPERATOR_ADDRESS||"").trim(),Pw={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||tp||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||tp;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:{}}),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 ii(e,{method:t="GET",body:r}={}){let n=await fetch(e,{method:t,headers:{"content-type":"application/json"},body:r?JSON.stringify(r):void 0}),o=await n.json().catch(()=>({}));if(!n.ok)throw new Error(o.error||`HTTP ${n.status}`);return o}async function rp(e,t,r={}){try{return await ii(`${si}/data/call`,{method:"POST",body:{provider:e,op:t,args:r}})}catch(n){let o=typeof n?.message=="string"?n.message:"";if(o&&!/^HTTP \d+$/.test(o))return{error:o,provider:e,op:t};throw n}}async function $w(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:o}=await Promise.resolve().then(()=>(Ma(),Da));return o(r.operation,{...t,...r.action?{action:r.action}:{},nowMs:t.nowMs??Date.now()})}if(e==="rfq_quote"){let{normalizeRfqIntent:o}=await Promise.resolve().then(()=>(es(),ec)),{requestRfqQuotes:s}=await Promise.resolve().then(()=>(uu(),cu)),i=o({...t,sources:t.sources??t.allowedSources});return s(i,{decimalsIn:t.decimalsIn,decimalsOut:t.decimalsOut})}if(e==="best_swap_route"||e==="best_bridge_route"){let{bestSwapRoute:o,bestBridgeRoute:s}=await Promise.resolve().then(()=>(Dt(),Bu));return e==="best_swap_route"?o(t):s(t)}if(e==="prepare_best_route"){let{prepareBestRoute:o}=await Promise.resolve().then(()=>(Fu(),Uu));return o(t)}if(e==="prepare_best_bridge_route"){let{prepareBestBridgeRoute:o}=await Promise.resolve().then(()=>(Du(),Lu));return o(t)}if(e==="twap_simulate"){let{simulateTwap:o}=await Promise.resolve().then(()=>(zu(),Hu));return o({...t,amount:t.amount??t.amountIn})}if(e==="bridge_aggregator_scan"){let{scanBridgeRoutes:o}=await Promise.resolve().then(()=>(Bl(),ql));return o(t)}if(e==="perps_markets"){let o=String(t.venue||"all").toLowerCase(),s={};if(o==="all"||o==="dydx"){let{dydxMarkets:i}=await Promise.resolve().then(()=>(Fl(),Ul));s.dydx=await i()}if(o==="all"||o==="drift"){let{driftMarkets:i}=await Promise.resolve().then(()=>(Ml(),Dl));s.drift=await i()}if(o==="all"||o==="vertex"){let{vertexMarkets:i}=await Promise.resolve().then(()=>(Hl(),jl));s.vertex=await i()}return s}if(e==="dex_quote"){let o=String(t.dex||"").toLowerCase();if(o==="pancakeswap"){let{pancakeQuote:s}=await Promise.resolve().then(()=>(Vl(),zl));return s(t)}if(o==="sushiswap"){let{sushiQuote:s}=await Promise.resolve().then(()=>(Gl(),Kl));return s(t)}if(o==="raydium"){let{raydiumQuote:s}=await Promise.resolve().then(()=>(Yl(),Ql));return s(t)}return{error:`unknown dex: ${o} \u2014 use pancakeswap, sushiswap, or raydium`}}if(e==="options_markets"){let{aevoMarkets:o}=await Promise.resolve().then(()=>(Xl(),Jl));return{aevo:await o()}}if(e==="lending_markets"){let{compoundMarkets:o}=await Promise.resolve().then(()=>(ed(),Zl));return{compound:await o()}}if(e==="yield_vaults"){let[{yearnVaults:o},{convexPools:s}]=await Promise.all([Promise.resolve().then(()=>(rd(),td)),Promise.resolve().then(()=>(od(),nd))]);return{yearn:await o(),convex:await s()}}if(e==="equity_venues"){let{equityVenues:o,toJsonSafe:s}=await Promise.resolve().then(()=>(Kn(),Wn));return s(o())}if(e==="equity_quote"){let{bestEquityRoute:o,toJsonSafe:s}=await Promise.resolve().then(()=>(Kn(),Wn));return s(o({ticker:t.ticker,sizeUsd:t.sizeUsd,horizonHours:t.horizonHours}))}if(e==="equity_prepare"){let{prepareEquityRoute:o,toJsonSafe:s}=await Promise.resolve().then(()=>(Kn(),Wn));return s(o({ticker:t.ticker,recipient:t.recipient||t.taker,sizeUsd:t.sizeUsd}))}if(e==="scanner_coverage"){let o=await Promise.resolve().then(()=>(Qn(),Gn));return o.registerBuiltinScanners?.(),o.scannerCoverage()}if(e==="scan_token"){let o=await Promise.resolve().then(()=>(Qn(),Gn));o.registerBuiltinScanners?.();let s=o.getScanner(Number(t.chainId));if(!s)throw new Error(`no scanner registered for chainId ${t.chainId}`);let i=await s.resolveToken(t.token),a=s.supports?.("resolvePools")?await s.resolvePools(t.token).catch(()=>null):null,c=s.supports?.("scoreRisk")?await s.scoreRisk({token:t.token}).catch(()=>null):null;return{chainId:Number(t.chainId),token:i,pools:a,risk:c}}if(e==="wallet_balances"){let o=await Promise.resolve().then(()=>(Qn(),Gn));o.registerBuiltinScanners?.();let s=o.getScanner(Number(t.chainId));if(!s)throw new Error(`no scanner registered for chainId ${t.chainId}`);let i=await s.nativeBalance(t.address),a=t.token?await s.tokenBalance(t.address,t.token).catch(()=>null):null;return{chainId:Number(t.chainId),address:t.address,native:i,token:a}}if(e==="address_book_remember")return Si({address:t.address,label:t.label,who:t.who,role:t.role,chainIds:t.chainIds,notes:t.notes,source:"oracle-data-mcp"});if(e==="address_book_list")return wi({q:t.q,role:t.role,who:t.who});if(e==="address_book_lookup")return xi(t.address);if(e==="address_book_forget")return ki(t.address,t.label||null);if(e==="data_catalog")return ii(`${si}/data/catalog`);if(e==="data_health")return ii(`${si}/data/health`);if(e==="data_call"){if(!t.provider||!t.op)throw new Error("provider and op are required");return rp(t.provider,t.op,t.args||{})}let n=Pw[e];if(n){let{provider:o,op:s,args:i}=n(t);return rp(o,s,i)}throw new Error(`Unknown tool: ${e}`)}function qw(e,t){if(e?.dataBase64&&/^image\/(?:svg\+xml|png|jpeg|webp)$/.test(String(e.mimeType||""))){let{dataBase64:n,...o}=e;return{content:[{type:"image",data:n,mimeType:e.mimeType},{type:"text",text:JSON.stringify(o,null,2)}]}}let r=[{type:"text",text:JSON.stringify(e,null,2)}];try{let n=Ii(t,e);n&&r.push(n)}catch{}return{content:r}}var np=Object.freeze({name:"oracle-data-mcp",version:"1",tools:Rw,async call(e,t){return qw(await $w(e,t),e)}});function Bw(){return vi(np)}function Uw(){let e=oi.argv[1];if(!e)return!1;try{return Zd.realpathSync(e)===Zd.realpathSync(Nw(import.meta.url))}catch{return!1}}Uw()&&Bw();var h1=io(np);export{$w as callTool,h1 as handle,Bw as startStdioLoop,Rw as tools};
62
+ <details><summary>details \xB7 ${at(t)}</summary><pre>${a}</pre></details>
63
+ <div class="foot"><span>${at(t)}</span><span class="tag">THE FUTURE IS AGENTIC</span></div>
64
+ </div><script>document.documentElement.classList.add("live")</script></body></html>`}function Pa(e,t){let r=Fm[e];if(!r||!t||typeof t!="object"||t.error||t.ok===!1||!$a(r,t).some(i=>i.hero))return null;let o=jm(r,e,t);return{type:"resource",resource:{uri:`ui://oracle/card/${e}/${Date.now().toString(36)}`,mimeType:"text/html",text:o}}}Wo();function La(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 rh=[/\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 on(e){let t=String(e??"");for(let r of rh)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)=>La(n)?`${n}${o}[REDACTED]`:r),nh(wt(t,{force:!0}))}function nh(e){return String(e).replace(/https?:\/\/[^\s"'<>]+/gi,t=>{let r=qa(t);return r.ok?r.href:t})}function dr(e,{depth:t=0,seen:r=new WeakSet,key:n=""}={}){if(La(n))return"[REDACTED]";if(typeof e=="string"){let i=on(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 wt(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=>dr(i,{depth:t+1,seen:r,key:n}));let o={};for(let[i,s]of Object.entries(e))o[i]=dr(s,{depth:t+1,seen:r,key:i});return o}function lA(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 Ea=lA(zo("ORACLE_DATA_URL","MAD_DESK_URL","http://127.0.0.1:8787")),dA=2*1024*1024;async function pA(e,t=dA){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 bm={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"}}},sr={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:bm,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:bm,mac:{type:"string"},quotedAtMs:{type:"number"},expiresAtMs:{type:"number"}}}}]},xm=[{name:"data_catalog",description:"List every read-plane provider the desk exposes (id, venue, chainIds, ops). Discovery only; generic provider dispatch is not exposed by this public MCP.",inputSchema:{type:"object",properties:{}}},{name:"data_health",description:"Health of every read-plane provider (which public APIs are up / configured). Read-only.",inputSchema:{type:"object",properties:{}}},{name:"evm_token_sniper_scan",description:"Scan and optionally prepare a guarded token buy through the same armed local-signer path on every supported EVM chain. Robinhood Chain 4663 is the default. Resolves identity and pools, checks structural risk, proves the sell route, quotes, then hands execution to the loopback signer under owner policy.",inputSchema:{type:"object",required:["tokenAddress"],properties:{chainId:{type:"number",default:4663},tokenAddress:{type:"string"},tokenIn:{type:"string",description:"Base/quote token address required for quote and prepare."},amountIn:{type:"string",description:"Raw integer input amount."},recipient:{type:"string",description:"User wallet that receives tokens. Required for prepare."},slippageBps:{type:"number",default:50},prepare:{type:"boolean",default:!1}}}},{name:"hlp_vault_tracker",description:"Read-only Hyperliquid vault tracker, including HLP. List summaries, inspect one vault, or read a user's vault equities. Never deposits, withdraws, signs, or submits.",inputSchema:{type:"object",properties:{mode:{type:"string",enum:["hlp","summaries","details","mine"],default:"hlp"},vaultAddress:{type:"string"},user:{type:"string"}}}},{name:"hl_precompile_read",description:"Read HyperCore through HyperEVM L1Read precompiles (0x800-0x809). Positions, oracle/mark, spot, HLP vault equity, withdrawable. eth_call only. Never writes, never CoreWriter.",inputSchema:{type:"object",properties:{op:{type:"string",enum:["l1BlockNumber","markPx","oraclePx","spotPx","position","spotBalance","vaultEquity","hlp","withdrawable"],default:"l1BlockNumber"},user:{type:"string"},vaultAddress:{type:"string"},index:{type:"number"},perp:{type:"number"},token:{type:"number"}}}},{name:"protocol_eval",description:"Run protocol-builder language evals: Solidity templates, Rust/Anchor vault, Bitcoin Miniscript. Read-only. Not a firm audit. Never deploys or signs.",inputSchema:{type:"object",properties:{}}},{name:"hl_delta_neutral",description:"Hyperliquid delta-neutral funding carry. Scan, quote, or run one loop tick. Owner-operated. Not automated.",inputSchema:{type:"object",properties:{op:{type:"string",enum:["scan","quote","loop"],default:"scan"},coin:{type:"string"},notionalUsd:{type:"number"},mode:{type:"string",enum:["shadow","live"],default:"shadow"},limit:{type:"number"}}}},{name:"lighter_delta_neutral",description:"Lighter.xyz delta-neutral funding carry. Scan, quote, or run one loop tick. Owner-operated official sendTx signer. Not automated.",inputSchema:{type:"object",properties:{op:{type:"string",enum:["scan","quote","loop"],default:"scan"},coin:{type:"string"},notionalUsd:{type:"number"},mode:{type:"string",enum:["shadow","live"],default:"shadow"},limit:{type:"number"}}}},{name:"llama_protocols",description:"DeFiLlama: full protocol list with TVL, chain(s), category, 1d/7d change. The primary cross-chain protocol scanner. Read-only. Large payload \u2014 filter client-side.",inputSchema:{type:"object",properties:{}}},{name:"llama_prices",description:"DeFiLlama current prices for coins keyed 'chain:address' or 'coingecko:id' (comma-joined or array). Read-only.",inputSchema:{type:"object",required:["coins"],properties:{coins:{type:"string",description:"comma-joined coin keys, e.g. 'ethereum:0x...,coingecko:bitcoin'"}}}},{name:"dex_search",description:"DexScreener search across all chains by symbol/name/address. Returns matching pairs with price, liquidity, volume, chain. Read-only.",inputSchema:{type:"object",required:["q"],properties:{q:{type:"string",description:"query: symbol, name, or token address"}}}},{name:"dex_token",description:"DexScreener pairs for a specific token address (any chain). Price, liquidity, volume, pair addresses. Read-only.",inputSchema:{type:"object",required:["address"],properties:{address:{type:"string"}}}},{name:"lifi_quote",description:"LI.FI cross-chain / DEX aggregator quote (no key). Best route + expected out for a swap or bridge. Read-only.",inputSchema:{type:"object",required:["fromChain","toChain","fromToken","toToken","fromAmount"],properties:{fromChain:{type:"number"},toChain:{type:"number"},fromToken:{type:"string"},toToken:{type:"string"},fromAmount:{type:"string",description:"raw integer amount (wei-scale)"},fromAddress:{type:"string",description:"optional; defaults to operator wallet"}}}},{name:"portfolio_balance",description:"Read-only balance aggregation across every configured EVM chain plus Solana, Bitcoin, and Hyperliquid. Reports native assets, supported token/collectible reads, failed or missing providers, unverified assets, timestamps, and known priced value without pretending it is a complete total. Public addresses only; never signs or broadcasts.",inputSchema:{type:"object",properties:{addresses:{type:"object",description:"Optional public wallet addresses by family. Omit configured families to use ORACLE_*_ADDRESS defaults.",properties:{evm:{type:"string"},solana:{type:"string"},bitcoin:{type:"string"},hyperliquid:{type:"string"}}},evmChainIds:{type:"array",items:{type:"number"},description:"Optional EVM chain subset. Default is every configured EVM chain."},includeTokens:{type:"boolean",description:"Include supported token reads. Default true."},includeCollectibles:{type:"boolean",description:"Include supported collectible reads. Default true."},includePrices:{type:"boolean",description:"Fetch current DeFiLlama native prices. Default true."}}}},{name:"portfolio_snapshot",description:"Query the current multichain balance and NFT inventory, then append one compact profile-local observation for historical tracking. Stores public-address fingerprint, coverage, breakdown, and known priced value only; no keys, signatures, executable payloads, or raw NFT metadata. Returns the live balance, NFT result, and recorded snapshot.",inputSchema:{type:"object",properties:{addresses:{type:"object",properties:{evm:{type:"string"},solana:{type:"string"},bitcoin:{type:"string"},hyperliquid:{type:"string"}}},evmChainIds:{type:"array",items:{type:"number"}},includeTokens:{type:"boolean"},includeCollectibles:{type:"boolean"},includePrices:{type:"boolean"},includeNfts:{type:"boolean",description:"Include provider-estimated NFT value. Default true."}}}},{name:"portfolio_history",description:"Read profile-local portfolio observations in a time range. Unknown or unavailable values remain null and are never converted to zero. Defaults to the configured public-address portfolio fingerprint.",inputSchema:{type:"object",properties:{addresses:{type:"object",properties:{evm:{type:"string"},solana:{type:"string"},bitcoin:{type:"string"},hyperliquid:{type:"string"}}},portfolioId:{type:"string"},allPortfolios:{type:"boolean",description:"Return observations for every public-address fingerprint in this profile."},since:{type:"string",description:"Inclusive ISO 8601 lower bound."},until:{type:"string",description:"Inclusive ISO 8601 upper bound."},limit:{type:"number",description:"1-1000, default 100."},order:{type:"string",enum:["asc","desc"]}}}},{name:"portfolio_value_graph",description:"Render a static SVG line graph from profile-local portfolio snapshots. Plots known priced value only, labels incomplete coverage, includes provider-estimated NFT values when recorded, and omits unavailable observations instead of plotting fake zeroes.",inputSchema:{type:"object",properties:{addresses:{type:"object",properties:{evm:{type:"string"},solana:{type:"string"},bitcoin:{type:"string"},hyperliquid:{type:"string"}}},portfolioId:{type:"string"},allPortfolios:{type:"boolean"},since:{type:"string"},until:{type:"string"},limit:{type:"number",description:"Historical observations to consider, max 1000."},maxPoints:{type:"number",description:"Rendered point cap, 2-500, default 200."}}}},{name:"evm_simulate_transaction",description:"Simulate an EVM transaction BEFORE signing: catches reverts via eth_call at pending state, decodes the reason (Error(string), Panic codes, or the raw selector for custom errors), and returns a buffered gas estimate usable as gasLimit. Also flags calls that return boolean false without reverting (some ERC-20s signal failure that way). An unreachable node returns 'unavailable', never 'would fail'. A pass reflects current chain state and is not a guarantee the transaction lands.",inputSchema:{type:"object",properties:{chainId:{type:"number"},tx:{type:"object",description:"{ from, to, data, value } \u2014 value in wei.",properties:{from:{type:"string"},to:{type:"string"},data:{type:"string"},value:{type:"string"}},required:["to"]},estimateGas:{type:"boolean",description:"Default true."},gasBufferPercent:{type:"number",description:"Headroom over the estimate. Default 20."}},required:["chainId","tx"]}},{name:"nft_mint_prepare",description:"Prepare an UNSIGNED EVM NFT mint. Discovers the collection's mint entrypoint from deployed bytecode (ERC-721 does not standardize minting), encodes calldata, prices a competitive EIP-1559 bid from fee-history percentiles, enforces gas-war caps, and reports contract risk. Returns wallet-signable calldata \u2014 never signs or broadcasts. Supply gasLimit plus maxTotalGasWei to enforce the caps; without them the artifact is returned with a loud warning.",inputSchema:{type:"object",properties:{contract:{type:"string",description:"NFT contract address."},chainId:{type:"number"},minter:{type:"string",description:"Address that will sign and receive."},quantity:{type:"number",description:"How many to mint. Default 1."},urgency:{type:"string",enum:["normal","fast","war"],description:"Bid aggressiveness. Default war."},signature:{type:"string",description:"Force a specific mint signature when several exist."},gasLimit:{type:"number"},valueWei:{type:"string",description:"Mint price in wei."},maxTotalGasWei:{type:"string",description:"Hard total gas cap."},maxFeePerGasWei:{type:"string"},maxPriorityFeePerGasWei:{type:"string"}},required:["contract","chainId","minter"]}},{name:"nft_mint_gas_price",description:"Price a competitive EIP-1559 bid for a contested transaction using eth_feeHistory reward percentiles (p50 normal / p75 fast / p90 war). maxFeePerGas is a refundable ceiling; the tip is the real spend. Reports viable:false when a cap would put the bid below the observed market rather than silently clamping to a losing number.",inputSchema:{type:"object",properties:{chainId:{type:"number"},urgency:{type:"string",enum:["normal","fast","war"]},gasLimit:{type:"number"},maxFeePerGasWei:{type:"string"},maxPriorityFeePerGasWei:{type:"string"},maxTotalGasWei:{type:"string"}},required:["chainId"]}},{name:"nft_mint_trigger",description:"Create a mint-open trigger. DEFAULTS TO alert_only: Oracle watches, notifies, and prepares a signable artifact. Firing unattended requires ALL of: actionMode set to the exact string 'execute', ORACLE_AUTONOMOUS_TRADING=1, and a bounded grant naming this exact contract/chain with maxTotalGasWei, maxValueWei, and an expiry under 24h. Any missing or mismatched bound silently downgrades to alert_only and says so. Even an armed trigger produces an unsigned artifact.",inputSchema:{type:"object",properties:{contract:{type:"string"},chainId:{type:"number"},minter:{type:"string"},quantity:{type:"number"},urgency:{type:"string",enum:["normal","fast","war"]},actionMode:{type:"string",enum:["alert_only","execute"],description:"Default alert_only. Only the exact string 'execute' can arm, and only with a grant."},grant:{type:"object",description:"Required for execute: { contract, chainId, maxTotalGasWei, maxValueWei, expiresAt }."}},required:["contract","chainId"]}},{name:"nft_mancer_os_scan",description:"Fail-closed scan for a Mancers-gated Robinhood (4663) NFT mint. Requires bytecode that references Mancers 0x797a\u2026, value=0, a sim with Transfer to the minter and no setApprovalForAll. Never returns safe. executeFire needs actionMode=execute, ORACLE_AUTONOMOUS_MINT=1, and a grant naming this exact contract with maxValueWei=0. Trading flag does not unlock mint. Returns unsigned mint + revoke calldata \u2014 never signs.",inputSchema:{type:"object",properties:{contract:{type:"string"},chainId:{type:"number"},minter:{type:"string"},bytecode:{type:"string"},valueWei:{type:"string"},simulation:{type:"object"},actionMode:{type:"string",enum:["alert_only","execute"]},grant:{type:"object"}},required:["contract","chainId","minter","bytecode"]}},{name:"contract_risk_scan",description:"Check what powers a contract's deployer still holds before you interact with it: mint, blacklist, pause, fee changes, and upgradeability (EIP-1967, legacy zeppelinos, EIP-1822 proxies). Complements a sell simulation \u2014 that proves a token is sellable NOW, this asks whether someone can change that afterwards. Read-only eth_getCode/eth_getStorageAt; never returns 'safe', only 'unknown-risk', 'elevated', or 'high', because absence of a selector is not proof of safety.",inputSchema:{type:"object",properties:{address:{type:"string",description:"Contract address (0x, 40 hex)."},chainId:{type:"number",description:"EVM chain id."}},required:["address","chainId"]}},{name:"nft_inventory",description:"Read all discoverable NFTs for configured EVM, Solana, and Bitcoin addresses. Returns normalized assets, image URLs, estimated values, per-chain partial failures, flagged/NSFW items separated from visible items, listing coverage, and explicit unsupported chains. Read-only.",inputSchema:{type:"object",properties:{addresses:{type:"object",properties:{evm:{type:"string"},solana:{type:"string"},bitcoin:{type:"string"}}},chains:{type:"array",items:{type:"string"},description:"Optional chain slug subset."},pageSize:{type:"number",description:"OpenSea items per page, max 200."},maxPages:{type:"number",description:"Maximum pages per chain, max 25."},bitcoinLimit:{type:"number"},includePnl:{type:"boolean",description:"Include OpenSea-indexed account PnL when available. Default true."},costBasis:{type:"object",description:"Optional user-supplied assetKey -> {costUsd,feesUsd,acquiredAt,source}. Missing basis stays unavailable, never zero."}}}},{name:"nft_gallery",description:"Generate one static NFT contact-sheet image page from wallet inventory or supplied normalized items. External metadata is never rendered as HTML; only allowlisted JPEG/PNG/WebP bytes are embedded and unsafe or missing media becomes a placeholder.",inputSchema:{type:"object",properties:{addresses:{type:"object",properties:{evm:{type:"string"},solana:{type:"string"},bitcoin:{type:"string"}}},chains:{type:"array",items:{type:"string"}},items:{type:"array",items:{type:"object"},description:"Optional normalized inventory items. Omit to scan configured wallets."},page:{type:"number",description:"1-based gallery page."},pageSize:{type:"number",description:"1-12 items per page."}}}},{name:"nft_pnl",description:"NFT PnL with explicit methodology. Returns OpenSea-indexed account-level PnL where available plus per-item unrealized estimates only when both user-supplied acquisition cost and provider estimated current value exist. Missing history is unavailable, never zero.",inputSchema:{type:"object",properties:{addresses:{type:"object",properties:{evm:{type:"string"},solana:{type:"string"},bitcoin:{type:"string"}}},chains:{type:"array",items:{type:"string"}},costBasis:{type:"object"}}}},{name:"nft_prepare_list",description:"Prepare an NFT listing for OpenSea EVM, Magic Eden Solana, or Satflow Bitcoin after explicit user review. Requires userConfirmed=true plus asset, marketplace, price, currency where applicable, and future expiry. Magic Eden Solana also requires confirmation exactly: list <tokenMint> on magiceden-sol for <priceSol> SOL until <expiry>. Returns approval/signing actions, an unsigned Solana transaction, or an unsigned Bitcoin PSBT. Never signs, submits, or broadcasts.",inputSchema:{type:"object",required:["marketplace","userConfirmed"],properties:{marketplace:{type:"string",enum:["opensea","magiceden","magiceden-sol","satflow"]},userConfirmed:{type:"boolean"},chain:{type:"string"},seller:{type:"string"},contract:{type:"string"},tokenId:{type:"string"},quantity:{type:"number"},priceAmount:{type:"string"},currency:{type:"string"},endTime:{type:"string"},useCreatorFee:{type:"boolean"},taker:{type:"string"},tokenMint:{type:"string"},tokenATA:{type:"string"},auctionHouse:{type:"string"},priceSol:{type:"string"},expiry:{description:"Future ISO 8601 timestamp or Unix seconds. Magic Eden Solana listings require finite future expiry; no-expiry is refused."},confirmation:{type:"string",description:"Required for Magic Eden Solana listings. Exact phrase: list <tokenMint> on magiceden-sol for <priceSol> SOL until <expiry>."},inscriptionId:{type:"string"},runesOutput:{type:"string"},ordAddress:{type:"string"},receiveAddress:{type:"string"},priceSats:{type:"string"},tapKey:{type:"string"},collectionSlug:{type:"string"}}}},{name:"nft_trait_snipe",description:"Evaluate an OpenSea EVM NFT trait-snipe candidate using caller-supplied fresh listings, trait floor, max price, minimum discount, recent real trait sales, and trait volume gates. Returns BUY/PASS plus an unsigned local-only buy intent. Never signs, submits, broadcasts, or treats rarity metadata alone as evidence.",inputSchema:{type:"object",required:["marketplace","chain","collectionSlug","contract","traitType","traitValue","maxPriceEth","minDiscountBps","minTraitSales","minTraitVolumeEth","traitFloorEth","listings","sales"],properties:{marketplace:{type:"string",enum:["opensea"]},chain:{type:"string"},collectionSlug:{type:"string"},contract:{type:"string"},traitType:{type:"string"},traitValue:{type:"string"},maxPriceEth:{type:"string"},minDiscountBps:{type:"number"},minTraitSales:{type:"number"},minTraitVolumeEth:{type:"string"},minTraitListings:{type:"number"},maxListingAgeMs:{type:"number"},maxSaleAgeMs:{type:"number"},collectionFloorEth:{type:"string"},traitFloorEth:{type:"string"},listings:{type:"array",items:{type:"object"}},sales:{type:"array",items:{type:"object"}}}}},{name:"anvil_nft_scan",description:"Scan exact Anvil inventory IDs on Robinhood Chain for current NFT traits and fee-inclusive buy quotes. Read-only.",inputSchema:{type:"object",required:["market","collection"],properties:{market:{type:"string"},collection:{type:"string"},tokenIds:{type:"array",items:{type:"string"}},inventoryCompletenessEvidence:{type:"object"},traitType:{type:"string"},traitFilters:{type:"array",items:{type:"object"}},includeAll:{type:"boolean"},minStars:{type:"number"},maxItems:{type:"number"}}}},{name:"anvil_opensea_arb",description:"Compare exact Anvil inventory and fee quotes against exact OpenSea listings and offers. ARB requires validated complete inventory plus fresh authenticated exact-leg gas and successful simulation evidence for every executable leg. Read-only.",inputSchema:{type:"object",required:["market","collection","slug","owner","gasEvidence","minNetWei"],anyOf:[{required:["conversionGasEvidence"]},{required:["gasPriceEvidence"]}],properties:{market:{type:"string"},collection:{type:"string"},slug:{type:"string"},owner:{type:"string",description:"Execution owner/sender bound into every simulated leg."},tokenIds:{type:"array",items:{type:"string"}},inventoryCompletenessEvidence:{type:"object"},traitType:{type:"string"},traitFilters:{type:"array",items:{type:"object"}},includeAll:{type:"boolean"},minStars:{type:"number"},maxItems:{type:"number"},gasEvidence:sr,conversionGasEvidence:sr,gasPriceEvidence:sr,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:sr,conversionGasEvidence:sr,gasPriceEvidence:sr,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:"lending_markets",description:"Scan lending protocol markets across Compound ($2B+ TVL). Returns supply/borrow APYs, total supply, collateral factors. Read-only.",inputSchema:{type:"object",properties:{}}},{name:"yield_vaults",description:"Scan yield aggregator vaults across Yearn + Convex. Returns vault APYs, TVLs, boosted status. Read-only.",inputSchema:{type:"object",properties:{}}},{name:"watch_list",description:"List alert-only price/token watches. Never execute.",inputSchema:{type:"object",properties:{}}},{name:"watch_create",description:"Create an alert-only watch. actionMode is always alert_only. Never execute.",inputSchema:{type:"object",required:["chain","token","condition"],properties:{chain:{type:"string"},token:{type:"string"},condition:{type:"string"},note:{type:"string"}}}},{name:"receipt_report",description:"Classify a caller-supplied receipt. Reports whether a tx hash exists. Does not verify chain success.",inputSchema:{type:"object",properties:{hash:{type:"string"},transactionHash:{type:"string"},txid:{type:"string"},receipt:{type:"object"}}}},{name:"twitter_ca_watch",description:"One Twitter CA watch tick: read an account, extract EVM/Solana CAs, rank the USD book, PREPARE only. Automated ticks never emit a card and never broadcast. Needs ORACLE_XURL_ENABLED=true.",inputSchema:{type:"object",required:["handle"],properties:{handle:{type:"string"},chainId:{type:"number",description:"default 4663 Robinhood"},limit:{type:"number"}}}},{name:"trade_lifecycle",description:"Create, verify, or advance a prepare-only trade fact chain. Signing and broadcasting are never performed here.",inputSchema:{type:"object",required:["action"],properties:{action:{type:"string",enum:["create","verify","advance"]},tradeId:{type:"string"},intent:{type:"object"},lifecycle:{type:"object"},state:{type:"string"},fact:{type:"object"},asOf:{type:"number"}}}},{name:"signal_score",description:"Cold-score onchain signal events. Never fetches or executes.",inputSchema:{type:"object",required:["events"],properties:{events:{type:"array",items:{type:"object"}},markouts:{type:"array",items:{type:"object"}},openIntents:{type:"boolean"},limit:{type:"number"}}}},{name:"workspace_artifact",description:"Get, list, put, or link deterministic workspace artifacts. No arbitrary paths.",inputSchema:{type:"object",required:["action"],properties:{action:{type:"string",enum:["get","list","put","link"]},id:{type:"string"},type:{type:"string"},createdAt:{type:"string"},data:{type:"object"},parentId:{type:"string"},childId:{type:"string"}}}},{name:"research_artifact",description:"Create a citation-bearing research artifact. fetchedAt must be supplied by the caller.",inputSchema:{type:"object",required:["sourceUrl","fetchedAt","snapshot","claim","confidence"],properties:{sourceUrl:{type:"string"},fetchedAt:{type:"string"},snapshot:{type:"string"},claim:{type:"string"},confidence:{type:"number"},contradictions:{type:"array",items:{type:"string"}}}}},{name:"portfolio_analyze",description:"Summarize a caller-supplied portfolio ledger. Read-only.",inputSchema:{type:"object",required:["ledger","asOf"],properties:{ledger:{type:"object"},asOf:{type:"number"},priceTtlMs:{type:"number"}}}},{name:"mev_status",description:"MEV observer/operator flag posture. Read-only. Never implies a live trade. Flash-loan execute still needs ORACLE_MEV_EXECUTE_ENABLED=1 and literal --execute on oracle mev.",inputSchema:{type:"object",properties:{}}},{name:"chain_list",description:"List Oracle's EVM chain registry (chainId, name, rpc env names). Read-only.",inputSchema:{type:"object",properties:{}}}],wm=String(Sa.env.ORACLE_DEFAULT_ADDRESS||Sa.env.MAD_OPERATOR_ADDRESS||"").trim(),fA=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"]),mA=new Set(xm.map(e=>e.name));for(let e of fA)if(mA.has(e))throw new Error(`public MCP custody boundary violated: ${e}`);var hA={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||wm||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||wm;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:{}}),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 ka(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 pA(o);if(!o.ok)throw new Error(i.error||`HTTP ${o.status}`);return i}async function yA(e,t,r={},n={}){try{return await ka(`${Ea}/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 Sm(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(()=>(Qc(),Yc));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(()=>(Fi(),lu)),{requestRfqQuotes:s}=await Promise.resolve().then(()=>(xl(),wl)),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(()=>(Zt(),Wl));return e==="best_swap_route"?i(t,r):s(t,r)}if(e==="prepare_best_route"){let{prepareBestRoute:i}=await Promise.resolve().then(()=>(Kl(),Gl));return i(t,r)}if(e==="prepare_best_bridge_route"){let{prepareBestBridgeRoute:i}=await Promise.resolve().then(()=>(Yl(),Xl));return i(t,r)}if(e==="twap_simulate"){let{simulateTwap:i}=await Promise.resolve().then(()=>(ed(),Zl));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(()=>(Vd(),zd));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(()=>(Gd(),Wd));s.dydx=await a(void 0,r)}if(i==="all"||i==="drift"){let{driftMarkets:a}=await Promise.resolve().then(()=>(Yd(),Xd));s.drift=await a(r)}if(i==="all"||i==="vertex"){let{vertexMarkets:a}=await Promise.resolve().then(()=>(Jd(),Qd));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(()=>(ep(),Zd));return s(t,r)}if(i==="sushiswap"){let{sushiQuote:s}=await Promise.resolve().then(()=>(np(),rp));return s(t,r)}if(i==="raydium"){let{raydiumQuote:s}=await Promise.resolve().then(()=>(ip(),op));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(()=>(ap(),sp));return{aevo:await i(r)}}if(e==="lending_markets"){let{compoundMarkets:i}=await Promise.resolve().then(()=>(up(),cp));return{compound:await i(r)}}if(e==="yield_vaults"){let[{yearnVaults:i},{convexPools:s}]=await Promise.all([Promise.resolve().then(()=>(dp(),lp)),Promise.resolve().then(()=>(fp(),pp))]);return{yearn:await i(r),convex:await s(r)}}if(e==="equity_venues"){let{equityVenues:i,toJsonSafe:s}=await Promise.resolve().then(()=>(So(),xo));return s(i())}if(e==="equity_quote"){let{bestEquityRoute:i,toJsonSafe:s}=await Promise.resolve().then(()=>(So(),xo));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(()=>(So(),xo));return s(i({ticker:t.ticker,recipient:t.recipient||t.taker,sizeUsd:t.sizeUsd}))}if(e==="scanner_coverage"){let i=await Promise.resolve().then(()=>(ko(),Eo));return i.registerBuiltinScanners?.(),i.scannerCoverage()}if(e==="scan_token"){let i=await Promise.resolve().then(()=>(ko(),Eo));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(()=>(ko(),Eo));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(()=>(ta(),ea));return{ok:!0,watches:i(),actionMode:"alert_only",execution:!1}}if(e==="watch_create"){let{createWatch:i}=await Promise.resolve().then(()=>(ta(),ea));return{ok:!0,watch:i(t),execution:!1}}if(e==="receipt_report"){let{classifyReceipt:i}=await Promise.resolve().then(()=>(pf(),df));return{ok:!0,...i(t.receipt||t),execution:!1}}if(e==="twitter_ca_watch"){let{tickTwitterCaWatch:i}=await Promise.resolve().then(()=>(Nf(),Tf));return i({handle:t.handle,chainId:t.chainId,limit:t.limit,automated:!0},r)}if(e==="trade_lifecycle"||e==="signal_score"||e==="workspace_artifact"||e==="research_artifact"||e==="portfolio_analyze"){let{runDeskTool:i}=await Promise.resolve().then(()=>(mm(),fm));return i(e,t,{signal:r.signal})}if(e==="mev_status"){let{executeGloballyEnabled:i,mevExecuteEnabled:s}=await Promise.resolve().then(()=>(ym(),hm));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(()=>(rs(),Qu));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 ka(`${Ea}/data/catalog`,{signal:r.signal});if(e==="data_health")return ka(`${Ea}/data/health`,{signal:r.signal});let o=hA[e];if(o){let{provider:i,op:s,args:a}=o(t);return yA(i,s,a,r)}throw new Error(`Unknown tool: ${e}`)}function Em(e,t){if(e?.dataBase64&&/^image\/(?:svg\+xml|png|jpeg|webp)$/.test(String(e.mimeType||""))){let{dataBase64:s,...a}=e,c=on(JSON.stringify(dr(a),null,2));return{content:[{type:"image",data:s,mimeType:e.mimeType},{type:"text",text:c}]}}let r=JSON.stringify(e,null,2),n=dr(e),o=on(JSON.stringify(n,null,2)),i=[{type:"text",text:o}];try{let s=o===r?Pa(t,e):null;s&&i.push(s)}catch{}return{content:i}}var km=Object.freeze({name:"oracle-data-mcp",version:"1",tools:xm,async call(e,t,r={}){return Em(await Sm(e,t,r),e)}});function gA(){return Na(km)}function bA(){let e=Sa.argv[1];if(!e)return!1;try{return gm.realpathSync(e)===gm.realpathSync(uA(import.meta.url))}catch{return!1}}bA()&&gA();function wA({timeoutMs:e,callToolOptions:t={}}={}){return Vo({...km,async call(r,n,o={}){return Em(await Sm(r,n,{...t,...o}),r)}},{...e==null?{}:{callTimeoutMs:e}})}var f2=wA();export{fA as PUBLIC_MCP_FORBIDDEN_TOOLS,Sm as callTool,wA as createPublicMcpHandler,Em as formatMcpResult,f2 as handle,ka as httpJson,pA as readBoundedJsonResponse,lA as resolveDataUrl,gA as startStdioLoop,xm as tools};